o
    et                     @  s  d Z ddlmZ ddlZddlZddlZddlZddlZddl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ZddlZddlmZmZ ddlmZ ddlmZ ddlmZ ddlmZ dd	lm Z  dd
lm!Z!m"Z"m#Z#m$Z$m%Z%m&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.Z.ddl/m0Z0 ddl1m2Z2 e!rddl3m4Z4m5Z5m6Z6 ddl7m8Z8 ddl9m:Z: e
j;<e
j;=e.j>dZ?e@eAdpdBdC ZDe-dZEe&dZFdddZGG dd deZHG dd deHZIdd!d"ZJdd$d%ZKdd&d'ZLdd(d)ZMdd*d+ZNdd-d.ZOdd/d0ZPdd3d4ZQdd8d9ZRdd:d;ZSdd?d@ZT	AdddGdHZUddLdMZVdddQdRZWddVdWZXddZd[ZYdd\d]ZZd^d_ Z[G d`da daZ\dbdc Z]eddfdgZ^ddjdkZ_ddmdnZ`ddrdsZaddudvZbdwdx Zcdd|d}Zd	dd~dZedddZfdddZgdddZhdddZidd Zjdd ZkdddZldddZmG dd denZoG dd dZpdd ZqdddZrdddZsdddZteudZvdddZwdddZxdS )z Handy utility functions.     )annotationsN)ABCabstractmethod)contextmanager)BytesIO)NumberPath)GeneratorType)TYPE_CHECKINGAnyCallableIteratorOptionalTypeVar)Serializable)	ParamSpec)Context)en)BlockBlockContextBlocks)	Component)Appzlaunches.jsonzversion.txt    asciiPTreturnasyncio.Lockc                   C  s(   z	t   t  W S  ty   Y dS w )zGet asyncio.Lock() without fear of getting an Exception.

    Needed because in reload mode we import the Blocks object outside
    the main thread.
    N)asyncioget_event_loopLockRuntimeError r$   r$   <D:\Projects\ConvertPro\env\Lib\site-packages\gradio/utils.pysafe_get_lock=   s   
r&   c                   @  s2   e Zd ZeedddZdddZdd	d
ZdS )BaseReloaderr   r   c                 C  s   d S Nr$   selfr$   r$   r%   running_appK   s   zBaseReloader.running_appdemor   c                 C  s4   t | jjdot |d pt | jjd ot |dS N_queue)hasattrr+   blocksr*   r,   r$   r$   r%   queue_changedP   s   zBaseReloader.queue_changedc                 C  s@   | j jsJ t| j jdr|j| j jj_| j jj|_|| j _d S r-   )r+   r0   r/   dependenciesr.   Zblocks_dependenciesr1   r$   r$   r%   swap_blocksW   s
   zBaseReloader.swap_blocksNr   r   r,   r   )__name__
__module____qualname__propertyr   r+   r2   r4   r$   r$   r$   r%   r'   J   s    
r'   c                      sZ   e Zd Z	dd fddZedddZdddZd ddZdd Zd! fddZ	  Z
S )"SourceFileReloaderr,   appr   
watch_dirs	list[str]
watch_filestr
stop_eventthreading.Eventchange_event	demo_namer   Nonec                   s2   t    || _|| _|| _|| _|| _|| _d S r(   )super__init__r<   r=   r?   rA   rC   rD   )r*   r<   r=   r?   rA   rC   rD   	__class__r$   r%   rG   b   s   
	
zSourceFileReloader.__init__c                 C  s   | j S r(   )r<   r)   r$   r$   r%   r+   s   s   zSourceFileReloader.running_appboolc                 C  s   | j   S r(   )rA   is_setr)   r$   r$   r%   should_watchw   s   zSourceFileReloader.should_watchc                 C     | j   d S r(   )rA   setr)   r$   r$   r%   stopz      zSourceFileReloader.stopc                 C  rM   r(   )rC   rN   r)   r$   r$   r%   alert_change}   rP   zSourceFileReloader.alert_changer   c                   s   t  | |   d S r(   )rF   r4   rQ   r1   rH   r$   r%   r4      s   zSourceFileReloader.swap_blocks)r,   )r<   r   r=   r>   r?   r@   rA   rB   rC   rB   rD   r@   r   rE   r5   r   rJ   r   rE   r6   )r7   r8   r9   rG   r:   r+   rL   rO   rQ   r4   __classcell__r$   r$   rH   r%   r;   a   s    

