
    0Ph]                        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 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 d dlmZ ej                            d           ZdZddgde                     ed          z  z   Z!ddgde                     ed          z  z   Z"ddgde                     ed          z  z   Z#ddgde                     ed          z  z   Z$ddgde                     ed          z  z   Z%ddgde                     ed          z  z   Z& ej'        e!e"e#e$e%e&f          Z(ej)        *                    dg ddgg dd gdddd d!dej+        gdgdddd d!dej+        gdgg          d"             Z,ej)        *                    dddd#d$dd%d%ej+        gdgddd#d$d&dd%d%ej+        g	d gddd#dej+        gd gddd#ej+        gdgg          d'             Z-ej)        *                    d(g d)d dgddggg d*gg d)d dgddggg d+gg d)d dgddgd dggg d+gg d,d dgddgd dggg d-gg          d.             Z.d/ Z/d0 Z0ej)        *                    d1d2gd3 eD             z             d4             Z1d5 Z2d6 Z3d7 Z4d8 Z5d9 Z6d: Z7d; Z8ej)        *                    d<g d=          ej)        *                    d>g d?          ej)        *                    d1d2d@gdA eD             z             dB                                     Z9dC Z:ej)        *                    dD e;de(j<        d          dz  dE                    dF             Z=ej)        *                    dGe          dH             Z>dI Z?dJ Z@dK ZAej)        *                    dGdgez             dL             ZBej)        *                    dGe          dM             ZCdN ZDdS )O    N)DBSCANOPTICS)_extend_region_extract_xi_labels)generate_clustered_data)
make_blobs)DataConversionWarningEfficiencyWarning)contingency_matrix)pairwise_distances)shuffle)assert_allcloseassert_array_equal)CSR_CONTAINERS
   皙?      皙?   皙?   333333?g?      )r_plotend)r   !@皙!@ffffff!@   r   )r   r!   r"   r#   g333333!@r$   r   r!   r"   r#   r$   c                     t          j        |           } | d d         | dd          z  }|dk    }|dk     }t          ||dd          }||k    sJ d S )Nr   r   grq?r   r   nparrayr   )r   r    ratiosteep_downwardupwardes         a/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/sklearn/cluster/tests/test_optics.pytest_extend_downwardr.      sd     XfF3B3K&*$Eg%NQYF~vq!44A888888    g @g@   gffffff@c                     t          j        |           } | d d         | dd          z  }|dk    }|dk    }t          ||dd          }||k    sJ d S )Nr   r   g?r   r   r&   )r   r    r)   steep_upwarddownwardr,   s         r-   test_extend_upwardr4   2   sc     XfF3B3K&*$EC<LqyH|Xq!44A888888r/   )orderingclustersexpectedr   r   r   r   )r   r   r   r   )r   r   r   r   )r   r   r   r   )r   r   r   r   c                 F    t          | |          }t          ||           d S N)r   r   )r5   r6   r7   labelss       r-   test_the_extract_xi_labelsr<   E   s)      (33Fvx(((((r/   c                    t           j                            d          }d}ddgd|                    |d          z  z   }ddgd	|                    |d          z  z   }d
dgd|                    |d          z  z   }ddgd|                    |d          z  z   }ddgd|                    |d          z  z   }ddgd|                    |d          z  z   }t          j        |||||t          j        ddgg          |f                              | d          }	t           j        dgdz  dgdz  d
gdz  dgdz  d
gdz  ddgdz  f         }
t          |	|
|          \  }	}
t          ddddd          
                    |	          }t          |j        |
           t          d	dddd          
                    |	          }t          |j        |
           t          j        |||||t          j        ddggdz            |f                              | d          }	t           j        d
gdz  dgdz  dgdz  dgdz  dgdz  dddgdz  f         }
t          |	|
|          \  }	}
t          ddddd          
                    |	          }t          |j        |
           ddgdd	gddgd	dgg}ddgddgddgddgg}ddgddgddgddgg}t          j        |||f                              | d          }	t           j        dgdz  d
