
    ŞiH                       d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZ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mZmZmZmZmZmZmZmZ ddlmZ ddlmZ ddlmZmZm Z m!Z! ddl"m#Z# ddl$m%Z%m&Z& d	d
l'm(Z( d	dl)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZMmNZN d	dlOmPZPmQZQmRZR dZSdZTdZUdZVdZWdZXdZYdZZ G d de          Z[dS )    N   )	INNERTUBE_CLIENTS	BadgeTypeGvsPoTokenPolicyPlayerPoTokenPolicyStreamingProtocolYoutubeBaseInfoExtractor_PoTokenContext_split_innertube_clientshort_client_name)_EJS_WIKI_URL)initialize_jsc_director)JsChallengeRequestJsChallengeTypeNChallengeInputSigChallengeInput)initialize_pot_director)PoTokenContextPoTokenRequest   )	HTTPError)%
NO_DEFAULTExtractorErrorLazyListbug_reports_message
clean_htmldatetime_from_strfilesize_from_tbrfloat_or_noneformat_field	get_firstint_or_nonejoin_nonemptymimetype2ext
orderedSetparse_codecsparse_countparse_durationparse_iso8601parse_qs	qualities
remove_endremove_startsmuggle_urlstr_or_none
str_to_intstrftime_or_nonetraverse_objtry_calltry_getunescapeHTMLunified_strdateunsmuggle_url
update_urlupdate_url_queryurl_or_noneurljoinvariadic)clean_headersclean_proxiesselect_proxy__yt_dlp_client__yt_dlp_fetch_subs_po_token__yt_dlp_fetch_gvs_po_token__yt_dlp_player_token_provided__yt_dlp_innertube_context__yt_dlp_is_premium_subscriber__yt_dlp_available_at_timestampz4https://github.com/yt-dlp/yt-dlp/wiki/PO-Token-Guidec                   $    e Zd ZdZd                    d                    ej                            ZddgZ	dZ
dZd	Zd
ZdZdZdZdZdZg di ddddddddddddgddded d!d"d#d$ed%d&d'd(d)d*d+d,d-ed.d/d0d1d2d3d4d5dd6d7ed8
d9d:d;d<d=dd>d?d@dAdBdCdDdEdFi ddddddddddddgddded d!d"d#d$ed%d&d'd(d+d,d-ed.d/dGd0d2d3d4d5dd6d7edHd9dDdIdJi ddKddLddMddddddgddNded dOd"dPd$ed%dQd'dRd-ed.d/dSddGd0dTd3dUd5dNdVdWedHdXd0d0dYdZd[d\i dd]ddLdd^dddddd_gdd`ded dadbd0d"dcd$ed%ddd'ded+d,d-ed.d/dd0dfd3dgdhd`didjedk
dld0d0dYdmdndoi ddpddddqdd?ddrddsgddtded dudbd0d"dvd$ed%dwd'dxd+d,d-ed.d/dd0dyd3dzd{dtd|d}edk
d~d0idd[ddi ddddddddddddgddded ddbd0d"dd$ed%dd'dd+d,d-ed.d/dd0dd3dddddedk
d~d0idddi dddddddd?ddrddgddded dd"dd$ed%dd'dd-ed.d/dSddGd0dd3dddddedHddDddi dddddddddddd_gddded dd"dd%dd'dd-ed.d/dSddGdddd3dddddeddddd0ddi dddddddddddd_gddded ddbd0d"dd$ed%dd'dd+d,d-ed.d/dd0dd3dddddedk
dgd~d0iddi ddddddddddddgddded dÓdbd0d"dēd%dœd'dƓd-ed.dǓdSdȓdGd0dddd3dddddedМ
d~d0idmdi ddғddddӓddddԓddgdd֓ded dדd"dؓd$ed%dٓd'dړd-ed.d/dSddGd0ddd3ddddded	d~d0idmdd0ddi ddddddddddddgddded dd"dd%dd'dd-ed.d/dSddGd0ddd3dddddedd~d0idmdi ddddddddddԓddgddded dd"dd$ed%dd'dd-ed.dǓdSdȓdGd0dddd3dddddedМ
d d0d0dYdmdd0ddd0ddd0ddd0ddi ddddddddddddgdd	ded d
d"dd$ed%dd'dd-ed.d/dSddGd0dd3ddd	ddedHd~d0idmdd0dddddddddd:dd0ddi ddddddddddddgdd ded d!d"d"d#d$d%d%d'd&d'd(d-ed.d/dSdd0d)d3d*d+d d,d-ed.	d~d0idmd/i dd0dddd1dddddd2gdd3ded d4dbd0d"d5d#dd$ed%d6d'd7d+d,d'd(ed/dd0dd3d8d9d3d:d;ed<d~d0idmd=d0dd>d0dd?d@ddAdBdCdDdEdFd:dGi ddHddddIddddddgddJded dKdbd0d"dLd$ed%dMd'dNd+d,d-ed.d/dd0dd3dOdPdJdQdRedk
dSgd~d0iddTdUddVdWdXdYdZd[d:d\d0dd]d0dd^d0dd_d0dd`d0ddad0ddbd0ddci dddddddedddfdgdhdedidjgdddd_gddjded dkdbd0d"dld$edmdjgd%dndod,ed/dd0dpdd3dqdedrdjedsd~d0idmdtd0ddudvddwdxdydzd{d|d}d9d:d~i ddddddddddddgddded dd"dd%dQd'dd-ed.d/dSddGd0dg d3dddddedd~d0idmdi ddddddddddddgddded ddbd0d"dd#d$d$ed%dd'dd+d,d-ed/dd0dd3dddddedd~d0idmdd0ddd0ddi dddddddddfddhddidgdddd_gddded ddbd0d"dd$edmdgd%ddd,ed/dd0ddd)d3ddddedd~d0idmdd0ddi dddddddd?ddrdd2gddded ddbd0d"dd$ed%dd'dd-ed.d/dSdd0dd3ddddded.	dd:di ddddddddddddgddded dd"dd%dd'dd.d/dSddGd0dddd3dddddedd~d0idmdd0ddd0ddd0ddi ddœddƓddǓddddddgddȓded dɓdbd0d"dʓd#d$d$ed%d˓d'd̓d+d,d-ed/dd0dd3dΐdϐdȐdАdedddҐdgiidd0d՜d֐dלdcd0dddِdgiiidۜdd0ddݐdi ddߓddddddddddgddded ddbd0d"dd#dd$ed%dd'dd+d,d-ed/dd0dd3dddddeddd0dddi ddddddddddddsgddded dd"dd$ed%dd'dd+d,d-ed.d/dSdd0dd3ddddded.	d~d0idmdi ddddddddddddgddded ddbd0d"dd$ed%dd'd d+d,d-ed.d/dd0dddd3dddddedd~d0idmdi dddddedddddd_gddded d	dbd0d"d
ded%dd-ed.ddSdȓdGd0dddd3dddddedМ
d~d0idmdi ddddddddddԓdd_gddded dd"dd%dQd'dd-ed.d/dSddGd0dg d3dddddedd~d0idmd i dd!dddd"ddddԓddgdd#d d$d"d%d%dQd'd&d-ed.d/dSddGd0dg dd3d'd(d#d)d*edd~d0idmd+i dd,dddd-ddddddgdd#d d$d"d%d%d.d'd&d-ed.d/dSddGd0dg dd3d/d0d#d)d*eddd1d2giid0d3d4gd5d6d7d0dd8d9i dd:dddd;ddddddgdd<ded d=dbd0d"d>d$ed%d?d'd@d+d,d-ed.d/dd0g d3dAdBd<dCdDedk
ddҐdEgiidFd0d՜dGd[dHdIi ddddJdddd?ddrddgddded dd"dd$ed%dd'dd-ed.d/dSddGd0dd3dddddedHdKd0ddd[dLdMi ddNddddOddddddgddPded dQdbd0d"dRd#dd$ed%dSd'dTd+d,d-eddd0dUdVdd3dWdUdPdXdYedZd~d0idd[i dd\ddJdd]dddd^ded d_dbd0d"d`d#dd$ed%dad'dbd+d,d-ed.d/dSdd0dTd3dcddd^dedfed.	ddEgdggdhid0d3dGdלdii ddjddddkddddddgddlded dmd"dnd%dQd'dod-ed.d/dSddGd0dg d3dpdqdldrdsedd~d0idmdti dduddddvdidwgdxdvdfdydzd{d|d}dhdvd%d~dSdddddd dd"ddbd0deeeedddd,d_gg ddwgddd0dd/dd~d0idmdi ddddddd%ddSdddddddddd dd"dd$eded-eddd'ddddgg dddgddd0dd/dd~d0idmdi ddddddd%ddSdddddddddd dd"dd$eded-eddd'dddd_gg g dddddd0dd/d
d~d0idmdi ddddddd%dQdSddd#dd)dd*dd#d d$d"d%deded-eddd'd&dddgg ddddd0dd/dddd0d0ddmdi ddddddd%dQdSdddddddddd dd"dded-eddd'dddddgg ddd0dd/d*ddd0d0ddmZdi ddēddddœdƐdǓd%dȓddddTd dɓdGd0dd3d-ed$eddʓd.d/d"d˓ddd'd̓edgedʐd͐dd,dddМ	d~d0idmdi ddғddddӓddddddgddԓded dՓd"d֓d$ed%dדd'dؓd-ed.d/dSddGd0dd3dِdڐdԐdېdedHd~d0idmdi ddޓddddߓdddddd_gddded dd"dd$ed%dQd'dd-ed.d/dddSdd0dd3ddddded.	d~d0idmdi ddddddddddddgddded dd"dd%dd'dd-ed.d/dSddGd0ddd3dddddeddddgiid0d3dmddddddd d(d~d0idgZdZdZdddddd	d
ddd	Zd e                                D             Ze fd            Z fdZ fdZd Z d Z!d Z"ddddZ#dddZ$dHdZ%d Z&d Z'ed             Z(dIdZ)ddd Z*ddd!Z+dJd"Z,d# Z-e fd$            Z.ed%             Z/d& Z0d' Z1d( Z2dKd)Z3dKd*Z4dLd+Z5e6d,             Z7d- Z8e6d.             Z9edJd/            Z:d0ed1e;fd2Z<d3e;j=        ddddddddf
d1e;fd4Z>d5 Z?e6d6             Z@e6d7             ZAd8 ZBd9 ZCd: ZDd; ZEd< ZFd= ZGdKd>ZHd? ZId@ ZJdA ZKdB ZLdKdCZMdD ZNdE ZOdF ZPdG ZQ xZRS (M  	YoutubeIEYouTubea
  (?x)^
                     (
                         (?:https?://|//)                                    # http(s):// or protocol-independent URL
                         (?:(?:(?:(?:\w+\.)?[yY][oO][uU][tT][uU][bB][eE](?:-nocookie|kids)?\.com|
                            (?:www\.)?deturl\.com/www\.youtube\.com|
                            (?:www\.)?pwnyoutube\.com|
                            (?:www\.)?hooktube\.com|
                            (?:www\.)?yourepeat\.com|
                            tube\.majestyc\.net|
                            {invidious}|
                            youtube\.googleapis\.com)/                        # the various hostnames, with wildcard subdomains
                         (?:.*?\#/)?                                          # handle anchor (#/) redirect urls
                         (?:                                                  # the various things that can precede the ID:
                             (?:(?:v|embed|e|shorts|live)/(?!videoseries|live_stream))  # v/ or embed/ or e/ or shorts/
                             |(?:                                             # or the v= param in all its forms
                                 (?:(?:watch|movie)(?:_popup)?(?:\.php)?/?)?  # preceding watch(_popup|.php) or nothing (like /?v=xxxx)
                                 (?:\?|\#!?)                                  # the params delimiter ? or # or #!
                                 (?:.*?[&;])??                                # any other preceding param (like /?s=tuff&v=xxxx or ?s=tuff&amp;v=V36LpHqtcDY)
                                 v=
                             )
                         ))
                         |(?:
                            youtu\.be|                                        # just youtu.be/xxxx
                            vid\.plus|                                        # or vid.plus/xxxx
                            zwearz\.com/watch|                                # or zwearz.com/watch/xxxx
                            {invidious}
                         )/
                         |(?:www\.)?cleanvideosearch\.com/media/action/yt/watch\?videoId=
                         )
                     )?                                                       # all until now is optional -> you can pass the naked ID
                     (?P<id>[0-9A-Za-z_-]{{11}})                              # here is it! the YouTube video ID
                     (?(1).+)?                                                # if we found the ID, everything can follow
                     (?:\#|$)|)	invidiousa  (?x)
            (?:
                <(?:[0-9A-Za-z-]+?)?iframe[^>]+?src=|
                data-video-url=|
                <embed[^>]+?src=|
                embedSWF\(?:\s*|
                <object[^>]+data=|
                new\s+SWFObject\(
            )
            (["\'])
                (?P<url>(?:https?:)?//(?:www\.)?youtube(?:-nocookie)?\.com/
                (?:embed|v|p)/[0-9A-Za-z_-]{11}.*?)
            \1z(?xs)
            <a\s[^>]*\bhref="(?P<url>https://www\.youtube\.com/watch\?v=[0-9A-Za-z_-]{11})"
            \s[^>]*\bclass="[^"]*\blazy-load-youtubevideo)z2/s/player/(?P<id>[a-zA-Z0-9_-]{8,})/(?:tv-)?playerz/(?P<id>[a-zA-Z0-9_-]{8,})/player(?:_ias\.vflset(?:/[a-zA-Z]{2,3}_[a-zA-Z]{2,3})?|-plasma-ias-(?:phone|tablet)-[a-z]{2}_[A-Z]{2}\.vflset)/base\.js$z%\b(?P<id>vfl[a-zA-Z0-9_-]+)\b.*?\.js$)json3srv1srv2srv3ttmlsrtvtt)
android_vrweb
web_safari)rT   )tv_downgradedrU   rV   )rW   web_creatorrU   Fyoutubez6https://www.youtube.com/watch?v=BaW_jenozKc&t=1s&end=9idBaW_jenozKcextmp4titleu#   youtube-dl test video "'/\ä↭𝕐	age_limitr   availabilitypublic
categorieszScience & TechnologychannelzPhilipp Hagemeisterchannel_follower_count
channel_idUCLqxVugv74EIW3VWh2NOa3Qchannel_urlz8https://www.youtube.com/channel/UCLqxVugv74EIW3VWh2NOa3Qcomment_countdescriptionz$md5:8fb536f4877b8a7455c2ec23794dbc22duration
   end_time	   heatmapz	count:100
like_countlive_statusnot_liveTr   zcount:1zre:https?://i\.ytimg\.com/.+i!kP20121002z@PhilippHagemeisterz+https://www.youtube.com/@PhilippHagemeister)
playable_in_embed
start_timetags	thumbnail	timestampupload_dateuploaderuploader_iduploader_url
view_countzVideo unavailable)url	info_dictskipzEmbed-only video (#1746)z%//www.YouTube.com/watch?v=yZIXLfi8CZQyZIXLfi8CZQzCPrincipal Sexually Assaults A Teacher - Episode 117 - 8th June 2012   z$md5:09b78bd971f1e3e289601dfba15ca4f720120608)rZ   r\   r^   r_   ri   rx   zPrivate video)noter}   r~   r   z!Use the first video ID in the URLz9https://www.youtube.com/watch?v=BaW_jenozKc&v=yZIXLfi8CZQrs   )ru   rv   rw   rx   ry   rz   r{   r|   z.256k DASH audio (format 141) via DASH manifestz+https://www.youtube.com/watch?v=a9LDPn-MO4Iza9LDPn-MO4Im4azUHDTV TEST 8K VIDEO.mp48KVIDEOzUC8cn-cnCZ2FnxmjfkoLGpsQz8https://www.youtube.com/channel/UC8cn-cnCZ2FnxmjfkoLGpsQ <   
media_typezcount:8ijPz@8KVIDEOz https://www.youtube.com/@8KVIDEO141)formatskip_downloadyoutube_include_dash_manifestzformat 141 not served anymore)r   r}   r~   paramsr   z+https://www.youtube.com/watch?v=IB3lcPjvWLAIB3lcPjvWLAzJAfrojack, Spree Wilson - The Spark (Official Music Video) ft. Spree WilsonMusicAfrojackUChuZAo1RKL85gev3Eal9_zgchannel_is_verifiedz8https://www.youtube.com/channel/UChuZAo1RKL85gev3Eal9_zgz$md5:8f5e2b82460520b619ccac1f509d43bf   zcount:19iTWR20131011z@AfrojackVEVOz%https://www.youtube.com/@AfrojackVEVO)
r   rs   ru   rv   rw   rx   ry   rz   r{   r|   z141/bestaudio[ext=m4a])r}   r~   r   z6Embed allowed age-gated video; works with web_embeddedz'https://youtube.com/watch?v=HtVdAasjOgUHtVdAasjOgUz7The Witcher 3: Wild Hunt - The Sword Of Destiny Trailer
needs_authGamingzThe WitcherUCzybXLxv08IApdjdN0mJhEgz8https://www.youtube.com/channel/UCzybXLxv08IApdjdN0mJhEgz$md5:595a43060c51c2a8cb61dd33c18e5fbd   zcount:17iﱐS20140605z@thewitcherz#https://www.youtube.com/@thewitcherr   z'Age-restricted; requires authenticationz=Formerly an age-gated video with embed allowed in public sitez'https://youtube.com/watch?v=HsUATh_Nc2UHsUATh_Nc2UzGodzilla 2 (Official Video)EntertainmentFlyingKittyUCYQT13AtrJC0gsM1far_zJgz8https://www.youtube.com/channel/UCYQT13AtrJC0gsM1far_zJgz$md5:bf77e03fcae5529475e500129b05668a   zcount:2it^20200408z@FlyingKitty900z'https://www.youtube.com/@FlyingKitty900)r   r}   r~   r   z6Age-gated video embedable only with clientScreen=EMBEDz'https://youtube.com/watch?v=Tq92D6wQ1mgTq92D6wQ1mgz#[MMD] Adios - EVERGLOW [+Motion DL]zProjekt MelodyzUC1yoRdFoFJaCY-AGfD9W0wQz8https://www.youtube.com/channel/UC1yoRdFoFJaCY-AGfD9W0wQz$md5:17eccca93a786d51bc67646756894066j   zcount:5it^20191228z@ProjektMelodyz&https://www.youtube.com/@ProjektMelodyz"Non-age-gated non-embeddable videoz'https://youtube.com/watch?v=MeJVWBSsPAYMeJVWBSsPAYz%OOMPH! - Such Mich Find Mich (Lyrics)z
Herr LurikzUCdR3RSDPqub28LjZx0v9-aAz8https://www.youtube.com/channel/UCdR3RSDPqub28LjZx0v9-aAz$md5:205c1049102a4dffa61e4831c1f16851   ru   iQ20130730z
@HerrLurikz"https://www.youtube.com/@HerrLurik)rv   rw   rx   ry   rz   r{   r|   )r   r}   r~   zNon-bypassable age-gated videoz'https://youtube.com/watch?v=Cr381pDsSsA)r   r}   only_matching__2ABJjxzNozDeadmau5 - Some Chords (HD)deadmau5zUCYEK6xds6eo-3tr4xRdflmQz8https://www.youtube.com/channel/UCYEK6xds6eo-3tr4xRdflmQz$md5:c27e1e9e095a3d9dd99de2f0f377ba06i
  zcount:14i<K20100430z	@deadmau5z!https://www.youtube.com/@deadmau5zDASH manifest missing)r}   r~   expected_warningsr   lqQg6PlCWgIz5Hockey - Women -  GER-AUS - London 2012 Olympic GamesSportsOlympicsUCTl3QQTvqHFjurroKxexy2Qz8https://www.youtube.com/channel/UCTl3QQTvqHFjurroKxexy2Qz$md5:04bbbf3ccceb6795947572ca36f45904i  was_live
livestream20120731iDPzcount:10iZtU20150827z	@Olympicsz!https://www.youtube.com/@Olympics)
release_daterelease_timestampru   rv   rw   rx   ry   rz   r{   r|   z+https://www.youtube.com/watch?v=_b-2C3KPAM0z_b-2C3KPAM0u8   [A-made] 變態妍字幕版 太妍 我就是這樣的人unlistedzPeople & Blogsu	   孫ᄋᄅzUCS-xxCmRaA6BFdmgDPA_BIwz8https://www.youtube.com/channel/UCS-xxCmRaA6BFdmgDPA_BIwz$md5:636f03cf211e7687daffe5bded88a94fU   gqq?zcount:11iyM20110310z
@AllenMeowz"https://www.youtube.com/@AllenMeow)	stretched_ratioru   rv   rw   rx   ry   rz   r{   r|   qEJwOuvDf7I)r}   r   z+https://www.youtube.com/watch?v=FIl7x6_3R5YFIl7x6_3R5Yuc   [60fps] 150614  마마무 솔라 'Mr. 애매모호' 라이브 직캠 @대학로 게릴라 콘서트dorappi2000UCNlmrKRHLHcd2gq6LtPOTlQz8https://www.youtube.com/channel/UCNlmrKRHLHcd2gq6LtPOTlQz$md5:116377fd2963b81ec4ce64b542173306   zcount:12iU20150626z@dorappi2000z$https://www.youtube.com/@dorappi2000z)https://www.youtube.com/embed/CsmdDsKjzN8CsmdDsKjzN8u1   Retransmisión XVIII Media maratón Zaragoza 2015zAirtek | LED streamingUCzTzUmjXxxacNnL8I3m4LnQz8https://www.youtube.com/channel/UCzTzUmjXxxacNnL8I3m4LnQz$md5:fcac84e6c545114766f670236fc10196i*  20150510i3OUzcount:31iCU20150501z@airtekledstreaming7916z/https://www.youtube.com/@airtekledstreaming7916135z+https://www.youtube.com/watch?v=zaPI8MvL8pgz+https://www.youtube.com/watch?v=gVfLd0zydlozhttps://vid.plus/FlRa-iH7PGwz_https://zwearz.com/watch/9lWxNJF-ufM/electra-woman-dyna-girl-official-trailer-grace-helbig.htmlz+https://www.youtube.com/watch?v=lsguqyKfVQglsguqyKfVQgz4{dark walk}; Loki/AC/Dishonored; collab w/Elflover21zFilm & AnimationIronSoulElfUCTSRgz5jylBvFt_S7wnsqLQz8https://www.youtube.com/channel/UCTSRgz5jylBvFt_S7wnsqLQz$md5:8085699c11dc3f597ce0410b0dcbb34a   zcount:13iNV20151119z@IronSoulElfz$https://www.youtube.com/@IronSoulElfz+https://www.youtube.com/watch?v=Ms7iBXnlUO8z+https://www.youtube.com/watch?v=Q39EVAstoRMQ39EVAstoRMz+Clash Of Clans#14 Dicas De Ataque Para CV 4z$md5:ee18a25c350637c8faff806845bddee920151107)rZ   r\   r^   ri   rx   zThis video does not exist.z+https://www.youtube.com/watch?v=FRhJzUSJbGIz+https://www.youtube.com/watch?v=M4gD1WSo5mAM4gD1WSo5mAz`William Fisher, CopyrightX: Lecture 3.2, The Subject Matter of Copyright: Drama and choreography	Educationz/The Berkman Klein Center for Internet & SocietyUCuLGmD72gJDBwmLw06X58SAz8https://www.youtube.com/channel/UCuLGmD72gJDBwmLw06X58SAchapterszcount:4z$md5:a677553cf0840649b731a3024aeff4cci  licensez4Creative Commons Attribution license (reuse allowed)zcount:3i<pT20150128z@BKCHarvardz#https://www.youtube.com/@BKCHarvard)	rs   ru   rv   rw   rx   ry   rz   r{   r|   z+https://www.youtube.com/watch?v=eQcmzGIKrzgeQcmzGIKrzgz8Democratic Socialism and Foreign Policy | Bernie SanderszNews & PoliticszBernie SandersUCH1dpzjCEiGAt8CXkryhkZgz8https://www.youtube.com/channel/UCH1dpzjCEiGAt8CXkryhkZgz$md5:13a2503d7b5904ef4b223aa101628f39i  iNV20151120z@BernieSandersz&https://www.youtube.com/@BernieSanders)ro   rp   r   rs   ru   rv   rw   rx   ry   rz   r{   r|   zKhttps://www.youtube.com/watch?feature=player_embedded&amp;amp;v=V36LpHqtcDYz+https://www.youtube.com/watch?v=i1Ko8UG-Tdoz+https://www.youtube.com/watch?v=yYr8q0y5JfguGpuVWrhIzEzPiku - Trailerz$md5:c36bd60c3fd6f1954086c083c72092eb20150811zStandard YouTube License)rZ   r\   r^   ri   rx   r   zThis video is not available.z+https://www.youtube.com/watch?v=iqKdEhx-dD4ziqKdEhx-dD4zIsolation - Mind Field (Ep 1)VsaucezUC6nSFpj9HTCZ5t-N3Rm3-HAz8https://www.youtube.com/channel/UC6nSFpj9HTCZ5t-N3Rm3-HAz$md5:f540112edec5d09fc8cc752d3d4ba3cdi%  iקX20170118z@Vsaucezhttps://www.youtube.com/@VsaucezSkipping DASH manifestz+https://www.youtube.com/watch?v=6SJNVb0GnPI6SJNVb0GnPIz Race Differences in Intelligencez$md5:5d161533167390427a1f8ee89a1fc6f1i  20140124)rZ   r\   r^   ri   rj   rx   zJThis video has been removed for violating YouTube's policy on hate speech.1t24XAntNCYzsJL6WA-aGkQz&https://invidio.us/watch?v=BaW_jenozKcz1https://redirect.invidious.io/watch?v=BaW_jenozKcz)https://redirect.invidious.io/Yh0AhrY9GjAz+https://www.youtube.com/watch?v=s7_qI6_mIXcz+https://www.youtube.com/watch?v=Z4Vy8R84T1Uz-https://music.youtube.com/watch?v=MgNrAu2pzNsMgNrAu2pzNszVoyeur Girlalbumz"it's too much love to know my dear	alt_titleartistsStephenzUC-pWHpBjdGG69N9mM2auIAAz8https://www.youtube.com/channel/UC-pWHpBjdGG69N9mM2auIAAcreatorsz$md5:7ae382a65843d6df2685993e90a8628f   20190313i\20190312)rj   rn   ro   rp   r   rs   r   ru   rv   rw   trackrx   ry   r|   z/https://www.youtubekids.com/watch?v=3b8nCWDgZ6QDJztXj2GPflDJztXj2GPfkz9Panjabi MC - Mundian To Bach Ke (The Dictator Soundtrack)z$md5:bf577a41da97918e94fa9798d922882520090125z
Panjabi MCz@Beware of the Boys (Mundian to Bach Ke) - Motivo Hi-Lectro Remixz'Beware of the Boys (Mundian To Bach Ke))rZ   r\   r^   ri   rx   artistr   r   z+https://www.youtube.com/watch?v=x41yOUIvK2kx41yOUIvK2kzIMG 3456zPets & Animalszl'Or Vert asblUCo03ZQPBW5U4UC3regpt1nwz8https://www.youtube.com/channel/UCo03ZQPBW5U4UC3regpt1nw   i?Y20170613z@ElevageOrVertz&https://www.youtube.com/@ElevageOrVertz+https://www.youtube.com/watch?v=CHqg6qOn4noCHqg6qOn4noz+Part 77   Sort a list of simple types in c#	kudvenkatUCCTVrRB5KpIiK6V2GGVsR1Qz8https://www.youtube.com/channel/UCCTVrRB5KpIiK6V2GGVsR1Qz$md5:b8746fa52e10cdbf47997903f13b20dci
  i@"R20130831z@Csharp-video-tutorialsBlogspotz7https://www.youtube.com/@Csharp-video-tutorialsBlogspot)rp   r   rs   ru   rv   rw   rx   ry   rz   r{   r|   z+https://www.youtube.com/watch?v=gVfgbahppCYz1https://www.youtube.com/watch_popup?v=63RmMXCd_bQOtqTfy26tG0zBurn Outz	Every DayzThe Cinematic OrchestraUCIzsJBIyo8hhpFm1NK0uLgwz8https://www.youtube.com/channel/UCIzsJBIyo8hhpFm1NK0uLgwz$md5:fee8b19b7ba433cc2957d1c7582067acif  20020513i  inT20141120)rj   rn   ro   rp   r   rs   r   release_yearru   rv   rw   r   rx   ry   r|   z+https://www.youtube.com/watch?v=nGC3D_FkCmgz+https://www.youtube.com/watch?v=SZJvDhaSDncSZJvDhaSDnczESan Diego teen commits suicide after bullying over embarrassing videozCBS MorningszUC-SJ6nODDmufqBzPBwCvYvQz8https://www.youtube.com/channel/UC-SJ6nODDmufqBzPBwCvYvQz$md5:acde3a73d3f133fc97e837a9f76b53b7   i6oS20140716z@CBSMorningsz$https://www.youtube.com/@CBSMorningscBvYw8_A0vQu:   4K Ueno Okachimachi  Street  Scenes  上野御徒町歩きzTravel & EventszWalk around JapanUC3o_t8PzBmXf5S9b7GLx1Mwz8https://www.youtube.com/channel/UC3o_t8PzBmXf5S9b7GLx1Mwz$md5:ea770e474b7cd6722b4c95b833c03630i  rv   i ڷ_20201120z@walkaroundjapan7124z,https://www.youtube.com/@walkaroundjapan7124)rw   rx   ry   rz   r{   r|   WaOKSUlf4TMz-https://music.youtube.com/watch?v=XclachpHxisz+https://www.youtube.com/watch?v=wsQiKKfKxugz+https://www.youtube.com/watch?v=YOelRv7fMxYYOelRv7fMxY3gpzDIGGING A SECRET TUNNEL Part 1
colinfurzezUCp68_FLety0O-n9QU6phsgwz8https://www.youtube.com/channel/UCp68_FLety0O-n9QU6phsgwz$md5:5d5991195d599b56cd0c4148907eec50iT  zcount:6i`20210624z@colinfurzez#https://www.youtube.com/@colinfurzeplayer_clientandroid17)extractor_argsr   r   zAndroid client broken)r}   r~   r   r   r  player_skipconfigs)r}   r   r   z*https://www.youtube.com/shorts/BGQWPY4IigYStoryboardsz+https://www.youtube.com/watch?v=5KLPxDtMqe85KLPxDtMqe8mhtmlzYour Brain is PlasticSciShowzUCZYTClx2T1of7BRZ86-8fowz8https://www.youtube.com/channel/UCZYTClx2T1of7BRZ86-8fowz$md5:89cd86034bdb5466cd87c6ba206cd2bc   iOx0S20140324z@SciShowz https://www.youtube.com/@SciShow)r   r   z+https://www.youtube.com/watch?v=2NUZ8W2llS42NUZ8W2llS4u,   The NP that test your phone performance 🙂zLeon NguyenUCRqNBSOHgilHfAczlUmlWHAz8https://www.youtube.com/channel/UCRqNBSOHgilHfAczlUmlWHAz$md5:144494b24d4f9dfacb97c1bbef5de84d   zcount:23iGa20220103z@LeonNguyenz#https://www.youtube.com/@LeonNguyenz+https://www.youtube.com/watch?v=mzZzzBU6lrMmzZzzBU6lrMz$I Met GeorgeNotFound In Real Life...QuackityUC_8NknAFiyhOUaZqHR3lq3Qz8https://www.youtube.com/channel/UC_8NknAFiyhOUaZqHR3lq3Qz$md5:42e72df3d4d5965903a2b9359c3ccd25i  iNazcount:26z	@Quackityz!https://www.youtube.com/@Quackity)r   rs   r   r   ru   rv   rw   rx   ry   rz   r{   r|   z+https://www.youtube.com/watch?v=jfKfPfyJRdkjfKfPfyJRdkz	Lofi GirlUCSJ4gkVC6NrvII8umztf0Owz8https://www.youtube.com/channel/UCSJ4gkVC6NrvII8umztf0Owconcurrent_view_countz$md5:48841fcfc1be6131d729fa7b4a7784cbis_live20220712ibbzcount:32i-ebz	@LofiGirlz!https://www.youtube.com/@LofiGirlz+https://www.youtube.com/watch?v=tjjjtzRLHvAtjjjtzRLHvAu*   ハッシュタグ無し };if window.ytcsi
LesmiscoreUCdqltm_7iv1Vs6kp6Syke5Az8https://www.youtube.com/channel/UCdqltm_7iv1Vs6kp6Syke5A   shorti:b20220323z@lesmiscorez#https://www.youtube.com/@lesmiscorez+https://www.youtube.com/watch?v=el3E4MbxRqQel3E4MbxRqQz%dlp test video 2 - primary sv no desczcole-dlp-test-acczUCiu-3thuViMebBjw_5nWYrAz8https://www.youtube.com/channel/UCiu-3thuViMebBjw_5nWYrA   iqc20220908z
@coletdjnzz"https://www.youtube.com/@coletdjnzz+https://www.youtube.com/watch?v=gHKT4uU8ZnggHKT4uU8Zngz$dlp test video title primary (en-GB)z$md5:e8c098ba19888e08554f960ffbf6f90eirb20220729langfr)r  r   z!Preferring "fr" translated fields)r}   r~   r   r   z6 channel audioz+https://www.youtube.com/watch?v=zgdo7-RRjgoz#Multiple HLS formats with same itagz+https://www.youtube.com/watch?v=kX3nB4PpJkokX3nB4PpJkoz$Last To Take Hand Off Jet, Keeps It!MrBeastUCX6OQ3DkcsbYNE6H8uQQuVAz8https://www.youtube.com/channel/UCX6OQ3DkcsbYNE6H8uQQuVAz$md5:42731fced13eff2c48c099fbb5c1b3a0i  iP	pc20221112z@MrBeastz https://www.youtube.com/@MrBeastiosz233-1zPO Token Requiredz,Audio formats with Dynamic Range Compressionz+https://www.youtube.com/watch?v=Tq92D6wQ1mgwebmz251-drcz5Support /live/ URL + media type for post-live contentz(https://www.youtube.com/live/qVv6vCqciTMqVv6vCqciTMu   【 #インターネット女クリスマス 】3Dで歌ってはしゃぐインターネットの女たち【月ノ美兎/名取さな】u   さなちゃんねるUCIdEIHpS0TdkqRkHL5OkLtAz8https://www.youtube.com/channel/UCIdEIHpS0TdkqRkHL5OkLtAz$md5:6aebf95cc4a1d731aebc01ad6cc9806diV  20221223ici`cz@sana_natoriz$https://www.youtube.com/@sana_natori)rp   r   rs   r   r   ru   rv   rw   rx   ry   rz   r{   r|   z+https://www.youtube.com/watch?v=wSSmNUl9SnwwSSmNUl9Snwz&The Computer Hack That Saved Apollo 14zScott ManleyzUCxzC4EngIsMrPmbm6Nxvb-Az8https://www.youtube.com/channel/UCxzC4EngIsMrPmbm6Nxvb-Az$md5:f4bed7b200404b72a394c2f97b782c02i  i9@Y20170831z@scottmanleyz$https://www.youtube.com/@scottmanleywebpage)r  r  z*https://www.youtube.com/shorts/18NGQq7p3LY18NGQq7p3LYu8   아이브 이서 장원영 리즈 삐끼삐끼 챌린지u   ㅇㅇUCC25oTm2J7ZVoi5TngOHg9gz8https://www.youtube.com/channel/UCC25oTm2J7ZVoi5TngOHg9gr   if20240822u   @으아-v1ku#   https://www.youtube.com/@으아-v1kz-https://music.youtube.com/watch?v=DbCvuSGfR3YDbCvuSGfR3YBack Around   half·aliver   Conditions Of A Punkr   20221202r   i  z$md5:bfc0e2b3cc903a608d8a85a13cb50f95ry   u   half•aliveUCYQrYophdVI3nVDPOnXyIngz8https://www.youtube.com/channel/UCYQrYophdVI3nVDPOnXyIng   z:https://i.ytimg.com/vi_webp/DbCvuSGfR3Y/maxresdefault.webp)r8  r9  r7  i}c20221201)rh   r|   ro   r_   rj   rv   rn   rb   ru   r   rw   rx   rs   r`   rp   z+https://www.youtube.com/watch?v=brhfDfLdDZ8brhfDfLdDZ8z/This is the WORST Movie Science We've Ever Seenz$md5:8afd0a3cd69ec63438fc573580436f92
Open Saucerz   z@opensauceliver{   z&https://www.youtube.com/@opensauceliveUC2EiGVmCeD79l_vZ204DUSwz8https://www.youtube.com/channel/UC2EiGVmCeD79l_vZ204DUSwr|   i  z0https://i.ytimg.com/vi/brhfDfLdDZ8/hqdefault.jpg)MoonfallzBad Sciencer?  zSauce+zThe Backyard ScientistzWilliam Osmanz	Allen PanzWilliam Osman 2ih20251003)rb   ru   r   rw   rx   rs   r`   rp   z+https://www.youtube.com/watch?v=_A9KsMbWh4E_A9KsMbWh4Eu)   【MV】薫習 - LIVE UNION【RK Music】z$md5:9b3dc2b91103f303fcc0dac8617e7938RK Musicz@RKMusic_incz$https://www.youtube.com/@RKMusic_inczUCiLhMk-gmE2zgF7KGVyqvFwz8https://www.youtube.com/channel/UCiLhMk-gmE2zgF7KGVyqvFw   z:https://i.ytimg.com/vi_webp/_A9KsMbWh4E/maxresdefault.webp)rD  HACHIu   焔魔るり CH. / Ruri Enmau   瀬戸乃ととu   水瀬 凪/MINASE Nagiii20251031)
rb   ru   r   rw   rx   r   r   rs   r`   rp   z+https://www.youtube.com/watch?v=f6HNySwZV4cf6HNySwZV4cdlptestvideo2z4https://i.ytimg.com/vi/f6HNySwZV4c/maxresdefault.jpgiUe20240308   zcount:15)rb   ru   rw   rx   r   r   rs   r`   rp   rh   comments)r   getcommentsz+https://www.youtube.com/watch?v=3dHQb2Nhma03dHQb2Nhma0u   Tɪtleabcdefgz@abcdefg-d5t2cz&https://www.youtube.com/@abcdefg-d5t2cUCayEJzV8XSSJkPdA7OAsbewz8https://www.youtube.com/channel/UCayEJzV8XSSJkPdA7OAsbew   z4https://i.ytimg.com/vi/3dHQb2Nhma0/maxresdefault.jpgiTi20251231zcount:9)ru   rw   rx   rs   r`   rp   rh   rL  zehttp://www.improbable.com/2017/04/03/untrained-modern-youths-and-ancient-masters-in-selfie-portraits/zmsN87y-iEx0z!Feynman: Mirrors FUN TO IMAGINE 6rx   20080526z$md5:873c81d308b979f0e23ee7e620b312a3zUCCeo--lls1vna5YJABWAcVAzChristopher Sykesz8https://www.youtube.com/channel/UCCeo--lls1vna5YJABWAcVA   z6https://www.youtube.com/@ChristopherSykesDocumentariesz@ChristopherSykesDocumentariesi :H)	r|   rb   rd   ry   r{   rz   rn   rw   r   z?https://badzine.de/news/als-marc-zwiebler-taufik-hidayat-schlugbSVcWOq397gzPTAUFIK TUNJUKKAN KELASNYA !!! : Taufik Hidayat VS Marc Zwiebler Canada Open 2011zBadminton Addict IdUCfCpKOwQGUe2FUJzYNadQcQz8https://www.youtube.com/channel/UCfCpKOwQGUe2FUJzYNadQcQz$md5:2c3737da9a575f301a8380b4d60592a8i  i`20210519z@badmintonaddictid8958z.https://www.youtube.com/@badmintonaddictid8958zMhttps://lothype.com/2025-chino-hills-hs-snare-quad-features-wgi2025-drumline/lC21AX_pCfAz=2025 Chino Hills HS Snare & Quad Features! #wgi2025 #drumline
DrumlineAVUCqdfUdyiQOZMvW5PcTTYikQz8https://www.youtube.com/channel/UCqdfUdyiQOZMvW5PcTTYikQ0   locationWESTMINSTERzcount:72ig20250218z@DrumlineAVz#https://www.youtube.com/@DrumlineAVzIhttps://rabota7.ru/%D0%91%D1%83%D1%85%D0%B3%D0%B0%D0%BB%D1%82%D0%B5%D1%80DexR8_tTSsQu3   Работа бухгалтером в Москвеu:   Работа в Москве свежие вакансииUCG3qz_gefGaMiSBvmaxN5WQz8https://www.youtube.com/channel/UCG3qz_gefGaMiSBvmaxN5WQz$md5:b779d3d70af4efda26cf62b76808c0e3*   zcount:7i<1Y20170602u7   @РаботавМосквесвежиевакансииuO   https://www.youtube.com/@РаботавМосквесвежиевакансииgenericimpersonatechromezhttps://www.uca.ac.uk/z
www.uca.aczAUCA | Creative Arts Degrees UK | University for the Creative Artsz$md5:179c7a06ea1ed01b94ff5d56cb18d73bz8/media/uca-2020/hero-headers/2025-prospectus-all-2x2.jpg)rZ   r^   r_   ri   rv   )r}   r~   playlist_countr   actualtvzplayer_ias.vflset/en_US/base.jsz#player_ias_tcc.vflset/en_US/base.jsz#player_ias_tce.vflset/en_US/base.jszplayer_es5.vflset/en_US/base.jszplayer_es6.vflset/en_US/base.jsz%tv-player-ias.vflset/tv-player-ias.jsz%tv-player-es6.vflset/tv-player-es6.jsz,player-plasma-ias-phone-en_US.vflset/base.jsz-player-plasma-ias-tablet-en_US.vflset/base.js)	maintcctcees5es6rh  tv_es6phonetabletc                     i | ]\  }}||	S  rr  ).0kvs      dC:\Users\betacode\Desktop\descargarYoutube\venv\Lib\site-packages\yt_dlp/extractor/youtube/_video.py
<dictcomp>zYoutubeIE.<dictcomp>f  s    %V%V%Vtq!a%V%V%V    c                     ddl m}  ||          }|                    dd g          d         rdS t                                          |          S )Nr   )r*   listF)yt_dlp.utilsr*   getsupersuitable)clsr}   r*   qs	__class__s       rv  r~  zYoutubeIE.suitableh  s\    ))))))Xc]]66&4&!!!$ 	5ww$$$rx  c                 d     t                      j        |i | i | _        i | _        d | _        d S N)r}  __init___code_cache_player_cache_pot_director)selfargskwargsr  s      rv  r  zYoutubeIE.__init__q  s=    $)&)))!rx  c                     t                                                       t          |           | _        t	          |           | _        d S r  )r}  _real_initializer   r  r   _jsc_director)r  r  s    rv  r  zYoutubeIE._real_initializew  s?      """4T::4T::rx  c           
          t          j                    t          j                    d D              fd fd}D ]k}	|	d<   t          j         j        |	d         || o|	                                          }
r|
|	d<   d|	d<   Mt           |
i                     |	d<   |	d	= ld S )
Nc                 <    g | ]}|                     d           |S )is_from_startr|  rs  fs     rv  
<listcomp>z>YoutubeIE._prepare_live_from_start_formats.<locals>.<listcomp>  s)    @@@)?)?@1@@@rx  c                 J   t          j                     |z   k    rd S 
                    d          \  }}}}}}t          |dt                    }t          |dt                    }
                    ||||          \  }}}|dk    	t          j                     d S )NrU   .videoDetailsexpected_type.microformatplayerMicroformatRendererr  )time_initial_extractr2   dict_list_formats)	format_iddelay_prs
player_urlvideo_detailsmicroformatsrp   formatsr  r  smuggled_datart   r}   video_idwebpage_urls           rv  refetch_manifestzDYoutubeIE._prepare_live_from_start_formats.<locals>.refetch_manifest  s    y{{j5000*.*?*?]K+B +B'Aq!QZ(.CSWXXXM'F"$ $ $L *.););HlTacfhr)s)s&A{GQ!Y.GJJJrx  c                 b                         d          D ]}5    |           ddd           n# 1 swxY w Y   t           fdD             d          }|s&s	 d|_        nd  t                       |_        l|                    d          s n|d         |d         fc S dS )	zZ
            @returns (manifest_url, manifest_stream_number, is_live) or None
            FfatalNc              3   4   K   | ]}|d          k    |V  dS )r  Nrr  )rs  r  r  s     rv  	<genexpr>zOYoutubeIE._prepare_live_from_start_formats.<locals>.mpd_feed.<locals>.<genexpr>  s1      LL+)0K0K!0K0K0K0KLLrx  z: Video is no longer livez*Cannot find refreshed manifest for format manifest_urlmanifest_stream_number)RetryManagernexterrorr   r|  )
r  r  retryr  r  r  lockr  r  r  s
   `   rv  mpd_feedz<YoutubeIE._prepare_live_from_start_formats.<locals>.mpd_feed  s<    ***77 O O 7 7$$Y6667 7 7 7 7 7 7 7 7 7 7 7 7 7 7 LLLLWLLLdSS " v)1&L&L&L&uS\&u^q^s^s&u&u uu^,, E(!,D*EwNNNN4s   6:	:	r  r  	fragmentshttp_dash_segments_generatorprotocolr  )	threadingLockr  	functoolspartial_live_dash_fragmentscopyr   )r  r  r  live_start_timer}   r  r  r  r  r  genr  r  rt   s   ``` ````   @@@rv   _prepare_live_from_start_formatsz*YoutubeIE._prepare_live_from_start_formats|  s@   ~Y[[
@@g@@@	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	%	 	 	 	 	 	 	 	 	 	0  		' 		'A"AiL#D$=x;$3X7{?WqvvxxY YC '!$+ >*!)##b''!2!2+o&&		' 		'rx  c              #   x   K   d\  }}d\  d}	                     d          pt          j                    }
|
|p|
z
  |k    }|r&                     t          d          d           d}|	dd c}}d\   fd	}                     d
| d            rt          j                    }dk    rd S |rJ	                      |d ddd          }n# t          $ r d }Y nw xY wt          |d           dz  d }in |ddk              \  }dz  |s|k    rd }dz  |	dk     r|dk     r|	z   }|r/t          |t          |d         d         z            z
            }	 t          |          D ]A} |dd          \  }}|s|dz
  }t          d          t          d|           }|dV  B|k    rdz  nd}n# t          $ r Y Fw xY wrd S t          j        t          d||z   t          j                    z
                       d S d S )N)r!  i )NNTr   startzStarting download from the last 120 hours of the live stream since YouTube does not have data before that. If you think this is wrong,T	only_onceNNc                 @   }	                     dd           }|p!|ot          |t                    o
|j        dk    } 
|rdnd          pdf\  | s|rsdfS |k    rdfS r}nW	                     d ddd          \  }}n# t
          $ r d }Y nw xY w|s	dz  dfS t          fd	|D                       }|d
         |d         sJ t          t          j	        dd         d                   
                    d                    }d|fS )N
last_errori  r!  iPF  FTr   errnoter     c              3   4   K   | ]}|d          k    |V  dS )r  Nrr  )rs  xstream_numbers     rv  r  zUYoutubeIE._live_dash_fragments.<locals>._extract_sequence_from_mpd.<locals>.<genexpr>  s4      ``a15M3NR_3_3_3_3_3_3_``rx  r  fragment_base_urlz(?:/|^)sq/(\d+)pathr   )pop
isinstancer   status"_extract_mpd_formats_and_subtitlesr   r  intresearchgroup)refresh_sequence	immediateold_mpd_urlr  expire_fastfmt_infofmtsr  	_last_seqctxr  r  r  r  last_seqmanifestless_orig_fmtr  mpd_urlno_fragment_scorer  r  s            rv  _extract_sequence_from_mpdzBYoutubeIE._live_dash_fragments.<locals>._extract_sequence_from_mpd  s    "Kt44J#v
(uz*i7X7X(u]g]nru]uK/7x	C^11Y^/_/_ 0R3:M52Q ,G]G# * *w * (?* G++>)$ a0 "EEE5 F O OGD!!%      DDD  +%*% (?*````4````` -I ()< =$$$$BI&8)B-:OPPVVWXYYZZI?"s   1B BB[z"] Generating fragments for format    Fr  c                 6    t          | j        d                   S )NzX-Head-Seqnum)r"   headersr  s    rv  <lambda>z0YoutubeIE._live_dash_fragments.<locals>.<lambda>  s    ;qy?Y3Z3Z rx  r  rK  r   r  rj   zbreaking out of outer loopzsq/)r}   fragment_countr!  )r|  r  report_warningr   write_debug_request_webpager   r4   maxr  ranger;   sleep)r  r  r  r  r  r  r  
FETCH_SPANMAX_DURATIONbegin_indexdownload_start_timelack_early_segments	known_idxlast_segment_urlr  
fetch_timeurlhshould_continueidxr  r  r  r  r  r  r  r  s   ` ` ```             @@@@@@@rv  r  zYoutubeIE._live_dash_fragments  s     #, 
L*:'!ggg..=$)++1_5[H[\_kk 	' 3V!W !Wbf   h h h #'9Da6	$&6'1$	$	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	#@ 	TXTTTTUUU :	FJ 2%%  00($UEQV 1 X XDD%      DDD "4)Z)Z[[#%*%'+$ $
 -G,FtM^acMc,d,d)!Q&!& 8###' MHQ9q==${2	" f	8c,)TV-XbJc:c6d6d+dee	 H55 
 
C)C)CE5)Q)Q&OQ* K$'!G	,-IJJJ'./@+++'N'N$/*2      ((%*%%()%$		!    %  Js1j:5	CDDEEEu  :	F :	F :	F :	F :	Fs%   C* *C98C9A"G' '
G54G5c                     |                      ddg          d         p| j        }|dk    rdS t          j        d|          s|                     d| dd	
           dS |                    d          S )Nplayer_js_versionr   r   rg  r  z[0-9]{5,}@[0-9a-f]{8,}zInvalid player JS version "z?" specified. It should be "actual" or in the format of STS@HASHTr  @)_configuration_arg_DEFAULT_PLAYER_JS_VERSIONr  	fullmatchr  split)r  r  s     rv  _get_player_js_versionz YoutubeIE._get_player_js_version"  s     334G"NNqQtUYUt((:|57HII 	F.? F F FQU   W W W : &&s+++rx  N)	player_idr  c          	      H   |s|s
J d            |s|                      |          }d}|                                 d         }|r||k    r
d| d| }|}|                     ddg          d         p| j        }|g | j        d	R vr<|                     d
| dd                    | j                   d           | j        }|sB|r|                     |d           |d	k    rd}t          dd| d| j        |                    S | 	                    |          d         }|s|d	k    s||k    rt          d|          S |d	k    r|r|}nd}|                     t          |||k    od| d| d| d          d           t          dd| d| j        |                    S )Nz>_construct_player_url must take one of player_id or player_urlFr   Forcing player z in place of player player_js_variantr   r   rg  z Invalid player JS variant name "z " requested. Valid choices are: , Tr  ri  https://www.youtube.com
/s/player//z	Forcing "z" player JS variant for player zoriginal url = z	
        delim)_extract_player_infor
  r  _DEFAULT_PLAYER_JS_VARIANT_PLAYER_JS_VARIANT_MAPr  joinr  r;   _get_player_id_variant_and_pathr#   )r  r  r  force_player_idplayer_id_overridevariantactual_variants          rv  _construct_player_urlzYoutubeIE._construct_player_url-  s   hJhh(hhhh 	>11*==I!88::1= 	+"4	"A"Ac0BccXaccO*I))*=tDDQGj4KjBD7BBBBBO7 O O&*ii0K&L&LO OZ^   ` ` ` 5G 	w B  D AAA("" 46u96u6utOjkrOs6u6uvvv==jII!L 	BGx$7$77n;T;T4jAAAh !( !~%i*ig*i*i^g*i*i*j**	      ,0	 	 	1 	1 	1 02qy2q2q4KfgnKo2q2qrrrrx  r2  c                h    t          |dddt                    }|sd S |                     |          S )N).PLAYER_JS_URL).WEB_PLAYER_CONTEXT_CONFIGS.jsUrlF)get_allr  )r  )r2   strr  )r  r2  ytcfgsr  s       rv  _extract_player_urlzYoutubeIE._extract_player_urlZ  sJ    !*,]. . .
  	F))Z)@@@rx  c                 :   |                                  d         x}r0|                     d| d           |                     |          S |                     dd||          }|r1|                     d	|d
|          }|r|                     |          S d S d S )Nr   r  Tr  )r  z"https://www.youtube.com/iframe_apizDownloading iframe API JS)r   r  retry_fatalzplayer\\?/([0-9a-fA-F]{8})\\?/zplayer versionr  )r
  r  r  _download_webpage_with_retries_search_regex)r  r  r  r  iframe_webpageplayer_versions         rv  _download_player_urlzYoutubeIE._download_player_urlb  s    !%!<!<!>!>q!AA 	LC/ACCtTTT--8J-KKK<<0,5 = 2 2
  	L!//1>CS[` 0 b bN L11N1KKK		L 	LL Lrx  c                 v   |                      |          }t          t          j                            |          j        d| d          | j                                      p2t          fd| j        	                                D             d           }|s| 
                    d| d           ||fS )Nr  r  c              3      K   | ]D\  }}t          j        t          j        |                              d d                    @|V  EdS )en_USz[a-zA-Z0-9_]+N)r  r  escapereplace)rs  rt  ru  player_paths      rv  r  z<YoutubeIE._get_player_id_variant_and_path.<locals>.<genexpr>u  sx       P[ P[!Q|BIaLL00:JKK[YYP[P[ P[ P[ P[ P[ P[rx  z7Unable to determine player JS variant
        player = Tr  )r  r-   urllibparseurlparser  _INVERSE_PLAYER_JS_VARIANT_MAPr|  r  itemsr  r  r  r  r  r4  s       @rv  r  z)YoutubeIE._get_player_id_variant_and_pathr  s   --j99	"6<#8#8#D#D#IKdXaKdKdKdee599+FF b$ P[ P[ P[ P[=CCEEP[ P[ P[\`Kb Kb  	B1$.1 1<@  B B B ';..rx  c                     |                      |          \  }}}|s$t          j        ddt          |d                    }| d| S )Nz[^a-zA-Z0-9]r  z.js-)r  r  subr,   r:  s        rv  _player_js_cache_keyzYoutubeIE._player_js_cache_key~  sV    *.*N*Nz*Z*Z'	7K 	Sf_c:k53Q3QRRG''g'''rx  c                     | j         D ]}t          j        ||          }|r nt          d|          |                    d          S )NzCannot identify player rZ   )_PLAYER_INFO_REr  r  r   r  )r  r  	player_reid_ms       rv  r  zYoutubeIE._extract_player_info  sd    , 	K 	KI9Y
33D  !!I:!I!IJJJzz$rx  c           	          |                      |          }|| j        vr-|                     |||d| d| d          }|r
|| j        |<   | j                            |          S )NzDownloading player zDownload of z failed)r  r   r  )r>  r  _download_webpager|  )r  r  r  r  player_js_keycodes         rv  _load_playerzYoutubeIE._load_player  s    11*== 000))HE:=::=}=== * ? ?D  726 /##M222rx  use_disk_cachec                   d| |                      |          gt          t          |          R }|| j        v r| j        |         S |sd S | j                            |d         t          |dd           d          }|r
|| j        |<   |S )Nyoutube-r   r   z
2025.07.21)min_ver)r>  mapr/   r  cacheloadr#   )r  namer  rI  
cache_keyscache_iddatas          rv  _load_player_data_from_cachez&YoutubeIE._load_player_data_from_cache  s    %t%%t'@'@'L'LlsS^`jOkOkllt)))%h// 	4zx{M8ABB<,HR^__ 	0+/Dx(rx  c                    d| |                      |          gt          t          |          R }|| j        vr?|| j        |<   |r5| j                            |d         t          |dd           |           d S d S d S )NrK  r   r   )r>  rM  r/   r  rN  storer#   )r  rS  rP  r  rI  rQ  rR  s          rv  _store_player_data_to_cachez%YoutubeIE._store_player_data_to_cache  s    %t%%t'@'@'L'LlsS^`jOkOkll4---+/Dx( R
  !mXabb\.JDQQQQQ .-R Rrx  c           	         |                                  d         }|rt          |          S t          |dt          hf          }|r|S |s*d}|rt	          |          |                     |           dS |                     d|          x}r|S |                     |||          x}r@t          |                     d|dd|	                    }|r| 	                    |d|           |S )
zr
        Extract signatureTimestamp (sts)
        Required to tell API what sig/player version is in use.
        r   STSz5Cannot extract signature timestamp without player urlNstsr  z2(?:signatureTimestamp|sts)\s*:\s*(?P<sts>[0-9]{5})zJS player signature timestamp)r  r  )
r
  r  r2   r"   r   r  rT  rG  r+  rW  )	r  r  r  ytcfgr  player_sts_overriderZ  	error_msgrF  s	            rv  _extract_signature_timestampz&YoutubeIE._extract_signature_timestamp  s6    #99;;A> 	,*+++55;-"899 	J 	OI 0$Y///	***4 33E:FFF3 	J$$Xz$GGG4 	Id00Et/uE 1 K K L LC  I00eZHHH
rx  c           	      Z   dd                     fdt          d          D                       }t          d          D ]h\  }}|rdnd}t          |d|dft          	          }|s|                     d
| d            d S t          j                            |          }t          j        	                    |j
                  }	t          t          |	                    d          pdgd                   dz
            g}
|	                    dg|g|
dd           |r|	                    d|
d           t          j                            |                    t          j                            |	d                              }|                     ||d| ddd           jd S )Nz@abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_r   c              3   T   K   | ]"}t          j        d d          dz           V  #dS )r      ?   N)randomrandint)rs  r  CPN_ALPHABETs     rv  r  z*YoutubeIE._mark_watched.<locals>.<genexpr>  s9      SSAl6>!S#9#9B#>?SSSSSSrx     )videostatsPlaybackUrlvideostatsWatchtimeUrlzfully playbackTrackingbaseUrlr  zUnable to mark watchedlenz1.5r   r   2
detailpage)vercpncmtel)stetT)queryzMarking zUnable to mark watchedFr  )r  r  	enumerater!   r:   r  r5  r6  r7  r*   ru  r%  floatr|  update
urlunparse_replace	urlencoderD  )r  r  player_responsesrp  is_fullkeylabelr}   
parsed_urlr  video_lengthre  s              @rv  _mark_watchedzYoutubeIE._mark_watched  s    ZggSSSSrSSSSS%&YZZ !	7 !	7LGS '/HHRE,/A3	.R*57 7 7C ##$De$D$D$DEEE..s33J&&z'788B  rvve}}'?&C D Dq HIIJLIIuu#"	       		&    
 ,))##&,*@*@T*J*J#KKM MC ""X8%888( # 7 7 7 7?!	7 !	7rx  c              #     K   t          j        d|          }|r2|                     |                    d          |           V  | j        t                                          ||          E d {V  t          j        d|          D ](}|                     t          |          | |          V  )t          j        d|          D ]'}|                     |d         | |d                   V  (d S )NzZ<link rel="alternate" href="(?P<url>https://www\.youtube\.com/watch\?v=[0-9A-Za-z_-]{11})"r}   z(class="lazyYT" data-youtube-id="([^"]+)"z(?x)<div[^>]+
                class=(?P<q1>[\'"])[^\'"]*\byvii_single_video_player\b[^\'"]*(?P=q1)[^>]+
                data-video_id=(?P<q2>[\'"])([^\'"]+)(?P=q2)r  )	r  r  
url_resultr  StopExtractionr}  _extract_from_webpagefindallr5   )r  r}   r2  mobjid_mr  s         rv  r  zYoutubeIE._extract_from_webpage  s$     
 yi   	%..E!2!2C88888$$7700g>>>>>>>>> :I7SS 	> 	>C..c!2!2C======  ?@GI I 	4 	4A ..2QrU333333	4 	4rx  c                 X    |                      |          }|st          d|           |S )NzInvalid URL: )get_temp_idr   )r  r}   r  s      rv  
extract_idzYoutubeIE.extract_id	  s7    ??3'' 	8 !6!6!6777rx  c                 f    t          |dt                    }|                     |d d |          S )N)playerOverlaysplayerOverlayRendererdecoratedPlayerBarRendererr  	playerBarchapteredPlayerBarRendererr   r  c                 @    t          t          | d          d          S )N)chapterRenderertimeRangeStartMillis  scale)r   r2   chapters    rv  r  z7YoutubeIE._extract_chapters_from_json.<locals>.<lambda>"	  s)    =W&QRRZ^,` ,` ,` rx  c                 0    t          | dt                    S )N)r  r^   
simpleTextr  )r2   r%  r  s    rv  r  z7YoutubeIE._extract_chapters_from_json.<locals>.<lambda>$	  s!    <CSV,X ,X ,X rx  )start_functiontitle_functionrj   )r2   rz  _extract_chapters_helper)r  rS  rj   chapter_lists       rv  _extract_chapters_from_jsonz%YoutubeIE._extract_chapters_from_json	  s`    #  "	# # # ,,` `X X -   	rx  c           	           t          |dt                    } fd fdt          t          d  fd|D                       g           S )N)engagementPanels."engagementPanelSectionListRenderercontentmacroMarkersListRenderercontentsr  c                 J    t                              | d                    S )NtimeDescription)r(   	_get_textr  r  s    rv  r  zCYoutubeIE._extract_chapters_from_engagement_panel.<locals>.<lambda>-	  s    ~dnnWN_6`6`'a'a rx  c                 0                         | d          S )Nr^   r  r  s    rv  r  zCYoutubeIE._extract_chapters_from_engagement_panel.<locals>.<lambda>.	  s    w(H(H rx  c              3   d   K   | ]*}                     t          |d                     V  +dS )).macroMarkersListItemRendererN)r  r2   )rs  r  chapter_timechapter_titlerj   r  s     rv  r  zDYoutubeIE._extract_chapters_from_engagement_panel.<locals>.<genexpr>0	  s_       "* "*  )),xAf*g*g*6xQ Q"* "* "* "* "* "*rx  )r2   rz  r  filter)r  rS  rj   content_listr  r  s   ` ` @@rv  '_extract_chapters_from_engagement_panelz1YoutubeIE._extract_chapters_from_engagement_panel(	  s    #~      baaaHHHHF4 "* "* "* "* "* "* "* )"* "* "* + + -/0 0 	0rx  c                 z    t          |dddd ddddd	d
t          d          hfd hdt          hfdf
          pd S )NframeworkUpdatesentityBatchUpdate	mutationsc                 >    |d         d         d         d         dk    S )NpayloadmacroMarkersListEntitymarkersList
markerTypeMARKER_TYPE_HEATMAPrr  r  ru  s     rv  r  z,YoutubeIE._extract_heatmap.<locals>.<lambda>8	  s     9&>?N|\`uu rx  r  r  r  markers.startMillisr  r  c                 ^    t          | d                   t          | d                   z   dz  S )Nr  durationMillisr  )r  r  s    rv  r  z,YoutubeIE._extract_heatmap.<locals>.<lambda>;	  s,    Am,<(=(=AFVDW@X@X(X\`'` rx  intensityScoreNormalized)rt   rl   value)r2   r   )r  rS  s     rv  _extract_heatmapzYoutubeIE._extract_heatmap5	  st    D 3[uu/	3,}4/H/H/H.IJ``a4}oFQ Q#    	rx  c                 (   t          |ddt          hf          }t          |ddt          hf          x}sd S t          |ddt          hf          }t          |ddt          hf          pd}||pdd	t          |dd
d
t          hfddt          hfdd| j        hfddt          hfddt          hfddt          hfddt          hfddddt          d          hfdd          |d n|	                    d          dk    || 
                    |          dS )Nr  commentEntityPayload
properties	commentId#engagementToolbarStateEntityPayloadpublishedTimer   root)rZ   parentr  toolbarlikeCountA11yauthor	channelIddisplayNameavatarThumbnailUrl	isCreator
isVerifiedchannelCommandinnertubeCommandbrowseEndpointcanonicalBaseUrlcommandMetadatawebCommandMetadatar}   r  )textro   	author_idr  author_thumbnailauthor_is_uploaderauthor_is_verified
author_urlFr$  
heartStateTOOLBAR_HEART_STATE_HEARTED)is_favorited
_time_textrw   )r!   r  r2   r%  r'   ucid_or_noner:   boolr;   r|  _parse_time_text)r  entitiesr  comment_entity_payload
comment_idtoolbar_entity_payload	time_texts          rv  _extract_commentzYoutubeIE._extract_comment?	  s   !*8iAWZ^Y_5`!a!a*+ALR]`c_dCefff
 	F!*8iAfimhn5o!p!p !7,Z]Y^9_``fdf	 &
 
 1%y)cUC(/K=I&d6G5HI#]SE:%-/Ck]$S'/tf&E'/v&F')9;M P566794 4   
 &<%CTT377EEIff#..y99%
 
 
 	
rx  c                 4   |                     d          }|sd S ||                     |d          |                     |d          t          |ddd| j        hf          |                     |d          t          |dd	d
dt
          hf          |pdd}|                     |d          pd}|                     |          }|                    ||d           t          dt          |dt          d                    |d<   t          |d          }|||d<   t          |dt                    }|d|v |d<   |                     t          |d          g          }	|                     |	t          j                  rd|d<   t          |d          }
|
rd|d <   |S )!Nr  contentText	voteCountauthorEndpointr  browseId
authorTextauthorThumbnail
thumbnailsr  r}   r  )rZ   r  ro   r  r  r  r  publishedTimeTextr   )r  rw   r  )r  r  Fr  r$  r  authorIsChannelOwnerr  )actionButtonscommentActionButtonsRendererr  creatorHeartr  authorCommentBadgeTr  pinnedCommentBadge	is_pinned)r|  r  
_get_countr2   r  r:   r  rx  r;   r%  r  _extract_badges
_has_badger   VERIFIED)r  comment_rendererr  r  infor  rw   r  comment_abrbadgesr  s              rv  _extract_comment_oldzYoutubeIE._extract_comment_old\	  s	   %))+66
 	F NN#3]CC//*:KHH%&69IK[]gjnj{i|8}~~nn%5|DD ,-=@QS_acejmxly?z { {&
 
 NN#35HIIOR	)))44	#"
 
 	 	 	 %%|4D Gk!5(2 (2 (23 3\
 **:<RSS));D%&"O_ce e e"#1[#@D %%|4DFZ'['[&\]]??69#566 	.)-D%& !13GHH	 	% $Drx  c           
   #      K    fd fd} f	ds"dd dddt                      t                      dd                      d          dgd	z  z   D             ^}}	|k     rd S                      |          }
d }d
}|d u }|r,|
s*                                                              }
d}d}t          j        d          D ]}|
s n                                          |                    }dd          dd          d}|dk    r|rd}n.dd         |fz  }n d	                    |rdnd|rdnd||          }d }|s%d         dk    rd         dk    sg |d|rdndg}	  
                    d |
d|||          }n|# t          $ ro}dt          |                                          v rF|rD                     d          d v r                     d!           Y d }~ d S t          d"d#           d }~ww xY wd
}d }
t!          |d$d%d&dt"          hf          }t!          ||t$          g '          D ]M}|r ||          }
d
}|
r n9 ||||          D ]}|s   d S |V                       d(|i          }
|
r nNʉ                     |d)d*+          }|r0|s0d         dk    r&                     d,| d-            j        d S d S d S ).Nc                 >                         | dg          d         S )Nr   r   )r  )cr  s    rv  r  z,YoutubeIE._comment_entries.<locals>.<lambda>	  s    $*A*A!bT*J*J1*M rx  c                 N   d }| D ]}t          |d          }
                    |dd          }||d<   
                    d| d           t           	d          dk              t	          |fd	t
                    pi }|                    d
          pi }
                    |          p
                    |          }|st          |                    d                    }|s
dk    rdnd}
                    d|
                                             |S )NcommentsHeaderRenderer	countTextcommentsCount	est_totalzDownloading ~z	 commentscomment_sorttopc                 8    | d         d         d                  S )NsortMenusortFilterSubMenuRenderersubMenuItemsrr  )r  comment_sort_indexs    rv  r  zDYoutubeIE._comment_entries.<locals>.extract_header.<locals>.<lambda>	  s    a
m,GHXYkl rx  serviceEndpointr^   r   ztop commentsznewest firstzSorting comments by )r2   r  	to_screenr  r4   r  r|  _extract_continuation_ep_data_extract_continuationr/   lower)r  _continuationr  comments_header_rendererexpected_comment_countsort_menu_itemsort_continuation_ep	sort_textr  get_single_config_argr  trackers           @rv  extract_headerz2YoutubeIE._comment_entries.<locals>.extract_header	  s    M#  +7AY+Z+Z()-,k?*L *L& *5+AGK(NN#T3I#T#T#TUUU%()>)>~)N)NRW)W%X%X"!(,llllnr"t "t "zwy  (6'9'9:K'L'L'RPR$ $ B BCW X X  !G\`\v\v  xF  ]G  ]G$ '(:(:7(C(CDD	  ^2D2I2I~IIioo6G6GIIJJJ  rx  c              3   n  	K   |sdd<   |k     rd S | D ]}|sd         k    rd V  t          |d           }|s4t          ||fddggt          i           }                    ||          }nt	          |ddt          hf          pt	          |dt          hf          }t	          |d	t
          hf          st	          |fd
          }	                    |	|          }|rt	          |dt
          hf          d u|d<   |s|d         }
|                    d          rd                             |
           |
d         v rE|
d         v r|                    d          sV	                    d|rdnd d           d V   d S d                             |
           dxx         dz  cc<   |rdndxx         dz  cc<   |V  t          |d t                    }|rt	          |ddt          hf          }t	          |d           x}r- |||
|dz             D ]}|r|V  	t	          |d           s/dxx         dz  cc<   
                    ||
|dz             }t          j        |t          t          dd         z
                                E d {V  d S )Nr   current_page_threadtotal_parent_commentsc                     | d         S NcommentThreadRendererrr  r  s    rv  r  zDYoutubeIE._comment_entries.<locals>.extract_thread.<locals>.<lambda>	  s    QG^E_ rx  commentRenderer)commentr2  r  defaultcommentViewModel)
commentKeytoolbarStateKeyc                     |d         v S )N	entityKeyrr  )r  ru  comment_keyss     rv  r  zDYoutubeIE._comment_entries.<locals>.extract_thread.<locals>.<lambda>	  s    !K.\hJh rx  
pinnedTextr  rZ   pinned_comment_idsseen_comment_idsz?Detected YouTube comments looping. Stopping comment extraction zfor this threadr   z$ as we probably cannot get any more.running_totalr   total_reply_commentsc                     | d         d         S )NrepliescommentRepliesRendererrr  r  s    rv  r  zDYoutubeIE._comment_entries.<locals>.extract_thread.<locals>.<lambda>	  s    q|D\7] rx  
subThreads.c                     |d         S r0  rr  r  s     rv  r  zDYoutubeIE._comment_entries.<locals>.extract_thread.<locals>.<lambda>	  s    JaHb rx  c                     |d         S )NcontinuationItemRendererrr  r  s     rv  r  zDYoutubeIE._comment_entries.<locals>.extract_thread.<locals>.<lambda>	  s    QGaEb rx  )r  r*  depth)r4   r!   r  r  r2   r%  r  r|  addr  _comment_entries	itertoolsisliceminr  )r  entity_payloadsthread_parentthread_depthr  comment_thread_rendererr
  r3  
view_modelr  r  comment_replies_renderer
subthreadsthreadsentrycomment_entries_iterr;  extract_thread	max_depthmax_parentsmax_repliesmax_replies_per_threadr  r*  r  r[  s                   @rv  rX  z2YoutubeIE._comment_entries.<locals>.extract_thread	  s;       312-.<''# Ih Ih$ 1H)I[)X)XEEE*1';_;_*`*`' ' k'00':>OQo=p<q&*B(8 (8 (8$ #778H-XXGG
 %%<?QSehlgm>noo O'2Dtf1MNN  $0
=^ad`e<f#g#gL' ! +O=h=h=h=hiiH"33HmLLG k/;JX[W\H]/^/^fj/j, $T]
;;{++ B0155jAAA );!<<<!W-A%BBB7;;WbKcKcB !''l0=E,,2l l lm m m EEEEE./33J???(((A-(((-\..E\]]]abb]]] ,3+-]-]_c,e ,e( , h!-.FWZ]a\bHc!d!dJ".z;b;b"c"ccw %%3^G_jZfijZj%k%k , ,E$ ,&++J8b8bcc % %1222a7222+/+@+@0%)7,QRBR ,A ,T ,T(  )/0Dc.A{WMcEd7d0e0eGg Gg  h  h h h h h h h hQIh Ihrx  r   )r?  r  r-  r.  r@  r>  r=  c              3   L   K   | ]}t          |t          j                   V   dS )r5  N)r"   sysmaxsizers  ps     rv  r  z-YoutubeIE._comment_entries.<locals>.<genexpr>
  sR       Zm Zm45K3;///Zm Zm Zm Zm Zm Zmrx  max_commentsr   r!  FT)onResponseReceivedEndpoints.)reloadContinuationItemsCommandappendContinuationItemsActioncontinuationItems)r[  visitor_data(r?  z/~r  )z$Downloading comment section API JSONz3    Downloading comment API JSON reply thread %d %sr-  z+{}Downloading comment{} API JSON page {} {}z       z replies.r  )r1  r6  r2  r  )item_idru  epr[  r  r   check_get_keyszincomplete dataignoreerrors)Tonly_downloadzReceived incomplete data for a comment reply thread and retrying did not help. Ignoring to let other comments be downloaded. Pass --no-ignore-errors to not ignore.zyIncomplete data received for comment reply thread. Pass --ignore-errors to ignore and allow rest of comments to download.expectedr  r  r  r4  r  )r  .messageRendererr  r   max_runszYoutube said: r  r  )setr  r!  _build_api_continuation_query_generate_comment_continuationrK  countgenerate_api_headers_extract_visitor_datar   _extract_responser   r%  r"  	get_paramr  r2   r  rz  r  CommentsDisabled)r  root_continuation_datar[  r  r  r*  rH  r+  _max_commentsr  continuationresponseis_forced_continuationis_first_continuationcontinuation_items_pathpage_numr  comment_prog_strnote_prefixrm  er  continuation_itemsrV  messagerX  r)  rY  rZ  r[  r\  s   ` `` `                   @@@@@@rv  rJ  zYoutubeIE._comment_entries	  s=      M M M M	! 	! 	! 	! 	! 	! 	!8P	h P	h P	h P	h P	h P	h P	h P	h P	h P	h P	h P	h P	hf  		!"!'()*()$'EE&)ee GZm Zm9=9P9PQ_9`9`dfcgjkck9kZm Zm ZmV{K1GUV uF112HII!& &$  	* 	*
  ==d>a>abj>k>kllL%)"#J!** >	 >	H //e$JdJdemJnJn/ooGV7?#;VVw{?SVVV1}}( J"HKK"W 568H[J #JKK LRR!'/IIRv1M2.0 0 "N) O7;3G13L3LQXYhQimnQnQn#N$; #NS #N0E  L,,  LL#N "O11 UG+#1 2 3 3 "   
 %A6666~~n559PPP++st t t ,e%)+ + + + !" &+"L$X0BDWYdfilpkq/rssI&28=Tdhrt&u&u&u  "( #1>2D#E#EL,1)# +^,>	6SXYY    E  KKKK#99:GY:Z[[ E ..!79epq.rr 	(6 	(go&>!&C&C : : :XY]^^^''	( 	( 	( 	(&C&Cs   	F&&
H0AHHHc                     d|  d|  d}t          j        |                                                                          S )zZ
        Generates initial comment section continuation token from given video id
        zz2'""z0 x0 Bcomments-section)base64	b64encodeencodedecode)r  tokens     rv  rx  z(YoutubeIE._generate_comment_continuatione
  sB    
 onnnnn//66888rx  c                       fd}t                               ddg          d                   }t          j         ||          d|          S )zEntry for comment extractionc              3      K   t          d t          | di           D             d           }                    |          E d {V  d S )Nc              3   L   K   | ]}|                     d           dk    |V   dS )sectionIdentifiercomment-item-sectionNr  )rs  items     rv  r  zIYoutubeIE._get_comments.<locals>._real_comment_extract.<locals>.<genexpr>p
  sK       L L88/004JJJ JJJJL Lrx  ).itemSectionRendererr^  )r  r2   rJ  )r  rendererr  r  r[  s     rv  _real_comment_extractz6YoutubeIE._get_comments.<locals>._real_comment_extracto
  s       L L!-h8T^`!a!a!aL L LMQS SH ,,XuhGGGGGGGGGGGrx  rc  r   r   )r"   r  rK  rL  )r  r[  r  r  r2  r  rc  s   ```    rv  _get_commentszYoutubeIE._get_commentsm
  sw    	H 	H 	H 	H 	H 	H 	H #4#:#:>B4#P#PQR#STT 5 5h ? ?LQQQrx  c                      dddS )NT)contentCheckOkracyCheckOkrr  rr  rx  rv  _get_checkok_paramszYoutubeIE._get_checkok_paramsx
  s    "&t<<<rx  c                 b    ddi}|||d<   d|i}|rddi|d<   d|i|                                  S )	Nhtml5PreferenceHTML5_PREF_WANTSsignatureTimestampcontentPlaybackContextpyvTadPlaybackContextplaybackContext)r  )r  rZ  use_ad_playback_contextcontextplayback_contexts        rv  _generate_player_contextz"YoutubeIE._generate_player_context|
  su     1
 ?,/G() %g
 # 	t501
 /
%%''
 	
rx  clientr  c           	         |                      dg t          d          }|D ]I}|                    d          \  }}}|s|                     d| dd           :|                    d          \  }}}	|                                |k    rl|s,|                     d	| d
d           t          j        j        }	|	                                |j        k    r	 t          j
        t          j        t          j                            |                                                              c S # t           j        t$          f$ r" |                     d| d|	 dd           Y Gw xY wd S )Npo_tokenT)ie_key	casesense+zPInvalid po_token configuration format. Expected "CLIENT.CONTEXT+PO_TOKEN", got ""r  .zpo_token configuration for zo client is missing a context; assuming GVS. You can provide a context with the format "CLIENT.CONTEXT+PO_TOKEN"z#Invalid po_token configuration for z	 client: z/ PO Token should be a base64url-encoded string.)r  rH   	partitionr  r"  r  r
   GVSr  r  urlsafe_b64encodeurlsafe_b64decoder5  r6  unquoter  binasciiError
ValueError)
r  r  r  po_token_strs	token_strpo_token_metasepr  po_token_clientpo_token_contexts
             rv  _get_config_po_tokenzYoutubeIE._get_config_po_token
  s   //
By\`/aa&  	  	I+4+>+>s+C+C(M3 ##M@IM M MX\ $ ^ ^ ^ 5B5L5LS5Q5Q2OS"2$$&&&00 =  Z& Z Z Z" ! $ $ $ $3#6#< %%''7=88/0HI]I]^fIgIg0h0hiipprrrrrNJ/   ##Y& Y Y'Y Y Y" $ $ $ $ 7 	  	s   AD114E)(E)rU   c                 b   d}t          |dddt          j        j        hf          }dt          |d          v r|                     | d| dd	
           d	}|r8|t
          j        k    r(|s&| j        s|s|                     d| dd	
           dS |t
          j	        k    r|s|                     d| d           dS | 
                    ||          }|r[|r4|t
          j        k    r$|s"| j        r|s|                     d| d           |                     | d|j         d| d           |S |r6|t
          j        k    r&|s$| j        r|                     d| dd	
           dS  | j        d||j        |||||||	|
|d|}|r%|                     | d|j         d| d           |S dS )a  
        Fetch a PO Token for a given client and context. This function will validate required parameters for a given context and client.

        EXPERIMENTAL: This method is unstable and may change or be removed without notice.

        @param client: The client to fetch the PO Token for.
        @param context: The context in which the PO Token is used.
        @param ytcfg: The ytcfg for the client.
        @param visitor_data: visitor data.
        @param data_sync_id: data sync ID.
        @param session_index: session index.
        @param player_url: player URL.
        @param video_id: video ID.
        @param webpage: video webpage.
        @param required: Whether the PO Token is required (i.e. try to fetch unless policy is "never").
        @param kwargs: Additional arguments to pass down. May be more added in the future.
        @return: The fetched PO Token. None if it could not be fetched.
        Fr"  .serializedExperimentFlagstrue).html5_generate_content_po_tokenr  z;: Detected experiment to bind GVS PO Token to video ID for z clientTr  z!Unable to fetch GVS PO Token for zz client: Missing required Visitor Data. You may need to pass Visitor Data with --extractor-args "youtube:visitor_data=XXX"Nz$Unable to fetch Player PO Token for z" client: Missing required Video IDzGot a GVS PO Token for z client, but missing Data Sync ID for account. Formats may not work.You may need to pass a Data Sync ID with --extractor-args "youtube:data_sync_id=XXX"z: Retrieved a z PO Token for z client from configz client: Missing required Data Sync ID for account. You may need to pass a Data Sync ID with --extractor-args "youtube:data_sync_id=XXX")r  r  r[  rh  data_sync_idsession_indexr  r  video_webpagerequired_gvs_bind_to_video_idrr  )r2   r5  r6  r*   r  r
   r  is_authenticatedr  PLAYERr  r  _fetch_po_token)r  r  r  r[  rh  r  r  r  r  r2  r  r  gvs_bind_to_video_idexperimentsconfig_po_tokenr  s                   rv  fetch_po_tokenzYoutubeIE.fetch_po_token
  s   2  %"5(#/JV\MbLc+e f f\+/[\\\\ 3 3#)3 3 3>B  D D D $( 
 	"o&999  :)-)> :G[ : fF f f fqu   w w w Fo,,,X,avaaac c cF33FGDD 	# m&/*===$  >)-)>  >G[  > ##lf l l lm m m ppppU[pppqqq""  	'_%8888RVRg8hF h h hsw   y y y F'4' 
M%%'!!"6
 
 
 
  	ddddU[dddeeeO	 	rx  c           	         |                     d          }|                     ddgt                    d         }|dvrd}|dk    s|dk    r|                     d	d
          sd S |                     d                                          }| j        j                                        }t          |           t          ||           | 	                    d |          }t          d%i dt          |          dt          |d          d|d|d|                     d          d|                     d          d|                     d          d| j        d|                     d          d|                     d          d|                     d          d| j        j        d|                     dd
          dt          d|          pt          d| |          d|d|                     d          d |                     d!           d"|                     d#          d$d
}| j                            |          S )&Nr  	fetch_potr   )r  r   )neverautoalwaysr  r  r  Fhttp_headers)default_clientinnertube_context)r[  INNERTUBE_CONTEXTinnertube_hostinternal_client_namer  r  r  r  rh  r  r  request_cookiejarr  request_proxyr  zhttps://request_headersrequest_timeoutsocket_timeoutrequest_verify_tlsnocheckcertificaterequest_source_addresssource_addressbypass_cacherr  )r|  r  rH   r}  r  _downloaderproxiesr=   r>   _select_api_hostnamer   r   r2   r  	cookiejarr?   r  get_po_token)	r  r  r  r  fetch_pot_policyr  r  r  pot_requests	            rv  r  zYoutubeIE._fetch_po_token  s   **Y''  22;Y2WWXYZ#>>>%'' F**

:u55 + 4..005577"*//11ggw'''2242OO$ 
 
 
"7+++
*63QRRR
 *>
 "(	

 !**_555
 zz,///
 !**_555
 "22
  N333
  N333
 ZZ
+++
 #.88
 #)**-De"L"L"L
$ 6@@ F ;> ; ;WEE'
* $G+
, !NN+;<<<-
. $(>>2F#G#GGG/
0 $(>>2B#C#C#C1
4 5
: !..{;;;rx  c                     t          | d          rdS t          | d          d}t          fd|D                       S )N)playabilityStatusdesktopLegacyAgeGateReasonT)r  )r  reason)zconfirm your agezage-restrictedinappropriateage_verification_requiredage_check_requiredc              3   *   K   | ]}D ]}||v V  	d S r  rr  )rs  rq  r  reasonss      rv  r  z)YoutubeIE._is_agegated.<locals>.<genexpr>O  s6      ]](U\]]68v%]]]]]]]rx  )r2   any)player_responseAGE_GATE_REASONSr  s     @rv  _is_agegatedzYoutubeIE._is_agegatedE  sY    )\]] 	40[\\
 ]]]]6F]]]]]]rx  c                 *    t          | d          dk    S )N)r  r  
UNPLAYABLEr2   )r  s    rv  _is_unplayablezYoutubeIE._is_unplayableQ  s    O-LMMQ]]]rx  c
                    |                      ||||                     ||          |                     |          d         p|                     |||          |                     |          d         p|                     |||                    }
d|i}t          t          t          |          d         dt          hf          }| 	                    d|gd          d         x}r||d	<   |	rd
|	i|d<   |r| 
                    |||d          nd }| 	                    ddg          d         dk    ot          t          |dt          hf          }|                    |                     ||                     |                     |d|||
d|d                    |                    dd                                                              pd S )Nr   r   )r[  r  rh  r  delegated_session_iduser_session_idvideoIdPLAYER_PARAMSplayer_paramsTr  r   poTokenserviceIntegrityDimensionsFr  r  falseSUPPORTS_AD_PLAYBACK_CONTEXTplayerzDownloading {} player API JSONr   )rk  rl  ru  r[  r  r  r  r   )rz  _extract_session_index_parse_data_sync_id_extract_delegated_session_id_extract_user_session_idr2   r   r   r%  r  r^  r  rx  r  r|  r   r3  strip)r  r  r  webpage_ytcfgplayer_ytcfgr  
initial_prrh  r  r  r  yt_query
default_ppr  rZ  r  s                   rv  _extract_player_responsez"YoutubeIE._extract_player_responseU  s"   ++!%55m\RR((66q9 _55mZQ]^^ ((66q9 Z00
LYY , 
 
  x
 " 7 ? ? BOVYUZ[] ]
 33Oj\]a3bbcdee= 	/!.HX 	K6?5JH12eoyd//*m[`/aaauy ##$=yII!LPWW b.9WZ^Y_0`aa 	  	55c;RSSTTT%%t!188S9Q9Q9W9W9Y9YZZ	 & 
 
 
 	rx  c                    g }g }t          d | j        j                                        D                       }|r| j        n| j        r| j        n|s| j        n| j        }t          d t          D             d d          }|                     d          D ]}	|	dk    r|                    |           |	dk    r|                    |           :|	                    d	          r|                    |	d
d                     m|	|vr|                     d|	 d           |                    |	           |s-|s+|| j        k    r |                     dt            dd           |s|                    |           |D ]}
|
|v r|                    |
           |st%          dd          | j        r|                    d          s|                     |          rd|vr|                    d           d |D             }|D ]2}	|                     d|	 dd           |                    |	           3t+          |          S )Nc              3   >   K   | ]}|                                 V  d S r  is_availablera  s     rv  r  z3YoutubeIE._get_requested_clients.<locals>.<genexpr>  s,      "c"c1>>#3#3"c"c"c"c"c"crx  c              3   6   K   | ]}|d d         dk    |V  d S )Nr   r  rr  rs  r  s     rv  r  z3YoutubeIE._get_requested_clients.<locals>.<genexpr>  s4      IIvbqbzS7H7HV7H7H7H7HIIrx  c                 (    t           |          d         S )Npriorityr   )r  s    rv  r  z2YoutubeIE._get_requested_clients.<locals>.<lambda>  s    08D rx  T)r~  reverser  r5  allr<  r   zSkipping unsupported client "r  a  No supported JavaScript runtime could be found. Only deno is enabled by default; to use another runtime add  --js-runtimes RUNTIME[:PATH]  to your command/config. YouTube extraction without a JS runtime has been deprecated, and some formats may be missing. See  z  for details on installing oner  z%No player clients have been requestedrp  is_music_url	web_musicc                 8    g | ]}t           |         d          |S )SUPPORTS_COOKIESr   r  s     rv  r  z4YoutubeIE._get_requested_clients.<locals>.<listcomp>  s:     # # #!>OPV>WXj>k## # #rx  zSkipping client "z#" since it does not support cookies)r  r  	providersvalues_DEFAULT_PREMIUM_CLIENTSr  _DEFAULT_AUTHED_CLIENTS_DEFAULT_JSLESS_CLIENTS_DEFAULT_CLIENTSsortedr   r  extend
startswithappendr  r   remover   r|  r#  r%   )r  r}   r  is_premium_subscriberrequested_clientsexcluded_clientsjs_runtime_availabledefault_clientsallowed_clientsr  excluded_clientunsupported_clientss               rv  _get_requested_clientsz YoutubeIE._get_requested_clients  s*   ""c"cT=O=Y=`=`=b=b"c"c"ccc-B 'D))151F '--5I '--&	 	 !II"3IIIDDdT T T --o>> 
	1 
	1F""!((99995!((9999""3'' 1 ''qrr
3333..##$MF$M$M$MNNNN!((0000! 	X%5 	X?dNj;j;jG &G G G SW	   X X X ! 	6$$_555/ 	: 	:O"333!((999  	Y !HSWXXXX  		1!!.11 6T5F5Fs5K5K 6Q\duQuQu!((555# #%6# # # . 1 1##$c$c$c$cos#ttt!((0000+,,,rx  c                 6    t          |d          x}|k    r|S d S )N)r  r  r  )r  prr  pr_ids       rv  _invalid_player_responsez"YoutubeIE._invalid_player_response  s-     ""&ABBBExOOL POrx  c                 R  # d }|r"|                      | j        || d|d          }g }g }	|r1|                     ||          s|                    i |dd i           t	                    #d d d         #fd}
d}d x}x}}i }rd}t                                                    \  }}}||k    r|ni }d|                     d          vr||k    r|                     ||          p|}|p| 	                    |||	          }| 
                    |                              d
          }d|                     d          v rd}d }|s|s|r|                     |          }d}d }||k    rd|                     d          vr|}|p|                     |||          }|p|                     |||          }|||| j        r|nd |r|nd ||                     ||          |p| 
                    |          d}| 
                    |          d         }|rd n( | j        d-dt$          j        i|d|j        p|j        i}t-          j        | j        fdt$          j        i|}t-          j        | j        fdt$          j        i|}	 |p|                     |||p|||||||	  	        }n-# t6          $ r }|                     |           Y d }~Nd }~ww xY w|                     ||          x}r|||<   n$|r!t;          |p| 
                    |          d          }|                    di           }||t>          <   ||t@          <   tC          |          |tD          <   ||tF          <   ||tH          <   ||tJ          <   | &                    |||          |tN          <   t;          |ddtP          hf          D ]7} || t>          <   || t@          <   || tJ          <   tC          |          | tD          <   8|r|	                    |           n|                    |           |dk    r[| )                    |          rF|rDd|v r@tU          d | j+        j,        -                                D                       r |
d           | .                    |          r|dk    r |
d|            | .                    |          r(| j        s!| /                    | d| j0         d           |dk    o| )                    |          }!| j        r<| .                    |          s|!r%| /                    | dd            |
d           t;          |d d!tb          hf          }"|"d"vr| 2                    | d#| d$|"            |3                    |	           |rx|                     d%d&4                    |           d'd&4                    t	          |-                                                     d(| d)           |st7          d*d+          n|st7          d,          ||fS ).Nz client initial player responseFr  streamingDatar  c                      | D ]Q}t          |          d         }|t          v r1|vr-                    |                               |            dS RdS )z? Append the first client name that exists but not already used r   N)r   r   r0  rI  )client_namesclient_nameactual_clientall_clientsclientss      rv  append_clientz:YoutubeIE._extract_player_responses.<locals>.append_client  sq    +   7 D DQ G $555$K77{333#666 rx  r  r  r  REQUIRE_JS_PLAYERjsTr  webpage_skip)r  rh  r  r  r  r2  r  r[  PLAYER_PO_TOKEN_POLICYr  r  )r  r  r  r  rh  r  r  r  r  adaptiveFormats.rT   zmade for kidsc              3   >   K   | ]}|                                 V  d S r  r  ra  s     rv  r  z6YoutubeIE._extract_player_responses.<locals>.<genexpr>5  s,      XXQ((XXXXXXrx  web_embeddedzweb_embedded.zT: This video is age-restricted; some formats may be missing without authentication. r  zm: This video is age-restricted and YouTube is requiring account age-verification; some formats may be missingrX   r  r  )OKLIVE_STREAM_OFFLINEAGE_CHECK_REQUIREDAGE_VERIFICATION_REQUIRED: z% player response playability status: zSkipping player responses from r  z* clients (got player responses for video "z" instead of "z")zLAll player responses are invalid. Your IP is likely being blocked by Youtuberp  z%Failed to extract any player responserr  )5_search_json_YT_INITIAL_PLAYER_RESPONSE_REr>  r0  rv  r   r  r  _download_ytcfgr'  _get_default_ytcfgr|  r.  r{  _extract_data_sync_idr  r  r  r
   r  r  recommendedr  r  r  SUBSr  r   r  r2   
setdefaultSTREAMING_DATA_CLIENT_NAME!STREAMING_DATA_FETCH_GVS_PO_TOKENr  $STREAMING_DATA_PLAYER_TOKEN_PROVIDED STREAMING_DATA_INNERTUBE_CONTEXT"STREAMING_DATA_FETCH_SUBS_PO_TOKEN$STREAMING_DATA_IS_PREMIUM_SUBSCRIBER_get_available_at_timestamp%STREAMING_DATA_AVAILABLE_AT_TIMESTAMPr  r  r  r  r'  r(  r  r  _youtube_login_hintr%  r  r.  r  )$r  rF  r  r2  webpage_clientr  r2  r  r  deprioritized_prsrG  tried_iframe_fallbackr  rh  r  skipped_clientsdeprioritize_prr  base_clientr  r  require_js_playerr<  fetch_po_token_argsplayer_pot_policyplayer_po_tokenfetch_gvs_po_token_funcfetch_subs_po_token_funcr  r=  r  sdr  embedding_is_disabledr  rE  s$    `                                 @rv  _extract_player_responsesz#YoutubeIE._extract_player_responses  s   
 	[**3W!BBBHTY + [ [J  	>d;;JQQ 	>
 JJ<*<ot<<==='ll$$B$-	 	 	 	 	 	 !&377
7\L r	g#O+B7;;==+Q+Q(FK,2n,D,D=="L 7 7 F FFF6UcKcKc#33FHEEU#mt'?'?|el'?'m'mJ $ 7 7 ? ? C CDW X Xt..}====$)!!
 -&; -@Q -!66x@@
(,%B'',=TE\E\]kElEl,l,l'n4+E+EmU_am+n+nL'n4+E+EmU_am+n+nL ! ,$040E O4,=Gjj4"!%!<!<]L!Y!Y%H)@)@)H)H	# 	# 6:5L5LV5T5TUm5n&( Vdd.Ad.A /V /V'./V2E/V /V*3T7H7T/V /V /VO '0&7#'Y 'Y-<-@'YDW'Y 'Y# (1'8#(Z (Z-<-A(ZEX(Z (Z$ .488H"."?-!-))!-!-, 9 . . "   ##A&&& 55b(CCCu #*/'' #$01`AXAXY_A`A`bu$v$v!]]?B7717-.8O45;?;P;P787H349Q56;P78<@<\<\]_aikq<r<r89%b+I3QUPV*WXX T TA4:A01;RA78>SA:;>B?>S>SA:;;" #%,,R0000JJrNNN ,&&4+>+>r+B+B& ' /7 : :XX$2D2N2U2U2W2WXXXXX !; n---   $$ =N)B)B;k;;<<<  $$ [T-B [ J J/3/GJ JUY  [ [ [ %,~$=$Y$BUBUVXBYBY!$ -$*;*;B*?*? -CX - L L LW[  ] ] ] m,,,!"':Hse&LMMFmmm  H!e!e!e!e]c!e!efffe  r	gh 	

$%%% 	Jx#((?2K2K x x47HHSAWAWAYAY=Z=Z4[4[x xksx x xy y y  s$bmqs s s ss  	J !HIIIJs   "J3 3
K=KKc                 `    |dk    r|                      d          s|dk    r
|pddk    r|S d S d S )Nr  live_from_start	post_liver   i   )r}  )r  rp   rj   s      rv  _needs_live_processingz YoutubeIE._needs_live_processing]  sL    I%%$..9J*K*K%;..HMX3M3M /.3M3Mrx  c           	          | d| d| d| dt            	}|g | j        | j        R v r|                     |d           d S |                     |d           d S )NrT   client z formats require a GVS PO Token which was not provided. They will be skipped as they may yield HTTP Error 403. You can manually pass a GVS PO Token for this client with --extractor-args "youtube:po_token=z+.gvs+XXX". For more information, refer to  Tr  )PO_TOKEN_GUIDE_URLr,  r*  r  r  )r  r  rC  protomsgs        rv  _report_pot_format_skippedz$YoutubeIE._report_pot_format_skippedb  s     D D; D D D DlwD D 0BD D 	 QD1QD4PQQQQSD11111t44444rx  c                 N   |p| d| d| dt            }t          |                     d          |                     d          |                     d          f          }|r|g | j        | j        R v r|                     |d           d S |                     |d           d S )	Nz: Some z client subtitles require a PO Token which was not provided. They will be discarded since they are not downloadable as-is. You can manually pass a Subtitles PO Token for this client with --extractor-args "youtube:po_token=z-.subs+XXX" . For more information, refer to  writesubtitleswriteautomaticsublistsubtitlesTr  )r{  r  r}  r,  r*  r  r  )r  r  rC  r}  subs_wanteds        rv  _report_pot_subtitles_skippedz'YoutubeIE._report_pot_subtitles_skippedo  s     E D D D D 3>D D 0B	D D 	 NN+,,NN.//NN?++- . .  	5k-dt/D-dtGc-d-dddSD11111t44444rx  c              #      #$%&'()*+,-./0123456789:;<=>?K   d#d%d$%d $d i4t          j        t                    g c3>i dd ic29i }t          g d          8d                     d          v ;                     d          +d	+v &                     d
          rd& j                            d           d 1d =#fd(d .i /$%4fd, fd}t                      5t                      :5: fd<t          |ddt          hf          D ]}t          |ddt          hf          D ]}	|		                    d          }
d }|
s[t          j                            |		                    d                    }t          |ddt          hf          }
t          |d          }|r":                    t          |                     t          |
t          hddf          x}r5                    |           ˉ5                    t          |d|hf                     |D ]}t          |d          }|s|t"                   *|t$                   0|t&                   6|	                    t(                    )|t*                   't          |d          ?d -d@&),289 f	d	7#&'()*+,-./01367 ;<=>?fd } |            E d {V                                 }d!+v}t                               d"                    }|d#k    s|r|r|                    d$           |r!d#k    r|d#k    r|                    d%           $%&'23489 fd&}d$|vo|	                    d'          }|rt          j                            |          j        }t3          j        d(|          x}r|                    d)d*          \  }}nd+}d} ||          }|rE;sC <                                  d|          }|r |                    d,| d,|           }||v }                     )          d-         t>          j                  } .|06          }/	                    ) *|p|j!        .                    }|r$|"                    d/          d0| z   })/vr|/)<   |r1|s/d1                     d          vr #                    )d$           n|s|stI          || | 2          } %                    |d3dd#k    4          \  }}t          |ddt          hf          D ]})|t(          <    &                    ||          }|D ]5}  || d$) '                    d5| d         d6d 7          |o|           r| V  6d%|vo|	                    d8          }!|!r	t          j                            |!          j        }d} ||!          }|rE;sC <                                  d|          }|r |                    d,| d,|           }||v }                     )          d-         t>          j(                 } .|06          }/	                    ) *|p|j!        .                    }|r$|"                    d/          d0| z   })/vr|/)<   |r2|s0d1                     d          vr #                    )d%           |s|stI          |!|2          }! )                    |!d9          \  }"}t          |ddt          hf          D ]})|t(          <    &                    ||          }|"D ]i}  || d%)| d:         |o|           rOtU           '                    d;| 	                    d<          p| d         d=d 7                    | d><   |rd| d?<   | V  j|V  d S )ANi   rk   r!  r   )tinyaudio_quality_ultralowaudio_quality_lowaudio_quality_mediumaudio_quality_highsmallmediumlargehd720hd1080hd1440hd2160hd2880highresrI  r  r  	duplicateinclude_duplicate_formatsTzv[youtube] include_duplicate_formats extractor argument is deprecated. Use formats=duplicate extractor argument insteadc           
      ^    dt          | t          hddt          j        j        hddf          v S )N1xtags.sr)r2   r*   r5  r6  )f_urls    rv  is_super_resolutionzEYoutubeIE._extract_formats_and_subtitles.<locals>.is_super_resolution  s0    ,uz7C&,J_I`bfhk.lmmmmrx  c                 F     d                      fd|D                       S )Nr   c              3   (   K   | ]}|         V  d S r  rr  )rs  iss     rv  r  zNYoutubeIE._extract_formats_and_subtitles.<locals>.solve_sig.<locals>.<genexpr>  s'      ..A1Q4......rx  )r  )r  specs   ` rv  	solve_sigz;YoutubeIE._extract_formats_and_subtitles.<locals>.solve_sig  s*    77..........rx  c                 h     t           fdt          d d                   D                       S )Nc              3      K   | ]=}d t          d          d| dt          |z   dz
  d                    i          iV  >dS )r}   r  r<  r   filesizeN)r9   rM  )rs  range_start
CHUNK_SIZEr  s     rv  r  zTYoutubeIE._extract_formats_and_subtitles.<locals>.build_fragments.<locals>.<genexpr>  s       F F  '%``c+
2JQ2NPQR\P].^.^``3   F F F F F Frx  r   r  )r   r  )r  r  s   `rv  build_fragmentszAYoutubeIE._extract_formats_and_subtitles.<locals>.build_fragments  s^     F F F F F "'q!J-!D!D	F F F F F Frx  c                 8    | j         o| j        o| o	| j        o| S r  )r  not_required_with_player_tokennot_required_for_premium)policyr2  has_player_tokens      rv  gvs_pot_requiredzBYoutubeIE._extract_formats_and_subtitles.<locals>.gvs_pot_required  s7     T>SCSTT8R=RSUrx  c                    |                      d          pi }|                     d          pd}|                     dd                              d          d         pd }d|                                v rt          |d          d	fS d
|                                v r |r                               s|<   |fS |                     d          r |r                               s|<   |fS |dfS )N
audioTrackr  r   rZ   r  r   descriptivedescoriginalaudioIsDefaultr  )r|  r	  r"  r#   )
fmt_streamaudio_trackdisplay_namelanguage_codeDEFAULT_LANG_VALUEORIGINAL_LANG_VALUElanguage_maps       rv   get_language_code_and_preferencezRYoutubeIE._extract_formats_and_subtitles.<locals>.get_language_code_and_preference  s+   $..66<"K&??=99?RL'OOD"55;;C@@CKtM 2 2 4 444$]F;;S@@\//1111  F)9)9:M)N)N F8EL!45$&999/00 9  E)9)9:L)M)M E7DL!34$&888 "$$rx  c                     t          |           sd S                     dt          j                            |           j        dd           S )Nz/n/([^/]+)/zn challenger^  )r:   r+  r5  r6  r7  r  )r  r  s    rv  get_manifest_n_challengezJYoutubeIE._extract_formats_and_subtitles.<locals>.get_manifest_n_challenge  sR    |,, t%% 5 5l C C Ht & - - -rx  c                     g } rK|                      t          t          j        t	          t                    	                               
rt                      }
D ]0}                    d	|d          r|                    |           1
	                    |           |                      t          t          j
        t          d 
D             	                               | r~j                            |           D ]\  }}|j        t          j
        k    rq|j        j                                        D ]Q\  }}t%          |          }                    d |D             d	|d           |
v r
                    |           R|j        t          j        k    rU|j        j                                        D ]6\  }}                    |d	|           |v r                    |           7d	t*           }
r                    d
| d           r                    d| d           
                                                                  d S d S )N)
challengesr  )typer  inputsigfuncsTrH  c           
      x    g | ]7}d                      t          t          t          |                              8S )r   )r  rM  chrr  )rs  spec_ids     rv  r  zYYoutubeIE._extract_formats_and_subtitles.<locals>.solve_js_challenges.<locals>.<listcomp>  s4    #b#b#b'BGGCU7^^,D,D$E$E#b#b#brx  c                 ,    g | ]}t          |          S rr  )ord)rs  r  s     rv  r  zYYoutubeIE._extract_formats_and_subtitles.<locals>.solve_js_challenges.<locals>.<listcomp>  s     8 8 8AQ 8 8 8rx  nzEnsure you have a supported JavaScript runtime and challenge solver script distribution installed. Review any warnings presented before this message. For more details, refer to  z7Signature solving failed: Some formats may be missing. ru  z9n challenge solving failed: Some formats may be missing. )r0  r   r   Nr   rz  rv  rT  rI  difference_updateSIGr   r  
bulk_solver  outputresultsr9  rl  rW  r1  r   r  clear)challenge_requestscached_sigfuncsr  _challenge_requestchallenge_response	challengeresulthelp_messagen_challengesr  s_challengesr  r  s           rv  solve_js_challengeszEYoutubeIE._extract_formats_and_subtitles.<locals>.solve_js_challenges  s8   !# b"))*<(*%)T,5G5GT^___+a +a +a b b b  1"%%%+ 5 5G88ZQXim8nn 5'++G444..???"))*<(,%+#b#bUa#b#b#b#-/ / /+0 +0 +0 1 1 1 " #%>B>P>[>[\n>o>o ? ?:&(:)./2EEE1C1J1R1X1X1Z1Z = =-Iv&))nnG << 8 8 8 8 8* *GD = J J J  ',66 , 3 3G < < <= ,0O4EEE1C1J1R1X1X1Z1Z ? ?-Iv <<VS*V_```(L88 , 3 3I > > >
C 4AC C 
   ;''`R^``!)T ( ; ; ;   ;''bT`bb!)T ( ; ; ;
 ""$$$""$$$$$G#% #%rx  .r@  rL  r}   signatureCipherr  r   r  )hlsManifestUrldashManifestUrl)rL  .c                     t          |                     d                    t          | dd          |                     d          fS )Nitagr  rZ   isDrc)r/   r|  r2   )r  s    rv  get_stream_idz?YoutubeIE._extract_formats_and_subtitles.<locals>.get_stream_id)  sS    ":>>&#9#9::LUacg<h<hjtjxjx  zA  kB  kB  B  Brx  Fc                 	  	 t          |                     d                    }|                     d          pi }|                     d          }t          |                     d                    }|dk    s|s*|                     dd                                          p|}|dk    rd}|r|r||<   |r||<    |           \  }}	t	          |                     d	                    }
|
r8d
 d| d}dk    r|j        rdnd dz  }                    |d           t          |                     d          p|                     d          d          }t          | dt          d          hf          t          fd          }|r                    d
 d| dd           |r0d
                    d          vr                    |           d S |                     d          p|                    dd          pd}t          |                     d                    pd}i d t          |                     d!                    d"t          |                     d#                    d$t          ||                     d%          rd&n|rd'nd           d(t          t          |                    d)          |                    d*          od+d,-          ||                     d%          od.|od/t          | d0           t          | d1           |od2|od3                    d4          sot!                    d5-
  
        d6|d7k    rd8nd9d:|v rd;ndz   d|d<k    r|nd d=|                     d>          d|d |          t	          |                     d%                    d?z  z
  d@|
dA|dBt#          |          dCt          |                     dC                    dD|dE|	dF|rdGn	|dk    rdHnd }t%          j        dI|                     dJ          pd          }|rZt)          |                    d<                    |dK<   |                    t/          |                    d?                               dL|                    dM          |                    dN          fv }|r#|                    dK          r|dK         dOz   |dP<   |S )QNr  r  qualityheightr  audioQualityr   r  drmFamilieszSome rz  z6 formats have been skipped as they are DRM protected. rh  Your accountThe current sessionz may have an experiment that applies DRM to all videos on the tv client. See  https://github.com/yt-dlp/yt-dlp/issues/12563  for more details.Tr  averageBitratebitrater  approxDurationMsr  c                       dz  k     S )Nr  rr  )rj   format_durations   rv  r  zYYoutubeIE._extract_formats_and_subtitles.<locals>.process_format_stream.<locals>.<lambda>Q  s    oA.M rx  z9 formats are possibly damaged. They will be deprioritizedmissing_potr  qualityLabelaudio_quality_fpsr   asraudioSampleRater  contentLengthr  r  drcr  format_noter  r  	(default)r  r  DRCzAI-upscaledc                 ^    | d                              dd                                          S )NprojectionTypeRECTANGULARr   r3  r"  r  s    rv  r  zYYoutubeIE._extract_formats_and_subtitles.<locals>.process_format_stream.<locals>.<lambda>f  s*    a8H6I6Q6QR_ac6d6d6j6j6l6l rx  c                 ^    | d                              dd                                          S )NspatialAudioTypeSPATIAL_AUDIO_TYPE_r   r  r  s    rv  r  zYYoutubeIE._extract_formats_and_subtitles.<locals>.process_format_stream.<locals>.<lambda>g  s*    a8J6K6S6STikm6n6n6t6t6v6v rx  DAMAGEDMISSING POTverboser  source_preference22r  Premiumd   r   audio_channelsaudioChannelsr  has_drmtbrfilesize_approxwidthlanguagelanguage_preference
preferencer  z.((?:[^/]+)/(?:[^;]+))(?:;\s*codecs="([^"]+)")?mimeTyper\   noneacodecvcodec_dash	container)r/   r|  r"   r"  r  r  r  r   r2   r3   r  r~  r3  r#   r4   r}  r   r   r  matchr$   r  rx  r&   )r  r|  r  super_resolutionr  r  r  r  r  r  r  r}  r  
is_damagedrP  r  dct	mime_mobjsingle_streamr  all_formatsrC  rj   r  itag_qualitiesqres_qualitiesr  r  s                      @rv  process_format_streamzGYoutubeIE._extract_formats_and_subtitles.<locals>.process_format_stream,  s   ":>>&#9#9::(nn\::@b$..33$Z^^H%=%=>>f$$G$(nn^R@@FFHHSGG 4<<$G 8 7/6t, 807f-5U5UV`5a5a22z~~m<<== Gt+ttutttC"d**151Fa~~La e e e
 ''X'FFF#JNN3C$D$D$a
W`HaHacghh".z<NQ^eiQjQjQjPk;l"m"m
 &&M&M&M&M&MNN
 Q''uuuUuuuw  LP ( Q Q Q   =8O8OPY8Z8Z#Z#Z33Hk5QQQ4!~~n55dIY[]9^9^dbd!*.."7"788=A;z~~6G'H'HIIJNN?,K,K L L  t!+!8!8 "%5 "TT!"$ "$ "=%koom&D&DkooVfFgFgFwlw  @C  D  D  DjnnW55?%AQAcVc
,l,lmm
,v,vww"0y+2O-	22AkeGXYdGeGe"$$ $$ $$  ("""PY]aPaPagh)i!" #''33t#$ %jnn_&E&E%& f'( qqzzD1H1H,I,IA,MM)* w+, 3-. &'8o'N'N/0 [)@)@AA12 34 *+>58 !"U##tt||QU9< HEz~~V`GaGaGgegi i	 A!-iooa.@.@!A!ACJJJ|IOOA,>,>??@@@ &3778+<+<cggh>O>O*P P  <SWWU^^ <'*5zG';C$
rx  c            	   3     K   d} g }(D ]i}|                     d          r|                     d          dk    r#t          |                     d                    sU |          }s|'v rg#                              d         t          j                 }|d         dvo |           }                               p |p|j        	          }|r	vr|<   |                     d
          }d\  }}	|s |           t          j                            |                     d                    }	t          |	d
