U
    ¦y^#c  ã                   @   sÊ   d dl mZ d dlZddlmZ ddlmZmZmZm	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mZ G d	d
„ d
eƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deeƒZdS )é    )Úunicode_literalsNé   )ÚInfoExtractoré   )Úcompat_HTTPErrorÚcompat_parse_qsÚcompat_urllib_parse_unquoteÚcompat_urllib_parse_urlparse)	Údict_getÚExtractorErrorÚfloat_or_noneÚint_or_noneÚtry_getÚstrip_or_noneÚunified_timestampÚupdate_url_queryÚ
xpath_text)ÚPeriscopeBaseIEÚPeriscopeIEc                   @   s@   e Zd ZdZdZdZdd„ Zdd„ Zedd	„ ƒZ	i fd
d„Z
dS )ÚTwitterBaseIEzhttps://api.twitter.com/1.1/z0https?://(?:(?:www|m(?:obile)?)\.)?twitter\.com/Nc                 C   sv   |  d¡}|sg S d|kr0| j||ddddd�S tt|dƒd	ƒpBd }|d
|rTd| nd |dœ}|  ||¡ |gS d S )NÚurlz.m3u8Úmp4Úm3u8_nativeÚhlsF)Úm3u8_idÚfatal)ÚbitrateZbit_rateéè  Úhttpz-%dÚ )r   Ú	format_idÚtbr)ÚgetÚ_extract_m3u8_formatsr   r
   Ú_search_dimensions_in_video_url)ÚselfÚvariantÚvideo_idÚvariant_urlr!   Úf© r*   úOC:\Users\TaGoRe\Desktop\beinconnect-dl\binaries\youtube_dl\extractor\twitter.pyÚ_extract_variant_formats$   s&    
    þýz&TwitterBaseIE._extract_variant_formatsc                 C   sŒ   |   ||¡}g }g }| d¡D ]<}t|jd ƒ|jd< | |jd ¡ | |  |j|¡¡ qtt|dƒƒ}||krˆ| |  d|i|¡¡ |S )Nz:.//{http://twitter.com/schema/videoVMapV2.xsd}videoVariantr   z.//MediaFile)	Ú_download_xmlÚfindallr   ÚattribÚappendÚextendr,   r   r   )r%   Úvmap_urlr'   Z	vmap_dataÚformatsÚurlsZvideo_variantÚ	video_urlr*   r*   r+   Ú_extract_formats_from_vmap_url6   s     ÿ
 ÿz,TwitterBaseIE._extract_formats_from_vmap_urlc                 C   s8   t  d|¡}|r4|  t| d¡ƒt| d¡ƒdœ¡ d S )Nz /(?P<width>\d+)x(?P<height>\d+)/ÚwidthÚheight©r7   r8   )ÚreÚsearchÚupdateÚintÚgroup)Úa_formatr5   Úmr*   r*   r+   r$   E   s    þz-TwitterBaseIE._search_dimensions_in_video_urlc              
   C   s¾   ddi}| j s.| j| jd |dd|d�d | _ | j |d< z| j| j| |||d	�W S  tk
r¸ } zHt|jtƒr¦|jjd
kr¦t|  |j 	¡  
¡ |¡d d d dd�‚‚ W 5 d }~X Y nX d S )NÚAuthorizationzyBearer AAAAAAAAAAAAAAAAAAAAAPYXBAAAAAAACLXUNDekMxqa8h%2F40K4moUkGsoc%3DTYfbDKbT3jJPCEVnMYqilB28NHfOPqkca3qaAxGfsyKCs0wRbwzguest/activate.jsonzDownloading guest tokenó    )ÚdataÚheadersZguest_tokenzx-guest-token)rD   Úqueryi“  Úerrorsr   ÚmessageT)Úexpected)Ú_GUEST_TOKENÚ_download_jsonÚ	_API_BASEr   Ú
isinstanceÚcauser   ÚcodeÚ_parse_jsonÚreadÚdecode)r%   Úpathr'   rE   rD   Úer*   r*   r+   Ú	_call_apiN   sH     ÿ  ýý
   ÿþþþþþzTwitterBaseIE._call_api)Ú__name__Ú
