§
    Ètºf6÷  ã                   óˆ
  — 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mZ ddlm	Z
 ddlmZ ddlmZmZ ddlmZmZmZ ddlmZmZ dd	lmZmZmZ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'm(Z( ddl)m*Z* ddl+m,Z,m-Z-m.Z.m/Z/ ddl0m1Z1  G d„ de-j2        ¦  «        Z3 G d„ de-j4        ¦  «        Z5 eej6        ¦  «         G d„ d¦  «        ¦   «         Z7 G d„ d¦  «        Z8d„ Z9 G d„ d¦  «        Z: G d„ de#¦  «        Z;d�d„Z< G d „ d!e-j=        ¦  «        Z> G d"„ d#e-j=        ¦  «        Z? G d$„ d%e-j@        ¦  «        ZA G d&„ d'e-jB        ¦  «        ZC e-jD        eAeC¦  «          G d(„ d)e-j@        ¦  «        ZEd*„ ZF e-jG        eEeF¦  «          G d+„ d,e-j=        ¦  «        ZH G d-„ d.e-jI        ¦  «        ZJ G d/„ d0e-j=        ¦  «        ZK G d1„ d2e-jI        ¦  «        ZL G d3„ d4e-jM        ¦  «        ZN e-jD        eLeN¦  «          G d5„ d6e-jM        ¦  «        ZO e-jD        eJeO¦  «          G d7„ d8e-j=        ¦  «        ZP G d9„ d:e-j=        ¦  «        ZQ G d;„ d<e-j=        ¦  «        ZR G d=„ d>e-j=        ¦  «        ZS G d?„ d@e-j@        e-jB        ¦  «        ZT e-jD        eTeT¦  «          G dA„ dBe-j@        e-jB        ¦  «        ZU e-jD        eUeU¦  «          G dC„ dDe-jI        e-jM        ¦  «        ZV e-jD        eVeV¦  «          G dE„ dFe-jW        ¦  «        ZX G dG„ dHe-jW        ¦  «        ZY G dI„ dJe1jZ        ¦  «        Z[ G dK„ dLe-j\        ¦  «        Z] G dM„ dNe1j^        ¦  «        Z_ G dO„ dPe1j^        ¦  «        Z`dQZadabdacdR„ Zd G dS„ dTe-j=        ¦  «        Ze G dU„ dVe-j=        ¦  «        Zf G dW„ dXe1j^        ¦  «        Zg G dY„ dZe.jh        ¦  «        Zi G d[„ d\e.jj        ¦  «        Zk G d]„ d^e-j=        ¦  «        Zl e-jD        eiek¦  «          G d_„ d`e1j^        ¦  «        Zm G da„ dben¦  «        Zo G dc„ dde-j@        ¦  «        Zp G de„ dfe-j=        ¦  «        Zq G dg„ dhe/jr        ¦  «        Zs ee-jt        ¦  «         G di„ dje-j4        ¦  «        ¦   «         Zu G dk„ dl¦  «        Zv G dm„ dne-j2        ¦  «        Zw G do„ dpev¦  «        Zx G dq„ dre1j^        ¦  «        Zy G ds„ dte1j^        ¦  «        Zz ee-jt        ¦  «         G du„ dv¦  «        ¦   «         Z{ G dw„ dxe1j^        ¦  «        Z| G dy„ dze¦  «        Z} ee}¦  «         G d{„ d|¦  «        ¦   «         Z~ G d}„ d~e1j^        ¦  «        Z G d„ d€e1j^        ¦  «        Z€dS )‚z�
Tests for Perspective Broker module.

TODO: update protocol level tests to use new connection API, leaving
only specific tests for old API.
é    N)Údeque)ÚBytesIO)ÚDict)Ú	InterfaceÚimplementer)ÚcheckersÚcredentialsÚportal)ÚUnauthorizedLoginÚUnhandledCredentials)ÚaddressÚmainÚprotocolÚreactor)ÚDeferredÚgatherResultsÚsucceed)ÚConnectionRefusedError)Ú_FakeConnector)ÚWrappingFactory)ÚfailureÚlog)Ú	iterbytes)ÚjellyÚpbÚpublishÚutil)Úunittestc                   ó   — e Zd Zd„ ZdS )ÚDummyc                 ó4   — t          |t          ¦  «        rdS dS )Nzhello world!zgoodbye, cruel world!)Ú
isinstanceÚDummyPerspective©ÚselfÚusers     úZ/var/www/surfInsights/venv3-11/lib/python3.11/site-packages/twisted/spread/test/test_pb.pyÚview_doNothingzDummy.view_doNothing(   s    € Ý�dÕ,Ñ-Ô-ð 	+Ø!�>à*Ð*ó    N)Ú__name__Ú
__module__Ú__qualname__r(   © r)   r'   r    r    '   s#   € € € € € ð+ð +ð +ð +ð +r)   r    c                   ó   — e Zd ZdZd„ ZdS )r#   zE
    An L{IPerspective} avatar which will be used in some tests.
    c                 ó   — t          ¦   «         S ©N)r    ©r%   s    r'   Úperspective_getDummyViewPointz.DummyPerspective.perspective_getDummyViewPoint4   s   € Ý‰wŒwˆr)   N)r*   r+   r,   Ú__doc__r2   r-   r)   r'   r#   r#   /   s-   € € € € € ðð ðð ð ð ð r)   r#   c                   ó   — e Zd Zd„ ZdS )Ú
DummyRealmc                 óV   — |D ]%}|t           j        u r|t          |¦  «        d„ fc S Œ&d S )Nc                  ó   — d S r0   r-   r-   r)   r'   ú<lambda>z*DummyRealm.requestAvatar.<locals>.<lambda>=   s   € À$€ r)   )r   ÚIPerspectiver#   )r%   ÚavatarIdÚmindÚ
interfacesÚifaces        r'   ÚrequestAvatarzDummyRealm.requestAvatar:   sO   € Øð 	Gð 	GˆEØ�œÐ'Ð'ØÕ.¨xÑ8Ô8¸,¸,ÐFÐFÐFÐFð (ð	Gð 	Gr)   N)r*   r+   r,   r>   r-   r)   r'   r5   r5   8   s(   € € € € € ðGð Gð Gð Gð Gr)   r5   c                   ó*   — e Zd ZdZd„ Zd„ Zd„ Zd„ ZdS )ÚIOPumpz�
    Utility to pump data between clients and servers for protocol testing.

    Perhaps this is a utility worthy of being in protocol.py?
    c                 ó>   — || _         || _        || _        || _        d S r0   )ÚclientÚserverÚclientIOÚserverIO)r%   rB   rC   rD   rE   s        r'   Ú__init__zIOPump.__init__G   s"   € ØˆŒØˆŒØ ˆŒØ ˆŒˆˆr)   c                 óê   — d| _         t          j        ¦   «         dz   }| j         sJ|                      ¦   «         r8t          j        ¦   «         |k    rdS | j         s|                      ¦   «         °4dS dS dS dS )zÃ
        Pump until there is no more input or output or until L{stop} is called.
        This does not run any timers, so don't use it with any code that calls
        reactor.callLater.
        Fé   N)Ú_stopÚtimeÚpump)r%   Útimeouts     r'   ÚflushzIOPump.flushM   sŒ   € ð ˆŒ
Ý”)‘+”+ ‘/ˆØ”*ð 	 §¢¡¤ð 	ÝŒy‰{Œ{˜WÒ$Ð$Ø�ð ”*ð 	 §¢¡¤ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	r)   c                 ó   — d| _         dS )zd
        Stop a running L{flush} operation, even if data remains to be
        transferred.
        TN)rI   r1   s    r'   ÚstopzIOPump.stopZ   s   € ð
 ˆŒ
ˆ
ˆ
r)   c                 óÒ  — | j                              d¦  «         | j                             d¦  «         | j                              ¦   «         }| j                             ¦   «         }| j                              d¦  «         | j                             d¦  «         | j                              ¦   «          | j                             ¦   «          | j        j                             ¦   «          | j        j                             ¦   «          t          |¦  «        D ]}| j         
                    |¦  «         Œt          |¦  «        D ]}| j         
                    |¦  «         Œ|s|rdS dS )zX
        Move data back and forth.

        Returns whether any data was moved.
        r   é   )rD   ÚseekrE   ÚreadÚtruncaterB   Ú	transportÚ_checkProducerrC   r   ÚdataReceived)r%   ÚcDataÚsDataÚbytes       r'   rK   zIOPump.pumpa   sQ  € ð 	Œ×Ò˜1ÑÔÐØŒ×Ò˜1ÑÔÐØ”×"Ò"Ñ$Ô$ˆØ”×"Ò"Ñ$Ô$ˆØŒ×Ò˜1ÑÔÐØŒ×Ò˜1ÑÔÐØŒ×ÒÑ Ô Ð ØŒ×ÒÑ Ô Ð ØŒÔ×,Ò,Ñ.Ô.Ð.ØŒÔ×,Ò,Ñ.Ô.Ð.Ý˜eÑ$Ô$ð 	+ð 	+ˆDØŒK×$Ò$ TÑ*Ô*Ð*Ð*Ý˜eÑ$Ô$ð 	+ð 	+ˆDØŒK×$Ò$ TÑ*Ô*Ð*Ð*Øð 	�Eð 	Ø�1à�1r)   N)r*   r+   r,   r3   rF   rM   rO   rK   r-   r)   r'   r@   r@   @   sZ   € € € € € ðð ð!ð !ð !ðð ð ðð ð ðð ð ð ð r)   r@   c                 ó  ‡— d}‰                      |¦  «        }|                      |¦  «        }t          ¦   «         }t          ¦   «         }|                     t          j        |¦  «        ¦  «         |                     t          j        |¦  «        ¦  «         t          ||||¦  «        }d„ }	ˆfd„}
|                      |	|¦  «         |                      |	|¦  «         |                      |
¦  «         |                     ¦   «          |||fS )al  
    Create a server and a client and connect the two with an
    L{IOPump}.

    @param test: the test case where the client and server will be
        used.
    @type test: L{twisted.trial.unittest.TestCase}

    @param clientFactory: The factory that creates the client object.
    @type clientFactory: L{twisted.spread.pb.PBClientFactory}

    @param serverFactory: The factory that creates the server object.
    @type serverFactory: L{twisted.spread.pb.PBServerFactory}

    @return: a 3-tuple of (client, server, pump)
    @rtype: (L{twisted.spread.pb.Broker}, L{twisted.spread.pb.Broker},
        L{IOPump})
    )ú	127.0.0.1c                 óz   — | j         s3|                      t          j        t          j        ¦  «        ¦  «         d S d S r0   )ÚdisconnectedÚconnectionLostr   ÚFailurer   ÚCONNECTION_DONE)Úbrokers    r'   ÚmaybeDisconnectz/connectServerAndClient.<locals>.maybeDisconnect™   sA   € ØÔ"ð 	IØ×!Ò!¥'¤/µ$Ô2FÑ"GÔ"GÑHÔHÐHÐHÐHð	Ið 	Ir)   c                  ón   •— ‰                       d t          j        t          j        ¦  «        ¬¦  «         d S )N)Ú	connectorÚreason)ÚclientConnectionLostr   r`   r   ra   )ÚclientFactorys   €r'   ÚdisconnectClientFactoryz7connectServerAndClient.<locals>.disconnectClientFactory�   s>   ø€ ð
 	×*Ò*Ø¥7¤?µ4Ô3GÑ#HÔ#Hð 	+ñ 	
ô 	
ð 	
ð 	
ð 	
r)   )ÚbuildProtocolÚStringIOÚmakeConnectionr   ÚFileWrapperr@   Ú
addCleanuprK   )Útestrh   ÚserverFactoryÚaddrÚclientBrokerÚserverBrokerÚclientTransportÚserverTransportrK   rc   ri   s    `         r'   ÚconnectServerAndClientrv   {   s  ø€ ð& €DØ ×.Ò.¨tÑ4Ô4€LØ ×.Ò.¨tÑ4Ô4€Lå‘j”j€OÝ‘j”j€Oà×Ò¥Ô 4°_Ñ EÔ EÑFÔFÐFØ×Ò¥Ô 4°_Ñ EÔ EÑFÔFÐFÝ�, ¨o¸ÑOÔO€DðIð Ið Ið
ð 
ð 
ð 
ð 
ð 	‡O‚O�O \Ñ2Ô2Ð2Ø‡O‚O�O \Ñ2Ô2Ð2Ø‡O‚OÐ+Ñ,Ô,Ð,à‡I‚I�K„K€KØ˜ tÐ+Ð+r)   c                   ó$   — e Zd ZdZd„ Zd„ Zd„ ZdS )Ú_ReconnectingFakeConnectorStatezä
    Manages connection notifications for a
    L{_ReconnectingFakeConnector} instance.

    @ivar notifications: pending L{Deferreds} that will fire when the
        L{_ReconnectingFakeConnector}'s connect method is called
    c                 ó,   — t          ¦   «         | _        d S r0   )r   Únotificationsr1   s    r'   rF   z(_ReconnectingFakeConnectorState.__init__·   s   € Ý"™WœWˆÔÐÐr)   c                 óV   — t          ¦   «         }| j                             |¦  «         |S )zâ
        Connection notification.

        @return: A L{Deferred} that fires when this instance's
            L{twisted.internet.interfaces.IConnector.connect} method
            is called.
        @rtype: L{Deferred}
        )r   rz   Ú
appendleft)r%   Únotifiers     r'   ÚnotifyOnConnectz/_ReconnectingFakeConnectorState.notifyOnConnectº   s)   € õ ‘:”:ˆØÔ×%Ò% hÑ/Ô/Ð/Øˆr)   c                 ó~   — | j         r5| j                              ¦   «                              | ¦  «         | j         °3dS dS )z1
        Fire all pending notifications.
        N)rz   ÚpopÚcallbackr1   s    r'   Ú	notifyAllz)_ReconnectingFakeConnectorState.notifyAllÇ   sS   € ð Ô ð 	4ØÔ×"Ò"Ñ$Ô$×-Ò-¨dÑ3Ô3Ð3ð Ô ð 	4ð 	4ð 	4ð 	4ð 	4r)   N)r*   r+   r,   r3   rF   r~   r‚   r-   r)   r'   rx   rx   ®   sK   € € € € € ðð ð%ð %ð %ðð ð ð4ð 4ð 4ð 4ð 4r)   rx   c                   ó,   ‡ — e Zd ZdZˆ fd„Zˆ fd„Zˆ xZS )Ú_ReconnectingFakeConnectorzc
    A fake L{IConnector} that can fire L{Deferred}s when its
    C{connect} method is called.
    c                 óX   •— t          ¦   «                              |¦  «         || _        dS )a  
        @param address: An L{IAddress} provider that represents this
            connector's destination.
        @type address: An L{IAddress} provider.

        @param state: The state instance
        @type state: L{_ReconnectingFakeConnectorState}
        N)ÚsuperrF   Ú_state)r%   r   ÚstateÚ	__class__s      €r'   rF   z#_ReconnectingFakeConnector.__init__Õ   s(   ø€ õ 	‰Œ×Ò˜Ñ!Ô!Ð!ØˆŒˆˆr)   c                 óz   •— t          ¦   «                              ¦   «          | j                             ¦   «          dS )zM
        A C{connect} implementation that calls C{reconnectCallback}
        N)r†   Úconnectr‡   r‚   )r%   r‰   s    €r'   r‹   z"_ReconnectingFakeConnector.connectá   s3   ø€ õ 	‰Œ�ŠÑÔÐØŒ×ÒÑÔÐÐÐr)   )r*   r+   r,   r3   rF   r‹   Ú__classcell__)r‰   s   @r'   r„   r„   Ï   s[   ø€ € € € € ðð ð

ð 
ð 
ð 
ð 
ð ð  ð  ð  ð  ð  ð  ð  ð  r)   r„   c                 óä   — |pt          ¦   «         }t          j        d¬¦  «        }t          j        t          j        ||g¦  «        ¦  «        }t          j        ¦   «         }t          | ||¦  «        S )zº
    Connect a client and server L{Broker} together with an L{IOPump}

    @param realm: realm to use, defaulting to a L{DummyRealm}

    @returns: a 3-tuple (client, server, pump).
    ó   guest)Úguest)	r5   r   Ú'InMemoryUsernamePasswordDatabaseDontUser   ÚPBServerFactoryr
   ÚPortalÚPBClientFactoryrv   )ro   ÚrealmÚcheckerrp   rh   s        r'   ÚconnectedServerAndClientr–   é   sc   € ð Ð!•Z‘\”\€EÝÔ>ÀXÐNÑNÔN€GÝÔ&¥v¤}°U¸W¸IÑ'FÔ'FÑGÔG€MÝÔ&Ñ(Ô(€MÝ! $¨°}ÑEÔEÐEr)   c                   ó   — e Zd Zd„ Zd„ ZdS )ÚSimpleRemotec                 ó   — || _         |dz   S ©NrQ   )Úarg©r%   r›   s     r'   Úremote_thunkzSimpleRemote.remote_thunkù   ó   € ØˆŒØ�Q‰wˆr)   c                 ó   — t          ¦   «         ‚r0   )Ú	Exceptionrœ   s     r'   Úremote_knuthzSimpleRemote.remote_knuthý   s   € Ý‰kŒkÐr)   N)r*   r+   r,   r�   r¡   r-   r)   r'   r˜   r˜   ø   s2   € € € € € ðð ð ðð ð ð ð r)   r˜   c                   ó   — e Zd Zd„ ZdS )ÚNestedRemotec                 ó   — t          ¦   «         S r0   )r˜   r1   s    r'   Úremote_getSimplezNestedRemote.remote_getSimple  s   € Ý‰~Œ~Ðr)   N)r*   r+   r,   r¥   r-   r)   r'   r£   r£     s#   € € € € € ðð ð ð ð r)   r£   c                   ó   — e Zd Zd„ ZdS )Ú
