§
    Þ˜ºht=  ã                   óp  — 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	 d dl
Z
 G d„ de¦  «        Z	 d dlmZ d dlmZmZmZ dZn# e$ r d	ZY nw xY wdd
„Z	 ddd	ddœdeeeeee	eeegef         f         f                           fd„Z ej        e¦  «        Z e¦   «          G d„ d¦  «        ¦   «         ZdS )é    N)ÚEnum)ÚAnyÚCallableÚOptionalÚUnionc                   ó.   — e Zd ZdZdZdZdZdZdZdZ	dZ
d	S )
ÚRequestStatusz5Status of a generation request through its lifecycle.ÚpendingÚ
prefillingÚprefilling_splitÚsplit_pending_remainderÚdecodingÚfinishedÚfailedN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚPENDINGÚ
PREFILLINGÚPREFILLING_SPLITÚSPLIT_PENDING_REMAINDERÚDECODINGÚFINISHEDÚFAILED© ó    úb/var/www/html/services/rag-service/venv/lib/python3.11/site-packages/transformers/utils/metrics.pyr	   r	   
   s9   € € € € € Ø?Ð?à€GØ€JØ)ÐØ7ÐØ€HØ€HØ€F€F€Fr   r	   )Úmetrics)ÚStatusÚ
StatusCodeÚ
get_tracerTFc                 ó&   ‡ — t           sd„ S ˆ fd„}|S )a÷  
    Decorator that attaches a tracer to a class.

    This decorator should be applied to classes that need OpenTelemetry tracing.
    It adds a tracer attribute to the class instance that can be used by the traced decorator.

    Args:
        tracer_name_template: Optional template string for the tracer name.
            If provided, it should contain {module} which will be replaced with the class's full module path
            and {class_name} for the class name.
            If None, a default naming scheme will be used where:
              - If the module already starts with "transformers.", it will use that directly
              - Otherwise, it will prepend "transformers." to the module name

    Returns:
        Class decorator function
    c                 ó   — | S ©Nr   )Úclss    r   ú<lambda>zattach_tracer.<locals>.<lambda>2   s   € ˜3€ r   c                 ój   •‡ ‡— ‰ j         Št          j        ‰¦  «        ˆ ˆˆfd„¦   «         }|‰ _         ‰ S )Nc                 óâ   •—  ‰| g|¢R i |¤Ž ‰j         }‰j        }‰€&|                     d¦  «        r|› d|› �}n d|› d|› �}n‰                     ||¬¦  «        }t	          |¦  «        | _        d S )Nútransformers.ú.)ÚmoduleÚ
