Ë
    T^(h`C  ã                   óÎ  — 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 d dlmZ d dl	m
Z
mZmZmZmZmZmZ d dlmZ ddlmZmZmZ  e«       rd dlZd d	lmZ d d
lmZ ndZ e«       rd dlmZ  e«       rd dlmZ e e!e"e#e
 e$d«      dfZ% ejL                  dejN                  «      Z( ejL                  dejN                  «      Z) ejL                  dejN                  ejT                  z  «      Z+ ejL                  dejN                  «      Z, G d„ de-«      Z. G d„ de-«      Z/de"de0e"e"f   fd„Z1de"de0fd„Z2dede0fd„Z3de"de4ee"   ee0   ee"   f   fd„Z5dede0fd„Z6d „ Z7ed!„ «       Z8y)"é    N)Úcontextmanager)Údatetime)Ú	lru_cache)ÚAnyÚCallableÚOptionalÚUnionÚget_argsÚ
get_originÚget_type_hints)Úversioné   )Úis_jinja_availableÚis_torch_availableÚis_vision_available)Ú	Extension)ÚImmutableSandboxedEnvironment)ÚImage)ÚTensor.z(^(.*?)[\n\s]*(Args:|Returns:|Raises:|\Z)z0\n\s*Args:\n\s*(.*?)[\n\s]*(Returns:|Raises:|\Z)a1  
(?:^|\n)  # Match the start of the args block, or a newline
\s*(\w+):\s*  # Capture the argument name and strip spacing
(.*?)\s*  # Capture the argument description, which can span multiple lines, and strip trailing spacing
(?=\n\s*\w+:|\Z)  # Stop when you hit the next argument or the end of the block
z*\n\s*Returns:\n\s*(.*?)[\n\s]*(Raises:|\Z)c                   ó   — e Zd ZdZy)ÚTypeHintParsingExceptionzJException raised for errors in parsing type hints to generate JSON schemasN©Ú__name__Ú
__module__Ú__qualname__Ú__doc__© ó    úd/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/transformers/utils/chat_template_utils.pyr   r   >   ó   „ ÙTàr   r   c                   ó   — e Zd ZdZy)ÚDocstringParsingExceptionzJException raised for errors in parsing docstrings to generate JSON schemasNr   r   r   r   r"   r"   D   r    r   r"   Ú
param_typeÚreturnc                 óè   — t         ddit        ddit        ddit        ddit	        d «      ddit
        i i}t        «       rddi|t        <   t        «       rddi|t        <   |j                  | dd	i«      S )
NÚtypeÚintegerÚnumberÚstringÚbooleanÚnullÚimageÚaudioÚobject)ÚintÚfloatÚstrÚboolr&   r   r   r   r   r   Úget)r#   Útype_mappings     r   Ú_get_json_schema_typer5   J   sˆ   € äˆf�iÐ Ü�˜Ð!Üˆf�hÐÜˆv�yÐ!ÜˆT‹
�V˜VÐ$ÜˆRð€Lô ÔØ% wÐ/ˆ”UÑÜÔØ &¨Ð0ˆ”VÑØ×Ñ˜J¨°Ð(:Ó;Ð;r   Úhintc                 ó‚  — t        | «      }t        | «      }|€	 t        | «      S |t
        u s"t        t        d«      r•|t        j                  u rƒ|D �cg c]  }|t        d «      usŒt        |«      ‘Œ }}t        |«      dk(  r|d   }n5t        d„ |D «       «      rdt        |D �cg c]  }|d   ‘Œ	 c}«      i}nd|i}t        d «      |v rd|d	<   |S |t        u r|sdd
iS d
t        |d   «      dœS |t        u rg|sdd
iS t        |«      dk(  r(t	        dt!        | «      j#                  dd«      › d�«      ‚d|v rt	        d«      ‚d
|D �cg c]  }t        |«      ‘Œ c}dœS |t$        u r%ddi}t        |«      dk(  rt        |d   «      |d<   |S t	        d| «      ‚# t        $ r t	        d| «      ‚w xY wc c}w c c}w c c}w )NzGCouldn't parse this type hint, likely due to a custom class or object: Ú	UnionTyper   r   c              3   óB   K  — | ]  }t        |d    t        «      –— Œ y­w)r&   N)Ú
isinstancer1   )Ú.0Úsubtypes     r   ú	<genexpr>z#_parse_type_hint.<locals>.<genexpr>l   s   è ø€ ÒJ°g”˜G F™O¬S×1ÑJùs   ‚r&   ÚanyOfTÚnullableÚarray)r&   ÚitemszThe type hint ztyping.Ú a1   is a Tuple with a single element, which we do not automatically convert to JSON schema as it is rarely necessary. If this input can contain more than one element, we recommend using a List[] type instead, or if it really is a single element, remove the Tuple[] wrapper and just pass the element directly..znConversion of '...' is not supported in Tuple type hints. Use List[] types for variable-length inputs instead.)r&   ÚprefixItemsr.   é   ÚadditionalProperties)r   r
   r5   ÚKeyErrorr   r	   ÚhasattrÚtypesr8   r&   Ú_parse_type_hintÚlenÚallÚsortedÚlistÚtupler1   ÚreplaceÚdict)r6   ÚoriginÚargsÚtÚsubtypesÚreturn_dictr<   Úouts           r   rI   rI   Z   s  € Ü˜Ó€FÜ�D‹>€Dà€~ð	Ü(¨Ó.Ð.ð 
”5‰œW¤U¨KÔ8¸VÄuÇÁÑ=Và15ÖM¨A¸Ä$ÀtÃ*Ò9LÔ$ QÕ'ÐMˆÐMÜˆx‹=˜AÒà" 1™+‰KÜÑJÀÔJÔJà!¤6È(Ö*S¸w¨7°6«?Ò*SÓ#TÐU‰Kð # HÐ-ˆKÜ�‹:˜ÑØ&*ˆK˜
Ñ#ØÐà	”4‰ÙØ˜GÐ$Ð$ð $Ô.>¸tÀA¹wÓ.GÑHÐHà	”5‰ÙØ˜GÐ$Ð$Üˆt‹9˜Š>Ü*Ø ¤ T£×!2Ñ!2°9¸bÓ!AÐ Bð C-ð -óð ð �$‰;Ü*ð#óð ð
  ÈdÖ0SÈÔ1AÀ!Õ1DÒ0SÑTÐTà	”4‰ð �xÐ ˆÜˆt‹9˜Š>Ü*:¸4À¹7Ó*CˆCÐ&Ñ'Øˆ
ä
"Ð#lÐnrÓ
sÐsøôo ò 	Ü*ØYÐ[_óð ð	üò Nùò +Tùò@ 1Ts#   š
F ÁF2Á&F2Â%F7
Å	F<ÆF/Úfuncc                 ó   — t        | «      }t        j                  | «      }g }|j                  j	                  «       D ]Š  \  }}|j
                  t        j                  j                  k(  r%t        d|j                  › d| j                  › �«      ‚|j                  t        j                  j                  k(  sŒz|j                  |«       ŒŒ i }|j	                  «       D ]  \  }}t        |«      ||<   Œ d|dœ}|r||d<   |S )Nz	Argument z$ is missing a type hint in function r.   )r&   Ú
propertiesÚrequired)r   ÚinspectÚ	signatureÚ
parametersrA   Ú
annotationÚ	ParameterÚemptyr   Únamer   ÚdefaultÚappendrI   )	rW   Ú
type_hintsr\   rZ   Ú
param_nameÚparamrY   r#   Úschemas	            r   Ú"_convert_type_hints_to_json_schemarh   ›   sø   € Ü Ó%€JÜ×!Ñ! $Ó'€IØ€HØ&×1Ñ1×7Ñ7Ó9ò (Ñˆ
�EØ×Ñœw×0Ñ0×6Ñ6Ò6Ü*¨Y°u·z±z°lÐBfÐgk×gtÑgtÐfuÐ+vÓwÐwØ�=‰=œG×-Ñ-×3Ñ3Ó3Ø�O‰O˜JÕ'ð	(ð €JØ",×"2Ñ"2Ó"4ò >Ñˆ
�JÜ!1°*Ó!=ˆ
�:Òð>ð ¨jÑ9€FÙØ%ˆˆzÑà€Mr   Ú	docstringc           
      ó”  — t         j                  | «      }t        j                  | «      }t        j                  | «      }|r|j	                  d«      j                  «       nd}|r|j	                  d«      j                  «       nd}|r|j	                  d«      j                  «       nd}|�Ždj                  |j                  d«      D �cg c]  }|j                  «       sŒ|‘Œ c}«      }t        j                  |«      }|D �	ci c].  }	|	d   t        j                  dd|	d   j                  «       «      “Œ0 }
}	ni }
||
|fS c c}w c c}	w )a  
    Parses a Google-style docstring to extract the function description,
    argument descriptions, and return description.

    Args:
        docstring (str): The docstring to parse.

    Returns:
        The function description, arguments, and return description.
    r   Nú
r   z	\s*\n+\s*ú )Údescription_reÚsearchÚargs_reÚ
returns_reÚgroupÚstripÚjoinÚsplitÚargs_split_reÚfindallÚreÚsub)ri   Údescription_matchÚ
args_matchÚreturns_matchÚdescriptionÚdocstring_argsÚreturnsÚlineÚmatchesÚmatchÚ	args_dicts              r   Úparse_google_format_docstringrƒ   °   s%  € ô '×-Ñ-¨iÓ8ÐÜ—‘ 	Ó*€JÜ×%Ñ% iÓ0€Mñ 9JÐ#×)Ñ)¨!Ó,×2Ñ2Ô4Èt€KÙ4>�Z×%Ñ% aÓ(×.Ñ.Ô0ÀD€NÙ0=ˆm×!Ñ! !Ó$×*Ñ*Ô,À4€Gð Ð!ØŸ™°^×5IÑ5IÈ$Ó5OÖ#`¨TÐSW×S]ÑS]ÕS_¢DÒ#`ÓaˆÜ×'Ñ'¨Ó7ˆØX_Ö`Èu�U˜1‘XœrŸv™v l°C¸¸q¹¿¹Ó9IÓJÑJÐ`ˆ	Ñ`àˆ	à˜	 7Ð*Ð*ùò $aùâ`s   Ã	E ÃE Ä3Ec                 óê  — t        j                  | «      }|st        d| j                  › d�«      ‚|j	                  «       }t        |«      \  }}}t        | «      }|d   j                  dd«      x}�|�||d<   |d   j                  «       D ]Å  \  }}||vrt        d| j                  › d|› d�«      ‚||   }	t        j                  d	|	t        j                  ¬
«      }
|
rnt        j                  |
j                  d«      «      D �cg c]  }|j	                  «       ‘Œ c}|d<   |
j                  d|
j!                  «        j	                  «       }	|	|d<   ŒÇ | j                  ||dœ}|�||d<   d|dœS c c}w )aü  
    This function generates a JSON schema for a given function, based on its docstring and type hints. This is
    mostly used for passing lists of tools to a chat template. The JSON schema contains the name and description of
    the function, as well as the names, types and descriptions for each of its arguments. `get_json_schema()` requires
    that the function has a docstring, and that each argument has a description in the docstring, in the standard
    Google docstring format shown below. It also requires that all the function arguments have a valid Python type hint.

    Although it is not required, a `Returns` block can also be added, which will be included in the schema. This is
    optional because most chat templates ignore the return value of the function.

    Args:
        func: The function to generate a JSON schema for.

    Returns:
        A dictionary containing the JSON schema for the function.

    Examples:
    ```python
    >>> def multiply(x: float, y: float):
    >>>    '''
    >>>    A function that multiplies two numbers
    >>>
    >>>    Args:
    >>>        x: The first number to multiply
    >>>        y: The second number to multiply
    >>>    '''
    >>>    return x * y
    >>>
    >>> print(get_json_schema(multiply))
    {
        "name": "multiply",
        "description": "A function that multiplies two numbers",
        "parameters": {
            "type": "object",
            "properties": {
                "x": {"type": "number", "description": "The first number to multiply"},
                "y": {"type": "number", "description": "The second number to multiply"}
            },
            "required": ["x", "y"]
        }
    }
    ```

    The general use for these schemas is that they are used to generate tool descriptions for chat templates that
    support them, like so:

    ```python
    >>> from transformers import AutoTokenizer
    >>> from transformers.utils import get_json_schema
    >>>
    >>> def multiply(x: float, y: float):
    >>>    '''
    >>>    A function that multiplies two numbers
    >>>
    >>>    Args:
    >>>        x: The first number to multiply
    >>>        y: The second number to multiply
    >>>    return x * y
    >>>    '''
    >>>
    >>> multiply_schema = get_json_schema(multiply)
    >>> tokenizer = AutoTokenizer.from_pretrained("CohereForAI/c4ai-command-r-v01")
    >>> messages = [{"role": "user", "content": "What is 179 x 4571?"}]
    >>> formatted_chat = tokenizer.apply_chat_template(
    >>>     messages,
    >>>     tools=[multiply_schema],
    >>>     chat_template="tool_use",
    >>>     return_dict=True,
    >>>     return_tensors="pt",
    >>>     add_generation_prompt=True
    >>> )
    >>> # The formatted chat can now be passed to model.generate()
    ```

    Each argument description can also have an optional `(choices: ...)` block at the end, such as
    `(choices: ["tea", "coffee"])`, which will be parsed into an `enum` field in the schema. Note that this will
    only be parsed correctly if it is at the end of the line:

    ```python
    >>> def drink_beverage(beverage: str):
    >>>    '''
    >>>    A function that drinks a beverage
    >>>
    >>>    Args:
    >>>        beverage: The beverage to drink (choices: ["tea", "coffee"])
    >>>    '''
    >>>    pass
    >>>
    >>> print(get_json_schema(drink_beverage))
    ```
    {
        'name': 'drink_beverage',
        'description': 'A function that drinks a beverage',
        'parameters': {
            'type': 'object',
            'properties': {
                'beverage': {
                    'type': 'string',
                    'enum': ['tea', 'coffee'],
                    'description': 'The beverage to drink'
                    }
                },
            'required': ['beverage']
        }
    }
    z Cannot generate JSON schema for z because it has no docstring!rY   r$   Nr|   z< because the docstring has no description for the argument 'ú'z\(choices:\s*(.*?)\)\s*$)Úflagsr   Úenum)ra   r|   r]   Úfunction)r&   rˆ   )r[   Úgetdocr"   r   rr   rƒ   rh   ÚpoprA   rw   rn   Ú
IGNORECASEÚjsonÚloadsrq   r)   Ústart)rW   ÚdocÚmain_docÚparam_descriptionsÚ
return_docÚjson_schemarU   Úargrg   ÚdescÚenum_choicesÚcÚoutputs                r   Úget_json_schemar™   Ñ   s   € ôV �.‰.˜Ó
€CÙÜ'Ø.¨t¯}©}¨oÐ=ZÐ[ó
ð 	
ð �)‰)‹+€CÜ/LÈSÓ/QÑ,€HÐ  *ä4°TÓ:€KØ" <Ñ0×4Ñ4°X¸tÓDÐDˆÐQØÐ!Ø)3ˆK˜Ñ&Ø" <Ñ0×6Ñ6Ó8ò 
%‰ˆˆVØÐ(Ñ(Ü+Ø2°4·=±=°/ÐA}ð  Bð  ~Cð  CDð  Eóð ð " #Ñ&ˆÜ—y‘yÐ!<¸dÌ"Ï-É-ÔXˆÙÜ15·±¸L×<NÑ<NÈqÓ<QÓ1RÖS¨A˜aŸg™g�iÒSˆF�6‰NØ×&Ñ&Ð'=¨×);Ñ);Ó)=Ð>×DÑDÓFˆDØ $ˆˆ}Òð
%ð —m‘m°HÈKÑX€FØÐØ&ˆˆxÑØ¨FÑ3Ð3ùò Ts   ÄE0c           	      óö   — g }g }| j                   j                  ||«      5   | j                  d||||dœ|¤ŽD ]  }|j                  |«       Œ dj	                  |«      }	d d d «       |	|fS # 1 sw Y   	|fS xY w)N)ÚmessagesÚtoolsÚ	documentsÚadd_generation_promptrB   r   )ÚenvironmentÚactivate_trackerÚgeneraterc   rs   )
Úcompiled_templater›   rœ   r�   rž   Útemplate_kwargsÚrendered_blocksÚgeneration_indicesÚblockÚrendered_chats
             r   Ú_render_with_assistant_indicesr¨   Z  sª   € ð €OØÐØ	×	&Ñ	&×	7Ñ	7¸ÐI[Ó	\ñ 	1Ø/Ð&×/Ñ/ð 
ØØØØ"7ñ	
ð
 ñ
ò 	*ˆEð ×"Ñ" 5Õ)ð	*ð Ÿ™ Ó0ˆ÷	1ð Ð,Ð,Ð,÷	1ð Ð,Ð,Ð,ús   ¡?A,Á,A8c                 óÖ  — t        «       st        d«      ‚ G d„ dt        «      }t        j                  t
        j                  «      t        j                  d«      k  rt        dt
        j                  › d�«      ‚d„ }dd„}d	„ }t        d
