+
    )O|j·/  ã                  óZ  € ^ RI Ht ^ RIt^ RIHtHtHt ^RIHtH	t	H
t
Ht ^RIHtHtHt . R"OtR
 R lt]]R#,          ]]]3,          3,          t ]! R	]4      t  ! R R]4      t ! R R]4      t ! R R]4      t]P6                  ! R]P8                  ]P:                  ,          4      t]P6                  ! R]P:                  4      t]P6                  ! R]P:                  4      t ]P6                  ! R]PB                  4      t"RR/R R llt#R R lt$RR/R R llt%RR/R R llt&R  R! lt'R# )$é    )ÚannotationsN)ÚNewTypeÚUnionÚcast)Ú
InvalidTagÚTagÚUnsortedTagsErrorÚ	parse_tag)ÚInvalidVersionÚVersionÚ_TrimmedReleaseÚInvalidNameÚInvalidSdistFilenameÚInvalidWheelFilenameÚNormalizedNamec               ó   € V ^8„  d   QhRR/# )é   Úreturnz	list[str]© )Úformats   "ÚHC:\Users\alokc\chatbot\backend\venv\Lib\site-packages\packaging/utils.pyÚ__annotate__r      s   € ÷ ñ �ñ ó    c                 ó   € \         # )N)Ú__all__r   r   r   Ú__dir__r      s   € Ü€Nr   c                  ó   € ] tR t^.tRtRtR# )r   zg
An invalid distribution name; users should refer to the packaging user guide.

.. versionadded:: 23.2
r   N©Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__Ú__static_attributes__r   r   r   r   r   .   ó   † õr   c                  ó   € ] tR t^6tRtRtR# )r   z]
An invalid wheel filename was found, users should refer to PEP 427.

.. versionadded:: 20.9
r   Nr   r   r   r   r   r   6   r%   r   c                  ó   € ] tR t^>tRtRtR# )r   zn
An invalid sdist filename was found, users should refer to the packaging user guide.

.. versionadded:: 20.9
r   Nr   r   r   r   r   r   >   r%   r   z%[a-z0-9]|[a-z0-9][a-z0-9._-]*[a-z0-9]z[a-z0-9]+(?:-[a-z0-9]+)*z	(\d+)(.*)z
^[\w._]+\ZÚvalidateFc               ó$   € V ^8„  d   QhRRRRRR/# )r   ÚnameÚstrr(   Úboolr   r   r   )r   s   "r   r   r   R   s!   € ÷ *)ñ *)˜Cð *)¨dð *)¸~ñ *)r   c               ó  € V'       d+   \         P                  V 4      '       g   \        RV : 24      hV P                  4       P	                  RR4      P	                  RR4      pRV9   d   VP	                  RR4      pK  \        RV4      # )aÃ  
This function takes a valid Python package or extra name, and returns the
normalized form of it.

The return type is typed as :class:`NormalizedName`. This allows type
checkers to help require that a string has passed through this function
before use.

If **validate** is true, then the function will check if **name** is a valid
distribution name before normalizing.

:param str name: The name to normalize.
:param bool validate: Check whether the name is a valid distribution name.
:raises InvalidName: If **validate** is true and the name is not an
    acceptable distribution name.

>>> from packaging.utils import canonicalize_name
>>> canonicalize_name("Django")
'django'
>>> canonicalize_name("oslo.concurrency")
'oslo-concurrency'
>>> canonicalize_name("requests")
'requests'

.. versionadded:: 16.2

.. versionchanged:: 20.4
   The return type was changed to :class:`NormalizedName`.

.. versionchanged:: 23.2
   Added the *validate* keyword parameter.
