6,j dZddlmZddlZddlmZddlmZddlmZ ddlm Z dd lm Z ddl Z dd lmZmZmZmZd Zd Zhd ZhdZhdZhdZhdZeezezezezZdZdedZdZdededZdedZdededZ dededZ!ded ed!Z"d"ed#ed$e!dZ#ded%ed&e#d'ed(ed) Z$d*e!Z%d+e!Z&d,e!d-e!d.Z'd/ed0e!d1e!de$d2 Z(d3e!d4ed5Z)d3e!d4ed6Z*d7e!dZ+d8Z,ed9Z-d:e)Z.d;e!Z/ded?ed)eed@ed)eedAZ0dBe*dCe"dDedEZ1e*dFe#dedGed)e#dHed9 Z2e*dIed9Z3edJedKed)Z4e*dFe#dedGed)e#dHed9 Z5ej6dLedMej7Z8ej6dLedNedej7Z9ej6dOedPedQej7Z:ej6dRe#dSedGedTej;Z<ej6eZ=ej6dUed)Z>ej6edVZ?ej6dUe+dWej;Z@dXZAdYZBdZCdZZDd[ZEd\ZFd]ZGd^ZHd_ZId`ZJdaZKdbZLdcZMddZNeeNeddpZOddrZPddtZQdddyZRdd{ZSGd|d}ZTGd~deTZUGddZVGddZWeWdXeCeGzZYeWdXeCeGzZZeWdXeCeGzeFzZ[eWdXeCeGzeHzZ\eWdXeCeGzZ]eWdXeCeGzZ^eWdXeCeGzZ_eWdXeCeGzZ`eWdXeCeGzeLzZaeWdXeCZbeWdXeCeGzZceWdXeCeGzZdeWdXeCeJzeGzZeeWdXeCeKzeGzZfeWdXeCeGzZgeWdXeCeGzZhdS)zCSS selector parser.) annotationsN) lru_cache)util) css_match) css_types)SelectorSyntaxError)MatchAnyIteratorcastii >:link:open:root:empty:muted:scope:checked:default:defined:enabled :any-link :disabled :in-range :optional :required :read-only :last-child :only-child :read-write :first-child :last-of-type :only-of-type :out-of-range:first-of-type:indeterminate:placeholder-shown>:past:focus:hover:active:future:paused:target:playing:seeking:stalled:visited :autofill :buffering :fullscreen :local-link :focus-within :popover-open :user-invalid:focus-visible:target-within:volume-locked:picture-in-picture:host:current>:matches:is:has:not:where :contains:-soup-contains:-soup-contains-own> :host-contextr>r?>:dir:lang :nth-child :nth-of-type:nth-last-child:nth-last-of-typez(?:\r\n|(?!\r\n)[\n\f\r])z (?:[ \t]|)z"(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/)z(?:|z(?:\\(?:[a-f0-9]{1,6}z?|[^\r\n\f]|$))z?|[^\r\n\f]|$|z))z8 (?:(?:-?(?:[^\x00-\x2f\x30-\x40\x5B-\x5E\x60\x7B-\x9f]|z>)+|--) (?:[^\x00-\x2c\x2e\x2f\x3A-\x40\x5B-\x5E\x60\x7B-\x9f]|z)*) z (?:[-+])?(?:[0-9]+n?|n)(?:(?<=n)z *(?:[-+])z *(?:[0-9]+))?z(?:"(?:\\(?:.|z)|[^\\"\r\n\f])*?"|'(?:\\(?:.|z)|[^\\'\r\n\f])*?'|z*(?P[!~^|*$]?=)z *(?Pz)(?:z*(?P[is]))?)?*z\#z\.z(?P(?:z|\*)?\|)?(?Pz|\*)z\[z*(?P(?:z|\*)?\|)?(?Pz\]z (?P:z )(?P\(z*)?z*)z(?P:(?=--)&z*\):z@Pz (?Pz (?Pz|even|odd))(?:z *\)|(?Pz*ofz*)) z (?Pz (?Pz |even|odd))z*\) z (?Pz*,z)*)z(?Pltr|rtl)z*?(?P[,+>~]|z (?![,+>~]))z(?:(\\[a-f0-9]{1,6}z?)|(\\[^\r\n\f])|(\\$))z?)|(\\[^\r\n\f])|(\\$)|(\\z'(?P[-+])?(?P[0-9]+n?|n)(?:(?<=n)z *(?P[-+])z*(?P[0-9]+))?z (?:(?Pz )|(?Pz*))^z*$$,  @iii)maxsizepatternstr namespacesct.Namespaces | Nonecustomct.CustomSelectors | Noneflagsintreturn cm.SoupSievect|}tj|t||||||S)zCached CSS compile.rerg)process_customcm SoupSieve CSSParserprocess_selectors)rarcrergcustom_selectorss DC:\PYTHON\GemmaClient\venv\Lib\site-packages\soupsieve/css_parser.py_cached_css_compilerts[&f-- < #           Nonec8tdS)zPurge the cache.N)rt cache_clearrurs _purge_cacherzs##%%%%%ru dict[str, str | ct.SelectorList]ci}||D]o\}}tj|}t|t d|d||vrt d|d||t|<p|S)zProcess custom.Nz The name 'z)' is not a valid custom pseudo-class namezThe custom selector 'z' has already been registered)itemsrlower RE_CUSTOMmatchr KeyError css_unescape)rerrkeyvaluenames rsrmrms  ,,.. 9 9JC:c??Dt$$,)*ft*f*f*fggg'''ZtZZZ[[[38 \$// 0 0 ruFcontentstringboolcRdd}|stnt||S)zs Unescape CSS value. Strings allow for spanning the value on multiple strings by escaping a new line. m Match[str]rirbcZ|drHt|dddd}|dkrt}t|}nM|dr|ddd}n|drd}nd}|S) z(Replace with the appropriate substitute.rNr[rrX�)grouprhUNICODE_REPLACEMENT_CHARchr)r codepointrs rsreplacezcss_unescape..replaces 771:: AGGAJJqrrNB//IA~~4  NNEE WWQZZ GGAJJqrrNEE WWQZZ EEE ru)rrrirb) RE_CSS_ESCRE_CSS_STR_ESCsub)rrrs rsrrs7"% 8JJ. = =gw O OOruidentcg}t|}|dko |ddk}|dkr|r|d|n t|D]\}}t|}|dkr|d1d|cxkrdksn|dkr|d|dd a|dks|r1|dkr+d |cxkrd krnn|d|dd |d vsC|d ks=d |cxkrd ks0nd |cxkrd ks!nd|cxkrdksnd|cxkrdkrnn|||d|d|S)zEscape identifier.r-r\rxrW09)-_r^AZazr)lenappend enumerateordjoin)rrlength start_dashindexcrs rsescapersF ZZF!/aCJ {{z{ l5ll####!%(( ( (HE1AID   h'''')++++t++++ T0A0A 19111122221*** $)B[B[B[B[W[B[B[B[B[B[ 1911112222\))Y$->->49C\C\C\C\X\C\C\C\C\****d**** 0I0I0I0IT0I0I0I0ItW`OhOhOhOhdhOhOhOhOhOh a     h1hh'''' 776??ruc*eZdZdZddZddZddZdS)SelectorPatternSelector pattern.rrbrarirvc||_tj|tjtjztjz|_dS) Initialize.N)rrecompileIXU re_pattern)selfrras rs__init__zSelectorPattern.__init__4s1 *WbdRTkBD.@AAruc|jS) Get name.)rrs rsget_namezSelectorPattern.get_name:s yruselectorrrhrgMatch[str] | Nonec8|j||S)Match the selector.)rr)rrrrgs rsrzSelectorPattern.match?s$$Xu555ruN)rrbrarbrirvrirbrrbrrhrgrhrir__name__ __module__ __qualname____doc__rrrryrursrr1sZBBBB  666666rurc*eZdZdZddZddZddZdS)SpecialPseudoPatternrpatternsCtuple[tuple[str, tuple[str, ...], str, type[SelectorPattern]], ...]rirvci|_|D]7}|d}|d||d}|dD] }||j|< 8d|_tjttjtjztjz|_dS)rrrrXrN) r matched_namerrPAT_PSEUDO_CLASS_SPECIALrrrre_pseudo_name)rrprrapseudos rsrzSpecialPseudoPattern.__init__Hs  0 0AQ4Dad41&&GA$ 0 0(/ f%% 0! j)A24"$;QSQUCUVVrurbcF|jdn|jS)rNr)rrrs rsrzSpecialPseudoPattern.get_nameUs%&.rrD4E4N4N4P4PPrurrrhrgrc$d}|j||}|rptjt |d}|j|}|r ||||}|r||_|S)rNr) rrrr~rrrgetr)rrrrgrrrras rsrzSpecialPseudoPattern.matchZs   % %h 6 6  0:l1776??;;<>0(/D% ruN)rrrirvrrrryrursrrEs^ W W W WQQQQ      rurc6eZdZdZddZdd Zdd ZddZeZdS) _Selectorz Intermediate selector class. This stores selector data for a compound selector as we are acquiring them. Once we are done collecting the data for a compound selector, we freeze the data in an object that can be pickled and hashed. kwargsr rirvc |dd|_|dg|_|dg|_|dg|_|dg|_|dg|_|dg|_|d d|_|d g|_ |d g|_ |d d |_ |dd|_ dS)rtagNidsclasses attributesnth selectors relationsrel_typecontainslangrgrno_matchF) rrrrrrrrrrrrgr)rrs rsrz_Selector.__init__ss::eT**::eR((zz)R00  **\266::eR((K44K44 :t44  :r22 JJvr** ZZ++  :u55 rurlist[_Selector]ct.SelectorListc|rQ|d}|j|ddtj|gStjS)zFreeze relation.rrN)rextendct SelectorListfreeze)rrsels rs_freeze_relationsz_Selector._freeze_relationss[  %A,C M 122 / / /?CJJLL>22 2?$$ $ruct.Selector | ct.SelectorNullc|jrtjStj|jt |jt |jt |jt |j t |j | |j |j t |jt |j|j S)z Freeze self.)rr SelectorNullSelectorrtuplerrrrrrrrrrrgrs rsrz_Selector.freezes = ?$$ $;dhdl##do&&dhdn%%&&t~66 dm$$di      rurbcd|jd|jd|jd|jd|jd|jd|jd|jd |jd |j d |j d |j d S)zString representation.z_Selector(tag=z, ids=z , classes=z , attributes=z, nth=z , selectors=z , relations=z , rel_type=z , contains=z, lang=z, flags=z , no_match=rO) rrrrrrrrrrrgrrs rs__str__z_Selector.__str__s +TX + +tx + +T\ + +bfbq + +8 + ++/> + +IM + +  + +48M + +LPI + +aeak + +  + + + ruN)rr rirv)rrrir)rirr) rrrrrrrr__repr__ryrursrrjso6666 %%%%(    HHHrurceZdZdZedeeddeefddeefdde efd d e efd d e effed e ede edeedeedeedeedeedeedeedef Z dHdId!ZdJd"ZdKd)ZdKd*ZdKd+ZdLd0ZdMd1ZdNd4ZdOd9ZdPd>Z dKd?Z!dKd@Z"dKdAZ#dKdBZ$ dQdRdDZ%dSdFZ&dQdTdGZ'dS)UrpzParse CSS selectors. pseudo_closepseudo_contains)rErFrGpseudo_nth_child)rKrMpseudo_nth_type)rLrN pseudo_lang)rJ pseudo_dir)rIpseudo_class_custom pseudo_classpseudo_elementampat_ruleidclassr attributecombineNrrrbre'dict[str, str | ct.SelectorList] | Nonergrhrirvc|dd|_||_|jtjz|_|in||_d|_dS)rrNr)rrargrDEBUGdebugrecount)rrrergs rsrzCSSParser.__init__sL ''99  Z$*, "Nbb  rucT|jtkrtdtdS)z!Check the current selector count.z/Selector exceeds pseudo-class nesting limit of N)rSELECTOR_LIMIT ValueErrorrs rs check_countzCSSParser.check_counts0 : & &_~__`` ` ' &rurrrr has_selectorrcd}|d}|dr'tj|dnd}|dr*t|dddnd}t|d}d} d} d} |r"|d kr tjnd tjz} n@tj|d krtjtjz} d } n tj} |rv|d dr,t|d ddd } n"t|d } |sd} n|dr,t jdt j | z| } nb|dr,t jdt j | z| } n!|dr+t jdt j | z| } n|drK| rt | rdnt j | } t jd| z| } n|dr+t jdt j | z| } nAt jdt j | z| } |drd }| r| rt j| j } tj||| | }|rlt}|j|tj|gd d}|j|n|j|d }|S)z8Create attribute selector from the returned regex match.FcmpcaseNattr_nsr attr_nameirtypeTr"'rrTz^%s.*rUz.*?%s$rQz.*?%s.*~z[^\s\S]z7.*?(?:(?<=^)|(?<=[ \t\r\n\f]))%s(?=(?:[ \t\r\n\f]|$)).*rPz ^%s(?:-.*)?$z^%s$!)rrr~rrrDOTALL startswithrrRE_WSsearchrarSelectorAttributerrrrrr)rrrrinverseoprnsattris_typepattern2rrgrasel_attrsub_selnot_lists rsparse_attribute_selectorz"CSSParser.parse_attribute_selectors WWU^^./ggfooGtz!''&//***467ggi6H6H P\!''),,SbS1 2 2 2bAGGK0011  !S[[RTTa29.>!>FFGG ]]3   ',Xu||E/B/BXJJ RWHXHXEj![^c!cejkkGG ]]3   j29U3C3C!CUKKGGj29U+;+;!;UCCG}}S!!   3w 3z'/22H'b'8DD  ,kkG   % %h / / /(8(8'94GGH M  * * * * N ! !( + + + ruc|dr*t|dddnd}t|d}tj|||_d}|S)z#Parse tag pattern from regex match.tag_nsNrtag_nameT)rrr SelectorTagr)rrrrprefixrs rsparse_tag_patternzCSSParser.parse_tag_pattern'st:;9J9JTaggh//4555PT177:..//.f-- rucvtjt|d}|j|}|Bt d|d|d|j|dt|tj sG|j|=t||j|j t}||j|<|xj|jz c_||j|d}|S) z Parse custom pseudo class alias. Compile custom selectors as we need them. When compiling a custom selector, set it to `None` in the dictionary so we can avoid an infinite loop. rNzUndefined custom selector 'z' found at position rrlrgT)rr~rrrerr endra isinstancerrrprgrq FLG_PSEUDOrrrr)rrrrrrs rsparse_pseudo_class_customz#CSSParser.parse_pseudo_class_custom0s&L99::;??6**  %TfTT!%%PQ((TT a  (BO44 + F# DJj11 #+DK  hn$   X&&& ru iselector Iterator[tuple[str, Match[str]]]is_htmltuple[bool, bool]c d}tjt|d}|drd}|r7|tvr.||||||d}nc|s|tvr|dkr|xjtj zc_nm|dkr|xjtj zc_d}nI|dkr|xjtj zc_n'|d kr|xjtj zc_n|d vrO|xjtjz c_||jtn|d krO|xjt&jz c_||jt&n]|d krO|xjt(jz c_||jt(n|d krO|xjt*jz c_||jt*n|dkrO|xjt,jz c_||jt,n^|dkrO|xjt.jz c_||jt.n |dkrO|xjt0jz c_||jt0n|dkrO|xjt2jz c_||jt2n_|dkrO|xjt4jz c_||jt4n |dkrO|xjt6jz c_||jt6n|dkrO|xjt8jz c_||jt8n`|dkrO|xjt:jz c_||jt:n |dkrO|xjt<jz c_||jt<n|dkrO|xjt>jz c_||jt>na|dkrO|xjt@jz c_||jt@n |dkrD|j!tj"dddddtj#n|dkrD|j!tj"dddddtj#nx|dkrD|j!tj"dddddtj#n.|dkrC|j!tj"dddddtj#n|dkrm|j!$tj"dddddtj#tj"dddddtj#gnr|dkrl|j!$tj"dddddtj#tj"dddddtj#gd}n|rJ|tJvrA|&||dtNtPzd|_)d}nx|s|tTvr d|_)d}nc|tVvr-tYd |d!|j-|.dtYd!|d"|j-|.d||fS)#zParse pseudo class.FropenTrrrrr)rrrrr&rrrrrrrr rr$r'r!rrr%r"rr#z!Invalid syntax for pseudo class 'rz' was detected as a pseudo-class and is either unsupported or invalid. If the syntax was not intended to be recognized as a pseudo-class, please escape the colon.)/rr~rrPSEUDO_COMPLEXparse_pseudo_openr9 PSEUDO_SIMPLErgrSEL_ROOT SEL_DEFINED SEL_SCOPE SEL_EMPTYrCSS_LINKrrr CSS_CHECKED CSS_DEFAULTCSS_INDETERMINATE CSS_DISABLED CSS_ENABLED CSS_REQUIRED CSS_MUTEDCSS_OPEN CSS_OPTIONAL CSS_READ_ONLYCSS_READ_WRITE CSS_IN_RANGECSS_OUT_OF_RANGECSS_PLACEHOLDER_SHOWNr SelectorNthrrPSEUDO_COMPLEX_NO_MATCHparse_selectorsr;FLG_OPENrPSEUDO_SIMPLE_NO_MATCHPSEUDO_SUPPORTEDr rastart)rrrrr=r?complex_pseudors rsparse_pseudo_classzCSSParser.parse_pseudo_classOs+L99:: 776?? "!N r f6611#v|YXYX]X]^_X`X`aaLLp Fm$;$;   R[( :%% R^+ 8## R\) 8## R\) 111 hn,   """ $$X....:%% k//   """ $$[1111:%% k//   """ $$[1111+++ /55   """ $$%67777;&& l00   """ $$\2222:%% k//   """ $$[1111;&& l00   """ $$\22228## io-   """ $$Y////7"" hn,   """ $$X....;&& l00   """ $$\2222<'' m11   """ $$]3333=(( n22   """ $$^4444;&& l00   """ $$\2222?** .44   """ $$%56666/// 399   """ $$%:;;;;>))r~a5%IZIZ[[\\\\=((r~a5$HYHYZZ[[[[+++r~a4HYHYZZ[[[[?**r~a4rGXGXYYZZZZ=((q%E5"/BSBSTTq%E4ARARSS ?**q%D%ARARSSq%D$@Q@QRR  LL  *A A A  AEE!HHj86K L L LCLLL F.D$D$DCLLL ' ' '%=F===    &nFnnn   W$$ruc |}|drd}nd}tjt |d|d<tj|d|z}|dkrd}d} d } nT|d krd}d } d } nFt t tt |} | d r| d d krd nd} | d} | d} | dr| dz } n| r| | ddz } n| | z } | dr| dd krd nd}| dr|| dz }nd}t| d}t|d} |d}|dkr| dr8|||dt t"z}n0t$}|xj|jz c_||dkr2|jt/j|| | dd|n|dkr1|jt/j|| | dd |n|dkrC|jt/j|| | d dt/jnH|dkrB|jt/j|| | d d t/jd }|S)zParse `nth` pseudo.r_child_typerrevenrXrToddrs1rran1Nrs2b0 ofrKFrMrLrN) groupdictrrr~rr r rbRE_NTHrrendswithr#rhr[r9r;r\CSS_NTH_OF_S_DEFAULTrrrrrrYr)rrrrr=mdictpostfixrrgrkvar nth_parts_s1rh_s2 pseudo_selnth_sels rsparse_pseudo_nthzCSSParser.parse_pseudo_nthsA  99' ( ( GGG <f #>#>??f *UYYuw7788 f  BBCC   BBCCU3Zg)>)>??I"..W9??43H3HC3O3O##UWC$$A**S//C||C   s  q"v q"..W9??43H3HC3O3O##UWCs## ys+++S"BS"B6] h  wwt}} #..y!%%((JQYDYZZ/ gm+   """\))r~b#r5%QQRRRR000r~b#r5$PPQQQ^++r~b#r4HYHYZZ[[[[222r~b#r4rGXGXYYZZZ rurrcttz}|dkr |tz}n|dkr |tz}n|dvr |tz}|j||||d}|S)z"Parse pseudo with opening bracket.rCrB)rDrAT)r;r\FLG_NOT FLG_RELATIVE FLG_FORGIVErrr[)rrrrr=rrgs rsrDzCSSParser.parse_pseudo_opensX% 6>> W EE V^^ \ !EE & & & [ E T11)UEJJKKK rurrrtuple[bool, _Selector, str]c|d}|st}|tkrS||_|dj|dtz}|tn[|r(||_|dj|n,|ddtkrtd||j |d|z}t}d}|||fS)Parse combinator tokens.relationrrSrNz%The multiple combinators at position F) rstrip WS_COMBINATORCOMMA_COMBINATORrrrrr ra)rrrrrrr combinators rsparse_has_combinatorzCSSParser.parse_has_combinator-sWWZ((..00  '&J ) ) )#CL bM # * *3 / / /]*H   Y[[ ) ) ) ) ' " '..s3333!"".. *CECCLZ'Hkk S(**rur is_pseudo is_forgivetuple[bool, _Selector]c x|d} | st} |sW|r | tkrt d| d|d|j|| tkr!d|_|dd=||n| tkrX|js|stj dd|_|j ||||dd=n;|j || |_ |dd=||t}d}||fS) rrzThe combinator 'z' at position z , must have a selector before itTNrQF)rrrrr rarrrrr4rrrr) rrrrrrrrrrs rsparse_combinatorzCSSParser.parse_combinatorXsjWWZ((..00  '&J & /?!?!?)hzhhhhhL---# aaaL  %%%---w8y8 nS$77CG $$Y///  %%%aaaLL $$Y///) aaaL  %%%kk S  ruc|d}|dr0|jt |ddn/|jt |ddd}|S)zParse HTML classes and ids.r.rNT)rr#rrrr)rrrrrs rsparse_class_idzCSSParser.parse_class_ids771::   s # # 7 K  |HQRRL99 : : : : GNN< 55 6 6 6 ructjt|d}|dkrt jdt |dk}t|d}g}t|D]}|dr|d} | drt| d d d } nt| } | | |j tj ||d }|S) zParse contains.rrEz\The pseudo class ':contains' is deprecated, ':-soup-contains' should be used moving forward.rGvaluessplitr)rrrrT)rr~rrwarningswarn FutureWarning RE_VALUESfinditerr#rrrSelectorContains) rrrrr contains_ownrrtokenrs rsparse_pseudo_containszCSSParser.parse_pseudo_containss9L99:: [ Mn   !66 aggh//00''// # #E{{7## KK((E ++ ,$U1R4[$77$U++ OOE " " " " B/,GGHHH ruc|d}g}t|D]}|dr|d}|drt |ddd}nt |}|||jtj|d}|S)zParse pseudo language.rrrrrrT) rrrr#rrrr SelectorLang)rrrrrrrrs rsparse_pseudo_langzCSSParser.parse_pseudo_langs""''// # #E{{7## KK((E ++ ,$U1R4[$77$U++ OOE " " " " 11222 ructj|ddkr tjn tj}|xj|zc_d}|S)zParse pseudo direction.dirltrT)rr~rr SEL_DIR_LTR SEL_DIR_RTLrg)rrrrrs rsparse_pseudo_dirzCSSParser.parse_pseudo_dirsJ#'*QWWU^^"<"<"E"E2> U  rurc P t}g}d}d}g}dtz} |j} t|tz} t|t z} t|t z} t|tz}t|tz}t|tz}t|tz}t|tz}t|tz}t|tz}t|tz}|jr| rt!d| rt!d| rt!d|rt!d|rt!d|rt!d|rt!d |rt!d |rt!d |rt!d |rt!d | r!|t t%|\}}|dvr$|xjdz c_||dkr%t)d|d|dkr|xjt.jzc_d}n`|dkr||||}nA|dkr||||||\}}n|dkr%t)d|d|dkr||||}n|dvr|||||}n|dkr||||}n|dkr||||}d}nu|dkr|sH|s?t?d|d|j |dd|_!| rd}n6t?d|d|j |d|d krA| r|"||||| |\}}} n|#|||||| ||\}}n|d!kr|$|||}n{|d"krZ|r@t?d#|dd$|j |d|%|||}n|d%vr|&|||}|'d}n#tP$rYnwxYw| r|st?d&||j ||r|j)s| st/j*d'd(|_)| r(| |_+|d)j,|n^|j,-||d(d(=||n)|r'|r|s#d|_!|d(d(=||d}|st?d||j ||rt.j.|d)_|rt.j/|d)_|rt.j0|d)_|rt.j1|d)_|rt.j2|d)_t/j3d*|D|||j| z S)+zParse selectors.FrSz is_pseudo: Truez is_open: Truez is_relative: Truez is_not: Truez is_html: Truez is_default: Truez is_indeterminate: Truez is_in_range: Truez is_out_of_range: Truez is_placeholder_shown: Truez is_forgive: TrueT)r rrrzAt-rules found at position rrrrrz!Pseudo-element found at position r)rrrrrz Expected a selector at position z)Unmatched pseudo-class close at position r rrzTag name found at position z instead of at the start)rrz"Unclosed pseudo-class at position rQNrc6g|]}|Sry)r).0ss rs z-CSSParser.parse_selectors..s >>>q >>>ru)4rrrrr\r;rr~FLG_HTML FLG_DEFAULTFLG_INDETERMINATE FLG_IN_RANGEFLG_OUT_OF_RANGEFLG_PLACEHOLDER_SHOWNrrprintrnextrNotImplementedErrorr_rgrrHr<rarr|rrr rarrrr0r6rr9 StopIterationrr4rrr SEL_DEFAULTSEL_INDETERMINATE SEL_IN_RANGESEL_OUT_OF_RANGESEL_PLACEHOLDER_SHOWNr)rr=rrgrrrclosedrrris_openr is_relativeis_notr? is_defaultis_indeterminate is_in_rangeis_out_of_rangeis_placeholder_shownrrrs rsr[zCSSParser.parse_selectorsskk   & ux'((+,, 5</00 ego&&ux'((%+-.. (9 9::5</00 u'7788#E,A$ABB%+-..  : . -+,,, +)*** /-... *())) +)*** .,--- 42333 /-... 31222# 86777 .,---  *   Y[[ ) ) )H E !iQ999JJ!OJJ$$&&&)##-.XAGGTUJJ.X.XYYYE\\II-II#'LL111#'#A#A#q,#W#WLLN**,0,C,CCLZcel,m,m)L'',,,-.^RSRYRYZ[R\R\.^.^___---#'#=#=c1l#S#SLLCCC#'#8#8ay#Y#YLLM))#'#9#9#q,#O#OLLL((#'#8#8a#N#NL"GGN**',)"5 O1771:: O O $ ! ## (, !%1TPQ TT LGGAJJ I%%"6:6O6OL)Xu773 c88-1,A,AL)Y S]_d--) ccK''#'#@#@a#V#VLLE\\#1^!''!**^^^ LGGAJJ $(#9#9#q,#O#OLLO++#'#6#6sA|#L#LLaKE !P<    D   6 %>I>>>QUQ[^cQcddds LT TTrac #fKt|}|r|dnd}t|}|r|ddz nt |dz }|jrtd|||krd}|jD]}| |||j }|rv| }|jr>td|d| dd|d|d}||fVn|V||}|dkrd |}n,|d krd |}n |d krd |}n|dkrd|}nd|d|}t||j|||k|jrtddSdS)zIterate selector tokens.rrz ## PARSING: NzTOKEN: 'z' --> z at position [z)Malformed attribute selector at position rz%Malformed class selector at position #z"Malformed id selector at position rSz,Malformed pseudo-class selector at position zInvalid character z position z## END PARSING) RE_WS_BEGINr%r9 RE_WS_ENDr_rrr css_tokensrrgrrr ra) rrarrr9vrrmsgs rs selector_iterzCSSParser.selector_iters   w ' '$a1   W % %"#;qwwqzzA~~#g,,*: : . ,,, - - -sllA_  GGGUDJ77::<r?rrir@) rrrrrrr=r>rir) rrrrbrrr=r>rrhrir)rrrrrrrrrrbrrhrir)rrrrrrrrrrrrrrrrhrir)rr)r=r>rrhrgrhrir)rarbrir>)rrhrgrhrir)(rrrrrPAT_PSEUDO_CLOSErPAT_PSEUDO_CONTAINSPAT_PSEUDO_NTH_CHILDPAT_PSEUDO_NTH_TYPEPAT_PSEUDO_LANGPAT_PSEUDO_DIRPAT_PSEUDO_CLASS_CUSTOMPAT_PSEUDO_CLASSPAT_PSEUDO_ELEMENTPAT_AMP PAT_AT_RULEPAT_ID PAT_CLASSPAT_TAGPAT_ATTR PAT_COMBINErrrr0r6r<rar|rDrrrrrrr[rrqryrursrprps (899&K'#  $%FH\^mn"$IK^`op O_My./J   -/FGG(899(*<==w'' ;//f%%++w'' X.. ;//3J>;?     aaaa DDDDL>B%B%B%B%HAAAAF.)+)+)+)+V.!.!.!.!`    2* zezezezezex'$'$'$'$RTTTTTTTrurpzhtml|*:is(a, area)[href]r8z\ html|*:is(input[type=checkbox], input[type=radio])[checked], html|option[selected] z :checked, /* This pattern must be at the end. Special logic is applied to the last selector. */ html|form html|*:is(button, input)[type="submit"] aF html|input[type="checkbox"][indeterminate], html|input[type="radio"]:is(:not([name]), [name=""]):not([checked]), html|progress:not([value]), /* This pattern must be at the end. Special logic is applied to the last selector. */ html|input[type="radio"][name]:not([name='']):not([checked]) a html|*:is(input:not([type=hidden]), button, select, textarea, fieldset, optgroup, option, fieldset)[disabled], html|optgroup[disabled] > html|option, html|fieldset[disabled] > html|*:is(input:not([type=hidden]), button, select, textarea, fieldset), html|fieldset[disabled] > html|*:not(legend:nth-of-type(1)) html|*:is(input:not([type=hidden]), button, select, textarea, fieldset) z| html|*:is(input:not([type=hidden]), button, select, textarea, fieldset, optgroup, option, fieldset):not(:disabled) z,html|*:is(input, textarea, select)[required]z2html|*:is(input, textarea, select):not([required])aW html|input:is( :not([type]), [type=""], [type=text], [type=search], [type=url], [type=tel], [type=email], [type=password], [type=number] )[placeholder]:not([placeholder='']):is(:not([value]), [value=""]), html|textarea[placeholder]:not([placeholder='']) z*|*a html|*:is( textarea, input:is( :not([type]), [type=""], [type=text], [type=search], [type=url], [type=tel], [type=email], [type=number], [type=password], [type=date], [type=datetime-local], [type=month], [type=time], [type=week] ) ):not([readonly], :disabled), html|*:is([contenteditable=""], [contenteditable="true" i]) z! html|*:not(:read-write) z html|input:is( [type="date"], [type="month"], [type="week"], [type="time"], [type="datetime-local"], [type="number"], [type="range"] ):is( [min], [max] ) z* html|*:is(details, dialog)[open] z( html|*:is(video, audio)[muted] ) rarbrcrdrerfrgrhrirjr)rerfrir{)F)rrbrrrirb)rrbrirb)ir __future__rr functoolsrrrrrnrrr rtypingr r r r rrrEr]rCrZPSEUDO_SPECIALr^NEWLINEWSCOMMENTSWSC CSS_ESCAPESCSS_STRING_ESCAPES IDENTIFIERNTHVALUEATTRrrrrrrrrrrrrrrrrrrrrrrqrrr$rrrrrr;r~rrrrr\rrrr _MAXCACHErtrzrmrrrrrrprqrJrKrLrMrNrOrPrSrXrsrUrTrVrWrRrQryrursrs """""" %%%%%%------------! <8   !#99NJMddguu '' 0R(<<<< MMM'MMM8C8C K#JJJJJnGnn7nn_innn`c``s``u``#``Z]``` z   *   NJ N Nj N N N ^ ^ ^j ^ ^ ^ ^VZ ^ ^ ^AAAAAAHHHHHH;j;;; <<<,*,, J  ."%2:=?ADIQTVX[ -! /dd5ddSddCddRWdd\_ddd-GGsGGGBBRBBCBBB 2hhuhhhhPShhV[hh`chhhRZMMMMrt T T ^R^^SZ^^^`b`dee fsffQTfffhjhl m m BJJJJ3JJ#JJJBD Q Q  2bjc%% BJ3{{{ # # BJ63666 = =           9,&&&&    PPPPP6866666666("""""?"""JAAAAAAAAHC TC TC TC TC TC TC TC TT 9  *x/00 i*x/00  i  *x/+=>> I   *x/2CCDDy*x/00 i*x/00  y2*x/00 y8*x/00 "  *x/2GGHH"!y *%%.*x/00/2 *x/00  y *|3h>?? "9 *'77(BCC$ 9  *x/00   I  *x/00  ru