U
    2d=                     @   s0  d dl Z d dlmZmZmZmZmZ d dl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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Z0G dOdP dPe0Z1G dQdR dRe0Z2G dSdT dTe3Z4G dUdV dVe3Z5G dWdX dXeZ6G dYdZ dZe6Z7G d[d\ d\e6Z8G d]d^ d^eZ9G 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ZAG dodp dpeZBG dqdr dreZCG dsdt dteZDG dudv dveZEG dwdx dxeZFG dydz dzeZGG d{d| d|eZHG d}d~ d~eZIG dd deZJG dd deZKdS )    N)AnyDictListOptionalTuple)messages)PRINT_WRAP_WIDTHc                   @   s:   e Zd ZdZdZdeee eeeef  ddddZ	dS )UserFacingErrorz
    An exception to be raised when an execution-ending error is encountered.

    :param msg:
        Takes a single parameter, which is the user-facing error message that
        should be emitted before exiting non-zero.
       N)msgmsg_codeadditional_inforeturnc                 C   s   || _ || _|| _d S Nr   r   r   )selfr   r   r    r   5/usr/lib/python3/dist-packages/uaclient/exceptions.py__init__   s    zUserFacingError.__init__)NN)
__name__
__module____qualname____doc__	exit_codestrr   r   r   r   r   r   r   r   r	      s     r	   c                       s&   e Zd Zeedd fddZ  ZS )APTInstallErrorN)nameservice_msgr   c                    s   t  jtjjtjjd d S Nr   r   )superr   r   ZAPT_INSTALL_FAILEDr   r   )r   r   r   	__class__r   r   r      s    zAPTInstallError.__init__r   r   r   r   r   __classcell__r   r   r!   r   r      s   r   c                       s   e Zd Z fddZ  ZS )APTProcessConflictErrorc                    s   t  jtjjtjjd d S r   )r    r   r   ZAPT_PROCESS_CONFLICTr   r   r   r!   r   r   r   '   s    z APTProcessConflictError.__init__r   r   r   r   r$   r   r   r!   r   r%   &   s   r%   c                       s$   e Zd Zedd fddZ  ZS )APTInvalidRepoErrorN	error_msgr   c                    s   t  j|d d S )Nr   )r    r   )r   r*   r!   r   r   r   /   s    zAPTInvalidRepoError.__init__r#   r   r   r!   r   r(   .   s   r(   c                       s"   e Zd Zdd fddZ  ZS )APTUpdateProcessConflictErrorNr   c                    s   t  jtjjtjjd d S r   )r    r   r   ZAPT_UPDATE_PROCESS_CONFLICTr   r   r&   r!   r   r   r   4   s    z&APTUpdateProcessConflictError.__init__r'   r   r   r!   r   r,   3   s   r,   c                       s$   e Zd Zedd fddZ  ZS )APTUpdateInvalidRepoErrorN)repo_msgr   c                    s&   t jj|d}t j|j|jd d S )N)r/   r   )r   ZAPT_UPDATE_INVALID_REPOformatr    r   r   r   )r   r/   r   r!   r   r   r   <   s    z"APTUpdateInvalidRepoError.__init__r#   r   r   r!   r   r.   ;   s   r.   c                       s*   e Zd Zdee dd fddZ  ZS )APTInstallProcessConflictErrorN)
header_msgr   c                    s2   |r|d7 }t jj|d}t j|j|jd d S )N.
)r2   r   )r   ZAPT_INSTALL_PROCESS_CONFLICTr0   r    r   r   r   )r   r2   r   r!   r   r   r   B   s    z'APTInstallProcessConflictError.__init__)Nr   r   r   r   r   r   r$   r   r   r!   r   r1   A   s   r1   c                       s,   e Zd Zdeee dd fddZ  ZS )APTInstallInvalidRepoErrorN)r/   r2   r   c                    s4   |r|d7 }t jj||d}t j|j|jd d S )Nr3   )r2   r/   r   )r   ZAPT_INSTALL_INVALID_REPOr0   r    r   r   r   )r   r/   r2   r   r!   r   r   r   N   s     z#APTInstallInvalidRepoError.__init__)N)r   r   r   r   r   r   r$   r   r   r!   r   r5   M   s     r5   c                       s"   e Zd Zdd fddZ  ZS )CannotInstallSnapdErrorNr-   c                    s   t j}t j|j|jd d S r   )r   ZCANNOT_INSTALL_SNAPDr    r   r   r   r   r   r!   r   r   r   [   s    z CannotInstallSnapdError.__init__r'   r   r   r!   r   r6   Z   s   r6   c                       s$   e Zd Zedd fddZ  ZS )ErrorInstallingLivepatchNr)   c                    s&   t jj|d}t j|j|jd d S )Nr*   r   )r   ZERROR_INSTALLING_LIVEPATCHr0   r    r   r   r   r   r*   r   r!   r   r   r   a   s    z!ErrorInstallingLivepatch.__init__r#   r   r   r!   r   r8   `   s   r8   c                       s(   e Zd Zeeedd fddZ  ZS )InvalidServiceToDisableErrorN)	operationinvalid_servicer   r   c                    s*   t jj|||d}t j|j|jd d S )N)r<   r=   r   r   )r   ZINVALID_SERVICE_OP_FAILUREr0   r    r   r   r   )r   r<   r=   r   r   r!   r   r   r   g   s    z%InvalidServiceToDisableError.__init__r#   r   r   r!   r   r;   f   s
     r;   c                       s"   e Zd Zed fddZ  ZS )ProxyNotWorkingErrorproxyc                    s$   t  jtjj|djtjjd d S Nr?   r   )r    r   r   ZNOT_SETTING_PROXY_NOT_WORKINGr0   r   r   r   r@   r!   r   r   r   s   s    zProxyNotWorkingError.__init__r#   r   r   r!   r   r>   r   s   r>   c                       s"   e Zd Zed fddZ  ZS )ProxyInvalidUrlr?   c                    s$   t  jtjj|djtjjd d S rA   )r    r   r   ZNOT_SETTING_PROXY_INVALID_URLr0   r   r   rB   r!   r   r   r   {   s    zProxyInvalidUrl.__init__r#   r   r   r!   r   rC   z   s   rC   c                   @   s   e Zd ZdZdZdS )NonAutoAttachImageErrorz>Raised when machine isn't running an auto-attach enabled imager   N)r   r   r   r   r   r   r   r   r   rD      s   rD   c                       s*   e Zd ZdZdZed fddZ  ZS )AlreadyAttachedErrorzDAn exception to be raised when a command needs an unattached system.   account_namec                    s&   t jj|d}t j|j|jd d S )NrG   r   )r   ZALREADY_ATTACHEDr0   r    r   r   r   )r   rH   r   r!   r   r   r      s    zAlreadyAttachedError.__init__)r   r   r   r   r   r   r   r$   r   r   r!   r   rE      s   rE   c                       s$   e Zd ZdZdZ fddZ  ZS )AttachErrorz@An exception to be raised when we detect a generic attach error.r
   c                    s   t j}t j|j|jd d S r   )r   ZATTACH_FAILUREr    r   r   r   r7   r!   r   r   r      s    zAttachError.__init__)r   r   r   r   r   r   r$   r   r   r!   r   rI      s   rI   c                       s&   e Zd Zeedd fddZ  ZS )AttachInvalidConfigFileErrorN)config_nameerrorr   c                    s2   t jj||d}t jtj|jtd|j	d d S )N)rK   rL   )widthr   )
