§
    �Ÿj"•  ã                  óL  — d Z ddlmZ ddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddlZddlmZ ddlmZmZ ddlmZ ddlZddlmZ ddlmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z% dd	l&m'Z'm(Z( dd
l)m*Z* ddl+m,Z, ddl-m.Z. ddl/m0Z0 ddl1m2Z2 ddl3m4Z4m5Z5m6Z6m7Z7 e	j8        Z9ej:        Z:dHd„Z;dZ<dZ=dId„Z>dJd„Z?	 ddl@Z@dZAe@jB        e@jC        z  dœdKd „ZDdJd!„ZEn# eF$ r
 d"ZAe>e?cZDZEY nw xY w	 ddlGZGdZH ejI        eGjJ        e6¬#¦  «        ZKeGjL        ZMn# eF$ r d"ZHY nw xY wdLd%„ZNe	jO        ZPd&ZQ ejR        ¦   «         ZSdMd(„ZTdNd)„ZUd*d+d,d-œZVd. eU¦   «         d/d0œid1fd.d2d/d0œid3fd4œZWdOd7„ZXdPd9„ZY G d:„ d;e(¦  «        ZZ G d<„ d=¦  «        Z[dQdD„Z\dRdF„Z] G dG„ d.e'¦  «        Z^dS )Saˆ  Session object for building, serializing, sending, and receiving messages.

The Session object supports serialization, HMAC signatures,
and metadata on messages.

Also defined here are utilities for working with Sessions:
* A SessionFactory to be used as a base class for configurables that work with
Sessions.
* A Message object for convenience that allows attribute-access to the msg dict.
é    )ÚannotationsN)Úb2a_hex)ÚdatetimeÚtimezone)Úcompare_digest)ÚIOLoop)ÚAnyÚBoolÚCallableÚCBytesÚCUnicodeÚDictÚDottedObjectNameÚInstanceÚIntegerÚSetÚ
TraitErrorÚUnicodeÚobserve)ÚConfigurableÚLoggingConfigurable)Ú
get_logger)Úimport_item)Ú	ZMQStreamé   )Úprotocol_version)Úadapt)Úextract_datesÚ
json_cleanÚjson_defaultÚsquash_datesÚobjút.AnyÚreturnc                óì  — t          | t          ¦  «        rwt          |                      ¦   «         ¦  «        D ]T}t	          | |         ¦  «        | |<   t          |t
          ¦  «        r%|                      |¦  «        | t	          |¦  «        <   ŒUngt          | t          ¦  «        r(t          | ¦  «        D ]\  }}t	          |¦  «        | |<   Œn*t          | t
          ¦  «        r|                      d¦  «        } | S )z#coerce unicode back to bytestrings.Úutf8)	Ú
isinstanceÚdictÚlistÚkeysÚsquash_unicodeÚstrÚpopÚ	enumerateÚencode)r"   ÚkeyÚiÚvs       úc/var/www/finuniver-perm.ru/html/student/venv/lib/python3.11/site-packages/jupyter_client/session.pyr+   r+   C   sé   € å�#•tÑÔð 	!Ý˜Ÿš™
œ
Ñ#Ô#ð 	8ð 	8ˆCÝ% c¨#¤hÑ/Ô/ˆC�‰HÝ˜#�sÑ#Ô#ð 8Ø+.¯7ª7°3©<¬<�•N 3Ñ'Ô'Ñ(øð	8õ 
�C�Ñ	Ô	ð !Ý˜c‘N”Nð 	'ð 	'‰DˆAˆqÝ# AÑ&Ô&ˆC�‰FˆFð	'å	�C�Ñ	Ô	ð !Ø�jŠj˜Ñ Ô ˆØ€Jó    é@   i   Úbytesc                óZ  — 	 t          j        | t          dd¬¦  «                             dd¬¦  «        S # t          t
          f$ re}t          j        t          | ¦  «        t          dd¬¦  «                             dd¬¦  «        }t          j        d|› d�d¬	¦  «         |cY d
}~S d
}~ww xY w)z!Convert a json object to a bytes.F)ÚdefaultÚensure_asciiÚ	allow_nanr&   Úsurrogateescape)Úerrorsz#Message serialization failed with:
zk
Supporting this message is deprecated in jupyter-client 7, please make sure your message is JSON-complianté   ©Ú
stacklevelN)	ÚjsonÚdumpsr    r/   Ú	TypeErrorÚ
ValueErrorr   ÚwarningsÚwarn)r"   ÚeÚpackeds      r3   Újson_packerrH   _   sì   € ðÝŒzØÝ ØØð	
ñ 
ô 
÷
 Š&�Ð 1ˆ&Ñ
2Ô
2ð	3øõ •zÐ"ð ð ð å”Ý�s‰OŒOÝ ØØð	
ñ 
ô 
÷
 Š&�Ð 1ˆ&Ñ
2Ô
2ð 	õ 	Œð2°1ð 2ð 2ð 2ð ð		
ñ 	
ô 	
ð 	
ð ˆˆˆˆˆˆøøøøð!øøøs   ‚14 ´B*ÁAB%ÂB*Â%B*Úsústr | bytesc                ó€   — t          | t          ¦  «        r|                      dd¦  «        } t          j        | ¦  «        S )z,Convert a json bytes or string to an object.r&   Úreplace)r'   r6   Údecoder@   Úloads©rI   s    r3   Újson_unpackerrP   {   s5   € å�!•UÑÔð (Ø�HŠH�V˜YÑ'Ô'ˆÝŒ:�a‰=Œ=Ðr4   T)ÚoptionrQ   ú
int | Nonec               óz   — 	 t          j        | t          |¬¦  «        S # t          $ r t	          | ¦  «        cY S w xY w)zKConvert a json object to a bytes using orjson with fallback to json_packer.)r8   rQ   )ÚorjsonrA   r    Ú	ExceptionrH   )r"   rQ   s     r3   Úorjson_packerrV   Š   sM   € ð	$Ý”< ­\À&ÐIÑIÔIÐIøÝð 	$ð 	$ð 	$Ý˜sÑ#Ô#Ð#Ð#Ð#ð	$øøøs   ‚ ž:¹:c                ój   — 	 t          j        | ¦  «        S # t          $ r t          | ¦  «        cY S w xY w)zXConvert a json bytes or string to an object using orjson with fallback to json_unpacker.)rT   rN   rU   rP   rO   s    r3   Úorjson_unpackerrX   “   sD   € ð	$Ý”< ‘?”?Ð"øÝð 	$ð 	$ð 	$Ý  Ñ#Ô#Ð#Ð#Ð#ð	$øøøs   ‚ –2±2F)r8   Úoc                óP   — t          j        t          | ¦  «        t          ¦  «        S )z'Pack an object using the pickle module.)ÚpicklerA   r!   ÚPICKLE_PROTOCOL)rY   s    r3   Úpickle_packerr]   ¥   s   € åŒ<� Q™œ­Ñ9Ô9Ð9r4   s	   <IDS|MSG>r,   c                 óŒ   — t          j        d¦  «        } d                     d„ | dd…         | dd…         fD ¦   «         ¦  «        S )zÈGenerate a new random id.

    Avoids problematic runtime import in stdlib uuid on Python 2.

    Returns
    -------

    id string (16 random bytes as hex-encoded text, chunks separated by '-')
    é   ú-c              3  óZ   K  — | ]&}t          |¦  «                             d ¦  «        V — Œ'dS )ÚasciiN)r   rM   )Ú.0Úxs     r3   ú	<genexpr>znew_id.<locals>.<genexpr>Á   s6   è è € ÐKÐK°1•G˜A‘J”J×%Ò% gÑ.Ô.ÐKÐKÐKÐKÐKÐKr4   Né   )ÚosÚurandomÚjoin)Úbufs    r3   Únew_idrk   ¶   sG   € õ Œ*�R‰.Œ.€CØ�8Š8ÐKÐK¸¸R¸a¸R¼À#ÀaÀbÀbÄ'Ð8JÐKÑKÔKÑKÔKÐKr4   c                 óD   — t          ¦   «                              d¦  «        S )zReturn new_id as ascii bytesrb   )rk   r/   © r4   r3   Únew_id_bytesrn   Ä   s   € å‰8Œ8�?Š?˜7Ñ#Ô#Ð#r4   zSession.sessionzSession.usernamezSession.keyfile)ÚidentÚuserÚkeyfileÚSessionÚ )r0   rq   z„Use HMAC digests for authentication of messages.
        Setting this flag will generate a new UUID to use as the HMAC key.
        r4   zDon't authenticate messages.)Úsecurez	no-secureÚcfgÚNonec                óž   — t          j        dt          d¬¦  «         d| v rd| j        v s	d| j        v rdS t	          ¦   «         | j        _        dS )z�Set the default behavior for a config environment to be secure.

    If Session.key/keyfile have not been set, set Session.key to
    a new random UUID.
    zdefault_secure is deprecatedr=   r>   rr   r0   rq   N)rD   rE   ÚDeprecationWarningrr   rn   r0   )ru   s    r3   Údefault_securery   Ý   sW   € õ „MÐ0Õ2DÐQRÐSÑSÔSÐSØ�CÐÐ˜U c¤kÐ1Ð1°YÀ#Ä+Ð5MÐ5MØˆå"‘n”n€C„K„O€O€Or4   r   c                 ó4   — t          j        t          ¦  «        S )z#Return timezone-aware UTC timestamp)r   ÚnowÚutcrm   r4   r3   Úutcnowr}   ê   s   € åŒ<�ÑÔÐr4   c                  óº   ‡ — e Zd ZdZ ed¦  «        Z ed¦  «        dd„¦   «         Z ed	¦  «        Z	dd
