a
    (ñ»jPÇ  ã                
   @  s�  U d dl mZ d dlZd dlZd dlZd dlZd dlZd dlm	Z	m
Z
mZ d dlmZ d dlmZ d dlmZmZmZ d dlZd dlmZ d dlmZ d d	lmZmZ d d
lmZmZmZmZ zd dl Z d dl!m"Z" W n. e#�y Z$ zee$ƒ W Y dZ$[$n
dZ$[$0 0 d dlZddl%m&Z&mZ' ddl(m)Z) ddl&m*Z*m+Z+ ddl,m-Z- ddl.m/Z/ ddl0m1Z1 ddl2m3Z3m4Z4 ddl5m6Z6m7Z7m8Z8m9Z9 ddl:m;Z; ddl<m=Z=m>Z>m?Z?m@Z@mAZA e�rüd dlBmCZCmDZDmEZEmFZF d dlGmHZH d dlImJZJ d dlKmLZL ddlMmNZN e  O¡ ZPeP Qd¡ZRe SejTjU¡ZVeWedƒ�r:eV jXejY M  _XeR ZeV¡ ej[ddd gd!�d"d#d$œd%d&„ƒZ\d'd(œd)d*d+d,œd-d.„Z]e	džd*d/d0œd1d2„ƒZ^e	dŸd3d*d4d5œd6d7„ƒZ_G d8d9„ d9e)ƒZ`d+d:œd;d<„Zae
d d3d=d>d?œd@dA„ƒZbdddBœd3dCdCdDdDdEdFœdGdH„Zceeef ZddIeedJ< d¡d3dKdKdLdMœdNdO„Zfeeef ZgdIeedP< d¢d3dKdKdQdMœdRdS„Zhd3d+dTœdUdV„Zid3d+dTœdWdX„Zjd3d+dTœdYdZ„Zkd3d+dTœd[d\„Zld3d+dTœd]d^„Zme-d_d3d+d`œdadb„ƒZnd3d+dTœdcdd„Zod+d:œdedf„Zpejqjrejsdgk�oôejtdhkdidj�d3d+dTœdkdl„ƒZud3d+dTœdmdn„Zvejq wdod'dpg¡d3d*d+dqœdrds„ƒZxd3d+dTœdtdu„Zyd3d+dTœdvdw„Zzd3d+dTœdxdy„Z{d3d+dTœdzd{„Z|d3d+dTœd|d}„Z}d3d+dTœd~d„Z~d+d:œd€d�„Zd3d+dTœd‚dƒ„Z€d3d+dTœd„d…„Z�d3d+dTœd†d‡„Z‚d3d+dTœdˆd‰„Zƒd3d+dTœdŠd‹„Z„d3d+dTœdŒd�„Z…d3d+dTœdŽd�„Z†d3d+dTœd�d‘„Z‡ejq ˆd’d“¡d3d+dTœd”d•„ƒZ‰d3d+dTœd–d—„ZŠd3d+dTœd˜d™„Z‹d3d+dTœdšd›„ZŒd3d+dTœdœd�„Z�dS )£é    )ÚannotationsN)ÚasynccontextmanagerÚcontextmanagerÚsuppress)Úpartial)Ú
SSLContext)ÚTYPE_CHECKINGÚAnyÚNoReturn)ÚStapledStream)Úskip_if_optional_else_raise)ÚReceiveStreamÚ
SendStream)ÚMatcherÚMemoryReceiveStreamÚMemorySendStreamÚRaisesGroup)ÚSSLé   )Ú_coreÚsocket)ÚStream)ÚBrokenResourceErrorÚClosedResourceError)Úslow)Úaclose_forcefully)Úopen_tcp_stream)ÚSocketListenerÚSocketStream)ÚNeedHandshakeErrorÚSSLListenerÚ	SSLStreamÚ_is_eof)ÚConflictDetector)Ú	SequencerÚassert_checkpointsÚcheck_two_way_streamÚlockstep_stream_pairÚmemory_stream_pair)ÚAsyncIteratorÚ	AwaitableÚCallableÚIterator)Ú	TypeAlias)Ú	MockClock)ÚT_Stream)ÚCancelScopeútrio-test-1.example.orgÚOP_IGNORE_UNEXPECTED_EOFÚmoduleÚtls13Útls12)ÚscopeÚparamszpytest.FixtureRequestzssl.SSLContext)ÚrequestÚreturnc                 C  s^   t  ¡ }tt dƒr$| jt j M  _t |¡ | jdv r<|S | jdkrTt jj	|_
|S tƒ ‚d S )Nr2   )Údefaultr4   r5   )ÚsslÚcreate_default_contextÚhasattrÚoptionsr2   ÚTRIO_TEST_CAZconfigure_trustÚparamÚ
TLSVersionÚTLSv1_2Úmaximum_versionÚAssertionError)r8   Úctx© rF   ú:E:\soccer\ml_env\Lib\site-packages\trio/_tests/test_ssl.pyÚ
client_ctxb   s    




rH   F©Úexpect_failzstdlib_socket.socketÚboolÚNone)ÚsockrJ   r9   c             
   C  s:  �z(zªt j| ddd�}|�‚ | ¡  | d¡}|s‚tttjƒ� | ¡  W d   ƒ n1 s\0    Y  W d   ƒ W W |  	¡  d S | 
|¡ q$W d   ƒ n1 s¢0    Y  W nb ttfyÐ   Y W |  	¡  d S  t�y } z(|rðtd|ƒ ntd|ƒ ‚ W Y d }~nd }~0 0 |�r tdƒ‚W |  	¡  n
|  	¡  0 d S )NTF)Úserver_sideÚsuppress_ragged_eofsi   z*ssl_echo_serve_sync got error as expected:z)ssl_echo_serve_sync got unexpected error:zfailed to fail?)Ú
SERVER_CTXÚwrap_socketÚdo_handshakeÚrecvr   ÚBrokenPipeErrorr;   ÚSSLZeroReturnErrorÚunwrapÚcloseÚsendallÚConnectionResetErrorÚConnectionAbortedErrorÚ	ExceptionÚprintÚRuntimeError)rM   rJ   ÚwrappedÚdataÚexcrF   rF   rG   Ússl_echo_serve_synct   s8    ý
&ä.õ

