
    h                     X   S SK r S SKrS SKrS SKJrJr  S SKJr  S SKJ	r	J
r
  S SKJr  S SKJrJrJrJrJrJrJr  S SKJrJr  S SKrS SKJrJr  S S	KJr  S
SKJ r J!r!J"r"J#r#J$r$J%r%J&r&  S
SK'J(r(J)r)  S
SK*J+r+J,r,J-r-J.r.J/r/J0r0  S
SK1J2r2J3r3J4r4J5r5J6r6J7r7J8r8J9r9J:r:J;r;J<r<J=r=J>r>  SSSSSS.r?\@" \5      rA\@" S5      rB\ R                  " S\ R                  5      rE\" S5      rF\R                  S:  a  S SKJHrH  O\rH " S S\5      rI\IR                  rK " S S\5      rL " S S\SS9rMS\FS \F4S! jrN\
S"\OS S#4S$ j5       rP\
S"\OS S#4S% j5       rQ\
S&\OS'\OS(\\OS4   S)\\OS4   S*\OS+\\RS4   S,\OS-\OS.\OS S#4S/ j5       rSS&\OS0\OS,\OS1\OS.\OS S#4S2 jrT\
" \T5      rU\N " S3 S#5      5       rVS4rWS5rX\
" \W5      S6\OS \O4S7 j5       qY\
" \W5      S*\OS \O4S8 j5       qZ\
" \X5      S*\OS9\[S \O4S: j5       q\\NSDS; j5       r]\NS \L4S< j5       r^\N\W\W\K\K\KS=.S>\\RS4   S?\\RS4   S@\\RS\I4   SA\\RS\I4   SB\\RS\I4   S S4SC jj5       r_g)E    N)MappingSequence)Enum)
_CacheInfo	lru_cache)
ip_address)TYPE_CHECKINGAnyNoReturn	TypedDictTypeVarUnionoverload)SplitResultuses_relative)	MultiDictMultiDictProxy)under_cached_property   )USES_AUTHORITYSplitURLTypemake_netlocquery_to_pairssplit_netloc	split_urlunsplit_result)normalize_pathnormalize_path_segments)QueryQueryVariableSimpleQueryget_str_queryget_str_query_from_iterable$get_str_query_from_sequence_iterable)FRAGMENT_QUOTERFRAGMENT_REQUOTERPATH_QUOTERPATH_REQUOTERPATH_SAFE_UNQUOTERPATH_UNQUOTERQS_UNQUOTERQUERY_QUOTERQUERY_REQUOTERQUOTERREQUOTERUNQUOTERhuman_quoteP   i     )httphttpswswssftpa<  
        # any character not in the unreserved or sub-delims sets, plus %
        # (validated with the additional check for pct-encoded sequences below)
        [^a-z0-9\-._~!$&'()*+,;=%]
    |
        # % only allowed if it is part of a pct-encoded
        # sequence of 2 hex digits.
        %(?![0-9a-f]{2})
    _T)      )Selfc                       \ rS rSrSrSrSrg)UndefinedTypeQ   z4Singleton type for use with not set sentinel values.r    N)__name__
__module____qualname____firstlineno____doc__
_singleton__static_attributes__r@       ;/var/www/html/env/lib/python3.13/site-packages/yarl/_url.pyr>   r>   Q   s
    >JrH   r>   c                   L    \ rS rSr% Sr\\S'   \\S'   \\S'   \\S'   \\S'   Srg	)
	CacheInfoZ   zHost encoding cache.idna_encodeidna_decoder   host_validateencode_hostr@   N)rA   rB   rC   rD   rE   r   __annotations__rG   r@   rH   rI   rK   rK   Z   s#    rH   rK   c                      \ rS rSr% \\S'   S\S'   \\S'   \\S'   \\S'   \\S'   \\S	'   \	\S
