From df6d7c7db221b9280ed8aa96460c76d28814e989 Mon Sep 17 00:00:00 2001 From: vikingowl Date: Thu, 21 Aug 2025 21:59:34 +0200 Subject: [PATCH] [refactor] Remove configuration files and assets --- Cargo.lock | 701 ++++++++++++++++++++++++++++++++++++++-- Cargo.toml | 40 +-- Dioxus.toml | 21 -- README.md | 70 +++- api/Cargo.toml | 7 + api/README.md | 13 + api/src/lib.rs | 2 + assets/favicon.ico | Bin 132770 -> 0 bytes assets/header.svg | 20 -- assets/main.css | 107 ------ assets/tailwind.css | 0 desktop/Cargo.toml | 13 + desktop/README.md | 30 ++ desktop/assets/main.css | 6 + desktop/src/main.rs | 17 + mobile/Cargo.toml | 13 + mobile/README.md | 30 ++ mobile/assets/main.css | 6 + mobile/src/main.rs | 17 + src/main.rs | 134 -------- tailwind.config.js | 9 - tailwind.css | 3 - ui/Cargo.toml | 8 + ui/README.md | 16 + ui/src/lib.rs | 1 + web/Cargo.toml | 13 + web/README.md | 30 ++ web/assets/main.css | 6 + web/src/main.rs | 17 + 29 files changed, 986 insertions(+), 364 deletions(-) delete mode 100644 Dioxus.toml create mode 100644 api/Cargo.toml create mode 100644 api/README.md create mode 100644 api/src/lib.rs delete mode 100644 assets/favicon.ico delete mode 100644 assets/header.svg delete mode 100644 assets/main.css delete mode 100644 assets/tailwind.css create mode 100644 desktop/Cargo.toml create mode 100644 desktop/README.md create mode 100644 desktop/assets/main.css create mode 100644 desktop/src/main.rs create mode 100644 mobile/Cargo.toml create mode 100644 mobile/README.md create mode 100644 mobile/assets/main.css create mode 100644 mobile/src/main.rs delete mode 100644 src/main.rs delete mode 100644 tailwind.config.js delete mode 100644 tailwind.css create mode 100644 ui/Cargo.toml create mode 100644 ui/README.md create mode 100644 ui/src/lib.rs create mode 100644 web/Cargo.toml create mode 100644 web/README.md create mode 100644 web/assets/main.css create mode 100644 web/src/main.rs diff --git a/Cargo.lock b/Cargo.lock index 4d04f11..1c7e039 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -26,6 +26,34 @@ dependencies = [ "memchr", ] +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "api" +version = "0.1.0" +dependencies = [ + "dioxus", +] + [[package]] name = "ashpd" version = "0.8.1" @@ -43,6 +71,12 @@ dependencies = [ "zbus", ] +[[package]] +name = "askama_escape" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "619743e34b5ba4e9703bba34deac3427c72507c7159f5fd030aea8cac0cfe341" + [[package]] name = "async-broadcast" version = "0.7.2" @@ -195,6 +229,77 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" +[[package]] +name = "axum" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edca88bc138befd0323b20752846e6587272d3b03b0343c8ea28a6f819e6e71f" +dependencies = [ + "async-trait", + "axum-core", + "axum-macros", + "base64", + "bytes", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-util", + "itoa 1.0.15", + "matchit", + "memchr", + "mime", + "multer", + "percent-encoding", + "pin-project-lite", + "rustversion", + "serde", + "serde_json", + "serde_path_to_error", + "serde_urlencoded", + "sha1", + "sync_wrapper", + "tokio", + "tokio-tungstenite", + "tower 0.5.2", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "axum-core" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199" +dependencies = [ + "async-trait", + "bytes", + "futures-util", + "http", + "http-body", + "http-body-util", + "mime", + "pin-project-lite", + "rustversion", + "sync_wrapper", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "axum-macros" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57d123550fa8d071b7255cb0cc04dc302baa6c8c4a79f55701552684d8399bce" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + [[package]] name = "backtrace" version = "0.3.75" @@ -362,6 +467,20 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" +[[package]] +name = "chrono" +version = "0.4.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "js-sys", + "num-traits", + "wasm-bindgen", + "windows-link", +] + [[package]] name = "ciborium" version = "0.2.2" @@ -400,7 +519,7 @@ dependencies = [ "cocoa-foundation 0.1.2", "core-foundation 0.9.4", "core-graphics 0.23.2", - "foreign-types", + "foreign-types 0.5.0", "libc", "objc", ] @@ -416,7 +535,7 @@ dependencies = [ "cocoa-foundation 0.2.1", "core-foundation 0.10.1", "core-graphics 0.24.0", - "foreign-types", + "foreign-types 0.5.0", "libc", "objc", ] @@ -568,7 +687,7 @@ dependencies = [ "bitflags 1.3.2", "core-foundation 0.9.4", "core-graphics-types 0.1.3", - "foreign-types", + "foreign-types 0.5.0", "libc", ] @@ -581,7 +700,7 @@ dependencies = [ "bitflags 2.9.2", "core-foundation 0.10.1", "core-graphics-types 0.2.0", - "foreign-types", + "foreign-types 0.5.0", "libc", ] @@ -760,6 +879,14 @@ dependencies = [ "syn 2.0.106", ] +[[package]] +name = "desktop" +version = "0.1.0" +dependencies = [ + "dioxus", + "ui", +] + [[package]] name = "digest" version = "0.10.7" @@ -787,10 +914,12 @@ dependencies = [ "dioxus-history", "dioxus-hooks", "dioxus-html", + "dioxus-liveview", "dioxus-logger", "dioxus-mobile", "dioxus-router", "dioxus-signals", + "dioxus-ssr", "dioxus-web", "manganis", "serde", @@ -921,7 +1050,7 @@ dependencies = [ "serde", "serde_json", "tracing", - "tungstenite", + "tungstenite 0.23.0", "warnings", ] @@ -960,23 +1089,41 @@ version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fe99b48a1348eec385b5c4bd3e80fd863b0d3b47257d34e2ddc58754dec5d128" dependencies = [ + "async-trait", + "axum", "base64", "bytes", "ciborium", + "dioxus-cli-config", "dioxus-desktop", "dioxus-devtools", "dioxus-history", + "dioxus-interpreter-js", + "dioxus-isrg", "dioxus-lib", "dioxus-mobile", + "dioxus-ssr", "dioxus-web", "dioxus_server_macro", "futures-channel", "futures-util", "generational-box", + "http", + "hyper", "once_cell", + "parking_lot", + "pin-project", "serde", "server_fn", + "thiserror 1.0.69", + "tokio", + "tokio-stream", + "tokio-util", + "tower 0.4.13", + "tower-http 0.5.2", + "tower-layer", "tracing", + "tracing-futures", "web-sys", ] @@ -1064,6 +1211,20 @@ dependencies = [ "web-sys", ] +[[package]] +name = "dioxus-isrg" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff7e1701a498e214dd0c4a99fdb71c256405fc019a5c91663678ac975dd26ae6" +dependencies = [ + "chrono", + "http", + "lru", + "rustc-hash", + "thiserror 1.0.69", + "tracing", +] + [[package]] name = "dioxus-lib" version = "0.6.2" @@ -1082,6 +1243,34 @@ dependencies = [ "warnings", ] +[[package]] +name = "dioxus-liveview" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b78d90b5d593eb39e96d7892d059c085af5ac4c29b4257b22646e37c1c5ef0" +dependencies = [ + "axum", + "dioxus-cli-config", + "dioxus-core", + "dioxus-devtools", + "dioxus-document", + "dioxus-history", + "dioxus-html", + "dioxus-interpreter-js", + "futures-channel", + "futures-util", + "generational-box", + "rustc-hash", + "serde", + "serde_json", + "slab", + "thiserror 1.0.69", + "tokio", + "tokio-stream", + "tokio-util", + "tracing", +] + [[package]] name = "dioxus-logger" version = "0.6.2" @@ -1166,6 +1355,18 @@ dependencies = [ "warnings", ] +[[package]] +name = "dioxus-ssr" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38e1fac097e71ccec4e9e15d44b68393be2981276e42170703180bceb0b6f122" +dependencies = [ + "askama_escape", + "dioxus-core", + "dioxus-core-types", + "rustc-hash", +] + [[package]] name = "dioxus-web" version = "0.6.3" @@ -1308,6 +1509,15 @@ version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" +[[package]] +name = "encoding_rs" +version = "0.8.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +dependencies = [ + "cfg-if", +] + [[package]] name = "endi" version = "1.1.0" @@ -1444,6 +1654,21 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared 0.1.1", +] + [[package]] name = "foreign-types" version = "0.5.0" @@ -1451,7 +1676,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" dependencies = [ "foreign-types-macros", - "foreign-types-shared", + "foreign-types-shared 0.3.1", ] [[package]] @@ -1465,6 +1690,12 @@ dependencies = [ "syn 2.0.106", ] +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + [[package]] name = "foreign-types-shared" version = "0.3.1" @@ -1980,6 +2211,11 @@ name = "hashbrown" version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash", +] [[package]] name = "heck" @@ -2062,12 +2298,24 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "http-range-header" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9171a2ea8a68358193d15dd5d70c1c10a2afc3e7e4c5bc92bc9f025cebd7359c" + [[package]] name = "httparse" version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + [[package]] name = "hyper" version = "1.7.0" @@ -2081,6 +2329,7 @@ dependencies = [ "http", "http-body", "httparse", + "httpdate", "itoa 1.0.15", "pin-project-lite", "pin-utils", @@ -2089,6 +2338,22 @@ dependencies = [ "want", ] +[[package]] +name = "hyper-tls" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" +dependencies = [ + "bytes", + "http-body-util", + "hyper", + "hyper-util", + "native-tls", + "tokio", + "tokio-native-tls", + "tower-service", +] + [[package]] name = "hyper-util" version = "0.1.16" @@ -2113,6 +2378,30 @@ dependencies = [ "tracing", ] +[[package]] +name = "iana-time-zone" +version = "0.1.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core 0.61.2", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + [[package]] name = "icu_collections" version = "2.0.0" @@ -2264,6 +2553,15 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "inventory" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc61209c082fbeb19919bee74b176221b27223e27b65d781eb91af24eb1fb46e" +dependencies = [ + "rustversion", +] + [[package]] name = "io-uring" version = "0.7.9" @@ -2497,6 +2795,15 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b3bd0dd2cd90571056fdb71f6275fada10131182f84899f4b2a916e565d81d86" +[[package]] +name = "lru" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" +dependencies = [ + "hashbrown 0.15.5", +] + [[package]] name = "mac" version = "0.1.1" @@ -2568,6 +2875,12 @@ version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" +[[package]] +name = "matchit" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" + [[package]] name = "memchr" version = "2.7.5" @@ -2620,6 +2933,14 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "mobile" +version = "0.1.0" +dependencies = [ + "dioxus", + "ui", +] + [[package]] name = "muda" version = "0.11.5" @@ -2658,6 +2979,40 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "multer" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83e87776546dc87511aa5ee218730c92b666d7264ab6ed41f9d215af9cd5224b" +dependencies = [ + "bytes", + "encoding_rs", + "futures-util", + "http", + "httparse", + "memchr", + "mime", + "spin", + "version_check", +] + +[[package]] +name = "native-tls" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" +dependencies = [ + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + [[package]] name = "ndk" version = "0.9.0" @@ -2950,6 +3305,50 @@ version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +[[package]] +name = "openssl" +version = "0.10.73" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8" +dependencies = [ + "bitflags 2.9.2", + "cfg-if", + "foreign-types 0.3.2", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "openssl-probe" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" + +[[package]] +name = "openssl-sys" +version = "0.9.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + [[package]] name = "option-ext" version = "0.2.0" @@ -3485,20 +3884,24 @@ dependencies = [ "http-body", "http-body-util", "hyper", + "hyper-tls", "hyper-util", "js-sys", "log", "mime_guess", + "native-tls", "percent-encoding", "pin-project-lite", + "rustls-pki-types", "serde", "serde_json", "serde_urlencoded", "sync_wrapper", "tokio", + "tokio-native-tls", "tokio-util", - "tower", - "tower-http", + "tower 0.5.2", + "tower-http 0.6.6", "tower-service", "url", "wasm-bindgen", @@ -3564,6 +3967,15 @@ dependencies = [ "windows-sys 0.60.2", ] +[[package]] +name = "rustls-pki-types" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" +dependencies = [ + "zeroize", +] + [[package]] name = "rustversion" version = "1.0.22" @@ -3585,12 +3997,44 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "schannel" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" +dependencies = [ + "windows-sys 0.59.0", +] + [[package]] name = "scopeguard" version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +[[package]] +name = "security-framework" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" +dependencies = [ + "bitflags 2.9.2", + "core-foundation 0.9.4", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "selectors" version = "0.22.0" @@ -3669,6 +4113,16 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_path_to_error" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59fab13f937fa393d08645bf3a84bdfe86e296747b506ada67bb15f10f218b2a" +dependencies = [ + "itoa 1.0.15", + "serde", +] + [[package]] name = "serde_qs" version = "0.12.0" @@ -3718,12 +4172,16 @@ version = "0.6.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4fae7a3038a32e5a34ba32c6c45eb4852f8affaf8b794ebfcd4b1099e2d62ebe" dependencies = [ + "axum", "bytes", "const_format", "dashmap", "futures", "gloo-net", "http", + "http-body-util", + "hyper", + "inventory", "js-sys", "once_cell", "reqwest", @@ -3733,6 +4191,8 @@ dependencies = [ "serde_qs", "server_fn_macro_default", "thiserror 1.0.69", + "tower 0.4.13", + "tower-layer", "url", "wasm-bindgen", "wasm-bindgen-futures", @@ -3936,6 +4396,12 @@ dependencies = [ "system-deps", ] +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" + [[package]] name = "stable_deref_trait" version = "1.2.0" @@ -4063,7 +4529,7 @@ dependencies = [ "unicode-segmentation", "url", "windows", - "windows-core", + "windows-core 0.58.0", "windows-version", "x11-dl", ] @@ -4109,13 +4575,6 @@ dependencies = [ "utf-8", ] -[[package]] -name = "tester" -version = "0.1.0" -dependencies = [ - "dioxus", -] - [[package]] name = "thin-slice" version = "0.1.1" @@ -4212,6 +4671,40 @@ dependencies = [ "syn 2.0.106", ] +[[package]] +name = "tokio-native-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +dependencies = [ + "native-tls", + "tokio", +] + +[[package]] +name = "tokio-stream" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", + "tokio-util", +] + +[[package]] +name = "tokio-tungstenite" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edc5f74e248dc973e0dbb7b74c7e0d6fcc301c694ff50049504004ef4d0cdcd9" +dependencies = [ + "futures-util", + "log", + "tokio", + "tungstenite 0.24.0", +] + [[package]] name = "tokio-util" version = "0.7.16" @@ -4221,6 +4714,7 @@ dependencies = [ "bytes", "futures-core", "futures-sink", + "futures-util", "pin-project-lite", "tokio", ] @@ -4270,6 +4764,21 @@ dependencies = [ "winnow", ] +[[package]] +name = "tower" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "futures-core", + "futures-util", + "pin-project", + "pin-project-lite", + "tower-layer", + "tower-service", + "tracing", +] + [[package]] name = "tower" version = "0.5.2" @@ -4283,6 +4792,32 @@ dependencies = [ "tokio", "tower-layer", "tower-service", + "tracing", +] + +[[package]] +name = "tower-http" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9cd434a998747dd2c4276bc96ee2e0c7a2eadf3cae88e52be55a05fa9053f5" +dependencies = [ + "bitflags 2.9.2", + "bytes", + "futures-util", + "http", + "http-body", + "http-body-util", + "http-range-header", + "httpdate", + "mime", + "mime_guess", + "percent-encoding", + "pin-project-lite", + "tokio", + "tokio-util", + "tower-layer", + "tower-service", + "tracing", ] [[package]] @@ -4298,7 +4833,7 @@ dependencies = [ "http-body", "iri-string", "pin-project-lite", - "tower", + "tower 0.5.2", "tower-layer", "tower-service", ] @@ -4321,6 +4856,7 @@ version = "0.1.41" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" dependencies = [ + "log", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -4346,6 +4882,16 @@ dependencies = [ "once_cell", ] +[[package]] +name = "tracing-futures" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2" +dependencies = [ + "pin-project", + "tracing", +] + [[package]] name = "tracing-subscriber" version = "0.3.19" @@ -4413,6 +4959,24 @@ dependencies = [ "utf-8", ] +[[package]] +name = "tungstenite" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18e5b8366ee7a95b16d32197d0b2604b43a0be89dc5fac9f8e96ccafbaedda8a" +dependencies = [ + "byteorder", + "bytes", + "data-encoding", + "http", + "httparse", + "log", + "rand 0.8.5", + "sha1", + "thiserror 1.0.69", + "utf-8", +] + [[package]] name = "typenum" version = "1.18.0" @@ -4430,6 +4994,14 @@ dependencies = [ "winapi", ] +[[package]] +name = "ui" +version = "0.1.0" +dependencies = [ + "api", + "dioxus", +] + [[package]] name = "unicase" version = "2.8.1" @@ -4494,6 +5066,12 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + [[package]] name = "version-compare" version = "0.2.0" @@ -4652,6 +5230,14 @@ dependencies = [ "web-sys", ] +[[package]] +name = "web" +version = "0.1.0" +dependencies = [ + "dioxus", + "ui", +] + [[package]] name = "web-sys" version = "0.3.77" @@ -4732,9 +5318,9 @@ dependencies = [ "webview2-com-macros", "webview2-com-sys", "windows", - "windows-core", - "windows-implement", - "windows-interface", + "windows-core 0.58.0", + "windows-implement 0.58.0", + "windows-interface 0.58.0", ] [[package]] @@ -4756,7 +5342,7 @@ checksum = "a3a3e2eeb58f82361c93f9777014668eb3d07e7d174ee4c819575a9208011886" dependencies = [ "thiserror 1.0.69", "windows", - "windows-core", + "windows-core 0.58.0", ] [[package]] @@ -4796,7 +5382,7 @@ version = "0.58.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6" dependencies = [ - "windows-core", + "windows-core 0.58.0", "windows-targets 0.52.6", ] @@ -4806,13 +5392,26 @@ version = "0.58.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99" dependencies = [ - "windows-implement", - "windows-interface", - "windows-result", - "windows-strings", + "windows-implement 0.58.0", + "windows-interface 0.58.0", + "windows-result 0.2.0", + "windows-strings 0.1.0", "windows-targets 0.52.6", ] +[[package]] +name = "windows-core" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" +dependencies = [ + "windows-implement 0.60.0", + "windows-interface 0.59.1", + "windows-link", + "windows-result 0.3.4", + "windows-strings 0.4.2", +] + [[package]] name = "windows-implement" version = "0.58.0" @@ -4824,6 +5423,17 @@ dependencies = [ "syn 2.0.106", ] +[[package]] +name = "windows-implement" +version = "0.60.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + [[package]] name = "windows-interface" version = "0.58.0" @@ -4835,6 +5445,17 @@ dependencies = [ "syn 2.0.106", ] +[[package]] +name = "windows-interface" +version = "0.59.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + [[package]] name = "windows-link" version = "0.1.3" @@ -4850,16 +5471,34 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-result" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" +dependencies = [ + "windows-link", +] + [[package]] name = "windows-strings" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" dependencies = [ - "windows-result", + "windows-result 0.2.0", "windows-targets 0.52.6", ] +[[package]] +name = "windows-strings" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +dependencies = [ + "windows-link", +] + [[package]] name = "windows-sys" version = "0.45.0" @@ -5216,7 +5855,7 @@ dependencies = [ "webkit2gtk-sys", "webview2-com", "windows", - "windows-core", + "windows-core 0.58.0", "windows-version", "x11-dl", ] @@ -5382,6 +6021,12 @@ dependencies = [ "synstructure", ] +[[package]] +name = "zeroize" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" + [[package]] name = "zerotrie" version = "0.2.2" diff --git a/Cargo.toml b/Cargo.toml index e6043c7..30fc656 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,28 +1,16 @@ -[package] -name = "tester" -version = "0.1.0" -authors = ["vikingowl "] -edition = "2021" +[workspace] +resolver = "2" +members = [ + "ui", + "web", + "desktop", + "mobile", + "api", +] -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html +[workspace.dependencies] +dioxus = { version = "0.6.0" } -[dependencies] -dioxus = { version = "0.6.0", features = ["router", "fullstack"] } - -[features] -default = ["web"] -web = ["dioxus/web"] -desktop = ["dioxus/desktop"] -mobile = ["dioxus/mobile"] - -[profile] - -[profile.wasm-dev] -inherits = "dev" -opt-level = 1 - -[profile.server-dev] -inherits = "dev" - -[profile.android-dev] -inherits = "dev" +# workspace +ui = { path = "ui" } +api = { path = "api" } diff --git a/Dioxus.toml b/Dioxus.toml deleted file mode 100644 index 7e2b6b8..0000000 --- a/Dioxus.toml +++ /dev/null @@ -1,21 +0,0 @@ -[application] - -[web.app] - -# HTML title tag content -title = "tester" - -# include `assets` in web platform -[web.resource] - -# Additional CSS style files -style = [] - -# Additional JavaScript files -script = [] - -[web.resource.dev] - -# Javascript code file -# serve: [dev-server] only -script = [] diff --git a/README.md b/README.md index e4adc70..3a4ba36 100644 --- a/README.md +++ b/README.md @@ -1,34 +1,72 @@ # Development -Your new bare-bones project includes minimal organization with a single `main.rs` file and a few assets. +Your new workspace contains a member crate for each of the web, desktop and mobile platforms, a `ui` crate for shared components and a `api` crate for shared backend logic: ``` -project/ -├─ assets/ # Any assets that are used by the app should be placed here +your_project/ +├─ web/ +│ ├─ ... # Web specific UI/logic +├─ desktop/ +│ ├─ ... # Desktop specific UI/logic +├─ mobile/ +│ ├─ ... # Mobile specific UI/logic +├─ api/ +│ ├─ ... # All shared server logic +├─ ui/ +│ ├─ ... # Component shared between multiple platforms +``` + +## Platform crates + +Each platform crate contains the entry point for the platform, and any assets, components and dependencies that are specific to that platform. For example, the desktop crate in the workspace looks something like this: + +``` +desktop/ # The desktop crate contains all platform specific UI, logic and dependencies for the desktop app +├─ assets/ # Assets used by the desktop app - Any platform specific assets should go in this folder ├─ src/ -│ ├─ main.rs # main.rs is the entry point to your application and currently contains all components for the app -├─ Cargo.toml # The Cargo.toml file defines the dependencies and feature flags for your project +│ ├─ main.rs # The entrypoint for the desktop app. It also defines the routes for the desktop platform +│ ├─ views/ # The views each route will render in the desktop version of the app +│ │ ├─ mod.rs # Defines the module for the views route and re-exports the components for each route +│ │ ├─ blog.rs # The component that will render at the /blog/:id route +│ │ ├─ home.rs # The component that will render at the / route +├─ Cargo.toml # The desktop crate's Cargo.toml - This should include all desktop specific dependencies ``` -### Tailwind -1. Install npm: https://docs.npmjs.com/downloading-and-installing-node-js-and-npm -2. Install the Tailwind CSS CLI: https://tailwindcss.com/docs/installation -3. Run the following command in the root of the project to start the Tailwind CSS compiler: +When you start developing with the workspace setup each of the platform crates will look almost identical. The UI starts out exactly the same on all platforms. However, as you continue developing your application, this setup makes it easy to let the views for each platform change independently. -```bash -npx tailwindcss -i ./tailwind.css -o ./assets/tailwind.css --watch +## Shared UI crate + +The workspace contains a `ui` crate with components that are shared between multiple platforms. You should put any UI elements you want to use in multiple platforms in this crate. You can also put some shared client side logic in this crate, but be careful to not pull in platform specific dependencies. The `ui` crate starts out something like this: + +``` +ui/ +├─ src/ +│ ├─ lib.rs # The entrypoint for the ui crate +│ ├─ hero.rs # The Hero component that will be used in every platform +│ ├─ echo.rs # The shared echo component that communicates with the server +│ ├─ navbar.rs # The Navbar component that will be used in the layout of every platform's router +``` + +## Shared backend logic + +The workspace contains a `api` crate with shared backend logic. This crate defines all of the shared server functions for all platforms. Server functions are async functions that expose a public API on the server. They can be called like a normal async function from the client. When you run `dx serve`, all of the server functions will be collected in the server build and hosted on a public API for the client to call. The `api` crate starts out something like this: + +``` +api/ +├─ src/ +│ ├─ lib.rs # Exports a server function that echos the input string ``` ### Serving Your App -Run the following command in the root of your project to start developing with the default platform: - +Navigate to the platform crate of your choice: ```bash -dx serve --platform web +cd web ``` -To run for a different platform, use the `--platform platform` flag. E.g. +and serve: + ```bash -dx serve --platform desktop +dx serve ``` diff --git a/api/Cargo.toml b/api/Cargo.toml new file mode 100644 index 0000000..c525cf6 --- /dev/null +++ b/api/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "api" +version = "0.1.0" +edition = "2021" + +[dependencies] +dioxus = { workspace = true, features = ["fullstack"] } diff --git a/api/README.md b/api/README.md new file mode 100644 index 0000000..110c02f --- /dev/null +++ b/api/README.md @@ -0,0 +1,13 @@ +# API + +This crate contains all shared fullstack server functions. This is a great place to place any server-only logic you would like to expose in multiple platforms like a method that accesses your database or a method that sends an email. + +This crate will be built twice: +1. Once for the server build with the `dioxus/server` feature enabled +2. Once for the client build with the client feature disabled + +During the server build, the server functions will be collected and hosted on a public API for the client to call. During the client build, the server functions will be compiled into the client build. + +## Dependencies + +Most server dependencies (like sqlx and tokio) will not compile on client platforms like WASM. To avoid building server dependencies on the client, you should add platform specific dependencies under the `server` feature in the [Cargo.toml](../Cargo.toml) file. More details about managing server only dependencies can be found in the [Dioxus guide](https://dioxuslabs.com/learn/0.6/guides/fullstack/managing_dependencies#adding-server-only-dependencies). diff --git a/api/src/lib.rs b/api/src/lib.rs new file mode 100644 index 0000000..e688b58 --- /dev/null +++ b/api/src/lib.rs @@ -0,0 +1,2 @@ +//! This crate contains all shared fullstack server functions. +use dioxus::prelude::*; diff --git a/assets/favicon.ico b/assets/favicon.ico deleted file mode 100644 index eed0c09735ab94e724c486a053c367cf7ee3d694..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 132770 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 vKYngAlX;?f=+C1!yQV)7 z5&Fn29NwdM&^~(iha&g+hmAsBp47X0_ipau3; zOiB3r>+6q${B;vb?k+;mZ%_4OP~TItm#Dx%(?5+Adlq z9%@-VT_^I=uTQ7-)9VkrOMEhJ;3@d?@woV&pU-BCfBpLPZ)at`?t&kU3N67^Q9=*T z+{(IRzLkfGZO)_;t;AVbHYUa{_L^ajr>X0{>znMf8NL&uV*Cp&D>e`_SR}^Yis>3HFe%B=fKE(W*%QPt-iRX!1!H4 zt&h{1S{ppnFCAo&=IYbYNZ7>P_%3bBy?X6!wgu)9H~sDls4tC}vFxUK=A|XCv$M1R ze|glcFSo%nm|f^o;sKrwxwp5SIMm7=zIFTd=@HXR?bBF z{0k&ql=gn^){wF<-zWdJFu81__<57>3J0W?eBa}Ia-&&w?&_^(QPI);AzoWS>xA-c ze>`aZJtwB%PT}#B-|yG||8?!!HSaCgro1_;ukkEEX@`4g;-~BTxZh8yG+^+EcGcJV zS-3@kL&zY)iuvw_i(j5RzEO7GSK+i%*5`}w7vG2p2>9@Is&;taieGiVoAwABIPdxK zsQclnRjb&SOz}MJZn%hl5fhWokE7q*_T0M0tXU#v+VamjCrrVR+UekKK=ibCT_hG>wj-{ zxW_(0agpD$r(3sf-JhG4^^4c|w9CyVsW(TyJKm7%c~D)d8xdz_n8mOuwoovEBPPdz=5hpU-BOyDLrHRFcce z@uY0ww?o~5rT4-gPGh>O#4_J#PNwZrvqrZqP5rK1i*|EM*Z)@jk{7|efm2P|!|{)x zQ^e!r{r`_vzu)`)Ki?FC7w)V-B^{=HsM=c&YK?fhWGQ%d+<3UQ_)1`^aAIyagL&S2 zCkIPbJ(HJH_={~g8a9}E#R}QaHQ}1SM#I&|Fn@t_?t(vI<>lWG>hJw>NftB(b0=s0 z#F>VbpPqE>+qW+t2{vcrgNM}^7`sDmNlws}QC3vE z@Z-zk7gcYcz7RUjR8sUYMCs9?Lx)7U#r0}*?0;-_zsHc$sT;kmr1oug{O{f=o6P^M z)o$td#JFL(++3xWEywuF-yOQV);2*=aSQj6bv=iYuKbrzUUa-STRm*itz4%G9hWk{ zA9GN?aPMB-r){~n>*lSU_u$UXV(r_vZ@+)@>Q&U7FLzoR5;()(BFMS-nJ`o8mF=5ohY<_j`=mo*;mGu|WDpZ<48;bXmhkNd2p zzCX@AANhp$0Q-SgS66TEk+uHz-Q^13l7J1JTnR0vkMn(FGx)PIf-W>EPC0Q(+acl1 zH|ZT2A%?4B+@|EsNt0H}xxer4jm*o-YR^6YESg$0$NK%A;Jllgo*vq_Z{OtPnue6A zQ)Ws`OPO%G`_*SV_V-65Cv0m`6TIqkUPjIPOJ0@y?SH?rTW&`MZR`EI_4eC$R*yQA z_x%RVRn>;EpI$8gQ{w>pfnBAqKfGAnzwgtp*Xyru-@0|~yft$j3%uHdH<*gJ&E8f} z;%Qj3jA?aFa2;n8>$E9iO(%|Z&t-gJlK(9un;zJ2noEt$N!y1Mzxvi=_t_P+qC z_x(#tOYg3j^6A*Oi5CuVvT?UvVO!<@L*!W8577ew6ABzR6}`9+sc_|9%h&7itq*2} zUX%>^l`U;u_9p&b?f1L(e?QOveEE6|JP(*3-AL|#y7`>dYk9f;<(iQ|8PWT$fGX{YD)^PBEPvMVv`T>9;C>h$U9;bCF-Y)i^ZQk3kOZ?Nk`Z|mW=ezPH0 zS6A0vb7>d5X+qz=vr`^RC?o_cbf~J@g;d|^+p;4qHZu<7^+v92a@&AgdtA8&DNXyNAdq+2V+Z`zm7B$P|b{?U^Djbu} z)Wz;Uq`BGPq5J-}^^3&LoZBhr@~g{}fq`)Y>m?yyf7_m4)&F`5^36?hE;JN9__*|T z2ZyVx>+a`gXMf*mS^R8G)$6s}+g`qV&i2W;q4r4j`n}&gN=v`;`&{;kPMpS=)1OgO z7_5Bl%NHlkhNUeFSyQ4`bw6fTP<@cZ%*}mgNBOY|5pU)rlDa!x{r%7DXg=ky|FT#< zwB~Jg{OkXRRj0=oeLQP^|Bs`Bz>Jx%ZuFJxY!WlOWBNGYbF2R0aI;&UG3ScT@*8yU zmgL8`|6Cub~^oMn`HN_P3&vRk`m=kKe`$bZJ+QpdKT|HsGv z`kqs#PW3iABy^=l7EgF`*S+9I5zhj{oaE{Qhc2cr)evOynLg*@_L7&E0{{OwZvSun;>C|k)|#q* z_3p@6>#{OYEG*$#>3-*r3%L)pF&eLWH@Vl}xnW`R-H892-z#oNWu6jtj>khKAo-W?1;)<^Qt=5~Z(2}us-MW26@9yk; zpL1h_qWP9fd<;)k20M2M``cXny#N2-_sbFtDmWXS`WY$IYU?S#NIHwFBlkTFeRx4`&(*Z?3D%TK*-p%{o-+b^v|L2_j3tjJVTC^DOC_gFM zx$f)lzvavxGy6{Q8A?e1()m+REWC|9blMRGcQfuM8r=S$Jnz`$%B20elTdK$)X~4s zCmwvj&TxN9=8Te?R|}?2J^YWM(>H;uBU%&X$pPh6ln!E4DuKHqwp1Fd(s;Ngm z2){r1%e&adZOxr&iw^`RN*Q!~tZ~=ZF;F>~vC+rxZM;Viiz^r7!G_&wI?Lkz3X90r ziFC9~o;l;$nJFTD8`znfWSmu}G{%0v)ATKTKBGjynTs19CfxGBBedZAi^cu_{;UdJ zeXITHvS${b*b?j?Y`dMuz31~e>$kPFwer`aeouaO!Cg2rhcV|R_rhbj4=y#qs7`0KkLIg5Xr@Bi!j z{$MTNO>L9-t{?1c+3-65fBUj}TMpTck5cvu7ynyi^S?YRJNx`xyV_rETeGj%?JzHF zQLtZr%ReD4Bs8>k?cTkA!=tkO-;`H3G92uCpw7JFqsJZVwQR?yiZymL=5#f02+lmw z#CxzMKPU50eA#yEnVoCqFwK(W&SDm5aMTN#TPLR$U#aWSu~+NIG8<8ghh7_+7Wzh< zc~Sjabj{vpToYuQ)Ea_An7cZw&&{*_y{Y_u?e}YcuGIfme9wHtUqR{5&-3;BZa)6_ zM=w)a!OHf!z?zF9+X}B<6Weo9x=HA!@3|WfpF44Jax|{*TX*2nDWx3`eLimzRS}e0 zVf8nrXaA4a7Y@B8}yujStTp8op8d4_Ms z|Ned7zrE6Cp8k%z@4hx{=D84MJ*%$yfI!sapWotQ_HX6fd#cRlSCmuWu4vbUFu$!a z46|6eV)be^-C_65GPENZ;U!JcntEbeo@AvIyg`i1OHr?w! zG+J!V+1TAaFrP#C)w_LyU;n?~mf=yX;AOtbLt@c4_DE`7Ss|MFW;#goMh@=RvA zw_5JqySHo6qD7AaG)fBAJjhTwqV|jHz_bayg?Wu9?c_U3Zf!08Q&m|U&k>%x_V}iA zb}RmAmS-KG9T?O$>$ASw)z0ONdcq03!fX-BvtCY@+#>3DI+%aqyLGb{9Ckc@@#Pd% z&t1K@-@g0!`>*}KDTJgnugg*a?d+w{lVq!ew+d88IO){$;xoWpH=I3S}+aG1MaK_^7{|A|t zv3YJt;P8<67v%H%;`zYRPmuy`(rzYJf|rea&40A2WxVwHSRJl+{Fwb8k+OL68Og0S zlelMcDQ?M}^?l0JsefM`lg>Z$`e%K|iPcQ?9u;3Mx-%*~D%%||=ETBSvGtnf>Ng%t zRS^%LE;FzT_B3E++@Nri#asG9^&9h*8F75Za+xm=7{876n69wGQ6PmuC%~dyj4Mr+ zPrq7liGaoFs|%+!oK9o0w%+);Z~uXJXXb2IZnHf5713m&^X^SFd0Ho|}b9ow@Vp z4<0r{%fjNd8#FT(o)EBDbAem%>XUS}8%HV@E#(ehd%smy(ON3Q-+-lc@zdu^M7VdT z`yTz0AIpD!N~Qr1a~Gq~rucn2wj4SVDUmly&%e#s^ZS27w4j0dx)zc6raJ~b?_OSB z9uL}|@%P=;@c6UVf7>`KnGJj*_Ev5EJNJFf^SQm!=3(qijg~Gd!Mf}c4lFI(cORB` z%KGew&ACsFJSJ_*KdvofTf@~N^LzoDL$&{*PL4@D%iHFEaF{kd;ZAs6!zJZ@woHpv zE{3lP*_!8@Fy8XC?7NbC^qT!&maqlf36iP2Z)$a!KmDG1{Bh;RUAun$N}pGmcA{&> zvx&B!*b*c@Uh>v|IoaQ?^60m>x5ZtRCT@Ir%Uhu7Ld4bFL{Cq}EZdf;jRyO+F6BJE z>z7P>ZOEMB4Qr+a?~Py-kTX|{|HT`k^OMEn$R@ttH5CgdG2Tuo+4n`n?EgP?4pVc6 z0%3t+@4*QoP6WJ()aI=ZO*;>K;vS&?5ns#s;rHQwst-L4~c5nKg~Ii>g3HSG-Y4K zbA}B98>C-t{CVBpHRF1iL-quw8M*Bpb6)&#`B1etU#9d*V0cXF)lloU-S0nxlG}0H z?{}Ju&)a_AJ8Rag;w4i`58S)_w9eo_*Fi7G?B3May+1D9(v7$(+)$SF!Ril##mq9E zvTJ_=PwF)_BpteO`Mmqpm-88UrYmn>Ya-KLFV!pW8*o8k8UthFv9~vV)tfuC?@}~r zJ`fOa;iAd{muE-bmRy#4>0*GD>q+jqbI>|iJPqJhyEG*2roD=T}w;7jSe zT;KhB6&O4Ztz50i!ooR4W*fugx)0VfQlA!NHqCWp?337%AR)%c)Y0M;@&B;?;@@kZ z8faS}<}sxR-C zOlhq3Yff#LVw}Lc_QCu*1GV^{$~(Nh6AcnhzL9w!WH@EYh7gvw|9^`A3fsrJp-qS- z!}{TBm2(X*Crz4Eoxk_%wfbl5{~KHX@H}8Ra%QG+e(e6bze_XI848a!uw7+UvbYq> zQgQlt;w}HW-b0b?4&1^CtV$C@tJb@U?b+72%l-Y)bJ2DDxA~e(4hpbv^JMsm{dzoW z)~w%RIuRefy35yYQGU$)?BhZOdu9uU!Vd@8?}tQ2{hkA4`$rV*@F3`!{D@UDdW{)A`2EJ&YC(g$G&1SyruHz5Z*}UhAnrk`^qSU8XD?%al$m zQu6tCX}jU8$>~ZyH$AH?cN;Spc-(wZ@mVzI&sWnID{r%0V(}6-R8Z2>(1`fj>0k3` zbNr7(;`b!p?K`7v`6=xu!?D}>`+evC|MPr0Xe7h%^rn-u&z-e#690vdD51hm9tgx6kQzUa}MmF)F7 zy!tZ}CNFkevDxbn7Eut{=khr zm7j0&^73wPb6U7)OK+?33Ge=h7R~#=ENd<=OE1-N?>n>d;`1a%rB2!Jehud!G=q=j-`w={*}8S>JRPcn zCL}PPpHVpD)7IAy=hsa5>~_AW(fy1-!QpL(Uex|}z4G^I`GrOWAr{HY@3dt2roX?l zv-qQ+yUfRT=jK{}c6-3!dXK$;A?enZ%+1l!(fO}mys!|uSUu$wg8;+gWn#wrz9~=9 zvyjsfHA&S{e&x`txTK*+Kq~%^dfA;H+7WZt@*SOi!?JE$or}_szyHdo=|pb&(WyR< ze-d%>ISSy*j%>iN6mz)1!p)|m_CQCjrzLWviMn#)VqCW zlMOzxJzzL=GkyNs_`OwM{mt|5{h3)3T&LC)#->I^(BpG1ofkjx#8}`g|Dh;b9pLaaFb9&RAv@h4^1PV=LP{>^_G$BcP)o$M1c|UENN^i?9 z?AN*X<7HoZ+~&uF=EFA*SMs>r)O?R$k-yLJ@_U^@e&6IB{O|JI@6I(}{PwH(!EKK}%FCFQ^yxi# zBCvxsam(%2yrqj~A36F%(Nntgp;URKsEyF0b>+M7XT7HEtvE3V>U z>+a@*3Hy)RKa8Hr;l$v?_2Zb|;hy(@S?o45MAaNH-6fE4`q;VpJH5x;-?wsE%haE> z>A2^8DDZcoU5kH+=z~7V#}5oyJcK-4co{g=RV;t}(G=kDS+#og?`yW-?y>NX(hMZmoj*&g0g3Mrr>({eLjaLYQH}lC~cT+hQ_J{=Ig* zVqYL#Vlm}X8;1dpMbo0=(?uWj%@i&SXgu;T&i)>ELTV_kVY*PizS@42qxm_{_Jvdt+<%_3~S{Z~Ln&O*Fga&(wCj z|KjubzDLSpP67w?ni7?>J@t9r-dk&Lc>3MG<=yMHYZrYErcCgA`sibxu({vLVGhKHlElrgy$4sVMJf zkx-KJ=FZ~hSEI6(BR2-PpPkI0bmEXw&;M_w5~a^74Nfu(3FR>RWU}cq zG|X9~#Ik{*Df`~hXZLH^%ly^1q%}<1@Krd?wZVoG(F?KgZL&y~4rVG`Fp!}AGI>+Bgc9cBr>%s4#l{(qLev#+_bKTUY7 z?CFx*-y*=m?^#ppW9he6r|gL9@4Iz=wDe`z^5$L{xpnP&?uZ2m8u9v2lK z5U^q2`t|zrjSYBCNH_3Hs?V!X5)~0Svv&RZ|IP{m9=_Mt9rFbxhBg+Y2r#&R@VP-U%ouKXGVgYbK4%q9}@z@!_7Bu-TL+Z z!hj61OKk617~Fn7K`s3M;q>2_sHPK>rz8m%rgxUHu$`UKx1$@iWysOjJakU@*yv%?8KNoLr z?*fZ=Cq3Nmv42oZy12;o-lR#BjCD^-wVO2G_uQW-@y}_>yc#u|tBVyqzFjW5{Iu}+ zw(@`1A0#m7^8c01)&I|aDvUu@TvCxifQik}Pv_I);;XJ7I4(yDIXDC<)w4FL7~Fn; z@Vt8XqHC!NtGwDwrZT0f2t{7GaG~Jsp32XE4%ha(NqsVI;O8uUcIIRLogE*Sy?ggg zd+Rl$I3sH|#|A|ehrVz7mhTY@-uGKOMAz;b=UU4{^@e5vub3xIzJ0zaVUxq({c;6I zY}PU?P>p!u=v~j)(4wrOC9z|{E~f2gWSWC6w>XqcQ0{#C%3k*n%X;=W$BLcCEUpa` zrc7Bb@RnJy)8$#K)55d<_J6<3s(!aKeMkQF4#zsS4~h$yEO~OpL7{-rcsJXoCrJW2 zGD3b=PKFgfdmd17MJZz0#H~f$T}7X6q;1*1S;qJO9{Dv*3VqAIsYy?`mH4gqqtuU2 zGlWETn#|eKaAvx+8sqe@7})s`}6yn=hn;ZKAljmTsVuL z^QYv2x?{rrHjTcs&2%F+CLN8>y{*SON&UPB#{`CiT>*8UG9}7?UQaw!qV<=9c?#>@ z^9_ry-``znYF78u>Bii*2_7356iQ5vSNK<}PjF~Z3{>IyQ}wE1PQbI~1PAV}OSQ%< z%t2BX>yEJV8_w&yrt6c++QAX^`q8gnzdoDg-}~d`?0ooI;;vL>u1e+&^8@4KSnyVbHd>s!yETIWw&$JJ)d9yubr2d_c`AmX=C@jKm2;^ zzwO<=NlbWOv22&xdA0)zNh*C;-t#ug3O^JPy}aS}?2T{B?Oktk`#Wj#b_o^ENDgIS ze?PJDpIL9>g7BLWF;CjOPh=cX_?+4x){w|8vO_|BYRH4T`xwgF=bmU4*|^j%spas) zOj}!9<5q$H?_Rt(;n%Ozzh=UB#y9GBDxc3?m%VQ1vpZj3Uyo;0nfXoFvSsFr2PSTz z3%_mB4m5cELFfMW23->q&J4CCx&i-R+`qW%ji$mIkE+zw9BUkRtlubHfA4N5$4ZUc z2E`NDrX)H#BrJ=6`03(O4S_zNnSRBYUYh>#@%MKIFY~edy6^Y9)BBfvQ~oq}_xue> zN4vOh-@cuHDN0;D`)~n=AshFG2{XQ&l~2CHxxBf>Wtx7BfdmuJLXlVh|8mTd+sD3Z z`}v=1F9fDO&~e~lJ+wO3(dY9{!`tuAo?>^5azEYgDZsL<%C}e#VkZ+}0QdpdDG;~R0ExIGmm$;po;r=^OjWnY%}OKvja36ZbWS@m3& z(Us|lROabY{#)}Ia(b_Y$2)3h+F?6*9R{>bREszn@bYjb3) zdc8g2w0?ahA{s$%d%F`FPX6~$Zbmu>mVB(si^O`SV&hcJJJAb#SM>{NUsXdEI z@pyR1WIuO)8T-YI<4jY}?Gu`t{N)d~?&(Fr{=DE_0E|D#e+%ji+lU0 z2u#e#&i;K1)Vudo3rep{Y2U*rp>(JCylutXt=H4Emri3^;3F5N=^LW|m*-CMac9of zoUoTn4cEj>ga!DLp5Oo9_2AU@gj-A@akaz25 zpP%+`k$-h+$|lc##{RgtBTHn4+5su2_qp1_U*<~ku+>L|g?(Gu%x9(X{|ukvC+`Nu z1Etqv+okjO6o%E-{(U?x)z{7coeJ=xdSxq4~N z4Dy}9;bnO54X08T1`FEo}OC5vO}mLVYx2jjgSA|Ib7bm{qVcDed}&AmStEpo2e^Fv4ow~R5m}ELj*xD%5 zJKO&$_uD+Ll0SH6hE3(COY`QbL_^m^=k>pve3Cx8AicmD4?&+Wcn z3HJZHdiCnp$zCffey(FY&aSiYqEJdrX02`B+;cx%as_)PF!-d1XHDQrwPUuQ8PfXw zS6Om$Jd2p36ywC^b!t_5n^v!WecDCj&AWI1tUxA%Qbef|HHcOI}a%qcu3DZALc|KGIhukT7o|LCld;9)!|)g^K(S9<@Ai(T6q zm^^u}-L&;u!?==Dc#qwmlpxb%zhev{940?jmneAm(XI2)!w>2ADjxS9Hp{&=WxDWf z_b0pu>>6fntp5HknyK-?4ww4=r{{%TuWx6WawfXvkux9bux)soQ3#J8o!E zl_(46H~aH%`HQ-0OB3UW*GF!)20oV)JovWE{LCE7&xbDiS?3--P?kQYknP%<$j{Gi zY)r0y^Rc4o z*L&7Bg$uE;X}2AhR!MV(``NYyo z(|G6c_y*R)3<(l>KltNYIK|`HIF)}1G8k{^km?d?Zaa{$P;rXW>COL}_GTNK%;B=@ zd{yS9DHwfOx=j$Y-Zeh1_UqNs>+$uqmy&g&w!BbWfBkptWfSY<+e{aIY|Ey!B*(EW zRAG_e-&*qUyS0@-3hP3aB@;L{&o$$EDdBoNQIo@B=b`q)U3VDXEZNucqwd}7*Ryvg z9&S5*&hGb{hdcgSHt!Ms!0eP=`|{S-?E3XnKB*Sp<1Ct#5y8NEneW(^*LCdqXK(yl zS!c#swy|Zwv-Eif&Q<3%z4Cp_k)GzE>FAPmsD-n>WcOY3n7W@&7lzzk6S2`rzW&e0 z_a2(sw{G9=_mVuN(%`|wvxf6aV%zb4$)h}%4rwY)N`2ROU)At-?xV8~EWQgpqCQP3 zW}9J}dTPr5ec$g@^G4o3V8Z}fesYLYeU8E3t=HqK4{TcV@6W%MW>=<3Dm_g}J$t`o zYs@UQ(2*^?w_?dAt!Iu5RomAbe-eQ)Iylsg-uU@{KIqS^EOb3fUfsQdGH<>wyq45RzExY zZy%fMf)3l~&ibO>;-Dh*G3WNSw;zK2EK`rR@k)QHJS@-fQ`KSGk1xyZ-^OoFJ9~ZR z&iT*xUw@$9S{Z$qZ=EwVfDNoV)Wnp5t#NeUNkIUi5i?rSd#OMgT%W?i3U(bH^ z-n%uO!k(3<_rBeE|9yPn1xNPU*K>-`o$PYjo^Y^9_PAX2o28+lq3hMTxwY0V%;jxk z(oQHf=*Z8@I<{>A?}4WQbuGLO)@KfGF?z`2oTc+g{6Y8DqXtV@T9hX!2}cOYeywhC zT389H{MIg?Q{;8CZpU5A{y#hl+;d8=MII|YZ~OgfUtiyQrN)mc0xSntUS(%F zkFssocNRVMS`)W-*ZNJHHr?H{rvK))*eP||jb^8t1ccnDa_rdhP{NY2v0G zz2#P#c*1<9?9E=sd^aWa&+`~h3hna@HvINE{6O3D<}2@5ng!GrygvH;!l(Dg6?3>} zmF~}Y?r>z9l8cC$@8|w*G2N=-_;o)Qb?a4SotmPVF41;zdf%-x7dA-jSiDg5dTyqh zN5%_{y^(^7cNe?47%2I%F4`E^7`?pj=o2R9CfBILE2k9g{rm0q^}5H>_kaADr0V_c z=_GfVPizX#I&ph$+}V(LIB01|Y0d+FIgvj1_$-IndOiC;6p5U%k+563(B9!lR94%H z_3nQce?PQM*TC|aYr_JeBd3y$8$Lche!u$b)$sfEZ?|557yRwa*X!}}E7z@yi;Rr? zS+HxH3xjvB-O`T{+4|SMWiXhPq*Z$M&FJ(LIARdF=#qM2nWy4`Ft>d|x3_7}nmxOI zTj}d-hrYONg{Jj1@fBg^V>j5#< zk&!dy?Cbu_diU<#rvMET>62~7la&>?7F@q}Lx$(!2Pb~57(Mkn>UI?d|#Jm-D4H>|s2?@b>Ln_0p1( zJ1e&O?G#fhGWlvdb*n`2$EgM3*OgvLo_Jw#L}=Ru0}h298~#p#ofQ`>T{MZKOh zN$A~+7Y`B)PIzfb9J{Bfuq{_vfaAc^qQJsJL!ZkkYfX3F%?tA4T)QKZ^7D1C zRxX$0WnnU%dF7w7;)kEBnC{pW>$LdEbKYQf-{0fuXh-oNo>^Lyrr3=%A=63f<3)Z)JX{<}Ho9NUQ=DvPFEDojYb z_D12F%|+J$AK8wXogE$=iX9#vnyms(GnQqtG#_MrSa4(dIR+2K1)LgUOy^~c1lz@b zEp}3!*|3n+`4)?>UP(6h{kyxk%iq0fYGPA2VEDMk^|DE|mX_8&i|TK0+UM1NyIEVs zRwP@=Jb~%y)2GY7fBAAJD>BS=5&Jv^#)XV!L8;!)^$%`&UB|t6flLZR)N-}W8U{Sm zE-Z0i5Mg{Mdwavj_Hd;QxtoJ8^UK6WFIWHfWq!C((xr9|Cd-Rl0%{dJcg%`)`gA`! zHyf`pe4ta_!I9wB&$jO79_e!P66Hmur%oMnX=!R|+O=uZrt>-X_tjS3GI=f7QzN3l zDOdBsQQ+dwX{n(M9xG-aUm~ddb%y9wiSIkTAL^}W5!0F_GFgV@zy+owTwGj10wv}A zWp{qMvy|ts6_*GU>zM0(X0*N2eBbi+3?s&5cY~&CX{$v~PqAz{k>cQ1%lM`yUZbIV z_36Mgj~82(D1llZJHCDU_PWpV*^E64GPs`1ZQ$IHa#Cp5|9`*xbF#92aWaJ0bmZ!D zFghFG5Rs_;#;Rfc(D^$M^=?12Z~q^A0n5yHH?Of-CDAV&$GzpPYbafA%qw*0z}CsD3&TnyZ`B$Y zw+M)EwXXZ~Cfz>T;LhEG1xoo0LJM~6_)&6u+w!CLepu<<-xq&!-W>BC%XbJp*8d@7 zlNx%#MZkbz*$SQTA_Lcx`m+|!mfrAHzusxXzI&C|Oc#aL6tkX-S?0?4{p$9`=gX#< z-tx@wla^H|6YBTKxFVrfvu~Gxo${*93NBN`Y#(%-3Gh0&X^r9O>H7cQf!2!JIBGC{ z@@}v&FqW%&u`si=w6s3y*`k9-trwrumi(M3DN+8`Kd|=Aat6WB{pSO&%U@L6wVYeJ zzE*eF{VKr?Z!L8H&zZ^W^4sqK!v;MGr|rBl;jc=y*gV`{nZ)J`uDI{#^I^w@H0?ES zcpWDy>r6WIpzGbccZ+xJ-hDqiGc(fq&fkIsiuTMMhxb%|_ImyLb$#CLGT%*RJY^cY zbP_~F7XM0CZ)(|i+#;nTqOSh@s;Muc_cNUevowG4eOFwPMv{w2L3y(FziT(1dd$*h zR`OoHROP{`i$^0uo-ju=T{^pM##sl2f_q2B(QAK( z6ABL85=)oP_;>g9gLwwrhc?V@pJ`N{E65PLopts8uc{GyWjnGSJ=0P7#?jhhnw&bn zb+Omp6<;kXd5xrVS<*yy#LjqQSm5tGU3u4}WuJHL-mSi6`}XobUzXd~{(iZ9{<){? z&T&;TGq_*37wVi5y)Eabp|N`HZ(&9@9s|QuV)Hu!pVu%RDser1H^}S!HsNo|5p4`J z6b?J)?0lWZa(y4?U3*qPou{&YH8fK@X6h*!E z%mp3C=H#2nZ;+KG9w7=ZDYd?eEJ^>JdLB zqg8XER#0$H-1^f7J?l%#%jcW?`1RPNUsB=djzo8EH_yiPeQQrR$fX|mx256Xr5%qK zXvO@hGrsnf%^{_EO35DsP5};laP& zda0?#$z+N>v;wr!X!7QSx%di&2alKXbLgkK7018^1clx zI=*-L%`iyZcCE_J;76_(%ZUhIYsG{g-3I?2X(#kZaUZdGtGRGa!~O~9avE9J=)S)A z``PM%C?+rG%}m;DU6Vg|{dQ>)I1gHUH}B!Q!bw>g_dz2H?o`>lvZ5) zIh|3a_~TLW=R!9hF(fe?Utpp(nRd*TI`%{_~ZfL$*cxmdV zWM-CL19ydmf@|)#?AraG=`2@6YsK$_H*Pby&dfQTm6fFzyRW9QV#jYSX%jQEZ6P5c ze-4u+J!@?iJ6BbxIo) zB)Tq_$sPPy@p}t@*bTS8w%ZpM-{s;c@cEMd{#&8u+8{5Pk_(RYd!J15wks;SKHDt! z(6L_W>rVf=F)+qTT@qjUG`noz_{t)gDutX zc0OP5@ZIW%$2v?IUSC_QeQ!_Y=Ws#s&+@hx^AD7k~b|QtPM82?eDyv(4Y{4-F0dt~#Ib zjbn@C{#*CjLK_Qi&8TxSSbS)T#jYF7jxYPgdDu?hx^+wM*PZ8f=1IpH44URP+`W7E zb5(Wq{^ZDM_L<5`4gy|j=MP`W|IZWhpmf#4BN6qPX{($pe$~owCOtp9-|_sj?{lK+ zE*8Z#^FM!c!Q|{#VRb*7?AO=U_8z|L|GVkzZ1dZ#t*zS3jR%gNdD9!4eCSV&;suGo zirv~BmskDy;Kk-~K+|KIc*}whQE*VW5EK^nt@N^qbP#7T$Jq&ID$E5A?VrWW;4?uj zLr5~PHIhL^$4CFmqwM5U55z8(DEo3QHr-g9nUk|;!`ijFZ;L0amMCOvnECNWa)0fv zojZU2Nl9J*DDlVM6;`i(3?e1FtH0%EbAK_pmi&8uJ?rY_>bccQPM)48kKMX;>vx~+ zw;K=Ntx|MMPhXywm9=aAvSrWyO*v)56j0#2@ld>U)J9X0Mm6cClr1S0QU(mXJ4_y4 z4qZCq+2`hy3*|liYVLP%Y|EA3Rr>ncO2~;4?kuzH>;JX<`t>VY==cgwg}!BvjCz`s zdUih1`r+o=e1XL~O4GT1af++a=)te>kdP8kBlWu9Y_qk@4Hqw8 zJ{;ubq9n-1F#R;^?QILUwq?%J(9!YPdD=sz>E69KEe(x^+i%-aBRSd+bF?4+P_>t% z{ji~%;?Zj_^R`Pb%XH#!G(5iIZHnfk%vl?9rCnSmdZ^g>&H^3fd|=z#8UC#;0tGu` zc06p8&bYE7@P9^DmX)y#U%$UfPL2QjDm=gb`|kT&4GtMR;%PYl+8 zdxg9H&t0tT#p1xF_$KA~s;l$vx6b^KlFfhb<-5Zhm$o{v^_-3nGgDAt`LOkt*Pp#R zrDs=7=KptN+1IaMm)n0hz+BJ%p+xO`fL@}DWP|Z}o5^A8<7!LZ@S6P4U7|4aSMe|J zJ}bFP(a%oQO>FAD@?KF`EhmvN$AP_i!|VKVg-f@14mNB5RB;w*6+4j=P(Q`s zLc-ET2Eq)yt;eH&ZCJ5}L+{*%Jpuo}^(b9#U42aKakcdA3(4LJt!~Q3zs+)Qm3%wY z${ioGuclJtG4oRfw<-JymzVh#zkcoYhn7X#ZT7c z;;osEvjQ^eKFxno^VpTaY>RWi*&jCFRTb55rfYov>iF&Y`V~_yZsWPs(>{CmhnV8( zYsb4UHlEjCf2c6EE+xoK_CR21X{mCbgh>+5fk~>~Hr8cteneTw$gSS$=j2~{$*1+D z>(`mj59+LMWaZ6hQnh${pl9mmZOx2d)>UzCP*&iWP;ja$wP}V~y;=VMA5VQY`I~jj zSLD6=k8NJ^sX7)0p^U9MHRaL5R=IcoPxo;N=4eoJo0$0E^3zs-Ki>2C+-jLi-S!6zlXyTkJos(X(cWsMW0`&S zlCnKpxa-=_yH_wx?v2XxXE#(=6-7PD-me_RdWGq+{8`%!zSae-j;p>r zJ;dlRk#~}m>9WT4eJh*VTa1MZ%jOl#_E0JMuzLNzs*k4EV~mq(l9dlJ{CTQhU%3C* ztJUhu-t#nls0iHkgT>>9;jy}73EDkv?eE+&o`2IhmGE?;K;SNw!^gODYj-T&C&}`h z_nc8Ln*u|ST8Heyjr!Nb9$rw=H@O}7_E=-&e38>4C0n;_srkKb_q$cH?@s^UFyS+( zOnh$t|EI?3O=-(>x!pb{azBtYXH0ZlptJnY#CdXG_UxBxkUOaIx|Y3BVUY~WLAItf zh5pVA*34#8HYjYFm{!f^=ro!4fZNo}1jmK^W}e6WjThAJX*QDK3;*)49#@mQAp%QYw!YMC5i;ZP&{#M}aNa4d3??7xFo%WJM_(tTT9zawI^SqM z9qPh<$ZY!Qua^Tfrc7VPcH!Q=zE`haiPqNE&S#m_$t)})BGD3EUj8U}>CqLX=?j&8 zcpO`VwQFaDq(73iZVIuBTDw(Uf+z0Vwdnl2dZv`YYG+bMvUVhPvnH=Kee= z-#*#TD$_YK@@D^%DPc+<1x_+}rf=K4?)Wj=-rNp>gl2{nTb>>|$Y*?kTX_Bo4HhGX z)K;g3H;>Df$DFffF22Q3Qd+9Z*XlGmXuYZGlGDwfCfl*T{Fb)0o{dpZy0_n!W80E%?8vzxoty?Ap6)cG~s%Tj} zFV2z6U8L&!l)}YZ_BB)%EyYQ%^r^ zm#=%9yZ!F8`Tx`%LPJBVQ&XRwXW+T?s=RAm;g$m$7bLb7x@Rj->08yX(=X=OSeSvvKgOAnt$oiCDZV@%BO9U{j4}Ed5(R1dpmK~ zv!d;{{~kK9-;yoHGJf$+QGT;83Bd=LJeKr(Y$$soYkF9u=X}W2MR!=v1;g>= zRp(pJhlx3EW^i75>hpqQ$Bt#6v;Y5RPHOJcC5$UptkC#UwKp_VTIj)C3+_XYTPGg; zGGDO!Dffy3^ILND5-wJ|*se-Q81wp=YdVKQ67>uYNt-@1KUoqyIR z_y3DC%H|8?U71&E#&ejp^^4~2CdOz6AEt-p;fr3{|7XdReLDShOQN$POSR3s-*S~t zCQdzkS6`krrs$+<*1;y$^+)UcX6%#x`ba;US4l&JCH?twWdpTeTn1<7@9OZllCQ#V z`DB7}`|kK};zfNNB~Pb@KYF=*{=Dngu1zyoZzsm2#Lz07eqhDAHl?=HW(!hEs^;?q zdNM4`-Lk%hdtyNNmda1&0)no7wqLKb@BeXBzss4=vW3CH>v*b!=s$@gY(1yvrY{v~ z5eV>d^y0j1BG~DY5Gm$!xg}BJL)Bgb9_Fa*E!(#7+1P1mZ}u*H|Msn`g20W}<;yY` zZP_BiAi&oy*y$p`*RI&oaQty&YUJPNBEm5nb7%7$ZkSTE{&VMKme>0WZg1o4Q&VJR zYBW=vwEnGZJkN!dCUNgy9W``)_vT(o&H@*=04-htr=LQVI-9xwRIJ==u9&I4&i?7OwbA_cPp1U)EZOu$KJdvDMvE5< znm=4{=9gWyRnPy6f-tiHPZDEf0L%LwnF6;2KeHKXOw*ml!qYaPIm%hDWyZ%V!TzC)KTcfD^l6{-iLqjD+^tQir#+)y zPfEF5&&V{fDKLz&+_hKPkhL?Tz+QKTh?Dfa_O2V5Pn{l}SG>(Am~9=htLEi5^A9%d zkMBI%uNIugCgYsv-0bioNqW0kc~gWlC&R2u9oyaemy3#tR~np7UzW8EcOxt)KZ^?#Px(Q5xWw0VPA<~AltI67tUPS^Z!^3x`sSA3gJo^j_X|Nn;n z$rMHj^Sn9xH*6?y3VJ4QF>6uwf`mUI9Q9>)>XRA+F6V98|4&FlYx0~)Hs7QzqUz>e zSZZR%q9kD8u;lV9b0gy!JO(0SVxkKSe7`28xs{iH-&z0TuzXRU*qmUt1=ewdrUGvfX6zT6XSC z0>i8v0q-f*oT_fG3T102hUiCc(|P`b!7`O$Ti)GQ?_a)@6c68=$1uk+TSWAL{nrI= z^yiu0x>un(ORwjTP=bWxjmJJ)w;WowPhf_q0*lAe`(ZA&tg1}`8AsMiPdeQuzW>7^ zZg23E|GqDZu6~jYhRMf5BBzD2sFbA%TITHSs&qf7q3dk+bQ!||zAp=(@7;P%M5x*J zVddQY3!T^K3x8j^SW2S#tWU@~zX+*MH#lJsXz|-%gLm3rwtf?HhJ^w3a~m4X)b2IUHD_~f z_EF|~|E=wUKw|sExznz#b<|-{6Om$b+xd{=fPkaGgf|Bj7JZtk9loo5H|Tse(t|Ir| zg(@%x%#!M3DN9-4ad4?>pXR5p_x%rcwzGhbM|$+);^M!D@0vSz&QWB#Tl4ws(ze7O zxz?<@;w+n2u*@@jEX!waw2`szL5pusK{9j5jl|_krJf`o?^|pC`Hb=XFt4{)qS&Vf zC8mWjYzgXWKByopSZyQsoS`ryFV8JAQ`6_N%$EoI|Nr~FC+)1%^C+Py=J&%>oP)et z7A;bmQ}gL$_1qF2rOTHuH!oVWsPVY+?QMyXVn1v4NjL{^D5?m~Y)cgJ)O5G~`D8M; zdG4(#MmxJ1Z0=v{uyK-;#FZWn#f8P@*RC(i6#G@PZ;qs~ z1D|BWRPAs-#YLAwa%V7xCo1+lI;8PhzxK$C#Vx{XMVNMPZ`M71Gf-(+;+OJenRTDr zr1O5%E9XjHxO%nqcHZt>kMEUlw_XRGf%3ZJh5N=xN2hrV#`j*ocD}*3CrEK?X8$ko z8;K2mAF2Z08g0}TV)RHdiVOZ_WfO@*>#)+3m(2&z5dv*udn%oyrwSC*7iQN z=;z~^A~O=wKNvS2PGottZAr?1H~A?J;o;Y3E9ZWAufONdr_;MOZY-1*jC3fPG-0yL zk&LY(E^ep%svoEw5?Rlg)~+&*XJNpKWy_bVTYoyi*f+<3;r6!N#U3g_2hU`#F+Qxb zzGT&pEHC^2>1_=R&JHcQEZcKSWI9c5FiJEhN}Qe&l*y|5=>*T|X}ZptnJ>MRZi&wK zH{@VxF}WbKZIj-qEP-UV#?}8TJ!TX>y;JahhG8-nB=sdSl)b&>+LkDivZ=0gdWge> z6F&d-f9<+{q@$!v;l?c)@5|m%FWtO$emWxT|3>LgU?F~=a$+4*qb;k)wAopTHrSXo)yjz5;1T6g!Xf!FDUn#}=)TlT88 zDfAv#R+<^jt>|PoKmYs2<8sz_VkZS#{P}Qr=Y|a*>@|Oi`gCM0IP9nQc`6T2W0Ge< z@F$(785c7%GG^>AdwXk6;fE(Jj5Eyh8cQ^N!b9!`r)>#RVOx{Hv1+sO+gm|iE06a|r}LKAKT+DX zd-v|-`|7h;IV`qHL?5=wzA2Yi=`9t(9|g{^Xn1P)!k zcrnoE&R@fj6P#)Z@$vHmynbHVYHS;Kz+mClCK0!)mn$+j1R51?Y?|{aM01w6=4sx; zKl+b9zUWXiD{q;~!iAUk{wVzR5-*ZIReU<7{*2GGsWqjdw|51*%k;TVyCkb8G{GpU zN#|&+nv%b_w|CT`o9?WZi407Q3^%vUy=Le(JxIL z7H(aZU@*h@_2GUYmym0^D^x{t7$SeXoRPqxF6bfPymXsuT6A>uITePax^jU?>hVO5A)I~?_Rw+HPgf2PlBQU_~D>a0lUhqgxCsW1UGzHUm_s< zW}n>#(Q~gEbx6#OI(Vvx$$=*#A){{@v${Z4=j^+!TwGj5ZLcQ^vnAZwQMhZt zf(6>KyFmqietgK;=1WG$=CnIDDVuGXyW?BD96K8eN0gAx?2mQplOIjxu--V2@oKZA zkPnL(k91E*LW!G+j&1@M=fp(`8iHRzS0U_f`(4$(?tT%2u$oW8{`>Mi*Zo+33*6Zx z$HHC4R+GTUn$+sBfj3Za!^3@7Y$i21N^M}Uxpj->_BDkfp_-gqvkxD1Y7}YCX*$Uk zMzM230Q?<`lZTenUx_e3YltpC4Na<~K1 zEOIY#Y;Iilt!m5N{|p_uDKnEN9dGAIbARdX^x)?=g=?(L3o@b_7Jl#Jm~g3K0z>8v zH-WDSced=7W<0u~#Vh86!LJ-o&G>UqQa=Ye`bjiw+GHesVB43tir#mj`HO!ptWID% zZVA8JwzSBlxg{nl zW@TmlYSo#1P*C}zHnk}4V$tIpJB!s1 zJuGyL$Cb1jKj@e*KW8pM_%yY`|tT0 zy1IWWVq;^^{a`3+;$UF_t=yXxx;kvF`Xa-ROAmfqmBG!RvS5K=O}?nv-!D-;zt8;q zaL!If?H+bze>KDoo7Zts+SU}wSZ$=#Mm-!09({i%^%?nkb- z_vw;nPio?q|JZTtnZRRdY3U2*3uW9z#TN!dC2&SeYy4iV`zNPdJ1+0#S&hn$j)1VR zu<}nQ)!G03y1qYcgR7jp6`$>w3y1IIl}j_IDXG0$fB$g}hfYVtq!dL~=}QTUzGmL1 zZyKj5RlD~lUyeV~q|)7ZTkXe@zQkE+*TwgJXuWy3_OCJ{=v*Ynw!}T1A>Z3NmKxmf zy|nZCp(jey4+huf&3p5;VCV4!XCdyyO#;szJXbkbJ1ywj)TvWz->q2OcWP#&@dRbN z28mUxR&5g%7vC?qcVY9rfTrY32c96N0GIJDb4bQZVp~M z%T7(vROkJ^wJ$^`c9)2-nvaD}S-;^CHifGG*Q-{o+7}QTJ2$ncQ0{OaE4P@0u$s?~ zV^52=D!*Hn#39GC{`&6hPftz?+yDQ0p8tDlUxrNCjYJJiP0LWPox;BlGW5vV{%Z1^ ztoC%u<$RZii@Nnb`OPqRD0J9Bs#QR%?ropQ>wPKv)s=QHS@NXSwOed% zFgv+;dEI$`{Lyr2#>Rmr>_jRRz<+}a+iq+2dz}PwrSI*^gDUqXV>kouk`dhIoZ|K)x3J|J$bp}Gls%(H6M@u zk@}$Ap+2v|X*2oF>vm^6JvDV*`Tg4K+w1;TP0yTVQ~2n}i6#9|&2HZ`wc0gWU9+QfS3b(elHW!FZYx@SH z`C?*X5`uz)u^b#6OW4`juduMNJZ58KyTr!Ewm?8YAV^qP7*vc8MyHeICNncLCM6{$ zQ+|H_8g_Q}BW!GJApbsKVPQGU$;nwFARu7i>+8!zmf=H4Q$j)llYoFgI4djb6GleH z{|pQaa17$ZFe@wTEqQr)cXxMp#v$ZAtWM?Q;}hiK;+n+F%={bXKM)P`JBZE5$oLzS z_NAnxLm&?NU-w3|w4XF^r6if1v3dp6}7a0LEuxV*1a-#Pm~8P*4qh>D7`4|e~N;yw!t3qdwEwih7(!NP!vk?B7(BlCZD zR_6agylns3SeXBV#9;C;nwgpTPC`NgH!1cF2DJhL0$~gc41Zz%0MSg$%>S7gnf|k| z@cw6E<^Rvj1oAURJ@}8EoxRo4(sD3(gDP&|=H@O1#XSgv!hwN-5ghmau44a>ZM67* zWxv(`L#s{yJ6Q{(lnWsBAgrRIvd_}eatSgvGc#LaYHEst&CShG)PU53#L(4QSXf}F z!)6{xKRPBxorQ(PQVtG|uMoe&+Bl5=Sy_1g%WBR4uWkS7zmCI~|H=kC{)4@qc!#?Ef2wt^VIRVgtul_E`V-auog# zigTFS;XpGnGX7^_;rXv(a^k<9(?2lQ1<}rb|EpS@|IfxEgyLtA|M~g(O|gaNP!sd; z@L=QR=()9?Sf zPJh7hukZZ#zn&8a|M@Q>mHwZZkp&(;(D*MIYH^Ltz2f5H?5wP;uVG;UqD6(+{$Ji@ z`TzD|TX^1w#s9WNCjVJknBZXnQa{u&BO}v)am8wIyu%*)GLg^ZEqU~FW07#k*sOvB`mX=HgA8(AL4hRMNbHa51Spg4s2 z8C0K1Ys|tK|Dy7x{~6K7!sO)S`mu%QP!sd^_GaVb<9h%L3mAQ3quKwvM=;C(i@PoV ziwd)J@g(^oAmtsyfu#>B)l0X6=a{wwIN!x{e~vibj+7-9Vc2rVKaQa;q;8k>9V z?d@5)xVUb@;vGisUup9H4wm@8dBoj5+|+CkXWt1IIs7 znfQ;5jm>T-_&qf>73AOB$oZd{ne)H8#dWOl59$ZOYUdk}kCnh92_c4OibTEeuQCWR{sB5 zwy&_pzndt}MFHn&kRL(u+EAp7HU4iO zvHib%itc|VCPr`?0I3II9v+_a`T6-lSy@>w>FMbX2?+`I2?+^yDJdx+Y#SC9W}A|d zVw;+pY8wy`V9U?XZz~`m0H#4~e3+0rF)=Z)xgfJacErZUg6sm>YZn(6XP1_iW}lIf z;h2+?<6&)W-41dua{g!MRQV5zXXHK~jICq)_CGTV*MBCY{vSI#`%4uS72cr|zl7Y$ z#l;l}3KL`;=q`@6{0Ef*hu4|?=i+2RiGO6hgO!aO=g4jpmP-1s3m)r%jQxS)9#rmw zXa$39;CTfy<*#BSMgF5~TihB^gdC>a5 zj3md9i+`B^U^K{|pnkoq?rP{*A0qxiaj)a__rIiS=YIx9MwI>^Gc)rxXJ=BnNNVi1LQ|go?v2R{$G=)gf;#_Wx$e& zdjFZ35M!bseM1d{#(mg1<^JnB{=%C7bshiwXXn;JiGM~$#(#o>g8D=R>yS~RrKQEd z&CT5ci+@l&g66>kJV9*$oByEv4vKSRd~Tb?e=ZKhoCrt{NIyF}`%@McmZQwf%m`>$?#@;?J3Y8q!@VYy*yYRWNW zB9};q%FD~^gW?Yqk01y`?VQz%cT>R$$b;0wzsO>&b+Yf~KMEp_WACz{O znVD+`li#T27Epd=XJ_993mXW{_&+g3`v2{tnCk$*Wxx@u|3dtrejuWZ1ceblKY#Jg zoja-JG>XlUmX?-aVq$s=@e>2MEe~?1jOM)my3W|*{_lSc^DFAt)#)LaP0= zQqRM~(*XAuBg21C--ew-=D)7}m;bPSJ}AG#FlY@3XwC<{f5XemdtkIc~VKeOHZzn}oye?}%y8vukE!0CaRnK>DkJ@gcp zmX_vbVPS!f_k;R2p!Gf?(i#8toc>^qe?7;a|2cVdP}=>V@Zja;ZK0>z2f{8+PR@C- zyaI}U(ApSBYawty5Pd!vG!}gOi1q)t5NU9ngTfXRP9Xg(EG!S0n3&cwGBOSr2HDTb z%6bUoCKv|!iIr9GzlPOaob5hEy$%1FnAlL_pOKOAy|lFSkeTBqH|@yD$=QO|^~1so zM6pK0$h<|;jzyEcd z{{0sa^~LZD8ynlUk+A=9#*7(Ee0+Ro(BshCNfhgP5K#QzK4kMh&_f($js#u*VBmxL zDQs-w|5Yt-U>WcG2VVQBZh7-RE1L*P{DbEE`1$!0$<0$kO&=d0UlDSAfyzvNUe^D+ zml^*DmG{`z1svaC_Fqf{_nZJI?;)Ex5Nyz%B~iITaGeht+l96F;I!kP|3cE~|3P&g zvisQB*iJ@7M6eFEcqG@o`uh5y`2hHuFi`x1!UQztfA@&p|2t^wfhh#HKX{*#p9;_AvhE;8OgrW%~l7+=s=#hSmN5Z0zDF^*+c9US8gG za>H_{>Jt$WnG6d$U32OJ1qVy$#S8TouKgJ;^O+Ds;ZjC#l_{z z&d%=5%E}7DUaYLFUTkb^UMwsua10WIVKz24Z+3QeA5KnAA8u}LUv6%0KVDv5KhVBY zet!M{0Re$PK|w*#e)M1w5s?rvF|kldNy#vNe*R@Jw}b2lu|erqQmG#6I6q{r=l6eM znRJZ34Qy;|&rD5C2Tfm=Ug^ou&`=Dt4;&PJFbqlu-Y#PQ@1TtbgW3Qf3@QWKE7bn8 zvOxNQFnu7Jhlgk8{{8!D?tIYM1?=qXcR+CtvKNF|7@7Zb@tOSBarpdS56gHTs4md3 zxb~lwmH$8TJU_?`et!O8Io?N1MDX$PRf56*6ow!Sihlto{12MX2gNn4 zyob|{zy1q|27&WF$gMEFtgNgr)YR05%{nhq!_~;hNC>ny2oWZX;B{Yi=0g8(9fXwm zsPPXPC$|2-VUFQ{ezg7|$P9LN_QNtVGHj%}gBbOys;Ufpe0*V`^9x|{2ctz5N^z9? zkg;Dii%b8RnK&@&eMw2lVL#qOC~O4<1uH;t2MbHk7!NBm)BlBiI{)t+wnHfgZXbcn z6@%6YXUEBc*9U;~g6dw7e$d=GD=RB#{T(4|NtV~v)|O^vWql5^2ZllOyKJ0F|Fvvi zVvT=LUmrBq$0KMD&igQZAexPh?WwM=?ue`R(F0ytS(%%io&5qROkfyP52(oV{J*jf zdl>*~2V6g3{ol%15S#{($I%%X89&I%$~rJGFsM)qv$3(Ma&mHRgSihzGcq#&m)BZ~ zv%Rn9^!vY@_Ok!XOf2Ai{|J4I|3yVbLqkJD(Su{e@$2jB88|pNqCoi=7Cs;v)R!(w zQ}}=9s5Nv<095uv@nPHlcaK{C-#E|sKMOO{e@3)*VxV(I7#J9SfiP(A7>K46gUS|= zyFeI}??GjbkYqS`PcOWl2kq%b!diB(!Dl^y{D$mC4i1j98X6kIZjA@IiPzB3kcEST z12m2guOmV8J)pBej&C-_7!N>h6BH!N{|Bul1H}uyFvva*E~Wn(Ru8e3`;heT_rI`o zDx`cu-P`w1RaJHPEbb&X($VxuNJwad_W6PG3OpVe8UGt-^8LTQ-x_-wIBfI(+J4Lb z9`>T3vw~3O(&1(xg*`RIK>m)D zhlgi&K|ujCn)gRM7qlh|{hSz3naRS${J*hS1$tHlYI^|G4gjqa+PBgayk``-Z%vK3 z#%cy5<9{iYj{l TDH4I7eV@yZ8Uuxs>2#8O$6O7M8bSVq!`oKC*EHfUvNzC@U-L zMOb)&+JT@vBP_u7|KMsarnFr`KFKMON6$~pmq)+VVPfZ=rb~5$B+^0P6ee zJO26)ngd{BLR$;U#Pmm4SUBeYe^9c(5dfpY44}PO$a_UVVGl|JRwe@fFYL5L=?}u% z0iZpDHx63=&x(`#&j<>4w6i6JgoF+@H8t_=*s+6o*REYm>({Rb-8IGtnr~gPVg|xgVq^>>_*0H>>~eF&CcU#@BjTTue0nwGc#ze8gS$$1!LCo%@@-xpJ;_^ zOJu#ExqS%4=$``ID5C6xKNcZEbB1At9kfFts3kpfLy#pI_MLzpnjf ztZOUTd^ zvHw^1q0bQ`(gLVoP@k`ikrzSn$-%*K-@w2?8QK1nloUo05s_+;T_6my3xt`OnE!Ke zss7ird5U#C7bNcg{Z};H{hx)E7u2vr!R+kpcSAx#hRr^1?yhx7s|V|F=N%#D{JFgXRT5Wj_pq){9&}VD;bCN)T&*fSa3po1vj056BPe)~#cZ zkdTOCW@d(;)e0Kh17Xk^t*WM{z-@g{+a4C*Fd8HVTJOQbXA0iK4R<3W419%E$s&&k31fAK_Zto;E{Iso+vL1{oukq0GDg5n62$0a2t zr=+K+bE>MUTC%dTegKJq*LWaC39}Gcz-P2gMBxgT@9Fq&dOoh=Rs|Kyi+aL22N~ z2GjpC5**a0Esg(vHTa4F9)yJ1g+VH#W#WmjrslgFQMH2 zpBZ#c3H0nfP#OYZc6RndT3TA8uvugTflLZut6s?B_^; z+5w<60Xk2HixYIFAY{D=Oh1SQnE|4aF`tn0e_hA#IQ#ja_P&z-=KstrJSc4pkXfL8 z34(%xvN%06DnV8V*xK5%v$3%q0);Uwu0U-8(3oFFtUP3V7}Op>>I;D49)v;VLvyjp ze-1XtUP6#Qm>I}4sNCn_xA?CO9^b=W=7Z{db;~>d**Ih{>J?^Y=5GQ50)Aw9a8wh) z5KvN5lH%atxC@IjP+9x zxe;|eq8!k7`tx5{IvHbp59AI`PR^a6a{$Qq*{DupLqJGKs27tv*wuo3y6jM*LD1XBme*XFQL@@pM@Fq zY+8{0EG#VNtgNg=iFN;|I?6)8+S;0lot=FlBK{%!=Rx_|+(6*})qS9OBHRCa=`J=e>t5s{~4J;agS(2g6wBzW_~9s zDyl=7k4ANq8Umm_L>wF(dqMdRhC%H&(3l-)eDLN$8}QmOSiGaqN3FqUj|uRC`UH@) z12O|NuEfI3@n1r*;lD1@SihRt<^OD~f*9>RCMKr8yu7?Yq`G}nJ#|7rS65eqm6i1& zC?A6258SS2WB}hE0Xkdk_94(1F$g2ZhQa9ow7=}A_5aC@n*Ui@5%UBfGeDSymFK^_ z?iz6aU(^20e{Nnq=r|%It$^$UVQy~jZqOVub$l~w3OOMlAt3>pt4Ff(1ScowNl=_4W6)j#Z)dUp7kA-G1J?gRW5m0cn*3Lg0iDSPsy|RMXg#2&re@T@ z_-xcxVnRSeLqm*{lM~~ip;BW(AKYA*Uf`X69c? zN=ji34Gp8?yTn8Woz;Yeg>m!o@hu0%HFCUx*r0I%MkWSuoHm!JLe`C7?GHfqmrifd z{?EyddiF5L9402FACi)iZlmQtogKZP?--6mKvLN(Y?mtpDe9>0;kc z1Wgm5x}Y*!@jqzq38?P}(+{FSdw`{-r8NmSX;hj{A<)v&!ob7BlL6}gf#L^*LF+s~ zeKuwm0hBg9s2u=WLntJ`{(t*oBRpdR*8guGwD}+6CH9}02{uLunj?T*&4!u4O-VCR29@!gP*9L(V`GEgD*}&y zCf5H_YJLAf_bcexfBnxR=mI@+4KjBFN(-Q}-OPaR|G6EO80$x2@eewO=)x|m|EdZ+ z;4^(;=7aQu${RsJ!S49@cv^dN)O;)ruF0hZ0u4faR^E) zpgU&rlH~v2Jp?*y2FqL#I6c_?pVzB{aqbw%e$ZMJetv!(=)DpwJ_rwDZ32q@2^<6DQV z|CgjH{%2*uoG)Z!W4olRtUO}R@j}E7?OD9Myk4+#B0%{MoCX*f|FdyO{#Q4@4Bevz zTAz(rw*@K#bU|k?JN^LA=fU+s*YAP&JY3BG=X7Zz>H=`Shl~lq(gNrlV$d0-p#BBe zUL^gzyu7=tt*uA*dC@QlNJ~r0GBY#7?+*aQ0jSJpVrKs@r?Uzg_o(p>ihB?SoyRRI zo%WxJnFS;NgUkV8NimN9JC_(^IcETp4nX?}F72}XZ)qrqIbX=g_=lI5x8wil{(hRI z06951R(5uF(7jvmIvmu;2c5AZp-=)|s{vY{3yN!G47z^dOhPt`AF>!EkOaZmG zVPOrTL18Z-9`;|y;VafPn>x;*`#1jlSJ2=3pM`}FWh@A+A9U{~+F21GaXWLt|De7< ztlUSZLF-88_vwPy7l8JZg7kneC~blEe{gYeq3kam!BI!C*FpQ{+1c4cLG5f%7{f5= zo&`=`-T&&A_x|f6ow)|f`=ETU=ltitrWItb2B@tM(+i_zWo75_^738;#T!fvM1$54 zrbfzu*N=k6g3;su&LPN{5onAUq!zS(9E3sUfG|5d`!O{&HBO2>KWYGjyu7?53k%Cr zP`tn}D2!Rzc){zlKzr}e%Y9H=4JDW6;^N}%6DCX;ohzgu4cFGzGIDcs zABV>cBLjHNHfT;pR&y@6y$6YF)b>6|Ov~}}e|}LP@RR+ zN``>u_mSfdR9^6Lv;AK+3$&*Mw8tEB))Xk-VHmWQ{Mb6P|LV$oko^P-&6_tfaB_0yF)=ay1K9_%3xq-QMN*=i|3UW;-Nke6 z(1Jdl|AKsM@OCLkF9?Iqns9V<9PwxTk{Occnmcl_7Wsb# zyr%@x4}|4^7!B$dc2uZ=_kx4m3BzFba&c`+PEH;@_X}H~;}BC*Q{!V}V}qan1PV`3 z{mR6`^IyquH`X(_AbJ1qfAIZE?2_>E7@`++t~}E(5fKqz99DvbWo2bWczAe@f%G6_ zW@e`Ug=w~BggCaQAq~SJ<8V5^Sj~oDJUMf1uXvS+I_^@&j+>lbR2*Dmyj<7pSKJuD_~&{ zqPe-bzi4P^gmH6oJF&2^*fTOR+A%ONfX)GfV+x(y2rU{-S0M#8Zz2Nl2$+_F!-hRZ~@kLHrmY0_oVrOT+3<@uJ z*fB8vXJHlmuWot!zaEx(9bHg6!0GRQdEJ%&nV49ij?Y@?H7R6{V4QdoBy{C+y2jp0o_f3x_%H;2Fb|C#E#YjxKoCJfIvBN*n`@ApmiFu z+VjBUyZTt-A9OyCn&rj+?5rXf?R|W4Oo?1>vK;ny0Qi0q+y57LoBx*<2h{_Jb^ype z78aJz`uh5#YX`9;0Z_dQx?2Yn|6t6(2=4213)=qIb^HanTgef1ZUpFbU1073xsQj3XJtxC3KNzf7_mYD z0RgO>oSf@H;R6aQ(0C0aGt+-oX7>M@HqZa-p~X9-tq-|RRYIu|rL7OrPiqWnU&u&s z{y)6d^#9$X*xLf2^#YN8k|_7SfZPS@4`^y?j*bf_zP3yZ`flhZ}SjI3vm!G$$wLMHv|xZloX>u}lL413p$()+?Ymhhb2? z&&8|zUmM4~9=P1M|N5Vs-yFOzAGxi~#KiQPi;GKxngJ>zBErJT%DNNgJ{Zly%=o{* zP6Oxu;#)^-{!eVw_zxOC0HtS`K2X{b6cmi0rW=Qu`I!Ini+cUnar_CsM;jFH zFbtmOb^h~T$@s{BRyI*^n-8oHI*-rA#kJqW#Dtv|dBMWMf$%{0AJm2e-JPOgjr~qNP@7N7_U(U8 z9!>C^J}CTP7!;0zf`WIsxw-eVv$Jn!VPV4_d=1Dqjv6-^X!&E6lusq7|gM z{-558eeEcyJ~+6>^uMqG=nO%`xF9GEaB_0Sjf8lI`B6YXpcpxhK;fmnLC~GG;XV@oA@>wQ+5sT9Gcz;q zQdLzYcsCU+{Dv}JUS7`3&(Du?Mh7VVg(PCI&h3HP0HC$|pmqUh+yxX~gB64705K8v z|DgLQ?;OG0O9ommwtX>ZFCi;99mD(qn(yS|;tCwf@k*@QLH93##`$4>XJ%mf&%(t1 zU(xu`e{HmU4;lCS`(MlE>3|V z{~!-Z@OeU@G9ML#+J@HuovlSM#;iFwI5rX+hC^8$7Z=xDP#l6Wcs(c6e*qC+l>M5Z zJP*PKj{p9H&fFH2$@$O71iI%N5!TGi%-6ZOxt00(`Q>q8K0ZF2a>#lpQOC{AT?h6H zbT1f)4LVo$_$D))^}zIYt^X`6h%sxB9!5sSH?p#_l0!Le3Ax?D!GVjFl@)P*KWMy% ziTOWhZw@4{qxSbf^}e>+%S%W|@G>zmJqEc6 z9FGj3bB36}cMX8f54eM6Px;M**8f%HxS@R?M4IN};%cI~g9p$8QBlzlP&k1wEUY-# zCI4&NW8c36YWGX1w4&6NAbqT?tZy_mH3!AGiMhEsXq|F9!cU-fAme{AVfO#m_FF;j zB|+Lt3K<`={T~}735|b5Ux1sN`w%_GFa{zC=<4b+va+)72E`u?gWB=JayeM%cOmO~ z{($#uL)y!bZ~}!hXwG0Tt)o#@RaFA5?ST0UycdXp>HmaA_5b(K+JT_>2jN}IO(1tv zBJDo|-5;Z%prAew@k47n4Gj$i*x1-m*Htnw{+HKVi*+40cwLX_IdD4(wEhnkw#>}T zzX#j-TXAu5pfjl2U~YubMmqd>_YXN*3I7M}V}q#&(Og_yp!Niq&3|O zXc}5*Y-|h~?|%-9e^6Y4!bZ*fBF^|1lg$U${UEhN7BhnC0OtR@R~TWOD+6i+g8GJ` zKH?bh&&$hOPs8Y-yU`jN8ZyXdH-Pd#=>9~|Tt0H1hp|C>IXJkKQTlzzX=kve2ap>< z816psx)g^0b2_!K)&chp+x;)e0G&&R7y|(510#Ud3;T5-YlM;dfvl{o*9;5{XtIupR&k8a zTpk{tR#;d-XvY7t8q@xR`uMOs528WieIQ!JcItoa`_|1YgR1AMj;^8Rg6QBhF;YS4R|pP%0jIo*Q%%gfF3{|t_G z0oM*iq_$Km7ds!{R8&6$^p>+A<#GwvU*TBsi>&v4F&%aa-)TX z1!!;24UnIZv6|&gjP<>svR~Kv&wq9vEtL2N?VXgDm&bZ;10nnAE&uJ?H%3uW(HqF| z$->0+fAvfQtnm+88yMmvjxi3z!oo5v4wm-z_GaVd<-Ly__n`4{Et?lu$9=UNKK^HA zmq3YsR#w*UR#sM)92^{yFwDlrCW(&O+1cUpFm)g?V$>n45fl`Z^zre*xj#oqNr|0< zgF{?UP!Q`ljf{-UO62$lv8T6d;*9_JU>S_~7Z4B_7VAPSEG*c$xw%os{h63J|7+R4 z!6^Sh?LQ6cNB>z^`BCB@G;Yky%nVv{2`X1^mq0E*^7HcmPaZ7L3Z%-^G`)KbEvZI z?d{okczEDzy}@C}$nsyq>h6C%&{}V#vpYfiyOd2&Le}~~%R;bvIQFOUl=sU>tHVUA2i+%9`^yy1%TE9+Wx_#+b&6AUA_7v3{6GQu#Z{s!T< zjEszL85kJeK=ErvM#d+6e0&QmEG#hk;8Idjt}HApSDBcY-h*ek3?d3q& z&dyHO(a}-H+1Xjz+1Xjr+1Xjb+1Xj#(a}-N-rio+-rios-rio=-riow$;nC3+1XjZ z+1Z)j+1Z)T+1Z)b!NGyY-rkRXbs^B0CL;bpXS*=}XJ!Pg-RAty!VbEBn;oSM1WG3$ z4B8*;>gvir2)%{ZNm5c$381tK@&gQm&aDNVCn>B$T|;@7)T8WD=8^~&S)D%z9G&j zK|w*B92^{bL4JW_q_rNPwU2OdXqgA{FDEDGUSnfpl=_4?8wa;44Gj%u9v+@z&>gBE zf1>*xoew%cSyWUsad7(zzw6Z0)Ij$UW86oL?pGL}g@xr5FE6hwep838Y*<(rqoAN* zEGsMP15g?OVUXWJG%{voWxdYH$rmGS%c?@a&y|3}8mU%q@{e)Z}V2(!F- z^M>W)$B(T4{{3V7|NlSx|Ns9v|NsBb{rB%*zPE4R3cY*xPIA+xO(ya2@f*Coy?-hw zDE#N-eVaOmoHy3|Ns9Vgkg4q-SYhTbH*Dt zZh+Z%+|K}7OGzQdYsbTf57Fhp?)?7!JM+tzFF|3!_VnpfE*~EskLc*=W7gKz|AmEx z{|gEV{x>u<{2v(^d9S#*IQiwvm-6r4y%YWN<%_`o|NnXZ|NqbR|NnmuP#FIF`IGJ4 zyLYUwU%zH~`}Qr%hYuf^fBg7?9425pfBg6XcFXtg-x;4gc>-qR2^*OFe>CuqA0qGp zLj4C@^#A|=26>3U15luX!W63R07E@U;vWMjvO($~{67pJ2ZH(bAo)KGAPYhIU}>CY ze6T}*Ane1+|9~bB=Qp6ak7z#Jzfc2k@DD(xVc~NC!f1en-vNlj;QR;J`3wxu@CS`Y zfQ=-?2M5Fd|DbXRtR9^Yj;8LIxEp&o!c7wQ4H zbD<7K;)7!h?p&|~k(>wRLqi{AKR8CfnGD1OI~d8i&@2U!f{+ZL?k0o@CL0(aX$;Ky z4|X7ubHNToat@e}uN3-%9^|G+5{i4P7Rc=UlI6rAQ@MuHOn zk^{jx3W*O+P)HsGIR}!7ASQtM@Z<@OZ{+v~r4KYdJ92vY!N7o$o<1-zprkjj^N}13 zb}mwS1v?j$4|g!w`A9Ja<--#kSgHZxAuu12-~NG(M&a{=qZFEgK%vhLauX6C93s#d z0LKPM0G$tw5vcdzDHbOmnxq~;vJN~zpye6Zm7w@QFYhqRLy%(_z`lg2N999<2QH73 z4-G)LJe&`9D7^fKdW-}xl=>RtI0OkgDA9p|fdOO*BZC4&0we%oQH7j8e?Eh@wl>Q^wC4>C4Vg_%O$X#` zjf8{*Mov!7P!<-J1I*0KZ<(2y@36A6_Jhtjr%J%$F@&3&Ta%rgeKj*P^GjxC<`>M& z%quuKISue=p{kUWloSIS8(SIr7#OI(!_3TlK~PYTX7{79v9akhGBSPw*@cW585uuw zadDYb)uT8J6BHCwVq#(fpA{%3#Qr}wQSQI9wJ?0FmzS4!rKP215D1%@nFX1eng)Sr z5Fdm=Y+PdI=H_61$m(EX78VvkEG#USK>lW8V)-v3o$+5xF8@Ch6Xe_>78aIUR#sLt z&kvlOoY^2ZfX4cFEHMJleS*%wvNsomhXF{QRv6UJmQ-$ot}*@lUs`PP_aD?K1i49ASQzg; zIMfIPK0dxukX@kozq}ja|AJ(Bu>Tnu8GrNf@p3ULCnhF>^(G}H$!BF{De?01 zt^oO;nVI*$uHz55|3UY`fzm&yOqP+6p;_GnOB4M3{89`I4B#~YZRM(P|6ko_^`DEA z85}MkchU;;2suN`KF~S&|Nirf1%T5(6BE;8H8nMw-#=hvWW>VE%={YUKW`^dxc@w4}APv=~@fS=WI4FDc6LA5`~&{0_o( z1Pfq?;z85tSjY?wGm45}8SC!U#^IgyKt3w(DO zXiibx@)kVpt6N-!m;Kz_+{v``H?r9r92~hIKZ5Y;8T#-vaB-K#e>Uj(N35)@OLy)> zS!Rc91kr41X=yelCZ?MpySVtw;C=_KDVI{|2B&?{9z-rKF1p>nA}1#&4!gHF!cP+J ze^43-^M$N&W@Kdi$;!$qN3=(AC}d}6j|BN0)b0V@jSBKN1poQZ&aDnkZ>+4W7iP?u zfx`sa2(z)Vf%pCh39zBuo3w3_(SKHG8UU3^jEs!eK$wAn0knS(%m(p6m`E|uIK+SO zzEY%n13>K_(E1xt*s!v)(tS-eA0Hp+K6r5W*W{s|1>oZ>1{MdojT#sf_c9vOQOZ35 z@ldcGp!HC~!or|Bi8c|9!&H5JeP%W`wmYCQ8FV+^wSAyOOP;#zm$oIX(=-^^D<^;=H)CbEGt-8SXQ#KvaVudW7`k%Hz@o# zxiwMhd^NKR|CyK|_p-9FvC%i-BZUVyH#cbS5;z{J(b7O>tSr22=HTEcLefT%>EYqQ z$i~LD4CHrEUk`L=0;sNo1w{S8?O;$DBP=YeO3*+WDFC$vSXfxVdw>M_+5Vs1 ziZ~_rs+7G(Fh7e|AVtNZ&M*><;4ZbG{x|SBy?&ajs z1IImReWbX!xHzr+MXb4ohK8WC^EX4%D&zmv(-G|fP<@yZDFg2pfYcC+85x=XE9h-R zD)avRmsIJ5o5jV&RY9y9X|0ZzmsgpIi3z-aKuwVcWnAFOUaS8)>b&r>0Mt(b$1fuz zs0|IqjEs!0p<>{E1t^R}Wph#du5NMdKNBceY;1WTcZ1Sx zLKx~<$-9@Ez|Y5KVPSc%s;a8FZQC}+l`B^=EMB~rVf*&&p!FjWpmrRnFUQSi`d`QX z6FlGR*nj!Y#cKo(L+JQ|DJgEFhgvf;Gtk;l&=e4O{olMEo&TV-fIxWwgr~P@!S9h~ zVPUx}B_#!4`zR_ZY5*!DLHnXvSw;S9Sl)#D9aQd%D^wz<`wj;ODi7pSDS%{UWu-yo z5-1&r3bFq`1iC*5ye1yfE=Z4-0q=(g)$1G_9P2=1_>z*6;w&sI_dsHxdp?!)x1gkZ zMg6Vt^MY7eSx#C^5lpNb23j3xA1Ny<>oG{Y zG5+tWRzv9{?pXmX520s+aPyn|*Kzm)_d6)h3rnZK(+N8}dq1e09B6-$V!yDkFzA2) z@cvLPPL}^`W}>zWmQL3F&%q8EFJomB`>$?!1D^IJReRxWJm{G@L-KxQ0RaIUMn=Z( zpt1mTZY=0tNl-Ze!`;{THp9tK)1 zH#c`0C?A0Q1G-BGdCmY74q0)aei8#Xt%L6U1D^-a$oL<$4@X2qM0cRwPpSQ(p`nai zTwD`C{s&=qdy)U3d!s;p2Vv0pG5&6-=LCS-LHzvu_&2Li>M%O$S5s5tW?^A@0`fm7 zEu==u{=a<~Fu3N za|fVwaC(cye??g?a61na|2#ZAptH4TE}}F+r-1eV+q<90g884cFF%5)(`%xnw*69`T6+=ypK;#$cT!Hg6jVlAip!S@cvgdJpr%Z6?E6Z z>o_?n&i{we`Uy38pfds?=O!^TGw)YcR%Ro|4Fjb|T3VW&nVI=G$nT(by`1(^xZgoz zc%Z&K3oBy1gn>5i|I2$2bLpUdBj}E4P+uBk1_uYn1n6SWf$|d3_PV*bfzE@U0&+K~ z-6JYjh~)Rb|Fvvi|K~tE2MDCr-(BqgEzsF{(Ej4py;lE0=WK(*0CbNI8ynk@s1MoM z*+W6)H^@)Cf_DFPk>)IP9e@Al6ZQnpS%KsQ1qJ&-`@%qMP@Pbkp@32zg4&Cq`4x~H zXq;bCQc{KJh!_BcqN1X*pz~Zn{$b~k{;y^81SRf8<%_^$o&1#rM8d#wh6kw8ji12hz*Q$=NZO?nr?7 zft8gt9~6fmH;T$;A;tT@|KReD4YD?XnVI>Iq@<)96BCm>0|NsXGcz-T)`h_Di`LiT zLn#lh?zR4}rwJNE1&;-Q&d?iFXNCz034zuGg2#VB_nU*pEb&xv6~_PB*`WPpR@Te<`uc-nFKIwP0I0m*28w&oK4{PxpP=)eKz;{} zV~EKXlH_+-*nrHN(T-XcRAeiH+s7a^+}zwXu(UUjG$$vgKgc~GEFznOGKK@`%R|n* zVPs?k-I3zK$jIoy#Kh#m!ouRo#>VE!$;s)(!^7h(ARyo)EG+B?y-NplZpD8QA-4a> zYs_vOu>P;1!UGNi(0qfiurSrvnUNBfy1Ke-pgo-+zk}}W2G#A5c>f1J2a1DB4eVCX z9nPGboJz!+&B@6b39Cc>-NaDJ!sS!-;N$3QY-}j!^AKx3wbXHOae?ml1lMWOY7>y+ z{@;Hw`BJbrC~Ua7xj}OyL|bcZZ4Fvuv>c?DnThfL+-_}n7=X@|bg==gH)aHd?RPFN zE=8gZrlLYeM@P{7Klsis4o=1YIu769{#UcO{-2ozamNGbei$Yurdy1Rj5in<7_P(C zePE%lgVcc3vaqm#&TRpQp^5_ce^ACb=SqDk`f5GRUfZD#G_@f2}m4&THYYjo+;9)NU9zzG6al^yIL-#R4R#sN<`X4qn zvHx0j@8EH-Zhjfww_{>r+Q-7e(htI*{ShD<850r%$uluA-3NuCq!`El>-!OXq@|N| zLFpfyKG@jUK$&H)mU$${8Tfqgh5yjqixgQ#q-J(@c2IbO{i$qn6z+c=`;Y&b5$kf6Q=^@#s;bJ# z%*=cblm-lS`2K^=)dQt}5C*pg7{KM=Uw(dmx~>0XWn~53C;p#}L;gSL{%T0R|My=? zZ2~wSjpl!4AbVrFIrm(79_5%9PNg#o{aFWmniH&Gum{?AXAhu4Lm zdl==UA?GYXZ+1S|N?Oo)1 zUeqkEfy*e68%0D!KzkL42~MKbaB^~j+e6%3%>O}WtAp}C2$!TOfa^ifIIFn0IM#E! zh_-|Xg=}nW;PGsbKatmF$!IMArwLG9t)-=L=210&Oa(7GH@z6W7(r8=1ZL38!JjEsz}q+li{rd9y~0q~hn zp!0Y+IXQ!vn3(D~IXS_5TBM|;!08S&9*8_<4w^#%`5lDC#Ki27oJtcWJ3D(d$S%+w zX1Yk{9E!;1f&CAXBNwx>vOWblT3lRQ1vKUfGKZCw6?DcvgPfe435XB!Kd27`O8X!T zZU;fnnGzNj_6F&vCFbPh%mKLr)V>9^^+0j22Oih-0Q(=bZj+gr`4dwY9MXJ=;)XJ=>7xrA)?_V%py_Vz4JPEMe62SLWeaa2?k zgPWTheBMJxM~9Jxh2u@r}^3_(3x)>92~{4 z{yE4!FwDZja!pA|3BIlk?ingE`1ttDLGywz`(QL^PcSz(H(6tXpmsAde)sMjA?Pp)itxveA3^%TW`f+Hq@<*$prCM2L_`F9){vT-+Ie$x zbK9Rke}WFmVEOas5A&NhZmkd0XmTegJ%B!{{To2D00zhn0|TCnJ54MgN|(Z!2qE_r&NFr zIzXZ8L1&5B{{S6$@Q*aD~SQ zEFNGq0|SQxG(OO1889CbzaU#c7<5hq=B9{{H?9{QUfa+}zxzpm7O# zd5XKhAZLOx=gwPo2-pqe z5A_p`IJQ|&BJW@hGMP+Dm!Q2~cPXpBrr4!ox7i=3QXf|Qh0xTK_H zxU{r%I0pwuI1394R?Nl46%JAh!XUMxqN1R=rvH2*-f;H|NydTQ&%wcAkK|Q~n4FxP zpz{m<`??_JJpA0Kx0g^-r4#Oc4jx^Q`+swAa7a_+Xe7;ie0-vycm|Etg2EouKk2K3 z>``TAW`4-T#MHsa$OyXs1axm8K@3vM!ot!EI%5;m?g#C62BjS>o9F*Q`-7O7nJ-F8 zN>XjiLtkGX)W!y%X}@k3lQUE z?}Eb~OMmH1q1{Hn3$Lzf!qt)D*NI(!~7R?7y7v!kiEf|c3VRCLxRW2uQD?;7cnw2 z7J@JG|mLw7x0yrmzQq$Cn_l^f$D>0pblKPuO$4A573>Dpu7PZ zkK*Fu3IX|5TU(ofgM$NfzxRJm9_|0y&^b|Ehj0J6`7OZdhMk?ghTePkWMyUfLFouI zchp&h*oQQ$Lkqk&8MLlYP*6}8y65^2=#Dnf-5sDb1DewolPdRM2k z5sN`>EYR2?Hz)J|tqUP%j)C$*ahd|CJo*nBH)UpK{>;e4`d>kJEj-PG&PD>=%fQ6M z^qiZUo8q%Lh;=WzI$K*?26lG#Qczx2mgk1w84KR~;VusL1E{Qm?EizT8B{aB{2#PN z7@EdB(9NVb-`3U^bl=Z%P+qXN5Q6V(1g%>((SzLU2in7@>-h6O=nhDBF35RUtgNi1 zYuB!&w{x-DCoL__%goGt78KU;q0;br0W_ZiT89p5=ZMLd|L22_=d!Z0E|-vy7?3oN z)dLI+47|L&O3cj6&p>IZsTk7F0p*3Q3l0B+&R_uf4TM=(SWb(Hi4D5DX2Qb4K;9Il{t8E7m4RLAo3vi{#ZA8`&E z=u9xsIZaGVOfNujH88HkZYvKD4`@%uYmmD^?Rg2M2JqaWj3meZ;~ODuZBSZDjgke= zset-d{QUg9*iECasF08lAILqRy+h)P)sXeYj(`3ONyLEbCw)!6{}*;zg7Y+}T!o#< z$-=_2T1!idF6|v$Ap&a3F*7qS0_977QBZsMC%BFRwGp`ZK<64j?#JdP=QbN^Q}Jp*<-sBI&zSOZQs%*@PJ zMMXsgd3boVn3$N}F*7m!pW2GJ)3>Ka9o$Z0W@dgMCMG6`%??_LadUHn);^sErFkjU zZn)bO^*4dfKVoKPe#ghhr`goh!~m*exw*LmK&dN z%)r0^bOt`HoQz^F8yg#VuAEQU{XeK(019`|{g9wD4M2H;nVA_h{|jFa%E-tFTL1YA zB&V&)^B;6}3aC6fyWQfyyfmcm$<57;x9^GK017x(U|{$N!=O1x5C)xp0h%`e`5`U@(Z*ObK?mH<1C4`8OH0#ijuhnOnwlC0 z78aKEAU8-NjroDrD1+J!OiWBiSy@@R`1tr(q@|@96p1?9+YmFS@=L<_?=K6 z(89t3bOr_J9FBjWwZpJFmarh(|5IBa{r>~2P5yJRf#cwbn3x#V z$AH+_*uZ^o(EI|Zya8d*SOO?7u(Gly^Yinwkb+rQSf+!3keB<%XKL!DHc{%Rs{h8 z0TxF`M?q$0=I@|!NKpC*VbB^fko(!#*wQF=IMe{>ec|x)+11Q1f%{h=dqC%c6N6b; zSU_jpg6c2OJlP*sR@O!j4-aNmR@UdB{b08aLC(#n&Q${ED=scBYR><5fZQsf)cjx9 z@z;N8^=V)`*x1+}v$3%qXJutQ%EH2OgoTCW5HmCLL1t#=1EBdKCMKr6(EV*Y+1c4a zeR~EjE-p7_X6D^oTwI>hrcGmDVq!W8+TROWyLfHC^?xrXQLx#dd01%hQA}}jb8CXy zV4(67l-_)!pXKMzpGLIS8v0o`$4!ok4-G7cg^B+1UsZpy;KQpU>4YDT0M z6lJWetSO-JJ{@)N{?*UY($bFR=H{AaW@eg}mX=`J!oormSZeu6weXC zVP%*-c2Z9mZ3 z4;}l@;Inhs*w~zjuo6WHv~Bu#{cHp97@N2VJ17qFQ50d}FflRpaq*dg{SH3E0dm(6 zS$pq6b!LPgWInnQvX>pSsuO$$ECT}rRvJ`)$?L2H+s`ZH3R;UbAB!`I5(2evLF>5= ztu+OYt;kApfYQ=&Mn=XU7-nK(3T9zp31MYr4F#Rc0b1*!=k({lipjD6jEqeGI5|1V zK9kAF$cPct4gifKfYRaI9&J!x{5KO5Q#=C$gF7;2W@at{o$(F1>*eo%9sygBTUQa~ zQ9O#+*x1ZKeH74I0FWCZ{UyO^5wuSMx)0$iXbcThCP=DufWsZMUI(-$g`1ljR0QKO zoj56GX67Ey8Y$5FI?&jJwi+*}jk{Y}S(!yrQj!NW&J8*z2DIit!}8XD&^iQGR#uYs zkmGZStgI|M6BE-#&=@)B{)&AoP5y(%3_<4%v9PeLg^lxq_H=XcnSk=i_K=Ves*W47 zv$KQ7*FJ*ga6$2~c%m+NPdCV~pmsB;?<*{o0!r_XI5|0KvcH*)jV+LwndvWVy<=;c zDtKH~$zbPyP`?#4=gh{&M$@x~+1S|XxVc#VZ-L&WlNu@WA3V;*#PW}wot^wem-rF@ zk{mBDFKE2yhm<(S|D)^8{)74#9u6X)IDZLRzm24n>P#LU9zG@}rW<@BKL5D|tp4k2 zK+eGe%_)PJ~L1Ps<_8Ay^F0dI1G-gGy4y% zBc_7d?bNgzWEL|sa}_hIz<+fM$hoHi;t`-Qe+-&~$cTZQnY(hD{(n|hrhlxgtWh96 z)WRGb92Sg>OurR$*MQ46&>c#keiIiLmp&UCn>%Q{Xd-kCc2$lNC=Y(*=H{l#-a;WE zAx_X455iK(V7rx#_WcK~+W_4i2s;;_iHYeh4>!yIT}zF@_v_f2f!j-mKzB}18V1bF z%#EPCM6~Tb{MWX7`=5;ieEult+@{5#yD32TQLwPEEMsC~x}dGb1Kw*2sxLunPuSSl zC|YyJ!^0!V$jJCrPJ1!f@1U~+n3$NZb8>QGoaN5R$tlLj$oLXgJ{CdNx;)|H;v##@ zl$DjW2bA7Hb9XA>F`z8UM$mq4l=cTm3{($-#@Rq?072`vK;yVfOiU@{#DS!w zBpVYG<15&nX?{^ZP`cX2!ouQ?4>K__osSQZ0=FA8Vr4;k&XbcLA?ca}d@hZK)qPM~ z=07hlZ?B-BV2qHEPz;Dh#xOB1F0O^3wWy%;=s@X_k%8eKFE202J7k!dnVY!1WD1r#Kg1~v_})(HF0c(&Mp!ttO3=9ky7<31WxVShc6BE;BR#sMP zHa4~euy%8xhZv}>1e!~S8BG+;%*?zHWUqqWy8q0qLjT#>*_X4jvbM0Wurz_n1ZHOD z2GIB^BO_xC3kyq%wzf8Cy;A`f7ndS4GjpY!H0OWNS#*lBoS=4S6D~_ZX%mD&<1T;y z{$&8|xdV->C@Ly~#v(6qadQ3R;NVyU+V}bC(7PG;GDu2F@^N!>?*NSn z@$>WVH!(30{Pyh|BWPR*WXHE}-{AWH*#D^q4P9Vh{txz`p%NGd4R!nn4S|3#XlUdC z`~UwRK>Nl(cS?iqeFyC)WBw0TgET|}(vM=c{11B=9~35_fd$a81gN15AEzL&%9@Rp zIZIfOZHbzinzXsOxhOK0larHYWfxn?#Ka6bYYAip2DUX5y4_K!3d&P!85tS-(eM@p zz4iaO143DA5hNI3=u ztrrIA*H+^JjopIo$An`ZLHkFLbHJF=F*HI2I5;>&yqrWo&h7-Q$z+<#$jIo+#Kh#w z%*?Vv+34VZK4FiSoSd9IP~})DCMKqQP#FQbe~gKVX*DSCh{_fJ2d(pAW@ZL$@58DO zCMYW_%OoMnu?w_rz*Jx0F`uyeYf#^dm0fgoNC9_aojWfiOc zoVi^TCW&W_Ru;3j(=HcOC zNXhn<~$F*0UjV|jFNjp=`G zE*6|+Ca_(4n3$rOnVI!jSy?mZ_iFz)(BeCVY$>RW`}OM= z!`H808F~2RmhuT%zF=o(_hDgSab#v@wr6H$wqRvtm1SpV*D^B{dMhfzJq4up_wV1} dvg!dl0|Pq#z|X({!aw907+@I0M^^`O2LN=Dx3T~L diff --git a/assets/header.svg b/assets/header.svg deleted file mode 100644 index 59c96f2..0000000 --- a/assets/header.svg +++ /dev/null @@ -1,20 +0,0 @@ - \ No newline at end of file diff --git a/assets/main.css b/assets/main.css deleted file mode 100644 index 4314613..0000000 --- a/assets/main.css +++ /dev/null @@ -1,107 +0,0 @@ -/* App-wide styling */ -body { - background-color: #0f1116; - color: #ffffff; - font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; - margin: 20px; -} - -#hero { - margin: 0; - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; -} - -#links { - width: 400px; - text-align: left; - font-size: x-large; - color: white; - display: flex; - flex-direction: column; -} - -#links a { - color: white; - text-decoration: none; - margin-top: 20px; - margin: 10px 0px; - border: white 1px solid; - border-radius: 5px; - padding: 10px; -} - -#links a:hover { - background-color: #1f1f1f; - cursor: pointer; -} - -#header { - max-width: 1200px; -} - -/* Navbar */ -#navbar { - display: flex; - flex-direction: row; - } - -#navbar a { - color: #ffffff; - margin-right: 20px; - text-decoration: none; - transition: color 0.2s ease; -} - -#navbar a:hover { - cursor: pointer; - color: #91a4d2; -} - -/* Blog page */ -#blog { - margin-top: 50px; - } - -#blog a { - color: #ffffff; - margin-top: 50px; -} - -/* Echo */ -#echo { - width: 360px; - margin-left: auto; - margin-right: auto; - margin-top: 50px; - background-color: #1e222d; - padding: 20px; - border-radius: 10px; -} - -#echo>h4 { - margin: 0px 0px 15px 0px; -} - - -#echo>input { - border: none; - border-bottom: 1px white solid; - background-color: transparent; - color: #ffffff; - transition: border-bottom-color 0.2s ease; - outline: none; - display: block; - padding: 0px 0px 5px 0px; - width: 100%; -} - -#echo>input:focus { - border-bottom-color: #6d85c6; -} - -#echo>p { - margin: 20px 0px 0px auto; -} \ No newline at end of file diff --git a/assets/tailwind.css b/assets/tailwind.css deleted file mode 100644 index e69de29..0000000 diff --git a/desktop/Cargo.toml b/desktop/Cargo.toml new file mode 100644 index 0000000..8d66074 --- /dev/null +++ b/desktop/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "desktop" +version = "0.1.0" +edition = "2021" + +[dependencies] +dioxus = { workspace = true, features = ["router"] } +ui = { workspace = true } + +[features] +default = [] +desktop = ["dioxus/desktop"] +server = ["dioxus/server"] diff --git a/desktop/README.md b/desktop/README.md new file mode 100644 index 0000000..6f691f8 --- /dev/null +++ b/desktop/README.md @@ -0,0 +1,30 @@ +# Development + +The desktop crate defines the entrypoint for the desktop app along with any assets, components and dependencies that are specific to desktop builds. The desktop crate starts out something like this: + +``` +desktop/ +├─ assets/ # Assets used by the desktop app - Any platform specific assets should go in this folder +├─ src/ +│ ├─ main.rs # The entrypoint for the desktop app.It also defines the routes for the desktop platform +│ ├─ views/ # The views each route will render in the desktop version of the app +│ │ ├─ mod.rs # Defines the module for the views route and re-exports the components for each route +│ │ ├─ blog.rs # The component that will render at the /blog/:id route +│ │ ├─ home.rs # The component that will render at the / route +├─ Cargo.toml # The desktop crate's Cargo.toml - This should include all desktop specific dependencies +``` + +## Dependencies +Since you have fullstack enabled, the desktop crate will be built two times: +1. Once for the server build with the `server` feature enabled +2. Once for the client build with the `desktop` feature enabled + +You should make all desktop specific dependencies optional and only enabled in the `desktop` feature. This will ensure that the server builds don't pull in desktop specific dependencies which cuts down on build times significantly. + +### Serving Your Desktop App + +You can start your desktop app with the following command: + +```bash +dx serve +``` diff --git a/desktop/assets/main.css b/desktop/assets/main.css new file mode 100644 index 0000000..ef6e674 --- /dev/null +++ b/desktop/assets/main.css @@ -0,0 +1,6 @@ +body { + background-color: #0f1116; + color: #ffffff; + font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; + margin: 20px; +} \ No newline at end of file diff --git a/desktop/src/main.rs b/desktop/src/main.rs new file mode 100644 index 0000000..6201ee3 --- /dev/null +++ b/desktop/src/main.rs @@ -0,0 +1,17 @@ +use dioxus::prelude::*; + +const MAIN_CSS: Asset = asset!("/assets/main.css"); + +fn main() { + dioxus::launch(App); +} + +#[component] +fn App() -> Element { + // Build cool things ✌️ + + rsx! { + // Global app resources + document::Link { rel: "stylesheet", href: MAIN_CSS } + } +} diff --git a/mobile/Cargo.toml b/mobile/Cargo.toml new file mode 100644 index 0000000..8ddd192 --- /dev/null +++ b/mobile/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "mobile" +version = "0.1.0" +edition = "2021" + +[dependencies] +dioxus = { workspace = true, features = ["router"] } +ui = { workspace = true } + +[features] +default = [] +mobile = ["dioxus/mobile"] +server = ["dioxus/server"] diff --git a/mobile/README.md b/mobile/README.md new file mode 100644 index 0000000..34d37de --- /dev/null +++ b/mobile/README.md @@ -0,0 +1,30 @@ +# Development + +The mobile crate defines the entrypoint for the mobile app along with any assets, components and dependencies that are specific to mobile builds. The mobile crate starts out something like this: + +``` +mobile/ +├─ assets/ # Assets used by the mobile app - Any platform specific assets should go in this folder +├─ src/ +│ ├─ main.rs # The entrypoint for the mobile app.It also defines the routes for the mobile platform +│ ├─ views/ # The views each route will render in the mobile version of the app +│ │ ├─ mod.rs # Defines the module for the views route and re-exports the components for each route +│ │ ├─ blog.rs # The component that will render at the /blog/:id route +│ │ ├─ home.rs # The component that will render at the / route +├─ Cargo.toml # The mobile crate's Cargo.toml - This should include all mobile specific dependencies +``` + +## Dependencies +Since you have fullstack enabled, the mobile crate will be built two times: +1. Once for the server build with the `server` feature enabled +2. Once for the client build with the `mobile` feature enabled + +You should make all mobile specific dependencies optional and only enabled in the `mobile` feature. This will ensure that the server builds don't pull in mobile specific dependencies which cuts down on build times significantly. + +### Serving Your Mobile App + +Mobile platforms are shared in a single crate. To serve mobile, you need to explicitly set your target device to `android` or `ios`: + +```bash +dx serve --platform android +``` \ No newline at end of file diff --git a/mobile/assets/main.css b/mobile/assets/main.css new file mode 100644 index 0000000..ef6e674 --- /dev/null +++ b/mobile/assets/main.css @@ -0,0 +1,6 @@ +body { + background-color: #0f1116; + color: #ffffff; + font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; + margin: 20px; +} \ No newline at end of file diff --git a/mobile/src/main.rs b/mobile/src/main.rs new file mode 100644 index 0000000..6201ee3 --- /dev/null +++ b/mobile/src/main.rs @@ -0,0 +1,17 @@ +use dioxus::prelude::*; + +const MAIN_CSS: Asset = asset!("/assets/main.css"); + +fn main() { + dioxus::launch(App); +} + +#[component] +fn App() -> Element { + // Build cool things ✌️ + + rsx! { + // Global app resources + document::Link { rel: "stylesheet", href: MAIN_CSS } + } +} diff --git a/src/main.rs b/src/main.rs deleted file mode 100644 index d8bff6e..0000000 --- a/src/main.rs +++ /dev/null @@ -1,134 +0,0 @@ -use dioxus::prelude::*; - -#[derive(Debug, Clone, Routable, PartialEq)] -#[rustfmt::skip] -enum Route { - #[layout(Navbar)] - #[route("/")] - Home {}, - #[route("/blog/:id")] - Blog { id: i32 }, -} - -const FAVICON: Asset = asset!("/assets/favicon.ico"); -const MAIN_CSS: Asset = asset!("/assets/main.css"); -const HEADER_SVG: Asset = asset!("/assets/header.svg"); -const TAILWIND_CSS: Asset = asset!("/assets/tailwind.css"); - -fn main() { - dioxus::launch(App); -} - -#[component] -fn App() -> Element { - rsx! { - document::Link { rel: "icon", href: FAVICON } - document::Link { rel: "stylesheet", href: MAIN_CSS } document::Link { rel: "stylesheet", href: TAILWIND_CSS } - Router:: {} - } -} - -#[component] -pub fn Hero() -> Element { - rsx! { - div { - id: "hero", - img { src: HEADER_SVG, id: "header" } - div { id: "links", - a { href: "https://dioxuslabs.com/learn/0.6/", "📚 Learn Dioxus" } - a { href: "https://dioxuslabs.com/awesome", "🚀 Awesome Dioxus" } - a { href: "https://github.com/dioxus-community/", "📡 Community Libraries" } - a { href: "https://github.com/DioxusLabs/sdk", "⚙️ Dioxus Development Kit" } - a { href: "https://marketplace.visualstudio.com/items?itemName=DioxusLabs.dioxus", "💫 VSCode Extension" } - a { href: "https://discord.gg/XgGxMSkvUM", "👋 Community Discord" } - } - } - } -} - -/// Home page -#[component] -fn Home() -> Element { - rsx! { - Hero {} - Echo {} - } -} - -/// Blog page -#[component] -pub fn Blog(id: i32) -> Element { - rsx! { - div { - id: "blog", - - // Content - h1 { "This is blog #{id}!" } - p { "In blog #{id}, we show how the Dioxus router works and how URL parameters can be passed as props to our route components." } - - // Navigation links - Link { - to: Route::Blog { id: id - 1 }, - "Previous" - } - span { " <---> " } - Link { - to: Route::Blog { id: id + 1 }, - "Next" - } - } - } -} - -/// Shared navbar component. -#[component] -fn Navbar() -> Element { - rsx! { - div { - id: "navbar", - Link { - to: Route::Home {}, - "Home" - } - Link { - to: Route::Blog { id: 1 }, - "Blog" - } - } - - Outlet:: {} - } -} - -/// Echo component that demonstrates fullstack server functions. -#[component] -fn Echo() -> Element { - let mut response = use_signal(|| String::new()); - - rsx! { - div { - id: "echo", - h4 { "ServerFn Echo" } - input { - placeholder: "Type here to echo...", - oninput: move |event| async move { - let data = echo_server(event.value()).await.unwrap(); - response.set(data); - }, - } - - if !response().is_empty() { - p { - "Server echoed: " - i { "{response}" } - } - } - } - } -} - -/// Echo the user input on the server. -#[server(EchoServer)] -async fn echo_server(input: String) -> Result { - Ok(input) -} diff --git a/tailwind.config.js b/tailwind.config.js deleted file mode 100644 index 2a69d58..0000000 --- a/tailwind.config.js +++ /dev/null @@ -1,9 +0,0 @@ -/** @type {import('tailwindcss').Config} */ -module.exports = { - mode: "all", - content: ["./src/**/*.{rs,html,css}", "./dist/**/*.html"], - theme: { - extend: {}, - }, - plugins: [], -}; diff --git a/tailwind.css b/tailwind.css deleted file mode 100644 index bd6213e..0000000 --- a/tailwind.css +++ /dev/null @@ -1,3 +0,0 @@ -@tailwind base; -@tailwind components; -@tailwind utilities; \ No newline at end of file diff --git a/ui/Cargo.toml b/ui/Cargo.toml new file mode 100644 index 0000000..37f89fc --- /dev/null +++ b/ui/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "ui" +version = "0.1.0" +edition = "2021" + +[dependencies] +dioxus = { workspace = true } +api = { workspace = true } diff --git a/ui/README.md b/ui/README.md new file mode 100644 index 0000000..fa36d7f --- /dev/null +++ b/ui/README.md @@ -0,0 +1,16 @@ +# UI + +This crate contains all shared components for the workspace. This is a great place to place any UI you would like to use in multiple platforms like a common `Button` or `Navbar` component. + +``` +ui/ +├─ src/ +│ ├─ lib.rs # The entrypoint for the ui crate +│ ├─ hero.rs # The Hero component that will be used in every platform +│ ├─ echo.rs # The shared echo component that communicates with the server +│ ├─ navbar.rs # The Navbar component that will be used in the layout of every platform's router +``` + +## Dependencies + +Since this crate is shared between multiple platforms, it should not pull in any platform specific dependencies. For example, if you want to use the `web_sys` crate in the web build of your app, you should not add it to this crate. Instead, you should add platform specific dependencies to the [web](../web/Cargo.toml), [desktop](../desktop/Cargo.toml), or [mobile](../mobile/Cargo.toml) crates. diff --git a/ui/src/lib.rs b/ui/src/lib.rs new file mode 100644 index 0000000..f5f49c9 --- /dev/null +++ b/ui/src/lib.rs @@ -0,0 +1 @@ +//! This crate contains all shared UI for the workspace. diff --git a/web/Cargo.toml b/web/Cargo.toml new file mode 100644 index 0000000..42b273f --- /dev/null +++ b/web/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "web" +version = "0.1.0" +edition = "2021" + +[dependencies] +dioxus = { workspace = true, features = ["router"] } +ui = { workspace = true } + +[features] +default = [] +web = ["dioxus/web"] +server = ["dioxus/server"] diff --git a/web/README.md b/web/README.md new file mode 100644 index 0000000..f533f8d --- /dev/null +++ b/web/README.md @@ -0,0 +1,30 @@ +# Development + +The web crate defines the entrypoint for the web app along with any assets, components and dependencies that are specific to web builds. The web crate starts out something like this: + +``` +web/ +├─ assets/ # Assets used by the web app - Any platform specific assets should go in this folder +├─ src/ +│ ├─ main.rs # The entrypoint for the web app.It also defines the routes for the web platform +│ ├─ views/ # The views each route will render in the web version of the app +│ │ ├─ mod.rs # Defines the module for the views route and re-exports the components for each route +│ │ ├─ blog.rs # The component that will render at the /blog/:id route +│ │ ├─ home.rs # The component that will render at the / route +├─ Cargo.toml # The web crate's Cargo.toml - This should include all web specific dependencies +``` + +## Dependencies +Since you have fullstack enabled, the web crate will be built two times: +1. Once for the server build with the `server` feature enabled +2. Once for the client build with the `web` feature enabled + +You should make all web specific dependencies optional and only enabled in the `web` feature. This will ensure that the server builds don't pull in web specific dependencies which cuts down on build times significantly. + +### Serving Your Web App + +You can start your web app with the following command: + +```bash +dx serve +``` diff --git a/web/assets/main.css b/web/assets/main.css new file mode 100644 index 0000000..ef6e674 --- /dev/null +++ b/web/assets/main.css @@ -0,0 +1,6 @@ +body { + background-color: #0f1116; + color: #ffffff; + font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; + margin: 20px; +} \ No newline at end of file diff --git a/web/src/main.rs b/web/src/main.rs new file mode 100644 index 0000000..6201ee3 --- /dev/null +++ b/web/src/main.rs @@ -0,0 +1,17 @@ +use dioxus::prelude::*; + +const MAIN_CSS: Asset = asset!("/assets/main.css"); + +fn main() { + dioxus::launch(App); +} + +#[component] +fn App() -> Element { + // Build cool things ✌️ + + rsx! { + // Global app resources + document::Link { rel: "stylesheet", href: MAIN_CSS } + } +}