d
|t
        j                  j                  g¬«      }||j                  d<   ||j                  d<   ||j                  d<   |j                  | «      S )Nzbapply_chat_template requires jinja2 to be installed. Please install it using `pip install jinja2`.c                   ó>  ‡ — e Zd ZdhZdefˆ fd„Zdej                  j                  dej                  j                  fd„Zej                  dej                  j                  dej                  j                  defd	„«       Zdefd
„Zedee   dee   fd„«       Zˆ xZS )ú1_compile_jinja_template.<locals>.AssistantTrackerÚ
generationrŸ   c                 óx   •— t         ‰| �  |«       |j                  | j                  ¬«       d | _        d | _        y )N)r    )ÚsuperÚ__init__Úextendr    Ú_rendered_blocksÚ_generation_indices)ÚselfrŸ   Ú	__class__s     €r   r¯   z:_compile_jinja_template.<locals>.AssistantTracker.__init__w  s7   ø€ ä‰GÑ˜[Ô)Ø×Ñ°×0EÑ0EÐÔFØ$(ˆDÔ!Ø'+ˆDÕ$r   Úparserr$   c                 óè   — t        |j                  «      j                  }|j                  dgd¬«      }t        j
                  j                  | j                  d«      g g |«      j                  |«      S )Nzname:endgenerationT)Údrop_needleÚ_generation_support)	ÚnextÚstreamÚlinenoÚparse_statementsÚjinja2ÚnodesÚ	CallBlockÚcall_methodÚ
