§
    ÈtºfÙb  ã                   ó(  — d dl Z d dlZd dlZd dlZd dlmZ d dlmZ d dlm	Z	 d dl
mZmZmZmZ d dlmZ d dlmZ d dlmZmZmZ d d	lmZ d d
lmZ d dlmZ d dlmZ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+m,Z, 	 d dlm-Z-m.Z. n# e/$ r Y nw xY w e&d¦  «        Z0e0rd dl1m2Z2 d dl3m4Z4m5Z5m6Z6 nd dl7m4Z4  G d„ d¦  «        Z2	 d dl8m5Z9 e9Z:n # e/$ rZ;dZ: e<e;¦  «        Z=[;Y dZ;[;ndZ;[;ww xY w G d„ d¦  «        Z> G d„ de,¦  «        Z? G d„ dej@        ¦  «        ZA G d „ d!ejB        ¦  «        ZC G d"„ d#ejD        ¦  «        ZE G d$„ d%ejD        ¦  «        ZF G d&„ d'ej@        ¦  «        ZGd>d)„ZH G d*„ d+¦  «        ZI G d,„ d-eI¦  «        ZJ ee4¦  «         G d.„ d/e2¦  «        ¦   «         ZK G d0„ d1¦  «        ZL G d2„ d3eI¦  «        ZM G d4„ d5¦  «        ZN G d6„ d7eIeNe,¦  «        ZO G d8„ d9eJeNe,¦  «        ZP G d:„ d;eMeNe,¦  «        ZQ G d<„ d=eJe,¦  «        ZRdS )?é    N)Úcount)Úimplementer)Ú
ConchError)ÚprivateDSA_opensshÚprivateRSA_opensshÚpublicDSA_opensshÚpublicRSA_openssh©ÚConchTestRealm)Úportal)ÚdeferÚprotocolÚreactor)ÚProcessExitedAlready)ÚLoopingCall)ÚgetProcessValue)ÚfilepathÚlogÚruntime)ÚFilePath)Úwhich)ÚrequireModule)ÚHAS_IPV6ÚskipWithoutIPv6)ÚSkipTestÚTestCase)ÚConchTestServerFactoryÚconchTestPublicKeyCheckerÚcryptography)Ú	ConchUser)ÚISessionÚ
SSHSessionÚwrapProtocol)r!   c                   ó   — e Zd ZdS )r    N)Ú__name__Ú
__module__Ú__qualname__© ó    ú\/var/www/surfInsights/venv3-11/lib/python3.11/site-packages/twisted/conch/test/test_conch.pyr    r    1   s   € € € € € Øˆr)   r    )r"   c                   ó   — e Zd ZdZdZd„ ZdS )Ú	FakeStdiozø
    A fake for testing L{twisted.conch.scripts.conch.SSHSession.eofReceived} and
    L{twisted.conch.scripts.cftp.SSHSession.eofReceived}.

    @ivar writeConnLost: A flag which records whether L{loserWriteConnection}
        has been called.
    Fc                 ó   — d| _         dS )z9
        Record the call to loseWriteConnection.
        TN)ÚwriteConnLost©Úselfs    r*   ÚloseWriteConnectionzFakeStdio.loseWriteConnectionJ   s   € ð "ˆÔÐÐr)   N)r%   r&   r'   Ú__doc__r.   r1   r(   r)   r*   r,   r,   ?   s4   € € € € € ðð ð €Mð"ð "ð "ð "ð "r)   r,   c                   ó    — e Zd ZdZe€eZd„ ZdS )ÚStdioInteractingSessionTestsz>
    Tests for L{twisted.conch.scripts.conch.SSHSession}.
    Nc                 ó¨   — t          ¦   «         }t          ¦   «         }||_        |                     ¦   «          |                      |j        ¦  «         dS )z}
        L{twisted.conch.scripts.conch.SSHSession.eofReceived} loses the
        write half of its stdio connection.
        N)r,   ÚStdioInteractingSessionÚstdioÚeofReceivedÚ
assertTruer.   )r0   r7   Úchannels      r*   Útest_eofReceivedz-StdioInteractingSessionTests.test_eofReceivedY   sL   € õ
 ‘”ˆÝ)Ñ+Ô+ˆØˆŒØ×ÒÑÔÐØ�Š˜Ô+Ñ,Ô,Ð,Ð,Ð,r)   )r%   r&   r'   r2   r6   Ú_reasonÚskipr;   r(   r)   r*   r4   r4   Q   s:   € € € € € ðð ð Ð&Øˆð	-ð 	-ð 	-ð 	-ð 	-r)   r4   c                   ó    — e Zd Zd„ Zd„ Zd„ ZdS )ÚEchoc                 ó.   — t          j        d¦  «         d S )NzECHO CONNECTION MADE©r   Úmsgr/   s    r*   ÚconnectionMadezEcho.connectionMadef   ó   € ÝŒÐ&Ñ'Ô'Ð'Ð'Ð'r)   c                 ó.   — t          j        d¦  «         d S )NzECHO CONNECTION DONErA   ©r0   Úreasons     r*   ÚconnectionLostzEcho.connectionLosti   rD   r)   c                 óx   — | j                              |¦  «         d|v r| j                              ¦   «          d S d S )Nó   
)Ú	transportÚwriteÚloseConnection©r0   Údatas     r*   ÚdataReceivedzEcho.dataReceivedl   sB   € ØŒ×Ò˜TÑ"Ô"Ð"Ø�Dˆ=ˆ=ØŒN×)Ò)Ñ+Ô+Ð+Ð+Ð+ð ˆ=r)   N)r%   r&   r'   rC   rH   rP   r(   r)   r*   r?   r?   e   sA   € € € € € ð(ð (ð (ð(ð (ð (ð,ð ,ð ,ð ,ð ,r)   r?   c                   ó   — e Zd ZeZdS )ÚEchoFactoryN)r%   r&   r'   r?   r   r(   r)   r*   rR   rR   r   s   € € € € € Ø€H€H€Hr)   rR   c                   ó6   — e Zd ZdZdZdZdZd„ Zd„ Zd„ Z	d„ Z
dS )ÚConchTestOpenSSHProcessa  
    Test protocol for launching an OpenSSH client process.

    @ivar deferred: Set by whatever uses this object. Accessed using
    L{_getDeferred}, which destroys the value so the Deferred is not
    fired twice. Fires when the process is terminated.
    Nr)   c                 ó$   — | j         d c}| _         |S ©N©Údeferred©r0   Úds     r*   Ú_getDeferredz$ConchTestOpenSSHProcess._getDeferredƒ   ó   € Øœ=¨$Ðˆˆ4Œ=Øˆr)   c                 ó&   — | xj         |z  c_         d S rV   )ÚbufrN   s     r*   ÚoutReceivedz#ConchTestOpenSSHProcess.outReceived‡   s   € ØˆŒ�DÑˆŒˆˆr)   c                 ó&   — | xj         |z  c_         d S rV   )ÚproblemsrN   s     r*   ÚerrReceivedz#ConchTestOpenSSHProcess.errReceivedŠ   s   € ØˆŒ˜ÑˆŒˆˆr)   c           
      ó‚  — |j         j        dk    rl|                      ¦   «                              t	          d                     |j         j        | j                             d¦  «        ¦  «        ¦  «        ¦  «         dS | j         	                    dd¦  «        }|                      ¦   «          
                    |¦  «         dS )z~
        Called when the process has ended.

        @param reason: a Failure giving the reason for the process' end.
        r   zexit code was not 0: {} ({})Úcharmaps   
