§
    £˜ºhcÃ  ã                  óÆ  — d Z ddlm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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mZmZ ddl m!Z!m"Z"m#Z#m$Z$m%Z%m&Z& dZ' G d„ d¦  «        Z(dBd„Z)dCdDd„Z*dCdEd„Z+dCdFd„Z,	 dCdGd#„Z- G d$„ d%¦  «        Z. G d&„ d'e.¦  «        Z/ G d(„ d)e.¦  «        Z0 G d*„ d+e.¦  «        Z1 G d,„ d-e1¦  «        Z2 G d.„ d/¦  «        Z3 G d0„ d1e/¦  «        Z4 G d2„ d3e/¦  «        Z5 G d4„ d5e5¦  «        Z6 G d6„ d7e5¦  «        Z7 G d8„ d9e1¦  «        Z8 G d:„ d;e/¦  «        Z9 G d<„ d=e/¦  «        Z: G d>„ d?e/¦  «        Z; G d@„ dAe.¦  «        Z<dS )HzImplementation of Statements.é    )ÚannotationsN)ÚAnyÚDictÚIterableÚListÚOptionalÚTupleÚUnioné   )ÚLockContention)ÚDbDoc)ÚNotSupportedErrorÚProgrammingError)Ú
ExprParser)Ú
deprecated)Úmysqlxpb_enum)Ú	DocResultÚResultÚ	RowResultÚ	SqlResult)ÚConnectionTypeÚDatabaseTargetTypeÚMessageTypeÚProtobufMessageCextTypeÚProtobufMessageTypeÚ
SchemaTypez&The given index name "{}" is not validc                  ó   — e Zd ZdZdd„ZdS )	ÚExprzExpression wrapper.Úexprr   ÚreturnÚNonec                ó   — || _         d S ©N)r   )Úselfr   s     úX/var/www/html/services/rag-service/venv/lib/python3.11/site-packages/mysqlx/statement.pyÚ__init__zExpr.__init__?   s   € ØˆŒ	ˆ	ˆ	ó    N)r   r   r    r!   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r&   © r'   r%   r   r   <   s.   € € € € € ØÐðð ð ð ð ð r'   r   Úvaluesr   r    úUnion[List, Tuple]c                 ó€   — t          | ¦  «        dk    r*t          | d         t          t          f¦  «        r| d         S | S )zParse flexible parameters.r   r   )ÚlenÚ
isinstanceÚlistÚtuple)r-   s    r%   Úflexible_paramsr4   C   s9   € å
ˆ6�{„{�aÒÐ�J v¨a¤yµ4½°-Ñ@Ô@ÐØ�aŒyÐØ€Mr'   Ú Ú
identifierÚstrÚsql_modeÚboolc                óš   — d|v r0| d         dk    r| d         dk    p| d         dk    o| d         dk    S | d         dk    o| d         dk    S )zòCheck if the given identifier is quoted.

    Args:
        identifier (string): Identifier to check.
        sql_mode (Optional[string]): SQL mode.

    Returns:
        `True` if the identifier has backtick quotes, and False otherwise.
    ÚANSI_QUOTESr   ú`éÿÿÿÿú"r,   )r6   r8   s     r%   Úis_quoted_identifierr?   J   sl   € ð ˜Ð Ð Ø˜1” Ò$Ð>¨°B¬¸3Ò)>ð 
Ø�qŒM˜SÒ Ð: Z°¤^°sÒ%:ð	
ð �aŒ=˜CÒÐ9 J¨r¤N°cÒ$9Ð9r'   c                ó¤   — t          | ¦  «        dk    rdS d|v r|                      dd¦  «        }d|› d�S |                      dd¦  «        }d|› d�S )a@  Quote the given identifier with backticks, converting backticks (`) in
    the identifier name with the correct escape sequence (``).

    Args:
        identifier (string): Identifier to quote.
        sql_mode (Optional[string]): SQL mode.

    Returns:
        A string with the identifier quoted with backticks.
    r   z``r;   r>   z""r<   )r0   Úreplace)r6   r8   Úquoteds      r%   Úquote_identifierrC   [   sk   € õ ˆ:�„˜!ÒÐØˆtØ˜Ð Ð Ø×#Ò# C¨Ñ.Ô.ˆØ�6ˆ}ˆ}ˆ}ÐØ×Ò  TÑ*Ô*€FØˆvˆ=ˆ=ˆ=Ðr'   ÚidentifiersúIterable[str]c                óF   ‡— d                      ˆfd„| D ¦   «         ¦  «        S )a  Quote the given multi-part identifier with backticks.

    Args:
        identifiers (iterable): List of identifiers to quote.
        sql_mode (Optional[string]): SQL mode.

    Returns:
        A string with the multi-part identifier quoted with backticks.
    ú.c                ó0   •— g | ]}t          |‰¦  «        ‘ŒS r,   )rC   )Ú.0r6   r8   s     €r%   ú
<listcomp>z.quote_multipart_identifier.<locals>.<listcomp>z   s$   ø€ ÐNÐNÐN°JÕ	˜* hÑ	/Ô	/ÐNÐNÐNr'   )Újoin)rD   r8   s    `r%   Úquote_multipart_identifierrL   o   s2   ø€ ð �8Š8ØNÐNÐNÐNÀ+ÐNÑNÔNñô ð r'   Údefault_schemaÚ
table_nameúTuple[str, str]c                óê   — d|v rdnd}||v rd|› �nd}|                      |d¦  «        }t          |¦  «        dk    r| n|d                              |¦  «        |d                              |¦  «        fS )zÞParse table name.

    Args:
        default_schema (str): The default schema.
        table_name (str): The table name.
        sql_mode(Optional[str]): The SQL mode.

    Returns:
        str: The parsed table name.
    r;   r>   r<   rG   r   r   r=   )Úsplitr0   Ústrip)rM   rN   r8   ÚquoteÚ	delimiterÚtemps         r%   Úparse_table_namerV   ~   s‡   € ð ! HÐ,Ð,ˆCˆC°#€EØ$¨
Ð2Ð2��E���¸€IØ×Ò˜I qÑ)Ô)€Då˜d™)œ) qš.˜.ˆˆ¨d°1¬g¯mªm¸EÑ.BÔ.BØˆRŒ�Š�uÑÔðð r'   c                  ó„  — e Zd ZdZdd d	„Zed!d
„¦   «         Zed"d„¦   «         Zed#d„¦   «         Zej	        d$d„¦   «         Zed#d„¦   «         Z
ed%d„¦   «         Zej	        d&d„¦   «         Zed%d„¦   «         Zej	        d&d„¦   «         Zed%d„¦   «         Zed%d„¦   «         Zej	        d&d„¦   «         Zd%d„Zd'd„Zd'd„Zd(d„ZdS ))Ú	Statementa	  Provides base functionality for statement objects.

    Args:
        target (object): The target database object, it can be
                         :class:`mysqlx.Collection` or :class:`mysqlx.Table`.
        doc_based (bool): `True` if it is document based.
    TÚtargetr   Ú	doc_basedr9   r    r!   c                ó¢   — || _         || _        |r|                     ¦   «         nd | _        d | _        d| _        d| _        d| _        d| _        d S )Nr   TF)	Ú_targetÚ
