§
    AxÅj¯,  ã                   óh  — d 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mZ ddlmZ ddlmZ e
rddlmZ ddlmZ  ej        d¦  «        Zd	Z ej        ej        e ej        ¦   «         g¬
¦  «         d„ Z	 	 	 d!dedee         dee         dedef
d„Zd„ Z	 d"dee          deed         ed         f         fd„Z!	 	 	 d#dee         fd„Z"d„ Z#d„ Z$	 	 	 	 d$dededee          dee         dee         dee          defd„Z%	 	 	 d%dededee          dee         dee         defd „Z&dS )&z! PodWorker | modules | upload.py é    N)ÚTYPE_CHECKINGÚOptionalÚTuple)Úurlparse)Útqdm©ÚTransferConfig)Ú
BaseClientzrunpod upload utilityz4%(filename)-20s:%(lineno)-4d %(asctime)s %(message)s)ÚlevelÚformatÚhandlersc                  óv   — 	 ddl m}  ddlm} ddlm} | ||fS # t          $ r}t          d¦  «        |‚d}~ww xY w)zu
    Lazy-load boto3 dependencies.
    Returns tuple of (session, TransferConfig, Config) or raises ImportError.
    r   )Úsessionr   )ÚConfigzNboto3 is required for S3 upload functionality. Install with: pip install boto3N)Úboto3r   Úboto3.s3.transferr	   Úbotocore.configr   ÚImportError)r   r	   r   Úes       úRC:\Projects\Historical\venv\Lib\site-packages\runpod/serverless/utils/rp_upload.pyÚ_import_boto3_dependenciesr      s…   € ð
	Ø!Ð!Ð!Ð!Ð!Ð!Ø4Ð4Ð4Ð4Ð4Ð4Ø*Ð*Ð*Ð*Ð*Ð*Ø˜¨Ð.Ð.øÝð ð ð Ýð.ñ
ô 
ð ð	øøøøðøøøs   ‚ ™
8£3³8Úlocal_uploadÚ	file_nameÚsource_pathÚ	file_dataÚ	directoryÚreturnc                 óJ  — t                                d|› d�¦  «         t          j        |d¬¦  «         |› d| › �}|rt	          j        ||¦  «         nO|�>t          |d¦  «        5 }|                     |¦  «         ddd¦  «         n# 1 swxY w Y   nt          d¦  «        ‚|S )	a€  
    Save file to local directory as fallback when S3 is unavailable.

    Args:
        file_name: Name of the file to save
        source_path: Path to source file to copy (for file-based uploads)
        file_data: Bytes to write (for in-memory uploads)
        directory: Local directory to save to (default: 'local_upload')

    Returns:
        Path to the saved local file
    z/No bucket endpoint set, saving to disk folder 'z…'. If this is a live endpoint, please reference: https://github.com/runpod/runpod-python/blob/main/docs/serverless/utils/rp_upload.mdT)Úexist_okú/NÚwbz0Either source_path or file_data must be provided)	ÚloggerÚwarningÚosÚmakedirsÚshutilÚcopyfileÚopenÚwriteÚ
ValueError)r   r   r   r   Úlocal_upload_locationÚfile_outputs         r   Ú_save_to_local_fallbackr-   ,   s  € õ$ ‡N‚Nð	_¸)ð 	_ð 	_ð 	_ñô ð õ „K�	 DÐ)Ñ)Ô)Ð)Ø(Ð6Ð6¨9Ð6Ð6Ðàð MÝŒ˜Ð%:Ñ;Ô;Ð;Ð;Ø	Ð	ÝÐ'¨Ñ.Ô.ð 	)°+Ø×Ò˜iÑ(Ô(Ð(ð	)ð 	)ð 	)ñ 	)ô 	)ð 	)ð 	)ð 	)ð 	)ð 	)ð 	)øøøð 	)ð 	)ð 	)ð 	)øõ ÐKÑLÔLÐLà Ð s   Á&BÂBÂBc                 ó0  — t          | ¦  «        }d| v r4|                      d¦  «        d                              d¦  «        d         S |j                             d¦  «        r4|                      d¦  «        d                              d¦  «        d         S dS )z4
    Extracts the region from the endpoint URL.
    z.s3.é   ú.r   z.digitaloceanspaces.comN)r   ÚsplitÚnetlocÚendswith)Úendpoint_urlÚ
parsed_urls     r   Úextract_region_from_urlr6   R   s—   € õ ˜,Ñ'Ô'€Jà�ÐÐØ×!Ò! &Ñ)Ô)¨!Ô,×2Ò2°3Ñ7Ô7¸Ô:Ð:ð Ô×!Ò!Ð";Ñ<Ô<ð NØ×!Ò! #Ñ&Ô& qÔ)×/Ò/Ð0IÑJÔJÈ1ÔMÐMàˆ4ó    Úbucket_credsr
   r	   c                 ól  — 	 t          ¦   «         \  }}}n+# t          $ r t                               d¦  «         Y dS w xY w|                     ¦   «         } |ddddœ¬¦  «        } |dt          j        ¦   «         dd	¬
