Ë
    �ëi0ÿ  ã                  ó`  — U d Z ddlmZ ddlZddlZddlZddlZddlZddlZddlm	Z	m
Z
mZmZmZmZmZmZ ddlmZ ddlmZmZ g d¢Zd6d	„Z ed
«      Zeeef   Z ede¬«      Ze
eegef   Z ed«      Zded<   d7d„Z  G d„ dejB                  «      Z"ejF                   G d„ d«      «       Z$ejF                   G d„ d«      «       Z%ejF                   G d„ d«      «       Z&ejN                  reee$df   Z(e)e%e&f   Z* e%dd«      Z+ e&dd«      Z,e+e,ffZ-ded<   d8d„Z.	 	 	 	 	 	 d9d„Z/d:d„Z0d:d„Z1d;d „Z2d:d!„Z3d:d"„Z4d:d#„Z5	 	 	 	 d<d$„Z6 G d%„ d&e7«      Z8 G d'„ d(ejr                  ¬)«      Z: G d*„ d+e:«      Z; ejx                  d,«      Z=	 	 	 	 	 	 d=d-„Z>d>d.„Z?d?d/„Z@d@d0„ZAdAd1„ZBdBd2„ZCdCd3„ZD G d4„ d5e:«      ZEy)DzŠ
.. testsetup::

    from packaging.specifiers import Specifier, SpecifierSet, InvalidSpecifier
    from packaging.version import Version
é    )ÚannotationsN)ÚAnyÚCallableÚFinalÚIterableÚIteratorÚSequenceÚTypeVarÚUnioné   )Úcanonicalize_version)ÚInvalidVersionÚVersion)ÚBaseSpecifierÚInvalidSpecifierÚ	SpecifierÚSpecifierSetc                 ó   — t         S ©N)Ú__all__© ó    úT/var/www/html/chat/reports/venv/lib/python3.12/site-packages/packaging/specifiers.pyÚ__dir__r       s   € Ü€Nr   ÚTÚUnparsedVersionVar)Úboundz0.dev0zFinal[Version]Ú_MIN_VERSIONc                óŽ   — t        | «      }|dkD  r!| |dz
     dk(  r|dz  }|dkD  r| |dz
     dk(  rŒ|t        | «      k(  r| S | d| S )zDStrip trailing zeros from a release tuple for normalized comparison.r   r   N)Úlen)ÚreleaseÚends     r   Ú_trim_releaser#   -   s`   € ä
ˆg‹,€CØ
�Š'�g˜c A™gÑ&¨!Ò+Øˆq‰ˆð �Š'�g˜c A™gÑ&¨!Ó+àœS ›\Ò)ˆ7Ð<¨w°t¸¨}Ð<r   c                  óT   — e Zd ZdZ ej
                  «       Z ej
                  «       Zy)Ú_BoundaryKindz5Where a boundary marker sits in the version ordering.N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚenumÚautoÚAFTER_LOCALSÚAFTER_POSTSr   r   r   r%   r%   5   s   „ Ù?à�4—9‘9“;€LØ�$—)‘)“+�Kr   r%   c                  óD   — e Zd ZdZdZd
d„Zdd„Zdd„Zdd„Zdd„Z	dd„Z
y	)Ú_BoundaryVersiona  A point on the version line between two real PEP 440 versions.

    Some specifier semantics imply boundaries between real versions:
    ``<=1.0`` includes ``1.0+local`` and ``>1.0`` excludes
    ``1.0.post0``.  No real :class:`Version` falls on those boundaries,
    so this class creates values that sort between the real versions
    on either side.

    Two kinds exist, shown relative to a base version V::

        V < V+local < AFTER_LOCALS(V) < V.post0 < AFTER_POSTS(V)

    ``AFTER_LOCALS`` sits after V and every V+local, but before
    V.post0.  Upper bound of ``<=V``, ``==V``, ``!=V``.

    ``AFTER_POSTS`` sits after every V.postN, but before the next
    release segment.  Lower bound of ``>V`` (final or pre-release V)
    to exclude post-releases per PEP 440.
    )Ú_kindÚ_trimmed_releaseÚversionc                óT   — || _         || _        t        |j                  «      | _        y r   )r2   r0   r#   r!   r1   )Úselfr2   Úkinds      r   Ú__init__z_BoundaryVersion.__init__T   s!   € ØˆŒØˆŒ
Ü -¨g¯o©oÓ >ˆÕr   c                ó¸  — | j                   }|j                  |j                  k(  r;t        |j                  «      | j                  k(  r|j
                  |j
                  k(  sy| j                  t        j                  k(  r4|j                  |j                  k(  xr |j                  |j                  k(  S |j                  |j                  k(  xs |j                  duS )z6Is ``other`` a version that this boundary sorts above?FN)r2   Úepochr#   r!   r1   Úprer0   r%   r,   ÚpostÚdev)r4   ÚotherÚvs      r   Ú
_is_familyz_BoundaryVersion._is_familyY   s�   € à�L‰Lˆà�K‰K˜1Ÿ7™7Ò"Ü˜eŸm™mÓ,°×0EÑ0EÒEØ—	‘	˜QŸU™UÒ"àØ�:‰:œ×3Ñ3Ò3à—:‘: §¡Ñ'Ò>¨E¯I©I¸¿¹Ñ,>Ð>à�y‰y˜AŸE™EÑ!Ò; U§Z¡Z°tÐ%;Ð;r   c                ó–   — t        |t        «      r4| j                  |j                  k(  xr | j                  |j                  k(  S t        S r   )Ú
isinstancer/   r2   r0   ÚNotImplemented©r4   r<   s     r   Ú__eq__z_BoundaryVersion.__eq__h   s8   € Ü�eÔ-Ô.Ø—<‘< 5§=¡=Ñ0ÒN°T·Z±ZÀ5Ç;Á;Ñ5NÐNÜÐr   c                ó&  — t        |t        «      r_| j                  |j                  k7  r| j                  |j                  k  S | j                  j                  |j                  j                  k  S | j                  |«       xr | j                  |k  S r   )r@   r/   r2   r0   Úvaluer>   rB   s     r   Ú__lt__z_BoundaryVersion.__lt__m   so   € Ü�eÔ-Ô.Ø�|‰|˜uŸ}™}Ò,Ø—|‘| e§m¡mÑ3Ð3Ø—:‘:×#Ñ# e§k¡k×&7Ñ&7Ñ7Ð7Ø—?‘? 5Ó)Ð)ÒB¨d¯l©l¸UÑ.BÐBr   c                óD   — t        | j                  | j                  f«      S r   )Úhashr2   r0   ©r4   s    r   Ú__hash__z_BoundaryVersion.__hash__t   s   € Ü�T—\‘\ 4§:¡:Ð.Ó/Ð/r   c                ó|   — | j                   j                  › d| j                  ›d| j                  j                  › d�S )Nú(z, ú))Ú	__class__r&   r2   r0   ÚnamerI   s    r   Ú__repr__z_BoundaryVersion.__repr__w   s4   € Ø—.‘.×)Ñ)Ð*¨!¨D¯L©LÐ+;¸2¸d¿j¹j¿o¹oÐ=NÈaÐPÐPr   N)r2   r   r5   r%   ÚreturnÚNone)r<   r   rQ   Úbool©r<   ÚobjectrQ   rS   )r<   z_BoundaryVersion | VersionrQ   rS   ©rQ   Úint©rQ   Ústr)r&   r'   r(   r)   Ú	__slots__r6   r>   rC   rF   rJ   rP   r   r   r   r/   r/   <   s.   „ ñð( 9€Ió?ó
<óó
Có0ôQr   r/   c                  ó<   — e Zd ZdZdZd	d„Zd
d„Zdd„Zdd„Zdd„Z	y)Ú_LowerBoundzÂLower bound of a version range.

    A version *v* of ``None`` means unbounded below (-inf).
    At equal versions, ``[v`` sorts before ``(v`` because an inclusive
    bound starts earlier.
    ©Ú	inclusiver2   c                ó    — || _         || _        y r   ©r2   r^   ©r4   r2   r^   s      r   r6   z_LowerBound.__init__†   ó   € ØˆŒØ"ˆ�r   c                ó–   — t        |t        «      st        S | j                  |j                  k(  xr | j                  |j                  k(  S r   ©r@   r\   rA   r2   r^   rB   s     r   rC   z_LowerBound.__eq__Š   ó7   € Ü˜%¤Ô-Ü!Ð!Ø�|‰|˜uŸ}™}Ñ,ÒR°·±À5Ç?Á?Ñ1RÐRr   c                ó  — t        |t        «      st        S | j                  €|j                  d uS |j                  €y| j                  |j                  k7  r| j                  |j                  k  S | j                  xr |j                   S )NFrd   rB   s     r   rF   z_LowerBound.__lt__�   sq   € Ü˜%¤Ô-Ü!Ð!à�<‰<ÐØ—=‘=¨Ð,Ð,Ø�=‰=Ð ØØ�<‰<˜5Ÿ=™=Ò(Ø—<‘< %§-¡-Ñ/Ð/à�~‰~Ò5 e§o¡oÐ"5Ð5r   c                óD   — t        | j                  | j                  f«      S r   ©rH   r2   r^   rI   s    r   rJ   z_LowerBound.__hash__œ   ó   € Ü�T—\‘\ 4§>¡>Ð2Ó3Ð3r   c                ót   — | j                   rdnd}d| j                  j                  › d|› | j                  ›d�S )Nú[rL   ú<ú ú>©r^   rN   r&   r2   ©r4   Úbrackets     r   rP   z_LowerBound.__repr__Ÿ   s8   € ØŸš‘#¨SˆØ�4—>‘>×*Ñ*Ð+¨1¨W¨I°d·l±lÐ5EÀQÐGÐGr   N©r2   Ú_VersionOrBoundaryr^   rS   rQ   rR   rT   )r<   r\   rQ   rS   rV   rX   ©
r&   r'   r(   r)   rZ   r6   rC   rF   rJ   rP   r   r   r   r\   r\   {   ó)   „ ñð )€Ió#óSó
6ó4ôHr   r\   c                  ó<   — e Zd ZdZdZd	d„Zd
d„Zdd„Zdd„Zdd„Z	y)Ú_UpperBoundzÀUpper bound of a version range.

    A version *v* of ``None`` means unbounded above (+inf).
    At equal versions, ``v)`` sorts before ``v]`` because an exclusive
    bound ends earlier.
    r]   c                ó    — || _         || _        y r   r`   ra   s      r   r6   z_UpperBound.__init__¯   rb   r   c                ó–   — t        |t        «      st        S | j                  |j                  k(  xr | j                  |j                  k(  S r   ©r@   rw   rA   r2   r^   rB   s     r   rC   z_UpperBound.__eq__³   re   r   c                óü   — t        |t        «      st        S | j                  €y|j                  €y| j                  |j                  k7  r| j                  |j                  k  S | j                   xr |j                  S ©NFTrz   rB   s     r   rF   z_UpperBound.__lt__¸   se   € Ü˜%¤Ô-Ü!Ð!à�<‰<ÐØØ�=‰=Ð ØØ�<‰<˜5Ÿ=™=Ò(Ø—<‘< %§-¡-Ñ/Ð/à—>‘>Ð!Ò5 e§o¡oÐ5r   c                óD   — t        | j                  | j                  f«      S r   rh   rI   s    r   rJ   z_UpperBound.__hash__Å   ri   r   c                ót   — | j                   rdnd}d| j                  j                  › d| j                  ›|› d�S )Nú]rM   rl   rm   rn   ro   rp   s     r   rP   z_UpperBound.__repr__È   s8   € ØŸš‘#¨SˆØ�4—>‘>×*Ñ*Ð+¨1¨T¯\©\Ð,<¸W¸IÀQÐGÐGr   Nrr   rT   )r<   rw   rQ   rS   rV   rX   rt   r   r   r   rw   rw   ¤   ru   r   rw   Fztuple[_VersionRange]Ú_FULL_RANGEc                óÎ   — | j                   �|j                   €y| j                   |j                   k(  r| j                  xr |j                   S | j                   |j                   kD  S )zHTrue when the range defined by *lower* and *upper* contains no versions.Fr`   )ÚlowerÚuppers     r   Ú_range_is_emptyr„   Ù   sQ   € à‡}�}Ð §¡Ð 5ØØ‡}�}˜Ÿ™Ò%Ø—O‘OÒ7¨¯©Ð8Ð8Ø�=‰=˜5Ÿ=™=Ñ(Ð(r   c                ó2  — g }dx}}|t        | «      k  r‚|t        |«      k  rt| |   \  }}||   \  }}t        ||«      }	t        ||«      }
