o
    ^iB|                     @   s  U d Z ddlZddlmZ ddlmZmZmZmZm	Z	m
Z
 ejdkr)ddlmZ nddlmZ ddlmZ ddlmZ dd	lmZmZ dd
lmZmZ ddlmZ ddlmZ ddlmZmZmZm Z  e!e ej"Z#ee$d< e	dZ%e
eef Z&e'Z(e'Z)ej*ej+ej,hZ-ee$d< e#j.e#j/e#j0e#j1e#j2e#j3e#j4e#j5e#j6e#j7h
Z8ee$d< dZ9ee$d< dej:e9< ddhZ;ee$d< ej<ej=ej>ej?ej@ejAhZBee$d< ejCejDejEejFejGejHejIejJejKejLejMejNejOejPhZQee$d< ejJejPhZRee$d< eRejKhB ZSee$d< e#jTe#jUe#jVe#jWe#jXhZYee$d< e#jZe#j[e#j\e#j]e#j^e#j_e#j`hZaee$d< e#jbe#jce#jde#jee#jfe#jge#jhe#jie#jje#jke#jle#jme#jVe#jne#joe#jphZqee$d< e#jre#jshZtee$d< h dZuee$d < e#jve#j^e#jwhZxee$d!< ejyejzej{ej|ej}ej~iZee$d"< ee Zee$d#< ee Zee$d$< eeB Zee$d%< eeje9ejejejejejhB Zee$d&< d'Zed(d)G d*d+ d+ee% Zd,ed-ed.ed/efd0d1Zdd3e'd4ed5ed/efd6d7Zd8ee& d/ee fd9d:Zd8ee& d;eee)  d/efd<d=Zd8ee& d/ee) fd>d?Zd@edAe&d/ee& fdBdCZdDe&dEe&d/dfdFdGZd,ed/e&fdHdIZd8e&d/ee fdJdKZd8e&d/efdLdMZd8ed/efdNdOZd8e&d/efdPdQZd8e&d/efdRdSZd8e&d/efdTdUZd8e&d/efdVdWZd8e&d/efdXdYZd8e&d/efdZd[Zejyejzffd\ed]ed^ee d_ee'e'f d/ef
d`daZd8e&d/efdbdcZdd8e&deed/efdfdgZd8e&d/efdhdiZd8e&d/efdjdkZd,edlee) d/efdmdnZd8ed/efdodpZd8ed/efdqdrZd8e&d/efdsdtZd8ed/efdudvZd8ed/efdwdxZd8ed/efdydzZd8e&d/efd{d|Zd8e&d/efd}d~Zd,ed/efddZd,ed/efddZd,ed/efddZd,ed/efddZd,ed/efddZd,ed/efddZd,ed.ed/efddZded.ed/efddZd,ed.ed/efddZded.ed/efddZd(ddede&ded/dfddZd8e&d/ee& fddZd,ed/dfddZded/ee fddZded/ee fddZded/ee fddZded/ee fddZd,ed/ed fddZd,ed/efddZd8e&d/ee fddZd8e&d/ee fddZd,ed/e&fddZd8e&de'd/efddZdS )z>
blib2to3 Node/Leaf transformation-related utility functions.
    N)Iterator)FinalGenericLiteralOptionalTypeVarUnion)   
   )	TypeGuard)
mypyc_attr)	CACHE_DIR)ModePreview)get_string_prefixhas_triple_quotes)pygram)token)NLLeafNode	type_reprsymsT
WHITESPACE	STATEMENT   STANDALONE_COMMENTandorLOGIC_OPERATORSCOMPARATORSMATH_OPERATORSSTARSVARARGS_SPECIALSVARARGS_PARENTSUNPACKING_PARENTSTEST_DESCENDANTSTYPED_NAMES>   %=&=*=+=-=/=@=^=|=**=//=<<=>>=:=ASSIGNMENTSIMPLICIT_TUPLEBRACKETOPENING_BRACKETSCLOSING_BRACKETSBRACKETSALWAYS_NO_SPACE7   T)allow_interpreted_subclassesc                   @   s<   e Zd ZdZdedee fddZdedee fddZdS )	VisitorzBBasic lib2to3 visitor that yields things of type `T` on `visit()`.nodereturnc                 c   sd    |j dk rtj|j  }ntt|j }t| d| d}|r(||E dH  dS | |E dH  dS )az  Main method to visit `node` and its children.

        It tries to find a `visit_*()` method for the given `node.type`, like
        `visit_simple_stmt` for Node objects or `visit_INDENT` for Leaf objects.
        If no dedicated `visit_*()` method is found, chooses `visit_default()`
        instead.

        Then yields objects of type `T` from the selected visitor.
           visit_N)typer   tok_namestrr   getattrvisit_default)selfrB   namevisitf rN   P/var/www/html/stock_analysis/be/venv/lib/python3.10/site-packages/black/nodes.pyvisit   s   

zVisitor.visitc                 c   s0    t |tr|jD ]}| |E dH  q	dS dS )zCDefault `visit_*()` implementation. Recurses to children of `node`.N)
isinstancer   childrenrP   )rK   rB   childrN   rN   rO   rJ      s   

zVisitor.visit_defaultN)	__name__
__module____qualname____doc__LNr   r   rP   rJ   rN   rN   rN   rO   rA      s    rA   leafcomplex_subscriptmoderC   c                C   s  d}d}d}| j }| j}| j}|tv r|S |tjkr|S |dus'J d| |tjkr9|j tjtj	tj
hvr9|S |tjkrI|j tjtjfv rI|S | j}	|	st|}
|
rZ|
j tv r\|S |tjkru|
j tjkri|S |
j tjkrs|ss|S |S |
j tjkr|
jr|
jj tjtjtjtjhv r|S |
jj tjkr|
jS n||
j tjkrt|
tjkrt|
jtj	tjfv r|S |
j tv rt|
tt B dr|S nR|
j tjkr|
jr|
jj tjtj
hv r|r|S |S n8|
jr|
jj tj!kr|
j t"v r|S |
j tj#kr|jr|jj tj$kr|S n|	j tv r|S |	j tj%kr|S |j tjtjhv r-|	r)|	j tjkr+|S |S |j tjkrB|	r@|	j tjkr@|S |S |j tjkrs|	sN|S |tjkr^|	j t&vr\|S |S |	j tjkrh|	jS |	j tjkrq|S |S |j t&v r|	st|}
|
r|
j tjkr|S |S |j tj'kr|tj(ks|tj)kr|S |	s|tj*ks|tj+kr|S |S |	j tjkr|S |S |j tjkr|tjkr|S |	st|}
|
r|
j tj(kr|S |S |	j tjhtB v r|S |S |j tj$kr|S |j tj,kr!|	r|S t|}
|
r|
j tj#ks|
j tj*kr|S |S |j tj-kr>|tj(kr0|S |	r<|	j tj(kr<|S |S |j tjtj
hv rw|	sa|jdusUJ d|jj tj	kr_|S |S |tj.ksn|	j tj.krp|S |su|S |S |j tj/kr|	r|tj*kr|S |S |j tj0kr|	r|	j tj1kr|S |S |j tj!tjhv r|	st|}
|
r|
j tv r|S |
j}|dusJ |
j tjkr|j tjtj
hv r|S |
j tjkr|j tjkr|S |S |tj2tj3tj4hv r|S |S |j tj5kr0|tj*kr|	r|	j tj*kr|S |S |tj2kr.|dkr"|S |	r.|	j tj*kr.|S |S |j tj
kr9|S |j tj6krH|tjkrH|S |S )	zReturn whitespace prefix if needed for the given `leaf`.

    `complex_subscript` signals whether the given leaf is part of a subscription
    which has non-trivial arguments, like arithmetic expressions or function calls.
      z  Nz/INTERNAL ERROR: hand-made leaf without parent: )withinzsubscripts are always parentedimport)7rF   parentvaluer>   r   COMMENTCOLONr   	subscriptsubscriptlistsliceopLBRACEfstring_replacement_fieldtstring_replacement_fieldprev_siblingpreceding_leafr;   COMMAEQUALarglistargument
parametersvarargslisttypedargslistprefixSTARparent_type	star_expr
tname_starr$   	is_varargr%   r&   factorr"   AT	decoratorBANGr(   trailerLPARRPARDOTLSQBdotted_nameclassdef
COLONEQUALatomdictsetmaker
DOUBLESTARNAMENUMBERSTRINGimport_fromexcept_clause)rY   rZ   r[   NOSPACEDOUBLESPACEtpvprevprevpprevp_parentrN   rN   rO   
whitespace   s  



&    ~vofcYV"JC4/*
	r   
nl_count	form_feed
empty_linec                 C   s    |r|| d  d | S ||  S )z$Generate a normalized prefix string.   rN   )r   r   r   rN   rN   rO   make_simple_prefix  s   r   rB   c                 C   sR   | r'| j }|r"t|tr|S z	t| d W S  ty!   Y dS w | j} | sdS )z3Return the first leaf that precedes `node`, if any.N)rj   rQ   r   listleaves
IndexErrorr`   )rB   resrN   rN   rO   rk     s   
rk   tokensc                 C   sJ   |sdS |d du r| du S | sdS | j |d krdS t| j|dd S )a;  Return if the `node` and its previous siblings match types against the provided
    list of tokens; the provided `node`has its type matched against the last element in
    the list.  `None` can be used as the first element to declare that the start of the
    list is anchored at the start of its parent's children.Tr   NF)rF   prev_siblings_arerj   )rB   r   rN   rN   rO   r     s   r   c                 C   s   | du s	| j du rdS | j jS )z|
    Returns:
        @node.parent.type, if @node is not None and has a parent.
            OR
        None, otherwise.
    N)r`   rF   rB   rN   rN   rO   ru     s   ru   ancestor
descendantc                 C   s*   |}|r|j | kr|j }|r|j | ks	|S )z:Return the child of `ancestor` that contains `descendant`.)r`   )r   r   rB   rN   rN   rO   child_towards  s
   r   	old_child	new_childc                 C   s2   | j }|sdS |  }|dur||| dS dS )z
    Side Effects:
        * If @old_child.parent is set, replace @old_child with @new_child in
        @old_child's underlying Node structure.
            OR
        * Otherwise, this function does nothing.
    N)r`   removeinsert_child)r   r   r`   	child_idxrN   rN   rO   replace_child  s   r   c                 C   sr   | j }| }|r7|j}|du r	 |S |jd j |kr	 |S |jtjkr%	 |S |jdur3|jjtv r3	 |S |}|s|S )zReturn `leaf` or one of its ancestors that is the topmost container of it.

    By "container" we mean a node where `leaf` is the very first child.
    Nr   )rs   r`   rR   rF   r   
file_inputrj   r=   )rY   same_prefix	containerr`   rN   rN   rO   container_of  s&   	r   c                 C   s&   t | tr| S | jrt| jd S dS )z(Returns the first leaf of the node tree.r   N)rQ   r   rR   first_leaf_ofr   rN   rN   rO   r     s
   