class_name)r   r   Ú
startswithÚformatr"   Útracer)	ÚselfÚargsÚkwargsÚmodule_namer-   Útracer_namer&   Úoriginal_initÚtracer_name_templates	         €€€r   Úinit_with_tracerz:attach_tracer.<locals>.decorator.<locals>.init_with_tracer7   s§   ø€ àˆM˜$Ð0 Ð0Ð0Ð0¨Ð0Ð0Ð0àœ.ˆKØÔ)ˆJà#Ð+Ø×)Ò)¨/Ñ:Ô:ð MØ%0Ð"?Ð"?°:Ð"?Ð"?�K�Kà"L°+Ð"LÐ"LÀ
Ð"LÐ"L�K�Kà2×9Ò9ÀÐYcÐ9ÑdÔd�å$ [Ñ1Ô1ˆDŒKˆKˆKr   )Ú__init__Ú	functoolsÚwraps)r&   r8   r6   r7   s   ` @€r   Ú	decoratorz attach_tracer.<locals>.decorator4   sR   øøø€ Øœˆå	Œ˜Ñ	'Ô	'ð	2ð 	2ð 	2ð 	2ð 	2ð 	2ñ 
(Ô	'ð	2ð  (ˆŒØˆ
r   )Ú_has_opentelemetry)r7   r<   s   ` r   Úattach_tracerr>      s6   ø€ õ$ ð ØˆÐðð ð ð ð ð. Ðr   )Ú	span_nameÚ
standaloneÚadditional_attributesrA   c                ó4   ‡‡‡— ˆˆˆfd„}| €|S  || ¦  «        S )až  
    Decorator to trace function calls with OpenTelemetry.

    Can be used as @traced or @traced(span_name="custom_name")

    Args:
        func: The function to trace
        span_name: Optional custom name for the span (defaults to function name)
        standalone: If True, creates a parentless span
        additional_attributes: Optional list of additional attributes to set on the span.
          Each item is a tuple of (instance_attribute_name, span_attribute_key, value_or_transform_function)
          where:
            - instance_attribute_name: Name of the attribute to get from the class instance
            - span_attribute_key: Key to use when setting the attribute on the span
            - value_or_transform_function: Either a raw value to use directly, or a function to transform
              the attribute value before setting it on the span

    Returns:
        Decorated function with tracing
    c                 ó`   •‡ — t           s‰ S dd l} |j        ‰ ¦  «        ˆˆ ˆˆfd„¦   «         }|S )Nr   c            
      óÐ  •— | rt          ‰d¦  «        r‰j        �| d         nd }|d u}|rt          |d¦  «        r|j        }nt          d‰j        › d‰j        › �¦  «        }‰p‰j        }‰r|j        n|j        } ||¦  «        5 }|                     d‰j        ¦  «         |                     d‰j        ¦  «         |                     d|¦  «         | r™t          | ¦  «        D ]‰\  }}	t          |	t          t          t          t          f¦  «        s|	€'|                     d	|› �t          |	¦  «        ¦  «         ŒV|                     d	|› �t          t          |	¦  «        ¦  «        ¦  «         ŒŠ|rž|                     ¦   «         D ]‰\  }
}t          |t          t          t          t          f¦  «        s|€'|                     d
|
› �t          |¦  «        ¦  «         ŒV|                     d
|
› �t          t          |¦  «        ¦  «        ¦  «         ŒŠ‰r`|r^‰D ][}|\  }}}t          ||¦  «        rCt#          ||¦  «        }t%          |¦  «        r ||¦  «        }n|}|                     ||¦  «         Œ\	  ‰| i |¤Ž}|cd d d ¦  «         S # t&          $ rG}|                     t+          t,          j        ¦  «        ¦  «         |                     |¦  «         ‚ d }~ww xY w# 1 swxY w Y   d S )NÚ__self__r   r0   r*   r+   zfunction.namezfunction.modulezfunction.is_methodzargs.zkwargs.)ÚhasattrrE   r0   r"   r   r   Ú
start_spanÚstart_as_current_spanÚset_attributeÚ	enumerateÚ
isinstanceÚstrÚintÚfloatÚboolÚtypeÚitemsÚgetattrÚcallableÚ	ExceptionÚ
set_statusr    r!   ÚERRORÚrecord_exception)r2   r3   ÚinstanceÚ	is_methodr0   ÚnameÚspan_fnÚspanÚiÚargÚkeyÚvalueÚattr_configÚinstance_attribute_nameÚspan_attribute_keyÚvalue_or_transform_functionÚattribute_valueÚtransformed_valueÚresultÚerA   Úfuncr?   r@   s                       €€€€r   Úwrapperz*traced.<locals>.decorator.<locals>.wrapperp   sŽ  ø€ à"&Ðn­G°D¸*Ñ,EÔ,EÐnÈ$Ì-ÐJc�t˜A”w�wÐjnˆHØ ¨Ð,ˆIàð W�W X¨xÑ8Ô8ð WØ!œ��å#Ð$U°D´OÐ$UÐ$UÀdÄmÐ$UÐ$UÑVÔV�àÐ- ¤ˆDØ+5ÐW�fÔ'Ð'¸6Ô;WˆGØ�˜‘”ð # $Ø×"Ò" ?°D´MÑBÔBÐBØ×"Ò"Ð#4°d´oÑFÔFÐFØ×"Ò"Ð#7¸ÑCÔCÐCàð LÝ"+¨D¡/¤/ð Lð L™˜˜3Ý% c­Cµµe½TÐ+BÑCÔCð LÀsÀ{Ø ×.Ò.¨{°q¨{¨{½CÀ¹H¼HÑEÔEÐEÐEà ×.Ò.¨{°q¨{¨{½CÅÀSÁ	Ä	¹N¼NÑKÔKÐKÐKØð RØ&,§l¢l¡n¤nð Rð R™
˜˜UÝ% e­cµ3½½tÐ-DÑEÔEð RÈÈØ ×.Ò.¨¸¨¨ÅÀEÁ
Ä
ÑKÔKÐKÐKà ×.Ò.¨¸¨¨ÅÅDÈÁKÄKÑ@PÔ@PÑQÔQÐQÐQà(ð 	V¨Yð 	VØ'<ð Vð V˜ØcnÑ`Ð/Ð1CÐE`Ý" 8Ð-DÑEÔEð VÝ.5°hÐ@WÑ.XÔ.X˜OÝ'Ð(CÑDÔDð PØ4OÐ4OÐP_Ñ4`Ô4`Ð 1Ð 1à4OÐ 1Ø ×.Ò.Ð/AÐCTÑUÔUÐUøðØ!˜T 4Ð2¨6Ð2Ð2�FØ!ð?#ð #ð #ð #ñ #ô #ð #ð #øõ@ !ð ð ð Ø—O’O¥F­:Ô+;Ñ$<Ô$<Ñ=Ô=Ð=Ø×)Ò)¨!Ñ,Ô,Ð,ØøøøøðøøøðA#ð #ð #ð #øøøð #ð #ð #ð #ð #ð #s2   ÂG*KÉ1	JÊ
KÊAKËKËKËKË"K)r=   r:   r;   )ri   r:   rj   rA   r?   r@   s   `  €€€r   r<   ztraced.<locals>.decoratorj   sd   øø€ Ý!ð 	ØˆKàÐÐÐà	ˆŒ˜Ñ	Ô	ð.	ð .	ð .	ð .	ð .	ð .	ð .	ñ 
Ô	ð.	ð` ˆr   r   )ri   r?   r@   rA   r<   s    ``` r   Útracedrk   N   sD   øøø€ ð87ð 7ð 7ð 7ð 7ð 7ð 7ðr €|ØÐØˆ9�T‰?Œ?Ðr   c                   óÈ   — e Zd ZdZdefd„Zd„ Zedede	ddfd	„¦   «         Z
ed
eddfd„¦   «         Zedd„¦   «         Zedededdfd„¦   «         Zedede	ddfd„¦   «         ZdS )ÚContinuousBatchProcessorMetricsz0Metrics collection for ContinuousBatchProcessor.Úmax_batch_tokensc                 ó<   — || _         |                      ¦   «          dS )zŒInitialize metrics for continuous batch processor.

        Args:
            max_batch_tokens: Maximum number of tokens in a batch
        N)rn   Ú_setup_metrics)r1   rn   s     r   r9   z(ContinuousBatchProcessorMetrics.__init__¯   s$   € ð !1ˆÔà×ÒÑÔÐÐÐr   c                 óD  — t           st                               d¦  «         dS t          j        d¦  «        | _        g d¢}| j                             ddd|¬¦  «        | _        | j                             d	d
d¬¦  «        | _	        | j                             ddd¬¦  «        | _
        g d¢}| j                             ddd|¬¦  «        | _        | j                             ddd¬¦  «        | _        | j                             ddd¬¦  «        | _        | j                             ddd¬¦  «        | _        g d¢}| j                             ddd|¬¦  «        | _        | j                             ddd ¬¦  «        | _        | j                             d!d"d ¬¦  «        | _        dS )#zIInitialize OpenTelemetry metrics and tracing if the library is available.zIOpenTelemetry is not installed. Metrics and tracing will not be recorded.Nz2transformers.generation.continuous_batch_processor)é
   é   é2   éK   éd   é–   éÈ   i,  éô  iî  éè  éÐ  éˆ  é'  Úttft_millisecondsz#Time to first token in millisecondsÚms)rZ   ÚdescriptionÚunitÚ#explicit_bucket_boundaries_advisoryÚactive_requests_countz3Number of active requests currently being processedÚrequests)rZ   r€   r�   Úwaiting_requests_countz*Number of requests waiting to be processed)rt   rv   éú   ry   rz   r{   r|   r}   i N  i0u  i`ê  Úrequest_latency_millisecondsz9End-to-end latency for completed requests in millisecondsÚdecode_prefill_ratioz3Ratio of decode tokens to prefill tokens in a batchÚratioÚprefill_tokens_processedz"Number of prefill tokens processedÚtokensÚdecode_tokens_processedz!Number of decode tokens processed)é   rr   é   é   é(   rt   é<   éF   éP   éZ   é_   éb   rv   Úbatch_fill_percentagez5Percentage of max_batch_tokens utilized in each batchÚpercentÚkv_cache_free_memory_bytesz/Free memory of the PagedAttentionCache in bytesÚbytesÚkv_cache_memory_bytesz0Memory usage of the PagedAttentionCache in bytes)r=   ÚloggerÚinfor   Ú	get_meterÚmeterÚcreate_histogramÚttft_histogramÚcreate_gaugeÚactive_requests_gaugeÚwaiting_requests_gaugeÚrequest_latency_histogramÚdecode_prefill_ratio_gaugeÚcreate_counterÚprefill_tokens_counterÚdecode_tokens_counterÚbatch_fill_percentage_histogramÚkv_cache_free_memory_gaugeÚkv_cache_memory_gauge)r1   Úttft_bucketsÚlatency_bucketsÚbatch_fill_bucketss       r   rp   z.ContinuousBatchProcessorMetrics._setup_metrics¹   s  € õ "ð 	Ý�KŠKÐcÑdÔdÐdØˆFåÔ&Ð'[Ñ\Ô\ˆŒ
ð _Ð^Ð^ˆà"œj×9Ò9Ø$Ø=ØØ0<ð	 :ñ 
ô 
ˆÔð &*¤Z×%<Ò%<Ø(ØMØð &=ñ &
ô &
ˆÔ"ð '+¤j×&=Ò&=Ø)ØDØð '>ñ '
ô '
ˆÔ#ð \Ð[Ð[ˆà)-¬×)DÒ)DØ/ØSØØ0?ð	 *Eñ *
ô *
ˆÔ&ð +/¬*×*AÒ*AØ'ØMØð +Bñ +
ô +
ˆÔ'ð '+¤j×&?Ò&?Ø+Ø<Øð '@ñ '
ô '
ˆÔ#ð &*¤Z×%>Ò%>Ø*Ø;Øð &?ñ &
ô &
ˆÔ"ð RÐQÐQÐà/3¬z×/JÒ/JØ(ØOØØ0Bð	 0Kñ 0
ô 0
ˆÔ,ð +/¬*×*AÒ*AØ-ØIØð +Bñ +
ô +
ˆÔ'ð &*¤Z×%<Ò%<Ø(ØJØð &=ñ &
ô &
ˆÔ"Ð"Ð"r   Úcreated_timeÚ
request_idÚreturnNc                 ó.  — t           sdS t          j        ¦   «         |z
  dz  }	 | j                             |¦  «         t                               d|› d|d›d�¦  «         dS # t          $ r(}t                               d|› �¦  «         Y d}~dS d}~ww xY w)z£Record Time to First Token (TTFT).

        Args:
            created_time: The time the request was created
            request_id: The ID of the request
        Nç     @�@zRecorded TTFT for request ú: ú.2fr   zFailed to record TTFT metric: )r=   Útimer¡   Úrecordrœ   ÚdebugrT   Úwarning)r1   r°   r±   Úttft_msrh   s        r   Úrecord_ttft_metricz2ContinuousBatchProcessorMetrics.record_ttft_metric
  sÂ   € õ "ð 	ØˆFå”9‘;”; Ñ-°Ñ7ˆð	AØÔ×&Ò& wÑ/Ô/Ð/Ý�LŠLÐS°jÐSÐSÀGÐSÐSÐSÐSÑTÔTÐTÐTÐTøÝð 	Að 	Að 	AÝ�NŠNÐ?¸AÐ?Ð?Ñ@Ô@Ð@Ð@Ð@Ð@Ð@Ð@Ð@øøøøð	Aøøøó   ¤<A" Á"
BÁ,BÂBÚrequests_in_batchc                 ó¾  — t           r|sdS d}d}|D ]S}|j        t          j        k    r|dz  }Œ|j        t          j        t          j        fv r|t          |j        ¦  «        z  }ŒT||z   }	 |dk    r| j         	                    |¦  «         |dk    r| j
         	                    |¦  «         |dk    r||z  }| j                             |¦  «         || j        z  dz  }| j                             |¦  «         t                                d|› d|› d|d›d	|› d
