Ë
    ³Œj¦v  ã                  óN  — d Z ddlm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ZddlZddlmZmZmZmZmZ ddlmZmZ ddlmZmZmZmZmZmZm Z m!Z! ddl"m#Z$ ddl%Z%ddl&Z&ddl'm(Z( dd	l)m*Z* dd
l+m,Z-  ej\                  e/«      Z0 G d„ de1«      Z2 G d„ de2«      Z3 G d„ de2«      Z4 G d„ de2«      Z5 G d„ de2«      Z6 G d„ de2«      Z7 G d„ de2«      Z8 G d„ de2«      Z9 G d„ de2«      Z: G d„ de2«      Z;d]d„Z< G d „ d!e=«      Z> G d"„ d#e>«      Z?d^d_d$„Z@d`d%„ZAdad&„ZB	 	 	 	 dbd'„ZCdcd(„ZD ejŠ                  d)¬*«      ddd+„«       ZFded,„ZGdfd-„ZHdgd.„ZIdhd/„ZJdid0„ZKdjd1„ZLdkd2„ZM ejŠ                  d)¬*«      dld3„«       ZNdmd4„ZOdnd5„ZPdod6„ZQe!d7d8œ	 	 	 	 	 	 	 dpd9„«       ZRe!	 d^d7d8œ	 	 	 	 	 	 	 dqd:„«       ZR ejŠ                  d;¬*«      	 d^d7d8œ	 	 	 	 	 	 	 drd<„«       ZR ejŠ                  d)¬*«      dsdtd=„«       ZS G d>„ d?ej¨                  «      ZU G d@„ dAej¨                  «      ZV G dB„ dCe*«      ZW ej°                  «       ZYej´                  	 	 	 	 	 	 dudD„«       Z[dvdE„Z\dddFœ	 	 	 	 	 	 	 dwdG„Z]ej´                  	 	 dx	 	 	 	 	 	 	 dydH„«       Z^ej´                  	 	 dx	 	 	 	 	 	 	 dzdI„«       Z_d{dJ„Z` edK«      Za	 d|	 	 	 	 	 	 	 	 	 d}dL„Zbd~dM„ZcddN„Zdd€dO„Zed€dP„Zf e(dQ«      Zg G dR„ dSe«      Zhd�dT„Zid‚dU„ZjdƒdV„Zk elh dW£«      Zmd„dX„Zn ejŠ                  dY¬*«      d…dZ„«       Zod†d‡d[„Zpdˆd\„Zqy)‰zGeneric utility functions.é    )ÚannotationsN)Ú	GeneratorÚIterableÚIteratorÚMappingÚSequence)ÚFutureÚThreadPoolExecutor)ÚAnyÚCallableÚLiteralÚOptionalÚTypeVarÚUnionÚcastÚoverload)Úparse)Ú	ParamSpec)ÚRetry)Úschemasc                  ó   — e Zd ZdZy)ÚLangSmithErrorz=An error occurred while communicating with the LangSmith API.N©Ú__name__Ú
__module__Ú__qualname__Ú__doc__© ó    úY/var/www/html/Fitness-lenito-AI-main/venv/lib/python3.12/site-packages/langsmith/utils.pyr   r   *   s   „ ÚGr   r   c                  ó   — e Zd ZdZy)ÚLangSmithAPIErrorz9Internal server error while communicating with LangSmith.Nr   r   r   r    r"   r"   .   s   „ ÚCr   r"   c                  ó   — e Zd ZdZy)ÚLangSmithRequestTimeoutz*Client took too long to send request body.Nr   r   r   r    r$   r$   2   s   „ Ú4r   r$   c                  ó   — e Zd ZdZy)ÚLangSmithUserErrorzAUser error caused an exception when communicating with LangSmith.Nr   r   r   r    r&   r&   6   s   „ ÚKr   r&   c                  ó   — e Zd ZdZy)ÚLangSmithRateLimitErrorz7You have exceeded the rate limit for the LangSmith API.Nr   r   r   r    r(   r(   :   s   „ ÚAr   r(   c                  ó   — e Zd ZdZy)ÚLangSmithAuthErrorz-Couldn't authenticate with the LangSmith API.Nr   r   r   r    r*   r*   >   s   „ Ú7r   r*   c                  ó   — e Zd ZdZy)ÚLangSmithNotFoundErrorz%Couldn't find the requested resource.Nr   r   r   r    r,   r,   B   s   „ Ú/r   r,   c                  ó   — e Zd ZdZy)ÚLangSmithConflictErrorzThe resource already exists.Nr   r   r   r    r.   r.   F   ó   „ Ú&r   r.   c                  ó   — e Zd ZdZy)ÚLangSmithConnectionErrorz&Couldn't connect to the LangSmith API.Nr   r   r   r    r1   r1   J   ó   „ Ú0r   r1   c                  ó4   ‡ — e Zd ZdZ	 	 	 	 	 	 	 	 dˆ fd„Zˆ xZS )ÚLangSmithExceptionGroupz%Port of ExceptionGroup for Py < 3.11.c               ó2   •— t        ‰| �  |i |¤Ž || _        y)zInitialize.N)ÚsuperÚ__init__Ú
exceptions)Úselfr8   ÚargsÚkwargsÚ	__class__s       €r    r7   z LangSmithExceptionGroup.__init__Q   s   ø€ ô 	‰Ñ˜$Ð) &Ò)Ø$ˆ�r   )r:   r   r8   zSequence[Exception]r;   r   ÚreturnÚNone)r   r   r   r   r7   Ú__classcell__©r<   s   @r    r4   r4   N   s0   ø„ Ù/ð%Øð%Ø&9ð%ØEHð%à	÷%ñ %r   r4   c                ó   — d| › d�S )a%  Get the error message for an invalid prompt identifier.

    Used consistently across the codebase when parsing prompt identifiers fails.

    Args:
        identifier: The invalid identifier that was provided.

    Returns:
        A formatted error message explaining the valid formats.
    z#Invalid prompt identifier format: "zç". Expected one of:
  - "prompt-name" (for private prompts)
  - "owner/prompt-name" (for prompts with explicit owner)
  - "prompt-name:commit-hash" (with commit reference)
  - "owner/prompt-name:commit-hash" (with owner and commit)r   ©Ú