4   \S'   \	\S
4   \S'   \	\S
4   \S'   \	\S
4   \S'   \	\S
4   \S'   \	\S
4   \S'   \	\S
4   \S'   \	\S
4   \S'   \	\S
4   \S'   \	\S
4   \S'   \\S'   \\S'   \
\\\4      \S'   S\S'   \\S'   \\S'   \\S'   \\S'   \\S'   \\S'   \\S 4   \S!'   \\S 4   \S"'   S\S#'   \\S$'   \\S%'   \\S&'   \\S''   \\S 4   \S('   \\S 4   \S)'   S*rg
)+_InternalURLCached   _valURL_originabsolutehashschemeraw_authority	authorityNraw_useruserraw_passwordpasswordraw_hosthosthost_subcomponenthost_port_subcomponentportexplicit_portraw_pathpath_parsed_queryMultiDictProxy[str]queryraw_query_stringquery_stringpath_qsraw_path_qsraw_fragmentfragment.	raw_partspartsparentraw_namename
raw_suffixsuffixraw_suffixessuffixesr@   )rA   rB   rC   rD   r   rQ   boolintstrr   listtuplerG   r@   rH   rI   rS   rS   d   sS   
NN
IKNCI
T	
T	""CICI
T	
S$Y''!#t),,
T	
d##M
Ic3h((  LMS#Xc?MM
IOKS/!CHorH   rS   F)totalobjreturnc                     SU l         U $ )Nyarl)rB   )r   s    rI   rewrite_moduler      s    CNJrH   url_strrV   c                    0 n[        U 5      u  p#pEnU(       d  SnOSU;   d  SU;   d  SU;   a  [        U5      u  ppzOS=n=pUnUc  U[        ;   a  SU S3n[        U5      eSn[	        USS	9nSU;   a  US
S OUUS'   XS'   U	c  Uc  U
c  UOU SU
 3nSUS'   SUS'   O<U(       a  [        U5      OUnU	(       a  [        U	5      OU	n[        XXz5      nXS'   XS'   U(       a#  [        U5      nU(       a  SU;   a  [        U5      nU(       a  [        U5      nU(       a  [        U5      nX!S'   U(       d	  U(       a  SOUUS'   XQS'   XaS'   [        R                  [        5      nX.l        X>l        XNl        X^l        Xnl        Xl        U$ )zParse unencoded URL. :@[Nz9Invalid URL: host is required for absolute urls with the  schemeFvalidate_hostr   ra   rf   r]   r_   .rZ   /rg   rl   rp   )r   r   SCHEME_REQUIRES_HOST
ValueError_encode_hostr/   r   r(   r   r-   r&   object__new__rV   _scheme_netloc_path_query	_fragment_cache)r   cacherZ   netlocrh   rk   rq   rb   usernamer`   re   msgr]   r_   selfs                  rI   
encode_urlr      s     "E,5g,>)FD&=C6MSF]-9&-A*Hd)--H-xD<--..4XW>  !o%D6*-+D2J4j!%o 0!\T$q/?F $E*$(E.!-5x)8H198H-xL DF (*$0.!T"cTk!$'Du%$X.(O#'FE* %
$.>>#DLLJKNKKrH   c                     [         R                  [        5      n[        U 5      nUu  Ul        Ul        Ul        Ul        Ul        0 Ul	        U$ )zParse pre-encoded URL.)
r   r   rV   r   r   r   r   r   r   r   )r   r   vals      rI   pre_encoded_urlr      sB     >>#D
G
CJMGDL$,
DKDKKrH   rZ   r\   r^   r`   rb   re   rh   rm   rq   c	                 B   [         R                  [        5      n	X	l        U(       a  Xl        OXU(       aJ  Ub  U[
        R                  U 5      :X  a  SOUnUc  Uc  Uc  UOU SU 3U	l        O[        X#XE5      U	l        OSU	l        Xil        Xyl	        Xl
        0 U	l        U	$ )z#Build a pre-encoded URL from parts.Nr   r   )r   r   rV   r   r   DEFAULT_PORTSgetr   r   r   r   r   )
rZ   r\   r^   r`   rb   re   rh   rm   rq   r   s
             rI   build_pre_encoded_urlr      s     >>#DL 	=#4#4V#<<4$D<H,#'<4vQtf5EDL&ttBDLJKNDKKrH   r   rk   c                     [         R                  [        5      nXl        Xl        X%l        X5l        XEl        0 Ul        U$ )zCreate a new URL from parts.)	r   r   rV   r   r   r   r   r   r   )rZ   r   rh   rk   rq   r   s         rI   from_parts_uncachedr      s7     >>#DLLJKNDKKrH   c                      \ rS rSr% Sr\\S'   \\S'   \\S'   \\S'   \\S'   \\S'   \4S	S
S.S\	\\
S \4   S\S\	\S
4   SS 4S jjjr\SSS
S
SS
SS
SSS	S.S\S\S\	\S
4   S\	\S
4   S\S\	\S
4   S\S\	\S
4   S\S\S\SS 4S jj5       rS\4S jrS\4S jrS\4S  jrS\4S! jrS"\S\4S# jrS\4S$ jrS"\S\4S% jrS"\S\4S& jrS"\S\4S' jrS"\S\4S( jrS)\SS 4S* jrS\SS 4S+ jr S\4S, jr!S\"\
   4S- jr#S.\	\"\$   \"S
\4   4   SS
4S/ jr%S}S0 jr&S\4S1 jr'S\4S2 jr(S~S3 jr)\*S\$4S4 j5       r+\*S~S5 j5       r,S~S6 jr-\*S\4S7 j5       r.\*S\4S8 j5       r/\*S\4S9 j5       r0\*S\4S: j5       r1\*S\	\S
4   4S; j5       r2\*S\	\S
4   4S< j5       r3\*S\	\S
4   4S= j5       r4\*S\	\S
4   4S> j5       r5\*S\	\S
4   4S? j5       r6\*S\	\S
4   4S@ j5       r7\*S\	\S
4   4SA j5       r8\*S\	\S
4   4SB j5       r9\*S\	\S
4   4SC j5       r:\*S\	\S
4   4SD j5       r;\*S\4SE j5       r<\*S\4SF j5       r=\*S\4SG j5       r>\*S\?\"\\4      4SH j5       r@\*SSI j5       rA\*S\4SJ j5       rB\*S\4SK j5       rC\*S\4SL j5       rD\*S\4SM j5       rE\*S\4SN j5       rF\*S\4SO j5       rG\*S\"\SP4   4SQ j5       rH\*S\"\SP4   4SR j5       rI\*S~SS j5       rJ\*S\4ST j5       rK\*S\4SU j5       rL\*S\4SV j5       rM\*S\4SW j5       rN\*S\"\SP4   4SX j5       rO\*S\"\SP4   4SY j5       rPSSZS[S\SS 4S\ jjrQS\SS 4S] jrRS\	\S
4   SS 4S^ jrSS\	\S
4   SS 4S_ jrTS\SS 4S` jrUS\	\S
4   SS 4Sa jrVS	S	S	Sb.S\S\Sc\Sd\SS 4
Se jjrW\XS\SS 4Sf j5       rY\XSg\ZSS 4Sh j5       rYSi\[Sg\[SS 4Sj jrY\XS\SS 4Sk j5       r\\XSg\ZSS 4Sl j5       r\Si\[Sg\[SS 4Sm jr\\XS\SS 4Sn j5       r]\XSg\ZSS 4So j5       r]Si\[Sg\[SS 4Sp jr]Sq\SS 4Sr jr^S\	\S
4   SS 4Ss jr_S	S	St.S)\Sc\Sd\SS 4Su jjr`S	S	St.Sv\Sc\Sd\SS 4Sw jjraSSx jrbS	Sy.S"\S\SS 4Sz jjrcS\4S{ jrdS|reg
)rV   i  )r   r   r   r   r   r   r   r   r   r   r   r   FN)encodedstrictr   r   r   r   c                D   Ub  [         R                  " S5        [        U5      [        L a  U(       a  [	        U5      $ [        U5      $ [        U5      U L a  U$ [        U5      [        L a  U(       d  [        S5      e[        U6 $ [        U[        5      (       a/  U(       a  [	        [        U5      5      $ [        [        U5      5      $ U[        L aE  [        R                  [        5      nS=Ul        =Ul        =Ul        =Ul        Ul        0 Ul        U$ [)        S5      e)Nzstrict parameter is ignoredz$Cannot apply decoding to SplitResultr   z#Constructor parameter should be str)warningswarntyper}   r   r   r   r   
from_parts
isinstance	UNDEFINEDr   r   rV   r   r   r   r   r   r   	TypeError)clsr   r   r   r   s        rI   r   URL.__new__\  s     MM789+2?3'G
3G9J9# !GHHs##c307?3s8,QZC=QQ) >>#&DVXXDLX4<X$*Xt{T^DKK=>>rH   r   )rZ   r\   r^   r`   rb   re   rh   rk   rm   rq   r   rZ   r\   r^   r`   rb   re   rh   rk   rm   rq   c                \   U(       a'  U(       d  U(       d  U(       d  U(       a  [        S5      eUb.  [        U[        5      (       d  [        S[	        U5      < S35      eU(       a  U(       d  [        S5      eU(       a  U	(       a  [        S5      eUb  Ub  Ub	  Ub  U	b  U
c  [        S5      eU(       a  [        U5      =(       d    Sn	U(       a  [        UUUUUUUU	U
5	      $ [        R                  [        5      nXl
        SnU(       a"  [        U5      u  p4pU(       a
  [        US	S
9OSnOU(       a  [        USS
9nOSUl        UbJ  Ub  U[        R                  U5      :X  a  SOUnUc  Uc  Uc  UOU SU 3Ul        O[!        X4XS5      Ul        U(       a  [#        U5      OUnU(       a8  UR                  (       a'  SU;   a  [%        U5      nUS   S:w  a  Sn[        U5      eX|l        U(       d  U	(       a  [)        U	5      n	Xl        U
(       a  [-        U
5      OU
Ul        0 Ul        U$ )zCreates and returns a new URLz@Can't mix "authority" with "user", "password", "host" or "port".Nz$The port is required to be int, got r   z/Can't build URL with "port" but without "host".z6Only one of "query" or "query_string" should be passedz}NoneType is illegal for "scheme", "authority", "host", "path", "query_string", and "fragment" args, use empty string instead.r   Fr   Tr   r   r   zCPath in a URL with authority should start with a slash ('/') if set)r   r   r|   r   r   r"   r   r   r   rV   r   r   r   r   r   r   r   r'   r   r   r,   r   r%   r   r   )r   rZ   r\   r^   r`   rb   re   rh   rk   rm   rq   r   r   _hostr   s                  rI   build	URL.buildy  s	   $ $(ddS  JtS$9$9B4:.PQRSSOPP\UVVN ||#Q 
 (/52L(
 
 ~~c""&*6y*A'DE@ELe<2E T:EDL#}'8'8'@@td| 0(,uUG1TF:K*45M$({4 dDLLd{%d+Aw#~6  !o%
'5L"6>2HrH   c                 "    [        SU < S35      e)NzInheriting a class z from URL is forbidden)r   )r   s    rI   __init_subclass__URL.__init_subclass__  s    -cW4JKLLrH   c                    U R                   (       d6  U R                  (       a%  U R                  (       d  U R                  (       a  SnOU R                   nU R                  =nbR  U[
        R                  U R                  5      :X  a/  U R                  n[        U R                  U R                  US 5      nOU R                  n[        U R                  XAU R                  U R                  5      $ Nr   )r   r   r   r   rf   r   r   r   rc   r   r]   r_   r   )r   rh   re   rb   r   s        rI   __str__URL.__str__  s    zzdllt~~D::D&&&D3@Q@QLLA
 9

 ))D 0A0A4NF\\FdllF$++t~~VVrH   c                 L    U R                   R                   S[        U 5       S3$ )Nz('z'))	__class__rA   r}   r   s    rI   __repr__URL.__repr__  s$    ..))*"SYKr::rH   c                 6    [        U 5      R                  S5      $ )Nascii)r}   encoder   s    rI   	__bytes__URL.__bytes__  s    4y((rH   otherc                    [        U5      [        La  [        $ U R                  (       d  U R                  (       a  SOU R                  nUR                  (       d  UR                  (       a  SOUR                  nU R
                  UR
                  :H  =(       ad    U R                  UR                  :H  =(       aD    X#:H  =(       a9    U R                  UR                  :H  =(       a    U R                  UR                  :H  $ r   )r   rV   NotImplementedr   r   r   r   r   )r   r   path1path2s       rI   __eq__
URL.__eq__  s    ;c!!!::$,,DJJ ;;5==ekkLLEMM) 2-22 u||+2 %//1	
rH   c                 ,   U R                   R                  S5      =ncu  U R                  (       d  U R                  (       a  SOU R                  n[	        U R
                  U R                  X R                  U R                  45      =oR                   S'   U$ )NrY   r   )r   r   r   r   rY   r   r   r   )r   retrh   s      rI   __hash__URL.__hash__  sl    ;;??6**C3"jjT\\3tzzD(,t||T;;O) C++f% 
rH   c                 d    [        U5      [        La  [        $ U R                  UR                  :*  $ Nr   rV   r   rU   r   r   s     rI   __le__
URL.__le__  '    ;c!!!yyEJJ&&rH   c                 d    [        U5      [        La  [        $ U R                  UR                  :  $ r   r   r   s     rI   __lt__
URL.__lt__  '    ;c!!!yy5::%%rH   c                 d    [        U5      [        La  [        $ U R                  UR                  :  $ r   r   r   s     rI   __ge__
URL.__ge__  r   rH   c                 d    [        U5      [        La  [        $ U R                  UR                  :  $ r   r   r   s     rI   __gt__
URL.__gt__  r   rH   rv   c                 n    [        U[        5      (       d  [        $ U R                  [        U5      45      $ r   )r   r}   r   _make_childr   rv   s     rI   __truediv__URL.__truediv__  s,    $$$!!T--rH   c                 $    U R                  U5      $ r   )update_queryr   rk   s     rI   __mod__URL.__mod__   s      ''rH   c                     [        U R                  =(       d2    U R                  =(       d    U R                  =(       d    U R                  5      $ r   )r{   r   r   r   r   r   s    rI   __bool__URL.__bool__#  s,    DLLODJJO$++OPPrH   c                 L    [         R                  [        U R                  5      4$ r   )r   r   r   rU   r   s    rI   __getstate__URL.__getstate__&  s    k499577rH   statec                     US   c!  [        US   [        5      (       a	  US   S   nOUtp#Uu  U l        U l        U l        U l        U l        0 U l        g )Nr   r   rU   )r   dictr   r   r   r   r   r   )r   r   r   unuseds       rI   __setstate__URL.__setstate__)  sV     8
58T : :(6"C !LCNQKdlDJT^rH   c                 l    U R                   n[        U R                  5      nUu  US'   US'   US'   US'   g)z"Cache the netloc parts of the URL.r]   r_   ra   rf   N)r   r   r   )r   c	split_locs      rI   _cache_netlocURL._cache_netloc5  s9    KK .	NWK*q(!J-?9KrH   c                     U R                   $ )zA check for absolute URLs.

Return True for absolute ones (having scheme or starting
with //), False otherwise.

Is is preferred to call the .absolute property instead
as it is cached.
)rX   r   s    rI   is_absoluteURL.is_absolute;  s     }}rH   c                     U R                   =nc  U R                  S:g  $ U[        R                  U R                  5      :H  $ )zA check for default port.

Return True if port is default for specified scheme,
e.g. 'http://python.org' or 'http://python.org:80', False
otherwise.

Return False for relative URLs.

r   )rf   r   r   r   r   )r   explicits     rI   is_default_portURL.is_default_portF  s@     ***H3 <<2%%=,,T\\:::rH   c                     U R                   $ )zmReturn an URL with scheme, host and port parts only.

user, password, path, query and fragment are removed.

)rW   r   s    rI   origin
URL.originW       ||rH   c                 t    U R                   U R                  U R                  U R                  U R                  4$ r   )r   r   r   r   r   r   s    rI   rU   URL._val`  s'    dllDJJT^^TTrH   c                 T   U R                   =n(       d  [        S5      eU R                  =n(       d  [        S5      eSU;   a$  U R                  n[	        SSX0R
                  5      nO5U R                  (       d$  U R                  (       d  U R                  (       d  U $ [        X!SSS5      $ )zlReturn an URL with scheme, host and port parts only.

user, password, path, query and fragment are removed.
URL should be absolutezURL should have schemer   Nr   )
r   r   r   rc   r   rf   r   r   r   r   )r   r   rZ   encoded_hosts       rI   rW   URL._origind  s     ,,&&566,,&&566&=11L t\;M;MNFDKKK&"b"55rH   c                     U R                   (       d  [        S5      e[        SSU R                  U R                  U R
                  5      $ )zXReturn a relative part of the URL.

scheme, user, password, host and port are removed.

r  r   )r   r   r   r   r   r   r   s    rI   relativeURL.relativeu  s6     ||566"b$**dkk4>>JJrH   c                      U R                   S:g  $ )zqA check for absolute URLs.

Return True for absolute ones (having scheme or starting
with //), False otherwise.

r   r   r   s    rI   rX   URL.absolute  s     ||r!!rH   c                     U R                   $ )zTScheme for absolute URLs.

Empty string for relative URLs or URLs starting with //

)r   r   s    rI   rZ   
URL.scheme  r  rH   c                     U R                   $ )zAEncoded authority part of URL.

Empty string for relative URLs.

r  r   s    rI   r[   URL.raw_authority  r  rH   c                 n    [        U R                  U R                  U R                  U R                  5      $ )zADecoded authority part of URL.

Empty string for relative URLs.

)r   r^   r`   rb   re   r   s    rI   r\   URL.authority  s%     499dmmTYY		JJrH   c                 @    U R                  5         U R                  S   $ )z5Encoded user part of URL.

None if user is missing.

r]   r  r   r   s    rI   r]   URL.raw_user  s     	{{:&&rH   c                 8    U R                   =nc  g[        U5      $ )z5Decoded user part of URL.

None if user is missing.

N)r]   r0   )r   r]   s     rI   r^   URL.user  s!     %H.!!rH   c                 @    U R                  5         U R                  S   $ )z=Encoded password part of URL.

None if password is missing.

r_   r#  r   s    rI   r_   URL.raw_password  s     	{{>**rH   c                 8    U R                   =nc  g[        U5      $ )z=Decoded password part of URL.

None if password is missing.

N)r_   r0   )r   r_   s     rI   r`   URL.password  s#     !---L6%%rH   c                 @    U R                  5         U R                  S   $ )zEncoded host part of URL.

None for relative URLs.

When working with IPv6 addresses, use the `host_subcomponent` property instead
as it will return the host subcomponent with brackets.
ra   r#  r   s    rI   ra   URL.raw_host  s     	{{:&&rH   c                     U R                   =nc  gU(       a  US   R                  5       (       d  SU;   a  U$ [        U5      $ )z4Decoded host part of URL.

None for relative URLs.

Nr   r   )ra   isdigit_idna_decoder   raws     rI   rb   URL.host  s?     == C)3r7??$$s
JC  rH   c                 >    U R                   =nc  gSU;   a  SU S3$ U$ )a  Return the host subcomponent part of URL.

None for relative URLs.

https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.2

`IP-literal = "[" ( IPv6address / IPvFuture  ) "]"`

Examples:
- `http://example.com:8080` -> `example.com`
- `http://example.com:80` -> `example.com`
- `https://127.0.0.1:8443` -> `127.0.0.1`
- `https://[::1]:8443` -> `[::1]`
- `http://[::1]` -> `[::1]`

Nr   r   ])ra   r0  s     rI   rc   URL.host_subcomponent  s/    $ == C) CZ3%qz0S0rH   c                     U R                   =nc  gUS   S:X  a  UR                  S5      nU R                  nUb#  U[        R	                  U R
                  5      :X  a  SU;   a  SU S3$ U$ SU;   a  SU SU 3$ U SU 3$ )a  Return the host and port subcomponent part of URL.

Trailing dots are removed from the host part.

This value is suitable for use in the Host header of an HTTP request.

None for relative URLs.

https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.2
`IP-literal = "[" ( IPv6address / IPvFuture  ) "]"`
https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.3
port        = *DIGIT

Examples:
- `http://example.com:8080` -> `example.com:8080`
- `http://example.com:80` -> `example.com`
- `http://example.com.:80` -> `example.com`
- `https://127.0.0.1:8443` -> `127.0.0.1:8443`
- `https://[::1]:8443` -> `[::1]:8443`
- `http://[::1]` -> `[::1]`

Nr   r   r   r   r4  z]:)ra   rstriprf   r   r   r   )r   r1  re   s      rI   rd   URL.host_port_subcomponent  s    0 == C)r7c> **S/C!!<4=#4#4T\\#BB!$Qse1:44$'3J3%r$ Cse1TFOCrH   c                 b    U R                   =nb  U$ [        R                  U R                  5      $ )zPort part of URL, with scheme-based fallback.

None for relative URLs or URLs without explicit port and
scheme without default port substitution.

)rf   r   r   r   )r   rf   s     rI   re   URL.port+  s0     "///M<    ..rH   c                 @    U R                  5         U R                  S   $ )ziPort part of URL, without scheme-based fallback.

None for relative URLs or URLs without explicit port.

rf   r#  r   s    rI   rf   URL.explicit_port7  s     	{{?++rH   c                 b    U R                   (       d  U R                  (       d  U R                   $ S$ )z>Encoded path of URL.

/ for absolute URLs without path part.

r   )r   r   r   s    rI   rg   URL.raw_pathA  s     "ZZt||tzzDDrH   c                 x    U R                   (       a  [        U R                   5      $ U R                  (       a  S$ S$ )z>Decoded path of URL.

/ for absolute URLs without path part.

r   r   )r   r*   r   r   s    rI   rh   URL.pathJ  s*     -1JJ}TZZ(W4<<CWUWWrH   c                 x    U R                   (       a  [        U R                   5      $ U R                  (       a  S$ S$ )zcDecoded path of URL.

/ for absolute URLs without path part.

/ (%2F) and % (%25) are not decoded

r   r   )r   r)   r   r   s    rI   	path_safeURL.path_safeS  s+     ::%djj11lls**rH   c                 ,    [        U R                  5      $ )zParse query part of URL.)r   r   r   s    rI   ri   URL._parsed_query`  s     dkk**rH   c                 >    [        [        U R                  5      5      $ )zyA MultiDictProxy representing parsed query parameters in decoded
representation.

Empty value if URL has no query part.

)r   r   ri   r   s    rI   rk   	URL.querye  s     i(:(:;<<rH   c                     U R                   $ )z?Encoded query part of URL.

Empty string if query is missing.

)r   r   s    rI   rl   URL.raw_query_stringo  s     {{rH   c                 R    U R                   (       a  [        U R                   5      $ S$ )z?Decoded query part of URL.

Empty string if query is missing.

r   )r   r+   r   s    rI   rm   URL.query_stringx  s     ,0;;{4;;'>B>rH   c                 b    U R                   =n(       d  U R                  $ U R                   SU 3$ )zDecoded path of URL with query.?)rm   rh   r   qs     rI   rn   URL.path_qs  s2     '+&7&7!7!7tyyP1QC>PPrH   c                     U R                   =n(       a8  U R                  (       d  U R                  (       d  U R                   SU 3$ SU 3$ U R                  (       d  U R                  (       d  U R                  $ S$ )zEncoded path of URL with query.rM  z/?r   )r   r   r   rN  s     rI   ro   URL.raw_path_qs  s]     1*.**DLLdjj\1#&VPRSTRUhV!ZZt||tzzDDrH   c                     U R                   $ )zEEncoded fragment part of URL.

Empty string if fragment is missing.

)r   r   s    rI   rp   URL.raw_fragment  s     ~~rH   c                 R    U R                   (       a  [        U R                   5      $ S$ )zEDecoded fragment part of URL.

Empty string if fragment is missing.

r   )r   r0   r   s    rI   rq   URL.fragment  s     ,0>>x'ArArH   .c                    U R                   nU R                  (       a!  U(       a  S/USS R                  S5      Q7$ S$ U(       a!  US   S:X  a  S/USS R                  S5      Q7$ [        UR                  S5      5      $ )zZA tuple containing encoded *path* parts.

('/',) for absolute URLs if *path* is missing.

r   r   N)r   r   )r   r   splitr   )r   rh   s     rI   rr   URL.raw_parts  su     zz<<26C.$qr(..-.BFBDGsN.$qr(..-..TZZ_%%rH   c                 :    [        S U R                   5       5      $ )zZA tuple containing decoded *path* parts.

('/',) for absolute URLs if *path* is missing.

c              3   8   #    U  H  n[        U5      v   M     g 7fr   r0   ).0parts     rI   	<genexpr>URL.parts.<locals>.<genexpr>  s     ?Xd^^   )r   rr   r   s    rI   rs   	URL.parts  s     ????rH   c           	      N   U R                   nU(       a  US:X  aG  U R                  (       d  U R                  (       a#  [        U R                  U R
                  USS5      $ U $ UR                  S5      n[        U R                  U R
                  SR                  USS 5      SS5      $ )zMA new URL with last part of path removed and cleaned up query and
fragment.

r   r   Nr   )r   r   r   r   r   r   rX  join)r   rh   rs   s      rI   rt   
URL.parent  s{     zzts{~~!$,,dBKKK

3$,,chhuSbz6JBPRSSrH   c                 l    U R                   nU R                  (       d  US   $ USS nU(       a  US   $ S$ )zThe last part of raw_parts.r   r   Nr   )rr   r   )r   rs   s     rI   ru   URL.raw_name  s:     ||9ab	!uRy)r)rH   c                 ,    [        U R                  5      $ )zThe last part of parts.)r0   ru   r   s    rI   rv   URL.name  s     &&rH   c                     U R                   nUR                  S5      nSUs=:  a  [        U5      S-
  :  a  O  OXS  $ S$ )Nr   r   r   r   )ru   rfindlen)r   rv   is      rI   rw   URL.raw_suffix  s;    }}JJsOq03t9q=0tBx8b8rH   c                 ,    [        U R                  5      $ r   )r0   rw   r   s    rI   rx   
URL.suffix  s    ((rH   c                     U R                   nUR                  S5      (       a  gUR                  S5      n[        S UR	                  S5      SS   5       5      $ )Nr   r@   c              3   ,   #    U  H
  nS U-   v   M     g7f)r   Nr@   r]  rx   s     rI   r_  #URL.raw_suffixes.<locals>.<genexpr>  s     D0CfS6\0Cs   r   )ru   endswithlstripr   rX  r   s     rI   ry   URL.raw_suffixes  sK    }}=={{3D

30CDDDrH   c                 :    [        S U R                   5       5      $ )Nc              3   8   #    U  H  n[        U5      v   M     g 7fr   r\  rs  s     rI   r_  URL.suffixes.<locals>.<genexpr>  s     F4E&Xf%%4Era  )r   ry   r   s    rI   rz   URL.suffixes  s    FD4E4EFFFrH   pathszSequence[str]c                 Z   / nSn[        [        U5      5       H  u  pVUS:H  nU(       a  US   S:X  a  [        SU< S35      eU(       a  UO
[        U5      nUSU;   -  nUR	                  S5      nUR                  5         X7(       d  US   S:X  a  USS	 OU-  nM     U R                  =n(       a<  UR	                  S5      =n	(       a$  U	S
   S:X  a  U	S	S
 OU	n
U
R                  5         X:-  nU R                  =n(       a!  U(       a  US
   S:w  a  UR                  S5        UR                  5         U(       a  U(       d(  [        U R                  USR                  U5      SS5      $ SR                  [        U5      5      nU(       a  US   S:w  a  SU 3n[        U R                  XSS5      $ )zz
add paths to self._path, accounting for absolute vs relative paths,
keep existing, but do not create new, empty segments
Fr   r   zAppending path z! starting from slash is forbiddenr   r   r   Nr   )	enumeratereversedr   r'   rX  reverser   r   appendr   r   rd  r   )r   r|  r   parsedneeds_normalizeidxrh   lastsegmentsold_segmentsoldr   s               rI   r   URL._make_child  s   
  %"8E?3IC!8DQ3 %dX-NO  #4D(9Dsd{*Ozz#H$8A;"3Dhqrl(RF! 4$ JJDTZZ_%D\%D (4B'72'=,s#<CKKMMF ll"F"6":3CMM"_dllFCHHV4Db"MMxx/78DGsNtf:D$,,b"==rH   c                    [        U[        5      (       d  [        S5      eUR                  5       nU R                  nU(       d  U[
        ;   a  SU S3n[        U5      e[        X#U R                  U R                  U R                  5      $ )z&Return a new URL with scheme replaced.zInvalid scheme typez<scheme replacement is not allowed for relative URLs for the r   )r   r}   r   lowerr   r   r   r   r   r   r   )r   rZ   lower_schemer   r   s        rI   with_schemeURL.with_scheme  s{     &#&&122||~,*>>))5g?  S/!,

DKKXXrH   c                 |   Uc  SnO8[        U[        5      (       a  [        U5      nU R                  nO[	        S5      eU R
                  =n(       d  [        S5      eU R                  =(       d    Sn[        XX@R                  5      n[        U R                  X0R                  U R                  U R                  5      $ )zhReturn a new URL with user replaced.

Autoencode user if needed.

Clear user/password if user is None.

NzInvalid user typez1user replacement is not allowed for relative URLsr   )r   r}   r.   r_   r   r   r   rc   r   rf   r   r   r   r   r   )r   r^   r`   r   r  s        rI   	with_userURL.with_user&  s     <Hc""$<D((H/00,,&&PQQ--3T\;M;MN$,,

DKKXXrH   c                 z   Uc  O,[        U[        5      (       a  [        U5      nO[        S5      eU R                  =n(       d  [        S5      eU R                  =(       d    SnU R                  n[        U R                  XU5      n[        U R                  X R                  U R                  U R                  5      $ )zoReturn a new URL with password replaced.

Autoencode password if needed.

Clear password if argument is None.

zInvalid password typez5password replacement is not allowed for relative URLsr   )r   r}   r.   r   r   r   rc   rf   r   r]   r   r   r   r   r   )r   r`   r   r  re   s        rI   with_passwordURL.with_password<  s     #&&h'H344,,&&TUU--3!!T]]HDI$,,

DKKXXrH   c                    [        U[        5      (       d  [        S5      eU R                  =n(       d  [	        S5      eU(       d  [	        S5      eU(       a
  [        USS9OSnU R                  n[        U R                  U R                  X45      n[        U R                  X R                  U R                  U R                  5      $ )zReturn a new URL with host replaced.

Autoencode host if needed.

Changing host for relative URLs is not allowed, use .join()
instead.

zInvalid host typez1host replacement is not allowed for relative URLszhost removing is not allowedTr   r   )r   r}   r   r   r   r   rf   r   r]   r_   r   r   r   r   r   )r   rb   r   r  re   s        rI   	with_hostURL.with_hostR  s     $$$/00,,&&PQQ;<<AE|D=2!!T]]D,=,=|R$,,

DKKXXrH   c                    Ub^  [        U[        5      (       d  [        U[        5      (       d  [        S[	        U5       35      eSUs=::  a  S::  d  O  [        SU 35      eU R                  =n(       d  [        S5      eU R                  =(       d    Sn[        U R                  U R                  X15      n[        U R                  X R                  U R                  U R                  5      $ )zPReturn a new URL with port replaced.

Clear port to default if None is passed.

z port should be int or None, got r   i  z&port must be between 0 and 65535, got z1port replacement is not allowed for relative URLsr   )r   r{   r|   r   r   r   r   rc   r   r]   r_   r   r   r   r   r   )r   re   r   r  s       rI   	with_portURL.with_portg  s     $%%Zc-B-B"B4:, OPP&& #I$!PQQ,,&&PQQ--3T]]D,=,=|R$,,

DKKXXrH   )r   
keep_querykeep_fragmentr  r  c                   U R                   nU(       d%  [        U5      nU(       a  SU;   a  [        U5      OUnU(       a  US   S:w  a  SU 3nU(       a  U R                  OSnU(       a  U R                  OSn[        U R                  XQXg5      $ )z$Return a new URL with path replaced.r   r   r   r   )r   r'   r   r   r   r   r   )r   rh   r   r  r  r   rk   rq   s           rI   	with_pathURL.with_pathy  st     t$D/2d{~d+DGsNtf:D)r%24>>$,,eFFrH   c                     g r   r@   r   s     rI   
with_queryURL.with_query  s    14rH   kwargsc                     g r   r@   r   r  s     rI   r  r    s    <?rH   argsc                     [        U0 UD6=(       d    Sn[        U R                  U R                  U R                  X0R
                  5      $ )a+  Return a new URL with query part replaced.

Accepts any Mapping (e.g. dict, multidict.MultiDict instances)
or str, autoencode the argument if needed.

A sequence of (key, value) pairs is supported as well.

It also can take an arbitrary number of keyword arguments.

Clear query if None is passed.

r   )r"   r   r   r   r   r   )r   r  r  rk   s       rI   r  r    s>     t.v.4""LL$,,

E>>
 	
rH   c                     g r   r@   r   s     rI   extend_queryURL.extend_query      36rH   c                     g r   r@   r  s     rI   r  r        >ArH   c                     [        U0 UD6=n(       d  U $ U R                  =n(       a  XDS   S:X  a  UOSU 3-  nOUn[        U R                  U R                  U R
                  X@R                  5      $ )zReturn a new URL with query part combined with the existing.

This method will not remove existing query parameters.

Example:
>>> url = URL('http://example.com/?a=1&b=2')
>>> url.extend_query(a=3, c=4)
URL('http://example.com/?a=1&b=2&a=3&c=4')
r   &)r"   r   r   r   r   r   r   )r   r  r  	new_queryrk   s        rI   r  r    su     +D;F;;	;KKK5 )s"2Y!I;GEE"LL$,,

E>>
 	
rH   c                     g r   r@   r   s     rI   r   URL.update_query  r  rH   c                     g r   r@   r  s     rI   r   r    r  rH   c                    U(       a  U(       a  Sn[        U5      eUnO [        U5      S:X  a  US   nO[        S5      eUc  SnGOUU(       d  U R                  nGO@[        U[        5      (       a@  [        U R                  5      nUR                  U5        [        UR                  5       5      nO[        U[        5      (       aI  [        U R                  5      nUR                  [        U5      5        [        UR                  5       5      nO[        U[        [        [        45      (       a  Sn[!        U5      e[        U["        5      (       a@  [        U R                  5      nUR                  U5        [        UR                  5       5      nO[!        S5      e[%        U R&                  U R(                  U R*                  XPR,                  5      $ )zReturn a new URL with query part updated.

This method will overwrite existing query parameters.

Example:
>>> url = URL('http://example.com/?a=1&b=2')
>>> url.update_query(a=3, c=4)
URL('http://example.com/?a=3&b=2&c=4')
z7Either kwargs or single query parameter must be presentr   r   r   zAInvalid query type: bytes, bytearray and memoryview are forbiddenzRInvalid query type: only str, mapping or sequence of (key, value) pairs is allowed)r   rl  r   r   r   r   ri   updater$   itemsr}   r   r#   bytes	bytearray
memoryviewr   r   r   r   r   r   r   )	r   r  r  r   in_queryrk   qmqstrqss	            rI   r   r    sd    O o%HY!^AwHVWWEKKE'**+4T5G5G+HBIIh8DE#&&#,T-?-?#@DKKx01/

=E5)Z"@AAUCC. (++
 *343E3E)FBIIh/
;E<  #LL$,,

E>>
 	
rH   query_paramsc                    ^ [        U5      U R                  R                  5       -  mT(       d  U $ U R                  [	        U4S jU R                  R                  5        5       5      5      $ )z4Remove some keys from query part and return new URL.c              3   >   >#    U  H  u  pUT;  d  M  X4v   M     g 7fr   r@   )r]  rv   valueparams_to_removes      rI   r_  +URL.without_query_params.<locals>.<genexpr>  s'      #5KD// #5s   
)setrk   keysr  r   r  )r   r  r  s     @rI   without_query_paramsURL.without_query_params  sY    |,tzz/@@K #'::#3#3#5 
 	
rH   c                     Uc  SnO+[        U[        5      (       d  [        S5      e[        U5      nU R                  U:X  a  U $ [        U R                  U R                  U R                  U R                  U5      $ )zxReturn a new URL with fragment replaced.

Autoencode fragment if needed.

Clear fragment to default if None is passed.

r   zInvalid fragment type)
r   r}   r   r%   r   r   r   r   r   r   )r   rq   rp   s      rI   with_fragmentURL.with_fragment
  sk     LHc**344*84L>>\)KLL$,,

DKK
 	
rH   )r  r  c                   [        U[        5      (       d  [        S5      eSU;   a  [        S5      e[	        U5      nUS;   a  [        S5      e[        U R                  5      nU R                  =n(       a+  [        U5      S:X  a  UR                  U5        OXS'   SUS	'   OXS'   US	   S:X  a  SUS	'   U(       a  U R                  OSnU(       a  U R                  OSn[        U R                  USR                  U5      Xg5      $ )
zReturn a new URL with name (last part of path) replaced.

Query and fragment parts are cleaned up.

Name is encoded if needed.

zInvalid name typer   zSlash in name is not allowedr   z... and .. values are forbiddenr   r   r   r   )r   r}   r   r   r'   r~   rr   r   rl  r  r   r   r   r   rd  )r   rv   r  r  rs   r   rk   rq   s           rI   	with_nameURL.with_name  s     $$$/00$;;<<4 ;<==T^^$\\!6!5zQT" b	E!H"IQx3a)r%24>>$,,QQrH   rx   c                   [        U[        5      (       d  [        S5      eU(       a	  US   S:X  a  US:X  d  SU;   a  [        SU< 35      eU R                  nU(       d  [        U < S35      eU R
                  n[        U5      nU(       d  XA-   OUS[        U5      *  U-   nUS;   a  [        S	5      e[        U R                  5      nU R                  =n(       a+  [        U5      S
:X  a  UR                  U5        OXFS'   SUS'   OXFS'   US   S:X  a  SUS'   U(       a  U R                  OSnU(       a  U R                  OSn	[        U R                  USR!                  U5      X5      $ )zReturn a new URL with suffix (file extension of name) replaced.

Query and fragment parts are cleaned up.

suffix is encoded if needed.
zInvalid suffix typer   r   r   zInvalid suffix z has an empty nameNr  r  r   r   r   )r   r}   r   r   ru   rw   r'   rl  r~   rr   r   r  r   r   r   r   rd  )
r   rx   r  r  rv   
old_suffixrs   r   rk   rq   s
             rI   with_suffixURL.with_suffixE  sD    &#&&122&)s*fmsf}vj9::}}x'9:;;__
V$$.t}D9KC
O;K4Lv4U;<==T^^$\\!6!5zQT" b	E!H"IQx3a)r%24>>$,,QQrH   c                 V   [        U5      [        La  [        S5      eUR                  =(       d    U R                  nX R                  :w  d
  U[        ;  a  U$ UR
                  =n(       a6  U[        ;   a,  [        X#UR                  UR                  UR                  5      $ U R                  nUR                  =n(       ap  US   S:X  a  UnOPU(       d  SU 3nOCUS   S:X  a  U U 3nO3SR                  / U R                  SS QSP5      U-   nUS   S:X  a  USS nSU;   a  [        U5      OUnOUn[        UU R
                  UU(       d  UR                  (       a  UR                  OU R                  U(       d  UR                  (       a  UR                  5      $ U R                  5      $ )	u'  Join URLs

Construct a full (“absolute”) URL by combining a “base URL”
(self) with another URL (url).

Informally, this uses components of the base URL, in
particular the addressing scheme, the network location and
(part of) the path, to provide missing components in the
relative URL.

zurl should be URLr   r   r   Nr   r   r   )r   rV   r   r   USES_RELATIVEr   r   r   r   r   r   rd  rs   r   )r   urlrZ   join_netloc	orig_path	join_pathrh   s          rI   rd  URL.joinn  st    9C/00,\\!V=%@J ;;&K&Fn,Df399cjj#--XXJJ			!9!|s" 9+2#%#YK0 xx 6$**Sb/ 62 67)CQ<3&8D+.$;>$'DDDLL#szzCJJt{{&#--CMM
 	

 >B^^
 	
rH   r   c                     U R                  X!S9$ )zAReturn a new URL with the elements in other appended to the path.r  )r   )r   r   r   s      rI   joinpathURL.joinpath  s    77rH   c                    [        U R                  S5      n[        U R                  S5      nU R                  =n(       a  SU;   a  SU S3n[        U R                  S5      n[
        (       a  Uc   eSR                  S U R                  R                  5        5       5      n[        U R                  S5      n[
        (       a  Uc   e[        XX0R                  5      n[        U R                  XtXV5      $ )	z<Return decoded human readable string for URL representation.z#/:?@[]r   r   r4  z#?r  c              3   r   #    U  H-  u  pS R                  [        US5      [        US5      5      v   M/     g7f)z{}={}z#&+;=N)formatr1   )r]  kvs      rI   r_  !URL.human_repr.<locals>.<genexpr>  s5       
* NN;q'2K74KLL*s   57r   )r1   r^   r`   rb   rh   r	   rd  rk   r  rq   r   rf   r   r   )r   r^   r`   rb   rh   rm   rq   r   s           rI   
human_reprURL.human_repr  s    499i0t}}i8IID3$;tfA;D499d+=###xx  


((* 
 
 t}}b1='''TT3E3EFdllF,QQrH   )r   r   r   r   r   r   r   N)r   rV   )r   rj   )F)r  rV   r   rV   )frA   rB   rC   rD   	__slots__rS   rQ   r}   r   r   r   r>   r{   r   classmethodr|   r   r   r   r   r   r   r  r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r
  r  cached_propertyrU   rW   r  rX   rZ   r[   r\   r]   r^   r_   r`   ra   rb   rc   rd   re   rf   rg   rh   rB  r~   ri   rk   rl   rm   rn   ro   rp   rq   rr   rs   rt   ru   rv   rw   rx   ry   rz   r   r  r  r  r  r  r  r   r  r    r
   r  r   r  r  r  r  rd  r  r  rG   r@   rH   rI   rV   rV     s	   N QILLJKN >G? $(?3UM9:? 	?
 dDj!? 
?:  !%%)!%$(\ \ 	\
 CI\ T	"\ \ CI\ \ UD[!\ \ \ \ 
\ \|M( MW W ;# ;)5 )
F 
t 
# 'F 't '
&F &t &
'F 't '
&F &t &
. . .
(U (u (Q$ Q8eK0 8
5.d<M6M0NNO
	
X	T 	; ;" Ul U U 6 6 K "$ " "    s   K3 K K '%T	* ' ' "eCI& " " +eCI. + + &%T	* & & '%T	* ' ' !eCI& ! ! 15d#3 1 1* #Dc4i(8 #D #DJ 	/eCI& 	/ 	/ ,uS$Y/ , , E# E E Xc X X 
+3 
+ 
+ +tE#s(O4 + + = = #   ?c ? ? Q Q Q ES E E c   B# B B &5c? & & @uS#X @ @ T T *# * * 'c ' ' 9C 9 9
 ) ) ) EeCHo E E G%S/ G G-> ->4 ->E ->^Y# Y% YYeCI. Y5 Y,YeCI&6 Y5 Y,Yc Ye Y*YeCI. Y5 Y,  #GG 	G
 G G 
G( 44%4 4?=?U? ?
 
s 
u 
& 6%6E6 6A]AuA A
# 
 
 
, 6%6E6 6A]AuA A3
# 3
 3
 3
j
# 
% 

eCI&6 
5 
2 !#$R$R 	$R
 $R 
$RT !#'R'R 	'R
 'R 
'RR2
h 5: 8s 8T 8e 8RC RrH      i   r1  c                      [         R                  " U R                  S5      5      $ ! [         a#    U R                  S5      R                  S5      s $ f = f)Nr   idna)r  decoder   UnicodeError)r1  s    rI   r/  r/    sH    2{{3::g.// 2zz'"))&112s   $' *AAc                      [         R                  " U SS9R                  S5      $ ! [         a#    U R                  S5      R                  S5      s $ f = f)NT)uts46r   r  )r  r   r  r  )rb   s    rI   _idna_encoder    sL    3{{4t,33G<< 3{{6"))'223s   #& *AAr   c           
      |   U (       a  U S   R                  5       (       d  SU ;   ab  U R                  S5      u  p#n [        U5      nUR                  n UR                  S:X  a  U(       a	  SU  SU S3$ SU  S3$ U(       a  U  SU 3$ U $ U R                  5       (       a  U R                  5       n U(       am  [        R                  U 5      =n(       aQ  UR                  5       UR                  5       SpnUS:X  d  US:X  a
  SXS	 ;   a  S
n	[        SU < SU< SU SU	 35      S	eU $ [        U 5      $ ! [
         a     Nf = f)zEncode host part of URL.r   r   %   r   r4  r   r   NzQ, if the value includes a username or password, use 'authority' instead of 'host'zHost z cannot contain z (at position ))r.  	partitionr   
compressedversionr   isasciir  NOT_REG_NAMEsearchgroupstartr  )
rb   r   raw_ipsepzoneipinvalidr  posextras
             rI   r   r     sS   
 b!!##sd{ NN3/T&
	5F#B ==DzzQ-04&$q)A$qkA'*dV1TF#44 ||~~ zz|)<)<T)BBgB '"E|T
1B8  x/yse1UGT 9  		s   D. .
D;:D;c                  |    [         R                  5         [        R                  5         [        R                  5         g)zClear all LRU caches.N)r  cache_clearr/  r   r@   rH   rI   r  r    s(     rH   c                      [         R                  5       [        R                  5       [        R                  5       [        R                  5       [        R                  5       S.$ )zReport cache statistics.)rM   rN   r   rO   rP   )r  
cache_infor/  r   r@   rH   rI   r	  r	    sJ     $..0#..0"--/%002#..0 rH   )idna_encode_sizeidna_decode_sizeip_address_sizehost_validate_sizeencode_host_sizer
  r  r  r  r  c                 *   U[         Ld	  U[         La  [        R                  " S[        SS9  Ub  X#4 Hq  nUc  SnM
  U[         L a  U[         La  UnM   M"  U[         Ld  M-  [        (       a.  [        U[        5      (       d   e[        U[        5      (       d   e[        XT5      nMs     U[         L a  [        n[        U5      " [        R                  5      q
[        U5      " [        R                  5      q[        U 5      " [        R                  5      qg)zConfigure LRU cache sizes.zcache_configure() no longer accepts the ip_address_size or host_validate_size arguments, they are used to set the encode_host_size instead and will be removed in the future   )
stacklevelN)r   r   r   DeprecationWarningr	   r   r|   max_DEFAULT_ENCODE_SIZEr   r   __wrapped__r/  r  )r
  r  r  r  r  sizes         rI   cache_configurer    s     i'+=Y+N0 	
 #$9D|#' !Y.y('+$ )Y& =%dC0000%&6<<<<#&t#>  : y(3-.|/G/GHL-.|/G/GHL-.|/G/GHLrH   r  )`resysr   collections.abcr   r   enumr   	functoolsr   r   	ipaddressr   typingr	   r
   r   r   r   r   r   urllib.parser   r   r  	multidictr   r   propcache.apir   r  _parser   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   _quotersr%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r   	frozensetr  r   compileVERBOSEr  r9   version_infor<   r>   rF   r   rK   rS   r   r}   r   r   r|   r   r   r   rV   _DEFAULT_IDNA_SIZEr  r/  r  r{   r   r  r	  r  r@   rH   rI   <module>r)     s   	 
  -  +   T T T 3  / B   ;      cCK-( !!FG  zz JJ T]wDD  $$		 $	 $N r 
 < < < <~ S U    T	
 CI	
  T	
     @$'03?B
 *+
 jR jR jRZ%    2c 2c 2 2 3s 3s 3 3  6s 64 6C 6 !6r   I    *<);7@:C8A'ICI&'I CI&'I 3m34	'I
 c467'I C}45'I 
'I 'IrH   