o
    NEg}                     @   s  d dl Z d dlZd dl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mZmZmZmZmZmZmZmZmZmZ d dlmZmZmZ d dlmZmZmZ ddl m!Z!m"Z"m#Z#m$Z$m%Z% dd	l&m'Z'm(Z(m)Z)m*Z* dd
l+m,Z, ddl-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4 ddl5m6Z6 dZ7erddl8m9Z9 G dd de:Z;G dd de:Z<dee= deee= ee=e=f f fddZ>	d)dee=e=f de=dee= fddZ?G dd dZ@G dd dZAe4eAe0jBd G d!d" d"e1ZCG d#d$ d$ZDee1e=e=f ZEG d%d& d&e1ZFG d'd( d(ZGdS )*    N)deque)TracebackType)TYPE_CHECKINGAnyAsyncIteratorDictIteratorListMappingOptionalSequenceTupleTypeUnion)	parse_qslunquote	urlencode)CIMultiDictCIMultiDictProxyMultiMapping   )CONTENT_DISPOSITIONCONTENT_ENCODINGCONTENT_LENGTHCONTENT_TRANSFER_ENCODINGCONTENT_TYPE)CHARTOKENparse_mimetypereify)HeadersParser)JsonPayloadLookupErrorOrderPayloadStringPayloadget_payloadpayload_type)StreamReader)MultipartReaderMultipartWriterBodyPartReaderBadContentDispositionHeaderBadContentDispositionParamparse_content_dispositioncontent_disposition_filename)ClientResponsec                   @      e Zd ZdS )r,   N__name__
__module____qualname__ r6   r6   k/var/www/eduai.edurigo.com/doc_train/edurigo_ai/Puru/venv/lib/python3.10/site-packages/aiohttp/multipart.pyr,   ?       r,   c                   @   r1   )r-   Nr2   r6   r6   r6   r7   r-   C   r8   r-   headerreturnc                    s  dt dtfdd dt dtfdd}dt dtf fdd}dt dtfd	d
}dt dtfdd}dttjtddt dt dt fdd}| sJd i fS | d^}} |s`t	t
|  d i fS i }|rN|d}	d|	vryt	t
|  d i fS |	dd\}
}|
  }
| }|
|v rt	t
|  d i fS  |
st	t|	 qb||
r||r||dd }n |st	t|	 qbn||
r||r|dd\}}}|pd}nt	t|	 qbzt||d}W n] ty   t	t|	 Y qbw d}||rd}||dd d}n* |rd}n"|r:d||d }||r:|d ||dd d}d}|rHt	t
|  d i fS |||
< |se| |fS ) Nstringr:   c                 S   s   t | o	tt| kS N)boolr   setr;   r6   r6   r7   is_tokenJ   s   z+parse_content_disposition.<locals>.is_tokenc                 S   s    | d | d   kodkS   S )Nr   "r6   r?   r6   r6   r7   	is_quotedM   s    z,parse_content_disposition.<locals>.is_quotedc                    s    | o
|  ddkS )N'   )countr?   r@   r6   r7   
is_rfc5987P      z-parse_content_disposition.<locals>.is_rfc5987c                 S   s
   |  dS )N*)endswithr?   r6   r6   r7   is_extended_paramS      
z4parse_content_disposition.<locals>.is_extended_paramc                 S   s@   |  dd }|sdS | dr| |d n| |d  }| S )NrJ   r   FrA   )findrK   isdigit)r;   pos	substringr6   r6   r7   is_continuous_paramV   s
   "z6parse_content_disposition.<locals>.is_continuous_param )charstextrT   c                S   s   t d| dd| S )Nz\\([z])z\1)resub)rU   rT   r6   r6   r7   unescape]   rI   z+parse_content_disposition.<locals>.unescape;r   =r   rA   rD   rE   utf-8strictTFz\/z{};{})strr=   joinmaprV   escaper   splitwarningswarnr,   poplowerstriplstripr-   r   UnicodeDecodeErrorformat)r9   rC   rH   rL   rR   rX   disptypepartsparamsitemkeyvalueencoding_failed_valuer6   rG   r7   r.   G   s   *





>r.   filenamerl   namec           
         s   d|  | sd S  | v r|   S || v r| | S g }t  fdd|  D }t|D ]%\}\}}|dd\}}|drD|d d }|t|krP|| q+ |sUd S d|}d|v rq|dd	\}	}}|	pjd
}	t||	dS |S )Nz%s*c                 3   s&    | ]\}}|  r||fV  qd S r<   )
startswith).0rn   ro   name_sufr6   r7   	<genexpr>   s    
z/content_disposition_filename.<locals>.<genexpr>rJ   r   rA   rS   rD   rE   r[   r\   )	sorteditems	enumeratera   rK   r]   appendr^   r   )
rl   ru   rk   fnparamsnumrn   ro   rq   tailrp   r6   rx   r7   r/      s4   

r/   c                   @   sp   e Zd ZdZ						ddd	Zdd
dZded fddZdefddZ	de
ed  fddZdddZdS )MultipartResponseWrapperzzWrapper around the MultipartReader.

    It takes care about
    underlying connection and close it when it needs in.
    respr0   streamr)   r:   Nc                 C   s   || _ || _d S r<   )r   r   )selfr   r   r6   r6   r7   __init__   s   
z!MultipartResponseWrapper.__init__c                 C      | S r<   r6   r   r6   r6   r7   	__aiter__      z"MultipartResponseWrapper.__aiter__)r)   r+   c                        |   I d H }|d u rt|S r<   nextStopAsyncIterationr   partr6   r6   r7   	__anext__   
   z"MultipartResponseWrapper.__anext__c                 C   s   | j j S )z2Returns True when all response data had been read.)r   contentat_eofr   r6   r6   r7   r         zMultipartResponseWrapper.at_eofc                    s.   | j  I dH }| j  r|  I dH  |S )z#Emits next multipart reader object.N)r   r   r   releaser   rm   r6   r6   r7   r      s
   
zMultipartResponseWrapper.nextc                    s   | j  I dH  dS )zPReleases the connection gracefully, reading all the content
        to the void.N)r   r   r   r6   r6   r7   r      s   z MultipartResponseWrapper.release)r   r0   r   r)   r:   N)r:   r   r:   N)r3   r4   r5   __doc__r   r   r   r   r=   r   r   r   r   r6   r6   r6   r7   r      s$    




	r   c                   @   s  e Zd ZdZdZdedddeddfd	d
Zded  fddZ	defddZ
dee fddZdddedefddZefdedefddZdedefddZdedefddZdefddZd9dd Zdd!d"ee defd#d$Zdd!d"ee deeeef  fd%d&Zdd!d"ee deeeef  fd'd(Zdefd)d*Zd+edefd,d-Zd+edefd.d/Zd+edefd0d1Z d2edefd3d4Z!e"dee fd5d6Z#e"dee fd7d8Z$dS ):r+   z&Multipart reader for single body part.i    boundaryheadersCIMultiDictProxy[str]r   r:   Nc                 C   s`   || _ || _|| _d| _| j td }|d urt|nd | _d| _t	 | _
d | _d| _i | _d S )NFr   )r   	_boundary_content_at_eofgetr   int_length_read_bytesr   _unread_prev_chunk_content_eof_cache)r   r   r   r   lengthr6   r6   r7   r      s   
zBodyPartReader.__init__c                 C   r   r<   r6   r   r6   r6   r7   r     r   zBodyPartReader.__aiter__c                    r   r<   r   r   r6   r6   r7   r     s
   zBodyPartReader.__anext__c                    s   |   I d H }|sd S |S r<   )readr   r6   r6   r7   r     s
   zBodyPartReader.nextFdecoder   c                   sH   | j rdS t }| j s|| | jI dH  | j r|r"| |S |S )zReads body part data.

        decode: Decodes data following by encoding
                method from Content-Encoding header. If it missed
                data remains untouched
            N)r   	bytearrayextend
