
    Zh                        g d 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 ddlmZ ej&                  Z	 ddlZddlmZmZmZmZ d	Zd
Z e	j:                         ZdZdgZ  e!ed      rdZe dgz  Z ej4                  dk(  rdZe dgz  Z efdZ"d Z#d Z$d Z%d Z& G d d      Z'er G d de'      Z( G d de'      Z) G d de*      Z+dDdZ,ej4                  dk7  rdEdZ-ndEdZ- G d de*      Z.d  Z/ej4                  dk(  r G d! d"e*      Z0d# Z1d$Z2d%Z3d&Z4d'Z5d(Z6 e7h d)      Z8 e9d* e8D              Z:d+Z;d,Z<e;e<fZ=d- Z>d. Z?d/ Z@dFd0eAfd1ZBd0eAfd2ZC G d3 d4e*      ZDd5 ZEd6 ZF G d7 d8e+      ZGd9 ZHej4                  dk(  r d: ZIej                  ej                  hZLdGd;ZMn*ddlNZN e!eNd<      reNj                  ZPneNj                  ZPdGd=ZMej4                  dk(  r3d> ZRd? ZS ej                  e)eR       d@ ZUdA ZV ej                  e(eU       ydB ZRdC ZS ej                  e)eR       y# e$ r ddlZY w xY w# e$ r ej4                  dk(  r dZY w xY w)H)ClientListenerPipewait    N   )util)AuthenticationErrorBufferTooShort)	reduction)WAIT_OBJECT_0WAIT_ABANDONED_0WAIT_TIMEOUTINFINITEwin32i    g      4@AF_INETAF_UNIXAF_PIPEc                 P     t        t        dt        j                               | z   S N	monotonicgetattrtime)timeouts    f/mounts/lovelace/software/anaconda3/envs/py312/lib/python3.12/site-packages/multiprocess/connection.py_init_timeoutr   ?   s    .74DII.07::    c                 P     t        t        dt        j                               | kD  S r   r   )ts    r   _check_timeoutr    B   s    .74DII.0144r   c                     | dk(  ry| dk(  r)t        j                  dt        j                               S | dk(  r;t        j                  dt	        j
                         t        t              fz  d      S t        d	      )
z?
    Return an arbitrary free address for the given family
    r   )	localhostr   r   z	listener-)prefixdirr   z\\.\pipe\pyc-%d-%d- zunrecognized family)	tempfilemktempr   get_temp_dirosgetpidnext_mmap_counter
ValueErrorfamilys    r   arbitrary_addressr0   I   sy     	9	kt7H7H7JKK	9	&< "		T--@A'BGIK 	K .//r   c                     t         j                  dk7  r| dk(  rt        d| z        t         j                  dk(  r%| dk(  rt        t        |       st        d| z        yyy)zD
    Checks if the family is valid for the current environment.
    r   r   zFamily %s is not recognized.r   N)sysplatformr-   hasattrsocketr.   s    r   _validate_familyr6   W   sc     ||w6Y#67&@AA
||w6Y#6vv&;fDEE ' $7r   c                     t        |       t        k(  ryt        |       t        u r| j                  d      ryt        |       t        u st	        j
                  |       ryt        d| z        )z]
    Return the types of the address

    This can be 'AF_INET', 'AF_UNIX', or 'AF_PIPE'
    r   z\\r   r   zaddress type of %r unrecognized)typetuplestr
