
    HR-eFT              
       
   d dl Z d dlZd dlZd dlmZmZ d dlmZ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 d dlmZ d dlmZmZm Z  d dl!m"Z" d dl#m$Z$ g d	Z%g d
Z&g dZ'eeeeeeeeeeg
Z(dd ej)        d           ej*        d          gZ+ ej,        d          Z-de-d<    ej,        d          Z.de.d<   ej/        0                    d          Z1ej/        0                    dd          Z2 G d d          Z3dS )    N)assert_allcloseassert_almost_equal)convolveconvolve_fft)AiryDisk2DKernelBox1DKernelBox2DKernelCustomKernelGaussian1DKernelGaussian2DKernelKernel1DKernel2DModel1DKernelModel2DKernelRickerWavelet1DKernelRickerWavelet2DKernelRing2DKernelTophat2DKernelTrapezoid1DKernelTrapezoidDisk2DKernel)KernelSizeError)Box2D
Gaussian1D
Gaussian2D)	HAS_SCIPY)AstropyUserWarning)         	   )            )centerlinear_interp
oversample	integrate         ?Q   (   )r+   r+   )r,   r,   =   c            	          e Zd ZdZej                            e d          ej                            de	          d                         Z
ej                            e d          ej                            de	          d                         Zej                            d e ej        ee	                              d             Zej                            d e ej        ee	                              d	             Zej                            de	          d
             Zej                            de	          d             Zd Zd Zej                            de          d             Zej                            de          d             Zej                            de          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-ej                            d& e ej        ee.                              d'             Z/ej                            de0          d(             Z1d) Z2d* Z3d+ Z4d, Z5d- Z6d. Z7d/ Z8d0 Z9d1S )2TestKernelsz:
    Test class for the built-in convolution kernels.
    zRequires scipy)reasonwidthc                    ddl m} t          |          }|                                 t	          |          }|                                 t          t          |d          }t          t          |d          } |t          |          } |t          |          }t          ||d           t          ||d           dS )zL
        Test GaussianKernel against SciPy ndimage gaussian filter.
        r   )gaussian_filterfillboundary   decimalN)	scipy.ndimager3   r   	normalizer   r   delta_pulse_1Ddelta_pulse_2Dr   )	selfr1   r3   gauss_kernel_1Dgauss_kernel_2D
astropy_1D
astropy_2Dscipy_1Dscipy_2Ds	            Klib/python3.11/site-packages/astropy/convolution/tests/test_kernel_class.pytest_scipy_filter_gaussianz&TestKernels.test_scipy_filter_gaussianE   s     	211111*511!!###*511!!###noOOO
noOOO
"?>599"?>599J"====J"======    c                 n   ddl m} t          |          }t          |          }t	          t
          |dd          }t	          t          |dd          }d}t          j        t          |          5  t	          t
          |dd          }d	d	d	           n# 1 swxY w Y   t          j        t          |          5  t	          t          |dd          }d	d	d	           n# 1 swxY w Y    |t
          |           } |t          |           }	t          ||d
           t          ||	d
           d	S )z\
        Test RickerWavelet kernels against SciPy ndimage gaussian laplace filters.
        r   )gaussian_laplacer4   Fr6   normalize_kernelzsum is close to zeromatchTNr   r8   )r:   rI   r   r   r   r<   r=   pytestraises	Exceptionr   )
r>   r1   rI   ricker_kernel_1Dricker_kernel_2DrA   rB   MESSAGErC   rD   s
             rE   "test_scipy_filter_gaussian_laplacez.TestKernels.test_scipy_filter_gaussian_laplace[   s    	322222077077,vPU
 
 

 ,vPU
 
 

 *]9G444 	 	! 06TX  J	 	 	 	 	 	 	 	 	 	 	 	 	 	 	
 ]9G444 	 	! 06TX  J	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 %$^U;;;$$^U;;; 	J!<<<<J!<<<<<<s$   2BBB=C""C&)C&)kernel_typer1   c                    |t           k    rt          st          j        d           |t          k    s ||          }n |||dz            }|j        dk    rDt          t          |dd          }t          t          |dd          }t          ||d           d	S t          t          |dd          }t          t          |dd          }t          ||d           d	S )