set_lineno)r³   rµ   r»   Úbodys       r   Úparsez7_compile_jinja_template.<locals>.AssistantTracker.parse~  se   € Ü˜&Ÿ-™-Ó(×/Ñ/ˆFØ×*Ñ*Ð,@Ð+AÈtÐ*ÓTˆDÜ—<‘<×)Ñ)¨$×*:Ñ*:Ð;PÓ*QÐSUÐWYÐ[_Ó`×kÑkÐlrÓsÐsr   ÚcontextÚcallerc                 óÒ   —  |«       }| j                  «       rOt        dj                  | j                  «      «      }|t        |«      z   }| j                  j                  ||f«       |S )NrB   )Ú	is_activerJ   rs   r±   r²   rc   )r³   rÄ   rÅ   ÚrvÚstart_indexÚ	end_indexs         r   r¸   zE_compile_jinja_template.<locals>.AssistantTracker._generation_supportƒ  sX   € á“ˆBØ�~‰~Ôä! "§'¡'¨$×*?Ñ*?Ó"@ÓA�Ø'¬#¨b«'Ñ1�	Ø×(Ñ(×/Ñ/°¸iÐ0HÔIØˆIr   c                 ó6   — | j                   xs | j                  S ©N)r±   r²   )r³   s    r   rÇ   z;_compile_jinja_template.<locals>.AssistantTracker.is_active�  s   € Ø×(Ñ(ÒD¨D×,DÑ,DÐDr   r¤   r¥   c              3   óª   K  — 	 | j                  «       rt        d«      ‚|| _        || _        d –— d | _        d | _        y # d | _        d | _        w xY w­w)Nz3AssistantTracker should not be reused before closed)rÇ   Ú
ValueErrorr±   r²   )r³   r¤   r¥   s      r   r    zB_compile_jinja_template.<locals>.AssistantTracker.activate_tracker�  sW   è ø€ ð	0Ø—>‘>Ô#Ü$Ð%ZÓ[Ð[Ø(7�Ô%Ø+=�Ô(ãà(,�Ô%Ø+/�Õ(øð )-�Ô%Ø+/�Õ(üs   ‚A„-A  ±AÁ AÁA)r   r   r   Útagsr   r¯   r½   rµ   ÚParserr¾   r¿   rÃ   Úpass_eval_contextÚEvalContextÚruntimeÚMacror1   r¸   r2   rÇ   r   rM   r/   r    Ú__classcell__)r´   s   @r   ÚAssistantTrackerr«   s  sÃ   ø„ àˆ~ˆð	,Ð(Eõ 	,ð	t §¡× 4Ñ 4ð 	t¸¿¹×9OÑ9Oó 	tð
 
×	!Ñ	!ð	¨v¯|©|×/GÑ/Gð 	ÐQW×Q_ÑQ_×QeÑQeð 	Ðjmò 	ó 
"ð	ð	E˜tó 	Eð 
ð
	0°D¸±Ið 
	0ÐSWÐX[ÑS\ò 
	0ó 
ô
	0r   rÖ   z3.1.0zLapply_chat_template requires jinja2>=3.1.0 to be installed. Your version is ú.c                 ó@   — t         j                  j                  | «      ‚rÌ   )r½   Ú
exceptionsÚTemplateError)Úmessages    r   Úraise_exceptionz0_compile_jinja_template.<locals>.raise_exception¢  s   € Ü×Ñ×-Ñ-¨gÓ6Ð6r   c                 ó6   — t        j                  | ||||¬«      S )N)Úensure_asciiÚindentÚ
separatorsÚ	sort_keys)rŒ   Údumps)ÚxrÞ   rß   rà   rá   s        r   Útojsonz'_compile_jinja_template.<locals>.tojson¥  s   € ô �z‰z˜!¨,¸vÐR\ÐhqÔrÐrr   c                 óH   — t        j                  «       j                  | «      S rÌ   )r   ÚnowÚstrftime)Úformats    r   Ústrftime_nowz-_compile_jinja_template.<locals>.strftime_nowª  s   € Ü�|‰|‹~×&Ñ& vÓ.Ð.r   T)Útrim_blocksÚlstrip_blocksÚ
extensionsrä   rÜ   ré   )FNNF)r   ÚImportErrorr   r   rÃ   r½   Ú__version__r   ÚextÚloopcontrolsÚfiltersÚglobalsÚfrom_string)Úchat_templaterÖ   rÜ   rä   ré   Ú	jinja_envs         r   Ú_compile_jinja_templaterö   l  sà   € äÔÜØpó
ð 	
ô(0œ9ô (0ôT ‡}�}”V×'Ñ'Ó(¬7¯=©=¸Ó+AÒAÜØZÔ[a×[mÑ[mÐZnÐnoÐpó
ð 	
ò7ósò
/ô .Ø¨Ð:JÌFÏJÉJ×LcÑLcÐ9dô€Ið #)€I×Ñ�hÑØ+:€I×ÑÐ'Ñ(Ø(4€I×Ñ�nÑ%Ø× Ñ  Ó/Ð/r   )9r[   rŒ   rw   rH   Ú
contextlibr   r   Ú	functoolsr   Útypingr   r   r   r	   r
   r   r   Ú	packagingr   Úimport_utilsr   r   r   r½   Ú
jinja2.extr   Újinja2.sandboxr   Ú	PIL.Imager   Útorchr   r/   r0   r1   r2   r&   ÚBASIC_TYPESÚcompileÚDOTALLrm   ro   ÚVERBOSEru   rp   Ú	Exceptionr   r"   rP   r5   rI   rh   rN   rƒ   r™   r¨   rö   r   r   r   ú<module>r     s�  ðó Û Û 	Û Ý %Ý Ý ß W× WÑ Wå ç UÑ Uñ ÔÛÝ$Þ<à€FáÔÝáÔÝð �E˜3  c©4°«:°sÐ;€à�—‘ÐGÈÏÉÓS€à
ˆ"�*‰*ÐHÈ"Ï)É)Ó
T€à�—
‘
ðð ‡I�I�—
‘
Ñó€ð ˆR�Z‰ZÐEÀrÇyÁyÓQ€
ô	˜yô 	ô	 	ô 	ð< cð <¨d°3¸°8©nó <ð >t˜3ð >t 4ó >tðB¨Xð ¸$ó ð*+¨Sð +°U¸8ÀC¹=È(ÐSWÉ.ÐZbÐcfÑZgÐ;gÑ5hó +ðBF4˜(ð F4 tó F4òR-ð$ ñF0ó ñF0r   