a
    xd                     @   sx  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Zd dlZd dl	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 ddlmZmZ dd	lmZ dd
lmZ zddlmZ W n" ey   ejdkrڂ dZY n&0 ejdkrejZejZejZejZg dZe edZ!dZ"dZ#e
$ Z%dZ&dgZ'e edrNdZ&e'dg7 Z'ejdkrhdZ&e'dg7 Z'e#fddZ(dd Z)dd Z*dd Z+dd Z,G dd de-Z.G d d! d!e-Z/erG d"d# d#e/Z0G d$d% d%e/Z1G d&d' d'e-Z2d^d(d)Z3d*d+ Z4ejdkrd_d.d/Z5n
d`d0d/Z5G d1d2 d2e-Z6d3d4 Z7ejdkrfG d5d6 d6e-Z8ej9ej:ffd7d8Z;d9Z<d:Z=d;Z>d<Z?d=d> Z@d?d@ ZAG dAdB dBe-ZBdCdD ZCdEdF ZDG dGdH dHe2ZEdIdJ ZFejdkrdKdL ZGejHejIhZJdadMdNZKn(e edOr dPdQ ZLndRdQ ZLdbdSdNZKejdkrXdTdU ZMdVdW ZNeOe1eM dXdY ZPdZd[ ZQeOe0eP nd\dU ZMd]dW ZNeOe1eM dS )c    )absolute_importN   )	reduction)util)AuthenticationErrorBufferTooShort)	_billiard)setblockingsend_offset	monotonic)ForkingPickler)_winapiwin32)ClientListenerPipewaitpypy_version_infoi    g      4@AF_INETAF_UNIXAF_PIPEc                 C   s
   t  |  S Nr   )timeout r   K/var/www/html/Ranjet/env/lib/python3.9/site-packages/billiard/connection.py_init_timeoutH   s    r   c                 C   s
   t  | kS r   r   )tr   r   r   _check_timeoutL   s    r   c                 C   sX   | dkrdS | dkr&t jdt dS | dkrLt jdt ttf ddS td	d
S )z?
    Return an arbitrary free address for the given family
    r   )	localhostr   r   z	listener-)prefixdirr   z\\.\pipe\pyc-%d-%d- zunrecognized familyN)	tempfilemktempr   Zget_temp_dirosgetpidnext_mmap_counter
ValueErrorfamilyr   r   r   arbitrary_addressT   s    r,   c                 C   sJ   t jdkr| dkrtd|  t jdkrF| dkrFtt| sFtd|  dS )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*   r   r   r   _validate_familyc   s
    
r1   c                 C   sJ   t | tkrdS t | tu r*| dr*dS t | tu r:dS td|  dS )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 unrecognizedN)typetuplestr
startswithr)   )addressr   r   r   address_typep   s    r7   c                   @   s   e Zd Zdd ZdS )_SocketContainerc                 C   s
   || _ d S r   sock)selfr:   r   r   r   __init__   s    z_SocketContainer.__init__N)__name__
__module____qualname__r<   r   r   r   r   r8      s   r8   c                   @   s   e Zd ZdZd/ddZdd Zdd Zd	d
 Zdd Zdd Z	e
dd Ze
dd Ze
dd Zdd Zdd Zd0ddZdd Zd1ddZd2d d!Zd"d# Zd3d%d&Zd'd( Zd)d* Zd+d, Zd-d. ZdS )4_ConnectionBaseNTc                 C   sZ   t |tr|j| _|j }| }|dk r4td|sD|sDtd|| _|| _|| _	d S )Nr   zinvalid handlez6at least one of `readable` and `writable` must be True)

isinstancer8   r:   _socketfileno	__index__r)   _handle	_readable	_writable)r;   handlereadablewritabler   r   r   r<      s    

z_ConnectionBase.__init__c                 C   s   | j d ur|   d S r   rE   _closer;   r   r   r   __del__   s    
z_ConnectionBase.__del__c                 C   s   | j d u rtdd S )Nzhandle is closed)rE   OSErrorrM   r   r   r   _check_closed   s    
z_ConnectionBase._check_closedc                 C   s   | j stdd S )Nzconnection is write-only)rF   rO   rM   r   r   r   _check_readable   s    z_ConnectionBase._check_readablec                 C   s   | j stdd S )Nzconnection is read-only)rG   rO   rM   r   r   r   _check_writable   s    z_ConnectionBase._check_writablec                 C   s"   | j rd| _n|   tdd S )NFzbad message length)rG   rF   closerO   rM   r   r   r   _bad_message_length   s    z#_ConnectionBase._bad_message_lengthc                 C   s
   | j du S )z True if the connection is closedNrE   rM   r   r   r   closed   s    z_ConnectionBase.closedc                 C   s   | j S )z"True if the connection is readable)rF   rM   r   r   r   rI      s    z_ConnectionBase.readablec                 C   s   | j S )z"True if the connection is writable)rG   rM   r   r   r   rJ      s    z_ConnectionBase.writablec                 C   s   |    | jS )z+File descriptor or handle of the connection)rP   rE   rM   r   r   r   rC      s    z_ConnectionBase.filenoc                 C   s*   | j dur&z|   W d| _ nd| _ 0 dS )zClose the connectionNrK   rM   r   r   r   rS      s    

z_ConnectionBase.closer   c                 C   s   |    |   t|}|jdkr.tt|}t|}|dk rFtd||k rVtd|du rh|| }n&|dk rztdn|| |krtd| ||||   dS )z,Send the bytes data from a bytes-like objectr   r   zoffset is negativezbuffer length < offsetNzsize is negativezbuffer length < offset + size)rP   rR   
memoryviewitemsizebyteslenr)   _send_bytes)r;   bufoffsetsizemnr   r   r   
send_bytes   s"    


z_ConnectionBase.send_bytesc                 C   s$   |    |   | t| dS )zSend a (picklable) objectN)rP   rR   r[   r   dumpsr;   objr   r   r   send   s    z_ConnectionBase.sendc                 C   sJ   |    |   |dur(|dk r(td| |}|du rB|   | S )z7
        Receive bytes data as a bytes object.
        Nr   znegative maxlength)rP   rQ   r)   _recv_bytesrT   getvalue)r;   Z	maxlengthr\   r   r   r   
recv_bytes   s    
z_ConnectionBase.recv_bytesc                 C   s   |    |   t|}|j}|t| }|dk r>tdn||krNtd|  }| }||| k rvt|	 |
d |||| || |   |W  d   S 1 s0    Y  dS )zq
        Receive bytes data into a writeable bytes-like object.
        Return the number of bytes read.
        r   znegative offsetzoffset too largeN)rP   rQ   rW   rX   rZ   r)   rf   tellr   rg   seekreadinto)r;   r\   r]   r_   rX   Zbytesizeresultr^   r   r   r   recv_bytes_into   s$    


z_ConnectionBase.recv_bytes_intoc                 C   s"   |    |   |  }t|S )zReceive a (picklable) object)rP   rQ   rf   r   Zloadbuf)r;   r\   r   r   r   recv  s    z_ConnectionBase.recv        c                 C   s   |    |   | |S )z/Whether there is any input available to be read)rP   rQ   _pollr;   r   r   r   r   poll  s    z_ConnectionBase.pollc                 C   s   | S r   r   rM   r   r   r   	__enter__  s    z_ConnectionBase.__enter__c                 C   s   |    d S r   rS   r;   exc_type	exc_valueexc_tbr   r   r   __exit__"  s    z_ConnectionBase.__exit__c                 C   s   t |  ||S r   )r
   rC   )r;   r\   r]   r   r   r   r
   %  s    z_ConnectionBase.send_offsetc                 C   s   t |  | d S r   )r	   rC   )r;   blockingr   r   r   r	   (  s    z_ConnectionBase.setblocking)TT)r   N)N)r   )ro   )r=   r>   r?   rE   r<   rN   rP   rQ   rR   rT   propertyrV   rI   rJ   rC   rS   ra   re   rh   rm   rn   rr   rs   ry   r
   r	   r   r   r   r   r@      s2   







r@   c                   @   sD   e Zd ZdZdZejfddZdd Zddd	Z	d
d Z
dd ZdS )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.
        Fc                 C   s   || j  d S r   rU   )r;   Z_CloseHandler   r   r   rL   6  s    zPipeConnection._closec              	   C   s   t j| j|dd\}}zVz,|t jkrBt |jgdt}|tksBJ W n   |   Y n0 W |	d\}}n|	d\}}0 |dksJ |t
|ksJ d S )NT
overlappedFr   )r   Z	WriteFilerE   ERROR_IO_PENDINGWaitForMultipleObjectseventINFINITEWAIT_OBJECT_0cancelGetOverlappedResultrZ   )r;   r\   overrwaitresZnwrittenr   r   r   r[   9  s    


 zPipeConnection._send_bytesNc           	   
   C   s  | j rd| _ t S |d u r dnt|d}ztj| j|dd\}}zz,|tjkrpt|j	gdt
}|tkspJ W n   |   Y n0 W |d\}}|dkrt }||  |W S |tjkr| ||W S nh|d\}}|dkrt }||  |     Y W S |tjkr>| ||     Y W S 0 W n< ty~ } z"|jtjkrhtn W Y d }~n
d }~0 0 tdd S )NF   Tr}   r   z.shouldn't get here; expected KeyboardInterrupt)_got_empty_messageioBytesIOminr   ReadFilerE   r   r   r   r   r   r   r   write	getbufferZERROR_MORE_DATA_get_more_datarO   winerrorERROR_BROKEN_PIPEEOFErrorRuntimeError)	r;   maxsizeZbsizer   r   r   Znreadfer   r   r   rf   I  sL    





 zPipeConnection._recv_bytesc                 C   s.   | j st| jd dkrdS tt| g|S )Nr   T)r   r   PeekNamedPiperE   boolr   rq   r   r   r   rp   k  s
    zPipeConnection._pollc                 C   s   |  }t }|| t| jd }|dks6J |d urVt|| |krV|   tj	| j|dd\}}|
d\}}|dksJ ||ksJ ||   |S )Nr   r   Tr}   )r   r   r   r   r   r   rE   rZ   rT   r   r   )r;   r   r   r\   r   leftr   Zrbytesr   r   r   r   q  s    
zPipeConnection._get_more_data)N)r=   r>   r?   __doc__r   r   CloseHandlerL   r[   rf   rp   r   r   r   r   r   r|   .  s   
"r|   c                   @   s   e Zd ZdZer,ejfddZejZ	ej
ZnejfddZejZ	ejZe	fddZefddZefd	d
ZdddZdd ZdS )
Connectionzo
    Connection class based on an arbitrary file descriptor (Unix only), or
    a socket handle (Windows).
    c                 C   s   || j  d S r   rU   r;   rL   r   r   r   rL     s    zConnection._closec                 C   s   || j  d S r   rU   r   r   r   r   rL     s    c              
   C   s~   t |}z|| j|}W n@ tttjfyX } z t|dd tjkrD W Y d }~qd }~0 0 ||8 }|dkrlqz||d  }qd S )Nerrnor   )	rZ   rE   rO   IOErrorr0   errorgetattrr   EINTR)r;   r\   r   	remainingr`   excr   r   r   _send  s    zConnection._sendc           	   
   C   s   t  }| j}|}|dkrz|||}W n@ tttjfyh } z t|dd tj	krT W Y d }~qd }~0 0 t
