
    i[                    R   % S SK Jr  S SKrS SKJrJr  S SKJrJr  SSK	J
r
Jr  SSKJr  SSKJrJr  \/ \\   4   rS	\S
'   \/ \4   rS	\S'   \" S\S9r\" S\S9r " S S5      r\R0                   " S S\5      5       r\R0                   " S S\5      5       r\R6                  R9                  SS5      \l        \R6                  R9                  SS5      \l        SS.       S$S jjrS%S jr    S&S jrS'S jr  " S S5      r! " S S\5      r" " S  S!\5      r#S(S" jr$S)S# jr%g)*    )annotationsN)	AwaitableCallable)	TypeAliasTypeVar   )_core_utilStapledStream)ReceiveStream
SendStreamr   	AsyncHookSyncHookSendStreamT)boundReceiveStreamTc                  l    \ rS rSrSS jrSS jrSS jrSS jrSS jrSS jr	SSS	 jjr
SSS
 jjrSrg)_UnboundedByteQueue   c                    [        5       U l        SU l        [        R                  " 5       U l        [        R                  " S5      U l        g )NFz%another task is already fetching data)		bytearray_data_closedr	   
ParkingLot_lotr
   ConflictDetector_fetch_lockselfs    IC:\des-py\RoboSAPF\venv\Lib\site-packages\trio/testing/_memory_streams.py__init___UnboundedByteQueue.__init__   s8    [
$$&	 113
    c                F    SU l         U R                  R                  5         g NT)r   r   
