
    ]*i
                    D   U d Z ddlmZ ddlZddlZddlmZmZ ddlm	Z	 ddl
mZmZ ddlmZmZmZmZmZmZmZmZmZmZmZmZ ddlmZ dd	lmZ dd
lmZ ddl m!Z!m"Z"m#Z# ddl$m%Z% ddl&m'Z'm(Z( ddl)m*Z* ddl+m,Z, ddl-m.Z. ddl/m0Z0 ddl1m2Z2m3Z3 ddl4m5Z5 ddl6m7Z7m8Z8m9Z9 erddl:m;Z; eefZ<de=d<   dZ>dZ?dZ@dZAdZBdZCdZDdZEdZFdZGdZHd ZId!ZJd"ZKd#ZLd$ZMdZNd%ZOdZPd&e=d'<   dZQd&e=d(<   dZRd&e=d)<   d*ZSd+ZTd+ZUd,ZVd-e=d.<   d/ZWd-e=d0<   d1ZXd2ZYd3ZZd4gZ[dd5Z\dd6Z]ddd7Z^ej                  ej                  ej                  ej                  ej                  d8Zddd9Zedd:Zfdd;Zgdd<Zhdd=Zidd>Zjdd?Zkdd@ZlddAZmddBZnddCZoddDZpddEZqddFZrddGZsddHZtddIZuddJZvddKZwddLZxddMZyddNZzddOZ{ e|g dP      Z}ddQZ~	 	 	 	 	 	 ddRZddSZddTZddUZddVZddWZddXZddYZddZZdd[Zdd\Zdd]Zdd^Z e|g d_      Zdd`ZddaZddbZddcZdddZdedfgiZdge=dh<   i diedjeydke~dleldme'dnetdoeedperdqeedreqdserdtegduekdvevdwemdxexdye{i dzemd{eed|eed}eed~esdetdeeedeedeedeideidemdeedeedeodehde(eleheuedZde=d<   eeeeeeeheieeeezekeredZde=d<   eeewe.eememeeed
Zde=d<   dfdeiZde=d<   i Zde=d<   ej1                  e       ej3                         D ]  \  ZZeD ]  Zeevsee   ee<     ej;                         Zde=d<   ej1                  e       g dZde=d<    e|dkg      ZddZ	 d	 	 	 	 	 	 	 ddZddZ	 d	 	 	 	 	 ddZddZddZ e|g d      Z G d d      Z G d deeef         ZddZ G d deedf         ZddZy)z9Functions and classes common to multiple pymongo modules.    )annotationsN)OrderedDictabc)get_close_matches)requiresversion)TYPE_CHECKINGAnyCallableIteratorMappingMutableMappingNoReturnOptionalSequenceTypeUnionoverload)unquote_plus)SON)UuidRepresentation)CodecOptionsDatetimeConversionTypeRegistry)RawBSONDocument)validate_compressorsvalidate_zlib_compression_level)
DriverInfo)ConfigurationError)_validate_event_listeners)ReadConcern)_MONGOS_MODES_ServerMode)	ServerApi)DEFAULT_WRITE_CONCERNWriteConcernvalidate_boolean)_AgnosticClientSessionzSequence[Type[Any]]ORDERED_TYPESi   i li z4.2      
         g      ?<   g      4@d      Optional[int]MAX_IDLE_TIME_MSMAX_IDLE_TIME_SECWAIT_QUEUE_TIMEOUT   T);   zSequence[int]COMMAND_NOT_FOUND_CODES)   i@  i@  UNAUTHORIZED_CODESi'  mongodbautoCANONICALIZE_HOST_NAMEc                    | }d}| j                  d      }|dk7  r| d| t        | |dz   d       }}|j                  d      r|dd }||fS )z5Split a host:port string into (host, int(port)) pair.ii  :Nr-   [)rfindint
