
    e                        d dl Z d dlZd dlZd dlmZ d dl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 ddlmZ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(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z= dd
l>m?Z? ddl@mAZAmBZB  G d d          ZC G d deC          ZD G d deD          ZE G d deD          ZF G d deD          ZG G d deD          ZH G d deH          ZI G d deH          ZJ G d deH          ZK G d d eH          ZL G d! d"eD          ZM G d# d$eD          ZN G d% d&eC          ZO G d' d(eO          ZP G d) d*eO          ZQ G d+ d,eC          ZR G d- d.eC          ZS G d/ d0eC          ZT G d1 d2eT          ZU G d3 d4eC          ZV G d5 d6eC          ZW G d7 d8eC          ZX G d9 d:eC          ZY G d; d<eC          ZZ G d= d>eC          Z[ G d? d@e[          Z\ G dA dBe\          Z] G dC dDe\          Z^ G dE dFe\          Z_ G dG dHe_          Z` G dI dJe\          Za G dK dLe_          Zbe<jc        dM         d                    i e0eDe/eEe1eFe=eHe;eIe%eLe4eJe+eKe)eMe*eNe6eOe5ePe7eQe eTeeVe!eWe(eXe8eYe-eRe9eUe&eGe,eZe#e[e"eae.e]e$e^e'e`e2e_e3ebe:eSi           dS )N    N)defaultdict)
BoxEditToolCustomJSDataRange1dDatetimeAxisFactorRangeFreehandDrawToolPointDrawToolPolyDrawToolPolyEditToolRange1d)
set_curdocstate   )CallbackError)datetime_typesdimension_sanitizer
dt64_to_dtisequal)Table)BoundsXBoundsXYBoundsYBoxEdit	CDSStream	CurveEdit	DoubleTapDrawFreehandDrawLasso
MouseEnter
MouseLeavePanEnd	PlotResetPlotSize	PointDrawPointerX	PointerXYPointerYPolyDrawPolyEditPressUpRangeXRangeXYRangeYSelection1DSelectionXY
SelectMode	SingleTapStreamTap)warn   )bokeh33convert_timestampc                       e Zd ZdZi Zg Zg Zg Zg Zg Z	g Z
i Zg Z e            Zd Zd Zd Zd Zd Zd Zd Zd	 Zd
 Zedd            Zd Zd Zd Zd Zd ZddZd Z d Z!ddZ"dS )CallbackaQ
  
    Provides a baseclass to define callbacks, which return data from
    bokeh model callbacks, events and attribute changes. The callback
    then makes this data available to any streams attached to it.

    The definition of a callback consists of a number of components:

    * models      : Defines which bokeh models the callback will be
                    attached on referencing the model by its key in
                    the plots handles, e.g. this could be the x_range,
                    y_range, plot, a plotting tool or any other
                    bokeh mode.

    * attributes  : The attributes define which attributes to send
                    back to Python. They are defined as a dictionary
                    mapping between the name under which the variable
                    is made available to Python and the specification
                    of the attribute. The specification should start
                    with the variable name that is to be accessed and
                    the location of the attribute separated by
                    periods.  All models defined by the models and can
                    be addressed in this way, e.g. to get the start of
                    the x_range as 'x' you can supply {'x':
                    'x_range.attributes.start'}. Additionally certain
                    handles additionally make the cb_obj variables
                    available containing additional information about
                    the event.

    * on_events   : If the Callback should listen to bokeh events this
                    should declare the types of event as a list (optional)

    * on_changes  : If the Callback should listen to model attribute
                    changes on the defined ``models`` (optional)

    If either on_events or on_changes are declared the Callback will
    be registered using the on_event or on_change machinery, otherwise
    it will be treated as a regular callback on the model.  The
    callback can also define a _process_msg method, which can modify
    the data sent by the callback before it is passed to the streams.

    A callback supports three different throttling modes:

    - adaptive (default): The callback adapts the throttling timeout
      depending on the rolling mean of the time taken to process each
      message. The rolling window is controlled by the `adaptive_window`
      value.
    - throttle: Uses the fixed `throttle_timeout` as the minimum amount
      of time between events.
    - debounce: Processes the message only when no new event has been
      received within the `throttle_timeout` duration.
    c                     || _         || _        || _        t          t                    | _        |                                  d| _        d | _        d S )NF)	plotstreamssourcer   dict
handle_idsreset_active	_prev_msg)selfr=   r>   r?   paramss        Blib/python3.11/site-packages/holoviews/plotting/bokeh/callbacks.py__init__zCallback.__init__   sE    	%d++

    c                 2    | j         D ]} |||           }|S N)_transforms)rE   msg	transforms      rG   
_transformzCallback._transform   s,    ) 	' 	'I)C&&CC
rI   c                 ,    |                      |          S )zn
        Subclassable method to preprocess JSON message in callback
        before passing to stream.
        rO   rE   rM   s     rG   _process_msgzCallback._process_msg   s    
 s###rI   c                                                         d  _        d  _        d  _        g  _         fdt
          j                                        D             t
          _        d S )Nc                 $    i | ]\  }}|u	||S  rV   ).0kcbrE   s      rG   
<dictcomp>z$Callback.cleanup.<locals>.<dictcomp>   s/     2 2 2B"$D..  !""0..rI   )rB   rA   r=   r?   r>   r;   
_callbacksitems)rE   s   `rG   cleanupzCallback.cleanup   sk    

	2 2 2 2(2E2K2K2M2M 2 2 2rI   c                    | j         rq|                                 }| j        D ]U}||vr||         }t          |          t          t	          |                     f}| j                            |d            Vi | _        g | _        d S rK   )	rA   _init_plot_handlesmodelsidtyper[   popplot_handles_queue)rE   handleshandle_namehandlecb_hashs        rG   rB   zCallback.reset   s    ? 	3--//G#{ 3 3g-- -f::r$t**~~6##GT2222rI   c                     i }|                                 D ]9\  }}t          |t                    rd|v r|d         |v r|d         ||<   4|||<   :|S )z
        Filter event values that do not originate from the plotting
        handles associated with a particular stream using their
        ids to match them.
        ra   value)r\   
isinstancer@   )rE   rM   idsfiltered_msgrX   vs         rG   _filter_msgzCallback._filter_msg   sj     IIKK 	$ 	$DAq!T"" $tqyyT7c>>&'jLO"#QrI   c                 ~    g } j         D ]} j        |         }t          |                                          }                     ||          }                     |          }|s^ |j        di |  fd|                                D             |_        |	                    |           	 t           j        j                  5  t          j        |           d d d            n# 1 swxY w Y   n# t          $ r} j        j        rt j        j        j        d         t$          j        v rQt$          j         j        j        j        d                  \  }	}
|	                    dt)          |          id           n|Y d }~nd }~wt*          $ r}|d }~ww xY w|D ]	}i |_        
d S # |D ]	}i |_        
w xY w)Nc                 ,    i | ]\  }}||j         d S ))ra   events)	on_events)rW   hhidrE   s      rG   rZ   z#Callback.on_msg.<locals>.<dictcomp>   s?      B  B  B$*As !"##H#H  B  B  BrI   ra   z	text/htmlT)rawrV   )r>   rA   listvaluesrp   rS   updater\   	_metadataappendr   r=   documentr4   triggerr   rootrefr   _handlesstr	Exception)rE   rM   r>   streamrA   rm   rn   processed_msgerh   _s   `          rG   on_msgzCallback.on_msg   sX   l 
	# 
	#F0Jz((**++C++C55L --l;;M  FM**M*** B  B  B  B.8.>.>.@.@ B  B  BFNN6""""	&DI.// ( (w'''( ( ( ( ( ( ( ( ( ( ( ( ( ( ( 	 	 	y~ $)."4T":en"L"L!N49>+=d+CD	{CFF3>>>> ?>>>>  	 	 	G	 " & &#%  & &' & &#%  &sa   2C8 C, C8 ,C00C8 3C04C8 7F. 8