identifiers    r    Ú!get_invalid_prompt_identifier_msgrD   Y   s   € ð .¨j¨\ð :Fð 	Gðr   c                  ó   — e Zd ZdZy)ÚLangSmithWarningzBase class for warnings.Nr   r   r   r    rF   rF   q   s   „ Ú"r   rF   c                  ó   — e Zd ZdZy)ÚLangSmithMissingAPIKeyWarningzWarning for missing API key.Nr   r   r   r    rH   rH   u   r/   r   rH   c                óÈ   — ddl mc m} ddlm}m} | xs  |«       }|d   �|d   S  |«       ry|j                  �|j                  S t        dt        dd¬	«      ¬	«      }|d
k(  S )z"Return True if tracing is enabled.r   N)Úget_current_run_treeÚget_tracing_contextÚenabledTÚ
TRACING_V2ÚTRACINGÚ ©ÚdefaultÚtrue)Úlangsmith._internal._contextÚ	_internalÚ_contextÚlangsmith.run_helpersrJ   rK   Ú_GLOBAL_TRACING_ENABLEDÚget_env_var)ÚctxrU   rJ   rK   ÚtcÚ
var_results         r    Útracing_is_enabledr\   y   sq   € ÷ 4Ð3ßOà	Ò	%Ñ#Ó%€Bð
 
ˆ)�}Ð Ø�)‰}ÐáÔØà×'Ñ'Ð3Ø×/Ñ/Ð/ä˜\´;¸yÐRTÔ3UÔV€JØ˜ÑÐr   c                 ó"   — t        dd¬«      dk(  S )z"Return True if testing is enabled.ÚTEST_TRACKINGrO   rP   Úfalse©rX   r   r   r    Útest_tracking_is_disabledra   ‘   s   € ä�°Ô3°wÑ>Ð>r   c                 ó   ‡ — dˆ fd„}|S )z7Validate specified keyword args are mutually exclusive.c                óH   •‡ — t        j                  ‰ «      dˆˆ fd„«       }|S )Nc                 ó>  •‡— ‰D �cg c]  }t        ˆfd„|D «       «      ‘Œ }}t        |«      D ��cg c]  \  }}|dk7  sŒ|‘Œ }}}|r>|D �cg c]  }dj                  ‰|   «      ‘Œ }}t        ddj                  |«      › �«      ‚ ‰	| i ‰¤ŽS c c}w c c}}w c c}w )z3Validate exactly one arg in each group is not None.c              3  óF   •K  — | ]  }‰j                  |«      €Œd–— Œ y ­w)Né   )Úget)Ú.0Úargr;   s     €r    Ú	<genexpr>z?xor_args.<locals>.decorator.<locals>.wrapper.<locals>.<genexpr>ž   s   øè ø€ ÐJ¡˜#¨f¯j©j¸«oÑ.I”A¡ùs   ƒ!š!rf   z, zFExactly one argument in each of the following groups must be defined: )ÚsumÚ	enumerateÚjoinÚ
ValueError)
r:   r;   Ú	arg_groupÚcountsÚiÚcountÚinvalid_groupsÚinvalid_group_namesÚ
arg_groupsÚfuncs
    `      €€r    Úwrapperz,xor_args.<locals>.decorator.<locals>.wrapperš   sÃ   ù€ ñ
 ",óá!+�Iô ÓJ¡ÓJÕJØ!+ð ð ô 1:¸&Ô0AÔPÑ0A¡H A uÀUÈaÃZšaÐ0AˆNÑPÙÙIWÓ&XÉÀA t§y¡y°¸A±Õ'?ÈÐ#Ð&XÜ ðàŸ	™	Ð"5Ó6Ð7ð9óð ñ
 ˜Ð( Ñ(Ð(ùòùó Qùâ&Xs   ‡B²BÁ BÁB)r:   r   r;   r   r=   r   )Ú	functoolsÚwraps)rv   rw   ru   s   ` €r    Ú	decoratorzxor_args.<locals>.decorator™   s%   ù€ Ü	�‰˜Ó	õ	)ó 
