Ë
    ÖÉ�jW¨  ã                   ó"  — 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 d dlmZmZmZ d dlZddlmZmZmZ ddlmZmZmZ ddlmZ  ej8                  e«      ZdZdZ d	Z!d
Z" ejF                  «       Z$ ejF                  «       Z% e
jL                  «       Z' G d„ dejP                  «      Z)de*dejV                  fd„Z,de*ddfd„Z-dedede.de/fd„Z0de.de.de1e2   fd„Z3de/deg df   de4e2e/f   dee2   dee2   de.de2de4edf   fd „Z5d!dd"e4e2e/f   de4edf   fd#„Z6d$e1d%   de.ddfd&„Z7d'e2ddfd(„Z8d)edefd*„Z9d'e2ddfd+„Z: G d,„ d%«      Z; G d-„ de jx                  «      Z= G d.„ d/«      Z> G d0„ d1e>«      Z? G d2„ d3«      Z@y)4é    N)ÚCallable)ÚOptionalÚUnionÚcasté   )ÚmdnsÚstunÚturn)Ú	CandidateÚcandidate_foundationÚcandidate_priority)Úrandom_stringé   é   é   c                   ó   — e Zd ZdZ	 dZy)ÚTransportPolicyr   r   N)Ú__name__Ú
__module__Ú__qualname__ÚALLÚRELAY© ó    úK/home/uftp/webrtc-recorder/.venv/lib/python3.12/site-packages/aioice/ice.pyr   r   #   s   „ Ø
€Cðð €Eðr   r   Ú
subscriberÚreturnc              ƒ   ó  K  — t        t        d«      s;t        j                  «       t        _        d t        _        t        «       t        _        t        j                  4 ƒd {  –—†  t        j
                  €%t        j                  «       ƒ d {  –—† t        _        t        j                  j                  | «       d d d «      ƒd {  –—†  t        j
                  S 7 Œx7 ŒN7 Œ# 1 ƒd {  –—†7  sw Y   t        j
                  S xY w­w©NÚlock)ÚhasattrÚ_mdnsÚasyncioÚLockr    ÚprotocolÚsetÚsubscribersr   Úcreate_mdns_protocolÚadd©r   s    r   Úget_or_create_mdns_protocolr+   1   s±   è ø€ Ü”5˜&Ô!Ü—\‘\“^ŒŒ
ØŒŒÜ›EŒÔÜ�z‰z÷ *ñ *Ü�>‰>Ð!Ü#'×#<Ñ#<Ó#>×>ŒEŒNÜ×Ñ×Ñ˜jÔ)÷*÷ *ô �>‰>Ðð	*øà>øð*ø÷ *÷ *ð *ô �>‰>ÐüsZ   ‚A DÁ"CÁ#DÁ&(C!ÂCÂ,C!Â;DÃCÃDÃC!ÃDÃ!DÃ'C*Ã(DÃ/Dc              ƒ   ó–  K  — t        t        d«      ršt        j                  4 ƒd {  –—†  t        j                  j	                  | «       t        j
                  rAt        j                  s1t        j
                  j                  «       ƒ d {  –—†  d t        _        d d d «      ƒd {  –—†  y y 7 Œ†7 Œ#7 Œ
# 1 ƒd {  –—†7  sw Y   y xY w­wr   )r!   r"   r    r'   Údiscardr%   Úcloser*   s    r   Úunref_mdns_protocolr/   =   s–   è ø€ ÜŒu�fÔÜ—:‘:÷ 	&ñ 	&Ü×Ñ×%Ñ% jÔ1Ü�~Š~¤e×&7Ò&7Ü—n‘n×*Ñ*Ó,×,Ð,Ø!%””÷		&÷ 	&ð 	&ð ð	&øð -øð	&ø÷ 	&÷ 	&ñ 	&üsW   ‚%C	§B.¨C	«A!B4ÂB0ÂB4ÂC	Â'B2Â(C	Â0B4Â2C	Â4CÂ:B=Â;CÃC	ÚlocalÚremoteÚice_controllingc                 óÔ   — |xr | j                   xs |j                   }|xr |j                   xs | j                   }dt        ||«      z  dt        ||«      z  z   ||kD  xr dxs dz   S )zJ
    See RFC 5245 - 5.7.2. Computing Pair Priority and Ordering Pairs
    l        r   r   r   )ÚpriorityÚminÚmax)r0   r1   r2   ÚGÚDs        r   Úcandidate_pair_priorityr9   F   sd   € ð 	Ò*˜EŸN™NÒ=¨f¯o©o€AØÒ+˜FŸO™OÒ=¨u¯~©~€AØ”s˜1˜a“yÑ  1¤s¨1¨a£y¡=Ñ0°A¸±E²K¸aÒ4DÀ1ÑEÐEr   Úuse_ipv4Úuse_ipv6c                 óz  — g }t        j                  «       D ]¡  }|j                  D ]�  }t        |j                  t
        «      r-| r+|j                  dk7  r|j                  |j                  «       ŒJ|sŒM|j                  d   dk7  sŒ`|j                  d   dk(  sŒs|j                  |j                  d   «       Œ’ Œ£ |S )z!
    Get local IP addresses.
    z	127.0.0.1r   z::1r   )ÚifaddrÚget_adaptersÚipsÚ
isinstanceÚipÚstrÚappend)r:   r;   Ú	addressesÚadapterrA   s        r   Úget_host_addressesrF   Q   sŸ   € ð €IÜ×&Ñ&Ó(ò +ˆØ—+‘+ò 	+ˆBÜ˜"Ÿ%™%¤Ô%©(°r·u±uÀÒ7KØ× Ñ  §¡Õ'Ú˜bŸe™e A™h¨%Ó/°B·E±E¸!±HÀ³MØ× Ñ  §¡ q¡Õ*ñ		+ð+ð Ðr   Ú	componentÚprotocol_factoryÚStunProtocolÚturn_serverÚturn_usernameÚturn_passwordÚturn_sslÚturn_transportc              ƒ   ó\  K  — t        j                  ||||||¬«      ƒ d{  –—† \  }}|j                  j                  d«      }	|j                  j                  d«      }
t	        t        dd|	d   «      | dt        | d«      |	d   |	d   d|
d   |
d   ¬	«	      |_        |j                  |fS 7 Œˆ­w)
zA
    Connect to a TURN server to obtain a relayed candidate.
    )Úserver_addrÚusernameÚpasswordÚsslÚ	transportNÚsocknameÚrelated_addressÚrelayÚudpr   r   ©	Ú
foundationrG   rT   r4   ÚhostÚportÚtyperV   Úrelated_port)r
   Úcreate_turn_endpointrT   Úget_extra_infor   r   r   Úlocal_candidate)rG   rH   rJ   rK   rL   rM   rN   Ú_r%   Úcandidate_addressrV   s              r   Úrelayed_candidaterd   _   sÍ   è ø€ ô ×1Ñ1ØØØØØØ ô÷ �K€A€xð !×*Ñ*×9Ñ9¸*ÓEÐØ×(Ñ(×7Ñ7Ð8IÓJ€OÜ(Ü'¨°Ð8IÈ!Ñ8LÓMØØÜ# I¨wÓ7Ø˜qÑ!Ø˜qÑ!ØØ'¨Ñ*Ø$ QÑ'ô
 €HÔð ×#Ñ# XÐ-Ð-ð/ús   ‚B,¡B*¢B	B,r%   Ústun_serverc              ƒ   óŒ  K  — t        j                  «       }|j                  dt        j                  |d   «      ƒ d{  –—† |d   f}t        j                  t
        j                  j                  t
        j                  j                  ¬«      }| j                  ||«      ƒ d{  –—† \  }}| j                  }t        t        dd|j                  «      |j                   |j"                  t%        |j                   d«      |j&                  d   d   |j&                  d   d   d|j                  |j(                  ¬«	      dfS 7 �Œ7 Œ�­w)	zC
    Query STUN server to obtain a server-reflexive candidate.
    Nr   r   ©Úmessage_methodÚmessage_classÚsrflxrX   úXOR-MAPPED-ADDRESSrY   )r#   Úget_event_loopÚrun_in_executorÚsocketÚgethostbynamer	   ÚMessageÚMethodÚBINDINGÚClassÚREQUESTÚrequestra   r   r   r[   rG   rT   r   Ú
attributesr\   )r%   re   Úloopru   Úresponserb   ra   s          r   Úserver_reflexive_candidatery   †   s&  è ø€ ô ×!Ñ!Ó#€Dà×"Ñ" 4¬×)=Ñ)=¸{È1¹~ÓN×NØ�A‰ð€Kô �l‰lÜ—{‘{×*Ñ*¼$¿*¹*×:LÑ:Lô€Gð !×(Ñ(¨°+Ó>×>�K€Hˆaà×.Ñ.€OÜÜ'¨°¸×8LÑ8LÓMØ!×+Ñ+Ø!×+Ñ+Ü# O×$=Ñ$=¸wÓGØ× Ñ Ð!5Ñ6°qÑ9Ø× Ñ Ð!5Ñ6°qÑ9ØØ'×,Ñ,Ø$×)Ñ)ô
ð ð
ð 
ð 	Oùð ?ús#   ‚<E¾D?¿A%EÂ$EÂ%BEÅEÚpairsÚCandidatePairc                 óN   ‡— dt         dt        fˆfd„}| j                  |¬«       y)z)
    Sort a list of candidate pairs.
    Úpairr   c                 óH   •— t        | j                  | j                  ‰«       S ©N)r9   ra   Úremote_candidate)r}   r2   s    €r   Úpair_priorityz+sort_candidate_pairs.<locals>.pair_priority¬   s(   ø€ Ü'Ø× Ñ  $×"7Ñ"7¸ó
ð 
ð 	
r   ©ÚkeyN)r{   ÚintÚsort)rz   r2   r�   s    ` r   Úsort_candidate_pairsr†   §   s&   ø€ ð