gdz  dgdz  f         }
t          |	|
|          \  }	}
t          ddt           j        dd          
                    |	          }t          |j        |
           d S ) Nr   r   r   r   r   r   r   r   r   r   r   r   r   g333333?r   d   Fcopyrandom_state   xi皙?)min_samplesmin_cluster_sizemax_epscluster_methodrD   g{Gz?皙r   	      Z   n   {Gz?)r'   randomRandomStaterandnvstackr(   astyper_r   r   fitr   labels_inf)global_dtyperngn_points_per_clusterC1C2C3C4C5C6Xexpected_labelsclusts               r-   test_extract_xire   T   s    )


"
"C
bC#))$8!<<<	<B
R3#7;;;	;B
R3#7;;;	;B
a3#7;;;	;B
R3#7;;;	;B
Q#		"6:::	:B
	2r2r2rx#s'='=rBCCJJ5 	K 	 	A eQC!GaS1WqcAgsQwaaSSTWTUO O#FFFA2ds  	c!ff 
 u}o666 $4TW  	c!ff 
 u}o666
	2r2r2rx#sq0@'A'A2FGGNN5 	O 	 	A e	
a!q1#'A37QC!GRaS1WDO !O#FFFA2ds  	c!ff 
 u}o666a&1c(QIQx	0Br(RGb"X2w	/B*sBi#sb#Y	7B
	2r2,&&|%&@@AeQC!GaS1WqcAg56O O#FFFA26$SW  	c!ff 
 u}o66666r/   c                 \   t           j                            d          }d}ddgd|                    |d                              | d          z  z   }ddgd|                    |d                              | d          z  z   }t          j        ||f          }t          |d          }t          dd	
                              |          j	        }|j
        dk    sJ t          j        |t          j        ddgddgg          z
            }|t          |          z  dk     sJ d S )Nr   r>   r   Fr?   2   rA   rC   r   )rF   rD   )r   r   c      皙?)r'   rP   rQ   rR   rT   rS   r   r   rV   cluster_hierarchy_shapesumr(   len)rY   rZ   r[   r\   r]   rb   r6   diffs           r-   test_cluster_hierarchy_rp      sJ   
)