__module__Ú__qualname__rK   Ú_BASE_REGEXrI   r,   r6   Ústaticmethodr$   rT   r*   r*   r*   r+   r      s   
r   c                   @   sÂ   e Zd ZdZejd Zdddddddd	d
dddœ
dœdddddddddddœdœddddddddd d!œd"gd#œd$d%d&dd'd(d)d*d+d,œd-gd#œd.d/d0dd1d2d3d4d5d6dœd7d8œd9d:d;œgZd<d=„ Zd>S )?ÚTwitterCardIEztwitter:cardz0i/(?:cards/tfw/v1|videos(?:/tweet)?)/(?P<id>\d+)z5https://twitter.com/i/cards/tfw/v1/560070183650213889Z560070183650213889r   zwTwitter - You can now shoot, edit and share video on Twitter. Capture life's most moving moments from your perspective.z$md5:18d3e24bb4f6e5007487dd546e53bd96ÚTwitterúre:^https?://.*\.jpggœÄ °r>@i •ÇTÚ20150127)
ÚidÚextÚtitleÚdescriptionÚuploaderÚuploader_idÚ	thumbnailÚdurationÚ	timestampÚupload_date©r   Ú	info_dictz5https://twitter.com/i/cards/tfw/v1/623160978427936768Z 7137eca597f72b9abbe61e5ae0161399Z623160978427936768zjNASA - Fly over Pluto's icy Norgay Mountains and Sputnik Plain in this @NASANewHorizons #PlutoFlyby video.z{Fly over Pluto's icy Norgay Mountains and Sputnik Plain in this @NASANewHorizons #PlutoFlyby video. https://t.co/BJYgOjSeGAZNASAi�­UZ20150720)r^   r_   r`   ra   rb   rc   rf   rg   ©r   Úmd5ri   z5https://twitter.com/i/cards/tfw/v1/654001591733886977Z b6d9683dd3f48e340ded81c0e917ad46Zdq4Oj5quskIzUbuntu 11.10 Overviewz$md5:a831e97fa384863d6e26ce48d1c43376Z20111013zOMG! UBUNTU!Z	omgubuntu)r^   r_   r`   ra   rg   rb   rc   ÚYoutube©r   rk   ri   Úadd_iez5https://twitter.com/i/cards/tfw/v1/665289828897005568Z 6dabeaca9e68cbb71c99c322a4b42a11ZiBb2x00UVlvÚ20151113Z1189339351084113920ZArsenalTerjezVine by ArsenalTerjei«ZFV)r^   r_   rg   rc   rb   r`   rf   ÚVinez5https://twitter.com/i/videos/tweet/705235433198714880Z 884812a2adc8aaf6fe52b15ccbfa3b88Ú705235433198714880úaBrent Yarina - Khalil Iverson's missed highlight dunk. And made highlight dunk. In one highlight.újKhalil Iverson's missed highlight dunk. And made highlight dunk. In one highlight. https://t.co/OrxcJ28BnsúBrent YarinaÚBTNBrentYarinaéL±×VÚ20160303z$This content is no longer available.)r   rk   ri   Úskipz/https://twitter.com/i/videos/752274308186120192T©r   Úonly_matchingc                 C   s    |   |¡}|  d| t ¡ |¡S )Nzhttps://twitter.com/statuses/)Ú	_match_idÚ
url_resultÚ	TwitterIEÚie_key)r%   r   Z	status_idr*   r*   r+   Ú_real_extract´   s    
 þzTwitterCardIE._real_extractN©	rU   rV   rW   ÚIE_NAMEr   rX   Ú