zname is invalid: Ú_Ú-Ú.z--r   )Ú_validate_regexÚ	fullmatchr   ÚlowerÚreplacer   )r*   r(   Úvalues   &$ r   Úcanonicalize_namer6   R   sw   € ÷B œ×1Ñ1°$×7Ò7ÜÐ-¨d©XÐ6Ó7Ð7ð �J‰J‹L× Ñ   cÓ*×2Ñ2°3¸Ó<€Eà
�%Œ-Ø—‘˜d CÓ(ŠÜÐ  %Ó(Ð(r   c               ó    € V ^8„  d   QhRRRR/# )r   r*   r+   r   r,   r   )r   s   "r   r   r      s   € ÷ 9ñ 9˜Sð 9 Tñ 9r   c                ó0   € \         P                  V 4      RJ# )aí  
Check if a name is a normalized project name (i.e. a valid name that
:func:`canonicalize_name` would roundtrip to the same value).

The roundtrip only characterizes normalized names for *valid* names. A name
must start and end with an ASCII letter or digit, which
:func:`canonicalize_name` does not enforce: it leaves a leading or trailing
hyphen in place, so such a name roundtrips without being normalized.

:param str name: The name to check.

>>> from packaging.utils import canonicalize_name, is_normalized_name
>>> is_normalized_name("requests")
True
>>> is_normalized_name("Django")
False
>>> canonicalize_name("_not_legal")
'-not-legal'
>>> is_normalized_name("-not-legal")  # roundtrips, but not a valid name
False

.. versionadded:: 23.2
N)Ú_normalized_regexr2   )r*   s   &r   Úis_normalized_namer:      s   € ô0 ×&Ñ& tÓ,°DÐ8Ð8r   Ústrip_trailing_zeroTc               ó$   € V ^8„  d   QhRRRRRR/# )r   ÚversionzVersion | strr;   r,   r   r+   r   )r   s   "r   r   r   š   s)   € ÷ +Mñ +MØð+MØ48ð+Màñ+Mr   c               óÂ   € \        V \        4      '       d    \        V 4      p \        V'       d   \	        V 4      4      # T 4      #   \         d    \        T 4      u # i ; i)as  Return a canonical form of a version as a string.

This function takes a string representing a package version (or a
:class:`~packaging.version.Version` instance), and returns the
normalized form of it. By default, it strips trailing zeros from
the release segment.

>>> from packaging.utils import canonicalize_version
>>> canonicalize_version('1.0.1')
'1.0.1'

Per PEP 625, versions may have multiple canonical forms, differing
only by trailing zeros.

>>> canonicalize_version('1.0.0')
'1'
>>> canonicalize_version('1.0.0', strip_trailing_zero=False)
'1.0.0'

Invalid versions are returned unaltered.

>>> canonicalize_version('foo bar baz')
'foo bar baz'

>>> canonicalize_version('1.4.0.0.0')
'1.4'

.. versionadded:: 17.1

.. versionchanged:: 21.0
   The return type was narrowed to :class:`str`.

.. versionchanged:: 22.0
   Added the *strip_trailing_zero* keyword parameter.
)Ú
isinstancer+   r   r   r   )r=   r;   s   &$r   Úcanonicalize_versionr@   š   sY   € ôL �'œ3×Òð	 Ü˜gÓ&ˆGô ×+>Œ˜wÓ'ÓLÐLÀGÓLÐLøô ô 	 Ü�w“<Òð	 ús   ˜A ÁAÁAÚvalidate_orderc               ó$   € V ^8„  d   QhRRRRRR/# )r   Úfilenamer+   rA   r,   r   z8tuple[NormalizedName, Version, BuildTag, frozenset[Tag]]r   )r   s   "r   r   r   È   s-   € ÷ g(ñ g(Øðg(ð ðg(ð >ñ	g(r   c               óR  € V P                  R4      '       g   \        RV : 24      hV RR p V P                  R4      pVR9  d   \        RV : 24      hV P                  RV^,
          4      pV^ ,          pRV9   g   \        P                  V4      f   \        RV : 24      h\        V4      p \        V^,          4      pT^8X  dk   T^,          p\        P                  T4      p	T	f   \        R	T R
