
    hMh9                     z   U d Z ddlZddlZddl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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"m#Z# ddl$m%Z%m&Z&m'Z' ddl(Z( e(j)        e          Z*d Z+ e%j,        d          d         Z- e&j,        d          d         Z. e+dd          Z/i Z0ej1        e2df         e3d<   d Z4d Z5e5e4dZ6e7e8e9fZ:d Z;d Z<d Z=d Z> G d de          Z? G d de?          Z@d  ZA G d! d"          ZB eB            ZCd# ZD G d$ d%eE          ZF G d& de?          ZGdS )'zqBase Widget class.  Allows user to create widgets in the back-end that render
in the Jupyter notebook front-end.
    N)contextmanager)Iterable)get_ipython)Any	HasTraitsUnicodeDictInstanceListIntSetBytesobservedefault	Container	Undefined)loadsdumps   comm)standard_b64encode   )deprecation
_get_frame)__protocol_version____control_protocol_version__ __jupyter_widgets_base_version__c                     | t           j        v r&t           j        |                                          dvS t          |          S )aB  Return True if the given environment variable is turned on, otherwise False
    If the environment variable is set, True will be returned if it is assigned to a value
    other than 'no', 'n', 'false', 'off', '0', or '0.0' (case insensitive).
    If the environment variable is not set, the default value is returned.
    )nonfalseoff0z0.0)osenvironlowerbool)namer   s     Y/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/ipywidgets/widgets/widget.pyenvsetr+      s<     rzz$%%''/VVVG}}    .JUPYTER_WIDGETS_ECHOTr   Widget
_instancesc                    t          | t                    r fd|                                 D             S t          | t          t          f          rfd| D             S t          | t
                    r
d| j        z   S | S )Nc                 8    i | ]\  }}|t          |          S  _widget_to_json.0kvobjs      r*   
<dictcomp>z#_widget_to_json.<locals>.<dictcomp>2   )    AAAtq!?1c**AAAr,   c                 0    g | ]}t          |          S r4   r5   r8   r:   r;   s     r*   
<listcomp>z#_widget_to_json.<locals>.<listcomp>4   #    333A3''333r,   
IPY_MODEL_)
isinstancedictitemslisttupler0   model_idxr;   s    `r*   r6   r6   0   s    !T AAAAqwwyyAAAA	Ae}	%	% 33333333	Av		 aj((r,   c                 f   t          | t                    r fd|                                 D             S t          | t          t          f          rfd| D             S t          | t
                    r;|                     d          r&| dd          t          v rt          | dd                   S | S )Nc                 8    i | ]\  }}|t          |          S r4   _json_to_widgetr7   s      r*   r<   z#_json_to_widget.<locals>.<dictcomp><   r=   r,   c                 0    g | ]}t          |          S r4   rM   r?   s     r*   r@   z#_json_to_widget.<locals>.<listcomp>>   rA   r,   rB   
   )rC   rD   rE   rF   rG   str
startswithr1   rI   s    `r*   rN   rN   :   s    !T AAAAqwwyyAAAA	Ae}	%	% 33333333	As		 \ : : qv?S?S!BCC&!!r,   )	from_jsonto_jsonc                 v    t          ||          D ]'\  }}| }|dd         D ]
}||         }|||d         <   (dS )zThe inverse of _remove_buffers, except here we modify the existing dict/lists.
    Modifying should be fine, since this is used when state comes from the wire.
    N)zip)statebuffer_pathsbuffersbuffer_pathbufferr;   keys          r*   _put_buffersr^   K   sg      #<99 & &V ss# 	 	Cc(CC%KO& &r,   c                    t          | t          t          f          rd}t          |           D ]\  }}t          |t                    rG|st          |           } d}d| |<   |                    |           |                    ||gz              at          |t          t          t          f          r2t          |||gz   ||          }||ur|st          |           } d}|| |<   nt          | t                    rd}|                                 D ]\  }}t          |t                    rE|st          |           } d}| |= |                    |           |                    ||gz              _t          |t          t          t          f          r2t          |||gz   ||          }||ur|st          |           } d}|| |<   nt          d| z            | S )z!For internal, see _remove_buffersFTNz+expected state to be a list or dict, not %r)
