Files
boc/aamos-ledger-rust/target/debug/deps/liblock_api-0e8055cd433fa267.rmeta
T

629 lines
279 KiB
Plaintext
Raw Normal View History

rust
¤Z#rustc 1.96.0 (ac68faa20 2026-05-25)ÁíàÄTËŸ ÜJîÄ)'ß\¥!-3d1337db07d0b3aeÁ
scopeguardÁ’‰‘p ÒÞa¢ßöéqÓB-29f0bdb2ea82739eÁ¤°ð ¾ä-±($²ï=©Ã-7e98a21bfd32b0edÁ¤»arc_lockÁ¤™ K÷»É¤Ï ManuallyDropÁd¨»É¤‚ µ ݻɤ¼
StableAddressÁl»
owning_refÁ´é DeserializeÁ\È»serdeÁŒ¨ DeserializerÁdÕ»ì"$ SerializeÁLã»ì?A
SerializerÁTî»ì]_
ArcMutexGuardÁl³Â»É¤µÁËKû»É¤ÓËð»É¤†Ëµ á»É¤À˨l–»Á´íËջ쌬Ëû»ìË»ì,¸»ìAArcReentrantMutexGuardÁ´èá»É¤áà»K÷»É¤Ï»ð»É¤‚»µ ݻɤ¼»¨l’»Á´é»Õ»ìŒ¨»û»ì»»ì,¸»ìAArcRwLockReadGuardÁ”š¥»É¤›¤»ArcRwLockWriteGuardÁœÄ»É¤ÅŒ»ArcRwLockUpgradableReadGuardÁ䵫»É¤¶ªí_ GuardSendÁ
ˆ GuardNoSendÁ
ˆmutexÁ        RawMutexÁINITÁ GuardMarkerÁlockÁtry_lockÁunlockÁ is_lockedÁ  RawMutexFairÁ unlock_fairÁbumpÁ 
RawMutexTimedÁDurationÁInstantÁ try_lock_forÁtry_lock_untilÁ ¤"£"¥"@"dataÁ '£'¥ *£*¥ -£-¥-æ -
into_innerÁ 2£2¥2from_rawÁ2 const_newÁ 7£7¥7make_guard_uncheckedÁ7¾ 7É 7get_mutÁ7å 7 force_unlockÁ7@7data_ptrÁ B£B¥Bforce_unlock_fairÁ F£F¥FÖ
Fé
 K£K¥K> O£O¥O÷  S£S¥S×VLockedPlaceholderÁW