r   ZATTACH_CONFIG_READ_ERRORr0   r    r   textwrapZfillr   r   r   )r   rK   rL   r   r!   r   r   r      s     z%AttachInvalidConfigFileError.__init__r#   r   r   r!   r   rJ      s   rJ   c                       s   e Zd Z fddZ  ZS )AttachInvalidTokenErrorc                    s   t  jtjjtjjd d S r   )r    r   r   ZATTACH_INVALID_TOKENr   r   r&   r!   r   r   r      s    z AttachInvalidTokenError.__init__r'   r   r   r!   r   rO      s   rO   c                       s   e Zd Z fddZ  ZS )ConnectivityErrorc                    s   t  jtjjtjjd d S r   )r    r   r   ZCONNECTIVITY_ERRORr   r   r&   r!   r   r   r      s    zConnectivityError.__init__r'   r   r   r!   r   rP      s   rP   c                       s   e Zd Z fddZ  ZS ) MagicAttachTokenAlreadyActivatedc                    s   t j}t j|j|jd d S r   )r   Z$MAGIC_ATTACH_TOKEN_ALREADY_ACTIVATEDr    r   r   r   r7   r!   r   r   r      s
    z)MagicAttachTokenAlreadyActivated.__init__r'   r   r   r!   r   rQ      s   rQ   c                       s   e Zd Z fddZ  ZS )MagicAttachTokenErrorc                    s   t j}t j|j|jd d S r   )r   ZMAGIC_ATTACH_TOKEN_ERRORr    r   r   r   r7   r!   r   r   r      s
    zMagicAttachTokenError.__init__r'   r   r   r!   r   rR      s   rR   c                       s"   e Zd Zed fddZ  ZS )MagicAttachInvalidEmailemailc                    s&   t jj|d}t j|j|jd d S )NrT   r   )r   ZMAGIC_ATTACH_INVALID_EMAILr0   r    r   r   r   )r   rU   r   r!   r   r   r      s
    z MagicAttachInvalidEmail.__init__r#   r   r   r!   r   rS      s   rS   c                       s   e Zd Z fddZ  ZS )MagicAttachUnavailablec                    s   t j}t j|j|jd d S r   )r   ZMAGIC_ATTACH_UNAVAILABLEr    r   r   r   r7   r!   r   r   r      s
    zMagicAttachUnavailable.__init__r'   r   r   r!   r   rV      s   rV   c                       s   e Zd Z fddZ  ZS )MagicAttachInvalidParamc                    s(   t jj||d}t j|j|jd d S )N)paramvaluer   )r   ZMAGIC_ATTACH_INVALID_PARAMr0   r    r   r   r   )r   rX   rY   r   r!   r   r   r      s
     z MagicAttachInvalidParam.__init__r'   r   r   r!   r   rW      s   rW   c                       s*   e Zd ZdZeeed fddZ  Z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
    lock_requestlock_holderpidc                    s6   || _ || _tjj|||d}t j|j|jd d S )Nr[   r   )	r]   r^   r   ZLOCK_HELD_ERRORr0   r    r   r   r   )r   r\   r]   r^   r   r!   r   r   r      s      zLockHeldError.__init__)r   r   r   r   r   intr   r$   r   r   r!   r   rZ      s   rZ   c                       s    e Zd ZdZ fddZ  ZS )MissingAptURLDirectivez@An exception for when the contract server doesn't include aptURLc                    s&   t jj|d}t j|j|jd d S )Nentitlement_namer   )r   ZMISSING_APT_URL_DIRECTIVEr0   r    r   r   r   r   rb   r   r!   r   r   r      s    zMissingAptURLDirective.__init__r   r   r   r   r   r$   r   r   r!   r   r`      s   r`   c                       s&   e Zd ZdZdd fddZ  ZS )NonRootUserErrorz7An exception to be raised when a user needs to be root.Nr-   c                    s   t  jtjjtjjd d S r   )r    r   r   ZNONROOT_USERr   r   r&   r!   r   r   r     s     zNonRootUserError.__init__rd   r   r   r!   r   re      s   re   c                       s0   e Zd ZdZejfejdd fddZ  ZS )UnattachedErrorz>An exception to be raised when a machine needs to be attached.N)r   r   c                    s   t  j|j|jd d S r   r    r   r   r   r7   r!   r   r   r     s    zUnattachedError.__init__)	r   r   r   r   r   Z