œMð 
¬cõ 
ð
 
‡J�J�=€JÕ!r   Úvaluec                 óF   — t        j                  d| «      st        d«      ‚y)zk
    Check the password is well-formed.

    See RFC 5245 - 15.4. "ice-ufrag" and "ice-pwd" Attributes
    z^[a-zA-Z0-9+/]{22,256}$z$Password must satisfy 22*256ice-charN©ÚreÚmatchÚ
ValueError©r‡   s    r   Úvalidate_passwordrŽ   ´   s$   € ô �8‰8Ð-¨uÔ5ÜÐ?Ó@Ð@ð 6r   Ú	candidatec                 ó�   — | j                   dvrt        d| j                   z  «      ‚t        j                  | j                  «       | S )z2
    Check the remote candidate is supported.
    )r[   rW   rj   zUnexpected candidate type "%s")r]   rŒ   Ú	ipaddressÚ
ip_addressr[   )r�   s    r   Úvalidate_remote_candidater“   ¾   s>   € ð ‡~�~Ð7Ñ7ÜÐ9¸I¿N¹NÑJÓKÐKÜ×Ñ˜Ÿ™Ô(ØÐr   c                 óF   — t        j                  d| «      st        d«      ‚y)zk
    Check the username is well-formed.

    See RFC 5245 - 15.4. "ice-ufrag" and "ice-pwd" Attributes
    z^[a-zA-Z0-9+/]{4,256}$z#Username must satisfy 4*256ice-charNr‰   r�   s    r   Úvalidate_usernamer•   È   s$   € ô �8‰8Ð,¨eÔ4ÜÐ>Ó?Ð?ð 5r   c                   óÂ   — e Zd Zdddeddfd„Zdefd„Zedefd„«       Z	ede
eef   fd	„«       Zedefd
„«       Zede
eef   fd„«       Z G d„ dej                  «      Zy)r{   r%   rI   r€   r   Nc                 óˆ   — d | _         d| _        || _        || _        d| _        t
        j                  j                  | _        y )NF)	ÚtaskÚ	nominatedr%   r€   Úremote_nominatedr{   ÚStateÚFROZENÚstate)Úselfr%   r€   s      r   Ú__init__zCandidatePair.__init__Ó   s:   € Ø,0ˆŒ	ØˆŒØ ˆŒØ 0ˆÔØ %ˆÔÜ"×(Ñ(×/Ñ/ˆ�
r   c                 ó<   — d| j                   ›d| j                  ›d�S )NzCandidatePair(z -> ú))Ú
local_addrÚremote_addr©rž   s    r   Ú__repr__zCandidatePair.__repr__Û   s   � Ø,0¯O«O¸T×=MÓ=MÐNÐNr   c                 ó.   — | j                   j                  S r   )ra   rG   r¤   s    r   rG   zCandidatePair.componentÞ   s   € à×#Ñ#×-Ñ-Ð-r   c                 óZ   — | j                   j                  | j                   j                  fS r   )ra   r[   r\   r¤   s    r   r¢   zCandidatePair.local_addrâ   s%   € à×$Ñ$×)Ñ)¨4×+?Ñ+?×+DÑ+DÐEÐEr   c                 ó.   — | j                   j                  S r   )r%   ra   r¤   s    r   ra   zCandidatePair.local_candidateæ   s   € à�}‰}×,Ñ,Ð,r   c                 óZ   — | j                   j                  | j                   j                  fS r   )r€   r[   r\   r¤   s    r   r£   zCandidatePair.remote_addrê   s%   € à×%Ñ%×*Ñ*¨D×,AÑ,A×,FÑ,FÐGÐGr   c                   ó    — e Zd ZdZdZdZdZdZy)úCandidatePair.Stater   r   r   é   é   N)r   r   r   rœ   ÚWAITINGÚIN_PROGRESSÚ	SUCCEEDEDÚFAILEDr   r   r   r›   r«   î   s   „ ØˆØˆØˆØˆ	Ø‰r   r›   )r   r   r   r   rŸ   rB   r¥   Úpropertyr„   rG   Útupler¢   ra   r£   ÚenumÚEnumr›   r   r   r   r{   r{   Ò   s½   „ ð0 ð 0À9ð 0ÐQUó 0ðO˜#ó Oð ð.˜3ò .ó ð.ð ðF˜E # s (™Oò Fó ðFð ð- ò -ó ð-ð ðH˜U 3¨ 8™_ò Hó ðHô�—	‘	õ r   c                   ób  — e Zd Zdd„Zdeddfd„Zdej                  ddfd„Zde	e
ef   d	eddfd
„Zdeddfd„Zdd„Z	 	 ddej"                  d	eeef   dee
   dee   deej"                  eeef   f   f
d„Zde
d	eeef   ddfd„Zdej"                  d	eeef   ddfd„Zdededdfd„Zdefd„Zy)rI   r   Nc                 ó–   — t        j                  «       | _        t        t        «      | _        d | _        || _        d | _        i | _	        y r   )
r#   ÚFutureÚ_StunProtocol__closedÚnextÚprotocol_idÚidra   ÚreceiverrT   Útransactions)rž   r½   s     r   rŸ   zStunProtocol.__init__÷   s:   € Ü.5¯n©nÓ.>ˆŒÜ”{Ó#ˆŒØ48ˆÔØ ˆŒØ>BˆŒØ;=ˆÕr   Úexcc                 óÌ   — | j                  d|«       | j                  j                  «       s8| j                  j	                  d d «       | j                  j                  d«       y y )Nzconnection_lost(%s)T)Ú_StunProtocol__log_debugr¹   Údoner½   Údata_receivedÚ
set_result©rž   r¿   s     r   Úconnection_lostzStunProtocol.connection_lostÿ   sN   € Ø×ÑÐ.°Ô4Ø�}‰}×!Ñ!Ô#Ø�M‰M×'Ñ'¨¨dÔ3Ø�M‰M×$Ñ$ TÕ*ð $r   rT   c                 óf   — | j                  d|«       t        t        j                  |«      | _        y )Nzconnection_made(%s))rÁ   r   r#   ÚDatagramTransportrT   )rž   rT   s     r   Úconnection_madezStunProtocol.connection_made  s'   € Ø×ÑÐ.°	Ô:Üœg×7Ñ7¸ÓCˆ�r   ÚdataÚaddrc                 ó¸  — |d   |d   f}t        t        |«      }	 t        j                  |«      }| j	                  d||«       |j                  t        j                  j                  k(  s'|j                  t        j                  j                  k(  rD|j                  | j                  v r,| j                  |j                     }|j!                  ||«       y |j                  t        j                  j"                  k(  r| j                  j%                  ||| |«       y y # t
        $ r3 | j                  j                  || j                  j                  «       Y y w xY w)Nr   r   z< %s %s)r   Úbytesr	   Úparse_messagerÁ   rŒ   r½   rÃ   ra   rG   ri   rs   ÚRESPONSEÚERRORÚtransaction_idr¾   Úresponse_receivedrt   Úrequest_received)rž   rÊ   rË   ÚmessageÚtransactions        r   Údatagram_receivedzStunProtocol.datagram_received	  s  € à�Q‘˜˜a™Ð!ˆÜ”E˜4Ó ˆð	Ü×(Ñ(¨Ó.ˆGØ×Ñ˜Y¨¨gÔ6ð ×!Ñ!¤T§Z¡Z×%8Ñ%8Ò8Ø×$Ñ$¬¯
©
×(8Ñ(8Ò8Ø×$Ñ$¨×(9Ñ(9Ñ9Ø×+Ñ+¨G×,BÑ,BÑCˆKØ×)Ñ)¨'°4Õ8Ø×"Ñ"¤d§j¡j×&8Ñ&8Ò8Ø�M‰M×*Ñ*¨7°D¸$ÀÕEð 9øô ò 	Ø�M‰M×'Ñ'¨¨d×.BÑ.B×.LÑ.LÔMÙð	ús   œ(D Ä9EÅEc                 ó(   — | j                  d|«       y )Nzerror_received(%s))rÁ   rÅ   s     r   Úerror_receivedzStunProtocol.error_received  s   € Ø×ÑÐ-¨sÕ3r   c              ƒ   ól   K  — | j                   j                  «        | j                  ƒ d {  –—†  y 7 Œ­wr   )rT   r.   r¹   r¤   s    r   r.   zStunProtocol.close#  s#   è ø€ Ø�‰×ÑÔØ�m‰m×Òús   ‚*4¬2­4ru   Úintegrity_keyÚretransmissionsc              ƒ   ód  K  — |j                   | j                  vsJ ‚|�|j                  |«       t        j                  ||| |¬«      }|| j                  |j                   <   	 |j                  «       ƒ d{  –—† | j                  |j                   = S 7 Œ# | j                  |j                   = w xY w­w)zE
        Execute a STUN transaction and return the response.
        N)rÛ   )rÑ   r¾   Úadd_message_integrityr	   ÚTransactionÚrun)rž   ru   rË   rÚ   rÛ   rÕ   s         r   ru   zStunProtocol.request'  s¨   è ø€ ð ×%Ñ%¨T×->Ñ->Ñ>Ð>Ð>àÐ$Ø×)Ñ)¨-Ô8ä×&Ñ&Ø�T˜4°ô
ˆð 5@ˆ×Ñ˜'×0Ñ0Ñ1ð	:Ø$Ÿ™Ó*×*à×!Ñ! '×"8Ñ"8Ñ9ð +ùà×!Ñ! '×"8Ñ"8Ñ9üs0   ‚A B0Á#B Á6BÁ7B Á:B0ÂB ÂB-Â-B0c              ƒ   óD   K  — | j                   j                  ||«       y ­wr   )rT   Úsendto)rž   rÊ   rË   s      r   Ú	send_datazStunProtocol.send_data?  s   è ø€ Ø�‰×Ñ˜d DÕ)ùs   ‚ rÔ   c                 ót   — | j                  d||«       | j                  j                  t        |«      |«       y)z&
        Send a STUN message.
        z> %s %sN)rÁ   rT   rá   rÍ   )rž   rÔ   rË   s      r   Ú	send_stunzStunProtocol.send_stunB  s.   € ð 	×Ñ˜ D¨'Ô2Ø�‰×Ñœe G›n¨dÕ3r   ÚmsgÚargsc                 óN   — t        j                  d|z   | j                  | g|¢­Ž  y )Nz%s %s )ÚloggerÚdebugr½   ©rž   rå   ræ   s      r   Ú__log_debugzStunProtocol.__log_debugI  s   € Ü�‰�X ‘^ T§]¡]°DÐ@¸4Ô@r   c                 ó    — d| j                   z  S )Nzprotocol(%s))r¼   r¤   s    r   r¥   zStunProtocol.__repr__L  s   € Ø §¡Ñ'Ð'r   )r½   Ú
