
    -PhkU                       d Z ddlmZ ddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlmZmZmZmZmZmZmZ ddl
mZmZ ddlmZ ddlmZ erddlmZ dd	lmZ  e	j        d
          Z e	j        d          Z e	j        d          Zd'dZ d(dZ!d)d*dZ"d+dZ# G d d          Z$ G d d          Z% G d d e%          Z& G d! d"ej'                  Z( G d# d$e%          Z) G d% d&          Z*dS ),z,Utilities parsing and analyzing Python code.    )annotationsN)DEDENTINDENTNAMENEWLINENUMBEROPSTRING)COMMENTNL)TYPE_CHECKING)unparse)	Signature)Anyz^\s*#: ?(.*)?
?$z^\s*$z^\s*(#.*)?$codestrreturnc                .    |                      dd          S )N )replace)r   s    T/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/sphinx/pycode/parser.pyfilter_whitespacer      s    <<c"""    nodeast.ASTlist[ast.expr]c                T    t          | t          j                  r| j        S | j        gS )z3Get list of targets from Assign and AnnAssign node.)
isinstanceastAssigntargetstarget)r   s    r   get_assign_targetsr$       s(    $
## |}r   selfast.arg | None	list[str]c                   |r|j         }| j        j        }|dv rt          d| z            |dk    r'|| j        |k    r| j        gS t          d| z            |dv rbg }| j        D ]V}t          j        t                    5  |                    t          ||                     ddd           n# 1 swxY w Y   W|S |dk    rX| j
        j        j        dk    r1|r/| j
        j        |k    rdt          | j        |          d	         z  gS t          d| z            |d
k    r| gS |dk    rt          | j
        |          S t          d|z            )zConvert assignment-AST to variable names.

    This raises `TypeError` if the assignment does not create new variable::

        ary[0] = 'foo'
        dic['bar'] = 'baz'
        # => TypeError
    >   IndexSliceConstant	Subscriptz%r does not create new variableNameNz*The assignment %r is not instance variable>   ListTuple	Attributez%sr   r   StarredzUnexpected node name %r)arg	__class____name__	TypeErroridelts
contextlibsuppressextendget_lvar_namesvalueattrNotImplementedError)r   r%   self_id	node_namememberselts         r   r;   r;   (   s     ('I???9D@AAAF<47g--G9H4OPPP	'	'	'9 	: 	:C$Y// : :~c488999: : : : : : : : : : : : : : : 	k	!	!J )V33 4
(( >$)T::1==>>H4OPPP	e		v	i		dj$///!";i"GHHHs   $B11B5	8B5	sc                    dd}| |_         t          j        |          }|r(|                    d                              d          S dS )z1Remove common leading indentation from docstring.r   Nonec                     d S N rH   r   r   dummyzdedent_docstring.<locals>.dummyX   s    r   z
 Nr   rE   )__doc__inspectgetdoclstriprstrip)rC   rI   	docstrings      r   dedent_docstringrR   U   s]        EMu%%I ''..v666rr   c                  :    e Zd ZdZddZddZddZddZddZdS )Tokenz)Better token wrapper for tokenize module.kindintr<   r   starttuple[int, int]endsourcer   r   rE   c                L    || _         || _        || _        || _        || _        d S rG   )rU   r<   rW   rY   rZ   )r%   rU   r<   rW   rY   rZ   s         r   __init__zToken.__init__g   s+     	

r   otherobjectboolc                &   t          |t                    r| j        |k    S t          |t                    r| j        |k    S t          |t
          t          z            r| j        | j        gt          |          k    S |dS t          d|z            )NFzUnknown value: %r)r   rV   rU   r   r<   listtuple
