§
    ÈtºfhC  ã                   óP  — d Z ddlZddlZddlmZ ddlmZmZmZm	Z	m
Z
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 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Z!d„ Z"dZ#d„ Z$d„ Z%d„ Z& G d„ d¦  «        Z'd„ Z( ee¦  «         G d„ d¦  «        ¦   «         Z) G d„ d¦  «        Z*dS )zD
Tools for automated testing of L{twisted.pair}-based applications.
é    N)Údeque)ÚEAGAINÚEBADFÚEINTRÚEINVALÚENOBUFSÚENOSYSÚEPERMÚEWOULDBLOCK©Úwraps)Úimplementer)ÚDatagramProtocol)ÚEthernetProtocol)Ú
IPProtocol)ÚRawUDPProtocol)Ú	_IFNAMSIZÚ
_TUNSETIFFÚTunnelFlagsÚ_IInputOutputSystem)ÚnativeStringé   c                 ó,   — t          j        d| ¦  «        S )zê
    Pack an integer into a network-order two-byte string.

    @param n: The integer to pack.  Only values that fit into 16 bits are
        supported.

    @return: The packed representation of the integer.
    @rtype: L{bytes}
    z>H)ÚstructÚpack)Úns    úS/var/www/surfInsights/venv3-11/lib/python3.11/site-packages/twisted/pair/testing.pyÚ_Hr      s   € õ Œ;�t˜QÑÔÐó    é   c                 ó2   — || z   t          |¦  «        z   |z   S )aØ  
    Construct an ethernet frame.

    @param src: The source ethernet address, encoded.
    @type src: L{bytes}

    @param dst: The destination ethernet address, encoded.
    @type dst: L{bytes}

    @param protocol: The protocol number of the payload of this datagram.
    @type protocol: L{int}

    @param payload: The content of the ethernet frame (such as an IP datagram).
    @type payload: L{bytes}

    @return: The full ethernet frame.
    @rtype: L{bytes}
    )r   ©ÚsrcÚdstÚprotocolÚpayloads       r   Ú	_ethernetr'   .   s   € ð& �‰9•r˜(‘|”|Ñ# gÑ-Ð-r   c                 óè  — dt          dt          |¦  «        z   ¦  «        z   dz   t          d¦  «        z   t          j        t          j        t          | ¦  «        ¦  «        z   t          j        t          j        t          |¦  «        ¦  «        z   }t          t          j        d|¦  «        ¦  «        }|dz	  }|dz  |z   }|dz  }|dd	…         t          j	        d
|¦  «        z   |dd…         z   }||z   S )aÌ  
    Construct an IP datagram with the given source, destination, and
    application payload.

    @param src: The source IPv4 address as a dotted-quad string.
    @type src: L{bytes}

    @param dst: The destination IPv4 address as a dotted-quad string.
    @type dst: L{bytes}

    @param payload: The content of the IP datagram (such as a UDP datagram).
    @type payload: L{bytes}

    @return: An IP datagram header and payload.
    @rtype: L{bytes}
    s   E é   s      @r   z!10Hé   iÿÿ  Né
   z!Hé   )
r   ÚlenÚsocketÚ	inet_ptonÚAF_INETr   Úsumr   Úunpackr   )r#   r$   r&   ÚipHeaderÚchecksumStep1ÚcarryÚchecksumStep2ÚchecksumStep3s           r   Ú_ipr8   D   sû   € ð&	õ ˆR•#�g‘,”,ÑÑ
Ô
ñ		 ð
 &ñ	&õ ˆQ‰%Œ%ñ	õ Ô
�6œ>­<¸Ñ+<Ô+<Ñ
=Ô
=ñ		>õ Ô
�6œ>­<¸Ñ+<Ô+<Ñ
=Ô
=ñ	>ð õ" �œ f¨hÑ7Ô7Ñ8Ô8€Mà˜RÑ€Eà" VÑ+¨uÑ4€Mà! FÑ*€Mð
 ˜˜˜Œ}�vœ{¨4°Ñ?Ô?Ñ?À(È2È3È3Ä-ÑO€Hà�gÑÐr   c                 óª   — t          | ¦  «        t          |¦  «        z   t          t          |¦  «        dz   ¦  «        z   t          d¦  «        z   }||z   S )a~  
    Construct a UDP datagram with the given source, destination, and
    application payload.

    @param src: The source port number.
    @type src: L{int}

    @param dst: The destination port number.
    @type dst: L{int}

    @param payload: The content of the UDP datagram.
    @type payload: L{bytes}

    @return: A UDP datagram header and payload.
    @rtype: L{bytes}
    é   r   )r   r-   )r#   r$   r&   Ú	udpHeaders       r   Ú_udpr<   v   sZ   € õ& 	ˆ3‰Œå
