o
    *ήcz                     @   s  d dl Z d dlmZmZmZmZ d dlmZ d dlm	Z	m
Z
 d dlmZ d dlmZ d dlmZ d dlmZmZmZ d d	lmZ d d
lmZ d dlmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z, d dl-m.Z. ed\Z/Z0Z1Z2Z3Z4ede1e1fZ5ede1e1fZ6ede1e1fZ7ede1e1fZ8ede1e1fZ9ede1e1fZ:ede1e1fZ;ede1e1fZ<ede1e1fZ=ede1e1fZ>ede1dfZ?ede1dfZ@ede1dfZAede1dfZBdd ZCdd  ZDd!d" ZEd#d$ ZFd%d& ZGd'd( ZHd)d* ZId+d, ZJd-d. ZKd/d0 ZLd1d2 ZMd3d4 ZNd5d6 ZOd7d8 ZPd9d: ZQd;d< ZRd=d> ZSd?d@ ZTdAdB ZUdCdD ZVdEdF ZWdGdH ZXdIdJ ZYdKdL ZZdMdN Z[dS )O    N)tensordiagonaleyeKroneckerDeltaArray)symbols)cossin)
DiagMatrix)MatrixSymbol)
ZeroMatrix)permutedimstensorcontractiontensorproduct)ImmutableDenseNDimArray)Permutation)	ZeroArrayOneArrayArraySymbolArrayElementPermuteDimsArrayContractionArrayTensorProductArrayDiagonalArrayAddnest_permutationArrayElementwiseApplyFunc_EditArrayContraction_ArgE_array_tensor_product_array_contraction_array_diagonal
_array_add_permute_dimsReshape)raiseszi j k l m nMNPQABCDXYa   bcdc                     s  t dd t d} t d} d | ksJ  d | ksJ   t| |gks+J t  }|jdks7J t|d}|jd	ksCJ t dd
   }|t fddtdD ks]J t t	ddd}t
