U
    EZhv                     @   s  d dl Zd dlZd dlmZ d dlmZ d dlmZ d dl	m
Z
 d dlmZmZmZmZ zd dlmZ W n* ek
r   d dlmZ d;d	d
ZY nX zd dlmZ W n ek
r   dd ZY nX eeZdd Zdd Zdd Zdd Zdd Zdd Zeeedd<ddZeeedd=ddZ d>dd Z!d?d!d"Z"d@d#d$Z#dAd%d&Z$eeeddBd'd(Z dCd)d*Z%dDd+d,Z&eeeddEd-d.Z'dFd/d0Z(dGd1d2Z)d3d4 Z*eeeddHd5d6Z+dId7d8Z,dJd9d:Z-dS )K    N)partial)ClientError)utils)is_append_mode)ProgressCallbackInvoker
S3TransferTransferConfigcreate_transfer_manager)with_current_contextwrapsc                 C   s   dd }|S )Nc                    s   t   fdd}|S )Nc                     s
    | |S N )argskwargsfuncr   V/home/aprabhat/apps/x.techxrdev.in/venv/lib/python3.8/site-packages/boto3/s3/inject.pywrapper#   s    z8with_current_context.<locals>.decorator.<locals>.wrapperr   )r   r   r   r   r   	decorator"   s    z'with_current_context.<locals>.decoratorr   )hookr   r   r   r   r
   !   s    r
   )register_feature_idc                 C   s   d S r   r   )Z
feature_idr   r   r   r   0   s    r   c                 K   sJ   t | dt t | dt t | dt t | dt t | dt d S Nupload_filedownload_filecopyupload_fileobjdownload_fileobj)r   inject_attributer   r   r   r   r   Zclass_attributesr   r   r   r   inject_s3_transfer_methods7   s      r    c                 K   sX   t | dt t | dt t | dt t | dt t | dt t | dt d S )Nloadr   r   r   r   r   )r   r   bucket_loadbucket_upload_filebucket_download_filebucket_copybucket_upload_fileobjbucket_download_fileobjr   r   r   r   inject_bucket_methodsA   s$          r(   c                 K   sJ   t | dt t | dt t | dt t | dt t | dt d S r   )r   r   object_upload_fileobject_download_fileobject_copyobject_upload_fileobjobject_download_fileobjr   r   r   r   inject_object_methodsP   s"          r.   c                 K   s   t | dt d S )Nr!   )r   r   object_summary_loadr   r   r   r   inject_object_summary_methods^   s    r0   c              
   O   s   i | j _z8| j j }|d D ]}|d | jkr|| j _ q>qW n< tk
r| } z|jdi ddksl W 5 d}~X Y nX dS )z]
    Calls s3.Client.list_buckets() to update the attributes of the Bucket
    resource.
    ZBucketsNameErrorZCodeZAccessDeniedN)metadataclientZlist_bucketsnamer   responseget)selfr   r   r7   Zbucket_dataer   r   r   r"   b   s    
r"   c                 O   s8   | j jj| j| jd}d|kr,|d|d< || j _dS )za
    Calls s3.Client.head_object to update the attributes of the ObjectSummary
    resource.
    )BucketKeyZContentLengthSizeN)r3   r5   Zhead_objectbucket_namekeypopr4   )r9   r   r   r7   r   r   r   r/   {   s     r/   ZS3_TRANSFERc              
   C   s6   t | |"}|j|||||dW  5 Q R  S Q R X dS )ac  Upload a file to an S3 object.

    Usage::

        import boto3
        s3 = boto3.client('s3')
        s3.upload_file('/tmp/hello.txt', 'amzn-s3-demo-bucket', 'hello.txt')

    Similar behavior as S3Transfer's upload_file() method, except that
    argument names are capitalized. Detailed examples can be found at
    :ref:`S3Transfer's Usage <ref_s3transfer_usage>`.

    :type Filename: str
    :param Filename: The path to the file to upload.

    :type Bucket: str
    :param Bucket: The name of the bucket to upload to.

    :type Key: str
    :param Key: The name of the key to upload to.

    :type ExtraArgs: dict
    :param ExtraArgs: Extra arguments that may be passed to the
        client operation. For allowed upload arguments see
        :py:attr:`boto3.s3.transfer.S3Transfer.ALLOWED_UPLOAD_ARGS`.

    :type Callback: function
    :param Callback: A method which takes a number of bytes transferred to
        be periodically called during the upload.

    :type Config: boto3.s3.transfer.TransferConfig
    :param Config: The transfer configuration to be used when performing the
        transfer.
    )filenamebucketr?   