I
        Test smoothing of an image with a single positive pixel
        /Omitting AiryDisk2DKernel, which requires SciPy皙?r)   r4   FrJ   r7   r8   Nr   r   rN   skipr   	dimensionr   r<   r   r   r=   r>   rU   r1   kernelc1c2s         rE   test_delta_datazTestKernels.test_delta_data       ***9*KIJJJl** [''FF [44Fq  %  B %  B  B333333%  B %  B  B333333rG   c                    |t           k    rt          st          j        d           |t          k    s ||          }n |||dz            }|j        dk    rDt          t          |dd          }t          t          |dd          }t          ||d           d	S t          t          |dd          }t          t          |dd          }t          ||d           d	S )
zA
        Test smoothing of an image made of random noise
        rX   rY   r)   r4   FrJ   r7   r8   N)r   r   rN   r[   r   r\   r   random_data_1Dr   r   random_data_2Dr]   s         rE   test_random_datazTestKernels.test_random_data   rb   rG   c                     t          j        ||g          }t          t          |d          }t	          t          |d          }t          ||d           dS )z
        Test smoothing of an image with a single positive pixel

        Instead of using kernel class, uses a simple, small kernel
        r4   r5   r7   r8   N)nponesr   r=   r   r   )r>   r1   r^   r`   r_   s        rE   test_uniform_smallkernelz$TestKernels.test_uniform_smallkernel   sZ     %((.&6BBBnfv>>>BB//////rG   c                     t          j        ||g          |dz  z  }t          |          }t          t          |d          }t          t          |d          }t          ||d           dS )rW   r!   r4   r5   r7   r8   N)rh   ri   r	   r   r=   r   )r>   r1   kernel1kernel2r`   r_   s         rE   test_smallkernel_vs_Box2DKernelz+TestKernels.test_smallkernel_vs_Box2DKernel   sp    
 '5%.))E1H4e$$.'FCCC.'FCCCBB//////rG   c                 N   t          d          }t          d          }t          d          }t          j        t          d          5  t	          ||          }ddd           n# 1 swxY w Y   t          j        t          j        ||z
  j                  dk               sJ dS zR
        Check if convolving two kernels with each other works correctly.
        r   r"   r   z*Both array and kernel are Kernel instancesrL   Ng{Gz?)	r   rN   warnsr   r   rh   allabsarrayr>   gauss_1gauss_2test_gauss_3gauss_3s        rE   test_convolve_1D_kernelsz$TestKernels.test_convolve_1D_kernels        #1%%"1%%'**\&W
 
 
 	1 	1 w00G	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1 	1
 vbfg4;<<tCDDDDDDD   	A&&A*-A*c                 N   t          d          }t          d          }t          d          }t          j        t          d          5  t	          ||          }ddd           n# 1 swxY w Y   t          j        t          j        ||z
  j                  dk               sJ dS rp   )	r   rN   rq   r   r   rh   rr   rs   rt   ru   s        rE   test_convolve_2D_kernelsz$TestKernels.test_convolve_2D_kernels   r{   r|   numberc                 l    t          d          }||z  }t          |j        |j        |z  d           dS )N
        Check if multiplying a kernel with a scalar works correctly.
        r   r7   r8   N)r   r   rt   r>   r   gauss	gauss_news       rE   test_multiply_scalarz TestKernels.test_multiply_scalar   s>    
 !##UN	IOU[6-A2NNNNNNrG   c                 ^    t          d          }||z  }t          |          t           u sJ dS r   r   Nr   typer   s       rE   test_multiply_scalar_typez%TestKernels.test_multiply_scalar_type   s8    
 !##UN	I"2222222rG   c                 ^    t          d          }||z  }t          |          t           u sJ dS r   r   r   s       rE   test_rmultiply_scalar_typez&TestKernels.test_rmultiply_scalar_type	  s8    
 !##FN	I"2222222rG   c                     t          d          }t          j        t                    5  ||z   ddd           dS # 1 swxY w Y   dS )z9Test that multiplying two 1D kernels raises an exception.r   N)r   rN   rO   rP   r>   r   s     rE   test_multiply_kernel1dz"TestKernels.test_multiply_kernel1d       ##]9%% 	 	EMM	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	   <A A c                     t          d          }t          j        t                    5  ||z   ddd           dS # 1 swxY w Y   dS )z9Test that multiplying two 2D kernels raises an exception.r   N)r   rN   rO   rP   r   s     rE   test_multiply_kernel2dz"TestKernels.test_multiply_kernel2d  r   r   c                     t          j        t                    5  t          d          t	          d          z   ddd           dS # 1 swxY w Y   dS )za
        Test that multiplying a 1D kernel with a 2D kernel raises an
        exception.
        r   N)rN   rO   rP   r   r   r>   s    rE   test_multiply_kernel1d_kernel2dz+TestKernels.test_multiply_kernel1d_kernel2d  s    
 ]9%% 	6 	6Q"21"5"555	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6s    AAAc                     t          j        t                    5  t          d          dz    ddd           dS # 1 swxY w Y   dS )z:Test that adding a scalar to a kernel raises an exception.r   r)   N)rN   rO   rP   r   r   s    rE   test_add_kernel_scalarz"TestKernels.test_add_kernel_scalar&  s    ]9%% 	$ 	$Q!##	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$   :>>c                     d}t          dt          j        dt          j        z  |dz  z            z  d|          }t	          |d          }|                                 t          |d          }t          |j        |j        d           d	S )
