§
    ‹Ÿj-’  ã                   ó®  — d Z ddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
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 ddlmZ ddlmZmZmZ ddlZddlmZmZmZmZm Z m!Z!m"Z"m#Z# ej$        rddlm%Z%m&Z&m'Z'm(Z( dd	l)m*Z* ne+Z* G d
„ de*¦  «        Z, e!d¦  «        Z- e!de,¬¦  «        Z. G d„ de¦  «        Z/ G d„ d¦  «        Z0 G d„ d¦  «        Z1dS )a©  An I/O event loop for non-blocking sockets.

In Tornado 6.0, `.IOLoop` is a wrapper around the `asyncio` event loop, with a
slightly different interface. The `.IOLoop` interface is now provided primarily
for backwards compatibility; new code should generally use the `asyncio` event
loop interface directly. The `IOLoop.current` class method provides the
`IOLoop` instance corresponding to the running `asyncio` event loop.

é    N)Úisawaitable)ÚFutureÚ	is_futureÚchain_futureÚfuture_set_exc_infoÚfuture_add_done_callback)Úapp_log)ÚConfigurableÚTimeoutErrorÚimport_object)ÚUnionÚAnyÚTypeÚOptionalÚCallableÚTypeVarÚTupleÚ	Awaitable)ÚDictÚListÚSetÚ	TypedDict)ÚProtocolc                   ó"   — e Zd Zdefd„Zdd„ZdS )Ú_SelectableÚreturnc                 ó   — d S ©N© ©Úselfs    ú[/var/www/finuniver-perm.ru/html/student/venv/lib/python3.11/site-packages/tornado/ioloop.pyÚfilenoz_Selectable.fileno=   ó   € Øˆó    Nc                 ó   — d S r   r   r    s    r"   Úclosez_Selectable.close@   r$   r%   ©r   N)Ú__name__Ú
__module__Ú__qualname__Úintr#   r'   r   r%   r"   r   r   <   sC   € € € € € ð˜ð ð ð ð ðð ð ð ð ð r%   r   Ú_TÚ_S)Úboundc            
       ó^  ‡ — e Zd ZdZdZdZdZdZ e¦   «         Z	 e
¦   «         Zeddded	d
fˆ fd„¦   «         ZedJd„¦   «         ZdKd„ZedKd„¦   «         Zej        edJd„¦   «         ¦   «         Zej        edLded	ed          fd„¦   «         ¦   «         ZedLded	ed          fd„¦   «         ZdKd„ZdKd„ZedKd„¦   «         ZedKd„¦   «         ZdKd„Zed	ee         fd„¦   «         Zed	ee         fd„¦   «         Z dLded	d
fd„Z!dMded	d
fd„Z"ej        d e#d!e$e#e#gd
f         d"e#d	d
fd#„¦   «         Z%ej        d e&d!e$e&e#gd
f         d"e#d	d
fd$„¦   «         Z%d e'e#e(f         d!e$d%         d"e#d	d
fd&„Z%d e'e#e(f         d"e#d	d
fd'„Z)d e'e#e(f         d	d
fd(„Z*dKd)„Z+dKd*„Z,dNd+e$d,ee-         d	efd-„Z.d	e-fd.„Z/d/e'e-e0j1        f         d0e$d1eded	e2f
d2„Z3d3e-d0e$d1eded	e2f
d4„Z4d5e-d0e$d1eded	e2f
d6„Z5d,e2d	d
fd7„Z6d0e$d1eded	d
fd8„Z7d0e$d1eded	d
fd9„Z8d0e$d1eded	d
fd:„Z9d;d<d0e$d=gd
f         d	d
fd>„Z:d?ee;j<        j=                 d+e$d@e>f         d1ed	d=fdA„Z?d?e;j<        j=        d	d
fdB„Z@d0e$g ef         d	d
fdC„ZAd;eBd	d
fdD„ZCd e'e#e(f         d	eDe#e'e#e(f         f         fdE„ZEd e'e#e(f         d	d
fdF„ZFdGeBd	d
fdH„ZGdGeBd	d
fdI„ZHˆ xZIS )OÚIOLoopaÜ  An I/O event loop.

    As of Tornado 6.0, `IOLoop` is a wrapper around the `asyncio` event loop.

    Example usage for a simple TCP server:

    .. testcode::

        import asyncio
        import errno
        import functools
        import socket

        import tornado
        from tornado.iostream import IOStream

        async def handle_connection(connection, address):
            stream = IOStream(connection)
            message = await stream.read_until_close()
            print("message from client:", message.decode().strip())

        def connection_ready(sock, fd, events):
            while True:
                try:
                    connection, address = sock.accept()
                except BlockingIOError:
                    return
                connection.setblocking(0)
                io_loop = tornado.ioloop.IOLoop.current()
                io_loop.spawn_callback(handle_connection, connection, address)

        async def main():
            sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
            sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
            sock.setblocking(0)
            sock.bind(("", 8888))
            sock.listen(128)

            io_loop = tornado.ioloop.IOLoop.current()
            callback = functools.partial(connection_ready, sock)
            io_loop.add_handler(sock.fileno(), callback, io_loop.READ)
            await asyncio.Event().wait()

        if __name__ == "__main__":
            asyncio.run(main())

    Most applications should not attempt to construct an `IOLoop` directly,
    and instead initialize the `asyncio` event loop and use `IOLoop.current()`.
    In some cases, such as in test frameworks when initializing an `IOLoop`
    to be run in a secondary thread, it may be appropriate to construct
    an `IOLoop` with ``IOLoop(make_current=False)``.

    In general, an `IOLoop` cannot survive a fork or be shared across processes
    in any way. When multiple processes are being used, each process should
    create its own `IOLoop`, which also implies that any objects which depend on
    the `IOLoop` (such as `.AsyncHTTPClient`) must also be created in the child
    processes. As a guideline, anything that starts processes (including the
    `tornado.process` and `multiprocessing` modules) should do so as early as
    possible, ideally the first thing the application does after loading its
    configuration, and *before* any calls to `.IOLoop.start` or `asyncio.run`.

    .. versionchanged:: 4.2
       Added the ``make_current`` keyword argument to the `IOLoop`
       constructor.

    .. versionchanged:: 5.0

       Uses the `asyncio` event loop by default. The ``IOLoop.configure`` method
       cannot be used on Python 3 except to redundantly specify the `asyncio`
       event loop.

    .. versionchanged:: 6.3
       ``make_current=True`` is now the default when creating an IOLoop -
       previously the default was to make the event loop current if there wasn't
       already a current one.
    r   é   é   é   Úimplz$Union[None, str, Type[Configurable]]Úkwargsr   Nc                 óø   •— ddl m} t          |t          ¦  «        rt	          |¦  «        }t          |t
          ¦  «        rt          ||¦  «        st          d¦  «        ‚ t          ¦   «         j	        |fi |¤Ž d S )Nr   )ÚBaseAsyncIOLoopz5only AsyncIOLoop is allowed when asyncio is available)
