§
    �ŠtjV  ã            $       ó0  — d Z ddlZddlmZ ddlmZmZ ddlZ ej        e	¦  «        Z
g d¢Zdee         dz  dee         fd„Z ed	¬
¦  «        dedefd„¦   «         Z G d„ de¦  «        Zej                             di ¬¦  «        	 	 	 	 	 	 	 d:dej        dej        dej        dej        dej        dz  dededededz  dee         dz  dedej        dz  dej        dz  dedz  deej        ej        ej        f         fd„¦   «         Zej        	 	 	 	 	 	 	 d:dej        dej        dej        dej        dej        dz  dededededz  dee         dz  dedej        dz  dej        dz  dedz  deej        ej        ej        f         fd „¦   «         Zddd!ddddd"œdej        dej        dej        dej        dej        dz  deded#edz  dedz  deeef         dedej        dz  dej        dz  dedz  dej        eej        ej        f         z  fd$„Zej                             d%d&h¬¦  «        	 	 	 	 	 	 	 d:d&ej        dej        dej        dej        dej        dej        dz  dededededz  dee         dz  dedej        dz  dej        dz  dedz  dej        f d'„¦   «         Zej        	 	 	 	 	 	 	 d:d&ej        dej        dej        dej        dej        dej        dz  dededededz  dee         dz  dedej        dz  dej        dz  dedz  dej        f d(„¦   «         Zddd!ddddd"œd&ej        dej        dej        dej        dej        dej        dz  deded#edz  dedz  deeef         dedej        dz  dej        dz  dedz  dej        eej        ej        f         z  f d)„Zd*ed+eed,f         d-eddfd.„Zej                             d/i ¬¦  «        	 	 d;d0ej        dej        dej        dej        d&ej        d1ej        dej        dej        dededed2ej        dedz  dee         dz  deej        ej        ej        f         fd3„¦   «         Zej        	 	 d;d0ej        dej        dej        dej        d&ej        d1ej        dej        dej        dededed2ej        dedz  dee         dz  deej        ej        ej        f         fd4„¦   «         Z d*ed0ej        d5ej        d6ej        deej        dz  d,f         f
d7„Z!e "                    e!e¬8¦  «         ej#         $                    ej%        j&        j'        ¦  «         dd9l(m)Z)m*Z*m+Z+m,Z, e*e,ej%        j-        j        <   e+e,ej%        j-        j        <   e)e,ej%        j-        j        <   dS )<zÊ
Variable-length attention implementation using Flash Attention.

This module provides a high-level Python interface for variable-length attention
that calls into the optimized Flash Attention kernels.
é    N)Ú	lru_cache)ÚAnyÚ
NamedTuple)Úvarlen_attnÚvarlen_attn_outÚ
AuxRequestÚwindow_sizeÚreturnc                 óv   — | €ddg} t          | ¦  «        dk    rt          dt          | ¦  «        › �¦  «        ‚| S )Néÿÿÿÿé   z$window_size must have length 2, got )ÚlenÚ
ValueError)r	   s    úW/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/torch/nn/attention/varlen.pyÚ_normalize_window_sizer      sI   € ØÐØ˜2�hˆå
ˆ;ÑÔ˜1ÒÐÝÐRÅÀKÑ@PÔ@PÐRÐRÑSÔSÐSØÐó    é   )ÚmaxsizeÚdevice_indexc                 ó   — dS )z;Cache device capability check to avoid repeated CUDA calls.F© )r   s    r   Ú_should_use_cudnnr      s	   € ð ˆ5r   c                   ó"   — e Zd ZU dZdZeed<   dS )r   z 
    Request which auxiliary outputs to compute from varlen_attn.

    Each field is a boolean indicating whether that auxiliary output should be computed.
    FÚlseN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   ÚboolÚ__annotations__r   r   r   r   r   #   s.   € € € € € € ðð ð €CˆÐÐÑÐÐr   r   ztorch_attn::_varlen_attn)Úmutates_argsFÚqueryÚkeyÚvalueÚcu_seq_qÚcu_seq_kÚmax_qÚmax_kÚ	is_causalÚscaleÚ
