
    Rh                        d Z ddlZddlZddl ddlmZmZ ddlmZm	Z	m
Z
 dPddddZd	 ZdQdd
dZd Zd ZdRdZd Zd ZdSdZ ej(                  d      ZdTdZd ZdddZd Z G d de      Z G d de      ZdZdZ ee d      s(d  Z!d! Z"d" Z#d# Z$ e%e!e"      e _&         e%e#e$      e _'         G d$ d%e(      Z)d& Z* G d' d(e e))      Z+ G d* d+e e))      Z, G d, d-e e))      Z- G d. d/e e))      Z. G d0 d1e e))      Z/e/Z0e+e1e2e3fe,e4fe-e5fe. e(d      e6fe/ e(d2      fiZ7e+e6fiZ8e6d/ e(d      d/e1d(e2d(e3d(e4d+e5d- e(d2      d1iZ9 G d3 d4e:      Z; G d5 d6e;      Z< G d7 d8e;      Z= ee>d9      sd: Z?d; Z@ e%e?e@      e>_A         G d< d=eB      ZC G d> d?eD      ZE G d@ dAeD      ZF G dB dCeD      ZGdD eHej                  j                  dz         z   ZK e
e       G dE dF             ZLdGZMdHZNg eMeNZO G dI dJe      ZPdK ZQdLD  ci c]  } |  eR       j                  |        c} ZTdM ZUdN ZVeWdOk(  r eV        yyc c} w )UaH  
    ast
    ~~~

    The `ast` module helps Python applications to process trees of the Python
    abstract syntax grammar.  The abstract syntax itself might change with
    each Python release; this module helps to find out programmatically what
    the current grammar looks like and allows modifications of it.

    An abstract syntax tree can be generated by passing `ast.PyCF_ONLY_AST` as
    a flag to the `compile()` builtin function or by using the `parse()`
    function from this module.  The result will be a tree of objects whose
    classes all inherit from `ast.AST`.

    A modified abstract syntax tree can be compiled into a Python code object
    using the built-in `compile()` function.

    Additionally various helper functions are provided that make working with
    the trees simpler.  The main intention of the helper functions and this
    module in general is to provide an easy to use interface for libraries
    that work tightly with the python syntax (template engines for example).


    :copyright: Copyright 2008 by Armin Ronacher.
    :license: Python License.
    N)*)contextmanagernullcontext)IntEnumauto_simple_enumF)type_commentsfeature_versionc                    t         }|r	|t        z  }|d}n*t        |t              r|\  }}|dk7  rt	        d|       |}t        | ||||      S )z
    Parse the source into an AST node.
    Equivalent to compile(source, filename, mode, PyCF_ONLY_AST).
    Pass type_comments=True to get back type comments where the syntax allows.
       zUnsupported major version: )_feature_version)PyCF_ONLY_ASTPyCF_TYPE_COMMENTS
isinstancetuple
ValueErrorcompile)sourcefilenamemoder	   r
   flagsmajorminors           /usr/lib/python3.12/ast.pyparser   "   sl     E##	OU	+&uA::5'BCC68T5$35 5    c                     t        | t              rt        | j                  d      d      } t        | t              r| j
                  } d fdfdfd |       S )aT  
    Evaluate an expression node or a string containing only a Python
    expression.  The string or node provided may only consist of the following
    Python literal structures: strings, bytes, numbers, tuples, lists, dicts,
    sets, booleans, and None.

    Caution: A complex expression can overflow the C stack and cause a crash.
    z 	evalr   c                 V    d}t        | dd       x}r|d| z  }t        |d| z         )Nzmalformed node or stringlinenoz	 on line : )getattrr   )nodemsglnos      r   _raise_malformed_nodez+literal_eval.<locals>._raise_malformed_nodeE   sB    ($$//3/Yse$$CD8},--r   c                     t        | t              r&t        | j                        t        t
        t        fvr |        | j                  S N)r   Constanttypevalueintfloatcomplex)r%   r(   s    r   _convert_numz"literal_eval.<locals>._convert_numJ   s7    $)T$**-=c5RYEZ-Z!$'zzr   c                     t        | t              rRt        | j                  t        t        f      r2 | j
                        }t        | j                  t              r|S | S  |       S r*   )r   UnaryOpopUAddUSuboperand)r%   r7   r1   s     r   _convert_signed_numz)literal_eval.<locals>._convert_signed_numN   sU    dG$DGGdD\)J"4<<0G$''4( y  y D!!r   c           	      |   t        | t              r| j                  S t        | t              rt	        t        | j                              S t        | t              rt        t        | j                              S t        | t              rt        t        | j                              S t        | t              r]t        | j                  t              rC| j                  j                  dk(  r*| j                  | j                   cxk(  rg k(  rt               S  t        | t"              rpt%        | j&                        t%        | j(                        k7  r |        t+        t-        t        | j&                        t        | j(                                    S t        | t.              rt        | j0                  t2        t4        f      rn | j6                        } | j8                        }t        |t:        t<        f      r4t        |t>              r$t        | j0                  t2              r||z   S ||z
  S  |       S )Nset) r   r+   r-   Tupler   mapeltsListlistSetr:   CallfuncNameidargskeywordsDictlenkeysvaluesdictzipBinOpr4   AddSubleftrightr.   r/   r0   )r%   rP   rQ   _convertr1   r8   r(   s      r   rR   zliteral_eval.<locals>._convertV   s   dH%::e$Xtyy122d#Hdii011c"s8TYY/00t$DIIt)Diille#		T]](Hb(H5L )Id#499~T[[!11%d+C$))4$++68 9 9e$DGGc3Z)H&tyy1D ,E$e-*UG2Ldggs+%<'%<'"4((r   )r   strr   lstrip
Expressionbody)node_or_stringrR   r1   r8   r(   s    @@@@r   literal_evalrX   8   s\     .#&~44U;&I.*-',,.
")4 N##r   )indentc                    dfd	t        | t              s"t        d| j                  j                  z        t        t
              sdz   |       d   S )a  
    Return a formatted dump of the tree in node.  This is mainly useful for
    debugging purposes.  If annotate_fields is true (by default),
    the returned string will show the names and the values for fields.
    If annotate_fields is false, the result string will be more compact by
    omitting unambiguous field names.  Attributes such as line
    numbers and column offsets are not dumped by default.  If this is wanted,
    include_attributes can be set to true.  If indent is a non-negative
    integer or string, then the tree will be pretty-printed with that indent
    level. None (the default) selects the single line representation.
    r   c                    dz  dz  z   }dz  z   }nd}d}t        | t              rNt        |       }g }d}}| j                  D ]]  }	 t	        | |      }	|	t	        ||d      d}" |	      \  }	}
|xr |
}|r|j                  |d|	       M|j                  |	       _ rb| j                  rV| j                  D ]G  }	 t	        | |      }	|	t	        ||d        |	      \  }	}
|xr |
}|j                  |d|	       I |r<t        |      d	k  r.| j                  j                  d
dj                  |      d| fS | j                  j                  d
||j                  |      ddfS t        | t              r&| syd||j                  fd| D              ddfS t        |       dfS # t
        $ r d}Y w xY w# t
        $ r Y w xY w)N   
