
    ug                     h   U d dl Z d dlZd dlZd dlZd dlZd dlZd dlmZmZm	Z	m
Z
mZ 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mZmZ d dlmZ d d	lmZmZmZm Z  d d
l!m"Z" d dlm#Z# d dl$Z$d dl%m&Z& d dl'Z' e'jP                  e)      Z*dZ+dZ, e e$jZ                  d      d e&       dddddeed        e e$jZ                  d      d e&       dddddeed        e e$jZ                  d      d e&       dddddeed        e e$jZ                  d      d e&       d dd!ddeed       gZ.ee   e/d"<   d#ee"ddf   fd$Z0d#ee"ddf   fd%Z1d#ee"ddf   fd&Z2d#ee"ddf   fd'Z3d#ee	g ee"ddf   f      fd(Z4 ejj                  d) e4       *      d+e#d#ee"ddf   fd,       Z6 e$jn                         d-ejp                  ddddfd.e$jZ                  d/e9d0ed1e
e9ee9e:e;f   f   d#ef
d2Z<d3e"d#dfd4Z=d3e"d#dfd5Z>d3e"d#dfd6Z?d3e"d#dfd7Z@d3e"d#dfd8ZAd3e"d#dfd9ZBd3e"d#dfd:ZCd3e"d#dfd;ZD e e$jZ                  d<      d-ejp                  e.d    j                  ddddi =       e e$jZ                  d>      d?ejp                  e.d   j                  ddddi =      gZFd3e"d#dfd@ZGd3e"d#dfdAZHy)B    N)	GeneratorListCallableDictUnion)	GrpcSysDB)GrpcMockSysDB)NotFoundErrorUniqueConstraintErrorInternalError)find_free_port)
CollectionSegmentSegmentScope)SqliteDB)DEFAULT_DATABASEDEFAULT_TENANTSystemSettings)SysDB)FixtureRequest)CollectionConfigurationInternaldefault   )inttest_collection_1str1?test_strtest_int
test_float   )idnameconfigurationmetadata	dimensiondatabasetenantversion   test_collection_2str2gffffff@   test_collection_3str3gffffff
@   test_collection_4str4g@sample_collectionsreturnc               #      K   t        t        t        d                  } | j                          |  | j	                          yw)Fixture generator for sqlite DBT)allow_resetN)r   r   r   startstop)dbs    Q/var/www/openai/venv/lib/python3.12/site-packages/chromadb/test/db/test_system.pysqliter>   N   s<     	 	

B HHJ
HGGIs   AAc            	   #   &  K   t        j                         } t        t        t	        dd|                   }|j                          | |j                          t        j                  j                  |       rt        j                  |        yyw)r8   T)r9   is_persistentpersist_directoryN)tempfilemkdtempr   r   r   r:   r;   ospathexistsshutilrmtree)	save_pathr<   s     r=   sqlite_persistentrJ   \   sq       "I	 ""+	

B HHJ
HGGI	ww~~i i  !s   BBc               #     K   t               } t        t        d|             }|j                  t               |j                  t
              }|j                          |j                          | |j                          yw)zpFixture generator for sqlite DB that creates a mock grpc sysdb server
    and a grpc client that connects to it.Tr9   chroma_server_grpc_portN)	r   r   r   instancer	   r   r:   reset_and_wait_for_readyr;   )portsystemclients      r=   grpc_with_mock_serverrS   o   sg      D$(	
F OOM"__Y'F
LLN
##%
L
KKMs   B Bc               #     K   t         j                  d       t        t        dd            } | j	                  t
              }t         j                  d       | j                          t         j                  d       |j                          t         j                  d       | t         j                  d       | j                          y w)	Nz Setting up grpc_with_real_serverTi  rL   zStarting systemz&Resetting client and waiting for readyz$grpc_with_real_server setup completez(Stopping system in grpc_with_real_server)	loggerdebugr   r   rN   r   r:   rO   r;   )rQ   rR   s     r=   grpc_with_real_serverrW      s     
LL34$)	
F __Y'F
LL"#
LLN
LL9:
##%
LL78
L
LL;<
KKMs   C
Cc                  V    dt         j                  v rt        gS t        t        t
        gS )NCHROMA_CLUSTER_TEST_ONLY)rD   environrW   r>   rJ   rS        r=   db_fixturesr]      s&    !RZZ/%&&)+@AAr\   module)scopeparamsrequestc              #      K   t         j                  d| j                  j                          t	        | j                                t         j                  d       y w)NzSetting up sysdb fixture with zTearing down sysdb fixture)rU   rV   param__name__next)ra   s    r=   sysdbrf      sC     