ra   zAsyncIterator[SocketStream])rJ   r9   c                 C s¾   t  ¡ \}}t ¡ 4 I d H šˆ}|�^ |�: | tjjtt|| d�¡ t	t
 |¡ƒV  W d   ƒ n1 sh0    Y  W d   ƒ n1 s†0    Y  W d   ƒI d H  qº1 I d H s°0    Y  d S )NrI   )Ústdlib_socketÚ
socketpairÚtrioÚopen_nurseryÚ
start_soonZ	to_threadZrun_syncr   ra   r   ÚtsocketÚfrom_stdlib_socket)rJ   ÚaÚbÚnurseryrF   rF   rG   Ússl_echo_server_raw«   s    þrl   r   z AsyncIterator[SSLStream[Stream]])rH   rJ   r9   c              	   C sR   t |d�4 I d H š&}t|| dd�V  W d   ƒI d H  qN1 I d H sD0    Y  d S )NrI   r1   ©Úserver_hostname)rl   r!   )rH   rJ   rM   rF   rF   rG   Ússl_echo_server½   s    ro   c                   @  sx   e Zd Zddddœdd„Zddœdd	„Zd
dœdd„Zddœdd„Zddœdd„Zdddœdd„Zddddœdd„Z	dS )ÚPyOpenSSLEchoStreamNú'Callable[[str], Awaitable[None]] | NonerL   )Úsleeperr9   c                 C  s°   t  t j¡}ddlm} |ƒ }| |jj¡ tt dƒr:J ‚t	 
|¡ t  |d ¡| _| j ¡  t ¡ | _tƒ | _tdƒ| _tdƒ| _|  |d u r¦dddœd	d
„}|| _n|| _d S )Nr   )ÚBindingZOP_NO_TLSv1_4z2simultaneous calls to PyOpenSSLEchoStream.send_allz6simultaneous calls to PyOpenSSLEchoStream.receive_someÚobjectrL   ©Ú_r9   c                 Ó  s   d S ©NrF   ©rv   rF   rF   rG   Úno_op_sleeperò   s    z3PyOpenSSLEchoStream.__init__.<locals>.no_op_sleeper)r   ÚContextZSSLv23_METHODZ,cryptography.hazmat.bindings.openssl.bindingrs   Zset_optionsÚlibZSSL_OP_NO_TLSv1_3r=   ÚTRIO_TEST_1_CERTÚconfigure_certÚ
ConnectionÚ_connZset_accept_stater   Z
ParkingLotÚ_lotÚ	bytearrayÚ_pending_cleartextr#   Ú_send_all_conflict_detectorÚ_receive_some_conflict_detectorrr   )Úselfrr   rE   rs   rj   ry   rF   rF   rG   Ú__init__Ì   s*    


ÿÿzPyOpenSSLEchoStream.__init__©r9   c                 Ã  s   | j  ¡  d S rw   )r   Zbio_shutdown©r…   rF   rF   rG   Úacloseù   s    zPyOpenSSLEchoStream.acloserK   c                 C  s
   | j  ¡ S rw   )r   Úrenegotiate_pendingrˆ   rF   rF   rG   rŠ   ü   s    z'PyOpenSSLEchoStream.renegotiate_pendingc                 C  s   | j  ¡ sJ ‚d S rw   )r   Úrenegotiaterˆ   rF   rF   rG   r‹   ÿ   s    zPyOpenSSLEchoStream.renegotiatec                 Ã  sV   | j �< t ¡ I d H  t ¡ I d H  |  d¡I d H  W d   ƒ n1 sH0    Y  d S )NÚwait_send_all_might_not_block)rƒ   r   Ú
checkpointrr   rˆ   rF   rF   rG   rŒ     s    z1PyOpenSSLEchoStream.wait_send_all_might_not_blockÚbytes©r_   r9   c              	   Ã  s  t dƒ | j�ä t ¡ I d H  t ¡ I d H  |  d¡I d H  | j |¡ |  d¡I d H  z| j d¡}W nH tj	yš   | j 
¡  t d| j ¡ ƒ Y qÂY qH tjy°   Y qÂY qH0 |  j|7  _qH| j ¡  |  d¡I d H  t dƒ W d   ƒ n1 sø0    Y  d S )Nz  --> transport_stream.send_allÚsend_allé   zrenegotiations:z(  <-- transport_stream.send_all finished)r\   rƒ   r   r�   rr   r   Z	bio_writerS   r   ZZeroReturnErrorÚshutdownZtotal_renegotiationsÚWantReadErrorr‚   r€   Z
unpark_all©r…   r_   rF   rF   rG   r�   
  s&    


zPyOpenSSLEchoStream.send_allú
int | None)Únbytesr9   c                 Ã  sÚ  t dƒ |d u rd}| j��¨ �zzt ¡ I d H  t ¡ I d H  |  d¡I d H  z6| j |¡W W |  d¡I d H  t dƒ W  d   ƒ S  tj�y|   | j	�r`t d| j	ƒ z"| j	dd… }| j 
t|ƒ¡ W n„ tj�yP   z>| j |¡W  Y  Y W |  d¡I d H  t dƒ W  d   ƒ S  tj�yJ   t dƒ | j ¡ I d H  Y n0 Y n0 | j	dd…= nt d	ƒ | j ¡ I d H  Y q>0 q>W |  d¡I d H  t dƒ n|  d¡I d H  t dƒ 0 W d   ƒ n1 �sÌ0    Y  d S )
Nz#  --> transport_stream.receive_somei   Úreceive_somez,  <-- transport_stream.receive_some finishedz
    tryingr   r‘   zparking (a)zparking (b))r\   r„   r   r�   rr   r   Zbio_readr   r“   r‚   ÚsendrŽ   r€   Zpark)r…   r–   Z	next_byterF   rF   rG   r—   !  sF    
)Öî
ÿz PyOpenSSLEchoStream.receive_some)N)N)
Ú__name__Ú
__module__Ú__qualname__r†   r‰   rŠ   r‹   rŒ   r�   r—   rF   rF   rF   rG   rp   Ë   s    þ-rp   r‡   c                  Ã  sj   ddddddœdd„} | ddddƒI d H  | ddd	d
ƒI d H  | d	d
d	d
ƒI d H  | ddddƒI d H  d S )NÚstrztuple[object, ...]rL   )Úfunc1Úargs1Úfunc2Úargs2r9   c              
   Ó  s¦   t ƒ }tttjdƒƒ�| t ¡ 4 I d H šF}|jt|| ƒg|¢R Ž  |jt||ƒg|¢R Ž  W d   ƒI d H  q„1 I d H sz0    Y  W d   ƒ n1 s˜0    Y  d S )NZsimultaneous)rp   r   r   r   ÚBusyResourceErrorre   rf   Úgetattr)r�   rž   rŸ   r    Úsrk   rF   rF   rG   Údo_test`  s
    zDtest_PyOpenSSLEchoStream_gives_resource_busy_errors.<locals>.do_testr�   )ó   xrŒ   rF   r—   )r‘   rF   )r¤   rF   rF   rG   Ú3test_PyOpenSSLEchoStream_gives_resource_busy_errorsY  s    ü
