Ë
    :vžjÐ€  ã                  ó¬  — 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	m
Z
mZmZ ddlmZmZ ddl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mZmZm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* ddl+m,Z,m-Z- ddl.m/Z/m0Z0 dZ1dZ2dZ3dZ4dZ5 G d„ de e6e,«      «      Z7 G d„ de
e,e7¬«      Z8 G d„ de8«      Z9 G d„ de-«      Z: G d„ d«      Z;d!d „Z<y)"zA kernel gateway client.é    )ÚannotationsN)ÚABCÚABCMetaÚabstractmethod)ÚdatetimeÚtimezone)Úparsedate_to_datetime)ÚMorselÚSimpleCookie)Úgaierror)ÚEventLogger)Úweb)ÚAsyncHTTPClientÚHTTPClientErrorÚHTTPResponse)ÚHTTPHeaders)
ÚBoolÚFloatÚInstanceÚIntÚ
TraitErrorÚTypeÚUnicodeÚdefaultÚobserveÚvalidate)ÚLoggingConfigurableÚSingletonConfigurable)ÚDEFAULT_EVENTS_SCHEMA_PATHÚJUPYTER_SERVER_EVENTS_URIÚerrorÚsuccessÚstatusÚstatus_codeÚmsgc                  ó   — e Zd ZdZy)ÚGatewayTokenRenewerMetazBThe metaclass necessary for proper ABC behavior in a Configurable.N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__© ó    úv/workspace/moltex-experiments/.pixi/envs/default/lib/python3.12/site-packages/jupyter_server/gateway/gateway_client.pyr'   r'   -   s   „ ÚLr-   r'   c                  ó6   — e Zd ZdZe	 	 	 	 	 	 	 	 	 	 dd„«       Zy)ÚGatewayTokenRenewerBasea<  
    Abstract base class for refreshing tokens used between this server and a Gateway
    server.  Implementations requiring additional configuration can extend their class
    with appropriate configuration values or convey those values via appropriate
    environment variables relative to the implementation.
    c                 ó   — y)z®
        Given the current authorization header key, scheme, and token, this method returns
        a (potentially renewed) token for use against the Gateway server.
        Nr,   ©ÚselfÚauth_header_keyÚauth_schemeÚ
auth_tokenÚkwargss        r.   Ú	get_tokenz!GatewayTokenRenewerBase.get_token;   s   � r-   N©
r4   Ústrr5   z
str | Noner6   r:   r7   úty.AnyÚreturnr:   )r(   r)   r*   r+   r   r8   r,   r-   r.   r0   r0   1   sK   „ ñð ð
àð
ð  ð
ð ð	
ð
 ð
ð 
ò
ó ñ
r-   r0   )Ú	metaclassc                  ó,   — e Zd ZdZ	 	 	 	 	 	 	 	 	 	 dd„Zy)ÚNoOpTokenRenewerzˆNoOpTokenRenewer is the default value to the GatewayClient trait
    `gateway_token_renewer` and merely returns the provided token.
    c                ó   — |S )zCThis implementation simply returns the current authorization token.r,   r2   s        r.   r8   zNoOpTokenRenewer.get_tokenN   s
   € ð Ðr-   Nr9   )r(   r)   r*   r+   r8   r,   r-   r.   r?   r?   I   s<   „ ñðàðð  ðð ð	ð
 ðð 
ôr-   r?   c                  óè  ‡ — e Zd ZU dZedz   Z ee«      j                  d¬«      Z	 e
d«      d„ «       Zd„ Z edddd	¬
«      ZdZ e
d«      d„ «       Z ed«      d„ «       Z edddd¬
«      ZdZ e
d«      d„ «       Z ed«      d„ «       ZdZdZ eedd¬«      Z e
d«      d„ «       ZdZdZ eedd¬«      Z e
d«      d„ «       ZdZd Z  eedd!¬«      Z! e
d"«      d#„ «       Z"d$Z#d%Z$ e%e#dd&¬«      Z& e
d'«      d(„ «       Z'd)Z(d*Z) e%e(dd+¬«      Z* e
d,«      d-„ «       Z+ edddd.¬
«      Z,d/Z- e
d0«      d1„ «       Z. edddd2¬
«      Z/d3Z0 e
d4«      d5„ «       Z1 edddd6¬
«      Z2d7Z3 e
d8«      d9„ «       Z4 edddd:¬
«      Z5d;Z6 e
d<«      d=„ «       Z7 edddd>¬
«      Z8d?Z9 e
d@«      dA„ «       Z:dBZ;dCZ< ee;dddD¬
«      Z= e
dE«      dF„ «       Z>dGZ? eddH¬I«      Z@dJZA e
dK«      dL„ «       ZBdMZC eddddN¬
«      ZDdOZE e
dP«      dQ„ «       ZFdRZG edddS¬T«      ZHdUZI e
dV«      dW„ «       ZJdZKdXZL eMeKddY¬«      ZN e
dZ«      d[„ «       ZOdMZPd\ZQ eePdd]¬«      ZR e
d^«      d_„ «       ZS eePdd`¬«      ZTdaZUdbZV e%eUddc¬«      ZW e
dd«      de„ «       ZXdfZYdgZZ e%eYddh¬«      Z[ e
di«      dj„ «       Z\dkZ]dlZ^ e_e]ddm¬«      Z` e
dn«      do„ «       ZadpZbdqZc edeeddr¬s«      Zf e
dt«      du„ «       ZgdvZhdwZi e%ehddx¬«      Zj e
dy«      dz„ «       Zkd{Zld|Zm eMeldd}¬«      Zn e
d~«      d„ «       Zod€d�iZp eq erep«      Ž d‚„ «       Zsetdƒ„ «       Zu evewjð                  jó                  d„d…«      «      Zzd†e{d‡<   dˆe{d‰<   ˆ fdŠ„Z|d‹„ Z}dŒ„ Z~d�d�„Zd‘dŽ„Z€d’d�„Z�ˆ xZ‚S )“ÚGatewayClientzîThis class manages the configuration.  It's its own singleton class so
    that we can share these values across all objects.  It also contains some
    options.
    helper methods to build request arguments out of the various config
    z/gateway_client/v1T)ÚconfigÚevent_loggerc                óú   — | j                   r,t        | j                   d«      r| j                   j                  S t        «       }t        dz  dz  }|j                  |«       | j                  j                  d«       |S )NrD   Úgateway_clientzv1.yamlz%Event is registered in GatewayClient.)ÚparentÚhasattrrD   r   r   Úregister_event_schemaÚlogÚinfo)r3   ÚloggerÚschema_paths      r.   Ú_default_event_loggerz#GatewayClient._default_event_loggerc   sc   € à�;Š;œ7 4§;¡;°Ô?à—;‘;×+Ñ+Ð+ô !“]ˆFÜ4Ð7GÑGÈ)ÑSˆKØ×(Ñ(¨Ô5Ø�H‰H�M‰MÐAÔBØˆMr-   c                óR   — | j                   j                  | j                  |¬«       y)zLEmit event using the core event schema from Jupyter Server's Gateway Client.)Ú	schema_idÚdataN)rD   ÚemitÚevent_schema_id)r3   rQ   s     r.   rR   zGatewayClient.emitp   s!   € à×Ñ×Ñ¨×)=Ñ)=ÀDÐÕIr-   Na  The url of the Kernel or Enterprise Gateway server where
