o
    é’Oj|  ã                   @   sú   d dl Z d dlmZ d dlmZmZ d dlmZ d dlm	Z	 d dl
mZmZmZmZ d dlmZmZmZmZ G dd	„ d	ƒZG d
d„ dƒZG dd„ dƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZdS )é    N)ÚBytesIO©ÚreadableÚseekable)ÚFULL_OBJECT_CHECKSUM_ARGS)ÚIN_MEMORY_UPLOAD_TAG)ÚCompleteMultipartUploadTaskÚCreateMultipartUploadTaskÚSubmissionTaskÚTask)ÚChunksizeAdjusterÚDeferredOpenFileÚget_callbacksÚget_filtered_dictc                   @   s.   e Zd Zddd„Zdd„ Zdd„ Zdd	„ Zd
S )ÚAggregatedProgressCallbacké   c                 C   s   || _ || _d| _dS )aØ  Aggregates progress updates for every provided progress callback

        :type callbacks: A list of functions that accepts bytes_transferred
            as a single argument
        :param callbacks: The callbacks to invoke when threshold is reached

        :type threshold: int
        :param threshold: The progress threshold in which to take the
            aggregated progress and invoke the progress callback with that
            aggregated progress total
        r   N)Ú
_callbacksÚ
_thresholdÚ_bytes_seen)ÚselfÚ	callbacksÚ	threshold© r   úW/var/www/html/pharmsmart-cdr-gen/venv/lib/python3.10/site-packages/s3transfer/upload.pyÚ__init__"   s   
z#AggregatedProgressCallback.__init__c                 C   s*   |  j |7  _ | j | jkr|  ¡  d S d S ©N)r   r   Ú_trigger_callbacks)r   Úbytes_transferredr   r   r   Ú__call__2   s   ÿz#AggregatedProgressCallback.__call__c                 C   s   | j dkr|  ¡  dS dS )z@Flushes out any progress that has not been sent to its callbacksr   N)r   r   ©r   r   r   r   Úflush7   s   
ÿz AggregatedProgressCallback.flushc                 C   s"   | j D ]}|| jd� qd| _d S )N)r   r   )r   r   )r   Úcallbackr   r   r   r   <   s   

z-AggregatedProgressCallback._trigger_callbacksN)r   )Ú__name__Ú
__module__Ú__qualname__r   r   r    r   r   r   r   r   r   !   s
    
r   c                   @   sL   e Zd ZdZdd„ Zddd„Zddd	„Zd
d„ Zdd„ Zdd„ Z	dd„ Z
dS )ÚInterruptReaderaÏ  Wrapper that can interrupt reading using an error

    It uses a transfer coordinator to propagate an error if it notices
    that a read is being made while the file is being read from.

    :type fileobj: file-like obj
    :param fileobj: The file-like object to read from

    :type transfer_coordinator: s3transfer.futures.TransferCoordinator
    :param transfer_coordinator: The transfer coordinator to use if the
        reader needs to be interrupted.
    c                 C   s   || _ || _d S r   )Ú_fileobjÚ_transfer_coordinator)r   ÚfileobjÚtransfer_coordinatorr   r   r   r   P   s   
zInterruptReader.__init__Nc                 C   s   | j jr| j j‚| j |¡S r   )r'   Ú	exceptionr&   Úread)r   Úamountr   r   r   r+   T   s   zInterruptReader.readr   c                 C   s   | j  ||¡ d S r   )r&   Úseek)r   ÚwhereÚwhencer   r   r   r-   ^   s   zInterruptReader.seekc                 C   s
   | j  ¡ S r   )r&   Útellr   r   r   r   r0   a   s   
zInterruptReader.tellc                 C   s   | j  ¡  d S r   )r&   Úcloser   r   r   r   r1   d   ó   zInterruptReader.closec                 C   s   | S r   r   r   r   r   r   Ú	__enter__g   ó   zInterruptReader.__enter__c                 O   s   |   ¡  d S r   )r1   )r   ÚargsÚkwargsr   r   r   Ú__exit__j   ó   zInterruptReader.__exit__r   )r   )r"   r#   r$   Ú__doc__r   r+   r-   r0   r1   r3   r7   r   r   r   r   r%   B   s    