SimpleCopyc                 ó6   — d| _         ddi| _        dg| _        d S ©NrQ   ÚHelloÚWorldro   ©ÚxÚyÚzr1   s    r'   rF   zSimpleCopy.__init__  ó"   € ØˆŒØ˜7Ð#ˆŒØ�ˆŒˆˆr)   N©r*   r+   r,   rF   r-   r)   r'   r§   r§     ó#   € € € € € ðð ð ð ð r)   r§   c                   ó   — e Zd ZdS )ÚSimpleLocalCopyN©r*   r+   r,   r-   r)   r'   r´   r´     ó   € € € € € Ø€Dr)   r´   c                   ó8   — e Zd ZU dZi Zeed f         ed<   d„ ZdS )ÚSimpleFactoryCopyz]
    @cvar allIDs: hold every created instances of this class.
    @type allIDs: C{dict}
    ÚallIDsc                 ó2   — || _         | t          j        |<   d S r0   )Úidr¸   r¹   )r%   r»   s     r'   rF   zSimpleFactoryCopy.__init__  s   € ØˆŒØ'+ÕÔ  Ñ$Ð$Ð$r)   N)	r*   r+   r,   r3   r¹   r   ÚintÚ__annotations__rF   r-   r)   r'   r¸   r¸     sL   € € € € € € ðð ð
 .0€FˆD�Ð)Ð)Ô*Ð/Ð/Ñ/ð,ð ,ð ,ð ,ð ,r)   r¸   c                 ó  — |                       dd¦  «        }|€t          dt          | ¦  «        › �¦  «        ‚|t          j        vrt          dt          j        › �¦  «        ‚t          j        |         }|st          d¦  «        ‚|S )zl
    Factory of L{SimpleFactoryCopy}, getting a created instance given the
    C{id} found in C{state}.
    r»   Nz&factory copy state has no 'id' member zfactory class has no ID: z&factory method found no object with id)ÚgetÚRuntimeErrorÚreprr¸   r¹   )rˆ   ÚstateIdÚinsts      r'   ÚcreateFactoryCopyrÄ   !  s�   € ð
 �iŠi˜˜dÑ#Ô#€GØ€ÝÐQÅDÈÁKÄKÐQÐQÑRÔRÐRØÕ'Ô.Ð.Ð.ÝÐQÕ7HÔ7OÐQÐQÑRÔRÐRÝÔ# GÔ,€DØð EÝÐCÑDÔDÐDØ€Kr)   c                   ó   — e Zd Zd„ Zd„ ZdS )Ú
NestedCopyc                 ó   — t          ¦   «         S r0   )r§   r1   s    r'   Úremote_getCopyzNestedCopy.remote_getCopy5  s   € Ý‰|Œ|Ðr)   c                 ó    — t          |¦  «        S r0   )r¸   )r%   Úvalues     r'   Úremote_getFactoryzNestedCopy.remote_getFactory8  s   € Ý  Ñ'Ô'Ð'r)   N)r*   r+   r,   rÈ   rË   r-   r)   r'   rÆ   rÆ   4  s2   € € € € € ðð ð ð(ð (ð (ð (ð (r)   rÆ   c                   ó   — e Zd Zd„ ZdS )ÚSimpleCachec                 ó6   — d| _         ddi| _        dg| _        d S r©   r¬   r1   s    r'   Ú	__init___zSimpleCache.__init___=  r°   r)   N)r*   r+   r,   rÏ   r-   r)   r'   rÍ   rÍ   <  r²   r)   rÍ   c                   ó   — e Zd Zd„ Zd„ ZdS )ÚNestedComplicatedCachec                 ó,   — t          ¦   «         | _        d S r0   )ÚVeryVeryComplicatedCacheableÚcr1   s    r'   rF   zNestedComplicatedCache.__init__D  s   € Ý-Ñ/Ô/ˆŒˆˆr)   c                 ó   — | j         S r0   )rÔ   r1   s    r'   Úremote_getCachez&NestedComplicatedCache.remote_getCacheG  s	   € ØŒvˆr)   N)r*   r+   r,   rF   rÖ   r-   r)   r'   rÑ   rÑ   C  s2   € € € € € ð0ð 0ð 0ðð ð ð ð r)   rÑ   c                   ó&   — e Zd Zd„ Zd„ Zd„ Zd„ ZdS )rÓ   c                 ó0   — d| _         d| _        d| _        d S )NrQ   é   é   ©r­   r®   Úfoor1   s    r'   rF   z%VeryVeryComplicatedCacheable.__init__L  s   € ØˆŒØˆŒØˆŒˆˆr)   c                 óJ   — d| _         | j                             dd¦  «         d S )Né   rÜ   )rÜ   ÚobserverÚ
callRemoter1   s    r'   ÚsetFoo4z$VeryVeryComplicatedCacheable.setFoo4Q  s'   € ØˆŒØŒ× Ò  ¨Ñ*Ô*Ð*Ð*Ð*r)   c                 ó:   — || _         | j        | j        | j        dœS )NrÛ   )rß   r­   r®   rÜ   ©r%   Úperspectiverß   s      r'   ÚgetStateToCacheAndObserveForz9VeryVeryComplicatedCacheable.getStateToCacheAndObserveForU  s   € Ø ˆŒØ”V $¤&°´Ð:Ð:Ð:r)   c                 ó€   — t          j        d¦  «         |                     d¦  «         || j        k    r	d | _        d S d S )Nzstopped observingÚend)r   Úmsgrà   rß   rã   s      r'   ÚstoppedObservingz-VeryVeryComplicatedCacheable.stoppedObservingY  sG   € ÝŒÐ#Ñ$Ô$Ð$Ø×Ò˜EÑ"Ô"Ð"Ø�t”}Ò$Ð$Ø ˆDŒMˆMˆMð %Ð$r)   N)r*   r+   r,   rF   rá   rå   ré   r-   r)   r'   rÓ   rÓ   K  sP   € € € € € ðð ð ð
+ð +ð +ð;ð ;ð ;ð!ð !ð !ð !ð !r)   rÓ   c                   ó   — e Zd Zd„ Zd„ ZdS )ÚRatherBaroqueCachec                 ó   — || _         d S r0   ©rÜ   )r%   ÚnewFoos     r'   Úobserve_foozRatherBaroqueCache.observe_fooa  s   € ØˆŒˆˆr)   c                 ó.   — t          j        d¦  «         d S )Nzthe end of things)r   rè   r1   s    r'   Úobserve_endzRatherBaroqueCache.observe_endd  s   € ÝŒÐ#Ñ$Ô$Ð$Ð$Ð$r)   N)r*   r+   r,   rï   rñ   r-   r)   r'   rë   rë   `  s2   € € € € € ðð ð ð%ð %ð %ð %ð %r)   rë   c                   ó&   — e Zd Zd„ Zd„ Zd„ Zd„ ZdS )ÚSimpleLocalCachec                 ó:   — | j                              |¦  «         d S r0   )Ú__dict__Úupdate)r%   rˆ   s     r'   ÚsetCopyableStatez!SimpleLocalCache.setCopyableStatel  s   € ØŒ×Ò˜UÑ#Ô#Ð#Ð#Ð#r)   c                 ó   — | j         S r0   )Úcheckr1   s    r'   ÚcheckMethodzSimpleLocalCache.checkMethodo  ó
   € ØŒzÐr)   c                 ó   — | S r0   r-   r1   s    r'   Ú	checkSelfzSimpleLocalCache.checkSelfr  s   € Øˆr)   c                 ó   — dS rš   r-   r1   s    r'   rù   zSimpleLocalCache.checku  s   € Øˆqr)   N)r*   r+   r,   r÷   rú   rý   rù   r-   r)   r'   ró   ró   k  sP   € € € € € ð$ð $ð $ðð ð ðð ð ðð ð ð ð r)   ró   c                   ó    — e Zd Zd„ Zd„ Zd„ ZdS )ÚNestedCachec                 ó,   — t          ¦   «         | _        d S r0   )rÍ   r­   r1   s    r'   rF   zNestedCache.__init__}  s   € Ý‘”ˆŒˆˆr)   c                 ó   — | j         | j         gS r0   ©r­   r1   s    r'   rÖ   zNestedCache.remote_getCache€  s   € Ø”˜œÐÐr)   c                 ó   — | j         |u S r0   r  ©r%   Úcaches     r'   Úremote_putCachezNestedCache.remote_putCacheƒ  s   € ØŒv˜ˆÐr)   N)r*   r+   r,   rF   rÖ   r  r-   r)   r'   r   r   |  sA   € € € € € ðð ð ð ð  ð  ðð ð ð ð r)   r   c                   ó&   — e Zd Zd„ Zd„ Zd„ Zd„ ZdS )Ú
Observablec                 ó   — g | _         d S r0   )Ú	observersr1   s    r'   rF   zObservable.__init__ˆ  s   € ØˆŒˆˆr)   c                 ó:   — | j                              |¦  «         d S r0   )r  Úappend©r%   Úobss     r'   Úremote_observezObservable.remote_observe‹  ó   € ØŒ×Ò˜cÑ"Ô"Ð"Ð"Ð"r)   c                 ó:   — | j                              |¦  «         d S r0   )r  Úremover  s     r'   Úremote_unobservezObservable.remote_unobserveŽ  r  r)   c                 óH   — | j         D ]}|                     d| |¦  «         Œd S )NÚnotify)r  rà   )r%   Úobjrß   s      r'   r  zObservable.notify‘  s8   € Øœð 	5ð 	5ˆHØ×Ò ¨$°Ñ4Ô4Ð4Ð4ð	5ð 	5r)   N)r*   r+   r,   rF   r  r  r  r-   r)   r'   r	  r	  ‡  sP   € € € € € ðð ð ð#ð #ð #ð#ð #ð #ð5ð 5ð 5ð 5ð 5r)   r	  c                   ó&   — e Zd Zd„ Zd„ Zd„ Zd„ ZdS )ÚDeferredRemotec                 ó   — d| _         d S )Nr   ©Úrunr1   s    r'   rF   zDeferredRemote.__init__—  s   € ØˆŒˆˆr)   c                 ó   — || _         |dz   S rš   r  rœ   s     r'   ÚrunMezDeferredRemote.runMeš  rž   r)   c                 ó   — J d¦   «         ‚)Nr   zshouldn't have been run!r-   rœ   s     r'   Ú	dontRunMezDeferredRemote.dontRunMež  s   € Ø,Ð,Ñ,Ô,Ð,r)   c                 óp   — t          ¦   «         }|                     | j        | j        ¦  «         || _        |S )zo
        Return a L{Deferred} to be fired on client side. When fired,
        C{self.runMe} is called.
        )r   ÚaddCallbacksr  r   Úd)r%   r#  s     r'   Úremote_doItLaterzDeferredRemote.remote_doItLater¡  s1   € õ
 ‰JŒJˆØ	�Š�t”z 4¤>Ñ2Ô2Ð2ØˆŒØˆr)   N)r*   r+   r,   rF   r  r   r$  r-   r)   r'   r  r  –  sP   € € € € € ðð ð ðð ð ð-ð -ð -ðð ð ð ð r)   r  c                   ó   — e Zd ZdZdZd„ ZdS )ÚObserverr   Nc                 ó^   — || _         | j        dz   | _        |                     d| ¦  «         d S )NrQ   Ú	unobserve)r  Únotifiedrà   )r%   Úotherr  s      r'   Úremote_notifyzObserver.remote_notify°  s3   € ØˆŒØœ¨Ñ)ˆŒØ×Ò˜ dÑ+Ô+Ð+Ð+Ð+r)   )r*   r+   r,   r)  r  r+  r-   r)   r'   r&  r&  ¬  s-   € € € € € Ø€HØ
€Cð,ð ,ð ,ð ,ð ,r)   r&  c                   ó   — e Zd Zd„ ZdS )ÚNewStyleCopyc                 ó   — || _         d S r0   )Ús)r%   r/  s     r'   rF   zNewStyleCopy.__init__·  s   € ØˆŒˆˆr)   Nr±   r-   r)   r'   r-  r-  ¶  s#   € € € € € ðð ð ð ð r)   r-  c                   ó&   — e Zd ZdZdZdZd„ Zd„ ZdS )ÚNewStyleCopy2r   rQ   c                 ór   — t           xj        dz  c_        t                               | ¦  «        }d|_        |S )NrQ   rÙ   )r1  Ú	allocatedÚobjectÚ__new__rÊ   )r%   rÃ   s     r'   r5  zNewStyleCopy2.__new__Ã  s3   € ÝÐÔ 1Ñ$ÐÔÝ�~Š~˜dÑ#Ô#ˆØˆŒ
Øˆr)   c                 ó0   — t           xj        dz  c_        d S rš   )r1  Úinitializedr1   s    r'   rF   zNewStyleCopy2.__init__É  s   € ÝÐ!Ô! QÑ&Ð!Ô!Ð!Ð!r)   N)r*   r+   r,   r3  r7  rÊ   r5  rF   r-   r)   r'   r1  r1  ¾  sA   € € € € € Ø€IØ€KØ€Eðð ð ð'ð 'ð 'ð 'ð 'r)   r1  c                   ó   — e Zd Zd„ ZdS )ÚNewStyleCacheCopyc                 ó   — | j         S r0   )rõ   rã   s      r'   rå   z.NewStyleCacheCopy.getStateToCacheAndObserveForÑ  s
   € ØŒ}Ðr)   N)r*   r+   r,   rå   r-   r)   r'   r9  r9  Ð  s#   € € € € € ðð ð ð ð r)   r9  c                   ó   — e Zd Zd„ Zd„ ZdS )ÚEchoerc                 ó   — |S r0   r-   ©r%   Ústs     r'   Úremote_echozEchoer.remote_echoÙ  s   € Øˆ	r)   c                 ó
   — ||fS r0   r-   )r%   r?  Úkws      r'   Úremote_echoWithKeywordszEchoer.remote_echoWithKeywordsÜ  s   € Ø�Bˆxˆr)   N)r*   r+   r,   r@  rC  r-   r)   r'   r<  r<  Ø  s2   € € € € € ðð ð ðð ð ð ð r)   r<  c                   ó   — e Zd Zd„ Zd„ ZdS )ÚCachedReturnerc                 ó   — || _         d S r0   ©r  r  s     r'   rF   zCachedReturner.__init__á  s   € ØˆŒ
ˆ
ˆ
r)   c                 ó   — | j         S r0   rG  r>  s     r'   Úremote_giveMeCachez!CachedReturner.remote_giveMeCacheä  rû   r)   N)r*   r+   r,   rF   rI  r-   r)   r'   rE  rE  à  s2   € € € € € ðð ð ðð ð ð ð r)   rE  c                   ó,   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ ZdS )ÚNewStyleTestsc                 ó  — t          j        t          ¦   «         ¦  «        | _        t          j        ¦   «         }t          | || j        ¬¦  «        \  }| _        | _        |                      | 	                    ¦   «         ¦  «        | _
        dS )zY
        Create a pb server using L{Echoer} protocol and connect a client to it.
        )ro   rh   rp   N)r   r‘   r<  rp   r“   rv   rC   rK   ÚsuccessResultOfÚgetRootObjectÚref)r%   rh   rB   s      r'   ÚsetUpzNewStyleTests.setUpé  sy   € õ  Ô/µ±´Ñ9Ô9ˆÔÝÔ*Ñ,Ô,ˆÝ)?Ø ]À$ÔBTð*
ñ *
ô *
Ñ&ˆ�”˜TœYð ×'Ò'¨×(CÒ(CÑ(EÔ(EÑFÔFˆŒˆˆr)   c                 óN   — dt           _        dt           _        dt           _        dS )zp
        Close client and server connections, reset values of L{NewStyleCopy2}
        class variables.
        r   rQ   N)r1  r3  r7  rÊ   r1   s    r'   ÚtearDownzNewStyleTests.tearDownô  s"   € ð
 #$�ÔØ$%�Ô!Ø�ÔÐÐr)   c                 óÆ   ‡ ‡— t          d¦  «        Š‰ j                             d‰¦  «        }‰ j                             ¦   «          ˆˆ fd„}|                     |¦  «         |S )zY
        Create a new style object, send it over the wire, and check the result.
        rÊ   Úechoc                 ó¢   •— ‰                      | t          ¦  «         ‰                     | j        d¦  «         ‰                     | ‰u ¦  «         d S )NrÊ   )ÚassertIsInstancer-  ÚassertEqualr/  ÚassertFalse©ÚresÚorigr%   s    €€r'   Úcbz'NewStyleTests.test_newStyle.<locals>.cb  sO   ø€ Ø×!Ò! #¥|Ñ4Ô4Ð4Ø×Ò˜SœU GÑ,Ô,Ð,Ø×Ò˜S D˜[Ñ)Ô)Ð)Ð)Ð)r)   ©r-  rO  rà   rK   rM   ÚaddCallback©r%   r#  r\  r[  s   `  @r'   Útest_newStylezNewStyleTests.test_newStyleý  ss   øø€ õ ˜GÑ$Ô$ˆØŒH×Ò ¨Ñ-Ô-ˆØŒ	�ŠÑÔÐð	*ð 	*ð 	*ð 	*ð 	*ð 	*ð
 	
�Š�bÑÔÐØˆr)   c                 óD  ‡ ‡— t          ¦   «         Š‰                      t           j        d¦  «         ‰                      t           j        d¦  «         ‰ j                             d‰¦  «        }‰ j                             ¦   «          ˆˆ fd„}|                     |¦  «         |S )zN
        Send a new style object and check the number of allocations.
        rQ   rT  c                 ó   •— ‰                      | t          ¦  «         ‰                     | j        d¦  «         ‰                     t          j        d¦  «         ‰                     t          j        d¦  «         ‰                     | ‰¦  «         d S )NrÙ   rÚ   rQ   )rV  r1  rW  rÊ   r3  r7  ÚassertIsNotrY  s    €€r'   r\  z$NewStyleTests.test_alloc.<locals>.cb  s   ø€ à×!Ò! #¥}Ñ5Ô5Ð5Ø×Ò˜SœY¨Ñ*Ô*Ð*Ø×Ò�]Ô4°aÑ8Ô8Ð8Ø×Ò�]Ô6¸Ñ:Ô:Ð:Ø×Ò˜S $Ñ'Ô'Ð'Ð'Ð'r)   )	r1  rW  r3  r7  rO  rà   rK   rM   r^  r_  s   `  @r'   Ú
test_alloczNewStyleTests.test_alloc  s¡   øø€ õ ‰ŒˆØ×Ò�Ô0°!Ñ4Ô4Ð4Ø×Ò�Ô2°AÑ6Ô6Ð6ØŒH×Ò ¨Ñ-Ô-ˆØŒ	�ŠÑÔÐð	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	
�Š�bÑÔÐØˆr)   c                 óÌ   ‡ ‡— t          d¦  «        Š‰ j                             d‰dd¬¦  «        }‰ j                             ¦   «          ˆˆ fd„}|                     |¦  «         |S )zo
        Create a new style object with keywords,
        send it over the wire, and check the result.
        Úvalue1ÚechoWithKeywordsÚoneÚtwo©Úkeyword1Úkeyword2c                 óz  •— ‰                      | t          ¦  «         ‰                      | d         t          ¦  «         ‰                      | d         t          ¦  «         ‰                     | d         j        d¦  «         ‰                     | d         ‰¦  «         ‰                     | d         dddœ¦  «         d S )Nr   rQ   rf  rh  ri  rj  )rV  Útupler-  ÚdictrW  r/  rc  rY  s    €€r'   r\  z3NewStyleTests.test_newStyleWithKeywords.<locals>.cb.  s«   ø€ Ø×!Ò! #¥uÑ-Ô-Ð-Ø×!Ò! # a¤&­,Ñ7Ô7Ð7Ø×!Ò! # a¤&­$Ñ/Ô/Ð/Ø×Ò˜S œVœX xÑ0Ô0Ð0Ø×Ò˜S œV TÑ*Ô*Ð*Ø×Ò˜S œV°%ÀUÐ%KÐ%KÑLÔLÐLÐLÐLr)   r]  r_  s   `  @r'   Útest_newStyleWithKeywordsz'NewStyleTests.test_newStyleWithKeywords#  s‰   øø€ õ
 ˜HÑ%Ô%ˆØŒH×ÒØ ¨u¸uð  ñ 
