o
    éT•jŽ¹  ã                   @   sP  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m	Z	 ddl
mZ ddlmZ ddlmZmZmZ ddlmZ dd	lmZ dd
lmZ ddlmZ zddlmZ W n eyk   dZY nw dZe  d¡ dd„ Ze eje¡ dd„ dD ƒZed euršdd„ ZeD ]Ze ee¡ q‘G dd„ de ƒZ!di fdd„Z"dd„ Z#G dd„ de$ƒZ%d d!„ Z&d"d#„ Z'G d$d%„ d%e ƒZ(G d&d'„ d'e ƒZ)ej*ej+fej,ej-fd(œZ.G d)d*„ d*e ƒZ/G d+d,„ d,e0ƒZ1G d-d.„ d.e ƒZ2d/d0„ Z3i fd1d2„Z4		dmd3d4„Z5G d5d6„ d6e ƒZ6G d7d8„ d8e ƒZ7dnd9d:„Z8G d;d<„ d<e2ƒZ9G d=d>„ d>e2ƒZ:G d?d@„ d@e:ƒZ;G dAdB„ dBe2ƒZ<G dCdD„ dDe2ƒZ=G dEdF„ dFe2ƒZ>G dGdH„ dHe2ƒZ?e4dIdJƒZ@G dKdL„ dLe@ƒZAe4dMdNƒZBdOdPieB_Ce4dQdRƒZDe4dSdTƒZEdUdUdUdPdPdVœeE_CG dWdS„ dSeEƒZFG dXdY„ dYe/ƒZGeG dZejH¡ eG d[ejH¡ eG d\ejIe<¡ eG d]ejJe:¡ eG d^ejKe:¡ eG d_ejLe:¡ eG d`ejMe:¡ eG daejNe;¡ eG dbejOe=¡ eG dcejPeF¡ eG ddeeA¡ eG deeQeB¡ eG d8e7e?¡ eG d:e8eD¡ eG d6e6e>¡ eGjdPe9ddf� eGjdUddg� e�r&G dhdi„ diƒZRG djdk„ dke(ƒZSG dld„ de/ƒZTdS dS )o)ÚBaseManagerÚSyncManagerÚ	BaseProxyÚTokené    N)Úgetpid)Ú
format_excé   )Ú
connection)Ú	reductionÚget_spawning_popenÚProcessError)Úpool)Úprocess)Úutil)Úget_context)Úshared_memoryFTÚSharedMemoryManagerc                 C   s   t j | j|  ¡ ffS ©N)ÚarrayÚtypecodeÚtobytes)Úa© r   ú//usr/lib/python3.10/multiprocessing/managers.pyÚreduce_array/   ó   r   c                 C   s   g | ]
}t ti |ƒƒ ƒ‘qS r   )ÚtypeÚgetattr©Ú.0Únamer   r   r   Ú
<listcomp>3   ó    r!   )ÚitemsÚkeysÚvaluesc                 C   s   t t | ƒffS r   )Úlist©Úobjr   r   r   Úrebuild_as_list5   ó   r)   c                   @   s4   e Zd ZdZdZdd„ Zdd„ Zdd„ Zd	d
„ ZdS )r   z3
    Type to uniquely identify a shared object
    ©ÚtypeidÚaddressÚidc                 C   s   |||| _ | _| _d S r   r+   )Úselfr,   r-   r.   r   r   r   Ú__init__D   s   zToken.__init__c                 C   s   | j | j| jfS r   r+   ©r/   r   r   r   Ú__getstate__G   ó   zToken.__getstate__c                 C   s   |\| _ | _| _d S r   r+   ©r/   Ústater   r   r   Ú__setstate__J   r   zToken.__setstate__c                 C   s   d| j j| j| j| jf S )Nz %s(typeid=%r, address=%r, id=%r))Ú	__class__Ú__name__r,   r-   r.   r1   r   r   r   Ú__repr__M   s   ÿzToken.__repr__N)	r8   Ú
__module__Ú__qualname__Ú__doc__Ú	__slots__r0   r2   r6   r9   r   r   r   r   r   >   s    r   r   c                 C   s4   |   ||||f¡ |  ¡ \}}|dkr|S t||ƒ‚)zL
    Send a message to manager using connection `c` and return response
    ú#RETURN)ÚsendÚrecvÚconvert_to_error)Úcr.   Ú
methodnameÚargsÚkwdsÚkindÚresultr   r   r   ÚdispatchU   s
   
rH   c                 C   s^   | dkr|S | dv r(t |tƒstd || t|ƒ¡ƒ‚| dkr$td| ƒS t|ƒS td | ¡ƒS )Nú#ERROR)ú
#TRACEBACKú#UNSERIALIZABLEz.Result {0!r} (kind '{1}') type is {2}, not strrK   zUnserializable message: %s
zUnrecognized message type {!r})Ú
isinstanceÚstrÚ	TypeErrorÚformatr   ÚRemoteErrorÚ
ValueError)rF   rG   r   r   r   rA   _   s   

ÿÿrA   c                   @   s   e Zd Zdd„ ZdS )rP   c                 C   s   dt | jd ƒ d S )NzM
---------------------------------------------------------------------------
r   zK---------------------------------------------------------------------------)rM   rD   r1   r   r   r   Ú__str__o   s   zRemoteError.__str__N)r8   r:   r;   rR   r   r   r   r   rP   n   s    rP   c                 C   s2   g }t | ƒD ]}t| |ƒ}t|ƒr| |¡ q|S )z4
    Return a list of names of methods of `obj`
    )Údirr   ÚcallableÚappend)r(   Útempr    Úfuncr   r   r   Úall_methodsv   s   

€rX   c                 C   s   dd„ t | ƒD ƒS )zP
    Return a list of names of methods of `obj` which do not start with '_'
    c                 S   s   g | ]
}|d  dkr|‘qS )r   Ú_r   r   r   r   r   r!   …   r"   z"public_methods.<locals>.<listcomp>)rX   r'   r   r   r   Úpublic_methods�   s   rZ   c                   @   s´   e Zd ZdZg d¢Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ ZeeedœZdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(S ))ÚServerzM
    Server class which runs in a process controlled by a manager object
    )	ÚshutdownÚcreateÚaccept_connectionÚget_methodsÚ
