Ë
    ÂXÕi‚‘  ã                  óÐ  — 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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 ddlmZmZmZmZmZ dd	lmZ dd
lmZ ddlm Z  ddl!m"Z"m#Z#m$Z$m%Z%  ejL                  e'«      Z( G d„ de«      Z) G d„ ded¬«      Z* G d„ de«      Z+ G d„ ded¬«      Z, G d„ d«      Z-ee+e,e.f   Z/ G d„ de«      Z0ee0e.f   Z1 G d„ de-«      Z2	 	 d'd„Z3dZ4d(d„Z5 G d „ d!«      Z6	 	 	 	 d)d"„Z7	 	 	 	 d*d#„Z8	 	 	 	 d+d$„Z9	 	 	 	 d,d%„Z:eeee jJ                     ee jH                     gee+e,f   f   ee;e jJ                     e;e jH                     gee+e,f   f   f   Z<d-d&„Z=y).z?This module contains the evaluator classes for evaluating runs.é    )ÚannotationsN)Úabstractmethod)Ú	AwaitableÚSequence)Úwraps)ÚAnyÚCallableÚLiteralÚOptionalÚUnionÚcast)Ú	BaseModelÚ
ConfigDictÚFieldÚValidationErrorÚmodel_validator)Ú	TypedDict©Úrun_helpers)Úschemas)Ú
SCORE_TYPEÚ
VALUE_TYPEÚExampleÚRunc                  ó(   — e Zd ZU dZded<   	 ded<   y)ÚCategoryz$A category for categorical feedback.úOptional[Union[float, int]]ÚvalueÚstrÚlabelN©Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__© ó    új/root/rosshost/parking-map/parking-api/venv/lib/python3.12/site-packages/langsmith/evaluation/evaluator.pyr   r      s   … Ù.à&Ó&ØCØƒJØ&r(   r   c                  ó@   — e Zd ZU dZded<   	 ded<   	 ded<   	 ded<   y	)
ÚFeedbackConfigzkConfiguration to define a type of feedback.

    Applied on on the first creation of a `feedback_key`.
    z0Literal['continuous', 'categorical', 'freeform']Útyper   ÚminÚmaxz%Optional[list[Union[Category, dict]]]Ú
categoriesNr!   r'   r(   r)   r+   r+   (   s*   … ñð
 ;Ó:ØØ	$Ó$Ø;Ø	$Ó$ØAØ5Ô5r(   r+   F)Útotalc                  óþ   — e Zd ZU dZded<   	 dZded<   	 dZded<   	 dZd	ed
<   	 dZded<   	 dZ	d	ed<   	  e
e¬«      Zded<   	 dZded<   	 dZded<   	 dZded<   	 dZd	ed<   	  ed¬«      Z ed¬«      dd„«       Zy)ÚEvaluationResultzEvaluation result.r   ÚkeyNr   Úscorer   r   zOptional[dict]ÚmetadatazOptional[str]ÚcommentÚ
correction)Údefault_factoryÚdictÚevaluator_infoz%Optional[Union[FeedbackConfig, dict]]Úfeedback_configúOptional[Union[uuid.UUID, str]]Úsource_run_idÚtarget_run_idÚextraÚforbid)r?   Úafter)Úmodec                ó¢   — | j                   €Bt        | j                  t        t        f«      r"t
        j                  d| j                  › �«       | S )z:Warn when numeric values are passed via the `value` field.zJNumeric values should be provided in the 'score' field, not 'value'. Got: )r4   Ú
isinstancer   ÚintÚfloatÚloggerÚwarning©Úselfs    r)   Úcheck_value_non_numericz(EvaluationResult.check_value_non_numericV   sE   € ð �:‰:Ð¤*¨T¯Z©Z¼#¼u¸Ô"FÜ�N‰NðØŸ™˜ð&ôð ˆr(   )Úreturnr2   )r"   r#   r$   r%   r&   r4   r   r5   r6   r7   r   r9   r:   r;   r=   r>   r?   r   Úmodel_configr   rK   r'   r(   r)   r2   r2   7   s¼   … Ùà	ƒHØ@Ø€Eˆ:ÓØ0Ø€Eˆ:ÓØ8Ø#€HˆnÓ#Ø8Ø!€Gˆ]Ó!Ø2Ø!%€J�Ó%Ø:Ù °Ô6€N�DÓ6Ø5Ø=A€OÐ:ÓAØ;Ø59€MÐ2Ó9Ø6Ø59€MÐ2Ó9ðð !€Eˆ>Ó Ø)á HÔ-€Lá˜'Ô"òó #ñr(   r2   c                  ó   — e Zd ZU dZded<   y)ÚEvaluationResultszqBatch evaluation results.

    This makes it easy for your evaluator to return multiple
    metrics at once.
    zlist[EvaluationResult]ÚresultsNr!   r'   r(   r)   rO   rO   a   s   … ñð $Ó#Ø!r(   rO   c                  óR   — e Zd ZdZe	 	 d	 	 	 	 	 	 	 dd„«       Z	 	 d	 	 	 	 	 	 	 dd„Zy)ÚRunEvaluatorzEvaluator interface class.Nc                 ó   — y)zEvaluate an example.Nr'   )rJ   ÚrunÚexampleÚevaluator_run_ids       r)   Úevaluate_runzRunEvaluator.evaluate_runo   s   � r(   c              ƒ  óª   ‡ ‡‡‡‡K  — t        j                  «       Šˆˆˆˆˆ fd„}t        j                  «       j	                  d|«      ƒ d{  –—† S 7 Œ­w)z#Evaluate an example asynchronously.c                 ó€   •— t        j                  di ‰ ¤Ž5  ‰j                  ‰‰‰«      cd d d «       S # 1 sw Y   y xY w)Nr'   )ÚrhÚtracing_contextrW   )Úcurrent_contextrV   rU   rT   rJ   s   €€€€€r)   Ú_run_with_contextz5RunEvaluator.aevaluate_run.<locals>._run_with_context�   s@   ø€ Ü×#Ñ#Ñ6 oÑ6ñ IØ×(Ñ(¨¨gÐ7GÓH÷I÷ Iò Iús   —4´=N)rZ   Úget_tracing_contextÚasyncioÚget_running_loopÚrun_in_executor)rJ   rT   rU   rV   r]   r\   s   ```` @r)   Úaevaluate_runzRunEvaluator.aevaluate_runx   sH   üè ø€ ô ×0Ñ0Ó2ˆ÷	Ið 	Iô ×-Ñ-Ó/×?Ñ?ÀÐFWÓX×XÐXÐXús   ‡AAÁAÁA©NN©rT   r   rU   úOptional[Example]rV   úOptional[uuid.UUID]rL   ú*Union[EvaluationResult, EvaluationResults])r"   r#   r$   r%   r   rW   rb   r'   r(   r)   rR   rR   l   s}   „ Ù$àð &*Ø04ð	#àð#ð #ð#ð .ð	#ð
 
