+
    Ki#  c                   sN  a  R t0 t ^ RIHtHt ^ RIHtHtHtHtH	t	 ^ RI
Ht RRRRRRR	R/t] ^ k R
 R lt ! R R]4      t ! R R]4      t ! R R]4      t ! R R]4      t ! R R]4      t ! R R]4      t ! R R]4      t ! R R]4      t ! R R]4      t]! 4       t] ^k R# ) i    )ABCabstractmethod)AnyCallableDictListOptional)strip_accentsZtrueTyesZfalseFnoc                sF    V ^8  d   QhR\         \        ,          R\        /# )   flagreturn)r   boolstrformat   "</usr/lib/python3.14/site-packages/lutris/search_predicate.py__annotate__r   	   s     # #htn # #    c                 s    V '       d   R # R# )r   r	    )r      &r   format_flagr   	   s    5"d"r   c                   s   a  ] tR t^t o Rt]V 3R lR l4       tV 3R lR ltRV 3R lR lltV 3R	 lR
 lt	V 3R lR lt
V 3R lR ltV 3R lR ltV 3R lR lt]V 3R lR l4       tRtV tR# )SearchPredicateztThis class is a filter function that also includes formatting and other functionality so
it can be edited in the UI.c                &   < V ^8  d   QhRS[ RS[/# r
   	candidater   r   r   r   __classdict__   "r   r   SearchPredicate.__annotate__   s        r   c                    R# )z2This method tests an object against the predicate.Tr   selfr      &&r   acceptZSearchPredicate.accept        r   c                   < V ^8  d   QhRR/# r
   r   r   r   r   r   r   r   r       s      + r   c                    V # )zThis method and return a simplified and flattened version of
the predicate; the simplified predicate will match the same objects as
the original.r   r#   r   r   simplifyZSearchPredicate.simplify   s	     r   Nc                :   < V ^8  d   QhRS[ RS[S[ ,          RR/# r
   tagvaluer   r   r   r   r   r   r   r   r       s'       Xc] FW r   c                r)   )zReturns a predicate without the MatchPredicate that has the tag and value
given (or just the tag). Matches that are negated or the like are not removed.r   r#   r.   r/      &&&r   without_matchZSearchPredicate.without_match   	     r   c                6   < V ^8  d   QhRS[ RS[S[ ,          /# r
   r.   r   r   r   r   r   r   r   r    !   s      s tCy r   c                s    . # )za"Returns all the values for the matches for the tag given; again any
negated matches are ignored.r   r#   r.   r$   r   get_matchesZSearchPredicate.get_matches!   s	     	r   c                $   < V ^8  d   QhRS[ RR/# r
   r.   r   r   r   r   r   r   r   r    &   s       (9 r   c                r)   )zyReturns a predicate without the FlagPredicate that has the tag
given. Flags that are negated or the like are not removed.r   r8   r$   r   without_flagZSearchPredicate.without_flag&   r4   r   c                r   r6   r   r   r   r   r   r   r    +   s      C D r   c                r!   )zmTrue if the predicate has a FlagPredicate with the tag given;
Flags that are negated or the like are ignored.Fr   r8   r$   r   has_flagZSearchPredicate.has_flag+   s     r   c                6   < V ^8  d   QhRS[ RS[S[,          /# r6   r   r   r   r   r   r   r   r    0   s      C HTN r   c                r!   )zDReturns the flag test value for the FlagPredicte with the tag
given.Nr   r8   r$   r   get_flagZSearchPredicate.get_flag0   r&   r   c                    < V ^8  d   QhRS[ /# r
   r   r<   r   r   r   r   r    5   s      s r   c                s    \        V 4      # )zReturns the text of this predicate as it should be if nested inside a larger
predicate; this may be in parentheses where __str__ would not be.r<   r*   r   r   to_child_textZSearchPredicate.to_child_text5   s     4yr   c                rC   rD   r<   r   r   r   r   r    ;   s       r   c                    R # Nr   r*   r   r   __str__ZSearchPredicate.__str__:   s    r   r   rG   )__name__
__module____qualname____firstlineno____doc__r   r%   r+   r3   r9   r=   r?   rB   rE   rH   __static_attributes____classdictcell__r      @r   r   r      sx     #    
 
 
 
 
 
  r   r   c                   sN   a  ] tR t^?t o RtV 3R lR ltV 3R lR ltR tRtV t	R# )	FunctionPredicatezGThis is a generate predicate that wraps a function to perform the test.c                sB   < V ^8  d   QhRS[ S[.S[3,          RS[RR/# )r
   	predicatetextr   Nr   r   r   r   r   r   r   r   FunctionPredicate.__annotate__B   s-      (C5$;"7 s t r   c                s    Wn         W n        R # rG   rS   rT   )r#   rS   rT   r2   r   __init__ZFunctionPredicate.__init__B   s    "	r   c                r   r   r   r   r   r   r   rV   F   s     ) ) ) )r   c                s$    V P                  V4      # rG   )rS   r"   r$   r   r%   ZFunctionPredicate.acceptF   s    ~~i((r   c                s    V P                   # rG   )rT   r*   r   r   rH   ZFunctionPredicate.__str__I   s    yyr   rW   N
