
    	j/                      U 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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mZmZ d dlmZmZ d dlmZmZ d dlmZmZ d dlmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z% d d	l&m'Z' d dl(Z(d dl)Z)d d
l*m+Z+m,Z, d dl-m.Z.m/Z/m0Z0m1Z1m2Z2 d dl3m4Z4 d dl5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z; e!rd dl<m=Z= d dl>m?Z?  ej@        eA          ZBe!rd dlCmDZD eeEef         ZFe#d         ZGde0 dZHde/ dZIde0 dZJdZKdZLejM        N                    dd          ZOdZPdeQd<   ddgZRdeQd<   d e4 d!ZSd"ZTejU        V                    d#$          ZWe G d% d&                      ZX G d' d(          ZY G d) d*          ZZd+Z[d,Z\d-Z] G d. d/          Z^ G d0 d1          Z_ G d2 d3e`          Zae G d4 d5ea                      Zbe G d6 d7eaec                      Zddd<Zee G d= d>                      Zfe G d? d@ef                      Zge G dA dBef                      Zhe G dC dDef                      Zi edEF           G dG dH                      ZjdIdJgZkddMZl edEF           G dN dO                      ZmdPZndQZodRZpddTZqddXZrdYddZdd_Zsd`daddbZtddeZu G df dgev          ZwddjZxddkZyddoZzddsZ{e G dt du                      Z|e G dv dw                      Z}e	 ddd|            Z~e	 ddd~            ZddZddZd-ZdZdZg dZg dZddZg fddZg fddZ	 	 dddZg dddZg dddZddZddZddZddZddZddZddZddZddZddZddZddZddZddZddZ edEF           G d dej                      Z edEF           G d dej                      Z edEF           G d d                      Z edEF           G d dæ                      ZddńZddǄZddd̄ZdS )    )annotationsN)Path)asynccontextmanagercontextmanager)datetimetimezone)	dataclassfield)cached_propertypartial)	AnyAsyncIteratorDictIteratorTYPE_CHECKINGOptionalLiteralCallableUnion)	urlencode)aconnect_sseconnect_sse)AuthCredentialsFAL_QUEUE_RUN_HOSTFAL_RUN_HOSTMissingCredentialsErrorfetch_auth_credentials)__version__)Priorityadd_priority_headeradd_timeout_headeradd_hint_headerREQUEST_TIMEOUT_TYPE_HEADERREQUEST_TIMEOUT_HEADER)WebSocketClientProtocol)
Connection)Image)fal_v3cdnfalzhttps:///zwss://zhttps://rest.fal.aizhttps://v3.fal.mediaFAL_CDN_HOSTzhttps://fal.mediar(   UploadRepositoryIdDEFAULT_UPLOAD_REPOSITORYr)   r*   list[UploadRepositoryId]"DEFAULT_UPLOAD_FALLBACK_REPOSITORYzfal-client/z	 (python)   FAL_CLIENT_EXECUTOR)thread_name_prefixc                  @    e Zd ZU ded<   ded<   ded<   ded<   dd	Zd
S )CDNTokenstrtoken
token_typebase_upload_urlr   
expires_atreturnboolc                P    t          j        t          j                  | j        k    S N)r   nowr   utcr:   selfs    `/data/video-pipeline/Youtube-Video-Maker/.venv/lib/python3.11/site-packages/fal_client/client.py
is_expiredzCDNToken.is_expired[   s    |HL))T_<<    N)r;   r<   )__name__
__module____qualname____annotations__rD    rE   rC   r5   r5   T   sT         JJJOOO= = = = = =rE   r5   c                  &    e Zd Zd
dZddZddZd	S )CDNTokenManagerauthr   r;   Nonec                   || _         t          dddt          j                            t
          j                            | _        t          j	                    | _
        t           d| _        | j         j        ddd| _        d S N )tzinfor7   r8   r9   r:   z+/storage/auth/token?storage_type=fal-cdn-v3application/jsonAuthorizationAcceptContent-Type)_authr5   r   minreplacer   r@   _token	threadingLock_lockREST_URL_urlheader_value_headersrB   rM   s     rC   __init__zCDNTokenManager.__init__`   s    
 (|++8<+@@	!
 !
 !
 &/^%5%5
LLL	!Z4(.
 
rE   r5   c           	     f   t          j                    5 }|                    | j        | j        i           }|                                 |                                }d d d            n# 1 swxY w Y   t          |d         |d         |d         t          j	        |d                             S Nheadersjsonr7   r8   base_urlr:   rS   )
httpxClientpostra   rc   raise_for_statusrj   r5   r   fromisoformatrB   clientresponsedatas       rC   _refresh_tokenzCDNTokenManager._refresh_tokenp   s    \^^ 	#v{{49dm"{MMH%%'''==??D	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	#
 w-L) ,-d<.@AA	
 
 
 	
s   AA++A/2A/c                    | j         5  | j                                        r|                                 | _        | j        cd d d            S # 1 swxY w Y   d S r>   r_   r\   rD   ru   rA   s    rC   	get_tokenzCDNTokenManager.get_token}   s    Z 	 	{%%'' 4"1133;	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   9AAANrM   r   r;   rN   r;   r5   rF   rG   rH   re   ru   rx   rJ   rE   rC   rL   rL   _   P        
 
 
 
 
 
 
 
     rE   rL   c                  &    e Zd Zd