startswith)nodehostportidxs       H/home/alumno/antonio/venv/lib/python3.12/site-packages/pymongo/common.pypartition_noderJ      s_    DD
**S/C
by$3ZT#')_!5dsAbz:    c                B    t        |       \  }}|j                         |fS )z6Split and normalize a node name from a hello response.)rJ   lower)rE   rF   rG   s      rI   
clean_noderN      s#    %JD$ ::<rK   c                X    d|  d}|r|ddj                  |       dz  }t        |      )z1Raise ConfigurationError with the given key name.Unknown option: .z Did you mean one of (, z:) or maybe a camelCase version of one? Refer to docstring.)joinr   )keysuggestionsmsgs      rI   raise_config_errorrW      s=    SE
#C'		+(>'??yzz
S
!!rK   )unspecifiedstandardpythonLegacy
javaLegacycsharpLegacyc                j    t        |t              r|dvrt        d|  d      |dk(  S t        | |      S )z8Validates that value is True, False, 'true', or 'false'.)truefalseThe value of z must be 'true' or 'false'r^   )
isinstancestr
ValueErrorr'   optionvalues     rI   validate_boolean_or_stringrg      sA    %))}VH4NOPPFE**rK   c                    t        |t              r|S t        |t              r	 t        |      S t	        d|  dt        |             # t        $ r t        d|  d      dw xY w)zDValidates that 'value' is an integer (or basestring representation).r`   z must be an integerNWrong type for z , value must be an integer, not ra   rC   rb   rc   	TypeErrortyperd   s     rI   validate_integerrm      su    %	E3		Tu: ofX-MdSXk][
\\  	T}VH4GHItS	Ts   
A	 	A#c                F    t        | |      }|dk  rt        d|  d      |S )zFValidate that 'value' is a positive integer, which does not include 0.r   r`   z must be a positive integerrm   rc   re   rf   vals      rI   validate_positive_integerrr      s/    
65
)C
ax=0KLMMJrK   c                F    t        | |      }|dk  rt        d|  d      |S )z1Validate that 'value' is a positive integer or 0.r   r`   z must be a non negative integerro   rp   s      rI   validate_non_negative_integerrt      s/    
65
)C
Qw=0OPQQJrK   c                X    ||S t        | |      }t        |      j                          |S )z1Validates that 'value' is file-like and readable.)validate_stringopencloserd   s     rI   validate_readablery      s/    } FE*EKLrK   c                "    ||S t        | |      S )z4Validate that 'value' is a positive integer or None.rr   rd   s     rI   !validate_positive_integer_or_noner|      s    }$VU33rK   c                "    ||S t        | |      S )z9Validate that 'value' is a positive integer or 0 or None.)rt   rd   s     rI   %validate_non_negative_integer_or_noner~      s    }(77rK   c                Z    t        |t              r|S t        d|  dt        |             )z/Validates that 'value' is an instance of `str`.ri   z(, value must be an instance of str, not )ra   rb   rk   rl   rd   s     rI   rv   rv      s2    %
ofX-UVZ[`VaUbc
ddrK   c                "    ||S t        | |      S )z@Validates that 'value' is an instance of `basestring` or `None`.)rv   rd   s     rI   validate_string_or_noner     s    }65))rK   c                    t        |t              r|S t        |t              r	 t        |      S t	        d|  dt        |             # t        $ r |cY S w xY w)/Validates that 'value' is an integer or string.ri   z,, value must be an integer or a string, not rj   rd   s     rI   validate_int_or_basestringr     se    %	E3		u: 
&!MdSXk][   	L	s   
A	 	AAc                    t        |t              r|S t        |t              r	 t        |      }t	        | |      S t        d|  dt        |             # t        $ r |cY S w xY w)r   ri   z9, value must be an non negative integer or a string, not )ra   rC   rb   rc   rt   rk   rl   rp   s      rI   'validate_non_negative_int_or_basestringr     st    %	E3		e*C -VS99