debug_infoÚnumber_of_objectsÚdummyÚincrefÚdecrefc                 C   sx   t |tƒstd |t|ƒ¡ƒ‚|| _t |¡| _t	| \}}||dd�| _
| j
j| _ddi| _i | _i | _t ¡ | _d S )Nz&Authkey {0!r} is type {1!s}, not bytesé   )r-   ÚbacklogÚ0©Nr   )rL   ÚbytesrN   rO   r   Úregistryr   ÚAuthenticationStringÚauthkeyÚlistener_clientÚlistenerr-   Ú	id_to_objÚid_to_refcountÚid_to_local_proxy_objÚ	threadingÚLockÚmutex)r/   rj   r-   rl   Ú
serializerÚListenerÚClientr   r   r   r0   ’   s   
ÿÿ

zServer.__init__c              	   C   sÖ   t  ¡ | _| t ¡ _zGt j| jd�}d|_| 	¡  z| j 
¡ s*| j d¡ | j 
¡ rW n ttfy6   Y nw W tjtjkrKt d¡ tjt_tjt_t d¡ dS tjtjkret d¡ tjt_tjt_t d¡ w )z(
        Run the server forever
        )ÚtargetTr   zresetting stdout, stderrr   N)rr   ÚEventÚ
stop_eventr   Úcurrent_processÚ_manager_serverÚThreadÚaccepterÚdaemonÚstartÚis_setÚwaitÚKeyboardInterruptÚ
SystemExitÚsysÚstdoutÚ
__stdout__r   ÚdebugÚ
__stderr__ÚstderrÚexit)r/   r~   r   r   r   Úserve_forever¤   s2   



ÿ€ÿ€
ü
zServer.serve_foreverc                 C   sF   	 z| j  ¡ }W n	 ty   Y q w tj| j|fd�}d|_| ¡  q)NT©rx   rD   )rn   ÚacceptÚOSErrorrr   r}   Úhandle_requestr   r€   )r/   rB   Útr   r   r   r~   º   s   ÿùzServer.accepterc                 C   s:  d }z*t  || j¡ t  || j¡ | ¡ }|\}}}}|| jv s&J d| ƒ‚t| |ƒ}W n ty:   dtƒ f}Y n!w z||g|¢R i |¤Ž}	W n tyV   dtƒ f}Y nw d|	f}z| 	|¡ W d S  tyœ }
 z-z
| 	dtƒ f¡ W n	 ty~   Y nw t
 d|¡ t
 d|¡ t
 d|
¡ W Y d }
~
d S d }
~
ww )Nz%r unrecognizedrJ   r>   zFailure to send message: %rz ... request was %rú ... exception was %r)r	   Údeliver_challengerl   Úanswer_challenger@   Úpublicr   Ú	Exceptionr   r?   r   Úinfo)r/   rB   ÚrequestÚignoreÚfuncnamerD   rE   rW   ÚmsgrG   Úer   r   r   Ú_handle_requestÄ   s<   ÿÿÿ€ùzServer._handle_requestc                 C   sJ   zz|   |¡ W n	 ty   Y nw W | ¡  dS W | ¡  dS | ¡  w )z)
        Handle a new connection
        N)r�   r„   Úclose©r/   Úconnr   r   r   r�   â   s   þÿþzServer.handle_requestc                 C   sÌ  t  dt ¡ j¡ |j}|j}| j}| j 	¡ �sdz˜d }}|ƒ }|\}}}	}
z	|| \}}}W n& t
yU } zz
| j| \}}}W n	 t
yJ   |‚w W Y d}~nd}~ww ||vretd|t|ƒ|f ƒ‚t||ƒ}z	||	i |
¤Ž}W n ty‰ } z
d|f}W Y d}~n*d}~ww |o‘| |d¡}|r«|  |||¡\}}t|| j|ƒ}d||ff}nd|f}W n` tyë   |du rÁdtƒ f}n(z| j| }|| |||g|	¢R i |
¤Ž}d|f}W n tyè   dtƒ f}Y nw Y n& t�y   t  dt ¡ j¡ t d	¡ Y n t�y   dtƒ f}Y nw zz||ƒ W n t�y)   |d
tƒ fƒ Y nw W n1 t�y\ } z$t  dt ¡ j¡ t  d|¡ t  d|¡ | ¡  t d¡ W Y d}~nd}~ww | j 	¡ rdS dS )zQ
        Handle requests from the proxies in a particular process/thread
        z$starting server thread to service %rNz+method %r of %r object is not in exposed=%rrI   ú#PROXYr>   rJ   z$got EOF -- exiting thread serving %rr   rK   zexception in thread serving %rz ... message was %rr’   r   )r   rˆ   rr   Úcurrent_threadr    r@   r?   ro   rz   r�   ÚKeyErrorrq   ÚAttributeErrorr   r   r–   Úgetr]   r   r-   r   Úfallback_mappingÚEOFErrorr…   r‹   r—   rž   )r/   r    r@   r?   ro   rC   r(   r˜   ÚidentrD   rE   ÚexposedÚ	gettypeidÚkeÚfunctionÚresrœ   r›   r,   ÚridentÚrexposedÚtokenÚfallback_funcrG   r   r   r   Úserve_clientî   s¬   ÿÿÿþ€þÿÿ
€ÿ€
ÿÿÿÿ€ÿÿÿ€ÿ€úÂzServer.serve_clientc                 C   s   |S r   r   ©r/   r    r¨   r(   r   r   r   Úfallback_getvalue?  ó   zServer.fallback_getvaluec                 C   ó   t |ƒS r   ©rM   r³   r   r   r   Úfallback_strB  ó   zServer.fallback_strc                 C   r¶   r   )Úreprr³   r   r   r   Úfallback_reprE  r¹   zServer.fallback_repr)rR   r9   ú	#GETVALUEc                 C   s   d S r   r   ©r/   rB   r   r   r   rb   N  rµ   zServer.dummyc              
   C   s�   | j �; g }t| j ¡ ƒ}| ¡  |D ]}|dkr1| d|| j| t| j| d ƒdd… f ¡ qd |¡W  d  ƒ S 1 sAw   Y  dS )zO
        Return some info --- useful to spot problems with refcounting
        rg   z  %s:       refcount=%s
    %sr   NéK   Ú
)	rt   r&   rp   r$   ÚsortrU   rM   ro   Újoin)r/   rB   rG   r$   r¨   r   r   r   r`   Q  s   
ÿÿ€$÷zServer.debug_infoc                 C   s
   t | jƒS )z*
        Number of shared objects
        )Úlenrp   r½   r   r   r   ra   a  s   