¦  «        }| r| d         }| d         }| d         }	n`t          j         	                    dd¦  «        }t          j         	                    dd¦  «        }t          j         	                    dd¦  «        }	|r/|r-|	r+t          |¦  «        }
|                     d|||	||
¬¦  «        }nd}||fS )zx
    Returns a boto3 client and transfer config for the bucket.
    Lazy-loads boto3 to reduce initial import time.
    zVboto3 not installed. S3 upload functionality disabled. Install with: pip install boto3)NNÚs3v4é   Ústandard©Úmax_attemptsÚmode©Úsignature_versionÚretriesi d  T)Úmultipart_thresholdÚmax_concurrencyÚmultipart_chunksizeÚuse_threadsÚendpointUrlÚaccessIdÚaccessSecretÚBUCKET_ENDPOINT_URLNÚBUCKET_ACCESS_KEY_IDÚBUCKET_SECRET_ACCESS_KEYÚs3)r4   Úaws_access_key_idÚaws_secret_access_keyÚconfigÚregion_name)r   r   r"   r#   ÚSessionÚmultiprocessingÚ	cpu_countr$   ÚenvironÚgetr6   Úclient)r8   r   r	   r   Úbucket_sessionÚboto_configÚtransfer_configr4   Úaccess_key_idÚsecret_access_keyÚregionÚboto_clients               r   Úget_boto_clientr_   c   s�  € ðÝ*DÑ*FÔ*FÑ'ˆ�  øÝð ð ð Ý�Šð.ñ	
ô 	
ð 	
ð ˆzˆzðøøøð —_’_Ñ&Ô&€Nà�&Ø ¸1ÀjÐ*QÐ*Qðñ ô €Kð %�nØ%Ý'Ô1Ñ3Ô3Ø%Øð	ñ ô €Oð ð MØ# MÔ2ˆØ$ ZÔ0ˆØ(¨Ô8ÐÐå”z—~’~Ð&;¸TÑBÔBˆÝœ
ŸšÐ'=¸tÑDÔDˆÝœJŸNšNÐ+EÀtÑLÔLÐàð ˜ð Ð*;ð å(¨Ñ6Ô6ˆà$×+Ò+ØØ%Ø+Ø"3ØØð ,ñ 
ô 
ˆˆð ˆà˜Ð'Ð's   ‚ •$=¼=Úbucket_namec                 óv  — t          t          j        ¦   «         ¦  «        dd…         }t          ¦   «         \  }}t          j                             |¦  «        d         }d|                     d¦  «        z   }	t          |d¦  «        5 }
|
 	                    ¦   «         }ddd¦  «         n# 1 swxY w Y   |€!|› |› �}t          ||d¬¦  «        }|�|||<   |S |r|nt          j        d	¦  «        }|                     |› | › d
|› |› �||	¬¦  «         |                     d|› | › d
|› |› �dœd¬¦  «        }|�|||<   |S )z1
    Upload a single file to bucket storage.
    Né   r/   zimage/r0   ÚrbÚsimulated_uploaded)r   r   ú%m-%yr    )ÚBucketÚKeyÚBodyÚContentTypeÚ
get_object©rf   rg   é€:	 ©ÚParamsÚ	ExpiresIn)ÚstrÚuuidÚuuid4r_   r$   ÚpathÚsplitextÚlstripr(   Úreadr-   ÚtimeÚstrftimeÚ
put_objectÚgenerate_presigned_url)Újob_idÚimage_locationÚresult_indexÚresults_listr`   Ú
image_namer^   Ú_Úfile_extensionÚcontent_typeÚ
input_fileÚoutputÚfile_name_with_extÚsim_upload_locationÚbucketÚpresigned_urls                   r   Úupload_imager‰   ž   sÑ  € õ •T”Z‘\”\Ñ"Ô" 2 A 2Ô&€JÝ$Ñ&Ô&�N€K�Ý”W×%Ò% nÑ5Ô5°aÔ8€NØ˜n×3Ò3°CÑ8Ô8Ñ8€Lå	ˆn˜dÑ	#Ô	#ð # zØ—’Ñ"Ô"ˆð#ð #ð #ñ #ô #ð #ð #ð #ð #ð #ð #øøøð #ð #ð #ð #ð Ðà *Ð<¨NÐ<Ð<ÐÝ5ØØØ*ð
ñ 
ô 
Ðð Ð#Ø)<ˆL˜Ñ&à"Ð"à'ÐCˆ[ˆ[­T¬]¸7Ñ-CÔ-C€FØ×ÒØˆ{ØÐ4Ð4˜
Ð4 NÐ4Ð4ØØ ð	 ñ ô ð ð  ×6Ò6ØØ#˜+°Ð.VÐ.V¸*Ð.VÀnÐ.VÐ.VÐWÐWØð 7ñ ô €Mð ÐØ%2ˆ�\Ñ"àÐs   ÂB(Â(B,Â/B,c                 ó  — g }dgt          |¦  «        z  }t          |¦  «        D ]M\  }}t          j        t          | |||f¬¦  «        }|                     ¦   «          |                     |¦  «         ŒN|D ]}|                     ¦   «          Œ|S )z}
    Uploads a list of files in parallel.
    Once all files are uploaded, the function returns the presigned URLs list.
    N)ÚtargetÚargs)ÚlenÚ	enumerateÚ	threadingÚThreadr‰   ÚstartÚappendÚjoin)r{   Ú	file_listÚupload_progressÚ	file_urlsÚindexÚselected_fileÚ
new_uploadÚuploads           r   Úfilesr›   Õ   s­   € ð
 €OØ��˜Y™œÑ'€Iå )¨)Ñ 4Ô 4ð +ð +Ñˆˆ}ÝÔ%Ý v¨}¸eÀYÐ&Oð
ñ 
ô 
ˆ
ð 	×ÒÑÔÐØ×Ò˜zÑ*Ô*Ð*Ð*ð "ð ð ˆØ�Š‰ŒˆˆàÐr7   c           
      ó6  — 	 t          ¦   «         \  }}}n)# t          $ r t                               d¦  «         ‚ w xY w|                     ¦   «         } |ddddœ¬¦  «        }|                     d|d         |d	         |d
         |¬¦  «        }g }	|D ]†}
