o
    :ήcvX                     @   sx  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	 d dl
mZ d dlmZ G dd dejZed	Zejd
ddZG dd dZG dd deZG dd dZG dd deZG dd dejeef ZG dd deejejf ZG dd deeef ZG dd dZG dd deeejeef f ZG dd  d ejeef Z G d!d" d"e Z!G d#d$ d$Z"dS )%    N)Sequence)shlex)SplitResult	parse_qsl	urlencodeurlsplit)run_in_threadpool)Scopec                   @   s   e Zd ZU eed< eed< dS )AddresshostportN)__name__
__module____qualname__str__annotations__int r   r   ?/tmp/pip-target-vg8gfxp4/lib/python/starlette/datastructures.pyr
      s   
 r
   _KeyType_CovariantValueTypeT)	covariantc                	   @   s  e Zd Z		d0dedeje dejddfddZe	de
fd	d
Ze	defddZe	defddZe	defddZe	defddZe	defddZe	dejdef fddZe	dejdef fddZe	dejdef fddZe	deje fddZe	defddZdejdd fd d!Zdejdd fd"d#Zdejdd fd$d%Zd&ejeeje f dd fd'd(Zd)ejdefd*d+Zdefd,d-Zdefd.d/Z dS )1URL Nurlscope
componentsreturnc                 K   sF  |d ur|r
J d|rJ d| dd}| dd }| dd|d  }| d	d
}d }|d D ]\}	}
|	dkrA|
d} nq2|d urP| d| | }n.|d u rW|}n'|\}}ddddd| }||krr| d| | }n| d| d| | }|r|d|  7 }n|r|rJ dtdjdi |j }|| _d S )Nz"Cannot set both "url" and "scope".z+Cannot set both "scope" and "**components".schemehttpserver	root_pathr   pathquery_string    headerss   hostlatin-1z://P   i  )r   httpswswss:?z)Cannot set both "url" and "**components".r   )getdecoder   replacer   geturl_url)selfr   r   r   r   r    r"   r#   host_headerkeyvaluer   r   default_portr   r   r   __init__   s:   

zURL.__init__c                 C   s   t | dst| j| _| jS )N_components)hasattrr   r1   r8   r2   r   r   r   r   @   s   
zURL.componentsc                 C      | j jS N)r   r   r:   r   r   r   r   F      z
URL.schemec                 C   r;   r<   )r   netlocr:   r   r   r   r>   J   r=   z
URL.netlocc                 C   r;   r<   )r   r"   r:   r   r   r   r"   N   r=   zURL.pathc                 C   r;   r<   )r   queryr:   r   r   r   r?   R   r=   z	URL.queryc                 C   r;   r<   )r   fragmentr:   r   r   r   r@   V   r=   zURL.fragmentc                 C   r;   r<   )r   usernamer:   r   r   r   rA   Z   r=   zURL.usernamec                 C   r;   r<   )r   passwordr:   r   r   r   rB   ^   r=   zURL.passwordc                 C   r;   r<   )r   hostnamer:   r   r   r   rC   b   r=   zURL.hostnamec                 C   r;   r<   )r   r   r:   r   r   r   r   f   r=   zURL.portc                 C   s
   | j dv S )N)r(   r*   )r   r:   r   r   r   	is_securej      