extra_argscallbackN)r   r   )r9   Filenamer;   r<   	ExtraArgsCallbackConfigtransferr   r   r   r      s    &r   c              
   C   s6   t | |"}|j|||||dW  5 Q R  S Q R X dS )ax  Download an S3 object to a file.

    Usage::

        import boto3
        s3 = boto3.client('s3')
        s3.download_file('amzn-s3-demo-bucket', 'hello.txt', '/tmp/hello.txt')

    Similar behavior as S3Transfer's download_file() method,
    except that parameters are capitalized. Detailed examples can be found at
    :ref:`S3Transfer's Usage <ref_s3transfer_usage>`.

    :type Bucket: str
    :param Bucket: The name of the bucket to download from.

    :type Key: str
    :param Key: The name of the key to download from.

    :type Filename: str
    :param Filename: The path to the file to download to.

    :type ExtraArgs: dict
    :param ExtraArgs: Extra arguments that may be passed to the
        client operation. For allowed download arguments see
        :py:attr:`boto3.s3.transfer.S3Transfer.ALLOWED_DOWNLOAD_ARGS`.

    :type Callback: function
    :param Callback: A method which takes a number of bytes transferred to
        be periodically called during the download.

    :type Config: boto3.s3.transfer.TransferConfig
    :param Config: The transfer configuration to be used when performing the
        transfer.
    )rB   r?   rA   rC   rD   N)r   r   )r9   r;   r<   rE   rF   rG   rH   rI   r   r   r   r      s    &r   c                 C   s   | j jj|| j||||dS )a  Upload a file to an S3 object.

    Usage::

        import boto3
        s3 = boto3.resource('s3')
        s3.Bucket('amzn-s3-demo-bucket').upload_file('/tmp/hello.txt', 'hello.txt')

    Similar behavior as S3Transfer's upload_file() method,
    except that parameters are capitalized. Detailed examples can be found at
    :ref:`S3Transfer's Usage <ref_s3transfer_usage>`.

    :type Filename: str
    :param Filename: The path to the file to upload.

    :type Key: str
    :param Key: The name of the key to upload to.

    :type ExtraArgs: dict
    :param ExtraArgs: Extra arguments that may be passed to the
        client operation. For allowed upload arguments see
        :py:attr:`boto3.s3.transfer.S3Transfer.ALLOWED_UPLOAD_ARGS`.

    :type Callback: function
    :param Callback: A method which takes a number of bytes transferred to
        be periodically called during the upload.

    :type Config: boto3.s3.transfer.TransferConfig
    :param Config: The transfer configuration to be used when performing the
        transfer.
    rE   r;   r<   rF   rG   rH   )r3   r5   r   r6   )r9   rE   r<   rF   rG   rH   r   r   r   r#      s    "r#   c                 C   s   | j jj| j|||||dS )a.  Download an S3 object to a file.

    Usage::

        import boto3
        s3 = boto3.resource('s3')
        s3.Bucket('amzn-s3-demo-bucket').download_file('hello.txt', '/tmp/hello.txt')

    Similar behavior as S3Transfer's download_file() method,
    except that parameters are capitalized. Detailed examples can be found at
    :ref:`S3Transfer's Usage <ref_s3transfer_usage>`.

    :type Key: str
    :param Key: The name of the key to download from.

    :type Filename: str
    :param Filename: The path to the file to download to.

    :type ExtraArgs: dict
    :param ExtraArgs: Extra arguments that may be passed to the
        client operation. For allowed download arguments see
        :py:attr:`boto3.s3.transfer.S3Transfer.ALLOWED_DOWNLOAD_ARGS`.

    :type Callback: function
    :param Callback: A method which takes a number of bytes transferred to
        be periodically called during the download.

    :type Config: boto3.s3.transfer.TransferConfig
    :param Config: The transfer configuration to be used when performing the
        transfer.
    r;   r<   rE   rF   rG   rH   )r3   r5   r   r6   )r9   r<   rE   rF   rG   rH   r   r   r   r$     s    "r$   c                 C   s   | j jj|| j| j|||dS )a  Upload a file to an S3 object.

    Usage::

        import boto3
        s3 = boto3.resource('s3')
        s3.Object('amzn-s3-demo-bucket', 'hello.txt').upload_file('/tmp/hello.txt')

    Similar behavior as S3Transfer's upload_file() method,
    except that parameters are capitalized. Detailed examples can be found at
    :ref:`S3Transfer's Usage <ref_s3transfer_usage>`.

    :type Filename: str
    :param Filename: The path to the file to upload.

    :type ExtraArgs: dict
    :param ExtraArgs: Extra arguments that may be passed to the
        client operation. For allowed upload arguments see
        :py:attr:`boto3.s3.transfer.S3Transfer.ALLOWED_UPLOAD_ARGS`.

    :type Callback: function
    :param Callback: A method which takes a number of bytes transferred to
        be periodically called during the upload.

    :type Config: boto3.s3.transfer.TransferConfig
    :param Config: The transfer configuration to be used when performing the
        transfer.
    rJ   )r3   r5   r   r>   r?   r9   rE   rF   rG   rH   r   r   r   r)   @  s    r)   c                 C   s   | j jj| j| j||||dS )a  Download an S3 object to a file.

    Usage::

        import boto3
        s3 = boto3.resource('s3')
        s3.Object('amzn-s3-demo-bucket', 'hello.txt').download_file('/tmp/hello.txt')

    Similar behavior as S3Transfer's download_file() method,
    except that parameters are capitalized. Detailed examples can be found at
    :ref:`S3Transfer's Usage <ref_s3transfer_usage>`.

    :type Filename: str
    :param Filename: The path to the file to download to.

    :type ExtraArgs: dict
    :param ExtraArgs: Extra arguments that may be passed to the
        client operation. For allowed download arguments see
        :py:attr:`boto3.s3.transfer.S3Transfer.ALLOWED_DOWNLOAD_ARGS`.

    :type Callback: function
    :param Callback: A method which takes a number of bytes transferred to
        be periodically called during the download.

    :type Config: boto3.s3.transfer.TransferConfig
    :param Config: The transfer configuration to be used when performing the
        transfer.
    rK   )r3   r5   r   r>   r?   rL   r   r   r   r*   i  s    r*   c              
   C   sx   d}|dk	rt |g}|}	|	dkr(t }	t|	}