read_chunk
chunk_sizer   )r   r   datar6   r6   r7   r     s   
zBodyPartReader.readsizec                    s   | j rdS | jr| |I dH }n| |I dH }|  jt|7  _| j| jkr,d| _ | j r?| j I dH }d|ks?J d|S )zWReads body part content chunk of the specified size.

        size: chunk size
        r   NT   
z3reader did not read all the data or it is malformed)r   r   _read_chunk_from_length_read_chunk_from_streamr   lenr   readline)r   r   chunkclrfr6   r6   r7   r   ,  s   
zBodyPartReader.read_chunkc                    s<   | j d us
J dt|| j | j }| j|I d H }|S )Nz(Content-Length required for chunked read)r   minr   r   r   )r   r   r   r   r6   r6   r7   r   B  s
   z&BodyPartReader._read_chunk_from_lengthc                    sb  |t | jd ksJ d| jd u }|r| j|I d H | _| j|I d H }|  jt| j 7  _| jdk s=J d| jd usDJ | j| }d| j }|rV||}n||t	dt | jt | }|dkrt
  t
jdtd | j||d   W d    n1 sw   Y  ||kr| jd | | _|t | j| }|sd	| _| j}|| _|S )
NrE   z<Chunk size must be greater or equal than boundary length + 2   zReading after EOFr   r   ignore)categoryT)r   r   r   r   r   r   r   r   rN   maxrb   catch_warningsfilterwarningsDeprecationWarningunread_datar   )r   r   first_chunkr   windowrW   idxresultr6   r6   r7   r   J  s:   


 
z&BodyPartReader._read_chunk_from_streamc                    s   | j rdS | jr| j }n| j I dH }|| jr?|d}| j}| jd }||ks2||kr=d| _ | j| dS |S | j I dH }|| jrS|dd }| j| |S )z Reads body part by line by line.r   Nr      --T)	r   r   popleftr   r   rv   r   rstripr~   )r   linesliner   last_boundary	next_liner6   r6   r7   r   l  s(   

zBodyPartReader.readlinec                    s2   | j rdS | j s| | jI dH  | j r	dS dS )z0Like read(), but reads all the data to the void.N)r   r   r   r   r6   r6   r7   r     s   zBodyPartReader.release)rp   rp   c                   s.   | j ddI dH }|p| jdd}||S )z;Like read(), but assumes that body part contains text data.Tr   Nr[   default)r   get_charsetr   r   rp   r   r6   r6   r7   rU     s   
zBodyPartReader.textc                   s<   | j ddI dH }|sdS |p| jdd}t||S )z<Like read(), but assumes that body parts contains JSON data.Tr   Nr[   r   )r   r   jsonloadsr   r   r6   r6   r7   r     s   zBodyPartReader.jsonc                   sN   | j ddI dH }|sg S |dur|}n| jdd}t| |d|dS )zXLike read(), but assumes that body parts contains form
        urlencoded data.
        Tr   Nr[   r   )keep_blank_valuesrp   )r   r   r   r   r   )r   rp   r   real_encodingr6   r6   r7   form  s   zBodyPartReader.formc                 C      | j S )z<Returns True if the boundary was reached or False otherwise.r   r   r6   r6   r7   r     s   zBodyPartReader.at_eofr   c                 C   s,   t | jv r
