
    rh                       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mZ d dl	m	Z	 d dl
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 d d
lmZmZmZ d dlZd dlZd dlmZmZ d dlmZ  d dlm!Z" d dl#m$Z$m%Z% d dl&m'Z' d dlm(Z( d dl)m*Z* d dlm+Z+ d dl,m-Z- d dl.m/Z/ d dl0m1Z1m2Z2 d dl3m4Z4 d dl5m6Z7 d dl8m9Z9m:Z: d dl;m<Z< d dl=m>Z>m?Z?m@Z@  e@       rd dlAmBZBmCZCmDZDmEZEmFZF  ej                  eH      ZIerd dlJmKZK d dlLmMZM d dlNmOZO  G d d e+      ZP e4d!       G d" d#eP             ZQg d$ZRg d%ZSd,d&ZTd-d'ZUd.d(ZVe G d) d*e             ZWd/d+ZXy)0    )annotationsN)Counterdefaultdict)copy)	dataclassfieldfields)Path)python_version)pformatindent)TYPE_CHECKINGAnyLiteral)CardData	ModelCard)dataset_info)
model_info)
EvalResulteval_results_to_model_index)	yaml_dump)nn)tqdm)TrainerCallback)CodeCarbonCallback)make_markdown_table)TrainerControlTrainerState)
deprecated__version__)RouterStaticEmbedding)$SentenceTransformerTrainingArguments)fullnameis_accelerate_availableis_datasets_available)DatasetDatasetDictIterableDatasetIterableDatasetDictValue)SentenceEvaluator)SentenceTransformer)SentenceTransformerTrainerc                       e Zd Zd fdZ	 	 	 	 	 	 	 	 	 	 	 	 ddZ	 	 	 	 	 	 	 	 	 	 ddZ	 	 	 	 	 	 	 	 	 	 	 	 d	dZ	 	 	 	 	 	 	 	 	 	 	 	 d
dZ xZS )$SentenceTransformerModelCardCallbackc                0    t         |           || _        y N)super__init__default_args_dict)selfr7   	__class__s     s/var/www/html/ai-insurance-compliance-backend/venv/lib/python3.12/site-packages/sentence_transformers/model_card.pyr6   z-SentenceTransformerModelCardCallback.__init__0   s    !2    c                Z   |j                   j                  d       |j                  j                  D cg c]  }t	        |t
              s| }}|r|d   |j                   _        |j                  rU|j                   j                  |j                  |j                   j                  |j                  d      |j                   _	        |j                  rU|j                   j                  |j                  |j                   j                  |j                  d      |j                   _        t        |j                        }	|j                   j                  |	       |j                   j                  s9|j                  xs |j                  x}
r|j                   j!                  |
       y y y c c}w )Ngenerated_from_trainerr   traineval)model_card_dataadd_tagscallback_handler	callbacks
