
    gew                        d Z ddlmZ 	 ddlmZ n# e$ r	 ddlmZ Y nw xY w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 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%m&Z&  e%j'        d          d         Z(d Z)d Z*e*e)dZ+ere,e-e.fZ/ne,e-fZ/d Z0d Z1d Z2d Z3 G d de          Z4 G d de4          Z5d Z6 G d de7          Z8d!dZ9 G d de4          Z:d S )"zqBase Widget class.  Allows user to create widgets in the back-end that render
in the IPython notebook front-end.
    )contextmanager)Iterable)get_ipython)Comm)	HasTraitsUnicodeDictInstanceListIntSetBytesobservedefault	Container	Undefined)string_typesPY3)display)loadsdumps)standard_b64encode   )__protocol_version__ __jupyter_widgets_base_version__.c                    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      9lib/python3.11/site-packages/ipywidgets/widgets/widget.py
<dictcomp>z#_widget_to_json.<locals>.<dictcomp>!   )    AAAtq!?1c**AAA    c                 0    g | ]}t          |          S r   r    r#   r%   r&   s     r'   
<listcomp>z#_widget_to_json.<locals>.<listcomp>#   #    333A3''333r*   
IPY_MODEL_)
isinstancedictitemslisttupleWidgetmodel_idxr&   s    `r'   r!   r!      s    !T AAAAqwwyyAAAA	Ae}	%	% 33333333	Av		 aj((r*   c                 z   t          | t                    r fd|                                 D             S t          | t          t          f          rfd| D             S t          | t
                    rE|                     d          r0| dd          t          j        v rt          j        | dd                   S | S )Nc                 8    i | ]\  }}|t          |          S r   _json_to_widgetr"   s      r'   r(   z#_json_to_widget.<locals>.<dictcomp>+   r)   r*   c                 0    g | ]}t          |          S r   r;   r,   s     r'   r-   z#_json_to_widget.<locals>.<listcomp>-   r.   r*   r/   
   )	r0   r1   r2   r3   r4   r   
startswithr5   widgetsr7   s    `r'   r<   r<   )   s    !T AAAAqwwyyAAAA	Ae}	%	% 33333333	A|	$	$ l)C)C "##RXR`H`H`~af%%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_buffersrL   =   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)
r0   r3   r4   	enumerate_binary_typesappendr1   _separate_buffersr2   
ValueError)	substatepathrG   rH   	is_clonedir%   vnewr$   s	            r'   rQ   rQ   I   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>])
    )rQ   )rF   rG   rH   s      r'   _remove_buffersrY   v   s-     'LeRw??E,''r*   c                 
   t          |           t          |          k    rdS | |k    rdS t          | |          D ]\  }}t          rJt          |                              d          t          |                              d          k    r dS Vt          |t                    r|j        dk    r|                                }t          |t                    r|j        dk    r|                                }||k    r dS d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)lenrE   r   
memoryviewcastr0   formattobytes)abiaibs       r'   _buffer_list_equalre      s    1vvQuAvvta))  B
  	"~~""3'':b>>+>+>s+C+CCCuu D "j)) "bi3.>.>ZZ\\"j)) "bi3.>.>ZZ\\Rxxuu 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   )rh   )	traitletsrh   
get_logger)selfrh   s     r'   _log_defaultzLoggingHasTraits._log_default   s$    !!!!!!~~r*   N)__name__
__module____qualname____doc__r
   rh   r   rm   r   r*   r'   rg   rg      sQ          (#
