U
    lHJew:                     @   s(  d dl mZmZmZ d dlm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G dd deZ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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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/d0 d0eZG d1d2 d2eZ G d3d4 d4eZ!G d5d6 d6eZ"G d7d8 d8eZ#G d9d: d:eZ$G d;d< d<eZ%G d=d> d>eZ&G d?d@ d@eZ'G dAdB dBe'Z(G dCdD dDe'Z)G dEdF dFeZ*G dGdH dHeZ+G dIdJ dJeZ,G dKdL dLeZ-G dMdN dNeZ.G dOdP dPeZ/G dQdR dReZ0G dSdT dTeZ1G dUdV dVeZ2G dWdX dXeZ3G dYdZ dZeZ4G d[d\ d\eZ5G d]d^ d^eZ6G d_d` d`eZ7G dadb dbeZ8G dcdd ddeZ9G dedf dfeZ:G dgdh dheZ;G didj djeZ<G dkdl dleZ=G dmdn dneZ>G dodp dpe>Z?G dqdr dre>Z@G dsdt dteZAG dudv dveZBG dwdx dxeZCG dydz dzeZDG d{d| d|eZEG d}d~ d~eZFG dd deFZGG dd deZHG dd deZIG dd deIZJG dd deIZKG dd deIZLG dd deZMG dd deZNG dd deZOG dd deZPG dd deZQG dd deZRG dd deZSG dd deZTG dd deZUG dd deZVG dd deZWG dd deZXG dd deZYG dd deZZG dd deZ[G dd deZ\G dd deZ]G dd deZ^G dd deZ_G dd deZ`G dd deZaG dd deZbG dd deZcG dd deZdG dd deZeG dd deZfG dd deZgG dd deZhdS )    )ListOptionalTuple)messagesc                   @   s   e Zd ZdS )InPlaceUpgradeNotSupportedErrorN__name__
__module____qualname__ r   r   5/usr/lib/python3/dist-packages/uaclient/exceptions.pyr      s   r   c                   @   s   e Zd ZdS )IsProLicensePresentErrorNr   r   r   r   r   r   
   s   r   c                   @   s   e Zd ZdS )CancelProLicensePollingNr   r   r   r   r   r      s   r   c                   @   s   e Zd ZdS )DelayProLicensePollingNr   r   r   r   r   r      s   r   c                       s$   e Zd Zeed fddZ  ZS )UrlError)causeurlc                    s:   t |dd rtt |d}nt|}t | || _d S )Nreason)getattrstrsuper__init__r   )selfr   r   Zcause_error	__class__r   r   r      s
    zUrlError.__init__)r   r	   r
   	Exceptionr   r   __classcell__r   r   r   r   r      s   r   c                       s0   e Zd Zdeee eedd fddZ  ZS )ProcessExecutionErrorN )cmd	exit_codestdoutstderrreturnc                    sH   || _ || _|| _|s&tjj|d}ntjj|||d}t | d S )N)r   )r   r    r"   )	r!   r"   r    r   ZSUBP_INVALID_COMMANDformatZSUBP_COMMAND_FAILEDr   r   )r   r   r    r!   r"   messager   r   r   r   %   s      zProcessExecutionError.__init__)Nr   r   )r   r	   r
   r   r   intr   r   r   r   r   r   r   $   s      r   c                   @   sJ   e Zd ZdZdZdZdZddddZedd Z	ed	d
 Z
dd ZdS )UbuntuProErrorzu
    Base class for all of our custom errors.
    All possible exceptions from our API should extend this class.
    N   r#   c                 K   sL   | j d k	r| j jf || _n| j| _|| _| D ]\}}t| || q2d S N)_formatted_msgr$   	named_msg_msgadditional_infoitemssetattr)r   kwargskeyvaluer   r   r   r   C   s    
zUbuntuProError.__init__c                 C   s   | j jS r*   r,   msgr   r   r   r   r5   P   s    zUbuntuProError.msgc                 C   s   | j jS r*   )r,   namer6   r   r   r   msg_codeT   s    zUbuntuProError.msg_codec                 C   s   | j jS r*   r4   r6   r   r   r   __str__X   s    zUbuntuProError.__str__)r   r	   r
   __doc__r-   r+   r    r   propertyr5   r8   r9   r   r   r   r   r'   8   s   