startswithr   is_abstract_socket_namespacer-   )addresss    r   address_typer>   c   s\     G}	g#	'"4"4V"<	g#	!B!B7!K:WDEEr   c                       e Zd ZdZddZd Zd Zd Zd Zd Z	e
d        Ze
d	        Ze
d
        Zd Zd ZddZd ZddZddZd ZddZd Zd Zy)_ConnectionBaseNc                     |j                         }|dk  rt        d      |s|st        d      || _        || _        || _        y )Nr   zinvalid handlez6at least one of `readable` and `writable` must be True)	__index__r-   _handle	_readable	_writable)selfhandlereadablewritables       r   __init__z_ConnectionBase.__init__y   sO    !!#A:-..HJ J!!r   c                 >    | j                   | j                          y y NrC   _closerF   s    r   __del__z_ConnectionBase.__del__   s    <<#KKM $r   c                 2    | j                   t        d      y )Nhandle is closed)rC   OSErrorrO   s    r   _check_closedz_ConnectionBase._check_closed   s    <<,--  r   c                 2    | j                   st        d      y )Nzconnection is write-only)rD   rS   rO   s    r   _check_readablez_ConnectionBase._check_readable   s    ~~455 r   c                 2    | j                   st        d      y )Nzconnection is read-only)rE   rS   rO   s    r   _check_writablez_ConnectionBase._check_writable   s    ~~344 r   c                 t    | j                   rd| _        t        d      | j                          t        d      )NFzbad message length)rE   rD   closerS   rO   s    r   _bad_message_lengthz#_ConnectionBase._bad_message_length   s5    >>"DN *++ JJL*++r   c                     | j                   du S )z True if the connection is closedNrC   rO   s    r   closedz_ConnectionBase.closed   s     ||t##r   c                     | j                   S )z"True if the connection is readable)rD   rO   s    r   rH   z_ConnectionBase.readable        ~~r   c                     | j                   S )z"True if the connection is writable)rE   rO   s    r   rI   z_ConnectionBase.writable   r`   r   c                 :    | j                          | j                  S )z+File descriptor or handle of the connection)rT   rC   rO   s    r   filenoz_ConnectionBase.fileno   s    ||r   c                 f    | j                   	 | j                          d| _         yy# d| _         w xY w)zClose the connectionNrM   rO   s    r   rZ   z_ConnectionBase.close   s1    <<#$#	 $  $s   ' 	0c                 v   | j                          | j                          t        |      }|j                  dkD  r|j	                  d      }|j
                  }|dk  rt        d      ||k  rt        d      |||z
  }n#|dk  rt        d      ||z   |kD  rt        d      | j                  ||||z           y)	z,Send the bytes data from a bytes-like objectr   Br   zoffset is negativezbuffer length < offsetNzsize is negativezbuffer length < offset + size)rT   rX   
memoryviewitemsizecastnbytesr-   _send_bytes)rF   bufoffsetsizemns         r   
send_bytesz_ConnectionBase.send_bytes   s    sO::>sAHHA:122v:566<v:DAX/00d]Q<==6&4-01r   c                     | j                          | j                          | j                  t        j	                  |             y)zSend a (picklable) objectN)rT   rX   rk   _ForkingPicklerdumpsrF   objs     r   sendz_ConnectionBase.send   s3    ..s34r   c                     | j                          | j                          ||dk  rt        d      | j                  |      }|| j	                          |j                         S )z7
        Receive bytes data as a bytes object.
        r   znegative maxlength)rT   rV   r-   _recv_bytesr[   getvalue)rF   	maxlengthrl   s      r   
recv_bytesz_ConnectionBase.recv_bytes   sa     	 Y]122y);$$&||~r   c                    | j                          | j                          t        |      5 }|j                  }|t	        |      z  }|dk  rt        d      ||kD  rt        d      | j                         }|j                         }|||z   k  rt        |j                               |j                  d       |j                  |||z  ||z   |z          |cddd       S # 1 sw Y   yxY w)zq
        Receive bytes data into a writeable bytes-like object.
        Return the number of bytes read.
        r   znegative offsetzoffset too largeN)rT   rV   rg   rh   lenr-   ry   tellr
   rz   seekreadinto)rF   rl   rm   ro   rh   bytesizeresultrn   s           r   recv_bytes_intoz_ConnectionBase.recv_bytes_into   s    
 	_ 	zzH#a&(Hz !233(" !344%%'F;;=D&4-'$V__%677KKNOOAf0%}9; <!	 	 	s   B+C!!C*c                     | j                          | j                          | j                         }t        j	                  |j                               S )zReceive a (picklable) object)rT   rV   ry   rs   loads	getbuffer)rF   rl   s     r   recvz_ConnectionBase.recv   s?     $$S]]_55r   c                 d    | j                          | j                          | j                  |      S )z/Whether there is any input available to be read)rT   rV   _pollrF   r   s     r   pollz_ConnectionBase.poll   s)    zz'""r   c                     | S rL    rO   s    r   	__enter__z_ConnectionBase.__enter__      r   c                 $    | j                          y rL   rZ   rF   exc_type	exc_valueexc_tbs       r   __exit__z_ConnectionBase.__exit__	      