isinstancer   code_carbon_callbacktrain_datasetextract_dataset_metadatatrain_datasetslosseval_dataseteval_datasets
get_losses
set_losseswidgetset_widget_examples)r8   argsstatecontrolmodeltrainerkwargscallbackrC   lossesdatasets              r:   on_init_endz0SentenceTransformerModelCardCallback.on_init_end4   sj    	&&'?@ &-%=%=%G%G
!:V^`rKsH
	 
 9B1E!!6   383H3H3a3a%%u'<'<'K'KW\\[b4E!!0 272G2G2`2`$$e&;&;&I&I7<<Y_3E!!/ GLL)((0 $$++G<P<P<iT[TiTi1i1i!!55g> 2j+-
s   F(
F(c                b   h d}|j                         }|j                         D 	ci c]  \  }}	||vs||	 c}	}|j                  _        |j                         D 	ci c],  \  }}	||vr#|| j                  v r|	| j                  |   k7  r||	. c}	}|j                  _        y c c}	}w c c}	}w )N>   do_evaldo_testdo_trainrun_name	hub_token	report_to
eval_delay
eval_steps
output_dir
save_stepslogging_dirlogging_stepssave_strategylogging_strategysave_total_limitgreater_is_betterpush_to_hub_tokensamples_per_labelshow_progress_barlogging_first_stepevaluation_strategymetric_for_best_model)to_dictitemsr@   all_hyperparametersr7   non_default_hyperparameters)
r8   rP   rQ   rR   rS   rU   ignore_keys	args_dictkeyvalues
             r:   on_train_beginz3SentenceTransformerModelCardCallback.on_train_beginY   s    
0 LLN	)2):5
%3c>TCJ5
1
 (oo/=
U+%#1G1G*GEUYUkUkloUpLp J=
95
=
s   B%B% 1B+c                8   |D ci c]K  }|j                  d      r8|j                  d      r'dj                  |j                  d      dd        ||   M }}t	        |      dk(  rd|v rd|d   i}|j
                  j                  rR|j
                  j                  d   d	   |j                  k(  r)|j
                  j                  d   j                  |       y |j
                  j                  j                  |j                  |j                  d
|       y c c}w )Neval__loss _   rI   Validation LossStepEpochr   )
startswithendswithjoinsplitlenr@   training_logsglobal_stepupdateappendepoch)	r8   rP   rQ   rR   rS   metricsrU   rw   	loss_dicts	            r:   on_evaluatez0SentenceTransformerModelCardCallback.on_evaluate   s    
~~g&3<<+@ HHSYYs^AB'('#,6
	 

 y>Q6Y#6*If,=>I!!//%%33B7?5CTCTT!!//3::9E!!//66"[[!--  
s   ADc                   dht        |      z  }|r|j                  j                  rW|j                  j                  d   d   |j                  k(  r.||j	                            |j                  j                  d   d<   nN|j                  j                  j                  |j                  |j                  ||j	                            d       |j                  j                  |D ]  }d|v sd|j                  _         y y )NrI   r   r   Training Loss)r   r   r   ndcgT)setr@   r   r   popr   r   ir_model)	r8   rP   rQ   rR   rS   logsrU   keysrw   s	            r:   on_logz+SentenceTransformerModelCardCallback.on_log   s     x#d)#%%33))77;FCuGXGXXKOPTPXPXPZK[%%33B7H%%33::!& % 1 1)-dhhj)9   ))1 :S=59E))2: 2r;   )r7   dict[str, Any]returnNone)rP   r%   rQ   r   rR   r   rS   r/   rT   r0   r   r   )
rP   r%   rQ   r   rR   r   rS   r/   r   r   )rP   r%   rQ   r   rR   r   rS   r/   r   dict[str, float]r   r   )rP   r%   rQ   r   rR   r   rS   r/   r   r   r   r   )	__name__
__module____qualname__r6   rY   ry   r   r   __classcell__r9   s   @r:   r2   r2   /   s    3#?2#? #?  	#?
 ##? ,#? 
#?J(
2(
 (
  	(

 #(
 
(
T2   	
 # " 
<:2: :  	:
 #: : 
:r;   r2   zThe `ModelCardCallback` has been renamed to `SentenceTransformerModelCardCallback` and the former is now deprecated. Please use `SentenceTransformerModelCardCallback` instead.c                       e Zd Z fdZ xZS )ModelCardCallbackc                $    t        |   |i | y r4   )r5   r6   )r8   rP   rU   r9   s      r:   r6   zModelCardCallback.__init__   s    $)&)r;   )r   r   r   r6   r   r   s   @r:   r   r      s    * *r;   r   )languagelicenselibrary_nametagsdatasetsr   pipeline_tagrN   model-indexco2_eq_emissions
base_model)rS   rT   eval_results_dictc                     t               t        t        j                  t        j                  d} t               rddlm} || d<   t               rddlm} || d<   ddl	m} || d<   | S )N)pythonsentence_transformerstransformerstorchr   r!   
accelerater   
tokenizers)
r   sentence_transformers_versionr   r"   r   r'   r   r(   r   r   )versionsaccelerate_versiondatasets_versiontokenizers_versions       r:   get_versionsr      s^     "!>$00""	H  @!3</</H\Or;   c                >    t        | t              rt        | d      S | S )N   )rD   floatroundrx   s    r:   
format_logr      s    %UALr;   c                   t        | t              rt        | j                               }n| g}d}|t	        |      k  r||   } t        | d      r)| j                  |vr|j                  | j                         t        | d      r)| j                  |vr|j                  | j                         t        | d      r)| j                  |vr|j                  | j                         |dz  }|t	        |      k  r|S )Nr   rI   document_regularizerquery_regularizerr   )
rD   dictlistvaluesr   hasattrrI   r   r   r   )rI   rW   loss_idxs      r:   rL   rL      s    $dkkm$ H
S[
 h4 TYYf%<MM$))$4/0T5N5NV\5\MM$3344,-$2H2HPV2VMM$001A S[
  Mr;   c                     e Zd ZU dZ ee      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<    ee      Zd
ed<   dZded<    ed       Zded<   dZded<    ed      Zded<    edd      Zded<    edd      Zded<    eed      Zded<    eed      Zded<    eed      Zd ed!<    eed      Zd"ed#<    eed      Zd
ed$<    edd      Zded%<    eed      Zd
ed&<    edd      Zd'ed(<    eed      Zd)ed*<    edd      Zd+ed,<    eedd-      Zd.ed/<    eddd0      Zd1ed2<    eddd0      Z ded3<    edd      Z!ded4<    ed5d      Z"d6ed7<    ed8d      Z#ded9<    ed:d      Z$ded;<    ee%d      Z&d)ed<<    e e'e(      jR                  d=z  dd0      Z*d>ed?<    eddd0      Z+d@edA<   d\dBZ,	 d]	 	 	 	 	 d^dCZ-d_dDZ.d`dEZ/dadFZ0	 db	 	 	 	 	 	 	 	 	 dcdGZ1dddHZ2dedfdIZ3dgdJZ4	 	 	 	 	 	 	 	 dhdKZ5	 	 	 	 	 	 	 	 	 	 didLZ6djdMZ7dkdNZ8dedldOZ9dmdPZ:dndQZ;dodRZ<d\dSZ=dpdTZ>dU Z?dpdVZ@dqdWZAdpdXZBd\dYZCdpdZZDdedrd[ZEy)s SentenceTransformerModelCardDataa	  A dataclass storing data used in the model card.

    Args:
        language (`Optional[Union[str, List[str]]]`): The model language, either a string or a list,
            e.g. "en" or ["en", "de", "nl"]
        license (`Optional[str]`): The license of the model, e.g. "apache-2.0", "mit",
            or "cc-by-nc-sa-4.0"
        model_name (`Optional[str]`): The pretty name of the model, e.g. "SentenceTransformer based on microsoft/mpnet-base".
        model_id (`Optional[str]`): The model ID when pushing the model to the Hub,
            e.g. "tomaarsen/sbert-mpnet-base-allnli".
        train_datasets (`List[Dict[str, str]]`): A list of the names and/or Hugging Face dataset IDs of the training datasets.
            e.g. [{"name": "SNLI", "id": "stanfordnlp/snli"}, {"name": "MultiNLI", "id": "nyu-mll/multi_nli"}, {"name": "STSB"}]
        eval_datasets (`List[Dict[str, str]]`): A list of the names and/or Hugging Face dataset IDs of the evaluation datasets.
            e.g. [{"name": "SNLI", "id": "stanfordnlp/snli"}, {"id": "mteb/stsbenchmark-sts"}]
        task_name (`str`): The human-readable task the model is trained on,
            e.g. "semantic textual similarity, semantic search, paraphrase mining, text classification, clustering, and more".
        tags (`Optional[List[str]]`): A list of tags for the model,
            e.g. ["sentence-transformers", "sentence-similarity", "feature-extraction"].
        local_files_only (`bool`): If True, don't attempt to find dataset or base model information on the Hub.
            Defaults to False.
        generate_widget_examples (`bool`): If True, generate widget examples from the evaluation or training dataset,
            and compute their similarities. Defaults to True.

    .. tip::

        Install `codecarbon <https://github.com/mlco2/codecarbon>`_ to automatically track carbon emission usage and
        include it in your model cards.

    Example::

        >>> model = SentenceTransformer(
        ...     "microsoft/mpnet-base",
        ...     model_card_data=SentenceTransformerModelCardData(
        ...         model_id="tomaarsen/sbert-mpnet-base-allnli",
        ...         train_datasets=[{"name": "SNLI", "id": "stanfordnlp/snli"}, {"name": "MultiNLI", "id": "nyu-mll/multi_nli"}],
        ...         eval_datasets=[{"name": "SNLI", "id": "stanfordnlp/snli"}, {"name": "MultiNLI", "id": "nyu-mll/multi_nli"}],
        ...         license="apache-2.0",
        ...         language="en",
        ...     ),
        ... )
    )default_factoryzstr | list[str] | Noner   N