dt          hf          }t          |	d          }t          |	|$p!|f          ssd}
dv r0#                    |
                    ) dd          d           n;d#j        rdnd }#                    |
                    d|          )d            "|| |o|  |                    }|s|rk$r %             #                    d!t#          |          d          }|s?|d                    t          |	d          pd &||                    z  }t          |          }|                     d          rI$r|d         d         } %             #                    d!|          }|st%          |d|i          }|rt%          |d|i          }||d
<   |d         rK|d                                      | |                     d           f           '                    |           d!vr|d"<   |                    |           k|D ]I}sd#v r0|d$         r(i |r|d%          d&n|d%         d' |          d(V  sd#vrd)i|d*<   |V  Jd S )+NhttpstargetDurationSecr  FORMAT_STREAM_TYPE_OTFr  GVS_PO_TOKEN_POLICYr   )18r  r}   r  r  r  z{}Some {} client https formats have been skipped as they are missing a URL. {}. See  https://github.com/yt-dlp/yt-dlp/issues/12482  for more details)rU   rV   rT  z1YouTube is forcing SABR streaming for this clientTr  z@YouTube may have enabled the SABR-only streaming experiment for zyour accountzthe current sessionr   )r  r  r  rH  z&{}={})spr  	signaturer  potr  r  rw  available_atdashyr  r  z-dashyhttp_dash_segments)r  r  r  http_chunk_sizedownloader_options)r|  r  rX  r   HTTPSrZ  r5  r6  r*   r2   r:   r"  r  r   r  r  rT  rl  r9   rI  r0  )*r|  
https_fmtsr  	stream_id
pot_policyrequire_po_tokenr  fmt_urlencrypted_sigscmsg_tmplr}  fmtr  ru  n_challengen_resultr  r  r/  r  rC  fetch_po_token_funcformat_typesr  r  r  gvs_potsr2  r  itagsrp   player_token_providedr  r#  r  skip_player_jsr  r  
stream_idsstreaming_formatsr  s*                    rv  process_https_formatszGYoutubeIE._extract_formats_and_subtitles.<locals>.process_https_formats  sa     
"3 `+ `+J!~~&9:: ! 
 "~~f--1IIIRVWaWeWefsWtWtRuRuI  -j 9 9I& %$