r   )TT)r   NrL   )r   )g        )__name__
__module____qualname__rC   rJ   rP   rT   rV   rX   r[   propertyr^   rH   rI   rc   rZ   rq   rw   r|   r   r   r   r   r   r   r   r   r@   r@   v   s    G	".65, $ $    
$2(526#r   r@   c                   P    e Zd ZdZdZdZej                  fdZd Z	d	dZ
d Zd Zy)
PipeConnectionz
        Connection class based on a Windows named pipe.
        Overlapped I/O is used, so the handles must have been created
        with FILE_FLAG_OVERLAPPED.
        FNc                 d    | j                   }||j                           || j                         y rL   )_send_ovcancelrC   )rF   _CloseHandleovs      r   rN   zPipeConnection._close  s%    B~		&r   c                 >   | j                   t        d      t        j                  | j                  |d      \  }}|| _         	 |t        j
                  k(  r1t        j                  |j                  gdt              }|t        k(  sJ d | _         |j                  d      \  }}|t        j                  k(  rt        t        j                  d      |dk(  sJ |t!        |      k(  sJ y #  |j                           xY w# d | _         |j                  d      \  }}w xY w)Nz/concurrent send_bytes() calls are not supportedT
overlappedFrR   r   )r   r-   _winapi	WriteFilerC   ERROR_IO_PENDINGWaitForMultipleObjectseventr   r   r   GetOverlappedResultERROR_OPERATION_ABORTEDrS   errnoEPIPEr~   )rF   rl   r   errwaitresnwrittens         r   rk   zPipeConnection._send_bytes  s   }}(  "5 6 6''cdKGBDM
='222%<<
E85G"m33
 !% " 6 6t <#g555 ekk+=>>!8Os3x'''		 $ " 6 6t <#s   AC) )C<<C? ?Dc                    | j                   rd| _         t        j                         S |dnt        |d      }	 t	        j
                  | j                  |d      \  }}	 |t        j                  k(  r1t	        j                  |j                  gdt              }|t        k(  sJ |j                  d      \  }}|dk(  r5t        j                         }|j                  |j                                |S |t        j                   k(  r| j#                  ||      S 	 t-        d      #  |j                           xY w# |j                  d      \  }}|dk(  r9t        j                         }|j                  |j                                |c cY S |t        j                   k(  r| j#                  ||      c cY S w xY w# t$        $ r)}|j&                  t        j(                  k(  rt*         d }~ww xY w)NF   Tr   r   z.shouldn't get here; expected KeyboardInterrupt)_got_empty_messageioBytesIOminr   ReadFilerC   r   r   r   r   r   r   r   writer   ERROR_MORE_DATA_get_more_datarS   winerrorERROR_BROKEN_PIPEEOFErrorRuntimeError)	rF   maxsizebsizer   r   r   nreadfes	            r   ry   zPipeConnection._recv_bytes9  s   &&*/'zz|#&C4E%..t||U;?AGBD'":"::&-&D&D!#
E8'=G#*m#;;
 &(%;%;D%A
s!8 "

AGGBLLN3#$H G$;$;;#'#6#6r7#CC < OPP!		%'%;%;D%A
s!8 "

AGGBLLN3#$H G$;$;;#'#6#6r7#CC < zzW%>%>>&	s\   %F8 AD" #AF8 1$F8 "D55D8 8AF5	F8 'F52F8 4F55F8 8	G*$G%%G*c                     | j                   s%t        j                  | j                        d   dk7  ryt	        t        | g|            S )Nr   T)r   r   PeekNamedPiperC   boolr   r   s     r   r   zPipeConnection._pollY  s>    ''--dll;A>!CdVW-..r   c                    |j                         }t        j                         }|j                  |       t	        j
                  | j                        d   }|dkD  sJ |!t        |      |z   |kD  r| j                          t	        j                  | j                  |d      \  }}|j                  d      \  }}|dk(  sJ ||k(  sJ |j                  |j                                |S )Nr   r   Tr   )r   r   r   r   r   r   rC   r~   r[   r   r   )rF   r   r   rl   r   leftr   rbytess           r   r   zPipeConnection._get_more_data_  s    ,,.C