rI   rJ   rK   rL   rM   rX   r%   rH   rN   rO   rP   rQ   r   rR   rR   ?   s&     Q ) ) r   rR   c                   sj   a a ] tR t^Mt oRtV3R lV 3R lltV3R lR ltR	V3R lR lltRtVt	V ;t
# )
MatchPredicatezMatchPredicate is a predicate that tests a property against a value; you still provide
a function to do the test, but the object records the tag and value explicitly for editing
purposes.c          
      sN   < V ^8  d   QhRS[ S[.S[3,          RS[RS[RS[RR/# )r
   rS   rT   r.   r/   r   NrU   r   r   r   r   MatchPredicate.__annotate__R   s=      (C5$;"7 s  UX ]a r   c                s>   < \         SV `  W4       W0n        W@n        R # rG   )ZsuperrX   r.   r/   )r#   rS   rT   r.   r/   	__class__s   &&&&&r   rX   ZMatchPredicate.__init__R   s    )
r   c                r5   r6   r7   r   r   r   r   r[   W   s     7 7s 7tCy 7r   c                sB    V P                   V8X  d   V P                  .# . # rG   r.   r/   r8   r$   r   r9   ZMatchPredicate.get_matchesW   s    #xx3

|6B6r   c                r,   r-   r0   r   r   r   r   r[   Z   s,     S S SXc] SFW Sr   c                s    Vf   V P                   V8X  d   \        # T # V P                   V8X  d   V P                  V8X  d   \        # T # rG   )r.   TRUE_PREDICATEr/   r1   r2   r   r3   ZMatchPredicate.without_matchZ   s<    =%)XX_>>$>!%STZZ55H~RdRr   r]   rG   )rI   rJ   rK   rL   rM   rX   r9   r3   rN   rO   Z__classcell__)r\   r   s   @@r   rZ   rZ   M   s0      
7 7S S Sr   rZ   c                   s   a  ] tR t^at o RtV 3R lR ltV 3R lR ltV 3R lR ltV 3R lR	 ltV 3R
 lR lt	R t
RtV tR# )FlagPredicatezThis is a predicate to match a boolean property. This odd setting is useful to override
the default filtering Lutris provides, like filtering out hidden games.c                sT   < V ^8  d   QhRS[ S[,          RS[S[.S[3,          RS[/# )r
   r   flag_functionr.   )r   r   r   r   r   r   r   r   r   FlagPredicate.__annotate__e   s2      Xd^ HcUD[<Q X[ r   c                s*    Wn         W n        W0n        R # rG   r   r`   r.   )r#   r   r`   r.      &&&&r   rX   ZFlagPredicate.__init__e   s    	*r   c                r   r   r   r   r   r   r   ra   j   s     : : : :r   c                s^    V P                   f   R# V P                   V P                  V4      8H  # )NT)r   r`   r"   r$   r   r%   ZFlagPredicate.acceptj   s)    99yyD..y999r   c                r:   r;   r<   r   r   r   r   ra   o   s     ; ; ;(9 ;r   c                s4    V P                   V8X  d   \        # T # rG   )r.   r^   r8   r$   r   r=   ZFlagPredicate.without_flago   s    !%S~:d:r   c                r   r6   r>   r   r   r   r   ra   r   s      C D r   c                s    WP                   8H  # rG   )r.   r8   r$   r   r?   ZFlagPredicate.has_flagr   s    hhr   c                r@   r6   rA   r   r   r   r   ra   u   s     6 6C 6HTN 6r   c                s@    V P                   V8X  d   V P                  # R # rG   )r.   r   r8   r$   r   rB   ZFlagPredicate.get_flagu   s     HHOtyy55r   c                sN    \        V P                  4      pV P                   R V 2# Z:)r   r   r.   )r#   Z	flag_text   & r   rH   ZFlagPredicate.__str__x   s%    		*	((1YK((r   rb   N)rI   rJ   rK   rL   rM   rX   r%   r=   r?   rB   rH   rN   rO   rP   rQ   r   r_   r_   a   sG     O 
: :
; ; 6 6) )r   r_   c                   sN   a  ] tR t^}t o RtV 3R lR ltV 3R lR ltR tRtV t	R# )	TextPredicatez>This is a predicate with no tag used to make text generically.c                sT   < V ^8  d   QhRS[ RS[S[.S[S[ ,          3,          RS[ /# )r
   
match_texttext_functionr.   )r   r   r   r   r   r   r   r   TextPredicate.__annotate__   s4     + +3 +xxPS}@T7U +\_ +r   c                sf    W0n         Wn        \        V4      P                  4       V n        W n        R # rG   )r.   rg   r   casefoldstripped_textrh   )r#   rg   rh   r.   rc   r   rX   ZTextPredicate.__init__   s(    $*:6??A*r   c                r   r   r   r   r   r   r   ri      s     M M M Mr   c                s    V P                  V4      pV'       g   R # \        V4      P                  4       p\        T;'       d    V P                  V9   4      # )F)rh   r   rj   r   rk   )r#   r   Zcandidate_text   && r   r%   ZTextPredicate.accept   sI    ++I6&~6??ANKKt'9'9^'KLLr   c                st    V P                   '       d   V P                    R V P                   2# V P                  # rd   )r.   rg   r*   r   r   rH   ZTextPredicate.__str__   s/    888hhZq 122r   )rg   rk   r.   rh   NrY   rP   rQ   r   rf   rf   }   s(     H+ +M M r   rf   c                   s`   a  ] tR t^t o RtV 3R lR ltV 3R lR ltV 3R lR ltR tR	t	V t
R
# )NotPredicatezXThis predicate reverses the effect of another, and also 'hides' it from
editing methods.c                r:   )r
   	to_negater   N)r   r   r   r   r   NotPredicate.__annotate__   s     # #/ #d #r   c                    Wn         R # rG   rn   )r#   rn   r$   r   rX   ZNotPredicate.__init__   s    "r   c                r   r   r   r   r   r   r   ro      s     4 4 4 4r   c                sB    V P                   P                  V4      '       * # rG   )rn   r%   r"   r$   r   r%   ZNotPredicate.accept   s    >>((333r   c                rC   rD   r<   r   r   r   r   ro      s     6 6s 6r   c                s>    R V P                   P                  4        R2# )z(-))rn   rE   r*   r   r   rE   ZNotPredicate.to_child_text   s    DNN0023155r   c                s:    R \        V P                  4      ,           # )Z-)r   rn   r*   r   r   rH   ZNotPredicate.__str__   s    S(((r   rq   N)rI   rJ   rK   rL   rM   rX   r%   rE   rH   rN   rO   rP   rQ   r   rm   rm      s2     # #4 46 6) )r   rm   c                   s   a  ] tR t^t o RtV 3R lR ltV 3R lR ltV 3R lR ltV 3R lR	 ltRV 3R lR llt	V 3R lR lt
V 3R lR ltV 3R lR ltR tRtV tR
# )AndPredicatez^This predicate combines other predicates so all must accept a candidate
before it is accepted.c                4   < V ^8  d   QhRS[ S[,          RR/# r
   
componentsr   Nr   r   r   r   r   r   AndPredicate.__annotate__         % %4#8 %T %r   c                rp   rG   rv   r#   rv   r$   r   rX   ZAndPredicate.__init__       $r   c                r   r   r   r   r   r   r   rx      s        r   c                s`    V P                    F  pVP                  V4      '       d   K   R # 	  R# )FTrv   r%   r#   r   crl   r   r%   ZAndPredicate.accept   s'    A88I&& ! r   c                r'   r(   r   r   r   r   r   rx      s     	J 	J+ 	Jr   c                s   . pV P                    F[  pVP                  4       pV\        8w  g   K   \        V\        4      '       d   WP                   ,          pKJ  VP                  V4       K]  	  V'       d   \	        V4      # \        # rG   )rv   r+   r^   
isinstancers   appendr#   Z
simplifiedr      &  r   r+   ZAndPredicate.simplify   sc    
A

AN"a..,,.J%%a( ! ,6|J'I>Ir   c                r5   r6   r7   r   r   r   r   rx      s      s tCy r   c                s^    . pV P                    F  pW#P                  V4      ,          pK  	  V# rG   )rv   r9   )r#   r.   Zmatchesr   s   &&  r   r9   ZAndPredicate.get_matches   s+    A}}S))G !r   Nc                r,   r-   r0   r   r   r   r   rx      s'     
 
 
Xc] 
FW 
r   c                s    . pV P                    F2  pVP                  W4      pV\        8w  g   K!  VP                  V4       K4  	  W0P                   8w  d   \	        V4      # V # rG   )rv   r3   r^   r   rs   )r#   r.   r/   new_componentsr   rs   &&&   r   r3   ZAndPredicate.without_match   sU    A+AN"%%a( !
 __,//r   c                r:   r;   r<   r   r   r   r   rx      s     
 
 
(9 
r   c                s    . pV P                    F2  pVP                  V4      pV\        8w  g   K!  VP                  V4       K4  	  W P                   8w  d   \	        V4      # V # rG   )rv   r=   r^   r   rs   )r#   r.   r   r   r   s   &&   r   r=   ZAndPredicate.without_flag   sU    As#AN"%%a( !
 __,//r   c                r   r6   r>   r   r   r   r   rx      s      C D r   c                `    V P                    F  pVP                  V4      '       g   K   R # 	  R# TF)rv   r?   r#   r.   r   rl   r   r?   ZAndPredicate.has_flag   s%    Azz# ! r   c                r@   r6   rA   r   r   r   r   rx      s      C HTN r   c                s    V P                    F-  pVP                  V4      '       g   K  VP                  V4      u # 	  R # rG   )rv   r?   rB   r   rl   r   rB   ZAndPredicate.get_flag   s0    Azz#zz#& ! r   c                F    R P                  R V P                   4       4      # )Z c              3   s8   "   T F  p\        V4      x  K  	  R # 5irG   r<   Z.0r   re   r   	<genexpr>Z'AndPredicate.__str__.<locals>.<genexpr>   s     81As   Zjoinrv   r*   r   r   rH   ZAndPredicate.__str__   s    xx8888r   rz   rG   )rI   rJ   rK   rL   rM   rX   r%   r+   r9   r3   r=   r?   rB   rH   rN   rO   rP   rQ   r   rs   rs      sf     % % 	J 	J 
 

 
  9 9r   rs   c                   sr   a  ] tR t^t o RtV 3R lR ltV 3R lR ltV 3R lR ltV 3R lR	 ltR
 t	Rt
V tR# )OrPredicatezThis predicate combines other predicates so that a candidate is accepted
if any component accepts it. This also hides the components from editing.c                rt   ru   rw   r   r   r   r   OrPredicate.__annotate__   ry   r   c                rp   rG   rz   r{   r$   r   rX   ZOrPredicate.__init__   r|   r   c                r   r   r   r   r   r   r   r      s        r   c                r   r   r}   r~   rl   r   r%   ZOrPredicate.accept   s'    Axx	"" ! r   c                r'   r(   r   r   r   r   r   r      s     
' 
'+ 
'r   c                s    . pV P                    F]  pVP                  4       pV\        8X  d   Vu # \        V\        4      '       d   WP                   ,          pKL  VP                  V4       K_  	  \	        V4      # rG   )rv   r+   r^   r   r   r   r   r   r   r+   ZOrPredicate.simplify   sa    
A

AN"![))ll*
!!!$ ! :&&r   c                rC   rD   r<   r   r   r   r   r     s      s r   c                s    R V  R2# )Z(rr   r   r*   r   r   rE   ZOrPredicate.to_child_text  s    4&{r   c                r   )z OR c              3   s@   "   T F  qP                  4       x  K  	  R # 5irG   )rE   r   re   r   r   Z&OrPredicate.__str__.<locals>.<genexpr>  s     Fo??,,os   r   r*   r   r   rH   ZOrPredicate.__str__  s    {{FdooFFFr   rz   N)rI   rJ   rK   rL   rM   rX   r%   r+   rE   rH   rN   rO   rP   rQ   r   r   r      s?     Q% % 
' 
' G Gr   r   c                   s<   a  ] tR tRt o RtV 3R lR ltR tRtV tR# )TruePredicatei  z"This predicate matches everything.c                r   r   r   r   r   r   r   ZTruePredicate.__annotate__  s        r   c                rF   )Tr   r"   r$   r   r%   ZTruePredicate.accept  s    r   c                rF   )Z r   r*   r   r   rH   ZTruePredicate.__str__  s    r   r   N)	rI   rJ   rK   rL   rM   r%   rH   rN   rO   rP   rQ   r   r   r     s     ,  r   r   c                s    V ^8  d   Qh/ ^ \         9   d&   \        \        \        \        ,          3,          ;R&   ^\         9   d
   \
        ;R&   # )r
   
FLAG_TEXTSr^   )__conditional_annotations__r   r   r   r   r   r   r   r   r   r      s=     # #
 a `Dhtn$% ` $h 2 1 1i $r   N)r   Zabcr    r   Ztypingr   r   r   r   r   Zlutris.util.stringsr   r   r   r   rR   rZ   r_   rf   rm   rs   r   r   r^   r   )r   rQ   r   <module>r      s    # # 6 6 -)/udGUTXZ_(`
 `#/c /d S& S()O )8O .)? )"C9? C9LG/ G@O  #0/ 1r   