22$373J3J;3W3WXm3n  pA  pG  4HJ "!F2 g,,Z9NPeff %
 ![11 d..8H8bJLbccc    =&h664<H[1(nnU33G(2%M2" % 98DDD#\22:>>BS3T3TUU".rE1{m3L"M"M(4R(B(B"B1M:}#]^^ %!k %  +.CCC $ 0 0'/OOO[$W2Y 2Ydh !1 !j !j !j !j
%l9=9N'i~~Ti%l %l !$ !% 3 3HOOBUX4Y4Y[cos 3 t t t$//"E7G7XPXL)<)<W)E)EG G GC  !  % 
<) %$++---#@@&
C4F4FW[  A  ]  ]# %$8??(Z88GK%ImT::$< $< <
 %W--Eyy~~ M) %$&+Cjm++---#'#D#DS*Va#b#b' %$"27S(O"L"L O"27UH<M"N"N!(CJ | 5il+//
8K8K0LMMM")))444 #*BBB.:N+%%c****% 
" 
"C# w,'>'>C
O'>!HS)iC,<)D)D)D)DY\]hYi(<)8)=)=	      # "g\&A&A5F
4S01!			
" 
"rx  
incompleter   r  hlsdashc                                           d          f}	s||         v rdS dvr
 d<                         d          d d<   |dk    rdk    rd	k    r dxx         d
z  cc<   |r8t                                d          dd           d<    dxx         dz  cc<   |                             |           |r	r| d  d<   n3t          fd|         D                       r| d  d<   n|r| d<                         d          }|r:|         k    r.t                                d          dd           d<    d<   n;|r9|         k    r-t                                d          dd           d<    d<   |dv r8t                                d          dd           d<    dxx         dz  cc<                         t	           d           d                     d<    d         dk    r;                      d          r& t           fd                              d<                       d          s	r5t                                d          t          |          d           d<                         d           r d          d
k    r d = dk    r*                      d!          rd" d!<    dxx         d#z  cc<   d$S )%Nr  Fr.  r/  r  r  rV   rJ  r  r   r  r  r  r     r<  r  c              3   *   K   | ]\  }}|k    V  d S r  rr  )rs  rb  r  r|  s      rv  r  z\YoutubeIE._extract_formats_and_subtitles.<locals>.process_manifest_format.<locals>.<genexpr>  s+      <<1e<<<<<<rx  z
(original)r  r  )616235r  r  c                 D    | d                              d          d         S )Nr  r<  r   )r	  )r  s    rv  r  z[YoutubeIE._extract_formats_and_subtitles.<locals>.process_manifest_format.<locals>.<lambda>.  s    ;I]I]^aIbIbcdIe rx  r  r  c                 4    t          | d         z
            S )Nr  )abs)r  r  s    rv  r  z[YoutubeIE._extract_formats_and_subtitles.<locals>.process_manifest_format.<locals>.<lambda>0  s    TWXY\]^f\gXgThTh rx  )r~  r  r  r  r  mayber!  T)r|  r#   rI  r  r4   rM  r}  r   )r  r|  rC  r  r  r~  	lang_coder  r  r  r/  r   rC  r  rp   r!  r"  r  s   ``     rv  process_manifest_formatzIYoutubeIE._extract_formats_and_subtitles.<locals>.process_manifest_format  s   aeeJ//0" !seDk'9'9 5 &>>>(4An%55,--5-/A)* ,..5E>>kU^F^F^)***a/*** 1'4QUU=5I5I=`c'd'd'dAm$)***b0***d$$$ *K *(,%6%6u%6%6AkNN<<<<d<<<<< *(,%6%6u%6%6AkNN *%)AkNEE*--	 Bl;N.O!O!O'4QUU=5I5I<_b'c'c'cAm$/BA+,, B9=O0P#P#P'4QUU=5I5I;^a'b'b'bAm$/AA+,>))'4QUU=5I5I9\_'`'`'`Am$)***c1*** q!3!3GA?e?e4f4fhj!k!kll)Y<2%%!%%//%#$1]3}JhJhJhJh3i3i3i%j#k#kAiL>>),, Z Z'4m,,.?.L.LTX(Z (Z (ZAm$55<< !AeHMM%E>>aeeI&6&6>#*AiL)***a/***trx  r  z6(?P<path>.+)(?P<suffix>/(?:file|playlist)/index\.m3u8)r  suffixr   z/n/r(  r*  r  z/pot/r  )r  r]   )r  livez/itag/(\d+)r  r^  r  r  r  z/clen/(\d+)r  z	file sizer  r  F)+collectionsdefaultdictrv  r+   r  r  deprecated_featurer2   r  r|  r5  r6  r*   r:   rI  rl  rx  r^  rb  r_  r]  rd  rx  r7  r  r  r  r  rT  r3  rX  r   HLSrZ  rstripr~  r8   #_extract_m3u8_formats_and_subtitles_merge_subtitlesr+  DASHr  r"   )@r  r  r|  r  rp   rj   	subtitlesr  streaming_datar  r9  s_challenger;  r>  r<  rH  needs_live_processingskip_bad_formatsskip_manifestsrV  hls_manifest_urlmanifest_pathr  manifest_suffixsolved_nr?  r7  r8  r  r  subsr=  r  dash_manifest_urlr  r  r  r  r  r/  r  rC  r@  rA  r  r  r  rB  r2  r  r   rC  r  r  rD  r#  r!  r"  r  rE  r  r  rF  rG  s@   `` ```                             @@@@@@@@@@@@@@@@@@@@@@@@@@@@@rv  _extract_formats_and_subtitlesz(YoutubeIE._extract_formats_and_subtitles  s     
 
 (3C88"z(*QI%	 
 
 
   !8!8!G!GG..y99!\1""#>?? 	dK// 1c d d d	n 	n 	n	/ 	/ 	/	F 	F 	F 	F 	F	U 	U 	U 	% 	% 	% 	% 	% 	% 	% 	- 	- 	- 	- 	- uuuu9	% 9	% 9	% 9	% 9	% 9	% 9	% 9	% 9	%x ++;c?UYTZ=[\\ 	f 	fN*><Z\_bfag;hii 2 2
$..//" =..z~~>O/P/PQQB*2q;-/HIIG".r8"<"<K 7 $$S%5%5666".w(S!8L"M"MM; 2 $$[111 !FIaHb c!e !e f f f f # n	$ n	$B)"o>>N! "01R"S$23W$X!$23W$X!(,,-GHHK)*OPL ,^=b c cB B BX X X X X X X X X X X X X Xtp" p" p" p" p" p" p" p" p" p" p" p" p" p" p" p" p" p" p" p" p" p" p" p" p" p" p" p" p"d -,.........$($?$?X$V$V!+<? !8!8!@!@AAN%22- 32B 3""5))) +K9$<$<AVZcAcAc""6***5 5 5 5 5 5 5 5 5 5 5 5 5 5 5n  %N:c~?Q?QRb?c?c '$ & 5 56F G G L%^`mnnn1 )56WWVX5N5N2M??&(O 667GHH =~ ='')))#@@jR]^^H =(5(=(=>QK>Q>QScYaScSc(d(d#+}#</3/F/F0! 0!!6088I8M0O
#3#3J@UWl#m#m #<<5H5HRbR|fpf|5}5}5}~~ 9$1$8$8$=$=@R@R@R$RM"(2208-# $H $dNeNefoNpNp9p9p33Hk5QQQQ $[ $'12BMIl[jIlIl'm'm'm$!%!I!I((E[\eMe "J "g "gJD$+D3dV2DEE F F ;F677 $ 5 5dI F FI! $ $221e[$J\J\ .%&$ K] KP KPQaQrjrfrt t $"#GGG &n < fASASTeAfAf  %$ & 5 56G H H M 667HII =~ ='')))#@@jR]^^H =(5(=(=>QK>Q>QScYaScSc(d(d#+}#</3/F/F0! 0!!6088I8N0P
#3#3J@UWl#m#m #<<5H5HRbR|fpf|5}5}5}~~ 9$1$8$8$=$=@R@R@R$RM"(2208-# $H $dNeNefoNpNp9p9p33Hk6RRRR $[ $(23D=(Y(Y(Y%$($K$KL]_got$K$u$uMGT+D3dV2DEE F F ;F677 $ 5 5dI F FI$ $ $221fk1[>[k[|t|p|}} $,78J8J .6I0J0J0VaPUhXcmq 9K 9s 9s -t -tAjM4 :59/ 2"#GGGrx  c              #     K   t          |dd                              d          d d d         }t          t          d|                                pd                     }|sd S t          |          dz
  }t          |          D ]K\  }}|                    d          }t          t          t          |d d	                             }t          |          d