zServer.number_of_objectsc                 C   s`   z)zt  d¡ | d¡ W n   ddl}| ¡  Y W | j ¡  dS W | j ¡  dS | j ¡  w )z'
        Shutdown this process
        z!manager received shutdown message©r>   Nr   N)r   rˆ   r?   Ú	tracebackÚ	print_excrz   Úset)r/   rB   rÄ   r   r   r   r\   h  s   
ûzServer.shutdownc                O   s  | j �q | j| \}}}}|du r"|st|ƒdkrtdƒ‚|d }	n||i |¤Ž}	|du r1t|	ƒ}|durLt|tƒsDtd |t	|ƒ¡ƒ‚t
|ƒt
|ƒ }dt|	ƒ }
t d||
¡ |	t|ƒ|f| j|
< |
| jvrmd| j|
< W d  ƒ n1 sww   Y  |  ||
¡ |
t|ƒfS )z>
        Create a new shared object and return its id
        Nr   z4Without callable, must have one non-keyword argumentr   z,Method_to_typeid {0!r}: type {1!s}, not dictz%xz&%r callable returned object with id %r)rt   rj   rÂ   rQ   rZ   rL   ÚdictrN   rO   r   r&   r.   r   rˆ   rÆ   ro   rp   rc   Útuple)r/   rB   r,   rD   rE   rT   r©   Úmethod_to_typeidÚ	proxytyper(   r¨   r   r   r   r]   u  s:   
ÿÿ

ÿÿ

€åzServer.createc                 C   s   t | j|j d ƒS )zL
        Return the methods of the shared object indicated by token
        r   )rÈ   ro   r.   )r/   rB   r°   r   r   r   r_   ™  s   zServer.get_methodsc                 C   s"   |t  ¡ _| d¡ |  |¡ dS )z=
        Spawn a new thread to serve this connection
        rÃ   N)rr   r¢   r    r?   r²   )r/   rB   r    r   r   r   r^   Ÿ  s   

zServer.accept_connectionc                 C   s¾   | j �R z| j|  d7  < W n5 tyD } z)|| jv r8d| j|< | j| | j|< | j| \}}}t d|¡ n|‚W Y d }~nd }~ww W d   ƒ d S W d   ƒ d S 1 sXw   Y  d S )Nr   z&Server re-enabled tracking & INCREF %r)rt   rp   r£   rq   ro   r   rˆ   )r/   rB   r¨   r«   r(   r©   rª   r   r   r   rc   §  s$   

ÿþ€öÿþ"ózServer.increfc                 C   sö   || j vr|| jv rt d|¡ d S | j�2 | j | dkr,td || j| | j | ¡ƒ‚| j |  d8  < | j | dkr@| j |= W d   ƒ n1 sJw   Y  || j vryd| j|< t d|¡ | j� | j|= W d   ƒ d S 1 srw   Y  d S d S )NzServer DECREF skipping %rr   z+Id {0!s} ({1!r}) has refcount {2:n}, not 1+r   )Nr   Nzdisposing of obj with id %r)rp   rq   r   rˆ   rt   ÚAssertionErrorrO   ro   )r/   rB   r¨   r   r   r   rd   ¹  s0   


þÿ€ø



"ÿøzServer.decrefN)r8   r:   r;   r<   r•   r0   rŒ   r~   r�   r�   r²   r´   r¸   r»   r¦   rb   r`   ra   r\   r]   r_   r^   rc   rd   r   r   r   r   r[   ‹   s2    
Qý$r[   c                   @   s   e Zd ZdgZdZdZdZdS )ÚStateÚvaluer   r   é   N)r8   r:   r;   r=   ÚINITIALÚSTARTEDÚSHUTDOWNr   r   r   r   rÌ   Ù  s
    rÌ   )ÚpickleÚ	xmlrpclibc                   @   s¬   e Zd ZdZi ZeZ		d"dd„Zdd„ Zdd	„ Z	d#dd„Z
e	
d#dd„ƒZdd„ Zd$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 d!„ƒZdS )&r   z!
    Base class for managers
    NrÒ   c                 C   s\   |d u r	t  ¡ j}|| _t  |¡| _tƒ | _tj| j_	|| _
t| \| _| _|p*tƒ | _d S r   )r   r{   rl   Ú_addressrk   Ú_authkeyrÌ   Ú_staterÏ   rÍ   Ú_serializerrm   Ú	_ListenerÚ_Clientr   Ú_ctx)r/   r-   rl   ru   Úctxr   r   r   r0   ó  s   

zBaseManager.__init__c                 C   sb   | j jtjkr&| j jtjkrtdƒ‚| j jtjkrtdƒ‚td | j j¡ƒ‚t| j	| j
| j| jƒS )zX
        Return server object with serve_forever() method and address attribute
        úAlready started serverúManager has shut downúUnknown state {!r})rÖ   rÍ   rÌ   rÏ   rÐ   r   rÑ   rO   r[   Ú	_registryrÔ   rÕ   r×   r1   r   r   r   Ú
get_serverÿ  s   ÿ
ÿzBaseManager.get_serverc                 C   s8   t | j \}}|| j| jd�}t|ddƒ tj| j_dS )z>
        Connect manager object to the server process
        ©rl   Nrb   )	rm   r×   rÔ   rÕ   rH   rÌ   rÐ   rÖ   rÍ   )r/   rv   rw   r    r   r   r   Úconnect  s   zBaseManager.connectr   c              	   C   s0  | j jtjkr&| j jtjkrtdƒ‚| j jtjkrtdƒ‚td | j j¡ƒ‚|dur2t|ƒs2t	dƒ‚t
jdd�\}}| jjt| ƒj| j| j| j| j|||fd�| _d	 d
d„ | jjD ƒ¡}t| ƒjd | | j_| j ¡  | ¡  | ¡ | _| ¡  tj| j _tj| t| ƒj| j| j| j| j | jfdd�| _ dS )z@
        Spawn a server process for this manager object
        rÜ   rÝ   rÞ   Nzinitializer must be a callableF)Úduplexr�   ú:c                 s   s   � | ]}t |ƒV  qd S r   r·   )r   Úir   r   r   Ú	<genexpr>0  s   € z$BaseManager.start.<locals>.<genexpr>ú-r   ©rD   Úexitpriority)!rÖ   rÍ   rÌ   rÏ   rÐ   r   rÑ   rO   rT   rN   r	   ÚPiperÚ   ÚProcessr   Ú_run_serverrß   rÔ   rÕ   r×   Ú_processrÁ   Ú	_identityr8   r    r€   rž   r@   r   ÚFinalizeÚ_finalize_managerrÙ   r\   )r/   ÚinitializerÚinitargsÚreaderÚwriterr¨   r   r   r   r€     s>   ÿ