rJ   N)ÚvalueÚexitCoder[   Úerrbackr   Úformatra   Údecoder^   ÚreplaceÚcallback)r0   rG   r^   s      r*   ÚprocessEndedz$ConchTestOpenSSHProcess.processEnded�   s¼   € ð Œ<Ô  AÒ%Ð%Ø×ÒÑÔ×'Ò'ÝØ2×9Ò9ØœÔ-Øœ×,Ò,¨YÑ7Ô7ñô ñô ñô ð ð ð ð ”(×"Ò" 7¨EÑ2Ô2ˆCØ×ÒÑÔ×(Ò(¨Ñ-Ô-Ð-Ð-Ð-r)   )r%   r&   r'   r2   rX   r^   ra   r[   r_   rb   rl   r(   r)   r*   rT   rT   v   sk   € € € € € ðð ð €HØ
€CØ€Hðð ð ðð ð ðð ð ð.ð .ð .ð .ð .r)   rT   c                   óF   — 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S )ÚConchTestForwardingProcessaæ  
    Manages a third-party process which launches a server.

    Uses L{ConchTestForwardingPort} to connect to the third-party server.
    Once L{ConchTestForwardingPort} has disconnected, kill the process and fire
    a Deferred with the data received by the L{ConchTestForwardingPort}.

    @ivar deferred: Set by whatever uses this object. Accessed using
    L{_getDeferred}, which destroys the value so the Deferred is not
    fired twice. Fires when the process is terminated.
    Nc                 ó0   — || _         d| _        || _        dS )aF  
        @type port: L{int}
        @param port: The port on which the third-party server is listening.
        (it is assumed that the server is running on localhost).

        @type data: L{str}
        @param data: This is sent to the third-party server. Must end with '
'
        in order to trigger a disconnect.
        N)ÚportÚbufferrO   )r0   rp   rO   s      r*   Ú__init__z#ConchTestForwardingProcess.__init__°   s   € ð ˆŒ	ØˆŒØˆŒ	ˆ	ˆ	r)   c                 ó$   — | j         d c}| _         |S rV   rW   rY   s     r*   r[   z'ConchTestForwardingProcess._getDeferred¾   r\   r)   c                 ó.   — |                       ¦   «          d S rV   )Ú_connectr/   s    r*   rC   z)ConchTestForwardingProcess.connectionMadeÂ   s   € Ø�Š‰Œˆˆˆr)   c                 ó¼   — t          j        t          t          | | j        ¦  «        }|                     d| j        ¦  «        }|                     | j        ¦  «         |S )a  
        Connect to the server, which is often a third-party process.
        Tries to reconnect if it fails because we have no way of determining
        exactly when the port becomes available for listening -- we can only
        know when the process starts.
        ú	127.0.0.1)	r   ÚClientCreatorr   ÚConchTestForwardingPortrO   Ú
connectTCPrp   Ú
addErrbackÚ
_ebConnect)r0   ÚccrZ   s      r*   ru   z#ConchTestForwardingProcess._connectÅ   sK   € õ Ô#¥GÕ-DÀdÈDÌIÑVÔVˆØ�MŠM˜+ t¤yÑ1Ô1ˆØ	�Š�T”_Ñ%Ô%Ð%Øˆr)   c                 ó:   — t          j        d| j        ¦  «         d S )Ngš™™™™™¹?)r   Ú	callLaterru   )r0   Úfs     r*   r|   z%ConchTestForwardingProcess._ebConnectÑ   s   € ÝÔ˜#˜tœ}Ñ-Ô-Ð-Ð-Ð-r)   c                 ó®   — || _         | j                             d¦  «         | j                             ¦   «          t	          j        d| j        ¦  «         dS )zÖ
        The network connection has died; save the buffer of output
        from the network and attempt to quit the process gracefully,
        and then (after the reactor has spun) send it a KILL signal.
        ó   r   N)rq   rK   rL   rM   r   r   Ú
_reallyDie)r0   rq   s     r*   ÚforwardingPortDisconnectedz5ConchTestForwardingProcess.forwardingPortDisconnectedÔ   sP   € ð ˆŒØŒ×Ò˜WÑ%Ô%Ð%ØŒ×%Ò%Ñ'Ô'Ð'ÝÔ˜!˜Tœ_Ñ-Ô-Ð-Ð-Ð-r)   c                 ó^   — 	 | j                              d¦  «         d S # t          $ r Y d S w xY w)NÚKILL)rK   ÚsignalProcessr   r/   s    r*   rƒ   z%ConchTestForwardingProcess._reallyDieß   sE   € ð	ØŒN×(Ò(¨Ñ0Ô0Ð0Ð0Ð0øÝ#ð 	ð 	ð 	ØˆDˆDð	øøøs   ‚ ž
,«,c                 ó^   — |                       ¦   «                              | j        ¦  «         dS )zŒ
        Fire the Deferred at self.deferred with the data collected
        from the L{ConchTestForwardingPort} connection, if any.
        N)r[   rk   rq   rF   s     r*   rl   z'ConchTestForwardingProcess.processEndedå   s,   € ð
 	×ÒÑÔ×$Ò$ T¤[Ñ1Ô1Ð1Ð1Ð1r)   )r%   r&   r'   r2   rX   rr   r[   rC   ru   r|   r„   rƒ   rl   r(   r)   r*   rn   rn   ¡   s�   € € € € € ð