Útornado.platform.asyncior8   Ú
isinstanceÚstrr   ÚtypeÚ
issubclassÚRuntimeErrorÚsuperÚ	configure)Úclsr5   r6   r8   Ú	__class__s       €r"   r@   zIOLoop.configure«   s�   ø€ ð 	=Ð<Ð<Ð<Ð<Ð<å�d�CÑ Ô ð 	'Ý  Ñ&Ô&ˆDÝ�d�DÑ!Ô!ð 	X­*°T¸?Ñ*KÔ*Kð 	XÝÐVÑWÔWÐWØ�‰ŒÔ˜$Ð)Ð) &Ð)Ð)Ð)Ð)Ð)r%   c                  ó4   — t                                ¦   «         S )aK  Deprecated alias for `IOLoop.current()`.

        .. versionchanged:: 5.0

           Previously, this method returned a global singleton
           `IOLoop`, in contrast with the per-thread `IOLoop` returned
           by `current()`. In nearly all cases the two were the same
           (when they differed, it was generally used from non-Tornado
           threads to communicate back to the main thread's `IOLoop`).
           This distinction is not present in `asyncio`, so in order
           to facilitate integration with that package `instance()`
           was changed to be an alias to `current()`. Applications
           using the cross-thread communications aspect of
           `instance()` should instead set their own global variable
           to point to the `IOLoop` they want to use.

        .. deprecated:: 5.0
        )r1   Úcurrentr   r%   r"   ÚinstancezIOLoop.instance·   s   € õ( �~Š~ÑÔÐr%   c                 ó.   — |                       ¦   «          dS )a`  Deprecated alias for `make_current()`.

        .. versionchanged:: 5.0

           Previously, this method would set this `IOLoop` as the
           global singleton used by `IOLoop.instance()`. Now that
           `instance()` is an alias for `current()`, `install()`
           is an alias for `make_current()`.

        .. deprecated:: 5.0
        N)Úmake_currentr    s    r"   ÚinstallzIOLoop.installÍ   s   € ð 	×ÒÑÔÐÐÐr%   c                  ó8   — t                                ¦   «          dS )ak  Deprecated alias for `clear_current()`.

        .. versionchanged:: 5.0

           Previously, this method would clear the `IOLoop` used as
           the global singleton by `IOLoop.instance()`. Now that
           `instance()` is an alias for `current()`,
           `clear_instance()` is an alias for `clear_current()`.

        .. deprecated:: 5.0

        N)r1   Úclear_currentr   r%   r"   Úclear_instancezIOLoop.clear_instanceÛ   s   € õ 	×ÒÑÔÐÐÐr%   c                  ó   — d S r   r   r   r%   r"   rD   zIOLoop.currentë   ó	   € ð 	ˆr%   TrE   c                 ó   — d S r   r   ©rE   s    r"   rD   zIOLoop.currentð   rM   r%   c                 ó  — 	 t          j        ¦   «         }n<# t          $ r/ | sY dS t          j        ¦   «         }t          j        |¦  «         Y nw xY w	 t
          j        |         S # t          $ r | rddlm	}  |¦   «         }nd}Y nw xY w|S )aC  Returns the current thread's `IOLoop`.

        If an `IOLoop` is currently running or has been marked as
        current by `make_current`, returns that instance.  If there is
        no current `IOLoop` and ``instance`` is true, creates one.

        .. versionchanged:: 4.1
           Added ``instance`` argument to control the fallback to
           `IOLoop.instance()`.
        .. versionchanged:: 5.0
           On Python 3, control of the current `IOLoop` is delegated
           to `asyncio`, with this and other methods as pass-through accessors.
           The ``instance`` argument now controls whether an `IOLoop`
           is created automatically when there is none, instead of
           whether we fall back to `IOLoop.instance()` (which is now
           an alias for this method). ``instance=False`` is deprecated,
           since even if we do not create an `IOLoop`, this method
           may initialize the asyncio loop.

        .. deprecated:: 6.2
           It is deprecated to call ``IOLoop.current()`` when no `asyncio`
           event loop is running.
        Nr   )ÚAsyncIOMainLoop)