r¦   rq   z(Iterator[SSLStream[PyOpenSSLEchoStream]])rH   rr   r9   c                 c  s   t |d�}t|| dd�V  d S )N©rr   r1   rm   )rp   r!   )rH   rr   ZfakesockrF   rF   rG   Úvirtual_ssl_echo_serverw  s    
r¨   ©Úclient_kwargsÚserver_kwargsr/   zdict[str, Any] | Nonez/tuple[SSLStream[T_Stream], SSLStream[T_Stream]])rH   Úclient_transportÚserver_transportrª   r«   r9   c                C  sL   |d u ri }|d u ri }t || fddi|¤Ž}t |tfddi|¤Ž}||fS )Nrn   r1   rN   T)r!   rP   )rH   r¬   r­   rª   r«   Ú
client_sslÚ
server_sslrF   rF   rG   Ússl_wrap_pair€  s*    þýüþýür°   r-   ÚMemoryStapledStreamz+dict[str, str | bytes | bool | None] | NoneúEtuple[SSLStream[MemoryStapledStream], SSLStream[MemoryStapledStream]])rH   rª   r«   r9   c                 C  s   t ƒ \}}t| ||||d�S ©Nr©   )r(   r°   ©rH   rª   r«   r¬   r­   rF   rF   rG   Ússl_memory_stream_pairž  s    
ûrµ   ÚMyStapledStreamú=tuple[SSLStream[MyStapledStream], SSLStream[MyStapledStream]]c                 C  s   t ƒ \}}t| ||||d�S r³   )r'   r°   r´   rF   rF   rG   Ússl_lockstep_stream_pair³  s    
ûr¸   )rH   r9   c              	   Ã  sÞ  t | ƒ4 I d H šV}|jrJ ‚| d¡I d H  | d¡I d H dksDJ ‚| ¡ I d H  W d   ƒI d H  q|1 I d H sr0    Y  tdd�4 I d H š†}t ¡ }t||dd�}|jr°J ‚t	 
t¡� }| d¡I d H  W d   ƒ n1 sà0    Y  t|jjtjƒsþJ ‚W d   ƒI d H  �q,1 I d H �s"0    Y  tdd�4 I d H š„}t|| dd�}|j�rZJ ‚t	 
t¡� }| d¡I d H  W d   ƒ n1 �sŒ0    Y  t|jjtjƒ�s¬J ‚W d   ƒI d H  �qÚ1 I d H �sÐ0    Y  d S )Nr¥   r‘   TrI   r1   rm   ztrio-test-2.example.org)ro   rN   r�   r—   r‰   rl   r;   r<   r!   ÚpytestÚraisesr   Ú
isinstanceÚvalueÚ	__cause__ÚSSLErrorÚCertificateError)rH   r£   rM   Zbad_client_ctxÚexcinforF   rF   rG   Útest_ssl_client_basicsÈ  s$    
8
.B0rÁ   c              	   ƒ  s  t  ¡ \‰ }ˆ �ð |�Ì t |¡}tt|ƒtdd�}|js>J ‚ddœ‡ ‡fdd„}tj	|d�}| 
¡  | d¡I d H d	ks~J ‚| d
¡I d H  | d¡I d H dks¦J ‚| d¡I d H dks¾J ‚| ¡ I d H  | ¡  W d   ƒ n1 sè0    Y  W d   ƒ n1 �s0    Y  d S )NT©rN   rL   r‡   c                    s`   ˆj ˆ dd��>} |  d¡ |  d¡dks,J ‚|  d¡ |  ¡  W d   ƒ n1 sR0    Y  d S )Nr1   rm   r¥   r‘   ó   yó   z)rQ   rX   rS   rV   )Zclient_sock©ri   rH   rF   rG   Úclientí  s    þ

z&test_ssl_server_basics.<locals>.client)Útargetr‘   r¥   rÃ   rÄ   ó    )rb   rc   rg   rh   r!   r   rP   rN   Ú	threadingÚThreadÚstartr—   r�   r‰   Újoin)rH   rj   Zserver_sockr­   rÆ   ÚtrF   rÅ   rG   Útest_ssl_server_basicsâ  s$    
ý

rÎ   c              	   Ã  s²  t dd�4 I d H �š‚}| }t ¡ }t||dd�}|j|u s>J ‚|j|u sLJ ‚|jdksZJ ‚|jdkshJ ‚t 	t
¡� |j W d   ƒ n1 sŽ0    Y  dt|ƒv s¨J ‚dt|ƒv s¸J ‚t 	t
¡� d|_W d   ƒ n1 sÞ0    Y  t 	t
¡� d|_W d   ƒ n1 �s0    Y  ||_|j|u �s0J ‚t 	t¡�}| ¡ I d H  W d   ƒ n1 �s`0    Y  t|jjtjƒ�s€J ‚W d   ƒI d H  �q®1 I d H �s¤0    Y  d S )	NTrI   r1   rm   FÚtransport_streamÚcontextZasdf)rl   r;   r<   r!   rÏ   rÐ   rN   rn   r¹   rº   ÚAttributeErrorZ
asfdasdfsaÚdirr   rR   r»   r¼   r½   r¾   )rH   rM   Zgood_ctxZbad_ctxr£   rÀ   rF   rF   rG   Útest_attributes  s*    $$&.rÓ   c              
   ƒ  s<  d‰ d‰ˆ ˆ ‰t ƒ ‰t ƒ ‰dddœ‡ ‡‡fdd„}dddœ‡‡‡fdd	„}t| ƒ4 I d H š’}t ¡ 4 I d H šF}| ||¡ | ||¡ | |j¡ | |j¡ W d   ƒI d H  qÊ1 I d H sÀ0    Y  | ¡ I d H  W d   ƒI d H  �q1 I d H sú0    Y  tˆƒtˆƒ  k�r$ˆk�s*n J ‚ˆˆk�s8J ‚d S )