T : 24      h\        R\        T	P                  ^4      4      T	P                  ^4      34      p
MRp
TR,          p \        Y±R7      pYVY¬3#   \         d   p\        RT : 24      ThRp?ii ; i  \         d    \        RT : 24      Rh\         d    \        RT : 24      Rhi ; i)aÉ  
This function takes the filename of a wheel file, and parses it,
returning a tuple of name, version, build number, and tags.

The name part of the tuple is normalized and typed as
:class:`NormalizedName`. The version portion is an instance of
:class:`~packaging.version.Version`. The build number is ``()`` if
there is no build number in the wheel filename, otherwise a
two-item tuple of an integer for the leading digits and
a string for the rest of the build number. The tags portion is a
frozen set of :class:`~packaging.tags.Tag` instances (as the tag
string format allows multiple tags to be combined into a single
string).

If **validate_order** is true, compressed tag set components are
checked to be in sorted order as required by PEP 425.

:param str filename: The name of the wheel file.
:param bool validate_order: Check whether compressed tag set components
    are in sorted order.
:raises InvalidWheelFilename: If the filename in question
    does not follow the :ref:`wheel specification
    <pypug:binary-distribution-format>`.

>>> from packaging.utils import parse_wheel_filename
>>> from packaging.tags import Tag
>>> from packaging.version import Version
>>> name, ver, build, tags = parse_wheel_filename("foo-1.0-py3-none-any.whl")
>>> name
'foo'
>>> ver == Version('1.0')
True
>>> tags == {Tag("py3", "none", "any")}
True
>>> not build
True

.. versionadded:: 20.9

.. versionchanged:: 23.2
   Raises :class:`InvalidWheelFilename` when the version component is invalid.

.. versionadded:: 26.1
   The *validate_order* parameter.

.. versionchanged:: 26.3
   Raises :class:`InvalidWheelFilename` when an interpreter component is
   not an identifier, a tag set component is empty, or the project name is
   empty.
z.whlz3Invalid wheel filename (extension must be '.whl'): Nr/   z0Invalid wheel filename (wrong number of parts): Ú__zInvalid project name: z*Invalid wheel filename (invalid version): zInvalid build number: z in ÚBuildTag)rA   z\Invalid wheel filename (compressed tag set components must be in sorted order per PEP 425): z0Invalid wheel filename (invalid tag component): éüÿÿÿ)é   é   r   éÿÿÿÿ)Úendswithr   ÚcountÚsplitÚ_wheel_name_regexÚmatchr6   r   r   Ú_build_tag_regexr   ÚintÚgroupr
   r	   r   )rC   rA   ÚdashesÚpartsÚ	name_partr*   r=   ÚeÚ