4ò#ó ð#ð &*Ø04ð	YàðYð #ðYð .ð	Yð
 
4ôYr(   rR   c                  óH   — e Zd ZU dZded<   	 ded<   	 dZded<   	 dZd	ed
<   y)ÚComparisonEvaluationResultz°Feedback scores for the results of comparative evaluations.

    These are generated by functions that compare two or more runs,
    returning a ranking or other feedback.
    r   r3   z'dict[Union[uuid.UUID, str], SCORE_TYPE]ÚscoresNr<   r=   z6Optional[Union[str, dict[Union[uuid.UUID, str], str]]]r6   )r"   r#   r$   r%   r&   r=   r6   r'   r(   r)   ri   ri   ‹   s8   … ñð 
ƒHØ@Ø3Ó3Ø4Ø59€MÐ2Ó9Ø6ØFJ€GÐCÓJðr(   ri   c                  óÔ   ‡ — e Zd ZdZ	 d	 	 	 dd„Z	 d	 	 	 	 	 	 	 dd„Z	 	 	 	 	 	 dd„Z	 	 	 	 	 	 dd„Zedd„«       Z		 	 d	 	 	 	 	 	 	 dd„Z
	 	 d	 	 	 	 	 dˆ fd„Z	 d	 	 	 	 	 dd	„Zdd
„Zˆ xZS )ÚDynamicRunEvaluatora¶  A dynamic evaluator that wraps a function and transforms it into a `RunEvaluator`.

    This class is designed to be used with the `@run_evaluator` decorator, allowing
    functions that take a `Run` and an optional `Example` as arguments, and return
    an `EvaluationResult` or `EvaluationResults`, to be used as instances of `RunEvaluator`.

    Attributes:
        func (Callable): The function that is wrapped by this evaluator.
    c                ó  ‡— t        |«      \  }Š|rt        |«      \  }Šd	ˆfd„} t        |«      | «       ddlm} |�*|j	                  ||¬«      | _        t        |dd«      | _        t        j                  |«      r8|�t        d«      ‚|j	                  ||¬«      | _        t        |dd«      | _        y|j	                  t        t        t        t        t           gt         f   |«      |¬«      | _        t        |dd«      | _        y)
zöInitialize the `DynamicRunEvaluator` with a given function.

        Args:
            func (Callable): A function that takes a `Run` and an optional `Example` as
            arguments, and returns a dict or `ComparisonEvaluationResult`.
        c                óf   •— ‰€| S  ‰| j                  d«      | j                  d«      «      \  }}}|S )NrT   rU   ©Úget©ÚinputsÚ_Útraced_inputsÚprepare_inputss      €r)   Úprocess_inputsz4DynamicRunEvaluator.__init__.<locals>.process_inputsÅ   s>   ø€ ØÐ%Ø�Ù$2Ø—
‘
˜5Ó! 6§:¡:¨iÓ#8ó%Ñ!ˆQ��=ð !Ð r(   r   r   N©rv   r"   rl   ú�Func was provided as a coroutine function, but afunc was also provided. If providing both, func should be a regular function to avoid ambiguity.©rr   r9   rL   r9   )Ú_normalize_evaluator_funcr   Ú	langsmithr   Úensure_traceableÚafuncÚgetattrÚ_nameÚinspectÚiscoroutinefunctionÚ	TypeErrorr   r	   r   r   r   Ú_RUNNABLE_OUTPUTÚfunc©rJ   r„   r}   rv   r   ru   s        @r)   Ú__init__zDynamicRunEvaluator.__init__­   s  ø€ ô( ";¸4Ó!@Ñˆˆ~ÙÜ&?ÀÓ&FÑ#ˆU�Nõ	!ð 	Œˆd‹�DÔÝ)àÐØ$×5Ñ5Ø nð 6ó ˆDŒJô ! ¨
Ð4IÓJˆDŒJÜ×&Ñ& tÔ,ØÐ Üð3óð ð
 %×5Ñ5Ø ^ð 6ó ˆDŒJô !  zÐ3HÓIˆD�Jà#×4Ñ4Ü”Xœs¤H¬WÑ$5Ð6Ô8HÐHÑIÈ4ÓPØ-ð 5ó ˆDŒIô !  zÐ3HÓIˆD�Jr(   c                ó<  ‡— t        ‰t        «      r‰j                  s|‰_        ‰S 	 ‰st        d‰› �«      ‚d‰vr|r| j                  ‰d<   t        ˆfd„dD «       «      rt        d‰› �«      ‚t        di d|i‰¥¤ŽS # t        $ r}t        d‰› �«      |‚d }~ww xY w)	NziExpected an EvaluationResult object, or dict with a metric 'key' and optional 'score'; got empty result: r3   c              3  ó&   •K  — | ]  }|‰v–— Œ
 y ­w©Nr'   )Ú.0ÚkÚresults     €r)   ú	<genexpr>z@DynamicRunEvaluator._coerce_evaluation_result.<locals>.<genexpr>ù   s   øè ø€ ÒJ q�1˜F”?ÑJùó   ƒ)r4   r   r6   zrExpected an EvaluationResult object, or dict with a metric 'key' and optional 'score' or categorical 'value'; got r=   z[Expected an EvaluationResult object, or dict with a metric 'key' and optional 'score'; got r'   )rD   r2   r=   Ú