LL1'--2H2H1IJK
w}}

LL-.s   AA test_type_acollection_idsegment_typer_   r'   c                 H    t        t        j                         ||| |i       S )Nr$   typer_   
collectionr'   
file_paths)r   uuiduuid4)rh   ri   r_   r'   s       r=   sample_segmentrq      s)     ::<  r\   rf   c           
      	   t         j                  d       | j                          g }t        D ]  }t         j                  d|j                          t        |j                  t        j                        t        |j                  t        j                        t        |j                  t        j                        g}|j                  |       | j                  |j                  |j                  |j                         ||d   |d          t        |d<   t        |d<    t         j                  d	       | j!                         }t#        |d
       }t#        |d       t        k(  sJ t%        j&                  t(              5  | j                  t        d   j                  t        d   j                  t        d   j                         |d   g       d d d        t        D ]  }| j!                  |d         }||gk(  rJ  t        D ]  }| j!                  |d         }||gk(  rJ  t        D ]U  }| j+                  |j                        }|d   |k(  sJ t-        |d   D cg c]  }|d   |j                  k(   c}      rUJ  t        d   }| j/                  |j                         | j!                         }||vsJ t1        |      t1        t              dz
  k(  sJ t#        |d       t        dd  k(  sJ | j!                  |d         }	|	g k(  sJ | j3                  |j                        }
|
g k(  sJ t%        j&                  t4              5  | j/                  |j                         d d d        t%        j&                  t6        t(        t8        j:                  f      5  | j                  t        d   j                  t        d   j                  t        d   j                         |d   |d   g       d d d        | j!                  t        d   j                        }	|	g k(  sJ | j3                  t        d   j                        }
|
g k(  sJ y # 1 sw Y   xY wc c}w # 1 sw Y   xY w# 1 sw Y   |xY w)NzResetting statezCreating collection: )rh   r_   r'   r(   r$   r%   r&   segmentsr'   r(   r)   r*   zGetting all collectionsc                     | j                   S Nr%   cs    r=   <lambda>z4test_create_get_delete_collections.<locals>.<lambda>   s    AFFr\   keyc                     | j                   S rv   rw   rx   s    r=   rz   z4test_create_get_delete_collections.<locals>.<lambda>       r\   r   )r%   r$   r&   rt   r%   rw   r$   r$   rm   rt   r   c                     | j                   S rv   rw   rx   s    r=   rz   z4test_create_get_delete_collections.<locals>.<lambda>   r~   r\   rm   )rU   rV   reset_stater5   r%   rq   r$   r   METADATARECORDVECTORextendcreate_collectionget_configurationr   r   get_collectionssortedpytestraisesr   get_collection_with_segmentsalldelete_collectionlenget_segmentsr
   r   sqlite3IntegrityError)rf    segments_created_with_collectionrm   rt   resultsresultcollection_with_segments_resultsegmentc1by_id_resultby_collection_results              r=   "test_create_get_delete_collectionsr      s<   
LL"#	')$(
,Z__,=>?l>S>STl>Q>QRl>Q>QR

 	)//9}}$668
+ - 	  	
 "2
:-
8# )& LL*+##%GW"23G'/04FFFF 
,	-#A&++!!$'',Q/AAC6q9:	 	  	
 
. )
&&Jv,>&?*%%% )
 )
&&*T*:&;*%%% )
 )