str | Noner   
model_namemodel_idlist[dict[str, str]]rH   rK   zjsemantic textual similarity, semantic search, paraphrase mining, text classification, clustering, and morestr	task_namec                 
    g dS )N)sentence-transformerssentence-similarityzfeature-extractiondense r   r;   r:   <lambda>z)SentenceTransformerModelCardData.<lambda>@  s	     !
 r;   zlist[str] | Noner   Fboollocal_files_onlyT)defaultgenerate_widget_examples)r   initr   base_model_revision)r   r   r   rt   rs   z.dict[SentenceEvaluator, dict[str, Any]] | Noner   zlist[dict[str, float]]r   rN   predict_examplelabel_example_listzCodeCarbonCallback | NonerE   dict[str, str]	citationsz
int | Nonebest_model_step)r   r   repr	list[str]r   )r   r   r   zbool | Noner   similarities
first_saver   intwidget_stepr   r   r   r   versionzmodel_card_template.mdr
   template_pathzSentenceTransformer | NonerS   c                   | j                    }t        | j                   t              r| j                   g| _         | j                  | j                  |      | _        | j                  | j
                  |      | _        | j                  rJ| j                  j                  d      dk7  r+t        j                  d| j                  d       d | _        y y y )N)infer_languages/r   zThe provided z} model ID should include the organization or user, such as "tomaarsen/mpnet-base-nli-matryoshka". Setting `model_id` to None.)
r   rD   r   validate_datasetsrH   rK   r   countloggerwarning)r8   r   s     r:   __post_init__z.SentenceTransformerModelCardData.__post_init__h  s    "mm+dmmS)!]]ODM"44T5H5HZi4j!33D4F4FXg3h==T]]005:NN0 1^ ^ !DM ;=r;   c                j   g }|D ]  }d|vrd|v r|d   |d<   d|v r| j                   s	 t        |d         }|j                  rq|rod|j                  v ra|j                  j                  d      }|Dt	        |t
              r|g}|D ],  }|| j                  vs| j                  j                  |       . |j                  | j                  vr&| j                  j                  |j                         	 |j                  |        |S # t        $ r" t        j                  d|d   d       |d= Y ?w xY w)Nnameidr   zThe dataset `id` z5 does not exist on the Hub. Setting the `id` to None.)r   get_dataset_infocardDatagetrD   r   r   r   r   r   	Exceptionr   r   )r8   dataset_listr   output_dataset_listrX   infodataset_languager   s           r:   r   z2SentenceTransformerModelCardData.validate_datasetsx  sA    !# 	0GW$7?&-dmGFOwt'<'<6+GDM:D }}Z4===X+/==+<+<Z+H(+7)*:C@4D3E 0,< C#+4==#@$(MM$8$8$BC
 wwdmm3,,TWW5&&w/9	0: #") ! &NN+GDM+<<qr  	&s   D(D21D2c                   ddi}|D ]&  }	 |j                   ||j                  j                  <   ( t	        t
              }|j                         D ]  \  }}||   j                  |        dd}|j                         D ci c]  \  }} ||      | c}}| _        | j                  D ci c]  }|j                  j                  | c}D cg c]  }d| 	 c}       y # t        $ r Y w xY wc c}}w c c}w c c}w )NzSentence Transformersa  
@inproceedings{reimers-2019-sentence-bert,
    title = "Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks",
    author = "Reimers, Nils and Gurevych, Iryna",
    booktitle = "Proceedings of the 2019 Conference on Empirical Methods in Natural Language Processing",
    month = "11",
    year = "2019",
    publisher = "Association for Computational Linguistics",
    url = "https://arxiv.org/abs/1908.10084",
}
c                b    t        |       dkD  rdj                  | d d       dz   | d   z   S | d   S )Nr   , r   z and r   )r   r   )rW   s    r:   	join_listz>SentenceTransformerModelCardData.set_losses.<locals>.join_list  s:    6{Qyy-7&*DD!9r;   zloss:)rW   r   r   r   )
citationr9   r   r   r   r   rr   r   r   rA   )r8   rW   r   rI   inverted_citationsr  r  s          r:   rM   z+SentenceTransformerModelCardData.set_losses  s   # 
&
	  	D59]]	$..112	
 ).'oo/ 	6ND(x(//5	6	
 OaNfNfNhi:J(F)F+X5i]c2dUY4>>3J3JD3P2de$tf~ef   j2des#   #C$C3-C9C>$	C0/C0c                    || _         y r4   )r   )r8   steps     r:   set_best_model_stepz4SentenceTransformerModelCardData.set_best_model_step  s
    #r;   c                &   t        |t        t        f      ry t        |t              rt	        |      }g | _        t        t        j                  t        |j                               d            }d}t        |j                         ddd      D ]  \  }}t        ||   t              r||   j                  j                         D cg c]5  \  }}t        |t              st        |t              r|j                   d	v r|7 }}}||   j#                  |      }	t%        |	      }
|
d
k(  ri }t'        |	j)                  t        j*                  t-        |
      t/        ||
                        D ](  \  }}t1        d |j                         D              ||<   * t3        t5        |j                         d        \  }}|d | t        ||d  d d d         }}|D ]  }|	|   j                         D cg c]  \  }}|dk7  s| }}}t%        |      dk  r|r|j7                         }|	|   j                         D cg c]  \  }}|dk7  s| }}}t%        |      dk(  r|j9                  |       n|j;                  |d          t%        |      dk  r|rt%        |      dk  r|D cg c]0  }t        |t              rt        |j=                               d
   n|2 }}| j>                  dk(  rF| j
                  j;                  |d
   t        j*                  |dd  t%        |      dz
        d       n0| j
                  j;                  dt        j@                  |      i       |d d | _!          y c c}}w c c}}w c c}}w c c}w )N)rX      )k  zComputing widget examplesexampleF)descunitleave>   stringlarge_stringr   c              3  D   K   | ]  \  }}|d k7  st        |        yw)dataset_nameN)r   .0rw   rx   s      r:   	<genexpr>zGSentenceTransformerModelCardData.set_widget_examples.<locals>.<genexpr>  s!     "h*#uRUYgRg3u:"hs     c                    | d   S )Nr   r   )xs    r:   r   zFSentenceTransformerModelCardData.set_widget_examples.<locals>.<lambda>  s
    AaD r;   rw   r   r  r   r   r   )source_sentence	sentencestext)"rD   r+   r,   r)   r*   rN   r   randomchoicesr   r   r   rr   featuresr   r-   dtypeselect_columnsr   	enumerateselectsamplerangeminsumzipsortedr   extendr   r   r   choicer   )r8   rX   dataset_namesnum_samples_to_checkr  num_samplescolumnfeaturecolumnsstr_datasetdataset_sizelengthsidxr&  indicesr~   target_indicesbackup_indicesrw   sentencer  