ValueErrorr   Úallr   )rJ   rŒ   r=   Úallow_no_keyÚes    `   r)   Ú_coerce_evaluation_resultz-DynamicRunEvaluator._coerce_evaluation_resultç   sÝ   ø€ ô �fÔ.Ô/Ø×'Ò'Ø'4�Ô$ØˆMð	ÙÜ ðFØFLÀXðOóð ð ˜FÑ"¡|Ø $§
¡
��u‘ÜÓJÐ,IÔJÔJÜ ðOØOUÈhðXóð ô $ÑQ ¸Ð&PÈÐ&PÑQÐQøÜò 	Üð4Ø4:°8ð=óð ðûð	ús   ¨AA> Á>	BÂBÂBc                óÜ   — d|v rB|j                  «       }|d   D �cg c]  }| j                  ||¬«      ‘Œ c}|d<   t        di |¤ŽS | j                  t        t        |«      |d¬«      S c c}w )NrP   )r=   T)r=   r‘   r'   )Úcopyr“   rO   r   r9   )rJ   rP   r=   ÚcpÚrs        r)   Ú_coerce_evaluation_resultsz.DynamicRunEvaluator._coerce_evaluation_results  s…   € ð
 ˜ÑØ—‘“ˆBð ! Ñ+öàð ×.Ñ.¨qÀÐ.ÕNòˆBˆy‰Mô %Ñ* rÑ*Ð*à×-Ñ-Ü”�wÓ¨}È4ð .ó 
ð 	
ùòs   œA)c                ó†   — t        |t        «      r|j                  s||_        |S t        |«      }| j	                  ||«      S r‰   )rD   r2   r=   Ú_format_evaluator_resultr˜   )rJ   rŒ   r=   s      r)   Ú_format_resultz"DynamicRunEvaluator._format_result  sB   € ô �fÔ.Ô/Ø×'Ò'Ø'4�Ô$ØˆMÜ)¨&Ó1ˆØ×.Ñ.¨v°}ÓEÐEr(   c                ó   — t        | d«      S ©z¢Check if the evaluator function is asynchronous.

        Returns:
            bool: `True` if the evaluator function is asynchronous, `False` otherwise.
        r}   ©ÚhasattrrI   s    r)   Úis_asynczDynamicRunEvaluator.is_async$  ó   € ô �t˜WÓ%Ð%r(   c                óž  — t        | d«      sPt        j                  «       }|j                  «       rt	        d«      ‚|j                  | j                  ||«      «      S |€t        j                  «       }d|j                  i}t        |dd«      rt        |j                  «      |d<   | j                  ||||dœ¬«      }| j                  ||«      S )	a�  Evaluate a run using the wrapped function.

        This method directly invokes the wrapped function with the provided arguments.

        Args:
            run (Run): The run to be evaluated.
            example (Optional[Example]): An optional example to be used in the evaluation.

        Returns:
            Union[EvaluationResult, EvaluationResults]: The result of the evaluation.
        r„   útCannot call `evaluate_run` on an async run evaluator from within an running event loop. Use `aevaluate_run` instead.Nr>   Ú
session_idÚ
experiment©Úrun_idr5   ©Úlangsmith_extra)rŸ   r_   Úget_event_loopÚ
is_runningÚRuntimeErrorÚrun_until_completerb   ÚuuidÚuuid4Úidr~   r   r¤   r„   r›   )rJ   rT   rU   rV   Úrunning_loopr5   rŒ   s          r)   rW   z DynamicRunEvaluator.evaluate_run-  sÑ   € ô" �t˜VÔ$Ü"×1Ñ1Ó3ˆLØ×&Ñ&Ô(Ü"ðRóð ð
 $×6Ñ6°t×7IÑ7IÈ#ÈwÓ7WÓXÐXØÐ#Ü#Ÿz™z›|ÐØ$3°S·V±VÐ#<ˆÜ�3˜ dÔ+Ü%(¨¯©Ó%8ˆH�\Ñ"Ø—‘ØØØ'7ÀXÑNð ó 
ˆð
 ×"Ñ" 6Ð+;Ó<Ð<r(   c              ƒ  óP  •K  — t        | d«      st        ‰| �	  ||«      ƒ d{  –—† S |€t        j                  «       }d|j
                  i}t        |dd«      rt        |j                  «      |d<   | j                  ||||dœ¬«      ƒ d{  –—† }| j                  ||«      S 7 Œ~7 Œ­w)aÄ  Evaluate a run asynchronously using the wrapped async function.

        This method directly invokes the wrapped async function with the
            provided arguments.

        Args:
            run (Run): The run to be evaluated.
            example (Optional[Example]): An optional example to be used
                in the evaluation.

        Returns:
            Union[EvaluationResult, EvaluationResults]: The result of the evaluation.
        r}   Nr>   r¤   r¥   r¦   r¨   )rŸ   Úsuperrb   r®   r¯   r°   r~   r   r¤   r}   r›   )rJ   rT   rU   rV   r5   rŒ   Ú	__class__s         €r)   rb   z!DynamicRunEvaluator.aevaluate_runS  s®   øè ø€ ô& �t˜WÔ%Ü™Ñ.¨s°GÓ<×<Ð<ØÐ#Ü#Ÿz™z›|ÐØ$3°S·V±VÐ#<ˆÜ�3˜ dÔ+Ü%(¨¯©Ó%8ˆH�\Ñ"Ø—z‘zØØØ'7ÀXÑNð "ó 
÷ 
ˆð
 ×"Ñ" 6Ð+;Ó<Ð<ð =øð
ús"   ƒ B&£B"¤A'B&ÂB$ÂB&Â$B&c                ó&   — | j                  ||«      S )aÉ  Make the evaluator callable, allowing it to be used like a function.

        This method enables the evaluator instance to be called directly, forwarding the
        call to `evaluate_run`.

        Args:
            run (Run): The run to be evaluated.
            example (Optional[Example]): An optional example to be used in the evaluation.

        Returns:
            Union[EvaluationResult, EvaluationResults]: The result of the evaluation.
        )rW   )rJ   rT   rU   s      r)   Ú__call__zDynamicRunEvaluator.__call__t  s   € ð × Ñ   gÓ.Ð.r(   c                ó"   — d| j                   › d�S )ú)Represent the DynamicRunEvaluator object.z<DynamicRunEvaluator ú>©r   rI   s    r)   Ú__repr__zDynamicRunEvaluator.__repr__…  s   € à& t§z¡z l°!Ð4Ð4r(   r‰   )r„   úXCallable[[Run, Optional[Example]], Union[_RUNNABLE_OUTPUT, Awaitable[_RUNNABLE_OUTPUT]]]r}   zIOptional[Callable[[Run, Optional[Example]], Awaitable[_RUNNABLE_OUTPUT]]])F)rŒ   zUnion[EvaluationResult, dict]r=   ú	uuid.UUIDr‘   ÚboolrL   r2   )rP   zUnion[dict, EvaluationResults]r=   r½   rL   rg   )rŒ   zMUnion[EvaluationResult, EvaluationResults, dict, str, int, bool, float, list]r=   r½   rL   rg   ©rL   r¾   rc   rd   )rT   r   rU   re   rV   rf   )rT   r   rU   re   rL   rg   ©rL   r   )r"   r#   r$   r%   r†   r“   r˜   r›   Úpropertyr    rW   rb   r¶   r»   Ú__classcell__)r´   s   @r)   rl   rl   ¢   s;  ø„ ñð, ð8Jð
ð8Jð
ó8Jð| #ð	à-ðð !ðð ð	ð
 
óð<
à/ð
ð !ð
ð 
4ó	
ð"Fð
ðFð
 !ðFð 
4óFð ò&ó ð&ð &*Ø04ð	$=àð$=ð #ð$=ð .ð	$=ð
 
4ó$=ðR &*Ø04ð	=àð=ð #ð=ð .õ	=ðD 6:ð/Øð/Ø!2ð/à	3ó/÷"5r(   rl   c                ó   — t        | «      S )zmCreate a run evaluator from a function.

    Decorator that transforms a function into a `RunEvaluator`.
    )rl   ©r„   s    r)   Úrun_evaluatorrÅ   Š  s   € ô ˜tÓ$Ð$r(   i'  c                ó^   — t        | «      }t        |«      t        kD  r|d t        dz
   dz   }|S )Né   z...))ÚreprÚlenÚ_MAXSIZE)ÚobjÚss     r)   Ú_maxsize_reprrÍ   ™  s1   € ÜˆS‹	€AÜ
ˆ1ƒv”ÒØˆn”˜1‘Ð Ñ&ˆØ€Hr(   c                  ó¨   — e Zd ZdZ	 d	 	 	 dd„Zedd„«       Z	 d	 	 	 	 	 dd„Z	 d	 	 	 	 	 dd„Z	 d	 	 	 	 	 dd„Z	dd„Z
edd	„«       Z	 	 	 	 	 	 	 	 dd
„Zy)ÚDynamicComparisonRunEvaluatorz4Compare predictions (as traces) from 2 or more runs.Nc                ó   ‡— t        |«      \  }Š|rt        |«      \  }Šd	ˆfd„} t        |«      | «       ddlm} |�*|j	                  ||¬«      | _        t        |dd«      | _        t        j                  |«      r8|�t        d«      ‚|j	                  ||¬«      | _        t        |dd«      | _        y|j	                  t        t        t        t           t        t            gt"        f   |«      |¬«      | _        t        |dd«      | _        y)
züInitialize the `DynamicRunEvaluator` with a given function.

        Args:
            func (Callable): A function that takes a `Run` and an optional `Example` as
            arguments, and returns an `EvaluationResult` or `EvaluationResults`.
        c                óf   •— ‰€| S  ‰| j                  d«      | j                  d«      «      \  }}}|S )NÚrunsrU   ro   rq   s      €r)   rv   z>DynamicComparisonRunEvaluator.__init__.<locals>.process_inputs»  s>   ø€ ØÐ%Ø�Ù$2Ø—
‘
˜6Ó" F§J¡J¨yÓ$9ó%Ñ!ˆQ��=ð !Ð r(   r   r   Nrw   r"   rl   rx   ry   )Ú$_normalize_comparison_evaluator_funcr   r{   r   r|   r}   r~   r   r€   r�   r‚   r   r	   r   r   r   r   Ú_COMPARISON_OUTPUTr„   r…   s        @r)   r†   z&DynamicComparisonRunEvaluator.__init__£  s(  ø€ ô( "FÀdÓ!KÑˆˆ~ÙÜ&JÈ5Ó&QÑ#ˆU�Nõ	!ð 	Œˆd‹�DÔÝ)àÐØ$×5Ñ5Ø nð 6ó ˆDŒJô ! ¨
Ð4IÓJˆDŒJÜ×&Ñ& tÔ,ØÐ Üð3óð ð
 %×5Ñ5Ø ^ð 6ó ˆDŒJô !  zÐ3HÓIˆD�Jà#×4Ñ4ÜÜÜ!¤#™¬´Ñ(9Ð:Ü*ð,ñð óð  .ð 5ó 	ˆDŒIô !  zÐ3HÓIˆD�Jr(   c                ó   — t        | d«      S r�   rž   rI   s    r)   r    z&DynamicComparisonRunEvaluator.is_asyncã  r¡   r(   c                óX  — t        | d«      sPt        j                  «       }|j                  «       rt	        d«      ‚|j                  | j                  ||«      «      S t        j                  «       }| j                  |«      }| j                  ||||dœ¬«      }| j                  |||«      S )z¯Compare runs to score preferences.

        Args:
            runs: A list of runs to compare.
            example: An optional example to be used in the evaluation.

        r„   r£   ©r§   Útagsr¨   )rŸ   r_   rª   r«   r¬   r­   Úacompare_runsr®   r¯   Ú	_get_tagsr„   Ú_format_results)rJ   rÒ   rU   r±   r=   rØ   rŒ   s          r)   Úcompare_runsz*DynamicComparisonRunEvaluator.compare_runsì  s³   € ô �t˜VÔ$Ü"×1Ñ1Ó3ˆLØ×&Ñ&Ô(Ü"ðRóð ð
 $×6Ñ6Ø×&Ñ& t¨WÓ5óð ô Ÿ
™
›ˆØ�~‰~˜dÓ#ˆà—‘ØØØ'4¸dÑCð ó 
ˆð
 ×#Ñ# F¨M¸4Ó@Ð@r(   c              ƒ  óø   K  — t        | d«      s| j                  ||«      S t        j                  «       }| j	                  |«      }| j                  ||||dœ¬«      ƒ d{  –—† }| j                  |||«      S 7 Œ­w)a¶  Evaluate a run asynchronously using the wrapped async function.

        This method directly invokes the wrapped async function with the
            provided arguments.

        Args:
            runs (Run): The runs to be evaluated.
            example (Optional[Example]): An optional example to be used
                in the evaluation.

        Returns:
            ComparisonEvaluationResult: The result of the evaluation.
        r}   r×   r¨   N)rŸ   rÜ   r®   r¯   rÚ   r}   rÛ   )rJ   rÒ   rU   r=   rØ   rŒ   s         r)   rÙ   z+DynamicComparisonRunEvaluator.acompare_runs  s€   è ø€ ô  �t˜WÔ%Ø×$Ñ$ T¨7Ó3Ð3ÜŸ
™
›ˆØ�~‰~˜dÓ#ˆà—z‘zØØØ'4¸dÑCð "ó 
÷ 
ˆð
 ×#Ñ# F¨M¸4Ó@Ð@ð
ús   ‚AA:Á A8Á!A:c                ó&   — | j                  ||«      S )a¹  Make the evaluator callable, allowing it to be used like a function.

        This method enables the evaluator instance to be called directly, forwarding the
        call to `evaluate_run`.

        Args:
            run (Run): The run to be evaluated.
            example (Optional[Example]): An optional example to be used in the evaluation.

        Returns:
            ComparisonEvaluationResult: The result of the evaluation.
        )rÜ   )rJ   rÒ   rU   s      r)   r¶   z&DynamicComparisonRunEvaluator.__call__'  s   € ð × Ñ   wÓ/Ð/r(   c                ó"   — d| j                   › d�S )r¸   z<DynamicComparisonRunEvaluator r¹   rº   rI   s    r)   r»   z&DynamicComparisonRunEvaluator.__repr__8  s   € à0°·±°¸AÐ>Ð>r(   c                óÐ   — g }| D ]^  }|j                  dt        |j                  «      z   «       t        |dd«      sŒ8|j                  dt        |j                  «      z   «       Œ` |S )zExtract tags from runs.zrun:r¤   Nzexperiment:)Úappendr   r°   r~   r¤   )rÒ   rØ   rT   s      r)   rÚ   z'DynamicComparisonRunEvaluator._get_tags<  s`   € ð ˆØò 	AˆCØ�K‰K˜¤ S§V¡V£Ñ,Ô-Ü�s˜L¨$Õ/Ø—‘˜M¬C°·±Ó,?Ñ?Õ@ð	Að ˆr(   c                ó²  — t        |t        «      r|j                  s||_        |S t        |t        «      r9t	        ||«      D ��ci c]  \  }}|j
                  |“Œ c}}| j                  |dœ}n4t        |t        «      rd|vr | j                  |d<   nd|›�}t        |«      ‚	 t        di d|i|¥¤ŽS c c}}w # t        $ r}t        d|› �«      |‚d }~ww xY w)N)rj   r3   r=   r3   zXExpected 'dict', 'list' or 'ComparisonEvaluationResult' result object. Received: result=r=   zˆExpected a dictionary with a 'key' and dictionary of scores mappingrun IDs to numeric scores, or ComparisonEvaluationResult object, got r'   )