rC   rF   rG   	enumerate_binary_typesappendrD   _separate_buffersrE   
ValueError)	substatepathrY   rZ   	is_clonedir:   vnewr9   s	            r*   rc   rc   W   s    (T5M** #S	h'' 	' 	'DAq!]++ '  %#H~~H $I"q!!!##DA3J////AdE233 '(DA3JgNND==$ )#'>>$(	"&HQK	' 
Hd	#	# S	NN$$ 	' 	'DAq!]++ '  %#H~~H $IQKq!!!##DA3J////AdE233 '(DA3JgNND==$ )#'>>$(	"&HQK	'  FQRRROr,   c                 8    g g }}t          | g ||          } | ||fS )a  Return (state_without_buffers, buffer_paths, buffers) for binary message parts

    A binary message part is a memoryview, bytearray, or python 3 bytes object.

    As an example:
    >>> state = {'plain': [0, 'text'], 'x': {'ar': memoryview(ar1)}, 'y': {'shape': (10,10), 'data': memoryview(ar2)}}
    >>> _remove_buffers(state)
    ({'plain': [0, 'text']}, {'x': {}, 'y': {'shape': (10, 10)}}, [['x', 'ar'], ['y', 'data']],
     [<memory at 0x107ffec48>, <memory at 0x107ffed08>])
    )rc   )rX   rY   rZ   s      r*   _remove_buffersrk      s-     'LeRw??E,''r,   c                    t          |           t          |          k    rdS | |k    rdS t          | |          D ]N\  }}t          |                              d          t          |                              d          k    r dS OdS )zCompare two lists of buffers for equality.

    Used to decide whether two sequences of buffers (memoryviews,
    bytearrays, or python 3 bytes) differ, such that a sync is needed.

    Returns True if equal, False if unequal
    FTB)lenrW   
memoryviewcast)abiaibs       r*   _buffer_list_equalru      s     1vvQuAvvta))  B b>>s##z"~~':':3'?'???55 @4r,   c                   P    e Zd ZdZ ed          Z ed          d             ZdS )LoggingHasTraitszA parent class for HasTraits that log.
    Subclasses have a log trait, and the default behavior
    is to get the logger from the currently running Application.
    zlogging.Loggerlogc                 6    ddl m} |                                S )Nr   )rx   )	traitletsrx   
get_logger)selfrx   s     r*   _log_defaultzLoggingHasTraits._log_default   s$    !!!!!!~~r,   N)__name__
__module____qualname____doc__r
   rx   r   r}   r4   r,   r*   rw   rw      sQ          (#
$
$CWU^^    ^     r,   rw   c                   4    e Zd ZdZ e            Zd ZddZdS )CallbackDispatcherz1A structure for registering and running callbacksc                     d}| j         D ]k}	  ||i |}||n|}# t          $ rM}t                      }|| j                            d||d           n|                                 Y d}~dd}~ww xY w|S )z%Call all of the registered callbacks.NzException in callback %s: %sTexc_info)	callbacks	Exceptionr   rx   warningshowtraceback)r|   argskwargsvaluecallbacklocal_valueeips           r*   __call__zCallbackDispatcher.__call__   s     
	J 
	JH	J&h777 (3'>E  ' ' ' ]]:H$$%CXq[_$````$$&&&' s   
A3AA..A3Fc                     |r%|| j         v r| j                             |           dS |s%|| j         vr| j                             |           dS dS dS )z(Un)Register a callback

        Parameters
        ----------
        callback: method handle
            Method to be registered or unregistered.
        remove=False: bool
            Whether to unregister the callback.N)r   removerb   r|   r   r   s      r*   register_callbackz$CallbackDispatcher.register_callback   st      	,h$.00N!!(+++++ 	,HDN::N!!(+++++	, 	,::r,   NF)r~   r   r   r   r   r   r   r   r4   r,   r*   r   r      sH        ;;I   , , , , , ,r,   r   c                       fd}|S )z decorator for showing tracebacksc                     	  | g|R i |S # t           $ rT}t                      }|| j                            d|d           n|                                 Y d }~d S Y d }~d S d }~ww xY w)Nz!Exception in widget method %s: %sTr   )r   r   rx   r   r   )r|   r   r   r   r   methods        r*   mz_show_traceback.<locals>.m   s    	#6$0000001 	# 	# 	#Bz  !DfaZ^ ____  """"""""" `_____	#s    