unpark_allr   s    r!   close_UnboundedByteQueue.close$   s    		r$   c                B    [        5       U l        U R                  5         g N)r   r   r(   r   s    r!   close_and_wipe"_UnboundedByteQueue.close_and_wipe(   s    [


r$   c                    U R                   (       a  [        R                  " S5      eU =R                  U-  sl        U R                  R                  5         g )Nzvirtual connection closed)r   r	   ClosedResourceErrorr   r   r'   r    datas     r!   put_UnboundedByteQueue.put,   s9    <<++,GHH

d
		r$   c                Z    Uc  g [         R                  " U5      nUS:  a  [        S5      eg )N   max_bytes must be >= 1)operatorindex
ValueErrorr    	max_bytess     r!   _check_max_bytes$_UnboundedByteQueue._check_max_bytes2   s1    NN9-	q=566 r$   c                   U R                   (       d  U R                  (       d   eUc  [        U R                  5      nU R                  (       a)  U R                  S U nU R                  S U2	 U(       d   eU$ [        5       $ r+   )r   r   lenr   )r    r;   chunks      r!   	_get_impl_UnboundedByteQueue._get_impl9   sc    ||tzz))DJJI::JJz	*E

:I:&L5L;r$   Nc                    U R                      U R                  U5        U R                  (       d!  U R                  (       d  [        R
                  eU R                  U5      sS S S 5        $ ! , (       d  f       g = fr+   )r   r<   r   r   r	   
WouldBlockrA   r:   s     r!   
get_nowait_UnboundedByteQueue.get_nowaitE   sJ    !!),<<

&&&>>),	 s   AA++
A9c                h  #    U R                      U R                  U5        U R                  (       d4  U R                  (       d#  U R                  R                  5       I S h  vN   O[        R                  " 5       I S h  vN   U R                  U5      sS S S 5        $  N< N ! , (       d  f       g = f7fr+   )	r   r<   r   r   r   parkr	   
checkpointrA   r:   s     r!   get_UnboundedByteQueue.getL   ss     !!),<<

iinn&&&&&(((>>),  '( sA   B2AB! B!B!>B?B!
B2B!B!!
B/+B2)r   r   r   r   returnNoner1   zbytes | bytearray | memoryviewrM   rN   )r;   
int | NonerM   rN   r;   rP   rM   r   r+   )__name__
__module____qualname____firstlineno__r"   r(   r,   r2   r<   rA   rE   rJ   __static_attributes__ r$   r!   r   r      s/    
7
-- -r$   r   c                  ~    \ rS rSrSr   S       SS jjrSS jrSS jrSS jrSS jr	SSS	 jjr
SSS
 jjrSrg)MemorySendStreamV   a  An in-memory :class:`~trio.abc.SendStream`.

Args:
  send_all_hook: An async function, or None. Called from
      :meth:`send_all`. Can do whatever you like.
  wait_send_all_might_not_block_hook: An async function, or None. Called
      from :meth:`wait_send_all_might_not_block`. Can do whatever you
      like.
  close_hook: A synchronous function, or None. Called from :meth:`close`
      and :meth:`aclose`. Can do whatever you like.

.. attribute:: send_all_hook
               wait_send_all_might_not_block_hook
               close_hook

   All of these hooks are also exposed as attributes on the object, and
   you can change them at any time.

Nc                |    [         R                  " S5      U l        [        5       U l        Xl        X l        X0l        g )N!another task is using this stream)r
   r   _conflict_detectorr   	_outgoingsend_all_hook"wait_send_all_might_not_block_hook
close_hook)r    r_   r`   ra   s       r!   r"   MemorySendStream.__init__l   s7     #("8"8/#
 -.*2T/$r$   c                X  #    U R                      [        R                  " 5       I Sh  vN   [        R                  " 5       I Sh  vN   U R                  R	                  U5        U R
                  b  U R                  5       I Sh  vN   SSS5        g Nj NO N! , (       d  f       g= f7f)zmPlaces the given data into the object's internal buffer, and then
calls the :attr:`send_all_hook` (if any).

N)r]   r	   rI   r^   r2   r_   r0   s     r!   send_allMemorySendStream.send_allz   s      $$""$$$""$$$NNt$!!-((*** %$$$ + %$P   B*BBBB?BBB
	B*BBB
B'#B*c                X  #    U R                      [        R                  " 5       I Sh  vN   [        R                  " 5       I Sh  vN   U R                  R	                  S5        U R
                  b  U R                  5       I Sh  vN   SSS5        g Nj NO N! , (       d  f       g= f7f)z^Calls the :attr:`wait_send_all_might_not_block_hook` (if any), and
then returns immediately.

Nr$   )r]   r	   rI   r^   r2   r`   r   s    r!   wait_send_all_might_not_block.MemorySendStream.wait_send_all_might_not_block   s      $$""$$$""$$$NNs#66B==??? %$$$ @ %$rf   c                t    U R                   R                  5         U R                  b  U R                  5         gg)zNMarks this stream as closed, and then calls the :attr:`close_hook`
(if any).

N)r^   r(   ra   r   s    r!   r(   MemorySendStream.close   s-     	??&OO 'r$   c                j   #    U R                  5         [        R                  " 5       I Sh  vN   g N7fz!Same as :meth:`close`, but async.Nr(   r	   rI   r   s    r!   acloseMemorySendStream.aclose         

      )313c                T   #    U R                   R                  U5      I Sh  vN $  N7f)ax  Retrieves data from the internal buffer, blocking if necessary.

Args:
  max_bytes (int or None): The maximum amount of data to
      retrieve. None (the default) means to retrieve all the data
      that's present (but still blocks until at least one byte is
      available).

Returns:
  If this stream has been closed, an empty bytearray. Otherwise, the
  requested data.

N)r^   rJ   r:   s     r!   get_dataMemorySendStream.get_data   s"      ^^''	2222   (&(c                8    U R                   R                  U5      $ )zRetrieves data from the internal buffer, but doesn't block.

See :meth:`get_data` for details.

Raises:
  trio.WouldBlock: if no data is available to retrieve.

)r^   rE   r:   s     r!   get_data_nowait MemorySendStream.get_data_nowait   s     ~~((33r$   )r]   r^   ra   r_   r`   )NNN)r_   AsyncHook | Noner`   rz   ra   SyncHook | NonerM   rN   rO   rL   r+   rQ   )rR   rS   rT   rU   __doc__r"   rd   rh   r(   ro   rt   rx   rV   rW   r$   r!   rY   rY   V   sa    , +/?C&*	%'% -=% $	%
 
%+@"!
3 	4 	4r$   rY   c                  j    \ rS rSrSr  S     SS jjrSSS jjrSS jrSS jrSS jr	SS	 jr
S
rg)MemoryReceiveStream   a  An in-memory :class:`~trio.abc.ReceiveStream`.

Args:
  receive_some_hook: An async function, or None. Called from
      :meth:`receive_some`. Can do whatever you like.
  close_hook: A synchronous function, or None. Called from :meth:`close`
      and :meth:`aclose`. Can do whatever you like.

.. attribute:: receive_some_hook
               close_hook

   Both hooks are also exposed as attributes on the object, and you can
   change them at any time.