z,
 , T.=r   ()F)z[]T[c              3   6   K   | ]  } |      d      ywr   N ).0x_formatlevels     r   	<genexpr>z(dump.<locals>._format.<locals>.<genexpr>   s     /S50A!0D/Ss   ])r   ASTr,   _fieldsr$   AttributeErrorappend_attributesrH   	__class____name__joinr?   repr)r%   rj   prefixsepclsrE   	allsimplerF   namer-   simpleri   annotate_fieldsinclude_attributesrY   s    `         r   ri   zdump.<locals>._format   s   QJEFUN*F&5.(CFCdC t*CDI&H '#D$/E =WS$%<%D#H 'u 5v%0&	KK4 78KK&' "d&6&6 ,, 	9D! 'd 3 }dC)@)H $+E5$9ME6 ) 4fIKK4 78	9 SY!^#'>>#:#:DIIdOLRVhVV!%!8!8&#((4.QSXXXd#! %sxx/Sd/S'STV[[[Dz4= & #H  * ! !s$   GGGG	G G zexpected AST, got %r )r   )r   rm   	TypeErrorrr   rs   rS   )r%   r|   r}   rY   ri   s    ```@r   dumpr   s   s\    .  . ` dC .1H1HHII*VS"9v4=r   c                     dD ][  }||j                   v s|| j                   v s!t        ||d      }|t        ||      s=|j                  d      sOt	        | ||       ] | S )z
    Copy source location (`lineno`, `col_offset`, `end_lineno`, and `end_col_offset`
    attributes) from *old_node* to *new_node* if possible, and return *new_node*.
    )r"   
col_offset
end_linenoend_col_offsetNend_)rq   r$   hasattr
startswithsetattr)new_nodeold_nodeattrr-   s       r   copy_locationr      sm    
 G /8'''DH4H4H,HHdD1E  $'DOOF,C$./ Or   c                 *    fd | dddd       | S )a{  
    When you compile a node tree with compile(), the compiler expects lineno and
    col_offset attributes for every node that supports them.  This is rather
    tedious to fill in for generated nodes, so this helper adds these attributes
    recursively where not already set, by setting them to the values of the
    parent node.  It works recursively starting at *node*.
    c                    d| j                   v r t        | d      s|| _        n| j                  }d| j                   v r!t        | dd       || _        n| j                  }d| j                   v r t        | d      s|| _        n| j
                  }d| j                   v r!t        | dd       || _        n| j                  }t        |       D ]  } |||||        y )Nr"   r   r   r   )rq   r   r"   r$   r   r   r   iter_child_nodes)r%   r"   r   r   r   child_fixs         r   r   z#fix_missing_locations.<locals>._fix   s    t'''4*$4+++t\408",!__
4+++4.",!__
t///t-t4<&4#!%!4!4%d+ 	HE
JG	Hr   r\   r   rf   )r%   r   s    @r   fix_missing_locationsr      s     H. 	q!QKr   r\   c                 
   t        |       D ]t  }t        |t              rt        |dd      |z   |_        )d|j
                  v rt        |dd      |z   |_        d|j
                  v s[t        |dd      x}k||z   |_        v | S )z
    Increment the line number and end line number of each node in the tree
    starting at *node* by *n*. This is useful to "move code" to a different
    location in a file.
    r"   r   r   )walkr   
TypeIgnorer$   r"   rq   r   )r%   nr   r   s       r   increment_linenor      s     d . eZ("5(A6:ELu((("5(A6:ELE---&ulA>>K)A~E. Kr   c              #   n   K   | j                   D ]  }	 |t        | |      f  y# t        $ r Y "w xY ww)zs
    Yield a tuple of ``(fieldname, value)`` for each field in ``node._fields``
    that is present on *node*.
    N)rn   r$   ro   )r%   fields     r   iter_fieldsr     sE     
  	u---  		s   5&5	2525c              #      K   t        |       D ]G  \  }}t        |t              r| t        |t              s,|D ]  }t        |t              s|  I yw)z
    Yield all direct child nodes of *node*, that is, all fields that are nodes
    and all items of fields that are lists of nodes.
    N)r   r   rm   r?   )r%   rz   r   items       r   r   r     sW     
 #4( eeS!Kt$ dC(J	s   7AA	Ac                    t        | t        t        t        t        f      s"t        d| j                  j                  z        | j                  rt        | j                  d   t              sy| j                  d   j                  } t        | t              r't        | j                  t              r| j                  }ny|rddl}|j                  |      }|S )aC  
    Return the docstring for the given node or None if no docstring can
    be found.  If the node provided does not have docstrings a TypeError
    will be raised.

    If *clean* is `True`, all tabs are expanded to spaces and any whitespace
    that can be uniformly removed from the second line onwards is removed.
    z%r can't have docstringsr   N)r   AsyncFunctionDefFunctionDefClassDefModuler   rr   rs   rV   Exprr-   r+   rS   inspectcleandoc)r%   cleantextr   s       r   get_docstringr     s     d-{HfMN2T^^5L5LLMM99DIIaL$799Q<D$!jS&Azz%Kr   z(.*?(?:\r\n|\n|\r|$))c                     g }t        t        j                  |       d      D ]#  \  }}|||kD  r |S |j                  |d          % |S )z}Split a string into lines ignoring form feed and other chars.

    This mimics how the Python parser splits source code.
    r\   r   )	enumerate_line_patternfinditerrp   )r   maxlineslinesr"   matchs        r   _splitlines_no_ffr   4  s\    
 E"=#9#9&#A1E FX$5L 	U1X Lr   c                 6    d}| D ]  }|dv r||z  }|dz  } |S )z6Replace all chars except '\f\t' in a line with spaces.r^   z	r~   rf   )r   resultcs      r   _pad_whitespacer   A  s6    F ;aKFcMF	
 Mr   )paddedc                   	 |j                   |j                  y|j                  dz
  }|j                   dz
  }|j                  }|j                  }t        | |dz         }||k(  r$||   j                         || j                         S |r.t        ||   j                         d| j                               }nd}|||   j                         |d j                         z   }	||   j                         d| j                         }
||dz   | }|j                  d|	       |j                  |
       dj                  |      S # t        $ r Y yw xY w)aB  Get source code segment of the *source* that generated *node*.

    If some location information (`lineno`, `end_lineno`, `col_offset`,
    or `end_col_offset`) is missing, return None.

    If *padded* is `True`, the first line of a multi-line statement will
    be padded with spaces to match its original position.
    Nr\   )r   r^   r   )r   r   r"   r   ro   r   encodedecoder   insertrp   rt   )r   r%   r   r"   r   r   r   r   paddingfirstlasts              r   get_source_segmentr   L  sP   ??"d&9&9&Aq__q(
__
,, fz!|<EVV}##%j@GGII!%-"6"6"8*"E"L"L"NOeFm**,Z[9@@BBE##%o~6==?D&(:&E	LLE	LL775>%  s   E 6E 	EEc              #      K   ddl m}  || g      }|r2|j                         } |j                  t	        |              |  |r1yyw)z
    Recursively yield all descendant nodes in the tree starting at *node*
    (including *node* itself), in no specified order.  This is useful if you
    only want to modify nodes in place and don't care about the context.
    r   )dequeN)collectionsr   popleftextendr   )r%   r   todos      r   r   r   q  s@      "$=D
||~$T*+
 s   AAAc                   "    e Zd ZdZd Zd Zd Zy)NodeVisitora<  
    A node visitor base class that walks the abstract syntax tree and calls a
    visitor function for every node found.  This function may return a value
    which is forwarded by the `visit` method.

    This class is meant to be subclassed, with the subclass adding visitor
    methods.

    Per default the visitor functions for the nodes are ``'visit_'`` +
    class name of the node.  So a `TryFinally` node visit function would
    be `visit_TryFinally`.  This behavior can be changed by overriding
    the `visit` method.  If no visitor function exists for a node
    (return value `None`) the `generic_visit` visitor is used instead.

    Don't use the `NodeVisitor` if you want to apply changes to nodes during
    traversing.  For this a special visitor exists (`NodeTransformer`) that
    allows modifications.
    c                 r    d|j                   j                  z   }t        | || j                        } ||      S )zVisit a node.visit_)rr   rs   r$   generic_visit)selfr%   methodvisitors       r   visitzNodeVisitor.visit  s4    DNN333$(:(:;t}r   c                     t        |      D ]a  \  }}t        |t              r*|D ]$  }t        |t              s| j	                  |       & @t        |t              sQ| j	                  |       c y)z9Called if no explicit visitor function exists for a node.N)r   r   r?   rm   r   )r   r%   r   r-   r   s        r   r   zNodeVisitor.generic_visit  sa    '- 	"LE5%&! )D!$,

4() E3'

5!	"r   c                 f   |j                   }t        j                  t        |            }|,t        j	                         D ]  \  }}t        ||      s|} n |8d|z   }	 t        | |      }dd l}|j                  | dt        d        ||      S | j                  |      S # t        $ r Y w xY w)Nr   r   z" is deprecated; add visit_Constant   )r-   _const_node_type_namesgetr,   itemsr   r$   warningswarnDeprecationWarningro   r   )	r   r%   r-   	type_namerx   rz   r   r   r   s	            r   visit_ConstantzNodeVisitor.visit_Constant  s    

*..tE{;	399; 	TeS) $I  	)F%!$/  (JK0!5t}$!!$'' " s   !B$ $	B0/B0N)rs   
__module____qualname____doc__r   r   r   rf   r   r   r   r     s    &"(r   r   c                       e Zd ZdZd Zy)NodeTransformeraC  
    A :class:`NodeVisitor` subclass that walks the abstract syntax tree and
    allows modification of nodes.

    The `NodeTransformer` will walk the AST and use the return value of the
    visitor methods to replace or remove the old node.  If the return value of
    the visitor method is ``None``, the node will be removed from its location,
    otherwise it is replaced with the return value.  The return value may be the
    original node in which case no replacement takes place.

    Here is an example transformer that rewrites all occurrences of name lookups
    (``foo``) to ``data['foo']``::

       class RewriteName(NodeTransformer):

           def visit_Name(self, node):
               return Subscript(
                   value=Name(id='data', ctx=Load()),
                   slice=Constant(value=node.id),
                   ctx=node.ctx
               )

    Keep in mind that if the node you're operating on has child nodes you must
    either transform the child nodes yourself or call the :meth:`generic_visit`
    method for the node first.

    For nodes that were part of a collection of statements (that applies to all
    statement nodes), the visitor may also return a list of nodes rather than
    just a single node.

    Usually you use the transformer like this::

       node = YourTransformer().visit(node)
    c                    t        |      D ]  \  }}t        |t              rfg }|D ]Y  }t        |t              r6| j	                  |      }|'t        |t              s|j                  |       I|j                  |       [ ||d d  |t        |t              s| j	                  |      }|t        ||       t        |||        |S r*   )	r   r   r?   rm   r   r   rp   delattrr   )r   r%   r   	old_value
new_valuesr-   r   s          r   r   zNodeTransformer.generic_visit  s     +D 1 	3E9)T*
& -E!%- $

5 1 =$!+E3!7&--e4$%%e,-  *	!Is+::i0#D%(D%2%	3& r   N)rs   r   r   r   r   rf   r   r   r   r     s    !Fr   r   zN{name} is deprecated and will be removed in Python {remove}; use value insteadzU{name} is deprecated and will be removed in Python {remove}; use ast.Constant insteadr   c                 R    ddl }|j                  dt        d       | j                  S )Deprecated. Use value instead.r   NAttribute nr      messageremover   _deprecated_DEPRECATED_VALUE_ALIAS_MESSAGEr-   r   r   s     r   	_n_getterr     ,    #B7 	 	
 zzr   c                 J    dd l }|j                  dt        d       || _        y )Nr   r   r   r   r   r   r-   r   s      r   	_n_setterr   
  )    #B7 	 	
 
r   c                 R    ddl }|j                  dt        d       | j                  S )r   r   NAttribute sr   r   r   r   s     r   	_s_getterr     r   r   c                 J    dd l }|j                  dt        d       || _        y )Nr   r   r   r   r   r   s      r   	_s_setterr     r   r   c                       e Zd Zd Zd Zy)_ABCc                     d| _         y )Nz3Deprecated AST node class. Use ast.Constant instead)r   )rx   rE   s     r   __init__z_ABC.__init__%  s	    Or   c                 f   | t         v r)dd l}|j                  d| j                   t        d       t        |t              sy| t         v rC	 |j                  }t        |t         |          xr! t        |t        j                  | d             S t        j                  | |      S # t        $ r Y yw xY w)Nr   ast.r   r   Frf   )_const_typesr   r   r   _DEPRECATED_CLASS_MESSAGEr   r+   r-   _const_types_notr   ro   r,   __instancecheck__)rx   instr   r-   s       r   r   z_ABC.__instancecheck__(  s    ,  s''()1 ! 
 $),


 ul3&78 I"5*:*>*>sB*GHH %%c400 " s   B$ $	B0/B0N)rs   r   r   r   r   rf   r   r   r   r   #  s    P1r   r   c                 ^   |D ]T  }|| j                   vr| j                   j                  |      }|t        |      k  s<t        | j                   d|       | t
        v r4dd l}|j                  d| j                   t        d       t        |i |S t        j                  | g|i |S )Nz" got multiple values for argument r   r   r   r   )rn   indexrH   r   rs   r   r   r   r   r   r+   __new__)rx   rE   kwargskeyposr   s         r   _newr  >  s     Xckk!kk$T?s||n,NsgVWWX l3##$%/HQX 	 	
 (((C1$1&11r   c                       e Zd ZdZeZy)Num)r   Nrs   r   r   rn   r  r  rf   r   r   r
  r
  N      GGr   r
  )	metaclassc                       e Zd ZdZeZy)StrsNr  rf   r   r   r  r  R  r  r   r  c                       e Zd ZdZeZy)Bytesr  Nr  rf   r   r   r  r  V  r  r   r  c                       e Zd ZeZy)NameConstantN)rs   r   r   r  r  rf   r   r   r  r  Z  s    Gr   r  c                       e Zd ZdZd Zy)Ellipsisrf   c                     | t         u r+dd l}|j                  dt        d       t	        dg|i |S t	        j
                  | g|i |S )Nr   zast.Ellipsisr   r   .)_ast_Ellipsisr   r   r   r+   r  )rx   rE   r  r   s       r   r  zEllipsis.__new__`  sZ    -  (A' !  C1$1&115d5f55r   N)rs   r   r   rn   r  rf   r   r   r  r  ]  s    G6r   r  .c                       e Zd ZdZy)slicezDeprecated AST node class.Nrs   r   r   r   rf   r   r   r  r    s    $r   r  c                       e Zd ZdZd Zy)Indexz@Deprecated AST node class. Use the index value directly instead.c                     |S r*   rf   )rx   r-   r  s      r   r  zIndex.__new__  s    r   Nrs   r   r   r   r  rf   r   r   r  r    s
    Jr   r  c                       e Zd ZdZddZy)ExtSlicez1Deprecated AST node class. Use ast.Tuple instead.c                 >    t        t        |      t               fi |S r*   )r;   r?   Load)rx   dimsr  s      r   r  zExtSlice.__new__  s    T$Z2622r   N)rf   r   rf   r   r   r"  r"    s
    ;3r   r"  r%  c                     | j                   S )zDeprecated. Use elts instead.r=   r   s    r   _dims_getterr)    s    yyr   c                     || _         y r*   r'  r   r-   s     r   _dims_setterr,    s	    	r   c                       e Zd ZdZy)Suite/Deprecated AST node class.  Unused in Python 3.Nr  rf   r   r   r.  r.        9r   r.  c                       e Zd ZdZy)AugLoadr/  Nr  rf   r   r   r2  r2    r0  r   r2  c                       e Zd ZdZy)AugStorer/  Nr  rf   r   r   r4  r4    r0  r   r4  c                       e Zd ZdZy)Paramr/  Nr  rf   r   r   r6  r6    r0  r   r6  1ec                      e Zd ZdZ e       Z e       Z e       Z e       Z e       Z	 e       Z
 e       Z e       Z e       ZeZ e       Z e       Z e       Z e       Z e       Z e       Z e       Z e       Z e       Zd Zy)_Precedencez5Precedence table that originated from python grammar.c                 N    	 | j                  | dz         S # t        $ r | cY S w xY wNr\   )rr   r   r(  s    r   nextz_Precedence.next  s.    	>>$(++ 	K	s    $$N)rs   r   r   r   r   