&!Z[_`e[fZgh   	L	s   A A#"A#c                    |  d}	 t        |      }d|cxk  rdk  sn t        |  d      |S # t        $ r t        |      dt        $ r t        |      dw xY w)zXValidates that 'value' is a float, or can be converted to one, and is
    positive.
    z must be an integer or floatNr   g    eAz1 must be greater than 0 and less than one billion)floatrc   rk   )re   rf   errmsgs      rI   validate_positive_floatr   %  sw     x34F*e u?s?F8#TUVVL  + d* *T)*s	   / *Ac                0    |dk(  s|dk(  ryt        | |      S )zgValidates that 'value' is 0 or a positive float, or can be converted to
    0 or a positive float.
    r   0r   rd   s     rI   validate_positive_float_or_zeror   8  s!     zUc\"6511rK   c                (    ||S t        | |      dz  S )cValidates a timeout specified in milliseconds returning
    a value in floating point seconds.
         @@r   rd   s     rI   validate_timeout_or_noner   A  s      }"651F::rK   c                V    |t        |  d      |dk(  s|dk(  ryt        | |      dz  S )zValidates a timeout specified in milliseconds returning
    a value in floating point seconds for the case where None is an error
    and 0 is valid. Setting the timeout to nothing in the URI string is a
    config error.
    z cannot be Noner   r   r   )r   r   rd   s     rI   validate_timeout_or_zeror   J  s=     } F8?!;<<zUc\"651F::rK   c                :    |
|dk(  s|dk(  ryt        | |      dz  S )zValidates a timeout specified in milliseconds returning
    a value in floating point seconds. value=0 and value="0" are treated the
    same as value=None which means unlimited timeout.
    Nr   r   r   r   rd   s     rI    validate_timeout_or_none_or_zeror   W  s*    
 }
esl"651F::rK   c                &    |yt        | |      dz  S )r   Nr   )r   rd   s     rI   validate_timeoutmsr   a  s     }*659FBBrK   c                0    |dk(  s|dk(  ryt        | |      S )zBValidates maxStalenessSeconds according to the Max Staleness Spec.r@   z-1r{   rd   s     rI   validate_max_stalenessr   j  s    {etm$VU33rK   c                B    t        |t              st        |d      |S )zValidate a read preference.z is not a read preference)ra   r#   rk   dummyrf   s     rI   validate_read_preferencer   r  s$    e[)5)#<=>>LrK   c                2    |t         vrt        | d      |S )zValidate read preference mode for a MongoClient.

    .. versionchanged:: 3.5
       Returns the original ``value`` instead of the validated read preference
       mode.
    z is not a valid read preference)r"   rc   r   s     rI   validate_read_preference_moder   y  s$     M!E7"ABCCLrK   c                L    ddl m} ||vrt        |  dt        |             |S )z&Validate the authMechanism URI option.r   )
MECHANISMSz must be in )pymongo.auth_sharedr   rc   tuple)re   rf   r   s      rI   validate_auth_mechanismr     s.    .JF8<j0A/BCDDLrK   c                l    	 t         |   S # t        $ r t        | dt        t                      dw xY w)z<Validate the uuid representation option selected in the URI.z3 is an invalid UUID representation. Must be one of N)_UUID_REPRESENTATIONSKeyErrorrc   r   r   s     rI   validate_uuid_representationr     sN    $U++ g *+,.
 		s    (3c                R   t        |t              s|g}g }|D ]n  }|dk(  r|j                  i        	 i }|j                  d      D ]-  }|j                  d      \  }}t	        |      |t	        |      <   / |j                  |       p |S # t
        $ r t        |d|        dw xY w)z5Parse readPreferenceTags if passed as a client kwarg. ,r?   z not a valid value for N)ra   listappendsplitr   	Exceptionrc   )namerf   tag_setstag_settagstagrT   rq   s           rI   validate_read_preference_tagsr     s    eT"%'H Tb=OOB	TD}}S) <99S>S*6s*;\#&'< OOD!T O  	T{*A$HItS	Ts   ABB&)SERVICE_NAMESERVICE_HOSTr=   SERVICE_REALMAWS_SESSION_TOKENENVIRONMENTTOKEN_RESOURCEc           	     <   i }t        |t              st        |t              st        dt	        |             |j                         D ]  \  }}t        |t              r|||<   t        |t              rt        |      j                         ||<   I|dv rt        |t              r|||<   c|dv r/ddl	m
} t        ||      st        dt	        |             |||<   t        d| dt	        |              |S t        | |      }t        |      }|j                  d	      D ]t  }|j                  d
      \  }}}|st        d      |t        vr,d|v rt        d      t        | dt!        t                     |dk(  rddlm}  ||      ||<   p|||<   v |S )z!Validate authMechanismProperties.zIAuth mechanism properties must be given as a string or a dictionary, not )ALLOWED_HOSTS)OIDC_CALLBACKOIDC_HUMAN_CALLBACKr   )OIDCCallbackz-callback must be an OIDCCallback object, not z)Invalid type for auth mechanism property rR   r   r?   z#Malformed auth mechanism propertiesr   zPauth mechanism properties must be key:value pairs like AWS_SESSION_TOKEN:<token>z< is not a supported auth mechanism property. Must be one of r=   ) _validate_canonicalize_host_name)ra   rb   dictrc   rl   itemsboolrM   r   pymongo.auth_oidc_sharedr   rv   r   r   	partition_MECHANISM_PROPSr   r   r   )	re   rf   propsrT   r   opt_rq   r   s	            rI   "validate_auth_mechanism_propertiesr     s   EeS!%&[\`af\g[hi   ++- 	cJC%%"c
E4( Z--/c
))j.E"c
@@A!%6$'TUYZ_U`Ta%bcc"c
 #LSEQSTXY^T_S`!abb	c FE*EE{{3 mmC(QBCC&&"c) E 
 % 6)*+-  **L9#>E#JE#J/2 LrK   c                    d}	 t        |t        j                        }|st        |t              st        |  d      |S # t        $ r3 t	        |d      r$t        |j
                  t        j                        }Y ]w xY w)z#Validate the document_class option.F