FBF	F. 	FFFF. .F<c                    | j         g}| j         j        r.|t          | j         j                                                  z  }i }|D ]&}|j                                        D ]
\  }}|||<   '|| _        i }| j        | j        z   D ]}|| j        v r||         ||<   | j	        
                    |                     |                     |S )z
        Find all requested plotting handles and cache them along
        with the IDs of the models the callbacks will be attached to.
        )r=   subplotsrx   ry   rf   r\   rd   r`   extra_handlesrA   rz   _get_stream_handle_ids)rE   plotsrf   r=   rX   ro   	requestedru   s           rG   r_   zCallback._init_plot_handles   s    
 9 	7T$),3355666E 	 	D**,,  1

#	T// 	* 	*AD%%%&qz	!t::9EEFFFrI   c                     t          t                    }| j        D ]6}| j        | j        z   D ]$}||v r||         j        d         }|||         |<   %7|S )z
        Gather the ids of the plotting handles attached to this callback
        This allows checking that a stream is not given the state
        of a plotting handle it wasn't attached to
        ra   )r   r@   r>   r`   r   r   )rE   rf   stream_handle_idsr   ru   	handle_ids         rG   r   zCallback._get_stream_handle_ids   ss     (--l 	= 	=F[!33 = =<< '
t 4I3<%f-a0= ! rI   Nc                 "   |st          d| d          ||}|                    d          }|}|dd         D ]E}|dk    r	t          |t                    r|                    |          }4t          ||d          }F|j        d         |dS )	z
        Resolves a Callback attribute specification looking the
        corresponding attribute up on the cb_obj, which should be a
        bokeh model. If not model is supplied cb_obj is assumed to
        be the same as the model.
        zBokeh plot attribute z could not be foundN.r7   
attributesra   )ra   rk   )AttributeErrorsplitrl   r@   getgetattrr   )clsspeccb_objmodelresolvedps         rG   resolve_attr_speczCallback.resolve_attr_spec  s      	T !R!R!R!RSSS=Ezz#abb 	6 	6AL  (D)) 6#<<??"8Q55io999rI   c                 D    t          fd| j        D                       S )Nc              3   .   K   | ]} |          V  d S rK   rV   )rW   skipevents     rG   	<genexpr>z&Callback.skip_event.<locals>.<genexpr>  s+      <<444;;<<<<<<rI   )anyskip_events)rE   r   s    `rG   
skip_eventzCallback.skip_event  s)    <<<<4+;<<<<<<rI   c                 D    t          fd| j        D                       S )Nc              3   .   K   | ]} |          V  d S rK   rV   )rW   r   rM   s     rG   r   z'Callback.skip_change.<locals>.<genexpr>!  s+      ;;4499;;;;;;rI   )r   skip_changesrR   s    `rG   skip_changezCallback.skip_change   s)    ;;;;):;;;;;;rI   c                     dt           j        vrdS ddlm}  |t                     5  |t           _        ddd           dS # 1 swxY w Y   dS )z8
        Sets panel.state to busy if available.
        busyNr   )edit_readonly)r   param
panel.utilr   r   )rE   r   r   s      rG   	_set_busyzCallback._set_busy#  s     $$F,,,,,,]5!! 	 	EJ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   AAAc                   K   | j                             |||t          j                    f           | j        s| j        j        rd| _        |                     d           t          j        | 	                                          }| j
                            |           |                    | j
        j                   dS dS dS )z
        Process change events adding timeout to process multiple concerted
        value change at once rather than firing off multiple plot updates.
        TN)re   r|   timerC   r=   r}   r   asynciocreate_taskprocess_on_change_background_taskaddadd_done_callbackdiscard)rE   attroldnewtasks        rG   	on_changezCallback.on_change.  s      
 	D#sDIKK8999| 	B	 2 	BDLNN4   &t'='='?'?@@D!%%d+++""4#8#@AAAAA	B 	B 	B 	BrI   c                   K   | j                             |t          j                    f           | j        s| j        j        rd| _        |                     d           t          j        | 	                                          }| j
                            |           |                    | j
        j                   dS dS dS )z
        Process bokeh UIEvents adding timeout to process multiple concerted
        value change at once rather than firing off multiple plot updates.
        TN)re   r|   r   rC   r=   r}   r   r   r   process_on_eventr   r   r   r   )rE   r   r   s      rG   on_eventzCallback.on_event;  s      
 	E49;;/000| 	B	 2 	BDLNN4   &t'<'<'>'>??D!%%d+++""4#8#@AAAAA	B 	B 	B 	BrI   c                   K   t          j        d           d{V  | j        sd| _        |                     d           dS t          t          d | j        D                                                                 }g | _        |D ]}|                     |          ri }| j	        
                                D ]D\  }}| j                            | j        d                   }|                     |||          ||<   E|                     |           t          j        |                                           }| j                            |           |                    | j        j                   dS )zU
        Trigger callback change event and triggering corresponding streams.
        {Gz?NFc                 &    g | ]\  }}|j         |fS rV   )
event_name)rW   r   dts      rG   
<listcomp>z-Callback.process_on_event.<locals>.<listcomp>S  s:     A A A'0ub #-u5 A A ArI   r   )r   sleepre   rC   r   rx   r@   ry   r   r   r\   rd   r   r`   r   r   r   r   r   r   r   r   )	rE   timeoutrs   r   rM   r   path	model_objr   s	            rG   r   zCallback.process_on_eventH  s      mD!!!!!!!!!{ 	 DLNN5!!!F d A A48KA A A B BBH&((L L  	 	Eu%% C"o3355 K K
d -11$+a.AA	 224	JJD		KK"4#8#8#:#:;;!!$'''t4<=====rI   c                   K   t          j        d           d {V  | j        sd| _        |                     d           d S g | _        i }| j                                        D ]\  }}|                    d          }|d         dk    r;| j        d         }d	                    | j        d d         |dd          z             }n|d         }| j
                            |          }	 |                     ||          ||<   # t          $ r6 t          j        d           d {V  |                     ||          ||<   Y w xY w|                     |          rd}nt          || j                  }|rt#          d	 | j        D                       r|                     |           || _        t          j        |                                           }| j                            |           |                    | j        j                   d S )
