o
    d                     @   s  U d Z ddlZddlZddlZddl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 ejr:dd	lmZ ed
ZeedZdZdd eD Zdd edD ZG dd dejZG dd deZG dd deZG dd deZe eiZejej e! eje"e!f f e#d< 	dqdej$e%e"f dej$e%e"f de"fdd Z&d!ej$ej'e%e%f ej(ej)e%e%f  f d"e%d#e*d$ej+ej,ej)e%e%f gej-f  dej.e% f
d%d&Z/dqd'e%de%de%fd(d)Z0	*drd+e%d,ej+e% d-e*defd.d/Z1	0	1	2	dsd"e%d3e%d4ej$e%e"f dej$e%e"f dej,e"ge%f f
d5d6Z2e2 Z3e2d7d8d9Z4de"de%fd:d;Z5	0	1	2	dsdej$e%e"f d"e%d3e%d4ej$e%e"f dej$e%e"f de%fd<d=Z6	dtde%d"e%d3e%d4e%de%f
d>d?Z7d@ej)e%e%e%e%e%f de%fdAdBZ8	0	C	dudDej$e%e"f d"e%d3e%de%de%f
dEdFZ9	CdvdDej$e%e"f d"e%d3e%de%fdGdHZ:dwdDe%d"e%de%fdIdJZ;d<dKd edLD Z=dMe>dej)e%e!f fdNdOZ?e@dPe? 	0	PdxdQej$e%ej)e%e%e%e%e%f f d"e%d3e%de%fdRdSZAdTZB	0	1	UdydVej$e%ej)e%e%e%e%e%f f d"e%d3e%dWe*de%f
dXdYZC	0	*	C	Z	dzdDejDd"e%d[e*d3e%d\e%d]ej+ejEd^  dd_fd`daZF	0	*	C	b		d{dcejGe" d"e%d[e*d3e%d\e"d]ej+ejEd^  ddej+e! dd_fdedfZHdgej(ejD d"e%d[e*d3e%dej.ej)e%e%f  f
dhdiZI	0	U		Zd|d!ej$ej'e%e%f ej(ej)e%e%f  f d"e%d#e*d$ej+ej,ej)e%e%f gej-f  d\e%de%fdjdkZJ		0	U		Zd}d!ej$ej'e%e%f ej(ej)e%e%f  f dcej+ejGe%  d"e%d#e*d$ej+ej,ej)e%e%f gej-f  d\e%ddfdldmZK	*d~dnej$e%ej)e%e%e%e%e%f f d+ej$e%ej)e%e%e%e%e%f f d-e*de%fdodpZLdS )zFunctions for working with URLs.

Contains implementations of functions from :mod:`urllib.parse` that
handle bytes and strings.
    N   )_check_str_tuple)_decode_idna)_encode_idna)_make_encode_wrapper)_to_str)datastructuresz^[a-zA-Z0-9+-.]+$sK   abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._~$!'()*+,;0123456789ABCDEFabcdefc                 C   s8   i | ]}t D ]}| | d t| | dqqS )ascii   )
_hexdigitsencodeint).0ab r   R/var/www/html/visualizacion-main/env/lib/python3.10/site-packages/werkzeug/urls.py
<dictcomp>#   s     r   c                 C   s   g | ]}d |d dqS )%02Xr
   )r   )r   charr   r   r   
<listcomp>(   s    r      c                   @   s6   e Zd ZU eed< eed< eed< eed< eed< dS )	_URLTupleschemenetlocpathqueryfragmentN)__name__
__module____qualname__str__annotations__r   r   r   r   r   +   s   
 r   c                   @   s"  e Zd ZU dZdZeed< eed< eed< eed< defdd	Zd