__origin__zg must be dict, bson.son.SON, bson.raw_bson.RawBSONDocument, or a subclass of collections.MutableMapping)
issubclassr   r   rk   hasattrr   r   )re   rf   
is_mappings      rI   validate_document_classr     s     JJs'9'9:
 j@h 5 5
 	

 L  J5,'#E$4$4c6H6HIJJs   A   9A<;A<c                R    |$t        |t              st        |  dt               |S )z"Validate the type_registry option.z must be an instance of )ra   r   rk   rd   s     rI   validate_type_registryr     s-    E<!@6(":<.IJJLrK   c                X    t        |t              st        |  dt        |             |S )z!Validates that 'value' is a list.z must be a list, not )ra   r   rk   rl   rd   s     rI   validate_listr     s,    eT"6("7U}EFFLrK   c                "    ||S t        | |      S )z)Validates that 'value' is a list or None.)r   rd   s     rI   validate_list_or_noner     s    }''rK   c                `    t        |t        j                  t        f      st	        |  d      y)z/Validates that 'value' is a list or a document.zu must either be a list or an instance of dict, bson.son.SON, or any other type that inherits from collections.MappingN)ra   r   r   r   rk   rd   s     rI   validate_list_or_mappingr     s6    eckk401h " "
 	
 2rK   c                T    t        |t        j                        st        |  d      y)z=Validate the type of method arguments that expect a document.zd must be an instance of dict, bson.son.SON, or any other type that inherits from collections.MappingN)ra   r   r   rk   rd   s     rI   validate_is_mappingr   '  s1    eS[[)h " "
 	
 *rK   c                `    t        |t        j                  t        f      st	        |  d      y)zEValidate the type of method arguments that expect a MongoDB document.z must be an instance of dict, bson.son.SON, bson.raw_bson.RawBSONDocument, or a type that inherits from collections.MutableMappingN)ra   r   r   r   rk   rd   s     rI   validate_is_document_typer   1  s9    ec00/BCh ) )
 	
 DrK   c                |    ||S t        | |       t        |j                  d            dkD  rt        |  d      |S )zValidate the appname option.zutf-8   z must be <= 128 bytes)rv   lenencoderc   rd   s     rI   validate_appname_or_noner   <  sD    }FE"
5<< !C'F8#89::LrK   c                J    ||S t        |t              st        |  d      |S ) Validate the driver keyword arg.z" must be an instance of DriverInfo)ra   r   rk   rd   s     rI   validate_driver_or_noner   G  s.    }eZ(6("DEFFLrK   c                `    ||S t        |t              st        |  dt        |             |S )z$Validate the server_api keyword arg.z' must be an instance of ServerApi, not )ra   r$   rk   rl   rd   s     rI   validate_server_api_or_noner   P  s6    }eY'6("I$u+WXXLrK   c                V    ||S t        |      st        |  dt        |             |S )z%Validates that 'value' is a callable.z must be a callable, not )callablerc   rl   rd   s     rI   validate_is_callable_or_noner   Y  s3    }E?F8#<T%[MJKKLrK   c                    t        d|        | rBt        | t              s1t        t	        |             }|j                  d      rt        d      yyy)z Validate a replacement document.replacement$z'replacement can not include $ operatorsN)r   ra   r   nextiterrD   rc   )r   firsts     rI   validate_ok_for_replacer   b  sN    {3:k?CT+&'C FGG ! D{rK   c                    t        d|        | st        d      t        | t               }t	        t        |             }|r|j                  d      st        d      yy)zValidate an update document.updatezupdate cannot be emptyr   z"update only works with $ operatorsN)r   rc   ra   r   r   r   rD   )r   is_documentr   s      rI   validate_ok_for_updater   l  s[    Xv.122 ..KfE5++C0=>> 1{rK   )strictreplaceignorec                P    |t         vrt        | dt        t                      |S )zAValidate the Unicode decode error handler option of CodecOptions.z< is an invalid Unicode decode error handler. Must be one of )_UNICODE_DECODE_ERROR_HANDLERSrc   r   r   s     rI   %validate_unicode_decode_error_handlerr   |  s:    22g 3457
 	

 LrK   c                Z    |(t        |t        j                        st        d|z        |S )zValidate the tzinfo optionz)%s must be an instance of datetime.tzinfo)ra   datetimetzinfork   r   s     rI   validate_tzinfor     s+    E8??!CCeKLLLrK   c                d    ||S ddl m} t        ||      st        |  dt	        |             |S )r   r   )AutoEncryptionOptsz0 must be an instance of AutoEncryptionOpts, not )pymongo.encryption_optionsr  ra   rk   rl   )re   rf   r  s      rI   %validate_auto_encryption_opts_or_noner    s>    }=e/06("RSWX]S^R_`aaLrK   c                   |t         j                  S t        |t              r-|j	                         rt        t        |            S t         |   S t        |t
              rt        |      S t        |  dt        |             )z%Validate a DatetimeConversion string.z; must be a str or int representing DatetimeConversion, not )r   DATETIMEra   rb   isdigitrC   rk   rl   rd   s     rI   validate_datetime_conversionr    sv    }!***%==?%c%j11!%((	E3	!%((
(MdSXk][ rK   c                0    |dvrt        |  d|d      |S )z)Validate the serverMonitoringMode option.>   r<   pollstream=z7 is invalid. Must be one of "auto", "stream", or "poll")rc   rd   s     rI   validate_server_monitoring_moder    s0    ..hay WX
 	
 LrK   tlssslzdict[str, list[str]]URI_OPTIONS_ALIAS_MAPappnameauthmechanismauthmechanismproperties
authsourcecompressorsconnecttimeoutmsdirectconnectionheartbeatfrequencymsjournallocalthresholdmsmaxidletimemsmaxconnectingmaxpoolsizemaxstalenesssecondsreadconcernlevelreadpreferencereadpreferencetags
replicaset
retryreadsretrywritesloadbalancedserverselectiontimeoutmssockettimeoutmstlsallowinvalidcertificatestlsallowinvalidhostnames	tlscafiletlscertificatekeyfiletlscertificatekeyfilepasswordtlsdisableocspendpointchecktlsinsecurew
wtimeoutmszlibcompressionlevel)srvservicenamesrvmaxhosts	timeoutmsservermonitoringmode$dict[str, Callable[[Any, Any], Any]]URI_OPTIONS_VALIDATOR_MAP)connectdriver
server_apifsyncminpoolsize
tlscrlfiletz_awareunicode_decode_error_handleruuidrepresentationwaitqueuemultiplewaitqueuetimeoutmsdatetime_conversionNONSPEC_OPTIONS_VALIDATOR_MAP)
document_classtype_registryread_preferenceevent_listenersr   usernamepasswordserver_selectorauto_encryption_optsauthoidcallowedhostsKW_VALIDATORSzdict[str, str]INTERNAL_URI_OPTION_NAME_MAPzdict[str, tuple[str, str]]URI_OPTIONS_DEPRECATION_MAP
VALIDATORS)r  r  r  r  r&  r'  rB  z	list[str]TIMEOUT_OPTIONSc                b    t        | |      \  }}|t        vrt        d|  dt               | |fS )z,Validate optional authentication parameters.rP   z. Must be in )validate_AUTH_OPTIONSr   )re   rf   rM   s      rI   validate_auth_optionrV  7  s=    FE*LE5M! #3F8=!XYY5=rK   c                l    |xs | }	 ||   S # t         $ r t        ||d      }t        | |       Y y w xY w)Ng?)cutoff)r   r   rW   )rT   
validators
normed_keyrU   s       rI   _get_validatorr[  ?  sE     "sJ-*%% -'
JsK3,-s    #33c                \    t        | t        | j                               } || |      }| |fS )zGeneric validation function.rZ  )r[  rQ  rM   )re   rf   	validators      rI   rT  rT  J  s,    vzfllnMIfe$E5=rK   c                   
 t         t              rt               }dd}d fd}n