r%   c                   @   sf   e Zd ZdZddd„Zedd„ ƒZdd„ Zd	d
„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ ZdS )ÚUploadInputManageraJ  Base manager class for handling various types of files for uploads

    This class is typically used for the UploadSubmissionTask class to help
    determine the following:

        * How to determine the size of the file
        * How to determine if a multipart upload is required
        * How to retrieve the body for a PutObject
        * How to retrieve the bodies for a set of UploadParts

    The answers/implementations differ for the various types of file inputs
    that may be accepted. All implementations must subclass and override
    public methods from this class.
    Nc                 C   s   || _ || _|| _d S r   )Ú_osutilr'   Ú_bandwidth_limiter©r   Úosutilr)   Úbandwidth_limiterr   r   r   r   ~   s   
zUploadInputManager.__init__c                 C   ó   t dƒ‚)a  Determines if the source for the upload is compatible with manager

        :param upload_source: The source for which the upload will pull data
            from.

        :returns: True if the manager can handle the type of source specified
            otherwise returns False.
        zmust implement _is_compatible()©ÚNotImplementedError©ÚclsÚupload_sourcer   r   r   Úis_compatibleƒ   s   
z UploadInputManager.is_compatiblec                 C   r@   )aÛ  Whether the body it provides are stored in-memory

        :type operation_name: str
        :param operation_name: The name of the client operation that the body
            is being used for. Valid operation_names are ``put_object`` and
            ``upload_part``.

        :rtype: boolean
        :returns: True if the body returned by the manager will be stored in
            memory. False if the manager will not directly store the body in
            memory.
        z%must implement store_body_in_memory()rA   ©r   Úoperation_namer   r   r   Ústores_body_in_memory�   ó   z(UploadInputManager.stores_body_in_memoryc                 C   r@   )z¼Provides the transfer size of an upload

        :type transfer_future: s3transfer.futures.TransferFuture
        :param transfer_future: The future associated with upload request
        z&must implement provide_transfer_size()rA   ©r   Útransfer_futurer   r   r   Úprovide_transfer_sizež   s   z(UploadInputManager.provide_transfer_sizec                 C   r@   )aÔ  Determines where a multipart upload is required

        :type transfer_future: s3transfer.futures.TransferFuture
        :param transfer_future: The future associated with upload request

        :type config: s3transfer.manager.TransferConfig
        :param config: The config associated to the transfer manager

        :rtype: boolean
        :returns: True, if the upload should be multipart based on
            configuration and size. False, otherwise.
        z*must implement requires_multipart_upload()rA   ©r   rL   Úconfigr   r   r   Úrequires_multipart_upload¦   rJ   z,UploadInputManager.requires_multipart_uploadc                 C   r@   )aÜ  Returns the body to use for PutObject

        :type transfer_future: s3transfer.futures.TransferFuture
        :param transfer_future: The future associated with upload request

        :type config: s3transfer.manager.TransferConfig
        :param config: The config associated to the transfer manager

        :rtype: s3transfer.utils.ReadFileChunk
        :returns: A ReadFileChunk including all progress callbacks
            associated with the transfer future.
        z$must implement get_put_object_body()rA   rK   r   r   r   Úget_put_object_bodyµ   rJ   z&UploadInputManager.get_put_object_bodyc                 C   r@   )a  Yields the part number and body to use for each UploadPart

        :type transfer_future: s3transfer.futures.TransferFuture
        :param transfer_future: The future associated with upload request

        :type chunksize: int
        :param chunksize: The chunksize to use for this upload.

        :rtype: int, s3transfer.utils.ReadFileChunk
        :returns: Yields the part number and the ReadFileChunk including all
            progress callbacks associated with the transfer future for that
            specific yielded part.
        z)must implement yield_upload_part_bodies()rA   )r   rL   Ú	chunksizer   r   r   Úyield_upload_part_bodiesÄ   s   z+UploadInputManager.yield_upload_part_bodiesc                 C   s*   t || jƒ}| jr| jj|| jdd�}|S )NF)Úenabled)r%   r'   r<   Úget_bandwith_limited_stream)r   r(   r   r   r   Ú_wrap_fileobjÔ   s   ÿz UploadInputManager._wrap_fileobjc                 C   s   t |dƒ}|rt|ƒgS g S )NÚprogress)r   r   )r   rL   r   r   r   r   Ú_get_progress_callbacksÜ   s   