r'   c                       s(   e Zd ZdZejd fddZ  ZS )AnonymousUbuntuProErrorz
    For cases where we have a NamedMessage of an Error already but it isn't in
    exception form, and we need to raise it as an exception. This generally
    should only be used in cli-only code.
    )r,   c                    s   t  jf | || _d S r*   )r   r   r,   )r   r,   r1   r   r   r   r   i   s    z AnonymousUbuntuProError.__init__)r   r	   r
   r:   r   NamedMessager   r   r   r   r   r   r<   b   s   r<   c                   @   s   e Zd ZejZdS )APTProcessConflictErrorN)r   r	   r
   r   ZE_APT_PROCESS_CONFLICTr-   r   r   r   r   r>   s   s   r>   c                   @   s   e Zd ZejZdS )APTInvalidRepoErrorN)r   r	   r
   r   ZE_APT_UPDATE_INVALID_URL_CONFIGr+   r   r   r   r   r?   w   s   r?   c                   @   s   e Zd ZejZdS )APTUpdateProcessConflictErrorN)r   r	   r
   r   ZE_APT_UPDATE_PROCESS_CONFLICTr-   r   r   r   r   r@   {   s   r@   c                   @   s   e Zd ZejZdS )APTUpdateInvalidRepoErrorN)r   r	   r
   r   ZE_APT_UPDATE_INVALID_REPOr+   r   r   r   r   rA      s   rA   c                   @   s   e Zd ZejZdS )APTUpdateFailedN)r   r	   r
   r   ZE_APT_UPDATE_FAILEDr+   r   r   r   r   rB      s   rB   c                   @   s   e Zd ZejZdS )APTInstallProcessConflictErrorN)r   r	   r
   r   ZE_APT_INSTALL_PROCESS_CONFLICTr-   r   r   r   r   rC      s   rC   c                   @   s   e Zd ZejZdS )APTInstallInvalidRepoErrorN)r   r	   r
   r   ZE_APT_INSTALL_INVALID_REPOr+   r   r   r   r   rD      s   rD   c                   @   s   e Zd ZejZdS )APTInvalidCredentialsN)r   r	   r
   r   ZE_APT_INVALID_CREDENTIALSr+   r   r   r   r   rE      s   rE   c                   @   s   e Zd ZejZdS )
APTTimeoutN)r   r	   r
   r   ZE_APT_TIMEOUTr+   r   r   r   r   rF      s   rF   c                   @   s   e Zd ZejZdS )APTUnexpectedErrorN)r   r	   r
   r   ZE_APT_UNEXPECTED_ERRORr+   r   r   r   r   rG      s   rG   c                   @   s   e Zd ZejZdS )APTCommandTimeoutN)r   r	   r
   r   ZE_APT_COMMAND_TIMEOUTr+   r   r   r   r   rH      s   rH   c                   @   s   e Zd ZejZdS )SnapNotInstalledErrorN)r   r	   r
   r   ZE_SNAP_NOT_INSTALLED_ERRORr+   r   r   r   r   rI      s   rI   c                   @   s   e Zd ZejZdS )UnexpectedSnapdAPIErrorN)r   r	   r
   r   ZE_UNEXPECTED_SNAPD_API_ERRORr+   r   r   r   r   rJ      s   rJ   c                   @   s   e Zd ZejZdS )SnapdAPIConnectionRefusedN)r   r	   r
   r   ZE_SNAPD_CONNECTION_REFUSEDr-   r   r   r   r   rK      s   rK   c                   @   s   e Zd ZejZdS )CannotInstallSnapdErrorN)r   r	   r
   r   ZE_CANNOT_INSTALL_SNAPDr-   r   r   r   r   rL      s   rL   c                   @   s   e Zd ZejZdS )ErrorInstallingLivepatchN)r   r	   r
   r   ZE_ERROR_INSTALLING_LIVEPATCHr+   r   r   r   r   rM      s   rM   c                   @   s   e Zd ZejZdS )ProxyNotWorkingErrorN)r   r	   r
   r   ZE_NOT_SETTING_PROXY_NOT_WORKINGr+   r   r   r   r   rN      s   rN   c                   @   s   e Zd ZejZdS )ProxyInvalidUrlN)r   r	   r
   r   ZE_NOT_SETTING_PROXY_INVALID_URLr+   r   r   r   r   rO      s   rO   c                   @   s   e Zd ZejZdS )PycurlRequiredErrorN)r   r	   r
   r   ZE_PYCURL_REQUIREDr-   r   r   r   r   rP      s   rP   c                   @   s   e Zd ZejZdS )PycurlErrorN)r   r	   r
   r   ZE_PYCURL_ERRORr+   r   r   r   r   rQ      s   rQ   c                   @   s   e Zd ZejZdS )ProxyAuthenticationFailedN)r   r	   r
   r   ZE_PROXY_AUTH_FAILr-   r   r   r   r   rR      s   rR   c                   @   s   e Zd ZejZdS )ConnectivityErrorN)r   r	   r
   r   ZE_CONNECTIVITY_ERRORr-   r   r   r   r   rS      s   rS   c                   @   s&   e Zd ZejZdZdZdZdd Z	dS )ExternalAPIErrorNc                 C   s   d | j| j| jS )Nz{}: [{}], {})r$   coder   bodyr6   r   r   r   r9      s    zExternalAPIError.__str__)
