U
    dRfbh                     @   sR  d Z ddlmZ ddlZddlZddlZddlZddlmZ ddl	m
Z
 ddlmZmZ ddlmZmZmZmZ d	d
lmZmZ d	dlT e 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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*d0d1 Z+d2d3 Z,d4d5 Z-d6d7 Z.d8d9 Z/d:d; Z0d<d= Z1d>d? Z2d@dA Z3dBdC Z4dDdE Z5dFdG Z6dHdI Z7dJdK Z8dLdM Z9dNdO Z:dPdQ Z;dRdS Z<dTdU Z=dVdW Z>dXdY Z?dZd[ Z@d\d] ZAd^d_ ZBd`da ZCdbdc ZDG ddde deeEZFdfdg ZGdhdi ZHdjdk ZIdldm ZJdndo ZKdpdq ZLdrds ZMdtdu ZNdvdw ZOdxdy ZPdzd{ ZQd|d} ZRdddZSdddZTdd ZUdd ZVdddZWdd ZXdd ZYdd ZZdd Z[dd Z\dd Z]dd Z^dd Z_dd Z`dd Zadd Zbdd Zcdd Zddd Zedd ZfejgefddZhdddZiejged~fddZjdd ZkdddZldddZmdS )z1
IDL Ref:
    https://thrift.apache.org/docs/idl
    )absolute_importN)urlparse)urlopen)lexyacc   )
TExceptionTPayloadTTypegen_init   )ThriftGrammarErrorThriftParserError)*c                 C   s(   | d krt dt d| j| jf d S )NzGrammar error at EOFzGrammar error %r at line %d)r   valuelinenop r   ;/tmp/pip-unpacked-wheel-jqs7l_7o/thriftpy2/parser/parser.pyp_error   s
    
r   c                 C   s   dS )zstart : header definitionNr   r   r   r   r   p_start"   s    r   c                 C   s   dS )z,header : header_unit_ header
              |Nr   r   r   r   r   p_header&   s    r   c                 C   s   dS )z@header_unit_ : header_unit ';'
                    | header_unitNr   r   r   r   r   p_header_unit_+   s    r   c                 C   s   dS )zUheader_unit : include
                   | cpp_include
                   | namespaceNr   r   r   r   r   p_header_unit0   s    r   c                 C   s   t jd }|jdkrtdtj|jgt j }|D ]H}tj|| d }tj	|r6t
|}t||j| td|  dS q6td| d  dS )zinclude : INCLUDE LITERALNzAUnexpected include statement while loading from file like object.r   Zincludesz6Couldn't include thrift %s in any directories provided)threadlocalthrift_stack__thrift_file__r   ospathdirnameinclude_dirs_joinexistsparsesetattr__name___add_thrift_meta)r   thriftZreplace_include_dirsinclude_dirr    childr   r   r   	p_include6   s     


