§
    $Âi7  ã                   ó  — d Z ddlZddlmZ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  ej        d¦  «        Zg d¢Z G d„ d¦  «        Zdedej        j        j        defd„Zdedefd„Z G d„ d¦  «        ZdS )z)[Experimental] Text Only Local Tokenizer.é    N)ÚAnyÚIterable)ÚOptionalÚUnion)Úsentencepiece_model_pb2é   )Ú_common)Ú_local_tokenizer_loader)Ú_transformers)Útypeszgoogle_genai.local_tokenizer)Ú_parse_hex_byteÚ_token_str_to_bytesÚLocalTokenizerÚ_TextsAccumulatorc                   óž  — e Zd ZdZdd„Zdee         fd„Zdeej	                 ddfd„Z
dej	        ddfd	„Zd
ej        ddfd„Zdej        dej        fd„Zdeej                 ddfd„Zdeej                 ddfd„Zdej        ddfd„Zdej        dej        fd„Zdej        dej        fd„Zdeeef         deeef         fd„Zdedefd„ZdS )r   aÀ  Accumulates countable texts from `Content` and `Tool` objects.

  This class is responsible for traversing complex `Content` and `Tool`
  objects and extracting all the text content that should be included when
  calculating token counts.

  A key feature of this class is its ability to detect unsupported fields in
  `Content` objects. If a user provides a `Content` object with fields that
  this local tokenizer doesn't recognize (e.g., new fields added in a future
  API update), this class will log a warning.

  The detection mechanism for `Content` objects works by recursively building
  a "counted" version of the input object. This "counted" object only
  contains the data that was successfully processed and added to the text
  list for tokenization. After traversing the input, the original `Content`
  object is compared to the "counted" object. If they don't match, it
  signifies the presence of unsupported fields, and a warning is logged.
  ÚreturnNc                 ó   — g | _         d S ©N©Ú_texts©Úselfs    úf/var/www/html/jarvis.com/web/backend/venv/lib/python3.11/site-packages/google/genai/local_tokenizer.pyÚ__init__z_TextsAccumulator.__init__;   s   € Ø€D„K€K€Kó    c                 ó   — | j         S r   r   r   s    r   Ú	get_textsz_TextsAccumulator.get_texts>   s
   € ØŒ;Ðr   Úcontentsc                 ó:   — |D ]}|                       |¦  «         Œd S r   )Úadd_content)r   r   Úcontents      r   Úadd_contentsz_TextsAccumulator.add_contentsA   s2   € Øð  ð  ˆØ
×Ò�wÑÔÐÐð ð  r   r!   c                 óä  — t          j        g |j        ¬¦  «        }|j        rü|j        D ]ô}|j        €J ‚t          j        ¦   «         }|j        €|j        �t          d¦  «        ‚|j        �|j        |_        |j	        �&|  
                    |j	        ¦  «         |j	        |_	        |j        �&|                      |j        ¦  «         |j        |_        |j        �+|j        |_        | j                             |j        ¦  «         |j                             |¦  «         Œõ|                     d¬¦  «        |                     d¬¦  «        k    r#t"                               d|› d|› d�¦  «         d S d S )N)ÚpartsÚrolez6LocalTokenizers do not support non-text content types.T)Úexclude_nonezHContent contains unsupported types for token counting. Supported fields z. Got ú.)r   ÚContentr%   r$   ÚPartÚ	file_dataÚinline_dataÚ
ValueErrorÚvideo_metadataÚfunction_callÚadd_function_callÚfunction_responseÚadd_function_responseÚtextr   ÚappendÚ
model_dumpÚloggerÚwarning)r   r!   Úcounted_contentÚpartÚcounted_parts        r   r    z_TextsAccumulator.add_contentE   s«  € Ý”m¨"°7´<Ð@Ñ@Ô@€OØ„}ð 3Ø”-ð 3ð 3ˆ$ØÔ$Ð0Ð0Ð0Ý”z‘|”|ˆØŒ>Ð%¨Ô)9Ð)EÝØFñô ð ð ÔÐ*Ø(,Ô(;ˆ,Ô
%ØÔÐ)Ø
×
 Ò
  Ô!3Ñ
