
    F/ju                        U 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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mZmZmZmZmZmZmZ d dlmZ d dlm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# d dl$m%Z%m&Z' d	d
l(m)Z) d	dl m*Z*m+Z+m,Z, d	dl-m.Z.m/Z/ d	dl0m1Z1 d	dl2m3Z3m4Z4 d	dl5m6Z6m7Z7m8Z8m9Z9m:Z: d	dl;m<Z< d	dl=m>Z> d	dl?m@Z@mAZA d	dlBmCZC dZDerd	dlEmFZF eGeHeHf   ZIneGZIej                  dk  reKfndZL eM eNeO e'j                  d      dd             ZQeeMeOdf      eRd<    e
j                  d      ZTeeeH      eRd<    e
j                  d      ZUeeeH      eRd<    e
j                  d       ZWeeH   eRd!<    e	j                         d"k(  ZYeeZ   eRd#<   ee>geeAdz     f   Z[eMe!d$   e\eH   f   Z] ej                  ej                  d%&      Z_ G d' d(e"d)*      Z` G d+ d,eed-         Za G d. d-e j                        Zc G d/ d$eIe*      Zd G d0 d1ed      Zed2e>d3dfd4Zf G d5 d6ea      Zg G d7 d8eg      Zh G d9 d:eg      Zi G d; d<ea      Zj G d= d>ej      Zk G d? d@ej      Zl G dA dBe j                        Zm G dC dDem      Zn G dE dFen      Zo G dG dHel      Zp G dI dJec      Zq G dK dLec      Zr G dM dNe,      Zs G dO dPeeea   eea         Zt G dQ dReeec   eec         Zu G dS dTe+eeHeaf         ZvdUeHd3eHfdVZwdUeHd3eHfdWZxdUeHd3eHfdXZyy)Y    N)	AwaitableCallable	Container	GeneratorIterableIteratorMappingSized)wraps)Path)Pattern)MappingProxyType)TYPE_CHECKINGAnyFinalNoReturnOptional	TypedDictcast)URL__version__   )hdrs)AbstractMatchInfoAbstractRouterAbstractView)DEBUGDEFAULT_CHUNK_SIZE)HttpVersion11)HandlerPathLike)HTTPExceptionHTTPExpectationFailedHTTPForbiddenHTTPMethodNotAllowedHTTPNotFound)FileResponse)Request)ResponseStreamResponse)AbstractRouteDef)
UrlDispatcherUrlMappingMatchInfoAbstractResourceResourcePlainResourceDynamicResourceAbstractRouteResourceRouteStaticResourceView)Application)       .   .YARL_VERSIONz$^[0-9A-Za-z!#\$%&'\*\+\-\.\^_`\|~]+$HTTP_METHOD_REz*(\{[_a-zA-Z][^{}]*(?:\{[^{}]*\}[^{}]*)*\})ROUTE_RE/PATH_SEPWindows
IS_WINDOWSr-   T)quotec                       e Zd ZU eed<   eed<   ee   ed<   eed<   eed<   eedf   ed<   ded	<   eed
<   ded<   eed<   y)	_InfoDictpath	formatterpattern	directoryprefixr2   routesr6   appdomainAbstractRuleMatchingrulehttp_exceptionN)	__name__
__module____qualname__str__annotations__r   r   r	   r"   r9       W/var/www/html/maxservice/venv/lib/python3.12/site-packages/aiohttp/web_urldispatcher.pyrE   rE   Z   sG    
INS\OKC())	K
  !!rV   rE   F)totalc                   b   e Zd Zdddedz  ddfdZededz  fd       Zeej                  defd              Z	ej                  dede
fd	       Zej                  d
edefd       Zej                  deddfd       Zej                  defd       ZddZej                  dedefd       Zy)r.   Nnamer[   returnc                    || _         y N_nameselfr[   s     rW   __init__zAbstractResource.__init__n   s	    
rV   c                     | j                   S r^   r_   rb   s    rW   r[   zAbstractResource.nameq       zzrV   c                      y)zWExposes the resource's canonical path.

        For example '/foo/bar/{name}'

        Nr9   re   s    rW   	canonicalzAbstractResource.canonicalu       rV   kwargsc                      y)z2Construct url for resource with additional params.Nr9   )rb   rj   s     rW   url_forzAbstractResource.url_for~   ri   rV   requestc                    K   yw)zWResolve resource.

        Return (UrlMappingMatchInfo, allowed_methods) pair.
        Nr9   rb   rm   s     rW   resolvezAbstractResource.resolve           rJ   c                      y)zWAdd a prefix to processed URLs.

        Required for subapplications support.
        Nr9   rb   rJ   s     rW   
add_prefixzAbstractResource.add_prefix   ri   rV   c                      yz;Return a dict with additional info useful for introspectionNr9   re   s    rW   get_infozAbstractResource.get_info   ri   rV   c                      y r^   r9   re   s    rW   freezezAbstractResource.freeze   s    rV   rF   c                      y)z Perform a raw match against pathNr9   rb   rF   s     rW   	raw_matchzAbstractResource.raw_match   ri   rV   r\   N)rQ   rR   rS   rT   rc   propertyr[   abcabstractmethodrh   r   rl   r(   _Resolverp   ru   rE   rx   rz   boolr}   r9   rV   rW   r.   r.   m   s1   -1 d
 d  cDj   3    	A A A A 	W    	    	J) J J 	/c /d / /rV   r.   r2   c                   <   e Zd Zddddedeee   z  dedz  dedz  ddf
dZ	e
defd	       Ze
defd
       Ze