zURL.is_securekwargsc           	      K   s   d|v sd|v sd|v sd|v rU| d| j}| d| j}| d| j}| d| j}|}|d ur9|d| 7 }|d urQ|}|d urJ|d| 7 }| d| }||d< | jjdi |}| | S )	NrA   rB   rC   r   r+   @r>   r   )	poprC   r   rA   rB   r   _replace	__class__r0   )	r2   rF   rC   r   rA   rB   r>   userpassr   r   r   r   r/   n   s.   zURL.replacec                 K   sB   t t| jdd}|dd | D  t| }| j|dS )NTkeep_blank_valuesc                 S      i | ]\}}t |t |qS r   r   .0r4   r5   r   r   r   
<dictcomp>       z,URL.include_query_params.<locals>.<dictcomp>r?   )	MultiDictr   r?   updateitemsr   multi_itemsr/   )r2   rF   paramsr?   r   r   r   include_query_params   s   zURL.include_query_paramsc                 K   s"   t dd | D }| j|dS )Nc                 S       g | ]\}}t |t |fqS r   rO   rP   r   r   r   
<listcomp>        z,URL.replace_query_params.<locals>.<listcomp>rT   )r   rW   r/   )r2   rF   r?   r   r   r   replace_query_params      zURL.replace_query_paramskeysc                 C   sP   t |tr|g}tt| jdd}|D ]}||d  qt| }| j|dS )NTrL   rT   )	
isinstancer   rU   r   r?   rH   r   rX   r/   )r2   r`   rY   r4   r?   r   r   r   remove_query_params   s   
zURL.remove_query_paramsotherc                 C   s   t | t |kS r<   rO   r2   rc   r   r   r   __eq__      z
URL.__eq__c                 C      | j S r<   )r1   r:   r   r   r   __str__      zURL.__str__c                 C   s6   t | }| jrt | jdd}| jj dt| dS )Nz********)rB   ())r   rB   r/   rJ   r   repr)r2   r   r   r   r   __repr__   s   zURL.__repr__)r   N)!r   r   r   r   typingOptionalr	   Anyr7   propertyr   r   r   r>   r"   r?   r@   UnionrA   rB   rC   r   r   boolrD   r/   rZ   r^   r   rb   re   rh   rm   r   r   r   r   r      sZ    
(
r   c                	   @   sd   e Zd ZdZddedededd fddZddedededd	fd
dZdejee	f defddZ
d	S )URLPathz
    A URL path string that may also hold an associated protocol and/or host.
    Used by the routing to return `url_path_for` matches.
    r   r"   protocolr   r   c                 C   s   |dv sJ t | |S )N)r   	websocketr   )r   __new__)clsr"   ru   r   r   r   r   rw      s   zURLPath.__new__Nc                 C   s   || _ || _d S r<   )ru   r   )r2   r"   ru   r   r   r   r   r7      s   
zURLPath.__init__base_urlc                 C   st   t |tr	t|}| jrddddddd| j |j }n|j}| jp&|j}|j	dt|  }tt|||dS )	Nr(   r   )TFr*   r)   )r   rv   /)r   r>   r"   )
ra   r   r   ru   rD   r   r   r>   r"   rstrip)r2   ry   r   r>   r"   r   r   r   make_absolute_url   s   
zURLPath.make_absolute_url)r   r   )r   r   r   __doc__r   rw   r7   rn   rr   r   r|   r   r   r   r   rt      s
     rt   c                   @   sH   e Zd ZdZdefddZdefddZdefdd	Zdefd
dZ	dS )Secretz
    Holds a string value that should not be revealed in tracebacks etc.
    You should cast the value to `str` at the point it is required.
    r5   c                 C   s
   || _ d S r<   _valuer2   r5   r   r   r   r7         
zSecret.__init__r   c                 C   s   | j j}| dS )Nz('**********')rJ   r   )r2   
class_namer   r   r   rm      s   
zSecret.__repr__c                 C   rg   r<   r   r:   r   r   r   rh      ri   zSecret.__str__c                 C   
   t | jS r<   )rs   r   r:   r   r   r   __bool__   r   zSecret.__bool__N)
r   r   r   r}   r   r7   rm   rh   rs   r   r   r   r   r   r~      s    r~   c                   @   s   e Zd Zdejeeje f fddZdefddZ	dejee
f dejfdd	Zdeje fd
dZdefddZdefddZdS )CommaSeparatedStringsr5   c                 C   sD   t |trt|dd}d|_d|_dd |D | _d S t|| _d S )NT)posix,c                 S   s   g | ]}|  qS r   )striprQ   itemr   r   r   r\          z2CommaSeparatedStrings.__init__.<locals>.<listcomp>)ra   r   r   
whitespacewhitespace_split_itemslist)r2   r5   splitterr   r   r   r7      s   
zCommaSeparatedStrings.__init__r   c                 C   r   r<   )lenr   r:   r   r   r   __len__   r   zCommaSeparatedStrings.__len__indexc                 C   
   | j | S r<   )r   )r2   r   r   r   r   __getitem__   r   z!CommaSeparatedStrings.__getitem__c                 C   r   r<   )iterr   r:   r   r   r   __iter__   r   zCommaSeparatedStrings.__iter__c                 C   s&   | j j}dd | D }| d|dS )Nc                 S   s   g | ]}|qS r   r   r   r   r   r   r\      s    z2CommaSeparatedStrings.__repr__.<locals>.<listcomp>rj   rk   r   r2   r   rW   r   r   r   rm      s   zCommaSeparatedStrings.__repr__c                 C   s   d dd | D S )N, c                 s   s    | ]}t |V  qd S r<   )rl   r   r   r   r   	<genexpr>   s    z0CommaSeparatedStrings.__str__.<locals>.<genexpr>)joinr:   r   r   r   rh         zCommaSeparatedStrings.__str__N)r   r   r   rn   rr   r   r   r7   r   r   slicerp   r   Iteratorr   rm   rh   r   r   r   r   r      s    	r   c                   @   s@  e Zd ZU ejeef ed< dejdej	eef ej
ejeef  f dejddfddZd	ejdeje fd
dZdeje fddZdeje fddZdejeef fddZdejejeef  fddZd	edefddZd	ejdefddZdeje fddZdefddZdejdefddZdefdd Z dS )!ImmutableMultiDict_dictargsz1ImmutableMultiDict[_KeyType, _CovariantValueType]rF   r   Nc                 O   s   t |dk s
J d|r|d ng }|r t| t|  }|s%g }nAt|dr;ttttf |}t| }n+t|drRttj	ttf |}t|
 }nttjtjtjtjf  |}t|}dd |D | _|| _d S )N   Too many arguments.r   rX   rW   c                 S   s   i | ]\}}||qS r   r   rQ   kvr   r   r   rR     s    z/ImmutableMultiDict.__init__.<locals>.<dictcomp>)r   r   rX   r9   rn   castr   r   r   MappingrW   ListTuplerp   r   _list)r2   r   rF   r5   r   r   r   r   r7      s.   	




zImmutableMultiDict.__init__r4   c                    s    fdd| j D S )Nc                       g | ]
\}}| kr|qS r   r   rQ   item_key
item_valuer4   r   r   r\   !      z.ImmutableMultiDict.getlist.<locals>.<listcomp>r   r2   r4   r   r   r   getlist   r   zImmutableMultiDict.getlistc                 C   
   | j  S r<   )r   r`   r:   r   r   r   r`   #  r   zImmutableMultiDict.keysc                 C   r   r<   )r   valuesr:   r   r   r   r   &  r   zImmutableMultiDict.valuesc                 C   r   r<   )r   rW   r:   r   r   r   rW   )  r   zImmutableMultiDict.itemsc                 C   r   r<   r   r   r:   r   r   r   rX   ,  r   zImmutableMultiDict.multi_itemsc                 C   r   r<   r   r   r   r   r   r   /  r   zImmutableMultiDict.__getitem__c                 C   s
   || j v S r<   r   r   r   r   r   __contains__2  r   zImmutableMultiDict.__contains__c                 C      t |  S r<   r   r`   r:   r   r   r   r   5     zImmutableMultiDict.__iter__c                 C   r   r<   )r   r   r:   r   r   r   r   8  r   zImmutableMultiDict.__len__rc   c                 C   s$   t || jsdS t| jt|jkS NF)ra   rJ   sortedr   rd   r   r   r   re   ;  s   zImmutableMultiDict.__eq__c                 C   s    | j j}|  }| d|dS Nrj   rk   )rJ   r   rX   r   r   r   r   rm   @     zImmutableMultiDict.__repr__)!r   r   r   rn   Dictr   r   r   rr   r   Iterabler   rp   r7   r   r   KeysViewr`   
ValuesViewr   	ItemsViewrW   rX   r   rs   r   r   r   r   r   re   r   rm   r   r   r   r   r      s2   
 
%r   c                   @   s  e Zd ZdejdejddfddZdejddfddZddejd	ejdejfd
dZdejfddZ	dejdej
fddZdddZddejd	ejdejfddZdejdej
ddfddZdejdejddfddZdejd ejej
ejejejf  f dejddfddZdS )rU   r4   r5   r   Nc                 C   s   |  ||g d S r<   )setlistr2   r4   r5   r   r   r   __setitem__G  s   zMultiDict.__setitem__c                    s"    fdd| j D | _ | j = d S )Nc                        g | ]\}}| kr||fqS r   r   r   r   r   r   r\   K  r]   z)MultiDict.__delitem__.<locals>.<listcomp>)r   r   r   r   r   r   __delitem__J  r_   zMultiDict.__delitem__defaultc                    s$    fdd| j D | _ | j |S )Nc                    r   r   r   r   r   r   r   r\   O  r]   z!MultiDict.pop.<locals>.<listcomp>)r   r   rH   r2   r4   r   r   r   r   rH   N  s   zMultiDict.popc                    s,   | j  \ } fdd| jD | _ |fS )Nc                    r   r   r   r   r   r   r   r\   T  r]   z%MultiDict.popitem.<locals>.<listcomp>)r   popitemr   r   r   r   r   r   R  s   zMultiDict.popitemc                    s"    fdd| j D }|   |S )Nc                    r   r   r   r   r   r   r   r\   X  r   z%MultiDict.poplist.<locals>.<listcomp>)r   rH   )r2   r4   r   r   r   r   poplistW  s   
zMultiDict.poplistc                 C   s   | j   | j  d S r<   )r   clearr   r:   r   r   r   r   \  s   
zMultiDict.clearc                 C   s*   || vr|| j |< | j||f | | S r<   )r   r   appendr   r   r   r   
setdefault`  s   
zMultiDict.setdefaultr   c                    sR   |s
|   d  d S  fdd| jD }| fdd|D  | _|d | j < d S )Nc                    r   r   r   r   r   r   r   r\   k  r]   z%MultiDict.setlist.<locals>.<listcomp>c                    s   g | ]} |fqS r   r   )rQ   r5   r   r   r   r\   l  r   )rH   r   r   )r2   r4   r   existing_itemsr   r   r   r   g  s
   zMultiDict.setlistc                 C   s   | j ||f || j|< d S r<   )r   r   r   r   r   r   r   r   o  s   zMultiDict.appendr   rF   c                    s@   t |i |  fdd| jD }|   | _| j  d S )Nc                    s$   g | ]\}}|   vr||fqS r   )r`   r   r5   r   r   r\   }  s   $ z$MultiDict.update.<locals>.<listcomp>)rU   r   rX   r   rV   )r2   r   rF   r   r   r   r   rV   s  s   	zMultiDict.updater<   r   N)r   r   r   rn   rp   r   r   rH   r   r   r   r   r   r   r   r   rr   r   rV   r   r   r   r   rU   F  s,    
rU   c                       sr   e Zd ZdZdejdejejejej	ej	f  e
ef dej	ddf fddZde
fd	d
Zde
fddZ  ZS )QueryParamsz!
    An immutable multidict.
    r   r   rF   r   Nc                    s   t |dk s
J d|r|d ng }t|tr&t jt|ddfi | n t|tr=t jt|dddfi | n	t j|i | dd | jD | _d	d
 | j	
 D | _	d S )Nr   r   r   TrL   r&   c                 S   r[   r   rO   r   r   r   r   r\     r]   z(QueryParams.__init__.<locals>.<listcomp>c                 S   rN   r   rO   r   r   r   r   rR     rS   z(QueryParams.__init__.<locals>.<dictcomp>)r   ra   r   superr7   r   bytesr.   r   r   rW   )r2   r   rF   r5   rJ   r   r   r7     s   

zQueryParams.__init__c                 C   r   r<   )r   r   r:   r   r   r   rh     r   zQueryParams.__str__c                 C   s    | j j}t| }| d|dS r   )rJ   r   r   )r2   r   r#   r   r   r   rm     r   zQueryParams.__repr__)r   r   r   r}   rn   rr   r   r   r   rp   r   r   r7   rh   rm   __classcell__r   r   r   r   r     s$    	
r   c                   @   s   e Zd ZU dZdZejed< ded< 		dddd	edej	ej d
eddddf
ddZ
edefddZdeddfddZddedefddZdeddfddZdddZdS ) 
UploadFilez@
    An uploaded file included as part of the request data.
    i   fileHeadersr%   Nr   )r%   filenamecontent_typeztyping.Optional[Headers]r   c                C   s<   || _ || _|d u rtj| jd| _n|| _|pt | _d S )N)max_size)r   r   tempfileSpooledTemporaryFilespool_max_sizer   r   r%   )r2   r   r   r   r%   r   r   r   r7     s   zUploadFile.__init__c                 C   s   t | jdd}| S )N_rolledT)getattrr   )r2   rolled_to_diskr   r   r   
_in_memory  s   zUploadFile._in_memorydatac                    0   | j r| j| d S t| jj|I d H  d S r<   )r   r   writer   )r2   r   r   r   r   r        zUploadFile.writer   sizec                    s(   | j r
| j|S t| jj|I d H S r<   )r   r   readr   )r2   r   r   r   r   r     s   zUploadFile.readoffsetc                    r   r<   )r   r   seekr   )r2   r   r   r   r   r     r   zUploadFile.seekc                    s,   | j r| j  d S t| jjI d H  d S r<   )r   r   closer   r:   r   r   r   r     s   zUploadFile.close)Nr   )r   r   )r   r   r   r}   r   rn   BinaryIOr   r   ro   r7   rq   rs   r   r   r   r   r   r   r   r   r   r   r   r     s4   
 


r   c                
       s|   e Zd ZdZdejd ejeejeef f ej	ej
eejeef f  f dejeef ddf fddZd
dd	Z  ZS )FormDatazN
    An immutable multidict, containing both file uploads and text input.
    r   rF   r   Nc                    s   t  j|i | d S r<   )r   r7   )r2   r   rF   r   r   r   r7     s   	zFormData.__init__c                    s0   |   D ]\}}t|tr| I d H  qd S r<   )rX   ra   r   r   r   r   r   r   r     s   
zFormData.closer   )r   r   r   r}   rn   rr   r   r   r   r   r   r7   r   r   r   r   r   r   r     s    r   c                
   @   s`  e Zd ZdZ			d$dejejeef  dejejej	e
