ó
    F\h}|  ã                   ó~  • S SK r S SKrS SKr S SKrSSKJr  SSKJr  SSKJr  SSKJ	r	  SSK
Jr  \b  \R                  \R                  4r " S S	\R                  5      r " S
 S\R                  5      rS rS r " S S\	R(                  \	R*                  5      r " S S\R.                  5      rg! \ a    Sr N©f = f)é    Né   )Ú	constants)Ú
exceptions)Ú	protocols)Ú
transports)Úloggerc                   ó(   • \ rS rSrSrSrSrSrSrSr	g)	ÚSSLProtocolStateé   Ú	UNWRAPPEDÚDO_HANDSHAKEÚWRAPPEDÚFLUSHINGÚSHUTDOWN© N)
Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__r   r   r   r   r   Ú__static_attributes__r   ó    Ú'/usr/lib/python3.13/asyncio/sslproto.pyr
   r
      s   † Ø€IØ!€LØ€GØ€HØƒHr   r
   c                   ó$   • \ rS rSrSrSrSrSrSrg)ÚAppProtocolStateé   Ú
STATE_INITÚSTATE_CON_MADEÚ	STATE_EOFÚSTATE_CON_LOSTr   N)	r   r   r   r   r   r   r   r   r   r   r   r   r   r      s   † ð €JØ%€NØ€IØ%ƒNr   r   c                 óp   • U (       a  [        S5      e[        R                  " 5       nU(       d  SUl        U$ )Nz(Server side SSL needs a valid SSLContextF)Ú
ValueErrorÚsslÚcreate_default_contextÚcheck_hostname)Úserver_sideÚserver_hostnameÚ
sslcontexts      r   Ú_create_transport_contextr(   /   s2   € ÞÜÐCÓDÐDô ×+Ò+Ó-€JÞØ$)ˆ
Ô!ØÐr   c                 óŽ   • U c  Uc  US-  nO
UnSU-  nOU nUc  US-  nOUnX4s=:¼  a  S:¼  d  O  [        SU< SU< S35      eX44$ )Ni   é   r   zhigh (z) must be >= low (z) must be >= 0)r!   )ÚhighÚlowÚkbÚhiÚlos        r   Úadd_flowcontrol_defaultsr0   =   sd   € Ø�|Ø‰;Ø�d‘‰BàˆBØ�R‘‰BàˆØ
�{Ø�1‰W‰àˆà�=�q�=ÝÛ›bð"ó #ð 	#ð ˆ6€Mr   c                   óð   • \ rS rSrSr\R                  R                  rS r	SS jr
S rS rS rS	 r\4S
 jrS rS rS rSS jrS rS rSS jrS rS r\S 5       rS rS rS rS rS r S r!S r"Sr#g)Ú_SSLProtocolTransportéR   Tc                 ó*   • Xl         X l        SU l        g )NF)Ú_loopÚ_ssl_protocolÚ_closed)ÚselfÚloopÚssl_protocols      r   Ú__init__Ú_SSLProtocolTransport.__init__X   s   € ØŒ
Ø)ÔØˆ�r   Nc                 ó8   • U R                   R                  X5      $ )z#Get optional transport information.)r6   Ú_get_extra_info©r8   ÚnameÚdefaults      r   Úget_extra_infoÚ$_SSLProtocolTransport.get_extra_info]   s   € à×!Ñ!×1Ñ1°$Ó@Ð@r   c                 ó:   • U R                   R                  U5        g ©N)r6   Ú_set_app_protocol)r8   Úprotocols     r   Úset_protocolÚ"_SSLProtocolTransport.set_protocola   s   € Ø×Ñ×,Ñ,¨XÕ6r   c                 ó.   • U R                   R                  $ rE   )r6   Ú_app_protocol©r8   s    r   Úget_protocolÚ"_SSLProtocolTransport.get_protocold   s   € Ø×!Ñ!×/Ñ/Ð/r   c                 ó\   • U R                   =(       d    U R                  R                  5       $ rE   )r7   r6   Ú_is_transport_closingrL   s    r   Ú
is_closingÚ _SSLProtocolTransport.is_closingg   s    € Ø�|‰|×I˜t×1Ñ1×GÑGÓIÐIr   c                 óx   • U R                   (       d"  SU l         U R                  R                  5         gSU l        g)zåClose the transport.

Buffered data will be flushed asynchronously.  No more data
will be received.  After all buffered data is flushed, the
protocol's connection_lost() method will (eventually) called
with None as its argument.
TN)r7   r6   Ú_start_shutdownrL   s    r   ÚcloseÚ_SSLProtocolTransport.closej   s,   € ð �|�|ØˆDŒLØ×Ñ×.Ñ.Õ0à!%ˆDÕr   c                 ób   • U R                   (       d  SU l         UR                  S[        5        g g )NTz9unclosed transport <asyncio._SSLProtocolTransport object>)r7   ÚwarnÚResourceWarning)r8   Ú	_warningss     r   Ú__del__Ú_SSLProtocolTransport.__del__x   s)   € Ø�|�|ØˆDŒLØ�N‰NðÜ*õ,ð r   c                 ó8   • U R                   R                  (       + $ rE   )r6   Ú_app_reading_pausedrL   s    r   Ú
is_readingÚ _SSLProtocolTransport.is_reading   s   € Ø×%Ñ%×9Ñ9Ô9Ð9r   c                 ó8   • U R                   R                  5         g)z|Pause the receiving end.

No data will be passed to the protocol's data_received()
method until resume_reading() is called.
N)r6   Ú_pause_readingrL   s    r   Úpause_readingÚ#_SSLProtocolTransport.pause_reading‚   s   € ð 	×Ñ×)Ñ)Õ+r   c                 ó8   • U R                   R                  5         g)zmResume the receiving end.

Data received will once again be passed to the protocol's
data_received() method.
N)r6   Ú_resume_readingrL   s    r   Úresume_readingÚ$_SSLProtocolTransport.resume_readingŠ   s   € ð 	×Ñ×*Ñ*Õ,r   c                 ón   • U R                   R                  X5        U R                   R                  5         g)a.  Set the high- and low-water limits for write flow control.

These two values control when to call the protocol's
pause_writing() and resume_writing() methods.  If specified,
the low-water limit must be less than or equal to the
high-water limit.  Neither value can be negative.