A-AA((A-r4   )r   r   s   ` r*   _show_tracebackr      s#    # # # # # Hr,   c                   &    e Zd Zd Zd Zd Zd ZdS )WidgetRegistryc                     i | _         d S N)	_registryr|   s    r*   __init__zWidgetRegistry.__init__   s    r,   c                     | j                             |i           }|                    |i           }|                    |i           }|                    |i           }|                    |i           }	||	|<   dS )zRegister a valueN)r   
setdefault)
r|   model_modulemodel_module_version_range
model_nameview_moduleview_module_version_range	view_nameklassmodel_versionview_versions
             r*   registerzWidgetRegistry.register   s    ~00rBB$//0JBOO"--j"==
 ++K<<"--.GLL"'Yr,   c                     | j         |         }t          |                                          d         }||         }	|	|         }
t          |
                                          d         }||         }|S )zGet a valuer   )r   rF   values)r|   r   model_module_versionr   r   view_module_versionr   module_versionsmodel_namesview_modulesview_versions
view_nameswidget_classs                r*   getzWidgetRegistry.get   sr    .6
 ?113344Q7":.$[1 -..0011!4
!),r,   c              #      K   t          | j                                                  D ]\  }}t          |                                          D ]\  }}t          |                                          D ]\  }}t          |                                          D ]_\  }}t          |                                          D ]8\  }	}
t          |
                                          D ]\  }}|||||	|f|fV  9`d S r   )sortedr   rE   )r|   r   mmr   mvr   vmr   vvr   vnr   widgets                r*   rE   zWidgetRegistry.items  sP      &t~';';'='= > > 	B 	BL"%+BHHJJ%7%7 B B!r&,RXXZZ&8&8 B BNJ+1"((**+=+= B BR06rxxzz0B0B B B,L"5;BHHJJ5G5G B B 1	6+7
T_amox*y  |B  +B  %B  %B  %B  %BBBBBB	B 	Br,   N)r~   r   r   r   r   r   rE   r4   r,   r*   r   r      sU          ( ( (  "B B B B Br,   r   c           	          |                                  }t                              |d         j        |d         j        |d         j        |d         j        |d         j        |d         j        |            | S )z>A decorator registering a widget class in the widget registry._model_module_model_module_version_model_name_view_module_view_module_version
_view_name)class_traitsr   r   default_value)r   ws     r*   r   r     sw    Aq)7!"#:!;!I!"=!1!?!">!2!@!"#9!:!H!"<!>!') ) ) Mr,   c                       e Zd Zd Zd ZdS )_staticpropertyc                     || _         d S r   fget)r|   r   s     r*   r   z_staticproperty.__init__$  s    			r,   c                 2    |J |                                  S r   r   )r|   
owner_self	owner_clss      r*   __get__z_staticproperty.__get__'  s    !!!yy{{r,   N)r~   r   r   r   r   r4   r,   r*   r   r   #  s2              r,   r   c                       e Zd ZdZdZed             Zed             Zed             Zed             Z	e
d             Zed             Zed             Ze
d	             Ze
d
             Zed             ZedBd            ZdCdZd Z eddd                              d          Z eddd                              d          Z eedd                              d          Z eddd                              d          Z eddd                              d          Z edd                              d          Z eddd                              d          Z e d          Z! e"d           Z# e$d!          d"             Z% e&            Z'dZ( e)            Z* e+e,d#          Z- fd$Z.d% Z/d& Z0d' Z1d( Z2 e3d)          d*             Z4e5d+             Z6d, Z7dDd-Z8dEd.Z9d/ Z:d0 Z;d1 Z<dDd2Z=dCd3Z> fd4Z? fd5Z@d6 ZAeBd7             ZCeBd8             ZDd9 ZEeFd:             ZGd; ZHed<             ZIed=             ZJd> ZKdDd?ZLd@ ZMdA ZN xZOS )Fr0   Nc                      t          d          } | j        j        t          k    r| j        j        dv st          d           t          S )Nr   