„Z
 edd¬¦  «        Z ed¦  «        Zdd„Zdˆ fd„Zˆ xZS )ÚSessionFactoryz[The Base class for configurables that have a Session, Context, logger,
    and IOLoop.
    rs   ÚlognameÚchanger#   r$   rv   c                óD   — t          j        |d         ¦  «        | _        d S )NÚnew)ÚloggingÚ	getLoggerÚlog©Úselfr�   s     r3   Ú_logname_changedzSessionFactory._logname_changedû   s   € åÔ$ V¨E¤]Ñ3Ô3ˆŒˆˆr4   úzmq.Contextc                ó(   — t          j        ¦   «         S ©N)ÚzmqÚContext©rˆ   s    r3   Ú_context_defaultzSessionFactory._context_default  s   € ÝŒ{‰}Œ}Ðr4   zjupyter_client.session.SessionT©Ú
allow_noneztornado.ioloop.IOLoopr   c                ó(   — t          j        ¦   «         S rŒ   )r   Úcurrentr�   s    r3   Ú_loop_defaultzSessionFactory._loop_default	  s   € ÝŒ~ÑÔÐr4   Úkwargsc                ón   •—  t          ¦   «         j        di |¤Ž | j        €t          di |¤Ž| _        dS dS )zInitialize a session factory.Nrm   )ÚsuperÚ__init__Úsessionrr   ©rˆ   r–   Ú	__class__s     €r3   r™   zSessionFactory.__init__  sI   ø€ à�‰ŒÔÐ"Ð"˜6Ð"Ð"Ð"àŒ<Ðå"Ð,Ð, VÐ,Ð,ˆDŒLˆLˆLð  Ðr4   ©r�   r#   r$   rv   )r$   rŠ   )r$   r   ©r–   r#   r$   rv   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r€   r   r‰   r   Úcontextr�   rš   Úloopr•   r™   Ú__classcell__©rœ   s   @r3   r   r   ô   sß   ø€ € € € € ðð ð ˆg�b‰kŒk€Gà€WˆYÑÔð4ð 4ð 4ñ Ôð4ð ˆh�}Ñ%Ô%€Gðð ð ð ð ˆhÐ7ÀDÐIÑIÔI€Gàˆ8Ð+Ñ,Ô,€Dð ð  ð  ð  ð-ð -ð -ð -ð -ð -ð -ð -ð -ð -r4   r   c                  óB   — e Zd ZdZdd„Zdd„Zdd
„Zdd„Zdd„Zdd„Z	dS )ÚMessagez¬A simple message object that maps dict keys to attributes.

    A Message can be created from a dict and a dict from a Message instance
    simply by calling dict(msg_obj).Úmsg_dictúdict[str, t.Any]r$   rv   c                ó´   — | j         }t          |¦  «                             ¦   «         D ].\  }}t          |t          ¦  «        rt	          |¦  «        }|||<   Œ/dS )zInitialize a message.N)Ú__dict__r(   Úitemsr'   r¨   )rˆ   r©   ÚdctÚkr2   s        r3   r™   zMessage.__init__  s`   € àŒmˆÝ˜‘N”N×(Ò(Ñ*Ô*ð 	ð 	‰DˆAˆqÝ˜!�TÑ"Ô"ð Ý˜A‘J”J�ØˆC�‰FˆFð	ð 	r4   út.ItemsView[str, t.Any]c                óN   — t          | j                             ¦   «         ¦  «        S rŒ   )Úiterr¬   r­   r�   s    r3   Ú__iter__zMessage.__iter__$  s   € Ý�D”M×'Ò'Ñ)Ô)Ñ*Ô*Ð*r4   r,   c                ó*   — t          | j        ¦  «        S rŒ   )Úreprr¬   r�   s    r3   Ú__repr__zMessage.__repr__'  s   € Ý�D”MÑ"Ô"Ð"r4   c                ó4   — t          j        | j        ¦  «        S rŒ   )ÚpprintÚpformatr¬   r�   s    r3   Ú__str__zMessage.__str__*  s   € ÝŒ~˜dœmÑ,Ô,Ð,r4   r¯   ÚobjectÚboolc                ó   — || j         v S rŒ   ©r¬   ©rˆ   r¯   s     r3   Ú__contains__zMessage.__contains__-  s   € Ø�D”MÐ!Ð!r4   r#   c                ó   — | j         |         S rŒ   r¾   r¿   s     r3   Ú__getitem__zMessage.__getitem__0  s   € ØŒ}˜QÔÐr4   N)r©   rª   r$   rv   )r$   r°   ©r$   r,   )r¯   r»   r$   r¼   )r¯   r,   r$   r#   )
rŸ   r    r¡   r¢   r™   r³   r¶   rº   rÀ   rÂ   rm   r4   r3   r¨   r¨     s–   € € € € € ð(ð (ð
ð ð ð ð+ð +ð +ð +ð#ð #ð #ð #ð-ð -ð -ð -ð"ð "ð "ð "ð ð  ð  ð  ð  ð  r4   r¨   Úmsg_idÚmsg_typeÚusernamerš   úSession | strrª   c                óH   — t          ¦   «         }t          }t          ¦   «         S )zCreate a new message header)r}   r   Úlocals)rÄ   rÅ   rÆ   rš   ÚdateÚversions         r3   Ú
msg_headerrÌ   4  s   € õ ‰8Œ8€DÝ€GÝ‰8Œ8€Or4   Úmsg_or_headerc                óÀ   — | si S 	 | d         }n+# t           $ r 	 | d         }| }n# t           $ r ‚ w xY wY nw xY wt          |t          ¦  «        st          |¦  «        }|S )z-Given a message or header, return the header.ÚheaderrÄ   )ÚKeyErrorr'   r(   )rÍ   Úhs     r3   Úextract_headerrÒ   =  sž   € àð Øˆ	ð
à˜(Ô#ˆˆøÝð ð ð ð	à˜hÔ'ˆAð ˆAˆAøõ ð 	ð 	ð 	Øð	øøøð ˆAðøøøõ �a�ÑÔð Ý�‰GŒGˆØ€Hs   † �
7š%¢7¥1±7¶7c                  óv  ‡ — e Zd ZdZ eddd¬¦  «        Z eddd¬¦  «        Z eerdnddd	¬¦  «        Z	 eerdnddd
¬¦  «        Z
 eerene¦  «        Z eerene¦  «        Z edd¦  «        dhd„¦   «         Z eddd¬¦  «        Zdid„Z ed¦  «        dhd„¦   «         Z ed¦  «        Z eej                             dd¦  «        dd¬¦  «        Z ei dd¬¦  «        Z  e!d¦  «        Z" edd¬¦  «        Z#djd!„Z$ ed"¦  «        dhd#„¦   «         Z% ed$dd%¬¦  «        Z& ed&¦  «        dhd'„¦   «         Z' e(¦   «         Z)dkd)„Z* e+e,j-        d¬*¦  «        Z.dld+„Z/ e0¦   «         Z1 e!d,dd-¬¦  «        Z2 eddd.¬¦  «        Z3 ed/¦  «        dhd0„¦   «         Z4 e!¦   «         Z5 e!d,dd1¬¦  «        Z6 e!e7dd2¬¦  «        Z8 e!e9dd3¬¦  «        Z:dmˆ fd5„Z;dnd6„Z<dZ=e>did7„¦   «         Z?dld8„Z@dod;„ZA	 	 	 	 dpdqdC„ZBdrdF„ZC	 dsdtdK„ZD	 	 	 	 	 	 	 dudvdU„ZE	 	 	 dwdxdZ„ZFeGjH        ddfdyd^„ZI	 dzd{da„ZJd|dc„ZKdldd„ZL	 	 d}d~de„ZMddg„ZNˆ xZOS )€rr   a™  Object for handling serialization and sending of messages.

    The Session object handles building messages and sending them
    with ZMQ sockets or ZMQStream objects.  Objects can communicate with each
    other over the network via Session objects, and only need to work with the
    dict-based IPython message spec. The Session will handle
    serialization/deserialization, security, and metadata.

    Sessions support configurable serialization via packer/unpacker traits,
    and signing with HMAC digests via the key/keyfile traits.

    Parameters
    ----------

    debug : bool
        whether to trigger extra debugging statements
    packer/unpacker : str : 'orjson', 'json', 'pickle', 'msgpack' or import_string
        importstrings for methods to serialize message parts.  If just
        'json' or 'pickle', predefined JSON and pickle packers will be used.
        Otherwise, the entire importstring must be used.

        The functions must accept at least valid JSON input, and output *bytes*.

        For example, to use msgpack:
        packer = 'msgpack.packb', unpacker='msgpack.unpackb'
    pack/unpack : callables
        You can also set the pack/unpack callables for serialization directly.
    session : bytes
        the ID of this Session object.  The default is to generate a new UUID.
    username : unicode
        username added to message headers.  The default is to ask the OS.
    key : bytes
        The key used to initialize an HMAC signature.  If unset, messages
        will not be signed or checked.
    keyfile : filepath
        The file containing a key.  If this is set, `key` will be initialized
        to the contents of the file.

    FTzDebug output in the Session)ÚconfigÚhelpz‹Whether to check PID to protect against calls after fork.

        This check can be disabled if fork-safety is handled elsewhere.
        rT   r@   zŸThe name of the packer for serializing messages.
            Should be one of 'json', 'pickle', or an import name
            for a custom callable serializer.zjThe name of the unpacker for unserializing messages.
        Only used with custom functions for `packer`.ÚpackerÚunpackerr�   r#   r$   rv   c                ó  — |d                               ¦   «         }|dk    r!t          rt          t          c| _        | _        n·|dk    s|dk    rt          t          c| _        | _        n‘|dk    rt          t          c| _        | _        nq|dk    r!t          rt          t          c| _        | _        nJt          t          |d         ¦  «        ¦  «        }|d         dk    rdnd	}|                      ||¦  «         d S |d         x| _        | _        d S )
Nrƒ   rT   r@   r[   ÚmsgpackÚnamerÖ   ÚpackÚunpack)ÚlowerÚ
has_orjsonrV   rX   rÛ   rÜ   rH   rP   r]   Úpickle_unpackerÚhas_msgpackÚmsgpack_packerÚmsgpack_unpackerr   r,   Ú	set_traitrÖ   r×   )rˆ   r�   rƒ   r"   rÚ   s        r3   Ú_packer_unpacker_changedz Session._packer_unpacker_changed˜  sö   € à�UŒm×!Ò!Ñ#Ô#ˆØ�(Š?ˆ?�zˆ?Ý%2µOÐ"ˆDŒI�t”{�{Ø�FŠ]ˆ]˜c Xšo˜oÝ%0µ-Ð"ˆDŒI�t”{�{Ø�HŠ_ˆ_Ý%2µOÐ"ˆDŒI�t”{�{Ø�IÒÐ¥+ÐÝ%3Õ5EÐ"ˆDŒI�t”{�{å�c &¨¤-Ñ0Ô0Ñ1Ô1ˆCØ# Fœ^¨xÒ7Ð7�6�6¸XˆDØ�NŠN˜4 Ñ%Ô%Ð%ØˆFØ&,¨U¤mÐ3ˆŒ�d”m�m�mr4   rs   z"The UUID identifying this session.r,   c                óV   — t          ¦   «         }|                     d¦  «        | _        |S ©Nrb   )rk   r/   Úbsession)rˆ   Úus     r3   Ú_session_defaultzSession._session_default¬  s#   € Ý‰HŒHˆØŸš Ñ)Ô)ˆŒØˆr4   rš   c                óD   — | j                              d¦  «        | _        d S ræ   )rš   r/   rç   r‡   s     r3   Ú_session_changedzSession._session_changed±  s   € àœ×+Ò+¨GÑ4Ô4ˆŒˆˆr4   r4   ÚUSERrÆ   z:Username for the Session. Default is your system username.)rÕ   rÔ   zZMetadata dictionary, which serves as the default top-level metadata dict for each message.r   z$execution key, for signing messages.r6   c                ó   — t          ¦   «         S rŒ   )rn   r�   s    r3   Ú_key_defaultzSession._key_defaultË  s   € Ý‰~Œ~Ðr4   r0   c                ó.   — |                       ¦   «          d S rŒ   )Ú	_new_authr‡   s     r3   Ú_key_changedzSession._key_changedÎ  s   € à�ŠÑÔÐÐÐr4   zhmac-sha256zcThe digest scheme used to construct the message signatures.
        Must have the form 'hmac-HASH'.Úsignature_schemec                óF  — |d         }|                      d¦  «        st          d|z  ¦  «        ‚|                     dd¦  «        d         }	 t          t          |¦  «        | _        n%# t          $ r}t          d|z  ¦  «        |‚d }~ww xY w|                      ¦   «          d S )Nrƒ   zhmac-z0signature_scheme must start with 'hmac-', got %rr`   r   z!hashlib has no such attribute: %s)Ú