t        |	|
«      s|j	                  |	|
f«       ||k  r|dz  }n|dz  }|t        | «      k  r|t        |«      k  rŒt|S )zFIntersect two sorted, non-overlapping range lists (two-pointer merge).r   r   )r    ÚmaxÚminr„   Úappend)ÚleftÚrightÚresultÚ
left_indexÚright_indexÚ
left_lowerÚ
left_upperÚright_lowerÚright_upperr‚   rƒ   s              r   Ú_intersect_rangesr’   â   s·   € ð
 #%€FØ Ð €J�Ø
”s˜4“yÒ
  [´3°u³:Ò%=Ø!% jÑ!1Ñˆ
�JØ#(¨Ñ#5Ñ ˆ�[ä�J Ó,ˆÜ�J Ó,ˆä˜u eÔ,Ø�M‰M˜5 %˜.Ô)ð ˜Ò#Ø˜!‰O‰Jà˜1ÑˆKð ”s˜4“yÒ
  [´3°u³:Ó%=ð  €Mr   c                óŽ   — g | j                   dd ¢| j                   d   dz   ‘­}t        j                  | j                  |d¬«      S )z5Smallest version in the next prefix: 1.2 -> 1.3.dev0.Néÿÿÿÿr   r   ©r8   r!   r;   )r!   r   Ú
