Ë
    µŒj®;  ã                  ó^  — d dl mZ d dlZd dlZd dlZd dlmZmZmZm	Z	m
Z
mZmZmZmZmZmZm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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'  ejP                  e)«      Z* ed«      Z+dd„Z,dd„Z-dd„Z.dd„Z/dd„Z0dd„Z1	 	 	 	 dd„Z2 G d„ de«      Z3y)é    )ÚannotationsN)ÚAnyÚAsyncIterableÚAsyncIteratorÚCallableÚDictÚIterableÚIteratorÚListÚMappingÚOptionalÚTupleÚTypeVar)ÚAsyncCallbackManagerForLLMRunÚCallbackManagerForLLMRun)ÚBaseLLM)Ú
GenerationÚGenerationChunkÚ	LLMResult)Úget_from_dict_or_envÚpre_init)ÚField)Ú	HTTPError)Úbefore_sleep_logÚretryÚretry_if_exception_typeÚstop_after_attemptÚwait_exponentialÚTÚTongyic           
     óº   — d}d}t        dt        | j                  «      t        d||¬«      t	        t
        «      t        t        t        j                  «      ¬«      S )Né   é   T)Ú
multiplierÚminÚmax)ÚreraiseÚstopÚwaitr   Úbefore_sleep)
r   r   Úmax_retriesr   r   r   r   ÚloggerÚloggingÚWARNING)ÚllmÚmin_secondsÚmax_secondss      úi/var/www/html/Fitness-lenito-AI-main/venv/lib/python3.12/site-packages/langchain_community/llms/tongyi.pyÚ_create_retry_decoratorr3   *   sL   € Ø€KØ€Kô ØÜ §¡Ó0Ü¨°ÀÔMÜ&¤yÓ1Ü%¤f¬g¯o©oÓ>ôð ó    c                ó¨   — | d   dk(  r| S | d   dv r#t        d| d   › d| d   › d| d   › d	| d
   › �«      ‚t        d| d   › d| d   › d	| d
   › �| ¬«      ‚)z,Check the response from the completion call.Ústatus_codeéÈ   )i�  i‘  zrequest_id: Ú
request_idz 
 status_code: z	 
 code: Úcodez 
 message: Úmessagez"HTTP error occurred: status_code: )Úresponse)Ú
ValueErrorr   )Úresps    r2   Úcheck_responser>   8   s©   € àˆMÑ˜cÒ!ØˆØ	ˆmÑ	 
Ñ	*ÜØ˜4 Ñ-Ð.ð /Ø  Ñ/Ð0ð 1Ø˜&‘\�N -°°Y±Ð/@ðBó
ð 	
ô Ø0°°mÑ1DÐ0Eð FØ˜&‘\�N -°°Y±Ð/@ðBàô
ð 	
r4   c                ó@   ‡ — t        ‰ «      }|dˆ fd„«       } |di |¤ŽS )ú*Use tenacity to retry the completion call.c                 óR   •—  ‰j                   j                  di | ¤Ž}t        |«      S ©N© ©ÚclientÚcallr>   )Ú_kwargsr=   r/   s     €r2   Ú_generate_with_retryz1generate_with_retry.<locals>._generate_with_retryN   s%   ø€ àˆs�z‰z�‰Ñ) Ñ)ˆÜ˜dÓ#Ð#r4   ©rG   r   Úreturnr   rC   ©r3   )r/   ÚkwargsÚretry_decoratorrH   s   `   r2   Úgenerate_with_retryrN   J   s/   ø€ ä-¨cÓ2€Oàô$ó ð$ñ  Ñ) &Ñ)Ð)r4   c                ó@   ‡ — t        ‰ «      }|dˆ fd„«       } |di |¤ŽS )r@   c               ;  ón   •K  —  ‰j                   j                  di | ¤Ž}|D ]  }t        |«      –— Œ y ­wrB   rD   )rG   Ú	responsesr=   r/   s      €r2   Ú_stream_generate_with_retryz?stream_generate_with_retry.<locals>._stream_generate_with_retryZ   s3   øè ø€ à#�C—J‘J—O‘OÑ. gÑ.ˆ	ÛˆDÜ  Ó&Ó&ñ ùs   ƒ25rI   rC   rK   )r/   rL   rM   rR   s   `   r2   Ústream_generate_with_retryrS   V   s/   ø€ ä-¨cÓ2€Oàô'ó ð'ñ
 'Ñ0¨Ñ0Ð0r4   c               óV   K  —  G d„ d«      } || fi |¤Ž2 3 d{  –—† }|­–— Œ7 Œ