NAMED_EXPRTUPLEYIELDTESTORANDNOTCMPEXPRBORBXORBANDSHIFTARITHTERMFACTORPOWERAWAITATOMr<  rf   r   r   r9  r9    s    ?JFEFE6D	B
&C
&C
&C6D
C6D6DFEFE6DVFFEFE6Dr   r9  )'")z"""'''c                       e Zd ZdZdddZd Zd Zd ZddZd	 Z	e
dd       Ze
d
dd       Ze
d        Zd Zd Zd Zd Zd Zd Z fdZd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd  Zd! Z d" Z!d# Z"d$ Z#d% Z$d& Z%d' Z&d( Z'd) Z(d* Z)d+ Z*d, Z+d- Z,d. Z-d/ Z.d0 Z/d1 Z0d2 Z1d3 Z2d4 Z3d5 Z4d6 Z5d7 Z6d8 Z7d9 Z8d: Z9d; Z:d< Z;d= Z<d> Z=d? Z>d@ Z?e@ddAdBZAe@dCdDZBdE ZCddFZDdG ZEdH ZFdI ZGdJ ZHdK ZIdL ZJdM ZKdN ZLdO ZMdP ZNdQ ZOdR ZPdS ZQdT ZRdU ZSdVdWdXdYdZZTeUj                  eUj                  eUj                  eUj                  d[ZXd\ ZYdXdYd]d^d_d`dadbdcdddedfdgdhZZeUj                  eUj                  eUj                  eUj                  eUj                  eUj                  eUj                  eUj                  eUj                  eUj                  eUj                  eUj                  eUj                  diZb ecdj      Zddk Zedldmdndodpdqdrdsdtdudv
Zfdw ZgdxdydzZheUj                  eUj                  d{Zkd| Zld} Zmd~ Znd Zod Zpd Zqd Zrd Zsd Ztd Zud Zvd Zwd Zxd Zyd Zzd Z{d Z|d Z}d Z~d Zd Zd Zd Z xZS )	_UnparserzMethods in this class recursively traverse an AST and
    output source code for the abstract syntax; original formatting
    is disregarded.F)_avoid_backslashesc                X    g | _         i | _        i | _        d| _        || _        d| _        y )Nr   F)_source_precedences_type_ignores_indentrU  _in_try_star)r   rU  s     r   r   z_Unparser.__init__  s0    "4!r   c                     t        |      }	  |t        |             |D ]  } |         ||        y# t        $ r Y yw xY w)z7Call f on each item in seq, calling inter() in between.N)iterr<  StopIteration)r   interfseqrh   s        r   