ValueError)r%   r]   s     r   __eq__zToken.__eq__u   s    eS!! 		:9%%s## 	::&&te|,, 	:Itz*d5kk99]5058999r   c                \    t          | j        | j        | j        | j        | j        f          S rG   )hashrU   r<   rW   rY   rZ   r%   s    r   __hash__zToken.__hash__   s%    TY
DJ$+NOOOr   
conditionsc                :     t           fd|D                       S )Nc              3  $   K   | ]
}|k    V  d S rG   rH   ).0	candidater%   s     r   	<genexpr>zToken.match.<locals>.<genexpr>   s(      AA49$AAAAAAr   )any)r%   ri   s   ` r   matchzToken.match   s&    AAAAjAAAAAAr   c                l    dt           j        | j                 d| j                                        dS )Nz<Token kind=z value=>)tokenizetok_namerU   r<   striprg   s    r   __repr__zToken.__repr__   s3    \h/	:\\TZEUEUEWEW\\\\r   N)rU   rV   r<   r   rW   rX   rY   rX   rZ   r   r   rE   )r]   r^   r   r_   )r   rV   )ri   r   r   r_   )r   r   )	r4   
__module____qualname__rL   r\   rd   rh   rp   rv   rH   r   r   rT   rT   d   s        33   
: 
: 
: 
:P P P PB B B B] ] ] ] ] ]r   rT   c                  .    e Zd ZddZdd	ZddZddZdS )TokenProcessorbuffersr'   r   rE   c                    t          |          || _        t          j        fd          | _        d | _        d | _        d S )Nc                 "    t                     S rG   )next)liness   r   <lambda>z)TokenProcessor.__init__.<locals>.<lambda>   s    tE{{ r   )iterr{   rs   generate_tokenstokenscurrentprevious)r%   r{   r   s     @r   r\   zTokenProcessor.__init__   sC    W./B/B/B/BCC%)&*r   linenorV   r   c                "    | j         |dz
           S zReturns specified line.   r{   r%   r   s     r   get_linezTokenProcessor.get_line       |FQJ''r   Token | Nonec                    	 | j         | _        t          t          | j                   | _         n# t
          $ r
 d| _         Y nw xY w| j         S )z_Fetch the next token from source code.

        Returns ``None`` if sequence finished.
        N)r   r   rT   r~   r   StopIterationrg   s    r   fetch_tokenzTokenProcessor.fetch_token   sX    
	  LDM $t{"3"34DLL 	  	  	 DLLL	  |s   ,/ AA	conditionr   list[Token]c                   g }|                                  x}r|                    |           ||k    rn|t          dgk    r ||                     t          dg          z  }nY|t          dgk    r ||                     t          dg          z  }n,|t          dgk    r||                     t          dg          z  }|                                  x}|S )zlFetch tokens until specified token appeared.

        .. note:: This also handles parenthesis well.
        (){}[])r   appendr	   fetch_until)r%   r   r   r   s       r   r   zTokenProcessor.fetch_until   s    
 ))+++g 		6MM'""")##2s)##$**B9555RI%%$**B9555RI%%$**B9555 ))+++g 		6 r   N)r{   r'   r   rE   r   rV   r   r   )r   r   )r   r   r   r   )r4   rw   rx   r\   r   r   r   rH   r   r   rz   rz      sd        + + + +( ( ( (        r   rz   c                  4     e Zd ZdZd
 fdZddZdd	Z xZS )AfterCommentParserzPython source code parser to pick up comments after assignments.

    This parser takes code which starts with an assignment statement,
    and returns the comment for the variable if one exists.
    r   r'   r   rE   c                X    t                                          |           d | _        d S rG   )superr\   commentr%   r   r3   s     r   r\   zAfterCommentParser.__init__   s&    #'r   r   c                T   g }|                                  x}r|                    |           |t          dgk    r ||                     t          dg          z  }n|t          dgk    r ||                     t          dg          z  }n|t          dgk    r ||                     t          dg          z  }n[|t          k    r||                     t
                    z  }n2|t          dgk    rn;|r"|j        t          t          t          t          hvrn|                                  x}|S )z%Fetch right-hand value of assignment.r   r   r   r   r   r   ;)
r   r   r	   r   r   r   rU   r   r   r
   )r%   r   r   s      r   fetch_rvaluezAfterCommentParser.fetch_rvalue   s2   ))+++g 	MM'"""2s)##$**B9555RI%%$**B9555RI%%$**B9555F""$**6222RI%% W\"dFF1KKK ))+++g 	 r   c                   |                                  x}rj|                    t          dgt          t                    sB|sJ |                                  x}r(|                    t          dgt          t                    B|J |t          dgk    r|                                  | j        }|J |t          k    r|j        | _        dS dS )z3Parse the code and obtain comment after assignment.=N)	r   rp   r	   r   r   r   r   r<   r   )r%   toks     r   parsezAfterCommentParser.parse   s     &&(((s 	#))Iw3
 3
 	 JJJ &&(((s 	#))Iw3
 3
 	  2s),C???'>>9DLLL >r   r   r'   r   rE   )r   r   rK   )r4   rw   rx   rL   r\   r   r   __classcell__r3   s   @r   r   r      so         ( ( ( ( ( (   (% % % % % % % %r   r   c                       e Zd ZdZd3 fdZd4dZd5dZd5dZd6dZd7dZ	d8dZ
d9dZd9dZd:dZd;dZd< fd!Zd=d#Zd>d%Zd?d'Zd@d)ZdAd+ZdBd-ZdCd/ZdDd0ZdEd2Z xZS )FVariableCommentPickerz7Python source code parser to pick up variable comments.r{   r'   encodingr   r   rE   c                <   t          j                    | _        || _        || _        g | _        g | _        d | _        i | _        i | _	        d | _
        i | _        g | _        i | _        d | _        d | _        d | _        t#                                                       d S rG   )	itertoolscountcounterr{   r   contextcurrent_classescurrent_functioncommentsr   r   	defordersfinals	overloadstypingtyping_finaltyping_overloadr   r\   )r%   r{   r   r3   s      r   r\   zVariableCommentPicker.__init__   s     (( "$*,8<4679(,)+!#57"&(,+/r   namelist[str] | Nonec                    | j         r-| j        r$| j        d         dk    r| j        dd         |gz   S dS g | j        |S )z;Get qualified name for given object as a list of string(s).r\   N)r   r   r   )r%   r   s     r   get_qualname_forz&VariableCommentPicker.get_qualname_for   sX      	)# R(8J(F(F|CRC(D611t(T\(4((r   c                    |                      |          }|r1t          | j                  | j        d                    |          <   d S d S N.)r   r~   r   r   joinr%   r   qualnames      r   	add_entryzVariableCommentPicker.add_entry
  sR    ((.. 	D15dl1C1CDN388H--...	D 	Dr   c                    |                      |          }|r/| j                            d                    |                     d S d S r   )r   r   r   r   r   s      r   add_final_entryz%VariableCommentPicker.add_final_entry  sO    ((.. 	3Ksxx1122222	3 	3r   funcast.FunctionDefc                    ddl m} |                     |j                  }|rN| j                            d                    |          g           }|                     ||                     d S d S )Nr   )signature_from_astr   )sphinx.util.inspectr   r   r   r   
setdefaultr   r   )r%   r   r   r   r   s        r   add_overload_entryz(VariableCommentPicker.add_overload_entry  s    ::::::((33 	711#((82D2DbIII//5566666	7 	7r   r   c                    |                      |          }|r+d                    |d d                   }|| j        ||f<   d S d S Nr   r   )r   r   r   )r%   r   r   r   basenames        r   add_variable_commentz*VariableCommentPicker.add_variable_comment  sV    ((.. 	4xx"..H,3DM(D.)))	4 	4r   
annotationr   c                    |                      |          }|r8d                    |d d                   }t          |          | j        ||f<   d S d S r   )r   r   ast_unparser   )r%   r   r   r   r   s        r   add_variable_annotationz-VariableCommentPicker.add_variable_annotation#  sb    ((.. 	Gxx"..H/::/F/FDXt^,,,	G 	Gr   
decoratorsr   r_   c                    g }| j         r|                    d| j         z             | j        r|                    | j                   |D ]'}	 t          |          |v r dS # t          $ r Y $w xY wdS )Nz%s.finalTF)r   r   r   r   r>   )r%   r   final	decorators       r   is_finalzVariableCommentPicker.is_final)  s    ; 	3LLdk1222 	,LL*+++# 	 	Iy))U2244 3&    u   A""
A/.A/c                    g }| j         r|                    d| j         z             | j        r|                    | j                   |D ]'}	 t          |          |v r dS # t          $ r Y $w xY wdS )Nz%s.overloadTF)r   r   r   r   r>   )r%   r   overloadr   s       r   is_overloadz!VariableCommentPicker.is_overload9  s    ; 	9OOMDK7888 	2OOD0111# 	 	Iy))X5544 6&    ur   r&   c                    | j         r(| j         j        j        r| j         j        j        d         S | j         r(| j         j        j        r| j         j        j        d         S dS )z8Returns the name of the first argument if in a function.r   N)r   argsposonlyargsrg   s    r   get_selfzVariableCommentPicker.get_selfI  se      	6T%:%?%D 	6(-2155  	=T%:%?%K 	=(-9!<<tr   r   rV   c                "    | j         |dz
           S r   r   r   s     r   r   zVariableCommentPicker.get_lineQ  r   r   r   c                X    t                                          |           || _        dS )z(Updates self.previous to the given node.N)r   visitr   )r%   r   r3   s     r   r   zVariableCommentPicker.visitU  s$    dr   
ast.Importc                   |j         D ]}|                     |j        p|j                   |j        dk    r|j        p|j        | _        B|j        dk    r|j        p|j        | _        a|j        dk    r|j        p|j        | _        dS )8Handles Import node and record the order of definitions.r   ztyping.finalztyping.overloadN)namesr   asnamer   r   r   r   r%   r   r   s      r   visit_Importz"VariableCommentPicker.visit_ImportZ  s    J 	@ 	@DNN4;3$)444yH$$"k6TYn,,$(K$<49!!///'+{'?di$	@ 	@r   ast.ImportFromc                   |j         D ]v}|                     |j        p|j                   |j        dk    r|j        dk    r|j        p|j        | _        M|j        dk    r|j        dk    r|j        p|j        | _        wdS )r   r   r   r   N)r   r   r   r   moduler   r   r   s      r   visit_ImportFromz&VariableCommentPicker.visit_ImportFromf  s    J 	@ 	@DNN4;3$)444{h&&49+?+?$(K$<49!!((TY*-D-D'+{'?di$	@ 	@r   
ast.Assignc                    	 t          |          }t          j        t          j         fd|D             g           }                     |j                  }n# t          $ r Y dS w xY wt          |d          r(|j	        r!|D ]} 
                    ||j	                   n7t          |d          r'|j        r |D ]} 
                    ||j                   t          ||j        d         g j        |j        d         z             }|                                 |j        rot"                              |j                  rP|D ]K}                     |t"                              d|j                                                  |           LdS t,                              |d|j                           rg }t/          |j        dz
            D ]k}                     |j        dz
  |z
            }	t"                              |	          r/|                    t"                              d|	                     k |rat3          d                    t7          |                              }
|D ]-}                     ||
                                |           .dS |D ]}                     |           dS )z3Handles Assign node and pick up a variable comment.c                V    g | ]%}t          |                                           &S )rg   )r;   r   )rl   tr%   s     r   
<listcomp>z6VariableCommentPicker.visit_Assign.<locals>.<listcomp>v  s.    JJJQ888JJJr   Nr   type_commentz\1r   
)r$   	functoolsreduceoperatoriaddr   r   r5   hasattrr   r   r   r   
col_offsetr{   r   r   
comment_rerp   r   subr   	indent_reranger   rR   r   reversed)r%   r   r"   varnamescurrent_linevarnameparsercomment_linesibefore_liner   s   `          r   visit_Assignz"VariableCommentPicker.visit_Assignp  s   		(..G"+"2JJJJ'JJJ# #H
  ==55LL 	 	 	FF	 4&& 	I4? 	I# G G,,WdoFFFFGT>** 	It/@ 	I# I I,,Wd6GHHHH $$/++,-T[]]0KK
 
 	> 	j..v~>> 	# ( ())Z^^E6>BB   w''''F ??<(9$/(9:;; 	M4;?++  "mmDK!Oa,?@@##K00 !(({)K)KLLLL *499Xm5L5L+M+MNN' , ,G--gw???NN7++++   	$ 	$GNN7####	$ 	$s   AA 