kernel specifications are defined and kernel management takes place.
If defined, this Notebook server acts as a proxy for all kernel
management and kernel specification retrieval.  (JUPYTER_GATEWAY_URL env var)
        )Údefault_valueÚ
allow_nonerC   ÚhelpÚJUPYTER_GATEWAY_URLÚurlc                óT   — t         j                  j                  | j                  «      S ©N)ÚosÚenvironÚgetÚurl_env©r3   s    r.   Ú_url_defaultzGatewayClient._url_default�   s   € ä�z‰z�~‰~˜dŸl™lÓ+Ð+r-   c                óð   — |d   }|�nt        |«      dkD  r`t        |«      j                  «       j                  d«      s8d|z  }| j	                  t
        t        t        dt        |i¬«       t        |«      ‚|S )NÚvaluer   Úhttpz.GatewayClient url must start with 'http': '%r'é�  ©rQ   ©
Úlenr:   ÚlowerÚ
startswithrR   Ú
STATUS_KEYÚERROR_STATUSÚSTATUS_CODE_KEYÚMESSAGE_KEYr   ©r3   Úproposalrb   Úmessages       r.   Ú_url_validatezGatewayClient._url_validate…   sm   € à˜Ñ!ˆàÐ¤ U£¨a¢¼¸E»
×8HÑ8HÓ8J×8UÑ8UÐV\Ô8]ØFÈÑNˆGØ�I‰IœJ¬´oÀsÌKÐY`ÐaˆIÔbÜ˜WÓ%Ð%Øˆr-   zÓThe websocket url of the Kernel or Enterprise Gateway server.  If not provided, this value
will correspond to the value of the Gateway url with 'ws' in place of 'http'.  (JUPYTER_GATEWAY_WS_URL env var)
        ÚJUPYTER_GATEWAY_WS_URLÚws_urlc                óà   — t         j                  j                  | j                  «      }| j                  �8|€6| j
                  r*| j                  j                  «       j                  dd«      }|S )Nrc   Úws)r[   r\   r]   Ú
ws_url_envrX   Úgateway_enabledrh   Úreplace)r3   rT   s     r.   Ú_ws_url_defaultzGatewayClient._ws_url_defaultš   sR   € äŸ
™
Ÿ™ t§¡Ó7ˆØ�8‰8Ð MÐ$9¸d×>RÒ>RØ ŸH™HŸN™NÓ,×4Ñ4°V¸TÓBˆMØÐr-   c                óð   — |d   }|�nt        |«      dkD  r`t        |«      j                  «       j                  d«      s8d|z  }| j	                  t
        t        t        dt        |i¬«       t        |«      ‚|S )Nrb   r   ru   z/GatewayClient ws_url must start with 'ws': '%r'rd   re   rf   rn   s       r.   Ú_ws_url_validatezGatewayClient._ws_url_validate¡   sm   € à˜Ñ!ˆàÐ¤ U£¨a¢¼¸E»
×8HÑ8HÓ8J×8UÑ8UÐVZÔ8[ØGÈ%ÑOˆGØ�I‰IœJ¬´oÀsÌKÐY`ÐaˆIÔbÜ˜WÓ%Ð%Øˆr-   z/api/kernelsÚ JUPYTER_GATEWAY_KERNELS_ENDPOINTzbThe gateway API endpoint for accessing kernel resources (JUPYTER_GATEWAY_KERNELS_ENDPOINT env var))rT   rC   rV   Úkernels_endpointc                ój   — t         j                  j                  | j                  | j                  «      S rZ   )r[   r\   r]   Úkernels_endpoint_envÚkernels_endpoint_default_valuer_   s    r.   Ú_kernels_endpoint_defaultz'GatewayClient._kernels_endpoint_default³   s#   € ä�z‰z�~‰~˜d×7Ñ7¸×9\Ñ9\Ó]Ð]r-   z/api/kernelspecsÚ$JUPYTER_GATEWAY_KERNELSPECS_ENDPOINTzaThe gateway API endpoint for accessing kernelspecs (JUPYTER_GATEWAY_KERNELSPECS_ENDPOINT env var)Úkernelspecs_endpointc                ój   — t         j                  j                  | j                  | j                  «      S rZ   )r[   r\   r]   Úkernelspecs_endpoint_envÚ"kernelspecs_endpoint_default_valuer_   s    r.   Ú_kernelspecs_endpoint_defaultz+GatewayClient._kernelspecs_endpoint_default¿   s(   € ä�z‰z�~‰~Ø×)Ñ)¨4×+RÑ+Ró
ð 	
r-   z/kernelspecsÚ-JUPYTER_GATEWAY_KERNELSPECS_RESOURCE_ENDPOINTzpThe gateway endpoint for accessing kernelspecs resources
(JUPYTER_GATEWAY_KERNELSPECS_RESOURCE_ENDPOINT env var)Úkernelspecs_resource_endpointc                ój   — t         j                  j                  | j                  | j                  «      S rZ   )r[   r\   r]   Ú!kernelspecs_resource_endpoint_envÚ+kernelspecs_resource_endpoint_default_valuer_   s    r.   Ú&_kernelspecs_resource_endpoint_defaultz4GatewayClient._kernelspecs_resource_endpoint_defaultÎ   s)   € ä�z‰z�~‰~Ø×2Ñ2Ø×<Ñ<ó
ð 	
r-   g      D@ÚJUPYTER_GATEWAY_CONNECT_TIMEOUTzuThe time allowed for HTTP connection establishment with the Gateway server.
(JUPYTER_GATEWAY_CONNECT_TIMEOUT env var)Úconnect_timeoutc                ó|   — t        t        j                  j                  | j                  | j
                  «      «      S rZ   )Úfloatr[   r\   r]   Úconnect_timeout_envÚconnect_timeout_default_valuer_   s    r.   Ú_connect_timeout_defaultz&GatewayClient._connect_timeout_defaultÞ   ó(   € ä”R—Z‘Z—^‘^ D×$<Ñ$<¸d×>`Ñ>`ÓaÓbÐbr-   g      E@ÚJUPYTER_GATEWAY_REQUEST_TIMEOUTzWThe time allowed for HTTP request completion. (JUPYTER_GATEWAY_REQUEST_TIMEOUT env var)Úrequest_timeoutc                ó|   — t        t        j                  j                  | j                  | j
                  «      «      S rZ   )r‘   r[   r\   r]   Úrequest_timeout_envÚrequest_timeout_default_valuer_   s    r.   Ú_request_timeout_defaultz&GatewayClient._request_timeout_defaultê   r•   r-   zWThe filename for client SSL key, if any.  (JUPYTER_GATEWAY_CLIENT_KEY env var)
        ÚJUPYTER_GATEWAY_CLIENT_KEYÚ