ð 
ð €Hðð ð ðð ð ðð ð ð
ð 
ð 
ð.ð .ð .ð	.ð 	.ð 	.ðð ð ð2ð 2ð 2ð 2ð 2r)   rn   c                   ó*   — e Zd ZdZd„ Zd„ Zd„ Zd„ ZdS )ry   zë
    Connects to server launched by a third-party process (managed by
    L{ConchTestForwardingProcess}) sends data, then reports whatever it
    received back to the L{ConchTestForwardingProcess} once the connection
    is ended.
    c                 ó"   — || _         || _        dS )zè
        @type protocol: L{ConchTestForwardingProcess}
        @param protocol: The L{ProcessProtocol} which made this connection.

        @type data: str
        @param data: The data to be sent to the third-party server.
        N)r   rO   )r0   r   rO   s      r*   rr   z ConchTestForwardingPort.__init__õ   s   € ð !ˆŒØˆŒ	ˆ	ˆ	r)   c                 óR   — d| _         | j                             | j        ¦  «         d S )Nr)   )rq   rK   rL   rO   r/   s    r*   rC   z&ConchTestForwardingPort.connectionMade   s'   € ØˆŒØŒ×Ò˜TœYÑ'Ô'Ð'Ð'Ð'r)   c                 ó&   — | xj         |z  c_         d S rV   )rq   rN   s     r*   rP   z$ConchTestForwardingPort.dataReceived  s   € ØˆŒ�tÑˆŒˆˆr)   c                 óD   — | j                              | j        ¦  «         d S rV   )r   r„   rq   rF   s     r*   rH   z&ConchTestForwardingPort.connectionLost  s    € ØŒ×0Ò0°´Ñ=Ô=Ð=Ð=Ð=r)   N)r%   r&   r'   r2   rr   rC   rP   rH   r(   r)   r*   ry   ry   í   sZ   € € € € € ðð ð	ð 	ð 	ð(ð (ð (ðð ð ð>ð >ð >ð >ð >r)   ry   Úconchc                 óÔ   — t           j        d|z  g}g }|t          | ¦  «        z   D ]A}t          |t          ¦  «        r|                     d¦  «        }|                     |¦  «         ŒB|S )Na$  -c
### Twisted Preamble
import sys, os
path = os.path.abspath(sys.argv[0])
while os.path.dirname(path) != path:
    if os.path.basename(path).startswith('Twisted'):
        sys.path.insert(0, path)
        break
    path = os.path.dirname(path)

from twisted.conch.scripts.%s import run
run()úutf-8)ÚsysÚ
executableÚlistÚ
isinstanceÚstrÚencodeÚappend)ÚargsÚmodÚstartÚmadeArgsÚargs        r*   Ú	_makeArgsr�     s{   € åŒð		ð ñ	ð€Eð" €HØ•t˜D‘z”zÑ!ð ð ˆÝ�c�3ÑÔð 	&Ø—*’*˜WÑ%Ô%ˆCØ�Š˜ÑÔÐÐØ€Or)   c                   óJ   — e Zd ZesdZed„ ¦   «         Zd„ Zd„ Zd„ Z	d„ Z
d„ ZdS )	ÚConchServerSetupMixinzcan't run without cryptographyc                  ó    — t          d¦  «        S )Ns   testuserr
   r(   r)   r*   ÚrealmFactoryz"ConchServerSetupMixin.realmFactory)  s   € å˜kÑ*Ô*Ð*r)   c                 óö  — dD ]5}t           j                             |¦  «        rt          j        |¦  «         Œ6t	          dd¦  «        5 }|                     t          ¦  «         d d d ¦  «         n# 1 swxY w Y   t	          dd¦  «        5 }|                     t          ¦  «         d d d ¦  «         n# 1 swxY w Y   t	          dd¦  «        5 }|                     t          ¦  «         d d d ¦  «         n# 1 swxY w Y   t	          dd¦  «        5 }|                     t          ¦  «         d d d ¦  «         n# 1 swxY w Y   t          j
        dd¦  «         t          j
        dd¦  «         t          d¦  «                             ¦   «         }|j        j        s|j        j        rt!          d¦  «        ‚t	          d	d¦  «        5 }|                     d
t          z   ¦  «         d d d ¦  «         d S # 1 swxY w Y   d S )N)Úrsa_testúrsa_test.pubÚdsa_testúdsa_test.pubÚkh_testr£   Úwbr¤   r¦   r¥   i€  zgprivate key readable by others despite chmod; possible windows permission issue? see https://tm.tl/9767r§   s
   127.0.0.1 )ÚosÚpathÚexistsÚremoveÚopenrL   r   r	   r   r   Úchmodr   ÚgetPermissionsÚgroupÚreadÚotherr   )r0   r€   Úpermissionss      r*   Ú_createFilesz"ConchServerSetupMixin._createFiles-  s  € ØTð 	ð 	ˆAÝŒw�~Š~˜aÑ Ô ð Ý”	˜!‘”�øÝ�*˜dÑ#Ô#ð 	( qØ�GŠGÕ&Ñ'Ô'Ð'ð	(ð 	(ð 	(ñ 	(ô 	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(øøøð 	(ð 	(ð 	(ð 	(å�. $Ñ'Ô'ð 	'¨1Ø�GŠGÕ%Ñ&Ô&Ð&ð	'ð 	'ð 	'ñ 	'ô 	'ð 	'ð 	'ð 	'ð 	'ð 	'ð 	'øøøð 	'ð 	'ð 	'ð 	'å�. $Ñ'Ô'ð 	'¨1Ø�GŠGÕ%Ñ&Ô&Ð&ð	'ð 	'ð 	'ñ 	'ô 	'ð 	'ð 	'ð 	'ð 	'ð 	'ð 	'øøøð 	'ð 	'ð 	'ð 	'å�*˜dÑ#Ô#ð 	( qØ�GŠGÕ&Ñ'Ô'Ð'ð	(ð 	(ð 	(ñ 	(ô 	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(øøøð 	(ð 	(ð 	(ð 	(å