4Ô
4Ð
4Ø'+Ô'9ˆ,Ô
$ØÔ!Ð-Ø
×
$Ò
$ TÔ%;Ñ
<Ô
<Ð
<Ø+/Ô+Aˆ,Ô
(ØŒ9Ð Ø"œiˆ,Ô
Ø
Œ+×
Ò
˜TœYÑ
'Ô
'Ð
'ØÔ×$Ò$ \Ñ2Ô2Ð2Ð2à×Ò tÐÑ,Ô,°×0JÒ0JØð 1Kñ 1ô 1ò ð õ ‡n‚nð7Ø$ð7ð 7Ø,3ð7ð 7ð 7ñô ð ð ð ðð r   r.   c                 óÚ   — |j         r| j                             |j         ¦  «         t          j        |j         ¬¦  «        }|j        r#|                      |j        ¦  «        }||_        dS dS )z‰Processes a function call and adds relevant text to the accumulator.

    Args:
        function_call: The function call to process.
    )ÚnameN)r;   r   r3   r   ÚFunctionCallÚargsÚ_dict_traverse)r   r.   Úcounted_function_callÚcounted_argss       r   r/   z#_TextsAccumulator.add_function_calld   sy   € ð Ôð -Ø
„k×Ò˜Ô+Ñ,Ô,Ð,Ý!Ô.°MÔ4FÐGÑGÔGÐØÔð 0Ø×(Ò(¨Ô);Ñ<Ô<€lØ#/ÐÔ Ð Ð ð0ð 0r   Útoolc                 óÌ   — t          j        g ¬¦  «        }|j        rG|j        D ]?}|                      |¦  «        }|j        €g |_        |j                             |¦  «         Œ@|S )N)Úfunction_declarations)r   ÚToolrC   Ú_function_declaration_traverser3   )r   rA   Úcounted_toolÚfunction_declarationÚcounted_function_declarations        r   Úadd_toolz_TextsAccumulator.add_toolq   s‚   € Ý”:°BÐ7Ñ7Ô7€LØÔ!ð PØ"&Ô"<ð Pð PÐ
Ø'+×'JÒ'JØ ñ(
ô (
Ð$ð Ô-Ð5Ø/1ˆ,Ô
,ØÔ*×1Ò1Ð2NÑOÔOÐOÐOàÐr   Útoolsc                 ó:   — |D ]}|                       |¦  «         Œd S r   )rI   )r   rJ   rA   s      r   Ú	add_toolsz_TextsAccumulator.add_tools~   s0   € Øð ð ˆØ
‡m‚m�DÑÔÐÐðð r   Úfunction_responsesc                 ó:   — |D ]}|                       |¦  «         Œd S r   )r1   )r   rM   r0   s      r   Úadd_function_responsesz(_TextsAccumulator.add_function_responses‚   s6   € ð 0ð 4ð 4ÐØ
× Ò Ð!2Ñ3Ô3Ð3Ð3ð4ð 4r   r0   c                 óä   — t          j        ¦   «         }|j        r+| j                             |j        ¦  «         |j        |_        |j        r#|                      |j        ¦  «        }||_        d S d S r   )r   ÚFunctionResponser;   r   r3   Úresponser>   )r   r0   Úcounted_function_responseÚcounted_responses       r   r1   z'_TextsAccumulator.add_function_responseˆ   s€   € õ !&Ô 6Ñ 8Ô 8ÐØÔð >Ø
„k×ÒÐ*Ô/Ñ0Ô0Ð0Ø'8Ô'=ÐÔ$ØÔ!ð <Ø×,Ò,Ð->Ô-GÑHÔHÐØ+;ÐÔ(Ð(Ð(ð<ð <r   rG   c                 ó”  — t          j        ¦   «         }|j        r+| j                             |j        ¦  «         |j        |_        |j        r+| j                             |j        ¦  «         |j        |_        |j        r!|                      |j        ¦  «        }||_        |j        r!|                      |j        ¦  «        }||_        |S r   )	r   ÚFunctionDeclarationr;   r   r3   ÚdescriptionÚ
parametersÚ
add_schemarR   )r   rG   rH   Úcounted_parametersrT   s        r   rE   z0_TextsAccumulator._function_declaration_traverse“   sÕ   € õ $)Ô#<Ñ#>Ô#>Ð ØÔ ð DØ
„k×ÒÐ-Ô2Ñ3Ô3Ð3Ø*>Ô*CÐ"Ô'ØÔ'ð Ø
„k×ÒÐ-Ô9Ñ:Ô:Ð:à
Ô
*ð #Ô.ð Ô&ð CØŸ?š?Ð+?Ô+JÑKÔKÐØ0BÐ"Ô-ØÔ$ð ?ØŸšÐ)=Ô)FÑGÔGÐØ.>Ð"Ô+Ø'Ð'r   Úschemac                 óº  — t          j        ¦   «         }|j        r|j        |_        |j        r|j        |_        |j        �|j        |_        |j        r+| j                             |j        ¦  «         |j        |_        |j        r+| j                             |j        ¦  «         |j        |_        |j	        r+| j         
                    |j	        ¦  «         |j	        |_	        |j        r+| j         
                    |j        ¦  «         |j        |_        |j        r|j        |_        |j        r!|                      |j        ¦  «        }||_        |j        r\i }|j                             ¦   «         D ]9\  }}| j                             |¦  «         |                      |¦  «        }|||<   Œ:||_        |j        r!|                      |j        ¦  «        }||_        |S )z¼Processes a schema and adds relevant text to the accumulator.

    Args:
        schema: The schema to process.

    Returns:
        The new schema object with only countable fields.
    )r   ÚSchemaÚtypeÚtitleÚdefaultÚformatr   r3   rW   ÚenumÚextendÚrequiredÚproperty_orderingÚitemsrY   Ú