Nc                ~    [         R                  " S5      U l        [        5       U l        SU l        Xl        X l        g )Nr\   F)r
   r   r]   r   	_incomingr   receive_some_hookra   )r    r   ra   s      r!   r"   MemoryReceiveStream.__init__   s8    
 #("8"8/#
 -.!2$r$   c                  #    U R                      [        R                  " 5       I Sh  vN   [        R                  " 5       I Sh  vN   U R                  (       a  [        R                  eU R
                  b  U R                  5       I Sh  vN   U R                  R                  U5      I Sh  vN nU R                  (       a  [        R                  eUsSSS5        $  N N NW N6! , (       d  f       g= f7f)zxCalls the :attr:`receive_some_hook` (if any), and then retrieves
data from the internal buffer, blocking if necessary.

N)r]   r	   rI   r   r/   r   r   rJ   )r    r;   r1   s      r!   receive_some MemoryReceiveStream.receive_some   s      $$""$$$""$$$||///%%1,,...
 ++I66D||/// %$$$ /
 7 %$sc   C8C'CC'C!AC'C#"C'.C%/&C'
C8C'!C'#C'%C''
C51C8c                    SU l         U R                  R                  5         U R                  b  U R                  5         gg)zVDiscards any pending data from the internal buffer, and marks this
stream as closed.

TN)r   r   r,   ra   r   s    r!   r(   MemoryReceiveStream.close   s4    
 %%'??&OO 'r$   c                j   #    U R                  5         [        R                  " 5       I Sh  vN   g N7frm   rn   r   s    r!   ro   MemoryReceiveStream.aclose	  rq   rr   c                :    U R                   R                  U5        g)z.Appends the given data to the internal buffer.N)r   r2   r0   s     r!   put_dataMemoryReceiveStream.put_data  s    4 r$   c                8    U R                   R                  5         g)z2Adds an end-of-file marker to the internal buffer.N)r   r(   r   s    r!   put_eofMemoryReceiveStream.put_eof  s    r$   )r   r]   r   ra   r   )NN)r   rz   ra   r{   rM   rN   r+   rQ   rL   rO   )rR   rS   rT   rU   r|   r"   r   r(   ro   r   r   rV   rW   r$   r!   r~   r~      sI    $ /3&*%+% $% 
	%.!
!r$   r~   z._memory_streams )r;   c                   U R                  U5      n U(       d  UR                  5         gUR	                  U5         g! [        R                   a     gf = f! [        R
                   a    [        R                  " S5      Sef = f)a  Take data out of the given :class:`MemorySendStream`'s internal buffer,
and put it into the given :class:`MemoryReceiveStream`'s internal buffer.

Args:
  memory_send_stream (MemorySendStream): The stream to get data from.
  memory_receive_stream (MemoryReceiveStream): The stream to put data into.
  max_bytes (int or None): The maximum amount of data to transfer in this
      call, or None to transfer all available data.

Returns:
  True if it successfully transferred some data, or False if there was no
  data to transfer.

This is used to implement :func:`memory_stream_one_way_pair` and
:func:`memory_stream_pair`; see the latter's docstring for an example
of how you might use it yourself.

FzMemoryReceiveStream was closedNT)rx   r	   rD   r   r   r/   BrokenResourceError)memory_send_streammemory_receive_streamr;   r1   s       r!   memory_stream_pumpr      s    0!11)<T!))+
  "**40    $$ T''(HItSTs   ? A A AA,Bc                 v   ^^^ [        5       m[        5       mSUU4S jjmSU4S jjn U Tl        TTl        TT4$ )u	  Create a connected, pure-Python, unidirectional stream with infinite
buffering and flexible configuration options.

You can think of this as being a no-operating-system-involved
Trio-streamsified version of :func:`os.pipe` (except that :func:`os.pipe`
returns the streams in the wrong order – we follow the superior convention
that data flows from left to right).

Returns:
  A tuple (:class:`MemorySendStream`, :class:`MemoryReceiveStream`), where
  the :class:`MemorySendStream` has its hooks set up so that it calls
  :func:`memory_stream_pump` from its
  :attr:`~MemorySendStream.send_all_hook` and
  :attr:`~MemorySendStream.close_hook`.

The end result is that data automatically flows from the
:class:`MemorySendStream` to the :class:`MemoryReceiveStream`. But you're
also free to rearrange things however you like. For example, you can
temporarily set the :attr:`~MemorySendStream.send_all_hook` to None if you
want to simulate a stall in data transmission. Or see
:func:`memory_stream_pair` for a more elaborate example.