d|
_t| |
,}|j||||||d}| W  5 Q R  S Q R X dS )a  Copy an object from one S3 location to another.

    This is a managed transfer which will perform a multipart copy in
    multiple threads if necessary.

    Usage::

        import boto3
        s3 = boto3.resource('s3')
        copy_source = {
            'Bucket': 'amzn-s3-demo-bucket1',
            'Key': 'mykey'
        }
        s3.meta.client.copy(copy_source, 'amzn-s3-demo-bucket2', 'otherkey')

    :type CopySource: dict
    :param CopySource: The name of the source bucket, key name of the
        source object, and optional version ID of the source object. The
        dictionary format is:
        ``{'Bucket': 'bucket', 'Key': 'key', 'VersionId': 'id'}``. Note
        that the ``VersionId`` key is optional and may be omitted.

    :type Bucket: str
    :param Bucket: The name of the bucket to copy to

    :type Key: str
    :param Key: The name of the key to copy to

    :type ExtraArgs: dict
    :param ExtraArgs: Extra arguments that may be passed to the
        client operation. For allowed download arguments see
        :py:attr:`boto3.s3.transfer.S3Transfer.ALLOWED_DOWNLOAD_ARGS`.

    :type Callback: function
    :param Callback: A method which takes a number of bytes transferred to
        be periodically called during the copy.

    :type SourceClient: botocore or boto3 Client
    :param SourceClient: The client to be used for operation that
        may happen at the source object. For example, this client is
        used for the head_object that determines the size of the copy.
        If no client is provided, the current client is used as the client
        for the source object.

    :type Config: boto3.s3.transfer.TransferConfig
    :param Config: The transfer configuration to be used when performing the
        copy.
    NZclassic)Zcopy_sourcerB   r?   rC   subscribersZsource_client)r   r   python_copyr   Zpreferred_transfer_clientr	   result)r9   
CopySourcer;   r<   rF   rG   SourceClientrH   rM   config
new_configmanagerfuturer   r   r   r     s$    ;