6 y­w)z­Async version of `stream_generate_with_retry`.

    Because the dashscope SDK doesn't provide an async API,
    we wrap `stream_generate_with_retry` with an async generator.c                  ó,   — e Zd Zdd„Zdd„Zdd„Zdd„Zy)	ú8astream_generate_with_retry.<locals>._AioTongyiGeneratorc                ó&   — t        |fi |¤Ž| _        y ©N)rS   Ú	generator)ÚselfÚ_llmrG   s      r2   Ú__init__zAastream_generate_with_retry.<locals>._AioTongyiGenerator.__init__j   s   € Ü7¸ÑHÀÑHˆD�Nr4   c                ó   — | S rX   rC   ©rZ   s    r2   Ú	__aiter__zBastream_generate_with_retry.<locals>._AioTongyiGenerator.__aiter__m   s   € ØˆKr4   c              “  óŽ   K  — t        j                  «       j                  d | j                  «      ƒ d {  –—† }|�|S t        ‚7 Œ­wrX   )ÚasyncioÚget_running_loopÚrun_in_executorÚ
_safe_nextÚStopAsyncIteration)rZ   Úvalues     r2   Ú	__anext__zBastream_generate_with_retry.<locals>._AioTongyiGenerator.__anext__p   sE   è ø€ Ü!×2Ñ2Ó4×DÑDØ�d—o‘oó÷ ˆEð Ð Ø�ä(Ð(ðús   ‚2A´AµAc                óL   — 	 t        | j                  «      S # t        $ r Y y w xY wrX   )ÚnextrY   ÚStopIterationr^   s    r2   rd   zCastream_generate_with_retry.<locals>._AioTongyiGenerator._safe_nexty   s(   € ðÜ˜DŸN™NÓ+Ð+øÜ ò Ùðús   ‚ —	#¢#N)r[   r    rG   r   )rJ   zAsyncIterator[Any])rJ   r   )Ú__name__Ú
__module__Ú__qualname__r\   r_   rg   rd   rC   r4   r2   Ú_AioTongyiGeneratorrV   i   s   „ ó	Ió	ó	)ô	r4   rn   NrC   )r/   rL   rn   Úchunks       r2   Úastream_generate_with_retryrp   c   s4   è ø€ ÷ñ ñ, +¨3Ñ9°&Ò9÷ ˆeØŒðøÑ9ùs   ‚)–'š%›'ž)¥'§)c              #  ó‚   K  — t        | «      }	 t        |«      }|D ]
  }|df–— |}Œ |df–— y# t        $ r Y yw xY w­w)z[Generate elements from an iterable,
    and a boolean indicating if it is the last element.NFT)Úiterri   rj   ©ÚiterableÚiteratorÚitemÚ	next_items       r2   Úgenerate_with_last_element_markrx   ƒ   sY   è ø€ ô �H‹~€HðÜ�H‹~ˆó ˆ	Ø�EˆkÒØ‰ð ð �ˆ*Óøô ò Ùðüs   ‚?�0 š?°	<¹?»<¼?c               ó¾   K  — | j                  «       }	 |j                  «       ƒ d{  –—† }|2 3 d{  –—† }|df­–— |}Œ7 Œ# t        $ r Y yw xY w7 Œ6 |df­–— y­w)zaGenerate elements from an async iterable,
    and a boolean indicating if it is the last element.NFT)r_   rg   re   rs   s       r2   Ú agenerate_with_last_element_markrz   ‘   sr   è ø€ ð
 ×!Ñ!Ó#€HðØ×'Ñ'Ó)×)ˆñ $÷ ˆiØ�EˆkÓØ‰ð *ùÜò Ùðúðø˜8ð �ˆ*ÔùsW   ‚A”A §A¨A ¬A®A²A³A¶AÁA Á	AÁAÁAÁAÁAÁ	Ac                  óÌ  ‡ — e Zd ZU dZed%d„«       ZdZded<    edd¬«      Z	d	ed