Œ�˜UÑ#Ô#Ð#Ý
Œ�˜UÑ#Ô#Ð#Ý˜zÑ*Ô*×9Ò9Ñ;Ô;ˆØÔÔ!ð 	 [Ô%6Ô%;ð 	Ýð*ñô ð õ
 �)˜TÑ"Ô"ð 	7 aØ�GŠG�MÕ$5Ñ5Ñ6Ô6Ð6ð	7ð 	7ð 	7ñ 	7ô 	7ð 	7ð 	7ð 	7ð 	7ð 	7ð 	7ð 	7øøøð 	7ð 	7ð 	7ð 	7ð 	7ð 	7sZ   Á	A0Á0A4Á7A4ÂB2Â2B6Â9B6ÃC4Ã4C8Ã;C8ÄD6Ä6D:Ä=D:ÇG.Ç.G2Ç5G2c                 ó²   — t          j         ¦   «         }|                     d¦  «         |                     ¦   «         d         }|                     ¦   «          |S )N)Ú r   é   )ÚsocketÚbindÚgetsocknameÚclose)r0   Úsrp   s      r*   Ú_getFreePortz"ConchServerSetupMixin._getFreePortE  s@   € ÝŒM‰OŒOˆØ	�Šˆw‰ŒˆØ�}Š}‰Œ˜qÔ!ˆØ	�Š‰	Œ	ˆ	Øˆr)   c                 óÂ   — |                       ¦   «         }t          j        |¦  «        }|                     t	          ¦   «         ¦  «         t          ¦   «         }||_        |S )zŽ
        Make a L{ConchTestServerFactory}, which allows us to start a
        L{ConchTestServer} -- i.e. an actually listening conch.
        )r¡   r   ÚPortalÚregisterCheckerr   r   )r0   ÚrealmÚpÚfactorys       r*   Ú_makeConchFactoryz'ConchServerSetupMixin._makeConchFactoryL  sV   € ð
 ×!Ò!Ñ#Ô#ˆÝŒM˜%Ñ Ô ˆØ	×ÒÕ3Ñ5Ô5Ñ6Ô6Ð6Ý(Ñ*Ô*ˆØˆŒØˆr)   c                 óô  — |                       ¦   «          |                      ¦   «         | _        d| j        _        t	          j        d| j        d¬¦  «        | _        t	          j        dt          ¦   «         ¦  «        | _        | j         	                    ¦   «         j
        | _        t          rMt	          j        dt          ¦   «         d¬¦  «        | _        | j         	                    ¦   «         j
        | _        d S d S )Nr·   r   rw   )Ú	interfacez::1)r´   rÄ   ÚconchFactoryÚexpectedLoseConnectionr   Ú	listenTCPÚconchServerrR   Ú
echoServerÚgetHostrp   ÚechoPortr   ÚechoServerV6Ú
echoPortV6r/   s    r*   ÚsetUpzConchServerSetupMixin.setUpX  sÖ   € Ø×ÒÑÔÐØ ×2Ò2Ñ4Ô4ˆÔØ34ˆÔÔ0Ý"Ô,ØˆtÔ ¨Kð
ñ 
ô 
ˆÔõ "Ô+¨A­{©}¬}Ñ=Ô=ˆŒØœ×/Ò/Ñ1Ô1Ô6ˆŒÝð 	?Ý 'Ô 1°!µ[±]´]ÈeÐ TÑ TÔ TˆDÔØ"Ô/×7Ò7Ñ9Ô9Ô>ˆDŒOˆOˆOð	?ð 	?r)   c                 óž  — 	 d| j         j        _        | j         j        j                             ¦   «          n# t
          $ r Y nw xY wt          j        | j        j	        ¦  «        t          j        | j
        j	        ¦  «        g}t          r1|                     t          j        | j        j	        ¦  «        ¦  «         t          j        |¦  «        S )Nr·   )rÇ   ÚprotoÚdonerK   rM   ÚAttributeErrorr   ÚmaybeDeferredrÊ   ÚstopListeningrË   r   r—   rÎ   ÚgatherResults)r0   Ú	deferredss     r*   ÚtearDownzConchServerSetupMixin.tearDowne  sÈ   € ð	?Ø+,ˆDÔÔ#Ô(ð ÔÔ#Ô-×<Ò<Ñ>Ô>Ð>Ð>øõ ð 	ð 	ð 	ØˆDð	øøøõ
 Ô Ô 0Ô >Ñ?Ô?ÝÔ ¤Ô =Ñ>Ô>ð
ˆ	õ ð 	SØ×Ò�UÔ0°Ô1BÔ1PÑQÔQÑRÔRÐRÝÔ" 9Ñ-Ô-Ð-s   ‚7 ·
AÁAN)r%   r&   r'   r   r=   Ústaticmethodr¡   r´   r½   rÄ   rÐ   rÙ   r(   r)   r*   rŸ   rŸ   %  s…   € € € € € Øð 0Ø/ˆàð+ð +ñ „\ð+ð7ð 7ð 7ð0ð ð ð
ð 
ð 
ð?ð ?ð ?ð.ð .ð .ð .ð .r)   rŸ   c                   ó$   — e Zd ZdZd„ Zd„ Zd„ ZdS )ÚForwardingMixinaÏ  
    Template class for tests of the Conch server's ability to forward arbitrary
    protocols over SSH.

    These tests are integration tests, not unit tests. They launch a Conch
    server, a custom TCP server (just an L{EchoProtocol}) and then call
    L{execute}.

    L{execute} is implemented by subclasses of L{ForwardingMixin}. It should
    cause an SSH client to connect to the Conch server, asking it to forward
    data to the custom TCP server.
    c                 ó|   — |                       dt          ¦   «         ¦  «        }|                     | j        d¦  «        S )z³
        Test that we can use whatever client to send the command "echo goodbye"
        to the Conch server. Make sure we receive "goodbye" back from the
        server.
        úecho goodbyeó   goodbye
©ÚexecuterT   ÚaddCallbackÚassertEqualrY   s     r*   Ú	test_execzForwardingMixin.test_execƒ  s5   € ð �LŠL˜Õ)@Ñ)BÔ)BÑCÔCˆØ�}Š}˜TÔ-¨|Ñ<Ô<Ð<r)   c                 óÈ   — |                       ¦   «         }t          |d¦  «        }|                      d|d|| j        fz  ¬¦  «        }|                     | j        d¦  «         |S )zy
        Test that we can use whatever client to forward a local port to a
        specified port on the server.
        ó   test
r¶   z-N -L%i:127.0.0.1:%i©ÚsshArgs©r½   rn   rá   rÍ   râ   rã   ©r0   Ú	localPortÚprocessrZ   s       r*   Útest_localToRemoteForwardingz,ForwardingMixin.test_localToRemoteForwardingŒ  sn   € ð
 ×%Ò%Ñ'Ô'ˆ	Ý,¨Y¸	ÑBÔBˆØ�LŠLØ�Ð!7¸9ÀdÄmÐ:TÑ!Tð ñ 
ô 
ˆð 	
�Š�dÔ&¨	Ñ2Ô2Ð2Øˆr)   c                 óÈ   — |                       ¦   «         }t          |d¦  «        }|                      d|d|| j        fz  ¬¦  «        }|                     | j        d¦  «         |S )zs
        Test that we can use whatever client to forward a port from the server
        to a port locally.
        ræ   r¶   z-N -R %i:127.0.0.1:%irç   ré   rê   s       r*   Útest_remoteToLocalForwardingz,ForwardingMixin.test_remoteToLocalForwarding™  sn   € ð
 ×%Ò%Ñ'Ô'ˆ	Ý,¨Y¸	ÑBÔBˆØ�LŠLØ�Ð!8¸IÀtÄ}Ð;UÑ!Uð ñ 