_doc_basedÚget_connectionÚ_connectionÚ_stmt_idÚ_exec_counterÚ_changedÚ	_preparedÚ_deallocate_prepare_execute)r$   rY   rZ   s      r%   r&   zStatement.__init__�   s^   € Ø+1ˆŒØ )ˆŒà'-Ð7ˆF×!Ò!Ñ#Ô#Ð#°4ð 	Ôð (,ˆŒØ"#ˆÔØ"ˆŒØ$ˆŒØ16ˆÔ(Ð(Ð(r'   c                ó   — | j         S )z#object: The database object target.)r\   ©r$   s    r%   rY   zStatement.target©   s   € ð Œ|Ðr'   r   c                ó   — | j         j        S )z*:class:`mysqlx.Schema`: The Schema object.)r\   Úschemarf   s    r%   rh   zStatement.schema®   s   € ð Œ|Ô"Ð"r'   Úintc                ó   — | j         S )zXReturns this statement ID.

        Returns:
            int: The statement ID.
        ©r`   rf   s    r%   Ústmt_idzStatement.stmt_id³   s   € ð Œ}Ðr'   Úvaluec                ó   — || _         d S r#   rk   ©r$   rm   s     r%   rl   zStatement.stmt_id¼   ó   € àˆŒˆˆr'   c                ó   — | j         S )z5int: The number of times this statement was executed.©ra   rf   s    r%   Úexec_counterzStatement.exec_counterÀ   s   € ð Ô!Ð!r'   c                ó   — | j         S )z+bool: `True` if this statement has changes.©rb   rf   s    r%   ÚchangedzStatement.changedÅ   s   € ð Œ}Ðr'   c                ó   — || _         d S r#   ru   ro   s     r%   rv   zStatement.changedÊ   rp   r'   c                ó   — | j         S )z1bool: `True` if this statement has been prepared.©rc   rf   s    r%   ÚpreparedzStatement.preparedÎ   s   € ð Œ~Ðr'   c                ó   — || _         d S r#   ry   ro   s     r%   rz   zStatement.preparedÓ   s   € àˆŒˆˆr'   c                ó   — | j         dk    S )z;bool: `True` if this statement was executed more than once.r   rr   rf   s    r%   ÚrepeatedzStatement.repeated×   s   € ð Ô! AÒ%Ð%r'   c                ó   — | j         S )z9bool: `True` to deallocate + prepare + execute statement.©rd   rf   s    r%   Údeallocate_prepare_executez$Statement.deallocate_prepare_executeÜ   s   € ð Ô/Ð/r'   c                ó   — || _         d S r#   r   ro   s     r%   r€   z$Statement.deallocate_prepare_executeá   s   € à+0ˆÔ(Ð(Ð(r'   c                ó   — | j         S )zkCheck if it is document based.

        Returns:
            bool: `True` if it is document based.
        )r]   rf   s    r%   Úis_doc_basedzStatement.is_doc_basedå   s   € ð ŒÐr'   c                ó&   — | xj         dz  c_         dS )z@Increments the number of times this statement has been executed.r   Nrr   rf   s    r%   Úincrement_exec_counterz Statement.increment_exec_counterí   s   € àÐÔ˜aÑÐÔÐÐr'   c                ó   — d| _         dS )z<Resets the number of times this statement has been executed.r   Nrr   rf   s    r%   Úreset_exec_counterzStatement.reset_exec_counterñ   s   € àˆÔÐÐr'   r   c                ó   — t           ‚©zqExecute the statement.

        Raises:
           NotImplementedError: This method must be implemented.
        ©ÚNotImplementedErrorrf   s    r%   ÚexecutezStatement.executeõ   ó
   € õ "Ð!r'   N©T©rY   r   rZ   r9   r    r!   )r    r   )r    r   ©r    ri   )rm   ri   r    r!   ©r    r9   )rm   r9   r    r!   )r    r!   ©r    r   )r(   r)   r*   r+   r&   ÚpropertyrY   rh   rl   Úsetterrs   rv   rz   r}   r€   rƒ   r…   r‡   rŒ   r,   r'   r%   rX   rX   ”   s  € € € € € ðð ð
7ð 
7ð 
7ð 
7ð 
7ð ðð ð ñ „Xðð ð#ð #ð #ñ „Xð#ð ðð ð ñ „Xðð „^ðð ð ñ „^ðð ð"ð "ð "ñ „Xð"ð ðð ð ñ „Xðð „^ðð ð ñ „^ðð ðð ð ñ „Xðð „_ðð ð ñ „_ðð ð&ð &ð &ñ „Xð&ð ð0ð 0ð 0ñ „Xð0ð  Ô&ð1ð 1ð 1ñ 'Ô&ð1ðð ð ð ð ð  ð  ð  ðð ð ð ð"ð "ð "ð "ð "ð "r'   rX   c                  ó  ‡ — e Zd ZdZ	 	 d2d3ˆ fd„Zd4d„Zd5d„Zd6d„Zd7d„Zd8d„Z	d9d„Z
d:d„Zd;d„Zd<d„Zd=d„Zd>d!„Zd>d"„Zd=d#„Zd<d$„Zd<d%„Z ed&¦  «        d6d'„¦   «         Z ed&¦  «        d5d(„¦   «         Z	 d?d@d,„ZdAd-„ZdBd0„ZdCd1„Zˆ xZS )DÚFilterableStatementaÉ  A statement to be used with filterable statements.

    Args:
        target (object): The target database object, it can be
                         :class:`mysqlx.Collection` or :class:`mysqlx.Table`.
        doc_based (Optional[bool]): `True` if it is document based
                                    (default: `True`).
        condition (Optional[str]): Sets the search condition to filter
                                   documents or records.
    TNrY   r   rZ   r9   Ú	conditionúOptional[str]r    r!   c                ó˜  •— t          ¦   «                              ||¬¦  «         i | _        i | _        d | _        d| _        d | _        d| _        d | _        d| _	        d | _
        d| _        d | _        d| _        d | _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        |r|                      |¦  «         d S d S )N©rY   rZ   r5   r   F)Úsuperr&   Ú_binding_mapÚ	_bindingsÚ_havingÚ_grouping_strÚ	_groupingÚ_limit_offsetÚ_limit_row_countÚ_projection_strÚ_projection_exprÚ	_sort_strÚ
_sort_exprÚ
_where_strÚ_where_exprÚhas_bindingsÚ	has_limitÚhas_group_byÚ
has_havingÚhas_projectionÚhas_sortÚ	has_whereÚ
_set_where©r$   rY   rZ   r—   Ú	__class__s       €r%   r&   zFilterableStatement.__init__
  s÷   ø€ õ 	‰Œ×Ò °)ÐÑ<Ô<Ð<Ø,.ˆÔØ68ˆŒØ.2ˆŒØ"$ˆÔð ð 	Œð #$ˆÔØ%)ˆÔØ$&ˆÔð ð 	Ôð !ˆŒð ð 	Œð  "ˆŒØ(,ˆÔØ"'ˆÔØ$ˆŒØ"'ˆÔØ %ˆŒØ$)ˆÔØ#ˆŒØ$ˆŒØð 	'Ø�OŠO˜IÑ&Ô&Ð&Ð&Ð&ð	'ð 	'r'   Úobjú!Union[DbDoc, Dict[str, Any], str]c                ón  — t          |t          ¦  «        r6|                      t          |¦  «                             ¦   «         ¦  «         dS t          |t          ¦  «        r)|                      |                     ¦   «         ¦  «         dS t          |t
          ¦  «        r‰	 t          j        |¦  «        }t          |t          ¦  «        st          ‚n"# t          $ r}t          d¦  «        |‚d}~ww xY w| 
                    ¦   «         D ]}|                      |||         ¦  «         ŒdS t          d¦  «        ‚)a  Bind single object.

        Args:
            obj (:class:`mysqlx.DbDoc` or str): DbDoc or JSON string object.

        Raises:
            :class:`mysqlx.ProgrammingError`: If invalid JSON string to bind.
            ValueError: If JSON loaded is not a dictionary.
        zInvalid JSON string to bindNz%Invalid JSON string or object to bind)r1   ÚdictÚbindr   Úas_strr7   ÚjsonÚloadsÚ
ValueErrorr   Úkeys)r$   r³   ÚresÚerrÚkeys        r%   Ú_bind_singlez FilterableStatement._bind_single.  s8  € õ �c�4Ñ Ô ð 	LØ�IŠI•e˜C‘j”j×'Ò'Ñ)Ô)Ñ*Ô*Ð*Ð*Ð*Ý˜�UÑ#Ô#ð 	LØ�IŠI�c—j’j‘l”lÑ#Ô#Ð#Ð#Ð#Ý˜�SÑ!Ô!ð 
	LðOÝ”j ‘o”o�Ý! #¥tÑ,Ô,ð %Ý$Ð$ð%øåð Oð Oð OÝ&Ð'DÑEÔEÈ3ÐNøøøøðOøøøà—x’x‘z”zð )ð )�Ø—	’	˜#˜s 3œxÑ(Ô(Ð(Ð(ð)ð )õ #Ð#JÑKÔKÐKs   Â 0C Ã
C0ÃC+Ã+C0Úclausesr7   c                óÈ   — d| _         d                     t          |Ž ¦  «        | _        t	          | j        | j         ¦  «                             ¦   «         | _        d| _        | S )zÑSets the sorting criteria.

        Args:
            *clauses: The expression strings defining the sort criteria.

        Returns:
            mysqlx.FilterableStatement: FilterableStatement object.
        Tú,)	r®   rK   r4   r¥   r   r]   Úparse_order_specr¦   rb   ©r$   rÁ   s     r%   Ú_sortzFilterableStatement._sortH  s]   € ð ˆŒØŸš¥/°7Ð";Ñ<Ô<ˆŒÝ$ØŒN ¤Ð/ñ
ô 
ç
Ò
Ñ
Ô
ð 	Œð ˆŒØˆr'   c                óî   — d| _         || _        	 t          || j         ¦  «        }|                     ¦   «         | _        n"# t          $ r}t          d¦  «        |‚d}~ww xY w|j        | _	        d| _
        | S )a  Sets the search condition to filter.

        Args:
            condition (str): Sets the search condition to filter documents or
                             records.

        Returns:
            mysqlx.FilterableStatement: FilterableStatement object.
        TzInvalid conditionN)r¯   r§   r   r]   r   r¨   r»   r   Úplaceholder_name_to_positionrœ   rb   )r$   r—   r   r¾   s       r%   r°   zFilterableStatement._set_whereY  sŠ   € ð ˆŒØ#ˆŒð	AÝ˜i¨T¬_Ð)<Ñ=Ô=ˆDØ#Ÿyšy™{œ{ˆDÔÐøÝð 	Að 	Að 	AÝ"Ð#6Ñ7Ô7¸SÐ@øøøøð	Aøøøà Ô=ˆÔØˆŒØˆs   �/A  Á 
AÁ
AÁAÚfieldsc                óÌ   — t          |Ž }d| _        d                     |¦  «        | _        t	          | j        | j         ¦  «                             ¦   «         | _        d| _        dS )zJSet group by.

        Args:
            *fields: List of fields.
        TrÃ   N)	r4   r«   rK   rŸ   r   r]   Úparse_expr_listr    rb   ©r$   rÉ   s     r%   Ú_set_group_byz!FilterableStatement._set_group_byn  sc   € õ ! &Ð)ˆØ ˆÔØ ŸXšX fÑ-Ô-ˆÔÝ#ØÔ D¤OÐ 3ñ
ô 
ç
Š/Ñ
Ô
ð 	Œð ˆŒˆˆr'   c                ó|   — d| _         t          || j         ¦  «                             ¦   «         | _        d| _        dS )zOSet having.

        Args:
            condition (str): The condition.
        TN)r¬   r   r]   r   rž   rb   ©r$   r—   s     r%   Ú_set_havingzFilterableStatement._set_having|  s8   € ð ˆŒÝ! )°´Ð-@ÑAÔA×FÒFÑHÔHˆŒØˆŒˆˆr'   c                óÌ   — t          |Ž }d| _        d                     |¦  «        | _        t	          | j        | j         ¦  «                             ¦   «         | _        d| _        | S )z¡Set the projection.

        Args:
            *fields: List of fields.

        Returns:
            :class:`mysqlx.FilterableStatement`: Returns self.
        TrÃ   )	r4   r­   rK   r£   r   r]   Úparse_table_select_projectionr¤   rb   rÌ   s     r%   Ú_set_projectionz#FilterableStatement._set_projection†  sf   € õ ! &Ð)ˆØ"ˆÔØ"Ÿxšx¨Ñ/Ô/ˆÔÝ *ØÔ  d¤oÐ"5ñ!
ô !
ç
'Ò
'Ñ
)Ô
)ð 	Ôð ˆŒØˆr'   úDict[str, Any]c                ó   — | j         S ©zlReturns the binding map dictionary.

        Returns:
            dict: The binding map dictionary.
        ©rœ   rf   s    r%   Úget_binding_mapz#FilterableStatement.get_binding_map˜  ó   € ð Ô Ð r'   úUnion[Dict[str, Any], List]c                ó   — | j         S ©z\Returns the bindings list.

        Returns:
            `list`: The bindings list.
        ©r�   rf   s    r%   Úget_bindingsz FilterableStatement.get_bindings   ó   € ð Œ~Ðr'   ú9List[Union[ProtobufMessageType, ProtobufMessageCextType]]c                ó   — | j         S )zrReturns the grouping expression list.

        Returns:
            `list`: The grouping expression list.
        )r    rf   s    r%   Úget_groupingz FilterableStatement.get_grouping¨  rß   r'   r   c                ó   — | j         S )zdReturns the having expression.

        Returns:
            object: The having expression.
        )rž   rf   s    r%   Ú
get_havingzFilterableStatement.get_having°  ó   € ð Œ|Ðr'   ri   c                ó   — | j         S )z]Returns the limit row count.

        Returns:
            int: The limit row count.
        )r¢   rf   s    r%   Úget_limit_row_countz'FilterableStatement.get_limit_row_count¸  s   € ð Ô$Ð$r'   c                ó   — | j         S )zWReturns the limit offset.

        Returns:
            int: The limit offset.
        )r¡   rf   s    r%   Úget_limit_offsetz$FilterableStatement.get_limit_offsetÀ  s   € ð Ô!Ð!r'   c                ó   — | j         S )zbReturns the where expression.

        Returns:
            object: The where expression.
        )r¨   rf   s    r%   Úget_where_exprz"FilterableStatement.get_where_exprÈ  ó   € ð ÔÐr'   c                ó   — | j         S )zlReturns the projection expression.

        Returns:
            object: The projection expression.
        )r¤   rf   s    r%   Úget_projection_exprz'FilterableStatement.get_projection_exprÐ  s   € ð Ô$Ð$r'   c                ó   — | j         S )z`Returns the sort expression.

        Returns:
            object: The sort expression.
        )r¦   rf   s    r%   Úget_sort_exprz!FilterableStatement.get_sort_exprÚ  s   € ð ŒÐr'   ú8.0.12c                ó,   — |                       |¦  «        S )a&  Sets the search condition to filter.

        Args:
            condition (str): Sets the search condition to filter documents or
                             records.

        Returns:
            mysqlx.FilterableStatement: FilterableStatement object.

        .. deprecated:: 8.0.12
        ©r°   rÏ   s     r%   ÚwherezFilterableStatement.whereä  s   € ð �Š˜yÑ)Ô)Ð)r'   c                ó   —  | j         |Ž S )zñSets the sorting criteria.

        Args:
            *clauses: The expression strings defining the sort criteria.

        Returns:
            mysqlx.FilterableStatement: FilterableStatement object.

        .. deprecated:: 8.0.12
        ©rÆ   rÅ   s     r%   ÚsortzFilterableStatement.sortó  s   € ð ˆtŒz˜7Ð#Ð#r'   Ú	row_countÚoffsetúOptional[int]c                ó^  — t          |t          ¦  «        r|dk     rt          d¦  «        ‚| j        s;t	          | j        dk    ¦  «        | _        t	          | j        dk     ¦  «        | _        || _        d| _        |r0|  	                    |¦  «         t          j        dt          ¬¦  «         | S )a„  Sets the maximum number of items to be returned.

        Args:
            row_count (int): The maximum number of items.

        Returns:
            mysqlx.FilterableStatement: FilterableStatement object.

        Raises:
            ValueError: If ``row_count`` is not a positive integer.

        .. versionchanged:: 8.0.12
           The usage of ``offset`` was deprecated.
        r   z0The 'row_count' value must be a positive integerTzh'limit(row_count, offset)' is deprecated, please use 'offset(offset)' to set the number of items to skip)Úcategory)r1   ri   r»   rª   r9   ra   rb   rd   r¢   rù   ÚwarningsÚwarnÚDeprecationWarning)r$   rø   rù   s      r%   ÚlimitzFilterableStatement.limit  s¾   € õ" ˜)¥SÑ)Ô)ð 	Q¨Y¸ª]¨]ÝÐOÑPÔPÐPØŒ~ð 	QÝ  Ô!3°qÒ!8Ñ9Ô9ˆDŒMÝ/3¸Ô8JÈaÒ8OÐ4OÑ/PÔ/PˆDÔ,à )ˆÔØˆŒØð 	Ø�KŠK˜ÑÔÐÝŒMðõ ,ð	ñ ô ð ð ˆr'   c                óh   — t          |t          ¦  «        r|dk     rt          d¦  «        ‚|| _        | S )a:  Sets the number of items to skip.

        Args:
            offset (int): The number of items to skip.

        Returns:
            mysqlx.FilterableStatement: FilterableStatement object.

        Raises:
            ValueError: If ``offset`` is not a positive integer.

        .. versionadded:: 8.0.12
        r   z-The 'offset' value must be a positive integer)r1   ri   r»   r¡   )r$   rù   s     r%   rù   zFilterableStatement.offset$  s;   € õ ˜&¥#Ñ&Ô&ð 	N¨&°1ª*¨*ÝÐLÑMÔMÐMØ#ˆÔØˆr'   Úargsr   c                óÎ   — d| _         t          |¦  «        }|dk    r|                      |d         ¦  «         n,|dk    r|d         | j        |d         <   nt	          d¦  «        ‚| S )a¨  Binds value(s) to a specific placeholder(s).

        Args:
            *args: The name of the placeholder and the value to bind.
                   A :class:`mysqlx.DbDoc` object or a JSON string
                   representation can be used.

        Returns:
            mysqlx.FilterableStatement: FilterableStatement object.

        Raises:
            ProgrammingError: If the number of arguments is invalid.
        Tr   r   é   ú#Invalid number of arguments to bind)r©   r0   rÀ   r�   r   )r$   r  Úcounts      r%   r·   zFilterableStatement.bind7  so   € ð !ˆÔÝ�D‘	”	ˆØ�AŠ:ˆ:Ø×Ò˜d 1œgÑ&Ô&Ð&Ð&Ø�aŠZˆZØ&*¨1¤gˆDŒN˜4 œ7Ñ#Ð#å"Ð#HÑIÔIÐIØˆr'   c                ó   — t           ‚r‰   rŠ   rf   s    r%   rŒ   zFilterableStatement.executeO  r�   r'   ©TN©rY   r   rZ   r9   r—   r˜   r    r!   )r³   r´   r    r!   )rÁ   r7   r    r–   )r—   r7   r    r–   )rÉ   r7   r    r!   )r—   r7   r    r!   )rÉ   r7   r    r–   ©r    rÔ   )r    rÚ   )r    rà   )r    r   r�   r#   )rø   ri   rù   rú   r    r–   )rù   ri   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Œ   Ú__classcell__©r²   s   @r%   r–   r–   þ   s6  ø€ € € € € ð	ð 	ð Ø#'ð	"'ð "'ð "'ð "'ð "'ð "'ð "'ðHLð Lð Lð Lð4ð ð ð ð"ð ð ð ð*ð ð ð ðð ð ð ðð ð ð ð$!ð !ð !ð !ðð ð ð ðð ð ð ðð ð ð ð%ð %ð %ð %ð"ð "ð "ð "ð ð  ð  ð  ð%ð %ð %ð %ðð ð ð ð €Z�ÑÔð*ð *ð *ñ Ôð*ð €Z�ÑÔð$ð $ð $ñ Ôð$ð 7;ð!ð !ð !ð !ð !ðFð ð ð ð&ð ð ð ð0"ð "ð "ð "ð "ð "ð "ð "r'   r–   c                  ó\   ‡ — e Zd ZdZdˆ fd„Zedd	„¦   «         Zdd„Zdd„Zdd„Z	dd„Z