t          |
d¦  «        5 }|                     t          |d         ¦  «        | › d|
› �|¬¦  «         ddd¦  «         n# 1 swxY w Y   |	 	                    |d         › d|d         › d| › d|
› �¦  «         Œ‡|	S )z*
    Uploads files to bucket storage.
    zPboto3 not installed. Cannot upload to S3 bucket. Install with: pip install boto3r:   r;   r<   r=   r@   rM   rG   rH   rI   )r4   rN   rO   rP   rc   Ú
bucketNamer    )rf   rg   rh   N)
r   r   r"   ÚerrorrR   rW   r(   ry   rp   r’   )r{   r”   r8   r   r€   r   Útemp_bucket_sessionÚtemp_boto_configÚtemp_boto_clientÚbucket_urlsr˜   r   s               r   Úbucket_uploadr£   í   sÓ  € ðÝ7Ñ9Ô9Ñˆ��F�FøÝð ð ð Ý�Šð.ñ	
ô 	
ð 	
ð 	ðøøøð "Ÿ/š/Ñ+Ô+Ðà�vØ ¸1ÀjÐ*QÐ*Qðñ ô Ðð +×1Ò1ØØ! -Ô0Ø& zÔ2Ø*¨>Ô:Øð 2ñ ô Ðð €Kà"ð 

ð 

ˆÝ�- Ñ&Ô&ð 	¨)Ø×'Ò'Ý˜<¨Ô5Ñ6Ô6ØÐ/Ð/ Ð/Ð/Øð (ñ ô ð ð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	×ÒØ˜MÔ*ÐbÐb¨\¸,Ô-GÐbÐbÈ&ÐbÐbÐS`ÐbÐbñ	
ô 	
ð 	
ð 	
ð Ðs   ‚ •&;Â$1C!Ã!C%	Ã(C%	Úfile_locationÚprefixÚ
extra_argsc                 óž  — t          |¦  «        \  }}|st          j        d¦  «        }|r|› d| › �n| }|€t          | |¬¦  «        S t          j                             |¦  «        }	t          |	dd| ¬¦  «        5 }
|||||
j        dœ}|r||d	<    |j	        di |¤Ž ddd¦  «         n# 1 swxY w Y   | 
                    d
||dœd¬¦  «        }|S )zN
    Uploads a single file to bucket storage and returns a presigned URL.
    re   r    N)r   ÚBT©ÚtotalÚunitÚ
unit_scaleÚdesc)ÚFilenamerf   rg   r   ÚCallbackÚ	ExtraArgsrj   rk   rl   rm   © )r_   rw   rx   r-   r$   rs   Úgetsizer   ÚupdateÚupload_filerz   )r   r¤   r8   r`   r¥   r¦   r^   rZ   ÚkeyÚ	file_sizeÚprogress_barÚupload_file_argsrˆ   s                r   Úupload_file_to_bucketr¹     sh  € õ $3°<Ñ#@Ô#@Ñ €K�àð -Ý”m GÑ,Ô,ˆà%+Ð
:ˆVÐ
!Ð
!�iÐ
!Ð
!Ð
!°€CàÐÝ& y¸mÐLÑLÔLÐLå”—’ Ñ.Ô.€IÝ	Ø˜c¨d¸ð
ñ 
ô 
ð 4à	à%Ø!ØØ%Ø$Ô+ð
ð 
Ðð ð 	7Ø,6Ð˜[Ñ)àˆÔÐ3Ð3Ð"2Ð3Ð3Ð3ð4ð 4ð 4ñ 4ô 4ð 4ð 4ð 4ð 4ð 4ð 4øøøð 4ð 4ð 4ð 4ð   ×6Ò6Ø¨¸CÐ@Ð@ÈFð 7ñ ô €Mð Ðs   Á9"B'Â'B+Â.B+c                 óž  — t          |¦  «        \  }}|st          j        d¦  «        }|r|› d| › �n| }|€t          | |¬¦  «        S t	          |¦  «        }t          |dd| ¬¦  «        5 }	|                     t          j        |¦  «        ||||	j	        ¬¦  «         ddd¦  «         n# 1 swxY w Y   | 
                    d	||d