enable_gqaÚ	seqused_kÚblock_tableÚ
num_splitsc                 óú  — t          |	¦  «        }	| j        ot          | j        j        ¦  «        }|rÀt
                               d¦  «         |
rt          d¦  «        ‚|�t          d¦  «        ‚|	d         dk    s|	d         dk    rt          d¦  «        ‚|€|�t          d	¦  «        ‚t          j	        j
                             | ||d||||d
d|d|¬¦  «        }|d         |d         |d         }}}n`t
                               d¦  «         t          j	        j
                             | ||||||d|d||	d         |	d         |||¬¦  «        \  }}}}}t          j        dt          j        | j        ¬¦  «        }|||fS )zž
    Private custom op for variable-length attention.

    This is the internal implementation. Users should use the public varlen_attn function instead.
    ú#Using cuDNN backend for varlen_attnz,GQA is not supported with the cuDNN backend.Nz3num_splits is not supported with the cuDNN backend.r   r   é   úTcuDNN backend does not support window attention. Please use Flash Attention backend.zBseqused_k/block_table is not yet supported with the cuDNN backend.Tç        F©r*   é   ú-Using Flash Attention backend for varlen_attn)Úreturn_debug_maskr*   Úwindow_size_leftÚwindow_size_rightr,   r-   r.   ©r   ©ÚdtypeÚdevice)r   Úis_cudar   r=   ÚindexÚlogÚinfoÚRuntimeErrorÚtorchÚopsÚatenÚ_cudnn_attention_forwardÚ_flash_attention_forwardÚzerosÚuint64)r"   r#   r$   r%   r&   r'   r(   r)   r*   r	   r+   r,   r-   r.   Ú	use_cudnnÚresultÚoutputÚsoftmax_lseÚ	rng_stateÚ_Ú
rng_state_s                        r   Ú_varlen_attnrQ   -   sÔ  € õ, )¨Ñ5Ô5€Kà”ÐGÕ"3°E´LÔ4FÑ"GÔ"G€Iàð 8
Ý�ŠÐ6Ñ7Ô7Ð7àð 	OåÐMÑNÔNÐNØÐ!åÐTÑUÔUÐUØ�qŒ>˜RÒÐ ;¨q¤>°RÒ#7Ð#7ÝØfñô ð ð Ð  KÐ$;õ ØTñô ð õ ””×8Ò8ØØØØØØØØØØØØØð 9ñ 
ô 
ˆð  *0°¬°F¸1´I¸vÀa¼y˜Y�ˆˆå�ŠÐ@ÑAÔAÐAÝ/4¬y¬~×/VÒ/VØØØØØØØØØØ#ØØ(¨œ^Ø)¨!œnØØ#Ø!ð! 0Wñ 0
ô 0
Ñ,ˆ�˜Y¨¨1õ& ”Ø•E”L¨¬ðñ ô €Jð �; 
Ð*Ð*r   c                 óB  — t          |	¦  «        }	t          j        | ¦  «        }|                      d¦  «        }|                      d¦  «        }t          j        ||ft          j        | j        ¬¦  «        }t          j        dt          j        | j        ¬¦  «        }|||fS )zç
    Fake implementation for meta tensor computation and tracing.

    Based on the 3D varlen path from meta__flash_attention_forward:
    - query shape: (total, num_heads, head_dim)
    - logsumexp shape: (num_heads, total_q)
    r   r1   r;   r:   )r   rC   Ú
empty_likeÚsizeÚemptyÚfloatr=   rI   )r"   r#   r$   r%   r&   r'   r(   r)   r*   r	   r+   r,   r-   r.   rL   Útotal_qÚ	num_headsÚ	logsumexprN   s                      r   Ú_varlen_attn_fakerZ   ‡   s’   € õ0 )¨Ñ5Ô5€Kõ Ô˜eÑ$Ô$€Fð �jŠj˜‰mŒm€GØ—
’
˜1‘”€IÝ”Ø	�GÐ¥E¤K¸¼ðñ ô €Iõ ”˜D­¬¸U¼\ÐJÑJÔJ€Ià�9˜iÐ'Ð'r   )r   r   )Ú
return_auxr*   r	   r+   r,   r-   r.   r[   c                ó°  — |                       d¦  «        }|�|                      d¦  «        n|                      d¦  «        }|
s||k    rt          d|› d|› d�¦  «        ‚|
r||z  dk    rt          d|› d|› d	�¦  «        ‚|	d
k    }t          j        j                             | ||||||||t          |	¦  «        |
|||¦  «        \  }}}|�|j        r||fS |S )a‘  Compute variable-length attention using Flash Attention.

    This function is similar to scaled_dot_product_attention but optimized for
    variable-length sequences using cumulative sequence position tensors.

    Args:
        query (Tensor): Query tensor; shape :math:`(T_q, H_q, D)`
        key (Tensor): Key tensor; shape :math:`(T_k, H_{kv}, D)`, or
            :math:`(\text{total\_pages}, \text{page\_size}, H_{kv}, D)` when ``block_table`` is provided.
        value (Tensor): Value tensor; shape :math:`(T_k, H_{kv}, D)`, or
            :math:`(\text{total\_pages}, \text{page\_size}, H_{kv}, D)` when ``block_table`` is provided.
        cu_seq_q (Tensor): Cumulative sequence positions for queries; shape :math:`(N+1,)`
        cu_seq_k (Tensor): Cumulative sequence positions for keys/values; shape :math:`(N+1,)`
        max_q (int): Maximum query sequence length in the batch.
        max_k (int): Maximum key/value sequence length in the batch.
        return_aux (Optional[AuxRequest]): If not None and ``return_aux.lse`` is True, also returns the logsumexp tensor.
        scale (float, optional): Scaling factor for attention scores
        window_size (tuple[int, int], optional): Window size for sliding window attention as (left, right).
            Use (-1, -1) for full attention (default), (-1, 0) for causal attention,
            or (W, 0) for causal attention with sliding window of size W.
        enable_gqa (bool): If set to True, enables Grouped Query Attention (GQA)
            and allows key/value to have fewer heads than query.
            Each KV head is shared by a group of :math:`H_q / H_{kv}` query heads,
            so :math:`H_q` must be divisible by :math:`H_{kv}`.
            Default is False.
        seqused_k (Tensor, optional): Number of valid KV tokens per batch element; shape :math:`(N,)`.
            When set, only the first ``seqused_k[i]`` tokens in the key/value sequence for batch
            element *i* participate in attention. Useful for KV-cache decoding where the cache slot
            is larger than the actual sequence. Inference-only (not supported in backward).
        block_table (Tensor, optional): Block table for paged KV cache; shape
            :math:`(N, \text{max\_pages\_per\_seq})`, dtype ``int32``.
            Requires ``seqused_k``. Inference-only (not supported in backward).

            When ``block_table`` is provided, ``key`` and ``value`` are a "pool" of
            pages of tokens of KV data and the pages belong to any sequence/order.
            The ``block_table`` is what maps each sequence's logical chunks
            back to physical pages in this pool.

            ``seqused_k[i]`` tells the kernel how many tokens in sequence *i* are
            actually valid, since the last page is typically only partially filled.
        num_splits (int, optional): Number of splits for split-KV. Set to ``1``
            to disable split-KV which enables batch invariance. Split-KV
            parallelizes the key/value sequence dimension across multiple thread
            blocks and combines partial results. The split decision depends
            on ``max_k`` (the longest sequence in the batch), so different batch
            compositions can change the reduction order and produce different
            floating-point results for the same sequence. When this is disabled,
            bitwise identical outputs are guaranteed for a given sequence
            regardless of what other sequences are in the batch, at the
            cost of lower GPU utilization when there are few queries. When
            ``None`` (default), the kernel chooses automatically.

    Returns:
        output (Tensor): Output tensor from attention computation; shape :math:`(T_q, H_q, D)`.

        If ``return_aux`` is not None and ``return_aux.lse`` is True:
            lse (Tensor): Log-sum-exp of attention scores; shape :math:`(T_q, H_q)`.

    Shape legend:
        - :math:`N`: Batch size
        - :math:`T_q`: Total number of query tokens in the batch (sum of all query sequence lengths)
        - :math:`T_k`: Total number of key/value tokens in the batch (sum of all key/value sequence lengths)
        - :math:`H_q`: Number of query attention heads
        - :math:`H_{kv}`: Number of key/value attention heads (equal to :math:`H_q` unless GQA is enabled)
        - :math:`D`: Head dimension

    Example::

        >>> # xdoctest: +REQUIRES(env:TORCH_DOCTEST_CUDA)
        >>> batch_size, max_seq_len, embed_dim, num_heads = 2, 512, 1024, 16
        >>> head_dim = embed_dim // num_heads
        >>> seq_lengths = []
        >>> for _ in range(batch_size):
        ...     length = torch.randint(1, max_seq_len // 64 + 1, (1,)).item() * 64
        ...     seq_lengths.append(min(length, max_seq_len))
        >>> seq_lengths = torch.tensor(seq_lengths, device="cuda")
        >>> total_tokens = seq_lengths.sum().item()
        >>>
        >>> # Create packed query, key, value tensors
        >>> query = torch.randn(
        ...     total_tokens, num_heads, head_dim, dtype=torch.float16, device="cuda"
        ... )
        >>> key = torch.randn(
        ...     total_tokens, num_heads, head_dim, dtype=torch.float16, device="cuda"
        ... )
        >>> value = torch.randn(
        ...     total_tokens, num_heads, head_dim, dtype=torch.float16, device="cuda"
        ... )
        >>>
        >>> # Build cumulative sequence tensor
        >>> cu_seq = torch.zeros(batch_size + 1, device="cuda", dtype=torch.int32)
        >>> cu_seq[1:] = seq_lengths.cumsum(0)
        >>> max_len = seq_lengths.max().item()
        >>>
        >>> # Call varlen_attn
        >>> output = varlen_attn(
        ...     query, key, value, cu_seq, cu_seq, max_len, max_len
        ... )
    r1   Nr   úGExpect query and key/value to have the same number of heads but got Hq=ú	 and Hkv=ú&. Try setting enable_gqa=True for GQA.r   úMExpect number of query heads to be a multiple of kv heads for GQA but got Hq=ú.©r   r   )rT   r   rC   rD   Ú
torch_attnrQ   Úlistr   )r"   r#   r$   r%   r&   r'   r(   r[   r*   r	   r+   r,   r-   r.   Únum_heads_qÚnum_heads_kr)   Úoutr   rO   s                       r   r   r   °   sH  € ðj —*’*˜Q‘-”-€KØ!,Ð!8�#—(’(˜1‘+”+�+¸c¿hºhÀq¹k¼k€KØð 
˜+¨Ò4Ð4Ýð4Ø%ð4ð 4Ø0;ð4ð 4ð 4ñ
ô 
ð 	
ð
 ð 
�k KÑ/°1Ò4Ð4Ýð?Ø%ð?ð ?Ø0;ð?ð ?ð ?ñ
ô 
ð 	
ð
 ˜wÒ&€IÝ”)Ô&×3Ò3ØØØØØØØØØÝˆ[ÑÔØØØØñô �K€Cˆˆað  Ð *¤.ÐØ�CˆxˆØ€Jr   ztorch_attn::_varlen_attn_outrg   c                 ó<  — t          |
¦  «        }
|j        ot          |j        j        ¦  «        }|rt          d¦  «        ‚t                               d¦  «         t          j	        j
                             | |||||||d|d|	|
d         |
d         |||¬¦  «        }|S )z«
    Private custom op for variable-length attention with pre-allocated output.
    Same as _varlen_attn but writes the attention output into the provided out tensor.
    z+cuDNN backend does not support out variant.z1Using Flash Attention backend for varlen_attn_outr3   Fr   r1   )r*   r8   r9   r,   r-   r.   )r   r>   r   r=   r?   rB   r@   rA   rC   rD   rE   Ú+_flash_attention_forward_no_dropout_inplace)rg   r"   r#   r$   r%   r&   r'   r(   r)   r*   r	   r+   r,   r-   r.   rJ   rM   s                    r   Ú_varlen_attn_outrj   I  s¸   € õ, )¨Ñ5Ô5€Kà”ÐGÕ"3°E´LÔ4FÑ"GÔ"G€Iàð JåÐHÑIÔIÐIå‡H‚HÐ@ÑAÔAÐAÝ”)”.×LÒLØØØØØØØØØØØØØ$ QœØ% aœ.ØØØð# Mñ ô €Kð( Ðr   c                 óª   — |                      d¦  «        }|                      d¦  «        }t          j        ||ft          j        |j        ¬¦  «        }|S )úF
    Fake implementation for meta tensor computation and tracing.
    r   r1   r;   )rT   rC   rU   rV   r=   )rg   r"   r#   r$   r%   r&   r'   r(   r)   r*   r	   r+   r,   r-   r.   rW   rX   rY   s                     r   Ú_varlen_attn_out_fakerm     sP   € ð* �jŠj˜‰mŒm€GØ—
’
˜1‘”€IÝ”Ø	�GÐ¥E¤K¸¼ðñ ô €Ið Ðr   c                óª  — |                      d¦  «        }|�|                      d¦  «        n|                      d¦  «        }|s||k    rt          d|› d|› d�¦  «        ‚|r||z  dk    rt          d|› d|› d	�¦  «        ‚|
d
k    }t          j        j                             | |||||||||	t          |
¦  «        ||||¦  «        }|�|j        r| |fS | S )zèCompute variable-length attention using Flash Attention with a pre-allocated output tensor.

    Same as :func:`varlen_attn` but writes the attention output into the provided ``out`` tensor
    instead of allocating a new one.

    r1   Nr   r]   r^   r_   r   r`   ra   rb   )rT   r   rC   rD   rc   rj   rd   r   )rg   r"   r#   r$   r%   r&   r'   r(   r[   r*   r	   r+   r,   r-   r.   re   rf   r)   r   s                      r   r   r   �  sD  € ð0 —*’*˜Q‘-”-€KØ!,Ð!8�#—(’(˜1‘+”+�+¸c¿hºhÀq¹k¼k€KØð 