client_keyc                óT   — t         j                  j                  | j                  «      S rZ   )r[   r\   r]   Úclient_key_envr_   s    r.   Ú_client_key_defaultz!GatewayClient._client_key_default÷   s   € ä�z‰z�~‰~˜d×1Ñ1Ó2Ð2r-   z`The filename for client SSL certificate, if any.  (JUPYTER_GATEWAY_CLIENT_CERT env var)
        ÚJUPYTER_GATEWAY_CLIENT_CERTÚclient_certc                óT   — t         j                  j                  | j                  «      S rZ   )r[   r\   r]   Úclient_cert_envr_   s    r.   Ú_client_cert_defaultz"GatewayClient._client_cert_default  s   € ä�z‰z�~‰~˜d×2Ñ2Ó3Ð3r-   zeThe filename of CA certificates or None to use defaults.  (JUPYTER_GATEWAY_CA_CERTS env var)
        ÚJUPYTER_GATEWAY_CA_CERTSÚca_certsc                óT   — t         j                  j                  | j                  «      S rZ   )r[   r\   r]   Úca_certs_envr_   s    r.   Ú_ca_certs_defaultzGatewayClient._ca_certs_default  ó   € ä�z‰z�~‰~˜d×/Ñ/Ó0Ð0r-   zRThe username for HTTP authentication. (JUPYTER_GATEWAY_HTTP_USER env var)
        ÚJUPYTER_GATEWAY_HTTP_USERÚ	http_userc                óT   — t         j                  j                  | j                  «      S rZ   )r[   r\   r]   Úhttp_user_envr_   s    r.   Ú_http_user_defaultz GatewayClient._http_user_default  s   € ä�z‰z�~‰~˜d×0Ñ0Ó1Ð1r-   zRThe password for HTTP authentication.  (JUPYTER_GATEWAY_HTTP_PWD env var)
        ÚJUPYTER_GATEWAY_HTTP_PWDÚhttp_pwdc                óT   — t         j                  j                  | j                  «      S rZ   )r[   r\   r]   Úhttp_pwd_envr_   s    r.   Ú_http_pwd_defaultzGatewayClient._http_pwd_default+  r«   r-   z{}ÚJUPYTER_GATEWAY_HEADERSz�Additional HTTP headers to pass on the request.  This value will be converted to a dict.
          (JUPYTER_GATEWAY_HEADERS env var)
        Úheadersc                ój   — t         j                  j                  | j                  | j                  «      S rZ   )r[   r\   r]   Úheaders_envÚheaders_default_valuer_   s    r.   Ú_headers_defaultzGatewayClient._headers_default:  s#   € ä�z‰z�~‰~˜d×.Ñ.°×0JÑ0JÓKÐKr-   ÚAuthorizationaz  The authorization header's key name (typically 'Authorization') used in the HTTP headers. The
header will be formatted as::

{'{auth_header_key}': '{auth_scheme} {auth_token}'}

If the authorization header key takes a single value, `auth_scheme` should be set to None and
'auth_token' should be configured to use the appropriate value.

(JUPYTER_GATEWAY_AUTH_HEADER_KEY env var))rC   rV   ÚJUPYTER_GATEWAY_AUTH_HEADER_KEYr4   c                ój   — t         j                  j                  | j                  | j                  «      S rZ   )r[   r\   r]   Úauth_header_key_envÚauth_header_key_default_valuer_   s    r.   Ú_auth_header_key_defaultz&GatewayClient._auth_header_key_defaultM  s#   € ä�z‰z�~‰~˜d×6Ñ6¸×8ZÑ8ZÓ[Ð[r-   Ú z®The authorization token used in the HTTP headers. The header will be formatted as::

{'{auth_header_key}': '{auth_scheme} {auth_token}'}

(JUPYTER_GATEWAY_AUTH_TOKEN env var)ÚJUPYTER_GATEWAY_AUTH_TOKENr6   c                ój   — t         j                  j                  | j                  | j                  «      S rZ   )r[   r\   r]   Úauth_token_envÚauth_token_default_valuer_   s    r.   Ú_auth_token_defaultz!GatewayClient._auth_token_default^  s#   € ä�z‰z�~‰~˜d×1Ñ1°4×3PÑ3PÓQÐQr-   Útokenz}The auth scheme, added as a prefix to the authorization token used in the HTTP headers.
(JUPYTER_GATEWAY_AUTH_SCHEME env var))rU   rC   rV   ÚJUPYTER_GATEWAY_AUTH_SCHEMEr5   c                ój   — t         j                  j                  | j                  | j                  «      S rZ   )r[   r\   r]   Úauth_scheme_envÚauth_scheme_default_valuer_   s    r.   Ú_auth_scheme_defaultz"GatewayClient._auth_scheme_defaultk  s#   € ä�z‰z�~‰~˜d×2Ñ2°D×4RÑ4RÓSÐSr-   ÚJUPYTER_GATEWAY_VALIDATE_CERTzzFor HTTPS requests, determines if server's certificate should be validated or not.
(JUPYTER_GATEWAY_VALIDATE_CERT env var)Úvalidate_certc                ó’   — t        t        j                  j                  | j                  t        | j                  «      «      dv«      S ©N)ÚnoÚfalse)Úboolr[   r\   r]   Úvalidate_cert_envr:   Úvalidate_cert_default_valuer_   s    r.   Ú_validate_cert_defaultz$GatewayClient._validate_cert_defaultx  s:   € äÜ�J‰J�N‰N˜4×1Ñ1´3°t×7WÑ7WÓ3XÓYØ"ð#ó
ð 	
r-   ÚJUPYTER_GATEWAY_ALLOWED_ENVSam  A comma-separated list of environment variable names that will be included, along with
their values, in the kernel startup request.  The corresponding `client_envs` configuration
value must also be set on the Gateway server - since that configuration value indicates which
environmental values to make available to the kernel. (JUPYTER_GATEWAY_ALLOWED_ENVS env var)Úallowed_envsc                ó¦   — t         j                  j                  | j                  t         j                  j                  d| j                  «      «      S )NÚJUPYTER_GATEWAY_ENV_WHITELIST)r[   r\   r]   Úallowed_envs_envÚallowed_envs_default_valuer_   s    r.   Ú_allowed_envs_defaultz#GatewayClient._allowed_envs_defaultŠ  s9   € ä�z‰z�~‰~Ø×!Ñ!Ü�J‰J�N‰NÐ:¸D×<[Ñ<[Ó\ó
ð 	
r-   z,Deprecated, use `GatewayClient.allowed_envs`g      ð?ÚJUPYTER_GATEWAY_RETRY_INTERVALa  The time allowed for HTTP reconnection with the Gateway server for the first time.
Next will be JUPYTER_GATEWAY_RETRY_INTERVAL multiplied by two in factor of numbers of retries
but less than JUPYTER_GATEWAY_RETRY_INTERVAL_MAX.
(JUPYTER_GATEWAY_RETRY_INTERVAL env var)Úgateway_retry_intervalc                ó|   — t        t        j                  j                  | j                  | j
                  «      «      S rZ   )r‘   r[   r\   r]   Úgateway_retry_interval_envÚ$gateway_retry_interval_default_valuer_   s    r.   Ú_gateway_retry_interval_defaultz-GatewayClient._gateway_retry_interval_default¢  s1   € äÜ�J‰J�N‰NØ×/Ñ/Ø×9Ñ9óó
ð 	
r-   g      >@Ú"JUPYTER_GATEWAY_RETRY_INTERVAL_MAXzzThe maximum time allowed for HTTP reconnection retry with the Gateway server.
(JUPYTER_GATEWAY_RETRY_INTERVAL_MAX env var)Úgateway_retry_interval_maxc                ó|   — t        t        j                  j                  | j                  | j
                  «      «      S rZ   )r‘   r[   r\   r]   Úgateway_retry_interval_max_envÚ(gateway_retry_interval_max_default_valuer_   s    r.   Ú#_gateway_retry_interval_max_defaultz1GatewayClient._gateway_retry_interval_max_default´  s1   € äÜ�J‰J�N‰NØ×3Ñ3Ø×=Ñ=óó
ð 	
r-   é   ÚJUPYTER_GATEWAY_RETRY_MAXznThe maximum retries allowed for HTTP reconnection with the Gateway server.
(JUPYTER_GATEWAY_RETRY_MAX env var)Úgateway_retry_maxc                ó|   — t        t        j                  j                  | j                  | j
                  «      «      S rZ   )Úintr[   r\   r]   Úgateway_retry_max_envÚgateway_retry_max_default_valuer_   s    r.   Ú_gateway_retry_max_defaultz(GatewayClient._gateway_retry_max_defaultÆ  s(   € ä”2—:‘:—>‘> $×"<Ñ"<¸d×>bÑ>bÓcÓdÐdr-   z6jupyter_server.gateway.gateway_client.NoOpTokenRenewerÚ#JUPYTER_GATEWAY_TOKEN_RENEWER_CLASSzYThe class to use for Gateway token renewal. (JUPYTER_GATEWAY_TOKEN_RENEWER_CLASS env var))ÚklassrC   rV   Úgateway_token_renewer_classc                ój   — t         j                  j                  | j                  | j                  «      S rZ   )r[   r\   r]   Úgateway_token_renewer_class_envÚ)gateway_token_renewer_class_default_valuer_   s    r.   Ú$_gateway_token_renewer_class_defaultz2GatewayClient._gateway_token_renewer_class_defaultÔ  s(   € ä�z‰z�~‰~Ø×0Ñ0°$×2`Ñ2`ó
ð 	
r-   g       @Ú"JUPYTER_GATEWAY_LAUNCH_TIMEOUT_PADzÁTimeout pad to be ensured between KERNEL_LAUNCH_TIMEOUT and request_timeout
such that request_timeout >= KERNEL_LAUNCH_TIMEOUT + launch_timeout_pad.
(JUPYTER_GATEWAY_LAUNCH_TIMEOUT_PAD env var)Úlaunch_timeout_padc                ó|   — t        t        j                  j                  | j                  | j
                  «      «      S rZ   )r‘   r[   r\   r]   Úlaunch_timeout_pad_envÚ launch_timeout_pad_default_valuer_   s    r.   Ú_launch_timeout_pad_defaultz)GatewayClient._launch_timeout_pad_defaultä  s1   € äÜ�J‰J�N‰NØ×+Ñ+Ø×5Ñ5óó
ð 	
r-   FÚJUPYTER_GATEWAY_ACCEPT_COOKIESz¹Accept and manage cookies sent by the service side. This is often useful
        for load balancers to decide which backend node to use.
        (JUPYTER_GATEWAY_ACCEPT_COOKIES env var)Úaccept_cookiesc                ó®   — t        t        j                  j                  | j                  t        | j                  «      j                  «       «      dv«      S rÑ   )rÔ   r[   r\   r]   Úaccept_cookies_envr:   Úaccept_cookies_valuerh   r_   s    r.   Ú_accept_cookies_defaultz%GatewayClient._accept_cookies_default÷  sC   € äÜ�J‰J�N‰N˜4×2Ñ2´C¸×8QÑ8QÓ4R×4XÑ4XÓ4ZÓ[Ø"ð#ó
ð 	
r-   Úenv_whitelist)rÙ   z2.0c                óJ  — |j                   }| j                  |   \  }}t        | |«      }||j                  k7  rj| j                  j                  | j                  j                  › d|› d|› d| j                  j                  › d|› d�
«       t        | ||j                  «       yy)zobserver for deprecated traitsÚ.z! is deprecated in jupyter_server z, use z insteadN)	ÚnameÚ_deprecated_traitsÚgetattrÚnewrJ   ÚwarningÚ	__class__r(   Úsetattr)r3   ÚchangeÚold_attrÚnew_attrÚversionÚ	new_values         r.   Ú_deprecated_traitzGatewayClient._deprecated_trait  s¢   € ð —;‘;ˆØ ×3Ñ3°HÑ=Ñˆ�'Ü˜D (Ó+ˆ	Ø˜Ÿ
™
Ò"ð �H‰H×ÑØ—>‘>×*Ñ*Ð+¨1¨X¨JÐ6WØ�)˜6 $§.¡.×"9Ñ"9Ð!:¸!¸H¸:ÀXðOôô �D˜( F§J¡JÕ/ð #r-   c                ód   — t        | j                  d uxr t        | j                  «      dkD  «      S )Nr   )rÔ   rX   rg   r_   s    r.   rw   zGatewayClient.gateway_enabled  s(   € ä�D—H‘H DÐ(Ò>¬S°·±«]¸QÑ->Ó?Ð?r-   ÚKERNEL_LAUNCH_TIMEOUTÚ40údict[str, ty.Any]Ú_connection_argsr0   Úgateway_token_renewerc                ó„   •— t        ‰| �  di |¤Ž i | _        | j                  | | j                  ¬«      | _        i | _        y)zInitialize a gateway client.)rG   rJ   Nr,   )ÚsuperÚ__init__r  rõ   rJ   r  Ú_cookies)r3   r7   r  s     €r.   r  zGatewayClient.__init__  sE   ø€ ä‰ÑÑ"˜6Ò"Ø "ˆÔØ%)×%EÑ%EÈTÐW[×W_ÑW_Ð%EÓ%`ˆÔ"ð EGˆ�r-   c                óf  — t        t        j                  «      | j                  z   }| j                  |k  r|| _        n:| j                  |kD  r+t        | j                  | j                  z
  «      t        _        t        t        j                  «      t        j                  d<   | j                  r‹t        j                  | j                  «      | j                  d<   | j                  | j                  d   vrD| j                  d   j                  | j                  › | j                  › d| j                   › �i«       | j"                  | j                  d<   | j                  | j                  d<   | j$                  | j                  d<   | j&                  rW| j&                  | j                  d<   | j(                  | j                  d<   | j*                  r| j*                  | j                  d	<   | j,                  r| j,                  | j                  d