ÿþ



ÿüzBaseManager.startc           	      C   s^   t   t jt j¡ |dur||Ž  |  ||||¡}| |j¡ | ¡  t d|j¡ | 	¡  dS )z@
        Create a server, report its address and run it
        Nzmanager serving at %r)
ÚsignalÚSIGINTÚSIG_IGNÚ_Serverr?   r-   rž   r   r—   rŒ   )	Úclsrj   r-   rl   ru   rô   rñ   rò   Úserverr   r   r   rì   B  s   zBaseManager._run_serverc                O   sl   | j jtjksJ dƒ‚| j| j| jd�}zt|dd|f| |ƒ\}}W | ¡  n| ¡  w t	|| j|ƒ|fS )zP
        Create a new shared object; return the token and exposed tuple
        zserver not yet startedrá   Nr]   )
rÖ   rÍ   rÌ   rÐ   rÙ   rÔ   rÕ   rH   rž   r   )r/   r,   rD   rE   r    r.   r©   r   r   r   Ú_createY  s   zBaseManager._createc                 C   s2   | j dur| j  |¡ | j  ¡ sd| _ dS dS dS )zC
        Join the manager process (if it has been spawned)
        N)rí   rÁ   Úis_alive©r/   Útimeoutr   r   r   rÁ   e  s   