ÚasyncioÚget_event_loopr>   Únew_event_loopÚset_event_loopr1   Ú_ioloop_for_asyncioÚKeyErrorr9   rQ   )rE   ÚlooprQ   rD   s       r"   rD   zIOLoop.currentõ   sË   € ð2	)ÝÔ)Ñ+Ô+ˆDˆDøÝð 	)ð 	)ð 	)Øð Ø�t�tåÔ)Ñ+Ô+ˆDÝÔ" 4Ñ(Ô(Ð(Ð(Ð(ð	)øøøð	ÝÔ-¨dÔ3Ð3øÝð 	ð 	ð 	Øð ØDÐDÐDÐDÐDÐDà)˜/Ñ+Ô+��à�øøð	øøøð ˆs&   ‚ –A¥'AÁAÁA% Á%BÂBc                 óf   — t          j        dt          d¬¦  «         |                      ¦   «          dS )aó  Makes this the `IOLoop` for the current thread.

        An `IOLoop` automatically becomes current for its thread
        when it is started, but it is sometimes useful to call
        `make_current` explicitly before starting the `IOLoop`,
        so that code run at startup time can find the right
        instance.

        .. versionchanged:: 4.1
           An `IOLoop` created while there is no current `IOLoop`
           will automatically become current.

        .. versionchanged:: 5.0
           This method also sets the current `asyncio` event loop.

        .. deprecated:: 6.2
           Setting and clearing the current event loop through Tornado is
           deprecated. Use ``asyncio.set_event_loop`` instead if you need this.
        z6make_current is deprecated; start the event loop firsté   ©Ú
stacklevelN)ÚwarningsÚwarnÚDeprecationWarningÚ_make_currentr    s    r"   rG   zIOLoop.make_current"  s@   € õ( 	ŒØDÝØð	
ñ 	
ô 	
ð 	
ð
 	×ÒÑÔÐÐÐr%   c                 ó   — t          ¦   «         ‚r   ©ÚNotImplementedErrorr    s    r"   r`   zIOLoop._make_current=  s   € å!Ñ#Ô#Ð#r%   c                  óp   — t          j        dt          d¬¦  «         t                               ¦   «          dS )zÿClears the `IOLoop` for the current thread.

        Intended primarily for use by test frameworks in between tests.

        .. versionchanged:: 5.0
           This method also clears the current `asyncio` event loop.
        .. deprecated:: 6.2
        zclear_current is deprecatedrZ   r[   N)r]   r^   r_   r1   Ú_clear_currentr   r%   r"   rJ   zIOLoop.clear_currentA  s@   € õ 	ŒØ)ÝØð	
ñ 	
ô 	
ð 	
õ
 	×ÒÑÔÐÐÐr%   c                  ól   — t                                d¬¦  «        } | �|                      ¦   «          d S d S )NFrO   )r1   rD   Ú_clear_current_hook)Úolds    r"   re   zIOLoop._clear_currentR  s9   € å�nŠn eˆnÑ,Ô,ˆØˆ?Ø×#Ò#Ñ%Ô%Ð%Ð%Ð%ð ˆ?r%   c                 ó   — dS )z�Instance method called when an IOLoop ceases to be current.

        May be overridden by subclasses as a counterpart to make_current.
        Nr   r    s    r"   rg   zIOLoop._clear_current_hookX  s	   € ð
 	ˆr%   c                 ó   — t           S r   )r1   )rA   s    r"   Úconfigurable_basezIOLoop.configurable_base_  s   € åˆr%   c                 ó   — ddl m} |S )Nr   )ÚAsyncIOLoop)r9   rm   )rA   rm   s     r"   Úconfigurable_defaultzIOLoop.configurable_defaultc  s   € à8Ð8Ð8Ð8Ð8Ð8àÐr%   rG   c                 ó6   — |r|                       ¦   «          d S d S r   )r`   )r!   rG   s     r"   Ú
initializezIOLoop.initializei  s,   € Øð 	!Ø×ÒÑ Ô Ð Ð Ð ð	!ð 	!r%   FÚall_fdsc                 ó   — t          ¦   «         ‚)a¨  Closes the `IOLoop`, freeing any resources used.

        If ``all_fds`` is true, all file descriptors registered on the
        IOLoop will be closed (not just the ones created by the
        `IOLoop` itself).

        Many applications will only use a single `IOLoop` that runs for the
        entire lifetime of the process.  In that case closing the `IOLoop`
        is not necessary since everything will be cleaned up when the
        process exits.  `IOLoop.close` is provided mainly for scenarios
        such as unit tests, which create and destroy a large number of
        ``IOLoops``.

        An `IOLoop` must be completely stopped before it can be closed.  This
        means that `IOLoop.stop()` must be called *and* `IOLoop.start()` must
        be allowed to return before attempting to call `IOLoop.close()`.
        Therefore the call to `close` will usually appear just after
        the call to `start` rather than near the call to `stop`.

        .. versionchanged:: 3.1
           If the `IOLoop` implementation supports non-integer objects
           for "file descriptors", those objects will have their
           ``close`` method when ``all_fds`` is true.
        rb   )r!   rq   s     r"   r'   zIOLoop.closem  s   € õ2 "Ñ#Ô#Ð#r%   ÚfdÚhandlerÚeventsc                 ó   — d S r   r   ©r!   rs   rt   ru   s       r"   Úadd_handlerzIOLoop.add_handlerˆ  ó	   € ð 	ˆr%   c                 ó   — d S r   r   rw   s       r"   rx   zIOLoop.add_handlerŽ  ry   r%   ).Nc                 ó   — t          ¦   «         ‚)a+  Registers the given handler to receive the given events for ``fd``.

        The ``fd`` argument may either be an integer file descriptor or
        a file-like object with a ``fileno()`` and ``close()`` method.

        The ``events`` argument is a bitwise or of the constants
        ``IOLoop.READ``, ``IOLoop.WRITE``, and ``IOLoop.ERROR``.

        When an event occurs, ``handler(fd, events)`` will be run.

        .. versionchanged:: 4.0
           Added the ability to pass file-like objects in addition to
           raw file descriptors.
        rb   rw   s       r"   rx   zIOLoop.add_handler”  s   € õ" "Ñ#Ô#Ð#r%   c                 ó   — t          ¦   «         ‚)z¹Changes the events we listen for ``fd``.

        .. versionchanged:: 4.0
           Added the ability to pass file-like objects in addition to
           raw file descriptors.
        rb   )r!   rs   ru   s      r"   Úupdate_handlerzIOLoop.update_handler§  ó   € õ "Ñ#Ô#Ð#r%   c                 ó   — t          ¦   «         ‚)zµStop listening for events on ``fd``.

        .. versionchanged:: 4.0
           Added the ability to pass file-like objects in addition to
           raw file descriptors.
        rb   ©r!   rs   s     r"   Úremove_handlerzIOLoop.remove_handler°  r~   r%   c                 ó   — t          ¦   «         ‚)z¶Starts the I/O loop.

        The loop will run until one of the callbacks calls `stop()`, which
        will make the loop stop after the current event iteration completes.
        rb   r    s    r"   ÚstartzIOLoop.start¹  s   € õ "Ñ#Ô#Ð#r%   c                 ó   — t          ¦   «         ‚)a‘  Stop the I/O loop.

        If the event loop is not currently running, the next call to `start()`
        will return immediately.

        Note that even after `stop` has been called, the `IOLoop` is not
        completely stopped until `IOLoop.start` has also returned.
        Some work that was scheduled before the call to `stop` may still
        be run before the `IOLoop` shuts down.
        rb   r    s    r"   ÚstopzIOLoop.stopÁ  s   € õ "Ñ#Ô#Ð#r%   ÚfuncÚtimeoutc                 ót  ‡ ‡‡— t           j        r(t          dt          t                   t
          dœ¦  «        }dddœŠdˆˆˆ fd„}‰                      |¦  «         |�2dˆˆ fd„}‰                      ‰                      ¦   «         |z   |¦  «        }‰  	                    ¦   «          |�‰  
                    |¦  «         ‰d         €J ‚‰d                              ¦   «         s‰d                              ¦   «         s)‰d	         rt          d
|z  ¦  «        ‚t          d¦  «        ‚‰d                              ¦   «         S )a¯  Starts the `IOLoop`, runs the given function, and stops the loop.

        The function must return either an awaitable object or
        ``None``. If the function returns an awaitable object, the
        `IOLoop` will run until the awaitable is resolved (and
        `run_sync()` will return the awaitable's result). If it raises
        an exception, the `IOLoop` will stop and the exception will be
        re-raised to the caller.

        The keyword-only argument ``timeout`` may be used to set
        a maximum duration for the function.  If the timeout expires,
        a `asyncio.TimeoutError` is raised.

        This method is useful to allow asynchronous calls in a
        ``main()`` function::

            async def main():
                # do stuff...

            if __name__ == '__main__':
                IOLoop.current().run_sync(main)

        .. versionchanged:: 4.3
           Returning a non-``None``, non-awaitable value is now an error.

        .. versionchanged:: 5.0
           If a timeout occurs, the ``func`` coroutine will be cancelled.

        .. versionchanged:: 6.2
           ``tornado.util.TimeoutError`` is now an alias to ``asyncio.TimeoutError``.
        Ú
FutureCell)ÚfutureÚtimeout_calledNFr   c                  óš  •— 	  ‰¦   «         } | �ddl m}  || ¦  «        } t          | ¦  «        r| ‰d<   nmt          ¦   «         }|‰d<   |                     | ¦  «         nD# t
          $ r7 t          ¦   «         }|‰d<   t          |t          j        ¦   «         ¦  «         Y nw xY w‰d         €J ‚‰ 	                    ‰d         ˆfd„¦  «         d S )Nr   )Úconvert_yieldedrŠ   c                 ó,   •— ‰                      ¦   «         S r   )r…   )rŠ   r!   s    €r"   ú<lambda>z.IOLoop.run_sync.<locals>.run.<locals>.<lambda>  s   ø€ À$Ç)Â)Á+Ä+€ r%   )
Útornado.genr�   r   r   Ú
set_resultÚ	Exceptionr   ÚsysÚexc_infoÚ
add_future)Úresultr�   Úfutr†   Úfuture_cellr!   s      €€€r"   ÚrunzIOLoop.run_sync.<locals>.runô  s	  ø€ ð+Ø˜™œ�ØÐ%Ø;Ð;Ð;Ð;Ð;Ð;à,˜_¨VÑ4Ô4�Fõ ˜VÑ$Ô$ð +Ø,2�K Ñ)Ð)å ™(œ(�CØ,/�K Ñ)Ø—N’N 6Ñ*Ô*Ð*Ð*øõ ð 9ð 9ð 9Ý‘h”h�Ø(+�˜HÑ%Ý# C­¬©¬Ñ8Ô8Ð8Ð8Ð8ð9øøøð ˜xÔ(Ð4Ð4Ð4Ø�OŠO˜K¨Ô1Ð3MÐ3MÐ3MÐ3MÑNÔNÐNÐNÐNs   ƒA Á>BÂBc                  ó†   •— d‰ d<   ‰ d         €J ‚‰ d                               ¦   «         s‰                     ¦   «          d S d S )NTr‹   rŠ   )Úcancelr…   )r˜   r!   s   €€r"   Útimeout_callbackz)IOLoop.run_sync.<locals>.timeout_callback  sU   ø€ à04�Ð,Ñ-ð
 # 8Ô,Ð8Ð8Ð8Ø" 8Ô,×3Ò3Ñ5Ô5ð  Ø—I’I‘K”K�K�K�Kð ð  r%   rŠ   r‹   z$Operation timed out after %s secondsz+Event loop stopped before Future completed.r(   )ÚtypingÚTYPE_CHECKINGr   r   r   ÚboolÚadd_callbackÚadd_timeoutÚtimerƒ   Úremove_timeoutÚ	cancelledÚdoner   r>   r–   )r!   r†   r‡   r‰   r™   rœ   Útimeout_handler˜   s   ``     @r"   Úrun_synczIOLoop.run_syncÎ  s�  øøø€ õ@ Ôð 	Ý"Ø­µ&Ô)9ÍTÐRÐRñô ˆJð "&¸Ð?Ð?ˆð	Oð 	Oð 	Oð 	Oð 	Oð 	Oð 	Oð 	Oð* 	×Ò˜#ÑÔÐØÐð	 ð 	 ð 	 ð 	 ð 	 ð 	 ð 	 ð "×-Ò-¨d¯iªi©k¬k¸GÑ.CÐEUÑVÔVˆNØ�
Š
‰ŒˆØÐØ×Ò Ñ/Ô/Ð/Ø˜8Ô$Ð0Ð0Ð0Ø�xÔ ×*Ò*Ñ,Ô,ð 	R°KÀÔ4I×4NÒ4NÑ4PÔ4Pð 	RØÐ+Ô,ð RÝ"Ð#IÈGÑ#SÑTÔTÐTõ #Ð#PÑQÔQÐQØ˜8Ô$×+Ò+Ñ-Ô-Ð-r%   c                 ó(   — t          j         ¦   «         S )a‡  Returns the current time according to the `IOLoop`'s clock.

        The return value is a floating-point number relative to an
        unspecified time in the past.

        Historically, the IOLoop could be customized to use e.g.
        `time.monotonic` instead of `time.time`, but this is not
        currently supported and so this method is equivalent to
        `time.time`.

        )r¢   r    s    r"   r¢   zIOLoop.time%  s   € õ Œy‰{Œ{Ðr%   ÚdeadlineÚcallbackÚargsc                 ó$  — t          |t          j        ¦  «        r | j        ||g|¢R i |¤ŽS t          |t          j        ¦  «        r9 | j        |                      ¦   «         |                     ¦   «         z   |g|¢R i |¤ŽS t          d|z  ¦  «        ‚)a   Runs the ``callback`` at the time ``deadline`` from the I/O loop.

        Returns an opaque handle that may be passed to
        `remove_timeout` to cancel.

        ``deadline`` may be a number denoting a time (on the same
        scale as `IOLoop.time`, normally `time.time`), or a
        `datetime.timedelta` object for a deadline relative to the
        current time.  Since Tornado 4.0, `call_later` is a more
        convenient alternative for the relative case since it does not
        require a timedelta object.

        Note that it is not safe to call `add_timeout` from other threads.
        Instead, you must use `add_callback` to transfer control to the
        `IOLoop`'s thread, and then call `add_timeout` from there.

        Subclasses of IOLoop must implement either `add_timeout` or
        `call_at`; the default implementations of each will call
        the other.  `call_at` is usually easier to implement, but
        subclasses that wish to maintain compatibility with Tornado
        versions prior to 4.0 must use `add_timeout` instead.

        .. versionchanged:: 4.0
           Now passes through ``*args`` and ``**kwargs`` to the callback.
        úUnsupported deadline %r)	r:   ÚnumbersÚRealÚcall_atÚdatetimeÚ	timedeltar¢   Útotal_secondsÚ	TypeError)r!   r©   rª   r«   r6   s        r"   r¡   zIOLoop.add_timeout3  s¸   € õ@ �h¥¤Ñ-Ô-ð 	BØ�4”< ¨(ÐD°TÐDÐDÐD¸VÐDÐDÐDÝ˜¥(Ô"4Ñ5Ô5ð 	BØ�4”<Ø—	’	‘”˜h×4Ò4Ñ6Ô6Ñ6¸ðØCGðð ð ØKQðð ð õ Ð5¸Ñ@ÑAÔAÐAr%   Údelayc                 óP   —  | j         |                      ¦   «         |z   |g|¢R i |¤ŽS )a‚  Runs the ``callback`` after ``delay`` seconds have passed.

        Returns an opaque handle that may be passed to `remove_timeout`
        to cancel.  Note that unlike the `asyncio` method of the same
        name, the returned object does not have a ``cancel()`` method.

        See `add_timeout` for comments on thread-safety and subclassing.

        .. versionadded:: 4.0
        )r°   r¢   )r!   rµ   rª   r«   r6   s        r"   Ú
call_laterzIOLoop.call_later\  s5   € ð ˆtŒ|˜DŸIšI™KœK¨%Ñ/°ÐK¸DÐKÐKÐKÀFÐKÐKÐKr%   Úwhenc                 ó&   —  | j         ||g|¢R i |¤ŽS )aæ  Runs the ``callback`` at the absolute time designated by ``when``.

        ``when`` must be a number using the same reference point as
        `IOLoop.time`.

        Returns an opaque handle that may be passed to `remove_timeout`
        to cancel.  Note that unlike the `asyncio` method of the same
        name, the returned object does not have a ``cancel()`` method.

        See `add_timeout` for comments on thread-safety and subclassing.

        .. versionadded:: 4.0
        )r¡   )r!   r¸   rª   r«   r6   s        r"   r°   zIOLoop.call_atk  s)   € ð   ˆtÔ  hÐ@°Ð@Ð@Ð@¸Ð@Ð@Ð@r%   c                 ó   — t          ¦   «         ‚)zÃCancels a pending timeout.

        The argument is a handle as returned by `add_timeout`.  It is
        safe to call `remove_timeout` even if the callback has already
        been run.
        rb   )r!   r‡   s     r"   r£   zIOLoop.remove_timeout}  r~   r%   c                 ó   — t          ¦   «         ‚)aÙ  Calls the given callback on the next I/O loop iteration.

        It is safe to call this method from any thread at any time,
        except from a signal handler.  Note that this is the **only**
        method in `IOLoop` that makes this thread-safety guarantee; all
        other interaction with the `IOLoop` must be done from that
        `IOLoop`'s thread.  `add_callback()` may be used to transfer
        control from other threads to the `IOLoop`'s thread.
        rb   ©r!   rª   r«   r6   s       r"   r    zIOLoop.add_callback†  s   € õ "Ñ#Ô#Ð#r%   c                 ó   — t          ¦   «         ‚)aˆ  Calls the given callback on the next I/O loop iteration.

        Intended to be afe for use from a Python signal handler; should not be
        used otherwise.

        .. deprecated:: 6.4
           Use ``asyncio.AbstractEventLoop.add_signal_handler`` instead.
           This method is suspected to have been broken since Tornado 5.0 and
           will be removed in version 7.0.
        rb   r¼   s       r"   Úadd_callback_from_signalzIOLoop.add_callback_from_signal’  s   € õ "Ñ#Ô#Ð#r%   c                 ó(   —  | j         |g|¢R i |¤Ž dS )z§Calls the given callback on the next IOLoop iteration.

        As of Tornado 6.0, this method is equivalent to `add_callback`.

        .. versionadded:: 4.0
        N©r    r¼   s       r"   Úspawn_callbackzIOLoop.spawn_callback¡  s-   € ð 	ˆÔ˜(Ð4 TÐ4Ð4Ð4¨VÐ4Ð4Ð4Ð4Ð4r%   rŠ   z0Union[Future[_T], concurrent.futures.Future[_T]]z
Future[_T]c                 ó´   ‡ ‡— t          |t          ¦  «        r|                     ˆˆ fd„¦  «         dS t          |¦  «        sJ ‚t	          |ˆˆ fd„¦  «         dS )aA  Schedules a callback on the ``IOLoop`` when the given
        `.Future` is finished.

        The callback is invoked with one argument, the
        `.Future`.

        This method only accepts `.Future` objects and not other
        awaitables (unlike most of Tornado where the two are
        interchangeable).
        c                 óT   •— ‰                      t          j        ‰| ¦  «        ¦  «        S r   )Ú_run_callbackÚ	functoolsÚpartial©Úfrª   r!   s    €€r"   r�   z#IOLoop.add_future.<locals>.<lambda>Ã  s"   ø€ ˜$×,Ò,­YÔ->¸xÈÑ-KÔ-KÑLÔL€ r%   c                 ó0   •— ‰                      ‰| ¦  «        S r   rÀ   rÇ   s    €€r"   r�   z#IOLoop.add_future.<locals>.<lambda>É  s   ø€ °t×7HÒ7HÈÐSTÑ7UÔ7U€ r%   N)r:   r   Úadd_done_callbackr   r   )r!   rŠ   rª   s   ` `r"   r•   zIOLoop.add_futureª  s‡   øø€ õ �f�fÑ%Ô%ð 	Wð ×$Ò$ØLÐLÐLÐLÐLñô ð ð ð õ ˜VÑ$Ô$Ð$Ð$Ð$õ % VÐ-UÐ-UÐ-UÐ-UÐ-UÑVÔVÐVÐVÐVr%   Úexecutor.c                 ó  ‡— |€Mt          | d¦  «        s6ddlm} t          j                              |¦   «         dz  ¬¦  «        | _        | j        } |j        |g|¢R Ž }t          ¦   «         Š|  	                    |ˆfd„¦  «         ‰S )z÷Runs a function in a ``concurrent.futures.Executor``. If
        ``executor`` is ``None``, the IO loop's default executor will be used.

        Use `functools.partial` to pass keyword arguments to ``func``.

        .. versionadded:: 5.0
        NÚ	_executorr   )Ú	cpu_counté   )Úmax_workersc                 ó$   •— t          | ‰¦  «        S r   )r   )rÈ   Út_futures    €r"   r�   z(IOLoop.run_in_executor.<locals>.<lambda>ä  s   ø€ ­L¸¸HÑ,EÔ,E€ r%   )
ÚhasattrÚtornado.processrÎ   Ú
concurrentÚfuturesÚThreadPoolExecutorrÍ   Úsubmitr   r•   )r!   rË   r†   r«   rÎ   Úc_futurerÒ   s         @r"   Úrun_in_executorzIOLoop.run_in_executorË  s¬   ø€ ð ÐÝ˜4 Ñ-Ô-ð Ø5Ð5Ð5Ð5Ð5Ð5å!+Ô!3×!FÒ!FØ!* ¡¤¨q¡ð "Gñ "ô "�”ð ”~ˆHØ"�8”? 4Ð/¨$Ð/Ð/Ð/ˆõ ‘8”8ˆØ�Š˜Ð"EÐ"EÐ"EÐ"EÑFÔFÐFØˆr%   c                 ó   — || _         dS )zfSets the default executor to use with :meth:`run_in_executor`.

        .. versionadded:: 5.0
        N)rÍ   )r!   rË   s     r"   Úset_default_executorzIOLoop.set_default_executorç  s   € ð
 "ˆŒˆˆr%   c                 ó&  — 	  |¦   «         }|�Jddl m} 	 |                     |¦  «        }|                      || j        ¦  «         dS # |j        $ r Y dS w xY wdS # t          j        $ r Y dS t          $ r t          j
        d|d¬¦  «         Y dS w xY w)z€Runs a callback with error handling.

        .. versionchanged:: 6.0

           CancelledErrors are no longer logged.
        Nr   )ÚgenúException in callback %rT©r”   )ÚtornadorÞ   r�   r•   Ú_discard_future_resultÚBadYieldErrorrR   ÚCancelledErrorr’   r	   Úerror)r!   rª   ÚretrÞ   s       r"   rÄ   zIOLoop._run_callbackî  sð   € ð	OØ�(‘*”*ˆCØˆØ'Ð'Ð'Ð'Ð'Ð'ðFØ×-Ò-¨cÑ2Ô2�Cð —O’O C¨Ô)DÑEÔEÐEÐEÐEøð Ô(ð ð ð ð �D�Dð	øøøð ˆøõ  Ô%ð 	ð 	ð 	ØˆDˆDÝð 	Oð 	Oð 	OÝŒMÐ4°hÈÐNÑNÔNÐNÐNÐNÐNð	Oøøøs9   ‚A •A ªA Á
AÁA ÁAÁA ÁBÁ, BÂBc                 ó.   — |                      ¦   «          dS )z;Avoid unhandled-exception warnings from spawned coroutines.N)r–   )r!   rŠ   s     r"   râ   zIOLoop._discard_future_result  s   € à�Š‰Œˆˆˆr%   c                 ó`   — t          |t          ¦  «        r||fS |                     ¦   «         |fS r   )r:   r,   r#   r€   s     r"   Úsplit_fdzIOLoop.split_fd  s1   € õ$ �b�#ÑÔð 	Ø�r�6ˆMØ�yŠy‰{Œ{˜BˆÐr%   c                 ó¨   — 	 t          |t          ¦  «        rt          j        |¦  «         d S |                     ¦   «          d S # t          $ r Y d S w xY wr   )r:   r,   Úosr'   ÚOSErrorr€   s     r"   Úclose_fdzIOLoop.close_fd&  s]   € ð	Ý˜"�cÑ"Ô"ð Ý”˜‘”���à—’‘
”
�
�
�
øÝð 	ð 	ð 	ØˆDˆDð	øøøs   ‚)A ­A Á
AÁArÈ   c                 ó:   — | j                              |¦  «         d S r   )Ú_pending_tasksÚadd©r!   rÈ   s     r"   Ú_register_taskzIOLoop._register_task:  s   € ØÔ×Ò Ñ"Ô"Ð"Ð"Ð"r%   c                 ó:   — | j                              |¦  «         d S r   )rï   Údiscardrñ   s     r"   Ú_unregister_taskzIOLoop._unregister_task=  s   € ØÔ×#Ò# AÑ&Ô&Ð&Ð&Ð&r%   )r   r1   r(   )T)Fr   )Jr)   r*   r+   Ú__doc__ÚNONEÚREADÚWRITEÚERRORÚdictrV   Úsetrï   Úclassmethodr   r@   ÚstaticmethodrE   rH   rK   r�   ÚoverloadrD   rŸ   r   rG   r`   rJ   re   rg   r   r
   rk   rn   rp   r'   r,   r   rx   r.   r   r   r}   r�   rƒ   r…   Úfloatr§   r¢   r±   r²   Úobjectr¡   r·   r°   r£   r    r¾   rÁ   r•   rÕ   rÖ   ÚExecutorr-   rÚ   rÜ   rÄ   r   râ   r   ré   rí   rò   rõ   Ú__classcell__)rB   s   @r"   r1   r1   H   sÕ  ø€ € € € € ðKð Kð\ €DØ€DØ€EØ€Eð ˜$™&œ&Ðð �S‘U”U€Nàð	*Ø9ð	*ØEHð	*à	ð	*ð 	*ð 	*ð 	*ð 	*ñ „[ð	*ð ð ð  ð  ñ „\ð ð*ð ð ð ð ðð ð ñ „\ðð „_Øðð ð ñ „\ñ „_ðð „_Øðð ˜$ð ¨(°8Ô*<ð ð ð ñ „\ñ „_ðð ð*ð *˜$ð *¨(°8Ô*<ð *ð *ð *ñ „\ð*ðXð ð ð ð6$ð $ð $ð $ð ð ð  ð  ñ „\ð ð  ð&ð &ð &ñ „\ð&ð