<   | j.                  r| j.                  | j                  d<   yy)z‰Initialize arguments used on every request.  Since these are primarily static values,
        we'll perform this operation once.
        r  r·   Ú r�   r—   rÏ   r¢   r�   r§   Úauth_usernameÚauth_passwordN)r‘   rB   r  rû   r—   rï   r:   r[   r\   r·   ÚjsonÚloadsr  r4   Úupdater5   r6   r�   rÏ   r¢   r�   r§   r­   r²   )r3   Úminimum_request_timeouts     r.   Úinit_connection_argsz"GatewayClient.init_connection_args(  sÔ  € ô ”-×5Ñ5Ó6¸×9PÑ9PÑPð 	 ð ×ÑÐ"9Ò9Ø#:ˆDÕ Ø×!Ñ!Ð$;Ò;Ü25Ø×$Ñ$ t×'>Ñ'>Ñ>ó3ŒMÔ/ô /2´-×2UÑ2UÓ.VŒ�
‰
Ð*Ñ+à�<Š<Ü/3¯z©z¸$¿,¹,Ó/GˆD×!Ñ! )Ñ,Ø×#Ñ#¨4×+@Ñ+@ÀÑ+KÑKØ×%Ñ% iÑ0×7Ñ7Ø×,Ñ,Ð-°4×3CÑ3CÐ2DÀAÀdÇoÁoÐEVÐ0WÐXôð 48×3GÑ3Gˆ×ÑÐ/Ñ0Ø37×3GÑ3Gˆ×ÑÐ/Ñ0Ø15×1CÑ1Cˆ×Ñ˜oÑ.Ø×ÒØ37×3CÑ3CˆD×!Ñ! -Ñ0Ø26·/±/ˆD×!Ñ! ,Ñ/Ø�}Š}Ø48·M±M�×%Ñ% jÑ1Ø�>Š>Ø59·^±^ˆD×!Ñ! /Ñ2Ø�=Š=Ø59·]±]ˆD×!Ñ! /Ò2ð r-   c                ó  — t        | j                  «      dk(  r| j                  «        | j                  }| j                  �A	 | j                  j                  | j                  | j                  | j                  «      | _        | j                  j                  «       D ]{  \  }}|dk(  rl|j                  |i «      }t        |t        «      sŒ.|j!                  |«       |j!                  | j                  › | j                  › d| j                  › �i«       Œw|||<   Œ} | j"                  r| j%                  |«       |S # t        $ r<}| j                  j                  d| j                  › d|› �«       || _        Y d}~Œ÷d}~ww xY w)z¦Merges the static args relative to the connection, with the given keyword arguments.  If static
        args have yet to be initialized, we'll do that here.

        r   NzfAn exception occurred attempting to renew the Gateway authorization token using an instance of class 'zL'.  The request will proceed using the current token value.  Exception was: r·   r!  )rg   r  r(  r6   r  r8   r4   r5   Ú	ExceptionrJ   r!   rõ   ÚitemsÚ
setdefaultÚ
isinstanceÚdictr&  r  Ú_update_cookie_header)r3   r7   Úprev_auth_tokenÚexÚargrb   Úgiven_values          r.   Úload_connection_argsz"GatewayClient.load_connection_argsN  sk  € ô
 ˆt×$Ñ$Ó%¨Ò*Ø×%Ñ%Ô'ð Ÿ/™/ˆØ�?‰?Ð&ð2Ø"&×"<Ñ"<×"FÑ"FØ×(Ñ(¨$×*:Ñ*:¸D¿O¹Oó#�”ð ×/Ñ/×5Ñ5Ö7‰JˆC�Ø�iÒØ$×/Ñ/°°RÓ8�Ü˜k¬4Õ0Ø×&Ñ& uÔ-à×&Ñ&Ø ×0Ñ0Ð1°t×7GÑ7GÐ6HÈÈ$Ï/É/ÐIZÐ4[Ð\õð $��s’ð 8ð ×ÒØ×&Ñ& vÔ.àˆøô1 ò 2Ø—‘—‘ðà×8Ñ8Ð9ð :NØNPÈTðSôð #2�—‘ûð2ús   ÁA D9 Ä9	E>Å2E9Å9E>c                ó†  — | j                   sy|j                  d«      }|syt        j                  t        j
                  ¬«      }|D ]Ä  }t        «       }	 |j                  |«       |s| j                  j                  d|«       Œ>t        t        |j                  «       «      «      \  }}|j                  d«      r@|j                  d«      s/t        |d   «      }	|	|z
  }