| |}t| jv r| |S |S )zrDecodes data according the specified Content-Encoding
        or Content-Transfer-Encoding headers value.
        )r   r   _decode_content_transferr   _decode_content)r   r   r6   r6   r7   r     s
   



zBodyPartReader.decodec                 C   s^   | j td }|dkrt|tj S |dkr"t|dtj S |dkr(|S td| )NrS   deflategzip   identityunknown content encoding: )r   r   r   re   zlib
decompress	MAX_WBITSRuntimeErrorr   r   rp   r6   r6   r7   r     s   zBodyPartReader._decode_contentc                 C   sP   | j td }|dkrt|S |dkrt|S |dv r!|S td	|)NrS   base64quoted-printable)binary8bit7bit%unknown content transfer encoding: {})
r   r   r   re   r   	b64decodebinasciia2b_qpr   ri   r   r6   r6   r7   r     s   

z'BodyPartReader._decode_content_transferr   c                 C   s$   | j td}t|}|jd|S )z>Returns charset parameter from Content-Type header or default.rS   charset)r   r   r   r   
parameters)r   r   ctypemimetyper6   r6   r7   r     s   zBodyPartReader.get_charsetc                 C      t | jt\}}t|dS )zoReturns name specified in Content-Disposition header or None
        if missed or header is malformed.
        ru   r.   r   r   r   r/   r   rq   rl   r6   r6   r7   ru     s   
zBodyPartReader.namec                 C   r   )zsReturns filename specified in Content-Disposition header or None
        if missed or header is malformed.
        rt   r   r   r6   r6   r7   rt     s   