| j        › d�¦  «         dS # t$          $ r(}t                                d|› �¦  «         Y d}~dS d}~ww xY w)zÇRecord metrics about the batch composition including decode/prefill ratio and batch fill percentage.

        Args:
            requests_in_batch: List of request states in the current batch
        Nr   é   g      Y@zBatch metrics: z decode tokens, z prefill tokens, batch fill: r¶   z% (ú/ú)z Failed to record batch metrics: )r=   Ústatusr	   r   r   r   ÚlenÚ
prompt_idsr¨   Úaddr©   r¦   Úsetrn   rª   r¸   rœ   r¹   rT   rº   )	r1   r¾   Údecode_tokensÚprefill_tokensÚstateÚtotal_batch_tokensr‰   Úfill_percentagerh   s	            r   Úrecord_batch_metricsz4ContinuousBatchProcessorMetrics.record_batch_metrics  só  € õ "ð 	Ð):ð 	ØˆFàˆØˆà&ð 	8ð 	8ˆEØŒ|�}Ô5Ò5Ð5Ø Ñ"��Ø”¥-Ô":½MÔ<ZÐ![Ð[Ð[Ø¥# eÔ&6Ñ"7Ô"7Ñ7�øà*¨^Ñ;Ðð	CØ Ò!Ð!ØÔ+×/Ò/°Ñ?Ô?Ð?à˜qÒ Ð ØÔ*×.Ò.¨}Ñ=Ô=Ð=à Ò!Ð!Ø%¨Ñ6�ØÔ/×3Ò3°EÑ:Ô:Ð:à1°DÔ4IÑIÈUÑRˆOØÔ0×7Ò7¸ÑHÔHÐHÝ�LŠLðe -ð eð eÀð eð eØ.Ðdðeð eØ7Iðeð eØLPÔLaðeð eð eñô ð ð ð øõ ð 	Cð 	Cð 	CÝ�NŠNÐA¸aÐAÐAÑBÔBÐBÐBÐBÐBÐBÐBÐBøøøøð	Cøøøs   Á,B<D* Ä*
EÄ4EÅEc                 óº  — t           sdS 	 |j        t          |j        ¦  «        z
  }t          |j        ¦  «        }|j        t          j        t          j        fv rdnd}||z  |j	        z  |j
        z  |j        z  dz  |z  }|t          |j        ¦  «        z  |j	        z  |j
        z  |j        z  dz  |z  }| j                             |¦  «         | j                             |¦  «         t                               d|dz  d›d|› d|j        › d	||j        z  d