ð	)ð  ˆr   )rv   r   r=   r   r   )ru   rz   s   ` r    Úxor_argsr{   –   s   ø€ õð( Ðr   c                óR  — 	 | j                  «        y# t        j                  $ r/}t        j                  t        |«      | j                  «      |‚d}~wt
        j                  $ r@}t        j                  t        |«      › d| j                  › �| j                  | ¬«      |‚d}~ww xY w)z&Raise an error with the response text.Nz: )ÚrequestÚresponse)Úraise_for_statusÚrequestsÚ	HTTPErrorÚstrÚtextÚhttpxÚHTTPStatusErrorr}   )r~   Úes     r    Úraise_for_status_with_textr‡   °   s�   € ð	Ø×!Ñ!Õ#øÜ×Ñò ?Ü× Ñ ¤ Q£¨¯©Ó7¸QÐ>ûÜ× Ñ ò Ü×#Ñ#Ü�1‹vˆh�b˜Ÿ™˜Ð(Ø×$Ñ$Øô
ð ð		ûðús    ‚ “B&¦*AÁB&Á&;B!Â!B&c                óR   — t        | t        j                  «      r| j                  S | S )zGet the value of a string enum.)Ú
isinstanceÚenumÚEnumÚvalue)Úenus    r    Úget_enum_valuerŽ   À   s   € ä�#”t—y‘yÔ!Ø�y‰yÐØ€Jr   rf   )Úmaxsizec                ó0   — t         j                  | |«       y)z4Log a message at the specified level, but only once.N)Ú_LOGGERÚlog)ÚlevelÚmessages     r    Úlog_oncer•   Ç   s   € ô ‡K�K��wÕr   c                óÆ   — | st        d«      ‚d| v r9d| vrt        d| › d�«      ‚| d   d   j                  dd«      j                  «       S d	| vrt        d
| › d�«      ‚| d	   S )NúMessage is empty.ÚlcÚidú*Unexpected format for serialized message: z Message does not have an id.éÿÿÿÿÚMessagerO   Útypeú&Unexpected format for stored message: z Message does not have a type.)rn   ÚreplaceÚlower©r”   s    r    Ú_get_message_typer¢   Í   s“   € ÙÜÐ,Ó-Ð-Øˆw�Ø�wÑÜØ<¸W¸IØ/ð0óð ð �t‰}˜RÑ ×(Ñ(¨°BÓ7×=Ñ=Ó?Ð?à˜Ñ ÜØ8¸¸	Ø0ð1óð ð �v‰Ðr   c                ó„   — | st        d«      ‚d| v rd| vrt        d| › d�«      ‚| d   S d| vrt        d| › d�«      ‚| d   S )	Nr—   r˜   r;   rš   z Message does not have kwargs.Údatarž   z Message does not have data.)rn   r¡   s    r    Ú_get_message_fieldsr¥   à   sy   € ÙÜÐ,Ó-Ð-Øˆw�Ø˜7Ñ"ÜØ<¸W¸IØ0ð1óð ð �xÑ Ð à˜Ñ ÜØ8¸¸	Ø.ð/óð ð �v‰Ðr   c                ó8   — t        | «      }t        | «      }||dœS )z&Extract message from a message object.©r�   r¤   )r¢   r¥   )r”   Úmessage_typeÚmessage_datas      r    Ú_convert_messagerª   ó   s!   € ä$ WÓ-€LÜ& wÓ/€LØ ¨,Ñ7Ð7r   c                ó�   — d| v r| d   D �cg c]  }t        |«      ‘Œ c}S d| v rt        | d   «      gS t        d| › d�«      ‚c c}w )a  Extract messages from the given inputs dictionary.

    Args:
        inputs: The inputs dictionary.

    Returns:
        A list of dictionaries representing the extracted messages.

    Raises:
        ValueError: If no message(s) are found in the inputs dictionary.
    Úmessagesr”   z-Could not find message(s) in run with inputs Ú.)rª   rn   )Úinputsr”   s     r    Úget_messages_from_inputsr¯   ú   sd   € ð �VÑØ9?À
Ò9KÓLÑ9K¨gÔ  Õ)Ð9KÑLÐLØ�FÑÜ  ¨	Ñ!2Ó3Ð4Ð4Ü
ÐDÀVÀHÈAÐNÓ
OÐOùò Ms   ŒAc                óÐ   — d| vrt        d| › d�«      ‚| d   }t        |«      dk7  rt        dt        |«      › d|› d�«      ‚|d   }d|vrt        d	|› d
�«      ‚t        |d   «      S )a  Retrieve the message generation from the given outputs.

    Args:
        outputs: The outputs dictionary.

    Returns:
        The message generation.

    Raises:
        ValueError: If no generations are found or if multiple generations are present.
    Úgenerationsú,No generations found in in run with output: r­   rf   z3Chat examples expect exactly one generation. Found z generations: r   r”   z"Unexpected format for generation: z%. Generation does not have a message.)rn   Úlenrª   ©Úoutputsr±   Úfirst_generations      r    Ú#get_message_generation_from_outputsr·     s­   € ð ˜GÑ#ÜÐGÈÀyÐPQÐRÓSÐSØ˜-Ñ(€KÜ
ˆ;Ó˜1ÒÜðÜ˜+Ó&Ð' ~°k°]À!ðEó
ð 	
ð # 1‘~ÐØÐ(Ñ(ÜØ0Ð1AÐ0Bð C3ð 3ó
ð 	
ô Ð,¨YÑ7Ó8Ð8r   c                óˆ   — d| v r| d   S d| v r'| d   }t        |«      dk(  r|d   S t        d| › d�«      ‚t        d| › d�«      ‚)	zèRetrieve the prompt from the given inputs.

    Args:
        inputs: The inputs dictionary.

    Returns:
        str: The prompt.

    Raises:
        ValueError: If the prompt is not found or if multiple prompts are present.
    ÚpromptÚpromptsrf   r   z$Multiple prompts in run with inputs z!. Please create example manually.z)Could not find prompt in run with inputs r­   )r³   rn   )r®   rº   s     r    Úget_prompt_from_inputsr»   *  st   € ð �6ÑØ�hÑÐØ�FÑØ˜Ñ#ˆÜˆw‹<˜1ÒØ˜1‘:ÐÜØ2°6°(ð ;/ð /ó
ð 	
ô Ð@ÀÀÈÐJÓ
KÐKr   c                ó¢   — d| vrt        d| › d�«      ‚| d   }t        |«      dk7  rt        d|› �«      ‚|d   }d|vrt        d|› �«      ‚|d   S )	z(Get the LLM generation from the outputs.r±   r²   r­   rf   zMultiple generations in run: r   rƒ   zNo text in generation: )rn   r³   r´   s      r    Úget_llm_generation_from_outputsr½   C  s}   € à˜GÑ#ÜÐGÈÀyÐPQÐRÓSÐSØ˜-Ñ(€KÜ
ˆ;Ó˜1ÒÜÐ8¸¸ÐFÓGÐGØ" 1‘~ÐØÐ%Ñ%ÜÐ2Ð3CÐ2DÐEÓFÐFØ˜FÑ#Ð#r   c                 óz  — 	 t        j                  g d¢t         j                  t         j                  ¬«       ddgS # t         j                  t        f$ re 	 t        j                  ddgt         j                  t         j                  ¬«       dgcY S # t         j                  t        f$ r t        d«      ‚w xY ww xY w)z7Get the correct docker compose command for this system.)ÚdockerÚcomposeú	--version)ÚstdoutÚstderrr¿   rÀ   zdocker-composerÁ   zÆNeither 'docker compose' nor 'docker-compose' commands are available. Please install the Docker server following the instructions for your operating system at https://docs.docker.com/engine/install/)Ú
subprocessÚ
check_callÚDEVNULLÚCalledProcessErrorÚFileNotFoundErrorrn   r   r   r    Úget_docker_compose_commandrÉ   P  s¸   € ðÜ×ÑÚ.Ü×%Ñ%Ü×%Ñ%õ	
ð
 ˜)Ð$Ð$øÜ×)Ñ)Ô+<Ð=ò ð	Ü×!Ñ!Ø! ;Ð/Ü!×)Ñ)Ü!×)Ñ)õð
 %Ð%Ò%øÜ×-Ñ-Ô/@ÐAò 	ÜðEóð ð	úðús!   ‚9< ¼B:Á8BÂB:Â%B6Â6B:c                ó¬   — | j                   d| j                  idœ}| j                  r,t        | j                  «      dkD  ri | j                  ¥|d   d<   |S )z*Convert a LangChain message to an example.Úcontentr§   r   r¤   Úadditional_kwargs)r�   rË   rÌ   r³   )r”   Ú	converteds     r    Úconvert_langchain_messagerÎ   k  s\   € ð —‘Ø˜GŸO™OÐ,ñ!€Ið
 × Ò ¤S¨×)BÑ)BÓ%CÀaÒ%GØ1N°G×4MÑ4MÐ1Nˆ	�&ÑÐ-Ñ.ØÐr   c           
     óÎ   — t        t        t        | dd«      t        «      t        t        | dd«      t        «      t        | d«      xr t        t        | d«      t        «      g«      S )zÇCheck if the given object is similar to `BaseMessage`.

    Args:
        obj: The object to check.

    Returns:
        bool: True if the object is similar to `BaseMessage`, `False` otherwise.
    rË   NrÌ   r�   )Úallr‰   Úgetattrr‚   ÚdictÚhasattr)Úobjs    r    Úis_base_message_likerÕ   w  sZ   € ô ä”w˜s I¨tÓ4´cÓ:Ü”w˜sÐ$7¸Ó>ÄÓEÜ�C˜Ó ÒJ¤Z´¸¸VÓ0DÄcÓ%Jð	
óð r   c                ó0   — | €yt        t        | «      «      S )z2Check if the given environment variable is truish.F)Ú	is_truishrX   )rŒ   s    r    Úis_env_var_truishrØ   ‰  s   € à€}ØÜ”[ Ó'Ó(Ð(r   )Ú	LANGSMITHÚ	LANGCHAIN)Ú
namespacesc                ó   — y ©Nr   ©ÚnamerQ   rÛ   s      r    rX   rX   �  s   € ð r   c                ó   — y rÝ   r   rÞ   s      r    rX   rX   ™  s   € ð r   éd   c               ó¸   — |D �cg c]	  }|› d| › �‘Œ }}|D ];  } t         j                  j                  | «      }|€Œ%|j                  «       dk7  sŒ9|c S  |S c c}w )aÃ  Retrieve an environment variable from a list of namespaces.

    Args:
        name: The name of the environment variable.
        default: The default value to return if the environment variable is not found.
        namespaces: A tuple of namespaces to search for the environment variable.

            Defaults to `('LANGSMITH', 'LANGCHAINs')`.

    Returns:
        The value of the environment variable if found, otherwise the default value.
    Ú_rO   )ÚosÚenvironrg   Ústrip)rß   rQ   rÛ   Ú	namespaceÚnamesrŒ   s         r    rX   rX   ¢  sd   € ñ& 5?Ó?±J y�	ˆ{˜!˜D˜6Ò"°J€EÐ?ÛˆÜ—
‘
—‘˜tÓ$ˆØÑ §¡£°"Ó!4ØŠLð ð €Nùò @s   …Ac           
     óv   — t         j                  j                  dt        dt        d| rdnd¬«      ¬«      «      S )z,Get the project name for a LangSmith tracer.ÚHOSTED_LANGSERVE_PROJECT_NAMEÚPROJECTÚSESSIONrQ   NrP   )rä   rå   rg   rX   )Úreturn_default_values    r    Úget_tracer_projectrî   ½  s=   € ô �:‰:�>‰>ð
 	(ÜØô  ØÑ0D¡9È$ôô		
óð r   c                  ó.   ‡ — e Zd ZdZddˆ fd„Zdd„Zˆ xZS )ÚFilterPoolFullWarningzGFilter `urllib3` warnings logged when the connection pool isn't reused.c                ó2   •— t         ‰| �  |«       || _        y)zºInitialize the `FilterPoolFullWarning` filter.

        Args:
            name: The name of the filter. Defaults to `""`.
            host: The host to filter. Defaults to `""`.
        N)r6   r7   Ú_host)r9   rß   Úhostr<   s      €r    r7   zFilterPoolFullWarning.__init__Ô  s   ø€ ô 	‰Ñ˜ÔØˆ�
r   c                óH   — |j                  «       }d|vry| j                  |vS )zJurllib3.connectionpool:Connection pool is full, discarding connection: ...z.Connection pool is full, discarding connectionT)Ú
getMessagerò   ©r9   ÚrecordÚmsgs      r    ÚfilterzFilterPoolFullWarning.filterÞ  s*   € à×ÑÓ!ˆØ;À3ÑFØØ�z‰z Ð$Ð$r   )rO   rO   )rß   r‚   ró   r‚   r=   r>   ©r=   Úbool)r   r   r   r   r7   rù   r?   r@   s   @r    rð   rð   Ñ  s   ø„ ÙQö÷%r   rð   c                  ó   — e Zd ZdZdd„Zy)ÚFilterLangSmithRetryz!Filter for retries from this lib.c                ó*   — |j                  «       }d|vS )z!Filter retries from this library.ÚLangSmithRetry)rõ   rö   s      r    rù   zFilterLangSmithRetry.filteré  s   € ð ×ÑÓ!ˆØ sÐ*Ð*r   Nrú   )r   r   r   r   rù   r   r   r    rý   rý   æ  s
   „ Ù+ô+r   rý   c                  ó   — e Zd ZdZy)rÿ   z&Wrapper to filter logs with this name.Nr   r   r   r    rÿ   rÿ   ð  r2   r   rÿ   c              #  óì  K  — t         5  |D ]  }| j                  |«       Œ 	 ddd«       	 d–— t         5  |D ]  }	 | j                  |«       Œ 	 ddd«       y# 1 sw Y   Œ8xY w# t        $ r t        j                  d«       Y ŒMw xY w# 1 sw Y   yxY w# t         5  |D ]8  }	 | j                  |«       Œ# t        $ r t        j                  d«       Y Œ6w xY w 	 ddd«       w # 1 sw Y   w xY wxY w­w)zçTemporarily adds specified filters to a logger.

    Parameters:
    - logger: The logger to which the filters will be added.
    - filters: A sequence of `logging.Filter` objects to be temporarily added
        to the logger.
    NzFailed to remove filter)Ú_FILTER_LOCKÚ	addFilterÚremoveFilterÚBaseExceptionr‘   Úwarning)ÚloggerÚfiltersrù   s      r    Úfilter_logsr	  ÷  sÈ   è ø€ ö 
ÛˆFØ×Ñ˜VÕ$ñ ÷ 
ð?ÛæÛ!�ð?Ø×'Ñ'¨Õ/ñ "÷ ˆ\÷ 
ˆûô %ò ?Ü—O‘OÐ$=Ö>ð?ú÷	 ˆ\ûŽ\Û!�ð?Ø×'Ñ'¨Õ/øÜ$ò ?Ü—O‘OÐ$=Ö>ð?úñ "÷ �\‰\ÿs§   ‚C4‰A£C4¬B °C4¶B
½A&ÁB
Á	C4ÁA#ÁC4Á&BÂB
ÂBÂB
Â
BÂC4ÂC1ÂC%Â$B6Â5C%Â6CÃC%ÃCÃC%Ã	C1Ã%C.Ã*C1Ã1C4c                ó$   — | �| S t        dd¬«      S )zÓGet the testing cache directory.

    Args:
        cache: The cache path.

    Returns:
        The cache path if provided, otherwise the value from the `LANGSMITH_TEST_CACHE`
        environment variable.
    NÚ
TEST_CACHErP   r`   )Úcaches    r    Úget_cache_dirr    s   € ð ÐØˆÜ�|¨TÔ2Ð2r   ©Úignore_hostsÚallow_hostsc               óø   ‡ ‡— |rt        ˆ fd„|D «       «      ry|rH	 t        j                  ‰ j                  «      }|j
                  xs dŠt        ˆ ˆfd„|D «       «      }|syi ‰ _        ‰ S # t        $ r Y yw xY w)zAFilter request headers based on `ignore_hosts` and `allow_hosts`.c              3  óT   •K  — | ]  }‰j                   j                  |«      –— Œ! y ­wrÝ   )ÚurlÚ