k    st          |          s=|                     d| dd                    |           t                                  |\  }	}
}}}|dd          \  }}|                    dt          ||z
                                          d|          d| z   |||z  z  }|z  d| ddddd|	|
|z  ||fdt!          t#          j        |                    D             dV  Md S )N)storyboardsplayerStoryboardSpecRendererr  r   r^  rJ   r  zhttps://i.ytimg.com/r   #r!     zMalformed storyboard rT  r  z$Lz$Nz&sigh=sb
storyboardr
  r  c           	          g | ]<}                     d t          |                    t          |z  z
            d=S )z$M)r}   rj   )r3  r%  rM  )rs  jrj   fragment_durationr}   s     rv  r  z1YoutubeIE._extract_storyboard.<locals>.<listcomp>  sb     = = =  ;;tSVV44 #$5x1GXCX7Y Z Z  = = =rx  )r  r  r\   r  r  r  r}   r  r  r  rowscolumnsr  )r!   r	  r:   r;   r  rl  rv  rz  rM  r"   r"  r  r  r   r3  r%  r  mathceil)r  r|  rj   r  base_urlLr  r  countsr  r  frame_countcolsry  r  sighr  rx  r}   s     `              @@rv  _extract_storyboardzYoutubeIE._extract_storyboard  s9     U_ac c cchchilcmcmnrnrprnrtw'=txxzz?QTRRSS 	FIIM  	 	GAt::c??D#k484455F4yyA~~S[[~##$hA$h$h$$hQdQfQf$h$hiii5;2E6;d122hGAt""4QU44<<T1EEQUWC(D4K8N (> 9%!XX+#   "X-= = = = = = !>!:!:;;= = =     	 	rx  c                 Z   d }|rd|                      d          vrddd}|                      dd gd          d	         pt          t          |d