|tsmJ t dd tt fdd tt fdd tt fdd tt fdd tddttt}ttfdd ttfdd ttfdd ttfdd d dksJ |d dksJ d S )Nr)      r   r0   r   r0   r5   r5   r   r0    )r5         c                    s$   g | ]  fd dt dD qS )c                    s&   g | ]  fd dt dD qS )c                    s   g | ]
}t  |fqS r:   )r   ).0k)r)   ijr:   b/tmp/pip-target-vg8gfxp4/lib/python/sympy/tensor/array/expressions/tests/test_array_expressions.py
<listcomp><   s    zGtest_array_symbol_and_element.<locals>.<listcomp>.<listcomp>.<listcomp>r<   ranger=   )r)   r?   )r@   rA   rB   <   s   & z<test_array_symbol_and_element.<locals>.<listcomp>.<listcomp>r;   rC   rE   r)   )r?   rA   rB   <   s   $ z1test_array_symbol_and_element.<locals>.<listcomp>r5   c                          d S Nr:   r:   r:   rF   r:   rA   <lambda>B       z/test_array_symbol_and_element.<locals>.<lambda>c                      rG   )Nr9   r:   r:   rF   r:   rA   rI   C   rJ   c                      rG   )Nr:   r:   rF   r:   rA   rI   D   rJ   c                      rG   Nr5   r:   r:   rF   r:   rA   rI   E   rJ   r;   r<   c                      rG   rH   r:   r:   Or:   rA   rI   J   rJ   c                      rG   )Nr0   r5   r;   r:   r:   rM   r:   rA   rI   K   rJ   c                      rG   )Nr;   r   r:   r:   rM   r:   rA   rI   L   rJ   c                      rG   )Nr   r<   r:   r:   rM   r:   rA   rI   M   rJ   r0   r5   )r   r   as_explicitr   r   shaper   rD   r"   r   
isinstancer   r$   
IndexError
ValueErrorr   r   mn)A0A1A2A3AepZr:   )r)   rN   rA   test_array_symbol_and_element(   s<   









ra   c                        t  dksJ t  jsJ t ddd  jdksJ   } | jdks%J td\}}}t |||d  j|||dfks>J tt fdd d S )	Nr   r;   r5   r<   r;   r5   r<   m n kc                            S NrS   r:   zar:   rA   rI   _   rJ   z!test_zero_array.<locals>.<lambda>)r   
is_IntegerrT   rS   r   r$   rW   )za_erX   rY   r>   r:   rh   rA   test_zero_arrayS      rl   c                     rb   )	Nr0   r;   r5   r<   rc   rd   c                      re   rf   rg   r:   oar:   rA   rI   n   rJ   z test_one_array.<locals>.<lambda>)r   rj   rT   rS   r   r$   rW   )oa_erX   rY   r>   r:   rn   rA   test_one_arrayb   rm   rq   c                  C   sL  t t} | tks
J t tttd} | t tttdksJ t tttd} |  }|ddggks3J | | j|dgks?J t tttd} |  }|ddggksTJ | | j|dgks`J t ttttdd} |  }|ddgddggkszJ | | j|d	dgksJ t t	d
t	ksJ t tt	t
dd
dt tt	t
dksJ d S )Nr0   r   r9   r   r   rR   r0   r<   )r5      r0   r0   r5   r   r   r;   r7   r   r5   r;   )r   r)   r   r*   r%   r&   _get_contraction_tuples*_contraction_tuples_to_contraction_indicesexprr/   r1   )cgindtupr:   r:   rA   'test_arrayexpr_contraction_constructionq   s0   
r   c            	   	   C   s  t tt} t tt}t | |}|t ttttksJ |jttttfks%J t| d}t|d}t ||}|tt ttttddksCJ t t|}|tt tttdksUJ t|d}|tt ttddksgJ tt ||d}|tt ttttdddksJ tt ttttdd}t|d}|tt ttttd	ddksJ t|dd}|tt ttttd
dddksJ tt ttttdd}t|d}|tt ttttdddksJ t|dd}|tt ttttddddksJ t|}||ksJ t|t	|sJ t| d}t|d}tt ttttdd}tt ttttdd}t|d}|tt ttddks4J t|d}|tt ttttdddksJJ t|d}|tt ttttdddks`J t
tt}t
|t}t|tsrJ |jtttfks}J |jttfksJ t ttdttd}|tt ttddksJ tt ttd} t | t}|ttt tttdg dksJ tt ttd} t | t}t|tsJ t|jtsJ t tt tttddtt}|ttt tttttddg dksJ d S )NrR   rx   r<      r;   r<   r9   r      r0   r;   r5   r<   )r   ru   )r   r   )ru   r   r0   ru   r;   r   ry   r5   r;   )r<   r   )r   r0   r<   r5   r;   )r   r0   r   r   r5   r;   r<   ru   )r   r%   r&   r'   r(   argsr   r    rU   typer!   r   rT   r>   r-   r)   r/   r"   r   r}   r   r.   r1   )	expr1expr2r}   cg1cg2cgnestedcg3cg4r~   r:   r:   rA   test_arrayexpr_array_flatten   sl   







 
 "
 "



"
"


&
0r   c                  C   s   t td} | t tdksJ t ttttdd} | t ttttddks&J t tttddd	d
} | tt tttdg dksBJ tddd}t |ddddd	d
} | tt |ddg dksaJ t tdd	d
} | ttddgkssJ ttdd  d S )Nrr   r9   )r<   r0   rw   rt   ry   rR   rz   T)allow_trivial_diags)r   r5   r0   Ax)	r0   r5   r;   r<   r;   ru   r   r5   r   rT   )r0   r   r   r   )r   r5   r<   ru   r0   r   r;   r6   r0   r   c                   S   s
   t tdS )Nrs   )r    r%   r:   r:   r:   rA   rI         
 z/test_arrayexpr_array_diagonal.<locals>.<lambda>)	r    r%   r   r&   r'   r"   r   r$   rW   )r~   r   r:   r:   rA   test_arrayexpr_array_diagonal   s   
"r   c               	      s  t tttt  jttttttttfksJ tdtt	} t t|   jtttt	fks,J t
 d}|jtt	fks:J t d}|jtt	tfksIJ t g d}|jttt	tfks[J t t| }t |}|jtttt	fkspJ tt fdd tt fdd tt fdd d S )Nr`   r9   r5   r0   r;   r   c                      
   t  dS NrR   )r   r:   r}   r:   rA   rI     r   z,test_arrayexpr_array_shape.<locals>.<lambda>c                      r   r   r    r:   r   r:   rA   rI     r   c                      r   )Nr7   r   r:   r   r:   rA   rI   	  r   )r   r%   r&   r'   r(   rT   r>   r
   rX   rY   r   r    r"   r!   r$   rW   )r`   r   exprpexpr3r:   r   rA   test_arrayexpr_array_shape   s"   