A'&A'ast.AnnAssignc                0    |                      |           dS )z6Handles AnnAssign node and pick up a variable comment.N)r  r%   r   s     r   visit_AnnAssignz%VariableCommentPicker.visit_AnnAssign  s    $r   ast.Exprc                   t          | j        t          j        t          j        z            rt          |j        t          j                  r t          |j        j        t                    r	 t          | j                  }t          |d         | 
                                          }|D ]}t          |j        j        t                    r|j        j        }n&|j        j                            | j        pd          }|                     |t          |                     |                     |           dS # t           $ r Y dS w xY wdS dS dS )z2Handles Expr node and pick up a comment if string.r   utf-8N)r   r   r    r!   	AnnAssignr<   r+   r   r$   r;   r   decoder   r   rR   r   r5   )r%   r   r"   r	  r  rQ   s         r   
visit_Exprz VariableCommentPicker.visit_Expr  sQ    t}cj3=&@AA	4:s|44	 4:+S11	
,T];;)'!*dmmooFF' , ,G!$*"2C88 V$(J$4		$(J$4$;$;DM<TW$U$U	--g7G	7R7RSSSNN7++++, ,    !	 	 	 	 	 	s   .CD; ;
E	E	ast.Tryc                    |j         D ]}|                     |           |j        D ]}|                     |           dS )zHandles Try node and processes body and else-clause.

        .. note:: pycode parser ignores objects definition in except-clause.
        N)bodyr   orelse)r%   r   subnodes      r   	visit_TryzVariableCommentPicker.visit_Try  sZ    
 y 	  	 GJJw{ 	  	 GJJw	  	 r   ast.ClassDefc                   | j                             |j                   |                     |j                   |                     |j                  r|                     |j                   | j                            |j                   || _        |j	        D ]}| 
                    |           | j                                         | j                                          dS )z&Handles ClassDef node and set context.N)r   r   r   r   r   decorator_listr   r   r   r  r   popr%   r   childs      r   visit_ClassDefz$VariableCommentPicker.visit_ClassDef  s    ##DI...ty!!!==,-- 	,  +++DI&&&Y 	 	EJJu  """""r   c                   | j         |                     |j                   |                     |j                  r|                     |j                   |                     |j                  r|                     |           | j        	                    |j                   || _         |j
        D ]}|                     |           | j                                         d| _         dS dS )z)Handles FunctionDef node and set context.N)r   r   r   r   r#  r   r   r   r   r   r  r   r$  r%  s      r   visit_FunctionDefz'VariableCommentPicker.visit_FunctionDef  s     (NN49%%%}}T011 0$$TY/// 344 .''---L	***$(D! " "