backup_idxbackup_samples                          r:   rO   z4SentenceTransformerModelCardData.set_widget_examples  sy   g1DEFgw'!'2GtGLLN/Cq IJ#)-!(C)[`*
 @	5%L+ ',/A (/|'<'E'E'K'K'M#FGgt,w.7==D^3^ G  ",/>>wGK{+Lq G(""6==|1DL`bnHo#pq  iV  #"h"hhi
 fW]]_.IJJGQ-4\k-BDQ\Q]I^_cac_cIdDeNN & "5;Fs;K;Q;Q;Sm-#xWZ^lWlXm	m)nq(^!/!3!3!5J6A*6M6S6S6U%%2S(Y\`nYn%M % =)Q.!((7 "((q)9: )nq(^ y>A%
 lu_g*Xt2LD*+A.RZZ	  $$(==KK&&/8|)/y}IYZHZ)[ KK&&i0H'IJ'0!}$E"5=@	5. n%s$   :M<7N
N
N
N
/5Nc                $   ddl m} t        |      | j                  |<   t	        |d      r|j
                  x}rt        ||      r$|j                  D cg c]  }|j
                   }}nt        |t              r|g}|j                         D 	ci c]  \  }}	||v s||	 }
}}	| j                  r4| j                  d   d   |k(  r| j                  d   j                  |
       y | j                  j                  ||d|
       y y y c c}w c c}	}w )Nr   )SequentialEvaluatorprimary_metricr   r   r   ) sentence_transformers.evaluationr?  r   r   r   r@  rD   
evaluatorsr   rr   r   r   r   )r8   	evaluatorr   r   r  r?  primary_metricssub_evaluatorrw   rx   training_log_metricss              r:   set_evaluation_metricsz7SentenceTransformerModelCardData.set_evaluation_metrics  s    	I,0My) 9./	H`H`5`_5`)%89U^UiUi"jM=#?#?"j"jOS1#2"3AH#k:3TW[jTjCJ#k #k!!d&8&8&<V&D&L""2&--.BC""))!& $ / 6a/"j $ls   DDDc           	     (   d}t        t              }t               }|D ]m  }|d   }|d   }||vrC||   j                  dt	        |       d       t        ||         |k\  r|j                  |       t        |      | j                  k(  sm n |j                         D cg c]^  \  }}| j                  j                  r)t        |t              r| j                  j                  |   n|ddj                  |      z   dz   d	` c}}| _        y c c}}w )
N   r  labelz<li>z</li>z<ul> z</ul>)LabelExamples)r   r   r   r   r   r   addnum_classesrr   rS   labelsrD   r   r   r   )	r8   rX   num_examples_per_labelexamplesfinished_labelsr&  r  rJ  example_sets	            r:   set_label_examplesz3SentenceTransformerModelCardData.set_label_examples&  s
   !"t$% 	F&>D7OEO+&&d4j\'?@x'+AA#''.?#t'7'77	 '/nn&6#

 #{ 6:ZZ5F5F:V[]`Ka**51gl"RWW[%99GC#
 #
s   !A#Dc           	     4   t        |t              r=|j                         D cg c]  \  }}| j                  ||      D ]  }| ! c}}}S |rt	        j
                  d|      rd }|xs |j                  j                  t        |j                        d}|j                  j                  rR|j                  |j                  j                  v r0|j                  j                  |j                     j                  |d<   |j                  x}rt        |j                               d   }|j                  d      rUd|v rQ|t!        d      d  j                  d      }|d   |d<   |d	   j                  d
      d   x}rt!        |      dk(  r||d<   |gS c c}}}w )N)r  z_dataset_\d+)r   r   sizer   zhf://datasets/@r   r   r   (   revision)rD   r*   rr   infer_datasetsrematchr   r  r   r   splitsnum_examplesdownload_checksumsr   r   r   r   )	r8   rX   r  sub_datasetdataset_output	checksumssourcesource_partsrZ  s	            r:   r[  z/SentenceTransformerModelCardData.infer_datasets;  s   g{+ 29 -L+#22;\2Z    BHH_lCL !=GLL$=$='
 <<7==GLL4G4G#G%,\\%8%8%G%T%TN6"  22292)..*+A.F  !12sf}%c*:&;&=>DDSI'3At$ ,Q 5 5c :1 ==H=3x=TVCV19N:.7s   $Fc                    	  | j                   j                  |fi |S # t        $ r | j                   j                  |      cY S w xY wr4   )rS   tokenize	TypeError)r8   r  rU   s      r:   rg  z)SentenceTransformerModelCardData.tokenizeZ  sG    	-&4::&&t6v66 	-::&&t,,	-s    $AAc                
   |si S t        |t              rt        |      |d<   |j                  D cg c]  }d| d
 c}|d<   i |d<   t        |t              r'|j                  D ]l  }|dd |   }|d   }t        |t              r| j                  |d	
      }t        |t              r*d|v r&|d   j                  d      j                         }d}	n|D 
cg c]  }
t        |
       }}