|}|dkr||krtntd|| ||8 }q|S )Nr   r   zgot end of file during message)r   r   rE   rO   r   r0   r   r   r   r   rZ   r   r   )	r;   r^   readr\   rH   r   chunkr   r`   r   r   r   _recv  s"    

zConnection._recvc                 C   sV   t |}td|}|dkr2| | | | n t||rD| }| ||  d S )N!ii @  )rZ   structpackr   rA   tobytes)r;   r\   rW   r`   headerr   r   r   r[     s    

zConnection._send_bytesNc                 C   s:   |  d}td| \}|d ur0||kr0d S |  |S )N   r   )r   r   unpackrg   )r;   r   r\   r^   r   r   r   rf     s
    
zConnection._recv_bytesc                 C   s   t | g|}t|S r   )r   r   )r;   r   rr   r   r   rp     s    zConnection._poll)N)r=   r>   r?   r   r   r   ZclosesocketrL   re   _writern   _readr%   rS   r   r   r   r   rW   r[   rf   rp   r   r   r   r   r     s   
r   c                   @   sR   e Zd ZdZdddZdd Zdd	 Zed
d Zedd Z	dd Z
dd ZdS )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.
    Nr   c                 C   sp   |p|rt |pt}|pt|}t| |dkr>t||| _nt|||| _|d urft|tsft	d|| _