ô 
ˆð 	
�Š�dÔ&¨	Ñ2Ô2Ð2Øˆr)   N)r%   r&   r'   r2   rä   rí   rï   r(   r)   r*   rÜ   rÜ   u  sK   € € € € € ðð ð=ð =ð =ðð ð ðð ð ð ð r)   rÜ   c                   ó<   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	S )
ÚRekeyAvatara#  
    This avatar implements a shell which sends 60 numbered lines to whatever
    connects to it, then closes the session with a 0 exit status.

    60 lines is selected as being enough to send more than 2kB of traffic, the
    amount the client is configured to initiate a rekey after.
    c                 óL   — t          j        | ¦  «         t          | j        d<   d S )Ns   session)r    rr   r"   ÚchannelLookupr/   s    r*   rr   zRekeyAvatar.__init__µ  s&   € ÝÔ˜4Ñ Ô Ð Ý)3ˆÔ˜:Ñ&Ð&Ð&r)   c                 ó  ‡‡— t          j        ¦   «         }|                     ‰¦  «         ‰                     t          |¦  «        ¦  «         ˆˆfd„}t	          |t          ¦   «         ¦  «        Š‰                     d¦  «         dS )zE
        Write 60 lines of data to the transport, then exit.
        c                 ó2  •— t          | ¦  «        }|dk    rP‰                     ¦   «          ‰j        j                             ‰j        dd¦  «         ‰                     ¦   «          d S d|fz  }|                     d¦  «        }‰                     |¦  «         d S )Né<   s   exit-statuss       zline #%02d
r�   )ÚnextÚstopÚsessionÚconnÚsendRequestrM   r–   rL   )ÚcounterÚiÚlineÚcallrK   s      €€r*   rL   z$RekeyAvatar.openShell.<locals>.writeÃ  sœ   ø€ Ý�W‘”ˆAØ�BŠwˆwØ—	’	‘”�ØÔ!Ô&×2Ò2ØÔ% ~Ð7Jñô ð ð ×(Ò(Ñ*Ô*Ð*Ð*Ð*à%¨¨Ñ,�Ø—{’{ 7Ñ+Ô+�Ø—’ Ñ%Ô%Ð%Ð%Ð%r)   g{®Gáz„?N)r   ÚProtocolÚmakeConnectionr#   r   r   rš   )r0   rK   rÒ   rL   rÿ   s    `  @r*   Ú	openShellzRekeyAvatar.openShell¹  s�   øø€ õ Ô!Ñ#Ô#ˆØ×Ò˜YÑ'Ô'Ð'Ø× Ò ¥¨eÑ!4Ô!4Ñ5Ô5Ð5ð	&ð 	&ð 	&ð 	&ð 	&ð 	&õ( ˜5¥%¡'¤'Ñ*Ô*ˆØ�
Š
�4ÑÔÐÐÐr)   c                 ó   — dS )z2
        Ignore the close of the session.
        Nr(   r/   s    r*   ÚclosedzRekeyAvatar.closedÚ  s   € € € r)   c                 ó   — d S rV   r(   r/   s    r*   r8   zRekeyAvatar.eofReceivedß  ó   € àˆr)   c                 ó   — d S rV   r(   )r0   rÒ   Úcommands      r*   ÚexecCommandzRekeyAvatar.execCommandã  r  r)   c                 ó   — d S rV   r(   )r0   ÚtermÚ
windowSizeÚmodess       r*   ÚgetPtyzRekeyAvatar.getPtyç  r  r)   c                 ó   — d S rV   r(   )r0   ÚnewWindowSizes     r*   ÚwindowChangedzRekeyAvatar.windowChangedë  r  r)   N)r%   r&   r'   r2   rr   r  r  r8   r	  r  r  r(   r)   r*   rñ   rñ   «  sˆ   € € € € € ðð ð4ð 4ð 4ðð ð ðBð ð ð
ð ð ðð ð ðð ð ðð ð ð ð r)   rñ   c                   ó   — e Zd ZdZd„ ZdS )Ú
RekeyRealmzS
    This realm gives out new L{RekeyAvatar} instances for any avatar request.
    c                 ó2   — |d         t          ¦   «         d„ fS )Nr   c                  ó   — d S rV   r(   r(   r)   r*   ú<lambda>z*RekeyRealm.requestAvatar.<locals>.<lambda>ö  s   € °T€ r)   )rñ   )r0   ÚavatarIDÚmindÚ
interfacess       r*   ÚrequestAvatarzRekeyRealm.requestAvatarõ  s   € Ø˜!Œ}�k™mœm¨\¨\Ð9Ð9r)   N)r%   r&   r'   r2   r  r(   r)   r*   r  r  ð  s-   € € € € € ðð ð:ð :ð :ð :ð :r)   r  c                   ó   — e Zd ZdZeZd„ ZdS )ÚRekeyTestsMixinzp
    TestCase mixin which defines tests exercising L{SSHTransportBase}'s handling
    of rekeying messages.
    c                 ó†   ‡ — t          ¦   «         }‰                      d|d¦  «        }ˆ fd„}|                     |¦  «         |S )z‡
        After a client-initiated rekey is completed, application data continues
        to be passed over the SSH connection.
        r¶   z-o RekeyLimit=2Kc                 ó¼   •— d                      d„ t          d¦  «        D ¦   «         ¦  «        dz   }|                     d¦  «        }‰                     | |¦  «         d S )Nú