rD   ri   r=   ÚlistÚzipr°   r   r9   r�   r   )rJ   rŒ   r=   rÒ   rT   r4   Úmsgr’   s           r)   rÛ   z-DynamicComparisonRunEvaluator._format_resultsG  sÿ   € ô �fÔ8Ô9Ø×'Ò'Ø'4�Ô$ØˆMÜ˜¤Ô%ä;>¸tÀVÓ;L×M©Z¨S°%˜3Ÿ6™6 5™=ÓMØ—z‘zØ!.ñ‰Fô
 ˜¤Ô%Ø˜FÑ"Ø $§
¡
��u’ð-Ø%+ Ið/ð ô ˜S“/Ð!ð		Ü-ñ Ø" MÐ<°VÐ<ñð ùó Nøô" ò 	Üðà�xð!óð ð	ûð	ús   ÁB3Â$B9 Â9	CÃCÃCr‰   )r„   úfCallable[[Sequence[Run], Optional[Example]], Union[_COMPARISON_OUTPUT, Awaitable[_COMPARISON_OUTPUT]]]r}   zUOptional[Callable[[Sequence[Run], Optional[Example]], Awaitable[_COMPARISON_OUTPUT]]]r¿   )rÒ   úSequence[Run]rU   re   rL   ri   rÀ   )rÒ   rç   rL   z	list[str])rŒ   z-Union[dict, list, ComparisonEvaluationResult]r=   r½   rÒ   rç   rL   ri   )r"   r#   r$   r%   r†   rÁ   r    rÜ   rÙ   r¶   r»   ÚstaticmethodrÚ   rÛ   r'   r(   r)   rÏ   rÏ      sô   „ Ù>ð ð>Jð
ð>Jð
ó>Jð@ ò&ó ð&ð AEðAØ!ðAØ,=ðAà	#óAð@ AEðAØ!ðAØ,=ðAà	#óAð: AEð0Ø!ð0Ø,=ð0à	#ó0ó"?ð òó ðð"à=ð"ð !ð"ð ð	"ð
 