interleavez_Unparser.interleave  sL    3i	d3iL  !  		s   5 	A Ac                      t        |      dk(  r ||d           j                  d       y j                   fd||       y)zTraverse and separate the given *items* with a comma and append it to
        the buffer. If *items* is a single item sequence, a trailing comma
        will be added.r\   r   ,c                  &     j                  d      S Nr_   writer(  s   r   <lambda>z&_Unparser.items_view.<locals>.<lambda>      DJJt$4 r   N)rH   rh  rb  )r   	traverserr   s   `  r   
items_viewz_Unparser.items_view  s8     u:?eAhJJsOOO4iGr   c                 @    | j                   r| j                  d       yy)z8Adds a newline if it isn't the start of generated sourcer]   N)rW  rh  r(  s    r   maybe_newlinez_Unparser.maybe_newline  s    <<JJt r   c                 f    | j                          | j                  d| j                  z  |z          y)zXIndent a piece of text and append it, according to the current
        indentation levelz    N)rn  rh  rZ  r   r   s     r   fillz_Unparser.fill  s*     	

6DLL(4/0r   c                 :    | j                   j                  |       y)zAdd new source partsN)rW  r   rp  s     r   rh  z_Unparser.write  s    D!r   Nc              #   P   K   |g }| j                   }|| _         | || _         y wr*   )rW  )r   bufferoriginal_sources      r   bufferedz_Unparser.buffered  s,     >F,,&s   $&extrac             #      K   | j                  d       |r| j                  |       | xj                  dz  c_        d | xj                  dz  c_        yw)a  A context manager for preparing the source for blocks. It adds
        the character':', increases the indentation on enter and decreases
        the indentation on exit. If *extra* is given, it will be directly
        appended after the colon character.
        :r\   N)rh  rZ  )r   rx  s     r   blockz_Unparser.block  sA      	

3JJus   AAc              #   X   K   | j                  |       d | j                  |       yw)zA context manager for preparing the source for expressions. It adds
        *start* to the buffer and enters, after exit it adds *end*.Nrg  )r   startends      r   delimitz_Unparser.delimit  s"     
 	

5

3s   (*c                 >    |r| j                  ||      S t               S r*   )r  r   )r   r}  r~  	conditions       r   
delimit_ifz_Unparser.delimit_if'  s    <<s++= r   c                 L    | j                  dd| j                  |      |kD        S )z,Shortcut to adding precedence related parensra   rb   )r  get_precedence)r   
precedencer%   s      r   require_parensz_Unparser.require_parens-  s%    sC)<)<T)BZ)OPPr   c                 V    | j                   j                  |t        j                        S r*   )rX  r   r9  r@  r   r%   s     r   r  z_Unparser.get_precedence1  s!      $$T;+;+;<<r   c                 0    |D ]  }|| j                   |<    y r*   )rX  )r   r  nodesr%   s       r   set_precedencez_Unparser.set_precedence4  s!     	1D&0Dd#	1r   c                 (   t        |t        t        t        t        f      rt        |j                        dk  ry|j                  d   }t        |t              sy|j                  }t        |t              rt        |j                  t              r|S yy)zIf a docstring node is found in the body of the *node* parameter,
        return that docstring node, None otherwise.

        Logic mirrored from ``_PyAST_GetDocString``.r\   Nr   )r   r   r   r   r   rH   rV   r   r-   r+   rS   r  s     r   get_raw_docstringz_Unparser.get_raw_docstring8  sv    
 #[(FC
^ayy|$%zzdH%*TZZ*EK +F%r   c                 x    | j                   j                  |j                        xs |j                  }|d| S y )Nz	 # type: )rY  r   r"   type_comment)r   r%   comments      r   get_type_commentz_Unparser.get_type_commentH  s?    $$((5J9J9Jwi(( r   c                 v    t        |t              r|D ]  }| j                  |        y t        |   |       y r*   )r   r?   traversesuperr   )r   r%   r   rr   s      r   r  z_Unparser.traverseM  s6    dD! $d#$ GM$r   c                 h    g | _         | j                  |       dj                  | j                         S )zOutputs a source code string that, if converted back to an ast
        (using ast.parse) will generate an AST equivalent to *node*r^   )rW  r  rt   r  s     r   r   z_Unparser.visitW  s*     dwwt||$$r   c                     | j                  |      x}r0| j                  |       | j                  |j                  dd         y | j                  |j                         y r;  )r  _write_docstringr  rV   )r   r%   	docstrings      r   "_write_docstring_and_traverse_bodyz,_Unparser._write_docstring_and_traverse_body^  sL    //55I5!!),MM$))AB-(MM$))$r   c                     |j                   D ci c]  }|j                  d|j                    c}| _        | j	                  |       | j                  j                          y c c}w )Nignore)type_ignoresr"   tagrY  r  clear)r   r%   r  s      r   visit_Modulez_Unparser.visit_Modulee  s`     ++
 MMVFJJ<00
 	//5  "
s   !A$c                       j                  dd      5   j                   fd j                  |j                         d d d         j	                  d        j                  |j
                         y # 1 sw Y   6xY w)Nra   rb   c                  &     j                  d      S rf  rg  r(  s   r   ri  z._Unparser.visit_FunctionType.<locals>.<lambda>p      

4( r    -> )r  rb  r  argtypesrh  returnsr  s   ` r   visit_FunctionTypez_Unparser.visit_FunctionTypem  s_    \\#s# 	OO($--	
 	

6dll#	 	s   +A44A=c                     | j                          | j                  t        j                  |j                         | j                  |j                         y r*   )rq  r  r9  r?  r-   r  r  s     r   
visit_Exprz_Unparser.visit_Exprv  s5    		K--tzz:djj!r   c                 f   | j                  t        j                  |      5  | j                  t        j                  |j
                  |j                         | j                  |j
                         | j                  d       | j                  |j                         d d d        y # 1 sw Y   y xY w)Nz := )	r  r9  r=  r  rO  targetr-   r  rh  r  s     r   visit_NamedExprz_Unparser.visit_NamedExpr{  sy      !7!7> 	& 0 0$++tzzJMM$++&JJvMM$**%		& 	& 	&s   A=B''B0c                 |      j                  d        j                   fd j                  |j                         y )Nzimport c                  &     j                  d      S rf  rg  r(  s   r   ri  z(_Unparser.visit_Import.<locals>.<lambda>      

4 0 r   )rq  rb  r  namesr  s   ` r   visit_Importz_Unparser.visit_Import  s(    		)0$--Lr   c                 0     j                  d        j                  d|j                  xs dz         |j                  r j                  |j                          j                  d        j	                   fd j
                  |j                         y )Nzfrom .r   z import c                  &     j                  d      S rf  rg  r(  s   r   ri  z,_Unparser.visit_ImportFrom.<locals>.<lambda>  r  r   )rq  rh  rj   modulerb  r  r  r  s   ` r   visit_ImportFromz_Unparser.visit_ImportFrom  sd    		'

3$**/*+;;JJt{{#

:0$--Lr   c                 J   | j                          |j                  D ]D  }| j                  t        j                  |       | j                  |       | j                  d       F | j                  |j                         | j                  |      x}r| j                  |       y y )N = )	rq  targetsr  r9  r>  r  rh  r-   r  )r   r%   r  r  s       r   visit_Assignz_Unparser.visit_Assign  s    		ll 	F 1 16:MM&!JJu	 	djj!0066<6JJ|$ 7r   c                    | j                          | j                  |j                         | j                  d| j                  |j
                  j                  j                     z   dz          | j                  |j                         y )Nr~   z= )	rq  r  r  rh  binopr4   rr   rs   r-   r  s     r   visit_AugAssignz_Unparser.visit_AugAssign  sZ    		dkk"

3DGG$5$5$>$>??$FGdjj!r   c                    | j                          | j                  dd|j                   xr t        |j                  t
                    5  | j                  |j                         d d d        | j                  d       | j                  |j                         |j                  r-| j                  d       | j                  |j                         y y # 1 sw Y   oxY w)Nra   rb   r#   r  )
rq  r  r{   r   r  rC   r  rh  
annotationr-   r  s     r   visit_AnnAssignz_Unparser.visit_AnnAssign  s    		__S#4;;'X:dkkSW;XY 	'MM$++&	'

4doo&::JJuMM$**% 		' 	's   CCc                     | j                  d       |j                  r-| j                  d       | j                  |j                         y y )Nreturnr~   )rq  r-   rh  r  r  s     r   visit_Returnz_Unparser.visit_Return  s5    		(::JJsOMM$**% r   c                 &    | j                  d       y )Npassrq  r  s     r   
visit_Passz_Unparser.visit_Pass  s    		&r   c                 &    | j                  d       y )Nbreakr  r  s     r   visit_Breakz_Unparser.visit_Break  s    		'r   c                 &    | j                  d       y )Ncontinuer  r  s     r   visit_Continuez_Unparser.visit_Continue  s    		*r   c                 |      j                  d        j                   fd j                  |j                         y )Nzdel c                  &     j                  d      S rf  rg  r(  s   r   ri  z(_Unparser.visit_Delete.<locals>.<lambda>  r  r   )rq  rb  r  r  r  s   ` r   visit_Deletez_Unparser.visit_Delete  s(    		&0$--Nr   c                     | j                  d       | j                  |j                         |j                  r-| j	                  d       | j                  |j                         y y )Nzassert r_   )rq  r  testr&   rh  r  s     r   visit_Assertz_Unparser.visit_Assert  sF    		)dii 88JJtMM$((# r   c                 |      j                  d        j                   fd j                  |j                         y )Nzglobal c                  &     j                  d      S rf  rg  r(  s   r   ri  z(_Unparser.visit_Global.<locals>.<lambda>  r  r   rq  rb  rh  r  r  s   ` r   visit_Globalz_Unparser.visit_Global  s(    		)0$**djjIr   c                 |      j                  d        j                   fd j                  |j                         y )Nz	nonlocal c                  &     j                  d      S rf  rg  r(  s   r   ri  z*_Unparser.visit_Nonlocal.<locals>.<lambda>  r  r   r  r  s   ` r   visit_Nonlocalz_Unparser.visit_Nonlocal  s(    		+0$**djjIr   c                 T   | j                  t        j                  |      5  | j                  d       |j                  rV| j                  d       | j                  t        j                  |j                         | j                  |j                         d d d        y # 1 sw Y   y xY w)Nawaitr~   )r  r9  rN  rh  r-   r  rO  r  r  s     r   visit_Awaitz_Unparser.visit_Await  u      !2!2D9 	*JJwzz

3##K$4$4djjAdjj)	* 	* 	*   A4BB'c                 T   | j                  t        j                  |      5  | j                  d       |j                  rV| j                  d       | j                  t        j                  |j                         | j                  |j                         d d d        y # 1 sw Y   y xY w)Nyieldr~   )r  r9  r?  rh  r-   r  rO  r  r  s     r   visit_Yieldz_Unparser.visit_Yield  r  r  c                 H   | j                  t        j                  |      5  | j                  d       |j                  st        d      | j                  t        j                  |j                         | j                  |j                         d d d        y # 1 sw Y   y xY w)Nzyield from z-Node can't be used without a value attribute.)	r  r9  r?  rh  r-   r   r  rO  r  r  s     r   visit_YieldFromz_Unparser.visit_YieldFrom  sv      !2!2D9 	&JJ}%:: !PQQ 0 0$**=MM$**%	& 	& 	&s   A.BB!c                 8   | j                  d       |j                  s|j                  rt        d      y | j	                  d       | j                  |j                         |j                  r-| j	                  d       | j                  |j                         y y )Nraisez*Node can't use cause without an exception.r~   z from )rq  exccauser   rh  r  r  s     r   visit_Raisez_Unparser.visit_Raise  sn    		'xxzz #MOO

3dhh::JJx MM$**% r   c                 `   | j                  d       | j                         5  | j                  |j                         d d d        |j                  D ]  }| j                  |        |j
                  rE| j                  d       | j                         5  | j                  |j
                         d d d        |j                  rF| j                  d       | j                         5  | j                  |j                         d d d        y y # 1 sw Y   xY w# 1 sw Y   hxY w# 1 sw Y   y xY w)Ntryelsefinally)rq  r{  r  rV   handlersorelse	finalbody)r   r%   exs      r   do_visit_tryz_Unparser.do_visit_try  s    		%ZZ\ 	%MM$))$	%-- 	BMM"	;;IIf +dkk*+>>IIi  .dnn-. . 	% 	%+ +. .s#   DD&D$DD!$D-c                 t    | j                   }	 d| _         | j                  |       || _         y # || _         w xY w)NFr[  r  r   r%   prev_in_try_stars      r   	visit_Tryz_Unparser.visit_Try  s;    ,,	1 %Dd# 0D 0D   . 	7c                 t    | j                   }	 d| _         | j                  |       || _         y # || _         w xY w)NTr  r  s      r   visit_TryStarz_Unparser.visit_TryStar  s;    ,,	1 $Dd# 0D 0Dr  c                    | j                  | j                  rdnd       |j                  r,| j                  d       | j	                  |j                         |j
                  r,| j                  d       | j                  |j
                         | j                         5  | j	                  |j                         d d d        y # 1 sw Y   y xY w)Nzexcept*exceptr~    as )rq  r[  r,   rh  r  rz   r{  rV   r  s     r   visit_ExceptHandlerz_Unparser.visit_ExceptHandler  s    		t00)h?99JJsOMM$))$99JJvJJtyy!ZZ\ 	%MM$))$	% 	% 	%s    CCc                    | j                          |j                  D ]$  }| j                  d       | j                  |       & | j                  d|j                  z          t        |d      r| j                  |j                         | j                  dd|j                  xs |j                        5  d}|j                  D ])  }|r| j                  d       nd	}| j                  |       + |j                  D ])  }|r| j                  d       nd	}| j                  |       + 	 d d d        | j                         5  | j                  |       d d d        y # 1 sw Y   4xY w# 1 sw Y   y xY w)
N@zclass type_paramsra   rb   )r  Fr_   T)rn  decorator_listrq  r  rz   r   _type_params_helperr   r  basesrF   rh  r{  r  )r   r%   decocommaes        r   visit_ClassDefz_Unparser.visit_ClassDef  sC   '' 	 DIIcNMM$	  			(TYY&'4'$$T%5%56__S#4::3N_O 	!EZZ !JJt$ Ea ! ]] !JJt$ Ea !	! ZZ\ 	:33D9	: 	:	! 	!	: 	:s   5A3EE(E%(E1c                 (    | j                  |d       y )Ndef_function_helperr  s     r   visit_FunctionDefz_Unparser.visit_FunctionDef2  s    dE*r   c                 (    | j                  |d       y )Nz	async defr
  r  s     r   visit_AsyncFunctionDefz _Unparser.visit_AsyncFunctionDef5  s    dK0r   c                    | j                          |j                  D ]$  }| j                  d       | j                  |       & |dz   |j                  z   }| j                  |       t        |d      r| j                  |j                         | j                  dd      5  | j                  |j                         d d d        |j                  r,| j                  d       | j                  |j                         | j                  | j                  |            5  | j                  |       d d d        y # 1 sw Y   }xY w# 1 sw Y   y xY w)Nr  r~   r   ra   rb   r  rw  )rn  r  rq  r  rz   r   r  r   r  rE   r  rh  r{  r  r  )r   r%   fill_suffixr  def_strs        r   r  z_Unparser._function_helper8  s   '' 	 DIIcNMM$	  #dii/		'4'$$T%5%56\\#s# 	%MM$))$	%<<JJvMM$,,'ZZd33D9Z: 	:33D9	: 	:	% 	%
	: 	:s    D8E8EEc                      |Kt        |      dkD  r< j                  dd      5   j                   fd j                  |       d d d        y y y # 1 sw Y   y xY w)Nr   rc   rl   c                  &     j                  d      S rf  rg  r(  s   r   ri  z/_Unparser._type_params_helper.<locals>.<lambda>L      

4(8 r   )rH   r  rb  r  )r   r   s   ` r   r  z_Unparser._type_params_helperI  s_    "s;'7!';c3' V 8$--UV V (<"V Vs   !AAc                     | j                  |j                         |j                  r-| j                  d       | j                  |j                         y y Nr#   )rh  rz   boundr  r  s     r   visit_TypeVarz_Unparser.visit_TypeVarN  s:    

499::JJtMM$**% r   c                 @    | j                  d|j                  z          y Nr   rh  rz   r  s     r   visit_TypeVarTuplez_Unparser.visit_TypeVarTupleT  s    

3?#r   c                 @    | j                  d|j                  z          y N**r  r  s     r   visit_ParamSpecz_Unparser.visit_ParamSpecW  s    

4$))#$r   c                     | j                  d       | j                  |j                         | j                  |j                         | j                  d       | j                  |j                         y )Nztype r  )rq  r  rz   r  r   rh  r-   r  s     r   visit_TypeAliasz_Unparser.visit_TypeAliasZ  sN    		'dii   !1!12

