Ë
    g^(hÊ5  ã                  ó  — U d Z ddlmZ ddlmZmZ ddlmZ ddlm	Z	m
Z
mZmZmZmZmZ ddlmZ ddlmZmZmZmZmZmZmZ er(dd	l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&  e«       Z' ed«      Z( G d„ d«      Z) e*«       Z+ G d„ dee(   «      Z, G d„ de)«      Z- e,d ee.ee	      e«      «      Z/de0d<    e,de)«      Z1de0d<    e,de)«      Z2de0d<    e,d e)«      Z3d!e0d"<    e,d#e-«      Z4d$e0d%<    e,d&e)«      Z5d'e0d(<    e,d)e)«      Z6d*e0d+<    e,d,e)«      Z7d-e0d.<    e,d/e)«      Z8d0e0d1<    e,d2e)«      Z9d3e0d4<   d5„ Z: e,d6e:«      Z;d7e0d8<    G d9„ d:«      Z< G d;„ d<e«      Z= e=«       Z>d=e0d<    G d>„ d?«      Z? e?«       Z@y	)@ak  
This file provides a number of "global" variables/handlers that are actually
thread local and dynamically scoped, with Inductor patching them to various
implementations depending on the situation.

These handlers are interacted with in a fairly stylized way.  Typically,
we will import V from this module::

    from .virtualized import V

Various handlers are accessible as attributes on this module; for example,
you might access ``V.graph.sizevars.size_hint`` to resolve a size hint associated with
a number.

There are a few distinct usage patterns for virtualized global variables:

1. Implicit argument passing.  Examples: ``V.current_node``, ``V.aot_compilation``.
   Use ``V.set_current_node`` to change what the current node is while we're
   executing some region of code, so code inside that region can query ``V.current_node``
   to find out what it is.  This is often more convenient than manually threading
   the current node as an argument through all call stacks.

2. Per-compilation global state.  Examples: ``V.fake_mode``, ``V.graph``.  For a
   given ``compile_fx`` invocation, these typically don't change, but they are
   associated with some internal state so they cannot just be global functions.
   We install these objects at the beginning of compilation and then you can
   conveniently access them without having to pass them around.

3. Alternate define-by-run interpretations.  Examples: ``V.ops``, ``V.kernel``.
   A commonly used IR in Inductor is define-by-run: instead of maintaining
   explicit syntax data structures, we instead represent loop bodies as
   callable functions, which internally invoke operations defined on
   ``V.ops``.  To perform semantic analysis, print or code generate these
   operations, we dynamically patch ``V.ops`` with an alternate handler with
   the intended semantics and then run the callable function.  For example, to
   extract out a traditional (FX) graph representation of the define-by-run
   IR, simply install a handler that records each ``ops`` call to a graph.

   TODO: Define a parent class / protocol that defines all of the operations
   V.ops is expected to support.

It is typically an error to access a virtualized global without having installed
an appropriate handler (you will get a NullHandler), although in some cases we
provide a default implementation.

One last thing: although most virtualized globals are accessed via ``V``, ``ops`` is
ubiquitous enough to have its own top level variable, so you will typically see
``ops.constant(...)`` rather than ``V.ops.constant(...)``.  In fact, these are not
equivalent; the former interface supports arithmetic overloads like ``x + y``
instead of forcing ``ops.add(x, y)``, so it should be preferred.