ˆ xZS )ÚSqlStatementz¬A statement for SQL execution.

    Args:
        connection (mysqlx.connection.Connection): Connection object.
        sql (string): The sql statement to be executed.
    Ú
connectionr   Úsqlr7   r    r!   c                ó¢   •— t          ¦   «                              d d¬¦  «         || _        || _        d | _        g | _        d| _        d| _        d S ©NFrš   )r›   r&   r_   Ú_sqlrœ   r�   r©   rª   )r$   r  r  r²   s      €r%   r&   zSqlStatement.__init__`  sQ   ø€ Ý‰Œ×Ò °ÐÑ6Ô6Ð6Ø+5ˆÔØˆŒ	Ø6:ˆÔØ-/ˆŒØ"'ˆÔØ$ˆŒˆˆr'   c                ó   — | j         S )zstring: The SQL text statement.)r  rf   s    r%   r  zSqlStatement.sqli  s   € ð ŒyÐr'   rÔ   c                ó   — | j         S rÖ   r×   rf   s    r%   rØ   zSqlStatement.get_binding_mapn  rÙ   r'   úUnion[Tuple, List]c                ó   — | j         S rÜ   rÝ   rf   s    r%   rÞ   zSqlStatement.get_bindingsv  rß   r'   r  r   c                óæ   — t          |¦  «        dk    rt          d¦  «        ‚d| _        t          |Ž }t	          |t
          t          f¦  «        r|| _        n| j                             |¦  «         | S )zµBinds value(s) to a specific placeholder(s).

        Args:
            *args: The value(s) to bind.

        Returns:
            mysqlx.SqlStatement: SqlStatement object.
        r   r  T)	r0   r   r©   r4   r1   r2   r3   r�   Úappend)r$   r  Úbindingss      r%   r·   zSqlStatement.bind~  sn   € õ ˆt‰9Œ9˜Š>ˆ>Ý"Ð#HÑIÔIÐIØ ˆÔÝ" DÐ)ˆÝ�h¥¥u Ñ.Ô.ð 	,Ø%ˆDŒNˆNàŒN×!Ò! (Ñ+Ô+Ð+Øˆr'   r   c                ó6   — | j                              | ¦  «        S )zaExecute the statement.

        Returns:
            mysqlx.SqlResult: SqlResult object.
        )r_   Úsend_sqlrf   s    r%   rŒ   zSqlStatement.execute‘  s   € ð Ô×(Ò(¨Ñ.Ô.Ð.r'   )r  r   r  r7   r    r!   ©r    r7   r
  )r    r  )r  r   r    r  )r    r   )r(   r)   r*   r+   r&   r“   r  rØ   rÞ   r·   rŒ   r  r  s   @r%   r  r  X  s·   ø€ € € € € ðð ð%ð %ð %ð %ð %ð %ð ðð ð ñ „Xðð!ð !ð !ð !ðð ð ð ðð ð ð ð&/ð /ð /ð /ð /ð /ð /ð /r'   r  c                  ó4   ‡ — e Zd ZdZdˆ fd„Zdd
„Zdd„Zˆ xZS )ÚWriteStatementz*Provide common write operation attributes.rY   r   rZ   r9   r    r!   c                óZ   •— t          ¦   «                              ||¦  «         g | _        d S r#   )r›   r&   Ú_values)r$   rY   rZ   r²   s      €r%   r&   zWriteStatement.__init__�  s-   ø€ Ý‰Œ×Ò˜ Ñ+Ô+Ð+ð ð 	Œˆˆr'   úpList[Union[int, str, DbDoc, Dict[str, Any], List[Optional[Union[str, int, float, ExprParser, Dict[str, Any]]]]]]c                ó   — | j         S )z^Returns the list of values.

        Returns:
            `list`: The list of values.
        )r!  rf   s    r%   Ú
get_valueszWriteStatement.get_values©  s   € ð  Œ|Ðr'   r   c                ó   — t           ‚r‰   rŠ   rf   s    r%   rŒ   zWriteStatement.execute»  r�   r'   r�   )r    r"  r’   )r(   r)   r*   r+   r&   r$  rŒ   r  r  s   @r%   r  r  š  sk   ø€ € € € € Ø4Ð4ð
ð 
ð 
ð 
ð 
ð 
ðð ð ð ð$"ð "ð "ð "ð "ð "ð "ð "r'   r  c                  óF   ‡ — e Zd ZdZdˆ fd„Zdd„Zddd„Zdd„Zdd„Zˆ xZ	S )ÚAddStatementz�A statement for document addition on a collection.

    Args:
        collection (mysqlx.Collection): The Collection object.
    Ú
collectionr   r    r!   c                óh   •— t          ¦   «                              |d¦  «         d| _        g | _        d S )NTF)r›   r&   Ú_upsertÚids)r$   r(  r²   s     €r%   r&   zAddStatement.__init__Ë  s/   ø€ Ý‰Œ×Ò˜ TÑ*Ô*Ð*Ø"ˆŒØˆŒˆˆr'   r9   c                ó   — | j         S )zhReturns `True` if it's an upsert.

        Returns:
            bool: `True` if it's an upsert.
        ©r*  rf   s    r%   Ú	is_upsertzAddStatement.is_upsertÐ  rå   r'   Trm   c                ó   — || _         | S )zÿSets the upset flag to the boolean of the value provided.
        Setting of this flag allows updating of the matched rows/documents
        with the provided value.

        Args:
            value (optional[bool]): Set or unset the upsert flag.
        r-  ro   s     r%   ÚupsertzAddStatement.upsertØ  s   € ð ˆŒØˆr'   r-   r   c                óÌ   — t          |Ž D ]Y}t          |t          ¦  «        r| j                             |¦  «         Œ2| j                             t          |¦  «        ¦  «         ŒZ| S )zÏAdds a list of documents into a collection.

        Args:
            *values: The documents to be added into the collection.

        Returns:
            mysqlx.AddStatement: AddStatement object.
        )r4   r1   r   r!  r  )r$   r-   Úvals      r%   ÚaddzAddStatement.addã  sg   € õ # FÐ+ð 	0ð 	0ˆCÝ˜#�uÑ%Ô%ð 0Ø”×#Ò# CÑ(Ô(Ð(Ð(à”×#Ò#¥E¨#¡J¤JÑ/Ô/Ð/Ð/Øˆr'   r   c                ó‚   — t          | j        ¦  «        dk    rt          ¦   «         S | j                             | ¦  «        S )ú[Execute the statement.

        Returns:
            mysqlx.Result: Result object.
        r   )r0   r!  r   r_   Úsend_insertrf   s    r%   rŒ   zAddStatement.executeó  s9   € õ ˆtŒ|ÑÔ Ò!Ð!Ý‘8”8ˆOàÔ×+Ò+¨DÑ1Ô1Ð1r'   )r(  r   r    r!   r‘   rŽ   )rm   r9   r    r'  )r-   r   r    r'  ©r    r   )
r(   r)   r*   r+   r&   r.  r0  r3  rŒ   r  r  s   @r%   r'  r'  Ä  sœ   ø€ € € € € ðð ðð ð ð ð ð ð
ð ð ð ð	ð 	ð 	ð 	ð 	ðð ð ð ð 	2ð 	2ð 	2ð 	2ð 	2ð 	2ð 	2ð 	2r'   r'  c                  ó$   — e Zd ZdZddd„Zdd„ZdS )Ú
UpdateSpeczñUpdate specification class implementation.

    Args:
        update_type (int): The update type.
        source (str): The source.
        value (Optional[str]): The value.

    Raises:
        ProgrammingError: If `source` is invalid.
    NÚupdate_typeri   Úsourcer7   rm   r   r    r!   c                ó  — |t          d¦  «        k    r|                      ||¦  «         d S || _        	 t          |d¦  «                             ¦   «         j        | _        n## t          $ r}t          |› ¦  «        |‚d }~ww xY w|| _	        d S )Nú*Mysqlx.Crud.UpdateOperation.UpdateType.SETF)
r   Ú
_table_setr:  r   Údocument_fieldr6   r;  r»   r   rm   )r$   r:  r;  rm   r¾   s        r%   r&   zUpdateSpec.__init__  s›   € Ø�-Ð(TÑUÔUÒUÐUØ�OŠO˜F EÑ*Ô*Ð*Ð*Ð*à$/ˆDÔð:Ý#-¨f°eÑ#<Ô#<×#KÒ#KÑ#MÔ#MÔ#X�”�øÝð :ð :ð :Ý&¨# xÑ0Ô0°cÐ9øøøøð:øøøà#ˆDŒJˆJˆJs   ´,A! Á!
BÁ+A<Á<Bc                óŠ   — t          d¦  «        | _        t          |d¦  «                             ¦   «         | _        || _        dS )zlTable set.

        Args:
            source (str): The source.
            value (str): The value.
        r=  TN)r   r:  r   Úparse_table_update_fieldr;  rm   )r$   r;  rm   s      r%   r>  zUpdateSpec._table_set  s=   € õ )Ð)UÑVÔVˆÔÝ  ¨Ñ.Ô.×GÒGÑIÔIˆŒØˆŒ
ˆ
ˆ
r'   r#   )r:  ri   r;  r7   rm   r   r    r!   )r;  r7   rm   r   r    r!   )r(   r)   r*   r+   r&   r>  r,   r'   r%   r9  r9  ÿ  sK   € € € € € ð	ð 	ð	$ð 	$ð 	$ð 	$ð 	$ð	ð 	ð 	ð 	ð 	ð 	r'   r9  c                  óŽ   ‡ — e Zd ZdZdˆ fd„Zdd
„Zdd„Zd d„Z ed¦  «        d d„¦   «         Z	d!d„Z
d"d„Zd d„Zd#d„Zd$d„Zˆ xZS )%ÚModifyStatementaU  A statement for document update operations on a Collection.

    Args:
        collection (mysqlx.Collection): The Collection object.
        condition (str): Sets the search condition to identify the documents
                         to be modified.

    .. versionchanged:: 8.0.12
       The ``condition`` parameter is now mandatory.
    r(  r   r—   r7   r    r!   c                ó\   •— t          ¦   «                              ||¬¦  «         i | _        d S ©N)rY   r—   ©r›   r&   Ú_update_ops©r$   r(  r—   r²   s      €r%   r&   zModifyStatement.__init__.  s.   ø€ Ý‰Œ×Ò 
°iÐÑ@Ô@Ð@Ø+-ˆÔÐÐr'   rÁ   c                ó   —  | j         |Ž S )zÉSets the sorting criteria.

        Args:
            *clauses: The expression strings defining the sort criteria.

        Returns:
            mysqlx.ModifyStatement: ModifyStatement object.
        rö   rÅ   s     r%   r÷   zModifyStatement.sort2  ó   € ð ˆtŒz˜7Ð#Ð#r'   rÔ   c                ó   — | j         S ©ztReturns the list of update operations.

        Returns:
            `list`: The list of update operations.
        ©rG  rf   s    r%   Úget_update_opszModifyStatement.get_update_ops=  rì   r'   Údoc_pathrm   r   c                ó`   — t          t          d¦  «        ||¦  «        | j        |<   d| _        | S )a2  Sets or updates attributes on documents in a collection.

        Args:
            doc_path (string): The document path of the item to be set.
            value (string): The value to be set on the specified attribute.

        Returns:
            mysqlx.ModifyStatement: ModifyStatement object.
        z/Mysqlx.Crud.UpdateOperation.UpdateType.ITEM_SETT©r9  r   rG  rb   ©r$   rO  rm   s      r%   ÚsetzModifyStatement.setE  s;   € õ &0ÝÐKÑLÔLØØñ&