propertiesÚexampleÚ_any_traverse)	r   r[   Úcounted_schemaÚcounted_schema_itemsÚdÚkeyÚvalueÚcounted_valueÚcounted_schema_examples	            r   rY   z_TextsAccumulator.add_schema§   sÓ  € õ ”\‘^”^€NØ„{ð (Ø"œK€nÔØ„|ð *Ø#œ\€nÔØ„~Ð!Ø%œ~€nÔØ„}ð ,Ø
„k×Ò˜œÑ'Ô'Ð'Ø$œm€nÔØÔð 6Ø
„k×Ò˜Ô+Ñ,Ô,Ð,Ø#)Ô#5€nÔ Ø„{ð (Ø
„k×Ò˜œÑ%Ô%Ð%Ø"œK€nÔØ„ð 0Ø
„k×Ò˜œÑ)Ô)Ð)Ø &¤€nÔØÔð BØ)/Ô)A€nÔ&Ø„|ð 2Ø!Ÿ_š_¨V¬\Ñ:Ô:ÐØ1€nÔØÔð $Ø
€aØÔ)×/Ò/Ñ1Ô1ð ð ‰*ˆ#ˆuØŒ×Ò˜3ÑÔÐØŸš¨Ñ.Ô.ˆØˆˆ#‰ˆØ"#€nÔØ„~ð 6Ø#×1Ò1°&´.ÑAÔAÐØ5€nÔØÐr   rl   c                 óà   — i }| j                              t          |                     ¦   «         ¦  «        ¦  «         |                     ¦   «         D ]\  }}|                      |¦  «        ||<   Œ|S )z±Processes a dict and adds relevant text to the accumulator.

    Args:
        d: The dict to process.

    Returns:
        The new dict object with only countable fields.
    )r   rc   ÚlistÚkeysrf   ri   )r   rl   Úcounted_dictrm   Úvals        r   r>   z _TextsAccumulator._dict_traverseÔ   si   € ð €LØ„K×Ò•t˜AŸFšF™HœH‘~”~Ñ&Ô&Ð&Ø—G’G‘I”Ið 2ð 2‰ˆˆSØ×,Ò,¨SÑ1Ô1€l�3ÑÐØÐr   rn   c                 ó  ‡ — t          |t          ¦  «        r‰ j                             |¦  «         |S t          |t          ¦  «        r‰                      |¦  «        S t          |t          ¦  «        rˆ fd„|D ¦   «         S |S )z±Processes a value and adds relevant text to the accumulator.

    Args:
        value: The value to process.

    Returns:
        The new value with only countable fields.
    c                 ó:   •— g | ]}‰                      |¦  «        ‘ŒS © )ri   )Ú.0Úitemr   s     €r   ú
