
    g+                        d Z ddlmZ ddlZddlmZ ddlZddlZddlm	Z	 ddl
Z
ddlZddlZddlZ	 ddlZddlZddlZddlZddlZddlmZ ddlmZ d	d
lmZ d	dlmZmZ  ej@                  d       Z! G d dejD                        Z" G d dejF                        Z$ G d dejJ                  jL                        Z'd Z(ejR                   G d de             Z*y# e$ rZ ed      edZ[ww xY w)z7Displays Agg images in the browser, with interactivity.    )contextmanagerN)BytesIO)Pathz$The WebAgg backend requires Tornado.)_Backend)Gcf   )backend_webagg_core)TimerAsyncioTimerTornadoc                  n    t         j                  j                  j                         j	                         S N)tornadoioloopIOLoopinstancestart     _/var/www/dash_apps/app1/venv/lib/python3.12/site-packages/matplotlib/backends/backend_webagg.py<lambda>r   )   s"    7>>((11399; r   )targetc                   :    e Zd Zej                  Zeddd       Zy)FigureManagerWebAggN)blockc                Z   t         j                          dj                  t         j                  t         j                  t         j
                        }t        j                  d   r$dd l}|j                  |      st        d|        nt        d|        t         j                          y )Nzhttp://{address}:{port}{prefix})addressportprefixzwebagg.open_in_browserr   zTo view figure, visit )WebAggApplication
initializeformatr   r   
url_prefixmplrcParams
webbrowseropenprintr   )clsr   urlr%   s       r   pyplot_showzFigureManagerWebAgg.pyplot_show/   s    $$&/66%--"''$// 7 1
 <<01??3'.se45*3%01!r   )__name__
__module____qualname__coreNavigationToolbar2WebAgg_toolbar2_classclassmethodr*   r   r   r   r   r   ,   s"    33O"& " "r   r   c                       e Zd ZeZy)FigureCanvasWebAggN)r+   r,   r-   r   manager_classr   r   r   r3   r3   B   s    'Mr   r3   c                       e Zd ZdZdZ G d dej                  j                        Z G d dej                  j                        Z	 G d dej                  j                        Z
 G d d	ej                  j                        Z G d
 dej                  j                        Z G d dej                  j                        Zd fd	Zedd       Zed        Z xZS )r   Fc                       e Zd Zd Zy)WebAggApplication.FavIconc                     | j                  dd       | j                  t        t        j                         d      j                                y )NContent-Typez	image/pngzimages/matplotlib.png)
set_headerwriter   r#   get_data_path
read_bytesselfs    r   getzWebAggApplication.FavIcon.getK   s9    OONK8JJtC--/355?Z\Cr   Nr+   r,   r-   r@   r   r   r   FavIconr7   J   s    	Cr   rB   c                   *     e Zd Zdd fd
Zd Z xZS )"WebAggApplication.SingleFigurePage r"   c                6    || _         t        |   ||fi | y r   r"   super__init__r?   applicationrequestr"   kwargs	__class__s        r   rJ   z+WebAggApplication.SingleFigurePage.__init__Q       (DOG['<V<r   c                    t        |      }t        j                  |      }d| j                  j                   | j
                   d}| j                  d| j
                  ||t        j                  j                  |j                         y )Nws:///zsingle_figure.html)r   ws_urifig_id	toolitemscanvas)intr   get_fig_managerrM   hostr"   renderr.   r/   rV   rW   )r?   fignummanagerrT   s       r   r@   z&WebAggApplication.SingleFigurePage.getU   st    [F))&1GT\\..//@BFKK$77AA~~  'r   r+   r,   r-   rJ   r@   __classcell__rO   s   @r   SingleFigurePagerD   P   s    ?A 	=	'r   ra   c                   *     e Zd Zdd fd