ô &
ˆÔ˜Ñ"ð
 ˆŒØˆr'   rñ   c                ó`   — t          t          d¦  «        ||¦  «        | j        |<   d| _        | S )aŠ  Add an update to the statement setting the field, if it exists at
        the document path, to the given value.

        Args:
            doc_path (string): The document path of the item to be set.
            value (object): The value to be set on the specified attribute.

        Returns:
            mysqlx.ModifyStatement: ModifyStatement object.

        .. deprecated:: 8.0.12
        z3Mysqlx.Crud.UpdateOperation.UpdateType.ITEM_REPLACETrQ  rR  s      r%   ÚchangezModifyStatement.changeW  s;   € õ &0ÝÐOÑPÔPØØñ&
ô &
ˆÔ˜Ñ"ð
 ˆŒØˆr'   Ú	doc_pathsc                óv   — t          |Ž D ]'}t          t          d¦  «        |¦  «        | j        |<   Œ(d| _        | S )a  Removes attributes from documents in a collection.

        Args:
            doc_paths (list): The list of document paths of the attributes to be
                              removed.

        Returns:
            mysqlx.ModifyStatement: ModifyStatement object.
        z2Mysqlx.Crud.UpdateOperation.UpdateType.ITEM_REMOVET)r4   r9  r   rG  rb   )r$   rV  Úitems      r%   ÚunsetzModifyStatement.unsetm  sO   € õ $ YÐ/ð 	ð 	ˆDÝ%/ÝÐRÑSÔSØñ&ô &ˆDÔ˜TÑ"Ð"ð ˆŒØˆr'   Úfieldc                ó`   — t          t          d¦  «        ||¦  «        | j        |<   d| _        | S )a„  Insert a value into the specified array in documents of a
        collection.

        Args:
            field (string): A document path that identifies the array attribute
                            and position where the value will be inserted.
            value (object): The value to be inserted.

        Returns:
            mysqlx.ModifyStatement: ModifyStatement object.
        z3Mysqlx.Crud.UpdateOperation.UpdateType.ARRAY_INSERTTrQ  ©r$   rZ  rm   s      r%   Úarray_insertzModifyStatement.array_insert  s;   € õ #-ÝÐOÑPÔPØØñ#