startswith)rh   ró   r}   s     €r    rj   z)filter_request_headers.<locals>.<genexpr>(  s!   øè ø€ ÐRÁ\¸T˜GŸK™K×2Ñ2°4×8Á\ùs   ƒ%(NrO   c              3  ó¬   •K  — | ]K  }|j                  d «      r‰j                  j                  |«      n‰|k(  xs ‰j                  d|› �«      –— ŒM y­w))zhttp://zhttps://r­   N)r  r  Úendswith)rh   ró   r}   Úrequest_hosts     €€r    rj   z)filter_request_headers.<locals>.<genexpr>3  s_   øè ø€ ð 	
ñ $�ð —?‘?Ð#:Ô;ð —‘×&Ñ& tÔ,à! TÑ)ÒN¨\×-BÑ-BÀQÀtÀfÀ:Ó-NóOñ $ùs   ƒAA)ÚanyÚurllib_parseÚurlparser  Ú	ExceptionÚhostnameÚheaders)r}   r  r  Ú
parsed_urlÚhost_matchesr  s   `    @r    Úfilter_request_headersr      s‡   ù€ ñ œÓRÁ\ÓRÔRØáð	Ü%×.Ñ.¨w¯{©{Ó;ˆJð "×*Ñ*Ò0¨bˆäô 	
ñ $ó	
ó 	
ˆñ Øà€G„OØ€Nøô' ò 	áð	ús   �A- Á-	A9Á8A9c           	   #  ó´  ‡‡K  — 	 ddl }ddlm} |j	                  «        |j                  «        t        j                  j                  | «      \  }}|j                  |j                  d«      s|j                  d«      rdnd|d	g d
¢ddgˆˆfd„¬«      }|j                  |«      5  d–— ddd«       y# t        $ r t        d«      ‚w xY w# 1 sw Y   yxY w­w)úUse a cache for requests.r   NzNvcrpy is required to use caching. Install with:pip install -U "langsmith[vcr]")Ú_patchz.yamlz.ymlÚyamlÚjsonÚnew_episodes)ÚuriÚmethodÚpathÚbodyÚauthorizationz
Set-Cookiec                ó    •— t        | ‰‰¬«      S )Nr  )r   )r}   r  r  s    €€r    Ú<lambda>zwith_cache.<locals>.<lambda>f  s   ø€ Ô.DØ ,¸Kõ/
r   )Ú
serializerÚcassette_library_dirÚrecord_modeÚmatch_onÚfilter_headersÚbefore_record_request)ÚvcrÚImportErrorÚlangsmith._internalr#  Úpatch_urllib3Úpatch_vcr_aiohttprä   r)  ÚsplitÚVCRr  Úuse_cassette)r)  r  r  r4  r7  Ú	cache_dirÚ
cache_fileÚls_vcrs    ``     r    Ú
with_cacher?  D  sÙ   ùè ø€ ð
Ûõ <à×ÑÔ!Ø×#Ñ#Ô%äŸG™GŸM™M¨$Ó/Ñ€Iˆzà�W‰Wð ×"Ñ" 7Ô+¨z×/BÑ/BÀ6Ô/Jñ àà&ð #Ú2Ø'¨Ð6ô
ð ó €Fð  
×	Ñ	˜ZÕ	(Û÷ 
)Ð	(øô; ò 
Üð.ó
ð 	
ð
ú÷: 
)Ð	(üs4   „C†B4 ŠBCÂ&CÂ+	CÂ4C	Ã	CÃCÃCc              #  óf   K  — | �t        | ||«      5  d–— ddd«       yd–— y# 1 sw Y   yxY w­w)r"  N)r?  )r)  r  r  s      r    Úwith_optional_cacherA  n  s2   è ø€ ð ÐÜ˜˜l¨KÕ8Û÷ 9Ð8ô 	÷ 9Ð8üs   ‚1’%—1¥.ª1c                 óž   — t        j                  t        j                  «       Ž } | D �cg c]	  }d|vsŒ|‘Œ }}dj	                  |«      S c c}w )Nz
langsmith/rO   )Ú	tracebackÚformat_exceptionÚsysÚexc_inform   )Útb_linesÚlineÚfiltered_liness      r    Ú_format_excrJ  |  sH   € ä×)Ñ)¬3¯<©<«>Ð:€HÙ'/ÓL¡x˜t°<ÀtÒ3K’d x€NÐLØ�7‰7�>Ó"Ð"ùò Ms
   ©	A
³A
ÚTc                óJ  ‡‡‡— t        | «      }t        |dd «      }|�		  |‰«      S ‰‰k\  r| S t        | t        «      rB| j                  «       D ��ci c]&  \  }}t        |‰‰‰dz   «      t        |‰‰‰dz   «      “Œ( c}}S t        | t        «      r| D �cg c]  }t        |‰‰‰dz   «      ‘Œ c}S t        | t        «      rt        ˆˆˆfd„| D «       «      S t        | t        «      r| D �ch c]  }t        |‰‰‰dz   «      ’Œ c}S | S # t        $ r Y Œêw xY wc c}}w c c}w c c}w )NÚ__deepcopy__rf   c              3  ó@   •K  — | ]  }t        |‰‰‰d z   «      –— Œ y­w)rf   N)Ú_middle_copy)rh   ÚitemÚ_depthÚ	max_depthÚmemos     €€€r    rj   z_middle_copy.<locals>.<genexpr>�  s#   øè ø€ ÐUÑQTÈ”\ $¨¨i¸À!¹×DÑQTùs   ƒ)
r�   rÑ   r  r‰   rÒ   ÚitemsrO  ÚlistÚtupleÚset)	ÚvalrS  rR  rQ  ÚclsÚcopierÚkÚvrP  s	    ```     r    rO  rO  †  sE  ú€ ô ˆs‹)€Cä�S˜.¨$Ó/€FØÐð	Ù˜$“<Ðð �ÒØˆ
Ü�#”tÔð
 Ÿ	™	œô	