getmemberssetup_instancesetup_classzWidget.widgets is deprecated.r   f_codeco_filenameTRAITLETS_FILEco_namer   r1   frames    r*   widgetszWidget.widgets4  sP    
 1(N::@T  YH  AH  AH7888r,   c                      t          d          } | j        j        t          k    r| j        j        dv st          d           t          S )Nr   r   z%Widget._active_widgets is deprecated.r   r   s    r*   _active_widgetszWidget._active_widgets>  sP    
 1(N::@T  YH  AH  AH?@@@r,   c                      t          d          } | j        j        t          k    r| j        j        dv st          d           t          S )Nr   r   z#Widget._widget_types is deprecated.r   r   r   r   r   r   r   r   s    r*   _widget_typeszWidget._widget_typesH  sP    
 1(N::@T  YH  AH  AH=>>>r,   c                      t          d          } | j        j        t          k    r| j        j        dv st          d           t          S )Nr   r   z"Widget.widget_types is deprecated.r   r   s    r*   widget_typeszWidget.widget_typesR  sP    
 1(N::@T  YH  AH  AH<===r,   c                     t          t                                                    D ]}|                                 d S r   )rF   r1   r   close)clsr   s     r*   	close_allzWidget.close_all\  s>    :,,..// 	 	FLLNNNN	 	r,   c                     | t           _        dS )zRegisters a callback to be called when a widget is constructed.

        The callback must have the following signature:
        callback(widget)N)r0   _widget_construction_callback)r   s    r*   on_widget_constructedzWidget.on_widget_constructeda  s     08,,,r,   c                     t           j        5t          t           j                  rt                               |            dS dS dS )3Static method, called when a widget is constructed.N)r0   r   callable)r   s    r*   _call_widget_constructedzWidget._call_widget_constructedi  sE     /;Im@n@n;0088888 <;;;r,   c                 "   |                     di                                dd          }|                    d          d         t          k    rt          d|dt                    || _        | j                            | j                   dS )	z
        Class method, called when the comm-open message on the
        "jupyter.widget.control" comm channel is received
        metadataversion r-   r   z@Incompatible widget control protocol versions: received version , expected version N)r   splitCONTROL_PROTOCOL_VERSION_MAJORrd   r   _control_common_msg_handle_control_comm_msg)r   r   msgr   s       r*   handle_control_comm_openedz!Widget.handle_control_comm_openedo  s     ''*b))--i<<==a $BBB*xxx  B^  B^  _  `  `  `   !=>>>>>r,   c                    | j         t          d          |d         d         }|d         }|dk    r|                                  t                                          }i }d}|D ]4}|j        |j        |j        |                    |          d||j	        <   5t          |          \  }}}	| j                             t          d	||
          |	           d S t          d|z            )Nz)Control comm has not been properly openedcontentdatar   request_statesFdrop_defaults)r   r   r   rX   update_states)r   statesrY   rZ   zAUnknown front-end to back-end widget control msg with method "%s")r   RuntimeErrorget_manager_stater1   r   r   r   r   	get_staterH   rk   sendrD   )
r   r   r  r   r   
full_stater  r   rY   rZ   s
             r*   r   zWidget._handle_control_comm_msg|  s.    $JKKK9~f%h%%%!!### ''))GJ!M!  "("4$*$8,2,H#--M-JJ	/ /
6?++ 1@
0K0K-Jg""4&!)$ $ $ 	 #           bekklllr,   c           	         |                     di                                dd          }|                    d          d         t          k    rt          d|dt                    |d         d	         }|d
         }t
                               |d         |d         |d         |d         |d         |d                   } ||           }d|v rt          ||d         |d                    |                    |           dS )r   r   r   r   r-   r   z8Incompatible widget protocol versions: received version r   r  r  rX   r   r   r   r   r   r   r   rY   rZ   N)r   r   PROTOCOL_VERSION_MAJORrd   r   r   r^   	set_state)r   r   r   r  rX   r   r   s          r*   handle_comm_openedzWidget.handle_comm_opened  s+    ''*b))--i<<==a $:::*pwpwpw  zN  zN  O  P  P  P9~f%W !}}U?%;/45L/M/4]/C/4^/D/45K/L/4\/BD D 4(((T!!^ 4c)nEEEr,   Fc                     i }|t                                           }|D ] }|                    |           ||j        <   !dd|dS )zReturns the full state for a widget manager for embedding

        :param drop_defaults: when True, it will not include default value
        :param widgets: list with widgets to include in the state (or all widgets when None)
        :return:
        Nr  r   r   )version_majorversion_minorrX   )r1   r   _get_embed_staterH   )r  r   rX   r   s       r*   r  zWidget.get_manager_state  s`     ? ''))G 	Z 	ZF%+%<%<=%<%Y%YE&/""!"QGGGr,   c                     | j         | j        | j        d}t          |                     |                    \  }}}||d<   t          |          dk    rd t          ||          D             |d<   |S )N)r   r   r   r  rX   r   c                 `    g | ]+\  }}d |t          |                              d          d,S )base64ascii)encodingrf   r  )r   decode)r8   pds      r*   r@   z+Widget._get_embed_state.<locals>.<listcomp>  s\      H  H  H %)Aq .6)*);A)>)>)E)Eg)N)N!P !P  H  H  Hr,   rZ   )r   r   r   rk   r  rn   rW   )r|   r  rX   model_staterY   rZ   s         r*   r  zWidget._get_embed_state  s    * .$($>
 

 .=T^^Zg^=h=h-i-i*\7$gw<<! H  H -0g,F,F H  H  HE) r,   c                 0    t          dd| j                  S )Nr   r   r  r  rH   )rD   	_model_idr   s    r*   get_view_speczWidget.get_view_spec  s    !1t~NNNNr,   WidgetModelzName of the model.T)help	read_onlysyncz@jupyter-widgets/basezThe namespace for the model.z@A semver requirement for namespace version containing the model.zName of the view.)