AGGCL((6q9D!8O"s3x$'@((*&&t||TdKGB006KFC!8OT>!GGBLLN#Hr   rL   )r   r   r   __doc__r   r   r   CloseHandlerN   rk   ry   r   r   r   r   r   r   r     s8    	
 #&-&9&9 	'	(4	Q@	/	r   r   c                       e Zd ZdZer(ej                  fdZej                  Z	ej                  Zn'ej                  fdZej                  Z	ej                  Ze	fdZefdZd Zd
dZd	 Zy)
Connectionzo
    Connection class based on an arbitrary file descriptor (Unix only), or
    a socket handle (Windows).
    c                 (     || j                          y rL   r]   rF   rN   s     r   rN   zConnection._closev      4<< r   c                 (     || j                          y rL   r]   r   s     r   rN   zConnection._close{  r   r   c                 b    t        |      }	  || j                  |      }||z  }|dk(  ry ||d  }$Nr   )r~   rC   )rF   rl   r   	remainingrp   s        r   _sendzConnection._send  sA    H	dllC(ANIA~ab'C r   c                     t        j                         }| j                  }|}|dkD  rK |||      }t        |      }|dk(  r||k(  rt        t        d      |j                  |       ||z  }|dkD  rK|S )Nr   zgot end of file during message)r   r   rC   r~   r   rS   r   )rF   rn   readrl   rG   r   chunkrp   s           r   _recvzConnection._recv  s|    jjl	!m+EE
AAv$"N!"BCCIIeNI !m 
r   c                    t        |      }|dkD  r`t        j                  dd      }t        j                  d|      }| j                  |       | j                  |       | j                  |       y t        j                  d|      }|dkD  r#| j                  |       | j                  |       y | j                  ||z          y )Ni!i!Qi @  )r~   structpackr   )rF   rl   rp   
pre_headerheaders        r   rk   zConnection._send_bytes  s    Hz>T2.J[[q)FJJz"JJvJJsO [[q)F5y 

6"

3 

6C<(r   Nc                    | j                  d      }t        j                  d|j                               \  }|dk(  r7| j                  d      }t        j                  d|j                               \  }|||kD  ry | j                  |      S )N   r   r      r   )r   r   unpackrz   )rF   r   rl   rn   s       r   ry   zConnection._recv_bytes  sq    jjmdCLLN32:**Q-CMM$7ED4'>zz$r   c                 2    t        | g|      }t        |      S rL   )r   r   )rF   r   rs      r   r   zConnection._poll  s    $!Awr   rL   )r   r   r   r   r   _multiprocessingclosesocketrN   rw   _writer   _readr)   rZ   r   r   r   r   rk   ry   r   r   r   r   r   r   o  so    
  0 < < 	!!&& %% " 	!%   %  ). r   r   c                   P    e Zd ZdZd
dZd Zd Zed        Zed        Z	d Z
d	 Zy)r   z
    Returns a listener object.

    This is a wrapper for a bound socket which is 'listening' for
    connections, or for a Windows named pipe.
    Nc                    |xs |xr t        |      xs t        }|xs t        |      }t        |       |dk(  rt	        ||      | _        nt        |||      | _        |t        |t              st        d      || _
        y )Nr   authkey should be a byte string)r>   default_familyr0   r6   PipeListener	_listenerSocketListener
isinstancebytes	TypeError_authkey)rF   r=   r/   backlogauthkeys        r   rJ   zListener.__init__  s     #G=W(= #" 	6.v6 Y)'7;DN+GVWEDNz'5'A=>>r   c                     | j                   t        d      | j                   j                         }| j                  ,t	        || j                         t        || j                         |S )zz
        Accept a connection on the bound socket or named pipe of `self`.

        Returns a `Connection` object.
        zlistener is closed)r   rS   acceptr   deliver_challengeanswer_challenge)rF   cs     r   r   zListener.accept  sW     >>!.//NN!!#==$a/Q.r   c                 P    | j                   }|d| _         |j                          yy)zA
        Close the bound socket or named pipe of `self`.
        N)r   rZ   )rF   listeners     r   rZ   zListener.close  s)     >>!DNNN  r   c                 .    | j                   j                  S rL   )r   _addressrO   s    r   r=   zListener.address  s    ~~&&&r   c                 .    | j                   j                  S rL   )r   _last_acceptedrO   s    r   last_acceptedzListener.last_accepted  s    ~~,,,r   c                     | S rL   r   rO   s    r   r   zListener.__enter__  r   r   c                 $    | j                          y rL   r   r   s       r   r   zListener.__exit__  r   r   )NNr   N)r   r   r   r   rJ   r   rZ   r   r=   r  r   r   r   r   r   r   r     sH       ' ' - -r   r   c                     |xs t        |       }t        |       |dk(  rt        |       }nt        |       }|t	        |t
              st        d      |t        ||       t        ||       |S )z=
    Returns a connection to the address of a `Listener`
    r   r   )	r>   r6   
PipeClientSocketClientr   r   r   r   r   )r=   r/   r   r   s       r   r   r     sq     ,|G,FVw!:gu#=9::G$!W%Hr   c                 N   | rot        j                         \  }}|j                  d       |j                  d       t        |j	                               }t        |j	                               }||fS t        j                         \  }}t        |d      }t        |d      }||fS )L
        Returns pair of connection objects at either end of a pipe
        TFrI   rH   )r5   
socketpairsetblockingr   detachr)   pipe)duplexs1s2c1c2fd1fd2s          r   r   r     s     &&(FBNN4 NN4 BIIK(BBIIK(B 2v	 wwyHCC%0BC%0B2vr   c           
         t        d      }| r>t        j                  }t        j                  t        j                  z  }t
        t
        }}n(t        j                  }t        j                  }dt
        }}t        j                  ||t        j                  z  t        j                  z  t        j                  t        j                  z  t        j                  z  d||t        j                  t        j                        }t        j                  ||dt        j                  t        j                   t        j                  t        j                        }t        j"                  |t        j                  dd       t        j$                  |d      }|j'                  d      \  }	}
|
dk(  sJ t)        ||       }t)        ||       }||fS )	r  r   r   r   NTr   r  r  )r0   r   PIPE_ACCESS_DUPLEXGENERIC_READGENERIC_WRITEBUFSIZEPIPE_ACCESS_INBOUNDCreateNamedPipeFILE_FLAG_OVERLAPPEDFILE_FLAG_FIRST_PIPE_INSTANCEPIPE_TYPE_MESSAGEPIPE_READMODE_MESSAGE	PIPE_WAITNMPWAIT_WAIT_FOREVERNULL
CreateFileOPEN_EXISTINGSetNamedPipeHandleStateConnectNamedPiper   r   )r  r=   openmodeaccessobsizeibsizeh1h2r   _r   r  r  s                r   r   r   +  sg    $I.11H))G,A,AAF$gFF22H**FFF$$X < <<112%%(E(EEvvw;;LL VQg.C.C((',, 	''--tT	 --bTB
//53axB0B02vr   c                   $    e Zd ZdZddZd Zd Zy)r   zO
    Representation of a socket which is bound to an address and listening
    c                    t        j                   t        t         |            | _        	 t        j                  dk(  r9| j                  j                  t         j                  t         j                  d       | j                  j                  d       | j                  j                  |       | j                  j                  |       | j                  j                         | _        || _        d | _        |dk(  rCt#        j$                  |      s.t#        j&                  | t        j(                  |fd      | _        y d | _        y # t        $ r | j                  j                           w xY w)Nposixr   Tr   r   argsexitpriority)r5   r   _socketr)   name
setsockopt
SOL_SOCKETSO_REUSEADDRr  bindlistengetsocknamer  rS   rZ   _familyr  r   r<   Finalizeunlink_unlink)rF   r=   r/   r   s       r   rJ   zSocketListener.__init__[  s   }}WVV%<=	ww'!''(9(9(.(;(;Q@LL$$T*LLg&LL( LL446DM "Yt'H'H'Q==biiwjqDL  DL  	LL 	s   B<E %E)c                     | j                   j                         \  }| _        |j                  d       t	        |j                               S )NT)r:  r   r  r  r   r  rF   ss     r   r   zSocketListener.acceptt  s9    !%!4!4!64	d!((*%%r   c                     	 | j                   j                          | j                  }|d | _         |        y y # | j                  }|d | _         |        w w xY wrL   )r:  rZ   rE  )rF   rD  s     r   rZ   zSocketListener.closey  s[    	LL \\F!# " \\F!# "s	   : AN)r   )r   r   r   r   rJ   r   rZ   r   r   r   r   r   W  s     2&
r   r   c                     t        |       }t        j                  t        t        |            5 }|j                  d       |j	                  |        t        |j                               cddd       S # 1 sw Y   yxY w)zO
    Return a connection object connected to the socket given by `address`
    TN)r>   r5   r   r  connectr   r  )r=   r/   rH  s      r   r  r    s^     '"F	/	1 &Q	d			'!((*%& & &s   ;A44A=c                   6    e Zd ZdZddZddZd Zed        Zy)	r   z0
        Representation of a named pipe
        Nc                    || _         | j                  d      g| _        d | _        t	        j
                  d| j                          t	        j                  | t        j                  | j                  | j                   fd      | _	        y )NT)firstz listener created with address=%rr   r7  )
r  _new_handle_handle_queuer  r   	sub_debugrC  r   _finalize_pipe_listenerrZ   )rF   r=   r   s      r   rJ   zPipeListener.__init__  sl    #DM"&"2"2"2">!?D"&DNN=t}}Ml::(($--8qDJr   c           
      ~   t         j                  t         j                  z  }|r|t         j                  z  }t        j                  | j
                  |t         j                  t         j                  z  t         j                  z  t         j                  t        t        t         j                  t         j                        S rL   )r   r  r"  r#  r!  r  r$  r%  r&  PIPE_UNLIMITED_INSTANCESr  r'  r(  )rF   rN  flagss      r   rO  zPipeListener._new_handle  s    ..1M1MME>>>**u))G,I,II!!"00'7,,gll r   c                 h   | j                   j                  | j                                | j                   j                  d      }	 t	        j
                  |d      }	 t	        j                  |j                  gdt              }	 |j                  d      \  }}|dk(  sJ t        |      S #  |j                          t	        j                  |        xY w# |j                  d      \  }}|dk(  sJ w xY w# t        $ r2}|j                  t        j                  k7  r Y d }~t        |      S d }~ww xY w)Nr   Tr   F)rP  appendrO  popr   r,  r   r   r   r   r   r   rS   r   ERROR_NO_DATAr   )rF   rG   r   resr3  r   r   s          r   r   zPipeListener.accept  s   %%d&6&6&89''++A.F$--fF	$!88
E85C  33D9FAs!8O!&))IIK''/33D9FAs!8O8  ::!6!66 7 "&))!s0   C6 &B+ +(CC C36	D1?D,,D1c                 h    t        j                  d|       | D ]  }t        j                  |        y )Nz closing listener with address=%r)r   rQ  r   r   )queuer=   rG   s      r   rR  z$PipeListener._finalize_pipe_listener  s.    NN=wG ,##F+,r   rL   )F)	r   r   r   r   rJ   rO  r   staticmethodrR  r   r   r   r   r     s*    			
		*. 
	, 
	,r   r   c           	      .   t               }	 	 t        j                  | d       t        j                  | t        j                  t        j
                  z  dt        j                  t        j                  t        j                  t        j                        }	 t        j                  |t        j                  dd       t!        |      S # t        $ rB}|j                  t        j                  t        j                  fvst        |      r Y d}~nd}~ww xY w)zU
        Return a connection object connected to the pipe given by `address`
          r   N)r   r   WaitNamedPiper)  r  r  r(  r*  r"  rS   r   ERROR_SEM_TIMEOUTERROR_PIPE_BUSYr    r+  r%  r   )r=   r   hr   s       r   r
  r
    s     O%%gt4&&W11G4I4IIw||W%:%:00',,  	''w,,dD	 a    ::g&?&?&-&=&=&? ?BPQRBS CT s   BC 	D8DD(      s   #CHALLENGE#s	   #WELCOME#s	   #FAILURE#>      md5   sha256   sha384   sha3_256   sha3_384c              #   2   K   | ]  }t        |        y wrL   )r~   ).0r3  s     r   	<genexpr>rm  J  s     7c!f7s         c                     t        |       t        v rd| fS | j                  d      rG| j                  ddt        dz         x}dkD  r(| d| }|t
        v r| |dz   d }|j                  d      |fS t        d	|       )
a  Returns a digest name and the payload for a response hash.

    If a legacy protocol is detected based on the message length
    or contents the digest name returned will be empty to indicate
    legacy mode where MD5 and no digest prefix should be sent.
    r%      {   }r      r   NasciizRunsupported message length, missing digest prefix, or unsupported digest: message=)r~   _LEGACY_LENGTHSr;   find_MAX_DIGEST_LEN_ALLOWED_DIGESTSdecoder	   )messagecurlydigestpayloads       r   _get_digest_name_and_payloadr~  U  s     7|&
 7{4 ,,tQ(9:	:a?5!%%eAgh'G==)722
/&-Z12 2r   c                     ddl }t        |      d   }|s"	 |j                  | |d      j                         S |j                  | ||      j                         }d|j                  d      |fz  S # t        $ r d}Y Dw xY w)a  Create a MAC based on authkey and message

    The MAC algorithm defaults to HMAC-MD5, unless MD5 is not available or
    the message has a '{digest_name}' prefix. For legacy HMAC-MD5, the response
    is the raw MAC, otherwise the response is prefixed with '{digest_name}',
    e.g. b'{sha256}abcdefg...'

    Note: The MAC protects the entire message including the digest_name prefix.
    r   Nmd5sha256   {%s}%srt  )hmacr~  newr|  r-   encode)r   rz  r  digest_nameresponses        r   _create_responser  o  s     .w7:K	#88GWe4;;== xx+6==?H**73X>>>  	# #K		#s    A. .A<;A<c           
      d   ddl }t        |      \  }}|xs d}	 |j                  | ||      j                         }t        |      t        |      k7  r&t        d|dt        |       dt        |             |j                  ||      st        d	      y# t        $ r t        d|d      w xY w)
a`  Verify MAC challenge

    If our message did not include a digest_name prefix, the client is allowed
    to select a stronger digest_name from _ALLOWED_DIGESTS.

    In case our message is prefixed, a client cannot downgrade to a weaker
    algorithm, because the MAC is calculated over the entire message
    including the '{digest_name}' prefix.
    r   Nr  zresponse_digest=z unsupportedz	expected z of length z got zdigest received was wrong)r  r~  r  r|  r-   r	   r~   compare_digest)r   rz  r  r  response_digestresponse_macexpecteds          r   _verify_challenger    s     $@$J!O\%.OE88GWo>EEG 8}L))!O.k#h- I<()+, 	, x6!"=>> 7  E!%5_$6l"CDDEs   !B B/r   c                    t        |t              s#t        dj                  t	        |                  t
        t        kD  sJ d       t        j                  t
              }d|j                  d      |fz  }| j                  t        |z          | j                  t              }	 t        |||       | j                  t               y # t         $ r | j                  t"                w xY w)N Authkey must be bytes, not {0!s}zprotocol constraintr  rt  )r   r   r-   formatr8   MESSAGE_LENGTH_MD5ONLY_MESSAGE_LENGTHr)   urandomr  rq   