Zd Z xZS ) WebAggApplication.AllFiguresPagerE   rF   c                6    || _         t        |   ||fi | y r   rH   rK   s        r   rJ   z)WebAggApplication.AllFiguresPage.__init__c   rP   r   c           	      
   d| j                   j                   | j                   d}| j                  d| j                  |t	        t
        j                  j                               t        j                  j                         y )NrR   rS   zall_figures.html)r   rT   figuresrV   )rM   rZ   r"   r[   sortedr   figsitemsr.   r/   rV   )r?   rT   s     r   r@   z$WebAggApplication.AllFiguresPage.getg   se    T\\..//@BFKK"sxx~~/077AA  Cr   r^   r`   s   @r   AllFiguresPagerc   b   s    ?A 	=	Cr   rj   c                       e Zd Zd Zy)WebAggApplication.MplJsc                     | j                  dd       t        j                  j                         }| j	                  |       y )Nr9   zapplication/javascript)r:   r.   r   get_javascriptr;   )r?   
js_contents     r   r@   zWebAggApplication.MplJs.getq   s1    OON,DE11@@BJJJz"r   NrA   r   r   r   MplJsrl   p   s    	#r   rp   c                       e Zd Zd Zy)WebAggApplication.Downloadc                 D   t        |      }t        j                  |      }| j                  dt        j
                  j                  |d             t               }|j                  j                  j                  ||       | j                  |j                                y )Nr9   binary)r!   )rX   r   rY   r:   	mimetypes	types_mapr@   r   rW   figuresavefigr;   getvalue)r?   r\   fmtr]   buffs        r   r@   zWebAggApplication.Download.gety   sv    [F))&1GOO	 3 3 7 7X FH9DNN!!))$s);JJt}}'r   NrA   r   r   r   Downloadrr   x   s    	(r   r|   c                   .    e Zd ZdZd Zd Zd Zd Zd Zy)WebAggApplication.WebSocketTc                     t        |      | _        t        j                  | j                        | _        | j                  j                  |        t        | d      r| j                  d       y y )Nset_nodelayT)rX   r\   r   rY   r]   add_web_sockethasattrr   )r?   r\   s     r   r&   z WebAggApplication.WebSocket.open   sR    f+DK..t{{;DLLL''-t]+  & ,r   c                 :    | j                   j                  |        y r   )r]   remove_web_socketr>   s    r   on_closez$WebAggApplication.WebSocket.on_close   s    LL**40r   c                     t        j                  |      }|d   dk(  r|d   | _        y t        j                  | j
                        }||j                  |       y y )Ntypesupports_binaryvalue)jsonloadsr   r   rY   r\   handle_json)r?   messager]   s      r   
on_messagez&WebAggApplication.WebSocket.on_message   s[    jj)G v"33'.w'7$--dkk: &''0 'r   c                 L    | j                  t        j                  |             y r   )write_messager   dumps)r?   contents     r   	send_jsonz%WebAggApplication.WebSocket.send_json   s    tzz'23r   c                     | j                   r| j                  |d       y dj                  |j                  d      j	                  dd            }| j                  |       y )NT)rt   zdata:image/png;base64,{}base64
rE   )r   r   r!   encodereplace)r?   blobdata_uris      r   send_binaryz'WebAggApplication.WebSocket.send_binary   sU    ##""4"55<<KK)11$;=""8,r   N)	r+   r,   r-   r   r&   r   r   r   r   r   r   r   	WebSocketr~      s     	'	1	1	4	-r   r   c                 R   |r|d   dk(  r|d   dk7  sJ d       t         |   |dz   t        j                  j                  dt
        j                  j                         if|dz   t        j                  j                  dt        t        j                         d      if|d	z   | j                  f|d
z   | j                  d|if|dz   | j                  d|if|dz   | j                  f|dz   | j                  f|dz   | j                   fgt
        j                  j                                y )Nr   rS   z6url_prefix must start with a "/" and not end with one.z/_static/(.*)pathz/_images/(.*)imagesz/favicon.icoz	/([0-9]+)r"   z/?z
/js/mpl.jsz/([0-9]+)/wsz/([0-9]+)/download.([a-z0-9.]+))template_path)rI   rJ   r   webStaticFileHandlerr.   r   get_static_file_pathr   r#   r<   rB   ra   rj   rp   r   r|   )r?   r"   rO   s     r   rJ   zWebAggApplication.__init__   sX   a=C'JrNc,A IHIA 	 ....$22GGIJL
 ....$s002H=>@
 o-t||< l*D,A,A
+- e#T%8%8
+- m+TZZ8 o-t~~> @@ ;@ 22GGIC 	 !	Kr   c                    | j                   ry  | |      }|| _        d }|t        j                  d   | _        n|| _        t        j                  d   | _         || j
                  t        j                  d         D ].  }	 |j                  || j                         || _         d| _         y  t        d      # t        $ r(}|j                  t        j                  k7  r Y d }~hd }~ww xY w)NrF   c              3      K   t        t        d|            D ]	  }| |z     t        |dz
        D ]#  }| t        j                  d|z  d|z        z    % yw)z
            Generate a list of n random ports near the given port.

            The first 5 ports will be sequential, and the remaining n-5 will be
            randomly selected in the range [port-2*n, port+2*n].
                  N)rangeminrandomrandint)r   nis      r   random_portsz2WebAggApplication.initialize.<locals>.random_ports   s`      3q!9% Qh1q5\ ;V^^BFAE:::;s   AAzwebagg.addresszwebagg.portzwebagg.port_retrieszSThe webagg server could not be started because an available port could not be foundT)initializedr"   r#   r$   r   r   listenOSErrorerrno
