§
    nÈj  ã                   ó˜   — d Z ddlZddlmc mZ ddlZddlZddl	m
Z
  G d„ d¦  «        Z G d„ d¦  «        Zd„ Zd	„ Zd
„ Zd„ Zd„ Zd„ ZdS )a©  JsonUnixSocket must reconnect after the daemon it talks to goes away.

A socket object survives its peer. If ``start()`` treats "self.socket is not
None" as "connected", a restarted Codex daemon leaves the gateway pinned to a
dead connection: every later call fails instantly, ``generation`` never moves,
and the adapter never re-reads quota. These tests pin the reconnect contract so
that regression cannot return silently.
é    N)ÚJsonUnixSocketc                   ó2   — e Zd ZdZd	d„Zd„ Zd„ Zd„ Zd„ ZdS )
Ú
FakeSocketz4Minimal stand-in for a websockets client connection.é   c                 ó0   — || _         g | _        d| _        d S )NF)ÚstateÚsentÚclosed)Úselfr   s     úa/home/lighthouse/esp32-dev/.cache/main-promotion-test-20261009/server/tests/test_rpc_reconnect.pyÚ__init__zFakeSocket.__init__   s   € ØˆŒ
ØˆŒ	ØˆŒˆˆó    c                 ó   — | S ©N© ©r   s    r   Ú	__aiter__zFakeSocket.__aiter__   s   € Øˆr   c              ƒ   ót   K  — | j         dk    r%t          j        d¦  «        ƒ d {V —† | j         dk    °%t          ‚)Né   g{®Gáz„?)r   ÚasyncioÚsleepÚStopAsyncIterationr   s    r   Ú	__anext__zFakeSocket.__anext__   sF   è è € àŒj˜AŠoˆoÝ”- Ñ%Ô%Ð%Ð%Ð%Ð%Ð%Ð%Ð%ð Œj˜AŠoˆoå Ð r   c              ƒ   ó>   K  — | j                              |¦  «         d S r   )r	   Úappend)r   Úpayloads     r   ÚsendzFakeSocket.send!   s"   è è € ØŒ	×Ò˜Ñ!Ô!Ð!Ð!Ð!r   c              ƒ   ó&   K  — d| _         d| _        d S )NTr   )r
   r   r   s    r   ÚclosezFakeSocket.close$   s   è è € ØˆŒØˆŒ
ˆ
ˆ
r   N)r   )	Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r   r   r   r   r      sj   € € € € € Ø>Ð>ðð ð ð ð
ð ð ð!ð !ð !ð"ð "ð "ðð ð ð ð r   r   c                   ó   — e Zd ZdZd„ Zd„ ZdS )ÚFakeConnectzARecords every connection attempt and hands back scripted sockets.c                 ó"   — g | _         g | _        d S r   )ÚcallsÚcreatedr   s    r   r   zFakeConnect.__init__,   s   € ØˆŒ
ØˆŒˆˆr   c                 óª   ‡— | j                              ||f¦  «         t          ¦   «         Š| j                             ‰¦  «         ˆfd„} |¦   «         S )Nc               “   ó   •K  — ‰ S r   r   )Úsockets   €r   Úattemptz%FakeConnect.__call__.<locals>.attempt5   s   øè è € ØˆMr   )r'   r   r   r(   )r   ÚpathÚkwargsr,   r+   s       @r   Ú__call__zFakeConnect.__call__0   sc   ø€ ØŒ
×Ò˜4 ˜.Ñ)Ô)Ð)Ý‘”ˆØŒ×Ò˜FÑ#Ô#Ð#ð	ð 	ð 	ð 	ð 	ð ˆw‰yŒyÐr   N)r    r!   r"   r#   r   r/   r   r   r   r%   r%   )   s8   € € € € € ØKÐKðð ð ðð ð ð ð r   r%   c                 óL   — |                       d|¦  «         t          d¦  «        S )Nz'device_gateway.control.rpc.unix_connectz/tmp/fake-codex.sock)Úsetattrr   )ÚmonkeypatchÚconnects     r   Úsocket_transportr4   ;   s(   € Ø×ÒÐAÀ7ÑKÔKÐKÝÐ0Ñ1Ô1Ð1r   c                 óŠ   ‡‡— t          ¦   «         Št          | ‰¦  «        Šˆˆfd„}t          j         |¦   «         ¦  «         d S )Nc               “   óæ  •K  — ‰                      ¦   «         ƒ d {V —† ‰
j        } t          | ¦  «        }d}||k    }|�st          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        nddt          j        ¦   «         v st          j        ‰
¦  «        rt          j        ‰
¦  «        ndt          j        | ¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j
        |¦  «        ¦  «        ‚d x} x}x}}‰j        }d}||k    }|sªt          j        d|fd	||f¦  «        d