from_partsr8   )r2   r!   s     r   Ú_next_prefix_dev0r—   ü   sC   € à>�—‘  Ð$Ð> g§o¡o°bÑ&9¸AÑ&=Ñ>€GÜ×Ñ G§M¡M¸7ÈÔJÐJr   c                óZ   — t        j                  | j                  | j                  d¬«      S )z7The .dev0 of a version's base release: 1.2 -> 1.2.dev0.r   r•   )r   r–   r8   r!   ©r2   s    r   Ú
_base_dev0rš     s    € ä×Ñ G§M¡M¸7¿?¹?ÐPQÔRÐRr   c                ó`   — t        | t        «      s	 t        | «      } | S | S # t        $ r Y y w xY wr   )r@   r   r   r™   s    r   Ú_coerce_versionrœ     s:   € Ü�gœwÔ'ð	Ü˜gÓ&ˆGð €Nˆ7€Nøô ò 	Ùð	ús   ’! ¡	-¬-c                óB   — | j                   €| S | j                  d ¬«      S )N)Úlocal)rž   Ú__replace__r™   s    r   Ú_public_versionr      s%   € Ø‡}�}ÐØˆØ×Ñ TÐÓ*Ð*r   c                ó*   — | j                  ddd¬«      S )zyThe version that *version* is a post-release of.

    1.0.post1 -> 1.0, 1.0a1.post0 -> 1.0a1, 1.0.post0.dev1 -> 1.0.
    N©r:   r;   rž   ©rŸ   r™   s    r   Ú
_post_baser¤     s   € ð
 ×Ñ D¨d¸$ÐÓ?Ð?r   c                ó(   — | j                  dd¬«      S )zZEarliest pre-release of *version*.

    1.2 -> 1.2.dev0, 1.2.post1 -> 1.2.post1.dev0.
    r   N©r;   rž   r£   r™   s    r   Ú_earliest_prereleaser§     s   € ð
 ×Ñ 1¨DÐÓ1Ð1r   c                ó$  — | €yt        | t        «      r\| j                  }|j                  r|j	                  ddd¬«      S |j
                  �|j
                  dz   nd}|j	                  |d¬«      S | j                  s| S | j	                  ddd¬«      S )z:Smallest non-pre-release version at or above *v*, or None.N)r9   r;   rž   r   r   )r:   rž   )r@   r/   r2   Úis_prereleaserŸ   r:   )r=   ÚinnerÚks      r   Ú_nearest_non_prereleaser¬   &  s’   € ð 	€yØÜ�!Ô%Ô&Ø—	‘	ˆØ×Òà×$Ñ$¨°4¸tÐ$ÓDÐDð !&§
¡
Ð 6ˆU�Z‰Z˜!Š^¸AˆØ× Ñ  a¨tÐ Ó4Ð4Ø�?Š?Øˆà�=‰=˜T t°4ˆ=Ó8Ð8r   c                  ó   — e Zd ZdZy)r   a  
    Raised when attempting to create a :class:`Specifier` with a specifier
    string that is invalid.

    >>> Specifier("lolwat")
    Traceback (most recent call last):
        ...
    packaging.specifiers.InvalidSpecifier: Invalid specifier: 'lolwat'
    N)r&   r'   r(   r)   r   r   r   r   r   ;  s   „ òr   r   c                  óÄ  — e Zd ZdZdZedd„«       Zej                  dd„«       Z	ej                  dd„«       Z
ej                  dd„«       Zeej                  dd„«       «       Zej                  dd„«       Zej                  ddd
„«       Zej                   	 	 d	 	 	 	 	 	 	 dd„«       Zej                   	 	 d	 	 	 	 	 	 	 dd„«       Zej                  	 	 d	 	 	 	 	 	 	 dd„«       Zy	)r   r   )Ú_strc                ó   — t        | «      S )z Internal property for match_args©rY   rI   s    r   r¯   zBaseSpecifier._strK  s   € ô �4‹yÐr   c                 ó   — y)zŽ
        Returns the str representation of this Specifier-like object. This
        should be representative of the Specifier itself.
        Nr   rI   s    r   Ú__str__zBaseSpecifier.__str__P  ó   � r   c                 ó   — y)zF
        Returns a hash value for this Specifier-like object.
        Nr   rI   s    r   rJ   zBaseSpecifier.__hash__W  r´   r   c                 ó   — y)z«
        Returns a boolean representing whether or not the two Specifier-like
        objects are equal.

        :param other: The other object to check against.
        Nr   rB   s     r   rC   zBaseSpecifier.__eq__]  r´   r   c                 ó   — y)zîWhether or not pre-releases as a whole are allowed.

        This can be set to either ``True`` or ``False`` to explicitly enable or disable
        prereleases or it can be set to ``None`` (the default) to use default semantics.
        Nr   rI   s    r   ÚprereleaseszBaseSpecifier.prereleasesf  r´   r   c                 ó   — y)zQSetter for :attr:`prereleases`.

        :param value: The value to set.
        Nr   ©r4   rE   s     r   r¸   zBaseSpecifier.prereleaseso  r´   r   Nc                 ó   — y)zR
        Determines if the given item is contained within this specifier.
        Nr   ©r4   Úitemr¸   s      r   ÚcontainszBaseSpecifier.containsv  r´   r   c                 ó   — y r   r   ©r4   Úiterabler¸   Úkeys       r   ÚfilterzBaseSpecifier.filter|  ó   € ð (+r   c                 ó   — y r   r   rÀ   s       r   rÃ   zBaseSpecifier.filter„  ó   € ð r   c                 ó   — y)z•
        Takes an iterable of items and filters them so that only items which
        are contained within this specifier are allowed in it.
        Nr   rÀ   s       r   rÃ   zBaseSpecifier.filterŒ  r´   r   rX   rV   rT   ©rQ   úbool | None)rE   rS   rQ   rR   r   )r½   rY   r¸   rÉ   rQ   rS   ©N.©rÁ   zIterable[UnparsedVersionVar]r¸   rÉ   rÂ   rR   rQ   zIterator[UnparsedVersionVar]©rÁ   zIterable[T]r¸   rÉ   rÂ   zCallable[[T], UnparsedVersion]rQ   zIterator[T]©NN©rÁ   úIterable[Any]r¸   rÉ   rÂ   ú'Callable[[Any], UnparsedVersion] | NonerQ   úIterator[Any])r&   r'   r(   rZ   Ú__match_args__Úpropertyr¯   ÚabcÚabstractmethodr³   rJ   rC   r¸   Úsetterr¾   ÚtypingÚoverloadrÃ   r   r   r   r   r   G  s–  „ Ø€IØ€Nàòó ðð 	×Ñòó ðð 	×Ñòó ðð
 	×Ñòó ðð Ø×Ñòó ó ðð ×Ñòó ðð 	×Ñóó ðð
 ‡_�_ð $(Øð	+à.ð+ð !ð+ð ð	+ð
 
&ò+ó ð+ð ‡_�_ð $(Ø.1ð	àðð !ðð ,ð	ð
 
òó ðð 	×Ñð $(Ø7;ð		àð	ð !ð	ð 5ð		ð
 
ò	ó ñ	r   r   )Ú	metaclassc            	      óL  — e Zd ZU dZdZdZ ej                  dez   dz   ej                  ej                  z  «      Z
ddddd	d
dddœZded<   d/d0d„Zd1d„Zd2d„Zd3d„Zd4d„Zd4d„Zed5d„«       Zej*                  d6d„«       Zed7d„«       Zed7d„«       Zd7d„Zd7d„Zed8d„«       Zd9d„Zd:d„Zd;d „Zd<d!„Zd=d"„Zd<d#„Z d<d$„Z!d<d%„Z"d<d&„Z#d>d'„Z$d>d(„Z%d?d)„Z&d@d*„Z'dAdBd+„Z(e)jT                  	 	 dC	 	 	 	 	 	 	 dDd,„«       Z+e)jT                  	 	 dC	 	 	 	 	 	 	 dEd-„«       Z+	 	 dF	 	 	 	 	 	 	 dGd.„Z+y)Hr   a?  This class abstracts handling of version specifiers.

    .. tip::

        It is generally not required to instantiate this manually. You should instead
        prefer to work with :class:`SpecifierSet` instead, which can parse
        comma-separated version specifiers (which is what package metadata contains).
    )Ú_prereleasesÚ_rangesÚ_specÚ_spec_versionÚ_wildcard_splita  
        (?:
            (?:
                # The identity operators allow for an escape hatch that will
                # do an exact string match of the version you wish to install.
                # This will not be parsed by PEP 440 and we cannot determine
                # any semantic meaning from it. This operator is discouraged
                # but included entirely as an escape hatch.
                ===  # Only match for the identity operator
                \s*
                [^\s;)]*  # The arbitrary version can be just about anything,
                          # we match everything except for whitespace, a
                          # semi-colon for marker support, and a closing paren
                          # since versions can be enclosed in them.
            )
            |
            (?:
                # The (non)equality operators allow for wild card and local
                # versions to be specified so we have to define these two
                # operators separately to enable that.
                (?:==|!=)            # Only match for equals and not equals

                \s*
                v?
                (?:[0-9]+!)?          # epoch
                [0-9]+(?:\.[0-9]+)*   # release

                # You cannot use a wild card and a pre-release, post-release, a dev or
                # local version together so group them with a | and make them optional.
                (?:
                    \.\*  # Wild card syntax of .*
                    |
                    (?a:                                  # pre release
                        [-_\.]?
                        (alpha|beta|preview|pre|a|b|c|rc)
                        [-_\.]?
                        [0-9]*
                    )?
                    (?a:                                  # post release
                        (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*)
                    )?
                    (?a:[-_\.]?dev[-_\.]?[0-9]*)?         # dev release
                    (?a:\+[a-z0-9]+(?:[-_\.][a-z0-9]+)*)? # local
                )?
            )
            |
            (?:
                # The compatible operator requires at least two digits in the
                # release segment.
                (?:~=)               # Only match for the compatible operator

                \s*
                v?
                (?:[0-9]+!)?          # epoch
                [0-9]+(?:\.[0-9]+)+   # release  (We have a + instead of a *)
                (?:                   # pre release
                    [-_\.]?
                    (alpha|beta|preview|pre|a|b|c|rc)
                    [-_\.]?
                    [0-9]*
                )?
                (?:                                   # post release
                    (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*)
                )?
                (?:[-_\.]?dev[-_\.]?[0-9]*)?          # dev release
            )
            |
            (?:
                # All other operators only allow a sub set of what the
                # (non)equality operators do. Specifically they do not allow
                # local versions to be specified nor do they allow the prefix
                # matching wild cards.
                (?:<=|>=|<|>)

                \s*
                v?
                (?:[0-9]+!)?          # epoch
                [0-9]+(?:\.[0-9]+)*   # release
                (?a:                   # pre release
                    [-_\.]?
                    (alpha|beta|preview|pre|a|b|c|rc)
                    [-_\.]?
                    [0-9]*
                )?
                (?a:                                   # post release
                    (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*)
                )?
                (?a:[-_\.]?dev[-_\.]?[0-9]*)?          # dev release
            )
        )
        z\s*Ú
compatibleÚequalÚ	not_equalÚless_than_equalÚgreater_than_equalÚ	less_thanÚgreater_thanÚ	arbitrary)ú~=ú==ú!=ú<=ú>=rl   rn   ú===r   Ú
_operatorsNc                ó˜  — | j                   j                  |«      st        d|›�«      ‚|j                  «       }|j	                  d«      r|dd |dd j                  «       }}nB|j	                  d«      r|dd |dd j                  «       }}n|dd |dd j                  «       }}||f| _        || _        d| _        d| _        d| _	        y)að  Initialize a Specifier instance.

        :param spec:
            The string representation of a specifier which will be parsed and
            normalized before use.
        :param prereleases:
            This tells the specifier if it should accept prerelease versions if
            applicable or not. The default of ``None`` will autodetect it from the
            given specifiers.
        :raises InvalidSpecifier:
            If the given specifier is invalid (i.e. bad syntax).
        zInvalid specifier: rí   Né   )rè   ré   rê   rë   rì   é   r   )
Ú_regexÚ	fullmatchr   ÚstripÚ
startswithrÝ   rÛ   rÞ   rß   rÜ   )r4   Úspecr¸   Úoperatorr2   s        r   r6   zSpecifier.__init__  sÕ   € ð �{‰{×$Ñ$ TÔ*Ü"Ð%8¸¸Ð#AÓBÐBà�z‰z‹|ˆØ�?‰?˜5Ô!Ø $ R a ¨$¨q¨r¨(¯.©.Ó*:�g‰HØ�_‰_Ð;Ô<Ø $ R a ¨$¨q¨r¨(¯.©.Ó*:�g‰Hà $ R a ¨$¨q¨r¨(¯.©.Ó*:�gˆHà'/°Ð&9ˆŒ
ð (ˆÔð :>ˆÔð >BˆÔð 8<ˆ�r   c                óŽ   — | j                   �!| j                   d   |k(  r| j                   d   S t        |«      }|€y||f| _         |S )zDOne element cache, as only one spec Version is needed per Specifier.Nr   r   )rÞ   rœ   )r4   r2   Úversion_specifiers      r   Ú_get_spec_versionzSpecifier._get_spec_version<  sY   € à×ÑÐ)¨d×.@Ñ.@ÀÑ.CÀwÒ.NØ×%Ñ% aÑ(Ð(ä+¨GÓ4ÐØÐ$Øà%Ð'8Ð9ˆÔØ Ð r   c                ó0   — | j                  |«      }|€J ‚|S )zÕGet spec version, asserting it's valid (not for === operator).

        This method should only be called for operators where version
        strings are guaranteed to be valid PEP 440 versions (not ===).
        )rú   )r4   r2   Úspec_versions      r   Ú_require_spec_versionzSpecifier._require_spec_versionH  s&   € ð ×-Ñ-¨gÓ6ˆØÐ'Ð'Ð'ØÐr   c                ó  — | j                   �| j                   S | j                  }| j                  }|dk(  rt        | _         t        S |j	                  d«      r| j                  ||«      }n| j                  ||«      }|| _         |S )zØConvert this specifier to sorted, non-overlapping version ranges.

        Each standard operator maps to one or two ranges.  ``===`` is
        modeled as full range (actual check done separately).  Cached.
        rí   ú.*)rÜ   r÷   r2   r€   ÚendswithÚ_wildcard_rangesÚ_standard_ranges)r4   ÚopÚver_strr‹   s       r   Ú
_to_rangeszSpecifier._to_rangesR  s|   € ð �<‰<Ð#Ø—<‘<Ðà�]‰]ˆØ—,‘,ˆà�Š;Ü&ˆDŒLÜÐà×Ñ˜DÔ!Ø×*Ñ*¨2¨wÓ7‰Fà×*Ñ*¨2¨wÓ7ˆFàˆŒØˆr   c                óÚ   — | j                  |d d «      }t        |«      }t        |«      }|dk(  rt        |d«      t	        |d«      fgS t
        t	        |d«      ft        |d«      t        fgS )Néþÿÿÿré   TF)rý   rš   r—   r\   rw   Ú_NEG_INFÚ_POS_INF)r4   r  r  Úbaser‚   rƒ   s         r   r  zSpecifier._wildcard_rangesj  sy   € à×)Ñ)¨'°#°2¨,Ó7ˆÜ˜4Ó ˆÜ! $Ó'ˆØ�Š:Ü  ¨Ó-¬{¸5À%Ó/HÐIÐJÐJô ”{ 5¨%Ó0Ð1Ü˜ Ó%¤xÐ0ð
ð 	
r   c                ó  — | j                  |«      }|dk(  rt        |d«      t        fgS |dk(  r+t        t	        t        |t        j                  «      d«      fgS |dk(  rª|j                  �3|j                  |j                  dz   d ¬«      }t        |d«      t        fgS |j                  �4|j                  |j                  dz   dd ¬«      }t        |d«      t        fgS t        t        |t        j                  «      d	«      t        fgS |d
k(  r?|j                  r|n|j                  dd ¬«      }|t        k  rg S t        t	        |d	«      fgS d|v }t        |t        j                  «      }|r|n|}|dk(  rt        |d«      t	        |d«      fgS |dk(  r$t        t	        |d	«      ft        |d	«      t        fgS |dk(  rA|j                  |j                  d d ¬«      }	t        |d«      t	        t        |	«      d	«      fgS t!        d|›�«      ‚)Nrì   Trë   rn   r   r¦   r   r¢   Frl   ú+ré   rê   rè   r”   )r!   úUnknown operator: )rý   r\   r	  r  rw   r/   r%   r,   r;   rŸ   r:   r-   r©   r   r!   r—   Ú
ValueError)
r4   r  r  r=   Ú	lower_verr   Ú	has_localÚafter_localsrƒ   Úprefixs
             r   r  zSpecifier._standard_rangesw  s+  € Ø×&Ñ& wÓ/ˆà�Š:Ü   DÓ)¬8Ð4Ð5Ð5à�Š:ô ÜÔ 0°´M×4NÑ4NÓ OÐQUÓVððð ð �Š9Ø�u‰uÐ ð ŸM™M¨a¯e©e°a©i¸t˜MÓD�	Ü$ Y°Ó5´xÐ@ÐAÐAØ�v‰vÐ!àŸM™M¨q¯v©v¸©z¸qÈ˜MÓM�	Ü$ Y°Ó5´xÐ@ÐAÐAô  Ô 0°´M×4MÑ4MÓ NÐPUÓVÜððð ð �Š9ð Ÿš‘A¨a¯m©mÀÈ¨mÓ.NˆEØœÒ$Ø�	Üœ{¨5°%Ó8Ð9Ð:Ð:ð ˜7�Nˆ	Ü'¨¬=×+EÑ+EÓFˆÙ‘ Lˆà�Š:Ü   DÓ)¬;°u¸dÓ+CÐDÐEÐEà�Š:äœ; q¨%Ó0Ð1Ü˜U EÓ*¬HÐ5ðð ð
 �Š:Ø—]‘]¨1¯9©9°S°b¨>�]Ó:ˆFä˜Q Ó%¤{Ô3DÀVÓ3LÈeÓ'TÐUðð ô Ð-¨b¨VÐ4Ó5Ð5r   c                óÊ   — | j                   �| j                   S | j                  \  }}|dk(  ry|dk(  r|j                  d«      ry| j                  |«      }|€y |j                  S )Nrê   Fré   rÿ   )rÛ   rÝ   r   rú   r©   )r4   r÷   Úversion_strr2   s       r   r¸   zSpecifier.prereleasesµ  sy   € ð ×ÑÐ(Ø×$Ñ$Ð$ð !%§
¡
Ñˆ�+Ø�tÒØð �tÒ × 4Ñ 4°TÔ :Øð ×(Ñ(¨Ó5ˆØˆ?Øð ×$Ñ$Ð$r   c                ó   — || _         y r   )rÛ   rº   s     r   r¸   zSpecifier.prereleasesÑ  s
   € à!ˆÕr   c                ó    — | j                   d   S )z`The operator of this specifier.

        >>> Specifier("==1.2.3").operator
        '=='
        r   ©rÝ   rI   s    r   r÷   zSpecifier.operatorÕ  ó   € ð �z‰z˜!‰}Ðr   c                ó    — | j                   d   S )zaThe version of this specifier.

        >>> Specifier("==1.2.3").version
        '1.2.3'
        r   r  rI   s    r   r2   zSpecifier.versionÞ  r  r   c                óŒ   — | j                   �d| j                  ›�nd}d| j                  j                  › dt	        | «      ›|› d�S )aT  A representation of the Specifier that shows all internal state.

        >>> Specifier('>=1.0.0')
        <Specifier('>=1.0.0')>
        >>> Specifier('>=1.0.0', prereleases=False)
        <Specifier('>=1.0.0', prereleases=False)>
        >>> Specifier('>=1.0.0', prereleases=True)
        <Specifier('>=1.0.0', prereleases=True)>
        ú, prereleases=Ú rl   rL   ú)>©rÛ   r¸   rN   r&   rY   ©r4   r9   s     r   rP   zSpecifier.__repr__ç  sU   € ð × Ñ Ð,ð ˜T×-Ñ-Ð0Ñ1àð 	ð �4—>‘>×*Ñ*Ð+¨1¬S°«Y¨M¸#¸¸bÐAÐAr   c                ó4   —  dj                   | j                  Ž S )zÐA string representation of the Specifier that can be round-tripped.

        >>> str(Specifier('>=1.0.0'))
        '>=1.0.0'
        >>> str(Specifier('>=1.0.0', prereleases=False))
        '>=1.0.0'
        z{}{})ÚformatrÝ   rI   s    r   r³   zSpecifier.__str__ù  s   € ð ˆv�}‰}˜dŸj™jÐ)Ð)r   c                óž   — | j                   \  }}|dk(  s|j                  d«      r||fS | j                  |«      }t        ||dk7  ¬«      }||fS )Nrí   rÿ   rè   ©Ústrip_trailing_zero)rÝ   r   rý   r   )r4   r÷   r2   rü   Úcanonical_versions        r   Ú_canonical_speczSpecifier._canonical_spec  sc   € à ŸJ™JÑˆ�'Ø�uÒ × 0Ñ 0°Ô 6Ø˜WÐ$Ð$à×1Ñ1°'Ó:ˆä0Ø¨x¸4Ñ/?ô