d}	dt        t        |      d       d|	 t        t        |      t        |      z  d       d|	 t        t        |      d       d|	 dd|d   |<   t        |t        t        f      rTt        |      }dt        |      D ci c])  }|t        |      dkD  rdnd ||   t        |      z  d+ c}d|d   |<   Vt        |t               rVdt        t        |      d      t        t        |      t        |      z  d      t        t        |      d      dd|d   |<   t        |t"              rt        |D cg c]  }t        |       c}      }t        |      dk(  rddt        |       did|d   |<   dt        |       dt        |      t        |      z  ddt        |       ddd|d   |<   Yt%        |      i d|d   |<   o d:d}ddi|d   j'                         D ci c]  \  }}||d     c}}dd!i|d   j'                         D ci c]  \  }}| ||d          c}}g}t)        t+        |      j-                  d"d#      d$      |d%<   |dd& |d'<   t        |d'   t#        |d'         d            }g }t/        |      D ]  }i }|j                  D ]  }|d'   |   |   }t        |t"              r"t        |      d(kD  rt	        |dd(       dd) d*z   }t        |t              rt        |      dkD  r|dd d+z   }t	        |      j-                  d,d-      j-                  d.d/      }d| d||<    |j1                  |        t)        t+        |      j-                  d"d#      d$      |d0<   d1t%        |      i|d2<   t3        |d3      rk|j5                         }d;d4}|j'                         D ci c]  \  }}| ||       }}}	 t7        j8                  |d56      }t)        d7| d8d$      |d2   d9<   |S c c}w c c}
w c c}w c c}w c c}}w c c}}w c c}}w # t:        $ r t=        |d56      }Y Vw xY w)<a  
        Given a dataset, compute the following:
        * Dataset Size
        * Dataset Columns
        * Dataset Stats
            - Strings: min, mean, max word count/token length
            - Integers: Counter() instance
            - Floats: min, mean, max range
            - List: number of elements or min, mean, max number of elements
        * 3 Example samples
        * Loss function name
            - Loss function config
        rW  z<code>z</code>r3  statsNr  r   document)taskattention_maskr   )dimtokens
charactersr     r}   )r(  meanmax)r"  datar   ~rK  z.2%r   r   z	 elementsz.2frt  c                Z    ddj                  d | j                         D              z   dz   S )Nz<ul><li>z	</li><li>c              3  0   K   | ]  \  }}| d |   yw)z: Nr   r  s      r:   r  zaSentenceTransformerModelCardData.compute_dataset_metrics.<locals>.to_html_list.<locals>.<genexpr>  s      4f:3PUuBug5F4fs   z
</li></ul>)r   rr   )rt  s    r:   to_html_listzNSentenceTransformerModelCardData.compute_dataset_metrics.<locals>.to_html_list  s.    !K$4$44fY]YcYcYe4f$ffiuuur;   typer"  details-:|--|  stats_tablerI  rR  r  r   z, ...]z...
z<br>|z\|examples_tabler&   rI   get_config_dictc                4   t        | t        j                        s| S | j                  j                  }g }t        | d      rDt        | j                  d      r.|j                  t        | j                  j                               t        | d      r| j                  r|j                  d       t        | d      rE| j                         j                         D ]$  \  }}|j                  | dt        |              & |r| ddj                  |       d	S |S )
Nr@   r   trust_remote_codeztrust_remote_code=Truer  =(r  ))rD   r   Moduler9   r   r   r@   r   r   r   r  r  rr   r   )rx   module_namemodule_args_strrw   vals        r:   format_config_valuezUSentenceTransformerModelCardData.compute_dataset_metrics.<locals>.format_config_value  s    !%3 L#oo66"$ 5"34AVAVXd9e#**40E0E0P0P+QR5"565;R;R#**+CD5"34$)$9$9$;$A$A$C ES'..#aS	{/CDE #)]!DIIo,F+GqII""r;   r   r   ```json

```config_code)rt  r   )rx   r   r   r   )rD   r)   r   column_namesr   rg  r   r)  tolistr   r(  rs  r   r   r   r+  r   r   r&   rr   r   r   replacer'  r   r   r  jsondumpsrh  r   )r8   rX   r   rI   r1  
subsectionfirst	tokenizedr6  suffixr;  counterrw   lstrx  rx   stats_linesr0  examples_lines
sample_idxr3  configr  
str_configs                           r:   compute_dataset_metricsz8SentenceTransformerModelCardData.compute_dataset_metricsa  s   & Igw'#&w<L JQJ^J^"_VF87#;"_Y "Wgw'!.. 8[$Ud^F3
"1eS) $jz JI!)T27G97T"+,<"="A"Aa"A"H"O"O"Q!)AK"LX3x="L"L!-!)&+CL!&<%=Qvh#G',S\CL-H!'L&MQvh$W&+CL!&<%=Qvh#G!5L)&1  T{3%j1G!& (.g! #  3w<!+;C#DWS\TWXbTcEcdgDh!ii!5L)&1  u-!(#(Z!#<$)#j/C
O*KQ$O#(Z!#<!5L)&1  t,%:&FCs3x&FGG7|q(%+ &3u:,i(@%9W-f5 &,*-g,y'A+.w<#g,+Fs*K9(U*-g,y'A%9W-f5 ?GuoWY4ZL)&1q8[tv VelSZF[FaFaFcd
UU7^ 3deYuVbcjVkVqVqVs"t
U3U6](C#C"tuK +11D[1Q1Y1YZ_af1gim*nL''.r{L$l:6tL<T7UVW7XYZKN#K0 /
%22 
>F(4V<ZHE!%.3u:> #E"1Is 3h >!%-#e*t2C %etu 4J..tV<DDS%PE(.ugW&=GFO
> %%g./ .44G4W4_4_`egl4mos-tL)*  
V 4*+))+F#( IOW*#uc.u55WFW7!ZZq9
 399ZLPU9VX\2]L /u #` #M! 'G0  e"tb X  7$VA6
7s;   T
T.T;T
3T T$
T*T0 0U	U	c                   |r|rft        |t              rt        |      t        |      k7  st        |t              r/t        |      dk7  r!t        j                  d| d| d| d       g }|s| j                  |      }t        |t              ret        |j                         |j                         |      D cg c].  \  }}}| j                  ||t        |t              r||   n|      0 }}}}n| j                  ||d   |      g}|dk(  rt        |D cg c]  }|j                  dd       c}      }	|	r| j                  d	|	        | j                  Tt        |t              r!t!        d
 |j                         D              }