ô 
ˆð 	Œ	�ŠÑÔÐð	Mð 	Mð 	Mð 	Mð 	Mð 	Mð 	
�Š�bÑÔÐØˆr)   N)r*   r+   r,   rP  rR  r`  rd  rp  r-   r)   r'   rK  rK  è  sb   € € € € € ð	Gð 	Gð 	Gð ð  ð  ðð ð ð ð ð ð,ð ð ð ð r)   rK  c                   ó"   — e Zd ZdZdZd„ Zd„ ZdS )ÚConnectionNotifyServerFactoryaj  
    A server factory which stores the last connection and fires a
    L{Deferred} on connection made. This factory can handle only one
    client connection.

    @ivar protocolInstance: the last protocol instance.
    @type protocolInstance: C{pb.Broker}

    @ivar connectionMade: the deferred fired upon connection.
    @type connectionMade: C{Deferred}
    Nc                 ól   — t           j                             | |¦  «         t          ¦   «         | _        dS )z)
        Initialize the factory.
        N)r   r‘   rF   r   ÚconnectionMade)r%   Úroots     r'   rF   z&ConnectionNotifyServerFactory.__init__I  s/   € õ 	Ô×#Ò# D¨$Ñ/Ô/Ð/Ý&™jœjˆÔÐÐr)   c                 ód   — || _         | j        dc}| _        |�|                     d¦  «         dS dS )zF
        Store the protocol and fire the connection deferred.
        N)ÚprotocolInstancert  r�   )r%   r   r#  s      r'   ÚclientConnectionMadez2ConnectionNotifyServerFactory.clientConnectionMadeP  sB   € ð !)ˆÔØ!%Ô!4°dÐˆˆ4ÔØˆ=Ø�JŠJ�tÑÔÐÐÐð ˆ=r)   )r*   r+   r,   r3   rw  rF   rx  r-   r)   r'   rr  rr  :  sD   € € € € € ð
ð 
ð Ðð)ð )ð )ðð ð ð ð r)   rr  c                   ó    — e Zd Zd„ Zd„ Zd„ ZdS )ÚNewStyleCachedTestsc                 óÚ  ‡ — t          ¦   «         ‰ _        d‰ j        _        t          j        dt          t          ‰ j        ¦  «        ¦  «        ¦  «        ‰ _        t          j	        ¦   «         }t          j
        d‰ j                             ¦   «         j        |¦  «         ˆ fd„}|                     ¦   «                              |¦  «        }‰ j        j        j        }t#          ||g¦  «        S )zi
        Create a pb server using L{CachedReturner} protocol and connect a
        client to it.
        rÊ   r   Ú	localhostc                 ó   •— | ‰_         d S r0   )rO  )rO  r%   s    €r'   ÚgotRootz*NewStyleCachedTests.setUp.<locals>.gotRooth  s   ø€ ØˆDŒHˆHˆHr)   )r9  r[  r/  r   Ú	listenTCPrr  rE  rC   r   r“   Ú
connectTCPÚgetHostÚportrN  r^  Úfactoryrt  r   )r%   rh   r~  Úd1Úd2s   `    r'   rP  zNewStyleCachedTests.setUp[  sÖ   ø€ õ
 &Ñ'Ô'ˆŒ	ØˆŒ	ŒÝÔ'ØÕ,­^¸D¼IÑ-FÔ-FÑGÔGñ
ô 
ˆŒõ Ô*Ñ,Ô,ˆÝÔ˜;¨¬×(;Ò(;Ñ(=Ô(=Ô(BÀMÑRÔRÐRð	ð 	ð 	ð 	ð 	ð ×(Ò(Ñ*Ô*×6Ò6°wÑ?Ô?ˆØŒ[Ô Ô/ˆÝ˜b "˜XÑ&Ô&Ð&r)   c                 óÊ   — | j         j        j        j                             ¦   «          | j        j        j                             ¦   «          | j                              ¦   «         S )z6
        Close client and server connections.
        )rC   rƒ  rw  rU   ÚloseConnectionrO  rb   ÚstopListeningr1   s    r'   rR  zNewStyleCachedTests.tearDowno  sN   € ð 	ŒÔÔ,Ô6×EÒEÑGÔGÐGØŒŒÔ!×0Ò0Ñ2Ô2Ð2ØŒ{×(Ò(Ñ*Ô*Ð*r)   c                 óª   ‡ — ‰ j                              d‰ j        ¦  «        }ˆ fd„}|                     |d¦  «         |                     |d¦  «         |S )zÍ
        A new-style cacheable object can be retrieved and re-retrieved over a
        single connection.  The value of an attribute of the cacheable can be
        accessed on the receiving side.
        ÚgiveMeCachec                 óü   •— ‰                      | t          ¦  «         ‰                     d| j        ¦  «         ‰                     ‰j        | ¦  «         |r'| ‰_        ‰j                             d‰j        ¦  «        S d S )NrÊ   rŠ  )	rV  r9  rW  r/  rc  r[  rZ  rO  rà   )rZ  Úagainr%   s     €r'   r\  z2NewStyleCachedTests.test_newStyleCache.<locals>.cb  s‚   ø€ Ø×!Ò! #Õ'8Ñ9Ô9Ð9Ø×Ò˜W c¤eÑ,Ô,Ð,à×Ò˜TœY¨Ñ,Ô,Ð,àð Eà�”ð ”x×*Ò*¨=¸$¼)ÑDÔDÐDðEð Er)   TF)rO  rà   r[  r^  )r%   r#  r\  s   `  r'   Útest_newStyleCachez&NewStyleCachedTests.test_newStyleCachew  sk   ø€ ð ŒH×Ò ¨t¬yÑ9Ô9ˆð	Eð 	Eð 	Eð 	Eð 	Eð 	
�Š�b˜$ÑÔÐØ	�Š�b˜%Ñ Ô Ð Øˆr)   N)r*   r+   r,   rP  rR  r�  r-   r)   r'   rz  rz  Z  sA   € € € € € ð'ð 'ð 'ð(+ð +ð +ðð ð ð ð r)   rz  c                   óx   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ ZdS )ÚBrokerTestsNc                 óR   — 	 t          j        d¦  «         d S # t          $ r Y d S w xY w)NúNone-None-TESTING.pub)ÚosÚunlinkÚOSErrorr1   s    r'   rR  zBrokerTests.tearDown”  s@   € ð	åŒIÐ-Ñ.Ô.Ð.Ð.Ð.øÝð 	ð 	ð 	ØˆDˆDð	øøøs   ‚ ˜
&¥&c                 ó6   — |                       d|› �¦  «         d S )Nz&This should cause a return value, not ©Úfail)r%   Úerrors     r'   ÚthunkErrorBadzBrokerTests.thunkErrorBad›  s#   € Ø�	Š	ÐB¸5ÐBÐBÑCÔCÐCÐCÐCr)   c                 ó   — || _         d S r0   )ÚthunkResult©r%   Úresults     r'   ÚthunkResultGoodzBrokerTests.thunkResultGoodž  s   € Ø!ˆÔÐÐr)   c                 ó   — d S r0   r-   )r%   Útbs     r'   ÚthunkErrorGoodzBrokerTests.thunkErrorGood¡  ó   € Øˆr)   c                 ó6   — |                       d|› �¦  «         d S )Nz This should cause an error, not r–  rœ  s     r'   ÚthunkResultBadzBrokerTests.thunkResultBad¤  s#   € Ø�	Š	Ð=°VÐ=Ð=Ñ>Ô>Ð>Ð>Ð>r)   c                 ór  — t          | ¬¦  «        \  }}} G d„ dt          j        ¦  «        } G d„ dt          j        ¦  «        }|                     d |¦   «         ¦  «         |                     d¦  «        } |¦   «         } |¦   «         }|                     d||¦  «         |                     ¦   «          |                     ¦   «          |                     ¦   «          |                      |j        |d¦  «         |  	                    | 
                    d¦  «        | 
                    d¦  «        ¦  «         d S )	N©ro   c                   ó   — e Zd Zd„ ZdS )ú%BrokerTests.test_reference.<locals>.Xc                 ó   — || _         d S r0   )Úcaughtrœ   s     r'   Úremote_catchz2BrokerTests.test_reference.<locals>.X.remote_catch«  s   € Ø!�”��r)   N)r*   r+   r,   r«  r-   r)   r'   ÚXr¨  ª  s#   € € € € € ð"ð "ð "ð "ð "r)   r¬  c                   ó   — e Zd Zd„ ZdS )ú%BrokerTests.test_reference.<locals>.Yc                 ó2   — |                      d|¦  «         d S )NÚcatch©rà   ©r%   ÚaÚbs      r'   Úremote_throwz2BrokerTests.test_reference.<locals>.Y.remote_throw¯  s   € Ø—’˜W aÑ(Ô(Ð(Ð(Ð(r)   N)r*   r+   r,   rµ  r-   r)   r'   ÚYr®  ®  s#   € € € € € ð)ð )ð )ð )ð )r)   r¶  r®   ÚthrowzX should have caught Z)r–   r   ÚReferenceableÚsetNameForLocalÚremoteForNamerà   rK   ÚassertIsrª  rW  ÚremoteMethod)	r%   rÔ   r/  rK   r¬  r¶  r®   r­   r¯   s	            r'   Útest_referencezBrokerTests.test_reference§  sC  € Ý-°4Ð8Ñ8Ô8‰
ˆˆ1ˆdð	"ð 	"ð 	"ð 	"ð 	"•Ô ñ 	"ô 	"ð 	"ð	)ð 	)ð 	)ð 	)ð 	)•Ô ñ 	)ô 	)ð 	)ð 	
×Ò˜#˜q˜q™sœsÑ#Ô#Ð#Ø�OŠO˜CÑ Ô ˆØˆA‰CŒCˆØˆA‰CŒCˆØ	�Š�W˜a Ñ#Ô#Ð#Ø�	Š	‰ŒˆØ�	Š	‰ŒˆØ�	Š	‰ŒˆØ�Š�a”h Ð#;Ñ<Ô<Ð<ð 	×Ò˜Ÿš¨Ñ0Ô0°!·.².ÀÑ2IÔ2IÑJÔJÐJÐJÐJr)   c                 óÔ  — t          | ¬¦  «        \  }}}||f||ffD ]Ê\  }}t          ¦   «         }|                     d|¦  «         |                     d¦  «        }d| _        |                     d| j        dz
  ¦  «                             | j        | j        ¦  «         | 	                    ¦   «          | 	                    ¦   «          |  
                    | j        | j        d¦  «         ŒËd S )Nr¦  rÜ   é   ÚthunkrQ   zresult wasn't received.)r–   r˜   r¹  rº  ÚexpectedThunkResultrà   r"  rž  r™  rK   rW  r›  )r%   rÔ   r/  rK   r­   r®   rÜ   Úbars           r'   Útest_resultzBrokerTests.test_result¿  sù   € Ý-°4Ð8Ñ8Ô8‰
ˆˆ1ˆdØ˜�F˜Q ˜F�Nð 	ð 	‰DˆAˆqå‘.”.ˆCØ×Ò˜e SÑ)Ô)Ð)Ø—/’/ %Ñ(Ô(ˆCØ'(ˆDÔ$Ø�NŠN˜7 DÔ$<¸qÑ$@ÑAÔA×NÒNØÔ$ dÔ&8ñô ð ð �IŠI‰KŒKˆKà�IŠI‰KŒKˆKà×ÒØÔ  $Ô":Ð<Uñô ð ð ð	ð 	r)   c                 ó   — || _         d S r0   )ÚnestedRemoterœ  s     r'   ÚrefcountResultzBrokerTests.refcountResultÓ  s   € Ø"ˆÔÐÐr)   c           
      ót  — g }g }t          | ¬¦  «        \  }}}t          ¦   «         }|                     d|¦  «         |                     d¦  «        }t	          t
          j        dz   ¦  «        D ]c}|j        j        s|j        j        r nH| 	                    d¦  «         
                    |j        |j        ¦  «         |                     ¦   «          Œdt
          j        dz
  }	|                      |j        j        d¦  «         |                      t          |¦  «        |	d|	› dt          |¦  «        › �¦  «         d S )	Nr¦  rÜ   é
   Ú	getSimplerQ   ztransport was not closedz	expected z got )r–   r£   r¹  rº  Úranger   ÚMAX_BROKER_REFSrU   Úclosedrà   r"  r  rK   Ú
assertTruerW  Úlen)
r%   ÚlÚerÔ   r/  rK   rÜ   r­   ÚignoÚexpecteds
             r'   Útest_tooManyRefszBrokerTests.test_tooManyRefsÖ  s&  € ØˆØˆÝ-°4Ð8Ñ8Ô8‰
ˆˆ1ˆdÝ‰nŒnˆØ	×Ò˜% Ñ%Ô%Ð%Ø�OŠO˜EÑ"Ô"ˆÝ�"Ô,¨rÑ1Ñ2Ô2ð 	ð 	ˆDØŒ{Ô!ð  Q¤[Ô%7ð Ø�Ø�LŠL˜Ñ%Ô%×2Ò2°1´8¸Q¼XÑFÔFÐFØ�IŠI‰KŒKˆKˆKÝÔ%¨Ñ)ˆØ�Š˜œÔ*Ð,FÑGÔGÐGØ×Ò�˜Q™œ Ð+N°xÐ+NÐ+NÅcÈ!ÁfÄfÐ+NÐ+NÑOÔOÐOÐOÐOr)   c                 ó.  — t          | ¬¦  «        \  }}}t          ¦   «         }|                     d|¦  «         |                     d¦  «        }|                     d¦  «                             | j        | j        ¦  «         |                     ¦   «          |                     ¦   «          |  	                    | j
        j        d¦  «         |  	                    | j
        j        d         d¦  «         |  	                    | j
        j        d         d¦  «         d S )	Nr¦  rÜ   ÚgetCopyrQ   rª   r«   r   ro   )r–   rÆ   r¹  rº  rà   r"  rž  r™  rK   rW  r›  r­   r®   r¯   )r%   rÔ   r/  rK   rÜ   r­   s         r'   Ú	test_copyzBrokerTests.test_copyæ  sî   € Ý-°4Ð8Ñ8Ô8‰
ˆˆ1ˆdÝ‰lŒlˆØ	×Ò˜% Ñ%Ô%Ð%Ø�OŠO˜EÑ"Ô"ˆØ	�Š�YÑÔ×,Ò,¨TÔ-AÀ4ÔCUÑVÔVÐVØ�	Š	‰ŒˆØ�	Š	‰ŒˆØ×Ò˜Ô)Ô+¨QÑ/Ô/Ð/Ø×Ò˜Ô)Ô+¨GÔ4°gÑ>Ô>Ð>Ø×Ò˜Ô)Ô+¨AÔ.°Ñ7Ô7Ð7Ð7Ð7r)   c                 ór  — t          | ¬¦  «        \  }}}t          ¦   «         }t          ¦   «         }|                     d|¦  «         |                     d¦  «        }|                     d|¦  «         |                     ¦   «          |                     d¦  «         |                     ¦   «          |                     ¦   «          |                     d¦  «         |                     ¦   «          |                     ¦   «          |                      |j	        d¦  «         |  
                    |j	        dd¦  «         d S )Nr¦  r³  ÚobserverQ   rÈ  zdidn't notifyznotified too much)r–   r	  r&  r¹  rº  rà   rK   r  ÚassertIsNotNoner  rW  )r%   rÔ   r/  rK   r³  r´  Úras          r'   Útest_observezBrokerTests.test_observeò  sÿ   € Ý-°4Ð8Ñ8Ô8‰
ˆˆ1ˆdõ ‰LŒLˆÝ‰JŒJˆØ	×Ò˜#˜qÑ!Ô!Ð!Ø�_Š_˜SÑ!Ô!ˆØ
�Š�i Ñ#Ô#Ð#Ø�	Š	‰ŒˆØ	�Š�‰ŒˆØ�	Š	‰ŒˆØ�	Š	‰ŒˆØ	�Š�‰ŒˆØ�	Š	‰ŒˆØ�	Š	‰ŒˆØ×Ò˜QœU OÑ4Ô4Ð4Ø×Ò˜œ Ð#6Ñ7Ô7Ð7Ð7Ð7r)   c                 óÊ  — t          | ¬¦  «        \  }}}t          ¦   «         }|                     d|¦  «         |                     d¦  «        }|                     ¦   «          |                     ¦   «          g }|                     d¦  «                             |j        ¦  «         |                     ¦   «          |                     ¦   «          |                      |j	        d¦  «         |j
                             d¦  «         |                      |j	        dd¦  «         |                     ¦   «          |                     ¦   «          |                      |d         dd	¦  «         d S )