*/*L*LZ]]*['.|<
JJJJijtJuvJuwGL)Z]]:Juvwww ) 
A	B	ruu%##%GWw<312Q6666'/04Fqr4JJJJ((BtH(5L2 !---?2%%% 
}	%& 
& 
'<g>T>TU	V#A&++!!$'',Q/AAC6q9;[\];^_	 	  	
 
W ((,>q,A,D,D(EL2 --9KA9N9Q9Q-R2%%%{ 
.	-, w& 
&	% 
W	Vs,   AQ +Q-
Q2.AQ> Q*2Q;>Rc                 "   t        t        d   j                  t        d   j                  t        d   j	                         t        d   d   t        d   d   t
        t        d      }| j                          | j                  |j                  |j                  |j	                         t        t        j                         dt        j                  |j                  dddd	i 
      g|d   |d          d|d<   | j                  |j                  |j                         | j                  |j                        }||gk(  sJ d|d<   | j                  |j                  |j                          | j                  |d         }||gk(  sJ ddi|d<   | j                  |j                  |d          | j                  |d         }||gk(  sJ d |d<   | j                  |j                  d        | j                  |d         }||gk(  sJ y )Nr   r'   r(   )r%   r$   r&   r'   r(   r)   r*   r+   rg   r   r   r   r   rk   rs   new_namer%   rw   r#   )r(   r$   r   	test_str2r.   r'   )r   r5   r%   r$   r   r   r   r   r   r   ro   rp   r   r   update_collectionr   r(   )rf   collr   s      r=   test_update_collectionsr     s   "''a ##(+==?#A&z2$Q'4!	D 
	77YY,,.::<""))77&,!3O	
 j!{#  & DL	DGG$))4""		"2FdV D	DGGt~~>""d4j"1FdV $V,D	DGGd:.>?""d4j"1FdV D	DGGd3""d4j"1FdVr\   c                 D	   | j                          t        d   }| j                  |j                  |j                  |j                         t        t        j                         dt        j                  |j                  ddddi       g|d   |d	   
       | j                  |j                  t        j                         |j                         dt        t        j                         dt        j                  t        d   j                  ddddi       g|d         \  }}||k(  sJ | j                  |d         }||gk(  sJ | j                  t        d   j                  t        d   j                  t        d   j                         t        t        j                         dt        j                  t        d   j                  ddddi       gdt        d   d         \  }}|t        d   k(  sJ | j                  t        d   j                  t        d   j                  t        d   j                         t        t        j                         dt        j                  t        d   j                  ddddi       gdt        d   d         \  }}|t        d   k(  sJ t        j                  t              5  | j                  t        d   j                  t        d   j                  t        d   j                         dt        t        j                         dt        j                  t        d   j                  ddddi       g|d          d d d        ddd}| j                  t        d   j                  t        d   j                  t        d   j                         t        t        j                         dt        j                  t        d   j                  ddddi       gd|      \  }}|d   |k7  sJ |d   t        d   d   k(  sJ | j                  t        d   j                  t        d   j                  t        d   j                         t        t        d   j                        gdd       \  }}|d   t        d   d   k(  sJ y # 1 sw Y   DxY w)Nr   rg   r   r   r   r   rk   r'   r(   rs   T)r%   r$   r&   get_or_creatert   r'   r%   rw   )r%   r$   r&   rt   r   r'   r,   Fnew_str)test_new_strr!   )r   r5   r   r$   r%   r   r   ro   rp   r   r   r   r   r   r   rq   )rf   rm   r   created
get_resultoverlayed_metadatas         r=   test_get_or_create_collectionr   M  s   	 $A&J	==__ 224::<""))%==&,!3O	
 J'[)  ( --__::< 224::<""))-a033&,!3O	
 J' . OFG" Z &&Jv,>&?J*%%% --"''a ##(+==?::<""))-a033&,!3O	
 #A&z2 . OFG" '**** --"''a ##(+==?::<""))-a033&,!3O	
 #A&z2 . OFG" '**** 
,	-#A&++!!$'',Q/AACzz|&&--1!477*0asS!	  
+ 	  	
 
.* "=
 --"''a ##(+==?::<""))-a033&,!3O	
 # . OFG$ *!3333*!3A!6z!BBBB --"''a ##(+==? !3A!6!9!9:; . OFG *!3A!6z!BBBBo 
.	-s   <BRRc                    | j                          | j                  t        d   j                  d      }t	        |      dk(  sJ | j                  t        j                         d       | j                  t        d   j                  t        d   j                  t        d   j                         t        t        d   j                        gt        d   d   t        d   d   d       t        j                  t              5  | j                  t        d   j                  d	t        d   j                         t        d   d   t        d   d   t        t        d   j                        gdd
       d d d        | j                  t        d   j                  t        d   j                  t        d   j                         t        d   d   t        d   d   t        t        d   j                        g       | j                  t        d   d   d      }t	        |      dk(  sJ dt        d   d<   |d   t        d   k(  sJ | j                  t        d   d         }t	        |      dk(  sJ |d   t        d   k(  sJ t	        | j                  t        d   d   d            dk(  sJ | j                  t        d   j                  d       | j                  d      }t	        |      dk(  sJ | j                  t        d   j                        }t	        |      dk(  sJ |d   t        d   k(  sJ t        j                  t               5  | j                  t        d   j                         d d d        t        j                  t               5  | j                  t        d   j                  d       d d d        y # 1 sw Y   OxY w# 1 sw Y   ]xY w# 1 sw Y   y xY w)Nr   new_databaser$   r)   r   r$   r%   r'   r(   r$   r%   r&   rt   r'   r(   r)   r   F)r$   r%   r&   r'   r(   rt   r)   r   )r$   r%   r&   r'   r(   rt   r%   )r%   r)   r)   rw   fake_dbr)   r   )r   r   r5   r$   r   create_databasero   rp   r   r%   r   rq   r   r   r   r   r
   rf   r   s     r=   .test_create_get_delete_database_and_collectionr     s   	""&8&;&>&>"XFv;! 
TZZ\? 
a ##"''(+==? !3A!6!9!9:;#A&z2$Q'4   
,	-!!$'',Q/AAC'*:6(+K8$%7%:%=%=>?# 	  		
 
. 
a ##"''(+==?#A&z2$Q'4 !3A!6!9!9:;   """6*^ # F v;!(6q*%!9*1---- ""(:1(=f(E"FFv;!!9*1---- 	!!'*62Y " 	

 		 
1!477.Q ""N";Fv;! ""(:1(=(B(B"CFv;!!9*1---- 
}	%#5a#8#;#;< 
& 
}	%#5a#8#;#;nU 
&	%} 
.	-t 
&	% 
&	%s%   A/N=
$O
%O=O
OOc           
      2   | j                          | j                  t        j                         d       | j	                  t
        d   j                  t
        d   j                  t
        d   j                         t        t
        d   j                        gt
        d   d   t
        d   d   d       | j	                  t
        d   j                  t
        d   j                  t
        d   j                         t        t
        d   j                        gt
        d   d   t
        d   d          | j                  t
        d   j                  d	       | j                  t
        d   d
         }t        |      dk(  sJ |d   d   d	k(  sJ | j                  t
        d   j                  d       | j                  t
        d   d
   d      }t        |      dk(  sJ |d   d   dk(  sJ t        j                  t              5  | j	                  t
        d   j                  t
        d   j                  t
        d   j                         t        t
        d   j                        gt
        d   d   t
        d   d   d       d d d        y # 1 sw Y   y xY w)Nr   r   r   r'   r(   r   r   rs   
new_name_1r$   r   r%   
new_name_0r   )r   r   ro   rp   r   r5   r$   r%   r   rq   r   r   r   r   r   r   r   s     r=    test_create_update_with_databaser   8  s   	 
TZZ\? 
a ##"''(+==? !3A!6!9!9:;#A&z2$Q'4   
a ##"''(+==? !3A!6!9!9:;#A&z2$Q'4   
a ##   ""&8&;D&A"BFv;!!9V,,, 
a ##   ""a & # F v;!!9V,,, 
,	-!!$''#A&++,Q/AAC$%7%:%=%=>?'*:6(+K8# 	  	
 
.	-	-s   A?JJc           
         | j                          | j                  t        j                         d       t        D ][  }| j                  |j                  |j                  |j                         t        |j                        g|d   |d   d       d|d<   ] | j                  d      }t        |      t        t              k(  sJ t        |d 	      t        k(  sJ | j                         }t        |      d
k(  sJ y )Nr   r   r'   r(   r   r)   r   c                     | j                   S rv   rw   rx   s    r=   rz   z1test_get_multiple_with_database.<locals>.<lambda>  s    r\   r{   r   )r   r   ro   rp   r5   r   r$   r%   r   rq   r   r   r   )rf   rm   r   s      r=   test_get_multiple_with_databaser   x  s    	 
TZZ\? )
}}$668$Z]]34
+ -# 	  	
 "0
: ) ""N";Fv;#01111&./3EEEE ""$Fv;!r\   c                    | j                          | j                  d       t        j                  t              5  | j                  d       d d d        t        j                  t              5  | j                  t
               d d d        | j                  t        j                         dd       | j                  t        j                         d       | j                  t        d   j                  t        d   j                  t        d   j                         t        t        d   j                        gt        d   d   t        d   d   dd	       dt        d   d
<   dt        d   d<   | j                  t        d   j                  t        d   j                  t        d   j                         t        t        d   j                        gt        d   d   t        d   d   d       dt        d   d<   | j                  dd      }t!        |      dk(  sJ |d   t        d   k(  sJ | j                  d      }t!        |      dk(  sJ |d   t        d   k(  sJ t        j                  t              5  | j                  t        d   j                  t        d   j                  t        d   j                         t        t        d   j                        gt        d   d   t        d   d   d       d d d        t        j                  t              5  | j                  t        d   j                  t        d   j                  t        d   j                         t        t        d   j                        gt        d   d   t        d   d   dd	       d d d        | j                  t"        d      }t!        |      dk(  sJ y # 1 sw Y   ~xY w# 1 sw Y   SxY w# 1 sw Y   xY w# 1 sw Y   WxY w)Ntenant1rw   r   r$   r%   r*   r   r   r'   r(   )r$   r%   r&   rt   r'   r(   r)   r*   r*   r)   r   r   )r)   r*   r   )r   create_tenantr   r   r   r   r   ro   rp   r   r5   r$   r%   r   rq   r   r   r   r   s     r=   !test_create_database_with_tenantsr     s   	 
Y' 
,	-+ 
. 
,	-0 
. 
TZZ\yQ	TZZ\? 
a ##"''(+==? !3A!6!9!9:;#A&z2$Q'4  	 '0q(#(6q*% 
a ##"''(+==? !3A!6!9!9:;#A&z2$Q'4   )7q*% ""N9"MFv;!!9*1----""N";Fv;!!9*1---- 
,	-!!$''#A&++,Q/AAC$%7%:%=%=>?'*:6(+K8# 	  	
 
. 
,	-!!$''#A&++,Q/AAC$%7%:%=%=>?'*:6(+K8# 	  		
 
. "",<Y"OFv;!U 
.	- 
.	-Z 
.	- 
.	-s1   O0O;A?O%B O1OO"%O.1O:c                    | j                          | j                  d       | j                  d      }|d   dk(  sJ t        j                  t
              5  | j                  d       d d d        | j                  t        j                         dd       | j                  dd      }|d   dk(  sJ |d   dk(  sJ t        j                  t
              5  | j                  d	d       d d d        t        j                  t
              5  | j                  d	d       d d d        y # 1 sw Y   xY w# 1 sw Y   KxY w# 1 sw Y   y xY w)
Nr   rw   r%   tenant2r   r   )r%   r*   r*   new_database1)
r   r   
get_tenantr   r   r
   r   ro   rp   get_databaser   s     r=   test_get_database_with_tenantsr     s/   	 
Y' 9-F&>Y&&& 
}	%i( 
& 
TZZ\yQ ^IFF&>^+++(y((( 
}	%	B 
&
 
}	%	B 
&	%# 
&	% 
&	%
 
&	%s$   D+D7E+D47E Ez$00000000-d7d7-413b-92e1-731098a6e492rk   z$11111111-d7d7-413b-92e1-731098a6e492test_type_bc           
         | j                          g }d}t        D ]z  }| }t        |j                  |rdnd      }|j	                  |       | j                  |j                  |j                  |j                         |g|d   |d         \  }}|du rzJ  g }t        D ]-  }|j                  | j                  |j                  	             / t        |d
       }t        |d       }||k(  sJ t        j                  t              5  | j                  |d          d d d        |D ]#  }| j                  |d   |d         }	|	|gk(  r#J  | j                  dt        d   j                        }	t        |	      dk(  sJ |	d   d   t        d   j                  k(  sJ |	d   |d   k(  sJ | j                  dt        d   j                        }	t        |	      dk(  sJ |	d   |d   k(  sJ | j                  t        d   j                  	      }	t        |	      dk(  sJ |	d   |d   k(  sJ | j                  dt        d   j                        }	t        |	      dk(  sJ |	d   |d   k(  sJ | j                  dt        d   j                        }	t        |	      dk(  sJ |d   }
| j!                  |
d   |
d          y # 1 sw Y   xY w)NFrg   r   )rh   ri   r'   r(   rs   Tr   c                     | d   S Nr$   r[   rx   s    r=   rz   z1test_create_get_delete_segments.<locals>.<lambda><  s    AdGr\   r{   c                     | d   S r   r[   rx   s    r=   rz   z1test_create_get_delete_segments.<locals>.<lambda>=  s    QtWr\   r   r$   rm   r$   rm   )rl   rm   r   )r   r5   rq   r$   appendr   r%   r   r   r   r   r   r   r   create_segmentr   delete_segment)rf   r   toggle_typerm   r   collection_resultr   r   sorted_segmentsr   s1s              r=   test_create_get_delete_segmentsr     s#   	 (*$K )
%o $--*5=
 	)//8%*%<%<}}$668Y
+ - &= &
"7 $ )"  G(
u))Z]])CD )W"34G=CTUOo%%% 
,	-=a@A 
. 4##wt}AV#W'""" 4
 ]?QRS?T?W?WXFv;!!9\"&8&;&>&>>>>!98;;;;]?QRS?T?W?WXFv;!!98;;;; +=a+@+C+CDFv;!!98;;;; ]?QRS?T?W?WXFv;!!98;;;; ]?QRS?T?W?WXFv;!
 
*!	,B	L)2d84I 
.	-s   KKc           
         dddd}t        t        j                         dt        j                  t
        d   j                  |i       }| j                          t
        D ]U  }| j                  |j                  |j                  |j                         t        |j                        g|d   |d	   
       W | j                  |       | j                  |d   |d         }|d   |d   d<   ||gk(  sJ | j                  |d   |d         }|d   |d   d<   ||gk(  sJ d|d<   | j                  |d   |d   ddi       | j                  |d   |d         }|d   |d   d<   ||gk(  sJ d|d<   | j                  |d   |d   ddi       | j                  |d   |d         }|d   |d   d<   ||gk(  sJ |d= | j                  |d   |d   dd i       | j                  |d   |d         }|d   |d   d<   ||gk(  sJ d |d<   | j                  |d   |d   d        | j                  |d   |d         }|d   |d   d<   ||gk(  sJ y )Nr   r   r   r   rg   r   rk   r'   r(   rs   r$   rm   r   r.   r   r   r1   r    )r   ro   rp   r   r   r5   r$   r   r   r%   r   rq   r   r   update_segment)rf   r'   r   ry   r   s        r=   test_update_segmentr   g  s   3H
 ::<!!%a(++G 
tt--/$QTT*+z]n 	  	
   
! 74=W\=RSF%l3F1IlgY74=W\=RSF%l3F1IlgY #H[	wt}V7L   74=W\=RSF%l3F1IlgY "HZ	wt}
F7K   74=W\=RSF%l3F1IlgY 		wt}
D7I   74=W\=RSF%l3F1IlgY GJ	.M74=W\=RSF%l3F1IlgYr\   )IrD   	functoolsrG   rB   r   r   typingr   r   r   r   r   chromadb.db.impl.grpc.clientr   chromadb.db.impl.grpc.serverr	   chromadb.errorsr
   r   r   chromadb.test.conftestr   chromadb.typesr   r   r   chromadb.db.impl.sqliter   chromadb.configr   r   r   r   chromadb.db.systemr   r   ro   chromadb.api.configurationr   logging	getLoggerrd   rU   TENANT	NAMESPACEUUIDr5   __annotations__r>   rJ   rS   rW   r]   fixturerf   rp   r   strr   floatrq   r   r   r   r   r   r   r   r   r$   sample_segmentsr   r   r[   r\   r=   <module>r      s   	      9 9 2 6 O O 1 < < ,  % !  F 			8	$		
 499 57$!3G!	 499 57$!3G!	 499 57$!3G!	 499 57$!3G!	?)( D$ )X	%t+, !9UD$%67 !&yd):; &yd):; &BT(2yd1B'C#CDE B h{}5/> /itT0A&B / 6/
 /9djjl'4)5)<)<#)#$%(B$)) !$& "#uS#u_'="=> &\&e \& \&~65 6T 6rQC QC4 QChUV% UVD UVn=
E =
d =
@5 T 8QU Qt QhC% CD CH 499;<!!%a(++$!3G 499;<!!%a(++$!3G(F55 F5T F5PFu F Fr\   