ð ð ð ð ð $ |Ô"4ð ð ð ñ „[ðð ð T¨,Ô%7ð ð ð ñ „[ðð
!ð ! tð !°tð !ð !ð !ð !ð$ð $˜Tð $¨dð $ð $ð $ð $ð6 „_ðØðØ (¨#¨s¨°TÐ)9Ô :ðØDGðà	ðð ð ñ „_ðð
 „_ðØðØ'¨¨S¨	°4¨Ô8ðØBEðà	ðð ð ñ „_ðð
$Ø˜˜[Ð(Ô)ð$Ø4<¸YÔ4Gð$ØQTð$à	ð$ð $ð $ð $ð&$  s¨KÐ'7Ô!8ð $À#ð $È$ð $ð $ð $ð $ð$  s¨KÐ'7Ô!8ð $¸Tð $ð $ð $ð $ð$ð $ð $ð $ð$ð $ð $ð $ðU.ð U.˜Xð U.°¸´ð U.È3ð U.ð U.ð U.ð U.ðn�eð ð ð ð ð'Bà˜˜xÔ1Ð1Ô2ð'Bð ð'Bð ð	'Bð
 ð'Bð 
ð'Bð 'Bð 'Bð 'BðRLØðLØ&.ðLØ7:ðLØFIðLà	ðLð Lð Lð LðAØðAØ%-ðAØ69ðAØEHðAà	ðAð Að Að Að$$ fð $°ð $ð $ð $ð $ð
$ Xð 
$°cð 
$ÀSð 
$ÈTð 
$ð 
$ð 
$ð 
$ð$Ø ð$Ø),ð$Ø8;ð$à	ð$ð $ð $ð $ð5 xð 5¸ð 5Àsð 5Ètð 5ð 5ð 5ð 5ðWàBðWð ˜L˜>¨4Ð/Ô0ðWð 
ð	Wð Wð Wð WðBà˜:Ô-Ô6Ô7ðð �s˜B�wÔðð ð	ð
 
ðð ð ð ð8"¨ZÔ-?Ô-Hð "ÈTð "ð "ð "ð "ðO h¨r°3¨wÔ&7ð O¸Dð Oð Oð Oð Oð<¨Vð ¸ð ð ð ð ðØ˜˜[Ð(Ô)ðà	ˆs�E˜#˜{Ð*Ô+Ð+Ô	,ðð ð ð ð,˜5  kÐ!1Ô2ð °tð ð ð ð ð(# ð #¨4ð #ð #ð #ð #ð' &ð '¨Tð 'ð 'ð 'ð 'ð 'ð 'ð 'ð 'r%   r1   c                   ób   — e Zd ZdZg d¢Zdedeg df         deddfd„Zd	d de	fd
„Z
d	d de	fd„ZdS )Ú_Timeoutz2An IOLoop timeout, a UNIX timestamp and a callback)r©   rª   Ú	tdeadliner©   rª   NÚio_loopr   c                 ó°   — t          |t          j        ¦  «        st          d|z  ¦  «        ‚|| _        || _        |t          |j        ¦  «        f| _        d S )Nr­   )	r:   r®   r¯   r´   r©   rª   ÚnextÚ_timeout_counterr  )r!   r©   rª   r  s       r"   Ú__init__z_Timeout.__init__G  sY   € õ ˜(¥G¤LÑ1Ô1ð 	BÝÐ5¸Ñ@ÑAÔAÐAØ ˆŒØ ˆŒàÝ�Ô)Ñ*Ô*ð
ˆŒˆˆr%   Úotherc                 ó"   — | j         |j         k     S r   ©r  ©r!   r  s     r"   Ú__lt__z_Timeout.__lt__W  s   € ØŒ~ ¤Ò/Ð/r%   c                 ó"   — | j         |j         k    S r   r  r  s     r"   Ú__le__z_Timeout.__le__Z  s   € ØŒ~ ¤Ò0Ð0r%   )r)   r*   r+   rö   Ú	__slots__r   r   r1   r  rŸ   r  r  r   r%   r"   r  r  A  s¨   € € € € € Ø<Ð<ð 6Ð5Ð5€Ið