r   c                  C   s  t tttg ddd} t| }|ttt tddgksJ t tttg ddd} t| }|tt tddgt tddgksAJ t tttg ddd} t| }|tt tddgt tddgksdJ t ttttdddgdd} t| }|tt tttdd	ggdksJ t tttg ddd} t| }|tt tddgt tddgksJ t tttttdd
ddgdd} t| }|tt ttttddggdd
ksJ d S )Nr   r0   r;   r5   F)r   r0   r   r0   r   r;   r5   r;   r5   r0   r   rR   r;   r   ru   )r"   r   r%   r&   r   r   r'   )r~   sunkr:   r:   rA   test_arrayexpr_permutedims_sink  s$   &&$&",r   c                  C   s   t td} ddg}t|| dksJ t|| dksJ t|| ddks)J t|| ddks4J d	d
g}t|| dksBJ t|| dksLJ t|| ddksWJ t|| ddksbJ d S )N   r   r5      )r0   r;   r<   ru   r   	   
      r            )Nr   Nr0   r5   r;   Nr<   Nru   r   r   r   )r0   r;   r<   ru   r   r   r   r   NNNN)r   r   r   r0   r5   r;   r   r<   r   ru   NNrR   r   r   )r   r;   r<   ru   r   r   r   r   r   r   r   r   )r   NNr0   r5   r;   r<   NNru   r   r   )r   r;   r<   ru   r   r   rR   r   NNNN)r   r   r   r0   r5   r;   r<   r   r   ru   NN)listrD   r   _push_indices_down_push_indices_upr   )indicescontr_diag_indicesr:   r:   rA   'test_arrayexpr_push_indices_up_and_down'  s   r   c               
   C   s  t dtd} t dtd}t dtt}t dtt}t dtt}t dtt}tt|j| ||j|| | tdd	}tt|jt| td||j|| | td
dd}|	 
|s]J tt|| || |ddd}|	 |ksrJ tt| ||dd
}|	 |ksJ d S )Nr/   r0   r1   r)   r*   r+   r-   )r0   r5   r   )ru   r   r   r   )r5   r   )r   r   r   )r0   r5   r<   )ru   r   r   r   )r   r5   r<   )r
   r>   r   r   T	applyfuncr   r	   r   split_multiple_contractionsdummy_eq)r/   r1   r)   r*   r+   r-   r~   expectedr:   r:   rA   *test_arrayexpr_split_multiple_contractions:  s   *6r   c                  C   s  t t tdd} | tksJ d}dd t|D }dd t|D }t|D ]}t||  t||  q&|g d |g d |g d |g d	 |g d
 |g d ttd }t	td }t
td }t|||}t||D ]>\}	}
t|	}t|
}t t ttt	t
||} t ttt	t
|| }| |ksJ t t |||}t ||| }||ksJ qd S )Nrr   r;   c                 S      g | ]}t td qS r   r   rD   r=   r?   r:   r:   rA   rB   U      z6test_arrayexpr_nested_permutations.<locals>.<listcomp>c                 S   r   r   r   r   r:   r:   rA   rB   V  r   )r5   ru   r<   r0   r   r;   )r;   ru   r   r<   r0   r5   )r5   ru   r<   r   r;   r0   )r;   r   ru   r0   r5   r<   )ru   r<   r5   r   r;   r0   )r<   ru   r   r5   r;   r0   )r"   r%   rD   randomshuffleappendsubsr>   rS   r&   r'   r   zipr   r   )r~   timesplist1plist2r?   MeNePecgepermutation_array1permutation_array2p1p2resultresult1result2r:   r:   rA   "test_arrayexpr_nested_permutationsO  sJ   

r   c               
   C   s  t td } ttd }tttt ttg dd}ttt td}||ks-J t	t