r   c              	   C   s   | j jj|| j|||||dS )a  Copy an object from one S3 location to an object in this bucket.

    This is a managed transfer which will perform a multipart copy in
    multiple threads if necessary.

    Usage::

        import boto3
        s3 = boto3.resource('s3')
        copy_source = {
            'Bucket': 'amzn-s3-demo-bucket1',
            'Key': 'mykey'
        }
        bucket = s3.Bucket('amzn-s3-demo-bucket2')
        bucket.copy(copy_source, 'otherkey')

    :type CopySource: dict
    :param CopySource: The name of the source bucket, key name of the
        source object, and optional version ID of the source object. The
        dictionary format is:
        ``{'Bucket': 'bucket', 'Key': 'key', 'VersionId': 'id'}``. Note
        that the ``VersionId`` key is optional and may be omitted.

    :type Key: str
    :param Key: The name of the key to copy to

    :type ExtraArgs: dict
    :param ExtraArgs: Extra arguments that may be passed to the
        client operation. For allowed download arguments see
        :py:attr:`boto3.s3.transfer.S3Transfer.ALLOWED_DOWNLOAD_ARGS`.

    :type Callback: function
    :param Callback: A method which takes a number of bytes transferred to
        be periodically called during the copy.

    :type SourceClient: botocore or boto3 Client
    :param SourceClient: The client to be used for operation that
        may happen at the source object. For example, this client is
        used for the head_object that determines the size of the copy.
        If no client is provided, the current client is used as the client
        for the source object.

    :type Config: boto3.s3.transfer.TransferConfig
    :param Config: The transfer configuration to be used when performing the
        copy.
    rP   r;   r<   rF   rG   rQ   rH   )r3   r5   r   r6   )r9   rP   r<   rF   rG   rQ   rH   r   r   r   r%     s    7r%   c              	   C   s    | j jj|| j| j||||dS )a  Copy an object from one S3 location to this object.

    This is a managed transfer which will perform a multipart copy in
    multiple threads if necessary.

    Usage::

        import boto3
        s3 = boto3.resource('s3')
        copy_source = {
            'Bucket': 'amzn-s3-demo-bucket1',
            'Key': 'mykey'
        }
        bucket = s3.Bucket('amzn-s3-demo-bucket2')
        obj = bucket.Object('otherkey')
        obj.copy(copy_source)

    :type CopySource: dict
    :param CopySource: The name of the source bucket, key name of the
        source object, and optional version ID of the source object. The
        dictionary format is:
        ``{'Bucket': 'bucket', 'Key': 'key', 'VersionId': 'id'}``. Note
        that the ``VersionId`` key is optional and may be omitted.

    :type ExtraArgs: dict
    :param ExtraArgs: Extra arguments that may be passed to the
        client operation. For allowed download arguments see
        :py:attr:`boto3.s3.transfer.S3Transfer.ALLOWED_DOWNLOAD_ARGS`.

    :type Callback: function
    :param Callback: A method which takes a number of bytes transferred to
        be periodically called during the copy.

    :type SourceClient: botocore or boto3 Client
    :param SourceClient: The client to be used for operation that
        may happen at the source object. For example, this client is
        used for the head_object that determines the size of the copy.
        If no client is provided, the current client is used as the client
        for the source object.

    :type Config: boto3.s3.transfer.TransferConfig
    :param Config: The transfer configuration to be used when performing the
        copy.
    rV   )r3   r5   r   r>   r?   )r9   rP   rF   rG   rQ   rH   r   r   r   r+   '  s    4r+   c              
   C   sx   t |dstdd}|dk	r(t|g}|}|dkr:t }t| |*}	|	j|||||d}
|
 W  5 Q R  S Q R X dS )a  Upload a file-like object to S3.

    The file-like object must be in binary mode.

    This is a managed transfer which will perform a multipart upload in
    multiple threads if necessary.

    Usage::

        import boto3
        s3 = boto3.client('s3')

        with open('filename', 'rb') as data:
            s3.upload_fileobj(data, 'amzn-s3-demo-bucket', 'mykey')

    :type Fileobj: a file-like object
    :param Fileobj: A file-like object to upload. At a minimum, it must
        implement the `read` method, and must return bytes.

    :type Bucket: str
    :param Bucket: The name of the bucket to upload to.

    :type Key: str
    :param Key: The name of the key to upload to.

    :type ExtraArgs: dict
    :param ExtraArgs: Extra arguments that may be passed to the
        client operation. For allowed upload arguments see
        :py:attr:`boto3.s3.transfer.S3Transfer.ALLOWED_UPLOAD_ARGS`.

    :type Callback: function
    :param Callback: A method which takes a number of bytes transferred to
        be periodically called during the upload.

    :type Config: boto3.s3.transfer.TransferConfig
    :param Config: The transfer configuration to be used when performing the
        upload.
    readzFileobj must implement readN)fileobjrB   r?   rC   rM   )hasattr