ej	dd fddZ
edeje fddZedeje fddZedeje fddZedeje fddZedeje fddZedeje fddZedeje fddZedeje fddZdej	d
ej	ddfdd Zdej	d
ej	dd fd!d"Zdefd#d$Zdefd%d&Zdefd'd(Zd7d)d*Zd7d+d,Z	-d8d.eje dejeje eje f fd/d0Zdejeje ef fd1d2Zdejeje eje f fd3d4Z dejeje eje f fd5d6Z!d-S )9BaseURLz7Superclass of :py:class:`URL` and :py:class:`BytesURL`.r   _at_colon	_lbracket	_rbracketreturnc                 C   s   |   S N)to_urlselfr   r   r   __str__<   s   zBaseURL.__str__kwargsc                 K   s   | j di |S )zReturn an URL with the same values, except for those parameters
        given new values by whichever keyword arguments are specified.Nr   )_replace)r.   r0   r   r   r   replace?   s   zBaseURL.replacec                 C      |   d S )zThe host part of the URL if available, otherwise `None`.  The
        host is either the hostname or the IP address mentioned in the
        URL.  It will not contain the port.
        r   )_split_hostr-   r   r   r   hostD   s   zBaseURL.hostc                 C   sP   | j }|dur"t|tr"zt|}W n ty!   |dd}Y nw t|ddS )a   Works exactly like :attr:`host` but will return a result that
        is restricted to ASCII.  If it finds a netloc that is not ASCII
        it will attempt to idna decode it.  This is useful for socket
        operations when the URL might include internationalized characters.
        Nr
   ignore)r5   
isinstancer#   r   UnicodeErrorr   r   r.   rvr   r   r   
ascii_hostL   s   zBaseURL.ascii_hostc              	   C   sT   zt t|  d }d|  krdkr|W S  W dS W dS  ttfy)   Y dS w )z}The port in the URL as an integer if it was present, `None`
        otherwise.  This does not fill in default ports.
        r   r   i  N)r   r   r4   
ValueError	TypeErrorr9   r   r   r   port[   s   zBaseURL.portc                 C   r3   )zSThe authentication part in the URL if available, `None`
        otherwise.
        r   )_split_netlocr-   r   r   r   authh      zBaseURL.authc                 C       |   d }|durt|S dS )zThe username if it was part of the URL, `None` otherwise.
        This undergoes URL decoding and will always be a string.
        r   N_split_auth_url_unquote_legacyr9   r   r   r   usernameo      zBaseURL.usernamec                 C   r3   )zThe username if it was part of the URL, `None` otherwise.
        Unlike :attr:`username` this one is not being decoded.
        r   rD   r-   r   r   r   raw_usernamey   rA   zBaseURL.raw_usernamec                 C   rB   )zThe password if it was part of the URL, `None` otherwise.
        This undergoes URL decoding and will always be a string.
        r   NrC   r9   r   r   r   password   rG   zBaseURL.passwordc                 C   r3   )zThe password if it was part of the URL, `None` otherwise.
        Unlike :attr:`password` this one is not being decoded.
        r   rH   r-   r   r   r   raw_password   rA   zBaseURL.raw_passwordargsds.MultiDict[str, str]c                 O   s   t | jg|R i |S )zDecodes the query part of the URL.  Ths is a shortcut for
        calling :func:`url_decode` on the query argument.  The arguments and
        keyword arguments are forwarded to :func:`url_decode` unchanged.
        )
url_decoder   r.   rL   r0   r   r   r   decode_query   s   zBaseURL.decode_queryc                 O   s   t t| g|R i |S )zJoins this URL with another one.  This is just a convenience
        function for calling into :meth:`url_join` and then parsing the
        return value again.
        )	url_parseurl_joinrO   r   r   r   join   s   zBaseURL.joinc                 C   s   t | S )zReturns a URL string or bytes depending on the type of the
        information stored.  This is just a convenience function
        for calling :meth:`url_unparse` for this URL.
        )url_unparser-   r   r   r   r,      s   zBaseURL.to_urlc              
   C   s   | j pd}d|v rd| d}| j}|dur| d| }dtdt| jp&ddddt| jp/ddddg}|r@| d	| }|S )