r,   c                 C   s   dS )z!cpp_include : CPP_INCLUDE LITERALNr   r   r   r   r   p_cpp_includeI   s    r-   c                 C   s   dS )z0namespace : NAMESPACE namespace_scope IDENTIFIERNr   r   r   r   r   p_namespaceM   s    r.   c                 C   s   | d | d< dS )z9namespace_scope : '*'
                       | IDENTIFIERr   r   Nr   r   r   r   r   p_namespace_scopeT   s    r/   c                 C   s   dS )zsep : ','
           | ';'
    Nr   r   r   r   r   p_sepZ   s    r0   c                 C   s   dS )z<definition : definition definition_unit_
                  |Nr   r   r   r   r   p_definition`   s    r1   c                 C   s   dS )zPdefinition_unit_ : definition_unit ';'
                        | definition_unitNr   r   r   r   r   p_definition_unit_e   s    r2   c                 C   s   dS )z;definition_unit : const
                       | ttype
    Nr   r   r   r   r   p_definition_unitj   s    r3   c              	   C   st   z t | d | d| d }W n. tk
rN   td| d | df Y nX ttjd | d | td| dS )zconst : CONST field_type IDENTIFIER '=' const_value type_annotations
             | CONST field_type IDENTIFIER '=' const_value type_annotations sepr         z%Type error for constant %s at line %dr   constsN)_castr   AssertionErrorr   r&   r   r   r(   r   valr   r   r   p_constp   s     r;   c                 C   s   | d | d< dS )zconst_value : INTCONSTANT
                   | DUBCONSTANT
                   | LITERAL
                   | BOOLCONSTANT
                   | const_list
                   | const_map
                   | const_refr   r   Nr   r   r   r   r   p_const_value}   s    r<   c                 C   s   | d | d< dS )z$const_list : '[' const_list_seq ']' r   r   Nr   r   r   r   r   p_const_list   s    r=   c                 C   s   t |  dS )zzconst_list_seq : const_value sep const_list_seq
                      | const_value const_list_seq
                      |N
_parse_seqr   r   r   r   p_const_list_seq   s    r@   c                 C   s   t | d | d< dS )z"const_map : '{' const_map_seq '}' r   r   N)dictr   r   r   r   p_const_map   s    rB   c                 C   s   t |  dS )z{const_map_seq : const_map_item sep const_map_seq
                     | const_map_item const_map_seq
                     |Nr>   r   r   r   r   p_const_map_seq   s    rC   c                 C   s   | d | d g| d< dS )z-const_map_item : const_value ':' const_value r   r4   r   Nr   r   r   r   r   p_const_map_item   s    rD   c                 C   s   t jd }| d dD ]6}|}t||d}|dkrtd| d | df qt|dksjt|tjkrt|| d< ntd| d  dS )zconst_ref : IDENTIFIERr   r   .NzCan't find name %r at line %dr   z(No enum value or constant found named %r)	r   r   splitgetattrr   r   
_get_ttyper
   I32)r   r+   nameZfatherr   r   r   p_const_ref   s    

rK   c                 C   s   dS )z~ttype : typedef
             | enum
             | struct
             | union
             | exception
             | serviceNr   r   r   r   r   p_ttype   s    rL   c                 C   s   t tjd | d | d  dS )z8typedef : TYPEDEF field_type IDENTIFIER type_annotationsr   r4   r   N)r&   r   r   r   r   r   r   	p_typedef   s    rM   c                 C   s6   t | d | d }ttjd | d | td| dS )z8enum : ENUM IDENTIFIER '{' enum_seq '}' type_annotationsr      r   enumsN)
_make_enumr&   r   r   r(   r9   r   r   r   p_enum   s    rQ   c                 C   s   t |  dS )zXenum_seq : enum_item sep enum_seq
                | enum_item enum_seq
                |Nr>   r   r   r   r   
p_enum_seq   s    rR   c                 C   sB   t | dkr"| d | d g| d< nt | dkr>| d dg| d< dS )zyenum_item : IDENTIFIER '=' INTCONSTANT type_annotations
                 | IDENTIFIER type_annotations
                 |r5   r   r4   r   Nlenr   r   r   r   p_enum_item   s    rU   c                 C   s    t | d | d }td| dS )z7struct : seen_struct '{' field_seq '}' type_annotationsr   r4   structsN_fill_in_structr(   r9   r   r   r   p_struct   s    rY   c                 C   s.   t | d }ttjd | d | || d< dS )z seen_struct : STRUCT IDENTIFIER r   r   r   N_make_empty_structr&   r   r   r9   r   r   r   p_seen_struct   s    r\   c                 C   s    t | d | d }td| dS )z5union : seen_union '{' field_seq '}' type_annotationsr   r4   ZunionsNrW   r9   r   r   r   p_union   s    r]   c                 C   s.   t | d }ttjd | d | || d< dS )zseen_union : UNION IDENTIFIER r   r   r   NrZ   r9   r   r   r   p_seen_union   s    r^   c                 C   s:   t | d | d td}ttjd | d | td| dS )zDexception : EXCEPTION IDENTIFIER '{' field_seq '}' type_annotations r   rN   )base_clsr   
exceptionsN)_make_structr   r&   r   r   r(   r9   r   r   r   p_exception   s    rb   c                 C   s   t jd }t| dkrv|}| d dD ]0}t||d}|dkr(td| d | d f q(t|dsztd	| d  nd}t| d | t| d  |}t|| d | t	d
| dS )zsimple_service : SERVICE IDENTIFIER '{' function_seq '}'
                | SERVICE IDENTIFIER EXTENDS IDENTIFIER '{' function_seq '}'
    r      rN   rE   Nz.Can't find service %r for service %r to extendr   thrift_serviceszCan't extends %r, not a serviceZservices)
r   r   rT   rF   rG   r   hasattr_make_servicer&   r(   )r   r)   extendsrJ   r:   r   r   r   p_simple_service   s"    

rh   c                 C   s   | d | d< dS )z)service : simple_service type_annotationsr   r   Nr   r   r   r   r   	p_service  s    ri   c                 C   sv   | d dkrd}d}nd}d}| t | d  dkr8g }n| t | d  }|| |d  | |d  | |d  |g| d< d	S )
zsimple_function : ONEWAY function_type IDENTIFIER '(' field_seq ')'
    | ONEWAY function_type IDENTIFIER '(' field_seq ')' throws
    | function_type IDENTIFIER '(' field_seq ')' throws
    | function_type IDENTIFIER '(' field_seq ')' r   onewayTFr   )r   rN   NrS   )r   rj   baseZthrowsr   r   r   p_simple_function  s    rm   c                 C   s   | d | d< dS )z+function : simple_function type_annotationsr   r   Nr   r   r   r   r   
p_function3  s    rn   c                 C   s   t |  dS )zjfunction_seq : function sep function_seq
                    | function function_seq
                    |Nr>   r   r   r   r   p_function_seq8  s    ro   c                 C   s   | d | d< dS )z"throws : THROWS '(' field_seq ')' r4   r   Nr   r   r   r   r   p_throws?  s    rp   c                 C   s(   | d dkrt j| d< n| d | d< dS )z6function_type : field_type
                     | VOIDr   voidr   N)r
   VOIDr   r   r   r   p_function_typeD  s    rs   c                 C   s   t |  dS )zUfield_seq : field sep field_seq
                 | field field_seq
                 |Nr>   r   r   r   r   p_field_seqM  s    rt   c              	   C   s   t | dkrVzt| d | d }W qZ tk
rR   td| d | df Y qZX nd}| d | d | d | d |g| d	< dS )
zsimple_field : field_id field_req field_type IDENTIFIER
             | field_id field_req field_type IDENTIFIER '=' const_value
                r4      z"Type error for field %s at line %drN   Nr   r   r   )rT   r7   r8   r   r   r9   r   r   r   p_simple_fieldT  s    rw   c                 C   s   | d | d< dS )z%field : simple_field type_annotationsr   r   Nr   r   r   r   r   p_fieldf  s    rx   c                 C   s   | d | d< dS )zfield_id : INTCONSTANT ':' r   r   Nr   r   r   r   r   
p_field_idk  s    ry   c                 C   s6   t | dkr| d dk| d< nt | dkr2d| d< dS )zCfield_req : REQUIRED
                 | OPTIONAL
                 |r   r   requiredr   FNrS   r   r   r   r   p_field_reqp  s    r{   c                 C   s   | d | d< dS )z9field_type : ref_type
                  | definition_typer   r   Nr   r   r   r   r   p_field_typez  s    r|   c                   @   s   e Zd ZdZdd ZdS )CurrentIncompleteTyper   c                 C   s"   || | j < |  j d8  _ | j d S Nr   )index)selfinfor   r   r   set_info  s    
zCurrentIncompleteType.set_infoN)r'   
__module____qualname__r   r   r   r   r   r   r}     s   r}   c                 C   s&  t jd }t|D ]^}|dkr q| d |d r| d t|d d }t||}t||d}|dk	r|} qqt| d dD ]t\}}t||d}|dkr|t| d dd krtd| d | 	df t j
| d | 	df| d<  dS qt|drt|d|f| d< n|| d< dS )	zref_type : IDENTIFIERr   >   r'   __doc____package__
__loader____spec____thrift_meta__r   r   rE   NzNo type found: %r, at line %dr   _ttype)r   r   dir
startswithrT   rG   	enumeraterF   r   r   incomplete_typer   re   )r   Zref_typeattrrJ   Zincluded_ref_typeZresolved_ref_typer   r   r   r   
p_ref_type  s.    

r   c                 C   s   | d dkrt j| d< | d dks.| d dkr8t j| d< | d dkrNt j| d< | d dkrdt j| d< | d dkrzt j| d< | d d	krt j| d< | d d
krt j| d< | d dkrt j| d< dS )a  simple_base_type : BOOL
                        | BYTE
                        | I8
                        | I16
                        | I32
                        | I64
                        | DOUBLE
                        | STRING
                        | BINARYr   boolr   bytei8Zi16Zi32Zi64doublestringbinaryN)	r
   BOOLBYTEI16rI   I64DOUBLESTRINGBINARYr   r   r   r   p_simple_base_type  s     







r   c                 C   s   | d | d< dS )z-base_type : simple_base_type type_annotationsr   r   Nr   r   r   r   r   p_base_type  s    r   c                 C   s   | d | d< dS )zqsimple_container_type : map_type
                             | list_type
                             | set_typer   r   Nr   r   r   r   r   p_simple_container_type  s    r   c                 C   s   | d | d< dS )z7container_type : simple_container_type type_annotationsr   r   Nr   r   r   r   r   p_container_type  s    r   c                 C   s   t j| d | d ff| d< dS )z1map_type : MAP '<' field_type ',' field_type '>' r4   r5   r   N)r
   MAPr   r   r   r   
p_map_type  s    r   c                 C   s   t j| d f| d< dS )z$list_type : LIST '<' field_type '>' r4   r   N)r
   LISTr   r   r   r   p_list_type  s    r   c                 C   s   t j| d f| d< dS )z"set_type : SET '<' field_type '>' r4   r   N)r
   SETr   r   r   r   
p_set_type  s    r   c                 C   s   | d | d< dS )zCdefinition_type : base_type
                       | container_typer   r   Nr   r   r   r   r   p_definition_type  s    r   c                 C   s&   t | dkr| d | d< nd| d< dS )zHtype_annotations : '(' type_annotation_seq ')'
                        |rN   r   r   NrS   r   r   r   r   p_type_annotations  s    r   c                 C   s   t |  dS )ztype_annotation_seq : type_annotation sep type_annotation_seq
                           | type_annotation type_annotation_seq
                           |Nr>   r   r   r   r   p_type_annotation_seq  s    r   c                 C   s6   t | dkr"| d | d f| d< n| d df| d< dS )zMtype_annotation : IDENTIFIER '=' LITERAL
                       | IDENTIFIER rN   r   r4   r   NrS   r   r   r   r   p_type_annotation  s    r   Tutf-8c              	   C   s,  t tdd}|dkr6g t_dgt_i t_t t_dt_tjD ]*}	|	jdk	r<t	j
| |	jr<td|  q<|pvt	j
| }
|r|
tjkrtj|
 S |dkrt }|dkrtjddd}|dk	r|t_|dk	rtj| | d	std
t| j}|dkr,tt| jt| j
 }| }W 5 Q R X nVt|dkr\t| |d}| }W 5 Q R X n&|dkrtt|  }ntd|t|tr||}|dk	r|dstd|dkrt	j
| }t	j
|d }t |}	t!|	d|  tj|	 d|_"|#| tj$  |r(|	tj|
< |	S )a  Parse a single thrift file to module object, e.g.::

        >>> from thriftpy2.parser.parser import parse
        >>> note_thrift = parse("path/to/note.thrift")
        <module 'note_thrift' (built-in)>

    :param path: file path to parse, should be a string ending with '.thrift'.
    :param module_name: the name for parsed module, the default is the basename
                        without extension of `path`.
    :param include_dirs: directories to find thrift files while processing
                         the `include` directive, by default: ['.'].
    :param include_dir: directory to find child thrift files. Note this keyword
                        parameter will be deprecated in the future, it exists
                        for compatible reason. If it's provided (not `None`),
                        it will be appended to `include_dirs`.
    :param lexer: ply lexer to use, if not provided, `parse` will new one.
    :param parser: ply parser to use, if not provided, `parse` will new one.
    :param enable_cache: if this is set to be `True`, parsed module will be
                         cached, this is enabled by default. If `module_name`
                         is provided, use it as cache key, else use the `path`.
    initializedNrE   TzDead including on %sFr   debugZwrite_tablesz.thriftzPath should end with .thriftfiler   )encoding)httphttpszGthriftpy2 does not support generating module with path in protocol '{}'_thrift8thriftpy2 can only generate module with '_thrift' suffixr   )%rG   r   r   r"   thrift_cacher}   r   r   r   r   r    samefiler   normpathr   r   appendendswithr   schemeopennetlocreadrT   r   format
isinstancebytesdecodebasenamesplitexttypes
ModuleTyper&   r   r%   pop)r    module_nameinclude_dirsr*   lexerparserenable_cacher   r   r)   	cache_keyZ
url_schemefhdatar   r   r   r   r%     sj    












r%   c                 C   s   | dstd|r*|tjkr*tj| S t| ds<td|dkrLt }|dkrbtjddd}|  }t	|}t
|d	d tj| d
|_|| tj  |r|tj|< |S )a  Parse a file-like object to thrift module object, e.g.::

        >>> from thriftpy2.parser.parser import parse_fp
        >>> with open("path/to/note.thrift") as fp:
                parse_fp(fp, "note_thrift")
        <module 'note_thrift' (built-in)>

    :param source: file-like object, expected to have a method named `read`.
    :param module_name: the name for parsed module, should be endswith
                        '_thrift'.
    :param lexer: ply lexer to use, if not provided, `parse` will new one.
    :param parser: ply parser to use, if not provided, `parse` will new one.
    :param enable_cache: if this is set to be `True`, parsed module will be
                         cached by `module_name`, this is enabled by default.
    r   r   r   zEExpected `source` to be a file-like object with a method named 'read'NFr   r   r   r   )r   r   r   r   re   r   r   r   r   r   r&   r   r   r   r%   r   )sourcer   r   r   r   r   r)   r   r   r   parse_fp`  s(    






r   c                 C   sz   t jd }t|ds,tt}t|d| n
t|d}| dkrh|jdd ||  D krht	d|j| f ||  
| d S )Nr   r   r6   c                 S   s   g | ]
}|j qS r   )r'   ).0xr   r   r   
<listcomp>  s     z$_add_thrift_meta.<locals>.<listcomp>z$'%s' type is already defined in '%s')r   r   re   collectionsdefaultdictlistr&   rG   r'   r   r   )keyr:   r)   metar   r   r   r(     s    



 r(   c                 C   s`   t | dkr$| d g| d  | d< n8t | dkrH| d g| d  | d< nt | dkr\g | d< d S )NrN   r   r4   r   r   rS   r   r   r   r   r?     s    r?   c                 C   s   t | tr| dk rt| |S | tjkr*tS | tjkr8tS | tjkrFt	S | tj
krTtS | tjkrbtS | tjkrptS | tjkr~tS | tjkrtS | d tjkrt| S | d tjkrt| S | d tjkrt| S | d tj
krt| S | d tjkrt| S d S )Nr   )r   int_lazy_cast_constr
   r   
_cast_boolr   
_cast_byter   	_cast_i16rI   	_cast_i32r   	_cast_i64r   _cast_doubler   _cast_stringr   _cast_binaryr   
_cast_listr   	_cast_setr   	_cast_map
_cast_enumSTRUCT_cast_struct)tlinnor   r   r   r7     s8    








r7   c                    s    fdd}|S )Nc                    s   d|  fS )NZUNKNOWN_CONSTr   vr   r   r   r   _inner_cast  s    z%_lazy_cast_const.<locals>._inner_castr   )r   r   r   r   r   r   r     s    r   c                 C   s   t | ttfstt| S N)r   r   r   r8   r   r   r   r   r     s    r   c                 C   s   t | tst| S r   r   r   r8   r   r   r   r   r     s    r   c                 C   s   t | tst| S r   r   r   r   r   r   r     s    r   c                 C   s   t | tst| S r   r   r   r   r   r   r     s    r   c                 C   s   t | tst| S r   r   r   r   r   r   r     s    r   c                 C   s   t | ttfstt| S r   )r   floatr   r8   r   r   r   r   r     s    r   c                 C   s   t | tst| S r   r   strr8   r   r   r   r   r     s    r   c                 C   s   t | tst| S r   r   r   r   r   r   r     s    r   c                    s"    d t jkst fdd}|S )Nr   c                    s$   t | tsttt d |  | S r~   )r   r   r8   mapr7   r   r   r   r   __cast_list  s    z_cast_list.<locals>.__cast_list)r
   r   r8   )r   r   r   r   r   r     s    r   c                    s"    d t jkst fdd}|S )Nr   c                    sV   t | dkrt| trt } t| ttfs.ttt d |  t| tsRt| S | S Nr   r   )rT   r   rA   setr   r8   r   r7   r   r   r   r   
__cast_set  s    
z_cast_set.<locals>.__cast_set)r
   r   r8   )r   r   r   r   r   r     s    r   c                    s"    d t jkst fdd}|S )Nr   c                    sH   t | tst| D ]0}t d d | | | t d d |< q| S )Nr   r   )r   rA   r8   r7   )r   r   r   r   r   
__cast_map  s
    z_cast_map.<locals>.__cast_map)r
   r   r8   )r   r   r   r   r   r     s    r   c                    s"    d t jkst fdd}|S )Nr   c                    s:   t | tst|  d jkr | S td d j| f d S )Nr   z3Couldn't find a named value in enum %s for value %d)r   r   r8   _VALUES_TO_NAMESr   r'   r   r   r   r   __cast_enum  s    z_cast_enum.<locals>.__cast_enum)r
   rI   r8   )r   r   r   r   r   r     s    r   c                    s"    d t jkst fdd}|S )Nr   c                    s   t |  d r| S t | ts tt d d}|D ].}|| d r2|| kr2td| d jf q2| D ]>}||krtd| d jf t|| d | | | |< qf d f | S )Nr   _tspecr   z4Field %r was required to create constant for type %rz0No field named %r was found in struct of type %r)r   rA   r8   rG   r   r'   r7   )r   Ztspecr   r   r   r   __cast_struct'  s     z#_cast_struct.<locals>.__cast_struct)r
   r   r8   )r   r   r   r   r   r   $  s    r   c           	      C   s   t jd jtjd}t| tf|}i }i }|r|d d }|d krFd}|D ]$}|d d krf|d |d< |d }qJ|D ]$\}}t||| |||< |||< qtt|d| t|d| |S )Nr   r   r   r   r   r   Z_NAMES_TO_VALUES)r   r   r'   r
   rI   typeobjectr&   )	rJ   ZkvsattrsclsZ_values_to_namesZ_names_to_valuesr:   itemr   r   r   r   rP   >  s*    


rP   c                 C   s    t jd j|d}t| |f|S )Nr   r   )r   r   r'   r  )rJ   ttyper_   r  r   r   r   r[   Y  s    
r[   c                 C   s   i }g }i }|D ]}|d |ks,|d |krDt d|d |d f |d }t||d |d ||d < ||d |d f |d |f||d < qt| d| t| d| t| d	| |rt| || | S )
Nr   r4   z3'%d:%s' field identifier/name has already been usedr   r   rN   thrift_specdefault_specr   )r   _ttype_specr   r&   r   )r  fields	_gen_initr  r  r   fieldr  r   r   r   rX   a  s(    rX   c                 C   s   t | ||d}t|||dS )N)r  r_   r  )r[   rX   )rJ   r
  r  r_   r  r  r   r   r   ra   w  s    ra   c                 C   s8  |d krt }dtjd ji}t| |f|}g }|D ]}|d }||krVtd|| f d| }|d }	t||	}
t|||
 d| }|d }|d	 }|d
 }t||dd}t|d| |tj	krt
|d|jd
< |jd
d t||j|j t||| || q2|d k	r(t|dr(||j t|d| |S )Nr   r   r   z0'%s' function is already defined in service '%s'z%s_argsr4   z	%s_resultr   rN   r   Fr  rj   success)r  Nrd   )r  r   r   r'   r  r   ra   r&   r
   rr   r	  r  r  insertr   r   re   extendrd   )rJ   funcsrg   r  r  rd   func	func_nameZ	args_nameZargs_fieldsZargs_clsZresult_nameZresult_typeZresult_throwsZresult_onewayZ
result_clsr   r   r   rf   }  sF    

rf   Fc                 C   s,   t | tr| ||fS | d || d |fS d S r   )r   r   )r  rJ   rz   r   r   r   r	    s    

r	  c                 C   s"   t | drd| jkr| jd S |S )N__dict__r   )re   r  )instZdefault_ttyper   r   r   rH     s    
rH   )NNNNNTr   )NNT)r   )T)F)N)nr   
__future__r   r   r   	threadingr   urllib.parser   urllib.requestr   Zplyr   r   r)   r   r	   r
   r   excr   r   r   localr   r   r   r   r   r   r,   r-   r.   r/   r0   r1   r2   r3   r;   r<   r=   r@   rB   rC   rD   rK   rL   rM   rQ   rR   rU   rY   r\   r]   r^   rb   rh   ri   rm   rn   ro   rp   rs   rt   rw   rx   ry   r{   r|   rA   r}   r   r   r   r   r   r   r   r   r   r   r   r   r%   r   r(   r?   r7   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rP   r   r[   rX   ra   rf   r	  rH   r   r   r   r   <module>   s   	
	
			        
]
.	



'