VY× 
['aÁ[£[¥  _Ú_£_¥_ê_Ød¦d_try_mapÁg¦g_try_map_or_errÁj¦jj_unlockedÁnn¦_leakÁ  rÚr£r¥rˆ
r
unlocked_fairÁww¦rš
 
{Ú{£{¥{å{´ Ú£¥ Ú£¥ã Ú£¥× Ú£¥× Ú£¥ Ú£¥ Ú£¥Ø¡¦¡¦¤¦¤Â§¦§§ «Ú«£«¥«ˆ
 °Ú°£°¥°å°´ Ú£¥ »Ú»£»¥»ã ÀÚÀ£À¥À× ÅÚţťÅ×remutexÁËËËËËËËËËË Ë
Ë Ë Ë
ËËËËË GetThreadIdÁÞ¡ Þnonzero_thread_idÁËRawReentrantMutexÁá£á˜áownerÁá
lock_countÁáêá
get_thread_idÁËè£è˜Ëë£ë˜Ëî£î˜î¡ î
lock_internalÁòî¾ ô îÉ ö îØ îå îis_owned_by_current_threadÁËû£û˜ûˆ
ûš
Ë£˜é
ƒ Ö
 ËReentrantMutexÁ£˜¥@ Ë£˜¥Ë£˜¥Ë£˜¥æ á Ë£˜¥  Ë ¡£¡˜¡¥¡µ ¡¾ ¡É ¡Þ ¡å ¡¬¡ó ¡@¡Œ
Ë
®£®˜®¥®­
Ë ³£³˜³¥³Ö
³é
Ë ¹£¹˜¹¥¹>Ë
¾£¾˜¾¥¾÷ËãØåÃ×ǯÈ
ÇÊ×ËÌỤ̘̥́ËÑÚÑ£Ñ˜Ñ¥ÑœÑØ×¦×ѦڦÚÑÂݦÝÝÑìáá¦ËäÚä£ä˜ä¥äˆ
ä´êê¦äš
ËîÚî£î˜î¥îåî´ËõÚõ£õ˜õ¥õãËûÚû£û˜û¥û×ËÚ£˜¥×ËÚ£˜¥ËŒÚŒ£Œ˜Œ¥ŒØ¦Œ¦¦ŒÂ¦ËÚ£˜¥ˆ
ˡڡ£¡˜¡¥¡å¡´Ë¨Ú¨£¨˜¨¥¨ãˮڮ£®˜®¥®×Ë´Ú´£´˜´¥´×rwlockÁ»»»»»»»» RawRwLockÁá ì à lock_sharedÁÃtry_lock_sharedÁÃ
unlock_sharedÁÃlock_exclusiveÁÃtry_lock_exclusiveÁÃunlock_exclusiveÁÃå Ãis_locked_exclusiveÁ»
RawRwLockFairÁÎunlock_shared_fairÁÎunlock_exclusive_fairÁÎ bump_sharedÁÎbump_exclusiveÁ»RawRwLockDowngradeÁÓ downgradeÁ»RawRwLockTimedÁÕ¹
ÕÈ
Õtry_lock_shared_forÁÕtry_lock_shared_untilÁÕtry_lock_exclusive_forÁÕtry_lock_exclusive_untilÁ»RawRwLockRecursiveÁÜlock_shared_recursiveÁÜtry_lock_shared_recursiveÁ»RawRwLockRecursiveTimedÁßtry_lock_shared_recursive_forÁßtry_lock_shared_recursive_untilÁ»RawRwLockUpgradeÁâlock_upgradableÁâtry_lock_upgradableÁâunlock_upgradableÁâupgradeÁâ try_upgradeÁ»RawRwLockUpgradeFairÁèunlock_upgradable_fairÁèbump_upgradableÁ»RawRwLockUpgradeDowngradeÁëdowngrade_upgradableÁëdowngrade_to_upgradableÁ»RawRwLockUpgradeTimedÁîtry_lock_upgradable_forÁîtry_lock_upgradable_untilÁîtry_upgrade_forÁîtry_upgrade_untilÁ»Òó£ó¥ó@ó »ø£ø¥»û£û¥»þ£þ¥þæ þá »ƒ£ƒ¥ƒ ƒ »ˆ£ˆ¥ˆmake_read_guard_uncheckedÁˆmake_write_guard_uncheckedÁˆreadÁˆtry_readÁˆwriteÁˆ try_writeÁˆÞ ˆå ˆÛ%ˆforce_unlock_readÁˆforce_unlock_writeÁˆ@ˆŒ
»˜£˜¥˜force_unlock_read_fairÁ˜force_unlock_write_fairÁ»£¥ try_read_forÁtry_read_untilÁ
try_write_forÁtry_write_untilÁ»¤£¤¥¤read_recursiveÁ¤try_read_recursiveÁ»©£©¥©try_read_recursive_forÁ©try_read_recursive_untilÁ» ®£®¥®make_upgradable_guard_uncheckedÁ®upgradable_readÁ®try_upgradable_readÁ»
´£´¥´try_upgradable_read_forÁ´try_upgradable_read_untilÁ» ¹£¹¥¹>» ½£½¥½÷»
Á£Á¥Á׻ţť»ÈÚȣȥÈú#ÈØÍ¦ÍȦЦÐÈÂÓ¦ÓÓÈì×צ»ÚÚÚ£Ú¥Úˆ
Ú´ßߦښ
»ãÚã£ã¥ãåã´»éÚé£é¥éã»îÚî£î¥î×»óÚó£ó¥ó×»ø£ø¥»ûÚû£û¥ûú#ûئû¦ƒ¦ƒû¦û슊¦»Ú£¥…'»Ú£¥ˆ,»Ú£¥ˆ
´œœ¦š
» Ú £ ¥ å ´»¦Ú¦£¦¥¦»«Ú«£«¥«ã»°Ú°£°¥°×»µÚµ£µ¥µ×»ºÚº£º¥» ¾Ú¾£¾¥¾ú#¾ìÃæ¾Ø*¾ç*»!ÈÚȣȥȈ
È´ÍͦȚ
»"ÑÚѣѥх'Ñ
with_upgradedÁÖRetÁÖÑtry_with_upgradedÁÙ‡>Ù»#ÜÚܣܥ܄-Ü›-»$âÚâ£â¥âtry_with_upgraded_forÁæ‡>æâtry_with_upgraded_untilÁé‡>é»%ìÚì£ì¥ìåì´»&òÚò£ò¥òã»'÷Ú÷£÷¥÷×»(üÚü£ü¥ü×»)Ú£¥»*Ú£¥»+Ú£¥Ø¦¦¦try_map_or_elseÁ¦»,Ú£¥ˆ
»-œÚœ£œ¥œåœ´».¢Ú¢£¢¥¢ã»/§Ú§£§¥§×»0¬Ú¬£¬¥¬×»1±Ú±£±¥»2µÚµ£µ¥»3¹Ú¹£¹¥¹Ø½¦½¹¦À¦À¹ÂæÃû4ÇÚǣǥLj
»5ÌỤ̥́ÌåÌ´»6ÒÚÒ£Ò¥Ò»7×Ú×£×¥×ã»8ÜÚܣܥÜ×»9áÚá£á¥á× ¥çÚç£ç¥çêçÚn w  MappedMutexGuardÁïÚï£ï¥ï@ï ïÚËReentrantMutexGuardÁöÚö£ö˜ö¥öœöÚá ê ËMappedReentrantMutexGuardÁÿÚÿ£ÿ˜ÿ¥ÿ@ÿ ÿÚ»ÓÚ£¥ú#Ú× ß »ÔÚ£¥ú#ÚŠ œ »RwLockUpgradableReadGuardÁÚ£¥ú#ÚÃ Í Ö Ù æ é »MappedRwLockReadGuardÁ£Ú£££¥£@£ £Ú»MappedRwLockWriteGuardÁªÚª£ª¥ª@ª ªÚ






!
:
;
<
=
>
?
@
A
E
I
J
V
V
V
Z
Z
Z
c
d
g
j
n
w
z


Š






¡
¤
§
µ
º
¿
Ä
Ä
Ä
É
É
É
à
ò
ô
ö
ø
ù
ú
þ
ÿ
ƒ

¥
¦
§
¨
©
ª
«
¬
­
²
·
¸
Ç
Ç
Ç
Ë
Ë
Ë
Ö
×
Ú
Ý
á
ê
í
ô
ú









§
­
³
³
³
¹
¹
¹
Æ
Ç
È
É
Ê
Ë
Ì
Í
Ï
Ð
Ñ
Ò
Ô
Ø
Ù
Ú
Û
Ý
Þ
à
á
ã
ä
å
æ
ç
é
ê
ì
í
ï
ð
ñ
ò

Œ

Ž










œ
 
¡
¢
£
§
¨
¬
­
±
²
³
·
¸
Ä
Ä
Ä
Å
Ì
Í
Ð
Ó
×
ß
â
è
í
ò
ò
ò
÷
÷
÷
ø
ÿ

ƒ

Š
œ
Ÿ
¥
ª
¯
´
´
´
¹
¹
¹
Â
Ã
Í
Ð
Ö
Ö
Ù
Ù
æ
æ
é
é
ñ
ö
û
û
û






¡
¦
«
«
«
°
°
°
½
À
Ã
Ñ
Ö
Û
à
à
à
å
å
å
ÞÃÎÓÕÜßâèëî É ˆ ºÁê%B=Ó+Ìì""¤%@ &  5á»I'yÆD£¥ ¶W³¶Wé¶WïW¿c¶W¿cWWX¯ A\ƒ]t•ÇX çç¥ëê ìÚ 3ÙbŽd¥Ú£¥é!ÑXö!ÑXŒ"ÑX¿cÑXÄcÑX ïïÃGó@ ô  õÚ ?ÌBC½ÚY•YÌìÔYé!ÔYö!ÔYŒ"ÔY¿cÔYÄcÔYÌìáá¹äâËåïËæêËçËK§ˆˆ*¹^ÃéW˜ çZÌì¢@ËŒ Ëë<×ù„òä€éW¼[•Y Ô[³Ô[éÔ[•Y¿cÔ[¿cÈÈɯ œ5›X¦ ööŠHûœËüÚËë*÷\B!5ÚY˜¥é!õ\Œ"õ\¿cõ\Äcõ\ ÿÿßH@Ë ËÚË::¸×Ÿ¸ÚY¸]¾]é!ó]Œ"ó]¿có]Äcó]ÌìóóÒö@»÷ »$ÌÏ–)Ú>³éWïW ÷^³÷^é÷^ïW¿c÷^ Óú#»ŒÚ»Ù'u˜K³š8Y•Yé!Óú#»ŒÚ»Ù'u˜K³šÚY•YŒ"´`¿c´`Äc´` Ôú#»Ú»JúÙ68Y•Yé!Ôú#»Ú»JúÙ6ÚY•Yö!ëaŒ"ëa¿cëaÄcëa «Jú#»œÚ»Îj»“·ÛÚY•Yé!àbŒ"àb¿càbÄcàb ££’K§@»¨ »©Ú»âª4`TÚY•YÌìÕcé!ÕcŒ"Õc¿cÕcÄcÕc ªªÞK®@»¯ »°Ú»šPR‹Eí»ËÚY•YÌìàdé!àdö!àdŒ"àd¿càdÄcàd
*"[çïëáÌöÿûóÅøº£±ª'"™ïèáøó£µªK¹óO½óS"YWçÀïÃÊÈûö®ÿÁóî°÷§£Üª{ç°ïîö¡ÿã ìœ£Ìªçï¦Òªç»ïõö¨ÿé«ò¢£×ªçÅïö´ÿóµü¬£áª èÌì]³/é¿cé! ^ö!>Œ" Äc ?<ö*éWéW¤‘+¡+
"|+
õ0ïW3D ¤+üÝ*S "éWïW ¯+¶+ü«*‹0¶W\Ç*ïW¼*éWæî0î0
UnsafeCellÁð0»Ì-·}—KEüC£ïWïW¹[ŠFéWéWL•.¤².Â.
"|².×j-> Å.üü-U "éWïW Ð.×.ü·- 5¶W\æ-éWLÍ-ïWÛ-éWÝókÑïWÐ raw_mutexÁ3¹7oL¢1­1ô“1
 t“1
5éWïWJ<2 °1·1üÍ0j6¶W\ý0éWLä0ïWò0éW¬ïW Úm#¹'^œ

ŒÄ ®>

‚/žq ОqAéWéWß¼[¼[üú áéW¼[ üã¯ñçZ¤]¤]V¦]Á‚]üß3ø¤”&žq\á.á.aã.»Ì-IÜžB2®žqOéW¼[ûŸ%éWéWß¼[¼[¤¢=²=
"|¢=
õ0•Y3D µ=üÉ=¿œô=
„ô=…q …>žq;d¥>
L¥>Èq ¯>žq< <Ê>éWéW<ò>ß¼[¼[È áéW¼[ ‡?üÿ<” éW¼[•Y ’?™?üÁ<Ø Ô[¼Ý<•YÒ<î0î0ýjð0»Ì-·}—KEüC£•Y•YçZÀ–s¾ËséWO¼[8¹r¢péWéW`ß¼[¼[¤ãBóB
"|ãBôt-> öBüŠC¸œµC
„µC…q ÆCžq;dæC
LæCÈq ðCžq< LD  l¦D

¯ áéW¼[ 
ÁD
 üÀB éW¼[•Y ÌDÓD ÒDüÝAöŸ Ô[¼žBéWLóA¼[lB•Y“B”xç•YççZ­–s«ËstéW<¼[1ÚmVZ¹^ LHlHœHüóG-

tóG
ŸéW¼[•YbTF< ŸH¦HüG— Ô[¼ÑGéWL¦G¼[l´G•YÆGéWÚ¼[ΕYÂÚm37¹;}¤ÈjØj
"|Èj×j-> Ûj<ïjÄéWéWü­jT óéWïW €k‡küúi÷^d–jïW‹jókÓïWÒéW¹!Q¯ÄéWéW¤»nËn
"|»n×j-> ÎnTânü nW óéWïW önýn ünüÙm¤÷^d‰néWTïmïWþmókáïWàéW¥
raw_rwlockÁ4¹8qTþqŠrüïq

tïq
éWïWL>4 r”rü§qm÷^dØqéWT¾qïWÍqéW¯ïW£´ƒ$¹(`¤ #®ˆ ‰e:3óÖ­0X_f´Œ #W. 7> Ë»í_T†Êõ d•Ê¥
ʤ,ã'"Ê\
Þº¹Œ”Ảtá8º«$L» Ãæö%l×Îæë&”é)Óæ't£.Õæ²(”Š7ÜæŠ)¼–:ßæõ)„Â@âæú*¤âHèæË+Ì Pëæ§,¬£UîæÒ4ªbóæ¥T̆çÊÃG„ÄãïÊŠHœ¡¥öºßHÌÁÿºÓ|´ëæÔ„ÆÄæ«JÌ»¼æ’K¬¥œ£æÞK´ðɪæüÍ»üÍOL This library provides type-safe and fully-featured [`Mutex`] and [`RwLock`]ÁüHE types which wrap a simple raw mutex or rwlock type. This has severalÁüæGD benefits: not only does it eliminate a large portion of the work inÁü®OL implementing custom lock types, it also allows users to write code which isÁüþ;8 generic with regards to different lock implementations.Áºúü¾63 Basic usage of this crate is very straightforward:ÁõúüùOL 1. Create a raw lock type. This should only contain the lock state, not anyÁüÉ" data protected by the lock.Áüì@= 2. Implement the `RawMutex` trait for your custom lock type.Áü­C@ 3. Export your mutex as a type alias for `lock_api::Mutex`, andÁüñC@ your mutex guard as a type alias for `lock_api::MutexGuard`.Áüµ52 See the [example](#example) below for details.ÁëúüïNK This process is similar for [`RwLock`]s, except that two guards need to beÁü¾ OL exported instead of one. (Or 3 guards if your type supports upgradable readÁüŽ
GD locks, see [extension traits](#extension-traits) below for details)ÁÖ
ú
# ExampleÁè
ú
 ```Áüô
/, use lock_api::{RawMutex, Mutex, GuardSend};Áü¤ 2/ use std::sync::atomic::{AtomicBool, Ordering};Á× úüÛ " // 1. Define our raw lock typeÁüþ '$ pub struct RawSpinlock(AtomicBool);Á¦ úüª *' // 2. Implement RawMutex for this typeÁüÕ *' unsafe impl RawMutex for RawSpinlock {Áü€
FC const INIT: RawSpinlock = RawSpinlock(AtomicBool::new(false));ÁÇ
úüË
LI // A spinlock guard can be sent to another thread and unlocked thereÁü˜%" type GuardMarker = GuardSend;Á¾úÄ fn lock(&self) {ÁüÛOL // Note: This isn't the best way of implementing a spinlock, but itÁü«52 // suffices for the sake of this example.Áüá%" while !self.try_lock() {}ÁL‡úü•$! fn try_lock(&self) -> bool {Á”º self.0ÁüÍTQ .compare_exchange(false, true, Ordering::Acquire, Ordering::Relaxed)ÁÄ¢ .is_ok()Á¹›ÅúüÉ! unsafe fn unlock(&self) {Áüë30 self.0.store(false, Ordering::Release);Á¹›¯úü³TQ // 3. Export the wrappers. This are the types that your users will actually use.Áüˆ;8 pub type Spinlock<T> = lock_api::Mutex<RawSpinlock, T>;ÁüÄMJ pub type SpinlockGuard<'a, T> = lock_api::MutexGuard<'a, RawSpinlock, T>;Á<‚•šú´ž # Extension traitsÁµúü¹OL In addition to basic locking & unlocking functionality, you have the optionÁü‰KH of exposing additional functionality in your lock types by implementingÁüÕEB additional traits for it. Examples of extension features include:ÁúüŸ63 - Fair unlocking (`RawMutexFair`, `RawRwLockFair`)ÁüÖ74 - Lock timeouts (`RawMutexTimed`, `RawRwLockTimed`)ÁüŽ85 - Downgradable write locks (`RawRwLockDowngradable`)ÁüÇ1. - Recursive read locks (`RawRwLockRecursive`)Áüù0- - Upgradable read locks (`RawRwLockUpgrade`)Áªúü®OL The `Mutex` and `RwLock` wrappers will automatically expose this additionalÁüþIF functionality if the raw lock type implements these extension traits.ÁÈú¤Ì # Cargo featuresÁáúüå-* This crate supports three cargo features:Áúü—RO - `owning_ref`: Allows your lock types to be used with the `owning_ref` crate.Áüêkh - `arc_lock`: Enables locking from an `Arc`. This enables types such as `ArcMutexGuard`. Note that thisÁüÖ/, requires the `alloc` crate to be present.Á Ë»ít_u tÊõ sÊ¥
rʤq"ÊpÞº¹oẢnº«$mÃæö%lÎæë&kÓæ'jÕæ²(iÜæŠ)hßæõ)gâæú*fèæË+eëæ§,dîæÒcóæ¥bçÊÃG`ïÊŠH^öºßH\ÿºÓZæÔXæ«JVæ’KT£æÞKRªæY\_¼ùW3üÅIF Marker type which indicates that the Guard type for a lock is `Send`.Áô†‰e:3óÖ­0ô†¼4ô†
¤üªMJ Marker type which indicates that the Guard type for a lock is not `Send`.Á\—WºÁê%B=Ó+ ï‡W 3ï‡W
ï‡ü® W,×ïýjTÝî0  ×ó ` 
PhantomDataÁ\Š ÷± í¡ë r,¶é! DerefMutÁD½ö! ´Ñ™LíŒÌütL›SLªGI02̹üü! Basic operations for a mutex.Ážúü¢KH Types implementing this trait can be used by `Mutex` to form a safe andÁüî! fully-functioning mutex type.Áúd” # SafetyÁ¡úü¥HE Implementations of this trait must ensure that the mutex is actuallyÁüîJG exclusive: a lock can't be acquired while the mutex is already locked.ÁhÎìü¹Þ µ·µ·Íì½·Œ¥ ò·„û
üÙ(% Initial value for an unlocked mutex.Á$ ½·„¥ ü’ KH Marker type which determines whether a lock guard should be `Send`. UseÁüâ >; one of the `GuardSend` or `GuardNoSend` helper types here.Á\ª |
ü¼ OL Acquires this mutex, blocking the current thread until it is able to do so.Á$“
± ±½· ˜

½·$™
ܲü¥
C@ Attempts to acquire this mutex without blocking. Returns `true`Áüí
@= if the lock was successfully acquired and `false` otherwise.ÁDµ² ²½· ¾
½·$¿ÄŸ¼Ó Unlocks this mutex.ÁïúÝ´ˆúü\Y This method may only be called if the mutex is held in the current context, i.e. it mustÁüñgd be paired with a successful call to [`lock`], [`try_lock`], [`try_lock_for`] or [`try_lock_until`].ÁÝúäå [`lock`]: RawMutex::lockÁü†$! [`try_lock`]: RawMutex::try_lockÁü¯1. [`try_lock_for`]: RawMutexTimed::try_lock_forÁüå52 [`try_lock_until`]: RawMutexTimed::try_lock_untilÁ4©³ ³½· °
½·Üü½1. Checks whether the mutex is currently locked.ÁL„´ ´½· Ž
½·$ü„'ü™@= Additional methods for mutexes which support fair unlocking.ÁÚúüÞPM Fair unlocking means that a lock is handed directly over to the next waitingÁü¯KH thread if there is one, without giving other threads the opportunity toÁüûJG "steal" the lock in the meantime. This is typically slower than unfairÁüÆ=: unlocking, but may be necessary in certain circumstances.Áïµ·ü„Ö½·µ·(ׯµ·4ׯ)ìŸü²41 Unlocks this mutex using a fair unlock protocol.ÁëúÝ´úüŒSP This method may only be called if the mutex is held in the current context, seeÁüä63 the documentation of [`unlock`](RawMutex::unlock).Á\©µ µ½· µ
½·¬ŠüÂEB Temporarily yields the mutex to a waiting thread if there is one.ÁŒúü”LI This method is functionally equivalent to calling `unlock_fair` followedÁüåLI by `lock`, however it can be much more efficient in the case where thereÁܶ are no waiting threads.ÁÖúÝ´ïúü÷S‹ÇüÏ6èÇ$” ½· 
½·ü± (üÜGD Additional methods for mutexes which support locking with timeouts.Á¤úü¨PM The `Duration` and `Instant` types are specified as associated types so thatÁüù74 this trait is usable even in `no_std` environments.ÁX#µ·ü± ²ׯµ·!ׯµ·-ׯ) ! !Íì½·t!‰ÐÍì½·lÓ!§Ð! l!üà *' Duration type used for `try_lock_for`.ÁD”!dÓ!ü£!+( Instant type used for `try_lock_until`.Á<Ø!ü¨"8üæ!=: Attempts to acquire this lock until a timeout is reached.Ád«"· ·½·‘Ð ¸"
½·$¹"timeoutÁ<¿"ü¨#9üæ"=ïÐt«#¸ ¸½·¯Ð º#
!½·$»#€Ò<Á#ôØ'üå#B? A mutual exclusion primitive useful for protecting shared dataÁ¨$úü¬$OL This mutex will block threads waiting for the lock to become available. TheÁüü$C@ mutex can also be statically initialized or created via a `new`ÁüÀ%OL constructor. Each mutex has a type parameter which represents the data thatÁü&KH it is protecting. The data can only be accessed through the RAII guardsÁüÜ&OL returned from `lock` and `try_lock`, which guarantees that the data is onlyÁü¬'+( ever accessed w
 `£cbufÁ `àB¤GS
ÆÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
ŸÈŸÈ ÈErrorÁ O˜éBLS €zS
VéWïW$z± ‡zÄÏ{ŒÖ{ §XA\ƒ]t•ÇXX,( WW§Xüù{%§XZÀcZüµ|8¸|ÇÈÉ Ç§X È c cˆ¢cµ
 `£c `àB¤GS
ÉÂY ¼|Y
Z$½|± Ã|üʇ]Ú\£]¥^\]^ÍìY Ú‡Îì•Y ó‡YD݇ Y$è‡YÚï‡ •Y$ÿ‡•YÚ†ˆÑXÖ‡mo\km\ü¬ˆ?Ú`£a¥bba`À” µˆÑ” Ljâ”D¸ˆÈ •ÓˆÑXcdgjnq±ˆ?A`EG`ü®‰)üòˆ74 Returns a reference to the original `Mutex` object.Á,µ‰Ê ÊÑX Ú""¤%@ &  5á»I'yÆDY•Y_ ¾‰_
cÚY•Y¾ »‰ü„tüõ‰FC Makes a new `MappedMutexGuard` for a component of the locked data.ÁÀŠúüÈŠ96 This operation cannot fail as the `MutexGuard` passedÁü†‹  in already locked the mutex.Á«‹úü³‹30 This is an associated function that needs to beÁüë‹LI used as `MutexGuard::map(...)`. A method would interfere with methods ofÁü¼Œ52 the same name on the contents of the locked data.ÁÑXïïÃGó@ ô  õÚ ?ÌBC½ÚY¦_¦efef_Îìöœ Í즜 šË–"¦œ Ë•YÄß˦œÙ˜" Ëöœ
dÚY•Yöœ¦œ¾ ± ¦ˆŠüÊ“ŽüæDA Attempts to make a new `MappedMutexGuard` for a component of theÁü¯NK locked data. The original guard is returned if the closure returns `None`.Á‚‘úüŠ‘9¿˜üÈ‘ ƒ™í‘úüõ‘3»™ü­PM used as `MutexGuard::try_map(...)`. A method would interfere with methods ofÁü‚“5К<Ñ“ÑX¦œÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
«œÑX_¦hihi_¥ Ù“· ä“Ì–"¦œ Ì•Yü·” ̦œý¢˜"Û¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙ ÌöœtÉ”
gÚY•Yöœ¦œ¾ 瓱 ð“ÊÌÎÐü¯›·üŸ—Dëüè—MJ locked data. The original guard is returned alongside arbitrary user dataÁüº˜! if the closure returns `Err`.Áà˜úüè˜9¿˜ü¦™ ƒ™Ë™úüÓ™3»™ü‹šWT used as `MutexGuard::try_map_or_err(...)`. A method would interfere with methods ofÁüçš5Кt¶›ÑX¦œÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
«œÑX_¦klmlmk_¥ Å›· ЛÍì¨ Ó›Í–"¦œ Í•Yüœ#ͦœ€©˜"Ö¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
 Íöœ¨ŒÔœ
jÚY•Yöœ¦œ¨¾ ß›± ð›íïñóìîü¡¡Rü²Ÿ@= Temporarily unlocks the mutex to execute the given function.Á÷ŸúüÿŸDA This is safe because `&mut` guarantees that there exist no otherÁüÈ 2/ references to the data protected by the mutex.Á²|¡D¨¡Î ÎÑX¦_o¦ppo º¡_Í솭 ±¡Íì‹­ ´¡–"†­l塆­˜"­ ñ¡
nÚY•Y†­‹­¾ ·¡± Å¡lngiüà¤!ü©£EB Leaks the mutex guard and returns a mutable reference to the dataÁÜó£ protected by the mutex.Á“¤úü›¤2/ This will leave the `Mutex` in a locked state.Á$ç¤ÑX Ú•Y__
qÚY•Y¾ ì¤üä¥CÚs£t¥ustuÀ” í¥Ñ” ƒ¦Ydð¥ÿ¥ •¦ÑXvwzé¥?AsEGsÜȬü®¦30 Unlocks the mutex using a fair unlock protocol.Áæ¦úüî¦JG By default, mutexes are unfair and allow the current thread to re-lockÁü½§HE t
 `£c `àB¤GS
ÖÂ ë»
ÚY•Y$ì»± ò»ü̼_Ú£¥À” ռє ç¼â”Dؼã¼Äc•Ydê¼ •‚½ÑX”ÅcѼNPUWü²½8µ½×ØÙ ×ÑX Ø c cˆ¢cµ
 `£c `àB¤GS
ÙÂ ¹½
ÚY•Y$º½± À½ü¼ägÚ£¥˜˜À” ÌäÑ” åäâ”DÏäñ”$Úäáä$ñä •øäÔYÈäEGLNü¨å{Úš£¥œœšÀ” ¸åÑ” Êåâ”D»åÆåÌì•Y$Öå •ÝåÌìY$ŸæÔY´å[]šbdšü©æEÚž£Ÿ¥ Ÿž À” ²æÑ” Äæâ”DµæÀæ •ÐæÔY¡¤§®æ<>žCEžüêtüõæFá—ÀçúüÈç?< This operation cannot fail as the `MappedMutexGuard` passedÁüŒè ƒ™±èúü¹è3»™üñèRO used as `MappedMutexGuard::map(...)`. A method would interfere with methods ofÁüÈé5К—êÔY¦œ«œ¦¢£¢£¥ ›ê· ¦êÚ–"¦œ Ú•YÄëêÚ¦œ·Ð˜" Úöœ4ýê
¡ÚY•Yöœ¦œ¾ ©ê± ²êüÏðŽüßìDëü¨íNºžûíúüƒî?èÌüÇî ƒ™ìîúüôî3»™ü¬ïVS used as `MappedMutexGuard::try_map(...)`. A method would interfere with methods ofÁü‡ð5К<ÖðÔY¦œÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
«œÔY¦¥¦¦¥¥ Þð· éðÛ–"¦œ Û•Yü¼ñ Û¦œÞÔ˜"Û¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙ ÛöœtÎñ
¤ÚY•Yöœ¦œ¾ ìð± õðËÍÏÑü­ø·ü‘ôDëüÚôMä£ü¬õ!¼¤ÒõúüÚõ?èÌüžö ƒ™ÃöúüËö3»™üƒ÷]Z used as `MappedMutexGuard::try_map_or_err(...)`. A method would interfere with methods ofÁüå÷5Кt´øÔY¦œÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
«œÔY¨¦¨©ªª¨©¥ Ãø· ÎøÞ¨ ÑøÜ–"¦œ Ü•YüÀù#ܦœÿÙ˜"Ö¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
 Üöœ¨ŒÒù
§ÚY•Yöœ¦œ¨¾ Ýø± îøåçéëíïü›üIÚ¬£­¥®®¬­À” ¤üÑ” ºü¯±d§ü¶ü •ÆüÔY¯ ü68¬=?¬Ü…ƒüëü3ޱ£ýúü«ýJÙ±üúýH®²üÇþJ³ü–ÿKÖ³üæÿG¬´ü²€9þ´ð€úüø€LϵüÉL¦¶üš‚Dý¶²|ñ‚\ŒƒÔY««
¯ÚY•Y¾ ˜ƒü·„OÚ±£²¥³²³±À” À„Ñ” Ò„â”DÄ΄ •Þ„ÔY´µê!ë!µ¼„EG±LN±\4’…°°•Y¬°…,³…Ý ÝÔY Ý•Y° ¹…°
µÚY•Y$º…üð…RÚ·£¸¥¹¹·¸À” ù…Ñ” ‹†â”Dü…‡† •—†ÔYº÷!ºõ…>@·EG·ü׆!LÚ†Þ ÞÔY Þ•Y ä†
ºÚY•Y$é†ü§‡NÚ¼£½¥¾½¾¼À” °‡Ñ” ‡â”D³‡¾‡ •·ÔY¿"¿¬‡>@¼EG¼”Šˆ$ˆß ßÔY» ’ˆ»
¿ÚY•Y$—ˆüŸ‰aÚÁ£Â¥ÃÂÁÃÀ” ¨‰Ñ” º‰â”D«‰¶‰¹ÄT½‰ •Ó‰ÔYÄÀcĤ‰GIÁNPÁü‡Š8ŠŠàáâ àÔY á c cˆ¢cµ
 `£c `àB¤GS
âÂÀ ŽŠÀ
ÄÚY•Y$б •ŠüïŠiÚÆ£Ç¥ÈÆÇÈÀ” øŠÑ” Š‹â”DûІ‹­Çd •¥‹ÔYÉÅcÉôŠGIÆNPÆüß‹8â‹ãäå ãÔY ä c cˆ¢cµ
 `£c `àB¤GS
åÂÅ æ‹Å
ÉÚY•Y$狱 í‹\™ » atomic_usizeÁÄþüø < Þáöÿ’ DæËÎõ dðËÏ¥
ËÐÉ\’ËÑÉËÑa$¹á.ËÔýjT¿î0ËÕ×Р`ËÖ÷±Ë×÷±Ë×íòëËØ NonZeroUsizeÁd€²–ËÙr,—é!ËÚ AtomicUsizeÁ\±„ÄËÜ®¼ÀËÝ”ÑUXGJ9<+.„¦ôöœÙ潿Œû¤T’•ü¦ˆ}kmä€
ü€41 Helper trait which returns a non-zero thread ID.Áµúü¹JG The simplest way to implement this trait is to return the address of aÁÔ„ thread-local variable.ÁŸúÝ´°úü´NK Implementations of this trait must ensure that no two active threads shareÁüƒ IF the same thread ID. However the ID of a thread that has exited can beÁüÍ 2/ re-used since that thread is no longer active.ÁøCÞÞµ·ü€
ÓÞµ·µ· ßàßàà„¯ ”£
 Initial value.Á$µ ÞÞ½·ü¥
,üÆ GD Returns a non-zero thread ID which identifies the current thread ofÁt
 execution.ÁŒ¨
æ æ½·ô ô õ ¨÷ ˆÐ  mjçítoéžqÞ º
Þ
ཷ
ü‰"üÕ
HE A raw mutex type that wraps another raw mutex to provide reentrancy.Ážúü¢IF Although this has the same methods as the [`RawMutex`] trait, it doesÁüìHE not implement it, and should not be used in the same way, since thisÁüµLI mutex can successfully acquire a lock multiple times in the same thread.Áü‚GD Only use this when you know you want a raw mutex that can be lockedÁüÊ>; reentrantly; you probably want [`ReentrantMutex`] instead.Á
D£â˜ãâãåØ ¦Íì¼[ ©çZK§ˆˆ*¹^Ãäåæç3502”²Ëáá–s¼ÊËááËsDçËááéW„õËáá¼[üŠW£é˜êéêåØ ÷ù ª¡ÚD™¯ÚÞ¼[Ìì¼[çZ>@CEüåW£ì˜ííìåØ ñ÷ù ¡Ú­Û$ÿùû ¼[$–çZ68;=üÁ9£ï˜ðïðåØ Æ÷ù Ó¡ÚùûçZñòôöøùú469;¤ãü(®·îîçZü¦AËç ççZîóó ÌîÍìÿ ·–"ÿ„ºÿ˜"
òéW¼[ÿÉ DÓIK”’ü¾A> Acquires this mutex, blocking if it's held by another thread.Á$™è èçZî žî
ôéW¼[Âô<closure_kind>Áõ<closure_signature>Áõ<upvars>ÁõõôõéW¼[ çZô©üŽCغüÖ@¥»é éçZî ¹î
öéW¼[åöà€÷ù€÷÷÷ö÷éW¼[Ä‚΂Ü‘!üŠ>; Unlocks this mutex. The inner mutex may not be unlocked ifÁüÍ=: this mutex was acquired previously in the current thread.Á úd— Ý´¨ úü° NK This method may only be called if the mutex is held by the current thread.Á4Ÿ!ê êçZî ¦!î
øéW¼[$§!ü×#ü“#1ÁLÞ#ë ëçZî è#î
ùéW¼[$é#üû$0ü£$EB Checks whether the mutex is currently held by the current thread.ÁÔ‚%ì ìçZî %î
úéW¼[$ž%ü§&=£ü˜ýýüåØ ¬&÷ù ½&þd¯&ùû\À&çZþÿ%'*,ü—) üë&DA Unlocks this mutex using a fair unlock protocol. The inner mutexÁü´'DA may not be unlocked if this mutex was acquired previously in theÁœý' current thread.Á•(úd(Ý´®(úü¶(Nð„\¥)í íçZû ±)û
þéW¼[$²)̹.ü£+EýÈí+úüõ+LØÉüÆ,L®ÊÜ—-ƒË·-úd¿-Ý´Ð-úüØ-Nð„$Ç.î îçZû Ì.û
ÿéW¼[$Í.ü™1>£˜åØ ž1÷ù °1l¡1ùû\³1çZƒ%'*,ü®29üÞ1=ïÐtµ2ï ïçZ¤Š Ä2
ƒéW¼[$Å2€Ò<Ë2…3ƒà€ù€ƒéW¼[Ä‚Ђ¤Šü‡48ü·3=ïÐdŽ4ð ðçZç‡ ›4
éW¼[$œ4€Ò<¢4Ý4à€ù€éW¼[Ä‚Ђç‡üÖ8*ü‹5?< A mutex which can be recursively locked by a single thread.ÁË5úüÏ5FC This type is identical to `Mutex` except for the following points:Á6úüš6PM - Locking multiple times from the same thread will work correctly instead ofÁ”ë6 deadlocking.Áüþ6PM - `ReentrantMutexGuard` does not give mutable references to the locked data.ÁüÏ7'$ Use a `RefCell` if you need this.Á÷7úüû7KH See [`Mutex`](crate::Mutex) for more details about the underlying mutexÁtÇ8 primitive.ÁD£ˆ˜¥ŠˆŠåØ ð8÷ù ó8Ñ” ö8Ô[ë<×ù„ò䀌/1469;ä‡9‡9ËçZœ©9$©9Ë”xüÁ9m£Ž˜¥ŽåØ Í9÷ù á9Ñ” ø9¡ÚDÐ9¯Ú$Û9ùû\ä9ˆü$ò9
to do so.ÁˆNúüNLI If the mutex is held by another thread then this function will block theÁüáNLI local thread until it is available to acquire the mutex. If the mutex isÁü²OLI already held by the current thread then this function will increment theÁüƒP@= lock reference count and return immediately. Upon returning,ÁüÈPGD the thread is the only thread with the mutex held. An RAII guard isÁü”QKH returned to allow scoped unlock of the lock. When the guard goes out ofÁüäQ&# scope, the mutex will be unlocked.Á²|R$¸Rò òÔ[ööŠHûœËüÚËë*÷\B!5òéW¼[•Y¡ ½R¡
¦éW¼[•Y$¾RüªVBüïS"·ì–TúüžTLïìüïTLÅí¬ÀUšîÚUúüâU!Åî²|–VD±Vó óÔ[Û¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙööŠHûœËüÚËë*÷\B!5óéW¼[•Y¡ ºV¡
§éW¼[•Y$»Vü¯Z#ü¶X7ØðòXúüúXTQ Since this call borrows the `ReentrantMutex` mutably, no actual locking needs toÁüÓYIúñ<¶Zô ôÔ[ ô•Y¡ ¾Z¡
¨éW¼[•Y$ÃZüá[ü‰[1Á²|Í[Lè[õ õÔ[¡ ò[¡
©éW¼[•Y$ó[ü—]0ü«\E‹‡²|ƒ]Ôž]ö öÔ[¡ ¹]¡
ªéW¼[•Y$º]ü—b!üƒ^›ô§^úü¯^JÐôüþ^OL the need to maintain a `ReentrantMutexGuard` object alive, for example whenÁ¬Ò_óõì_údô_Ý´…`úü`J·öüÜ`NK `ReentrantMutexGuard` but that guard has be discarded using `mem::forget`.Áü¯aAÜ÷²|ƒbd¥b÷ ÷Ô[¡ ²b¡
«éW¼[•Y$³bôáeüáb,…ù’cúüšcKÇùüêc=œú¬dúd´dÝ´ÅdúüÍdCˆûü•e96 still holding a reference to a `ReentrantMutexGuard`.Áïeø øÔ[ øéW¡ óe¡
¬éW¼[•Y$ôeüÅj ü¥f1ñüÛfúüãfJÐôü²gJG the need to maintain a `ReentrantMutexGuard` object alive, for exampleÁÔh when dealing with FFI.Á húd¨hÝ´¹húüÁhG†þüiHE returned pointer, for example if the current thread logically owns aÁüÚiA> `ReentrantMutexGuard` but that guard has been discarded usingÁ” j `mem::forget`.ÁDÌjù ùÔ[ •Y¡ Õj¡
­éW¼[•Y$ÖjüäxH£¯˜°¥±¯°±åØ éx÷ù úxÑ” Šyþdìxùû\ýxÔ[²*,/146üä}&ü³y<ºôyúüüyJÐôüËzO³³¬Ÿ{óõ¹{údÁ{Ý´Ò{úüÚ{J·öü©|NÌ´üü|AÜ÷²|Ð}Œò}ú úÔ[® „~®
²éW¼[•Y$…~ü¶~I£´˜µ¥´µåØ »~÷ù Í~Ñ” Ý~l¾~ùû\Ð~Ô[·¸-/2479ü¼\ü†=ïÐÈúüÐFå„ü›€Kµ…üë€*І²|¨û ûÔ[ç‡Û¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙööŠHûœËüÚËë*÷\B!5ûéW¼[•Y³ г
·éW¼[•Y€Òü£†]üíƒ=ïЯ„úü·„Få„ü‚…Kµ…üÒ…*І²|tª†ü üÔ[¤ŠÛ¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙööŠHûœËüÚËë*÷\B!5üéW¼[•Y³ ¹†³
¸éW¼[•Y$º†€Ò<À†üΓZ£º˜»¥¼º»¼åØ Ó“÷ù à“Ñ” ð“¡ÚDÖ“ùû\㓳•Y<ü“Ô[½´½GIKMOQü½”
 `£c `àB¤GS
ÿÂÃ ¾—Ã
ÇéW¼[•Y$¿—± Å—ÄÉ™ŒÐ™ËÈ\œ5›X¦É0+ËÈÈÈ\üó™%È\ËÀcËü¯š8²š È\  c cˆ¢cµ
 `£c `àB¤GS
ÂÊ ¶šÊ
Ë$·š± ½šü¿¦ÚͣΘϥÐÏÍÐÎ À” ϦÍì¸] è¦Îì¾] „§â”DÒ¦ñ”$ݦä¦Þ¸]\ë¦ ¸]$ù¦¸]Ú€§ ¾]$§¾]Ú—§õ\˦šœÍ͘šÍüΧ`ÚÒ£Ó˜Ô¥ÕÓÒÔÕÀ” ×§“Р駤Рþ§â”DÚ§å§ÐÐ\ì§ðÐú§ÑЍõ\Ö×ÚÝáÓ§]_ÒdfÒkmÒüú¨7üµ¨@= Returns a reference to the original `ReentrantMutex` object.Á<©ƒ ƒõ\ Ú¢@ËŒ Ëë<×ù„òä€Y¸]¾]Ñ Œ©Ñ
ÖÚY¸]¾]¾ ‰©üû¬xüÑ©OL Makes a new `MappedReentrantMutexGuard` for a component of the locked data.Á¥ªúü­ªB? This operation cannot fail as the `ReentrantMutexGuard` passedÁüôª ƒ™™«úü¡«3»™üÙ«UR used as `ReentrantMutexGuard::map(...)`. A method would interfere with methods ofÁü³¬5К‚­õ\ÿÿßH@Ë ËÚË::¸×Ÿ¸ÚY¸]‹­Ñ¦ØÙØÙÑÎì‹­ †­Íì¥Ø ‘­–"¥Ø ¾]„â­¥ØâÙ˜" ‹­ð­
×ÚY¸]¾]‹­¥Ø¾ ”­± ­ŒŽü賩üê¯NK Attempts to make a new `MappedReentrantMutexGuard` for a component of theÁü½°LI locked data. The original guard is return if the closure returns `None`.Áޱúü–±B§Õüݱ ƒ™‚²úüв3»™ü²YV used as `ReentrantMutexGuard::try_map(...)`. A method would interfere with methods ofÁü ³5К<ï³õ\¥ØÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
ªØõ\ѦÛÜÛÜѮ٠÷³ÀÙ ‚´–"¥Ø ¾]Äø´¥Ø¢ß˜"Û¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙ ‹­T†µ
ÚÚY¸]¾]‹­¥Ø¾ Ž´± Ÿ´ÍÏÑÓü¼»üá·NøÙü´¸Mä£ü†¹!¼¤¬¹úü´¹B§Õüû¹ ƒ™ ºúü¨º3»™üàº`] used as `ReentrantMutexGuard::try_map_or_err(...)`. A method would interfere with methods ofÁüÅ»5Кt”¼õ\¥ØÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
ªØõ\ѦÞßàÞßàѮ٠£¼ÀÙ ®¼ÍìÜã ±¼–"¥Ø ¾]ܬ½¥ØÔä˜"Ö¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
 ‹­Üãlº½
ÝÚY¸]¾]‹­¥ØÜã¾ ½¼± μðòôöïñüŒÂRüÀ@õ©âÀúüêÀDͪü³Á2œ«²|øÁD“ õ\¦œ¦Ñâ¦ããâ ¥ÂÑ· œÂÍì·ç ŸÂ–"¦œlЦœ˜"·ç ÜÂ
áÚY¸]¾]¦œ·ç¾ ¢Â± °ÂprkmüŸÄhÚ壿˜ç¥èçåæèÀ” ¨Ä“Ð ¾Ä¤Ð Óį±d«ÄºÄÐÐ\ÁÄðÐÏÄÑßÄõ\éêí¤ÄWYå^`åegåܱËüŽÅ3ޱÆÅúüÎÅJÙ±üÆH®²üêÆJ³ü¹ÇKÖ³ü‰ÈG¬´üÕÈ9þ´“Éúü›ÉLϵüìÉL¦¶ü½ÊMJ using this method instead of dropping the `ReentrantMutexGuard` normally.Á²|Ë\¸Ëõ\ää
éÚY¸]¾]¾ ÄËü¢ÏWüõÌ@õ©ºÍúüÂÍ1. The mutex is unlocked a fair unlock protocol.ÁøÍúü€ÎDͪüÉÎ2œ«²|ŽÏl©Ïˆ
 `£c `àB¤GS
ŽÂû ­Úû
ÚY¸]¾]$®Ú± ´ÚüŽÛÚ£ƒ˜¥ƒ À” —Û“Ð ©Û¤Ð ¾Ûâ”DšÛ¥ÛÐÐ\¬ÛðкÛÄc¾]dÁÛÑÙÛõ\†Åc“Ûikprwyü™Ü8œÜ õ\  c cˆ¢cµ
 `£c `àB¤GS
  Ü
ÚY¸]¾]$¡Ü± §Üüæ‚Úˆ£˜Š¥Šˆ À” ö‚“Ð ƒ¤Ð «ƒâ”Dù‚ñ”$„ƒ‹ƒÐÐ\’ƒàÐ$ ƒðЧƒÿÐ$·ƒÑ¾ƒó]ò‚ikˆprˆwyˆüûƒjÚ£Ž˜¥ŽÀ” „„“Ð –„¤Ð «„â”D‡„’„ÐÐ\™„ðЧ„Ñ·„ó]‘€„WY^`egü¢ˆxüì„OÀÔÀ…úüÈ…HE This operation cannot fail as the `MappedReentrantMutexGuard` passedÁü•† ƒ™º†úü†3»™üú†[X used as `MappedReentrantMutexGuard::map(...)`. A method would interfere with methods ofÁüÚ‡5К©ˆó]¥ØªØŒ¦Œ®Ù ­ˆÀÙ ¸ˆ–"¥Ø ¾]„‰‰¥Ø¬„˜" ‹­—‰
ÚY¸]¾]‹­¥Ø¾ »ˆ± ĈˆŠŒŽü„©üúŠNøÙüÍ‹LÑÚžŒúü¦ŒHÊ€üóŒ ƒ™˜úü 3»™üØ_\ used as `MappedReentrantMutexGuard::try_map(...)`. A method would interfere with methods ofÁü¼Ž5К<‹ó]¥ØÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
ªØó]Œ¦Œ®Ù ÀÙ ž–"¥Ø ¾]Ä”¥Øàˆ˜"Û¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙ ‹­
ÚY¸]¾]‹­¥Ø¾ ª± »ÍÏÑÓüž—»üæ’NøÙü¹“Mä£ü‹”!¼¤±”úü¹”HÊ€ü†• ƒ™«•úü³•3»™üë•fc used as `MappedReentrantMutexGuard::try_map_or_err(...)`. A method would interfere with methods ofÁüÖ–5Кt¥—ó]¥ØÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
ªØó]Ü㌦˜š˜šŒ®Ù ´—ÀÙ ¿—²ä —–"¥Ø ¾]ܽ˜¥ØŽ˜"Ö¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
 ‹­Üãl˘
ÚY¸]¾]‹­¥ØÜã¾ Η± ß—çéëíïñü•›nÚœ£˜ž¥ŸžœŸÀ” ž›“Ð ´›¤Ð É›¯±d¡›°›ÐÐ\·›ðÐÅ›ÑÕ›ó] š›QSœXZœ_aœÜ­¢üŠœ3ޱœúüÊœJÙ±ü™H®²üæJ³üµžKÖ³ü…ŸG¬´üÑŸ9þ´ úü— Lϵüè L¦¶ü¹¡M…ë²|™¢\´¢ó]
 ÚY¸]¾]¾ À¢üí£tÚ¢££˜¤¥¥¤¢¥£À” ö£“Ð ˆ¤¤Ð ¤â”Dù£„¤ÐÐ\‹¤ðЙ¤Ñ©¤ó]¦§ê!ë!§ò£`b¢gi¢np¢\è¤4í¤¡¡¾]¬‹¥,Ž¥ ó] ¾]¡ ”¥¡
§ÚY¸]¾]$•¥üË¥sÚ©£ª˜«¥¬«©ª¬À” Ô¥“Р楤Рû¥â”D×¥â¥ÐÐ\é¥ðÐ÷¥Ñ‡¦ó]­"­Ð¥Y[©`b©gi©”Ó¦$Ö¦ ó]¨ Û¦¨
­ÚY¸]¾]$à¦üñ§Ú¯£°˜±¥²±¯°² À” ú§“Ð Œ¨¤Ð ¡¨â”Dý§ˆ¨ÐÐ\¨ðШ„øT¤¨Ñº¨ó]³Àc³ö§bd¯ik¯pr¯üþ¨8©˜ ó] ˜ c cˆ¢cµ
 `£c `àB¤GS
® …©®
³ÚY¸]¾]$†©± Œ©ü橊ڵ£˜·¥¸¸·µ À” ï©“Ð ª¤Ð –ªâ”Dò©ý©ÐÐ\„ªðÐ’ª·ûd™ªÑ±ªó]¹Åc¹ë©bdµikµprµü÷ª8úªšœ šó]  c cˆ¢cµ
 `£c `àB¤GS
œÂ´ þª´
¹ÚY¸]¾]$ÿª± …«ÃÎÓÕÜßâèëîó£ªýjTÝî0»¼×ó `»½÷±»¾÷±»¾í¡ë»¿r,¶é!»Áβö!»Â´Ñ–Lí‡ÌüwL›RLªDF24Ôª üü.+ Basic operations for a reader-writer lock.Á«úü¯LI Types implementing this trait can be used by `RwLock` to form a safe andÁüü$! fully-functioning `RwLock` type.Á¡úÝ´²úü¶KH Implementations of this trait must ensure that the `RwLock` is actuallyÁü‚OL exclusive: an exclusive lock can't be acquired while an exclusive or sharedÁüÒKH lock exists, and a shared lock can't be acquire while an exclusive lockÁ exists.Á.DÃõ·üª ­Ãµ·µ· ÄÅÆÇÈÉÊËÌÍÄÅÆÇÈÉÊËÌÍÍì½·ÅŒš
²¦ÉÌÈËÇÊÆÍ„ð üË +( Initial value for an unlocked `RwLock`.Á$ö Ãý·„š
ü‡ Kø·ü× >͸
Ãôˆü±
RO Acquires a shared lock, blocking the current thread until it is able to do so.Á\ ½·Ã Ã
ƽ·üà"ü¤74 Attempts to acquire a shared lock without blocking.Á|ãž ž½·Ã óÃ
ǽ·ü¡܈ Releases a shared lock.Á¨úÝ´ÁúüÉSP This method may only be called if a shared lock is held in the current context.Ál«Ÿ Ÿ½·Ã ¹Ã
Ƚ·Ì¡üÆVS Acquires an exclusive lock, blocking the current thread until it is able to do so.Át¤   ½·Ã ³Ã
ɽ·ü€%üÀ;8 Attempts to acquire an exclusive lock without blocking.Á”ƒ¡ ¡½·Ã Ã
ʽ·$—üÌ"ü« Releases an exclusive lock.ÁÏúÝ´èúüðWT This method may only be called if an exclusive lock is held in the current context.Á„Ö¢ ¢½·Ã çÃ
˽·ÜÂüô;8 Checks if this `RwLock` is currently locked in any way.ÁLÅ£ £½·Ã ÏÃ
̽·ü©%üé;8 Check if this `RwLock` is currently exclusively locked.Áœ¬¤ ¤½·Ã ÀÃ
ͽ·üÆ)üÙB? Additional methods for `RwLock`s which support fair unlocking.Áœúü PóÂüñKÍÃü½J¢Äüˆ=öÄ@DÎε·üÆž ý·Îµ·*˜µµ·6˜µÐÑÒÏÐÑÒÐÒÑÏü¬$üö85 Releases a shared lock using a fair unlock protocol.Á³úÝ´ÌúüÔS ª”¶¥ ¥½·Î ÉÎ
Ͻ·ü” 'üÖ<9 Releases an exclusive lock using a fair unlock protocol.ÁúÝ´°úü¸Wù®¬ž ¦ ¦½·Î ´ Î
н·äà#üÁ IF Temporarily yields a shared lock to a waiting thread if there is one.Á!úü—!SP This method is functionally equivalent to calling `unlock_shared_fair` followedÁüï!SP by `lock_shared`, however it can be much more efficient in the case where thereÁÜÇ"ƒËç"údï"Ý´€#úüˆ#S ª\ê#§ §½·Î ö#Î
ѽ·$÷#üö'üÉ$MJ Temporarily yields an exclusive lock to a waiting thread if there is one.Á%úü£%VS This method is functionally equivalent to calling `unlock_exclusive_fair` followedÁüþ%VS by `lock_exclusive`, however it can be much more efficient in the case where
blocking.ÁÎFúdÖFÝ´çFúüïFXøÝ\ÖG ½·â âGâ
ç½·$ãGüÑHGüõGLI Additional methods for `RwLock`s which support upgradable locks and fairÁtÂH unlocking.Á¬Dèèµ·üÑHÞâ½·„øHν·l‹Ièµ·:øä.ˆå$µ·Løä@ˆåêéêêéüßJ(üŸI=: Releases an upgradable lock using a fair unlock protocol.ÁáIúdéIÝ´úIúü‚JXøÝ´éJ· ·½·è €Kè
é½·$Kü¾N üKNK Temporarily yields an upgradable lock to a waiting thread if there is one.ÁàKúüèKWT This method is functionally equivalent to calling `unlock_upgradable_fair` followedÁüÄLWT by `lock_upgradable`, however it can be much more efficient in the case where thereÁÜ MƒËÀMúdÈMÝ´ÙMúüáMXøÝ|ÈN¸ ¸½·è ØNè
ê½·$ÙNüPQü±OLI Additional methods for `RwLock`s which support upgradable locks and lockÁ„þO
downgrading.Á¾Dëëµ·üøä„»PÓ½·”ÎPëµ·2øä.“ì$µ·Døä@“ìíìíìíüR&üçP30 Downgrades an upgradable lock to a shared lock.ÁŸQúd§QÝ´¸QúüÀQXøÝ¤§R¹ ¹½·ë ¼Rë
ì½·$½Rü‚T)üÉR74 Downgrades an exclusive lock to an upgradable lock.Á…SúdSÝ´žSúü¦SWù®¼ŒTº º½·ë ¤Të
í½·$¥Tü’UIü¯TOL Additional methods for `RwLock`s which support upgradable locks and lockingÁ”ÿT with timeouts.ÁÐDîîµ·ü’UÒøä„ºU„ÔtÍUîµ·*øä&„Ô$µ·<øä8„Ôðñòïðñòñïðòü­VCüâUFC Attempts to acquire an upgradable lock until a timeout is reached.Á¼°V» »½·‰Æî ÈVî
ï½·$ÉV€Ò<ÏVüÁWDüöVF—ñÌÄW¼ ¼½·¨Æî ÞWî
ð½·$ßW€Ò<åWüñYBü‹XGD Attempts to upgrade an upgradable lock to an exclusive lock until aÁ¼×X timeout is reached.ÁóXúdûXÝ´ŒYúü”YXøÝ|ûY½ ½½·‰Æî ‹Zî
ñ½·$ŒZ€Ò<’ZüŸ\Cü¹ZG½ó¼…[ô¡[úd©[Ý´º[úüÂ[XøÝŒ©\¾ ¾½·¨Æî »\î
ò½·$¼\€Ò<Â\üŸbÄæ\ A reader-writer lockÁÿ\úüƒ]MJ This type of lock allows a number of readers or at most one writer at anyÁüÑ]OL point in time. The write portion of this lock typically allows modificationÁü¡^OL of the underlying data (exclusive access) and the read portion of this lockÁüñ^:7 typically allows for read-only access (shared access).Á¬_úü°_MJ The type parameter `T` represents the data that this lock protects. It isÁüþ_PM required that `T` satisfies `Send` to be shared across threads and `Sync` toÁüÏ`NK allow concurrent access through readers. The RAII guards returned from theÁüžaNK locking methods implement `Deref` (and `DerefMut` for the `write` methods)Áüía1. to allow access to the contained of the lock.ÁâD£ô¥õôõåØ ±bõØ ´b÷^$ÌÏ–)Ú>³ö÷'),.4ÅbÅb»óóéWœÑb$Ñb»óóóküßgH£ù¥úúùåØ ëgõØ €hÃéWLîg¯Ú$úg¿Ú$Œh÷^.035ü«hO£ü¥ýüýåØ ·hõØ ÌhõÿLºh­Û$Æh¿Ú$Øh ïW$ßh÷^68;=üÿh"£ÿ¥ÿåØ „i’Ü ’iõÿL‡i÷^"$üúi(ü¨i?< Creates a new instance of an `RwLo
 `£c `àB¤GS
ÝÂÁ ÓæÁ
ÄéWïW$Ôæ± Úæü¶ìU8Þ£Æ¥ÇÆÞÇÀ” ÂìÑ” ×ìÃYLÅìñ”$Ñì$Úìè_3579üíEÚɣʥËÉÊËÀ” ™íÑ” ¬íÑõLœí¨í •¸í´`ÌÍÐÓוíBDÉIKÉü£î+üÜíB? Returns a reference to the original reader-writer lock object.Á4ªîß ß´` ÚóóÒö@»÷ »$ÌÏ–)Ú>³Y•YÈ ´îÈ
ÌÚY•Y¾ ±îü‰òqüíîJG Make a new `MappedRwLockReadGuard` for a component of the locked data.Á¼ïúüÄï>; This operation cannot fail as the `RwLockReadGuard` passedÁü‡ð in already locked the data.Á«ðúü³ð3»™üëðQN used as `RwLockReadGuard::map(...)`. A method would interfere with methods ofÁüÁñ5Кò´`¦œ££’K§@»¨ »©Ú»âª4`TÚYöœÈ¦ÎÏÎÏÈ¥ ”ò· Ÿòà–"¦œ à•Y„éòজÑý˜" àöœ÷ò
ÍÚY•Yöœ¦œ¾ ¢ò± «òüÚøüëôJG Attempts to make a new `MappedRwLockReadGuard` for a component of theÁüºõJG locked data. Returns the original guard if the closure returns `None`.Á‰öúü‘ö>›ùüÔöäùøöúü€÷3»™ü¸÷UR used as `RwLockReadGuard::try_map(...)`. A method would interfere with methods ofÁü’ø5К<áø´`¦œÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
®ü´`ȦÑÒÑÒÈ¥ éø· ôøá–"¦œ á•YÄÌùᦜƒƒ˜"Û¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙ áöœTÚù
ÐÚY•Yöœ¦œ¾ ÷ø± €ùÊÌÎÐü΀´ü¯üJäýüþüMä£üÐý!¼¤öýúüþý>›ùüÁþäùåþúüíþ3»™ü¥ÿ\Y used as `RwLockReadGuard::try_map_or_err(...)`. A method would interfere with methods ofÁü†€5КtÕ€´`¦œÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
®ü´`¨È¦ÔÕÖÔÕÖÈ¥ 䀷 ï€Þ¨ ò€â–"¦œ â•YÜæâ¦œ¢ˆ˜"Ö¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
 âöœ¨
ÓÚY•Yöœ¦œ¨¾ þ€± äæèêìîüƆRüÑ„C@ Temporarily unlocks the `RwLock` to execute the given function.Á™…úü¡…Dͪüê…52 references to the data protected by the `RwLock`.Á²|²†D͆ã ã´`†­‹­ÈئÙÙØ ߆È¿­ ֆѭ Ù†ã­lЇ÷­ –‡
×ÚY•Y†­‹­¾ ܆± ê†KMOQüçˆIÚۣܥÝÝÛÜÀ” ðˆÑ” ‡‰ÎYl󈃉 •“‰´`ÞßâìˆCEÛJLÛÜåü·‰63 Unlocks the `RwLock` using a fair unlock protocol.Áò‰úüú‰JG By default, `RwLock` is unfair and allow the current thread to re-lockÁüÉŠKH the `RwLock` before another has the chance to acquire the lock, even ifÁü™‹IF that thread has been blocked on the `RwLock` for a long time. This isÁüç‹EB the default because it allows much higher throughput as it avoidsÁü±ŒMJ forcing a context switch on every `RwLock` unlock. This can result in oneÁüƒC@ thread acquiring a `RwLock` many more times than other threads.ÁËúüÓLϵü¤ŽL¦¶üõŽIF using this method instead of dropping the `RwLockReadGuard` normally.Á²|Ñ
 `£c `àB¤GS
êÂî ¸žî
òÚY•Y$¹ž± ¿žü™ŸiÚô£õ¥öôõöÀ” ¢ŸÑ” µŸÑõL¥Ÿ±Ÿ­Çd¸Ÿ •П´`÷Åc÷žŸGIôNPôü‰ 8Œ ëìí ë´` ì c cˆ¢cµ
 `£c `àB¤GS
íÂó  ó
÷ÚY•Y$‘ ± — üÍÅV8î£ù¥úùîúÀ” ÙÅÑ” îÅÑõLÜÅñ”$èÅ$ñÅŸa,.02ü¨ÆFÚü£ý¥þþýüÀ” ±ÆÑ” ÄÆÑõL´ÆÀÆ •ÐÆëaÿƒŠ­ÆBDüIKüü¼Ç+üõÆBÂö4ÃÇï ïëa²øû ÍÇû
ÿÚY•Y¾ ÊÇü¥Ëzü†ÈKH Make a new `MappedRwLockWriteGuard` for a component of the locked data.ÁÖÈúüÞÈ?< This operation cannot fail as the `RwLockWriteGuard` passedÁü¢ÉäùÆÉúüÎÉ3»™ü†ÊRO used as `RwLockWriteGuard::map(...)`. A method would interfere with methods ofÁüÝÊ5К¬Ëëa¦œªªÞK®@»¯ »°Ú»šPR‹Eí»ËÚYöœû¦û¥ °Ë· »Ëð–"¦œ ð•YĆÌ𦜱«˜" ðöœ4˜Ì
ÚY•Yöœ¦œ¾ ¾Ë± ÇËü‰Òü•ÎKH Attempts to make a new `MappedRwLockWriteGuard` for a component of theÁüåÎLÑÚ¶Ïúü¾Ï?”§ü‚Ðäù¦Ðúü®Ð3»™üæÐVS used as `RwLockWriteGuard::try_map(...)`. A method would interfere with methods ofÁüÁÑ5К<Òëa¦œÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
Žªëaû¦û¥ ˜Ò· £Òñ–"¦œ ñ•YüüÒ ñ¦œŸ°˜"Û¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙ ñöœtŽÓ
ƒÚY•Yöœ¦œ¾ ¦Ò± ¯ÒËÍÏÑüŽÚ½üìÕKÄ«ü¼ÖMä£üŽ×!¼¤´×úü¼×?”§ü€Øäù¤Øúü¬Ø3»™üäØ]Z used as `RwLockWriteGuard::try_map_or_err(...)`. A method would interfere with methods ofÁüÆÙ5Кt•Úëa¦œÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
Žªëa¨û¦ˆˆû¥ ¤Ú· ¯ÚÞ¨ ²Úò–"¦œ ò•Yü§Û#ò¦œÀµ˜"Ö¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
 òöœ¨Œ¹Û
ÚY•Yöœ¦œ¨¾ ¾Ú± ÏÚåçéëíïü”àRüŸÞC—‰çÞúüïÞDͪü¸ß5в|€àD›àó óëa†­‹­û¦ŒŒ ­àû¿­ ¤àÑ­ §àã­lØà÷­ äà
ŠÚY•Y†­‹­¾ ªà± ¸àKMOQü»âOÚŽ£¥ŽÀ” ÄâÑ” àâÓY”ÇâÜâ •ìâëa‘Àâ=?ŽDFŽüôå6ü‘ãLI Atomically downgrades a write lock into a read lock without allowing anyÁüâãA> writers to take exclusive access of the lock in the meantime.Á¨äúü°äIF Note that if there are any writers currently waiting to take the lockÁüþäIF then other readers may not be able to acquire the lock even if it wasÁ|Ìå downgraded.Á²|àåLûåëa´`
ÚY•Y¾ …æüÎèVÚ£¥À” ×èÑ” úèëYÌÚèöè •†éëa–Óè=?DFüšìNü«éXU Atomically downgrades a write lock into an upgradable read lock without allowing anyÁüˆêAźÎêúüÖêIž»ü¤ëIò»|òëż²|†ì¼¡ìëaàb
ÚY•Y¾ ¹ìü¤ïJÚ˜£¥šš˜À” ­ïÑ” Äïßl°ïÀï •Ðïëa›œŸ©ï<>˜CE˜ܤöüõï6İðúü¸ðJ’Ž
 `£c `àB¤GS
û° ㆰ
´ÚY•Y$䆱 ê†üćjÚ£·¥¸·¸À” ͇Ñ” à‡ÑõLЇ܇­Çd㇠•û‡ëa¹Åc¹ɇGINPüµˆ8¸ˆüýþ üëa ý c cˆ¢cµ
 `£c `àB¤GS
þµ ¼ˆµ
¹ÚY•Y$½ˆ± ÈüνqÚ»£¼¥½»¼½À” ޽є ø½âY„á½ô½$„¾ •‹¾àbÚ½CE»JL»üžVÚ¿£À¥Á¿ÁÀÀ” ξÑ” è¾ÑÖ„Ѿä¾ •ô¾àbÂÃÆÇʾ?A¿FH¿üé¿+ü¢¿BÂö4ð¿ÿ ÿàb²ø¾ ú¿¾
ÂÚY•Y¾ ÷¿ü¨ÂRü³ÀC—‰ûÀúüƒÁDͪüÌÁ5в|”ÂD¯Â € àb†­‹­¾Ä¦ÅÄÅ Á¾¿­ ¸ÂÑ­ »Âã­lìÂ÷­ øÂ
ÃÚY•Y†­‹­¾ ¾Â± ÌÂKMOQü‹Æ5üâÄRO Atomically upgrades an upgradable read lock lock into an exclusive write lock,Áü¹Å96 blocking the current thread until it can be acquired.Á²|÷Å<’Æàbëa¾¾
ÆÚY•Y¾ šÆüÂÊGüïÈUR Tries to atomically upgrade an upgradable read lock into an exclusive write lock.ÁÉÉúüÑÉXU If the access could not be granted at this time, then the current guard is returned.Á²|®Ê\ÉÊàbÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
ëaàb¾¾
ÇÚY•Y¾ ÕÊüôÍZÚɣʥËÉÊËÀ” ýÍÑ” ›ÎèY¤€Î—Π•§ÎàbÌÍÐùÍCEÉJLÉÜÕüÕÎ6ÄÏúü˜ÏJ’ŽüçÏKçŽü·ÐI½ü…ÑEüÏÑMáü¡ÒC¹‘éÒúüñÒLϵüÂÓL¦¶ü“ÔSP using this method instead of dropping the `RwLockUpgradableReadGuard` normally.Á²|ùÔ\”ÕàbÈÈ
ÌÚY•Y¾  Õü£ÙWüíÖC—‰µ×úü½×4ý“ö×úüþ×DͪüÇØ5в|ÙlªÙ   àb†­‹­ÈΦÏÏÎ ÁÙÈ¿­ ¸ÙÑ­ »Ùã­lìÙ÷­ øÙ
ÍÚY•Y†­‹­¾ ¾Ù± ÌÙKMOQÌ«ÞüçÛHÈ–´Üúü¼ÜLØÉüÝWT by `upgradable_read`, however it can be much more efficient in the case where thereÁÜé݃˲|—Þ$²Þ ‚ àbÈ ºÞÈ
ÐÚY•Y¾ ·Þüèß_ÚÒ£Ó¥ÔÒÓÔÀ” ñßÑ” ”àö¾Ìôßà • ààbÕÖÙíß<>ÒCEÒüÐã6üÎàNK Atomically downgrades an upgradable read lock lock into a shared read lockÁü¡áLI without allowing any writers to take exclusive access of the lock in theÁlòá
meantime.Á„âúüŒâIž»üÚâIò»|¨ãż²|¼ãL×ãàb´`ÑÑ
ÕÚY•Y¾ áãüøêKüÁæYV First, atomically upgrades an upgradable read lock lock into an exclusive write lock,ÁüŸç9ÅÛÝçúüåçTQ Then, calls the provided closure with an exclusive reference to the lock's data.Á¾èúüÆèLI Finally, atomically downgrades the lock back to an upgradable read lock.Áü—éA> The closure's return value is wrapped in `Some` and returned.ÁÝéúüåéHE This function only requires a mutable reference to the guard, unlikeÁü²ê-* `upgrade` which takes the guard by value.Á²|äêlÿê „ àb¦œ‡>ч>רר ¬ëÑÍìéñë· ’ëƒ –"¦œ ƒ •Y¬•ëƒ ¦œÎò˜"éñ§ë
ÖÚY•Yéñ¦œ$±ë± ·ëz|~üáôWü’ð\Y First, tries to atomically upgrade an upgradable read lock into an exclusive write lock.ÁóðúüûðMž—ÍñúüÕñYV Otherwise, calls the provided closure with an exclusive reference to the lock's data,Áü³òDA and finally downgrades the lock back to an upgradable read lock.ÁüüòAÕîÂóúüÊóH®ïü—ô1. `try_upgrade` which takes the guard by value.Á²|ÍôŒèô † àb¦œÛ¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙéñч>ÚÛÛÚ ™õÑ£òúô· ÿô–"¦œ … •Y¬‚õ¦œÎø˜"éñ”õ
ÙÚY•Yéñ¦œ$žõ± ¤õz|~üÆú[ÚÝ£Þ¥ßÞÝßÀ” ÏúÑ” îúîY¬Òúêú •úúàbàáËú@BÝGIÝüµýxü¨ûIF Tries to atomically upgrade an upgradable read lock into an exclusiveÁüöû+( write lock, until a timeout is reached.Á¦üúü®üGÀ¾üúü" the current guard is returned.Á²|¡ý|¼ýàbYÖÐßÜÜ
àÚY•Y¾ Õý€Ò<æýüÀƒyü¥Iôùüó+Èú£‚úü«‚GÀ¾ü÷‚"šû²|¬ƒŒÇƒàbY×ÐßÜÜ
áÚY•Y¾ ⃀Ò<óƒü±‡{Úã£ä¥åãåäÀ” º‡Ñ” õ‡‘ú¬½‡ö¾ÌÕ‡ñ‡ •ˆàbæé¶‡BDãIKãü¹ü³ˆIôùü+Èú±‰úü¹‰GÀ¾¼…Š `None` is returned.Á¡Šúü©ŠYåóü‡‹DÉôüЋAÕî–ŒúüžŒH®ïüëŒ52 `try_upgrade_for` which takes the guard by value.Á²|¥¬Àˆ  ˆ àbãü¦œ¯÷â‡>çèçè þâ£òÖ· Û–"¦œ ‡ •Y¬Þ¦œŽƒ˜"éñð
æÚY•Yéñ¦œ$ƒŽ€Ò<‘ޱ ¯ŽˆŠüì˜üä“Iôùü²”+Èúâ”úüê”GÀ¾¼¶•ÉÿÒ•úüÚ•Yåóü¸–DÉôüAÕîÇ—úüÏ—H®ïüœ˜74 `try_upgrade_until` which takes the guard by value.Á²|ؘ¼ó˜Š  Š àb›þ¦œ¯÷â‡>êëêë ³™â£ò‹™· –"¦œ ‰ •Y¬“™¦œ˜"éñ¥™
éÚY•Yéñ¦œ$¸™€Ò<Æ™± 㙈Šü˜Ÿ`Úí£î¥ïíîïÀ” ¡ŸÑ” »ŸÑÖ„¤Ÿ·Ÿ •ÇŸàbðñê!ë!ñŸEGíLNí\ÿŸ4„ ìì•Y¬¢ ,¥  ‹ àb ‹ •Yì « ì
ñÚY•Y$¬ üï _Úó£ô¥õõóôÀ” ø Ñ” ’¡ÑÖ„û Ž¡ •ž¡àbö"öô >@óEGó”ã¡$æ¡
 `£c `àB¤GS
 Â÷ ¢¤÷
ûÚY•Y$£¤± ©¤üƒ¥zÚý£þ¥ÿÿþýÀ” Œ¥Ñ” ¦¥ÑÖ¥¢¥­Çd©¥ •Á¥àb€Åcˆ¥GIýNPýü„¦8‡¦     àb   c cˆ¢cµ
 `£c `àB¤GS
Âü ‹¦ü
ÚY•Y$Œ¦± ’¦ü¡bÚ£ƒ¥ƒÀ” ±Ñ” ÄÑõÀ •×Õc­<>CEü‡žÚ£¥ˆˆÀ” —žÑ” ªžÑõLšž¦ž$¶ž •½žÌìYÅ$„ŸÕc“žTV[]üŽŸKÚŠ£¥ŒŒŠÀ” —ŸÑ” ªŸÑõLšŸ¦Ÿ •¶ŸÕc“Ÿ<>ŠCEŠüˆ£qüàŸJ¹ø¯ úü· DA This operation cannot fail as the `MappedRwLockReadGuard` passedÁü€¡äù¤¡úü¬¡3»™üä¡WT used as `MappedRwLockReadGuard::map(...)`. A method would interfere with methods ofÁüÀ¢5К£Õc¦œ®ü¦ŽŽ¥ “£· ž£–"¦œ “ •Y„裦œ‡™˜" “ öœö£
ÚY•Yöœ¦œ¾ ¡£± ª£üÒ©üÕ¥Jäýü¤¦LÑÚõ¦úüý¦D®•üƧäùê§úüò§3»™üª¨[X used as `MappedRwLockReadGuard::try_map(...)`. A method would interfere with methods ofÁüŠ©5К<Ù©Õc¦œÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
®üÕc¦¥ á©· ì©–"¦œ ” •YÄΦœ³˜"Û¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙ ” öœTÒª
ÚY•Yöœ¦œ¾ 况 ø©ÊÌÎÐü½±µü’­Jäýüá­Mä£ü³®!¼¤Ù®úüá®D®•üª¯äùίúüÖ¯3»™üްb_ used as `MappedRwLockReadGuard::try_map_or_err(...)`. A method would interfere with methods ofÁüõ°5К|ıÕc¦œÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
®üÕc¨¦¥ Ô±· ß±Þ¨ â±–"¦œ • •YÜÖ²¦œØ¢˜"Ö¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
 • öœ¨lä²
ÚY•Yöœ¦œ¨¾ î±± ÿ±äæèêìîüªµOÚ˜£¥š˜šÀ” ³µÑ” ʵßl¶µƵ •ÖµÕc›¯µ68˜=?˜Ü´¼ü€¶6Ä»¶úüöJ’Žü’·KçŽüâ·I½ü°¸Eüú¸Máü̹C¹‘”ºúüœºLϵüíºL¦¶ü¾»OL using this method instead of dropping the `MappedRwLockReadGuard` normally.Á²| ¼\»¼Õc
ÚY•Y¾ Ǽüý½UÚ£ž¥ŸŸžÀ” †¾Ñ” ™¾ÑõL‰¾•¾ •¥¾Õc ¡ê!ë!¡‚¾EGLN\Ù¾4Þ¾œœ•Y¬ü¾,ÿ¾ – Õc – •Yœ …¿œ
¡ÚY•Y$†¿ü¼¿TÚ££¤¥¥¤£¥À” ſє Ø¿ÑõLȿԿ •ä¿Õc¦"¦Á¿>@£EG£”¥À$¨À — Õc¢ ­À¢
¦ÚY•Y$²ÀüËÁkÚ¨£©¥ª¨©ªÀ” ÔÁÑ” çÁÑõL×ÁãÁ¹ÄTêÁ •€ÂÕc«Àc«ÐÁGI¨NP¨ü½Â8À˜ š  ˜ Õc  c cˆ¢cµ
 `£c `àB¤GS
š § Ä§
«ÚY•Y$ű ËÂü¥ÃoÚ­£®¥¯¯­®À” ®ÃÑ” ÁÃÑõL±Ã½Ã­ÇdÄà•ÜÃÕc°Åc°ªÃGI­NP­ü›Ä8žÄ œ    Õc œ  c cˆ¢cµ
 `£c `àB¤GS
 ¬ ¢Ä¬
°ÚY•Y$£Ä± ©ÄüïÊgÚ²£³¥´³²´À” ÿÊÑ” ’ËÑõL‚ËŽË$žË •¥ËàdûÊ<>²CE²üÛËÚ£·¥¸·¸À” ëËÑ” þËÑõLîËúËÅË$ŠÌ •‘̤”$ÙÌàdçËEGLNüãÌLÚº£»¥¼¼º»À” ìÌÑ” ÿÌÑõLïÌûÌ •‹Íàd½ÀÃèÌ<>ºCEºüáÐzü¶ÍK±¦†ÎúüŽÎEB This operation cannot fail as the `MappedRwLockWriteGuard` passedÁüØÎäùüÎúü„Ï3»™ü¼ÏXU used as `MappedRwLockWriteGuard::map(...)`. A method would interfere with methods ofÁü™Ð5КèÐàd¦œŽª¹¦¾¿¿¾¹¥ ìз ÷О –"¦œ ž •YÄÂÑž ¦œ“¹˜" ž öœ4ÔÑ
½ÚY•Yöœ¦œ¾ úб ƒÑü¼×ü¼ÓKÄ«üŒÔLÑÚÝÔúüåÔE¸µü¯ÕäùÓÕúüÛÕ3»™ü“Ö\Y used as `MappedRwLockWriteGuard::try_map(...)`. A method would interfere with methods ofÁüôÖ5К<Ã×àd¦œÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
Žªàd¹¦ÁÂÁ¹¥ Ë×· Öן –"¦œ Ÿ •Yü¯Ø Ÿ ¦œÀ½˜"Û¼ݼÞ¼©ß¼à¼ÛἈcSñŸ«‡zÙ Ÿ öœtÁØ
ÀÚY•Yöœ¦œ¾ Ù×± â×ËÍÏÑü¸ß½üŠÛKÄ«üÚÛMä£ü¬Ü!¼¤ÒÜúüÚÜE¸µü¤ÝäùÈÝúüÐÝ3»™üˆÞc` used as `MappedRwLockWriteGuard::try_map_or_err(...)`. A method would interfere with methods ofÁüðÞ5Кt¿ßàd¦œÖ¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
Žªàd¨¹¦ÄÅÆÆÄŹ¥ Îß· ÙßÞ¨ Üß  –"¦œ   •YüÑà#  ¦œç˜"Ö¿Ù¿Ú¿«Û¿ˆÜ¿Ý¿Þ¿ˆ‚†f|Â
   öœ¨Œãà
ÃÚY•Yöœ¦œ¨¾ èß± ùßåçéëíïü²ãPÚȣɥÊÊÈÉÀ” »ãÑ” Òãßl¾ãÎã •ÞãàdË·ã68È=?Èܾêü‰ä6ÄÄäúüÌäJ’Žü›åKçŽüëåI½ü¹æEüƒçMáüÕçC¹‘èúü¥èLϵüöèL¦¶üÇéPM using this method instead of dropping the `MappedRwLockWriteGuard` normally.Á²|ªê\ÅêàdÇÇ
ËÚY•Y¾ ÑêüìVÚͣΥÏÎÏÍÀ” ˜ìÑ” «ìÑõL›ì§ì •·ìàdÐÑê!ë!Ñ”ìEGÍLNÍ\ìì4ñìÌÌ•Y¬í,’í¡  ¡ àd ¡ •YÌ ˜íÌ
ÑÚY•Y$™íüÏíYÚÓ£Ô¥ÕÓÔÕÀ” ØíÑ” ëíÑõLÛíçí •÷íàdÖ÷!ÖÔí>@ÓEGÓü½î!LÀî¢  ¢ àd ¢ •YÒ ÊîÒ
ÖÚY•Y$ÏîüïUÚØ£Ù¥ÚØÚÙÀ” –ïÑ” ©ïÑõL™ï¥ï •µïàdÛ"Û’ï>@ØEGØ”÷ï$úï£  £ àd× ÿï×
ÛÚY•Y$„ðü¥ñlÚÝ£Þ¥ßßÝÞÀ” ®ñÑ” ÁñÑõL±ñ½ñ¹ÄTÄñ •ÚñàdàÀcàªñGIÝNPÝü˜ò8›ò¤ ¥ ¦  ¤ àd ¥  c cˆ¢cµ
 `£c `àB¤GS
¦ ÂÜ ŸòÜ
àÚY•Y$ ò± ¦òü€ópÚâ£ã¥äâãäÀ” ‰óÑ” œóÑõLŒó˜ó­ÇdŸó •·óàdåÅcå…óGIâNPâü÷ó8úó§ ¨ ©  § àd ¨  c cˆ¢cµ
 `£c `àB¤GS
© Âá þóá
åÚY•Y$ÿó± …ôüÁ†1ü؃PM An RAII implementation of a "scoped lock" of a mutex. When this structure isÁü©„<9 dropped (falls out of scope), the lock will be unlocked.Áæ„úüê„NK The data protected by the mutex can be accessed through this guard via itsÁü¹…+( `Deref` and `DerefMut` implementations.Áhas_significant_dropÁäç…üå….ü…†;+if unused the Mutex will immediately unlockÁôDÚè£é¥êêèéÀ” ۆє è†â”DÞ†´ù† • ÑX3ÙbŽd¥ëìŠ׆KMOQJ,ù† ççã—ü•‡04•‡ çç÷±Fu\»Ÿ¶°çË!õ<nà€íù€íííníY•Y†­‹­  çç¥ëê ìÚ 3ÙbŽd¥Y•Y!õ<wà€îù€îîîwîY•Y†­‹­äÚñÚü¹ã7üðßKH An RAII mutex guard returned by `MutexGuard::map`, which can point to aÁü¼à# subfield of the protected data.ÁààúüäàOL The main difference between `MappedMutexGuard` and `MutexGuard` is that theÁü´áKH former doesn't support temporarily unlocking and re-locking, since thatÁü€âPM could introduce soundness issues if the locked object is modified by anotherÁ\Ñâ thread.Á›ÖäßâüÝâ.üýâ;ÈÖEÚð£ñ¥òñòðÀ” ÙãÑ” æãâ”DÜãT÷ã •ô™äÔY?ÌBC½óôõ¿ÕãPRTVO÷ã ïï ÚYd‡ä$‡ä ïïÙ¼ƒ4™ä ïï÷±Fu\»Ÿ¶°ü–¥Jüª¢WT An RAII implementation of a "scoped lock" of a reentrant mutex. When this structureÁü‚£?< is dropped (falls out of scope), the lock will be unlocked.Á£úüÆ£N’ÕÜ•¤ `Deref` implementation.Á›Ö䳤ü±¤.üѤD4if unused the ReentrantMutex will immediately unlockÁEÚ÷£ø˜ù¥úúøù÷À” ¹¥“Рƥ¤Ð Ö¥â”D¼¥ÐÐ\É¥üç¥$ðÐ
Ñõ\ë*÷\B!5ûüúµ¥dfhjln^<ç¥Ëöö³Ôü‘¦)4‘¦Ëöö÷±Fu\»Ÿ Ú¾]W!õ<áà€ýù€ýýýáý Y¸]¾]¦œ·çäÚ  ööŠHûœËüÚËë*÷\B!5Y¸]¾]!õ<êà€þù€þþþêþ Y¸]¾]¦œ·çäÚ¥èü¶PüÉýTQ An RAII mutex guard returned by `ReentrantMutexGuard::map`, which can point to aÁüžþ#ÜÂþúüÆþa^ The main difference between `MappedReentrantMutexGuard` and `ReentrantMutexGuard` is that theÁü¨ÿK¢ÝüôÿPøÝ\Å€ÒÞ›ÖäÓ€üÑ€.üñ€Dºã
-EÚ£˜¥ƒƒÀ” ߓРì¤Ð üâ”ÐÐü ðÐ
ÑÔÇ‚ó]::¸×Ÿ¸­ÛikmoqscËÿÿ Úáá¹äâËåïËæêËçËK§ˆˆ*¹^ÃY¸]t³‚$³‚Ëÿÿ ¾]è4Ç‚Ëÿÿ÷±Fu\»Ÿ«çü©ë7üöéHE RAII structure used to release the shared read access of a lock whenÁd¿ê dropped.Á›ÖäÎêüÌê.üìê<,if unused the RwLock will immediately unlockÁ @EÚˆ£¥ŠŠˆÀ” ÈëÑ” ÖëÑõLËëÄçë • ´`Ù'u˜K³šŒíÄëKMOQJ4ç뻲øü…ì,4…ì»÷±Fu\»Ÿ Ú•Y¬”!õ<×à€ù€×Y•Y†­‹­äÚ  Óú#»ŒÚ»Ù'u˜K³šY•Y!õ<ßà€Žù€ŽŽŽßŽY•Y†­‹­äÚôü»Ä8ü„ÃLI RAII structure used to release the exclusive write access of a lock whenÁdÑúï›ÖäàÃüÞÃ.üþÃ<åïSEÚ£¥À” ÛÄÑ” éÄÑõLÞÄÄúÄ • ëaJúÙ6¯×ÄKMOQJ4úÄ»²øü˜Å04˜Å»÷±Fu\»Ÿ¶°¬”!õ<Šà€ù€ŠY•Y†­‹­äÚ  Ôú#»Ú»JúÙ6Y•Y!õ<œà€ù€œY•Y†­‹­äÚÍùü°¼HüùºLI RAII structure used to release the upgradable read access of a lock whenÁdÆ»ºï›ÖäÕ»üÓ».üó»<åïfEÚ˜£¥šš˜À” ټє î¼ÑÖ„ܼÄÿ¼ • àbÎj»“·ÛœöÕ¼KMOQJ4ÿ¼»²øü½,4½»ïò!õ<Ãà€ù€ÃY•Y†­‹­äÚ  «Jú#»œÚ»Îj»“·ÛY•Y!õ<Íà€žù€žžžÍžY•Y†­‹­äÚÞþ! õ<Öà€Ÿù€ŸŸŸÖŸY•Yéñ¦œäÚÞþ!!õ<Ùà€ ù€   Ù Y•Yéñ¦œäÚÞþ!"õ<æà€¡ù€¡¡¡æ¡Y•Yéñ¦œäÚÞþ!#õ<éà€¢ù€¢¢¢é¢Y•Yéñ¦œäÚÞþüšœ=ü½˜TQ An RAII read lock guard returned by `RwLockReadGuard::map`, which can point to aÁü’™#ܶ™úüº™YV The main difference between `MappedRwLockReadGuard` and `RwLockReadGuard` is that theÁü”šK¢ÝüàšPøÝ\±›ÒÞ›Öä¿›ü½›.üÝ›<åïyEÚ¤£¥¥¦¥¤¦À” ¿œÑ” ÍœÑõLœTÞœ •Ô‚Õcâª4`T§¨©¦»œPRTVOÞœ»££Àátîœ$££ •Y€4‚»££÷±Fu\»Ÿ˜óüåÉ>ü„ÆVS An RAII write lock guard returned by `RwLockWriteGuard::map`, which can point to aÁüÛÆ#ÜÿÆúüƒÇ[X The main difference between `MappedRwLockWriteGuard` and `RwLockWriteGuard` is that theÁüßÇK¢Ýü«ÈPøÝ\üÈÒÞ›ÖäŠÉüˆÉ.ü¨É<åïŒEÚ«£¬¥­¬­«À” ‹ÊÑ” ™ÊÑõLŽÊTªÊ •ôÌÊàdšPR‹Eí»Ë®¯°Û‡ÊPRTVOªÊ»ªªÀádºÊ$ºÊ»ªªÙ¼4ÌÊ»ªªýá2]^g` ö`Wdfçh\i"<s'v,/x1†y6òy;]|@
¬Ší´ ð‹ „Œ(.1¿4:@øÂFL ÄR¿ÅXÆ^djîÒpvˆ×|êØˆŽêÚþÛšéÝ ¦¬•â²åå¸ È—ÀÜ—ÈçÎ ÀšÖÔšÞêä é­ì ÿ´ô ³½ü÷“ùÓú  ·Ú(ËÚ06 ªÜ>¾ÜF N V Ę^°ýdjÙúp ©x£© ˆ«Žœ«œÖó¢Ýò¨®”ñ´’ðºüïÀÆ…í̹ìÒëØÞäê·äð
äöžãüÌààÐÝÛ‚Ú &ºØ,Î×2Ö8>ÒDÆÑJÐP­ÏV«Î\ÿÍb³Âhnt¼z×¹ù··Œúµ˜
´ž²¤ª°½¬„«¼¸¨ÂÈ¥ÎÔ ¢ÚÿŸàkæœì×™ò¥—øþ¿’
 Ýæñæ ‚í(
Ž. ðò6 Óù> íFLpRå}X¼|^À{dbzj žrÖžz y š ˆ® šÆ˜…wž ̦ ƒÓ® ®ÛÑn¼ªgÂbfÈ9eÎ2dÔ6cÚØaà í†èð`ö ƈþÚˆØ^ ^lXW œë&vR, ‰õ4{O: åBIJH š™PXHV§F\«EbMDh ¬¤pÀ¤xöB~ •¦©¦Ž ï£ ˪ž ݲ¦Þ6¬â5²„4¸ ÎÂÀâÂÈ-3Î ¬ÄÖÀÄÞ ÉÑæ ¶Øî Øàö'ü&%¼# ©ò½òe"$ ˆô,œô4-27BF_r«îû¡®³ÑäŒþƒˆ˜¤©®´ÈÚû¾ÈÑÜâ¹Ç¤"ÒexampleÁextension traitsÁúÒóÿ˜¤ú‹™Òÿ˜‹™¤ú-Ö
RawMutex::lockÁ¾ é
RawMutex::try_lockÁRawMutexTimed::try_lock_forÁ ¥
RawMutexTimed::try_lock_untilÁÉ  Ø RawMutex::unlockÁ Self::from_rawÁÖ
é
晾 ƒššš¥
ÇšÉ Ø  øš–›Ö
é
æ™ƒš¾ Ø  šš¥
Çš!É øš–›–›¤ crate::MutexÁ ¢–›öœ" ¤¢ öœ–›¤¢  –› –› –›é!ö!ÃLðìŠ  غãàéæ³Œ""“""Û Þ ã ŒMÃMÐLÇLùMÌìÍì“íµßíßé!ÞÃLðìŠ  غãàéæ³Œ""“""Û Þ ã ŒMÃMÐLÇLùMÌìÍì“íµßíßé!ö!ÃÎÓÕÜßâèëîÃLðìŠ  غãàéæ³Œ""“""Û Þ ã ŒMÃMÐLÇLùMÌìÍì“íµßíߟrßɺ‰Ò½îÀ¶áðøYJR^ó%&ö`¢DfO¬T䔕¦¹ªjÕR8õ”¥O<σlÂ*ݰ”‡ä 6´Z9÷ïvÕÌÅ~n†#&E-Ÿ¨aá(.7YŸÄ_ç‚k eÛ‚îßž¬Õ)DÕÙ*õ¡æÄçÕK/bC[•¿LÆ«!vVYfð§{5…m¸½ «r†Ë/Dûa¡>’öŠÕ-Äž®–u0„Öã‹LØÃÁš¬}\è‚wJíÑ”Êz—š;‡üɵ™§Ï¹q½ 8µMˆ+—ÿƒ…ë£x˼x¢fCgò 8…¦ ç&jm-„ÎÌ£ªY-5½–»µÔXÐe«ÉH)ÍÍö¿QPÁÞx5^DX°ÑÜHðÿ]_i•C+Ž·È ·$&ša¡©ö³ÒzEØqIçùeÐ(àn4^( –*Ö­[÷zê_Æ?ß©@ÄæüÈ0Ü$õ€„w¤@Ïe%I¨“÷ZÂ@0hX6Þ­›™q¯ÖçÆÐ£k˜ô,BH„饸"Ìéyñ Ò ¥ê.§ÅŒ'%®¤M³Ûó`F9{³*˜émÑu•1Tl—v<×â]LC¨Þµ¢ªR™»PAxÚoG¸‡ D#>õ
æEzÝ.>Éïôb®Û¦/Û{»:€ 9JVEÜüÕ=ž'Ë òu€à*+aNû?œGv•‹†žk
=ÃÈRE—¤I¡KdhgÒé†*—'hŸ˜(×BX±vQ"Â@&RæÈÐ.l ¼QZŒzçMb'"ŽùÄÃÏRµ™u²f×$ñ:šÍJqB"˜—ð0aþ8~ÿ¾ZG󘛑µ¥†4ØMÓ󈶦‘IFBÀe75ZdøÑÛ&BBª|«y8ê¹çÙ*j­¯§LOÑdK-¿e*á8å“p\BHKÎÊæ(È:†ŽsÒíªÊŠr[Fe±³;¿"7| 1ËŸ!éæ#mfǘvÖ:°Žž
V2? d{µZªÍ’SÁ×Å·8Ö÷g)Ö9$”N”· ,c˜æÞZâ\]¨à9€r•ð
s1í§ :oÈ<ñAòx8‹Ñ\6æØ¥I£R¡=0® Þp‹alâv0Im”›hÎÏ*¶³£­ç®1oºÕ{4'ÞSÔš‡wDTzI ¹õãàõwèG—æW¡y/œ6ÒåQ j³CŽûöª4Ó<¡Š¢(Ž’äfFsý3{$Ê÷ŒÄDê´–k+=74´»’“;ùüð É-®÷tEô.ì¥æÛž]ÞFiap«‚;Ÿ…0õ#Hs0ÃÞäƒ``ŠÑ¥ÔÌä—þ¡£Pκ|Ž5¶Z (^{"˜qtÊü¤ÐÈ…Q}ªøí_С)ó+ym2
ù¥Ù™×SIÌ_M: @Lüº04‡@IÈj€™Y
¯5ÌUÏÙå;ůi°êø1;'
K®@îÒPÃÂÊOÈEîþZãÙ/Ÿé…½8ìI,Àܶ§$¿Ð2¦/Ö.i©úuZŸv€ê$ŒÊIJæå¡±»ô'Í,G«‡ë;ܺµ+œ~ÓÈ"
n-ÑÝ ©âÅ}äúú½ßÍ9–;•ߤ"¤Žw¶-Á»;}jqíÅ¿Œ9žÀþºñ¨×_”â=™Q²l7ú¢ùî+ÌE¥JVIT_©º¡Zòë(JÞΑÌ6.x”,5ÕPXú%hõÚCgEŽF4øj@þù£Ò†=HëEÇ3,¨„a\ùŠ
$¾„ Çëùݘ£‹÷Çëa™†mÄy1B;_rß컳Ã
,cÛ–„Äfçw@lïôtK‚à™œ¾£ôšŽÔÅqwÈíÚ®cuu"}òºñÊPvâÑ€hRã­S¿ªá„Bœà/ÝN)Ù³à!'ë©g¬žÂºO³ðn2Á±1rg’¢ú˜W_è
²Où_ð3x;@èžeˆR
à=öA”:Ps ¿s\®â©ù‚DA;–AÇI‡BÙÅß./I¸°š¬ê½{ôôŠFØÓµ—a à `‡o0Oó$ûªÍJ¸þþSHþ®!=½­¨BG­˜’Ô­«7IÅH½ :`,ΜÖPyPµÊ¤iÊ!i8ú7x.åé®6ï¨—ÊÆå>(ó5±\ú®æ¸/Ñæç3æX i}f2SÂî®(ªDÚRi š?—Ø¢#Îruî7’ŠŠQ½îøQ«æY×òSþzØY*Qù-BGøÏÊçÝmMÄÚ³¢ñ.QÑ  f”»3°°¬Ú–
HY¡SIÚœKŠ&ý[`ßM”
R}]ijß,î1(º‚ä>ú¸ uð3)ô¦n–2ê̈ÁK“¦Ö·Jˆ‰¨‹Ò½ Ö¬ÆT5¨Œc2¯ÓS>l%!!S `-¾–i|qóLçÕ€fµ´_ys\ ™_­ý ,SØV‹ë>éÙVO
I.\ÿgÅùñCÐW·°=âÞ#OQ‡nVyÙkQ/jL-…˜
xh½ÍÉ×Wø<þÂjÖòm+o­£ETaª %0
œFC±´ìЇ)rÅÖ¥}Ž!üÕŸƒ!ŸŸ–´e“k%ùHzÿ5]VúÉfÒ‚DT'ž}Ü%¶bÈÀü³=Ìa4ØažðÔv ãFű®ÅÒ(‚ä { ji¦¬è®߉ÏtCûìÕ ,Â,BKr
Ï¢|óûS‹À†1}ªè|ûe4¡>Ó”}Z}¢yA,['ÂG ”G±^›„ÔªMn}¼™‚f°ka\[¢æ|egàÐD×ÁoWÛ <M-€Ùq˜ð÷âëáö%UŒ
×Â%*T;ôudèxÒ烲6`^Q÷äË¥¸²sÐÛ2ôÔêÆÓÍ€oÐNž
æ;ÉŠÿ™™5š~Žv¹ðISÀ¼°SGZÌåqÈ$MF¨` UU%g¨L 6
öFltòKþüí¦TËáÞŠÑ_vÆYrσµ±ÐÍ!hª&4OØwhÈ ÕC wD¾\
§¶öÿ6¯*}’ìªq•©Y'Fo"9‰•Æe"êß=DIª.*$0™ƒ\¤‡î­jÃðV1Àm‘ËNÙ¼´'…V›=Eæ›x¾·û±XÚý³ü ”>2”òF‰Æ.ÙÑÉÍ)+<ATªò=Wß8Æ4d¥¾:ìˆ+ªýL÷ZÁ †úÃϼ¯¨åêÅ ÷‹L ÊÙôX+¬!¸ö戶KP®« ©v·ûQ<ù2yÑÃÀ{ÚÔg®5ް?§ÆeDÍ ŒÃ•#i¦ÝÙþÀzÌÍ¢@…Ó½–بCÉ马\"BÐ<œqŸ‘²FÀÞ‚7½Ô<"D±
!'‡g®¡d€X.\·ù†¸"-À ¡SðX÷yÍG„_Ë¿ßüúß}. mvD÷™ l4n/_`Ѐ½£É·yî%Ú<Òk¿JR‡ ÆÉAB{··½ÎjÙ÷´¯ØF?L)V‰It
ÿXþ¢º]Â’zq¼m&tY:Ÿ^ãÛÅ}ÍÅoîÓ&‹˜˜{jDO-$ãª2úf¥rváÌ«èN¶:dÅ)E”l¸u¨£å¡©ÁEt‹­Þ#Ašâ۱ɥR;?¿Ø