o
    3˜Žj1#  ã                   @   s:  d Z ddlZddlZddlmZ ddlmZmZ ddlm	Z	m
Z
 dZg d¢ZeeƒZeeeeeef Zd	ed
efdd„Zded
dfdd„Zeded
eedB edB edB edB f fdd„ƒZdeded	ededed
efdd„Ze	d"dedB dedB dedB dedB ded
efdd„ƒZded
eeeef  fd d!„ZdS )#zURL parsing utilities.é    N)Ú	lru_cache)Úscheme_charsÚuses_netlocé   )ÚQUOTERÚUNQUOTER_PLUSz! 	
 )ú	úÚ
ÚurlÚreturnc                 C   s^  |   t¡} tD ]}|| v r|  |d¡} qd } } }}|  d¡}|dkrK| d tv rK| d|… D ]}|tvr9 nq1| d|…  ¡ | |d d… }} d| v }d| v }	| dd… d	k�rt| ƒ}
|rg|	rgd
}n|	rld}n|rqd}nd}|D ]}|  |d¡}|dkr‡||
k r‡|}
qu| d|
… }| |
d… } d|v rœtdƒ‚d|v }d|v }|r¨|r¬|r°|s°tdƒ‚|�r| 	d¡d }|d dksÎ| 
d¡dksÎ| 
d¡dkrÒtdƒ‚|dd…  d¡\}}}|rê|d dkrêtdƒ‚|rý|d dkrýt d|¡sütdƒ‚n	d|v�rtdƒ‚|�r|  d¡\} }}|	�r|  d¡\} }}|�r(| ¡ �s(t|ƒ ||| ||fS )zSplit URL into parts.Ú ú:r   r   Nú#ú?é   ú//z/?#z/?z/#ú/ú\zTInvalid URL: backslash ('\') is not allowed in the authority component per RFC 3986.ú[ú]úInvalid IPv6 URLú@Úvz\Av[a-fA-F0-9]+\..+\ZzIPvFuture address is invalidz.The IPv6 content between brackets is not valid)ÚlstripÚWHATWG_C0_CONTROL_OR_SPACEÚUNSAFE_URL_BYTES_TO_REMOVEÚreplaceÚfindr   ÚlowerÚlenÚ
ValueErrorÚ
rpartitionÚcountÚ	partitionÚreÚmatchÚisasciiÚ_check_netloc)r   ÚbÚschemeÚnetlocÚqueryÚfragmentÚiÚcÚhas_hashÚhas_question_markÚdelimÚdelim_charsÚwdelimÚhas_left_bracketÚhas_right_bracketÚhostinfoÚbracketed_hostÚ_Úafter_bracket© r;   úH/var/www/kodo/Anonymous/send/lib/python3.10/site-packages/yarl/_parse.pyÚ	split_url   s~   
€
ÿ"€ÿÿÿ(ÿ
r=   r+   c                 C   sb   |   dd¡  dd¡  dd¡  dd¡}t d|¡}||krd S dD ]}||v r.td| › d	�ƒ‚q d S )
Nr   r   r   r   r   ÚNFKCz/?#@:%znetloc 'z6' contains invalid characters under NFKC normalization)r   ÚunicodedataÚ	normalizer!   )r+   ÚnÚnormalized_netlocr/   r;   r;   r<   r(   l   s   $
ÿÿÿr(   c                 C   sD  d| vrd}d}| }n|   d¡\}}}| d¡\}}}|sd}d|v r`|d dks7| d¡dks7| d¡dkr;tdƒ‚| d¡\}}}| d¡\}}}	|	rW|	d dkrWtdƒ‚|	 d¡\}}}	n| d¡\}}}	|	st|pmd||pqddfS zt|	ƒ}
W n ty…   td	ƒ‚w d|
  kr“d
ks˜tdƒ‚ tdƒ‚|p›d||pŸd|
fS )z4Split netloc into username, password, host and port.r   Nr   r   r   r   r   r   z/Invalid URL: port can't be converted to integeriÿÿ  zPort out of range 0-65535)r"   r$   r#   r!   Úint)r+   ÚusernameÚpasswordr7   Úuserinfor9   Úhave_passwordÚ	bracketedÚhostnameÚport_strÚportr;   r;   r<   Úsplit_netloc‚   s:   (ÿÿrL   r*   r,   r-   c                 C   s¼   |s| r| t v s|dd… dkrA|r.|dd… dkr.| r&| › d|› d|› �n| › d|› �}n| r9| › d|› |› �nd|› |› �}n	| rJ| › d|› �}|rS|› d|› �}|r\|› d	|› �S |S )
z(Unsplit a URL without any normalization.Nr   r   r   r   z://r   r   r   )ÚUSES_AUTHORITY)r*   r+   r   r,   r-   r;   r;   r<   Úunsplit_result«   s    (&rN   FÚuserrE   ÚhostrK   Úencodec                 C   sš   |du rdS |}|dur|› d|› �}| du r|du r|S |dur:| s&d} n|r,t | ƒ} |r2t |ƒ}| › d|› �} n| rB|rBt | ƒ} | rK| › d|› �S |S )z�Make netloc from parts.

    The user and password are encoded if encode is True.

    The host must already be encoded with _encode_host.
    Nr   r   r   )r   )rO   rE   rP   rK   rQ   Úretr;   r;   r<   Úmake_netloc»   s$   rS   Úquery_stringc                 C   sF   g }| s|S |   d¡D ]}| d¡\}}}| t|ƒt|ƒf¡ q|S )zmParse a query given as a string argument.

    Works like urllib.parse.parse_qsl with keep empty values.
    ú&ú=)Úsplitr$   Úappendr   )rT   ÚpairsÚk_vÚkr9   r   r;   r;   r<   Úquery_to_pairsÝ   s   r\   )F)Ú__doc__r%   r?   Ú	functoolsr   Úurllib.parser   r   Ú_quotersr   r   r   r   Ú	frozensetrM   ÚtupleÚstrÚSplitURLTyper=   r(   rC   rL   rN   ÚboolrS   Úlistr\   r;   r;   r;   r<   Ú<module>   s`    ÿTÿþ(ÿÿÿÿÿ
þûÿþýüûú"!