5djj!r   c                 (    | j                  d|       y )Nzfor _for_helperr  s     r   	visit_Forz_Unparser.visit_Fora  s    &r   c                 (    | j                  d|       y )Nz
async for r$  r  s     r   visit_AsyncForz_Unparser.visit_AsyncFord  s    t,r   c                 f   | j                  |       | j                  t        j                  |j                         | j                  |j                         | j                  d       | j                  |j                         | j                  | j                  |            5  | j                  |j                         d d d        |j                  rF| j                  d       | j                         5  | j                  |j                         d d d        y y # 1 sw Y   \xY w# 1 sw Y   y xY w)N in rw  r  )rq  r  r9  r>  r  r  rh  r]  r{  r  rV   r  )r   rq  r%   s      r   r%  z_Unparser._for_helperg  s    		$K--t{{;dkk"

6dii ZZd33D9Z: 	%MM$))$	%;;IIf +dkk*+ + 	% 	%+ +s   $D5D'D$'D0c                    | j                  d       | j                  |j                         | j                         5  | j                  |j                         d d d        |j
                  rt        |j
                        dk(  rt        |j
                  d   t              r|j
                  d   }| j                  d       | j                  |j                         | j                         5  | j                  |j                         d d d        |j
                  r6t        |j
                        dk(  rt        |j
                  d   t              r|j
                  rF| j                  d       | j                         5  | j                  |j
                         d d d        y y # 1 sw Y   OxY w# 1 sw Y   xY w# 1 sw Y   y xY w)Nzif r\   r   zelif r  )	rq  r  r  r{  rV   r  rH   r   Ifr  s     r   visit_Ifz_Unparser.visit_Ift  sF   		%dii ZZ\ 	%MM$))$	% kkc$++.!3
4;;q>SU8V;;q>DIIgMM$))$ )dii()	 kkc$++.!3
4;;q>SU8V ;;IIf +dkk*+ + 	% 	%) )
+ +s#   F&-F3 F?&F03F<?Gc                    | j                  d       | j                  |j                         | j                         5  | j                  |j                         d d d        |j
                  rF| j                  d       | j                         5  | j                  |j
                         d d d        y y # 1 sw Y   \xY w# 1 sw Y   y xY w)Nzwhile r  )rq  r  r  r{  rV   r  r  s     r   visit_Whilez_Unparser.visit_While  s    		(dii ZZ\ 	%MM$))$	%;;IIf +dkk*+ + 	% 	%+ +s   B4C 4B= C	c                      j                  d        j                   fd j                  |j                          j	                   j                  |            5   j                  |j                         d d d        y # 1 sw Y   y xY w)Nzwith c                  &     j                  d      S rf  rg  r(  s   r   ri  z&_Unparser.visit_With.<locals>.<lambda>  r  r   rw  rq  rb  r  r   r{  r  rV   r  s   ` r   
