
    +gZ                       % 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  \(       a  S S	KJr  \/ \\   4   rS
\S'   \/ \4   rS
\S'   \" S\S9r\" S\S9r " S S5      r\R4                   " S S\5      5       r\R4                   " S S\5      5       r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)TYPE_CHECKINGTypeVar   )_core_utilStapledStream)ReceiveStream
SendStream)	TypeAliasr   	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    d/Users/Alptekin/Desktop/izin_takip/venv/lib/python3.13/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.put0   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_bytes6   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_impl=   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	   
WouldBlockrB   r;   s     r"   
get_nowait_UnboundedByteQueue.get_nowaitI   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	   
checkpointrB   r;   s     r"   get_UnboundedByteQueue.getP   ss     !!),<<

iinn&&&&&(((>>),  '( sA   B2AB! B!B!>B?B!
B2B!B!!
B/+B2)r   r   r   r   returnNoner2   zbytes | bytearray | memoryviewrN   rO   )r<   
int | NonerN   rO   r<   rQ   rN   r   r,   )__name__
__module____qualname____firstlineno__r#   r)   r-   r3   r=   rB   rF   rK   __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)MemorySendStreamZ   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`   ra   rb   s       r"   r#   MemorySendStream.__init__p   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	   rJ   r_   r3   r`   r1   s     r"   send_allMemorySendStream.send_all~   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	   rJ   r_   r3   ra   r    s    r"   wait_send_all_might_not_block.MemorySendStream.wait_send_all_might_not_block   s      $$""$$$""$$$NNs#66B==??? %$$$ @ %$rg   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)   rb   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	   rJ   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_   rK   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_   rF   r;   s     r"   get_data_nowait MemorySendStream.get_data_nowait   s     ~~((33r%   )r^   r_   rb   r`   ra   )NNN)r`   AsyncHook | Nonera   r{   rb   SyncHook | NonerN   rO   rP   rM   r,   rR   )rS   rT   rU   rV   __doc__r#   re   ri   r)   rp   ru   ry   rW   rX   r%   r"   rZ   rZ   Z   sa    , +/?C&*	%'% -=% $	%
 
%+@"!
3 	4 	4r%   rZ   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_hookrb   )r!   r   rb   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	   rJ   r   r0   r   r   rK   )r!   r<   r2   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-   rb   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rn   ro   r    s    r"   rp   MemoryReceiveStream.aclose  rr   rs   c                :    U R                   R                  U5        g)z.Appends the given data to the internal buffer.N)r   r3   r1   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   rb   r   )NN)r   r{   rb   r|   rN   rO   r,   rR   rM   rP   )rS   rT   rU   rV   r}   r#   r   r)   rp   r   r   rW   rX   r%   r"   r   r      sI    $ /3&*%+% $% 
	%.!
!r%   r   )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)ry   r	   rE   r   r   r0   BrokenResourceError)memory_send_streammemory_receive_streamr<   r2   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_stream\  s    ;4r%   c                    >#    T " 5         g 7fr,   rX   )r   s   r"   *async_pump_from_send_stream_to_recv_streamNmemory_stream_one_way_pair.<locals>.async_pump_from_send_stream_to_recv_stream`  s     ,.s   	rM   )rZ   r   r`   rb   )r   r   r   r   s    @@@r"   memory_stream_one_way_pairr   A  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   h  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   rX   r%   r"   memory_stream_pairr   u  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   rI   r	   rJ   )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	   r0   r   r   r   r   r   r1   s   ` r"   re   _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	   r0   r   rJ   r   r    s   `r"   ri   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)Nr6   r7   Tc                 "   > T R                   S:g  $ r   r   r    s   r"   r   1_LockstepByteQueue.receive_some.<locals>.<lambda>  s    TZZ3->r%   Fr%   )r   r8   r9   r:   r   r	   r0   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   rM   )r   zCallable[[], bool]rN   rO   rP   r,   r<   rQ   rN   zbytes | bytearray)rS   rT   rU   rV   r#   r   r   r   r   re   ri   r   rW   rX   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.close,  s    		 r%   c                j   #    U R                  5         [        R                  " 5       I S h  vN   g  N7fr,   ro   r    s    r"   rp   _LockstepSendStream.aclose/        

   rs   c                V   #    U R                   R                  U5      I S h  vN   g  N7fr,   )r   re   r1   s     r"   re   _LockstepSendStream.send_all3  s     ii  &&&s   )')c                T   #    U R                   R                  5       I S h  vN   g  N7fr,   )r   ri   r    s    r"   ri   1_LockstepSendStream.wait_send_all_might_not_block6  s     ii55777s   (&(r   Nr   r   rN   rO   rM   rP   )
rS   rT   rU   rV   r#   r)   rp   re   ri   rW   rX   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.close>  s    		  "r%   c                j   #    U R                  5         [        R                  " 5       I S h  vN   g  N7fr,   ro   r    s    r"   rp   _LockstepReceiveStream.acloseA  r   rs   Nc                T   #    U R                   R                  U5      I S h  vN $  N7fr,   )r   r   r;   s     r"   r   #_LockstepReceiveStream.receive_someE  s      YY++I6666rw   r   r   rM   r,   r   )	rS   rT   rU   rV   r#   r)   rp   r   rW   rX   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   I  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   rX   r%   r"   lockstep_stream_pairr   d  s      :;;r%   )r   rZ   r   r   r<   rQ   rN   bool)rN   z,tuple[MemorySendStream, MemoryReceiveStream])r   z0Callable[[], tuple[SendStreamT, ReceiveStreamT]]rN   z]tuple[StapledStream[SendStreamT, ReceiveStreamT], StapledStream[SendStreamT, ReceiveStreamT]])rN   zqtuple[StapledStream[MemorySendStream, MemoryReceiveStream], StapledStream[MemorySendStream, MemoryReceiveStream]])rN   z tuple[SendStream, ReceiveStream])rN   zYtuple[StapledStream[SendStream, ReceiveStream], StapledStream[SendStream, ReceiveStream]])&
__future__r   r8   collections.abcr   r   typingr   r    r	   r
   _highlevel_genericr   abcr   r   typing_extensionsr   objectr   __annotations__r   r   r   r   finalrZ   r   r   r   r   r   r   r   r   r   r   rX   r%   r"   <module>r      s;   "  / )  . ++  If$5 56	9 6r6z*) *m:6)?<- <-~ o4z o4 o4d J- J Jb !	#(#.# 	#
 
#L$$N
B

M:j[ [|8* 8$7] 7A6<r%   