i }dd}dd} j                         D ]4  \  }} ||      }	 t        |t        |      } |||      }	|	| ||      <   6 |S # t
        t        t        f$ rY
|dk(  r&t        
fdt        D              rdt        
      vr |r!t        j                  t        
      d	
       n Y d

d

ww xY w)aa  Validate each entry in options and raise a warning if it is not valid.
    Returns a copy of options with invalid entries removed.

    :param opts: A dict containing MongoDB URI options.
    :param warn: If ``True`` then warnings will be logged and
          invalid options will be ignored. Otherwise, invalid options will
          cause errors.
    c                    | S N xs    rI   get_normed_keyz-get_validated_options.<locals>.get_normed_key`      HrK   c                &    j                  |       S ra  )	cased_key)rd  optionss    rI   get_setter_keyz-get_validated_options.<locals>.get_setter_keyc  s    $$Q''rK   c                "    | j                         S ra  )rM   rc  s    rI   re  z-get_validated_options.<locals>.get_normed_keyi  s    779rK   c                    | S ra  rb  rc  s    rI   rj  z-get_validated_options.<locals>.get_setter_keyl  rf  rK   r]  r  c              3  8   K   | ]  }|t              v   y wra  )rb   ).0pexcs     rI   	<genexpr>z(get_validated_options.<locals>.<genexpr>w  s     E!SXEs   z*is not a supported auth mechanism propertyr1   )
stacklevelN)rd  rb   returnrb   )ra   _CaseInsensitiveDictionaryr   r[  r7  rc   rk   r   any_MECH_PROP_MUST_RAISErb   warningswarn)ri  rx  validated_optionsre  rj  r   rf   rZ  r^  	validatedrp  s   `         @rI   get_validated_optionsr{  Q  s     '5668		( 		 mmo F
U#C(
	F&s,ER\]I!#u-I =FnZ89#F$  I'9: 
	77E/DEE@CPc#h15 6
	s   A;;C(AC##C(c                .    | j                  dd| d      S )NescCollectionenxcol_.z.escgetencrypted_fieldsr   s     rI   _esc_coll_namer    s    8D61FGGrK   c                .    | j                  dd| d      S )NecocCollectionr~  z.ecocr  r  s     rI   _ecoc_coll_namer    s     0HTF%2HIIrK   )r/  wtimeoutr0  r;  jr  c                      e Zd ZdZ	 	 	 	 	 	 	 	 	 	 d
dZedd       Zedd       ZddZedd       Z	ddZ
edd       Zy	)
BaseObjectzA base class that provides attributes and methods common
    to multiple pymongo classes.

    SHOULD NOT BE USED BY DEVELOPERS EXTERNAL TO MONGODB.
    c                J   t        |t              st        d      || _        t        |t              st        |d      || _        t        |t              st        dt        |             || _        t        |t              st        dt        |             || _
        y )NzDcodec_options must be an instance of bson.codec_options.CodecOptionszR is not valid for read_preference. See pymongo.read_preferences for valid options.zMwrite_concern must be an instance of pymongo.write_concern.WriteConcern, not zJread_concern must be an instance of pymongo.read_concern.ReadConcern, not )ra   r   rk   _codec_optionsr#   _read_preferencer&   rl   _write_concernr!   _read_concern)selfcodec_optionsrG  write_concernread_concerns        rI   __init__zBaseObject.__init__  s     -6bcc+/;7"% &  
 !0-6_`der`s_tu  ,,4\]abn]o\pq  *rK   c                    | j                   S )zdRead only access to the :class:`~bson.codec_options.CodecOptions`
        of this instance.
        )r  r  s    rI   r  zBaseObject.codec_options  s    
 """rK   c                    | j                   S )zRead only access to the :class:`~pymongo.write_concern.WriteConcern`
        of this instance.

        .. versionchanged:: 3.0
          The :attr:`write_concern` attribute is now read only.
        )r  r  s    rI   r  zBaseObject.write_concern  s     """rK   c                B    |r|j                   rt        S | j                  S )zBRead only access to the write concern of this instance or session.)in_transactionr%   r  r  sessions     rI   _write_concern_forzBaseObject._write_concern_for  s!     w--((!!!rK   c                    | j                   S )zRead only access to the read preference of this instance.

        .. versionchanged:: 3.0
          The :attr:`read_preference` attribute is now read only.
        )r  r  s    rI   rG  zBaseObject.read_preference  s     $$$rK   c                Z    |r|j                         xs | j                  S | j                  S )zDRead only access to the read preference of this instance or session.)_txn_read_preferencer  r  s     rI   _read_preference_forzBaseObject._read_preference_for  s-     //1JT5J5JJ$$$rK   c                    | j                   S )zRead only access to the :class:`~pymongo.read_concern.ReadConcern`
        of this instance.

        .. versionadded:: 3.2
        )r  r  s    rI   r  zBaseObject.read_concern  s     !!!rK   N)