ˆS‰'Œ'ñ	õ �S�‰\Œ\˜AÑÑ
Ô
ñ		õ ˆQ‰%Œ%ñ	ð ð �wÑÐr   c                   óª   — e Zd ZdZdZ eed¦  «        Z ee	d¦  «        Z
 eed¦  «        ZeZdZd„ Zed„ ¦   «         Zed	„ ¦   «         Zd
„ Zd„ Zd„ ZdS )ÚTunnelzè
    An in-memory implementation of a tun or tap device.

    @cvar _DEVICE_NAME: A string representing the conventional filesystem entry
        for the tunnel factory character special device.
    @type _DEVICE_NAME: C{bytes}
    s   /dev/net/tunz Resource temporarily unavailablezOperation would blockzInterrupted function calli   c                 ó¾   — || _         || _        d| _        d| _        d| _        t          ¦   «         | _        t          ¦   «         | _        t          ¦   «         | _        dS )a  
        @param system: An L{_IInputOutputSystem} provider to use to perform I/O.

        @param openFlags: Any flags to apply when opening the tunnel device.
            See C{os.O_*}.

        @type openFlags: L{int}

        @param fileMode: ignored
        N)	ÚsystemÚ	openFlagsÚ
tunnelModeÚrequestedNameÚnamer   Ú
readBufferÚwriteBufferÚpendingSignals)Úselfr@   rA   ÚfileModes       r   Ú__init__zTunnel.__init__¬   sS   € ð ˆŒð #ˆŒØˆŒØ!ˆÔØˆŒ	Ý™'œ'ˆŒÝ ™7œ7ˆÔÝ#™gœgˆÔÐÐr   c                 ó,   — | j         | j        j        z   S )zx
        If the file descriptor for this tunnel is open in blocking mode,
        C{True}.  C{False} otherwise.
        )rA   r@   Ú
O_NONBLOCK©rH   s    r   ÚblockingzTunnel.blockingÃ   s   € ð ”N T¤[Ô%;Ñ;Ð<Ð<r   c                 óD   — t          | j        | j        j        z  ¦  «        S )zz
        If the file descriptor for this tunnel is marked as close-on-exec,
        C{True}.  C{False} otherwise.
        )ÚboolrA   r@   Ú	O_CLOEXECrM   s    r   ÚcloseOnExeczTunnel.closeOnExecË   s   € õ �D”N T¤[Ô%:Ñ:Ñ;Ô;Ð;r   c                 óœ   — | j         t          j        j        z  rt	          ddt
          |¬¦  «        }| j                             |¦  «         dS )aI  
        Deliver a datagram to this tunnel's read buffer.  This makes it
        available to be read later using the C{read} method.

        @param datagram: The IPv4 datagram to deliver.  If the mode of this
            tunnel is TAP then ethernet framing will be added automatically.
        @type datagram: L{bytes}
        s         s   ÿÿÿÿÿÿr"   N)rB   r   ÚIFF_TAPÚvaluer'   Ú_IPv4rE   Úappend©rH   Údatagrams     r   ÚaddToReadBufferzTunnel.addToReadBufferÓ   sT   € ð Œ?�[Ô0Ô6Ñ6ð 	Ý Ø [½5È(ðñ ô ˆHð 	Œ×Ò˜xÑ(Ô(Ð(Ð(Ð(r   c                 óæ   — | j         rO| j        t          j        j        z  rd}ndt
          z  }|dz  }|| j                              ¦   «         d|…         z   S | j        rt          ¦   «         ‚| j	        ‚)a  
        Read a datagram out of this tunnel.

        @param limit: The maximum number of bytes from the datagram to return.
            If the next datagram is larger than this, extra bytes are dropped
            and lost forever.
        @type limit: L{int}

        @raise OSError: Any of the usual I/O problems can result in this
            exception being raised with some particular error number set.

        @raise IOError: Any of the usual I/O problems can result in this
            exception being raised with some particular error number set.

        @return: The datagram which was read from the tunnel.  If the tunnel
            mode does not include L{TunnelFlags.IFF_NO_PI} then the datagram is
            prefixed with a 4 byte PI header.
        @rtype: L{bytes}
        r   ó    r   N)