t!        |
j#                  «       «      |d<   ||f| j$                  |<   ŒÆ y# t        $ r'}| j                  j                  d||«       Y d}~Œód}~ww xY w)z$Update cookies from response headersNz
Set-Cookie©Útzz$Failed to parse cookie header %s: %szNo cookies found in header: %sÚexpiresúmax-age)r  Úget_listr   Únowr   Úutcr   Úloadr*  rJ   r  ÚnextÚiterr+  r]   r	   r:   Útotal_secondsr  )r3   r·   Úcookie_headersÚ
store_timeÚheaderÚcookieÚer	  ÚmorselÚexpire_timeÚexpire_timedeltas              r.   Úupdate_cookieszGatewayClient.update_cookiesw  s  € ð ×"Ò"Øð
 !×)Ñ)¨,Ó7ˆÙØä—\‘\¤X§\¡\Ô2ˆ
Û$ˆFÜ!“^ˆFðØ—‘˜FÔ#ñ
 Ø—‘× Ñ Ð!AÀ6ÔJØÜ¤ V§\¡\£^Ó 4Ó5‰LˆD�&ð �z‰z˜)Ô$¨V¯Z©Z¸	Ô-BÜ3°F¸9Ñ4EÓF�Ø#.°Ñ#;Ð Ü$'Ð(8×(FÑ(FÓ(HÓ$I��yÑ!à#)¨:Ð"6ˆD�M‰M˜$Òñ) %øô ò Ø—‘× Ñ Ð!GÈÐQRÔSÜûðús   ÁDÄ	E ÄD;Ä;E c                ól  — t        j                  t        j                  ¬«      }g }| j                  j                  «       D ]O  \  }\  }}|j                  d«      }|sŒ||z
  }|j                  «       t        |«      kD  sŒ?|j                  |«       ŒQ |D ]  }| j                  j                  |«       Œ y)zClear expired cookies.r6  r9  N)r   r;  r   r<  r  r+  r]   r@  r‘   ÚappendÚpop)r3   Ú