Ðð Ð*Ð*Ð*r   c                ó,   — t        | j                  «      S r   )rH   r&  rI   s    r   rJ   zSpecifier.__hash__  s   € Ü�D×(Ñ(Ó)Ð)r   c                óî   — t        |t        «      r	 | j                  t        |«      «      }nt        || j                  «      st        S | j
                  |j
                  k(  S # t        $ r	 t        cY S w xY w)a>  Whether or not the two Specifier-like objects are equal.

        :param other: The other object to check against.

        The value of :attr:`prereleases` is ignored.

        >>> Specifier("==1.2.3") == Specifier("== 1.2.3.0")
        True
        >>> (Specifier("==1.2.3", prereleases=False) ==
        ...  Specifier("==1.2.3", prereleases=True))
        True
        >>> Specifier("==1.2.3") == "==1.2.3"
        True
        >>> Specifier("==1.2.3") == Specifier("==1.2.4")
        False
        >>> Specifier("==1.2.3") == Specifier("~=1.2.3")
        False
        )r@   rY   rN   r   rA   r&  rB   s     r   rC   zSpecifier.__eq__  si   € ô& �eœSÔ!ð&ØŸ™¤s¨5£zÓ2‘ô ˜E 4§>¡>Ô2Ü!Ð!à×#Ñ# u×'<Ñ'<Ñ<Ð<øô $ò &Ü%Ò%ð&ús   ’A" Á"A4Á3A4c                ó>   — t        | d| j                  |   › �«      }|S )NÚ	_compare_)Úgetattrrî   )r4   r  Úoperator_callables      r   Ú_get_operatorzSpecifier._get_operator1  s+   € Ü.5Ø�I˜dŸo™o¨bÑ1Ð2Ð3ó/
Ðð !Ð r   c           
     óÈ   — t        t        t        j                  t        t        |«      «      «      d d «      }|dz  }| j                  ||«      xr | j                  ||«      S )Nr”   rÿ   )Ú_version_joinÚlistÚ	itertoolsÚ	takewhileÚ_is_not_suffixÚ_version_splitÚ_compare_greater_than_equalÚ_compare_equal)r4   Úprospectiverö   r  s       r   Ú_compare_compatiblezSpecifier._compare_compatible7  sd   € ô Ü”×$Ñ$¤^´^ÀDÓ5IÓJÓKÈCÈRÐPó
ˆð
 	�$‰ˆà×0Ñ0°¸dÓCò 
Ø×Ñ ¨VÓ4ð	
r   c                ó€   — | j                   }|€/t        |dd d¬«      }t        |«      }|t        |«      f}|| _         |S )zýCached split of a wildcard spec into components and numeric length.

        >>> Specifier("==1.*")._get_wildcard_split("1.*")
        (['0', '1'], 2)
        >>> Specifier("==3.10.*")._get_wildcard_split("3.10.*")
        (['0', '3', '10'], 3)
        Nr  Fr#  )rß   r   r4  Ú_numeric_prefix_len)r4   rö   Úwildcard_splitÚ
normalizedÚ
split_specs        r   Ú_get_wildcard_splitzSpecifier._get_wildcard_splitK  sO   € ð ×-Ñ-ˆØÐ!Ü-¨d°3°B¨iÈUÔSˆJÜ'¨
Ó3ˆJØ(Ô*=¸jÓ*IÐJˆNØ#1ˆDÔ ØÐr   c                ó&  — |j                  d«      rT| j                  |«      \  }}t        t        |«      d¬«      }t	        |«      }t        ||«      }|d t        |«       }||k(  S | j                  |«      }	|	j                  st        |«      }||	k(  S )Nrÿ   Fr#  )	r   r>  r   r    r4  Ú	_left_padr    rý   rž   )
r4   r7  rö   r=  Úspec_numeric_lenÚnormalized_prospectiveÚsplit_prospectiveÚpadded_prospectiveÚshortened_prospectiverü   s
             r   r6  zSpecifier._compare_equal[  s«   € à�=‰=˜ÔØ+/×+CÑ+CÀDÓ+IÑ(ˆJÐ(ô &:Ü Ó,À%ô&Ð"ô !/Ð/EÓ FÐô "+Ð+<Ð>NÓ!OÐð
 %7Ð7H¼¸Z»Ð$IÐ!à(¨JÑ6Ð6ð  ×5Ñ5°dÓ;ˆLð
  ×%Ò%Ü-¨kÓ:�à ,Ñ.Ð.r   c                ó(   — | j                  ||«       S r   )r6  ©r4   r7  rö   s      r   Ú_compare_not_equalzSpecifier._compare_not_equal  s   € Ø×&Ñ& {°DÓ9Ð9Ð9r   c                ó<   — t        |«      | j                  |«      k  S r   ©r    rý   rG  s      r   Ú_compare_less_than_equalz"Specifier._compare_less_than_equal‚  ó   € ô ˜{Ó+¨t×/IÑ/IÈ$Ó/OÑOÐOr   c                ó<   — t        |«      | j                  |«      k\  S r   rJ  rG  s      r   r5  z%Specifier._compare_greater_than_equalˆ  rL  r   c                ó€   — | j                  |«      }||k  sy|j                  s|j                  r|t        |«      k\  ryyr|   )rý   r©   r§   ©r4   r7  Úspec_strrö   s       r   Ú_compare_less_thanzSpecifier._compare_less_thanŽ  sK   € ð ×)Ñ)¨(Ó3ˆð
 ˜TÒ!Øð
 ×"Ò"Ø×)Ò)ØÔ3°DÓ9Ò9àð
 r   c                ó¶   — | j                  |«      }||kD  sy|j                  s|j                  rt        |«      |k(  ry|j                  �t	        |«      |k(  ryyr|   )rý   Úis_postreleaser¤   rž   r    rO  s       r   Ú_compare_greater_thanzSpecifier._compare_greater_than§  sg   € ð ×)Ñ)¨(Ó3ˆð
 ˜TÒ!Øð
 ×#Ò#Ø×*Ò*Ü˜;Ó'¨4Ò/àð ×ÑÐ(¬_¸[Ó-IÈTÒ-QØð
 r   c                óh   — t        |«      j                  «       t        |«      j                  «       k(  S r   ©rY   r‚   rG  s      r   Ú_compare_arbitraryzSpecifier._compare_arbitraryÇ  s&   € Ü�;Ó×%Ñ%Ó'¬3¨t«9¯?©?Ó+<Ñ<Ð<r   c                ó$   — | j                  |«      S )a:  Return whether or not the item is contained in this specifier.

        :param item: The item to check for.

        This is used for the ``in`` operator and behaves the same as
        :meth:`contains` with no ``prereleases`` argument passed.

        >>> "1.2.3" in Specifier(">=1.2.3")
        True
        >>> Version("1.2.3") in Specifier(">=1.2.3")
        True
        >>> "1.0.0" in Specifier(">=1.2.3")
        False
        >>> "1.3.0a1" in Specifier(">=1.2.3")
        True
        >>> "1.3.0a1" in Specifier(">=1.2.3", prereleases=True)
        True
        ©r¾   ©r4   r½   s     r   Ú__contains__zSpecifier.__contains__Ê  ó   € ð& �}‰}˜TÓ"Ð"r   c                óN   — t        t        | j                  |g|¬«      «      «      S )as  Return whether or not the item is contained in this specifier.

        :param item:
            The item to check for, which can be a version string or a
            :class:`Version` instance.
        :param prereleases:
            Whether or not to match prereleases with this Specifier. If set to
            ``None`` (the default), it will follow the recommendation from
            :pep:`440` and match prereleases, as there are no other versions.

        >>> Specifier(">=1.2.3").contains("1.2.3")
        True
        >>> Specifier(">=1.2.3").contains(Version("1.2.3"))
        True
        >>> Specifier(">=1.2.3").contains("1.0.0")
        False
        >>> Specifier(">=1.2.3").contains("1.3.0a1")
        True
        >>> Specifier(">=1.2.3", prereleases=False).contains("1.3.0a1")
        False
        >>> Specifier(">=1.2.3").contains("1.3.0a1")
        True
        ©r¸   )rS   r0  rÃ   r¼   s      r   r¾   zSpecifier.containsß  s#   € ô2 ”D˜Ÿ™ d V¸˜ÓEÓFÓGÐGr   c                 ó   — y r   r   rÀ   s       r   rÃ   zSpecifier.filterú  rÄ   r   c                 ó   — y r   r   rÀ   s       r   rÃ   zSpecifier.filter  rÆ   r   c              #  óZ  K  — g }d}|�|n| j                   }| j                  | j                  «      }|D ]Ò  }t        |€|n ||«      «      }	d}