allow_noner&  zThe namespace for the view.r   zCA semver requirement for the namespace version containing the view.)r&  zEXPERIMENTAL: The number of views of the model displayed in the frontend. This attribute is experimental and may change or be removed in the future. None signifies that views will not be tracked. Set this to 0 to start tracking view creation/deletion.)r*  zThe traits which are synced.keysc                 B    d |                      d          D             S )Nc                     g | ]}|S r4   r4   )r8   r)   s     r*   r@   z(Widget._default_keys.<locals>.<listcomp>  s    888888r,   Tr(  )traitsr   s    r*   _default_keyszWidget._default_keys  s$    88$!7!78888r,   r4   c                     |                     dd          | _         t                      j        di | t                              |            |                                  dS )zPublic constructorrH   Nr4   )popr#  superr   r0   r   open)r|   r   	__class__s     r*   r   zWidget.__init__  sZ    J55""6"""''---		r,   c                      t          d          Nz8Widgets cannot be copied; custom implementation requiredNotImplementedErrorr   s    r*   __copy__zWidget.__copy__      !"\]]]r,   c                      t          d          r6  r7  )r|   memos     r*   __deepcopy__zWidget.__deepcopy__  r:  r,   c                 .    |                                   dS )zObject disposalN)r   r   s    r*   __del__zWidget.__del__  s    

r,   c                     | j         kt          |                                           \  }}}t          d||d|dt          i          }| j        
| j        |d<   t          j        di || _         dS dS )z6Open a comm to the frontend if one isn't already open.Nzjupyter.widget)rX   rY   r   )target_namer  rZ   r   comm_idr4   )r   rk   r  rD   r   r#  create_comm)r|   rX   rY   rZ   r   s        r*   r3  zWidget.open
  s    9+:4>>;K;K+L+L(E<$4',lKK '"+-A!B  D
 ~)"&.Y(00400DIII r,   r   c                     |d         dS | j         | _        | j                            | j                   | t
          | j         <   dS )z Called when the comm is changed.newN)rH   r#  r   r   _handle_msgr1   )r|   changes     r*   _comm_changedzWidget._comm_changed  sG     %= F	)***$(
4=!!!r,   c                     | j         j        S )zmGets the model id of this widget.

        If a Comm doesn't exist yet, a Comm will be created automagically.)r   rB  r   s    r*   rH   zWidget.model_id#  s    
 y  r,   c                     | j         It                              | j        d           | j                                          d| _         d| _        dS dS )zClose method.

        Closes the underlying comm.
        When the comm is closed, all of the widget views are automatically
        removed from the front-end.N)r   r1   r1  rH   r   _repr_mimebundle_r   s    r*   r   zWidget.close.  sQ     9 NN4=$///IOODI%)D"""	 ! r,   c                 $   |                      |          }t          |          dk    rf| j        r-|                                D ]\  }}|| j        v r