Né   i €  r   rL   ©r£   r9   c                 “  s@   t ˆ ƒD ]2}t|ƒ t|gˆ ƒ}ˆ|7 ‰|  |¡I d H  qd S rw   )Úranger\   rŽ   r�   )r£   ÚiÚchunk)ÚCHUNKSÚ
CHUNK_SIZEÚsentrF   rG   ÚsenderP  s
    z'test_full_duplex_basics.<locals>.senderc                 “  s.   t ˆƒˆk r*|  ˆ d ¡I d H }ˆ|7 ‰q d S )Nr   )Úlenr—   )r£   rØ   )rÚ   ÚEXPECTEDÚreceivedrF   rG   ÚreceiverX  s    z)test_full_duplex_basics.<locals>.receiver)r�   ro   r   re   rf   rR   r‰   rÝ   )rH   rÜ   rà   r£   rk   rF   )rÙ   rÚ   rÞ   rß   rÛ   rG   Útest_full_duplex_basicsH  s     6:&rá   c                 Ã  s¢   t | ƒ�†}| ¡ I d H  |j ¡  | d¡I d H  | d¡I d H dksJJ ‚| d¡I d H  | d¡I d H dksrJ ‚| ¡ I d H  W d   ƒ n1 s”0    Y  d S )Nó   ar‘   ó   b)r¨   rR   rÏ   r‹   r�   r—   r‰   ©rH   r£   rF   rF   rG   Útest_renegotiation_simplem  s    

rå   r.   )Ú
mock_clockrH   r9   c                 ƒ  s,  d| _ dd l}| d¡‰dddœ‡fdd„}ddœ‡ ‡‡fdd	„}d
ddœ‡fdd„‰d
ddœ‡fdd„‰ t||d���þ‰ˆ ¡ I d H  ˆdƒI d H  ˆj ¡  ˆ dƒI d H  |ƒ I d H  tdƒD ]ê}t|d gƒ}td| d gƒ}ˆj ¡  t	 
¡ 4 I d H š0}| ˆ|¡ | ˆ |¡ W d   ƒI d H  �qH1 I d H �s>0    Y  t	 
¡ 4 I d H š0}| ˆ |¡ | ˆ|¡ W d   ƒI d H  �q 1 I d H �s–0    Y  |ƒ I d H  qÂtdƒD ]°}t|d gƒ}td| d gƒ}ˆ|ƒI d H  ˆj ¡  ˆ |ƒI d H  t	 
¡ 4 I d H š0}| ˆ |¡ | ˆ|¡ W d   ƒI d H  �qX1 I d H �sN0    Y  |ƒ I d H  �q¶W d   ƒ n1 �s~0    Y  dddœdd„}	ddœ‡fdd„}
t||	d��˜‰ˆdƒI d H  ˆj ¡  t	 
¡ 4 I d H š.}| ˆ d¡ | |
¡ W d   ƒI d H  �q&1 I d H �s0    Y  |ƒ I d H  ˆ ¡ I d H  W d   ƒ n1 �sV0    Y  dddœdd„}t||d��š‰ˆdƒI d H  ˆj ¡  t	 
¡ 4 I d H š0}| ˆ d¡ | ˆj¡ W d   ƒI d H  �qî1 I d H �sä0    Y  |ƒ I d H  ˆ ¡ I d H  W d   ƒ n1 �s0    Y  d S )Nr   rt   rL   ru   c                 “  s   t  ˆ  dd¡¡I d H  d S )Nr   é
   )rd   ÚsleepÚuniformrx   )ÚrrF   rG   rr   ‹  s    z.test_renegotiation_randomized.<locals>.sleeperr‡   c                   “  s€   ˆj  ¡ rttƒ � ˆdƒI d H  W d   ƒ n1 s40    Y  tƒ � ˆ dƒI d H  W d   ƒ q 1 sh0    Y  q tdƒ d S )Nó   -z-- clear --)rÏ   rŠ   r%   r\   rF   )Úexpectr£   r˜   rF   rG   ÚclearŽ  s    