œd¬¦  «        }
|
S )z\
    Uploads an in-memory object (bytes) to bucket storage and returns a presigned URL.
    re   r    N)r   r¨   Tr©   )r   r¯   rj   rk   rl   rm   )r_   rw   rx   r-   r�   r   Úupload_fileobjÚioÚBytesIOr³   rz   )r   r   r8   r`   r¥   r^   rZ   rµ   r¶   r·   rˆ   s              r   Úupload_in_memory_objectr¾   H  sK  € õ $3°<Ñ#@Ô#@Ñ €K�àð -Ý”m GÑ,Ô,ˆà%+Ð
:ˆVÐ
!Ð
!�iÐ
!Ð
!Ð
!°€CàÐÝ& y¸IÐFÑFÔFÐFå�I‘”€IÝ	Ø˜c¨d¸ð
ñ 
ô 
ð 	
à	Ø×"Ò"ÝŒJ�yÑ!Ô!ØØØ"Ø!Ô(ð 	#ñ 	
ô 	
ð 	
ð	
ð 	
ð 	
ñ 	
ô 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
øøøð 	
ð 	
ð 	
ð 	
ð  ×6Ò6Ø¨¸CÐ@Ð@ÈFð 7ñ ô €Mð Ðs   Á)2B'Â'B+Â.B+)NNr   )N)r   NN)NNNN)NNN)'Ú__doc__r¼   ÚloggingrS   r$   r&   r�   rw   rq   Útypingr   r   r   Úurllib.parser   Útqdm_loggable.autor   r   r	   Úbotocore.clientr
   Ú	getLoggerr"   ÚFMTÚbasicConfigÚINFOÚStreamHandlerr   rp   Úbytesr-   r6   Údictr_   r‰   r›   r£   r¹   r¾   r±   r7   r   ú<module>rÌ      s  ðØ 'Ð 'ð 
€	€	€	Ø €€€Ø Ð Ð Ð Ø 	€	€	€	Ø €€€Ø Ð Ð Ð Ø €€€Ø €€€Ø 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ø !Ð !Ð !Ð !Ð !Ð !à #Ð #Ð #Ð #Ð #Ð #àð +Ø0Ð0Ð0Ð0Ð0Ð0Ø*Ð*Ð*Ð*Ð*Ð*à	ˆÔ	Ð2Ñ	3Ô	3€Ø<€Ø €Ô ˜'œ,¨sÐ>S¸gÔ>SÑ>UÔ>UÐ=VÐ WÑ WÔ WÐ Wðð ð ð& "&Ø!%Ø#ð	#!ð #!Øð#!à˜#”ð#!ð ˜Œð#!ð ð	#!ð
 	ð#!ð #!ð #!ð #!ðLð ð ð$ $(ð5(ð 5(Ø˜4”.ð5(à
ˆ8�LÔ! 8Ð,<Ô#=Ð=Ô>ð5(ð 5(ð 5(ð 5(ð| ØØ!%ð1ð 1ð
 ˜#”ð1ð 1ð 1ð 1ðnð ð ð0)ð )ð )ð` $(Ø!%Ø Ø!%ð*ð *Øð*àð*ð ˜4”.ð*ð ˜#”ð	*ð
 �SŒMð*ð ˜”ð*ð 	ð*ð *ð *ð *ðb $(Ø!%Ø ð$ð $Øð$àð$ð ˜4”.ð$ð ˜#”ð	$ð
 �SŒMð$ð 	ð$ð $ð $ð $ð $ð $r7   