Øð

Ø)1°"°d°(Ô);ð

ØFLð

à	ð

ð 

ð 

ð 

ð 0˜Jð 0¨4ð 0ð 0ð 0ð 0ð1˜Jð 1¨4ð 1ð 1ð 1ð 1ð 1ð 1r%   r  c            	       ó    — e Zd ZdZ	 ddeg ee         f         deej	        e
f         de
ddfd„Zdd	„Zdd
„Zdefd„Zdd„Zdd„Zde
ddfd„ZdS )ÚPeriodicCallbacka�  Schedules the given callback to be called periodically.

    The callback is called every ``callback_time`` milliseconds when
    ``callback_time`` is a float. Note that the timeout is given in
    milliseconds, while most other time-related functions in Tornado use
    seconds. ``callback_time`` may alternatively be given as a
    `datetime.timedelta` object.

    If ``jitter`` is specified, each callback time will be randomly selected
    within a window of ``jitter * callback_time`` milliseconds.
    Jitter can be used to reduce alignment of events with similar periods.
    A jitter of 0.1 means allowing a 10% variation in callback time.
    The window is centered on ``callback_time`` so the total number of calls
    within a given interval should not be significantly affected by adding
    jitter.

    If the callback runs for longer than ``callback_time`` milliseconds,
    subsequent invocations will be skipped to get back on schedule.

    `start` must be called after the `PeriodicCallback` is created.

    .. versionchanged:: 5.0
       The ``io_loop`` argument (deprecated since version 4.1) has been removed.

    .. versionchanged:: 5.1
       The ``jitter`` argument is added.

    .. versionchanged:: 6.2
       If the ``callback`` argument is a coroutine, and a callback runs for
       longer than ``callback_time``, subsequent invocations will be skipped.
       Previously this was only true for regular functions, not coroutines,
       which were "fire-and-forget" for `PeriodicCallback`.

       The ``callback_time`` argument now accepts `datetime.timedelta` objects,
       in addition to the previous numeric milliseconds.
    r   rª   Úcallback_timeÚjitterr   Nc                 óæ   — || _         t          |t          j        ¦  «        r|t          j        d¬¦  «        z  | _        n|dk    rt          d¦  «        ‚|| _        || _        d| _        d | _        d S )Nr2   )Úmillisecondsr   z4Periodic callback must have a positive callback_timeF)	rª   r:   r±   r²   r  Ú