Nr¦  r#  Ú	doItLaterzDeferred method run too early.rH   zDeferred method run too late.r   é   zIncorrect result.)r–   r  r¹  rº  rK   rà   r^  r  rX  r  r#  r�   rW  )r%   rÔ   r/  rK   r#  rÐ  Úresultss          r'   Ú
test_deferzBrokerTests.test_defer  s'  € Ý-°4Ð8Ñ8Ô8‰
ˆˆ1ˆdÝÑÔˆØ	×Ò˜#˜qÑ!Ô!Ð!Ø�OŠO˜CÑ Ô ˆØ�	Š	‰ŒˆØ�	Š	‰ŒˆØˆØ	�Š�[Ñ!Ô!×-Ò-¨g¬nÑ=Ô=Ð=Ø�	Š	‰ŒˆØ�	Š	‰ŒˆØ×Ò˜œÐ @ÑAÔAÐAØ	Œ�Š�Q‰ŒˆØ×Ò˜œ Ð#BÑCÔCÐCØ�	Š	‰ŒˆØ�	Š	‰ŒˆØ×Ò˜ œ QÐ(;Ñ<Ô<Ð<Ð<Ð<r)   c                 óœ  — t          | ¬¦  «        \  }}}t          ¦   «         }|                     d|¦  «         |                     d¦  «        }|                     d¦  «                             | j        | j        ¦  «         |                     ¦   «          |                     ¦   «          | j	        j
        }|                      ||j        ¦  «         | `	t          j        dk    rt          j        ¦   «          |                     ¦   «          |                     ¦   «          |                     ¦   «          |                      ||j        ¦  «         d S )Nr¦  rÜ   rÉ  é   )r–   r£   r¹  rº  rà   r"  rÆ  r™  rK   rÅ  ÚluidÚassertInÚlocalObjectsÚsysÚ
hexversionÚgcÚcollectÚassertNotIn)r%   rÔ   r/  rK   rÜ   rÂ  Úrluids          r'   Útest_refcountzBrokerTests.test_refcount  s  € Ý-°4Ð8Ñ8Ô8‰
ˆˆ1ˆdÝ‰nŒnˆØ	×Ò˜% Ñ%Ô%Ð%Ø�oŠo˜eÑ$Ô$ˆØ�Š�{Ñ#Ô#×0Ò0ØÔ Ô!3ñ	
ô 	
ð 	
ð
 	�	Š	‰Œˆà�	Š	‰Œˆð Ô!Ô&ˆØ�Š�e˜Qœ^Ñ,Ô,Ð,ØÐåŒ>˜YÒ&Ð&ÝŒJ‰LŒLˆLà�	Š	‰ŒˆØ�	Š	‰ŒˆØ�	Š	‰ŒˆØ×Ò˜ ¤Ñ/Ô/Ð/Ð/Ð/r)   c                 óò  — t          | ¬¦  «        \  }}}t          ¦   «         }t          ¦   «         }|j        }|                     d|¦  «         |                     d|¦  «         |                     d¦  «        }|                     d¦  «        }g }	|                     d¦  «                             |	j        ¦  «         	                    |	j        ¦  «         |                     d¦  «                             |	j        ¦  «         	                    |	j        ¦  «         g }
|                     d¦  «                             |
j        ¦  «         |                     d¦  «                             |
j        ¦  «         | 
                    ¦   «          |                      |
d         j        d¦  «         |                      |
d         j        d¦  «         |                      |
d         j        d¦  «         |                     ¦   «          | 
                    ¦   «          |                      |
d         j        d	¦  «         |                      t!          |	¦  «        d¦  «         |	d         d         }|                      |                     ¦   «         j        |d
¦  «         |                      |                     ¦   «         |d¦  «         g }|                     d|¦  «                             |j        ¦  «         | 
                    ¦   «          |                      |d         ¦  «         |                      |                     d¦  «        |                     d¦  «        ¦  «         |j        }|
d         j        }|                      ||j        d¦  «         ~	~| 
                    ¦   «          ~
~| 
                    ¦   «          t4          j        dk    rt9          j        ¦   «          | 
                    ¦   «          |                      ||j        d¦  «         |                      ||j        d¦  «         |                      ||j        d¦  «         |                      ||j        d¦  «         |                       |j!        d¦  «         d S )Nr¦  r  ÚxxxÚgetCacher   rQ   rÙ   rÚ   rÞ   zpotential refcounting issuez!other potential refcounting issueÚputCachezremote cache doesn't have itrâ  zServer still had it after GCzClient still had it after GCz!Server still had complex after GCz!Client still had complex after GCzobserver was not removed)"r–   r   rÑ   rÔ   r¹  rº  rà   r^  r  Ú
addErrbackrM   rW  r­   r®   rÜ   rá   rÎ  ÚassertIdenticalrú   Ú__self__rý   rÍ  r¼  rã  rä  ÚremotelyCachedObjectsræ  rç  rè  ré  rê  ÚlocallyCachedObjectsÚassertIsNonerß   )r%   rÔ   r/  rK   r  Úobj2ÚvccÚo2Úo3ÚcollÚcomplexÚcpÚcol2rã  ÚbaroqueLuids                  r'   Ú
test_cachezBrokerTests.test_cache4  sÙ  € Ý-°4Ð8Ñ8Ô8‰
ˆˆ1ˆdÝ‰mŒmˆÝ%Ñ'Ô'ˆØŒfˆØ	×Ò˜% Ñ%Ô%Ð%Ø	×Ò˜% Ñ&Ô&Ð&Ø�_Š_˜UÑ#Ô#ˆØ�_Š_˜UÑ#Ô#ˆØˆØ
�Š�jÑ!Ô!×-Ò-¨d¬kÑ:Ô:×EÒEÀdÄkÑRÔRÐRØ
�Š�jÑ!Ô!×-Ò-¨d¬kÑ:Ô:×EÒEÀdÄkÑRÔRÐRØˆØ
�Š�jÑ!Ô!×-Ò-¨g¬nÑ=Ô=Ð=Ø
�Š�jÑ!Ô!×-Ò-¨g¬nÑ=Ô=Ð=Ø�
Š
‰Œˆà×Ò˜ œœ qÑ)Ô)Ð)Ø×Ò˜ œœ qÑ)Ô)Ð)Ø×Ò˜ œœ¨Ñ+Ô+Ð+à�Š‰ŒˆØ�
Š
‰ŒˆØ×Ò˜ œœ¨Ñ+Ô+Ð+Ø×Ò�˜T™œ AÑ&Ô&Ð&Ø�!ŒW�QŒZˆØ×ÒØ�NŠNÑÔÔ% rÐ+Hñ	
ô 	
ð 	
ð 	×Ò˜RŸ\š\™^œ^¨RÐ1TÑUÔUÐUØˆØ
�Š�j "Ñ%Ô%×1Ò1°$´+Ñ>Ô>Ð>Ø�
Š
‰Œˆà�Š˜˜QœÑ Ô Ð à×Ò˜Ÿš¨Ñ4Ô4°b·o²oÀjÑ6QÔ6QÑRÔRÐRð ŒwˆØ˜a”j”oˆØ�Š�d˜AÔ3Ð5SÑTÔTÐTØØØ�
Š
‰ŒˆØØà�
Š
‰Œˆõ Œ>˜YÒ&Ð&ÝŒJ‰LŒLˆLà�
Š
‰Œˆà×Ò˜˜qÔ6Ð8VÑWÔWÐWØ×Ò˜˜qÔ5Ð7UÑVÔVÐVØ×ÒØ˜Ô0Ð2Uñ	
ô 	
ð 	
ð 	×ÒØ˜Ô/Ð1Tñ	
ô 	
ð 	
ð 	×Ò˜#œ,Ð(BÑCÔCÐCÐCÐCr)   c                 óè  — 	 t          j        d¦  «         n# t          $ r Y nw xY wt          | ¬¦  «        \  }}}t	          ¦   «         }|                     d|¦  «         |                     d¦  «        }g }|                     d¦  «                             |j	        | j
        ¦  «         |                     ¦   «          |                     ¦   «         }|                      |j        d¦  «         |                      |j        d¦  «         |                      |j        d¦  «         |                      |j        d¦  «         t          | ¬¦  «        \  }}}|                     d|¦  «         |                     d¦  «        }|                     d¦  «                             |j	        | j
        ¦  «         |                     ¦   «          |                     ¦   «         }|                      |j        d¦  «         d S )Nr‘  r¦  rÜ   ÚgetPubrQ   r   )r’  r“  r”  r–   ÚGetPublisherr¹  rº  rà   r"  r  r™  rM   r€   rW  ÚactivateCalledÚisActivatedÚyayIGotPublishedÚ_wasCleanWhenLoaded)r%   rÔ   r/  rK   rÜ   rÂ  Úaccumr  s           r'   Útest_publishablezBrokerTests.test_publishablev  sÇ  € ð	ÝŒIÐ-Ñ.Ô.Ð.Ð.øÝð 	ð 	ð 	ØˆDð	øøøå-°4Ð8Ñ8Ô8‰
ˆˆ1ˆdÝ‰nŒnˆà	×Ò˜% Ñ%Ô%Ð%Ø�oŠo˜eÑ$Ô$ˆØˆØ�Š�xÑ Ô ×-Ò-¨e¬l¸DÔ<NÑOÔOÐOØ�
Š
‰ŒˆØ�iŠi‰kŒkˆØ×Ò˜Ô+¨QÑ/Ô/Ð/Ø×Ò˜œ¨!Ñ,Ô,Ð,Ø×Ò˜Ô-¨qÑ1Ô1Ð1à×Ò˜Ô0°!Ñ4Ô4Ð4Ý-°4Ð8Ñ8Ô8‰
ˆˆ1ˆdØ	×Ò˜% Ñ%Ô%Ð%Ø�oŠo˜eÑ$Ô$ˆØ�Š�xÑ Ô ×-Ò-¨e¬l¸DÔ<NÑOÔOÐOØ�
Š
‰ŒˆØ�iŠi‰kŒkˆà×Ò˜Ô0°!Ñ4Ô4Ð4Ð4Ð4s   ‚ —
$£$c                 ó   — |j         | _        d S r0   )r»   r›  )r%   Úvals     r'   ÚgotCopyzBrokerTests.gotCopy’  s   € Øœ6ˆÔÐÐr)   c                 óÌ  — t          | ¬¦  «        \  }}}d}t          ¦   «         }|                     d|¦  «         |                     d¦  «        }|                     d|¦  «                             | j        | j        ¦  «         |                     ¦   «          |                     ¦   «          |                     ¦   «          |  	                    | j
        |d| j
        › �¦  «         d S )Nr¦  éc   rÜ   Ú
getFactoryz!ID not correct on factory object )r–   rÆ   r¹  rº  rà   r"  r  r¤  rK   rW  r›  )r%   rÔ   r/  rK   ÚIDr  r­   s          r'   Útest_factoryCopyzBrokerTests.test_factoryCopy•  sÖ   € Ý-°4Ð8Ñ8Ô8‰
ˆˆ1ˆdØˆÝ‰lŒlˆØ	×Ò˜% Ñ%Ô%Ð%Ø�OŠO˜EÑ"Ô"ˆØ	�Š�\ 2Ñ&Ô&×3Ò3°D´LÀ$ÔBUÑVÔVÐVØ�	Š	‰ŒˆØ�	Š	‰ŒˆØ�	Š	‰ŒˆØ×ÒØÔØØB°Ô0@ÐBÐBñ	
ô 	
ð 	
ð 	
ð 	
r)   )r*   r+   r,   r›  rR  r™  rž  r¡  r¤  r½  rÃ  rÆ  rÓ  rÖ  rÛ  rà  rì  r   r	  r  r  r-   r)   r'   r�  r�  ‘  s(  € € € € € Ø€Kðð ð ðDð Dð Dð"ð "ð "ðð ð ð?ð ?ð ?ðKð Kð Kð0ð ð ð(#ð #ð #ðPð Pð Pð 
8ð 
8ð 
8ð8ð 8ð 8ð(=ð =ð =ð$0ð 0ð 0ð8@Dð @Dð @DðD5ð 5ð 5ð8"ð "ð "ð
ð 
ð 
ð 
ð 
r)   r�  sô  helloworldhelloworldhelloworldhelloworldhelloworldhelloworldhelloworldhelloworldhelloworldhelloworldhelloworldhelloworldhelloworldhelloworldhelloworldhelloworldhelloworldhelloworldhelloworldhelloworldhelloworldhelloworldhelloworldhelloworldhelloworldhelloworldhelloworldhelloworldhelloworldhelloworldhelloworldhelloworldhelloworldhelloworldhelloworldhelloworldhelloworldhelloworldhelloworldhelloworldhelloworldhelloworldhelloworldhelloworldhelloworldhelloworldhelloworldhelloworldhelloworldhelloworldc                  ó   — | a |ad S r0   )ÚcallbackArgsÚcallbackKeyword)ÚargsrB  s     r'   ÚfinishedCallbackr  ¬  s   € à€LØ€O€O€Or)   c                   ó   — e Zd Zd„ Zd„ ZdS )Ú	Pagerizerc                 ó2   — |||c| _         | _        | _        d S r0   )r�   r  rB  )r%   r�   r  rB  s       r'   rF   zPagerizer.__init__³  s   € Ø,4°d¸BÐ)ˆŒ�t”y $¤' ' 'r)   c                 óz   — t          j        |t          d| j        g| j        ¢R i | j        ¤Ž d x| _        | _        d S )Néd   )r   ÚStringPagerÚ	bigStringr�   r  rB  ©r%   Ú	collectors     r'   Úremote_getPageszPagerizer.remote_getPages¶  sT   € ÝÔØ•y # t¤}ð	
Ø7;´yð	
ð 	
ð 	
ØDHÄGð	
ð 	
ð 	
ð #Ð"ˆŒ	�D”G�G�Gr)   N)r*   r+   r,   rF   r   r-   r)   r'   r  r  ²  s2   € € € € € ð?ð ?ð ?ð#ð #ð #ð #ð #r)   r  c                   ó   — e Zd ZdZd„ Zd„ ZdS )ÚFilePagerizerNc                 ó@   — || _         |||c| _        | _        | _        d S r0   )Úfilenamer�   r  rB  )r%   r$  r�   r  rB  s        r'   rF   zFilePagerizer.__init__À  s#   € Ø ˆŒØ,4°d¸BÐ)ˆŒ�t”y $¤' ' 'r)   c                 óž   — t          j        |t          | j        d¦  «        | j        g| j        ¢R i | j        ¤Ž| _        d x| _        | _        d S )NÚrb)r   Ú	FilePagerÚopenr$  r�   r  rB  Úpagerr  s     r'   r   zFilePagerizer.remote_getPagesÄ  s\   € Ý”^Ø•t˜DœM¨4Ñ0Ô0°$´-ð
ØBFÄ)ð
ð 
ð 
ØOSÌwð
ð 
ˆŒ
ð #Ð"ˆŒ	�D”G�G�Gr)   )r*   r+   r,   r)  rF   r   r-   r)   r'   r"  r"  ½  s7   € € € € € Ø€Eð?ð ?ð ?ð#ð #ð #ð #ð #r)   r"  c                   ó6   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	dS )	ÚPagingTestsz0
    Test pb objects sending data by pages.
    c                 óÈ   — |                       ¦   «         | _        t          | j        d¦  «        5 }|                     t          ¦  «         ddd¦  «         dS # 1 swxY w Y   dS )z?
        Create a file used to test L{util.FilePager}.
        ÚwbN)Úmktempr$  r(  Úwriter  )r%   Úfs     r'   rP  zPagingTests.setUpÐ  s˜   € ð Ÿš™œˆŒÝ�$”- Ñ&Ô&ð 	¨!Ø�GŠG•IÑÔÐð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s   ¯AÁAÁAc                 ó  — t          | ¬¦  «        \  }}}|                     dt          t          dd¬¦  «        ¦  «         |                     d¦  «        }g }t          j        |d¦  «                             |j        ¦  «         |s| 	                    ¦   «          |¯|  
                    d                     |d         ¦  «        t          d	¦  «         |  
                    t          d
d¦  «         |  
                    t          ddid¦  «         dS )zg
        Test L{util.StringPager}, passing a callback to fire when all pages
        are sent.
        r¦  rÜ   ÚhellorÈ  ©rÊ   ÚgetPagesr)   r   ú'Pages received not equal to pages sent!)r2  úCompleted callback not invokedrÊ   N)r–   r¹  r  r  rº  r   ÚgetAllPagesr^  r  rK   rW  Újoinr  r  r  ©r%   rÔ   r/  rK   r­   rÏ  s         r'   Útest_pagingWithCallbackz#PagingTests.test_pagingWithCallbackØ  s  € õ
 .°4Ð8Ñ8Ô8‰
ˆˆ1ˆdØ	×Ò˜%¥Õ+;¸WÈBÐ!OÑ!OÔ!OÑPÔPÐPØ�OŠO˜EÑ"Ô"ˆØˆÝÔ˜˜JÑ'Ô'×3Ò3°A´HÑ=Ô=Ð=Øð 	Ø�IŠI‰KŒKˆKð ð 	à×ÒØ�HŠH�Q�q”T‰NŒN�IÐ'Pñ	
ô 	
ð 	
ð 	×Ò� zÐ3SÑTÔTÐTØ×ÒÝ˜g r˜]Ð,Lñ	
ô 	
ð 	
ð 	
ð 	
r)   c                 ó–  — t          | ¬¦  «        \  }}}|                     dt          d¦  «        ¦  «         |                     d¦  «        }g }t	          j        |d¦  «                             |j        ¦  «         |s|                     ¦   «          |¯|  	                    d 
                    |d         ¦  «        t          d¦  «         dS )z>
        Test L{util.StringPager} without a callback.
        r¦  rÜ   Nr4  r)   r   r5  )r–   r¹  r  rº  r   r7  r^  r  rK   rW  r8  r  r9  s         r'   Útest_pagingWithoutCallbackz&PagingTests.test_pagingWithoutCallbackì  sÆ   € õ .°4Ð8Ñ8Ô8‰
ˆˆ1ˆdØ	×Ò˜%¥¨4¡¤Ñ1Ô1Ð1Ø�OŠO˜EÑ"Ô"ˆØˆÝÔ˜˜JÑ'Ô'×3Ò3°A´HÑ=Ô=Ð=Øð 	Ø�IŠI‰KŒKˆKð ð 	à×ÒØ�HŠH�Q�q”T‰NŒN�IÐ'Pñ	
ô 	
ð 	
ð 	
ð 	
r)   c                 óR  — |                       ¦   «         }t          |d¦  «                             ¦   «          t          | ¬¦  «        \  }}}t	          |d¦  «        }|                     d|¦  «         |                     d¦  «        }g }t          j        |d¦  «         	                    |j
        ¦  «         d}|s'|dk    r!|                     ¦   «          |dz  }|s|dk    °!|s|                      d	¦  «         |                      d
                     |d         ¦  «        d
d¦  «         dS )z@
        Test L{util.FilePager}, sending an empty file.
        Úwr¦  NrÂ  r4  rÈ  r   rQ   zgetAllPages timed outr)   r5  )r.  r(  Úcloser–   r"  r¹  rº  r   r7  r^  r  rK   r—  rW  r8  )	r%   ÚfilenameEmptyrÔ   r/  rK   Ú	pagerizerr­   rÏ  Úttls	            r'   Útest_emptyFilePagingz PagingTests.test_emptyFilePagingû  s(  € ð Ÿš™œˆÝˆ]˜CÑ Ô ×&Ò&Ñ(Ô(Ð(Ý-°4Ð8Ñ8Ô8‰
ˆˆ1ˆdÝ! -°Ñ6Ô6ˆ	Ø	×Ò˜% Ñ+Ô+Ð+Ø�OŠO˜EÑ"Ô"ˆØˆÝÔ˜˜JÑ'Ô'×3Ò3°A´HÑ=Ô=Ð=ØˆØð 	˜˜aš˜Ø�IŠI‰KŒKˆKØ�1‰HˆCð ð 	˜˜aš˜ð ð 	/Ø�IŠIÐ-Ñ.Ô.Ð.Ø×Ò˜Ÿš ! A¤$™œ¨Ð.WÑXÔXÐXÐXÐXr)   c                 ój  — t          | ¬¦  «        \  }}}t          | j        t          dd¬¦  «        }|                     d|¦  «         |                     d¦  «        }g }t          j        |d¦  «                             |j	        ¦  «         |s| 
                    ¦   «          |¯|                      d                     |d         ¦  «        t          d	¦  «         |                      t          d
d¦  «         |                      t          ddid¦  «         |                      |j        j        g ¦  «         dS )zž
        Test L{util.FilePager}, passing a callback to fire when all pages
        are sent, and verify that the pager doesn't keep chunks in memory.
        r¦  Úfrodoé	   r3  rÂ  r4  r)   r   r5  )rE  r6  rÊ   N)r–   r"  r$  r  r¹  rº  r   r7  r^  r  rK   rW  r8  r  r  r  r)  Úchunks©r%   rÔ   r/  rK   rA  r­   rÏ  s          r'   Útest_filePagingWithCallbackz'PagingTests.test_filePagingWithCallback  s2  € õ
 .°4Ð8Ñ8Ô8‰
ˆˆ1ˆdÝ! $¤-Õ1AÀ7ÐRSÐTÑTÔTˆ	Ø	×Ò˜% Ñ+Ô+Ð+Ø�OŠO˜EÑ"Ô"ˆØˆÝÔ˜˜JÑ'Ô'×3Ò3°A´HÑ=Ô=Ð=Øð 	Ø�IŠI‰KŒKˆKð ð 	à×ÒØ�HŠH�Q�q”T‰NŒN�IÐ'Pñ	
ô 	
ð 	
ð 	×Ò� zÐ3SÑTÔTÐTØ×ÒÝ˜g q˜\Ð+Kñ	
ô 	
ð 	
ð 	×Ò˜œÔ/°Ñ4Ô4Ð4Ð4Ð4r)   c                 óæ  — t          | ¬¦  «        \  }}}t          | j        d¦  «        }|                     d|¦  «         |                     d¦  «        }g }t          j        |d¦  «                             |j        ¦  «         |s| 	                    ¦   «          |¯|  
                    d                     |d         ¦  «        t          d¦  «         |  
                    |j        j        g ¦  «         dS )z<
        Test L{util.FilePager} without a callback.
        r¦  NrÂ  r4  r)   r   r5  )r–   r"  r$  r¹  rº  r   r7  r^  r  rK   rW  r8  r  r)  rG  rH  s          r'   Útest_filePagingWithoutCallbackz*PagingTests.test_filePagingWithoutCallback%  sê   € õ .°4Ð8Ñ8Ô8‰
ˆˆ1ˆdÝ! $¤-°Ñ6Ô6ˆ	Ø	×Ò˜% Ñ+Ô+Ð+Ø�OŠO˜EÑ"Ô"ˆØˆÝÔ˜˜JÑ'Ô'×3Ò3°A´HÑ=Ô=Ð=Øð 	Ø�IŠI‰KŒKˆKð ð 	à×ÒØ�HŠH�Q�q”T‰NŒN�IÐ'Pñ	
ô 	
ð 	
ð 	×Ò˜œÔ/°Ñ4Ô4Ð4Ð4Ð4r)   N)
r*   r+   r,   r3   rP  r:  r<  rC  rI  rK  r-   r)   r'   r+  r+  Ë  s{   € € € € € ðð ðð ð ð
ð 
ð 
ð(
ð 
ð 
ðYð Yð Yð(5ð 5ð 5ð,5ð 5ð 5ð 5ð 5r)   r+  c                   ó   — e Zd Zd„ ZdS )ÚDumbPublishablec                 ó
   — ddiS )Nr  rQ   r-   r1   s    r'   ÚgetStateToPublishz!DumbPublishable.getStateToPublish8  s   € Ø" AÐ&Ð&r)   N)r*   r+   r,   rO  r-   r)   r'   rM  rM  7  s#   € € € € € ð'ð 'ð 'ð 'ð 'r)   rM  c                   ó   — e Zd Zd„ ZdS )ÚDumbPubc                 ó   — d| _         d S rš   )r  r1   s    r'   Ú	activatedzDumbPub.activated=  s   € ØˆÔÐÐr)   N)r*   r+   r,   rS  r-   r)   r'   rQ  rQ  <  s#   € € € € € ð ð  ð  ð  ð  r)   rQ  c                   ó   — e Zd Zd„ Zd„ ZdS )r  c                 ó.   — t          d¦  «        | _        d S )NÚTESTING)rM  Úpubr1   s    r'   rF   zGetPublisher.__init__B  s   € Ý" 9Ñ-Ô-ˆŒˆˆr)   c                 ó   — | j         S r0   )rW  r1   s    r'   Úremote_getPubzGetPublisher.remote_getPubE  s	   € ØŒxˆr)   N)r*   r+   r,   rF   rY  r-   r)   r'   r  r  A  s2   € € € € € ð.ð .ð .ðð ð ð ð r)   r  c                   ó0   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ ZdS )ÚDisconnectionTestsz'
    Test disconnection callbacks.
    c                 ó&   — t          d|› �¦  «        ‚)NzI shouldn't have been called: ©rÀ   )r%   r  s     r'   r˜  zDisconnectionTests.errorQ  s   € ÝÐB¸DÐBÐBÑCÔCÐCr)   c                 ó   — d| _         dS )z.
        Called on broker disconnect.
        rQ   N)ÚgotCallbackr1   s    r'   ÚgotDisconnectedz"DisconnectionTests.gotDisconnectedT  s   € ð ˆÔÐÐr)   c                 óJ   — |                       || j        ¦  «         d| _        dS )z7
        Called on RemoteReference disconnect.
        rQ   N)rW  ÚremoteObjectÚobjectCallback©r%   Úos     r'   ÚobjectDisconnectedz%DisconnectionTests.objectDisconnectedZ  s+   € ð 	×Ò˜˜DÔ-Ñ.Ô.Ð.ØˆÔÐÐr)   c                 óª  — t          | ¬¦  «        \  }}}|                     ¦   «          |                     dt          ¦   «         ¦  «         |                     d¦  «        }g }|                     dt          ¦   «         ¦  «                             |j        ¦  «         | 	                    ¦   «          |  
                    t          |¦  «        d¦  «         d S )Nr¦  re  Ú
setBadCopyrQ   )r–   rK   r¹  Ú
BadCopySetrº  rà   ÚBadCopyablerñ  r  rM   rW  rÎ  )r%   rÔ   r/  rK   ÚgrÏ  s         r'   Útest_badSerializationz(DisconnectionTests.test_badSerializationa  s¬   € Ý-°4Ð8Ñ8Ô8‰
ˆˆ1ˆdØ�	Š	‰ŒˆØ	×Ò˜#�z™|œ|Ñ,Ô,Ð,Ø�OŠO˜CÑ Ô ˆØˆØ	�Š�\¥;¡=¤=Ñ1Ô1×<Ò<¸Q¼XÑFÔFÐFØ�
Š
‰ŒˆØ×Ò�˜Q™œ Ñ#Ô#Ð#Ð#Ð#r)   c                 óÌ  — t          | ¬¦  «        \  }}}|                     ¦   «          |                     dt          ¦   «         ¦  «         |                     d¦  «        }|                     ¦   «          |                     ¦   «          |                     ¦   «          |                     | j        ¦  «         |                      | j        |j        ¦  «         | 	                    | j        ¦  «         |  
                    | j        |j        ¦  «         |                     | j        ¦  «         |                      |j        |j        ¦  «         |                      | j        |j        ¦  «         | 	                    | j        ¦  «         |  
                    |j        |j        ¦  «         |  
                    | j        |j        ¦  «         |                     | j        ¦  «         |                     | j        ¦  «         || _        |                     t#          j        t&          j        ¦  «        ¦  «         |                      | j        ¦  «         |                      | j        ¦  «         d S )Nr¦  re  )r–   rK   r¹  r˜   rº  ÚnotifyOnDisconnectr˜  rä  ÚdisconnectsÚdontNotifyOnDisconnectrê  Ú_disconnectedÚdisconnectCallbacksr`  rf  rb  r_   r   r`   r   ra   rÍ  r_  rc  )r%   rÔ   r/  rK   Úrs        r'   Útest_disconnectionz%DisconnectionTests.test_disconnectionk  sö  € Ý-°4Ð8Ñ8Ô8‰
ˆˆ1ˆdØ�	Š	‰ŒˆØ	×Ò˜#�|™~œ~Ñ.Ô.Ð.ð �OŠO˜CÑ Ô ˆØ�	Š	‰ŒˆØ�	Š	‰ŒˆØ�	Š	‰Œˆð 	
×Ò˜TœZÑ(Ô(Ð(Ø�Š�d”j !¤-Ñ0Ô0Ð0Ø	× Ò  ¤Ñ,Ô,Ð,Ø×Ò˜œ Q¤]Ñ3Ô3Ð3à	×Ò˜TœZÑ(Ô(Ð(Ø�Š�a”o q¤}Ñ5Ô5Ð5Ø�Š�d”j !Ô"7Ñ8Ô8Ð8Ø	× Ò  ¤Ñ,Ô,Ð,Ø×Ò˜œ¨!¬-Ñ8Ô8Ð8Ø×Ò˜œ QÔ%:Ñ;Ô;Ð;ð 	
×Ò˜TÔ1Ñ2Ô2Ð2Ø	×Ò˜TÔ4Ñ5Ô5Ð5ØˆÔð 	
×Ò�œ­Ô)=Ñ>Ô>Ñ?Ô?Ð?Ø�Š˜Ô(Ñ)Ô)Ð)Ø�Š˜Ô+Ñ,Ô,Ð,Ð,Ð,r)   N)	r*   r+   r,   r3   r˜  r`  rf  rl  rt  r-   r)   r'   r[  r[  L  sl   € € € € € ðð ðDð Dð Dðð ð ð ð  ð  ð$ð $ð $ð!-ð !-ð !-ð !-ð !-r)   r[  c                   ó   — e Zd ZdS )ÚFreakOutNrµ   r-   r)   r'   rv  rv  �  r¶   r)   rv  c                   ó   — e Zd Zd„ ZdS )rj  c                 ó   — t          ¦   «         ‚r0   )rv  )r%   Úps     r'   ÚgetStateToCopyForzBadCopyable.getStateToCopyFor”  s   € Ý‰jŒjÐr)   N)r*   r+   r,   rz  r-   r)   r'   rj  rj  “  s#   € € € € € ðð ð ð ð r)   rj  c                   ó   — e Zd Zd„ ZdS )ri  c                 ó   — d S r0   r-   )r%   Úbcs     r'   Úremote_setBadCopyzBadCopySet.remote_setBadCopy™  s   € Øˆtr)   N)r*   r+   r,   r~  r-   r)   r'   ri  ri  ˜  s#   € € € € € ðð ð ð ð r)   ri  c                   ó&   — e Zd ZdZd„ Zdd„Zd„ ZdS )ÚLocalRemoteTestr   c                 ó   — |dz   S rš   r-   )r%   r­   s     r'   Ú	sync_add1zLocalRemoteTest.sync_add1   ó   € Ø�1‰uˆr)   rQ   c                 ó   — ||z   S r0   r-   )r%   r­   r®   s      r'   Ú	async_addzLocalRemoteTest.async_add£  rƒ  r)   c                 ó   — t          ¦   «         ‚r0   r]  r1   s    r'   Ú
async_failzLocalRemoteTest.async_fail¦  s   € Ý‰nŒnÐr)   N)r   rQ   )r*   r+   r,   ÚreportAllTracebacksr‚  r…  r‡  r-   r)   r'   r€  r€  �  sL   € € € € € ØÐðð ð ðð ð ð ðð ð ð ð r)   r€  c                   ó8   — e Zd ZdZdxZZd„ Zd„ Zd„ Zd„ Z	d„ Z
dS )	ÚMyPerspectivezÃ
    @ivar loggedIn: set to C{True} when the avatar is logged in.
    @type loggedIn: C{bool}

    @ivar loggedOut: set to C{True} when the avatar is logged out.
    @type loggedOut: C{bool}
    Fc                 ó   — || _         d S r0   ©r:   ©r%   r:   s     r'   rF   zMyPerspective.__init__¶  s   € Ø ˆŒˆˆr)   c                 ó   — | j         S )zT
        Return the avatar identifier which was used to access this avatar.
        rŒ  r1   s    r'   Úperspective_getAvatarIdz%MyPerspective.perspective_getAvatarId¹  s   € ð Œ}Ðr)   c                 ó   — t          ¦   «         S r0   )ÚMyViewr1   s    r'   Úperspective_getViewPointz&MyPerspective.perspective_getViewPoint¿  s   € Ý‰xŒxˆr)   c                 ó   — ||z   S )zØ
        Add the given objects and return the result.  This is a method
        unavailable on L{Echoer}, so it can only be invoked by authenticated
        users who received their avatar from L{TestRealm}.
        r-   r²  s      r'   Úperspective_addzMyPerspective.perspective_addÂ  s   € ð �1‰uˆr)   c                 ó   — d| _         d S ©NT©Ú	loggedOutr1   s    r'   ÚlogoutzMyPerspective.logoutÊ  ó   € ØˆŒˆˆr)   N)r*   r+   r,   r3   ÚloggedInr˜  rF   r�  r’  r”  r™  r-   r)   r'   rŠ  rŠ  ª  su   € € € € € ðð ð !Ð €Hˆyð!ð !ð !ðð ð ðð ð ðð ð ðð ð ð ð r)   rŠ  c                   ó    — e Zd ZdZeZdZd„ ZdS )Ú	TestRealmaº  
    A realm which repeatedly gives out a single instance of L{MyPerspective}
    for non-anonymous logins and which gives out a new instance of L{Echoer}
    for each anonymous login.

    @ivar lastPerspective: The L{MyPerspective} most recently created and
        returned from C{requestAvatar}.

    @ivar perspectiveFactory: A one-argument callable which will be used to
        create avatars to be returned from C{requestAvatar}.
    Nc                 ó  — |t           j        k    sJ ‚|dk    sJ ‚|t          j        u rt           j        t	          ¦   «         d„ fS |                      |¦  «        | _        d| j        _        t           j        | j        | j        j        fS )zè
        Verify that the mind and interface supplied have the expected values
        (this should really be done somewhere else, like inside a test method)
        and return an avatar appropriate for the given identifier.
        úBRAINS!c                  ó   — d S r0   r-   r-   r)   r'   r8   z)TestRealm.requestAvatar.<locals>.<lambda>è  s   € °d€ r)   T)	r   r9   r   Ú	ANONYMOUSr<  ÚperspectiveFactoryÚlastPerspectiver›  r™  )r%   r:   r;   Ú	interfaces       r'   r>   zTestRealm.requestAvatarß  s„   € ð �BœOÒ+Ð+Ð+Ð+Ø�yÒ Ð Ð Ð Ø•xÔ)Ð)Ð)Ý”?¥F¡H¤H¨l¨lÐ:Ð:à#'×#:Ò#:¸8Ñ#DÔ#DˆDÔ Ø,0ˆDÔ Ô)Ý”O TÔ%9¸4Ô;OÔ;VÐWÐWr)   )r*   r+   r,   r3   rŠ  r¢  r£  r>   r-   r)   r'   r�  r�  Î  s?   € € € € € ð