z*UploadInputManager._get_progress_callbacksc                 C   s   dd„ |D ƒS )Nc                 S   s   g | ]}|j ‘qS r   )r    )Ú.0r!   r   r   r   Ú
<listcomp>æ   s    z;UploadInputManager._get_close_callbacks.<locals>.<listcomp>r   )r   Úaggregated_progress_callbacksr   r   r   Ú_get_close_callbackså   r2   z'UploadInputManager._get_close_callbacksr   )r"   r#   r$   r9   r   ÚclassmethodrF   rI   rM   rP   rQ   rS   rV   rX   r\   r   r   r   r   r:   n   s    

	r:   c                   @   sd   e Zd ZdZedd„ ƒZdd„ Zdd„ Zdd	„ Zd
d„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ ZdS )ÚUploadFilenameInputManagerzUpload utility for filenamesc                 C   s
   t |tƒS r   )Ú
isinstanceÚstrrC   r   r   r   rF   ì   s   
z(UploadFilenameInputManager.is_compatiblec                 C   ó   dS )NFr   rG   r   r   r   rI   ð   r4   z0UploadFilenameInputManager.stores_body_in_memoryc                 C   s   |j  | j |j jj¡¡ d S r   )ÚmetarM   r;   Úget_file_sizeÚ	call_argsr(   rK   r   r   r   rM   ó   s   ÿz0UploadFilenameInputManager.provide_transfer_sizec                 C   s   |j j|jkS r   )rb   ÚsizeÚmultipart_thresholdrN   r   r   r   rP   ø   r2   z4UploadFilenameInputManager.requires_multipart_uploadc                 C   sJ   |   |¡\}}|  |¡}|  |¡}|  |¡}|jj}| jj|||||d�S )N©r(   Ú
chunk_sizeÚfull_file_sizer   Úclose_callbacks)Ú&_get_put_object_fileobj_with_full_sizerV   rX   r\   rb   re   r;   Ú#open_file_chunk_reader_from_fileobj)r   rL   r(   Ú	full_sizer   rj   re   r   r   r   rQ   û   s   ÿ


ûz.UploadFilenameInputManager.get_put_object_bodyc                 c   s”   � |j j}|  ||¡}td|d ƒD ]5}|  |¡}|  |¡}||d  }| j|j jj|||d�\}	}
|  	|	¡}	| j
j|	||
||d�}||fV  qd S )Né   )Ú
start_byteÚ	part_sizeri   rg   )rb   re   Ú_get_num_partsÚrangerX   r\   Ú'_get_upload_part_fileobj_with_full_sizerd   r(   rV   r;   rl   )r   rL   rR   ri   Ú	num_partsÚpart_numberr   rj   ro   r(   rm   Úread_file_chunkr   r   r   rS     s.   €


ü