ñ $‘��1ô ˜˜D )¨V°a©ZÓ8¼,Ø�4˜ F¨Q¡Jó;ñ ð $ò	
ð 	
ô �#”tÔÙLOÓPÉCÀD”˜T 4¨°F¸Q±JÕ?ÈCÑPÐPÜ�#”uÔÜÕUÑQTÓUÓUÐUÜ�#”sÔÙLOÓPÉCÀD”˜T 4¨°F¸Q±JÕ?ÈCÑPÐPà€Jøô% ò 	Ùð	üó

ùò Qùò Qs#   ŸD Á+DÂDÃ)D Ä	DÄDc                ó¶   — i }	 t        j                  | |«      S # t        $ r5}t        j	                  dt        |«      «       t        | |«      cY d}~S d}~ww xY w)z¢Deep copy a value with a compromise for uncopyable objects.

    Args:
        val: The value to be deep copied.

    Returns:
        The deep copied value.
    zFailed to deepcopy input: %sN)ÚcopyÚdeepcopyr  r‘   ÚdebugÚreprrO  )rX  rS  r†   s      r    Údeepish_copyrb  ¤  sQ   € ð €Dð'Ü�}‰}˜S $Ó'Ð'øÜò 'ô
 	�‰Ð4´d¸1³gÔ>Ü˜C Ó&Õ&ûð'ús   „ š	A£*AÁAÁAc                óˆ   — ddl m} 	 |j                  | «      }|j                  |«      }||k\  S # |j                  $ r Y yw xY w)zGCheck if the current version is greater or equal to the target version.r   )ÚversionF)Ú	packagingrd  r   ÚInvalidVersion)Úcurrent_versionÚtarget_versionrd  ÚcurrentÚtargets        r    Úis_version_greater_or_equalrk  ¹  sM   € å!ðØ—-‘- Ó0ˆØ—‘˜~Ó.ˆð �fÑÐøð ×!Ñ!ò Ùðús   ˆ"/ ¯AÁ Ac                ó”  — | r6| j                  d«      dkD  s"| j                  d«      s| j                  d«      rt        t	        | «      «      ‚| j                  dd«      }|d   }t        |«      dkD  r|d   nd}d|v r2|j                  dd«      \  }}|r|st        t	        | «      «      ‚|||fS |st        t	        | «      «      ‚d||fS )a3  Parse a string in the format of `owner/name:hash`, `name:hash`, `owner/name`, or `name`.

    Args:
        identifier: The prompt identifier to parse.

    Returns:
        A tuple containing `(owner, name, hash)`.

    Raises:
        ValueError: If the identifier doesn't match the expected formats.
    Ú/rf   Ú:r   ÚlatestÚ-)rr   r  r  rn   rD   r9  r³   )rC   ÚpartsÚ
