Ë
    š„j4?  ã                   óæ   — d dl Z d dlZd dlZd dlZd dlZddlmZ ddlmZ ddl	m
Z
mZmZmZmZmZmZmZ ddlmZ  G d„ d	e«      Z G d
„ de«      Z G d„ de«      Z G d„ de«      Z G d„ de«      Zy)é    Né   )ÚAnvatoIE)ÚInfoExtractoré   )ÚExtractorErrorÚ
clean_htmlÚdetermine_extÚget_element_by_classÚint_or_noneÚmake_archive_idÚurl_or_noneÚurlencode_postdata)Útraverse_objc                   ó  — e Zd ZdZdZdZdd e ej                  «       «       e	j                   ej                  dddd	d
œd¬«      j                  «       «      j                  «       dddœZi ZdZdZdZd„ Zd„ Zdd„Zd„ Zy)Ú	NFLBaseIEaÂ  (?x)
                    https?://
                        (?P<host>
                            (?:www\.)?
                            (?:
                                (?:
                                    nfl|
                                    buffalobills|
                                    miamidolphins|
                                    patriots|
                                    newyorkjets|
                                    baltimoreravens|
                                    bengals|
                                    clevelandbrowns|
                                    steelers|
                                    houstontexans|
                                    colts|
                                    jaguars|
                                    (?:titansonline|tennesseetitans)|
                                    denverbroncos|
                                    (?:kc)?chiefs|
                                    raiders|
                                    chargers|
                                    dallascowboys|
                                    giants|
                                    philadelphiaeagles|
                                    (?:redskins|washingtonfootball)|
                                    chicagobears|
                                    detroitlions|
                                    packers|
                                    vikings|
                                    atlantafalcons|
                                    panthers|
                                    neworleanssaints|
                                    buccaneers|
                                    azcardinals|
                                    (?:stlouis|the)rams|
                                    49ers|
                                    seahawks
                                )\.com|
                                .+?\.clubs\.nfl\.com
                            )
                        )/
                    zp<script[^>]+id="[^"]*video-config-[0-9a-f]{8}-(?:[0-9a-f]{4}-){3}[0-9a-f]{12}[^"]*"[^>]*>\s*({.+});?\s*</script>z(anvato:GXvEgwyJeWem8KCYXfeoHWknwP48Mboj:Ú 4cFUW6DmwJpzT9L7LrG3qRAcABG5s04gÚCZuvCL49d9OwfGsRÚdesktopÚChromeÚWindowsz10.0)ÚmodelÚversionÚosNameÚ	osVersion©ú,ú:©Ú
separatorsÚotherÚ	undefined)Ú	clientKeyÚclientSecretÚdeviceIdÚ
deviceInfoÚnetworkTypeÚpeacockUUIDÚB3_Qa8TkWpIB8ESCBT8tY2TukbVKgO5F6BJVc7N1oComdwFzI7H2L9NOWdm11i_BY9fNr   c                 ó®  — | j                  d«      }t        |d| j                  › �d„ fd„ hfd¬«      }|s| j                  «        d|vrt	        dd	¬
«      ‚| j                  dd dt        dd| j                  d|ddt        |dd„ hfd¬«      ddœ	«      ddi¬«      }t        |ddddœ«      | _        t        | j                  «      dk7  rt	        d d	¬
«      ‚y )!Nzhttps://auth-id.nfl.com/Úglt_c                 ó$   — | j                  d«      S )Nr*   )Ú
startswith)ÚkÚ_s     úK/var/www/html/GAP/venv/lib/python3.12/site-packages/yt_dlp/extractor/nfl.pyú<lambda>z-NFLBaseIE._get_account_info.<locals>.<lambda>\   s   € °!·,±,¸vÓ2F€ ó    c                 ó   — | j                   S ©N)Úvalue©Úxs    r/   r0   z-NFLBaseIE._get_account_info.<locals>.<lambda>\   s   € ÐTU×T[ÑT[€ r1   F©Úget_allÚucidzÕRequired cookies for the auth-id.nfl.com domain were not found among passed cookies. If using --cookies, these cookies must be exported along with .nfl.com cookies, or else try using --cookies-from-browser insteadT)Úexpectedz/https://auth-id.nfl.com/accounts.getAccountInfozDownloading account infozprofile,dataÚenÚ	js_latestÚcookiezhttps://www.nfl.com/Úgig_canary_verc                 ó>   — | j                   j                  d«      d   S )Nú-r   )r4   Ú	partitionr5   s    r/   r0   z-NFLBaseIE._get_account_info.<locals>.<lambda>p   s   € °·±×1BÑ1BÀ3Ó1GÈÑ1J€ r1   Ú15170)ÚdefaultÚjson)	ÚincludeÚlangÚAPIKeyÚsdkÚlogin_tokenÚauthModeÚpageURLÚsdkBuildÚformatúContent-Typez!application/x-www-form-urlencoded)ÚnoteÚdataÚheadersÚsignatureTimestampÚUIDÚUIDSignature)rR   ÚuidÚuidSignatureé   z5Failed to retrieve account info with provided cookies)	Ú_get_cookiesr   Ú_API_KEYÚraise_login_requiredr   Ú_download_jsonr   Ú_ACCOUNT_INFOÚlen)ÚselfÚcookiesrI   Úaccounts       r/   Ú_get_account_infozNFLBaseIE._get_account_infoY   s,  € Ø×#Ñ#Ð$>Ó?ˆÜ" 7Ø�D—M‘M�?Ð#Ñ%FÐGÑJ[ÐI\ð-^ØglônˆáØ×%Ñ%Ô'Ø˜Ñ Ü ðCàMQôSð Sð
 ×%Ñ%Ø=¸tØ+Ô2DØ)ØØŸ-™-Ø"Ø*Ø$Ø1Ü(¨Ø$Ñ'JÐ&Kð3MØV]ô_à ñFó 3ð (Ð)LÐMð &ó Oˆô *¨'Ø"6ØØ*ñ4