<   	  ee
¬«      Zded<   dZded<   	  edd¬«      Zded<   	 dZded<   	 dZded<   	 ed&d„«       Zed'd„«       Zed(d„«       Zed)ˆ fd„«       Z	 	 d*	 	 	 	 	 	 	 	 	 d+d„Z	 	 d*	 	 	 	 	 	 	 	 	 d,d„Z	 	 d*	 	 	 	 	 	 	 	 	 d-d „Z	 	 d*	 	 	 	 	 	 	 	 	 d.d!„Zd/d"„Ze	 d0	 	 	 	 	 d1d#„«       Zed2d$„«       Zˆ xZS )3r    uP	  Tongyi completion model integration.

    Setup:
        Install ``dashscope`` and set environment variables ``DASHSCOPE_API_KEY``.

        .. code-block:: bash

            pip install dashscope
            export DASHSCOPE_API_KEY="your-api-key"

    Key init args â€” completion params:
        model: str
            Name of Tongyi model to use.
        top_p: float
            Total probability mass of tokens to consider at each step.
        streaming: bool
            Whether to stream the results or not.

    Key init args â€” client params:
        api_key: Optional[str]
            Dashscope API KEY. If not passed in will be read from env var DASHSCOPE_API_KEY.
        max_retries: int
            Maximum number of retries to make when generating.

    See full list of supported init args and their descriptions in the params section.

    Instantiate:
        .. code-block:: python

            from langchain_community.llms import Tongyi

            llm = Tongyi(
                model="qwen-max",
                # top_p="...",
                # api_key="...",
                # other params...
            )

    Invoke:
        .. code-block:: python

            input_text = "ç”¨50ä¸ªå­—å·¦å�³é˜�è¿°ï¼Œç”Ÿå‘½çš„æ„�ä¹‰åœ¨äºŽ"
            llm.invoke(input_text)

        .. code-block:: python

            'æŽ¢ç´¢ã€�æˆ�é•¿ã€�è¿žæŽ¥ä¸Žçˆ±â€”â€”åœ¨æœ‰é™�çš„æ—¶é—´é‡Œï¼Œä¸�æ–­å­¦ä¹ ã€�ä½“éªŒã€�è´¡çŒ®å¹¶å¯»æ‰¾ä¸Žä¸–ç•Œå’Œè°�å…±å­˜ä¹‹é�“ï¼Œè®©æ¯�ä¸€åˆ»å……æ»¡ä»·å€¼ä¸Žæ„�ä¹‰ã€‚'

    Stream:
        .. code-block:: python

            for chunk in llm.stream(input_text):
                print(chunk)

        .. code-block:: python

            æŽ¢ç´¢ | ã€� | æˆ�é•¿ | ã€�è¿žæŽ¥ä¸Žçˆ±ã€‚ | åœ¨æœ‰é™�çš„æ—¶é—´é‡Œï¼Œå¯»æ‰¾ä¸ªäººä»·å€¼ï¼Œ | è´¡çŒ®äºŽä»–äººï¼Œå…±å�Œä½“éªŒä¸–ç•Œçš„ç¾Žå¥½ | ï¼Œè®©ä¸–ç•Œå› è‡ªå·±çš„å­˜åœ¨è€Œæ›´ | æ¸©æš–ã€‚

    Async:
        .. code-block:: python

            await llm.ainvoke(input_text)

            # stream:
            # async for chunk in llm.astream(input_text):
            #    print(chunk)

            # batch:
            # await llm.abatch([input_text])

        .. code-block:: python

            'æŽ¢ç´¢ã€�æˆ�é•¿ã€�è¿žæŽ¥ä¸Žçˆ±ã€‚åœ¨æœ‰é™�çš„æ—¶é—´é‡Œï¼Œå¯»æ‰¾ä¸ªäººä»·å€¼ï¼Œè´¡çŒ®äºŽä»–äººå’Œç¤¾ä¼šï¼Œä½“éªŒä¸°å¯Œå¤šå½©çš„æƒ…æ„Ÿä¸Žç»�åŽ†ï¼Œä¸�æ–­å­¦ä¹ è¿›æ­¥ï¼Œè®©ä¸–ç•Œå› è‡ªå·±çš„å­˜åœ¨è€Œæ›´ç¾Žå¥½ã€‚'

    c                ó
   — ddiS )NÚdashscope_api_keyÚDASHSCOPE_API_KEYrC   r^   s    r2   Ú