z6Encodes the netloc part to an ASCII safe URL as bytes. :[]Nutf-8strictz/:%@)r;   r>   rS   filter	url_quoterI   rK   r.   r:   r>   r@   r   r   r   encode_netloc   s"   
	zBaseURL.encode_netlocc                 C   s   t | jpd}d|v rd| d}| j}|dur| d| }dtdt| jp(ddt| jp/ddg}|r>| d| }|S )z&Decodes the netloc part into a string.rU   rV   rW   rX   Nz/:%@r[   )r   r5   r>   rS   r\   rE   rI   rK   r^   r   r   r   decode_netloc   s"   	zBaseURL.decode_netlocc                 C      t t| S )a*  Returns a :class:`BytesURL` tuple that holds a URI.  This will
        encode all the information in the URL properly to ASCII using the
        rules a web browser would follow.

        It's usually more interesting to directly call :meth:`iri_to_uri` which
        will return a string.
        )rQ   
iri_to_urir-   r   r   r   to_uri_tuple   s   zBaseURL.to_uri_tuplec                 C   ra   )aS  Returns a :class:`URL` tuple that holds a IRI.  This will try
        to decode as much information as possible in the URL without
        losing information similar to how a web browser does it for the
        URL bar.

        It's usually more interesting to directly call :meth:`uri_to_iri` which
        will return a string.
        )rQ   
uri_to_irir-   r   r   r   to_iri_tuple   s   	zBaseURL.to_iri_tupleN
pathformatc                 C   s6  | j dkrdS t| j}| jpd}|du rtjdkrd}nd}|dkr||dd dkrJ|dd	  rJ|d	d
 dv rJ|dd	  d|d
d  }|dd
 dv }ddl}||}|r{|du r{|	d
dd}t|d	kru|\}}n|d }d}n|dkrddl}||}ntd||dv rd}||fS )a@  Returns a tuple with the location of the file in the form
        ``(server, location)``.  If the netloc is empty in the URL or
        points to localhost, it's represented as ``None``.

        The `pathformat` by default is autodetection but needs to be set
        when working with URLs of a specific system.  The supported values
        are ``'windows'`` when working with Windows or DOS paths and
        ``'posix'`` when working with posix paths.

        If the URL does not point to a local file, the server and location
        are both represented as ``None``.

        :param pathformat: The expected format of the path component.
                           Currently ``'windows'`` and ``'posix'`` are
                           supported.  Defaults to ``None`` which is
                           autodetect.
        fileNNNntwindowsposixr   /      z|:rV   )z\\\z///r   \rU   zInvalid path format )z	127.0.0.1z::1	localhost)r   url_unquoter   r   osnameisalphantpathnormpathlstripsplitlen	posixpathr=   )r.   rf   r   r5   windows_shareru   partsrz   r   r   r   get_file_location   s8   



0

zBaseURL.get_file_locationc                 C   s2   | j | jv r| j| j \}}}||fS d | jfS r+   )r&   r   	partition)r.   r@   _r   r   r   r   r?   $  s   
zBaseURL._split_netlocc                 C   s@   |   d }|s
dS | j|vr|d fS || j\}}}||fS )Nr   rh   )r?   r'   r~   )r.   r@   rF   r   rJ   r   r   r   rD   *  s   
zBaseURL._split_authc                 C   s   |   d }|s
dS || js&| j|v r"|| j\}}}||fS |d fS || j}|dk r4|d fS |d| }||d d  }|| jrP||dd  fS |d fS )Nr   rh   r   )r?   
startswithr(   r'   r~   findr)   )r.   r:   r5   r   r>   idxrestr   r   r   r4   4  s    
zBaseURL._split_host)r*   r%   r+   )"r    r!   r"   __doc__	__slots__r#   r$   r/   tAnyr2   propertyOptionalr5   r;   r   r>   r@   rF   rI   rJ   rK   rP   rS   r,   r_   r`   rc   re   Tupler}   r?   rD   r4   r   r   r   r   r%   3   sR   
 		