Connectionr   N©r   N©NN)r   r   r   rŸ   Ú	ExceptionrÆ   r#   ÚBaseTransportrÉ   r   rÍ   rB   r³   rÖ   rØ   r.   r	   rp   r„   r   ru   râ   rä   ÚobjectrÁ   r¥   r   r   r   rI   rI   ö   sN  „ ó>ð+ 9ð +°ó +ðD¨×)>Ñ)>ð DÀ4ó DðF e¨E°3¨JÑ&7ð F¸uð FÈó Fð*4 )ð 4°ó 4ó
ð *.Ø)-ñ:à—‘ð:ð �C˜�H‰oð:ð   ‘ð	:ð
 " #™ð:ð 
ˆt�|‰|˜U 3¨ 8™_Ð,Ñ	-ó:ð0* Eð *°°s¸C°x±ð *ÀTó *ð4 §¡ð 4°U¸3À¸8±_ð 4Èó 4ðA˜sð A¨6ð A°dó Að(˜#ô (r   c                   ó   — e Zd Zy)ÚConnectionEventN©r   r   r   r   r   r   rô   rô   P  ó   „ Ør   rô   c                   ó   — e Zd Zy)ÚConnectionClosedNrõ   r   r   r   rø   rø   T  rö   r   rø   c                   óÐ  — e Zd ZdZdddddddddej
                  ddfdeded	ee	e
ef      d
ee	e
ef      dee
   dee
   dede
dedededee
   dee
   ddfd„Zedee   fd„«       Zede
fd„«       Zede
fd„«       Zedee   fd„«       Zdee   ddfd„ZdLd„Zdedee   fd„ZdLd„ZdLd „Zdee   fd!„Zdefd"„Zde	eef   fd#„Zd$eddfd%„Zd$ededdfd&„Zded'e
d(e
ddfd)„Zd*e d+ede!jD                  fd,„Z#d*e ddfd-„Z$d.e!jD                  d/e	e
ef   d0e%ddfd1„Z&defd2„Z'd*e ddfd3„Z(d*e ddfd4„Z)d*e d5e jT                  ddfd6„Z+d7eddfd8„Z,d0e%dedee    fd9„Z-	 dMded:ee
   d;edee   fd<„Z.dLd=„Z/dLd>„Z0d$ee   dee   ddfd?„Z1d.e!jD                  d/e	e
ef   d0e%d@eddf
dA„Z2dBe!jD                  d/e	e
ef   d0e%dCe	ee
f   ddf
dD„Z3dLdE„Z4deddfdF„Z5dLdG„Z6dHe
dIe7ddfdJ„Z8de
fdK„Z9y)Nrí   aÍ  
    An ICE connection for a single media stream.

    :param ice_controlling: Whether the local peer has the controlling role.
    :param components: The number of components.
    :param stun_server: The address of the STUN server or `None`.
    :param turn_server: The address of the TURN server or `None`.
    :param turn_username: The username for the TURN server.
    :param turn_password: The password for the TURN server.
    :param turn_ssl: Whether to use TLS for the TURN server.
    :param turn_transport: The transport for TURN server, `"udp"` or `"tcp"`.
    :param use_ipv4: Whether to use IPv4 candidates.
    :param use_ipv6: Whether to use IPv6 candidates.
    :param transport_policy: Transport policy.
    :param local_username: An optional local username, otherwise a random one
                           will be generated.
    :param local_password: An optional local password, otherwise a random one
                           will be generated.
    r   NFrX   Tr2   Ú