lc_secretszTongyi.lc_secretsî   s   € à#Ð%8Ð9Ð9r4   Nr   rE   z	qwen-plusÚmodel)ÚdefaultÚaliasÚstrÚ
model_name)Údefault_factoryúDict[str, Any]Úmodel_kwargsgš™™™™™é?ÚfloatÚtop_pÚapi_keyzOptional[str]r}   FÚboolÚ	streamingé
   Úintr+   c                 ó   — y)zReturn type of llm.ÚtongyirC   r^   s    r2   Ú	_llm_typezTongyi._llm_type  s   € ð r4   c                ó´   — t        |ddgd«      |d<   	 ddl}	 |j                  |d<   |S # t        $ r t        d«      ‚w xY w# t        $ r t        d«      ‚w xY w)	z?Validate that api key and python package exists in environment.r}   rŠ   r~   r   NzZCould not import dashscope python package. Please install it with `pip install dashscope`.rE   z¢`dashscope` has no `Generation` attribute, this is likely due to an old version of the dashscope package. Try upgrading it with `pip install --upgrade dashscope`.)r   Ú	dashscopeÚImportErrorr   ÚAttributeErrorr<   )ÚclsÚvaluesr“   s      r2   Úvalidate_environmentzTongyi.validate_environment	  sŒ   € ô ';ØÐ(¨)Ð4Ð6Ió'
ˆÐ"Ñ#ð	Ûð	Ø(×3Ñ3ˆF�8Ñð ˆøô ò 	ÜðBóð ð	ûô ò 	Üð:óð ð	ús   ”* ™A ª?ÁAc                ój   — | j                   | j                  | j                  dœ}i |¥| j                  ¥S )z7Get the default parameters for calling Tongyi Qwen API.)r€   r‰   rŠ   )r„   r‰   r}   r‡   )rZ   Únormal_paramss     r2   Ú_default_paramszTongyi._default_params!  s:   € ð —_‘_Ø—Z‘ZØ×-Ñ-ñ
ˆð 6�-Ð5 4×#4Ñ#4Ð5Ð5r4   c                ó4   •— d| j                   it        ‰| �  ¥S )Nr„   )r„   ÚsuperÚ_identifying_params)rZ   Ú	__class__s    €r2   rž   zTongyi._identifying_params,  s   ø€ à˜dŸo™oÐM´±Ñ1LÐMÐMr4   c           
     óÆ  — g }| j                   rht        |«      dkD  rt        d«      ‚d } | j                  |d   ||fi |¤ŽD ]  }|€|}Œ||z  }Œ |€J ‚|j	                  | j                  |«      g«       nS | j                  dd|i|¤Ž}|D ]:  }	t        | fd|	i|¤Ž}
|j	                  t        di | j                  |
«      ¤Žg«       Œ< t        |d| j                  i¬«      S )	Nr"   ú,Cannot stream results with multiple prompts.r   r(   Úpromptr„   ©ÚgenerationsÚ
llm_outputrC   )rŒ   Úlenr<   Ú_streamÚappendÚ_chunk_to_generationÚ_invocation_paramsrN   r   Ú_generation_from_qwen_respr   r„   ©rZ   Úpromptsr(   Úrun_managerrL   r¤   Ú
generationro   Úparamsr¢   Ú
completions              r2   Ú	_generatezTongyi._generate0  s  € ð ˆØ�>Š>Ü�7‹|˜aÒÜ Ð!OÓPÐPØ48ˆJØ%˜Ÿ™ g¨a¡j°$¸ÑNÀvÔN�ØÐ%Ø!&‘Jà %Ñ'‘Jð	 Oð
 Ð)Ð)Ð)Ø×Ñ × 9Ñ 9¸*Ó EÐFÕGà%< T×%<Ñ%<Ñ%QÀ$Ð%QÈ&Ñ%QˆFÛ!�Ü0°ÑO¸fÐOÈÑO�
Ø×"Ñ"ÜÑN $×"AÑ"AÀ*Ó"MÑNÐOõð "ô
 Ø#à˜dŸo™oðô