>$(
r%   c                   @   s<   e Zd ZdZdZdZdZdZdZdd	e	d
e	ddfddZ
dS )URLzRepresents a parsed URL.  This behaves like a regular tuple but
    also has some extra attributes that give further insight into the
    URL.
    r   r[   rV   rW   rX   rY   r2   charseterrorsr*   BytesURLc              	   C   :   t | jd|  | j||| j||| j||S )zEncodes the URL to a tuple made out of bytes.  The charset is
        only being used for the path, query and fragment.
        r
   )r   r   r   r_   r   r   r   r.   r   r   r   r   r   r   V     
z
URL.encodeNrY   r2   )r    r!   r"   r   r   r&   r'   r(   r)   r#   r   r   r   r   r   r   J  s    r   c                   @   sX   e Zd ZdZdZdZdZdZdZde	fdd	Z
defd
dZdde	de	ddfddZdS )r   z!Represents a parsed URL in bytes.r      @   :   [   ]r*   c                 C   s   |   ddS )NrY   r2   )r,   decoder-   r   r   r   r/   l     zBytesURL.__str__c                 C   s   | j S )z&Returns the netloc unchanged as bytes.)r   r-   r   r   r   r_   o  s   zBytesURL.encode_netlocrY   r2   r   r   r   c              	   C   r   )zDecodes the URL to a tuple made out of strings.  The charset is
        only being used for the path, query and fragment.
        r
   )r   r   r   r`   r   r   r   r   r   r   r   r   s  r   zBytesURL.decodeNr   )r    r!   r"   r   r   r&   r'   r(   r)   r#   r/   bytesr_   r   r   r   r   r   r   c  s    r   _unquote_mapsrU   stringunsafer*   c                    s   t | tr
| d} t  tr d tt  t| d}tt|d}zt  }W n t	yF    fddt
 D  }t < Y nw |D ]'}|d d }||v rf|||  ||dd   qI|d || qIt|S )NrY      %    c                    s   i | ]\}}| vr||qS r   r   )r   hr   r   r   r   r     s
    z%_unquote_to_bytes.<locals>.<dictcomp>rm   %   )r7   r#   r   	frozenset	bytearrayiterrx   nextr   KeyError
_hextobyteitemsappendextendr   )r   r   groupsresulthex_to_bytegroupcoder   r   r   _unquote_to_bytes  s,   





r   objr   sortkeyc           
      c   s    ddl m} || }|rt||d}|D ]3\}}|d u rqt|ts+t||}n|}t|ts:t||}	n|}	t| dt|	 V  qd S )Nr   )iter_multi_items)r   =)r   r   sortedr7   r   r#   r   _fast_url_quote_plus)
r   r   r   r   r   iterablekey_str	value_str	key_bytesvalue_bytesr   r   r   _url_encode_impl  s    

r   valuec                 C   s4   z	t | dd|dW S  ty   t | d|d Y S w )NrY   rZ   )r   r   r   latin1)r   r   )rq   r8   )r   r   r   r   r   rE     s
   rE   Turlr   allow_fragmentsc                    s  t |  t| t}|du r d} d } }}|  d}|dkrQtt| d| ddrQ| |d d }|rFt fdd	|D rQ| d|  |}} | dd
  dkrt	| }	 dD ]}
| |
d
}|dkrtt
|	|}	qc| d
|	 | |	d }}  d|v r d|vs d|v r d|vrtd|r d| v r|  dd\} } d| v r|  dd\} }|rtnt}|||| ||S )a  Parses a URL from a string into a :class:`URL` tuple.  If the URL
    is lacking a scheme it can be provided as second argument. Otherwise,
    it is ignored.  Optionally fragments can be stripped from the URL
    by setting `allow_fragments` to `False`.

    The inverse of this function is :func:`url_unparse`.

    :param url: the URL to parse.
    :param scheme: the default schema to use if the URL is schemaless.
    :param allow_fragments: if set to `False` a fragment will be removed
                            from the URL.
    NrU   rV   r   r2   )r   r   c                 3   s    | ]	}| d vV  qdS )
0123456789Nr   r   csr   r   	<genexpr>  s    zurl_parse.<locals>.<genexpr>rm   //z/?#rW   rX   zInvalid IPv6 URL#?)r   r7   r#   r   
_scheme_rematchr   anylowerry   minr<   rx   r   r   )r   r   r   is_text_basedr   r   r   ir   delimr   wdelimresult_typer   r   r   rQ     s<   
"


rQ   rY   rZ   /:r   safec                    sx   t  tr | | t |tr|| |}tt tB tt|   fddtdD dtdtffdd}|S )a  Precompile the translation table for a URL encoding function.

    Unlike :func:`url_quote`, the generated function only takes the
    string to quote.

    :param charset: The charset to encode the result with.
    :param errors: How to handle encoding errors.
    :param safe: An optional sequence of safe characters to never encode.
    :param unsafe: An optional sequence of unsafe characters to always encode.
    c                    s(   g | ]}| v rt |nd |dqS )r   r   )chrr   r   r   r   r     s   ( z(_make_fast_url_quote.<locals>.<listcomp>r   r   r*   c                    s   d  fdd| D S )NrU   c                    s   g | ]} | qS r   r   r   tabler   r   r     s    z7_make_fast_url_quote.<locals>.quote.<locals>.<listcomp>)rS   r   r   r   r   quote  s   z#_make_fast_url_quote.<locals>.quote)r7   r#   r   r   r   _always_saferanger   )r   r   r   r   r   r   )r   r   r   _make_fast_url_quote  s   

r    +)r   r   c                 C   s   t | ddS )Nr   r   )_fast_quote_plusr2   r   r   r   r   r     r   r   c                 C   s   t | tttfst| } t | tr| ||} t |tr"|||}t |tr-|||}tt|tB tt| }t }t| D ]}||v rN|| qB|t	|  qBt|
|S )aD  URL encode a single string with a given encoding.

    :param s: the string to quote.
    :param charset: the charset to be used.
    :param safe: an optional sequence of safe characters.
    :param unsafe: an optional sequence of unsafe characters.

    .. versionadded:: 0.9.2
       The `unsafe` parameter was added.
    )r7   r#   r   r   r   r   r   r   r   
_bytetohexr   )r   r   r   r   r   r:   r   r   r   r   r]   #  s   


r]   c                 C   s   t | |||d dddS )zURL encode a single string with the given encoding and convert
    whitespace to "+".

    :param s: The string to quote.
    :param charset: The charset to be used.
    :param safe: An optional sequence of safe characters.
    r   r   )r]   r2   )r   r   r   r   r   r   r   url_quote_plusF  s   
r   
componentsc                 C   s   t |  | \}}}}}t|}|d}|s|r=||dr=|r0|dd |dkr0|d| }|d|p8|d | }n|rC||7 }|rM||d | }|rW||d | }|ra||d | }|S )	zThe reverse operation to :meth:`url_parse`.  This accepts arbitrary
    as well as :class:`URL` tuples and returns a URL as a string.

    :param components: the parsed URL as tuple which should be converted
                       into a URL string.
    rU   rl   Nr   r   rV   r   r   )r   r   r   )r   r   r   r   r   r   r   r   r   r   r   rT   S  s"   rT   r2   r   c                 C   s"   t | |}|du r|S |||S )af  URL decode a single string with a given encoding.  If the charset
    is set to `None` no decoding is performed and raw bytes are
    returned.

    :param s: the string to unquote.
    :param charset: the charset of the query string.  If set to `None`
        no decoding will take place.
    :param errors: the error handling for the charset decoding.
    N)r   r   )r   r   r   r   r:   r   r   r   rq   r  s   
rq   c                 C   s0   t | tr| dd} n| dd} t| ||S )a  URL decode a single string with the given `charset` and decode "+" to
    whitespace.

    Per default encoding errors are ignored.  If you want a different behavior
    you can set `errors` to ``'replace'`` or ``'strict'``.

    :param s: The string to unquote.
    :param charset: the charset of the query string.  If set to `None`
        no decoding will take place.
    :param errors: The error handling for the `charset` decoding.
    r   r      +    )r7   r#   r2   rq   )r   r   r   r   r   r   url_unquote_plus  s   
r   c                 C   s   t | |ddd} | dr(| dd  r(| dd dv r(d	| dd
  } t| }t|j|dd}t|j|dd}t|j	|dd}t
|j| |||fS )a  Sometimes you get an URL by a user that just isn't a real URL because
    it contains unsafe characters like ' ' and so on. This function can fix
    some of the problems in a similar way browsers handle data entered by the
    user:

    >>> url_fix('http://de.wikipedia.org/wiki/Elf (Begriffskl\xe4rung)')
    'http://de.wikipedia.org/wiki/Elf%20(Begriffskl%C3%A4rung)'

    :param s: the string with the URL to fix.
    :param charset: The target charset for the URL if the url was given
        as a string.
    r2   ro   rl   zfile://      
   )z:/z|/zfile:///Nz
/%+$!*'(),r   z:&%=+$!*'(),)r   r2   r   rt   rQ   r]   r   r   r   r   rT   r   r_   )r   r   r   r   qsanchorr   r   r   url_fix  s   *r   c                 C   s   g | ]
}|t vrt|qS r   )r   r   r   r   r   r   r            ec                 C   s    t | j| j| j }|| jfS )zRUsed in :func:`uri_to_iri` after unquoting to re-quote any
    invalid bytes.
    )_fast_url_quoteobjectstartend)r   outr   r   r   _codec_error_url_quote  s   
r   werkzeug.url_quoteuric                 C   sh   t | tr	t| } tt| |} t| j||t}t| j||t}t| j	||t}t| j
|  |||fS )a  Convert a URI to an IRI. All valid UTF-8 characters are unquoted,
    leaving all reserved and invalid characters quoted. If the URL has
    a domain, it is decoded from Punycode.

    >>> uri_to_iri("http://xn--n3h.net/p%C3%A5th?q=%C3%A8ry%DF")
    'http://\u2603.net/p\xe5th?q=\xe8ry%DF'

    :param uri: The URI to convert.
    :param charset: The encoding to encode unquoted bytes with.
    :param errors: Error handler to use during ``bytes.encode``. By
        default, invalid bytes are left quoted.

    .. versionchanged:: 0.15
        All reserved and invalid characters remain quoted. Previously,
        only some reserved characters were preserved, and invalid bytes
        were replaced instead of left quoted.

    .. versionadded:: 0.6
    )r7   tuplerT   rQ   r   rq   r   _to_iri_unsafer   r   r   r`   )r   r   r   r   r   r   r   r   r   rd     s   