_CHALLENGEr|   MESSAGE_MAXLENr  _WELCOMEr	   _FAILURE)
connectionr   r  rz  r  s        r   r   r     s    gu%.55d7mDF 	F33J5JJjj(G;--g6@@G *w./$$^4H('7H5
 	h'	  h's   %C  C(c                    t        |t              s#t        dj                  t	        |                  | j                  t              }|j                  t              st        d|      |t        t              d  }t        |      t        k  rt        dt        |       d      t        ||      }| j                  |       | j                  t              }|t        k7  rt        d      y )Nr  z,Protocol error, expected challenge: message=zchallenge too short: z byteszdigest sent was rejected)r   r   r-   r  r8   r|   r  r;   r  r	   r~   r  r  rq   r  )r  r   rz  r|  r  s        r   r   r     s    gu%.55d7mDF 	F##N3Gj)!?wjAC 	Cc*o&'G
7|--!$9#g,v"NOOgw/F&!$$^4H8!"<== r   c                       e Zd Zd Zd Zd Zy)ConnectionWrapperc                 n    || _         || _        || _        dD ]  }t        ||      }t	        | ||        y )N)rc   rZ   r   r|   rq   )_conn_dumps_loadsr   setattr)rF   connrt   r   attrrv   s         r   rJ   zConnectionWrapper.__init__  s>    
K 	%D$%CD$$	%r   c                 \    | j                  |      }| j                  j                  |       y rL   )r  r  rq   )rF   rv   rH  s      r   rw   zConnectionWrapper.send  s"    KK