Nr   Fr   r   r   r7   g?Tc              3   $   K   | ]}|j         V  d S rK   )	transientrW   ss     rG   r   z-Callback.process_on_change.<locals>.<genexpr>  s$      >>AAK>>>>>>rI   )r   r   re   rC   r   r   r\   r   r`   joinrd   r   r   r   r   r   rD   r   r>   r   r   r   r   r   r   r   )	rE   rM   r   r   	attr_path
obj_handler   equalr   s	            rG   r   zCallback.process_on_changed  s6     mD!!!!!!!!!{ 	 DLNN5!!!F///11 	A 	AJD$

3I|x''![^
xxBQB	!"" =>>&q\
&**:66FA 224@@D		 A A A mD))))))))) 224@@D				A C   	1EEC00E 	!>>>>>>> 	!KK DN"4#9#9#;#;<<!!$'''t4<=====s   (D=EEc                       j         r% fd} j         D ]}|                    ||            j        r* fd} j        D ]}|dv r|                    ||           dS dS )zH
        Set up on_change events for bokeh server interactions.
        c                 R    t          j                            |                     S rK   )r   r   r   )r   rE   s    rG   <lambda>z'Callback.set_callback.<locals>.<lambda>  s"    #DMM%$8$899 rI   c                 V    t          j                            | ||                    S rK   )r   r   r   )r   r   r   rE   s      rG   r   z'Callback.set_callback.<locals>.<lambda>  s&    #DNN4c$B$BCC rI   )patching	streamingN)rt   r   
on_changesr   )rE   rh   event_handlerr   change_handlerchanges   `     rG   set_callbackzCallback.set_callback  s     > 	6   M  6 6}5555? 	9   N / 9 9666  8888	9 	99 9rI   c                 P   |                                  }g g }}| j        | j        z   D ]}||vrF|t          | j                  j        t          |           j        f}t           dj        |            L||         }|| j        vr|                    |           |                    |           d |D             }t          |          t          t          |                     fz   }	|	| j        v r| j        |	         }
t          t          |
j        | j        z                       |
_        | j                                        D ]%\  }}|
j        |                             |           &|                                  d S |D ]}|                     |           | | j        |	<   d S )Nz4{} handle not found on {}, cannot attach {} callbackc                 ,    g | ]}t          |          S rV   )ra   )rW   ru   s     rG   r   z'Callback.initialize.<locals>.<listcomp>  s    000aBqEE000rI   )r_   r`   r   rb   r=   __name__printformatr|   tuplera   r[   rx   setr>   rA   r\   rz   r]   r   )rE   plot_idrf   hash_handles
cb_handlesrg   	warn_argsrh   hash_idsri   rY   rX   ro   s                rG   
initializezCallback.initialize  s   ))++#%rj;t'99 
	( 
	(K'))($ty//*B!$ZZ02	 2 ++19> ? ? ?[)F$"444!!&)))'''' 10<000//2d4jj>>"33do%%)Bc"*T\"9::;;BJ--// + +1a ''****LLNNNF  	& 	&Ff%%%%#'   rI   rK   )#r   
__module____qualname____doc__r   r`   r   r   r   rt   r   r[   rL   r   r   rH   rO   rS   r]   rB   rp   r   r_   r   classmethodr   r   r   r   r   r   r   r   r   r   rV   rI   rG   r;   r;   =   s       2 2j J F M KL I J JK suu    
$ $ $2 2 2
 
 
  & & &:  ,! ! ! : : : [:,= = =< < <	 	 	B B BB B B> > > >8$> $> $>L9 9 9(( ( ( ( ( (rI   r;   c                   4    e Zd ZdZdddZdgZdgZd Zd Zd	S )
PointerXYCallback<
    Returns the mouse x/y-position on mousemove event.
    cb_obj.xcb_obj.y)xyr=   	mousemovec                    t          |t          j                  rt          |          }t          |t          t
          f          rt          |          }t          |t          t
          f          rt          |          }||}}t          |t          j                  rt          |          }t          |t          j                  rt          |          }n|||}}}||k     r|}n||k    r|}|S )zClips out of bounds valuesrl   np
datetime64r   intfloatr9   rE   rk   startendro   r   r   s          rG   _process_out_of_boundsz(PointerXYCallback._process_out_of_bounds  s    eR]++ 	(5!!A%#u.. 1)%00#U|,, -',,#qA!R]++ "qMM!R]++ "qMMUC!qAq55EEUUErI   c                    | j         j                            d          }| j         j                            d          }| j         j                            d          }| j         j                            d          }d|v r-t          |t                    rt          |d                   |d<   d|v r-t          |t                    rt          |d                   |d<   t          |t                    rSt          |                    d          t          t          f          r$|j	        t          |d                            |d<   n_d|v r[t          |t          t          f          r?|j        |j        }}||k    r||}}|                     |d         ||          }|i }n||d<   t          |t                    rSt          |                    d          t          t          f          r$|j	        t          |d                            |d<   n_d|v r[t          |t          t          f          r?|j        |j        }
}	|	|
k    r|
|	}
}	|                     |d         |	|
          }|i }n||d<   |                     |          S )Nx_rangey_rangexaxisyaxisr   r   )r=   rf   r   rl   r   r9   r   r   r   factorsr   r   r  r  r  rO   )rE   rM   r  r  r  r  xstartxendr   ystartyendr   s               rG   rS   zPointerXYCallback._process_msg  s<   )#''	22)#''	22	!%%g..	!%%g..#::*UL99:(S22CH#::*UL99:(S22CHg{++ 
	
3773<<#u0V0V 
	s3s8}}5CHHCZZJw+0FGGZ"='+DF}}#V++CHfdCCAyCg{++ 
	
3773<<#u0V0V 
	s3s8}}5CHHCZZJw+0FGGZ"='+DF}}#V++CHfdCCAyCs###rI   N)	r   r   r   r   r   r`   rt   r  rS   rV   rI   rG   r   r     sY          "
33JXFI  .#$ #$ #$ #$ #$rI   r   c                       e Zd ZdZddiZdS )PointerXCallbackz:
    Returns the mouse x-position on mousemove event.
    r   r   Nr   r   r   r   r   rV   rI   rG   r  r    $          z"JJJrI   r  c                       e Zd ZdZddiZdS )PointerYCallbackr   r   r   Nr  rV   rI   rG   r  r    r  rI   r  c                   >     e Zd Zg dZdgZddddZ fdZd Z xZS )	DrawCallback)panpanstartpanendr=   r   r   zcb_obj.event_name)r   r   r   c                 H    d| _          t                      j        |i | d S Nr   )stroke_countsuperrH   )rE   argskwargs	__class__s      rG   rH   zDrawCallback.__init__  s-    $)&)))))rI   c                     |                     d          }|dk    r| xj        dz  c_        |                     t          || j                            S )Nr   r  r7   )r  )rc   r  rO   r@   )rE   rM   r   s      rG   rS   zDrawCallback._process_msg  sT      H"tCd6GHHHIIIrI   )	r   r   r   rt   r`   r   rH   rS   __classcell__r  s   @rG   r  r    sp        ---IXF!
=PQQJ* * * * *J J J J J J JrI   r  c                        e Zd ZdZddgZd ZdS )TapCallbackz
    Returns the mouse x/y-position on tap event.

    Note: As of bokeh 0.12.5, there is no way to distinguish the
    individual tap events within a doubletap event.
    tap	doubletapc                    t          |t          j                  rt          |          }t          |t          t
          f          rt          |          }t          |t          t
          f          rt          |          }||}}t          |t          j                  rt          |          }t          |t          j                  rt          |          }n|||}}}||k     s||k    rd}|S )z!Sets out of bounds values to NoneNr   r   s          rG   r  z"TapCallback._process_out_of_bounds/  s    eR]++ 	(5!!A%#u.. 1)%00#U|,, -',,#qA!R]++ "qMM!R]++ "qMMUC!qAq55AEEErI   N)r   r   r   r   rt   r  rV   rI   rG   r$  r$  %  s9          $I    rI   r$  c                       e Zd ZdZdgZdS )SingleTapCallbackz6
    Returns the mouse x/y-position on tap event.
    r%  Nr   r   r   r   rt   rV   rI   rG   r)  r)  D  s!          IIIrI   r)  c                       e Zd ZdZdgZdS )PressUpCallbackzB
    Returns the mouse x/y-position of a pressup mouse event.
    pressupNr*  rV   rI   rG   r,  r,  L  s!          IIIrI   r,  c                       e Zd ZdZdgZdS )PanEndCallbackz<
    Returns the mouse x/y-position of a pan end event.
    r  Nr*  rV   rI   rG   r/  r/  T  s!          
IIIrI   r/  c                       e Zd ZdZdgZdS )DoubleTapCallbackz<
    Returns the mouse x/y-position on doubletap event.
    r&  Nr*  rV   rI   rG   r1  r1  \  s!          IIIrI   r1  c                       e Zd ZdZdgZdS )MouseEnterCallbackzi
    Returns the mouse x/y-position on mouseenter event, i.e. when
    mouse enters the plot canvas.
    
mouseenterNr*  rV   rI   rG   r3  r3  d  !         
 IIIrI   r3  c                       e Zd ZdZdgZdS )MouseLeaveCallbackzi
    Returns the mouse x/y-position on mouseleave event, i.e. when
    mouse leaves the plot canvas.
    
mouseleaveNr*  rV   rI   rG   r7  r7  m  r5  rI   r7  c                   :    e Zd ZdZdgZdgZddgZdddd	d
Zd ZdS )RangeXYCallbackz0
    Returns the x/y-axis ranges of a plot.
    rangesupdater=   r  r  	cb_obj.x0	cb_obj.y0	cb_obj.x1	cb_obj.y1x0y0x1y1c                    | j         j        j        | j         j        d         ur'| j         j        d         }|j        |j        c|d<   |d<   | j         j        j        | j         j        d         ur'| j         j        d         }|j        |j        c|d<   |d<   i }d|v rd|v r|d         |d         }}t          | j         j                            d          t                    rHt          |t                    st          |          }t          |t                    st          |          }||k    r||}}||f|d<   d|v rd|v r|d         |d         }}t          | j         j                            d          t                    rHt          |t                    st          |          }t          |t                    st          |          }||k    r||}}||f|d<   |                     |          S )	Nr  rA  rC  r  rB  rD  r  r  )r=   r   r  rf   r  r  r  rl   r   r   r   r9   rO   )	rE   rM   r  r  datarA  rC  rB  rD  s	            rG   rS   zRangeXYCallback._process_msg  s   9?"$)*;I*FFFi'	2G#*='+ CIs4y9?"$)*;I*FFFi'	2G#*='+ CIs4y3;;43;;YD	B$)+//88,GG /!"n55 /*2..B!"n55 /*2..BBwwRB!2hDO3;;43;;YD	B$)+//88,GG /!"n55 /*2..B!"n55 /*2..BBwwRB!2hDOt$$$rI   N)	r   r   r   r   rt   r`   r   r   rS   rV   rI   rG   r:  r:  v  sb            IXF	*M 	 J% % % % %rI   r:  c                   (    e Zd ZdZdgZdgZdddZdS )RangeXCallbackz-
    Returns the x-axis range of a plot.
    r;  r=   r<  r>  rA  rC  Nr   r   r   r   rt   r`   r   rV   rI   rG   rH  rH    =            IXF  JJJrI   rH  c                   (    e Zd ZdZdgZdgZdddZdS )RangeYCallbackz-
    Returns the y-axis range of a plot.
    r;  r=   r=  r?  rB  rD  NrJ  rV   rI   rG   rM  rM    rK  rI   rM  c                   0    e Zd ZdZdgZdddZddgZd Zd	S )
PlotSizeCallbackz`
    Returns the actual width and height of a plot once the layout
    solver has executed.
    r=   zcb_obj.inner_widthzcb_obj.inner_height)widthheightinner_widthinner_heightc                     |                     d          r*|                     d          r|                     |          S i S )NrQ  rR  )r   rO   rR   s     rG   rS   zPlotSizeCallback._process_msg  s@    777 	 1 1 	??3'''IrI   N)r   r   r   r   r`   r   r   rS   rV   rI   rG   rP  rP    sR         
 XF/13 3J0J    rI   rP  c                   ,    e Zd ZdddZddgZdgZd ZdS )	SelectModeCallbackzbox_select.modezlasso_select.mode)box_mode
lasso_mode
box_selectlasso_selectmodec                     | j         d         }d|v r%|                    d          }||j        k    r||d<   d|v r%|                    d          }||j        k    r||d<   |S )Nr   rX  r\  rY  )r>   rc   r\  )rE   rM   r   r\  s       rG   rS   zSelectModeCallback._process_msg  sv    a77:&&Dv{"""F377<((Dv{"""F
rI   N)r   r   r   r   r`   r   rS   rV   rI   rG   rW  rW    sF        / 35 5JN+FJ
 
 
 
 
rI   rW  c                   >    e Zd ZdZdddddZdgZdgZd	 d
 gZd ZdS )BoundsCallbackz2
    Returns the bounds of a box_select tool.
    cb_obj.geometry.x0cb_obj.geometry.x1cb_obj.geometry.y0cb_obj.geometry.y1)rA  rC  rB  rD  r=   selectiongeometryc                 $    | j         d         dk    S Nrb   rectgeometryr   s    rG   r   zBoundsCallback.<lambda>      !76!A rI   c                     | j          S rK   finalrj  s    rG   r   zBoundsCallback.<lambda>  
    U[ rI   c                 0   t          fddD                       rt          | j        j                            d          t
                    r0t          d                   d<   t          d                   d<   t          | j        j                            d          t
                    r0t          d                   d<   t          d                   d<   d	d         d         d         d         fi|                               S i S )