rd   z:/?#[]@!$&'()*+,;=%Firisafe_conversionc           	      C   s   t | tr	t| } |r+zt| }|d}t| dkr |W S W n	 ty*   Y nw tt| ||} t	| j
||t}t	| j||t}t	| j||t}t| j|  |||fS )a  Convert an IRI to a URI. All non-ASCII and unsafe characters are
    quoted. If the URL has a domain, it is encoded to Punycode.

    >>> iri_to_uri('http://\u2603.net/p\xe5th?q=\xe8ry%DF')
    'http://xn--n3h.net/p%C3%A5th?q=%C3%A8ry%DF'

    :param iri: The IRI to convert.
    :param charset: The encoding of the IRI.
    :param errors: Error handler to use during ``bytes.encode``.
    :param safe_conversion: Return the URL unchanged if it only contains
        ASCII characters and no whitespace. See the explanation below.

    There is a general problem with IRI conversion with some protocols
    that are in violation of the URI specification. Consider the
    following two IRIs::

        magnet:?xt=uri:whatever
        itms-services://?action=download-manifest

    After parsing, we don't know if the scheme requires the ``//``,
    which is dropped if empty, but conveys different meanings in the
    final URL if it's present or not. In this case, you can use
    ``safe_conversion``, which will return the URL unchanged if it only
    contains ASCII characters and no whitespace. This can result in a
    URI with unquoted characters if it was not already quoted correctly,
    but preserves the URL's semantics. Werkzeug uses this for the
    ``Location`` header for redirects.

    .. versionchanged:: 0.15
        All reserved characters remain unquoted. Previously, only some
        reserved characters were left unquoted.

    .. versionchanged:: 0.9.6
       The ``safe_conversion`` parameter was added.

    .. versionadded:: 0.6
    r
   r   )r7   r   rT   r   r   ry   rx   r8   rQ   r]   r   _to_uri_safer   r   r   r_   )	r   r   r   r   
