rust}#rustc 1.72.0 (5680fa18f 2023-08-23) }ޱL{ :-8f88c761e33f2651ՆQ4-46a989d0e2cef827e$ɛDp>-b114db70ea0690b1rustc_std_workspace_core ūu sR-13da980d6c74fec5YnFmZܝ--649be05783c8912epWĪ9/-f002c8f83a289c4b &c~~*ĽVa-682387162b570769cfg_ifz$kdgK!--05a2cedbb78c1d4f miniz_oxidePnzn )m-9c3df673b2797081adlerA%lon  2-c6afbee8d1102512 hashbrown8*^| -356231f77d1e268arustc_std_workspace_allocL%gqG-80ed5799bf463787 std_detecta^Ʒc -1bccb7a942e1b311rustc_demanglekŗ,N/ST%L)-bc6864da821ce9a2 addr2line2Ȃ']51:.-4930b3dc482158f7gimli~2)F25˼-65bea4bb6af40828object^]UVW-919f89587cbed68dmemchrk/YO+-c6624cb4360306cdBhnge],Q-f9018f9cee1cc5fflogmc$x-13e3634f7ef0e600b5Xܤ*-7210a355a56b809eL L   wasi   os-ext  (assert_close_on_exec_flagGGGG  G android G GGkqueue    dragonfly     freebsd     ios    macos    netbsd    openbsd event                               Event                               Events                               Selector                                                BJWaker                BJpipe         illumos             redox/.....  .   . ./  / / //  /   ///  / / //  / //..net""tcp""udp""uds"" SocketAddr ""set_nonblocking    os-poll'  ''  Lshell''  L''  L''  AsRawFdPPT  T   `TN AsRawSocket  ### ###***  *   ***" "" macros cfg_os_pollcfg_not_os_poll cfg_os_extcfg_net cfg_io_sourcecfg_any_os_extinterest     READABLE WRITABLE AIO LIO 00remove is_readable is_writableis_aiois_lio   !########## # # # # #2registry#Registry4selector#626#9 as_raw_fd#;#=register>S= reregister@3= deregisterB3= try_cloneD =register_waker=2#H#J2systokenMNwakerPPPPPPVW VwakeZ[[[[[`4`1`1`is_error`is_read_closed`is_write_closed` is_priority`1`1`from_sys_event_ref[kl EventDetailsm m'am lq6qZeventsttttxinnertz with_capacityzcapacityzis_emptyzzclearz4t6ItemIntoItert67 size_hinttZsourceSource333333ZZZZZ featuresguide Interest             6 L debug_detailL syscallL2epoll     NEXT_ID3 selectMAX_SAFE_TIMEOUT  3 3 3 32interests_to_epoll411555511 debug_details check_events LOWEST_FDsourcefd63334eventfd   4 reset idep has_wakerA EventsDetails  SourceFd 6 6fd IoSourceState do_ioFR      %try_ioC 333write write_vectored flush E E F  from_raw_fd2 into_raw_fd%EC  333 read  read_vectored  G G   F2F%Sender77MToken  MMMMMMMMM M P7P[7[tIter67post6t6 io_source     IoSource 7 selector_idCCC into_inner333 UNASSOCIATED associatecheck_associationremove_association SelectorIdA 7"7"7"7778787:7<7<7<7>7>7@7@7B7B7D7F7G7I7I7I7K7W7Y7a7b7c7d7e7f7g7h7i7j7l7l7l7s7s7s7|7}7~777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777:  _i[[[[[[[[[[[[[G[$2232#>ӻ2G\G44252#}p/ՠ$\GAAA\ӄ*e$]]GB  ӺJGB 8q6B 8q6GCuHGH7ipI__ 7__)) ChildStdin)7)#%$_$_$_G7j:&d`` 7``** ChildStdout*7) `** ChildStderr*7)w6XVx$`$`$`I bbGbbbbbbbbbIbbG7PtUi7[8(GcGmmn6p [ -`-֮r6GJ7tJt0eוz6J7tJt0eוz68 6xxy7tm8,9J7tJt0eוz6GeBox  l*666Global 7C\ wL 7L̽D|fggGgGNAG>g  92J4!qmk;2xH4 N$ $ $GnI#89 ҮҮӮԮ  ~ƜZH l   ll    [ n  l n           n             [  n        l  l     ll       {-PLess~Greater0^  n  n  n  n          l  l     l      r  n  n  n  n            u  1  u  u  2  u  u  4  u  u  8 -  "   "      u "  7    W  W - [  l - W   u7Interest(unsafe { NonZeroU8::new_unchecked(READABLE) }) -  "   "   x  u "  7    W  W - [  l - W   u7Interest(unsafe { NonZeroU8::new_unchecked(WRITABLE) })A     l          l    |      6  6  x6  K    A  [ [ [ lA u u l u l        l   |     u   u  U  [ u u l  U  u    l   |     u   u  U  [ u u l  U  u    l   |     u   u  K  [ u u l  K  u    l   |     u   u  K  [ u u l  K  u        C [  [  [       C ! ! !  [[! ! l! l!  !S o! [! [! l! [! [! ! ! !S d  4dE 2e dP \d  ]\odP ]d \d 2d dP /    >3 OffWarnInfopTrace1h.g   p}[  = = =    =  =  Ӑ   =  =B B >  cB   ߓ! !Ԫ !Ԫ  Gb!Ԫ ! ! !  G[ ! != GvalueG formatterG1 2 7e!=!=  !=!= G !=>>> ߓߓߓ#   ߓߓ    ī '     ԫ >     'wo <[Zdɩ \  b [ ِ  =  ِ ÚoIpiecesEEE4&w\NF!=B != c!=!=!Ԫ b! ! n! ِ {-P#b [ī >ܓB   8 4  interests lvl   #>#> mio::poll ߓ#>= %> mio::poll ߓ X/home/steffen/.cargo/registry/src/index.crates.io-6f17d22bba15001f/mio-0.8.5/src/poll.rsXXߓ >>> >=ߓ#>ߓ#>>B  ߓB ,registering event source with poller: token=,,ߓB  , interests= ߓB B > ܓB ޓB B     >     */ , , , @, , Ӑ, , =, =, =, ,, , = , =,  ,,Ӑ  ,, = , =D D @ܓD . .̿ .̿ .̿ . .ܿ .ܿ  .ܿ .= .=.=.=.= .=,,>,>@,# ,,  ,  )    "  @ ,    b [ ِ,  =, Ú, ,Ú,,,o,.=D .=.=.=.̿ Ü. .ܿ n. ِ,,#b [ ,>ܓD ,  8 4 Ɲ ,  , 0>0> mio::poll ߓ0>,= 2> mio::poll ߓ X/home/steffen/.cargo/registry/src/index.crates.io-6f17d22bba15001f/mio-0.8.5/src/poll.rsXXߓ X,>,>@, ,>,=ߓ0>ߓ0>,>D  ߓD .reregistering event source with poller: token=..ߓD  , interests= ߓD D @, ܓD ޓD D , , , , @, , , ,  7/ 9 9 9 B9 9 Ӑ9 9 =9 =9 =999 9 = 9 =9  99Ӑ 99 =9 =( ( B ߓc(  ;=;= G ;=99>9>B9# 99   9      B 9    ِ9  =9 Ú9 9Ú999o9;=( ِ99#9>( 9  8 9  9 =>=> mio::poll ߓ=>9= ?> mio::poll ߓ0 X/home/steffen/.cargo/registry/src/index.crates.io-6f17d22bba15001f/mio-0.8.5/src/poll.rsXXߓ0 9>9>B9 9>9=ߓ=>ߓ=>9>(  ߓ( &deregistering event source from poller&&ߓ( ( B9 ( ( ( 9 9 9 9 B9 9 9 9  4 E \ E \o ] 2    c22\vD?, 2  ]  c& &  & DDODDD't & D7 D7  ] ]c7& &BA(O A _ref__self   @@@ libc::c_int::max_value() as u128   _  $ $$$   _ $  $ $    !  !0 zsecs_nanos_(1Ao $!toto_ms!!  444buf040bW`( epoll_event6 ^;CtQf!!!c!!! 4f!" !,o  o  o!!c!  n_events 6  _ref__events%%o%o%%%((o(o((())o)o)))!! !3   $7ɵEE Ü E ['   o_w Bo_            'w_ ÜEbÜ C24Ü[_ref__selector _ref__token   _o   c  c  8cc8     C f     'wC  C #s^" io''c''c''2JL 7L̽D|J C     'wJJ JJII  _II JJIIIJJJ ooJJJJJ JJIJPP   uPPP P PP   'wcP PP  PPPsenderP OP _ref__bufQQ   ???IoSlice?  0%W*QQQ QQQ(QQ(Q QQ(Q(Q bufsPQ( _ref__bufsRRR RRRR oRR RR RSSSSSS SSSSS SSSS RSTTTTTTTT(TT(T TT(T(T ST(UUUUUUUoUU UU Upp pp ppoo  `ooppooopppopppppppopuu  uuu u uuuuu uuuu uuvw    IoSliceMut  !3lwvv  vwv'vv'v vv'v'v vv'xxxxxx xxxxx xxxx wxyyyyy yyy'yy'y yy'y'y xy'& & & & b& Ü& & & & c& c& & & & Ü& Ü& c& c& & & & & & & o& Ü& & & & c& c& &  cc& & & q& Ü& Ü& c& & & & & & c& c& &  c& & & r& Ü& Ü& & & & & & & c& &  Ic& & & o& Ü& & & &  & &   X c X _co _ 7          c c     , ,$ ,  ,$ - g,V , , , , ,V  e  c  J7tJt0eוz  c  !-!-Unique_markerEO+7fNonNull#CC8ff f!-!-! f!$!  f  b [  f!-f   2 4 Ɲ "/"/"/"/"  f"&#!"ܘ! !b"[" "/f! ! ! 2!4"Ɲ" !#####  f###m#ܘ# ##f# # # 2##m   fg ffg  f  f  g   f7fg7 f< <fL g  L $g$  %% %% %  G  % c   'w,k%  %`  f  $f  `  2%% b[ l c utyo%$ g$`  24Ɲ    %o  ,g ,    - - - -  -     -  c -   - b ! f!!  !  b!    !4!   - - b[ « - , ,   b !! 24Ɲ     -o "-g"-" "".".".". "."" " "."c".""."6 # f##  # "6#   #"#!""".". !! !«"."-"-"""6"##! 2! " ".o!3f33 Gf332Z   'wo z*3 2 GGGEGEGEG EGEGEQ ! >S33232Z66c66c6607$7$ 7$77c7$6L 776yg6 7$6y7c   [ l     [ l  W WW]WWWW WW]WWW B 8q  & & & b& c& & & & & b& c& & @ m@ n@ mmn6p [ -`-֮@ @ @ @ m@ n@ @ @ @  #LMPZ  x:  22 4I I  J     warnings#L Mio is a fast, low-level I/O library for Rust focusing on non-blocking APIsOM and event notification for building high performance I/O apps with as littleP/ overhead as possible over the OS abstractions.2 # Usage L Using Mio starts by creating a [`Poll`], which reads events from the OS andOJ puts them into [`Events`]. You can handle I/O events from the OS with it.M For more detail, see [`Poll`]."" [`Poll`]: ../mio/struct.Poll.html%, [`Events`]: ../mio/event/struct.Events.html/ ## ExamplesJ Examples can found in the `examples` directory of the source code, or [onM GitHub]. B [on GitHub]: https://github.com/tokio-rs/mio/tree/master/examplesE ## Guide > A getting started guide is available in the [`guide`] module.A ## Available featuresA The available features are described in the [`features`] module.D #LMPZ  x:  22 4I I             '   docsrs   '         '                       "     "                                      "                                      "                                                            "                               "         Ү  # %  (     # # ( (    u   u   u   u [  : Returns a `Interest` set representing readable interests.=  [  : Returns a `Interest` set representing writable interests. =  [3  Add together two `Interest`.  A This does the same thing as the `BitOr` implementation, but is aD  constant function.   ```  use mio::Interest;  H const INTERESTS: Interest = Interest::READABLE.add(Interest::WRITABLE);K / # fn silent_dead_code_warning(_: Interest) { }2 & # silent_dead_code_warning(INTERESTS))   [[[  8 ( Removes `other` `Interest` from `self`.+  A Returns `None` if the set would be empty after removing `other`.D     K const RW_INTERESTS: Interest = Interest::READABLE.add(Interest::WRITABLE);N  : // As long a one interest remain this will return `Some`.= C let w_interest = RW_INTERESTS.remove(Interest::READABLE).unwrap();F $ assert!(!w_interest.is_readable());' # assert!(w_interest.is_writable());&  ; // Removing all interests from the set will return `None`.> 9 assert_eq!(w_interest.remove(Interest::WRITABLE), None);<  ; // Its also possible to remove multiple interests at once.> 5 assert_eq!(RW_INTERESTS.remove(RW_INTERESTS), None);8   [[ {-P[   & 7 Returns true if the value includes readable readiness.:  [  & 7 Returns true if the value includes writable readiness.:  [  ! 2 Returns true if `Interest` contains AIO readiness5  [  ! 2 Returns true if `Interest` contains LIO readiness5  [   [  [ #  [[[     " [ !' ! 7 7[[o!  ! ! ! ["": " 777 7[ 7GGGEGEGEG EGEGEQ ! >S7!" ! "" "  24  Z#%4 L#& x#':  #(I* #)I* #)trace; #*+g $#,RawFdp $#-z #. %#0 #1,          * * 6 ; S# g g p p |       U 5 Polls for readiness events on all registered values.8  I `Poll` allows a program to monitor a large number of [`event::Source`]s,L L waiting until one or more become "ready" for some class of operations; e.g.O K reading and writing. An event source is considered ready if it is possibleN C to immediately perform a corresponding operation; e.g. [`read`] orF  [`write`].  K To use `Poll`, an `event::Source` must first be registered with the `Poll`N E instance using the [`register`] method on its associated `Register`,H H supplying readiness interest. The readiness interest tells `Poll` whichK I specific operations on the handle to monitor for readiness. A `Token` isL J also passed to the [`register`] function. When `Poll` returns a readinessM G event, it will include this token. This associates the event with theJ ' event source that generated the event.*  - [`event::Source`]: ./event/trait.Source.html0 2 [`read`]: ./net/struct.TcpStream.html#method.read5 4 [`write`]: ./net/struct.TcpStream.html#method.write 7 3 [`register`]: struct.Registry.html#method.register 6    # Examples    : A basic example -- establishing a `TcpStream` connection. =         ```ignore   # use std::error::Error;  , # fn main() -> Result<(), Box> { / * use mio::{Events, Poll, Interest, Token}; -  use mio::net::TcpStream;    " use std::net::{self, SocketAddr}; %   ' // Bind a server socket to connect to. * / let addr: SocketAddr = "127.0.0.1:0".parse()?; 2 , let server = net::TcpListener::bind(addr)?;/  J // Construct a new `Poll` handle as well as the `Events` we'll store intoM  let mut poll = Poll::new()?; . let mut events = Events::with_capacity(1024);1   // Connect the stream < let mut stream = TcpStream::connect(server.local_addr()?)?;?  # // Register the stream with `Poll`& [ poll.registry().register(&mut stream, Token(0), Interest::READABLE | Interest::WRITABLE)?;^  I // Wait for the socket to become ready. This has to happens in a loop toL  // handle spurious wakeups.  loop { # poll.poll(&mut events, None)?;&   for event in &events { > if event.token() == Token(0) && event.is_writable() {A L // The socket connected (probably, it could still be a spuriousO  // wakeup)  return Ok(());  }  }  }  # }    # Portability  I Using `Poll` provides a portable interface across supported platforms asL ; long as the caller takes the following into consideration:>   ### Spurious events  B [`Poll::poll`] may return readiness events even if the associatedE B event source is not actually ready. Given the same code, this mayE K happen more on some platforms than others. It is important to never assumeN G that, just because a readiness event was received, that the associatedJ  operation will succeed as well.#  I If operation fails with [`WouldBlock`], then the caller should not treatL K this as an error, but instead should wait until another readiness event isN  received.   ### Draining readiness  H Once a readiness event is received, the corresponding operation must beK K performed repeatedly until it returns [`WouldBlock`]. Unless this is done,N K there is no guarantee that another readiness event will be delivered, evenN 2 if further data is received for the event source.5  / [`WouldBlock`]: std::io::ErrorKind::WouldBlock2   ### Readiness operations  G The only readiness operations that are guaranteed to be present on allJ K supported platforms are [`readable`] and [`writable`]. All other readinessN E operations may have false negatives and as such should be consideredH G **hints**. This means that if a socket is registered with [`readable`]J J interest and either an error or close is received, a readiness event will M D be generated for the socket, but it **may** only include `readable` G D readiness. Also note that, given the potential for spurious events,!G K receiving a readiness event with `read_closed`, `write_closed`, or `error`!N G doesn't actually mean that a `read` on the socket will return a result"J  matching the readiness event.#! # M In other words, portable programs that explicitly check for [`read_closed`],#P B [`write_closed`], or [`error`] readiness should be doing so as an#E J **optimization** and always be able to handle an error or close situation$M + when performing the actual read operation.%. % ; [`readable`]: ./event/struct.Event.html#method.is_readable%> ; [`writable`]: ./event/struct.Event.html#method.is_writable&> 5 [`error`]: ./event/struct.Event.html#method.is_error&8 A [`read_closed`]: ./event/struct.Event.html#method.is_read_closed&D C [`write_closed`]: ./event/struct.Event.html#method.is_write_closed'F (  ### Registering handles( ( E Unless otherwise noted, it should be assumed that types implementing(H J [`event::Source`] will never become ready unless they are registered with(M  `Poll`.) )  For example:) ) * * * * * *  # use std::net;+ +/ " use mio::{Poll, Interest, Token};+% ,  use std::net::SocketAddr;,  use std::time::Duration;,  use std::thread;, , 2 let address: SocketAddr = "127.0.0.1:0".parse()?;,5 1 let listener = net::TcpListener::bind(address)?;-4 < let mut sock = TcpStream::connect(listener.local_addr()?)?;-? . ' thread::sleep(Duration::from_secs(1));.* .  let poll = Poll::new()?;. . K // The connect is not guaranteed to have started until it is registered at.N  // this point/ Y poll.registry().register(&mut sock, Token(0), Interest::READABLE | Interest::WRITABLE)?;/\  # Ok(())0 0 0 0  ### Dropping `Poll`0 0 K When the `Poll` instance is dropped it may cancel in-flight operations for0N L the registered [event sources], meaning that no further events for them may1O M be received. It also means operations on the registered event sources may no2P J longer work. It is up to the user to keep the `Poll` instance alive while2M ) registered event sources are being used.3, 3 + [event sources]: ./event/trait.Source.html3. 4 # ### Accessing raw fd/socket/handle4& 4 E Mio makes it possible for many types to be converted into a raw file4H K descriptor (fd, Unix), socket (Windows) or handle (Windows). This makes it5N G possible to support more operations on the type than Mio supports, for5J I example it makes [mio-aio] possible. However accessing the raw fd is not6L  without it's pitfalls.6 7 J Specifically performing I/O operations outside of Mio on these types (via7M K the raw fd) has unspecified behaviour. It could cause no more events to be7N M generated for the type even though it returned `WouldBlock` (in an operation8P J directly accessing the fd). The behaviour is OS specific and Mio can only8M > guarantee cross-platform behaviour if it can control the I/O.9A : . [mio-aio]: https://github.com/asomers/mio-aio:1 : H *The following is **not** guaranteed, just a description of the current:K O situation!* Mio is allowed to change the following without it being considered;R L a breaking change, don't depend on this, it's just here to inform the user.;O L Currently the kqueue and epoll implementation support direct I/O operations6 > . ### Polling without registering event sources>1 ? ? ?K D situation!* Mio is allowed to change the following without it being?G M considered a breaking change, don't depend on this, it's just here to inform@P J the user. On platforms that use epoll, kqueue or IOCP (see implementation@M I notes below) polling without previously registering [event sources] willAL J result in sleeping forever, only a process signal will be able to wake upBM  the thread.B B F On WASM/WASI this is different as it doesn't support process signals,BI G furthermore the WASI specification doesn't specify a behaviour in thisCJ E situation, thus it's up to the implementation what to do here. As anDH J example, the wasmtime runtime will return `EINVAL` in this situation, butDM E different runtimes may return different results. If you have furtherEH L insights or thoughts about this situation (and/or how Mio should handle it)EO / please add you comment to [pull request#1580].F2 F & [event sources]: crate::event::SourceF) ? [pull request#1580]: https://github.com/tokio-rs/mio/pull/1580GB G  # Implementation notesG G C `Poll` is backed by the selector provided by the operating system.GF H  | OS | Selector |H!  |---------------|-----------|H!  | Android | [epoll] |I!  | DragonFly BSD | [kqueue] |I!  | FreeBSD | [kqueue] |I!  | iOS | [kqueue] |I!  | illumos | [epoll] |J!  | Linux | [epoll] |J!  | NetBSD | [kqueue] |J!  | OpenBSD | [kqueue] |J!  | Windows | [IOCP] |K!  | macOS | [kqueue] |K! K G On all supported platforms, socket operations are handled by using theKJ H system selector. Platform specific extensions (e.g. [`SourceFd`]) allowLK F accessing other features provided by individual system selectors. ForLI M example, Linux's [`signalfd`] feature can be used by registering the FD withMP  `Poll` via [`SourceFd`].N N K On all platforms except windows, a call to [`Poll::poll`] is mostly just aNN L direct call to the system selector. However, [IOCP] uses a completion modelOO M instead of a readiness model. In this case, `Poll` must adapt the completionOP D model Mio's API. While non-trivial, the bridge layer is still quitePG M efficient. The most expensive part being calls to `read` and `write` requirePP I data to be copied into an intermediate buffer before it is passed to theQL  kernel.R R < [epoll]: https://man7.org/linux/man-pages/man7/epoll.7.htmlR? E [kqueue]: https://www.freebsd.org/cgi/man.cgi?query=kqueue&sektion=2RH S [IOCP]: https://docs.microsoft.com/en-us/windows/win32/fileio/i-o-completion-portsSV D [`signalfd`]: https://man7.org/linux/man-pages/man2/signalfd.2.htmlSG ( [`SourceFd`]: unix/struct.SourceFd.htmlT+ - [`Poll::poll`]: struct.Poll.html#method.pollT0 U \>ӻ23U U #22\U  Registers I/O resources.U U \}p/ՠ5V V #44]V \78f# ; Create a separate `Registry` which can be used to registere>  `event::Source`s.e f 7 7\ 7\6f 6 7f X  Wait for readiness eventsf f H Blocks the current thread and waits for readiness events for any of thefK H [`event::Source`]s that have been registered with this `Poll` instance.gK F The function will block until either at least one readiness event hashI I been received or `timeout` has elapsed. A `timeout` of `None` means thathL = `poll` will block until a readiness event has been received.i@ i J The supplied `events` will be cleared and newly received readiness eventsjM H will be pushed onto the end. At most `events.capacity()` events will bejK F returned. If there are further pending readiness events, they will bekI % returned on the next call to `poll`.k( l F A single call to `poll` may result in multiple readiness events beinglI I returned for a single event source. For example, if a TCP socket becomeslL F both readable and writable, it may be possible for a single readinessmI G event to be returned with both [`readable`] and [`writable`] readinessnJ F **OR** two separate events may be returned, one with [`readable`] setnI  and one with [`writable`] set.o" o ? Note that the `timeout` will be rounded up to the system clockoB B granularity (usually 1ms), and kernel scheduling delays mean thatpE 8 the blocking interval may be overrun by a small amount.p; q F See the [struct] level documentation for a higher level discussion ofqI  polling.r r r0 ? [`readable`]: struct.Interest.html#associatedconstant.READABLErB ? [`writable`]: struct.Interest.html#associatedconstant.WRITABLEsB  [struct]: struct.Poll.htmls 1 [`iter`]: ./event/struct.Events.html#method.itert4 t  # Notest t G This returns any errors without attempting to retry, previous versionstJ E of Mio would automatically retry the poll call if it was interrupteduH  (if `EINTR` was returned).u v @ Currently if the `timeout` elapses without any readiness eventsvC E triggering this will return `Ok(())`. However we're not guaranteeingvH * this behaviour as this depends on the OS.w- w w x Վx= x y y y y y y z/ z- z { ) use std::net::{TcpListener, SocketAddr};{, { { {* |2 ' let server = TcpListener::bind(addr)?;|* ) let addr = server.local_addr()?.clone();}, } ' // Spawn a thread to accept the socket}*  thread::spawn(move || {}  let _ = server.accept();~  });~ ~ ~M  1  ֔ , let mut stream = TcpStream::connect(addr)?;/ ր ˕ހ&  poll.registry().register(  &mut stream,  Token(0),ā / Interest::READABLE | Interest::WRITABLE)?;ځ2  L   & ȃ Ѓ ݘA O   ɚυ ߚ      [struct]: #  77 7\ 7e {-P6 6 8 6Ć timeoutن ۇ Ї Ї Ӈ ؇   ԇ · \:  7 7\9 9 :  \<:  777 7\ 7GGGEGEGEG EGEGEQ ! >S7; ; <  Љ \>@BDFG 8 Register an [`event::Source`] with the `Poll` instance.;  G Once registered, the `Poll` instance will monitor the event source forJ H readiness state changes. When it notices a state change, it will returnK C a readiness event for the handle the next time [`poll`] is called.ˋF  - See [`Poll`] docs for a high level overview.0 ӌ  # Argumentsی  G `source: &mut S: event::Source`: This is the source of events that theJ < `Poll` instance should monitor for readiness state changes.ƍ?  G `token: Token`: The caller picks a token to associate with the socket.J G When [`poll`] returns an event for the handle, this token is included.J A This allows the caller to map the event to its source. The tokenD B associated with the `event::Source` can be changed at any time byE  calling [`reregister`].Ð  B See documentation on [`Token`] for an example showing how to pickE  [`Token`] values. ϑ G `interest: Interest`: Specifies which operations `Poll` should monitorבJ G for readiness. `Poll` will only return readiness events for operationsJ  specified by this argument.  H If a socket is registered with readable interest and the socket becomesK 3 writable, no event will be returned from [`poll`].6  I The readiness interest for an `event::Source` can be changed at any timeL  by calling [`reregister`].    D Callers must ensure that if a source being registered with a `Poll`ȕG E instance was previously registered with that `Poll` instance, then aH B call to [`deregister`] has already occurred. Consecutive calls toE $ `register` is unspecified behavior.' ח H Unless otherwise specified, the caller should assume that once an eventߗK H source is registered with a `Poll` instance, it is bound to that `Poll`K F instance for the lifetime of the event source. This remains true evenI A if the event source is deregistered from the poll instance using͙D  [`deregister`].  0 ' [`poll`]: struct.Poll.html#method.poll* 7 [`reregister`]: struct.Registry.html#method.reregister: 7 [`deregister`]: struct.Registry.html#method.deregisterٛ:  [`Token`]: struct.Token.html  Ŝ ؜        / -   $ use std::time::{Duration, Instant};ݟ'    5 4 > let mut socket = TcpStream::connect(listener.local_addr()?)?;A  # // Register the socket with `poll`&   &mut socket,̢  2  1  let start = Instant::now(); * let timeout = Duration::from_millis(500);- Ƥ Τ # let elapsed = start.elapsed();ݤ&   if elapsed >= timeout {  // Connection timed out#  return Ok(());ܥ ߚ  ' let remaining = timeout - elapsed;* . poll.poll(&mut events, Some(remaining))?;1   ' if event.token() == Token(0) {* < // Something (probably) happened on the socket.Ч?  ɚ ߚɨ ר    77 7\ 7b[=3?? = > 8 4 Ɲ    ; Re-register an [`event::Source`] with the `Poll` instance.ګ>  B Re-registering an event source allows changing the details of theE F registration. Specifically, it allows updating the associated `token`I I and `interests` specified in previous `register` and `reregister` calls.L  H The `reregister` arguments fully override the previous values. In otherK I words, if a socket is registered with [`readable`] interest and the callL H to `reregister` specifies [`writable`], then read interest is no longerK  requested for the handle.  I The event source must have previously been registered with this instanceL 2 of `Poll`, otherwise the behavior is unspecified.5  B See the [`register`] documentation for details about the functionıE C arguments and see the [`struct`] docs for a high level overview ofF ٲ          ɴ / %      5 4 ޝA  8 // Register the socket with `poll`, requesting readable;  ָ   Interest::READABLE)?;  H // Reregister the socket specifying write interest instead. Even thoughK / // the token is the same it must be specified.2  poll.registry().reregister( ں   Interest::WRITABLE)?;   ̻ ػ 0  [`struct`]: struct.Poll.html 6 4 [`readable`]: ./event/struct.Event.html#is_readable7 4 [`writable`]: ./event/struct.Event.html#is_writable7  77 7\ 7b[=3AA =֦ @ 8 4 Ɲ   j : Deregister an [`event::Source`] with the `Poll` instance.=  I When an event source is deregistered, the `Poll` instance will no longerL D monitor it for readiness state changes. Deregistering clears up anyG G internal resources needed to track the handle. After an explicit callJ E to this method completes, it is guaranteed that the token previouslyH I registered to this handle will not be returned by a future poll, so longL F as a happens-before relationship is established between this call andI  the poll.  ǫL 5  < A handle can be passed back to `register` after it has been? E deregistered; however, it must be passed back to the **same** `Poll`H 1 instance, otherwise the behavior is unspecified.4           / -       5 4 ޝA  &      * poll.registry().deregister(&mut socket)?;-  1  D // Set a timeout because this poll should never receive any events.G 7 poll.poll(&mut events, Some(Duration::from_secs(1)))?;:  assert!(events.is_empty());     77 7\ 7=3CC =֦ B 8   / . Creates a new independently owned `Registry`.1  F Event sources registered with this `Registry` will be registered withI - the original `Registry` and `Poll` instance.0  7 7\   'w\= = D  DEEEED#                     6  7 7\o= = F /                      " 5  7 7\ 7]= =  \I:  777 7\ 7GGGEGEGEG EGEGEQ ! >S7H H I           \K  7 7\J J K  BBC C 0  & cO' ' bcNN O '               4  LPR2 4PSI PTI PT- PU        ( -  cWYB  Create a new `Waker`.  7 7\b   'wcV V W2 4  WXXXXW$ 3 Wake up the [`Poll`] associated with this `Waker`.6   [`Poll`]: struct.Poll.html  7 7cV V Y % Readiness event types and utilities.( [txJ9M QZ4  L[]I [^I [^# %[_       #  cabcdefghij  Returns the event's token.  7 7cb` ` a ! 7 Returns true if the event contains readable readiness.:    ? Out-of-band (OOB) data also triggers readable events. But mustB > application don't actually read OOB data, this could leave anA : application open to a Denial-of-Service (Dos) attack, see=  . I However because Mio uses edge-triggers it will not result in an infiniteL ( loop as described in the article above.+ 7 7c`  ` b  ! 7 Returns true if the event contains writable readiness. : 7 7c`  ` c   4 Returns true if the event contains error readiness. 7   H Error events occur when the socket enters an error state. In this case, K F the socket will also receive a readable or writable event. Reading or I / writing to the socket will result in an error. 2      H Method is available on all platforms, but not all platforms trigger the K  error event.   9 The table below shows what flags are checked on what OS.<  $ | [OS selector] | Flag(s) checked |' $ |---------------|-----------------|' $ | [epoll] | `EPOLLERR` |' F | [kqueue] | `EV_ERROR` and `EV_EOF` with `fflags` set to `0`. |I  8 [OS selector]: ../struct.Poll.html#implementation-notes; ? H  7 7c` ` d $ : Returns true if the event contains read closed readiness.=    F Read closed readiness can be expected after any of the following haveI  occurred: < * The local stream has shutdown the read half of its socket? F * The local stream has shutdown both the read half and the write halfI  of its socket G * The peer stream has shutdown the write half its socket; this sends aJ : `FIN` packet that has been received by the local stream=  E Method is a best effort implementation. While some platforms may notH A return readiness when read half is closed, it is guaranteed thatD  false-positives will not occur.#  <  ' ' $ | [epoll] | `EPOLLHUP`, or |' / | | `EPOLLIN` and `EPOLLRDHUP` |2 $ | [kqueue] | `EV_EOF` |'  ; ? H  7 7c` ` e &% ; Returns true if the event contains write closed readiness.>    B On [epoll] this is essentially a check for `EPOLLHUP` flag as theE G local stream shutting down its write half does not trigger this event.J  A On [kqueue] the local stream shutting down the write half of itsD  socket will trigger this event.#    H B return readiness when write half is closed, it is guaranteed that E !# ! !< " "' "' #' ( | | only `EPOLLERR`, or |#+ . | | `EPOLLOUT` and `EPOLLERR` |#1 $' $ $; %? %H & 7 7c`& ` f& ,! 7 Returns true if the event contains priority readiness.&: ' ' ' 'K  priority event.( ( (< ) )' )' $ | [epoll] | `EPOLLPRI` |)' $ | [kqueue] | *Not supported* |*' * *; +? +H , 7 7c`, ` g, 2 2 Returns true if the event contains AIO readiness.-5 - - - I Method is available on all platforms, but not all platforms support AIO.-L . .< . /' /' $ | [epoll] | *Not supported* |/' ( | [kqueue]1 | `EVFILT_AIO` |0+ 0 < 1: Only supported on DragonFly BSD, FreeBSD, iOS and macOS.0? 1 1; 1? 2H 2 7 7c`2 ` h2 5 2 Returns true if the event contains LIO readiness.35 3 3 3 H Method is available on all platforms, but only FreeBSD supports LIO. On4K 2 FreeBSD this method checks the `EVFILT_LIO` flag.45 5 7 7c`5 ` i5 6B 6 7 7 7c`6 ` j sys_event6 ; G When the [alternate] flag is enabled this will print platform specific8J L details, for example the fields of the `kevent` structure on platforms that9O H use `kqueue(2)`. Note however that the output of this implementation is:K + **not** consider a part of the stable API.:. ; ' [alternate]: fmt::Formatter::alternate;* cl;8 ; 777 7c 7GGGEGEGEG EGEGEQ ! >S7k; k l; ; @ @ [6oommn6p [ -`-֮o6-`-֮np o6@ @ [mm no6@ @ @ @ [mm@( 6rrds@ @ A8 A 777 7d 7GGGEGEGEG EGEGEQ ! >S7qA q sr6A A X \Zxtu4$Ltv3%tw $.3 " A collection of readiness events.9%_H `Events` is passed as an argument to [`Poll::poll`] and will be used tocKJ receive any new readiness events received since the last poll. Usually, aMG single `Events` instance is created at the same time as a [`Poll`] andJ' reused on each call to [`Poll::poll`].*0 See [`Poll`] for more documentation on polling.30 [`Poll::poll`]: ../struct.Poll.html#method.poll3 [`Poll`]: ../struct.Poll.html! ```ޓ / use mio::{Events, Poll};1  # # assert!(events.is_empty());!* // Register `event::Source`s with `poll`.-; poll.poll(&mut events, Some(Duration::from_millis(100)))?;> for event in events.iter() { 6 println!("Got an event for {:?}", event.token());9 em8,y  txx e{|}~/B Return a new `Events` capable of holding up to `capacity` events.E use mio::Events;* let events = Events::with_capacity(1024);-% assert_eq!(1024, events.capacity());( cezz {7; Returns the number of `Event` values that `self` can hold.>ș-(7 7eczz |5 Returns `true` if `self` contains no `Event` values.8ș-7 7ezz }- Returns an iterator over the `Event` values.0 ޓޓ /1 ! // Register handles with `poll`.$>Ö 97 7eJ7tJt0eוz7zz ~%7 Clearing all `Event` values from container explicitly.: F Events are cleared before every `poll`, so it is not required to callI this manually.        ޓޓ  !!/""""1# ##$##>$ // Clear all events.$ events.clear();$$%%%%7 7eoz%z %&0&7 7e 7z&z &'$6e''' ' 6c' 'J7tJt0eוz6'$' ee8 6'(6e((( ( 6c(((7 7e {-Pe9( 6(*-* 7 7ec {-Pc* 6*++ec 6+,e,8,777 7e 7GGGEGEGEG EGEGEQ ! >S7, ,,d hZ: 24I I 2"    -2: An event source that may be registered with [`Registry`].7=u< Types that implement `event::Source` can be registered withy?F `Registry`. Users of Mio **should not** use the `event::Source` traitIK functions directly. Instead, the equivalent functions on `Registry` shouldN be used. # See [`Registry`] for more details.&& [`Registry`]: ../struct.Registry.html) # Implementing `event::Source`"L Event sources are always backed by system handles, such as sockets or otherOG system handles. These `event::Source`s will be monitored by the systemJJ selector. An implementation of `Source` will almost always delegates to aML lower level handle. Examples of this are [`TcpStream`]s, or the *unix only*O [`SourceFd`]., [`TcpStream`]: ../net/struct.TcpStream.html/+ [`SourceFd`]: ../unix/struct.SourceFd.html. # Dropping `event::Source`sL All `event::Source`s, unless otherwise specified, need to be [deregistered]OK before being dropped for them to not leak resources. This goes against theNL normal drop behaviour of types in Rust which cleanup after themselves, e.g.OH a `File` will close itself. However since deregistering needs access to K6 [`Registry`] this cannot be done while being dropped. 9 : [deregistered]: ../struct.Registry.html#method.deregister =   7 Implementing `Source` on a struct containing a socket: :       & use mio::{Interest, Registry, Token}; ) use mio::event::Source;    use std::io;   # #[allow(dead_code)]  pub struct MySource {  socket: TcpStream, impl Source for MySource {S fn register(&mut self, registry: &Registry, token: Token, interests: Interest)V -> io::Result<()> { 4 // Delegate the `register` call to `socket`79 self.socket.register(registry, token, interests)<ߚ U fn reregister(&mut self, registry: &Registry, token: Token, interests: Interest)X 6 // Delegate the `reregister` call to `socket`9; self.socket.reregister(registry, token, interests)>ߚ F fn deregister(&mut self, registry: &Registry) -> io::Result<()> {I6 // Delegate the `deregister` call to `socket`9) self.socket.deregister(registry),ߚ 4 Register `self` with the given `Registry` instance.7H This function should not be called directly. Use [`Registry::register`]KH instead. Implementors should handle registration by delegating the callK to another `Source` type.@ [`Registry::register`]: ../struct.Registry.html#method.registerC77 7 7\b[ 24Ɲ 7 Re-register `self` with the given `Registry` instance.:1 This function should not be called directly. Use4= [`Registry::reregister`] instead. Implementors should handle@H re-registration by either delegating the call to another `Source` type.KD [`Registry::reregister`]: ../struct.Registry.html#method.reregisterG 77 7 7\b[ 24Ɲ @6 Deregister `self` from the given `Registry` instance.94= [`Registry::deregister`] instead. Implementors should handle@@ deregistration by delegating the call to another `Source` type.CD [`Registry::deregister`]: ../struct.Registry.html#method.deregisterG 77 7 7\ 2ff77 7f 7\b[  f 2 4 Ɲ !! 77 7f 7\b[! f!2!4"Ɲ" #?# 77 7f 7\# f#2#y                               % Unix only extensions.  BB  Unix pipe. , See the [`new`] function for documentation./  H) # Mio's optional features.7 This document describes the available features in Mio.: ## `os-poll` (enabled)G Mio by default provides only a shell implementation that `panic!`s theJB moment it is actually run. To run it requires OS support, this isE- enabled by activating the `os-poll` feature.06 This makes `Poll`, `Registry` and `Waker` functional.9 ## `os-ext` (enabled)I `os-ext` enables additional OS specific facilities. These facilities canL- be found in the `unix` and `windows` module.0 ## Network types (disabled)#E The `net` feature enables networking primitives in the `net` module.H  # Getting started guide.& In this guide we'll do the following:)6 1. Create a [`Poll`] instance (and learn what it is).9 2. Register an [event source]." 3. Create an event loop.H At the end you'll have a very small (but quick) TCP server that acceptsK/ connections and then drops (disconnects) them.2! ## 1. Creating a `Poll` instance$H Using Mio starts by creating a [`Poll`] instance, which monitors eventsKI from the OS and puts them into [`Events`]. This allows us to execute I/OL/ operations based on what operations are ready.2!( [`Events`]: ../event/struct.Events.html+ ޓޓ  # use mio::{Poll, Events}; % # fn main() -> std::io::Result<()> { (2 // `Poll` allows for polling of readiness events.!5!E // `Events` is collection of readiness `Event`s and can be filled by!H // calling `Poll::poll`.") let events = Events::with_capacity(128);", # drop((poll, events));# # Ok(())# ###B For example if we're using a [`TcpListener`], we'll only want to#EC attempt to accept an incoming connection *iff* any connections are$FG queued and ready to be accepted. We don't want to waste our time if no$J connections are ready.%%0 [`TcpListener`]: ../net/struct.TcpListener.html%3& ## 2. Registering event source&"&I After we've created a [`Poll`] instance that monitors events from the OS&LG for us, we need to provide it with a source of events. This is done by'JM registering an [event source]. As the name “event source” suggests it is'PH a source of events which can be polled using a `Poll` instance. On Unix(KA systems this is usually a file descriptor, or a socket/handle on)D Windows.) )I In the example below we'll use a [`TcpListener`] for which we'll receive)LD an event (from [`Poll`]) once a connection is ready to be accepted.*G++ [event source]: ../event/trait.Source.html+.+,, ,, , # use mio::net::TcpListener;, $ # use mio::{Poll, Token, Interest};-'-( # let poll = Poll::new()?;-0 # let address = "127.0.0.1:0".parse().unwrap();.34 // Create a `TcpListener`, binding it to `address`..70 let mut listener = TcpListener::bind(address)?;/3/J // Next we register it with `Poll` to receive events for it. The `SERVER`/MK // `Token` is used to determine that we received an event for the listener0N // later on.0 const SERVER: Token = Token(0);1#F poll.registry().register(&mut listener, SERVER, Interest::READABLE)?;1I1 222E Multiple event sources can be [registered] (concurrently), so we can2H$ monitor multiple sources at a time.2'36 [registered]: ../struct.Registry.html#method.register393 ## 3. Creating the event loop3!4C After we've created a [`Poll`] instance and registered one or more4FI [event sources] with it, we can [poll] it for events. Polling for events4LH is simple, we need a container to store the events: [`Events`] and need5KG to do something based on the polled events (this part is up to you, we6JH can't do it all!). If we do this in a loop we've got ourselves an event6K loop.7 7G The example below shows the event loop in action, completing our small7J TCP server.88( [poll]: ../struct.Poll.html#method.poll8+, [event sources]: ../event/trait.Source.html8/9:: :: : # use std::io;: # use std::time::Duration;:: , # use mio::{Poll, Token, Interest, Events};;/ # fn main() -> io::Result<()> {;# # let mut poll = Poll::new()?;;"/ # let mut events = Events::with_capacity(128);<2<32 # let mut listener = TcpListener::bind(address)?;=5" # const SERVER: Token = Token(0);=%H # poll.registry().register(&mut listener, SERVER, Interest::READABLE)?;=K // Start our event loop.>> A // Poll the OS for events, waiting at most 100 milliseconds.>D? poll.poll(&mut events, Some(Duration::from_millis(100)))?;?B? // Process each event.?! for event in events.iter() {@$H // We can use the token we previously provided to `register` to@K2 // determine for which type the event is.A5 match event.token() {A! SERVER => loop {A J // One or more connections are ready, so we'll attempt toBM, // accept them (in a loop).B/* match listener.accept() {C-3 Ok((connection, address)) => {C6H println!("Got a connection from: {}", address);DK* # drop(connection);D- },EJ // A "would block error" is returned if the operationEMD // is not ready, so we'll stop trying to acceptFG$ // connections.F'? Err(ref err) if would_block(err) => break,FB1 Err(err) => return Err(err),G4 }G }H! # _ => unreachable!(),H$ɚH ߚH  # return Ok(());HII* fn would_block(err: &io::Error) -> bool {I-, err.kind() == io::ErrorKind::WouldBlockI/JJJ  Interest used in registering./! Q J Interest are used in [registering] [`event::Source`]s with [`Poll`], theyUM L indicate what readiness should be monitored for. For example if a socket isO I registered with [readable] interests and the socket becomes writable, noL 0 event will be returned from a call to [`poll`].3  4 [registering]: struct.Registry.html#method.register7 0  = [readable]: struct.Interest.html#associatedconstant.READABLE@ ϙ*  [_il[   l[    l    [    [    [  77 7[ 7[          [       [                  7 7[o          [   7 7[[          [   77 7[ 7[q            [   77 7[ 7[r      c  ' V V V  Return a new `Poll` handle.V V V V V V V VG VG VG D This function will make a syscall to the operating system to createVG VG WG WG WG D the system selector. If this syscall fails, `Poll::new` will returnWG WG X X X  with the error.X X X X X X X XU XU XU R close-on-exec flag is set on the file descriptors used by the selector to preventXU XU YF YF YF C leaking it to executed processes. However, on some systems such asYF YF YK YK YK H old Linux systems that don't support `epoll_create1` syscall it is doneYK YK ZF ZF ZF C non-atomically, so a separate thread executing in parallel to thisZF ZF [G [G [G D function may accidentally leak the file descriptor if it executes a[G [G [- [- [- * new process before this function returns.[- [- \ \ \ \ \ \- \- \- * See [struct] level docs for more details.\- \- \ \ \ \ \ \ \ \ \ \ ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ]/ ]/ ]/ ]/ ]/ ^ ^ ^  use mio::{Poll, Events};^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^& ^& ^& # let mut poll = match Poll::new() {ڴ^& ^& _ _ _  Ok(poll) => poll,_ _ _H _H _H E Err(e) => panic!("failed to create Poll instance; err={:?}", e),_H _H ` ` `  };` ` ` ` ` ` ` `2 `2 `2 / // Create a structure to receive polled events`2 `2 `1 `1 `1 `1 `1 a a a a a a< a< a< 9 // Wait for events, but none will be received because noa< a< bG bG bG D // `event::Source`s have been registered with this `Poll` instance.bG bG b> b> b> ; poll.poll(&mut events, Some(Duration::from_millis(500)))?;b> b> c c c c c c c c c c c c c c c c c c c c d    'w\66 d IIII II'I I  "  event_type              flag     "     p  "           !7     written_one                         bad_bit_mask                                  E       {}               !       E       |{}                  E  (empty)   JJJJ JJ'J JLBB    arg     res #               last_os_error       KKKK KK'K KLw t  s     $  * 46 ?  E OlinuxQX  ^ hjqvL{: IIEPOLLET*  EPOLLIN3  EPOLLOUT<   EPOLLRDHUPF   error\ +{$ς$O D\ zC   #.**33<<F F W \g#{{6      L]$   'w] / 7 7] V77 7] 7̃ 6   32( "V"7 7]b[""C"4"Ɲ" %%X% 7 7]b[%%C%4%Ɲ% ((5( 7 7](߶(C())$)))) )))7 7]* *+L],, 7 7], ,,L],,7 7]o, ,-1-[ Ɲ- //000 L00%0I0I000000 00$17 7b1 11)1 7 71 13)3 7 73 33&47 74 44,47 75 57-77 77 7;); 7 7;ے;< <7 7< = =7 7= =N= 777 7GGGEGEGEG EGEGEQ ! >S7 7> >>?6? 77 7 7? got?want?- 0 KKKK KK'K KL Z:24I'I'9ςT$)  ''49AT'L6^77 7^ 7\b[ 624Ɲ  77 7^ 7\b[ 624Ɲ ? 77 7^ 7\ 62 KKKK KK'K KL8 5  4     ) + 7L<Z:tI~I~ReadWrite FromRawFd $NZltt~~   L_B7 7]b 24 $ 7 7_    c!7 7_ cN]\ӄ*e  c   LLLLa]LL777 7] 7GGGEGEGEG EGEGEQ ! >S7L L* U U  U U  U U U  U U "U U  U U U   U U  U U  U U ;W]+++ ++ +*+7 7]c+ +WZ@ ]ӺJ]W@ ] W W WZ]W8W777 7] 7GGGEGEGEG EGEGEQ ! >S7W WWE Adapter for [`RawFd`] providing an [`event::Source`] implementation.\HB `SourceFd` enables registering any type with an FD with [`Poll`].EF While only implementations for TCP and UDP are provided, Mio supportsIK registering any FD that can be registered with the underlying OS selector.N* `SourceFd` provides the necessary bridge.-I Note that `SourceFd` takes a `&RawFd`. This is because `SourceFd` **doesLE not** take ownership of the FD. Specifically, it will not manage anyHM lifecycle related operations, such as closing the FD on drop. It is expectedP: that the `SourceFd` is constructed right before a call to=: [`Registry::register`]. See the examples for more detail.=. [`event::Source`]: ../event/trait.Source.html1!C Basic usage.  &     /" use mio::{Interest, Poll, Token}; % use mio::unix::SourceFd;   use std::os::unix::io::AsRawFd; # use std::net::TcpListener;   // Bind a std listener 2 let listener = TcpListener::bind("127.0.0.1:0")?; 5    // Register the listener  * &mut SourceFd(&listener.as_raw_fd()), -      H Implementing [`event::Source`] for a custom type backed by a [`RawFd`]. K&ޓޓ - use mio::{event, Interest, Registry, Token};0ߝ use std::os::unix::io::RawFd;! pub struct MyIo { fd: RawFd, impl event::Source for MyIo {!V @ SourceFd(&self.fd).register(registry, token, interests)Cߚ X B SourceFd(&self.fd).reregister(registry, token, interests)Eߚ I0 SourceFd(&self.fd).deregister(registry)3ߚ [6B 8q68q 6ɩ 6  ɩ&6^777 7^ 7GGGEGEGEG EGEGEQ ! >S7 6\_uH'_777 7_ 7GGGEGEGEG EGEGEQ ! >S7   '         "                ;_ #s^"   '         "                ;_}77 7 7fCCf7 7f 7׶  (  ` Qek?t +$Ӆ $ IntoRawFd $ς$` *_ )` *LZ:24IIH Q[1e`kkt t 9    4      )&.% Create a new non-blocking Unix pipe.(K This is a wrapper around Unix's [`pipe(2)`] system call and can be used asN/ inter-process or thread communication channel.2M This channel may be created before forking the process and then one end usedPM in each process, e.g. the parent process has the sending end to send commandP to the child process.R [`pipe(2)`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/pipe.htmlU # Events G The [`Sender`] can be registered with [`WRITABLE`] interest to receiveJM [writable events], the [`Receiver`] with [`READABLE`] interest. Once data isPI written to the `Sender` the `Receiver` will receive an [readable event].LM In addition to those events, events will also be generated if the other sidePE is dropped. To check if the `Sender` is dropped you'll need to checkHH [`is_read_closed`] on events for the `Receiver`, if it returns true the KJ `Sender` is dropped. On the `Sender` end check [`is_write_closed`], if it ML returns true the `Receiver` was dropped. Also see the second example below. O ! [`WRITABLE`]: Interest::WRITABLE $- [writable events]: event::Event::is_writable 0! [`READABLE`]: Interest::READABLE $, [readable event]: event::Event::is_readable /1 [`is_read_closed`]: event::Event::is_read_closed 43 [`is_write_closed`]: event::Event::is_write_closed 6  # Deregistering  F Both `Sender` and `Receiver` will deregister themselves when dropped, IB **iff** the file descriptors are not duplicated (via [`dup(2)`]).EP [`dup(2)`]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/dup.htmlSJ Simple example that writes data into the sending end and read it from theM receiving end." use std::io::{self, Read, Write};%* use mio::{Poll, Events, Interest, Token};- use mio::unix::pipe;2 // Unique tokens for the two ends of the channel.5# const PIPE_RECV: Token = Token(0);&# const PIPE_SEND: Token = Token(1);&#: // Create our `Poll` instance and the `Events` container.= + let mut events = Events::with_capacity(8);. // Create a new pipe./ let (mut sender, mut receiver) = pipe::new()?;2& // Register both ends of the channel.)I poll.registry().register(&mut receiver, PIPE_RECV, Interest::READABLE)?;LG poll.registry().register(&mut sender, PIPE_SEND, Interest::WRITABLE)?;J' const MSG: &[u8; 11] = b"Hello world";* &͋$!+ PIPE_SEND => sender.write(MSG).2 .and_then(|n| if n != MSG.len() {5I // We'll consider a short write an error in thisLH // example. NOTE: we can't use `write_all` withK- // non-blocking I/O.0= Err(io::ErrorKind::WriteZero.into())@ } else {  Ok(())" })?, PIPE_RECV => {' let mut buf = [0; 11];*2 let n = receiver.read(&mut buf)?;58 println!("received: {:?}", &buf[0..n]);;* assert_eq!(n, MSG.len());-) assert_eq!(&buf, &*MSG);, return Ok(());" },! _ => unreachable!(),$ɚ ߚ = Example that receives an event once the `Sender` is dropped.@, # use mio::{Poll, Events, Interest, Token};/ # use mio::unix::pipe;% # const PIPE_RECV: Token = Token(0);(% # const PIPE_SEND: Token = Token(1); (  #' // Same setup as in the example above. *! !.!!2""L"J# // Drop the sender.# drop(sender);## poll.poll(&mut events, None)?;#"$Ö$  match event.token() {$1 PIPE_RECV if event.is_read_closed() => {$45 // Detected that the sender was dropped.%8) println!("Sender dropped!");%,% },& _ => unreachable!(),& ߚ& & # unreachable!();&&&&   'w_` 'c6 `_7B3 Set the `Sender` into or out of non-blocking mode.6677 7_7 7 nonblocking7 IaG Execute an I/O operation ensuring that the socket receives more events8J# if it hits a [`WouldBlock`] error.9&99 9C This method is required to be called for **all** I/O operations to9FI ensure the user will receive events once the socket is ready again after:L" returning a [`WouldBlock`] error.:%;* [`WouldBlock`]: io::ErrorKind::WouldBlock;-;;;;;<? // Write to the sender using a direct libc call, of course the>B6 // `io::Write` implementation would be easier to use.>9 let buf = b"hello";? let n = sender.try_io(|| {?0 let buf_ptr = &buf as *const _ as *const _;?3N let res = unsafe { libc::write(sender.as_raw_fd(), buf_ptr, buf.len()) };@Q if res != -1 {@ Ok(res as usize)A } else {AG // If EAGAIN or EWOULDBLOCK is set by libc::write, the closureAJ- // should return `WouldBlock` error.B0( Err(io::Error::last_os_error())B+ߚC  })?;C eprintln!("write {} bytes", n);C#C* // Wait until the receiver is readable...C-DB // Read from the receiver using a direct libc call, of course theDE5 // `io::Read` implementation would be easier to use.D8 let mut buf = [0; 512];E let n = receiver.try_io(|| {E 0 let buf_ptr = &mut buf as *mut _ as *mut _;E3O let res = unsafe { libc::read(receiver.as_raw_fd(), buf_ptr, buf.len()) };FRFFGF // If EAGAIN or EWOULDBLOCK is set by libc::read, the closureGIH0H+ߚH H eprintln!("read {} bytes", n);I"I III7 7_CIIIoJoJ  IIIIIIJJ`_KK77 7_ 7\b[K K2K4KƝK LL 77 7_ 7\b[L L2M4MƝM N?N 77 7_ 7\N N2NO`_O4O77 7_ 7O OOP PGP777 7_ 7 ????  0%W*7P PPQ Q%Q7 7_Q QR R`7_R4R77 7_ 7R 7RRS SGS777 7_ 7 ????  0%W*7S 7SST T%T7 7_T 7TU V U U4 The underlying pipe is **not** set to non-blocking.U7`_V$V`_ stdinVW`_X*X _ CXY`_YY 7 7_Y YY`_ZZ _ Z\ ``\B5 Set the `Receiver` into or out of non-blocking mode.\8\7 7`] ]] oa]J^&^^ __F_L`%``-aaaaaaa/bb#bbc*cc+ccBd9dee3eQfffgJg0h+ߚh hh#ii-iiEj8jj k3kRllllIm0m+ߚn nn"n noo7 7`Cooooo  oooooopp``pp77 7` 7\b[p p2p4qƝq rr 77 7` 7\b[r r2r4rƝr s?s 77 7` 7\s s2tt``t7t77 7` 7u uuu uMu 777 7` 7   !3l7v vvv w`7aw7w77 7a 7w 7wwx xMx 777 7a 7   !3l7x 7xxy z#y yy7``z(za` stdoutz|#{ ||7``|(|a` stderr|~``~,~ ` C~`` 7 7` ǀ`` ` B0Ł ƁɁ߁  ʁ ԁց " C 6 Sending end of an Unix pipe.5 53 See [`new`] for documentation, including examples.566_ipI6666616_66777 7_ 7GGGEGEGEG EGEGEQ ! >S76 66[ Receiving end of an Unix pipe.Z"[[6[`j:&d[[[[[1[`[[777 7` 7GGGEGEGEG EGEGEQ ! >S7[ [[& 5 Associates readiness events with [`event::Source`]s.8 9 B `Token` is a wrapper around `usize` and is used as an argument to=E 5 [`Registry::register`] and [`Registry::reregister`].8  3  0  = [`Registry::register`]: struct.Registry.html#method.register@ A [`Registry::reregister`]: struct.Registry.html#method.reregisterD   # Example  J Using `Token` to track which socket generated the event. In this example,M B `HashMap` is used, but usually something like [`slab`] is better.E  ( [`slab`]: https://crates.io/crates/slab+    1    / * use mio::{Events, Interest, Poll, Token};-  use mio::net::TcpListener;    use std::io::{self, Read};  use std::collections::HashMap;"  G // After this number of sockets is accepted, the server will shutdown.J  const MAX_SOCKETS: usize = 32; "   K // Pick a token that will not be used by any other socket and use that one N  // for the listener.  % const LISTENER: Token = Token(1024); (    // Used to store the sockets. ! " let mut sockets = HashMap::new(); %   8 // This is used to generate a unique token for a socket ;  let mut next_socket_index = 0; "    // The `Poll` instance      // Tcp listener  ? let mut listener = TcpListener::bind("127.0.0.1:0".parse()?)?; B     H poll.registry().register(&mut listener, LISTENER, Interest::READABLE)?; K   G // Spawn a thread that will connect a bunch of sockets then close them J # let addr = listener.local_addr()?;&   use std::net::TcpStream;  K // +1 here is to connect an extra socket to signal the socket to closeN " for _ in 0..(MAX_SOCKETS+1) {% ( // Connect then drop the socket+ 3 let _ = TcpStream::connect(addr).unwrap();6 ߚ    // Event storage 1  4 // Read buffer, this will never actually get filled7  let mut buf = [0; 256];   // The main event loop   // Wait for events &   !  LISTENER => { F // Perform operations in a loop until `WouldBlock` isI  // encountered.#  loop { . match listener.accept() {1 1 Ok((mut socket, _)) => {4 3 // Shutdown the server6 B if next_socket_index == MAX_SOCKETS {E / return Ok(());2  }!  < // Get the token for the socket? B let token = Token(next_socket_index);E 4 next_socket_index += 1;7  ? // Register the new socket w/ pollB _ poll.registry().register(&mut socket, token, Interest::READABLE)?;b  0 // Store the socket3 ; sockets.insert(token, socket);>  } Q Err(ref e) if e.kind() == io::ErrorKind::WouldBlock => {T K // Socket is not ready anymore, stop acceptingN # break;&  H e => panic!("err={:?}", e), // Unexpected errorK  }    token => { , // Always operate in a loop/  L match sockets.get_mut(&token).unwrap().read(&mut buf) {O # Ok(0) => {& H // Socket is closed, remove it from the map K 4 sockets.remove(&token); 7 !& ! E // Data is not actually sent in this example!H 1 Ok(_) => unreachable!(),"4 "T I // Socket is not ready anymore, stop reading#L $& $ $K % % % ɚ% ߚ% % % % & bbcb& & cb & & c& & & 1& b& & & 1& b& & 7 7bb&  & & & & 2& b& & 777 7b 7GGGEGEGEG EGEGEQ ! >S7&  & & & & & 2& b& & & 2& b& & 77 7b 7b&  & & & & & 2& b& & & 2& b& & & 2& &  & & & & 2& & 7 7bo&  & & & & 2& b& & 77 7b 7bq&  & & & & & 3& b& & 77 7b 7br&  & & & & & 3& b& & 77 7b 7o& & I& &  & & &  . Waker allows cross-thread waking of [`Poll`].21 d F When created it will cause events with [`readable`] readiness and thehI F provided `token` if [`wake`] is called, possibly from another thread.I   > ( [`wake`]: struct.Waker.html#method.wake+    K `Waker` events are only guaranteed to be delivered while the `Waker` valueN  is alive.  K Only a single `Waker` can be active per [`Poll`], if multiple threads needN F access to the `Waker` it can be shared via for example an `Arc`. WhatI D happens if multiple `Waker`s are registered with the same `Poll` isG  unspecified.    G On platforms that support kqueue this will use the `EVFILT_USER` eventJ K filter, see [implementation notes of `Poll`] to see what platforms supportN $ kqueue. On Linux it uses [eventfd].'  H [implementation notes of `Poll`]: struct.Poll.html#implementation-notesK @ [eventfd]: https://man7.org/linux/man-pages/man2/eventfd.2.htmlC    . Wake a [`Poll`] instance from another thread. 1      3  ޓޓ  8 # fn main() -> Result<(), Box> { ;      use std::sync::Arc;    ' use mio::{Events, Token, Poll, Waker}; *   % const WAKE_TOKEN: Token = Token(10); (    + let mut events = Events::with_capacity(2); .   @ let waker = Arc::new(Waker::new(poll.registry(), WAKE_TOKEN)?); C   D // We need to keep the Waker alive, so we'll create a clone for the G  // thread we create below.   let waker1 = waker.clone(); % let handle = thread::spawn(move || {( ( // Working hard, or hardly working?+ / thread::sleep(Duration::from_millis(500));2  5 // Now we'll wake the queue on the other thread.8 , waker1.wake().expect("unable to wake");/   C // On our current thread we'll poll for events, without a timeout.F "  L // After about 500 milliseconds we should be awoken by the other thread andO  // get a single event.  assert!(!events.is_empty()); 1 let waker_event = events.iter().next().unwrap();4 $ assert!(waker_event.is_readable());' - assert_eq!(waker_event.token(), WAKE_TOKEN);0  # handle.join().unwrap();     ctUi  P_   3 c  777 7c 7GGGEGEGEG EGEGEQ ! >S7      A readiness event.) @ H `Event` is a readiness state paired with a [`Token`]. It is returned byDK  [`Poll::poll`].  < For more documentation on polling and events, see [`Poll`].?  3 !  [`Token`]: ../struct.Token.html#  c8(  [   4 c  7 7cc    [`Events`] iterator.  = This struct is created by the [`iter`] method on [`Events`]. @  [`Events`]: struct.Events.html ") [`iter`]: struct.Events.html#method.iter ,     4 ޓޓ    /    1   $  >Ö 96J7tJt0eוz60eוzt 6e tc46d777 7d 7GGGEGEGEG EGEGEQ ! >S7 656d7 7dd 6   5         "                ; uDerefMut+E$\ %C C Z:24II2E*   )   g̽D|      f5  gg fg fb7 7gCC7 7f7   f gf fg f 7 7g 7g f g, 7 7g 7  f%6   $fg77 7g 7\b[ f24Ɲ  77 7g 7\b[ f24Ɲ !?! 77 7g 7\! f!2!2"2Gf2 g22282777 7g 7GGGEGEGEG EGEGEQ ! >S72 f23444844 44g66 c66g8:8 77 7g 7\8828=B=77 7g 7\==2=CCC77 7g 7\CC2CFFF:FF FFgGG7 7ggG G444:44 444 gG>44444:4g44777 7g 7GGGEGEGEG EGEGEQ ! >S74 44! " " " f  ̆                           & , 2 5 6 ; ; ; A A A %&(*,,,  !!##              "%(*,,113457;<=>>>?? LLL+WWW 7IKKLMNNOOPPPQRRRSSSTY]opqrrstuuvvvwwwxxx666[[[& & & & & & & & & & & & &     !!23388==CCG444=z`V6../mio/event/struct.Events.html../mio/struct.Poll.html ::4https://github.com/tokio-rs/mio/tree/master/examples:: ٶ  ::ٶ   ./event/trait.Source.htmlstruct.Registry.html https://crates.io/crates/slabϷ struct.Poll.html   Ϸ   Ϸ   struct.Interest.htmlϷ     Ϸ    4https://man7.org/linux/man-pages/man2/eventfd.2.htmlstruct.Waker.htmlʹ ./event/struct.Event.html       ʹ ../struct.Poll.htmlstruct.Events.html      ς../struct.Registry.html../event/trait.Source.html޻  ς» »  ς$޻ » ../net/struct.TcpStream.html../unix/struct.SourceFd.htmlڼ  »  ڼ »  fmt::Formatter::alternate:https://www.freebsd.org/cgi/man.cgi?query=kqueue&sektion=22https://man7.org/linux/man-pages/man7/epoll.7.html  Ľ ../struct.Token.htmlĽ ̾  fmt::Formatter   ̾ %  G2LLio::ErrorKind::WouldBlockRegistry::deregister24IoSource::do_io׿ > 2  L ׿ >  ޻ ޻ » »  ../event/struct.Events.html޻ ../net/struct.TcpListener.html»      -H׿ >Dhttps://pubs.opengroup.org/onlinepubs/9699919799/functions/pipe.htmlevent::Event::is_writableChttps://pubs.opengroup.org/onlinepubs/9699919799/functions/dup.htmlevent::Event::is_write_closed:: event::EventHevent::Event::is_readableInterest::READABLE ׿ > event::Event::is_read_closed   Interest::WRITABLE   ׿ H        Z:   3./net/struct.TcpStream.html  "https://github.com/asomers/mio-aioJhttps://docs.microsoft.com/en-us/windows/win32/fileio/i-o-completion-ports   5https://man7.org/linux/man-pages/man2/signalfd.2.htmlϷ )https://github.com/tokio-rs/mio/pull/1580  Ľ Ľ  event::Sourcestd::io::ErrorKind::WouldBlock >unix/struct.SourceFd.html         Ϸ  struct.Token.html Ľ    >      Ϸ    Z  $99889,$99889,$$$99889,99889,[FvVgU [F@7[F_ܡڜ[F~k?Н [F\{[FLLW[FKS[FeVeg[FD w6 [FF [F~ܵ[Fwn󩓥[F~xB![FEv{[F3i=][F뉾0[FWv |o[F.k+w[FEe}[Fh[Fy|"Y 8[FCX\5[FlHz˴[F%@3D[FMn2ԇf[F{ <:[F(lIe[Foޥ[FHH.|Z̥[F[FE"J[FU<d[FOcnͷ[F㵯|:[F56ߋ[F د}m[F^ȥ[Fix6b[Fr&0*[F~K a[Fr%In[Fl^,[Fge-kE[F7;p[F=i[FAcN//>[Fk^̗G[Fi[FG0[FZck [Ff2_[F'p[FǮ[Fqٛ[F GRe׏l^[F0=+d[Fw e3[F(l[F-i,e[FEM59[FW[Fhȉ[FoLȥ[F<[$[FBM7h[F3='3[F3[F0WNJ[F n|p.[Fw_7>"{[F  [F[F dѥ[F/c+x[Fyٱmɥ[F'XA֥[Fk)l$[F H別[F;kD[F>YCq[Fr|z-[FJ"iXB̥[FFPY[F Hc'<[F8[Frn6([F֋D[FFbob[FhW*'[Fgm[F<+2[F`:[FR<[F鯦3إ[Fx ً[F[܏P[F aK [F\EPr[Fl[FؙP[F^E̥[F\#@{[FGzMȗb[FB~Vn [Fҹ%c¥[F159[Fߢ0Yn[F-l2[Frmr [FX|5K[FL˷[F=s[F8FB̥[Fc LХ[F]]_J[F֕A9__[F,@/[F3,1[F(ѥ[F([Fd',[F3$Aȥ[Fi3zhD[FÓC{[F 3[F34a{[FG4goΥ[F9j(>![FC"[Ftϴ{ƥ[Fb&_ϥ[FN8[F[F%Ǝ4O[FR[93[FVnP[FT$([FmTZ}[F ڐGS^[F c][Fu@[F*@:'A{[F&B[FEʄ.L[FCH}[F϶e[F@jB[FAJqLV[F [F!#C #O[F+`Ӌ.V[FJ7r[Fn㻏[F}[F\[FAqS [F `f 3[Fq&[F% ~9[FKs7_[FV^ݥ[Fio /[F7rI c\[Fų3F?[F(m[F3qZ [F}][F9 a{ɥ[F!՗ [F,eYЋ[Fg86R[F 5Wmǥ[F[Fz4CXPǥ[F9XJLU[F-o88Gӥ[F.!ټy[F(V [FS"<[F6 [F Pd[FӕwR[Fu ~*}[Fp~L[FEqk8C\[F#ɼ [Ft_K[Fd(s=[F][F(#%ڥ[FPf[F(Qy[F`gnᴥ[Fϥ[FjE C[Faua[F\8;P[FnJlV(z[FuP[lZ [F~Z}M [FH[FVz̋[Fф%[F "<> [F:$S[FH8 [F\(ܷy[Fg̗I[FK䆏[F#0 B[Fpf|uܥ[F]q[FɎ%[FYNϥ[F9[Fwҥ[Fq{7r[Fo[F=&}oH[FFd3?Un[FHy[F(nn#J[FZp[F7O_Rxr$[FEH$ť[F_JtC<IQ[FGv"a/[F_>ե[F%HB[F[F/Շs[FB&GX[F EV;B[F:_ S;ʥ[Fz([FZ>[FTK}/![FX ]< [FF2}Υ[F,GlzS[FRG[F+@"k|[Fr, ~[FAs]0[F[Rk[FCT;[FP+E[F`ߨӼ[FƒiPץ[FlW.[FY4X[Fm(![FaT9![FMZF[FЁP[FqNMj[Fnփ[FчGԍ[F-2[F`|%I[Fz.T[F&u[Fq60W[F!D.[F$S-p[F@ >[F+DjʜRr[F>ÁEQ[F`<[FO~[F:X[F#]uץ[Fg6 n[F(@Kp![FWAUL[FsJ$7[F' /[Fm.1[F8)^؇_[FC-v [Fl9:Tݥ[Fq.(_q[FEk[Fn92ţ[F䧥Ft [F,&2@i[FED©[FBb6[FL$W{[FI~R [FAmDz[F~]Nwz[Fj[F8c[F]M0;ܥ[F26/qإ[Fb 3㷥[F۹#[F4\/q[F:5ץ[FUf[F4ν/)[Fȼ+RI[Flt#[F&W.ϥ[Fo޹[FtS\<[F@Kmd}h[[FjTg;B![F ?og[F5z[Fτ[F3"ޥ[FM5[FrZW[O[FrP[FcԨFa&zV[FK!``ҥ[FJ\ꍥ[FKRK[F]<$H[Fe}[F-v*:[F;$ͥ[Fhwb+8[FB.֔[F|24S[F 87Х[F,4?l[Fʌ.%_ʥ[F^w9Gn[F{#ڌ87W[F*z@ĥ[FwmJ5[FSB|?ǥ[F)Exr[F|yτ[F)*($[F~Ge[̣w[FN"[F2WY#`[F˄WT[FkU[Fx J[Fa[F$3Yo}[F<[F;OohVw[F@Vl[F1OY0[Ff{[FkޒB[F'[F Oc[FLJB~a[F˯L,~ߥ[FKEK[F+%Lia[F!#[FLcyMإ[F󺖼^^ړ[FD#W&[Fe>NG[Ft&, [Fc)k[FRKu5ޥ[F3ե[FX]/[Fh[F>G%[F6@ "J[F]Iɱ[F9kH(֥[Fƫ> j[F] 0ﱥ[FG/w[F% ыְ[FTym6[FVEz[Fxj帣å[F@[FZI*6vj[F{.2o[FȽ~v4[F/hF2[FS_[F4ZC[FK~R[F==_[Fj[Ḟʉ7M[FA喩ԑ3[F?|c[F_ gR;[FC[FZ҄T[Fsj5I[FVCJP[FsNbc[F7#'[ͥ[FANa[F{wf̩k[F5[FƐ|e[FQu{X[F8}[F\h=[F԰Ie[Fz\]][Fomp[F(;[F*e\[FT/6[Fh/[F@}o[FuI&:8\[F)dy5_i[F4`My[F]M}.[Fr?W9ͥ[Fʣ[Fuo[Fėؽ[FOk#Ȍ[F/d1%[FP[FH[FK1ե[Fu7pL}[F FwG,[FI '[Fbb[F%Uӏh[FFi[F[F#[FPu#[FޡD~[F藩ȥ[F30a[FDL]r[FKKߢ[FWC ¸[FM?K[F!<[Fۅx懥[F n%iT[FF\v[[Ftd,R[F4x#[Fl}'?\X[F\Hx[FgT[F߿+2[F֚Z[F{P1[F\ɍ[F,2nl[F1/9Pn\[F'0@([F" [Fݪ ڥ[Ff% ֥[F thNJ[F%Ͼ[FM_/[F r۱`ނ[Fkq+n[F֝AdK[F'G!{7å[F#xVt[F F5[FNjH3~9}[FC.d pV[FpmEW[FFJ[F+zݪ5Q([FS cw*[F&f&?[F և[FJ[FԱB[F̞#[F~S[Fjӓ F[Fa*;|#[F[Fr\J.[F([FWeۂI [FG&e[Fߪu3I:[FۆN)ܾ[Fܥx[FQV&'[F]o[FբjA[F)#[F.c[F!L L[FZq[FIwUq[F/{[FWrU[Fٺ+>ӥ[FB(㺊4[Fw[Fșwh([F&"e[FM}N[FNwΥ[FR[FL B֥[Fqgڛ!w[FP'sJ[F*w\/[FBH¥[FZk48[FN/V&"[FRZ'i}[FsKܴ[Fxӥ[FE]d[F#h[%][FprJ[F w5-[FՑ(:[F]12ʥ[FTd~&a[F@˘`[F>}z"ͥ[F# A[F]HD[F5S/[Fa 2ڇ[FYa[FZD[ǥ[Fta[FzYp[F5>\[F,N[F.y$ɠ[F=急[FCR[F BTŷJɥ[Fà b^:i[F:-i[F$5M[Fa9n@[F8[FSy")[Fe9([FVJaxa:[Fj#[F/*e[Fo`r*v:[Fˏ> O3[F=l r[Fb.vG5[Fr A[Fy$h[F"X!/[FqL-e[F'8F[F\aF_[FغYcS-[FӮz[FN/]*}[F]3=h[F9~[FK8U#[Fs鋃S[Fu}KYɷ[Fq/z[FW֩T[F 1}"[F*z"M[F* UdWإ[F`;Y ڥ[F:p.N̍[Fֻ|_ǥ[FQ5o'9cp[FtYw[Fr!?s[FAť[Fs~[Fv)m[Fs]=|[F z[FSfu2[F鵆#b[F/˹o٩e[Fv0[Fd*\]v[FVa0fͥ[FD[FZ!*,[FSOqB[F 2h [Fe[F(A[F_fx`o[Fo_Lo[F-3*[F [FY7[FhuJ[F9~\[FYۛjCq'[Fex=PB[F~k[F+R[F=<إ[F9\]v[F: [F-.ޥ[F$L[F0 y[FEt[Fq([F y[[F[F42[FeIQ[Fw&[Fo2P1[Fz׉7[F|?ڲ][F؊e [F%)Ԇ5[Fn*Z [F4.3<[FK{ݥ[F=k5W[F:5S`ră[FȨ1[F+ *[F$(ʒ[F?<JW`[FBYؖХ[F; dBӥ[Fp[FKc'l>[Fx+D٥[FZL;3C[F RX[F`8x[Fg s[Fv/K[FE+X[FF'-[FH#[FYGGn[[FDe~][F0 Gץ[FkjX[Fk$#<@[F*