r  CodecOptions[Any]rG  r#   r  r&   r  r!   rs  None)rs  r  )rs  r&   )r   Optional[_AgnosticClientSession]rs  r&   )rs  r#   )r  r  rs  r#   )rs  r!   )__name__
__module____qualname____doc__r  propertyr  r  r  rG  r  r  rb  rK   rI   r  r    s    *(* %* $	*
 "* 
*> # # # #" % %% " "rK   r  c                      e Z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
dd	ZdddZddZd dZd!dZedd"d       Zed#d       Zdd$dZd%dZddZy
)&rt  c                T    i | _         i | _        | j                  t        |i |       y ra  )%_CaseInsensitiveDictionary__casedkeys _CaseInsensitiveDictionary__datar   r   )r  argskwargss      rI   r  z#_CaseInsensitiveDictionary.__init__  s'    +-&(D$)&)*rK   c                :    |j                         | j                  v S ra  )rM   r  r  rT   s     rI   __contains__z'_CaseInsensitiveDictionary.__contains__  s    yy{dkk))rK   c                ,    t        | j                        S ra  )r   r  r  s    rI   __len__z"_CaseInsensitiveDictionary.__len__  s    4;;rK   c                (    d | j                   D        S )Nc              3      K   | ]  }|  y wra  rb  )rn  rT   s     rI   rq  z6_CaseInsensitiveDictionary.__iter__.<locals>.<genexpr>  s     00s   )r  r  s    rI   __iter__z#_CaseInsensitiveDictionary.__iter__  s    0t//00rK   c                t    t        | D ci c]  }| j                  |   | j                  |   ! c}      S c c}w ra  )rb   r  r  )r  ks     rI   __repr__z#_CaseInsensitiveDictionary.__repr__  s3    FAD$$Q'Q7FGGFs   $5c                `    |j                         }|| j                  |<   || j                  |<   y ra  rM   r  r  )r  rT   rf   lc_keys       rI   __setitem__z&_CaseInsensitiveDictionary.__setitem__  s+    #& #FrK   c                <    | j                   |j                            S ra  )r  rM   r  s     rI   __getitem__z&_CaseInsensitiveDictionary.__getitem__  s    {{399;''rK   c                X    |j                         }| j                  |= | j                  |= y ra  r  )r  rT   r  s      rI   __delitem__z&_CaseInsensitiveDictionary.__delitem__  s'    V$KKrK   c                    t        |t        j                        st        S t	        |       t	        |      k7  ry|D ]  }| |   ||   k7  s y y)NFT)ra   r   r   NotImplementedr   r  otherrT   s      rI   __eq__z!_CaseInsensitiveDictionary.__eq__  sP    %-!!t9E
" 	CCyE#J&	 rK   Nc                V    | j                   j                  |j                         |      S ra  )r  r  rM   r  rT   defaults      rI   r  z_CaseInsensitiveDictionary.get  s    {{syy{G44rK   c                    |j                         }| j                  j                  |d         | j                  j                  |g|i |S ra  )rM   r  popr  )r  rT   r  r  r  s        rI   r  z_CaseInsensitiveDictionary.pop  sB    VT*t{{v7777rK   c                z    | j                   j                         \  }}| j                  j                  |      }||fS ra  )r  popitemr  r  )r  r  rh  rf   s       rI   r  z"_CaseInsensitiveDictionary.popitem  s8     ,,446	'%rK   c                l    | j                   j                          | j                  j                          y ra  )r  clearr  r  s    rI   r  z _CaseInsensitiveDictionary.clear  s$     rK   c                     y ra  rb  r  s      rI   
setdefaultz%_CaseInsensitiveDictionary.setdefault#      rK   c                     y ra  rb  r  s      rI   r  z%_CaseInsensitiveDictionary.setdefault'  r  rK   c                    |j                         }|| v r| j                  |   S || j                  |<   || j                  |<   |S ra  )rM   r  r  )r  rT   r  r  s       rI   r  z%_CaseInsensitiveDictionary.setdefault+  sF    $;;;v&&'*DV$")DKKNrK   c                    t        |t              r|D ]  }||   | |j                  |      <    y |D ]
  }||   | |<    y ra  )ra   rt  rh  r  s      rI   r   z!_CaseInsensitiveDictionary.update4  sQ    e78 8-23ZU__S)*8  '!#JS	'rK   c                <    | j                   |j                            S ra  )r  rM   r  s     rI   rh  z$_CaseInsensitiveDictionary.cased_key<  s    		,,rK   )r  r
   r  r
   )rT   rb   rs  r   )rs  rC   )rs  zIterator[str]rs  rb   )rT   rb   rf   r
   rs  r  )rT   rb   rs  r
   )rT   rb   rs  r  )r  r
   rs  r   ra  )rT   rb   r  Optional[Any]rs  r
   )rT   rb   r  r
   r  r
   rs  r
   )rs  tuple[str, Any])rs  r  )rT   rb   r  r  rs  r  )rT   rb   r  r
   rs  r
   )rT   rb   r  r  rs  r  )r  Mapping[str, Any]rs  r  )r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r   rh  rb  rK   rI   rt  rt    s{    +
* 1H$
( 
	58
 
    '-rK   rt  c                 0    	 ddl m}  y# t        $ r Y yw xY w)zIs the C extension installed?r   	_cmessageTF)pymongor  ImportErrorr  s    rI   has_cr  @  s    % s   	 	c                  l     e Zd ZdZd fdZed	d
d       Zedd       Zedd       ZddZ	ddZ
 xZS )Versionz4A class that can be used to compare version strings.c                Z    | j                  |d      }t        | 	  | t        |            S )N   )_paddedsuper__new__r   )clsr   padded_version	__class__s      rI   r  zVersion.__new__M  s)    Wa0wsE.$9::rK   c                    t        |      }t        |      |k  r-t        |t        |      z
        D ]  }|j                  |        |S ra  )r   r   ranger   )r  r   lengthpaddingas_listr   s         rI   r  zVersion._paddedQ  sE    t*w<& 6CL01 (w'(rK   c                   d}d}|j                  d      r|dd }d}n1|j                  d      r|dd }d}n|j                  d      r|dd }d}d	|v r|d|j                  d	       }d}d
|v r|d|j                  d
       }d}nd|v r|d|j                  d       }d}d}|j                  d      D cg c]  }t        |       }}| j	                  |d      }|r|dxx   dz  cc<    |j
                  |       t        | S c c}w )Nr   F+r@   r-   z-pre--z.devz-rcTrQ      )endswithfindr   rC   r  r   r  )r  version_stringmodbump_patch_levelpartr   s         rI   from_stringzVersion.from_stringY  s@    ""3'+Ab1NC$$W-+Ab1NC$$S)+Ab1NC^#+A0C0CF0KLNCN"+A0C0CE0JKNCN"+A0C0CC0HINC#)7)=)=c)BC3t9CC++gq) BK1Ks   Ds   3Dc                f    t        |      }|d   dk  rd|d<   | j                  |d      }t        | S )Nr@   r   r  )r   r  r  )r  version_arrayr   s      rI   from_version_arrayzVersion.from_version_array  s;    }%2;?GBK++gq)  rK   c                    | t        | k\  S ra  )r  )r  other_versions     rI   at_leastzVersion.at_least  s    w...rK   c                @    dj                  t        t        |             S )NrQ   )rS   maprb   r  s    rI   __str__zVersion.__str__  s    xxC''rK   )r   rC   rs  r  )r   )r   r
   r  rC   r  rC   rs  z	list[int])r  rb   rs  r  )r  r
   rs  r  )r  r
   rs  r   r  )r  r  r  r  r  classmethodr  r  r  r  r  __classcell__)r  s   @rI   r  r  J  sR    >;   %! %!N ! !/(rK   r  .c                L   t        |       }t        j                  |      }t        d      }|J |D cg c]  }|j	                  |       s| c}d   }d|v r|j                  d      d   }||j                  d      dz   d }|t        j                  |      k\  }|||fS c c}w )z<Test whether an installed package is of the desired version.r  Nr   ;z>=r1   )r   r  r  r   rD   r   r  )package_namepackage_version_strpackage_versionrequirementsirequirementrequired_versionis_valids           rI   check_for_min_versionr    s    !,/))*=>O
 I&L###*Iall<.H1I!LK