r   c                 C   s   | j tjtjtjtjhv S )z?Whether node is an arithmetic or a binary arithmetic expression)rF   r   
arith_expr
shift_exprxor_exprand_exprr   rN   rN   rO   is_arith_like  s   r   c                 C   s   t | tr| jtjkrdS t| j}t|drdS | j	r7| j	jt
jkr7| j	js7| j	j	r7| j	j	jt
jkr7dS t| j	d tjtjt
jgrFdS t| j	t
jtjt
jgrTdS dS )NFbBfFT)rQ   r   rF   r   r   r   ra   setintersectionr`   r   simple_stmtrj   r   r   NEWLINEINDENTrp   rc   )rB   rs   rN   rN   rO   is_docstring(  s0   

r   c                 C   s>   | j tjkot| jdko| jd j tjko| jd j tjkS )z+Return True if `node` holds an empty tuple.   r   r   )rF   r   r   lenrR   r   r~   r   r   rN   rN   rO   is_empty_tupleH  s   r   c                 C   sv   | j tjkr&t| }|du s|j tjkrdS t|jdko%|jd j tjkS | j t	v o:t| jdko:| jd j tjkS )zMReturn True if `node` holds a tuple with one element, with or without parens.NFr   r   )
rF   r   r   unwrap_singleton_parenthesistestlist_gexpr   rR   r   rl   r9   rB   gexprN   rN   rO   is_one_tupleR  s    
r   c                 C   s4   | j tjkrdS t| }|du s|j tjkrdS dS )z$Return True if `node` holds a tuple.FNT)rF   r   r   r   r   r   rN   rN   rO   is_tupleb  s   r   c                 C   D   | j tjkrdS t| }|du s|j tjkrdS tdd |jD S )zDReturn True if `node` holds a tuple that contains a walrus operator.FNc                 s       | ]	}|j tjkV  qd S N)rF   r   namedexpr_test.0rS   rN   rN   rO   	<genexpr>u      z-is_tuple_containing_walrus.<locals>.<genexpr>rF   r   r   r   r   anyrR   r   rN   rN   rO   is_tuple_containing_walrusm     r   c                 C   r   )zBReturn True if `node` holds a tuple that contains a star operator.FNc                 s   r   r   )rF   r   rv   r   rN   rN   rO   r     r   z+is_tuple_containing_star.<locals>.<genexpr>r   r   rN   rN   rO   is_tuple_containing_starx  r   r   c                 C   r   )z(Return True if `node` holds a generator.FNc                 s   r   r   )rF   r   old_comp_forr   rN   rN   rO   r     r   zis_generator.<locals>.<genexpr>r   r   rN   rN   rO   is_generator  r   r   openingclosingr   bracketsc           	      C   s   | j |j f|kr
dS |jd }t|D ]
\}}|| u r nqtdd}|d7 }||d D ]2}||u r9 |dk S |j}||kr`|j tjkr`|d7 }|jr`|jj tjtj	hv r`|d7 } |dk S q.|dk S )zIReturn True if content between `opening` and `closing` is a one-sequence.Fr   z#Opening paren not found in `leaves`r   Nr   )
rF   bracket_depth	enumerateLookupErrorr   rl   r`   r   rn   rr   )	r   r   r   r   depth_opening_indexrY   commasr   rN   rN   rO   is_one_sequence_between  s4   
 r   c                 C   s   t | }|duo|jtjkS )z7Return True iff `node` is of the shape ( test := test )N)r   rF   r   r   )rB   innerrN   rN   rO   is_walrus_assignment  s   r   Flastc                 C   s   | j tjkoTt| jdko| jd j tjko| jd j tjkpT|o9t| jdko9| jd j tjko9| jd j tj	kpT|oTt| jdkoT| jd j tjkoT| jd j tj	kS )z?Return True iff `node` is a trailer valid in a simple decoratorr   r   r   r	   )