dZddZddZd	S )AsyncCDNTokenManagerrM   r   r;   rN   c                   || _         t          dddt          j                            t
          j                            | _        t          j	                    | _
        t           d| _        | j         j        ddd| _        d S rP   )rY   r5   r   rZ   r[   r   r@   r\   asyncior^   r_   r`   ra   rb   rc   rd   s     rC   re   zAsyncCDNTokenManager.__init__   s    
 (|++8<+@@	!
 !
 !
 $+<>>
LLL	!Z4(.
 
rE   r5   c           	       K   t          j                    4 d {V }|                    | j        | j        i            d {V }|                                 |                                }d d d           d {V  n# 1 d {V swxY w Y   t          |d         |d         |d         t          j	        |d                             S rg   )
rl   AsyncClientrn   ra   rc   ro   rj   r5   r   rp   rq   s       rC   ru   z#AsyncCDNTokenManager._refresh_token   sQ     $&& 	# 	# 	# 	# 	# 	# 	#&#[[DMPR[SSSSSSSSH%%'''==??D	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	#
 w-L) ,-d<.@AA	
 
 
 	
s   AA??
B	B	c                   K   | j         4 d {V  | j                                        r|                                  d {V | _        | j        cd d d           d {V  S # 1 d {V swxY w Y   d S r>   rw   rA   s    rC   rx   zAsyncCDNTokenManager.get_token   s     : 	 	 	 	 	 	 	 	{%%'' :$($7$7$9$9999999;	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   ?A""
A,/A,Nry   rz   r{   rJ   rE   rC   r~   r~      r|   rE   r~   i  @i   
   c                      e Zd Zddddd!dZed"d            Zed"d            Zed#d            Zd Zd$dZ	d"dZ
eddddd%d            Zeddddd&d             ZdS )'MultipartUploadN
chunk_sizecontent_typemax_concurrency	file_namer6   rr   httpx.Clienttoken_managerrL   r   
int | Noner   
str | Noner   r;   rN   c                   || _         || _        || _        |pt          | _        |pd| _        |pt          | _        d | _        d | _	        g | _
        d S Napplication/octet-streamr   _client_token_managerMULTIPART_CHUNK_SIZEr   r   MULTIPART_MAX_CONCURRENCYr   _access_url
_upload_id_partsrB   r   rr   r   r   r   r   s          rC   re   zMultipartUpload.__init__   ]     #+$<(<(F,F.K2K'+&*"$rE   c                <    | j         st          d          | j         S NzUpload not initiatedr   
ValueErrorrA   s    rC   
access_urlzMultipartUpload.access_url   %     	53444rE   c                <    | j         st          d          | j         S r   r   r   rA   s    rC   	upload_idzMultipartUpload.upload_id   #     	53444rE   dict[str, str]c                \    | j                                         }|j         d|j         ddS N z	fal/0.1.0rV   z
User-Agentr   rx   r8   r7   rB   r7   s     rC   auth_headerszMultipartUpload.auth_headers   s>    #--// % 0@@5;@@%
 
 	
rE   c           
        | j                                         }|j         d}t          | j        d|i | j        d| j        | j        d          }|                                }|d         | _	        |d         | _
        d S Nz/files/upload/multipartPOSTrT   )rW   rX   X-Fal-File-Nameri   r   uploadId)r   rx   r9   _maybe_retry_requestr   r   r   r   rj   r   r   )rB   r7   urlrs   results        rC   createzMultipartUpload.create   s    #--//&???'L#, $ 1#'>	  	

 

 

 !,/ ,rE   part_numberintrt   bytesc           	         | j          d| j         d| }t          | j        d|i | j        | j        dd|d           }|j        d         }| j                            ||d           d S 	N/multipart/r+   PUTidentity)rX   zAccept-Encoding)ri   contenttimeoutetag)
partNumberr   )	r   r   _requestr   r   r   ri   r   append)rB   r   rt   r   rs   r   s         rC   upload_partzMultipartUpload.upload_part   s    KKT^KKkKKL# $ 1#-  
 
 
 
 ') 	
 	
 	
 	
 	
rE   c                ~    | j          d| j         d}t          | j        d|| j        d| j        i           | j         S Nr   z	/completer   partsrh   )r   r   r   r   r   r   )rB   r   s     rC   completezMultipartUpload.complete  sX    FFT^FFFL%4;'	
 	
 	
 	
 rE   r   r   r   c          	     n   dd l } | ||||||          }	|	                                 t          j        t	          |          |	j        z            }
|j                            |	j                  5 }g }t          d|
dz             D ]P}|dz
  |	j        z  }||||	j        z            }|
                    |                    |	j        ||                     Q|j                            |          D ]}|                                 	 d d d            n# 1 swxY w Y   |	                                S )Nr   r   rr   r   r   r   r   max_workersr1   )concurrent.futuresr   mathceillenr   futuresThreadPoolExecutorr   ranger   submitr   as_completedr   r   )clsrr   r   r   rt   r   r   r   
concurrent	multipartr   executorr   r   startfutures                   rC   savezMultipartUpload.save  s    	"!!!C'!%+
 
 
	 		#d))i&::;;22!1 3 
 
 	 G$Q	22  $qI,@@EEI,@$@@AOOI$9;MM    %,99'BB     	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  !!###s   3BDDD	file_path
str | Pathc                  dd l }t          j                                      }t          j                                      }	 | ||||||                                           t          j        |	j        z            }
|j	        
                    j                  5 }g }t          d|
dz             D ]2}d
fd	}|                    |                    ||                     3|j	                            |          D ]}|                                 	 d d d            n# 1 swxY w Y                                   S )Nr   r   r   r1   pnr   r;   rN   c                    t          d          5 }| dz
  j        z  }|                    |           |                    j                  }                    | |           d d d            d S # 1 swxY w Y   d S Nrbr1   openr   seekreadr   )r   fr   rt   r   r   s       rC   _upload_partz/MultipartUpload.save_file.<locals>._upload_partQ  s    i.. 8!!#a9+? ?u vvi&:;;!--b$777	8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8s   AA22A69A6)r   r   r;   rN   )r   ospathbasenamegetsizer   r   r   r   r   r   r   r   r   r   r   r   r   )r   rr   r   r   r   r   r   r   r   sizer   r   r   r   r   r   r   s      `            @rC   	save_filezMultipartUpload.save_file2  s    	"!!!G$$Y//	wy))C'!%+
 
 
	 		$!556622!1 3 
 
 	 G$Q	22 	K 	K8 8 8 8 8 8 8 x|[IIJJJJ$,99'BB     	  	  	  	  	  	  	  	  	  	  	  	  	  	  	   !!###s   &A:D--D14D1)r   r6   rr   r   r   rL   r   r   r   r   r   r   r;   rN   r;   r6   r;   r   r   r   rt   r   r;   rN   )rr   r   r   rL   r   r6   rt   r   r   r   r   r   r   r   )rr   r   r   rL   r   r   r   r   r   r   r   r   r;   r6   rF   rG   rH   re   propertyr   r   r   r   r   r   classmethodr   r   rJ   rE   rC   r   r      s?        "&#'&*% % % % % %(       X 
    X
 
 
 
 X
- - -$
 
 
 
0	 	 	 	  $(!%&*#$ #$ #$ #$ #$ [#$J  "&#'&*($ ($ ($ ($ ($ [($ ($ ($rE   r   c                      e Zd Zddddd!dZed"d            Zed"d            Zed#d            Zd Zd$dZ	d"dZ
eddddd%d            Zeddddd&d             ZdS )'AsyncMultipartUploadNr   r   r6   rr   httpx.AsyncClientr   r~   r   r   r   r   r   r;   rN   c                   || _         || _        || _        |pt          | _        |pd| _        |pt          | _        d | _        d | _	        g | _
        d S r   r   r   s          rC   re   zAsyncMultipartUpload.__init___  r   rE   c                <    | j         st          d          | j         S r   r   rA   s    rC   r   zAsyncMultipartUpload.access_urls  r   rE   c                <    | j         st          d          | j         S r   r   rA   s    rC   r   zAsyncMultipartUpload.upload_idy  r   rE   r   c                l   K   | j                                          d {V }|j         d|j         ddS r   r   r   s     rC   r   z!AsyncMultipartUpload.auth_headers  sT      )3355555555 % 0@@5;@@%
 
 	
rE   c           
     2  K   | j                                          d {V }|j         d}| j         d {V }t	          | j        d|i |d| j        | j        d           d {V }|                                }|d         | _	        |d         | _
        d S r   )r   rx   r9   r   _async_maybe_retry_requestr   r   r   rj   r   r   )rB   r7   r   ri   rs   r   s         rC   r   zAsyncMultipartUpload.create  s      )3355555555&???)))))))3L, $ 1#'>	  	

 

 

 

 

 

 

 

 

 !,/ ,rE   r   r   rt   r   c           	        K   | j          d| j         d| }| j         d {V }t          | j        d|i || j        dd|d            d {V }|j        d         }| j                            ||d           d S r   )	r   r   r   _async_requestr   r   ri   r   r   )rB   r   rt   r   ri   rs   r   s          rC   r   z AsyncMultipartUpload.upload_part  s      KKT^KKkKK)))))))'L $ 1#-  
 
 
 
 
 
 
 
 
 
 ') 	
 	
 	
 	
 	
rE   c                   K   | j          d| j         d}| j         d {V }t          | j        d||d| j        i           d {V  | j         S r   )r   r   r   r  r   r   )rB   r   ri   s      rC   r   zAsyncMultipartUpload.complete  s      FFT^FFF)))))))(L4;'
 
 
 	
 	
 	
 	
 	
 	
 	
 rE   r   c                 
K    | ||||||                                            d {V  t          j        t                    j        z            }dfdfdt          d|dz             D             }	t          j        j                  fd	
t          j	        
fd
|	D               d {V  
                                 d {V S )Nr   r   r   r;   rN   c                   K   | dz
  j         z  }||j         z            }                    | |           d {V  d S )Nr1   )r   r   )r   r   chunkrt   r   s      rC   r   z.AsyncMultipartUpload.save.<locals>.upload_part  s]       1_	(<<E)=!==>E''U;;;;;;;;;;;rE   c                J    g | ]}t          j         |                     S rJ   r   create_task.0r   r   s     rC   
<listcomp>z-AsyncMultipartUpload.save.<locals>.<listcomp>  >     
 
 
 K 8 899
 
 
rE   r1   c                v   K   4 d {V  |  d {V  d d d           d {V  d S # 1 d {V swxY w Y   d S r>   rJ   tasksems    rC   bounded_uploadz1AsyncMultipartUpload.save.<locals>.bounded_upload                






                                	(
22c                &    g | ]} |          S rJ   rJ   r  r  r  s     rC   r  z-AsyncMultipartUpload.save.<locals>.<listcomp>  #    FFF~~d33FFFrE   r   r   r;   rN   )r   r   r   r   r   r   r   	Semaphorer   gatherr   )r   rr   r   r   rt   r   r   r   r   tasksr  r   r  r   s       `     @@@@rC   r   zAsyncMultipartUpload.save  sY      C'!%+
 
 
	          	#d))i&::;;	< 	< 	< 	< 	< 	< 	<

 
 
 
$Q	22
 
 
 	 9::	 	 	 	 	 nFFFFFFFGGGGGGGG'')))))))))rE   r   r   c                 K   t           j                                      }t           j                                      } | ||||||                                           d {V  t          j        |j        z            }	dfdfdt          d|	dz             D             }
t          j
        j                  fd	t          j        fd
|
D               d {V                                   d {V S )Nr   r   r   r;   rN   c                  K   t          d          5 }| dz
  j        z  }|                    |           |                    j                  }                    | |           d {V  d d d            d S # 1 swxY w Y   d S r   r   )r   r   r   rt   r   r   s       rC   r   z3AsyncMultipartUpload.save_file.<locals>.upload_part  s      i&& ?!$qI,@@uvvi233++K>>>>>>>>>	? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?s   AA::A>A>c                J    g | ]}t          j         |                     S rJ   r
  r  s     rC   r  z2AsyncMultipartUpload.save_file.<locals>.<listcomp>	  r  rE   r1   c                v   K   4 d {V  |  d {V  d d d           d {V  d S # 1 d {V swxY w Y   d S r>   rJ   r  s    rC   r  z6AsyncMultipartUpload.save_file.<locals>.bounded_upload  r  r  c                &    g | ]} |          S rJ   rJ   r  s     rC   r  z2AsyncMultipartUpload.save_file.<locals>.<listcomp>  r  rE   r  )r   r   r   r   r   r   r   r   r   r   r  r   r  r   )r   rr   r   r   r   r   r   r   r   r   r  r  r   r  r   s      `       @@@@rC   r   zAsyncMultipartUpload.save_file  s{      G$$Y//	wy))C'!%+
 
 
	          	$!5566	? 	? 	? 	? 	? 	? 	?
 
 
 
$Q	22
 
 
 	 9::	 	 	 	 	 nFFFFFFFGGGGGGGG'')))))))))rE   )r   r6   rr   r   r   r~   r   r   r   r   r   r   r;   rN   r   r   r   )rr   r   r   r~   r   r6   rt   r   r   r   r   r   r   r   r;   r6   )rr   r   r   r~   r   r   r   r   r   r   r   r   r;   r6   r   rJ   rE   rC   r   r   ^  s?        "&#'&*% % % % % %(       X 
    X
 
 
 
 X