ValueErrorr   r   r	   uploadrO   )r9   Fileobjr;   r<   rF   rG   rH   rM   rR   rT   rU   r   r   r   r   f  s"    *

r   c                 C   s   | j jj|| j||||dS )a  Upload a file-like object to this bucket.

    The file-like object must be in binary mode.

    This is a managed transfer which will perform a multipart upload in
    multiple threads if necessary.

    Usage::

        import boto3
        s3 = boto3.resource('s3')
        bucket = s3.Bucket('amzn-s3-demo-bucket')

        with open('filename', 'rb') as data:
            bucket.upload_fileobj(data, 'mykey')

    :type Fileobj: a file-like object
    :param Fileobj: A file-like object to upload. At a minimum, it must
        implement the `read` method, and must return bytes.

    :type Key: str
    :param Key: The name of the key to upload to.

    :type ExtraArgs: dict
    :param ExtraArgs: Extra arguments that may be passed to the
        client operation. For allowed upload arguments see
        :py:attr:`boto3.s3.transfer.S3Transfer.ALLOWED_UPLOAD_ARGS`.

    :type Callback: function
    :param Callback: A method which takes a number of bytes transferred to
        be periodically called during the upload.

    :type Config: boto3.s3.transfer.TransferConfig
    :param Config: The transfer configuration to be used when performing the
        upload.
    r\   r;   r<   rF   rG   rH   )r3   r5   r   r6   )r9   r\   r<   rF   rG   rH   r   r   r   r&     s    'r&   c                 C   s   | j jj|| j| j|||dS )am  Upload a file-like object to this object.

    The file-like object must be in binary mode.

    This is a managed transfer which will perform a multipart upload in
    multiple threads if necessary.

    Usage::

        import boto3
        s3 = boto3.resource('s3')
        bucket = s3.Bucket('amzn-s3-demo-bucket')
        obj = bucket.Object('mykey')

        with open('filename', 'rb') as data:
            obj.upload_fileobj(data)

    :type Fileobj: a file-like object
    :param Fileobj: A file-like object to upload. At a minimum, it must
        implement the `read` method, and must return bytes.

    :type ExtraArgs: dict
    :param ExtraArgs: Extra arguments that may be passed to the
        client operation. For allowed upload arguments see
        :py:attr:`boto3.s3.transfer.S3Transfer.ALLOWED_UPLOAD_ARGS`.

    :type Callback: function
    :param Callback: A method which takes a number of bytes transferred to
        be periodically called during the upload.

    :type Config: boto3.s3.transfer.TransferConfig
    :param Config: The transfer configuration to be used when performing the
        upload.
    r]   )r3   r5   r   r>   r?   r9   r\   rF   rG   rH   r   r   r   r,     s    %r,   c                 C   s   t |rd| _td dS )a\  Set `TransferConfig.use_threads` to `False` if file-like
        object is in append mode.

    :type config: boto3.s3.transfer.TransferConfig
    :param config: The transfer configuration to be used when performing the
        download.

    :type fileobj: A file-like object
    :param fileobj: A file-like object to inspect for append mode.
    FzA single thread will be used because the provided file object is in append mode. Writes may always be appended to the end of the file regardless of seek position, so a single thread must be used to ensure sequential writes.N)r   Zuse_threadsloggerwarning)rR   rX   r   r   r    disable_threading_if_append_mode  s
    ra   c              
   C   s   t |dstdd}|dk	r(t|g}|}|dkr:t }t|}	t|	| t| |	*}