ej                  dedz  fd              Ze
dedz  fd       Zej                  defd       Zej                  dededefd       Zdededz  fdZy)r2   Nexpect_handlerresourcemethodhandlerr   r   r\   c                   |t         }t        j                  |      s2t        j                  dk  rt        j                  |      s
J d|       |j                         }t        j                  |      st        | d      t        |      sJ |       t        j                  |      s(t        j                  dk  rt        j                  |      rnt        j                  |      r#t        rJ t        j                  dt               n_t!        |t"              rt%        |t&              rn>t        j                  dt               t)        |      dt*        dt,        ffd       }||}|| _        || _        || _        || _        y )	N)r7      zCoroutine is expected, got z is not allowed HTTP methodz6Bare generators are deprecated, use @coroutine wrapperz-Bare functions are deprecated, use async onesrm   r\   c                    K    |       }t        j                  |      r
| d {   }t        |t              sJ |S 7 wr^   )asyncioiscoroutine
isinstancer*   )rm   resultold_handlers     rW   handler_wrapperz/AbstractRoute.__init__.<locals>.handler_wrapper   s@     $W-&&v.#)\F!&.999 *s   #A?A)_default_expect_handlerinspectiscoroutinefunctionsysversion_infor   upperr=   match
ValueErrorcallableisgeneratorfunctionr   warningswarnDeprecationWarningr   type
issubclassr   r   r(   r*   _method_handler_expect_handler	_resource)rb   r   r   r   r   r   r   s         @rW   rc   zAbstractRoute.__init__   sa    !4N**>:w&7+F+F~+V	<((:;	< 
 ##F+x'BCDD )') &&w/w&7+F+Fw+O((1uMMH" &:g|+LMM?AS 7^w >   "K%G-!rV   c                     | j                   S r^   )r   re   s    rW   r   zAbstractRoute.method       ||rV   c                     | j                   S r^   )r   re   s    rW   r   zAbstractRoute.handler   s    }}rV   c                      y)z8Optional route's name, always equals to resource's name.Nr9   re   s    rW   r[   zAbstractRoute.name   ri   rV   c                     | j                   S r^   )r   re   s    rW   r   zAbstractRoute.resource   s    ~~rV   c                      yrw   r9   re   s    rW   rx   zAbstractRoute.get_info   ri   rV   argsrj   c                      y)/Construct url for route with additional params.Nr9   rb   r   rj   s      rW   rl   zAbstractRoute.url_for   ri   rV   rm   c                 @   K   | j                  |       d {   S 7 wr^   )r   ro   s     rW   handle_expect_headerz"AbstractRoute.handle_expect_header   s     ))'2222s   )rQ   rR   rS   rT   r    r   r   _ExpectHandlerr.   rc   r   r   r   r   r   r[   r   rE   rx   r   rl   r(   r*   r   r9   rV   rW   r2   r2      sF    15,05"5" 4--5"
 '-5" #T)5" 
5"n       GcDj G  G *T1   	J) J J 	>S >C >C > >3' 3nt>S 3rV   c                       e Zd ZdZdeeef   deddf fdZede	fd       Z
edefd       Zedefd	       Zededz  fd
       ZdefdZeded   fd       ZddZedd       Zej,                  dd       ZddZdef fdZ xZS )r-   )_route_apps_current_app_frozen