c                 ó   — g | ]}d |fz  ‘Œ	S )z
line #%02dr(   )Ú.0rý   s     r*   ú
<listcomp>zFRekeyTestsMixin.test_clientRekey.<locals>.finished.<locals>.<listcomp>
  s   € Ð'OÐ'OÐ'OÀ¨¸°tÑ(;Ð'OÐ'OÐ'Or)   rö   r�   )ÚjoinÚranger–   rã   )ÚresultÚexpectedResultr0   s     €r*   Úfinishedz2RekeyTestsMixin.test_clientRekey.<locals>.finished	  s^   ø€ Ø!ŸYšYÐ'OÐ'OÅUÈ2ÁYÄYÐ'OÑ'OÔ'OÑPÔPÐSWÑWˆNØ+×2Ò2°7Ñ;Ô;ˆNØ×Ò˜V ^Ñ4Ô4Ð4Ð4Ð4r)   )rT   rá   râ   )r0   rì   rZ   r'  s   `   r*   Útest_clientRekeyz RekeyTestsMixin.test_clientRekey  sX   ø€ õ
 *Ñ+Ô+ˆØ�LŠL˜˜WÐ&8Ñ9Ô9ˆð	5ð 	5ð 	5ð 	5ð 	5ð
 	
�Š�hÑÔÐØˆr)   N)r%   r&   r'   r2   r  r¡   r(  r(   r)   r*   r  r  ù  s4   € € € € € ðð ð
 €Lðð ð ð ð r)   r  c                   ó0   — e Zd Z ed¦  «        sdZdd„ZdS )ÚOpenSSHClientMixinÚsshz$no ssh command-line client availabler¶   c                 óŠ   ‡ ‡‡‡— t          t          d¦  «        d         d¦  «        }ˆˆˆ ˆfd„}|                     |¦  «        S )a¸  
        Connects to the SSH server started in L{ConchServerSetupMixin.setUp} by
        running the 'ssh' command line tool.

        @type remoteCommand: str
        @param remoteCommand: The command (with arguments) to run on the
        remote end.

        @type process: L{ConchTestOpenSSHProcess}

        @type sshArgs: str
        @param sshArgs: Arguments to pass to the 'ssh' process.

        @return: L{defer.Deferred}
        r+  r   )z-ozPubkeyAcceptedKeyTypes=ssh-dssz-Vc                 ó¼  •— | dk    rd}nd}t          j        ¦   «         ‰_        d|z   ‰
z   dz   ‰z   }‰	j                             ¦   «         j        }||z                       ¦   «         }g }|D ]A}t          |t          ¦  «        r| 	                    d¦  «        }| 
                    |¦  «         ŒBt          j        ‰t          d¦  «        d         |¦  «         ‰j        S )Nr   z!-oPubkeyAcceptedKeyTypes=ssh-dss r¶   zŠssh -2 -l testuser -p %i -F /dev/null -oUserKnownHostsFile=kh_test -oPasswordAuthentication=no -oHostKeyAlgorithms=ssh-rsa -a -i dsa_test ú 127.0.0.1 r�   r+  )r   ÚDeferredrX   rÊ   rÌ   rp   Úsplitr”   r•   r–   r—   r   ÚspawnProcessr   )ÚstatusÚoptsÚcmdlinerp   ÚcmdsÚencodedCmdsÚcmdrì   ÚremoteCommandr0   rè   s          €€€€r*   ÚhasPAKTz+OpenSSHClientMixin.execute.<locals>.hasPAKT.  sþ   ø€ Ø˜Š{ˆ{Ø:��à�å$œ~Ñ/Ô/ˆGÔð#ð ñ
ð ñð  ñ ð  ñ ð ð  Ô#×+Ò+Ñ-Ô-Ô2ˆDØ˜d‘N×)Ò)Ñ+Ô+ˆDØˆKØð (ð (�Ý˜c¥3Ñ'Ô'ð .ØŸ*š* WÑ-Ô-�CØ×"Ò" 3Ñ'Ô'Ð'Ð'ÝÔ  ­%°©,¬,°q¬/¸;ÑGÔGÐGØÔ#Ð#r)   )r   r   râ   )r0   r8  rì   rè   rZ   r9  s   ````  r*   rá   zOpenSSHClientMixin.execute  sd   øøøø€ õ( Ý�%‰LŒL˜ŒOÐKñ
ô 
ˆð"	$ð "	$ð "	$ð "	$ð "	$ð "	$ð "	$ð "	$ðH �}Š}˜WÑ%Ô%Ð%r)   N)r¶   )r%   r&   r'   r   r=   rá   r(   r)   r*   r*  r*    s=   € € € € € Øˆ5�‰<Œ<ð 6Ø5ˆð<&ð <&ð <&ð <&ð <&ð <&r)   r*  c                   óB   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
S )ÚOpenSSHKeyExchangeTestsz\
    Tests L{SSHTransportBase}'s key exchange algorithm compatibility with
    OpenSSH.
    c                 óÀ  — g }	 t          j        t          d¦  «        d         ddgt           j        ¬¦  «        }t	          |t
          ¦  «        s|                     d¦  «        }|                     ¦   «         }n# t          $ r Y nw xY w||vrt          |› d�¦  «        ‚|  
                    dt          ¦   «         d	|z   ¦  «        }|                     | j        d
¦  «        S )aI  
        Call execute() method of L{OpenSSHClientMixin} with an ssh option that
        forces the exclusive use of the key exchange algorithm specified by
        keyExchangeAlgo

        @type keyExchangeAlgo: L{str}
        @param keyExchangeAlgo: The key exchange algorithm to use

        @return: L{defer.Deferred}
        r+  r   z-QÚkex)Ústderrr�   z not supported by ssh clientz
echo helloz-oKexAlgorithms=s   hello
)Ú
subprocessÚcheck_outputr   ÚSTDOUTr”   r•   ri   r0  ÚBaseExceptionr   rá   rT   râ   rã   )r0   ÚkeyExchangeAlgoÚkexAlgorithmsÚoutputrZ   s        r*   ÚassertExecuteWithKexAlgorithmz5OpenSSHKeyExchangeTests.assertExecuteWithKexAlgorithm[  sö   € ð ˆð	ÝÔ,Ý�u‘”˜a” $¨Ð.µzÔ7Hðñ ô ˆFõ ˜f¥cÑ*Ô*ð 0ØŸš wÑ/Ô/�Ø"ŸLšL™NœNˆMˆMøÝð 	ð 	ð 	ØˆDð	øøøð  -Ð/Ð/Ý˜oÐKÐKÐKÑLÔLÐLà�LŠLØÝ#Ñ%Ô%Ø Ñ0ñ
ô 
ˆð
 �}Š}˜TÔ-¨zÑ:Ô:Ð:s   „A4A9 Á9
BÂBc                 ó,   — |                       d¦  «        S )zb
        The ecdh-sha2-nistp256 key exchange algorithm is compatible with
        OpenSSH
        zecdh-sha2-nistp256©rF  r/   s    r*   Útest_ECDHSHA256z'OpenSSHKeyExchangeTests.test_ECDHSHA256{  ó   € ð
 ×1Ò1Ð2FÑGÔGÐGr)   c                 ó,   — |                       d¦  «        S )zb
        The ecdh-sha2-nistp384 key exchange algorithm is compatible with
        OpenSSH
        zecdh-sha2-nistp384rH  r/   s    r*   Útest_ECDHSHA384z'OpenSSHKeyExchangeTests.test_ECDHSHA384‚  rJ  r)   c                 ó,   — |                       d¦  «        S )zb
        The ecdh-sha2-nistp521 key exchange algorithm is compatible with
        OpenSSH
        zecdh-sha2-nistp521rH  r/   s    r*   Útest_ECDHSHA521z'OpenSSHKeyExchangeTests.test_ECDHSHA521‰  rJ  r)   c                 ó,   — |                       d¦  «        S )zl
        The diffie-hellman-group14-sha1 key exchange algorithm is compatible
        with OpenSSH.
        zdiffie-hellman-group14-sha1rH  r/   s    r*   Útest_DH_GROUP14z'OpenSSHKeyExchangeTests.test_DH_GROUP14�  s   € ð
 ×1Ò1Ð2OÑPÔPÐPr)   c                 ó,   — |                       d¦  «        S )zs
        The diffie-hellman-group-exchange-sha1 key exchange algorithm is
        compatible with OpenSSH.
        z"diffie-hellman-group-exchange-sha1rH  r/   s    r*   Útest_DH_GROUP_EXCHANGE_SHA1z3OpenSSHKeyExchangeTests.test_DH_GROUP_EXCHANGE_SHA1—  s   € ð
 ×1Ò1Ð2VÑWÔWÐWr)   c                 ó,   — |                       d¦  «        S )zu
        The diffie-hellman-group-exchange-sha256 key exchange algorithm is
        compatible with OpenSSH.
        z$diffie-hellman-group-exchange-sha256rH  r/   s    r*   Útest_DH_GROUP_EXCHANGE_SHA256z5OpenSSHKeyExchangeTests.test_DH_GROUP_EXCHANGE_SHA256ž  s   € ð
 ×1Ò1Ø2ñ
ô 
ð 	
r)   c                 óH   — |                       t          | j        d¦  «         dS )zy
        The list of key exchange algorithms supported
        by OpenSSH client is obtained with C{ssh -Q kex}.
        zunsupported-algorithmN)ÚassertRaisesr   rF  r/   s    r*   Útest_unsupported_algorithmz2OpenSSHKeyExchangeTests.test_unsupported_algorithm§  s1   € ð
 	×ÒÝ�dÔ8Ð:Qñ	
ô 	
ð 	
ð 	
ð 	
r)   N)r%   r&   r'   r2   rF  rI  rL  rN  rP  rR  rT  rW  r(   r)   r*   r;  r;  U  s¦   € € € € € ðð ð
;ð ;ð ;ð@Hð Hð HðHð Hð HðHð Hð HðQð Qð QðXð Xð Xð
ð 
ð 
ð
ð 
ð 
ð 
ð 
r)   r;  c                   ó(   — e Zd ZdZed„ ¦   «         ZdS )ÚOpenSSHClientForwardingTestszR
    Connection forwarding tests run against the OpenSSL command line client.
    c                 óÈ   — |                       ¦   «         }t          |d¦  «        }|                      d|d|| j        fz  ¬¦  «        }|                     | j        d¦  «         |S )zG
        Forwarding of arbitrary IPv6 TCP connections via SSH.
        ræ   r¶   z-N -L%i:[::1]:%irç   )r½   rn   rá   rÏ   râ   rã   rê   s       r*   Útest_localToRemoteForwardingV6z;OpenSSHClientForwardingTests.test_localToRemoteForwardingV6¶  sn   € ð
 ×%Ò%Ñ'Ô'ˆ	Ý,¨Y¸	ÑBÔBˆØ�LŠLØ�Ð!3°yÀ$Ä/Ð6RÑ!Rð ñ 
ô 
ˆð 	
�Š�dÔ&¨	Ñ2Ô2Ð2Øˆr)   N)r%   r&   r'   r2   r   r[  r(   r)   r*   rY  rY  ±  s9   € € € € € ðð ð ð
ð 
ñ „_ð
ð 
ð 
r)   rY  c                   ó   — e Zd ZdZdS )ÚOpenSSHClientRekeyTestszE
    Rekeying tests run against the OpenSSL command line client.
    N)r%   r&   r'   r2   r(   r)   r*   r]  r]  Ä  s   € € € € € ðð ð ð r)   r]  c                   ó@   — e Zd ZdZej        dk    rdZd	d„Zd„ Zd„ Z	dS )
ÚCmdLineClientTestszP
    Connection forwarding tests run against the Conch command line client.
    Úwin32z!can't run cmdline client on win32r¶   Nc                 ó<  — |€g }t          j        ¦   «         |_        | j                             ¦   «         j        }d                     |¦  «        |z   dz   |z   }t          ||                     ¦   «         z   ¦  «        }t          j
                             ¦   «         }t          j                             t          j        ¦  «        |d<   g }	i }
|D ]A}t!          |t"          ¦  «        r|                     d¦  «        }|	                     |¦  «         ŒB|D ]c}||         }t!          |t"          ¦  «        r|                     d¦  «        }t!          |t"          ¦  «        r|                     d¦  «        }||
|<   Œdt)          j        |t          j        |	|
¬¦  «         |j        S )z{
        As for L{OpenSSHClientTestCase.execute}, except it runs the 'conch'
        command line tool, not 'ssh'.
        Nz[-p {} -l testuser --known-hosts kh_test --user-authentications publickey -a -i dsa_test -v r.  Ú
PYTHONPATHr�   )Úenv)r   r/  rX   rÊ   rÌ   rp   rh   r�   r0  r©   ÚenvironÚcopyÚpathsepr#  r‘   rª   r”   r•   r–   r—   r   r1  r’   )r0   r8  rì   rè   Ú	conchArgsrp   r7  r5  rc  r6  Ú
encodedEnvÚvarÚvals                r*   rá   zCmdLineClientTests.executeÒ  s’  € ð
 ÐØˆIå œ>Ñ+Ô+ˆÔØÔ×'Ò'Ñ)Ô)Ô.ˆð÷
 ’&˜‘,”, ñ)ð
 ,9ñ9ð
 <IñIð 	õ ˜ S§Y¢Y¡[¤[Ñ0Ñ1Ô1ˆÝŒj�oŠoÑÔˆÝœJŸOšO­C¬HÑ5Ô5ˆˆLÑØˆØˆ
Øð 	$ð 	$ˆCÝ˜#�sÑ#Ô#ð *Ø—j’j Ñ)Ô)�Ø×Ò˜sÑ#Ô#Ð#Ð#Øð 	"ð 	"ˆCØ�c”(ˆCÝ˜#�sÑ#Ô#ð *Ø—j’j Ñ)Ô)�Ý˜#�sÑ#Ô#ð *Ø—j’j Ñ)Ô)�Ø!ˆJ�s‰OˆOÝÔ˜W¥c¤n°kÀzÐRÑRÔRÐRØÔÐr)   c           	      ó  ‡ ‡— ˆˆ fd„}t          j        ‰                      ¦   «         ¦  «        Š‰                      dt	          ¦   «         dd‰j        ddg¬¦  «        }|                     ‰ j        d¦  «         |                     |¦  «         |S )	z4
        It can store logs to a local file.
        c                 ó\   •— ‰                      ¦   «         }‰                     d|¦  «         d S )Ns   Log opened.)Ú
getContentÚassertIn)r%  Ú
logContentÚlogPathr0   s     €€r*   Úcb_check_logz<CmdLineClientTests.test_runWithLogFile.<locals>.cb_check_logü  s.   ø€ Ø ×+Ò+Ñ-Ô-ˆJØ�MŠM˜.¨*Ñ5Ô5Ð5Ð5Ð5r)   rÞ   z--logz	--logfilez--host-key-algorithmszssh-rsa)r8  rì   rg  rß   )r   r   Úmktemprá   rT   rª   râ   rã   )r0   rq  rZ   rp  s   `  @r*   Útest_runWithLogFilez&CmdLineClientTests.test_runWithLogFile÷  s¦   øø€ ð
	6ð 	6ð 	6ð 	6ð 	6ð 	6õ Ô# D§K¢K¡M¤MÑ2Ô2ˆà�LŠLØ(Ý+Ñ-Ô-àØØ”Ø'Øðð ñ 