Nc              3       K   | ]}|v V  	d S rK   rV   rW   crM   s     rG   r   z.BoundsCallback._process_msg.<locals>.<genexpr>  s'      ::AqCx::::::rI   r@  r  rA  rC  r  rB  rD  boundsallrl   r=   rf   r   r   r9   rO   rR   s    `rG   rS   zBoundsCallback._process_msg  s   ::::!9::::: 
	$)+//88,GG 9-c$i88D	-c$i88D	$)+//88,GG 9-c$i88D	-c$i88D	c$iTCIs4yIJC??3'''IrI   N	r   r   r   r   r   r`   rt   r   rS   rV   rI   rG   r_  r_    sk          -,,,. .J XF$%IAA002K    rI   r_  c                   "     e Zd ZdZ fdZ xZS )SelectionXYCallbackzc
    Converts a bounds selection to numeric or categorical x-range
    and y-range selections.
    c                 D   t                                          |          }d|vr|S | j        j        }|d         \  }}}}| j        j        d         }t          |t                    r t          t          |                    t          t          |                    }}|j	        ||         }|j
        r|j
        d         r|                    |j
        d         d         d                   }	|	rqt          |d          ra|j                            ||	          }
	 t          t!          j        |                              |
                    }n# t&          $ r Y nw xY w||d<   n||f|d<   | j        j        d         }t          |t                    r t          t          |                    t          t          |                    }}|j	        ||         }|j
        r|j
        d         r|                    |j
        d         d         d                   }|rqt          |d          ra|j                            ||          }
	 t          t!          j        |                              |
                    }n# t&          $ r Y nw xY w||d<   n||f|d<   |S )Nrt  r  r   	interfacex_selectionr  y_selection)r  rS   r=   current_framerf   rl   r   r   roundr	  tagsget_dimensionhasattrr{  dtyperx   r   arrayastyper   )rE   rM   elrA  rB  rC  rD  r  xfactorsxdimr  r  yfactorsydimr  s                 rG   rS   z SelectionXYCallback._process_msg  s   gg""3''3JY$XBB)#I.g{++ 	*r^^Sr^^Br2v.H| Q ''Q(:1(=>> GB44 L..r488E#'(:(:(A(A%(H(H#I#I$   !)C"$bC)#I.g{++ 	*r^^Sr^^Br2v.H| Q ''Q(:1(=>> GB44 L..r488E#'(:(:(A(A%(H(H#I#I$   !)C"$bC