ð 	
r4   c              ‹  óX  K  — g }| j                   rGt        |«      dkD  rt        d«      ‚d } | j                  |d   ||fi |¤Ž2 3 d {  –—† }|€|}Œ||z  }Œ | j                  dd|i|¤Ž}|D ]u  }	t        j                  «       j                  d t        j                  t        fi | |	dœ|¥¤Ž«      ƒ d {  –—† }
|j	                  t        di | j                  |
«      ¤Žg«       Œw t        |d| j                   i¬«      S 7 Œ¶6 |€J ‚|j	                  | j                  |«      g«       ŒB7 Œr­w)	Nr"   r¡   r   r(   )r/   r¢   r„   r£   rC   )rŒ   r¦   r<   Ú_astreamr¨   r©   rª   ra   rb   rc   Ú	functoolsÚpartialrN   r   r«   r   r„   r¬   s              r2   Ú
_ageneratezTongyi._agenerateQ  sT  è ø€ ð ˆØ�>Š>Ü�7‹|˜aÒÜ Ð!OÓPÐPØ48ˆJØ,˜tŸ}™}¨W°Q©Z¸¸{ÑUÈfÒU÷ (�eØÐ%Ø!&‘Jà %Ñ'‘Jð &= T×%<Ñ%<Ñ%QÀ$Ð%QÈ&Ñ%QˆFÛ!�Ü#*×#;Ñ#;Ó#=×#MÑ#MØÜ×%Ñ%Ü+ñØ7;ÀvÑ/XÐQWÐ/Xñó$÷ �
ð ×"Ñ"ÜÑN $×"AÑ"AÀ*Ó"MÑNÐOõð "ô Ø#à˜dŸo™oðô
ð 	
ð'(øÐUð
 Ð)Ð)Ð)Ø×Ñ × 9Ñ 9¸*Ó EÐFÕGðús8   ‚AD*ÁDÁC?Á	DÁA)D*Â5D(Â6A	D*Ã?DÄ(D*c           	   +  ó  K  —  | j                   d|ddœ|¤Ž}t        t        | fd|i|¤Ž«      D ]N  \  }}t        di | j	                  ||«      ¤Ž}|r(|j                  |j                  || j                  ¬«       |–— ŒP y ­w©NT)r(   Ústreamr¢   )ro   ÚverboserC   )rª   rx   rS   r   r«   Úon_llm_new_tokenÚtextr»   ©	rZ   r¢   r(   r®   rL   r°   Ústream_respÚis_last_chunkro   s	            r2   r§   zTongyi._streamw  s¦   è ø€ ð "9 ×!8Ñ!8ð "
Ø˜dñ"
Ø&,ñ"
ˆô +JÜ& tÑE°FÐE¸fÑEö+
Ñ&ˆK˜ô $ñ Ø×1Ñ1°+¸}ÓMñˆEñ Ø×,Ñ,Ø—J‘JØØ ŸL™Lð -ô ð
 ‹Kñ+
ùs   ‚A?Bc           	    ó,  K  —  | j                   d|ddœ|¤Ž}t        t        | fd|i|¤Ž«      2 3 d {  –—† \  }}t        di | j	                  ||«      ¤Ž}|r0|j                  |j                  || j                  ¬«      ƒ d {  –—†  |­–— Œ_7 ŒZ7 Œ6 y ­wr¹   )rª   rz   rp   r   r«   r¼   r½   r»   r¾   s	            r2   r´   zTongyi._astream�  sÁ   è ø€ ð "9 ×!8Ñ!8ð "
Ø˜dñ"
Ø&,ñ"
ˆô 1QÜ'¨ÑF°VÐF¸vÑFô1
÷ 	Ñ,�+˜}ô $ñ Ø×1Ñ1°+¸}ÓMñˆEñ Ø!×2Ñ2Ø—J‘JØØ ŸL™Lð 3ó ÷ ð ð
 ŒKð	øðøñ1
