
    Zig              	          d dl mZmZmZmZmZmZmZ d dlm	Z	 d dl
Z
d dlZd dlmZ d dlmc mZ d dlmc mZ d dlmZ d dlmZmZmZ d dlmZmZmZm Z m!Z! d dl"m#Z#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/m0Z0m1Z1m2Z2m3Z3m4Z4  G d
 de          Z5 G d de          Z6de2de-dej2        fdZ7dej2        deee-f         fdZ8dej*        de*fdZ9dej1        dee)         fdZ:dej1        dee1         fdZ;dej1        de<deee1e)f                  fdZ=de1dej1        fdZ>dej+        de0de(fdZ?dej.        de.fdZ@de.dej.        fd ZAd!ej/        de/fd"ZBd!e/dej/        fd#ZCd$eeDeEeFe<df         dejG        fd%ZHd&ej'        de'fd'ZId&e'dej'        fd(ZJde*dej*        fd)ZKd*e+dej+        fd+ZLd,ej3        de3fd-ZMd,e3de-dej3        fd.ZNd/ej4        de4fd0ZOd1ej,        de,fd2ZPd1e,dej,        fd3ZQd4edej        fd5ZRd6edej        fd7ZSd8e!dejT        fd9ZUd:edejV        fd;ZWd<edejX        fd=ZYd>edejZ        fd?Z[d@e dej\        fdAZ]d@e dej^        fdBZ_dCe#dej#        fdDZ`dEeja        deEfdFZbdGe$dej$        fdHZcdIej5        de5fdJZddEeje        dee5         fdKZfd<e%dej%        fdLZgdIej6        de6fdMZhdNeji        deee6                  fdOZjdS )P    )DictOptionalSequenceTuple	TypedDictUnioncast)UUIDN)NDArray)$collection_configuration_to_json_str)	EmbeddingWhereWhereDocument)KNNFilterLimit
ProjectionScan)	CountPlanGetPlanKNNPlan)
Collection	LogRecordMetadata	OperationOperationRecordRequestVersionContextScalarEncodingSegmentSegmentScopeSeqIdUpdateMetadataVectorVectorEmbeddingRecordVectorQueryResultc                   \    e Zd ZU eed<   ee         ed<   ee         ed<   ee         ed<   dS )ProjectionRecordiddocument	embeddingmetadataN)__name__
__module____qualname__str__annotations__r   r#   r        S/root/projects/butler/venv/lib64/python3.11/site-packages/chromadb/proto/convert.pyr'   r'   (   sM         GGGsmx      r2   r'   c                   0    e Zd ZU eed<   ee         ed<   dS )KNNProjectionRecordrecorddistanceN)r,   r-   r.   r'   r0   r   floatr1   r2   r3   r5   r5   /   s.         uor2   r5   vectorencodingreturnc                    |t           j        k    rDt          j        | t          j                                                  }t          j         j        }n|t           j        k    rDt          j        | t          j                                                  }t          j         j        }n,t          d| dt           j         dt           j                   t          j
        | j        ||          S )NdtypeUnknown encoding , expected one of z             or )	dimensionr9   r:   )r   FLOAT32nparrayfloat32tobytes	chroma_pbINT32int32
ValueErrorr#   size)r9   r:   as_bytesproto_encodings       r3   to_proto_vectorrN   5   s    >)))8F"*555==??"19	^)	)	)8F"(333;;=="17' ' 'N<R ' '$' '
 
 	

 +h   r2   c                    | j         }|t          j        j        k    r2t	          j        | j        t          j                  }t          j        }n}|t          j        j        k    r2t	          j        | j        t          j	                  }t          j        }n6t          d| dt          j        j         dt          j        j                   ||fS )Nr=   r?   z, expected one of             z or )r:   rG   r   rB   rC   