nt!        |j"                        }
ddh|
z  rd| _        | j%                  |      S c c}}}w c c}w )Nr   zThe number of `z?_datasets` in the model card data does not match the number of z1 datasets in the Trainer. Removing the provided `z$_datasets` from the model card data.r   r>   rW  zdataset_size:c              3  B   K   | ]  }|j                   D ]  }|   y wr4   )r  )r  ra  r1  s      r:   r  zLSentenceTransformerModelCardData.extract_dataset_metadata.<locals>.<genexpr>!  s.      '#.Q\QiQi'GM''s   queryquestionT)rD   r*   r   r)   r   r   r[  r*  r   r   r  r   r)  r   rA   r   r   r  r   )r8   rX   dataset_metadatarI   dataset_typer  dataset_valuer   metadatanum_training_samplesr  s              r:   rG   z9SentenceTransformerModelCardData.extract_dataset_metadata  s    G[1c:J6KsSZ|6[w0S9I5Ja5O%l^3rs  sA A..:^;_a $& ##'#6#6w#? ';/ FI(8:JF	$ 	$ Bm\ 00%$.8t.D\*$	$  	$ %)$@$@JZ[\J]_c$d#e  7"#&P`'aHVQ(?'a#b #.B-CDE}}$gt,#& '29..2B' $L $'w';';#<LZ(<7$(DM%%&677;	$ (bs   <3G Gc                   || _         | j                  y t        |j                         D cg c]  }|j                   c}v rd| _        y dD ]5  }||j
                  v st        |j
                  |         dkD  s.d| _         y  y c c}w )NT)r  rk  passagecorpusr   )rS   r   r#   childrenr9   promptsr   )r8   rS   moduleir_prompt_names       r:   register_modelz/SentenceTransformerModelCardData.register_model+  s    
==$U^^5EF6f&&FF DMH 	N.3u}}^7T3UXY3Y $		 Gs   Bc                    || _         y r4   )r   )r8   r   s     r:   set_model_idz-SentenceTransformerModelCardData.set_model_id:  s	     r;   c                    | j                   ry	 t        |      }|j                  | _        ||dk(  r|j
                  }|| _        y# t        $ r Y yw xY w)NFmainT)r   get_model_infor   r   r   shar   )r8   r   rZ  r   s       r:   set_base_modelz/SentenceTransformerModelCardData.set_base_model=  s_      	'1J %--x61!~~H#+   		s   A 	AAc                8    t        |t              r|g}|| _        y r4   )rD   r   r   )r8   r   s     r:   set_languagez-SentenceTransformerModelCardData.set_languageM  s    h$ zH r;   c                    || _         y r4   )r   )r8   r   s     r:   set_licensez,SentenceTransformerModelCardData.set_licenseR  s	    r;   c                    t        |t              r|g}|D ],  }|| j                  vs| j                  j                  |       . y r4   )rD   r   r   r   )r8   r   tags      r:   rA   z)SentenceTransformerModelCardData.add_tagsU  s@    dC 6D 	&C$))#		  %	&r;   c           
        | j                   j                  x}|j                  j                  }t	        |      }dj                  |j                  dd        g}|j                  j                  d      }|t        dt        |            D cg c].  }dj                  |d |       dz   dj                  ||d        z   0 c}z  }|D ]  }| j                  |      s y  y t        | j                   d   t              rC| j                   d   j                  r)| j                  | j                   d   j                         y y y c c}w )Nr   r~   r   r   )rS   transformers_modelr  _name_or_pathr
   r   partsr   r   r'  r   r  rD   r$   r   )r8   r  r   base_model_pathcandidate_model_idsr^  r7  r   s           r:   try_to_set_base_modelz6SentenceTransformerModelCardData.try_to_set_base_model\  s3   "&**"?"??L+22@@J":.O $'88O,A,A"#,F#G"H
 %))//4FQVWXZ]^dZeQf$JM&,sxxst/EE$  0 &&x0 

17zz!}''##DJJqM$<$<= ( 8$s   3E c                   g }i }g }| j                   j                         D ]^  \  }}t        |dd      t        |dd      }r{t        fd|j	                         D              rY|j                         D ci c]  \  }}|t              dz   d | }}}|r%|j                  dz         r|t              dz   d }d#d}	|j                         D ci c]  \  }}| |	|       }}}|j                         D 
cg c]2  \  }
}|
|k(  rd|
 dn|
|
|k(  rdt        |       dn
t        |      d	4 }}
}|j                  }t        |dd      }d
}t        |d      r:|j                         x}r(	 t        j                  |d      }t        d| dd      }|j!                  t#        |      ||||d       fd|j%                  |j                         D 
cg c]  \  }
} |      x}vt'        ||j)                         j+                  dd      |xs d|r"|j+                  dd      j+                  dd      nd|
j+                  dd      j-                         |
|       c}}
       |j/                  |       a g }|D ]  }|d   D ci c]  }|d   |d    }}t1        |      }|D ]  }t1        d |d   D              }|d   |d   k(  s$||k(  s*|d   |d   k7  s6|d   |d   k(  sB|d   D ]+  }d|v r|j3                  d      ||d   <   ||d      ||d   <   - t5        |d   t6              s	|d   g|d<   |d   j!                  |d            |j!                  |        |D ]/  }t9        |j3                  d            j+                  dd       |d!<   1 |t7        |j	                               t;        | j<                  |      d"S c c}}w c c}}w c c}}
w # t        $ r t        |      }Y rw xY wc c}}
w c c}w )$au  Format the evaluation metrics for the model card.

        The following keys will be returned:
        - eval_metrics: A list of dictionaries containing the class name, description, dataset name, and a markdown table
          This is used to display the evaluation metrics in the model card.
        - metrics: A list of all metric keys. This is used in the model card metadata.
        - model-index: A list of dictionaries containing the task name, task type, dataset type, dataset name, metric name,
          metric type, and metric value. This is used to display the evaluation metrics in the model card metadata.
        r   Nr@  c              3  F   K   | ]  }|j                  d z           yw)r~   N)r   )r  rw   r   s     r:   r  zGSentenceTransformerModelCardData.format_eval_metrics.<locals>.<genexpr>  s     Q3CNN4#:6Qs   !r   r~   c                b    	 t        | d      r| j                         S 	 | S # t        $ r Y | S w xY w)z^Try to convert a value from a Numpy or Torch scalar to pure Python, if not already pure Pythonr"  )r   itemr   r   s    r:   try_to_pure_pythonzPSentenceTransformerModelCardData.format_eval_metrics.<locals>.try_to_pure_python  sB    ug.$zz|+ /  ! s   ! 	..**)Metricr-   rK  r  r   r   r  r  r}  )