UNATTACHEDNamedMessager   r$   r   r   r!   r   rf     s   rf   c                       s*   e Zd ZdZeedd fddZ  ZS )SecurityAPIMetadataErrorzDAn exception raised with Security API metadata returns invalid data.N)r   issue_idr   c                    s(   t  d| d tjj|dd  d S )NzError: 
 )ZissueZ
extra_info)r    r   r   ZSECURITY_ISSUE_NOT_RESOLVEDr0   )r   r   rj   r!   r   r   r     s     z!SecurityAPIMetadataError.__init__)r   r   r   r   r   r   r$   r   r   r!   r   ri     s   ri   c                       s"   e Zd Zed fddZ  ZS )InvalidProImager9   c                    s,   || _ tjj|d}t j|j|jd d S )Nr+   r   )Zcontract_server_msgr   ZINVALID_PRO_IMAGEr0   r    r   r   r   r:   r!   r   r   r      s    zInvalidProImage.__init__r#   r   r   r!   r   rm     s   rm   c                       s6   e Zd ZdZdeee d fddZdd Z  ZS )	GCPProAccountErrorz?An exception raised when GCP Pro service account is not enabledNr   c                    s   || _ t || d S r   )coder    r   )r   r   r   ro   r!   r   r   r   )  s    zGCPProAccountError.__init__c                 C   s   dj | j| jdS )Nz(GCPProServiceAccount Error {code}: {msg})ro   r   )r0   ro   r   r&   r   r   r   __str__-  s     zGCPProAccountError.__str__)N)	r   r   r   r   r   r   r   rp   r$   r   r   r!   r   rn   &  s   rn   c                   @   s    e Zd Zee ddddZdS )CloudFactoryErrorN)
cloud_typer   c                 C   s
   || _ d S r   )rr   )r   rr   r   r   r   r   4  s    zCloudFactoryError.__init__)r   r   r   r   r   r   r   r   r   r   rq   3  s   rq   c                   @   s   e Zd ZdS )CloudFactoryNoCloudErrorNr   r   r   r   r   r   r   rs   8  s   rs   c                   @   s   e Zd ZdS )!CloudFactoryUnsupportedCloudErrorNrt   r   r   r   r   ru   <  s   ru   c                   @   s   e Zd ZdS )CloudFactoryNonViableCloudErrorNrt   r   r   r   r   rv   @  s   rv   c                       s"   e Zd Zed fddZ  ZS )EntitlementNotFoundErrorra   c                    s&   t jj|d}t j|j|jd d S )N)r   r   )r   ZENTITLEMENT_NOT_FOUNDr0   r    r   r   r   rc   r!   r   r   r   E  s    z!EntitlementNotFoundError.__init__r#   r   r   r!   r   rw   D  s   rw   c                       s>   e Zd ZdZejfeeeej	f  ej	d fddZ
  ZS )EntitlementsNotEnabledError   failed_servicesr   c                    s,   dd |D }t  j|j|jd|id d S )Nc                 S   s(   g | ] }|d  |d j |d jdqS )r   r
   )r   ro   title)r   r   ).0fr   r   r   