- - -&
 
 
 
2
 
 
 
  $(!%&*(* (* (* (* (* [(*T  "&#'&*+* +* +* +* +* [+* +* +*rE   r   c                      e Zd ZdS )FalClientErrorNrF   rG   rH   rJ   rE   rC   r$  r$    s        DrE   r$  c                  @    e Zd ZU ded<   ded<   ded<   ded<   dd
ZdS )FalClientHTTPErrorr6   messager   status_coder   response_headershttpx.Responsers   r;   c                    | j          S r>   )r(  rA   s    rC   __str__zFalClientHTTPError.__str__$  s    ,  rE   Nr   )rF   rG   rH   rI   r-  rJ   rE   rC   r'  r'    sW         LLL$$$$! ! ! ! ! !rE   r'  c                  0    e Zd ZU ded<   dZded<   d	dZdS )
FalClientTimeoutErrorfloatr   NOptional[str]
request_idr;   r6   c                L    | j         d| j         dS d| j          d| j         dS )NzRequest timed out after z secondszRequest z timed out after )r2  r   rA   s    rC   r-  zFalClientTimeoutError.__str__-  s:    ?"DdlDDDDVdoVVVVVVrE   r   )rF   rG   rH   rI   r2  r-  rJ   rE   rC   r/  r/  (  sJ         NNN $J$$$$W W W W W WrE   r/  rs   r+  r;   rN   c                (   	 |                                   d S # t          j        $ rj}	 |                                 d         }n# t          t
          f$ r
 | j        }Y nw xY wt          || j        t          | j
                  |           |d }~ww xY w)Ndetailrs   )ro   rl   HTTPStatusErrorrj   r   KeyErrortextr'  r)  dictri   )rs   excmsgs      rC   _raise_for_statusr=  4  s    !!#####    	 --//(+CCH% 	  	  	 -CCC	  !  !""
 
 
 	s2    BABABA.BBc                      e Zd ZdS )StatusNr%  rJ   rE   rC   r?  r?  G  s        crE   r?  c                      e Zd ZU dZded<   dS )QueuedzIndicates the request is enqueued and waiting to be processed. The position
    field indicates the relative position in the queue (0-indexed).r   positionN)rF   rG   rH   __doc__rI   rJ   rE   rC   rA  rA  K  s'         G G MMMMMrE   rA  c                  2    e Zd ZU dZ e            Zded<   dS )
InProgresszIndicates the request is currently being processed. If the status operation called
    with the `with_logs` parameter set to True, the logs field will be a list of
    log objects.list[dict[str, Any]] | NonelogsN)rF   rG   rH   rC  r
   rG  rI   rJ   rE   rC   rE  rE  S  s5          
 ).D//////rE   rE  c                  P    e Zd ZU dZ e            Zded<    e            Zded<   dS )	Completeda2  Indicates the request has been completed and the result can be gathered. The logs field will
    contain the logs if the status operation was called with the `with_logs` parameter set to True. Metrics
    might contain the inference time, and other internal metadata (number of tokens
    processed, etc.).rF  rG  dict[str, Any]metricsN)rF   rG   rH   rC  r
   rG  rI   rK  rJ   rE   rC   rI  rI  ]  sL          
 ).D////#eggG%%%%%%rE   rI  T)frozenc                      e Zd ZU ded<    ed          Zded<    ed          Zded<    ed          Zded<   ddZdS )_BaseRequestHandler6   r2  Freprresponse_url