r   r	   r
   r   ZE_EXTERNAL_API_ERRORr+   rU   r   rV   r9   r   r   r   r   rT      s
   rT   c                   @   s   e Zd ZdS )ContractAPIErrorNr   r   r   r   r   rW      s   rW   c                   @   s   e Zd ZdS )SecurityAPIErrorNr   r   r   r   r   rX      s   rX   c                       s(   e Zd ZejZdd fddZ  ZS )PycurlCACertificatesErrorNr)   c                    s   t  jf | || _d S r*   )r   r   r   )r   r   r1   r   r   r   r      s    z"PycurlCACertificatesError.__init__)r   r	   r
   r   ZE_PYCURL_CA_CERTIFICATESr-   r   r   r   r   r   r   rY      s   rY   c                   @   s   e Zd ZejZdS )InvalidServiceOpErrorNr   r	   r
   r   ZE_INVALID_SERVICE_OP_FAILUREr+   r   r   r   r   rZ      s   rZ   c                   @   s   e Zd ZdZdZejZdS )AlreadyAttachedErrorzDAn exception to be raised when a command needs an unattached system.   N)r   r	   r
   r:   r    r   ZE_ALREADY_ATTACHEDr+   r   r   r   r   r\      s   r\   c                   @   s   e Zd ZdZdZejZdS )AttachErrorz@An exception to be raised when we detect a generic attach error.r(   N)r   r	   r
   r:   r    r   ZE_ATTACH_FAILUREr-   r   r   r   r   r^      s   r^   c                   @   s   e Zd ZejZdS )AttachInvalidConfigFileErrorN)r   r	   r
   r   ZE_ATTACH_CONFIG_READ_ERRORr+   r   r   r   r   r_     s   r_   c                   @   s   e Zd ZejZdS )AttachInvalidTokenErrorN)r   r	   r
   r   ZE_ATTACH_INVALID_TOKENr-   r   r   r   r   r`   
  s   r`   c                   @   s   e Zd ZejZdS )AttachForbiddenExpiredN)r   r	   r
   r   ZE_ATTACH_FORBIDDEN_EXPIREDr+   r   r   r   r   ra     s   ra   c                   @   s   e Zd ZejZdS )AttachForbiddenNotYetN)r   r	   r
   r   ZE_ATTACH_FORBIDDEN_NOT_YETr+   r   r   r   r   rb     s   rb   c                   @   s   e Zd ZejZdS )AttachForbiddenNeverN)r   r	   r
   r   ZE_ATTACH_FORBIDDEN_NEVERr+   r   r   r   r   rc     s   rc   c                   @   s   e Zd ZejZdS )AttachExpiredTokenN)r   r	   r
   r   ZE_ATTACH_EXPIRED_TOKENr-   r   r   r   r   rd     s   rd   c                   @   s   e Zd ZejZdS ) MagicAttachTokenAlreadyActivatedN)r   r	   r
   r   Z&E_MAGIC_ATTACH_TOKEN_ALREADY_ACTIVATEDr-   r   r   r   r   re     s   re   c                   @   s   e Zd ZejZdS )MagicAttachTokenErrorN)r   r	   r
   r   ZE_MAGIC_ATTACH_TOKEN_ERRORr-   r   r   r   r   rf   "  s   rf   c                   @   s   e Zd ZejZdS )MagicAttachUnavailableN)r   r	   r
   r   ZE_MAGIC_ATTACH_UNAVAILABLEr-   r   r   r   r   rg   &  s   rg   c                   @   s   e Zd ZejZdS )MagicAttachInvalidParamN)r   r	   r
   r   ZE_MAGIC_ATTACH_INVALID_PARAMr+   r   r   r   r   rh   *  s   rh   c                   @   s   e Zd ZdZejZdS )MissingAptURLDirectivez@An exception for when the contract server doesn't include aptURLN)r   r	   r
   r:   r   ZE_MISSING_APT_URL_DIRECTIVEr+   r   r   r   r   ri   .  s   ri   c                   @   s   e Zd ZdZejZdS )UnattachedErrorz>An exception to be raised when a machine needs to be attached.N)r   r	   r
   r:   r   ZE_UNATTACHEDr-   r   r   r   r   rj   4  s   rj   c                   @   s   e Zd ZejZdS )UnattachedValidServicesErrorN)r   r	   r
   r   Z"E_VALID_SERVICE_FAILURE_UNATTACHEDr+   r   r   r   r   rk   :  s   rk   c                   @   s   e Zd ZejZdS )UnattachedMixedServicesErrorN)r   r	   r
   r   Z#E_MIXED_SERVICES_FAILURE_UNATTACHEDr+   r   r   r   r   rl   >  s   rl   c                   @   s   e Zd ZejZdS )UnattachedInvalidServicesErrorNr[   r   r   r   r   rm   B  s   rm   c                   @   s   e Zd ZejZdS )EntitlementNotFoundErrorN)r   r	   r
   r   ZE_ENTITLEMENT_NOT_FOUNDr+   r   r   r   r   rn   F  s   rn   c                       s:   e Zd ZdZejZeee	ej