5!!!!L$(D!!! )(r   ast.AsyncFunctionDefc                0    |                      |           dS )z.Handles AsyncFunctionDef node and set context.N)r)  r  s     r   visit_AsyncFunctionDefz,VariableCommentPicker.visit_AsyncFunctionDef  s    t$$$$$r   )r{   r'   r   r   r   rE   )r   r   r   r   )r   r   r   rE   )r   r   r   rE   )r   r   r   r   r   rE   )r   r   r   r   r   rE   )r   r   r   r_   )r   r&   r   )r   r   r   rE   )r   r   r   rE   )r   r   r   rE   )r   r   r   rE   )r   r  r   rE   )r   r  r   rE   )r   r  r   rE   )r   r!  r   rE   )r   r   r   rE   )r   r*  r   rE   )r4   rw   rx   rL   r\   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r   r'  r)  r,  r   r   s   @r   r   r      s       AA     $	) 	) 	) 	)D D D D
3 3 3 3
7 7 7 74 4 4 4G G G G           ( ( ( (     

@ 
@ 
@ 
@@ @ @ @5$ 5$ 5$ 5$n          *       # # # #) ) ) ) % % % % % % % %r   r   c                  D     e Zd ZdZd fdZddZddZddZddZ xZ	S )DefinitionFinderzXPython source code parser to detect location of functions,
    classes and methods.
    r   r'   r   rE   c                    t                                          |           d | _        g | _        g | _        i | _        d S rG   )r   r\   r   r   indentsdefinitionsr   s     r   r\   zDefinitionFinder.__init__  s>    '+"$AC<>r   r   r   entrytuple[str, int, int]c                z    | j         r)| j         d         d         |d         cxk    rdk    rn ndS || j        |<   dS )zAdd a location of definition.r   r   defN)r0  r1  )r%   r   r2  s      r   add_definitionzDefinitionFinder.add_definition  sU    < 	+DL,Q/58DDDDuDDDDDD%*DT"""r   c                J   	 |                                  }|dS |t          k    rn|t          dgk    rG| j        1| j                            t
          t          t          t                    r| j	        || _	        n|                    t          dg          r|                     d           nw|                    t          dg          r|                     d           nE|t          k    r| j                            d           n|t          k    r|                                  #)z1Parse the code to obtain location of definitions.TN@classr5  )r]   NN)r   r   r	   r   rp   r   r   r   r   r   r   parse_definitionr0  r   finalize_block)r%   tokens     r   r   zDefinitionFinder.parse   s   	&$$&&E}2s)##%=&&wFFCC & >)%*DNdG_-- &%%g....dE]++ &%%e,,,,&##$9::::&##%%%'	&r   typc                   |                                  }| j                            |j                   d                    | j                  }| j        r| j        j        d         }d| _        n|j        d         }|                     t          dg           |                                  	                    t          t                    r9|                     t                     | j                            |||f           dS |                     ||||j        d         f           | j                                         dS )zParse AST of definition.r   r   N:)r   r   r   r<   r   r   rW   r   r	   rp   r   r   r   r0  r6  rY   r$  )r%   r=  r   funcname	start_poss        r   r:  z!DefinitionFinder.parse_definition  s   !!DJ'''88DL))> 	&,Q/I!DNN
1I"c#####GW55 	V$$$Lh	 :;;;;; 3	48A;*GHHHLr   c                   | j                                         }|d         dk    r|\  }}}| j        j        d         dz
  }t                              |                     |                    r2|dz  }t                              |                     |                    2|                     ||||f           | j                                         dS dS )zFinalize definition block.r   r]   r   N)	r0  r$  r   rY   emptyline_rerp   r   r6  r   )r%   