|| j        |<   t	          |          \  }}}d||d}|                     ||           dS dS )a  Sends the widget state, or a piece of it, to the front-end, if it exists.

        Parameters
        ----------
        key : unicode, or iterable (optional)
            A single property's name or iterable of property names to sync with the front-end.
        r]   r   updater   rX   rY   r
  N)r  rn   _property_lockrE   rk   _send)r|   r]   rX   r)   r   rY   rZ   r   s           r*   
send_statezWidget.send_state:  s     3''u::>>" :#(;;== : :KD%t22249+D1+:5+A+A(E<%|TTCJJsGJ,,,,, >r,   c                    || j         }n@t          |t                    r|g}n't          |t                    r|}nt	          d          i }|                                 }|D ]`}|                     |d| j                  } |t          | |          |           }|r!| 	                    |||         j
                  s|||<   a|S )a]  Gets the widget state, or a piece of it.

        Parameters
        ----------
        key : unicode or iterable (optional)
            A single property's name or iterable of property names to get.

        Returns
        -------
        state : dict of states
        metadata : dict
            metadata for each field: {key: metadata}
        Nz2key must be a string, an iterable of keys, or NonerT   )r+  rC   rQ   r   rd   r.  trait_metadata_trait_to_jsongetattr_comparer   )	r|   r]   r  r+  rX   r.  r9   rT   r   s	            r*   r  zWidget.get_stateM  s     ;9DDS!! 	S5DDX&& 	SDDQRRR 	! 	!A))!Y8KLLGGGD!,,d33E  !eVAY=T(U(U ! ar,   c                 B    |j         j        dk    o|j         j        dk    S )Nndarraynumpy)r4  r~   r   )r|   rJ   s     r*   	_is_numpyzWidget._is_numpyl  s!    {#y0VQ[5Kw5VVr,   c                     |                      |          s|                      |          rdd l}|                    ||          S ||k    S )Nr   )r[  rZ  array_equal)r|   rq   rr   nps       r*   rW  zWidget._compareo  sR    >>! 	q 1 1 	>>!Q'''6Mr,   c           
      B   t           rti }|                                D ]+\  }}|| j        v r|                     |dd          r|||<   ,|r0t	          |          \  }}}d||d}|                     ||            | j        di |5  |                                 5  |D ]M}|| j        v rB|                     |d| j                  }	| 	                    | |	||         |                      N	 ddd           n# 1 swxY w Y   ddd           dS # 1 swxY w Y   dS )	z3Called when a state is received from the front-end.echo_updateTr/   rO  r
  rS   Nr4   )
r.   rE   r+  rT  rk   rQ  _lock_propertyhold_trait_notifications_trait_from_json	set_trait)
r|   	sync_data
echo_stateattrr   echo_buffer_pathsecho_buffersr   r)   rS   s
             r*   r  zWidget.set_statev  s      	6J(00 - -e49$$)<)<T=Z^)<)_)_$',Jt$ 6>Mj>Y>Y;
-|+'$5 
 

3
555
 !T --9-- 	K 	Kt/L/L/N/N 	K 	K! K K49$$ $ 3 3D+484I!K !KINN49T?D)I)IJJJ	K	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	Ks7   	DAC<0D<D 	 DD 	DDDc                 :    |                      d|d|           dS )a  Sends a custom msg to the widget model in the front-end.

        Parameters
        ----------
        content : dict
            Content of the message to send.
        buffers : list of binary buffers
            Binary buffers to send with message
        custom)r   r  r
  N)rQ  r|   r  rZ   s      r*   r  zWidget.send  s(     	

h7;;W
MMMMMr,   c                 >    | j                             ||           dS )a=  (Un)Register a custom msg receive callback.

        Parameters
        ----------
        callback: callable
            callback will be passed three arguments when a message arrives::

                callback(widget, content, buffers)

        remove: bool
            True if the callback should be unregistered.)r   N)_msg_callbacksr   r   s      r*   r   zWidget.on_msg  s&     	--hv-FFFFFr,   c                      t                      j        di | |                                D ]=\  }}d|j        v r/| j                            |           |                     |           >dS )z/Dynamically add trait attributes to the Widget.r)  Nr4   )r2  