_VALID_URLÚ_TESTSr   r*   r*   r*   r+   rZ   c   sŠ   
öýøýù	ôù	ôø
óþ¸NrZ   c                   @   sÀ  e Zd ZdZejd Zddddddd	d
dddddœdœddddddddddœddgddœdddd d!d"d#d$d%d&œdœd'd(dd)d*d+d,d-d.d&œd/d0id1œd2d3dd4d5dd6d7d8d9d:d;œ
dœd<d=d>dd?d@dAdBdCdDœdEgdFœdGdHddIdJdKdLdMdNdOdPœ	dœdQdRddSdTdUdVdWdXœdYgdZœd[d\dd]d^d_d`dadbdcddœ	dœdedfddgddhdidjdkdldmdnœ
d/d0id1œdodpddqddrdsdtdudvdwdnœ
d/d0id1œdxdyddzdd{d|d|d}d~ddnœ
dœd€d�dd‚dƒd„d…œd†gdZœd‡d0dˆœd‡d0dˆœgZd‰dŠ„ Zd‹S )Œr}   Útwitterz/(?:(?:i/web|[^/]+)/status|statuses)/(?P<id>\d+)z;https://twitter.com/freethenipple/status/643211948184596480Z643211948184596480r   z9FREE THE NIPPLE - FTN supporters on Hollywood Blvd today!r\   z>FTN supporters on Hollywood Blvd today! http://t.co/c7jHH749xJzFREE THE NIPPLEZfreethenipplegòÒMbØ)@imöUZ20150913é   )r^   r_   r`   rd   ra   rb   rc   re   rf   rg   Ú	age_limitrh   z;https://twitter.com/giphz/status/657991469417025536/photo/1Z f36dcd5fb92bf7057f155e7d927eeb42Z657991469417025536z=Gifs - tu vai cai tu vai cai tu nao eh capaz disso tu vai caizaGifs on Twitter: "tu vai cai tu vai cai tu nao eh capaz disso tu vai cai https://t.co/tM46VHFlO5"zre:^https?://.*\.pngZGifsZgiphz)r^   r_   r`   ra   rd   rb   rc   r8   r7   zAccount suspended)r   rk   ri   Úexpected_warningsrx   z6https://twitter.com/starwars/status/665052190608723968Z665052190608723968zyStar Wars - A new beginning is coming December 18. Watch the official 60 second #TV spot for #StarWars: #TheForceAwakens.z…A new beginning is coming December 18. Watch the official 60 second #TV spot for #StarWars: #TheForceAwakens. https://t.co/OkSqT2fjWJZstarwarsz	Star Warsi¼�EVro   )r^   r_   r`   ra   rc   rb   rf   rg   z<https://twitter.com/BTNBrentYarina/status/705235433198714880rq   rr   rs   ru   rt   rv   rw   Úskip_downloadT)r   ri   Úparamsz8https://twitter.com/jaydingeer/status/700207533655363584Z700207533655363584z/simon vetugo - BEAT PROD: @suhmeduh #DamndanielzQBEAT PROD: @suhmeduh  https://t.co/HBrQ4AfpvZ #Damndaniel https://t.co/byBooq2ejZzsimon vetugoZsimonvertugog      >@i³fÅVZ20160218)
r^   r_   r`   ra   rd   rb   rc   re   rf   rg   z7https://twitter.com/Filmdrunk/status/713801302971588609Z 89a15ed345d13b86e9a5a5e051fa308aZMIOxnrUteUdu@   Dr.Pepperã�®é£²ã�¿æ–¹ #japanese #ãƒ�ã‚« #ãƒ‰ã‚¯ãƒš #é›»å‹•ã‚¬ãƒ³ZTAKUMAZ1004126642786242560i‚o�SZ20140615)r^   r_   r`   rb   rc   rf   rg   rp   rm   z<https://twitter.com/captainamerica/status/719944021058060289Z719944021058060289z[Captain America - @King0fNerd Are you sure you made the right choice? Find out in theaters.za@King0fNerd Are you sure you made the right choice? Find out in theaters. https://t.co/GpgYi9xMJIZCaptainAmericazCaptain Americag\�Âõ(\	@i½3WZ20160412)	r^   r_   r`   ra   rc   rb   re   rf   rg   z5https://twitter.com/OPP_HSD/status/779210622571536384Z1zqKVVlkqLaKBzqSgt Kerry Schmidt - Ontario Provincial Police - Road rage, mischief, assault, rollover and fire in one occurrenceZ20160923Z1PmKqpJdOJQoYz-Sgt Kerry Schmidt - Ontario Provincial PoliceiÞÏäW)r^   r_   r`   rg   rc   rb   rf   Ú	Periscope)r   ri   rn   z9https://twitter.com/news_al3alm/status/852138619213144067Z852138619213144067uæ   Ø¹Ø§Ù„Ù… Ø§Ù„Ø£Ø®Ø¨Ø§Ø± - ÙƒÙ„Ù…Ø© ØªØ§Ø±ÙŠØ®ÙŠØ© Ø¨Ø¬Ù„Ø³Ø© Ø§Ù„Ø¬Ù†Ø§Ø³ÙŠ Ø§Ù„ØªØ§Ø±ÙŠØ®ÙŠØ©.. Ø§Ù„Ù†Ø§Ø¦Ø¨ Ø®Ø§Ù„Ø¯ Ù…Ø¤Ù†Ø³ Ø§Ù„Ø¹ØªÙŠØ¨ÙŠ Ù„Ù„Ù…Ø¹Ø§Ø±Ø¶ÙŠÙ† : Ø§ØªÙ‚ÙˆØ§ Ø§Ù„Ù„Ù‡ .. Ø§Ù„Ø¸Ù„Ù… Ø¸Ù„Ù…Ø§Øª ÙŠÙˆÙ… Ø§Ù„Ù‚ÙŠØ§Ù…Ø©uæ   ÙƒÙ„Ù…Ø© ØªØ§Ø±ÙŠØ®ÙŠØ© Ø¨Ø¬Ù„Ø³Ø© Ø§Ù„Ø¬Ù†Ø§Ø³ÙŠ Ø§Ù„ØªØ§Ø±ÙŠØ®ÙŠØ©.. Ø§Ù„Ù†Ø§Ø¦Ø¨ Ø®Ø§Ù„Ø¯ Ù…Ø¤Ù†Ø³ Ø§Ù„Ø¹ØªÙŠØ¨ÙŠ Ù„Ù„Ù…Ø¹Ø§Ø±Ø¶ÙŠÙ† : Ø§ØªÙ‚ÙˆØ§ Ø§Ù„Ù„Ù‡ .. Ø§Ù„Ø¸Ù„Ù… Ø¸Ù„Ù…Ø§Øª ÙŠÙˆÙ… Ø§Ù„Ù‚ÙŠØ§Ù…Ø©   https://t.co/xg6OhpyKfNu   Ø¹Ø§Ù„Ù… Ø§Ù„Ø£Ø®Ø¨Ø§Ø±Znews_al3almgfffffVq@i�îXÚ20170412)	r^   r_   r`   ra   rb   rc   re   rf   rg   z3https://twitter.com/i/web/status/910031516746514432Z910031516746514432u›   PrÃ©fet de Guadeloupe - [Direct] #Maria Le centre se trouve actuellement au sud de Basse-Terre. Restez confinÃ©s. RÃ©fugiez-vous dans la piÃ¨ce la + sÃ»re.u›   [Direct] #Maria Le centre se trouve actuellement au sud de Basse-Terre. Restez confinÃ©s. RÃ©fugiez-vous dans la piÃ¨ce la + sÃ»re. https://t.co/mwx01Rs4lou   PrÃ©fet de GuadeloupeZ	Prefet971g=
×£p½G@iƒ¼ÀYZ20170919)
r^   r_   r`   rd   ra   rb   rc   re   rf   rg   z8https://twitter.com/LisPower1/status/1001551623938805763Z1001551623938805763z re:.*?Shep is on a roll today.*?z$md5:37b9f2ff31720cef23b2bd42ee8a0f09z	Lis PowerZ	LisPower1goƒÀÊÑ[@iA¯[Z20180529z5https://twitter.com/foobar/status/1087791357756956680Z1087791357756956680zÁTwitter - A new is coming.  Some of you got an opt-in to try it now. Check out the emoji button, quick keyboard shortcuts, upgraded trends, advanced search, and more. Let us know your thoughts!z$md5:6dfd341a3310fb97d80d2bf7145df976r[   gj¼t“ÈN@iDlG\Z20190122z<https://twitter.com/ViviEducation/status/1136534865145286656Z1vOGwqejwoWxBzjVivi - Vivi founder @lior_rauchy announcing our new student feedback tool live at @EduTECH_AU #EduTECH2019ZViviZ1eVjYOLGkGrQL)r^   r_   r`   rb   rc   ZTwitterBroadcastz5https://twitter.com/GunB1g/status/1163218564784017422ry   c                    sà  |   |¡}|  d| |ddddddœ¡}|d  dd	¡ }}t d
d|¡}| d¡pVi }| d¡}|rrd||f }| d¡}g }	t|dd„ tƒp’g D ]}
|
 d¡}|s¨q”|	 |¡ q”||||t	| d¡ƒ||rÖd| nd t