zBodyPartReader.filenamer   )%r3   r4   r5   r   r   bytesr(   r   r   r   r   r   r   r=   r   r   r   r   r   r   r   r]   rU   r   r   r   r	   r   r   r   r   r   r   r   r   ru   rt   r6   r6   r6   r7   r+      sB    
"
((
r+   )orderc                       s@   e Zd Zdedededdf fddZdeddfd	d
Z  ZS )BodyPartReaderPayloadro   argskwargsr:   Nc                    sb   t  j|g|R i | i }|jd ur|j|d< |jd ur#|j|d< |r/| jdi | d S d S )Nru   rt   
attachmentT)r   T)superr   ru   rt   set_content_disposition)r   ro   r   r   rl   	__class__r6   r7   r     s   



zBodyPartReaderPayload.__init__writerc                    sR   | j }|jddI d H }|r'|||I d H  |jddI d H }|sd S d S )Ni   )r   )rs   r   writer   )r   r   fieldr   r6   r6   r7   r    s   zBodyPartReaderPayload.write)r3   r4   r5   r+   r   r   r  __classcell__r6   r6   r   r7   r     s    r   c                   @   s"  e Zd ZdZeZdZeZde	e
e
f deddfddZded fd	d
Zdeed ef  fddZedddefddZdefddZdeed ef  fddZd(ddZded ef fddZddded ef fddZde
fddZdefddZd(d d!Zd(d"d#Zd)d$d%Zd(d&d'Z dS )*r)   zMultipart body reader.Nr   r   r:   c                 C   s:   || _ d|    | _|| _d | _d| _d| _g | _d S )Nz--FT)	r   _get_boundaryencoder   r   
_last_partr   _at_bofr   )r   r   r   r6   r6   r7   r     s   
zMultipartReader.__init__r+   c                 C   r   r<   r6   r   r6   r6   r7   r     s   zMultipartReader.__aiter__c                    r   r<   r   r   r6   r6   r7   r   "  r   zMultipartReader.__anext__responser0   c                 C   s   |  || |j|j}|S )zConstructs reader instance from HTTP response.

        :param response: :class:`~aiohttp.client.ClientResponse` instance
        )response_wrapper_clsr   r   )clsr  objr6   r6   r7   from_response*  s   	zMultipartReader.from_responsec                 C   r   )zSReturns True if the final boundary was reached or
        False otherwise.
        r   r   r6   r6   r7   r   8  s   zMultipartReader.at_eofc                    sd   | j rdS |  I dH  | jr|  I dH  d| _n|  I dH  | j r'dS |  I dH | _| jS )z#Emits the next multipart body part.NF)r   _maybe_release_last_partr  _read_until_first_boundary_read_boundaryfetch_next_partr  r   r6   r6   r7   r   >  s   zMultipartReader.nextc                    s>   | j s|  I dH }|du rdS | I dH  | j rdS dS )z=Reads all the body parts to the void till the final boundary.N)r   r   r   r   r6   r6   r7   r   P  s   zMultipartReader.releasec                    s   |   I dH }| |S )z"Returns the next body part reader.N)_read_headers_get_part_reader)r   r   r6   r6   r7   r  X  s   
zMultipartReader.fetch_next_partr   c                 C   sX   | td}t|}|jdkr#| jdu rt| || jS | || jS | | j|| jS )zDispatches the response by the `Content-Type` header, returning
        suitable reader instance.

        :param dict headers: Response headers
        rS   	multipartN)r   r   r   typemultipart_reader_clsr   part_reader_clsr   )r   r   r   r   r6   r6   r7   r  _  s   	