ô 

ˆð 	
�Š�dÔ&¨Ñ5Ô5Ð5Ø	�Š�lÑ#Ô#Ð#Øˆr)   c                 ó‚   — |                       dt          ¦   «         ¬¦  «        }|                     | j        d¦  «         |S )zH
        Do not use --host-key-algorithms flag on command line.
        rÞ   )r8  rì   rß   rà   rY   s     r*   Ú%test_runWithNoHostAlgorithmsSpecifiedz8CmdLineClientTests.test_runWithNoHostAlgorithmsSpecified  sF   € ð �LŠLØ(Õ2IÑ2KÔ2Kð ñ 
ô 
ˆð 	
�Š�dÔ&¨Ñ5Ô5Ð5Øˆr)   )r¶   N)
r%   r&   r'   r2   r   ÚplatformTyper=   rá   rs  ru  r(   r)   r*   r_  r_  Ê  sf   € € € € € ðð ð Ô˜wÒ&Ð&Ø2ˆð# ð # ð # ð # ðJð ð ð6	ð 	ð 	ð 	ð 	r)   r_  )rŽ   )Sr©   r¸   r?  r‘   Ú	itertoolsr   Úzope.interfacer   Útwisted.conch.errorr   Útwisted.conch.test.keydatar   r   r   r	   Útwisted.conch.test.test_sshr   Útwisted.credr   Útwisted.internetr   r   r   Útwisted.internet.errorr   Útwisted.internet.taskr   Útwisted.internet.utilsr   Útwisted.pythonr   r   r   Útwisted.python.filepathr   Útwisted.python.procutilsr   Útwisted.python.reflectr   Útwisted.test.testutilsr   r   Útwisted.trial.unittestr   r   r   r   ÚImportErrorr   Útwisted.conch.avatarr    Útwisted.conch.ssh.sessionr!   r"   r#   Útwisted.conch.interfacesÚtwisted.conch.scripts.conchÚ_StdioInteractingSessionr6   Úer•   r<   r,   r4   r   r?   ÚFactoryrR   ÚProcessProtocolrT   rn   ry   r�   rŸ   rÜ   rñ   r  r  r*  r;  rY  r]  r_  r(   r)   r*   ú<module>r�     s.  ðð
 