r;   reloaderc              
     s  ddl m} d|_dfdd}dfd	d
d}dd | jD i |  rddl}|   rtd   t fddD }t|j	}|D ]*}|j	| }t
|dd}	|	ri|tttjkri|	driqJ|	rtt|	|rt|j	|= qJzt| j}t|}W n% ty }
 ztd| j d tjd|
dd i W Y d}
~
q$d}
~
ww t
|| j}| |rtd n| | i |  s(dS dS )ziWatch python files in a given module.

    get_changes is taken from uvicorn's default file watcher.
    r   )reload_threadTr   Path | Nonec               	     s^     D ])} z|   j}W n	 ty   Y qw | }|d u r$|| < q||kr,|   S qd S r(   )statst_mtimeOSErrorget)filemtimeZold_time)iter_py_filesmtimesr$   r%   get_changes   s   

zwatchfn.<locals>.get_changesIterator[Path]c                  3  s.     D ]} t | dD ]}| V  qqd S )Nz*.py)listrglobresolve)Z
reload_dirpath)reload_dirsr$   r%   r^      s   zwatchfn.<locals>.iter_py_filesNc                 S     g | ]}t |qS r$   r   ).0dir_r$   r$   r%   
<listcomp>       zwatchfn.<locals>.<listcomp>zChanges detected in: c                 3  s    | ]
}t  |r|V  qd S r(   )is_in_or_equal)rh   d)changedr$   r%   	<genexpr>   s    zwatchfn.<locals>.<genexpr>__file__z	reload.pyz
Reloading z& failed with the following exception: )valuetbzqReloading failed. The new demo has a queue and the old one doesn't (or vice versa). Please launch your demo again)r   rW   )r   ra   )Zgradio.reloadrV   Zrunning_reloadr=   rL   sysprintnextrb   modulesgetattrr	   inspectgetfilegradioparentendswithrl   	importlibimport_moduler?   reload	Exception	tracebackprint_exceptionrD   r2   r4   )rU   rV   r`   modulers   ri   rv   kvZ
sourcefileer,   r$   )rn   r^   r_   rf   r%   watchfn   s\   	



r   rJ   c               	   C  sL   d} zddl m} | }dt|v rd} W | S W | S  ttfy%   Y | S w )zf
    Check if interface is launching from Google Colab
    :return is_colab (bool): True or False
    Fr   get_ipythonzgoogle.colabT)IPython.core.getipythonr   r@   ImportError	NameError)Zis_colabr   Z
from_ipynbr$   r$   r%   colab_check   s   r   c                   C  s   t tjdptjdS )NZKAGGLE_KERNEL_RUN_TYPEZGFOOTBALL_DATA_DIR)rJ   osenvironr[   r$   r$   r$   r%   kaggle_check   s   r   c                  C  sB   zdd l } | d}| }d|d  v W S  ty    Y dS w )Nr   stsZ	sagemakerZArnF)boto3clientZget_caller_identitylowerr   )r   r   responser$   r$   r%   sagemaker_check   s   
r   c               	   C  sD   d} zddl m} | durd} W | S W | S  ttfy!   Y | S w )zo
    Check if interface is launching from iPython (not colab)
    :return is_ipython (bool): True or False
    Fr   r   NT)r   r   r   r   )Z