|
j|||||d}|	 W  5 Q R  S Q R X dS )a  Download an object from S3 to a file-like object.

    The file-like object must be in binary mode.

    This is a managed transfer which will perform a multipart download in
    multiple threads if necessary.

    Usage::

        import boto3
        s3 = boto3.client('s3')

        with open('filename', 'wb') as data:
            s3.download_fileobj('amzn-s3-demo-bucket', 'mykey', data)

    :type Bucket: str
    :param Bucket: The name of the bucket to download from.

    :type Key: str
    :param Key: The name of the key to download from.

    :type Fileobj: a file-like object
    :param Fileobj: A file-like object to download into. At a minimum, it must
        implement the `write` method and must accept bytes.

    :type ExtraArgs: dict
    :param ExtraArgs: Extra arguments that may be passed to the
        client operation. For allowed download arguments see
        :py:attr:`boto3.s3.transfer.S3Transfer.ALLOWED_DOWNLOAD_ARGS`.

    :type Callback: function
    :param Callback: A method which takes a number of bytes transferred to
        be periodically called during the download.

    :type Config: boto3.s3.transfer.TransferConfig
    :param Config: The transfer configuration to be used when performing the
        download.
    writezFileobj must implement writeN)rB   r?   rX   rC   rM   )
rY   rZ   r   r   rN   r   ra   r	   downloadrO   )r9   r;   r<   r\   rF   rG   rH   rM   rR   rS   rT   rU   r   r   r   r     s&    *



r   c                 C   s   | j jj| j|||||dS )a  Download an object from this bucket to a file-like-object.

    The file-like object must be in binary mode.

    This is a managed transfer which will perform a multipart download in
    multiple threads if necessary.

    Usage::

        import boto3
        s3 = boto3.resource('s3')
        bucket = s3.Bucket('amzn-s3-demo-bucket')

        with open('filename', 'wb') as data:
            bucket.download_fileobj('mykey', data)

    :type Fileobj: a file-like object
    :param Fileobj: A file-like object to download into. At a minimum, it must
        implement the `write` method and must accept bytes.

    :type Key: str
    :param Key: The name of the key to download from.

    :type ExtraArgs: dict
    :param ExtraArgs: Extra arguments that may be passed to the
        client operation. For allowed download arguments see
        :py:attr:`boto3.s3.transfer.S3Transfer.ALLOWED_DOWNLOAD_ARGS`.

    :type Callback: function
    :param Callback: A method which takes a number of bytes transferred to
        be periodically called during the download.

    :type Config: boto3.s3.transfer.TransferConfig
    :param Config: The transfer configuration to be used when performing the
        download.
    r;   r<   r\   rF   rG   rH   )r3   r5   r   r6   )r9   r<   r\   rF   rG   rH   r   r   r   r'   ^  s    'r'   c                 C   s   | j jj| j| j||||dS )a  Download this object from S3 to a file-like object.

    The file-like object must be in binary mode.

    This is a managed transfer which will perform a multipart download in
    multiple threads if necessary.

    Usage::

        import boto3
        s3 = boto3.resource('s3')
        bucket = s3.Bucket('amzn-s3-demo-bucket')
        obj = bucket.Object('mykey')

        with open('filename', 'wb') as data:
            obj.download_fileobj(data)

    :type Fileobj: a file-like object
    :param Fileobj: A file-like object to download into. At a minimum, it must
        implement the `write` method and must accept bytes.

    :type ExtraArgs: dict
    :param ExtraArgs: Extra arguments that may be passed to the
        client operation. For allowed download arguments see
        :py:attr:`boto3.s3.transfer.S3Transfer.ALLOWED_DOWNLOAD_ARGS`.

    :type Callback: function
    :param Callback: A method which takes a number of bytes transferred to
        be periodically called during the download.

    :type Config: boto3.s3.transfer.TransferConfig
    :param Config: The transfer configuration to be used when performing the
        download.
    rd   )r3   r5   r   r>   r?   r^   r   r   r   r-     s    %r-   )N)NNN)NNN)NNN)NNN)NNN)NNN)NNNN)NNNN)NNNN)NNN)NNN)NNN)NNN)NNN)NNN).r   rN   logging	functoolsr   Zbotocore.exceptionsr   Zboto3r   Zboto3.compatr   Zboto3.s3.transferr   r   r   r	   Zbotocore.contextr
   ImportErrorr   Zbotocore.useragentr   	getLogger__name__r_   r    r(   r.   r0   r"   r/   r   r   r#   r$   r)   r*   r%   r+   r   r&   r,   ra   r   r'   r-   r   r   r   r   <module>   s   

     /     0     
-     
-     
*     
)    V    
E    
?     @     
2     
/     C     
2     