t          j        ¦   «         v st          j        ‰¦  «        rt          j        ‰¦  «        nd
t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }	t          t          j
        |	¦  «        ¦  «        ‚d x}x}}‰j        }‰
j        d         }||u }|sªt          j        d|fd||f¦  «        d
t          j        ¦   «         v st          j        ‰¦  «        rt          j        ‰¦  «        nd
t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }	t          t          j
        |	¦  «        ¦  «        ‚d x}x}}‰                     ¦   «         ƒ d {V —† d S )Nr   ©ú==©zK%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.calls
})
} == %(py8)sÚlenr3   ©Úpy0Úpy1Úpy3Úpy5Úpy8zassert %(py10)sÚpy10©z2%(py2)s
{%(py2)s = %(py0)s.generation
} == %(py5)sÚrpc©r<   Úpy2r?   úassert %(py7)sÚpy7r   ©Úis©z.%(py2)s
{%(py2)s = %(py0)s.socket
} is %(py5)s)Ústartr'   r:   Ú
@pytest_arÚ_call_reprcompareÚ@py_builtinsÚlocalsÚ_should_repr_global_nameÚ	_safereprÚAssertionErrorÚ_format_explanationÚ
generationr+   r(   r   ©Ú@py_assert2Ú@py_assert4Ú@py_assert7Ú@py_assert6Ú@py_format9Ú@py_format11Ú@py_assert1Ú@py_assert3Ú@py_format6Ú@py_format8r3   rC   s             €€r   Úscenarioz?test_start_connects_once_and_bumps_generation.<locals>.scenarioD   sL  øè è € Ø�iŠi‰kŒkÐÐÐÐÐÐÐØ”=Ð&�s�=Ñ!Ô!Ð& QÐ&Ð! QÒ&Ð&Ð&Ñ&Õ&Ô&Ð&Ð&Ð&Ð&Ð! QÐ&Ñ&Ô&Ð&Õ&Ô&Ñ&Ô&Ð&Ð&Õ&Ô&�sÑ&Ô&Ð&Õ&Ô&�sÑ&Ô&Ð&Ð&Ð&Õ&Ô&Ñ&Ô&Ð&Ð&Õ&Ô&�7Ñ&Ô&Ð&Õ&Ô&�7Ñ&Ô&Ð&Ð&Õ&Ô&�=Ñ&Ô&Õ&Ô&Ð!Ñ&Ô&Õ&Ô& QÑ&Ô&Ð&Ð&Ñ&Ð&Ð&Ð&Ð&Ð&Ñ&Ð&Õ&Õ&Ô&Ð&Ñ&Ô&Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&ØŒ~Ð" Ð"ˆ~ Ò"Ð"Ð"Ð"Õ"Ô"Ð"Ð"Ð"Ð"ˆ~ Ð"Ñ"Ô"Ð"Õ"Ô"Ñ"Ô"Ð"Ð"Õ"Ô"ˆsÑ"Ô"Ð"Õ"Ô"ˆsÑ"Ô"Ð"Ð"Õ"Ô"ˆ~Ñ"Ô"Õ"Ô" Ñ"Ô"Ð"Ð"Ñ"Ð"Ð"Ð"Ð"Ð"Ñ"Ð"Õ"Õ"Ô"Ð"Ñ"Ô"Ñ"Ô"Ð"Ð"Ð"Ð"Ð"Ð"Ð"ØŒzÐ/˜Wœ_¨QÔ/Ð/ˆzÐ/Ð/Ð/Ð/Ð/Õ/Ô/Ð/Ð/Ð/Ð/ˆzÐ/Ð/Ñ/Ô/Ð/Õ/Ô/Ñ/Ô/Ð/Ð/Õ/Ô/ˆsÑ/Ô/Ð/Õ/Ô/ˆsÑ/Ô/Ð/Ð/Õ/Ô/ˆzÑ/Ô/Õ/Ô/Ð/Ñ/Ô/Ð/Ð/Ñ/Ð/Ð/Ð/Ð/Ð/Ñ/Ð/Õ/Õ/Ô/Ð/Ñ/Ô/Ñ/Ô/Ð/Ð/Ð/Ð/Ð/Ð/Ð/Ø�iŠi‰kŒkÐÐÐÐÐÐÐÐÐr   ©r%   r4   r   Úrun©r2   r`   r3   rC   s     @@r   Ú-test_start_connects_once_and_bumps_generationrd   @   óX   øø€ Ý‰mŒm€GÝ
˜;¨Ñ
0Ô
0€Cðð ð ð ð ð õ „K��‘
”
ÑÔÐÐÐr   c                 óŠ   ‡‡— t          ¦   «         Št          | ‰¦  «        Šˆˆfd„}t          j         |¦   «         ¦  «         d S )Nc               “   ó°  •K  — ‰                      ¦   «         ƒ d {V —† ‰                      ¦   «         ƒ d {V —† ‰
j        } t          | ¦  «        }d}||k    }|�st          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        nddt          j        ¦   «         v st          j        ‰
¦  «        rt          j        ‰
¦  «        ndt          j        | ¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }t          j	        d¦  «        dz   d	|iz  }t          t          j        |¦  «        ¦  «        ‚d x} x}x}}‰j        }d}||k    }|sªt          j        d|fd
||f¦  «        dt          j        ¦   «         v st          j        ‰¦  «        rt          j        ‰¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }	t          t          j        |	¦  «        ¦  «        ‚d x}x}}‰                     ¦   «         ƒ d {V —† d S )Nr   r7   r9   r:   r3   r;   z#an open socket must not be replacedú
>assert %(py10)srA   rB   rC   rD   rF   rG   )rK   r'   r:   rL   rM   rN   rO   rP   rQ   Ú_format_assertmsgrR   rS   rT   r   rU   s             €€r   r`   z1test_start_reuses_a_live_socket.<locals>.scenarioR   s—  øè è € Ø�iŠi‰kŒkÐÐÐÐÐÐÐØ�iŠi‰kŒkÐÐÐÐÐÐÐØ”=ÐM�s�=Ñ!Ô!ÐM QÐMÐ! QÒ&ÐMÐMÑMÕMÔMÐMÐMÐMÐMÐ! QÐMÑMÔMÐMÕMÔMÑMÔMÐMÐMÕMÔM�sÑMÔMÐMÕMÔM�sÑMÔMÐMÐMÐMÕMÔMÑMÔMÐMÐMÕMÔM�7ÑMÔMÐMÕMÔM�7ÑMÔMÐMÐMÕMÔM�=ÑMÔMÕMÔMÐ!ÑMÔMÕMÔM QÑMÔMÐMÐMÑMÐMÕMÔMÐ(MÑMÔMÐMÑMÐMÐMÐMÑMÐMÕMÕMÔMÐMÑMÔMÑMÔMÐMÐMÐMÐMÐMÐMÐMÐMÐMØŒ~Ð" Ð"ˆ~ Ò"Ð"Ð"Ð"Õ"Ô"Ð"Ð"Ð"Ð"ˆ~ Ð"Ñ"Ô"Ð"Õ"Ô"Ñ"Ô"Ð"Ð"Õ"Ô"ˆsÑ"Ô"Ð"Õ"Ô"ˆsÑ"Ô"Ð"Ð"Õ"Ô"ˆ~Ñ"Ô"Õ"Ô" Ñ"Ô"Ð"Ð"Ñ"Ð"Ð"Ð"Ð"Ð"Ñ"Ð"Õ"Õ"Ô"Ð"Ñ"Ô"Ñ"Ô"Ð"Ð"Ð"Ð"Ð"Ð"Ð"Ø�iŠi‰kŒkÐÐÐÐÐÐÐÐÐr   ra   rc   s     @@r   Útest_start_reuses_a_live_socketrj   N   re   r   c                 óŠ   ‡‡— t          ¦   «         Št          | ‰¦  «        Šˆˆfd„}t          j         |¦   «         ¦  «         dS )zGThe daemon restarting closes the socket; the next start must reconnect.c               “   ó’  •K  — ‰                      ¦   «         ƒ d {V —† d‰
j        d         _        ‰                      ¦   «         ƒ d {V —† ‰
j        } t	          | ¦  «        }d}||k    }|�st          j        d|fd||f¦  «        dt          j        ¦   «         v st          j	        t          ¦  «        rt          j
        t          ¦  «        nddt          j        ¦   «         v st          j	        ‰
