3
,6`x                 @   s  d dddg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y$ddlZdd
lmZmZmZmZ W n$ ek
r   ejdkr dZY nX dZdZej ZdZdgZeedrdZedg7 Zejdkrd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Z%erhG dd de%Z&G dd  d e%Z'G d!d de(Z)dOd"d Z*ejdkrdPd$dZ+n
dQd%dZ+G d&d' d'e(Z,d(d) Z-ejdkrG d*d+ d+e(Z.d,d- Z/d.Z0d/Z1d0Z2d1Z3d2d3 Z4d4d5 Z5G d6d7 d7e(Z6d8d9 Z7d:d; Z8G d<d= d=e)Z9d>d? Z:ejdkrtd@dA Z;ej<ej=hZ>dRdBdZ?n,ddl@Z@ee@dCre@jAZBne@jCZBdSdDdZ?ejdkrdEdF ZDdGdH ZEejFe'eD dIdJ ZGdKdL ZHejFe&eG ndMdF ZDdNdH ZEejFe'eD dS )T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             C   s   t j |  S )N)time	monotonic)timeout r   0/usr/lib/python3.6/multiprocessing/connection.py_init_timeout;   s    r   c             C   s   t j | kS )N)r   r   )tr   r   r   _check_timeout>   s    r   c             C   sX   | dkrdS | dkr&t jdtj dS | dkrLt jdtj 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)r   r   )	tempfileZmktempr   Zget_temp_dirosgetpidnext_mmap_counter
ValueError)familyr   r   r   arbitrary_addressE   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socket)r%   r   r   r   _validate_familyS   s
    
r+   c             C   sJ   t | tkrdS t | tkr*| jdr*dS t | tk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_type_   s    r1   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d,ddZdd Zd-ddZd.d d!Zd"d# Zd/d%d&Zd'd( Zd)d* ZdS )0_ConnectionBaseNTc             C   sB   |j  }|dk rtd| r,| r,td|| _|| _|| _d S )Nr   zinvalid handlez6at least one of `readable` and `writable` must be True)	__index__r$   _handle	_readable	_writable)selfhandlereadablewritabler   r   r   __init__u   s    z_ConnectionBase.__init__c             C   s   | j d k	r| j  d S )N)r4   _close)r7   r   r   r   __del__   s    
z_ConnectionBase.__del__c             C   s   | j d krtdd S )Nzhandle is closed)r4   OSError)r7   r   r   r   _check_closed   s    
z_ConnectionBase._check_closedc             C   s   | j stdd S )Nzconnection is write-only)r5   r>   )r7   r   r   r   _check_readable   s    z_ConnectionBase._check_readablec             C   s   | j stdd S )Nzconnection is read-only)r6   r>   )r7   r   r   r   _check_writable   s    z_ConnectionBase._check_writablec             C   s"   | j rd| _n| j  tdd S )NFzbad message length)r6   r5   closer>   )r7   r   r   r   _bad_message_length   s    z#_ConnectionBase._bad_message_lengthc             C   s
   | j dkS )z True if the connection is closedN)r4   )r7   r   r   r   closed   s    z_ConnectionBase.closedc             C   s   | j S )z"True if the connection is readable)r5   )r7   r   r   r   r9      s    z_ConnectionBase.readablec             C   s   | j S )z"True if the connection is writable)r6   )r7   r   r   r   r:      s    z_ConnectionBase.writablec             C   s   | j   | jS )z+File descriptor or handle of the connection)r?   r4   )r7   r   r   r   fileno   s    z_ConnectionBase.filenoc             C   s$   | j dk	r z| j  W dd| _ X dS )zClose the connectionN)r4   r<   )r7   r   r   r   rB      s    
z_ConnectionBase.closer   c             C   s   | j   | j  t|}|jdkr.tt|}t|}|dk rFtd||k rVtd|dkrh|| }n&|dk rztdn|| |krtd| j||||   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)r?   rA   
memoryviewitemsizebyteslenr$   _send_bytes)r7   bufoffsetsizemnr   r   r   
send_bytes   s"    


z_ConnectionBase.send_bytesc             C   s$   | j   | j  | jtj| dS )zSend a (picklable) objectN)r?   rA   rJ   _ForkingPicklerdumps)r7   objr   r   r   send   s    z_ConnectionBase.sendc             C   sJ   | j   | j  |dk	r(|dk r(td| j|}|dkrB| j  |j S )z7
        Receive bytes data as a bytes object.
        Nr   znegative maxlength)r?   r@   r$   _recv_bytesrC   getvalue)r7   Z	maxlengthrK   r   r   r   
recv_bytes   s    
z_ConnectionBase.recv_bytesc             C   s   | j   | j  t|}|j}|t| }|dk r>tdn||krNtd| j }|j }||| k rvt|j	 |j
d |j||| || |   |S Q R X 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)r?   r@   rF   rG   rI   r$   rU   tellr	   rV   seekreadinto)r7   rK   rL   rN   rG   ZbytesizeresultrM   r   r   r   recv_bytes_into   s"    


z_ConnectionBase.recv_bytes_intoc             C   s&   | j   | j  | j }tj|j S )zReceive a (picklable) object)r?   r@   rU   rQ   loads	getbuffer)r7   rK   r   r   r   recv   s    z_ConnectionBase.recv        c             C   s   | j   | j  | j|S )z/Whether there is any input available to be read)r?   r@   _poll)r7   r   r   r   r   poll   s    z_ConnectionBase.pollc             C   s   | S )Nr   )r7   r   r   r   	__enter__  s    z_ConnectionBase.__enter__c             C   s   | j   d S )N)rB   )r7   exc_type	exc_valueexc_tbr   r   r   __exit__  s    z_ConnectionBase.__exit__)TT)r   N)N)r   )r`   )__name__
__module____qualname__r4   r;   r=   r?   r@   rA   rC   propertyrD   r9   r:   rE   rB   rP   rT   rW   r\   r_   rb   rc   rg   r   r   r   r   r2   r   s(   




r2   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 )N)r4   )r7   Z_CloseHandler   r   r   r<     s    zPipeConnection._closec             C   s   t j| j|dd\}}zHy,|t jkrBt j|jgdt}|tksBtW n   |j	   Y nX W d |j
d\}}X |dks|t|t|kstd S )NT)
overlappedFr   )_winapiZ	WriteFiler4   ERROR_IO_PENDINGWaitForMultipleObjectseventr   r   AssertionErrorcancelGetOverlappedResultrI   )r7   rK   overrwaitresZnwrittenr   r   r   rJ     s    
zPipeConnection._send_bytesNc       	      C   s  | j rd| _ tj S |d kr dnt|d}ytj| j|dd\}}zHy,|tjkrntj|j	gdt
}|tksntW n   |j   Y nX W d |jd\}}|dkrtj }|j|j  |S |tjkr| j||S X W n: tk
r } z|jtjk rtn W Y d d }~X nX tdd S )NF   T)rm   r   z.shouldn't get here; expected KeyboardInterrupt)_got_empty_messageioBytesIOminrn   ReadFiler4   ro   rp   rq   r   r   rr   rs   rt   writer^   ZERROR_MORE_DATA_get_more_datar>   winerrorERROR_BROKEN_PIPEEOFErrorRuntimeError)	r7   maxsizeZbsizeru   rv   rw   Znreadfer   r   r   rU   &  s6    