build_partÚbuild_matchÚbuildÚtag_strÚtagss   &$           r   Úparse_wheel_filenamer\   È   sí  € ðn ×Ñ˜V×$Ò$Ü"ØAÀ(ÁÐNó
ð 	
ð ˜˜ˆ}€HØ�^‰^˜CÓ €FØ�VÔÜ"Ø>¸x¹lÐKó
ð 	
ð �N‰N˜3 ¨¥
Ó+€EØ�a•€IàˆyÔÔ-×3Ñ3°IÓ>ÒFÜ"Ð%;¸H¹<Ð#HÓIÐIÜ˜YÓ'€DðÜ˜% �(Ó#ˆð �„{Ø˜1•Xˆ
Ü&×,Ñ,¨ZÓ8ˆØÒÜ&Ø(¨¨°D¸¹ÐEóð ô �Z¤# k×&7Ñ&7¸Ó&:Ó";¸[×=NÑ=NÈqÓ=QÐ!RÓS‰àˆØ�B�i€Gð
Ü˜Ô@ˆð ˜5Ð'Ð'øô7 ô Ü"Ø8¸¹ÐEó
àð	ûðûô$ ô Ü"ð*Ø*2©ð7ó
ð ð	ô ô Ü"Ø>¸x¹lÐKó
àð	ðús*   Â.E Ä=E0 ÅE-ÅE(Å(E-Å0#F&ÆF&c               ó    € V ^8„  d   QhRRRR/# )r   rC   r+   r   ztuple[NormalizedName, Version]r   )r   s   "r   r   r   2  s   € ÷ @ñ @ 3ð @Ð+Iñ @r   c                óº  € V P                  R4      '       d   V R\        R4      )  pM6V P                  R4      '       d   V R\        R4      )  pM\        RV : 24      hVP                  R4      w  r#pV'       g   \        RV : 24      hV'       g   \        RV : 24      h\	        V4      p \        V4      pWV3#   \         d   p\        RT : 24      ThRp?ii ; i)	aÍ  
This function takes the filename of a sdist file (as specified
in the `Source distribution format`_ documentation), and parses
it, returning a tuple of the normalized name and version as
represented by an instance of :class:`~packaging.version.Version`.

:param str filename: The name of the sdist file.
:raises InvalidSdistFilename: If the filename does not end
    with an sdist extension (``.zip`` or ``.tar.gz``), if it does not
    contain a dash separating the name and the version of the distribution,
    if the project name is empty, or if the version portion is not a valid
    version.

>>> from packaging.utils import parse_sdist_filename
>>> from packaging.version import Version
>>> name, ver = parse_sdist_filename("foo-1.0.tar.gz")
>>> name
'foo'
>>> ver == Version('1.0')
True

.. versionadded:: 20.9

.. versionchanged:: 21.0
   Added support for ``.zip`` source distributions.

.. versionchanged:: 23.2
   Raises :class:`InvalidSdistFilename` when the version component is invalid.

.. versionchanged:: 26.3
   Raises :class:`InvalidSdistFilename` on an empty project name.

.. _Source distribution format: https://packaging.python.org/specifications/source-distribution-format/#source-distribution-file-name
z.tar.gzNz.zipz@Invalid sdist filename (extension must be '.tar.gz' or '.zip'): r/   zInvalid sdist filename: z-Invalid sdist filename (empty project name): z*Invalid sdist filename (invalid version): )rK   Úlenr   Ú
rpartitionr6   r   r   )rC   Ú	file_stemrU   ÚsepÚversion_partr*   r=   rV   s   &       r   Úparse_sdist_filenamerd   2  s   € ðF ×Ñ˜×#Ò#ØÐ.¤ I£˜Ð/‰	Ø	×	Ñ	˜6×	"Ò	"Ø˜^¤ F£˜|Ð,‰	ä"ðØ‰|ðó
ð 	
ð $-×#7Ñ#7¸Ó#<Ñ €I�LßÜ"Ð%=¸h¹\Ð#JÓKÐKßÜ"Ø;¸H¹<ÐHó
ð 	
ô ˜YÓ'€DðÜ˜,Ó'ˆð ˆ?Ðøô ô Ü"Ø8¸¹ÐEó
àð	ûðús   Â,B: Â:CÃCÃC)
rF   r   r   r   r   r6   r@   r:   rd   r\   r   )(Ú
__future__r   ÚreÚtypingr   r   r   r[   r   r   r	   r
   r=   r   r   r   r   r   ÚtuplerQ   r+   rF   r   Ú
ValueErrorr   r   r   ÚcompileÚ
IGNORECASEÚASCIIr1   r9   rP   ÚUNICODErN   r6   r:   r@   r\   rd   r   r   r   Ú<module>rn      s%  ðõ
 #ã 	ß 'Ñ 'ç ?Ó ?ß =Ñ =ò€õð ��r•˜E # s (�OÐ+Õ,€ðñ Ð)¨3Ó/€ðô�*ô ô˜:ô ô˜:ô ð —*’*Ø,¨b¯m©m¸b¿h¹hÕ.Fó€ð —J’JÐ:¸B¿H¹HÓEÐ à—:’:˜l¨B¯H©HÓ5Ð ð —J’J˜}¨b¯j©jÓ9Ð ð*)°U÷ *)õZ9ð6+MØ;?÷+Mð\g(ð !÷g(÷T@r   