$ô"r(   rÏ   c                ó   — t        | «      S )z.Create a comaprison evaluator from a function.)rÏ   rÄ   s    r)   Úcomparison_evaluatorrê   l  s   € ô )¨Ó.Ð.r(   c                ó–  ‡ ‡‡	‡
‡— dŠt        j                  ‰ «      Š
‰
j                  j                  «       D ��cg c]!  \  }}|j                  |j
                  k7  sŒ |‘Œ# }}}‰
j                  j                  «       D ��cg c]-  \  }}|j                  t         j                  j                  ur|‘Œ/ c}}Š	|r6t        ˆ	ˆfd„|D «       «      s2t        |D �cg c]	  }|‰	vsŒ|‘Œ c}«      dk7  rd‰› d�}t        |«      ‚t        ˆ	ˆfd„|D «       «      r|ddgk(  r‰ d fS t        j                  ‰ «      rF	 	 	 	 	 	 dˆ
fd	„Š	 	 	 	 	 	 dˆˆ fd
„}t        ‰ d«      rt        ‰ d«      n|j                  |_        |‰fS 	 	 	 	 	 	 dˆ
fd„Šdˆˆ fd„}t        ‰ d«      rt        ‰ d«      n|j                  |_        |‰fS c c}}w c c}}w c c}w )N)rT   rU   rr   ÚoutputsÚreference_outputsÚattachmentsc              3  ó2   •K  — | ]  }|‰v xs |‰v –— Œ y ­wr‰   r'   ©rŠ   ÚpnameÚargs_with_defaultsÚsupported_argss     €€r)   r�   z,_normalize_evaluator_func.<locals>.<genexpr>�  ó)   øè ø€ ò 
ØGLˆE�^Ð#ÒB uÐ0BÐ'BÓBñ
ùó   ƒé   úUInvalid evaluator function. Must have at least one argument. Supported arguments are ú€. Please see https://docs.smith.langchain.com/evaluation/how_to_guides/evaluation/evaluate_llm_application#use-custom-evaluatorsc              3  ó2   •K  — | ]  }|‰v xs |‰v –— Œ y ­wr‰   r'   rð   s     €€r)   r�   z,_normalize_evaluator_func.<locals>.<genexpr>�  ó)   øè ø€ ò ØCHˆ�ÐÒ> 5Ð,>Ð#>Ó>ñùrõ   rT   rU   c                ó°  •— | ||r|j                   ni | j                  xs i |r|j                  xs i ni |r|j                  xs i ni dœ}i }g }i }‰j                  j	                  «       D ]e  \  }}||v sŒ|j
                  |j                  |j                  fv r|j                  ||   «       n||   ||<   |dv rt        ||   «      n||   ||<   Œg |||fS ©N)rT   rU   rr   rì   rî   rí   )rT   rU   ©
