
    MZdO                        d dl mZ d dl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mZ d dlmZmZmZmZ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  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 Z0y)    )
expand_mul)IRational)S)Symbolsymbols)sympify)simplify)
ShapeErrorNonSquareMatrixError)ImmutableMatrixMatrixeyeonesImmutableDenseMatrixdotprodsimp)raises)NonInvertibleMatrixError)linsolve)xyc                      t        t        d            } t        d      5  | j                  t	        dd            t        t        d            t        ddg       fk(  sJ 	 d d d        y # 1 sw Y   y xY w)N  [
        [             -3/4,       45/32 - 37*I/16,                   0,                     0],
        [-149/64 + 49*I/32, -177/128 - 1369*I/128,                   0, -2063/256 + 541*I/128],
        [                0,         9/4 + 55*I/16, 2473/256 + 137*I/64,                     0],
        [                0,                     0,                   0, -177/128 - 1369*I/128]]T        [
            [                          -32549314808672/3306971225785 - 17397006745216*I/3306971225785],
            [                               67439348256/3306971225785 - 9167503335872*I/3306971225785],
            [-15091965363354518272/21217636514687010905 + 16890163109293858304*I/21217636514687010905],
            [                                                          -11328/952745 + 87616*I/952745]]r   )r   r   r   gauss_jordan_solver   Ms    C/usr/lib/python3/dist-packages/sympy/matrices/tests/test_solvers.py%test_issue_17247_expression_blowup_29r!      s    q c d 	eA
 
T	 @##DAJ/F1 >k <l 5m ouuvxy{}n~	4@ @ 	@ @@ @ @s   A A**A3c                      t        t        d            } t        d      5  | j                  t	        dd            t        t        d            k(  sJ 	 d d d        y # 1 sw Y   y xY w)Nr   Tr   r   r   )r   r   r   cholesky_solver   r   s    r    %test_issue_17247_expression_blowup_30r$      sz    q c d 	eA
 
T	 mQ
+va 9k 7l 0m m 	m mm m ms   3AA&c            
         t        t        dz   dt        z
  ddgdt        z
  t        dz   dt        dz   gddt        z
  t        dz   dgdddt        dz   gg      } t        d      5  | j                  t	        dd            t        t        dz   dt        z  z  gt        dz
  dt        z  z  gt        dz   dt        z  z  gdt        dz   z  gg      k(  sJ 	 d d d        y # 1 sw Y   y xY w)Nr   r   Tr   )r   r   r   LUsolver   r   s    r    %test_issue_17247_expression_blowup_32r'   7   s    	
QA1!$	
QA1a!e$Aq1u!$A1a!e$	& 	'A
 
T	 yya$!eac]O!eac]O!eac]OAEO	0 )  	   s   #A/CC%c            	      :   t        g dg dg dg      t        ddg d      } | z  j                        }|| k(  sJ t        g dg dg d	g      t        ddg d
      } | z  j                        }|| k(  sJ t        ddgddgddgg      t        g d      j                        t        ddg      k(  sJ t        g d      t        t        fd       t        g dg dg d	g dg dg dg      t        g d      } | z  j                        }|| k(  sJ t        g dg dg      t        g d      } | z  t        t        fd       t        ddd       t        j
                  dd      t        t        fd       y )N         r+      r*      r+   r.   r+   r   r+      r,   r   r*   r,   
   r2   r0   r+   r   r4   r*   r,   r*   r   )r+   r   r   )r+   r   r*   c                  &     j                        S Nr&   Abs   r    <lambda>ztest_LUsolve.<locals>.<lambda>W   s    qyy|     )r*   r   )r4   r*   r   c                  &     j                        S r:   r;   r<   s   r    r?   ztest_LUsolve.<locals>.<lambda>e   s    		! r@   r   c                 &    | dk7  rd| |z   dz   z  S dS )Nr+   r   r    )ijs     r    r?   ztest_LUsolve.<locals>.<lambda>g   s    qAv!QqSU) 1 r@   c                  &     j                        S r:   r;   r<   s   r    r?   ztest_LUsolve.<locals>.<lambda>i   s    QYYq\ r@   )r   r&   r   