,.z,test_renegotiation_randomized.<locals>.clearrŽ   )Úbyter9   c                 “  sV   ˆ j  d¡I d H  td| ƒ tƒ �  ˆ  | ¡I d H  W d   ƒ n1 sH0    Y  d S )Nz
outer sendzcalling SSLStream.send_all)rÏ   rr   r\   r%   r�   )rî   ©r£   rF   rG   r˜   –  s    
z+test_renegotiation_randomized.<locals>.send)Úexpectedr9   c                 “  sn   ˆ j  d¡I d H  td| ƒ t| ƒdks,J ‚tƒ �( ˆ  d¡I d H | ksLJ ‚W d   ƒ n1 s`0    Y  d S )Nrì   z)calling SSLStream.receive_some, expectingr‘   )rÏ   rr   r\   rÝ   r%   r—   )rð   rï   rF   rG   rì   œ  s
    
z-test_renegotiation_randomized.<locals>.expectr§   râ   éd   éÿ   r   rœ   )Úmethodr9   c                 Ó  s   | dkrt  d¡I d H  d S )Nr�   é † ©rd   rè   ©ró   rF   rF   rG   Úsleeper_with_slow_send_allÊ  s    zAtest_renegotiation_randomized.<locals>.sleeper_with_slow_send_allc                   “  s"   t  d¡I d H  ˆ  ¡ I d H  d S )Néè  )rd   rè   rŒ   rF   rï   rF   rG   Úsleep_then_wait_writableÑ  s    z?test_renegotiation_randomized.<locals>.sleep_then_wait_writabler¥   c                 Ó  s6   | dkrt  d¡I d H  n| dkr2t  d¡I d H  d S )NrŒ   rô   rì   rø   rõ   rö   rF   rF   rG   Ú*sleeper_with_slow_wait_writable_and_expectã  s    zQtest_renegotiation_randomized.<locals>.sleeper_with_slow_wait_writable_and_expect)Zautojump_thresholdÚrandomÚRandomr¨   rR   rÏ   r‹   rÖ   rŽ   r   re   rf   r‰   rŒ   )ræ   rH   rû   rr   rí   r×   Úb1Úb2rk   r÷   rù   rú   rF   )rì   rê   r£   r˜   rG   Útest_renegotiation_randomized~  sr    


::
:0	
8.þ
:rÿ   c                 ƒ  s¦   t jt jt jjt jjf  }dddœdd„}dddœdd„}dddœdd	„}d
d
ddœ‡ fdd„}|||ƒI d H  |||ƒI d H  |||ƒI d H  |||ƒI d H  d S )NÚSrL   rÕ   c                 Ó  s:   t ƒ �  |  d¡I d H  W d   ƒ n1 s,0    Y  d S )Nr¥   )r%   r�   rï   rF   rF   rG   Údo_send_allþ  s    z.test_resource_busy_errors.<locals>.do_send_allc                 Ó  s:   t ƒ �  |  d¡I d H  W d   ƒ n1 s,0    Y  d S ©Nr‘   )r%   r—   rï   rF   rF   rG   Údo_receive_some  s    z2test_resource_busy_errors.<locals>.do_receive_somec                 Ó  s8   t ƒ � |  ¡ I d H  W d   ƒ n1 s*0    Y  d S rw   )r%   rŒ   rï   rF   rF   rG   Ú do_wait_send_all_might_not_block  s    zCtest_resource_busy_errors.<locals>.do_wait_send_all_might_not_blockzCallable[[S], Awaitable[None]])r�   rŸ   r9   c              
   “  s”   t ˆ ƒ\}}tttjdƒƒ�d t ¡ 4 I d H š.}| | |¡ | ||¡ W d   ƒI d H  qr1 I d H sh0    Y  W d   ƒ n1 s†0    Y  d S )Nzanother task)r¸   r   r   r   r¡   re   rf   )r�   rŸ   r£   rv   rk   ©rH   rF   rG   r¤   
  s
    z*test_resource_busy_errors.<locals>.do_test)rd   r!   r   Úabcr   r   )rH   r   r  r  r  r¤   rF   r  rG   Útest_resource_busy_errorsù  s    ÿ
r  c                  ƒ  sP   g ‰ G ‡ fdd„dt ƒ} t ¡ }t| ƒ |dd�}| ¡ I d H  ˆ dgksLJ ‚d S )Nc                      sN   e Zd Zddœ‡ fdd„Zddœdd„Zddd	d
œdd„Zdddœdd„ZdS )zEtest_wait_writable_calls_underlying_wait_writable.<locals>.NotAStreamrL   r‡   c                 “  s   ˆ   d¡ d S )NÚok)Úappendrˆ   ©ÚrecordrF   rG   rŒ     s    zctest_wait_writable_calls_underlying_wait_writable.<locals>.NotAStream.wait_send_all_might_not_blockc                 Ó  s   t dƒ‚d S ©NzShould not get called©rD   rˆ   rF   rF   rG   r‰   "  s    zLtest_wait_writable_calls_underlying_wait_writable.<locals>.NotAStream.acloseNr•   zbytes | bytearray)Ú	max_bytesr9   c                 Ó  s   t dƒ‚d S r  r  )r…   r  rF   rF   rG   r—   %  s    zRtest_wait_writable_calls_underlying_wait_writable.<locals>.NotAStream.receive_somezbytes | bytearray | memoryviewr�   c                 Ó  s   t dƒ‚d S r  r  r”   rF   rF   rG   r�   (  s    zNtest_wait_writable_calls_underlying_wait_writable.<locals>.NotAStream.send_all)N)r™   rš   r›   rŒ   r‰   r—   r�   rF   r
  rF   rG   Ú
NotAStream  s   r  Úxrm   r  )r   r;   r<   r!   rŒ   )r  rE   r£   rF   r
  rG   Ú1test_wait_writable_calls_underlying_wait_writable  s    r  Únt)é   rç   z)frequently fails on Windows + Python 3.10)Úreasonc              	   Ã  sz  t | ƒ4 I d H �šÈ}tƒ � | ¡ I d H  W d   ƒ n1 s>0    Y  tƒ � | ¡ I d H  W d   ƒ n1 sr0    Y  tƒ � | ¡ I d H  W d   ƒ n1 s¦0    Y  tƒ �  | d¡I d H  W d   ƒ n1 sÜ0    Y  tƒ �  | d¡I d H  W d   ƒ n1 �s0    Y  tƒ �  | d¡I d H  W d   ƒ n1 �sL0    Y  tƒ �  | d¡I d H  W d   ƒ n1 �s„0    Y  tƒ � | ¡ I d H  W d   ƒ n1 �sº0    Y  W d   ƒI d H  �qò1 I d H �sè0    Y  t | ƒ4 I d H š\}| ¡ I d H  tƒ � | ¡ I d H  W d   ƒ n1 �s>0    Y  W d   ƒI d H  �qv1 I d H �sl0    Y  d S )Ns   xxxr‘   )ro   r%   rR   rŒ   r�   r—   rV   r‰   rä   rF   rF   rG   Útest_checkpoints1  s*    ,,,.000\r  c              	   Ã  sð   t | ƒ4 I d H šÆ}| ¡ I d H  tƒ �  | d¡I d H  W d   ƒ n1 sL0    Y  tƒ �  | d¡I d H  W d   ƒ n1 s‚0    Y  | d¡I d H  | d¡I d H dks´J ‚| ¡ I d H  W d   ƒI d H  qì1 I d H sâ0    Y  d S )NrÈ   r¥   r‘   )ro   rR   r%   r�   r—   r‰   rä   rF   rF   rG   Útest_send_all_empty_stringR  s    ..r  Úhttps_compatibleT)rH   r  r9   c                 ƒ  s:   ddœ‡ ‡fdd„}ddœ‡ fdd„}t ||ƒI d H  d S )Nr²   r‡   c                   “  s   t ˆ dˆidˆid�S )Nr  r©   )rµ   rF   ©rH   r  rF   rG   Ústream_makerg  s
    ýz,test_SSLStream_generic.<locals>.stream_makerr·   c               	   “  sh   t ˆ ƒ\} }t ¡ 4 I d H š.}| | j¡ | |j¡ W d   ƒI d H  q`1 I d H sV0    Y  | |fS rw   )r¸   r   re   rf   rR   )rÆ   Úserverrk   r  rF   rG   Úclogged_stream_makerq  s
    6z4test_SSLStream_generic.<locals>.clogged_stream_maker)r&   )rH   r  r  r  rF   r  rG   Útest_SSLStream_genericb  s    