"
"C
Q!cii 4a88??5 @    
B Q"syy!5q99@@5 A    
B 		2r(A"""A"---11!44GH>V####6(RX2wC&9:::;;D#a&&=4r/   zcsr_container, metric)N	minkowskic                     g | ]}|d fS 	euclidean .0	containers     r-   
<listcomp>ry      s    VVV)i5VVVr/   c                 N   d}t          |          }t          ddd|           }|                    | ||          n|           t          t	          |j                            t          d|j        v           z
  }||k    sJ |j        j        t          |          fk    sJ |j        j        j	        dk    sJ |j
        j        t          |          fk    sJ |j
        j        j	        d	k    sJ |j        j        t          |          fk    sJ |j        j        j	        d	k    sJ |j        j        t          |          fk    sJ |j        j        j	        dk    sJ t	          |j                  t	          t          t          |                              k    sJ d S )
Nr   )
n_clustersg      >@r   r   )rH   rF   rD   metricr   if)r   r   rV   rn   setrW   intrl   dtypekindreachability_core_distances_	ordering_range)r|   csr_containerr{   rb   rd   n_clusters_1s         r-   test_correct_number_of_clustersr      s    J:666A 9!FKKKE	II-";mmACCCs5=))**Su}1D-E-EEL:%%%% =3q66)++++=#s****$Q	1111$)S0000 &3q66)3333 &+s2222? SVVI----? %,,,,u3uSVV}}#5#5555555r/   c                      d} ddgg}t          ddd          }t          j        t          |           5  |                    |           d d d            d S # 1 swxY w Y   d S )Nz#min_samples must be no greater thanr   g      ?r         ?)rH   rF   rG   match)r   pytestraises
ValueErrorrV   )msgrb   rd   s      r-   #test_minimum_number_of_sample_checkr      s    
/C QA9"sKKKE 
z	-	-	-  		!                 s   AAAc                     d} ddgddgddgg}t          d|dd          \  }}t          dd	d
d          }t          j        t          |           5  |                    |           d d d            d S # 1 swxY w Y   d S )Nz.Specify an epsilon smaller than 0.15. Got 0.3.r   r     rE   r   	n_samplescenterscluster_stdrB   g333333?dbscanr   r   rH   rI   epsrF   r   )r   r   r   r   r   rV   r   r   rb   labels_truerd   s        r-   test_bad_extractr      s    
:C1vBx!R)GwCa  NA{
 :hCUWXXXE	z	-	-	-  		!                 s   A55A9<A9c                     d} ddgddgddgg}t          d|dd          \  }}t          j        t          |           5  t	          d	d
d	          }|                    |           d d d            d S # 1 swxY w Y   d S )Nz6All reachability values are inf. Set a larger max_eps.r   r   r   rE   r   r   r   gQ?r   )rH   rF   r   )r   r   warnsUserWarningr   rV   r   s        r-   test_bad_reachabilityr      s    
BC1vBx!R)GwCa  NA{ 
k	-	-	-  {FFF		!                 s   (A44A8;A8c                  *   d} t           j                            ddt                    }t	          j                    5  t	          j        dt                     t          |           	                    |           d d d            d S # 1 swxY w Y   d S )Nrogerstanimotor   r   r   sizer   errorr|   )
r'   rP   randintboolwarningscatch_warningssimplefilterr	   r   rV   )pairwise_metricrb   s     r-   $test_nowarn_if_metric_bool_data_boolr      s    
 'O
	!&55A		 	"	" . .g'<===o&&&**1---. . . . . . . . . . . . . . . . . .s   >BBBc                  F   d} t           j                            ddt           j                  }d|  }t	          j        t          |          5 }t          |                               |           t          |          dk    sJ 	 d d d            d S # 1 swxY w Y   d S )	Nr   r   r   r   z-Data will be converted to boolean for metric r   r   r   )
r'   rP   r   int32r   r   r	   r   rV   rn   )r   rb   r   warn_records       r-   %test_warn_if_metric_bool_data_no_boolr      s     'O
	!&99A
K/
K
KC	+3	7	7	7 %;o&&&**1---;1$$$$$% % % % % % % % % % % % % % % % % %s   9BBBc                     d} t           j                            ddt                    }t           j                            ddt           j                  }t          j                    5  t          j        dt                     t          |           
                    |           t          |           
                    |           d d d            d S # 1 swxY w Y   d S )Nrq   r   r   r   r   r   )r'   rP   r   r   r   r   r   r   r	   r   rV   )r   X_boolX_nums      r-   test_nowarn_if_metric_no_boolr     s
    "OYqvT::FIafBH==E		 	"	" 2 2g'<=== 	o&&&**6222o&&&**51112 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2s   )A!CCCc                      ddgddgddgg} t          d| dd          \  }}t          ddd	d
                              |          }t          |j                  dk    sJ d S )Nr   r   r   rE   r   r   r   r   r   r   r   r   )r   r   rV   maxrW   )r   rb   r   rd   s       r-   test_close_extractr     s     1vBx!R)GwCa  NA{
 3xSbQQQUUVWXXEu}""""""r/   r   )r   r         ?rF   )r   r   rC   )Nrt   c                     g | ]}|d fS rs   ru   rv   s     r-   ry   ry   &  s    @@@I	;@@@r/   c           	         ddgddgddgg}t          d|dd          \  }}| ||          n|}|                    |d          }t          |d	| |
                              |          }t	          | |                              |          }	t          |	j        |j                  }
t          t          j	        t          j
        |
d                    t          j	        t          j
        |
d                              }|j        d         |z
  }t          j        |dz
  |j        d         z  d          }|dk    sJ d S )Nr   r      rE   r   r   Fr?   r   )rF   rI   r   r|   )r   rF   )axisr   rj   )r   rT   r   rV   r   r   rW   minr'   rm   r   rl   round)r   rF   r|   rY   r   r   rb   r   opdbcontingencyagreedisagreepercent_mismatchs                 r-   test_dbscan_optics_parityr   !  sa    1vBx!R)GwCa  NA{ *5a1A	E**A 
c&
 
 
	c!ff 
 
C[	1	1	1	5	5a	8	8B$RZ<<K
rvk***++RVBF;Q4O4O4O-P-P E wqzE!HxA ;Q?? t######r/   c                    ddgddgddgg}ddgddgddgg}ddgddgdd	gg}t          j        |||f                              | d
          }t           j        dgdz  dgdz  dgdz  f         }t	          dddd                              |          }t          |j        |           t           j        dgdz  dgdz  dgdz  f         }t	          dddd                              |          }t          |j        |           t           j        dgdz           }t          j	        t          d          5  t	          dddd                              |          }t          |j        |           d d d            d S # 1 swxY w Y   d S )Nr   r   rJ   r   rK   rL   r>   `   j   Fr?   r   r   r   r$   rD   rO   )rF   rH   rI   rD   r   zAll reachability valuesr   r   )r'   rS   rT   rU   r   rV   r   rW   r   r   r   )rY   r\   r]   r^   rb   rc   rd   s          r-   test_min_samples_edge_caser   G  s   a&1c(QI	&Br(RGb"X	&B*sBi#s	,B
	2r2,&&|%&@@AeQC!GaS1WqcAg56Oq!DTJJJNNqQQEu}o666eQC!GaS1WrdQh67Oq!DTJJJNNqQQEu}o666eRD1HoO	k)B	C	C	C ; ;1aNNNRRSTUU5=/:::; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;s   7<F  FFrG      c                    t           d d d                             |d          }t          d|                               |          }t	          j        |j        |j        dk                       }|j        rt          |          | k    sJ t          d| |j	        d         z            }|                    |           t          |j        |j                   d S )Nr   Fr?   rK   )rF   rG   r   r   )rb   rT   r   rV   r'   bincountrW   r   r   rl   r   )rG   rY   redXrd   cluster_sizes
clust_fracs         r-   test_min_cluster_sizer   \  s    SSqS6==E=22Dq3CDDDHHNNEKemr.A BCCM 6=!!%55555)DJqM9  J NN4u}j&899999r/   r   c                    t          t          t                    dz             }t          j        t
          d          5  |                    t                     d d d            n# 1 swxY w Y   t          t          t                    dz   d          }t          j        t
          d          5  |                     | t                               d d d            d S # 1 swxY w Y   d S )Nr   )rG   zmust be no greater than the r   rt   )rG   r|   )r   rn   rb   r   r   r   rV   )r   rd   s     r-   test_min_cluster_size_invalid2r   l  sJ   CFFQJ///E	z)G	H	H	H  		!               CFFQJ{CCCE	z)G	H	H	H $ $		--""###$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $s$   A((A,/A,4$C%%C),C)c                  0   dgdgdgdgg} t          dd                              |           }t          |j        t          j        dddg           t          |j        ddt          j        t          j        g           t          |j        g d           d S )	Nr   r   i   r      rF   rH   r8   )r   rV   r   r   r'   rX   r   r   )Yrd   s     r-   test_processing_orderr   w  s     rdSEB4 Aq"---11!44Eu*RVRR,@AAAu,r2rvrv.FGGGu55555r/   c                  d   g t           j        dddddddddddd	d	d
d
d
d	d	dddddddddddddddddddddddddddd dd!d"d#d$d%d%d%d%d&d&d&d'} g d(}g d)}t          d*+                              t                    }t          |j        t          j        |                     t          |j        |j                 t          j        |                     t          |j
        |j                 t          j        |                      |j        d,d          D ]+}|j
        |         |j        |j        |                  k    sJ ,g t           j        t           j        t           j        t           j        t           j        t           j        t           j        t           j        t           j        t           j        t           j        ddddddddddd-t           j        d.ddddd/dddt           j        d	d	d
d
d
d	d	dd0t           j        t           j        t           j        t           j        t           j        t           j        t           j        t           j        t           j        t           j        t           j        t           j        t           j        t           j        t           j        t           j        t           j        t           j        }g d1}g d2}t          d*d34                              t                    }t          |j        t          j        |                     t          |j        |j                 t          j        |                     t          |j
        |j                 t          j        |                     t          j        |j        d3k              d5         }	t          |j        |	         |j        |	                    d S )6Ng@z?gN	H?gއ~NT?gu?g浔E?g#r?gܞ2
@g`z?gP{
V?g:ד?g}~ a?g$@gа{n?g ?guL?g*?g$&?g{P?gx?g\x*x?g~)N{?geE,?goF?g>Ek?gPR?gBQ?gW?g@*?gr2\k?ghG?g[؜]N?g!L?g@gwc?@g;éfh@gK!Q@g,@M@gZv@gr/%A@)<r   r   r   r   r$   r0   r   rK   r   r             "   !   &   '   #   %   $   ,      r         r               rC   (   -   .   r   r   rL                        /   1   +   0   *   )   5   9   3   4   8   ;   6   7   :   rg   )<r   r   r   r   r   r   r0   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   rL   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r  r  r  r   )rF   r   g9'%?gΖF?gx?g*?)<r   r   r   r   r   r   r   r$   r0   rK   r   r   rL   r   r   r   r   r   r   r   r   r   rC   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   rg   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   rL   r   r   r   r   r   rC   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'   rX   r   rV   rb   r   r   r(   predecessor_r   r   r   where)
r1o1p1clust1r}   r2o2p2clust2indexs
             r-   test_compare_to_ELKIr    sH   
=

=
=
 	=
 		=

 	=
 	=
 	=
 	=
 	=
 	=
 	=
 	=
 	=
 	=
 	=
  	!=
" 	#=
$ 	%=
& 	'=
( 	)=
* 	+=
, 	-=
. 	/=
0 	1=
2 	3=
4 	5=
6 	7=
8 	9=
: 	;=
< 	==
> 	?=
@ 	A=
B 	C=
D 	E=
F 	G=
H 	I=
J 	K=
L 	M=
N 	O=
P 	Q=
R 	S=
T 	U=
V 	W=
X 	Y=
Z 	[=
\ 	]=
^ 	_=
` 	a=
b 	c=
d 	e=
f 	g=
h 	i=
j 	k=
l 	m=
n 	o=
p 	q=
r 	s=
t 	u=
v 	w=
x 	y=
B|=
 =
 =
B|=
 =
 =
BD """&&q))Fv'"666v*6+;<bhrllKKKF()9:BHRLLIII abb! Y Y#A&&*@ATUVAW*XXXXXX=