ûæz3UploadFilenameInputManager.yield_upload_part_bodiesc                 C   s   t ||| jjd�}|S )N)Úopen_function)r   r;   Úopen)r   r(   ro   r   r   r   Ú_get_deferred_open_file2  s   
ÿz2UploadFilenameInputManager._get_deferred_open_filec                 C   s"   |j jj}|j j}|  |d¡|fS )Nr   )rb   rd   r(   re   ry   ©r   rL   r(   re   r   r   r   rk   8  s   
zAUploadFilenameInputManager._get_put_object_fileobj_with_full_sizec                 K   s    |d }|d }|   ||¡|fS )Nro   ri   )ry   )r   r(   r6   ro   rm   r   r   r   rs   =  s   zBUploadFilenameInputManager._get_upload_part_fileobj_with_full_sizec                 C   s   t t |jjt|ƒ ¡ƒS r   )ÚintÚmathÚceilrb   re   Úfloat)r   rL   rp   r   r   r   rq   B  s   z)UploadFilenameInputManager._get_num_partsN)r"   r#   r$   r9   r]   rF   rI   rM   rP   rQ   rS   ry   rk   rs   rq   r   r   r   r   r^   é   s    
r^   c                   @   s<   e Zd ZdZedd„ ƒZdd„ Zdd„ Zdd	„ Zd
d„ Z	dS )ÚUploadSeekableInputManagerz&Upload utility for an open file objectc                 C   s   t |ƒot|ƒS r   r   rC   r   r   r   rF   I  s   z(UploadSeekableInputManager.is_compatiblec                 C   s   |dkrdS dS )NÚ
put_objectFTr   rG   r   r   r   rI   M  s   z0UploadSeekableInputManager.stores_body_in_memoryc                 C   sD   |j jj}| ¡ }| dd¡ | ¡ }| |¡ |j  || ¡ d S )Nr   é   )rb   rd   r(   r0   r-   rM   )r   rL   r(   Ústart_positionÚend_positionr   r   r   rM   S  s   

ÿz0UploadSeekableInputManager.provide_transfer_sizec                 K   s   |  |d ¡}t|ƒt|ƒfS )Nrp   )r+   r   Úlen)r   r(   r6   Údatar   r   r   rs   `  s   zBUploadSeekableInputManager._get_upload_part_fileobj_with_full_sizec                 C   s"   |j jj}| ¡ |j j }||fS r   )rb   rd   r(   r0   re   rz   r   r   r   rk   o  s   
zAUploadSeekableInputManager._get_put_object_fileobj_with_full_sizeN)
r"   r#   r$   r9   r]   rF   rI   rM   rs   rk   r   r   r   r   r   F  s    
r   c                       sh   e Zd ZdZd‡ fdd„	Zedd„ ƒZdd„ Zd	d
„ Zdd„ Z	dd„ Z
dd„ Zddd„Zdd„ Z‡  ZS )ÚUploadNonSeekableInputManagerz7Upload utility for a file-like object that cannot seek.Nc                    s   t ƒ  |||¡ d| _d S )Nó    )Úsuperr   Ú_initial_datar=   ©Ú	__class__r   r   r   z  s   
z&UploadNonSeekableInputManager.__init__c                 C   s   t |ƒS r   )r   rC   r   r   r   rF   ~  s   z+UploadNonSeekableInputManager.is_compatiblec                 C   ra   )NTr   rG   r   r   r   rI   ‚  r4   z3UploadNonSeekableInputManager.stores_body_in_memoryc                 C   s   d S r   r   rK   r   r   r   rM   …  s   z3UploadNonSeekableInputManager.provide_transfer_sizec                 C   sP   |j jd ur|j j|jkS |j jj}|j}|  ||d¡| _t| jƒ|k r&dS dS )NFT)rb   re   rf   rd   r(   Ú_readr‰   r„   )r   rL   rO   r(   r   r   r   r   rP   Š  s   
z7UploadNonSeekableInputManager.requires_multipart_uploadc                 C   s@   |   |¡}|  |¡}|jjj}|  | j| ¡  ||¡}d | _|S r   )rX   r\   rb   rd   r(   Ú
_wrap_datar‰   r+   )r   rL   r   rj   r(   Úbodyr   r   r   rQ   ›  s   


ÿz1UploadNonSeekableInputManager.get_put_object_bodyc           	      c   s`   � |j jj}d}	 |  |¡}|  |¡}|d7 }|  ||¡}|s!d S |  |||¡}d }||fV  q	)Nr   Trn   )rb   rd   r(   rX   r\   rŒ   r�   )	r   rL   rR   Úfile_objectru   r   rj   Úpart_contentÚpart_objectr   r   r   rS   ©  s    €


ÿ
óz6UploadNonSeekableInputManager.yield_upload_part_bodiesTc                 C   sx   t | jƒdkr| |¡S |t | jƒkr&| jd|… }|r$| j|d… | _|S |t | jƒ }| j| |¡ }|r:d| _|S )a=  
        Reads a specific amount of data from a stream and returns it. If there
        is any data in initial_data, that will be popped out first.

        :type fileobj: A file-like object that implements read
        :param fileobj: The stream to read from.

        :type amount: int
        :param amount: The number of bytes to read from the stream.

        :type truncate: bool
        :param truncate: Whether or not to truncate initial_data after
            reading from it.

        :return: Generator which generates part bodies from the initial data.
        r   Nr‡   )r„   r‰   r+   )r   r(   r,   Útruncater…   Úamount_to_readr   r   r   rŒ   ½  s   
z#UploadNonSeekableInputManager._readc                 C   s,   |   t|ƒ¡}| jj|t|ƒt|ƒ||d�S )a¸  
        Wraps data with the interrupt reader and the file chunk reader.

        :type data: bytes
        :param data: The data to wrap.

        :type callbacks: list
        :param callbacks: The callbacks associated with the transfer future.

        :type close_callbacks: list
        :param close_callbacks: The callbacks to be called when closing the
            wrapper for the data.

        :return: Fully wrapped data.
        rg   )rV   r   r;   rl   r„   )r   r…   r   rj   r(   r   r   r   r�   ç  s   ûz(UploadNonSeekableInputManager._wrap_datar   )T)r"   r#   r$   r9   r   r]   rF   rI   rM   rP   rQ   rS   rŒ   r�   Ú__classcell__r   r   rŠ   r   r†   w  s    