ô #
ˆÔ˜Ñð
 ˆŒØˆr'   c                ó`   — t          t          d¦  «        ||¦  «        | j        |<   d| _        | S )aÀ  Inserts a value into a specific position in an array attribute in
        documents of a collection.

        Args:
            doc_path (string): A document path that identifies the array
                               attribute and position where the value will be
                               inserted.
            value (object): The value to be inserted.

        Returns:
            mysqlx.ModifyStatement: ModifyStatement object.
        z3Mysqlx.Crud.UpdateOperation.UpdateType.ARRAY_APPENDTrQ  rR  s      r%   Úarray_appendzModifyStatement.array_append“  s;   € õ &0ÝÐOÑPÔPØØñ&
ô &
ˆÔ˜Ñ"ð
 ˆŒØˆr'   Údocú#Union[Dict, DbDoc, ExprParser, str]c                ó(  — |€d}t          |t          t          t          t          f¦  «        st          d¦  «        ‚t          t          d¦  «        dt          |t          ¦  «        r|                     ¦   «         n|¦  «        | j	        d<   d| _
        | S )a¢  Takes a :class:`mysqlx.DbDoc`, string JSON format or a dict with the
        changes and applies it on all matching documents.

        Args:
            doc (object): A generic document (DbDoc), string in JSON format or
                          dict, with the changes to apply to the matching
                          documents.

        Returns:
            mysqlx.ModifyStatement: ModifyStatement object.
        Nr5   z>Invalid data for update operation on document collection tablez2Mysqlx.Crud.UpdateOperation.UpdateType.MERGE_PATCHú$ÚpatchT)r1   r   r¶   r   r7   r   r9  r   r   rG  rb   )r$   r`  s     r%   rd  zModifyStatement.patch¨  s’   € ð ˆ;ØˆCÝ˜#¥
­Dµ%½Ð=Ñ>Ô>ð 	Ý"ØPñô ð õ %/ÝÐNÑOÔOØÝ$ S­*Ñ5Ô5Ð>ˆC�HŠH‰JŒJˆJ¸3ñ%
ô %
ˆÔ˜Ñ!ð
 ˆŒØˆr'   r   c                ób   — | j         st          d¦  «        ‚| j                             | ¦  «        S )ú¤Execute the statement.

        Returns:
            mysqlx.Result: Result object.

        Raises:
            ProgrammingError: If condition was not set.
        z!No condition was found for modify©r¯   r   r_   Úsend_updaterf   s    r%   rŒ   zModifyStatement.executeÂ  ó5   € ð Œ~ð 	HÝ"Ð#FÑGÔGÐGØÔ×+Ò+¨DÑ1Ô1Ð1r'   ©r(  r   r—   r7   r    r!   )rÁ   r7   r    rC  r
  )rO  r7   rm   r   r    rC  )rV  r7   r    rC  )rZ  r7   rm   r   r    rC  )r`  ra  r    rC  r7  )r(   r)   r*   r+   r&   r÷   rN  rS  r   rU  rY  r]  r_  rd  rŒ   r  r  s   @r%   rC  rC  "  s  ø€ € € € € ð	ð 	ð.ð .ð .ð .ð .ð .ð	$ð 	$ð 	$ð 	$ð ð  ð  ð  ðð ð ð ð$ €Z�ÑÔðð ð ñ Ôðð*ð ð ð ð$ð ð ð ð(ð ð ð ð*ð ð ð ð42ð 2ð 2ð 2ð 2ð 2ð 2ð 2r'   rC  c                  óž   ‡ — e Zd ZdZ	 	 ddˆ fd„Zedd„¦   «         Zdd„Zdd„Zdd„Z	e
j        fd d„Ze
j        fd d„Zd!d„Zd"d„Zd#d„Zˆ xZS )$ÚReadStatementaÅ  Provide base functionality for Read operations

    Args:
        target (object): The target database object, it can be
                         :class:`mysqlx.Collection` or :class:`mysqlx.Table`.
        doc_based (Optional[bool]): `True` if it is document based
                                    (default: `True`).
        condition (Optional[str]): Sets the search condition to filter
                                   documents or records.
    TNrY   r   rZ   r9   r—   r˜   r    r!   c                óŒ   •— t          ¦   «                              |||¦  «         d| _        d| _        t          j        | _        d S ©NF)r›   r&   Ú_lock_exclusiveÚ_lock_sharedr   ÚDEFAULTÚ_lock_contentionr±   s       €r%   r&   zReadStatement.__init__Ü  sB   ø€ õ 	‰Œ×Ò˜ ¨IÑ6Ô6Ð6Ø%*ˆÔØ"'ˆÔÝ0>Ô0FˆÔÐÐr'   r   c                ó   — | j         S )z::class:`mysqlx.LockContention`: The lock contention value.)rr  rf   s    r%   Úlock_contentionzReadStatement.lock_contentionç  s   € ð Ô$Ð$r'   rt  c                ó„   — 	 t          |j        ¦  «        }n"# t          $ r}t          d¦  «        |‚d}~ww xY w|| _        dS )zÖSet the lock contention.

        Args:
            lock_contention (:class:`mysqlx.LockContention`): Lock contention.

        Raises:
            ProgrammingError: If is an invalid lock contention value.
        z;Invalid lock contention mode. Use 'NOWAIT' or 'SKIP_LOCKED'N)r   rm   r»   r   rr  )r$   rt  Ú_r¾   s       r%   Ú_set_lock_contentionz"ReadStatement._set_lock_contentionì  s`   € ð	å˜Ô4Ñ5Ô5ˆAˆAøÝð 	ð 	ð 	Ý"ØMñô àðøøøøð	øøøð !0ˆÔÐÐs   ‚ —