add_traitsrE   r   r+  rb   rR  )r|   r.  r)   traitr4  s       r*   rp  zWidget.add_traits  s{    $$V$$$!<<>> 	& 	&KD%''	  &&&%%%	& 	&r,   c                    |d         }| j         Yt          | j         dd          C|| j        v r:|                     |t          | |                    r|                     |           t                                          |           dS )z#Called when a property has changed.r)   NkernelTrM  )r   rV  r+  _should_send_propertyrR  r2  notify_change)r|   rG  r)   r4  s      r*   ru  zWidget.notify_change  s     f~9 WTY$%G%G%Sty  T%?%?gdTXFYFY%Z%Z D)))f%%%%%r,   c                 P    |                      |                                           S r   )_gen_repr_from_keys
_repr_keysr   s    r*   __repr__zWidget.__repr__  s     ''(9(9:::r,   c              +   H   K   || _         	 dV  i | _         dS # i | _         w xY w)a  Lock a property-value pair.

        The value should be the JSON state of the property.

        NOTE: This, in addition to the single lock for all state changes, is
        flawed.  In the future we may want to look into buffering state changes
        back to the front-end.N)rP  )r|   
propertiess     r*   ra  zWidget._lock_property  s@       )	%EEE"$D"D$$$$s    	!c              #   2  K   | j         du rdV  dS 	 d| _         dV  d| _         |                     | j                   | j                                         dS # d| _         |                     | j                   | j                                         w xY w)z@Hold syncing any state until the outermost context manager exitsTNF)_holding_syncrR  _states_to_sendclearr   s    r*   	hold_synczWidget.hold_sync  s       %%EEEEE-%)"%*" 4555$**,,,,, &+" 4555$**,,,,s   A <Bc                    |                      |d| j                  }|| j        v rt          | |||           i          }t          || j        |         i          }t	          t          |d                             |d         k    rQ|d         |d         k    r?t          |d         |d                   r#| j        r| j        	                    |           dS | j        r| j        
                    |           dS dS )z'Check the property lock (property_lock)rT   r   r   r   FT)rT  rU  rP  rk   	jsonloads	jsondumpsru   r}  r~  discardadd)r|   r]   r   rT   split_value
split_locks         r*   rt  zWidget._should_send_property  s   %%c9d6IJJ$%%%)C1E1E*FGGK(30CC0H)IJJJ )KN3344
1EENjm33&{1~z!}EE 4% 6(00555u 	 $$S)))54r,   c                    |d         d         }|d         }|dk    rFd|v r@|d         }d|v rt          ||d         |d                    |                     |           dS dS |dk    r|                                  dS |d	k    r*d|v r$|                     |d         |d                    dS dS | j                            d
|z             dS )z0Called when a msg is received from the front-endr  r  r   rN  rX   rY   rZ   request_staterk  z9Unknown front-end to back-end widget msg with method "%s"N)r^   r  rR  _handle_custom_msgrx   error)r|   r   r  r   rX   s        r*   rF  zWidget._handle_msg  s    9~f%hX$W!T)) ^(<c)nMMMu%%%%%	  &&OO xD  ''YYHHHHH ! 
 HNNVY__`````r,   c                 4    |                      | ||           dS )z%Called when a custom msg is received.N)rn  rl  s      r*   r  zWidget._handle_custom_msg  s     D'733333r,   c                     | S )zConvert a trait value to json.r4   rJ   r|   s     r*   rU  zWidget._trait_to_json  	     r,   c                     | S )zConvert json values to objects.r4   r  s     r*   rc  zWidget._trait_from_json  r  r,   c                     t          |           }t          |          dk    r|d d         dz   }d|i}| j        dd| j        d|d<   |S d S )Nn   u   …z
text/plainr   r   r"  z(application/vnd.jupyter.widget-view+json)reprrn   r   r#  )r|   r   	plaintextr  s       r*   rK  zWidget._repr_mimebundle_"  sv    JJ	y>>C!$3$%/I)
 ?& "#!" N@ @D;<
 K '&r,   c                     | j         At          | j         d          r| j         j        "n	 | j                             ||           dS dS dS )z.Sends a message to the model in the front-end.Nrs  T)r  rZ   )r   hasattrrs  r  )r|   r   rZ   s      r*   rQ  zWidget._send6  sX    9 gdiYaFbFb di&6&B&B&BINNWN55555 ! &B&Br,   c              #   n  K   |                                  }t          | j                  D ]}|d         dk    rt          | |          }||         }|                     ||j                  rCt          |t          t          f          r&|j        t          k    r|t          |          dk    r|V  d S )Nr   _)r.  r   r+  rV  rW  r   rC   r   r	   r   rn   )r|   r.  r]   r   rq  s        r*   rx  zWidget._repr_keys;  s      $)$$ 	 	C1v}}D#&&E3KE}}UE$788 UY$566 %22=CJJ!OOIIII	 	r,   c                       j         j        }d                     fd|D                       }d                    ||          S )Nz, c              3   `   K   | ](}d                      |t          |                    V  )dS )z{}={!r}N)formatrV  )r8   r]   r|   s     r*   	<genexpr>z-Widget._gen_repr_from_keys.<locals>.<genexpr>O  sQ       
 
 S'$"4"455
 
 
 
 
 