frombufferr9   rE   rH   rI   rJ   )r9   r:   as_arrayout_encodings       r3   from_proto_vectorrS   G   s    H9+333=bjAAA%-	Y-3	3	3=bh???%+T T T%-T T3<3K3QT T
 
 	

 l##r2   	operationc                 .   | t           j        j        k    rt          j        S | t           j        j        k    rt          j        S | t           j        j        k    rt          j        S | t           j        j        k    rt          j        S t          d|            )NUnknown operation )rG   r   ADDUPDATEUPSERTDELETERuntimeErrorrT   s    r3   from_proto_operationr]   Y   s    I'+++}	i)0	0	0	i)0	0	0	i)0	0	0 ;	;;<<<r2   r+   c                 ^    t          t          t                   t          | d                    S )NF)r	   r   r    _from_proto_metadata_handle_noner+   s    r3   from_proto_metadatara   g   s"    "$DXu$U$UVVVr2   c                 ^    t          t          t                   t          | d                    S )NT)r	   r   r"   r_   r`   s    r3   from_proto_update_metadatarc   k   s+      "B8T"R"R  r2   	is_updatec                    | j         sd S i }| j                                         D ]\  }}|                    d          r|j        ||<   %|                    d          r|j        ||<   E|                    d          r|j        ||<   e|                    d          r|j        ||<   |rd ||<   t          d| d          |S )N
bool_valuestring_value	int_valuefloat_valuezMetadata key z value cannot be None)r+   itemsHasFieldrf   rg   rh   ri   rJ   )r+   rd   out_metadatakeyvalues        r3   r_   r_   s   s     tBDL'--// I I
U>>,'' 	I % 0L^^N++ 		I % 2L^^K(( 	I %L^^M** 	I % 1L 	I $LGSGGGHHHr2   c                 d    t          j        d |                                 D                       S )Nc                 4    i | ]\  }}|t          |          S r1   )to_proto_metadata_update_value).0kvs      r3   
<dictcomp>z,to_proto_update_metadata.<locals>.<dictcomp>   s'    TTT41a!3A66TTTr2   r`   )rG   r"   rj   r`   s    r3   to_proto_update_metadatarv      s7    #TT8>>CSCSTTT   r2   operation_recordseq_idc                     t          | j                  \  }}t          |t          | j        ||t          | j                  t          | j                                      }|S )N)r(   r*   r:   r+   rT   )
log_offsetr6   )	rS   r9   r   r   r(   rc   r+   r]   rT   )rw   rx   r*   r:   r6   s        r3   from_proto_submitr{      st     ,,<,CDDIx"/0@0IJJ*+;+EFF
 
 
	 	 	F Mr2   segmentc           
      :   t          t          | j                  | j        t	          | j                  t          | j                  |                     d          rt          | j	                  nd d | j
                                        D                       S )Nhexr+   c                 8    i | ]\  }}|d  |j         D             S )c                     g | ]}|S r1   r1   )rr   paths     r3   
<listcomp>z1from_proto_segment.<locals>.<dictcomp>.<listcomp>   s    000D4000r2   pathsrr   namer   s      r3   ru   z&from_proto_segment.<locals>.<dictcomp>   s?     
 
 
e 00EK000
 
 
r2   r(   typescope
collectionr+   
file_paths)r   r
   r(   r   from_proto_segment_scoper   r   rk   ra   r+   r   rj   r|   s    r3   from_proto_segmentr      s    GJ\&w}55G.///J''$W%5666
 
&17799
 
 
   r2   c           
         t          j        | d         j        | d         t          | d                   | d         j        | d         d nt	          | d                   d | d                                         D                       S )	Nr(   r   r   r   r+   c                 @    i | ]\  }}|t          j        |           S )r   )rG   	FilePathsr   s      r3   ru   z$to_proto_segment.<locals>.<dictcomp>   s<     
 
 
e )%E222
 
 
r2   r   r   )rG   r   r   to_proto_segment_scoperv   rj   r   s    r3   to_proto_segmentr      s    4=V_$WW%566<(,:& %gj&9::
 
&|4::<<
 
 
   r2   segment_scopec                     | t           j        j        k    rt          j        S | t           j        j        k    rt          j        S | t           j        j        k    rt          j        S t          d|            NzUnknown segment scope )rG   r    VECTORMETADATARECORDr[   r   s    r3   r   r      sg    	.555""	)09	9	9$$	)07	7	7""CMCCDDDr2   c                     | t           j        k    rt          j         j        S | t           j        k    rt          j         j        S | t           j        k    rt          j         j        S t          d|            r   )r    r   rG   r   r   r[   r   s    r3   r   r      sg    +++%,,	,/	/	/%..	,-	-	-%,,CMCCDDDr2   rn   c                    t          | t                    rt          j        |           S t          | t                    rt          j        |           S t          | t
                    rt          j        |           S t          | t                    rt          j        |           S | t          j                    S t          dt          |            d          )N)rf   )rg   )rh   )ri   zUnknown metadata value type z6, expected one of str, int,             float, or None)	
