§
    
 @g[&  ã                   ó  — d 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
l
mZ ddl
mZ  G d„ d¦  «        Z G d„ de¦  «        Z G d„ de	¦  «        Z G d„ de¦  «        Zd„ Z G d„ d¦  «        Z G d„ de¦  «        ZeZdS )a|  
.. dialect:: mysql+asyncmy
    :name: asyncmy
    :dbapi: asyncmy
    :connectstring: mysql+asyncmy://user:password@host:port/dbname[?key=value&key=value...]
    :url: https://github.com/long2ice/asyncmy

Using a special asyncio mediation layer, the asyncmy dialect is usable
as the backend for the :ref:`SQLAlchemy asyncio <asyncio_toplevel>`
extension package.

This dialect should normally be used only with the
:func:`_asyncio.create_async_engine` engine creation function::

    from sqlalchemy.ext.asyncio import create_async_engine
    engine = create_async_engine("mysql+asyncmy://user:pass@hostname/dbname?charset=utf8mb4")


é    )Úasynccontextmanageré   )ÚMySQLDialect_pymysqlé   )Úpool)Úutil)ÚAdaptedConnection)Úasyncio)Úawait_fallback)Ú
await_onlyc                   óÔ   — e Zd ZdZdZd„ Zed„ ¦   «         Zed„ ¦   «         Zed„ ¦   «         Z	e	j
        d„ ¦   «         Z	ed„ ¦   «         Zd	„ Zdd„Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zdd„Zd„ Zd