ValueErrorNotImplementedErrorzerosr   r   solnr=   r>   s     @@r    test_LUsolverM   D   s   	 	A 	q!YA	!A99Q<D199
 	A 	q!Z A	!A99Q<D199AAA'(AyA99Q<61a&>)))yA
:+,
 	A 	zA	!A99Q<D199
J'(AzA	!A
 45q!<=AQA
#%9:r@   c                     t        g dg dg dg      } t        ddg d      }| |z  }| j                  |      }||k(  sJ t        ddgddgd	d
gg      }| |z  }| j                  |      }||k(  sJ t        g dg dg dg      } t        ddg d      }| |z  }| j                  |      }||k(  sJ t        ddgddgddgg      }| |z  }| j                  |      }||k(  sJ y )Nr)   r-   r/   r+   r   r1   r*   r   r,   r.   r3   r5   r7   r8   r2   r0   	   r6         )r   QRsolve)r=   r   r>   rL   s       r    test_QRsolverS   l   s   	 	A 	q!YA	!A99Q<D199AAA'(A	!A99Q<D199
 	A 	q!Z A	!A99Q<D199AB"b*+A	!A99Q<D199r@   c                  &    t        t        d        y )Nc                  V    t        dg      j                  t        ddgddgg            S )Nr   r*   r+   r   )r   r&   rD   r@   r    r?   ztest_errors.<locals>.<lambda>   s)    vqc{226Aq6Aq6:J3KL r@   )r   r   rD   r@   r    test_errorsrV      s    