ð 
ð 'Ðà€OðXð Xð Xð Xð Xr)   r�  c                   ó   — e Zd Zd„ ZdS )r‘  c                 ó,   — t          |t          ¦  «        S r0   )r"   rŠ  r$   s     r'   Ú
view_checkzMyView.view_checkð  s   € Ý˜$¥Ñ.Ô.Ð.r)   N)r*   r+   r,   r§  r-   r)   r'   r‘  r‘  ï  s#   € € € € € ð/ð /ð /ð /ð /r)   r‘  c                   ó   — e Zd ZdZd„ Zd„ ZdS )Ú
LeakyRealmz]
    A realm which hangs onto a reference to the mind object in its logout
    function.
    c                 ó   — || _         dS )z˜
        Create a L{LeakyRealm}.

        @param mindEater: a callable that will be called with the C{mind}
        object when it is available
        N)Ú
_mindEater)r%   Ú	mindEaters     r'   rF   zLeakyRealm.__init__ú  s   € ð $ˆŒˆˆr)   c                 ó€   ‡‡— |                       ‰¦  «         |                      |¦  «        Št          j        ‰ˆˆfd„fS )Nc                  ó0   •— ‰ ‰                      ¦   «         fS r0   )r™  )r;   Úpersps   €€r'   r8   z*LeakyRealm.requestAvatar.<locals>.<lambda>  s   ø€ °°u·|²|±~´~Ð0F€ r)   )r«  r¢  r   r9   )r%   r:   r;   r¤  r¯  s     ` @r'   r>   zLeakyRealm.requestAvatar  sE   øø€ Ø�Š˜ÑÔÐØ×'Ò'¨Ñ1Ô1ˆÝ” Ð(FÐ(FÐ(FÐ(FÐ(FÐGÐGr)   N)r*   r+   r,   r3   rF   r>   r-   r)   r'   r©  r©  ô  sA   € € € € € ðð ð
$ð $ð $ðHð Hð Hð Hð Hr)   r©  c                   ó   — e Zd ZdZd„ ZdS )ÚNewCredLeakTestsz/
    Tests to try to trigger memory leaks.
    c                 óö  ‡ ‡‡‡	— d‰ _         ˆ fd„}t          ‰ t          |¦  «        ¬¦  «        \  }Š	Šg Š|                     d¦  «        }|                     dd¦  «        }d„ }|                     |¦  «         ˆˆˆ	fd„}|                     |¦  «         ‰                     ¦   «          ‰                      ‰d	g¦  «         t          j	        ¦   «          ‰  
                    ‰                       ¦   «         ¦  «         dS )
z»
        The server does not leak a reference when the client disconnects
        suddenly, even if the cred logout function forms a reference cycle with
        the perspective.
        Nc                 ó:   •— t          j        | ¦  «        ‰_        d S r0   )ÚweakrefrO  ÚmindRef)r;   r%   s    €r'   Ú
setMindRefz4NewCredLeakTests.test_logoutLeak.<locals>.setMindRef  s   ø€ Ý"œ; tÑ,Ô,ˆDŒLˆLˆLr)   )ro   r”   ru  ÚloginrŽ   c                 ó|   — | \  }}t          ¦   «         }|                     dt          j        |d¦  «        |¦  «        S )NÚrespondrŽ   )r˜   rà   r   r¹  )r­   Ú	challengeÚ
challengerr;   s       r'   Ú
cbResponsez4NewCredLeakTests.test_logoutLeak.<locals>.cbResponse$  s@   € Ø$%Ñ!ˆI�zÝ‘>”>ˆDØ×(Ò(Ø�2œ: i°Ñ:Ô:¸Dñô ð r)   c                 óÂ   •— ‰                      ¦   «          ‰                     d¦  «         ‰                     t          j        t          d¦  «        ¦  «        ¦  «         d S )NrQ   Úboom)rO   r  r_   r   r`   rÀ   )Ú_ÚconnectionBrokenrK   rs   s    €€€r'   r_   z8NewCredLeakTests.test_logoutLeak.<locals>.connectionLost-  sP   ø€ Ø�IŠI‰KŒKˆKØ×#Ò# AÑ&Ô&Ð&Ø×'Ò'­¬½ÀVÑ8LÔ8LÑ(MÔ(MÑNÔNÐNÐNÐNr)   rQ   )rµ  r–   r©  rº  rà   r^  rM   rW  rè  ré  rö  )
r%   r¶  rr   ru  r#  r¼  r_   rÀ  rK   rs   s
   `      @@@r'   Útest_logoutLeakz NewCredLeakTests.test_logoutLeak  s9  øøøø€ ð ˆŒð	-ð 	-ð 	-ð 	-ð 	-õ ,DØ�Z¨
Ñ3Ô3ð,
ñ ,
ô ,
Ñ(ˆ�l Dð
 ÐØ×)Ò)¨&Ñ1Ô1ˆØ�OŠO˜G XÑ.Ô.ˆð	ð 	ð 	ð 	
�Š�jÑ!Ô!Ð!ð	Oð 	Oð 	Oð 	Oð 	Oð 	Oð 	Oð
 	
�Š�nÑ%Ô%Ð%ð 	�
Š
‰ŒˆØ×ÒÐ)¨A¨3Ñ/Ô/Ð/õ
 	Œ
‰ŒˆØ×Ò˜$Ÿ,š,™.œ.Ñ)Ô)Ð)Ð)Ð)r)   N)r*   r+   r,   r3   rÁ  r-   r)   r'   r±  r±  	  s-   € € € € € ðð ð.*ð .*ð .*ð .*ð .*r)   r±  c                   ó¤   — e Zd ZdZd„ Zdd„Z ej        ej	        ¦  «        fd„Z
d„ Zd„ Zd„ Zd	„ Zd
„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ ZdS )ÚNewCredTestsz=
    Tests related to the L{twisted.cred} support in PB.
    c                 óÊ   — t          ¦   «         | _        t          j        | j        ¦  «        | _        t	          | j        ¦  «        | _        t          j        ¦   «         | _        dS )z¹
        Create a portal with no checkers and wrap it around a simple test
        realm.  Set up a PB server on a TCP port which serves perspectives
        using that portal.
        N)	r�  r”   r
   r’   rr  rp   r   r“   rh   r1   s    r'   rP  zNewCredTests.setUpD  sK   € õ ‘[”[ˆŒ
Ý”m D¤JÑ/Ô/ˆŒÝ:¸4¼;ÑGÔGˆÔÝÔ/Ñ1Ô1ˆÔÐÐr)   Nc                 óF  — t          | | j        | j        ¦  «        \  | _        | _        | _        t          ¦   «         | _        t          t          j
        ddd¦  «        | j        ¦  «        | _        | j                             ¦   «                              | j        ¦  «         dS )aæ  
        Connect a client obtained from C{clientFactory} and a server
        obtained from the current server factory via an L{IOPump},
        then assign them to the appropriate instance variables

        @ivar clientFactory: the broker client factory
        @ivar clientFactory: L{pb.PBClientFactory} instance

        @ivar client: the client broker
        @type client: L{pb.Broker}

        @ivar server: the server broker
        @type server: L{pb.Broker}

        @ivar pump: the IOPump connecting the client and server
        @type pump: L{IOPump}

        @ivar connector: A connector whose connect method recreates
            the above instance variables
        @type connector: L{twisted.internet.base.IConnector}
        ÚTCPr\   iá  N)rv   rh   rp   rB   rC   rK   rx   ÚconnectorStater„   r   ÚIPv4Addressre   r~   r^  ÚestablishClientAndServer)r%   Ú_ignoreds     r'   rÉ  z%NewCredTests.establishClientAndServerO  s”   € õ, /EØ�$Ô$ dÔ&8ñ/
ô /
Ñ+ˆŒ�T”[ $¤)õ >Ñ?Ô?ˆÔÝ3ÝÔ  {°DÑ9Ô9¸4Ô;Nñ
ô 
ˆŒð 	Ô×+Ò+Ñ-Ô-×9Ò9¸$Ô:WÑXÔXÐXÐXÐXr)   c                 óÂ   — |                       | j        j        j        ¦  «         | j                             |¦  «         | j                             | j        |¦  «         dS )aŒ  
        Asserts that the client broker's transport was closed and then
        mimics the event loop by calling the broker's connectionLost
        callback with C{reason}, followed by C{self.clientFactory}'s
        C{clientConnectionLost}

        @param reason: (optional) the reason to pass to the client
            broker's connectionLost callback
        @type reason: L{Failure}
        N)rÍ  rB   rU   rÌ  r_   rh   rg   re   )r%   rf   s     r'   ÚcompleteClientLostConnectionz)NewCredTests.completeClientLostConnectiono  sW   € ð 	�Š˜œÔ-Ô4Ñ5Ô5Ð5ð 	Œ×"Ò" 6Ñ*Ô*Ð*ØÔ×/Ò/°´ÀÑGÔGÐGÐGÐGr)   c                 óÊ   ‡ — ‰                       ¦   «          ‰ j                             ¦   «         }ˆ fd„}ˆ fd„}|                     |¦  «         |                     |¦  «         |S )z¶
        Assert that L{PBClientFactory.getRootObject}'s Deferred fires with
        a L{RemoteReference}, and that disconnecting it runs its
        disconnection callbacks.
        c                 óH   •— ‰                      | t          j        ¦  «         | S r0   )rV  r   ÚRemoteReference)ÚrootObjr%   s    €r'   ÚgotRootObjectz6NewCredTests.test_getRootObject.<locals>.gotRootObjectŒ  s!   ø€ Ø×!Ò! '­2Ô+=Ñ>Ô>Ð>ØˆNr)   c                 ó²   •— t          ¦   «         }|                      |j        ¦  «         ‰j                             ¦   «          ‰                     ¦   «          |S r0   )r   rn  r�   rh   Ú
disconnectrÌ  )rÐ  ÚdisconnectedDeferredr%   s     €r'   rÓ  z3NewCredTests.test_getRootObject.<locals>.disconnect�  sR   ø€ Ý#+¡:¤:Ð Ø×&Ò&Ð';Ô'DÑEÔEÐEØÔ×)Ò)Ñ+Ô+Ð+à×-Ò-Ñ/Ô/Ð/à'Ð'r)   ©rÉ  rh   rN  r^  )r%   ÚrootObjDeferredrÑ  rÓ  s   `   r'   Útest_getRootObjectzNewCredTests.test_getRootObjectƒ  s�   ø€ ð 	×%Ò%Ñ'Ô'Ð'ØÔ,×:Ò:Ñ<Ô<ˆð	ð 	ð 	ð 	ð 	ð	(ð 	(ð 	(ð 	(ð 	(ð 	×#Ò# MÑ2Ô2Ð2Ø×#Ò# JÑ/Ô/Ð/àÐr)   c                 ó’   ‡ — ‰                       ¦   «          ‰ j                             ¦   «         }ˆ fd„}|                     |¦  «        S )z“
        Test that when a connection is lost, calling a method on a
        RemoteReference obtained from it raises L{DeadReferenceError}.
        c                 óê   •‡ — t          ¦   «         }‰                      |j        ¦  «         ˆ ˆfd„}|                     |¦  «         ‰j                             ¦   «          ‰                     ¦   «          |S )Nc                 óT   •— ‰                      t          j        ‰j        d¦  «         d S )NÚmethod)ÚassertRaisesr   ÚDeadReferenceErrorrà   )ÚignrÐ  r%   s    €€r'   ÚlostConnectionzSNewCredTests.test_deadReferenceError.<locals>.gotRootObject.<locals>.lostConnectionª  s'   ø€ Ø×!Ò!¥"Ô"7¸Ô9KÈXÑVÔVÐVÐVÐVr)   )r   rn  r�   r^  rh   rÓ  rÌ  )rÐ  rÔ  rß  r%   s   `  €r'   rÑ  z;NewCredTests.test_deadReferenceError.<locals>.gotRootObject¦  s�   øø€ Ý#+¡:¤:Ð Ø×&Ò&Ð';Ô'DÑEÔEÐEðWð Wð Wð Wð Wð Wð !×,Ò,¨^Ñ<Ô<Ð<ØÔ×)Ò)Ñ+Ô+Ð+à×-Ò-Ñ/Ô/Ð/à'Ð'r)   rÕ  )r%   rÖ  rÑ  s   `  r'   Útest_deadReferenceErrorz$NewCredTests.test_deadReferenceErrorž  sZ   ø€ ð
 	×%Ò%Ñ'Ô'Ð'ØÔ,×:Ò:Ñ<Ô<ˆð	(ð 	(ð 	(ð 	(ð 	(ð ×*Ò*¨=Ñ9Ô9Ð9r)   c                 óà   ‡ —  G d„ dt           j        ¦  «        } |¦   «         ‰ _        ‰                      ¦   «          ‰ j                             ¦   «         }ˆ fd„}|                     |¦  «        S )zÂ
        Test that if the L{reconnecting} flag is passed with a True value then
        a remote call made from a disconnection notification callback gets a
        result successfully.
        c                   ó   — e Zd ZdZd„ ZdS )ú=NewCredTests.test_clientConnectionLost.<locals>.ReconnectOnceFc                 ó”   — | j          }d| _         t          j                             | |||¦  «        }|r|                     ¦   «          |S r–  )ÚreconnectedAlreadyr   r“   rg   r‹   )r%   re   rf   Úreconnectingr�  s        r'   rg   zRNewCredTests.test_clientConnectionLost.<locals>.ReconnectOnce.clientConnectionLostÀ  sW   € Ø#'Ô#:Ð:�Ø*.�Ô'ÝÔ+×@Ò@Ø˜) V¨\ñô �ð  ð (Ø×%Ò%Ñ'Ô'Ð'Ø�r)   N)r*   r+   r,   rå  rg   r-   r)   r'   ÚReconnectOncerã  ½  s)   € € € € € Ø!&Ððð ð ð ð r)   rç  c                 ó"  •— ‰                      | t          j        ¦  «         t          ¦   «         }|                      |j        ¦  «         ‰j                             ¦   «          ‰                     ¦   «          ˆfd„}| 	                    |¦  «        S )Nc                 ój   •— ‰j                              ¦   «         }ˆfd„}|                     |¦  «        S )Nc                 óò   •— ‰                      | t          j        ¦  «         t          ¦   «         }|                      |j        ¦  «         ‰j                             ¦   «          ‰                     ¦   «          |S r0   )	rV  r   rÏ  r   rn  r�   rh   rÓ  rÌ  )ÚanotherRootObjr#  r%   s     €r'   ÚgotAnotherRootObjectzqNewCredTests.test_clientConnectionLost.<locals>.gotRootObject.<locals>.disconnected.<locals>.gotAnotherRootObjectÛ  sg   ø€ Ø×)Ò)¨.½"Ô:LÑMÔMÐMÝ ™