6¡1±6c                ó   — | j         S )zrReturns `True` if is `EXCLUSIVE LOCK`.

        Returns:
            bool: `True` if is `EXCLUSIVE LOCK`.
        )ro  rf   s    r%   Úis_lock_exclusivezReadStatement.is_lock_exclusiveþ  s   € ð Ô#Ð#r'   c                ó   — | j         S )zlReturns `True` if is `SHARED LOCK`.

        Returns:
            bool: `True` if is `SHARED LOCK`.
        )rp  rf   s    r%   Úis_lock_sharedzReadStatement.is_lock_shared  rÙ   r'   c                óL   — d| _         d| _        |                      |¦  «         | S )zÅExecute a read operation with `SHARED LOCK`. Only one lock can be
           active at a time.

        Args:
            lock_contention (:class:`mysqlx.LockContention`): Lock contention.
        FT©ro  rp  rw  ©r$   rt  s     r%   Úlock_sharedzReadStatement.lock_shared  s-   € ð  %ˆÔØ ˆÔØ×!Ò! /Ñ2Ô2Ð2Øˆr'   c                óL   — d| _         d| _        |                      |¦  «         | S )zÈExecute a read operation with `EXCLUSIVE LOCK`. Only one lock can be
           active at a time.

        Args:
            lock_contention (:class:`mysqlx.LockContention`): Lock contention.
        TFr}  r~  s     r%   Úlock_exclusivezReadStatement.lock_exclusive  s-   € ð  $ˆÔØ!ˆÔØ×!Ò! /Ñ2Ô2Ð2Øˆr'   rÉ   r7   c                ó   —  | j         |Ž  | S )zÜSets a grouping criteria for the resultset.

        Args:
            *fields: The string expressions identifying the grouping criteria.

        Returns:
            mysqlx.ReadStatement: ReadStatement object.
        )rÍ   rÌ   s     r%   Úgroup_byzReadStatement.group_by*  s   € ð 	ˆÔ˜FÐ#Ð#Øˆr'   c                ó0   — |                       |¦  «         | S )a=  Sets a condition for records to be considered in agregate function
        operations.

        Args:
            condition (string): A condition on the agregate functions used on
                                the grouping criteria.

        Returns:
            mysqlx.ReadStatement: ReadStatement object.
        )rÐ   rÏ   s     r%   ÚhavingzReadStatement.having6  s   € ð 	×Ò˜Ñ#Ô#Ð#Øˆr'   úUnion[DocResult, RowResult]c                ó6   — | j                              | ¦  «        S ©r5  )r_   Ú	send_findrf   s    r%   rŒ   zReadStatement.executeD  s   € ð Ô×)Ò)¨$Ñ/Ô/Ð/r'   r  r	  )r    r   )rt  r   r    r!   r‘   )rt  r   r    rl  )rÉ   r7   r    rl  )r—   r7   r    rl  )r    r†  )r(   r)   r*   r+   r&   r“   rt  rw  ry  r{  r   rq  r  r�  rƒ  r…  rŒ   r  r  s   @r%   rl  rl  Ð  s5  ø€ € € € € ð	ð 	ð Ø#'ð		Gð 	Gð 	Gð 	Gð 	Gð 	Gð 	Gð ð%ð %ð %ñ „Xð%ð0ð 0ð 0ð 0ð$$ð $ð $ð $ð!ð !ð !ð !ð 1?Ô0Fðð ð ð ð ð 1?Ô0Fðð ð ð ð ð
ð 
ð 
ð 
ðð ð ð ð0ð 0ð 0ð 0ð 0ð 0ð 0ð 0r'   rl  c                  ó8   ‡ — e Zd ZdZ	 ddˆ fd	„Zdd„Zdd„Zˆ xZS )ÚFindStatementa¥  A statement document selection on a Collection.

    Args:
        collection (mysqlx.Collection): The Collection object.
        condition (Optional[str]): An optional expression to identify the
                                   documents to be retrieved. If not specified
                                   all the documents will be included on the
                                   result unless a limit is set.
    Nr(  r   r—   r˜   r    r!   c                óN   •— t          ¦   «                              |d|¦  «         d S )NT©r›   r&   rH  s      €r%   r&   zFindStatement.__init__X  s'   ø€ õ 	‰Œ×Ò˜ T¨9Ñ5Ô5Ð5Ð5Ð5r'   rÉ   r7   c                ó   —  | j         |Ž S )zèSets a document field filter.

        Args:
            *fields: The string expressions identifying the fields to be
                     extracted.

        Returns:
            mysqlx.FindStatement: FindStatement object.
        )rÓ   rÌ   s     r%   rÉ   zFindStatement.fields]  s   € ð $ˆtÔ# VÐ,Ð,r'   rÁ   c                ó   —  | j         |Ž S ©zÅSets the sorting criteria.

        Args:
            *clauses: The expression strings defining the sort criteria.

        Returns:
            mysqlx.FindStatement: FindStatement object.
        rö   rÅ   s     r%   r÷   zFindStatement.sorti  rJ  r'   r#   )r(  r   r—   r˜   r    r!   )rÉ   r7   r    r‹  )rÁ   r7   r    r‹  )r(   r)   r*   r+   r&   rÉ   r÷   r  r  s   @r%   r‹  r‹  M  s{   ø€ € € € € ðð ð JNð6ð 6ð 6ð 6ð 6ð 6ð 6ð

-ð 
-ð 
-ð 
-ð	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$r'   r‹  c                  ó<   ‡ — e Zd ZdZdˆ fd„Zdd
„Zdd„Zdd„Zˆ xZS )ÚSelectStatementz¤A statement for record retrieval operations on a Table.

    Args:
        table (mysqlx.Table): The Table object.
        *fields: The fields to be retrieved.
    Útabler   rÉ   r7   r    r!   c                ó`   •— t          ¦   «                              |d¦  «          | j        |Ž  d S rn  )r›   r&   rÓ   ©r$   r“  rÉ   r²   s      €r%   r&   zSelectStatement.__init__}  s3   ø€ Ý‰Œ×Ò˜ Ñ&Ô&Ð&ØˆÔ˜fÐ%Ð%Ð%Ð%r'   r—   c                ó,   — |                       |¦  «        S )zÔSets the search condition to filter.

        Args:
            condition (str): Sets the search condition to filter records.

        Returns:
            mysqlx.SelectStatement: SelectStatement object.
        ró   rÏ   s     r%   rô   zSelectStatement.where�  ó   € ð �Š˜yÑ)Ô)Ð)r'   rÁ   c                ó   —  | j         |Ž S )zÎSets the order by criteria.

        Args:
            *clauses: The expression strings defining the order by criteria.

        Returns:
            mysqlx.SelectStatement: SelectStatement object.
        rö   rÅ   s     r%   Úorder_byzSelectStatement.order_byŒ  rJ  r'   c                ó4  — | j         r
d| j        › �nd}| j        r
d| j        › �nd}| j        r
d| j        › �nd}| j        r
d| j        › �nd}| j        rd| j	        › d| j
        › �nd}d| j        pd	› d
| j        j        › d| j        j        › |› |› |› |› |› �}|S )zYReturns the generated SQL.

        Returns:
            str: The generated SQL.
        z WHERE r5   z
 GROUP BY z HAVING z
 ORDER BY z LIMIT z OFFSET zSELECT Ú*z FROM rG   )r¯   r§   r«   rŸ   r¬   rž   r®   r¥   rª   r¢   r¡   r£   rh   ÚnamerY   )r$   rô   rƒ  r…  r™  r   Ústmts          r%   Úget_sqlzSelectStatement.get_sql—  s  € ð 04¬~ÐEÐ+˜$œ/Ð+Ð+Ð+À2ˆØ8<Ô8IÐQÐ4 Ô 2Ð4Ð4Ð4ÈrˆØ.2¬oÐEÐ*˜DœLÐ*Ð*Ð*À2ˆØ48´MÐIÐ0 ¤Ð0Ð0Ð0Àrˆð Œ~ðÐI�dÔ+ÐIÐI°TÔ5GÐIÐIÐIàð 	ð:�dÔ*Ð1¨cð :ð :Ø”KÔ$ð:ð :Ø'+¤{Ô'7ð:àð:àð:à &ð:à(0ð:à27ð:ð :ð 	ð
 ˆr'   )r“  r   rÉ   r7   r    r!   )r—   r7   r    r’  )rÁ   r7   r    r’  r  )	r(   r)   r*   r+   r&   rô   r™  rž  r  r  s   @r%   r’  r’  u  sƒ   ø€ € € € € ðð ð&ð &ð &ð &ð &ð &ð	*ð 	*ð 	*ð 	*ð	$ð 	$ð 	$ð 	$ðð ð ð ð ð ð ð r'   r’  c                  ó4   ‡ — e Zd ZdZdˆ fd„Zdd
„Zdd„Zˆ xZS )ÚInsertStatementz—A statement for insert operations on Table.

    Args:
        table (mysqlx.Table): The Table object.
        *fields: The fields to be inserted.
    r“  r   rÉ   r   r    r!   c                óh   •— t          ¦   «                              |d¦  «         t          |Ž | _        d S rn  )r›   r&   r4   Ú_fieldsr•  s      €r%   r&   zInsertStatement.__init__¶  s-   ø€ Ý‰Œ×Ò˜ Ñ&Ô&Ð&Ý+:¸FÐ+CˆŒˆˆr'   r-   c                ób   — | j                              t          t          |Ž ¦  «        ¦  «         | S )zÃSet the values to be inserted.

        Args:
            *values: The values of the columns to be inserted.

        Returns:
            mysqlx.InsertStatement: InsertStatement object.
        )r!  r  r2   r4   )r$   r-   s     r%   r-   zInsertStatement.valuesº  s,   € ð 	Œ×Ò�D¥°&Ð!9Ñ:Ô:Ñ;Ô;Ð;Øˆr'   r   c                ó6   — | j                              | ¦  «        S rˆ  )r_   r6  rf   s    r%   rŒ   zInsertStatement.executeÆ  s   € ð Ô×+Ò+¨DÑ1Ô1Ð1r'   )r“  r   rÉ   r   r    r!   )r-   r   r    r   r7  )r(   r)   r*   r+   r&   r-   rŒ   r  r  s   @r%   r   r   ®  su   ø€ € € € € ðð ðDð Dð Dð Dð Dð Dð
ð 
ð 
ð 
ð2ð 2ð 2ð 2ð 2ð 2ð 2ð 2r'   r   c                  óL   ‡ — e Zd ZdZdˆ fd„Zdd	„Zdd„Zdd„Zdd„Zdd„Z	ˆ xZ
S )ÚUpdateStatementzÃA statement for record update operations on a Table.

    Args:
        table (mysqlx.Table): The Table object.

    .. versionchanged:: 8.0.12
       The ``fields`` parameters were removed.
    r“  r   r    r!   c                ó\   •— t          ¦   «                              |d¬¦  «         i | _        d S r  rF  ©r$   r“  r²   s     €r%   r&   zUpdateStatement.__init__Ù  s.   ø€ Ý‰Œ×Ò °ÐÑ7Ô7Ð7Ø+-ˆÔÐÐr'   r—   r7   c                ó,   — |                       |¦  «        S )zÔSets the search condition to filter.

        Args:
            condition (str): Sets the search condition to filter records.

        Returns:
            mysqlx.UpdateStatement: UpdateStatement object.
        ró   rÏ   s     r%   rô   zUpdateStatement.whereÝ  r—  r'   rÁ   c                ó   —  | j         |Ž S )zÎSets the order by criteria.

        Args:
            *clauses: The expression strings defining the order by criteria.

        Returns:
            mysqlx.UpdateStatement: UpdateStatement object.
        rö   rÅ   s     r%   r™  zUpdateStatement.order_byè  rJ  r'   rÔ   c                ó   — | j         S rL  rM  rf   s    r%   rN  zUpdateStatement.get_update_opsó  rì   r'   rZ  rm   r   c                ó`   — t          t          d¦  «        ||¦  «        | j        |<   d| _        | S )a  Updates the column value on records in a table.

        Args:
            field (string): The column name to be updated.
            value (object): The value to be set on the specified column.

        Returns:
            mysqlx.UpdateStatement: UpdateStatement object.
        r=  TrQ  r\  s      r%   rS  zUpdateStatement.setû  s;   € õ #-ÝÐFÑGÔGØØñ#