z>
        Check Model1DKernel against Gaussian1Dkernel
              @r*   r!   r      x_sizer7   r8   N)	r   rh   sqrtpir   r;   r   r   rt   r>   stddevr   model_gauss_kernelgauss_kernels        rE   test_model_1D_kernelz TestKernels.test_model_1D_kernel+  s     3RUVQY)>!?!??FKK*5<<<$$&&&'r:::.4l6HRTUUUUUUrG   c                     d}t          ddt          j        z  |dz  z  z  dd||          }t          |d          }|                                 t          |d          }t          |j        |j        d           d	S )
z>
        Check Model2DKernel against Gaussian2Dkernel
        r   r*   r!   r   r   r   r7   r8   N)r   rh   r   r   r;   r   r   rt   r   s        rE   test_model_2D_kernelz TestKernels.test_model_2D_kernel6  s     3!be)fai"78!QOO*5<<<$$&&&'r:::.4l6HRTUUUUUUrG   c                    t          j        d          }t          |          }|                                 t	          d          }t          t          |d          }t          t          |d          }t          ||d           dS )z9
        Check CustomKernel against Box1DKernel.
        r   r4   r5   r7   r8   N)rh   ri   r
   r;   r   r   r<   r   r>   rt   customboxr`   r_   s         rE   test_custom_1D_kernelz!TestKernels.test_custom_1D_kernelA  s~    
 

e$$!nnnfv>>>ncF;;;BB//////rG   c                    t          j        d          }t          |          }|                                 t	          d          }t          t          |d          }t          t          |d          }t          ||d           dS )z9
        Check CustomKernel against Box2DKernel.
        )r   r   r   r4   r5   r7   r8   N)rh   ri   r
   r;   r	   r   r=   r   r   s         rE   test_custom_2D_kernelz!TestKernels.test_custom_2D_kernelO  s~    
 e$$!nnnfv>>>ncF;;;BB//////rG   c                 >    t          g d          }|j        du sJ dS )9
        Check if CustomKernel works with lists.
        )r)   r)   r)   r)   r)   TNr
   is_boolr>   r   s     rE   test_custom_1D_kernel_listz&TestKernels.test_custom_1D_kernel_list]  s.     ooo..~%%%%%%rG   c                 L    t          g dg dg dg          }|j        du sJ dS )r   )r)   r)   r)   TNr   r   s     rE   test_custom_2D_kernel_listz&TestKernels.test_custom_2D_kernel_listd  s=     yyy)))YYY?@@~%%%%%%rG   c                     g d}t          |          }t          j        t          d          5  |                                 ddd           n# 1 swxY w Y   |j        dk    sJ |j        dk    sJ dS )]
        Check if CustomKernel works when the input array/list
        sums to zero.
        )r   r)   r!   3kernel cannot be normalized because it sums to zerorL   Nr*           r
   rN   rq   r   r;   
truncation_kernel_sumr>   rt   r   s      rE   test_custom_1D_kernel_zerosumz)TestKernels.test_custom_1D_kernel_zerosumk  s    
 "!!e$$\L
 
 
 	 	 		 	 	 	 	 	 	 	 	 	 	 	 	 	 	  C''''!S((((((s   AAAc                     g dg dg dg}t          |          }t          j        t          d          5  |                                 ddd           n# 1 swxY w Y   |j        dk    sJ |j        dk    sJ dS )r   )r   r   r   )r   r"   r   r   rL   Nr*   r   r   r   s      rE   test_custom_2D_kernel_zerosumz)TestKernels.test_custom_2D_kernel_zerosum}  s    
 [[[***5e$$\L
 
 
 	 	 		 	 	 	 	 	 	 	 	 	 	 	 	 	 	  C''''!S((((((s   AAAc                     t          j        t                    5  t          g d           ddd           dS # 1 swxY w Y   dS )zH
        Check if CustomKernel raises if the array size is odd.
        )r)   r)   r)   r)   N)rN   rO   r   r
   r   s    rE   test_custom_kernel_odd_errorz(TestKernels.test_custom_kernel_odd_error  s     ]?++ 	' 	'&&&	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	'   9= =c                    t          d          }t          d          }t          d          }||z   |z   }||z   |z   }||z   |z   }g d}t          |j        |d           t          |j        |d           t          |j        |d           t          |j        g dd           t          |j        g dd           t          |j        dgd           d	S )
:
        Check if adding of two 1D kernels works.
        r   r   r)   )rY   ?g?r   rY   r7   r8   )rY   rY   rY   rY   rY   )UUUUUU?r   r   N)r   r   rt   )r>   box_1box_2box_3	box_sum_1	box_sum_2	box_sum_3refs           rE   test_add_1D_kernelszTestKernels.test_add_1D_kernels  s    AAAEME)	EME)	EME)	
 
 
 	IOS"====IOS"====IOS"==== 	EK)B)B)BBOOOOEK)D)D)DbQQQQEK!b999999rG   c                 >   t          d          }t          d          }||z   }||z   }g dg dg dg}g dg dg dg}t          |j        dggd           t          |j        |d           t          |j        |d           t          |j        |d           dS )r   r   r)   )qq?r   r   )r   grq?r   r7   r8   N)r	   r   rt   )r>   r   r   r   r   r   ref_1s          rE   test_add_2D_kernelszTestKernels.test_add_2D_kernels  s     AAEM	EM	'''+++'''
 (''''''''

 	EK1#;;;;EK;;;;IOS"====IOS"======rG   c                 L    t          dd          }|j        j        dk    sJ dS )>
        Check if even size for GaussianKernel works.
        r   
   r   N)r   rt   sizer   s     rE   test_Gaussian1DKernel_even_sizez+TestKernels.test_Gaussian1DKernel_even_size  s2     !2...{2%%%%%%rG   c                 N    t          ddd          }|j        j        dk    sJ dS )r   r   r   r   y_size)r   r   N)r   rt   shaper   s     rE   test_Gaussian2DKernel_even_sizez+TestKernels.test_Gaussian2DKernel_even_size  s4     !2b999{ H,,,,,,rG   c                 t    t          ddddd          }g dg dg dg d	g d
g}t          ||d           d S )Nr   g      ?g-DT!?r   )x_stddevy_stddevthetar   r   ) KYe*?bc?#k͹?]Z?9s8?)r   ӋVņ4?hYg?r   r   )r   r   g|0Q?r   r   )r   r   r   r   r   )r   r   r   r   r   gMbP?)rtol)r   r   )r>   r   anss      rE   test_Gaussian2DKernel_rotatedz)TestKernels.test_Gaussian2DKernel_rotated  sw     ,>qQR
 
 
 IHHHHHHHHHHHHHH
 	s//////rG   c                     t          g d          }|                    d           |j                                        dk    sJ dS )z:
        Check if normalize works with peak mode.
        )r)   r!   r   r!   r)   peakmoder)   N)r
   r;   rt   maxr   s     rE   test_normalize_peakzTestKernels.test_normalize_peak  sQ     ooo..f%%%|!!Q&&&&&&rG   c                     t          d          }|j        dk    sJ t          |j        t                    sJ |j        ddgk    sJ |                                 t          |j        dd           |j	        sJ dS )z9
        Check if kernel attributes are correct.
        r   r   r!   r*   r7   r8   N)
r	   r   
isinstancemodelr   r%   r;   r   r   	separable)r>   r   s     rE   test_check_kernel_attributesz(TestKernels.test_check_kernel_attributes  s     !nn ~"""" #)U+++++ zaV#### 	COS"==== }rG   )rU   r   c                    |t           k    rt          st          j        d           |t          k    s |d          }n |dd          }|j        dk    rDt          t          |dd          }t          t          |dd          }t          ||d	           d
S t          t          |dd          }t          t          |dd          }t          ||d	           d
S )z
        Check if the different modes result in kernels that work with convolve.
        Use only small kernel width, to make the test pass quickly.
        rX   r   g433333?r)   r4   FrJ   r7   r8   NrZ   )r>   rU   r   r^   r_   r`   s         rE   test_discretize_modesz!TestKernels.test_discretize_modes  s    ***9*KIJJJl** [^^FF [G,,Fq  %  B %  B  B333333%  B %  B  B333333rG   c                 4   t          |          }|j        d         dz  dk    sJ |j                                        dk    sJ t	          |          }t          j        d |j        D                       sJ |j                                        dk    sJ dS )zC
        Check if BoxKernel work properly with even sizes.
        r   r!   r*   c                      g | ]}|d z  dk    S )r!   r    ).0_s     rE   