Some operators are seemingly unused, but they are implicitly used by ops_wrapper.
In particular, we typically have an operator for every basic pointwise PyTorch operation
supported.
é    )Úannotations)ÚAbstractContextManagerÚcontextmanager)Úlocal)ÚAnyÚCallableÚcastÚGenericÚTYPE_CHECKINGÚTypeVarÚUnion)Ú
OrderedSeté   )ÚDefaultHandlerÚKernelFormatterHandlerÚMockHandlerÚ
OpsHandlerÚReductionTypeÚ	StoreModeÚWrapperHandlerN©ÚInductorChoices)ÚLocalBufferContext)ÚDebugContext)ÚGraphLowering)ÚInterpreterShim)ÚFakeTensorModeÚTc                  ó   — e Zd ZdZy)ÚNullHandlerzð
    Sentinel indicating that a global variable is unset ala None.  Typically,
    attempting to access the global variable before it's set is an error, but with
    NullHandler it won't fail until you try to access an attribute on it.
    N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__© ó    úY/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/torch/_inductor/virtualized.pyr    r    [   s   „ òr&   r    c                  ó2   — e Zd ZdZdd„Zdd„Zd	d
d„Zdd„Zy)ÚVirtualizedaÃ  
    Implements a global variable that redirects via thread local variable
    (NB: construct this class to create the global variable; this is not
    a singleton class!)

    This allows us to swap in different op implementations in codegen.

    NB: Despite the fact that we typically call these "handlers" (e.g., NullHandler is
    the default value of the variable), we sometimes use these variables to
    store other things, like booleans.
    c                ó4   — || _         d|› �| _        || _        y )NÚ__torchinductor_)Ú_vnameÚ_keyÚ_default)ÚselfÚvnameÚdefaults      r'   Ú__init__zVirtualized.__init__x   s   € ØˆŒØ+¨E¨7Ð3ˆŒ	Øˆ�r&   c                óŠ   ‡ ‡— ‰ j                  d«      Št        t        ‰ j                  |«       t        ˆˆ fd„«       } |«       S )NFc               3  óf   •K  — 	 d –— ‰j                  ‰ «       y # ‰j                  ‰ «       w xY w­w©N)Ú_set_handler)Úpriorr/   s   €€r'   Úctxz%Virtualized._set_handler.<locals>.ctx�   s+   øè ø€ ð)Ûà×!Ñ! %Õ(ø�×!Ñ! %Õ(üs   ƒ1… ‰1›.®1)Ú_get_handlerÚsetattrÚthreadlocalr-   r   )r/   Úvaluer8   r7   s   `  @r'   r6   zVirtualized._set_handler}   s>   ù€ Ø×!Ñ! %Ó(ˆÜ”˜TŸY™Y¨Ô.ä	ô	)ó 
ð	)ñ ‹uˆr&   c                óÀ   — 	 t        t        | j                  «      }|r!|t        u rt	        d| j
                  › d�«      ‚|S # t        $ r | j                  «       cY S w xY w)Nz+Attempt to use poisoned virtualized value 'z'.)Úgetattrr;   r-   Ú_PoisonedVirtualÚRuntimeErrorr,   ÚAttributeErrorr.   )r/   Úcheck_poisonedr<   s      r'   r9   zVirtualized._get_handlerŠ   sc   € ð	#ÜœK¨¯©Ó3ˆEÙ %Ô+;Ñ";Ü"ØAÀ$Ç+Á+ÀÈbÐQóð ð ˆLøÜò 	#ð —=‘=“?Ò"ð		#ús   ‚>A ÁAÁAc                ó6   — t        | j                  «       |«      S r5   )r>   r9   )r/   Únames     r'   Ú__getattr__zVirtualized.__getattr__˜   s   € Ü�t×(Ñ(Ó*¨DÓ1Ð1r&   N)r0   Ústrr1   z)Union[Callable[[], T], type[NullHandler]])r<   r   ÚreturnzAbstractContextManager[None])T)rB   ÚboolrG   r   )rD   rF   rG   r   )r!   r"   r#   r$   r2   r6   r9   rE   r%   r&   r'   r)   r)   k   s   „ ñ
ó ó
ô#ô2r&   r)   c                  ó"   ‡ — e Zd ZdZˆ fd„Zˆ xZS )ÚNullKernelHandleraO  
    We need access `V.kernel.removed_buffers` in DeferredLine class when there
    is no kernel in the context. This happens when codegening the wrapper.
    Initialize `removed_buffers` and `inplaced_to_remove` explicitly so we don't
    need call 'getattr' with default value which is error prone to typo in
    attribute name.
    c                óˆ   •— t         ‰| �  «        t        t           «       | _        t        t           «       | _        d| _        y )Nztl.int64)Úsuperr2   r   r   Úremoved_buffersÚinplaced_to_removeÚindex_dtype)r/   Ú	__class__s    €r'   r2   zNullKernelHandler.__init__¥   s4   ø€ Ü‰ÑÔÜ)¬#™Ó0ˆÔÜ",¬S¡/Ó"3ˆÔØ%ˆÕr&   )r!   r"   r#   r$   r2   Ú__classcell__)rP   s   @r'   rJ   rJ   œ   s   ø„ ñ÷&ð &r&   rJ   ÚopszVirtualized[OpsHandler[Any]]Ú_opsÚgraphzVirtualized[GraphLowering]Ú_graphÚreal_inputszVirtualized[list[torch.Tensor]]Ú_real_inputsÚ	fake_modezVirtualized[FakeTensorMode]Ú
_fake_modeÚkernelzVirtualized[NullKernelHandler]Ú_kernelÚdebugzVirtualized[DebugContext]Ú_debugÚinterpreterzVirtualized[InterpreterShim]Ú_interpreterÚaot_compilationzVirtualized[bool]Ú_aot_compilationÚcurrent_nodezVirtualized[torch.fx.Node]Ú_current_nodeÚlocal_buffer_contextzVirtualized[LocalBufferContext]Ú_local_buffer_contextc                 ó^   — ddl m}   | «       }t        t        t        j
                  |«       |S )z‰
    Lazy init the global choices handler

    We virtualize InductorChoices to allow changing inductor heuristics from out of tree.
    r   r   )Útorch._inductor.choicesr   r:   r;   Ú_choicesr-   )r   Úrvs     r'   Ú_choices_defaultrj   ¾   s$   € õ 8á	Ó	€BÜŒKœŸ™¨Ô+Ø€Ir&   ÚchoiceszVirtualized[InductorChoices]rh   c                  ó¦   — e Zd ZU dZded<   d„ Zd„ Zd„ Zd„ Zd„ Z	d	„ Z
d
„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zy)ÚOpsValuea,  The return type of most ops calls.

    This exists so we can overload magic methods, and write mathematical
    expressions much more fluently. So instead of

        ops.add(ops.mul(ops.mul(ops.sub(ops.mul(_Ap2, x), _Ap3), x), x), _1)

    we can write

        (_Ap2 * x - _Ap3) * x * x + _1

    r   r<   c                ó   — || _         y r5   ©r<   )r/   r<   s     r'   r2   zOpsValue.__init__Þ   s	   € Øˆ�
r&   c                ó,   — t        | j                  «      S r5   )rF   r<   ©r/   s    r'   Ú__str__zOpsValue.__str__á   s   € Ü�4—:‘:‹Ðr&   c                ó"   — d| j                   ›d�S )Nz	OpsValue(ú)ro   rq   s    r'   Ú__repr__zOpsValue.__repr__ä   s   € Ø˜4Ÿ:™:˜.¨Ð*Ð*r&   c                ó.   — t         j                  | |«      S r5   )rR   Úadd©r/   Úothers     r'   Ú__add__zOpsValue.__add__ç   ó   € Ü�w‰w�t˜UÓ#Ð#r&   c                ó.   — t         j                  | |«      S r5   )rR   Úmulrx   s     r'   Ú__mul__zOpsValue.__mul__ê   r{   r&   c                ó.   — t         j                  | |«      S r5   )rR   Úsubrx   s     r'   Ú__sub__zOpsValue.__sub__í   r{   r&   c                ó,   — t         j                  | «      S r5   )rR   Únegrq   s    r'   Ú__neg__zOpsValue.__neg__ð   s   € Ü�w‰w�t‹}Ðr&   c                ó.   — t         j                  | |«      S r5   )rR   Útruedivrx   s     r'   Ú__truediv__zOpsValue.__truediv__ó   s   € Ü�{‰{˜4 Ó'Ð'r&   c                ó.   — t         j                  | |«      S r5   )rR   Úfloordivrx   s     r'   Ú__floordiv__zOpsValue.__floordiv__ö   s   € Ü�|‰|˜D %Ó(Ð(r&   c                ó.   — t         j                  | |«      S r5   )rR   Úmodrx   s     r'   Ú__mod__zOpsValue.__mod__ù   r{   r&   c                ó.   — t         j                  | |«      S r5   )rR   Úpowrx   s     r'   Ú__pow__zOpsValue.__pow__ü   r{   r&   c                ó.   — t         j                  | |«      S r5   )rR   Últrx   s     r'   Ú__lt__zOpsValue.__lt__ÿ   ó   € Ü�v‰v�d˜EÓ"Ð"r&   c                ó.   — t         j                  | |«      S r5   )rR   Úlerx   s     r'   Ú__le__zOpsValue.__le__  r”   r&   c                ó.   — t         j                  | |«      S r5   )rR   Úeqrx   s     r'   Ú__eq__zOpsValue.__eq__  r”   r&   c                ó.   — t         j                  | |«      S r5   )rR   Únerx   s     r'   Ú__ne__zOpsValue.__ne__  r”   r&   c                ó.   — t         j                  | |«      S r5   )rR   Úgtrx   s     r'   Ú__gt__zOpsValue.__gt__  r”   r&   c                ó.   — t         j                  | |«      S r5   )rR   Úgerx   s     r'   Ú__ge__zOpsValue.__ge__  r”   r&   c                ó.   — t         j                  | |«      S r5   )rR   Úbitwise_andrx   s     r'   Ú__and__zOpsValue.__and__  ó   € Ü�‰˜t UÓ+Ð+r&   c                ó.   — t         j                  | |«      S r5   )rR   Ú
bitwise_orrx   s     r'   Ú__or__zOpsValue.__or__  s   € Ü�~‰~˜d EÓ*Ð*r&   c                ó.   — t         j                  | |«      S r5   )rR   Úbitwise_xorrx   s     r'   Ú__xor__zOpsValue.__xor__  r§   r&   c                ó,   — t         j                  | «      S r5   )rR   Úbitwise_notrq   s    r'   Ú
__invert__zOpsValue.__invert__  s   € Ü�‰˜tÓ$Ð$r&   c                ó.   — t         j                  | |«      S r5   )rR   Úbitwise_right_shift©r/   Úns     r'   Ú
__rshfit__zOpsValue.__rshfit__  s   € Ü×&Ñ& t¨QÓ/Ð/r&   c                ó.   — t         j                  | |«      S r5   )rR   Úbitwise_left_shiftr³   s     r'   Ú
__lshift__zOpsValue.__lshift__   s   € Ü×%Ñ% d¨AÓ.Ð.r&   N)r!   r"   r#   r$   Ú__annotations__r2   rr   ru   rz   r~   r�   r„   r‡   rŠ   r�   r�   r“   r—   rš   r�   r    r£   r¦   rª   r­   r°   rµ   r¸   r%   r&   r'   rm   rm   Î   s�   … ñð ƒJòòò+ò$ò$ò$òò(ò)ò$ò$ò#ò#ò#ò#ò#ò#ò,ò+ò,ò%ò0ó/r&   rm   c                  óJ   — e Zd ZdZdd„Zed„ «       Zed„ «       Zedd„«       Zy)	Ú
OpsWrapperz This wraps any returned IR values into an `OpsValue` instance, so that we
    can overload the magic methods for writing mathematical expressions fluently.
    c                ó  — |D �cg c]  }t         j                  |«      ‘Œ }}|j                  «       D ��ci c]  \  }}|t         j                  |«      “Œ }}}t         j                   t	        t
        |«      |i |¤Ž«      S c c}w c c}}w r5   )r»   Ú_unwrapÚitemsÚ_wrapr>   rS   )	r/   rD   ÚargsÚkwargsÚaÚnew_argsÚkÚvÚ
new_kwargss	            r'   r.   zOpsWrapper._default)  sz   € Ø37Ö8¨a”J×&Ñ& qÕ)Ð8ˆÐ8Ø;A¿<¹<»>×J±4°1°a�aœ×+Ñ+¨AÓ.Ñ.ÐJˆ
ÑJÜ×ÑÐ 3¤¬¨dÓ 3°XÐ LÀÑ LÓMÐMùò 9ùÛJs
   …B¶ Bc                óŽ   — t        | t        t        f«      rt        d„ | D «       «      S t        | t        «      r| j                  S | S )Nc              3  óF   K  — | ]  }t         j                  |«      –— Œ y ­wr5   )r»   r½   ©Ú.0rÅ   s     r'   ú	<genexpr>z%OpsWrapper._unwrap.<locals>.<genexpr>1  s   è ø€ Ò:°1œ×+Ñ+¨A×.Ñ:ùs   ‚!)Ú
isinstanceÚlistÚtuplerm   r<   ©Úxs    r'   r½   zOpsWrapper._unwrap.  s9   € ä�aœ$¤˜Ô'ÜÑ:¸Ô:Ó:Ð:Ü�aœÔ"Ø—7‘7ˆNØˆr&   c                óh   — t        | t        t        f«      rt        d„ | D «       «      S t        | «      S )Nc              3  ó2   K  — | ]  }t        |«      –— Œ y ­wr5   )rm   rÉ   s     r'   rË   z#OpsWrapper._wrap.<locals>.<genexpr>9  s   è ø€ Ò0¨œ !ŸÑ0ùs   ‚)rÌ   rÍ   rÎ   rm   rÏ   s    r'   r¿   zOpsWrapper._wrap6  s+   € ä�aœ$¤˜Ô'ÜÑ0¨aÔ0Ó0Ð0Ü˜‹{Ðr&   c                ó\   — t         j                  | «      } t        j                  | |||«      S r5   )r»   r½   rS   Úindirect_indexing)ÚindexÚsizeÚcheckÚwrap_negs       r'   rÔ   zOpsWrapper.indirect_indexing<  s+   € ô ×"Ñ" 5Ó)ˆÜ×%Ñ% e¨T°5¸(ÓCÐCr&   N)rD   rF   rÀ   ztuple[Any, ...]rÁ   zdict[str, Any]rG   r   )TT)	r!   r"   r#   r$   r.   Ústaticmethodr½   r¿   rÔ   r%   r&   r'   r»   r»   $  sK   „ ñóNð
 ñó ðð ñó ðð
 òDó ñDr&   r»   úOpsHandler[Any]c                  ó  — e Zd ZU eZeZeZej                  Zde	d<   ej                  Zde	d<   ej                  Zde	d<   ej                  Zde	d<   ej                  Zd	e	d
<   ej                  Zde	d<   ej                  Zd	e	d<   ej                  Zde	d<   ej                  Zde	d<   ej                  Zde	d<   ej                  Zde	d<   ej                  Zd	e	d<   ej                  Zde	d<   ej                  Zd	e	d<   e j                  Z!de	d<   e j                  Z"d	e	d<   e#j                  Z$de	d<   e%d$d„«       Z&e%d%d„«       Z'e%d„ «       Z(e%d„ «       Z)e%d„ «       Z*e%d„ «       Z+e%d„ «       Z,e%d„ «       Z-e%d „ «       Z.e%d!„ «       Z/e%d&d"„«       Z0y#)'Ú_Vz9Callable[[OpsHandler[Any]], AbstractContextManager[None]]Úset_ops_handlerzCallable[[], OpsHandler[Any]]Úget_ops_handlerzCallable[[GraphLowering], Any]Úset_graph_handlerzCallable[[Any], Any]Úset_real_inputszCallable[[], Any]Úget_real_inputsÚset_fake_modeÚget_fake_modeÚset_kernel_handlerÚset_debug_handlerÚset_interpreter_handlerzCallable[[bool], Any]Úset_aot_compilationÚget_aot_compilationÚset_current_nodeÚget_current_nodeÚset_local_buffer_contextÚget_local_buffer_contextÚset_choices_handlerc                ó*   — t         j                  «       S )z9The operator handler specific to the current codegen task)rS   r9   rq   s    r'   rR   z_V.ops_  s   € ô × Ñ Ó"Ð"r&   c                ó*   — t         j                  «       S ©z#The graph currently being generated)rU   r9   rq   s    r'   rT   z_V.graphd  s   € ô ×"Ñ"Ó$Ð$r&   c                ó*   — t         j                  «       S )znon-fake example inputs)rW   r9   rq   s    r'   rV   z_V.real_inputsi  s   € ô ×(Ñ(Ó*Ð*r&   c                ó*   — t         j                  «       S rð   )rY   r9   rq   s    r'   rX   z_V.fake_moden  s   € ô ×&Ñ&Ó(Ð(r&   c                ó*   — t         j                  «       S )z$The kernel currently being generated)r[   r9   rq   s    r'   rZ   z	_V.kernels  s   € ô ×#Ñ#Ó%Ð%r&   c                ó*   — t         j                  «       S r5   )r]   r9   rq   s    r'   r\   z_V.debugx  s   € ä×"Ñ"Ó$Ð$r&   c                ó*   — t         j                  «       S r5   )r_   r9   rq   s    r'   r^   z_V.interpreter|  s   € ä×(Ñ(Ó*Ð*r&   c                ó.   — t         j                  «       du S )NT)ra   r9   rq   s    r'   r`   z_V.aot_compilation€  s   € ä×,Ñ,Ó.°$Ð6Ð6r&   c                ó*   — t         j                  «       S r5   )rc   r9   rq   s    r'   rb   z_V.current_node„  s   € ä×)Ñ)Ó+Ð+r&   c                ó*   — t         j                  «       S r5   )re   r9   rq   s    r'   rd   z_V.local_buffer_contextˆ  s   € ä$×1Ñ1Ó3Ð3r&   c                ó*   — t         j                  «       S r5   )rh   r9   rq   s    r'   rk   z
_V.choicesŒ  s   € ä×$Ñ$Ó&Ð&r&   N)rG   rÚ   )rG   r   )rG   r   )1r!   r"   r#   r   r   r   rS   r6   rÝ   r¹   r9   rÞ   rU   rß   rW   rà   rá   rY   râ   rã   r[   rä   r]   rå   r_   ræ   ra   rç   rè   rc   ré   rê   re   rë   rì   rh   rí   ÚpropertyrR   rT   rV   rX   rZ   r\   r^   r`   rb   rd   rk   r%   r&   r'   rÜ   rÜ   F  s!  … Ø€KØ3ÐØ#€Nð 	×Ñð ÐNó ð 6:×5FÑ5F€OÐ2ÓFØ8>×8KÑ8KÐÐ5ÓKØ,8×,EÑ,E€OÐ)ÓEØ)5×)BÑ)B€OÐ&ÓBØ*4×*AÑ*A€MÐ'ÓAØ'1×'>Ñ'>€MÐ$Ó>Ø/6×/CÑ/CÐÐ,ÓCØ.4×.AÑ.AÐÐ+ÓAØ4@×4MÑ4MÐÐ1ÓMØ1A×1NÑ1NÐÐ.ÓNØ-=×-JÑ-JÐÐ*ÓJØ-:×-GÑ-GÐÐ*ÓGØ*7×*DÑ*DÐÐ'ÓDØ5J×5WÑ5WÐÐ2ÓWØ2G×2TÑ2TÐÐ/ÓTØ08×0EÑ0EÐÐ-ÓEàò#ó ð#ð ò%ó ð%ð ñ+ó ð+ð ñ)ó ð)ð ñ&ó ð&ð ñ%ó ð%ð ñ+ó ð+ð ñ7ó ð7ð ñ,ó ð,ð ñ4ó ð4ð ò'ó ñ'r&   rÜ   )Ar$   Ú
__future__r   Ú
contextlibr   r   Ú	threadingr   Útypingr   r   r	   r
   r   r   r   Útorch.utils._ordered_setr   Úops_handlerr   r   r   r   r   r   r   Útorchrg   r   Ú!torch._inductor.codegen.cpp_utilsr   Útorch._inductor.debugr   Útorch._inductor.graphr   Útorch._inductor.loop_bodyr   Útorch._subclassesr   r;   r   r    Úobjectr?   r)   rJ   ÚtyperS   r¹   rU   rW   rY   r[   r]   r_   ra   rc   re   rj   rh   rm   r»   rR   rÜ   ÚVr%   r&   r'   ú<module>r
     sÂ  ðò6õp #ç =Ý ß N× NÑ Nå /÷÷ ñ ñ ÛÝ7ÝDÝ2Ý3Ý9Ý0á‹g€áˆCƒL€÷ñ ñ “8Ð ô.2�'˜!‘*ô .2ôb&˜ô &ñ  &1Ø	‰4��Z ‘_Ñ% {Ó3ó&€Ð"ó ñ &1°¸+Ó%F€Ð"Ó FÙ0;¸MÈ;Ó0W€Ð-Ó WÙ*5°kÀ;Ó*O€
Ð'Ó OÙ*5ØÐó+€Ð	'ó ñ %0°¸Ó$E€Ð!Ó EÙ-8¸ÈÓ-T€Ð*Ó TÙ&1Ð2CÀ[Ó&QÐ Ð#Ó QÙ,7¸ÈÓ,T€Ð)Ó TÙ9DØ˜Kó:Ð Ð6ó ò

ñ *5°YÐ@PÓ)Q€Ð
&Ó Q÷S/ñ S/ôlD�ô Dñ> "“|€€_Ó #÷H'ñ H'ñV ƒD�r&   