startswithr   ÚsplitÚgetattrÚhashlibÚ
digest_modÚAttributeErrorrð   )rˆ   r�   rƒ   Ú	hash_namerF   s        r3   Ú_signature_scheme_changedz!Session._signature_scheme_changedÙ  s¶   € à�UŒmˆØ�~Š~˜gÑ&Ô&ð 	WÝÐOÐRUÑUÑVÔVÐVØ—I’I˜c 1Ñ%Ô% aÔ(ˆ	ð	UÝ%¥g¨yÑ9Ô9ˆDŒOˆOøÝð 	Uð 	Uð 	UÝÐ@À9ÑLÑMÔMÐSTÐTøøøøð	Uøøøà�ŠÑÔÐÐÐs   ÁA( Á(
B
Á2BÂB
ú
t.Callablec                ó   — t           j        S rŒ   )r÷   Úsha256r�   s    r3   Ú_digest_mod_defaultzSession._digest_mod_defaultç  s
   € ÝŒ~Ðr4   r‘   c                óp   — | j         r't          j        | j         | j        ¬¦  «        | _        d S d | _        d S )N)Ú	digestmod)r0   ÚhmacÚHMACrø   Úauthr�   s    r3   rð   zSession._new_authì  s5   € ØŒ8ð 	Ýœ	 $¤(°d´oÐFÑFÔFˆDŒIˆIˆIàˆDŒIˆIˆIr4   i   zzThe maximum number of digests to remember.

        The digest history will be culled when it exceeds this value.
        z&path to file containing execution key.rq   c                óº   — t          |d         d¦  «        5 }|                     ¦   «                              ¦   «         | _        d d d ¦  «         d S # 1 swxY w Y   d S )Nrƒ   Úrb)ÚopenÚreadÚstripr0   )rˆ   r�   Úfs      r3   Ú_keyfile_changedzSession._keyfile_changedþ  s�   € å�&˜”- Ñ&Ô&ð 	(¨!Ø—v’v‘x”x—~’~Ñ'Ô'ˆDŒHð	(ð 	(ð 	(ñ 	(ô 	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(øøøð 	(ð 	(ð 	(ð 	(ð 	(ð 	(s   —,AÁAÁAzJThreshold (in bytes) beyond which a buffer should be sent without copying.z[Threshold (in bytes) beyond which an object's buffer should be extracted to avoid pickling.z›The maximum number of items for a container to be introspected for custom serialization.
        Containers larger than this are pickled outright.
        r–   c                óP  •—  t          ¦   «         j        di |¤Ž |                      ¦   «          |                      i ¦  «        | _        | j         t          j        ¦   «         | _        |  	                    ¦   «          | j
        s#t          ¦   «                              d¦  «         dS dS )az  create a Session object

        Parameters
        ----------

        debug : bool
            whether to trigger extra debugging statements
        packer/unpacker : str : 'orjson', 'json', 'pickle', 'msgpack' or import_string
            importstrings for methods to serialize message parts.  If just
            'json' or 'pickle', predefined JSON and pickle packers will be used.
            Otherwise, the entire importstring must be used.

            The functions must accept at least valid JSON input, and output
            *bytes*.

            For example, to use msgpack:
            packer = 'msgpack.packb', unpacker='msgpack.unpackb'
        pack/unpack : callables
            You can also set the pack/unpack callables for serialization
            directly.
        session : unicode (must be ascii)
            the ID of this Session object.  The default is to generate a new
            UUID.
        bsession : bytes
            The session as bytes
        username : unicode
            username added to message headers.  The default is to ask the OS.
        key : bytes
            The key used to initialize an HMAC signature.  If unset, messages
            will not be signed or checked.
        signature_scheme : str
            The message digest scheme. Currently must be of the form 'hmac-HASH',
            where 'HASH' is a hashing function available in Python's hashlib.
            The default is 'hmac-sha256'.
            This is ignored if 'key' is empty.
        keyfile : filepath
            The file containing a key.  If this is set, `key` will be
            initialized to the contents of the file.
        zCMessage signing is disabled.  This is insecure and not recommended!Nrm   )r˜   r™   Ú_check_packersrÛ   Únonerš   rg   ÚgetpidÚpidrð   r0   r   Úwarningr›   s     €r3   r™   zSession.__init__  s§   ø€ ðP 	�‰ŒÔÐ"Ð"˜6Ð"Ð"Ð"Ø×ÒÑÔÐØ—I’I˜b‘M”MˆŒ	àŒˆÝ”9‘;”;ˆŒØ�ŠÑÔÐØŒxð 	Ý‰LŒL× Ò ØUñô ð ð ð ð	ð 	r4   c           	     ó  —  t          | ¦  «        ¦   «         }|                      ¦   «         D ]!}t          ||t          | |¦  «        ¦  «         Œ"t	          ¦   «         |_        |j                             | j        ¦  «         |S )a  Create a copy of this Session

        Useful when connecting multiple times to a given kernel.
        This prevents a shared digest_history warning about duplicate digests
        due to multiple connections to IOPub in the same process.

        .. versionadded:: 5.1
        )ÚtypeÚtraitsÚsetattrrö   ÚsetÚdigest_historyÚupdate)rˆ   Únew_sessionrÚ   s      r3   ÚclonezSession.cloneM  sw   € ð !•d˜4‘j”j‘l”lˆØ—K’K‘M”Mð 	<ð 	<ˆDÝ�K ¥w¨t°TÑ':Ô':Ñ;Ô;Ð;Ð;å%(¡U¤UˆÔ"ØÔ"×)Ò)¨$Ô*=Ñ>Ô>Ð>ØÐr4   c                óp   — | j         }| xj         dz  c_         | j        › dt          j        ¦   «         › d|› �S )Nr   Ú_)Úmessage_countrš   rg   r  )rˆ   Úmessage_numbers     r3   rÄ   zSession.msg_ida  sB   € àÔ+ˆØÐÔ˜aÑÐÔØ”,Ð?Ð?¥¤¡¤Ð?Ð?¨~Ð?Ð?Ð?r4   c                ó–  ‡‡— | j         Š| j        Šdddgi}	  ‰|¦  «        }n/# t          $ r"}d| j        › d|› �}t	          |¦  «        |‚d}~ww xY wt          |t          ¦  «        st	          dt          |¦  «        z  ¦  «        ‚	  ‰|¦  «        }||k    sJ ‚n7# t          $ r*}d| j        ›d	| j        ›d