match_dictrouter\   Nc                 \    t         |   |       || _        g | _        d | _        d| _        y NF)superrc   r   r   r   r   )rb   r   r   	__class__s      rW   rc   zUrlMappingMatchInfo.__init__   s-    $(*
04rV   c                 .    | j                   j                  S r^   )r   r   re   s    rW   r   zUrlMappingMatchInfo.handler   s    {{"""rV   c                     | j                   S r^   )r   re   s    rW   r   zUrlMappingMatchInfo.route   s    {{rV   c                 .    | j                   j                  S r^   )r   r   re   s    rW   r   z"UrlMappingMatchInfo.expect_handler  s    {{///rV   c                      y r^   r9   re   s    rW   rP   z"UrlMappingMatchInfo.http_exception      rV   c                 6    | j                   j                         S r^   )r   rx   re   s    rW   rx   zUrlMappingMatchInfo.get_info  s    {{##%%rV   )r6   .c                 ,    t        | j                        S r^   )tupler   re   s    rW   appszUrlMappingMatchInfo.apps  s    TZZ  rV   c                     | j                   rt        d      | j                  || _        | j                  j	                  d|       y )Nz-Cannot change apps stack after .freeze() callr   )r   RuntimeErrorr   r   insertrb   rL   s     rW   add_appzUrlMappingMatchInfo.add_app  s=    <<NOO$ #D

!S!rV   c                 &    | j                   }|J |S r^   )r   r   s     rW   current_appzUrlMappingMatchInfo.current_app  s    
rV   c                 p    t         r)|| j                  vrt        d| j                  d|      || _        y )Nz#Expected one of the following apps z, got )r   r   r   r   r   s     rW   r   zUrlMappingMatchInfo.current_app   s<    $**$"9$**vcWU   rV   c                     d| _         y )NT)r   re   s    rW   rz   zUrlMappingMatchInfo.freeze)  s	    rV   c                 B    dt         |           d| j                   dS )Nz<MatchInfo : >)r   __repr__r   rb   r   s    rW   r   zUrlMappingMatchInfo.__repr__,  s%    UW-/04;;-qAArV   )rL   r6   r\   N)r\   r6   r~   )rQ   rR   rS   	__slots__dictrT   r2   rc   r   r    r   r   r   r   r"   rP   rE   rx   r   r   r   r   setterrz   r   __classcell__r   s   @rW   r-   r-      s   >I4S> - D  # # # }   0 0 0  4  &) & !e./ ! !"  
    B# B BrV   c                   N     e Zd ZdZdeddf fdZedefd       ZdefdZ	 xZ
S )MatchInfoError
_exceptionrP   r\   Nc                 Z    || _         t        | 	  i t        | j                                y r^   )r   r   rc   SystemRouterb   rP   r   s     rW   rc   zMatchInfoError.__init__4  s"    ([9:rV   c                     | j                   S r^   r   re   s    rW   rP   zMatchInfoError.http_exception8      rV   c                 d    d| j                   j                   d| j                   j                   dS )Nz<MatchInfoError r   r   )r   statusreasonre   s    rW   r   zMatchInfoError.__repr__<  s.    !$//"8"8!9DOO<R<R;SSTUUrV   )rQ   rR   rS   r   r"   rc   r   rP   rT   r   r   r   s   @rW   r   r   0  sD    I;} ; ;   V# VrV   r   rm   r\   c                 8  K   | j                   j                  t        j                  d      }| j                  t
        k(  rW|j                         dk(  r5| j                  j                  d       d{    d| j                  _	        yt        d|z        y7 &w)zDefault handler for Expect header.

    Just send "100 Continue" to client.
    raise HTTPExpectationFailed if value of header is not "100-continue"
     z100-continues   HTTP/1.1 100 Continue

Nr   zUnknown Expect: %s)text)headersgetr   EXPECTversionr   lowerwriterwriteoutput_sizer#   )rm   expects     rW   r   r   @  sz      __  b1F-'<<>^+..&&'GHHH)*GNN&'-AF-JKK (Hs   A/B1B2'Bc            	            e Zd Zdddedz  ddf fdZdddedee   ez  d	edz  dd
fdZ	ddZ
dedefdZej                  dedeeef   dz  fd       ZdefdZded
   fdZ xZS )r/   NrZ   r[   r\   c                `    t         |   |       i | _        d | _        t	               | _        y )NrZ   )r   rc   _routes
_any_routeset_allowed_methods)rb   r[   r   s     rW   rc   zResource.__init__Q  s+    d#1304*-%rV   r   r   r   r   r3   c                    | j                   j                  || j                        x}rt        d|j                   d      t        ||| |      }| j                  |       |S )Nz+Added route will never be executed, method z is already registeredr   )r   r   r   r   r   r3   register_route)rb   r   r   r   r   	route_objs         rW   	add_routezResource.add_routeW  so     LL$$VT__==5=,, (  "&'4W	I&rV   c                     t        |t              s
J d|       |j                  t        j                  k(  r|| _        | j                  j                  |j                         || j                  |j                  <   y )Nz)Instance of Route class is required, got )	r   r3   r   r   METH_ANYr   r   addr   rb   r   s     rW   r   zResource.register_routei  sm    =
 	A6ui@	A 
 <<4==(#DO!!%,,/%*U\\"rV   rm   c                    K   | j                  |j                  j                        x}d t               fS | j                  j                  |j                  | j                        x}rt        ||      | j                  fS d | j                  fS wr^   )
_matchrel_url	path_safer   r   r   r   r   r-   r   )rb   rm   r   r   s       rW   rp   zResource.resolver  s}     ++goo&?&?@@JI;LL$$W^^T__EE5E&z594;P;PPPT****s   BBrF   c                      y r^   r9   r|   s     rW   r  zResource._matchy  s    rV   c                 ,    t        | j                        S r^   lenr   re   s    rW   __len__zResource.__len__}      4<<  rV   c                 H    t        | j                  j                               S r^   iterr   valuesre   s    rW   __iter__zResource.__iter__      DLL'')**rV   )r   r3   r\   N)rQ   rR   rS   rT   rc   r   r   r    r   r   r   r(   r   rp   r   r   r   r  intr	  r   r  r   r   s   @rW   r/   r/   P  s    -1 0d
 0d 0 15 l#g-
 '- 
$++W + + 	3 4S>D#8  ! !+(?3 +rV   r/   c                        e Zd Zdddededz  ddf fdZedefd       ZddZd	eddfd
Zdede	eef   dz  fdZ
dedefdZdefdZdefdZdefdZ xZS )r0   NrZ   rF   r[   r\   c                ^    t         |   |       |r|j                  d      sJ || _        y )NrZ   r?   )r   rc   
startswith_path)rb   rF   r[   r   s      rW   rc   zPlainResource.__init__  s.    d#4??3///
rV   c                     | j                   S r^   r  re   s    rW   rh   zPlainResource.canonical  rf   rV   c                 ,    | j                   sd| _         y y )Nr?   r  re   s    rW   rz   zPlainResource.freeze  s    zzDJ rV   rJ   c                     |j                  d      sJ |j                  d      rJ t        |      dkD  sJ || j                  z   | _        y Nr?   r   )r  endswithr  r  rt   s     rW   ru   zPlainResource.add_prefix  sH      %%%??3'''6{Qdjj(
rV   c                 &    | j                   |k(  ri S y r^   r  r|   s     rW   r  zPlainResource._match  s    ::IrV   c                      | j                   |k(  S r^   r  r|   s     rW   r}   zPlainResource.raw_match  s    zzT!!rV   c                     d| j                   iS )NrF   r  re   s    rW   rx   zPlainResource.get_info  s    

##rV   c                 D    t        j                  | j                  d      S NTrF   encoded)r   buildr  re   s    rW   rl   zPlainResource.url_for  s    yydjj$77rV   c                 h    | j                   d| j                   z   dz   nd}d| d| j                   dS )N'' r   z<PlainResource  r   )r[   r  ra   s     rW   r   zPlainResource.__repr__  s8    )-)>sTYY%B a

|155rV   r~   )rQ   rR   rS   rT   rc   r   rh   rz   ru   r   r  r   r}   rE   rx   r   rl   r   r   r   s   @rW   r0   r0     s    8< S 3:  
 3  ) ) )3 4S>D#8 "c "d "$) $8 86# 6rV   r0   c                       e Zd Z ej                  d      Z ej                  d      ZdZdddededz  ddf fd	Z	e
defd
       ZdeddfdZdedeeef   dz  fdZdedefdZdefdZdedefdZdefdZ xZS )r1   z#\{(?P<var>[_a-zA-Z][_a-zA-Z0-9]*)\}z.\{(?P<var>[_a-zA-Z][_a-zA-Z0-9]*):(?P<re>.+)\}z[^{}/]+NrZ   rF   r[   r\   c                   t         	|   |       || _        d}d}t        j	                  |      D ]  }| j
                  j                  |      }|rI|dj                  |j                  d      | j                        z  }|d|j                  d      z   dz   z  }j| j                  j                  |      }|r>| dj                  di |j                         z  }|d|j                  d      z   dz   z  }d|v sd|v rt        d| d	| d
      t        |      }||z  }|t        j                  |      z  }	 	 t        j                   |      }|j$                  j'                  t(              sJ |j'                  d      sJ || _        || _        y # t        j"                  $ r}t        d| d|       d d }~ww xY w)NrZ   r   z
(?P<{}>{})var{}z(?P<{var}>{re})zInvalid path 'z'['z']zBad pattern 'z': r?   r9   )r   rc   
_orig_pathr>   splitDYN	fullmatchformatgroupGOODDYN_WITH_RE	groupdictr   _requote_pathreescapecompileerrorrH   r  r@   _pattern
_formatter)
rb   rF   r[   rH   rG   partr   compiledexcr   s
            rW   rc   zDynamicResource.__init__  s   d#	NN4( 	'DHH&&t,E<..u{{5/A499MMS5;;u#55;;	$$..t4E3,33Heoo6GHHS5;;u#55;;	d{cTk >$s4&!CDD &DIryy&G%	'(	Jzz'*H **8444##C((( # xx 	J}WIS>?TI	Js   =F F?(F::F?c                     | j                   S r^   )r<  re   s    rW   rh   zDynamicResource.canonical  r   rV   rJ   c                     |j                  d      sJ |j                  d      rJ t        |      dkD  sJ t        j                  t        j
                  |      | j                  j                  z         | _        || j                  z   | _        y r  )	r  r  r  r7  r9  r8  r;  rH   r<  rt   s     rW   ru   zDynamicResource.add_prefix  sp      %%%??3'''6{Q

299V#4t}}7L7L#LM 4??2rV   c                     | j                   j                  |      }|y |j                         j                         D ci c]  \  }}|t	        |       c}}S c c}}w r^   )r;  r0  r5  items_unquote_path_safe)rb   rF   r   keyvalues        rW   r  zDynamicResource._match  sZ    ''-==B__=N=T=T=V
/9sEC#E**
 	
 
s    Ac                      | j                   |k(  S r^   )r-  r|   s     rW   r}   zDynamicResource.raw_match  s    $&&rV   c                 4    | j                   | j                  dS )N)rG   rH   )r<  r;  re   s    rW   rx   zDynamicResource.get_info  s    !__GGrV   partsc           
          | j                   j                  |j                         D ci c]  \  }}|t        |       c}}      }t	        j
                  |d      S c c}}w r   )r<  
format_maprC  _quote_pathr   r#  )rb   rI  kvurls        rW   rl   zDynamicResource.url_for  sK    oo(()V1![^*;)VWyyc400 *Ws   A
c                 h    | j                   d| j                   z   dz   nd}d| d| j                   dS )Nr%  r&  r   z<DynamicResource r'  r   )r[   r<  ra   s     rW   r   zDynamicResource.__repr__  s9    )-)>sTYY%B"4&$//):!<<rV   )rQ   rR   rS   r7  r9  r/  r4  r3  rT   rc   r   rh   ru   r   r  r   r}   rE   rx   r   rl   r   r   r   s   @rW   r1   r1     s    
"**;
<C"**NOKD8<  $S  $3:  $  $D 3  3 3 3
3 
4S>D#8 
'c 'd 'H) H1s 1s 1=# =rV   r1   c                   n     e Zd Zdddededz  ddf fdZedefd       ZdeddfdZdedefd	Z	 xZ
S )
PrefixResourceNrZ   rJ   r[   r\   c                    |r|j                  d      sJ |       |dv s|j                  d      rJ |       t        |   |       t	        |      | _        | j
                  dz   | _        y )Nr?   )r   r?   rZ   )r  r  r   rc   r6  _prefix_prefix2)rb   rJ   r[   r   s      rW   rc   zPrefixResource.__init__  sh    V..s3;V;3"&//#*>FF>d#$V,s*rV   c                     | j                   S r^   )rT  re   s    rW   rh   zPrefixResource.canonical   r   rV   c                     |j                  d      sJ |j                  d      rJ t        |      dkD  sJ || j                  z   | _        | j                  dz   | _        y r  )r  r  r  rT  rU  rt   s     rW   ru   zPrefixResource.add_prefix  sX      %%%??3'''6{Q,s*rV   c                      yr   r9   rt   s     rW   r}   zPrefixResource.raw_match  s    rV   )rQ   rR   rS   rT   rc   r   rh   ru   r   r}   r   r   s   @rW   rR  rR    se    :> +s +S4Z +4 + 3  + + +  rV   rR  c                   $    e Zd ZdZddedddddedededz  dedz  d	ed
e	de	de	ddf fdZ
dddede	dz  defdZededefd       ZdefdZdeddfdZdedefdZdefdZdee   fdZdedefdZdedefdZdedefdZdefd Z  xZ!S )!r4   rN  NFr[   r   
chunk_size
show_indexfollow_symlinksappend_versionrJ   rI   r[   r   r[  r\  r]  r^  r\   c                   t         
|   ||       	 t        |      j                         j	                  d      }|j                         st        d| d      || _        || _	        || _
        || _        || _        || _        t        d| j                  | |      t        d	| j                  | |      d
| _        t#        | j                         | _        y # t
        $ r}	t        d| d      |	d }	~	ww xY w)NrZ   T)strictr%  z' does not existz' is not a directoryGETr   HEAD)ra  rb  )r   rc   r   
expanduserrp   FileNotFoundErrorr   is_dir
_directory_show_index_chunk_size_follow_symlinksr   _append_versionr3   _handler   r   r   )rb   rJ   rI   r[   r   r[  r\  r]  r^  r:  r   s             rW   rc   zStaticResource.__init__  s    	d+	IY224<<D<II !q+?@AA#%% /-- !t||T. "d>	
 !$DLL 1' ! 	Iq+;<=5H	Is   )C 	C7"C22C7)r^  filenamec                N   || j                   }t        |      j                  d      }t        j                  | j
                  d      }t        dk  r||j                  dd      z  }n||z  }|r| j                  j                  |      }	 | j                  rTt        t        j                  j                  |            }|j                  | j                         |j!                         }n+|j!                         }|j                  | j                         |j'                         rZ|j)                  d      5 }|j+                         }d d d        | j-                        }	|j/                  | j0                  |	i      }|S |S # t"        t$        f$ r |cY S w xY w# 1 sw Y   RxY w)Nr?   Tr!  r      %%25rb)rj  rT   lstripr   r#  rT  r<   replacerf  joinpathri  r   osrF   normpathrelative_torp   r   rd  is_fileopenread_get_file_hash
with_queryVERSION_KEY)
rb   rl  r^  rO  unresolved_pathnormalized_pathfilepathf
file_byteshs
             rW   rl   zStaticResource.url_for8  sr    !!11Nx='',iiT\\48& ((e44C.C"oo66x@O((&*277+;+;O+L&MO#//@.668H.668H((9
 ! ]]4( *A!"J*''
3nnd&6&6%:;

  12  
* *s   BF 9FFFF$
byte_arrayc                     t        j                         }|j                  |        t        j                  |j                               }|j                  d      S )Nascii)hashlibsha256updatebase64urlsafe_b64encodedigestdecode)r  mb64s      rW   r|  zStaticResource._get_file_hasha  s?    NN	&&qxxz2zz'""rV   c                 J    | j                   | j                  | j                  dS )N)rI   rJ   rK   )rf  rT  r   re   s    rW   rx   zStaticResource.get_infoh  s!    llll
 	
rV   r   c                     d| j                   v rt        d      t        d|| | j                        | j                   d<   | j                  j                  d       y )NOPTIONSzOPTIONS route was set alreadyr   )r   r   r3   r   r   r   )rb   r   s     rW   set_options_routez StaticResource.set_options_routeo  sR    $>??"/wT5I5I#
Y 	!!),rV   rm   c                   K   |j                   j                  }|j                  }t        j                  j                  |      }t        r|j                  dd      }|j                  | j                        s|| j                  k7  rd t               fS | j                  }||vrd |fS dt        |t        | j                        dz   d        i}t        || j                   |         |fS w)N\r?   rl  r   )r  r  r   rv  rF   rw  rB   rt  r  rU  rT  r   r   rD  r  r-   r   )rb   rm   rF   r   	norm_pathallowed_methodsr   s          rW   rp   zStaticResource.resolvew  s     (( GG$$T*	!))$4I##DMM2yDLL7P;//((( "4T#dll:Ka:O:Q5R"ST
#JV0DEWWs   C%C'c                 ,    t        | j                        S r^   r  re   s    rW   r	  zStaticResource.__len__  r
  rV   c                 H    t        | j                  j                               S r^   r  re   s    rW   r  zStaticResource.__iter__  r  rV   c                   K   |j                   d   }t        |      j                         r
t               | j                  j                  |      }t        j                         }|j                  d | j                  |       d {   S 7 w)Nrl  )

match_infor   is_absoluter&   rf  ru  r   get_running_looprun_in_executor_resolve_path_to_response)rb   rm   rl  r  loops        rW   rk  zStaticResource._handle  s|     %%j1>%%' . //228<'')))$00/
 
 	
 
s   BBB	Br  c                 P   	 | j                   rTt        t        j                  j	                  |            }|j                  | j                         |j                         }n+|j                         }|j                  | j                         	 |j                         r2| j                  rt        | j                  |      d      S t               	 t#        || j$                        S # t        gt        $ r}t               |d}~ww xY w# t         $ r}t               |d}~ww xY w)zFTake the unresolved path and query the file system to form a response.Nz	text/html)r   content_type)r[  )ri  r   rv  rF   rw  rx  rf  rp   r   CIRCULAR_SYMLINK_ERRORr&   re  rg  r)   _directory_as_htmlr$   PermissionErrorr'   rh  )rb   r  r  	file_pathr:  s        rW   r  z(StaticResource._resolve_path_to_response  s   
	,$$"&rww'7'7'H"I++DOO<+335	+335	%%doo6
	-!###!44Y?%0 
 (/) " I$2B2BCC) 434 	, .e+	,   	-/u,	-s6   BC( 7D 
D (D	9DD		D%D  D%dir_pathc           	      x   |j                         sJ |j                  | j                        j                         }dt	        |       }d| d}g }|j                         }t        |      D ]  }|j                  | j                        j                         }t        | j                   d|       }	|j                         r|j                   d}
n|j                  }
|j                  d|	 dt	        |
       d        dj                  d	j                  |            }d
| d	| d}d| d}d| d	| d}|S )z"returns directory's index as html.z
Index of /z<h1>z</h1>r?   z<li><a href="z">z	</a></li>z<ul>
{}
</ul>
z<body>
z
</body>z<head>
<title>z</title>
</head>z<html>
z
</html>)re  rx  rf  as_posixhtml_escapeiterdirsortedrL  rT  r[   appendr1  join)rb   r  relative_path_to_dirindex_ofh1
index_list	dir_index_filerel_pathquoted_file_url	file_nameulbodyhead_strhtmls                  rW   r  z!StaticResource._directory_as_html  sP      '33DOODMMO,@ ABCH:U#
$$&	I& 	E((9BBDH)T\\N!H:*FGO ||~$zzl!,	!JJ	0;y3I2J)T	 %%dii
&;<"Rt9-$XJ.?@(2dV95rV   c                     | j                   d| j                   z   dz   nd}d| d| j                   d| j                  dS )Nr%  r   z<StaticResource r'   -> r   )r[   rT  rf  ra   s     rW   r   zStaticResource.__repr__  sC    (,		(=sTYY$2!$qd4??:MQOOrV   )"rQ   rR   rS   r~  r   rT   r!   r   r  r   rc   r   rl   staticmethodbytesr|  rE   rx   r    r  r(   r   rp   r	  r   r2   r  r*   rk  r   r  r  r   r   r   s   @rW   r4   r4     sp   K  04,  %$"2"2 "2
 Dj"2 '-"2 "2 "2 "2 "2 
"2P '+	' ' t	'
 
'R #5 #S # #
) 
- -T -XW X X$! !+(=1 +

W 

 

!D !D. !DF4 C @P# PrV   r4   c                        e Zd Zdeddddf fdZdeddf fdZdeddfdZd	ed
edefdZde	fdZ
dedefdZdefdZdee   fdZdefdZ xZS )PrefixedSubAppResourcerJ   rL   r6   r\   Nc                 T    t         |   |       || _        | j                  |       y r^   )r   rc   _app_add_prefix_to_resources)rb   rJ   rL   r   s      rW   rc   zPrefixedSubAppResource.__init__  s%     	%%f-rV   c                 F    t         |   |       | j                  |       y r^   )r   ru   r  )rb   rJ   r   s     rW   ru   z!PrefixedSubAppResource.add_prefix  s    6"%%f-rV   c                     | j                   j                  }|j                         D ]5  }|j                  |       |j	                  |       |j                  |       7 y r^   )r  router	resourcesunindex_resourceru   index_resource)rb   rJ   r  r   s       rW   r  z/PrefixedSubAppResource._add_prefix_to_resources  sU    !!((* 	,H ##H-'!!(+	,rV   r   rj   c                     t        d      )Nz3.url_for() is not supported by sub-application rootr   r   s      rW   rl   zPrefixedSubAppResource.url_for  s    PQQrV   c                 4    | j                   | j                  dS )N)rL   rJ   )r  rT  re   s    rW   rx   zPrefixedSubAppResource.get_info  s    yyDLL99rV   rm   c                 "  K   | j                   j                  j                  |       d {   }|j                  | j                          t	        |j
                  t              r|j
                  j                  }||fS t               }||fS 7 awr^   )	r  r  rp   r   r   rP   r%   r  r   rb   rm   r  methodss       rW   rp   zPrefixedSubAppResource.resolve  s}     99++33G<<
499%j//1EF //??G 7"" eG7"" =s   )BBA"Bc                 \    t        | j                  j                  j                               S r^   )r  r  r  rK   re   s    rW   r	  zPrefixedSubAppResource.__len__  s     499##**,--rV   c                 \    t        | j                  j                  j                               S r^   )r  r  r  rK   re   s    rW   r  zPrefixedSubAppResource.__iter__  s     DII$$++-..rV   c                 <    d| j                    d| j                  dS )Nz<PrefixedSubAppResource r  r   )rT  r  re   s    rW   r   zPrefixedSubAppResource.__repr__  s    )$,,tDII=JJrV   )rQ   rR   rS   rT   rc   ru   r  r   rl   rE   rx   r(   r   rp   r  r	  r   r2   r  r   r   r   s   @rW   r  r    s    .s . .4 .
. . .,s ,t ,RS RC RC R:) :#W # #. ./(=1 /K# KrV   r  c                       e Zd Zej                  dedefd       Zej                  defd       Z	e
ej                  defd              Zy)rN   rm   r\   c                    K   yw)z1Return bool if the request satisfies the criteriaNr9   ro   s     rW   r   zAbstractRuleMatching.match  rq   rr   c                      yrw   r9   re   s    rW   rx   zAbstractRuleMatching.get_info  ri   rV   c                      y)zReturn a strNr9   re   s    rW   rh   zAbstractRuleMatching.canonical  ri   rV   N)rQ   rR   rS   r   r   r(   r   r   rE   rx   r   rT   rh   r9   rV   rW   rN   rN     sy    @7 @t @ @ 	J) J J 3   rV   rN   c                        e Zd Z ej                  d      Zdeddf fdZedefd       Z	dedefdZ
dedefd	Zd
edefdZdefdZ xZS )Domainz(?!-)[a-z\d-]{1,63}(?<!-)rM   r\   Nc                 N    t         |           | j                  |      | _        y r^   )r   rc   
validation_domain)rb   rM   r   s     rW   rc   zDomain.__init__!  s    v.rV   c                     | j                   S r^   r  re   s    rW   rh   zDomain.canonical%  r   rV   c                     t        |t              st        d      |j                  d      j	                         }|st        d      d|v rt        d      t        d|z         }|j                  J t         fd|j                  j                  d      D              st        d      |j                  d	k(  r|j                  S |j                   d
|j                   S )NzDomain must be strr:   zDomain cannot be emptyz://zScheme not supportedzhttp://c              3   T   K   | ]  }j                   j                  |       ! y wr^   )re_partr0  ).0xrb   s     rW   	<genexpr>z$Domain.validation.<locals>.<genexpr>3  s      N4<<))!,Ns   %(zDomain not validP   :)r   rT   	TypeErrorrstripr   r   r   raw_hostallr.  port)rb   rM   rO  s   `  rW   r  zDomain.validation)  s    &#&011s#))+566f_344)f$%||'''Ncll6H6H6MNN/0088r><<,,q
++rV   rm   c                    K   |j                   j                  t        j                        }|sy| j	                  |      S wr   )r   r   r   HOSTmatch_domain)rb   rm   hosts      rW   r   zDomain.match9  s5     ""499-  &&s   >A r  c                 <    |j                         | j                  k(  S r^   )r   r  rb   r  s     rW   r  zDomain.match_domain?  s    zz|t||++rV   c                     d| j                   iS )NrM   r  re   s    rW   rx   zDomain.get_infoB  s    $,,''rV   )rQ   rR   rS   r7  r9  r  rT   rc   r   rh   r  r(   r   r   r  rE   rx   r   r   s   @rW   r  r    s    bjj56G/s /t / 3  , , , '7 't ', , ,() (rV   r  c                   r     e Zd Z ej                  d      Zdeddf fdZedefd       Z	dede
fdZ xZS )	
MaskDomainz(?!-)[a-z\d\*-]{1,63}(?<!-)rM   r\   Nc                     t         |   |       | j                  j                  dd      j                  dd      }t	        j
                  |      | _        y )Nr:   z\.*z.*)r   rc   r  rt  r7  r9  _mask)rb   rM   maskr   s      rW   rc   zMaskDomain.__init__I  sC     ||##C/77TBZZ%
rV   c                 .    | j                   j                  S r^   )r  rH   re   s    rW   rh   zMaskDomain.canonicalN  s    zz!!!rV   r  c                 <    | j                   j                  |      d uS r^   )r  r0  r  s     rW   r  zMaskDomain.match_domainR  s    zz##D)55rV   )rQ   rR   rS   r7  r9  r  rT   rc   r   rh   r   r  r   r   s   @rW   r  r  F  sU    bjj78G&s &t &
 "3 " "6 6 6rV   r  c                   ^    e Zd ZdeddddfdZedefd       ZdefdZ	d	e
defd
ZdefdZy)MatchedSubAppResourcerO   rL   r6   r\   Nc                 X    t         j                  |        d| _        || _        || _        y )Nr   )r.   rc   rT  r  _rule)rb   rO   rL   s      rW   rc   zMatchedSubAppResource.__init__W  s%    !!$'	
rV   c                 .    | j                   j                  S r^   )r   rh   re   s    rW   rh   zMatchedSubAppResource.canonical]  s    zz###rV   c                 4    | j                   | j                  dS )N)rL   rO   )r  r   re   s    rW   rx   zMatchedSubAppResource.get_infoa  s    yy$**55rV   rm   c                   K   | j                   j                  |       d {   sd t               fS | j                  j                  j                  |       d {   }|j                  | j                         t        |j                  t              r|j                  j                  }||fS t               }||fS 7 7 cwr^   )r   r   r   r  r  rp   r   r   rP   r%   r  r  s       rW   rp   zMatchedSubAppResource.resolved  s     ZZ%%g...;99++33G<<
499%j//1EF //??G 7"" eG7"" /<s"   C B<8C B>A"C >C c                 "    d| j                   dS )Nz<MatchedSubAppResource -> r   )r  re   s    rW   r   zMatchedSubAppResource.__repr__o  s    +DII=::rV   )rQ   rR   rS   rN   rc   r   rT   rh   rE   rx   r(   r   rp   r   r9   rV   rW   r  r  V  sc    1  $  $3 $ $6) 6	#W 	# 	#;# ;rV   r  c                        e Zd ZdZdddedeee   z  dede	dz  ddf
 fd	Z
defd
Zededz  fd       ZdededefdZdefdZ xZS )r3   zA route with resourceNr   r   r   r   r   r\   c                ,    t         |   ||||       y )Nr   )r   rc   )rb   r   r   r   r   r   s        rW   rc   zResourceRoute.__init__v  s      	GNX 	 	
rV   c                 T    d| j                    d| j                   d| j                  S )Nz<ResourceRoute [z] r  )r   r   r   re   s    rW   r   zResourceRoute.__repr__  s)    !$++b0@T\\DTUUrV   c                 H    | j                   y | j                   j                  S r^   )r   r[   re   s    rW   r[   zResourceRoute.name  s    >>!~~"""rV   r   rj   c                 V    | j                   J  | j                   j                  |i |S )r   )r   rl   r   s      rW   rl   zResourceRoute.url_for  s.    ~~)))%t~~%%t6v66rV   c                 R    | j                   J | j                   j                         S r^   )r   rx   re   s    rW   rx   zResourceRoute.get_info  s%    ~~)))~~&&((rV   )rQ   rR   rS   __doc__rT   r    r   r   r.   r   rc   r   r   r[   r   rl   rE   rx   r   r   s   @rW   r3   r3   s  s     15



 4--

 #	

 '-

 


V# V #cDj # #
7S 7C 7C 7
)) )rV   r3   c                        e Zd Zdeddf fdZdededefdZededz  fd       Z	de
fd	Zd
edefdZedefd       Zedefd       ZdefdZ xZS )r   rP   r\   Nc                 d    t         |   t        j                  | j                         || _        y r^   )r   rc   r   r   rk  _http_exceptionr   s     rW   rc   zSystemRoute.__init__  s"    5-rV   r   rj   c                     t        d      )Nz).url_for() is not allowed for SystemRouter  r   s      rW   rl   zSystemRoute.url_for  s    FGGrV   c                      y r^   r9   re   s    rW   r[   zSystemRoute.name  r   rV   c                     d| j                   iS )NrP   r  re   s    rW   rx   zSystemRoute.get_info  s     $"6"677rV   rm   c                 "   K   | j                   wr^   r  ro   s     rW   rk  zSystemRoute._handle  s     """s   c                 .    | j                   j                  S r^   )r  r   re   s    rW   r   zSystemRoute.status      ##***rV   c                 .    | j                   j                  S r^   )r  r   re   s    rW   r   zSystemRoute.reason  r  rV   c                 <    d| j                    d| j                   dS )Nz<SystemRoute r   r   )r   r   re   s    rW   r   zSystemRoute.__repr__  s    t{{m2dkk]!<<rV   )rQ   rR   rS   r"   rc   rT   r   rl   r   r[   rE   rx   r(   r*   rk  r  r   r   r   r   r   s   @rW   r   r     s    .} . .HS HC HC H cDj  8) 8#W # # + + + + + +=# =rV   r   c                   <    e Zd ZdefdZdeddef   fdZdefdZy)r5   r\   c                 B  K   | j                   j                  t        j                  vr| j	                          t        | | j                   j                  j                         d       }|| j	                           |        d {   }t        |t              sJ |S 7 wr^   )	rm   r   r   METH_ALL_raise_allowed_methodsgetattrr   r   r*   )rb   r   rets      rW   _iterz
View._iter  s}     <<dmm3'')t||2288:DA>'')Hn#~...
 s   BBBBNc                 >    | j                         j                         S r^   )r  	__await__re   s    rW   r   zView.__await__  s    zz|%%''rV   c                     t         j                  D ch c]  }t        | |j                               s|! }}t	        | j
                  j                  |      c c}w r^   )r   r  hasattrr   r%   rm   r   )rb   r  r  s      rW   r  zView._raise_allowed_methods  sE    &*mmPwtQWWY7O1PP"4<<#6#6HH Qs
   AA)	rQ   rR   rS   r*   r  r   r   r   r  r9   rV   rW   r5   r5     s4    	^ 	(9T4%?@ (I IrV   r5   c                   P    e Zd Zdee   ddfdZdefdZdee   fdZ	de
defdZy)	ResourcesViewr  r\   Nc                     || _         y r^   
_resources)rb   r  s     rW   rc   zResourcesView.__init__  s	    #rV   c                 ,    t        | j                        S r^   )r  r'  re   s    rW   r	  zResourcesView.__len__  s    4??##rV   c              #   8   K   | j                   E d {    y 7 wr^   r&  re   s    rW   r  zResourcesView.__iter__  s     ??""   r   c                     || j                   v S r^   r&  rb   r   s     rW   __contains__zResourcesView.__contains__  s    4??**rV   )rQ   rR   rS   listr.   rc   r  r	  r   r  objectr   r-  r9   rV   rW   r$  r$    sL    $$'7"8 $T $$ $#(#34 #+V + +rV   r$  c                   L    e Zd Zdee   fdZdefdZdee	   fdZ
dedefdZy)	
RoutesViewr  c                 d    g | _         |D ]$  }|D ]  }| j                   j                  |        & y r^   )r   r  )rb   r  r   r   s       rW   rc   zRoutesView.__init__  s9    ,.! 	+H! +##E*+	+rV   r\   c                 ,    t        | j                        S r^   r  re   s    rW   r	  zRoutesView.__len__  r
  rV   c              #   8   K   | j                   E d {    y 7 wr^   r   re   s    rW   r  zRoutesView.__iter__  s     <<r*  r   c                     || j                   v S r^   r5  r   s     rW   r-  zRoutesView.__contains__  s    $$rV   N)rQ   rR   rS   r.  r.   rc   r  r	  r   r2   r  r/  r   r-  r9   rV   rW   r1  r1    sD    +$'7"8 +! ! (=1  %& %T %rV   r1  c                       e Zd Z ej                  d      Zd3 fdZdedefdZ	de
e   fdZdefdZd	edefd
ZdedefdZdefdZdefdZdeeef   fdZd	eddfdZd	edefdZd	eddfdZd	eddfdZdddededz  defdZddddedede e!e"   z  dedz  de#dz  de$fdZ%dde&dddddede'dedz  de#dz  ded ed!ed"edefd#Z(dede d$e)de$fd%Z*dede d$e)de$fd&Z+dd'd(dede dedz  d)ed$e)de$fd*Z,dede d$e)de$fd+Z-dede d$e)de$fd,Z.dede d$e)de$fd-Z/dede d$e)de$fd.Z0dede!e"   d$e)de$fd/Z1d3 fd0Z2d1e3e4   de5e$   fd2Z6 xZ7S )4r,   z[.:-]r\   Nc                 Z    t         |           g | _        i | _        i | _        g | _        y r^   )r   rc   r'  _named_resources_resource_index_matched_sub_app_resourcesr   s    rW   rc   zUrlDispatcher.__init__  s-    24=?BDGI'rV   rm   c                   K   | j                   }t               }| j                  D ])  }|j                  |       d {   \  }}||c S ||z  }+ |j                  j
                  }|r_|j                  |d      D ])  }|j                  |       d {   \  }}||c S ||z  }+ |dk(  rn|j                  d      d   xs d}|r_|rt        t        |j                  |            S t        t                     S 7 7 kw)Nr9   r?   r   )r:  r   r;  rp   r  r  r   
rpartitionr   r%   r   r&   )	rb   rm   resource_indexr  r   r   allowedurl_part	candidates	            rW   rp   zUrlDispatcher.resolve  s    --$'E 77 	+H(0(8(8(A"AJ%!!7*	+ ??,,+//"= /	,5,=,=g,F&F#
G)%%#w.O/ 3**3/29cH  !"6w~~"WXXln--5 #B 'Gs(   :D C<AD C>4D 5D >D c                 ,    t        | j                        S r^   )r  r9  re   s    rW   r  zUrlDispatcher.__iter__  s    D))**rV   c                 ,    t        | j                        S r^   )r  r9  re   s    rW   r	  zUrlDispatcher.__len__  s    4(())rV   r   c                     || j                   v S r^   r9  r,  s     rW   r-  zUrlDispatcher.__contains__   s    40000rV   r[   c                      | j                   |   S r^   rE  ra   s     rW   __getitem__zUrlDispatcher.__getitem__#  s    $$T**rV   c                 ,    t        | j                        S r^   )r$  r'  re   s    rW   r  zUrlDispatcher.resources&  s    T__--rV   c                 ,    t        | j                        S r^   )r1  r'  re   s    rW   rK   zUrlDispatcher.routes)  s    $//**rV   c                 ,    t        | j                        S r^   )r   r9  re   s    rW   named_resourceszUrlDispatcher.named_resources,  s     5 566rV   c                 r   t        |t              s
J d|       | j                  rt        d      |j                  }|| j
                  j                  |      }|D ]E  }t        j                  |      rt        d|d      |j                         r8t        d|d       || j                  v rt        d|d| j                  |         || j                  |<   | j                  j                  |       t        |t              r| j                  j                  |       y | j!                  |       y )Nz4Instance of AbstractResource class is required, got z.Cannot register a resource into frozen router.zIncorrect route name z/, python keywords cannot be used for route namezV, the name should be a sequence of python identifiers separated by dash, dot or columnz
Duplicate z, already handled by )r   r.   frozenr   r[   NAME_SPLIT_REr.  keyword	iskeywordr   isidentifierr9  r'  r  r  r;  r  )rb   r   r[   rI  r=  s        rW   register_resourcezUrlDispatcher.register_resource/  s]   &
 	OA(N	O 
 ;;OPP}}&&,,T2E $$T*$/x 8) ) 
 ((*$/x 81 1  t,,,   )**.*?*?*E)HJ  +3D!!$'x(h 56++228<)rV   c                     d|j                   x}v r&|j                  d      d   j                  d      d   }|j                  d      xs dS )z9Return a key to index the resource in the resource index.r+  r   r?   )rh   	partitionr=  r  )rb   r   	index_keys      rW   _get_resource_index_keyz%UrlDispatcher._get_resource_index_keyV  sR     2 2293 "++C03>>sCAFI$++rV   c                 |    | j                  |      }| j                  j                  |g       j                  |       y)z%Add a resource to the resource index.N)rV  r:  
setdefaultr  rb   r   resource_keys      rW   r  zUrlDispatcher.index_resourcea  s5    33H= 	''b9@@JrV   c                 b    | j                  |      }| j                  |   j                  |       y)z*Remove a resource from the resource index.N)rV  r:  removerY  s      rW   r  zUrlDispatcher.unindex_resourcei  s+    33H=\*11(;rV   rZ   rF   c                   |r|j                  d      st        d      | j                  r?| j                  d   }|j                  |k(  r!|j	                  |      rt        t        |      S d|v s9d|v s5t        j                  |      s t        ||      }| j                  |       |S t        ||      }| j                  |       |S )Nr?   z)path should be started with / or be emptyr+  r,  rZ   )r  r   r'  r[   r}   r   r/   r>   searchr0   rR  r1   )rb   rF   r[   r   s       rW   add_resourcezUrlDispatcher.add_resourcen  s    ,HII??r*H}}$););D)AHh//tsd{hood.C$T5H""8,O"4d3x(rV   )r[   r   r   r   r   c                P    | j                  ||      }|j                  |||      S )NrZ   r   )r`  r   )rb   r   rF   r   r[   r   r   s          rW   r   zUrlDispatcher.add_route~  s1     $$T$5!!&'.!QQrV   FrZ  rJ   r[  r\  r]  r^  c          
          |j                  d      sJ |j                  d      r|dd }t        ||||||||      }	| j                  |	       |	S )z^Add static files view.

        prefix - url prefix
        path - folder with files

        r?   Nr^  rZ  )r  r  r4   rR  )
rb   rJ   rF   r[   r   r[  r\  r]  r^  r   s
             rW   
add_staticzUrlDispatcher.add_static  sf    $   %%%??3CR[F!)!!+)	
 	x(rV   rj   c                 H     | j                   t        j                  ||fi |S )z(Shortcut for add_route with method HEAD.)r   r   	METH_HEADrb   rF   r   rj   s       rW   add_headzUrlDispatcher.add_head       t~~dnndGFvFFrV   c                 H     | j                   t        j                  ||fi |S )z+Shortcut for add_route with method OPTIONS.)r   r   METH_OPTIONSrf  s       rW   add_optionszUrlDispatcher.add_options  s"    t~~d//wI&IIrV   T)r[   
allow_headrl  c                    | j                  ||      }|r" |j                  t        j                  |fi |  |j                  t        j                  |fi |S )zShortcut for add_route with method GET.

        If allow_head is true, another
        route is added allowing head requests to the same endpoint.
        rZ   )r`  r   r   re  METH_GET)rb   rF   r   r[   rl  rj   r   s          rW   add_getzUrlDispatcher.add_get  sU     $$T$5Ht~~wA&A!x!!$--CFCCrV   c                 H     | j                   t        j                  ||fi |S )z(Shortcut for add_route with method POST.)r   r   	METH_POSTrf  s       rW   add_postzUrlDispatcher.add_post  rh  rV   c                 H     | j                   t        j                  ||fi |S )z'Shortcut for add_route with method PUT.)r   r   METH_PUTrf  s       rW   add_putzUrlDispatcher.add_put  s     t~~dmmT7EfEErV   c                 H     | j                   t        j                  ||fi |S )z)Shortcut for add_route with method PATCH.)r   r   
METH_PATCHrf  s       rW   	add_patchzUrlDispatcher.add_patch  s     t~~dootWGGGrV   c                 H     | j                   t        j                  ||fi |S )z*Shortcut for add_route with method DELETE.)r   r   METH_DELETErf  s       rW   
add_deletezUrlDispatcher.add_delete  s"    t~~d..gHHHrV   c                 H     | j                   t        j                  ||fi |S )z?Shortcut for add_route with ANY methods for a class-based view.)r   r   r   rf  s       rW   add_viewzUrlDispatcher.add_view  s"     t~~dmmT7EfEErV   c                 d    t         |           | j                  D ]  }|j                           y r^   )r   rz   r'  )rb   r   r   s     rW   rz   zUrlDispatcher.freeze  s*     	HOO	rV   rK   c                 X    g }|D ]"  }|j                  |j                  |              $ |S )zAppend routes to route table.

        Parameter should be a sequence of RouteDef objects.

        Returns a list of registered AbstractRoute instances.
        )extendregister)rb   rK   registered_routes	route_defs       rW   
add_routeszUrlDispatcher.add_routes  s8      	?I$$Y%7%7%=>	?  rV   r~   )8rQ   rR   rS   r7  r9  rN  rc   r(   r-   rp   r   rT   r  r  r	  r/  r   r-  r.   rG  r$  r  r1  rK   r	   rK  rR  rV  r  r  r/   r`  r    r   r   r   r2   r   r   r!   rc  r   rg  rk  ro  rr  ru  rx  r{  r}  rz   r   r+   r.  r  r   r   s   @rW   r,   r,     s|   BJJx(MJ'.W '.1D '.R+(3- +* *1V 1 1+ +(8 +.= .+
 +7.>)>!? 7%**: %*t %*N	,0@ 	,S 	,K'7 KD K<)9 <d <
 =A  sTz X ,  04
R
R 
R 4--	
R Dj
R '-
R 

R"  04,  %$    
 Dj  '-          
 DGS G7 Gc Gm GJ Jg J J J  DD D
 DjD D D 
D&GS G7 Gc Gm GFC F' FS F] FHc HG Hs H} HIs IW I I IFF"&|"4F@CF	F

!*:!; 
!]@S 
!rV   r,   rF  c                 z    t         dk  r| j                  dd      } t        j                  | d      j                  S )Nrn  rp  rq  Fr!  )r<   rt  r   r#  raw_pathrF  s    rW   rL  rL    s1    fc5)99%/888rV   c                 R    d| vr| S | j                  dd      j                  dd      S )Nrp  z%2Fr?   rq  )rt  r  s    rW   rD  rD    s-    
%==$,,UC88rV   c                 H    t        |       }d| v r|j                  dd      }|S )Nrp  rq  )rL  rt  )rF  r   s     rW   r6  r6    s*     F
e|s+MrV   )zr   r   r  	functoolsr  r  r   rO  rv  platformr7  r   r   collections.abcr   r   r   r   r   r   r	   r
   r   pathlibr   r   typesr   typingr   r   r   r   r   r   r   yarlr   r   yarl_versionr   r   r   r   r   helpersr   r   httpr   typedefsr    r!   web_exceptionsr"   r#   r$   r%   r&   web_fileresponser'   web_requestr(   web_responser)   r*   web_routedefr+   __all__web_appr6   r   rT   BaseDictr   r   r  r   mapr  r.  r<   rU   r9  r=   r>   r8  r@   systemrB   r   r   r   r   partialr  rE   r.   ABCr2   r-   r   r   r/   r0   r1   rR  r4   r  rN   r  r  r  r3   r   r5   r$  r1  r,   rL  rD  r6  r9   rV   rW   <module>r     se   
        	  	 
 	 	 	    " Q Q Q 1  @ @ .  '  +   2 * $CH~HH,/,<,<w,F,B ',S6Hl6H6H6Mbq6Q-R'SeE#s(O$ S&0bjj+'gcl#  !+

1!%
  !ryy~%* %)(//+y8
E$K 87)Y~/D%EEF/0#c(:;i48"	 "&,/uh7 ,/^R3CGG R3j<B($5 <B~V( V L7 Lt L 1+ 1+l%6H %6PG=h G=T% 2OP^ OPd)K^ )KX377 %(! %(P6 6 ;2 ;:)M )D=- =<I< I(+E8$45yAQ7R +%/=1I %"F!NGC1A,A$B F!R9s 9s 99c 9c 9  rV   