visit_Withz_Unparser.visit_With  sf    		'0$--LZZd33D9Z: 	%MM$))$	% 	% 	%   BBc                      j                  d        j                   fd j                  |j                          j	                   j                  |            5   j                  |j                         d d d        y # 1 sw Y   y xY w)Nzasync with c                  &     j                  d      S rf  rg  r(  s   r   ri  z+_Unparser.visit_AsyncWith.<locals>.<lambda>  r  r   rw  r2  r  s   ` r   visit_AsyncWithz_Unparser.visit_AsyncWith  sf    		- 0$--LZZd33D9Z: 	%MM$))$	% 	% 	%r4  quote_typesescape_special_whitespacec                   fd}dj                  t        |            |}dv r|D cg c]  }|t        v s| }}|D cg c]	  }|vs| }}|s+t              t	        fd|D        d         }dd |gfS rD|j                  fd	       |d   d   d   k(  r!t        |d         d
k(  sJ dd dz   d   z   |fS c c}w c c}w )zHelper for writing string literals, minimizing escapes.
        Returns the tuple (string literal to write, possible quote types).
        c                     s| dv r| S | dk(  s| j                         s | j                  d      j                  d      S | S )Nz
	\unicode_escapeascii)isprintabler   r   )r   r:  s    r   escape_charz2_Unparser._str_literal_helper.<locals>.escape_char  sB     -fDyxx 0188AAHr   r^   r]   c              3   2   K   | ]  }d    |v s|  ywre   rf   )rg   qstrings     r   rk   z0_Unparser._str_literal_helper.<locals>.<genexpr>  s     CF1IN!Cs   r   r\   r   c                     | d   d   k(  S )Nr   r   rf   )rC  escaped_strings    r   ri  z/_Unparser._str_literal_helper.<locals>.<lambda>  s    qt~b7I/I r   )r  r   Nr=  )rt   r<   _MULTI_QUOTESru   r<  sortrH   )	r   rD  r9  r:  rA  possible_quotesrC  quoterF  s	    ` `    @r   _str_literal_helperz_Unparser._str_literal_helper  s   	 [&!9:%>!*9PQQ-=OqPOP&5Q.9P1QQ &\FC[CVAYOE!B<%((  %I J q!!$r(::?1-.!333!/!4t!;nR>P!P..# QQs   CC	CCr9  c                h    | j                  ||      \  }}|d   }| j                  | | |        y)zKWrite string literal value with a best effort attempt to avoid backslashes.rL  r   N)rK  rh  )r   rD  r9  
quote_types       r   _write_str_avoiding_backslashesz)_Unparser._write_str_avoiding_backslashes  s>    "66v;6W ^


j\&*67r   c                 p   | j                  d       g }|j                  D ]\  }| j                         5 }| j                  |       d d d        |j	                  dj                        t        |t              f       ^ g }t        t              }d}|D ]p  \  }}|r8| j                  ||d      \  }}	t        |	      j                  |      rd} n6|	}n d|v r|D 
cg c]  }
|
t        v s|
 }}
|sJ |j	                  |       r |rodg}|j                          |D ]W  \  }}|r?t        d|z         }d	}|j!                  |      sJ t        |             |t#        |      d
 }|j	                  |       Y dj                  |      }|d   }| j                  | | |        y # 1 sw Y   cxY wc c}
w )Nr`  r^   FTr8  r]   rR  rQ  z'"r   r   )rh  rJ   rv  _write_fstring_innerrp   rt   r   r+   r?   _ALL_QUOTESrK  r:   
isdisjointrG  r  ru   r   rH   )r   r%   fstring_partsr-   rt  new_fstring_partsr9  fallback_to_repris_constantnew_quote_typesrC  expected_prefixrN  s                r   visit_JoinedStrz_Unparser.visit_JoinedStr  s   

3[[ 	E 1F))%01  *UH"=>	 ;' "/ 	,E;)-)A)A +.2 *B *&
 '22;?'+$-*5LQm9KqLL""{$$U+	,   !'K##%&3 0"{ u-E&+O ++O<Id5kI<!#o"6r:E!((/0 )* ^


j\%56Q1 1* Ms   F&F3*F3&F0	c                 0   t        |t              r%|j                  D ]  }| j                  ||        y t        |t              rt        |j
                  t              r|j
                  j                  dd      j                  dd      }|rH|j                  dd      }|j                  dd	      }|j                  d
d      }|j                  dd      }| j                  |       y t        |t              r| j                  |       y t        d|      )Nis_format_spec{z{{}z}}r=  z\\rP  z\'rQ  z\"r]   z\nz"Unexpected node inside JoinedStr, )r   	JoinedStrrJ   rQ  r+   r-   rS   replacerh  FormattedValuevisit_FormattedValuer   )r   r%   r]  r-   s       r   rQ  z_Unparser._write_fstring_inner  s    dI& P))%)OPh'Jtzz3,GJJ&&sD199#tDEdF3c51c51dE2JJun-%%d+A$JKKr   c                      fd} j                  dd      5   ||j                        }|j                  d      r j                  d        j                  |       |j                  dk7  r' j                  dt        |j                                |j                  r. j                  d        j                  |j                  d	       d d d        y # 1 sw Y   y xY w)
Nc                      t                     }|j                  t        j                  j	                         |        |j                  |       S r*   )r,   r  r9  r@  r<  r   )innerunparserr   s     r   unparse_innerz5_Unparser.visit_FormattedValue.<locals>.unparse_inner  s>    !tDz|H##K$4$4$9$9$;UC>>%((r   r^  r_  r~   r   !rz  Tr\  )r  r-   r   rh  
conversionchrformat_specrQ  )r   r%   rh  exprs   `   r   rc  z_Unparser.visit_FormattedValue
  s    	)
 \\#s# 
	Q ,Ds#

3JJt"$

Qs4??3456

3))$*:*:4)P
	Q 
	Q 
	Qs   B6CC!c                 :    | j                  |j                         y r*   )rh  rD   r  s     r   
visit_Namez_Unparser.visit_Name  s    

477r   c                     | j                          |j                  dk(  r| j                  d       | j                  |j                  t
               y )NurL  )rq  kindrh  rO  r-   rG  r  s     r   r  z_Unparser._write_docstring  s9    		99JJsO,,TZZ],Sr   c           
      \   t        |t        t        f      rN| j                  t	        |      j                  dt              j                  ddt         dt         d             y | j                  r"t        |t              r| j                  |       y | j                  t	        |             y )Ninfnanra   -rb   )
r   r/   r0   rh  ru   ra  _INFSTRrU  rS   rO  r+  s     r   _write_constantz_Unparser._write_constant%  s    eeW-. JJU(!G9AgYa 89
 $$E3)?007JJtE{#r   c                 f   |j                   }t        |t              r8| j                  dd      5  | j	                  | j
                  |       d d d        y |du r| j                  d       y |j                  dk(  r| j                  d       | j                  |j                          y # 1 sw Y   y xY w)Nra   rb   ....rq  )r-   r   r   r  rl  rx  rh  rr  )r   r%   r-   s      r   r   z_Unparser.visit_Constant3  s    

eU#c3' = 4 4e<= =c\JJuyyC

3  ,= =s   B''B0c                       j                  dd      5   j                   fd j                  |j                         d d d        y # 1 sw Y   y xY w)Nrc   rl   c                  &     j                  d      S rf  rg  r(  s   r   ri  z&_Unparser.visit_List.<locals>.<lambda>A  rj  r   )r  rb  r  r=   r  s   ` r   
visit_Listz_Unparser.visit_List?  sC    \\#s# 	POO4dmmTYYO	P 	P 	P   +AAc                     | j                  dd      5  | j                  |j                         |j                  D ]  }| j                  |        	 d d d        y # 1 sw Y   y xY w)Nrc   rl   r  r  elt
generatorsr   r%   gens      r   visit_ListCompz_Unparser.visit_ListCompC  T    \\#s# 	#MM$((# #c"#	# 	# 	#   >AA$c                     | j                  dd      5  | j                  |j                         |j                  D ]  }| j                  |        	 d d d        y # 1 sw Y   y xY w)Nra   rb   r  r  s      r   visit_GeneratorExpz_Unparser.visit_GeneratorExpI  r  r  c                     | j                  dd      5  | j                  |j                         |j                  D ]  }| j                  |        	 d d d        y # 1 sw Y   y xY w)Nr^  r_  r  r  s      r   visit_SetCompz_Unparser.visit_SetCompO  r  r  c                 &   | j                  dd      5  | j                  |j                         | j                  d       | j                  |j                         |j
                  D ]  }| j                  |        	 d d d        y # 1 sw Y   y xY w)Nr^  r_  r#   )r  r  r  rh  r-   r  r  s      r   visit_DictCompz_Unparser.visit_DictCompU  sp    \\#s# 	#MM$((#JJtMM$**% #c"#		# 	# 	#s   A*BBc                 2   |j                   r| j                  d       n| j                  d       | j                  t        j                  |j
                         | j                  |j
                         | j                  d        | j                  t        j                  j                         |j                  g|j                    | j                  |j                         |j                  D ]$  }| j                  d       | j                  |       & y )Nz async for z for r*   if )is_asyncrh  r  r9  r>  r  r  r@  r<  r]  ifs)r   r%   	if_clauses      r   visit_comprehensionz_Unparser.visit_comprehension]  s    ==JJ}%JJwK--t{{;dkk"

6K,,113TYYJJdii  	%IJJvMM)$	%r   c                 .   | j                  t        j                  |      5  | j                  t        j                  j	                         |j
                  |j                         | j                  |j
                         | j                  d       | j                  |j                         | j                  d       | j                  t        j                  |j                         | j                  |j                         d d d        y # 1 sw Y   y xY w)Nr  z else )
r  r9  r@  r  r<  rV   r  r  rh  r  r  s     r   visit_IfExpz_Unparser.visit_IfExpk  s      !1!148 	' 0 0 5 5 7DIINMM$))$JJvMM$))$JJx  0 0$++>MM$++&	' 	' 	's   C!DDc                      |j                   rF j                  dd      5   j                   fd j                  |j                          d d d        y  j	                  d       y # 1 sw Y   y xY w)Nr^  r_  c                  &     j                  d      S rf  rg  r(  s   r   ri  z%_Unparser.visit_Set.<locals>.<lambda>x  r  r   z{*()})r=   r  rb  r  rh  r  s   ` r   	visit_Setz_Unparser.visit_Setu  s^    99c3' T 8$--ST T
 JJwT Ts   +A&&A/c           	            fd fd} j                  dd      5   j                   fd|t        |j                  |j                               d d d        y # 1 sw Y   y xY w)Nc                 l    j                  |        j                  d       j                  |       y r  r  rh  )kvr   s     r   write_key_value_pairz2_Unparser.visit_Dict.<locals>.write_key_value_pair  s'    MM!JJtMM!r   c                     | \  }}|Cj                  d       j                  t        j                  |       j	                  |       y  ||       y r  )rh  r  r9  rE  r  )r   r  r  r   r  s      r   