a r   c                 X    | j                   j                         }| j                  |      S rL   )r  r|   r  rG  s     r   r   zConnectionWrapper.recv  s"    JJ!!#{{1~r   N)r   r   r   rJ   rw   r   r   r   r   r  r    s    %!r   r  c                 T    t         j                  | fd d d d      j                  d      S )Nr   utf-8)	xmlrpclibrt   r  )rv   s    r   
_xml_dumpsr    s&    ??C64tQ7>>wGGr   c                 X    t         j                  | j                  d            \  \  }}|S )Nr  )r  r   ry  )rH  rv   methods      r   
_xml_loadsr    s$    __QXXg%67NFSFJr   c                       e Zd Zd Zy)XmlListenerc                 b    dd l ma t        j	                  |       }t        |t        t              S r   )xmlrpc.clientclientr  r   r   r  r  r  ru   s     r   r   zXmlListener.accept  s"    )ood# j*==r   N)r   r   r   r   r   r   r   r  r    s    >r   r  c                  J    dd l ma t        t	        | i |t
        t              S r   )r  r  r  r  r   r  r  )r8  kwdss     r   	XmlClientr    s    %VT2T2J
KKr   c                    t        |       }g }|rt        j                  |d|      }|t        k(  r	 |S t        |cxk  rt        t        |      z   k  rn n
|t        z  }nAt        |cxk  rt        t        |      z   k  rn t        d      |t        z  }nt        d      |j                  ||          ||dz   d  }d}|r|S )NFzShould not get herer   r   )	listr   r   r   r   r~   r   r   rW  )handlesr   LreadyrZ  s        r   _exhaustive_waitr    s     M00E7CCl"  #>A(>>}$!SD+;c!f+DD ##899 ''"#899LL3 #a%&	AG  r   c                 V   |t         }n|dk  rd}nt        |dz  dz         }t        |       } i g }t               }t               }	 | D ]  }	 t	        |d      }	 t        j                   |       dd      \  }}|t
        j                  k(  r!|j                  |       ||j                  <   d|rDt        j                         dd dk\  r*	 |j                  d	      \  }
}|st!        |d
      rd|_        |j%                  |       d} t+        j-                         |      }|D ]  }|j/                           |D ]e  }	 |j                  d      \  }
}|t
        j0                  k7  s,|j                     }|j%                  |       |dk(  sRt!        |d
      s_d|_        g 	 |j3                  fd|D               | D cg c]	  }||v s| c}S # t        $ r"}	d|	j                  }}|t        vr Y d}	~	d}	~	ww xY w# t        $ r}	|	j                  }Y d}	~	>d}	~	ww xY w# t&        $ r ||j)                         <   Y w xY w# t        $ r }	|	j                  }|t        vr Y d}	~	d}	~	ww xY w# |D ]  }|j/                           |D ]  }	 |j                  d      \  }
}n+# t        $ r}	|	j                  }|t        vr Y d}	~	nd}	~	ww xY w|t
        j0                  k7  sX|j                     }|j%                  |       |dk(  s~t!        |d
      sd|_         w xY wc c}w )
        Wait till an object in object_list is ready/readable.

        Returns list of those objects in object_list which are ready/readable.
        Nr   r_  g      ?rc   Trs  )   rs  Fr   c              3   (   K   | ]	  }|     y wrL   r   )rl  rc  waithandle_to_objs     r   rm  zwait.<locals>.<genexpr>W  s     Ia.q1Is   )r   intr  setr   r   r   rS   r   _ready_errorsr   rW  r   r2   getwindowsversionr   r4   r   addAttributeErrorrB   r  keysr   r   update)object_listr   ov_listready_objectsready_handlesorc   r   r   r   r3  r  s              @r   r   r     sB    ?Gq[G'D.3./G;'6	8  $$$Q1F
"")"2"268Q"EC
 g666r*67)"((3
 #"7"7"9"1"="G1)+)?)?)F3 $'716J+K7; 4%))!,"#=$@ -->-C-C-EwOM  		  833D9FAs
 '999)"((3A!%%a(ax #1&:;37A08  	I=II&=a!}*<==_ # ""&