zPipeConnection._recv_bytesc             C   s.   | j stj| jd dkrdS tt| g|S )Nr   T)ry   rn   PeekNamedPiper4   boolr   )r7   r   r   r   r   ra   F  s    zPipeConnection._pollc             C   s   |j  }tj }|j| tj| jd }|dks6t|d k	rVt|| |krV| j	  tj
| j|dd\}}|jd\}}|dkst||kst|j|j   |S )Nr   r   T)rm   )r^   rz   r{   r~   rn   r   r4   rr   rI   rC   r}   rt   )r7   ru   r   rK   r   leftrv   Zrbytesr   r   r   r   L  s    
zPipeConnection._get_more_data)N)rh   ri   rj   __doc__ry   rn   CloseHandler<   rJ   rU   ra   r   r   r   r   r   rl     s   
 rl   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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 )N)r4   )r7   r<   r   r   r   r<   c  s    zConnection._closec             C   s   || j  d S )N)r4   )r7   r<   r   r   r   r<   h  s    c             C   s<   t |}x.|| j|}||8 }|dkr(P ||d  }q
W d S )Nr   )rI   r4   )r7   rK   r~   	remainingrO   r   r   r   _sendm  s    zConnection._sendc             C   sf   t j }| j}|}xN|dkr`|||}t|}|dkrL||krDtntd|j| ||8 }qW |S )Nr   zgot end of file during message)rz   r{   r4   rI   r   r>   r~   )r7   rM   readrK   r8   r   chunkrO   r   r   r   _recvv  s    


zConnection._recvc             C   sD   t |}tjd|}|dkr2| j| | j| n| j||  d S )Nz!ii @  )rI   structZpackr   )r7   rK   rO   headerr   r   r   rJ     s    
zConnection._send_bytesNc             C   s:   | j d}tjd|j \}|d k	r0||kr0d S | j |S )N   z!i)r   r   ZunpackrV   )r7   r   rK   rM   r   r   r   rU     s
    
zConnection._recv_bytesc             C   s   t | g|}t|S )N)r   r   )r7   r   rr   r   r   ra     s    zConnection._poll)N)rh   ri   rj   r   rn   _multiprocessingZclosesocketr<   rT   Z_writer_   Z_readr    rB   r~   r   r   r   rJ   rU   ra   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   sr   |p|rt |pt}|pt|}t| |dkr>t||| _nt|||| _|d k	rht|t rht	d|| _
d S )Nr   zauthkey should be a byte string)r1   default_familyr&   r+   PipeListener	_listenerSocketListener
isinstancerH   	TypeError_authkey)r7   r0   r%   backlogauthkeyr   r   r   r;     s    zListener.__init__c             C   s>   | j dkrtd| j 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   r>   acceptr   deliver_challengeanswer_challenge)r7   cr   r   r   r     s    

zListener.acceptc             C   s    | j }|dk	rd| _ |j  dS )zA
        Close the bound socket or named pipe of `self`.
        N)r   rB   )r7   Zlistenerr   r   r   rB     s    zListener.closec             C   s   | j jS )N)r   _address)r7   r   r   r   <lambda>  s    zListener.<lambda>c             C   s   | j jS )N)r   _last_accepted)r7   r   r   r   r     s    c             C   s   | S )Nr   )r7   r   r   r   rc     s    zListener.__enter__c             C   s   | j   d S )N)rB   )r7   rd   re   rf   r   r   r   rg     s    zListener.__exit__)NNr   N)rh   ri   rj   r   r;   r   rB   rk   r0   Zlast_acceptedrc   rg   r   r   r   r   r     s   
	c             C   sj   |p
t | }t| |dkr&t| }nt| }|dk	rJt|t rJtd|dk	rft|| t|| |S )z=
    Returns a connection to the address of a `Listener`
    r   Nzauthkey should be a byte string)	r1   r+   
PipeClientSocketClientr   rH   r   r   r   )r0   r%   r   r   r   r   r   r     s    


Tc             C   sj   | r>t j \}}|jd |jd t|j }t|j }n$tj \}}t|dd}t|dd}||fS )zL
        Returns pair of connection objects at either end of a pipe
        TF)r:   )r9   )r*   Z
socketpairsetblockingr   detachr    pipe)duplexs1s2c1c2Zfd1Zfd2r   r   r   r     s    

c          	   C   s   t d}| r*tj}tjtjB }tt }}ntj}tj}dt }}tj||tjB tj	B tj
tjB tjB 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d}|jd\}	}
|
dkstt|| d}t|| d}||fS )	zL
        Returns pair of connection objects at either end of a pipe
        r   r   r   NT)rm   )r:   )r9   )r&   rn   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ConnectNamedPipert   rr   rl   )r   r0   ZopenmodeaccessZobsizeZibsizeZh1Zh2rm   _rv   r   r   r   r   r   r     s4    



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 j tt || _yRtjdkr2| jjt jt jd | jjd | jj	| | jj
| | jj | _W n  tk
r   | jj   Y nX || _d | _|dkrtj| tj|fdd| _nd | _d S )Nposixr   Tr   r   )argsexitpriority)r*   getattr_socketr    nameZ
setsockoptZ
SOL_SOCKETZSO_REUSEADDRr   ZbindZlistenZgetsocknamer   r>   rB   Z_familyr   r   Finalizeunlink_unlink)r7   r0   r%   r   r   r   r   r;   8  s$    



zSocketListener.__init__c             C   s&   | j j \}| _|jd t|j S )NT)r   r   r   r   r   r   )r7   sr   r   r   r   P  s    
zSocketListener.acceptc             C   s0   z| j j  W d | j}|d k	r*d | _|  X d S )N)r   rB   r   )r7   r   r   r   r   rB   U  s    zSocketListener.closeN)r   )rh   ri   rj   r   r;   r   rB   r   r   r   r   r   4  s   
r   c          	   C   sD   t | }tjtt|"}|jd |j|  t|j S Q R X dS )zO
    Return a connection object connected to the socket given by `address`
    TN)r1   r*   r   r   Zconnectr   r   )r0   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jd| j  tj| tj| j| j fdd| _	d S )NT)firstz listener created with address=%rr   )r   r   )
r   _new_handle_handle_queuer   r   	sub_debugr   r   _finalize_pipe_listenerrB   )r7   r0   r   r   r   r   r;   s  s    zPipeListener.__init__Fc          	   C   sH   t jt jB }|r|t jO }t j| j|t jt jB t jB t j	t
t
t jt jS )N)rn   r   r   r   r   r   r   r   r   ZPIPE_UNLIMITED_INSTANCESr   r   r   )r7   r   flagsr   r   r   r   ~  s    

zPipeListener._new_handlec             C   s   | j j| j  | j jd}ytj|dd}W n0 tk
r^ } z|jtjkrN W Y d d }~X n\X z<ytj	|j
gdt}W n    |j  tj|  Y nX W d |jd\}}|dkstX t|S )Nr   T)rm   F)r   appendr   poprn   r   r>   r   ZERROR_NO_DATArp   rq   r   rs   r   rt   rr   rl   )r7   r8   ru   r   resr   rv   r   r   r   r     s"    
zPipeListener.acceptc             C   s(   t jd| x| D ]}tj| qW d S )Nz closing listener with address=%r)r   r   rn   r   )Zqueuer0   r8   r   r   r   r     s    
z$PipeListener._finalize_pipe_listener)N)F)	rh   ri   rj   r   r;   r   r   staticmethodr   r   r   r   r   r   o  s
   

r   c             C   s   t  }x~y6tj| d tj| tjtjB dtjtjtjtj}W n> t	k
r| } z"|j
tjtjfksjt|rl W Y dd}~X qX P qW  tj|tjdd t|S )zU
        Return a connection object connected to the pipe given by `address`
        i  r   N)r   rn   ZWaitNamedPiper   r   r   r   r   r   r>   r   ZERROR_SEM_TIMEOUTZERROR_PIPE_BUSYr   r   r   rl   )r0   r   hr   r   r   r   r     s"    
r      s   #CHALLENGE#s	   #WELCOME#s	   #FAILURE#c             C   st   dd l }t|tsttjt}| jt|  |j	||dj
 }| jd}||kr^| jt n| jt tdd S )Nr   md5   zdigest received was wrong)hmacr   rH   rr   r    urandomMESSAGE_LENGTHrP   	CHALLENGEnewdigestrW   WELCOMEFAILUREr   )
connectionr   r   messager   responser   r   r   r     s    


r   c             C   s   dd l }t|tst| jd}|d tt tks@td| |ttd  }|j||dj }| j	| | jd}|t
krtdd S )Nr   r   zmessage = %rr   zdigest sent was rejected)r   r   rH   rr   rW   rI   r   r   r   rP   r   r   )r   r   r   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   s:   || _ || _|| _x"dD ]}t||}t| || qW d S )NrE   rB   rb   rW   rP   )rE   rB   rb   rW   rP   )_conn_dumps_loadsr   setattr)r7   connrR   r]   attrrS   r   r   r   r;     s    

zConnectionWrapper.__init__c             C   s   | j |}| jj| d S )N)r   r   rP   )r7   rS   r   r   r   r   rT     s    
zConnectionWrapper.sendc             C   s   | j j }| j|S )N)r   rW   r   )r7   r   r   r   r   r_     s    
zConnectionWrapper.recvN)rh   ri   rj   r;   rT   r_   r   r   r   r   r     s   r   c             C   s   t j| fd d d djdS )Nr   zutf-8)	xmlrpclibrR   encode)rS   r   r   r   
_xml_dumps  s    r   c             C   s   t j| jd\\}}|S )Nzutf-8)r   r]   decode)r   rS   methodr   r   r   
_xml_loads  s    r   c               @   s   e Zd Zdd ZdS )XmlListenerc             C   s    dd l jatj| }t|ttS )Nr   )xmlrpc.clientclientr   r   r   r   r   r   )r7   rS   r   r   r   r      s    

zXmlListener.acceptN)rh   ri   rj   r   r   r   r   r   r     s   r   c              O   s   dd l jatt| |ttS )Nr   )r   r   r   r   r   r   r   )r   kwdsr   r   r   	XmlClient  s    
r   c             C   s   t | }g }x|rtj|d|}|tkr,P n\t|  koFtt| k n  rV|t8 }n2t|  koptt| k n  r|t8 }ntd|j||  ||d d  }d}qW |S )NFzShould not get herer   r   )	listrn   rp   r   r   rI   r   r   r   )Zhandlesr   Lreadyr   r   r   r   _exhaustive_wait  s     
 
r   c       
   .      sn  |dkrt }n|dk rd}nt|d d }t| } i g }t  t }zHx2| D ](}yt|d}W n  tk
r   ||j < Y qTX ytj| dd\}}W n8 t	k
r } zd|j
 }}|tkrʂ W Y dd}~X nX |tjkr|j| ||j< qT|rptj dd dkrpy|jd	\}	}W n* t	k
rT } z|j
}W Y dd}~X nX | rpt|d
rpd|_ j| d}qTW tj |}W dx|D ]}|j  qW x|D ]}y|jd\}	}W n6 t	k
r } z|j
}|tkr W Y dd}~X nX |tjkr|j } j| |dkrt|d
rd|_qW X  jfdd|D   fdd| D S )z
        Wait till an object in object_list is ready/readable.

        Returns list of those objects in object_list which are ready/readable.
        Nr   i  g      ?rE   T      Fry   c             3   s   | ]} | V  qd S )Nr   ).0r   )waithandle_to_objr   r   	<genexpr>r  s    zwait.<locals>.<genexpr>c                s   g | ]}| kr|qS r   r   )r   o)ready_objectsr   r   
<listcomp>s  s    zwait.<locals>.<listcomp>)r   r   )r   intr   setr   AttributeErrorr3   rn   r}   r>   r   _ready_errorsro   r   rq   r'   Zgetwindowsversionrt   r)   ry   addr   keysrs   ZERROR_OPERATION_ABORTEDupdate)
object_listr   Zov_listZready_handlesr  rE   ru   rv   r   r   r   )r  r   r   r   '  sh    








PollSelectorc             C   s   t  x}x| D ]}|j|tj qW |dk	r8tj | }x@|j|}|rVdd |D S |dk	r:|tj  }|dk r:|S q:W W dQ R X dS )z
        Wait till an object in object_list is ready/readable.

        Returns list of those objects in object_list which are ready/readable.
        Nc             S   s   g | ]\}}|j qS r   )Zfileobj)r   keyZeventsr   r   r   r    s    zwait.<locals>.<listcomp>r   )_WaitSelectorregister	selectorsZ
EVENT_READr   r   Zselect)r  r   ZselectorrS   Zdeadliner   r   r   r   r     s    

c             C   sN   | j  }tj|tjtj*}ddlm} |j|}t|| j	| j
ffS Q R X d S )Nr   )resource_sharer)rE   r*   Zfromfdr   ZSOCK_STREAMr   r  Z	DupSocketrebuild_connectionr9   r:   )r   r8   r   r  dsr   r   r   reduce_connection  s
    
r  c             C   s   | j  }t|j  ||S )N)r   r   )r  r9   r:   Zsockr   r   r   r    s    r  c             C   sB   | j rtjnd| jrtjndB }tj| j |}t|| j | jffS )Nr   )	r9   rn   ZFILE_GENERIC_READr:   ZFILE_GENERIC_WRITEr
   Z	DupHandlerE   rebuild_pipe_connection)r   r   dhr   r   r   reduce_pipe_connection  s    r  c             C   s   | j  }t|||S )N)r   rl   )r  r9   r:   r8   r   r   r   r    s    r  c             C   s    t j| j }t|| j| jffS )N)r
   ZDupFdrE   r  r9   r:   )r   dfr   r   r   r    s    c             C   s   | j  }t|||S )N)r   r   )r  r9   r:   fdr   r   r   r    s    )NN)T)T)N)N)I__all__rz   r    r'   r*   r   r   r   	itertoolsr   r   r   r   r	   contextr
   ZForkingPicklerrQ   rn   r   r   r   r   ImportErrorr(   r   ZCONNECTION_TIMEOUTcountr#   r   Zfamiliesr)   r   r   r&   r+   r1   r2   rl   r   objectr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   ZERROR_NETNAME_DELETEDr  r   r  r  r  ZSelectSelectorr  r  r  r  r  r   r   r   r   <module>
   s   




 PJ8

,+8	P