componentsre   rJ   rK   rL   rM   rN   r:   r;   Útransport_policyÚlocal_usernameÚlocal_passwordr   c                 óZ  — || _         |€t        d«      }nt        |«       |€t        d«      }nt        |«       d| _        d | _        d | _        || _        || _        || _	        || _
        || _        || _        d| _        t        t        d|dz   «      «      | _        g | _        d| _        t'        j(                  «       | _        g | _        d| _        d | _        t3        t4        «      | _        g | _        d| _        d| _        || _        || _         i | _!        t        «       | _"        g | _#        g | _$        d| _%        d | _&        t'        j(                  «       | _'        tQ        jR                  d«      | _*        |	| _+        |
| _,        |€ |€|tZ        j\                  k(  rt_        d«      ‚|| _0        y )Nr­   é   Fr   é@   z:Relay transport policy requires a STUN and/or TURN server.)1r2   r   r•   rŽ   Úremote_is_liteÚremote_usernameÚremote_passwordre   rJ   rK   rL   rM   rN   Ú_closedr&   ÚrangeÚ_componentsÚ_check_listÚ_check_list_doner#   ÚQueueÚ_check_list_stateÚ_early_checksÚ_early_checks_doneÚ_event_waiterrº   Úconnection_idÚ_idÚ_local_candidatesÚ_local_candidates_endÚ_local_candidates_startÚ_local_passwordÚ_local_usernameÚ
_nominatedÚ_nominatingÚ
_protocolsÚ_remote_candidatesÚ_remote_candidates_endÚ_query_consent_taskÚ_queueÚsecretsÚrandbitsÚ_tie_breakerÚ	_use_ipv4Ú	_use_ipv6r   r   rŒ   Ú_transport_policy)rž   r2   rú   re   rJ   rK   rL   rM   rN   r:   r;   rû   rü   rý   s                 r   rŸ   zConnection.__init__m  s°  € ð   /ˆÔàÐ!Ü*¨1Ó-‰Nä˜nÔ-àÐ!Ü*¨2Ó.‰Nä˜nÔ-ð $ˆÔà.2ˆÔà.2ˆÔà&ˆÔØ&ˆÔØ*ˆÔØ*ˆÔØ ˆŒØ,ˆÔð ˆŒÜœu Q¨
°Q©Ó7Ó8ˆÔØ02ˆÔØ %ˆÔÜ07·±³ˆÔð ð 	Ôð #(ˆÔØHLˆÔÜœÓ&ˆŒØ24ˆÔØ%*ˆÔ"Ø',ˆÔ$Ø-ˆÔØ-ˆÔØ46ˆŒÜ%(£UˆÔØ.0ˆŒØ35ˆÔØ&+ˆÔ#Ø;?ˆÔ ä�M‰M‹Oð 	Œô $×,Ñ,¨RÓ0ˆÔØ!ˆŒØ!ˆŒð ÐØÐ#Ø ¤O×$9Ñ$9Ò9äØLóð ð "2ˆÕr   c                 ó    — | j                   dd S )zS
        Local candidates, automatically set by :meth:`gather_candidates`.
        N)r  r¤   s    r   Úlocal_candidateszConnection.local_candidatesÀ  s   € ð
 ×%Ñ%¡aÐ(Ð(r   c                 ó   — | j                   S )z;
        Local password, set at construction time.
        )r  r¤   s    r   rý   zConnection.local_passwordÇ  ó   € ð
 ×#Ñ#Ð#r   c                 ó   — | j                   S )z;
        Local username, set at construction time.
        )r  r¤   s    r   rü   zConnection.local_usernameÎ  r%  r   c                 ó    — | j                   dd S )zk
        Remote candidates, which you need to populate using
        :meth:`add_remote_candidate`.
        N)r  r¤   s    r   Úremote_candidateszConnection.remote_candidatesÕ  s   € ð ×&Ñ&¡qÐ)Ð)r   r€   c              ƒ   óÄ  K  — | j                   rt        d«      ‚|€| j                  «        d| _         yt        j                  |j
                  «      r¯t        | «      ƒ d{  –—† }|j                  |j
                  «      ƒ d{  –—† }|€ | j                  d|j
                  › d�«       y| j                  d|j
                  › d|› �«       t        j                  |«      }||_        | j                  |«      ƒ d{  –—†  y	 t        |«       | j                  j                  |«       | j                  D ]X  }|j                  j!                  |«      sŒ| j#                  ||«      rŒ2t%        ||«      }| j&                  j                  |«       ŒZ | j)                  «        y7 �Œ@7 �Œ 7 Œª# t        $ r+}| j                  d|j
                  › d|› �«       Y d}~yd}~ww xY w­w)zÃ
        Add a remote candidate or signal end-of-candidates.

        To signal end-of-candidates, pass `None`.

        :param remote_candidate: A :class:`Candidate` instance or `None`.
        z4Cannot add remote candidate after end-of-candidates.NTzRemote candidate "z" could not be resolvedz" resolved to z" is not valid: )r  rŒ   Ú_prune_componentsr   Úis_mdns_hostnamer[   r+   ÚresolveÚ_Connection__log_infoÚcopyÚadd_remote_candidater“   r  rC   r  ra   Úcan_pair_withÚ
_find_pairr{   r  Úsort_check_list)rž   r€   Úmdns_protocolr£   Úcopy_candidateÚer%   r}   s           r   r/  zConnection.add_remote_candidateÝ  sÕ  è ø€ ð ×&Ò&ÜÐSÓTÐTð Ð#Ø×"Ñ"Ô$Ø*.ˆDÔ'Øô × Ñ Ð!1×!6Ñ!6Ô7Ü"=¸dÓ"C×CˆMØ -× 5Ñ 5Ð6F×6KÑ6KÓ L×LˆKØÐ"Ø—‘Ø(Ð)9×)>Ñ)>Ð(?Ð?VÐWôð Ø�O‰OØ$Ð%5×%:Ñ%:Ð$;¸>È+ÈÐWôô "ŸY™YÐ'7Ó8ˆNØ"-ˆNÔØ×+Ñ+¨NÓ;×;Ð;Øð	Ü%Ð&6Ô7ð 	×Ñ×&Ñ&Ð'7Ô8ð Ÿ™ò 	.ˆHØ×'Ñ'×5Ñ5Ø õà—o‘o hÐ0@ÕAÜ$ XÐ/?Ó@�Ø× Ñ ×'Ñ'¨Õ-ð	.ð 	×ÑÕðC DùØLùð <ùô ò 	Ø�O‰OØ$Ð%5×%:Ñ%:Ð$;Ð;KÈAÈ3ÐOôô ûð		üsn   ‚AG Á!F!Á""G ÂF$ÂA7G Ã<F'Ã=G ÄF) ÄAG ÅG Å';G Æ$G Æ'G Æ)	GÆ2!GÇG ÇGÇG c              ƒ   óN  K  — | j                   sŽd| _         t        | j                  | j                  ¬«      }| j                  D �cg c]  }| j                  ||¬«      ‘Œ }}t        j                  |Ž ƒ d{  –—† D ]  }| xj                  |z  c_        Œ d| _	        yyc c}w 7 Œ,­w)zt
        Gather local candidates.

        You **must** call this coroutine before calling :meth:`connect`.
        T)r:   r;   )rG   rD   N)
r  rF   r  r   r  Úget_component_candidatesr#   Úgatherr  r  )rž   rD   rG   ÚcorosÚ
candidatess        r   Úgather_candidateszConnection.gather_candidates  sª   è ø€ ð ×+Ò+Ø+/ˆDÔ(Ü*ØŸ™°$·.±.ôˆIð
 "&×!1Ñ!1öàð ×-Ñ-¸	ÈYÐ-ÕWðˆEð ô %,§N¡N°EÐ$:×:ò 5�
Ø×&Ò&¨*Ñ4Ö&ð5à)-ˆDÕ&ð ,ùò
ð ;ús   ‚AB%ÁBÁB%Á6B#Á7-B%rG   c                 ód   — t        | j                  d„ ¬«      D ]  }|j                  |k(  sŒ|c S  y)z�
        Get the default local candidate for the specified component.

        :param component: The component whose default candidate is requested.
        c                 ó   — | j                   S r   )r4   ©Úxs    r   ú<lambda>z2Connection.get_default_candidate.<locals>.<lambda>,  s
   € ÀaÇjÁj€ r   r‚   N)Úsortedr  rG   )rž   rG   r�   s      r   Úget_default_candidatez Connection.get_default_candidate&  s:   € ô   × 6Ñ 6Ñ<PÔQò 	!ˆIØ×"Ñ" iÓ/Ø Ò ð	!ð r   c              ƒ   óÆ  K  — | j                   st        d«      ‚| j                  �| j                  €t        d«      ‚| j                  D ]i  }| j
                  D ]X  }|j                  j                  |«      sŒ| j                  ||«      rŒ2t        ||«      }| j                  j                  |«       ŒZ Œk | j                  «        | j                  «        | j                  D ]  } | j                  |Ž  Œ g | _        d| _        	 | j#                  «       snt%        j&                  d«      ƒ d{  –—†  Œ/| j                  r#| j(                  j+                  «       ƒ d{  –—† }nt,        }| j                  D ])  }|j.                  sŒ|j.                  j1                  «        Œ+ |t2        k7  rt        d«      ‚t%        j4                  | j7                  «       «      | _        y7 Œ¯7 Œ‚­w)z¡
        Perform ICE handshake.

        This coroutine returns if a candidate pair was successfuly nominated
        and raises an exception otherwise.
        z,Local candidates gathering was not performedNz&Remote username or password is missingTg{®Gáz”?zICE negotiation failed)r  ÚConnectionErrorr  r  r  r  ra   r0  r1  r{   r  rC   r2  Ú_unfreeze_initialr  Úcheck_incomingr  Úcheck_periodicr#   Úsleepr
  ÚgetÚ
ICE_FAILEDr˜   ÚcancelÚICE_COMPLETEDÚcreate_taskÚquery_consentr  )rž   r€   r%   r}   Úearly_checkÚresÚchecks          r   ÚconnectzConnection.connect1  sÂ  è ø€ ð ×)Ò)Ü!Ð"PÓQÐQà×ÑÐ'¨4×+?Ñ+?Ð+GÜ!Ð"JÓKÐKð !%× 7Ñ 7ò 	2ÐØ ŸO™Oò 2�Ø×+Ñ+×9Ñ9Ø$õàŸ/™/¨(Ð4DÕEÜ(¨Ð3CÓD�DØ×$Ñ$×+Ñ+¨DÕ1ñ2ð	2ð 	×ÑÔà×ÑÔ ð  ×-Ñ-ò 	.ˆKØˆD×Ñ Ò-ð	.àˆÔØ"&ˆÔð Ø×&Ñ&Ô(ØÜ—-‘- Ó%×%Ð%ð ð ×ÒØ×.Ñ.×2Ñ2Ó4×4‰CäˆCð ×%Ñ%ò 	$ˆEØ�z‹zØ—
‘
×!Ñ!Õ#ð	$ð ”-ÒÜ!Ð":Ó;Ð;ô $+×#6Ñ#6°t×7IÑ7IÓ7KÓ#LˆÕ ð# &øð 5ús8   ‚A4G!Á7G!Â
B#G!Ä-GÄ..G!ÅGÅ&G!ÆAG!ÇG!c              ƒ   óÒ  K  — | j                   rI| j                   j                  «       s/| j                   j                  «        	 | j                   ƒ d{  –—†  | j
                  r+| j                  s| j                  j                  t        «       t        | «      ƒ d{  –—†  | j                  j                  «        | j                  D ]  }|j                  «       ƒ d{  –—†  Œ | j                  j                  «        | j                  j                  «        | j                   s!| j#                  t%        «       «       d| _        yy7 Œó# t        j                  $ r Y �Œw xY w7 ŒÅ7 Œ†­w)z'
        Close the connection.
        NT)r  rÂ   rK  r#   ÚCancelledErrorr  r  r
  Ú
put_nowaitrJ  r/   r  Úclearr  r.   r  r  Ú_emit_eventrø   )rž   r%   s     r   r.   zConnection.closeg  s#  è ø€ ð
 ×#Ò#¨D×,DÑ,D×,IÑ,IÔ,KØ×$Ñ$×+Ñ+Ô-ðØ×.Ñ.×.Ð.ð
 ×Ò D×$9Ò$9Ø×"Ñ"×-Ñ-¬jÔ9ô " $Ó'×'Ð'à�‰×ÑÔØŸ™ò 	#ˆHØ—.‘.Ó"×"Ñ"ð	#à�‰×ÑÔØ×Ñ×$Ñ$Ô&ð �|Š|Ø×ÑÔ-Ó/Ô0ØˆD�Lð ð% /ùÜ×)Ñ)ò Úðúð 	(øð #ús]   ‚AE'ÁE	 ÁEÁE	 ÁAE'ÂE#ÂA E'ÃE%ÃA(E'ÅE	 Å	E ÅE'ÅE Å E'Å%E'c              ƒ   óî   K  — | j                   �J d«       ‚| j                  ryt        j                  «       }|j	                  «       | _         t        j
                  | j                   «      ƒ d{  –—† S 7 Œ­w)z¢
        Return the next `ConnectionEvent` or `None` if the connection is
        already closed.

        This method may only be called once at a time.
        Nzalready awaiting event)r  r  r#   rl   Úcreate_futureÚshield)rž   rw   s     r   Ú	get_eventzConnection.get_event…  sd   è ø€ ð ×!Ñ!Ð)ÐCÐ+CÓCÐ)Ø�<Š<ØÜ×%Ñ%Ó'ˆØ!×/Ñ/Ó1ˆÔÜ—^‘^ D×$6Ñ$6Ó7×7Ð7Ð7ús   ‚A,A5Á.A3Á/A5c              ƒ   óH   K  — | j                  «       ƒ d{  –—† \  }}|S 7 Œ	­w)zÈ
        Receive the next datagram.

        The return value is a `bytes` object representing the data received.

        If the connection is not established, a `ConnectionError` is raised.
        N)Úrecvfrom©rž   rÊ   rG   s      r   ÚrecvzConnection.recv“  s$   è ø€ ð !%§¡£×/‰ˆˆiØˆð 0ús   ‚"– —