EADDRINUSE
SystemExit)r(   r"   r   r   appr   es          r   r    zWebAggApplication.initialize   s    ?? Z(#
	; ?,,'78CK!CK<<. !$.C!DF 	+D

4-
   	+ *+ +  77e... /s   B;;	C,C''C,c                     dd l }	 |j                          d _         j                  ry 	 t        j
                  j                  j                          fdt        fd       }d _        t        d       t        j                  j                           |       5  j                          d d d        y # t        $ r Y w xY w# 1 sw Y   y xY w)Nr   Tc                      j                          t        d       t        j                  j	                          d _        y )NzServer is stoppedF)stopr'   sysstdoutflushstarted)r(   r   s   r   shutdownz)WebAggApplication.start.<locals>.shutdown  s,    KKM%&JJCKr   c               3     K   t        j                   t         j                  fd      } 	 d  t        j                   t         j                  |        y # t        j                   t         j                  |        w xY ww)Nc                 &    j                        S r   )add_callback_from_signal)sigframer   r   s     r   r   z?WebAggApplication.start.<locals>.catch_sigint.<locals>.<lambda>  s    6#B#B8#L r   )signalSIGINT)old_handlerr   r   s    r   catch_sigintz-WebAggApplication.start.<locals>.catch_sigint  sL      --LNK:fmm[9fmm[9s   )A?A %A?&A<<A?z"Press Ctrl+C to stop WebAgg server)asyncioget_running_loopr   RuntimeErrorr   r   r   r   r   r'   r   r   r   r   )r(   r   r   r   r   s   `  @@r   r   zWebAggApplication.start   s    	$$& CK;;	 &&//1	  
	: 
	: 23

^ 	LLN	 	M  		L	 	s   B< "C<	CCC)rE   )rE   NN)r+   r,   r-   r   r   r   r   RequestHandlerrB   ra   rj   rp   r|   	websocketWebSocketHandlerr   rJ   r1   r    r   r_   r`   s   @r   r   r   F   s    KGC'++,, C'7;;55 '$C33 C#** #(7;;-- (%-G%%66 %-N&KP + +Z + +r   r   c                 J   dd l }t        j                          dd l}	 |j	                          | j                  }t        t        j                  j                         d      j                         }|j                  j!                  |      }|j#                  t        j$                  |t        j&                  j(                  | j*                  t        j,                        j/                  d      S # t
        $ r+ t        j                         st        j                          Y w xY w)Nr   zipython_inline_figure.html)r   rU   rV   rW   r   zutf-8)tornado.templater   r    r   r   r   webagg_server_threadis_aliver   numberr   r.   r   r   	read_texttemplateTemplategenerater"   r/   rV   rW   r   decode)rw   r   r   r\   tplts         r   ipython_inline_displayr   .  s      ")  "
 ]]F
t''<<>+--6Y[ !!#&A:: ++//99}}##  %
 &,VG_5  )#,,. &&()s   C. .1D"!D"c                       e Zd ZeZeZy)_BackendWebAggN)r+   r,   r-   r3   FigureCanvasr   FigureManagerr   r   r   r   r   E  s    %L'Mr   r   )+__doc__
contextlibr   r   ior   r   ru   pathlibr   r   r   r   	threadingr   ImportErrorerrr   tornado.webtornado.iolooptornado.websocket
matplotlibr#   matplotlib.backend_basesr   matplotlib._pylab_helpersr   rE   r	   r.   r
   r   Threadr   r   FigureCanvasWebAggCorer3   r   Applicationr   r   exportr   r   r   r   <module>r      s    = &       
  H     - ) )  (y'';= "$22 ",(44 (e// eP5. 
(X ( ([	  H
=
>CGHs   C C. 	C))C.