<listcomp>z3_TextsAccumulator._any_traverse.<locals>.<listcomp>ò   s'   ø€ Ð9Ð9Ð9¨4ˆd× Ò  Ñ&Ô&Ð9Ð9Ð9r   )Ú
isinstanceÚstrr   r3   Údictr>   rr   )r   rn   s   ` r   ri   z_TextsAccumulator._any_traverseã   s‰   ø€ õ �%�ÑÔð Ø
„k×Ò˜ÑÔÐØ€lÝ	�E�4Ñ	 Ô	 ð Ø× Ò  Ñ'Ô'Ð'Ý	�E�4Ñ	 Ô	 ð Ø9Ð9Ð9Ð9°5Ð9Ñ9Ô9Ð9à€lr   )r   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r}   r   r   r(   r"   r    r<   r/   rD   rI   rL   rQ   rO   r1   rV   rE   r]   rY   r~   r   r>   ri   rx   r   r   r   r   '   s
  € € € € € ðð ð& ð  ð  ð  ð˜ #œð ð ð ð ð  8¨E¬MÔ#:ð  ¸tð  ð  ð  ð  ð ¤ð °4ð ð ð ð ð>0¨UÔ-?ð 0ÀDð 0ð 0ð 0ð 0ð˜5œ:ð ¨%¬*ð ð ð ð ð˜X e¤jÔ1ð °dð ð ð ð ð4Ø (¨Ô)?Ô @ð4àð4ð 4ð 4ð 4ð	<Ø$Ô5ð	<àð	<ð 	<ð 	<ð 	<ð(Ø"'Ô";ð(àÔ ð(ð (ð (ð (ð(+˜uœ|ð +°´ð +ð +ð +ð +ðZ˜d 3¨ 8œnð °°c¸3°h´ð ð ð ð ð ð ¨ð ð ð ð ð ð r   r   Útokenr^   r   c                 óÚ   — |t           j        j        j        j        k    r$t          | ¦  «                             dd¬¦  «        S |                      dd¦  «                             d¦  «        S )Nr   Úbig)ÚlengthÚ	byteorderu   â–�ú zutf-8)	r   Ú
ModelProtoÚSentencePieceÚTypeÚBYTEr   Úto_bytesÚreplaceÚencode)rƒ   r^   s     r   r   r   ÷   s_   € ð 
Õ$Ô/Ô=ÔBÔGÒGÐGÝ˜5Ñ!Ô!×*Ò*°!¸uÐ*ÑEÔEÐEà�=Š=˜ Ñ$Ô$×+Ò+¨GÑ4Ô4Ð4r   c                 ól  — t          | ¦  «        dk    rt          d| › �¦  «        ‚|                      d¦  «        r|                      d¦  «        st          d| › �¦  «        ‚	 t	          | dd…         d¦  «        }n # t          $ r t          d	| › �¦  «        ‚w xY w|d
k    rt          d| › �¦  «        ‚|S )zœParses a hex byte string of the form '<0xXX>' and returns the integer value.

  Raises ValueError if the input is malformed or the byte value is invalid.
  é   zInvalid byte length: z<0xú>zInvalid byte format: é   é   é   zInvalid hex value: é   zByte value out of range: )Úlenr,   Ú
startswithÚendswithÚint)rƒ   ru   s     r   r   r      sá   € õ 	ˆ�Z„Z�1‚_€_Ý
Ð4¨UÐ4Ð4Ñ
5Ô
5Ð5Ø	×	Ò	˜%Ñ	 Ô	 ð 6¨¯ª°sÑ(;Ô(;ð 6Ý
Ð4¨UÐ4Ð4Ñ
5Ô
5Ð5ð4Ý
ˆe�A�a�CŒj˜"Ñ
Ô
€C€CøÝ	ð 4ð 4ð 4Ý
Ð2¨5Ð2Ð2Ñ
3Ô
3Ð3ð4øøøð 	ˆC‚Z€ZÝ
Ð8°Ð8Ð8Ñ
9Ô
9Ð9à	€*s   Á#A< Á<Bc                   ó  — e Zd ZdZdefd„Z ej        d¦  «        ddœdee	j
        e	j        f         dee	j                 d	e	j        fd
„¦   «         Z ej        d¦  «        dee	j
        e	j        f         d	e	j        fd„¦   «         ZdS )r   aö  [Experimental] Text Only Local Tokenizer.

  This class provides a local tokenizer for text only token counting.

  LIMITATIONS:
  - Only supports text based tokenization and no multimodal tokenization.
  - Forward compatibility depends on the open-source tokenizer models for future
  Gemini versions.
  - For token counting of tools and response schemas, the `LocalTokenizer` only
  supports `types.Tool` and `types.Schema` objects. Python functions or Pydantic
  models cannot be passed directly.
  Ú
model_namec                 ó°   — t          j        |¦  «        | _        t          j        | j        ¦  «        | _        t          j        | j        ¦  «        | _        d S r   )ÚloaderÚget_tokenizer_nameÚ_tokenizer_nameÚload_model_protoÚ_model_protoÚget_sentencepieceÚ
_tokenizer)r   rœ   s     r   r   zLocalTokenizer.__init__$  sD   € Ý!Ô4°ZÑ@Ô@€DÔÝÔ/°Ô0DÑEÔE€DÔÝÔ.¨tÔ/CÑDÔD€D„O€O€Or   z€The SDK's local tokenizer implementation is experimental and may change in the future. It only supports text based tokenization.N)Úconfigr   r¥   r   c                óŠ  — t          j        |¦  «        }t          ¦   «         }t          j                             |pi ¦  «        }|                     |¦  «         |j        r|                     |j        ¦  «         |j	        r+|j	        j
        r|                     |j	        j
        ¦  «         |j        r-|                     t          j        |j        g¦  «        ¦  «         | j                             t          |                     ¦   «         ¦  «        ¦  «        }t          j        t%          d„ |D ¦   «         ¦  «        ¬¦  «        S )aå  Counts the number of tokens in a given text.

    Args:
      contents: The contents to tokenize.
      config: The configuration for counting tokens.

    Returns:
      A `CountTokensResult` containing the total number of tokens.

    Usage:

    .. code-block:: python

      from google import genai
      tokenizer = genai.LocalTokenizer(model_name='gemini-2.0-flash-001')
      result = tokenizer.count_tokens("What is your name?")
      print(result)
      # total_tokens=5
    c              3   ó4   K  — | ]}t          |¦  «        V — Œd S r   )r—   )ry   Útokenss     r   ú	<genexpr>z.LocalTokenizer.count_tokens.<locals>.<genexpr>R  s(   è è € Ð?Ð?¨�˜V™œÐ?Ð?Ð?Ð?Ð?Ð?r   )Útotal_tokens)ÚtÚ
t_contentsr   r   ÚCountTokensConfigÚmodel_validater"   rJ   rL   Úgeneration_configÚresponse_schemarY   Úsystem_instructionr¤   r�   rr   r   ÚCountTokensResultÚsum)r   r   r¥   Úprocessed_contentsÚtext_accumulatorÚtokens_lists         r   Úcount_tokenszLocalTokenizer.count_tokens)  s1  € õ: œ hÑ/Ô/ÐÝ(Ñ*Ô*ÐÝÔ$×3Ò3°F°L¸bÑAÔA€FØ×!Ò!Ð"4Ñ5Ô5Ð5Ø„|ð /Ø× Ò  ¤Ñ.Ô.Ð.ØÔð L FÔ$<Ô$Lð LØ×!Ò! &Ô":Ô"JÑKÔKÐKØÔ ð OØ×#Ò#¥A¤L°&Ô2KÐ1LÑ$MÔ$MÑNÔNÐNØ”/×(Ò(­Ð.>×.HÒ.HÑ.JÔ.JÑ)KÔ)KÑLÔL€KÝÔ"ÝÐ?Ð?°;Ð?Ñ?Ô?Ñ?Ô?ðñ ô ð r   c                 ó&  ‡ — t          j        |¦  «        }t          ¦   «         }|D ]}|                     |¦  «         Œ‰ j                             |                     ¦   «         ¦  «        }g }|D ]-}|j        r$|j        D ]}|                     |j	        ¦  «         ŒŒ.g }t          ||¦  «        D ]O\  }	}
|                     t          j        d„ |	j        D ¦   «         ˆ fd„|	j        D ¦   «         |
¬¦  «        ¦  «         ŒPt          j        |¬¦  «        S )a,  Computes the tokens ids and string pieces in the input.

    Args:
      contents: The contents to tokenize.

    Returns:
      A `ComputeTokensResult` containing the token information.

    Usage:

    .. code-block:: python

      from google import genai
      tokenizer = genai.LocalTokenizer(model_name='gemini-2.0-flash-001')
      result = tokenizer.compute_tokens("What is your name?")
      print(result)
      # tokens_info=[TokensInfo(token_ids=[279, 329, 1313, 2508, 13], tokens=[b' What', b' is', b' your', b' name', b'?'], role='user')]
    c                 ó   — g | ]	}|j         ‘Œ
S rx   )Úid)ry   Úpieces     r   r{   z1LocalTokenizer.compute_tokens.<locals>.<listcomp>�  s   € ÐCÐCÐC e˜œÐCÐCÐCr   c                 ón   •— g | ]1}t          |j        ‰j        j        |j                 j        ¦  «        ‘Œ2S rx   )r   r»   r¢   Úpiecesrº   r^   )ry   r»   r   s     €r   r{   z1LocalTokenizer.compute_tokens.<locals>.<listcomp>‚  sL   ø€ ð ð ð ð õ &Ø”k 4Ô#4Ô#;¸E¼HÔ#EÔ#Jñô ðð ð r   )Ú	token_idsr¨   r%   )Útokens_info)r«   r¬   r   r    r¤   ÚEncodeAsImmutableProtor   r$   r3   r%   Úzipr   Ú
TokensInfor½   ÚComputeTokensResult)r   r   r´   rµ   r!   Útokens_protosÚrolesÚ_Útoken_infosÚtokens_protor%   s   `          r   Úcompute_tokenszLocalTokenizer.compute_tokensU  se  ø€ õ4 œ hÑ/Ô/ÐÝ(Ñ*Ô*ÐØ%ð ,ð ,ˆØ×"Ò" 7Ñ+Ô+Ð+Ð+Ø”O×:Ò:Ø×"Ò"Ñ$Ô$ñô €Mð €EØ%ð %ð %ˆØ	Œð %Ø”ð 	%ð 	%ˆAØ
�,Š,�w”|Ñ
$Ô
$Ð
$Ð
$øà€KÝ! -°Ñ7Ô7ð ð Ñˆ�dØ×ÒÝ
Ô
ØCÐC¨|Ô/BÐCÑCÔCðð ð ð ð  ,Ô2ð	ñ ô ð ð	ñ 	ô 	ñô ð ð õ Ô$°Ð=Ñ=Ô=Ð=r   )r   r€   r�   r‚   r}   r   r	   Úexperimental_warningr   r   ÚContentListUnionÚContentListUnionDictr   ÚCountTokensConfigOrDictr²   r·   rÃ   rÉ   rx   r   r   r   r     s  € € € € € ðð ðE ð Eð Eð Eð Eð
  €7ÔðBñô ð 9=ð	&ð &ð &à�eÔ,¨eÔ.HÐHÔIð&ð �uÔ4Ô5ð	&ð
 Ôð&ð &ð &ñ	ô ð&ðP  €7ÔðBñô ð2>à�eÔ,¨eÔ.HÐHÔIð2>ð Ô ð2>ð 2>ð 2>ñ	ô ð2>ð 2>ð 2>r   r   )r‚   ÚloggingÚtypingr   r   r   r   Úsentencepiecer   Ú r	   r
   rž   r   r«   r   Ú	getLoggerr5   Ú__all__r   r}   r‰   rŠ   r‹   Úbytesr   rš   r   r   rx   r   r   ú<module>rÕ      sˆ  ðð  0Ð /à €€€Ø  Ð  Ð  Ð  Ð  Ð  Ð  Ð  Ø "Ð "Ð "Ð "Ð "Ð "Ð "Ð "à 1Ð 1Ð 1Ð 1Ð 1Ð 1à Ð Ð Ð Ð Ð Ø /Ð /Ð /Ð /Ð /Ð /Ø  Ð  Ð  Ð  Ð  Ð  Ø Ð Ð Ð Ð Ð à	ˆÔ	Ð9Ñ	:Ô	:€ðð ð €ðMð Mð Mð Mð Mñ Mô Mð Mð`5Øð5Ø-Ô8ÔFÔKð5à
ð5ð 5ð 5ð 5ð˜3ð  3ð ð ð ð ð,u>ð u>ð u>ð u>ð u>ñ u>ô u>ð u>ð u>ð u>r   