| d¡ƒt
| d¡ƒt
| d¡ƒ| d¡�rdnd|	dœ}t|dd„ ƒ}|�r
| d¡dk�r
| d¡�pHi }g }| dg ¡D ]}| |  ||¡¡ �qZ|  |¡ g ‰| d ¡�p–| d!¡‰ˆ�rè‡‡fd"d#„}| d$i ¡ ¡ D ]\}}|||ƒ �q¼|d%| d&¡�päi ƒ | |ˆt| d'¡d(ƒd)œ¡ �nÒ| d*¡}|�r°|d+ ‰ ‡ fd,d-„}|d  d.¡d/ }|d0k�r0|d1k}|�r`|d2ƒn|d3ƒ}|d4|�rv|nd5 ƒ}|  ||�pŒ|¡}|  |¡ g ‰d6D ]p}|d7| ƒ�p¶i }| d8¡}|�r¢d9|k�rÖ�q¢ˆ |�rì|dd … nd:|t
| d;¡ƒt
| d<¡ƒd=œ¡ �q¢| |ˆt
|d>ƒƒd)œ¡ n~|d5k�rP| d8|d?ƒd@œ¡ n^|dAk�r€| d8|d8ƒ�pp|d?ƒt ¡ dBœ¡ n.|dCk�r¦| d8|dDƒt ¡ dBœ¡ ntdEƒ‚n,t|dFd„ ƒ}|�sÌtdGƒ‚| d8|d@œ¡ |S )HNzstatuses/show/%s.jsonzWeb-12r   r   Úextended)Zcards_platformZinclude_cardsZinclude_reply_countZinclude_user_entitiesZ
tweet_modeZ	full_textÚ
ú z\s+(https?://[^ ]+)r   ÚuserÚnamez%s - %sZscreen_namec                 S   s   | d d S )NÚentitiesZhashtagsr*   ©Úxr*   r*   r+   Ú<lambda>–  rB   z)TwitterIE._real_extract.<locals>.<lambda>ÚtextÚ
created_atzhttps://twitter.com/Zfavorite_countZretweet_countZreply_countZpossibly_sensitiver…   )r^   r`   ra   rb   rf   rc   Úuploader_urlÚ
like_countÚrepost_countÚcomment_countr†   Útagsc                 S   s   | d d d S )NZextended_entitiesÚmediar   r*   r’   r*   r*   r+   r”   «  rB   ÚtypeÚphotoÚ
video_infoÚvariantsZmedia_url_httpsÚ	media_urlc              	      sJ   ˆ  | tˆ d| iƒt| d¡p&| d¡ƒt| d¡p<| d¡ƒdœ¡ d S )Nr�   Úwr7   Úhr8   ©r^   r   r7   r8   )r0   r   r   r"   )r�   Úsize)r¡   Ú
thumbnailsr*   r+   Úadd_thumbnail·  s    üz.TwitterIE._real_extract.<locals>.add_thumbnailÚsizesÚorigZoriginal_infoZduration_millisr   )r3   r¦   re   ÚcardÚbinding_valuesc                    s   ˆ   | ¡pi }t|dd„ ƒS )Nc                 S   s   | | d   ¡ d  S )Nr�   Ú_value)Úlowerr’   r*   r*   r+   r”   Î  rB   zDTwitterIE._real_extract.<locals>.get_binding_value.<locals>.<lambda>)r"   r   )ÚkÚo)r«   r*   r+   Úget_binding_valueÌ  s    z2TwitterIE._real_extract.<locals>.get_binding_valueú:éÿÿÿÿ)ÚamplifyZpromo_video_websiter³   Zamplify_url_vmapZplayer_stream_urlz%s_content_idÚplayer)Z_smallr   Z_largeZ_x_largeZ	_originalZplayer_imager   z/player-placeholderÚmediumr7   r8   r¤   Zcontent_duration_secondsÚ
player_url)Ú_typer   Zperiscope_broadcast)r·   r   r~   Ú	broadcastÚbroadcast_urlzUnsupported Twitter Card.c                 S   s   | d d d d S )Nr‘   r4   r   Úexpanded_urlr*   r’   r*   r*   r+   r”   ÿ  rB   zThere's no video in this tweet.)r{   rT   Úreplacer:   Úsubr"   r   Úlistr0   r   r   r1   r,   Ú_sort_formatsÚitemsr<   r   Úsplitr6   r   r~   ÚTwitterBroadcastIEr   )r%   r   ZtwidÚstatusr`   ra   r�   rb   rc   r›   ÚhashtagZhashtag_textÚinforœ   rŸ   r3   r&   r§   r�   r¥   rª   r°   Z	card_nameZ
is_amplifyr2   Ú
content_idÚsuffixÚimageÚ	image_urlrº   r*   )r«   r¡   r¦   r+   r   �  sà    
 ûÿ	