status_url
cancel_urlrt   AnyJSONr;   r?  c                ,   |d         dk    rt          |d                   S |d         dk    rt          |d                   S |d         dk    r-|                    d	i           }t          |d         |
          S t	          d|d                    )NstatusIN_QUEUEqueue_position)rB  IN_PROGRESSrG  )rG  	COMPLETEDrK  )rG  rK  zUnknown status: )rA  rE  getrI  r   )rB   rt   rK  s      rC   _parse_statusz _BaseRequestHandle._parse_statuso  s    >Z''4(8#9::::(^},,4<0000(^{**hhy"--G$v,@@@@@X@@AAArE   N)rt   rT  r;   r?  )	rF   rG   rH   rI   r
   rQ  rR  rS  r\  rJ   rE   rC   rN  rN  h  s         OOO5)))L))))e'''J''''e'''J''''
B 
B 
B 
B 
B 
BrE   rN  	workflowscomfyidr6   c                    dd l }|                     d          }t          |          dk    r| S |                    d|           }|r|                                \  }}| d| S t          d|  d          )Nr   r+   r1   z^([0-9]+)-([a-zA-Z0-9-]+)$zInvalid app id: z*. Must be in the format <appOwner>/<appId>)resplitr   matchgroupsr   )r_  ra  r   rc  	app_ownerapp_ids         rC   _ensure_app_id_formatrg    s    IIIHHSMME
5zzA~~	HH2B77E '!LLNN	6&&f&&&
VVVV
W
WWrE   c                  P    e Zd ZU ded<   ded<   ded<   ded<   edd	            Zd
S )AppIdr6   owneraliasr1  r   	namespaceendpoint_idr;   c           	     T   t          |          }|                    d          }|d         t          v r> | |d         |d         d                    |dd                    pd |d                   S  | |d         |d         d                    |dd                    pd d           S )Nr+   r   r1         )rj  rk  r   rl  )rg  rb  APP_NAMESPACESjoin)r   rm  normalized_idr   s       rC   from_endpoint_idzAppId.from_endpoint_id  s    -k::##C((8~%%3AhAhXXeABBi((0D(	    s((%)$$,	
 
 
 	
rE   N)rm  r6   r;   ri  )rF   rG   rH   rI   r   rt  rJ   rE   rC   ri  ri    s^         JJJJJJ
 
 
 [
 
 
rE   ri  x   g     V@)r1   <   rf  c                x    | j         r
| j          dnd}| j        r
d| j         nd}| | j         d| j         | S )Nr+   rQ   )rl  r   rj  rk  )rf  prefixsuffixs      rC   _format_app_pathrz    s^    '-'7? ####RF"(+52F;fl;;V\;6;;;rE   valuer   r   c                    | d S t           \  }}|| cxk    r|k    sn t          d| d| d          t          |           S )Nzmax_buffering must be between z and z (inclusive))REALTIME_MAX_BUFFERINGr   r6   )r{  	min_value	max_values      rC   _serialize_max_bufferingr    sk    }t1Iy++++)++++TYTTYTTT
 
 	
 u::rE   rQ   r   max_bufferingapplicationr7   r   r  c                  t                               |           }t          |          }t           | }|r|d|                    d          z   z  }i }|r||d<   t          |          }|||d<   |r| dt          |           S |S )Nr+   fal_jwt_tokenr  ?)ri  rt  rz  REALTIME_URL_FORMATlstripr  r   )	r  r7   r   r  rf  app_pathr   queryserialized_bufferings	            rC   _build_runner_ws_urlr    s     ##K00F''H 
,(
,
,C &sT[[%%%%E '!&o3MBB'!5o +**	%((***JrE   realtimer   c               (    t          | |||          S )Nr  )r  )r  r7   r  r   s       rC   _build_realtime_urlr    s'      #	   rE   rt   r   c                8   t          | t                    r| S t          | t                    r`t          |                     d          t                    r| d         S t          |                     d          t                    r| d         S t	          d          )Nr7   r5  z)Unexpected realtime token response format)
isinstancer6   r:  r[  RuntimeError)rt   s    rC   _parse_token_responser    s    $ $ "dhhw''-- 	!= dhhx((#.. 	">!
B
C
CCrE   c                  *     e Zd ZdZ	 	 d
d fd	Z xZS )RealtimeErrorz9Raised when the realtime endpoint sends an error payload.Nerrorr6   reasonr   payloadOptional[dict[str, Any]]c                    || _         |pd| _        |pi | _        | j        s|n| d| j         }t                                          |           d S )NrQ   z: )r  r  r  superre   )rB   r  r  r  r(  	__class__s        rC   re   zRealtimeError.__init__  s`     
l}"#{I%%50I0IDK0I0I!!!!!rE   )NN)r  r6   r  r   r  r  )rF   rG   rH   rC  re   __classcell__)r  s   @rC   r  r    sP        CC
 ",0	
" 
" 
" 
" 
" 
" 
" 
" 
" 
" 
"rE   r  r(  r   c                8    dd l }|                    | d          S )Nr   F)raw)msgpackunpackbr(  r  s     rC   msgpack_decode_messager    s!    NNN??7?...rE   c                8    dd l }|                    | d          S )Nr   T)use_bin_type)r  packbr  s     rC   msgpack_encode_messager    s!    NNN==t=444rE   decode_messageCallable[[bytes], Any] | Nonedict[str, Any] | Nonec                    t          | t                    r|                                 } t          | t          t          f          r|pt
          } ||           S t          | t                    r	 t          j        |           }n# t          j	        $ r d| dcY S w xY w|
                    d          }|dk    r8t          |
                    dd          |
                    d          |          |dk    rd S |S d	| iS )
Nr9  )typer  r  zx-fal-errorr  UNKNOWN_ERRORr  zx-fal-messager  )r  
memoryviewtobytesr   	bytearrayr  r6   rj   loadsJSONDecodeErrorr[  r  )r(  r  decoder  msg_types        rC   _decode_realtime_messager    s$    ':&& $//##'E9-.. 9#9vg'3 	8j))GG# 	8 	8 	8"w77777	8 ;;v&&}$$G_55H%%  
 &&4ws   0B BBrJ  encode_messageCallable[[Any], bytes] | Nonec                *    |pt           } ||           S r>   )r  )r(  r  encodes      rC   _encode_realtime_messager  -  s     55F6'??rE   c                  b    e Zd ZU dZded<   dZded<   dZded<   ddZddZddZ	ddZ
ddZdS )RealtimeConnectionz(Synchronous realtime connection wrapper.z'Connection'_wsNr  _encode_messager  _decode_message	argumentsrJ  r;   rN   c                d    t          || j                  }| j                            |           d S r>   r  r  r  sendrB   r  r  s      rC   r  zRealtimeConnection.send=  s.    *9d6JKKgrE   r  c                ,   	 	 | j                                         }n_# t          $ rR}ddlm}m} t          ||          rY d }~d S t          ||          rt          dt          |                    | d }~ww xY wt          || j
                  }||S NTr   )ConnectionClosedConnectionClosedOKCONNECTION_CLOSEDr  recv	Exceptionwebsockets.exceptionsr  r  r  r  r6   r  r  rB   rs   r;  r  r  decodeds         rC   r  zRealtimeConnection.recvA  s    	8==?? 
 
 
       
 c#566  44444c#344 P'(;SXXFFCO
 /x9MNNGNs    
A9A4/A44A9c                h    t          | j        dd           }t          |          r |             d S d S Nclosegetattrr  callablerB   r  s     rC   r  zRealtimeConnection.closeU  s<    '400E?? 	EGGGGG	 	rE   c                    | S r>   rJ   rA   s    rC   	__enter__zRealtimeConnection.__enter__Z  s    rE   c                .    |                                   d S r>   r  rB   exc_typer;  tbs       rC   __exit__zRealtimeConnection.__exit__]  s    

rE   r  rJ  r;   rN   r;   r  r;   rN   )r;   r  )rF   rG   rH   rC  rI   r  r  r  r  r  r  r  rJ   rE   rC   r  r  5  s         2259O999959O9999      (   
        rE   r  c                  b    e Zd ZU dZded<   dZded<   dZded<   ddZddZddZ	ddZ
ddZdS )AsyncRealtimeConnectionz)Asynchronous realtime connection wrapper.z'WebSocketClientProtocol'r  Nr  r  r  r  r  rJ  r;   rN   c                t   K   t          || j                  }| j                            |           d {V  d S r>   r  r  s      rC   r  zAsyncRealtimeConnection.sendi  sD      *9d6JKKhmmG$$$$$$$$$$$rE   r  c                <  K   	 	 | j                                          d {V }n_# t          $ rR}ddlm}m} t          ||          rY d }~d S t          ||          rt          dt          |                    | d }~ww xY wt          || j
                  }||S r  r  r  s         rC   r  zAsyncRealtimeConnection.recvm  s      	!%000000 
 
 
       
 c#566  44444c#344 P'(;SXXFFCO
 /x9MNNGNs   % 
BA</A<<Bc                x   K   t          | j        dd           }t          |          r |             d {V  d S d S r  r  r  s     rC   r  zAsyncRealtimeConnection.close  sL      '400E?? 	%''MMMMMMMMM	 	rE   c                
   K   | S r>   rJ   rA   s    rC   
__aenter__z"AsyncRealtimeConnection.__aenter__  s      rE   c                >   K   |                                   d {V  d S r>   r  r  s       rC   	__aexit__z!AsyncRealtimeConnection.__aexit__  s,      jjllrE   r  r  r  )r;   r  )rF   rG   rH   rC  rI   r  r  r  r  r  r  r  rJ   rE   rC   r  r  a  s         33""""59O999959O9999% % % %   (   
        rE   r  r   ri   dict[str, str] | NoneIterator['Connection']c              #     K   ddl m} |                    | |t          d           5 }|V  d d d            d S # 1 swxY w Y   d S )Nr   )rr   additional_headersopen_timeoutmax_size)websockets.syncrr   connectREALTIME_OPEN_TIMEOUT)r   ri   rr   wss       rC   _connect_sync_wsr    s       '&&&&&	"*	 
 
 
 
 
                 s   9= =(AsyncIterator['WebSocketClientProtocol']c                  K   dd l }|                    | |t          d           4 d {V 	 }|W V  d d d           d {V  d S # 1 d {V swxY w Y   d S )Nr   r  )
websocketsr  r  )r   ri   r  r  s       rC   _connect_async_wsr    s	      !!"*	 "          
 
                             s   A
AArr   r   methodkwargsc                B     | j         ||fi |}t          |           |S r>   requestr=  rr   r  r   r  rs   s        rC   r   r     s2     v~fc44V44HhOrE   r   c                R   K    | j         ||fi | d {V }t          |           |S r>   r  r  s        rC   r  r    sH       $V^FC::6::::::::HhOrE   皙?   )i  i  i  )i  i    r<   c                R    | j         t          vrdS d| j        v rdS d| j        v rdS dS )z-Tell apart ingress errors from client errors.Fzx-fal-request-idnginxT)r)  INGRESS_ERROR_CODESri   r9  r6  s    rC   _is_ingress_errorr	    sD     #666uX---u (-t5rE   extra_retry_codes	list[int]c                    | j         dk    r!| j                            t                    rdS t	          |           rdS | j         t
          v s	| j         |v rdS dS )Nr  FT)r)  ri   r[  r#   r	  RETRY_CODES)rs   r
  s     rC   _should_retry_responser    so    
 s""x'7';';#( (" u"" t{**h.BFW.W.Wt5rE   r;  r  c                h   t          | t          j                  rE	 | j        }t          |t          j                  rt
          |j        v rdS n# t          $ r Y nw xY wdS t          | t          j                  rdS t          | t          j	        t          f          rt          | j        |          S dS )NFT)r  rl   TimeoutExceptionr   Requestr$   ri   r  TransportErrorr7  r'  r  rs   )r;  r
  r   s      rC   _should_retryr    s    #u-.. 		kG'5=11 !)W_<< 5 	 	 	D	t#u+,, t#-/ABCC G%cl4EFFF5s   /A 
AAexponentialF	num_retryr   
base_delayr0  	max_delaybackoff_typeLiteral['exponential', 'fixed']jitterc                    |dk    rt          |d| dz
  z  z  |          }nt          ||          }|r|t          j        dd          z  }t          ||          S )Nr  ro  r1   g      ?g      ?)rZ   randomuniform)r  r  r  r  r  delays         rC   _get_retry_delayr    sk     }$$J!	A"67CCJ	** *S)))ui   rE   )r
  c                  t          dt          dz             D ]}	 t          | ||fi |c S # t          j        t
          f$ r}t          ||          rm|t          k     rbt          |t          t          dd          }t                              d| d| dt          |z
   d           t          j        |           Y d }~ d }~ww xY wt          d          )	Nr1   r  TRetrying request to  due to  ( attempts left)Failed to perform request)r   MAX_ATTEMPTSr   rl   	HTTPErrorr'  r  r  
BASE_DELAY	MAX_DELAYloggerdebugtimesleepr  rr   r  r   r
  r  attemptr;  r  s           rC   r   r     s    L1,--  	FFC::6:::::!34 
	 
	 
	S"344 <9O9O(ZM4  f3ffff|g?Ufff   
5!!!
	 2
3
33s   -CA8C CCc                 K   t          dt          dz             D ]}	 t          | ||fi | d {V c S # t          j        t
          f$ r}t          ||          ri|t          k     r^t          |dddd          }t          	                    d| d| dt          |z
   d	           t          j        |           d {V  Y d }~ d }~ww xY wt          d
          )Nr1   r  r   r  Tr!  r"  r#  r$  r%  )r   r&  r  rl   r'  r'  r  r  r*  r+  r   r-  r  r.  s           rC   r  r  (  s2      L1,--  
	'FFvFFFFFFFFFFF!34 	 	 	S"344 <9O9O(#r=$OOf3ffff|g?Ufff   mE*********	 2
3
33s   5C
A4CCC
rM   r   c                ^    | j                                         dk    r
d| j         S | j        S )NkeyzBearer )schemelowerr7   rb   rM   s    rC   _cdn_auth_headerr6  @  s4    {e##%%%%rE   r   r   r   c                8    |t          |           d}|||d<   |S )N)rX   rV   r   )r6  )rM   r   r   ri   s       rC   _cdn_upload_headersr8  F  s0      ,>Nt>T>TUUG%.!"NrE   c                    | j         dddS )NrT   rU   )rb   r5  s    rC   _storage_upload_headersr:  O  s    *$*  rE   
repositoryUploadRepositoryId | Nonefallback_repository4UploadRepositoryId | list[UploadRepositoryId] | Nonec                    h d}| t           } |t          }nt          |t                    s|g}| g|}g }|D ]2}||vrt	          d| d          ||vr|                    |           3|S )N>   r)   r*   r(   zUnsupported upload repository '')r.   r0   r  listr   r   )r;  r=  allowedordereddedupedentrys         rC   _normalize_upload_repositoriesrF  W  s     '&&G.
"@+T22 4230/0G(*G " "GuGGGHHHNN5!!!NrE   c                    | pd|dS )N
upload.binr   r   rJ   rI  s     rC   _storage_upload_payloadrJ  n  s    .,$  rE   c          	         t          | dt           dt          ||          t          |                    }|                                }|d         }|d         }t          | d||d|id            |S 	Nr   z)/storage/upload/initiate?storage_type=gcs)rj   ri   
upload_urlfile_urlr   rX   )r   ri   r   )r   r`   rJ  r:  rj   	rr   rM   rt   r   r   init_responseinit_resultrM  rN  s	            rC   _upload_via_storagerR  u  s     )>>>$Y=='--  M  $$&&K\*J:&H.    OrE   c          	       K   t          | dt           dt          ||          t          |                     d {V }|                                }|d         }|d         }t          | d||d|id            d {V  |S rL  )r  r`   rJ  r:  rj   rO  s	            rC   _async_upload_via_storagerT    s       5>>>$Y=='--        M  $$&&K\*J:&H
$.          OrE   c               n    t          | dt          dz   ||          }|                                d         S Nr   z/files/upload)r   ri   r   )r   CDN_URLrj   rr   rt   ri   rs   s       rC   
_upload_v3rY    sA     $/!  H ==??<((rE   c                   t          | dt          dz   |t          |||                    }|                                d         S rV  )r   FAL_CDN_FALLBACK_URLr8  rj   rr   rM   rt   r   r   rs   s         rC   _upload_cdnr]    sM     $.#D,	BB  H ==??<((rE   c               ~   K   t          | dt          dz   ||           d {V }|                                d         S rV  )r  rW  rj   rX  s       rC   _async_upload_v3r_    sc       0/!        H ==??<((rE   c                  K   t          | dt          dz   |t          |||                     d {V }|                                d         S rV  )r  r[  r8  rj   r\  s         rC   _async_upload_cdnra    so       0.#D,	BB        H ==??<((rE   attempts#list[tuple[str, Callable[[], str]]]c           	        t          |           D ]n\  }\  }}	  |            c S # t          $ rM}|t          |           dz
  k    r t                              d|| |dz            d         |           Y d }~gd }~ww xY wt          d          Nr1   z+Upload failed to %s, falling back to %s: %sr   zUpload attempts were exhausted)	enumerater  r   r*  warningr  )rb  idxlabelr/  r;  s        rC   _try_upload_with_fallbackrj    s     "+8!4!4  eW
	799 	 	 	c(mma'''NN=q!!$	       	 7