rr   rì   rî   Ú
parametersÚitemsÚkindÚPOSITIONAL_OR_KEYWORDÚPOSITIONAL_ONLYrá   rÍ   ©	rT   rU   Úarg_mapÚkwargsÚargsrt   Ú
param_nameÚparamÚsigs	           €r)   Ú_prepare_inputsz2_normalize_evaluator_func.<locals>._prepare_inputs§  ó  ø€ ð Ø&Ù07˜gŸnšn¸RØ"Ÿ{™{Ò0¨bÙ@G 7×#6Ñ#6Ò#<¹"ÈRÙBI¨¯©Ò)>¹BÈrñ�ð �Ø�Ø "�Ø),¯©×)=Ñ)=Ó)?ò Ñ%�J à! WÒ,Ø Ÿ:™:Ø!×7Ñ7Ø!×1Ñ1ð*ñ ð !ŸK™K¨°
Ñ(;Õ<à18¸Ñ1D˜F :Ñ.ð  *Ð-?Ñ?ô *¨'°*Ñ*=Ô>à!(¨Ñ!4ð & jÒ1ðð ˜V ]Ð2Ð2r(   c              “  óJ   •K  —  ‰| |«      \  }}} ‰|i |¤Žƒ d {  –—† S 7 Œ­wr‰   r'   ©rT   rU   r  r  rs   r
  r„   s        €€r)   Úawrapperz+_normalize_evaluator_func.<locals>.awrapperÆ  s2   øè ø€ ñ %4°C¸Ó$AÑ!��v˜qÙ! 4Ð2¨6Ñ2×2Ð2Ð2úó   ƒ#œ!�#r"   c                ó°  •— | ||r|j                   ni | j                  xs i |r|j                  xs i ni |r|j                  xs i ni dœ}i }g }i }‰j                  j	                  «       D ]e  \  }}||v sŒ|j
                  |j                  |j                  fv r|j                  ||   «       n||   ||<   |dv rt        ||   «      n||   ||<   Œg |||fS rü   rý   r  s	           €r)   r
  z2_normalize_evaluator_func.<locals>._prepare_inputsÕ  r  r(   c                ó.   •—  ‰| |«      \  }}} ‰|i |¤ŽS r‰   r'   r  s        €€r)   Úwrapperz*_normalize_evaluator_func.<locals>.wrapperô  s&   ø€ Ù$3°C¸Ó$AÑ!��v˜qÙ˜TÐ, VÑ,Ð,r(   )rT   r   rU   re   rL   útuple[list, dict, dict])rT   r   rU   re   rL   rƒ   ©r€   Ú	signaturerþ   rÿ   r   ÚVAR_KEYWORDÚdefaultÚ	ParameterÚemptyr�   rÉ   r�   r�   rŸ   r~   r"   ©r„   rñ   ÚpÚall_argsÚarå   r  r  r
  rò   r	  ró   s   `       @@@@r)   rz   rz   v  s  ü€ ð€Nô ×
Ñ
˜DÓ
!€CØ&)§n¡n×&:Ñ&:Ó&<×X™(˜% ÀÇÁÈ!Ï-É-Ó@W’ÐX€HÑXð Ÿ™×,Ñ,Ó.÷áˆE�1Ø�9‰9œG×-Ñ-×3Ñ3Ñ3ò 	óÐñ
 Üô 
ØPXô
ô 
ô ˜HÖD�q¨Ð1CÒ(C’ÒDÓEÈÒJð1Ø1?Ð0@ð AFðGð 	ô ˜‹oÐô ô ØLTôô à	ØØðò 
ð �TˆzÐä×&Ñ& tÔ,ð3Øð3Ø#4ð3à(õ3ð>3Øð3Ø#4ð3à!ö3ô ˜4 Ô,ô ˜˜jÔ)à×&Ñ&ð Ôð
 ˜oÐ.Ð.ð3Øð3Ø#4ð3à(õ3ö>-ô ˜4 Ô,ô ˜˜jÔ)à×%Ñ%ð Ôð
 ˜_Ð-Ð-ùók Yùóùò Es   º!F:ÁF:Â 2G Ã	GÃ Gc                ó¢  ‡ ‡‡	‡
‡— dŠt        j                  ‰ «      Š
‰
j                  j                  «       D ��cg c]!  \  }}|j                  |j
                  k7  sŒ |‘Œ# }}}‰
j                  j                  «       D ��cg c]-  \  }}|j                  t         j                  j                  ur|‘Œ/ c}}Š	|r6t        ˆ	ˆfd„|D «       «      s2t        |D �cg c]	  }|‰	vsŒ|‘Œ c}«      dk7  rd‰› d�}t        |«      ‚t        ˆ	ˆfd„|D «       «      r|ddgk(  r‰ d fS t        j                  ‰ «      rF	 	 	 	 	 	 dˆ
fd	„Š	 	 	 	 	 	 dˆˆ fd
„}t        ‰ d«      rt        ‰ d«      n|j                  |_        |‰fS 	 	 	 	 	 	 dˆ
fd„Š	 	 	 	 	 	 dˆˆ fd„}t        ‰ d«      rt        ‰ d«      n|j                  |_        |‰fS c c}}w c c}}w c c}w )N©rÒ   rU   rr   rì   rí   c              3  ó2   •K  — | ]  }|‰v xs |‰v –— Œ y ­wr‰   r'   rð   s     €€r)   r�   z7_normalize_comparison_evaluator_func.<locals>.<genexpr>  rô   rõ   rö   r÷   rø   c              3  ó2   •K  — | ]  }|‰v xs |‰v –— Œ y ­wr‰   r'   rð   s     €€r)   r�   z7_normalize_comparison_evaluator_func.<locals>.<genexpr>   rú   rõ   rÒ   rU   c                ó°  •— | ||r|j                   ni | D �cg c]  }|j                  xs i ‘Œ c}|r|j                  xs i ni dœ}i }g }i }‰	j                  j                  «       D ]e  \  }}||v sŒ|j                  |j
                  |j                  fv r|j                  ||   «       n||   ||<   |dv rt        ||   «      n||   ||<   Œg |||fS c c}w ©Nr  )rÒ   rU   ©	rr   rì   rþ   rÿ   r   r  r  rá   rÍ   ©
rÒ   rU   rT   r  r  r  rt   r  r  r	  s
            €r)   r
  z=_normalize_comparison_evaluator_func.<locals>._prepare_inputs*  ó  ø€ ð !Ø&Ù07˜gŸnšn¸RØ=AÖB°c §¡Ò 1¨rÑ 1ÒBÙBI¨¯©Ò)>¹BÈrñ�ð �Ø�Ø "�Ø),¯©×)=Ñ)=Ó)?ò Ñ%�J à! WÒ,Ø Ÿ:™:Ø!×7Ñ7Ø!×1Ñ1ð*ñ ð !ŸK™K¨°
Ñ(;Õ<à18¸Ñ1D˜F :Ñ.ð  *Ð-@Ñ@ô *¨'°*Ñ*=Ô>à!(¨Ñ!4ð & jÒ1ðð ˜V ]Ð2Ð2ùò+  Có   —C
c              “  óJ   •K  —  ‰| |«      \  }}} ‰|i |¤Žƒ d {  –—† S 7 Œ­wr‰   r'   ©rÒ   rU   r  r  rs   r
  r„   s        €€r)   r  z6_normalize_comparison_evaluator_func.<locals>.awrapperH  s2   øè ø€ ñ %4°D¸'Ó$BÑ!��v˜qÙ! 4Ð2¨6Ñ2×2Ð2Ð2úr  r"   c                ó°  •— | ||r|j                   ni | D �cg c]  }|j                  xs i ‘Œ c}|r|j                  xs i ni dœ}i }g }i }‰	j                  j                  «       D ]e  \  }}||v sŒ|j                  |j
                  |j                  fv r|j                  ||   «       n||   ||<   |dv rt        ||   «      n||   ||<   Œg |||fS c c}w r#  r$  r%  s
            €r)   r
  z=_normalize_comparison_evaluator_func.<locals>._prepare_inputsW  r&  r'  c                ó.   •—  ‰| |«      \  }}} ‰|i |¤ŽS r‰   r'   r)  s        €€r)   r  z5_normalize_comparison_evaluator_func.<locals>.wrapperu  s(   ø€ ñ %4°D¸'Ó$BÑ!��v˜qÙ˜TÐ, VÑ,Ð,r(   )rÒ   rç   rU   re   rL   r  )rÒ   rç   rU   re   rL   rÔ   r  r  s   `       @@@@r)   rÓ   rÓ      s-  ü€ ð S€NÜ