$
$CWU^^    ^     r*   rg   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   rh   warningshowtraceback)rl   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)rw   removerP   rl   r~   r   s      r'   register_callbackz$CallbackDispatcher.register_callback   st      	,h$.00N!!(+++++ 	,HDN::N!!(+++++	, 	,::r*   NF)rn   ro   rp   rq   r   rw   r   r   r   r*   r'   rs   rs      sH        ;;I   , , , , , ,r*   rs   c                       fd}|S )z+decorator for showing tracebacks in IPythonc                     	  | 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: %sTru   )rx   r   rh   ry   rz   )rl   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-r   )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rl   s    r'   __init__zWidgetRegistry.__init__   s    r*   c                     | j                             |i           }|                    |i           }|                    |i           }|                    |i           }|                    |i           }	||	|<   dS )zRegister a valueN)r   
setdefault)
rl   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   r3   values)rl   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   r2   )rl   r   mmr   mvr   vmr   vvr   vnr   widgets                r'   r2   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)rn   ro   rp   r   r   r   r2   r   r*   r'   r   r      sU          ( ( (  "B B B B Br*   r    c                     d }t          | t                    r!ddl}|                    dt                     |S  ||           S )z?For backwards compatibility, we support @register(name) syntax.c           	          |                                  }t          j                            |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_traitsr5   widget_typesr   default_value)r   ws     r'   regzregister.<locals>.reg  sz    !!$$Q%7%E$%&=$>$L$%m$4$B$%n$5$C$%&<$=$K$%lO$A$*	, 	, 	, r*   r   NzxWidget registration using a string name has been deprecated. Widget registration now uses a plain `@register` decorator.)r0   r   warningswarnDeprecationWarning)namer   r   s      r'   r   r     sg    
 
 
 $%%   Q  Se  	f  	f  	f
s4yyr*   c                       e Zd ZdZi Z e            Zed             Ze	d             Z
e	d             Ze	d             Ze	d=d            Zd>d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d          Z ed          Z ed          d             Z  e!            Z"dZ# e$            Z% ee&d          Z' ee&d          Z( fdZ)d  Z*d! Z+ e,d"          d#             Z-e.d$             Z/d% Z0d?d&Z1d@d'Z2d( Z3d) Z4d* Z5d?d+Z6d>d,Z7d>d-Z8 fd.Z9 fd/Z:d0 Z;e<d1             Z=e<d2             Z>d3 Z?e@d4             ZAd5 ZBd6 ZCe	d7             ZDe	d8             ZEd9 ZFd?d:ZGd; ZHd< ZI xZJS )Ar5   Nc                     t          | j                                                  D ]}|                                 d S r   )r3   r@   r   close)clsr   s     r'   	close_allzWidget.close_all,  s@    3;--//00 	 	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)r5   _widget_construction_callback)r~   s    r'   on_widget_constructedzWidget.on_widget_constructed2  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)r5   r   callable)r   s    r'   _call_widget_constructedzWidget._call_widget_constructed:  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                    |d         d	         }|d
         }t
          j                             |d         |d         |d         |d         |d         |d                   } ||           }d|v rt          ||d         |d                    |                    |           dS )r   metadataversionr   r   r   z8Incompatible widget protocol versions: received version z, expected version contentdatarF   r   r   r   r   r   r   )commrG   rH   N)	r   splitPROTOCOL_VERSION_MAJORrR   r   r5   r   rL   	set_state)r   msgr   r   rF   r   r   s          r'   handle_comm_openedzWidget.handle_comm_opened@  s0    ''*b))--i<<==a $:::*pwpwpw  zN  zN  O  P  P  P9~f%W *..u_/E/45L/M/4]/C/4^/D/45K/L/4\/BD D 4(((T!!^ 4c)nEEEr*   Fc                     i }|t           j                                        }|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:
        Ndrop_defaultsr   r   )version_majorversion_minorrF   )r5   r@   r   _get_embed_stater6   )r   r@   rF   r   s       r'   get_manager_statezWidget.get_manager_stateU  sb     ?n++--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   rF   r   c                 `    g | ]+\  }}d |t          |                              d          d,S )base64ascii)encodingrT   r   )r   decode)r#   pds      r'   r-   z+Widget._get_embed_state.<locals>.<listcomp>m  s\      H  H  H %)Aq .6)*);A)>)>)E)Eg)N)N!P !P  H  H  Hr*   rH   )r   r   r   rY   	get_stater\   rE   )rl   r   rF   model_staterG   rH   s         r'   r   zWidget._get_embed_stated  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   r6   )r1   	_model_idr   s    r'   get_view_speczWidget.get_view_specs  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.zipykernel.comm.Comm)r   zThe traits which are synced.keysc                 B    d |                      d          D             S )Nc                     g | ]}|S r   r   )r#   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*   r   c                     |                     dd          | _         t          t          |           j        di | t                              |            |                                  dS )zPublic constructorr6   Nr   )popr   superr5   r   r   open)rl   r|   	__class__s     r'   r   zWidget.__init__  s`    J55$fd$..v...''---		r*   c                 .    |                                   dS )zObject disposalN)r   r   s    r'   __del__zWidget.__del__  s    