|	€0| j                  dk(  rj| j	                  || j
                  «      rN|–— nI| j                  dk(  r'| j	                  |€|n ||«      | j
                  «      }
n ||	| j
                  «      }
|
sŒ˜|	€Œ›|	j                  r|rd}|–— Œ°|�Œ³| j                  dusŒÂ|j                  |«       ŒÔ |s|€| j                  dur|E d{  –—†  yyyy7 Œ­w)a€  Filter items in the given iterable, that match the specifier.

        :param iterable:
            An iterable that can contain version strings and :class:`Version` instances.
            The items in the iterable will be filtered according to the specifier.
        :param prereleases:
            Whether or not to allow prereleases in the returned iterator. If set to
            ``None`` (the default), it will follow the recommendation from :pep:`440`
            and match prereleases if there are no other versions.
        :param key:
            A callable that takes a single argument (an item from the iterable) and
            returns a version string or :class:`Version` instance to be used for
            filtering.

        >>> list(Specifier(">=1.2.3").filter(["1.2", "1.3", "1.5a1"]))
        ['1.3']
        >>> list(Specifier(">=1.2.3").filter(["1.2", "1.2.3", "1.3", Version("1.4")]))
        ['1.2.3', '1.3', <Version('1.4')>]
        >>> list(Specifier(">=1.2.3").filter(["1.2", "1.5a1"]))
        ['1.5a1']
        >>> list(Specifier(">=1.2.3").filter(["1.3", "1.5a1"], prereleases=True))
        ['1.3', '1.5a1']
        >>> list(Specifier(">=1.2.3", prereleases=True).filter(["1.3", "1.5a1"]))
        ['1.3', '1.5a1']
        >>> list(Specifier(">=1.2.3").filter(
        ... [{"ver": "1.2"}, {"ver": "1.3"}],
        ... key=lambda x: x["ver"]))
        [{'ver': '1.3'}]
        FNrí   T)	r¸   r-  r÷   rœ   rW  r2   r©   rÛ   rˆ   )r4   rÁ   r¸   rÂ   Úprereleases_versionsÚfound_non_prereleasesÚinclude_prereleasesr,  r2   Úparsed_versionÚmatchs              r   rÃ   zSpecifier.filter
  sS  è ø€ ðF  "ÐØ %Ðð 'Ð2‰K¸×8HÑ8Hð 	ð
 !×.Ñ.¨t¯}©}Ó=Ðð  ò 	9ˆGÜ,¸¸©WÉÈWËÓVˆNØˆEØÐ%à—=‘= EÒ)¨d×.EÑ.EØ˜TŸ\™\ô/ð "“MØ—‘ %Ò'Ø×/Ñ/Ø"˜{‘G±°G³¸d¿l¹ló‘ñ *¨.¸$¿,¹,ÓG�â˜Ñ3à%×3Ò3Ñ7JØ,0Ð)Ø!“Mà Ñ(¨T×->Ñ->ÀeÒ-KØ(×/Ñ/°Õ8ð/	9ñ8 &ØÐ#Ø×!Ñ!¨Ñ.à+×+Ñ+ð /ð $ð &ð ,ús*   ‚C	D+ÃD+ÃD+Ã'D+Ã6*D+Ä D)Ä!	D+©r  N)rö   rY   r¸   rÉ   rQ   rR   )r2   rY   rQ   úVersion | None)r2   rY   rQ   r   ©rQ   úSequence[_VersionRange])r  rY   r  rY   rQ   úlist[_VersionRange]rÈ   ©rE   rÉ   rQ   rR   rX   )rQ   ztuple[str, str]rV   rT   )r  rY   rQ   ÚCallableOperator)r7  r   rö   rY   rQ   rS   )rö   rY   rQ   ztuple[list[str], int])r7  r   rP  rY   rQ   rS   )r7  zVersion | strrö   rY   rQ   rS   )r½   zstr | VersionrQ   rS   r   )r½   ÚUnparsedVersionr¸   rÉ   rQ   rS   rÊ   rË   rÌ   rÍ   rÎ   ),r&   r'   r(   r)   rZ   Ú_specifier_regex_strÚreÚcompileÚVERBOSEÚ
IGNORECASErò   rî   Ú__annotations__r6   rú   rý   r  r  r  rÓ   r¸   rÖ   r÷   r2   rP   r³   r&  rJ   rC   r-  r8  r>  r6  rH  rK  r5  rQ  rT  rW  r[  r¾   r×   rØ   rÃ   r   r   r   r   r   ™  s  … ñð€IðZÐðx ˆR�Z‰ZØÐ%Ñ%¨Ñ.°·
±
¸R¿]¹]Ñ0Jó€Fð
 ØØØØ"ØØØñ	€J�ó 	ô$<óL
!óóó0
ó<6ð| ò%ó ð%ð6 ×Ñò"ó ð"ð òó ðð òó ðóBó$*ð ò+ó ð+ó*ó=ó:!ó
ó(ó "/óH:óPóPóó2ó@=ó#ô*Hð6 ‡_�_ð $(Øð	+à.ð+ð !ð+ð ð	+ð
 
&ò+ó ð+ð ‡_�_ð $(Ø.1ð	àðð !ðð ,ð	ð
 
òó ðð $(Ø7;ð	O,àðO,ð !ðO,ð 5ð	O,ð
 
ôO,r   r   z([0-9]+)((?:a|b|c|rc)[0-9]+)c              #  ó0  K  — g }g }d}| D ]v  }t        |€|n ||«      «      }|€*|r|–— n"|j                  |«       |j                  |«       ŒD|j                  s|s|E d{  –—†  d}|–— Œc|rŒf|j                  |«       Œx |s|E d{  –—†  yy7 Œ/7 Œ­w)z?Filter per PEP 440: exclude prereleases unless no finals exist.FNT)rœ   rˆ   r©   )rÁ   rÂ   Úall_nonfinalÚarbitrary_stringsÚfound_finalr½   Úparseds          r   Ú_pep440_filter_prereleasesrz  _  s¼   è ø€ ð !€LØ#%Ðà€KØò &ˆÜ ¨¨¡¹#¸d»)ÓDˆàˆ>ñ Ø“
à!×(Ñ(¨Ô.Ø×#Ñ# DÔ)Øà×#Ò#áØ,×,Ð,Ø"�ØŠJØò Ø×Ñ Õ%ð1&ñ6 Ø×Ñð ð -øð 	 ús*   ‚A BÁ"BÁ#BÁ1BÂBÂBÂBc                ó  — g }| j                  d«      \  }}}|j                  |xs d«       |j                  d«      D ]J  }t        j	                  |«      }|r |j                  |j                  «       «       Œ:|j                  |«       ŒL |S )a  Split version into components.

    The split components are intended for version comparison. The logic does
    not attempt to retain the original version string, so joining the
    components back with :func:`_version_join` may not produce the original
    version string.
    ú!Ú0ú.)Ú
rpartitionrˆ   ÚsplitÚ_prefix_regexró   ÚextendÚgroups)r2   r‹   r8   Ú_Úrestr½   rf  s          r   r4  r4  ‰  s~   € ð €Fà×'Ñ'¨Ó,�N€Eˆ1ˆdØ
‡M�M�%’,˜3Ôà—
‘
˜3“ò  ˆÜ×'Ñ'¨Ó-ˆÙØ�M‰M˜%Ÿ,™,›.Õ)à�M‰M˜$Õð ð €Mr   c                ó6   — | ^}}|› ddj                  |«      › �S )zñJoin split version components into a version string.

    This function assumes the input came from :func:`_version_split`, where the
    first component must be the epoch (either empty or numeric), and all other
    components numeric.
    r|  r~  )Újoin)Ú
componentsr8   r…  s      r   r/  r/  Ÿ  s'   € ð €L€EˆDØˆW�A�c—h‘h˜t“nÐ%Ð&Ð&r   c                ó.   ‡ — t        ˆ fd„dD «       «       S )Nc              3  ó@   •K  — | ]  }‰j                  |«      –— Œ y ­wr   )rõ   )Ú.0r  Úsegments     €r   ú	<genexpr>z!_is_not_suffix.<locals>.<genexpr>«  s!   øè ø€ ò Ø'-ˆ×Ñ˜6×"ñùó   ƒ)r;   ÚaÚbÚrcr:   )Úany)rŒ  s   `r   r3  r3  ª  s"   ø€ Üó Ø1Pôó ð ð r   c                óH   — d}| D ]  }|j                  «       s |S |dz  }Œ |S )zƒCount leading numeric components in a :func:`_version_split` result.

    >>> _numeric_prefix_len(["0", "1", "2", "a1"])
    3
    r   r   )Úisdigit)r€  ÚcountrŒ  s      r   r:  r:  °  s<   € ð €EØò ˆØ�‰Ô Øà€Lð 	�‰
