a „oe&™ã@s8dZddlZddlZddlZddlmZmZmZmZm Z m Z m Z m Z m Z ddlmZddlmZe eefZe ded�ZeeegefZeed œd d „ZGd d „d eƒZGdd„dejd�ZGdd„deƒZe d¡Zeeed œdd„Zeedœdd„Z eeeee eeeefdœdd„Z!Gdd„deƒZ"dS)zŠ .. testsetup:: from packaging.specifiers import Specifier, SpecifierSet, InvalidSpecifier from packaging.version import Version éN) ÚCallableÚIterableÚIteratorÚListÚOptionalÚSetÚTupleÚTypeVarÚUnioné)Úcanonicalize_version)ÚVersionÚUnparsedVersionVar)Úbound)ÚversionÚreturncCst|tƒst|ƒ}|S©N)Ú isinstancer )r©rúKC:\Program Files\Certbot\pkgs\pkg_resources\_vendor\packaging\specifiers.pyÚ_coerce_version"s rc@seZdZdZdS)ÚInvalidSpecifiera 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)Ú__name__Ú __module__Ú __qualname__Ú__doc__rrrrr(src@sÀeZdZejedœdd„ƒZejedœdd„ƒZeje e dœdd„ƒZ e eje e dœd d „ƒƒZeje d d œd d „ƒZejdee e e dœdd„ƒZejdeee e eedœdd„ƒZd S)Ú BaseSpecifier©rcCsdS)zŽ Returns the str representation of this Specifier-like object. This should be representative of the Specifier itself. Nr©ÚselfrrrÚ__str__5szBaseSpecifier.__str__cCsdS)zF Returns a hash value for this Specifier-like object. NrrrrrÚ__hash__<szBaseSpecifier.__hash__©ÚotherrcCsdS)z« Returns a boolean representing whether or not the two Specifier-like objects are equal. :param other: The other object to check against. Nr©rr#rrrÚ__eq__BszBaseSpecifier.__eq__cCsdS)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. NrrrrrÚ prereleasesKszBaseSpecifier.prereleasesN©ÚvaluercCsdS)zQSetter for :attr:`prereleases`. :param value: The value to set. Nr©rr(rrrr&Ts©Úitemr&rcCsdS)zR Determines if the given item is contained within this specifier. Nr)rr+r&rrrÚcontains[szBaseSpecifier.contains©Úiterabler&rcCsdS)z• Takes an iterable of items and filters them so that only items which are contained within this specifier are allowed in it. Nr)rr.r&rrrÚfilteraszBaseSpecifier.filter)N)N)rrrÚabcÚabstractmethodÚstrr Úintr!ÚobjectÚboolr%Úpropertyrr&Úsetterr,rrrr/rrrrr4s&ÿ þr)Ú metaclassc @söeZdZdZdZdZe deedejej B¡Z dddd d d d d dœZ dFe e eddœdd„Zeedœdd„ƒZejeddœdd„ƒZee dœdd„ƒZee dœdd„ƒZe dœdd„Ze dœdd „Zeee e fdœd!d"„ƒZedœd#d$„Zeed%œd&d'„Ze ed(œd)d*„Zee ed+œd,d-„Z ee ed+œd.d/„Z!ee ed+œd0d1„Z"ee ed+œd2d3„Z#ee ed+œd4d5„Z$ee ed6œd7d8„Z%ee ed6œd9d:„Z&ee ed+œd;d<„Z'e(e efed=œd>d?„Z)dGe*e eed@œdAdB„Z+dHe,e-e ee.e-dCœdDdE„Z/dS)IÚ Specifiera?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). z8 (?P(~=|==|!=|<=|>=|<|>|===)) aÈ (?P (?: # 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 .* | (?: # 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 (?:\+[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. (?=ú<ú>ú===ÚN)Úspecr&rcCsH|j |¡}|s td|›d�ƒ‚| d¡ ¡| d¡ ¡f|_||_dS)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). zInvalid specifier: 'ú'ÚoperatorrN)Ú_regexÚsearchrÚgroupÚstripÚ_specÚ _prereleases)rrBr&ÚmatchrrrÚ__init__æs   þzSpecifier.__init__rcCsR|jdur|jS|j\}}|dvrN|dkr@| d¡r@|dd…}t|ƒjrNdSdS)N)r;r=r<r:r@r;ú.*éþÿÿÿTF)rJrIÚendswithr Ú is_prerelease)rrDrrrrr&s    zSpecifier.prereleasesr'cCs ||_dSr©rJr)rrrr&scCs |jdS)z`The operator of this specifier. >>> Specifier("==1.2.3").operator '==' r©rIrrrrrDszSpecifier.operatorcCs |jdS)zaThe version of this specifier. >>> Specifier("==1.2.3").version '1.2.3' r rRrrrrr%szSpecifier.versioncCs8|jdurd|j›�nd}d|jj›dt|ƒ›|›d�S)aTA representation of the Specifier that shows all internal state. >>> Specifier('>=1.0.0') =1.0.0')> >>> Specifier('>=1.0.0', prereleases=False) =1.0.0', prereleases=False)> >>> Specifier('>=1.0.0', prereleases=True) =1.0.0', prereleases=True)> Nú, prereleases=rAr>ú(ú)>)rJr&Ú __class__rr2©rZprerrrÚ__repr__.s ÿýzSpecifier.__repr__cCs dj|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{}{})ÚformatrIrrrrr @szSpecifier.__str__cCs*t|jd|jddkd�}|jd|fS)Nr rr:©Zstrip_trailing_zero)r rI)rZcanonical_versionrrrÚ_canonical_specJs  þzSpecifier._canonical_speccCs t|jƒSr)Úhashr[rrrrr!RszSpecifier.__hash__r"cCsRt|tƒr6z| t|ƒ¡}WqFty2tYS0nt||jƒsFtS|j|jkS)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 )rr2rVrÚNotImplementedr[r$rrrr%Us    zSpecifier.__eq__)ÚoprcCst|d|j|›�ƒ}|S)NZ _compare_)ÚgetattrÚ _operators)rr^Úoperator_callablerrrÚ _get_operatorrsÿzSpecifier._get_operator)Ú prospectiverBrcCsJd tt tt|ƒ¡ƒdd…¡}|d7}| d¡||ƒoH| d¡||ƒS)NÚ.éÿÿÿÿrMr=r;)ÚjoinÚlistÚ itertoolsÚ takewhileÚ_is_not_suffixÚ_version_splitrb)rrcrBÚprefixrrrÚ_compare_compatiblexs ÿÿzSpecifier._compare_compatiblec Cs†| d¡rbt|jdd�}t|dd…dd�}t|ƒ}t|ƒ}t||ƒ\}}|dt|ƒ…} | |kSt|ƒ} | jszt|jƒ}|| kSdS)NrMFrZrN)rOr ÚpublicrkÚ _pad_versionÚlenr Úlocal) rrcrBZnormalized_prospectiveZnormalized_specZ split_specZsplit_prospectiveZpadded_prospectiveÚ_Zshortened_prospectiveZ spec_versionrrrÚ_compare_equal�s ÿ zSpecifier._compare_equalcCs| ||¡ Sr)rs©rrcrBrrrÚ_compare_not_equal¶szSpecifier._compare_not_equalcCst|jƒt|ƒkSr©r rnrtrrrÚ_compare_less_than_equal¹sz"Specifier._compare_less_than_equalcCst|jƒt|ƒkSrrvrtrrrÚ_compare_greater_than_equalÀsz%Specifier._compare_greater_than_equal)rcÚspec_strrcCs<t|ƒ}||ksdS|js8|jr8t|jƒt|jƒkr8dSdS©NFT)r rPÚ base_version©rrcryrBrrrÚ_compare_less_thanÇs zSpecifier._compare_less_thancCs^t|ƒ}||ksdS|js8|jr8t|jƒt|jƒkr8dS|jdurZt|jƒt|jƒkrZdSdSrz)r Zis_postreleaser{rqr|rrrÚ_compare_greater_thanàs  zSpecifier._compare_greater_thancCst|ƒ ¡t|ƒ ¡kSr)r2ÚlowerrtrrrÚ_compare_arbitraryÿszSpecifier._compare_arbitrary©r+rcCs | |¡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") False >>> "1.3.0a1" in Specifier(">=1.2.3", prereleases=True) True ©r,©rr+rrrÚ __contains__szSpecifier.__contains__r*cCs<|dur|j}t|ƒ}|jr$|s$dS| |j¡}|||jƒS)alReturn 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 uses :attr:`prereleases` to determine whether or not prereleases are allowed. >>> 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") False >>> Specifier(">=1.2.3", prereleases=True).contains("1.3.0a1") True >>> Specifier(">=1.2.3").contains("1.3.0a1", prereleases=True) True NF)r&rrPrbrDr)rr+r&Znormalized_itemrarrrr,s  zSpecifier.containsr-ccs‚d}g}d|dur|ndi}|D]D}t|ƒ}|j|fi|¤Žr |jrZ|sZ|jsZ| |¡q d}|Vq |s~|r~|D] }|VqrdS)aOFilter 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 be intelligently decide whether to allow prereleases or not (based on the :attr:`prereleases` attribute, and whether the only versions matching are prereleases). This method is smarter than just ``filter(Specifier().contains, [...])`` because it implements the rule from :pep:`440` that a prerelease item SHOULD be accepted if no other versions match the given specifier. >>> 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', ] >>> 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'] Fr&NT)rr,rPr&Úappend)rr.r&ÚyieldedÚfound_prereleasesÚkwrÚparsed_versionrrrr/Es"ÿÿ zSpecifier.filter)rAN)N)N)0rrrrZ_operator_regex_strZ_version_regex_strÚreÚcompileÚVERBOSEÚ IGNORECASErEr`r2rr5rLr6r&r7rDrrXr rr[r3r!r4r%ÚCallableOperatorrbr rmrsrurwrxr}r~r€r r„ÚUnparsedVersionr,rrrr/rrrrr9ksf ^ þø  )ÿþ /ÿ þr9z^([0-9]+)((?:a|b|c|rc)[0-9]+)$cCs@g}| d¡D],}t |¡}|r0| | ¡¡q| |¡q|S)Nrd)ÚsplitÚ _prefix_regexrFÚextendÚgroupsr…)rÚresultr+rKrrrrk†s  rk)Úsegmentrcst‡fdd„dDƒƒ S)Nc3s|]}ˆ |¡VqdSr)Ú startswith)Ú.0rl©r•rrÚ ’sz!_is_not_suffix..)ÚdevÚaÚbÚrcZpost)Úanyr˜rr˜rrj‘s ÿrj)ÚleftÚrightrc Csægg}}| tt dd„|¡ƒ¡| tt dd„|¡ƒ¡| |t|dƒd…¡| |t|dƒd…¡| ddgtdt|dƒt|dƒƒ¡| ddgtdt|dƒt|dƒƒ¡ttj|Žƒttj|ŽƒfS)NcSs| ¡Sr©Úisdigit©ÚxrrrÚ›óz_pad_version..cSs| ¡Srr¡r£rrrr¥œr¦rr Ú0)r…rgrhrirpÚinsertÚmaxÚchain)rŸr Z left_splitZ right_splitrrrro—s ,,roc@seZdZdZd$eeeddœdd„Zeeedœdd „ƒZ e j edd œd d „ƒZ edœd d „Z edœdd„Z e dœdd„Zedefddœdd„Zeedœdd„Ze dœdd„Zeedœdd„Zeedœdd„Zd%eeeeeedœdd „Zd&eeeeeed!œd"d#„ZdS)'Ú SpecifierSetzÌ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. rAN)Ú specifiersr&rcCsFdd„| d¡Dƒ}tƒ}|D]}| t|ƒ¡qt|ƒ|_||_dS)aNInitialize 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. :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. cSsg|]}| ¡r| ¡‘qSr)rH©r—ÚsrrrÚ Är¦z)SpecifierSet.__init__..ú,N)r�ÚsetÚaddr9Ú frozensetÚ_specsrJ)rr¬r&Zsplit_specifiersÚparsedÚ specifierrrrrL°s  zSpecifierSet.__init__rcCs.|jdur|jS|jsdStdd„|jDƒƒS)Ncss|] }|jVqdSr©r&r­rrrr™âr¦z+SpecifierSet.prereleases..)rJr´ržrrrrr&Ós  zSpecifierSet.prereleasesr'cCs ||_dSrrQr)rrrr&äscCs.|jdurd|j›�nd}dt|ƒ›|›d�S)aA 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') =1.0.0')> >>> SpecifierSet('>=1.0.0,!=2.0.0', prereleases=False) =1.0.0', prereleases=False)> >>> SpecifierSet('>=1.0.0,!=2.0.0', prereleases=True) =1.0.0', prereleases=True)> NrSrAz>> 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°css|]}t|ƒVqdSr)r2r­rrrr™r¦z'SpecifierSet.__str__..)rfÚsortedr´rrrrr ýs zSpecifierSet.__str__cCs t|jƒSr)r\r´rrrrr! szSpecifierSet.__hash__r"cCs˜t|tƒrt|ƒ}nt|tƒs"tStƒ}t|j|jBƒ|_|jdurX|jdurX|j|_n<|jdurv|jdurv|j|_n|j|jkrŒ|j|_ntdƒ‚|S)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' =1.0.0')> >>> SpecifierSet(">=1.0.0,!=1.0.1") & SpecifierSet('<=2.0.0,!=2.0.1') =1.0.0')> NzFCannot combine SpecifierSets with True and False prerelease overrides.)rr2r«r]r³r´rJÚ ValueError)rr#r¶rrrÚ__and__ s       ÿzSpecifierSet.__and__cCs6t|ttfƒrtt|ƒƒ}nt|tƒs*tS|j|jkS)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 )rr2r9r«r]r´r$rrrr%-s  zSpecifierSet.__eq__cCs t|jƒS)z7Returns the number of specifiers in this specifier set.)rpr´rrrrÚ__len__GszSpecifierSet.__len__cCs 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) [, =1.0.0')>] )Úiterr´rrrrÚ__iter__KszSpecifierSet.__iter__r�cCs | |¡S)arReturn 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") False >>> "1.3.0a1" in SpecifierSet(">=1.0.0,!=1.0.1", prereleases=True) True r‚rƒrrrr„UszSpecifierSet.__contains__)r+r&Ú installedrcs\tˆtƒstˆƒ‰ˆdur |j‰ˆs.ˆjr.dS|rBˆjrBtˆjƒ‰t‡‡fdd„|jDƒƒ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 uses :attr:`prereleases` to determine whether or not prereleases are allowed. >>> 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") False >>> SpecifierSet(">=1.0.0,!=1.0.1", prereleases=True).contains("1.3.0a1") True >>> SpecifierSet(">=1.0.0,!=1.0.1").contains("1.3.0a1", prereleases=True) True NFc3s|]}|jˆˆd�VqdS)r·Nr‚r­©r+r&rrr™¡r¦z(SpecifierSet.contains..)rr r&rPr{Úallr´)rr+r&r¾rr¿rr,js    zSpecifierSet.containsr-cCsœ|dur|j}|jr:|jD]}|j|t|ƒd�}qt|ƒSg}g}|D]0}t|ƒ}|jrl|sl|sv| |¡qF| |¡qF|s�|r�|dur�t|ƒSt|ƒSdS)a.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 be intelligently decide whether to allow prereleases or not (based on the :attr:`prereleases` attribute, and whether the only versions matching are prereleases). This method is smarter than just ``filter(SpecifierSet(...).contains, [...])`` because it implements the rule from :pep:`440` that a prerelease item SHOULD be accepted if no other versions match the given specifier. >>> 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', ] >>> list(SpecifierSet(">=1.2.3").filter(["1.2", "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'] 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'] Nr·)r&r´r/r5r¼rrPr…)rr.r&rBZfilteredr‡r+r‰rrrr/£s",    zSpecifierSet.filter)rAN)NN)N)rrrrr2rr5rLr6r&r7rXr r3r!r rºr4r%r»rr9r½r�r„r,rrr/rrrrr«©s>ÿþ #   üû :ÿ þr«)#rr0rhrŠÚtypingrrrrrrrr r Zutilsr rr r2r�rr5rŽrr¹rÚABCMetarr9r‹r‘rkrjror«rrrrÚs,,     7  *