class_namedescriptionr  table_linesr  c                    	 t        |       S # t        $ r Y nw xY wt        | t              rd| v r | j	                         d         S y )Nr}   r   )r   r   rD   r   r   )metric_valuetry_to_floats    r:   r  zJSentenceTransformerModelCardData.format_eval_metrics.<locals>.try_to_float  sT     ..   lC0SL5H'(:(:(<Q(?@@s   
 	r}   -unknownUnknown)r   	task_typer  r  metric_namemetric_typer  r  r  r-   c              3  &   K   | ]	  }|d      yw)r  Nr   r  lines     r:   r  zGSentenceTransformerModelCardData.format_eval_metrics.<locals>.<genexpr>  s     1pT$x.1p   r  r  r  r{  r|  table)eval_metricsr   r   )rx   r   r   r   )r   rr   getattrallr   r   r   r   r  r   r  r  r  rh  r   r   r   r&   r,  r   lowerr  titler   r   r   rD   r   r   r   r   )r8   r  all_metricseval_resultsrC  r   r@  rw   rx   r  
metric_keyr  r  r  r  r  r  r  metric_value_floatgrouped_eval_metricseval_metricr  eval_metric_mappingeval_metric_metricsgrouped_eval_metricgrouped_eval_metric_metricsr   r  s                             @@r:   format_eval_metricsz4SentenceTransformerModelCardData.format_eval_metricsr  s    "&"8"8">">"@ L	(Iw9fd3D$Y0@$GNQ',,.QQIPY:33s4y1}/6YY!n&?&?s
&K%3CIMO%DN IPX*#us.u55XGX 18 -J 6@>5Q:,b1Wa!^3  "*\":!;2>#L1	K  $//K"9fd;LKy"34ID]D]D_:_&:_-!%F1!=J %yE%BDI"*9"5#.$0#.#.	  5<MMO 1
L.:<.HH*U "-"-"3"3"5"="=c3"G%1%>YYe\%9%9#s%C%K%KCQT%Ukt$.$6$6sC$@$F$F$H$.%7 w'YL	(^  "' 	9KMXYfMg"hT4>4=#@"h"h"%&9":'; 9#.11pM`anMo1p.p+-1D\1RR+/JJ#N37J>7ZZ#M26I-6XX !4M B `"d?HLQXHYD!4^!DE<OPTU]P^<_[89	` &&9.&I4P?RSa?b>c+N;'7>>{>?Z[%9( %++K8/	92 $8 	+>?R?V?VWd?e+f+n+nu,(	 1K,,./6tU
 	
U Z Y" ! -!$VJ-4& #is1   ;OO7O!5O'B
PP'O?>O?c                   g | j                   D ]-  }|j                         D ]  }|vsj                  |        / dfd}t        |      }| j                   D cg c]M  }|D ci c]?  }||d   | j                  k(  rd||v rt        ||         nd dn|j                  |d      A c}O }}}t        |      }|d|v dS c c}w c c}}w )Nc                    | dk(  ry| dk(  ry| dk(  ry| dk(  ry| j                  d	      ry
j                  |       dz   S )Nr   r   r   r   r   rq  r   rI  rI   r   r  )r   index)rw   eval_lines_keyss    r:   sort_metricszKSentenceTransformerModelCardData.format_training_logs.<locals>.sort_metrics  sS    g~f}o%''||F#"((-11r;   r  r   r  r  )
eval_linesexplain_bold_in_eval)rw   r   r   r   )r   r   r   r+  r   r   r   r   )	r8   linesrw   r  sorted_eval_lines_keysr  r   r  r  s	           @r:   format_training_logsz5SentenceTransformerModelCardData.format_training_logs  s   '' 	0Ezz| 0o-#**3/0	0	2 "(\!J **
  2	  <4#7#77 3$;*T#Y/CHKXXc3'(
 
 )7
$$(J$6
 	

s   "	C+AC	/C	Cc                   | j                   | j                  r
g d| _         n	g d| _         | j                  sy | j                  rs| j                  j	                  | j                   d   dd      }| j                  j                  | j                   dd  dd      }| j                  j                  ||      }nX| j                   d d | _         | j                  j                  | j                   dd      }| j                  j                  ||      }t        j                  j                  d	d
      5  dj                  d t        |j                               j                         D              | _        d d d        y # 1 sw Y   y xY w)N)z(Which planet is known as the Red Planet?zMVenus is often called Earth's twin because of its similar size and proximity.zOMars, known for its reddish appearance, is often referred to as the Red Planet.zGSaturn, famous for its rings, is sometimes mistaken for the Red Planet.)zThe weather is lovely today.zIt's so sunny outside!zHe drove to the stadium.r   TF)convert_to_tensorrm   r   rI  r   )	precisionsci_moder  c              3  &   K   | ]	  }d |   yw)z# Nr   r  s     r:   r  zESentenceTransformerModelCardData.run_usage_snippet.<locals>.<genexpr>:  s     )e$Btf+)er  )r   r   r   rS   encode_queryencode_document
similarityencoder   _tensor_strprintoptionsr   r   cpu
splitlinesr   )r8   query_embeddingsdocument_embeddingsr   
embeddingss        r:   run_usage_snippetz2SentenceTransformerModelCardData.run_usage_snippet  sb   '}}($($ ,,==#zz66$$Q'4SX  7   #'**"<"<$$QR(DTY #= # ../?ATUJ#'#7#7#;D **4+?+?SWkp*qJ..z:FJ++a%+H 	f $		)e#jnnFVBWBbBbBd)e eD	f 	f 	fs   1AE==Fc                f   | j                   j                  j                         }dt        |j                        dz  t        |j
                        dd|j                  dk(  |j                  |j                  t        |j                  dz  d      di}|j                  r|j                  |d   d	<   |S )
Nr   r  
codecarbonzfine-tuningYi  rI  )	emissionsenergy_consumedrd  training_typeon_cloud	cpu_modelram_total_size
hours_usedhardware_used)rE   tracker_prepare_emissions_datar   r  r  r  r  r  r   duration	gpu_model)r8   emissions_dataresultss      r:   get_codecarbon_dataz4SentenceTransformerModelCardData.get_codecarbon_data<  s    22::RRT">#;#;<tC#()G)G#H&!.*33s:+55"0"?"?#N$;$;d$BAF
!
 ##;I;S;SG&'8r;   c                   d}| j                   j                  r]dddddj                  | j                   j                  | j                   j                  j                  dd      j	                               }| j                   j                         | j                   j                         t        | j                         |dS )	NzCosine SimilarityzDot ProductzEuclidean DistancezManhattan Distance)cosinedot	euclidean	manhattanr~   r}   )model_max_lengthoutput_dimensionalitymodel_stringsimilarity_fn_name)rS   r$  r   r  r  get_max_seq_length get_sentence_embedding_dimensionr   )r8   r$  s     r:   get_model_specific_metadataz<SentenceTransformerModelCardData.get_model_specific_metadataO  s    0::((-$11	"
 c$**//1N1N1V1VWZ\_1`1f1f1hi  !%

 = = ?%)ZZ%P%P%R