˜+¨Ò4Ð4Ýð4Ø%ð4ð 4Ø0;ð4ð 4ð 4ñ
ô 
ð 	
ð
 ð 
�k KÑ/°1Ò4Ð4Ýð?Ø%ð?ð ?Ø0;ð?ð ?ð ?ñ
ô 
ð 	
ð
 ˜wÒ&€IÝ
Œ)Ô
×
/Ò
/ØØØØØØØØØØÝˆ[ÑÔØØØØñô €Cð" Ð *¤.ÐØ�CˆxˆØ€Jr   ÚctxÚinputs.rL   c                 óö   — |\  }}}}}}}	}
}}}}}}|\  }}}|�t          d¦  «        ‚|�t          d¦  «        ‚|                      ||||||||¦  «         || _        |	| _        |
| _        || _        || _        d S )Nz)seqused_k is an inference-only parameter.z+block_table is an inference-only parameter.)rB   Úsave_for_backwardr'   r(   r)   r*   r	   )ro   rp   rL   r"   r#   r$   r%   r&   r'   r(   r)   r*   r	   r+   r,   r-   r.   rg   r   rN   s                       r   Ú_setup_contextrs   Ú  sµ   € ð  	ñØØØØØØØØØØØØØØà Ñ€CˆˆiàÐÝÐFÑGÔGÐGØÐÝÐHÑIÔIÐIà×Ò˜%  e¨X°xÀÀcÈ9ÑUÔUÐUà€C„IØ€C„IØ€C„MØ€C„IØ!€C„O€O€Or   z!torch_attn::_varlen_attn_backwardÚgrad_outr   rN   c                 óT  — t          |¦  «        }t          j        d|j        ¬¦  «        }|j        ot          |j        j        ¦  «        }|ryt                               d¦  «         |d         dk    s|d         dk    rt          d¦  «        ‚t          j
        j                             | |||||||||	d|