definitionr=  r@  rA  end_poss         r   r;  zDefinitionFinder.finalize_block,  s    \%%''
a=G##'1$C9l&q)A-G$$T]]7%;%;<< 1 $$T]]7%;%;<<  3	7*CDDDL $#r   r   )r   r   r2  r3  r   rE   rK   )r=  r   r   rE   )
r4   rw   rx   rL   r\   r6  r   r:  r;  r   r   s   @r   r.  r.    s         ? ? ? ? ? ?+ + + +& & & &.   *
 
 
 
 
 
 
 
r   r.  c                  4    e Zd ZdZdddZdd	Zdd
ZddZdS )ParserzyPython source code parser to pick up variable comments.

    This is a better wrapper for ``VariableCommentPicker``.
    r  r   r   r   r   rE   c                    t          |          | _        || _        i | _        i | _        i | _        i | _        g | _        i | _        d S rG   )	r   r   r   r   r   r   r1  r   r   )r%   r   r   s      r   r\   zParser.__init__?  sH    %d++	 7946)+<>!#57r   c                V    |                                   |                                  dS )zParse the source code.N)parse_commentsr:  rg   s    r   r   zParser.parseI  s,    r   c                8   t          j        | j        d          }t          | j                            d          | j                  }|                    |           |j        | _        |j        | _        |j	        | _	        |j
        | _
        |j        | _        dS )z$Parse the code and pick up comments.T)type_commentsN)r    r   r   r   