ô #
ˆÔ˜Ñð
 ˆŒØˆr'   r   c                ób   — | j         st          d¦  «        ‚| j                             | ¦  «        S )z£Execute the statement.

        Returns:
            mysqlx.Result: Result object

        Raises:
            ProgrammingError: If condition was not set.
        z!No condition was found for updaterg  rf   s    r%   rŒ   zUpdateStatement.execute  ri  r'   ©r“  r   r    r!   )r—   r7   r    r¦  )rÁ   r7   r    r¦  r
  )rZ  r7   rm   r   r    r¦  r7  )r(   r)   r*   r+   r&   rô   r™  rN  rS  rŒ   r  r  s   @r%   r¦  r¦  Ï  s«   ø€ € € € € ðð ð.ð .ð .ð .ð .ð .ð	*ð 	*ð 	*ð 	*ð	$ð 	$ð 	$ð 	$ð ð  ð  ð  ðð ð ð ð$2ð 2ð 2ð 2ð 2ð 2ð 2ð 2r'   r¦  c                  ó4   ‡ — e Zd ZdZdˆ fd„Zdd
„Zdd„Zˆ xZS )ÚRemoveStatementaE  A statement for document removal from a collection.

    Args:
        collection (mysqlx.Collection): The Collection object.
        condition (str): Sets the search condition to identify the documents
                         to be removed.

    .. versionchanged:: 8.0.12
       The ``condition`` parameter was added.
    r(  r   r—   r7   r    r!   c                óN   •— t          ¦   «                              ||¬¦  «         d S rE  r�  rH  s      €r%   r&   zRemoveStatement.__init__'  s&   ø€ Ý‰Œ×Ò 
°iÐÑ@Ô@Ð@Ð@Ð@r'   rÁ   c                ó   —  | j         |Ž S r�  rö   rÅ   s     r%   r÷   zRemoveStatement.sort*  rJ  r'   r   c                ób   — | j         st          d¦  «        ‚| j                             | ¦  «        S )rf  z!No condition was found for remove©r¯   r   r_   Úsend_deleterf   s    r%   rŒ   zRemoveStatement.execute5  ri  r'   rj  )rÁ   r7   r    r°  r7  )r(   r)   r*   r+   r&   r÷   rŒ   r  r  s   @r%   r°  r°    su   ø€ € € € € ð	ð 	ðAð Að Að Að Að Að	$ð 	$ð 	$ð 	$ð2ð 2ð 2ð 2ð 2ð 2ð 2ð 2r'   r°  c                  ó<   ‡ — e Zd ZdZdˆ fd„Zdd	„Zdd„Zdd„Zˆ xZS )ÚDeleteStatementz¯A statement that drops a table.

    Args:
        table (mysqlx.Table): The Table object.

    .. versionchanged:: 8.0.12
       The ``condition`` parameter was removed.
    r“  r   r    r!   c                óN   •— t          ¦   «                              |d¬¦  «         d S r  r�  r¨  s     €r%   r&   zDeleteStatement.__init__M  s&   ø€ Ý‰Œ×Ò °ÐÑ7Ô7Ð7Ð7Ð7r'   r—   r7   c                ó,   — |                       |¦  «        S )zÔSets the search condition to filter.

        Args:
            condition (str): Sets the search condition to filter records.

        Returns:
            mysqlx.DeleteStatement: DeleteStatement object.
        ró   rÏ   s     r%   rô   zDeleteStatement.whereP  r—  r'   rÁ   c                ó   —  | j         |Ž S )zÎSets the order by criteria.

        Args:
            *clauses: The expression strings defining the order by criteria.

        Returns:
            mysqlx.DeleteStatement: DeleteStatement object.
        rö   rÅ   s     r%   r™  zDeleteStatement.order_by[  rJ  r'   r   c                ób   — | j         st          d¦  «        ‚| j                             | ¦  «        S )rf  z!No condition was found for deleter´  rf   s    r%   rŒ   zDeleteStatement.executef  ri  r'   r®  )r—   r7   r    r·  )rÁ   r7   r    r·  r7  )	r(   r)   r*   r+   r&   rô   r™  rŒ   r  r  s   @r%   r·  r·  C  sƒ   ø€ € € € € ðð ð8ð 8ð 8ð 8ð 8ð 8ð	*ð 	*ð 	*ð 	*ð	$ð 	$ð 	$ð 	$ð2ð 2ð 2ð 2ð 2ð 2ð 2ð 2r'   r·  c                  ó,   ‡ — e Zd ZdZdˆ fd
„Zdd„Zˆ xZS )ÚCreateCollectionIndexStatementa)  A statement that creates an index on a collection.

    Args:
        collection (mysqlx.Collection): Collection.
        index_name (string): Index name.
        index_desc (dict): A dictionary containing the fields members that
                           constraints the index to be created. It must have
                           the form as shown in the following::

                               {"fields": [{"field": member_path,
                                            "type": member_type,
                                            "required": member_required,
                                            "collation": collation,
                                            "options": options,
                                            "srid": srid},
                                            # {... more members,
                                            #      repeated as many times
                                            #      as needed}
                                            ],
                                "type": type}
    r(  r   Ú
index_namer7   Ú
index_descrÔ   r    r!   c                óÌ   •— t          ¦   «                              |¬¦  «         t          j        |¦  «        | _        || _        | j                             dg ¦  «        | _        d S )N)rY   rÉ   )r›   r&   ÚcopyÚdeepcopyÚ_index_descÚ_index_nameÚpopÚ_fields_desc)r$   r(  r¾  r¿  r²   s       €r%   r&   z'CreateCollectionIndexStatement.__init__‹  s\   ø€ õ 	‰Œ×Ò 
ÐÑ+Ô+Ð+Ý+/¬=¸Ñ+DÔ+DˆÔØ *ˆÔØ26Ô2B×2FÒ2FÀxÐQSÑ2TÔ2TˆÔÐÐr'   r   c                ó

  — | j         €,t          t                               | j         ¦  «        ¦  «        ‚	 t	          | j         ¦  «                             ¦   «                              ¦   «         }t          |t          ¦  «        rF|d         t          d¦  «        k    r,t          t                               | j         ¦  «        ¦  «        ‚nD|j
        t          d¦  «        k    r,t          t                               | j         ¦  «        ¦  «        ‚nF# t          t          f$ r2}t          t                               | j         ¦  «        ¦  «        |‚d}~ww xY w| j        st          d| j        › �¦  «        ‚t          | j        t          ¦  «        st          d¦  «        ‚i }| j         |d<   | j        j        |d<   | j        j        j        |d<   d| j        v r| j                             d¦  «        |d<   nd	|d<   | j                             d