"c              ƒ   ó¶   K  — t        | j                  «      st        d«      ‚| j                  j	                  «       ƒ d{  –—† }|d   €t        d«      ‚|S 7 Œ­w)aD  
        Receive the next datagram.

        The return value is a `(bytes, component)` tuple where `bytes` is a
        bytes object representing the data received and `component` is the
        component on which the data was received.

        If the connection is not established, a `ConnectionError` is raised.
        z"Cannot receive data, not connectedNr   z$Connection lost while receiving data)Úlenr  rD  r  rI  )rž   Úresults     r   r]  zConnection.recvfromž  sS   è ø€ ô �4—?‘?Ô#Ü!Ð"FÓGÐGà—{‘{—‘Ó(×(ˆØ�!‰9ÐÜ!Ð"HÓIÐIØˆð )ús   ‚>AÁ AÁArÊ   c              ƒ   óD   K  — | j                  |d«      ƒ d{  –—†  y7 Œ­w)z²
        Send a datagram on the first component.

        If the connection is not established, a `ConnectionError` is raised.

        :param data: The data to be sent.
        r   N)rá   )rž   rÊ   s     r   ÚsendzConnection.send°  s   è ø€ ð �k‰k˜$ Ó"×"Ò"ús   ‚ ˜™ c              ƒ   ó¼   K  — | j                   j                  |«      }|r/|j                  j                  ||j                  «      ƒ d{  –—†  yt        d«      ‚7 Œ­w)zù
        Send a datagram on the specified component.

        If the connection is not established, a `ConnectionError` is raised.

        :param data: The data to be sent.
        :param component: The component on which to send the data.
        NzCannot send data, not connected)r  rI  r%   râ   r£   rD  )rž   rÊ   rG   Úactive_pairs       r   rá   zConnection.sendtoº  sS   è ø€ ð —o‘o×)Ñ)¨)Ó4ˆÙØ×&Ñ&×0Ñ0°°{×7NÑ7NÓO×OÑOä!Ð"CÓDÐDð Pús   ‚AAÁ	AÁ
AÚlocal_foundationÚremote_foundationc                 ó@  — d}| j                   D ]9  }|j                  j                  |k(  sŒ|j                  j                  |k(  sŒ7|} n d}| j                  D ]$  }|j                  |k(  sŒ|j                  |k(  sŒ#|}Œ& |r|sJ ‚t        ||«      | j                  |<   y)z©
        Force the selected candidate pair.

        If the remote party does not support ICE, you should using this
        instead of calling :meth:`connect`.
        N)r  ra   rG   rZ   r  r{   r  )rž   rG   rg  rh  r%   Úpr€   Úcs           r   Úset_selected_pairzConnection.set_selected_pairÉ  s¬   € ð ˆØ—‘ò 	ˆAà×!Ñ!×+Ñ+¨yÓ8Ø×%Ñ%×0Ñ0Ð4DÓDà�Ùð	ð  ÐØ×(Ñ(ò 	%ˆAØ�{‰{˜iÓ'¨A¯L©LÐ<MÓ,MØ#$Ñ ð	%ñ Ñ,Ð,Ð,Ü%2°8Ð=MÓ%Nˆ�‰˜	Ò"r   r}   Únominatec                 óÐ  — | j                   ›d| j                  ›�}t        j                  t        j                  j
                  t        j                  j                  ¬«      }||j                  d<   t        |j                  d«      |j                  d<   | j                  r,| j                  |j                  d<   |rd |j                  d<   |S | j                  |j                  d<   |S )	Nú:rg   ÚUSERNAMEÚprflxÚPRIORITYúICE-CONTROLLINGúUSE-CANDIDATEúICE-CONTROLLED)r  rü   r	   rp   rq   rr   rs   rt   rv   r   rG   r2   r  )rž   r}   rm  Útx_usernameru   s        r   Úbuild_requestzConnection.build_requestç  sÄ   € Ø!%×!5Ó!5°t×7JÒ7JÐKˆÜ—,‘,ÜŸ;™;×.Ñ.¼d¿j¹j×>PÑ>Pô