s$   4E 
E! E!4J 
JJ)r   r   r   r   rS   r!  r"  s   @rG   ry  ry    sB         
$ $ $ $ $ $ $ $ $rI   ry  c                   :    e Zd ZdZdddZdgZdgZd d gZd	 Zd
S )BoundsXCallbackz3
    Returns the bounds of a xbox_select tool.
    r`  ra  rI  r=   rd  c                 $    | j         d         dk    S rf  rh  rj  s    rG   r   zBoundsXCallback.<lambda>=  rk  rI   c                     | j          S rK   rm  rj  s    rG   r   zBoundsXCallback.<lambda>>  ro  rI   c                 P   t          fddD                       rt          | j        j                            d          t
                    r0t          d                   d<   t          d                   d<   dd         d         fi|                               S i S )Nc              3       K   | ]}|v V  	d S rK   rV   rr  s     rG   r   z/BoundsXCallback._process_msg.<locals>.<genexpr>A  '      ..AqCx......rI   rI  r  rA  rC  boundsxru  rR   s    `rG   rS   zBoundsXCallback._process_msg@      ......... 	$)+//88,GG 9-c$i88D	-c$i88D	s4y#d)45C??3'''IrI   Nrw  rV   rI   rG   r  r  4  _          -4HIIJXF$%IAA002K    rI   r  c                   :    e Zd ZdZdddZdgZdgZd d gZd	 Zd
S )BoundsYCallbackz3
    Returns the bounds of a ybox_select tool.
    rb  rc  rN  r=   rd  c                 $    | j         d         dk    S rf  rh  rj  s    rG   r   zBoundsYCallback.<lambda>T  rk  rI   c                     | j          S rK   rm  rj  s    rG   r   zBoundsYCallback.<lambda>U  ro  rI   c                 P   t          fddD                       rt          | j        j                            d          t
                    r0t          d                   d<   t          d                   d<   dd         d         fi|                               S i S )Nc              3       K   | ]}|v V  	d S rK   rV   rr  s     rG   r   z/BoundsYCallback._process_msg.<locals>.<genexpr>X  r  rI   rN  r  rB  rD  boundsyru  rR   s    `rG   rS   zBoundsYCallback._process_msgW  r  rI   Nrw  rV   rI   rG   r  r  K  r  rI   r  c                   6    e Zd ZdddZdgZdgZd d gZd Zd	S )
LassoCallbackzcb_obj.geometry.xzcb_obj.geometry.yxsysr=   rd  c                 $    | j         d         dk    S )Nrb   polyrh  rj  s    rG   r   zLassoCallback.<lambda>g  rk  rI   c                     | j          S rK   rm  rj  s    rG   r   zLassoCallback.<lambda>h  ro  rI   c                    t          fddD                       si S d         d         }}t          |t                    r7d |                                D             }d t	          |          D             }t          |t                    r7d |                                D             }d t	          |          D             }||i S d	t          j        ||g          iS )
Nc              3       K   | ]}|v V  	d S rK   rV   rr  s     rG   r   z-LassoCallback._process_msg.<locals>.<genexpr>k  s'      2218222222rI   r  r  r  c              3   >   K   | ]\  }}t          |          |fV  d S rK   r   )rW   ir   s      rG   r   z-LassoCallback._process_msg.<locals>.<genexpr>o  0      55$!Q3q661+555555rI   c                     g | ]\  }}|S rV   rV   )rW   r   r   s      rG   r   z.LassoCallback._process_msg.<locals>.<listcomp>p      +++1!+++rI   c              3   >   K   | ]\  }}t          |          |fV  d S rK   r  )rW   r  r   s      rG   r   z-LassoCallback._process_msg.<locals>.<genexpr>r  r  rI   c                     g | ]\  }}|S rV   rV   )rW   r   r   s      rG   r   z.LassoCallback._process_msg.<locals>.<listcomp>s  r  rI   ri  )rv  rl   r@   r\   sortedr   column_stack)rE   rM   r  r  s    `  rG   rS   zLassoCallback._process_msgj  s    2222\22222 	ITCIBb$ 	,55"((**555B++r

+++Bb$ 	,55"((**555B++r