ùs8   ‚-B¯B³B´B·ABÂBÂ
BÂBÂBÂBc                ó`   — i | j                   ¥|¥}|�||d<   |j                  d«      rd|d<   |S )Nr(   rº   TÚincremental_output)r›   Úget)rZ   r(   rL   r°   s       r2   rª   zTongyi._invocation_params§  sL   € ð
Ø×"Ñ"ð
àð
ˆð ÐØ!ˆF�6‰NØ�:‰:�hÔØ+/ˆFÐ'Ñ(Øˆr4   c                ó’   — |r4t        | d   d   t        | d   d   | d   t        | d   «      ¬«      ¬«      S t        | d   d   ¬«      S )	NÚoutputr½   Úfinish_reasonr8   Úusage)rÇ   r8   Útoken_usage©r½   Úgeneration_info)r½   )Údict)r=   rÀ   s     r2   r«   z!Tongyi._generation_from_qwen_resp²  s^   € ñ ÜØ˜(‘^ FÑ+Ü $Ø"& x¡.°Ñ"AØ# LÑ1Ü $ T¨'¡]Ó 3ô!ôð ô ˜T (™^¨FÑ3Ô4Ð4r4   c                óD   — t        | j                  | j                  ¬«      S )NrÊ   )r   r½   rË   )ro   s    r2   r©   zTongyi._chunk_to_generationÉ  s   € äØ—‘Ø!×1Ñ1ô
ð 	
r4   )rJ   zDict[str, str])rJ   rƒ   )r—   r   rJ   r   )rJ   r†   )rJ   zMapping[str, Any])NN)
r­   ú	List[str]r(   úOptional[List[str]]r®   ú"Optional[CallbackManagerForLLMRun]rL   r   rJ   r   )
r­   rÎ   r(   rÏ   r®   ú'Optional[AsyncCallbackManagerForLLMRun]rL   r   rJ   r   )
r¢   rƒ   r(   rÏ   r®   rÐ   rL   r   rJ   zIterator[GenerationChunk])
r¢   rƒ   r(   rÏ   r®   rÑ   rL   r   rJ   zAsyncIterator[GenerationChunk])r(   r   rL   r   rJ   r†   )T)r=   r   rÀ   r‹   rJ   r†   )ro   r   rJ   r   )rk   rl   rm   Ú__doc__Úpropertyr   rE   Ú__annotations__r   r„   rÌ   r‡   r‰   r}   rŒ   r+   r‘   r   r˜   r›   rž   r²   r·   r§   r´   rª   Ústaticmethodr«   r©   Ú__classcell__)rŸ   s   @r2   r    r    ¡   s  ø… ñJðX ò:ó ð:ð €FˆCÓÙ K°wÔ?€J�Ó?àÙ#(¸Ô#>€L�.Ó>à€Eˆ5ÓØDá',°TÀÔ'KÐ�}ÓKØ5à€IˆtÓØ/à€K�ÓØ<àòó ðð òó ðð. ò6ó ð6ð ôNó ðNð %)Ø:>ð	
àð
ð "ð
ð 8ð	
ð
 ð
ð 
ó
ðH %)Ø?Cð	$
àð$
ð "ð$
ð =ð	$
ð
 ð$
ð 
ó$
ðR %)Ø:>ð	àðð "ðð 8ð	ð
 ðð 
#óð6 %)Ø?Cð	àðð "ðð =ð	ð
 ðð 
(óó0	ð à)-ð5Øð5Ø"&ð5à	ò5ó ð5ð, ò
ó ô
r4   )r/   r    rJ   zCallable[[Any], Any])r=   r   rJ   r   )r/   r    rL   r   rJ   r   )rt   zIterable[T]rJ   zIterator[Tuple[T, bool]])rt   zAsyncIterable[T]rJ   zAsyncIterator[Tuple[T, bool]])4Ú
__future__r   ra   rµ   r-   Útypingr   r   r   r   r   r	   r
   r   r   r   r   r   Úlangchain_core.callbacksr   r   Ú#langchain_core.language_models.llmsr   Úlangchain_core.outputsr   r   r   Úlangchain_core.utilsr   r   Úpydanticr   Úrequests.exceptionsr   Útenacityr   r   r   r   r   Ú	getLoggerrk   r,   r   r3   r>   rN   rS   rp   rx   rz   r    rC   r4   r2   Ú<module>rá      s§   ðÝ "ã Û Û ÷÷ ÷ ó ÷õ 8ß IÑ Iß ?Ý Ý )÷õ ð 
ˆ×	Ñ	˜8Ó	$€ÙˆCƒL€óó
ó$	*ó
1óó@ðØðà"óô m
ˆWõ m
r4   