r*   c                     | j         ft          |                                           \  }}}t          d||d|dt          i          }| j        
| j        |d<   t          di || _         dS dS )z6Open a comm to the frontend if one isn't already open.Nzjupyter.widget)rF   rG   r   )target_namer   rH   r   comm_idr   )r   rY   r   r1   r   r   r   )rl   rF   rG   rH   r{   s        r'   r   zWidget.open  s    9+:4>>;K;K+L+L(E<$4',lKK '"+-A!B  D
 ~)"&.YtDIII r*   r   c                     |d         dS | j         | _        | j                            | j                   | t
          j        | j         <   dS )z Called when the comm is changed.newN)r6   r   r   on_msg_handle_msgr5   r@   )rl   changes     r'   _comm_changedzWidget._comm_changed  sI     %= F	)***(,t}%%%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   r  r   s    r'   r6   zWidget.model_id  s    
 y  r*   c                     | j         Nt          j                            | 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   r5   r@   r   r6   r   _ipython_display_r   s    r'   r   zWidget.close  sU     9 Nt}d333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.
        rK   r   update)r   rF   rG   rH   N)r   r\   _property_lockr2   rY   _send)rl   rK   rF   r   r}   rG   rH   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          | |          |           }t          s?t          ||         t                    r$t          |t                    rt          |          }|r!|                     |||         j                  s|||<   |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 NonerB   )r   r0   r   r   rR   r   trait_metadata_trait_to_jsongetattrr   r   bytesr]   _comparer   )	rl   rK   r   r   rF   r   r$   rB   r}   s	            r'   r   zWidget.get_state  s    ;9DD\** 	S5DDX&& 	SDDQRRR 	! 	!A))!Y8KLLGGGD!,,d33E *:fQi77 *Jue<T<T *"5))  !eVAY=T(U(U ! ar*   c                 B    |j         j        dk    o|j         j        dk    S )Nndarraynumpy)r   rn   ro   )rl   r8   s     r'   	_is_numpyzWidget._is_numpy  s!    {#y0VQ[5Kw5VVr*   c                     |                      |          s|                      |          rdd l}|                    ||          S ||k    S )Nr   )r  r  array_equal)rl   ra   rb   nps       r'   r  zWidget._compare  sR    >>! 	q 1 1 	>>!Q'''6Mr*   c           
      L    | 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.rA   Nr   )_lock_propertyhold_trait_notificationsr   r  _trait_from_json	set_trait)rl   	sync_datar   rA   s       r'   r   zWidget.set_state  sv   
 !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s5   BAB5BB	BB		BB B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)r  rl   r   rH   s      r'   sendz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                 >    | j                             ||           dS )a\  (Un)Register a widget displayed callback.

        Parameters
        ----------
        callback: method handler
            Must have a signature of::

                callback(widget, **kwargs)

            kwargs from display are passed through without modification.
        remove: bool
            True if the callback should be unregistered.r.  N)_display_callbacksr   r   s      r'   on_displayedzWidget.on_displayed=  s&     	11(61JJJJJr*   c                     t          t          |           j        di | |                                D ]I\  }}|                    d          r/| j                            |           |                     |           JdS )z/Dynamically add trait attributes to the Widget.r   Nr   )r   r5   
add_traitsr2   get_metadatar   rP   r  )rl   r   r   traitr   s       r'   r4  zWidget.add_traitsL  s    &fd&00000!<<>> 	& 	&KD%!!&)) &	  &&&%%%	& 	&r*   c                    |d         }| j         O| j         j        C|| j        v r:|                     |t	          | |                    r|                     |           t          t          |                               |           dS )z#Called when a property has changed.r   Nr  )	r   kernelr   _should_send_propertyr  r  r   r5   notify_change)rl   r
  r   r   s      r'   r:  zWidget.notify_changeT  s     f~9 TY%5%Aty  T%?%?gdTXFYFY%Z%Z D)))fd))&11111r*   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)r  )rl   