+++B:IBORH5566rI   N)r   r   r   r   r`   rt   r   rS   rV   rI   rG   r  r  b  sS        +3FGGJXF$%IAA002K7 7 7 7 7rI   r  c                   ,    e Zd ZdZddiZdgZdgZd ZdS )Selection1DCallbackz>
    Returns the current selection on a ColumnDataSource.
    indexzcb_obj.indicesselectedindicesc                 @   | j         j        }d|v rdd |d         D             i}t          |t                    rO|j                            d          j                            d          }|t          |          |d         k    ri S |                     |          S i S )Nr  c                 ,    g | ]}t          |          S rV   r  rW   ro   s     rG   r   z4Selection1DCallback._process_msg.<locals>.<listcomp>  s    :::SVV:::rI   r=   r  )	r=   r~  rl   r   optsr   r  rx   rO   )rE   rM   r  sels       rG   rS   z Selection1DCallback._process_msg  s    Y$c>>::S\:::;C"e$$  gkk&))044Z@@?tCyyCL'@'@I??3'''IrI   N)r   r   r   r   r   r`   r   rS   rV   rI   rG   r  r  y  sH          +,J\FJ    rI   r  c                   $    e Zd ZdZdgZdgZd ZdS )ResetCallbackzB
    Signals the Reset stream if an event has been triggered.
    r=   rB   c                 4    ddi}|                      |          S )N	resettingTrQ   rR   s     rG   rS   zResetCallback._process_msg  s    D!s###rI   N)r   r   r   r   r`   rt   rS   rV   rI   rG   r  r    s=          XF	I$ $ $ $ $rI   r  c                   @     e Zd ZdZddiZdgZddgZd	 fd	Zd Z xZ	S )
CDSCallbackzb
    A Stream callback that syncs the data on a bokeh ColumnDataSource
    model with Python.
    rF  zsource.datar?   r   Nc                     t                                          |           | j        }|                     d|j        d         j        i          d         }| j        D ]}|                    |           d S )NrF  r?   rF  )r  r   r=   rS   rf   rF  r>   rz   )rE   r   r=   rF  r   r  s        rG   r   zCDSCallback.initialize  s{    7###y  &$,x*@*E!FGGOl 	% 	%FMMtM$$$$	% 	%rI   c                    d|vri S t          |d                   |d<   |d                                         D ]\  }}t          |t                     r|                    dd           }|                    dd           }|                    dd            t	          d |                                D                       }d |D             }|)t          j        ||                              |          }nt          |t                    r|rt          |d         t                     rg }|D ]}t          |t                     r|                    dd           }|                    dd           }|                    dd            t	          d	 |                                D                       }d
 |D             }|)t          j        ||                              |          }|	                    |           |}nt          d |D                       rd |D             }nt          |t                    rt          |          dk    r|d         dv rt          |d         t                    rtt          j        |d                                                   }	t          j        |d                                       |d                   }t          j        |	|          }||d         |<   |                     |          S )NrF  shaper  	dimensionc                 6    g | ]\  }}t          |          |fS rV   r  rW   rX   ro   s      rG   r   z,CDSCallback._process_msg.<locals>.<listcomp>  s&    GGG1QGGGrI   c                     g | ]\  }}|S rV   rV   r  s      rG   r   z,CDSCallback._process_msg.<locals>.<listcomp>  s    ...1!...rI   )r  r   c                 6    g | ]\  }}t          |          |fS rV   r  r  s      rG   r   z,CDSCallback._process_msg.<locals>.<listcomp>  s&    &L&L&Ltq!A{&L&L&LrI   c                     g | ]\  }}|S rV   rV   r  s      rG   r   z,CDSCallback._process_msg.<locals>.<listcomp>  s    333da333rI   c              3   N   K   | ] }t          |t          t          f          V  !d S rK   )rl   r   r   r  s     rG   r   z+CDSCallback._process_msg.<locals>.<genexpr>  s0      AAQZC<00AAAAAArI   c                 .    g | ]}|t           j        n|S rK   )r   nanr  s     rG   r   z,CDSCallback._process_msg.<locals>.<listcomp>  s"    EEEAI"&&1EEErI         )biglittler   r7   )r@   r\   rl   rc   r  r   r  reshaperx   r|   r   lenbase64decodebytesencoder  newbyteorder
frombufferrO   )
rE   rM   colry   r  r  r\   
new_valuesvalsbuffers
             rG   rS   zCDSCallback._process_msg  s   I3v;''Fv;,,.. %	& %	&KC&$'' #6

7D11

7D11