t          hf          }|r||d<   |                     |||t          |                     |          ddddt          hfi                    }|S )Nr2  r  
9999999999r  )bpctrhas_verifiedr  Tr  r   r  ppz
User-Agentr  r  	userAgent)ru  r  )r  r2   r   r%  r*  rX  )r  r  rf  r  r2  ru  r  s          rv  _download_initial_webpagez#YoutubeIE._download_initial_webpage  s     	9D,C,CM,R,RRR*C@@E''$4'PPQRS ] 1NOVYUZ3[\\   ! d99XU$T%<%<^%L%L #6+PSu"UO   :  G
 rx  c                    t          j                     }d}t          |dd dddddd	d
t          hf
          D ]}t          |dt          j        j        hddt          hf          }|dnd| d}t          |dt          d          hf          }	|	!|	dz  r|	nt          |	          }	|d|	 dz  }|	}|"| 	                    | d| d|            ||z  }|rt          j        |          |z   S t          |          S )Nr   adSlotsc                 2    |d         d         d         dk    S )NadSlotRendereradSlotMetadatatriggerEvent!SLOT_TRIGGER_EVENT_BEFORE_CONTENTrr  r  s     rv  r  z7YoutubeIE._get_available_at_timestamp.<locals>.<lambda>  s$    A&6$78H$I.$Y  ^A  %A rx  r  fulfillmentContentfulfilledLayoutplayerBytesAdLayoutRendererrenderingContent)N)#playerBytesSequentialLayoutRenderersequentialLayouts.r  r  instreamVideoAdRenderer