native_iri	ascii_irir   r   r   r   r   r   rb     s"   
+
rb   &include_empty	separatorclszds.MultiDictrM   c                 C   sv   |du rddl m} |}t| trt|ts||pd}nt| tr/t|ts/||p-d}|t| ||||S )aw  Parse a query string and return it as a :class:`MultiDict`.

    :param s: The query string to parse.
    :param charset: Decode bytes to string with this charset. If not
        given, bytes are returned as-is.
    :param include_empty: Include keys with empty values in the dict.
    :param errors: Error handling behavior when decoding bytes.
    :param separator: Separator character between pairs.
    :param cls: Container to hold result instead of :class:`MultiDict`.

    .. versionchanged:: 2.0
        The ``decode_keys`` parameter is deprecated and will be removed
        in Werkzeug 2.1.

    .. versionchanged:: 0.5
        In previous versions ";" and "&" could be used for url decoding.
        Now only "&" is supported. If you want to use ";", a different
        ``separator`` can be provided.

    .. versionchanged:: 0.5
        The ``cls`` parameter was added.
    Nr   	MultiDictr
   )	r   r  r7   r#   r   r   r   _url_decode_implrx   )r   r   r  r   r  r  r  r   r   r   rN   3  s   rN      &streamlimitc                 C   sF   ddl m} || ||}t||||}	|du rddlm}
 |
}||	S )a_  Works like :func:`url_decode` but decodes a stream.  The behavior
    of stream and limit follows functions like
    :func:`~werkzeug.wsgi.make_line_iter`.  The generator of pairs is
    directly fed to the `cls` so you can consume the data while it's
    parsed.

    :param stream: a stream with the encoded querystring
    :param charset: the charset of the query string.  If set to `None`
        no decoding will take place.
    :param include_empty: Set to `False` if you don't want empty values to
                          appear in the dict.
    :param errors: the decoding error behavior.
    :param separator: the pair separator to be used, defaults to ``&``
    :param cls: an optional dict class to use.  If this is not specified
                       or `None` the default :class:`MultiDict` is used.
    :param limit: the content length of the URL data.  Not necessary if
                  a limited stream is provided.

    .. versionchanged:: 2.0
        The ``decode_keys`` and ``return_iterator`` parameters are
        deprecated and will be removed in Werkzeug 2.1.

    .. versionadded:: 0.8
    r   )make_chunk_iterNr  )wsgir  r  r   r  )r	  r   r  r   r  r  r
  r  	pair_iterdecoderr  r   r   r   url_decode_stream`  s   !r  r  c           	      c   sl    | D ]0}|sqt |}|d}||v r||d\}}n	|s q|}|d}t|||t|||fV  qd S )Nr   r   rU   )r   rx   r   )	r  r   r  r   pairr   equalr   r   r   r   r   r    s    

r  c                 C   s   t |d}|t| |||S )a  URL encode a dict/`MultiDict`.  If a value is `None` it will not appear
    in the result string.  Per default only values are encoded into the target
    charset strings.

    :param obj: the object to encode into a query string.
    :param charset: the charset of the query string.
    :param sort: set to `True` if you want parameters to be sorted by `key`.
    :param separator: the separator to be used for the pairs.
    :param key: an optional function to be used for sorting.  For more details
                check out the :func:`sorted` documentation.

    .. versionchanged:: 2.0
        The ``encode_keys`` parameter is deprecated and will be removed
        in Werkzeug 2.1.

    .. versionchanged:: 0.5
        Added the ``sort``, ``key``, and ``separator`` parameters.
    r
   )r   rS   r   )r   r   r   r   r  r   r   r   
url_encode  s   
r  c           	      C   sR   t |d}t| |||}|du r|S t|D ]\}}|r!|| || qdS )a  Like :meth:`url_encode` but writes the results to a stream
    object.  If the stream is `None` a generator over all encoded
    pairs is returned.

    :param obj: the object to encode into a query string.
    :param stream: a stream to write the encoded object into or `None` if
                   an iterator over the encoded pairs should be returned.  In
                   that case the separator argument is ignored.
    :param charset: the charset of the query string.
    :param sort: set to `True` if you want parameters to be sorted by `key`.
    :param separator: the separator to be used for the pairs.
    :param key: an optional function to be used for sorting.  For more details
                check out the :func:`sorted` documentation.

    .. versionchanged:: 2.0
        The ``encode_keys`` parameter is deprecated and will be removed
        in Werkzeug 2.1.

    .. versionadded:: 0.8
    r
   N)r   r   	enumeratewrite)	r   r	  r   r   r   r  genr   chunkr   r   r   url_encode_stream  s   

r  basec                    s  t | tr	t| } t |trt|}t| |f t|  | s |S |s$| S t| |d\}}}}}t|||\}}	}
}}||kr@|S |	rKt||	|
||fS |}	|
dd  dkr_|
 d}n |
sm| d}|sl|}n| ddd |
 d }|d  dkr d|d<  fdd	|D }	 d}t|d }||k r||  dkr||d   d dfvr||d |d = n	|d7 }||k snq d dg}|dd |kr|d= |dd |ks݈ d|}
t||	|
||fS )a	  Join a base URL and a possibly relative URL to form an absolute
    interpretation of the latter.

    :param base: the base URL for the join operation.
    :param url: the URL to join.
    :param allow_fragments: indicates whether fragments should be allowed.
    )r   Nr   rl   .rU   c                    s   g | ]
}| d kr|qS )r  r   )r   segmentr   r   r   r     r   zurl_join.<locals>.<listcomp>Tz..rm   )	r7   r   rT   r   r   rQ   rx   ry   rS   )r  r   r   bschemebnetlocbpathbquery	bfragmentr   r   r   r   r   segmentsr   nunwanted_markerr   r   r   rR     s^   

$,rR   )rU   )NT)rY   rZ   r   rU   )rY   rZ   rU   )rY   r2   rU   r   )rY   )rY   r   )rY   rZ   F)rY   Tr2   r  N)rY   Tr2   r  NN)rY   FNr  )NrY   FNr  )T)Mr   codecsrr   retypingr   	_internalr   r   r   r   r   TYPE_CHECKINGrU   r   dscompiler   r   r   r   r   r   r   r   
NamedTupler   r%   r   r   r   Dict	FrozenSetr   r   r$   Unionr#   r   MappingIterabler   boolr   Callabler   Iteratorr   rE   rQ   r   r   r   r   r]   r   rT   rq   r   r   rS   r   r8   r   register_errorrd   r   rb   AnyStrTyperN   IOr  r  r  r  rR   r   r   r   r   <module>   s   

  ,
!& 

4

$
"!



#
D
/
.

& 
& 
*