e
f   dejejeejf  ddfddZedejej	e
e
f  fd	d
Zdeje fddZdeje fddZdejej	eef  fddZdedeje fddZd%ddZdedefddZdejdefddZdejej fddZdefddZdejdefd d!Zdefd"d#ZdS )&r   z3
    An immutable, case-insensitive multidict.
    Nr%   rawr   r   c                 C   s   g | _ |d ur#|d u sJ d|d u sJ ddd | D | _ d S |d ur4|d u s/J d|| _ d S |d ur?|d | _ d S d S )Nz$Cannot set both "headers" and "raw".z&Cannot set both "headers" and "scope".c                 S   s(   g | ]\}}|  d |d fqS r&   )lowerencoderP   r   r   r   r\     s    z$Headers.__init__.<locals>.<listcomp>z"Cannot set both "raw" and "scope".r%   )r   rW   )r2   r%   r   r   r   r   r   r7     s   
zHeaders.__init__c                 C   r   r<   r   r:   r   r   r   r     rE   zHeaders.rawc                 C      dd | j D S )Nc                 S   s   g | ]	\}}| d qS r   r.   rP   r   r   r   r\         z Headers.keys.<locals>.<listcomp>r   r:   r   r   r   r`     rf   zHeaders.keysc                 C   r   )Nc                 S   s   g | ]	\}}| d qS r   r   rP   r   r   r   r\     r   z"Headers.values.<locals>.<listcomp>r   r:   r   r   r   r     rf   zHeaders.valuesc                 C   r   )Nc                 S   s$   g | ]\}}| d | d fqS r   r   rP   r   r   r   r\     s    z!Headers.items.<locals>.<listcomp>r   r:   r   r   r   rW     s   zHeaders.itemsr4   c                    s"   |  d  fdd| jD S )Nr&   c                    s"   g | ]\}}| kr| d qS r   r   r   get_header_keyr   r   r\   !  s    z#Headers.getlist.<locals>.<listcomp>r   r   r   r   r   r   r   r     s   
zHeaders.getlistMutableHeadersc                 C   s   t | jd d  dS )N)r   )r   r   r:   r   r   r   mutablecopy'  r   zHeaders.mutablecopyc                 C   s<   |  d}| jD ]\}}||kr|d  S q
t|)Nr&   )r   r   r   r.   KeyErrorr2   r4   r   
header_keyheader_valuer   r   r   r   *  s   zHeaders.__getitem__c                 C   s0   |  d}| jD ]\}}||kr dS q
dS )Nr&   TFr   r  r   r   r   r   1  s   zHeaders.__contains__c                 C   r   r<   r   r:   r   r   r   r   8  r   zHeaders.__iter__c                 C   r   r<   )r   r   r:   r   r   r   r   ;  r   zHeaders.__len__rc   c                 C   s"   t |tsdS t| jt|jkS r   )ra   r   r   r   rd   r   r   r   re   >  s   
zHeaders.__eq__c                 C   sF   | j j}t|  }t|t| kr| d|dS | d| jdS )Nrj   rk   z(raw=)rJ   r   dictrW   r   r   )r2   r   as_dictr   r   r   rm   C  s
   zHeaders.__repr__)NNN)r   r   )r   r   r   r}   rn   ro   r   r   r   r   r   rp   r7   rq   r   r`   r   rW   r   r   r   rs   r   r   r   r   r   re   rm   r   r   r   r   r     s6    
 