ó ˆÔô ˆt×!Ñ!Ó" aÒ'Ü Ð!XÐcgÔhÐhð (r1   c           
      óª  — | j                   r.| j                  t        t        j                  «       dz   «      kD  ry | j	                  d| j
                  j                  d«      rdndz  d ddidt        j                  i | j                  ¥| j
                  ¥d	¬
«      j                  «       ¬«      }|d   | _         |d   | _        |d   | j
                  d<   y )Né   z'https://api.nfl.com/identity/v3/token%sÚrefreshTokenz/refreshÚ rN   úapplication/jsonzDownloading access tokenr   r   )rQ   rO   rP   ÚaccessTokenÚ	expiresIn)Ú_TOKENÚ_TOKEN_EXPIRYÚintÚtimer[   r\   ÚgetrD   ÚdumpsÚ_CLIENT_DATAÚencode)r^   Útokens     r/   Ú_get_auth_tokenzNFLBaseIE._get_auth_token}   sÍ   € Ø�;Š;˜4×-Ñ-´´D·I±I³KÀ"Ñ4DÓ0EÒEØà×#Ñ#Ø5Ø"×0Ñ0×4Ñ4°^ÔD‘
È"ñNà˜>Ð+=Ð>ÐE_Ü—‘ÐG˜t×0Ñ0ÐG°D×4FÑ4FÐGÐT^Ô_×fÑfÓhð	 $ó jˆð ˜MÑ*ˆŒØ" ;Ñ/ˆÔØ-2°>Ñ-Bˆ×Ñ˜>Ò*r1   c                 óš  — | j                  «        | j                  d|› �|d| j                  › �dddœt        j                  d|dœd¬«      j                  «       ¬	«      }| j                  |d
   |dd¬«      \  }}||||t        t        |«      gdœt        |dddt        ht        fddt        hfddt        hfddddt        hifdœf«      ¥S )Nz"https://api.nfl.com/play/v1/asset/úBearer rf   )ÚAuthorizationÚAcceptrN   T)ÚinitÚliver   r   )rQ   rP   Ú	accessUrlÚmp4Úhls)Úm3u8_id)ÚidÚformatsÚ	subtitlesÚis_liveÚ_old_archive_idsÚmetadataÚevent)Ú	def_titleÚfriendlyNameÚdef_descriptionÚdurationÚ