check_timeÚexpired_keysÚkeyrF  rB  Úcookie_max_ageÚexpired_timedeltas           r.   Ú_clear_expired_cookiesz$GatewayClient._clear_expired_cookies›  s›   € ä—\‘\¤X§\¡\Ô2ˆ
Øˆà)-¯©×)<Ñ)<Ö)>Ñ%ˆCÑ%�&˜*Ø#ŸZ™Z¨	Ó2ˆNÙ!ØØ *¨ZÑ 7ÐØ ×.Ñ.Ó0´5¸Ó3HÓHØ×#Ñ# CÕ(ð *?ó  ˆCØ�M‰M×Ñ˜cÕ"ñ  r-   c                ó  — | j                  «        dj                  d„ | j                  j                  «       D «       «      }|rK|j	                  di «      }t        d„ |D «       d«      }|j	                  |«      }|r|dz   |z   }|||<   ||d<   yy)zUpdate a cookie header.z; c              3  óJ   K  — | ]  \  }\  }}|› d |j                   › �–— Œ y­w)Ú=N)Úcoded_value)Ú.0r	  rF  Ú_times       r.   Ú	<genexpr>z6GatewayClient._update_cookie_header.<locals>.<genexpr>¯  s0   è ø€ ð *
ÙH]Ñ/D¨t±_°f¸eˆtˆf�A�f×(Ñ(Ð)Ô*ÑH]ùs   ‚!#r·   c              3  óH   K  — | ]  }|j                  «       d k(  sŒ|–— Œ y­w)rD  N)rh   )rW  Ú
header_keys     r.   rY  z6GatewayClient._update_cookie_header.<locals>.<genexpr>¸  s!   è ø€ ÐX©g 
¸×9IÑ9IÓ9KÈxÓ9W”©gùs   ‚"›"ÚCookieN)rR  Újoinr  r+  r]   r>  )r3   Úconnection_argsÚgateway_cookie_valuesr·   Úcookie_header_nameÚexisting_cookies         r.   r/  z#GatewayClient._update_cookie_header«  s§   € à×#Ñ#Ô%à $§	¡	ñ *
ØHLÏÉ×H[ÑH[ÔH]ó*
ó !
Ðñ !Ø%×)Ñ)¨)°RÓ8ˆGô "&ÙX©gÓXØó"Ðð &Ÿk™kÐ*<Ó=ˆOñ Ø(7¸$Ñ(>ÐAVÑ(VÐ%Ø*?ˆGÐ&Ñ'à)0ˆO˜IÒ&ð! !r-   )r·   r   r<   ÚNone)r<   rb  )r^  r  r<   rb  )ƒr(   r)   r*   r+   r    rS   r   r   ÚtagrD   r   rN   rR   r   rX   r^   r`   r   rq   rs   rv   ry   r{   r€   r   r}   r�   r†   r…   rƒ   r‡   rŒ   r‹   r‰   r�   r“   r’   r   r�   r”   rš   r™   r—   r›   r�   rŸ   r    r¢   r¤   r¥   r§   r©   rª   r­   r¯   r°   r²   r´   rµ   rº   r¹   r·   r»   rÀ   r4   r¿   rÁ   rÆ   r6   rÅ   rÇ   rÌ   r5   rË   rÍ   rÖ   rÕ   r   rÏ   r×   rÝ   rÜ   rÙ   rÞ   r  rã   râ   rà   rä   ré   rè   ræ   rê   rñ   rð   r   rí   rò   rø   r÷   r   r0   rõ   rù   rþ   rý   rû   rÿ   r  r  r  r  r
  r   Úlistr  Úpropertyrw   rï   r[   r\   r]   r  Ú__annotations__r  r(  r4  rI  rR  r/  Ú__classcell__)r  s   @r.   rB   rB   Y   sÈ  ø… ñð 0Ð2FÑF€OÙ˜KÓ(×,Ñ,°DÐ,Ó9€Láˆ^Óñ
ó ð
òJñ ØØØðô		€Cð $€GáˆUƒ^ñ,ó ð,ñ ˆeƒ_ñó ðñ ØØØðô	€Fð *€JáˆXÓñó ðñ ˆhÓñó ðð &4Ð"Ø=ÐÙØ4ØØuôÐñ ÐÓ ñ^ó !ð^ð *<Ð&ØEÐÙ"Ø8ØØtôÐñ Ð#Ó$ñ
ó %ð
ð
 3AÐ/Ø(WÐ%Ù$+ØAØð;ô%Ð!ñ Ð,Ó-ñ
ó .ð
ð %)Ð!Ø;ÐÙØ3Øð-ô€Oñ ÐÓñcó  ðcð %)Ð!Ø;ÐÙØ3ØØjô€Oñ ÐÓñcó  ðcñ ØØØðô	€Jð 2€Náˆ\Óñ3ó ð3ñ ØØØðô	€Kð 4€Oáˆ]Óñ4ó ð4ñ ØØØðô	€Hð .€LáˆZÓñ1ó ð1ñ ØØØðô	€Ið 0€Máˆ[Óñ2ó ð2ñ ØØØðô	€Hð .€LáˆZÓñ1ó ð1ð !ÐØ+€KÙØ+ØØðô	€Gñ ˆYÓñLó ðLð %4Ð!ÙØð-ô€Oð <ÐáÐÓñ\ó  ð\ð  "ÐÙØØØð(ô		€Jð 2€Náˆ\ÓñRó ðRð !(ÐÙØØð)ô€Kð 4€Oáˆ]ÓñTó ðTð #'ÐØ7ÐÙØ1Øð+ô€Mñ ˆ_Óñ
ó ð
ð "$ÐØ5ÐÙØ0Øð`ô€Lñ ˆ^Óñ
ó ð
ñ Ø0ØØ?ô€Mð ,/Ð(Ø!AÐÙ"Ø:Øð,ôÐñ Ð%Ó&ñ
ó 'ð
ð 04Ð,Ø%IÐ"Ù!&Ø>Øð0ô"Ðñ Ð)Ó*ñ
ó +ð
ð '(Ð#Ø7ÐÙØ5Øð'ôÐñ Ð Ó!ñeó "ðeð 	Að .ð 'LÐ#Ù"&Ø%ØØlô#Ðñ Ð*Ó+ñ
ó ,ð
ð
 (+Ð$ØAÐÙØ6Øð0ôÐñ Ð!Ó"ñ
ó #ð
ð !ÐØ9ÐÙØ*Øð4ô€Nñ ÐÓñ
ó ð
ð 	Ð0ðÐñ ‰dÐ%Ó&Ð'ñ0ó (ð0ð ñ@ó ð@ñ   §
¡
§¡Ð/FÈÓ MÓNÐà'Ó'à2Ó2ôGò$CòL'óR"7óH#÷ 1r-   rB   c                  óÖ   — e Zd ZU dZdZdZ e ej                  de«      «      Z	de
d<    ed ee	e«      «      Z	dd	hZd
e
d<   h d£Zde
d<   ehZde
d<   dZde
d<   d„ Zdd„Zdd„Zdd„Zy)ÚRetryableHTTPClientaH  
    Inspired by urllib.util.Retry (https://urllib3.readthedocs.io/en/stable/reference/urllib3.util.html),
    this class is initialized with desired retry characteristics, uses a recursive method `fetch()` against an instance
    of `AsyncHTTPClient` which tracks the current retry count across applicable request retries.
    é   é
   Ú#JUPYTER_GATEWAY_MAX_REQUEST_RETRIESrï   Úmax_retriesr   ÚGETÚDELETEzset[str]Úretried_methods>   éW  éö  éø  é÷  zset[int]Úretried_errorsz	set[type]Úretried_exceptionsgš™™™™™¹?r‘   Úbackoff_factorc                ó0   — d| _         t        «       | _        y)z%Initialize the retryable http client.r   N)Úretry_countr   Úclientr_   s    r.   r  zRetryableHTTPClient.__init__Õ  s   € à !ˆÔÜ'6Ó'8ˆ�r-   c              ‹  óR   K  — d| _          | j                  |fi |¤Žƒ d{  –—† S 7 Œ­w)z°
        Retryable AsyncHTTPClient.fetch() method.  When the request fails, this method will
        recurse up to max_retries times if the condition deserves a retry.
        r   N)ry  Ú_fetch)r3   Úendpointr7   s      r.   ÚfetchzRetryableHTTPClient.fetchÚ  s,   è ø€ ð
 ˆÔØ �T—[‘[ Ñ4¨VÑ4×4Ð4Ð4ús   ‚' %¡'c           
   ‹  óx  K  — 	  | j                   j                  |fi |¤Žƒ d{  –—† }|S 7 Œ# t        $ r�}| j                  |d   |«      ƒ d{  –—†7  }|s|‚t	        j
                  d«      j                  d| j                  › d|› d|›d�«        | j                  |fi |¤Žƒ d{  –—†7  }Y d}~|S d}~ww xY w­w)z»
        Performs the fetch against the contained AsyncHTTPClient instance and determines
        if retry is necessary on any exceptions.  If so, retry is performed recursively.
        NÚmethodÚ	ServerAppzAttempting retry (z) against endpoint 'z'.  Retried error: 'Ú')	rz  r~  r*  Ú_is_retryableÚloggingÚ	getLoggerrK   ry  r|  )r3   r}  r7   ÚresponserE  Úis_retryables         r.   r|  zRetryableHTTPClient._fetchâ  sÌ   è ø€ ð

	=Ø+<¨4¯;©;×+<Ñ+<¸XÑ+PÈÑ+P×%PˆHð ˆð &QùÜò 	=Ø'+×'9Ñ'9¸&ÀÑ:JÈAÓ'N×!NÐ!NˆLÙØ�Ü×Ñ˜kÓ*×/Ñ/Ø$ T×%5Ñ%5Ð$6ð 7Ø%˜JÐ&:¸1¸%¸qðBôð )˜TŸ[™[¨Ñ<°VÑ<×<Ð<ŒHØˆûð	=üsO   ‚B:„ - ¤+¥- ©B:«- ­	B7¶B2ÁAÁAB2Â&B)Â'B2Â,B:Â2B7Â7B:c              ƒ  ó�  ‡K  — || j                   vry| j                  | j                  k(  ryt        ‰t        «      r‰}|j
                  | j                  vr yt        ˆfd„| j                  D «       «      syt        j                  | j                  d| j                  z  z  «      ƒ d{  –—†  | xj                  dz  c_        y7 Œ­w)zODetermines if the given exception is retryable based on object's configuration.Fc              3  ó6   •K  — | ]  }t        ‰|«      –— Œ y ­wrZ   )r-  )rW  r!   Ú	exceptions     €r.   rY  z4RetryableHTTPClient._is_retryable.<locals>.<genexpr>  s   øè ø€ ÐWÑ?V°e”Z 	¨5×1Ñ?Vùs   ƒrj  Né   T)rp  ry  rm  r-  r   Úcoderu  Úanyrv  ÚasyncioÚsleeprw  )r3   r€  rŠ  Úhces     ` r.   rƒ  z!RetryableHTTPClient._is_retryableô  s²   øè ø€ ð ˜×-Ñ-Ñ-ØØ×Ñ˜t×/Ñ/Ò/Øô �i¤Ô1Ø#,ˆCØ�x‰x˜t×2Ñ2Ñ2ØÜÓW¸t×?VÒ?VÓWÔWØô �m‰m˜D×/Ñ/°1°d×6FÑ6FÑ3FÑGÓH×HÐHØ×Ò˜AÑÕØð 	Iús   ƒB&CÂ)CÂ*CN©r}  r:   r7   r;   r<   r   )r€  r:   rŠ  r*  r<   rÔ   )r(   r)   r*   r+   ÚMAX_RETRIES_DEFAULTÚMAX_RETRIES_CAPrï   r[   Úgetenvrm  rf  ÚmaxÚminrp  ru  ÚConnectionErrorrv  rw  r  r~  r|  rƒ  r,   r-   r.   ri  ri  Å  sŠ   … ñð ÐØ€OÙ˜9˜2Ÿ9™9Ð%JÐL_Ó`Óa€K�ÓaÙ�a™˜[¨/Ó:Ó;€KØ!&¨Ð 1€O�XÓ1Ú3€N�HÓ3Ø%4Ð$5Ð˜	Ó5Ø€N�EÓò9ó
5óô$r-   ri  c              ‹  ó  K  — t         j                  «       } |j                  di |¤Ž}t        «       }	  |j                  | fi |¤Žƒ d{  –—† }|j                  t        t        t        dt        di¬«       |j@                  r|jC                  |jD                  «       |S 7 ŒU# t        $ �r1}|j                  t        t        t        |j                  t        t        |j                  «      i¬«       d|j                  › d�}|j                  }|j                   rœ	 t#        j$                  |j                   j&                  «      }|j)                  d«      xs |}|j)                  d«      xs |}nG# t"        j*                  j,                  $ r' |j                   j&                  j/                  «       }Y nw xY wt1        j2                  |j                  d	||«      |‚d}~wt4        $ rX}|j                  t        t        t        d
t        t        |«      i¬«       t1        j2                  d
d|j                  «      |‚d}~wt6        $ rX}|j                  t        t        t        dt        t        |«      i¬«       t1        j2                  dd|j                  «      |‚d}~wt8        $ rh}|j                  t        t        t        dt        t        |«      i¬«       t;        j<                  d«      j?                  d|j                  |«       |‚d}~ww xY w­w)zDMake an async request to kernel gateway endpoint, returns a responseNéÈ   r"   re   z=Exception while attempting to connect to Gateway server url 'r‚  Úreasonrp   z]Error from Gateway: [%s] %s. Ensure gateway url is valid and the Gateway instance is running.rt  zmConnectionError was received from Gateway server url '%s'.  Check to be sure the Gateway instance is running.i”  z’The Gateway server specified in the gateway_url '%s' doesn't appear to be valid.  Ensure gateway url is valid and the Gateway instance is running.iù  r�  z>Exception while trying to launch kernel via Gateway URL %s: %sr,   )#rB   Úinstancer4  ri  r~  rR   rj   ÚSUCCESS_STATUSrl   rm   r   rk   rŒ  r:   rp   rX   r†  r$  r%  Úbodyr]   ÚdecoderÚJSONDecodeErrorÚdecoder   Ú	HTTPErrorr—  r   r*  r„  r…  r!   r  rI  r·   )	r}  r7   rF   Úrhcr†  rE  Úerror_reasonÚerror_messageÚerror_payloads	            r.   Úgateway_requestr¦  
  sÍ  è ø€ ä"×+Ñ+Ó-€NØ0ˆ^×0Ñ0Ñ:°6Ñ:€FÜ