‰ðð €Lr   c                óT   — t        | «      }||z
  }|dk  r| S g | d| ¢dg|z  ¢| |d ¢S )zÝPad a :func:`_version_split` result with ``"0"`` segments to reach
    ``target_numeric_len`` numeric components.  Suffix segments are preserved.

    >>> _left_pad(["0", "1", "a1"], 4)
    ['0', '1', '0', '0', 'a1']
    r   Nr}  )r:  )r€  Útarget_numeric_lenÚnumeric_lenÚ
pad_neededs       r   r@  r@  ¾  sN   € ô & eÓ,€KØ# kÑ1€JØ�Q‚ØˆØNˆU�<�KÐ ÐN S E¨JÑ$6ÐN¸%ÀÀÐ:MÐNÐNr   c                ó´   — | \  }}}|dk(  r|j                  d«      sdS dS |dv ry|dk(  ry|dk(  r|j                  d«      sd	S d
S |dk(  ryt        d|›�«      ‚)aL  Sort key for Cost Based Ordering of specifier operators in _filter_versions.

    Operators run sequentially on a shrinking candidate set, so operators that
    reject the most versions should run first to minimize work for later ones.

    Tier 0: Exact equality (==, ===), likely to narrow candidates to one version
    Tier 1: Range checks (>=, <=, >, <), cheap and usually reject a large portion
    Tier 2: Wildcard equality (==.*) and compatible release (~=), more expensive
    Tier 3: Exact !=, cheap but rarely rejects
    Tier 4: Wildcard !=.*, expensive and rarely rejects
    ré   rÿ   r   rñ   )rì   rë   rn   rl   r   rè   rê   rð   é   rí   r  )r   r  )Úop_entryr„  Úverr  s       r   Ú_operator_costrž  Ì  s|   € ð �J€A€sˆBØ	ˆT‚zØŸ™ TÔ*ˆqÐ1°Ð1Ø	Ð#Ñ#ØØ	ˆT‚zØØ	ˆT‚zØŸ™ TÔ*ˆqÐ1°Ð1Ø	ˆU‚{Øä
Ð)¨"¨Ð0Ó
1Ð1r   c                  ó’  — e Zd ZdZdZ	 	 d	 	 	 	 	 dd„Zdd„Zedd„«       Zej                  dd„«       Zdd„Z
dd	„Zdd
„Zd d„Zd!d„Zdd„Zd"d„Zd#d„Zd$d„Zd$d„Zd$d„Zd%d„Z	 	 d&	 	 	 	 	 	 	 d'd„Zej0                  	 	 d(	 	 	 	 	 	 	 d)d„«       Zej0                  	 	 d(	 	 	 	 	 	 	 d*d„«       Z	 	 d&	 	 	 	 	 	 	 d+d„Z	 d,	 	 	 	 	 	 	 d-d„Zy).r   zÌThis class abstracts handling of a set of version specifiers.

    It can be passed a single specifier (``>=3.0``), a comma-separated list of
    specifiers (``>=3.0,!=3.1``), or no specifier at all.
    )Ú_canonicalizedÚ_has_arbitraryÚ_is_unsatisfiablerÛ   Ú_resolved_opsÚ_specsNc                ó¾  — t        |t        «      re|j                  d«      D �cg c]#  }|j                  «       sŒ|j                  «       ‘Œ% }}t	        t        t        |«      «      | _        d|v | _        n1t	        |«      | _        t        d„ | j                  D «       «      | _        t        | j                  «      dk  | _        d| _        || _        d| _        yc c}w )a´  Initialize a SpecifierSet instance.

        :param specifiers:
            The string representation of a specifier or a comma-separated list of
            specifiers which will be parsed and normalized before use.
            May also be an iterable of ``Specifier`` instances, which will be used
            as is.
        :param prereleases:
            This tells the SpecifierSet if it should accept prerelease versions if
            applicable or not. The default of ``None`` will autodetect it from the
            given specifiers.

        :raises InvalidSpecifier:
            If the given ``specifiers`` are not parseable than this exception will be
            raised.
        ú,rí   c              3  ó6   K  — | ]  }d t        |«      v –— Œ y­w©rí   Nr±   ©r‹  Úss     r   r�  z(SpecifierSet.__init__.<locals>.<genexpr>  s   è ø€ Ò%K¸! e¬s°1«v¤oÑ%Kùs   ‚r   N)r@   rY   r€  rô   ÚtupleÚmapr   r¤  r¡  r’  r    r   r£  rÛ   r¢  )r4   Ú