|› �}t	          |¦  «        |‚d}~ww xY wdt          ¦   «         i}	  ‰ ‰|¦  «        ¦  «        }t          |d         t          ¦  «        rd}t	          |¦  «        ‚dS # t          $ r ˆfd„| _         ˆfd„| _        Y dS w xY w)z#check packers for datetime support.Úar   Úhizpacker 'z(' could not serialize a simple message: Nz,message packed to %r, but bytes are requiredz	unpacker z% could not handle output from packer z: Útz!Shouldn't deserialize to datetimec                ó4   •—  ‰t          | ¦  «        ¦  «        S rŒ   )r!   )rY   rÛ   s    €r3   ú<lambda>z(Session._check_packers.<locals>.<lambda>ˆ  s   ø€  $ $¥|°A¡¤Ñ"7Ô"7€ r4   c                ó   •—  ‰| ¦  «        S rŒ   rm   )rI   rÜ   s    €r3   r$  z(Session._check_packers.<locals>.<lambda>‰  s   ø€  F F¨1¡I¤I€ r4   )rÛ   rÜ   rU   rÖ   rC   r'   r6   r  r×   r}   r   )	rˆ   Úmsg_listrG   rF   ÚmsgÚunpackedÚmsg_datetimerÛ   rÜ   s	          @@r3   r  zSession._check_packersg  sÃ  øø€ àŒyˆØ”ˆð ˜!˜T˜Ð#ˆð	)Ø�T˜(‘^”^ˆFˆFøÝð 	)ð 	)ð 	)ØU˜Tœ[ÐUÐUÐRSÐUÐUˆCÝ˜S‘/”/ qÐ(øøøøð	)øøøõ
 ˜&¥%Ñ(Ô(ð 	\ÝÐKÍdÐSYÉlÌlÑZÑ[Ô[Ð[ð	)Ø�v˜f‘~”~ˆHØ˜xÒ'Ð'Ð'Ð'Ð'øÝð 	)ð 	)ð 	)Øh˜dœmÐhÐhÐTXÔT_ÐhÐhÐefÐhÐhˆCÝ˜S‘/”/ qÐ(øøøøð	)øøøð
 �V™XœX�ˆð	.Ø�v˜d˜d <Ñ0Ô0Ñ1Ô1ˆHÝ˜( 3œ-­Ñ2Ô2ð &Ø9�Ý  ‘o”oÐ%ð&ð &øõ ð 	.ð 	.ð 	.Ø7Ð7Ð7Ð7ˆDŒIØ-Ð-Ð-Ð-ˆDŒKˆKˆKˆKð	.øøøs?   ˜$ ¤
A®AÁAÂB Â
CÂ&%CÃCÃ$A D& Ä&EÅErÅ   rª   c                óD   — t          | j        || j        | j        ¦  «        S )z#Create a header for a message type.)rÌ   rÄ   rÆ   rš   )rˆ   rÅ   s     r3   rÌ   zSession.msg_header‹  s   € å˜$œ+ x°´ÀÄÑMÔMÐMr4   NÚcontentúdict | NoneÚparentúdict[str, t.Any] | NonerÏ   Úmetadatac                ó"  — i }|€|                       |¦  «        n|}||d<   |d         |d<   |d         |d<   |€i nt          |¦  «        |d<   |€i n||d<   | j                             ¦   «         |d<   |�|d                              |¦  «         |S )zõReturn the nested message dict.

        This format is different from what is sent over the wire. The
        serialize/deserialize methods converts this nested message dict to the wire
        format, which is a list of message parts.
        NrÏ   rÄ   rÅ   Úparent_headerr+  r/  )rÌ   rÒ   r/  Úcopyr  )rˆ   rÅ   r+  r-  rÏ   r/  r'  s          r3   r'  zSession.msg�  s­   € ð ˆØ.4¨n�—’ Ñ*Ô*Ð*À&ˆØˆˆH‰Ø˜xÔ(ˆˆH‰Ø  Ô,ˆˆJ‰Ø%+ ^˜r˜r½ÈÑ9OÔ9OˆˆOÑØ&˜˜˜°GˆˆI‰Øœ-×,Ò,Ñ.Ô.ˆˆJ‰ØÐØ�
ŒO×"Ò" 8Ñ,Ô,Ð,Øˆ
r4   r&  r)   c                óÆ   — | j         €dS | j                              ¦   «         }|D ]}|                     |¦  «         Œ|                     ¦   «                              ¦   «         S )zÈSign a message with HMAC digest. If no auth, return b''.

        Parameters
        ----------
        msg_list : list
            The [p_header,p_parent,p_content] part of the message list.
        Nr4   )r  r2  r  Ú	hexdigestr/   )rˆ   r&  rÑ   Úms       r3   ÚsignzSession.sign©  s\   € ð Œ9ÐØ�3ØŒI�NŠNÑÔˆØð 	ð 	ˆAØ�HŠH�Q‰KŒKˆKˆKØ�{Š{‰}Œ}×#Ò#Ñ%Ô%Ð%r4   r'  ro   úlist[bytes] | bytes | Noneúlist[bytes]c                ó8  — |                      di ¦  «        }|€| j        }n‹t          |t          ¦  «        r|                      |¦  «        }n`t          |t
          ¦  «        rnJt          |t          ¦  «        r|                     d¦  «        }nt          dt          |¦  «        z  ¦  «        ‚|                      |d         ¦  «        |                      |d         ¦  «        |                      |d         ¦  «        |g}g }t          |t          ¦  «        r|                     |¦  «         n|�|                     |¦  «         |                     t          ¦  «         |                      |¦  «        }|                     |¦  «         |                     |¦  «         |S )a2  Serialize the message components to bytes.

        This is roughly the inverse of deserialize. The serialize/deserialize
        methods work with full message lists, whereas pack/unpack work with
        the individual message parts in the message list.

        Parameters
        ----------
        msg : dict or Message
            The next message dict as returned by the self.msg method.

        Returns
        -------
        msg_list : list
            The list of bytes objects to be sent with the format::

                [ident1, ident2, ..., DELIM, HMAC, p_header, p_parent,
                 p_metadata, p_content, buffer1, buffer2, ...]

            In this list, the ``p_*`` entities are the packed or serialized
            versions, so if JSON is used, these are utf8 encoded JSON strings.
        r+  Nr&   zContent incorrect type: %srÏ   r1  r/  )Úgetr  r'   r(   rÛ   r6   r,   r/   rB   r  r)   ÚextendÚappendÚDELIMr6  )rˆ   r'  ro   r+  Úreal_messageÚto_sendÚ	signatures          r3   Ú	serializezSession.serialize¸  sy  € ð6 —'’'˜) RÑ(Ô(ˆØˆ?Ø”iˆGˆGÝ˜¥Ñ&Ô&ð 		JØ—i’i Ñ(Ô(ˆGˆGÝ˜¥Ñ'Ô'ð 	JàÝ˜¥Ñ%Ô%ð 	Jà—n’n VÑ,Ô,ˆGˆGåÐ8½4À¹=¼=ÑHÑIÔIÐIð �IŠI�c˜(”mÑ$Ô$Ø�IŠI�c˜/Ô*Ñ+Ô+Ø�IŠI�c˜*”oÑ&Ô&Øð	
ˆð ˆå�e�TÑ"Ô"ð 	"à�NŠN˜5Ñ!Ô!Ð!Ð!ØÐØ�NŠN˜5Ñ!Ô!Ð!Ø�Š•uÑÔÐà—I’I˜lÑ+Ô+ˆ	Ø�Š�yÑ!Ô!Ð!à�Š�|Ñ$Ô$Ð$àˆr4   Ústreamú*zmq.sugar.socket.Socket | ZMQStream | NoneÚmsg_or_typeúdict[str, t.Any] | strúbytes | list[bytes] | NoneÚbuffersú&list[bytes | memoryview[bytes]] | NoneÚtrackr¼   c
                óü  — t          |t          j        ¦  «        sd}t          |t          j        j        ¦  «        r(|€J ‚t          j                             |j        ¦  «        }t          |t          t          z  ¦  «        r|}
|p|
                     dg ¦  «        }n|  	                    |||||	¬¦  «        }
| j
        r@t          j        ¦   «         | j        k    r$t          ¦   «                              d|
¦  «         dS |€g n|}t!          |¦  «        D ]m\  }}t          |t"          ¦  «        r|}n5	 t#          |¦  «        }n$# t$          $ r}d}t%          |¦  «        |‚d}~ww xY w|j        st)          d||fz  ¦  «        ‚Œn| j        rt-          |
| j        ¦  «        }
|                      |
|¦  «        }|                     |¦  «         t3          d„ |D ¦   «         ¦  «        }|| j        k     }|r|r|r|s|                     |dd	¬
¦  «        }n(|rt8          }|                     ||¬¦  «         nt8          }| j        r<t=          j        |
¦  «         t=          j        |¦  «         t=          j        |¦  «         ||
d<   |
S )aW  Build and send a message via stream or socket.

        The message format used by this function internally is as follows:

        [ident1,ident2,...,DELIM,HMAC,p_header,p_parent,p_content,
         buffer1,buffer2,...]

        The serialize/deserialize methods convert the nested message dict into this
        format.

        Parameters
        ----------

        stream : zmq.Socket or ZMQStream
            The socket-like object used to send the data.
        msg_or_type : str or Message/dict
            Normally, msg_or_type will be a msg_type unless a message is being
            sent more than once. If a header is supplied, this can be set to
            None and the msg_type will be pulled from the header.

        content : dict or None
            The content of the message (ignored if msg_or_type is a message).
        header : dict or None
            The header dict for the message (ignored if msg_to_type is a message).
        parent : Message or dict or None
            The parent or parent header describing the parent of this message
            (ignored if msg_or_type is a message).
        ident : bytes or list of bytes
            The zmq.IDENTITY routing path.
        metadata : dict or None
            The metadata describing the message
        buffers : list or None
            The already-serialized buffers to be appended to the message.
        track : bool
            Whether to track.  Only for use with Sockets, because ZMQStream
            objects cannot track messages.


        Returns
        -------
        msg : dict
            The constructed message.
        FNrG  )r+  r-  rÏ   r/  z/WARNING: attempted to send message from fork