rF   r   r}   r   rR   r   r   r   r~   r   )rB   r   rN   rN   rO   is_simple_decorator_trailer  s(   r   c                 C   sp   | j tjkrdS | j tjkr6| jr6| jd j tjko5ttt| jdd o5t	| jdk p5t| jd ddS dS )a\  Return True iff `node` could be a 'dotted name' decorator

    This function takes the node of the 'namedexpr_test' of the new decorator
    grammar and test if it would be valid under the old decorator grammar.

    The old grammar was: decorator: @ dotted_name [arguments] NEWLINE
    The new grammar is : decorator: @ namedexpr_test NEWLINE
    Tr   r   r   r   )r   F)
rF   r   r   r   powerrR   allmapr   r   r   rN   rN   rO   is_simple_decorator_expression  s   	r   c                 C   sx   | j tjkrdS t| r| jdkrdS | j tjkrdS t| jdkr$dS | j\}}}|j tj	kr:|j tj
kr:t|S dS )zAReturn True if `node` holds a `yield` or `yield from` expression.TyieldFr	   )rF   r   
yield_expris_name_tokenra   r   r   rR   r   r~   r   is_yield)rB   lparexprrparrN   rN   rO   r     s   r   r^   c                 C   s@   | j tvs| js
dS | j}|j tjkr|jsdS |j}|j |v S )aF  Return True if `leaf` is a star or double star in a vararg or kwarg.

    If `within` includes VARARGS_PARENTS, this applies to function signatures.
    If `within` includes UNPACKING_PARENTS, it applies to right hand-side
    extended iterable unpacking (PEP 3132) and additional unpacking
    generalizations (PEP 448).
    F)rF   r$   r`   r   rv   )rY   r^   r   rN   rN   rO   rx      s   
rx   c                 C      | j tjkS )z&Return True if the node is an f-string)rF   r   fstringr   rN   rN   rO   
is_fstring  s   r   c                 C   s:   t | t| jd }ttj|| jd}|  pd|_|S )z:Converts an fstring or tstring node back to a string node.N)rs   r   )rH   r   rs   r   r   r   
get_linenolineno)rB   string_without_prefixstring_leafrN   rN   rO   fstring_tstring_to_string  s   r   c                 C   sD   t | trt| rt| }n
t | tr| }ndS t|jo!d|jv S )zKReturn True if `leaf` is a multiline string that actually spans many lines.Fr   )rQ   r   r   r   r   r   ra   )rB   rY   rN   rN   rO   is_multiline_string$  s   

r   c                 C   s8   | j tjtjhv sJ | jd usJ | jj tjtjhv S r   )rF   r   suiter   r`   funcdefr   r   rN   rN   rO   is_parent_function_or_class0  s   r   c                 C   s   | j tjtjtjhv S r   )rF   r   r   r   async_funcdefr   rN   rN   rO   is_function_or_class7     r   c                 C   s   | j durt| sdS | j rdS t| jdks4| jd jtjks4| jd jtj	ks4| jd jtj
kr6dS | jd j r@dS t| jd S )z2Return True if `node` is a suite with a stub body.NF   r   r   r	   r   )r`   r   rs   stripr   rR   rF   r   r   r   DEDENTis_stub_bodyr   rN   rN   rO   is_stub_suite;  s    
r  c                 C   sp   t | tr| jtjkrdS t| jdkrdS | jd }|j  o7|jtj	ko7t|jdko7t
dd |jD S )zCReturn True if `node` is a simple statement containing an ellipsis.Fr   r   r	   c                 s   s     | ]}|t tjd kV  qdS ).N)r   r   r   )r   rY   rN   rN   rO   r   _  s    zis_stub_body.<locals>.<genexpr>)rQ   r   rF   r   r   r   rR   rs   r  r   r   )rB   rS   rN   rN   rO   r  R  s   

r  c                 C   sp   t | ts| jtjkrdS | jd | jd }}t |to7|jtjko7|jdko7t |to7|jtj	ko7|jdkS )zGiven a `LN`, determines whether it's an atom `node` with invisible
    parens. Useful in dedupe-ing and normalizing parens.
    Fr   r   r\   )
rQ   r   rF   r   r   rR   r   r~   ra   r   )rB   firstr   rN   rN   rO   is_atom_with_invisible_parensc  s   


r  c                 C   s   t | pt| S r   )is_empty_lparis_empty_rparrY   rN   rN   rO   is_empty_paru  s   r  c                 C      | j tjko
| jdkS Nr\   )rF   r   r~   ra   r
  rN   rN   rO   r  y  r   r  c                 C   r  r  )rF   r   r   ra   r
  rN   rN   rO   r	  }  r   r	  c                 C   sP   | j }| j}| j}t|tjko&|dkr|r|jtjkp&|dko&|o&|jtjkS )z9Return True if the given leaf starts an import statement.r_   from)	r`   rF   ra   boolr   r   r   import_namer   )rY   r   r   r   rN   rN   rO   	is_import  s   