specifiersr¸   rª  Úsplit_specifierss        r   r6   zSpecifierSet.__init__÷  s¹   € ô, �j¤#Ô&ð 4>×3CÑ3CÀCÓ3HÖV¨aÈAÏGÉGÍI §¡¥	ÐVÐÐVä16´s¼9ÐFVÓ7WÓ1XˆDŒKà"'¨:Ð"5ˆDÕä 
Ó+ˆDŒKô #&Ñ%K¸t¿{¹{Ô%KÓ"KˆDÔä! $§+¡+Ó.°!Ñ3ˆÔØMQˆÔð (ˆÔà.2ˆÕùò%  Ws
   ¤CºCc                óÔ   — | j                   sQt        t        j                  t	        | j
                  t        ¬«      «      «      | _        d| _         d| _        d| _        | j
                  S )zBDeduplicate, sort, and cache specs for order-sensitive operations.©rÂ   TN)	r   r«  ÚdictÚfromkeysÚsortedr¤  rY   r£  r¢  rI   s    r   Ú_canonical_specszSpecifierSet._canonical_specs$  sM   € à×"Ò"Ü¤§¡¬f°T·[±[ÄcÔ.JÓ KÓLˆDŒKØ"&ˆDÔØ!%ˆDÔØ%)ˆDÔ"Ø�{‰{Ðr   c                óˆ   — | j                   �| j                   S | j                  sy t        d„ | j                  D «       «      ryy )Nc              3  ó4   K  — | ]  }|j                   –— Œ y ­wr   r^  r©  s     r   r�  z+SpecifierSet.prereleases.<locals>.<genexpr><  s   è ø€ Ò2 ˆq�}�}Ñ2ùs   ‚T)rÛ   r¤  r’  rI   s    r   r¸   zSpecifierSet.prereleases-  sB   € ð ×ÑÐ(Ø×$Ñ$Ð$ð
 �{Š{Øô Ñ2 d§k¡kÔ2Ô2Øàr   c                ó    — || _         d | _        y r   )rÛ   r¢  rº   s     r   r¸   zSpecifierSet.prereleasesA  s   € à!ˆÔØ!%ˆÕr   c                óŒ   — | j                   �d| j                  ›�nd}d| j                  j                  › dt	        | «      ›|› d�S )a  A representation of the specifier set that shows all internal state.

        Note that the ordering of the individual specifiers within the set may not
        match the input string.

        >>> SpecifierSet('>=1.0.0,!=2.0.0')
        <SpecifierSet('!=2.0.0,>=1.0.0')>
        >>> SpecifierSet('>=1.0.0,!=2.0.0', prereleases=False)
        <SpecifierSet('!=2.0.0,>=1.0.0', prereleases=False)>
        >>> SpecifierSet('>=1.0.0,!=2.0.0', prereleases=True)
        <SpecifierSet('!=2.0.0,>=1.0.0', prereleases=True)>
        r  r  rl   rL   r  r  r  s     r   rP   zSpecifierSet.__repr__F  sU   € ð × Ñ Ð,ð ˜T×-Ñ-Ð0Ñ1àð 	ð �4—>‘>×*Ñ*Ð+¨1¬S°«Y¨M¸#¸¸bÐAÐAr   c                óN   — dj                  d„ | j                  «       D «       «      S )an  A string representation of the specifier set that can be round-tripped.

        Note that the ordering of the individual specifiers within the set may not
        match the input string.

        >>> str(SpecifierSet(">=1.0.0,!=1.0.1"))
        '!=1.0.1,>=1.0.0'
        >>> str(SpecifierSet(">=1.0.0,!=1.0.1", prereleases=False))
        '!=1.0.1,>=1.0.0'
        r¦  c              3  ó2   K  — | ]  }t        |«      –— Œ y ­wr   r±   r©  s     r   r�  z'SpecifierSet.__str__.<locals>.<genexpr>f  s   è ø€ Ò@ 1œ˜AŸÑ@ùs   ‚)r‡  r´  rI   s    r   r³   zSpecifierSet.__str__[  s"   € ð �x‰xÑ@¨×(=Ñ(=Ó(?Ô@Ó@Ð@r   c                ó4   — t        | j                  «       «      S r   )rH   r´  rI   s    r   rJ   zSpecifierSet.__hash__h  s   € Ü�D×)Ñ)Ó+Ó,Ð,r   c                ó   — t        |t        «      rt        |«      }nt        |t        «      st        S t        «       }| j                  |j                  z   |_        t        |j                  «      dk  |_        | j                  xs |j                  |_        d|_        | j                  �| j                  |j                  k(  r|j                  |_	        |S |j                  €| j                  |_	        |S t        d«      ‚)a‚  Return a SpecifierSet which is a combination of the two sets.

        :param other: The other object to combine with.

        >>> SpecifierSet(">=1.0.0,!=1.0.1") & '<=2.0.0,!=2.0.1'
        <SpecifierSet('!=1.0.1,!=2.0.1,<=2.0.0,>=1.0.0')>
        >>> SpecifierSet(">=1.0.0,!=1.0.1") & SpecifierSet('<=2.0.0,!=2.0.1')
        <SpecifierSet('!=1.0.1,!=2.0.1,<=2.0.0,>=1.0.0')>
        r   NzFCannot combine SpecifierSets with True and False prerelease overrides.)r@   rY   r   rA   r¤  r    r   r¡  r£  rÛ   r  )r4   r<   Ú	specifiers      r   Ú__and__zSpecifierSet.__and__k  sê   € ô �eœSÔ!Ü  Ó'‰EÜ˜E¤<Ô0Ü!Ð!ä “Nˆ	ØŸ;™;¨¯©Ñ5ˆ	ÔÜ#& y×'7Ñ'7Ó#8¸AÑ#=ˆ	Ô Ø#'×#6Ñ#6Ò#N¸%×:NÑ:Nˆ	Ô Ø"&ˆ	Ôð ×ÑÐ$¨×(9Ñ(9¸U×=OÑ=OÒ(OØ%*×%7Ñ%7ˆIÔ"ð Ðð ×ÑÐ'Ø%)×%6Ñ%6ˆIÔ"ð Ðô	 ØXóð r   c                óÆ   — t        |t        t        f«      rt        t        |«      «      }nt        |t        «      st        S | j                  «       |j                  «       k(  S )a¡  Whether or not the two SpecifierSet-like objects are equal.

        :param other: The other object to check against.

        The value of :attr:`prereleases` is ignored.

        >>> SpecifierSet(">=1.0.0,!=1.0.1") == SpecifierSet(">=1.0.0,!=1.0.1")
        True
        >>> (SpecifierSet(">=1.0.0,!=1.0.1", prereleases=False) ==
        ...  SpecifierSet(">=1.0.0,!=1.0.1", prereleases=True))
        True
        >>> SpecifierSet(">=1.0.0,!=1.0.1") == ">=1.0.0,!=1.0.1"
        True
        >>> SpecifierSet(">=1.0.0,!=1.0.1") == SpecifierSet(">=1.0.0")
        False
        >>> SpecifierSet(">=1.0.0,!=1.0.1") == SpecifierSet(">=1.0.0,!=1.0.2")
        False
        )r@   rY   r   r   rA   r´  rB   s     r   rC   zSpecifierSet.__eq__Œ  sN   € ô& �eœc¤9Ð-Ô.Ü ¤ U£Ó,‰EÜ˜E¤<Ô0Ü!Ð!à×$Ñ$Ó&¨%×*@Ñ*@Ó*BÑBÐBr   c                ó,   — t        | j                  «      S )z7Returns the number of specifiers in this specifier set.)r    r¤  rI   s    r   Ú__len__zSpecifierSet.__len__¦  s   € ä�4—;‘;ÓÐr   c                ó,   — t        | j                  «      S )zð
        Returns an iterator over all the underlying :class:`Specifier` instances
        in this specifier set.

        >>> sorted(SpecifierSet(">=1.0.0,!=1.0.1"), key=str)
        [<Specifier('!=1.0.1')>, <Specifier('>=1.0.0')>]
        )Úiterr¤  rI   s    r   Ú__iter__zSpecifierSet.__iter__ª  s   € ô �D—K‘KÓ Ð r   c                ó¬   — | j                   }d}|D ]3  }|€|j                  «       }Œt        ||j                  «       «      }|rŒ3 n |€t        d«      ‚|S )a  Intersect all specifiers into a single list of version ranges.

        Returns an empty list when unsatisfiable.  ``===`` specs are
        modeled as full range; string matching is checked separately
        by :meth:`_check_arbitrary_unsatisfiable`.
        Nz _get_ranges called with no specs)r¤  r  r’   ÚRuntimeError)r4   Úspecsr‹   rª  s       r   Ú_get_rangeszSpecifierSet._get_ranges´  sa   € ð —‘ˆà15ˆØò 	ˆAØˆ~ØŸ™›‘ä*¨6°1·<±<³>ÓB�ÚÙð	ð ˆ>ÜÐAÓBÐBØˆr   c                óâ   — | j                   }|�|S | j                  sd| _         y| j                  «        }|s| j                  «       }|s| j                  du r| j                  «       }|| _         |S )a¦  Check whether this specifier set can never be satisfied.

        Returns True if no version can satisfy all specifiers simultaneously.

        >>> SpecifierSet(">=2.0,<1.0").is_unsatisfiable()
        True
        >>> SpecifierSet(">=1.0,<2.0").is_unsatisfiable()
        False
        >>> SpecifierSet("").is_unsatisfiable()
        False
        >>> SpecifierSet("==1.0,!=1.0").is_unsatisfiable()
        True
        F)r¢  r¤  rÈ  Ú_check_arbitrary_unsatisfiabler¸   Ú_check_prerelease_only_ranges)r4   Úcachedr‹   s      r   Úis_unsatisfiablezSpecifierSet.is_unsatisfiableÊ  sy   € ð ×'Ñ'ˆØÐØˆMà�{Š{Ø%*ˆDÔ"Øà×%Ñ%Ó'Ð'ˆáØ×8Ñ8Ó:ˆFá˜$×*Ñ*¨eÑ3Ø×7Ñ7Ó9ˆFà!'ˆÔØˆr   c                óÜ   — | j                  «       D ]Y  \  }}t        |j                  «      }|€ y|j                  �||j                  k  r y||j                  k(  sŒL|j                  sŒY y y)z€With prereleases=False, check if every range contains only
        pre-release versions (which would be excluded from matching).FT)rÈ  r¬   r2   r^   )r4   r‚   rƒ   Únearests       r   rË  z*SpecifierSet._check_prerelease_only_rangesë  sh   € ð !×,Ñ,Ó.ò 	‰LˆE�5Ü-¨e¯m©mÓ<ˆGØˆÙØ�}‰}Ð$¨°%·-±-Ò(?ÙØ˜%Ÿ-™-Ó'¨E¯O«OÙð	ð r   c                óÎ  ‡‡— | j                   D �cg c]  }|j                  dk(  sŒ|‘Œ }}|sy|d   j                  j                  «       Št	        ˆfd„|dd D «       «      ryt        |d   j                  «      Š| j                  du r‰�‰j                  ry| j                   D �cg c]  }|j                  dk7  sŒ|‘Œ }}|sy‰€yt        ˆfd„|D «       «       S c c}w c c}w )	a  Check === (arbitrary equality) specs for unsatisfiability.

        === uses case-insensitive string comparison, so the only candidate
        that can match ``===V`` is the literal string V.  This method
        checks whether that candidate is excluded by other specifiers.
        rí   Fr   c              3  óX   •K  — | ]!  }|j                   j                  «       ‰k7  –— Œ# y ­wr   )r2   r‚   )r‹  rª  Úfirsts     €r   r�  z>SpecifierSet._check_arbitrary_unsatisfiable.<locals>.<genexpr>  s!   øè ø€ ÒA¨aˆq�y‰y�‰Ó  EÕ)ÑAùs   ƒ'*r   NTc              3  ó@   •K  — | ]  }|j                  ‰«      –— Œ y ­wr   rY  )r‹  rª  Ú	candidates     €r   r�  z>SpecifierSet._check_arbitrary_unsatisfiable.<locals>.<genexpr>  s   øè ø€ Ò?°�q—z‘z )×,Ñ?ùrŽ  )	r¤  r÷   r2   r‚   r’  rœ   r¸   r©   Úall)r4   rª  rç   ÚstandardrÔ  rÒ  s       @@r   rÊ  z+SpecifierSet._check_arbitrary_unsatisfiableø  sç   ù€ ð !%§¡ÖC˜1¨q¯z©z¸UÓ/B’QÐCˆ	ÐCÙØð ˜!‘×$Ñ$×*Ñ*Ó,ˆÜÓA°9¸Q¸R°=ÔAÔAØô $ I¨a¡L×$8Ñ$8Ó9ˆ	ð
 ×Ñ Ñ%ØÐ%Ø×'Ò'àà#Ÿ{™{ÖB˜!¨a¯j©j¸EÓ.A’AÐBˆÐBÙØàÐàäÓ?°hÔ?Ó?Ð?Ð?ùò= Dùò, Cs   ‘C¦CÂ'C"Â<C"c                ó$   — | j                  |«      S )aq  Return whether or not the item is contained in this specifier.

        :param item: The item to check for.

        This is used for the ``in`` operator and behaves the same as
        :meth:`contains` with no ``prereleases`` argument passed.

        >>> "1.2.3" in SpecifierSet(">=1.0.0,!=1.0.1")
        True
        >>> Version("1.2.3") in SpecifierSet(">=1.0.0,!=1.0.1")
        True
        >>> "1.0.1" in SpecifierSet(">=1.0.0,!=1.0.1")
        False
        >>> "1.3.0a1" in SpecifierSet(">=1.0.0,!=1.0.1")
        True
        >>> "1.3.0a1" in SpecifierSet(">=1.0.0,!=1.0.1", prereleases=True)
        True
        rY  rZ  s     r   r[  zSpecifierSet.__contains__  r\  r   c                óÎ   — t        |«      }|�|r|j                  rd}|�| j                  rt        |t        «      s|}n|}t        t        | j                  |g|¬«      «      «      S )a‡  Return whether or not the item is contained in this SpecifierSet.

        :param item:
            The item to check for, which can be a version string or a
            :class:`Version` instance.
        :param prereleases:
            Whether or not to match prereleases with this SpecifierSet. If set to
            ``None`` (the default), it will follow the recommendation from :pep:`440`
            and match prereleases, as there are no other versions.
        :param installed:
            Whether or not the item is installed. If set to ``True``, it will
            accept prerelease versions even if the specifier does not allow them.

        >>> SpecifierSet(">=1.0.0,!=1.0.1").contains("1.2.3")
        True
        >>> SpecifierSet(">=1.0.0,!=1.0.1").contains(Version("1.2.3"))
        True
        >>> SpecifierSet(">=1.0.0,!=1.0.1").contains("1.0.1")
        False
        >>> SpecifierSet(">=1.0.0,!=1.0.1").contains("1.3.0a1")
        True
        >>> SpecifierSet(">=1.0.0,!=1.0.1", prereleases=False).contains("1.3.0a1")
        False
        >>> SpecifierSet(">=1.0.0,!=1.0.1").contains("1.3.0a1", prereleases=True)
        True
        Tr^  )rœ   r©   r¡  r@   r   rS   r0  rÃ   )r4   r½   r¸   Ú	installedr2   Ú