ValueErrorr  Ú_runningÚ_timeout)r!   rª   r  r  s       r"   r  zPeriodicCallback.__init__„  sz   € ð !ˆŒÝ�m¥XÔ%7Ñ8Ô8ð 	/Ø!.µÔ1CÐQRÐ1SÑ1SÔ1SÑ!SˆDÔÐà Ò!Ð!Ý Ð!WÑXÔXÐXØ!.ˆDÔØˆŒØˆŒØˆŒˆˆr%   c                 ó´   — t                                ¦   «         | _        d| _        | j                             ¦   «         | _        |                      ¦   «          dS )zStarts the timer.TN)r1   rD   r  r  r¢   Ú_next_timeoutÚ_schedule_nextr    s    r"   rƒ   zPeriodicCallback.start•  sJ   € õ
 —~’~Ñ'Ô'ˆŒØˆŒØ!œ\×.Ò.Ñ0Ô0ˆÔØ×ÒÑÔÐÐÐr%   c                 ór   — d| _         | j        �(| j                             | j        ¦  «         d| _        dS dS )zStops the timer.FN)r  r  r  r£   r    s    r"   r…   zPeriodicCallback.stopŸ  s<   € àˆŒØŒ=Ð$ØŒL×'Ò'¨¬Ñ6Ô6Ð6Ø ˆDŒMˆMˆMð %Ð$r%   c                 ó   — | j         S )zfReturns ``True`` if this `.PeriodicCallback` has been started.

        .. versionadded:: 4.1
        )r  r    s    r"   Ú