t| |tg dd}t	t| |d}||ksJJ ttt ttg d}tt tttddg}||kshJ tttt ttttg dd	d
}ttt tttttddgdd}||ksJ tttt ttttg dddd}tttt tttdddddg}||ksJ tttt ttttg dddd}ttttt ddgtttdddtddg}||ksJ d S )Nr;   )r   r5   r0   r;   r   r   r   r0   r   )r   r5   r;   r0   r<   ru   r   r   rR   r;   ru   r   )r0   r   r<   r   r5   r   ru   r;   r9   )r5   r   r   r   )r0   r   r<   r   r   r5   ru   r;   r;   r   r<   ru   )r%   r   r>   rS   r&   r   r   r   r   r   r   r   r"   r'   r(   )r   r   r   r   cge1cge2r:   r:   rA   *test_arrayexpr_contraction_permutation_mix  sd   
r   c               
   C   s|  t ttttttg d} ttt tddgt tddgt}| |ks%J t ttttttg d} ttttt}| |ks@J t ttttttg d} | jtttttksZJ | jtg dkseJ t	t tttttg dg d} t t	tttttd	g d
}| |ksJ t	t	t	t	t tttttg dg dg ddgdg} t	tttttdddd}| |ksJ d S )N)r5   r;   r0   r   ru   r<   r   r   r0   r   )r5   r;   r<   ru   r   r0   r   r   )r5   r;   r<   r   ru   r   r   r0   )r   r0   r5   r<   r;   ru   r   r   )r5   r0   ru   r<   r   r;   r   r   r0   r5   r   )r;   ru   r   )r   r5   r;   r0   r<   r0   r;   r<   )r   r;   ru   )r0   r<   r   r4   r   )
r"   r   r%   r&   r'   r(   r   r}   permutationr   )r   r   r:   r:   rA   %test_arrayexpr_permute_tensor_product  sL   	r   c                  C   s   t tttt} tt| g dddd}t| ddd}||ks J t tttt} tt| g dd	d
}tt ttttdd}||ksCJ d S )N)r   r0   r5   r<   r   r   r;   ru   )r5   r<   ru   )r   r   rx   )r5   r   r   r   rQ   )r   ru   r5   r<   r0   r   r;   r   r   r   r;   r<   ru   rR   )r   r%   r(   r&   r'   r    r"   )tpr}   r   r:   r:   rA   2test_arrayexpr_canonicalize_diagonal__permute_dims  s   r   c                  C   s   t tttt} tt| dd}ttt ttttdd}||ks"J tt| dd}tt ttttd}||ks:J tt| dd}tt| d	d
}||ksPJ tt ttttd}t|dd}tt ttttdd}||ksqJ d S )Nr   rx   r   )r   r5   r;   )r   r0   r5   r;   r   rO   )r   r0   r5   r;   ru   r   r   )r   r5   r   r   r   )r   r5   r;   r<   r5   r0   )r   r<   r   ru   r;   )r   r0   r;   ru   r   r   r   )r   r%   r&   r'   r(   r   r    )r   r}   r   tdr:   r:   rA   0test_arrayexpr_canonicalize_diagonal_contraction  s   r   c                      s2   t tt tt fdd tt fdd d S )Nc                      s   t  ddgS )Nr0   r   r"   r:   r~   r:   rA   rI         z=test_arrayexpr_array_wrong_permutation_size.<locals>.<lambda>c                      s   t  g dS )N)r0   r   r5   r;   ru   r<   r   r:   r   r:   rA   rI     r   )r   r%   r&   r$   rW   r:   r:   r   rA   +test_arrayexpr_array_wrong_permutation_size  s   
r   c                  C   s   t tttttttd} tt tttdt tttd}| |ks%J ttttttttd} tttttdttttd}| |ksJJ d S r   )r   r!   r   r%   r&   r    )r~   r   r:   r:   rA   +test_arrayexpr_nested_array_elementwise_add  s,   r   c               
   C   s  t tttt} ttt}t tttt}ttt}ttt}ttt| t ttttttttks0J ttt|t ttttttksAJ t	| dt tttksNJ t	|dt tksYJ t	|dt ttkseJ t	|ddksnJ t