¦  «        rt          j
        ‰
¦  «        ndt          j
        | ¦  «        t          j
        |¦  «        t          j
        |¦  «        dœz  }t          j        d	¦  «        d
z   d|iz  }t          t          j        |¦  «        ¦  «        ‚d x} x}x}}‰j        }‰
j        d         }||u }|sªt          j        d|fd||f¦  «        dt          j        ¦   «         v st          j	        ‰¦  «        rt          j
        ‰¦  «        ndt          j
        |¦  «        t          j
        |¦  «        dœz  }dd|iz  }	t          t          j        |	¦  «        ¦  «        ‚d x}x}}‰j        }d}||k    }|s¿t          j        d|fd||f¦  «        dt          j        ¦   «         v st          j	        ‰¦  «        rt          j
        ‰¦  «        ndt          j
        |¦  «        t          j
        |¦  «        dœz  }t          j        d¦  «        dz   d|iz  }	t          t          j        |	¦  «        ¦  «        ‚d x}x}}‰                     ¦   «         ƒ d {V —† d S )Nr   r   é   r7   r9   r:   r3   r;   z a closed socket must be replacedrh   rA   r   rH   rJ   rC   rD   rF   rG   rB   z/reconnect must bump generation to refresh quotaz
>assert %(py7)s)rK   r(   r   r'   r:   rL   rM   rN   rO   rP   rQ   ri   rR   rS   r+   rT   r   rU   s             €€r   r`   zAtest_start_replaces_a_socket_closed_by_the_peer.<locals>.scenarioa   sŸ  øè è € Ø�iŠi‰kŒkÐÐÐÐÐÐÐØ#$ˆŒ˜ÔÔ à�iŠi‰kŒkÐÐÐÐÐÐÐØ”=ÐJ�s�=Ñ!Ô!ÐJ QÐJÐ! QÒ&ÐJÐJÑJÕJÔJÐJÐJÐJÐJÐ! QÐJÑJÔJÐJÕJÔJÑJÔJÐJÐJÕJÔJ�sÑJÔJÐJÕJÔJ�sÑJÔJÐJÐJÐJÕJÔJÑJÔJÐJÐJÕJÔJ�7ÑJÔJÐJÕJÔJ�7ÑJÔJÐJÐJÕJÔJ�=ÑJÔJÕJÔJÐ!ÑJÔJÕJÔJ QÑJÔJÐJÐJÑJÐJÕJÔJÐ(JÑJÔJÐJÑJÐJÐJÐJÑJÐJÕJÕJÔJÐJÑJÔJÑJÔJÐJÐJÐJÐJÐJÐJÐJÐJÐJØŒzÐ/˜Wœ_¨QÔ/Ð/ˆzÐ/Ð/Ð/Ð/Ð/Õ/Ô/Ð/Ð/Ð/Ð/ˆzÐ/Ð/Ñ/Ô/Ð/Õ/Ô/Ñ/Ô/Ð/Ð/Õ/Ô/ˆsÑ/Ô/Ð/Õ/Ô/ˆsÑ/Ô/Ð/Ð/Õ/Ô/ˆzÑ/Ô/Õ/Ô/Ð/Ñ/Ô/Ð/Ð/Ñ/Ð/Ð/Ð/Ð/Ð/Ñ/Ð/Õ/Õ/Ô/Ð/Ñ/Ô/Ñ/Ô/Ð/Ð/Ð/Ð/Ð/Ð/Ð/ØŒ~ÐU ÐUˆ~ Ò"ÐUÐUÐUÕUÔUÐUÐUÐUÐUˆ~ ÐUÑUÔUÐUÕUÔUÑUÔUÐUÐUÕUÔUˆsÑUÔUÐUÕUÔUˆsÑUÔUÐUÐUÕUÔUˆ~ÑUÔUÕUÔU ÑUÔUÐUÐUÑUÐUÕUÔUÐ$UÑUÔUÐUÑUÐUÐUÐUÑUÐUÕUÕUÔUÐUÑUÔUÑUÔUÐUÐUÐUÐUÐUÐUÐUØ�iŠi‰kŒkÐÐÐÐÐÐÐÐÐr   Nra   rc   s     @@r   Ú/test_start_replaces_a_socket_closed_by_the_peerrn   \   sX   øø€ å‰mŒm€GÝ
˜;¨Ñ
0Ô
0€Cðð ð ð ð ð õ „K��‘
”
ÑÔÐÐÐr   c                 óŠ   ‡‡— t          ¦   «         Št          | ‰¦  «        Šˆˆfd„}t          j         |¦   «         ¦  «         dS )z@A slow reader for an old socket must not strand the replacement.c               “   óN  •K  — ‰                      ¦   «         ƒ d {V —† ‰
j        d         } ‰j        }d| _        ‰                      ¦   «         ƒ d {V —† ‰j        }‰
j        d         }||u }|s—t          j        d|fd||f¦  «        dt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        ndt          j
        |¦  «        dœz  }dd	|iz  }t          t          j        |¦  «        ¦  «        ‚d x}}|ƒ d {V —† ‰j        }||u }|sêt          j        d|fd