splitlinesr   r   r   r   r   r   r   )r%   treepickers      r   rJ  zParser.parse_commentsN  s    y$777&ty';';D'A'A4=QQT!-)m)r   c                    t          | j                            d                    }|                                 |j        | _        dS )z0Parse the location of definitions from the code.TN)r.  r   rM  r   r1  )r%   r  s     r   r:  zParser.parse_definitionY  s=    !$)"6"6t"<"<==!-r   N)r  )r   r   r   r   r   rE   rK   )r4   rw   rx   rL   r\   r   rJ  r:  rH   r   r   rG  rG  9  ss         
8 8 8 8 8       
	* 	* 	* 	*. . . . . .r   rG  )r   r   r   r   )r   r   r   r   rG   )r   r   r%   r&   r   r'   )rC   r   r   r   )+rL   
__future__r   r    r8   r   rM   r   r   rers   r<  r   r   r   r   r   r	   r
   r   r   r   r   sphinx.pycode.astr   r   r   r   compiler  r  rC  r   r$   r;   rR   rT   rz   r   NodeVisitorr   r.  rG  rH   r   r   <module>rV     s   2 2 " " " " " " 



               				  C C C C C C C C C C C C C C C C C C                             4 4 4 4 4 4 !!!!!!RZ.//
BJx  	rz.))# # # #   *I *I *I *I *IZ   $] $] $] $] $] $] $] $]N* * * * * * * *Z/% /% /% /% /% /% /% /%d% % % % %CO % % %DJ J J J J~ J J JZ$. $. $. $. $. $. $. $. $. $.r   