<listcomp>z:TestKernels.test_box_kernels_even_size.<locals>.<listcomp>+  s     ;;;aq1uz;;;rG   N)r   r   rt   sumr	   rh   rr   )r>   r1   	kernel_1D	kernel_2Ds       rE   test_box_kernels_even_sizez&TestKernels.test_box_kernels_even_size!  s    
  &&	q!A%****""$$++++&&	v;;9?;;;<<<<<""$$++++++rG   c                 F   t          t          j        d                    }|                                 t          j        |j                  }|                                 t          ||j                   |                                 t          ||j                   dS )zU
        Test that repeated normalizations do not change the kernel [#3747].
        r   N)r
   rh   ri   r;   copyrt   r   )r>   r^   datas      rE   test_kernel_normalizationz%TestKernels.test_kernel_normalization.  s    
 bgajj))wv|$$fl+++fl+++++rG   c                     t          j        t                    5  t          t	          j        d                    }|                    d           ddd           dS # 1 swxY w Y   dS )zB
        Test that an error is raised if mode is invalid.
        r   invalidr   N)rN   rO   
ValueErrorr
   rh   ri   r;   )r>   r^   s     rE   test_kernel_normalization_modez*TestKernels.test_kernel_normalization_mode=  s     ]:&& 	- 	-!"'!**--F),,,	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	-s   8AA#&A#c                     t          j        t                    5  t          dd           ddd           dS # 1 swxY w Y   dS )zd
        Test that an error is raised if ``Kernel1D`` ``x_size`` is not
        an integer.
        r   333333?r   N)rN   rO   	TypeErrorr   r   s    rE   test_kernel1d_int_sizez"TestKernels.test_kernel1d_int_sizeE      
 ]9%% 	, 	,Qs++++	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	,r   c                     t          j        t                    5  t          dd           ddd           dS # 1 swxY w Y   dS )zd
        Test that an error is raised if ``Kernel2D`` ``x_size`` is not
        an integer.
        r   r  r   NrN   rO   r  r   r   s    rE   test_kernel2d_int_xsizez#TestKernels.test_kernel2d_int_xsizeM  r  r   c                     t          j        t                    5  t          ddd           ddd           dS # 1 swxY w Y   dS )zd
        Test that an error is raised if ``Kernel2D`` ``y_size`` is not
        an integer.
        r   r   r  r   Nr  r   s    rE   test_kernel2d_int_ysizez#TestKernels.test_kernel2d_int_ysizeU  s    
 ]9%% 	6 	6Qq5555	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6r   c                     t          j        t                    5  t                       ddd           dS # 1 swxY w Y   dS )zn
        Test that an error is raised if an array or model is not
        specified for ``Kernel1D``.
        N)rN   rO   r  r   r   s    rE   test_kernel1d_initializationz(TestKernels.test_kernel1d_initialization]      
 ]9%% 	 	JJJ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	   6::c                     t          j        t                    5  t                       ddd           dS # 1 swxY w Y   dS )zn
        Test that an error is raised if an array or model is not
        specified for ``Kernel2D``.
        N)rN   rO   r  r   r   s    rE   test_kernel2d_initializationz(TestKernels.test_kernel2d_initializatione  r  r  c           
         t          j        ddg          }t          j        t          d          5  t          d|           t          d|           t          d|           t          d|           t          d|           t          d|           t          d|           t          t          ddd          |           t          t          ddddd          |           t!          dd	|           t#          d|           t%          d|           t%          d|           d