%sz0Buffer objects must support the buffer protocol.z Buffer %i (%r) is not contiguousc                ó,   — g | ]}t          |¦  «        ‘ŒS rm   )Úlen)rc   rI   s     r3   ú
<listcomp>z Session.send.<locals>.<listcomp>Z  s   € Ð/Ð/Ð/ !•s˜1‘v”vÐ/Ð/Ð/r4   T)r2  rI  ©r2  Útracker)r'   r�   ÚSocketÚasyncioÚshadowÚ
underlyingr¨   r(   r:  r'  Ú	check_pidrg   r  r  r   r  r.   Ú
memoryviewrB   Ú
contiguousrC   Úadapt_versionr   rA  r;  ÚmaxÚcopy_thresholdÚsend_multipartÚDONEÚdebugr¸   )rˆ   rB  rD  r+  r-  ro   rG  rI  rÏ   r/  r'  Úidxrj   ÚviewrF   Úemsgr?  Úlongestr2  rO  s                       r3   ÚsendzSession.sendø  sÄ  € õn ˜&¥#¤*Ñ-Ô-ð 	àˆEå�f�cœkÔ0Ñ1Ô1ð 	:ØÐ%Ð%Ð%Ý”Z×&Ò& vÔ'8Ñ9Ô9ˆFå�k¥7­T¡>Ñ2Ô2ð 	ð ˆCØÐ7 §¢¨°BÑ!7Ô!7ˆGˆGà—(’(ØØØØØ!ð ñ ô ˆCð Œ>ð 	�bœi™kœk¨T¬XÒ5Ð5Ý‰LŒL× Ò Ð!SÐUXÑYÔYÐYØ�4Ø˜�"�"¨WˆÝ! 'Ñ*Ô*ð 	Rð 	R‰HˆC�Ý˜#�zÑ*Ô*ð 1Ø��ð1å% c™?œ?�D�DøÝ ð 1ð 1ð 1ØM�DÝ# D™/œ/¨qÐ0øøøøð1øøøð ”?ð Rå Ð!CÀsÈCÀjÑ!PÑQÔQÐQðRð Ôð 	1Ý˜˜TÔ/Ñ0Ô0ˆCØ—.’.  eÑ,Ô,ˆØ�Š�wÑÔÐÝÐ/Ð/ wÐ/Ñ/Ô/Ñ0Ô0ˆØ˜Ô,Ò,ˆàð 	�gð 	 %ð 	°ð 	à×+Ò+¨G¸%ÀtÐ+ÑLÔLˆGˆGØð 	åˆGØ×!Ò! '°Ð!Ñ5Ô5Ð5Ð5åˆGàŒ:ð 	#ÝŒM˜#ÑÔÐÝŒM˜'Ñ"Ô"Ð"ÝŒM˜'Ñ"Ô"Ð"à ˆˆI‰àˆ
s   Ä0E Å 
E!Å
EÅE!úzmq.sugar.socket.SocketÚflagsÚintr2  c                óÜ  — g }t          |t          ¦  «        r|g}|�|                     |¦  «         |                     t          ¦  «         |                     |                      |dd…         ¦  «        ¦  «         |                     |¦  «         t          |t          j        j        ¦  «        r$t          j         	                    |j
        ¦  «        }|                     |||¬¦  «         dS )a0  Send a raw message via ident path.

        This method is used to send a already serialized message.

        Parameters
        ----------
        stream : ZMQStream or Socket
            The ZMQ stream or socket to use for sending the message.
        msg_list : list
            The serialized list of messages to send. This only includes the
            [p_header,p_parent,p_metadata,p_content,buffer1,buffer2,...] portion of
            the message.
        ident : ident or list
            A single ident or a list of idents to use in sending.
        Nr   rf   rN  )r'   r6   r;  r<  r=  r6  r�   rQ  rP  rR  rS  rZ  )rˆ   rB  r&  rc  r2  ro   r?  s          r3   Úsend_rawzSession.send_rawp  sÔ   € ð. ˆÝ�e�UÑ#Ô#ð 	Ø�GˆEØÐØ�NŠN˜5Ñ!Ô!Ð!à�Š•uÑÔÐà�Š�t—y’y ¨!¨A¨#¤Ñ/Ô/Ñ0Ô0Ð0Ø�Š�xÑ Ô Ð Ý�f�cœkÔ0Ñ1Ô1ð 	:Ý”Z×&Ò& vÔ'8Ñ9Ô9ˆFØ×Ò˜g u°4ÐÑ8Ô8Ð8Ð8Ð8r4   ÚsocketÚmodeú2tuple[list[bytes] | None, dict[str, t.Any] | None]c                óè  — t          |t          ¦  «        r|j        }t          |t          j        j        ¦  «        r$t          j                             |j        ¦  «        }	 |                     ||¬¦  «        }n3# t          j	        $ r!}|j
        t          j        k    rY d}~dS ‚ d}~ww xY w|                      ||¦  «        \  }}	 ||                      |||¬¦  «        fS # t          $ r}|‚d}~ww xY w)aY  Receive and unpack a message.

        Parameters
        ----------
        socket : ZMQStream or Socket
            The socket or stream to use in receiving.

        Returns
        -------
        [idents], msg
            [idents] is a list of idents and msg is a nested message dict of
            same format as self.msg returns.
        rN  N)NN)r+  r2  )r'   r   rg  r�   rQ  rP  rR  rS  Úrecv_multipartÚZMQErrorÚerrnoÚEAGAINÚfeed_identitiesÚdeserializerU   )rˆ   rg  rh  r+  r2  r&  rF   Úidentss           r3   ÚrecvzSession.recv•  s  € õ( �f�iÑ(Ô(ð 	#Ø”]ˆFÝ�f�cœkÔ0Ñ1Ô1ð 	:Ý”Z×&Ò& vÔ'8Ñ9Ô9ˆFð	Ø×,Ò,¨T¸Ð,Ñ=Ô=ˆHˆHøÝŒ|ð 	ð 	ð 	ØŒw�#œ*Ò$Ð$ð "�z�z�z�z�zàøøøøð	øøøð  ×/Ò/°¸$Ñ?Ô?Ñˆ�ð	Ø˜4×+Ò+¨H¸gÈDÐ+ÑQÔQÐQÐQøÝð 	ð 	ð 	àˆGøøøøð	øøøs6   Á!A9 Á9B)ÂB$Â#B$Â$B)ÃC  Ã 