is_ipythonr   r$   r$   r%   ipython_check   s   
r   
str | Nonec                   C  s   t ddkrt dS d S )NZSYSTEMspacesZSPACE_IDr   getenvr$   r$   r$   r%   	get_space  s   
r   c                   C  s   t ddkS )NZSPACES_ZERO_GPUtruer   r$   r$   r$   r%   is_zero_gpu_space  rP   r   articler@   c                 C  sH   zt j| dd}|jt jjkr|j} W | S W | S  t jjy#   Y | S w )N   )timeout)requestsr[   status_codecodesoktext
exceptionsRequestException)r   r   r$   r$   r%   readme_to_html  s   r   	interfacegradio.BlocksrE   c                 C  s:   | j rt dk rttd }td|  d S d S d S )Ng      ?ZTIPSzTip: )Z	show_tipsrandomchoicer   rt   )r   Ztipr$   r$   r%   show_tip  s   r   c                  C  s  zyt jts+ddi} ttd}t| | W d    W d S 1 s#w   Y  W d S tt}t|} W d    n1 s?w   Y  | d  d7  < | d dv rXtt	d  ttd}|
t|  W d    W d S 1 srw   Y  W d S  ty   Y d S w )Nlaunches   zw+)   2      i  i  ZBETA_INVITEw)r   re   exists	JSON_PATHopenjsondumploadrt   r   writedumpsr   )r   jr$   r$   r%   launch_counter!  s$   &
&r   funcr   	list[Any]c                 C  s   t | }dd |j D S )Nc                 S  s$   g | ]}|j tjjur|j nd qS r(   )defaultrx   	Parameteremptyrh   r   r$   r$   r%   rj   5  s    z$get_default_args.<locals>.<listcomp>)rx   	signature
parametersvalues)r   r   r$   r$   r%   get_default_args3  s   
r   modeconfig1dictconfig2	root_keystuplec                   s`  t t tjdd|D ]}| | ks#J d| qtd td ks4J dfdd  fdd	d
 d }d
 d }|| td d D ]P\}}t|d|dD ]	\}}	 ||	 qlt|d|dD ]	\}
} |
| qt|d|dD ]	\}} || q||ksJ | d| q]dS )a  Allows you to test if two different Blocks configs produce the same demo.

    Parameters:
    config1 (dict): nested dict with config from the first Blocks instance
    config2 (dict): nested dict with config from the second Blocks instance
    root_keys (Tuple): an interable consisting of which keys to test for equivalence at
        the root level of the config. By default, only "mode" is tested,
        so keys like "version" are ignored.
       )indentzConfigs have different: 
componentsz# of components are differentc                   s   t t fddd d }t tfddd d }t|}|d t|}|d t|t|ksKJ | d| d S )Nc                      | d  kS Nidr$   c)
config1_idr$   r%   <lambda>S      z[assert_configs_are_equivalent_besides_ids.<locals>.assert_same_components.<locals>.<lambda>r   r   c                   r   r   r$   r   )
config2_idr$   r%   r   T  r   r    does not match )rb   filtercopydeepcopypopr   r   pprint)r   r   c1c2)r   r   pp)r   r   r%   assert_same_componentsR  s   



zIassert_configs_are_equivalent_besides_ids.<locals>.assert_same_componentsc                   sL   t | |D ]\}} |d |d  d|v sd|v r#|d |d  qd S )Nr   children)zip)	children1Zchidren2Zchild1Zchild2)r   same_children_recursiver$   r%   r   ]  s   zJassert_configs_are_equivalent_besides_ids.<locals>.same_children_recursiveZlayoutr   r3   targetsinputsoutputsr   T)r   r   r   PrettyPrinterlenr   r   )r   r   r   keyr   Z	children2Zd1Zd2t1t2i1i2Zo1o2r$   )r   r   r   r   r   r%   )assert_configs_are_equivalent_besides_ids;  s0   

 
r   input_string
ner_groupslist[dict[str, str | int]]c                 C  s   t |dkr| d fgS g }d}d}|D ](}|d |d |d }}}|| || d f || || |f |}q|| |d  d f |S )Nr   Zentity_groupstartend)r   append)r   r   outputr   Zprev_endgroupentityr   r$   r$   r%   format_ner_listt  s   
r   F_dict
skip_valuec                 C  s6   t |  D ]\}}|r|dkrq|du r| |= q| S )z=
    Delete keys whose values are None from a dictionary
    rq   N)rb   items)r   r  r   rq   r$   r$   r%   delete_none  s   r  _listlist[Any] | Anyr   c                 C  s   t | dkr
| d S | S )Nr   r   )r   )r  r$   r$   r%   resolve_singleton  s   r  cls_name$type[Component] | type[BlockContext]c                 C  s   ddl }ddl}ddl}ddl}dd |jj D }dd |jj D }dd |jj D }|| | D ] \}}|	 | 
ddkrWt||jjsSt||jjrW|  S q7td	|  )
z
    Returns the component, template, or layout class with the given class name, or
    raises a ValueError if not found.

    Parameters:
    cls_name (str): lower-case string class name of a component
    Returns:
    cls: the component class
    r   Nc                 S  "   g | ]\}}t |tr||fqS r$   
isinstancetyperh   nameclsr$   r$   r%   rj         z-component_or_layout_class.<locals>.<listcomp>c                 S  r	  r$   r
  r  r$   r$   r%   rj     r  c                 S  r	  r$   r
  r  r$   r$   r%   rj     r  _ zNo such component or layout: )gradio.blocksgradio.componentsZgradio.layoutsZgradio.templatesr   __dict__r  	templateslayoutsr   replace
issubclassr   r0   r   
ValueError)r  rz   r   r  r  r  r  r$   r$   r%   component_or_layout_class  s,   



r  c                 O  s   t  }|| |i |S )a?  
    Runs coroutines in background.

    Warning, be careful to not use this function in other than FastAPI scope, because the event_loop has not started yet.
    You can use it in any scope reached by FastAPI app.

    correct scope examples: endpoints in routes, Blocks.process_api
    incorrect scope examples: Blocks.launch

    Use startup_events in routes.py if you need to run a coro in background in Blocks.launch().


    Example:
        utils.run_coro_in_background(fn, *args, **kwargs)

    Args:
        func:
        *args:
        **kwargs:

    Returns:

    )r    r!   create_task)r   argskwargsZ
event_loopr$   r$   r%   run_coro_in_background  s   r  c                 C  s"   zt | W S  ty   t dw )z;Helper for yielding StopAsyncIteration from sync iterators.N)ru   StopIterationStopAsyncIterationiteratorr$   r$   r%   run_sync_iterator_async  s
   
r$  c                   @  s*   e Zd ZdZdddZdd Zdd	 Zd
S )SyncToAsyncIteratorz*Treat a synchronous iterator as async one.r   rE   c                 C  s   || _ || _d S r(   )r#  limiter)r*   r#  r&  r$   r$   r%   rG     s   
zSyncToAsyncIterator.__init__c                 C  s   | S r(   r$   r)   r$   r$   r%   	__aiter__     zSyncToAsyncIterator.__aiter__c                   s   t jjt| j| jdI d H S )N)r&  )anyio	to_threadZrun_syncr$  r#  r&  r)   r$   r$   r%   	__anext__  s   
zSyncToAsyncIterator.__anext__NrS   )r7   r8   r9   __doc__rG   r'  r+  r$   r$   r$   r%   r%    s
    
r%  c                   s   |   I d H S r(   )r+  r"  r$   r$   r%   async_iteration  s   r-  re   
Path | strc              	   c  s:    t   }zt|  dV  W t| dS t| w )zBContext manager that sets the working directory to the given path.N)r	   absoluter   chdir)re   originr$   r$   r%   set_directory  s   

r2  rq   str | Numberc                   sX   t  tr S g d}g d}t fdd|D s%t fdd|D r*d    S )z
    Sanitizes a value that is being written to a CSV file to prevent CSV injection attacks.
    Reference: https://owasp.org/www-community/attacks/CSV_Injection
    )=+-@	
)z,=z,+z,-z,@z,	z,
c                 3  s    | ]}  |V  qd S r(   )
startswith)rh   prefixrq   r$   r%   ro     s    z)sanitize_value_for_csv.<locals>.<genexpr>c                 3  s    | ]}| v V  qd S r(   r$   )rh   sequencer<  r$   r%   ro         
')r  r   any)rq   Zunsafe_prefixesZunsafe_sequencesr$   r<  r%   sanitize_value_for_csv  s   
"
rA  r   c                 C  sH   g }| D ]}t |trdd |D }|| qt|}|| q|S )z
    Sanitizes a list of values (or a list of list of values) that is being written to a
    CSV file to prevent CSV injection attacks.
    c                 S  rg   r$   )rA  r   r$   r$   r%   rj     rk   z)sanitize_list_for_csv.<locals>.<listcomp>)r  rb   r   rA  )r   Zsanitized_valuesrq   Zsanitized_valuer$   r$   r%   sanitize_list_for_csv  s   
rB  r  list_of_namesr>   c                 C  sP   t |}| |vr
| S d}|  d| }||v r&|d7 }|  d| }||v s|S )zSAppends a numerical suffix to `name` so that it does not appear in `list_of_names`.r   r  )rN   )r  rC  Zset_of_namesZsuffix_counternew_namer$   r$   r%   append_unique_suffix%  s   rE  possible_urlc                 C  sZ   ddi}zt j| |d}|jdks|jdkrt j| |djW S |jW S  ty,   Y dS w )Nz
User-Agentz-gradio (https://gradio.app/; team@gradio.app))headersi  i  F)r   headr   r[   r   r   )rF  rG  Zhead_requestr$   r$   r%   validate_url3  s   rI  c                 C  s   t | tod| ddv S )NupdateZ__type__r  )r  r   r[   )valr$   r$   r%   	is_update?  s   rL  fneveryfloatc                   s    fdd}|S )Nc                  7  s4    	 |  }t |tr|E d H  n|V  t  qr(   )r  r
   timesleep)r  r   rN  rM  r$   r%   continuous_fnD  s   

z(get_continuous_fn.<locals>.continuous_fnr$   )rM  rN  rS  r$   rR  r%   get_continuous_fnC  s   	rT  c           	        s   d u rg n d u rg n  t r&t fdd}|S tr<t fdd}|S t rRt fdd}|S t fdd}|S )	Nc                   sF   r  | i |2 z	3 d H W }|V  q6 r!   d S d S r(   r$   r  r  r   
after_argsafter_fnbefore_args	before_fnfr$   r%   asyncgen_wrapperW  s   z*function_wrapper.<locals>.asyncgen_wrapperc                    s2   r  | i |I d H }r   |S r(   r$   rU  rV  r$   r%   async_wrapperd  s   z'function_wrapper.<locals>.async_wrapperc                  ?  s6    r  | i |E d H  r   d S d S r(   r$   )r  r  rV  r$   r%   gen_wrapperq  s   z%function_wrapper.<locals>.gen_wrapperc                    s*   r  | i |}r   |S r(   r$   rU  rV  r$   r%   wrapper}  s   z!function_wrapper.<locals>.wrapper)rx   isasyncgenfunction	functoolswrapsr    iscoroutinefunctionisgeneratorfunction)	r[  rZ  rY  rX  rW  r\  r]  r^  r_  r$   rV  r%   function_wrapperP  s"   


re  r0   r   event_idc                 C  s   dd }t | |||fdS )Nc                 S  s   ddl m} | |_||_d S )Nr   )thread_data)gradio.contextrg  r0   rf  )r0   rf  rg  r$   r$   r%   rZ    s   
z+get_function_with_locals.<locals>.before_fn)rZ  rY  )re  )rM  r0   rf  rZ  r$   r$   r%   get_function_with_locals  s   ri  task_idsset[str]c                   sD    fddt  D }|D ]}|  qt j|ddiI d H  d S )Nc                   s   g | ]
}|   v r|qS r$   )get_name)rh   taskrj  r$   r%   rj     s    z cancel_tasks.<locals>.<listcomp>return_exceptionsT)r    	all_taskscancelgather)rj  Zmatching_tasksrm  r$   rn  r%   cancel_tasks  s   

rs  session_hashfn_indexintbatchc                 C  s    |s|  | d|  d S d S )Nr  )set_name)rm  rt  ru  rw  r$   r$   r%   set_task_name  s   ry  r3   list[dict[str, Any]]tuple[Callable, list[int]]c                   sf   i | D ] t jr#t fddtt jjD }dd  d D |< qdfd
d}|t fS )Nc                 3  s     | ]\}}| kr|V  qd S r(   r$   )rh   irm   )depr$   r%   ro     s    z&get_cancel_function.<locals>.<genexpr>c                 S  s   g | ]}t jj| qS r$   )r   
root_blockr0   )rh   or$   r$   r%   rj     s    z'get_cancel_function.<locals>.<listcomp>r   rt  r@   r   rE   c                   s&    fddD }t |I d H  d S )Nc                   s   h | ]	}  d | qS )r  r$   )rh   rM  rt  r$   r%   	<setcomp>  s    z6get_cancel_function.<locals>.cancel.<locals>.<setcomp>)rs  )rt  rj  )
fn_to_compr  r%   rq    s   z#get_cancel_function.<locals>.cancel)rt  r@   r   rE   )r   r~  ru   	enumerater3   rb   keys)r3   ru  rq  r$   )r}  r  r%   get_cancel_function  s   


r  c                 C  s   dd l }ddl m}m} t| st| rn
t| r| j} ni S zt	| W S  t
yz   i }t| }|j D ];\}}|jtjju rFq:|jdkrQt| ||< dt|jv rYq:ztt|jt t ||< W q: tt
fyu   Y q:w | Y S w )Nr   )OAuthProfileRequestzgr.OAuthProfile | None|)rz   r  r  rx   
isfunctionismethodcallable__call__typingget_type_hints	TypeErrorr   r   r  
annotationr   r   r   r@   
_eval_type
ForwardRefglobalslocalsr   )rM  grr  r  Z
type_hintssigr  paramr$   r$   r%   r    s8   

r  c           	      C  sp   ddl m} ddlm} ddlm} 	 || }|sdS ||k}||t| fv }t	|o1t
||}|p7|p7|S )Nr   )	EventData)r  )r  F)Zgradio.helpersr  Zgradio.oauthr  gradio.routesr  r[   r   rx   isclassr  )	r  parameter_typesr  r  r  hintZ
is_requestZis_oauth_argZis_event_datar$   r$   r%   is_special_typed_parameter  s   
r  r   rb   inputs_as_dictc              	   C  s>  t | }t| }d}d}d}|j D ];\}}	|	j|	jk}
|	j|	j|	j	fv r7t
||s6|
s2|d7 }|d7 }q|	j|	jkr@|}q|	j|	jkrO|
sOd|    S q|rTdnt|}||kro||krotd| d|  d| d ||k rtd	| d|  d| d ||kr||krtd
| d|  d| d dS dS dS )z
    Checks if the input component set matches the function
    Returns: None if valid, a string error message if mismatch
    r   r   z8Keyword-only args must have default values for function z	Expected z arguments for function z, received .zExpected at least zExpected maximum N)rx   r   r  r   r  r   r   kindPOSITIONAL_ONLYPOSITIONAL_OR_KEYWORDr  VAR_POSITIONALKEYWORD_ONLYr   warningswarn)rM  r   r  r   r  Zmin_argsZmax_argsinfinityr  r  Zhas_defaultZ	arg_countr$   r$   r%   check_function_inputs_match  s@   

r  queueCallable[P, T]c                   s   t  d	 fdd}|S )
Nr  P.argsr  P.kwargsr   r   c                    s:   | ^}}t  rt|dksd|v rtd  | i |S )Nr   Zconcurrency_countzQueue concurrency_count on ZeroGPU Spaces cannot be overridden and is always equal to Block's max_threads. Consider setting max_threads value on the Block instead)r   r   r  r  )r  r  _self
positionalr  r$   r%   r_    s   z*concurrency_count_warning.<locals>.wrapper)r  r  r  r  r   r   )ra  rb  )r  r_  r$   r  r%   concurrency_count_warning  s   r  c                   @     e Zd Zdd Zdd ZdS )TupleNoPrintc                 C     dS Nr  r$   r)   r$   r$   r%   __repr__(  r(  zTupleNoPrint.__repr__c                 C  r  r  r$   r)   r$   r$   r%   __str__+  r(  zTupleNoPrint.__str__N)r7   r8   r9   r  r  r$   r$   r$   r%   r  &  s    r  c                   @  r  )MatplotlibBackendManangerc                 C  s   t  | _t d d S )NZagg)
matplotlibget_backend_original_backenduser)   r$   r$   r%   	__enter__0  s   
z#MatplotlibBackendMananger.__enter__c                 C  s   t | j d S r(   )r  r  r  )r*   exc_typeexc_valexc_tbr$   r$   r%   __exit__4  s   z"MatplotlibBackendMananger.__exit__N)r7   r8   r9   r  r  r$   r$   r$   r%   r  /  s    r  c              	   G  s8  t   dd lm} d}d}|jddd |jdd}|jddd	|  d	|d
 t }|j||ddddd || |	d |
 d}|d}||d  }	tjdd|	tjd}	tdd|	}	td|	}
|
rt|
d}|| }tdd| d|	}	d|  d}W d    n1 sw   Y  | |	 S )Nr      i,  Zmathtextcm)Zfontset){Gz?r  )Zfigsize$)fontsizeTsvgZtightg        )dpitransparentformatZbbox_inchesZ
pad_incheszutf-8z<svg z<metadata>.*<\/metadata>r  )flagsz width="[^"]+"zheight="([\d.]+)pt"r   zheight="[\d.]+pt"zheight="zem"z<span style='font-size: 0px'>z</span>)r  Zmatplotlib.pyplotZpyplotrcZfigurer   r   ZsavefigcloseseekreaddecodeindexresubDOTALLsearchrO  r   )Zformular  Zpltr  r  Zfigr   Zxml_codeZ	svg_startZsvg_codeZheight_matchheightZ
new_heightZ	copy_coder$   r$   r%   tex2svg8  sB   


 r  
str | Pathr	   c                 C  sT   t | } |  r
| S |  ptdd | jD }|s | |  kr&t  |  S |  S )zKReturns absolute path of a str or Path path, but does not resolve symlinks.c                 s  s    | ]}|  V  qd S r(   )
is_symlink)rh   r{   r$   r$   r%   ro   d  r>  zabspath.<locals>.<genexpr>)r	   is_absoluter  r@  parentsrd   cwd)re   r  r$   r$   r%   abspath\  s   r  path_1path_2c                 C  sH   t | t |} }zt| |drW dS W dS  ty#   Y dS w )z
    True if path_1 is a descendant (i.e. located within) path_2 or if the paths are the
    same, returns False otherwise.
    Parameters:
        path_1: str or Path (should be a file)
        path_2: str or Path (can be a file or directory)
    z..FT)r  r@   relative_tor:  r  )r  r  r$   r$   r%   rl   n  s   rl   blockr   c                   s4   t | dsd S d fdd  | j}|r|jS d S )N	serializemethr   c                   s   t | tjr | jS t| s$t| rLt| dd d urLt| jdd rLt	| jj
D ]}t|tr;d|jv r;|  S | j|jv rE|  S q+t| d| } t| rntt| | jddd ddd d }t |trn|S t| d	d S )
N__self__rI   Zgradio_client__func__z	.<locals>r   r   r  __objclass__)r  ra  partialr   rx   r  	isbuiltinrw   r  getmrorI   r  r   r8   r7   r  r  	getmoduler9   splitrsplitr  )r  r  get_class_that_defined_methodr$   r%   r    s0   



z:get_serializer_name.<locals>.get_class_that_defined_method)r  r   )r/   r  r7   )r  r  r$   r  r%   get_serializer_name  s   

r  z<.*?>raw_htmlc                 C  s   t td| pdS r  )r  r  HTML_TAG_RE)r  r$   r$   r%   remove_html_tags  s   r  c                  C  sH   t  } d}| r"t | }d|tjdvr	 |S | j} |d7 }| s|S )z7
    Find the first stack frame not inside Gradio.
    r   z/gradio//r   )rx   currentframery   r  r   sepf_back)framenfnamer$   r$   r%   find_user_stack_level  s   
r  )r   r   )rU   r;   rR   )r   r   )r   r@   r   r@   )r   r   r   rE   rS   )r   r   r   r   )r   )r   r   r   r   r   r   )r   r@   r   r   )F)r   r   r  rJ   r   r   )r  r  r   r   )r  r@   r   r  )r   r   )re   r.  )rq   r3  r   r3  )r   r   r   r   )r  r@   rC  r>   )rF  r@   r   rJ   )rM  r   rN  rO  r   r   )NNNN)rM  r   r0   r   rf  r   )rj  rk  )rt  r@   ru  rv  rw  rJ   )r3   rz  r   r{  )rM  r   r   rb   r  rJ   )r  r  r   r  )re   r  r   r	   )r  r  r  r  )r  r   r   r   )r  r   r   r@   )r   rv  )yr,  
__future__r   r    r   ra  r}   rx   r   Zjson.decoderr   pkgutilr   r   r  	threadingrP  r   r  r  abcr   r   
contextlibr   ior   numbersr   pathlibr	   typesr
   r   r   r   r   r   r   r)  r  r   Zgradio_client.serializingr   Ztyping_extensionsr   rz   rh  r   Zgradio.stringsr   r  r   r   r   r  r   r  r   re   joindirnamerp   r   get_datar7   r  stripZGRADIO_VERSIONr   r   r&   r'   r;   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r$  r%  r-  r2  rA  rB  rE  rI  rL  rT  re  ri  rs  ry  r  r  r  r  r  r   r  r  r  r  rl   r  compiler  r  r  r$   r$   r$   r%   <module>   s     	

$
P









	
9


'	







9


	
)

%		
$


#
