From d319f18db94db5e534186a1d3345ca7a4547e9bb Mon Sep 17 00:00:00 2001 From: Darius Auding <Darius.auding@gmx.de> Date: Tue, 9 May 2023 16:51:14 +0200 Subject: [PATCH] 1. Add SIGNIT graceful shutdown 1. Organize lib.rs in modules 1. Setting up basic text-file server functionality 1. Adding some test files --- core/http/Cargo.lock | 743 +++++++++++++++++++++++++++++++++++++ core/http/Cargo.toml | 2 + core/http/src/handlers.rs | 34 ++ core/http/src/lib.rs | 71 +--- core/http/src/routing.rs | 63 +++- core/http/src/setup.rs | 85 +++++ core/http/src/threading.rs | 5 - core/http/src/utils/mod.rs | 0 site/404.html | 12 + site/Cargo.lock | 743 +++++++++++++++++++++++++++++++++++++ site/QLC-LS.jpg | Bin 0 -> 51549 bytes site/hello.css | 4 + site/hello.html | 1 + site/src/main.rs | 2 +- 14 files changed, 1690 insertions(+), 75 deletions(-) create mode 100644 core/http/src/setup.rs create mode 100644 core/http/src/utils/mod.rs create mode 100644 site/404.html create mode 100644 site/QLC-LS.jpg create mode 100644 site/hello.css diff --git a/core/http/Cargo.lock b/core/http/Cargo.lock index 8490fd5..755ed5e 100644 --- a/core/http/Cargo.lock +++ b/core/http/Cargo.lock @@ -2,6 +2,749 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "base64" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a4ddaa51a5bc52a6948f74c06d20aaaddb71924eab79b8c97a8c556e942d6a" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bumpalo" +version = "3.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b1ce199063694f33ffb7dd4e0ee620741495c32833cde5aa08f02a0bf96f0c8" + +[[package]] +name = "bytes" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" + +[[package]] +name = "cc" +version = "1.0.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "core-foundation" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" + +[[package]] +name = "ctrlc" +version = "3.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbcf33c2a618cbe41ee43ae6e9f2e48368cd9f9db2896f10167d8d762679f639" +dependencies = [ + "nix", + "windows-sys 0.45.0", +] + +[[package]] +name = "getrandom" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c85e1d9ab2eadba7e5040d4e09cbd6d072b76a557ad64e797c2cb9d4da21d7e4" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + [[package]] name = "http" version = "0.1.0" +dependencies = [ + "ctrlc", + "quinn", +] + +[[package]] +name = "js-sys" +version = "0.3.61" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "445dde2150c55e483f3d8416706b97ec8e8237c307e5b7b4b8dd15e6af2a0730" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "libc" +version = "0.2.144" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b00cc1c228a6782d0f076e7b232802e0c5689d41bb5df366f2a6b6621cfdfe1" + +[[package]] +name = "log" +version = "0.4.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "mio" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b9d9a46eff5b4ff64b45a9e316a6d1e0bc719ef429cbec4dc630684212bfdf9" +dependencies = [ + "libc", + "log", + "wasi", + "windows-sys 0.45.0", +] + +[[package]] +name = "nix" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfdda3d196821d6af13126e40375cdf7da646a96114af134d5f417a9a1dc8e1a" +dependencies = [ + "bitflags", + "cfg-if", + "libc", + "static_assertions", +] + +[[package]] +name = "once_cell" +version = "1.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" + +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[package]] +name = "pin-project-lite" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" + +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + +[[package]] +name = "proc-macro2" +version = "1.0.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quinn" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "445cbfe2382fa023c4f2f3c7e1c95c03dcc1df2bf23cebcb2b13e1402c4394d1" +dependencies = [ + "bytes", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash", + "rustls", + "thiserror", + "tokio", + "tracing", + "webpki", +] + +[[package]] +name = "quinn-proto" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67c10f662eee9c94ddd7135043e544f3c82fa839a1e7b865911331961b53186c" +dependencies = [ + "bytes", + "rand", + "ring", + "rustc-hash", + "rustls", + "rustls-native-certs", + "slab", + "thiserror", + "tinyvec", + "tracing", + "webpki", +] + +[[package]] +name = "quinn-udp" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "641538578b21f5e5c8ea733b736895576d0fe329bb883b937db6f4d163dbaaf4" +dependencies = [ + "libc", + "quinn-proto", + "socket2", + "tracing", + "windows-sys 0.42.0", +] + +[[package]] +name = "quote" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f4f29d145265ec1c483c7c654450edde0bfe043d3938d6972630663356d9500" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "ring" +version = "0.16.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" +dependencies = [ + "cc", + "libc", + "once_cell", + "spin", + "untrusted", + "web-sys", + "winapi", +] + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "rustls" +version = "0.20.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fff78fc74d175294f4e83b28343315ffcfb114b156f0185e9741cb5570f50e2f" +dependencies = [ + "ring", + "sct", + "webpki", +] + +[[package]] +name = "rustls-native-certs" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0167bac7a9f490495f3c33013e7722b53cb087ecbe082fb0c6387c96f634ea50" +dependencies = [ + "openssl-probe", + "rustls-pemfile", + "schannel", + "security-framework", +] + +[[package]] +name = "rustls-pemfile" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d194b56d58803a43635bdc398cd17e383d6f71f9182b9a192c127ca42494a59b" +dependencies = [ + "base64", +] + +[[package]] +name = "schannel" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "713cfb06c7059f3588fb8044c0fad1d09e3c01d225e25b9220dbfdcf16dbb1b3" +dependencies = [ + "windows-sys 0.42.0", +] + +[[package]] +name = "sct" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "security-framework" +version = "2.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a332be01508d814fed64bf28f798a146d73792121129962fdf335bb3c49a4254" +dependencies = [ + "bitflags", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31c9bb296072e961fcbd8853511dd39c2d8be2deb1e17c6860b1d30732b323b4" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "slab" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" +dependencies = [ + "autocfg", +] + +[[package]] +name = "socket2" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "spin" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a34fcf3e8b60f57e6a14301a2e916d323af98b0ea63c599441eec8558660c822" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "thiserror" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.15", +] + +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3c786bf8134e5a3a166db9b29ab8f48134739014a3eca7bc6bfa95d673b136f" +dependencies = [ + "autocfg", + "libc", + "mio", + "pin-project-lite", + "socket2", + "windows-sys 0.48.0", +] + +[[package]] +name = "tracing" +version = "0.1.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" +dependencies = [ + "cfg-if", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f57e3ca2a01450b1a921183a9c9cbfda207fd822cef4ccb00a65402cbba7a74" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.15", +] + +[[package]] +name = "tracing-core" +version = "0.1.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a" +dependencies = [ + "once_cell", +] + +[[package]] +name = "unicode-ident" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" + +[[package]] +name = "untrusted" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.84" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31f8dcbc21f30d9b8f2ea926ecb58f6b91192c17e9d33594b3df58b2007ca53b" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.84" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95ce90fd5bcc06af55a641a86428ee4229e44e07033963a2290a8e241607ccb9" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn 1.0.109", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.84" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c21f77c0bedc37fd5dc21f897894a5ca01e7bb159884559461862ae90c0b4c5" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.84" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.84" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" + +[[package]] +name = "web-sys" +version = "0.3.61" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e33b99f4b23ba3eec1a53ac264e35a755f00e966e0065077d6027c0f575b0b97" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f095d78192e208183081cc07bc5515ef55216397af48b873e5edcd72637fa1bd" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-sys" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.0", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-targets" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5" +dependencies = [ + "windows_aarch64_gnullvm 0.48.0", + "windows_aarch64_msvc 0.48.0", + "windows_i686_gnu 0.48.0", + "windows_i686_msvc 0.48.0", + "windows_x86_64_gnu 0.48.0", + "windows_x86_64_gnullvm 0.48.0", + "windows_x86_64_msvc 0.48.0", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" diff --git a/core/http/Cargo.toml b/core/http/Cargo.toml index 8b1c9f1..34a4506 100644 --- a/core/http/Cargo.toml +++ b/core/http/Cargo.toml @@ -6,3 +6,5 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] +quinn = "0.9.3" +ctrlc = "3.2.5" diff --git a/core/http/src/handlers.rs b/core/http/src/handlers.rs index e69de29..944f60a 100644 --- a/core/http/src/handlers.rs +++ b/core/http/src/handlers.rs @@ -0,0 +1,34 @@ +use std::{ + fs, + io::{BufRead, BufReader, Write}, + net::TcpStream, +}; + +pub fn handle_connection(mut stream: TcpStream) { + let buf_reader = BufReader::new(&mut stream); + let http_request: Vec<_> = buf_reader + .lines() + .map(|result| result.unwrap()) + .take_while(|line| !line.is_empty()) + .collect(); + + let path_elements = http_request[0] + .split(" ") + .nth(1) + .unwrap() + .split("/") + .filter(|&val| val != ".." && val != "") + .collect::<Vec<&str>>(); + let mut path = String::from("./"); + path.push_str(&path_elements.join("/")); + println!("{:?}", path_elements); + println!("{:?}", path); + + let status_line = "HTTP/1.1 200 OK"; + let contents = fs::read_to_string(path).unwrap_or(fs::read_to_string("404.html").unwrap()); + let length = contents.len(); + + let response = format!("{status_line}\r\nContent-Length: {length}\r\n\r\n{contents}"); + + stream.write_all(response.as_bytes()).unwrap(); +} diff --git a/core/http/src/lib.rs b/core/http/src/lib.rs index 1d8e24d..0b86db5 100644 --- a/core/http/src/lib.rs +++ b/core/http/src/lib.rs @@ -1,74 +1,11 @@ -use std::{ - fs, - io::{BufRead, BufReader, Write}, - net::{TcpListener, TcpStream}, - thread::available_parallelism, -}; - -use threading::ThreadPool; - mod handlers; mod routing; +mod setup; mod threading; -pub struct Config { - address: TcpListener, - workers: usize, - threadpool: ThreadPool, -} - -impl Config { - pub fn mount(self, mountpoint: &str, routes: Vec<routing::Route>) {} - pub fn launch(self) { - for stream in self.address.incoming() { - let stream = stream.unwrap(); - self.threadpool.execute(|| handle_connection(stream)) - } - } -} - -fn handle_connection(mut stream: TcpStream) { - let buf_reader = BufReader::new(&mut stream); - let http_request: Vec<_> = buf_reader - .lines() - .map(|result| result.unwrap()) - .take_while(|line| !line.is_empty()) - .collect(); - - let status_line = "HTTP/1.1 200 OK"; - let contents = fs::read_to_string("hello.html").unwrap(); - let length = contents.len(); - - let response = format!("{status_line}\r\nContent-Length: {length}\r\n\r\n{contents}"); - - stream.write_all(response.as_bytes()).unwrap(); -} - -pub fn build(ip: &str) -> Config { - let listener = TcpListener::bind(ip).unwrap(); - let ip = ip.splitn(2, ":").collect::<Vec<&str>>(); - if ip.len() != 2 { - panic!("Invalid IP Address"); - } - let port = ip[1]; - let ip = ip[0]; - let workers = available_parallelism().unwrap().get(); - let threadpool = ThreadPool::new(workers); - println!( - "\x1b[34mâš™ Configuration\x1b[0m - >> \x1b[34mIp\x1b[0m: {ip} - >> \x1b[34mPort\x1b[0m: {port} - >> \x1b[34mWorkers\x1b[0m: {workers} -\n -Server has launched from {ip}:{port}. -" - ); - Config { - address: listener, - workers, - threadpool, - } -} +mod utils; #[cfg(test)] mod tests {} + +pub use setup::build; diff --git a/core/http/src/routing.rs b/core/http/src/routing.rs index 6ae9a73..aee6f8a 100644 --- a/core/http/src/routing.rs +++ b/core/http/src/routing.rs @@ -1,2 +1,61 @@ -pub struct Route; -pub struct RoutInfo; +pub struct RoutInfo { + name: Option<&'static str>, + method: Method, + path: &'static str, + // handler: fn(Request) -> Outcome, + format: Option<Format>, + rank: Option<isize>, +} + +pub struct Route { + name: Option<&'static str>, + method: Method, + // handler: fn(Request) -> Outcome, + uri: &'static str, + rank: isize, + format: Format, +} + +impl Route { + pub fn from(routeinfo: RoutInfo) -> Self { + let rank = routeinfo.rank.unwrap_or(0); + let format = routeinfo.format.unwrap_or(Format::Plain); + Route { + name: routeinfo.name, + method: routeinfo.method, + // handler: routeinfo.handler, + uri: routeinfo.path, + rank, + format, + } + } +} + +struct Request<'a> { + uri: &'a str, + headers: Vec<&'a str>, +} + +enum Outcome<S, E, F> { + Success(S), + Failure(E), + Forward(F), +} + +enum Method { + Get, + Head, + Post, + Put, + Delete, + Connect, + Options, + Trace, + Patch, +} + +enum Format { + Json, + Plain, + Html, +} diff --git a/core/http/src/setup.rs b/core/http/src/setup.rs new file mode 100644 index 0000000..b69bc0f --- /dev/null +++ b/core/http/src/setup.rs @@ -0,0 +1,85 @@ +use std::{ + net::TcpListener, + sync::{ + atomic::{self, AtomicBool}, + Arc, + }, + thread::available_parallelism, +}; + +use crate::{handlers::handle_connection, routing::Route, threading::ThreadPool}; + +pub struct PreMountConfig { + address: TcpListener, + workers: usize, + threadpool: ThreadPool, +} +impl PreMountConfig { + pub fn mount(self, mountpoint: &str, routes: Vec<Route>) -> Config { + Config { + mountpoint, + address: self.address, + workers: self.workers, + threadpool: self.threadpool, + routes, + } + } +} +pub struct Config<'a> { + mountpoint: &'a str, + address: TcpListener, + workers: usize, + threadpool: ThreadPool, + routes: Vec<Route>, +} + +impl Config<'_> { + pub fn launch(self) { + let running = Arc::new(AtomicBool::new(true)); + + // Clone a reference to `running` to pass to the signal handler closure + let running_for_handler = running.clone(); + + // Set up a signal handler for SIGINT + ctrlc::set_handler(move || { + // When the user sends a SIGINT signal (e.g. by pressing CTRL+C), + // set the `running` flag to false to initiate a graceful shutdown + println!("SIGNIT received, shutting down gracefully"); + running_for_handler.store(false, atomic::Ordering::SeqCst); + }) + .expect("Error setting Ctrl-C handler"); + + for stream in self.address.incoming() { + if !running.load(atomic::Ordering::SeqCst) { + break; + } + let stream = stream.unwrap(); + self.threadpool.execute(|| handle_connection(stream)) + } + } +} +pub fn build(ip: &str) -> PreMountConfig { + let listener = TcpListener::bind(ip).unwrap(); + let ip = ip.splitn(2, ":").collect::<Vec<&str>>(); + if ip.len() != 2 { + panic!("Invalid IP Address"); + } + let port = ip[1]; + let ip = ip[0]; + let workers = available_parallelism().unwrap().get(); + let threadpool = ThreadPool::new(workers); + println!( + "\x1b[34mâš™ Configuration\x1b[0m + >> \x1b[34mIp\x1b[0m: {ip} + >> \x1b[34mPort\x1b[0m: {port} + >> \x1b[34mWorkers\x1b[0m: {workers} +\n +Server has launched from {ip}:{port}. +" + ); + PreMountConfig { + address: listener, + workers, + threadpool, + } +} diff --git a/core/http/src/threading.rs b/core/http/src/threading.rs index b59bec8..e743853 100644 --- a/core/http/src/threading.rs +++ b/core/http/src/threading.rs @@ -51,8 +51,6 @@ impl Drop for ThreadPool { drop(self.sender.take()); for worker in &mut self.workers { - println!("Shutting down worker {}", worker.id); - if let Some(thread) = worker.thread.take() { thread.join().unwrap(); } @@ -71,12 +69,9 @@ impl Worker { match message { Ok(job) => { - println!("Worker {id} got a job; executing."); - job(); } Err(_) => { - println!("Worker {id} disconnected; shutting down."); break; } } diff --git a/core/http/src/utils/mod.rs b/core/http/src/utils/mod.rs new file mode 100644 index 0000000..e69de29 diff --git a/site/404.html b/site/404.html new file mode 100644 index 0000000..3a6ceb5 --- /dev/null +++ b/site/404.html @@ -0,0 +1,12 @@ +<!DOCTYPE html> +<html lang="en"> + <head> + <meta charset="utf-8" /> + <title>404</title> + <link rel="stylesheet" href="/hello.css" /> + </head> + <body> + <h1>404</h1> + <p>Hi from Rust</p> + </body> +</html> diff --git a/site/Cargo.lock b/site/Cargo.lock index fac1130..498f9ed 100644 --- a/site/Cargo.lock +++ b/site/Cargo.lock @@ -2,9 +2,357 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "base64" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a4ddaa51a5bc52a6948f74c06d20aaaddb71924eab79b8c97a8c556e942d6a" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bumpalo" +version = "3.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b1ce199063694f33ffb7dd4e0ee620741495c32833cde5aa08f02a0bf96f0c8" + +[[package]] +name = "bytes" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" + +[[package]] +name = "cc" +version = "1.0.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "core-foundation" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" + +[[package]] +name = "ctrlc" +version = "3.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbcf33c2a618cbe41ee43ae6e9f2e48368cd9f9db2896f10167d8d762679f639" +dependencies = [ + "nix", + "windows-sys 0.45.0", +] + +[[package]] +name = "getrandom" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c85e1d9ab2eadba7e5040d4e09cbd6d072b76a557ad64e797c2cb9d4da21d7e4" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + [[package]] name = "http" version = "0.1.0" +dependencies = [ + "ctrlc", + "quinn", +] + +[[package]] +name = "js-sys" +version = "0.3.61" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "445dde2150c55e483f3d8416706b97ec8e8237c307e5b7b4b8dd15e6af2a0730" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "libc" +version = "0.2.144" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b00cc1c228a6782d0f076e7b232802e0c5689d41bb5df366f2a6b6621cfdfe1" + +[[package]] +name = "log" +version = "0.4.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "mio" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b9d9a46eff5b4ff64b45a9e316a6d1e0bc719ef429cbec4dc630684212bfdf9" +dependencies = [ + "libc", + "log", + "wasi", + "windows-sys 0.45.0", +] + +[[package]] +name = "nix" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfdda3d196821d6af13126e40375cdf7da646a96114af134d5f417a9a1dc8e1a" +dependencies = [ + "bitflags", + "cfg-if", + "libc", + "static_assertions", +] + +[[package]] +name = "once_cell" +version = "1.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" + +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[package]] +name = "pin-project-lite" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" + +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + +[[package]] +name = "proc-macro2" +version = "1.0.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quinn" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "445cbfe2382fa023c4f2f3c7e1c95c03dcc1df2bf23cebcb2b13e1402c4394d1" +dependencies = [ + "bytes", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash", + "rustls", + "thiserror", + "tokio", + "tracing", + "webpki", +] + +[[package]] +name = "quinn-proto" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67c10f662eee9c94ddd7135043e544f3c82fa839a1e7b865911331961b53186c" +dependencies = [ + "bytes", + "rand", + "ring", + "rustc-hash", + "rustls", + "rustls-native-certs", + "slab", + "thiserror", + "tinyvec", + "tracing", + "webpki", +] + +[[package]] +name = "quinn-udp" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "641538578b21f5e5c8ea733b736895576d0fe329bb883b937db6f4d163dbaaf4" +dependencies = [ + "libc", + "quinn-proto", + "socket2", + "tracing", + "windows-sys 0.42.0", +] + +[[package]] +name = "quote" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f4f29d145265ec1c483c7c654450edde0bfe043d3938d6972630663356d9500" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "ring" +version = "0.16.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" +dependencies = [ + "cc", + "libc", + "once_cell", + "spin", + "untrusted", + "web-sys", + "winapi", +] + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "rustls" +version = "0.20.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fff78fc74d175294f4e83b28343315ffcfb114b156f0185e9741cb5570f50e2f" +dependencies = [ + "ring", + "sct", + "webpki", +] + +[[package]] +name = "rustls-native-certs" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0167bac7a9f490495f3c33013e7722b53cb087ecbe082fb0c6387c96f634ea50" +dependencies = [ + "openssl-probe", + "rustls-pemfile", + "schannel", + "security-framework", +] + +[[package]] +name = "rustls-pemfile" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d194b56d58803a43635bdc398cd17e383d6f71f9182b9a192c127ca42494a59b" +dependencies = [ + "base64", +] + +[[package]] +name = "schannel" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "713cfb06c7059f3588fb8044c0fad1d09e3c01d225e25b9220dbfdcf16dbb1b3" +dependencies = [ + "windows-sys 0.42.0", +] + +[[package]] +name = "sct" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "security-framework" +version = "2.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a332be01508d814fed64bf28f798a146d73792121129962fdf335bb3c49a4254" +dependencies = [ + "bitflags", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31c9bb296072e961fcbd8853511dd39c2d8be2deb1e17c6860b1d30732b323b4" +dependencies = [ + "core-foundation-sys", + "libc", +] [[package]] name = "site" @@ -12,3 +360,398 @@ version = "0.1.0" dependencies = [ "http", ] + +[[package]] +name = "slab" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" +dependencies = [ + "autocfg", +] + +[[package]] +name = "socket2" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "spin" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a34fcf3e8b60f57e6a14301a2e916d323af98b0ea63c599441eec8558660c822" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "thiserror" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.15", +] + +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3c786bf8134e5a3a166db9b29ab8f48134739014a3eca7bc6bfa95d673b136f" +dependencies = [ + "autocfg", + "libc", + "mio", + "pin-project-lite", + "socket2", + "windows-sys 0.48.0", +] + +[[package]] +name = "tracing" +version = "0.1.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" +dependencies = [ + "cfg-if", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f57e3ca2a01450b1a921183a9c9cbfda207fd822cef4ccb00a65402cbba7a74" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.15", +] + +[[package]] +name = "tracing-core" +version = "0.1.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a" +dependencies = [ + "once_cell", +] + +[[package]] +name = "unicode-ident" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" + +[[package]] +name = "untrusted" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.84" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31f8dcbc21f30d9b8f2ea926ecb58f6b91192c17e9d33594b3df58b2007ca53b" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.84" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95ce90fd5bcc06af55a641a86428ee4229e44e07033963a2290a8e241607ccb9" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn 1.0.109", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.84" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c21f77c0bedc37fd5dc21f897894a5ca01e7bb159884559461862ae90c0b4c5" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.84" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.84" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" + +[[package]] +name = "web-sys" +version = "0.3.61" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e33b99f4b23ba3eec1a53ac264e35a755f00e966e0065077d6027c0f575b0b97" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f095d78192e208183081cc07bc5515ef55216397af48b873e5edcd72637fa1bd" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-sys" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.0", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-targets" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5" +dependencies = [ + "windows_aarch64_gnullvm 0.48.0", + "windows_aarch64_msvc 0.48.0", + "windows_i686_gnu 0.48.0", + "windows_i686_msvc 0.48.0", + "windows_x86_64_gnu 0.48.0", + "windows_x86_64_gnullvm 0.48.0", + "windows_x86_64_msvc 0.48.0", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" diff --git a/site/QLC-LS.jpg b/site/QLC-LS.jpg new file mode 100644 index 0000000000000000000000000000000000000000..07eb7f85ac26c70344d552f56a81c44a0bf1b3db GIT binary patch literal 51549 zcmeFYWmH?y*FG4mP@Ll47AO=g?pBHycW(<ti@OCYE-6qb9$LIeiUyY=!QF}ncM>#M z7=AOeX4aZdGxK5o@65a>cdz^5-sGMqXWw(4z4vn-<{#Doq-sj4N&pND48VuS58z=D zpa8(a#Qe|k*svcD96THxY-}8ST-+ykg!qJn1o#95M8wZXiHOOF2?$83NXf`4C@Cok zNvLV4C}^HhP*VKoM=-D+zk`kQ6bI)i1rY%e#sB5@&<P;J!yL!z#KL$9z$C-KBExv- z0Wbpq7&wo;{ZEJg*M@=l*vBWhcu(;O9&e~81z=)eVPRrp{ioNDcLzUS2Vj%oJbS?} z|AbuUBkoIg3W2cXpLi^9tGg(5ClIWHpFF~!;!{!6(9*HJV&{0xDI_c+Dkd(W@J>-l zSw&S%Pv5}M$k@cx+UB#ZoxOvjr<b>nub+QF#Mj8E=$P2Jl+^EO=|3_uvwjs678RG2 zmi?}&t*dW<Ha0c??e6LAgY^##PEJkF%+AgKTY#@`Y;JAu?C$L&PtVRTF0WA6H~+zf z0l@lSVEu2%{tvjw9&uq}V`E|C{s$KZrthO+kzwP!;D7Q=UI+K1JNZk2Fg%L4$v>;R zp0Wt)A}Bw3OyE<o3c=Zs|AF>DBl|xGEd2i#vi}X(|Bh<`K!}C$ICxlO09nAj-mf?g zz<=9+{|Eo=1OM#<|Lp_+Klg#3>8C3=!>N4{_r;j`=!K~Vz|Q3=8jTNVQPh^W%xZHz zg5B3!Axji1jWyvcZBQR+%znYUUCbj29XXu;uNtN1tpW6p)rySSZTUczktx!9s(4YD ztW0c4T<8$@Gf$5;;lRuM2Y~&0*$~8Gd?$EQff49<M&Fn2PrH?F;!FMw7Ao5_`+mWs zKIZOlqJ3L0H81bNJl`je8<n5s1f%*vx7@-&E$fSb@E~#Hg^x^1e5Q*dGi=^QW4SiS zj!}+RWimD=qCPEs)Zdt@H)@(Pv5`~tD2K5yHBuaXkXl(^)oV|XmtG!n)7<e)3J4af zX!6QVjBoJyW}U9g4hlFgt1~>^R1~KnG){<OZ@^WH+fgz3h5zY|N`cQ&Bhk%yF&C4v z?@#mVul_Y#Dy*(j5mS5mVAbg_8LC8EJsuo`&HbJ^r%p3fbzh+w65l3|M&+!>N{V!w z$2(>RHsRHs>;U)v&U{0$c-a_BiHXf{74Mc<$|pVpDJ0cZ#jBTD$jY43DS1~ZHJK08 zsp`CuoY!xbpMU6qe{%~49A*9VhR0;Rq~nR>&nryLL*<ibAjXdDimf!TB^t7Yqc-Zd zE%gKE0!!`!5lTf~<H{9%Nd@AmTTj|8n-Fn|O$G+mT^|xO<&VWH%1>}%bfL&!9iQR{ zI!9IS_B`^ZZ$ZjP!(@nZht{<7G3;LO8~L?iiRs;4!vy5KOlm}8eSJA}fL~mjq|!^m zwU>ku1^hI7Go12rEn{1<i{{wDBWY*J%c$Sf^+;obo;23q!P&oVE8FF%=~0mMt;M{# z1x<Y}ueul#T_aV`Ylu5RVU)hxQTHRfJ^>3jo1lrC*LdetKN;kn@01PfE;k)D3oU<+ zji!ilnNX>q|K=fG<^a%9r1*ca*{(VcQEkR-JpkGkLV3+ClpP}rzZf$8tWrBPWcZcT zUXNYLI{ZE|_C(v?FEu$L=bp0yN3~We5}Jy>vU1(g9&l>I(Cs)(Y&#oq5Qut9!Wj~m zy_L2Az`mKn5;83m!%orn-F0NIx3#eaM2<d@qmj9&+<Hp!1g?D5Bm{E7`<sWi`I^xl zi}YVbAdCJ$*XBLvtEpuD@Ce5Q@;$VtnT+M(mu{#+>gi5{hHxcz0_}j0X6|<&1;&`F zU6Wc5ZRqoy9E_8xob^nRjI(}|%bJJ;jIgY|_CY*aX1}x4glT7ox^t$mfP11h;zreq zJq~FE18&kS_~90U!wC^7G&V;^V+s}_|IA!8tr$i1iApxPh(*a$#D1;0ul@_+{;48| z(a*BAk!<jJQcp^vUxj<PTN()pII_|rY-AxMF$Xr4J^*UpR;}_8bzr!E!?k?9M2xxd zc78C7nk%>b9v&_T*32>Rmy&GINabwT(rx;9FEN)tP*Rei{xcP&j!{>s<RyI@S5C2| zbR00@CRO9iu-wPQW-HA?!^|<}c`+ilLL!RO^QI}~4L^;x0$LVs`D?-4a5%ZqD7jG^ zMYt-zQeSzlp2`266mn|?*BhDlkuqie`U9$qIfVaOCsmX=3fD5&aT(HS{Pb0@qJH(J zB5??J*5&*;h1ErhAhQeSbifz>JQm!gGp!XO655DMZ$wW7HTkO6LA1fxCYPrM3KuRd zqnLtG_HJ!cz_R86z<Gh;Lh%70i!TM%Q|3D6!3z>B>4j&swm2NKfoK-pc^?3Cl;epO z9nBrNpZv`y{iSav1_gt?_3l)!^^yCe9kj67rnaI0er5%&XJVb~X9eGtb!)i6-eDz1 zoUhU}^*Dp&OCA7!72Q8|k7)_Wn(LqbkqF?VS1&zro;A+)sMpZNP^8fQe~oFRC?=}& zcNUKb$YtlO8B%VYS*Y&Otl@vq3Mmy@<qRrcT&Zn1RoM^7lJ*4mOhu8nPL^Vu^RXw7 zWAr{BBD}(Flf2PM{MQAm1keL@1Hb|AJ@^wo<q7sGvw{UV;e}Ymem7YFRoWK-@DC}# z6aRC}%+0!7pw0t8s%u|*?7S@HO=VlVZ=b03Ia3-t5L^jRr1N+D4S*GkQQ&oTVlnor zujVOopn3gow6WDm-2Bn{QT)?b-}onsVeU7RM@!;+a+I6#TiwVbo%$xWY;3{}hh4{c zi|*+g-7u&aHc2Hw&%WE6nd7q9pPf*IDJ1@8W<5VoNz3tV0YvY7PmXrg7GLR{2b#Qh zQOYN*TBwIt?`I9WnUC_jJg*Gl7S(JzQQb-@5gRy?W5Pm`!wG>e8`0y{?RnDj#G9$3 z&ilbl6%fK87o=!+{MRWd2M6Br;<AP2uTHnSuv@DYNP%r_+{Xr$bb0jTrXf{5;!0tz zz`m*i<$5e5doztu00)!rF$qlRJ^++D;%@#$uOytd4@*Rtu2@z2)u2a9x=mr1;D|d7 z|DTq2+!bN))OiRk<z5z3S(V9xf51hd;9$X%6HQsJ+wWf}?*t7q=%aW&6DF_4$0|j& zX1Fij8m@d8l_<chyryf~x;4Pi@1BcOp#Eae!40IKxi7_pq^WKJDP4!wL3|V#T0<u* zKL&}q07=*7GFI>PT03;)$o5W&WVz_V=o!)&xh&}mGu+&Qi9W~N`xWVPotL@4C$h<8 z<tCen%ONchE1665i~rlsf^aG0i;-e?XFJziJg&>kW{cLfW`|5cihLdbBxtrhS<(uN z!$N*bh0`TdHIV^&;{1pc6X6dM`y9W%{g>x@itcXd6F)q|)TM@8X?=FNvfA36%0!uR z(=$j~+nq|dHK}WE^s%;=v>*ZY-NgQP97|$j8~Xg$14SECaUZ1H90mi&U##Tg>rBxU zmz`+W3T+m;)?r1v-$l0pR3@pNlh>@HfZcm1y2^BYjh482#}3u`iEm5)hV_ck0o?8q zb!Y2`_(=Y>%^bGta|-yBSzqICp*e%J$AJ_mE(4@&Oug878~uCGaAPL=j43WgHa24o zAdza70jBR*`?Vs2s;f0dsR<)|qppoFIfsHJ&WHLvsAb~BE`*5{jqimK5EvgW3T7f< znHwUyDBr0b?~}lPPUtt{`)`;30Wb?0fS}mHQNTAra;Sc9-&wxT2%O~A^5uQ?ZPqGr zm7kwvXUP*b@<#)W4w%+d*=NffUtE{CXMv<S^ky@n&u;X>Zom*nyA701FF+#AL*n#x zOPS~C`OP@i4{#B?bT4yYf^PYzP<l|dY?MP#^;kX0%f6z_@Y2l`zp6kzBw0|ey;|wo z(9->D(T_!*%DOW@r_g%010g#ZM;FrNIgKqXGuvdpYsn`$V3fY9h~>W0za~$kmd@Im zp_2{5m7d)X0AjBK&(bB>XX-C^lY_w&-mg+L6((PC`B5GF8GddubL!a=**RtPDy@3} zFlrTAwP#j67gS7~?CY#a>izD`bg_{qegEqMMCzZO^-LuGgGalIeB-y^06zFwo4-N( zPhVI6%f>2O^<N&gE9&IOfoS0=I+s4;Urkq$xxMW_F*RH{wFtbt#3^}~ydh~))X2C4 z)kZA|tr`_gIvd*92f(V;KG$jx7gADlE?w+6llzz<2-3nYJJA9Z<`Fx#FD$B_^B3~> zmKhb>q!YP4({ulp0aMfBLzG>vhqq2PlKOi^Nr3I(O5K`k^0kw#Con5QyT+N+UQ6;c zuQ7`5DDTmE*Xa=Kh<sP2yMxKgtNco8tXx#c#;%mzrvq-DkL8QZyvKiCnAjQp&Z}x# z57tG)T<f2*AgQC+%w#D|2w|xWlGBWzQW3k$?YSZ{bf_CXW>k=c&@*GlH`P(6eUI}U zD+8%~MHW`&uejI$WeKRBjXNEcbtFTUx2NfG<#xaGx@#H`$vE<cWk#6AR|E^V>%}}< z_T(gInsYHq^R=O7f$WC9j@ZZ5S#aakp0>-T=SmKJ-ZTbZo1{<hKL3(!LCUA$mkDqb zcSy6eJsC^CjVq6zdC*CY^?cxT=`Ue?03I$=8inIaxw5};z@sH?>`dAM-?QSf^`s?j z!5!H}r%Q{u4o3)v1CVx7O5F}VU+GQRo>ukC_Zgh_?YB1f78dD)0rb-cKo?gK*IFte zS^_COmr#_jb7+_xoHTvbX`ON?UBh*3*$CTESL??QAdV<TnJL##dO6E1s!#D4*-)h? z$85+S;+~b?CJLTYG>wYqKNUQ*C(_vt`+MFCP|Z`;b@<oWxm`emg)B0Xz6sPLeGJsq zTOL=}CnYY|o^sEk_C`6m%KH!3&)A#`pk<eomZvw89MGl#H07~V?gKz=_Joq`eTwL^ z{Dd+}U!3U0+`{*piXpnPe>tq`1MD|*s`)7CkBia>;`?{fKMwXCXOc2YP|8~A=o`O{ z(^N00Kn^E~tJZ;)bdVA1-hVwRTODybU|r||@ert4BDqfs(YrBtOZ+}l<J~#Q<GWJ# z1Ps>`$<B|tkTw7+XIGFim)`aS5KB94=XzR92Wgb4hy1ow5A?dXRLBX$7$^Ct|JORf z=mpXm=72cqf|`~P`D`kDNgTD2MlNBbTEubU?{KB2R{L5a1@=zqoxZ4g-f05&Lt?8O z1Euv0dkS=OpjWzY3lP2jut?x5GskrMg&|n+O1}s8*U+_d*~8Rbr^?1T%c(Da`b9pF z4*Ibin0u6NjyB3GGWtaPcBC`o7Cmj7X?JheGyz68LR?Y4YhyGAdFIV*UqK}UXS7vG zLv~F0c^w82uonrPf?qc8+ckG9ci<os2i;D0)8mvRI!gDsD@j1pojh?+CiIv&Qf%76 zBu;;JcM6)?3nn^RclvH&^nQUbmYj-=Y3-Q+?)0Y?Fd=G49jR|po58*I`Dk-p@lF!t zZgwkgPL@1H`PUB&w<s>+Z=Yn7&@3$RvyUaK4aU_fy(_a^^OX#in5Z-QF@N`NR*Kmx zD<r;R>8F@FO39bRO6gAg5~4cgEvaES!~3O*r75gg%8q64NL`!#pK1+QT?Ow_o0_)l z_3O})@J154T|qxP{nWlJ#@3Y8zPKNk?u}19@uZq?69)x6bG|h~-uBWkM^a-JgUZbg zvMlQF%TL0+h)YUzR;r9%l+3UAS@r(lY}p>aAX$B4$Gm%%Iv938`6loz>tOG{=nNwt z=#wroCKSD;b3OjVH%8dqn&f-*Rh2B~rqnvjeLr}g>qx$y0G5{I;djZD_H2-(n$hn! zt-B3TD2YsN*=@|xwSnR{QGy};0d`xl#rL1<fqpQGEf*YvvnTH3U{l{57M$2ltXHAj zs-o%n#1@S@`}X0oJZ@&5P~Q1l*lf9J`iIZooPBl+?<e*Qu`uMw%dJ;(TS@{V&Dz97 zB*q1_VKhRvnJtSHEp4Tk8q+Sty2p3B7`M%y%CeDyzCZH=wXs9NYUUdZQygQjzLBu| z2Kf|?O76^N=0zpWiwWVm4SWPUMx7$L;VVnkx8<tBlMArc)4+f%SQ35WC!}=(RdOR% z4G2-@(p}9UawV~hct^kGQc?r5D)RO<GF9$wdlIam-DvzV!B#c<MEvl#Bv_84qhk`t zfbt2vz3$QO6F6mVWAQOy9603KJc(r{t7ne6nP_Snrh1dY^QCKD_(G;4Fss>XDWOD? z3e6E@I^E8)l96;EO(!xe;t0Hy5X{>-XRdV1208*4ELx1D%bQr!lKYph=%EYkLHEDv znU6^5cTL5$L<s1`T~}mAUW|?_1F704QDz8bZRAy2>1w9XGImZZe{7X<;fHgpOAy@h z<E<fjL?W*YIo1tbp=qe8p2(kEhkpJJ74sKO@4SvBn$DS%HYqoupNen$w+1G-!_8lE zxaq534|EV_6jiPXe!D)SUpuN##e$VOjy$gfGa2uK=h1Yt=LApB6D5tOCQqeBKF^Oo z*~DzR)+A9oxsyeJdclNu`cP9B=ttke8h>4wC&3S!g9NOEB$#j}l0>}~N%hON*=@=# z{*IG;oOr&<sY<U%vDlv{vAaUAn$<3Jb+*0#0TAwEwQQxhk$cj-z+Pvtd4H&)wUJ=d zFR>MUDP8`0?a#hHq@=?J%&33}gd4!oBk5PBvk;<xD~l|~;W!}aQ#TmE_dt!`BLF)~ zUGKR0XPMK2OCoLH?X8nA7V8*i$(iu!k60NIKWI<FzBhS^8I(yQ=Cn_G@q~G_71nF{ zX7WzhWg)7qtm5g4YP`x3iZIoJ6XfF=s0o_~K1X$}(N-4LwN1aA{v;c~0e8S%bH7XU zXM=(2LWmCteAn*P(6izsCp^bL?^nmq`fn0Irq|i;?tjTJIW43ZFZ!jg(3jEMIQf78 zKIevR7>~>bfScTZs2nh%2U21eXEyW`+>ptxsxVy08xgr^G+NGJl^I#w4Usti{GpT7 zgXH<#-`O823tQU9F{jq<X|iyXQ2~m2{jv<6%0SlCS~Dgh$}<SMvAu5x7k%b*{$g&M zdBI3IjFMfa0&S=$&zGE5O#@FyL(&cYGr3v_f3T;}Q3NPUJ$1{r(e4(fWqf_`H%whs zj^Mvye!wz#gU4?y$l2O;S-EQ=AZzc=1frbpAn+b`Re73!1z{0Y@{di1QeAhL+7rpX zalvIJ&Usu(S4-Z{+KBSEf?6;lKFUi6^BcZwTztbG1G9QRLpW)o0z*yzdOI?OwKQw4 z8?~2Xb8%Hp@M3`?CvD$zZXqn|^_%5{h`nCXVZmYl`z1T5&-oqa*EyoZQsqqc!H&Zl zDBO_6JJC=WM?ZM!;xUgfZn)IrTShsi1-#I(y^cLPb~N}Vg0VLn$`f^WrnQ<p`I{?Y zI-cF-tG2*c=3@KnL6{gi&6uBEDl6GWY)lA4<V0&rJui*w*kN!r5}<lsH0J((St(!~ z>xz)h%1X`FLB0@kGa*2S^)Kb}xOZXycBzG$?T3Oi+^~H|vl>k5vwHfpce=wc{IsdM ztdKA-`dnr0%ujI?t5UFYor5ueuh2cSM!Z5z`Xw@*9nWHUj4Yp4_CDY`VuPety#0mK z69OaqIxfSPcxNE-j-3LMO-cOUZXULt;MYHpg6oP8fSyFBBl0KEDLAX?0@h!?tLzz& zC(7tK^=T1B$re*dKENjD66R?cuFA!da<$~}!ic>nu%qh%5E}BuSa^(LG3_h-sIKe@ zL4Z{EHT%w<=>q_#9hZpj5d8wl)_$ZAUH2z7*?IR^vIB~^4+u>2m@b=qH4$wntgrOb z;O*}O94vrQ&Yk__a$R|_t}v?^Gq1Ui;Vv)}?Y&1i>UYo^z#Qo%UO309;3|;OTTP!A zlw@GkaY{MnwCfz`7*tl}*b+e~7?#4nbV<2G*OO8)uW!QYfS>-EtI=9qcEb$F(mwra znzv};m&#$@+Yb$mKXw$y@Xct%D*CxEBn!}42)T@{kCKafdEW!Yk3QWOO6IWm>B`bL zs^sZaW>u35Yy$GnnRbe~rr=O@KV6P#Zue3}opFp#ia(1mCwv(GSH<0eo13g}!CVbF z;?$V~x<O-ak5h{piuiYI)UPr^IDLYs%bd<o!8=nf7a3CmCjDz82?4%WSVcCdgFXR2 z_IF8tM|}3lVcSBm!VgzWCD%rM5)Jh>tE3EC)VXdcu4W0zFQFD)(a$$8M&50e=_Ey) z-F^a&rOS{_Z6fWWE5G_UE*>9t!etkk)pj2MHX(7Ie%amC_P$efM}(g%Sv}M_ld5;- zJ!I*QFPzFD^mpW~5xTi2>emhMZShYnPcWp%q_u=k9{`6&9cXeMCU(Bf2Y@5Yl|9}4 zR49xA>mb~Tjn~A2YEGc~3MldEJ7mX7L-kh7&!D!(LP<u_98=byB75v#s^*t$4VQiL zf3~saz>F%86FIXT%ikkm)ymDpp?<c6<D_*Fu9wWVCzjo7AkdG1AooR7m}Y^kj83Us zW18&2FW(!`Y_%}>-)c{@N9{iir?Pz7g#>F)lqhqh|7B5uV;+6WDWu|9=o%(3Ksh#k zE|g;}9aY3}9Q>o;z>w}f!8gl$+Sg}nQYD*ZH<+Zld<F@Q4l*c3IU+0^d@D=L?Y0Sq z1#Tt0Al?XBSevLx3Kx;Tk@9qQ<o5>Wtt&$`^Uu43JZ*OoUETSMfY+1}rJrAXPY9Qw zGadf<+TpeRe<@i>Au9(f;<ZyUDsw#&F&E9oIp5fLzd(3)Y>yR(0&U>cYsfo0Bam`x z$9h9dsH(S;1%H#=Prh+wSZH}gdq%O|AA4w-wnBB?!|J?P^91({ag`Y-e<v>En5jqH z1=A<@db+RjWlsOF6k`B-2hewM$CWkZMjZ!y(8iT#?EJ!z;y&v58BAlI*rvqwgrG3v zvlW|?itHemZJe{(4!@gQu;2XbItyQvr*QdoPU@LkYX}KyrY_sX&2Nk{)zyuaurpK| zSNyV^$z5ahjjNVr?k<+O21<nU-S-B(is>AQwH$KT(A~a%_SIL{4e(^BkfGKOVa|c1 z;#%t*m#!}f`e-2L+8wMCO9(sXqKxHJ58=)t<y&!4lJ9q`qwTEs)g6u|-t^fJfS;tc zpEJ**OLe)aib0|K?24#m9LdTDe<|Ygr?tmNy=J%(nuZXX`|n<icHJFV=Xe)G2SfKt z*QU4k0)}buq_>3b;XOGxfQ|bC^NyaeMYC>83{)C!#GzMU2f11*Pus=J*Zy)>K~iiL zy!#DIC4Yd|<~Z)8S%-wh4CcUT0wQ27f$XA$D{2()g(f|&n9Mn0j;N{mv}DV98H*kZ zgBPO%U?6)7rZ$5(2DL>_m!Cpz{se+e!@D&_=P<Nx>bJ(utL!$Sdx{V;q0P3r&ow?> z;KQI5WaoSrhtk(adNfV^YUZVDA@+Q6;DsLoe%5N>dt$2I!~T$2u?Il<hZ|ya$(|+4 z0;p|(HFY{Q6>MrAU{pX;TFw%smARz!A<iUe2CMAI>h0ZAl<4J0*Y#lFd_4Ffok|yU z!BSTx+a5^Vy;_XhDf_j%N0iJj+bCMXoFtpeAD5b#<mRvBue`iMyZoKKxScY+!vcHd z@@MIBXUy@dG#?N=Ee;F*>WMxEa4jyE5>)o;c!=7L>cBrbsI$pWr0jZcboZhHK2Gbb zjd`y<2?2WQhGcqfNaiJysbIZLS3_C9(JA}Kv7bKkvd(;<f#lFZqUNbtOVi5ww(TnG zBttE;t|Q&?R|-uB)qZnr993s0o~<6k+3^8)PeJD-n(wtu=K!OYJIVW8d1J_(sV}&- z*<9lkbhFzHxh(*BYU=7N>BJ{*=8+?qnl@tZ+FtgS#4t!tN87x<0Pf7&%r&5VFMTJy z=*9WGhtg+xe<c>4QuBA>VV^S#0@)FekF_-sTJ=c_vouGQ8}zyy-#JUq0lF*lm*wK{ z2S8qO4bYl$h%-qE8Lqqo>f<9Gt8!9WcbJ5!K<l2Fo2$J2&B2-%=x#;h*Ep}S!8+}= z*K^71W|Q!YngQ$DXt{%4hI9<6t`*+tIAtR5{917D{$&eSC$X{=)3UVFNGr>&j3Un_ z;y}Xg5}0W(=cY2eGl6$>@-Fp@eLv#3-qittt2<MadQUvTTlGHr_*>cHTr#NAA9_f# zMv!Qxi)gK=Y(6oF@=Ojd7+wjHb27SYM_#mEni~DpBEnm5n_&`ZgF-va%!HoD^fMBW z%3_>YS)l)dapx4GR`mlzI9K0C48Bz+lH?_pT{cI5stHVQkf}s&$TLTOPB}5iR;f*# z*-2koHz8%R))mJ|!ezKIqJ`grC>%*0fD9nLK!Sc}qKk{8o=*-FmP)5Dy3jlY+w7Cg ztF(Tvw5YU7G?*&gi&Z~u8@Fam%nh?(#C#lJY_A_fb#wt=MIG<xBSy>Uth5{`M41BM zTlO{j5Sk&E=MgYr_xcKTZa-1j+)YIQPTCT`xg)i!A5>5wO)+WtpH!#pf^%zN)^4kO zxu4gPV!?qZ6%Wt&HIGYN?zI>LGcXN?vh8!lMdhtXCNgV_Bz|@-`M310TmY70srOnh z?UmBz1~ZT0xU&}@mGMFP!X~n+tisWVw8jO~Z<b1u(lh0!fvDZ8^lnXCkDcG*rGI_1 zDsQVO`#-yb%hwqhi~r1iqs5uk5cg)PtrL7~Qx}rT;h*7axdFEzB;|!x#09Kn;=+n_ z)j}x1yjCi`{KfUBh6HD#2LR^62r919-w6&*FqJ}5`lKu!tsrTtc;*wzx(U~kg7GR@ zbSl}ZdAYp&_`=&coX}6a;s*7~_N-4Fpspze=*$k+l07Rq6v=u+7!s4GL6k}H2DD;q z9#jLV!bOs}TZ#K^bee)fFJx;i`Ldl~3{$Jfs4Aa-Trv{Vu}Km4WHlnoomlEzWJ^f; zN@l?6XxgLZGpW2pQGXT^9%9d<*ZoOSi$ZCkFDswqNZtGXJmg{`B>rIT!14;dO5p(H ztTt=oJ(X;vu@SP%Vb+-j3J<SuG*xX^Qs}6B{4WxhU>Xg}(n+~9HLb(y!!0gnBZhDS z-yB$8AnALo|F#oNUoeCsd*0gJ!osYG1}ap&J<cSlvXodiFIcDKy#H9ZXczSX`rxL? zjvA*?x+*)Rv=4v-BXZ(=AA~O-RM+vSp`^*92_}D{k82Ax%W(E+l5F5(3$9%<*yU?& z5a7C-|GV>z>zjIKBd7bm=a{g^%B@$n>d93w2UZ2Nos7#4kN=GSyxj2Y7-une)0#z$ zv7@g^!H@NHon10XYuqp=AoM-aJgh9=PK#*b6s=bmLdsxUsqB4bCn+y=mbLx7oq?#6 zxI3$jaok{tIjw2)BA+<XMQKg)yt8cfV?RrhxbRrF_bGWw@cyPK_C{I%M%EJ-*qaS3 z+=WJPA~UVfV;sNoqzQ?$DeKr|OKM`m<?Iw21NWRKw8`r<QlOly1<><`L>B=Afpg4M z9dMgF%~Y*g@bH8X(X7v{rlD%>?LS-yi~Xf3_R!7FQ4><VhfcHX!<?yYHsk4c6K-ex zA;;+O>ZVT~%Jd+aw2gMMc(v4?8zIx-Bj*C)O{*^%n7toYMDxU@Y^&4C7CY#Ek+gQ$ zgBI!KC!`p%sJopliL{K`;|FiO^WFz|(JX#bc>owI1AO)ajlQCL9}9rENixDFmP>t; zdpG!uYCa(uLiy`&RQJ_$R}pjw9gDfYki<v%5`VD2Cp^CK1@-T8Pn>B2ZjYnUN%>8( z)bU9IZ~$<|s;<Hc=T1T>m(I8ZSye<UGQpf-(&r~iEPGBG0RCwCSgFFkMI1va{JMK( z_&cUgs(5~a4o7y(B?+=KHLrZI*S-}XmaSf)vU?UF33m!1RR_M1QpdST|I{VbJ}o%_ z0}fUwF2HCdq<XbyEZUM8rB#6P;UhQxhl*TLk3UeKBb9uAG)~p|0igZHo~!KQZIdm) zTN>w!*}sepec0$SuwJh_9qc6U+x=K@;{K<pz^v_5TnoK!?M4~8RtGxTIW25~!lZ<~ z%T^j*KrM!GSCT;(%1vUF$RDw-ivH^(K4%8)!E>S{EiQhFXiBC|cguL>0SvN1Lctqr z{pv_m)1xrrbVyX`Q!w>6S-R67O0jW&x`~N=ra+u6;+*Q4u@_aVaK3I6Agf>eV1|Hw zgN^k0P#=1oQl@fsJXq1=hB(@P-Pv(Wb!uw3ttB|N<yTV05qdBo^&C<sMZR{+jEQoY zQ~6^KBVA^#kZ~xK^<P{9?@H?E2L0~WPQ0)ksjoBiLCRx05%P1qOMF79PYA#*Qdjg~ zCYO1!5F|BDx35uarSZMKVQke^58b~Xa&ys_>e9bE-;3%(e&WM$cmP<}ycTJ4>u6Ev zj|};rqv5$hsFB{Pg}SFVmzFyhb&3hG$@~TDbaPd?ch$ZT_0^Pc?{fD^iqdhgbm$>x zrSDsOj;-%a(T1={DfZufQ^ppes?f6%cwur4OJqpv&Y#QuKm!N{ia;L~SrHtq#iY-_ zwzSf`^<3|6{?cmC%FIu+E5Itu%WJBx(T9B{-F90Q+#-G)@<U!vw}dy|qk!1iBoVO+ zS4u@3&jl$QHP^+*Lbj|j9so5FD5H7rldPlN!YYx)nOu4Tjg)s$BL1{G6gIUC0O=9` zIZ(TpeLJxO50BPmLuo6`3)d7u^rFuVvD3~f^_|+>oij^_y=BcpYFcf?YtlPOw0I?p zMt`iv%O6Ltk=E}}3hQO{PCnVj<9w<q`x?^NWuIk{PsC{q_wiWmgipbb^f&)t;Y&Ib z<`i`GJwDskA{Y0U0Ma;3t?Bi4P}<8B+@#OSk>AT%Ln&DrpCjYWwh(;XMC5u-rBc!b z3PC&Uhv}Uuo^y^!@ZW|sQD<7t5-&f<Arhgbo2{4K3uJjrZTTF_b6-uJ<!yRSgI&@t zM!}_)4(YMZPJy1Tm_dKVwm;KKYhvs>Nvc9;>N#}0K=_VVr02TndAdOQYO`cN_C62Z z5csoZo!z-N5!Wuizgj=D+2W0im!);Od|yoDs+|DQfD(arEO=9q-Mu%~0B_1x`8!b^ zE?@!fMU@kpG=xH##-UZx4}46K`T&r()_18J8j)Jx9$lXYT_2HIZF3&clAW+D-HG3- zF1{b2f))!m924~xxLWmU$tDZ0n9ifD`qFO_(TO}Ii>@E+*`|3YgU$*0N0sDn<_55E zi!3I+<CmXY^9kLSaUbgyCX0}a-+-)5n$-`}i*LY62SmZ}4gynq%NJ%WKSz&B)Jx5d z<taN-d?bnE7DKJnIuOmG4}h=l4{GJEOur-jd4z(5m$YjuxGB!L8)dGmJmDuWE-kVz zlR@eXB6GSy@osXbug(ccmf25lj4Y4@w*fTg6NRcmbRWMf2Y8{<s*<(vt#K2G?`-h9 zN)WXM&J#SX>9XW?JnEV=UIRR=;jXnyro)3{<VS=R6=I{bn#z;yuE??Q6Dfi!RcjBz zZw;m^YlKhr=JqAyE>u~wwHlL%sI{Bx8$kM0m;Zk71q(DfwZzWfZyFG`=LB=rAaRl+ zk@4N4K9{2IV{9$Slz+nsbvK@$3f6%-BMfLgWM8OBt&|L@^#VVrl+(%l41pi?v`+9Y zYBcMm#A&6n-wrMA%W|q8$?T|4vsX9A{%V4HG9)LDC)E?rGW${9a}^cw43oP{cfjY4 z*h&s`6-!W&PqKql4Zt*U?-^{EOCgTX#<+dTbXqFojL#Ot@^?<#T9Kwcu^W2+YbRu; zFn8?1xqzVSMIizA?cbt0|2p@&-A$o+w5TwIh_&y}rJ;2Qq4JsPmu|tH_Jbvi<q*#G z?_UnRO1wRHe{+SS{E^w+tE82BhgYgj!4pTXoGVD&1ZP_o!o%Y@@-hF1+Ur!cKkrV( z7h;MsZZKv;WvuTZK>^QGy1N@r@Ajpxr@eOah0pW@k{9U#Z|?o~4!IOIWD`2zyeLq` zD%bV5>s}W2+x#^n7Dl)>amX07NSo2S@_HpZNq+6m1|zBxPgrh{CL!Fdx3P1?y?T{_ zAt!00$TaHCO?BYv;63q*^jnIrhl>e_L4T>4p}=c;hV)(jsqGPWcPngjM9J;n%KNqk zxS5maAPu?>V{u^xUiiIz>`h|R#`BPi(-6AxhH3mi8|(~g-Wv=?l*Gl9ZenP%Yr_O; znBOKbzZ_#lKy-Q~Q+Kqv-JhMNa<>)8)%|FI_n!F|(G9ofh_**PM1gDRDZP)f;}dU$ zC1W8qMm8&@6#jS=ikCm4PcX-h@c@)`%hmO$s<ec*A3&e)FlggS-oCxldjLdQBVgLo z&O4_U*)z99Q7gZc89MH8JVH3{woOP3*)noc0#XkwdvA^J9%;wdp>@$qgSr*l?4LiO zmL7DT!-*)jjxY$7$?IPx&X#$V22^TsHz?zOL$bQ%ry#wBOg0OrK9MZOzrEZZL;v#L zylMY;Q7+*dFVv>0oaz$>LJXXOXIp=xPq)Q4)69=O(~0_BON)1riw9XbRP83USxQ?Q zuBlk5U3+S4fgXQYo+A}FI|wmuX8a63#<IwNm7^f}s9QdTH7>&(<bk~Uduf1x#S8NY zEHPwTi4KR}TL(e*tPD`1XnY;t5IB7zOK*V0f|JL)7xAW3(Z@g+f>!0UFE)3D373?J zA$O*yT`sc3=OZw22ByX<DU!*g0-3$Z3nw0r5#ICLMu;;wnVXjeDDwa?op36=rRVPE z%_+?6n^<Dji9^|SuW-&tvHS7XW$%62I@toJbsi3lZ{EyJ%3_7sj}cp;x>ca4#6&*L zB<<5xvp!2&S~mk5os{320!qqE7ZXR+dc?}(x6n&}luMB4PcW$?ne&Xd&=Vo|VXAwB z;CMF}g0Xy_OSF51WwO<%u&ZphIkBp&<h>x}NKQHH7wH(;A_pUS7tO<6wZXo};^=`a z;qH}b+TAaDGq0850I;02suW3Okn;wJ&JuOfBe?(L>u=})Hf?_t|AcafM_|^GjMSal z;}}CsC4|2=O?qA9+3NM25kI{m7ze&;EpFcHPP53+G@2kr8?>x}pX|#>&;6P_hu0;y z2d2}i`<;curf-OMkQK|+%56xhN~dCnKli_Gwl0;K<&TF0IT%uptgM5?5ja1(JBVQ= zX3P?BP^Pz+5}gBy-XX4>B)&KMU<H(dW!MT4{nhIPd)Lh&z{c!3DBWjk%X4P_>QzH& z#Tc1iT=(DR_c!T9ZVi`z64IrOFCUAU=T*|9DYFG-rh8O+mX>3Tl@(mgsy1Q<lxHD5 zV<6G?mkwU{7=?eP#0?vnxu-z?kvy0~dmwQV(LEY+$IDJd?^YXYA7fFFY<URh8INZ# zsr>_>S^hG67XDmQGtjpAr-rf#!)bN^%csDY%8w4V$)Ds0?8GXTd2fx7kyrCUJVolI zLlafB?sS1Ee$0v9Xbco?8LC;uJA_V^ttd5U!XY`g=FL&dZN$Zm5!7VAodOX&Qxa8q z;<e0qlo}*qI#|ZVr?Kdnr{y_YHui_ZSE{AEqt@E;un`$m&$F4Ukr@9aCXng`g`eGX zCJ$#cM(M#<(uy4<68I~!lAzLmz=vwxoG~P;nbA@?99`o5lt)N-5g-W#0eSP$IXw%a zLxSV$R5r7%T3cJwdCImWI&!RWnGZ|vFyn^jtn+8uU-{jxJ$jQ<)>X`69}|AozNCc# zZ)M8sLn<Zw+CFW<(oX^;jyExHzEFPHS5hGU>H`V8NHj8^m9<{>LnTS3PhW6EMy6PW zRAz1^KjZe@8l&BAKbWj6te*VBQ|vt1<w~LX56vb=vj6%ypNmimXMYi+0_4ir23R+_ zbS8JVAG+;57IpIq+7#I_Um|-tySTNp96<M&x2Fh_oW2um{?zfMhWQjpdfRbAygJx6 zCr#}CGiEU&9Ip%8O}R)n^<86e5bP?tbkA}K5wbzQS8KK_alUmpA9Lht<MK%wQyhKr zA<#?8YX~{lEo76bJ@IRPV>^8$fLS*WJ+syG1V^QRSDtyavPj6Tg7(}OBt>70@*QkW zTDe&tMIRQe#e0oV;Cdwzs>$r8%jMq(%xS@m>Hpp^{j59)m*i^MlbMowogf$Xwigd( z@f&cHYHrtQ73*5Q_^50a{{4Q^%Iv3;YN5E`JBc#se<3>O!UO1OFwG0ZZ$^nHCdVJ& z4!Gvg>B^ji)D&C@4^DM(i5M<3kQ`ya=^p@zM!rUGoJ1{Yl|Vy@UOV;+@9l_KB2wI8 z3|^2iX@x#8S%_^%T(W~{bj%6l$R?G*sr3Dn*%B<zy(P`nEtqQtNE_sZ6av1UuIIS8 zO_X;j;qxr9Vis5iX?^nsO>Nzkvs|9n$D1QuBG<j3x6;EN@?uyizjqwWul6}y)qgHF zU06LvTrp289GXSry}n$3YhEhUxJsKl=>rycpoOnwQp>t39elDP%TF4bV{H@L3_@A1 z=eEFyKgv|uze2b(Qev!gF|KH2`;AsZYC~dVmf`embjric8ePV)keBb9fyx07fKJDf z6GfGn+sd9MB>fsw<c34G?jKvk<AW)V&2EJ|AC<1fF=DO|+?7T~(e;x!8PWrieAJ}y z%;C{xM44%d+G{|#JZ+z}({A5qMeZKXuoNu-{<Ya<Br0}o6{XJexdBO(aCWUkkW6qL zmr#;8EFker;<94H_Hcx87B*=~jf_g(;F0F@il0A*e*}L&mHE}+1h;szw0ouF*iJL8 zneEvPdL0YR-hUMGK%7y5w;GEh{!ijJIG&`Hbv*TG?dJOup{ecuEXA&U;(gM)ETI$; z;sh)%;;&5SH^ce=qqgf+k!(cA8+COM31=U5+1e-Yd){gE`lg++AC*BQb{CXlqU|$> zNByP6_TG~uvZbinBoE-sA4}~(gu>r84)mI!M>$kwTaQi&ZGYPPy5L5Q1|S~*`@b<J zmb`Y_Ormx-+-3O!Mn8YvOOi$v<Sw1FWC0e{*9u-hF&2xAlTg>N0&Gjcr3b)GIfmV} zoU{bk(YvkdUy4W1aXxXgv`QI_meJSq+F)xMPaDf-2lo_R59{_5!`?L5bp<_VS{lc- zd-Ai%_&U&iqK!*!Ra>JvorNc7XR6+9d><=;pEYm><*E!3!dU78QfmIi7;`;4Fn$1# zN(JTNB4mmxt4Dh4*grw(i@#tqXWkQih5-%S_`yYfqDML#)^1*4qMjWBbfz1|$ppr| z);b4PH(P7^vA<pJaO(SQRfY>&c2=|(cbbMx8I{^Ef^fBgS;zyxk7wEi@cH+KM!h;y zsO@jlh3kaLegWg{P=1#><DG<lrKz~}dP#nqZtTNAqY_7VG(0@PeW5Yr5Y{-2`KEvD zRpDo6`o65<n87?J^S2~7O;4o)>5l7MV@0SZImhVVF3+`jHb=#OnMgrGuu9ivxf~3U z=OCHQ3AgGa(tT}5f_8BXb8CqFO38riNysCEn}v`~)oUndWvN!S4*XJDpic2Sut<+Z z($V)B+vqXeOEuj1l(<Qbbb3yQL~G54onBpz?K>tWmE+uOi*%E~uV9!}HrCT2@^cr( zEOjV5WJI4Vp0FzvrEbwQ$;M6Cu<yG#GV0E%yyYTYYxNQ3i^f-xQeXR57ecnj@)n7` z|AMYQnaA-lZ>@jVKYx?tnH+~=XKR#3u^-GP+z@NYg4HC#t|AkU+KZeRM+%Y4X8i&+ zf4jb;UzXV66@lb;xz@D^P>Uvr&*NZ~_LO;Vd(~y~q)>r8qF}vSQQ)K{K`XK?B1rM` z1l8&ev=QHOQnl-ECW$^)>8O(X80EwfWr9EBSOXgSj^~lR@F`0)6p_*$-Cz!OXWKW& zz&d=cHtGY44F1F8Jhj4aHCw{bgWju@y>;O#%fSj*5r%AOFA_JC!<9m71sMRix=x8u zb{{V`XZ)<$dOP?s?}qj?yIG(LwP#Dni+!!4pjaf|y1`YCh4o0P7u^@uc(eES6ZhK} z);C_2vI(n{%&_LB+M47a3Uxv6B>a!X&Pbpo(Aie49*M2tEBD>zcdqVb=5Ih`9`e!@ zfsgxZ_P^>={!1v_JdC|?25zt4NYlTIJrNdP9Kw9j7#>IxvSqo40IgX-!e@k?zr6an zPJLaoDq%+c&vT|@;qLcp7bK!#mFQ4oYfT+Oy2N*4yZ-_g^{6owT-~!wH{Q9K^k~va zj8<h&PeSn;s5>9K30nO~r#7-;L`&8mh2KMaM5zU&PPxD0L_WPXkN6u3z?!4HiD+@b zlbYj#Ln6`S2=9yK?b!VJy&u#bbyID1oQW*e1FT`G1EUg#9_D?qxm3}Y@y^Ve>IKcm zVk{<FRyiDFk7CnhKWlT8Xq6MPyJ*QNk7C-ju%lY!X|tK(x8oEl%MEuinW*;oC19&| zB~(mIteos@>?@iH1zP_B60#ygm8iRtpk(DTEccqFyPmAyATXafL?eFLq*<BM-Egr( zc60>2M(F=YzsCFFyQL(zr*nKLG0_s2&$@iA(=u5=wB)ITJWzS+>pLdA%}n0<j6$aN zBNMJ!={I*Yig~n+Yj{1mp}!&ls{oT$>v^2RyoUKTOueP?&kXl*C7V6(S|)3h!F~nF zz9iWaxjF99b5~&yxnn?XcV$~mXU&o(%zo*gq*Cxmz+8N*<O2W?604&f^0R;4*!Y|v z&**W{!asFgAYVJ~K(gqDBl$G8!yLmps*n2S9F$Gy!7J|LJ|%hvUhe`0H>_}417u_Q zQb*tZ-Yjr|f4`#Kx2m5RTWBXic`OB;uBux*KjSkLBX&pe_~zl<=ba~74?a4A`1+Ld z=KXSOoX)Y0-j&Ke1yg(d_A06HXVlcK++H5z6yQfUntbV%U+8Jx-X9v`c|{ChQ<dE> zQPVuwt(2elxipoX_kt<jcXV-kHj2C|k$l~tm3Z;PjPqu_xRk5THv29EP<YFdY07%C zZZnbE<?xwwb*L=oM!O`cdE;;UQ`bKhZBakH+0z(@m7l!}C4Y>c&44=S3$KOg!(qOY z-2liD&h5K_jbO)v?q<pjMR>UnzlIP=L_p_S4rmQGRPsW2ePU09S{<FVTf*$i7=nKW ziG0ju2l=jx9XZ#f0&1WM{;|QQg--tzHrRe|&0NfeRhc_nNmiaX7xAkzd4?0Y4er>O zN(Xk<s{UFL$?2@DfN?aztro}WE<usNXX8Qc>*e><mNn}AE_G+DJd-MgN%Chb#QKi~ zOa`N&Eb63$fUVrR_{P@V@`K#J?fEG6;QL&pUU!8Vf#8T^_gs($XhzX%$~WTuUx(Ml zpx<@z*pufiW@5{mDlBB>s#h^sSi&9!ku~*fHrkK7LPI%z#R2}GHm(h=1rHNptr#P$ zk(Gws>R%~9D|4fN-lru!iDbgA^j2!BPlXnrQ158E88e?H7`!9NtvZi#p!qU*{IM=c z{s8T6;!EeUy`?~QEIR<vpFS5T_l{jz$3uuhR}{vW!KW1mAd<9jcW(Yz`D>+dVq9## zAlnKOZYQ!=0vV5^R%>87(*R0!tln5W*t1xk{f0`m@tcDVF8i;cG5;J385w50(K)?e zUk27y;PQE5@oGmAE_rob6%K3?HJy)q8FMtWSz!G7$Si1<bBH;=rqg^9@H@B6xG2Q= z$SZlK3v*lY)ERJ5c(&NVi`T2P6o{tDC&H_0#1(_NnnH<xrY3xo1S2XmdX?YX6~7)} z7r*DgDo#Qv75)4Bt7;wg2LcN6UROdIB?wz+fCGm3$!=dF3Qj3cWGSTHdog403$Qq6 zeZG|nx^f}e%es!FkF$T@P@~tAW?-4al*tzTO_0+LV%nHM$#492!+YWwm(ur0&NrW+ zhO=M%H}gl8O*^b@p{+K;F8PDW3h{-)yiiYFK@!6cE!x2vo>^b>-t#K+0u64m7TU6h zlb7-YO&WZn^=E%YDi2VPuIf#O<>E%3ht!(%h*0qieDO5Rdo>Z+_T3ZDfU)rmGjZgQ zSiCCxZvft`uoFFH@(U9NuHli$MBEkYLke<~KA4P`-fWuI%ZVMN8GohiAAgns!vOsh z8-oZ%`TZRUE*{yIXW;{Ccx5T~C?|e3nh5FqQDnDICsIH_B0xRlIk+|rq(h|FZt#&A z+ne%c$~=~P$?<q9j>c>Icc9QFDU1;TEu}xR6&D=ciUK*8V=@<k>`2++2f#)7!D`g% zAFXb1m?=?SEizT#*|%qogVBpfLW#5|q~#P|$kOtx{G#H7IfxMDy-~&n?xHeUA#8#T zVb{bSF@uhoGX?i)?qA1TYe~c4caiiRWN7C5fZZTF#FZ6-xT1lsKJTA}Z!b@ae{#RH zJR|?En^Vq*32>%bNGslr9@c~m`CSlltV<Fu8!7y+k|*BfhgSAgL#lPv?ik=UfjQu& z!4<_}0PX2`+LiAl5pwsk`TLIZ){-uDL#8sK?6&{uK5>9IB*GWSa`%|Zu~=!nc|1`i z!6#u0XcnZtDG*FslP(!sg?pSOLfk0Z!#~>wS!4do50{n>lCMzguxzzJ7UpEzkD*7G z?<I_OaKr9Gexq>BtEcOBk__v=zvppD9S-Xk-_kmVGy|WZmn_MV9m&?~-yivjp0VqX z;pF&#{VS8+S}5urQ*lpnnp3d)ae=QXgs8{Y5IIIzCM3YSnIb}1Me-JJEe?26`7+j5 z*X63z*So-XM~>X3a22Jmc6ZT>bH9seas8-=6uq@O(0OvB>w55b_59Akm)SJhS54!# z6w`Uy<&KkRHH{a2jv;b4$F%{8HMI&YXh_=Qy&zIMc(wR`YW>WG4XfN*OrP;z4CQ1w zXkCm^^_=oC^iGoDHuYogYF_P$Uo;V>&s91!Tliauspp@BcXr1C;C5e1T?v(pLO}}d z4AZZ=1@=s%qos`O$lB}w%#g`9#R9KmzkgfuW>oa=i0!Z^qKB(@JFUCc%R6&!FPt47 zB0GM&SZ<83O+Sh%<H&mx5ej`iZ-Rg5fO{_g^!@G{OXEmp2l;xxP`%@-KxMBji#Y4) zP1JJ{1S_cLoKRhnMJp+7x&@2V{<b`==2Q0E1SPCCP(hIFA<;lO(=qHHA9_WgVi>>l zy2v<2r^12OQ<LqX_fd};LfF)~an%LQdmkCQY)?r{jZy!<)eI?~DPoj+A+^efQ;2v~ z1iG?x5yi9+Y^2ee>SeYfw=0+OraFBwPlZ|S(u~op2ine6bLPCLRyS3}(>Z=bK|wXe zRdvOZP{xRhS+nIkJ$YmAx0-nF4qv6-UkKox|C!rbf37fy{%Z8~&K{9eyWvV|e<=aX zWm~Q@)Ki<{!%M+^OOcoP!hNnSSoK!kINpj*!As_7xu#lXUkyA(*=4#PHK*aH!YULB z{*u&D<fL;OrEPf+qDBO7r~1Q3jJn&|<1HtTHd>(_R<$fW$K#D5>~831a{ar?0jI0v z`&U3VWFMr;{CSLpxlkAGJH{Uf8i+sA;LL(Mrhg!%C#Wb%5_~Y?PZCo%pXDG`$eDOX z#b84=m$k9&s!*QBA_~9LTIY*3<!L^x9=VKWsmUKZgY8&Z`RVQ)whJO=M%}me-5Bo8 zT+t(z)CjK5Zsn*0t6aRSy`b#i>;44h%%+RyK!bzivCU<Z_ry{yrL1>FdKO+A_6$>L zo52H)i_ojCvi)@MtE=zCndS9gp~CnazY70HR2A@>bK%w1=^rpYGuX|xJ{I%2vm(!- z<gm8lt*8~Xn_$_#Hi&-o5mm924U-mamEno%S;jAB{$@Kd0<huvqc*}Y8LQ_+O6-l& zNGJnb8)IK~;KckM7VUSxq^9jb-!2`yY1Ck0ADI2=-Q;NgkAyYnuH(R+1jAQF@b6Z2 ztSw*vB=&xyN$e=yWJ>eF>V^afuq;Pv(`*uAgw0L<;jLpnk4+_HF6kHBwDFL*cUp37 z<+@$vl`D4T_t@+C5G*?u(A9|O@zrvJ60?zhj%DVZc+?wKk4l$ez<G*50`R<7qo=K& zxdj*7HLgP7)<u=BPK`o_o4~n>eI|w`I`8rdUd9Nb{*GXUpo;m6i>r$4#Q%x7vwmyx z58wU}6@w6@TR}k@q-!D{TDn^VB}NDcj2Z$GA}~P#X_U@M_vr2#l7mqagN+<)%xB-{ zIG%su`Tnru{_&38_wl~o=XIX1i>hZinR=zX+L|ZmBq4Gh@s-n3I`wrzCP*SYk%BxY zrrlY~ktghqDUoB@d9j^(qo<}Tl)jI}@nfm;;HK|a3Li4A6epz1LR&KUWz!pFb!I03 zd(zQ_wi$VJ@=EOB&8)RsBvZ+mshREcgLcvl92C?iGi&03qK!aVHt*d%UB`xusk5%d z4t`?b#OyTr4oRzB?82+36+Y|!mA-kEL$RAX-u6{0c)oukx-qDWxKfiWaXy(__maR! zo&{U~gKDEIr5iXbW)Uk$T@=57y2YhE4QF_d$=;#iBAluwslJ-0q~mEy%BkCMDeGJJ z51+Wur`UUTjtMk+UQ^=RZ~QTgdKS>~itf6guFOOf7SvH{;~vSf)l{N7*ACQ&nl#gD z-+fV#Ons;DwOnxXC+}JrH5RGrHC>?^snNLqYB`WQm_D<4MZTaPv?v#ygwb~IjDrxM z8&6%rgVH4=&yBC+OX^e86Fn09bPgsfq$Dl=ztRBUiyKfJgFlhwcYVhKT=GdX??z$Z zL~NTbWe#J_G<PUm#r0U;i`R*0`gtAp`S|aNfF_b(DO9P1d>2f7xSP?-M)<zM&BJ$j z?~3dE15SK>Vqu^w1J>I*!tWWP1&N;5QD^UCk?p=>;^F-V@bk78CdlG?Jj&es{RIWm znp1f0XC3#_Ok`Z~oX6ry+&wDlmelP<wQG>{&WGu_cXHFXvc=>oeNIep2`CReFZ9jN z8)3L~Q0+$)<NjuMaeR1Ukf>h$I*>tG(1r8P+~a8iNBQ1W;_pggdZ~>a<L4JdhF2cE z#1u5TXcvh2sFF7Z#_;f4+VS-!i*NnGC+m7cxUVw^Y$&G_$!18Ow3yr&H#g26`|t&p zF{c{DIHGuTQINLHd$m&;kj6zr;H#uMH_~_rB-EymKU4l8wP8q{uzP~>n8<VxYj31D zj9i3A;B?m0>$0Vn3}=PI=ia?(n3TbU6P*0d&gnb1L_3_Wd5q#mN;JHFMYCw33!NPQ zzH*|q^WC6XU^1FUZ|3%7Tvs)jI9V?LhnSI8cm@>Y>NTIU6T_NiV(_Y&7IU^$@BWsF zIi+;8d_3j6E*I^zXHgW!N-Xy|`@C-Zy9mk4vB|}-V>VWF?fI)90k(@{#VfiVe)pG_ zU-rvAPSURVtr($Pe}Aw#|9NhTiZIRxv<F;VT32901ABv%@^vH!2Alue`@>=ss=1r{ z%6vFSXvU9&b9BJZ(c5dAoiSPBw*1*e=^yGZYe=*(R&ZUUo!*WE!Fr;VV>IoO@%6b? zQcm3S9}_J}_CJyL!a$-l;5}yU`GakYf7Qk<k)_ar1Y&Pb_-P0$VV?A$PRjSGfH$8l z!kZ4&LP?~B9y2t%_s|VZe`rb?%-y7DxccmPv{oI)CYTQ}{TgxS?52O=vLI7W%PVEB zDPi~536Cu1pYSjn415b;%9uV8G}7t`&h1V(qexfPdhzh^OwlMXg)9U=%>uj!`0d2U zT!5T-nui?7D?l!O6uQjjKatxvy@;RcSpCTNhS$vKeZ{?RXRwqHp+J>3jOj$UGPf#2 zVL#OGv81`Dqotv3ys`R9ml=8ww5Q7VlFD)4j$uksa|&KrXyr!3wG4`lq$MFI9$`9k zzM#x|6CRpRyTki1CtZev8BRHti3<DYs+@n*+PojVW^0wH58~?=B>M-TyH?Rq>>N1b zLbU26sJ_CWzuyQ%OO8lA=KqxVyI+YRh^Es_rdN~6028`Y#5S@dUy~J2zJ!t7Xez8u z!prZCxo&tE>kIuCfDq)j!NU3aA+1i=f^h89Mwq?j{^E9KnMRR?D>YX2MmGzLH-7z7 ze9$u>|BW`Cb<dyInOKD$U&hYlKw+)(WNBiac_}za=tBpCRC|_uVyUmU|5IBj<j8NG zBDP2c$7JtTuS%0fdVdzY>Pt__u^WV{f#s>1oTcy5Kvg@wN1|-pZ!)80sPk9bi&2S% ze6eu4UDkrV&)&S%+Ix{vj!h4g%6nzzG)&*Us!JJH*OeK_Na;JU@`{E@jRgCffWF-6 zEkE(ei{E^B3RA(k;-7<|eHkh37x4%4|4sk;2S_u2KTikqTcm!#WqfI#PaKy~^P^$V zSV%?aPpjB1?Ysx&E)<N-W?JQn6JAVvC;~UAH1vOm3%lp>f9+!K{^f2%X48I}>0$fD z<DO}wsQUv@4X*PKE~+%wkOg?rSw&;vvG{iKAK>-8zG`Oag?|iRdfSd7xz$|wy7>wz z!tEXQweo5sbw|@sje+}rf@1%_e`>su?_b_sR-l{{t&R<l0CZLhRd#Zp5nt8;zevWg z=>-`#F@JOY!lRJA3W{u>|EQu!>EAC~vGnEcllbHjZcob$U|Xm>MyY+jeDV3fjWS)< z!yUIxPS#2>S!*Z_Z(t)W1RWjtX5r|B-D!jGq{`O{vmEx;$>QP7TiqB6FZ;0Jc0G`Z zN0sG!_1h9!SNHm6B~z6(1^inNpU~U{=p6)o*jTNg5rj{^5^tsIjf8%G&`Z`i9t24l zw*x~|xEGrpPaeqL%&9*(ae0chBt^J>*HE6ylHxJ~o$b?V?E_zFtxRPD+`mfD+)<zg zvI4NJM^xnv(>D_D`gBN#Dh(3rBSY7xTP@0C`@OpcCeO)N+u>eR6|0tPUu!Sl-uC9_ zN#V@3>YHtQ;+hqC(tu$okQJh)4?f*J((VK+okLk~L~gCDWO|0`I<306SDt7Hz+QCG zI1YG*Wd}2z^HwnY?s#X?n;;?=isYBOxE4%r!Bj2>kZmqkGbjW!+)x%9?I8(*WNSc% zgZ^C1g<W>qYiqN61Le*D+C4c~8vG&22JldnX=!PKCHTH6UTxy1;gtUDn)!0>Ln5mU zc&0m}D#>lC>&di-<<j<p<2$!Bl&ZsRD7ugl7xq*k3ME~o0=lKh(feZ*&sZOICkCGV zPdDRc$Ugx71=wB-vt3%)knYTpX{&zpxLYhC0>Eufv7UQ#Us=pLb=re!u(AIi;0OQE z-`m0SWsq6Sby{DB(r+_ij#QL)LSJ@^c?m%rBMGO%*k!u^E&Z^8Hs>v!__4gUG5H$u zf$W&7mu_KM>*myt?Swdau`SKLXU&!Nw1F+fU!-WBg)CHwau}L~ZVQJ)``ds1130fd zsmlas1jkCz#|O@+2i%4bI2W!Acsei4E@I5xWgdpnKDy;+wbRK(yIY-3s#yiiBJtJP z$xz(geH?37q;Bif8*7Dq*NVg0R2S!$@y{pM@CG;W)u&v8VP|{gs$1gVg`e&Y=?d}e zSlleW;}N0Nh)Wem+C|@Vu(Pn|%6P_T)-PS%CC9>T&Q+p0wM^fn5n<PA9d}w}u+ppu z3A=X7FLizIX7D{j>gxl|m8IXMzehVFuVyR=2AF)wOh?x5WS^B9<F4{Ih%j%O&-IM& zgy<9ktBJ$E`7T*;L@&x!m!MBFi|z@0N&G4F*K4NHcg}Vg&JuRw>L%jl_0r3CXL^+L z8c>4x+dN}>a+K|0xt+-w@)%t9#)?kQ)p>5|lJ*#V654d!WYdqNqDKQ=N=?7pc0CSj zWI>gIGrJmVT<#XHbczU7zNNEX_3Y`*z9)MWkI~q$G$W~$kO|hdCvR;+XEbT@3AeCu zO8)1FRfVtJW`J@(^7i0{n6hUxXTS&YERPz^;%;&+>$in55>2t95$GBHImcc*)8S_V z-SFv257w|xNvaeQx^Mnmyc;6=75o>1#zOneA&(P@!D%ae$tY$MEc3t%!CnZ%ews(f z)ZhV9+O&n?0%nQJFL8n2`i6gM{InKj{gD#{@>FYcE;=FbUitL}I!B%c|Mfequbr-X zntcBHx7vf{1->F+<+}@(i~0Df%7c(6&H;X`6YOs!hL?AIHm>HGigtr!;-BJ$6AE%b z@jtqwUj=;y->B_y)o1Tn`v;)Fg=wYgi(C;cX4Q-N?&JfjZuui=Bm;#$2nMTj>dy4m zAT`^hE#5j_ZNLhx=l<w8<~HJ})<JC1-~XdKW&b_>n#}izAXhctb;X#Sx1ZW=S*$7J z?6GW3eYhN<vfTvzV$Uf=WE=y%b#P!TRVLV|zdfFoBL00%GjT=$6=HyW`ZR=B)fVV< z^kKHoxy%a+QbseWCsa+@gvq%%ZC{hODxf>y$h)ZSq4H(LrdX;M%I2;9W|($sB?!UE zF<s@SWOOXZcHa*v)jP^y5USt7e3bFp?QlY`9n`PP2bo7w!WmbT5)PZMVdc-dW={Q> zsAHynaFpXRj**GLhixhwc!dNRt(I?^lh#|}o%p9s%%lWTyxhI87Mgh}Y~vR=N2atW zyMyM?%@2GtyOz!V0t1M&T#QjAhi63BT4rB8-wmDeIjXbnQm)FNqaLos{VpV3!vOWZ z9OgcE%G;$ga!QJI`_xMI1_?>ysx7-u#O6{D^xOKDM7(Z>j`a^c+;&u)e6E3pT;XW< z0NStpRA!PFaa=J4TuGu<Dg7_y5|0NG|71j`vAQZhxjx&p==}%yV8^}3{DF>)#Kmb* zR6;3mF}U~#HKfZnSGUIN(0}<G6nRLk!uhLC4<&7-ErXx)lF6ase5Wu&>l_xu_zG|8 zC6RD>zWq^|;kv4RKQ}g)OQ?;(V_P@0sJ$&Hv`$ZjPLn)cOt~ZYH^VvCr&GZd!SyV8 z=>lIrDw6q=E39fY7#lZ5620uzY$3K@c!3H0I|~HgtYXSZ91P&q?;RO8`;IccJuV5_ zT_~vV9n2X6MnE1<R++5zlq|`tZ<hdnN*y5|911@{{DPVyc&E{o5hKo2>0_g{$tthm zJzHEyte5a(ubNS24!G{96W1&4`qPehNpDo;8xGl}$1jGTwshQ6ocx*iXG2MaFYBD4 zu2CYf-x(T`ic>aP9Y=NFdG%5u_~&N^Q_OuD<9RIX_DbA^7pK+A?mxhNsrx!hh>ldc z8_Tji5`mGgy^Kh4Qmoyr4vyUc2a;0<=$sylrHGBeTqiFR6;|6j#xG#Eu5;5n*155F ziCi_E&yU*omlUtY4nZ8y8@P6EW#Fvl#uoG+-~~gE8=F&Y3iG-JAdHSAZ&gYkak)9q zy!i*%h-j9)-s-CfgMibDf?DF{f5t2-Z(?E<ocjIC%AnmX+B<EWOO=N}WL0$2R`WEe z%F+DaKzz|3R`p8o5Aw)zPf3mU>Bc;1KC23_pS=Yy8$tr0UP00G=1M<c_~J^p)Cl>y z45cPY@-@^q?+2gyxA(Mm=MleAb1k<WC)%wOaW~iE!vy5iZI9a~gm!LeDN-f|KK_}c zqjST1E6O3EnfF82Pmz@BtPe$Z)6nUBYzBbhA}uALfK~XzCE`}E>ad+}Bg^K=5Q%_i z`pn%(bGC&i{{2DTZ$j|5(<5tkiNv*2x&6};JEe+%nEUab0^-v@*t54&leK{X9Ss&) zG!8Qqt2I@1792XE>GvOoe*!on<*HENeA~RLW9l0pDc<;gTY|M4wnZy|&5R-}oPhj> zzaxU2b~5r5PmCuS)u|e{2PpTOl8E364xJaKuZJ_ADCvkOoDQMU8E2p|uA%xsr^WH+ zQ8%#y$HtJ;YtX$D-K9dM>7MOZ)Xx#Xs?{81l$c@;UUm7G^reQLIzTz=yebH<lAvWs zt@^O>jwXTn4lp~|c0OiVD4IkD;=lD|@vhv!*csZUs&M_%sm<rVpR~{%V5BTF^X@eg zQ9yGO8_=Ci(L4Xu#_h_qaue}M(MPxE=bjR_-+N5@q{m3J=2Lt*S}6a$8Q@eg_XKS> zqnvrGO<Xc^`xW8Ovcb0;jZzXh#^<UyD)QX)%@|)gk9U0w|Hb)50R_nkL`l54pW)Rz z@&)-|L8`F*TivAemV;!4-f}3#XxP2;%TsAHUh?;q#~}rPu|zP;vIX-u!GM{tW!9Av zJ3>jx(H=^QO8R+l;g!dA;<skG*1Nfi;V$G6lc(kgzcHZBCq_{D5A;0oW~cc~M?JC! zc?V=q^I>0DRjn?~Kw<y{3Myel@lORVt~oOUeE03_@$$F;yftb(ji<`7+EQd`uRQA7 z!aNvn2#VhCV>SCxnNr^%@%taZbpppvAmt1CjQ<OHg!%_qKpM?7F1whM8-DaX4}@51 z{5}8;`Ee+d;9(%pexUF>yL;M&x}hDdlk=vS;`PKxtZ_f`HI^~Ot86zFVKgD+%Xc&D zamb4LT|P|Z)-6!}ouS5e5dW-`oQ{oG?@sq;!?f`;s0+eF|GRDb{{S&o6AMeJ#GyGh zpKCh1eB!Ok`Tnp65C&Z1I-~$$$3Izhn(iBwY%;2USfy+PWZjXL<0IPdTp~WC!gZ%@ zUmRQ8^r~o~mkYkcpE^t!n=dUDd+i!FUJ`&;ryuv~auZg0r%qeHP+1{p9$G89M`%^E zZ*1=HQpzajOGT|se2yP&xL~4qmBoI?Gjr>ltQ8UX0<8EyosXZTF8)_>Nsr@m+8~l- zhb^AX-t1p(#@wGK=!N{HUQfIh-0z5hJZ{ADMU4M=dyW3>bg9SOA9&Mzn=#V60?cF- zy`kUMlsshns=>~6aX;t9#7nhM2aGi;^>Zm`c#*pH95m0q+qkLnp5|9>E8n^)Bjsrr zEo4k4<K{(6V#GfH=BuvXb6xSa*Ns9JJ23TY!RZi+wNTM@&nS_`ijkW^5#4sE-Rg#0 zdxrWaO8d|Ikj!UZ<bOe7B`(90={J?%%aTD~c5;%P!E)eF30hd1-j#CS507WQA6oNM zKgcyZE1Pl`er0RjM}u8DPn|wns{aZO&~SWGSnfp59wx>c)cTredUo_#3WU6iqke{Z z-FWee)e>szeCspkMjk8~&RP;<Z36D~XeJk99zKLsK?JOKPry2(vqwffx{VHsGjg4G z%3L+dZ-<y-Th2jfX*tJt0%<IPG;+LQ2|*MG<pI1oB2&r6O{iC4$XXlV7lKMK_8!XR zLjsGtq5@Q8c^Qh-?m+V3eCHW<ku^xtNA^G!HRxyk1&o@iJM)tfPTH0;YBdSy_tAGt zX`1*=kY2S#l=6saeoXix-pOp7tUukM&;dd&zT4U0`z)fUw7!&TPvJ_Jok^{{BG38G z%k*YQKK96N2mda_Epz>-n-s`Sdp`-X6L3a8W>=KfIj-i6BK|!WwkLP>&vQKvKaRHX z>tZS9tNe(MK&Y0u`lm@8J2fUWIs=j;8xhTDFBR5^jW@LiBew_m_HDOdF|RmTW(>7x zI11e2*S7SgmM|5eFDKl-s@|m!-NLs~=PXDu@?%7qzzj?x`6)2jrkS1TcbDp0oNd>F zyX|_tT5J!Q&2}3Jcylrol&WBF$<YYFCB_jn8@_dpx{t1)N%M)}@iJHeq5lE?zy^Hk zvv;Da3We#*Jkj5C7*%>pl%Q0X^S$Pa?291@Le3O&e87a@j)Sx+J-A4mer9OGs3&pv zscG4-GukVTZ9lZuc95y#6Tb9aL<4W*HpvCg_k+q*g7Z)Q=vm(Vr+Sekg_iO`ruq_T z<8l;=XL&TaiYg~sL3v>#{eXXfhKTkHl+>?1dBoRLZ(Zfm6G7oR^g|(Qz3EZe`yE_K zFtXOCN2Yg*Z(GkAyqK_53-0LUP`3q|REv`&5RjkbdwC7kqvH#XX(lDW1j~k$&vNWR zAGWV@9EvI1o<2X<!52P*qg0c%LN@-&(-eX&zJ6fXvlD7-B3&o&?Rj%y4l3|_`cwB- zssj~ZwBV48sfL4&F9Hq_XIkY=`)%#CPrQUVoOE2xZE}$jbwzD5nUVfUhXc0NP$K_) zNgz`C`D#sY#(-m|@*|tOZ5|ae*D_0&06{+WcstOQ;>~!iP{7XOi?Bisl)^+kIL0`$ z3ZG76f1Y56p?rBXU`5CNpz*d5a7A6J7Way&H?(#wg=?Wkc5j;XZ#hMmckC&%CKvdd z^<3|T{L480g8vP4FU5Bp-bfnG<2SBs0D6qHn!q}rmI0YztRwvt;O;tYldE|?>gMKf zs+mI12HM?*tNCGSEjtnjMSI?yj$QC8#mz>m69rq4U|oaC{*jg0Rj1Hh?ocW*rN>II zFT<ZFWwBrER9e-~&Y&Nr@*L(3aRg&+Zo#W3J+FMth0Z>{%iQ7JB%dIUyB)+b%P`nA zILI^WP1p;73v*7knq(yp<mh=rPo|ri{5;d$A#&xv_kQ#PN!^eFe+`4)->(DvmE?_| z8u~FOBylou39!dQq*AEP4?g;?7UO+lyM*hUS-QH$0M_6X-)JAevW$;RC{X*SaFy7? zBGX6ujl`x!ANjeGL&fb&X1S{k&K;%F5w_ujGRG&HW>26LECg^KrR(XRMzSrqhTsVu zMU@1&Vx&^aRyv`Z`z~!VnB~Bi=xfXV$D%h0<#aQ~@jDOakA2*%;Q+^`Z;B{a>Rzt+ zN-H;e*2VS@cK1c)KTAj6lVn-%st@Zz6qsJoY4H>>HGn3cR9n(}#@l$krj}RBxyxm5 zHwP_oE!0VX8!|s&zN(&3yg+^B^b7q}2Youzl-nY4ci^mw0>$uo=2V7FI`BAZQIDo{ zkRZ4sD%sjTb7Ng)Ai3;?LD(0rM9?5nQb2_>>20k$QgK`#C`zUt8btJ?TS)M9fsDw@ zCgSa87XnQZ7ieY=NuJ|u!fS+HJ(kZVi@m@%G+TUPIMVCnc6-m7REtXo&AYbuOyfD0 ze@F?$k2HTl+f*;lU`K~lKemcfw)n2M`K}OkX3<g>V{=FLHHYa9^Sv3h)J_?Kl3q?m zV^<x!c4RH^yz5-|uv#Lc>vYPWi&|ZOB-+!5p2Qp#s4vv`Nq?cFRB$Q_dvsmQTicHF zX?c4}YpW6ZA=WXSoT}_TdyqfO*tIsx{3CJtsxiIPB_k+@Cu+yxu$S!W-mpT(*a8<D zuIJou=BRPvr%mQv=;KxU42e*vp`9?wiwp#RnEuURX3K=*X}ni_IPx)kaK-KmhDkHh z0z0?R9HEd2@{qgeleldrA!cw#xvOl80hG@_v^uaI!xeK$tV3K7!YU!(LNu<w5IG1I z*4L^%oX$~xnuomMn{`m>34z=n%oFYxHs<}g%)qxub^^<aZ<$3U5!&{6&z~>E>6}u& zR2lWVx_Xn69MeM}X>#&M>T&z70%R22iFb~=&{o00Tmx5=O!I`RY4V>jsF*K~m`q&I zkyTsAv?lpTQ<zjl;>*pG`Qy?LKo%>jUzMB5FY|dOVh`=)w?NtUCqzg}LWQQSwz_y5 z8el*%smwC_-;73}qc7EUE9LWUq_mPI3>G5p_bbE-Ln$p^Unl=bjX^}X@Ni@*1~P}S z4?n&1I6xyF82l&eCo6TjbMOyP01Dc!SIV%tP9-I}j(ke-eSA^mNwXxCvt*D}!MbB% zdv@Op=3J)57|-_HvgX~3e4OFH8BBMkQh58nX~{Vq5BUZE3EmK1P5C_FDll(IvVnNN z`73(19zQbJu@nEufl}!%d+zveqC7ZRlw>!!8DbpfRO;qX4Hiz3y`iP72DHxvM%l$` z?8u;>V3`R<xcbVyLCXp{uj)VCe^ar9&(Ny-VV&iIUGmRn&nh2x9zSi4m)J<i+k$Qi zCPy>2v?Yq^j|{;~ac_$c5u4famVNyiY?;sruJLOAD;x-M;Zz{n>vCtphAjSsv?m#R ziIS6%pnWu86vzRFJ%!pg$9Re6w)Fh2ydTD_wa1|9xJ}>xAt)KLx#RYmc`+|?vH8nB zt=Lzw5z(>4e2$J3doSAm_EY^;lGAzk63@&~Sl(BUE(2cQQo=*%Kd#lI8Ko_iP03*^ zXH{wEzVUzI(z9B&<xlc%e%P|1CG2si4rXSz77Q5`d~mP^-t!3QV9>ArtQ+@nhdb39 zN!k-1YBly(D0~dlHs*s-)Em>?0yyXO@u&GZ%E?s@Dh8bAUKb08Idh2i%nKJL_#BzE zif4+;q>gw-N@!BkaHo(fIw9t}kc+;ZK(<O_JcXHcr~#BT5JQ}5IQPZfo@<i~!tr&j z@{`=pB;TLZy9j$3?Wr)7xpUo?=F5<NF7uVkdsu~)a~Z~@B~6Tt74c;3b6m?{;2_Ue z4RTD$_N?=vwPwI;tl@<BmI}`fnIY*<I0-%vyRL(CgWWVwJ7`;Qt!hy~gl%?X68{<* zKOTwUhSZ-sM-!F6Iw;ZTqg?G-Gb%NYCI4Li|9ne%*s0^?_L|G}P-2S8q_?9lh}Sk` z>?NbzA^9P2xIN8!R%CllYM^#n65oV2HAA7UjK^oG=|$uzBhO$@aL!)mFfLc__*liI zNOb)ju5$A-P^x@r#YIbeOH_}FLcV@+mjF6LKjn7tl{eZ{cqp-7zt6)+2X^bPu7r@W zP0cViue<d4B>Z$NkmQiH3&+;ruN8FaIe0#2g)i}v5z5D`Z1Wm|e9bvxQ+HYjEXEWO zZOe`mtr;qZWcPrltY}Zsn~W!#%Xg--h~!ekxEnMFq^K6g(G@R0Xb!jD296hFQwz^U z@9!n=+<Y-CcL*ldLybuc?rHrU&12^$e;VzLZNs`X+m6_H3!JPM2RHEz^kL6!_`mWq z{3XHFJVxyH=AC>SWGPTOT)Wmfj?9OlKi9LuUN1Nj1LI~ZCMc^`?hS^`h+Fyfe<0}| zn*SRP5t=NZs{*nH_p2xC9nHR-rB_8(=n<k_=DgvqSKu!_ChEaq>sj*&j2n1hY|O2J z_AlaUqVyW1hqSyH3#?;p9GgF`<d<^iWUCib5}3D?>klkPST!sZDZo#tebIK_UKI=g z#+9RebN70K<e`%tUUmq5e^3G(mNep+^_o+;KA*FKTw>?&0Y%e*989VnAtv4mYj*-~ zpp3yXIti!*=hpPN-kQ)}^5ik}3#b>=SY%}OD_AM!a=ZQ!Lem{KHXrd`4)#fzhKS5C zPf!*BMoI;%+^RSZWMthGaE#UpA4nb6>g0>^vTOIXx9utSjrenwA@ZE$ExIrBqt7C# zu4K(oZr}Wyk=#?I>eNSxft!?J0_%_FRQjzsS`eSCa{S{719?Yrul=dse-nrX0DSAU z?w={woxEq?ME3`pvZ)NP0Am<NdrF<4HXGXvZc3UG>-r&d>T;)fRKIvA{{ckI)CSmT z`qLXd%^T#lYv&Ekk{mC;JWTw<W%YYTqLgoh+p(DCX7~%*A-7CTZs+T+$murn4X0>* zW+9eK?gll$2Nsg0!O;HY%a9=_^Vcs)om>o9b{qa4_iMy&1MN8SB;_q_e6HG!n$l{+ z<x}5Bn4Qk%^cQp@sp$BN_hGoQOG}6;z<ef*r3zR>q#g0BZ1h=L+ECu$Ifea@37*$g zN_5No>?<C<>dc;^&Vyk%*AI7(PFM@0`4hFY`R8S!zJdRZFeA{0dK8RP@a?|hXObsB zT+Dvo-XofpUyYr6QTgMW6qOmFy7v7olGUySx&(i`D&ix&p2+2JOlrExUzv{!dGFiv z5Y*xL0I1Y%?N`qgjY;q8XR6+_f4Y!%^LVMHgP7h%+>q<fMlKA!P?$NxdS8e91x;i? zLLPw^QEx&%#>8Y?b@=I5l>PPXs$g2Gu?ZT2{O1GTvb{x8{=<*AR>#>RwAwIzXkDX0 zknj9swmU)a*RI2&iNwh^M_<HKGTt*q1n)7<_S9CcLR9Z3YPZVcZE(HFabUEXh|CAT z4Rv`V$dq~1na5+YgmQZ5<!`R(pPnv6Mp8(^w{uackNBe@6$A<le2Q?nE#vf2c6W9b zNC$MxWyL+Q+t*gZs%Pc<vPt#+mCv5a(I-$y&EX=RmxUN(LSuLQMioQf-XuoAr<31Q zXs+$Zl_t*`{vpJ{6RjDOpKXAhjqCGChKZa@ibB=(>t|<`4zy&CB_zaibRoF}b=>nc zWSsw&qDsE1()b;nzd*nDIqL)VKgUS@I+BFt0SrI8>shC(Qs2t>rd#g2#`{Pm8t1Ec zF1NA1)I{ShWy%}OGsEK)N|(fxGibLLC0`UljJ;^-OaBRb()d(2bR@UGZNC%#a3zqV zAW2f>(_J2iXhWpjPGN9F&9AbO?vhR}6+M3U+U?*IdnqE)YQq(Ivl30efnF@&Up_Z| zM|^EQW#>F%F9JcD)wprq#{A+JrrS%j4Gr@fI4cXjgUeM57e?Fdy%i2m_9ppvMAzpd zG-3!M(b$kye8b5WwRa;=6oJAk2n8XrE=Ur4rr8&RmM`+0IrtQd2O>{7=!446q>jwT zDEl_~w#n1(4-#mC2J>UvW`@fjmpQZaYb_C_ppsm06Z^B=9^&nm{RSf&*<1Mr<68Zp zq++PA>3E5XE!Av@N0#`#b0_s(J@4&)WiJCcv<_z}@2jy0vWc6H^!U;@?zdhqCEkPK z5N~_GJkF{XBu+4Qk?h;4vkX64vy!?d4CKv!5*Qkphyt}qK7;f3n>G@v33Hnh;zG10 zgBEDDezv5KO8fgjGJ+!ME@*US)JV1ryqGJ+`=gPtC_vCRP`>xkgxfkqHpG^T3eK>9 zHS5eYLe^MIfh+#D^(ypvE2h$0mU$a)LW=yqk<xY6#h|o^F~vVyTMWPwzb{p;M1dFq zxP!$d^~$R>VZ{R{+HF_Mmg@1qt1MIIjpy3O%_Gf1ka{nh*(71h*Ie)n-D!ZVDF+kb z$}BXs^r0k3R=kv((GFZfyUY2Y8vitNJ1HjXkkoxj%$-H-X*>FTcoSdz==&P<XBn%1 zp>ycH>txdp1^~lZfcSLPy9$jO0@rmxy?yl6m91MU8fF!Ed$}CGkZ;tPT)B*)kUEPA z4{^m@pavE^LlnF{yh{7tr;%E{A|pwW$<p6WoGw@xE@yDF4UN8*HX2H8HP#a>%gO3} zmii?;#clzwLocx!MtHCIsx+X`y=sUmA1Ob23sj`Zq)_O<Owi;)z=JRo1C?+3Jz5q# z-aQ3M9!o#HIwXqrw;!!@eUbFy0GDg&u+^s^RG(W99S^qNKGc|JfJs#63O1i^!Ixa# zM1d`)3_<||r&SuLh5`?Qh{J@;LxGJyK4B>zbY((vgGfNUjN){^;)Td0R>|T$J&NO! z#O<0tD8&h@i;jhPQWUc0Bu&uo!}NpT@Q=WhkW(ifU}2~)UKwm8$6ZHPde_-A0eU`8 zb5fQ$IZiPd_mf^Ao~-jmYMkKrKmWh;6#wsh7}3QOUDr0QVmp5O<z<g|hhz-LFKsxf zLdWpxF1btg_x*%Kb{czoF#Gm*87g^xf5EPb9hv={y>n!-AbI9PWA&4RS3b#jp22^~ zM385_W#iKPY2&Tn+3J;)ALj}hCk4-28t1SC)AWr5A88Wr&3%Y{M%P)Q_nznLzB|kn zV80vfSX*e1t)n)yFSWd)k8NSt|1K{JZS`OM1~AY{-=T71WQ>#fLw&+zpl{KgH-Tmx zq$cDQ6cdc1&ymD|*2g?8eZ75M;NE9R5HsLsdjwqIx&i2fWFb5uIch-g2a{fY6F2s1 z>gU>8Lf#p_Iq;brEFUz`5?B!nRSQNQv~rwBVHCR07r*O!1x;x^?-5;veu#fD;0etB zPs9XTEPVFXbZw_m${%TF8>KO<<0O6xlWCl5@tv-#Jd51VnEf`LkB||2P4a#!eklL# z*0k3dze7Sb`gxT*vm;XAu%lNrFQ5iy0+&5uVAfW~ynM>Q3&)H#^cnQLxg4{X%dgPF z>C(heC!^i^LNM#>A3zDzDJ6>gf$QID`Ro<@4={kWt7a^%_X#|dgFTxvu>qHjZXDT? zD(Zn+OOwAQdb#IcTaF1VZ*RXi5jBTim?ng5wX{#1e{cQ=_-q%$2{}D(P>!QGBQ^YN z-~ZXn*=~&HX37zs<W}OH^*F(4vR#?~N!HEExr8M_*kRdNwjRNGreQ)b59?KZk>Uwd zJ1#TB_)qQjMiw^f#GVZlpuTT2`^0f%d2oPuC3QAB&uJqeV?>_?VZhd%1b)+A-pYn5 z1xoHlsVubwZIeE}@j{9i;+>unT|m=k$DH+_8*~o^DY;7fLasZK?5@|cIYLx1*4opH zs-9`mO(OZc5KPtvrdTOTztr)+IYpI9w-{|aLt=6&)7>Z6a~Xufd*u~^#HsPSr&Vkl zb5q~?5T6%>nL5g)J|J2k*~Pfw#qs+q8g_`bt)^B-<v)1_03<j2!+3ylN?(Z2w}6C) z#CAvGyCUF&EliGhvFIYuMf46I#Y1(Cb&~3+jlVOr7bcI}QFn(-5@{y@gSl7t=jU^r zZ8+tPf~yDK_<!|Wn_+$R`m}_y>B^WAUKg!7)jfa1mo9Ml-skr+WV^ZAzB*&(uFrD3 zU?jZ0WDKG$@;n0*qAZQk%e>XsW8LLdQc%<8xWjK6ZmRTo?OnV1SXBV(b~KS6V+Skh z^!Amc^jIo-VxJB)pxDrgzdT+&A5pJvsIH5(wpt4LCEE`^C2v&Pm-cWG5^o!?9-L@o zYi1|07UD;+0&m}0>Zb@K$J3a;em?>=@HKshOZ^8BrzEddEJa&>4@x<^NayJ;@G@Pd z7h|S~$Hxt{A>xHfDopiM9}SFk%5lzZS8l`>G;1v&N9_`}{muux4eh`?ql*}h{HA^r zBK=2n4o<5(RpQyEa}(E2#(49rVL?ACv-2jYbCOJ2)H1a4sq-n9v)Hj#5C)PjgbSQ8 zqBiAG&^lX%97z<P^d6DP<IpOgXeSPbkxJinM}iJ(Hm*M^&!fG?AD_5!Z4>rmIW%px z{h|*d1hts2Iy9`l>ro9or_jd|ToH>LX<cE_jBv_nCptTA_`70oK9%IBkOAypink0~ ztVK<TW3Ej4PISHgLzP0;Mwv!x#{1w!bKY}uDGWs~EH?J4{;)KR&1Th2qOF`(k!(r1 z^EHIw(4G~}t*FdqEAmV;^%6r0%8W?K0n<BS(6+bW`PIjn?-h7%NK#DFVDtVnT($wt zQ{EtJ!X^s7)W5r;%KX-L%@lffiALO-O~cq;4>Fp2`wea#tD%9}?8~1C2rV{90SkKm z5F$IUj^eTc=r8b{v&=z6EIJYh4iMr4%&pQVUd$dD7wj@AIX9>?Cm;Z+L%8B~7K9Fz z>gu|t<u}H8wc`I}zgZC{a_8_bQtYZqIpq+@s^~#oSYm+#_DEyY3M@nyDm>^t8r9+* zir&lrIwfzunjeMB;?hZemb)M>hei+MUgBfpbWg`Nuw(2_GOe-!MUlWKFf@_KfP=0d zmQ$q`I=y3Jk)CHvPnPT4ZzSi&(`IaW3h&g0rac%U{|E3l5eT!wt9C1k)nofA=$1!^ ze7UaR?;Vwq8>@|HN{kamjpA;L9#xf|%S<le?nX@qAxup{v*!WxtR$Q>W9^WKH_P(3 zms|g{niqzeml219fbjtn>oDoQ+LLl=9_XHRxD8D_&<RKn4nkPgwOearANIFqj87ZY zZcM3Cil5&uQHS=}FWtApT%<Uoe$d1UQE<5$(d|++lXlaIH0?oD^Sx*$lv%ZRXo215 z{O+<I?gasWLg@|yE|)A5VV-E}vXu~5BikcL9&zWumry!sqvau?O9`bM^r<108IVs9 z`VB$4xrus3pqrnr=kTA+^5JGus{0t$M!dV*@fI_(LL1%mjpwi6vHiL^njvuQ+U>3s z-X9^9qRsNFdpw;esy?6`-C?c_AedvqdSSN~xbE*&+x>XM`GL#dVj^@nkiO_pwwyCx zjowTx>VIi4EeogcjJXAAC3fl*%UGGGm}fWNc~|(x{irw!e(E{weE>Qw{4Vh|h*NM4 z`DK+gjE3-Ht}^ppg1FyCEjzTkE;fB<m4w$p{FwZ0oT&F6k`g34bUAmQj#>kyCY9GU zuBUIDLuLEP=&j<}Rd@#UaIigycFfM@#u-c5iCTR=4}N)P_3Is8DS>6j(jsOo`qd(& zj`Bd5$On!V=E95OwKi+W-6}pl7r43+*yp4MF^3DX=qfo0YEs8>=oCvqI1H-fP|XZk zrF&|YiI}VH@a#%>Wlq~Y5{e!`$r(I<moYCCT>f?MzkocN7m;SmCWrmET$c7$3G+Fs zWt?(jE-GcG+aHyvq#_0(?o{mwufc`^;7q+8qP6oS!bZOFRjwNX1LJ&LtqjebMEI;Q z(50cDNIOkFR4S7F2Y`e6WHQc>i_$OW7b&iNGcPN_+lROOH5^lev%R{1^Wsw053)Qm z)Cs@buEGmosc=SVW!}FOB+QHcHT~RakM4jHNbb;;DrWT+WJLVt!>tA&k3DByR>L8+ zUYPt93T5Q64S3ri#+4EhvH6*q-IG#<uvZ#a{PG1-DwJ%^!n0og6RTQf`-a8xkc*+G zfz!ZABM%0a6A&hUksBQinuwDBAZE*^g^=U1jwk>9nJp*SI9J7ZC4Pz^Qvw#XscChd zVMVAhQV+r9cvsgOvvz!wl|b>h^<!Mi?cJ8CFm*R%9aelc#Jbi(AI(;&SZ38%^e7qW zjh_)e(D=D)k;~!OUtKsVuSl7GMMBuw{oi%;FF5Rnu(AwTU<<yRBL%#eA{FDU$*-!f z=KFJGf4CAKW8lS;)~h1=QzZ3S8-D{-pt)-Hy84!gMGm0f_tGeJBeAz%uem5)-0n#c zacZoT@ZYx=oSZ*g$NDOdhgk{%gi-Tf@xF<=!E9Q%*`l02M#b@T$sWFTb60gGxgyE* zp`yn<TDg^c8NNxTZNm;<Hz_A6`t0kGop>lUF2|n5C3RXETB?j6TxYko;VkAzxw`h< zx0lf39{;a$cm5{pwM$2R<7~xteQTV;7uW9vNtzNBN_SwnZGL!GoN6Bvo$i|pR+Dkx zZR_8Ia)&fjS6o5kh6kn-Q4GYtCwC3ae#VS$>Sj@=!^%Cv)-u!NzqkIxr8#)e7&Mv* zv4_6LjRn}zlGv+YFh%#VhBpevjs&NwZB?9ZGET`T-My7bu_qwZACiQ*SWk;pegYaQ z0J{zA;2U^GotP6Dh^Glt8i)=R_&oyMREIN~s@JEe9JSQc**2@WPC+<{54#5`F0E>P z*)Z8gmH!mF&cV9$a>g9z@Pg&~&l%rxvYSj+EhC>VXW+hB{<675h??ho++lC4jF7$& zXrRrwV7R8q@Y1|Vvs+I-?idEW+G-3}W(CQ235cAB=FEk)3lhqq#eA4D7meNy+BV(m zYE<w7?M06#()mjc^~?}K4>ZxH>e<M2aO}YH{?5@fY+=h{=#fwoxuA112k?1Ze_LY? zHok1b*QcvBV=TNquTHG&bz-|98u@3!?n~$DE$n<8?Z>txqhS_>lKbDFxQC)!_PNgJ zAXimMuR9JYo@1v{XSoL_m6@cyDEv{4<#TV2iyu9TNuPKwSzTy!uzY>A1z_i1`5HOA zN#!}ewPG1}*TCEt))Qouyj1E>FOkCciX*Lvp@985&fL*?QB*5v<mleMw0I;hVmdSX z%lO}=uNr&6dtW+P&koZZ-J|Y&HuO%M{V|a*xgx6n`}GjMh*{1~ume*$ao)b^?<yAB zBeXK7VQk0bjCxe^0^kE(Y*$@tZyh+_<qbVq`K>}66(pIo;6I?l$#d~%*}lDIthXZ- z=jkdFzr2fD&LJn8BfX6&eK@`irkJ+(;XE|OqZXf{5BRAS7+!nh-h)WlW0&ioBeTh~ zPyzPXp9v`>Ko&3-Ppa|=%x!OL8=`$vPE6I0E}}qV&Q5Ao!TSBsg@%m*PW~oD8!&(* zL%k0#s>|JaD7&{F<0GCs4)?_Zdq^v*a=;gpsYC81f=lb{^&MC<!B(oJK6&(r{l`=3 z__f58Dc7J^{#Qo14?GZ@DlKes25-&hCQg4ID#vX5ABfw<%L*==|J5hZ?X0hC`ha8l zA2R7k8@k@xiBZxTSU18=tWQKMdcQkg%#HpK`?YE|c^o;I1AJK{DtEPMK1Z4-EE-iu zLhnAFmJEFW*;~*aJrFzM^Y;o$cM0dLBrS?>|2OP?|M#3B?RX2YE&410XdT0xtysjo zM{=fA+8fO0galxkNDnVti{bvVH7u9b@Z^R(s!U{*CN?fvOI%Wo=n)_EP<?VicA})L zT+ED{0L==!8q@oB1He!Xn0h!9{wiaot@hZl$#K#YDo!8LSAD%Yuy53FKH~8Y;L8Jy z&ATVDbm`={O)25_G(3hPQGYD4K1gxs&dO{^6G!!*4E@@y4}=nO$!>W^%>FBv>vG-7 z!GYVqTp;c=?Yr7N&j~gB+m&_7%K;=7hvU+kbJq6PLB^NG3<ArviLTL{#q}}{^wGA7 z2T}WGZ{YoM6^UwcPTX;Tzi2<6ZBbya;8dG5Wzg0)N8CTaPZ(R=TKTgJnEMp!_^6T> z{WVPcvuE7rVd9h?<s$9T=NMw7om5ME+Ib{f#Rp5JCrM#a6j$bPhgD4nJ`=u$IA56* zEKN^wF79e+phXN;w5SJUz0~QJ;c~`CM~XnUPAv&~z{*e+-VSlJ<%F-MyFPDbjRNbX z04~scUVMY?t>3^@EUYX;x4<{?jFij%vJTQ`aKj`ekVagb$r0;z<BIw{kETf(_0yzP z+zpTxmRHc%o2@^%RH6D(3hcRe1`TidC@sH|&($igJ74>B<{uz$PXCQVvp<Kwt{$6* zykM{{g<4zu%Kcay9une9qA_25U`<yATWPefG41un16xt3N*!hC15BY>UkU{pM0c~f zDyoIvNHc8>O+_TtGLk3mOy{EZ3rX)p@R#qA2glY8R<x1T`5qM%jaE@DqWK!*xetXG zH+n<`uJM6pFG3Z<tgfi4st9i}AK^cS{iswmdlfPPgO2@o(Sv>9s!F$()J#9O<<E{z z1n<6pj#|$)KhYSF!?UseG@tW>;u50((Gy^bN#oPo&Rt#~<zX?~9=-z+fAl749UUG0 zwk18iPX=GCImVkeNM_5GHOeF{E{!No3yJj?u4>&eH6>5h&#QWTf~qsHu0LyxsUJZ< zQQs(012st79hUVz7lq4JBpXV4?u1M`w~H54WHa?La`H}l)GJA^dsb92h4?(%Smt`E zB(RfyJa;E+=tx%rZyF|3DLHiX;$dC3E8O{K8S$OTH{5pS_7$hgjiImi9JML93SUg; z+E;39`)z*|uB)4PzFKyfjVq8K<vU!9VDTLuFs?8+aK1Jsr7b;17m5xLpt<dOo1W{} zKfqtpbEXVAx$R~e&JZC?ac`z0XL~^pN%zzl{09h-4`uhovB$ll87nV3c6W?_Kf|$e zJ=J;bdui<Mp*uHf0Ns$iqTYtb;nMJIApeIWVe5jMh)M=^Ay3V?bpQwbHR75IjL2PY zS5=u6$)6MQBy}I5-yNFb^U0Bs2DkRVScq^RJAJkjdM!weB$mzMyir3$CZt_x&a9if zE$U{@P{E%biZYp3$3X~d*6>ow3sQv<*_|WV_WAT$x9(b-;gY+x_u(zYl$|Z_z1wPU zZ9YMb+pQU*&k=Ikm#OjhO7|NRKRFkI3(m32KP`>l9|S|+hY2{xh)8*nt&I5Pt;9|{ zrh62y{rY;9^amdYxZsykx$jd+3JtrMw-YDkBaRgYgi}e&<@w53NIOaTr`piL7On0! zoXaN}jo{}@z9$Y_v*XR1L%7;z+k{bb5qrZRu;&9<>Yhms!5OCQy}CB)6))dkj5=aK z?q;xS=uM+VSUf#9x!Rh4y#I5mvV^FCFcSC>q+PW2(&BPp(A&0hskt7Jmku=yp;`m_ z{qSTgU-+pgt99*Y&a0imx$3*z%EXQYA3F(bLndaRhffuAX<4t-N-o0Oueq(Ew6s{Z zVnJ(x8&dSczu03nh3`x&3cFSMKF&?miB?pnfq4G|gk=1MOA=mXcETUb9#zJTR0KZR zSQ&&iphz?APoN9M8oJ6Jrk@fdFN`uvH^bUSWm%Li-?+t~Im#?{PnIq1b>YEhj|FAb zccmTK1`nRkD1UFUp*)J@Vv;JZ*N{oJ(-2BezF#aNq0jqp_zc|#iHD3ePB)$xR=f8^ zy@yA4@F_F9k?XYlu3mb)JmkxIliz2-dxqg^1~0uU%8^(I>5THHg%#7o$A8YA5A*-3 z<^O*I>i_SffI=+Y-rYw@0UD1}9QLTR)Bupc5If8WjtzCYxLD%*r$IX|KgCF!Ec2Xy zfLy6F8g%*^u)!r2!dL$(z0!K9=`B}h&_jD}jnEul>*5buv%;PHyYY0&P31{8bWHxL zWL*^XJ{V-k!nnY)`7(J{#v6J5g3BM&8-BV??7r~<V-8O)j%aHqRL%3@$|S{1=`Xpa zx@AN7N%g?E>=k~-Fk~+M{T;(j@?zN%G%UsPi_BnwBev9Z!{K<R%14i%g=t~b%{Q8I zfkLvs@qB`1-`rG#nH)p!K~I)}*xZSWS|flge^M=N54a`jcr%Ys;-BSFMt{0`^UG!M z{0h;VdQfv<m=u{2Vg24z#p{P3*L1-<Yf*|sL1f(rI*Wx@^2}2mDt7GW#CGwx3;jF4 zn=tUy6+)CT&fD<uFK>I!{F4xw;?dh7nQae=$4Pc99dQ>&@dnrVo%7D@JwiUvuIg*h z&e+)uRbt?wzSjp~PjoTg4VL_G#LM?#g`q4YGj%Mh*C&VDTLgUi?Z4<>+^samf0f2U zQZ{lKde(t7V}T;9>X(mS233=WMb~Gp!Q$qXrB3X7k5!#Z9R7Pg+(o%R>EsU_uPqm3 z(sx|-<N5-5I!ixP{3N@^Id=4&I$@}a^}?iWUdnZ6?oHzAvCrM6ScaE>21eU9NXTrD zO1vvlqCur{1XNDtPs@gmgXAEswvCemG&BU<Mz^-jBQz4#{`~c?$u(ST)sJjR`$Mpl zY6c3=l~Xz=464#hX6z{Hzd<~IF*fv8z<S<G^^*3|6iB^C8YB65M)dRI?`4sHfD5)Q zugQ6j%lr>M)~RMn4ck=qTC?@8r#Q4z9IgWC((=6|JR(YtdDA<i)iJ*hL;_76Z180z z_oK9Eu(g}D5Z>*YHXAQ9)VPiXFFaZ;6#+7J7o@OHflemE&(f%d!CbmJm0kwT?M-pZ z|23Rr({Gd<l*#8PV=EG%ye&}&p6?nVoJ{;k18>8S$8!`>5CMDFWa$wlPc8|e(-ZTo zu)i;xJD5Vi7_)p7K5HU0|8kU^LwhV=g-<p4c^#Lx#^;Uiiwk>;A#wAm)Q$cpFS{a3 zb|T~>1a(Sz*ko(}a`=v5nLby1V3{AQN#sJ`FVSE59=${-Q+9YO_NdNGIR=}rkEQ5E z>vWx;8%5U+ht_BNYwk7s-Jd5fg4Cz{0#_+O*<B$|7JD@3C1cm{>Jq6Jw5=TR!Oq@< zQmNPwHcZ^U0hTHy500h6%PhG6bP$?(we!T0!{j-q*4n+%N&Cn+$rTVvB*iPd$YTGX zp`^o4rZ;g<DN-D!=?WA;5t+g7_PZfW7H4vdwr)g}t%e~f`qcFO@Ga-CSpKf9wbs(( zPZEyYyNLAdkd^lWx4-3lpOB&NwQvpG*L6mlj>4}?bKU|hBsdk~9MX^s6hEHNC!Qj{ zhFz812z$Ptp|6nBp$*$UJbHCfJCgyZ-6lgM6>KD4mo=s%C6QuSq9hq;{GtL%i*we% zk~&`X3Ce6Z>_;d2bV$N1gu!?0Q1Ckz78jj+-(pGT>Q&^<YX~ZL&*gt`6|wfW-7BSZ za&hWab~-LseeXNJ21j{r?Aw`^{bjmR?g@02y!-etq2MJs><wvXjV(^0=QD)$>Wti) zCRH}eNjv!40WjNNz9`M1(&9StYM8Cn-Q&3Eg$d>VOn9`iCF26fT>b+9cM5qpI`mJj zf!U!fScP-Q6dG-XS8oQfr2lU4;TRnFbH=bPkBstDx^2`beUPsx%R+%I{XGsrA=oND z)9QsyTwamdwF<Ze6f~w)I2m2v&P>Vi+^F{_#r1Rln?Kou&2KewX#CHa#&gO^hujmK z5zATjKyL?Ch|!b>TaWUi**bKvtIi6Ifm3uK%|#y1R>+6NV&%D=#k45T4@;#tkh&b> zK3LluHO|X2QYbqs&D&?o6x<gu4NS}c4ITI$^MMp^JvKVJL-gFgDcb1EE`7&74}n^# zbotw|GGPDqfL%`i?(CSPJ41~6CM}^{2Sw3sjlkY6MzLAHML4yEk|KNuZntmnE4?6Z z+%h4u;J&TvCrXve)$QY<H$eE0te(|;nV@G%W^x1i?kDzkB%!qS==0I`$HM>9-dTP{ z)xK|k6cq(2m5>^xLqMc+1f*jK>6Y$p7(fK11*Bu>p+~yAq?PU(8i^qX7{+JrKj2xv zH_!V1zUx`{i~VNLi@n#Hb6xwo&ht1v$LRM3^I``5zC=%n^8vjI4olo1e=-zbi&pg% zQ<c`t5kTklBD99}_|F`=>|C}BLK)Q!p{bqB$8onyqwq4Dnjz|m3l$CwGPM!FZ<D}W z^blrux0H^ye=YdOrPckvNXUQM@f-zN?9+RAndBL~)*O*9MDtD%lm+?ZecOGNjf3>e z&o|7cUmO`Kh<;>nVs|0lZhcpUA?}E%r9i6{^)z4hxi}XKdEW)%HCFL#G#)=ji201_ z$DTR9bve+nqi0XrB$-G#)KLY$5$v;-$4WGl==oe%)t8!nKDemVbd22Lh}+TV38?$Z z(Y2|HYw_@M<-!-+>F9&H+C@jH3iZ2b=T2b}uc#ctekv@eRBOVyQBeF=g}_yH-{=Ce zs@6quPJf<5_<aOBrR?f@<xY*bpGl&{tNqfPg8nZ6t^=;%$ZAoh_b(MveFv_yv<W1s zy*&tVVpFyq?mBz42~-!xI$P!`hCM*WzGf1q(UA^q3rfKV4|DosF1m7=+iC#E-g{EY zSuX%2X|Elp8B3&cq!_%;^E7}6Vd^>`M%kvg4h`TqJ(!hWx9hSZ7@^<N3{1{bl#GWV zq5=<z@a^~!2{T8sFE^jYZ5h9F8VWI1f2p-kt})ce5^&0G%xT<h@5E_h8WtuaDgGsL zCcEE*hz@yoW+%?iAL_ptz_~a|^7dL!YZtts)eL`#O(<TT4fhBL>?e0{$h9H4zDgMQ zwzL19`GoqMbZ-TC_uYfW&j9>vuyV1d$d>;$d#PI~Lx&Joa4q;+3myg`M?pIqgh#{5 z(^Wdw7i$NS_ZJHmCtZmp#+~i528Bd2SlSH<L4A~tS?kv4zw-?g#pAuKQ?ypx$V{nR z^O-ZvXne}`33RK+Dq`~ae)&t*v`_Ql@P_0aeuxG{=9sXY-*2?Z$Bb5+$e$4zM2;Tk z=5=Vmorv4(in<v<yed6s_e%yN=q<({n9LY`E_B~=_2T`~vA$6E#{sI^_IUx+!5d7D z<Xa@5ixoPcUlyf@2ike-b#G-nyOtD^UwZ`p4xQv1(?y${WX*o%<P9mVXxnu7K^3}? z0KL>l+p!Pmt^IbN{(T5?alm`L+)Rcj^iSF_1EJsSB;nj+nlYB-#_%O3)$^^ot#sHP ze<3qsJ7GNjT3ehSu2lsVDhQQ${_5b53Om*xYZXWy&>)p47r(q7UDH`j)EF26`QjF* zc5JNTZJK~sTRwN=-}Ht_Qf2ec4g}U%lvfRVu|2Z>avTzy&!9eE6jB%m6DQyQZ7tl2 zp=`yw(JI*1SH62@yaBeqyn<^~os1<Gu4FX6q0=8RQR#6D-hHx%(hfD!uh^t|8Tn0$ z9=;+&LxE*<x8fprHmHErM#SkArNJz_Ohyx2vmLn=l=TJDOMmoKit@QsYqQULUZdF* znBT>sH7J$miz$`P7AI0C9IlEUjB<&&+Eg(6!nbL~Sc_D8H!Z(CKOQ_svx<)U!ra`G zf64P!KBJhbsrrM<R2<mNRpK2vwPdt^mCiQO^m(Y4uGZG~rNL)Kth6bJCsr9?mqtXI zu>mI0Lm5jqO&#OczUADAuQZIaP+LmhM)Q@~`pQOLa6LKD4qPDTuix{t^8d&VcI>UB zAllHPC<jF^a7BnpJLT)4e5W0IRJxtd-k81vXfYszM->+k!mAIwZ+ZsO6^!TJ{J!7h zT_lM|omuJoOsp*TtobZn*Ox2UUYvT@*E9a%)n!;g75S7!M9t&0ScQRoT%}tr*@#wC zve=l1Rk}_@8}wJ=n5pRn++4RlaW-W_oEQ2=rxK^|E8MFX7YOio5t8vdVdU`AdeNh| z_f#H3auldir!76<h}JBTzg;dC_lqhK(wUvQNu1Np(;s*knyHmsY*rt4R3e(VoO;Dn z=I}&s-{_2tS2N~=%PYKiI5r#?&(7eD?Z{}|$7j9gI5VX_J(WI{BK<~mXFR4jC!m?? ztG@utLb}Cjo>u9~`Z|cg^G(^)-u9J_7>f*-VuuFnWYgCRBq^_^XszsL&DQRyrSSHj z$7L&hRlPJmhKQA}d>!-~+4P8;pOv5Hz5BH!mYgU5X^4ls8u5d+4gujr$!-8~ll`JJ zT&z1z&z#Pf#O^?pH|s^{gEVCF53Qv+8JRt8_Z;Z@IoeLd;1}x3Mk9<u{QSak`jB!b z*uBk!j3mk?4w-{Etu)$MbBbK#D%x|~XK|HWtlU|6<mGS>Ys331QLv4v+fZM<t}1*x zc|$V-Qn1nCDSqFZ(l{LS7|oY6?#4LX*H)Uw5Fa6uY98zNbfbd{OJ-U9EPx%a9@@B+ z>{WAS<XLWPSw)8~3A2v3K{`r9RRNvU05)AYJuKJle?1ycbwy7)(2lQm7Yq7j*<XH4 z|EMT02qX|_Lli;|#6uf1e3R{vZFOU8O<i|GGqncj90JxV1xF!8XnmBG8B(L`N>6M~ zGbwDBi9U6;3XW|}Q=_<4Psk(S?lB59iSPR!N!$zn#BSY^U~=@Px9q7)G%`^(BMc{( zHY|Tj)+p0`Pg$MH#d7oM`R4TF2AcU!k!q3Y;$tGW;DzeIh{Og1ci5X8cLuJ>LV#lr z#QP}Vp<&2JhKuc{!bXcOBiWfE{k)MJSC=!c3V{2pUU-^QbjUd0K9m4Wm4||Nd(IBq zm-*q;^2h_#C4T<AAu)R9*!ojfLQHs8;$*y+vM6oiL4Cs%P=#F9+I|Z^HX}TDPeEU& z!1t)+q^-i-#(i(IF0mu!3Oo&d)U;S!7XW1UvDsm}$X*m0z<wJ;J%6Cz&$xG_=uafy zU?E9do}$na(i+$Sh8C%g-7`ijW4+kS*VKM)y8Gezq6gp^j-&6qjOG?Q4-lqTG<HV) zSPElr%JAEMm$->Kw8Y8G3^F<o$Y$?f^TG4S4T(X_c1XE(OuMKpG3%B-{;M0>@bl7b zW!=abkpQN@fUz?T(P&B}S41*B7@2f}vkA4w+H3DqV{&F|QN|KJ`M3H;GWfEXLLqw4 z$~j*z+VTXFD==4wuP@t7QYOtB>P6fpL0>66tzpBhY)Av^<{}*^MiEXdwL99oIUZ!Y zWR{@g_O$A<)LxFK>syXDQwI^584IJ_dav3^rzrij`q!&<^n-eS-B2DOP)#--go~+o zP??wIr5aw%oTQ}XKQFd!6^eEn43rzI<C=s0$e1%d&~{^qU0z0<NNTd=+nHZy96y0< zFt>|yxNiMFEhWY&?ynU^FXi6}(GZc=746k8NH>N}^GBOBxS^(GxJn$d6_Ggaqk0x5 z7;7PhnN_SYvJ%0cK}s0j)o^b7IC4F6bD2u)F+=aDoxujUfC2i@8_tr!MwLA1QQ=$T z>qZW10eWK0y)%hJi=XWKM|UaA_~x?18IlTY(Uvp3$B*M0mRYCy6zk_<d))l^Kd4)7 zSdIemt})v^y}p<Eq<2fsjAO?M6rTo+*J(xrq!HlIW~=DBd!-e<GtD{SLyDmyla6jz z;PcY<dnn6ne7g#L<Bo<#KmS@cU;>31u;0rIqZuVryxHmy;B!)TX*2D_SE%S9pXVO7 ztj|1}vK1rVx_QSw4zlbBtFT%td+l05odP)WH;?5>AHz~xY_Rt2<H&T!@H|JS2i9&* zXF9}OR=eg{!UZAu8N9GIfN51?GN(3(C6;3Pk>E{w%u1-cXo}Y4&hKOMx+cTQ@K=|n zb8)t14@c@7)C?Afej7--CUB`?USWaTkXIA-XiXTD&3Xj+j6R(o7xxxMQ#N#gPZh(t zS8-%^x@G(`PVLZ;b*Zm^pw!#ApV<2|X{_N7TY&%Xop9`n1+=wj9mo$D6}6HwS<eY` zYioQPa+YoL)Wg!@BGhS=mGX14a7R(G7aRmUztCNoR@+6ji@_JAWWIHkFxp$iuR9v^ zVEU5-4bgCz!sm$AmA`<Y)KkX++n~V)iXz^&mS2yoA}@$)q>B3IPLJxSyn!xjCC+kp z4=vC#lW5a2e_1SY{8At_{R3;Wu0T?>kW*F$jhq@*SF3F>!GV^5)nyHugeFTT@Px~% z<NXlNi7bPoLV8{Hie@JE`}?)12n$`Naj&|q9(E`^QWH?DMBC0B9gf`^(kn$N*^uXE zEe#z&H4U-y88yBM{oV<M18TcL%Qfxnz2@ztwYJyphm7X!0iz5J8nl*4u|_gtI*B^M zMNK|s^3B_Z!`bxIENIq(!DivCz=5#$zigVMMftj@<1s%EFUkW6QLYEQZgT6b8FJ&t zl?A&*IhZpbcnoeW{=`SLrNV5auHLkXLp!37rsl3s90rvzv`@hqmdlIaILzB%p<5^R z^SjMf7Fje=xJ`WjLubA)DHEbxZuJV-dbpf<<+LTg?Y~4>I<e_HqtdqV_&md(b=AFR z6AX4cR5$9)W<tK2Sbr<&=J5(Un8bz8G?IPWOdJ&5oYGj9cVm}lPl+Fs=d+TZw3>nE z*VO|>T*rLrV#@=9D)`@d*-xL0#q#;}FwB!VXAa3CX@821pH}`Eodf^`0WKfcV^^^e z$`g}b^Le}DU7lhFx6qTE(TN)0bVhTK>Qw%Zx`Yj>?pWNCKkQ?boMXA(6H7w0W?QLG z5hs^r5T=>GfLhMh;>9~!`rz2;mAZJmL6>*Z&t5Xde=g-xmtWH?Q1lY;7bvPMDdrJk znpxd;T?Rsv-XB82@9mC(^T72)oxMpER5b{<k=C&E$8OuGKjK7S-M*b0sT>yUh$Dgj z1YSf#@fSe8CQO8BgGBG?S+qwLEzT{-&^0tjP_o4aX{lQjei9RSKk076oY399Fs2x` z$}aIN*KOZfsO(%#H~K%_<^8`sj~)9xv4#ip{{@ht#jR@O)@L0gtj!lk@^8P)R;wuy z{cH=AXg@hBbAjy>i`7jL)aAQ;CbZ-DzIGOOSv3lY!C<j+HEnTy4xHE+jTnwrsrv~D zES(v5$yf04j%VK3Na>;yCTQt`qKzBLs{uL$l6Jb<i=jWBDCM)O@6my>*6}y)DUv>g zIibVzVqLrh3500efs&*nf<95PbuC+p7IPk*??Mj@mC+6b`As$;-aji3kIn?;9Hh&% zCahR*$t=?GZ<$~vLE7<Y;@CLoy#!0S!9fa)`_mi69wRzKzYjH2boRU@;efkY>bK}U z4+74fkM>K8tSK1Zfm1=Wv=3J|@I^qlT8excl3;e64AJ?G5c(CPd7#W?`#Egh=wJo- z7x2xf;xZLiQCTWm3`eUL^!&}$V}FT4<sv!nvkj^Zz6gdSDg&BAo+hv+{VU9idy5ig zrsZ4<wSK4_$J`u$K{V^?LVA1R>B#3p+^hcCftl8R2hQJ?&li1~J;v2I@=4Lyp!X^y zJc2j$33o^@SqRE_GnME-V~D44x)w`TXp7v}QnYjLxicf;=(;rRLfeHRi8@8TP8a<; zp4b=9ql!!FctlOP@8EB<p5@aT1?Q1%5v8b1!G~7Z1e&et6hjqTnP@wjO?G7)bLD$e zUW`$7k~LR`*m>pKCc7@Qa&7mT8z&_-2l+Y&X1O1}+GSS&Q5r1pkE#s&hJ-NCH#Dc$ zm*k>?LTrQwM4o=psOvaR1gDaP3!V~6yu^+6osIDBk#-_FNRUa>p}zhhkTVYMoNYJu z{&e}YR<KFpZiNCu+KpQ5Ijpd$AOUlpK5ysf!4;cDmPOaSNcxRfXu!H;QT$}5?!ykB zhEYr(osqY~B|G~MeZr$er4d+SZMJf9p}+g+6Jz(}A7$?|ePb)IyB4^DCtIH!+mN%w zJ^^=zCu^f|37(bdiAGm5Fr+rk;e3*M_A#mXr`G5|;&C{<&I7~H{(k1tRqnT}OH+Yq zW|Ha?i6hsCJ~A0);QUot564AABKjJ_wb{~L$m<aOI&xx~YOYnOt8X`0aGQ^hCx>F{ zV7Ph)IQG)c@8h$YH`V=XK|G;yVW2qd_qbGd4?`EG=)?aL$-g`V@m{ELtXP!~dwImE zuF9z!fB&06i>dDT53x43-LP)*L{)789*66r)F8arE?EG?Y9*DLwrQPe`E}Y<K+#g* zu-pLsK0A&xCTXwA`z!D70a1wL=#y+#9LI;a2FR|RLhaUH?pZeeYf;HBu_)~aSP_)h z5tz$tEWt9Or+*|`_+2LDbUiW|ZVMofVT+vzn$GuHBR9yf>vOuaGyslh*|+0OBW|mt znQs$01NFQ<%;(+s%S@$&MK1pZtT6=Y*+WVA$f%_qVen<FkJ}1OM>#ltLjt_~4eE!5 zcQ)64apM0Ga(CSy_&S}JK#{EZ>Z`xBcYS>V7ThVB`<}Mok~9waTp9@ub+4cLH2J8$ zn1?+eXG`pcmi-4(;A=SsAH@NSWoVhAfT!vp7_wpQxbN9DIs;$u{sqwJ_GEZAB)io1 zuf7wYj=l-7)o1102}TQ}BFqq@ro0(R#zd=C3zVnIzd*OKkK8bWFZqscjN*#CT|yRK zx3=PB3>N@dFJgqbrm(xB&DF>ipz#BLNb<z5)N**rco^Spac?F92`@qml!zCu-?DBw zoTheqUYK@)V!%A}DdtY{t`jw)(T0PAZ(QZC_+F;0rdOI@g9R(?^pLI+&G<a+Mqw(Y z9bi2Z+k<SnD8=YJ(uB>pBoQJv1KwFzL#2tKtxdCp{!)1!xj$olS+Ur}4V8v4{U$_1 z7=OAA)hC${#)v=cAIhbs>a3i^?xs91k-U>bi)!R0e7nh%{^GP%{LVjXz{~>L_&+^q zNWfRJ`#$HT%_=G6p$<m89x0kho=XPw<{w0Qu^T8!$2(z-5ooBC7b`ni>$nEgwiC(U zbg9!m{QQ$H?wITe9F?A-J)@!6z%^sJ{(N?I&*050k!T!4wC>!|8^2%Q-WjeWEuer> z9<gE)`CM+UN?P1k2Vsf895mQ=N0bXoM08wfN{aR*>y&rnx)u8#SUV8>PjFH-2)l#) z;;?b&hIuxsKChuz)2%1bu*Kk<<9F{vYF=~p-Yq|x!8i;<qFB~AaM^Yf!SqQ;dY`N< zED?qitf)iwpJt5yPtPOW4txoDup3BT+kg8}a#b_t@n__t$6_JAk>^7!IHw&OPTe44 ze~#(Rn&}D(>C6G=pwuPL?MBO=OdSTI8tXL7{pkkH5V!@+R&5A{$5uesp)n2G=q}=d zhWSu9C1mH;<Hv9YD<Om0u9%%B=Y}|VU`xr_XH4#nUBl?)sBpanUSpfAp))>f{_|t{ z@Yo7Zyp~+wYrl(KZlzBu_tE*H+Xdnwu!+=80r4!B`}uO0Uh=#gRlghPxjqq*9%0Cl z3=oFjrY#SixKx`1yAf~{hHpKQCEg`SaGVsj7WYCR^dedbJh$_j$@u67i=;1AkZs~^ zr3@}QP_6AkJS`yhdEic$=Yy*!#b6`6b5=~Na$UTlDm?X0Ie0c5;4u~9Mmzj<!hNq^ z0y>ma;}=6~%p*Tl$vb<nmCQwgCg3Z$*v|10zRV#^2S$*`vlzO`$KG)NbHEjY6xzwm zfC;_xaaE?wViCAkuIPmOe%d%Yq$WeXK-)6U<SU1?9Br2g&1-519n4uwMKO*T<@s)C z)Ps`nb?OoB?y|H>yWph9Lt;BJWeeu=s3u`g(@~$~tc@5aDZ_f<w5AZ)JUnduoIqa@ z`CPH%W4OVj`NX!trwx*J9xNgiym1_&WyIW=sCI(Med_S)LHB?w_r+6T?L-uIF*^=j zZeN8BRmEL9P+(m?(!Lj!aRd|iqxkAn^Nn^k{Pn^?vc7d#-Ftgg;Wl<C$d$LNe<VU= z;LfMu@N6UP410F;pN;`(HcdDtZ!9P$5a!nqNwP0p5a4vS^MBIeOoU*)>cFE2(9M%d zu3qT9x-34W1@qtg&LrPDT$KWZDSu;+u6hi={WWahQd@!_8!;>lT?9uwQ<`l?c3};c z^)cq(8ke5~a5y0*xGG6o!eLOq{H1Gw<TKqdn25PL?4+WNc|e=2<x`uK8}aVi`T*+p z@HBy9)0|DR>u&uO$%v<9rFjHCE;kcT?KeoB-q4g-nZg8L!val_NBEZL`OCxLkYnk} zHq)}#Iz_VME0HQsE?->~>I;g`Gn}S<b$|S;ze_V{FEKj!yyOkcso03~GiSQ_I~fWn zH_tXeWwHxFmmyve09;^HwBBwACM|H7W1Aahxj4Adj9PSYdFsOYF~U%%Qjm?%Gj5`E zVJ}hMF7WA@6t%kC1nzQ*^T1K*&22UdiM`R1(yvsG2_5tIfBKauW~ZVdv=?Rh@HE#6 z&j@_CgM}XsWcw6FD<=%%Uc;1`Ei4p9B4(>I4YeW#H8pKb-bR}rT1L2|YlH54#<@*= zyP?%Y=B+4O^;~89M^U!ikK=J59C8c(h`||2ZlE-`T})d&737P8cVl>F8K*_1xnmDI zruGnQ$yJxq#@oJ$MoA|F>uup-=7G;`)iV^aU3Lp?hmvOiMY+{*1w%*NZ)nFKnB}{? z+9>N;x5d2;`M2+6t_1HM`qpQ7Ijt{~u~afFbXGkUG8->+0X{)Eea(J{^y+Py(_2+Z z*W&*y-KFo{KQ|TdejK6F)NB_OVQDs8<rpwZVlcLL&hO#$+`v{pKl+*&xNZd7w|n)> zTUF=gUV2r5&432<=^~xR87(%4+$aX-t*_kDAh$-h@WH5K<z`yJmQKx8bbA2YGR>7& zQ`?Z>mqtj&M-2@$-3Kci*NzG=cGn-1wnn&>D6}xQ8fo4;pq8DSZn;F1kFPH-6UvVk zOz2-D%v%W6KaM#EfbeqZeeAJ>*nKvi>&UIGH`l?=!gscXM}=fid}VfLK|JBaJ=GOk zlKI6n3wt(9`*h#FUP1Hs6|+p1b&cD+6841U@KxJqw&Vn&;fb9zLFX`=dI8G5bAHdN z>%^fs%|BxDVnNt=+mH0Cyb;v4V}H6dKblvG0>qSkSA)>_ejb4i>xZ16TJI1wIuV%B z2X^Si`&$pQg8|#3KMGTSAOvXEW>hGA-rGw)2CCTbP2SHN_n81v=<-kg<biPk<mJg$ z+?R6^WiD{2X<ftn$Wm^odcdeF=pp3UoIm49CfQpVm}<O~;SyoxO4>Q;u4ag3u=ERc zKwc!vf8&Ldgly>k3n1{9Y~Vid{V3q{BX2~TFzuZ0)T)nb&gd@ytb6QF?{kT&*8k&n zvgV7k(!QLR?r`t=-UfE$AWqz3=U@zOtV;5Y_!c))l@?CVcXPHeet%b7pvuqCPN|_i z=6mHHv7^Ba<uz~v_J@X-WN8&8d^Ii-#qni{xIO5q;zdLia#B2?v|_^tD!8Bjz<1^< zvh_I}#d)KMwOlq;Sun~cJ$`w~H<l5UgUodKi0gN9+^?Un%ybG)b#bDn&A)}N8&1mE zb!v9_^Jl)@B=(yv_SWvh)oLKSa)_Fuz^a^+LuL;S)OlbwVg%X=_E$x<*>y&`Je}L$ z1{o5{YL}(o$>TcO;wBa!$l(q$S4c4A!@>ReHXzC{dEe-rYt;vFueypcQ$HUspCXd> ziPkk2)P)XITQi-l@2hS0u_Qldj7C8Dr|U6U?6$)LdZX!wnGzL}zSkl4jg=Og*Htq) zK5Z;GO<-b_m%-ggVQpD5g?W<_>*c8RT$a~|Mb4}e9zBzFSBB{99^8hB)*;1wx<5%; z<^#*$EVHbN!9{WmlgCU|79i&YB-CF02W>foUdL7|Y_*S)*DYs#D;C5pTQZ=Aq8w>M zNv+3`eV7%enud%r2|SixfhxncNe5*S8POpnHopyE8ZI`oNK%gIbpC?%^R^HA<70Dk zsmnw~fx>)}Z(HTDV#aLphg;QlWiCInCwC~WaN-RPJHFQ8GcD4LggBjmMsFxDv$zJt z>3-owFc>N<5vBmW;VKkv*V~1yttZCVKfA6dhVzVq$E0Mu@&c1r0d5j)ivz|DX#WHx z2wI@=raDft6+<$lL9%@F*gi49;%(h{_=S#B4n6ye5gedNPl%COrMH{r$x=UuLcgEX z+)tPd+E=qui$kq~ITq%qHN$uHM%f-EFfdGm{=NTB!VagH?a$(SlK^F(MNsajEM0k3 zwQ#r=1)Gcn%$!_o*tq=!Hs7CHzHFmN&~)~2bflOck+~xTl1N8#z4VuCzsuvJUnhFZ z*w^tTKE#$X<8=(YvuiG-INCWt*@YbX^iL&Mx<yNx!y>f$$J3mfkeQZca`hDHNe#sb zIx_2hdZuM8irM}GUB+K9)GQ1qF}A^wos7c1xJy#9NM;O9nTQa66?0i>Y+}+evvRBZ zXg;d}^A~GfNVFq=lBXa4Es@}g5H$bQRlFitFFg!;Z&D?3ee`9eMYH!tg3m8yH@YLL zI3*delrxwIsX2$a&j2=<uOU&Vy>;@i58eB~&-1CK-xpQkA2i?+xNOxFAHH;~-LMev zLAgc6_Tl*@%v*Up$X|jp+}*soBfdbLIXb$EAq;mlvcf+-v@)Y`&Q=e0IaUa8sx^M| z3B;Wi0btn$bfVeGk}7R$Jw@)w`-qoy3$(Gr@<%G{8OXZn`ow_kvN+an?@TruCYr<) z)$G_cmFHe<H<cYK7%Hrdvez_7Bu;#lRU6&aovM@fV2%3eoPU(F3%a?`7`Z6MjzG_e z@KK(|L`!<hV5gmf3F4V#F4|*ykf*HC@v?S<h9P-X*mn3Ae-5|&QF}5Rmks?+vXyxm z<-7(NdW<izH?W(~cXk*2r|%ZjchVzasG-#$izN89q}%ki<nW>rd}(->1`cb5lA}s_ zIBNusO&SuRT%t!#zBkELj@#I^_+t<@ArSCie%*`Oh<mi#&NI1LJyW~rhoUx#`1VXZ zycnJc;f8cx&e|~LuIWSR5R5S~!~U>&<$yG4kzmws#BrE7Gs?k#ruj0_!~6hk@kHu4 zJ*4|4(<|`};f6?|knEU%ZvX+L&l`Ia99eE&Gkty#AUWSZk=Rca=cI5AM&P2KAH1Kf zsO0h|_h5=IF>hY@IUf;cfU{7Rz9DW~m#+Kzk)}w{Rtc>{tWX83KNSKPdh=b6E2dWe z3*q9c>DQ9T!EC@MP?q6zD^T=(Tl3p*0lQS6A>W^F8!4Gj5iy(CFfG4`j>UT`$hIu4 zWkUq11;Cj*W^xmxX42>{g!-fyz616c4>VUKg*9kZcCa#Sj~DmY<>TBm7r?$T1;q?0 zFE4VQq=PdO4^>;kVS1rke|$APQ+<CujH@LT(g?dOy?WQ@5yGo*2yO3RkL&&TY_zV8 ztsupKns&)Dh~L5E4y^d}&Be1_-yY9*MD@oC6CoRn$%oBt-;<SkXx*jU12Lr=Ma{V4 zD;H4yf{$+>Mg|feq9Wh>Sw@vVhK~Q{Q~naYy`u6MEA`H;EM47TTo|}?FjEd!uQv^2 z%i$h(g@vF#wd>!SG<;WdJhpo)w2X6z*fS)HM}o8_r_}?}3+O|(oi{C$f-V<3?xUXf zpPH#O3Df4?y#~D+FX~5NuK9+HG2;-1`Znv_^cg=Be4nkz%)qATojrZf)AKzHpAij6 zc7l_s8RtzL2@5x7I)MFT^->Wz8Z*V=Q;r>Y@3k4tSe~KIUv32oS6YUe`}>O$73|i$ zm?~^<Yc%@75NHYRt=GXuVN_grOdzb!%k%>nbxi82F&E*jG0Et!@Fr2aTkfSn$8DCi zncRLQ*JzN+^cg&=9T4!@<{7AVPvbJygA2Gbr8XMSJrFs_?Pd8%H>1QX(GZ&)zAW(u z?by|gxtx*4X88g43}!m8^AN)m%ue<wtbzJ2Z*d0<r;h7yvI9{OJ=veRnyF-HZV2e+ z6Q%8azAH@?XSN5TG}K>GwpX98v@mP%?7MzK9i6z+8e%xPreCsoMm*T~xh3plg5W`) zJHIiddjMpKw}SfFyUl^uJ*-FAWoFpBrC%Hvwz7q26nF3Ck-9g`L*z0kc0k3WUop;$ zRP|`YJ4^!g+_961O$g_)i&Wv2<}*g@0*<v4*jLF9KCh}&+c1BJa<0%ya+NUW(99u? z!q<U>{E5ZVFq9|gu;az}Db*agtNu=D*8s->^WE8j{=l*f(TasJk+&6wL})F+JNdTv z)a++9j_+L6?ieW2SbDeZdZT^kE~Uc)D@1)5)raAVI@BB48T-5vm^zT{RqtD83mFAf zSHuOmqdZohFBTquwd{?e&UX&!fK(VOOx3^5i)54epE?fzZNE!-SULFzbDG4i-}|Yn z`WAOKeGTn%Vl0LHPKfMICco3N)&@Xbj6$UW{ya#5HO<Qi`WTtfWxzF8#lRUhylpn@ zV1=k-LO{^CPX8}pTrN!RCh|_bxi;)(dA%{hGNS(_wK?S}m>M!BEbvuyIEGEC$dFbt zRuwxH7YV-ZW5{Z`(ewdU1aKqSFD+->br$4#yF951w^G!w(o4PLp4&UdA*>p%iS4`7 zOjhR>L*h2W)H8XF6<tF;A$b!IkP;TYGwOqP;w;9age%XYB|7y?K~Shz&oNchD#5m( z0qAGChFy3fEb)3>m-ovIqSxxlg?8$+8XI5Bt;^v+^<a!Y`=20a#`oTnZ8tydeEyNC zg-XYwW@(xg&L1<d1wd>Ij%r7bm&sMlOEXR;#&IsZ`xD3psAAkP$SRaontoD=BNynC zxOg*L<&AqOjVeU42{Kom{FxzpZW2}T{#ro{X{>|Bs_s79S?f_J&te3ofx6AcY2_8| zI&QmQb=G?)z!33&qMT`N{yEY#PZgQPE#;bs!*bxYkVk(3T>@4KIu~4Dy-ZEnUb-Jx zUY}up9~!%Qi>zZA*%08~f!X>Y-K;_b4wVA}4?K0j_iLh&dNmkBgYsJ+izmxizvCnj zU*KE3t)t3V&M2u&h-3w5a>&Y7P3Ku3bI>))P>6rRxtU&I!5Q*bycM@@&h_EFrUJ)@ zJq`3BsuyG5#u7kQs{-nJUB_;~DX(@8eT`l~J&nRo;Y}qhILN<%eo&3T*YhXTdlQ^6 z%FSy|(UPDWTB0?(un7#cZH>HWbGbv#-pqKlU)j%}*Uf)od|S+ZAf_Vk(vajq?x5%W z(idOs?+VoF!VyLem5`AIm4cyoLtr&6E&i7kyem@w5iQxBl+XTL#oiM~Abb?FLfWgW zBu-AEQLzD#uN4jXU2x~sfpH!X&|%p|w6>B#FxlVG{@S}UeJ{+DcHOQH<#7_%1H^Z* z2=BSE_l)6QW(e{h3Cy{y94bO!LleLKulWW4ADH(azc>B-jy)5}+yf`{u78(al<4FJ z-IxzU_ql&p#r<*+She%Hj^C@^uI#1Gj_VH-v9e)No7;yqHfMu*cI=|a=stp86S9F% z0d{}Vu?<h04eVfy94#`{K3HL0v)Bq1h3Fk=(OlycI(yO5&N7V+3w^VSTWUaQAI5B_ zSd{=cD@>afCr6|CLBeI&VDI`EY*<4X==P*zUDL%D!Z^APBpE6Dy7l#{uLZbg`~fod z7w`j8hg9!9Fk+rQI?sAtT_qF$C&Ad6{k#T4;y@8N!ZwaUbD^}NRSQVUUGfGfqaUgT zf$%sfq3=-om?!HeDLwmPr~SwJN!m7cgRw;I5B<O)kf$i-^}AAuTyHyY)yLi8$Cl`E zz6CXPZc@o&fC*uc`tSdIyw!i(LjUjk{96P6*1*3t@NW(LTLb^r!2e%05cqfg{{Z@I B#&7@t literal 0 HcmV?d00001 diff --git a/site/hello.css b/site/hello.css new file mode 100644 index 0000000..aba0df0 --- /dev/null +++ b/site/hello.css @@ -0,0 +1,4 @@ +body { + background-color: #212121; + color: #ffffff; +} diff --git a/site/hello.html b/site/hello.html index ff4f652..52ef689 100644 --- a/site/hello.html +++ b/site/hello.html @@ -3,6 +3,7 @@ <head> <meta charset="utf-8" /> <title>Hello!</title> + <link rel="stylesheet" href="/hello.css" /> </head> <body> <h1>Hello!</h1> diff --git a/site/src/main.rs b/site/src/main.rs index 435d748..55ea439 100644 --- a/site/src/main.rs +++ b/site/src/main.rs @@ -1,3 +1,3 @@ fn main() { - http::build("192.168.179.2:8000").launch(); + http::build("127.0.0.1:8000").mount("/", vec![]).launch(); } -- GitLab