|dt tttks{J t
|dt tksJ t| g dt ttttksJ t|ddgt ttksJ t| | ksJ t|t ttksJ ttdtttd	tt}t|| |ksJ ttd
tttdtt}t|| |t||ksJ tt|tksJ ttt|tttksJ d S )Nrz   r7   rR   r9   r   r   r0   r)   r*   r+   r,   )r   r>   lrX   rY   r   r   r%   r&   r   r    r"   r!   r
   )za1zm1za2zm2zm3tp1tp2r:   r:   rA   $test_arrayexpr_array_expr_zero_array  s.   


&" r   c                  C   s2   t ddtdf} tt| }|jdtdfksJ d S )Nr)   r;   r5   )r   r>   r   r   rT   )r)   aafr:   r:   rA   #test_arrayexpr_array_expr_applyfunc;  s   
r   c                     s,  t tttttd} t|    | ksJ  jd  jd  jd<  jd<   t tttttdks7J  	 }t
t}||g|_ jd|   t ttttttddks]J   g dddggkskJ d	d
   D g dddggks~J dd
  dD ddgddgddggksJ dd
  dD ddgddggksJ tt fdd  jd   t tttttddksJ  jd jd  jd jd<  jd jd  jd jd<   t tttttddksJ   jd t
t   t ttttttddksJ d S )N)r0   r5   ru   r5   r0   r   )r0   r;   r   r   r<   ru   c                 S   s   g | ]	}d d |D qS )c                 S      g | ]}t |qS r:   )tuple)r=   r@   r:   r:   rA   rB   Q      z:test_edit_array_contraction.<locals>.<listcomp>.<listcomp>r:   r   r:   r:   rA   rB   Q  s    z/test_edit_array_contraction.<locals>.<listcomp>)r9   rv   rP   rw   r   c                 S   r   r:   r   r   r:   r:   rA   rB   R  r   r   r;   c                 S   r   r:   r   r   r:   r:   rA   rB   S  r   c                      s
     dS rL   )get_mapping_for_indexr:   ecgr:   rA   rI   T  r   z-test_edit_array_contraction.<locals>.<lambda>rt   r   rR   r   r   )r   r   r)   r*   r+   r,   r   to_array_contractionargs_with_indget_new_contraction_indexr   r-   r   insertget_contraction_indices&get_contraction_indices_to_ind_rel_posr   r$   rW   popinsert_after)r~   cinew_argr:   r   rA   test_edit_array_contractionB  s,   " 
$&.(""*r  c                  C   s  t ttt} t| t}t|dksJ | tttttks J tttdt}t|dks0J | ttttdks>J tttdt}t|dksNJ | t	ttttdg dksaJ tt	tddgt}t|dkssJ | t	tttg d	ksJ tt
| d
d}t|tsJ t|jtsJ t|dksJ | t| d
dksJ ttt| ddd}| t| dddksJ tt| dd}t|dksJ | ttttttddksJ tt	tddgd}t|dksJ | ttdksJ tt| d
d}t|dksJ | t| d
dks$J ttt| ddd}| t| dddks=J | | ksHJ tt| dd}t|dksYJ | |ksbJ tt	tddgd}t|dksuJ | ttdksJ tt}t|tsJ | tksJ ttttt}t|dksJ | ttttksJ ttttttt}| tttttksJ | ttttttksJ tttttt}t|dksJ | tttksJ t	t	tddgddg}t|dksJ | tksJ t	t	t	tddgddgddg}| t	tddgks8J | | ksCJ tttd f}|jtd fksVJ t|ts^J d S )Nz2ArrayTensorProduct(ArrayTensorProduct(M, N, P), N)r9   z2ArrayTensorProduct(ArrayContraction(M, (0, 1)), N)z/ArrayTensorProduct(ArrayDiagonal(M, (0, 1)), N))r5   r   r0   r0   r   z,ArrayTensorProduct(PermuteDims(M, (0 1)), N)r0   r   r5   r;   ry   zOArrayContraction(ArrayContraction(ArrayTensorProduct(M, N, P), (0, 2)), (0, 1))r   r   r   zLArrayContraction(ArrayDiagonal(ArrayTensorProduct(M, N, P), (0, 1)), (0, 1))z/ArrayContraction(PermuteDims(M, (0 1)), (0, 1))zIArrayDiagonal(ArrayDiagonal(ArrayTensorProduct(M, N, P), (0, 2)), (0, 1))zLArrayDiagonal(ArrayContraction(ArrayTensorProduct(M, N, P), (0, 1)), (0, 1))z,ArrayDiagonal(PermuteDims(M, (0 1)), (0, 1))zArrayAdd(ArrayAdd(M, N), P)zArrayAdd(M, ZeroArray(k, k), N)z)PermuteDims(PermuteDims(M, (0 1)), (0 1))r5   )r   r%   r&   r'   r   strdoitr   r   r   r   rU   r}   _canonicalizer   r   r>   r#   r)   rT   )r   r}   r:   r:   rA   *test_array_expressions_no_canonicalizationa  sv   
& $ "r  c                  C   s  t tt} | tttksJ t ttd}|tttdks J ttd}|ttdks.J t| d}|t| dks<J tt| dd}|t| ddksNJ ttd}|t	tdks\J tt| dd}|t	| ddksnJ t
tddg}|ttddgksJ t
t| g dg d	}|t| g d
ksJ t| g dg dd}|t| g dksJ ttdddddd}t|g dg dd}|t|g dksJ | t
|g dg ddksJ d S )Nr5   r9   rR   rx   r   r0   r   r  r   r   )r/   r1   r2   r3   )r3   r2   r1   r/   )index_order_newindex_order_oldr       )r/   r1   r2   r3   e)r1   r  r/   r3   r2   )r5   r   r<   r;   r0   )r   r%   r&   r   r)   r   r   r   r   r   r   r   r   rD   reshaperS   )r   r}   arrr:   r:   rA   +test_array_expr_construction_with_functions  s0   