isinstanceboolrG   UpdateMetadataValuer/   intr8   rJ   r   )rn   s    r3   rq   rq      s     % 
,>>>>	E3		 
,%@@@@	E3		 
,u====	E5	!	! 	
,????	,...4;;   
 
 	
r2   r   c                 P   t          t          | j                  | j        t	          j        | j                  |                     d          rt          | j	                  nd |                     d          r| j
        r| j
        nd | j        | j        | j        | j        	  	        S )Nr~   r+   rA   )	r(   r   configuration_jsonr+   rA   databasetenantversionlog_position)r   r
   r(   r   jsonloadsconfiguration_json_strrk   ra   r+   rA   r   r   r   r   r   s    r3   from_proto_collectionr      s    JM"""_:j&GHHz**$Z%8999{++0:0D*&&$ ",   r2   c                    t          j        | d         j        | d         t          |                                           | d         d nt          | d                   | d         | d         | d         | d         | d         		  	        S )
Nr(   r   r+   rA   r   r   r   r   )	r(   r   r   r+   rA   r   r   r   r   )rG   r   r   r   get_configurationrv   r   s    r3   to_proto_collectionr      s    dC((** 
  
 j!) %j&<==[)(#J'/9%   r2   c                    | t           j        k    rt          j         j        S | t           j        k    rt          j         j        S | t           j        k    rt          j         j        S | t           j        k    rt          j         j        S t          d|  dt           j         dt           j         dt           j         dt           j         
          )NrV   r@   z,             z, z, or )r   rW   rG   rX   rY   rZ   rJ   r\   s    r3   to_proto_operationr     s    IM!!"&&	i&	&	&"))	i&	&	&"))	i&	&	&"))K K Kim K KK K!*!1K K8A8HK K
 
 	
r2   submit_recordc           	          d }| d         $| d         t          | d         | d                   }d }| d         t          | d                   }t          j        | d         ||t	          | d                             S )Nr*   r:   r+   r(   rT   )r(   r9   r+   rT   )rN   rv   rG   r   r   )r   r9   r+   s      r3   to_proto_submitr   "  s     F[!--
2K2W {!;]:=VWWHZ ,+M*,EFF$$];%?@@	   r2   embedding_recordc                 ^    t          | j        t          | j                  d                   S )Nr   )r(   r*   )r$   r(   rS   r9   )r   s    r3   "from_proto_vector_embedding_recordr   5  s5     !#$4$;<<Q?   r2   c                 b    t          j        | d         t          | d         |                    S )Nr(   r*   )r(   r9   )rG   r$   rN   )r   r:   s     r3    to_proto_vector_embedding_recordr   >  s9     *D!/<hGG   r2   vector_query_resultc                 j    t          | j        | j        t          | j                  d                   S )Nr   )r(   r7   r*   )r%   r(   r7   rS   r9   )r   s    r3   from_proto_vector_query_resultr   H  s;     !$-#$7$>??B   r2   request_version_contextc                 8    t          | j        | j                  S )Ncollection_versionr   )r   r   r   r   s    r3   "from_proto_request_version_contextr   R  s'     !2E,9   r2   c                 F    t          j        | d         | d                   S )Nr   r   r   )rG   r   r   s    r3    to_proto_request_version_contextr   [  s/     *23GH,^<   r2   wherec                    t          j                    }t          |           dk    rt          d|            |                                 D ]\  }}t          |t                    st          d|           |dk    s|dk    rt          |t                    st          d|           t          j        d |D                       }|dk    rt           j	        j
        |_        nt           j	        j        |_        |j                            |           |c S t          j                    }||_        t          |t"                    st%          |          t          u rLt          j                    }||_        t           j        j        |_        |j                            |           n$t%          |          t2          u rLt          j                    }||_        t           j        j        |_        |j                            |           nt%          |          t8          u rLt          j                    }||_        t           j        j        |_        |j                            |           n`t%          |          t@          u rLt          j!                    }	||	_        t           j        j        |	_        |j"                            |	           nt          d	|           |                                D ]\  }
|
d
v rlt          t                    st          d|           t                    dk    stG          fdD                       st          d           d }|
dk    rt           j$        j%        }nt           j$        j&        }t%          d                   t          u rVt          j'                    }D ]}|j(        )                    |g           ||_*        |j+                            |           t%          d                   t2          u rVt          j,                    }D ]}|j(        )                    |g           ||_*        |j-                            |           t%          d                   t8          u rVt          j.                    }D ]}|j(        )                    |g           ||_*        |j/                            |           t%          d                   t@          u rVt          j0                    }D ]}|j(        )                    |g           ||_*        |j1                            |           et          d           |
dv rZt%                    t          u rt          j                    }|_        |
dk    rt           j        j        |_        n/|
dk    rt           j        j2        |_        nt          d|
           |j                            |           t%                    t2          u rt          j                    }|_        |
dk    rt           j        j        |_        n/|
dk    rt           j        j2        |_        nt          d|
           |j                            |           t%                    t8          u rt          j                    }|_        |
dk    rt           j        j        |_        n|
dk    rt           j        j2        |_        n|
dk    rt           j3        j4        |_5        ni|
dk    rt           j3        j6        |_5        nL|
dk    rt           j3        j7        |_5        n/|
dk    rt           j3        j8        |_5        nt          d|
           |j                            |           t%                    t@          u rt          j!                    }|_        |
dk    rt           j        j        |_        n|
dk    rt           j        j2        |_        n|
dk    rt           j3        j4        |_5        ni|
dk    rt           j3        j6        |_5        nL|
dk    rt           j3        j7        |_5        n/|
dk    rt           j3        j8        |_5        nt          d|
           |j"                            |           t          d           |j9                            |           |S )N   z1Expected where to have exactly one operator, got z$Expected where key to be a str, got $and$orzLExpected where value for $and or $or to be a list of where expressions, got c                 ,    g | ]}t          |          S r1   )to_proto_whererr   ws     r3   r   z"to_proto_where.<locals>.<listcomp>s  s     ;;;.++;;;r2   childrenz8Expected where value to be a string, int, or float, got )$inz$ninzAExpected where value for $in or $nin to be a list of values, got r   c              3   ^   K   | ]'}t          |t          d                              V  (dS )r   N)r   r   )rr   xoperands     r3   	<genexpr>z!to_proto_where.<locals>.<genexpr>  sJ       4 4<=
1d71:&6&6774 4 4 4 4 4r2   z_Expected where operand value to be a non-empty list, and all values to be of the same type got r   zKExpected where operand value to be a list of strings, ints, or floats, got )$eq$ne$gt$lt$gte$lter   r   z.Expected where operator to be $eq or $ne, got r   r   r   r   zIExpected where operator to be one of $eq, $ne, $gt, $lt, $gte, $lte, got z@Expected where operand value to be a string, int, or float, got ):rG   r   lenrJ   rj   r   r/   listWhereChildrenBooleanOperatorANDoperatorORr   CopyFromDirectComparisonrm   dictr   SingleStringComparisonrn   GenericComparatorEQ
comparatorsingle_string_operandr   SingleBoolComparisonsingle_bool_operandr   SingleIntComparisongeneric_comparatorsingle_int_operandr8   SingleDoubleComparisonsingle_double_operandallListOperatorINNINStringListComparisonvaluesextendlist_operatorstring_list_operandBoolListComparisonbool_list_operandIntListComparisonint_list_operandDoubleListComparisondouble_list_operandNENumberComparatorGTnumber_comparatorLTGTELTEdirect_comparison)r   responserm   rn   r   dcsscsbcsicsdcr   r   slor   bloilodlosfcr   s                     @r3   r   r   d  s	     H
5zzQTUTTUUUkkmm n0 n0
U#s## 	KICIIJJJ&==C5LLeT**  jchjj   1:0G;;U;;;1 1 1H f}}$-$=$A!!$-$=$@!&&x000OOO
 '))%&& R	E{{c!!688!	!*!<!?(11#6666e$$466!	!*!<!?&//4444e##355!	)2)D)G&%..s3333e%%688!	)2)D)G&(11#6666 VuVV   &+[[]] w w!'..%gt44 (g`egg   7||q(( 4 4 4 4AH4 4 4 1 1( )-#*- -   %)M5(((1(>(A(1(>(BGAJ''3..'<>>!( 3 3AJ--qc2222,9).77<<<<gaj))T11':<<!( 3 3AJ--qc2222,9),55c::::gaj))S00'9;;!( 3 3AJ--qc2222,9)+44S9999gaj))U22'<>>!( 3 3AJ--qc2222,9).77<<<<(sjqss   !MMMG}}++'>@@$+	#u,,-6-H-KCNN%..-6-H-KCNN", [QY [ [# #  099#>>>>g$..'<>>$+	#u,,-6-H-KCNN%..-6-H-KCNN", [QY [ [# #  .77<<<<g#--';==$+	#u,,5>5P5SC22%..5>5P5SC22%..4=4N4QC11%..4=4N4QC11%//4=4N4RC11%//4=4N4RC11", vlt v v# #  -66s;;;;g%//'>@@$+	#u,,5>5P5SC22%..5>5P5SC22%..4=4N4QC11%..4=4N4QC11%//4=4N4RC11%//4=4N4RC11", vlt v v# #  099#>>>>(h_fhh   "++B////Or2   where_documentc                 <   t          j                    }t          |           dk    rt          d|            |                                 D ]M\  }}|dk    s|dk    rt          |t                    st          d|           t          j        d |D                       }|dk    rt           j        j	        |_
        nt           j        j        |_
        |j                            |           t          |t                    st          d|           t          j                    }||_        |d	k    rt           j        j        |_
        n/|d
k    rt           j        j        |_
        nt          d|           |j                            |           O|S )Nr   z:Expected where_document to have exactly one operator, got r   r   z^Expected where_document value for $and or $or to be a list of where_document expressions, got c                 ,    g | ]}t          |          S r1   )to_proto_where_documentr   s     r3   r   z+to_proto_where_document.<locals>.<listcomp>*  s!    FFF1!44FFFr2   r   z4Expected where_document operand to be a string, got z	$containsz$not_containszLExpected where_document operator to be one of $contains, $not_contains, got )rG   r   r   rJ   rj   r   r   WhereDocumentChildrenr   r   r   r   r   r   r/   DirectWhereDocumentr)   WhereDocumentOperatorCONTAINSNOT_CONTAINSdirect)r  r  r   r   r   dwds         r3   r  r    s   &((H
>aYYY
 
 	
 ,1133 !* !*'vU!2!2gt,,  ~u|~~   9B8WFFgFFF9 9 9H 6!!$-$=$A!!$-$=$@!&&x0000 gs++  T7TT   /11C"CL;&&(>G_,,(>K mckmm   O$$S))))Or2   scanc                     t          j        t          | j                  t	          | j                  t	          | j                  t	          | j                            S )N)r   knnr+   r6   )query_pbScanOperatorr   r   r   r   r+   r6   r  s    r3   to_proto_scanr$  H  sP     &t77TX&&!$-00,,	   r2   filterc                     t          j        | j        t          j        | j                  nd | j        rt          | j                  nd | j        rt          | j                  nd           S )N)ids)r'  r   r  )	r!  FilterOperatoruser_idsrG   UserIdsr   r   r  r  )r%  s    r3   to_proto_filterr+  Q  sw    "?& &/2222.4lDnV\*** .v/DEEE   r2   r   c                 V    t          j        d | j        D             | j                  S )Nc                 D    g | ]}t          |t          j                   S ))r9   r:   )rN   r   rB   )rr   r*   s     r3   r   z to_proto_knn.<locals>.<listcomp>_  s8     
 
 
 9~7MNNN
 
 
r2   )
embeddingsfetch)r!  KNNOperatorr.  r/  r   s    r3   to_proto_knnr2  ]  sA    
 
 ^
 
 
 i   r2   limitc                 B    t          j        | j        | j                  S )N)offsetr3  )r!  LimitOperatorr5  r3  )r3  s    r3   to_proto_limitr7  g  s    !U[IIIIr2   
projectionc                 N    t          j        | j        | j        | j                  S )N)r)   r*   r+   )r!  ProjectionOperatorr)   r*   r+   r8  s    r3   to_proto_projectionr<  k  s.    &$&$   r2   c                 R    t          j        t          |           | j                  S )N)r8  r7   )r!  KNNProjectionOperatorr<  rankr;  s    r3   to_proto_knn_projectionr@  s  s+    )&z22Z_   r2   countc                 P    t          j        t          | j                            S )Nr#  )r!  r   r$  r  rA  s    r3   to_proto_count_planrD  y  s     =#<#<====r2   resultc                     | j         S )NrC  rE  s    r3   from_proto_count_resultrH  }  s
    <r2   getc                     t          j        t          | j                  t	          | j                  t          | j                  t          | j	                            S )N)r  r%  r3  r8  )
r!  r   r$  r  r+  r%  r7  r3  r<  r8  )rI  s    r3   to_proto_get_planrK    sP    38$$sz**SY''&s~66	   r2   r6   c                     t          | j        | j        r| j        nd | j        t	          | j                  d         nd t          | j                            S )Nr   )r(   r)   r*   r+   )r'   r(   r)   r*   rS   ra   r+   r6   s    r3   from_proto_projection_recordrN    s_    9$*O=' $F$455a88$V_55   r2   c                 $    d | j         D             S )Nc                 ,    g | ]}t          |          S r1   )rN  rr   r6   s     r3   r   z)from_proto_get_result.<locals>.<listcomp>  s!    NNNV(00NNNr2   recordsrG  s    r3   from_proto_get_resultrT    s    NNv~NNNNr2   c                     t          j        t          | j                  t	          | j                  t          | j                  t          | j	                            S )N)r  r%  r   r8  )
r!  r   r$  r  r+  r%  r2  r   r@  r8  r1  s    r3   to_proto_knn_planrV    sP    38$$sz**!!*3>::	   r2   c                 R    t          t          | j                  | j                  S )N)r6   r7   )r5   rN  r6   r7   rM  s    r3    from_proto_knn_projection_recordrX    s,     +FM::V_   r2   resultsc                 $    d | j         D             S )Nc                 0    g | ]}d  |j         D             S )c                 ,    g | ]}t          |          S r1   )rX  rQ  s     r3   r   z:from_proto_knn_batch_result.<locals>.<listcomp>.<listcomp>  s!    OOOf	)&	1	1OOOr2   rR  )rr   rE  s     r3   r   z/from_proto_knn_batch_result.<locals>.<listcomp>  s9        	POOOO  r2   rY  r]  s    r3   from_proto_knn_batch_resultr^    s%     o   r2   )ktypingr   r   r   r   r   r   r	   uuidr
   r   numpyrC   numpy.typingr   chromadb.proto.chroma_pb2proto
chroma_pb2rG   !chromadb.proto.query_executor_pb2query_executor_pb2r!  %chromadb.api.collection_configurationr   chromadb.api.typesr   r   r   &chromadb.execution.expression.operatorr   r   r   r   r   "chromadb.execution.expression.planr   r   r   chromadb.typesr   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r'   r5   rN   rS   r]   ra   rc   r   r_   rv   r{   r   r   r   r   r/   r   r8   r   rq   r   r   r   r   r   r   r   r   r   r   r  r"  r$  r(  r+  r0  r2  r6  r7  r:  r<  r>  r@  rD  CountResultrH  rK  rN  	GetResultrT  rV  rX  KNNBatchResultr^  r1   r2   r3   <module>rp     sn   J J J J J J J J J J J J J J J J J J                        - - - - - - - - - 4 4 4 4 4 4 4 4 4      ? > > > > > > > > >              K J J J J J J J J J                               $! ! ! ! !y ! ! !    )   F n AQ    $$i. $5N9R3S $ $ $ $$=I$7 =I = = = =W)": Wx?Q W W W W&n   &37eNH,-.   ,~ ):R    /9>   "	 1 g     g )*;     EI,B E| E E E EE, E9;Q E E E E
c5$,-
"
 
 
 
0i&: z    $J 93G    $
) 
	0C 
 
 
 
 "   &5   + $   "4   &<   2$   t% tIO t t t tn*M *i>U * * * *Z !6    	F 	x'> 	 	 	 	c h2    J% JH$: J J J JJ 83N    
 x7U    >y >X-? > > > >H$8 S    7 x'7    )B GW    O("4 OBR9S O O O O7 x'7    (   $h*+,     r2   