œ
�AØ"×5Ò5°a´jÑAÔAÐAØÔ&×1Ò1Ñ3Ô3Ð3Ø×5Ò5Ñ7Ô7Ð7Ø�Hr)   )rh   rN  r^  )rÞ  r#  rì  r%   s      €r'   r^   zSNewCredTests.test_clientConnectionLost.<locals>.gotRootObject.<locals>.disconnectedØ  sE   ø€ ØÔ&×4Ò4Ñ6Ô6�ðð ð ð ð ð —}’}Ð%9Ñ:Ô:Ð:r)   )
rV  r   rÏ  r   rn  r�   rh   rÓ  rÌ  r^  )rÐ  r#  r^   r%   s      €r'   rÑ  z=NewCredTests.test_clientConnectionLost.<locals>.gotRootObjectÏ  s�   ø€ Ø×!Ò! '­2Ô+=Ñ>Ô>Ð>å‘
”
ˆAØ×&Ò& q¤zÑ2Ô2Ð2àÔ×)Ò)Ñ+Ô+Ð+Ø×-Ò-Ñ/Ô/Ð/ð;ð ;ð ;ð ;ð ;ð —=’= Ñ.Ô.Ð.r)   )r   r“   rh   rÉ  rN  r^  )r%   rç  rÖ  rÑ  s   `   r'   Útest_clientConnectionLostz&NewCredTests.test_clientConnectionLost¶  s•   ø€ ð	ð 	ð 	ð 	ð 	�BÔ.ñ 	ô 	ð 	ð +˜]™_œ_ˆÔØ×%Ò%Ñ'Ô'Ð'àÔ,×:Ò:Ñ<Ô<ˆð	/ð 	/ð 	/ð 	/ð 	/ð0 ×*Ò*¨=Ñ9Ô9Ð9r)   c                 ó*  — |                       ¦   «          | j                             d¦  «        }|                     t	          j        t          ¦   «         ¦  «        ¦  «         |                     t          j	        t          j        ¦  «        ¦  «         dS )z”
        Test that if a Broker loses its connection without receiving any bytes,
        it doesn't raise any exceptions or log any errors.
        )r\   i90  N)rÉ  rp   rj   rl   r   rm   rk   r_   r   r`   r   ra   )r%   ÚserverProtos     r'   Útest_immediateClosez NewCredTests.test_immediateCloseé  sw   € ð
 	×%Ò%Ñ'Ô'Ð'ØÔ(×6Ò6Ð7KÑLÔLˆØ×"Ò"¥8Ô#7½¹
¼
Ñ#CÔ#CÑDÔDÐDØ×"Ò"¥7¤?µ4Ô3GÑ#HÔ#HÑIÔIÐIÐIÐIr)   c                 ó  — t          j        ¦   «         }|                     t          j        dd¦  «        ¦  «        }|                     dt          j        t          d¦  «        ¦  «        ¦  «         |  	                    |t          ¦  «        S )z¯
        L{PBClientFactory.login} returns a L{Deferred} which is errbacked
        with the L{ConnectionRefusedError} if the underlying connection is
        refused.
        ó   fooó   barNz!Test simulated refused connection)
r   r“   r·  r	   ÚUsernamePasswordÚclientConnectionFailedr   r`   r   ÚassertFailure)r%   rh   ÚloginDeferreds      r'   Útest_loginConnectionRefusedz(NewCredTests.test_loginConnectionRefusedó  sˆ   € õ Ô*Ñ,Ô,ˆØ%×+Ò+ÝÔ(¨°Ñ8Ô8ñ
ô 
ˆð 	×,Ò,ØÝŒOÝ&Ð'JÑKÔKñô ñ	
ô 	
ð 	
ð ×!Ò! -Õ1GÑHÔHÐHr)   c                 ó^  ‡ ‡— ‰ j                              t          j        d¬¦  «        ¦  «         t	          j        dd¦  «        }d}t          ¦   «         Š‰ j                             ||¦  «        }ˆˆ fd„}ˆ fd„}| 	                    |¦  «         | 	                    |¦  «         ˆ fd„}| 	                    |¦  «         ‰  
                    ¦   «          ‰ j                             ¦   «          t          j        ¦   «          ‰ j                             ¦   «          ‰                     d¦  «         |S )	zŸ
        Test that login can be performed with IUsernamePassword credentials and
        that when the connection is dropped the avatar is logged out.
        ó   pass©r&   ó   userrŸ  c                 ó�   •— ‰                      ‰j        j        j        ¦  «         ‰                     | t
          j        ¦  «         ‰S r0   )rÍ  r”   r£  r›  rV  r   rÏ  )rä   ÚloginCompletedr%   s    €€r'   ÚcbLoginz.NewCredTests.test_loginLogout.<locals>.cbLogin  s<   ø€ Ø�OŠO˜DœJÔ6Ô?Ñ@Ô@Ð@Ø×!Ò! +­rÔ/AÑBÔBÐBØ!Ð!r)   c                 ób   •— ‰j                              ¦   «          ‰                     ¦   «          d S r0   )rh   rÓ  rÌ  ©Úignoredr%   s    €r'   ÚcbDisconnectz3NewCredTests.test_loginLogout.<locals>.cbDisconnect  s0   ø€ ØÔ×)Ò)Ñ+Ô+Ð+Ø×-Ò-Ñ/Ô/Ð/Ð/Ð/r)   c                 óP   •— ‰                      ‰j        j        j        ¦  «         d S r0   )rÍ  r”   r£  r˜  r  s    €r'   ÚcbLogoutz/NewCredTests.test_loginLogout.<locals>.cbLogout&  s#   ø€ Ø�OŠO˜DœJÔ6Ô@ÑAÔAÐAÐAÐAr)   N)r
   ÚregisterCheckerr   r�   r	   rô  r   rh   r·  r^  rÉ  rK   rM   rè  ré  r�   )r%   Úcredsr;   r#  rÿ  r  r  rþ  s   `      @r'   Útest_loginLogoutzNewCredTests.test_loginLogout  sX  øø€ ð
 	Œ×#Ò#ÝÔ<À'ÐJÑJÔJñ	
ô 	
ð 	
õ Ô,¨W°gÑ>Ô>ˆð ˆå!™œˆàÔ×$Ò$ U¨DÑ1Ô1ˆð	"ð 	"ð 	"ð 	"ð 	"ð 	"ð
	0ð 	0ð 	0ð 	0ð 	0ð 	