*r†   c                   @   s‚   e Zd ZdZddgZedg Zg d¢Zg d¢e Zdd„ Z		dd	d
„Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )ÚUploadSubmissionTaskz.Task for submitting tasks to execute an uploadÚChecksumTypeÚMpuObjectSize)ÚChecksumAlgorithmÚSSECustomerKeyÚSSECustomerAlgorithmÚSSECustomerKeyMD5ÚRequestPayerÚExpectedBucketOwner)r™   rš   r›   rœ   r�   r–   r—   c                 C   sJ   t ttg}|jjj}|D ]}| |¡r|  S qtd|› dt|ƒ› d�ƒ‚)ao  Retrieves a class for managing input for an upload based on file type

        :type transfer_future: s3transfer.futures.TransferFuture
        :param transfer_future: The transfer future for the request

        :rtype: class of UploadInputManager
        :returns: The appropriate class to use for managing a specific type of
            input for uploads.
        zInput z
 of type: z is not supported.)	r^   r   r†   rb   rd   r(   rF   ÚRuntimeErrorÚtype)r   rL   Úupload_manager_resolver_chainr(   Úupload_manager_clsr   r   r   Ú_get_upload_input_manager_cls  s   ý

ÿÿz2UploadSubmissionTask._get_upload_input_manager_clsNc                 C   sf   |   |¡|| j|ƒ}|jjdu r| |¡ | ||¡s'|  ||||||¡ dS |  ||||||¡ dS )aÒ  
        :param client: The client associated with the transfer manager

        :type config: s3transfer.manager.TransferConfig
        :param config: The transfer config associated with the transfer
            manager

        :type osutil: s3transfer.utils.OSUtil
        :param osutil: The os utility associated to the transfer manager

        :type request_executor: s3transfer.futures.BoundedExecutor
        :param request_executor: The request executor associated with the
            transfer manager

        :type transfer_future: s3transfer.futures.TransferFuture
        :param transfer_future: The transfer future associated with the
            transfer request that tasks are being submitted for
        N)r¢   r'   rb   re   rM   rP   Ú_submit_upload_requestÚ_submit_multipart_request)r   ÚclientrO   r>   Úrequest_executorrL   r?   Úupload_input_managerr   r   r   Ú_submit3  s4   ÿþ
ÿú	úzUploadSubmissionTask._submitc           
   
   C   sX   |j j}|  |j¡}|  |d¡}	| jj|t| j|| |¡|j	|j
|dœdd�|	d� d S )Nr€   )r¥   r(   ÚbucketÚkeyÚ
extra_argsT)r)   Úmain_kwargsÚis_final©Útag)rb   rd   Ú_extra_put_object_argsr«   Ú_get_upload_task_tagr'   ÚsubmitÚPutObjectTaskrQ   r©   rª   )
r   r¥   rO   r>   r¦   rL   r§   rd   Úput_object_extra_argsÚput_object_tagr   r   r   r£   l  s.   	ÿÿÿù	õ
ñz+UploadSubmissionTask._submit_upload_requestc                 C   s6  |j j}tD ]}||jv rd|jd< | dd¡|jd< q|  |j¡}	| j |t| j||j	|j
|	dœd�¡}
g }|  |j¡}|  |d¡}|j j}tƒ }| |j|¡}| ||¡}|D ]!\}}| | jj|t| j|||j	|j
||d	œd
|
id�|d�¡ qY|  |j¡}| j |t| j||j	|j
|dœ|
|dœdd�¡ d S )NÚFULL_OBJECTr–   ÚChecksumÚ r˜   )r¥   r©   rª   r«   )r)   r¬   Úupload_part)r¥   r(   r©   rª   ru   r«   Ú	upload_id)r)   r¬   Úpending_main_kwargsr®   )rº   ÚpartsT)r)   r¬   r»   r­   )rb   rd   r   r«   ÚreplaceÚ_extra_create_multipart_argsr'   r²   r	   r©   rª   Ú_extra_upload_part_argsr±   re   r   Úadjust_chunksizeÚmultipart_chunksizerS   ÚappendÚUploadPartTaskÚ_extra_complete_multipart_argsr   )r   r¥   rO   r>   r¦   rL   r§   rd   ÚchecksumÚcreate_multipart_extra_argsÚcreate_multipart_futureÚpart_futuresÚextra_part_argsÚupload_part_tagre   ÚadjusterrR   Úpart_iteratorru   r(   Úcomplete_multipart_extra_argsr   r   r   r¤   “  sŒ   	