ô
ý



üÿý

þ

ý

ý

þzTwitterIE._real_extractNr€   r*   r*   r*   r+   r}   »   sd  
õþù	óøþø ýôöþù	ô÷þù	õ÷ýö ÿòö ÿñöþûöýý€ Ä Cr}   c                   @   s2   e Zd ZdZdZddddddd	œd
œZdd„ ZdS )ÚTwitterAmplifyIEztwitter:amplifyz1https?://amp\.twimg\.com/v/(?P<id>[0-9a-f\-]{36})z<https://amp.twimg.com/v/0ba0c3c7-0af3-4c0a-bed5-7efd1ffa2951Z 7df102d0b9fd7066b86f3159f8e81bf6z$0ba0c3c7-0af3-4c0a-bed5-7efd1ffa2951r   úTwitter Videozre:^https?://.*)r^   r_   r`   rd   rj   c                    s¤   ˆ   |¡}ˆ  ||¡‰ˆ  dˆd¡}ˆ  ||¡}g }ˆ jdˆddd�}‡ ‡fdd„}|rv|d	ƒ\}}	| |||	d
œ¡ |dƒ\}
}|d  |
|dœ¡ |d||dœS )Nztwitter:amplify:vmapzvmap urlztwitter:image:srcrd   F©r   c                    s8   t ˆ jd|  ˆdd�ƒ}t ˆ jd|  ˆdd�ƒ}||fS )Nztwitter:%s:widthFrË   ztwitter:%s:height)r   Ú_html_search_meta)Útargetr¢   r£   ©r%   Úwebpager*   r+   Ú_find_dimension$  s      ÿ  ÿz7TwitterAmplifyIE._real_extract.<locals>._find_dimensionrÇ   )r   r7   r8   r´   r   r9   rÊ   )r^   r`   r3   r¦   )r{   Ú_download_webpagerÌ   r6   r0   r<   )r%   r   r'   r2   r3   r¦   rd   rÐ   Zthumbnail_wZthumbnail_hZvideo_wZvideo_hr*   rÎ   r+   r     sB    
  ÿ   ÿýþüzTwitterAmplifyIE._real_extractN)rU   rV   rW   r�   r‚   Ú_TESTr   r*   r*   r*   r+   rÉ   	  s   üýrÉ   c                   @   s"   e Zd ZdZejd Zdd„ ZdS )rÁ   ztwitter:broadcastz$i/broadcasts/(?P<id>[0-9a-zA-Z]{13})c                 C   s¶   |   |¡}|  d|d|i¡d | }|  ||¡}|d }|  d| |¡d }| d¡p\|d }d	|krn|  ¡  tt|ƒjƒ d
d g¡d }|  |¡\}	}
}|  	||||	|
|¡|d< |S )Nzbroadcasts/show.jsonÚidsÚ
broadcastsÚ	media_keyzlive_video_stream/status/ÚsourceZnoRedirectPlaybackUrlÚlocationz/live_video_stream/geoblocked/r�   r   r3   )
r{   rT   Ú_parse_broadcast_datar"   Úraise_geo_restrictedr   r	   rE   Ú_extract_common_format_infoÚ_extract_pscp_m3u8_formats)r%   r   Úbroadcast_idr¸   rÄ   rÕ   rÖ   Úm3u8_urlr   Ústater7   r8   r*   r*   r+   r   E  sN    
 þþþ ÿÿÿ ÿÿ     ÿz TwitterBroadcastIE._real_extractN)rU   rV   rW   r�   r   rX   r‚   r   r*   r*   r*   r+   rÁ   A  s   
rÁ   )Ú
__future__r   r:   Úcommonr   Úcompatr   r   r   r	   Úutilsr
   r   r   r   r   r   r   r   r   Ú	periscoper   r   r   rZ   r}   rÉ   rÁ   r*   r*   r*   r+   Ú<module>   s   ,DX  P8