×
Ñ
˜DÓ
!€CØ&)§n¡n×&:Ñ&:Ó&<×X™(˜% ÀÇÁÈ!Ï-É-Ó@W’ÐX€HÑXð Ÿ™×,Ñ,Ó.÷áˆE�1Ø�9‰9œG×-Ñ-×3Ñ3Ñ3ò 	óÐñ
 Üô 
ØPXô
ô 
ô ˜HÖD�q¨Ð1CÒ(C’ÒDÓEÈÒJð1Ø1?Ð0@ð AFðGð 	ô ˜‹oÐô ô ØLTôô à	ØØðò 
ð �TˆzÐä×&Ñ& tÔ,ð3Ø#ð3Ø.?ð3à(õ3ð<3Ø#ð3Ø.?ð3à#ö3ô ˜4 Ô,ô ˜˜jÔ)à×&Ñ&ð Ôð
 ˜_Ð,Ð,ð3Ø#ð3Ø.?ð3à(õ3ð<-Ø#ð-Ø.?ð-à#ö-ô ˜4 Ô,ô ˜˜jÔ)à×%Ñ%ð Ôð
 ˜OÐ+Ð+ùók Yùóùò Es   º!G ÁG Â 2GÃ	GÃ Gc                ó@  — t        | t        t        t        f«      rd| i} | S | st	        d| › �«      ‚t        | t
        «      r't        d„ | D «       «      st	        d| › d�«      ‚d| i} | S t        | t        «      rd| i} | S t        | t        «      r	 | S t	        d| › �«      ‚)	Nr4   zdExpected a non-empty dict, str, bool, int, float, list, EvaluationResult, or EvaluationResults. Got c              3  ó<   K  — | ]  }t        |t        «      –— Œ y ­wr‰   )rD   r9   )rŠ   Úxs     r)   r�   z+_format_evaluator_result.<locals>.<genexpr>Ž  s   è ø€ Ò7¨1”:˜a¤×&Ñ7ùs   ‚z8Expected a list of dicts or EvaluationResults. Received ú.rP   r   zZExpected a dict, str, bool, int, float, list, EvaluationResult, or EvaluationResults. Got )	rD   r¾   rF   rE   r�   rã   r�   r   r9   )rŒ   s    r)   rš   rš   ƒ  sà   € ô �&œ4¤¬Ð,Ô-Ø˜6Ð"ˆð* €Mñ) Üð;Ø;A¸(ðDó
ð 	
ô 
�FœDÔ	!ÜÑ7°Ô7Ô7ÜØJÈ6È(ÐRSÐTóð ð ˜VÐ$ˆð €Mô 
�FœCÔ	 Ø˜6Ð"ˆð €Mô 
�FœDÔ	!Øð €Mô	 ð&Ø&, Xð/ó
ð 	
r(   c                ó¸  ‡ ‡‡‡	— dŠ	t        j                  ‰ «      Š‰j                  j                  «       D ��cg c]  \  }}|‘Œ	 }}}‰j                  j                  «       D ��cg c]-  \  }}|j                  t         j
                  j                  ur|‘Œ/ c}}Š|r6t        ˆˆ	fd„|D «       «      s=t        |D �cg c]	  }|‰vsŒ|‘Œ c}«      dk7  rd‰	› d�}|r	|d|› d�z  }t        |«      ‚t        ˆ	fd„|D «       «      r|dd	gk(  r‰ S 	 	 	 	 	 	 dˆ ˆfd
„}t        ‰ d«      rt        ‰ d«      |_        |S |j                  |_        |S c c}}w c c}}w c c}w )N©rÒ   Úexamplesrr   rì   rí   c              3  ó2   •K  — | ]  }|‰v xs |‰v –— Œ y ­wr‰   r'   rð   s     €€r)   r�   z/_normalize_summary_evaluator.<locals>.<genexpr>µ  rô   rõ   rö   r÷   r/  z Received arguments c              3  ó&   •K  — | ]  }|‰v –— Œ
 y ­wr‰   r'   )rŠ   rñ   ró   s     €r)   r�   z/_normalize_summary_evaluator.<locals>.<genexpr>Ã  s   øè ø€ Ò?¨U�˜.Ô(Ñ?ùrŽ   rÒ   r2  c           	     óô  •— | ||D �cg c]  }|j                   ‘Œ c}| D �cg c]  }|j                  xs i ‘Œ c}|D �cg c]  }|j                  xs i ‘Œ c}dœ}i }g }‰j                  j                  «       D ]K  \  }}||v sŒ|j                  |j
                  |j                  fv r|j                  ||   «       ŒD||   ||<   ŒM  ‰