playerVarslength_secondsr  zan adza zs adskipOffsetMillisecondsr  r  r   z skippable after r  z: Detected z for )r  r2   r  r5  r6  r*   r"   r   r  r  r{  r|  )
r  r  r  r  nowwait_secondsr  rj   ad	skip_times
             rv  rc  z%YoutubeIE._get_available_at_timestamp  sa   ikk$_  A  A24EGdfx { )4&7
   	) 	)H $H|fl>S=TVfhjmxly.z{{H$,2Ex2E2E2EB$X0H=_cKdKdKdJe/fggI$)2QJIIC	NN	6)6666$#  H!J!J!J!J&!J!JKKK( 	19S>>L003xxrx  c                    t          |d          }t          |d          }|t          |d          }t          |d          }	t          |d          }
t          |d          }|rdn|rdn|
rd	n|	rd
n	d||	fv rdnd }|                     |||||          ^ }}t          d |D                       r
|D ]}d|d<   ||||fS )N).liveBroadcastDetailsisLive	isLiveNowisLiveContent
isUpcomingisPostLiveDvrrw  r  is_upcomingr   Frq   c              3   @   K   | ]}|                     d           V  dS )r  Nr  r  s     rv  r  z*YoutubeIE._list_formats.<locals>.<genexpr>  s.      11AquuY111111rx  Tr  )r2   r!   rn  r"  )r  r  r  r  r|  r  rj   live_broadcast_detailsr  live_contentr  rw  rp   r  rb  r  s                   rv  r  zYoutubeIE._list_formats  s$   !-l<Y!Z!ZM844? 6DDG @@|<<m_==	&/ !{{)0 !II-8 !MM*6 !JJ*/G\3J*J*JJJ  	 #AA(L\^hjuw  A  A)1111111 	$ $ $#)%{GYFFrx  c           
      |   d }|rVd|                      d          vr?|                     ||d          }t          |d          s|                     d           d }|s_d|                      d          vrHd|i}|                    |                                            |                     |d	d||dd
|          }|S )Ninitial_datarJ  Fr  r  zIIncomplete data received in embedded initial data; re-fetching using API.r  r  r  z!Downloading initial data API JSON)rk  rl  r  r[  ru  rm  r   r  )r  extract_yt_initial_datar2   r  rx  r  r|  )r  r  r2  rf  r  r  ru  s          rv  _download_initial_dataz YoutubeIE._download_initial_data  s     	$~T-D-D^-T-TTT77'QV7WWLj99 $##$oppp# 	Yd6M6Mm6\6\ \ \)ELL113344411 V5#58 2 Y YL rx  c                     | j         r|sdS t          |d          }t          |d          dk    p+d|                     |d          pd                                v S )NF)topbardesktopTopbarRendererlogotopbarLogoRenderer)	iconImageiconTypeYOUTUBE_PREMIUM_LOGOpremiumtooltipTextr   )r  r2   r  r"  )r  r  tlrs      rv  _is_premium_subscriberz YoutubeIE._is_premium_subscriber
  sx    $ 	L 	5[] ] 788<RR OT^^C??E2LLNNN	
rx  c                    |                      |||          }|                     ||          p|                     |          }|                     ||||          }|                     |          }	|	r|                     d           |                     |                     |||	          |||||	          \  }
}||||	|
|fS )Nz%Detected YouTube Premium subscription)r  extract_ytcfgrX  r  r  r  rt  r:  )r  r}   r  r  rf  r  r2  r  r  r2  r|  r  s               rv  r  zYoutubeIE._initial_extract  s    00nhWW**8W==hAXAXYgAhAh228WnVcdd $ ; ;L I I  	FDEEE'+'E'E'']<QRRg~}>S(U (U$* |5JL\^hhhrx  c                 3    t          |i           \  }}                     |                                           dz   }|dz   z   }d}                     ||||          \  }}}}	}
t	          |	dt
                    }t          |dt                    }|r)                     | 	                                |          S r fdnd }t	          |	d	t
                    }t	          |	d