ýzBaseManager.joinc                 C   ó4   | j | j| jd�}zt|ddƒW | ¡  S | ¡  w )zS
        Return some info about the servers shared objects and connections
        rá   Nr`   ©rÙ   rÔ   rÕ   rH   rž   rŸ   r   r   r   Ú_debug_infon  ó   zBaseManager._debug_infoc                 C   rÿ   )z5
        Return the number of shared objects
        rá   Nra   r   rŸ   r   r   r   Ú_number_of_objectsx  r  zBaseManager._number_of_objectsc                 C   sf   | j jtjkr|  ¡  | j jtjkr1| j jtjkrtdƒ‚| j jtjkr(tdƒ‚td | j j¡ƒ‚| S )NzUnable to start serverrÝ   rÞ   )	rÖ   rÍ   rÌ   rÏ   r€   rÐ   r   rÑ   rO   r1   r   r   r   Ú	__enter__‚  s   ÿzBaseManager.__enter__c                 C   ó   |   ¡  d S r   )r\   ©r/   Úexc_typeÚexc_valÚexc_tbr   r   r   Ú__exit__�  ó   zBaseManager.__exit__c                 C   sÞ   |   ¡ rYt d¡ z|||d�}zt|ddƒ W | ¡  n| ¡  w W n	 ty,   Y nw | jdd� |   ¡ rYt d¡ t| dƒrYt d	¡ |  ¡  | jdd� |   ¡ rYt d
¡ t	j
|_ztj|= W dS  tyn   Y dS w )zQ
        Shutdown the manager process; will be registered as a finalizer
        z#sending shutdown message to managerrá   Nr\   g      ð?)rþ   zmanager still aliveÚ	terminatez'trying to `terminate()` manager processz#manager still alive after terminate)rü   r   r—   rH   rž   r–   rÁ   Úhasattrr  rÌ   rÑ   rÍ   r   Ú_address_to_localr£   )r   r-   rl   r5   rÙ   r    r   r   r   rð   ’  s2   
ÿ



ÿzBaseManager._finalize_managerc                 C   ó   | j S r   )rÔ   r1   r   r   r   r-   ²  s   zBaseManager.addressTc           
         sÊ   d| j vr| j ¡ | _ˆ du rt‰ |ptˆ ddƒ}|p tˆ ddƒ}|rFt| ¡ ƒD ]\}}t|ƒtu s9J d| ƒ‚t|ƒtu sEJ d| ƒ‚q)|||ˆ f| jˆ< |rc‡ ‡fdd„}	ˆ|	_	t
| ˆ|	ƒ dS dS )z9
        Register a typeid with the manager type
        rß   NÚ	_exposed_Ú_method_to_typeid_z%r is not a stringc                   sf   t  dˆ¡ | jˆg|¢R i |¤Ž\}}ˆ || j| | j|d�}| j|j| jd�}t|d d|jfƒ |S )Nz)requesting creation of a shared %r object©Úmanagerrl   r©   rá   rd   )	r   rˆ   rû   r×   rÕ   rÙ   r-   rH   r.   )r/   rD   rE   r°   ÚexpÚproxyr    ©rÊ   r,   r   r   rV   Ñ  s   þz"BaseManager.register.<locals>.temp)Ú__dict__rß   ÚcopyÚ	AutoProxyr   r&   r#   r   rM   r8   Úsetattr)
rù   r,   rT   rÊ   r©   rÉ   Úcreate_methodÚkeyrÍ   rV   r   r  r   Úregister¶  s&   

ÿ
ÿ
ôzBaseManager.register)NNrÒ   Nrh   r   )NNNNT)r8   r:   r;   r<   rß   r[   rø   r0   rà   râ   r€   Úclassmethodrì   rû   rÁ   r  r  r  r
  Ústaticmethodrð   Úpropertyr-   r  r   r   r   r   r   ì  s6    
ÿ
	+ÿ
	



ÿr   c                   @   ó   e Zd Zdd„ Zdd„ ZdS )ÚProcessLocalSetc                 C   s   t  | dd„ ¡ d S )Nc                 S   ó   |   ¡ S r   )Úclearr'   r   r   r   Ú<lambda>ä  s    z*ProcessLocalSet.__init__.<locals>.<lambda>)r   Úregister_after_forkr1   r   r   r   r0   ã  r   zProcessLocalSet.__init__c                 C   s   t | ƒdfS rh   )r   r1   r   r   r   Ú
__reduce__å  r  zProcessLocalSet.__reduce__N)r8   r:   r;   r0   r'  r   r   r   r   r"  â  ó    r"  c                   @   s„   e Zd ZdZi Ze ¡ Z		ddd„Zdd„ Z	d	i fd
d„Z
dd„ Zdd„ Zedd„ ƒZdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )r   z.
    A base for proxies of shared objects
    NTFc           	      C   sò   t j�! t j |jd ¡}|d u rt ¡ tƒ f}|t j|j< W d   ƒ n1 s'w   Y  |d | _|d | _	|| _
| j
j| _|| _|| _t| d | _|| _|d urYt |¡| _n| jd urd| jj| _nt ¡ j| _|rp|  ¡  t | t j¡ d S )Nr   r   )r   Ú_mutexr  r¥   r-   r   ÚForkAwareLocalr"  Ú_tlsÚ_idsetÚ_tokenr.   Ú_idÚ_managerr×   rm   rÙ   Ú_owned_by_managerr   rk   rÕ   r{   rl   Ú_increfr&  Ú_after_fork)	r/   r°   ru   r  rl   r©   rc   Úmanager_ownedÚ	tls_idsetr   r   r   r0   ó  s.   €ü



zBaseProxy.__init__c                 C   sd   t  d¡ t ¡ j}t ¡ jdkr|dt ¡ j 7 }| j| jj	| j
d�}t|d d|fƒ || j_d S )Nzmaking connection to managerÚ
MainThreadú|rá   r^   )r   rˆ   r   r{   r    rr   r¢   rÙ   r-  r-   rÕ   rH   r+  r	   )r/   r    r    r   r   r   Ú_connect  s   

zBaseProxy._connectr   c                 C   sä   z| j j}W n ty    t dt ¡ j¡ |  ¡  | j j}Y nw | 	| j
|||f¡ | ¡ \}}|dkr7|S |dkrm|\}}| jj|j d }	| jj|_|	|| j| j| j|d�}
| j|j| jd�}t|dd|jfƒ |
S t||ƒ‚)	zV
        Try to call a method of the referent and return a copy of the result
        z#thread %r does not own a connectionr>   r¡   éÿÿÿÿr  rá   Nrd   )r+  r	   r¤   r   rˆ   rr   r¢   r    r7  r?   r.  r@   r/  rß   r,   r-  r-   r×   rÕ   rÙ   rH   r.   rA   )r/   rC   rD   rE   r    rF   rG   r©   r°   rÊ   r  r   r   r   Ú_callmethod%  s2   ÿü

þ
zBaseProxy._callmethodc                 C   ó
   |   d¡S )z9
        Get a copy of the value of the referent
        r¼   ©r9  r1   r   r   r   Ú	_getvalueC  s   
zBaseProxy._getvaluec              	   C   sœ   | j rt d| jj¡ d S | j| jj| jd�}t|d d| j	fƒ t d| jj¡ | j
 | j	¡ | jo5| jj}tj| tj| j| j|| j| j
| jfdd�| _d S )Nz%owned_by_manager skipped INCREF of %rrá   rc   z	INCREF %ré
   rè   )r0  r   rˆ   r-  r.   rÙ   r-   rÕ   rH   r.  r,  Úaddr/  rÖ   rï   r   Ú_decrefr+  Ú_close)r/   r    r5   r   r   r   r1  I  s   
ÿüzBaseProxy._increfc              
   C   sÌ   |  | j¡ |d u s|jtjkrBzt d| j¡ || j|d�}t|d d| jfƒ W n t	yA } zt d|¡ W Y d }~nd }~ww t d| j¡ |sbt
|dƒrdt dt ¡ j¡ |j ¡  |`d S d S d S )Nz	DECREF %rrá   rd   z... decref failed %sz%DECREF %r -- manager already shutdownr	   z-thread %r has no more proxies so closing conn)Údiscardr.   rÍ   rÌ   rÐ   r   rˆ   r-   rH   r–   r  rr   r¢   r    r	   rž   )r°   rl   r5   ÚtlsÚidsetrÙ   r    rœ   r   r   r   r?  ]  s$   €ÿÿ
üzBaseProxy._decrefc              
   C   sJ   d | _ z|  ¡  W d S  ty$ } zt d| ¡ W Y d }~d S d }~ww )Nzincref failed: %s)r/  r1  r–   r   r—   )r/   rœ   r   r   r   r2  v  s   €þzBaseProxy._after_forkc                 C   sZ   i }t ƒ d ur| j|d< t| ddƒr!| j|d< tt| j| j|ffS tt| ƒ| j| j|ffS )Nrl   Ú_isautoFr©   )	r   rÕ   r   r  ÚRebuildProxyr  r-  r×   r   ©r/   rE   r   r   r   r'  ~  s   


ÿÿzBaseProxy.__reduce__c                 C   r#  r   )r<  )r/   Úmemor   r   r   Ú__deepcopy__‹  r¹   zBaseProxy.__deepcopy__c                 C   s   dt | ƒj| jjt| ƒf S )Nz<%s object, typeid %r at %#x>)r   r8   r-  r,   r.   r1   r   r   r   r9   Ž  s   ÿzBaseProxy.__repr__c                 C   s4   z|   d¡W S  ty   t| ƒdd… d  Y S w )zV
        Return representation of the referent (or a fall-back if that fails)
        r9   Nr8  z; '__str__()' failed>)r9  r–   rº   r1   r   r   r   rR   ’  s
   ÿzBaseProxy.__str__©NNNTF)r8   r:   r;   r<   r  r   ÚForkAwareThreadLockr)  r0   r7  r9  r<  r1  r  r?  r2  r'  rH  r9   rR   r   r   r   r   r   ì  s$    
ÿ)	
r   c                 C   sˆ   t t ¡ ddƒ}|r*|j|jkr*t d|¡ d|d< |j|jvr*|j|j |j|j< | 	dd¡o8t t ¡ ddƒ }| ||fd|i|¤ŽS )	z5
    Function used for unpickling proxy objects.
    r|   Nz*Rebuild a proxy owned by manager, token=%rTr3  rc   Ú_inheritingF)
r   r   r{   r-   r   rˆ   r.   rq   ro   Úpop)rW   r°   ru   rE   rú   rc   r   r   r   rE  Ÿ  s   