ˆð *5ˆ×Ñ˜:Ñ&Ü);¸D¿N¹NÈGÓ)Tˆ×Ñ˜:Ñ&Ø×ÒØ48×4EÑ4EˆG×ÑÐ0Ñ1ÙØ6:�×"Ñ" ?Ñ3ð ˆð 48×3DÑ3DˆG×ÑÐ/Ñ0Øˆr   c                 ó’  — d |_         |j                  t        j                  j                  k(  �r»|j
                  r¯|| j                  |j                  <   | j                  D ]‡  }|j                  |j                  k(  sŒ|j                  t        j                  j                  t        j                  j                  fv sŒ^| j                  |t        j                  j                  «       Œ‰ t        | j                  «      t        | j                  «      k(  rD| j                  s7| j!                  d«       | j"                  j%                  t&        «       d| _        y | j                  D ]‚  }|j(                  j*                  |j(                  j*                  k(  sŒ1|j                  t        j                  j                  k(  sŒY| j                  |t        j                  j                  «       Œ„ | j                  D ]D  }|j                  t        j                  j                  t        j                  j                  fvsŒD y  | j,                  s:| j                  D ]+  }|j                  t        j                  j                  k(  sŒ+ y  | j                  s8| j!                  d«       | j"                  j%                  t.        «       d| _        y y )NzICE completedTz
ICE failed)r˜   r�   r{   r›   r°   r™   r  rG   r  r®   rœ   Úcheck_stater±   ra  r  r  r-  r
  rU  rL  ra   rZ   r2   rJ  )rž   r}   rj  s      r   Úcheck_completezConnection.check_completeö  s-  € ØˆŒ	à�:‰:œ×,Ñ,×6Ñ6Ó6Ø�~Š~Ø26�—‘ §¡Ñ/ð ×)Ñ)ò H�AØ—{‘{ d§n¡nÓ4¸¿¹Ü%×+Ñ+×3Ñ3Ü%×+Ñ+×2Ñ2ðEò :ð ×(Ñ(¨¬M×,?Ñ,?×,FÑ,FÕGðHô �4—?‘?Ó#¤s¨4×+;Ñ+;Ó'<Ò<Ø×,Ò,Ø—O‘O OÔ4Ø×*Ñ*×5Ñ5´mÔDØ,0�DÔ)Øð ×%Ñ%ò E�à×%Ñ%×0Ñ0°D×4HÑ4H×4SÑ4SÓSØŸ™¤=×#6Ñ#6×#=Ñ#=Ó=à×$Ñ$ Q¬×(;Ñ(;×(CÑ(CÕDðEð ×!Ñ!ò 	ˆAØ�w‰wÜ×#Ñ#×-Ñ-Ü×#Ñ#×*Ñ*ðò ñ ð	ð ×#Ò#Ø×%Ñ%ò �Ø—7‘7œm×1Ñ1×;Ñ;Ó;Ùðð ×$Ò$Ø�O‰O˜LÔ)Ø×"Ñ"×-Ñ-¬jÔ9Ø$(ˆDÕ!ð %r   rÔ   rË   r%   c           	      óÀ  — |j                   j                  }d}| j                  D ]<  }|j                  |d   k(  sŒ|j                  |d   k(  sŒ)|}|j                  |k(  sJ ‚ n |€[t        t        d«      |d|j                  d   |d   |d   d¬«      }| j                  j                  |«       | j                  d	|«       | j                  ||«      }|€Vt        ||«      }t        j                  j                  |_        | j                  j                  |«       | j!                  «        |j                  t        j                  j                  t        j                  j"                  fv r| j%                  |«       d
|j                  v rU| j&                  sHd|_        |j                  t        j                  j*                  k(  rd|_        | j/                  |«       yyyy)z4
        Handle a succesful incoming check.
        Nr   r   é
   rX   rr  rq  ©rZ   rG   rT   r4   r[   r\   r]   z&Discovered peer reflexive candidate %srt  T)ra   rG   r  r[   r\   r   r   rv   rC   r-  r1  r{   r›   r®   r�   r  r2  r±   Úcheck_start_taskr2   rš   r°   r™   rz  )rž   rÔ   rË   r%   rG   r€   rk  r}   s           r   rF  zConnection.check_incoming,  sÁ  € ð ×,Ñ,×6Ñ6ˆ	ð  ÐØ×(Ñ(ò 	ˆAØ�v‰v˜˜a™Ó  Q§V¡V¨t°A©wÓ%6Ø#$Ð Ø'×1Ñ1°YÒ>Ð>Ð>Ùð		ð
 Ð#ä(Ü(¨Ó,Ø#ØØ ×+Ñ+¨JÑ7Ø˜!‘WØ˜!‘WØô Ðð ×#Ñ#×*Ñ*Ð+;Ô<Ø�O‰OÐDÐFVÔWð �‰˜xÐ)9Ó:ˆØˆ<Ü  Ð+;Ó<ˆDÜ&×,Ñ,×4Ñ4ˆDŒJØ×Ñ×#Ñ# DÔ)Ø× Ñ Ô"ð �:‰:œ-×-Ñ-×5Ñ5´}×7JÑ7J×7QÑ7QÐRÑRØ×!Ñ! $Ô'ð ˜g×0Ñ0Ñ0¸×9MÒ9MØ$(ˆDÔ!à�z‰zœ]×0Ñ0×:Ñ:Ò:Ø!%�”Ø×#Ñ# DÕ)ð ;ð :NÐ0r   c                 ób  — | j                   D ]<  }|j                  t        j                  j                  k(  sŒ+| j                  |«        y | j                   D ]<  }|j                  t        j                  j                  k(  sŒ+| j                  |«        y | j                  s| j                   S y)NTF)	r  r�   r{   r›   r®   r~  rœ   r  r  ©rž   r}   s     r   rG  zConnection.check_periodic]  s�   € à×$Ñ$ò 	ˆDØ�z‰zœ]×0Ñ0×8Ñ8Ó8Ø×%Ñ% dÔ+Ùð	ð ×$Ñ$ò 	ˆDØ�z‰zœ]×0Ñ0×7Ñ7Ó7Ø×%Ñ% dÔ+Ùð	ð ×*Ò*Ø×,Ñ,Ð,Ð,àr   c              ƒ   óî  K  — | j                  |t        j                  j                  «       | j                  xr | j
                   }| j                  ||¬«      }	 |j                  j                  ||j                  | j                  j                  d«      ¬«      ƒ d{  –—† \  }}||j                  k7  rN| j+                  d|«       | j                  |t        j                  j&                  «       | j)                  |«       y|s|j,                  rd|_        n¿| j                  r³|j0                  | j2                  vr›| j+                  d|«       | j2                  j5                  |j0                  «       | j                  |d¬«      }	 |j                  j                  ||j                  | j                  j                  d«      ¬«      ƒ d{  –—†  d|_        | j                  |t        j                  j6                  «       | j)                  |«       y7 �Œv# t        j                  $ rÝ}|j                  rŒ|j                  j                  j!                  dd«      d   dk(  r`d	|j                  v r| j#                  d
¬«       n d|j                  v r| j#                  d¬«       | j%                  |«      ƒ d{  –—†7  cY d}~S | j                  |t        j                  j&                  «       | j)                  |«       Y d}~yd}~ww xY w7 �Œ># t        j                  $ rP | j+                  d|«       | j                  |t        j                  j&                  «       | j)                  |«       Y yw xY w­w)z!
        Starts a check.
        ©rm  Úutf8©rÚ   Nú
ERROR-CODErï   r   éç  rs  F©r2   ru  Tz)Check %s failed : source address mismatchzCheck %s nominating pairz)Check %s failed : could not nominate pair)ry  r{   r›   r¯   r2   r  rw  r%   ru   r£   r  Úencoder	   ÚTransactionErrorrx   rv   rI  Úswitch_roleÚcheck_startr±   rz  r-  rš   r™   rG   r  r)   r°   )rž   r}   rm  ru   rx   rË   r¿   s          r   r‹  zConnection.check_startp  sî  è ø€ ð 	×Ñ˜œ}×2Ñ2×>Ñ>Ô?à×'Ñ'ÒC°×0CÑ0CÐ,CˆØ×$Ñ$ T°HÐ$Ó=ˆð	Ø#'§=¡=×#8Ñ#8ØØ× Ñ Ø"×2Ñ2×9Ñ9¸&ÓAð $9ó $÷ ‰NˆH�dð, �4×#Ñ#Ò#Ø�O‰OÐGÈÔNØ×Ñ˜T¤=×#6Ñ#6×#=Ñ#=Ô>Ø×Ñ Ô%Øñ �t×,Ò,à!ˆD�NØ×!Ò! d§n¡n¸D×<LÑ<LÑ&Là�O‰OÐ6¸Ô=Ø×Ñ× Ñ  §¡Ô0Ø×(Ñ(¨¸Ð(Ó=ˆGð
Ø—m‘m×+Ñ+ØØ×$Ñ$Ø"&×"6Ñ"6×"=Ñ"=¸fÓ"Eð ,ó ÷ ð ð "ˆDŒNØ×Ñ˜œ}×2Ñ2×<Ñ<Ô=Ø×Ñ˜DÕ!ðeúô
 ×$Ñ$ò 	ð —’Ø—L‘L×+Ñ+×/Ñ/°¸lÓKÈAÑNÐRUÒUà$¨×(:Ñ(:Ñ:Ø×$Ñ$°UÐ$Õ;Ø%¨×);Ñ);Ñ;Ø×$Ñ$°TÐ$Ô:Ø!×-Ñ-¨dÓ3×3Ð3Õ3à× Ñ  ¤}×':Ñ':×'AÑ'AÔBØ×#Ñ# DÔ)Üûð	úðBúô
 ×(Ñ(ò Ø—‘Ð KÈTÔRØ× Ñ  ¤}×':Ñ':×'AÑ'AÔBØ×#Ñ# DÔ)Ùð	üsœ   ‚AM5ÁAH Â HÂ!H Â(C!M5Æ
AL ÇLÇL ÇAM5ÈH ÈL	È,BLÊ9J<Ê:LÊ>L	Ê?M5Ë;LË?M5ÌL	Ì	M5ÌL ÌA M2Í/M5Í1M2Í2M5c                 óp   — |j                   €*t        j                  | j                  |«      «      |_         yy)zC
        Starts a check in a task, unless already started.
        N)r˜   r#   rM  r‹  r€  s     r   r~  zConnection.check_start_task­  s0   € ð �9‰9ÐÜ×+Ñ+¨D×,<Ñ,<¸TÓ,BÓCˆD�Ið r   r�   c                 óN   — | j                  d||j                  |«       ||_        y)z/
        Updates the state of a check.
        zCheck %s %s -> %sN)r-  r�   )rž   r}   r�   s      r   ry  zConnection.check_state´  s"   € ð 	�‰Ð+¨T°4·:±:¸uÔEØˆ�
r   Úeventc                 óf   — | j                   �%| j                   }d | _         |j                  |«       y y r   )r  rÄ   )rž   rŽ  Úwaiters      r   rW  zConnection._emit_event»  s4   € Ø×ÑÐ)Ø×'Ñ'ˆFØ!%ˆDÔØ×Ñ˜eÕ$ð *r   c                 ól   — | j                   D ]%  }|j                  |k(  sŒ|j                  |k(  sŒ#|c S  y)z:
        Find a candidate pair in the check list.
        N)r  r%   r€   )rž   r%   r€   r}   s       r   r1  zConnection._find_pairÁ  s=   € ð ×$Ñ$ò 	ˆDØ�}‰} Ó(¨T×-BÑ-BÐFVÓ-VØ’ð	ð r   rD   Útimeoutc              ƒ   ó$  ‡ K  — g }t        j                  «       }g }|D �]  }	 |j                  ˆ fd„|df¬«      ƒ d {  –—† \  }}	|j                  d«      }