r   c                   @   s   e Zd ZdededdfddZdeddfddZd	ejdd fd
dZd	ejdd fddZ	e
dejejeef  fddZdededefddZd	ejddfddZdededdfddZdeddfddZdS )r   r4   r5   r   Nc           	      C   s   |  d}|d}g }t| jD ]\}\}}||kr"|| qt|dd D ]}| j|= q+|rA|d }||f| j|< dS | j||f dS )zs
        Set the header `key` to `value`, removing any duplicate entries.
        Retains insertion order.
        r&      Nr   r   r   	enumerater   r   reversed)	r2   r4   r5   set_key	set_valuefound_indexesidxr   r   r   r   r   r   L  s   


zMutableHeaders.__setitem__c                 C   sV   |  d}g }t| jD ]\}\}}||kr|| qt|D ]}| j|= q"dS )z*
        Remove the header `key`.
        r&   Nr  )r2   r4   del_keypop_indexesr  r   r   r   r   r   r   b  s   

zMutableHeaders.__delitem__rc   c                 C   s,   t |tjstd|jj | | | S NzExpected a mapping but got )ra   rn   r   	TypeErrorrJ   r   rV   rd   r   r   r   __ior__p  s   
zMutableHeaders.__ior__c                 C   s4   t |tjstd|jj |  }|| |S r  )ra   rn   r   r  rJ   r   r   rV   )r2   rc   newr   r   r   __or__v  s
   