C1Ã*C,Ã,C1úlist[bytes] | list[zmq.Message]ú3tuple[list[bytes], list[bytes] | list[zmq.Message]]c                óà  — |r[t          j        t           j        t                   |¦  «        }|                     t
          ¦  «        }|d|…         ||dz   d…         fS t          j        t           j        t          j                 |¦  «        }d}t          |¦  «        D ]\  }}|j        t
          k    rd} nŒ|rd}t          |¦  «        ‚|d|…         ||dz   d…         }}d„ |D ¦   «         |fS )ae  Split the identities from the rest of the message.

        Feed until DELIM is reached, then return the prefix as idents and
        remainder as msg_list. This is easily broken by setting an IDENT to DELIM,
        but that would be silly.

        Parameters
        ----------
        msg_list : a list of Message or bytes objects
            The message to be split.
        copy : bool
            flag determining whether the arguments are bytes or Messages

        Returns
        -------
        (idents, msg_list) : two lists
            idents will always be a list of bytes, each of which is a ZMQ
            identity. msg_list will be a list of bytes or zmq.Messages of the
            form [HMAC,p_header,p_parent,p_content,buffer1,buffer2,...] and
            should be unpackable/unserializable via self.deserialize at this
            point.
        Nr   TFzDELIM not in msg_listc                ó6   — g | ]}t          |j         ¦  «        ‘ŒS rm   ©r6   )rc   r5  s     r3   rM  z+Session.feed_identities.<locals>.<listcomp>è  s    € Ð3Ð3Ð3 q•E˜!œ'‘N”NÐ3Ð3Ð3r4   )
