f> UdZddlmZddlZddlZddlmZmZddlm Z ddl m Z m Z m Z mZmZmZmZmZmZmZmZmZddlmZddlmZdd lmZdd lmZmZm Z dd l!m"Z"dd l#m$Z$m%Z%dd l&m'Z'ddl(m)Z)ddl*m+Z+ddl,m-Z-ddl.m/Z/m0Z0ddl1m2Z2ddl3m4Z4m5Z5m6Z6e rddl7m8Z8eefZ9de:d<dZ;de;zZdZ?dZ@dZAdZBdZCd ZDd ZEd!ZFd"ZGd#ZHd$ZId%ZJdZKdZLdZMd&e:d'<dZNd&e:d(<dZOd&e:d)<d*ZPd+ZQd+ZRd,ZSd-e:d.<d/ZTd-e:d0<d1ZUd2ZVd3ZWdd4ZXdd5ZYddd6ZZejejejejejd7Z`dd8Zadd9Zbdd:Zcdd;Zddd<Zedd=Zfdd>Zgdd?Zhdd@ZiddAZjddBZkddCZlddDZmddEZnddFZoddGZpddHZqddIZrddJZsddKZtddLZuddMZvddNZwexgdOZyddPZz ddQZ{ddRZ|ddSZ}ddTZ~ddUZddVZddWZddXZddYZddZZdd[Zdd\Zdd]Zexgd^Zdd_Zdd`ZddaZddbZddcZdddegiZdfe:dg<idhedieudjezdkehdle$dmepdneadoendpeadqemdrendsecdtegduerdveidwetdxewidyeidzead{ead|ead}eod~epddeadeadeadeedeedeideadeadekdedde%ehedeqedZde:d<eaeeeaedeeeaeevegened Zde:d<e{e|ese+eeieieee}d Zde:d<deddiZde:d<iZde:d<ej)eej+D]\ZZeD]Zeevseeee<ej3Zde:d<ej)egdZde:d<exdjgZddZ d ddZddZ d ddZddZddZexgdZGddZGddeee fZy)z9Functions and classes common to multiple pymongo modules.) annotationsN) OrderedDictabc)get_close_matches) TYPE_CHECKINGAnyCallableIteratorMappingMutableMappingNoReturnOptionalSequenceTypeUnionoverload) unquote_plus)SON)UuidRepresentation) CodecOptionsDatetimeConversion TypeRegistry)RawBSONDocument)validate_compressorsvalidate_zlib_compression_level) DriverInfo)ConfigurationError)_validate_event_listeners) ReadConcern) _MONGOS_MODES _ServerMode) ServerApi)DEFAULT_WRITE_CONCERN WriteConcernvalidate_boolean) ClientSessionzSequence[Type] ORDERED_TYPESiintMAX_MESSAGE_SIZEiz3.6 g?<g4@d Optional[int]MAX_IDLE_TIME_MSMAX_IDLE_TIME_SECWAIT_QUEUE_TIMEOUTT);z Sequence[int]COMMAND_NOT_FOUND_CODES) i@i@UNAUTHORIZED_CODESi'mongodbautoc|}d}|jd}|dk7r|d|t||dzd}}|jdr|dd}||fS)z5Split a host:port string into (host, int(port)) pair.ii:Nr.[)rfindr) startswith)nodehostportidxs W/var/lib/jenkins/workspace/mettalog/venv/lib/python3.12/site-packages/pymongo/common.pypartition_noderHs_ D D **S/C by$3ZT#')_!5d sAbz :cBt|\}}|j|fS)z6Split and normalize a node name from a hello response.)rHlower)rCrDrEs rG clean_noderLs#%JD$ ::< rIcXd|d}|r|ddj|dz }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 suggestionsmsgs rGraise_config_errorrUs= SE #C ' +(>'??yzz S !!rI) unspecifiedstandard pythonLegacy javaLegacy csharpLegacycjt|tr|dvrtd|d|dk(St||S)z8Validates that value is True, False, 'true', or 'false'.)truefalse The value of z must be 'true' or 'false'r\) isinstancestr ValueErrorr%optionvalues rGvalidate_boolean_or_stringresA% ) )}VH4NOP P FE **rIct|tr|St|tr t|St d|d#t$rtd|ddwxYw)zDValidates that 'value' is an integer (or basestring representation).r^z must be an integerNWrong type for z, value must be an integerr_r)r`ra TypeErrorrbs rGvalidate_integerrjsl% E3  Tu:  ofX-GH II T}VH4GHIt S Ts >AcFt||}|dkrtd|d|S)zFValidate that 'value' is a positive integer, which does not include 0.rr^z must be a positive integerrjrarcrdvals rGvalidate_positive_integerros/ 65 )C ax=0KLMM JrIcFt||}|dkrtd|d|S)z1Validate that 'value' is a positive integer or 0.rr^z must be a non negative integerrlrms rGvalidate_non_negative_integerrqs/ 65 )C Qw=0OPQQ JrIcX||St||}t|j|S)z1Validates that 'value' is file-like and readable.)validate_stringopencloserbs rGvalidate_readablervs/ }  FE *EK LrIc"||St||S)z4Validate that 'value' is a positive integer or None.rorbs rG!validate_positive_integer_or_nonerys } $VU 33rIc"||St||S)z9Validate that 'value' is a positive integer or 0 or None.)rqrbs rG%validate_non_negative_integer_or_noner{s } ( 77rIcDt|tr|Std|d)z/Validates that 'value' is an instance of `str`.rgz", value must be an instance of str)r_r`rirbs rGrsrss&% ofX-OP QQrIc"||St||S)z@Validates that 'value' is an instance of `basestring` or `None`.)rsrbs rGvalidate_string_or_noner~s } 65 ))rIct|tr|St|tr t|St d|d#t$r|cYSwxYw)/Validates that 'value' is an integer or string.rgz&, value must be an integer or a stringrhrbs rGvalidate_int_or_basestringrsW% E3  u:  ofX-ST UU L s > A  A ct|tr|St|tr t|}t ||St d|d#t$r|cYSwxYw)rrgz3, value must be an non negative integer or a string)r_r)r`rarqrirms rG'validate_non_negative_int_or_basestringrsc% E3  e*C-VS99 ofX-`a bb L s A AAc|d} t|}d|cxkrdksnt|d|S#t$r t|dt$r t|dwxYw)zXValidates that 'value' is a float, or can be converted to one, and is positive. z must be an integer or floatNrgeAz1 must be greater than 0 and less than one billion)floatrari)rcrderrmsgs rGvalidate_positive_floatrswx3 4F*e  u?s?F8#TUVV L + d* *T)*s /*Ac0|dk(s|dk(ryt||S)zgValidates that 'value' is 0 or a positive float, or can be converted to 0 or a positive float. r0rrbs rGvalidate_positive_float_or_zeror.s! zUc\ "65 11rIc(||St||dz S)cValidates a timeout specified in milliseconds returning a value in floating point seconds. @@rrbs rGvalidate_timeout_or_noner7s  } "65 1F ::rIcV|t|d|dk(s|dk(ryt||dz 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 Nonerrr)rrrbs rGvalidate_timeout_or_zeror@s=  } F8?!;<< zUc\ "65 1F ::rIc:| |dk(s|dk(ryt||dz 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. Nrrrrrbs rG validate_timeout_or_none_or_zerorMs*  } esl "65 1F ::rIc&|yt||dz S)rNr)rrbs rGvalidate_timeoutmsrWs } *65 9F BBrIc0|dk(s|dk(ryt||S)zBValidates maxStalenessSeconds according to the Max Staleness Spec.r?z-1rxrbs rGvalidate_max_stalenessr`s {etm $VU 33rIcBt|tst|d|S)zValidate a read preference.z is not a read preference.)r_r!ridummyrds rGvalidate_read_preferencerhs$ e[ )5)#=>?? LrIc2|tvrt|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 rars rGvalidate_read_preference_moderos$ M!E7"ABCC LrIcLddlm}||vrt|dt||S)z&Validate the authMechanism URI option.r) MECHANISMSz must be in ) pymongo.authrratuple)rcrdrs rGvalidate_auth_mechanismr{s.' JF8<j0A/BCDD LrIcl t|S#t$rt|dttdwxYw)zz not a valid value for N)r_listappendsplitr Exceptionra)namerdtag_setstag_settagstagrRrns rGvalidate_read_preference_tagsrs eT "H b= OOB   TD}}S)99S>S*6s*;\#&'* OOD ! O T{*A$HIt S Ts AB  B&) SERVICE_NAMECANONICALIZE_HOST_NAME SERVICE_REALMAWS_SESSION_TOKEN ENVIRONMENTTOKEN_RESOURCEc  i}t|tst|ts td|j D]\}}t|tr|||<t|t rt|j ||<I|dvrt|tr|||<c|dvr#ddlm }t||s td|||<td|dt||St||}t|}|jd D]s}|jd \}}}|s td |tvr-d |vr td t|dt!td|dk(rt#||||<o|||<u|S)z!Validate authMechanismProperties.zCAuth mechanism properties must be given as a string or a dictionary) ALLOWED_HOSTS) OIDC_CALLBACKOIDC_HUMAN_CALLBACKr) OIDCCallbackz'callback must be an OIDCCallback objectz)Invalid type for auth mechanism property rPrr>z#Malformed auth mechanism propertiesrzPauth mechanism properties must be key:value pairs like AWS_SESSION_TOKEN:z< is not a supported auth mechanism property. Must be one of rOr)r_r`dictraitemsboolrKrpymongo.auth_oidcrtypersrr partition_MECHANISM_PROPSrre)rcrdpropsrRropt_rns rG"validate_auth_mechanism_propertiesrsE eS !%&bc c++-JC%%"c E4( Z--/c ))j.E"c @@:!%6$%NOO"c  #LSEQSTXY^T_S`!abb( FE *E  E{{3mmC( QBC C & &"c) E %6)*+1.  * *3C=E#JE#J+ . LrIcd} t|tj}|st|t st|d|S#t$r3t |dr$t|j tj}Y]wxYw)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) issubclassrr rihasattrrr)rcrd is_mappings rGvalidate_document_classrs JJs'9'9:  j@h5 5  L J 5, '#E$4$4c6H6HIJJsA9A<;A<cR|$t|tst|dt|S)z"Validate the type_registry option.z must be an instance of )r_rrirbs rGvalidate_type_registryrs- E>1{rI)strictreplaceignorecP|tvrt|dtt|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_HANDLERSrarrs rG%validate_unicode_decode_error_handlerrms: 22g345 7  LrIcZ|(t|tjstd|z|S)zValidate the tzinfo optionz)%s must be an instance of datetime.tzinfo)r_datetimetzinforirs rGvalidate_tzinforxs+ E8??!CCeKLL LrIcN||Sddlm}t||st|d|S)rr)AutoEncryptionOptsz* must be an instance of AutoEncryptionOpts)pymongo.encryption_optionsrr_ri)rcrdrs rG%validate_auto_encryption_opts_or_noners2 } = e/ 06("LMNN LrIc|tjSt|tr-|j rtt |St|St|t r t|St |d)z%Validate a DatetimeConversion string.z5 must be a str or int representing DatetimeConversion)rDATETIMEr_r`isdigitr)rirbs rGvalidate_datetime_conversionrsh }!***% ==?%c%j1 1!%(( E3 !%(( vhST UUrIc0|dvrt|d|d|S)z)Validate the serverMonitoringMode option.>r<pollstream=z7 is invalid. Must be one of "auto", "stream", or "poll")rarbs rGvalidate_server_monitoring_moder s0 ..hay W X   LrItlssslzdict[str, list[str]]URI_OPTIONS_ALIAS_MAPappname authmechanismauthmechanismproperties authsource compressorsconnecttimeoutmsdirectconnectionheartbeatfrequencymsjournallocalthresholdms maxidletimems maxconnecting maxpoolsizemaxstalenesssecondsreadconcernlevelreadpreferencereadpreferencetags replicaset retryreads retrywrites loadbalancedserverselectiontimeoutmssockettimeoutmstlsallowinvalidcertificatestlsallowinvalidhostnames tlscafiletlscertificatekeyfiletlscertificatekeyfilepasswordtlsdisableocspendpointcheck tlsinsecurew wtimeoutmszlibcompressionlevel)srvservicename srvmaxhosts timeoutmsservermonitoringmode$dict[str, Callable[[Any, Any], Any]]URI_OPTIONS_VALIDATOR_MAP) connectdriver server_apifsync minpoolsize tlscrlfiletz_awareunicode_decode_error_handleruuidrepresentationwaitqueuemultiplewaitqueuetimeoutmsdatetime_conversionNONSPEC_OPTIONS_VALIDATOR_MAP) document_class type_registryread_preferenceevent_listenersrusernamepasswordserver_selectorauto_encryption_optsauthoidcallowedhosts KW_VALIDATORSzdict[str, str]INTERNAL_URI_OPTION_NAME_MAPzdict[str, tuple[str, str]]URI_OPTIONS_DEPRECATION_MAP VALIDATORS)rrrrr#r$r?z list[str]TIMEOUT_OPTIONScbt||\}}|tvrtd|dt||fS)z,Validate optional authentication parameters.rNz . Must be in )validate _AUTH_OPTIONSr)rcrdrKs rGvalidate_auth_optionrS&s=FE*LE5 M! #3F8=!XYY 5=rIcl|xs|} ||S#t$rt||d}t||YywxYw)Ng?)cutoff)rrrU)rR validators normed_keyrSs rG_get_validatorrX.sE"sJ-*%% -' JsK 3 ,-s  #33c\t|t|j}|||}||fS)zGeneric validation function.rW)rXrNrK)rcrd validators rGrQrQ9s,vzfllnMI fe $E 5=rIc~ttrt}d d}d fd }n i}d d}d d}jD]4\}}||} t|t|}|||} | |||<6|S#t t tf$r.} |r!tjt| dnYd} ~ vd} ~ wwxYw) aaValidate 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|SNxs rGget_normed_keyz-get_validated_options..get_normed_keyOHrIc&j|Sr^) cased_key)raoptionss rGget_setter_keyz-get_validated_options..get_setter_keyRs$$Q' 'rIc"|jSr^)rKr`s rGrbz-get_validated_options..get_normed_keyXs779 rIc|Sr^r_r`s rGrgz-get_validated_options..get_setter_key[rcrIrZr() stacklevelN)rar`returnr`) r__CaseInsensitiveDictionaryrrXr4rarirwarningswarnr`) rfrnvalidated_optionsrbrgrrdrWr[ validatedexcs ` rGget_validated_optionsrr@s'5668  (  mmo U#C(  F&s,ER\]I!#u-I=F nZ8 9& I'9:  c#h156 sA::B<$B77B<c.|jdd|dS)N escCollectionenxcol_.z.escgetencrypted_fieldsrs rG_esc_coll_namerzms   8D61F GGrIc.|jdd|dS)NecocCollectionruz.ecocrvrxs rG_ecoc_coll_namer}qs    0HTF%2H IIrI)r,wtimeoutr-r8jrceZdZdZ d dZed dZed dZd dZeddZ ddZ eddZ y ) BaseObjectzA base class that provides attributes and methods common to multiple pymongo classes. SHOULD NOT BE USED BY DEVELOPERS EXTERNAL TO MONGODB. ct|ts td||_t|tst|d||_t|t s td||_t|ts td||_ 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.zGwrite_concern must be an instance of pymongo.write_concern.WriteConcernzDread_concern must be an instance of pymongo.read_concern.ReadConcern) r_rri_BaseObject__codec_optionsr!_BaseObject__read_preferencer$_BaseObject__write_concernr_BaseObject__read_concern)self codec_optionsrD write_concern read_concerns rG__init__zBaseObject.__init__s-6bc c,/;7"%&  "1-6Y  -, 4bc c*rIc|jS)zdRead only access to the :class:`~bson.codec_options.CodecOptions` of this instance. )rrs rGrzBaseObject.codec_optionss ###rIc|jS)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. )rrs rGrzBaseObject.write_concerns###rIcB|r|jrtS|jS)zBRead only access to the write concern of this instance or session.)in_transactionr#rrsessions rG_write_concern_forzBaseObject._write_concern_fors! w--( (!!!rIc|jS)zRead only access to the read preference of this instance. .. versionchanged:: 3.0 The :attr:`read_preference` attribute is now read only. )rrs rGrDzBaseObject.read_preferences%%%rIcZ|r|jxs |jS|jS)zDRead only access to the read preference of this instance or session.)_txn_read_preferencerrs rG_read_preference_forzBaseObject._read_preference_fors- //1KT5K5K K%%%rIc|jS)zRead only access to the :class:`~pymongo.read_concern.ReadConcern` of this instance. .. versionadded:: 3.2 )rrs rGrzBaseObject.read_concerns"""rIN) rrrDr!rr$rrrkNone)rkr)rkr$)rOptional[ClientSession]rkr$)rkr!)rrrkr!)rkr) __name__ __module__ __qualname____doc__rpropertyrrrrDrrr_rIrGrrys +#+%+$ + " +  +:$$ $$"&&&##rIrceZdZddZddZddZddZddZddZddZ ddZ dd Z ddd Z dd Z d d Zd!dZedd"dZed#dZdd$dZd%dZddZy )&rlcTi|_i|_|jt|i|yr^)%_CaseInsensitiveDictionary__casedkeys _CaseInsensitiveDictionary__datarr)rargskwargss rGrz#_CaseInsensitiveDictionary.__init__s'+-&(  D$)&)*rIc:|j|jvSr^)rKrrrRs rG __contains__z'_CaseInsensitiveDictionary.__contains__syy{dkk))rIc,t|jSr^)rrrs rG__len__z"_CaseInsensitiveDictionary.__len__s4;;rIc(d|jDS)Nc3 K|]}|ywr^r_).0rRs rG z6_CaseInsensitiveDictionary.__iter__..s00s )rrs rG__iter__z#_CaseInsensitiveDictionary.__iter__s0t//00rIctt|Dcic]}|j||j|!c}Scc}wr^)r`rr)rks rG__repr__z#_CaseInsensitiveDictionary.__repr__s3FAD$$Q'Q7FGGFs$5c`|j}||j|<||j|<yr^rKrr)rrRrdlc_keys rG __setitem__z&_CaseInsensitiveDictionary.__setitem__s+#& # FrIc<|j|jSr^)rrKrs rG __getitem__z&_CaseInsensitiveDictionary.__getitem__s{{399;''rIcX|j}|j|=|j|=yr^r)rrRrs rG __delitem__z&_CaseInsensitiveDictionary.__delitem__s'   V $ KK rIct|tjstSt |t |k7ry|D]}||||k7syy)NFT)r_rr NotImplementedrrotherrRs rG__eq__z!_CaseInsensitiveDictionary.__eq__sK%-! ! t9E "CCyE#J&rINcV|jj|j|Sr^)rrwrKrrRdefaults rGrwz_CaseInsensitiveDictionary.gets{{syy{G44rIc|j}|jj|d|jj|g|i|Sr^)rKrpopr)rrRrrrs rGrz_CaseInsensitiveDictionary.popsB VT*t{{v7777rIcz|jj\}}|jj|}||fSr^)rpopitemrr)rrrerds rGrz"_CaseInsensitiveDictionary.popitems8 ,,446  '%rIcl|jj|jjyr^)rclearrrs rGrz _CaseInsensitiveDictionary.clears$   rIcyr^r_rs rG setdefaultz%_CaseInsensitiveDictionary.setdefault  rIcyr^r_rs rGrz%_CaseInsensitiveDictionary.setdefaultrrIc|j}||vr|j|S||j|<||j|<|Sr^)rKrr)rrRrrs rGrz%_CaseInsensitiveDictionary.setdefaultsF $;;;v& &'*D  V $")DKK NrIct|tr|D]}||||j|<y|D] }||||< yr^)r_rlrers rGrz!_CaseInsensitiveDictionary.updatesG e7 8-23ZU__S)*!#JS rIc<|j|jSr^)rrKrs rGrez$_CaseInsensitiveDictionary.cased_key#s ,,rI)rrrr)rRr`rkr)rkr))rkz Iterator[str])rkr`)rRr`rdrrkr)rRr`rkr)rRr`rkr)rrrkrr^)rRr`r Optional[Any]rkr)rRr`rrrrrkr)rktuple[str, Any])rkr)rRr`rrrkr)rRr`rrrkr)rRr`rrrkr)rMapping[str, Any]rkr)rrrrrrrrrrrrrwrrrrrrrer_rIrGrlrls{+ * 1H$ ( 58      '-rIrl)rCr`rkztuple[str, int]r^)rRr`rSOptional[list]rkr )rcr`rdrrkr)rcr`rdrrkr))rcr`rdrrk Optional[str])rcr`rdrrkr2)rcr`rdrrkr`)rcr`rdrrkUnion[int, str])rcrrdrrkr)rcr`rdrrkr)rcr`rdrrkOptional[float])rcrrdrrkr)rrrdrrkr!)rrrdrrkr))rr`rdrrkzlist[dict[str, str]])rcr`rdrrkzdict[str, Union[bool, str]])rcr`rdrrkz2Union[Type[MutableMapping], Type[RawBSONDocument]])rcrrdrrkzOptional[TypeRegistry])rcr`rdrrkr)rcrrdrrkr)rcrrdrrkr)rcr`rdrrkr)rcrrdrrkzOptional[DriverInfo])rcrrdrrkzOptional[ServerApi])rcrrdrrkzOptional[Callable])rrrkr)rrrkr)rrrdr`rkr`)rrrdrrkzOptional[datetime.tzinfo])rcrrdrrkr)rcrrdrrkzOptional[DatetimeConversion])rcr`rdr`rkr`)rcr`rdrrkr)rRr`rVr3rWrrkr )T)rfrrnrrkzMutableMapping[str, Any])ryrrr`rkr)r __future__rrrm collectionsrrdifflibrtypingrrr r r r r rrrrr urllib.parserbsonr bson.binaryrbson.codec_optionsrrr bson.raw_bsonrpymongo.compression_supportrrpymongo.driver_inforpymongo.errorsrpymongo.monitoringrpymongo.read_concernrpymongo.read_preferencesr r!pymongo.server_apir"pymongo.write_concernr#r$r%pymongo.client_sessionr&r'__annotations__ MAX_BSON_SIZEr*MIN_WIRE_VERSIONMAX_WIRE_VERSIONMAX_WRITE_BATCH_SIZEMIN_SUPPORTED_SERVER_VERSIONMIN_SUPPORTED_WIRE_VERSIONMAX_SUPPORTED_WIRE_VERSIONHEARTBEAT_FREQUENCYKILL_CURSOR_FREQUENCYEVENTS_QUEUE_FREQUENCYSERVER_SELECTION_TIMEOUTMIN_HEARTBEAT_INTERVALMIN_SRV_RESCAN_INTERVALCONNECT_TIMEOUT MAX_POOL_SIZE MIN_POOL_SIZEMAX_CONNECTINGr3r4r5LOCAL_THRESHOLD_MS RETRY_WRITES RETRY_READSr8r:_MAX_END_SESSIONSSRV_SERVICE_NAMESERVER_MONITORING_MODErHrLrU UNSPECIFIEDSTANDARD PYTHON_LEGACY JAVA_LEGACY CSHARP_LEGACYrrerjrorqrvryr{rsr~rrrrrrrrrrrrrr frozensetrrrrrrrrrrrrrrrrrrrrr r r4rArKrLrMrroptnamealiasesaliascopyrNrOrRrSrXrQrrrzr}WRITE_CONCERN_OPTIONSrr`rlr_rIrGr s @"(%    &*MM)+-8,?(WW4!$k 2 ~2 M)#) %   #'-&$(='%)M(  */.%7M6  "&11"++&44$00&44 + J48R* V c&2; ;;C4  * 0f 7*(   H ?"++J!K  V E7/+'C ''C,'CA'C/ 'C ' 'C 8 'C2'C4'C)'C7'C-'C.'C8'C1'C/'C 3!'C"7#'C$)%'C&,''C(-)'C*.+'C, 8-'C.7/'C0 %1'C2"#=3'C4 :5'C6"7'C8.9'C:$%<;'C<"#=='C>-?'C@ 0A'CB/C'CD;E'CF&0#;M'C?'X*%- '0#*$I6>27 GC &.+/0''3A) 7 3 $ 50n ;7  !>?-335GW 1 1/H/Q %e ,6 4M3Q3Q3S 0S - 456 ]a- ->-LY- -.2* *&***ZHJ ""Z[S#S#lU-S!9U-rI