o
    çûõj°'  ã                   @   sZ  d Z ddlZddlZddlZddlmZ ddlmZ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dd œd!ed"edB d#ed
eeeef  fd$d%„ZdS )'zURL parsing utilities.é    N)Ú	lru_cache)Ú	parse_qslÚ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<   ú>/opt/steambot/venv/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_netlocr0   r<   r<   r=   r)   m   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Úpasswordr8   Úuserinfor:   Úhave_passwordÚ	bracketedÚhostnameÚport_strÚportr<   r<   r=   Úsplit_netlocƒ   s:   (ÿÿrM   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    (&rO   FÚuserrF   ÚhostrL   Ú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   )rP   rF   rQ   rL   rR   Úretr<   r<   r=   Úmake_netloc¼   s$   rT   úutf-8)Ú
max_fieldsÚencodingÚquery_stringrV   rW   c                C   sÔ   | sg S |dur|   d¡|krtdƒ‚g }d| vr8|  dd¡ d¡D ]}|r5| d¡\}}}| ||f¡ q"|S |dkrKt |¡jdkrKt	| d	|d
�S |  d¡D ]}|rg| d¡\}}}| t
|ƒt
|ƒf¡ qP|S )aõ  Parse a query string into a list of decoded name, value pairs.

    The result is the same as
    ``urllib.parse.parse_qsl(query_string, keep_blank_values=True,
    encoding=encoding, max_num_fields=max_fields)``.

    Raises :exc:`ValueError` if *max_fields* is not ``None`` and the
    query string has more than *max_fields* fields. An empty query string
    returns an empty list on every Python version, even when *max_fields*
    is ``0``, where ``parse_qsl`` on Python 3.10 raises instead.
    Nú&zMax number of fields exceededú%ú+ú ú=rU   T)Úkeep_blank_valuesrW   )r$   r"   r   Úsplitr%   ÚappendÚcodecsÚlookupÚnamer   r   )rX   rV   rW   ÚpairsÚ
name_valuerc   r:   Úvaluer<   r<   r=   Úquery_to_pairsÞ   s(   €€rg   )F)Ú__doc__ra   r&   r@   Ú	functoolsr   Úurllib.parser   r   r   Ú_quotersr   r   r   r   Ú	frozensetrN   ÚtupleÚstrÚSplitURLTyper>   r)   rD   rM   rO   ÚboolrT   Úlistrg   r<   r<   r<   r=   Ú<module>   st    ÿTÿþ(ÿÿÿÿÿ
þûÿþýüûú"ÿÿÿÿþ