|||¬¦  «        \  }}}n_t                               d	¦  «         t          j
        j                             | |||||||||	d|
||||d         |d         ¬
¦  «        \  }}}|||fS )Nr   )r=   r0   r   r1   r2   r3   r4   r6   )r*   r8   r9   )r   rC   rU   r=   r>   r   r?   r@   rA   rB   rD   rE   Ú_cudnn_attention_backwardÚ_flash_attention_backward)rt   r"   r#   r$   rg   r   r%   r&   r'   r(   r)   rN   r*   r	   ÚunusedrJ   ÚdqÚdkÚdvs                      r   Ú_varlen_attn_backwardr|   û  se  € õ" )¨Ñ5Ô5€KåŒ[˜ 5¤<Ð0Ñ0Ô0€Fà”ÐGÕ"3°E´LÔ4FÑ"GÔ"G€IØð +
Ý�ŠÐ6Ñ7Ô7Ð7Ø�qŒ>˜RÒÐ ;¨q¤>°RÒ#7Ð#7ÝØfñô ð õ ”Y”^×=Ò=ØØØØØØØØØØØØØØØð >ñ 
ô 
‰
ˆˆB��õ$ 	�ŠÐ@ÑAÔAÐAÝ”Y”^×=Ò=ØØØØØØØØØØØØØØØØ(¨œ^Ø)¨!œnð# >ñ 
ô 
‰
ˆˆB�ð& ˆr�2ˆ:Ðr   c                 ó¢   — t          |¦  «        }t          j        |¦  «        }t          j        |¦  «        }t          j        |¦  «        }|||fS )rl   )r   rC   rS   )rt   r"   r#   r$   rg   r   r%   r&   r'   r(   r)   rN   r*   r	   Ú
grad_queryÚgrad_keyÚ
grad_values                    r   Ú_varlen_attn_backward_faker�   @  sN   € õ( )¨Ñ5Ô5€KåÔ! %Ñ(Ô(€JÝÔ Ñ$Ô$€HÝÔ! %Ñ(Ô(€Jà�x Ð+Ð+r   Úgrad_lseÚgrad_rngc                 óì   — | j         \  }}}}}}	}
}| j        }| j        }| j        }| j        }| j        }t          j        j         	                    |||||	|
||||||||¦  «        \  }}}d}|||gd|z  ¢R S )Né   )N)
Úsaved_tensorsr'   r(   r)   r*   r	   rC   rD   rc   r|   )ro   rt   r‚   rƒ   r"   r#   r$   r%   r&   rg   r   rN   r'   r(   r)   r*   r	   ry   rz   r{   Ú
num_paramss                        r   Ú	_backwardrˆ   ]  s­   € ð BEÔARÑ>€Eˆ3��x ¨3°°YàŒI€EØŒI€EØ”€IØŒI€EØ”/€Kå”Ô%×;Ò;ØØØØØØØØØØØØØØñô �J€BˆˆBð$ €JØ��BÐ0˜' JÑ.Ð0Ð0Ð0r   )Úsetup_context)Ú_varlen_attn_backward_flopÚ_varlen_attn_forward_flopÚ_varlen_attn_out_flopÚflop_registry)FNNFNNN)NN).r   ÚloggingÚ	functoolsr   Útypingr   r   rC   Ú	getLoggerr   r@   Ú__all__rd   Úintr   r   r   r   ÚlibraryÚ	custom_opÚTensorrV   ÚtuplerQ   Úregister_fakerZ   r   rj   rm   r   rs   r|   r�   rˆ   Úregister_autogradÚ_dynamoÚdisallow_in_graphrD   rE   ri   Útorch.utils.flop_counterrŠ   r‹   rŒ   r�   rc   r   r   r   ú<module>r�      s  ððð ð €€€Ø Ð Ð Ð Ð Ð Ø "Ð "Ð "Ð "Ð "Ð "Ð "Ð "à €€€ð €gÔ˜Ñ!Ô!€à
:Ð
:Ð
:€ð¨¨S¬	°DÑ(8ð ¸TÀ#¼Yð ð ð ð ð €�1ÐÑÔð Cð ¨Dð ð ð ñ Ôðð
ð ð ð ð �ñ ô ð ð „×ÒÐ3À"ÐÑEÔEð ØØ$(ØØ%)Ø'+Ø!ðV+ð V+ØŒ<ðV+à	ŒðV+ð Œ<ðV+ð Œlð	V+ð
 Œl˜TÑ!ðV+ð ðV+ð ðV+ð ðV+ð �4‰<ðV+ð �c”˜TÑ!ðV+ð ðV+ð Œ|˜dÑ"ðV+ð ” Ñ$ðV+ð �d‘
ðV+ð ˆ5Œ<˜œ u¤|Ð3Ô4ðV+ð V+ð V+ñ FÔEðV+ðr Ôð ØØ$(ØØ%)Ø'+Ø!ð%(ð %(ØŒ<ð%(à	Œð%(ð Œ<ð%(ð Œlð	%(ð
 Œl˜TÑ!ð%(ð ð%(ð ð%(ð ð%(ð �4‰<ð%(ð �c”˜TÑ!ð%(ð ð%(ð Œ|˜dÑ"ð%(ð ” Ñ$ð%(ð �d‘
ð%(ð ˆ5Œ<˜œ u¤|Ð3Ô4ð%(ð %(ð %(ñ Ôð%(ðb %)ØØ#+ØØ%)Ø'+Ø!ðVð Vð VØŒ<ðVà	ŒðVð Œ<ðVð Œlð	Vð
 Œl˜TÑ!ðVð ðVð ðVð ˜TÑ!ðVð �4‰<ðVð �s˜C�x”ðVð ðVð Œ|˜dÑ"ðVð ” Ñ$ðVð �d‘
ðVð  „\�E˜%œ,¨¬Ð4Ô5Ñ5ð!Vð Vð Vð Vðr „×ÒÐ7ÀuÀgÐÑNÔNð ØØ$(ØØ%)Ø'+Ø!ð2ð 2Ø	Œð2àŒ<ð2ð 
Œð2ð Œ<ð	2ð
 Œlð2ð Œl˜TÑ!ð2ð ð2ð ð2ð ð2ð �4‰<ð2ð �c”˜TÑ!ð2ð ð2ð Œ|˜dÑ"ð2ð ” Ñ$ð2ð �d‘
ð2ð  „\ð!2ð 2ð 2ñ OÔNð2ðj Ôð ØØ$(ØØ%)Ø'+Ø!ðð Ø	ŒðàŒ<ðð 
Œðð Œ<ð	ð
 Œlðð Œl˜TÑ!ðð ðð ðð ðð �4‰<ðð �c”˜TÑ!ðð ðð Œ|˜dÑ"ðð ” Ñ$ðð �d‘
ðð  „\ð!ð ð ñ  ÔððN %)ØØ#+ØØ%)Ø'+Ø!ð!:ð :ð :Ø	Œð:àŒ<ð:ð 
Œð:ð Œ<ð	:ð
 Œlð:ð Œl˜TÑ!ð:ð ð:ð ð:ð ˜TÑ!ð:ð �4‰<ð:ð �s˜C�x”ð:ð ð:ð Œ|˜dÑ"ð:ð ” Ñ$ð:ð  �d‘
ð!:ð" „\�E˜%œ,¨¬Ð4Ô5Ñ5ð#:ð :ð :ð :ðz"˜ð " U¨3°¨8¤_ð "¸cð "Àdð "ð "ð "ð "ðB „×ÒÐ<È2ÐÑNÔNð Ø$(ðAð AØŒlðAàŒ<ðAð 
ŒðAð Œ<ð	Að
 
ŒðAð 
ŒðAð ŒlðAð ŒlðAð ðAð ðAð ðAð Œ|ðAð �4‰<ðAð �c”˜TÑ!ðAð ˆ5Œ<˜œ u¤|Ð3Ô4ðAð Að Añ OÔNðAðH Ô$ð Ø$(ð,ð ,ØŒlð,àŒ<ð,ð 
Œð,ð Œ<ð	,ð
 
Œð,ð 
Œð,ð Œlð,ð Œlð,ð ð,ð ð,ð ð,ð Œ|ð,ð �4‰<ð,ð �c”˜TÑ!ð,ð ˆ5Œ<˜œ u¤|Ð3Ô4ð,ð ,ð ,ñ %Ô$ð,ð81Ø	ð1Øœð1Ø05´ð1ØHMÌð1à
ˆ5Œ<˜$Ñ Ð#Ô$ð1ð 1ð 1ð 1ðB × Ò ˜y¸Ð Ñ GÔ GÐ Gà „× Ò Ø	„I„NÔ>ñô ð ðð ð ð ð ð ð ð ð ð ð ð ð 4M€ˆeŒiÔ"Ô/Ñ 0Ø7L€ˆeŒiÔ"Ô3Ñ 4Ø<V€ˆeŒiÔ"Ô8Ñ 9Ð 9Ð 9r   