€	€	€	Ø €€€Ø Ð Ð Ð Ø 
€
€
€
Ø Ð Ð Ð Ð Ð à &Ð &Ð &Ð &Ð &Ð &à *Ð *Ð *Ð *Ð *Ð *ðð ð ð ð ð ð ð ð ð ð ð ð 7Ð 6Ð 6Ð 6Ð 6Ð 6Ø Ð Ð Ð Ð Ð Ø 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ø 7Ð 7Ð 7Ð 7Ð 7Ð 7Ø -Ð -Ð -Ð -Ð -Ð -Ø 2Ð 2Ð 2Ð 2Ð 2Ð 2Ø 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,Ø *Ð *Ð *Ð *Ð *Ð *Ø 0Ð 0Ð 0Ð 0Ð 0Ð 0Ø <Ð <Ð <Ð <Ð <Ð <Ð <Ð <Ø 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5ð	ðð ð ð ð ð ð ð ð øð ð 	ð 	ð 	Ø€Dð	øøøð ˆ}˜^Ñ,Ô,€àð Ø.Ð.Ð.Ð.Ð.Ð.ØLÐLÐLÐLÐLÐLÐLÐLÐLÐLÐLà1Ð1Ð1Ð1Ð1Ð1ðð ð ð ð ñ ô ð ð7ØRÐRÐRÐRÐRÐRð 7ÐÐøð ð 
ð 
ð 
Ø"ÐØˆc�!‰fŒf€GØ	ˆˆˆˆˆøøøøð
øøøð"ð "ð "ð "ð "ñ "ô "ð "ð$-ð -ð -ð -ð - 8ñ -ô -ð -ð(
,ð 
,ð 
,ð 
,ð 
,ˆ8Ôñ 
,ô 
,ð 
,ðð ð ð ð �(Ô"ñ ô ð ð(.ð (.ð (.ð (.ð (.˜hÔ6ñ (.ô (.ð (.ðVI2ð I2ð I2ð I2ð I2 Ô!9ñ I2ô I2ð I2ðX>ð >ð >ð >ð >˜hÔ/ñ >ô >ð >ð<ð ð ð ð4M.ð M.ð M.ð M.ð M.ñ M.ô M.ð M.ð`/ð /ð /ð /ð /Ð+ñ /ô /ð /ðl €ˆXÑÔðAð Að Að Að A�)ñ Aô Añ ÔðAðH:ð :ð :ð :ð :ñ :ô :ð :ðð ð ð ð Ð+ñ ô ð ð2@&ð @&ð @&ð @&ð @&ñ @&ô @&ð @&ðFY
ð Y
ð Y
ð Y
ð Y
Ð3Ð5GÈñ Y
ô Y
ð Y
ðxð ð ð ð  ?Ð4FÈñ ô ð ð&ð ð ð ð ˜oÐ/AÀ8ñ ô ð ðQð Qð Qð Qð Q˜¨(ñ Qô Qð Qð Qð Qs*   ÂB ÂBÂBÃ
C ÃC0ÃC+Ã+C0