ÿþrE  c                 C   sn   t |ƒ}z|| |f W S  ty   Y nw i }|D ]}td||f |ƒ qt| tf|ƒ}||_||| |f< |S )zB
    Return a proxy type whose methods are given by `exposed`
    zOdef %s(self, /, *args, **kwds):
        return self._callmethod(%r, args, kwds))rÈ   r£   Úexecr   r   r  )r    r©   Ú_cacheÚdicÚmethÚ	ProxyTyper   r   r   ÚMakeProxyType´  s"   ÿÿÿrR  c                 C   s    t | d }|du r%|| j|d�}zt|dd| fƒ}W | ¡  n| ¡  w |du r0|dur0|j}|du r9t ¡ j}td| j	 |ƒ}	|	| |||||d�}
d|
_
|
S )z*
    Return an auto-proxy for `token`
    r   Nrá   r_   zAutoProxy[%s])r  rl   rc   r3  T)rm   r-   rH   rž   rÕ   r   r{   rl   rR  r,   rD  )r°   ru   r  rl   r©   rc   r3  rÙ   r    rQ  r  r   r   r   r  Ê  s    

ÿr  c                   @   r!  )Ú	Namespacec                K   s   | j  |¡ d S r   )r  ÚupdaterF  r   r   r   r0   è  r3   zNamespace.__init__c                 C   sZ   t | j ¡ ƒ}g }|D ]\}}| d¡s| d||f ¡ q| ¡  d| jjd |¡f S )NrY   z%s=%rz%s(%s)z, )	r&   r  r#   Ú
startswithrU   rÀ   r7   r8   rÁ   )r/   r#   rV   r    rÍ   r   r   r   r9   ê  s   
€zNamespace.__repr__N)r8   r:   r;   r0   r9   r   r   r   r   rS  ç  r(  rS  c                   @   s8   e Zd Zddd„Zdd„ Zdd„ Zdd	„ ZeeeƒZd
S )ÚValueTc                 C   ó   || _ || _d S r   )Ú	_typecodeÚ_value)r/   r   rÍ   Úlockr   r   r   r0   ô  ó   
zValue.__init__c                 C   r  r   ©rY  r1   r   r   r   r¥   ÷  s   z	Value.getc                 C   s
   || _ d S r   r\  ©r/   rÍ   r   r   r   rÆ   ù  ó   
z	Value.setc                 C   s   dt | ƒj| j| jf S )Nz
%s(%r, %r))r   r8   rX  rY  r1   r   r   r   r9   û  s   zValue.__repr__N©T)	r8   r:   r;   r0   r¥   rÆ   r9   r   rÍ   r   r   r   r   rV  ó  s    
rV  c                 C   s   t   | |¡S r   )r   )r   ÚsequencerZ  r   r   r   ÚArrayÿ  r  ra  c                   @   s8   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ ZdS )ÚIteratorProxy)Ú__next__r?   Úthrowrž   c                 C   ó   | S r   r   r1   r   r   r   Ú__iter__  rµ   zIteratorProxy.__iter__c                 G   ó   |   d|¡S )Nrc  r;  ©r/   rD   r   r   r   rc  
  r  zIteratorProxy.__next__c                 G   rg  )Nr?   r;  rh  r   r   r   r?     r  zIteratorProxy.sendc                 G   rg  )Nrd  r;  rh  r   r   r   rd    r  zIteratorProxy.throwc                 G   rg  )Nrž   r;  rh  r   r   r   rž     r  zIteratorProxy.closeN)	r8   r:   r;   r  rf  rc  r?   rd  rž   r   r   r   r   rb    s    rb  c                   @   s2   e Zd ZdZddd„Zdd„ Zdd	„ Zd
d„ ZdS )ÚAcquirerProxy)ÚacquireÚreleaseTNc                 C   s"   |d u r|fn||f}|   d|¡S ©Nrj  r;  )r/   Úblockingrþ   rD   r   r   r   rj    s   zAcquirerProxy.acquirec                 C   r:  ©Nrk  r;  r1   r   r   r   rk    r^  zAcquirerProxy.releasec                 C   r:  rl  r;  r1   r   r   r   r    r^  zAcquirerProxy.__enter__c                 C   r:  rn  r;  r  r   r   r   r
    r^  zAcquirerProxy.__exit__)TN)r8   r:   r;   r  rj  rk  r  r
  r   r   r   r   ri    s    
ri  c                   @   s6   e Zd ZdZddd„Zddd„Zdd	„ Zdd
d„ZdS )ÚConditionProxy)rj  rk  r‚   ÚnotifyÚ
notify_allNc                 C   ó   |   d|f¡S ©Nr‚   r;  rý   r   r   r   r‚   #  r*   zConditionProxy.waitr   c                 C   rr  )Nrp  r;  )r/   Únr   r   r   rp  %  r*   zConditionProxy.notifyc                 C   r:  )Nrq  r;  r1   r   r   r   rq  '  r^  zConditionProxy.notify_allc                 C   sj   |ƒ }|r|S |d urt  ¡ | }nd }d }|s3|d ur)|t  ¡  }|dkr)	 |S |  |¡ |ƒ }|r|S )Nr   )ÚtimeÚ	monotonicr‚   )r/   Ú	predicaterþ   rG   ÚendtimeÚwaittimer   r   r   Úwait_for)  s"   
þúzConditionProxy.wait_forr   )r   )r8   r:   r;   r  r‚   rp  rq  rz  r   r   r   r   ro  !  s    

ro  c                   @   s2   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	d
„ZdS )Ú
EventProxy)r�   rÆ   r$  r‚   c                 C   r:  )Nr�   r;  r1   r   r   r   r�   >  r^  zEventProxy.is_setc                 C   r:  ©NrÆ   r;  r1   r   r   r   rÆ   @  r^  zEventProxy.setc                 C   r:  )Nr$  r;  r1   r   r   r   r$  B  r^  zEventProxy.clearNc                 C   rr  rs  r;  rý   r   r   r   r‚   D  r*   zEventProxy.waitr   )r8   r:   r;   r  r�   rÆ   r$  r‚   r   r   r   r   r{  <  s    r{  c                   @   sN   e Zd ZdZddd„Zdd„ Zdd„ Zed	d
„ ƒZedd„ ƒZ	edd„ ƒZ
dS )ÚBarrierProxy)Ú__getattribute__r‚   ÚabortÚresetNc                 C   rr  rs  r;  rý   r   r   r   r‚   J  r*   zBarrierProxy.waitc                 C   r:  )Nr  r;  r1   r   r   r   r  L  r^  zBarrierProxy.abortc                 C   r:  )Nr€  r;  r1   r   r   r   r€  N  r^  zBarrierProxy.resetc                 C   ó   |   dd¡S )Nr~  )Úpartiesr;  r1   r   r   r   r‚  P  ó   zBarrierProxy.partiesc                 C   r�  )Nr~  )Ú	n_waitingr;  r1   r   r   r   r„  S  rƒ  zBarrierProxy.n_waitingc                 C   r�  )Nr~  )Úbrokenr;  r1   r   r   r   r…  V  rƒ  zBarrierProxy.brokenr   )r8   r:   r;   r  r‚   r  r€  r   r‚  r„  r…  r   r   r   r   r}  H  s    