The defaults are implementation-specific.  If only the
high-water limit is given, the low-water limit defaults to an
implementation-specific value less than or equal to the
high-water limit.  Setting high to zero forces low to zero as
well, and causes pause_writing() to be called whenever the
buffer becomes non-empty.  Setting low to zero causes
resume_writing() to be called only once the buffer is empty.
Use of zero for either limit is generally sub-optimal as it
reduces opportunities for doing I/O and computation
concurrently.
N)r6   Ú_set_write_buffer_limitsÚ_control_app_writing©r8   r+   r,   s      r   Úset_write_buffer_limitsÚ-_SSLProtocolTransport.set_write_buffer_limits’   s*   € ð& 	×Ñ×3Ñ3°DÔ>Ø×Ñ×/Ñ/Õ1r   c                 óZ   • U R                   R                  U R                   R                  4$ rE   )r6   Ú_outgoing_low_waterÚ_outgoing_high_waterrL   s    r   Úget_write_buffer_limitsÚ-_SSLProtocolTransport.get_write_buffer_limits¨   ó*   € Ø×"Ñ"×6Ñ6Ø×"Ñ"×7Ñ7ð9ð 	9r   c                 ó6   • U R                   R                  5       $ )z-Return the current size of the write buffers.)r6   Ú_get_write_buffer_sizerL   s    r   Úget_write_buffer_sizeÚ+_SSLProtocolTransport.get_write_buffer_size¬   s   € à×!Ñ!×8Ñ8Ó:Ð:r   c                 ón   • U R                   R                  X5        U R                   R                  5         g)a7  Set the high- and low-water limits for read flow control.

These two values control when to call the upstream transport's
pause_reading() and resume_reading() methods.  If specified,
the low-water limit must be less than or equal to the
high-water limit.  Neither value can be negative.