r  c              	   ƒ  sž   t | ƒ\‰ ‰ˆ j‰ˆj‰tƒ ‰ddœ‡ ‡‡fdd„}ddœ‡‡‡fdd„}t ¡ 4 I d H š*}| |¡ | |¡ W d   ƒI d H  qš1 I d H s�0    Y  d S )NrL   r‡   c               	   “  s  ˆ   ¡ I d H  ˆ  d¡I d H  ˆ  d¡I d H dks6J ‚ˆ  d¡I d H  ˆdƒ4 I d H š& ˆjj} d ˆj_W d   ƒI d H  q’1 I d H sˆ0    Y  ˆ  d¡I d H dksªJ ‚ˆ jˆu s¸J ‚ˆ  ¡ I d H \}}|ˆu sÖJ ‚|dksâJ ‚ˆ jd u sðJ ‚| d¡I d H  | ˆj_ˆj ¡ I d H  d S )Nr¥   r‘   rÃ   rÄ   r   rÈ   ó   trailing)rR   r�   r—   Úsend_streamÚsend_all_hookrÏ   rV   )r  ÚrawÚtrailing)r®   r¬   ÚseqrF   rG   rÆ   ‹  s     2ztest_unwrap.<locals>.clientc               	   “  sÆ   ˆ  ¡ I d H  ˆ d¡I d H dks&J ‚ˆ d¡I d H  ˆ d¡I d H dksNJ ‚ˆ dƒ4 I d H š( ˆ ¡ I d H \} }W d   ƒI d H  qœ1 I d H s’0    Y  | ˆu s¨J ‚|dks´J ‚ˆjd u sÂJ ‚d S )Nr‘   r¥   rÃ   rÄ   r  )rR   r—   r�   rV   rÏ   )r   r!  )r"  r¯   r­   rF   rG   r  ¦  s    <ztest_unwrap.<locals>.server)rµ   rÏ   r$   r   re   rf   ©rH   rÆ   r  rk   rF   )r®   r¬   r"  r¯   r­   rG   Útest_unwrap„  s    
r$  c              	   ƒ  s˜  t | ƒ\‰ ‰ˆ j}ddœ‡ fdd„}ddœ‡fdd„}t ¡ 4 I d H š*}| |¡ | |¡ W d   ƒI d H  q†1 I d H s|0    Y  t t¡�  | d¡I d H  W d   ƒ n1 s¶0    Y  t	ƒ � ˆ  
¡ I d H  W d   ƒ n1 sê0    Y  t	ƒ � ˆ  
¡ I d H  W d   ƒ n1 �s 0    Y  t t¡�  ˆ d¡I d H  W d   ƒ n1 �s\0    Y  t t¡�* ˆ  d¡I d H d	k�sŒJ ‚W d   ƒ n1 �s¢0    Y  t t¡� ˆ  ¡ I d H  W d   ƒ n1 �sÜ0    Y  t t¡� ˆ  ¡ I d H  W d   ƒ n1 �s0    Y  t | ƒ\‰ ‰ddœ‡fd
d„}t ¡ 4 I d H š.}| ˆ j
¡ | |¡ W d   ƒI d H  �q”1 I d H �sŠ0    Y  d S )NrL   r‡   c                   “  s8   t ƒ � ˆ  ¡ I d H  W d   ƒ n1 s*0    Y  d S rw   )r%   r‰   rF   )r®   rF   rG   Úclient_closerÂ  s    z-test_closing_nice_case.<locals>.client_closerc                   “  sh   ˆ   d¡I d H dksJ ‚ˆ   d¡I d H dks0J ‚tƒ � ˆ  ¡ I d H  W d   ƒ n1 sZ0    Y  d S ©Nrç   rÈ   )r—   r%   r‰   rF   ©r¯   rF   rG   Úserver_closerÆ  s    z-test_closing_nice_case.<locals>.server_closers   123rç   rÈ   c                   “  sv   t ƒ �( ˆ  d¡I d H dks J ‚W d   ƒ n1 s40    Y  t ƒ � ˆ  ¡ I d H  W d   ƒ n1 sh0    Y  d S r&  )r%   r—   r‰   rF   r'  rF   rG   Úexpect_eof_serverí  s    6z1test_closing_nice_case.<locals>.expect_eof_server)rµ   rÏ   r   re   rf   r¹   rº   r   r�   r%   r‰   r—   rV   rR   )rH   r¬   r%  r(  rk   r)  rF   )r®   r¯   rG   Útest_closing_nice_caseº  s4    
4.,.0:..r*  c              	   ƒ  s4  t | ƒ\}}t ¡ 4 I d H š.}| |j¡ | |j¡ W d   ƒI d H  q`1 I d H sV0    Y  ddœdd„}||jj_t 	t
¡�  | d¡I d H  W d   ƒ n1 s¨0    Y  t 	t¡� | ¡ I d H  W d   ƒ n1 sà0    Y  d‰ ddœ‡ fdd	„}||jj_||jj_| ¡ I d H  ˆ d
k�s0J ‚d S )Nr
   r‡   c                   Ó  s   t ‚d S rw   ©ÚKeyErrorrF   rF   rF   rG   Úbad_hookÿ  s    z3test_send_all_fails_in_the_middle.<locals>.bad_hookr¥   r   rL   c                     s   ˆ d7 ‰ d S r  rF   rF   ©ÚclosedrF   rG   Ú
close_hook  s    z5test_send_all_fails_in_the_middle.<locals>.close_hookr   )rµ   r   re   rf   rR   rÏ   r  r  r¹   rº   r,  r�   r   rŒ   r0  Úreceive_streamr‰   )rH   rÆ   r  rk   r-  r0  rF   r.  rG   Ú!test_send_all_fails_in_the_middleø  s     6
.,

r2  c              	   ƒ  sº   t ƒ \}}t|| dd�}t|tdd�}t|| dd�‰ t|tdd�‰ddœ‡ fdd„}ddœ‡fd	d
„}t ¡ 4 I d H š*}| |¡ | |¡ W d   ƒI d H  q¶1 I d H s¬0    Y  d S )Nr1   rm   TrÂ   rL   r‡   c                   “  s,   ˆ   d¡I d H  ˆ  d¡I d H dks(J ‚d S )Nó   hirç   ó   bye)r�   r—   rF   )Úclient_2rF   rG   rÆ   (  s    z!test_ssl_over_ssl.<locals>.clientc                   “  s,   ˆ   d¡I d H dksJ ‚ˆ  d¡I d H  d S )Nrç   r3  r4  )r—   r�   rF   )Úserver_2rF   rG   r  ,  s    z!test_ssl_over_ssl.<locals>.server)r(   r!   rP   r   re   rf   )rH   Zclient_0Zserver_0Zclient_1Zserver_1rÆ   r  rk   rF   )r5  r6  rG   Útest_ssl_over_ssl  s$    
ýý
r7  c              	   Ã  sö   t | ƒ\}}t ¡ 4 I d H š.}| |j¡ | |j¡ W d   ƒI d H  q`1 I d H sV0    Y  t |¡I d H  t t	¡�  | 
d¡I d H  W d   ƒ n1 s 0    Y  t t	¡�  | d¡I d H  W d   ƒ n1 sÚ0    Y  | ¡ I d H  d S )Nrç   ó
   xxxxxxxxxx)rµ   r   re   rf   rR   rd   r   r¹   rº   r   r—   r�   r‰   r#  rF   rF   rG   Útest_ssl_bad_shutdown5  s    6..r9  c              	   Ã  sâ   t | ddiddid�\}}t ¡ 4 I d H š.}| |j¡ | |j¡ W d   ƒI d H  qn1 I d H sd0    Y  t |¡I d H  | d¡I d H dks–J ‚t 	t