z  d›d�	¦  «         dS # t"          $ r(}t                               d|› �¦  «         Y d}~dS d}~ww xY w)a&  Record memory usage of the PagedAttentionCache without GPU synchronization.

        This calculates the theoretical memory usage based on cache configuration
        and the number of blocks currently in use.

        Args:
            cache: The PagedAttentionCache object to measure
        Né   é   zKV Cache memory: i   r¶   zMB, Used blocks: rÁ   z (rv   z.1fz%)z*Failed to record KV cache memory metrics: )r=   Ú
num_blocksrÄ   Ú_free_blocksÚ	key_cacheÚdtypeÚtorchÚfloat16Úbfloat16Ú
block_sizeÚnum_key_value_headsÚhead_dimr¬   rÇ   r«   rœ   r¹   rT   rº   )r1   ÚcacheÚnum_used_blocksÚ
num_layersÚbytes_per_parameterÚmemory_bytesÚfree_memory_bytesrh   s           r   Úrecord_kv_cache_memory_metricsz>ContinuousBatchProcessorMetrics.record_kv_cache_memory_metricsF  s  € õ "ð 	ØˆFð'	Mà#Ô.µ°UÔ5GÑ1HÔ1HÑHˆOÝ˜Uœ_Ñ-Ô-ˆJð (-¤{µu´}ÅeÄnÐ6UÐ'UÐ'U ! !Ð[\Ðð
 Ø!ñ"àÔ"ñ#ð Ô+ñ,ð ”.ñ	!ð
 ñð &ñ&ð ð Ý�eÔ(Ñ)Ô)ñ*àÔ"ñ#ð Ô+ñ,ð ”.ñ	!ð
 ñð &ñ&ð ð Ô&×*Ò*¨<Ñ8Ô8Ð8ØÔ+×/Ò/Ð0AÑBÔBÐBÝ�LŠLðE L°KÑ$@ÐJð Eð EØ /ðEð EØ27Ô2BðEð Eà# eÔ&6Ñ6¸Ñ<ÐDðEð Eð Eñô ð ð ð øõ
 ð 	Mð 	Mð 	MÝ�NŠNÐKÈÐKÐKÑLÔLÐLÐLÐLÐLÐLÐLÐLøøøøð	Møøøs   ‹DD( Ä(
EÄ2EÅEÚactive_requestsÚwaiting_requestsc                 ó.  — t           sdS 	 | j                             |¦  «         | j                             |¦  «         t                               d|› d|› d�¦  «         dS # t          $ r(}t                               d|› �¦  «         Y d}~dS d}~ww xY w)z¹Record metrics about active and waiting requests.

        Args:
            active_requests: Number of active requests
            waiting_requests: Number of waiting requests
        NzQueue metrics: z active requests, z waiting requestsz Failed to record queue metrics: )r=   r£   rÇ   r¤   rœ   r¹   rT   rº   )r1   râ   rã   rh   s       r   Úrecord_queue_metricsz4ContinuousBatchProcessorMetrics.record_queue_metrics|  sÃ   € õ "ð 	ØˆFð	CØÔ&×*Ò*¨?Ñ;Ô;Ð;ØÔ'×+Ò+Ð,<Ñ=Ô=Ð=Ý�LŠLÐq¨?ÐqÐqÐN^ÐqÐqÐqÑrÔrÐrÐrÐrøÝð 	Cð 	Cð 	CÝ�NŠNÐA¸aÐAÐAÑBÔBÐBÐBÐBÐBÐBÐBÐBøøøøð	Cøøøs   ‹AA" Á"