propertiess     r'   r$  zWidget._lock_propertyg  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_syncr  _states_to_sendclearr   s    r'   	hold_synczWidget.hold_syncv  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    r0|d         |d         k    rt          |d         |d                   rdS | j        r| j        	                    |           dS dS )z'Check the property lock (property_lock)rB   r      r   FT)
r  r  r  rY   	jsonloads	jsondumpsre   rB  rC  add)rl   rK   r}   rB   split_value
split_locks         r'   r9  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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   r  rF   rG   rH   request_stater*  z9Unknown front-end to back-end widget msg with method "%s"N)rL   r   r  _handle_custom_msgrh   error)rl   r   r   r   rF   s        r'   r	  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)r/  r+  s      r'   rO  zWidget._handle_custom_msg  s     D'733333r*   c                 "     | j         | fi | dS )z>Called when a view has been displayed for this widget instanceN)r1  )rl   r|   s     r'   _handle_displayedzWidget._handle_displayed  s#    ///////r*   c                     | S )zConvert a trait value to json.r   r8   rl   s     r'   r  zWidget._trait_to_json  	     r*   c                     | S )zConvert json values to objects.r   rU  s     r'   r&  zWidget._trait_from_json  rV  r*   c                     t          |           }t          |          dk    r|dd         dz   }d|i}| j        dd| j        d|d<   t	          |d	
           | j         | j        di | dS dS )z>Called when `IPython.display.display` is called on the widget.n   Nu   …z
text/plainr   r   r   z(application/vnd.jupyter.widget-view+jsonT)rawr   )reprr\   r   r   r   rS  )rl   r|   	plaintextr   s       r'   r  zWidget._ipython_display_  s     JJ	y>>C!$3$%/I)
 ?& "#!" N@ @D;<
 	$?&"D",,V,,,,, '&r*   c                 l    | j         *| j         j         | j                             ||           dS dS dS )z.Sends a message to the model in the front-end.N)r   rH   )r   r8  r,  )rl   r   rH   s      r'   r  zWidget._send  s@    9 TY%5%AINNWN55555 ! %A%Ar*   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   r  r  r   r0   r   r	   r   r\   )rl   r   rK   r}   r6  s        r'   r=  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                 n      j         j        }d                     fd|D                       }|d|dS )Nz, c              3   B   K   | ]}|d t          |          V  dS )=N)r  )r#   rK   rl   s     r'   	<genexpr>z-Widget._gen_repr_from_keys.<locals>.<genexpr>  sM       
 
 ssGD#.../
 
 
 
 
 
r*   ())r   rn   join)rl   r   
class_name	signatures   `   r'   r<  zWidget._gen_repr_from_keys  s[    ^,
II 
 
 
 

 
 
 
 
	 &::yyy11r*   )FNr   r   )NF)Krn   ro   rp   r   r@   r   r   classmethodr   staticmethodr   r   r   r   r   r   r   tagr   r   r   r   r   r   r   r   _view_countr
   r   r   r   r   r   r	   r  rB  r   rC  rs   r1  r/  r   r  r   r   r  propertyr6   r   r  r   r  r  r   r,  r  r2  r4  r:  r>  r   r$  rE  r9  r   r	  rO  rS  r  r&  r  r  r=  r<  __classcell__)r   s   @r'   r5   r5      sP        %)! G ">##L  [
 8 8 \8 9 9 \9
     \ ( 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[ 8)d;;;D43444DWV__9 9 _9 TVVNMceeO!"4b99X0"55N
      % % % WV__- - _- ! ! X!
* 
* 
*- - - -&   BW W W  
K 
K 
K
N 
N 
N 
NG G G GK K K K& & & & &
2 
2 
2 
2 
2; ; ; % % ^% - - ^-  * a a _a24 4 40 0 0   \   \- - -26 6 6 6
  $2 2 2 2 2 2 2r*   r5   N)r   );rq   
contextlibr   collections.abcr   ImportErrorcollectionsIPython.core.getipythonr   ipykernel.commr   rj   r   r   r	   r
   r   r   r   r   r   r   r   r   ipython_genutils.py3compatr   r   IPython.displayr   jsonr   rH  r   rI  r   r   _versionr   r   r   r   r!   r<   widget_serializationr]   	bytearrayr  rO   rL   rQ   rY   re   rg   rs   r   objectr   r   r5   r   r*   r'   <module>r|     s'    & % % % % %%((((((( % % %$$$$$$$$% 0 / / / / /                                  9 8 8 8 8 8 8 8 # # # # # # 7 7 7 7 7 7 7 7 % % % % % % M M M M M M M M3-3C88;      !  
  ,E2MM+M
& 
& 
&+ + +Z( ( (  @	  	  	  	  	 y 	  	  	 ", ", ", ", ",) ", ", ",H  &B &B &B &B &BV &B &B &BP   *[2 [2 [2 [2 [2 [2 [2 [2 [2 [2s    