d S )Nr   authkey should be a byte string)r7   default_familyr,   r1   PipeListener	_listenerSocketListenerrA   rY   	TypeError_authkey)r;   r6   r+   backlogauthkeyr   r   r   r<     s    
zListener.__init__c                 C   s>   | j du rtd| j  }| jr:t|| j t|| j |S )zz
        Accept a connection on the bound socket or named pipe of `self`.

        Returns a `Connection` object.
        Nzlistener is closed)r   rO   acceptr   deliver_challengeanswer_challenge)r;   cr   r   r   r     s    

zListener.acceptc                 C   s    | j }|durd| _ |  dS )zA
        Close the bound socket or named pipe of `self`.
        N)r   rS   )r;   Zlistenerr   r   r   rS     s    zListener.closec                 C   s   | j jS r   )r   _addressrM   r   r   r   <lambda>      zListener.<lambda>c                 C   s   | j jS r   )r   _last_acceptedrM   r   r   r   r     r   c                 C   s   | S r   r   rM   r   r   r   rs     s    zListener.__enter__c                 C   s   |    d S r   rt   ru   r   r   r   ry     s    zListener.__exit__)NNr   N)r=   r>   r?   r   r<   r   rS   r{   r6   Zlast_acceptedrs   ry   r   r   r   r   r     s   
	r   c                 C   sh   |p
t | }t| |dkr&t| }nt| }|durHt|tsHtd|durdt|| t|| |S )z=
    Returns a connection to the address of a `Listener`
    r   Nr   )	r7   r1   