¡�  | d¡I d H  W d   ƒ n1 sÆ0    Y  | ¡ I d H  d S )Nr  T©r«   rª   rç   rÈ   r8  )rµ   r   re   rf   rR   rd   r   r—   r¹   rº   r   r�   r‰   r#  rF   rF   rG   Ú test_ssl_bad_shutdown_but_its_okF  s    ý
6.r;  c               	   Ã  s�   t dd�4 I d H šd} t ¡ }t| |dd�}t t¡� | ¡ I d H  W d   ƒ n1 sX0    Y  W d   ƒI d H  qŒ1 I d H s‚0    Y  d S )NTrI   r1   rm   )rl   r;   r<   r!   r¹   rº   r   r‰   )rM   rH   r£   rF   rF   rG   Ú(test_ssl_handshake_failure_during_acloseZ  s
    r<  c              	   ƒ  sÔ   t | ƒ\}}t ¡ 4 I d H š.}| |j¡ | |j¡ W d   ƒI d H  q`1 I d H sV0    Y  |jjj‰ d‰ddœ‡ ‡fdd„}||jj_t 	t
¡� | ¡ I d H  W d   ƒ n1 sº0    Y  ˆdksÐJ ‚d S )Nr   r
   r‡   c                     s"   ˆ d usJ ‚ˆ ƒ  ˆd7 ‰t ‚d S r  r+  rF   ©Zclient_orig_close_hookZtransport_close_countrF   rG   r0  y  s    z4test_ssl_only_closes_stream_once.<locals>.close_hookr‘   )rµ   r   re   rf   rR   rÏ   r  r0  r¹   rº   r,  r‰   )rH   rÆ   r  rk   r0  rF   r=  rG   Ú test_ssl_only_closes_stream_oncem  s    6

,r>  c              	   ƒ  sÖ   t | ddiddid�\}‰ t ¡ 4 I d H š.}| |j¡ | ˆ j¡ W d   ƒI d H  qn1 I d H sd0    Y  ddœ‡ fdd„}t ¡ 4 I d H š,}| |j¡ | |¡ W d   ƒI d H  qÒ1 I d H sÈ0    Y  d S )	Nr  FTr:  rL   r‡   c                  “  sN   t  t¡� } ˆ  d¡I d H  W d   ƒ n1 s00    Y  t| jjƒsJJ ‚d S )Nrç   )r¹   rº   r   r—   r"   r¼   r½   )rÀ   ©r  rF   rG   Úreceive_and_expect_error”  s    .zKtest_ssl_https_compatibility_disagreement.<locals>.receive_and_expect_error)rµ   r   re   rf   rR   r‰   )rH   rÆ   rk   r@  rF   r?  rG   Ú)test_ssl_https_compatibility_disagreement‡  s    ý
6rA  c              	   ƒ  s‚   t | ddiddid�\}‰ ddœ‡ fdd„}t ¡ 4 I d H š,}| |j¡ | |¡ W d   ƒI d H  q~1 I d H st0    Y  d S )Nr  Tr:  rL   r‡   c                   “  s   ˆ   d¡I d H dksJ ‚d S r&  )r—   rF   r?  rF   rG   Úserver_expect_clean_eof¦  s    zEtest_https_mode_eof_before_handshake.<locals>.server_expect_clean_eof)rµ   r   re   rf   r‰   )rH   rÆ   rB  rk   rF   r?  rG   Ú$test_https_mode_eof_before_handshakeŸ  s    ý
rC  c              	   Ã  sä   t | ƒ\}}ddœdd„}||jj_t t¡�D tƒ � | ¡ I d H  W d   ƒ n1 sZ0    Y  W d   ƒ n1 sx0    Y  t t	¡�D tƒ � | ¡ I d H  W d   ƒ n1 s¸0    Y  W d   ƒ n1 sÖ0    Y  d S )Nr
   r‡   c                   Ó  s   t ‚d S rw   r+  rF   rF   rF   rG   r-  ±  s    z2test_send_error_during_handshake.<locals>.bad_hook)
rµ   rÏ   r  r  r¹   rº   r,  r%   rR   r   )rH   rÆ   Z_serverr-  rF   rF   rG   Ú test_send_error_during_handshake®  s    
JrD  c              	   ƒ  sð   t | ƒ\‰ }ddœdd„}|ˆ jj_dddœ‡ fdd	„}t ¡ 4 I d H š0}| ||j¡ | |j¡ W d   ƒI d H  qŽ1 I d H s„0    Y  t	 
t¡�D tƒ � ˆ  ¡ I d H  W d   ƒ n1 sÄ0    Y  W d   ƒ n1 sâ0    Y  d S )
Nr
   r‡   c                   Ó  s   t ‚d S rw   r+  rF   rF   rF   rG   r-  Â  s    z5test_receive_error_during_handshake.<locals>.bad_hookr0   rL   )Úcancel_scoper9   c              	   “  sj   t  t¡�D tƒ � ˆ  ¡ I d H  W d   ƒ n1 s60    Y  W d   ƒ n1 sT0    Y  |  ¡  d S rw   )r¹   rº   r,  r%   rR   Úcancel)rE  ©rÆ   rF   rG   Úclient_sideÇ  s    Jz8test_receive_error_during_handshake.<locals>.client_side)rµ   rÏ   r1  Zreceive_some_hookr   re   rf   rE  rR   r¹   rº   r   r%   )rH   r  r-  rH  rk   rF   rG  rG   Ú#test_receive_error_during_handshake¿  s    
6rI  c                 C  st   t | ƒ\}}t t¡� | ¡  W d   ƒ n1 s40    Y  t t¡� | ¡  W d   ƒ n1 sf0    Y  d S rw   )rµ   r¹   rº   r   Úselected_alpn_protocol©rH   rÆ   r  rF   rF   rG   Ú,test_selected_alpn_protocol_before_handshakeÖ  s
    &rL  c              	   Ã  s˜   t | ƒ\}}t ¡ 4 I d H š.}| |j¡ | |j¡ W d   ƒI d H  q`1 I d H sV0    Y  | ¡ d u spJ ‚| ¡ d u s€J ‚| ¡ | ¡ ks”J ‚d S rw   )rµ   r   re   rf   rR   rJ  r#  rF   rF   rG   Ú(test_selected_alpn_protocol_when_not_setà  s    6rM  c                 C  st   t | ƒ\}}t t¡� | ¡  W d   ƒ n1 s40    Y  t t¡� | ¡  W d   ƒ n1 sf0    Y  d S rw   )rµ   r¹   rº   r   Úselected_npn_protocolrK  rF   rF   rG   Ú+test_selected_npn_protocol_before_handshakeï  s
    &rO  zCignore: ssl module. NPN is deprecated, use ALPN instead:UserWarningzAignore:ssl NPN is deprecated, use ALPN instead:DeprecationWarningc              	   Ã  s˜   t | ƒ\}}t ¡ 4 I d H š.}| |j¡ | |j¡ W d   ƒI d H  q`1 I d H sV0    Y  | ¡ d u spJ ‚| ¡ d u s€J ‚| ¡ | ¡ ks”J ‚d S rw   )rµ   r   re   rf   rR   rN  r#  rF   rF   rG   Ú'test_selected_npn_protocol_when_not_setù  s    6rP  c                 C  st   t | ƒ\}}t t¡� | ¡  W d   ƒ n1 s40    Y  t t¡� | ¡  W d   ƒ n1 sf0    Y  d S rw   )rµ   r¹   rº   r   Úget_channel_bindingrK  rF   rF   rG   Ú)test_get_channel_binding_before_handshake  s
    &rR  c              	   Ã  s˜   t | ƒ\}}t ¡ 4 I d H š.}| |j¡ | |j¡ W d   ƒI d H  q`1 I d H sV0    Y  | ¡ d uspJ ‚| ¡ d us€J ‚| ¡ | ¡ ks”J ‚d S rw   )rµ   r   re   rf   rR   rQ  r#  rF   rF   rG   Ú(test_get_channel_binding_after_handshake  s    6rS  c              	   Ã  s”   t | ƒ\}}t ¡ 4 I d H š.}| |j¡ | |j¡ W d   ƒI d H  q`1 I d H sV0    Y  | ¡ d u spJ ‚t| ¡ ƒ d| ¡ d v s�J ‚d S )N)ÚDNSr1   ÚsubjectAltName)rµ   r   re   rf   rR   Úgetpeercertr\   r#  rF   rF   rG   Útest_getpeercert#  s    6rW  c                 ƒ  s„  d