r  c                 C   sR   t | jtjko| jdko| jo| jjtjkp(t | jtjko'| j	o'| j	jtjkS )zDReturn True if the given leaf starts a with or async with statement.with)
r  rF   r   r   ra   r`   r   	with_stmtASYNCnext_siblingr
  rN   rN   rO   is_with_or_async_with_stmt  s   r  c                 C   s*   t | jtjko| jo| jjtjtjhv S )zReturn True if the given leaf starts an async def/for/with statement.

    Note that `async def` can be either an `async_stmt` or `async_funcdef`,
    the latter is used when it has decorators.
    )r  rF   r   r  r`   r   
async_stmtr   r
  rN   rN   rO   is_async_stmt_or_funcdef  s   r  c                 C   $   | j }| j}|tjthv ot||S )aB  Return True if the given leaf is a type comment. This function should only
    be used for general type comments (excluding ignore annotations, which should
    use `is_type_ignore_comment`). Note that general type comments are no longer
    used in modern version of Python, this function may be deprecated in the future.)rF   ra   r   rb   r   is_type_comment_stringrY   r[   r   r   rN   rN   rO   is_type_comment  s   r  ra   c                 C   s<   t j|v r| do| dd   d}|S | d}|S )N#r   ztype:z# type:)r   standardize_type_comments