owner_nameÚcommitÚownerrß   s         r    Úparse_prompt_identifierru  Å  sÙ   € ñ Ø×Ñ˜CÓ  1Ò$Ø× Ñ  Ô%Ø×Ñ˜sÔ#äÔ:¸:ÓFÓGÐGà×Ñ˜S !Ó$€EØ�q‘€JÜ˜U› ašˆU�1ŠX¨X€Fà
ˆjÑØ ×&Ñ& s¨AÓ.‰ˆˆtÙ™DÜÔ>¸zÓJÓKÐKØ�d˜FÐ"Ð"áÜÔ>¸zÓJÓKÐKØ�J Ð&Ð&r   c                ó   — t        | «      S )ag  Parse a hub repo identifier (``owner/name:hash``, ``name``, etc.).

    Agents, skills, and prompts share the same identifier grammar on Hub.

    Args:
        identifier: The hub identifier to parse.

    Returns:
        A tuple containing ``(owner, name, hash)``.

    Raises:
        ValueError: If the identifier doesn't match the expected formats.
    )ru  rB   s    r    Úparse_hub_identifierrw  è  s   € ô # :Ó.Ð.r   ÚPc                  óZ   ‡ — e Zd ZdZ	 	 	 	 	 	 	 	 dˆ fd„Zdddœ	 	 	 	 	 	 	 	 	 dˆ fd„Zˆ xZS )	ÚContextThreadPoolExecutorz?ThreadPoolExecutor that copies the context to the child thread.c           
     ó¸   •— t         ‰| �  t        t        dt        f   t        j                  t        j                  «       j                  |g|¢­i |¤Ž«      «      S )aC  Submit a function to the executor.

        Args:
            func (Callable[..., T]): The function to submit.
            *args (Any): The positional arguments to the function.
            **kwargs (Any): The keyword arguments to the function.

        Returns:
            Future[T]: The future for the function.
        .)