<listcomp>S  s   z8EntitlementsNotEnabledError.__init__.<locals>.<listcomp>servicesr   rg   )r   r{   r   Z
info_dictsr!   r   r   r   N  s    z$EntitlementsNotEnabledError.__init__)r   r   r   r   r   ZENTITLEMENTS_NOT_ENABLED_ERRORr   r   r   rh   r   r$   r   r   r!   r   rx   J  s   rx   c                       s0   e Zd Zeeeejf  d fddZ  Z	S )AttachFailureDefaultServicesr{   c                    s   t  j|tjd d S Nrz   )r    r   r   ZATTACH_FAILURE_DEFAULT_SERVICESr   r{   r!   r   r   r   _  s    z%AttachFailureDefaultServices.__init__
r   r   r   r   r   r   r   rh   r   r$   r   r   r!   r   r   ^  s   r   c                       s0   e Zd Zeeeejf  d fddZ  Z	S )AttachFailureUnknownErrorr   c                    s   t  j|tjd d S r   )r    r   r   ZUNEXPECTED_ERRORr   r!   r   r   r   i  s     z"AttachFailureUnknownError.__init__r   r   r   r!   r   r   h  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)getattrr   r    r   r   )r   r   r   Zcause_errorr!   r   r   r   r  s
    zUrlError.__init__)r   r   r   	Exceptionr   r   r$   r   r   r!   r   r   q  s   r   c                       s0   e Zd Zdeee eedd fddZ  ZS )ProcessExecutionErrorNrl   )cmdr   stdoutstderrr   c                    s<   || _ || _|| _|sd}nd}t |j|||d d S )Nz"Invalid command specified '{cmd}'.zEFailed running command '{cmd}' [exit({exit_code})]. Message: {stderr})r   r   r   )r   r   r   r    r   r0   )r   r   r   r   r   Zmessage_tmplr!   r   r   r     s    zProcessExecutionError.__init__)Nrl   rl   )r   r   r   r   r   r_   r   r$   r   r   r!   r   r     s      r   c                       s.   e Zd Zeeed fddZdd Z  ZS )ExternalAPIErrorr   ro   bodyc                    s:   || _ || _|| _tjj|||d}t |j|j	 d S )Nr   )