k!'',Q/";#3#3D#9A#=#?@'"5"56F"GGH 0(:: Js   B!B!)rE   rb   rs  ztuple[str, int]ra  )rT   rb   rU   zOptional[list[str]]rs  r   )re   rb   rf   r
   rs  r   )re   rb   rf   r
   rs  rC   )re   rb   rf   r
   rs  Optional[str])re   rb   rf   r
   rs  r2   )re   rb   rf   r
   rs  rb   )re   rb   rf   r
   rs  Union[int, str])re   r
   rf   r
   rs  r  )re   rb   rf   r
   rs  r   )re   rb   rf   r
   rs  Optional[float])re   r
   rf   r
   rs  r  )r   r
   rf   r
   rs  r#   )r   r
   rf   r
   rs  rC   )r   rb   rf   r
   rs  zlist[dict[str, str]])re   rb   rf   r
   rs  zdict[str, Union[bool, str]])re   rb   rf   r
   rs  z<Union[Type[MutableMapping[str, Any]], Type[RawBSONDocument]])re   r
   rf   r
   rs  zOptional[TypeRegistry])re   rb   rf   r
   rs  z	list[Any])re   r
   rf   r
   rs  zOptional[list[Any]])re   r
   rf   r
   rs  r  )re   rb   rf   r
   rs  r  )re   r
   rf   r
   rs  zOptional[DriverInfo])re   r
   rf   r
   rs  zOptional[ServerApi])re   r
   rf   r
   rs  zOptional[Callable[..., Any]])r   r  rs  r  )r   r
   rs  r  )r   r
   rf   rb   rs  rb   )r   r
   rf   r
   rs  zOptional[datetime.tzinfo])re   r
   rf   r
   rs  r  )re   r
   rf   r
   rs  zOptional[DatetimeConversion])re   rb   rf   rb   rs  rb   )re   rb   rf   r
   rs  r  )rT   rb   rY  r6  rZ  r  rs  zCallable[[Any, Any], Any])T)ri  r  rx  r   rs  zMutableMapping[str, Any])r  r  r   rb   rs  r
   )rs  r   )r
  rb   rs  ztuple[str, str, bool])r  