r6   Úsubmitr   r   rK  rx   ÚpartialÚcontextvarsÚcopy_contextÚrun)r9   rv   r:   r;   r<   s       €r    r|  z ContextThreadPoolExecutor.submitÿ  s\   ø€ ô  ‰w‰~ÜÜ˜œa˜Ñ Ü×!Ñ!Ü×,Ñ,Ó.×2Ñ2°DðØ;?òØCIñóó
ð 	
r   Nrf   ©ÚtimeoutÚ	chunksizec               ó¶   •‡‡— t        t        |d   «      «      D �cg c]  }t        j                  «       ‘Œ c}Šdˆˆfd„}t	        ‰| �  |g|¢­||dœŽS c c}w )aÑ  Return an iterator equivalent to stdlib map.

        Each function will receive its own copy of the context from the parent thread.

        Args:
            fn: A callable that will take as many arguments as there are
                passed iterables.
            timeout: The maximum number of seconds to wait. If None, then there
                is no limit on the wait time.
            chunksize: The size of the chunks the iterable will be broken into
                before being passed to a child process. This argument is only
                used by ProcessPoolExecutor; it is ignored by
                ThreadPoolExecutor.

        Returns:
            An iterator equivalent to: map(func, *iterables) but the calls may
            be evaluated out-of-order.

        Raises:
            TimeoutError: If the entire result iterator could not be generated
                before the given timeout.
            Exception: If fn(*args) raises for any values.
        r   c                 óF   •—  ‰j                  «       j                  ‰g| ¢­Ž S rÝ   )Úpopr€  )r:   ÚcontextsÚfns    €€r    Ú_wrapped_fnz2ContextThreadPoolExecutor.map.<locals>._wrapped_fn8  s!   ø€ Ø%�8—<‘<“>×%Ñ% bÐ0¨4Ò0Ð0r   r�  )r:   r   r=   rK  )Úranger³   r~  r  r6   Úmap)	r9   rˆ  r‚  rƒ  Ú	iterablesrã   r‰  r‡  r<   s	    `     @€r    r‹  zContextThreadPoolExecutor.map  sh   ú€ ô< 9>¼cÀ)ÈAÁ,Ó>OÔ8PÓQÑ8P°1”K×,Ñ,Õ.Ð8PÑQˆö	1ô ‰w‰{Øð
àñ
ð Øò	
ð 	
ùò Rs   �A)rv   zCallable[P, T]r:   zP.argsr;   zP.kwargsr=   z	Future[T])
rˆ  zCallable[..., T]rŒ  zIterable[Any]r‚  zOptional[float]rƒ  Úintr=   zIterator[T])r   r   r   r   r|  r‹  r?   r@   s   @r    rz  rz  ü  ss   ø„ ÙIð
àð
ð ð
ð ð	
ð
 
õ
ð: $(Øñ(
àð(
ð "ð(
ð !ð	(
ð
 ð(
ð 
÷(
ñ (
r   rz  c                óð   — | xs t        t        t        dd¬«      «      }|j                  «       st	        d«      ‚|j                  «       j                  d«      j                  d«      j                  d«      S )zBGet the LangSmith API URL from the environment or the given value.ÚENDPOINTzhttps://api.smith.langchain.comrP   z!LangSmith API URL cannot be emptyÚ"Ú'rm  )r   r‚   rX   ræ   r&   Úrstrip)Úapi_urlÚ_api_urls     r    Úget_api_urlr•  C  sj   € àò œ$ÜÜØØ5ô	
ó€Hð �>‰>ÔÜ Ð!DÓEÐEØ�>‰>Ó×!Ñ! #Ó&×,Ñ,¨SÓ1×8Ñ8¸Ó=Ð=r   c                ó¦   — | �| nt        dd¬«      }|�|j                  «       sy|j                  «       j                  d«      j                  d«      S )z8Get the API key from the environment or the given value.NÚAPI_KEYrP   r�  r‘  ©rX   ræ   )Úapi_keyÚapi_key_s     r    Úget_api_keyr›  Q  sK   € à!Ð-‰w´;¸yÐRVÔ3W€HØÐ˜xŸ~™~Ô/ØØ�>‰>Ó×!Ñ! #Ó&×,Ñ,¨SÓ1Ð1r   c                ó¦   — | �| nt        dd¬«      }|�|j                  «       sy|j                  «       j                  d«      j                  d«      S )zGet workspace ID.NÚWORKSPACE_IDrP   r�  r‘  r˜  )Úworkspace_idÚworkspace_id_s     r    Úget_workspace_idr   Y  sY   € ð Ð#ñ 	ä˜°Ô6ð ð
 Ð M×$7Ñ$7Ô$9ØØ×ÑÓ ×&Ñ& sÓ+×1Ñ1°#Ó6Ð6r   >   ú::1ú0:0:0:0:0:0:0:1Ú	localhostú0.0.0.0ú	127.0.0.1c                óp  — 	 t        j                  | «      j                  j                  d«      d   j	                  «       j                  d«      }|t        v ryt        j                  |«      }|dk(  xs$ |j                  d«      xs |j                  d«      S # t        j                  t        f$ r Y yw xY w)	zÄCheck if the URL is localhost.

    Parameters
    ----------
    url : str
        The URL to check.

    Returns:
    -------
    bool
        True if the URL is localhost, False otherwise.
    rn  r   z[]Tr¥  r¤  z::F)r  ÚurlsplitÚnetlocr9  r    ræ   Ú_LOCALHOST_NAMESÚsocketÚgethostbynamer  ÚgaierrorÚRuntimeError)r  r¨  Úips      r    Ú_is_localhostr¯  j  sŸ   € ðÜ×&Ñ& sÓ+×2Ñ2×8Ñ8¸Ó=¸aÑ@×FÑFÓH×NÑNÈtÓTˆØÔ%Ñ%ØÜ×!Ñ! &Ó)ˆØ�[Ñ ÒS B§M¡M°)Ó$<ÒSÀÇÁÈdÓ@SÐSøÜ�O‰Oœ\Ð*ò áðús   ‚AB Á?B ÂB5Â4B5é   c                ó¶  — | r| S t        j                  |«      }t        |«      rd}|S t        |j                  «      j                  d«      rOt        |j                  «      j                  dd«      d   }t        j                  |j                  |¬«      «      }|S t        |j                  «      j                  d«      rOt        |j                  «      j                  dd«      d   }t        j                  |j                  |¬«      «      }|S t        |j                  «      j                  d«      rd}|S t        |j                  «      j                  d	«      rd
}|S t        |j                  «      j                  d«      rd}|S t        |j                  «      j                  d«      rd}|S t        |j                  «      j                  d«      rd}|S d}|S )z1Get the host URL based on the web URL or API URL.zhttp://localhostz/apirf   r   )r)  z/api/v1zeu.zhttps://eu.smith.langchain.comzaws.zhttps://aws.smith.langchain.comzapac.z https://apac.smith.langchain.comzdev.zhttps://dev.smith.langchain.comzbeta.z https://beta.smith.langchain.comzhttps://smith.langchain.com)r  r  r¯  r‚   r)  r  ÚrsplitÚ
urlunparseÚ_replacer¨  r  )Úweb_urlr“  r  ÚlinkÚnew_paths        r    Úget_host_urlr¸  ‚  s»  € ñ ØˆÜ×&Ñ& wÓ/€JÜ�WÔØ!ˆð& €Kô% 
ˆZ�_‰_Ó	×	&Ñ	& vÔ	.Ü�z—‘Ó'×.Ñ.¨v°qÓ9¸!Ñ<ˆÜ×&Ñ& z×':Ñ':ÀÐ':Ó'IÓJˆð  €Kô 
ˆZ�_‰_Ó	×	&Ñ	& yÔ	1Ü�z—‘Ó'×.Ñ.¨y¸!Ó<¸QÑ?ˆÜ×&Ñ& z×':Ñ':ÀÐ':Ó'IÓJˆð €Kô 
ˆZ×ÑÓ	×	*Ñ	*¨5Ô	1Ø/ˆð €Kô 
ˆZ×ÑÓ	×	*Ñ	*¨6Ô	2Ø0ˆð €Kô 
ˆZ×ÑÓ	×	*Ñ	*¨7Ô	3Ø1ˆð €Kô 
ˆZ×ÑÓ	×	*Ñ	*¨6Ô	2Ø0ˆð
 €Kô	 
ˆZ×ÑÓ	×	*Ñ	*¨7Ô	3Ø1ˆð €Kð -ˆØ€Kr   c                óž  — |dkD  st        | «      st        | «      S t        | d«      r| j                  S t	        | t
        j                  «      rt        | j                  |dz   «      S t        | d«      rQt        | d«      r,t        | j                  d«      r| j                  j                  S t        | j                  |dz   «      S t        | «      S )Nr°  r   rf   Ú__call__r<   )Úcallabler‚   rÓ   r   r‰   rx   r}  Ú_get_function_namerv   r<   rº  )rˆ  Údepths     r    r¼  r¼  Ÿ  s    € Øˆq‚yœ œÜ�2‹wˆäˆr�:ÔØ�{‰{Ðä�"”i×'Ñ'Ô(Ü! "§'¡'¨5°1©9Ó5Ð5äˆr�:ÔÜ�2�{Ô#¬°·±¸jÔ(IØ—<‘<×(Ñ(Ð(Ü! "§+¡+¨u°q©yÓ9Ð9äˆr‹7€Nr   c                ól   — t        | t        «      r| j                  «       dk(  xs | dk(  S t        | «      S )zžCheck if the value is truish.

    Args:
        val (Any): The value to check.

    Returns:
        bool: True if the value is truish, False otherwise.
    rR   Ú1)r‰   r‚   r    rû   )rX  s    r    r×   r×   ±  s2   € ô �#”sÔØ�y‰y‹{˜fÑ$Ò2¨¨s©
Ð2Ü�‹9Ðr   )rC   r‚   r=   r‚   rÝ   )rY   zOptional[dict]r=   zUnion[bool, Literal['local']]rú   )ru   ztuple[str, ...]r=   r   )r~   z(Union[requests.Response, httpx.Response]r=   r>   )r�   zUnion[enum.Enum, str]r=   r‚   )r“   r�  r”   r‚   r=   r>   )r”   úMapping[str, Any]r=   r‚   )r”   rÀ  r=   rÀ  )r”   rÀ  r=   údict[str, Any])r®   rÀ  r=   zlist[dict[str, Any]])rµ   rÀ  r=   rÁ  )r®   rÀ  r=   r‚   )rµ   rÀ  r=   r‚   )r=   z	list[str])r”   zls_schemas.BaseMessageLiker=   rÒ   )rÔ   Úobjectr=   rû   )rŒ   úOptional[str]r=   rû   )rß   r‚   rQ   r‚   rÛ   rV  r=   r‚   )rß   r‚   rQ   r>   rÛ   rV  r=   rÃ  )rß   r‚   rQ   rÃ  rÛ   rV  r=   rÃ  )T)r=   rÃ  )r  zlogging.Loggerr  zSequence[logging.Filter]r=   úGenerator[None, None, None])r  rÃ  r=   rÃ  )r}   r   r  úOptional[Sequence[str]]r  rÅ  r=   r   )NN)r)  zUnion[str, pathlib.Path]r  rÅ  r  rÅ  r=   rÄ  )r)  z"Optional[Union[str, pathlib.Path]]r  rÅ  r  rÅ  r=   rÄ  )r=   r‚   )é   r   )
rX  rK  rS  zdict[int, Any]rR  r�  rQ  r�  r=   rK  )rX  rK  r=   rK  )rg  r‚   rh  r‚   r=   rû   )rC   r‚   r=   ztuple[str, str, str])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‚   )rX  r   r=   rû   )rr   Ú
__future__r   Ú
contextlibr~  r^  rŠ   rx   Úloggingrä   Úpathlibrª  rÄ   rE  Ú	threadingrC  Úcollections.abcr   r   r   r   r   Úconcurrent.futuresr	   r
   Útypingr   r   r   r   r   r   r   r   Úurllibr   r  r„   r€   Útyping_extensionsr   Úurllib3.utilr   Ú	langsmithr   Ú
ls_schemasÚ	getLoggerr   r‘   r  r   r"   r$   r&   r(   r*   r,   r.   r1   r4   rD   ÚUserWarningrF   rH   r\   ra   r{   r‡   rŽ   Ú	lru_cacher•   r¢   r¥   rª   r¯   r·   r»   r½   rÉ   rÎ   rÕ   rØ   rX   rî   ÚFilterrð   rý   rÿ   ÚRLockr  Úcontextmanagerr	  r  r   r?  rA  rJ  rK  rO  rb  rk  ru  rw  rx  rz  r•  r›  r   Ú	frozensetr©  r¯  r¸  r¼  r×   r   r   r    Ú<module>rÛ     s�  ðÙ  å "ã Û Û Û Û Û Û 	Û Û Û Û 
Û Û ß LÕ Lß 9÷	÷ 	ó 	õ )ã Û Ý 'Ý å +à
ˆ'×
Ñ
˜HÓ
%€ôH�Yô HôD˜ô Dô5˜nô 5ôL˜ô LôB˜nô Bô8˜ô 8ô0˜^ô 0ô'˜^ô 'ô1˜~ô 1ô%˜nô %óô0#�{ô #ô'Ð$4ô 'ô ó0?ó
ð4Ø6ðà	óó ð €×Ñ˜QÔò ó  ð ó
ó&ó&8óPó&9ó:Ló2
$ð €×Ñ˜QÔòó  ðó4	óó$)ð 
ð
 3ñ	Ø
ðàðð ð	ð
 	òó 
ðð 
ð ðð 3ñ	Ø
ðàðð ð	ð
 òó 
ðð €×Ñ˜SÔ!ð "ðð 3ñ	Ø
ðàðð ð	ð
 òó "ðð4 €×Ñ˜QÔóó  ðô&%˜GŸN™Nô %ô*+˜7Ÿ>™>ô +ô1�Uô 1ð ˆy�‰Ó €ð ×Ñð?Øð?Ø%=ð?à ò?ó ð?ó23ð$ -1Ø+/ñ	!Øð!ð *ð!ð )ð	!ð
 	ó!ðH ×Ñð -1Ø+/ð&Ø
"ð&à)ð&ð )ð&ð !ò	&ó ð&ðR ×Ñð -1Ø+/ð
Ø
,ð
à)ð
ð )ð
ð !ò	
ó ð
ó#ñ ˆCƒL€ð EFðØ	
ðØ ðØ-0ðØ>Aðàóó<'ó*	ó 'óF/ñ" ˆcƒN€ôD
Ð 2ô D
óN>ó2ó	7ñ ÚCóÐ ó
ð0 €×Ñ˜QÔòó  ðô8ô$r   