r"  ÚcastÚListr6   Úindexr=  r�   r¨   r.   rC   )rˆ   r&  r2  r]  Úfailedr5  r'  rq  s           r3   ro  zSession.feed_identitiesÀ  sü   € ð2 ð 	>Ý”v�aœf¥Uœm¨XÑ6Ô6ˆHØ—.’.¥Ñ'Ô'ˆCØ˜D˜S˜D”> 8¨C°!©G¨I¨IÔ#6Ð6Ð6å”v�aœf¥S¤[Ô1°8Ñ<Ô<ˆHØˆFÝ# HÑ-Ô-ð ð ‘��QØ”7�eÒ#Ð#Ø"�FØ�Eð $ð ð &Ø-�Ý  ‘o”oÐ%Ø'¨¨¨œ~¨x¸¸a¹¸	¸	Ô/B�HˆFØ3Ð3¨FÐ3Ñ3Ô3°XÐ=Ð=r4   r@  c                óº   — | j         dk    rdS | j                             |¦  «         t          | j        ¦  «        | j         k    r|                      ¦   «          dS dS )z9add a digest to history to protect against replay attacksr   N)Údigest_history_sizer  ÚaddrL  Ú_cull_digest_history)rˆ   r@  s     r3   Ú_add_digestzSession._add_digestê  se   € àÔ# qÒ(Ð(àˆFàÔ×Ò 	Ñ*Ô*Ð*ÝˆtÔ"Ñ#Ô# dÔ&>Ò>Ð>à×%Ò%Ñ'Ô'Ð'Ð'Ð'ð ?Ð>r4   c                óP  — t          | j        ¦  «        }t          t          |dz  ¦  «        || j        z
  ¦  «        }||k    rt          ¦   «         | _        dS t          j        t          t          | j        ¦  «        ¦  «        |¦  «        }| j         
                    |¦  «         dS )z_cull the digest history

        Removes a randomly selected 10% of the digest history
        é
   N)rL  r  rX  rd  r}  r  ÚrandomÚsampleÚtupleÚsortedÚdifference_update)rˆ   r”   Ú	n_to_cullÚto_culls       r3   r  zSession._cull_digest_historyõ  s”   € õ
 �dÔ)Ñ*Ô*ˆÝ�˜G r™MÑ*Ô*¨G°dÔ6NÑ,NÑOÔOˆ	Ø˜ÒÐÝ"%¡%¤%ˆDÔØˆFÝ”-¥¥f¨TÔ-@Ñ&AÔ&AÑ BÔ BÀIÑNÔNˆØÔ×-Ò-¨gÑ6Ô6Ð6Ð6Ð6r4   c                óh  — d}i }|szt          j        t           j        t          j                 |¦  «        }d„ |d|…         D ¦   «         }t          j        t           j        t
                   |¦  «        }|||d…         z   }t          j        t           j        t
                   |¦  «        }| j        �Ž|d         }|sd}t          |¦  «        ‚|| j        v rt          d|z  ¦  «        ‚|r|  	                    |¦  «         |  
                    |dd…         ¦  «        }	t          ||	¦  «        sd|z  }t          |¦  «        ‚t          |¦  «        |k    sd	|z  }t          |¦  «        ‚|                      |d         ¦  «        }
t          |
¦  «        |d
<   |
d         |d<   |
d         |d<   t          |                      |d         ¦  «        ¦  «        |d<   |                      |d         ¦  «        |d<   |r|                      |d         ¦  «        |d<   n|d         |d<   d„ |dd…         D ¦   «         }|rP|d         j        €Ct          j        t           j        t          j                 |¦  «        }d„ |dd…         D ¦   «         }||d<   | j        rt%          j        |¦  «         t'          |¦  «        S )aÇ  Unserialize a msg_list to a nested message dict.

        This is roughly the inverse of serialize. The serialize/deserialize
        methods work with full message lists, whereas pack/unpack work with
        the individual message parts in the message list.

        Parameters
        ----------
        msg_list : list of bytes or Message objects
            The list of message parts of the form [HMAC,p_header,p_parent,
            p_metadata,p_content,buffer1,buffer2,...].
        content : bool (True)
            Whether to unpack the content dict (True), or leave it packed
            (False).
        copy : bool (True)
            Whether msg_list contains bytes (True) or the non-copying Message
            objects in each place (False).

        Returns
        -------
        msg : dict
            The nested message dict with top-level keys [header, parent_header,
            content, buffers].  The buffers are returned as memoryviews.
        é   c                ó6   — g | ]}t          |j         ¦  «        ‘ŒS rm   rw  )rc   r'  s     r3   rM  z'Session.deserialize.<locals>.<listcomp>%  s"   € Ð!PÐ!PÐ!P°s¥%¨¬	Ñ"2Ô"2Ð!PÐ!PÐ!Pr4   Nr   zUnsigned MessagezDuplicate Signature: %rr   zInvalid Signature: %rz1malformed message, must have at least %i elementsrÏ   rÄ   rÅ   r=   r1  é   r/  rf   r+  c                ó,   — g | ]}t          |¦  «        ‘ŒS rm   )rU  ©rc   Úbs     r3   rM  z'Session.deserialize.<locals>.<listcomp>D  s   € Ð7Ð7Ð7 Q•:˜a‘=”=Ð7Ð7Ð7r4   c                óP   — g | ]#}t          t          |j        ¦  «        ¦  «        ‘Œ$S rm   )rU  r6   r�  s     r3   rM  z'Session.deserialize.<locals>.<listcomp>H  s(   € ÐHÐHÐH°a•z¥%¨¬¡.¤.Ñ1Ô1ÐHÐHÐHr4   rG  )r"  rx  ry  r�   r¨   r6   r  rC   r  r€  r6  r   rL  rB   rÜ   r   Úshaper\  r¸   r   )rˆ   r&  r+  r2  ÚminlenÚmessageÚmsg_list_beginningr@  r'  ÚcheckrÏ   rG  s               r3   rp  zSession.deserialize  s§  € ð< ˆØˆØð 	>å”v�aœf¥S¤[Ô1°8Ñ<Ô<ˆHØ!PÐ!P¸hÀwÈÀwÔ>OÐ!PÑ!PÔ!PÐÝ”v�aœf¥Uœm¨XÑ6Ô6ˆHØ)¨H°V°W°WÔ,=Ñ=ˆHÝ”6�!œ&¥œ-¨Ñ2Ô2ˆØŒ9Ð Ø  œˆIØð &Ø(�Ý  ‘o”oÐ%Ø˜DÔ/Ð/Ð/Ý Ð!:¸YÑ!FÑGÔGÐGØð ,à× Ò  Ñ+Ô+Ð+Ø—I’I˜h q¨ sœmÑ,Ô,ˆEÝ! )¨UÑ3Ô3ð &Ø-°	Ñ9�Ý  ‘o”oÐ%Ý�8‰}Œ} Ò&Ð&ØEÈÑNˆCÝ˜C‘.”.Ð Ø—’˜X aœ[Ñ)Ô)ˆÝ)¨&Ñ1Ô1ˆ�ÑØ" 8Ô,ˆ�ÑØ$ ZÔ0ˆ�
ÑÝ#0°·²¸XÀa¼[Ñ1IÔ1IÑ#JÔ#Jˆ�Ñ Ø"Ÿkšk¨(°1¬+Ñ6Ô6ˆ�
ÑØð 	-Ø!%§¢¨X°a¬[Ñ!9Ô!9ˆG�IÑÐà!)¨!¤ˆG�IÑØ7Ð7¨(°1°2°2¬,Ð7Ñ7Ô7ˆØð 	I�w˜q”zÔ'Ð/å”v�aœf¥S¤[Ô1°8Ñ<Ô<ˆHØHÐH¸8ÀAÀBÀB¼<ÐHÑHÔHˆGØ$ˆ�	ÑØŒ:ð 	#ÝŒM˜'Ñ"Ô"Ð"å�W‰~Œ~Ðr4   Úargsc                óT   — t          j        dt          d¬¦  «          | j        |i |¤ŽS )z'**DEPRECATED** Use deserialize instead.z;Session.unserialize is deprecated. Use Session.deserialize.r=   r>   )rD   rE   rx   rp  )rˆ   r—  r–   s      r3   ÚunserializezSession.unserializeO  s@   € õ 	ŒØIÝØð	
ñ 	
ô 	
ð 	
ð
  ˆtÔ Ð0¨Ð0Ð0Ð0r4   r�   rÃ   ©r$   r6   )r$   rü   )r$   rv   rž   )r$   rr   )rÅ   r,   r$   rª   )NNNN)rÅ   r,   r+  r,  r-  r.  rÏ   r.  r/  r.  r$   rª   )r&  r)   r$   r6   rŒ   )r'  rª   ro   r7  r$   r8  )NNNNFNN)rB  rC  rD  rE  r+  r.  r-  r.  ro   rF  rG  rH  rI  r¼   rÏ   r.  r/  r.  r$   r.  )r   TN)rB  rb  r&  r)   rc  rd  r2  r¼   ro   rF  r$   rv   )