PipeClientSocketClientrA   rY   r   r   r   )r6   r+   r   r   r   r   r   r     s    


r   c                 C   s   t | dr|  S t| S )Ndetach)r/   r   r8   r9   r   r   r   r   $  s    
r   TFc           	      C   s   | rBt  \}}||  ||  tt|}tt|}n@t \}}|r\t|d |rjt|d t|dd}t|dd}||fS )L
        Returns pair of connection objects at either end of a pipe
        r   FrJ   rI   )r0   
socketpairr	   r   r   r%   pipe)	duplex	rnonblock	wnonblocks1s2c1c2Zfd1fd2r   r   r   r   .  s    

r   c              
   C   s  |rJ d|rJ dt d}| rBtj}tjtjB }tt }}ntj}tj}dt }}t||tjB tj	B tj
tjB tjB d||tjtj}t||dtjtjtjtj}	t|	tjdd tj|dd}
|
d\}}|dksJ t|| d	}t|	| d
}||fS )r   z"rnonblock not supported on windowsz"wnonblock not supported on windowsr   r   r   NTr}   r   r   )r,   r   PIPE_ACCESS_DUPLEXGENERIC_READGENERIC_WRITEBUFSIZEZ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   r   r6   ZopenmodeaccessZobsizeZibsizeh1h2r~   _r   r   r   r   r   r   r   E  sB    



	
c                   @   s*   e Zd ZdZd
ddZdd Zdd Zd	S )r   zO
    Representation of a socket which is bound to an address and listening
    r   c                 C   s   t  tt || _zRtjdkr2| jt jt jd | jd | j	| | j
| | j | _W n ty   | j   Y n0 || _d | _|dkrtj| tj|fdd| _nd | _d S )Nposixr   Tr   r   argsZexitpriority)r0   r   rB   r%   name
setsockopt
SOL_SOCKETSO_REUSEADDRr	   bindlistengetsocknamer   rO   rS   Z_familyr   r   Finalizeunlink_unlink)r;   r6   r+   r   r   r   r   r<   x  s(    



zSocketListener.__init__c              
   C   sp   z| j  \}| _W qZ tttjfyT } z t|dd tj	kr@ W Y d }~q d }~0 0 qZq |
d tt|S )Nr   T)rB   r   r   rO   r   r0   r   r   r   r   r	   r   r   )r;   sr   r   r   r   r     s    
zSocketListener.acceptc                 C   sJ   z(| j   W | j}|d urFd | _|  n| j}|d urDd | _|  0 d S r   )rB   rS   r   )r;   r   r   r   r   rS     s    zSocketListener.closeN)r   )r=   r>   r?   r   r<   r   rS   r   r   r   r   r   t  s   
r   c                 C   s8   t | }ttt|}|d ||  tt|S )zO
    Return a connection object connected to the socket given by `address`
    T)r7   r0   r   r	   connectr   r   )r6   r+   r   r   r   r   r     s
    

r   c                   @   s8   e Zd ZdZdddZdddZdd	 Zed
d ZdS )r   z0
        Representation of a named pipe
        Nc                 C   sL   || _ | jddg| _d | _td| j  tj| tj| j| j fdd| _	d S )NT)firstz listener created with address=%rr   r   )