|i |¤Ž}	t        |	t        «      r|	S t        |	«      S c c}w c c}w c c}w )Nr1  )rr   rì   rþ   rÿ   r   r  r  rá   rD   r2   rš   )rÒ   r2  rU   rT   r  r  r  r  r  rŒ   r„   r	  s             €€r)   r  z-_normalize_summary_evaluator.<locals>.wrapperÊ  s  ø€ ð Ø$Ø9AÖB¨g˜7Ÿ>›>ÒBØ9=Ö>°#˜CŸK™KÒ-¨2Ñ-Ò>ØKSÖ%TÀ g§o¡oÒ&;¸Ñ&;Ò%TñˆGð ˆFØˆDØ%(§^¡^×%9Ñ%9Ó%;ò 	AÑ!�
˜Eà Ò(Ø—z‘zØ×3Ñ3Ø×-Ñ-ð&ñ ð Ÿ™ G¨JÑ$7Õ8à-4°ZÑ-@˜˜zÒ*ð	Añ ˜4Ð* 6Ñ*ˆFÜ˜&Ô"2Ô3Ø�Ü+¨FÓ3Ð3ùò) CùÚ>ùÚ%Ts   ˆC+¡C0
¾C5r"   )rÒ   zSequence[schemas.Run]r2  zSequence[schemas.Example]rL   rg   )r€   r  rþ   rÿ   r  r  r  r�   rÉ   r�   rŸ   r~   r"   )
r„   rñ   r  r  r  rå   r  rò   r	  ró   s
   `      @@@r)   Ú_normalize_summary_evaluatorr6  «  s�  û€ ØS€NÜ
×
Ñ
˜DÓ
!€CØ&)§n¡n×&:Ñ&:Ó&<×=™(˜% ’Ð=€HÑ=ð Ÿ™×,Ñ,Ó.÷áˆE�1Ø�9‰9œG×-Ñ-×3Ñ3Ñ3ò 	óÐñ
 Üô 
ØPXô
ô 
ô ˜HÖD�q¨Ð1CÒ(C’ÒDÓEÈÒJð1Ø1?Ð0@ÀðCð 	ñ ØÐ)¨(¨°1Ð5Ñ5ˆCÜ˜‹oÐô Ó?°hÔ?Ô?À8ØØðPò Dð ˆð	4Ø'ð	4Ø3Lð	4à7ö	4ô: *1°°zÔ)BŒG�D˜*Ó%ð 	Ôð ˆð IP×HXÑHXð 	Ôð ˆùów >ùóùò Es   ¹EÁ%2EÂ;	EÃE)r„   r¼   )rË   r   )r„   ræ   rL   rÏ   )r„   r	   rL   z¢tuple[Union[Callable[[Run, Optional[Example]], _RUNNABLE_OUTPUT], Callable[[Run, Optional[Example]], Awaitable[_RUNNABLE_OUTPUT]]], Optional[Callable[..., dict]]])r„   r	   rL   zºtuple[Union[Callable[[Sequence[Run], Optional[Example]], _COMPARISON_OUTPUT], Callable[[Sequence[Run], Optional[Example]], Awaitable[_COMPARISON_OUTPUT]]], Optional[Callable[..., dict]]])rŒ   z;Union[EvaluationResults, dict, str, int, bool, float, list]rL   zUnion[EvaluationResults, dict])r„   r	   rL   ÚSUMMARY_EVALUATOR_T)>r%   Ú
__future__r   r_   r€   Úloggingr®   Úabcr   Úcollections.abcr   r   Ú	functoolsr   Útypingr   r	   r
   r   r   r   Úpydanticr   r   r   r   r   Útyping_extensionsr   r{   r   rZ   r   Úlangsmith.schemasr   r   r   r   Ú	getLoggerr"   rG   r   r+   r2   rO   rR   r9   rƒ   ri   rÔ   rl   rÅ   rÊ   rÍ   rÏ   rê   rz   rÓ   rš   rã   r7  r6  r'   r(   r)   ú<module>rB     sê  ðÙ Eå "ã Û Û Û Ý ß /Ý ÷÷ ÷ TÕ SÝ 'å 'Ý ß BÓ Bà	ˆ×	Ñ	˜8Ó	$€ô'ˆyô 'ô6�Y eõ 6ô'�yô 'ôT"˜	¨õ "÷Yñ Yð8 Ð)Ð+<¸dÐBÑCÐ ô ô ð( Ð5°tÐ;Ñ<Ð ôe5˜,ô e5ðP	%ðó	%ð €ó÷Iñ IðX/ðð/ð
 #ó/ðG.Ø
ðG.ðóG.ðT@,Ø
ð@,ðó@,ðFØGðà#óð8 ØØ	�'—+‘+Ñ	 ¨¯©Ñ 9Ð:ØÐÐ 1Ð1Ñ2ð	4ñð Ø	ˆg�k‰kÑ	˜D §¡Ñ1Ð2ØÐÐ 1Ð1Ñ2ð	4ñð	ñ	Ð ô>r(   