__future__r   r   rw  collectionsr   r   difflibr   importlib.metadatar   r   typingr	   r
   r   r   r   r   r   r   r   r   r   r   urllib.parser   bsonr   bson.binaryr   bson.codec_optionsr   r   r   bson.raw_bsonr   pymongo.compression_supportr   r   pymongo.driver_infor   pymongo.errorsr   pymongo.monitoringr    pymongo.read_concernr!   pymongo.read_preferencesr"   r#   pymongo.server_apir$   pymongo.write_concernr%   r&   r'   pymongo.typingsr(   r)   __annotations__MAX_BSON_SIZEMAX_MESSAGE_SIZEMIN_WIRE_VERSIONMAX_WIRE_VERSIONMAX_WRITE_BATCH_SIZEMIN_SUPPORTED_SERVER_VERSIONMIN_SUPPORTED_WIRE_VERSIONMAX_SUPPORTED_WIRE_VERSIONHEARTBEAT_FREQUENCYKILL_CURSOR_FREQUENCYEVENTS_QUEUE_FREQUENCYSERVER_SELECTION_TIMEOUTMIN_HEARTBEAT_INTERVALMIN_SRV_RESCAN_INTERVALCONNECT_TIMEOUTMAX_POOL_SIZEMIN_POOL_SIZEMAX_CONNECTINGr3   r4   r5   LOCAL_THRESHOLD_MSRETRY_WRITESRETRY_READSr8   r:   _MAX_END_SESSIONSSRV_SERVICE_NAMESERVER_MONITORING_MODErv  rJ   rN   rW   UNSPECIFIEDSTANDARDPYTHON_LEGACYJAVA_LEGACYCSHARP_LEGACYr   rg   rm   rr   rt   ry   r|   r~   rv   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   	frozensetr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r7  rD  rN  rO  rP  r   r   optnamealiasesaliascopyrQ  rR  rU  rV  r[  rT  r{  r  r  WRITE_CONCERN_OPTIONSr  rb   rt  r  r   rC   r  r  rb  rK   rI   <module>rM     s    @ "   ( % 0    &  * M M ) + - 8 , ? ( W W6 '*;%7" 7 #      %                    #' - & $( = ' %) M (     */  . %7 M 6        22 	" &11"++&44$00&44 +	]48e*&2;
;;C4		* 
 4nA*(


H
? "++J!K 	" 
E7/ + 'C''C,'C A'C /	'C
 ''C 8'C 2'C 4'C )'C 7'C -'C .'C 8'C 1'C /'C  3!'C" 7#'C$ )%'C& ,''C( -)'C* .+'C,  8-'C. 7/'C0 
%1'C2 "#=3'C4  :5'C6 "7'C8 .9'C: $%<;'C< "#=='C> -?'C@ 	0A'CB /C'CD ;E'CF &0#;M'C ? 'X *%-'0#*$I6>27G C & .+/0''3A)73 $ 
50 n 	; 7 	     !> ?-335 RGW R11/H/Q%e,RR 4M3Q3Q3S
0 S 
  -    456 ]a-	->-LY-- .200&*00fHJ
 ""Z[ U" U"pU-S!9 U-pC(eCHo C(L;rK   