r   ro   r   r   ZEXTERNAL_API_ERRORr0   r    r   r   r   )r   r   ro   r   r   r!   r   r   r     s
    zExternalAPIError.__init__c                 C   s   d | j| j| jS )Nz{}: [{}], {})r0   ro   r   r   r&   r   r   r   rp     s    zExternalAPIError.__str__)r   r   r   r   r_   r   rp   r$   r   r   r!   r   r     s   r   c                   @   s   e Zd ZdS )ContractAPIErrorNrt   r   r   r   r   r     s   r   c                   @   s   e Zd ZdS )SecurityAPIErrorNrt   r   r   r   r   r     s   r   c                   @   s   e Zd ZdS )InPlaceUpgradeNotSupportedErrorNrt   r   r   r   r   r     s   r   c                   @   s   e Zd ZdS )IsProLicensePresentErrorNrt   r   r   r   r   r     s   r   c                   @   s   e Zd ZdS )CancelProLicensePollingNrt   r   r   r   r   r     s   r   c                   @   s   e Zd ZdS )DelayProLicensePollingNrt   r   r   r   r   r     s   r   c                       s&   e Zd Zeedd fddZ  ZS )InvalidFileFormatErrorN)	file_namefile_formatr   c                    s(   t jj||d}t j|j|jd d S )N)r   r   r   )r   ZINVALID_FILE_FORMATr0   r    r   r   r   )r   r   r   r   r!   r   r   r     s
     zInvalidFileFormatError.__init__r#   r   r   r!   r   r     s   r   c                       s$   e Zd Zeed fddZ  ZS )ParsingErrorOnOSReleaseFileorig_vermod_verc                    s(   t jj||d}t j|j|jd d S )Nr   r   )r   Z ERROR_PARSING_VERSION_OS_RELEASEr0   r    r   r   r   )r   r   r   r   r!   r   r   r     s
     z$ParsingErrorOnOSReleaseFile.__init__r#   r   r   r!   r   r     s   r   c                       s   e Zd Z fddZ  ZS )MissingSeriesOnOSReleaseFilec                    s&   t jj|d}t j|j|jd d S )N)versionr   )r   ZMISSING_SERIES_ON_OS_RELEASEr0   r    r   r   r   )r   r   r   r!   r   r   r     s    z%MissingSeriesOnOSReleaseFile.__init__r'   r   r   r!   r   r     s   r   c                       s   e Zd Z fddZ  ZS )InvalidLockFilec                    s&   t jj|d}t j|j|jd d S )N)lock_file_pathr   )r   ZINVALID_LOCK_FILEr0   r    r   r   r   )r   r   r   r!   r   r   r     s    zInvalidLockFile.__init__r'   r   r   r!   r   r     s   r   c                       s$   e Zd Zeed fddZ  ZS )InvalidOptionCombinationoption1option2c                    s(   t jj||d}t j|j|jd d S )Nr   r   )r   ZINVALID_OPTION_COMBINATIONr0   r    r   r   r   )r   r   r   r   r!   r   r   r     s
     z!InvalidOptionCombination.__init__r#   r   r   r!   r   r     s   r   c                       s&   e Zd Zeedd fddZ  ZS )CloudMetadataErrorN)ro   r   r   c                    s(   t jj||d}t j|j|jd d S )N)ro   r   r   )r   ZCLOUD_METADATA_ERRORr0   r    r   r   r   )r   ro   r   r   r!   r   r   r     s    zCloudMetadataError.__init__)r   r   r   r_   r   r   r$   r   r   r!   r   r     s   r   c                       s"   e Zd Zed fddZ  ZS )SnapNotInstalledErrorsnapc                    s&   t jj|d}t j|j|jd d S )Nr   r   )r   ZSNAP_NOT_INSTALLED_ERRORr0   r    r   r   r   )r   r   r   r!   r   r   r     s    zSnapNotInstalledError.__init__r#   r   r   r!   r   r     s   r   c                       s&   e Zd Zee d fddZ  ZS )UnexpectedSnapdAPIErrorrL   c                    s.   t jj|r|ndd}t j|j|jd d S )Nrl   r   r   )r   ZUNEXPECTED_SNAPD_API_ERRORr0   r    r   r   r   )r   rL   r   r!   r   r   r     s    