r,   z{}({}))r4  r~   joinr  )r|   r+  
class_name	signatures   `   r*   rw  zWidget._gen_repr_from_keysM  s\    ^,
II 
 
 
 

 
 
 
 
	 z9555r,   )FNr   r   )NF)Pr~   r   r   r   r   r   r   r   r   r   classmethodr   staticmethodr   r   r  r   r  r  r  r$  r   tagr   r   r   r   r   r   r   r   _view_countr   r   r   r+  r   r/  r	   rP  r}  r   r~  r
   r   rn  r   r9  r=  r?  r3  r   rH  propertyrH   r   rR  r  r[  rW  r  r  r   rp  ru  ry  r   ra  r  rt  r   rF  r  rU  rc  rK  rQ  rx  rw  __classcell__)r4  s   @r*   r0   r0   -  s        %)!M  _   _   _   _   [ 8 8 \8 9 9 \9
 
? 
? [
? m m [m>     \ ( H H H \H   O O O '-!T3 3 3363D3>> G3+t= = ==@SdS^^ #G$DO[_a a aadadjnadaoao $ " " ""%#4#.. 74D*, , ,,/CTCNN "72RT T TTWTW]aTWTbTb  #dt KL L L MP  MP  VZ  MP  M[  M[ 3$D43444DWV__9 9 _9 TVVNMceeOX0"55N
    ^ ^ ^^ ^ ^  1 1 1 WV__) ) _) ! ! X!
* 
* 
*- - - -&   >W W W  K K K6
N 
N 
N 
NG G G G& & & & &
& 
& 
& 
& 
&; ; ; % % ^% - - ^-  . a a _a24 4 4   \   \  (6 6 6 6
  $6 6 6 6 6 6 6r,   )Hr   r%   systyping
contextlibr   collections.abcr   IPythonr   rz   r   r   r   r	   r
   r   r   r   r   r   r   r   r   jsonr   r  r   r  r   r   r  r   utilsr   r   _versionr   r   r   inspectgetfiler   r+   r   r  r   r.   r1   MutableMappingrQ   __annotations__r6   rN   widget_serializationro   	bytearraybytesra   r^   rc   rk   ru   rw   r   r   r   r   r   objectr   r0   r4   r,   r*   <module>r     s  
   
			 



  % % % % % % $ $ $ $ $ $                                    8 7 7 7 7 7 7 7       % % % % % % * * * * * * * * k k k k k k k k k k  ++	 	 	 4-3C88; !C!=!CC!H!H!K v4dCCC  57
V"3=1 6 6 6     !  
 Y.
& 
& 
&+ + +Z( ( (  .	  	  	  	  	 y 	  	  	 ", ", ", ", ",) ", ", ",H  &B &B &B &B &B &B &B &BX N	
 
 
    f   f6 f6 f6 f6 f6 f6 f6 f6 f6 f6r,   