thumbnails.Úurl)ÚtitleÚdescriptionr‡   rˆ   )rr   r[   ri   rD   rn   rp   Ú#_extract_m3u8_formats_and_subtitlesr   r   r   ÚstrÚanyr   r   )r^   Úmcp_idr€   rP   r~   r   s         r/   Ú_extract_videozNFLBaseIE._extract_video‹   s  € Ø×ÑÔØ×"Ñ"Ø0°°Ð9¸6Ø#*¨4¯;©;¨-Ð!8Ø,Ø 2ñLô —J‘J¨°gÑ>È:ÔV×]Ñ]Ó_ð #ó aˆð "×EÑEØ�Ñ˜v u°eð Fó =Ñˆ�ð ØØ"ØÜ!0´¸6Ó!BÐ Cñ
ô ˜4 *Ø!Ð#@Ä3À%ÌÐMØ 'Ð):¼S¸EÐBØ$ j´;°-Ð@Ø+¨S°%¸%Ä+ÀÐ9OÐPñ	/ð "ó ð
ð 	
r1   c           	      ó4  — | j                  ||«      }t        |dt        hf«      xs d}|d   d   }|j                  d«      x}r| j	                  ||¬«      S d|j                  d«      xs |d   i}|d	   }t        |«      }|d
k(  r| j                  ||d   d«      |d<   n||d	<   |j                  d«      du rd|d<   d }	t        |ddt        ¬«      x}
r|
t        |
d«      dœg}	|j                  i t        |dt        hfdt        hfdœ«      ¥||	dœ¥«       |S )Nrx   FÚplaylistr   ÚmcpID)r€   r}   ÚentityIdr‰   Úm3u8rz   r~   ÚaudioTÚnoneÚvcodecÚimageSrcÚposterImage)Úexpected_typeÚjpg)r‰   ÚextrŠ   r‹   )rŠ   r‹   )r€   rˆ   )Ú_parse_jsonr   Úboolrm   r�   r	   Ú_extract_m3u8_formatsr   Úupdater�   r   )r^   Úvideo_configÚ
display_idr€   Úitemr�   ÚinfoÚitem_urlr�   rˆ   Ú	image_urls              r/   Ú_parse_video_configzNFLBaseIE._parse_video_config¤   s^  € Ø×'Ñ'¨°jÓAˆÜ˜|¨f´t°fÐ-=Ó>ÒGÀ%ˆØ˜JÑ'¨Ñ*ˆØ—X‘X˜gÓ&Ð&ˆ6Ð&Ø×&Ñ& v°wÐ&Ó?Ð?à�d—h‘h˜t“nÒ8¨¨ZÑ(8Ð9ˆà˜‘;ˆÜ˜HÓ%ˆØ�&Š=Ø"×8Ñ8¸À4ÈÁ:ÈuÓUˆD�ŠOà"ˆD�‰KØ�x‰x˜Ó  DÑ(Ø!'��X‘àˆ
Ü$ T¨:°}ÔT_Ô`Ð`ˆ9Ð`à Ü$ Y°Ó6ñð ˆJð
 	�‰ð 
Ü˜4Ø!¤C 5Ð)Ø -´
¨|Ð<ñ"ó ð
ð
 Ø$ò
ô 	ð ˆr1   )F)Ú__name__Ú
__module__Ú__qualname__Ú_VALID_URL_BASEÚ_VIDEO_CONFIG_REGEXÚ_ANVATO_PREFIXr�   ÚuuidÚuuid4Úbase64Ú	b64encoderD   rn   rp   Údecodero   r\   rY   ri   rj   ra   rr   r�   r¨   © r1   r/   r   r      s¯   „ ð+€OðX NÐØ?€Nð 8Ø*Ù˜
˜Ÿ
™
›Ó%Ø&�f×&Ñ& z t§z¡zØØØØñ	3
ð
 !ô("÷
 #)¡&£(ó,÷
 -3©F«HØØ"ñ€Lð €MØS€Hà€FØ€Mò"iòHCó
ó2!r1   r   c            	       óx   — e Zd ZdZej
                  dz   Zddddddd	d
gdœdœddddddddœdœdddœdddœgZd„ Zy)ÚNFLIEznfl.comz)(?:videos?|listen|audio)/(?P<id>[^/#?&]+)zVhttps://www.nfl.com/videos/baker-mayfield-s-game-changing-plays-from-3-td-game-week-14Ú899441rz   z;Baker Mayfield's game-changing plays from 3-TD game Week 14z$md5:85e05a3cc163f8c344340f220521136dzre:https?://.+\.jpgé�   zanvato 899441)r}   r�   rŠ   r‹   Ú	thumbnailr‡   r�   )r‰   Ú	info_dictzchttps://www.chiefs.com/listen/patrick-mahomes-travis-kelce-react-to-win-over-dolphins-the-breakdownÚ 92a517f05bd3eb50fe50244bc621aec8z$8b7c3625-a461-4751-8db4-85f536f2bbd0Úmp3zHPatrick Mahomes, Travis Kelce React to Win Over Dolphins | The Breakdownz$md5:12ada8ee70e6762658c30e223e095075zshttps://static.clubs.nfl.com/image/private/t_editorial_landscape_12_desktop/v1571153441/chiefs/rfljejccnyhhkpkfq855)r}   r�   rŠ   r‹   r¹   )r‰   Úmd5rº   zMhttps://www.buffalobills.com/video/buffalo-bills-military-recognition-week-14T)r‰   Úonly_matchingzjhttps://www.raiders.com/audio/instant-reactions-raiders-week-14-loss-to-indianapolis-colts-espn-jason-fitzc                 ó¢   — | j                  |«      }| j                  ||«      }| j                  | j                  | j                  |d«      |«      S )Nzvideo config)Ú	_match_idÚ_download_webpager¨   Ú_search_regexr­   )r^   r‰   r£   Úwebpages       r/   Ú_real_extractzNFLIE._real_extractè   sT   € Ø—^‘^ CÓ(ˆ
Ø×(Ñ(¨¨jÓ9ˆØ×'Ñ'¨×(:Ñ(:Ø×$Ñ$ g¨~ó)?Ø@JóLð 	Lr1   N)	r©   rª   r«   ÚIE_NAMEr   r¬   Ú
_VALID_URLÚ_TESTSrÄ   r´   r1   r/   r¶   r¶   È   s‹   „ Ø€GØ×*Ñ*Ð-YÑY€JàgàØØRØAØ/ØØ!0Ð 1ñ
ñð uØ1à8ØØ_ØAð Oñ
ñ
ð _Øñð |Øñð1€Fó:Lr1   r¶   c                   óF   — e Zd ZdZej
                  dz   ZddddœddœZd	„ Zy
)ÚNFLArticleIEznfl.com:articleznews/(?P<id>[^/#?&]+)zrhttps://www.buffalobills.com/news/the-only-thing-we-ve-earned-is-the-noise-bills-coaches-discuss-handling-rising-ezPthe-only-thing-we-ve-earned-is-the-noise-bills-coaches-discuss-handling-rising-ez_'The only thing we've earned is the noise' | Bills coaches discuss handling rising expectations)r}   rŠ   é   )r‰   rº   Úplaylist_countc                 óâ   ‡ ‡‡— ‰ j                  |«      Š‰ j                  |‰«      Šˆˆ ˆfd„}t        t        d‰«      «      xs ‰ j	                  ddg‰«      }‰ j                   |«       ‰|«      S )Nc               3   ó€   •K  — t        j                  ‰j                  ‰«      D ]  } ‰j                  | ‰«      –— Œ y ­wr3   )ÚreÚfindallr­   r¨   )r¢   r£   r^   rÃ   s    €€€r/   Úentriesz+NFLArticleIE._real_extract.<locals>.entriesÿ   s<   øè ø€ Ü "§
¡
¨4×+CÑ+CÀWÓ Mò I�Ø×.Ñ.¨|¸ZÓHÓHñIùs   ƒ;>znfl-c-article__titlezog:titleztwitter:title)rÀ   rÁ   r   r
   Ú_html_search_metaÚplaylist_result)r^   r‰   rÐ   rŠ   r£   rÃ   s   `   @@r/   rÄ   zNFLArticleIE._real_extractû   s{   ú€ Ø—^‘^ CÓ(ˆ
Ø×(Ñ(¨¨jÓ9ˆö	Iô Ô/Ø" Gó-ó .ò 4Ø15×1GÑ1GØ˜Ð)¨7ó24ð 	ð ×#Ñ#¡G£I¨z¸5ÓAÐAr1   N)	r©   rª   r«   rÅ   r   r¬   rÆ   Ú_TESTrÄ   r´   r1   r/   rÉ   rÉ   ï   s;   „ Ø€GØ×*Ñ*Ð-EÑE€Jð DàdØvñ
ð ñ€EóBr1   rÉ   c                   ó¶   — e Zd ZdZdZddddddd	d
ddgg d¢ddœddidœdddddidœdddddidœddddddddd d!dgd"gddœdd#d$d%giid&œd'œgZd(d)d*d+d,œZd-„ Zd.„ Zy/)0ÚNFLPlusReplayIEznfl.com:plus:replayzHhttps?://(?:www\.)?nfl\.com/plus/games/(?P<slug>[\w-]+)(?:/(?P<id>\d+))?zDhttps://www.nfl.com/plus/games/giants-at-vikings-2022-post-1/1572108Ú1572108rz   z$New York Giants at Minnesota VikingszSNew York Giants play the Minnesota Vikings at U.S. Bank Stadium on January 15, 2023ÚNFLÚ20230116iH%Åciõ  zGame Highlights)zMinnesota VikingszNew York Giantsz%Minnesota Vikings vs. New York Giantsúre:^https?://.*\.jpg©r}   r�   rŠ   r‹   ÚuploaderÚupload_dateÚ	timestampr‡   Ú
categoriesÚtagsr¹   Úskip_downloadr•   )r‰   rº   ÚparamsúSubscription requiredz<https://www.nfl.com/plus/games/giants-at-vikings-2022-post-1rÊ   r}   zgiants-at-vikings-2022-post-1)rO   r‰   rË   rº   z<https://www.nfl.com/plus/games/giants-at-patriots-2011-pre-4r   zgiants-at-patriots-2011-pre-4Ú950701zGiants @ Patriotsz(Giants at Patriots on September 01, 2011Ú20210724i2\û`iü  zplay-by-playÚnflplusreplayÚtypeÚcondensed_game)rà   Úextractor_args©rO   r‰   rº   rá   z	Full GamezFull Game - SpanishzCondensed GamezAll-22)Ú	full_gameÚfull_game_spanishrç   Úall_22c                 ó$   — | j                  «        y r3   ©ra   ©r^   s    r/   Ú_real_initializez NFLPlusReplayIE._real_initializeH  ó   € Ø×ÑÕ r1   c                 óL  ‡ ‡‡— ‰ j                  |«      j                  dd«      \  }}‰ j                  ddg«      Šd‰v r#t        ‰ j                  j                  «       «      Št        ‰ j                  d ‰f«      Š|sy‰ j                  «        dd‰ j                  › �i}‰ j                  d|› �|dd	d
i|¬«      d   }‰ j                  d|dd|i|¬«      Št        ‰«      dk(  rt        ‰dˆfd„dfd¬«      }|r‰ j                  |«      S ˆˆˆ fd„}‰ j                   |«       |«      S )NÚslugr}   ræ   Úallru   rt   z6https://api.nfl.com/football/v2/games/externalId/slug/zDownloading game IDÚwithExternalIdsÚtrue)ÚqueryrQ   z-https://api.nfl.com/content/v1/videos/replayszDownloading replays JSONÚgameIdr   Úitemsc                 ó   •— |d   ‰d   k(  S )NÚsubTyper   r´   ©r.   ÚvÚrequested_typess     €r/   r0   z/NFLPlusReplayIE._real_extract.<locals>.<lambda>]  s   ø€ ¨!¨I©,¸/È!Ñ:LÑ*L€ r1   ÚmcpPlaybackIdFr7   c               3   óf   •K  — t        ‰dˆfd„f«      D ]  } ‰j                  | d   «      –— Œ y ­w)Nrù   c                 ó    •— |d   xr |d   ‰v S )Nrÿ   rû   r´   rü   s     €r/   r0   z@NFLPlusReplayIE._real_extract.<locals>.entries.<locals>.<lambda>d  s   ø€ °°/Ñ0BÒ0fÀqÈÁ|ÐWfÐGf€ r1   rÿ   )r   r�   )ÚreplayÚreplaysrþ   r^   s    €€€r/   rÐ   z.NFLPlusReplayIE._real_extract.<locals>.entriesb  s@   øè ø€ Ü&Ø˜'Ó#fÐgóò C�ð ×)Ñ)¨&°Ñ*AÓBÓBñCùs   ƒ.1)Ú_match_valid_urlÚgroupÚ_configuration_argÚlistÚ_REPLAY_TYPESÚkeysr   rr   ri   r[   r]   r�   rÒ   )	r^   r‰   ró   Úvideo_idrQ   Úgame_idrÐ   r  rþ   s	   `      @@r/   rÄ   zNFLPlusReplayIE._real_extractK  sW  ú€ Ø×.Ñ.¨sÓ3×9Ñ9¸&À$ÓG‰ˆˆhØ×1Ñ1°&¸5¸'ÓBˆØ�OÑ#Ü" 4×#5Ñ#5×#:Ñ#:Ó#<Ó=ˆOÜ& t×'9Ñ'9¸DÀ/Ð;RÓSˆáØ× Ñ Ô"Ø&¨'°$·+±+°Ð(?Ð@ˆGØ×)Ñ)ØHÈÈÐOÐQUØ%Ð.?ÀÐ-HÐRYð *ó [à[_ñaˆGð ×)Ñ)Ø?ÀÐGaØ Ð)°7ð *ó <ˆGô �?Ó# qÒ(Ü'¨ØÓLÈoð2_Øhmôo�ñ Ø×&Ñ& xÓ0Ð0ö	Cð ×#Ñ#¡G£I¨tÓ4Ð4r1   N)	r©   rª   r«   rÅ   rÆ   rÇ   r  rð   rÄ   r´   r1   r/   rÕ   rÕ   
  sø   „ Ø#€GØ\€JàUàØØ;ØpØØ%Ø#ØØ,Ð-ÚeØ0ñ