dddœ‡ fdd„}|ƒ I d H \}}}|4 I d H šÚ |  ¡ I d H }|4 I d H št |jr\J ‚t ¡ 4 I d H š.}| |j¡ | |j¡ W d   ƒI d H  q°1 I d H s¦0    Y  W d   ƒI d H  qÚ1 I d H sÐ0    Y  | ¡ I d H  | ¡ dksøJ ‚W d   ƒI d H  �q&1 I d H �s0    Y  |dd	�I d H \}}}|  ¡ I d H }|j�sVJ ‚t|ƒI d H  t|ƒI d H  t|ƒI d H  d S )NFrK   zMtuple[tsocket.SocketType, SSLListener[SocketStream], SSLStream[SocketStream]])r  r9   c                 “  sb   t  ¡ }| d¡I d H  | d¡ t|ƒ}t|t| d�}t| ¡ Ž I d H }t	|ˆ dd�}|||fS )N)z	127.0.0.1r   r‘   ©r  r1   rm   )
rg   r   ÚbindÚlistenr   r    rP   r   Úgetsocknamer!   )r  Úlisten_sockZsocket_listenerÚssl_listenerZtransport_clientÚ
ssl_clientr  rF   rG   Úsetup1  s     
ýýztest_SSLListener.<locals>.setupéÿÿÿÿTrX  )F)	ÚacceptZ_https_compatibler   re   rf   rR   r‰   Úfilenor   )rH   r_  r\  r]  r^  Z
ssl_serverrk   rv   rF   r  rG   Útest_SSLListener0  s$     ÿ
`>rc  )F)F)N)NN)NN)ŽÚ
__future__r   Úosr   rb   r;   ÚsysrÉ   Ú
contextlibr   r   r   Ú	functoolsr   r   Útypingr   r	   r
   r¹   rd   r   Ztrio._tests.pytest_pluginr   Ztrio.abcr   r   Ztrio.testingr   r   r   r   ZtrustmeZOpenSSLr   ÚImportErrorÚerrorÚ r   rg   Ú_abcr   r   r   Z_core._tests.tutilr   Z_highlevel_genericr   Z_highlevel_open_tcp_streamr   Z_highlevel_socketr   r   Ú_sslr   r    r!   r"   Z_utilr#   Ztestingr$   r%   r&   r'   r(   Úcollections.abcr)   r*   r+   r,   Ztyping_extensionsr-   Z
trio._corer.   Z	trio._sslr/   Z
_core._runr0   ÚCAr?   Zissue_server_certr|   r<   ÚPurposeÚCLIENT_AUTHrP   r=   r>   r2   r}   ZfixturerH   ra   rl   ro   rp   r¦   r¨   r°   r±   Ú__annotations__rµ   r¶   r¸   rÁ   rÎ   rÓ   rá   rå   rÿ   r  r  ÚmarkZskipifÚnameÚversion_infor  r  Zparametrizer  r$  r*  r2  r7  r9  r;  r<  r>  rA  rC  rD  rI  rL  rM  rO  ÚfilterwarningsrP  rR  rS  rW  rc  rF   rF   rF   rG   Ú<module>   sÚ   

	ý7 þ  þú  ý  ý!E%z!þ!6>

þ