�Š�gÑÔÐØ	�Š�lÑ#Ô#Ð#ð	Bð 	Bð 	Bð 	Bð 	Bð 	
�Š�hÑÔÐà×%Ò%Ñ'Ô'Ð'ØŒ	�ŠÑÔÐõ 	Œ
‰ŒˆàŒ	�ŠÑÔÐà×Ò Ñ%Ô%Ð%Øˆr)   c                 óB  ‡ ‡— t          ¦   «         Š G ˆfd„dt          j        ¦  «        }|‰ j        _        ‰ j                             t          j        d¬¦  «        ¦  «         ‰ j	         
                    t          j        dd¦  «        d¦  «        }ˆfd„}|                     |¦  «         ˆ fd„}|                     |¦  «         ‰                      ¦   «          ‰ j                             ¦   «          t#          j        ¦   «          ‰ j                             ¦   «          |S )	zâ
        If a L{RemoteReference} to an L{IPerspective} avatar is decrefed and
        there remain no other references to the avatar on the server, the
        avatar is garbage collected and the logout method called.
        c                   ó$   •— e Zd ZdZd„ Zˆ fd„ZdS )ú=NewCredTests.test_logoutAfterDecref.<locals>.EventPerspectivezQ
            An avatar which fires a Deferred when it is logged out.
            c                 ó   — d S r0   r-   r�  s     r'   rF   zFNewCredTests.test_logoutAfterDecref.<locals>.EventPerspective.__init__C  s   € Ø�r)   c                 ó2   •— ‰                      d ¦  «         d S r0   )r�   )r%   r˜  s    €r'   r™  zDNewCredTests.test_logoutAfterDecref.<locals>.EventPerspective.logoutF  s   ø€ Ø×"Ò" 4Ñ(Ô(Ð(Ð(Ð(r)   N)r*   r+   r,   r3   rF   r™  r—  s   €r'   ÚEventPerspectiver  >  sG   ø€ € € € € ðð ðð ð ð)ð )ð )ð )ð )ð )ð )r)   r  ró  rí   rò  rŸ  c                 ó   •— ‰S r0   r-   )Úavatarr˜  s    €r'   Ú
cbLoggedInz7NewCredTests.test_logoutAfterDecref.<locals>.cbLoggedInS  s   ø€ ð Ðr)   c                 óR   •— ‰                      ‰j        j        j        i ¦  «         d S r0   )rW  rp   rw  Ú_localCleanupr  s    €r'   ÚcbLoggedOutz8NewCredTests.test_logoutAfterDecref.<locals>.cbLoggedOutZ  s+   ø€ ð ×Ò˜TÔ/Ô@ÔNÐPRÑSÔSÐSÐSÐSr)   )r   r   ÚAvatarr”   r¢  r
   r  r   r�   rh   r·  r	   rô  r^  rÉ  rK   rM   rè  ré  )r%   r  r#  r  r  r˜  s   `    @r'   Útest_logoutAfterDecrefz#NewCredTests.test_logoutAfterDecref6  sQ  øø€ õ ‘J”Jˆ	ð		)ð 		)ð 		)ð 		)ð 		)ð 		)ð 		)�rœyñ 		)ô 		)ð 		)ð )9ˆŒ
Ô%àŒ×#Ò#ÝÔ<ÀÐHÑHÔHñ	
ô 	
ð 	
ð Ô×$Ò$ÝÔ(¨°Ñ8Ô8¸)ñ
ô 
ˆð	ð 	ð 	ð 	ð 	ð
 	
�Š�jÑ!Ô!Ð!ð	Tð 	Tð 	Tð 	Tð 	Tð
 	
�Š�kÑ"Ô"Ð"à×%Ò%Ñ'Ô'Ð'ð 	Œ	�ŠÑÔÐõ 	Œ
‰ŒˆàŒ	�ŠÑÔÐØˆr)   c                 óü  ‡ — ‰ j                              t          j        dd¬¦  «        ¦  «         ‰ j                             t          j        dd¦  «        d¦  «        }‰ j                             t          j        dd¦  «        d¦  «        }t          ||g¦  «        }d„ }| 	                    |¦  «         ˆ fd„}| 	                    |¦  «         ‰  
                    ¦   «          ‰ j                             ¦   «          |S )	z 
        Two different correct login attempts can be made on the same root
        object at the same time and produce two different resulting avatars.
        ró  s   quux)rÜ   Úbazrò  rŸ  ó   bazc                 óz   — | \  }}t          |                     d¦  «        |                     d¦  «        g¦  «        S )NÚgetAvatarId)r   rà   )r�  ÚfirstÚseconds      r'   r  z5NewCredTests.test_concurrentLogin.<locals>.cbLoggedIn}  sA   € Ø$‰OˆU�FÝ Ø×!Ò! -Ñ0Ô0°&×2CÒ2CÀMÑ2RÔ2RÐSñô ð r)   c                 ój   •— | \  }}‰                      |d¦  «         ‰                      |d¦  «         d S )Nrò  r  )rW  )r­   r  r  r%   s      €r'   ÚcbAvatarIdsz6NewCredTests.test_concurrentLogin.<locals>.cbAvatarIds…  s>   ø€ Ø‰MˆE�6Ø×Ò˜U FÑ+Ô+Ð+Ø×Ò˜V VÑ,Ô,Ð,Ð,Ð,r)   )r
   r  r   r�   rh   r·  r	   rô  r   r^  rÉ  rK   rM   )r%   Ú
firstLoginÚsecondLoginr#  r  r  s   `     r'   Útest_concurrentLoginz!NewCredTests.test_concurrentLoginl  s  ø€ ð
 	Œ×#Ò#ÝÔ<ÀÈWÐUÑUÔUñ	
ô 	
ð 	
ð Ô'×-Ò-ÝÔ(¨°Ñ8Ô8¸)ñ
ô 
ˆ
ð Ô(×.Ò.ÝÔ(¨°Ñ9Ô9¸9ñ
ô 
ˆõ ˜: {Ð3Ñ4Ô4ˆð	ð 	ð 	ð 	
�Š�jÑ!Ô!Ð!ð	-ð 	-ð 	-ð 	-ð 	-ð
 	
�Š�kÑ"Ô"Ð"à×%Ò%Ñ'Ô'Ð'ØŒ	�ŠÑÔÐàˆr)   c                 ó2  ‡ — ‰ j                              t          j        d¬¦  «        ¦  «         ‰ j                             t          j        dd¦  «        ¦  «        }‰ j                             t          j        dd¦  «        ¦  «        }‰                      |t          ¦  «         ‰                      |t          ¦  «         t          ||g¦  «        }ˆ fd„}|                     |¦  «         ‰                      ¦   «          ‰ j                             ¦   «          |S )zz
        Test that a login attempt with an invalid user or invalid password
        fails in the appropriate way.
        rú  rû  s
   nosuchuserrü  s	   wrongpassc                 ó‚   •— ‰                      t          ¦  «        }‰                     t          |¦  «        d¦  «         d S )NrÙ   )ÚflushLoggedErrorsr   rW  rÎ  ©ÚignoreÚerrorsr%   s     €r'   Úcleanupz;NewCredTests.test_badUsernamePasswordLogin.<locals>.cleanup¥  s9   ø€ Ø×+Ò+Õ,=Ñ>Ô>ˆFØ×Ò�S ™[œ[¨!Ñ,Ô,Ð,Ð,Ð,r)   )r
   r  r   r�   rh   r·  r	   rô  rö  r   r   r^  rÉ  rK   rM   )r%   r   r!  r#  r)  s   `    r'   Útest_badUsernamePasswordLoginz*NewCredTests.test_badUsernamePasswordLogin‘  s  ø€ ð
 	Œ×#Ò#ÝÔ<À'ÐJÑJÔJñ	
ô 	
ð 	
ð Ô'×-Ò-ÝÔ(¨¸Ñ@Ô@ñ
ô 
ˆ
ð Ô(×.Ò.ÝÔ(¨°,Ñ?Ô?ñ
ô 
ˆð 	×Ò˜:Õ'8Ñ9Ô9Ð9Ø×Ò˜;Õ(9Ñ:Ô:Ð:Ý˜: {Ð3Ñ4Ô4ˆð	-ð 	-ð 	-ð 	-ð 	-ð 	
�Š�gÑÔÐà×%Ò%Ñ'Ô'Ð'ØŒ	�ŠÑÔÐàˆr)   c                 ót  — | j                              t          j        ¦   «         ¦  «         | j                             t          j        ¦   «         d¦  «        }d„ }|                     |¦  «         |                     | j	        d¦  «         |  
                    ¦   «          | j                             ¦   «          |S )z·
        Verify that a PB server using a portal configured with a checker which
        allows IAnonymous credentials can be logged into using IAnonymous
        credentials.
        rŸ  c                 ó.   — |                       dd¦  «        S ©NrT  é{   r±  ©rä   s    r'   r  z4NewCredTests.test_anonymousLogin.<locals>.cbLoggedIn¹  ó   € Ø×)Ò)¨&°#Ñ6Ô6Ð6r)   r.  )r
   r  r   ÚAllowAnonymousAccessrh   r·  r	   Ú	Anonymousr^  rW  rÉ  rK   rM   )r%   r#  r  s      r'   Útest_anonymousLoginz NewCredTests.test_anonymousLogin°  s§   € ð 	Œ×#Ò#¥HÔ$AÑ$CÔ$CÑDÔDÐDØÔ×$Ò$¥[Ô%:Ñ%<Ô%<¸iÑHÔHˆð	7ð 	7ð 	7ð 	
�Š�jÑ!Ô!Ð!à	�Š�dÔ&¨Ñ,Ô,Ð,à×%Ò%Ñ'Ô'Ð'ØŒ	�ŠÑÔÐØˆr)   c                 ó~  ‡ — ‰ j                              t          j        d¬¦  «        ¦  «         ‰ j                             t          j        ¦   «         d¦  «        }‰                      |t          ¦  «         ˆ fd„}| 
                    |¦  «         ‰                      ¦   «          ‰ j                             ¦   «          |S )zg
        Verify that without an anonymous checker set up, anonymous login is
        rejected.
        Úpassrû  rŸ  c                 ó‚   •— ‰                      t          ¦  «        }‰                     t          |¦  «        d¦  «         d S rš   )r%  r   rW  rÎ  r&  s     €r'   r)  z=NewCredTests.test_anonymousLoginNotPermitted.<locals>.cleanupÏ  s9   ø€ Ø×+Ò+Õ,@ÑAÔAˆFØ×Ò�S ™[œ[¨!Ñ,Ô,Ð,Ð,Ð,r)   )r
   r  r   r�   rh   r·  r	   r2  rö  r   r^  rÉ  rK   rM   )r%   r#  r)  s   `  r'   Útest_anonymousLoginNotPermittedz,NewCredTests.test_anonymousLoginNotPermittedÄ  sÀ   ø€ ð
 	Œ×#Ò#ÝÔ<À&ÐIÑIÔIñ	
ô 	
ð 	
ð Ô×$Ò$¥[Ô%:Ñ%<Ô%<¸iÑHÔHˆØ×Ò˜1Õ2Ñ3Ô3Ð3ð	-ð 	-ð 	-ð 	-ð 	-ð 	
�Š�gÑÔÐà×%Ò%Ñ'Ô'Ð'ØŒ	�ŠÑÔÐàˆr)   c                 óÎ  — | j                              t          j        ¦   «         ¦  «         | j                              t          j        d¬¦  «        ¦  «         | j                             t          j        ¦   «         d¦  «        }d„ }| 	                    |¦  «         | 	                    | j
        d¦  «         |                      ¦   «          | j                             ¦   «          |S )z„
        Like L{test_anonymousLogin} but against a portal with a checker for
        both IAnonymous and IUsernamePassword.
        rú  rû  rŸ  c                 ó.   — |                       dd¦  «        S r-  r±  r/  s    r'   rÿ  zENewCredTests.test_anonymousLoginWithMultipleCheckers.<locals>.cbLoginå  r0  r)   r.  )r
   r  r   r1  r�   rh   r·  r	   r2  r^  rW  rÉ  rK   rM   ©r%   r#  rÿ  s      r'   Ú'test_anonymousLoginWithMultipleCheckersz4NewCredTests.test_anonymousLoginWithMultipleCheckersÚ  sÔ   € ð
 	Œ×#Ò#¥HÔ$AÑ$CÔ$CÑDÔDÐDØŒ×#Ò#ÝÔ<À'ÐJÑJÔJñ	
ô 	
ð 	
ð Ô×$Ò$¥[Ô%:Ñ%<Ô%<¸iÑHÔHˆð	7ð 	7ð 	7ð 	
�Š�gÑÔÐà	�Š�dÔ&¨Ñ,Ô,Ð,à×%Ò%Ñ'Ô'Ð'ØŒ	�ŠÑÔÐàˆr)   c                 óÒ  — | j                              t          j        ¦   «         ¦  «         | j                              t          j        d¬¦  «        ¦  «         | j                             t          j        dd¦  «        d¦  «        }d„ }| 	                    |¦  «         | 	                    | j
        d¦  «         |                      ¦   «          | j                             ¦   «          |S )z€
        Like L{test_anonymousLoginWithMultipleCheckers} but check that
        username/password authentication works.
        rú  rû  rü  rŸ  c                 ó0   — |                       ddd¦  «        S )NÚaddr  é   r±  r/  s    r'   rÿ  zINewCredTests.test_authenticatedLoginWithMultipleCheckers.<locals>.cbLoginþ  s   € Ø×)Ò)¨%°°bÑ9Ô9Ð9r)   r.  )r
   r  r   r1  r�   rh   r·  r	   rô  r^  rW  rÉ  rK   rM   r:  s      r'   Ú+test_authenticatedLoginWithMultipleCheckersz8NewCredTests.test_authenticatedLoginWithMultipleCheckersñ  sÝ   € ð
 	Œ×#Ò#¥HÔ$AÑ$CÔ$CÑDÔDÐDØŒ×#Ò#ÝÔ<À'ÐJÑJÔJñ	
ô 	
ð 	
ð Ô×$Ò$ÝÔ(¨°'Ñ:Ô:¸Iñ
ô 
ˆð	:ð 	:ð 	:ð 	
�Š�gÑÔÐà	�Š�dÔ&¨Ñ,Ô,Ð,à×%Ò%Ñ'Ô'Ð'ØŒ	�ŠÑÔÐàˆr)   c                 óª  — | j                              t          j        d¬¦  «        ¦  «         | j                             t          j        dd¦  «        d¦  «        }d„ }|                     |¦  «         d„ }|                     |¦  «         |                     | j	        ¦  «         |  
                    ¦   «          | j                             ¦   «          |S )zb
        Verify that a viewpoint can be retrieved after authenticating with
        cred.
        rú  rû  rü  rŸ  c                 ó,   — |                       d¦  «        S )NÚgetViewPointr±  r/  s    r'   rÿ  z'NewCredTests.test_view.<locals>.cbLogin  s   € Ø×)Ò)¨.Ñ9Ô9Ð9r)   c                 ó,   — |                       d¦  «        S )Nrù   r±  )Ú	viewpoints    r'   ÚcbViewz&NewCredTests.test_view.<locals>.cbView  s   € Ø×'Ò'¨Ñ0Ô0Ð0r)   )r
   r  r   r�   rh   r·  r	   rô  r^  rÍ  rÉ  rK   rM   )r%   r#  rÿ  rF  s       r'   Ú	test_viewzNewCredTests.test_view
  sÞ   € ð
 	Œ×#Ò#ÝÔ<À'ÐJÑJÔJñ	
ô 	
ð 	
ð Ô×$Ò$ÝÔ(¨°'Ñ:Ô:¸Iñ
ô 
ˆð	:ð 	:ð 	:ð 	
�Š�gÑÔÐð	1ð 	1ð 	1ð 	
�Š�fÑÔÐà	�Š�d”oÑ&Ô&Ð&à×%Ò%Ñ'Ô'Ð'ØŒ	�ŠÑÔÐàˆr)   r0   )r*   r+   r,   r3   rP  rÉ  r   r`   r   ra   rÌ  r×  rà  rí  rð  rø  r  r  r"  r*  r3  r7  r;  r@  rG  r-   r)   r'   rÃ  rÃ  ?  sN  € € € € € ðð ð	2ð 	2ð 	2ðYð Yð Yð YðB %�W”_ TÔ%9Ñ:Ô:ðHð Hð Hð Hð(ð ð ð6:ð :ð :ð01:ð 1:ð 1:ðfJð Jð JðIð Ið Ið$/ð /ð /ðb4ð 4ð 4ðl#ð #ð #ðJð ð ð>ð ð ð(ð ð ð,ð ð ð.ð ð ð2ð ð ð ð r)   rÃ  c                   ó    — e Zd Zd„ Zd„ Zd„ ZdS )ÚNonSubclassingPerspectivec                 ó   — d S r0   r-   r�  s     r'   rF   z"NonSubclassingPerspective.__init__*  r¢  r)   c                 óŠ   — |                      || ¦  «        }|                      || ¦  «        }|                     |||f¦  «        S r0   )ÚunserializeÚ	serialize)r%   rb   Úmessager  Úkwargss        r'   ÚperspectiveMessageReceivedz4NonSubclassingPerspective.perspectiveMessageReceived.  sG   € Ø×!Ò! $¨Ñ-Ô-ˆØ×#Ò# F¨DÑ1Ô1ˆØ×Ò ¨$°Ð 7Ñ8Ô8Ð8r)   c                 ó   — d| _         d S r–  r—  r1   s    r'   r™  z NonSubclassingPerspective.logout4  rš  r)   N)r*   r+   r,   rF   rP  r™  r-   r)   r'   rI  rI  (  sA   € € € € € ðð ð ð9ð 9ð 9ðð ð ð ð r)   rI  c                   ó   — e Zd ZdZd„ Zd„ ZdS )ÚNSPTestsz
    Tests for authentication against a realm where the L{IPerspective}
    implementation is not a subclass of L{Avatar}.
    c                 óJ  — t          ¦   «         | _        t          | j        _        t	          j        | j        ¦  «        | _        t          j        ¦   «         | _        | j         	                    dd¦  «         | j         
                    | j        ¦  «         t          t          j        | j        ¦  «        ¦  «        | _        t          j        d| j        d¬¦  «        | _        |                      | j        j        ¦  «         | j                             ¦   «         j        | _        d S )Nrü  rú  r   r\   )r¤  )r�  r”   rI  r¢  r
   r’   r   r�   r•   ÚaddUserr  r   r   r‘   rƒ  r   r  r‚  rn   rˆ  r�  Úportnor1   s    r'   rP  zNSPTests.setUp>  sÔ   € Ý‘[”[ˆŒ