zMutableHeaders.__or__c                 C   rg   r<   r   r:   r   r   r   r   }  s   zMutableHeaders.rawc                 C   sZ   |  d}|d}t| jD ]\}\}}||kr"|d  S q| j||f |S )zo
        If the header `key` does not exist, then set it to `value`.
        Returns the header value.
        r&   )r   r   r	  r   r.   r   )r2   r4   r5   r  r  r  r   r   r   r   r   r     s   
zMutableHeaders.setdefaultc                 C   s   |  D ]\}}|| |< qd S r<   )rW   )r2   rc   r4   valr   r   r   rV     s   
zMutableHeaders.updatec                 C   s,   |  d}|d}| j||f dS )zD
        Append a header, preserving any duplicate entries.
        r&   N)r   r   r   r   )r2   r4   r5   
append_keyappend_valuer   r   r   r     s   
zMutableHeaders.appendvaryc                 C   s,   |  d}|d urd||g}|| d< d S )Nr  r   )r-   r   )r2   r  existingr   r   r   add_vary_header  s   
zMutableHeaders.add_vary_header)r   r   r   r   r   r   rn   r   r  r  rq   r   r   r   r   r   rV   r   r  r   r   r   r   r   K  s     r   c                       s   e Zd ZU dZejeejf ed< ddej	ejeejf  f fddZ
dejdejd	dfd
dZdejd	ejfddZdejd	dfddZ  ZS )Statezm
    An object that can be used to store arbitrary state.

    Used for `request.state` and `app.state`.
    _stateNstatec                    s   |d u ri }t  d| d S )Nr  )r   __setattr__)r2   r  r   r   r   r7     s   zState.__init__r4   r5   r   c                 C   s   || j |< d S r<   r  r   r   r   r   r    s   zState.__setattr__c                 C   s4   z| j | W S  ty   d}t|| jj|w )Nz!'{}' object has no attribute '{}')r  r  AttributeErrorformatrJ   r   )r2   r4   messager   r   r   __getattr__  s   zState.__getattr__c                 C   s   | j |= d S r<   r   r   r   r   r   __delattr__  r   zState.__delattr__r<   )r   r   r   r}   rn   r   r   rp   r   ro   r7   r  r$  r%  r   r   r   r   r   r    s   
 &r  )#r   rn   collections.abcr   r   urllib.parser   r   r   r   starlette.concurrencyr   starlette.typesr	   
NamedTupler
   TypeVarr   r   r   r   rt   r~   r   r   r   rp   rU   r   r   rr   r   r   r   r  r   r   r   r   <module>   s.    
 N<("6UW