write_itemz(_Unparser.visit_Dict.<locals>.write_item  sK    DAqy 

4 ##K$4$4a8a $Q*r   r^  r_  c                  &     j                  d      S rf  rg  r(  s   r   ri  z&_Unparser.visit_Dict.<locals>.<lambda>  r  r   )r  rb  rL   rI   rJ   )r   r%   r  r  s   `  @r   
visit_Dictz_Unparser.visit_Dict~  sT    	
		+ \\#s# 	OO(*c$))T[[6Q	 	 	s   5AA'c                    | j                  ddt        |j                        dk(  xs" | j                  |      t        j
                  kD        5  | j                  | j                  |j                         d d d        y # 1 sw Y   y xY w)Nra   rb   r   )r  rH   r=   r  r9  r>  rl  r  r  s     r   visit_Tuplez_Unparser.visit_Tuple  sl    __		NaP4#6#6t#<{?P?P#P
 	6
 OODMM4995	6 	6 	6s   'A>>B~not+rv  )InvertNotr5   r6   )r  r  r  rv  c                    | j                   |j                  j                  j                     }| j                  |   }| j                  ||      5  | j                  |       |t        j                  ur| j                  d       | j                  ||j                         | j                  |j                         d d d        y # 1 sw Y   y xY wNr~   )unopr4   rr   rs   unop_precedencer  rh  r9  rL  r  r7   r  )r   r%   operatoroperator_precedences       r   visit_UnaryOpz_Unparser.visit_UnaryOp  s    99TWW..778"228<  !4d; 	(JJx  #+*<*<<

3 3T\\BMM$,,'	( 	( 	(s   A,CCr   r  /%<<>>|^&//r  )rN   rO   MultMatMultDivModLShiftRShiftBitOrBitXorBitAndFloorDivPow)r  rv  r   r  r  r  r  r  r  r  r  r  r  )r  c                 6   | j                   |j                  j                  j                     }| j                  |   }| j                  ||      5  || j                  v r|j                         }|}n|}|j                         }| j                  ||j                         | j                  |j                         | j                  d| d       | j                  ||j                         | j                  |j                         d d d        y # 1 sw Y   y xY wr  )r  r4   rr   rs   binop_precedencer  binop_rassocr<  r  rP   r  rh  rQ   )r   r%   r  r  left_precedenceright_precedences         r   visit_BinOpz_Unparser.visit_BinOp  s    ::dgg//889"33H=  !4d; 	&4,,,"5":":"<#6 "5#6#;#;#= ;MM$))$JJ8*A' 0$**=MM$**%	& 	& 	&s   B7DDz==z!=<z<=>z>=iszis notinznot in)
EqNotEqLtLtEGtGtEIsIsNotInNotInc                    | j                  t        j                  |      5   | j                  t        j                  j	                         |j
                  g|j                    | j                  |j
                         t        |j                  |j                        D ]N  \  }}| j                  d| j                  |j                  j                     z   dz          | j                  |       P 	 d d d        y # 1 sw Y   y xY wr  )r  r9  rD  r  r<  rP   comparatorsr  rL   opsrh  cmpopsrr   rs   )r   r%   or  s       r   visit_Comparez_Unparser.visit_Compare  s      $7 	!D 4 4 6		UDDTDTUMM$))$DHHd&6&67 !1

3Q[[-A-A!BBSHIa !	! 	! 	!s   CC<<Dandor)AndOr)r  r  c                 *     j                   |j                  j                  j                     } j                  |    fd} j                  |      5  d| d j                   fd||j                         d d d        y # 1 sw Y   y xY w)Nc                 l    j                         j                  |        j                  |        y r*   )r<  r  r  )r%   r  r   s    r   increasing_level_traversez9_Unparser.visit_BoolOp.<locals>.increasing_level_traverse  s/    "5":":"< 3T:MM$r   r~   c                  &    j                         S r*   rg  )r  r   s   r   ri  z(_Unparser.visit_BoolOp.<locals>.<lambda>  s    DJJqM r   )boolopsr4   rr   rs   boolop_precedencer  rb  rJ   )r   r%   r  r  r  r  s   `   @@r   visit_BoolOpz_Unparser.visit_BoolOp  s    << 1 1 : :;"44X>	    !4d; 	[H:QAOO13LdkkZ	[ 	[ 	[s   (B		Bc                    | j                  t        j                  |j                         | j	                  |j                         t        |j                  t              r5t        |j                  j                  t              r| j                  d       | j                  d       | j                  |j                         y )Nr~   r  )
r  r9  rO  r-   r  r   r+   r.   rh  r   r  s     r   visit_Attributez_Unparser.visit_Attribute  su    K,,djj9djj! djj(+
4::;K;KS0QJJsO

3

499r   c                    | j                  t        j                  |j                         | j	                  |j                         | j                  dd      5  d}|j                  D ])  }|r| j                  d       nd}| j	                  |       + |j                  D ])  }|r| j                  d       nd}| j	                  |       + 	 d d d        y # 1 sw Y   y xY w)Nra   rb   Fr_   T)	r  r9  rO  rB   r  r  rE   rh  rF   )r   r%   r  r  s       r   
visit_Callz_Unparser.visit_Call  s    K,,dii8dii \\#s# 	!EYY !JJt$ Ea ! ]] !JJt$ Ea !	! 	! 	!s   A3CCc                    d }| j                  t        j                  |j                         | j	                  |j                         | j                  dd      5   ||j                        r1| j                  | j                  |j                  j                         n| j	                  |j                         d d d        y # 1 sw Y   y xY w)Nc                 >    t        | t              xr | j                  S r*   )r   r;   r=   )slice_values    r   is_non_empty_tuplez5_Unparser.visit_Subscript.<locals>.is_non_empty_tuple&  s    ;. %$$r   rc   rl   )	r  r9  rO  r-   r  r  r  rl  r=   )r   r%   r  s      r   visit_Subscriptz_Unparser.visit_Subscript%  s    	 	K,,djj9djj!\\#s# 	*!$**-tzz?djj)	* 	* 	*s   ACCc                     | j                  d       | j                  t        j                  |j                         | j                  |j                         y r  )rh  r  r9  rE  r-   r  r  s     r   visit_Starredz_Unparser.visit_Starred5  s7    

3K,,djj9djj!r   c                 &    | j                  d       y )Nrz  rg  r  s     r   visit_Ellipsisz_Unparser.visit_Ellipsis:  s    

5r   c                 4   |j                   r| j                  |j                          | j                  d       |j                  r| j                  |j                         |j                  r-| j                  d       | j                  |j                         y y )Nrz  )lowerr  rh  upperstepr  s     r   visit_Slicez_Unparser.visit_Slice=  sb    ::MM$**%

3::MM$**%99JJsOMM$))$ r   c                     | j                  d       | j                  |j                         | j                         5  |j                  D ]  }| j                  |        	 d d d        y # 1 sw Y   y xY w)Nzmatch )rq  r  subjectr{  cases)r   r%   cases      r   visit_Matchz_Unparser.visit_MatchG  s[    		(dll#ZZ\ 	$

 $d#$	$ 	$ 	$s   #A**A3c                     | j                  |j                         |j                  r-| j                  d       | j                  |j                         y y r  )rh  argr  r  r  s     r   	visit_argz_Unparser.visit_argN  s:    

488??JJtMM$//* r   c                 l   d}|j                   |j                  z   }d gt        |      t        |j                        z
  z  |j                  z   }t	        t        ||      d      D ]  \  }}|\  }}|rd}n| j                  d       | j                  |       |r"| j                  d       | j                  |       |t        |j                         k(  so| j                  d        |j                  s|j                  r|rd}n| j                  d       | j                  d       |j                  rq| j                  |j                  j                         |j                  j                  r6| j                  d       | j                  |j                  j                         |j                  rot        |j                  |j                        D ]L  \  }}| j                  d       | j                  |       |s+| j                  d       | j                  |       N |j                  r|rd}n| j                  d       | j                  d	|j                  j                  z          |j                  j                  r7| j                  d       | j                  |j                  j                         y y y )
NTr\   Fr_   r`   z, /r   r#   r  )posonlyargsrE   rH   defaultsr   rL   rh  r  vararg
kwonlyargsr  r  kw_defaultskwarg)	r   r%   r   all_argsr  r  elementsads	            r   visit_argumentsz_Unparser.visit_argumentsT  s   ##dii/6S]S-??@4==P(Xx)@!D 	"OE8DAq

4 MM!

3a D,,--

5!	" ;;$//

4 JJsO{{

4;;??+;;))JJt$MM$++"8"89 ??DOOT-=-=> %1

4 a JJsOMM!$% ::

4 JJtdjjnn,-zz$$

4 djj334 % r   c                     |j                   | j                  d       n,| j                  |j                          | j                  d       | j                  |j                         y )Nr  r`   )r  rh  r  r-   r  s     r   visit_keywordz_Unparser.visit_keyword  sC    88JJtJJtxx JJsOdjj!r   c                    | j                  t        j                  |      5  | j                  d       | j	                         5 }| j                  |j                         d d d        r | j                  dg|  | j                  d       | j                  t        j                  |j                         | j                  |j                         d d d        y # 1 sw Y   }xY w# 1 sw Y   y xY w)Nlambdar~   r#   )	r  r9  r@  rh  rv  r  rE   r  rV   )r   r%   rt  s      r   visit_Lambdaz_Unparser.visit_Lambda  s      !1!148 	%JJx  )Fdii()