O"4	
 	
r;   c                    | j                   r/| j                  j                  j                   d| j                    S | j                  j                  j                  S )Nz
 based on )r   rS   r9   r   )r8   s    r:   get_default_model_namez7SentenceTransformerModelCardData.get_default_model_name_  sF    ??jj**334Jt>OPP::''000r;   c                   | j                   r| j                  s	 | j                          | j                  s| j                         | _        	 | j                          t        |       D ci c]#  }|j                  t        | |j                        % }}| j                  r 	 |j                  | j                                | j                  r 	 |j                  | j!                                t#        | j                        dkD  |d<   | j$                  rU| j$                  j&                  r?| j$                  j&                  j(                  |j                  | j+                                |j                  | j-                                d| _         t.        D ]  }|j1                  |d         |S # t        $ r Y w xY w# t        $ r#}t        j                  d|        Y d }~d }~ww xY wc c}w # t        $ r}t        j                  d|        |d }~ww xY w# t        $ r#}t        j                  d|        Y d }~Wd }~ww xY w)Nz,Error while computing usage snippet output: z+Error while formatting evaluation metrics: z&Error while formatting training logs: d   hide_eval_linesF)r   r   r  r   r   r)  r	  r   r   r	   r   r  r   r   r  r   r  r   rE   r  _start_timer  r'  IGNORED_FIELDSr   )r8   excr   
super_dictrw   s        r:   rq   z(SentenceTransformerModelCardData.to_dicte  s   ??4??**,
 "99;DO	Q""$ JPPTVejj'$

";;V
V !!!!$":":"<= O!!$";";"=> ),D,>,>(?#(E
$% %%))11))11==Id6689 	$::<=! 	&CNN3%	&]    	QNNI#OPP	Q W  !LSERS	  O!GuMNNOs_   F, F< )(G+ G0 H ,	F98F9<	G(G##G(0	H9HH	I$IIc           	         t        | j                         j                         D ci c]  \  }}|t        v s|d g fvs|| c}}d|      j	                         S c c}}w )NF)	sort_keys
line_break)r   rq   rr   YAML_FIELDSstrip)r8   r3  rw   rx   s       r:   to_yamlz(SentenceTransformerModelCardData.to_yaml  s\    *.,,.*>*>*@sJCC;DV[`imoqhr[rS%Zs!
 %'		ss   A
A
A
)r   r   )T)r   list[dict[str, Any]]r   r   r   r7  )rW   list[nn.Module]r   r   )r  r   r   r   )rX   Dataset | DatasetDictr   r   )r   r   )
rC  r.   r   r   r   r   r  r   r   r   )rX   r)   r   r   r4   )rX   r9  r  r   r   r   )r  str | list[str]r   r   )rX   z Dataset | IterableDataset | Noner   r   rI   z'dict[str, nn.Module] | nn.Module | Noner   r   )
rX   r9  r  r7  rI   z nn.Module | dict[str, nn.Module]r  zLiteral['train', 'eval']r   r7  )rS   r/   r   r   )r   r   r   r   )r   r   rZ  r   r   r   )r   r:  r   r   )r   r   r   r   )r   r:  r   r   r   r   )r   z1dict[Literal['co2_eq_emissions'], dict[str, Any]])r   r   )Fr   r   r   __doc__r   r   r   __annotations__r   r   r   rH   rK   r   r   r   r   r   r   r   rt   rs   r   r   rN   r   r   rE   r   r   r   r   r   r   r   r   r   r   r   r
   __file__parentr   rS   r   r   rM   r	  rO   rG  rU  r[  rg  r  rG   r  r  r  r  r  rA   r  r  r  r	  r  r'  r)  rq   r6  r   r;   r:   r   r   	  s   (V (-T'BH$BGZ!J
!Hj+0+FN(F*/*EM'Et s  #
D
  #d"%*4%8d8 #4e<J
<&+Du&EE27SX2YY*/5*QQHM^binHoEo,1$U,SM)S#(E#JF J(-d(GO%G/4TPU/V,V6;Du6U3U %d GI~G"'5"AOZA5uMHiM!$UGHkG$TEJL*J T6J6Re4K4 &;%HL#H&=EJL#J#LuMG^MX(=(=@X(X_dkpqM4q ).dU(SE%S!" KO!#0!#CG!#	!#Fg>$L5^ bc*5CLO[^	6
* >-S1S %S 6	S
 
Sj38&38 /38 /	38
 /38 
38j! !
&>,
B$
L!fF&
 13jr;   r   c                    t        j                  | j                  | j                  j                  d      }|j                  S )Nu   🤗)	card_datar   hf_emoji)r   from_templater@   r   content)rS   
model_cards     r:   generate_model_cardrF    s:    ((''u7L7L7Z7ZekJ r;   r;  )rx   zfloat | int | strr   r   )rI   znn.Module | dict[nn.Module]r   r8  )rS   r/   r   r   )Y
__future__r   r  loggingr  r\  collectionsr   r   r   dataclassesr   r   r	   pathlibr
   platformr   pprintr   textwrapr   typingr   r   r   r   r   huggingface_hubr   r   r   r   r   r  huggingface_hub.repocard_datar   r   huggingface_hub.utilsr   r   tqdm.autonotebookr   r   transformers.integrationsr   transformers.modelcardr   transformers.trainer_callbackr   r   typing_extensionsr    r   r"   r   sentence_transformers.modelsr#   r$   #sentence_transformers.training_argsr%   sentence_transformers.utilr&   r'   r(   r   r)   r*   r+   r,   r-   	getLoggerr   r   2sentence_transformers.evaluation.SentenceEvaluatorr.   )sentence_transformers.SentenceTransformerr/   sentence_transformers.trainerr0   r2   r   r4  r.  r   r   rL   r   rF  r   r;   r:   <module>r_     s   "    	 ,  0 0  #   . .   / < 8 Q +  " ( 8 6 F ( N @ T _ _ZZ			8	$TMHO:? O:d  v*< **
 ;,( Ux U Upr;   