startswithlstripra   r[   is_validrN   rN   rO   r    s
   
 
r  c                 C   r  )zGReturn True if the given leaf is a type comment with ignore annotation.)rF   ra   r   rb   r   is_type_ignore_comment_stringr  rN   rN   rO   is_type_ignore_comment  s
   r$  c                 C   s@   t j|v rt| |o| ddd  d}|S | d}|S )zSReturn True if the given string match with type comment with
    ignore annotation.r6   r   ignorez# type: ignore)r   r  r  splitr   r  r!  rN   rN   rO   r#    s   


r#  )visibler`   rS   r'  c                C   sh   t tj|rdnd}t tj|rdnd}|j}d|_| pd}ttj|||g}||_| 	|| dS )zWrap `child` in parentheses.

    This replaces `child` with an atom holding the parentheses and the old
    child.  That requires moving the prefix.

    If `visible` is False, the leaves will be valueless (and thus invisible).
    (r\   )r   N)
r   r   r~   r   rs   r   r   r   r   r   )r`   rS   r'  r   r   rs   indexr   rN   rN   rO   wrap_in_parentheses  s   r+  c                 C   s>   t | jdkr	dS | j\}}}|jtjkr|jtjksdS |S )zqReturns `wrapped` if `node` is of the shape ( wrapped ).

    Parenthesis can be optional. Returns None otherwiser	   N)r   rR   rF   r   r~   r   )rB   r   wrappedr   rN   rN   rO   r     s   r   c                 C   s0   | j tjkrd| _dS | j tjkrd| _dS dS )zMake sure parentheses are visible.

    They could be invisible as part of some statements (see
    :func:`normalize_invisible_parens` and :func:`visit_import_from`).
    r(  r)  N)rF   r   r~   ra   r   r
  rN   rN   rO   ensure_visible  s
   

r-  nlc                 C   r   r   )rF   r   r   r.  rN   rN   rO   r        r   c                 C   r   r   )rF   r   r~   r/  rN   rN   rO   is_lpar_token  r0  r1  c                 C   r   r   )rF   r   r   r/  rN   rN   rO   is_rpar_token  r0  r2  c                 C   r   r   )rF   r   r   r/  rN   rN   rO   is_number_token
  r0  r3  )rC   paramNc                 C   sP   | j }|dur&|jr|jjtjkrdS |j r|j jtjkrdS |j }|dusdS )z<Returns the type of annotation this leaf is part of, if any.NrC   r4  )r`   rj   rF   r   RARROWr   tname)rY   r   rN   rN   rO   get_annotation_type  s   r7  c                 C   s   | j dusJ t| duS )z7Returns whether this leaf is part of a type annotation.N)r`   r7  r
  rN   rN   rO   is_part_of_annotation  s   r8  c                 C   &   t | tr| S | jsdS t| jd S )z,Returns the first leaf of the ancestor node.Nr   )rQ   r   rR   
first_leafr   rN   rN   rO   r:     
   
r:  c                 C   r9  )z+Returns the last leaf of the ancestor node.Nr   )rQ   r   rR   	last_leafr   rN   rN   rO   r<  *  r;  r<  c                 C   sJ   | }|j r#|j jr#||j jd u r#|j }|j r#|j jr#||j jd u s|S )zGReturns the furthest ancestor that has this leaf node as the last leaf.r   )r`   rR   )rY   rB   rN   rN   rO    furthest_ancestor_with_last_leaf4  s
   r=  rF   c                 C   sX   | j }|d ur|j|krdS |j }|d us| j}|d ur*|j|kr#dS |j}|d usdS )NTF)rj   rF   r  )rB   rF   siblingrN   rN   rO   has_sibling_with_type<  s   