r   _new_handle_handle_queuer   r   	sub_debugr   r   _finalize_pipe_listenerrS   )r;   r6   r   r   r   r   r<     s    zPipeListener.__init__Fc              
   C   sH   t jt jB }|r|t jO }t | j|t jt jB t jB t j	t
t
t jt jS r   )r   r   r   r   r   r   r   r   r   ZPIPE_UNLIMITED_INSTANCESr   r   r   )r;   r   flagsr   r   r   r     s    

zPipeListener._new_handlec              
   C   s   | j |   | j d}ztj|dd}W n2 ty` } z|jtjkrL W Y d }~n~d }~0 0 zVzt	|j
gdt W n    |  t|  Y n0 W |d\}}|dksJ n|d\}}|dksJ 0 t|S )Nr   Tr}   F)r   appendr   popr   r   rO   r   ZERROR_NO_DATAr   r   r   r   r   r   r|   )r;   rH   r   r   r   r   r   r   r   r     s(    


zPipeListener.acceptc                 C   s$   t d| | D ]}t| qd S )Nz closing listener with address=%r)r   r   r   r   )queuer6   rH   r   r   r   r     s    z$PipeListener._finalize_pipe_listener)N)F)	r=   r>   r?   r   r<   r   r   staticmethodr   r   r   r   r   r     s   

r   c              
   C   s   t  }z6t| d t| tjtjB dtjtjtjtj}W q| t	yt } z |j
|vs^t|r` W Y d}~qd}~0 0 q|q t|tjdd t|S )zU
        Return a connection object connected to the pipe given by `address`
          r   N)r   r   ZWaitNamedPiper   r   r   r   r   r   rO   r   r   r   r   r|   )r6   _ignorer   hr   r   r   r   r     s"    

r      s   #CHALLENGE#s	   #WELCOME#s	   #FAILURE#c                 C   st   dd l }t|tsJ tt}| t|  |||d	 }| 
d}||kr^| t n| t tdd S )Nr   md5   zdigest received was wrong)hmacrA   rY   r%   urandomMESSAGE_LENGTHra   	CHALLENGEnewdigestrh   WELCOMEFAILUREr   
connectionr   r	  messager  responser   r   r   r     s    


r   c                 C   s   dd l }t|tsJ | d}|d tt tks@J d| |ttd  }|||d }| | | d}|t	krt
dd S )Nr   r  zmessage = %rr  zdigest sent was rejected)r	  rA   rY   rh   rZ   r  r  r  ra   r  r   r  r   r   r   r   "  s    
 

r   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )ConnectionWrapperc                 C   s6   || _ || _|| _dD ]}t||}t| || qd S )N)rC   rS   rr   rh   ra   )_conn_dumps_loadsr   setattr)r;   connrb   loadsattrrd   r   r   r   r<   5  s    
zConnectionWrapper.__init__c                 C   s   |  |}| j| d S r   )r  r  ra   )r;   rd   r   r   r   r   re   =  s    
zConnectionWrapper.sendc                 C   s   | j  }| |S r   )r  rh   r  )r;   r   r   r   r   rn   A  s    
zConnectionWrapper.recvN)r=   r>   r?   r<   re   rn   r   r   r   r   r  3  s   r  c                 C   s   t | fd d d d}|dS )Nr   utf-8)	xmlrpclibrb   encode)rd   or   r   r   
_xml_dumpsF  s    r!  c                 C   s   t | d\\}}|S )Nr  )r  r  decode)r   rd   methodr   r   r   
_xml_loadsK  s    r$  c                   @   s   e Zd Zdd ZdS )XmlListenerc                 C   s"   dd l ma t| }t|ttS Nr   )xmlrpc.clientclientr  r   r   r  r!  r$  rc   r   r   r   r   R  s    
zXmlListener.acceptN)r=   r>   r?   r   r   r   r   r   r%  P  s   r%  c                  O   s"   dd l ma tt| i |ttS r&  )r'  r(  r  r  r   r!  r$  )r   kwdsr   r   r   	XmlClientY  s    r*  c                 C   s   t | }g }|rt|d|}|tkr*qn\t|  krFtt| k rTn n
|t8 }n2t|  krptt| k r~n n
|t8 }ntd|||  ||d d  }d}q|S )NFzShould not get herer   r   )	listr   r   WAIT_TIMEOUTr   rZ   WAIT_ABANDONED_0r   r   )Zhandlesr   Lreadyresr   r   r   _exhaustive_waitd  s     
 