;---GGGGGHH.....$XfE:::BB5IIFFD)) 6f 6F1It9T9T 6
" 	, 	,D!$-- N $$ 7 7 $$ 7 7d333%&L&Ltzz||&L&L&LMM33d333 ,#%8D#>#>#>#F#Fu#M#MD%%d++++#AA&AAAAA 6EEfEEE64((6KK1$$1I!222vay$// 3  +F1I,<,<,>,>??++88CCvu55%CKs###rI   rK   )
r   r   r   r   r   r`   r   r   rS   r!  r"  s   @rG   r  r    ss         
 -(JZF*%J% % % % % %*$ *$ *$ *$ *$ *$ *$rI   r  c                       e Zd ZdZd Zd ZdS )GlyphDrawCallbacka  
      var types = Bokeh.require("core/util/types");
      var changed = false
      for (var i = 0; i < cb_obj.length; i++) {
        for (var style in styles) {
          var value = styles[style];
          if (types.isArray(value)) {
            value = value[i % value.length];
          }
          if (cb_obj.data[style][i] !== value) {
            cb_obj.data[style][i] = value;
            changed = true;
          }
        }
      }
      if (changed)
        cb_obj.change.emit()
    c                    | j         d         }|j        d         }t          |j        |                   }|j                                        D ]9\  }fdt          |          D             |j        |<   t          |||           :t          | j	        |j        |j
        d          }|                    d|           d S )Nr   c                 @    g | ]}|t                    z           S rV   )r  )rW   r  ry   s     rG   r   z<GlyphDrawCallback._create_style_callback.<locals>.<listcomp>  s(    NNN1va#f++o6NNNrI   )stylesempty)coder  rF  )r>   column_namesr  rF  r  r\   rangesetattrr   _style_callbackempty_valuejs_on_change)	rE   cdsglyphr   r  lengthstylerY   ry   s	           @rG   _create_style_callbackz(GlyphDrawCallback._create_style_callback  s    aq!SXc]###]0022 	) 	)ME6NNNNfNNNCHUOE5%((((4/&,m%+%79 9: : : 	$$$$$rI   c           
         | j         j        }| j        d         }|j        D ]}t	          |j                  }||v r|                    |          }t          |          t          t          t          |
                                                              k    rt          j        ||j        gg          }|||<   dS )
        Add any value dimensions not already in the data ensuring the
        element can be reconstituted in entirety.
        r   N)r=   r~  r>   vdimsr   namedimension_valuesr  nextiterry   r   concatenater  )rE   rF  elementr   ddimry   s          rG   _update_cds_vdimsz#GlyphDrawCallback._update_cds_vdims  s    
 ))a 	 	A%af--Cd{{--a00F6{{c$tDKKMM':':";";<<<<&2D1E(FGGDII	 	rI   N)r   r   r   r  r  r  rV   rI   rG   r  r    s9        O&
% 
% 
%    rI   r  c                   *     e Zd Zd fd	Z fdZ xZS )PointDrawCallbackNc                 r   | j         }| j        d         }|j        d         }|j        d         }|j        d         g}i }|j        r
|j        |d<   |j        r
|j        |d<   |j        r|                     ||           |j        
|j        |d<   t          dt          d | j        D                       t          d	 | j        D                       |d
|}| j         j
        j                            |           |                     |j                   t                                          |           d S )Nr   r?   r  glyph_renderernum_objectsdescriptionr  c              3   $   K   | ]}|j         V  d S rK   )r   r   s     rG   r   z/PointDrawCallback.initialize.<locals>.<genexpr>   s$      00aAE000000rI   c              3   $   K   | ]}|j         V  d S rK   dragr   s     rG   r   z/PointDrawCallback.initialize.<locals>.<genexpr>!  $      22QV222222rI   r   r  	renderersrV   )r=   r>   rf   r  tooltipr  r  r  r
   rv  r   toolsr|   r  rF  r  r   )
rE   r   r=   r   r  r  r  r  
point_toolr  s
            rG   r   zPointDrawCallback.initialize  sW   yal8$W%\"234	 	7$*$6F=!> 	3$*NF=!= 	4''U333)$*$6F=!" +004<0000022T\22222+ + $*+ +
 		$$Z000sx((( 	7#####rI   c                 |    |                      |d                    t                                          |          S NrF  r  r  rS   rE   rM   r  s     rG   rS   zPointDrawCallback._process_msg)  3    s6{+++ww##C(((rI   rK   )r   r   r   r   rS   r!  r"  s   @rG   r  r    sV        $ $ $ $ $ $2) ) ) ) ) ) ) ) )rI   r  c                   0     e Zd Zd fd	Z fdZd Z xZS )CurveEditCallbackNc                 J   | j         }| j        d         }|j        d         }|j        d         } |j        j        |j        |j        f|dd|j        }|g}i }|j        r
|j        |d<   t          ddd|d|}	d	}
t          |||	d
|
          }|	                    d|           |j                            d|           | j         j        j                            |	           |                     |j                   t#                                          |           d S )Nr   r  r  F)r?   visibler  Tr  zCrenderer.visible = tool.active || (cds.selected.indices.length > 0))rendererr  tool)r  r  zchange:activer  rV   )r=   r>   rf   r   scatterr   r   r  r  r
   r   r  r  r  r|   r  rF  r  r   )rE   r   r=   r   r  r  r  r  r  r	  r  show_verticesr  s               rG   r   zCurveEditCallback.initialize0  sV   yal5!W%%4:%eguw Es.3E E7=|E EJ	> 	3$*NF=!" 
DI
 
9?
 

 S 8CQ[&\&\cghhh???!!)];;;	$$Z000sx(((7#####rI   c                 |    |                      |d                    t                                          |          S r  r  r  s     rG   rS   zCurveEditCallback._process_msgG  r  rI   c                     | j         j        }|j        D ]2}t          |j                  }||vr|                    |          ||<   3dS )r  N)r=   r~  r  r   r  r  )rE   rF  r  r  r  s        rG   r  z#CurveEditCallback._update_cds_vdimsK  sY    
 )) 	8 	8A%af--C$#44Q77S		8 	8rI   rK   r   r   r   r   rS   r  r!  r"  s   @rG   r  r  .  se        $ $ $ $ $ $.) ) ) ) )	8 	8 	8 	8 	8 	8 	8rI   r  c                   0     e Zd Zd fd	Z fdZd Z xZS )PolyDrawCallbackNc                    | j         }| j        d         }| j         j        d         }| j         j        d         }|j        d         g}i }|j        r
|j        |d<   |j        r-t          ddifi |j        } |j        j        g g fi |}	|	|d<   |j	        r| 
                    ||           |j        r
|j        |d	<   |j        
|j        |d
<   t          dt          d | j        D                       |d|}
|j        j                            |
           |                     |j                   t'                                          |           d S )Nr   r  r  r  r  size
   vertex_rendererr  r  c              3   $   K   | ]}|j         V  d S rK   r  r   s     rG   r   z.PolyDrawCallback.initialize.<locals>.<genexpr>m  r  rI   )r  r  rV   )r=   r>   rf   r  r  r@   vertex_styler   r  r  r  r  r  r   rv  r  r|   r  rF  r  r   )rE   r   r=   r   r  r  r  r  r!  r1	poly_toolr  s              rG   r   zPolyDrawCallback.initializeY  s   yai&	!'*\"234	 	7$*$6F=! 	+DD0CDDL##B;;l;;B(*F$%= 	4''U333> 	3$*NF=!)$*$6F=!  
22T\22222i
 

 
	 	
	***sx(((7#####rI   c                 |    |                      |d                    t                                          |          S r  r  r  s     rG   rS   zPolyDrawCallback._process_msgt  r  rI   c                    | j         j        }| j        d         }|j        }|j        rddini }|j        D ]} |j        j        ||fi |}t          |j                  }||vr|r|	                    ||           }	n"d |
                    d|g          D             }	t          |	          t          |d                   k    rt          j        |	|j        gg          }	|	||<   dS )	r  r   per_geomTc                 &    g | ]}|d d df         S r  rV   )rW   arrs     rG   r   z6PolyDrawCallback._update_cds_vdims.<locals>.<listcomp>  s$    eeeCc!!!Q$ieeerI   r  )datatype
dimensionsr  N)r=   r~  r>   r{  multir  isuniquer   r  r  r   r  r   r  r  )
rE   rF  r  r   r{  scalar_kwargsr  scalarr  ry   s
             rG   r  z"PolyDrawCallback._update_cds_vdimsx  s   
 ))a%	.7oET**2 
	# 
	#A/W&/LLmLLF%af--C$ f$55aVDDFFee7=='_b^c=3d3deeeFv;;#d4j//11^Vf6H5I,JKKF"S	
	# 
	#rI   rK   r  r"  s   @rG   r  r  W  se        $ $ $ $ $ $6) ) ) ) )# # # # # # #rI   r  c                       e Zd ZddZdS )FreehandDrawCallbackNc                    | j         }|j        d         }|j        d         }| j        d         }|j        r|                     ||           i }|j        r
|j        |d<   |j        
|j        |d<   t          d|j        |j        d         gd|}|j	        j
                            |           |                     |j                   t                              | |           d S )	Nr  r  r   r  r  r  )r  r  rV   )r=   rf   r>   r  r  r  r  r	   r  r   r  r|   r  rF  r  r   )rE   r   r=   r  r  r   r  r#  s           rG   r   zFreehandDrawCallback.initialize  s   yl5!W%a= 	4''U333> 	3$*NF=!)$*$6F=!$ 
*|$456
 
 
 
	
 	
	***sx(((tW-----rI   rK   r   r   r   r   rV   rI   rG   r0  r0    (        . . . . . .rI   r0  c                   >     e Zd ZddiZdgZd Zd fd	Z fdZ xZS )	BoxEditCallbackrF  zcds.datar  c           	      .   | j         }|j        d         }|j        }| j         j        g g g g f\  }}}}t	          |d         |d                   D ]\  }}	t          j        |          t          j        |          }}
t          j        |	          t          j        |	          }}|                    |
           |                    |           |                    |           |                    |           ||||d}|	                    fdj
        D                        |j        	                    |           | j         j        | j         j                 }|                    dd             |j        j        dddd	d
|d|}|j        d         | j         j        j        v r/| j         j        j                            |j        d                    |                     d|i          d         }| j        D ]}|	                    |           |S )Nr  r  r  )leftbottomrighttopc                 J    i | ]}|j                             |d            S )F)expanded)r  r  )rW   vdr  s     rG   rZ   z4BoxEditCallback._path_initialize.<locals>.<dictcomp>  s0    cccrRWg66rE6JJcccrI   cmapr7  r8  r9  r:  )r7  r8  r9  r:  r?   r  rF  r  rV   )r=   rf   rF  r~  zipr   nanminnanmaxr|   rz   r  r  cyclic_indexrc   r   quadr  removerS   r>   )rE   r=   r  rF  lbrtr   r   rA  rC  rB  rD  r  r"  r   r  s                    @rG   _path_initializez BoxEditCallback._path_initialize  s   yl5!x))"b"n
1aT
DJ// 	 	DAqillBIaLLBillBIaLLBHHRLLLHHRLLLHHRLLLHHRLLLLQ1==ccccU\Ubcccddd		 67		&$TZ_i&e\_iichii<()TY_-FFFIO%,,T\:J-KLLL  &$008l 	% 	%FMMtM$$$$	rI   Nc                 j   ddl m} | j        d         }| j        j        d         }i }|j        r
|j        |d<   |j        r
|j        |d<   | j        j        d         }t          | j        |          r|                                 }|j	        r| 
                    ||j                   t          r4t          d
d|gi|}| j        j        j                            |           nt#          d	           |                     |j                   t)          t*          |                                            d S )Nr7   )PathPlotr   r  r  r  r  r  z!BoxEditTool requires Bokeh >= 3.3rV   )r   rK  r>   r=   rf   r  r  rl   rI  r  r  r  r8   r   r   r  r|   r6   r  rF  r  r  r   )	rE   r   rK  r   r  r  r  box_toolr  s	           rG   r   zBoxEditCallback.initialize  s@   """"""ai& 	7$*$6F=!> 	3$*NF=!9$%56di** 	/,,..H= 	=''X^<<< 	6"BBhZB6BBHIO!((22224555sx(((k4  ++-----rI   c                    t                                          |          }d|vri S t          |d                   }|                    d          |d<   |                    d          |d<   |                    d          |d<   |                    d          |d	<   d|i}|                     |d                    |                     |          S )
NrF  r7  rA  r8  rB  r9  rC  r:  rD  )r  rS   r@   rc   r  rO   )rE   rM   rF  ry   r  s       rG   rS   zBoxEditCallback._process_msg  s    ww##C((Id6l##zz&))tzz(++tzz'**tzz%((tvs6{+++s###rI   rK   )	r   r   r   r   r`   rI  r   rS   r!  r"  s   @rG   r5  r5    sv        *%JWF  6. . . . . .4$ $ $ $ $ $ $ $ $rI   r5  c                       e Zd ZddZdS )PolyEditCallbackNc                 T   | j         }|j        d         }d }t          d | j        D                       r"d |j        j        D             }|r|d         nd }| j        d         }i }|j        r
|j        |d<   |Ut          ddifi |j        } |j        j	        g g fi |}	t          d
d|	i|}|j        j                            |           |j                            |j        d	                    |                     |j                   t                              | |           d S )Nr  c              3   $   K   | ]}|j         V  d S rK   )sharedr   s     rG   r   z.PolyEditCallback.initialize.<locals>.<genexpr>  s$      ..Aqx......rI   c                 <    g | ]}t          |t                    |S rV   )rl   r   )rW   r  s     rG   r   z/PolyEditCallback.initialize.<locals>.<listcomp>  s'    YYYd*T<:X:XYTYYYrI   r   r  r  r  r  r  rV   )r=   rf   rv  r>   r   r  r  r@   r!  r  r   r|   r  r  rF  r  r   )
rE   r   r=   r  vertex_toolr  r   r  r!  r"  s
             rG   r   zPolyEditCallback.initialize  sM   yl5!....... 	6YYdj&6YYYE&+5%((Ka> 	3$*NF=!DD0CDDL##B;;l;;B&DDrDVDDKJ##K000$$T\2B%CDDDsx(((tW-----rI   rK   r2  rV   rI   rG   rO  rO    r3  rI   rO  bokeh)er   r  r   collectionsr   numpyr   bokeh.modelsr   r   r   r   r   r	   r
   r   r   r   panel.io.stater   r   core.optionsr   	core.utilr   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/   r0   r1   r2   r3   r4   r5   util.warningsr6   utilr8   r9   r;   r   r  r  r  r$  r)  r,  r/  r1  r3  r7  r:  rH  rM  rP  rW  r_  ry  r  r  r  r  r  r  r  r  r  r  r0  r5  rO  r[   rz   rV   rI   rG   <module>r^     sY	      # # # # # #                            - , , , , , , , ) ) ) ) ) ) Q Q Q Q Q Q Q Q Q Q Q Q                                                                                                                                         B " ! ! ! ! ! , , , , , , , ,( ( ( ( ( ( ( (DC$ C$ C$ C$ C$ C$ C$ C$L# # # # #( # # ## # # # #( # # #J J J J J$ J J J     #   >           k       [              *       *   .% .% .% .% .%h .% .% .%b    _       _       x   $       (    X   8* * * * *. * * *Z    h   .    h   .7 7 7 7 7H 7 7 7.    (   0
$ 
$ 
$ 
$ 
$H 
$ 
$ 
$;$ ;$ ;$ ;$ ;$( ;$ ;$ ;$|/ / / / / / / /d) ) ) ) )) ) ) )@&8 &8 &8 &8 &8) &8 &8 &8R4# 4# 4# 4# 4#( 4# 4# 4#n. . . . .+ . . .0E$ E$ E$ E$ E$' E$ E$ E$P. . . . .' . . .0  '  ! ! ###"# "# +	#
 ## ## /# .# $# $# /# .# .# .# /#  /!#" 
-##$ %"%,-+/##&""$=# #     rI   