V6iZd[Fg^n[F~> ![FbY 2[FfG_Ю[FV[F~>N[FJi[FP" i[FӨaUv[FS^[FA"I[Fjq(m [F|Z^5+[F\3q[FqDǑե[F,x|&6c˥[FWJT[F1|[FĦ|3[FȘRnܗ[Fkײa[FʭΛ꾥[F" `[Fm/[FrRխ[FT` x [F$[F 2[F7+<[F\إ[Fݨr[Fkt\ ?h[FE`[FH 3[FKr) ;[Fpa[FQxN[Fsd9Υ[F~$[F0zo[Fx G3[F *&>*[FU еzi[F肧 [Ft'D:[F2Xe]M[FInS [FdD[Fށpb[FKB>gZ[F6,[F-`%[FY)8D/[ZZZZ[ZZZZZ[[; +( *,T-GXmn KI EIwDIϲ)յ$ 2+ؾ 666S`/b972Z"#A$J%v&&p''(=)Q)g))**++,I---s. (11u59=>@>BB4DEEE*FGG# L+LGL MN OQ@TTTTUUUUVVSWWWXTYEdfhjkk2l3m#norD 7kI2hk)[PM @huóشQOOf.;4ں+yǻT0ȿ_ba|/}ksmvM%Bdt&?=F>A\"%~t0~3JQj= C _  z     xU0Hf<w[+3+l++,=,"-[--.G..A/|//00001G<<<= >?_???BBB1C DtDDG;H\H|HH IfIJJ K+KKKGLLpMN{NNOP1PgPPSQQRrRRS;S q3)(G)*,R-GXdmnr>z7 GE//'&'`)*- -DwEFL:LTUWdj1eCw`,^pe+E:5PB `R  ?^n*e++4,T--@.y.s/'00<<6??~BC_DHHJKLNPRR2S%%%%%%     !   !%%    !!"     !        o}JOղ1µ۵pҶ? }¾J<U!D}!C#%'&&''(E){)*+v,,P-2.01559<>@ARBHDEEE>FGKLuMQNVO?QSTTTUiUUVVgWWXd_fwhTj#kkFlmnr=x| xVTձ|a% zҷ6OH?ۻZDܿsDsXP|u:HwMRp69^%( s      "]?l **++R,-./E00n<<=?D??BBBFCDEGAHbHH4IzIJK?KKLMNNPEP{PPgQ.RRRPS;?Cq>{C ɲ#xϵܸ,%Ҿ0$00M({1i;"S"#:$C%o&&i''(7)K)a))*******++,D-------m."11o59=>@8BB.D EEEEEF$F G[GeGoGyGL%LALMNOQ:TTTTTOUUUUUVMWWWXY&Y0Y:YDYNYdfhjjkk,llllllllll mm!m-mnnnnnnnr>ލ1eCy,beUJ?Gӯگ '.8DLXdp|:bo ҴKIڶI`(ɸո5۹.Ժ%s*6BNhp|þ;׾)Y] #+7CO[v)w<MYemg6p[ <]},BXn #/7CO[go{ 9*@7;Vxnz*x-D Kd    = X  t   {  ~r~O*A`5pU*+,+e+++6,-T--.@.{.:/u//)00011<<<=8?X???BBBBC*CDaDmDD(G/G9GCGMGUGaGmGuGGGGGGGGGH5HVHvHHII`IOJeJ{JJJK%KKKKALLLiMMuNNNO P+PaPPMQQRlRRR4ST!T)T1T9TATJTST\TeTnTwTTTTTTTTTTTTTTTTU UUU$U,U4UZFZNZVZ^ZfZnZvZ~ZZZZZZZZZZZZZZ=AiwDIϲ+}յ j̶+uiؾ"6 * 6zA /h p!B".#$&x&&''!(?)S)g)********b,,K------.0k1!5t9<s>@A>B D4DEEEEEF*FG`GjGtGK L-LaM=NBO+QS@TTTTTUUUUUVVSWWWX$Y+Y5Y?YIYdKfch@jjjkk2lllllllllmmm'mmnnnnnnr7r$X6j؏ShܞrPEد߯",3>JR^jv@h[شQf0øϸ۸;4ں+yǻ$0<HTnvȾҾܾ#0ȿ_>)1=IUc|}S_mRX<va%Bq2H^)5=IUamu(~90>C\"%5JS   E _  z    |2Hw9faw**+X+++',=,G---3.l..f/|/000001h<<<<?>???BBBBC$C1CEDgDtDE-G4G>GHGSG[GgGsG{GGGGGGGGG%H;H\HHH I IfIUJkJJJJ K+KKKKLLLpMN}NNNOP1PgPPSQRRRR%S;ST'T/T7T?THTQTZTcTlTuT~TTTTTTTTTTTTTTTU UUU"U*U2U:UBUJURUZUbUjUrUzUUUUUUUUUUUUUUUUUV VVV"V*V2V:VBVJVRVZVbVjVrVzVVVVVVVVVVVVVVVVVW WWW"W*W2W:WBWJWRWZWbWjWrWzWWWWWWWWWWWWWWWWXXXX X(X0X8X@XHXPXXX`XhXpXxXXXXXXXXXXXXXXXXXYYYY Y(Y0Y8YAYJYSY\YeYnYwYYYYYYYYYYYYYYYYZZZ"Z+Z4Z@(BB)DD/EEEFFKL6LM|NOQ*TTTTUUUUV2W|WWtXdfhjjkikklԍ-a?s\JL(ZkXʴAȶ7Z #%x˹qĺhd"l!o*I{ eiafm #Ua?Uk1'=  LfJVp>r9\x   5 N  F   _  bNZ6;Gy-j9*+%+a+++0,,P---<.u.(/o//#000K11v<<<=?P???.BBBCC[DDG2HNHoHHHIIIIbJxJJJKK~KKK,LLL8MMWNNNOO$PYPP4QQRZRRR.SSĵݵ qӶ þ$h\>|`P' w!I"##"%O&z&>'''U))*z++,-N.11P59<>@B{B"DDEEEFFKL/LMmNqOQT}TTTU{UUU|V"WrWWdXdfhjjjYkkxlyʍ&Z8l U:Ci !(dѳH_ҵ'S޷kd [x]ze=Bt[YZ \]KPyJ8Nd*o 6TEV:F> 7h/UJ    G  6   O  R>J,~ 4y@ot#c(**+Z+++),,I---5.n./h//0u00+11o<<<=?F???BBBCCGDDG+HDHeHHHI?II[JqJJJJKnKKKLLL(MMGNNNOOPOPP$QQRJRRR'SSd͵~ȸ о-{oK%td9 "#7$6%c&&R'' (^))*++,-a.11c59=>@,BB+DD1EEEFFK"L8LMNOQ.TTTTUUUUV7WWWyXfhjjnkllٍ/cAu^OP*_Ʋm]ϴ$FͶ<\ %'z͹ sƺjf'n&t/K}jnckr%Zf 3%NkO[u@w>^ : P  K   d  gS_;=I~2l>* +*+c+++2,-R--->.w.-/q//%000x1x<<<=!?U???0BBBCC]DDHSHtHHHNI.JJJ#KKK1LL=MM\NNOO)P^PP9QQR_RRR0ST@ ~KV"E~!D#%)&&'|)+w,3.01659<>@ATBIDEE?FKvMRNWO@QTVTjUVVhWW`fxhUj$kkGly} Uֱ}& {շPI@ܻEݿtt Sv;yNSq7:_&) t      #^@**+S,-./F00o<=??BGCDG5I{IJ@KKLMNNHP~PPjQ/RRQS@ ~KV"E!D#%)&&'|)+w,3.01659<>@ATBIDxEE@FvMRNWO@QTVTkUVViWWafyhVj%kkHl} Uֱ}& {շPI@ܻF޿u-SGw<PSq7: _&+ t      #^**+S,-./F00=?HCD6I~IJAKKLMNNHP~PPjQ/RQS1{o޾<G6o!5##$&&'m)++h,$.0q1'5z9<y>@ADB:DE0FgMCNHO1QSFT[U VVYWWQfihFjkk8lޏn[FDZnuó޴QlķA:1ͻ6οe/Bg,?FDb(+~t0P  e      xO~~*+D,-./700<?8C{D&IlIJ1KKLvMNN7PmPPYQ RBS------.1y1132g222'-X-_-i-p-w-~--N.U.. .\...Z/a/h/x//////00P0000,//00000000111L1113a3h3o33v30R"kAWm)?  14HIdJzJKKLND?EFQZ`BɊ؍56X77M9AFa\eij4kkVlo^Nqstu+wxWykz{;|[}~9K2old҇T}wOzx52:::F;;<=?@+BeCGQadkpprɝ-=E?FOZW'^OaЇR֍F6V77K90:Fd ij2kkkoprtuw|xUyezy{9|Y}~30mjb@NJ{uߑMxv3ǝ::E;;<=?@*BdCD>E@FO[W(^PaчS׍6W77L91:Fad[e ij3kkkUloppMq]Jrstu*wxVyjz~{:|Z}~81nkcAȊ|vNyw4ȝ,::=;;g<g=4eMlpEq s$::B;;l<l=9eRlpJqs)˸$ sxhA("#:%f&V'()+,e.11g59=>@0BBDFMNOQ2TTUVEWW~Xfhjvkll$TU ˲`'ҶA,ҹ%x˺o54swk*p\h"|C  P  i l`l@!C+ --2//01=?DDVI>JJK9LEMMdNOaPPFNV^fnv~     % * 2 : B J O W f k p u z  ! !!!!4!9!A!F!N!^!c!k!s!x!!!!!!!!!!!!!!!!"" """" "%"*"/"4"9">"C"H"M"R"W"\"a"f"k"p"x"}"""""""""""""""" #### #(#-#5#:#?#G#L#_#d#l#q#################$$ $$$$'$,$4$9$A$F$N$S$[$c$q$y$~$$$$$$$$$$$$$$$$$$$$$%%%%%$%+%3%7%?%F%N%R%Z%e%m%u%%%%%%%%%%%%%%%%%%%%%%%&&& &(&0&C&H&P&X&`&h&p&&&&&&&&&&&&&&&&&&'' '9'S'X'`'r'z'''''''''''''''''''''''( ((((#()(/(5(;(A(G(M(S(Y(_(e(k(q(w(}(((((((((((((((((((() ))) )').)5)<)C)J)Q)X)_)f)m)t){)))))))))))))))))))*****#***1*8*?*F*M*T*[*b*i*p*w*~*******************+ ++++&+-+4+;+B+I+P+W+^+e+l+s+z++++++++++++++++++++, ,,,",),0,7,>,E,L,S,Z,a,h,o,v,},,,,,,,,,,,,,,,,,,,- ----*pEL#=5Y *<1?yBHRLQײX[l\Rc[\^l]1^i`~`]a_efpffsDoDocccooccccc87GDbcefahid{~|}OWYcoccccccco >>Custom>>nsʗҷ  oe  l*f ݀oڀoߓc_eِ FOs Simple  SimpleMessage  ge  l*f StringError  */E+4888 *&j5d9eIIII I O444040bW`(uf%%OwnedFd%C%p'c[SSSFileDescS H Ҩ#`##RawVec&'cap(ܜ 4ufRepr   /QDuVc???l[ٜ>B]BoB]\Bo_BoBoBoB_cB]\C_AߓȄ(uf<I44f5f5f4f4f5f7uf7f<uf"l:K6ufff5fMXufoDoDo^E== 7.%%&J_:222,ZWLKF??`>9,!!aLL 8.. D;;-##  M900 *WU I9 =[FݸSsǺ".  [F3-ܨ=LY)[F)쓚} O \core_intrinsics derive_eq [F}9-4Y)[FLr4 Y)[FI[0&  \[Fc{.1m& derive_clone_copy[F9'Rp[fmt_helpers_for_deriveGG[FΕyM/ [F'R$k=82 [FUQ;}?:=Y fmt_internals[F]o-~3-=Y[Fsa!$[F˵5'bJa1+2 [Fz٥~"  [FnF' =Y[FΫsuh%2 [F|Ա*i %d[Fܦu(t/L*[F(uNKMY)[Ft`LY& <|II[F,p4GG[F8\i& %d[FM./V [F )ϼp\GG[Fz i.6 Y)[F;G@<>Y#[F / [FdQ;QL`4/>Y#[Fl]F(">Y#[F|o1nh?%  [FkK/L[FވNEV \[FzފH1/ %[FDIp GG[F56 /9[FZLW2/[FffSSp& GG[F{FˠY¼A>>Y#[FTpnXn|`6Y)[FC3 ,[FzX;51>Y#[F'D)$>Y#[Fw(80  [FA/L[F+يa  \[Fn2/ [Fv:U? Ug$i %d[F)c{ /[FC83Q& =\ [FPFP/ [F—9N`[Y)[F=\tl2 ,[FޙbM =[F1.c( -  [FԢʚ/L 0[FY `;L? L[F wr}rm [Fޝ2IGpGG[F) &C Y)[FIB[vLY)[F.u}& O \ [Ft_p6GG[Fk f0 ,[Fkeª4, =[Fy   [F yr1KpNGG[Fp7t?LY)[Ftgha  =\ [Foi%d[F 섅 Y)[F{p 2& \[F'R-ߊ9p[GG[F߯&' ?:>9511+("@<&3-)$%A>=82,4/__log_module_path>8>[F#RNv 7/$ [FG42+>[FK */$ [F4$V@&>[F u` /$ [FomnL__log_format_args>9=[FGXj2,=[F?ؐ&=[F>9>[FS0"2,>[FSNѲ&>[F#HqR u  E    P~Q # Gul > tc lbH  ,cY6  . l ~   Z?   Z  " ~  N     9  c 5 k  ' Z  0 u   ]STQ ~e Fw*S@#"   }\F SBh4 8q ""U s D {!  U F   ~vt 2r 4  nLugEC 6 ~y tcU 6X MC CE kDA 6  p(a$ 0ODHT [F }[F-.ވ[FEH$[Fl[F'[F8r[F r۱`ނ[FE+X[FC.d pV[F{ <:[F [F@ >)[FL B![Fw[FT` x [F$W8c9$[F~vv@-9[F*w\/$[FtYwg[Fd*\]vr[Fe[FhW*'v[F400*[Fd',[Fm.15[FI '[F,N=[FVJaxa:I[F]#X;4[FA"I[F+%Lia[Fw&[FRZ'i}([F\(ܷy[Fc)k[FۆN)ܾ [F.k+w[Fhwb+8e[F$S-p([Fz.T$[F' /4[FKc'l>[Fx+D٤[F 2h w[FR[93[FZk48&[F*

j[F=<؅[F,&2@i>[Fk$#<@[FSB|?o[FԱB[Fge-kEH[F)Exrp[F FwG,[Fg̗I[F9XJLU[F_JtDL]r[FGzMȗb[F\8;P[F7O_Rxr$[F:$S[F RX[FnJlV(z[F0WNJa[FlW.[F1OY0~[Fn*Z [F~Ge[̣ws[FJ\_[FBYؖР[Ft_K[FM_/[Fֻ|_e[FfG_Ю[Ftd,R[Fg s[FKB>gZ[F n%iT[F>V6iZd[FEqk8C\[F(m[F ?ogV[F(@Kp!1[F;OohVw|[FF\v[[F,GlzS[F*z@m[Fz\]][F0zo[F% ~9[FWrU[F$5MD[FЁP[F4`My[Fj[Fq([F!<[F]<$Ha[Fr|z-n[FޡD~[F\ɍ[F{#ڌ87Wl[F F5[F&"e[F[܏P}[FHy[F]q[F\{[FCT;[FEk:[F%Uӏh[Fф%[FN/V&"'[FR [F.y$ɠ>[F8}[F* UdWb[Fۅx[FA喩ԑ3[F\Hx[FK䆏[FuI&:8\[F; dBӡ[FV[F$[F~ܵ [FMn2ԇf[FKr) ;[Fށpb[Fl^,G[FCX\5[F[zJج=[Fz4CXP[F'0@([FsJ$73[F-o88G[F5zW[FчGԍ![FW֩T_[FDt[F8FB̎[FƒiP[FtS\/[F@˘`2[Fpa[Fu}KYɷ][FZ҄T[FoZ> [F9~\[F5>\<[FȘRnܗ[FG&e [F˯L,~߄[F3`[F9kH(֕[F!L L[F" `[F-`%[F+R[F7;pI[F'0#[FC-v 7[F@[F30a[F[F`;Y c[FLLW[F%HB[FprJ-[Fr!?sh[Fq60W&[FgT[F?|c[F'XAi[F159[FSy")G[FI~R B[F֚Z[Fh/[Fn9;[F1|[Fr AP[FJi[F,eYЋ[F 1}"`[FC[Fe9(H[FB&,b9]%[F 87h[Fߢ0Yn[F0 y[FH 3[FZkF"+[F(#%[F肧 [FɎ%[F`|%I#[F*@:'A{[F#h[%],[FQ5o'9cpf[Fu ~*}[F<+2x[Fʌ.%_j[FN/]*}X[F] 0ﱗ[F'8FT[F\h=[FFd3?Un[F,@/[F~xB! [FC"[FYۛjCq'[FjE C[FB&GX[Fr%InF[Fo_Lo{[FLcyM؈[F(Qy[FWAUL2[FVEz[F 5Wm[F=k5W[FuP[lZ [F4ZC[F7#'[Ͱ[F][FAs]0[F#]u/[FK!``^[Faua[FYa8[F9\]v[F@Kmd}h[T[Fe}b[F/d1%[Fkt\ ?h[Fk)l$j[F(lW[F;kDl[F/˹o٩ep[Fu7pL}[Fr, ~[F4ν/)N[FӮzW[FYN[F%)Ԇ5[Fp[FP+E[FdD[Fy|"Y 8[F]M}.[F~K aE[FqDǑ[F/p5[FEM59Y[F֋Dt[FGv"a/[F!D.'[F Pd[FWeۂI [F֝AdK[F==_[F;$d[FH8 [F$(ʒ[FRKu5ގ[F<{[FIwUq[FD#W&[FpmEW[F+zݪ5Q([F? M5![F c][FKEK[F( [F/>㵯|:?[F[F]Iɱ[FFJ[FբjA[F3i=][F y[[FF [F؊e [Fay[F=l rN[F: [FfEA<[F#ɼ [F|24Sg[FZRU1 [F=?[F$L[F>ÁEQ+[FED©?[F\[FjE[FK1[Fj#J[F]o[Fhȉ[[F{wf̩k[Fex[Fio /[F~k?Н [FU еzi[Fomp[FؙP[Fėؽ[F2Xe]M[F<[$][F$3Yo}z[F\EPr[F(;[Fm(![F և[F w5-.[F(p詌8[F9 a{[F]3=hY[F~Z}M [F د}mA[F`:y[F" [FwmJ5n[Fta:[F[FPu#[FWC ¸[F3$Aȗ[FS_[F?<JW`[Fݨr[F 3[Fo޹R[Fnփ [F# A4[Fjӓ F[Fg^n[F|Z^5+[Flt#P[FX|5K[FÓC{[F n|p.b[FVnP[F(nn#J[FǮR[FU<d1[FWZ[F-2"[F-v*:c[FJ? K"[FOk#Ȍ[Fq&[Fg86R[F!՗ [FkUw[FE"J0[FS"<[F/*eK[FZ!*,u[F&f&?[F *&>*[F9j(>![FՑ(:/[FZI*6vj[Fȼ+RIO[F7+<[FqL-eS[FG0N[FVa0fs[FNjH3~9}[F-3*|[F56ߋ@[F!8?7[FEV;B[F "<> [Fw_7>"{c[FM?K[Ft'D:[F^Ê[Fų3F?[F/hF2[FH[FE`[FN"t[Fw6OF6[F1/9Pn\[F~>N[FP" i[FaT9![F[F`<,[FZck O[F Hc'}z"3[FHH.|Z[FEe}[Fpf|u[F34a{[F~> ![FEʄ.L[FPf[FKS[F?*m&[FANa[F Hk[F-i,eX[FsNbc[F`nJ?.[F@Vl}[F}[FqٛS[F+DjʜRr*[F_ܡڜ[F\[F`gn[FrP\[FJ7r[F3"Y[Fg6 n0[Fx ً|[F{.2o[FȽ~v4[Fʣ[FJ[Fܥx[FOcnͷ2[Fr&0*D[FB~Vn [F)*($r[F,2nl[FTd~&a1[Ftϴ{Ɵ[FhuJ[FmTZ}[FL˷[F&B[FeIQ[FB(㺊4[Fa 2ڇ7[F9b~*>[F.!ټy[F߿+2[FSfu2n[FK{ݙ[FȨ1[FH#[FDe~][FĦ|3[F aK ~[F&u%[FVz̋[Fo[F(V [F9[FB.֔f[Fbb[F%Ͼ[F+ *[Fs~j[FJ"iXBo[Fe>NG[Fb.vG5O[F뉾0[F|?ڲ][F thNJ[FEv{ [Fu@[FWJT[F(є[Fkײa[F 2[Frn6(s[Fw e3V[FMZF[FFi[FL$W{A[F~S[F6@ "J[FV^ݾ[Fa9n@E[F4x#[F df[F'pQ[F:-iC[Fm/[F/c+xg[Fșwh([F~$[Fkq+n[F!#C #O[Fݪ [Fc LЏ[Fb 3I[Fˏ> O3M[F0 Gׯ[F^B[Fuo[FZq[FP[FbY 2[FNw[FCR@[FK8U#[[F42[FkjX[FD w6 [F"X!/R[F̞#[Fy$hQ[Ff% [F鵆#bo[FQV&'[Fq.(_q9[Fjq(m [Ft&, [F26/qH[FT/6[Fq/z^[Ff2_P[F%@3D[F,4?li[F:5L[Fix6bC[F@7[FBM7h^[F֕A9__[FN8[F:_ S; [FjTg;B!U[Fw=g+ ([F5[F)dy5_i[Fr?W9[F]120[FZL;3C[F`8x[F,x|&6c[FY)8D/[FF'-[F^w9Gnk[FH[FBH%[FKKߢ[FM}N[FSOqBv[FjQ[FvVgU [FY4X[F:X.[F2WY#`u[FX]/[FE]d+[F_fx`oz[FS cw*[FغYcS-V[F(lIe[FeVeg[F=iJ[FTym6[FYGGn[[FZp[Fq{7r[Fߪu3I: [Fo`r*v:L[Fx Jx[Fi3zhD[F'G!{7[FWv |o[F}][FTK}/! [FC<IQ[FLJB~a[F@}o[F9~Z[FT$([Fqt)[F/{[FAi[F([Fz׉7[F+`Ӌ.V[FӕwR[F>G%[F>YCqm[F%Ǝ4O[F7rI c\[Fyٱmh[F [F϶e[FkޒB[Fs鋃S\[FrRխ[F=s[FAcN//>K[F/Շs[Fgmw[F(Ay[F6 [F=&}oH[F0=+dU[F[Rk[F5S/6[FZD[9[F4.3<[FQxN[F3='3_[F  d[Frmr [F)#[Ḟʉ7M[F|yτq[FAqS [Fٺ+>[F鯦3{[F Oc[FrZW[O[[FiM[Fwn [FAmDzC[FI2Z'[F!#[F[Fx*[Fb&_Ϡ[FBb6@[Fxj帣Ü[FG4goΜ[F ڐGS^[F3qZ [FG/w[F+@"k|[FRX#T7py!CCSl&qcMKfVQki~RO-4s"2>AUgGK"y0j8GL]2%/fIoM+|%vTX.|xU9uQ)i@s(}l5jE5w4DZL&>9CsWd46 IJTM\d/0|u\A #%=(%W2@%F [2|5u2xf>^EW~=%fPR0rxK4N*L88Ijs+wO4[A&z6 :ffzn=WF}J0D16HF9~uZXo7E7@^<[? 6Lc%>N(^Y~ynzwAEMXLIf#W%=y*h0Z4IZ{n{h84p<7Amh[kd7 QgQXy,|UPk]L8Fl=/"6kspUex4fe!% 9I'(K1'ZPA2I8)J"&-  "#&(^K]2JTAW/home/steffen/.cargo/registry/src/index.crates.io-6f17d22bba15001f/mio-0.8.5/src/lib.rs Yfz+L| ]fJ #')#"$PQ3 PN#&0N F BE     &= 8;")@!/#?FLOJ5>DJQ5FLM!.>'!P7)PQ7&03>#-:!M!1  JKO8'QOUPIQL3IT%,-#8<8RS(N M,>&KQPOPO04IT#%4('78:*P!IG#)P:&%R42;P2RL,G9) 24 ((qw{[5(Pk/home/steffen/.cargo/registry/src/index.crates.io-6f17d22bba15001f/mio-0.8.5/src/sys/unix/selector/epoll.rs EJRH~2%%P ]UTO,01I,daQ"@A!& M: ],3,( V_,3,( V<[+4!$ #54 4!,!$+"0;C0<-<31:CAH41:.BFD=0<'6'U5A.   ("D! 8&;"!96رUA‘6i/home/steffen/.cargo/registry/src/index.crates.io-6f17d22bba15001f/mio-0.8.5/src/sys/unix/selector/mod.rs |j;'[ljhh-ljh   >   ?: LPP4EU nͼb/home/steffen/.cargo/registry/src/index.crates.io-6f17d22bba15001f/mio-0.8.5/src/sys/unix/waker.rs tnq-Əѡhih8"&&#LIP3MYOM==2 /3+!MPJ# & N,7.!LBS& 8K IOOQBM7(9 /+ K  $"&&%P)M#TKL?A=6 /NL-*/!MQ" Y& M%%80!  2"jS3+d `/home/steffen/.cargo/registry/src/index.crates.io-6f17d22bba15001f/mio-0.8.5/src/sys/unix/mod.rs g^P\5gƉhHgH<241 E&''N),H0M '*7EOy!Z/home/steffen/.cargo/registry/src/index.crates.io-6f17d22bba15001f/mio-0.8.5/src/macros.rs Ӱ$s:V`bG JXFJ?6& (? ' - % '> " $; Q H_ P =T 37>P-4: 6Wa/home/steffen/.cargo/registry/src/index.crates.io-6f17d22bba15001f/mio-0.8.5/src/sys/unix/pipe.rs iGX7] 'IϪnoϪn07?: /)O3QQV KQMQILNP%1%057JFTN&.6''$>!/3*MK+ '%"/6ML1A!#+6<.-#% A0))$+!/3MK#!59-! 1(! T4 8 P1/4 FJ6K--! ! @464!7;I=O+KQ*2 ! 4(/0G>#8V!O50 (2J= %8W!N50 ' 6 &" 8:F(;9NC,6;9NC,6 8#+M<19 #$.#7=I=O+KQ*2 ! 4(/0G>#8V!O50 (2J= %8W!N50 ' 6 &""8:F(>8TB>8TB 8&/N? 8&/N?39 #$.#E,A( E;0"! "C4  wZ!z1\6n]/home/steffen/.cargo/registry/src/index.crates.io-6f17d22bba15001f/mio-0.8.5/src/io_source.rs grk(54yJqqq!  '0/LKONF(3 QQ+0& ;'0L!')%, P+KQ*25 ()4N-#Q" 'Q"#3 &!/@!7BF!8?&!/N!7:G!9 &!/E!7GF!8D#?<A8###6 KA4G/ .C MQ I42- )= .M O=J4N( )= $C Tϴ7rY\/home/steffen/.cargo/registry/src/index.crates.io-6f17d22bba15001f/mio-0.8.5/src/interest.rs }Hnc[V 7^LXX"NPM481A+7 5 !:B\B\H!RH"R%I P7. -:T0I SBK,+CAC= ?D?-'?-':(":("*%.$A $& $& %# (% + (% 8=1" 9ZX/home/steffen/.cargo/registry/src/index.crates.io-6f17d22bba15001f/mio-0.8.5/src/poll.rs lvmF"rۢh02 )9MPOGOILMNK+1687>DO0.&+30N!2@'_M 'BP M?FFOK$MOLOO63KOIKNHHOK"QFN/??9EGIN DO0&65@+O]OPQN-/'IOKMNOQNB2LSPPII72LHQNMNJKINIP3*CG""""""""""""KLJQOPQHQM @IWH,1 ( PP ^OTOP6 6 '  %8%% /"Q ;: EPG(+71 C*"PPNQERPN-NQNON'GJ@N5GG#9OM#HM2BHS!42!1/7/1/ % R%64+"7Q$+#FT# _= #"A*@OPK5ODOOIJ JOO$P;Q#LMJ,PPNI5/??%HS!42!",%:9F+"76$2+$(/6#/D# c #P 0CJNQPQP"Q:JKHS!4*!"!:9F@""P7$" 5%;<fr7fgY/home/steffen/.cargo/registry/src/index.crates.io-6f17d22bba15001f/mio-0.8.5/src/waker.rs ԱWMp9س`# 2JJ?, OOJHKO(LD2.9<+)!/DH ),390G#P!5(1 I!#Q;#+|цY_/home/steffen/.cargo/registry/src/index.crates.io-6f17d22bba15001f/mio-0.8.5/src/event/event.rs ~IFfSaL@4"$ ##'?GFBQ0(-?(-<PN7PA,,,N@DM%*BNDNOBMI(A,,,7,@DM+0CJOI(MJ(A,,,06,@DM,1?PA,,,,@DM(-:QA,,,0D@DM#(:P:#(IIDR? KPL/+?'-(44.:<4*+57K9D .E"%T}dI`/home/steffen/.cargo/registry/src/index.crates.io-6f17d22bba15001f/mio-0.8.5/src/event/events.rs +-f b9%&LNK+44".902!".?!:A#-.902!%?!:J 2- 69 C 2- &= 2$ %52=!4!!6%)C%>  % ?N2=!4!!6%)C$ )7'+!/- 4+?.(dC`/home/steffen/.cargo/registry/src/index.crates.io-6f17d22bba15001f/mio-0.8.5/src/event/source.rs u(?֨E^( >@JO '*#PKNP0/ POPL:>;DO*W 8= Y :? J:- <PP"H?9EPL>9EHLE68F&$3Wΐe/home/steffen/.cargo/registry/src/index.crates.io-6f17d22bba15001f/mio-0.8.5/src/sys/unix/sourcefd.rs aY%XOi=Thhth/ IFJO.MIQ>>2"D C H0&$6.LGR1""W D Y F J4 (*@BF0M) F]/home/steffen/.cargo/registry/src/index.crates.io-6f17d22bba15001f/mio-0.8.5/src/event/mod.rs xhg ٳ ٳ)# &yqJ1hzms yS{ZJ+(=mx86_64-unknown-linux-gnuTp6݆6W=mio-675d701494e3377c[F̺R]]!!!!!!!!!!!! @ H