Ý(AˆŒ
Ô%Ý”m D¤JÑ/Ô/ˆŒÝÔGÑIÔIˆŒØŒ×Ò˜W gÑ.Ô.Ð.ØŒ×#Ò# D¤LÑ1Ô1Ð1Ý&¥rÔ'9¸$¼+Ñ'FÔ'FÑGÔGˆŒÝÔ% a¨¬ÀÐMÑMÔMˆŒ	Ø�Š˜œ	Ô/Ñ0Ô0Ð0Ø”i×'Ò'Ñ)Ô)Ô.ˆŒˆˆr)   c                 óZ  ‡ ‡— t          j        ¦   «         Š‰                     t          j        dd¦  «        d¦  «        }t          j        d‰ j        ‰¦  «         |                     d„ ¦  «         |                     ‰ j	        dddd	if¦  «         ˆˆ fd
„}|                     |¦  «         |S )z�
        An L{IPerspective} implementation which does not subclass
        L{Avatar} can expose remote methods for the client to call.
        rü  rú  rŸ  r\   c                 ó2   — |                       ddd¬¦  «        S )NÚANYTHINGÚherer  )rÂ  r±  )ry  s    r'   r8   z#NSPTests.test_NSP.<locals>.<lambda>R  s   €  §¢¨Z¸ÀU Ñ KÔ K€ r)   rY  )rZ  rÂ  r  c                 ó€   •— ‰                      ¦   «          ‰j        j        D ]}|j                             ¦   «          Œd S r0   )rÓ  rƒ  Ú	protocolsrU   r‡  )r  ry  rƒ  r%   s     €€r'   r)  z"NSPTests.test_NSP.<locals>.cleanupU  sJ   ø€ Ø×ÒÑ Ô Ð Ø”\Ô+ð -ð -�Ø”×*Ò*Ñ,Ô,Ð,Ð,ð-ð -r)   )
r   r“   r·  r	   rô  r   r€  rV  r^  rW  )r%   r#  r)  rƒ  s   `  @r'   Útest_NSPzNSPTests.test_NSPJ  sº   øø€ õ
 Ô$Ñ&Ô&ˆØ�MŠM�+Ô6°wÀÑHÔHÈ)ÑTÔTˆÝÔ˜;¨¬°WÑ=Ô=Ð=Ø	�ŠÐKÐKÑLÔLÐLØ	�Š�dÔ&¨°YÀÈÀÐ(OÑPÔPÐPð	-ð 	-ð 	-ð 	-ð 	-ð 	-ð
 	
�Š�gÑÔÐØˆr)   N)r*   r+   r,   r3   rP  r]  r-   r)   r'   rS  rS  8  s<   € € € € € ðð ð

/ð 
/ð 
/ðð ð ð ð r)   rS  c                   ó   — e Zd ZdZd„ Zd„ ZdS )Ú
IForwardedzA
    Interface used for testing L{util.LocalAsyncForwarder}.
    c                  ó   — dS )z,
        Simple synchronous method.
        Nr-   r-   r)   r'   Ú	forwardMezIForwarded.forwardMec  ó   € € € r)   c                  ó   — dS )z-
        Simple asynchronous method.
        Nr-   r-   r)   r'   ÚforwardDeferredzIForwarded.forwardDeferredh  rb  r)   N)r*   r+   r,   r3   ra  rd  r-   r)   r'   r_  r_  ^  s<   € € € € € ðð ðð ð ð
ð ð ð ð r)   r_  c                   ó,   — e Zd ZdZdZdZd„ Zd„ Zd„ ZdS )Ú	ForwardedzÚ
    Test implementation of L{IForwarded}.

    @ivar forwarded: set if C{forwardMe} is called.
    @type forwarded: C{bool}
    @ivar unforwarded: set if C{dontForwardMe} is called.
    @type unforwarded: C{bool}
    Fc                 ó   — d| _         dS )z6
        Set a local flag to test afterwards.
        TN)Ú	forwardedr1   s    r'   ra  zForwarded.forwardMe|  s   € ð ˆŒˆˆr)   c                 ó   — d| _         dS )zv
        Set a local flag to test afterwards. This should not be called as it's
        not in the interface.
        TN)Úunforwardedr1   s    r'   ÚdontForwardMezForwarded.dontForwardMe‚  s   € ð
  ˆÔÐÐr)   c                 ó    — t          d¦  «        S )z0
        Asynchronously return C{True}.
        T)r   r1   s    r'   rd  zForwarded.forwardDeferred‰  s   € õ �t‰}Œ}Ðr)   N)	r*   r+   r,   r3   rh  rj  ra  rk  rd  r-   r)   r'   rf  rf  n  sW   € € € € € ðð ð €IØ€Kðð ð ð ð  ð  ðð ð ð ð r)   rf  c                   ó0   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ ZdS )ÚSpreadUtilTestsz+
    Tests for L{twisted.spread.util}.
    c                 óv   — t          ¦   «         }|                      |                     dd¦  «        d¦  «         dS )zk
        Call a synchronous method of a L{util.LocalAsRemote} object and check
        the result.
        Úadd1rÙ   rÚ   N)r€  rW  rà   rd  s     r'   Ú	test_synczSpreadUtilTests.test_sync•  s9   € õ
 ÑÔˆØ×Ò˜Ÿš f¨aÑ0Ô0°!Ñ4Ô4Ð4Ð4Ð4r)   c                 óÚ   — t          ¦   «         }t          ¦   «         }|                     ddd¬¦  «        }|                      |t          ¦  «         |                     | j        d¦  «         |S )zm
        Call an asynchronous method of a L{util.LocalAsRemote} object and check
        the result.
        r>  rÙ   rÞ   )r®   rÞ  )r€  rà   rV  r   r^  rW  )r%   re  r#  s      r'   Ú
test_asynczSpreadUtilTests.test_async�  sc   € õ
 ÑÔˆÝÑÔˆØ�LŠL˜  QˆLÑ'Ô'ˆØ×Ò˜a¥Ñ*Ô*Ð*Ø	�Š�dÔ&¨Ñ*Ô*Ð*Øˆr)   c                 óŠ   ‡ — t          ¦   «         }|                     d¦  «        }ˆ fd„}|                     ˆ fd„|¦  «         |S )zG
        Test an asynchronous failure on a remote method call.
        r—  c                 ó|   •— ‰                      | t          j        ¦  «         |                      t          ¦  «         d S r0   )rV  r   r`   ÚtraprÀ   )r0  r%   s    €r'   Úebz*SpreadUtilTests.test_asyncFail.<locals>.eb°  s3   ø€ Ø×!Ò! !¥W¤_Ñ5Ô5Ð5Ø�FŠF•<Ñ Ô Ð Ð Ð r)   c                 ó.   •— ‰                      d¦  «        S )Nzsupposed to failr–  )rZ  r%   s    €r'   r8   z0SpreadUtilTests.test_asyncFail.<locals>.<lambda>´  s   ø€  4§9¢9Ð-?Ñ#@Ô#@€ r)   )r€  rà   r"  )r%   re  r#  rw  s   `   r'   Útest_asyncFailzSpreadUtilTests.test_asyncFail©  s_   ø€ õ ÑÔˆØ�LŠL˜Ñ Ô ˆð	!ð 	!ð 	!ð 	!ð 	!ð 	
�ŠÐ@Ð@Ð@Ð@À"ÑEÔEÐEØˆr)   c                 óŠ   — t          ¦   «         }|                     d¦  «        }|                       |d¦  «        d¦  «         dS )zM
        Test the C{remoteMethod} facility of L{util.LocalAsRemote}.
        rp  rÚ   rÞ   N)r€  r¼  rW  )r%   re  Úms      r'   Útest_remoteMethodz!SpreadUtilTests.test_remoteMethod·  sD   € õ ÑÔˆØ�NŠN˜6Ñ"Ô"ˆØ×Ò˜˜˜1™œ˜qÑ!Ô!Ð!Ð!Ð!r)   c                 ó¬  — t          ¦   «         }t          j        |t          ¦  «        }|                     d¦  «         |                      |j        ¦  «         |                     d¦  «         |                      |j        ¦  «         |                     d¦  «        }g }| 	                    |j
        ¦  «         |                      |d         d¦  «         dS )ze
        Test a call to L{util.LocalAsyncForwarder} using L{Forwarded} local
        object.
        ra  rk  rd  r   rQ   N)rf  r   ÚLocalAsyncForwarderr_  rà   rÍ  rh  rX  rj  r^  r  rW  )r%   r0  ÚlfÚrrrÏ  s        r'   Útest_localAsyncForwarderz(SpreadUtilTests.test_localAsyncForwarder¿  s¸   € õ
 ‰KŒKˆÝÔ% a­Ñ4Ô4ˆØ
�Š�kÑ"Ô"Ð"Ø�Š˜œÑ$Ô$Ð$Ø
�Š�oÑ&Ô&Ð&Ø×Ò˜œÑ'Ô'Ð'Ø�]Š]Ð,Ñ-Ô-ˆØˆØ
�Š�q”xÑ Ô Ð Ø×Ò˜˜1œ˜qÑ!Ô!Ð!Ð!Ð!r)   N)	r*   r+   r,   r3   rq  rs  ry  r|  r�  r-   r)   r'   rn  rn  �  si   € € € € € ðð ð5ð 5ð 5ð
ð 
ð 
ðð ð ð"ð "ð "ð"ð "ð "ð "ð "r)   rn  c                   ó*   — e Zd ZdZd„ Zd„ Zd„ Zd„ ZdS )ÚPBWithSecurityOptionsTestsz&
    Test security customization.
    c                 ó    — t          j        ¦   «         }|                     d¦  «        }|                      |j        t
          j        ¦  «         dS )zl
        By default, client broker should use C{jelly.globalSecurity} as
        security settings.
        N)r   r“   rj   r»  Úsecurityr   ÚglobalSecurity©r%   rƒ  rb   s      r'   Ú!test_clientDefaultSecurityOptionsz<PBWithSecurityOptionsTests.test_clientDefaultSecurityOptionsÕ  sD   € õ
 Ô$Ñ&Ô&ˆØ×&Ò& tÑ,Ô,ˆØ�Š�f”o¥uÔ';Ñ<Ô<Ð<Ð<Ð<r)   c                 óº   — t          j        t          ¦   «         ¦  «        }|                     d¦  «        }|                      |j        t          j        ¦  «         dS )zl
        By default, server broker should use C{jelly.globalSecurity} as
        security settings.
        N)r   r‘   r<  rj   r»  r…  r   r†  r‡  s      r'   Ú!test_serverDefaultSecurityOptionsz<PBWithSecurityOptionsTests.test_serverDefaultSecurityOptionsÞ  sJ   € õ
 Ô$¥V¡X¤XÑ.Ô.ˆØ×&Ò& tÑ,Ô,ˆØ�Š�f”o¥uÔ';Ñ<Ô<Ð<Ð<Ð<r)   c                 ó¶   — t          j        ¦   «         }t          j        |¬¦  «        }|                     d¦  «        }|                      |j        |¦  «         dS )zs
        Check that the security settings are passed from the client factory to
        the broker object.
        ©r…  N)r   ÚSecurityOptionsr   r“   rj   r»  r…  ©r%   r…  rƒ  rb   s       r'   Ú test_clientSecurityCustomizationz;PBWithSecurityOptionsTests.test_clientSecurityCustomizationç  sT   € õ
 Ô(Ñ*Ô*ˆÝÔ$¨hÐ7Ñ7Ô7ˆØ×&Ò& tÑ,Ô,ˆØ�Š�f”o xÑ0Ô0Ð0Ð0Ð0r)   c                 óÐ   — t          j        ¦   «         }t          j        t	          ¦   «         |¬¦  «        }|                     d¦  «        }|                      |j        |¦  «         dS )zs
        Check that the security settings are passed from the server factory to
        the broker object.
        rŒ  N)r   r�  r   r‘   r<  rj   r»  r…  rŽ  s       r'   Ú test_serverSecurityCustomizationz;PBWithSecurityOptionsTests.test_serverSecurityCustomizationñ  sZ   € õ
 Ô(Ñ*Ô*ˆÝÔ$¥V¡X¤X¸ÐAÑAÔAˆØ×&Ò& tÑ,Ô,ˆØ�Š�f”o xÑ0Ô0Ð0Ð0Ð0r)   N)r*   r+   r,   r3   rˆ  rŠ  r�  r‘  r-   r)   r'   rƒ  rƒ  Ð  sZ   € € € € € ðð ð=ð =ð =ð=ð =ð =ð1ð 1ð 1ð1ð 1ð 1ð 1ð 1r)   rƒ  r0   )�r3   rè  r’  ræ  rJ   r´  Úcollectionsr   Úior   rk   Útypingr   Úzope.interfacer   r   Útwisted.credr   r	   r
   Útwisted.cred.errorr   r   Útwisted.internetr   r   r   r   Útwisted.internet.deferr   r   r   Útwisted.internet.errorr   Útwisted.internet.testingr   Útwisted.protocols.policiesr   Útwisted.pythonr   r   Útwisted.python.compatr   Útwisted.spreadr   r   r   r   Útwisted.trialr   ÚViewabler    r  r#   ÚIRealmr5   r@   rv   rx   r„   r–   r¸  r˜   r£   ÚCopyabler§   Ú
RemoteCopyr´   ÚsetUnjellyableForClassr¸   rÄ   ÚsetUnjellyableFactoryForClassrÆ   Ú	CacheablerÍ   rÑ   rÓ   ÚRemoteCacherë   ró   r   r	  r  r&  r-  r1  r9  ÚRootr<  rE  ÚSynchronousTestCaserK  r‘   rr  ÚTestCaserz  r�  r  r  r  r  r  r"  r+  ÚPublishablerM  ÚRemotePublishedrQ  r  r[  r    rv  rj  ri  ÚLocalAsRemoter€  r9   rŠ  r�  r‘  r©  r±  rÃ  rI  rS  r_  rf  rn  rƒ  r-   r)   r'   ú<module>r¯     s�  ððð ð 
€	€	€	Ø 	€	€	€	Ø 
€
€
€
Ø €€€Ø €€€Ø Ð Ð Ð Ð Ð Ø "Ð "Ð "Ð "Ð "Ð "Ø Ð Ð Ð Ð Ð à 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1à 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ø FÐ FÐ FÐ FÐ FÐ FÐ FÐ FØ =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ð =Ø CÐ CÐ CÐ CÐ CÐ CÐ CÐ CÐ CÐ CØ 9Ð 9Ð 9Ð 9Ð 9Ð 9Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ø 6Ð 6Ð 6Ð 6Ð 6Ð 6Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø +Ð +Ð +Ð +Ð +Ð +Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ø "Ð "Ð "Ð "Ð "Ð "ð+ð +ð +ð +ð +ˆBŒKñ +ô +ð +ðð ð ð ð �r”yñ ô ð ð €ˆVŒ]ÑÔðGð Gð Gð Gð Gñ Gô Gñ ÔðGð8ð 8ð 8ð 8ð 8ñ 8ô 8ð 8ðv0,ð 0,ð 0,ðf4ð 4ð 4ð 4ð 4ñ 4ô 4ð 4ðB ð  ð  ð  ð   ñ  ô  ð  ð4Fð Fð Fð Fðð ð ð ð �2Ô#ñ ô ð ðð ð ð ð �2Ô#ñ ô ð ð
ð ð ð ð �”ñ ô ð ð	ð 	ð 	ð 	ð 	�b”mñ 	ô 	ð 	ð €Ô ˜* oÑ 6Ô 6Ð 6ð
,ð 
,ð 
,ð 
,ð 
,˜œñ 
,ô 
,ð 
,ðð ð ð  !€Ô  Ð!2Ð4EÑ FÔ FÐ Fð(ð (ð (ð (ð (�Ô!ñ (ô (ð (ðð ð ð ð �"”,ñ ô ð ðð ð ð ð ˜RÔ-ñ ô ð ð!ð !ð !ð !ð ! 2¤<ñ !ô !ð !ð*%ð %ð %ð %ð %˜œñ %ô %ð %ð €Ô Ð6Ð8JÑ KÔ KÐ Kðð ð ð ð �r”~ñ ô ð ð €Ô ˜+Ð'7Ñ 8Ô 8Ð 8ðð ð ð ð �"Ô"ñ ô ð ð5ð 5ð 5ð 5ð 5�Ô!ñ 5ô 5ð 5ðð ð ð ð �RÔ%ñ ô ð ð,,ð ,ð ,ð ,ð ,ˆrÔñ ,ô ,ð ,ðð ð ð ð �2”; ¤ñ ô ð ð
 €Ô ˜,¨Ñ 5Ô 5Ð 5ð'ð 'ð 'ð 'ð '�B”K ¤ñ 'ô 'ð 'ð €Ô ˜-¨Ñ 7Ô 7Ð 7ðð ð ð ð ˜œ b¤nñ ô ð ð
 €Ô Ð+Ð->Ñ ?Ô ?Ð ?ðð ð ð ð ˆRŒWñ ô ð ðð ð ð ð �R”Wñ ô ð ðOð Oð Oð Oð O�HÔ0ñ Oô Oð Oðdð ð ð ð  BÔ$6ñ ô ð ð@4ð 4ð 4ð 4ð 4˜(Ô+ñ 4ô 4ð 4ðnR
ð R
ð R
ð R
ð R
�(Ô#ñ R
ô R
ð R
ðj €	à€Ø€ðð ð ð#ð #ð #ð #ð #�Ô ñ #ô #ð #ð#ð #ð #ð #ð #�BÔ$ñ #ô #ð #ði5ð i5ð i5ð i5ð i5�(Ô#ñ i5ô i5ð i5ðX'ð 'ð 'ð 'ð '�gÔ)ñ 'ô 'ð 'ð
 ð  ð  ð  ð  ˆgÔ%ñ  ô  ð  ð
ð ð ð ð �2Ô#ñ ô ð ð €Ô ˜/¨7Ñ 3Ô 3Ð 3ð@-ð @-ð @-ð @-ð @-˜Ô*ñ @-ô @-ð @-ðF	ð 	ð 	ð 	ð 	ˆyñ 	ô 	ð 	ðð ð ð ð �"”+ñ ô ð ð
ð ð ð ð �Ô!ñ ô ð ð

ð 
ð 
ð 
ð 
�dÔ(ñ 
ô 
ð 
ð €ˆRŒ_ÑÔð ð  ð  ð  ð  �B”Iñ  ô  ñ Ôð ðFXð Xð Xð Xð Xñ Xô Xð XðB/ð /ð /ð /ð /ˆRŒ[ñ /ô /ð /ð
Hð Hð Hð Hð H�ñ Hô Hð Hð*3*ð 3*ð 3*ð 3*ð 3*�xÔ(ñ 3*ô 3*ð 3*ðlfð fð fð fð f�8Ô$ñ fô fð fðR €ˆRŒ_ÑÔðð ð ð ð ñ ô ñ Ôðð#ð #ð #ð #ð #ˆxÔ ñ #ô #ð #ðLð ð ð ð �ñ ô ð ð  €ˆZÑÔðð ð ð ð ñ ô ñ ÔððB="ð ="ð ="ð ="ð ="�hÔ'ñ ="ô ="ð ="ð@)1ð )1ð )1ð )1ð )1 Ô!2ñ )1ô )1ð )1ð )1ð )1r)   