Ó
€Cð=Ø"˜Ÿ™ 8Ñ6¨vÑ6×6ˆØ×ÑÜœn¬o¸sÄKÐQZÐ[ð 	ô 	
ðz ×$Ò$Ø×%Ñ% h×&6Ñ&6Ô7à€OðC 7ùô ó Ø×ÑÜœl¬O¸Q¿V¹VÄ[ÔRUÐVW×V_ÑV_ÓR`Ðað 	ô 	
ð LÈN×L^ÑL^ÐK_Ð_`Ðað 	ð Ÿ	™	ˆØ�:Š:ð8Ü $§
¡
¨1¯:©:¯?©?Ó ;�Ø,×0Ñ0°Ó:ÒJ¸l�Ø -× 1Ñ 1°)Ó <Ò MÀ‘øÜ—<‘<×/Ñ/ò 8Ø Ÿz™zŸ™×5Ñ5Ó7’ð8úô �m‰mØ�F‰FðOàØó
ð ð	ûô ò 	Ø×ÑÜœl¬O¸SÄ+ÌsÐSTËvÐVð 	ô 	
ô �m‰mØð@à×Ñó	
ð
 ð	ûô ò 	Ø×ÑÜœl¬O¸SÄ+ÌsÐSTËvÐVð 	ô 	