3((JJt 0 0$))<MM$))$	% 	%) )	% 	%s$   "C'CA3C'C$	 C''C0c                     | j                  |j                         |j                  r| j                  d|j                  z          y y Nr  )rh  rz   asnamer  s     r   visit_aliasz_Unparser.visit_alias  s3    

499;;JJv+, r   c                     | j                  |j                         |j                  r-| j                  d       | j                  |j                         y y r  )r  context_exproptional_varsrh  r  s     r   visit_withitemz_Unparser.visit_withitem  s@    d''(JJvMM$,,- r   c                 L   | j                  d       | j                  |j                         |j                  r,| j	                  d       | j                  |j                         | j                         5  | j                  |j                         d d d        y # 1 sw Y   y xY w)Nzcase r  )rq  r  patternguardrh  r{  rV   r  s     r   visit_match_casez_Unparser.visit_match_case  so    		'dll#::JJvMM$**%ZZ\ 	%MM$))$	% 	% 	%s   5BB#c                 :    | j                  |j                         y r*   )r  r-   r  s     r   visit_MatchValuez_Unparser.visit_MatchValue  s    djj!r   c                 :    | j                  |j                         y r*   )rx  r-   r  s     r   visit_MatchSingletonz_Unparser.visit_MatchSingleton  s    TZZ(r   c                       j                  dd      5   j                   fd j                  |j                         d d d        y # 1 sw Y   y xY w)Nrc   rl   c                  &     j                  d      S rf  rg  r(  s   r   ri  z/_Unparser.visit_MatchSequence.<locals>.<lambda>  r  r   )r  rb  r  patternsr  s   ` r   visit_MatchSequencez_Unparser.visit_MatchSequence  sA    \\#s# 	OO($--	 	 	r~  c                 L    |j                   }|d}| j                  d|        y )N_r   )rz   rh  )r   r%   rz   s      r   visit_MatchStarz_Unparser.visit_MatchStar  s'    yy<D

Qtf:r   c           
      8     fd} j                  dd      5  |j                  } j                   fd|t        ||j                  d             |j
                  }|'|r j                  d        j                  d|        d d d        y # 1 sw Y   y xY w)	Nc                 v    | \  }}j                  |       j                  d       j                  |       y r  r  )pairr  pr   s      r   write_key_pattern_pairz<_Unparser.visit_MatchMapping.<locals>.write_key_pattern_pair  s0    DAqMM!JJtMM!r   r^  r_  c                  &     j                  d      S rf  rg  r(  s   r   ri  z._Unparser.visit_MatchMapping.<locals>.<lambda>  r  r   Tstrictr_   r  )r  rI   rb  rL   r&  restrh  )r   r%   r/  rI   r3  s   `    r   visit_MatchMappingz_Unparser.visit_MatchMapping  s    	 \\#s# 	(99DOO(&D$--5
 99DJJt$

Rv;'	( 	( 	(s   A.BBc           
           j                  t        j                  |j                          j	                  |j                          j                  dd      5  |j                  } j                   fd j                  |       |j                  }|rD fd}|r j                  d        j                   fd|t        ||j                  d             d d d        y # 1 sw Y   y xY w)	Nra   rb   c                  &     j                  d      S rf  rg  r(  s   r   ri  z,_Unparser.visit_MatchClass.<locals>.<lambda>  r  r   c                 Z    | \  }}j                  | d       j                  |       y )Nr`   )rh  r  )r-  r   r  r   s      r   write_attr_patternz6_Unparser.visit_MatchClass.<locals>.write_attr_pattern  s*    $(MD'JJ$qz*MM'*r   r_   c                  &     j                  d      S rf  rg  r(  s   r   ri  z,_Unparser.visit_MatchClass.<locals>.<lambda>  s    DJJt, r   Tr1  )r  r9  rO  rx   r  r  r&  rb  	kwd_attrsrh  rL   kwd_patterns)r   r%   r&  attrsr8  s   `    r   visit_MatchClassz_Unparser.visit_MatchClass  s    K,,dhh7dhh\\#s# 	}}HOO($-- NNE+
 JJt$,&t00>	 	 	s   A?C!!C*c                    |j                   }|j                  }|| j                  d       y || j                  |j                          y | j                  t        j
                  |      5  | j                  t        j                  |j                         | j                  |j                         | j                  d|j                           d d d        y # 1 sw Y   y xY w)Nr)  r  )	rz   r  rh  r  r9  r@  r  rF  r  )r   r%   rz   r  s       r   visit_MatchAsz_Unparser.visit_MatchAs  s    yy,,<JJsO_JJtyy!$$[%5%5t< /##KOOT\\Bdll+

T$))-./ / /s   +A$CC!c                 6     j                  t        j                  |      5    j                  t        j                  j	                         g|j
                     j                   fd j                  |j
                         d d d        y # 1 sw Y   y xY w)Nc                  &     j                  d      S )Nz | rg  r(  s   r   ri  z)_Unparser.visit_MatchOr.<locals>.<lambda>  s    DJJu$5 r   )r  r9  rF  r  r<  r&  rb  r  r  s   ` r   visit_MatchOrz_Unparser.visit_MatchOr  so      $7 	UD 4 4 6GGOO5t}}dmmT	U 	U 	Us   A$BB)r^   r*   )F)rs   r   r   r   r   rb  rl  rn  rq  rh  r   rv  r{  r  r  r  r  r  r  r  r  r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r"  r&  r(  r%  r-  r/  r3  r7  rR  rK  rO  rZ  rQ  rc  ro  r  rx  r   r}  r  r  r  r  r  r  r  r  r  r  r9  rC  rL  r  r  r  rJ  rK  rI  rF  rG  rH  rM  r  	frozensetr  r  r  r  r  rB  rA  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r!  r#  r'  r*  r4  r=  r?  rB  __classcell__)rr   s   @r   rT  rT    s    .3 "
H
1" ' ' #    !Q=1 )
 %%#$"
&MM%"&&O$JJ**&
&.11	%:4+1:"V
&$%"'-++$+%% &1E$/L FQ 8-7^L&Q$T$
-P####%' ,6 %cBD	O
( E" __  W%L&$ F! 4(G +{~~F[	!$* "
%$+15f"	%-
.%")((./Ur   rT  c                 8    t               }|j                  |       S r*   )rT  r   )ast_objrg  s     r   unparserG    s    {H>>'""r   )r
  r  r  r  r  c                     | t         v r7t         |    xt               | <   }dd l}|j                  d|  t        d       |S t        d|  d      )Nr   r   r   r   zmodule 'ast' has no attribute 'rP  )_deprecated_globalsglobalsr   r   r   ro   )rz   r-   r   s      r   __getattr__rK    s`    """5d";;	$%4&M#<W 	 	
 
:4&B
CCr   c                  v   dd l } | j                  d      }|j                  d| j                  d      ddd	
       |j                  ddddd       |j                  dddd       |j                  dddd       |j                  ddt        dd       |j                         }|j                  5 }|j                         }d d d        t        |j                  j                  |j                  |j                         }t        t        ||j                  |j                  !             y # 1 sw Y   lxY w)"Nr   zpython -m ast)proginfilerbr    ?rv  z$the file to parse; defaults to stdin)r,   nargsdefaulthelpz-mz--modeexec)rT  singler   	func_typez(specify what kind of code must be parsed)rR  choicesrS  z--no-type-commentsTstore_falsez)don't add information about type comments)rR  actionrS  z-az--include-attributes
store_truez:include attributes such as line numbers and column offsets)rY  rS  z-iz--indentr   z'indentation of nodes (number of spaces))r,   rR  rS  )r	   )r}   rY   )argparseArgumentParseradd_argumentFileTyper.   
parse_argsrN  readr   rz   r   no_type_commentsprintr   r}   rY   )r[  parserrE   rN  r   trees         r   mainre    s>   $$/$:F
x'8'8d'8'C3 #C  E h GG  I ,d=H  J
4\.  / jsAF  HD	 ))499DDYDYZD	$t(?(?
TU s   3D//D8__main__)z	<unknown>rT  )TF)r\   )Tr*   )Xr   sysre_ast
contextlibr   r   enumr   r   r   r   rX   r   r   r   r   r   r   r   r   r   r   r   r   r   objectr   r   r   r   r   r+   r   r   r   r   propertyr   r  r,   r   r  r
  r  r  r  r  r  r.   r/   r0   rS   bytesboolr   r   r   rm   r  r  r"  r;   r)  r,  r%  modr.  expr_contextr2  r4  r6  ru   
float_info
max_10_exprw  r9  _SINGLE_QUOTESrG  rR  rT  rG  rJ  poprI  rK  re  rs   )rz   s   0r   <module>rv     s  4  	  2 , ,5t5,8$v@ @F" F.	0 

34
 05 "J7(& 7(t8k 8x U    x )Y/HJ)Y/HJ14 162 (d (d H 8t 
6x4 
6  #ug	#	E84:t$tCyl $ 
 	.J	5U	7Iz	 %C %E 
3u 3 uf ,5EJ:C ::l ::| ::L : cnn//!34
4g  > ///gU gUR!# D 	')--
 
DV0 zF Qs   H<