&r  c                  C   s  t d td  td t d  ksJ t d t d dksJ t d t d dks,J t d td dks9J t d t ttf ttdttd ksPJ t d tttf dks_J tdttttfd} | ttttf | d ttdttd	 ttd
 ttd ksJ d S )Nrs   r0   rr   r   r9   K4r   r0   r5   r;   r<   r5   r;   r<   )	r%   r&   diffr?   r@   r   r   r>   r   )r  r:   r:   rA   test_array_element_expressions  s   $.&r  c                     s  t ddd tdd} tg d}t d}|j ksJ |jdks$J | t d  d  d	  d
 gks:J t| d}|j| ksFJ |jdksMJ | }t|tsXJ |jdks_J |t| d | d | d | d g| d | d | d | d ggksJ t t	df}|jt	dfksJ t
t fdd t
t fdd t|d}|j|ksJ |jdksJ | tddgddggksJ d S )Nr)   r5   r*   )r5   r5   r5   r  )r<   rs   r9   rr   rv   r   )r   r   r   )r   r   r0   )r   r0   r   )r   r0   r0   )r0   r   r   )r0   r   r0   )r0   r0   r   )r0   r0   r0   c                      r   )Nr   r#   r:   rF   r:   rA   rI     r   z)test_array_expr_reshape.<locals>.<lambda>c                      r   )Nrz   r  r:   rF   r:   rA   rI     r   r8   r0   r;   r<   )r
   r   r   r#   r}   rT   rS   rU   r   r>   r$   rW   r
  )r*   r+   r}   eer:   rF   rA   test_array_expr_reshape  s,   

,
D
$r  c                  C   s   ddl m} m}m}m} t| |g||gg}t|| t||ks$J t	|d t
|dks2J t|d t|dks@J t|| || ksMJ tt| |tks[J t|ddg t|ddgksmJ t|dg |dks|J d S )Nr   )xyztr9   r0   r<   )	sympy.abcr  r  r  r  r   r   rS   r   r   r   r   r   r   r   r   r   r   r   r#   r  )r  r  r  r  r)   r:   r:   rA   :test_array_expr_as_explicit_with_explicit_component_arrays  s   $"r   )\r   sympyr   r   r   r   sympy.core.symbolr   (sympy.functions.elementary.trigonometricr   r   #sympy.matrices.expressions.diagonalr	   "sympy.matrices.expressions.matexprr
   "sympy.matrices.expressions.specialr   sympy.tensor.array.arrayopr   r   r   #sympy.tensor.array.dense_ndim_arrayr   sympy.combinatoricsr   0sympy.tensor.array.expressions.array_expressionsr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   sympy.testing.pytestr$   r?   r@   r>   r   rX   rY   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r1   r2   r3   ra   rl   rq   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:   rA   <module>   sh    T+Q17& _,