z MultipartReader._get_part_readerc                 C   sb   t | jt }|jdksJ dd|jvrtd| jt  |jd }t|dkr/td| |S )Nr  z!multipart/* content type expectedr   z$boundary missed for Content-Type: %sF   z&boundary %r is too long (70 chars max))r   r   r   r  r   
ValueErrorr   )r   r   r   r6   r6   r7   r  r  s   

zMultipartReader._get_boundaryc                    s"   | j r	| j  S | j I d H S r<   )r   rd   r   r   r   r6   r6   r7   	_readline  s   
zMultipartReader._readlinec                    sX   	 |   I d H }|dkrtd| j | }|| jkrd S || jd kr+d| _d S q)NTr   z#Could not find starting boundary %rr   )r  r  r   r   r   r   r   r6   r6   r7   r    s   
z*MultipartReader._read_until_first_boundaryc                    s   |   I d H  }|| jkrd S || jd krCd| _|   I d H }|   I d H }|d d dkr9| j| d S | j||g d S td|d| j)Nr   TrE   zInvalid boundary z, expected )r  r   r   r   r   r~   r   r  )r   r   epiloguer   r6   r6   r7   r    s   
zMultipartReader._read_boundaryc                    sL   dg}	 | j  I d H }| }|| |snqt }||\}}|S )Nr   )r   r   rf   r~   r    parse_headers)r   linesr   parserr   raw_headersr6   r6   r7   r    s   
zMultipartReader._read_headersc                    sD   | j dur | j  s| j  I dH  | j| j j d| _ dS dS )z8Ensures that the last read body part is read completely.N)r  r   r   r   r   r   r6   r6   r7   r    s   


z(MultipartReader._maybe_release_last_partr   )r:   r   )!r3   r4   r5   r   r   r	  r  r+   r  r
   r]   r(   r   r   r   r   r   r   classmethodr  r=   r   r   r   r  r  r  r   r  r  r  r  r  r6   r6   r6   r7   r)     sJ    










r)   c                       s  e Zd ZdZd.dedee ddf fddZd/d	d
Zdeee	  dee	 dee
 ddfddZdee fddZdefddZdefddZedZedZedefddZedefddZd0dedeee  defddZd edefd!d"Z	d0dedeee  defd#d$Z	d0de e!e"eef  e#eef f deee  defd%d&Z$edee fd'd(Z%d1d*ed+eddfd,d-Z&  Z'S )2r*   zMultipart body writer.mixedNsubtyper   r:   c                    sl   |d ur|nt  j}z|d| _W n ty   tdd w d| d| j }t j	d |d g | _
d S )Nasciiz(boundary should contain ASCII only charsz
multipart/z; boundary=)content_type)uuiduuid4hexr  r   UnicodeEncodeErrorr  _boundary_valuer   r   _parts)r   r"  r   r   r   r6   r7   r     s   

zMultipartWriter.__init__c                 C   r   r<   r6   r   r6   r6   r7   	__enter__  r   zMultipartWriter.__enter__exc_typeexc_valexc_tbc                 C   s   d S r<   r6   )r   r,  r-  r.  r6   r6   r7   __exit__  s   zMultipartWriter.__exit__c                 C   
   t | jS r<   )iterr*  r   r6   r6   r7   __iter__  rM   zMultipartWriter.__iter__c                 C   r0  r<   )r   r*  r   r6   r6   r7   __len__  rM   zMultipartWriter.__len__c                 C   s   dS )NTr6   r   r6   r6   r7   __bool__  r   zMultipartWriter.__bool__s   \A[!#$%&'*+\-.^_`|~\w]+\Zs   [\x00-\x08\x0A-\x1F\x7F]c                 C   s^   | j }t| j|r|dS t| j|rtd|dd}|dd}d|d d S )zyWrap boundary parameter value in quotes, if necessary.

        Reads self.boundary and returns a unicode sting.
        r#  z*boundary value contains invalid characters   \s   \\   "s   \"rB   )	r   rV   match_valid_tchar_regexr   search_invalid_qdtext_char_regexr  replace)r   ro   quoted_value_contentr6   r6   r7   r)    s   
zMultipartWriter._boundary_valuec                 C   s   | j dS )Nr#  )r   r   r   r6   r6   r7   r     r   zMultipartWriter.boundaryr  r   c                 C   sd   |d u rt  }t|tr|j| | |S zt||d}W n ty,   td| w | |S )Nr   zCannot create payload from %r)	r   
isinstancer$   r   updateappend_payloadr&   r"   	TypeError)r   r  r   payloadr6   r6   r7   r~     s   


zMultipartWriter.appendrB  c                 C   s   |j td }|r|dvrtd| |dkrd}|j td }|dvr0td||dkr6d}|j}|durH|sH|sHt||j t	< | j
|||f |S )	z)Adds a new body part to multipart writer.rS   )r   r   r   r   r   N)rS   r   r   r   r   r   )r   r   r   re   r   r   ri   r   r]   r   r*  r~   )r   rB  rp   te_encodingr   r6   r6   r7   r@  "  s6   zMultipartWriter.append_payloadc                 C   s    |du rt  }| t||dS )zHelper to append JSON part.Nr=  )r   r@  r!   )r   r  r   r6   r6   r7   append_jsonB  s   zMultipartWriter.append_jsonc                 C   sV   t |ttfs	J |du rt }t |trt| }t|dd}| t||ddS )z&Helper to append form urlencoded part.NT)doseqz!application/x-www-form-urlencoded)r   r$  )	r>  r   r
   r   listr|   r   r@  r%   )r   r  r   r   r6   r6   r7   append_formK  s   
zMultipartWriter.append_formc                 C   sv   d}| j D ](\}}}|s|s|jdu r dS |tdt| j d |j t|j d 7 }q|dt| j d 7 }|S )zSize of the payload.r   NrE      )r*  r   r   r   r   _binary_headers)r   totalr   rp   rC  r6   r6   r7   r   `  s&   	zMultipartWriter.sizeTr   close_boundaryc                    s   | j D ]Q\}}}|d| j d I dH  ||jI dH  |s#|rEt|}|r.|| |r5|| ||I dH  | I dH  n||I dH  |dI dH  q|rg|d| j d I dH  dS dS )zWrite body.r   r   Ns   --
)r*  r  r   rI  MultipartPayloadWriterenable_compressionenable_encoding	write_eof)r   r   rK  r   rp   rC  wr6   r6   r7   r  t  s"   

zMultipartWriter.write)r!  N)r:   r*   r<   )T)(r3   r4   r5   r   r]   r   r   r+  r   BaseExceptionr   r/  r   _Partr2  r   r3  r=   r4  rV   compiler8  r:  propertyr)  r   r   r   r$   r~   r@  rD  r   r   r   r
   rG  r   r  r  r6   r6   r   r7   r*     sV     




 !



 r*   c                   @   s`   e Zd ZdeddfddZdeddfddZddeddfd
dZdddZde	ddfddZ
dS )rL  r   r:   Nc                 C   s   || _ d | _d | _d | _d S r<   )_writer	_encoding	_compress_encoding_buffer)r   r   r6   r6   r7   r     s   
zMultipartPayloadWriter.__init__rp   c                 C   s0   |dkr|| _ t | _d S |dkrd| _ d S d S )Nr   r   )rV  r   rX  )r   rp   r6   r6   r7   rN    s   
z&MultipartPayloadWriter.enable_encodingr   c                 C   s,   |dkr	dt j nt j }t j|d| _d S )Nr   r   )wbits)r   r   compressobjrW  )r   rp   	zlib_moder6   r6   r7   rM    s   z)MultipartPayloadWriter.enable_compressionc                    sf   | j d ur| j  }|rd | _ | |I d H  | jdkr/| jr1| jt| jI d H  d S d S d S )Nr   )rW  flushr  rV  rX  rU  r   	b64encoder  r6   r6   r7   rO    s   


z MultipartPayloadWriter.write_eofr   c                    s   | j d ur|r| j |}|sd S | jdkrX| j}|d us J || |rTtt|d\}}|d |d  ||d d  }| _|rVt|}| j	
|I d H  d S d S d S | jdkrk| j	
t|I d H  d S | j	
|I d H  d S )Nr   r   r   )rW  compressrV  rX  r   divmodr   r   r]  rU  r  r   b2a_qp)r   r   bufdivmod	enc_chunkb64chunkr6   r6   r7   r    s*   


$

zMultipartPayloadWriter.write)r   r   )r3   r4   r5   r   r   r]   rN  rM  rO  r   r  r6   r6   r6   r7   rL    s    
rL  )rt   )Hr   r   r   rV   r%  rb   r   collectionsr   typesr   typingr   r   r   r   r   r	   r
   r   r   r   r   r   urllib.parser   r   r   	multidictr   r   r   hdrsr   r   r   r   r   helpersr   r   r   r   httpr    rB  r!   r"   r#   r$   r%   r&   r'   streamsr(   __all__client_reqrepr0   RuntimeWarningr,   r-   r]   r.   r/   r   r+   	try_firstr   r)   rR  r*   rL  r6   r6   r6   r7   <module>   s\    8$	
d

!- z ; H