||f¦  «        dt          j        ¦   «         v st          j	        ‰¦  «        rt          j
        ‰¦  «        ndt          j
        |¦  «        dt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        nddœz  }t          j        d¦  «        dz   d|iz  }	t          t          j        |	¦  «        ¦  «        ‚d x}}‰                     ¦   «         ƒ d {V —† d S )Nr   r   r   rH   )z%(py0)s is %(py3)sÚ
new_socket)r<   r>   zassert %(py5)sr?   )z.%(py2)s
{%(py2)s = %(py0)s.socket
} is %(py4)srC   ©r<   rE   Úpy4z(old reader must not clear the new socketz
>assert %(py6)sÚpy6)rK   r(   Úreaderr   r+   rL   rM   rN   rO   rP   rQ   rR   rS   ri   r   )Ú
old_socketÚ
old_readerrq   rV   r\   Ú@py_format4r^   r]   Ú@py_format5Ú@py_format7r3   rC   s             €€r   r`   zCtest_reader_cleanup_does_not_clear_a_newer_socket.<locals>.scenarios   s…  øè è € Ø�iŠi‰kŒkÐÐÐÐÐÐÐØ”_ QÔ'ˆ
Ø”Zˆ
ð ˆ
ÔØ�iŠi‰kŒkÐÐÐÐÐÐÐØ”Zˆ
Ø$œ_¨QÔ/Ð/ˆzÐ/Ð/Ð/Ð/Ð/Õ/Ô/Ð/Ð/Ð/Ð/ˆzÐ/Ð/Ñ/Ô/Ð/Õ/Ô/Ñ/Ô/Ð/Ð/Õ/Ô/ˆzÑ/Ô/Ð/Õ/Ô/ˆzÑ/Ô/Ð/Ð/Õ/Ô/Ð/Ñ/Ô/Ð/Ð/Ñ/Ð/Ð/Ð/Ð/Ð/Ñ/Ð/Õ/Õ/Ô/Ð/Ñ/Ô/Ñ/Ô/Ð/Ð/Ð/Ð/Ð/àÐÐÐÐÐÐÐàŒzÐSˆz˜ZÐ'ÐSÐSÐSÕSÔSÐSÐSÐSÐSˆz˜ZÐSÑSÔSÐSÕSÔSÑSÔSÐSÐSÕSÔSˆsÑSÔSÐSÕSÔSˆsÑSÔSÐSÐSÕSÔSˆzÑSÔSÐSÕSÔSÑSÔSÐSÐSÕSÔS˜ZÑSÔSÐSÕSÔS˜ZÑSÔSÐSÐSÐSÐSÑSÐSÕSÔSÐ)SÑSÔSÐSÑSÐSÐSÐSÑSÐSÕSÕSÔSÐSÑSÔSÑSÔSÐSÐSÐSÐSÐSØ�iŠi‰kŒkÐÐÐÐÐÐÐÐÐr   Nra   rc   s     @@r   Ú1test_reader_cleanup_does_not_clear_a_newer_socketr{   n   sX   øø€ å‰mŒm€GÝ
˜;¨Ñ
0Ô
0€Cðð ð ð ð ð õ" „K��‘
”
ÑÔÐÐÐr   c                 óŠ   ‡‡— t          ¦   «         Št          | ‰¦  «        Šˆˆfd„}t          j         |¦   «         ¦  «         dS )zCPending work fails loudly instead of hanging when the daemon drops.c            	   “   óŒ  •K  — ‰                      ¦   «         ƒ d {V —† t          j        ¦   «                              ¦   «         } | ‰j        d<   d‰
j        d         _        ‰j        ƒ d {V —† | j        } |¦   «         }|s‹ddt          j
        ¦   «         v st          j        | ¦  «        rt          j        | ¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }t          t          j        |¦  «        ¦  «        ‚d x}}| j        } |¦   «         }t#          |t$          ¦  «        }|�s.ddt          j
        ¦   «         v st          j        t"          ¦  «        rt          j        t"          ¦  «        nddt          j
        ¦   «         v st          j        | ¦  «        rt          j        | ¦  «        ndt          j        |¦  «        t          j        |¦  «        d	t          j
        ¦   «         v st          j        t$          ¦  «        rt          j        t$          ¦  «        nd	t          j        |¦  «        d
œz  }t          t          j        |¦  «        ¦  «        ‚d x}x}}‰j        }d }||u }|sªt          j        d|fd||f¦  «        dt          j
        ¦   «         v st          j        ‰¦  «        rt          j        ‰¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }	t          t          j        |	¦  «        ¦  «        ‚d x}x}}‰                     ¦   «         ƒ d {V —† d S )Né   r   r   z?assert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.done
}()
}Úpendingrr   zkassert %(py8)s
{%(py8)s = %(py0)s(%(py5)s
{%(py5)s = %(py3)s
{%(py3)s = %(py1)s.exception
}()
}, %(py6)s)
}Ú
isinstanceÚ	Exception)r<   r=   r>   r?   rt   r@   rH   rJ   rC   rD   rF   rG   )rK   r   Úget_running_loopÚcreate_futurer   r(   r   ru   ÚdonerN   rO   rL   rP   rQ   rR   rS   Ú	exceptionr€   r�   r+   rM   r   )r   r\   r]   ry   rV   rW   rX   rZ   r^   r_   r3   rC   s             €€r   r`   z@test_reconnect_preserves_pending_call_failures.<locals>.scenarioŒ   sc  øè è € Ø�iŠi‰kŒkÐÐÐÐÐÐÐÝÔ*Ñ,Ô,×:Ò:Ñ<Ô<ˆØ ˆŒ�A‰ð $%ˆŒ˜ÔÔ ØŒjÐÐÐÐÐÐÐàŒ|Ðˆ|ˆ|‰~Œ~Ðˆ~ÐÐÐÕÔÑÔÐÐÕÔˆwÑÔÐÕÔˆwÑÔÐÐÕÔˆ|ÑÔÕÔˆ~ÑÔÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐØ!Ô+Ð9Ð+Ð+Ñ-Ô-Ð9�zÐ-­yÑ9Ô9Ð9Ð9Ñ9Ð9Ð9Õ9Ô9Ñ9Ô9Ð9Ð9Õ9Ô9�zÑ9Ô9Ð9Õ9Ô9�zÑ9Ô9Ð9Ð9Ð9Õ9Ô9Ñ9Ô9Ð9Ð9Õ9Ô9˜'Ñ9Ô9Ð9Õ9Ô9˜'Ñ9Ô9Ð9Ð9Õ9Ô9Ð+Ñ9Ô9Õ9Ô9Ð-Ñ9Ô9Ð9Õ9Ô9Ñ9Ô9Ð9Ð9Õ9Ô9­yÑ9Ô9Ð9Õ9Ô9­yÑ9Ô9Ð9Ð9Õ9Ô9Ð9Ñ9Ô9Ð9Ð9Ñ9Ð9Õ9Õ9Ô9Ð9Ñ9Ô9Ñ9Ô9Ð9Ð9Ð9Ð9Ð9Ð9Ð9ØŒzÐ!˜TÐ!ˆz˜TÐ!Ð!Ð!Ð!Õ!Ô!Ð!Ð!Ð!Ð!ˆz˜TÐ!Ñ!Ô!Ð!Õ!Ô!Ñ!Ô!Ð!Ð!Õ!Ô!ˆsÑ!Ô!Ð!Õ!Ô!ˆsÑ!Ô!Ð!Ð!Õ!Ô!ˆzÑ!Ô!Õ!Ô!˜TÑ!Ô!Ð!Ð!Ñ!Ð!Ð!Ð!Ð!Ð!Ñ!Ð!Õ!Õ!Ô!Ð!Ñ!Ô!Ñ!Ô!Ð!Ð!Ð!Ð!Ð!Ð!Ð!Ø�iŠi‰kŒkÐÐÐÐÐÐÐÐÐr   Nra   rc   s     @@r   Ú.test_reconnect_preserves_pending_call_failuresr†   ‡   sX   øø€ å‰mŒm€GÝ
˜;¨Ñ
0Ô
0€Cðð ð ð ð ð õ „K��‘
”
ÑÔÐÐÐr   )r#   ÚbuiltinsrN   Ú_pytest.assertion.rewriteÚ	assertionÚrewriterL   r   ÚpytestÚdevice_gateway.control.rpcr   r   r%   r4   rd   rj   rn   r{   r†   r   r   r   ú<module>r�      s  ððð ð € € € € € € € € € € € € €€€€à €€€à 5Ð 5Ð 5Ð 5Ð 5Ð 5ðð ð ð ð ñ ô ð ð2ð ð ð ð ñ ô ð ð$2ð 2ð 2ð
ð ð ðð ð ðð ð ð$ð ð ð2ð ð ð ð r   