:LMr@   c                  h   t        g dg dg dg      } t        ddg d      }| |z  }| j                  |      }||k(  sJ t        g dg dg d	g      } t        ddg d
      }| |z  }| j                  |      }||k(  sJ t        d      } t        d      }| |z  }| j                  |      }||k(  sJ t        ddt        z  fdt        z  dff      } t        d      }| |z  }| j                  |      }t        |      |k(  sJ t        dt        z  dfdt        z   dff      } t        ddt        z  z   df      }| |z  }| j                  |      }t        |      |k(  sJ t	        d      \  }}}}}t        ||f||ff      } t        ||f      }| j                  |      }t        | |z        |k(  sJ y )Nr)   r-   r/   r+   r   r1   r3   r5   r7   r8   ))r   r,   )r,   r   )r   rO   rX   r,   r   r*   r4   za00, a01, a11, b0, b1)r   r#   r   r   r   r
   )	r=   r   r>   rL   a00a01a11b0b1s	            r    test_cholesky_solver`      s   	 	A 	q!YA	!AAD199
 	A 	q!Z A	!AAD199 AwA	!AAD199AaC2a4)$%AwA	!AADdq   1a261+&'AAaC}A	!AADdq   #$;<Cc2rc
S#J'(ABxA	AAaC=Ar@   c                  N   t        g dg dg dg      t        ddg d      } | z  j                        }|| k(  sJ t        g dg dg d	g      t        ddg d
      } | z  j                        }|| k(  sJ t        ddt        z  fdt        z  dff      t        d      } | z  j                        }t        |      | k(  sJ t        dt        z  dfdt        z   dff      t        ddt        z  z   df      } | z  j                        }t        |      | k(  sJ t        d      t        d      } | z  j                        }t        |      | k(  sJ t        g dg dg      t        dgdgdgg      } | z  t	        t
        fd       y )Nr)   r-   r/   r+   r   r1   r3   r5   r7   r8   rO   rX   r,   rY   r*   r4   ))rO   r+   )r+   rO   )r   r   )rX   rA   )rX   ir2   r0   r2   rZ   c                  &     j                        S r:   )LDLsolver<   s   r    r?   ztest_LDLsolve.<locals>.<lambda>   s    

1 r@   )r   rd   r   r   r   rI   rK   s     @@r    test_LDLsolvere      s   	 	A 	q!YA	!A::a=D199
 	A 	q!Z A	!A::a=D199AaC2a4)$%AwA	!A::a=Ddq   1a261+&'AAaC}A	!A::a=Ddq    AvA	AA::a=Ddq   k*+AaS2$ A	AA
 56r@   c                  H   t        t        d        t        t        d        t        t        d        t	        ddgddgg      } t	        t
        t        gt        t
        gg      }t	        ddgdd	gg      }| j                  |      |k(  sJ | j                  |      |k(  sJ y )
Nc                  P    t        ddg      j                  t        ddg            S Nr   r   r   lower_triangular_solverD   r@   r    r?   z-test_lower_triangular_solve.<locals>.<lambda>   !    1v55faVnE r@   c                  V    t        ddgddgg      j                  t        dg            S rh   ri   rD   r@   r    r?   z-test_lower_triangular_solve.<locals>.<lambda>   )    AA'(??sL r@   c                  `    t        ddgddgg      j                  t        ddgddgg            S Nr*   r   r   ri   rD   r@   r    r?   z-test_lower_triangular_solve.<locals>.<lambda>   8    AA'(??QFQF#$& r@   r   r   r   r0   r*   rO   )r   r   r   rH   r   r   r   rj   r=   BCs      r    test_lower_triangular_solvert      s    
EG
:LN
:	&' 	AA AAA AAA A##A&!+++##A&!+++r@   c                  H   t        t        d        t        t        d        t        t        d        t	        ddgddgg      } t	        t
        t        gt        t
        gg      }t	        ddgdd	gg      }| j                  |      |k(  sJ | j                  |      |k(  sJ y )
Nc                  P    t        ddg      j                  t        ddg            S rh   r   upper_triangular_solverD   r@   r    r?   z-test_upper_triangular_solve.<locals>.<lambda>   rk   r@   c                  V    t        ddgddgg      j                  t        dg            S rh   rw   rD   r@   r    r?   z-test_upper_triangular_solve.<locals>.<lambda>   rm   r@   c                  `    t        ddgddgg      j                  t        ddgddgg            S ro   rw   rD   r@   r    r?   z-test_upper_triangular_solve.<locals>.<lambda>   rp   r@   r   r   r*   r   r+   r0   )r   r   r   	TypeErrorr   r   r   rx   rq   s      r    test_upper_triangular_solver|      s    
EG
:LN
9	&' 	AA AAA AAA A##A&!+++##A&!+++r@   c                      t        t        d        t        ddgddgg      dz   t        t        t        gt        t        gg       j                        dz  k(  sJ t        ddgddgg       t        t         fd       y )Nc                  N    t        ddg      j                  t        dg            S )Nr   )r   diagonal_solverD   r@   r    r?   z%test_diagonal_solve.<locals>.<lambda>   s    faVn;;FA3KH r@   r   r   r*   c                  &     j                        S r:   )r   r=   rr   s   r    r?   z%test_diagonal_solve.<locals>.<lambda>  s    a..q1 r@   )r   r{   r   r   r   r   r   s   @@r    test_diagonal_solver      s    
9HIAA "AAA AA!A#%%%AA A
912r@   c                      t        ddgddgg      } t        ddg      }| j                  |      | j                  |      k(  sJ | j                  |      | j                  |      k(  sJ | j                  |      t        t	        d      t	        d      g      k(  sJ | | j                         z  |z  |k(  sJ t        g d	g d
g      }| j                  |      | j                  |      k(  sJ | j                  |      | j                  |      k(  sJ | j                  |      t        g dg dg      dz  k(  sJ | | j                         z  |z  |k(  sJ t        g dg dg      } t        ddg      }| j                  |      }i }|j                  t              D ]  }|||j                  <    |t        |d   dz  |d   dz  z   |d   dz  z
  dz   g|d   dz  |d   dz  z   |d   dz  z
  dz   g|d    dz  |d   dz  z
  |d   dz  z   dz   gg      k(  sJ | | j                         z  |z  |k(  sJ t        ddgddgddgg      } t        g d      }| j                  |      t        ddg      k(  sJ | | j                         z  |z  |k7  sJ y )Nr   r,   r2   rO   rQ      z-43/26z71/26)rQ   r      )         )iii)E   K   Q      )r   r   r   )r   r   r   w0_0r+   w1_0w2_0r   r   )r+   r*   r   )	r   
pinv_solver#   rd   r	   pinvatomsr   name)r=   rr   solutionwss        r    test_pinv_solver     s   AA ABxA<<?a..q1111<<?ajjm+++<<?fgh&79I%JKKKKqvvx<!q   l+,A<<?a..q1111<<?ajjm+++<<?fo|%DEJJJJqvvx<!q   	9%&A1vA||AH
A^^F# !&&	 v&	!aik 9AfIaK G! KL !&	!aik 9AfIaK G! KL!"6
1qy{ :QvYq[ H1 LMO P P P P qvvx<!q   AAA'(AyA<<?faVn,,,qvvx<!q   r@   c                  8   t        g dg dg      t        ddgddgg      t        ddgddgddgg      g} | D ]f  }|j                  d	
      }||z  }||z  }t        ||z        |k(  sJ t        ||z        |k(  sJ |j                  |k(  sJ |j                  |k(  rfJ  | D ]f  }|j                  d
      }||z  }||z  }t        ||z        |k(  sJ t        ||z        |k(  sJ |j                  |k(  sJ |j                  |k(  rfJ  t        ddgddgg      }t        ddg      }|j	                  |      }|j                  t              j                         }|j                  dk(  sJ |t        d|g      k(  sJ ||j                         z  |z  |k(  sJ t        ddg      }|j	                  |      }|j                  t              j                         }|j                  dk(  sJ |t        d|g      k(  sJ ||j                         z  |z  |k7  sJ y )Nr   r   r   )r*   r*   r*   r   r   r*   r   r+   r.   RD)methodEDr   )	r   r   r
   Hr   r   r   popr   )Asr=   A_pinvAApApArr   r   w1s           r    test_pinv_rank_deficientr   $  sM   
)Y'
(
1a&1a&!
"
1a&1a&1a&)
*
,B  t$&jqja A%%%f%///uu||uu||  t$&jqja A%%%f%///uu||uu|| 	AA A1vA||AH			#	#	%B77fvq"g&&&qvvx<!q   1vA||AH			#	#	%B77fvq"g&&&qvvx<!q   r@   c            
        
 t        g dg dg dg      
t        g d      
j                        \  } }| t        dgdgdgg      k(  sJ |t        ddg       k(  sJ t        d	      
t        g d
g dg dg      
j                        \  } }| k(  sJ |t        ddg       k(  sJ t        g dg dg dg      
t        g d      
j                  d      \  } }}i }| j                  t              D ]  }|||j
                  <    | t        |d   dz
  gd|d   z  dz   g|d   gg      k(  sJ |t        |d   gg      k(  sJ |dgk(  sJ t        g dg dg dg      
t        d	dgddgddgg      
j                  d      \  } }}i }| j                  t              D ]  }|||j
                  <    | t        |d   dz
  |d   t        dd	      z
  gd|d   z  dz   d|d   z  t        dd	      z   g|d   |d   gg      k(  sJ |t        |d   |d   gg      k(  sJ |dgk(  sJ t        g dg dg dg      
t        g d      
j                        \  } }i }| j                  t              D ]  }|||j
                  <    | t        d|d   z  d	|d   z  z
  g|d   g|d   gg      k(  sJ |t        |d   g|d   gg      k(  sJ t        g dg dg dg      
t        g d      
j                        \  } }i }| j                  t              D ]  }|||j
                  <    | t        |d   g|d   g|d   gg      k(  sJ |t        |d   g|d   g|d   gg      k(  sJ t        g dg dg dg      
t        g d      t        t        
fd       t        g dg dg dg d g      
t        g d!      
j                        \  } }| t        t        dd      gdgt        dd      gg      k(  sJ |t        ddg       k(  sJ t        g dg dg dg d g      
t        ddgddgddgddgg      
j                        \  } }| t        t        dd      t        dd      gddgt        dd      t        dd      gg      k(  sJ |t        ddg       k(  sJ t        g dg dg dg d g      
t        g d"      t        t        
fd#       t        g dg dg dg d g      
t        ddgddgddgddgg      t        t        
fd$       t        g dg dg dg d g      
t        ddgddgddgddgg      t        t        
fd%       t        g dg d&g d'g d g      
t        g d"      
j                        \  } }i }| j                  t              D ]  }|||j
                  <    | t        d(|d   z  d)z   gdg|d   gg      k(  sJ |t        |d   gg      k(  sJ t        g dg d&g d'g d g      
t        g d*      t        t        
fd+       t        g d
g dg d,g      
t        g d-      
j                        \  } }i }| j                  t              D ]  }|||j
                  <    | t        d|d   z  dz
  gd(|d   z  dz   gdg|d   gg      k(  sJ |t        |d   gg      k(  sJ t        g d
g dg d.g      
t        g d/      
j                        \  } }i }| j                  t              D ]  }|||j
                  <    | t        |d   d|d   z  z   t        j                  z   gd|d   z  d	|d   z  z
  t        dd      z
  g|d   g|d   gg      k(  sJ |t        |d   g|d   gg      k(  sJ t        d0      \  }}}}t        g d1ddddd|gg      }	|	d d d df   
|	d d dd f   
j                        \  } }|t        d	d|||g      k(  sJ | t        d)d|d|||g      k(  sJ t        g d
g dg d.g      
t        g d-      t        t        
fd2       t        ddgddgg      
t        ddg      
j                        \  } }| t        ddg      k(  sJ |t        ddg       k(  sJ | j                  t        k(  sJ |j                  t        k(  sJ t        g d3g d"g      
t        ddg      
j                        \  } }i }| j                  t              D ]  }|||j
                  <    | t        dg|d   g|d   gdgg      k(  sJ |t        |d   g|d   gg      k(  sJ y )4N)r   r*   r+   )r   r,   r.   )r2   r0   r6   )r+   r.   rO   r4   r*   r   r   r+   )r   r*   r+   r   )r,   r.   r2   r0   )rO   r6   rP   rQ   r   )r2   r0   rO   T)freevartau0rZ   r.   r0   rO   rQ   tau1)r*   r   r.   )r   r   r   tau2)r   r   r   c                  &     j                        S r:   r   r<   s   r    r?   z)test_gauss_jordan_solve.<locals>.<lambda>      q33A6 r@   )r   r,   r+   )r*   r   r.   )r   r2   rO   )r   r   r+   )r   r   r   r   )r   r   r   r   c                  &     j                        S r:   r   r<   s   r    r?   z)test_gauss_jordan_solve.<locals>.<lambda>  r   r@   c                  &     j                        S r:   r   r   s   r    r?   z)test_gauss_jordan_solve.<locals>.<lambda>  r   r@   c                  &     j                        S r:   r   r   s   r    r?   z)test_gauss_jordan_solve.<locals>.<lambda>  r   r@   )r*   r6   r.   )r+   r   rO   rX   r,   )r   r   r   r   c                  &     j                        S r:   r   r<   s   r    r?   z)test_gauss_jordan_solve.<locals>.<lambda>  r   r@   )rO   r6   r   rQ   r   )r*   r   r.   r0   )r   r   r   z_tau0 _tau1 _tau2 tau1)r   r   r   r   r   r   c                  &     j                        S r:   r   r<   s   r    r?   z)test_gauss_jordan_solve.<locals>.<lambda>  r   r@   )r   r   r   r   )r   r   r   r   r   r   r   r   rH   r   Halfr   r   	__class__r   )solparamsr   r   r   x0x1x2_x0r   r=   rr   r>   s             @@@r    test_gauss_jordan_solver   M  s
    		9j12AyA&&q)KC&2$aS)****VAq"%%%% 	AAlO<=A&&q)KC!8O8VAq"%%%% 		9i01AyA//4/@C
AYYv !&&	 &1V9q=/BqyL1,<+=&	{KLLLLVai[M****qc>> 		9i01AAAB()A//4/@C
AYYv !&&	 &1V9q=!F)hq!n*DEai<!+R&	\HQN-JKV9ai03 4 4 4 4 Vai6345555qc>> 		9i01AyA&&q)KC
AYYv !&&	&2ai<!AfI+56F)qyk3 4 4 4 4Vai[1V9+67777 		9i01AyA&&q)KC
AYYv !&&	&1V9+&	{QvYK@AAAAVai[1V9+&	{CDDDD 		9i01AyA
:67 		9i;<A|A&&q)KC&8B?+aS8Aq>2BCDDDDVAq"%%%% 		9i;<A11v1v1v./A&&q)KC&8B?HRO<q!fxPQST~W_`acdWeFfghhhhVAq"%%%% 		9i;<A|A
:67 		9i;<A11v1v1v./A
:67 		9i;<A11v1v1v./A
:67 		:z9=>A|A&&q)KC
AYYv !&&	&2ai<!+,rdQvYK@AAAAVai[M**** 		:z9=>A|A
:67 	lN;<AyA&&q)KC
AYYv !&&	&1QvY;?+b6lQ.>-?!F)& ' ' ' 'Vai[M**** 	lL9:AyA&&q)KC
AYYv !&&	&1V9q6{2QVV;<QvY,1V94x1~EFF)qyk3 4 4 4 4 Vai[1V9+6777767OBB"Q1aC$89:A	!SbS&	A	!RS&	A&&q)KCVAq2r2,////&AAr334444 	lL9:AyA
:67 	!Q!Q()AAA&&q)KC/1a&))))_Q2....==00003333 	l+,A1vA&&q)KC
AYYv !&&	&1#&	{QvYK!=>>>>Vai[1V9+67777r@   c                     t        g dg dg dg dg dg dg dg dg      } t        g d	      }| j                  |      \  }}i }|j                  t              D ]  }|||j                  <    |t        |d
   g|d   g|d   g|d   g|d   g|d   gg      k(  sJ |t        dd|d   z  z
  g|d   gdd|d
   z  z
  |d   z   g|d
   g|d   |d   z   gd|d   z  d|d   z  z
  d|d   z  z
  gdd|d   z  z
  g|d   g|d   g|d   g|d   gdd|d   z  z
  g|d   gdgg      k(  sJ ddlm}m} t        g ddddddddd| g	dddddddd|g	g      } t        t        t        |             d         }t        d      \  }	}
}}}|t        | |z
  |	z
  |z   |z   dz   g||