c                    > [        TT 5        g r+   )r   )recv_streamsend_streams   r!   $pump_from_send_stream_to_recv_streamHmemory_stream_one_way_pair.<locals>.pump_from_send_stream_to_recv_streama  s    ;4r$   c                    >#    T " 5         g 7fr+   rW   )r   s   r!   *async_pump_from_send_stream_to_recv_streamNmemory_stream_one_way_pair.<locals>.async_pump_from_send_stream_to_recv_streame  s     ,.s   	rL   )rY   r~   r_   ra   )r   r   r   r   s    @@@r!   memory_stream_one_way_pairr   F  sB    0 #$K%'K5 5/ !KKAK##r$   c                X    U " 5       u  pU " 5       u  p4[        X5      n[        X25      nXV4$ r+   r   )one_way_pair
pipe1_send
pipe1_recv
pipe2_send
pipe2_recvstream1stream2s          r!   _make_stapled_pairr   m  s5     *^J)^JJ3GJ3Gr$   c                      [        [        5      $ )a  Create a connected, pure-Python, bidirectional stream with infinite
buffering and flexible configuration options.

This is a convenience function that creates two one-way streams using
:func:`memory_stream_one_way_pair`, and then uses
:class:`~trio.StapledStream` to combine them into a single bidirectional
stream.

This is like a no-operating-system-involved, Trio-streamsified version of
:func:`socket.socketpair`.

Returns:
  A pair of :class:`~trio.StapledStream` objects that are connected so
  that data automatically flows from one to the other in both directions.

After creating a stream pair, you can send data back and forth, which is
enough for simple tests::

   left, right = memory_stream_pair()
   await left.send_all(b"123")
   assert await right.receive_some() == b"123"
   await right.send_all(b"456")
   assert await left.receive_some() == b"456"

But if you read the docs for :class:`~trio.StapledStream` and
:func:`memory_stream_one_way_pair`, you'll see that all the pieces
involved in wiring this up are public APIs, so you can adjust to suit the
requirements of your tests. For example, here's how to tweak a stream so
that data flowing from left to right trickles in one byte at a time (but
data flowing from right to left proceeds at full speed)::

    left, right = memory_stream_pair()
    async def trickle():
        # left is a StapledStream, and left.send_stream is a MemorySendStream
        # right is a StapledStream, and right.recv_stream is a MemoryReceiveStream
        while memory_stream_pump(left.send_stream, right.recv_stream, max_bytes=1):
            # Pause between each byte
            await trio.sleep(1)
    # Normally this send_all_hook calls memory_stream_pump directly without
    # passing in a max_bytes. We replace it with our custom version:
    left.send_stream.send_all_hook = trickle

And here's a simple test using our modified stream objects::

    async def sender():
        await left.send_all(b"12345")
        await left.send_eof()

    async def receiver():
        async for data in right:
            print(data)

    async with trio.open_nursery() as nursery:
        nursery.start_soon(sender)
        nursery.start_soon(receiver)

By default, this will print ``b"12345"`` and then immediately exit; with
our trickle stream it instead sleeps 1 second, then prints ``b"1"``, then
sleeps 1 second, then prints ``b"2"``, etc.

Pro-tip: you can insert sleep calls (like in our example above) to
manipulate the flow of data across tasks... and then use
:class:`MockClock` and its :attr:`~MockClock.autojump_threshold`
functionality to keep your test suite running quickly.

If you want to stress test a protocol implementation, one nice trick is to
use the :mod:`random` module (preferably with a fixed seed) to move random
numbers of bytes at a time, and insert random sleeps in between them. You
can also set up a custom :attr:`~MemoryReceiveStream.receive_some_hook` if
you want to manipulate things on the receiving side, and not just the
sending side.

)r   r   rW   r$   r!   memory_stream_pairr   z  s    Z 899r$   c                  h    \ rS rSrSS jrSS jrSS jrSS jrSS jrSS jr	SS jr
SSS
 jjrSrg	)_LockstepByteQueuei  c                    [        5       U l        SU l        SU l        SU l        [
        R                  " 5       U l        [        R                  " S5      U l
        [        R                  " S5      U l        g )NFzanother task is already sendingz!another task is already receiving)r   r   _sender_closed_receiver_closed_receiver_waitingr	   r   _waitersr
   r   _send_conflict_detector_receive_conflict_detectorr   s    r!   r"   _LockstepByteQueue.__init__  sa    [
# %!&((*','='=-(
$ +0*@*@/+
'r$   c                8    U R                   R                  5         g r+   )r   r'   r   s    r!   _something_happened&_LockstepByteQueue._something_happened  s      "r$   c                   #     U" 5       (       a  OGU R                   (       d  U R                  (       a  O$U R                  R                  5       I S h  vN   MT  [        R
                  " 5       I S h  vN   g  N$ N7fr+   )r   r   r   rH   r	   rI   )r    fns     r!   	_wait_for_LockstepByteQueue._wait_for  s]     tt""d&;&;--$$&&&      ' s$   AA:A6A:0A81A:8A:c                2    SU l         U R                  5         g r&   )r   r   r   s    r!   close_sender_LockstepByteQueue.close_sender  s    "  "r$   c                2    SU l         U R                  5         g r&   )r   r   r   s    r!   close_receiver!_LockstepByteQueue.close_receiver  s     $  "r$   c                2  ^ #    T R                      T R                  (       a  [        R                  eT R                  (       a  [        R
                  eT R                  (       a   eT =R                  U-  sl        T R                  5         T R                  U 4S j5      I S h  vN   T R                  (       a  [        R                  eT R                  (       a!  T R                  (       a  [        R
                  eS S S 5        g  N`! , (       d  f       g = f7f)Nc                 "   > T R                   S:H  $ Nr$   r   r   s   r!   <lambda>-_LockstepByteQueue.send_all.<locals>.<lambda>  s    s):r$   )	r   r   r	   r/   r   r   r   r   r   r0   s   ` r!   rd   _LockstepByteQueue.send_all  s     ))""///$$///zz!>JJ$J$$&..!:;;;""///zzd33/// *) < *)s0   DBD#D$AD;	DD
DDc                  ^ #    T R                      T R                  (       a  [        R                  eT R                  (       a'  [        R
                  " 5       I S h  vN    S S S 5        g T R                  U 4S j5      I S h  vN   T R                  (       a  [        R                  e S S S 5        g  NV N1! , (       d  f       g = f7f)Nc                    > T R                   $ r+   )r   r   s   r!   r   B_LockstepByteQueue.wait_send_all_might_not_block.<locals>.<lambda>	  s    )?)?r$   )r   r   r	   r/   r   rI   r   r   s   `r!   rh   0_LockstepByteQueue.wait_send_all_might_not_block  s     ))""///$$&&((( *) ..!?@@@""/// # *) )@ *)sM   CAB6B2B6!	C*B6B4%B6)	C2B64B66
C CNc                  ^ #    T R                      Ub'  [        R                  " U5      nUS:  a  [        S5      eT R                  (       a  [
        R                  eST l        T R                  5          T R                  U 4S j5      I S h  vN   ST l        T R                  (       a  [
        R                  eT R                  (       a9  T R                  S U nT R                  S U2	 T R                  5         UsS S S 5        $ T R                  (       d   e S S S 5        g N! ST l        f = f! , (       d  f       g = f7f)Nr5   r6   Tc                 "   > T R                   S:g  $ r   r   r   s   r!   r   1_LockstepByteQueue.receive_some.<locals>.<lambda>  s    TZZ3->r$   Fr$   )r   r7   r8   r9   r   r	   r/   r   r   r   r   r   )r    r;   gots   `  r!   r   _LockstepByteQueue.receive_some  s    ,,$$NN95	q=$%=>>$$///%)D"$$&/nn%>???).&$$///zz jj),JJz	z*((*3 -,6 ****9 -, @).& -,sT   D?A#D.4D"D D"A(D.9
D?D.	D? D""	D++D..
D<8D?)r   r   r   r   r   r   r   rL   )r   zCallable[[], bool]rM   rN   rO   r+   r;   rP   rM   zbytes | bytearray)rR   rS   rT   rU   r"   r   r   r   r   rd   rh   r   rV   rW   r$   r!   r   r     s/    
#
!##0	0 r$   r   c                  F    \ rS rSrS	S jrS
S jrS
S jrSS jrS
S jrSr	g)_LockstepSendStreami-  c                    Xl         g r+   _lbqr    lbqs     r!   r"   _LockstepSendStream.__init__.      	r$   c                8    U R                   R                  5         g r+   )r   r   r   s    r!   r(   _LockstepSendStream.close1  s    		 r$   c                j   #    U R                  5         [        R                  " 5       I S h  vN   g  N7fr+   rn   r   s    r!   ro   _LockstepSendStream.aclose4        

   rr   c                V   #    U R                   R                  U5      I S h  vN   g  N7fr+   )r   rd   r0   s     r!   rd   _LockstepSendStream.send_all8  s     ii  &&&s   )')c                T   #    U R                   R                  5       I S h  vN   g  N7fr+   )r   rh   r   s    r!   rh   1_LockstepSendStream.wait_send_all_might_not_block;  s     ii55777s   (&(r   Nr   r   rM   rN   rL   rO   )
rR   rS   rT   rU   r"   r(   ro   rd   rh   rV   rW   r$   r!   r   r   -  s    !!'8r$   r   c                  @    \ rS rSrSS jrS	S jrS	S jrS
SS jjrSrg)_LockstepReceiveStreami?  c                    Xl         g r+   r   r   s     r!   r"   _LockstepReceiveStream.__init__@  r   r$   c                8    U R                   R                  5         g r+   )r   r   r   s    r!   r(   _LockstepReceiveStream.closeC  s    		  "r$   c                j   #    U R                  5         [        R                  " 5       I S h  vN   g  N7fr+   rn   r   s    r!   ro   _LockstepReceiveStream.acloseF  r   rr   Nc                T   #    U R                   R                  U5      I S h  vN $  N7fr+   )r   r   r:   s     r!   r   #_LockstepReceiveStream.receive_someJ  s      YY++I6666rv   r   r   rL   r+   r   )	rR   rS   rT   rU   r"   r(   ro   r   rV   rW   r$   r!   r   r   ?  s    #!7 7r$   r   c                 B    [        5       n [        U 5      [        U 5      4$ )a  Create a connected, pure Python, unidirectional stream where data flows
in lockstep.

Returns:
  A tuple
  (:class:`~trio.abc.SendStream`, :class:`~trio.abc.ReceiveStream`).

This stream has *absolutely no* buffering. Each call to
:meth:`~trio.abc.SendStream.send_all` will block until all the given data
has been returned by a call to
:meth:`~trio.abc.ReceiveStream.receive_some`.

This can be useful for testing flow control mechanisms in an extreme case,
or for setting up "clogged" streams to use with
:func:`check_one_way_stream` and friends.

In addition to fulfilling the :class:`~trio.abc.SendStream` and
:class:`~trio.abc.ReceiveStream` interfaces, the return objects
also have a synchronous ``close`` method.

)r   r   r   )r   s    r!   lockstep_stream_one_way_pairr   N  s"    . 
Cs#%;C%@@@r$   c                      [        [        5      $ )as  Create a connected, pure-Python, bidirectional stream where data flows
in lockstep.

Returns:
  A tuple (:class:`~trio.StapledStream`, :class:`~trio.StapledStream`).

This is a convenience function that creates two one-way streams using
:func:`lockstep_stream_one_way_pair`, and then uses
:class:`~trio.StapledStream` to combine them into a single bidirectional
stream.

)r   r   rW   r$   r!   lockstep_stream_pairr   i  s      :;;r$   )r   rY   r   r~   r;   rP   rM   bool)rM   z,tuple[MemorySendStream, MemoryReceiveStream])r   z0Callable[[], tuple[SendStreamT, ReceiveStreamT]]rM   z]tuple[StapledStream[SendStreamT, ReceiveStreamT], StapledStream[SendStreamT, ReceiveStreamT]])rM   zqtuple[StapledStream[MemorySendStream, MemoryReceiveStream], StapledStream[MemorySendStream, MemoryReceiveStream]])rM   z tuple[SendStream, ReceiveStream])rM   zYtuple[StapledStream[SendStream, ReceiveStream], StapledStream[SendStream, ReceiveStream]])&
__future__r   r7   collections.abcr   r   typingr   r   r   r	   r
   _highlevel_genericr   abcr   r   objectr   __annotations__r   r   r   r   finalrY   r~   rS   replacer   r   r   r   r   r   r   r   r   rW   r$   r!   <module>r      su   "  / %  . +If$5 56	9 6r6z*) *m:6)?<- <-~ o4z o4 o4d J- J J\ /99AA   "5!?!?!G!G"   !	#(#.# 	#
 
#L$$N
B

M:j[ [|8* 8$7] 7A6<r$   