BÁ,BÂBc                 ó.  — t           sdS t          j        ¦   «         |z
  dz  }	 | j                             |¦  «         t                               d|› d|d›d�¦  «         dS # t          $ r(}t                               d|› �¦  «         Y d}~dS d}~ww xY w)zªRecord metrics about a completed request.

        Args:
            created_time: The time the request was created
            request_id: The ID of the request
        Nr´   z Recorded request completion for rµ   r¶   r   z,Failed to record request completion metric: )r=   r·   r¥   r¸   rœ   r¹   rT   rº   )r1   r°   r±   Ú
latency_msrh   s        r   Úrecord_request_completionz9ContinuousBatchProcessorMetrics.record_request_completionŽ  sÂ   € õ "ð 	ØˆFå”i‘k”k LÑ0°FÑ:ˆ
ð	OØÔ*×1Ò1°*Ñ=Ô=Ð=å�LŠLÐ\¸JÐ\Ð\È*Ð\Ð\Ð\Ð\Ñ]Ô]Ð]Ð]Ð]øÝð 	Oð 	Oð 	OÝ�NŠNÐMÈ!ÐMÐMÑNÔNÐNÐNÐNÐNÐNÐNÐNøøøøð	Oøøør½   )r²   N)r   r   r   r   rM   r9   rp   rk   rN   rL   r¼   ÚlistrÍ   rá   rå   rè   r   r   r   rm   rm   «   sZ  € € € € € à:Ð:ð¨ð ð ð ð ðO
ð O
ð O
ðb ðA¨uð AÀ#ð AÈ$ð Að Að Añ „VðAð$ ð&C°dð &C¸tð &Cð &Cð &Cñ „Vð&CðP ð3Mð 3Mð 3Mñ „Vð3Mðj ðC°Cð CÈ3ð CÐSWð Cð Cð Cñ „VðCð" ðO°eð OÈð OÐQUð Oð Oð Oñ „VðOð Oð Or   rm   r%   )r:   Úloggingr·   Úenumr   Útypingr   r   r   r   rÕ   r	   Úopentelemetryr   Úopentelemetry.tracer    r!   r"   r=   ÚImportErrorr>   ré   ÚtuplerL   rk   Ú	getLoggerr   rœ   rm   r   r   r   ú<module>rò      sä  ðØ Ð Ð Ð Ø €€€Ø €€€Ø Ð Ð Ð Ð Ð Ø 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1à €€€ð	ð 	ð 	ð 	ð 	�Dñ 	ô 	ð 	ðØ%Ð%Ð%Ð%Ð%Ð%ØBÐBÐBÐBÐBÐBÐBÐBÐBÐBàÐÐøØð ð ð ØÐÐÐðøøøð,ð ,ð ,ð ,ð` 
ðWð ØØ_cðWð Wð Wð
 $ D¨¨s°C¸¸sÀHÈcÈUÐTWÈZÔDXÐ?XÔ9YÐ/YÔ)ZÔ$[Ô\ðWð Wð Wð Wðt 
ˆÔ	˜8Ñ	$Ô	$€ð €�„ðtOð tOð tOð tOð tOñ tOô tOñ „ðtOð tOð tOs   ²A ÁAÁA