=

=
 	=
 		=

 	=
 	=
 	=
 	=
 	=
 	=
 	=
 	=
 	=
 	=
 	=
  	!=
" 	#=
$ 	%=
& 	'=
( 	)=
* 	+=
, 	-=
. 	/=
0 	1=
2 	3=
4 	5=
6 	7=
8 	9=
: 	;=
< 	==
> 	?=
@ 	A=
B 	C=
D 	E=
F 	G=
H 	I=
J 	K=
L 	M=
N 	O=
P 	Q=
R 	S=
T 	U=
V 	W=
X 	Y=
Z 	[=
\ 	]=
^ 	_=
` 	a=
b 	c=
d 	e=
f 	g=
h 	i=
j 	k=
l 	m=
n 	o=
p 	q=
r 	s=
t 	u=
v 	w=
x 	y=
B|=
 =
 =
B|=
 =
 =
B| 3///33A66Fv'"666v*6+;<bhrllKKKF()9:BHRLLIIIHV+s233A6EF*5163I%3PQQQQQr/   c                 P   t           j                            d          }d}ddgd|                    |d          z  z   }ddgd|                    |d          z  z   }d	dgd|                    |d          z  z   }dd
gd|                    |d          z  z   }t          j        ||||f                              | d          }t          dd                              |          }t          t          j	        t          j
        |j                            g d           d S )Nr   rC   r   r   r   r   r   r   r   r   Fr?   r   r   )rI   r   r8   )r'   rP   rQ   rR   rS   rT   r   rV   r   sortuniquerW   )	rY   rZ   r[   r\   r]   r^   r_   rb   rd   s	            r-   test_extract_dbscanr    s"    )


"
"C
bC#))$8!<<<	<B
R3#7;;;	;B
Q#		"6:::	:B
a3#7;;;	;B
	2r2r"##**<e*DDA(44488;;Erwry7788,,,GGGGGr/   c                    t           d d d                             | d          }t          |d          }| ||          n|}t          j                    5  t          j        dt                     t          ddd	
                              |          }d d d            n# 1 swxY w Y   t          ddd
                              |          }t          |j
        |j
                   t          |j        |j                   d S )Nr   Fr?   rt   r   ignorer   bruteprecomputed)rF   	algorithmr|   )rb   rT   r   r   r   r   r
   r   rV   r   r   r   rW   )rY   r   r   distsr  r  s         r-   test_precomputed_distsr  #  s?   SSqS6==E=22DtK888E$1$=MM%   5E		 	"	" 
 
h(9:::B'-PPPTT
 

 
 
 
 
 
 
 
 
 
 
 
 
 
 

 gkJJJNNtTTFF(&*>???v~v~66666s   A B%%B),B)c                    t           j                            d                              dd          }t          j        |d            | |          }t          d t          |                                 D                       sJ |                                }t          d          
                    |           |j        |j        k    sJ t          |                                |                                           dS )zCheck that we don't modify in-place the pre-computed sparse matrix.
    Non-regression test for:
    https://github.com/scikit-learn/scikit-learn/issues/27508
    r   r   c              3   (   K   | ]\  }}||k    V  d S r:   ru   )rw   rowcols      r-   	<genexpr>zKtest_optics_input_not_modified_precomputed_sparse_nodiag.<locals>.<genexpr>?  s*      <<hc3scz<<<<<<r/   r  r   N)r'   rP   rQ   randfill_diagonalallzipnonzeror@   r   rV   nnzr   toarray)r   rb   X_copys      r-   8test_optics_input_not_modified_precomputed_sparse_nodiagr-  3  s     		a  %%a++A QaA<<#qyy{{*;<<<<<<<<VVXXF
-   $$Q''' 5FJqyy{{FNN$4$455555r/   c                  B   t          j        g d                              dd          } g d}| |         }t          dd                              |           }t          dd                              |          }t          |j        |         |j                   dS )	a  Check that cluster correction using predecessor is working as expected.

    In the following example, the predecessor correction was not working properly
    since it was not using the right indices.

    This non-regression test check that reordering the data does not change the results.

    Non-regression test for:
    https://github.com/scikit-learn/scikit-learn/issues/26324
    )r   r   r   r   r0   r0   r$   r>   r   r   )r   r   r   r   r   r   r$   r   r   rt   )rF   r|   N)r'   r(   reshaper   rV   r   rW   )X_1reorderX_2optics_1optics_2s        r-   +test_optics_predecessor_correction_orderingr5  H  s     (---
.
.
6
6r1
=
=C&&&G
g,C!K888<<SAAH!K888<<SAAHx'0(2BCCCCCr/   )Er   numpyr'   r   sklearn.clusterr   r   sklearn.cluster._opticsr   r   sklearn.cluster.tests.commonr   sklearn.datasetsr   sklearn.exceptionsr	   r
   sklearn.metrics.clusterr   sklearn.metrics.pairwiser   sklearn.utilsr   sklearn.utils._testingr   r   sklearn.utils.fixesr   rP   rQ   rZ   r[   rR   r\   r]   r^   r_   r`   ra   rS   rb   markparametrizerX   r.   r4   r<   re   rp   r   r   r   r   r   r   r   r   r   r   r   rl   r   r   r   r  r  r  r-  r5  ru   r/   r-   <module>rC     s}         * * * * * * * * F F F F F F F F @ @ @ @ @ @ ' ' ' ' ' ' G G G G G G G G 6 6 6 6 6 6 7 7 7 7 7 7 ! ! ! ! ! ! F F F F F F F F . . . . . .iA "Xcii 4a8888WsSYY3Q7777WsSYY3Q7777!WsSYY3Q7777WsSYY3Q7777Va#))0!4444BIr2r2r2&'' 	#	#	#Q'	(	(	(!,
c3Q26	*A.
c3Q26	*A.	    
QS!Q26	*A.
QS#q!Q	/3
QQ	#
QRV	a 	    (	AA'6	AA'7	AAA/?	AAA/?	 ) ) )67 67 67r     $ VV~VVVV 6 6	 68
 
 
  	 	 	. . .% % %2 2 2 # # # 0044-.@@@@@A 
$ $  54 10$>; ; ;* +UU1agajB6F-K-KLL: : ML: .99$ $ :9$6 6 6OR OR ORdH H H 4&>*ABB7 7 CB7 .996 6 :96(D D D D Dr/   