rg  rb  rh  rd  r+  r¼   r2  r¼   r$   ri  )T)r&  rs  r2  r¼   r$   rt  )r@  r6   r$   rv   )TT)r&  rs  r+  r¼   r2  r¼   r$   rª   )r—  r#   r–   r#   r$   rª   )PrŸ   r    r¡   r¢   r
   r\  rT  r   rÞ   rÖ   r×   r   rV   rH   rÛ   rX   rP   rÜ   r   rä   r   rš   ré   rë   r   rç   r   rg   Úenvironr:  rÆ   r   r/  r   rW  r0   rî   rñ   rò   rû   r	   rø   rÿ   r   r  r  r  rð   r   r  r}  rq   r  r  rY  Ú	MAX_BYTESÚbuffer_thresholdÚ	MAX_ITEMSÚitem_thresholdr™   r  r  ÚpropertyrÄ   r  rÌ   r'  r6  rA  ra  rf  r�   ÚNOBLOCKrr  ro  r€  r  rp  r™  r¥   r¦   s   @r3   rr   rr   Q  s¥  ø€ € € € € ð&ð &ðP ˆD�˜tÐ*KÐLÑLÔL€Eà�ØØððñ ô €Ið ÐØÐ*ˆˆ FØð1ðñ ô €Fð  ÐØÐ*ˆˆ FØð9ðñ ô €Hð ˆ8 ZÐ@�M�M°[ÑAÔA€DØˆXØ%Ð8ˆˆ¨=ñô €Fð €WˆX�zÑ"Ô"ð4ð 4ð 4ñ #Ô"ð4ð" ˆh�r $Ð-UÐVÑVÔV€Gðð ð ð ð
 €WˆYÑÔð5ð 5ð 5ñ Ôð5ð ˆv�c‰{Œ{€HàˆwØ
Œ
�Š�v˜zÑ*Ô*ØMØðñ ô €Hð ˆtØ
ØØiðñ ô €Hð �G˜A‘J”J€Mð ˆ&˜Ð#MÐ
NÑ
NÔ
N€Cðð ð ð ð €WˆU�^„^ðð ð ñ „^ðð �wØØð+ðñ ô Ðð €WÐÑ Ô ð	ð 	ð 	ñ !Ô ð	ð �‘”€Jðð ð ð ð ˆ8�D”I¨$Ð/Ñ/Ô/€Dðð ð ð ð �S‘U”U€NØ!˜'ØØððñ ô Ðð ˆg�b Ð,XÐYÑYÔY€Gà€WˆYÑÔð(ð (ð (ñ Ôð(ð
 ˆ'‰)Œ)€Cð �WØØØYðñ ô €Nð
 �wØØØjðñ ô Ðð
 �WØØððñ ô €Nð2ð 2ð 2ð 2ð 2ð 2ðhð ð ð ð$ €Màð@ð @ð @ñ „Xð@ð
".ð ".ð ".ð ".ðHNð Nð Nð Nð  $Ø*.Ø*.Ø,0ðð ð ð ð ð4&ð &ð &ð &ð$ -1ð>ð >ð >ð >ð >ðH ,0Ø*.Ø,0Ø:>ØØ*.Ø,0ðvð vð vð vð vðx ØØ,0ð#9ð #9ð #9ð #9ð #9ðP ”KØØð)ð )ð )ð )ð )ðX GKð(>ð (>ð (>ð (>ð (>ðT	(ð 	(ð 	(ð 	(ð7ð 7ð 7ð 7ð  Øð	Kð Kð Kð Kð KðZ1ð 1ð 1ð 1ð 1ð 1ð 1ð 1r4   )r"   r#   r$   r#   )r"   r#   r$   r6   )rI   rJ   r$   r#   )r"   r#   rQ   rR   r$   r6   )rY   r#   r$   r6   rÃ   rš  )ru   r#   r$   rv   )r$   r   )
rÄ   r,   rÅ   r,   rÆ   r,   rš   rÇ   r$   rª   )rÍ   rª   r$   rª   )_r¢   Ú
__future__r   Ú	functoolsr÷   r  r@   r„   rg   r[   r¸   rƒ  Útypingr"  rD   Úbinasciir   r   r   r   Úzmq.asyncior�   Útornado.ioloopr   Ú	traitletsr	   r
   r   r   r   r   r   r   r   r   r   r   r   Útraitlets.config.configurabler   r   Útraitlets.logr   Útraitlets.utils.importstringr   Úzmq.eventloop.zmqstreamr   Ú_versionr   Úadapterr   Újsonutilr   r   r    r!   ÚDEFAULT_PROTOCOLr\   r|   r+   rž  rœ  rH   rP   rT   rÞ   ÚOPT_NAIVE_UTCÚ	OPT_UTC_ZrV   rX   ÚModuleNotFoundErrorrÙ   rà   ÚpartialÚpackbrá   Úunpackbrâ   r]   rN   rß   r=  ÚMessageTrackerr[  rk   rn   Úsession_aliasesÚsession_flagsry   r}   r   r¨   rÌ   rÒ   rr   rm   r4   r3   ú<module>rº     s   ðð	ð 	ð #Ð "Ð "Ð "Ð "Ð "à Ð Ð Ð Ø €€€Ø €€€Ø €€€Ø €€€Ø 	€	€	€	Ø €€€Ø €€€Ø €€€Ø Ð Ð Ð Ø €€€Ø Ð Ð Ð Ð Ð Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø Ð Ð Ð Ð Ð ð Ð Ð Ð Ø !Ð !Ð !Ð !Ð !Ð !ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð LÐ KÐ KÐ KÐ KÐ KÐ KÐ KØ $Ð $Ð $Ð $Ð $Ð $Ø 4Ð 4Ð 4Ð 4Ð 4Ð 4Ø -Ð -Ð -Ð -Ð -Ð -à &Ð &Ð &Ð &Ð &Ð &Ø Ð Ð Ð Ð Ð Ø KÐ KÐ KÐ KÐ KÐ KÐ KÐ KÐ KÐ KÐ KÐ KàÔ)€à„l€ðð ð ð ð( €	Ø€	ðð ð ð ð8ð ð ð ð$Ø€M€M€Mð
 €Jð -3Ô,@À6ÔCSÑ,Sð$ð $ð $ð $ð $ð $ð$ð $ð $ð $ð $øð ð @ð @ð @Ø€JØ%0°-Ð"€M�?�?�?ð@øøøð.'Ø€N€N€Nð €KØ&�YÔ& w¤}¸lÐKÑKÔK€NØ”ÐÐøð ð ð ð Ø€K€K€Kðøøøð:ð :ð :ð :ð
 ”,€ð 	€à€sÔÑÔ€ðLð Lð Lð Lð$ð $ð $ð $ð ØØ ðð €ð 
˜L˜L™NœN°rÐ:Ð:Ð;ð	ðð 
˜C¨BÐ/Ð/Ð0Ø*ððð €ð
%ð 
%ð 
%ð 
%ðð ð ð ð-ð -ð -ð -ð -Ð(ñ -ô -ð -ðB ð  ð  ð  ð  ñ  ô  ð  ð>ð ð ð ðð ð ð ð(F1ð F1ð F1ð F1ð F1ˆlñ F1ô F1ð F1ð F1ð F1s$   ÃC! Ã!C0Ã/C0Ã4D ÄD#Ä"D#