z
  |z
  |z
  g|	g|
g||z
  |z
  |z
  g|g|g|gg      k(  sJ | d d d df   |z  | d d df   z
  }|t        dgdgdgg      k(  sJ y )N)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   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   r   r   r   r   r   r   r   r   r   r   r   r   )r   r*   r   r   r   r   r   r*   r   r   r   tau3tau4tau5r   r4   r   )rF   f)	r   r   r   r   r   r   r   r   r   ztau:5)r   r   r   r   r   	sympy.abcrF   r   listr   r   )r=   rr   r   r   r   r   rF   r   sol_1r   r   r   r   r   sol_2s                  r    4test_linsolve_underdetermined_AND_gauss_jordan_solver     s   ::::::::< 	=A 
(	)A&&q)KC
AYYv !&&	Vai[1V9+&	{i[1V9+&	{D E E E E&1q6{?+V9+q6{?QvY67V9+V9qy01ai<!AfI+5!F)CDq6{?+V9+V9+V9+V9+q6{?+V9+#         $Ar1b!R!$A1q!a!$ 	A hqk"1%
&E#*7#3 D$dDFaR!Vd]T1D81<=t8d?T12&&t8d?T12&&&" # # # # a2gK%!ArE)+EFQC!qc?++++r@   c                       t        ddgddgg       t        dgdgg      t        t         fd       t        dgdgg      t        t         fd       y )Nr   r*   r   r+   c                  &     j                        S r:   solver<   s   r    r?   ztest_solve.<locals>.<lambda>2      qwwqz r@   r0   c                  &     j                        S r:   r   r<   s   r    r?   ztest_solve.<locals>.<lambda>4  r   r@   )r   r   rH   r<   s   @@r    
test_solver   /  sS    1!u~AaSzA
:)*!qc{A
:)*r@   N)1sympy.core.functionr   sympy.core.numbersr   r   sympy.core.singletonr   sympy.core.symbolr   r   sympy.core.sympifyr	   sympy.simplify.simplifyr
   sympy.matrices.matricesr   r   sympy.matricesr   r   r   r   r   r   sympy.testing.pytestr   sympy.matrices.commonr   sympy.solvers.solvesetr   r   r   r   r!   r$   r'   rM   rS   rV   r`   re   rt   r|   r   r   r   r   r   r   rD   r@   r    <module>r      s    * , " / & , FK K ' : + @m6%;P2N"J&7R,$,$3!B'!Re8P7,t+r@   