r1  c           
         s  |du rt }n|dk rd}nt|d d }t| } i g }t  t }zn| D ]}zt|d}W n ty   || < Y qP0 zt| dd\}}W n4 t	y } z|j
}|tvr W Y d}~n
d}~0 0 |tjkr|| ||j< qP | d}qPt |}W |D ]}|  q|D ]}z|d\}	}W n8 t	yv } z|j
}|tvrb W Y d}~n
d}~0 0 |tjkr(|j } | |dkr(t|dr(d|_q(n|D ]}|  q|D ]}z|d\}	}W n8 t	y  } z|j
}|tvr W Y d}~n
d}~0 0 |tjkr҈|j } | |dkrt|drd|_q0  fdd	|D   fd
d| D S )
        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   Tr   c                 3   s   | ]} | V  qd S r   r   ).0r  )waithandle_to_objr   r   	<genexpr>  r   zwait.<locals>.<genexpr>c                    s   g | ]}| v r|qS r   r   )r3  p)ready_objectsr   r   
<listcomp>  r   zwait.<locals>.<listcomp>)r   intr+  setr   AttributeErrorrD   r   r   rO   r   _ready_errorsr   r   r   addr1  keysr   r   ZERROR_OPERATION_ABORTEDr/   r   update)
object_listr   Zov_listZready_handlesr   rC   r   r   r   r   r   )r7  r4  r   r   z  sx    










r   rr   c                 C   s   |d urt |d }i }t }| D ]2}||tj t|drN||| < q$|||< q$g }||D ],\}}|tj@ rtd| |	||  qf|S )Nr  rC   zinvalid file descriptor %i)
r9  selectrr   registerPOLLINr/   rC   POLLNVALr)   r   )fdsr   Zfd_mapZpollsterfdZlsr   r   r   r   rp     s    


rp   c                 C   s   t  | g g |d S r&  )rA  )rE  r   r   r   r   rp     s    c              
   C   s   |dur$|dkrt | dS t | }zt | |W S  tttjfyj } z|jtjkrV W Y d}~n
d}~0 0 |dur$|t  }q$dS )r2  Nr   )rp   r   rO   r   r0   r   r   r   )r@  r   deadliner   r   r   r   r     s    

c                 C   sf   |   }t|tjtj8}ddlm} ||}t|| j	| j
ffW  d    S 1 sX0    Y  d S )Nr   )resource_sharer)rC   r0   fromfdr   SOCK_STREAMr"   rH  Z	DupSocketrebuild_connectionrI   rJ   )r  rH   r   rH  dsr   r   r   reduce_connection  s
    
rM  c                 C   s   |   }tt |||S r   )r   r   )rL  rI   rJ   r:   r   r   r   rK    s    rK  c                 C   sB   | j rtjnd| jrtjndB }t|  |}t|| j | jffS r&  )	rI   r   ZFILE_GENERIC_READrJ   ZFILE_GENERIC_WRITEr   Z	DupHandlerC   rebuild_pipe_connection)r  r   dhr   r   r   reduce_pipe_connection  s
    rP  c                 C   s   t t| ||S r   )r|   r   )rO  rI   rJ   r   r   r   rN    s    rN  c                 C   s    t |  }t|| j| jffS r   )r   ZDupFdrC   rK  rI   rJ   )r  dfr   r   r   rM    s    c                 C   s   t t| ||S r   )r   r   )rQ  rI   rJ   r   r   r   rK    s    )NN)TFF)TFF)N)N)R
__future__r   r   r   r%   r-   r0   rA  r   r#   	itertoolsr"   r   r   r   r   Z_extr   compatr	   r
   Zfiver   r   r   ImportErrorr.   r   r-  r,  r   __all__r/   Zis_pypyr   ZCONNECTION_TIMEOUTcountr(   r   Zfamiliesr   r   r,   r1   r7   objectr8   r@   r|   r   r   r   r   r   r   r   r   ZERROR_SEM_TIMEOUTZERROR_PIPE_BUSYr   r  r  r  r  r   r   r  r!  r$  r%  r*  r1  r   ZERROR_NETNAME_DELETEDr<  r   rp   rM  rK  rB  rP  rN  r   r   r   r   <module>   s   




 #SV8

/28		G