f  d fddZ  ZS )EntitlementsNotEnabledError   )failed_servicesc                    s$   dd |D }t  jd|id d S )Nc                 S   s(   g | ] }|d  |d j |d jdqS )r   r(   )r7   rU   title)r7   r5   ).0fr   r   r   
<listcomp>R  s   z8EntitlementsNotEnabledError.__init__.<locals>.<listcomp>services)r.   )r   r   )r   rq   Z
info_dictsr   r   r   r   O  s    z$EntitlementsNotEnabledError.__init__)r   r	   r
   r    r   Z E_ENTITLEMENTS_NOT_ENABLED_ERRORr-   r   r   r   r=   r   r   r   r   r   r   ro   J  s   ro   c                   @   s   e Zd ZejZdS )AttachFailureDefaultServicesN)r   r	   r
   r   Z!E_ATTACH_FAILURE_DEFAULT_SERVICESr-   r   r   r   r   rw   [  s   rw   c                   @   s   e Zd ZejZdS )AttachFailureUnknownErrorN)r   r	   r
   r   ZE_ATTACH_FAILURE_UNEXPECTEDr-   r   r   r   r   rx   _  s   rx   c                   @   s   e Zd ZejZdS )RepoNoAptKeyN)r   r	   r
   r   ZE_REPO_NO_APT_KEYr+   r   r   r   r   ry   c  s   ry   c                   @   s   e Zd ZejZdS )RepoNoSuitesN)r   r	   r
   r   ZE_REPO_NO_SUITESr+   r   r   r   r   rz   g  s   rz   c                   @   s   e Zd ZejZdS )RepoPinFailNoOriginN)r   r	   r
   r   ZE_REPO_PIN_FAIL_NO_ORIGINr+   r   r   r   r   r{   k  s   r{   c                   @   s   e Zd ZejZdS ) InvalidContractDeltasServiceTypeN)r   r	   r
   r   Z&E_INVALID_CONTRACT_DELTAS_SERVICE_TYPEr+   r   r   r   r   r|   o  s   r|   c                   @   s   e Zd ZejZdZdS )InvalidProImageN)r   r	   r
   r   ZE_INVALID_PRO_IMAGEr+   Z	error_msgr   r   r   r   r}   x  s   r}   c                   @   s   e Zd ZejZdS )CloudMetadataErrorN)r   r	   r
   r   ZE_CLOUD_METADATA_ERRORr+   r   r   r   r   r~   }  s   r~   c                   @   s   e Zd ZdZejZdS )GCPServiceAccountErrorz;An exception raised when GCP service account is not enabledN)r   r	   r
   r:   r   Z$E_GCP_SERVICE_ACCT_NOT_ENABLED_ERRORr+   r   r   r   r   r     s   r   c                   @   s   e Zd ZejZdS )AWSNoValidIMDSN)r   r	   r
   r   ZE_AWS_NO_VALID_IMDSr+   r   r   r   r   r     s   r   c                   @   s   e Zd ZdS )CloudFactoryErrorNr   r   r   r   r   r     s   r   c                   @   s   e Zd ZejZdS )CloudFactoryNoCloudErrorN)r   r	   r
   r   Z E_UNABLE_TO_DETERMINE_CLOUD_TYPEr-   r   r   r   r   r     s   r   c                   @   s   e Zd ZejZdS )CloudFactoryNonViableCloudErrorN)r   r	   r
   r   ZE_UNSUPPORTED_AUTO_ATTACHr-   r   r   r   r   r     s   r   c                   @   s   e Zd ZdZdZejZdS )NonAutoAttachImageErrorz>Raised when machine isn't running an auto-attach enabled imager   N)r   r	   r
   r:   r    r   Z$E_UNSUPPORTED_AUTO_ATTACH_CLOUD_TYPEr+   r   r   r   r   r     s   r   c                   @   s   e Zd ZejZdS )InvalidFileFormatErrorN)r   r	   r
   r   ZE_INVALID_FILE_FORMATr+   r   r   r   r   r     s   r   c                   @   s   e Zd ZejZdS )ParsingErrorOnOSReleaseFileN)r   r	   r
   r   Z"E_ERROR_PARSING_VERSION_OS_RELEASEr+   r   r   r   r   r     s   r   c                   @   s   e Zd ZejZdS )MissingSeriesOnOSReleaseFileN)r   r	   r
   r   ZE_MISSING_SERIES_ON_OS_RELEASEr+   r   r   r   r   r     s   r   c                   @   s   e Zd ZejZdS )InvalidLockFileN)r   r	   r
   r   ZE_INVALID_LOCK_FILEr+   r   r   r   r   r     s   r   c                   @   s   e Zd ZejZdS )InvalidJsonN)r   r	   r
   r   ZE_JSON_PARSER_ERRORr+   r   r   r   r   r     s   r   c                   @   s   e Zd ZejZdS )InvalidBooleanConfigValueN)r   r	   r
   r   ZE_INVALID_BOOLEAN_CONFIG_VALUEr+   r   r   r   r   r     s   r   c                   @   s   e Zd ZejZdS )InvalidPosIntConfigValueN)r   r	   r
   r   Z"E_CLI_CONFIG_VALUE_MUST_BE_POS_INTr+   r   r   r   r   r     s   r   c                   @   s   e Zd ZejZdS )InvalidURLConfigValueN)r   r	   r
   r   ZE_CONFIG_INVALID_URLr+   r   r   r   r   r     s   r   c                   @   s   e Zd ZejZdS )InvalidFeatureYamlConfigValueN)r   r	   r
   r   ZE_CONFIG_NO_YAML_FILEr+   r   r   r   r   r     s   r   c                   @   s   e Zd ZejZdS )InvalidProxyCombinationConfigN)r   r	   r
   r   ZE_INVALID_PROXY_COMBINATIONr-   r   r   r   r   r     s   r   c                   @   s   e Zd ZejZdS )MissingDistroInfoFileN)r   r	   r
   r   ZE_MISSING_DISTRO_INFO_FILEr-   r   r   r   r   r     s   r   c                   @   s   e Zd ZejZdS )MissingSeriesInDistroInfoFileN)r   r	   r
   r   Z$E_MISSING_SERIES_IN_DISTRO_INFO_FILEr+   r   r   r   r   r     s   r   c                   @   s   e Zd ZejZdS )InvalidOptionCombinationN)r   r	   r
   r   ZE_INVALID_OPTION_COMBINATIONr+   r   r   r   r   r     s   r   c                   @   s   e Zd ZejZdS )NoHelpContentN)r   r	   r
   r   ZE_CLI_NO_HELPr+   r   r   r   r   r     s   r   c                   @   s   e Zd ZejZdS )InvalidSecurityIssueIdFormatN)r   r	   r
   r   Z#E_SECURITY_FIX_CLI_ISSUE_REGEX_FAILr+   r   r   r   r   r     s   r   c                   @   s   e Zd ZejZdS )InvalidArgChoiceN)r   r	   r
   r   ZE_CLI_VALID_CHOICESr+   r   r   r   r   r     s   r   c                   @   s   e Zd ZejZdS )GenericInvalidFormatN)r   r	   r
   r   ZE_CLI_EXPECTED_FORMATr+   r   r   r   r   r     s   r   c                   @   s   e Zd ZejZdS )RefreshConfigFailureN)r   r	   r
   r   ZE_REFRESH_CONFIG_FAILUREr-   r   r   r   r   r     s   r   c                   @   s   e Zd ZejZdS )RefreshContractFailureN)r   r	   r
   r   ZE_REFRESH_CONTRACT_FAILUREr-   r   r   r   r   r     s   r   c                   @   s   e Zd ZejZdS )RefreshMessagesFailureN)r   r	   r
   r   ZE_REFRESH_MESSAGES_FAILUREr-   r   r   r   r   r     s   r   c                   @   s   e Zd ZejZdS )CLIJSONFormatRequireAssumeYesN)r   r	   r
   r   Z E_JSON_FORMAT_REQUIRE_ASSUME_YESr-   r   r   r   r   r     s   r   c                   @   s   e Zd ZejZdS )CLIAttachTokenArgXORConfigN)r   r	   r
   r   ZE_ATTACH_TOKEN_ARG_XOR_CONFIGr-   r   r   r   r   r     s   r   c                   @   s   e Zd ZejZdS )CLIAPIOptionsXORDataN)r   r	   r
   r   Z"E_API_ERROR_ARGS_AND_DATA_TOGETHERr-   r   r   r   r   r      s   r   c                   @   s   e Zd ZdZejZdZdS )LockHeldErrora  An exception for when another pro operation is in progress

    :param lock_request: String of the command requesting the lock
    :param lock_holder: String of the command that currently holds the lock
    :param pid: Integer of the process id of the lock_holder
    N)r   r	   r
   r:   r   ZE_LOCK_HELD_ERRORr+   pidr   r   r   r   r   	  s   r   c                   @   s   e Zd ZdZejZdS )NonRootUserErrorz7An exception to be raised when a user needs to be root.N)r   r	   r
   r:   r   ZE_NONROOT_USERr-   r   r   r   r   r     s   r   c                   @   s   e Zd ZdZejZdS )SecurityAPIMetadataErrorzDAn exception raised with Security API metadata returns invalid data.N)r   r	   r
   r:   r   ZE_SECURITY_API_INVALID_METADATAr+   r   r   r   r   r     s   r   c                   @   s   e Zd ZejZdS )SecurityIssueNotFoundN)r   r	   r
   r   ZE_SECURITY_FIX_NOT_FOUND_ISSUEr+   r   r   r   r   r   !  s   r   c                   @   s   e Zd ZejZdS )GPGKeyNotFoundN)r   r	   r
   r   ZE_GPG_KEY_NOT_FOUNDr+   r   r   r   r   r   %  s   r   N)itypingr   r   r   Zuaclientr   r   r   r   r   r   IOErrorr   r   r'   ZUserFacingErrorr<   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   rS   rT   rW   rX   rY   rZ   r\   r^   r_   r`   ra   rb   rc   rd   re   rf   rg   rh   ri   rj   rk   rl   rm   rn   ro   rw   rx   ry   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   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s   '		
			