|
�=|
j	                  t
        j                  t
        j                  t        j                  «       |j                  |	«       |	j                  j                  d«      }t        t        dd|d   «      |dt!        |d«      |d   |d	   d¬
«      |	_        ‰ j$                  t&        j(                  k(  sŒ÷|j                  |	j"                  «       �Œ ‰ xj*                  |z  c_        g }‰ j,                  rv|D ]q  }	t/        j0                  |	j"                  j2                  «      j4                  dk(  sŒ:|j                  t        j6                  t9        |	‰ j,                  «      «      «       Œs ‰ j:                  ri|j                  t        j6                  t=        |ˆ fd„‰ j:                  ‰ j>                  ‰ j@                  ‰ jB                  ‰ jD                  ¬«      «      «       tG        |«      r“t        jH                  ||¬«      ƒ d {  –—† \  }}|D ]U  }|jK                  «       �Œ|jM                  «       \  }}	|j                  |«       |	€Œ;‰ j*                  j                  |	«       ŒW |D ]  }|jO                  «        Œ |S 7 �Œ£# t        $ r}‰ j                  d||«       Y d }~�Œèd }~ww xY w7 Œ§­w)Nc                  ó   •— t        ‰ «      S r   ©rI   r¤   s   €r   r@  z5Connection.get_component_candidates.<locals>.<lambda>Ø  s   ø€ œL¨Ó.€ r   r   )r¢   rn   zCould not bind to %s - %srU   r[   rX   r   r}  r­   c                  ó   •— t        ‰ «      S r   r•  r¤   s   €r   r@  z5Connection.get_component_candidates.<locals>.<lambda>  s   ø€ ´¸dÓ1C€ r   )rG   rH   rJ   rK   rL   rM   rN   )r’  )(r#   rl   Úcreate_datagram_endpointr`   Ú
setsockoptrn   Ú
SOL_SOCKETÚ	SO_RCVBUFr
   ÚUDP_SOCKET_BUFFER_SIZEÚOSErrorr-  rC   rT   r   r   r   ra   r!  r   r   r  re   r‘   r’   r[   ÚversionrM  ry   rJ   rd   rK   rL   rM   rN   ra  ÚwaitÚ	exceptionrb  rK  )rž   rG   rD   r’  r:  rw   Úhost_protocolsÚaddressrT   r%   Úsockr¿   rc   ÚtasksrÂ   Úpendingr˜   r�   s   `                 r   r7  z#Connection.get_component_candidatesÌ  s×  øè ø€ ð ˆ
Ü×%Ñ%Ó'ˆð ˆØ ó 	<ˆGðØ,0×,IÑ,IÛ.¸GÀQ¸<ð -Jó -÷ 'Ñ#�	˜8ð !×/Ñ/°Ó9�ØÐ#Ø—O‘OÜ×)Ñ)¬6×+;Ñ+;¼T×=XÑ=Xôð ×!Ñ! (Ô+ð !)× 2Ñ 2× AÑ AÀ*Ó MÐÜ'0Ü/°¸Ð?PÐQRÑ?SÓTØ#ØÜ+¨I°vÓ>Ø& qÑ)Ø& qÑ)Øô(ˆHÔ$ð ×%Ñ%¬×)<Ñ)<Ó<Ø×!Ñ! (×":Ñ":Ö;ð9	<ð: 	�Š˜>Ñ)�àNPˆð ×ÒØ*ò �Ü×'Ñ'¨×(@Ñ(@×(EÑ(EÓF×NÑNÐRSÓSØ—L‘LÜ×+Ñ+Ü6°xÀ×AQÑAQÓRóõðð ×ÒØ�L‰LÜ×#Ñ#Ü%Ø"+Û)CØ$(×$4Ñ$4Ø&*×&8Ñ&8Ø&*×&8Ñ&8Ø!%§¡Ø'+×':Ñ':ôó
ôô ˆuŒ:Ü")§,¡,¨u¸gÔ"F×F‰MˆD�'Øò 9�Ø—>‘>Ó#Ñ+Ø*.¯+©+«-Ñ'�I˜xØ×%Ñ% iÔ0ØÑ+ØŸ™×.Ñ.¨xÕ8ð9ð  ò �Ø—‘•ðð ÐðI'úô ò Ø—‘Ð ;¸WÀcÔJÝûðúðd Gúsf   ƒL£K$¾K!¿AK$ÂA>LÄA<LÆCLÉ&LÉ'LÊ&LÊ+6LË!K$Ë$	LË-LÌ LÌLÌLc                 óž   — t        t        d„ | j                  «      «      }| j                  |z
  }|r| j	                  d|z  «       || _        yy)zœ
        Remove components for which the remote party did not provide any candidates.

        This can only be determined after end-of-candidates.
        c                 ó   — | j                   S r   )rG   r>  s    r   r@  z.Connection._prune_components.<locals>.<lambda>#  s
   € ¨A¯K©K€ r   z%Components %s have no candidate pairsN)r&   Úmapr  r  r-  )rž   Úseen_componentsÚmissing_componentss      r   r*  zConnection._prune_components  sT   € ô œcÑ"7¸×9PÑ9PÓQÓRˆØ!×-Ñ-°Ñ?ÐÙØ�O‰OØ7Ð:LÑLôð  /ˆDÕð	 r   c              ƒ   óF  K  — d}	 t        j                  t        ddt        j                  «       z  z   z  «      ƒ d{  –—†  | j                  j                  «       D ]�  }| j                  |d¬«      }	 |j                  j                  ||j                  | j                  j                  d«      d¬«      ƒ d{  –—†  d}|t        k\  sŒm| j                  d
«       d| _        | j#                  «       ƒ d{  –—† c S  Œ÷7 Œ¿7 ŒF# t        j                  $ r |d	z  }Y Œ\w xY w7 Œ*­w)z8
        Periodically check consent (RFC 7675).
        r   gš™™™™™é?gš™™™™™Ù?NFr‚  rƒ  )rÚ   rÛ   r   zConsent to send expired)r#   rH  ÚCONSENT_INTERVALÚrandomr  Úvaluesrw  r%   ru   r£   r  rˆ  r	   r‰  ÚCONSENT_FAILURESr-  r  r.   )rž   Úfailuresr}   ru   s       r   rN  zConnection.query_consent+  s  è ø€ ð ˆØä—-‘-Ô 0°C¸#ÄÇÁÃÑ:OÑ4OÑ PÓQ×QÐQàŸ™×.Ñ.Ó0ò .�Ø×,Ñ,¨T¸EÐ,ÓB�ð	"ØŸ-™-×/Ñ/ØØ×(Ñ(Ø&*×&:Ñ&:×&AÑ&AÀ&Ó&IØ()ð	 0ó ÷ ð ð  !�Hð Ô/Ó/Ø—O‘OÐ$=Ô>Ø/3�DÔ,Ø!%§¡£×-Ò-ð.ð	 àQøð
ùô ×,Ñ,ò "Ø ‘M’Hð"úð
 .úsX   ‚;D!½C=¾4D!Á3ADÂ8C?Â9DÂ?	D!Ã	+D!Ã4DÃ5	D!Ã?DÄDÄD!ÄDÄD!c                 ó>   — | j                   j                  ||f«       y r   )r  rU  r^  s      r   rÃ   zConnection.data_receivedE  s   € Ø�‰×Ñ  iÐ0Õ1r   Úraw_datac                 óL  — |j                   t        j                  j                  k7  r| j	                  |||d«       y 	 t        j
                  || j                  j                  d«      ¬«       | j                  �D| j                  ›d| j                  ›�}|j                  j                  d«      |k7  rt        d«      ‚| j                  rcd|j                  v rU| j                  d«       | j                  |j                  d   k\  r| j	                  |||d	«       y | j!                  d
¬«       nn| j                  sbd|j                  v rT| j                  d«       | j                  |j                  d   k  r| j	                  |||d	«       y | j!                  d¬«       t        j"                  t        j                  j                  t        j$                  j&                  |j(                  ¬«      }||j                  d<   |j+                  | j                  j                  d«      «       |j-                  ||«       | j.                  s+| j0                  s| j2                  j5                  |||f«       y | j7                  |||«       y # t        $ r | j	                  |||d«       Y y w xY w)N)i�  zBad Requestrƒ  r„  ro  rp  zWrong usernamers  z)Role conflict, expected to be controlling)r†  zRole ConflictFr‡  ru  z(Role conflict, expected to be controlledT©rh   ri   rÑ   rk   )rh   r	   rq   rr   Úrespond_errorrÎ   rý   rˆ  r  rü   rv   rI  rŒ   r2   r-  r  rŠ  rp   rs   rÏ   rÑ   rÝ   rä   r  r  r  rC   rF  )rž   rÔ   rË   r%   r±  Úrx_usernamerx   s          r   rÓ   zConnection.request_receivedH  sR  € ð ×!Ñ!¤T§[¡[×%8Ñ%8Ò8Ø×Ñ˜w¨¨hÐ8LÔMØð
	Ü×ÑØ¨×(;Ñ(;×(BÑ(BÀ6Ó(Jõð ×#Ñ#Ð/Ø)-×)<Ó)<¸d×>RÒ>RÐS�Ø×%Ñ%×)Ñ)¨*Ó5¸ÒDÜ$Ð%5Ó6Ð6ð ×ÒÐ$5¸×9KÑ9KÑ$KØ�O‰OÐGÔHØ× Ñ  G×$6Ñ$6Ð7HÑ$IÒIØ×"Ñ" 7¨D°(Ð<RÔSØØ×Ñ¨UÐÕ3Ø×%Ò%Ð*:¸g×>PÑ>PÑ*PØ�O‰OÐFÔGØ× Ñ  7×#5Ñ#5Ð6FÑ#GÒGØ×"Ñ" 7¨D°(Ð<RÔSØØ×Ñ¨TÐÔ2ô —<‘<ÜŸ;™;×.Ñ.ÜŸ*™*×-Ñ-Ø"×1Ñ1ô
ˆð
 59ˆ×ÑÐ0Ñ1Ø×&Ñ& t×':Ñ':×'AÑ'AÀ&Ó'IÔJØ×Ñ˜8 TÔ*à×Ò¨×(?Ò(?Ø×Ñ×%Ñ% w°°hÐ&?Õ@à×Ñ ¨¨xÕ8øô? ò 	Ø×Ñ˜w¨¨hÐ8LÔMÙð	ús   ¾B J ÊJ#Ê"J#ru   Ú
error_codec                 ó"  — t        j                  |j                  t         j                  j                  |j
                  ¬«      }||j                  d<   |j                  | j                  j                  d«      «       |j                  ||«       y )Nr³  r…  rƒ  )r	   rp   rh   rs   rÐ   rÑ   rv   rÝ   rý   rˆ  rä   )rž   ru   rË   r%   r¶  rx   s         r   r´  zConnection.respond_error}  sr   € ô —<‘<Ø"×1Ñ1ÜŸ*™*×*Ñ*Ø"×1Ñ1ô
ˆð
 -7ˆ×Ñ˜LÑ)Ø×&Ñ& t×':Ñ':×'AÑ'AÀ&Ó'IÔJØ×Ñ˜8 TÕ*r   c                 óD   — t        | j                  | j                  «       y r   )r†   r  r2   r¤   s    r   r2  zConnection.sort_check_list�  s   € Ü˜T×-Ñ-¨t×/CÑ/CÕDr   c                 óf   — | j                  d|xr dxs d«       || _        | j                  «        y )NzSwitching to %s roleÚcontrollingÚ
controlled)r-  r2   r2  )rž   r2   s     r   rŠ  zConnection.switch_role�  s3   € Ø�‰Ø" OÒ$E¸Ò$UÈô	
ð  /ˆÔØ×ÑÕr   c                 óÒ  — d }| j                   D ](  }|j                  t        | j                  «      k(  sŒ&|} n |€y |j                  t
        j                  j                  k(  r*| j                  |t
        j                  j                  «       t        |j                  j                  «      }| j                   D ]¬  }|j                  |j                  k(  sŒ|j                  j                  |vsŒ6|j                  t
        j                  j                  k(  sŒ^| j                  |t
        j                  j                  «       |j                  |j                  j                  «       Œ® y r   )r  rG   r5   r  r�   r{   r›   rœ   ry  r®   r&   ra   rZ   r)   )rž   Ú
first_pairr}   Úseen_foundationss       r   rE  zConnection._unfreeze_initial—  s!  € àˆ
Ø×$Ñ$ò 	ˆDØ�~‰~¤ T×%5Ñ%5Ó!6Ó6Ø!�
Ùð	ð ÐØØ×Ñœ}×2Ñ2×9Ñ9Ò9Ø×Ñ˜Z¬×)<Ñ)<×)DÑ)DÔEô ˜z×9Ñ9×DÑDÓEÐØ×$Ñ$ò 	FˆDà—‘ *×"6Ñ"6Ó6Ø×(Ñ(×3Ñ3Ð;KÒKØ—J‘J¤-×"5Ñ"5×"<Ñ"<Ó<à× Ñ  ¤}×':Ñ':×'BÑ'BÔCØ ×$Ñ$ T×%9Ñ%9×%DÑ%DÕEñ	Fr   rå   ræ   c                 ó8   — t        j                  d|z   | g|¢­Ž  y )Nz%s )rè   Úinforê   s      r   Ú
__log_infozConnection.__log_info®  s   € Ü�‰�E˜C‘K Ð-¨Ô-r   c                 ó    — d| j                   z  S )NzConnection(%s))r  r¤   s    r   r¥   zConnection.__repr__±  s   € Ø $§(¡(Ñ*Ð*r   rî   )r   ):r   r   r   Ú__doc__r   r   Úboolr„   r   r³   rB   rŸ   r²   Úlistr   r#  rý   rü   r(  r/  r;  rB  rR  r.   rô   r[  rÍ   r_  r]  rd  rá   rl  r{   r	   rp   rw  rz  rI   rF  rG  r‹  r~  r›   ry  rW  r1  r7  r*  rN  rÃ   rÓ   r´  r2  rŠ  rE  rò   r-  r¥   r   r   r   rí   rí   X  sf  „ ñð. Ø15Ø15Ø'+Ø'+ØØ#ØØØ,;×,?Ñ,?Ø(,Ø(,ñQ2àðQ2ð ðQ2ð ˜e C¨ H™oÑ.ð	Q2ð
 ˜e C¨ H™oÑ.ðQ2ð   ‘}ðQ2ð   ‘}ðQ2ð ðQ2ð ðQ2ð ðQ2ð ðQ2ð *ðQ2ð ! ™ðQ2ð ! ™ðQ2ð 
óQ2ðf ð) $ y¡/ò )ó ð)ð ð$ ò $ó ð$ð ð$ ò $ó ð$ð ð* 4¨	¡?ò *ó ð*ð4¸8ÀIÑ;Nð 4ÐSWó 4ól.ð&	¨sð 	°xÀ	Ñ7Jó 	ó4Mól ð<8 ¨/Ñ!:ó 8ð	˜Eó 	ð  e¨S jÑ 1ó ð$#˜uð #¨ó #ðE ð E°3ð E¸4ó EðOØðOØ03ðOØHKðOà	óOð< -ð ¸4ð ÀDÇLÁLó ð4) =ð 4)°Tó 4)ðl/*Ø—|‘|ð/*Ø+0°°c°©?ð/*ØFRð/*à	ó/*ðb ó ð&;" mð ;"¸ó ;"ðzD ]ð D°tó Dð ð °m×6IÑ6Ið Èdó ð% ð %°Tó %ð	Ø$ð	Ø8Að	à	�-Ñ	 ó	ð DEñOØðOØ)-¨c©ðOØ=@ðOà	ˆi‰óOób/ó.ð42 (¨5¡/ð 2¸hÀs¹mð 2ÐPTó 2ð39à—‘ð39ð �C˜�H‰oð39ð ð	39ð
 ð39ð 
ó39ðj+à—‘ð+ð �C˜�H‰oð+ð ð	+ð
 ˜#˜s˜(‘Oð+ð 
ó+ó Eð¨4ð °Dó óFð..˜cð .¨&ð .°Tó .ð+˜#ô +r   rí   )Ar#   r.  r´   r‘   Ú	itertoolsÚloggingr¬  rŠ   r  rn   Ú	threadingÚcollections.abcr   Útypingr   r   r   r=   Ú r   r	   r
   r�   r   r   r   Úutilsr   Ú	getLoggerr   rè   rL  rJ  r®  r«  Úcountr  r»   r0   r"   rµ   r   rò   ÚMDnsProtocolr+   r/   rÄ  r„   r9   rÅ  rB   rF   r³   rd   ry   r†   rŽ   r“   r•   r{   ÚDatagramProtocolrI   rô   rø   rí   r   r   r   ú<module>rÑ     s]  ðÛ Û Û Û Û Û Û Û 	Û Û Û Ý $ß (Ñ (ã ç Ñ ß JÑ JÝ  à	ˆ×	Ñ	˜8Ó	$€à€Ø€
àÐ ØÐ à�	—‘Ó!€Øˆi�o‰oÓ€àˆ	�‰Ó€ô�d—i‘iô ð	°&ð 	¸T×=NÑ=Nó 	ð&¨&ð &°Tó &ðFØðFØ'ðFØ:>ðFàóFð ð °ð ¸$¸s¹)ó ð$.Øð$.à˜r >Ð1Ñ2ð$.ð �s˜C�x‘ð$.ð ˜C‘=ð	$.ð
 ˜C‘=ð$.ð ð$.ð ð$.ð ˆ9�nÐ$Ñ%ó$.ðNØðØ+0°°c°©?ðà
ˆ9�dˆ?ÑóðB
"  _Ñ 5ð 
"Èð 
"ÐQUó 
"ðA˜Sð A Tó Að¨ð °yó ð@˜Sð @ Tó @÷!ñ !ôHW(�7×+Ñ+ô W(÷t	ñ 	ô	�ô 	÷Z+ò Z+r   