z UnexpectedSnapdAPIError.__init__r4   r   r   r!   r   r     s   r   c                       s   e Zd Z fddZ  ZS )SnapdAPIConnectionRefusedc                    s   t j}t j|j|jd d S r   )r   ZSNAPD_CONNECTION_REFUSEDr    r   r   r   r7   r!   r   r   r     s    z"SnapdAPIConnectionRefused.__init__r'   r   r   r!   r   r     s   r   c                       s$   e Zd Zeed fddZ  ZS )SnapdInvalidJson)r   outc                    s.   t jjd||d}t j|j|jd d S )NzSNAPD API {})sourcer   r   )r   ZJSON_PARSER_ERRORr0   r    r   r   r   )r   r   r   r   r!   r   r   r     s
    zSnapdInvalidJson.__init__r#   r   r   r!   r   r     s   r   c                       s"   e Zd Zdd fddZ  ZS )PycurlRequiredErrorNr-   c                    s   t j}t j|j|jd d S r   )r   ZPYCURL_REQUIREDr    r   r   r   r7   r!   r   r   r     s    zPycurlRequiredError.__init__r'   r   r   r!   r   r     s   r   c                       s"   e Zd Zdd fddZ  ZS )PycurlErrorNr-   c                    s*   t jjt|d}t j|j|jd d S )N)er   )r   ZPYCURL_ERRORr0   r   r    r   r   r   )r   r   r   r!   r   r   r     s    zPycurlError.__init__r'   r   r   r!   r   r     s   r   c                       s$   e Zd Zedd fddZ  ZS )PycurlCACertificatesErrorN)r   r   c                    s$   t j}|| _t j|j|jd d S r   )r   ZPYCURL_CA_CERTIFICATES_ERRORr   r    r   r   r   )r   r   r   r!   r   r   r     s    z"PycurlCACertificatesError.__init__r#   r   r   r!   r   r     s   r   c                       s"   e Zd Zdd fddZ  ZS )ProxyAuthenticationFailedNr-   c                    s   t j}t j|j|jd d S r   )r   ZPROXY_AUTH_FAILr    r   r   r   r7   r!   r   r   r     s    z"ProxyAuthenticationFailed.__init__r'   r   r   r!   r   r     s   r   c                       s"   e Zd Zed fddZ  ZS )SecurityIssueNotFoundrj   c                    s&   t jj|d}t j|j|jd d S )Nr   r   )r   ZSECURITY_FIX_NOT_FOUND_ISSUEr0   r    r   r   r   )r   rj   r   r!   r   r   r     s    zSecurityIssueNotFound.__init__r#   r   r   r!   r   r     s   r   )LrN   typingr   r   r   r   r   Zuaclientr   Zuaclient.defaultsr   r   r	   r   r%   r(   r,   r.   r1   r5   r6   r8   r;   r>   rC   rD   rE   rI   rJ   rO   rP   rQ   rR   rS   rV   rW   rZ   r`   re   rf   ri   rm   rn   rq   rs   ru   rv   rw   rx   r   r   IOErrorr   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   

				
		
		