The defaults are implementation-specific.  If only the
high-water limit is given, the low-water limit defaults to an
implementation-specific value less than or equal to the
high-water limit.  Setting high to zero forces low to zero as
well, and causes pause_reading() to be called whenever the
buffer becomes non-empty.  Setting low to zero causes
resume_reading() to be called only once the buffer is empty.
Use of zero for either limit is generally sub-optimal as it
reduces opportunities for doing I/O and computation
concurrently.
N)r6   Ú_set_read_buffer_limitsÚ_control_ssl_readingrl   s      r   Úset_read_buffer_limitsÚ,_SSLProtocolTransport.set_read_buffer_limits°   s*   € ð& 	×Ñ×2Ñ2°4Ô=Ø×Ñ×/Ñ/Õ1r   c                 óZ   • U R                   R                  U R                   R                  4$ rE   )r6   Ú_incoming_low_waterÚ_incoming_high_waterrL   s    r   Úget_read_buffer_limitsÚ,_SSLProtocolTransport.get_read_buffer_limitsÆ   rt   r   c                 ó6   • U R                   R                  5       $ )z+Return the current size of the read buffer.)r6   Ú_get_read_buffer_sizerL   s    r   Úget_read_buffer_sizeÚ*_SSLProtocolTransport.get_read_buffer_sizeÊ   s   € à×!Ñ!×7Ñ7Ó9Ð9r   c                 ó.   • U R                   R                  $ rE   )r6   Ú_app_writing_pausedrL   s    r   Ú_protocol_pausedÚ&_SSLProtocolTransport._protocol_pausedÎ   s   € ð ×!Ñ!×5Ñ5Ð5r   c                 óÎ   • [        U[        [        [        45      (       d!  [	        S[        U5      R                   35      eU(       d  gU R                  R                  U45        g)z…Write some data bytes to the transport.

This does not block; it buffers the data and arranges for it
to be sent out asynchronously.
z+data: expecting a bytes-like instance, got N)	Ú
isinstanceÚbytesÚ	bytearrayÚ
memoryviewÚ	TypeErrorÚtyper   r6   Ú_write_appdata©r8   Údatas     r   ÚwriteÚ_SSLProtocolTransport.writeÓ   s[   € ô ˜$¤¬	´:Ð >×?Ñ?Üð #Ü#'¨£:×#6Ñ#6Ð"7ð9ó :ð :æØØ×Ñ×)Ñ)¨4¨'Õ2r   c                 ó:   • U R                   R                  U5        g)z—Write a list (or any iterable) of data bytes to the transport.

The default implementation concatenates the arguments and
calls write() on the result.
N)r6   r’   )r8   Úlist_of_datas     r   Ú
writelinesÚ _SSLProtocolTransport.writelinesà   s   € ð 	×Ñ×)Ñ)¨,Õ7r   c                 ó   • [         e)zeClose the write end after flushing buffered data.

This raises :exc:`NotImplementedError` right now.
)ÚNotImplementedErrorrL   s    r   Ú	write_eofÚ_SSLProtocolTransport.write_eofè   s
   € ô
 "Ð!r   c                 ó   • g)zAReturn True if this transport supports write_eof(), False if not.Fr   rL   s    r   Úcan_write_eofÚ#_SSLProtocolTransport.can_write_eofï   s   € àr   c                 ó&   • U R                  S5        g)z½Close the transport immediately.

Buffered data will be lost.  No more data will be received.
The protocol's connection_lost() method will (eventually) be
called with None as its argument.
N)Ú_force_closerL   s    r   ÚabortÚ_SSLProtocolTransport.abortó   s   € ð 	×Ñ˜$Õr   c                 ód   • SU l         U R                  b  U R                  R                  U5        g g ©NT)r7   r6   Ú_abort©r8   Úexcs     r   r£   Ú"_SSLProtocolTransport._force_closeü   s.   € ØˆŒØ×ÑÑ)Ø×Ñ×%Ñ% cÕ*ð *r   c                 óž   • U R                   R                  R                  U5        U R                   =R                  [	        U5      -  sl        g rE   )r6   Ú_write_backlogÚappendÚ_write_buffer_sizeÚlenr“   s     r   Ú_test__append_write_backlogÚ1_SSLProtocolTransport._test__append_write_backlog  s7   € à×Ñ×)Ñ)×0Ñ0°Ô6Ø×Ñ×-Ò-´°T³Ñ:Ö-r   )r7   r5   r6   rE   ©NN)$r   r   r   r   Ú_start_tls_compatibler   Ú_SendfileModeÚFALLBACKÚ_sendfile_compatibler;   rB   rH   rM   rQ   rU   Úwarningsr[   r_   rc   rg   rm   rr   rw   r|   r�   r…   Úpropertyr‰   r•   r™   r�   r    r¤   r£   r±   r   r   r   r   r2   r2   R   sª   † ð !ÐØ$×2Ñ2×;Ñ;Ðòô
Aò7ò0òJò&ð !)ô ,ò:ò,ò-ô2ò,9ò;ô2ò,9ò:ð ñ6ó ð6ò3ò8ò"òò ò+õ
;r   r2   c                   ó4  • \ rS rSrSrSrSrSr    S-S jrS r	S.S jr
S rS rS	 rS
 rS rS rS rS.S jrS rS rS rS rS rS rS rS rS rS rS rS rS rS r S r!S r"S r#S  r$S! r%S" r&S/S# jr'S$ r(S% r)S& r*S/S' jr+S( r,S) r-S* r.S0S+ jr/S,r0g)1ÚSSLProtocoli  i   Nc
                 óò  • [         c  [        S5      e[        U R                  5      U l        [        U R                  5      U l        Uc  [        R                  nOUS::  a  [        SU 35      eU	c  [        R                  n	OU	S::  a  [        SU	 35      eU(       d  [        XV5      nXPl        U(       a  U(       d  X`l        OS U l        X0l        [        US9U l        ["        R$                  " 5       U l        SU l        X@l        Xl        U R/                  U5        S U l        SU l        S U l        X€l        X�l        [         R:                  " 5       U l        [         R:                  " 5       U l        [@        RB                  U l"        SU l#        U(       a  [H        RJ                  U l&        O[H        RN                  U l&        U R                  RQ                  U R<                  U R>                  U R                  U R                  S9U l)        SU l*        SU l+        SU l,        SU l-        SU l.        U R_                  5         SU l0        SU l1        SU l2        SU l3        U Ri                  5         U Rk                  5         g )Nzstdlib ssl module not availabler   z7ssl_handshake_timeout should be a positive number, got z6ssl_shutdown_timeout should be a positive number, got )r'   F)r%   r&   )6r"   ÚRuntimeErrorrŽ   Úmax_sizeÚ_ssl_bufferr�   Ú_ssl_buffer_viewr   ÚSSL_HANDSHAKE_TIMEOUTr!   ÚSSL_SHUTDOWN_TIMEOUTr(   Ú_server_sideÚ_server_hostnameÚ_sslcontextÚdictÚ_extraÚcollectionsÚdequer­   r¯   Ú_waiterr5   rF   Ú_app_transportÚ_app_transport_createdÚ
_transportÚ_ssl_handshake_timeoutÚ_ssl_shutdown_timeoutÚ	MemoryBIOÚ	_incomingÚ	_outgoingr
   r   Ú_stateÚ
_conn_lostr   r   Ú
_app_stater   Úwrap_bioÚ_sslobjÚ_ssl_writing_pausedr^   Ú_ssl_reading_pausedr€   r   rz   Ú_eof_receivedrˆ   rq   rp   rj   Ú_get_app_transport)
r8   r9   Úapp_protocolr'   Úwaiterr%   r&   Úcall_connection_madeÚssl_handshake_timeoutÚssl_shutdown_timeouts
             r   r;   ÚSSLProtocol.__init__  s5  € ô
 ‰;ÜÐ@ÓAÐAä$ T§]¡]Ó3ˆÔÜ *¨4×+;Ñ+;Ó <ˆÔà Ñ(Ü$-×$CÑ$CÑ!Ø" aÓ'ÜðØ,Ð-ð/ó0ð 0ð  Ñ'Ü#,×#AÑ#AÑ Ø! QÓ&ÜðØ+Ð,ð.ó/ð /ö Ü2Øó.ˆJð (ÔÞ¦;Ø$3Õ!à$(ˆDÔ!Ø%Ôô  jÑ1ˆŒô *×/Ò/Ó1ˆÔØ"#ˆÔàŒØŒ
Ø×Ñ˜|Ô,Ø"ˆÔØ&+ˆÔ#àˆŒØ&;Ô#Ø%9Ô"äŸš›ˆŒÜŸš›ˆŒÜ&×0Ñ0ˆŒØˆŒÞÜ.×9Ñ9ˆD�Oä.×=Ñ=ˆDŒOØ×'Ñ'×0Ñ0Ø�N‰N˜DŸN™NØ×)Ñ)Ø ×1Ñ1ð 1ð 3ˆŒð $)ˆÔ à#(ˆÔ à#(ˆÔ Ø$%ˆÔ!Ø#$ˆÔ Ø×$Ñ$Ô&Ø"ˆÔà#(ˆÔ Ø$%ˆÔ!Ø#$ˆÔ Ø×%Ñ%Ô'Ø×ÑÕ!r   c                 óÒ   • Xl         [        US5      (       aI  [        U[        R                  5      (       a*  UR
                  U l        UR                  U l        SU l	        g SU l	        g )NÚ
get_bufferTF)
rK   ÚhasattrrŒ   r   ÚBufferedProtocolrã   Ú_app_protocol_get_bufferÚbuffer_updatedÚ_app_protocol_buffer_updatedÚ_app_protocol_is_buffer)r8   rÜ   s     r   rF   ÚSSLProtocol._set_app_protocola  sT   € Ø)Ôä�L ,×/Ñ/Ü˜<¬×)CÑ)C×DÑDØ,8×,CÑ,CˆDÔ)Ø0<×0KÑ0KˆDÔ-Ø+/ˆDÕ(à+0ˆDÕ(r   c                 óà   • U R                   c  g U R                   R                  5       (       d:  Ub  U R                   R                  U5        OU R                   R                  S 5        S U l         g rE   )rÊ   Ú	cancelledÚset_exceptionÚ
set_resultr©   s     r   Ú_wakeup_waiterÚSSLProtocol._wakeup_waiterl  sR   € Ø�<‰<ÑØØ�|‰|×%Ñ%×'Ñ'Ø‰Ø—‘×*Ñ*¨3Õ/à—‘×'Ñ'¨Ô-Øˆ�r   c                 ó°   • U R                   c>  U R                  (       a  [        S5      e[        U R                  U 5      U l         SU l        U R                   $ )Nz$Creating _SSLProtocolTransport twiceT)rË   rÌ   r½   r2   r5   rL   s    r   rÛ   ÚSSLProtocol._get_app_transportv  sJ   € Ø×ÑÑ&Ø×*×*Ü"Ð#IÓJÐJÜ"7¸¿
¹
ÀDÓ"IˆDÔØ*.ˆDÔ'Ø×"Ñ"Ð"r   c                 ó`   • U R                   S L=(       a    U R                   R                  5       $ rE   )rÍ   rQ   rL   s    r   rP   Ú!SSLProtocol._is_transport_closing~  s#   € Ø�‰ dÐ*×K¨t¯©×/IÑ/IÓ/KÐKr   c                 ó0   • Xl         U R                  5         g)zHCalled when the low-level connection is made.

Start the SSL handshake.
N)rÍ   Ú_start_handshake)r8   Ú	transports     r   Úconnection_madeÚSSLProtocol.connection_made�  s   € ð
 $ŒØ×ÑÕr   c                 ód  • U R                   R                  5         U R                  R                  5         U =R                  S-  sl        U R
                  b  SU R
                  l        U R                  [        R                  :w  a�  U R                  [        R                  :X  d  U R                  [        R                  :X  aE  [        R                  U l
        U R                  R!                  U R"                  R$                  U5        U R'                  [        R(                  5        SU l        SU l        SU l        U R-                  U5        U R.                  (       a!  U R.                  R1                  5         SU l        U R2                  (       a"  U R2                  R1                  5         SU l        gg)z½Called when the low-level connection is lost or closed.

The argument is an exception object or None (the latter
meaning a regular EOF is received or the connection was
aborted or closed).
r   NT)r­   ÚclearrÒ   ÚreadrÔ   rË   r7   rÓ   r
   r   rÕ   r   r   r   r   r5   Ú	call_soonrK   Úconnection_lostÚ
_set_stater   rÍ   rï   Ú_shutdown_timeout_handleÚcancelÚ_handshake_timeout_handler©   s     r   rþ   ÚSSLProtocol.connection_lost‰  s9  € ð 	×Ñ×!Ñ!Ô#Ø�‰×ÑÔØ�Š˜1Ñ�ð ×ÑÑ*Ø*.ˆD×ÑÔ'à�;‰;Ô*×7Ñ7Ó7à—‘Ô#3×#BÑ#BÓBØ—‘Ô#3×#=Ñ#=Ó=ä"2×"AÑ"A�”Ø—
‘
×$Ñ$ T×%7Ñ%7×%GÑ%GÈÔMØ�‰Ô(×2Ñ2Ô3ØˆŒØ"ˆÔØ!ˆÔØ×Ñ˜CÔ à×(×(Ø×)Ñ)×0Ñ0Ô2Ø,0ˆDÔ)Ø×)×)Ø×*Ñ*×1Ñ1Ô3Ø-1ˆDÕ*ð *r   c                 óæ   • UnUS::  d  X R                   :”  a  U R                   n[        U R                  5      U:  a*  [        U5      U l        [	        U R                  5      U l        U R
                  $ ©Nr   )r¾   r°   r¿   rŽ   r�   rÀ   )r8   ÚnÚwants      r   rã   ÚSSLProtocol.get_buffer­  s^   € ØˆØ�1‹9˜Ÿ}™}Ó,Ø—=‘=ˆDÜˆt×ÑÓ  4Ó'Ü(¨›ˆDÔÜ$.¨t×/?Ñ/?Ó$@ˆDÔ!Ø×$Ñ$Ð$r   c                 óÌ  • U R                   R                  U R                  S U 5        U R                  [        R
                  :X  a  U R                  5         g U R                  [        R                  :X  a  U R                  5         g U R                  [        R                  :X  a  U R                  5         g U R                  [        R                  :X  a  U R                  5         g g rE   )rÑ   r•   rÀ   rÓ   r
   r   Ú_do_handshaker   Ú_do_readr   Ú	_do_flushr   Ú_do_shutdown)r8   Únbytess     r   rç   ÚSSLProtocol.buffer_updated¶  s�   € Ø�‰×Ñ˜T×2Ñ2°7°FÐ;Ô<à�;‰;Ô*×7Ñ7Ó7Ø×ÑÕ à�[‰[Ô,×4Ñ4Ó4Ø�M‰M�Oà�[‰[Ô,×5Ñ5Ó5Ø�N‰NÕà�[‰[Ô,×5Ñ5Ó5Ø×ÑÕð 6r   c                 ó  • SU l          U R                  R                  5       (       a  [        R                  " SU 5        U R
                  [        R                  :X  a  U R                  [        5        gU R
                  [        R                  :X  aB  U R                  [        R                  5        U R                  (       a  gU R                  5         gU R
                  [        R                  :X  a@  U R                  5         U R                  [        R                   5        U R#                  5         gU R
                  [        R                   :X  a  U R#                  5         gg! [$         a    U R&                  R)                  5         e f = f)zÞCalled when the other end of the low-level stream
is half-closed.

If this returns a false value (including None), the transport
will close itself.  If it returns a true value, closing the
transport is up to the protocol.
Tz%r received EOFN)rÚ   r5   Ú	get_debugr   ÚdebugrÓ   r
   r   Ú_on_handshake_completeÚConnectionResetErrorr   rÿ   r   r^   r  Ú	_do_writer   r  Ú	ExceptionrÍ   rU   rL   s    r   Úeof_receivedÚSSLProtocol.eof_receivedÅ  s  € ð "ˆÔð	Ø�z‰z×#Ñ#×%Ñ%Ü—’Ð.°Ô5à�{‰{Ô.×;Ñ;Ó;Ø×+Ñ+Ô,@ÕAà—‘Ô 0× 8Ñ 8Ó8Ø—‘Ô 0× 9Ñ 9Ô:Ø×+×+Øà—N‘NÕ$à—‘Ô 0× 9Ñ 9Ó9Ø—‘Ô Ø—‘Ô 0× 9Ñ 9Ô:Ø×!Ñ!Õ#à—‘Ô 0× 9Ñ 9Ó9Ø×!Ñ!Õ#ð :øô ó 	Ø�O‰O×!Ñ!Ô#Øð	ús&   ‰A)E! Á3AE! ÃE! ÃAE! Ä1.E! Å!&Fc                 ó’   • XR                   ;   a  U R                   U   $ U R                  b  U R                  R                  X5      $ U$ rE   )rÇ   rÍ   rB   r?   s      r   r>   ÚSSLProtocol._get_extra_infoè  s?   € Ø—;‘;ÓØ—;‘;˜tÑ$Ð$Ø�_‰_Ñ(Ø—?‘?×1Ñ1°$Ó@Ð@àˆNr   c                 ó@  • SnU[         R                  :X  a  SnOÓU R                  [         R                  :X  a  U[         R                  :X  a  SnOžU R                  [         R                  :X  a  U[         R                  :X  a  SnOiU R                  [         R                  :X  a  U[         R
                  :X  a  SnO4U R                  [         R
                  :X  a  U[         R                  :X  a  SnU(       a  Xl        g [        SR                  U R                  U5      5      e)NFTz!cannot switch state from {} to {})	r
   r   rÓ   r   r   r   r   r½   Úformat)r8   Ú	new_stateÚalloweds      r   rÿ   ÚSSLProtocol._set_stateð  sí   € ØˆàÔ(×2Ñ2Ó2Ø‰Gð �K‰KÔ+×5Ñ5Ó5ØÔ)×6Ñ6Ó6à‰Gð �K‰KÔ+×8Ñ8Ó8ØÔ)×1Ñ1Ó1à‰Gð �K‰KÔ+×3Ñ3Ó3ØÔ)×2Ñ2Ó2à‰Gð �K‰KÔ+×4Ñ4Ó4ØÔ)×2Ñ2Ó2àˆGæØ#�Kô Ø3×:Ñ:Ø—K‘K ó,ó-ð -r   c                 ó†  • U R                   R                  5       (       a7  [        R                  " SU 5        U R                   R	                  5       U l        OS U l        U R                  [        R                  5        U R                   R                  U R                  U R                  5      U l        U R                  5         g )Nz%r starts SSL handshake)r5   r  r   r  ÚtimeÚ_handshake_start_timerÿ   r
   r   Ú
call_laterrÎ   Ú_check_handshake_timeoutr  r
  rL   s    r   rö   ÚSSLProtocol._start_handshake  sŽ   € Ø�:‰:×Ñ×!Ñ!Ü�LŠLÐ2°DÔ9Ø)-¯©¯©Ó):ˆDÕ&à)-ˆDÔ&à�‰Ô(×5Ñ5Ô6ð �J‰J×!Ñ! $×"=Ñ"=Ø"&×"?Ñ"?óAð 	Ô&ð 	×ÑÕr   c                 ó–   • U R                   [        R                  :X  a+  SU R                   S3nU R	                  [        U5      5        g g )Nz$SSL handshake is taking longer than z! seconds: aborting the connection)rÓ   r
   r   rÎ   Ú_fatal_errorÚConnectionAbortedError)r8   Úmsgs     r   r$  Ú$SSLProtocol._check_handshake_timeout(  sN   € Ø�;‰;Ô*×7Ñ7Ó7à6Ø×.Ñ.Ð/ð 0*ð+ð ð
 ×ÑÔ4°SÓ9Õ:ð 8r   c                 óö   •  U R                   R                  5         U R                  S 5        g ! [         a    U R	                  5          g [
        R                   a  nU R                  U5         S nAg S nAff = frE   )r×   Údo_handshaker  ÚSSLAgainErrorsÚ_process_outgoingr"   ÚSSLErrorr©   s     r   r
  ÚSSLProtocol._do_handshake1  sb   € ð	.Ø�L‰L×%Ñ%Ô'ð ×'Ñ'¨Õ-øô ó 	%Ø×"Ñ"Ö$Ü�|‰|ó 	-Ø×'Ñ'¨×,Ñ,ûð	-ús   ‚. ®A8Á
A8ÁA3Á3A8c                 ó  • U R                   b!  U R                   R                  5         S U l         U R                  n Uc   U R                  [        R
                  5        OUeUR                  5       nU R                  R                  5       (       aA  U R                  R!                  5       U R"                  -
  n[$        R&                  " SXS-  5        U R(                  R+                  UUR-                  5       UR/                  5       US9  U R0                  [2        R4                  :X  a>  [2        R6                  U l        U R8                  R;                  U R=                  5       5        U R                  5         U R?                  5         g ! [         aq  nS nU R                  [        R                  5        [        U[        R                  5      (       a  SnOSnU R                  XE5        U R                  U5         S nAg S nAff = f)Nz1SSL handshake failed on verifying the certificatezSSL handshake failedz%r: SSL handshake took %.1f msg     @�@)ÚpeercertÚcipherÚcompressionÚ
ssl_object) r  r  r×   rÿ   r
   r   Úgetpeercertr  r   rŒ   r"   ÚCertificateErrorr'  rï   r5   r  r!  r"  r   r  rÇ   Úupdater3  r4  rÕ   r   r   r   rK   rø   rÛ   r  )r8   Úhandshake_excÚsslobjr2  rª   r)  Údts          r   r  Ú"SSLProtocol._on_handshake_complete;  s“  € Ø×)Ñ)Ñ5Ø×*Ñ*×1Ñ1Ô3Ø-1ˆDÔ*à—‘ˆð	ØÑ$Ø—‘Ô 0× 8Ñ 8Õ9à#Ð#à×)Ñ)Ó+ˆHð �:‰:×Ñ×!Ñ!Ø—‘—‘Ó" T×%?Ñ%?Ñ?ˆBÜ�LŠLÐ9¸4ÀcÁÔJð 	�‰×Ñ HØ"(§-¡-£/Ø'-×'9Ñ'9Ó';Ø&,ð 	ñ 	.ð �?‰?Ô.×9Ñ9Ó9Ü.×=Ñ=ˆDŒOØ×Ñ×.Ñ.¨t×/FÑ/FÓ/HÔIØ×ÑÔØ�‰�øô1 ó 		Ø ˆMØ�O‰OÔ,×6Ñ6Ô7Ü˜#œs×3Ñ3×4Ñ4ØI‘à,�Ø×Ñ˜cÔ'Ø×Ñ Ô$Üûð		ús   ¼5F Æ
HÆA'G<Ç<Hc                 óä  • U R                   [        R                  [        R                  [        R                  4;   a  g U R
                  b  SU R
                  l        U R                   [        R                  :X  a  U R                  S 5        g U R                  [        R                  5        U R                  R                  U R                  U R                  5      U l        U R                  5         g r§   )rÓ   r
   r   r   r   rË   r7   r   r¨   rÿ   r5   r#  rÏ   Ú_check_shutdown_timeoutr   r  rL   s    r   rT   ÚSSLProtocol._start_shutdownd  s´   € à�K‰KÜ ×)Ñ)Ü ×)Ñ)Ü ×*Ñ*ðó ð Ø×ÑÑ*Ø*.ˆD×ÑÔ'Ø�;‰;Ô*×7Ñ7Ó7Ø�K‰K˜Õà�O‰OÔ,×5Ñ5Ô6Ø,0¯J©J×,AÑ,AØ×*Ñ*Ø×,Ñ,ó-ˆDÔ)ð �N‰NÕr   c                 óÀ   • U R                   [        R                  [        R                  4;   a0  U R                  R                  [        R                  " S5      5        g g )NzSSL shutdown timed out)rÓ   r
   r   r   rÍ   r£   r   ÚTimeoutErrorrL   s    r   r>  Ú#SSLProtocol._check_shutdown_timeouty  sN   € à�K‰KÜ ×)Ñ)Ü ×)Ñ)ðó ð
 �O‰O×(Ñ(Ü×'Ò'Ð(@ÓAõCðr   c                 ó‚   • U R                  5         U R                  [        R                  5        U R	                  5         g rE   )r  rÿ   r
   r   r  rL   s    r   r  ÚSSLProtocol._do_flushƒ  s*   € Ø�‰ŒØ�‰Ô(×1Ñ1Ô2Ø×ÑÕr   c                 óX  •  U R                   (       d  U R                  R                  5         U R                  5         U R	                  5         U R                  S 5        g ! [         a    U R                  5          g [        R                   a  nU R                  U5         S nAg S nAff = frE   )	rÚ   r×   Úunwrapr.  Ú_call_eof_receivedÚ_on_shutdown_completer-  r"   r/  r©   s     r   r  ÚSSLProtocol._do_shutdownˆ  sƒ   € ð
	-Ø×%×%Ø—‘×#Ñ#Ô%ð ×"Ñ"Ô$Ø×#Ñ#Ô%Ø×&Ñ& tÕ,øô ó 	%Ø×"Ñ"Ö$Ü�|‰|ó 	,Ø×&Ñ& s×+Ñ+ûð	,ús   ‚+A ÁB)Á;B)ÂB$Â$B)c                 óð   • U R                   b!  U R                   R                  5         S U l         U(       a  U R                  U5        g U R                  R	                  U R
                  R                  5        g rE   )r   r  r'  r5   rý   rÍ   rU   )r8   Úshutdown_excs     r   rH  Ú!SSLProtocol._on_shutdown_complete•  sU   € Ø×(Ñ(Ñ4Ø×)Ñ)×0Ñ0Ô2Ø,0ˆDÔ)æØ×Ñ˜lÕ+à�J‰J× Ñ  §¡×!6Ñ!6Õ7r   c                 ó”   • U R                  [        R                  5        U R                  b  U R                  R	                  U5        g g rE   )rÿ   r
   r   rÍ   r£   r©   s     r   r¨   ÚSSLProtocol._abortŸ  s6   € Ø�‰Ô(×2Ñ2Ô3Ø�?‰?Ñ&Ø�O‰O×(Ñ(¨Õ-ð 'r   c                 óH  • U R                   [        R                  [        R                  [        R                  4;   aJ  U R
                  [        R                  :¼  a  [        R                  " S5        U =R
                  S-  sl        g U H<  nU R                  R                  U5        U =R                  [        U5      -  sl        M>      U R                   [        R                  :X  a  U R                  5         g g ! [          a  nU R#                  US5         S nAg S nAff = f)NzSSL connection is closedr   úFatal error on SSL protocol)rÓ   r
   r   r   r   rÔ   r   Ú!LOG_THRESHOLD_FOR_CONNLOST_WRITESr   Úwarningr­   r®   r¯   r°   r   r  r  r'  )r8   r˜   r”   Úexs       r   r’   ÚSSLProtocol._write_appdata¦  sã   € à�K‰KÜ ×)Ñ)Ü ×)Ñ)Ü ×*Ñ*ðó ð �‰¤)×"MÑ"MÓMÜ—’Ð9Ô:Ø�OŠO˜qÑ �OØã ˆDØ×Ñ×&Ñ& tÔ,Ø×#Ò#¤s¨4£yÑ0×#ñ !ð	AØ�{‰{Ô.×6Ñ6Ó6Ø—‘Õ ð 7øô ó 	AØ×Ñ˜bÐ"?×@Ñ@ûð	Aús   Ã.C; Ã;
D!ÄDÄD!c                 ó”  •  U R                   (       a–  U R                   S   nU R                  R                  U5      n[        U5      nX#:  a'  XS  U R                   S'   U =R                  U-  sl        O"U R                   S	 U =R                  U-  sl        U R                   (       a  M–  U R                  5         g ! [
         a     Nf = fr  )r­   r×   r•   r°   r¯   r-  r.  )r8   r”   ÚcountÚdata_lens       r   r  ÚSSLProtocol._do_write¾  s·   € ð	Ø×%×%Ø×*Ñ*¨1Ñ-�ØŸ™×*Ñ*¨4Ó0�Ü˜t›9�ØÓ#Ø-1°&¨\�D×'Ñ'¨Ñ*Ø×+Ò+¨uÑ4Ö+à×+Ñ+¨AÐ.Ø×+Ò+¨xÑ7Õ+ð ×%×%Ñ%ð 	×ÑÕ øô ó 	Ùð	ús   ‚B%B: Â:
CÃCc                 óÐ   • U R                   (       dE  U R                  R                  5       n[        U5      (       a  U R                  R                  U5        U R                  5         g rE   )rØ   rÒ   rü   r°   rÍ   r•   rk   r“   s     r   r.  ÚSSLProtocol._process_outgoingÎ  sD   € Ø×'×'Ø—>‘>×&Ñ&Ó(ˆDÜ�4�y‰yØ—‘×%Ñ% dÔ+Ø×!Ñ!Õ#r   c                 óÀ  • U R                   [        R                  [        R                  4;  a  g  U R                  (       dd  U R
                  (       a  U R                  5         OU R                  5         U R                  (       a  U R                  5         OU R                  5         U R                  5         g ! [         a  nU R                  US5         S nAg S nAff = f)NrP  )rÓ   r
   r   r   r^   ré   Ú_do_read__bufferedÚ_do_read__copiedr­   r  r.  r{   r  r'  )r8   rS  s     r   r  ÚSSLProtocol._do_read×  s«   € à�K‰KÜ ×(Ñ(Ü ×)Ñ)ð ó ð
 ð	AØ×+×+Ø×/×/Ø×+Ñ+Õ-à×)Ñ)Ô+Ø×&×&Ø—N‘NÕ$à×*Ñ*Ô,Ø×%Ñ%Õ'øÜó 	AØ×Ñ˜bÐ"?×@Ñ@ûð	Aús   ±BB7 Â7
CÃCÃCc                 ó   • SnSnU R                  U R                  5       5      n[        U5      n U R                  R	                  XC5      nUS:”  a_  UnX:  a3  U R                  R	                  XA-
  X1S  5      nUS:”  a  X-  nOO,X:  a  M3  U R
                  R                  U R                  5        US:”  a  U R                  U5        U(       d!  U R                  5         U R                  5         g g ! [         a     NLf = f)Nr   r   )ræ   r„   r°   r×   rü   r5   rý   r  r-  rè   rG  rT   )r8   ÚoffsetrV  ÚbufÚwantss        r   r\  ÚSSLProtocol._do_read__bufferedí  sï   € ØˆØˆà×+Ñ+¨D×,FÑ,FÓ,HÓIˆÜ�C“ˆð	Ø—L‘L×%Ñ% eÓ1ˆEà�q‹yØ�Ø“nØ ŸL™L×-Ñ-¨e©n¸cÀ'¸lÓK�EØ˜q“yØ™™àð •nð —J‘J×(Ñ(¨¯©Ô7ð �A‹:Ø×-Ñ-¨fÔ5Þà×#Ñ#Ô%Ø× Ñ Õ"ð øô	 ó 	Ùð	ús   °AC0 ÂC0 Â%C0 Ã0
C=Ã<C=c                 óä  • SnSnSn  U R                   R                  U R                  5      nU(       d  O/U(       a  SnSnUnOU(       a  SnWU/nOWR                  U5        M\  U(       a  U R
                  R                  W5        O1U(       d*  U R
                  R                  SR                  W5      5        U(       d!  U R                  5         U R                  5         g g ! [         a     N‰f = f)Nó   1TFr   )
r×   rü   r¾   r®   r-  rK   Údata_receivedÚjoinrG  rT   )r8   ÚchunkÚzeroÚoneÚfirstr”   s         r   r]  ÚSSLProtocol._do_read__copied
  s×   € ØˆØˆØˆð	ØØŸ™×)Ñ)¨$¯-©-Ó8�ÞØÞØ �DØ�CØ!‘EÞØ�CØ! 5˜>‘Dà—K‘K Ô&ñ ö Ø×Ñ×,Ñ,¨UÕ3ÞØ×Ñ×,Ñ,¨S¯X©X°d«^Ô<Þà×#Ñ#Ô%Ø× Ñ Õ"ð øô ó 	Ùð	ús   ˆ-C" ¶/C" Ã"
C/Ã.C/c                 óP  •  U R                   [        R                  :X  aN  [        R                  U l         U R                  R                  5       nU(       a  [        R                  " S5        g g g ! [        [        4 a    e [         a  nU R                  US5         S nAg S nAff = f)Nz?returning true from eof_received() has no effect when using sslzError calling eof_received())rÕ   r   r   r   rK   r  r   rR  ÚKeyboardInterruptÚ
SystemExitÚBaseExceptionr'  )r8   Ú	keep_openrS  s      r   rG  ÚSSLProtocol._call_eof_received(  s•   € ð
	BØ�‰Ô"2×"AÑ"AÓAÜ"2×"<Ñ"<�”Ø ×.Ñ.×;Ñ;Ó=�	ÞÜ—N’Nð $Bõ Cð ð Bøô "¤:Ð.ó 	ØÜó 	BØ×Ñ˜bÐ"@×AÑAûð	Bús   ‚A*A/ Á/B%Â	B Â B%c                 óv  • U R                  5       nXR                  :¼  a4  U R                  (       d#  SU l         U R                  R	                  5         g XR                  ::  a5  U R                  (       a#  SU l         U R                  R                  5         g g g ! [
        [        4 a    e [         a4  nU R                  R                  SUU R                  U S.5         S nAg S nAff = f! [
        [        4 a    e [         a4  nU R                  R                  SUU R                  U S.5         S nAg S nAff = f)NTzprotocol.pause_writing() failed©ÚmessageÚ	exceptionr÷   rG   Fz protocol.resume_writing() failed)rv   rq   rˆ   rK   Úpause_writingrn  ro  rp  r5   Úcall_exception_handlerrË   rp   Úresume_writing)r8   Úsizerª   s      r   rk   Ú SSLProtocol._control_app_writing7  s   € Ø×*Ñ*Ó,ˆØ×,Ñ,Ó,°T×5M×5MØ'+ˆDÔ$ð
Ø×"Ñ"×0Ñ0Õ2ð ×-Ñ-Ó-°$×2J×2JØ',ˆDÔ$ð
Ø×"Ñ"×1Ñ1Õ3ð 3KÐ-øô &¤zÐ2ó ØÜ ó Ø—
‘
×1Ñ1Ø@Ø!$Ø!%×!4Ñ!4Ø $ñ	3÷ ñ ûðûô &¤zÐ2ó ØÜ ó Ø—
‘
×1Ñ1ØAØ!$Ø!%×!4Ñ!4Ø $ñ	3÷ ñ ûðús/   ¹B Á<C* ÂC'Â3*C"Ã"C'Ã*D8Ä*D3Ä3D8c                 óH   • U R                   R                  U R                  -   $ rE   )rÒ   Úpendingr¯   rL   s    r   rv   Ú"SSLProtocol._get_write_buffer_sizeT  s   € Ø�~‰~×%Ñ%¨×(?Ñ(?Ñ?Ð?r   c                 óT   • [        X[        R                  5      u  pXl        X l        g rE   )r0   r   Ú!FLOW_CONTROL_HIGH_WATER_SSL_WRITErq   rp   rl   s      r   rj   Ú$SSLProtocol._set_write_buffer_limitsW  s&   € Ü,Ø”y×BÑBóD‰	ˆà$(Ô!Ø#&Õ r   c                 ó   • SU l         g r§   )r^   rL   s    r   rb   ÚSSLProtocol._pause_reading_  s
   € Ø#'ˆÕ r   c                 óz   ^ • T R                   (       a)  ST l         U 4S jnT R                  R                  U5        g g )NFc                  ó   >• T R                   [        R                  :X  a  T R                  5         g T R                   [        R                  :X  a  T R                  5         g T R                   [        R                  :X  a  T R                  5         g g rE   )rÓ   r
   r   r  r   r  r   r  rL   s   €r   ÚresumeÚ+SSLProtocol._resume_reading.<locals>.resumef  s`   ø€ Ø—;‘;Ô"2×":Ñ":Ó:Ø—M‘M•OØ—[‘[Ô$4×$=Ñ$=Ó=Ø—N‘NÕ$Ø—[‘[Ô$4×$=Ñ$=Ó=Ø×%Ñ%Õ'ð >r   )r^   r5   rý   )r8   r†  s   ` r   rf   ÚSSLProtocol._resume_readingb  s2   ø€ Ø×#×#Ø',ˆDÔ$õ(ð �J‰J× Ñ  Õ(ð $r   c                 ó.  • U R                  5       nXR                  :¼  a3  U R                  (       d"  SU l        U R                  R	                  5         g XR
                  ::  a4  U R                  (       a"  SU l        U R                  R                  5         g g g )NTF)r„   r€   rÙ   rÍ   rc   r   rg   )r8   rz  s     r   r{   Ú SSLProtocol._control_ssl_readingq  sq   € Ø×)Ñ)Ó+ˆØ×,Ñ,Ó,°T×5M×5MØ'+ˆDÔ$Ø�O‰O×)Ñ)Õ+Ø×-Ñ-Ó-°$×2J×2JØ',ˆDÔ$Ø�O‰O×*Ñ*Õ,ð 3KÐ-r   c                 óT   • [        X[        R                  5      u  pXl        X l        g rE   )r0   r   Ú FLOW_CONTROL_HIGH_WATER_SSL_READr€   r   rl   s      r   rz   Ú#SSLProtocol._set_read_buffer_limitsz  s&   € Ü,Ø”y×AÑAóC‰	ˆà$(Ô!Ø#&Õ r   c                 ó.   • U R                   R                  $ rE   )rÑ   r}  rL   s    r   r„   Ú!SSLProtocol._get_read_buffer_size€  s   € Ø�~‰~×%Ñ%Ð%r   c                 ó8   • U R                   (       a   eSU l         g)zLCalled when the low-level transport's buffer goes over
the high-water mark.
TN)rØ   rL   s    r   rw  ÚSSLProtocol.pause_writing…  s   € ð ×+×+Ð+Ð+Ø#'ˆÕ r   c                 óX   • U R                   (       d   eSU l         U R                  5         g)zNCalled when the low-level transport's buffer drains below
the low-water mark.
FN)rØ   r.  rL   s    r   ry  ÚSSLProtocol.resume_writingŒ  s'   € ð ×'×'Ð'Ð'Ø#(ˆÔ Ø×ÑÕ r   c                 óˆ  • U R                   (       a  U R                   R                  U5        [        U[        5      (       a7  U R                  R                  5       (       a  [        R                  " SXSS9  g g [        U[        R                  5      (       d+  U R                  R                  UUU R                   U S.5        g g )Nz%r: %sT)Úexc_infort  )rÍ   r£   rŒ   ÚOSErrorr5   r  r   r  r   ÚCancelledErrorrx  )r8   rª   ru  s      r   r'  ÚSSLProtocol._fatal_error”  s�   € Ø�?�?Ø�O‰O×(Ñ(¨Ô-ä�cœ7×#Ñ#Ø�z‰z×#Ñ#×%Ñ%Ü—’˜X t¸tÓDð &ä˜C¤×!:Ñ!:×;Ñ;Ø�J‰J×-Ñ-Ø"Ø Ø!Ÿ_™_Ø ñ	/õ ð <r   )%rK   rè   ræ   ré   r^   rÕ   rË   rÌ   rˆ   rÔ   rÚ   rÇ   r"  r  rÑ   r€   r   r5   rÒ   rq   rp   rÄ   rÃ   r   r¿   rÀ   rÎ   rÙ   rÏ   rØ   rÅ   r×   rÓ   rÍ   rÊ   r­   r¯   )FNTNNrE   r³   )zFatal error on transport)1r   r   r   r   r¾   r"  r  r   r;   rF   rï   rÛ   rP   rø   rþ   rã   rç   r  r>   rÿ   rö   r$  r
  r  rT   r>  r  r  rH  r¨   r’   r  r.  r  r\  r]  rG  rk   rv   rj   rb   rf   r{   rz   r„   rw  ry  r'  r   r   r   r   r»   r»     sû   † Ø€Hà ÐØ $ÐØ#Ðð 59Ø&*Ø'+Ø&*ô	Q"òf	1ôò#òLò ò"2òH%ò ò!ôFò$-òPò ;ò.ò%òRò*Còò
-ò8ò.òAò0!ò $òAò,#ò:#ò<Bòò:@ô'ò(ò)ò-ô'ò&ò
(ò!÷r   r»   )rÈ   Úenumr¸   r"   ÚImportErrorÚ r   r   r   r   Úlogr   ÚSSLWantReadErrorÚSSLSyscallErrorr-  ÚEnumr
   r   r(   r0   Ú_FlowControlMixinÚ	Transportr2   rå   r»   r   r   r   Ú<module>r¢     s·   ðó
 Û Û ðÛõ Ý Ý Ý Ý à�?Ø×*Ñ*¨C×,?Ñ,?Ð@€Nô�t—y‘yô ô&�t—y‘yô &ò òô*r;˜J×8Ñ8Ø&×0Ñ0ôr;ôjZ
�)×,Ñ,õ Z
øð{ ó Ø
‚Cðús   ŽB1 Â1B<Â;B<