check_items         r   r¾   zSpecifierSet.contains4  se   € ô@ " $Ó'ˆàÐ¡9°×1FÒ1FØˆKð ˆ?˜t×2Ò2¼:ÀdÌGÔ;TØ‰Jà ˆJÜ”D˜Ÿ™ j \¸{˜ÓKÓLÓMÐMr   c                 ó   — y r   r   rÀ   s       r   rÃ   zSpecifierSet.filtera  rÄ   r   c                 ó   — y r   r   rÀ   s       r   rÃ   zSpecifierSet.filteri  rÆ   r   c                ót  ‡‡— |€| j                   �| j                   }| j                  rft        | j                  «      dk(  r&| j                  d   j                  ||€dn|‰¬«      }n| j	                  |‰|€dn|¬«      }|�|S t        |‰«      S |du rt        |«      S |du rˆˆfd„|D «       S t        |‰«      S )ac  Filter items in the given iterable, that match the specifiers in this set.

        :param iterable:
            An iterable that can contain version strings and :class:`Version` instances.
            The items in the iterable will be filtered according to the specifier.
        :param prereleases:
            Whether or not to allow prereleases in the returned iterator. If set to
            ``None`` (the default), it will follow the recommendation from :pep:`440`
            and match prereleases if there are no other versions.
        :param key:
            A callable that takes a single argument (an item from the iterable) and
            returns a version string or :class:`Version` instance to be used for
            filtering.

        >>> list(SpecifierSet(">=1.2.3").filter(["1.2", "1.3", "1.5a1"]))
        ['1.3']
        >>> list(SpecifierSet(">=1.2.3").filter(["1.2", "1.3", Version("1.4")]))
        ['1.3', <Version('1.4')>]
        >>> list(SpecifierSet(">=1.2.3").filter(["1.2", "1.5a1"]))
        ['1.5a1']
        >>> list(SpecifierSet(">=1.2.3").filter(["1.3", "1.5a1"], prereleases=True))
        ['1.3', '1.5a1']
        >>> list(SpecifierSet(">=1.2.3", prereleases=True).filter(["1.3", "1.5a1"]))
        ['1.3', '1.5a1']
        >>> list(SpecifierSet(">=1.2.3").filter(
        ... [{"ver": "1.2"}, {"ver": "1.3"}],
        ... key=lambda x: x["ver"]))
        [{'ver': '1.3'}]

        An "empty" SpecifierSet will filter items based on the presence of prerelease
        versions in the set.

        >>> list(SpecifierSet("").filter(["1.3", "1.5a1"]))
        ['1.3']
        >>> list(SpecifierSet("").filter(["1.5a1"]))
        ['1.5a1']
        >>> list(SpecifierSet("", prereleases=True).filter(["1.3", "1.5a1"]))
        ['1.3', '1.5a1']
        >>> list(SpecifierSet("").filter(["1.3", "1.5a1"], prereleases=True))
        ['1.3', '1.5a1']
        r   r   T)r¸   rÂ   r^  Fc              3  ój   •K  — | ]*  }t        ‰€|n ‰|«      «      xŠ	 �‰j                  s|–— Œ, y ­wr   )rœ   r©   )r‹  r½   rÂ   r2   s     €€r   r�  z&SpecifierSet.filter.<locals>.<genexpr>Ä  sA   øè ø€ ò àä /¸¸±ÉÈTËÓ SÐS�WØðà"×0Ò0ô ñùs   ƒ03)r¸   r¤  r    rÃ   Ú_filter_versionsrz  rÃ  )r4   rÁ   r¸   rÂ   Úfilteredr2   s      ` @r   rÃ   zSpecifierSet.filterq  sé   ù€ ðd Ð 4×#3Ñ#3Ð#?Ø×*Ñ*ˆKð �;Š;ô �4—;‘;Ó 1Ò$ØŸ;™; q™>×0Ñ0ØØ(3Ð(;¡ÀØð 1ó ‘ð  ×0Ñ0ØØØ(3Ð(;¡Àð 1ó �ð Ð&Ø�ä-¨h¸Ó<Ð<ð ˜$ÑÜ˜“>Ð!à˜%Ñôà$ôð ô *¨(°CÓ8Ð8r   c              #  ó\  ‡‡‡K  — | j                   €'t        d„ | j                  D «       t        ¬«      | _         | j                   }|du }|D ]]  Št	        ‰€‰n ‰‰«      «      Š‰€t        ˆfd„|D «       «      sŒ/‰–— Œ4|r‰j                  rŒCt        ˆˆˆfd„|D «       «      sŒZ‰–— Œ_ y­w)a?  Filter versions against all specifiers in a single pass.

        Uses Cost Based Ordering: specifiers are sorted by _operator_cost so
        that cheap range operators reject versions early, avoiding expensive
        wildcard or compatible operators on versions that would have been
        rejected anyway.
        Nc              3  ó€   K  — | ]6  }|j                  |j                  «      |j                  |j                  f–— Œ8 y ­wr   )r-  r÷   r2   )r‹  rö   s     r   r�  z0SpecifierSet._filter_versions.<locals>.<genexpr>á  s6   è ø€ ò àð ×'Ñ'¨¯©Ó6¸¿¹ÀdÇmÁmÔTñùs   ‚<>r°  Fc              3  óˆ   •K  — | ]9  \  }}}|d k(  xr* t        ‰«      j                  «       |j                  «       k(  –— Œ; y­wr¨  rV  )r‹  r„  r�  r  r½   s       €r   r�  z0SpecifierSet._filter_versions.<locals>.<genexpr>ï  sA   øè ø€ ò á"˜˜3 ð ˜%‘KÒD¤C¨£I§O¡OÓ$5¸¿¹»Ñ$DÓDñùs   ƒ?Ac              3  óª   •K  — | ]J  \  }}}|d k(  r4t        ‰€‰n ‰‰«      «      j                  «       |j                  «       k(  n |‰|«      –— ŒL y­wr¨  rV  )r‹  Úop_fnr�  r  r½   rÂ   ry  s       €€€r   r�  z0SpecifierSet._filter_versions.<locals>.<genexpr>ö  s\   øè ø€ ò ñ #�E˜3 ð ˜’;ô ˜C˜K‘D©S°«YÓ7×=Ñ=Ó?À3Ç9Á9Ã;ÒNá˜6 3Ó'ó(ñùs   ƒAA)r£  r³  r¤  rž  rœ   rÕ  r©   )r4   rÁ   rÂ   r¸   ÚopsÚexclude_prereleasesr½   ry  s     `   @@r   rß  zSpecifierSet._filter_versionsÑ  sÀ   úè ø€ ð ×ÑÐ%Ü!'ñà $§¡ôô #ô"ˆDÔð × Ñ ˆØ)¨UÐ2Ðàò 	ˆDÜ$¨S¨[¡T¹cÀ$»iÓHˆFàˆ~äó à&)ôõ ð “JÙ$¨×)=Ò)=ØÜõ ð '*ô	õ ð “
ñ'	ùs   …A4B,Á:*B,Â%B,rg  )r­  zstr | Iterable[Specifier]r¸   rÉ   rQ   rR   )rQ   ztuple[Specifier, ...]rÈ   rl  rX   rV   )r<   zSpecifierSet | strrQ   r   rT   )rQ   zIterator[Specifier]ri  )rQ   rS   )r½   rn  rQ   rS   rÍ   )r½   rn  r¸   rÉ   rÙ  rÉ   rQ   rS   rÊ   rË   rÌ   rÎ   r   )rÁ   rÏ   rÂ   rÐ   r¸   rÉ   rQ   rÑ   )r&   r'   r(   r)   rZ   r6   r´  rÓ   r¸   rÖ   rP   r³   rJ   r¾  rC   rÁ  rÄ  rÈ  rÍ  rË  rÊ  r[  r¾   r×   rØ   rÃ   rß  r   r   r   r   r   ç  sÜ  „ ñð€Ið 13Ø#'ð+3à-ð+3ð !ð+3ð 
ó	+3óZð òó ðð& ×Ñò&ó ð&óBó*Aó-óóBCó4 ó!óó,óBó%@óN#ð0 $(Ø!%ð	+Nàð+Nð !ð+Nð ð	+Nð
 
ó+NðZ ‡_�_ð $(Øð	+à.ð+ð !ð+ð ð	+ð
 
&ò+ó ð+ð ‡_�_ð $(Ø.1ð	àðð !ðð ,ð	ð
 
òó ðð $(Ø7;ð	^9àð^9ð !ð^9ð 5ð	^9ð
 
ó^9ðH $(ð	,àð,ð 5ð,ð !ð	,ð
 
ô,r   r   )rQ   ú	list[str])r!   útuple[int, ...]rQ   ré  )r‚   r\   rƒ   rw   rQ   rS   )r‰   rj  rŠ   rj  rQ   rk  )r2   r   rQ   r   )r2   rn  rQ   rh  )r=   rs   rQ   rh  )rÁ   rÏ   rÂ   rÐ   rQ   rÑ   )r2   rY   rQ   rè  )rˆ  rè  rQ   rY   )rŒ  rY   rQ   rS   )r€  rè  rQ   rW   )r€  rè  r—  rW   rQ   rè  )rœ  z!tuple[CallableOperator, str, str]rQ   rW   )Fr)   Ú
__future__r   rÔ   r*   Ú	functoolsr1  rp  r×   r   r   r   r   r   r	   r
   r   Úutilsr   r2   r   r   r   r   r   rY   rn  r   rS   rm  r   rt  r#   ÚEnumr%   Útotal_orderingr/   r\   rw   ÚTYPE_CHECKINGrs   r«  Ú_VersionRanger  r	  r€   r„   r’   r—   rš   rœ   r    r¤   r§   r¬   r  r   ÚABCMetar   r   rq  r�  rz  r4  r/  r3  r:  r@  rž  r   r   r   r   ú<module>rò     sF  ðòõ #ã 
Û Û Û Û 	Û ß U× UÓ Uå 'ß ,ò€óñ ˆCƒL€Ø˜ ˜Ñ%€ÙÐ1¸ÔIÐ Ø˜W c˜N¨DÐ0Ñ1Ð ñ  ' xÓ0€ˆnÓ 0ó=ô�D—I‘Iô ð ×Ñ÷;Qð ;Qó ð;Qð| ×Ñ÷%Hð %Hó ð%HðP ×Ñ÷%Hð %Hó ð%HðP 
×ÒØ˜wÐ(8¸$Ð>Ñ?Ðð ˜+ {Ð2Ñ3€Má�t˜UÓ#€Ù�t˜UÓ#€Ø&.°Ð%9Ð$;€Ð!Ó ;ó)ðØ
!ðà"ðð óó4KóSó
ó+ó@ó2ð9Øð9àó9ô*	�zô 	ôO˜cŸk™kõ Oôd@,�ô @,ðF �—
‘
Ð:Ó;€ð' Øð' Ø"Ið' àó' óTó,'óóóOó2ô6V�=õ Vr   