r}  c                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	ÚNamespaceProxy)r~  Ú__setattr__Ú__delattr__c                 C   s0   |d dkrt  | |¡S t  | d¡}|d|fƒS )Nr   rY   r9  r~  )Úobjectr~  ©r/   r  Ú
callmethodr   r   r   Ú__getattr__]  ó   zNamespaceProxy.__getattr__c                 C   s4   |d dkrt  | ||¡S t  | d¡}|d||fƒS )Nr   rY   r9  r‡  )r‰  r‡  r~  )r/   r  rÍ   r‹  r   r   r   r‡  b  s   zNamespaceProxy.__setattr__c                 C   s0   |d dkrt  | |¡S t  | d¡}|d|fƒS )Nr   rY   r9  rˆ  )r‰  rˆ  r~  rŠ  r   r   r   rˆ  g  r�  zNamespaceProxy.__delattr__N)r8   r:   r;   r  rŒ  r‡  rˆ  r   r   r   r   r†  [  s
    r†  c                   @   s4   e Zd ZdZdd„ Zdd„ ZeeeƒZee	j
ƒZdS )Ú
ValueProxy)r¥   rÆ   c                 C   r:  )Nr¥   r;  r1   r   r   r   r¥   p  r^  zValueProxy.getc                 C   rr  r|  r;  r]  r   r   r   rÆ   r  r*   zValueProxy.setN)r8   r:   r;   r  r¥   rÆ   r   rÍ   r  ÚtypesÚGenericAliasÚ__class_getitem__r   r   r   r   rŽ  n  s    
rŽ  ÚBaseListProxy)Ú__add__Ú__contains__Ú__delitem__Ú__getitem__Ú__len__Ú__mul__Ú__reversed__Ú__rmul__Ú__setitem__rU   ÚcountÚextendÚindexÚinsertrL  ÚremoveÚreverserÀ   Ú__imul__c                   @   r!  )Ú	ListProxyc                 C   ó   |   d|f¡ | S )Nr�  r;  r]  r   r   r   Ú__iadd__€  ó   zListProxy.__iadd__c                 C   r¤  )Nr¢  r;  r]  r   r   r   r¢  ƒ  r¦  zListProxy.__imul__N)r8   r:   r;   r¥  r¢  r   r   r   r   r£    s    r£  Ú	DictProxy)r”  r•  r–  rf  r—  r›  r$  r  r¥   r#   r$   rL  ÚpopitemÚ
setdefaultrT  r%   rf  ÚIteratorÚ
ArrayProxy)r—  r–  r›  Ú	PoolProxy)ÚapplyÚapply_asyncrž   ÚimapÚimap_unorderedrÁ   ÚmapÚ	map_asyncÚstarmapÚstarmap_asyncr  ÚAsyncResult)r®  r²  r´  r¯  r°  c                   @   r!  )r¬  c                 C   re  r   r   r1   r   r   r   r  £  rµ   zPoolProxy.__enter__c                 C   r  r   )r  r  r   r   r   r
  ¥  r  zPoolProxy.__exit__N)r8   r:   r;   r  r
  r   r   r   r   r¬  ¢  r(  c                   @   s   e Zd ZdZdS )r   a(  
    Subclass of `BaseManager` which supports a number of shared object types.

    The types registered are those intended for the synchronization
    of threads, plus `dict`, `list` and `Namespace`.

    The `multiprocessing.Manager()` function creates started instances of
    this class.
    N)r8   r:   r;   r<   r   r   r   r   r   ¬  s    r   ÚQueueÚJoinableQueuery   rs   ÚRLockÚ	SemaphoreÚBoundedSemaphoreÚ	ConditionÚBarrierÚPoolr&   rÇ   )rÊ   r  )r  c                   @   sL   e Zd ZdZg fdd„Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dS )Ú_SharedMemoryTrackerz+Manages one or more shared memory segments.c                 C   rW  r   ©Úshared_memory_context_nameÚsegment_names)r/   r    rÁ  r   r   r   r0   Ô  r[  z_SharedMemoryTracker.__init__c                 C   s(   t  d|›dtƒ › �¡ | j |¡ dS )z6Adds the supplied shared memory block name to tracker.zRegister segment ú in pid N)r   rˆ   r   rÁ  rU   ©r/   Úsegment_namer   r   r   Úregister_segmentØ  s   z%_SharedMemoryTracker.register_segmentc                 C   sB   t  d|›dtƒ › �¡ | j |¡ t |¡}| ¡  | ¡  dS )z‚Calls unlink() on the shared memory block with the supplied name
            and removes it from the list of blocks being tracked.zDestroy segment rÂ  N)	r   rˆ   r   rÁ  r   r   ÚSharedMemoryrž   Úunlink)r/   rÄ  Úsegmentr   r   r   Údestroy_segmentÝ  s
   