is_runningzPeriodicCallback.is_running¦  s   € ð
 Œ}Ðr%   c              ƒ   ó,  K  — | j         sd S 	 |                      ¦   «         }|�t          |¦  «        r|ƒ d {V —† n,# t          $ r t	          j        d| j        d¬¦  «         Y nw xY w|                      ¦   «          d S # |                      ¦   «          w xY w)Nrß   Trà   )r  rª   r   r’   r	   rå   r  )r!   Úvals     r"   Ú_runzPeriodicCallback._run­  s»   è è € ØŒ}ð 	ØˆFð	"Ø—-’-‘/”/ˆCØˆ¥;¨sÑ#3Ô#3ˆØ�	�	�	�	�	�	�	øøÝð 	Tð 	Tð 	TÝŒMÐ4°d´mÈdÐSÑSÔSÐSÐSÐSð	Tøøøð ×ÒÑ!Ô!Ð!Ð!Ð!øˆD×ÒÑ!Ô!Ð!Ð!øøøs&   �-; ºA= »&A$Á!A= Á#A$Á$A= Á=Bc                 óÄ   — | j         rX|                      | j                             ¦   «         ¦  «         | j                             | j        | j        ¦  «        | _        d S d S r   )r  Ú_update_nextr  r¢   r¡   r  r%  r  r    s    r"   r  zPeriodicCallback._schedule_next¹  s]   € ØŒ=ð 	TØ×Ò˜dœl×/Ò/Ñ1Ô1Ñ2Ô2Ð2Ø œL×4Ò4°TÔ5GÈÌÑSÔSˆDŒMˆMˆMð	Tð 	Tr%   Úcurrent_timec                 ó  — | j         dz  }| j        r$|d| j        t          j        ¦   «         dz
  z  z   z  }| j        |k    r5| xj        t	          j        || j        z
  |z  ¦  «        dz   |z  z  c_        d S | xj        |z  c_        d S )Ng     @�@r2   g      à?)r  r  Úrandomr  ÚmathÚfloor)r!   r(  Úcallback_time_secs      r"   r'  zPeriodicCallback._update_next¾  s­   € Ø Ô.°Ñ7ÐØŒ;ð 	Mà  d¤kµV´]±_´_ÀsÑ5JÑ&KÑ!LÑLÐØÔ Ò-Ð-ð
 ÐÔÝ”
˜L¨4Ô+=Ñ=ÐARÑRÑSÔSÐVWÑWØ!ñ#"ñ "ÐÔÐÐð$ ÐÔÐ"3Ñ3ÐÔÐÐr%   )r   r(   )r)   r*   r+   rö   r   r   r   r   r±   r²   r   r  rƒ   r…   rŸ   r"  r%  r  r'  r   r%   r"   r  r  ^  s  € € € € € ð#ð #ðR ð	ð à˜2˜x¨	Ô2Ð2Ô3ðð ˜XÔ/°Ð6Ô7ðð ð	ð
 
ðð ð ð ð"ð ð ð ð!ð !ð !ð !ð˜Dð ð ð ð ð
"ð 
"ð 
"ð 
"ðTð Tð Tð Tð
4¨ð 4°4ð 4ð 4ð 4ð 4ð 4ð 4r%   r  )2rö   rR   Úconcurrent.futuresrÕ   r±   rÅ   r®   rë   r“   r¢   r+  r*  r]   Úinspectr   Útornado.concurrentr   r   r   r   r   Útornado.logr	   Útornado.utilr
   r   r   r�   r   r   r   r   r   r   r   r   rž   r   r   r   r   Útyping_extensionsr   r  r   r-   r.   r1   r  r  r   r%   r"   ú<module>r4     sv  ðð ð ð €€€Ø Ð Ð Ð Ø €€€Ø Ð Ð Ð Ø €€€Ø 	€	€	€	Ø 
€
€
€
Ø €€€Ø €€€Ø €€€Ø €€€Ø Ð Ð Ð Ð Ð ðð ð ð ð ð ð ð ð ð ð ð ð ð ð  Ð Ð Ð Ð Ð Ø BÐ BÐ BÐ BÐ BÐ BÐ BÐ BÐ BÐ Bà €€€Ø RÐ RÐ RÐ RÐ RÐ RÐ RÐ RÐ RÐ RÐ RÐ RÐ RÐ RÐ RÐ RÐ RÐ RÐ RÐ Rà	Ôð Ø1Ð1Ð1Ð1Ð1Ð1Ð1Ð1Ð1Ð1Ð1Ð1à*Ð*Ð*Ð*Ð*Ð*Ð*à€Hðð ð ð ð �(ñ ô ð ð €WˆT�]„]€Ø€WˆT˜Ð%Ñ%Ô%€ðv'ð v'ð v'ð v'ð v'ˆ\ñ v'ô v'ð v'ðr1ð 1ð 1ð 1ð 1ñ 1ô 1ð 1ð:|4ð |4ð |4ð |4ð |4ñ |4ô |4ð |4ð |4ð |4r%   