rE   rB   r   Ú	IFF_NO_PIrU   Ú_PI_SIZEÚpopleftrN   ÚNotImplementedErrorÚnonBlockingExceptionStyle)rH   ÚlimitÚheaders      r   ÚreadzTunnel.readä   s€   € ð( Œ?ð 	1ØŒ¥Ô!6Ô!<Ñ<ð Ø��ð
 !¥8Ñ+�Ø˜‘
�Ø˜DœO×3Ò3Ñ5Ô5°f°u°fÔ=Ñ=Ð=ØŒ]ð 	1Ý%Ñ'Ô'Ð'àÔ0Ð0r   c                 ó  — | j         r.| j                              ¦   «          t          t          d¦  «        ‚t	          |¦  «        | j        k    rt          t          d¦  «        ‚| j                             |¦  «         t	          |¦  «        S )a{  
        Write a datagram into this tunnel.

        @param datagram: The datagram to write.
        @type datagram: L{bytes}

        @raise IOError: Any of the usual I/O problems can result in this
            exception being raised with some particular error number set.

        @return: The number of bytes of the datagram which were written.
        @rtype: L{int}
        zInterrupted system callzNo buffer space available)	rG   r_   ÚOSErrorr   r-   ÚSEND_BUFFER_SIZEr   rF   rW   rX   s     r   ÚwritezTunnel.write  s}   € ð Ôð 	<ØÔ×'Ò'Ñ)Ô)Ð)Ý�%Ð!:Ñ;Ô;Ð;åˆx‰=Œ=˜4Ô0Ò0Ð0Ý�'Ð#>Ñ?Ô?Ð?àÔ×Ò Ñ)Ô)Ð)Ý�8‰}Œ}Ðr   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú_DEVICE_NAMEÚIOErrorr   ÚEAGAIN_STYLErf   r   ÚEWOULDBLOCK_STYLEr   ÚEINTR_STYLEra   rg   rJ   ÚpropertyrN   rR   rZ   rd   rh   © r   r   r>   r>   ”   sß   € € € € € ðð ð #€Lð �7˜6Ð#EÑFÔF€LØ˜ Ð-DÑEÔEÐð �'˜%Ð!<Ñ=Ô=€Kà ,ÐàÐð&ð &ð &ð. ð=ð =ñ „Xð=ð ð<ð <ñ „Xð<ð)ð )ð )ð"!1ð !1ð !1ðFð ð ð ð r   r>   c                 ó<   ‡ — t          ‰ ¦  «        ˆ fd„¦   «         }|S )a|  
    Wrap a L{MemoryIOSystem} method with permission-checking logic.  The
    returned function will check C{self.permissions} and raise L{IOError} with
    L{errno.EPERM} if the function name is not listed as an available
    permission.

    @param original: The L{MemoryIOSystem} instance to wrap.

    @return: A wrapper around C{original} that applies permission checks.
    c                 ób   •— ‰j         | j        vrt          t          d¦  «        ‚ ‰| g|¢R i |¤ŽS )NzOperation not permitted)ri   Úpermissionsrf   r
   )rH   ÚargsÚkwargsÚoriginals      €r   ÚpermissionCheckerz&_privileged.<locals>.permissionChecker+  sE   ø€ àÔ DÔ$4Ð4Ð4Ý�%Ð!:Ñ;Ô;Ð;Øˆx˜Ð.˜tÐ.Ð.Ð. vÐ.Ð.Ð.r   r   )ry   rz   s   ` r   Ú_privilegedr{     s6   ø€ õ ˆ8�_„_ð/ð /ð /ð /ñ „_ð/ð
 Ðr   c                   ó€   — e Zd ZdZdZdZdZdZd„ Zd„ Z	d„ Z
edd
„¦   «         Zd„ Zd„ Zd„ Zed„ ¦   «         Zd„ Zd„ Zd	S )ÚMemoryIOSystemz÷
    An in-memory implementation of basic I/O primitives, useful in the context
    of unit testing as a drop-in replacement for parts of the C{os} module.

    @ivar _devices:
    @ivar _openFiles:
    @ivar permissions:

    @ivar _counter:
    i    é   é   r   c                 ó4   — i | _         i | _        ddh| _        d S )NÚopenÚioctl)Ú_devicesÚ
_openFilesrv   rM   s    r   rJ   zMemoryIOSystem.__init__G  s#   € ØˆŒØˆŒØ" GÐ,ˆÔÐÐr   c                 ó@   — | j         |                     ¦   «                  S )aX  
        Get the L{Tunnel} object associated with the given L{TuntapPort}.

        @param port: A L{TuntapPort} previously initialized using this
            L{MemoryIOSystem}.

        @return: The tunnel object created by a prior use of C{open} on this
            object on the tunnel special device file.
        @rtype: L{Tunnel}
        )r„   Úfileno)rH   Úports     r   Ú	getTunnelzMemoryIOSystem.getTunnelL  s   € ð Œ˜tŸ{š{™}œ}Ô-Ð-r   c                 ó   — || j         |<   dS )a1  
        Specify a class which will be used to handle I/O to a device of a
        particular name.

        @param name: The filesystem path name of the device.
        @type name: L{bytes}

        @param cls: A class (like L{Tunnel}) to instantiated whenever this
            device is opened.
        N)rƒ   )rH   rD   Úclss      r   ÚregisterSpecialDevicez$MemoryIOSystem.registerSpecialDeviceY  s   € ð "ˆŒ�dÑÐÐr   Nc                 ó°   — || j         v r9| j        }| xj        dz  c_         | j         |         | ||¦  «        | j        |<   |S t          t          d¦  «        ‚)aþ  
        A replacement for C{os.open}.  This initializes state in this
        L{MemoryIOSystem} which will be reflected in the behavior of the other
        file descriptor-related methods (eg L{MemoryIOSystem.read},
        L{MemoryIOSystem.write}, etc).

        @param name: A string giving the name of the file to open.
        @type name: C{bytes}

        @param flags: The flags with which to open the file.
        @type flags: C{int}

        @param mode: The mode with which to open the file.
        @type mode: C{int}

        @raise OSError: With C{ENOSYS} if the file is not a recognized special
            device file.

        @return: A file descriptor associated with the newly opened file
            description.
        @rtype: L{int}
        r~   zFunction not implemented)rƒ   Ú_counterr„   rf   r	   )rH   rD   ÚflagsÚmodeÚfds        r   r�   zMemoryIOSystem.openf  s_   € ð0 �4”=Ð Ð Ø”ˆBØˆMŒM˜QÑˆMŒMØ"5 $¤-°Ô"5°d¸EÀ4Ñ"HÔ"HˆDŒO˜BÑØˆIÝ•fÐ8Ñ9Ô9Ð9r   c                 óŠ   — 	 | j         |                              |¦  «        S # t          $ r t          t          d¦  «        ‚w xY w)z¤
        Try to read some bytes out of one of the in-memory buffers which may
        previously have been populated by C{write}.

        @see: L{os.read}
        úBad file descriptor)r„   rd   ÚKeyErrorrf   r   )rH   r�   rb   s      r   rd   zMemoryIOSystem.read…  sN   € ð	8Ø”? 2Ô&×+Ò+¨EÑ2Ô2Ð2øÝð 	8ð 	8ð 	8Ý�%Ð!6Ñ7Ô7Ð7ð	8øøøó	   ‚" ¢ Ac                 óŠ   — 	 | j         |                              |¦  «        S # t          $ r t          t          d¦  «        ‚w xY w)z’
        Try to add some bytes to one of the in-memory buffers to be accessed by
        a later C{read} call.

        @see: L{os.write}
        r’   )r„   rh   r“   rf   r   )rH   r�   Údatas      r   rh   zMemoryIOSystem.write‘  sN   € ð	8Ø”? 2Ô&×,Ò,¨TÑ2Ô2Ð2øÝð 	8ð 	8ð 	8Ý�%Ð!6Ñ7Ô7Ð7ð	8øøør”   c                 ó^   — 	 | j         |= dS # t          $ r t          t          d¦  «        ‚w xY w)zŠ
        Discard the in-memory buffer and other in-memory state for the given
        file descriptor.

        @see: L{os.close}
        r’   N)r„   r“   rf   r   )rH   r�   s     r   ÚclosezMemoryIOSystem.close�  sC   € ð	8Ø” Ð#Ð#Ð#øÝð 	8ð 	8ð 	8Ý�%Ð!6Ñ7Ô7Ð7ð	8øøøs   ‚ Œ ,c                 ó€  — 	 | j         |         }n## t          $ r t          t          d¦  «        ‚w xY w|t          k    rt          t
          d¦  «        ‚t          j        dt          fz  |¦  «        \  }}||_	        ||_
        |dt          dz
  …         dz   |_        t          j        dt          fz  |j        |¦  «        S )z�
        Perform some configuration change to the in-memory state for the given
        file descriptor.

        @see: L{fcntl.ioctl}
        r’   zRequest or args is not valid.z%dsHNé   s   123)r„   r“   rf   r   r   r   r   r2   r   rB   rC   rD   r   )rH   r�   Úrequestrw   ÚtunnelrD   r�   s          r   r‚   zMemoryIOSystem.ioctl©  sÁ   € ð	8Ø”_ RÔ(ˆFˆFøÝð 	8ð 	8ð 	8Ý�%Ð!6Ñ7Ô7Ð7ð	8øøøð •jÒ Ð Ý�&Ð"AÑBÔBÐBå”] 6­Y¨LÑ#8¸$Ñ?Ô?‰
ˆˆdØ ˆÔØ#ˆÔØ˜?�Y¨™]˜?Ô+¨fÑ4ˆŒåŒ{˜6¥Y LÑ0°&´+¸tÑDÔDÐDs   ‚ � 0c           	      óð   — d}d}t          ||d         t          ||d         |¬¦  «        ¬¦  «        }t          | j                             ¦   «         ¦  «        }|d                              |¦  «         ||fS )ah  
        Write an ethernet frame containing an ip datagram containing a udp
        datagram containing the given payload, addressed to the given address,
        to a tunnel device previously opened on this I/O system.

        @param datagram: A UDP datagram payload to send.
        @type datagram: L{bytes}

        @param address: The destination to which to send the datagram.
        @type address: L{tuple} of (L{bytes}, L{int})

        @return: A two-tuple giving the address from which gives the address
            from which the datagram was sent.
        @rtype: L{tuple} of (L{bytes}, L{int})
        z10.1.2.3iaS  r   r~   )r#   r$   r&   )r8   r<   Úlistr„   ÚvaluesrZ   )rH   rY   ÚaddressÚsrcIPÚsrcPortÚ
serializedÚ	openFiless          r   ÚsendUDPzMemoryIOSystem.sendUDPÀ  s‚   € ð" ˆØˆåØØ˜”
Ý˜W¨'°!¬*¸hÐGÑGÔGð
ñ 
ô 
ˆ
õ ˜œ×/Ò/Ñ1Ô1Ñ2Ô2ˆ	Ø�!Œ×$Ò$ ZÑ0Ô0Ð0à�wÐÐr   c                 ó"   — t          | |¦  «        S )aa  
        Get a socket-like object which can be used to receive a datagram sent
        from the given address.

        @param fileno: A file descriptor representing a tunnel device which the
            datagram will be received via.
        @type fileno: L{int}

        @param host: The IPv4 address to which the datagram was sent.
        @type host: L{bytes}

        @param port: The UDP port number to which the datagram was sent.
            received.
        @type port: L{int}

        @return: A L{socket.socket}-like object which can be used to receive
            the specified datagram.
        )Ú	_FakePort)rH   r†   Úhostr‡   s       r   Ú
receiveUDPzMemoryIOSystem.receiveUDPß  s   € õ& ˜˜vÑ&Ô&Ð&r   ©N)ri   rj   rk   rl   r�   ÚO_RDWRrL   rQ   rJ   rˆ   r‹   r{   r�   rd   rh   r˜   r‚   r¥   r©   rs   r   r   r}   r}   4  sê   € € € € € ð	ð 	ð €Hà€FØ€JØ€Ið-ð -ð -ð
.ð .ð .ð"ð "ð "ð ð:ð :ð :ñ „[ð:ð<
8ð 
8ð 
8ð
8ð 
8ð 
8ð
8ð 
8ð 
8ð ðEð Eñ „[ðEð, ð  ð  ð>'ð 'ð 'ð 'ð 'r   r}   c                   ó   — e Zd ZdZd„ Zd„ ZdS )r§   zŒ
    A socket-like object which can be used to read UDP datagrams from
    tunnel-like file descriptors managed by a L{MemoryIOSystem}.
    c                 ó"   — || _         || _        d S rª   )Ú_systemÚ_fileno)rH   r@   r†   s      r   rJ   z_FakePort.__init__û  s   € ØˆŒØˆŒˆˆr   c                 ón  ‡
‡— | j         j        | j                 j                             ¦   «         }g Š
t          ¦   «         }ˆ
fd„}||_        t          ¦   «         }|                     d|¦  «         t          ¦   «         Š‰                     d|¦  «         | j         j        | j                 j
        }|t          j        j        z  r,t          ¦   «         }|                     d‰¦  «         |j        }nˆfd„}|t          j        j        z   }	|	r|t           d…         } ||¦  «         ‰
d         d|…         S )a_  
        Receive a datagram sent to this port using the L{MemoryIOSystem} which
        created this object.

        This behaves like L{socket.socket.recv} but the data being I{sent} and
        I{received} only passes through various memory buffers managed by this
        object and L{MemoryIOSystem}.

        @see: L{socket.socket.recv}
        c                 ó2   •— ‰                      | ¦  «         d S rª   )rW   )rY   r    Ú	datagramss     €r   Úcapturez_FakePort.recv.<locals>.capture  s   ø€ Ø×Ò˜XÑ&Ô&Ð&Ð&Ð&r   i90  é   r    c                 ó6   •— ‰                      | d d d d ¦  «        S rª   )ÚdatagramReceived)r–   Úips    €r   ú<lambda>z _FakePort.recv.<locals>.<lambda>   s"   ø€ ¨B×,?Ò,?Ø�d˜D $¨ñ-ô -€ r   Nr   )r®   r„   r¯   rF   r_   r   r¶   r   ÚaddProtor   rB   r   rT   rU   r   r]   r^   )rH   Únbytesr–   Úreceiverr³   Úudpr�   Úetherr¶   Ú	dataHasPIr²   r·   s             @@r   Úrecvz_FakePort.recvÿ  sL  øø€ ð Œ|Ô& t¤|Ô4Ô@×HÒHÑJÔJˆàˆ	Ý#Ñ%Ô%ˆð	'ð 	'ð 	'ð 	'ð 	'ð %,ˆÔ!åÑÔˆØ�Š�U˜HÑ%Ô%Ð%å‰\Œ\ˆØ
�Š�B˜ÑÔÐàŒ|Ô& t¤|Ô4Ô?ˆØ•+Ô%Ô+Ñ+ð 	Ý$Ñ&Ô&ˆEØ�NŠN˜5 "Ñ%Ô%Ð%Ø$Ô5ÐÐð ð  ð  ð  Ðð ¥Ô 5Ô ;Ñ;Ð<ˆ	àð 	#à�˜	˜	”?ˆDàÐ˜ÑÔÐØ˜Œ|˜G˜V˜GÔ$Ð$r   N)ri   rj   rk   rl   rJ   r¿   rs   r   r   r§   r§   õ  s<   € € € € € ðð ð
ð ð ð,%ð ,%ð ,%ð ,%ð ,%r   r§   )+rl   r.   r   Úcollectionsr   Úerrnor   r   r   r   r   r	   r
   r   Ú	functoolsr   Úzope.interfacer   Útwisted.internet.protocolr   Útwisted.pair.ethernetr   Útwisted.pair.ipr   Útwisted.pair.rawudpr   Útwisted.pair.tuntapr   r   r   r   Útwisted.python.compatr   r^   r   rV   r'   r8   r<   r>   r{   r}   r§   rs   r   r   ú<module>rÊ      s  ððð ð €€€Ø €€€Ø Ð Ð Ð Ð Ð Ø SÐ SÐ SÐ SÐ SÐ SÐ SÐ SÐ SÐ SÐ SÐ SÐ SÐ SÐ SÐ SÐ SÐ SÐ SÐ SØ Ð Ð Ð Ð Ð à &Ð &Ð &Ð &Ð &Ð &à 6Ð 6Ð 6Ð 6Ð 6Ð 6Ø 2Ð 2Ð 2Ð 2Ð 2Ð 2Ø &Ð &Ð &Ð &Ð &Ð &Ø .Ð .Ð .Ð .Ð .Ð .Ø WÐ WÐ WÐ WÐ WÐ WÐ WÐ WÐ WÐ WÐ WÐ WØ .Ð .Ð .Ð .Ð .Ð .ð €ð
 ð 
 ð 
 ð 	€ð.ð .ð .ð,/ð /ð /ðdð ð ð<Hð Hð Hð Hð Hñ Hô Hð HðVð ð ð* €Ð Ñ!Ô!ð}'ð }'ð }'ð }'ð }'ñ }'ô }'ñ "Ô!ð}'ð@6%ð 6%ð 6%ð 6%ð 6%ñ 6%ô 6%ð 6%ð 6%ð 6%r   