ô �m‰mØðdà×Ñó	
ð
 ð	ûô ò 	Ø×ÑÜœl¬O¸SÄ+ÌsÐSTËvÐVð 	ô 	
ô 	×Ñ˜+Ó&×,Ñ,ØLØ×ÑØô	
ð
 ˆûð	üsˆ   ‚1L´B" Á
B Á,B" Á7)LÂ B" Â"
L
Â,A-GÄAE.Å-GÅ.AF2Æ/GÆ1F2Æ2&GÇL
Ç$AH7È7L
ÉAJÊL
Ê"A#LÌL
Ì
Lr‘  )=r+   Ú
__future__r   rŽ  r$  r„  r[   ÚtypingÚtyÚabcr   r   r   r   r   Úemail.utilsr	   Úhttp.cookiesr
   r   Úsocketr   Újupyter_eventsr   Útornador   Útornado.httpclientr   r   r   Útornado.httputilr   Ú	traitletsr   r   r   r   r   r   r   r   r   r   Útraitlets.configr   r   Újupyter_serverr   r    rk   rœ  rj   rl   rm   Útyper'   r0   r?   rB   ri  r¦  r,   r-   r.   Ú<module>r¶     sÇ   ðÙ õ #ã Û Û Û 	Û ß ,Ñ ,ß 'Ý -ß -Ý å &Ý ß MÑ MÝ (÷÷ ÷ ÷ Hç Pà€Ø€Ø€
Ø€Ø€ôM˜g¡tÐ,?Ó'@ô MôØÐ	Ð(?õô0Ð.ô ô i	1Ð)ô i	1÷XBñ BôJGr-   