t
                    }t	          |dddddt
          ht          f          }t	          |dddddt          ht          f          }t	          |dddt
          ht          f          pi }t	          |ddddt
          hf          pi }                     |d          p                     |d          }                     |d          } j        r|pt          |d          p|p |g d          }|s|r                     d           |}                     |d          }t          |d          }| j        r|p|n|}||}t          |	dt                    }|r||                    d          sf                     d           r                     d! d"           n6g }g }|                    d#          D ]}t$          j                            t$          j                            |                    fd$} |d%          }|sQ |d          } |}!| r	|!d&|  d'z  }!|                    d(d)t/          d*                    |d%         d+                   dd,i          |!d-           |                    |           ɉ                     d.                    d/                    |                                                    |||          S t7          t          |d0                    p6t7          t          |d0                    pt9           |d1                    pd }"                     |||	|
|"          \  }#}$t	          |	d2          }%d3k    r                      d4           sˉ                     d5          s%t	          |%d6          r                                t          |d7t
                    pi }&                     |&d8          pt          |d8          }'tA                               |&d9          pd:          }(|(rk|(!                    d;          rNt          |d<          })|)s$ |d=          }*|*r|*                    d#          nd }) "                    |(|)d,>           |'d?|( z  }'|'rd@|'#                                v r=tI          |'dA          }'tI          |'%                                dB           d? j&         }'nTt          |dCdDt
          hf          r|'dEz  }'n5dF|'v r1tI          |'%                                dB           d? j'        rdGndH dI}' (                    |'d,J           t          |dKtR                    pg }+|+s4r2dL tU          j+         ,                    dM                    D             }+|+D ]},|,!                    dN          rntU          j-        dO|,          }-|-rWdP |-.                                D             \  }.}/|.d+k    r0|/d+k    r*|.|/z  }0D ] }1|1                    dQ          dRk    r|0|1dS<   ! n /                    ||fdT          }2 |dUdVg          }3|3r|2                    dW|3i           |20                                }4g dX}5tc          |5          }6|22                    fdY|5D                        |2D ]Ctg          fdZti          |5          D             |6          }7d[dW         v rd+nd\d]|7z  z
  d^<   D 5                    |2            j6        7                    |4           t          |d_          p
 |d`          }8 8                    ts          t          |da          pt          |db          p
 |da                              }9t          |dc          }:tu          t          |#dd                    };tu          t          |#de                    }<|"s	|<r|;r|<|;z
  }" ;                    |"          fdf}=ty          |=          D ]G}>|>                    d^          pd\dgz
  |>d^<   t{          |>                    dh          didjk          |>dh<   Hr >                    |;|||dlk               2                     ?                    |	|"                      @                    |:          }?i d%d|dmdn|2dot	          |4dp          dq|dr|9dst          |9d dtd u          d1|"dvt7          t          ||fdw          p
 |dx                    dyt          t          |dz                    d{t          |d|          d}u s |d~          dk    s |d          dk    rdnd+d|d|8r|8gnd d|+dt          |d          dt          |d          rdnt          |d          rdnd|;dddddd                     dg           v rdndQddddf
d}@d  fd}Afd}Bi }Ct                      }D fdt	          |	ddddd f          D             }Ed D                    d          vo*                     dd}          p                     d          }Ft	          |	d           }Gt	          |Gdddddt
          hf          }Hfd|HD             }Ifd|HD             }J|GD ]}K|Kd         d         }L|Kd         t                   }M|Kd         t                   d         d         }N G                    |M          d         }O|Kd         t                   }Pi }Qd}}Rt	          |Ldd f          D ],}S|Sd         }t)          |           |S          }Tt          fddD                       p|OjI        o	|OjJ        o| }U|Rs0d,}R |P|Up|OjK                  x}Vr|QL                    |Vd|Nd           |Qs0|Ur.|DM                    |M            N                    |M            ny                    dd g          d\         }W                     |Sdd          }X|S                    d          dk    }Y|Yr+|Ts	 |A|C||T|X|M|Q           |S                    d          s0|EO                                D ]w\  }Z}[|Zs|Z}\|Yr%|Zdk    r|Fs|Zd|T z  }Z|[t          |Xd d          z  }[|Td|\ k    r! |B|\            |A|$||Z d|[ d|M|Q            |A|$||Z|[|M|W|\k    r|Qnd|Zi|Q           xt          |Td          }T|Ys|Tr|T|$v rtI          |Xdæ          }X|S                    d          r! |B|T            |A|$||T d|X d|M|Q            |A|$||T|X|M|Q           .|IQ                    |C           |JQ                    |$           |Is|Js n|Dr\|Is|JrX N                    d,t{           dĝ|Iodd/                    |I           dB|Jodtc          |J           dǝdjk          Ȧ           |$|@d<   |C|@d<   t$          j        R                    |          }]|]jS        |]jT        fD ]h}^t$          j                            |^          }_|_O                                D ]2\  }`}adD ]*\  }b}c|bdz  }b|b|@vr|`|cv rt9          |ad+                   |@|b<   +3i|pd:%                                U                    dͦ          r"tU          j-        d|          }-|-r
|-V                    dϦ          }d|-V                    dЦ          }e|er"|eW                    dd:          }e|ds
|ed dх         }d|@L                    |-V                    dҠ%                                          |-V                    dӦ          x}fr|fgn1dԄ |-V                    dզ                              d֦          D             |-V                    dצ          %                                |et7          |d          d؜           dيt	          |ddfdۄddddf jX        d}ߦ          |@d<   	 |d         d         d         d         d         d+         d         d          d艊 ddꉆdv rdnddg|@Y                    di           d<   n# t          t          t          f$ r Y nw xY w|r_ ]                    ||"          p- ^                    ||"          p _                    ||"          pd |@d<    `                    |          |@d<   t	          |dtR          g           }gt          |gd          }h|hr;|h                    d          }i|ir                     |i          }it          |hd           dk    r|i|@d<   ntU          j-        d|i          }-|-rl|@L                    |-V                    d          t          |-V                    d]                    t          |-V                    d                    d           t          |hd tR                    pg D ]}jt          t	          |jdd                    }k|kD ]}ld d fd d gdffD ]\  }m}nt          |l|mt
                    pi                     d          }o|orWtU          jd        |n|o          }-|-r@t          |-V                    d                    |@|-V                    d          dz   <    nt	          |hdd	d
dddddddddt          hfd}          |@d<   t	          |hd          }p|prN X                    |pd          }q|p                    d          r|q|@d<   n|@                    dv          |q|@dv<   t          |gd          }r|rrt	          |rd          }st	          |sddddddddd d!d"d#dd$ddt          hf          }t|@L                                         |sd          p|tr|td+         nd  X                    |sd%          |tr|tnd d&           |?s1 @                    t	          |sd'd(t          hfd}                    }?t          |rd) tR                    pg }ud}}v|uD ]}wt          |wd*           d,u rd,}v n|uD ]}w|w                    d+          pi }x|x                    d          }y|ys2                     |xd          }y                     |xd,          }z|yd-k    r|z|@d.<   m|vs,|yd/k    r|z|@d<   ||yd0k    r|zr|zgnd |@d1<   |yd2k    r|z|@d<    g                    t	          |rd3                    }{ h                    |{t          jj                  rd,|@d4<   |@L                    |@                    d5          |?t          |?d d6d u          d7           tu          t          |d8          t          9          p tu           |d8          t          9          }|||rCt          jm        n                    ||t          jo        jp                  q                    d:          n6t          t          |d8                    pt           |d8                    }}|}r||s>d;v r9t           t                                         |hd<                              p|}}}|}|@d=<   |||@d><   |}rxd?vrst          |}          W                    t          jo        jp        @          }~|~t          dA          k    r,|@dm         D ]#}>|>                    dB          dCk    rd,|>dD<   $dED ]!\  }}b|@                    |          }a|ar|a|@|b<   " g                    t	          |hdF                    } h                    |t          jv                  pt          |dGt                    } h                    |t          jx                  rdHn y                    ||r$|" h                    |t          jz                  pd}nd |r$|" h                    |t          j{                  pd}nd |@d{         dk    |d n7 h                    |t          j|                  pt          |dIt                    J          |@dK<    }                    ||g          |@dL<    ~                    |	           |@S (M  Nz//www.youtube.com/zwatch?v=rU   ).r  r  )errorScreen%playerLegacyDesktopYpcTrailerRenderertrailerVideoIdc                 4                         | d           S )Nr^  )_html_search_meta)r  r  r2  s    rv  r  z)YoutubeIE._real_extract.<locals>.<lambda><  s    $"8"8GT"8"R"R rx  c                     d S r  rr  r  s    rv  r  z)YoutubeIE._real_extract.<locals>.<lambda>=  s    $ rx  r  r  r  .r  r  $structuredDescriptionContentRendererr9  &expandableVideoDescriptionBodyRendererattributedDescriptionBodyTextvideoDescriptionHeaderRendererr  r  r  !playerOverlayVideoDetailsRendererr^   ).r^   )zog:titleztwitter:titler^   zoNo title found in player responses; falling back to title from initial data. Other metadata may also be missing).ri   shortDescription)multicameraplayerLegacyMulticameraRenderermetadataListforce_singlefeed
noplaylistzDownloading just video z because of --no-playlist,c                 8     t           fdt                    S )Nc                      |          d         S )Nr   rr  )r  rP  s    rv  r  z=YoutubeIE._real_extract.<locals>.feed_entry.<locals>.<lambda>|  s    4 rx  )r4   r%  )rP  	feed_datas   `rv  
feed_entryz+YoutubeIE._real_extract.<locals>.feed_entryz  s*    &%';';';';S B  B Brx  rZ   z (rj  url_transparentYoutubez{}watch?v={}r   T)_typer  r}   r^   zNDownloading multifeed video ({}) - add --no-playlist to just download video {}r  lengthSecondsrj   ).r@  rw  z): Video is in Post-Live Manifestless modeallow_unplayable_formats).licenseInfos)r  playerErrorMessageRendererr  	subreasonr   z>The uploader has not made this video available in your countryavailableCountriesregionsAllowed)metadata_availablez. zsign inz,This helps protect our community. Learn morer  r  playerCaptchaViewModelz:. YouTube is requiring a captcha challenge before playbackz-This content isn't available, try again laterr  r  a   has been rate-limited by YouTube for up to an hour. It is recommended to use `-t sleep` to add a delay between video requests to avoid exceeding the rate limit. For more information, refer to  https://github.com/yt-dlp/yt-dlp/wiki/Extractors#this-content-isnt-available-try-again-laterrp  keywordsc                 R    g | ]$}t          |                    d                     %S )r  )r5   r  )rs  r  s     rv  r  z+YoutubeIE._real_extract.<locals>.<listcomp>  sB     Q Q Q QWWY//00Q Q Qrx  zog:video:tagzyt:stretch=z(\d+)\s*:\s*(\d+)c              3   4   K   | ]}t          |          V  d S r  )rw  )rs  ru  s     rv  r  z*YoutubeIE._real_extract.<locals>.<genexpr>  s(      <<E!HH<<<<<<rx  r  r  r   )..rv   zog:imageztwitter:imager}   )maxresdefaulthq720	sddefault	hqdefault0	mqdefaultr5  sd1sd2sd3hq1hq2hq3mq1mq2mq3r  rm  3c              3   z   K   | ]5}d D ]0}dd                     |||dk    rdnddk    rdnd          iV  16d	S )
)webpjpgr}   z:https://i.ytimg.com/vi{webp}/{video_id}/{name}{live}.{ext}r  _webpr   r  _live)r  rP  r\   r  rX  N)r   )rs  rP  r\   rp   r  s      rv  r  z*YoutubeIE._real_extract.<locals>.<genexpr>  s       B B 	B B +. OVV!# #vWW2{V_G_G_GGeg W i i
 B B B B B B Brx  c              3   B   K   | ]\  }}d  d | d         v |V  dS )r  r}   Nrr  )rs  r  tthumbr  s      rv  r  z*YoutubeIE._real_extract.<locals>.<genexpr>  sJ      eeDAqBThBTBTQRBTBTX]^cXdBdBdaBdBdBdBdeerx  z.webpr  r  r  categorygenrer  externalChannelIdownerProfileUrlstartTimestampendTimestampc                     r|                      d          sdS dk    r!dk    r|                      d          dk    rdS d S d S d S )Nr  Tr  r  r1  r  )r=  rp   re  s    rv  is_bad_formatz.YoutubeIE._real_extract.<locals>.is_bad_format  sj    $ SWW_-E-E t**/D	/Q/Q
++/CCCt +*/Q/QCCrx  rk   r  z(Last 2 hours)r  r  r  r  r  rv   )r  r}   ri   re   rg   z"https://www.youtube.com/channel/%sr^  r|   ).	viewCountinteractionCountaverage_ratingaverageRatingr_   isFamilySafeFisFamilyFriendlyr	  zog:restrictions:agez18+r   r  rb   ru   rs   playableInEmbedrp   r  r   isShortsEligibler  rL   r  resr  zhdr:12sourcezprefer-vp9-sortcompat_optszvcodec:vp9.2channelsr  r%  r|  )r   r   _format_sort_fieldsc                     t          |                     d          pdd                              dd          p|                     d          S )NvssIdr   r  r<  languageCode)r-   r|  r3  )r   s    rv  get_lang_codez.YoutubeIE._real_extract.<locals>.get_lang_code0  sI     7!3!3!9r3??GGSQQ 1yy002rx  c                     |                      |g           }j        D ]K}i ||g d}|                    d|dt          dt	          ||                    d|ddt
          |i           Ld S )N)r=  xosfr\   r}   r  rP  rd  T)r\  _SUBTITLE_FORMATSr0  r;   r9   r]  )	r  r}  rU  sub_namerC  ru  	lang_subsr=  r  s	           rv  process_languagez1YoutubeIE._real_extract.<locals>.process_language4  s    !,,Y;;I- 
 
 :59b999  37#<>NxY^>_>_``H!4."    	
 
rx  c                 x    D ]5}|                     d          dk    r|                     d          s| |d<   6d S )Nr  r  r  r  )rU  r  r  s     rv  "set_audio_lang_from_orig_subs_langzCYoutubeIE._real_extract.<locals>.set_audio_lang_from_orig_subs_langB  sL     . .55??f,,QUU:5F5F,$-AjM. .rx  c                 X    i | ]&}|d                               |d         d          'S )r  languageNamer   rs  r  )rs  r%  r  s     rv  rw  z+YoutubeIE._real_extract.<locals>.<dictcomp>K  sF     !
 !
 !
  $..n1EPQ."R"R!
 !
 !
rx  captionsplayerCaptionsTracklistRenderertranslationLanguagesc                 "    |d         o|d         S )Nr  r  rr  r  s     rv  r  z)YoutubeIE._real_extract.<locals>.<lambda>O  s    Q~.D1^3D rx  translated_subsr   r  r  c                 .    |d         o|d         d         S )Nr@  r  r  rr  r  s     rv  r  z)YoutubeIE._real_extract.<locals>.<lambda>W  s    ?+`*>_0` rx  captionTracksc                 X    h | ]&}|                     d           dk     |          'S )kindr  r  rs  r=  r  s     rv  	<setcomp>z*YoutubeIE._real_extract.<locals>.<setcomp>Z  s9    bbb#QW\aIaIa==--IaIaIarx  c                 t    h | ]4}|                     d           dk    t           |          d          5S )r&  r  a-)r|  r-   r'  s     rv  r(  z*YoutubeIE._real_extract.<locals>.<setcomp>[  sN     A A Aswwv%'?'? s++T22'?'?'?rx  r@  r  
clientNameSUBS_PO_TOKEN_POLICYc                     |d         S )Nrj  rr  r  s     rv  r  z)YoutubeIE._real_extract.<locals>.<lambda>i  s    STU^S_ rx  rj  c              3   <   K   | ]}|t          d           v V  dS ))exp.Nr  )rs  r  r  s     rv  r  z*YoutubeIE._real_extract.<locals>.<genexpr>o  s2      TT\"l;;;TTTTTTrx  )xpexpvr*  r  )r-  potcr  rP  r   rs  r&  r  isTranslatableundr<  z from %sr*  z-origz (Original)tlangz (auto-generated)zL: There are missing subtitles languages because a PO token was not provided.z+Subtitles for these languages are missing: zAutomatic captions for z languages are missing.)r}  automatic_captionsrb  ))r  )r  r  )end)r7  _timez
Auto-generated by YouTube.u  (?xs)
                    (?:\n|^)(?P<track>[^\n·]+)\ ·\ (?P<artist>[^\n]+)\n+
                    (?P<album>[^\n]+)\n+
                    (?:℗\s*(?P<release_year>\d{4}))?
                    (?:.+?\nReleased\ on\s*:\s*(?P<release_date>\d{4}-\d{2}-\d{2}))?
                    (?:.+?\nArtist\s*:\s*(?P<clean_artist>[^\n]+)\n)?
                    .+\nAuto-generated\ by\ YouTube\.\s*$
                r   r      r   clean_artistc                 6    g | ]}|                                 S rr  )r  )rs  as     rv  r  z+YoutubeIE._real_extract.<locals>.<listcomp>  s     %\%\%\Aaggii%\%\%\rx  r   u    · r   )r   r   r   r   r   )r  z!engagement-panel-comments-section)r  twoColumnWatchNextResultsr  r  r  .r  r  . commentsEntryPointHeaderRenderercommentCountc                 $    |d         d         v S )Nr  panelIdentifierrr  )r  ru  COMMENTS_SECTION_IDSs     rv  r  z)YoutubeIE._real_extract.<locals>.<lambda>  s    Q/S-TUf-gk- rx  header"engagementPanelTitleHeaderRenderercontextualInfor  rh   r  r=  conversationBarliveChatRenderercontinuationsreloadContinuationDatar  z https://www.youtube.com/watch?v=z &bpctr=9999999999&has_verified=1json)r  r  youtube_live_chatyoutube_live_chat_replay)r}   r  r\   r  	live_chatr   rn   )r  r=  r  r  r  r4  videoPrimaryInfoRenderersuperTitleLinkc                     | d         d         S )NsuperTitleIconr  rr  r  s    rv  r  z)YoutubeIE._real_extract.<locals>.<lambda>  s    !$4"5j"A rx  LOCATION_PINr\  u   (.+?)\s*S(\d+)\s*•?\s*E(\d+)r   )seriesseason_numberepisode_numberc                 *    | d         d         d         S )NvideoActionsmenuRenderertopLevelButtonsrr  r  s    rv  r  z)YoutubeIE._real_extract.<locals>.<lambda>  s    a/?@QR rx  )toggleButtonRenderer.)"segmentedLikeDislikeButtonRenderer.rZ  c                 *    | d         d         d         S )NdefaultTextaccessibilityaccessibilityDatarr  r  s    rv  r  z)YoutubeIE._real_extract.<locals>.<lambda>"  s    a&6&GH[&\ rx  z*(?P<count>[\d,]+)\s*(?P<type>(?:dis)?like)c                     | d         S )Nr^  rr  r  s    rv  r  z)YoutubeIE._real_extract.<locals>.<lambda>$  s    !O*< rx  c                     | d         d         S )Nr_  rr  r  s    rv  r  z)YoutubeIE._real_extract.<locals>.<lambda>%  s    !,?*@AT*U rx  zK(?P<type>(?:dis)?like) this video along with (?P<count>[\d,]+) other peopler  ry  r  _countrW  rX  rY  #segmentedLikeDislikeButtonViewModellikeButtonViewModeltoggleButtonViewModeldefaultButtonViewModelbuttonViewModelaccessibilityTextr  ro   )r  videoViewCountRendererr  r  r  videoSecondaryInfoRenderer)ownervideoOwnerRendererattributedTitlecommandRunsonTapr  showDialogCommandpanelLoadingStrategyinlineContentdialogViewModelcustomContentlistViewModel	listItemslistItemViewModelsubscriberCountText)rc   rd   r   )navigationEndpoint)r^   runs.ry  )r  r  c                 *    | d         d         d         S )NmetadataRowContainermetadataRowContainerRendererry  rr  r  s    rv  r  z)YoutubeIE._real_extract.<locals>.<lambda>S  s    !234RSTZ[ rx  c                     | d         d         S )NmetadataRowRendererhasDividerLinerr  r  s    rv  r  z)YoutubeIE._real_extract.<locals>.<lambda>W  s    !,A*BCS*T rx  r  )r  r   Licenser   AlbumArtistr   Song)rk  rl  r  r   rc   zhttps://www.youtube.com/%s)ry   rz   r{   
uploadDate)timezonez%Y%m%d)rq   NdateTextrx   rw   )r  rw  r  )tzinfoztoday-2daysr  m3u8_native__needs_testing))r   r   )r   r   r  	isPrivatera   
isUnlisted)
is_privateneeds_premiumneeds_subscriptionr   is_unlistedr`   __post_extractor)r7   	_match_idhttp_schemer  r2   r  r!   r%  r  r  r  r  _preferred_langr  r|  r}  r  r	  r5  r6  r*   unquote_plusr0  r.   r   r  playlist_resultr"   r(   r  r  
report_drmr   r/  raise_geo_restrictedr"  r,   r  re  r  raise_no_formatsrz  r  finditer_meta_regexr  groups_extract_thumbnailsr  rl  r.  r  rv  _remove_duplicate_formatsr  _sort_thumbnailsr  r/   r)   rx  r  r#   r  r  handle_from_urlr    r   rv  r  r]  r`  rX  ra  r  r  rZ  rx  rI  r  r9  r-   r  r7  fragmentru  endswithr  r3  r  r\  KeyError
IndexError	TypeErrorr  r  "_extract_chapters_from_descriptionr  r4   r  r<   r  r0   r'   r  r  r   r	  r   dtdatetimefromtimestampr  utcstrftimer6   r1   r  r   AVAILABILITY_PRIVATEr  AVAILABILITY_PUBLIC_availabilityAVAILABILITY_PREMIUMAVAILABILITY_SUBSCRIPTIONAVAILABILITY_UNLISTEDextract_commentsmark_watched)r  r}   r  r}  r  rf  r  r  r2  r|  r  playability_statusestrailer_video_idsearch_metar  r  initial_sdcrinitial_descriptioninitial_vdhrinitial_video_details_rendererinitial_titletranslated_titlevideo_titletranslated_descriptionoriginal_descriptionvideo_descriptionmultifeed_metadata_listentriesfeed_idsfeedr  feed_id
feed_titler^   rj   r  r6  rc  pemrr  r  	countriesregions_allowedr  keywordr  whratior  r  thumbnail_urloriginal_thumbnailsthumbnail_namesn_thumbnail_namesr  r  re   owner_profile_urlr  live_end_timer  r=  channel_handler  r  r  rb  skipped_subs_clientstranslation_languagesget_translated_subsr  all_captionsneed_subs_langsneed_caps_langsr<  pctrrC  innertube_client_namer7  rq  
pot_paramsalready_fetched_potcaption_trackrU  requires_potsubs_po_token	orig_lang	lang_nameis_manual_subs
trans_code
trans_nameorig_trans_coder  	componentru  rt  ru  d_ks_ksr   r   r<  r  vpirstltlbtbrsr  getterregexr  vcrvcvsirvorcollaboratorsry  multiple_songsrowmrr	mrr_titlemrr_contents_textowner_badgesrw   rx   upload_datetimes_kr  r  rB  r  r  r  rp   re  r  r  r  r2  s   `                                                                                                                                 @@@@@@@@@@rv  _real_extractzYoutubeIE._real_extract&  s9"   *333]>>#&&##%%(<<+h6dhdydy^XeG eGa.CEUWa  ,8 N  N  N % V    	C?? $++--1AC C C "8RRRRRR(6 	 %%57L\`aaa#O     
 $L%I=vs3L M M +<SB+Ys:D E E $LS:TFC3I J J PMO 	)5l5~/$E9 *: *: *@=? 	' NN<11 G~~<gFF 	  >>,GG,A1A N#M7;;N*N &+&L&L&LMM 	  	(} 	(56 6 6 (K!%>R!S!S(8JKK
 (<'G !<&< $ $Mc	 	
 $ 3"+N# # # # %	G=+<+<=O+P+P %	G~~l++ $G\\\\]]]]399#>> - -D !' 5 511$77!9 !9IB B B B B )j..G" ! !+G!4!4J'E! 4!3j!3!3!33NN!2"+**11(IdOA<NOO/6 8  8 "'$ $    OOG,,,,dkk		(++X7 78 8 8 ++X{4EG G G  	- I IJJ G"9\?#K#KLLG%kk*&=&=>>GBF 	
 x}FVXbdlmm 	IW6H%&68NOO+%%SSSTTT 	=>>"<== *,~_tBuBu *)))$=TS S S YVX  ^^D(33`yAUW_7`7`F"4>>$#D#D#JKKI +''(hii ] ),8L M MI$ \*5+6F*G*GBQ$[O$9$9#$>$>$>W[	--iW[-\\\*y*** =..'0^__F *6<<>>3 ? ?]]4C[]]FF3mE]`d_e5fgg ZZFFDNN%fllnnc:: x xPTPe  ?Ann  lA x x x  %%ft%<<<]JdKKKQr 	QG 	QQ QT%5%5n%E%EwOOQ Q QH   	 	G!!-00 