8
88s   	%
A<AA77A<#list[tuple[str, Callable[[], Any]]]c           	     `  K   t          |           D ]\  }\  }}	  |            }t          j        |          r
| d {V c S |c S # t          $ rM}|t	          |           dz
  k    r t
                              d|| |dz            d         |           Y d }~d }~ww xY wt          d          re  )rf  r   iscoroutiner  r   r*  rg  r  )rb  rh  ri  r/  r   r;  s         rC   _async_try_upload_with_fallbackrn    s       "+8!4!4  eW	WYYF"6** $#||||||###MMM 	 	 	c(mma'''NN=q!!$	       	 7
8
88s   %AA
BABBhandleSyncRequestHandlec                R    	 |                                   d S # t          $ r Y d S w xY wr>   cancelr  ro  s    rC   _maybe_cancel_requestru    s:       s    
&&AsyncRequestHandlec                b   K   	 |                                   d {V  d S # t          $ r Y d S w xY wr>   rr  rt  s    rC   _async_maybe_cancel_requestrx  !  sS      mmoo   s     
..c                  x    e Zd ZU  ed          Zded<   edd	            Zdd
ddZdddddZ	ddZ
ddZdS )rp  FrO  r   rr   r  r6   r2  r;   c                    t                               |          }|j        r
|j         dnd}t           | |j         d|j         d| } | |||dz   |dz   |          S Nr+   rQ   z
/requests/z/statusz/cancelr2  rQ  rR  rS  rr   ri  rt  rl  QUEUE_URL_FORMATrj  rk  r   rr   r  r2  rf  rx  rk   s          rC   from_request_idz!SyncRequestHandle.from_request_id,       ''44+1+;CF$''''&ccccv|ccWaccs!!)+)+
 
 
 	
rE   	with_logsr  r<   r?  c                   t          | j        d| j        d|i          }t          |           |                     |                                          S )Returns the status of the request (which can be one of the following:
        Queued, InProgress, Completed). If `with_logs` is True, logs will be included
        for InProgress and Completed statuses.GETrG  params)r   rr   rR  r=  r\  rj   rB   r  rs   s      rC   rV  zSyncRequestHandle.status>  s[    
 (KO		
 
 
 	(###!!(--//222rE   r  r  intervalr  r0  Iterator[Status]c             #     K   	 |                      |          }|V  t          |t                    rdS t          j        |           FzContinuously poll for the status of the request and yield it at each interval till
        the request is completed. If `with_logs` is True, logs will be included in the response.
        Tr  N)rV  r  rI  r,  r-  rB   r  r  rV  s       rC   iter_eventszSyncRequestHandle.iter_eventsO  sS      	![[9[55FLLL&),, Jx   	!rE   rT  c                    |                      d          D ]}t          | j        d| j                  }t	          |           |                                S )zOWait till the request is completed and return the result of the inference call.Fr  r  )r  r   rr   rQ  r=  rj   rB   _rs   s      rC   r[  zSyncRequestHandle.get^  sW    !!E!22 	 	A'UD<MNN(###}}rE   rN   c                Z    t          | j        d| j                  }t          |           dS zCancel the request.r   N)r   rr   rS  r=  rB   rs   s     rC   rs  zSyncRequestHandle.cancelg  s4    'KO
 

 	(#####rE   N)rr   r   r  r6   r2  r6   r;   rp  r  r<   r;   r?  )r  r<   r  r0  r;   r  r;   rT  r  rF   rG   rH   r
   rr   rI   r   r  rV  r  r[  rs  rJ   rE   rC   rp  rp  (  s          5e,,,F,,,,
 
 
 [
" +0 3 3 3 3 3 3$ $)C! ! ! ! ! !   $ $ $ $ $ $rE   c                  x    e Zd ZU  ed          Zded<   edd	            Zdd
ddZdddddZ	ddZ
ddZdS )rv  FrO  r   rr   r  r6   r2  r;   c                    t                               |          }|j        r
|j         dnd}t           | |j         d|j         d| } | |||dz   |dz   |          S r{  r}  r  s          rC   r  z"AsyncRequestHandle.from_request_idu  r  rE   r  r  r<   r?  c                  K   t          | j        d| j        d|i           d{V }t          |           |                     |                                          S )r  r  rG  r  N)r  rr   rR  r=  r\  rj   r  s      rC   rV  zAsyncRequestHandle.status  s}      
 4KO		
 
 
 
 
 
 
 
 
 	(###!!(--//222rE   r  r  r  r0  AsyncIterator[Status]c                 K   	 |                      |           d{V }|W V  t          |t                    rdS t          j        |           d{V  Sr  )rV  r  rI  r   r-  r  s       rC   r  zAsyncRequestHandle.iter_events  sy      	*;;;;;;;;;;;FLLLL&),, -)))))))))	*rE   rT  c                   K   |                      d          2 3 d{V }6 t          | j        d| j                   d{V }t	          |           |                                S )z9Wait till the request is completed and return the result.Fr  Nr  )r  r  rr   rQ  r=  rj   r  s      rC   r[  zAsyncRequestHandle.get  s      ''%'88 	 	 	 	 	 	 	! 9 4K
 
 
 
 
 
 
 

 	(###}}s   !rN   c                j   K   t          | j        d| j                   d{V }t          |           dS r  )r  rr   rS  r=  r  s     rC   rs  zAsyncRequestHandle.cancel  sV      3KO
 
 
 
 
 
 
 

 	(#####rE   N)rr   r   r  r6   r2  r6   r;   rv  r  )r  r<   r  r0  r;   r  r  r  r  rJ   rE   rC   rv  rv  q  s          %5 1 1 1F1111
 
 
 [
" 16 3 3 3 3 3 3$ $)C* * * * * *   $ $ $ $ $ $rE   c            
         e Zd ZU  edd          Zded<   dZded<   edad            ZdadZ	dbdZ
edcd            Zeddd            ZdddZeddedZddddi ddfd$Zddddi dd%dgd*Zddddddi ddd+	dhd3Zdid5Zdd6djd8Zdkd9Zdld;Zd<dd=dmd@Z	 dndddAdodJZdddAdpdLZ	 dqdddAdrdQZedRdSdedddTdsd]            ZedRdded^dtd`            ZdS )ur   NFdefaultrP  r   r2        ^@r0  default_timeoutr;   r   c                V    | j         t                      S t          d| j                   S NKeyr2  r   r   rA   s    rC   rY   zAsyncClient._auth  (    8)+++udh///rE   c                    | j         S r>   rY   rA   s    rC   	_get_authzAsyncClient._get_auth  
    zrE   r6   c                    |                                  }|j                                        dk    rt          d          |j        S Nr2  zZKey credentials are required for this operation. Set FAL_KEY or FAL_KEY_ID/FAL_KEY_SECRET.r  r3  r4  r   r7   rd   s     rC   _get_keyzAsyncClient._get_key  I    ~~;%'')l   zrE   r~   c                D    t          |                                           S r>   )r~   r  rA   s    rC   r   zAsyncClient._token_manager  s    #DNN$4$4555rE   r   c                z    |                                  }t          j        |j        t          d| j                  S )Nr   ri   r   )r  rl   r   rb   
USER_AGENTr  rd   s     rC   r   zAsyncClient._client  sF    ~~ !%!2(  (
 
 
 	
rE   c                   K   | j                                          d {V }t          j        |j         d|j         t          d| j                  S Nr   r   r  )r   rx   rl   r   r8   r7   r  r  r   s     rC   _get_cdn_clientzAsyncClient._get_cdn_client  sq      )3355555555 $)$4!D!Du{!D!D(  (
 
 
 	
rE   token_expirationr  r  r   c                  K   t                               |          j        g|d}t          | j        dt
           d|           d {V }t          |                                          S N)allowed_appsr  r   z/tokens/)rj   )ri  rt  rk  r  r   r`   r  rj   rB   r  r  r  rs   s        rC   _get_realtime_tokenzAsyncClient._get_realtime_token  s       #33K@@FG 0
 
 4L!!!	
 
 
 
 
 
 
 
 
 %X]]__555rE   rQ   r   r   start_timeouthintri   r  rT  r   r   Optional[Union[int, float]]r  r  ri   r   c               *  K   t           |z   }|r|d|                    d          z   z  }i |}	|t          ||	           |t          ||	           t	          | j        d||||	           d{V }
t          |
           |
                                S )ad  Run an application with the given arguments (which will be JSON serialized). The path parameter can be used to
        specify a subpath when applicable. This method will return the result of the inference call directly.

        Args:
            timeout: Client-side HTTP timeout in seconds. Controls how long the HTTP
                client waits for a response. Defaults to the client's default_timeout.
            start_timeout: Server-side request timeout in seconds. Limits total time spent
                waiting before processing starts. Does not apply once the application begins processing.
        r+   Nr   rj   r   ri   )RUN_URL_FORMATr  r"   r!   r  r   r=  rj   rB   r  r  r   r   r  r  ri   r   rc   rs   s              rC   runzAsyncClient.run  s      * {* 	*3S))))C#.g; D(+++$}h7773L
 
 
 
 
 
 
 
 
 	(###}}rE   r   r  webhook_urlpriorityri   r  r  r  Optional[Priority]rv  c                 K   t           |z   }	|r|	d|                    d          z   z  }	||	dt          d|i          z   z  }	i |}
|t          ||
           |t	          ||
           |t          ||
           t          | j        d|	|| j        |
           d{V }t          |           |
                                }t          |d         |d         |d	         |d
         | j                  S )aP  Submit an application with the given arguments (which will be JSON serialized). The path parameter can be used to
        specify a subpath when applicable. This method will return a handle to the request that can be used to check the status
        and retrieve the result of the inference call when it is done.

        Args:
            start_timeout: Server-side request timeout in seconds. Limits total time spent
                waiting before processing starts (includes queue wait, retries, and
                routing). Does not apply once the application begins processing.
        r+   Nr  fal_webhookr   r  r2  rQ  rR  rS  r|  )r~  r  r   r"   r    r!   r  r   r  r=  rj   rv  rB   r  r  r   r  r  r  ri   r  r   rc   rs   rt   s                rC   r   zAsyncClient.submit-  sF     , , 	*3S))))C"3M;#?@@@@C#.g; D(+++(333$}h7773L(
 
 
 
 
 
 
 
 
 	(###}}!L)n-L)L)<
 
 
 	
rE   	r   r  r  
on_enqueueon_queue_updater  ri   r  client_timeoutr  r<   r  Optional[Callable[[str], None]]r  "Optional[Callable[[Status], None]]r  c       	           	
K   |.
|
n)
|k    r#t          j        d
 d| dt          d           dgd	 
fd	}| |             d{V S 	 t          j         |            |
           d{V S # t          j        $ r?}d}d         }||j        }t          |           d{V  t          ||          |d}~ww xY w)<  Subscribe to an application and wait for the result.

        Args:
            start_timeout: Server-side request timeout in seconds. Limits total time spent
                waiting before processing starts (includes queue wait, retries, and
                routing). Does not apply once the application begins processing.
            client_timeout: Client-side total timeout in seconds. Limits the total time
                spent waiting for the entire request to complete (including queue wait
                and processing). If not set, waits indefinitely.
        Nstart_timeout ("s) is larger than client_timeout (Ts). The request may timeout on the client before the server-side timeout is reached.ro  
stacklevelr;   rT  c            	       K                        	
           d {V } | d<    | j                   *|                               2 3 d {V } |           6 |                                  d {V S N)r   r  r  ri   r  r   r  r   r2  r  r[  ro  eventr  r  
handle_refri   r  r  r  r   r  rB   r  r  s     rC   _do_subscribez,AsyncClient.subscribe.<locals>._do_subscribe  s      ;;!+ '        F #JqM%
6,---*#)#5#5	#5#J#J + + + + + + +%#OE**** $K  %%%%%%%s   A(r   r   r   r2  r  )	warningswarnUserWarningr   wait_forTimeoutErrorr2  rx  r/  )rB   r  r  r   r  r  r  r  r  ri   r  r  r  er2  ro  r  s   ```````````     @rC   	subscribezAsyncClient.subscribei  s     2 %$ .//gm g gWe g g g 	    ;?
	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	&* !&(((((((	 )--//>RRRRRRRRRR# 
	 
	 
	J]F!#.
1&999999999'&%   
	s   &#B
 
C:CCr2  c                D    t                               | j        ||          S r>   )rv  r  r   rB   r  r2  s      rC   
get_handlezAsyncClient.get_handle  s    !11$,ZXXXrE   r  r?  c               j   K   |                      ||          }|                    |           d {V S Nr  r  rV  rB   r  r2  r  ro  s        rC   rV  zAsyncClient.status  sA       j99]]Y]777777777rE   c                f   K   |                      ||          }|                                 d {V S r>   r  r[  rB   r  r2  ro  s       rC   r   zAsyncClient.result  s9      j99ZZ\\!!!!!!!rE   rN   c                j   K   |                      ||          }|                                 d {V  d S r>   r  rs  r  s       rC   rs  zAsyncClient.cancel  s?      j99mmoorE   /streamr   r   float | NoneAsyncIterator[dict[str, Any]]c              L  K   t           |z   }|r|d|                    d          z   z  }t          | j        d|||          4 d{V 	 }|                                2 3 d{V }|                                W V  6 	 ddd          d{V  dS # 1 d{V swxY w Y   dS ay  Stream the output of an application with the given arguments (which will be JSON serialized). This is only supported
        at a few select applications at the moment, so be sure to first consult with the documentation of individual applications
        to see if this is supported.

        The function will iterate over each event that is streamed from the server.
        r+   r   )rj   r   N)r  r  r   r   	aiter_sserj   rB   r  r  r   r   r   eventsr  s           rC   streamzAsyncClient.stream  st      {* 	*3S))))CL
 
 
 	# 	# 	# 	# 	# 	# 	# 	# %//11 # # # # # # #ejjll"""""  21	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	#s   
BA>%B
B Br;  r=  rt   str | bytesr   r   r;  r<  r=  r>  c               N  K   |                                  }t          |t                    r|                    d          }t	          ||          }t          |          t          k    rT|d         dk    rH|d}|                                  d{V }t          	                    || j
        |||           d{V S d|i}	|||	d<   g }
|D ]}|dk    rH|                                  d{V }|
                    dt          t          |||		          f           P|d
k    r5|
                    d
t          t          | j        ||||          f           |dk    r4|
                    dt          t           | j        ||||          f           t#          |
           d{V S zUpload the given data blob to the CDN and return the access URL. The content type should be specified
        as the second argument. Use upload_file or upload_image for convenience.utf-8r   r(   NrH  )rr   r   r   rt   r   rX   r   )rt   ri   r)   )rt   r   r   r*   )r  r  r6   r  rF  r   MULTIPART_THRESHOLDr  r   r   r   r   r   r_  ra  r   rT  rn  rB   rt   r   r   r;  r=  rM   repository_chainrr   ri   rb  repos               rC   uploadzAsyncClient.upload  sL      ~~dC   	(;;w''D9+
 
 t99***/?/Bh/N/N (	//11111111F-22"1#) 3          "<0 )2G%&8:$ $	 $	Dx#3355555555  0&tWUUU    - L !%)5&/  
    5 L !%)5&/  
   5X>>>>>>>>>rE   os.PathLikec               V  K   t          j        |          \  }}|d}t          ||          }t          j                            |          t          k    r\|d         dk    rP|                                  d{V }t          	                    t          |          || j        |           d{V S t          |d          5 }|                     |                                |t          j                            |          ||           d{V cddd           S # 1 swxY w Y   dS zMUpload a file from the local filesystem to the CDN and return the access URL.Nr   r   r(   )r   rr   r   r   r   )r   r;  r=  )	mimetypes
guess_typerF  r   r   r   r
  r  r   r   r6   r   r   r  r   r   	rB   r   r;  r=  	mime_typer  r  rr   files	            rC   upload_filezAsyncClient.upload_file2  s      !+D11	12I9+
 
 GOOD!!$777 #x////11111111F-77d))"1&	 8          $ 			'**400%$7 %        	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   ADD"%D"jpegimageImage.Imageformatc                  K   t          j                    5 }|                    ||           |                     |                                d| ||           d{V cddd           S # 1 swxY w Y   dS zBUpload a pillow image object to the CDN and return the access URL.r  image/r  NioBytesIOr   r  getvaluerB   r  r  r;  r=  buffers         rC   upload_imagezAsyncClient.upload_imageY  s       Z\\ 	VJJvfJ---!!!!!%$7	 %        	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   AA..A25A2T	/realtimeuse_jwtr   r  r  r  r  r)  r  r   r  r  r  r  &AsyncIterator[AsyncRealtimeConnection]c              `  K   d }d }	|r|                      ||           d {V }	n#|                                 }
|
j        t          d}t	          ||	||          }t          ||          4 d {V }t          |||          W V  d d d           d {V  d S # 1 d {V swxY w Y   d S Nr  r   r  r   )r  r  )r  r  rb   r  r  r  r  rB   r  r)  r   r  r  r  r  ri   r7   rM   r   r  s                rC   r  zAsyncClient.realtimen  s      *.  	U22.> 3        EE >>##D(,(9TTG!+um$OOO$S'::: 	 	 	 	 	 	 	b)NN      	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   4B
B'*B'r)  r   r  r  r  c              @  K   d }d }|r|                      ||           d {V }n#|                                 }|j        t          d}t	          ||||          }	t          |	|          4 d {V }
|
W V  d d d           d {V  d S # 1 d {V swxY w Y   d S Nr  r   r  r   )r  r  rb   r  r  r  rB   r  r)  r   r  r  ri   r7   rM   r   r  s              rC   
ws_connectzAsyncClient.ws_connect  sw      *.  	U22.> 3        EE >>##D(,(9TTG"'	
 
 
 %S'::: 	 	 	 	 	 	 	bHHHH	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   4B
BBr;   r   r   )r;   r~   )r;   r   r  r6   r  r   r;   r6   r  r6   r  rT  r   r6   r   r  r  r  r  r   ri   r   r;   rT  )r  r6   r  rT  r   r6   r  r   r  r   r  r  ri   r   r  r  r;   rv  r  r6   r  rT  r   r6   r  r   r  r<   r  r  r  r  r  r  ri   r   r  r  r  r  r;   rT  )r  r6   r2  r6   r;   rv  r  r6   r2  r6   r  r<   r;   r?  r  r6   r2  r6   r;   rT  r  r6   r2  r6   r;   rN   )
r  r6   r  rT  r   r6   r   r  r;   r  r>   rt   r  r   r6   r   r   r;  r<  r=  r>  r;   r6   r   r  r;  r<  r=  r>  r;   r6   r  
r  r  r  r6   r;  r<  r=  r>  r;   r6   )r  r6   r)  r<   r   r6   r  r   r  r   r  r  r  r  r;   r*  )r  r6   r)  r<   r   r6   r  r   r  r   r;   r  )rF   rG   rH   r
   r2  rI   r  r   rY   r  r  r   r   r  !REALTIME_TOKEN_EXPIRATION_SECONDSr  r  r   r  r  rV  r   rs  r  r  r  r&  r   r  r2  rJ   rE   rC   r   r     sC        eDu555C5555"O""""0 0 0 _0
       6 6 6 _6 
 
 
 _

 
 
 
 !B	6 6 6 6 6 6. /359"$, , , , , ,f "&'+"$59:
 :
 :
 :
 :
 :
B 6:>B'+"$596:J J J J J JXY Y Y Y GL8 8 8 8 8 8" " " "     $# # # # # #B !%	M? 15 M? M? M? M? M? M?f 15 % % % % % %T 
 15      * 
 $( A8<8<     6 
 $( A       rE   r   c            
         e Zd ZU  edd          Zded<   dZded<   edcd            ZdcdZ	dddZ
eded            Zedfd            Zedgd            ZdedZeddhdZddddi ddid&Zddddi dd'djd,Zddddddi ddd-	dkd5Zdld7Zdd8dmd:Zdnd;Zdod=Zd>dd?dpdBZ	 dqdddCdrdLZdddCdsdNZ	 dtdddCdudSZedTdUdedddVdvd_            ZedTdded`dwdb            ZdS )x
SyncClientNFr  r   r2  r  r0  r  r;   r   c                V    | j         t                      S t          d| j                   S r  r  rA   s    rC   rY   zSyncClient._auth  r  rE   c                    | j         S r>   r  rA   s    rC   r  zSyncClient._get_auth  r  rE   r6   c                    |                                  }|j                                        dk    rt          d          |j        S r  r  rd   s     rC   r  zSyncClient._get_key  r  rE   r   c                |    |                                  }t          j        |j        t          d| j        d          S )Nr   T)ri   r   follow_redirects)r  rl   rm   rb   r  r  rd   s     rC   r   zSyncClient._client  sH    ~~|!%!2(  (!
 
 
 	
rE   rL   c                D    t          |                                           S r>   )rL   r  rA   s    rC   r   zSyncClient._token_manager  s    t~~//000rE   %concurrent.futures.ThreadPoolExecutorc                    t           S r>   )EXECUTORrA   s    rC   	_executorzSyncClient._executor  s    rE   c                    | j                                         }t          j        |j         d|j         t          d| j                  S r  )r   rx   rl   rm   r8   r7   r  r  r   s     rC   r  zSyncClient._get_cdn_client  sZ    #--//|$)$4!D!Du{!D!D(  (
 
 
 	
rE   r  r  r  r   c                   t                               |          j        g|d}t          | j        dt
           d|          }t          |                                          S r  )ri  rt  rk  r   r   r`   r  rj   r  s        rC   r  zSyncClient._get_realtime_token  so     #33K@@FG 0
 
 (L!!!	
 
 
 %X]]__555rE   rQ   r  r  rT  r   r   r  r  r  ri   r   c                  t           |z   }|r|d|                    d          z   z  }i |}	|t          ||	           |t          ||	           t	          | j        d||||	          }
t          |
           |
                                S )a  Run an application with the given arguments (which will be JSON serialized).

        Args:
            timeout: Client-side HTTP timeout in seconds. Controls how long the HTTP
                client waits for a response. Defaults to the client's default_timeout.
            start_timeout: Server-side request timeout in seconds. Limits total time spent
                waiting before processing starts. Does not apply once the application begins processing.
        r+   Nr   r  )r  r  r"   r!   r   r   r=  rj   r  s              rC   r  zSyncClient.run  s    ( {* 	*3S))))C#.g;D(+++$}h777'L
 
 
 	(###}}rE   r  r  r  r  rp  c                  t           |z   }	|r|	d|                    d          z   z  }	||	dt          d|i          z   z  }	i |}
|t          ||
           |t	          ||
           |t          ||
           t          | j        d|	|| j        |
          }t          |           |
                                }t          |d         |d         |d	         |d
         | j                  S )ag  Submit an application with the given arguments (which will be JSON serialized).

        Args:
            start_timeout: Server-side request timeout in seconds. Limits total time spent
                waiting before processing starts (includes queue wait, retries, and
                routing). Does not apply once the application begins processing.
        r+   Nr  r  r   r  r2  rQ  rR  rS  r|  )r~  r  r   r"   r    r!   r   r   r  r=  rj   rp  r  s                rC   r   zSyncClient.submit  s"   ( , 	*3S))))C"3M;#?@@@@C#.g;D(+++(333$}h777'L(
 
 
 	(###}} L)n-L)L)<
 
 
 	
rE   r  r  r<   r  r  r  r  r  c       	           	
 |.
|
n)
|k    r#t          j        d
 d| dt          d           dgd	 
fd	}|
 |            S  j                            |          }	 |                    |
          S # t          j        j        $ r9}d}d         }||j	        }t          |           t          ||          |d}~ww xY w)r  Nr  r  r  ro  r  r;   rT  c            	                              	
          } | d<    | j                   $|                               D ]} |           |                                 S r  r  r  s     rC   r  z+SyncClient.subscribe.<locals>._do_subscribew  s    [[!+ !  F #JqM%
6,---*#//)/DD + +E#OE****::<<rE   r  r   r  r  )r  r  r  rJ  r   r   r   r   r  r2  ru  r/  )rB   r  r  r   r  r  r  r  r  ri   r  r  r  r   r  r2  ro  r  s   ```````````      @rC   r  zSyncClient.subscribeQ  s   2 %$ .//gm g gWe g g g 	    :>
	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	 * ! =??"&&}55	===888!. 
	 
	 
	J]F!#.
%f---'&%   
	s   8B C"4CCr2  c                D    t                               | j        ||          S r>   )rp  r  r   r  s      rC   r  zSyncClient.get_handle  s     00{JWWWrE   r  r?  c               Z    |                      ||          }|                    |          S r  r  r  s        rC   rV  zSyncClient.status  s+     j99}}y}111rE   c                V    |                      ||          }|                                S r>   r  r  s       rC   r   zSyncClient.result  s#    j99zz||rE   rN   c                Z    |                      ||          }|                                 d S r>   r  r  s       rC   rs  zSyncClient.cancel  s&    j99rE   r  r  r  Iterator[dict[str, Any]]c             #    K   t           |z   }|r|d|                    d          z   z  }t          | j        d|||          5 }|                                D ]}|                                V  	 ddd           dS # 1 swxY w Y   dS r   )r  r  r   r   iter_sserj   r  s           rC   r  zSyncClient.stream  s       {* 	*3S))))CL&#Iw
 
 
 	#** # #jjll""""#	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	#s   .A??BBr  rt   r  r   r   r;  r<  r=  r>  c                  |                                  }t          |t                    r|                    d          }t	          ||          }t          |          t          k    rH|d         dk    r<|d}|                                 }t          	                    || j
        |||          S d|i}	|||	d<   g }
|D ]}|dk    rB|                                 }|
                    dt          t          |||		          f           J|d
k    r5|
                    d
t          t          | j        ||||          f           |dk    r4|
                    dt          t           | j        ||||          f           t#          |
          S r  )r  r  r6   r  rF  r   r
  r  r   r   r   r   r   rY  r]  r   rR  rj  r  s               rC   r  zSyncClient.upload  s    ~~dC   	(;;w''D9+
 
 t99***/?/Bh/N/N (	))++F"''"1#) (    "<0 )2G%&8:$ $	 $	Dx--// 
FwOOO    ' L !%)5&/  
    / L !%)5&/  
   )222rE   r  c               .   t          j        |          \  }}|d}t          ||          }t          j                            |          t          k    rP|d         dk    rD|                                 }t          	                    t          |          || j        |          S t          |d          5 }|                     |                                |t          j                            |          ||          cddd           S # 1 swxY w Y   dS r  )r  r  rF  r   r   r   r
  r  r   r   r6   r   r   r  r   r   r  s	            rC   r  zSyncClient.upload_file	  sX    !+D11	12I9+
 
 GOOD!!$777 #x//))++F",,d))"1&	 -    $ 	;;		'**400%$7   	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   4A	D

DDr  r  r  r  c                   t          j                    5 }|                    ||           |                     |                                d| ||          cddd           S # 1 swxY w Y   dS r  r   r$  s         rC   r&  zSyncClient.upload_image>	  s     Z\\ 	VJJvfJ---;;!!!!!%$7	   	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   AA&&A*-A*Tr'  r(  r)  r  r   r  r  r  r  Iterator[RealtimeConnection]c             #  .  K   d }d }	|r|                      ||          }	n#|                                 }
|
j        t          d}t	          ||	||          }t          ||          5 }t          |||          V  d d d            d S # 1 swxY w Y   d S r,  )r  r  rb   r  r  r  r  r-  s                rC   r  zSyncClient.realtimeS	  s      *.  	U,,.> -  EE >>##D(,(9TTG!+um$OOOc7333 	r$NN     	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   (B

BBr.  r  c             #    K   d }d }|r|                      ||          }n#|                                 }|j        t          d}t	          ||||          }	t          |	|          5 }
|
V  d d d            d S # 1 swxY w Y   d S r0  )r  r  rb   r  r  r  r1  s              rC   r2  zSyncClient.ws_connecto	  s       *.  	U,,.> -  EE >>##D(,(9TTG"'	
 
 
 c7333 	rHHH	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   (A::A>A>r3  r   )r;   r   )r;   rL   )r;   rG  r4  r5  )r  r6   r  rT  r   r6   r  r   r  r   r  r  ri   r   r  r  r;   rp  r6  )r  r6   r2  r6   r;   rp  r7  r8  r9  )
r  r6   r  rT  r   r6   r   r  r;   rU  r>   r:  r;  r<  r=  )r  r6   r)  r<   r   r6   r  r   r  r   r  r  r  r  r;   r[  )r  r6   r)  r<   r   r6   r  r   r  r   r;   r  ) rF   rG   rH   r
   r2  rI   r  r   rY   r  r  r   r   r   rJ  r  r>  r  r  r   r  r  rV  r   rs  r  r  r  r&  r   r  r2  rJ   rE   rC   r@  r@    s`        eDu555C5555"O""""0 0 0 _0
       	
 	
 	
 _	
 1 1 1 _1    X
 
 
 
 !B	6 6 6 6 6 6. /359"$( ( ( ( ( (^ "&'+"$597
 7
 7
 7
 7
 7
| 6:>B'+"$596:K K K K K KZX X X X GL2 2 2 2 2 2        $# # # # # #: !%	M3 15 M3 M3 M3 M3 M3 M3f 15 % % % % % %T 
 15      * 
 $( A8<8<     ^6 
 $( A     ^  rE   r@  r  c                    t          | t                    r|                     d          } d| dt          j        |                                            S )zIEncode the given data blob to a data URL with the specified content type.r	  zdata:z;base64,)r  r6   r  base64	b64encoder  )rt   r   s     rC   r  r  	  sR    $ ${{7##J<JJ)9$)?)?)F)F)H)HJJJrE   r  c                    t          j        |           \  }}|d}t          | d          5 }t          |                                |          cddd           S # 1 swxY w Y   dS )zUEncode a file from the local filesystem to a data URL with the inferred content type.Nr   r   )r  r  r   r  r   )r   r  r  r  s       rC   encode_filerb  	  s    '--LIq.		dD		 .Tdiikk9--. . . . . . . . . . . . . . . . . .s   "AA"Ar  r  r  r  c                    t          j                    5 }|                     ||           t          |                                d|           cddd           S # 1 swxY w Y   dS )zEEncode a pillow image object to a data URL with the specified format.r  r  N)r!  r"  r   r  r#  )r  r  r%  s      rC   encode_imagerd  	  s    	 <

6&
)))foo''):&):):;;< < < < < < < < < < < < < < < < < <s   <AA!$A!)rs   r+  r;   rN   )r_  r6   r;   r6   )rf  ri  r;   r6   )r{  r   r;   r   )
r  r6   r7   r   r   r6   r  r   r;   r6   )
r  r6   r7   r   r  r   r   r6   r;   r6   )rt   r   r;   r6   )r(  r   r;   r   )r(  r   r;   r   )r(  r   r  r  r;   r  )r(  rJ  r  r  r;   r   r>   )r   r6   ri   r  r;   r  )r   r6   ri   r  r;   r  )
rr   r   r  r6   r   r6   r  r   r;   r+  )
rr   r   r  r6   r   r6   r  r   r;   r+  )rs   r+  r;   r<   )rs   r+  r
  r  r;   r<   )r;  r  r
  r  r;   r<   )r  F)r  r   r  r0  r  r0  r  r  r  r<   r;   r0  )rr   r   r  r6   r   r6   r
  r  r  r   r;   r+  )rr   r   r  r6   r   r6   r
  r  r  r   r;   r+  )rM   r   r;   r6   )rM   r   r   r6   r   r   r;   r   )rM   r   r;   r   )r;  r<  r=  r>  r;   r/   )r   r   r   r6   r;   r   )rr   r   rM   r   rt   r   r   r6   r   r   r;   r6   )rr   r   rM   r   rt   r   r   r6   r   r   r;   r6   )rr   r   rt   r   ri   r   r;   r6   )rr   r   rt   r   ri   r   r;   r6   )rb  rc  r;   r6   )rb  rk  r;   r6   )ro  rp  r;   rN   )ro  rv  r;   rN   )rt   r  r   r6   r;   r6   )r   r  r;   r6   r<  )r  r  r  r6   r;   r6   )
__future__r   r!  rj   r   r   r  r   pathlibr   r  r,  r_  r]   loggingr   r   
contextlibr   r   r   r   dataclassesr	   r
   	functoolsr   r   typingr   r   r   r   r   r   r   r   r   urllib.parser   r  rl   	httpx_sser   r   fal_client.authr   r   r   r   r   fal_client._versionr   fal_client._headersr   r    r!   r"   r#   r$   websockets.clientr%   websockets.sync.connectionr&   	getLoggerrF   r*  PILr'   r6   rT  r-   r  r~  r  r`   rW  environr[  r[  r.   rI   r0   r  MIN_REQUEST_TIMEOUT_SECONDSr   r   rI  r5   rL   r~   r
  r   r   r   r   r  r$  r'  r  r/  r=  r?  rA  rE  rI  rN  rq  rg  ri  r>  r  r}  rz  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  r6  r8  r:  rF  rJ  rR  rT  rY  r]  r_  ra  rj  rn  ru  rx  rp  rv  r   r@  r  rb  rd  rJ   rE   rC   <module>rw     s)   " " " " " " " 				   				                        : : : : : : : : ' ' ' ' ' ' ' ' ( ( ( ( ( ( ( ( . . . . . . . .
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 # " " " " "   / / / / / / / /              , + + + + +                 6999999555555		8	$	$ 
sCx.34 +L+++30333 .|...  
 z~~n6IJJ 08  8 8 8 8@Eu~ " M M M M1;111
  00, 1  
 = = = = = = = =" " " " " " " "J" " " " " " " "J ( '  m$ m$ m$ m$ m$ m$ m$ m$`x* x* x* x* x* x* x* x*v	 	 	 	 	Y 	 	 	 ! ! ! ! ! ! ! ! W W W W WNL W W W   &               V    0 0 0 0 0 0 0 0 & & & & & & & & $B B B B B B B B& w'X X X X $
 
 
 
 
 
 
 
6 %( !   < < < <	 	 	 	   $     8      D D D D" " " " "L " " " / / / /5 5 5 5       >    ( ( ( ( ( ( ( (V ( ( ( ( ( ( ( (V /3     /3           
	oo%oo    & $&    & BD     4 5B! ! ! ! !. $&4 4 4 4 4 4> $&4 4 4 4 4 40            .      :   :) ) ) ) ) ) ) )$) ) ) ) ) ) ) )$9 9 9 9$9 9 9 9*       $E$ E$ E$ E$ E$* E$ E$ E$P $I$ I$ I$ I$ I$+ I$ I$ I$X $f f f f f f f fR $a a a a a a a aHK K K K. . . .< < < < < < <rE   