d
d
           d
S # 1 swxY w Y   d
S )z2
        Regression test for issue #10439
        r   z.* allowed .*rL   r!   )rt   r)   r   r    r#   N)rh   ri   rN   rO   r  r   r   r	   r   r   r   r   r   r   r   r   r   r   r   )r>   xs     rE   test_array_keyword_not_allowedz*TestKernels.test_array_keyword_not_allowedm  s    GRH]9,<=== 	* 	*Qa((((########Qa((((Qa((((!!1----!!1----*Q1--Q7777*Q1a331====AQ''''1A&&&&aq))))aq))))	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	*s   C?D>>EEN):__name__
__module____qualname____doc__rN   markskipifr   parametrize
WIDTHS_ODDrF   rT   list	itertoolsproductKERNEL_TYPESra   rf   rj   rn   rz   r~   NUMSr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   MODESr   WIDTHS_EVENr  r	  r  r  r  r  r  r  r   r   rG   rE   r/   r/   @   s         [I.>??[Wj11> > 21 @?>( [I.>??[Wj11"= "= 21 @?"=H [ $$'8y'8z'R'R"S"S 4 4 48 [ $$'8y'8z'R'R"S"S 4 4 48 [Wj11
0 
0 21
0 [Wj11
0 
0 21
0E E EE E E [Xt,,O O -,O [Xt,,3 3 -,3 [Xt,,3 3 -,3    6 6 6$ $ $
	V 	V 	V	V 	V 	V0 0 00 0 0& & && & &) ) )$) ) )$' ' ': : :4> > >.& & &- - -0 0 0' ' '  , [&7i&7e&L&L!M!M 4 4 4: [Wk22
, 
, 32
,, , ,- - -, , ,, , ,6 6 6    * * * * *rG   r/   )4r*  numpyrh   rN   numpy.testingr   r   astropy.convolution.convolver   r   astropy.convolution.kernelsr   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   astropy.convolution.utilsr   astropy.modeling.modelsr   r   r   "astropy.utils.compat.optional_depsr   astropy.utils.exceptionsr   r(  r/  r.  r,  float32float64r-  zerosr<   r=   randomrandrd   re   r/   r   rG   rE   <module>r=     sb            > > > > > > > > ? ? ? ? ? ? ? ?                                   $ 6 5 5 5 5 5 A A A A A A A A A A 8 8 8 8 8 8 7 7 7 7 7 7\\
mm>>> 	
3

3C1 "r (##v ##B''* * * * * * * * * *rG   