y!5w?? <<dkkmm<<<DAq1uuQ !A!( = =A uuX&887<"3 4--}l.KMdee
#Z$ABB 	}    )oo//

 
 
  00 B B B B B &	B B B 	B 	B 	B
   	S 	SEeeeeeIo$>$>eeegxyyA(/5<(?(?11RAPQE"RE,&&z222))*=>>>\:66N++g:N:N&&{m[11 (':;;({;''() () * *
 &l4EFF'	2HJZ([([\\%i0F&W&WXX 	7M 	7o 	7$6H $ ; ;K R R	 	 	 	 	 	 -11 	d 	dC!$!6!6!<" BC!.sww}/E/EGW_b!c!c!cC  	o11?CmU`dmUmo o o 	t//0@(KKLLL--.?@@"
("
["
 w"
 *	"
 &9;GG"
 ,"
 *"
 <
D:^hlmmm"
 "
 +=,79KLL 3;1224 4"
 mIm_,U,UVV"
  ,775@@;122g==;455>>  FG'"
( ;)"
* :8**d+"
, H-"
.  +?AR!S!S/"
0 ;1"
4 !*- I I  ),8J K K WW!05%8"3t~~mUW7X7X"X"X^fHfg$7="
 "
 "
H	2 	2 	2	 	 	 	 		. 	. 	. 	. 	.
 	"uu!
 !
 !
 !
$%5Z!BDZDD8F G G!
 !
 !
 0t7N7Nv7V7VV [NN.66Y$..:Y:Y 	 +``c c#C>QTW[V\*^ _ _bbbbbbbA A A A#A A A  T	 T	Bj>"CDD_-.HIK$&$78X$YZb$cdp$q!+/+B+B;+O+OPf+gJ')/':;]'^$J"'!-d_F_F_4`!a!a Da Da(3h'')M-88	 TTTT^TTTTT u"+sZ5X5r]r0s 
 + *.'(@(@,JpZdZp(q(q(qq} "))#0$'!6+ +    " l (,,[99966xMMMEFF6D62226	 NN=&1NMM	!.!2!26!:!:e!C! !$ ! $$!8Y	;PZ\ \ \(,,-=>> ! .C.I.I.K.K m m*J
% ! &0O% P**=*=2 %$"o)oo5
"l9dJ&O&OO
 $:$:$:::::?KKK )(.Z:N:N:N)666ZQ Q Q %$*Hj*k&/?&B&B

R\Hk`jHkm m m m )D99	!  iCU6U6U&y2EFF	 $$%566 L66yAAA$$*H6I6I6I$111;
L L L ! &)YU_a a a a --i888--.@AAA#   	_ 	 	..x=iiio$oRVR[R[\kRlRl$o$o$ok$kc/>R>R$k$k$k	D D D.    &8!"%[\**3//
$-z/?@ 	9 	9IL)))44E 9 91!O 9 9IC7NC$199$21Q4$8$8S	99 #**,,556TUU 	9 '( (D  #zz.99#zz.99 8#/#7#7R#@#@L' 8'3BQB'7!ZZ88-1ZZ-G-G(G !]%\%\H9M9M9S9STZ9[9[%\%\%\!ZZ006688$0$/$=$=      ] ,\ <
     0(<`br
 %!9 !9 !9_	$%@ABSTUghixyz{|  ~V  W  Xf  g  g e(ddd$4?C]4]4]00"<> > =DOOK,,[99 *i0 	 	 	D	  	B00xHH ??hWW::;LhWW 	  #33LAADOe, , , #=>> 3	,((+,,C nnS))AAC CFTU U (+D$$9%FLLD &*jjmm-0A-?-?.1$**Q--.@.@% %   
  RR     & &   :[] ]^ ^   & &C\\I+K != < U UN  nMo*p & & ")fd!;!;!Ar F Fw O O  &#%8E5#9#9D# &FPQUQ[Q[\cQdQdFeFeTZZ%7%7(%B C %& ".d0A357LNc')@BZ!#6	5G QV	"W "W "WD t%LMMC ,__S+66778$$ ,46D011XXl++3)+D&#?@@ .	3t%DEEC(!=#w@RTg&9JO]lS"5w	C5/R S SM KK>>#w77hP]<gM!<L<Lcg*.//#?T*U*U-:DMM     " 0!%!5!5 \r' )./ / /"0 "0 [[     #N  3 T TUUY]]]%)NE ^  : :gg344:GGG,,	   NN388	$(NN3$H$H!	))&7DOO' : G++(9W"h..AR*\+<*=*=X\Y"f,,(9W//TCl0m0mnnL|Y-?@@ 3.2*+++)(?[eijjj
 
 	 	 	 )L,??*UUU M[[66LLL 	
 Yb BK%%iAAJJ8TTT	, E EFF >";;|#<#<==	 	  	X9 	X@R1R1R*%%dnnT:&F&FGGI I XLW  *]%[ 	6;.UUU/<<DDBKOD\\O"3M"B"BBB	? 6 6Cwwz**m;;15-.I 	 	HCA S	%%l4&B&BCCoofi.LMM S"=+TRRR 	 	0MNN SHH##% !-R1;1G OOFI,JKK T !-R1;1G OOFI,OPP T,2$.$6DDOOFI,KLL Q |4PPP $ S S 	^ $(#8#8RZ\c#d#d ($4555s   C>2AE EAE4E3AE4rY  )T)NFr  )NNr   )S__name__
__module____qualname__IE_DESCr   r  r	   _INVIDIOUS_SITES
_VALID_URL_EMBED_REGEX_RETURN_TYPEr@  r  r,  r+  r*  r)  _GEO_BYPASSIE_NAMEr  r%  _TESTS_WEBPAGE_TESTSr  r  r  r9  r8  classmethodr~  r  r  r  r  r
  r  r'  r.  r  r>  r  rG  rT  rW  r^  r  r  r  r  r  r  r  r  rJ  staticmethodrx  r  r  r  r
   r  r  r  r  r  r  r  r:  r>  rt  rx  r~  r  rn  r  r  rc  r  r  r  r  r  __classcell__)r  s   @rv  rH   rH   T   s=       G !@ "(((3DEE "( " "A H		8L& LO
 P:-DFKGhG
-
5
 <
 	

 H
 12
 ,
 %c
 4
 U
 S
 A
 
 
 {
  #!
" :#
$ "&8#%-0I7
 
 
: $?    hB +6ZA%
 
   AhZ 4J
-
5
 <
 	

 H
 12
 ,
 %c
 4
 U
 S
 A
 
 {
 #
  :!
"  #
$ 8#%-0I3
 
 
6 $= YhX A<
-
5
 .
 	

 H
 12
 y
 %c
 4
 U
 S
 2
 
 #
 :
  '!
"  #
$ 8#%!%>3
 
 
8 !-1
 

 0G$ $Whb =
-
5
 a
 	

 H
 7)
 z
 %c
 4
 "4
 U
 S
 A
 
 {
  #!
" :#
$ "!%8#%"*C7
 
 
< /!-1
 
A% %_hn I8
-
5
 N
 	

 L
 8*
 }
 %c
 4
 "4
 U
 S
 A
 
 {
  #!
" :#
$ "!%8#%%(A7
 
 
: #D)9G$ $ihr P8
-
5
 2
 	

 H
 ?+
 }
 %c
 4
 "4
 U
 S
 A
 
 {
  #!
" :#
$ "!%8#%%,E7
 
 
: #D)A! !qht I8
-
5
 :
 	

 L
 ?+
 '
 %c
 4
 U
 S
 A
 
 #
 :
  '!
"  #
$ 8#%(+D3
 
 
6 := shr 58
-
5
 <
 	

 H
 7)
 |
 %c
 4
 U
 A
 
 #
 :
 '
   !
" I#
$ 9#%$'@1
 
 
 qhl 18 khz 
-
5
 2
 	

 H
 7)
 z
 %c
 4
 "4
 U
 S
 A
 
 {
  #!
" :#
$ "!%8#%"&?7
 
 
: 66"D)G$ $sh~	 
-
5
 L
 	

 H
 8*
 z
 %c
 4
 "4
 U
 A
 
 #
 :
  ,!
"  #
$ '!+8#%"&?7
 
 
: #D)A! !{	h@ =
-
5
 O
 	

 J
 +,
 {
 %c
 4
 U
 S
 A
 
 #
 :
  '!
"  #
$  '8#%#'@5
 
 
8 #D)?   }
hD  }hN =
-
5
 |
 	

 H
 +,
 }
 %c
 4
 U
 A
 
 #
 :
 '
   !
" J#
$ 9#%%)B1
 
 
4 #D)= IhL ;
-
5
 H
 	

 J
 8*
 /
 %c
 4
 U
 S
 A
 
 #
 :
  ,!
"  #
$ '!+8#%04M7
 
 
< !-1
 
C& &GhX =	 Shb =	 ]hh . ghn q mh~ =
-
5
 K
 	

 H
 -.
 }
 %c
 4
 U
 S
 A
 
 #
 :
  '!
"  #
$ 8#%%)B3
 
 
6 #D)E# #sh~ =	 yhF =BA%
 
 - Ch\ = Yhd =
-
5
 w
 	

 H
 ;-
 H
 %c
 4
 U
 	
 A
 
 M
 #
  :!
" '#
$ "&8#%I(A5
 
 
8 #D)?   ahd =
-
5
 O
 	

 H
 ,-
 '
 %c
 4
 "4
 U
 	
 S
 A
 
  {!
" M#
$ %!!%8#%(+D;
 
 
> #D)E# #ahh ] ghr =	 mh| =%A%1
 
 / whT =
-
5
 4
 	

 H
 ?+
 x
 %c
 4
 "4
 U
 S
 A
 
 {
  #!
" :#
$ "!%8#% $=7
 
 
: 77"D)C" "QhZ =7A%
 
 ^ Uhr  ohz  wh@ 8 hF C EhN ; KhV = Sh` =	 [hl ? 
- 
5 
 ] 
 	 

 : 
  
 	{ 
 H 
 7) 
 y 
 %c 
 4 
 "4 
 U 
 S 
  ! 
" A# 
$ "%!!%&8#"%!? 
  
  
B #D)M' 'eht A sh~ PA%"W>	
 	
 $ yh\ =
-
5
 Z
 	

 H
 +,
 (
 %c
 4
 U
 2
 
 #
 :
 '
   !
" B#
$ 9#%)+D1
 
 
4 #D)= Wh^ =
-
5
 B
 	

 H
 ;-
 {
 %c
 4
 "4
 U
 	
 S
 A
 
  {!
" ##
$ &!!%8#%#<U9
 
 
< #D)I% %Uhb = _hh C ghp !
-!
5!
 Z!
 	!

 [!
 !
 12!
 H!
 7)!
 0!
 %c!
 4!
 "4!
 U!
 S!
  23!!
" A#!
$ "%!!%& 8#%1A!
 !
 !
D #D)K& &mh| = yhD =
-
5
 \
 	

 L
 ,-
 ~
 %c
 4
 "4
 U
 S
 A
 
 #
  :!
" '#
$ "&8#%&)B5
 
 
8 :?   AhF 
-
5
 Q
 	

 H
 ,-
 *
 %c
 4
 U
 A
 
 :
 '
  
  I!
" 8#
$ $%+1J/
 
 
2 #D); Ah@  }hH ? EhP = MhX =
-
5
 5
 	

 H
 ?+
 |
 %c
 4
 "4
 U
 	
 S
 A
 
  {!
" ##
$ &!!%8#%$(A9
 
 
>  )?YK*HI!
 

 (M' 'Uhf ?#i-)1M%NO	 chp < mhv <
-
7
 ,
 	

 H
 ;-
 y
 %c
 4
 "4
 U
 	
 S
 A
 
  {!
" ##
$ &!!%8#%!%>9
 
 
> !
 
C% %uhB  =
-
5
 C
 	

 H
 8*
 }
 %c
 4
 U
 S
 A
 
 {
 #
  :!
" '#
$ "&8#%%(A5
 
 
8 #D)?   hB! =
-
5
 ;
 	

 H
 ?+
 z
 %c
 4
 "4
 U
 S
 A
 
 {
  #!
" :#
$ "!%&!+8#%"&?;
 
 
> #D)E# # hJ" =
-
5
 S
 	

 H
 7)
 {
 %c
 4
 "4
 U
 $S
 A
 #
 9
  ,!
"  #
$ '!+8#%#&?7
 
 
: #D)C" "E"hJ# =
-
5
 A
 	

 J
 7)
 |
 %c
 4
 U
 2
 
 #
 :
 '
   !
" B#
$ 9#%$(A1
 
 
4 #D)9 I#hH$ =
-
5
 <
 	

 J
 +,
 *
 4
 U
 2
 
 #
 :
 '
  
  B!
" 8#
$ $%+'@/
 
 
2 #D); C$hB% =
-
5
 ;
 	

 H
 +,
 *
 4
 U
 A
 
 #
 :
 '
  
  B!
" 8#
$ $%+'@/
 
 
4  )6D6*:;!
 
 CCA! !$hB& "< A&hJ& 6<
-
5
 ;
 	

 H
 ?+
 y
 %c
 4
 "4
 U
 S
 A
 
 {
  #!
" :#
$ "!%8#%!%>7
 
 
<  )?UG*DE!
 

 $K& &I&hV' ?<
-
6
 :
 	

 L
 ?+
 '
 %c
 4
 U
 S
 A
 
 #
 :
  '!
"  #
$ 8#%(+D3
 
 
8  !
 
 :E# #U'h\( H9
-
5
   b
 	

 H
 ?+
 .
 %c
 4
 "4
 U
 

 S
 A
 
  {!
" ##
$ &&!%&!+8#%/)B=
 
 
@ #D)G$ $[(hf) =
-
6
 =
 	
 ~
 %c
 4
 "4
 U
 	
 S
 A
 
  {!
" ##
$ :%
& ''
( "&8#%&)B9
 
 
>  )"' ){+ +  "
 
 $Q) )c)hz* <
-
5
 O
 	

 H
 +,
 x
 %c
 4
 U
 2
 
 #
 :
 '
   !
" B#
$ 9#% (A1
 
 
4 #D)= u*hv+ ?!
-!
5!
 ]!
 	!

 ]!
 +!
 J!
 D!
 !
 A!
 '!
 !
 ~!
 4!
 U!
  "4!!
" %c#!
$ !U"")JJJ&#%!%$%A!
 !
 !
F T
K( (s+hF- =
-
5
 G
 A	

 '
 
 +
 D
 |
 4
 U
 S
 #
 #
 
  !
" K#
$ ++%'89#%!%$%3
 
 
6 #D)= C-hD. =
-
5
 @
 A	

 '
 

 >
 B
 z
 4
 U
 S
 #
 #
 
  !
" U#
$ #)zzz#%!+&!%$%7
 
 
: #D)A! !A.hF/ =
-
5
 _
 2	

 '
 +
 <
 @
 *
 4
 U
 %c
 #
 #
 
  !
" O#
$ ,,#%!+&!%$%"9
 
 
> "
 
C% %C/hP0 =
-
5
 X
 2	

 '
 	
 +
 D
 y
 4
 U
 #
 #
 
 
  O!
" +,#
$ #%!%&%!3
 
 
8 "
 
=" "M0hFX1 w
-
5
 8
 :	

 A
 
 I
 4
  
 8
 #
 S
 *
 :
 U
  H!
" #
$ 12&)+T;"#!5
 
 
8 #D)A! !H Q
-
5
 g
 	

 H
 8*
 ,
 %c
 4
 U
 S
 A
 
 #
 :
  '!
"  #
$ 8#%-3L3
 
 
6 #D)?   F _
-
5
 T
 	

 H
 7)
 |
 %c
 4
 U
 S
 2
 
 #
 :
  !
" '#
$ "&8#%$(A5
 
 
8 #D)A! !H [
-
5
 J
 	

 H
 +,
 S
 %c
 4
 U
 A
 
 #
 :
 '
   !
" I#
$ 9#%TTm1
 
 
6  )=8**EF!
 
=" "J (XAS
 
 "D) IQNf "*!%1440059?A
 
 &W%V7M7S7S7U7U%V%V%V"% % % % [%" " " " "; ; ; ; ;
5' 5' 5'nmF mF mF^	, 	, 	, 26$ +s +s +s +s +sZ 48 A A A A AL L L L 
/ 
/ 
/( ( (     [ 	3 	3 	3 	3 Z_      _d R R R R R! ! ! !F'7 '7 '7R 4 4 4 4 [4.   [  0 0 0  
 
 
 
:/ / / /bV( V( V( V(p 9 9 \9	R 	R 	R = = \= 
 
 
 [
("3 " " " " "H %*oFYaetx$(X\fj %X XO X X X Xt4< 4< 4<l 	^ 	^ \	^ ^ ^ \^) ) )V3- 3- 3-j  ` ` `D  
5 5 55 5 5 5&K K KZ$ $ $L  "  <G G G G,   	
 	
 	
i i i"L
 L
 L
 L
 L
 L
 L
rx  rH   )\r  r  rZ  r  r  r  rK  r{  rc  r  r_  r  r  urllib.parser5  _baser   r   r   r   r   r	   r
   r   r   jsc._builtin.ejsr   jsc._directorr   jsc.providerr   r   r   r   pot._directorr   pot.providerr   r   networking.exceptionsr   utilsr   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   utils.networkingr=   r>   r?   r]  ra  r^  r_  r`  rb  rd  r{  rH   rr  rx  rv  <module>r     s                       				 



         
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 , + + + + + 2 2 2 2 2 2 a a a a a a a a a a a a 2 2 2 2 2 2 8 8 8 8 8 8 8 8 . . . . . .& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &N K J J J J J J J J J. %C "$A !'G $#?  'G $(I %K ^E ^E ^E ^E ^E( ^E ^E ^E ^E ^Erx  