ÿ€ÿüþþÿÿú	ÿöðÿÿüþôþz.UploadSubmissionTask._submit_multipart_requestc                 C   ó   t || jƒS r   )r   ÚUPLOAD_PART_ARGS©r   r«   r   r   r   r¿   ö  s   z,UploadSubmissionTask._extra_upload_part_argsc                 C   rÎ   r   )r   ÚCOMPLETE_MULTIPART_ARGSrÐ   r   r   r   rÄ   û  r8   z3UploadSubmissionTask._extra_complete_multipart_argsc                 C   ó   t || jd�S ©N)Úblocklisted_keys)r   ÚCREATE_MULTIPART_BLOCKLISTrÐ   r   r   r   r¾   þ  ó   ÿz1UploadSubmissionTask._extra_create_multipart_argsc                 C   rÒ   rÓ   )r   ÚPUT_OBJECT_BLOCKLISTrÐ   r   r   r   r°     rÖ   z+UploadSubmissionTask._extra_put_object_argsc                 C   s   d }|  |¡r	t}|S r   )rI   r   )r   r§   rH   r¯   r   r   r   r±     s   
z)UploadSubmissionTask._get_upload_task_tagr   )r"   r#   r$   r9   r×   r   rÕ   rÏ   rÑ   r¢   r¨   r£   r¤   r¿   rÄ   r¾   r°   r±   r   r   r   r   r•     s$    
	ø

ù9'cr•   c                   @   ó   e Zd ZdZdd„ ZdS )r³   z Task to do a nonmultipart uploadc                 C   sB   |�}|j d|||dœ|¤Ž W d  ƒ dS 1 sw   Y  dS )aP  
        :param client: The client to use when calling PutObject
        :param fileobj: The file to upload.
        :param bucket: The name of the bucket to upload to
        :param key: The name of the key to upload to
        :param extra_args: A dictionary of any extra arguments that may be
            used in the upload.
        )ÚBucketÚKeyÚBodyNr   )r€   )r   r¥   r(   r©   rª   r«   rŽ   r   r   r   Ú_main  s   	"ÿzPutObjectTask._mainN©r"   r#   r$   r9   rÜ   r   r   r   r   r³     ó    r³   c                   @   rØ   )rÃ   z+Task to upload a part in a multipart uploadc              	   C   sˆ   |�}|j d|||||dœ|¤Ž}	W d  ƒ n1 sw   Y  |	d }
|
|dœ}d|v rB|d  ¡ }d|› �}||	v rB|	| ||< |S )aÓ  
        :param client: The client to use when calling PutObject
        :param fileobj: The file to upload.
        :param bucket: The name of the bucket to upload to
        :param key: The name of the key to upload to
        :param upload_id: The id of the upload
        :param part_number: The number representing the part of the multipart
            upload
        :param extra_args: A dictionary of any extra arguments that may be
            used in the upload.

        :rtype: dict
        :returns: A dictionary representing a part::

            {'Etag': etag_value, 'PartNumber': part_number}

            This value can be appended to a list to be used to complete
            the multipart upload.
        )rÙ   rÚ   ÚUploadIdÚ
PartNumberrÛ   NÚETag)rá   rà   r˜   r·   r   )r¹   Úupper)r   r¥   r(   r©   rª   rº   ru   r«   rŽ   ÚresponseÚetagÚpart_metadataÚalgorithm_nameÚchecksum_memberr   r   r   rÜ   "  s&   ûúÿ	

zUploadPartTask._mainNrÝ   r   r   r   r   rÃ     rÞ   rÃ   )r|   Úior   Ús3transfer.compatr   r   Ús3transfer.constantsr   Ús3transfer.futuresr   Ús3transfer.tasksr   r	   r
   r   Ús3transfer.utilsr   r   r   r   r   r%   r:   r^   r   r†   r•   r³   rÃ   r   r   r   r   Ú<module>   s&   !,{]1   