
    `1                         d dl Z ddlmZ dZdZ e j        dez   dz   ez   dz   ez   ez   d	z   ez   ez   d
z   ez   dz   ez   dz   e j        e j        z            Z e j        e          Z	edd            Z
dS )    N   )	validatorz$(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5]))z+(?:\.(?:0|[1-9]\d?|1\d\d|2[0-4]\d|25[0-5]))z^(?:(?:https?|ftp)://)(?:[-a-z\u00a1-\uffff0-9._~%!$&'()*+,;=:]+(?::[-a-z0-9._~%!$&'()*+,;=:]*)?@)?(?:(?P<private_ip>(?:(?:10|127)z{2}z)|(?:(?:169\.254|192\.168)z)|(?:172\.(?:1[6-9]|2\d|3[0-1])zS))|(?P<private_host>(?:localhost))|(?P<public_ip>(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])aA  )|\[(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\]|(?:(?:(?:xn--)|[a-z\u00a1-\uffff\U00010000-\U0010ffff0-9]-?)*[a-z\u00a1-\uffff\U00010000-\U0010ffff0-9]+)(?:\.(?:(?:xn--)|[a-z\u00a1-\uffff\U00010000-\U0010ffff0-9]-?)*[a-z\u00a1-\uffff\U00010000-\U0010ffff0-9]+)*(?:\.(?:(?:xn--[a-z\u00a1-\uffff\U00010000-\U0010ffff0-9]{2,})|[a-z\u00a1-\uffff\U00010000-\U0010ffff]{2,})))(?::\d{2,5})?(?:/[-a-z\u00a1-\uffff\U00010000-\U0010ffff0-9._~%!$&'()*+,;=:@/]*)?(?:\?\S*)?(?:#\S*)?$Fc                 |    t                               |           |sS ot          fddD                        S )a  
    Return whether or not given value is a valid URL.

    If the value is valid URL this function returns ``True``, otherwise
    :class:`~validators.utils.ValidationFailure`.

    This validator is based on the wonderful `URL validator of dperini`_.

    .. _URL validator of dperini:
        https://gist.github.com/dperini/729294

    Examples::

        >>> url('http://foobar.dk')
        True

        >>> url('ftp://foobar.dk')
        True

        >>> url('http://10.0.0.1')
        True

        >>> url('http://foobar.d')
        ValidationFailure(func=url, ...)

        >>> url('http://10.0.0.1', public=True)
        ValidationFailure(func=url, ...)

    .. versionadded:: 0.2

    .. versionchanged:: 0.10.2

        Added support for various exotic URLs and fixed various false
        positives.

    .. versionchanged:: 0.10.3

        Added ``public`` parameter.

    .. versionchanged:: 0.11.0

        Made the regular expression this function uses case insensitive.

    .. versionchanged:: 0.11.3

        Added support for URLs containing localhost

    :param value: URL address string to validate
    :param public: (default=False) Set True to only allow a public IP address
    c              3   f   K   | ]+}                                                     |          V  ,d S )N)	groupdictget).0keyresults     .lib/python3.11/site-packages/validators/url.py	<genexpr>zurl.<locals>.<genexpr>   s=      OO							$	$OOOOOO    )
private_ipprivate_host)patternmatchany)valuepublicr   s     @r   urlr   `   sZ    h ]]5!!F  #OOOO0NOOO   r   )F)reutilsr   ip_middle_octetip_last_octetcompileUNICODE
IGNORECASEregexr   r    r   r   <module>r       s(   				      9>

 '
' *0
0 3@
@C   #22 5BBE%% (77 :GGJ2 3234 546	5P	b JeS	 S	j "*U

 9 9 9 9 9 9r   