z$_SharedMemoryTracker.destroy_segmentc                 C   s"   | j dd… D ]}|  |¡ qdS )z<Calls destroy_segment() on all tracked shared memory blocks.N)rÁ  rÉ  rÃ  r   r   r   rÇ  æ  s   ÿz_SharedMemoryTracker.unlinkc                 C   s(   t  d| jj› dtƒ › �¡ |  ¡  d S )NzCall z.__del__ in )r   rˆ   r7   r8   r   rÇ  r1   r   r   r   Ú__del__ë  s   z_SharedMemoryTracker.__del__c                 C   s   | j | jfS r   r¿  r1   r   r   r   r2   ï  r  z!_SharedMemoryTracker.__getstate__c                 C   s   | j |Ž  d S r   )r0   r4   r   r   r   r6   ò  r*   z!_SharedMemoryTracker.__setstate__N)r8   r:   r;   r<   r0   rÅ  rÉ  rÇ  rÊ  r2   r6   r   r   r   r   r¾  Ñ  s    	r¾  c                   @   sJ   e Zd Zejg d¢ Zdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Z	dd„ Z
dS )ÚSharedMemoryServer)Útrack_segmentÚrelease_segmentÚlist_segmentsc                 O   s`   t j| g|¢R i |¤Ž | j}t|tƒrt |¡}td|› dtƒ › �ƒ| _	t
 dtƒ › �¡ d S )NÚshm_rY   z"SharedMemoryServer started by pid )r[   r0   r-   rL   ri   ÚosÚfsdecoder¾  r   Úshared_memory_contextr   rˆ   )r/   rD   Úkwargsr-   r   r   r   r0   û  s   

ÿzSharedMemoryServer.__init__c                O   s:   t | j| d dƒr| j|d< tj| ||g|¢R i |¤ŽS )zˆCreate a new distributed-shared object (not backed by a shared
            memory block) and return its id to be used in a Proxy Object.r8  Ú_shared_memory_proxyrÒ  )r  rj   rÒ  r[   r]   )r/   rB   r,   rD   rÓ  r   r   r   r]     s   
zSharedMemoryServer.createc                 C   s   | j  ¡  t | |¡S )zACall unlink() on all tracked shared memory, terminate the Server.)rÒ  rÇ  r[   r\   r½   r   r   r   r\     s   
zSharedMemoryServer.shutdownc                 C   ó   | j  |¡ dS )z?Adds the supplied shared memory block name to Server's tracker.N)rÒ  rÅ  ©r/   rB   rÄ  r   r   r   rÌ    s   z SharedMemoryServer.track_segmentc                 C   rÕ  )zˆCalls unlink() on the shared memory block with the supplied name
            and removes it from the tracker instance inside the Server.N)rÒ  rÉ  rÖ  r   r   r   rÍ    s   z"SharedMemoryServer.release_segmentc                 C   s   | j jS )zbReturns a list of names of shared memory blocks that the Server
            is currently tracking.)rÒ  rÁ  r½   r   r   r   rÎ    s   z SharedMemoryServer.list_segmentsN)r8   r:   r;   r[   r•   r0   r]   r\   rÌ  rÍ  rÎ  r   r   r   r   rË  ö  s    ÿ

rË  c                   @   s<   e Zd ZdZeZdd„ Zdd„ Zdd„ Zdd	„ Z	d
d„ Z
dS )r   a¡  Like SyncManager but uses SharedMemoryServer instead of Server.

        It provides methods for creating and returning SharedMemory instances
        and for creating a list-like object (ShareableList) backed by shared
        memory.  It also provides methods that create and return Proxy Objects
        that support synchronization across processes (i.e. multi-process-safe
        locks and semaphores).
        c                 O   sT   t jdkrddlm} | ¡  tj| g|¢R i |¤Ž t | j	j
› dtƒ › �¡ d S )NÚposixr   )Úresource_trackerz created by pid )rÐ  r    Ú rØ  Úensure_runningr   r0   r   rˆ   r7   r8   r   )r/   rD   rÓ  rØ  r   r   r   r0   /  s
   
zSharedMemoryManager.__init__c                 C   s   t  | jj› dtƒ › �¡ d S )Nz.__del__ by pid )r   rˆ   r7   r8   r   r1   r   r   r   rÊ  ;  s   zSharedMemoryManager.__del__c                 C   sd   | j jtjkr&| j jtjkrtdƒ‚| j jtjkrtdƒ‚td | j j¡ƒ‚|  | j	| j
| j| j¡S )z@Better than monkeypatching for now; merge into Server ultimatelyz"Already started SharedMemoryServerz!SharedMemoryManager has shut downrÞ   )rÖ   rÍ   rÌ   rÏ   rÐ   r   rÑ   rO   rø   rß   rÔ   rÕ   r×   r1   r   r   r   rà   ?  s   ÿÿzSharedMemoryManager.get_serverc                 C   s„   | j | j| jd��/}tjdd|d�}zt|dd|jfƒ W n ty/ } z| ¡  |‚d}~ww W d  ƒ |S 1 s;w   Y  |S )zoReturns a new SharedMemory instance with the specified size in
            bytes, to be tracked by the manager.rá   NT)r]   ÚsizerÌ  )	rÙ   rÔ   rÕ   r   rÆ  rH   r    ÚBaseExceptionrÇ  )r/   rÛ  r    Úsmsrœ   r   r   r   rÆ  L  s   €þÿ
ýùz SharedMemoryManager.SharedMemoryc                 C   s‚   | j | j| jd��.}t |¡}zt|dd|jjfƒ W n ty. } z|j 	¡  |‚d}~ww W d  ƒ |S 1 s:w   Y  |S )z�Returns a new ShareableList instance populated with the values
            from the input sequence, to be tracked by the manager.rá   NrÌ  )
rÙ   rÔ   rÕ   r   ÚShareableListrH   Úshmr    rÜ  rÇ  )r/   r`  r    Úslrœ   r   r   r   rÞ  X  s   

€þÿ
ýùz!SharedMemoryManager.ShareableListN)r8   r:   r;   r<   rË  rø   r0   rÊ  rà   rÆ  rÞ  r   r   r   r   r   #  s    	rI  r_  )UÚ__all__r…   rr   rõ   r   Úqueueru  r�  rÐ  r   rÄ   r   rÙ  r	   Úcontextr
   r   r   r   r   r   r   r   ÚImportErrorÚ	HAS_SHMEMrU   r   r  Ú
view_typesr&   r)   Ú	view_typer‰  r   rH   rA   r–   rP   rX   rZ   r[   rÌ   rv   rw   ÚXmlListenerÚ	XmlClientrm   r   rÆ   r"  r   rE  rR  r  rS  rV  ra  rb  ri  ro  r{  r}  r†  rŽ  r’  r£  r§  r  r«  ÚBasePoolProxyr¬  r   r¶  ry   rs   r¸  r¹  rº  r»  r¼  r½  rÇ   r¾  rË  r   r   r   r   r   Ú<module>   sÎ   
ÿ


  P

þ	 w
 4
ÿ


	ÿ

û

ÿ%-­