S )ÚAsyncAdapt_asyncmy_cursorF)Ú_adapt_connectionÚ_connectionÚawait_Ú_cursorÚ_rowsc                 óÜ   — || _         |j        | _        |j        | _        | j                             ¦   «         }|                      |                     ¦   «         ¦  «        | _        g | _        d S ©N)r   r   r   ÚcursorÚ
__aenter__r   r   ©ÚselfÚadapt_connectionr   s      úU/var/www/piapp/venv/lib/python3.11/site-packages/sqlalchemy/dialects/mysql/asyncmy.pyÚ__init__z"AsyncAdapt_asyncmy_cursor.__init__3   s]   € Ø!1ˆÔØ+Ô7ˆÔØ&Ô-ˆŒàÔ!×(Ò(Ñ*Ô*ˆà—{’{ 6×#4Ò#4Ñ#6Ô#6Ñ7Ô7ˆŒØˆŒ
ˆ
ˆ
ó    c                 ó   — | j         j        S r   )r   Údescription©r   s    r   r   z%AsyncAdapt_asyncmy_cursor.description=   s   € àŒ|Ô'Ð'r   c                 ó   — | j         j        S r   )r   Úrowcountr    s    r   r"   z"AsyncAdapt_asyncmy_cursor.rowcountA   s   € àŒ|Ô$Ð$r   c                 ó   — | j         j        S r   ©r   Ú	arraysizer    s    r   r%   z#AsyncAdapt_asyncmy_cursor.arraysizeE   ó   € àŒ|Ô%Ð%r   c                 ó   — || j         _        d S r   r$   ©r   Úvalues     r   r%   z#AsyncAdapt_asyncmy_cursor.arraysizeI   s   € à!&ˆŒÔÐÐr   c                 ó   — | j         j        S r   )r   Ú	lastrowidr    s    r   r+   z#AsyncAdapt_asyncmy_cursor.lastrowidM   r&   r   c                 ó   — g | j         d d …<   d S r   ©r   r    s    r   ÚclosezAsyncAdapt_asyncmy_cursor.closeQ   s   € ð ˆŒ
�1�1�1‰ˆˆr   Nc                 óT   — |                       |                      ||¦  «        ¦  «        S r   )r   Ú_execute_async)r   Ú	operationÚ
parameterss      r   Úexecutez!AsyncAdapt_asyncmy_cursor.execute[   s$   € Ø�{Š{˜4×.Ò.¨y¸*ÑEÔEÑFÔFÐFr   c                 óT   — |                       |                      ||¦  «        ¦  «        S r   )r   Ú_executemany_async©r   r1   Úseq_of_parameterss      r   Úexecutemanyz%AsyncAdapt_asyncmy_cursor.executemany^   s,   € Ø�{Š{Ø×#Ò# IÐ/@ÑAÔAñ
ô 
ð 	
r   c              ƒ   óŒ  K  — | j                              ¦   «         4 ƒd {V —† |€!| j                             |¦  «        ƒ d {V —†}n!| j                             ||¦  «        ƒ d {V —†}| j        s1t          | j                             ¦   «         ƒ d {V —†¦  «        | _        |cd d d ¦  «        ƒd {V —† S # 1 ƒd {V —†swxY w Y   d S r   )r   Ú_mutex_and_adapt_errorsr   r3   Úserver_sideÚlistÚfetchallr   )r   r1   r2   Úresults       r   r0   z(AsyncAdapt_asyncmy_cursor._execute_asyncc   sq  è è € ØÔ)×AÒAÑCÔCð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ØÐ!Ø#œ|×3Ò3°IÑ>Ô>Ð>Ð>Ð>Ð>Ð>Ð>��à#œ|×3Ò3°I¸zÑJÔJÐJÐJÐJÐJÐJÐJ�àÔ#ð Aõ
 "¨¬×(=Ò(=Ñ(?Ô(?Ð"?Ð"?Ð"?Ð"?Ð"?Ð"?Ñ@Ô@�”
Øð	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s   ¢A>B3Â3
B=Ã B=c              ƒ   óÒ   K  — | j                              ¦   «         4 ƒd {V —† | j                             ||¦  «        ƒ d {V —†cd d d ¦  «        ƒd {V —† S # 1 ƒd {V —†swxY w Y   d S r   )r   r:   r   r8   r6   s      r   r5   z,AsyncAdapt_asyncmy_cursor._executemany_asyncr   s'  è è € ØÔ)×AÒAÑCÔCð 	Pð 	Pð 	Pð 	Pð 	Pð 	Pð 	Pð 	PØœ×1Ò1°)Ð=NÑOÔOÐOÐOÐOÐOÐOÐOð	Pð 	Pð 	Pð 	Pñ 	Pô 	Pð 	Pð 	Pð 	Pð 	Pð 	Pð 	Pð 	Pð 	Pð 	Pð 	Pð 	Pð 	Pð 	Pð 	Pð 	Pð 	Pð 	Pð 	Pøøøð 	Pð 	Pð 	Pð 	Pð 	Pð 	Ps   ¢!AÁ
A Á#A c                 ó   — d S r   © )r   Ú
inputsizess     r   Úsetinputsizesz'AsyncAdapt_asyncmy_cursor.setinputsizesv   s   € Øˆr   c              #   ób   K  — | j         r%| j                              d¦  «        V — | j         °#d S d S ©Nr   ©r   Úpopr    s    r   Ú__iter__z"AsyncAdapt_asyncmy_cursor.__iter__y   sJ   è è € ØŒjð 	$Ø”*—.’. Ñ#Ô#Ð#Ð#Ð#ð Œjð 	$ð 	$ð 	$ð 	$ð 	$r   c                 óH   — | j         r| j                              d¦  «        S d S rE   rF   r    s    r   Úfetchonez"AsyncAdapt_asyncmy_cursor.fetchone}   s%   € ØŒ:ð 	Ø”:—>’> !Ñ$Ô$Ð$à�4r   c                 óh   — |€| j         }| j        d|…         }| j        |d …         | j        d d …<   |S rE   )r%   r   )r   ÚsizeÚretvals      r   Ú	fetchmanyz#AsyncAdapt_asyncmy_cursor.fetchmanyƒ   s=   € Øˆ<Ø”>ˆDà”˜A˜d˜FÔ#ˆØœ
 4 5 5Ô)ˆŒ
�1�1�1‰Øˆr   c                 ó<   — | j         d d …         }g | j         d d …<   |S r   r-   )r   rM   s     r   r=   z"AsyncAdapt_asyncmy_cursor.fetchall‹   s%   € Ø”˜A˜A˜A”ˆØˆŒ
�1�1�1‰Øˆr   r   )Ú__name__Ú
__module__Ú__qualname__r;   Ú	__slots__r   Úpropertyr   r"   r%   Úsetterr+   r.   r3   r8   r0   r5   rC   rH   rJ   rN   r=   rA   r   r   r   r   '   sc  € € € € € ð €Kð€Iðð ð ð ð(ð (ñ „Xð(ð ð%ð %ñ „Xð%ð ð&ð &ñ „Xð&ð Ôð'ð 'ñ Ôð'ð ð&ð &ñ „Xð&ðð ð ðGð Gð Gð Gð
ð 
ð 
ð
ð ð ðPð Pð Pðð ð ð$ð $ð $ðð ð ðð ð ð ðð ð ð ð r   r   c                   ó6   — e Zd ZdZdZd„ Zd„ Zd„ Zd	d„Zd„ Z	dS )
ÚAsyncAdapt_asyncmy_ss_cursorrA   Tc                 óø   — || _         |j        | _        |j        | _        | j                             |j        j        j        j        ¦  «        }|                      |                     ¦   «         ¦  «        | _	        d S r   )
r   r   r   r   ÚdbapiÚasyncmyÚcursorsÚSSCursorr   r   r   s      r   r   z%AsyncAdapt_asyncmy_ss_cursor.__init__—   sk   € Ø!1ˆÔØ+Ô7ˆÔØ&Ô-ˆŒàÔ!×(Ò(ØÔ"Ô*Ô2Ô;ñ
ô 
ˆð —{’{ 6×#4Ò#4Ñ#6Ô#6Ñ7Ô7ˆŒˆˆr   c                 ó~   — | j         �5|                      | j                              ¦   «         ¦  «         d | _         d S d S r   )r   r   r.   r    s    r   r.   z"AsyncAdapt_asyncmy_ss_cursor.close¢   s=   € ØŒ<Ð#Ø�KŠK˜œ×*Ò*Ñ,Ô,Ñ-Ô-Ð-ØˆDŒLˆLˆLð $Ð#r   c                 óZ   — |                       | j                             ¦   «         ¦  «        S r   )r   r   rJ   r    s    r   rJ   z%AsyncAdapt_asyncmy_ss_cursor.fetchone§   ó"   € Ø�{Š{˜4œ<×0Ò0Ñ2Ô2Ñ3Ô3Ð3r   Nc                 ó^   — |                       | j                             |¬¦  «        ¦  «        S )N)rL   )r   r   rN   )r   rL   s     r   rN   z&AsyncAdapt_asyncmy_ss_cursor.fetchmanyª   s'   € Ø�{Š{˜4œ<×1Ò1°tÐ1Ñ<Ô<Ñ=Ô=Ð=r   c                 óZ   — |                       | j                             ¦   «         ¦  «        S r   )r   r   r=   r    s    r   r=   z%AsyncAdapt_asyncmy_ss_cursor.fetchall­   r_   r   r   )
rP   rQ   rR   rS   r;   r   r.   rJ   rN   r=   rA   r   r   rW   rW   ‘   sp   € € € € € ð €IØ€Kð	8ð 	8ð 	8ð ð  ð  ð
4ð 4ð 4ð>ð >ð >ð >ð4ð 4ð 4ð 4ð 4r   rW   c                   óv   — e Zd Z ee¦  «        ZdZd„ Zed„ ¦   «         Z	d„ Z
d„ Zd„ Zd„ Zdd	„Zd
„ Zd„ Zd„ ZdS )ÚAsyncAdapt_asyncmy_connection)rY   Ú_execute_mutexc                 óR   — || _         || _        t          j        ¦   «         | _        d S r   )rY   r   r
   ÚLockrd   )r   rY   Ú
connections      r   r   z&AsyncAdapt_asyncmy_connection.__init__·   s%   € ØˆŒ
Ø%ˆÔÝ%œl™nœnˆÔÐÐr   c                óÎ   K  — | j         4 ƒd {V —† 	 d W V — n(# t          $ r | j                             d¦  «        ‚w xY w	 d d d ¦  «        ƒd {V —† d S # 1 ƒd {V —†swxY w Y   d S )Nz7network operation failed due to asyncmy attribute error)rd   ÚAttributeErrorrY   ÚInternalErrorr    s    r   r:   z5AsyncAdapt_asyncmy_connection._mutex_and_adapt_errors¼   s  è è € àÔ&ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ðØ�����øÝ!ð ð ð Ø”j×.Ò.ØMñô ð ðøøøð ð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s#   �A’—A˜%=½AÁ
AÁ!Ac                 óX   — |rJ ‚|                       |                      ¦   «         ¦  «        S r   )r   Ú_do_ping)r   Ú	reconnects     r   Úpingz"AsyncAdapt_asyncmy_connection.pingÆ   s(   € ØÐÐÐØ�{Š{˜4Ÿ=š=™?œ?Ñ+Ô+Ð+r   c              ƒ   óÆ   K  — |                       ¦   «         4 ƒd {V —† | j                             d¦  «        ƒ d {V —†cd d d ¦  «        ƒd {V —† S # 1 ƒd {V —†swxY w Y   d S )NF)r:   r   rn   r    s    r   rl   z&AsyncAdapt_asyncmy_connection._do_pingÊ   sü   è è € Ø×/Ò/Ñ1Ô1ð 	6ð 	6ð 	6ð 	6ð 	6ð 	6ð 	6ð 	6ØÔ)×.Ò.¨uÑ5Ô5Ð5Ð5Ð5Ð5Ð5Ð5ð	6ð 	6ð 	6ð 	6ñ 	6ô 	6ð 	6ð 	6ð 	6ð 	6ð 	6ð 	6ð 	6ð 	6ð 	6ð 	6ð 	6ð 	6ð 	6ð 	6ð 	6ð 	6ð 	6ð 	6øøøð 	6ð 	6ð 	6ð 	6ð 	6ð 	6s   � AÁ
AÁAc                 ó4   — | j                              ¦   «         S r   )r   Úcharacter_set_namer    s    r   rq   z0AsyncAdapt_asyncmy_connection.character_set_nameÎ   s   € ØÔ×2Ò2Ñ4Ô4Ð4r   c                 ó`   — |                       | j                             |¦  «        ¦  «         d S r   )r   r   Ú
autocommitr(   s     r   rs   z(AsyncAdapt_asyncmy_connection.autocommitÑ   s+   € Ø�Š�DÔ$×/Ò/°Ñ6Ô6Ñ7Ô7Ð7Ð7Ð7r   Fc                 óB   — |rt          | ¦  «        S t          | ¦  «        S r   )rW   r   )r   r;   s     r   r   z$AsyncAdapt_asyncmy_connection.cursorÔ   s&   € Øð 	3Ý/°Ñ5Ô5Ð5å,¨TÑ2Ô2Ð2r   c                 ó^   — |                       | j                             ¦   «         ¦  «         d S r   )r   r   Úrollbackr    s    r   rv   z&AsyncAdapt_asyncmy_connection.rollbackÚ   s)   € Ø�Š�DÔ$×-Ò-Ñ/Ô/Ñ0Ô0Ð0Ð0Ð0r   c                 ó^   — |                       | j                             ¦   «         ¦  «         d S r   )r   r   Úcommitr    s    r   rx   z$AsyncAdapt_asyncmy_connection.commitÝ   s)   € Ø�Š�DÔ$×+Ò+Ñ-Ô-Ñ.Ô.Ð.Ð.Ð.r   c                 ó8   — | j                              ¦   «          d S r   )r   r.   r    s    r   r.   z#AsyncAdapt_asyncmy_connection.closeà   s   € àÔ×ÒÑ Ô Ð Ð Ð r   N)F)rP   rQ   rR   Ústaticmethodr   r   rS   r   r   r:   rn   rl   rq   rs   r   rv   rx   r.   rA   r   r   rc   rc   ±   sÒ   € € € € € ð ˆ\˜*Ñ%Ô%€FØ+€Ið-ð -ð -ð
 ðð ñ Ôðð,ð ,ð ,ð6ð 6ð 6ð5ð 5ð 5ð8ð 8ð 8ð3ð 3ð 3ð 3ð1ð 1ð 1ð/ð /ð /ð!ð !ð !ð !ð !r   rc   c                   ó(   — e Zd ZdZ ee¦  «        ZdS )Ú%AsyncAdaptFallback_asyncmy_connectionrA   N)rP   rQ   rR   rS   rz   r   r   rA   r   r   r|   r|   å   s"   € € € € € Ø€Iàˆ\˜.Ñ)Ô)€F€F€Fr   r|   c                 ó    — t          | ¦  «        S )zReturn x as a binary type.)Úbytes)Úxs    r   Ú_Binaryr€   ë   s   € å�‰8Œ8€Or   c                   óÖ   — e Zd Zd„ Zd„ Z ej        d¦  «        Z ej        d¦  «        Z ej        d¦  «        Z	 ej        d¦  «        Z
 ej        d¦  «        Z ee¦  «        Zd„ Zd	S )
ÚAsyncAdapt_asyncmy_dbapic                 óJ   — || _         d| _        |                      ¦   «          d S )NÚformat)rZ   Ú
paramstyleÚ_init_dbapi_attributes)r   rZ   s     r   r   z!AsyncAdapt_asyncmy_dbapi.__init__ñ   s(   € ØˆŒØ"ˆŒØ×#Ò#Ñ%Ô%Ð%Ð%Ð%r   c           	      ób   — dD ]+}t          | |t          | j        j        |¦  «        ¦  «         Œ,d S )N)ÚWarningÚErrorÚInterfaceErrorÚ	DataErrorÚDatabaseErrorÚOperationalErrorrŠ   ÚIntegrityErrorÚProgrammingErrorrj   ÚNotSupportedError)ÚsetattrÚgetattrrZ   Úerrors)r   Únames     r   r†   z/AsyncAdapt_asyncmy_dbapi._init_dbapi_attributesö   sG   € ð
ð 	Dð 	DˆDõ �D˜$¥¨¬Ô(;¸TÑ BÔ BÑCÔCÐCÐCð	Dð 	Dr   ÚSTRINGÚNUMBERÚBINARYÚDATETIMEÚ	TIMESTAMPc           
      ó"  — |                      dd¦  «        }|                      d| j        j        ¦  «        }t          j        |¦  «        r#t          | t           ||i |¤Ž¦  «        ¦  «        S t          | t           ||i |¤Ž¦  «        ¦  «        S )NÚasync_fallbackFÚasync_creator_fn)	rG   rZ   Úconnectr   Úasboolr|   r   rc   r   )r   ÚargÚkwr›   Ú
creator_fns        r   r�   z AsyncAdapt_asyncmy_dbapi.connect  s¡   € ØŸšÐ 0°%Ñ8Ô8ˆØ—V’VÐ.°´Ô0DÑEÔEˆ
åŒ;�~Ñ&Ô&ð 		Ý8ØÝ˜z˜z¨3Ð5°"Ð5Ð5Ñ6Ô6ñô ð õ
 1ØÝ˜:˜: sÐ1¨bÐ1Ð1Ñ2Ô2ñô ð r   N)rP   rQ   rR   r   r†   r   Úsymbolr•   r–   r—   r˜   r™   rz   r€   ÚBinaryr�   rA   r   r   r‚   r‚   ð   sª   € € € € € ð&ð &ð &ð
Dð Dð Dð  ˆTŒ[˜Ñ"Ô"€FØˆTŒ[˜Ñ"Ô"€FØˆTŒ[˜Ñ"Ô"€FØˆtŒ{˜:Ñ&Ô&€HØ�”˜KÑ(Ô(€IØˆ\˜'Ñ"Ô"€Fðð ð ð ð r   r‚   c                   ót   ‡ — e Zd ZdZdZdZeZdZe	d„ ¦   «         Z
e	d„ ¦   «         Zˆ fd„Zˆ fd„Zd„ Zd„ Zˆ xZS )	ÚMySQLDialect_asyncmyrZ   Tc                 ó:   — t          t          d¦  «        ¦  «        S )NrZ   )r‚   Ú
__import__)Úclss    r   Úimport_dbapiz!MySQLDialect_asyncmy.import_dbapi&  s   € å'­
°9Ñ(=Ô(=Ñ>Ô>Ð>r   c                 ó�   — |j                              dd¦  «        }t          j        |¦  «        rt          j        S t          j        S )Nr›   F)ÚqueryÚgetr   rž   r   ÚFallbackAsyncAdaptedQueuePoolÚAsyncAdaptedQueuePool)r¨   Úurlr›   s      r   Úget_pool_classz#MySQLDialect_asyncmy.get_pool_class*  s<   € àœŸšÐ'7¸Ñ?Ô?ˆåŒ;�~Ñ&Ô&ð 	.ÝÔ5Ð5åÔ-Ð-r   c                 óh   •— t          ¦   «                              |t          dd¬¦  «        ¬¦  «        S )NÚuserÚdb)ÚusernameÚdatabase)Ú_translate_args)ÚsuperÚcreate_connect_argsÚdict)r   r¯   Ú	__class__s     €r   r¸   z(MySQLDialect_asyncmy.create_connect_args3  s6   ø€ Ý‰wŒw×*Ò*Ø¥¨vÀÐ!EÑ!EÔ!Eð +ñ 
ô 
ð 	
r   c                 ó    •— t          ¦   «                              |||¦  «        rdS t          |¦  «                             ¦   «         }d|v pd|v S )NTznot connectedznetwork operation failed)r·   Úis_disconnectÚstrÚlower)r   Úerg   r   Ústr_erº   s        €r   r¼   z"MySQLDialect_asyncmy.is_disconnect8  sQ   ø€ Ý‰7Œ7× Ò   J°Ñ7Ô7ð 	Ø�4å˜‘F”F—L’L‘N”NˆEà 5Ð(ÐOÐ,FÈ%Ð,Oðr   c                 ó   — ddl m} |j        S )Nr   )ÚCLIENT)Úasyncmy.constantsrÂ   Ú
FOUND_ROWS)r   rÂ   s     r   Ú_found_rows_client_flagz,MySQLDialect_asyncmy._found_rows_client_flagA  s   € Ø,Ð,Ð,Ð,Ð,Ð,àÔ Ð r   c                 ó   — |j         S r   )r   )r   rg   s     r   Úget_driver_connectionz*MySQLDialect_asyncmy.get_driver_connectionF  s   € ØÔ%Ð%r   )rP   rQ   rR   ÚdriverÚsupports_statement_cacheÚsupports_server_side_cursorsrW   Ú	_sscursorÚis_asyncÚclassmethodr©   r°   r¸   r¼   rÅ   rÇ   Ú__classcell__)rº   s   @r   r¥   r¥     s¾   ø€ € € € € Ø€FØ#Ðà#'Ð Ø,€Ià€Hàð?ð ?ñ „[ð?ð ð.ð .ñ „[ð.ð
ð 
ð 
ð 
ð 
ð
ð ð ð ð ð!ð !ð !ð
&ð &ð &ð &ð &ð &ð &r   r¥   N)Ú__doc__Ú
contextlibr   Úpymysqlr   Ú r   r   Úenginer	   Úutil.concurrencyr
   r   r   r   rW   rc   r|   r€   r‚   r¥   ÚdialectrA   r   r   ú<module>rÖ      sÄ  ððð ð& +Ð *Ð *Ð *Ð *Ð *à )Ð )Ð )Ð )Ð )Ð )Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø .Ð .Ð .Ð .Ð .Ð .Ø *Ð *Ð *Ð *Ð *Ð *ðgð gð gð gð gñ gô gð gðT4ð 4ð 4ð 4ð 4Ð#<ñ 4ô 4ð 4ð@1!ð 1!ð 1!ð 1!ð 1!Ð$5ñ 1!ô 1!ð 1!ðh*ð *ð *ð *ð *Ð,Iñ *ô *ð *ðð ð ð
*ð *ð *ð *ð *ñ *ô *ð *ðZ*&ð *&ð *&ð *&ð *&Ð/ñ *&ô *&ð *&ðZ €€€r   