ð # FÐ+ñð" (ØMØàÐ1ð
ñ	ð (ØMØàÐ1ð
ñ	ð (ØMàØØ(ØEØØ%Ø#ØØ,Ð-Ø#Ð$Ø0ñ
ð $Ø.°Ð:JÐ9KÐ0LÐMñ
ñ!ð=2€Fðj !Ø2Ø*Øñ	€Mò!ó5r1   rÕ   c                   óP   — e Zd ZdZdZddddddd	d
dddgdgddœddidœgZd„ Zd„ Zy)ÚNFLPlusEpisodeIEznfl.com:plus:episodez8https?://(?:www\.)?nfl\.com/plus/episodes/(?P<id>[\w-]+)râ   zLhttps://www.nfl.com/plus/episodes/kurt-s-qb-insider-conference-championshipsÚ1576832rz   zConference Championshipsz$md5:944f7fab56f7a37430bf8473f5473857r×   Ú20230127i((ÓciÚ  ÚAnalysisz6Cincinnati Bengals at Kansas City Chiefs (2022-POST-3)rÙ   rÚ   rà   r•   ré   c                 ó$   — | j                  «        y r3   rî   rï   s    r/   rð   z!NFLPlusEpisodeIE._real_initialize�  rñ   r1   c                 ó¸   — | j                  |«      }| j                  «        | j                  d|› �|dd| j                  › �i¬«      d   }| j	                  |«      S )Nz/https://api.nfl.com/content/v1/videos/episodes/ru   rt   )rQ   rÿ   )rÀ   rr   r[   ri   r�   )r^   r‰   ró   r
  s       r/   rÄ   zNFLPlusEpisodeIE._real_extract„  sp   € Ø�~‰~˜cÓ"ˆØ×ÑÔØ×&Ñ&Ø=¸d¸VÐDÀdØ 7¨4¯;©;¨-Ð!8ðUð 'ó ð ñ ˆð
 ×"Ñ" 8Ó,Ð,r1   N)r©   rª   r«   rÅ   rÆ   rÇ   rð   rÄ   r´   r1   r/   r  r  k  s]   „ Ø$€GØL€Jà'Ø]àØØ/ØAØØ%Ø#ØØ%˜,ØMÐNØ0ñ
ð # FÐ+ñ!ð €Fò&!ó-r1   r  )r±   rD   rÎ   rl   r¯   Úanvator   Úcommonr   Úutilsr   r   r	   r
   r   r   r   r   Úutils.traversalr   r   r¶   rÉ   rÕ   r  r´   r1   r/   ú<module>r     su   ðÛ Û Û 	Û Û å Ý !÷	÷ 	ó 	õ +ôo�ô oôd$LˆIô $LôNB�9ô Bô6^5�iô ^5ôB!-�yõ !-r1   