r?  )r   )F)rW   syscollections.abcr   typingr   r   r   r   r   r   version_infor   typing_extensionsmypy_extensionsr   black.cacher   
black.moder   r   black.stringsr   r   blib2to3r   blib2to3.pgen2r   blib2to3.pytreer   r   r   r   
initializepython_symbolsr   __annotations__r   rX   intLeafIDNodeTyper  r   r   r   if_stmt
while_stmtfor_stmttry_stmtr   r  r   r   
match_stmt
case_blockr   r   rG   r    LESSGREATEREQEQUALNOTEQUAL	LESSEQUALGREATEREQUALr!   VBAR
CIRCUMFLEXAMPER	LEFTSHIFT
RIGHTSHIFTPLUSMINUSrt   SLASHDOUBLESLASHPERCENTrz   TILDEr   r"   r#   r$   rn   ro   r}   rr   rq   r%   r   r   	listmakerr   testlist_star_exprsubject_exprpatternr&   testlambdefor_testand_testnot_test
comparisonrv   r   r   r   r   r   termr   r   r'   r6  rw   r(   r8   testlistexprlistr9   r~   r   r   RSQBrg   RBRACEr:   r   keysr;   valuesr<   r=   rl   FSTRING_MIDDLEFSTRING_ENDTSTRING_MIDDLETSTRING_ENDr|   r>   r5  rA   r  rH   r   r   rk   r   r   ru   r   r   r   r   r   r   r   r   r   r   r   r   tupler   r   r   r   r   rx   r   r   r   r   r   r  r  r  r  r  r	  r  r  r  r  r  r$  r#  r+  r   r-  r   r1  r2  r3  r7  r8  r:  r<  r=  r?  rN   rN   rN   rO   <module>   sd    


	

" s"

 



%
	 