d¦  «        |d
<   |d
         rt)          d¦  «        ‚g |d<   | j        rt          d| j        › �¦  «        ‚	 | j        D �]J}i }|                     d¦  «        |d<   |                     d¦  «        |d<   |                     dd¦  «        |d<   |                     dd¦  «        |d<   t          |d         t*          ¦  «        st-          d¦  «        ‚t          |d         t*          ¦  «        st-          d¦  «        ‚|d                              ¦   «         dk    r|d         st          d¦  «        ‚|d                              ¦   «         d	k    r|d         dk    rt          d¦  «        ‚d|v rp|d                              ¦   «                              d¦  «        s+t          d|d                              ¦   «         › d�¦  «        ‚|                     d¦  «        |d<   d|v rE|d                              ¦   «         dk    rt          d¦  «        ‚|                     d¦  «        |d<   d|v rE|d                              ¦   «         dk    rt          d ¦  «        ‚|                     d¦  «        |d<   |d                              |¦  «         �ŒLn(# t4          $ r}t          d!|› d"|› �¦  «        |‚d}~ww xY w| j        D ]}|rt          d#|› �¦  «        ‚Œ| j                             d$d%d&|¦  «        S )'r5  NÚtypezMysqlx.Expr.Expr.Type.IDENTzCRequired member 'fields' not found in the given index description: z,Required member 'fields' must contain a listrœ  r(  rh   ÚINDEXÚuniqueFz!Unique indexes are not supported.Ú
constraintzUnidentified fields: rZ  ÚmemberÚrequiredÚarrayz'Field member 'required' must be Booleanz$Field member 'array' must be BooleanÚSPATIALzQField member 'required' must be set to 'True' when index type is set to 'SPATIAL'ÚGEOJSONzIIndex 'type' must be set to 'SPATIAL' when field type is set to 'GEOJSON'Ú	collationÚTEXTzCThe 'collation' member can only be used when field type is set to 'ú'ÚoptionszIThe 'options' member can only be used when index type is set to 'GEOJSON'ÚsridzFThe 'srid' member can only be used when index type is set to 'GEOJSON'zRequired inner member z not found in constraint: zUnidentified inner fields: ÚmysqlxÚcreate_collection_indexT)rÄ  r   ÚERR_INVALID_INDEX_NAMEÚformatr   r   Úget_messager1   r¶   r   rÈ  r»   ÚAttributeErrorrÆ  rÃ  r2   r\   rœ  rh   rÅ  r   r9   Ú	TypeErrorÚupperÚ
startswithr  ÚKeyErrorr_   Úexecute_nonquery)r$   Úparsed_identr¾   r  Ú
field_descrË  s         r%   rŒ   z&CreateCollectionIndexStatement.execute–  s±  € ð ÔÐ#Ý"Õ#9×#@Ò#@ÀÔAQÑ#RÔ#RÑSÔSÐSð	Ý% dÔ&6Ñ7Ô7×<Ò<Ñ>Ô>×JÒJÑLÔLˆLõ ˜,­Ñ-Ô-ð 	Ø Ô'­=Ð9VÑ+WÔ+WÒWÐWÝ*Ý.×5Ò5°dÔ6FÑGÔGñô ð ð Xð
  Ô$­Ð6SÑ(TÔ(TÒTÐTÝ*Ý.×5Ò5°dÔ6FÑGÔGñô ð øøõ �NÐ+ð 	ð 	ð 	Ý"Ý&×-Ò-¨dÔ.>Ñ?Ô?ñô àðøøøøð	øøøð Ô ð 	Ý"ð3Ø $Ô 0ð3ð 3ñô ð õ
 ˜$Ô+­TÑ2Ô2ð 	SÝ"Ð#QÑRÔRÐRØ!ˆØÔ'ˆˆV‰Ø!œ\Ô.ˆˆ\ÑØœÔ,Ô1ˆˆX‰Ø�TÔ%Ð%Ð%ØÔ+×/Ò/°Ñ7Ô7ˆD�‰LˆLà"ˆD�‰LØÔ)×-Ò-¨h¸Ñ>Ô>ˆˆX‰à�Œ>ð 	IÝ#Ð$GÑHÔHÐHØˆˆ\ÑàÔð 	OÝ"Ð#M¸4Ô;KÐ#MÐ#MÑNÔNÐNð1	Ø"Ô/ð ,6ñ ,6�
Ø�
Ø'1§~¢~°gÑ'>Ô'>�
˜8Ñ$Ø%/§^¢^°FÑ%;Ô%;�
˜6Ñ"Ø)3¯ª¸
ÀEÑ)JÔ)J�
˜:Ñ&Ø&0§n¢n°W¸eÑ&DÔ&D�
˜7Ñ#Ý! *¨ZÔ"8½$Ñ?Ô?ð OÝ#Ð$MÑNÔNÐNÝ! *¨WÔ"5µtÑ<Ô<ð LÝ#Ð$JÑKÔKÐKØ˜”<×%Ò%Ñ'Ô'¨9Ò4Ð4¸ZÈ
Ô=SÐ4Ý*ð9ñô ð ð ˜”<×%Ò%Ñ'Ô'¨7Ò2Ð2°zÀ&Ô7IÈYÒ7VÐ7VÝ*ð3ñô ð ð  *Ð,Ð,Ø% fÔ-×3Ò3Ñ5Ô5×@Ò@ÀÑHÔHð Ý.ð>à *¨6Ô 2× 8Ò 8Ñ :Ô :ð>ð >ð >ñô ð ð
 /9¯nªn¸[Ñ.IÔ.I�J˜{Ñ+ð  
Ð*Ð*Ø! &Ô)×/Ò/Ñ1Ô1°YÒ>Ð>Ý.ð=ñô ð ð -7¯NªN¸9Ñ,EÔ,E�J˜yÑ)Ø˜ZÐ'Ð'Ø! &Ô)×/Ò/Ñ1Ô1°YÒ>Ð>Ý.ð7ñô ð ð *4¯ª¸Ñ)?Ô)?�J˜vÑ&Ø�\Ô"×)Ò)¨*Ñ5Ô5Ð5Ñ5ðY,6øõZ ð 	ð 	ð 	Ý"ØT¨ÐTÐTÈ
ÐTÐTñô àðøøøøð	øøøð
 Ô+ð 	Sð 	SˆJØð SÝ&Ð'QÀZÐ'QÐ'QÑRÔRÐRðSð Ô×0Ò0ØÐ/°°tñ
ô 
ð 	
s1   µCD ÄEÄ-EÅEÉIR" Ò"
SÒ,SÓS)r(  r   r¾  r7   r¿  rÔ   r    r!   r7  )r(   r)   r*   r+   r&   rŒ   r  r  s   @r%   r½  r½  t  si   ø€ € € € € ðð ð,	Uð 	Uð 	Uð 	Uð 	Uð 	Uðp
ð p
ð p
ð p
ð p
ð p
ð p
ð p
r'   r½  )r-   r   r    r.   )r5   )r6   r7   r8   r7   r    r9   )r6   r7   r8   r7   r    r7   )rD   rE   r8   r7   r    r7   )rM   r7   rN   r7   r8   r7   r    rO   )=r+   Ú
__future__r   rÁ  r¹   rý   Útypingr   r   r   r   r   r	   r
   Ú	constantsr   Údbdocr   Úerrorsr   r   r   r   Úhelpersr   Úprotobufr   Úresultr   r   r   r   Útypesr   r   r   r   r   r   rØ  r   r4   r?   rC   rL   rV   rX   r–   r  r  r'  r9  rC  rl  r‹  r’  r   r¦  r°  r·  r½  r,   r'   r%   ú<module>rì     sÅ  ðð> $Ð #à "Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø €€€à DÐ DÐ DÐ DÐ DÐ DÐ DÐ DÐ DÐ DÐ DÐ DÐ DÐ DÐ DÐ DÐ DÐ Dà %Ð %Ð %Ð %Ð %Ð %Ø Ð Ð Ð Ð Ð Ø 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø #Ð #Ð #Ð #Ð #Ð #Ø ;Ð ;Ð ;Ð ;Ð ;Ð ;Ð ;Ð ;Ð ;Ð ;Ð ;Ð ;ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð BÐ ðð ð ð ð ñ ô ð ðð ð ð ð:ð :ð :ð :ð :ð"ð ð ð ð ð(ð ð ð ð ð  ;=ðð ð ð ð ð,g"ð g"ð g"ð g"ð g"ñ g"ô g"ð g"ðTW"ð W"ð W"ð W"ð W"˜)ñ W"ô W"ð W"ðt
?/ð ?/ð ?/ð ?/ð ?/�9ñ ?/ô ?/ð ?/ðD'"ð '"ð '"ð '"ð '"�Yñ '"ô '"ð '"ðT82ð 82ð 82ð 82ð 82�>ñ 82ô 82ð 82ðv ð  ð  ð  ð  ñ  ô  ð  ðFk2ð k2ð k2ð k2ð k2Ð)ñ k2ô k2ð k2ð\z0ð z0ð z0ð z0ð z0Ð'ñ z0ô z0ð z0ðz%$ð %$ð %$ð %$ð %$�Mñ %$ô %$ð %$ðP6ð 6ð 6ð 6ð 6�mñ 6ô 6ð 6ðr2ð 2ð 2ð 2ð 2�nñ 2ô 2ð 2ðBI2ð I2ð I2ð I2ð I2Ð)ñ I2ô I2ð I2ðX%2ð %2ð %2ð %2ð %2Ð)ñ %2ô %2ð %2ðP.2ð .2ð .2ð .2ð .2Ð)ñ .2ô .2ð .2ðbR
ð R
ð R
ð R
ð R
 Yñ R
ô R
ð R
ð R
ð R
r'   