Cm3! 4"  $+ 1&'jj1- & 978%akkm49N  **C-/ 0  		  833D9FAs **C-/ 0 '999)"((3A!%%a(ax #1&:;37A08" >s   I4 H%G:AI4 HAI4  I	L&L&	G?G:4I4 :G??I4 	H"HI4 H""I4 %II4 II4 	I1I,,I14L#J'&L#'	K	0K
	L#
K	L#&%L#L#
L#PollSelectorc                    t               5 }| D ]"  }|j                  |t        j                         $ |' t	        t
        dt
        j
                               |z   }	 |j                  |      }|r(|D cg c]  \  }}|j                   c}}cddd       S |7 t	        t
        dt
        j
                               z
  }|dk  r|cddd       S uc c}}w # 1 sw Y   yxY w)r  Nr   r   )_WaitSelectorregister	selectors
EVENT_READr   r   selectfileobj)r  r   selectorrv   deadliner  keyeventss           r   r   r   f  s     _ 	)" =!!#y';';<= ">74DII>@7J 0=BCMS&CKKC	) 	) *"*-PWT+dii-P-R"R"Q;#(	) 	)  D	) 	)s$   A*C5CC/CCC!c                     | j                         }t        j                  |t        j                  t        j                        5 }ddlm} |j                  |      }t        || j                  | j                  ffcd d d        S # 1 sw Y   y xY w)Nr   )resource_sharer)rc   r5   fromfdr   SOCK_STREAMr%   r  	DupSocketrebuild_connectionrH   rI   )r  rG   rH  r  dss        r   reduce_connectionr    sl    ]]66>>63E3EF 	J!) **1-B%DMM4=='II	J 	J 	Js   6BBc                 X    | j                         }t        |j                         ||      S rL   r  r   )r  rH   rI   socks       r   r  r    s"    yy{$++-8<<r   c                    | j                   rt        j                  nd| j                  rt        j                  ndz  }t        j                  | j                         |      }t        || j                   | j                  ffS r   )	rH   r   FILE_GENERIC_READrI   FILE_GENERIC_WRITEr   	DupHandlerc   rebuild_pipe_connection)r  r.  dhs      r   reduce_pipe_connectionr    s^    047,,1157--AG  7&T]]DMM(JJJr   c                 <    | j                         }t        |||      S rL   )r  r   )r  rH   rI   rG   s       r   r  r    s    fh99r   c                     t        j                  | j                               }t        || j                  | j
                  ffS rL   )r   DupFdrc   r  rH   rI   )r  dfs     r   r  r    s0    __T[[]+!Bt}}#EEEr   c                 <    | j                         }t        |||      S rL   r  )r  rH   rI   fds       r   r  r    s    YY["h11r   )NN)T)r  rL   )W__all__r   r   r)   r2   r5   r   r   r&   	itertools_multiprocessr   ImportErrorr%   r   r	   r
   contextr   ForkingPicklerrs   r   r   r   r   r   r3   r  CONNECTION_TIMEOUTcountr,   r   familiesr4   r   r    r0   r6   r>   r@   r   r   objectr   r   r   r   r  r   r
  r  r  r  r  r  	frozensetrx  maxrw  r  _MD5_DIGEST_LENru  r~  r  r  r   r   r   r  r  r  r  r  r  r   ERROR_NETNAME_DELETEDr  r   r  r  r  SelectSelectorr  r  r  r  r  r   r   r   <module>r      s	   3  	 	 
     ,  1 **OO  	!;
69NH<<7NH - ;50
FF&T Tn ] ]@M Mh;v ;|* <<7&&X)V )X& <<76,v 6,p!> 
r @B 7&677  *O<24?8?2(5 (*>% >* H>( >L <<7( ..0M0MNML>` 
 y.)!..!00)6 <<7J= Iz#45K
: I~'=>F2 Iz#45M$    
||wGs#   H; I ;	III&%I&