From 7141326ea05e7c2fcbb3b93a9003ba4ed5c7fb64 Mon Sep 17 00:00:00 2001 From: NIA Sanitized Release Publisher Date: Mon, 20 Jul 2026 22:35:36 +0000 Subject: [PATCH] Sanitized public release v1.0.3 Source-Tag: v1.0.3 Manifest-SHA256: b7b09bf48f9e092ed8ad82f99c0319d6c3837d0a1549bd0cc4a374276c0f3896 --- AGENTS.md | 109 ++ MANIFEST.sha256 | 40 + README.md | 132 ++ UPGRADING.md | 84 ++ VERSION | 1 + files/glowing-bear/colour-settings.html | 20 + files/glowing-bear/colour-settings.js.inc | 102 ++ files/glowing-bear/command-menu.html | 9 + files/glowing-bear/command-menu.js.inc | 146 +++ files/glowing-bear/connection-panel.html | 36 + files/glowing-bear/context-menu.html | 3 + files/glowing-bear/context-menu.js | 95 ++ files/glowing-bear/cyberpunk.css | 910 +++++++++++++ files/glowing-bear/drop-settings.html | 13 + files/glowing-bear/fonts/OFL.txt | 94 ++ .../fonts/OpenDyslexic-Bold.woff2 | Bin 0 -> 108068 bytes .../fonts/OpenDyslexic-BoldItalic.woff2 | Bin 0 -> 117844 bytes .../fonts/OpenDyslexic-Italic.woff2 | Bin 0 -> 107968 bytes .../fonts/OpenDyslexic-Regular.woff2 | Bin 0 -> 103336 bytes files/glowing-bear/login-hero.html | 16 + files/glowing-bear/neodrop-crypto.js | 326 +++++ files/glowing-bear/neodrop-plugin.js.inc | 27 + files/glowing-bear/neodrop.js | 62 + files/glowing-bear/server-manager.html | 17 + files/glowing-bear/server-manager.js | 56 + files/glowing-bear/sidebar-resize.js.inc | 85 ++ files/glowing-bear/weechat-settings.html | 20 + files/glowing-bear/weechat-settings.js.inc | 150 +++ files/neodrop-manager/manage.css | 32 + files/neodrop-manager/manage.html | 52 + files/neodrop-manager/manage.js | 142 ++ .../neodrop-manager/neodrop_manager_agent.py | 1143 +++++++++++++++++ .../neodrop-manager/neodrop_manager_plugin.c | 327 +++++ files/neodrop/app.js | 88 ++ files/neodrop/index.html | 71 + files/neodrop/neodrop_server.py | 613 +++++++++ files/neodrop/style.css | 79 ++ files/neoguard/neoguard_agent.py | 132 ++ files/neoguard/neoguard_plugin.c | 186 +++ files/neoguard/neoguardd.py | 455 +++++++ scripts/customize-glowing-bear.pl | 524 ++++++++ 41 files changed, 6397 insertions(+) create mode 100644 AGENTS.md create mode 100644 MANIFEST.sha256 create mode 100644 README.md create mode 100644 UPGRADING.md create mode 100644 VERSION create mode 100644 files/glowing-bear/colour-settings.html create mode 100644 files/glowing-bear/colour-settings.js.inc create mode 100644 files/glowing-bear/command-menu.html create mode 100644 files/glowing-bear/command-menu.js.inc create mode 100644 files/glowing-bear/connection-panel.html create mode 100644 files/glowing-bear/context-menu.html create mode 100644 files/glowing-bear/context-menu.js create mode 100644 files/glowing-bear/cyberpunk.css create mode 100644 files/glowing-bear/drop-settings.html create mode 100644 files/glowing-bear/fonts/OFL.txt create mode 100644 files/glowing-bear/fonts/OpenDyslexic-Bold.woff2 create mode 100644 files/glowing-bear/fonts/OpenDyslexic-BoldItalic.woff2 create mode 100644 files/glowing-bear/fonts/OpenDyslexic-Italic.woff2 create mode 100644 files/glowing-bear/fonts/OpenDyslexic-Regular.woff2 create mode 100644 files/glowing-bear/login-hero.html create mode 100644 files/glowing-bear/neodrop-crypto.js create mode 100644 files/glowing-bear/neodrop-plugin.js.inc create mode 100644 files/glowing-bear/neodrop.js create mode 100644 files/glowing-bear/server-manager.html create mode 100644 files/glowing-bear/server-manager.js create mode 100644 files/glowing-bear/sidebar-resize.js.inc create mode 100644 files/glowing-bear/weechat-settings.html create mode 100644 files/glowing-bear/weechat-settings.js.inc create mode 100644 files/neodrop-manager/manage.css create mode 100644 files/neodrop-manager/manage.html create mode 100644 files/neodrop-manager/manage.js create mode 100644 files/neodrop-manager/neodrop_manager_agent.py create mode 100644 files/neodrop-manager/neodrop_manager_plugin.c create mode 100644 files/neodrop/app.js create mode 100644 files/neodrop/index.html create mode 100644 files/neodrop/neodrop_server.py create mode 100644 files/neodrop/style.css create mode 100644 files/neoguard/neoguard_agent.py create mode 100644 files/neoguard/neoguard_plugin.c create mode 100644 files/neoguard/neoguardd.py create mode 100755 scripts/customize-glowing-bear.pl diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..e6dc014 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,109 @@ +# AGENTS.md + +## Scope + +This source kit contains application components and frontend customization +templates. The operator owns domains, DNS, TLS, routing, hosts, firewalls, +service supervision, filesystem layout, users, credentials, and deployment +tooling. + +Do not turn this kit into a copy of an example or inferred architecture. Ask +the operator for every missing trust, origin, address, path, and lifecycle +decision. + +## Non-Negotiable Invariants + +- Never infer or reuse example domains, addresses, accounts, paths, or topology. +- Never add DNS mutation, certificate issuance, SSH fan-out, or static routing + without explicit operator instructions. +- Never disable TLS verification or SSH host-key verification. +- Never trust forwarded client-address headers from an unverified proxy peer. +- Never broaden upload, management, or trusted-proxy networks implicitly. +- Never package credentials, keys, certificates, capability URLs, catalogs, + databases, logs, local configuration, or personal images. +- Keep the generic source kit's documented placeholders intact; never publish + a rendered deployment artifact containing unresolved placeholders. +- Treat `{{NEODROP_CRYPTO_CONTEXT}}` as immutable after the first uploaded drop. +- Keep the same crypto context and protocol framing in every NeoDrop client and + manager implementation. + +## Source Of Truth + +Resolve the placeholders in source templates or generate deployment-specific +configuration from a separately protected operator configuration. Do not edit +rendered deployment files as the only source of truth. + +When introducing generated files, include a generated-file header and a digest +of the non-secret configuration that produced them. Keep secret values out of +that digest and out of repository history. + +Render values with context-appropriate validation and escaping. HTML text, +HTML fragments, regular expressions, JavaScript, Python, C strings, CSS, and +Perl substitutions are different contexts; a value safe in one may be unsafe +in another. + +## Deployment Adaptation + +Before writing deployment automation, obtain explicit operator decisions for: + +- public relay and drop origins; +- product, operator, node, and drop display labels; +- component placement and bind addresses; +- reverse-proxy peers and forwarded-header behavior; +- upload and management source CIDRs; +- state, socket, credential, and backup paths; +- process identities and file ownership; +- TLS termination and certificate lifecycle; +- DNS publication and update lifecycle; +- firewall rules, health checks, monitoring, rollback, and recovery; +- IRC server, account, certificate authentication, and channel policy. + +Treat nginx, systemd, containers, orchestration, and configuration-management +systems as operator choices. Add only the integration files needed for the +confirmed target environment. + +## Component Contracts + +NeoBear requires a WeeChat relay endpoint and a NeoDrop public origin. NeoDrop +requires persistent ciphertext storage, a trusted proxy definition, explicit +upload/management networks, and the shared crypto context. NeoGuard requires a +protected shared key and authenticated internal reporting path. The manager +requires protected catalog/token credentials, private state, restricted Unix +sockets, and access to the NeoDrop object API. + +Preserve origin validation, source-IP validation, authenticated encryption, +metadata authentication, capability secrecy, request-size limits, and socket +permission checks when adapting components. + +## Required Workflow + +1. Inventory all unresolved `{{PLACEHOLDER}}` values. +2. Ask for missing operator decisions instead of selecting convenient defaults. +3. Render into a temporary directory, never over the pristine source kit. +4. Run syntax and protocol tests for every changed language/component. +5. Scan all paths, file bytes, and archive metadata for private information. +6. Verify no secret-like file types or key headers are present. +7. Verify archive ownership, modes, timestamps, member types, and checksums. +8. Test encrypted upload, authenticated metadata, download, checksum, expiry, + catalog registration, and deletion in staging. +9. Review the final manifest before publication. + +## Release Checks + +After rendering an operator tree, at minimum run: + +```sh +test -z "$(rg -l '\{\{[A-Z0-9_]+\}\}' files scripts)" +python3 -m py_compile files/neodrop/*.py files/neodrop-manager/*.py files/neoguard/*.py +node --check files/neodrop/app.js +node --check files/glowing-bear/neodrop-crypto.js +perl -c scripts/customize-glowing-bear.pl +``` + +Also run the repository's NeoDrop protocol tests when working from the full +source repository. A deployment-specific release process must add leakage, +reproducibility, integration, and archive-metadata tests appropriate to its +toolchain. + +Do not add a file to a release allowlist merely to make a test pass. Every file +must have a documented source-distribution or runtime purpose. diff --git a/MANIFEST.sha256 b/MANIFEST.sha256 new file mode 100644 index 0000000..63430cd --- /dev/null +++ b/MANIFEST.sha256 @@ -0,0 +1,40 @@ +f79675e2a01fc10dd57ba6213bdc2a56ce56cf09a9ea090fd293ed4f221b0604 AGENTS.md +eda1df701967c59116caac8e044d03eb1c3674c512dc47f67c413e813959f137 README.md +7c1a1efa6f5d1656b0d37606dd08036a859c94077d0033e44db934e71158844c UPGRADING.md +f5e5c9534532840fcd45bb002e69ed85c61dba2753450e26b448b7df1481e24d VERSION +8e8d15f69ef22bb01bbe91bda464b3f6d108157dc20bf703d7082e82ad89eb2d files/glowing-bear/colour-settings.html +7eb960735c7f18be921ff65b0ef1159b013a9bd262631019db965e64567cb131 files/glowing-bear/colour-settings.js.inc +5bdf903fa189a695223b518a2c668361930cf2c6168b66fa38b2e562cacb6491 files/glowing-bear/command-menu.html +fa0947074c7f924cc4856147718fe39d99ab670151b4f2923e7bc1738bd7cac3 files/glowing-bear/command-menu.js.inc +c98a8b56683b9b6829983bfb7e8d33ba8259109ad2aa4a6a709379d3ceaa81c3 files/glowing-bear/connection-panel.html +4d4928a6c3266b79b584801ff6322ca01af18f67687f79cdc8ada2d09463cb07 files/glowing-bear/context-menu.html +9fe9508496492841c06f1af0a935ed090f2c9a1b77e637b4a5b05ecb231a586c files/glowing-bear/context-menu.js +a8bc23b061470152aab9c329b5bab1793180d5f9d7bfd2b9e2fa9d2d8552e555 files/glowing-bear/cyberpunk.css +39ee1654fca851ffe37639c448fc406819329fa836449849db3664c50c4f64df files/glowing-bear/drop-settings.html +caafcccfb70fc72458fcbda812ec8f0a06cb300cbabb87eabbb30b946124394b files/glowing-bear/fonts/OFL.txt +b534a0b84ef3cca941ebdb506ce3f4e0010aa4ef881271bac8b6959dbf694fbf files/glowing-bear/fonts/OpenDyslexic-Bold.woff2 +d055755690b99774a69e90600d1efc60b99ce05b3092155165609453b4b81c34 files/glowing-bear/fonts/OpenDyslexic-BoldItalic.woff2 +b18685dcb99b4ba903549d215c0ae2ab39a5087097614fd4100ae6d387332b47 files/glowing-bear/fonts/OpenDyslexic-Italic.woff2 +0441bc21071e42db57c217f93fbc48d3b55a2987c02814c94dc93621c42e8695 files/glowing-bear/fonts/OpenDyslexic-Regular.woff2 +c85f448d0964f84a31cb378fd0700fbc060f2828996468cfc8c678e3bc478fb6 files/glowing-bear/login-hero.html +687c35d82bcd7b8aa37c9bc6d594c519b7d4304e014a9ba17364f6de39003c05 files/glowing-bear/neodrop-crypto.js +187e083c7f73d31b003c15e2872eefd20bb2de5f171d375d482d1997afd6e580 files/glowing-bear/neodrop-plugin.js.inc +0f6d4866b6863b8431122be599d91a57baabb5387d94a8188fe831e782186986 files/glowing-bear/neodrop.js +697f49b8b7ea88ec98e6eae9af67125d6ea2bd31bce9b645a36ac5e7584954fe files/glowing-bear/server-manager.html +bafbfed58bd31c244688f97be442aff7d93345f30fd1c5757fdb2c4a8d611811 files/glowing-bear/server-manager.js +03884100e99459f6655c9d4350ee0d3b5dfa803f5ba006535419992726c49402 files/glowing-bear/sidebar-resize.js.inc +08ed847831f41ced57a55760024e0c37688787bc1975bb1a6b85c98faaff67bf files/glowing-bear/weechat-settings.html +09fb6a4846eb42f0dd65108713dc8ab13303d9e744028279ef4c8f37cf9adf00 files/glowing-bear/weechat-settings.js.inc +c928fcccc782ddb29fb426a8e46a7d1e82cc979a8964605f891ca6612d484d9a files/neodrop/app.js +c5c46ab018804de11d021d86a3a54c57403960e7e652fde7fdc41e513ad56223 files/neodrop/index.html +d819b4b8caea327c08d1bad75f8009cf6b05ca5178fc9d387f7d50d5b0cef016 files/neodrop/neodrop_server.py +30e84ea6c687fc27e705b299850afe1218d554c9b4c5fd1894ed3022cc2e7185 files/neodrop/style.css +e5ef6ce6a49d8cc53d5747b0feb64c4c15db2cb372674daa4b099c666a155c03 files/neodrop-manager/manage.css +c77d4d421dca43606be294dc2a630591fbe156138c0606192628042aa2776759 files/neodrop-manager/manage.html +de60984b4d82a068be692b62662d07daff10e3a9f370cb77232296d22177ee79 files/neodrop-manager/manage.js +172fd0a85beab0aefd0483fb1a4396391a983a56f75f58400b671931b3f43710 files/neodrop-manager/neodrop_manager_agent.py +c2eb97cf9dcffd5b1a7fa978a74f481a22c91cc3f6b91356a61a1e8926c7b956 files/neodrop-manager/neodrop_manager_plugin.c +37bccd91a193d4c150a28becd68a8f5b9cdc9db9fac3b188d06510bc3ed8b701 files/neoguard/neoguard_agent.py +2f50ef95f42c88c8b3a04bc347b5db0db228bae96dfe65107af5894e362a9367 files/neoguard/neoguard_plugin.c +17a5343fcae588ee7c6ac092a7e3f3a14d3b2c0a3429aa2561e5d3a89a52dd93 files/neoguard/neoguardd.py +d16b31e7d68d8845892225a79bbaf4d5be2083b876e9120839c08664dc32f589 scripts/customize-glowing-bear.pl diff --git a/README.md b/README.md new file mode 100644 index 0000000..b6bc72a --- /dev/null +++ b/README.md @@ -0,0 +1,132 @@ +# NeoRelay Generic Source Kit + +The release version is recorded in `VERSION`. Existing operators should follow +`UPGRADING.md` and deploy the full compatible component set rather than copying +individual changed files. + +This archive contains sanitized application source templates for NeoBear, +NeoDrop, NeoGuard, and the encrypted NeoDrop manager. It is intentionally not a +turnkey infrastructure deployment and cannot run until every `{{PLACEHOLDER}}` +has been resolved. + +The operator owns the deployment topology, domains, DNS records, TLS +certificates, reverse proxies, routing, firewalls, service supervision, users, +filesystem layout, and secret distribution. Nothing in this kit assumes how +those responsibilities are implemented. + +## Security Boundary + +The kit includes only reviewed application source and frontend customization +files. It deliberately excludes: + +- live deployment and provisioning scripts; +- DNS mutation or authoritative-server configuration; +- certificate issuance and renewal automation; +- nginx configuration and TLS/key paths; +- SSH hosts, jump hosts, identities, and copy commands; +- private or public network diagrams, addresses, and routes; +- systemd units tied to a particular filesystem layout; +- operator identities, IRC accounts, domains, and personal branding images; +- keys, credentials, catalogs, databases, capability URLs, and Git history. + +The NeoBear assets include OpenDyslexic WOFF2 web fonts and their `OFL.txt` +license. Keep the license with the font files in rendered distributions. + +`MANIFEST.sha256` records the checksum of each regular file in the extracted archive. +The archive itself uses normalized root ownership and timestamps, so it does +not disclose the build workstation account. + +## Placeholders + +The published generic kit intentionally retains this exact documented +placeholder set. Resolve all placeholders consistently before running or +compiling anything. A rendered deployment artifact must contain no unresolved +placeholders. +Several occur in multiple protocol implementations and must have identical +values everywhere. + +### Public Identity + +- `{{RELAY_ORIGIN}}`: complete HTTPS origin for the web IRC client. +- `{{RELAY_HOST}}`: hostname only for the web IRC client. +- `{{DROPS_ORIGIN}}`: complete HTTPS origin for NeoDrop. +- `{{DROPS_HOST}}`: hostname only for NeoDrop. +- `{{DROPS_HOST_REGEX}}`: regex-escaped NeoDrop hostname. +- `{{RELAY_TITLE_HTML}}`, `{{DROPS_TITLE_HTML}}`: trusted static heading HTML. +- `{{RELAY_GATEWAY_LABEL}}`, `{{OPERATOR_LABEL}}`: plain display labels. +- `{{PRODUCT_NAME}}`: product/author label used by the frontend and plugins. +- `{{NODE_LABEL}}`, `{{DROP_NODE_LABEL}}`, `{{DROP_TAGLINE}}`: plain branding text. + +### Trust And Networking + +- `{{NEODROP_BIND_ADDRESS}}`, `{{NEOGUARD_BIND_ADDRESS}}`: component binds. +- `{{TRUSTED_PROXY_ADDRESS}}`: the only peer allowed to supply client IPs. +- `{{UPLOAD_CIDR_1}}`, `{{UPLOAD_CIDR_2}}`, `{{UPLOAD_CIDR_3}}`: upload source networks. +- `{{MANAGEMENT_CIDR_1}}`, `{{MANAGEMENT_CIDR_2}}`, `{{MANAGEMENT_CIDR_3}}`: manager networks. +- `{{NEOGUARD_INTERNAL_URL}}`: private NeoGuard attempt-report endpoint. +- `{{BLOCKED_REDIRECT_URL}}`: operator-selected blocked-client destination. + +Use a deliberately non-routable CIDR for unused slots. Never broaden a trust +list merely to make a request succeed. Preserve the trusted-proxy check before +accepting forwarded client addresses. + +### Storage And Credentials + +- `{{NEODROP_DATA_ROOT}}`, `{{NEOGUARD_DATA_ROOT}}`: persistent state roots. +- `{{NEODROP_MANAGER_TOKEN_HASH_PATH}}`: manager-token hash location. +- `{{NEOGUARD_KEY_PATH}}`: shared NeoGuard key location. +- `{{CATALOG_KEY_PATH}}`, `{{MANAGER_API_TOKEN_PATH}}`: manager credentials. +- `{{MANAGER_CATALOG_PATH}}`, `{{MANAGER_DOWNLOAD_ROOT}}`: manager state. +- `{{MANAGER_CONTROL_SOCKET_PATH}}`, `{{MANAGER_HTTP_SOCKET_PATH}}`: manager sockets. +- `{{NEOGUARD_CONTROL_SOCKET_PATH}}`: NeoGuard agent socket. + +### Protocol Compatibility + +- `{{NEODROP_CRYPTO_CONTEXT}}`: immutable HKDF salt/context for one deployment. + +Choose the crypto context once, record it in protected operator documentation, +and use the exact same byte string in all browser and manager components. +Changing it invalidates existing capability links. + +## Branding Assets + +Personal image files are not included. Before using +`scripts/customize-glowing-bear.pl`, provide reviewed JPEG and PNG assets at +the filenames expected by that script or adapt the customizer to your asset +pipeline. Strip image metadata before distribution. + +## Integration Contracts + +NeoDrop stores ciphertext and exposes its upload/object HTTP API. NeoGuard +receives abuse-attempt reports from trusted components. The manager holds +encrypted catalog state and deletion capabilities. NeoBear connects to a +WeeChat relay and uses the NeoDrop public origin for browser uploads. + +The supplied Python, C, JavaScript, HTML, CSS, and Perl files are source +components, not proof that a particular deployment is secure. Review process +ownership, socket permissions, state backups, request-size limits, proxy +headers, origin checks, and network policy in the target environment. + +## Adaptation Workflow + +1. Read `AGENTS.md` before asking a coding agent to modify the kit. +2. Design the target topology and trust boundaries outside this source tree. +3. Resolve every placeholder from explicit operator decisions. +4. Supply neutral branding assets and deployment-specific integration files. +5. Run syntax, protocol, leakage, and archive-integrity checks. +6. Deploy to a staging environment and test encrypted upload/download/delete. +7. Publish only an artifact produced from the reviewed, rendered tree. + +Useful pre-deployment checks include: + +```sh +test -z "$(rg -l '\{\{[A-Z0-9_]+\}\}' files scripts)" +sha256sum -c MANIFEST.sha256 +python3 -m py_compile files/neodrop/*.py files/neodrop-manager/*.py files/neoguard/*.py +node --check files/neodrop/app.js +node --check files/glowing-bear/neodrop-crypto.js +perl -c scripts/customize-glowing-bear.pl +``` + +Recreate `MANIFEST.sha256` after rendering because placeholder resolution +necessarily changes file contents. diff --git a/UPGRADING.md b/UPGRADING.md new file mode 100644 index 0000000..cc984af --- /dev/null +++ b/UPGRADING.md @@ -0,0 +1,84 @@ +# Upgrading NeoRelay + +This source kit is a complete, versioned application source set for upgrading +an existing NeoRelay deployment. It is not a deployment-specific patch and it +does not contain infrastructure configuration, credentials, or persistent +state. + +## Compatibility + +- Upgrade NeoBear, NeoDrop, NeoGuard, and the NeoDrop manager as one tested set. +- Preserve the existing `{{NEODROP_CRYPTO_CONTEXT}}` value exactly. Changing it + makes existing encrypted links unreadable. +- Preserve the existing NeoDrop protocol framing and all operator trust + decisions, including origins, proxy peers, source networks, and state paths. +- `scripts/customize-glowing-bear.pl` targets Glowing Bear revision + `d182657a3b882cfb54e294f9a56fbdd2954d73b0`. Test any other revision before + deployment. +- Do not replace operator-managed WeeChat, IRC, proxy, service, DNS, TLS, or + firewall configuration with values inferred from this kit. + +## 1. Verify And Inventory + +1. Verify the archive checksum through a trusted channel. +2. Run `sha256sum -c MANIFEST.sha256` from the extracted kit. +3. Record the currently deployed version and hashes of its rendered runtime + files and integration configuration. +4. Inventory every `{{PLACEHOLDER}}` and map it to the existing deployment's + protected source of truth. Do not select new values during an application + update unless the operator has approved a separate configuration change. + +## 2. Back Up + +Create and test a protected, application-consistent backup of: + +- NeoDrop's database and ciphertext object tree as one coordinated snapshot; +- the encrypted manager catalog, catalog key, API token material, and verifier; +- the NeoGuard database and shared authentication key; +- WeeChat configuration, secure data, certificates, and plugin state; +- the current rendered application files and operator integration files. + +Stop writers or use storage-specific atomic snapshot procedures. Preserve file +ownership and modes. Confirm that the backup can be restored before upgrading. + +## 3. Render A Staging Tree + +1. Extract the kit into a new temporary directory, not over the live tree. +2. Resolve placeholders from the existing protected configuration with + context-appropriate validation and escaping. +3. Supply reviewed branding assets and operator-owned integration files. +4. Recreate `MANIFEST.sha256` after rendering. +5. Confirm the rendered tree contains no unresolved placeholders, credentials, + private keys, capability URLs, state, logs, or backups. + +The generic source kit intentionally contains documented placeholders. A +rendered deployment artifact must not contain any unresolved placeholders. + +## 4. Test + +Run the checks listed in `README.md`, compile native plugins against the target +WeeChat headers, and validate the operator's proxy and service configuration. +In staging, verify: + +- an existing encrypted link still downloads and authenticates correctly; +- a new upload, metadata read, download, checksum, expiry, and deletion; +- manager catalog registration and access to existing entries; +- NeoGuard authenticated reporting and recovery; +- origin, source-address, and trusted-proxy enforcement; +- startup from a restored copy of existing persistent state. + +## 5. Deploy + +Install the rendered files into a versioned directory or otherwise retain the +complete previous runtime tree. Deploy the compatible browser, server, manager, +and guard components as one release. Run health checks before restoring normal +traffic or writes, then record the deployed version and rendered manifest. + +## 6. Roll Back + +If validation fails, isolate the new version and restore the previous runtime +files and integration configuration. Preserve the original crypto context and +credentials. Restore persistent state only if the upgrade performed +incompatible writes; restore NeoDrop metadata and ciphertext together. Verify +an existing encrypted link, manager catalog access, and component health after +rollback. diff --git a/VERSION b/VERSION new file mode 100644 index 0000000..21e8796 --- /dev/null +++ b/VERSION @@ -0,0 +1 @@ +1.0.3 diff --git a/files/glowing-bear/colour-settings.html b/files/glowing-bear/colour-settings.html new file mode 100644 index 0000000..4a40afb --- /dev/null +++ b/files/glowing-bear/colour-settings.html @@ -0,0 +1,20 @@ +
+
+

These values are read from and saved to WeeChat. Role colours update irc.color.nick_prefixes.

+ +
+

+
Chat
+
+ +
+
Nickname roles
+
+ + + + +
+
Channel nickname palette
+
weechat.color.chat_nick_colors
+
diff --git a/files/glowing-bear/colour-settings.js.inc b/files/glowing-bear/colour-settings.js.inc new file mode 100644 index 0000000..f7b6e1d --- /dev/null +++ b/files/glowing-bear/colour-settings.js.inc @@ -0,0 +1,102 @@ + var neoColourOptions = [ + {name: 'weechat.color.chat_nick_self', label: 'Your nickname', variable: '--neorelay-nick-self'}, + {name: 'weechat.color.chat_nick', label: 'Regular nickname fallback', variable: '--neorelay-nick'}, + {name: 'weechat.color.chat_nick_other', label: 'Other private nicknames', variable: '--neorelay-nick-other'}, + {name: 'weechat.color.nicklist_away', label: 'Away / AFK', variable: '--neorelay-nick-away'}, + {name: 'weechat.color.chat_highlight', label: 'Highlight foreground', variable: '--neorelay-chat-highlight'}, + {name: 'weechat.color.chat_highlight_bg', label: 'Highlight background', variable: '--neorelay-chat-highlight-bg'}, + {name: 'weechat.color.chat_time', label: 'Timestamp', variable: '--neorelay-chat-time'} + ]; + var neoPrefixOption = 'irc.color.nick_prefixes'; + var neoPaletteOption = 'weechat.color.chat_nick_colors'; + $scope.neoWeeChatColours = {loading: false, status: '', items: neoColourOptions, rows: {}, values: {}, prefixes: {}, prefixRaw: '', palettePreview: []}; + $scope.neoWeeChatColourPreview = neoResolveWeeChatColour; + $scope.updateNeoPalettePreview = function() { + $scope.neoWeeChatColours.palettePreview = String($scope.neoWeeChatColours.values[neoPaletteOption] || '').split(',').map(function(value) { return value.trim(); }).filter(neoValidWeeChatColour); + }; + + function neoParsePrefixes(value) { + var result = {}; + String(value || '').split(';').forEach(function(entry) { + var match = entry.match(/^([A-Za-z*]):([^;]+)$/); + if (match) result[match[1]] = match[2].replace(/^[*!/_|]+/, ''); + }); + return result; + } + + function neoApplyRelayColours() { + neoColourOptions.forEach(function(item) { + var value = $scope.neoWeeChatColours.values[item.name]; + document.documentElement.style.setProperty(item.variable, neoResolveWeeChatColour(value)); + }); + var prefixes = $scope.neoWeeChatColours.prefixes; + document.documentElement.style.setProperty('--neorelay-nick-op', neoResolveWeeChatColour(prefixes.o || prefixes.a || prefixes.q || prefixes['*'])); + document.documentElement.style.setProperty('--neorelay-nick-halfop', neoResolveWeeChatColour(prefixes.h || prefixes['*'])); + document.documentElement.style.setProperty('--neorelay-nick-voice', neoResolveWeeChatColour(prefixes.v || prefixes['*'])); + } + + $scope.loadNeoWeeChatColours = function() { + if (!$rootScope.connected || $scope.neoWeeChatColours.loading) return; + $scope.neoWeeChatColours.loading = true; + $scope.neoWeeChatColours.status = 'Loading WeeChat colours...'; + var names = neoColourOptions.map(function(item) { return item.name; }).concat([neoPrefixOption, neoPaletteOption]); + Promise.all(names.map(function(name) { return connection.requestInfolist('option', 0, name); })).then(function(results) { + $scope.$applyAsync(function() { + results.forEach(function(rows) { + if (!rows[0]) return; + var row = neoNormalizeOption(rows[0]); + neoLoadedOptions[row.name] = row; + $scope.neoWeeChatColours.rows[row.name] = row; + $scope.neoWeeChatColours.values[row.name] = row.value; + }); + $scope.neoWeeChatColours.prefixRaw = $scope.neoWeeChatColours.values[neoPrefixOption] || ''; + $scope.neoWeeChatColours.prefixes = neoParsePrefixes($scope.neoWeeChatColours.prefixRaw); + $scope.updateNeoPalettePreview(); + neoApplyRelayColours(); + $scope.neoWeeChatColours.loading = false; + $scope.neoWeeChatColours.status = 'Loaded from WeeChat.'; + }); + }, function() { + $scope.$applyAsync(function() { + $scope.neoWeeChatColours.loading = false; + $scope.neoWeeChatColours.status = 'Unable to load WeeChat colours.'; + }); + }); + }; + + $scope.setNeoWeeChatColour = function(name) { + var row = $scope.neoWeeChatColours.rows[name]; + var value = $scope.neoWeeChatColours.values[name]; + neoWriteOption(row, value, function(updated) { + $scope.neoWeeChatColours.values[name] = updated.value; + if (name === neoPaletteOption) $scope.updateNeoPalettePreview(); + neoApplyRelayColours(); + $scope.neoWeeChatColours.status = 'Saved ' + name + ' to WeeChat.'; + }, function(message) { $scope.neoWeeChatColours.status = message; }); + }; + + $scope.setNeoNickPrefixColour = function(mode) { + var row = $scope.neoWeeChatColours.rows[neoPrefixOption]; + if (!row || !neoValidWeeChatColour($scope.neoWeeChatColours.prefixes[mode])) return; + var found = false; + var entries = String($scope.neoWeeChatColours.prefixRaw || '').split(';').filter(Boolean).map(function(entry) { + if (entry.slice(0, 2) === mode + ':') { + found = true; + return mode + ':' + $scope.neoWeeChatColours.prefixes[mode]; + } + return entry; + }); + if (!found) entries.push(mode + ':' + $scope.neoWeeChatColours.prefixes[mode]); + var value = entries.join(';'); + neoWriteOption(row, value, function(updated) { + $scope.neoWeeChatColours.prefixRaw = updated.value; + $scope.neoWeeChatColours.values[neoPrefixOption] = updated.value; + $scope.neoWeeChatColours.prefixes = neoParsePrefixes(updated.value); + neoApplyRelayColours(); + $scope.neoWeeChatColours.status = 'Saved IRC prefix colours to WeeChat.'; + }, function(message) { $scope.neoWeeChatColours.status = message; }); + }; + + $scope.$watch(function() { return $rootScope.connected; }, function(connected) { + if (connected) $timeout($scope.loadNeoWeeChatColours, 250); + }); diff --git a/files/glowing-bear/command-menu.html b/files/glowing-bear/command-menu.html new file mode 100644 index 0000000..4e89b9e --- /dev/null +++ b/files/glowing-bear/command-menu.html @@ -0,0 +1,9 @@ +
+ +
Loading commands...
+
No matching commands
+
diff --git a/files/glowing-bear/command-menu.js.inc b/files/glowing-bear/command-menu.js.inc new file mode 100644 index 0000000..f67abeb --- /dev/null +++ b/files/glowing-bear/command-menu.js.inc @@ -0,0 +1,146 @@ + var commandHooks = null; + var commandHooksRequest = null; + var commandMenuGeneration = 0; + var suppressCommandMenuKeypress = false; + var serverCommandFallbacks = [ + {command:'defcon',args:'[]',description:'Set or show Ergo emergency restrictions',insertion:'/quote DEFCON',serverCommand:true}, + {command:'deoper',args:'',description:'Remove IRC operator privileges',insertion:'/quote DEOPER',serverCommand:true}, + {command:'dline',args:'[] / [] || LIST',description:'Add or list IP/network bans',insertion:'/quote DLINE',serverCommand:true}, + {command:'kline',args:'[] [] || LIST',description:'Add or list client-mask bans',insertion:'/quote KLINE',serverCommand:true}, + {command:'uban',args:'ADD|DEL|LIST|INFO ',description:'Manage unified bans',insertion:'/quote UBAN',serverCommand:true}, + {command:'undline',args:'/',description:'Remove an IP/network ban',insertion:'/quote UNDLINE',serverCommand:true}, + {command:'unkline',args:'',description:'Remove a client-mask ban',insertion:'/quote UNKLINE',serverCommand:true} + ]; + + var mergeCommandHooks = function(hooks) { + var unique = Object.create(null); + var hasOwn = Object.prototype.hasOwnProperty; + hooks.forEach(function(hook) { + var key = String(hook.command || '').toLowerCase(); + if (key && (!hasOwn.call(unique, key) || hook.priority > unique[key].priority)) { + unique[key] = Object.assign({}, hook, {command:key}); + } + }); + serverCommandFallbacks.forEach(function(hook) { + if (!hasOwn.call(unique, hook.command)) unique[hook.command] = hook; + }); + return Object.keys(unique).map(function(key){return unique[key];}).sort(function(left,right){return left.command.localeCompare(right.command);}); + }; + + $scope.commandMenuOpen = false; + $scope.commandMenuLoading = false; + $scope.commandMenuMatches = []; + $scope.commandMenuIndex = 0; + + var closeCommandMenu = function() { + $scope.commandMenuOpen = false; + $scope.commandMenuLoading = false; + $scope.commandMenuMatches = []; + $scope.commandMenuIndex = 0; + }; + + var updateCommandMenu = function() { + var match = /^\/([^\s]*)$/.exec($scope.command || ''); + if (!match) { + closeCommandMenu(); + return; + } + + $scope.commandMenuOpen = true; + $scope.commandMenuIndex = 0; + if (commandHooks === null) { + $scope.commandMenuLoading = true; + if (commandHooksRequest === null) { + var requestGeneration = commandMenuGeneration; + commandHooksRequest = connection.requestCommandHooks().then(function(hooks) { + if (requestGeneration !== commandMenuGeneration) { + return; + } + commandHooks = mergeCommandHooks(hooks); + commandHooksRequest = null; + updateCommandMenu(); + }, function() { + if (requestGeneration !== commandMenuGeneration) { + return; + } + commandHooks = mergeCommandHooks([]); + commandHooksRequest = null; + updateCommandMenu(); + }); + } + return; + } + + var prefix = match[1].toLowerCase(); + var activeBuffer = models.getActiveBuffer(); + var isIrcBuffer = activeBuffer && activeBuffer.plugin === 'irc'; + $scope.commandMenuLoading = false; + $scope.commandMenuMatches = commandHooks.filter(function(hook) { + return (!hook.serverCommand || isIrcBuffer) && hook.command.indexOf(prefix) === 0; + }); + }; + + $scope.selectCommand = function(item) { + var suffix = item.args ? ' ' : ''; + $scope.command = (item.insertion || ('/' + item.command.toLowerCase())) + suffix; + closeCommandMenu(); + setTimeout(function() { + var inputNode = $scope.getInputNode(); + inputNode.focus(); + inputNode.setSelectionRange($scope.command.length, $scope.command.length); + }, 0); + }; + + var scrollCommandMenuSelection = function() { + setTimeout(function() { + var selected = document.getElementById( + $scope.inputId + '-command-' + $scope.commandMenuIndex + ); + if (selected) { + selected.scrollIntoView({block: 'nearest'}); + } + }, 0); + }; + + $scope.handleCommandMenuKey = function(event, code, inputNode) { + if (suppressCommandMenuKeypress && event.type === 'keypress' && + (code === 9 || code === 13)) { + event.preventDefault(); + return true; + } + if (!$scope.commandMenuOpen || event.type !== 'keydown' || + document.activeElement !== inputNode || event.altKey || + event.ctrlKey || event.metaKey) { + return false; + } + + var count = $scope.commandMenuMatches.length; + if ((code === 38 || code === 40) && count > 0) { + var direction = code === 38 ? -1 : 1; + $scope.commandMenuIndex = ($scope.commandMenuIndex + direction + count) % count; + scrollCommandMenuSelection(); + event.preventDefault(); + return true; + } + if ((code === 9 || code === 13) && count > 0 && !event.shiftKey) { + $scope.selectCommand($scope.commandMenuMatches[$scope.commandMenuIndex]); + suppressCommandMenuKeypress = true; + setTimeout(function() { suppressCommandMenuKeypress = false; }, 0); + event.preventDefault(); + return true; + } + if (code === 27) { + closeCommandMenu(); + event.preventDefault(); + return true; + } + return false; + }; + + var removeCommandMenuDisconnect = $rootScope.$on('relayDisconnect', function() { + commandMenuGeneration++; + commandHooks = null; + commandHooksRequest = null; + closeCommandMenu(); + }); + $scope.$on('$destroy', removeCommandMenuDisconnect); diff --git a/files/glowing-bear/connection-panel.html b/files/glowing-bear/connection-panel.html new file mode 100644 index 0000000..4ede9ba --- /dev/null +++ b/files/glowing-bear/connection-panel.html @@ -0,0 +1,36 @@ +
+
+
+ +
+
+
diff --git a/files/glowing-bear/context-menu.html b/files/glowing-bear/context-menu.html new file mode 100644 index 0000000..344835f --- /dev/null +++ b/files/glowing-bear/context-menu.html @@ -0,0 +1,3 @@ + diff --git a/files/glowing-bear/context-menu.js b/files/glowing-bear/context-menu.js new file mode 100644 index 0000000..99242c2 --- /dev/null +++ b/files/glowing-bear/context-menu.js @@ -0,0 +1,95 @@ +'use strict'; +(function() { + var weechat = angular.module('weechat'); + + weechat.factory('neoContextMenu', ['$rootScope', 'connection', 'models', function($rootScope, connection, models) { + var menu = {visible: false, actions: [], position: {}, label: ''}; + var send = function(buffer, command) { connection.sendMessageToBuffer(buffer.id, command); }; + var action = function(id, label, run, destructive) { return {id: id, label: label, run: run, destructive: Boolean(destructive)}; }; + var safeNick = function(value) { return /^[A-Za-z0-9[\]\\`_^{|}-]+$/.test(value || ''); }; + + function bufferActions(buffer) { + var actions = []; + var core = buffer.fullName === 'core.weechat'; + if (buffer.type === 'server' && buffer.plugin === 'irc') { + actions.push(action('edit-server', 'Edit server settings', function() { $rootScope.$broadcast('neoServerManagerOpen', buffer.server || buffer.shortName); })); + actions.push(action('connect', 'Connect', function() { send(buffer, '/connect ' + buffer.server); })); + actions.push(action('disconnect', 'Disconnect', function() { send(buffer, '/disconnect ' + buffer.server); }, true)); + } + if (buffer.type === 'channel' && buffer.plugin === 'irc') { + actions.push(action('mute', 'Mute activity', function() { send(buffer, '/buffer notify none'); })); + actions.push(action('unmute', 'Unmute activity', function() { send(buffer, '/buffer notify all'); })); + actions.push(action('part', 'Part channel', function() { send(buffer, '/part'); }, true)); + actions.push(action('rejoin', 'Rejoin channel', function() { send(buffer, '/join'); })); + actions.push(action('autojoin-add', 'Add to auto-join', function() { send(buffer, '/autojoin add'); })); + actions.push(action('autojoin-del', 'Remove from auto-join', function() { send(buffer, '/autojoin del'); })); + } + if (/neodrop_manager/.test(buffer.fullName)) { + actions.push(action('drops-list', 'Refresh drops', function() { send(buffer, '/drops list'); })); + actions.push(action('drops-help', 'NeoDrop help', function() { send(buffer, '/drops help'); })); + } + if (/neoguard/.test(buffer.fullName)) { + actions.push(action('guard-status', 'Refresh NeoGuard', function() { send(buffer, '/neoguard status'); })); + actions.push(action('guard-help', 'NeoGuard help', function() { send(buffer, '/neoguard'); })); + } + actions.push(action('clear', 'Clear buffer', function() { send(buffer, '/buffer clear'); })); + if (!core) actions.push(action('close', 'Close buffer', function() { + if (window.confirm('Close ' + (buffer.shortName || buffer.fullName) + '?')) send(buffer, '/buffer close'); + }, true)); + return actions; + } + + function nickActions(target) { + var nick = target.nick.name; + var buffer = target.buffer; + if (!safeNick(nick) || !buffer || buffer.plugin !== 'irc') return []; + var actions = [ + action('dm', 'Direct message', function() { + var prefix = buffer.fullName.substring(0, buffer.fullName.lastIndexOf('.') + 1); + if (!models.setActiveBuffer(prefix + nick, 'fullName')) { models.outgoingQueries.push(nick); send(buffer, '/query -noswitch ' + nick); } + }), + action('whois', 'Whois', function() { send(buffer, '/whois ' + nick); }) + ]; + if (buffer.type === 'channel') { + actions.push(action('op', 'Give operator', function() { send(buffer, '/mode +o ' + nick); })); + actions.push(action('halfop', 'Give half-operator', function() { send(buffer, '/mode +h ' + nick); })); + actions.push(action('voice', 'Give voice', function() { send(buffer, '/mode +v ' + nick); })); + actions.push(action('kick', 'Kick', function() { if (window.confirm('Kick ' + nick + '?')) send(buffer, '/kick ' + nick); }, true)); + actions.push(action('ban', 'Ban', function() { if (window.confirm('Ban ' + nick + '?')) send(buffer, '/ban ' + nick); }, true)); + } + return actions; + } + + return { + menu: menu, + open: function(event, target) { + var actions = target.kind === 'nick' ? nickActions(target) : bufferActions(target.buffer); + if (!actions.length) return; + menu.actions = actions; + menu.label = target.kind === 'nick' ? 'Actions for ' + target.nick.name : 'Buffer actions'; + menu.position = {left: Math.min(event.clientX, window.innerWidth - 230) + 'px', top: Math.min(event.clientY, window.innerHeight - 360) + 'px'}; + menu.visible = true; + }, + close: function() { menu.visible = false; }, + run: function(item) { menu.visible = false; item.run(); } + }; + }]); + + weechat.directive('neoContext', ['neoContextMenu', function(neoContextMenu) { + return {restrict: 'A', link: function(scope, element, attrs) { + var open = function(event) { event.preventDefault(); event.stopPropagation(); scope.$apply(function() { neoContextMenu.open(event, scope.$eval(attrs.neoContext)); }); }; + element.on('contextmenu', open); + scope.$on('$destroy', function() { element.off('contextmenu', open); }); + }}; + }]); + + weechat.directive('neoContextMenuView', ['neoContextMenu', '$document', function(neoContextMenu, $document) { + return {restrict: 'E', templateUrl: 'directives/context-menu.html', link: function(scope) { + scope.menu = neoContextMenu.menu; + scope.runContextAction = neoContextMenu.run; + var close = function(event) { if (scope.menu.visible && !event.target.closest('.neo-context-menu')) scope.$apply(neoContextMenu.close); }; + $document.on('mousedown', close); + scope.$on('$destroy', function() { $document.off('mousedown', close); }); + }}; + }]); +}()); diff --git a/files/glowing-bear/cyberpunk.css b/files/glowing-bear/cyberpunk.css new file mode 100644 index 0000000..4c79f32 --- /dev/null +++ b/files/glowing-bear/cyberpunk.css @@ -0,0 +1,910 @@ +@font-face { + font-family: "OpenDyslexic"; + src: url("../assets/fonts/OpenDyslexic-Regular.woff2") format("woff2"); + font-style: normal; + font-weight: 400; + font-display: swap; +} + +@font-face { + font-family: "OpenDyslexic"; + src: url("../assets/fonts/OpenDyslexic-Italic.woff2") format("woff2"); + font-style: italic; + font-weight: 400; + font-display: swap; +} + +@font-face { + font-family: "OpenDyslexic"; + src: url("../assets/fonts/OpenDyslexic-Bold.woff2") format("woff2"); + font-style: normal; + font-weight: 700; + font-display: swap; +} + +@font-face { + font-family: "OpenDyslexic"; + src: url("../assets/fonts/OpenDyslexic-BoldItalic.woff2") format("woff2"); + font-style: italic; + font-weight: 700; + font-display: swap; +} + +:root { + --neorelay-void: #07030d; + --neorelay-ink: #0d0618; + --neorelay-panel: #150a24; + --neorelay-panel-raised: #211034; + --neorelay-violet: #9d5cff; + --neorelay-purple: #6f2cff; + --neorelay-pink: #ff65c8; + --neorelay-cyan: #55e7ff; + --neorelay-acid: #b9ff4f; + --neorelay-text: #f1eaff; + --neorelay-muted: #a99abd; + --neorelay-nick: #55e7ff; + --neorelay-nick-other: #55e7ff; + --neorelay-nick-self: #ff65c8; + --neorelay-nick-op: #ff65c8; + --neorelay-nick-halfop: #55e7ff; + --neorelay-nick-voice: #b9ff4f; + --neorelay-nick-away: #a99abd; + --neorelay-chat-highlight: #ffff55; + --neorelay-chat-highlight-bg: #aa00aa; + --neorelay-chat-time: #f1eaff; + --neorelay-line: rgba(157, 92, 255, 0.35); + --neorelay-sidebar-preferred-width: 140px; + --neorelay-sidebar-width: clamp(120px, var(--neorelay-sidebar-preferred-width), min(480px, 40vw)); + --neorelay-page-gutter: 5px; + --neo-preferred-font: "OpenDyslexic", "Atkinson Hyperlegible", system-ui, sans-serif; + --neo-preferred-font-size: 14px; +} + +html, +body { + background: var(--neorelay-void) !important; + color: var(--neorelay-text) !important; + font-family: "OpenDyslexic", "Atkinson Hyperlegible", system-ui, sans-serif; +} + +body { + background-image: + linear-gradient(rgba(157, 92, 255, 0.035) 1px, transparent 1px), + linear-gradient(90deg, rgba(157, 92, 255, 0.035) 1px, transparent 1px), + radial-gradient(circle at 75% 5%, rgba(111, 44, 255, 0.2), transparent 34%) !important; + background-size: 32px 32px, 32px 32px, auto !important; +} + +.favorite-font { + font-family: "OpenDyslexic", "Atkinson Hyperlegible", monospace !important; +} + +body.neo-preferred-font { + font-family: var(--neo-preferred-font) !important; + font-size: var(--neo-preferred-font-size) !important; +} + +body.neo-preferred-font .content :not(.glyphicon):not(.neo-font-option), +body.neo-preferred-font .gb-modal :not(.glyphicon):not(.neo-font-option), +body.neo-preferred-font .neo-context-menu :not(.glyphicon):not(.neo-font-option), +body.neo-preferred-font .neo-server-manager :not(.glyphicon):not(.neo-font-option) { + font-family: inherit !important; + font-size: inherit !important; +} + +a, +.panel-title, +.panel-title a { + color: var(--neorelay-cyan); +} + +a:hover, +a:focus { + color: var(--neorelay-acid); +} + +/* Logged-out identity */ +.login-shell { + position: relative; + width: min(1120px, calc(100% - 40px)); + margin: 0 auto; + padding: 54px 0 72px; +} + +.login-shell::before { + content: "{{RELAY_GATEWAY_LABEL}}"; + display: block; + margin-bottom: 12px; + color: var(--neorelay-muted); + font: 700 10px/1.2 ui-monospace, SFMono-Regular, Menlo, monospace; + letter-spacing: 0.24em; +} + +.login-hero { + display: grid; + grid-template-columns: minmax(250px, 0.78fr) minmax(360px, 1.35fr); + min-height: 390px; + margin-bottom: 28px; + overflow: hidden; + border-top: 1px solid var(--neorelay-violet); + border-bottom: 1px solid var(--neorelay-line); + background: + linear-gradient(115deg, rgba(22, 9, 40, 0.96), rgba(9, 3, 17, 0.78)), + linear-gradient(90deg, transparent 49.8%, rgba(85, 231, 255, 0.12) 50%, transparent 50.2%); + box-shadow: 20px 20px 0 rgba(72, 24, 122, 0.12); +} + +.login-portrait { + position: relative; + min-height: 390px; + overflow: hidden; + border-right: 1px solid var(--neorelay-line); +} + +.login-portrait::after { + position: absolute; + inset: 0; + content: ""; + pointer-events: none; + background: + repeating-linear-gradient(0deg, transparent 0 4px, rgba(7, 3, 13, 0.16) 5px), + linear-gradient(180deg, transparent 55%, rgba(7, 3, 13, 0.8)); +} + +.login-portrait img { + width: 100%; + height: 100%; + min-height: 390px; + object-fit: cover; + object-position: 50% 27%; + filter: saturate(1.12) contrast(1.04); +} + +.portrait-code { + position: absolute; + z-index: 1; + right: 14px; + bottom: 12px; + color: var(--neorelay-acid); + font: 700 10px/1 ui-monospace, SFMono-Regular, Menlo, monospace; + letter-spacing: 0.18em; +} + +.login-intro { + position: relative; + align-self: center; + padding: 48px clamp(32px, 7vw, 86px); +} + +.login-intro::before { + position: absolute; + top: 28px; + left: 0; + width: 46px; + height: 3px; + content: ""; + background: var(--neorelay-pink); + box-shadow: 19px 8px 0 var(--neorelay-cyan); +} + +.login-kicker { + margin: 0 0 20px; + color: var(--neorelay-acid); + font: 700 11px/1.4 ui-monospace, SFMono-Regular, Menlo, monospace; + letter-spacing: 0.2em; +} + +.login-intro h1 { + margin: 0; + color: var(--neorelay-text); + font-family: "Arial Black", Impact, sans-serif; + font-size: clamp(48px, 8vw, 92px); + font-weight: 900; + line-height: 0.78; + letter-spacing: -0.08em; + text-transform: uppercase; + text-shadow: 4px 4px 0 rgba(111, 44, 255, 0.65); +} + +.login-intro h1 span { + display: block; + margin-left: 0.47em; + color: transparent; + -webkit-text-stroke: 1px var(--neorelay-pink); + text-shadow: none; +} + +.login-deck { + max-width: 520px; + margin: 30px 0 25px; + color: #cfc3dd; + font-size: 15px; + line-height: 1.75; +} + +.login-status { + display: flex; + flex-wrap: wrap; + gap: 8px; +} + +.login-status span { + padding: 7px 9px 6px; + border: 1px solid rgba(85, 231, 255, 0.35); + color: var(--neorelay-cyan); + background: rgba(85, 231, 255, 0.04); + font: 700 9px/1 ui-monospace, SFMono-Regular, Menlo, monospace; + letter-spacing: 0.12em; +} + +.login-shell .panel-group { + display: grid; + grid-template-columns: 1.15fr 0.85fr; + gap: 1px; + padding: 1px; + background: var(--neorelay-line); +} + +.login-shell .panel { + margin: 0 !important; + border: 0; + border-radius: 0; + color: var(--neorelay-text); + background: rgba(20, 9, 35, 0.97) !important; + box-shadow: none; +} + +.login-shell .panel:first-of-type, +.login-shell .panel:nth-of-type(2) { + grid-column: 1 / -1; +} + +.login-shell .panel-heading { + padding: 17px 20px; + border: 0; + background: linear-gradient(90deg, rgba(111, 44, 255, 0.18), transparent); +} + +.login-shell .panel-title { + color: var(--neorelay-text); + font-size: 13px; + font-weight: 700; + letter-spacing: 0.08em; + text-transform: uppercase; +} + +.login-shell .panel[data-state=active] .panel-title::before { + color: var(--neorelay-acid); +} + +.login-shell .panel[data-state=collapsed] .panel-title::before { + color: var(--neorelay-pink); +} + +.login-shell .panel-body { + padding: 24px 20px; + border-color: var(--neorelay-line) !important; + color: #c9bdd8; +} + +.connection-panel .panel-body { + padding: clamp(18px, 4vw, 38px); +} + +.relay-terminal { + border: 1px solid rgba(157, 92, 255, 0.5); + background: rgba(5, 2, 10, 0.94); + box-shadow: 12px 12px 0 rgba(111, 44, 255, 0.12); + font: 700 clamp(12px, 1.8vw, 16px)/1.75 ui-monospace, SFMono-Regular, Menlo, monospace; +} + +.relay-terminal-bar { + display: flex; + align-items: center; + gap: 8px; + padding: 10px 14px; + border-bottom: 1px solid var(--neorelay-line); + color: var(--neorelay-muted); + font-size: 10px; + letter-spacing: 0.08em; +} + +.relay-terminal-bar span { + width: 8px; + height: 8px; + border-radius: 50%; + background: var(--neorelay-pink); +} + +.relay-terminal-bar span:nth-child(2) { background: var(--neorelay-violet); } +.relay-terminal-bar span:nth-child(3) { background: var(--neorelay-acid); } +.relay-terminal-bar b { margin-left: 6px; font-weight: 700; } +.relay-terminal-body { padding: clamp(20px, 4vw, 34px); } +.relay-terminal-body p { margin: 0 0 8px; color: #c8c2cf; } +.relay-prompt { color: var(--neorelay-violet); } + +.relay-terminal dl { + margin: 22px 0; + border-top: 1px solid var(--neorelay-line); +} + +.relay-terminal dl div { + display: grid; + grid-template-columns: minmax(100px, 0.35fr) 1fr; + gap: 18px; + padding: 10px 0; + border-bottom: 1px solid rgba(157, 92, 255, 0.16); +} + +.relay-terminal dt { + color: var(--neorelay-muted); + font-size: 9px; + letter-spacing: 0.14em; +} + +.relay-terminal dd { + margin: 0; + color: var(--neorelay-cyan); + font-size: 11px; +} + +.relay-password-line { + display: flex; + align-items: center; + gap: 14px; + margin-top: 22px; +} + +.relay-password-line label { + flex: 0 0 auto; + margin: 0; + color: #c8c2cf; + font: inherit; + cursor: text; +} + +.relay-password-field { + position: relative; + display: block; + flex: 1 1 auto; + min-width: 180px; + min-height: 31px; + padding: 2px 10px; + overflow: hidden; + border-bottom: 1px solid rgba(85, 231, 255, 0.34); + color: var(--neorelay-acid); + white-space: nowrap; +} + +.relay-password-field:focus-within { + border-color: var(--neorelay-cyan); + box-shadow: 0 5px 14px rgba(85, 231, 255, 0.08); +} + +.relay-password-placeholder { color: #71687d; font-weight: 400; } +.relay-password-mask { letter-spacing: 0.14em; } + +body .relay-password-field input[type="password"] { + position: absolute; + inset: 0; + width: 100%; + height: 100%; + margin: 0; + padding: 0; + border: 0 !important; + opacity: 0; + cursor: text; + box-shadow: none !important; +} + +.relay-password-error { margin-top: 10px !important; color: var(--neorelay-pink) !important; } +.relay-input-line { margin-top: 18px !important; } +.relay-cursor { color: var(--neorelay-acid); animation: relay-blink 1s steps(1, end) infinite; } + +.connection-options { + display: flex; + flex-wrap: wrap; + gap: 10px 22px; + margin: 30px 0 22px; + color: #c9bdd8; + font: 700 11px/1.5 ui-monospace, SFMono-Regular, Menlo, monospace; +} + +.connection-options label { margin: 0; cursor: pointer; } +.connection-options input { margin: 0 7px 0 0; accent-color: var(--neorelay-pink); } +.connection-options input:disabled { opacity: 1; cursor: default; } +.relay-connect { min-width: 180px; } + +.login-shell .form-control, +body .form-control, +body input[type="text"], +body input[type="password"], +body #sendMessage { + border: 1px solid rgba(157, 92, 255, 0.38) !important; + border-radius: 0 !important; + color: var(--neorelay-text) !important; + background: rgba(4, 1, 9, 0.65) !important; + box-shadow: inset 3px 0 0 rgba(157, 92, 255, 0.25) !important; +} + +body .form-control:focus, +body input:focus, +body #sendMessage:focus { + border-color: var(--neorelay-cyan) !important; + box-shadow: inset 3px 0 0 var(--neorelay-cyan), 0 0 18px rgba(85, 231, 255, 0.12) !important; +} + +@keyframes relay-blink { + 50% { opacity: 0; } +} + +.btn-primary, +.login-shell .btn-primary { + border: 0; + border-radius: 0; + color: #09020f; + background: linear-gradient(90deg, var(--neorelay-pink), var(--neorelay-violet)); + box-shadow: 6px 6px 0 rgba(85, 231, 255, 0.16); + font-weight: 800; + letter-spacing: 0.06em; + text-transform: uppercase; +} + +.btn-primary:hover, +.btn-primary:focus { + color: #09020f; + background: linear-gradient(90deg, var(--neorelay-acid), var(--neorelay-cyan)); +} + +.alert { + border: 1px solid currentColor; + border-radius: 0; + background: rgba(10, 4, 18, 0.95); +} + +.alert-danger { + color: #ff8bcf !important; + border-color: rgba(255, 101, 200, 0.55); + background: rgba(83, 13, 60, 0.36) !important; +} + +/* Connected client */ +body #topbar { + border-bottom: 1px solid var(--neorelay-violet); + background: linear-gradient(90deg, #1b0a30, #0a0411 65%) !important; + box-shadow: 0 8px 24px rgba(3, 0, 8, 0.45); +} + +body #topbar .brand img { + border-radius: 50%; + filter: saturate(1.15); +} + +body #topbar .actions { + color: var(--neorelay-muted); + background: rgba(23, 9, 38, 0.9) !important; +} + +body #sidebar, +body #nicklist { + border-color: var(--neorelay-line); + background: rgba(12, 5, 21, 0.98) !important; +} + +body #sidebar { display:flex; flex-direction:column; overflow:hidden; } +body #sidebar > ul.nav { flex:1 1 auto; min-height:0; margin-bottom:0; overflow-y:auto; } +body #nicklist { right:var(--neorelay-page-gutter); box-sizing:border-box; } +body #bufferlines.withnicklist { margin-right:105px !important; } +body .footer.withnicklist { padding-right:105px; } +body #bufferlines > table { width:calc(100% - 10px); margin-right:var(--neorelay-page-gutter); margin-left:var(--neorelay-page-gutter); } +body .footer > [input-bar] { display:block; margin-right:var(--neorelay-page-gutter); margin-left:var(--neorelay-page-gutter); } + +#sidebar-resizer { + display: none; +} + +@media (min-width: 969px) { + body #sidebar { + width: var(--neorelay-sidebar-width); + } + + body #topbar .title { + left: calc(var(--neorelay-sidebar-width) + 5px); + } + + body .content[sidebar-state="visible"] #bufferlines { + margin-left: calc(var(--neorelay-sidebar-width) + 5px); + } + + body .content[sidebar-state="visible"] .footer { + padding-left: calc(var(--neorelay-sidebar-width) + 5px); + } + + body .content[sidebar-state="visible"] #sidebar-resizer { + position: fixed; + z-index: 3; + top: 35px; + bottom: 0; + left: calc(var(--neorelay-sidebar-width) - 4px); + display: block; + width: 9px; + cursor: col-resize; + touch-action: none; + } + + body #sidebar .nav-pills > li.buffer > a { + padding-top: 2.5px; + padding-bottom: 2.5px; + } + + body.neorelay-sidebar-resizing, + body.neorelay-sidebar-resizing * { + cursor: col-resize !important; + user-select: none !important; + } + + body.neorelay-sidebar-resizing #sidebar, + body.neorelay-sidebar-resizing #bufferlines, + body.neorelay-sidebar-resizing .footer { + transition: none !important; + } +} + +@media (min-width: 1400px) { + :root { + --neorelay-sidebar-preferred-width: 200px; + } + + body #sidebar .nav-pills > li.buffer > a { + padding-top: 5px; + padding-bottom: 5px; + } + + body #bufferlines.withnicklist { margin-right:145px !important; } + body .footer.withnicklist { padding-right:153px !important; } +} + +body .nav-pills li:nth-child(2n) { + background: rgba(157, 92, 255, 0.035); +} + +body .nav-pills > li > a { + color: #cbbdde; +} + +body .nav-pills > li.active > a, +body .nav-pills > li.active > a:hover { + color: #fff; + background: linear-gradient(90deg, rgba(111, 44, 255, 0.65), rgba(255, 101, 200, 0.15)) !important; + box-shadow: inset 3px 0 0 var(--neorelay-pink); +} + +body .nav-pills > li.highlight > a, +body .nav-pills > li.highlight > a span { + color: #08030d; + background: var(--neorelay-acid) !important; +} + +.sidebar-actions { position:static; flex:0 0 auto; display:grid; grid-template-columns:repeat(auto-fit,minmax(48px,1fr)); gap:1px; margin-top:0; border-top:1px solid var(--neorelay-line); background:var(--neorelay-void); } +.sidebar-actions button { min-width:0; padding:9px 3px; border:0; color:var(--neorelay-muted); background:rgba(21,10,36,.96); font:700 9px/1.2 ui-monospace,monospace; } +.sidebar-actions button:hover { color:var(--neorelay-cyan); background:rgba(111,44,255,.28); } +.sidebar-actions i,.sidebar-actions span { display:block; margin:auto; } +.sidebar-actions span { margin-top:4px; } + +.neo-context-menu { position:fixed; z-index:1200; display:grid; width:220px; overflow:hidden; border:1px solid var(--neorelay-violet); background:rgba(7,3,13,.96); box-shadow:10px 10px 24px rgba(0,0,0,.5); } +.neo-context-menu button { padding:9px 12px; border:0; border-bottom:1px solid rgba(157,92,255,.15); color:var(--neorelay-text); text-align:left; background:transparent; } +.neo-context-menu button:hover,.neo-context-menu button:focus { color:var(--neorelay-cyan); background:rgba(111,44,255,.35); outline:0; } +.neo-context-menu button.destructive { color:var(--neorelay-pink); } + +.neo-server-manager .modal-dialog { width:min(1100px,calc(100% - 24px)); } +.neo-server-layout { display:grid; grid-template-columns:190px 1fr; gap:18px; max-height:72vh; overflow:auto; } +.neo-server-layout aside { display:flex; flex-direction:column; gap:4px; } +.neo-server-layout aside button { padding:8px; border:1px solid var(--neorelay-line); color:var(--neorelay-text); text-align:left; background:rgba(7,3,13,.7); } +.neo-server-layout aside .neo-add-server { box-sizing:border-box; width:100%; min-height:38px; padding:8px 10px; border:1px solid var(--neorelay-cyan); color:var(--neorelay-void); text-align:center; white-space:normal; background:linear-gradient(90deg,var(--neorelay-pink),var(--neorelay-violet)); box-shadow:none; font-size:10px; line-height:20px; } +.neo-server-layout aside .neo-add-server:hover,.neo-server-layout aside .neo-add-server:focus { color:var(--neorelay-void); background:linear-gradient(90deg,var(--neorelay-acid),var(--neorelay-cyan)); } +.neo-server-options { display:grid; grid-template-columns:repeat(2,minmax(240px,1fr)); gap:8px 14px; margin-top:14px; } +.neo-server-options label { display:grid; grid-template-columns:minmax(130px,.8fr) minmax(120px,1.2fr) auto; align-items:center; gap:8px; margin:0; color:var(--neorelay-muted); font:11px/1.3 ui-monospace,monospace; } +.neo-server-manager,.neo-server-manager button,.neo-server-manager input,.neo-server-manager select { font-family:"OpenDyslexic","Atkinson Hyperlegible",system-ui,sans-serif; } +.neo-server-manager .neo-server-control { box-sizing:border-box; width:100%; min-width:0; height:34px; min-height:34px; margin:0 !important; padding:6px 10px; border:1px solid var(--neorelay-line) !important; color:var(--neorelay-text); background:var(--neorelay-void); font-size:12px; line-height:20px; } +.neo-server-manager .modal-footer .btn { min-width:92px; height:34px; padding:7px 13px; font-size:11px; line-height:20px; } +.neo-server-manager .modal-footer .btn-default { border:1px solid var(--neorelay-line); color:var(--neorelay-text); background:var(--neorelay-panel-raised); } +.neo-server-manager .modal-footer .btn-default:hover,.neo-server-manager .modal-footer .btn-default:focus { color:var(--neorelay-cyan); background:rgba(111,44,255,.28); } +.neo-server-options .inherit { white-space:nowrap; } + +#settingsModal .modal-dialog { width:min(900px,calc(100% - 24px)); } +.neo-font-picker { position:relative; } +.neo-font-trigger { display:flex; align-items:center; justify-content:space-between; width:100%; overflow:hidden; text-align:left; } +.neo-font-value { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; } +.neo-font-menu { position:absolute; z-index:1300; top:calc(100% + 4px); left:0; display:grid; width:max(100%,320px); padding:4px; border:1px solid var(--neorelay-violet); background:var(--neorelay-void); box-shadow:10px 10px 24px rgba(0,0,0,.55); } +.neo-font-option { display:flex; align-items:center; justify-content:space-between; gap:14px; padding:9px 11px; border:0; border-bottom:1px solid rgba(157,92,255,.18); color:var(--neorelay-text); background:transparent; font-size:16px !important; text-align:left; } +.neo-font-option:last-child { border-bottom:0; } +.neo-font-option:hover,.neo-font-option:focus { color:var(--neorelay-void); background:linear-gradient(90deg,var(--neorelay-cyan),var(--neorelay-acid)); outline:0; } +.neo-font-option span { font-size:.88em !important; } +.neo-font-preview { margin:8px 0 0; padding:9px 11px; border:1px solid var(--neorelay-line); color:var(--neorelay-text); background:rgba(7,3,13,.55); } +.neo-settings-tabs { display:flex; gap:1px; margin:-15px -15px 18px; padding:1px; background:var(--neorelay-line); } +.neo-settings-tabs button { flex:1 1 0; padding:11px 16px; border:0; color:var(--neorelay-muted); background:var(--neorelay-ink); font:800 11px/1 ui-monospace,monospace; letter-spacing:.08em; text-transform:uppercase; } +.neo-settings-tabs button.active { color:var(--neorelay-void); background:linear-gradient(90deg,var(--neorelay-cyan),var(--neorelay-acid)); } +.neo-settings-panel { margin:0; } +.neo-colour-settings h5,.neo-weechat-settings h5 { margin:20px 0 9px; color:var(--neorelay-cyan); font:800 11px/1 ui-monospace,monospace; letter-spacing:.1em; text-transform:uppercase; } +.neo-colour-settings p,.neo-weechat-settings p { color:var(--neorelay-muted); } +.neo-settings-toolbar { display:flex; align-items:end; gap:10px; margin-bottom:12px; } +.neo-settings-toolbar p { flex:1 1 auto; margin:0; } +.neo-settings-toolbar label { flex:1 1 220px; margin:0; color:var(--neorelay-muted); font-size:11px; } +.neo-settings-toolbar .form-control { height:34px; margin:4px 0 0 !important; } +.neo-colour-grid { display:grid; grid-template-columns:repeat(2,minmax(250px,1fr)); gap:8px; } +.neo-colour-grid label { display:grid; grid-template-columns:minmax(110px,1fr) minmax(120px,.8fr) 28px; align-items:center; gap:8px 10px; margin:0; padding:8px 10px; border:1px solid rgba(157,92,255,.2); background:rgba(7,3,13,.45); color:var(--neorelay-text); font-weight:600; } +.neo-colour-grid .form-control { height:34px; margin:0 !important; } +.neo-colour-grid code { grid-column:1 / -1; overflow:hidden; padding:0; color:var(--neorelay-muted); background:transparent; font-size:9px; text-overflow:ellipsis; white-space:nowrap; } +.neo-colour-swatch { display:block; width:26px; height:26px; border:1px solid rgba(255,255,255,.45); box-shadow:inset 0 0 0 1px rgba(0,0,0,.35); } +.neo-option-list { display:grid; gap:7px; max-height:55vh; overflow:auto; } +.neo-option { display:grid; grid-template-columns:minmax(260px,1fr) minmax(160px,.65fr) auto; align-items:center; gap:10px; padding:10px; border:1px solid rgba(157,92,255,.2); background:rgba(7,3,13,.45); } +.neo-option strong,.neo-option small { display:block; overflow-wrap:anywhere; } +.neo-option strong { color:var(--neorelay-cyan); font:700 10px/1.3 ui-monospace,monospace; } +.neo-option small { margin-top:3px; color:var(--neorelay-muted); font-size:9px; } +.neo-option .form-control { height:34px; margin:0 !important; } +.neo-option-actions { display:flex; gap:5px; } +.neo-option-actions .btn { min-width:64px; height:34px; } +.neo-palette-setting { display:grid; grid-template-columns:1fr auto; gap:8px; padding:10px; border:1px solid rgba(157,92,255,.2); background:rgba(7,3,13,.45); } +.neo-palette-setting .form-control { height:34px; margin:0 !important; } +.neo-palette-setting code { grid-column:1 / -1; color:var(--neorelay-muted); background:transparent; font-size:9px; } +.neo-palette-preview { grid-column:1 / -1; display:flex; align-items:center; gap:3px; min-height:20px; overflow-x:auto; } +.neo-palette-preview i { flex:0 0 20px; width:20px; height:20px; border:1px solid rgba(255,255,255,.4); box-shadow:inset 0 0 0 1px rgba(0,0,0,.3); } + +body #nicklist a { cursor:text; } +body .neo-nick { color:var(--neorelay-nick) !important; } +body .neo-nick-op { color:var(--neorelay-nick-op) !important; } +body .neo-nick-halfop { color:var(--neorelay-nick-halfop) !important; } +body .neo-nick-voice { color:var(--neorelay-nick-voice) !important; } +body .neo-nick-away { color:var(--neorelay-nick-away) !important; font-style:italic; opacity:.85; } +body #nicklist .cof-chat_nick_self { color:var(--neorelay-nick-self) !important; font-style:normal; font-weight:900; opacity:1; text-shadow:1px 1px 0 var(--neorelay-purple),0 0 8px rgba(157,92,255,.45); } + +body tr.bufferline:hover { + background: rgba(157, 92, 255, 0.08) !important; +} + +body #bufferlines tr.bufferline:has(td.prefix .highlight) { + background: var(--neorelay-chat-highlight-bg) !important; + box-shadow: inset 3px 0 0 var(--neorelay-pink); +} + +body #bufferlines td.prefix .highlight { + color: var(--neorelay-chat-highlight) !important; + font-weight: 900; + text-shadow: 0 0 8px rgba(255, 101, 200, 0.48); +} + +body td.prefix { + border-color: rgba(157, 92, 255, 0.2); +} + +body .footer { + bottom: 5px; + padding-bottom: 0; + border-top: 1px solid rgba(157, 92, 255, 0.35); + background: var(--neorelay-ink); +} + +body #bufferlines { bottom:40px; } + +.command-menu { + position: absolute; + z-index: 5; + right: 0; + bottom: calc(100% + 4px); + left: 0; + max-height: min(40dvh, 20rem); + overflow-y: auto; + border: 1px solid var(--neorelay-line); + background: rgba(7, 3, 13, 0.90); + box-shadow: 8px -8px 24px rgba(3, 0, 8, 0.45); + overscroll-behavior: contain; +} + +.command-menu-item { + display: grid; + grid-template-columns: minmax(9rem, 0.3fr) minmax(12rem, 0.7fr) minmax(14rem, 1fr); + gap: 12px; + width: 100%; + padding: 7px 10px; + border: 0; + border-bottom: 1px solid rgba(157, 92, 255, 0.14); + color: var(--neorelay-text); + text-align: left; + background: transparent; +} + +.command-menu-item:hover, +.command-menu-item.selected { + background: linear-gradient(90deg, rgba(111, 44, 255, 0.55), rgba(255, 101, 200, 0.08)); + box-shadow: inset 3px 0 0 var(--neorelay-cyan); +} + +.command-menu-name { + color: var(--neorelay-cyan); + font-weight: 800; +} + +.command-menu-args { + color: #8f8699; + white-space: pre-wrap; +} + +.command-menu-description { + overflow: hidden; + color: var(--neorelay-muted); + text-overflow: ellipsis; + white-space: nowrap; +} + +.command-menu-empty { + padding: 10px; + color: var(--neorelay-muted); +} + +body .modal-content, +body .dropdown-menu { + border: 1px solid var(--neorelay-line); + border-radius: 0; + color: var(--neorelay-text); + background: var(--neorelay-panel) !important; + box-shadow: 12px 12px 0 rgba(111, 44, 255, 0.15); +} + +body .badge.danger, +body .danger { + color: #09020f; + background: var(--neorelay-pink) !important; +} + +body #readmarker { + border-top-color: var(--neorelay-pink); + border-bottom-color: var(--neorelay-cyan); +} + +.neorelay-core-title { + color: var(--neorelay-text); + font: 800 12px/35px "OpenDyslexic", ui-monospace, monospace; + letter-spacing: 0.08em; + text-transform: uppercase; +} + +.neorelay-core-title small { + margin-left: 8px; + color: var(--neorelay-acid); + font: 700 9px/35px ui-monospace, SFMono-Regular, Menlo, monospace; + letter-spacing: 0.14em; +} + +.core-login-hero { + width: min(960px, calc(100% - 32px)); + margin: 6vh auto 60px; +} + +body .cof-chat_nick, +body .cof-chat_host, +body .cof-chat_value { + color: var(--neorelay-nick); +} + +body .cof-chat_nick_other { color:var(--neorelay-nick-other); } + +body .cof-chat_prefix_join, +body .cof-chat_nick_prefix { + color: var(--neorelay-acid); +} + +body .cof-chat_nick_self { + color: var(--neorelay-nick-self); + font-style: normal; + font-weight: 900; + opacity: 1; + text-shadow: 1px 1px 0 var(--neorelay-purple), 0 0 8px rgba(157, 92, 255, 0.45); +} + +body .cof-chat_time { color:var(--neorelay-chat-time); } + +body .cof-chat_prefix_network, +body .cof-chat_prefix_more, +body .cof-chat_read_marker { + color: var(--neorelay-pink); +} + +::-webkit-scrollbar-track-piece { + background: var(--neorelay-void) !important; +} + +::-webkit-scrollbar-thumb { + background: linear-gradient(var(--neorelay-purple), var(--neorelay-pink)) !important; +} + +@media (max-width: 760px) { + .login-shell { + width: min(100% - 24px, 560px); + padding-top: 28px; + } + + .neo-server-layout { grid-template-columns:1fr; } + .neo-server-options { grid-template-columns:1fr; } + .neo-colour-grid { grid-template-columns:1fr; } + .neo-settings-toolbar { align-items:stretch; flex-direction:column; } + .neo-settings-toolbar label { width:100%; flex-basis:auto; } + .neo-option { grid-template-columns:1fr; } + .neo-option-actions .btn { flex:1 1 auto; } + + .login-hero { + grid-template-columns: 1fr; + box-shadow: 10px 10px 0 rgba(72, 24, 122, 0.12); + } + + .login-portrait, + .login-portrait img { + min-height: 300px; + max-height: 380px; + } + + .login-portrait { + border-right: 0; + border-bottom: 1px solid var(--neorelay-line); + } + + .login-intro { + padding: 42px 24px 36px; + } + + .login-intro h1 { + font-size: clamp(48px, 18vw, 76px); + } + + .login-shell .panel-group { + display: block; + } + + .login-shell .panel + .panel { + border-top: 1px solid var(--neorelay-line); + } + + .connection-panel .panel-body { padding: 14px; } + .relay-terminal { box-shadow: 8px 8px 0 rgba(111, 44, 255, 0.1); } + .relay-password-line { display: block; } + .relay-password-field { margin-top: 5px; } + .connection-options { display: grid; } + .relay-connect { width: 100%; } + + .command-menu { + max-height: min(35dvh, 16rem); + } + + .command-menu-item { + grid-template-columns: minmax(8rem, 0.45fr) 1fr; + min-height: 44px; + touch-action: manipulation; + } + + .command-menu-description { + display: none; + } + + .neorelay-core-title small { + display: none; + } + + .core-login-hero { + margin: 32px 12px 60px; + width: calc(100% - 24px); + } +} + +@media (max-width: 968px) { + body .footer.withnicklist { padding-right:113px !important; } +} + +@media (prefers-reduced-motion: reduce) { + *, + *::before, + *::after { + scroll-behavior: auto !important; + transition-duration: 0.01ms !important; + animation-duration: 0.01ms !important; + animation-iteration-count: 1 !important; + } +} diff --git a/files/glowing-bear/drop-settings.html b/files/glowing-bear/drop-settings.html new file mode 100644 index 0000000..fd79e72 --- /dev/null +++ b/files/glowing-bear/drop-settings.html @@ -0,0 +1,13 @@ +
  • +
    +
    + +
    + +
    +
    +
    +
  • diff --git a/files/glowing-bear/fonts/OFL.txt b/files/glowing-bear/fonts/OFL.txt new file mode 100644 index 0000000..bb86782 --- /dev/null +++ b/files/glowing-bear/fonts/OFL.txt @@ -0,0 +1,94 @@ +Copyright (c) 2019-07-29, Abbie Gonzalez (https://abbiecod.es|support@abbiecod.es), +with Reserved Font Name OpenDyslexic. +Copyright (c) 12/2012 - 2019 +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/files/glowing-bear/fonts/OpenDyslexic-Bold.woff2 b/files/glowing-bear/fonts/OpenDyslexic-Bold.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..b5fd5e4f4b0977495d39bb3220096aef50120e31 GIT binary patch literal 108068 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 z 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 A5dZ)H literal 0 HcmV?d00001 diff --git a/files/glowing-bear/fonts/OpenDyslexic-BoldItalic.woff2 b/files/glowing-bear/fonts/OpenDyslexic-BoldItalic.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..bc72380e552a0859a3b9a09392830bc3e8c85e40 GIT binary patch literal 117844 zcmV)SK(fDgPew9NR8&s@0nAhY3;+NC1DOl}0n7ma0RR9100000000000000000000 z0000DhvEwwh8`P*gIpY*Tn1nOp>P2<0we>sW&{QW${+_ITQ-=J4x%E?PM;Qi9~0|B z;T(bL5hWjwTE|#9%n5PGFx2ZA%r4o%gK4`|kw?UBpP(f~ZZ{5ge4pUi|NsC0|NsBr zL$Zi+tGahn-7`D0&qp32Nk9bTcw{O|M>lm>U#LPUj%mWbdvS`eW|QwPzs=o~rb z4!y@AbktZ;*l2muY&Ol@&M19pnzg1`YuXB3hD&e7dcxW_lj2S_vv5z9Yy_2aM8~#D zgJFXy#aC8|Ib*9_*iISTSDKl&Pj+ag)qDv~B2I8^3nF;VIJ?qEsy$18ef=9 z>!u#ds;b_`S;SWK(oC4BJzsbdw=s!SY}D`W`@ZhakQVPR)!H%7c`4rA#4e&n^PrL{ zsZwY0aZD-wEt(i(ych2uRZ=BYvT*$*iS2ZMJRZd%U>Jr*gavxmKgfSDY*E+sO%y4K zli0eL6e4RZ{;|jdB1UZc)Z<0u(mt_xuP6B#SB*DK6J#o_X7QlE$fJlk#~freCz;`> zG^!0Bw4;^xr9fV=LlHB@z(u;oSKOMyYx_p&cl?eD!SN#myko#6D>w`%jh{c^8%7+) zO={b4_rR1I%R$u`lwmA6b|}+ z9zo%2b8y8F8HB?;Yhg9+F>#-VYE6X%mH(nxE0mPfzfvXD3yPm2;8!u0Iu>NX9bV7F zu)(=>cg+r)3PcLn1%xfbH4*5b_gYmS&bKi8F`(WLH4)lZj+qFIpjuHS2O?D#V(((e z6m`tI{(PeStmIlX^~BBpzYj8KN3iVQdUK;)*-kSv<=NdeGgD}GQf`C)(zEJWdt+;@ zH`5w3rM+uhv1pwdTJ_@l3Z3-Fy@?qgLI`gkD-p9ws-#Mmk(56lpR}dE)cexcCu;0u zLlMf0`dW`AoJD(V#IN|#UuJ{pZKMQ_mRK& z|CMC7XC4TB$h@2mklpU?A8)<&&*Rw{J0w{dD}Q6^LS&_Yy zbZx-Px)Cb@GiTMPfw!4#j}#f7yRV zWY+EX{;a$sKuCaEfW2cvKnw^l3y_Wo+x63>5>1tSe@==tf{Ylcqcj4>Htk4rq$rXK z^Gl7b+aE=epa=p79Rm0vOsjq%I~LSUery~HAyG7bKvzgg{N37I16QM(>CX#)0K`9E zd$tpy?7q8&_6ZElrpacAHdE35z5nbVumUSkE-#nM%i(bNaX5VWa`;j|!^6XK_AQ$Q z<*LzR7mY@v(P(sZ)IHJB(P%UpjgF3v=AI9GLo{a*BG=3HQ<+Noxve@uDwe9nDuy2f z)wZbub<9H1gCxZhv|>3f0Z)QF1Zo@vxr2wBO(wMSx%m~{-IGepT9rzR#zeY(S4wr2 ziN$_`B!f=~I=~=du<#+dvRQtujGe9B#x3{ix&6;=ys9?P7-$}79%$~L_kretHoV$W zsN^o##H9FHI?5DFsaY~A$drg+c~3zg7I&S;6CMaomH__$1a0$7O;c1b%^^Idg}fPL z{6GCdckavXryP-eK zDmHHXjJT3X20~hlm`#TCzAvZx7qs|$GHbT#eeeT-``@MGzbbYv`ImIh8)J1T zK*$PLtUzjvLjo&2;;#;5fCG^hxL%U}jPn?Y6u8j=wn<%fs6$1nRY0OdN@Q4=7nS`_ zB!3S!n>(I>qw^=<;ZciQNZ|7xCRo|D~Rq-D0Y0a|EaC~rb*5?V_2IP4xa$jM=7K96b|tJ|JQF;G#hC2t+l=W;P3rc&0kd<@rcL5gL=-v6BNxD z(g8EkKo$_GZ9y(#6-6${MGzAh5d+4ADS{}12_v9rA9IhjsdxyC$LUuQsf7&u|GxXT z3e;bbdZi+Fx^e3~!Nfvtb7!GR1e5+39}lO#fW zP~@ssy|4qehGLkvxxRZYC;pa-Qu=m4aH=}Bgb*O#v`x`*-X1Rt4s`guLX`}<5*UaA z|9zU~Z}j8*{3|J{=4y&_`@N21wSgrUFj?dRrGP0=vM|fcDWnLCcpi8>n>Mnt%SddM zU^xuWaGBgbUhz76{-IpMo_Bar{Buj^&OJLDy&>D)Wao8=fD$Jh%7+c(N{q_H!YV-fILf2!J>(^h)^Zglk^+qzxWEdr6Lg&Zh zJCKedwvm`tJ5nM7Mocs#5Ky878f~#1f(R|vBYZ7MXI39-iydvD)K-bwFx^sOa)P=5U;r`f*ktkDlA^N0Qd(Tzz-w|-h*pVWoa*}j|L;|; zw(mWV_WzXZ{*c^tD0QM#tvS#{sl#67nvmi$ z3IrvaASD+S>|v>rEW6sdL$qBf5g(Ezl9DZgvdf}W!I0&elGH)Lo@q%{BikM1>YC)9 zkkhi4y_{t&d$XNoTka%J4y)PiXSM9ba#G&r&1Q&?zbJY3)zCHuV-nRr(?>n_&kolp z6cZ2pf35n)vNi9pR--_Q9@Gp{Rb;;GhR&ORt2b-)tczliL{z(;uZmId6*%M=fmYD- z?HZ4zp8ds`59RXfSDN_miCqCOC@_HKhFq`R`>OS(HCUdw_#S{P+n&SqHL@2cH$gOE z2?aWt(i2MdJ{a0|$xv7vJpBK%_mkFE*U|6#OR_CHGk-X60Gj&U{ht0LemG;BZI|*2Uw&p_~Ptuj%_zt&}1u?Vi+oCj@=YY-!%J zz4zBu+V1ARH?mv+OF^xn%x5->5euN<`G2ORRQK50!n}a3nAgbWZ0hm6DaV$XTR;+9RsCsc z)wM7^{iG4Bccjz80ZIn7v|7;-NMqs`@Fo+1q;;j4OI;Z&=oBd&4rT;Hlr`QX1m0*DK-uv#~19`IfAJeR6REXXtbDJMi z`?D`*tp2q-z8Wz&P*8D#O5y?-g+iB6mmXtk&A-NW{~B2)ii0JN zWH;Ifav*+`_cgP^b#EY&4>nR=5Ag5&>ajXkU}t#^F-k==!WdypWnE|a9OgE(x`~k7 z_dF8(7D5ma39`6NWRWo2!yw0ei#dCHs>_~mo_r2z_tP|@Fvb`mgb+rUN6^)}qTl!2 zBk7T>IYC=hc)P;v1--P*V4-KJTFyR5uFYMnJ3omTvss|etVB;}&*JtAUnwB5zZ&QP?e+&=V!~yuVzaJtx04NCb*oFOYf(S}z zVSq1!p$ijO!4V$t#SPp?FrFe3ad?d^W$m?9qmk)yVYn<`_T7XYzsPw5n_i12RSZy;Day0 zRG_J$;t-NDBAFb@Ak#=YeGD;41MT!N#3T#+VqF3Z0b_xoWh+#ntDc$-5)_tHu%V@I z;?TJn=2>i|bvD~2)frptcF0K={N;8#;7o9inDLV4oIbDo0)nHHGxO>+Xk1EJ6;u|v z#@g#^xSAU4sK2phqqfqvf$Cac8-jsH%9)8D0F1zq7+PX|69QF2UQ^G|mH`?ELPA+x z4Ue5LMXq^fE+{ZOE-5{?cD*Js1=C7ZtlmN^ZPt&93ucBR)$6$YT%lu*KiM>MpZEL+ z3?DaT_JSoFZZ>Z6V#}<&=6YM*_J(7|56&DOS^1i7w>$JPAOFdo=D9!b7w}3Ceax#r z?KNNYx^MjGCq4BgU*XkW_YL0qyZGoQJ?%L!difKz*0nhJg-KRJ-wX)Hkyw0*p*fx+ zMwintFfwJ)x?P7p`^k|1VE}kW0EWcCGFu!1g2N$U&?2VK1e^(LXe3Mmaymw^02Fjw zmc$abSU8W*EUepn8{1!L^lDS*EL^(L(2cj+apH{m%hql%dfed5;gS83j-0xx(3+jN z>49Z2Sw&S%TgLXCia2uVK|x*5)W(67oKRCN@lO;ZA~~KZwP>@0${|rzQ?m2xH4ACf zGBzcvu%f=L*u)lj#r+m&JrEi4RA|y=Qm7ETY)9(JbWL@_bOaK!Evwj3`Tuw(>+VuJ0A<>2q(`P?Lp0)&gw!C;Nk%K~Pm$5` zAn0D&3}}9C`5QEueM9%AM_2DY`s}-(fZ(XADcJ=rmIZ{jO)aUe9~BqO3`g3X{@l*? zK*Z^Q&gqUC)Tfyi1c{WOhAjC?G}K&}CR&S@BvXNMbsCA4sD+S1WqL9^Ls^H7*@`L5 zW)UkXfx=Knqe(=UF%Tqkc5tXT#8mW{08lXSh^#& zrb9N`a)$}i=Pg~c!RYau&ziqvcclCeS&}sw5g?9KG9_zd7l5g%Vh4*EfKNA!Y=uR? zHI+0c;_hgzuACBORMSX%x}cl%KxJWKB}$j8wtAWf7Nv#u;-$$|qFQ}X;sj;NRUo25 z8@DlAof%`AS>{+}9UHS1w#jz9;F2pwOuA;vT_59_W&18YFfg=fY~u1X4;^(8Ub*BA zFMPsR`A!xBg^Z9!toTVX%sf~oS%;1kGePon8HJ6QMNq4ypz z7&AB|B~1vWqQnLZPH+`>SO9`Vpn-)?!jL%_6V}j3nE0f$3}N6=L4@QCh?hlUAPgao z1_qb|VK@?lD>g8Lo7oXrVl_qpm;)gaJF#Xco3+qh4|-MawN$J^)w+$F74EpJ9xK+U z->hwiWhzvy-Jof!wTA^m3>t4*Gc)UEZ^a>_SDQL#;nIx;j@WG5u~TL*TDku>-fZ&p z;gN~hy|-l5Rx7Qyt)1C*yZ7Re)305<^YH0M$3Ok%(#;3Y-+grU;ul9BKFG;%<6wwn ziA@eTf91sa%Qx@6^TB7wzxwvfg{yZSKYzyoY4V)YqR-@i6VWcWf{H1tirN|l1ji?5 z<`tDRY#todqJ3OyPH~lbng~ddAy1^^D9<7#&%O1Fx2Sz{$qX5B$KCFaY0AN@|bUZo?n1M28#Ssw$pNy6v3<4@P0V#(Y4;Lbd z7=0Y#a@>lChaG*=x!1nYfj7DJ38$ZT)%9+A(%BbW>E7a;R0?UD*3ywHW-Z!r=%G*W z$V=1K?7MQ$tVJ)39J=s1NXa6nJmlrPl@9|34;Lv$T8Y!oG-T%4g^Qacb^4*g1;z{x z$*z5=+FE33N-2}FT6VfnsAPpUYSnMjVdtf~sZhIFZXyRHJY=-mDSq zdcFQdYU@8(`(E7(qto%Sx2;ay!Pdiv*nRSpCrGCr1DY9>r0!BQ&2VVYIi}X!OChtR zl8mP5yB!ZJZ&|uW+3cGpkFO9&Ystvyq?)U;+D?>9sR5fVa6EFCr7aJZ$CDc_Ai68k z5Ud(m=Z4(-w#N(eb#GXP6o;o}_M4lGM{D0d5k;rr4Re2+(WQ#~K3sAvgP;5Ti_ji- zJp)PL>v<2@4zpC_)~?-Yf8-?p@`?8&lLmL&NA;)|9Lk_YrzK8Q;-ZBB74r_cny{@P zjkF9=O+r4|;w1mDUsl7%wdn5r6}!duiJXvFsS6c}RKu%gJqfk2c4eCZ)M`p@_)mZ4 z{}`dNj6!SH^5*hTqGC=Z6u-VOV9$z|G-}L*FWVz4~f550cv^3Tm}C>rwQrcn5bf{qwFT_|G`OF5wdwmC`K#V37*~J_KU~1#PSF_}!h~ZxB5%kKB9j<&h$& zGg?NeOGrB@dPy={E&%7}o7_T6MnFWukgy=5pyJ>JV2!Fn5re)l6YvnGm^7|Lh_9gm zNvnO7B&Vp_a`$_EWkqS@-Nc`rpqJF$d!4d}b- zZ||Khe|v95ua_Y~j(+2}->V7G$Bsp#ZRPsMTeRt*G8d!BmFZ!SqRI*Awk|n9hMj9$CvizR^Z3iq z5@M0G%vMTZmi?9YDF~=oT+v$WXEx7%mVY5^F8JVur=FqzInaas(H-qG{p!Blf8+iy z;a{Hohmfi0KA->dz6;v#=l!4l#qya&z-t3^$SdhfEC%Pdx1sUlSHlg{AftJWH3 zAZHU0M9p;uN04%6HG`f`tLD@7tHs3vtA8m1T4*KWE9QQx<>kwN z)?cV$GY~}KMY{g|3I^c4hC$`ZK47;Tv)}i7PTP-3IN=u-wf=>WOST9WRuzgx^f9LXTX1 z?iXW<3-k4;C%azsBwh6n9^3VsS6_`^FJJR)2STws4PcB9Ug+JYjvx6uIIx6N+BP{= zrAn?yU26%cv~6+|MM(`A= zboLx{W~#S_Qg%*FsgkD{Q>RI#ZIiQ4398hUxk9N@TWBaZX#a8^9geA%e#vA2-{4P# ziNSx3&eMVgzD~7KkbHI_9N)XNJEe$ob*3eeH{``xn28fCl0w!t%S{ZR} z{{|pkf>0DiQPgw?3k(o~5fsB&7QR!wg9-#W1{_~_LO9FqD1#9|5)6O{is3ARq-fh6 zorNZeS)5OzGx+B2{vE|+Z^lzoziFxNa3|F93bY}I(MaG|ko6t)z`WxPOVCo5)z`$| z4U^7{upOudP?5AC(_pNSjua2mc5zR( ze#0=coj?3C7JfzOkXR1P4xufiOcXCRa2>=9231gf%B==uKrqwBr)uhkBI4$zj zb0}?ij)w$=1V!v7SnuxC%z&QUqU-!dU2f z3Q^!bm(9MWsA}~d+c%$R+*>&#hVY(D{o+ry5*>^y7Kt+E1G7Y2Q*aDDe@lt>NVYPr z^+&?9?j#&*l`>_HyTYx4h7dE zg^}sgHgrbqI`N@^O37+CQzgqdTG`W;bv+*%(6SiU9$nGWpo|oBKvv6E31VqRLny&9 zF6UUa4s>3E-TCgnrw}sWCgUKFR<*~#|apJ0*P zYqA+!V43YIYZUhNJKeNr1$=ofMSOiJiUNV3Xf)XS}+g^&{EP|wHwvBX17$Uzk9$ld3ayEyS zvpuzIP>YgL4Qo&fqS$HW1_^OX!qqr zwYLuZhNMB?i}rTMUgFNsn|9M3!8s`Kn_{XslZUqRGImsC+d<{~a3>VVGA++Pq355S zI!x`M>^g#-rQn~C;!nWu#Fl0)(A5$uPT~X{l@>z}y)RT+Q+h!F6ZU}(9>h?<4W96a z4$NVP8wf`f;?al}{I-e)u0aL-WD;{&!b(oDlp(^ z!DW9rcCTXSV+EH{X4#bL+w8r1PI2Q#ZQ|4OOS%zg-Ub?`raStEYuUPYy|2l(*#Db% z@1C0VT=Sa05k{ZWCY;x!)$G|48;;$XGDs&sz1)xX=-!az zx&9eG|LP3-N4DPjP*SGb1R<#Z#t#`Wlv8(oB-rf6t-1OdhtDD_X=Y2|+*x}}jKk?xo z5)tb_4YN8ezM^kB=E-&CjX##9p^lXzPq*c%<~sN=3#S+y14~Gc0lq!&Hg3i1bMCm~ zFS-YZy~~ejJzbf$?#!TRTP`g)icQOXK2AN2q&Y1@vOJEHtlZl&l--h*8ugg2sx|8E zDh<2Yv{-4)b-kXAo3(VuZ!v!6irtwsci|pm$mQN|aM&IE!|}*#oPWbR@s`J*deQYq zpK{s-M{eKrqB2spimhaC`K4azb>2??|MTH5_Rzuq$KQXQm**voz(U3Nb%I(Nf)sPR zUxF8;U(r&;C|X0+GV;#};N_Ba;z;xG8iMt>5Ow`Jt3}8SMU-=^o}D4!rwx&p-n3Oq z8^@ByO5sTfYFAL`oDuYbIq_0FlB3?}K}{*5hAl5OCftxB605+nR#q8bUk+ zbiLEFl3e`g9DQSLTV2#K88(Z1J zdq~uki3aM1}dZWR9?KZrNk6Ij%S1nn*fV@ zcmhk-2+9+JokYQ)&SVhhoCaJG25t@eT2yI|^_s#Yf<*?PAxbxw0!e_4lxaYOXS9d4 zRuDSNeY2v!-Gz>F7;g461V}u>Nn98QSMS*$f(ugYb{ol@je-?$@|xTUHpmj0Tw9F4FX1H*S`3BTz~x1T8?9a3oo9@AuM-zl!K!qzJSP%c zNkt4ZyhMC{RN`V|x%T`z$eO@>Qu zkzwI=2@JoUV=7m6#_#uBT$&jAQ$5J4Xn7p4K!KQ&_{1w>=}Qv(zw-Qh$q5>9_9poU zMbbF4n4P@+rG9oZf?FsI3&D*O!jnR4-$G}OSQ5>Z#l24883LkZH6`64DiQ$-kO5}S zEn| zK$ffa^9L`&!T@s~bV-B=PM1TRyq|R7vkrpt9mXW>E~cRQAa@2MSQzDXi2wHfBH0k= z7EfML=rMQE1qnJ80qzSGm)2Z6^DRERFn3k5BB|LQLNdesuD1J2K|t@}g%B>-0&&hw z9)s5{vC?r{ow#(KCa4Ri(bkRd{HXV}Fv{u|#M2H71u8(udDZ|;h%#2gi4X(}iJB$d z-Wv$-Npwt7HbkFpri8Qn@JF7J>_ zr=Rs(LP2yFgXu?sKv*)e(F`FRz?sv-s(5Cgtdf8Rdl#7>pb$nq4{`2Ncjo3ElwP+@ z0B4WkwnF4aNNpf5R65^1DmB8%$J*7+^?jngcw^rjUK23wBLr7d+2Wd-IrcIUI&r^W02gcrHuvH3HPZKOxM^f?BW8;+LFu{NbEijQvC?C3G3cGEPs_w0 z*~p;eB1RbSJ@)t!Le!3QQZ6n65N!B3hYpJ05%X6WK&@c=hr#L&9)^heUpxWb7jQh< zG{4n6=Wb$COnD5u*Q+YZZVuRu$=U*=`PxDD(}H5SFHr?rEfn&>UG88xNtFo&={oza zECx24jcP!Px{4rIR!rn&uoA4wXDYKCeqJW94g24QonOLG&I>u@IWvN{5zN6Yd;SP3 zeR*55LBt{zB$aSY56Ukkt(iPrTK>+!U7~|u*n6rS%)Pl?+=+CCS zxX>Q~6}AGBvT4BpvyV34@NpdA?ZFC9RJ^x|%deDNYSrPBt$PkHacH>-@_E+Qsq zi=>^2ua##oBV>q2u>>O}wJ-*y+jh*i10wkD5$P^1nHm1(Ab)q5JG3>a^#vsr&>nvG zl=?6Bk&~d@3mLWn5zz=3Zh`E$X#&U4*}z}+gAY)}^&f=-*HTmY8T4p2UZZqkuebXl zc=E~Y5pJ_5d1>j@e&SQ-edqBL zMbAwb@ab!P5YL1jGWDNO z5_Pno95l`T=bW|d|v=E%gorTg724@-1 z8ge6?1G6Q}gaxpz1>B-$iVa(7;hH$yc!n-@@hkJ#hYG-cr{*j^)hOMeCb0&6kw%#o z6SE>6%Bjj;FON(kK!Co599-6L5)I3` z4DuHNA#vs(vv9)F5G23;^pa1>Nw@=n4D1GBvN4dkO~`PbJaZZ7DJe}6PgxdS1HUW> zGwfdkc7P0v=a1=|zIWz=o!?_`nraf5H+GUBhvE&T1mo;&mdywODO8I5Gcw3Uok!!- z>Y(JCQtJ_X<+q}kwbdT0ODbeggR;lL?IlL#7|nMykSOGOhzKN%%cp0W2&14eIV`yg zr_k1&@cbyI<1jF}GVt+xd(QKw-GBLF0xz5(!u^A27%&5n9D8*NIJxNJkeuLP1`*n+ zevtBKf@zLWSR~-0Gcto3FxTQK(u}*kaww&pzVC0nJyy;Lak~!|+PtbU_%4-rtmJAg zPjbzjIM2t*HB+h^BipdPYK;+yD307=KIKgWM4Ob^E$wcJRAJLUGdP}PH~|}i>JRH zA*tQ&gR8j=a!zA2$D(j(fDlf}_Cv2Pa%TD7%4=dR8>Y^*q~V1oEYSUeOWRMr7hu54 zo^-q-RAf(HV_$B5^{)k~%We=unK0bk^7orZCv5yWQ}0;P64BV>0>hXzTzU%7Pc~mM z@w-cc2eLm9tc@1X+=;n-QN=`O@5VutiGO$JL;|gCXq1=Wmgd>4GU88Azv&~dU9mQr6Kd$@z6@fvx=dnJx@T08N$rOD? zG$e&<8d@x5bff_t5@<~SJxCj)ncu@A;x6j|CQ#G0{}5CE6^_+(GzO^%*k zRc!Sc0zq?Wo|>%4RT&19zGRTFt`umYh?_wpUgA=w5$JM6pts+y!?^P5Xz!n%E@~x_ z2nnWxlsmiRxc6z*!zeWA1X#n9E3YT{oV4(oP&!Lns6Brex+7+;D$uhL{={J(%Kn5) zYwn+Ug#W!rwkAPAQ!~d}21lP0yk;H31_C2FM&RG}13Dpqo?ifsa+o7$IdrbMh2tRe z47}F+M1SzGdk4isV0TiP&d*wO5@VxGBXjyO);pf%KOyRd$)e*!C<@ZI^Z&J3}^Chs0I`QyS6ETQ8rkn;rD2=Kk%gJku0f_hLAmj5V7 zeC2_V^7S!*Z&Gfp*l}6VX%4M?14St>`ivf${aM*gmCwiBHMplw{F#P~Pmjroz#~oW z;a`)!ETycoQ_f|GiZ28mgPY^6liRBD3rK%--A9IAClT=H+)LUWO_f*1Z?9QZWoT&q z<4G7P2$ehWcS`K+G3?YTDpMptgZrRH7a(&^i`K}>-+ogIv+U`huQx7te=3!84^hNb z-y$C7*x_z!m^k#%>yq5;)Oh(3w9&8p72hZ26{DafElxbH$`(O4-FH7EL=UGyF`(MoDBd8;--S>$%tLy&WSf6LxrC>p)%7h||GjP(tycC9$4U5q0 z)k3*MfXN1Gj#0FIAt|X@DAa7x{w9Ev_CDP;f9#%pA$T(}+DL3?5oL|UKvtaPRjlmd zi7?fzkyTy&U!4NE4&FbAH*q`50vyM5)RCB2IEI3YMw3VwQD-}un>-VxBpA^Nsgt+$W$pLID%2(9-@8hJVSs0c|4?6G!1-R>%&7not=vfGk9=DI zw7SUV#s&yqP#-jz{-|Bn3sKKk=*xj`t#s z$l+h^mTf8`y%YDQy=NRs58*BWbatq&uD~ZcE2UP^OxycS!gM~G`0c$*pJ~M3= zo5UFA(@%k$54TO<3C<~*V|dRCG_?j3m^EagLm6WjSHmgkn12Gd+b>QZneYs-K?g4-?>T{5!j(iAgU9w` zuN0{;ng_!DCwHq$FZ-OqgXGHw`t&=j%*RN7S`h=OM^EaH+ds54j66lwf}eq|+MxYl z7XQke@YdP~eWts_1mebzcJkAXu?e9>cPTjJnbZS#k*~!Ph+;xobx&1^fi2a@V%W5H zQan4fa|qa(UvMN}3MazO%c28g>wXD3%?CBBzb|0yw!Yn1Z3ww z7x#sor_PH?Us=p3X+W`_f_y}iXvMl`g~4f5 zY0BP{Nj0kx3!>Ri)vRI2ls~>>?88L&EB$HXUBxCQD59jrbMhmoLBJ(~xOWrqzDs;$ zSO6(!L}V&&N^>77`k*9K&iX-+*OH+r(xw7)469f(0j}TX2J~6PW8|y%T;; zmKg#412Yp034rnMo)cf&e)ZcCpj9#I>5oY^bF0v9eC72|yPW#h^M0QFeK~1FW^V{d zV$@Z*DrJub+S)XsOFHbncM&xmjOmBUcK~~Er&vIXa(<+cL{#uPCZwX`j})?qnTr#1 z)(GwX6!C7l+9B>VnHwCwccK}WH;p6U^dBqIr*Exr)iKb07bS`vURE*b6#@dhzI*I$ zi=~w;Q(9CuBcY>Y_&7wO7Saw$|4+`JJR9Lg5)9}^q~qs77A=qi3ez@njw@~DljD%n z56)!Ey*x&|{nGNb`G&yDjPH>hx{aV;aJF<%J=8i@Tbi?5!& ziO+-*R-`FIOj}|%VnrLm{N$SJ1W@4heSp&Iw)RhKNZ$Ye@WH-y30Od*xe0ejHw|I#*?|11epXNh=||HEh{TEKzL6EA?GP!ekE}zm%j>aMch)8s zkq*JIpCOnjfF-$A)z{k>gm_w1KfNTkO@9Gs>ek`~3!GfQcV2oyU^!~78r8=#>`khe zm{xDo-`yY4f@zoiuq{e2j&x5nAuFr6hr$T^5tN&_s20}5u_7mV` zM;ilH@UEoOWH4JP?7@o$DZGJ_NaZ8WTpL6jcvxP7Bc7=`-p79+%dQi2LyVv^*9f|y zVv-hT{HAi83;7-jw~!6MI*tGuy*1P;eyzq_QJ08q`!MXS*Kp{Tsd$>)BA4cbQRMnD zw!|ClL^1VK#xUo_H)t60LH-k~Eq_a&mSIR((t({G`lS86twwbmVE%XgTYu$e0!-&6 zmnh=N{Y@{_-oQlhye^7u)ky9+wDOd6Mg01n8AyD(`8Vp-iOnMt+Eab@_$1ubaDAeV zj7>?&j>f2$T}|a;*EG&&h~Zs#U!x={G7ouZFgKWEM@w`{DGK>6Ij$Ziq%+3;?Ck@s#B;U?eQgM$1e53+Y6&6=gHSvPrMi*#ch=P zHf7|^C*YD&4#01!dVnFUz3cDe|DMqNO_*;?Z$V7m{oK8IR#735_VddwVi3j4>$!yH znUj}nx&a0tqMs%^AhahiOtxT4#cp*}ihGz8PFoyZIrQZb1D=$?jEvZ2$aLs+9QCL% zKq@p5BLH+v)d)$O@xx7yW_c3;FsmS_#TunuPigU-%Mz?c((OL1`jHq|*4t)7V>5|AQ<#O2 zxt=M78$A-?Y|b4T7$O-*&bM~E7d|AlK7e4}^5<+KhA^qPcTzbZG?7HbTEm!6YF`gq zOxBE4WU|bLuKpE*)*6E_=pjZ7liI@OS&2 zC6=vX^l$rs{9+quo&bICuRAtS?8oLZiUW;uZ*qgGJ?XQ5LFfkuH$QyAXZRPV=Y=p} zjaRO|vt#6b_G2aD?sl}zP6 zhE5>e37#IA_-4QDJnq9k5#bpg=*;vMxJwed_|4khfz2yl+~Ma1Ogq%BE>xE*RB-J0 ze&wLLpAS}oQX2M2*3tZPqpQUOSN8V*YOhNoULtKu>5OF{&e&n@aM6S!@(`SMZtF^zN;(9QiiJ$f4cn=0HyWs7a zhI9K9n|HgJkEER_qEDn0SEQ^5KK;b2auVLqT%D0K8)aoCyS_-9uP-Pqv@visg-)#W zG}|Q+;H(Qcj;=GocSRVy$OsGcNk zO=`Mq2kuPZI!}a#fazh;^`6XD{bx6&S}0$=otNkylt;t(PL{lRDle(k$tDeNhdicz zCo)8fUE47k4{#glKWxjb=73`?360ggC9i6DtmUb?lg8B(F*q*p8#pH0&;q903 zTmW(fRV9TGN_OYc8ccEptXASvYIdH$TSM?>BUd70#Qoa#- zDu|x*C}_Acp26GZ0lKN3&a$n<^v<-RV0Tu<&Z>mEK=1yABn)`;jyyS?3&K1goF6E7 z!)erDLXj4y`t|nMB)d2emOBbO$W8cPSM=100_v&O2XlW=;JeR_*O?C93Qv*|W-`p{ zzN1*!h*x_ z1p`cm?D{&cdim^dCojSCqjnT;hKn9t>=jjaQ2z29>|bY+Zy^Z`p^aZpHg({xHdB&; zlxKI(2qiiJ>l-M}OIBZM~p`8zbrVz@=aCy-?xSFWQf;!B^u!JR#AB_M&u zHi)HOL;}x9>{UMt1aUlyC3pZ8Mmi3Khqpa^cI-}@Dw*toXbRHoGfFAk3O7C8=iHr` zTab|Xd8LVzmW$$A4{N~l!_VEXx$iKO6-uv30=0w@0H=ZUBE#n(;R^lm_%t^ekiGvX z80nfjnd`hCxfyjll7h0o32tB5uxFF299%h}E=IPK9nFrGhuACwb3;0GVp zcH%#QoJQK^N3leuW!7krQGK$Sc5Z>t&AhtSiXU#tD%}EFBIOsb*xvLkR zuTxVwb++%H0`I8QIVDkQs~noF0&sS8KAjLa6cEt|nr-T3iKrYpkSIy4M#Zdi6KBC* zB=dm}h&N{1E6{3)A~1f!PF{mfLf^Ws;`YydQ?6|)#W`9{mIXke@B{_=QEaCR7Q_26 zZ4r<%JL`l$wBE*xawf$Z@M?~%lBlb03k8Z4lVh}5aMpwSkFn@BsTC@phO#%9Q542X z^>f{M=kd~6#I7C;^z*Kio|ZMFkL~VQJ)IFSLpsg}k_j;-y>qi=0t3hKU1z2e?h+_8W}4!$&_*@^><)#>tv8PVKJ7ea(M=HaW_;T-pN1rw9fxthA_OnE zU?dIj7QS9*Mx}yc_EFrPv+hmYl>UbOVpiENy@a@XA714ntSU&(;wten7l%eVWt zQFDRx>DO!rYmKtj?qg;y2z$f?^g1TAt{2n>(C< z&ko<~l(^Sd%i0S10@LA-a=h7b08j=ml>!309jJMREpz^b~DQBwN{HuX1iS z{NiJ4x3v6f`nOMTVdiV&0uKlpo{{@Y@;_o*69PjZS`RhPw+jLK#`iy}yD~I9YP-cC z?YFzrFXOYON?xDr`qPpc!tZ%>{XPcOUdgB#h4XKpj$I$Sqk)sU}ja+O9~fkhoI3x%Gh#ou>cAFfdNXP>{gJ!uJRl zzaLDMg{9ynk@x?k(?-Zjnf~)=z6XF{=l-SI2=85_jMfua?4La*YIy}PL@SSB3}F`r z<=s(-?p6}sS%$uJ%**}IE*)3Q)BQpjMa7`EUjnEeuHYJVR;A+w(5fx{MFX6`kaj*GibL#VL^Y&Qi?+bp-L zaZY9(&!DN!;o{xL1Np;W%qcfg(afTxT|sp_zSx>Dw85WGW``Y>P89brNdYEzK$a)X zetkYL>zGysWlMn=Zb9*@d~I*c;&Z5lilUcCHb}n|2@%Z<%*i>W!hcc~z=Paj8z@xE zn(J=IC=enOL0vL}64aapGO9>iSmLdV)C)yZz8ufM%Q+0rgKQ<&7Fd+#Jd@?iPxMA5 z0;>#zwLfKvsKeQiZ^l(+kT|h;X8#c^3@f~T{^S+hxH@@7fuhFOm+!4S#6^{|wnC^^ zr4JZO6frDrtk6L*JmLa}@SK%ugjT?*rN4jz5Ogjq<_gy)&s#hbE|ykcffWYgyKysH zeh`5Rk+c-ZKx_iH2b zCiH_n7y`xCTNP3~j*6$c*AZqL28Mn7#Ui87c#>>jH_Zo2VaR2CBz+o zXCx91ktmo5Sx9tH1g@$A>Tu6q%WHJ(ksEx{^Bw z+T`&K9rE&mE_wHjFcJ$D$?qHbB<@vr#t*0rw=@2N-b|2#zD#)N&qTiQKa&FPXHtf6 zsKTTgl9{wnl}Q(jnG7$OFnPjYCf|(+rpRE*6o11E9%iZz!_(HdFq*0Rjf+gH!JKJ( z!y=4jI>WO}mm5}0FL<8m{f2k6Bf}Gz#EkyzAOBy-bI0p{n!!ApBE-Wo>bVJpAH?*3 z+XmqQW`LLA761W`fFJXaeR$iy*oHNDy5CA0QP3IWRY& z0-~p2B)}SQ05ky50w9pU0|*9m00fBM!V?Gq?h~T3patAPyaKp@cr`5n0Ca#q;0iPV zH9#?l2~Y)MVr+m)z!$`1cmQI`7Y7go!Lq>(paC)G%@M?+aR#v@EI=(l0V)7~z)FDt z0DORzNi2vJ;0{m-Tn4Oih6sd#*!XsVKpYT35CTL2DL^cc07Mf61IeJj7cYJR1ge1= zpaB>H#(@{WlmHW9aqNtPaTG4X&3KE%km95c=}yLwIbXl|q($a(C%a`K(8POHo9in#LbIoHAM zcZWR=PsQ{1BE594)a%yX#klt23gf!tBH_A+YmI;)o;02oZZq6u+=00BaM$A=!M#k7 z4v#p#EdDt>mUz7IgyX5k(}QOm?>W5IcyHqUgm;rL0iQps3_Gz-l8r)w!pg}9PJVK7i4=oV0+f1A-Eb<&sTrsFsWhE- zb=uGAIHyaU9wNAlAP=d7DC#m!5Amo51)^79mKQMgCpDMcEJY<~Q*WnnP@s@NC4uHN$TS&gs?#i>SxIw_<{Cpm!9KKJ)5@h)=PaL)Y3CT7 zQx@v%+ymz*&doS~T3Db9j4oKZ5KEgtn@F2Wgq(GzgQ6IGtuW1BPd2uj4l1U^b_fq)1RmR4_02R0Rs;P z{tPM^v@@7s@YgkNaoP;+8Il-=Fic{Y$}o=+4I^psHyAx;^oh|JV_n9Ej6E28GhSpO z!&=Rxj_DzZToO-6yvTHp>6)AL%%milGi!8_OR}$v@0p)x{(|}c%oCY^W?sg;lZ6Hg zBNo;yJXzdlc~aVCR(qu%m3~_K6;?s4Wn?^K9mhI@bs_6IHuu@&v#DWwo^3QcD|Ytm zeAtb#TXJWEBLjPOIqK}q*@v)CVPDC2bQlDUDMer&3O>oW?nAaK6Afl=D;0k(@I*f92fDnaYL8MU~5aE@@n5xNLIe zP$;HQpKA)&TCTsjUE$WmZJs*~_mhg-d2lMZ&Lf>iGtd1dXz{e+8N{>4C0?b0E`_@E z%B3D&Y|2b{+46Ga70D}xHy!U!yo-4EBQYRpBHc#HLVAl-jMRZNi?q#W4?8>iF?Jbt z1$KQtCVZarN#K*h=QE!|K41Bi@oD8V$L9y1Wj-r>g;ieTTg-RGgB>n&s=A8If^3KE zf?SMTiQIxbi9GAdMOS8A)pNDbHF~|PE+|zwH4$f$X!sHplm^tg86g` z>J-%}sZ&9xs$gxwwnBCa(G>DX$a5iKLL!B<2?f2Bn~SzBs)uvm)t6aR*Hs{ASuaGilvlEX_d0* zwSd(&UT1pU=M9%Nw%+7>v#s`swF=hSN)45oC3Q&J4r!;XGnGb`mL%=Fv_B|n(gUTJ zN~fydB}2>x4;isChGm{G>?t!%))5=8$_kfNBb!;akWJRIBV>2Vp_RjDvx3b=az4qK zmdkF7np`KjFXUFq9hJMG#YSF;yfSauj6C-?!`m`%+q~nk&BMDi??&aHvE5sKlKkH~ zgzT{OKGgeeA9(G|^x>zE%63Ki*yody-N8P+_9?@s37@@vCi~ps3ym-IzVO;>?n|UE z6ki$?=qNB#@J>O2LN5E=73M1}Q&^>l*MVR~af(V6jVs>cppb)_irp07Rvf4Ji{cu^ z)4uL==$@|yN;n-3R#L2F+0Z%PGJMPR?Y(cGm8vU!p|n;Roia(s{FOB-XLa0G`Df+Z z#!fn6q9Rg7iHcE`Oe*zNK2_PFYQIz7s!~<`HYwtCxaxT|(#`~{sa4CU)<$iH+TUi5 zIw#?rv+oq&Th(zpZ=)_+-K=_H7xdKosEUp9%-o7@YjN*OJt3en)bMS zPSaIQ6ixM-nKcJ$F3>{MqOawemS`>YT7GEVsa4rElGZG(E!uz;LD!wMg=?$O)~jtn zyPfvi+S9Z*>mcY5a??@AQyqOeIoy(Q%UI_voga19>Ri;dTbHJ;E4os2b?Mr$DeI1% z?hm?u+2U|l!QH!h67;nPk%l2-L#~GW3?&*` zG_>UT)+ZG_CO$C*XIk!zeE10xCQ6({sWRm%P@-IwI+L{M(5YLW+2&bjsTJ1PV6$z; z{3cht1YXh^VKBmCgw>OMp0Imz#1j`I9!9*4TsCse$Sos_Mt2%L?x}%MXQPje{xn8! zOx0MZv448}o~s!DV!Xll4-;l4d`x^cv1Wh2mmww_Oda&f%rwEYnrX7>Jkzsg*uBv+ z^VH0U*^}Pdn{6`(yt6XbZ=S<@lKE!y8$N_sn6_wPG0NhyPriO+`^n&^ho9l7+`jms z2A~F`hN3<}eUADcYB*{XDg`wTH4!xhH5D}tH61kzH4pVI>O0gAsFkSWmKZDv`>Nop ziX~%9WJ`}My|PqeX~MFlWlzgNmK*%C_UoZvQGW0Co7;a1{%iEd&>u5@eEsS2SHh2M ze@p!BwZdrSIENsIqZL;xH>|w05@F@7m5){mtbDc7Zk5(5gVmi@_ZT~9EZQ2opN7^R zT6<#cg|!dX%B|H{>$28woyj`CUl*)Dv>s)>zzjXgL`q%6ql_`J%K6)qxTmn)+s$h!`Z1qAM2-yf~ zOXx;0OTumtHX6JU{vr6ckmte25F&qvjwX63^v5toSTEv~z_&l)Rl)Z^5#otjQYA@^ zrjxQs6(llgkqifpQ1UuOmoiJWp-#{Q_S=mFEkluUK*ZKpZC?5`UDy;GBmfRFW#8NT#IR zOa7(s(ol+%F3G%PzOn#Wi>y=jTy7!1F5gj%DK?ZG+iS`!<&+8nY1Lhzs#(px4^j81 zcb(A(ZRZD?^NPPFOY_r3PAzmfbp=7;ifghf+4Y(0i58=qXhXGaI&MS8u+UlQ2)Ys7 zFE?2;$?ch5$s*{f`e}DD`;L2-`>^{L4?zd-LG?ty#ao`0p7WlIp39yqp8K9}J>PqN zHo!quz*FkPY>QO~Y>^m#^&KHWG{!z8iNe~}C5w5=4cu2W7cV+ynafZy@ zqG~fVsrP~EH^=;~--jL?ykbW>r3_~LQEAV<%}Ns?<)0wtLmkdYSsQaE@(NhlxH=KSxxUI4qfn zm$drVAfq#u$E)r~N zhtO}6H2APbO=_^iyZJFlddkX*#np*J{7x9KylY${`SP`Bp20@-0 zfy#pdjdDAf9t@cWZgzm`o`ppF)x(G(feZP8}g=s$I$&&LEpSF{yjbUAh z6MFF6AC5ktzaGZ~Yr=vG+fpJZbtt)$Yn19T8AK8NYO|I~Qd$$i(dNhGQtXDf?uB)M z1!}*#uMW*$37=D+?S&F^)-cnxRu=D_Wj52oDk+Bp@VPJi1JT#-J<+M_fqbK=SyWgI zw6Nvtq?sEb9v-CI&1tvq{zOH%=q=Sy1&hJ}HAFxr*WZIU6^bq|oRR5^km!qe3heDL zFGgV>Pf~J8VV@y4Vv^e)ub(n#EotcY;>yfAc`Q0SPv=Aj;1hq0)9(Y)+Ix+|l;=pP z)X)fqWr-Q$K{|YAhecMXxb63?SRbREjLk7*M22FBv`15%Y=9);VSR0sG1_t97LHjA zG5a<^XI}p+)LeLeJD`%4h8B_$;P#2E|BbWwM*#xZK8}Ug&9&-!mG_m9F$H62X!y8b zjFqFXdO4jJ99+BeD0HjkK7M6i&|Y@525%~m4>=G^faRW`dMp?&HK2vV-yDdu&jaQ& zBmDvCj`bTXR;Lkt$(j18o(Mq!`*-KLcv&as#FX01W@z@PtY-r;1mFGdy(d~Y7VWs( zGA+ddfgw-1uf0;4WGe{cKT1aMY<`M4b?;LUX-*HDhBlfHS17?1+e0?;rGN2+Y4byfE1}tLb&}Rl5xP_cK_n%T5Gz z?fNS7pJ&Ss;hGtAypyS=8RFXG;yv4{4uUJVW=45j>XZ8jC|5hmf9^m25vY@wvTDds zo28%wwLX@DrCuoxJNP(1i&jL`lUeSP336C>IOHnJ21~gTwpokQ>eO0wSujGumjSZ_ zup+vPA?Cb4xC4dtatoexaP7`^WxI89G&b!EYIyoDa2e+pS;%ln`WG(T`I1O$)egU> zk~DCjT^@uuq+~tt`Q%ZJKO3Z%F!qwzoH63TmxRs}A#kLqoN&Q4ik&G~u)`NDBav}j zx1i9q`KeS-U#dHs9;u(a^P|!^ygSn zL7`MGyhRgDh2dC9GtKHZ6ZQ9ap{fY)yrTvclwS`coZTw}6NntG-UdC@B!{nSBwh#f zZPinoehpGl%xXH9psaU3?C>Gq*O;>y4E0-iFjY13d1o!by>W_t(7pRO!v&>%@xb$L z1Ro>-j@W}F_(L}EjbrnQZ+>fEcHND!1vl!BV8MNO<4uIcD;#6V`KC`Q_zZhNSMw$2 z*vdQ8kFh~>0jEqt|DdIZ=Ud2u0}p3@!beMT*JTs>4S?BXYMy23^NSu}*Upm}KU{fd zetX!F%s2CQ#16D1o>;D2<~A;5>>l8k%{PVmk@RBX&1&kd=2hP zLv6|O+o%GI$7fJJ=_kbiR!znZxT}10hSvk(P|`m#t~;WUfi9or;^1UV&z~b$jni`* z7+lS6;&Je3Uo;{&atzg#&@k7nO-#d-4uz+N`kRqGxayaGm>d1Tdr^ja#H0Hc1(i52 zmeM@JAQr`l=+sXw z>4~WY3sxP8TNl5hl7B5Xqr=iCjEBIE*SX_7(-9FT5i!v9(zVlF@eN>~ETWqVsrUi+ zKm<|LPyL^G`=^dz;ao4h|;)TJzo#2g-PgJI>EWU-s{Gd)rm_cpa>2&?cp@(`)d{GSmAj&JTQFPuPlERr1vRe%@BzZoU%Skz zi#6+k*am28PGTUbp_DIhX9d6c8RgD1Sf%Uv58_cG^K_GSic|Me6Mm}*@MKS~Lpi1yi--x|}THgL+H zncXOZ%bGn9=mx@cOpGnG{zKVi!y0v}97oSx=zI!^iND8CSrX+>O|PVT9ihwLR#F@4 z$r3us5@(Z$4QPzf2cS04ao!CHMbkl4lgy0n`L>F5fe)dIUbnKv+l6?HhYzz^$krcR zyYorE$KNHgOCluiOZ@9t&8objn+(g%+=ff=FJxg2#JTs-3Eekdxz?6H>0S;l=%f9q zAwwzkYRH9w9l>mcJYWweC3tqUt3*efo{5Rk@JbjqdC=pF8FQ4|-lq0qXQB!`*m;;N`hfVcnPEsz`3v7m^D%4v>= zz>nShB@?f+))4D9G`z9f>wcbz_?to70LCjXpuLD=Weq8cEuB5{4s21OK6F)7QCn?m z*(-HELS0_nQ&2*TA7Im$X88qlo{)Rw z`Y5EBSJxaE%4_RnEXa(oV*(FxNdwMwa82f4hu17Mc*+oGvNm?kimh1N67#u-TW`A|JvYrH z;ZYUC$l;dScN}F9x>*K+2r5psK`WIQuk<9*m9+h2L|4jG72?vu+@IG1M7A$?gq68 z5@&%y!f+#in*qA_4G$+?{jQu6Z(v!K?zj=WeInV(gn>-ImT^^Ou=j0U18z9&N1{-4HYdBs$ba5}Z=!@1l%a9be72tX`1n|O& zFF+E0NQe&yH*X%8mylwU&gd9tnwzFAJ=D-9azI4jSjqWH{R87XqwU(|i`SQ|nvJ9J z-uA^{+058jq{qe6EgQC3E@L=uR@+v3YPi`+T<3x~$gGqL>FX%h5bYc4-`M4KKUX4t z9B6L^h|k(!nm*cZb* z4O+yv3>3y4-1?Wpbj_2&2>XqkTXU!ci7m(;QazFhEQj~Nm3xkFW%)J>0fbp|tW|-{ zNSx1N&DOcKZnlw*c-XAaKoLRsQdOsQzM2J@ z6|+oVV5L#KYXl z80Y{Z%_VZ0k5?}Mw+g;3`;nkbf&36vdXyc=8dP9UhKB+6jFK|EtOqiue;8$*sgSR8 z4Cq)=AeQ#*u)uXXC`b5)uIR$S(3J^@q=_NpTq44KAGiehn< zDe^k24vS9j8$LAEF&4cPuP>6x4p{o&MFJ)ExJ3{FN~l%O2bXZI+~lt9WBCob*30>s z0Gq*nUm7i+`om>5H5MdQ-uF<^1Rd-t=n+bLB;RhL4ou7>yBr>WF-I8MtBEzI$2aKP zSv|;&$b9lT8_tC4#F3ublV4rLm7)I0q4$xD|x*{&dXc(a7 z1=4i@3XtAoncLD}bN^V!GZU24S$$hN5ba>`4HaR~XgpPvYElKFfw=5z!3aNN$ zxZ{Qc;Ba2mM|zk5E#H=dW(8wsF?)3D9$lbfGwY-%gUN9l9$%!)N()sN@Y{F5s)eKB z@nUX0_XLxQ-q@h~NTRNr%x2gI3OHLnS*y+qWGH5dMdi@$g@-r@4{PgVMUJBnlO0Z< zdT+!nuvrZH^16h9X)1-2^y(>`ePJ^(bXnOPZF=6L&>BP(bS)3;nlEb&KQ@v1{E}QDj(SX@OBO!YARzbnPY&*SDQQU)%vYw)(+zV*f?={-Pl%B%E z)!-tjD`zXB$XlXHG(Wm~wFdQU=ZA^ijgTaLrD$Weu+Pl|HP#k;f9tNgMW|*qousngq+91=G12v6RHK?RUGtnN zkOP*)+oRf%)o!U+bUKTekf&Ph9aMIab5mWE^h8_h5>G*wP)~!7T!OpYiduWO2rVI}#Y#nly986DNrj?2PU;o{0hB90AsLB9}5 z`yT*Su@y8E0BXv$Ef`;T%BqwSvrBd%114H_IIR}oq4%UO>BwuQm&Yx`3QOCR3w4l2 z^hStIgpYH*Q@Ed)NPNm-qX3}&FaNn6;v$AVpiqR{l$0B+*g|dAxnwLK`h9#awyh<) zqFXYp%T`~8%qse90|jhwQ*fRdz|mKezvpk82WYCrO9pxoRFbj&3P|RO+lfp8H03`YT~6BaI{w4 zmHJ!lN>5%BztqpDC=RKUi9tFI`VF#`(xk;Zl;hQHF`%;4fqp^BwGOUN%f-6(2&WdRoAQ5_tU$ ztu;C@#Mc-ro3``d+MPecB;Mm_5wI^Y;2^(TPcekE`3#p}EMy_h-VwM;G;gN&3fs_Qmu#RT1a&_|1TIgZI|Pj z9qH+DAxHy2vHr(#as$b>7;nMm&fWFv>{=CmGhq@Ex?<3-w;6YlnfUN!a4fuwVCb7L z0G>ELxo{EokZKved2}~vCqKgOuLzL`?dsvfZCOH$D_Iacl>58|q?U_M3hnn~2xU;* z^&m&7rZg0Vev2cZre01cNYH0tx1#FRS-}STiY^$jJq5*A!Q8ydNrA@O=y8sVZjTX6Gzy-Epa_`lBlyb~IvA zRZh;=b#hxNDr$v+=nO*K>dv~jOO))*a4AD%+gKt6ksEZE%DB3D_p zIK*_xgnSpv+a{oSvLku`mat<^jN#NVJBCwi=_2bd7YEXv(}zze5r2(7GOqTO(S0e! z`YvKAp5OvMO{CBWjpoSQJC4? zK1vwbahXc@N9`9bT!FG8Km`hR?gbH8NM_*Gem)_?Y5c^L1TXbRVB&E;M?4S8?3=9c zrenn|QDfMXu0@PcV-K|{qjfNj|- za>=eL&#dYtMjrdu$L?SH`RH?Fu1~((FIe}{!qwvKOT3Ad`cvlh7}M_U%h&A(qFRi4 z%<{-Vm^@yUTETp{KFR(i^`;7@+-T7Ro&NXtvYtfPg)G~_?&-p9UBTXh?hyV|(be4b zQSVyJg762J>YDY6ygP9Z$+Yd^O`htLcK`R?_q` z_L_>AIQ^JsbTcg=O0&&GUp5iHURlEaO8+Nu2yEUG1ZjJ%x)A$sEc(#KS@3i2h?&q6 zn}(uc&Y7@B|G+(m>4XJ;E`Bus>Dxvs&dH_FcTRj7EPRE(M3_@;TZE@x;6p2=SLG`}`YY>1 zaA2Fsx=nhocD51a=zB5OX?(q~3HC9Z4GVe-$`9F0*m3r{y6lhT*e6-#RL6JJ$t~uH za9UAp8w7pV9_p3y`6zFA-Jd7ITDmt`9HrGcGWX}nFdxWE(&vPXIev7GkP{@{E)1|KvMsX-??R3SDyWj8_f z+ZeQVt4TjS-2#JcLMQsj=-XxRiJtvF>di&ISh6h=f=zci5jNK@=kYpV^|CPr(5Gju z!l!!G8HPPf*>#e2{`q^`G08%IJWf(;H6!a}{TK*Q5f>}hIZzmul;J3%nmH{*k&VS_ z50AqwJ=8WC;o4#7@yjP#Kn~C^V1K2>6(CRTnSR+bvThiMN=6j8pH_nU0cFdF`5X51 zOl7jo=qiE858a`2hD$k;A7_D*Dy;{IXz(lL!E(PtMIMt?XD_XJJO%cVX;&nFg#vk2 z+6p#3U4#PlAF4h2W4Uy#OPLf{v_J?f^)MLrTU& zk6Fe!aP#nL>}IO}8wjG(a1e+o2aY%awQB}|xw>;^!OkVnTt}ZHiH5b@wE%|p5fv!sr!R2ib z*pey0)HD)=6`r!r>C*xW}H4I0h#%k^S=avL||j5iSRLZ zC_8X9`rUBM?7-RR_e6A$FFFTW(uR{0T`D-fpAXiM;PG52NyWUVPOGVHENb)m;`R87 z8M$45(^;X`9l%{H)?Y?g;KEI@mH;d&&rGR}!R%!$gIUy7gxZ$V3D5llxh>2V_y|Ks z)IaGW)C}5v-#+;s`&-N@P2?r+C$z<9CznKEMcYviD9k&wSk)oI=oh}n?@SWJH~71J zU)9%%pJPb9Z^?NhrYvJ6WeyKBf&? z;|a76W-{JB`cs$z&7>D6MIeM8 zOwtGaWj@PcgMmG^<(ej<1L`ZhkoW~Wsa{8NLu6MjbIe+0>YnoZ9prq)k=Z= z2+P+geWRre0(HJ)EW%|fM-bh47b0*_#Uwm)whf*KgB4Zwug|D=tJE}5CHr8j50IDQ z*ace#`*05Oy)`@?{x0@^{Xz0)y9Hr#caS3lQ-T`#{u`WI*Xr$2IPzaDD(sN9$cThO zFL@Zy*5E>~ct2n7IK%zr0`lai}MLZT5t0zT7 zL~}Qx$Vkh0hpFe6L9m%8|K9{vVp-9=_RxECAovgxI zi8II3yNQsPXy{ASs%$&X&{&9(5Awe~1s@(r9^vCW5K1mh_Y@MCf#j9@T?x8&?OoBO zXW#p7tiqn34xA;;t_4bOACm#ZH5VXlTS%|es-LE}hpHnG_U5ysRS%ueVdIa?1=b2B zy8cuZC{5~$ex<=z&k#rIWMPSU9KyapNKoSBLAf#h1PKS;3eFIK$Ma01Ba{|k>063i z-Cnoea&j*Lq+cBsXV)vK*y6GJ=JXtNW^#MF4Yc)a8{9Y~wqGsnI#O`(CMu##dQ~z| zvy9|_bxg`a8z?d$Ek++}{i3JlP~ii*t7~U;N?R+_T`t3}pg96YJ!nrwk-22gXMLe= z1SF*Ck}4gvjW~pfFXR%rq+F`5=sS3bJSaZH5Ji7=#X{4iLOYrW*+q8XW+g!UeoJPRAoNl|EPFfuAc`FhQ%rcMTNRYo*#Mh0y$~?dC z;^n(IR1^1Zp|Wtw%)qr4hPqk~ONXJ|sG$Dtm>stln-k{|IHx#I&WPvUl*xSy+R2kx zF4^r6@l%f$Dgoeute+u$qwSuwA(|5gx zJMEuWrPLAsbw1hqUq8P2vv1gu=)d?*Tt}y7bnA84viHjsZ+JkowB^?SGT~0~gHqQ# zwJa{ncKfyD(&Tc7jcos#YTD*KMfTvQZF_h|t!$ahj*;wF{_GR*6xIUlvD5%2bx8xT|)I4RvY1mKX>M?Ph ztW>kX617q9IR@(@$!G0Xg=cc7Y~VMIwFns#wmFcErghKRgxh$L#^GrTECz3mb()r` zx1hsOyd!Z~$(BBSzo+sCP@8QE2Ai26(3BD&o{z+LmNG`B@byZ19X6VH}D-6iD#ZD>^J46O5A;@VG;RY3G&6gC5z*qz~O{y9vjFzi*E z(t=PJJ)2%MdA;S;zEm;?4?kIZU|*0boFtNWtH`I8#STRZaD95Y5#hvTlYTC682cUJ zoqjR>vm|zO>qGHI(+YuYD6g4KC(PxhawX_^~^hd2W{0HX3s}_w;M9u^e<56HH@R@1x~3xvjlc zN_eB!5s6sEQ$<0Ll^{8S0oB}I-RSG!lGkftJE~a5+3O#9#c8p)f@;g`1+$M#T7_}H z5nP;$N8NxfG~VdtBLtn4qvDaJCsT*(a+rXK<}vL$nYQ+tEz`VSul=>Z4l`N)l)qyR zJP>Ct7J6t&{qB!pU?=DCb~2ZLsCwZE^0A@B2-0XMLrJtDj~EOBgr2@}WR+%Qp}>&k zS%3ci&N~GD!-V*EhgVXIvqp3tJ<5zq{lfK2eX42OI*dCXZu&( zH_T!|Mz|I)z_rzvOag_;5oekP5e2NF!881?j-$&@Z+G1K0Fm(YfcZot@RFHf$Um>^@B@DzK7 z?OO9VGUt!JxT54*d|8nHdP@?5P<_xg+nwu1L4fIbTP+4WqXK&r;`&jht4?}D%F{v1 z7}>2}cj!TKqxQ)%#0xxewK}ADBgh-QmOt#c-gb^jBAS7~l1Iksnui4z4>2BBl3)s`HDvqL)xYJHjx`hC5jGcu=gAZhe;q@ypvT zEcX=C4je{2Sdpw8%{`s%2|^n{R+0LmYpQyzu%^JQwGY)4wY4hdDY+`GN@*74?--*g zJZ{vn&4>@pC0&nV*ho24h3|c8MJ9ORS6viWCKft#aq7%~FkK`pjm^pfBldaLzbB>` zPu6cRMn`c6`PChN*lWmgd^nPhh+&OSXD~#LoxqAmT@ML>fBYDU2m;yxhe63@^G-&? zYdR3KUR@ak*s80B&DovDvT7kZVqV;_?W!SC4lrnU4!MQ^GEsM9-QN3O;lnkCY%|GA zP0J6)Z&LeSw$ps9wcX)9%=9&<=fvX&b1v=fAPRvKTZ^LO!gK!sS}{J>_Dy%7l07qM zZEd~eix+W%M>c(pm)=K!w#@i%7yg@Ti8J#S1F}w&=#Jwv8WatMT}>lQfM;eXT}d?9&L6hXpaq;>z?&lmMV{K7Wk$&40%QwezoG z7;pi84_x0>NCZzDik?g1?O|I-!jN~fhJN?IIyim=3*w%kWpQ8r^IDHjel++xlmy`9 z$zz?)XMk}i`Rp_HMqsNI(Ji(_ZC7A_AYCuD;oWUbV9{lw)uN?N<^!{CEC9yGhJ~7J zJB&3=UZu^pC?Br|EwKlu(=+R{j|G|$tY*VUPsawMh83C?d|04)!8roG5e$btxq~6d zlQS3=#ah441csiO8{E>6+dKcBYDf;7fv>In9JawoiTM&MLP^c=F0(H-++T2&DlH6u zlFe~6(&1swxElOuzAex}vzkS{*~*SzfTn$TN@X|2Ug;@ZZ}xMl$nM=PFBgJV8DX$J z&hkPStW~++YN3iAA{r#PJ07-L!NTTC;B7>#e*4tDx$mxes+4f4_%Xl=E~81S)o%#d z6dJrc=a^)6(Ee!+jC6V*CI9P=4M}y1s*=&>P22W`(nU7EE63r0U9~MLj3e`9?Eml~ z99G-`;PubCduKJ%xP~OEy>qJ=BtCgZ|D&1*n=&P{E?N^x!A*;|#z&VH7HwpV4+IQI zd1$cOJm9eso=G*f59TO%WxTdMz~L*8QJx1?o#rF*`MR2e=NMFDQVbnmuv7U+fvQvY zo|6 zC~xC-@$ax@H(Fcn(Ji!y7DIwA{FM(@?@CKde|N>$B;&Qv9d!K7^4A{QK1cUC^ELE8 zQVzfXJwU?0%x|Z7llUQNY(Lv0&PgBJRS*j#H+Eul4T@?#f2`=f={58?Y5D!aXy$#= ziOpS%VsPOFX;44geI7H`mXpK+JHl22YU8kGG3;BX62O;%w_)yiwI6caiZ7yuNaOX_ zt!Q;%;4!osrvJV_v@Uh)VFc?_KYUkVH0LivWO1#6&GHwMmAa_%3nz#lN{#2ja(ca7 zmxm6n-FZzpU)gIb+6^DbzV3;kbD@%Z5u>XZ{h39&@#E-9><%<_k6$ zj*YR4jbNE*4I3MgfkL0vB2tR|r1U&AuR3w-P<5;o13OxcQ+whOKMoUr5C6k-vQDo1 zd4s=;9oFhjf}203rY7kE8s1Aq7KkV08o@s42o1<>g5mh*MZ;+B34eay;SyXTfpo|C zm62I%-8o{)J)=C+daC8DP5fEQpww!o2Gphw$6tol?}zHb(naX@lotjTV}(yb`kGJ< z0Mh`bx5Rt5ii#@;GoAW)6CbFhP%K#^wFYI^{_5~Rhj8qT)7wFoc6PcOn}h*&c@QCp zJ%MYgb8Z{*oNJbCq4bm~Z5OYy5M4t-PH#hIt$SUt)?LYlb>MhEvVSqohwaRXiY^B& zPpMtUiT^B|9t!H^`TV=+i)M+{x&sh?Z}2EiBCPV{_*2#g=WZdaOe=6IY>iV@Jkjb} z73V6MC+sM+96$Xd5njMMtK%2ya4bODW0DyE3t^8`0~zVhB{x*a;q9XSVjoR{5dyVQP#(%QWW z$Ck`14q?8E7mm_czrxMg?aop&HXMQ>damDy zSkgO-4aBH!dC;N=`(T?Ilq)!TIk#2~bzVbX-Ih<~{PN2B@kQ+G5HB=X*l5WO!Jcmf zBr)G7J-5n~ZOF7KEBTKdAklqVu36?(BFE8Mxq`dw>J*J!r{jSL3(pWNzrz-p%55Kw z19{0K`;=75h2@YO3KKAnb@O*l01>6D#LbYr(^h#8fs2QjaI5Mx=3g@kMR8Yusd59K%S z4EWs=5W_i5^{J-$kKP_CA0Ehtj}xmC@7#ZZc#FJ%;COC)+g7et)L|J;A(~yF6@88( zdR?+C$vC~h4@>D|VgIDV=>z1yKHrD-YeJPj%jn5?|6G$lNe^>^0__*(roQZb z9FSbOz>eE=LmVeLK$%MxO_Z=%;QOT;s_ZMdUCa#-MzTKD&xcyrq71rM=qjrdf2>u* z7a~QuibRjNTT~_H3(rM1ADQrNsm3FvYCVRTkAweU7tc=Z8W_P8b}jP;GTn5oUdvbl zPKyTST5Gz2nX~sW##^TTN8(L&RP-Fz8TP;*Au#2^0xfZ?OLb5l0&w)g^5V!ezTE0- zd6ry5>cf*W2jl}oPm9^9Jt-yEm1E7-^D|>&q|&(1rSFXTdg8XN1Jcoa2KH4n;5sUp zy@!E;ktPju4cT-K``%+|@O7E`WMfHU@m`2}R=nnY%Mo9nfcw(^6UUC<#rPRtagFVD zLFax=-3xEmX^wRClRq?flgMrW7CTkS+!_1|i^i^TFolNf4;sr&R??nU6B7M}r^|?- z_+#*d+*{x*9h>3LCoSH+_unDj^d(9yLY(7SVX1>yk`6hJb+$b;3#q4nM)u$u>+sfY zHmG%_QXqOo97{^F?Pg%6rT2J>j;N$?hSF(;nS84IGXtFA5Kj zWuO>c4e-iJ^Ui<`r;?~(hf=Y9aZYlb3~~!FbN}Z!(ppSR6g^>4>Qp{4`;Fw&SVU%t zY&8tg5@b0y|IrDyOp#HwAxf2Z`A*b8qDP*1mh#%Y{=uHc&Q$e$ph~QP*0;O8G38Jt z-u*-rLhT;3@a6;m(+tleS6+PQ+-u{Q#km&Z^=g5+ZHLx9^5_cl1ZG|Z0}0O6vJkS; zTx|Pl_{rIi#onZ=-k!rjSSX=LVHDVw9BA|cUEZVdNj5L|(SE32faNg&n^U_N)oyv- z!Q|_hP&JK&zOhX?*ytU@+Kk7$IvN~-u0=NO8fu;u&DewQ!OgS?#FKAfWl1DD9yP-M z!o!J-TMyeo29fQ*{zh!qM)LLr+G3RMl+ln$2Z8&W!>B>@?v(Tkyx(E7x>X)>3{QbxsUSfp)=sV9a&ESKH_`0l)9eB8COuBqSet0@~?!&5AUXoQ3K23d8KmsR)@l< zvC5j_{&d|@ToRpj;u6=3HV)Ay{veVAqXPFdq<6ljk@R3sM&Y#2hS$B=d7Ck+VLkl}$@~UVsW}Q$;Nj%#K6&e~Sg2{RtKF&$V2C15+(hBy9uYQ=#>Pv(L!nL5~^jvOll|JM5pBx0;<#*M7a)r}M8 zX|DL|GXKPnUe=!ti9F_p983)5(+H-;lu*J%l%4e*AiH7^9^vM4OHmJDxb+gl7)M?} zEXB68{mbw;MJG8m5_u02fLwQb;)}2OXZC0$Vs9sF9x*6A+-1AI{vqB(sFR`Dlsh4wt0x4WZrFHtzeCK2J5G{nrh zYn8-0|D;EL^iydVeTP zM}&%RGNOj2r7d4KQ@>V;&4T{7`b~sQwiPymgO-HUdYdIXp+9+j?#%;$E>io@8qM-- zS0}Wcn55=if<-?o?HDJpn-z4eVeQRSVO*98EpBC%_c9E5u^-zas&-r!I5bkk%93jf zhOr1Z*lOOU+JGEQa?;!+}isy@)BChgFX`l`nxYS)a*1Z0++V1bn~xX#e8R z{PcDt1aE}szmJSDn?<+6_s}#o9f&5X)4&S52rd z|NTDMTneqQ&Dn5f__EmF4^h183Mv#$E;rP6_r}kXsMqT^wjD&D*EvHisaF?PGcs(~ z3lvUh7-0JGz?5yfocCL zUJuQZPTp>Qv51*9#dneZEhsyI z*$->vZbRaV;xBf3Z`KjaSqd74?U8T5(CMO6)oj-^`L5%5ZG^vVJQ-6(l#1#;t%j$> zGh07QU3KONF3fmB+VARWCbFoD5$A5XV}agp;fKeM?mT%XV9DU27-GdzC6rLzN}7Pz z?+(nCFo(AX4}4T9)8JZPnh1Wa4`SwpNwq3X8=Rzvl(H+87#i(N2+LRPi~yddu6+BR zl>m2QWC7@60AB(4?U44P4quh8wfV1Nd!INv41p^W)E#1}Xtx?6i0xY~6}tx4xx_3r zv+Mfhq5`(1!al61__G+TA+VCwW+Af4G!wk?gChUy0$WA{1$QBcToc@!Q|Wn`7-CIc z_U8z5LHPV-Vh2htzQy!m%PD^57JEi{cuNt56xJrsjo)a;2~FSx=yS-dV&Ico0b+Tn zQqdZ0@a<^u{Ru*~UxYe&uhdc2hPh|YUB1%H%;KE_5?U7J+cS+Re9@$NTleS~1fvwT zuCD}X0jvf=+1>=)h=D3Fs9wCdB0?7@t!gLjolbkf z-PII1KesgD88tc}pPDbQnUd07oD(v8!0wkalz&AaQu)mE0lfpOa~WDhQ<;O<-|V|N30(UP>;m3bR|mU_zry3iS(cBV>0@JPEE|Z2O!wo-_iIah-!LZ;EY6 z;H5ym0|fvNs6!#3F$+|_*S`?);1EFLC6ERIERPcK?}h7bAQHcDK#c&}SoK98IGdtb zpI)&pFFA=p_?RN6Hx6^$bjm(?nF4U5=9jfg<7cs_*p^sDoNHDx{7m2NOZn-Qy{B%b z$1gUn4A9{_(%%~{G>wzwzdyZiDGwX$N7oc96y^czkoWWDeih|fjP5zC@WI8ryQvx- z^)g%N=+0M&mpxRTlx4z>UjFh$%ne;hM3N8*;7EFS>S0*jHaSwW!B-7#v|oT7ywog= z$r5i6B6xxsamOcYoCvgieFFUdaUp!!Rp90`#oDAX-Vs~91;vu!gQFYjSg}B+&o{TRvgckGWI)dX6fKbJ#%=VQ`!>=|Oiu?jB_=L|)Zs zBS8#odg*V6w>7tmS8@1kgDwO-yyZ3lA|p4nDMe8+1{VGh-~+>M_w$sxDjFdRB1mKY zL5Hc=#ka^!?b=9Bx{(Z?sx{QZ9YOiKXTz!2ow4)3X7gTEia+3X^Qe(b+Ggfj+iIo> zM8Cd#dXXPrMnViWy!TI~C8p3Hxf=6kX-}*QmrQa_$z~v$8^yH49KrkropOgjr5VGU zTQln~GMP~hcA?4=4w$QMRp%!-mWnDEvF#4T4KF4yQ(@ojC+sd|j67RspSkHJ0EC*` z#R8Am9k~xV%l0a zfSa)!+LgZcZ$+57@8i7^8qN5QPr?^w+!mwDOx?`sj_7gKaUK68Ylm+V=lpJSwK4kw zINd8cm1R=UwH!e0b`|8Q(fm9rWA|;A!|0ne$)TE7uaY$v0D8NJssy}>cMw-6ziWlV zjx=Y_+;OAz`}^z*uvQNOZ-Y0e0RZNO3!qCNz6gLsLyMjhj?G>W6F9XLz%U-2vCm+r zf4T+a`;@I8%C{~3$peM4EjgVwHJGOAPG3Cuxw|t#LjS1W&!$dEV{KhJORiU_{nS5| z^0T1O^9QFF?!m_n*}vOB7<1E_=)A@6_z&%BO=Dnm9_lV?FjShTwW$Fw?Iy-%rW6Ka zY7dOB>H0NM-sO3q06@AmS`YTmCs;S(PV@Pmb;d4~QwQc#73ZUWfsk%L5byJPWSyEA zRd+aust$+CYISHi-E{5=YxfnwZFfxp&~B*$r*E}b^vX^E!G!OBPJ5o~hC6=srs~wz z>;#=GH!X5FUkn7(?rwvna#B}fuDB=Zt+>fercV7Ko8X35EHNfb-4K#SE+>^)O&FZ( zmY2e}W)AekGlhJ2f2Wwvm={aQ$qv2MJX5Fi$Ip%Rda;Ac%<8eU505y&}up zCgV>7TyWi|7lDn?fQQZ;?;W;0QzLj~WG| zXUklTFo5Nsvb+*xkb5kcW9kBzcc6F|*b_j^i$8sMf0deK3v4GmV6;{^GVYR3Ubk;= z;0ZvEePhN(LPhrbu*?GojW}}fYcU-U+guQ--J^@J#5z+M{)(6H{f%PN4zArftPw_| z0WRi(hqioQP`fzV37xSC_(c#ValICS520CFUf|WQW?q4=FZ9&5kj3?ZczG)@wq&)~ zjP%v47FqgiR^$cDtWMl9L10uK34JOwhT~#olMHr5s=m#+LpG>l4r&{4h6NUlfaFoo zp^4d#O|iLCHC$-4T4&dwqm&lgup7@@8%Kw3dC|2Y&dBFy%F8obsM-L9FMESO=|n9C z-SMOAtPlPW78dqn%8CbvXND@J7bbnZy`{h}yj7g+PB2l>%`=xRWx>Spcd(i-Bg+g| z8Y7A$)iL~o5{!{dqo|^RR5CL`8|$)#zX;}-hCB={DMn;d`pBR&K91nKdYjRXhq@}o z?y;j!>rS-e9+F!{m2NEX1oPc2HB0+_4>y2+&b^x#oB(V-wO&*I5hpZoR}=l6XxH~B zVV}xq5X|OdnRDMW_#&hm3CwhC(^yqrI9{DDDNfW1K;wN+(U=&HL?5{4opFjDUC5#~ zeXF;z&F!J|vBN$|CP+gU7g-GRLasLK7B(O~;J7%@`&;RuR+7+;QVU zjKP*N&Y|S35#@0hT5TXE0BdUA0h~$N)>ArJOCori+QC8l>%Sl3i(>!7T}d9U$%mS& zpQ)GXJWOuQDMP4e!iHFP_F*fLSd3wFAxx>J^qM2%PEG!L5Ag21*z{BF5RI{>d3;X$ zJLQGz>Z5K!JszeROg;Yt!io_&yVTN) z?UOuLdG=$?xBd@u&L>6R#+5bw^tl6%F{i`Qhc+XN$#egk_|UtT_mXf-10*MYg3$83 z_XwLNle|tu90=5@*~|H$nZFQpbtPwhcmUx%R`}|C;@u%jL{uS< z7kWN-C^D`^(VR?JqhZ>ri6DBRh*tQt6r{%rUz|U1+e0EL74m@Yi@C*{G0eAu4|d5x z3>!CfaERhG`5xU}Pu`U-ixFq>aVnODaX4JEapbP(iqR%-*zF5}lsApf+~HYUCb z2AI%i@MTc`9y7_+bL;0|@DtwC7JvAID?0M!Mz(YOY6ChRmTvJlt+GTfFQh^`7ddQ5 z7YrM>D5W$5T==~!!i}hKD2uot13GS3&=%*#UL)6jQ3PS-%?NoIKM}r!Mc!bR_-I;4 z9#J|Nk9pl%h{DH%=OK5SP(1ZyHwQzR$PQwSw^2d@g+-eENBfjfy*ZEL*};dg*S*xM^gb3zHuYU2u4?S+P0QD1wsOu_{KO#Dlfb7App&If z6o*OK9dv$^R<@_KNQUFu-3z5r4}L&=>C9tEY+&)P;7J~M;DP5xCA$;MHmebbEQBL=-S}YLl!VR0Ndw5%EesNf*eHo3lP}ssRT@;rGAp@ z6pv6yk$w9b^0(vXOVfaMzhYuLiN}^h0+ufFgEa}^R0~*u2Y%$u`b_1`G(3DjMwBWR zIv1)t$;HfCl|)l=|+(&@Q<00is~rCu-fV}Gl7CtR9XcTCrM76cRe=J25M>V-+L zcXN|a&{K#{!EdyvJV%*G+d3dtPYZ&FtB$KgD4~j@#u}b^sz#@#-|wEcv}ExcBU^V4 zQ}A18C=}lv0+>M_V?rPO`w2AIPAJXWpk=`YU3E45b+OX-v6K<`td(!$|9G$Ph3q5I zh3Sn8Z_*fg%2Xg`9lfw(KjXzmk_U@mZhhfK=0&G>E@i{MQMU{i6qj;h*yb$QRGsMf z8&a%A-?F~}r;Hft+yOg!n}Mwy(X+3tiv+vj;1@hf+BQAWTnFtrM1tO%7u3o1W@#9U zK}tCRDO);w>hY2cJ7Y&0T1#BiEl<+D{T)&K#+|L3hbieTq!)^x5@|yivd;+VvTZcY z-XSX{b5A_oR&EB>ds^}JP>eIU@&@2hu0K6gXNg}IAaFoTTULS{E!!MDXe@=HATz}iCsrwM&8xpO-)>Q=9^ z$7lqMD2aFWhIIJcb6-1RMk?Ll2gNQM{)qR)fb zPW)V|+KXz7BXA7)ow`3jeR2yFd$FQ*3ytA1{5MHZG(#?oV$vzB3sMCXpZjhn4Y`b# zfQ5GO1CR6TjhLI+6DQY~^AV+cc)+&TbBK?sC4E4|(T11EtRbA!%7}hg?zkYVkteN6 z`kralO8PMN&7D=xzLH~_092~2nzj7qJ==L34Hse;YQL5A79Qn!RYxX)r*Rr?@B8Ij z;C-kK|LTx@8`OYFT0DtU)p$F71a7o7g(5za%}7RQoRxmt-C}Wc*MqQ)DEdg`k5rUi zj&dk=ksD>!K!CBmNl&d~SY0Nnr@OIbIC!t|R@GW2&M|G!;Y}1Bzaos{qzVwd=yiO} zC}R_N%2A7>B%sF?oWKdh=B9S`C0uI(73EAwWX`Ft^Udj~@!~@JdaTgN0f@*{QrPTum>x~B`mC<#ltQj%QlvX1dM{lEP!XksLf}&P;KVHqok;FDu%s z>R%nhUU%ciogn?FyGvKKMDCpVrI);@O`0E_{KUi+Z;Vvl(T;6-?7ihz>VO2#$p&)d z;KB9++;MO^Oh?+8vWgP1=_?{ZG8pKegW1t!hG9aiQS?H*NNU9NP%79FNR?JNd5MTv zxb*02%AWGCU|{JOlSv%c8pjM^RRQNkCZPZMqxx4sx^Vo@7lg`Tu_v&ItRxyWu`XFq z*(oA6_`1Lw>%Cv6G}uE@$)92kcJ6ky?UgYc-Ke0I)0gz%nMHEjt8vtA;Pw&9iaxlK zBq?ksD)>C?WS^^y?QQ|^weEpI@5yhag+uG`&^Ws~mmGzbz9dO9^TFxFl#TthEBI)Z zoF;dBg;DQtI#ZWFO9x+ zhf>88fY;JZ^BzpV$*!?$9npazR5gf?Ny!*_ioKz+?^$zUt+Hr9x7xSLphn2&pP)p zBV6*rC6OR-1JZ`g{oy;h`fo73;vitX0Z10%n_b}fUU#$PXlq!itZNUo{+<3d!*BP% zEC7~VJlgs~`x(Pb+$ghQ+s?)n<++NLTq!5#8+g)@JMY%a3>F>MIpw-kbzFpeNh}jv zyz&r1=lGV8>r(DMPjse5U#TnA8YD`YOqs1qGsoH}r^V|4g2{9QYrKvGAlOjD=B!Q^ z=joK%P0u*mtFCrIPW+|s!*m;P>h33vc^vct7rz7_gbG`GyrrHSpfwA$cnz}05 z>-2Veqd0~!5!!g?Qy5XptXH^6vnFCVGcl~{EPSdpoH<=0oJa|5tAc8+u10Hh{A3)q zPaSl@T8wxGFkGye{u>9}(#raJ_(f~Z2|JAM?qF>`UWP#t*KO6EP!~<&ImCKcFlxTx z$f|WTn4*1Zt>e-#U1YDUBp1W=SWNU`(sAvSawv3csaH()n|C&YTK{N{lz8-?RPQ9n z&Yp(+H%@lq5XR6c@}8A)Dnk^+Fmu9?V_W<0WqJ08|IrGgzUVK&!Tjt6NygSG>K~eo z23N1?oXM;6DsW@;A6EDNEav0XUpB){|4%0-Y4%k%wZK#FS0`?E-&|WYCg;&mN6*wf zjtBY#3R#tD=_c;TvHJ`TAH*0f%&ahtq-A+zpGN$odZ?|=^bnvp%;iJsZb-&hJocmK z)Wo1QQ6f0Tlx+BmfU~J&_JX69K#l5t=N97W{(YH5O8kmYc9rV zj~jzP&s8x(RDyEOKK;`}Y_vl{(DE?}q=~!ZYAH#M>RtLO>=6}JHW2yDqF~K)zxU^4 zltGj3JMBiDD2`39?Vsv|20RWU8U8MKiVjiyDl~X=sOp3A%({vBza_^7%F5tC&e5F`nm` zN;&;Rg;=(u1!2}!8uhU+VrMd_ZNo{@DLb=X-JjoMUrJr`1@2l3$hnHgMOM zIj`vk4Gq&tpm${QNtg66eydRY-FV9@OnZh62 z^OklI+nAo=8L5O7X3P^g`WiB3%>3o&b~2ogHv%X(;Tcp>YT#c7=*rw~#m(7(} zGXF`1`Ii<2k82K%=m)&DKlELFnz0%+p}a9W3i;vo#1nBp;5wP*>EYf%I{7hJi6&NIBBkUv5EJtn>X(`_%4L~zfg zYuaX3^!J!^3Gj2<;quP8uF;D}A-{-c&mLN(?$Ly)6G8#@E*6{lIXxC5nS4zr*0D4u zA!EdNn5$%HhCn|L>O4GEIaa{{F?!!7nEdAR@U)6_4*h5wE-ga%PP1cu zGo&@}oO5n?Ka^ZE>%}atvLR;Yc8u_PD`qK z5q8|0XbTMszv*&gdv!~HNDQ5!o0xdToEOT(AvZR6r1gd5@r9n!37rf!JE44>W**0( z(t7T}?t3GVccY3E1TFX|f?l!!x{(^Oa!gVBHg-zKi<~cSo)%s?XiXgO=LE@P|HQ>h zvhhLgWKzfeEkcAJSnE~WdUau_`pV+g`9B=rI&apz#V| z;9->u#S+`G2pvNw@N-!hzK*HI)z zTHV#}t@tq`dK3Dp!?*#RVq{x8(1?zQ+n@4z#0ku1G8;$C{q8=LpQqr+eGB})mn^O% zGWZ)*QVBM6NsjfZ(fJ1GsJq(sKexRuaWH1<<@VvTlYzX<8HW&cy)T{91U7fG(ZocXNzA`j*R^B=J^rQG2)7A@aI*2B%( zH;yaK|7^OTh*o&a*KLCsVt~PK^xqY=V#MI_v&*+Og){Lm=RU`wK=p~s6eGD_#!>vV>4*3jqY|8^V{(A*s-z$zqx`Q$e=ZERd^9+P zSo~V*%cAS!j%^UppN`a(-7lGbL?K2)fqoU!^ImmB zl6!UG9E8#3s$VF`Q~{Hl&t2I<)bV#1*BF)&ghG#ycq~PBgfyF>1EHZrAKsEVsbQOe zB_@U#DIn#c0zJ{-p#`F-p@+7BB0X}-t*)XvJf_)A(8DN(C}(I7v4lRBm>JSAH4d5f ztT)}kI@3UtM+AV04!8I+R|tZP%p!?UCQ>8Gw0^$HhX*NgJ3)7W8euU*nviL@3rh^z zP`g3MiaQ=NOWi9AVZ!h*DT`` z+_}#Szh-`y_f^KZqEJ-Q@ZQQ3%lD1X+xc^r$>X(q7;DL4$hZb~G>>&AKP;!$a_u-{ zuc{rvev2b;j1~z=?xE%UFC_0cncZvS?ZB&u*-1teq~(7M-zAQtJlNe z;??C|H~&O8@D|ouoANzi2onm6`-#oj0vf>xY4FPc5;q`5g>#g))v%Qz$KZgYj#P2n z8oE$T(Y4{6ESac&f-X%mtiQwDxLa66B%Fo5l6I=-MV`__HkUIrv|}(sp?IfTJZ4r%;~9d-d!OK_Ah}|lI*GOR z)>PX04y7Qx#HZMB)eP_hdpEj^N$!`>Y8Z&EW6Aqc22W3&avD-onI();QVM`bF`~lX10!u^1`H;C_RveBzWGDzR$z)h#`0>C$ zfMWS=-=1ra@h?ZhUY@L&rCX5zt3@&uf1@M)A@kd^xWcsWX$n4-Q(%Q6E}j;;y0Jx4 zjh$z^zP(i#$I6e|fBB`cXLfWFf5)Ak>U7WccJc>H^u8EUq0vZKBU5&;6=%P+>W$D{ zEcYOVS+H^ly8JI#lyVT*{^cE3fVex-Pb~U4(RCvk|CA=3OfYIcK(|{!{;;HvoOr|B zas0B!l-)|R28)4<1>ptGdlCXn)9|NxW~RK*qVgDwV5HzB@f{Kn!f9)57Xyhi0wH=Fc;&J5IYLDQr2QZIlp^SyF` zAQUou{+w#*K-C&G_tL@6`z&W17fP<`rvOoybzr+^b=qv(wxZpcVJVVWbr^%Zs1G)+ z{VsuH@cYkx#o*|Odek}m)w+(%LHhKs_m5#hapxD_xvHa>qXUIiA0c1Gs(9WnP zb{w=ckZub+neUxvf~}w5|JFZR%yTYC%~Icm^oy=yKl*}VCWZ>BHg6@0xBy#;HJtr1 zQZq065ShO<{+nq<=-&yHJ+p6Uk+aXU{rh{|$|2;;=`6J{r+A?<{OW>z`Z>~LmO9%^ChWU35^j^i({)vW0+)oKLiedruDae~DYic-c9Yo$l zU6Dz!1~-}@1Y}%=8$zM?-C)Jq3g1}Q)=3+hy$(gRI?`P8TR8G`!yjB|)*<_MDE7bf zh9pCFk|<}+!!x7WGjf`+vwH+@g-a|6y1gU=C3mv)Eo}KIYG|@oY0>Y4k}Th0b8S1} zFIx3puyqFiL29!bWaFsiD+05bKNG>s418lb!xJq`uKv=PkX30<`oR;Dl1=#a1|Y&E zid9P;lk|tqGO`~Ugz`oZiIv=wiNq+TT7PJa#RAzQQZwJhBeI9avf2Z1WXwgvRYVcRFbJdyK|Qf?$=_~vRDsOmtHUVFHv{6B~cv9nMU}$#XiIemOHj#KdzEoSh<#SGIL0J zCf?4I`JVMAU>yS9@nq2!9FfTZu9P-ut9(E^W;<`4)GMuD(#XPdB1Su@meiS*Q+E~1 z3l%)MUVj3XLY-=jsS}M};@whHRCo_60TN9X&m37gEK+2LiDvG{T>2UI0JyO%$n`LS zN6=ZcZ7N`*^{)!eS3w)s!MZpcD*#AzG4?x)k!jtQ-&v~L1SAPi# zAYB*Bs8J!F;k92OKO;+%0luN1cQpd&0R@pu;JNz31{mj*kc+Zry&60=rliIB&+G$_MJec2`+7#|$K9vwU3CZ+1jd97v2MS%I z>>S-2veuf}8B<=F*B8vP8G@2+f%C;(*l;}tCO>!s4`u^N1x!90qeN2 z)6?v`UFVNooIG@;?QzRJ(|r2Lz$4pwK1iG4+M*53a=!6@`yO2An8ls>qt^P&rb1VS zIiAjFBFD{u=}S)}Dr8Cx-!&>;8*g7*7TJ)PZOb@s(Yk9e*!+zSfUn-Kxc18fEV=#j5+*MS_ z(6n7yp;+KWsmm%NWK)q7W7AXVVG0ZJBrB7=_2X5T)&fJznYk;NTg7LcaLRJ)jOjn)9jZ2;@(+^YI(Yp2Z_>pxb(OUx z5!oYW9z`EZvx}TApgSB_Y%`(S(wNCJ(u3}R11zBLnM%-DIwX*W{jD}6Q@k#~{i%D$ zYl&on9zYWo>vzkUgpQ}nyWyf*XS~pFU`dg*EBnH!->rn)sloTpLxf?r=otYg((_Kx zu>eOG3-_ymVCWL~KwmGT>tjI)_KT>rjJ~bys7;}N!XT?YEN;t$(IEDoNDA-p?L zC!Xkujot#Eb5Jm<+L36s<1CYPw~px>@Ch@Av@Ao@Eb1uGBrIpSUXdNJU&!l)XgnXM zI;0XsJEM{$9Oy&^?}X+{b|!*(D1+%fg;1oFn348AV!k*h(>+L{zAQPO)e7E%-CBz{JozO7yFWyeX=7!f8NVP?vDml1uRXBQY|TOO z)M&*EyiabOmYZY(^~GD~f}iB31=2$FU>{zD>yRZ|^S5Z8A*eEYc!RJLE?=^S*vc{e zL-%P1|Wl_e$0Esn@F*WZVfEmnYF z!bhRUwCH01TLQ6+6^9o`ty zVgze{M!J_;wqcP(2*!sYX|;Ovt9@lt$3WIi-zAzYZYTQse~}aGQG#}`X<-$h2Yc`| z@y-e*TGKaZqVaaRiYHDA(SyyKPJ;Tp+gCt|YbB9H0iToz?3+3=Hd8ef5lW7MntYfp z!>ES`lc|sK)^p=}C19XH>*sFWoH$2{J{0!L9?tz!hd~(RzFVlyAkN`cA0vQaQh&;lb&A4-U zTjd65e$OUwI<7PEuLOMdUr~v^2Mb&flXQSEqk1SnltIZ4J^#g%nR!uuM33Mtimk$tU3PLaF(uMwuedKAaFFwG$@gyiNxGAK-TYYZVHTmr#CILX`!Iog51ZnxAq+;W*XNES(xr`hdqKt*ftmNPgfHAcFU_Etsb5VGsZT?{KbB}nOB;qCC{M(f*$*R=nvR4h@-|tiOx3iB8}RIXU0%a z`k3z|ZrGtPWwFM5_j=QDi0%A4>CUG?dIvr#r2!QwZPK>90o|DGeA$#n4hoXp3lkZxh4<3#EjmOq``ePz|)Rmf1q)L#G zBv8thox@Lkm;lnv2-dAyFmu#`^)13-sIg|+P-D$KNQUi?s4y*J9bP%75Q-t8XSj|T z8m5uCp@D3%Clrv!!IHAEyJ}^aFAy&q{5cOW*DRhRiBBNq*OqOmnqdCRI7J)u3|o$FtSgAl^01UwkV2Iu^V>~}wz@wY-~37%DUKx?GIX(wf7fnP z`#ohGzm;z)(GzzqA46Q%9bd)Ts%LiWESB;J`b1Gv#J-V=HmWZDHl|y36`2}M3(~Wt z33sj3pkm1*@`$W+Bs`XTX;@kbZN^=Tbkc&|hC+VnP6%E&QY#nrGc7;3nw{!w6+pGC zAf%kZ7oob!NkZ>3^tnB2x4M-gU%2usO zOr1Hl3ci4`MteZN!4QYXMzwLxt2AbC2>N)jh!Q3hEfh_p>m3rCm2Z~^z-5wEJhY`amQl?JMFAVEjn3#JHl{o>{S-+YaL^O;wM7T>Kbe~5M5d+UxMKc;zvD}kc7EcV>0qulgGR%0rK#>a308onj8RWBipz&W`s7{j8PL#$@Pif3Li^1_O%L-h81BLZ>7jH=?GYK7iUi95c^w!!P zK?cuWG;zM6Eq8bA%H z$+rH3PP9Lzzxo2+*WfbWQx<%oS-wExmf|<2FIuunSs2)vb3_rZG^aG}U?ku2v-L4n z{5GR}FOq)+UL;O98iwiy3?*mQ&92_3`7IyRj7g1`;k(zWt4I%+wsOwrT`~blF1h?& z>DL`w!@8X?vVbO|)s|-ApC+Tcaw8C`}egqzu%-AgLd+QYTr9u*@_1?$*-X5Uj>7r@?-mUytd+Fil_~(M{uZ~az9Jwy( z{qp>O%KC?(NKjb{)+zt-VOtG_r(KW40k_ze3o{o}aaKoEwme+xkUC=+lg))}eos;l zsQOx2PwAM_+i>x)o7G^qc@9StQvg{&roVNVc+y&3d`mvN#kRw$Vv)p8bXM5`2lGC| zL!6VbMIxD~@^xmfBsDOgIE>&KiH!=0_qeTs^uK1Huc2JoOm##mw}?jukw-}hqrn4s zuuuqAv`@Y0xHHsBe`b-p&s)JFKWZQTT_>vW*5*kM_Mkwr)*X+S@vKMcfX8y1W3M=E zfq>~7Nb6=2d@H1Y-~s~3W9#2A@zgR9qaA9L+krU)l0h)!%oo86l>S_R7X5~uE*N+I zQ|#f!?5+IE&r_E-e@UtL*%Q^^tmM$wk5PFpsOh)3lZ%5y6(4<9*u5F}OXe(QPoSmixz zUlwil?@Qlhlv;Bw3`#Z#Om5O#alfg*Npfz$84k9;jniIJk0*gaGD2Jsz(SG!hezMW zDqBn_D;aG0J?eubIz)!aq@BG~^3r*EZBJraxb9Smf5_kxnZBL#9xdD4hTcq-ym^Ec zvS90@60H+CNv>}M1pzEO)v6+H9Q0xow(EeC7tvcr(9&&{6U*{;Wt9d)FuANxV<7-| zN8K@ulbAJk#WqKDFbS$J#35&Ua&dm=m_GEhE-yh@r>ATCB*BoXvL1nJ$#R4Gq8PcJ zcI4b}vQCuO{UJJA9uy122;94a0K*7kLaz-ofC&HQS*Zm6WNUzqMeT* zom9_7LO>=50b5HGP*as+fo0@?h<#yovdFn0oRKohXcPi|-(w9Zk4*!a=zXuF6dab$V&zTrBiFD+Jw(&az*SeJwGkK=5zyIl^0G2k=O6@AbK|4nU`%bB{UIETOU+7_>T4EuJ21&eTQ2w#guQ?g)tY;C8mzrmn+= z7ey7G8Xbc12e*o0{}v5o%2nC^z%j_9KgM1<7nxHHUuAnJp6dO@wHfg$3LSO@Y5rpQ zRcs;MWmaJinSO{*O8$S2U37ms-stxDVjE_xn{JZTX7k!*O&|0}9pWZaP+w;EVoVXn z#^>|$(}8DY_foJC3TK-BDEY#Vv8y~60QhJywtyKhL_QBu3oFYKj$6*5 zdqQpE$uYGB`EuwrC35bD0!*GfDW07JGL+pPK!Eg!ndj;=bVP0iNRHh~@+}}jw*ixZ z-h~sz11LF$WNTT|iva~rstgKQx`C2~RmYe> zA$#}}Nbj4IN2IaZ}aJ?w-byT3%d1v{RD+qRRk%{t$$vW^J z_k?2c5sH&SxjiN<^WTq5Yno_aKvKw35Vo=MjxGkFMNhKk4TzfopV|kif;$kTsC~u6 zYT*4bms>|!AR5vdRnx8znqjt1`(Q!e8J9u1qc8D5k*Dfnfk}dJE-MwJ58GALHOUwI zl@jns;`LobZT20H)E#6F7I7z^lak%`d~?asZCwOm`2?izAU`g~Eg*9`U{IGO1c<^? z<~nK;bb^Ydk}P%NSf3x{my7q)78-9NrFNzMNi@Wg4@12F-Lr`u)T9#0e6YwSNmcQ|qu+&B_*mMk^e2LS5c`4^ODeQKRsbTrQYTb@1JBAsbCm75=OgU=sWbYO)6s zhZx$nC>Q?RpVEiRT<+gR+_IFoYne)WOF|oI9*64_s!sewR8JZDit*e5!7aC$DiVT*`Bc3B>$#khGY6L>*Ny_ z+k)cjG(>B>&Lr0ex1?>ibjxLJF9TRkp~YeI*860&k>)7>*gqAe_S?Lel}I(5?=O{J zp)|{)c}MAZj#;(E5LK-XxPJu=>4%_yxljD6rVo74n8zI} ztgnKlJQOnoVR#UazgKIKb5KecY(%Wc&gxfgsmIDP?%WjO&zWFxgj;lD4eR~pgBfCi z!UiBwJ>yqVQ?}Hd2epJ6dGl$7Ir2&rFQ!S?kFfIqhPc08<98kIm6#v~3^=RK(n{=h zLQ%L+SNN7wBnc;wO%BeYSv=$BN_1`lr^|r}jbOtsoV!-m{Z*rLFohg0E}&oQ-lk+v zT3sI0F)HhAoE*+oG)cR2!Wh4@aZu0p#lLpqkSM?mK0Y~62M{dY|9J%=qXDr-8F*9T zZz>QBo=DuOh?mzW{(p+sD6Rug@of*I5@+TQZt>i!!gm^F2l+%DxbthFWBCypR#z&@ zF%oQD?q6J%E#e=O0|oP}V;;O5?pZW%mt*1-LZZwKD z(!3s$jUC!Jm+)ms37Kj>Q`RGy(`D&?X{p{n+PRN(fM$~Kc(+=!0?eS*v@6MmshV_C zvz$0#a?+=%X=i~+`&|6d95YrRFJ?}_5|**DxRk|zk2Y|Q?0Ry~N~NTC(;*@8 z;hcwd<4+BFdeIE!8$0zy%49odIp3vTzi6-FM5fRRk@4j>aCiDg7N^w5?f^E zzaKI4Y0enw?A4EPU6HvmD*03g{#`C$g7J$?LI5r}hg8x)8)m~#mHvTxN*kBUK)p0> zIT4mth3vp8xm0psn2TLmiGDTGHk}z(0Q1dQ(1WNQh26;G`~dmXVk0f=QuiQdQL>)5B;tdg3&A20EEnE=Fm_x|(5?iJI-~5o8<}dg4hqZ)Utd?I9UcGerF|vu@vZemrGV}UPVPi_dA#|TlYz^}j+fUZtT%krl*Xp|Qev9qaE zOCG7vkeOkIK4pX2yL#nBl3hBB@mQ!oS2S$a<-^8c&5g2|dN?AjS_G{IqCcn(^gZ3` zlB5bx*eo`3cbAOYx3FSGk8Cu~Sr^TXBN#rk^2Bb!%0E74@XaGY&(KXUh zQT}h<$3vU?lhLB0hPy#U^PIPstK&Q3cUwH==mC9?8aV1R8TMq#Nu9T6b2w(KtZ5dV|zS_X=8 zAE=}Ogci%3+rj%@dEEc9$VuflzzlG8HwIbL_Y|y-G|1v;7zM=_SXBCBzfB6P#Qs6m zZ^^H^WJ$;1S4lm0CiNTb)z)j?NxjBqXG|%#wVLl~=+k6o7}hu(6_S2E8{|bYipY!E z%dz+KR5NUFQH|DK<{v5TTM?CJ*vRlQkk`H=R_Anf&~K;)|Bn;0Un0P9jqq} zm3+KRYlDt)#h_d4Aly{yYlJ&~Oc`6yAd9wam^}`eY_+fQe)0n0d4W4Raj;})Eb_D> z!-d&sBOHTux$KV( zPLCiC?WoKBLtaqjeM9?|ps=w#c~xc#I~ur&!KR33Qj_$7Vp=8_3JA^7kSQ?n&qR}O ziD9lkqG9h&Z89M6CGq7*+GMiehg7~=yQR*QdKHX9{)I?_%}Qf{7(E+g)rq(apBxu20YH5a4^T9Q5Ywq$kZ}7I^;TFuffnuvS z-w<a#7y3TAf29h)J#ll+lEI#7y z>)m_C31&(Q;x%UCPwLxLuL~g|m0)c zCa7!7*)CXS9Qzs_1Fr|Y^;ZfT;Mqtqe^!f!1m<}{zz*B4rl4;yv6XEqan49@biVag z!=B?>of_2Q)nVS=U1b8ve+}sd(abuu&fp?I@k!kTDh}2i0MFb-RGvVdR{aehgl2^YUmSUUB#i=oMF%bVnY7$G@_3*iR{(6i5l z4jFU`61eWn+1t`1Q}!$qY5(wxQvDgbDEa(Yt}tN|k!@E@Z0J^j>T@hP8!%8WVkT1Zm?UNMEP>(J}3YB-WFjZ1@p; zNK&I29I_^sMfF?(sS{;W(?HgZmPFmey+jZE7rDF>E<&S7gW9$(La$&jY9`IiHd-ZL zGKJTV#K7{G&OHmTD+KRjKe|ijKsami1Z759mDDjoc#m{@PgJwLiF~h}vHj2-SU8$v zT@yHC?)KIh{GiCn_SmiCCC#ss=J^LFS?i6>BL>pH_MMojr+EOif67C0*O1I4bBgAZ z221TX45Cc^+XjvVZ8ik6!&NlhJXfs|Z_9k8W`uTe7_qDNd**q~?k6J|v=tx(rE5xa z&*xF+$1z&mRumNy9Faj8l+wXTp<;BMd`igDF%odNAXGVFNC?j?@Jbv=)^#$FDfA1> zRGGg3qpDK-uW*0Dj^Tl((+EN4U0kYws&s8>>969Yxz?IiDz%uGdF5}8$^t>W85A{ea{RAE(u$)Ebr9R)w}0*0zpwp`eABT5&$mriE0y3q4INtH_pNI2 zjv{CDKJpPDhWdzwBZiJ!7?HWO4fEEGcszDtpZGM-v>^_dO;xr^8xwH(37b10f{{Sw zUyxyl%lbvvk_l4d6%`7nKyH+)b*#~I;$q()i!Nk0t}eHEsMlvcXqW@ln7v_)A~El{W{0$N3u2Af z9OE>uQGMWtQALuJtYRx~I_R$d229p4i8mcv8Pw@WgbaIuNHmPA1=7g%x}mnD9D9@} zeNx#5{5{k>UzrYYqka${`^7VaccN+a1lDf=vPfDT$R+}J)0vkRdu>>#d4AR!Mlqu- zrDJk>OnlKCDV!*LHdfC2Diln977%*}0-g;PT83nLe6j4YWR#!Cl=wVOLR$+|n%NVT z&xNNj`9Y+|KhZ^x)3`}jxHMDrT8q^0*&)=Fv>3k zF4CzlMF*t)$h=_Nr#wA1DyF` zdq#BSqxk-jeb*eRn2F$xXW#j!f{N!rI@V3(1~Z19&}I<9TYLTHEW{KU@%#jk&6Kjq zmIuD}T|Ve81-%0;{WJRyab_z@@!TqI7xuxK>kuz(HjpEVc z8Q=8d{+?HPa$ds(`^95c0JH@+PbXui27Z8?;x-u5U)8|aMb_U`XvW1z6Xl6$aK++gty0SWdk7Hg} z9*i!jIClvzq`wcIVaII;+fwV&c|EnEPbnCSP+6j^^Vs_&rW6r1{tw5}r(xr8a4XJ3 zf%!pYv$l@WMlM{f0oZll%wVhr7k>j0+lw;P*d({`tq8)z&mN?q|2n=%AnUx|=Jp>C z%ioKvW}2}^rBXny5#YTMen_1*`VFNIGl0YRUkoH!ylabX1OOYuJgxxIavG=|O*sYF z4yj3IJ66Og=l~f>BaX#vZT=GGOo7-cW-_ubLvncfJb+9!2(OjI)fh2l#E|br!|!&f zad-q}vlvFHY1W?n&Ea0f(~MeXtzJi!MoV3p?OTl`7aW6))gb#j-N1;B>FUg&M2o~b z$JwD?H1%*0QOFC6p^!^-C$`uKyEvfVQAjCBl3kO3W6IwBzfPSL!w+DTiM!88VNCLM z2H(??e|I&@b+>U;@df;8vZwS13|71_dIlgGm`r_2;;;(sdVjdyN3iPSyrdk9)Kl{? zXpdL%R9O(8Q*{JvF&iNuQCYpk%+)C=&_g#Q2!(mH-tMwxg zOD4mlH{FT|T>AkS-Bfdgvq!S%xj`P`2H_Gb66bh?5I5Cn9{j+$@I-)q-A&djxp7=K zpYUwNrt6R-7N4~#)7)MHxSadwSzB;<`$FqY?=PISJUB2rw$4B)$2dn#l(UC}B(~ir zK7u|;O{H7H=YE2O0GGNe;s}ppcwA9^zY@#fbE5>=1H6LehF&;g(4MQ$4Q4TrYD$6i!Mk;Lw2l@k$=G z85|Q35Mbm;!cPTErS(sE%|5@jR^I?&2TKY&rP?44IVWP0LX<>7#GF{WA)=5*YMYAV zRvPNK-|P*(ktv2hK>TVJKa<6=NQ_AxQSd^Crn3v#yn%2RFLb?tJ{N4e9LA_ zYQP*R>8KwlRZEVflx<8pzmfTm#1{~sOx&L&#-t7;reD*Vm|$KfiSwiE&54_fCogLH zW^w90(oL3Vc9zEpeI^QF_I01l>t^JXyOP@D;B)3n(clvuo=GASl8}TXBq0g$oO&r) z9K1SZ^OBI0IMLx;xeA`7n;j`3R=r{K$R;z%Owyb*Co|=S&}be-ez;qRa92v_&8j@1 zEpJxk2-!Y=2hIJwKGBE8@tePXa|13$Fld4l_{A%&dM0i;rqhbgGd*yyLE75xw8MD5 zle121%%3ueF!&#N3G5FO3#tLTzz|y*IVTCT#eaQ7rxXCXZ^Z$@;Y_6vT(xzi`}@!Q zjibEbXoF#hGaMBY#7|o><53($Cyx$w-X8kG8XEyuSN(lymR z{bu=hj;9r%_}i}h#4LWIOFRG`?CLsDMWMct3{S*jEdEzKdC>Dt0oj}0rwA#9Yo?{@ zq5d#f3MN}Y(@mk9H0x#`y+iy?`0E+5`!YjA<3%%#ID9aly%Im!Lk=*mLLqL8Hn>zz z_cB){wA!vd*x#-NpTO#j#4h4pgDYJ64~peqtcS*dU05C|&3_X6ivk5NxuHEYlAP2d z4N6vhXm7F) z%y7Aua$Nu&dHp4i54}KP;PpuQnJuR>O(y}G%ITfQGHQRBW%paFC`XA*yGGYg;3{o+ zQVb;8w+cUR9CEstBapEX~~PVXl8u4&NA%fM?8=|nfQC@tbP;QHX_w$#hg7xw*aL{7A; zH7P~#$c4vgx|TjD!FMGoK&;(5slZKYihedeE1`_uh3o=Go8a@Ccf8hIrnS7>s!H3; z;k!I>nyNK?yKc}L<+-g1JO89n5-8kYOg29ZQW(pCS*fd{^As{V87aT@lw4iGv6Y-BIAVEkrktAVVE;yxQ^Qj#oQD6O`c{p*lz2 zyxQ?f$E#gK-9F_x?39RtwFQfm;kFnO&4vfO3h{PK5FGpP-9Rpbi46}U#8S5XiZ9|6 zw0#zS8^sBENuaE=_g0&iV0BWa62GcfRW?{mY!!7_68>}yEyPRvecd6i$0vB1JzEen zoh>W=7!dd0C80`+#ZzofmZ04P^pT90S(3R?E9|LZ@vA zAN+3Qv`c^H_=~+YGc}`C`&8_A^dxSSj-*H#&&X~0?D2+qS~isNuJkS&*lA$b@qJ-C zSc6BIh$OK!Dake%u#O550;4XS`0GrFE+i_g(Ba+@p6DKj>VKayNh=l&+FpoM0a^v*PDay*TqeJzlj-) z(&^Oj9#+ZivmL??zUpQcU8(llK7$<#Rd7COiGV+EdCKPJ`y9$~Z1FnapSFbt%k$Si zkme{g9pWS=j}iZ2a23}D3l{u=GxJC30P2dv#W>9ADYoMN?Oz{15|*4Iqi^L1s8@@i zWtrjvSb5D`oI+>*VAUmz@^JP1=x^I(uMo3V=Rt&E{+iUaq_4r{ylYb+p1P^NEG71s z9oq$WGbg90aBEhtmrxk57~E#(q|gK1CT-kf<(c`bJH6fW)go@%F!5&N%!x}W6d(h=Sp9?%`s6xr zGI`2OV|HWt8A{$@F3TDg*MH9|b+x4AZ_b3BF(I3t-1-!sso6szBbC`IPV$M;?@f*L zwbFoh=OlgxK^^Pg!k5jp_vtHcpnVuR*kUt=h2(k6-3|#{ixptoqn;wf;X`ZUS4Aq< zqrjr3&I9j16+zF}-?BJ_#RNyluj97Zf8=;G?|B2^GcZjbg{xX23-u6ljN1u)PsXbDq@Rk z?gC;NH_3hSz^y`Eppk>yfJF`FYv|tGDiMLuwGd#-&j5VcI}W=d5G>|2Z?nXARh2B1 zaMdh^9W{w-Ej{C_E&tN;)t0NZ6j0(vmAqZmYhgf^R&Geu7;+ZC=b8K%pait;u;I&1 zINvyx6r1bY)e+4_?aYZDz#E$Nko<5j)y_OqY$Zq#x5ci&+dZLftfGl4Vz3Oht+=6Z zeAiVU&Pbu%U-wt)0!AKot3@N<>e~Y&M8laC8RoMwywcE#wvT45rJlSB=i z9IWkUyW?>bDbsnp$AGzU@lCl-fKIu7;!lW0PkqxBysk+ctcg1QI-%PBx-wH#FOs#f0xpu+@!ous|xisilQ9l*o^vw0&t@7cj{G=l7Uk}RUyhom^#BsCyrT2Wm zH8H9YAL}5Ass)Aok4WYG`A%a&VhepiBrtpm$*Qh6lye!*nqnn0kG8>}V11K$T6Bs;bXM@Bx%d@PfIyH`K+{QBH9mJUg=D zM_#L!2H;av)>kj`(fUuDKDarE7to)4aYP1g+0+Tah#_wzfNK)dWtAVFb~UMiLG4i zUGv)SsB%V<(;|>hJTmH~S1v$pRc#AXeeP(*0ofn8RLAF!jXbN5xuv6LVvMIJuy1ta z60Y`5JO@z1^eA|SZ&-EWC=`1oV0U=iCdsWn!Q&RjY7uVZlj=D?bt?+-TYd2W=^JCT*>H4Cklsq7g(ZZ%4@P z=0jN5t?ZT0(&_|>B;*WNP!>W7MDYS0n$h`VjrZjofj5TY!SDnS2fsQYCDZ7wyG? zij-+33%6m%qMQ&7xvXzY9l@TPxU;4Sj2I*kHaN3=nsGQWjzY5)gh>vJ2*-$l;#ag_ zuz@@H82y}=@iFnvba1%JaMZBy9-6f3S^$Fc-}!U({zb!IQ{R-InG>bZ$r!V0CjztB z(y@2!3Nl`5|BPXpK0|W|Mt%B^z*+yEWLD04C2*>3)f1=(-Hk@v8{TRf4o)W(q5iAi z9_3*JATe%AXR;^(YbFds|CdvWFPZY2WAj&^f9KyHK$s4K0iObHhN<}G+nPuvvbgBW zXcGu$*l>I7v&H}nq;EidN85JX2;m@&*~?<+@w$|=21)OpxZ%Sk%8FI>v3DjtT(VVC z6wE*jdm6gwt&*v~tSo}=XT-ZR=>fpB`R~HoiVEf^Wge6EML6t&pm)Y4A@hjFLJ(^C&29f2K*l< z2zWB-*YW8oj9*w`TEyk~j*yNnzx5K~WKjVF>Q1I<~9gwvjt;VO&+Y0CHR2RZm^RDaw6s zCqjITCad&_V4RXmZ)ZaOkm9*zKDev>SSDXsZO)_HcFh?`q7Y#-dGpg`emqz+fPuz^ zT;xIMnIvq=J37p=4Ml&P+QZvql;Iwe78{iJj4)4# z-_;usY+ouQ@LDRL&BxE}59(Y`e|2P`Nn;cCF3teb=R=HqClbj0fx+r*Gu`U1rS>MdT2NXkN3vgI=ir=GagkVUFCfM@QMF9 z`DnJsTcC1ueVHHxDRwKe}|u9T~i|l{hk{slO8WlsF6bm-8qOXGD7s1vp7WvH-ZAJShqlmq8XdT9-vy(RPOmkLjNkV=E3U;H$?g$ z606Bsx^dlsKfRM|mirhS4L=!Qi6PFQ+7^SAzr?{}%5tVS;`-PTqgbrTXz`R__*eR; zb9=O9;##Wkt@;|A+I|8Fkub((qNjj$ae_Gp1P#sn}sWX$n8NB3+_oqCB)6|J3M49u# ziPwkP!VR?Q3_DVO!i*hm82vUr4)&v|2E1{~_}g5Um1L&zyf0rb1Lp5@Uw1WA5Z?Y= zTmg1VEmcL5!1u{HS4O<^u%yuZaN>3L^zJti z&(a)4H0A`ryrn?#0oo{=)#ss9$Brr|*h{-wEwWN_UlXH|R^(OWc$Br_uhYX0cDP1Z z`5|LB{PxQbiQ{LYk|%OEV?i@p_8$2Kt$2Lck$NP~F^x+uv7*2;;%TLn7;x6XK{&A9 zKyk?YKP`UlQ)+*p4!>q^5@lf?@|UXeQ3q)e#m{`ea1B^_8&Q}SpQj~rLTE0{ogHxH zU~!vpvyu2)G8E}pU~=X5kZUiJr?%~L*C5SLnBfzMn7`FRQ06Wmd`y&_8KnDwG0w80`Vkx;8dF2O)A2M=*8Zr&F~ z*|mjC4NAQBd@B)HByuUH`7twoTyYabFBA0mrA0C{qx45ztDM0RRpfdw=jv;=6+7x9 zKjQbHH1dh1kJj0eW=hD_#kdM865Kw7a0pt3>(I3}tq^<54&*wp%vrFR!_84?dEpL5 z`AxAFz-hpoJ}JUoKg+*2axQ3-Z>FY*PN9U@eFWn6$*zBB+nnA`u~`bjNSoGwhP7!I zTqUa^QBjb*&R05yee}v?BXKM79Ph%QToubXmi9l=PCB3OYjB&+D^vZBMh=MM&hd2v=`HS?5JP#+o%hQC`CZYhtC1R8dR(j$duElY<4Eut za`ySbx&nORoy#pDQD(2p<2tQSEZj^-K&u1slwFo<9~x9 zm-F%>C#s*MAOU2vbKfTy(els69H|Eq9FsWfzc!j=6%>NaO_V=mo zU26Y)*zJs?#tFm*P(rb84+uV!Wuvneo3}y445a*&MtuHF{a~#K zXY3BVep~A}AJjHx*9iGsS9GhH#81xcOKW0ue@RUy8}1QD56BKLXY7s63{jEmsh-SP z(*|8`o-Urjkl!uS318s(54mwgP0bQ2^i*?gSlTcrF_AEOV5(P{Ds2jkDrG?5PD<~8H%X!(~xR?uj^ccPFG3M5l z_21w`X4F>{IBM_BiDJZvb7tg)&ZuzZI3i1H99iZf zPyh*4;F#6$^n)1Fm3R#?n*Vgvl4*|-U=QE$&nSq7&~XpuqSA|)5$a^^%Q`@~F(RXJ zc*?sqcp~!)7Y`ZU-4Hra#?dN>t7goG7zvm;c^!OK^b;T*QPx5VM7i* zWA_!00Vg`2XgM(s=nrba_1Wr0a^Y!K)OxAQEu+Qr42en*w(~F!GzM5eCwv@Op)2|@ z_Q8D!mc+XFC$)?GAe(OJ&5}PYdcpAlW(m1>S7I)Z{{RedbA1QypBw~=s#z%l1~OPt~J>9VO9i)tb~2T-_y4%Nkz%bkCjVFB$+m zQ~MO{p814tA5TV*csNRc~z6-0s5HFQ}LmT$s2aCwQUXDPw}nEl?Ow^ zhG+HBC)gt_zg$LjxLJNX_(|4_oiwJC`U9~MOLV_;^TKTzKbtn0npnd3J~{AFh@~tU zRAU}%%saFG!LBM8qboEagso$73i;TbyGb;`E02nmV+Uq^uuM~{t}oyr!|^KXE^eGE zK<_YrJZq0mg6>*Zt;uk!8m)b@b=0Xs`H=w0@8o!s3{!y?+JHG6Q!uWZ&S)ZrGk_+0 zkL#=d>&=8<5JJa)*e1WA+}KBHTe??L+5Up~Nl4G+-t&q#NY;h%0O#yecY7<_PK=S6 zbD?R6Rb$ha$a!BgW?3ziO6tr^f)C2_mL^kD2~FNU$C<$dYQU*Phq_+wVO(=}jeDkv z2+!*XeWX&KCy9YY>hyy=b)AOa3-QBKmNABk~QXSW2K5+)u<2X_*SM1472W4Z(2cWt!gX0Zx|=afFt^)?uv-P};cK2!FlW&LRV$a}NshBW!?H7S zCwN2X<^NGtaEXe?jqORuc?!dm*{{JxX22S2S$0TIl|5g2?7RbqoanBRYW2g-TUQ{P zW9u!79>83uZO5r>Bka2j@F5aMe}M{mpAQ3j{zcD3l0W+HU%19xjp+x*vx)au4QkX{ z_1nhc7=PzBQ)3IMiW!!L5PlW?XC}J>I`xOnD%w3S|Ni(4fj!}aZfBeXCU02N>TICF zU%2vPw>D<$USTI(KUe9`DkM4H3%_)K;>nx;jfE%L7r`m?AMA~2!#T%6#YheZPL3H) zpXs2O`qhO_c6CoDFWI--J0vE33~wb^i^1Edr;xgy93$-EjgWwV6jBK+7DboaV@U;OQ+%A#?U-MN-$nj4WsqXJ`M!8siWnlqNM+ z0JNKyObtS3X-~HF`LRkrh7*iH>iNhju*_ymb6hWT1AzuZShDlU>tB!Pzu@-CS@5ia z(Td@8r=irh1kV!8Lr2ux%0a?ikh)2nQyT72rhrczoK4hyK}1Y zIkBwO#kG*lu?v7foQGhNnfbr-wFX+=3?k_ePo=4y_&`(96R*9_$4ix zy+zzWC-hFhTjGwa*Q#ZLut4?@!764hp8Qb-yTH8+#oAa`Ae}vdJBra1$=LK>L-AG! z!vVuLEUoz~E%SWb`qZBbez^2#k%QotfZg2k^fnOO-_WTHo01?&(dhMOy;i1{x!s<3 zeQ?Lhy5e4Cza_*9F8%w-;$G9a|2XQGa_&v zeu1MKzePyB$3lk?yw1j&*1M6#iXAv%qkCpkp*4}Z%jR6VP??R^cpctq4qKujerGO$P)QgSfH-A^RM**1JZkeC|>A@dN?Ne-6VV2 z9JztrBuTbYasZ!i139JjavW|coXJv?m{qAcA?b{XgSeRVEVufl$J*O)&BzeH1Vjw} zQbP1+ldgsrcF8nW5xn{5_0*5>UB)&8RWG_Er*{_L?}SYYS5MH3i*Izo&L#IDcn{%p zLUr0_7r}ke}m7^Y98fh?>_;`rYQQuajbdm6`(=!>(` z;Pco%8pZH{JNT5);BvTawWhtgl^4j?9!=r71?x+gZ8#&_kV1>=hyH$=vMN4(Ln&j- z(MMY+`v1kB&T8j80!%WupyGHwc@+I+{`%wy?0yQF|0SwxXUFPmW*6fPT_vy5%#M64 z?IWMFwAZ;2-i2AuQW9k}wJ?t6*a=FE+b-_6(A?}SnP#48m3PWS5FXh4?8waf?Y@ff zu`{{sR`-s6z)f!giDb@S8gWH|?&-j)l+r6@ESErea3|rpCGW~TZ_xQ^(o9zu|Xu8 z9`*7`2m0FT7L+M?S7~dKQOl#J4nNXPvVWrRQb|Uc(R+%YVVTowacqt|BOo{qdP>@G z%AW00_TAx8g^2CpYNBKMC)~2-W3gvym?M+F4Sk@$Rp3RQV&q?T#~yBzHh2%p5P=xl zf9lli3anV}0k28tV;WPUcnK_=l*g@NljGV*AqSB0olXbrpksc-spV^~LgI7rQ)j&# zg~svcRy4+j@`|)>(l(CV6|<*{{KT`2W;;f1nhL+($nz%nghV7cXof*?)m%VeaGy~N zZ@rIphc5TRsRE~>gZ5wczqkocJ;*N0eTVHhXr+Z^YA_06GgBNXOY2!(wDL8yh)CuH z`#8yLlW0qe*02aB8GEbV+~NtxdpAWA7q9yxiQ=ZJvA@8@>X#P^i% zS;T(}(AV}qjMBZb(ImUqlw(UJsP8w%3v(4M* zb5A*s4{e8&CRRMQkx4~e`r+!Aed>Zkg}$bsaNXt|u@Qy)r_Ue1cdUXZbJ~SC-}tAf zT^uZ_$?jC03GLlukBs!jPNdwmyUDOtwKu(#QB*ql%h+So!DL1lT2-LlJDWLQE==4V z)QBHj#Gw=e!zrXZOJMSIPy}zJq%av^ddiZoASmSuT5R5yoPu_N&s8c%OMMMh)*qUR z$5+yF;|=7hVJL12gTLU}7OrZvG|*60{h_Hid?h_MPEW2(I1W&oos)Zxf4)5F=uRpJ zJqebZ8RR#uK*&vF8Qb>Mel8)dttx}nda9U5h?8&i0KgSAUSJodAr4({l4W?RM80*U zsLMJnjQYp1wdQYi z7ZX%}G4Rcb`cw?Tf-E!Mg^@20F)NRy#v$-bp*wKkcFiEk%Ana6VxBXY9(X4?R(DK9 z7%ODrP{jOmRsspRLW{#)7*^(vODJ{p+^Lm*OBo6K=23%bZ@dI?22mpG$LlaA50~wS z&V%Hqd{)4?%&f@^O+=M`_hKF6s5EZ7nw(ItJ`sX7xR?08>s2N<=j-_^bMJSZ3@%b= z^NsoZX3B^mvqNMj9xW)$7IG-|9xkVoSM4VG<*Z&m`adUW~6c+$Ygp#ayRn7zhlhwLG|ur zWWC0&AAWwQL)irQ4?o=B2gniMzzw9rvXLQ@IS&z(MDyCTuqT|n7d0U3#@Mhl;=N^` z-M!*jx-*q{zB-n{zbXQ!v_nRY4s#?14}-cxZ8O0QLS>*ZWou)4LC2F6xeF-!*m zi`WOKE(g>V*XSG}_MWK(7>>&Z&JNRMM3bzH*q#WCaFlTgW2Fizz6`i_6RH%tU<3zI z{xT6zD~Fs1(J8j{uMA5II2+Q3h$8jcsXrK72h9nUq&F1p>De5egbH!mE)Cf|(Is3A zm*7gVj}K63*~>7mmVuDe&$`Tf4S8S#FE72Y^fqIrhvj7Cl$Rn&D<~*77g}Y^ zW!#mZ3s7_$lpx_Hy!(6VWW_^BWU1fnbDMSI*nmkVwktlKR(a`#r8gKe0+OS$^P~#9gY+%3sLEu`$zr&MOSP?yU{8Qv zVmw&oBtd1gK$rrB#zG2=p#&GrGu%vTalf%fRJIDV1VQ22AHHrG$|0+gxXb!IG4U7_ z8IM~XRTJT>Q->@bXNYz&-hhh=*Jw-S_*&t>jD~8w+tZWqsZH?esA$rs1Y{;eB{$n# z&LAi8A?l@fYkCS+b{vV;kw~N8?RF6Hv_Oflcdc68mWNgZRI1BNpekUxIV=O+x^}os zKW2yz^FQf2zG`cvWVE`N>4`Tt#J6TLcKEUHTtvUH!|{=#x!=cA*WWO%oE_w&UEyFz zy4tNs@pq-JwIc^|4kp$|rad*-}MM`;Ira8VXo-vx~6r74^T{byaY(Ne( z(TgO^dYf?OJ5+;Wo0+1S)@w;N^IU>voeR!ZjF~A4LYnAd#Yr%L7Fk&~17Q*K7((W| z#5m`tDrgeXoTX~9Q)n^8YxK5?DHQaT#l;HVI2B^Cc>Oe?I%4Q~%b29&+L8#zf#rpB zJ0Zo?OM)sP3>@*V88|tJGrPoi4!tiuer5DTc6jDiT{u&Bd2h&Bd|bN!nN9+Zbbg)! z)EQmGY>ya`P;_4Bo9|9CBdYsN130%sNF`8mqnr@qk?yI(iM@=@*nMDG#vYG@CLdIQ z@%c(;`Oc_n+5-YMHo)uzk?K4Y%~(sqX5w5}Br|6+Fsv4rqS8p57Z`3$T36bb;<)U$ z$xqSFh3TK;k1*9mg)IfxtDrP5pM(^Z6qgk;h_O`@v=mo!)73P>lXtHI@uZfGj|Bbccwb{Bt2z`-BV5hYp_8-~P1KprwdZnspQSXS8g19R7Wln~obADtP+6M~-HEI^Hw14Z10oVl`-< zzQ9w2Pda0E6|Q>?W4Wax`WCKwzzuy3zfwS|7ad9pzA{Z`y&A75HCwNEad^`awkd@s z)J!@C5WwfHGu_yd7-cp;Y0L5?l)JORW}DB^DLO+Z?VX3oz}nQxd?%A0@32}3-dUCf z_MdU|I)`_P3LDGCS8sUm|H5j}M*?@sVj&X1LUjg%5 zt#E%u)PClE(Mlm8RDYe z5qyxJNxTpHDVmU++p^?aGC#hYl`N@$H7~KYHt}N~(-z#i1j#F#J&VzDk_C z=@Nu4{mBdXGoUp2`eikgypZMHldzAUShhj48Vxv;LH-p%knx$Wi^Jspss2a-o==t} zRFLM8ie)b=%vx%<5yQ4lE1bfe6KxxB7|vod(YOgI5ooI6ir2*Ard@>q~!@osg2nUp%t+RP^ixsaPjFu$bu< zRzm&R8KyOSN&d$S8-z^jXG>gH#04J-V^HFy%@ThgU%YStgyvNUOGqru$7h$O+-M~= zFs_?%@?rOv2Ui@Y!xf>bh{abw{w-sw;GnfcXainnZ)A%7aGufB?NBt?8z+2>?x}?? zkPi8RN-7_S2bmt>1F5@}i!gs6mV#C-d2T`AYRM<3GigKCRDkWw&*3AP?9T&OssSoM z$0Gnm2MuM(`Gr)yEiHrOGuw8Kuf+(zZ2F5{;Oo?aWe^$ z+Wq%tl@^rbghaia7u66vSQ;X|QuN^kvm}v4QEg ze;qkbVO?o8Vs5>nu_{BXsu}fP#`^sER?WJ00)n5ysfpzFuVm+8#xak5h$OdloFRwT z%-iXTwA=926-iz%qA6Ebe>F1s=baBc>Cfgb;p*Ls+$~)#5Ce3Nff*tYIkb9mT*8c| zJC-p@svxZN=?lc*n#WwHv?JGBi8|xqd>i9zarF8ka-is=BOCDJk%{aEPOBopM7&(q z;OSCH<7%?c#W;;kdP7a}f%{aY*16FYB~fi>+9Y&I?qH?dApPo}{iAzt3{^iV;3fr?PQn0nH;bP7wU zF;!$y2_lLji%b3v!k6IvU7ZTDztBSX>ll3q);pdT+MXuABH`Na@=CevsTK;`gf1-m zN`q^Yv)A-CJ<<7j$LJ&O9xlt)?cST>^1|J9xfPVKaP${DDXmJd5hp$YW=a=?XO=5> zJ~;7BH+fiZ7dFT?;WTROPn$CQb$btgyW_pyyYbg3M+`9bJsqcSSSSo1 zzySLPY(yrR_JM6U@behZ>xn}Jm*)z+49@W8F>Q!gs8~XSv+pmgp5Q=dxQ`97!t@V% zM(hV2jZioW{-BOw)vkS~8;@kEZ{`4O2GT(K7r2G_(V4|Eqgx=U2NUVIVtlX+@ay;% z3p$S?d-w0nhE+@%m6C3ZEnzqn6xr}z-@~!Tqo05Nq&0tP$H&5(#lows#xH-0F&ZM$ z8HNd^ez*Tmpy$mG#>B3Am0Mr3X{=RRX3C~vq9AukFf9(jbA}ycje%{64p`>e^b8hZ zL;PzF+%yufh@s)Sb7Yju+9$q`x7Fc>V~MiXWxV<=z?fEhCQcrvySj9dnRT zqk{S76IOMZfgk3#WY!#9)p_k?Dmj20S=s?kd_6z@GyeIgQZh;=1|ti0tu_6_uEygMovyOQPa`h(agu$<<~6Tt8?(v&D^Bi%<&S4=_BY;HG2LqjLdZl9a^;>c-ju z3a+xT|6K+_mbSo0G9sHEcUF~qzHxr;GCo!lyL8n3w}hh$S7mR&+H8f=W<=oKa``J{ zX&Lu#xhw*=m#IMdl2)*~-t>&t+U=$@jXj$# zW?>`i&Y{?&OmMoU*vZ>G4T&sRGOb=wf7CZvOW}0ZFOp6noJRL7K)W6WoI^7;q&@@u zLgb~{F5b~?2`b$phKr{Jz?VUV)F`1-dJ8MjdK4U0CsU12E0s+0O8x7g_r5GPu`V5sw`|BgGQ0NUoSHsH6V^Bb&^Pm~FxUESS zJw4U?so49Joryae?m*hAm;ft=`|9!C53}!I+o=S%`B-Wl(p}Ddcq=>8NIs;dAKi`5 zh9&LMk~7-!RWY50&ueW;3kfXCQz$Xb=i0s^{QQI#_zm5zL+FKi zImaSeTARWi<9R4ft{a@6r8RXwL~H4t#~@$$|e}w-C+@?&2*X5&b;pm-? zlD}c+R{+vnw8tx{;`vIf{y-KcS+BZgXM0v@Um>Q4s8+g+GOp_c`nI zvgN_UpGOV&&F~^E%UUG+r=HW7y0+7Eg`7g=RKo*|rCV{2)g{-?*x9Ns6%-_>i72bT zu?parK>{#lFwoivQ|Gt=fTsS#D2R2M$8h#BL}%_T*5~L4sn<{ME>>BA0KSh1T1@#= zgCnT>1Yi~)#olX`(fULS&jfWLZ?%u|L6h7|j5_DX&Yv1*uwyA5*TJgVbvYopEXnCm z>6z~sdx5Li&1b8$5B0lal@8AJC3+TunW5^U>jjwHW7<1E%n)VaSARWl5~Mfh0HpAe zCDW0lsBI-*tBrhd+`NKqylBf!7mou@M59GFSdD-Vzame}Mq^K9qJM`HG8iFDJVK3= z;xP6cRuKXx>NXA^g1gI)Cm9Jm!G^GeB+OL?k*ueOyTheWiJIR=H{DeNzOK6;1JOCn zhCs1GUXzQ5N7_x(q|;-T8sh22`BGh`IfI`a>Bw>CQ_x@UIL`M;S>Kd>kend2CQRZCZG%lx(<4dSF`w$7d2hot<^Tp-<@A>A}(O)v-sY_5* z*pu>?qerPAz9yoI-v&L2!2MZClSnxxIGJ6qQTj0D)zJtVKA$X3w}t44e-G6a7F#kZ zQfgPN7`!W`j>eg1;Zj6T3 zLpGr19L2E*9QTL}&U%GJ;k7T3U_5fl3~A)h5S@8i2x_>e=<4ufh8eswvj!^&Gj7;% z3V|@)0;Nna)Lm{NH!3clI*GrpPFgiaiAqS$--Jzwu88j78tVhS-HjJ4{W##5spmicrUk@9 z^f?CsTG}y-aEhP2LJ9wPfwRxFmhD!AU1+{Vw{wfNW6xNq!R}o&|E*c@W+~JkY(bUM zW)_Svd`!Ao`f+i7Tb99+BVKfyN^C_T7f2lPG z;HG2f!=oOve_EH}lTsw)08?q%#RnRD;qe;@Nk$TH_E^nE!q2cEn~ALym)KCziTtWU zTe=@E(;tGM=23)@<2iZZEV*G4sVY-h(jFpq{Fux-l2Z-ayosAM>O$G^->Mm^d9IXpcjsRAYF%3UQ-X z9tM%86dQi5f*A!S@L+bbU6*yxALDFx(elfb@ZrGN;F8-I=Le93d*8$dIz>nMgRX&K z6MlT|mn*TS1Zk?ACW)6R=}qZV0T>{Nk^xB39Nj;}a^|E1)Ri}CgArqn{#OSL8yB+1 zU&zz7fJu#hi9Ers?PV|$E@`X>cCUBD>FF^QmD885o z(0yPPvF^r!QE+|yV@^82>WoHk=iLK#`bkOr#pw6HVY>Hwf$Qler|MF(Ktu*l2|}M7 zXiJvJTrfB&T*<=Uj;P_G(TODycBWd7uI?n@G)~w{GybV~lhx>R5Gwy#N7k&h;00mm z`2D5!R$`6Il%N5+gUsq~tms$?-I$JSQ1c8g`zN=5;cSM6Xyu(ilL{CEg@^EIPhkew z6OuQN<8&gPCvQON;9iU-PGJlPfl_eB~iBCTwgkZ8H9c6Y1<;(zR73{txs|CV$I*SL$|s3 z%>#2UMjun1EXvzn7@q9RbB9$c+KT%q+MEh|*53<%WC#AdXP-UTL)|1f4SaEYdF3$w*f=7bE8K*M{7l3QcJ2?MWB zjh?bg7*#R*m&p4fH?25=-IlY3Kh;sWckSHA& zqhJ#s`~ZnzVafC`3}v6?7Ai3DRqMwh-jkseVC-uvnm-)_ zpKXujeEH#*E@P-+avFAZOY1BG|AftKiPyx>~4lDppseZJ|AMH+Ij@TJVg@fx<6{-YSnNlE2_pmH zF@w%%Af}Uhb^gd93r;Z-Yl(_>eKETg2zY0fj0B5OcFh=0mLHTlZ!*BUZEI@FjQ=22Fn%j^UAuuWPJT2H4*R z<$c&AhKGE|6DkzO8ZqRrD*`(Ci&=osesV+$R@Rl(*AEpF<%<`NvKyWfcn@tgy^c(d zb!Czb4tgFiMNm|{)?R&_uDS{ zkjY``r&^$r57eJ#IsFPvfPxwnQ%;F~XA-6Ayi-DY6wW;CE>1_I&UF`5P~8bvMgJx{ zNLr$1CAlJBH%L3y&KKon#i2$)qEh~>{40!(d~bGI9%rDgUt0dr2J&#MN*@%pK%7? zIB_0DG%G&Y_FUUtGDttdqt1K<^^o2$qTxo0YSLSuZxLlt$VCLCCW0srE|}Q%7EA^p zX~5&}xN~>9&z&H&B&hx9t#`aZ0Qfh@utyYX9`*yA5z?2J7i^CpXgGah_o0uu>a@Yc_>Y5Kpsf#g{Dd8Ve>VsZLja?6D zGe`jG)N0}C|H2|t%EgYCp%WnuZtB!B^vMjoN#T6AQHQ8q3YpFK3U|@c+TR(&IuymYj zB8t?W`7$i1I=NFzPAUrJd6-thNPb8*VbPG%r$lPHgQ5nDa}|11Dze8Ptn=+9XoiQu zvj8GptVP3e%?0qUc>udwxX-V=r;7KaBGc97O8?SHG5bYEG8&=+weqFR`cK`5Nfd

    z04LFpa3O{;7vp}-aO}cBE1IV}Q~A3(k*@2dl0OS|t_uK*xrCg*j`hG9}JY`g3ovxPZ7>mrBRCb{1oN@9_Y38T@PJnu{Sc zghXe;vjA&`$GM~U!8+ZOtD}D@9?BF;;+vHUltjtoh|li=q2-N&6jdJ6%SoB^EUYu& z*f+m@$!Y*Vy&(;#}mGuKk~#NRc`2 zLxMCa_o|;_g&%%LDS+X77rqTMiorhg#S|32pA?q1>(ClayB+L#oE_FS1xA(6u##C6%DH|YL1Mh4tda z4i>%a!Yn_7e9&cDonTra&M~i{^Pa{WR5Zw%ojmDA*(kKeIqS(ie0w#X#w0(5mBFC> zALWB^9F8qooG$shEITkw-7*%4e^t4vD|qAJXzso=2*C zob70HcDtm9?`_MDl_pEm_(|Dlviqk`O<0+e*O(+e5MN`>*@hkD-m^fbkLY$b(@~%= zvFrOxd?Vo7B*qnCMxED1j%!8Y5k>(F-a))pG%VQR^r?!n&$Tku;q znIyzi;~MBwrjhPGSO-+z#1+hGVvl1SRy8->c-_n>qTHAW&^FSfOcl_ zh-?IVQRN5BFnXj5vx z5|n8NDxw|8zUE}wR59wpZ=CcWTrB$5Y5qFOoVw6rFS=nx?^}d3-lA$0*^E?rZH6V< zj9x@~dx5hRqBouO4JWAvg%YXHwPVV2EQU8yQ>FrJN=vzdNb2RZ$h<8zRr2FV`}4~l z2;1Xg{FhAlGK#NZdz4(rA37REwcZOykHXsSL(w{NK_46yjqkiaclcY&NFEu^-SPN! zd(Gy9ultZSUW}IB9DT)GsjR_}Fc0)XrB0TO^Mf6Kz!h^(^F@nDb&>#`TrJaH)QoVU2m1s#3o znh16Jf(j02O@(5Ao11UT4b_k*UlRgK_X8Cb`-5oj;SF@15HPfrR^_Ml40P4J%E8@k zA!1~$WYbEu0{eIpV{DF$gv>*Mz^8~R4R`F)Jp7fFrQg8xjXv^CMF4Qqh-T^sSL#c!c+V;?b_emtM)gW#WCnyXMG$U^-ZqF{C|L zGwucAiI+*eOb_F;NyfNjFQxswgm*-1|9g4WHQ_S2 z==AyfN+P7jH+(i}livsB_^WFb)tTC|{u^&014;M-56vsjClR}FZ*5mx51!z!^Bo$I zr&Q-*YmN6XMm*^B3FCNBbz)^4@j>Ut`xVc+cp!IIG(GmgF};-NN#|Q zH`fK5aYP*KRng+96=UD=@rL|IQR4FZe!NSx*SxzH-e~#e-%L`(r`FKDl_y%C)jf2L zZB;jQ2Pxk97-i+@ro4Y!-euocH@JtBjw|(qq*$aegO9HLW2ESIA_3-C^Da`}cD)sb z^d7kj^77v*XW4%T8c2?P0`T~=R(@k~2SX2mj^THTM*d&-DR#6q@~PGw&o4Y^=T1|@ z2M6iBpNaY=S*_s~h1tjg9iKZGNRE|{t77twrF*UJ8yb1<2hm@Asn&a~JilPjg9r0w zPX=%LBW{-b9Tq>jYc5iRB`;lXs_z}2-~~ePsHu?h++hASo;-TjWYU>Kym_z*@WTyn z6y^9HR5`#Ut9KnXO!QC;2I%p6_Iz+3ugSm1-I)~MwCh7CR1{w460YL5aC%u&d{S?E zB7cmh-Sy-1d;10yK?uHM!hU!c;_>(WbC*CmC)9Xpg^~$pg6k9Hyn+qXH?llrE|TZu zy8Ng^lW%c6AusN|3r&07T+;{LT>%Wj#hmQGo+xOm=XJr#A7dNM$g!8`u{uxr7Y4bY zete`OjWBEC?8>HuJ-kwFfZ7H3gq`z>uD^Y&^r zdrt-N9I#i@k>HcH=WBfmOA%_^AGJsb#}Y55Xq&%#B??_*}R*2DEHfGHB9a4$Q-SW>6%Q%iWW2eqxvQ9phQ;2dD#P(2j5sTj5ezS)R zPx0Q**q?0J0YaW*ANCzAza2NQ@P0m(3o!9;{un`bonyl52yQ~bwKkIBY{#S(e!mxU zjUqAUEEcKaPuy0LD=&O%z?B@5E9!7k7g$pP-gwgoc?E6 zv%gPzh`Gr-+~r9gp~fXYFn{U?+!E(92fJ1s@5oeLp1@%F!I^HK=%$JH7$`VRGx$twL2a4u#! z@^94@&p_`>!~58Zc-(XwA-v@oS~EnKe~iqKmyucKtTChS1y)u{s5oB4!{0ueqzN7r zwqbL`85-}nDV&!@jK=P1w^H>Daz1)b?&=Ot(l0CoY_bwM1MuSK{uy5{BE`1K z5&$lDR$4s!D4}~CA6+>2#fFx3QOY&til-f${h*Yw6$XC>9RlO$G5M?wNcCfuPYu|1PerMf?_tH^3dNnag z6OaHA%DOK>zi6}`A>!0mvn)`}NOi4B=YZMpClE8W+VOE1*=$q>R8cR{@Ak~#YA{jz z*V!zBlaArc$~sUL8ve4BO&f+^M-oN2;y^Sv$+#U&tA zhf_4&C1llqhjtwmB^jpKIE$4GVam?p{=Y*%EXzHy7!Qvr(J2X1>rF)-1^zrtxn`(h zZZ+y7=HiCq{xD7U_7cm`^nfni>)(tXP%~fv{2h88MJ>rbr!jX2q?pn3J&tI-Lp$|w z#Y9cT3zyA3l>2|{VGZ`$9_-DJ7L`d4+*`-J#e0b=zKOjAuM5=zU|d?o=VDG2kFo9# zF6Mf(4BiWOP!iF^N6|T71r{WNX-q6I5=ePiLU57>3)TrWdoWMsH1trsw-~O@ zEq?e$pcQij8vjtBw<5!+=o`09>Lcge;YbP#!F>c^fNCmQJesA(Sf*-buZqomYh6Zl-FO!qcXK1?He~H*#6f2M%XE;?9z%U7b-bX4VJLCl_2l6{xk&U z6jrD%9DiAv}0vZ$$@F0|MnmIY-!|Z+=%c?@3ObCuD+Mjr0K{xh%69JmBQ$)_g$a}a*2Rw zTc?hX*c?!Af;V(zt_KQ4!xnM9+FUR(ga9N1BfX#s`aYy*Kvdu{nkZLBP|eA@h0u%5 zg~2Qqy|pY(qr6L5Y^zDuBORUhEQrR?iO*#)Q76m?Ea1Tw9iJ2Qwr_s3ECcYl_GxAZ z+&dTNx;5d;KlE>{|CZuPPUCYrysXIJKp`U8;>BXx;$86K#sZFI^E5GI%~o!nIR zyl#N~#araw$(*V*9=JXWou4X^i!%K~=UT)P^>Q2uR%tNYd95UK>$5^kc2+0NCt@V5GZjut*5)pP3N$5;|*+vHL>cePT3oRtjV!$pw zscB^3OdYw&ei$yRro9bRA4`tH{TV4vi(j&m7<0qkC;AF6zT@3mES{7GF8WeakmV5CtEB zQTBO;-G?uMyck{OOT@?-4==PQ!^df)(<0KZ(-L`)PMXaFAX={~To8N>H}#aNx|yBs z7wK2+<^OZENbz<_nFE zwRrP9JWOy-t}pf+Zh|FyRz#;~^Ocu^bTp*5`My8QHI|rMyo!9ez$XqwEaw`;mDms9 z7DWfS$U$mc6&cXDaI)SmXU=v0(r|$$OjZX!so=l{6#e6#7Sn)ld|n3}Vid=Xp!XW9 zz9u{H(ak=?8xfH@aK$ZL!=1yF(uExWFv#spI2A|Z{L?3_JvTSzx9%B!p-e8bj@0-z z#=@Z6O{=^E&0C*!`GW`BXYja^IJTjS1V-0;mG$0<{bx)Jyg#w#<8c${=!#hE+;iL% zYDo{8X2`!YVVJUZ`vrR!e_sth=hD=~g<1w~lAWSGFZ&`R4x#aPe+$!OoSKhZiQcT> zM166?&EgoTEsNrK2)$AdUh)z_*9I*c>Zeb#6!L82o|Os;MPNoO3Cmq^ZFnxjRc&ER ze+_p=7e}vDGRX~(R*XT0@~ImtiH8I*O)98e`6oco>j%3PDwX-H&^Gvn6Tgi=nfX3^ z0kzRpzLVRayX|V!>HxoK^))Yh$Cv&hzy9k#D2(Z!D~^_}o?)%a9RldV1U4|ig%B!C zzzy7iAD$or(TGI~>d=i5Okn}b_=&3gHwXcYNH??W^6pyq%dNi7h8l0C->nZxBMm}A z;^;6DKp7l|HeHS(7ZMbj>4M4_-)W*ta?0Osn|8lS4SE|aZRpe#i56OJtxdMu>!4!} zyA%=50LLUwnQNZ;791E_)P>d7+-eJ=?P()$xbYT=A<(!&sWC>7)+bufKib~ju97Q{ zTw{aH7F}}9Ep2U=2DX^Lbk*DWHZdu!4$ohI^IN~Y1Fmw(9e3Edm)~&Q$!A}9)eErg z`8R!QZ}S~J^s!HT`g33Vbzk;IoP*+#!U|`chRY{1yi2yY?cGhBwsWVh+<$}fR~aEX z@j}tq9sk|?%>VfRVf%OHxjz>@ z^y5AGbL*LWkCx8g>vUE(J;DWc!=ukBOnB=9@#bT_@X^20&U-#`dYZ5?6Zg}6$Q2Ql ze+4<{oqbqm2Z~sn#>`u?Y|CjYc7Nr)6y!j@<|AH??=5BTptc%y^ia4oHFbhi-Ik`x zhp;)@VxM*#dhV$Or!IWgdU4X_%%AxRKT9=ow6t?_R&mlsP69*_jhKi7ICOmGtWk*= zm>^(M$nsKVxgn3mtZM5y@D$e`G%clsBJ&z3&_IG^*nqR*6{^;5(pg8{Rj%E*U8zd7 zy6l+|8SjX8qa%hHaE7diSp~rZD+X%fQ)-m##lq)qK^}u{e;Y2xOIdPDw`71BzUGC8 z0iJ8_WM1PpYytGCm2fjwX_vL4JbS=nF*h{d1HXGC#FVSV!hd(X446-#nu)@(Kp@{8 zzTlJ35Fo<7d-V1P4EkH^n2n=P$zcRfq4=1Qr!?q|ScvkT^r-2VBJ9Hm36((>YDD60 zIJ}z5lugfo8H9~wCAdxp@QvrGaG7{VqIY?&@5ACVI;LQy{YhRLFg6nSQK+g?jVe&p z$X1*dFU>9i5_}A}uOU$Yjv*Rqm4S;>+iakJYe%9)ay$SKSm%DqgCWP>1kHU<2NI=M z5S23zBwq+rk+YDe4;J&Qe}F}HmZaPqE`Jcv(_b4_J~hVGG6Xk-WZRIaZ?C_^$@1ow zG8Vk?E9B%5;DOjnLQmQapb+9fh8(z?alu{}Q2YX698K8VQAMN07N7mR4Q&<*01U1H z7Y`%b16@4>3c~nzETaC89K z6=Q}xwr+FQc)Fs8Z=;Wky9fYOF0(0iRBN_=w3^&mWX0ghe_OC3=Gf2$_goo41_Ka= zB019tGSwFsY|n-m7MpCu3;bNAUec*=u@g(|C@;RKcN(#)rK zvOL7bV0En0_4+dAmY8x-z|Y5Hiy?qSpJSpJ0^9{9mwsWuaSz5CQye6^ABdEJR*piQ z*VD-&mlY!Hg3^4#SxRWD;cq!lM?iQ%lEShjJ49eB00fmuO!iO<@q2Ag8gXv@`l(fR zZj#+LOHzirgSo>{35MD@XAA|b3_WX5nRslNTMv&ZeML%0f+gHybfCX{`nQ!ebLW%| z5uGP$2dZ{p!con@{x%8#5q+_k-zw*-mFUoWZLoAawhEG~C7oZI+8?|h&?CmlTU~$uIF&0nv*R!i)irdOYDlUv&DKVEu^T%aBewn6_v1LloA==zWW&NIpAN< zl-`8THicf>9zJ@6dk=4>hW?5IF5b3wRe7ZsauEauTtSFjB|IDl2XVB5`8_O;6Uw#@ z{ds&|+JJV!m3W8OgPg_Bq@>J`76blz{!w`2c;zQYDV>tn$FC|s!BBbZ3$LVd1;sqR zues)}Op*(we`G@DDQIJ%?-CHSvb@N^7={8^?iDsLbAiAu7r)@EI?h^alw-^~_I|7e zER4A&#)&xetKJRRs?$(qYjjcQC-9SlbC~m-1GChiy_{J}PRBjD`Z04{KtWI!(s1 zRwjGg%lE2RdQ`=hVtyzGO_#MO2dXLj>}QQjExJjdS|44l*gHnHd_iuN_cxcYYZbbI z1k{2H>1P|rfQ+?4&Y;3Zp^u{_uu-9cYDU@cu-c<)5^V^!?Me+Jhg;#AS0K`T$TP>$>PcD8Y2i~M4%$blx(+ecODJ}Nhic;-c@{WsaTw=h(inpx z&t|W(m4ly=p?m$1lA;Wv$L-6sp>Eiz*pZF>r#VC!slk3F>(}cBR9Et!99KM$hfTQN2Zu2h4M zj^Fl)7AO|R+P)N4r3ryN6dA`O8#uO3h)V)suDEmb##s1)r%S(3P%EaKzIniOuRtit z);ts!p4c>+sB9v)u*ZH}`3!<2pUS^HCgsG8Z87M%OMiph?ii*QXeh3DhMsPLMtsf4HKUW8zt{3ksw}_^In@K8|129 zEC)IHKcXILSFL$CvDjRAWTCWO7@5E!i;9~5?`Lc|$cZg9Fep38kO&yR>b#in7qm2w3uF1e)Y3OZB594iHeLY;}BEZV}b|FDwAE58O^6cjrNvP+ay+ z*1x}6f3d%RC3z>K#b!`!J&szXU8~a3f>^{flS&^N!z^m$osINt16fey(%4L<)m;L& z4^q?{1#KSTB1qta_|LpmyuLahCoTiu)VeW)uF335;*`6kNOkzKnc_v8KCZ15_8 z9_vPbEM}JmmJqD-I_CU}zV<@g8SnjN&KLdr1lA<&ylonyA5?-g)V18!fCXMu#)8#1 zhvZmN#u5mPtz(>uDgY%Q2OQPkcnuol9&O}($pMa2Sr0n?zuy-^vz07DQ1`rl>HPcMCFXaJF_B4_b^AmQfCU$DvccS4F6Ki? zN7-3QAI}{x8$dumJCYXGY=S+p+KaPYIy6yoM!GqN=YNgVKY%*ENC@C%UWm$@e>bwi zH>`K1=Mr^hB++9J?gJv{cdfHT1Z%gqHE){DXmC&z%>fYD&w{y%mgiy!HFKKEQ9|sp ztTFf!MdbgEF~(y-ZMb#UPTG2&Zevxd%;wlG-RP{ZlaSW}T_26a(f^L1H&e+iVZjNW zY>tw9t#Oyk9knU-imyElaWp*fpFdOXDj^PS5P*S#eJ+yVk5f}q^629ujDqK5m&3FZ z+N4|T!QU3wu!Ucmy*4QnkH#7y=dsH-?%*G*cTnkIMNug%sh~3edqPv~(OBZ`6Vd^T zmOE{(mBbtHd6`-#Gy6x}i<|8E8ETqF`20yMSo?ih+wwN!jqmIgE+-#ej;Aq8ByD0Q zEqkjcd*@MHGY?Y$*@2@~?Arbs)mD{?zj+zh{QlOC9_{Gni?=49;5&y_3u?9!M)D*^ zlOgg;ix*2NFa034eCQ+rs6y+tsbxZ>jo%Mc@tvu-K7*TcJ_WL@23VHULiJhy^=VtT zpiiaAyqKuts-F^4vYMqcg<$vx`HbKYF;7 zf?2aNWwurU@k zH(_5J=ocEU*oIL)%&i^|kPp>vzZ)^oIY!!TVdA)#d1y3H-s0-w9w>qV^+-msIc*Y4 zp{1JMmR(NM22tmJ-0|D^i&g5iv72$kKHy$#_`~sHKXwcP=i(5gnI6l!5S~CzBfXex z#V}a?v$W_fSv{Iky2zm_#R$Iv2r~hY^qF}P;05lw?rDBjK}$A<)$i~MW0*Db)fJnb z9>~rX3<40s;23x--YSXy@mcvL(JcJ=+zP;b%m1RA!JrBJ7|6)()%q-|_d^6qB zu7;qj8aVvJNc9@KOr@JrN*+9dEfR=S?RZPvSTV4_s=zSDT7m1wX?c~r$QAvV!pdO@ z{@G>KhP#@BLORm!)Yf!uHzjoL|2y*8|#KJnNdcw802p7cPyt zH^$PY0%+Q)EB9Ot^MhB*x>2z4sBmBJV90VWs^s^IKD8Uv!)!2!Pu&)H&?{_c@>=w} za3`=Kfqu)_Ix5R`h`v8|E0uv)(qQ(vSgIO)uBq;*G=w3Ew;x%+S_@wPakd_7)RV;9 zaeBmTz2ywH`xqlrk$GrW=9YC4w#qz_7V4$JP4>A;Ss(NYRdtEr@pwgz&z(f-6V=Sw z_wX#3Ym5{GjgTBK`iH@*UeT-iLmV<4N9}0&{b3%C<}d!;{lC;tTngoa4`oi;%9a|x ze*RHNP#cnm{YGr2&Z&?dpMz@v)^JFhFb?=@usMhX{`Eg_4IO(v>zi6KJ6^4hazr@d zYn^|VHi^-EE}+!eYyvP%J9Dc5X#-LC`5LqziZc>6jf%;+q)yRO79e8zPb-@6L|<42!||h`F1(8l zQ%#Olaz;Et>*L))bQ8&7*j6h3i=FmG-i{C2jUR-`@$@E;tuc7*F(Oa0UP!N|A7`eL z0{8YHA@C7rR{w{+0Z{UKT;2I50>ku&I`!4lGYEcP;9I%c(H-Msy8+%a>J5JNRVWS+ z>Zeh-02|L4m>9zG7N?(|hZ|$`&V!AyEb}XZ$e&+2W_=x~0pxsgEM1}nf$69HHFg9k z@hJW2^Z}g<^~P<46MDaG>@OxjI!DRlWOUXt%R+9M9tGQ-N)696BMew`AT*a2IM<=} zWs0tylx4E%i!^>kHY^a{Fc|(YhH3!Gx5U{+bIxUwWGv~N;0aofsuengmPfJeUtM@| z*_!4^Pf<%04Ku|)y zADVC=M<(WeG&XU7>DEc4lSM8CR6?Sf8tQ4JiFVrQgvua8j8e}M?X0uT37c}twgoT% z!64u;8W1o>m|WSxncTe8@(Xnyy35iK5g^Q%76|dJ)D-Byc zf$DQ{m#b zzVan-9c0EO>_8-O$E@Nd>qJ%7A~}NAt4I7X0`SG-Y?-#SM#-`4bK3J__o{!BKn?(~ z0;Er*?gux^p;<=B=1$oF;KewgLfkJ~tTZ zPQ29OY{vxrS?^w+FmU}T)n*DjmQCKxw7=zeTl_2-zz8NVg9SUW3%mJmO#}&KP(TF@ zbTGgK3v4)n11@;rLjWN}5JLhfWRODvB~(zu85+326hLBt^JV}R+b!y)!b%{PR9dAPwWQB-vNCI|&L*;z?4vte_#7vm;zf+WPJ3Lp-LC7p z)OB5#QtHw6+V0q;!|1m1tEK1q20uSMF}erh8xqIR@fne+>$camU2me7`ylo`PR502 zd>ZW895*4kr?8fOa@15mTfDpv=Xh+oPL`L2Tg9akkuzGPbh;}0$fj^-XoIW5Wpll} z0K0r|Rj=1m@E|$$?vo46+lPGkSgBIaG(xj`I~lzlpMC;>oisegJkR5v=XoCUJkR5N zf@WH4H;c?=K0hE~F~%4+J>7F%*JYe@mb-ne!e0iugr=xMjIpr7FC(x&?geYdeuazz2mT870idzB`C!@PCHD1nS~Yjp-S-O3Yj?Ai9zKtC z9P^+z{6}($9IHNvZ5<2JlIgAX&tCon59kI#V-TB6@JaE}w&A=}AB)K2qP;%L-S5yO zkn(+e#DngO#{2Gz{kY-FwD1!&Ua5^IkcCT17)0Mj6)I7uxJGK~IXkZY?^1`&mZls`pm#hXq&fcsYP!ZF;k<`kAg% zYsel5V>UuyY^bJ9!8jUL9ZIRv05mJrt3g?DX!8)En+I_P_KNrv&MPAPC0BNxFD!gf zTOO_^uX!P_=IILTY#mUBp#4Y+%F^O`Z>=;g1$Txh(w}d9{KnP`utqZcMZj|%}uK^mwB|)CBM3!zJXygx*oV+ z+FqYe^7$m6ZzB16%+wNEZV+wZdqqG88-d-*}Py}c-ef~Vy)$}mGx z5*QEhV!x<~iisuCRLfe@#&WXKUL32isl?U?J^QG`og6hMoPPPzOIO;tvCqV=Y6T`` z%6IN-rbXt${GE2|k~2-yG}~!vE=Xc4CutR(bMZ}HlSE0-_eT1k*oQdt@7yKcIpZ6V zLu8zSq>?D}#nbI|BD#Dk__0{%k8Htr;c*KG!XNMXf+AO=V{LLuY_)I6T&4i!I ziAjd^QI#bu*UE+;{Hl_D9PUTO2~Ibu`|VPn*!3FCAQTIly=6^eUMc+lr=Umw&cK@7 zZ1>M-7~PE0v7C%<8V+S}ofrA0t;Bao=oNiBIJ)iN)GU%9+33r}lteF}W@Hf%yL8e_ zzZ4`At!JYW2~@T8O{URwOP3Bp8AvD{v0lIO+2BjVFeYQE0Mg1nzUz8G#a8bat5tr7 z(XtAyQk`STCg?kdVNJ29Uiy zj1=|*@fAD)yzwv#KU@5+qQhjBUhQig-iSME<1G6>(st?b)4P`RS5$mfM4NWHCchx+JU^sIWf!FdBjzYbNHjVlyiCi^=bIp^607~SNmNZUz6&fGkrgjomJhi_KkbXJ6Vufj4`H|squ=z z6%u<8!u*)zpM~g{+~t+*Ytk(Pl27if`tMABp*8cGs6I@9AV^DI%05B0ZjyG)&31Df zF(3rJ#e{4&bZ9>ETlHnr?4BU+wyn2~TnAS2!e~FForkkHL=asQh8W{ubh~tgum}l) z8E1pu)IhCi1}8=(w|esV8EEW+*MM55<^aKKPAarBHRY?XVYgcN+WPq;_NbXBe z1X3g;Ap}mOn~&8SAE}O}J|6l5mw-%xHn!6LtLe^wr>Jvd^+An|!3M0!H76Wv1J!uZ z_-L<=f8B&DsOqUB3X4m#oZvMMOnSq{-u8$AT0K9yEv+5qCXJX`c8Nc1kn76(YYRx! zvtD40tIi3UJQ{BV#<*s1XF0~+zRl}K_`>9GbRAY>`H3u%W){uc3!7GsGiB&YKsZ7m zCRcLFyj`b@Bf=$l)+#HR7t4Ug(OUhOw|2-jmbI`CA_6=<~QSrnkiYi(_%Cc)N^Gn&6^RxR&ml z@@(bYz|4Kd9ee3SF}@^O8LiIN4%VMG?lvEGEJpQv%$MCo>%b~eJDbd}5ZYmZT7V{* zTtVsRft!HChkJQFyq2qv<;L+qm_=LPF6PO0Ow)?>TvJG=SlPBikI}|kBbDxkP+*?~ zA$$z7+ffg};cz(A|IAVBz3HOu%+uj{^8m9TK5FiU!7VOviN70L-}fgv8=rUrzYpTW zvpd-~-8XwE2jGy+)seVnme;MKZT&KVTo3{H{i?`lGCqH{gBrj9#Hl{j7eo_}83H>z z@G;0!+n~FaSji`X=c;@N)YD0aOk@H4&Gie=V{am+<~U)|R*@ivzYHrgn!tV#CsCG# zk52KJim1^zk)R*X<;=#hJf4V=Pa7(Vbc3W=tZ*@m1f}$5kzxyZ0E!abm1-VGaj!D& zC(xs;(O-`}wKi_z$xb|7i|76E;;3FGiSl^89B;eocR(ECZ!i8C>c8mPIZn>S{uj{A zC}lO7SV0Fgi3UN-VZ#zDgkVK;to(nh`Q94NtosGf!iu3lm{7jIDih68Nc{tWdx48V=~nj3nuD6e&m6pj9`jQPUQ!*=b)o@S*wE<5Bx#!NYS97{Krz z1K%;hJ~8r=K$R&XN-Zv?a{v-uK4XPf%qn)SgyJ?rsIGxdpicvj3)eo(*%H?63K0*%XPxO?-8s~M3`o12Nj0MjEZC) zcO?UTbP$2tgE%wW2}#ZfGjab2*$Kz4%Dce{Z}{UJ^kAY$J6z!fvf;x)BfUfyp(=R{P2 zguG^=y7?q_hCyjE3rrko%JFK+Hj>$UW8q5_;B82@E*uFiWHMnk{|y4?_;;nh5}<_6 zSdDV9Mif_I92SAhMXMW>P{^5Vcl2^-aW<{%8*T%NAy z@^P{7??vOkYi!+mvK{yIhMc|lxbL$Kk~LCdiurtUi8aFi&&*f48WgPeh_94n6VJT_yX@?05|pbx@b3Qbm$u_AGq&=^vz3?6i(54E=kA8CF1!tw zPYVJhs44m=+e3|28Q%nj*h$Z3ueQ0CKkW68&YbD0`-1;5NP76!MgKeQpQ~qm2DMz^ zzc*j%{Arz|izqtv|7+O)p<}I!7CbL_(Q3JVW$G*66%$|AuAlQ(^*eXpvtjmGK5&2P zIRO z|2@ra`bo+EclYPAyS8ciYR?zWHy`hIdBg`Q@3!#>a0d-&!3H*X;6n@3YH;~Pp*hFY|t9YYw$1m>}hvob?v5R)gC zVyda9on9t6~hNOUGFQbw3fP?YH76M79RY1|ozo#F!^M9Ag|zIAs)EaFx~U;U1^7O|~)&rJdozYXDiIY;@b4D*5t- zQh-UN-dVn0liS*}w$s4Tq|FKeBU5w&X{lFto5_4%-rqo|e1jlz-O&I7lK8hv8H!yh zrarNO%#uZT-bYACNbu?LcDkPH8yFU&qt?U`?6IbvsAYAFSO;0AX~vAjG^1FRQnn_0 zXlx}Q4zh&x%HTLo2q6$7gb{=YLI`~TB8U(|sKBZZ!lG7J8A1qsLh-AR5FvyBj4{Ou zMsKF{MXn;ka2JiOg2A=?>ifLMk~D1AkAzm@rz3KJmI>!_bgIL1e9_`ucU4g}ziQE~ z&u{8onOtppjqnK@Lw(!t%y*5j_{=_(a>_N9EAH0B66p~sJ$j%H5kg1{4Ak}L(Rnlo zF~%4pRA7Y(211A-gb2!uAPRyILKUKts-zcCC9$9?A^<4oJQm}u&`Kp>onRPRjn+); zEQfiSC|qU^DyaY8<%jq^93+>hJtV}=OX~&4uQo+HOu|V30EmL?41xgwW60uUfQ~W7 z_%<-xyHmi;SjXD~p@F66SL6zj0YV7P!r)*S2oULuVl;*^Mo31o6UX7Sekdz$fIWopF#u#HAV~iC=AxdUq@|c(3E(Gil z3~}zzb);z;&{Pd$k1)nq(=<)jGQ(w6%gnc78uPA-<$2=~k2s}H>wOH1K2ZA$HEha9zd3lDDPrpr}R#`W|%=R_`L~Kvh*$Rda)? z`R(&th#2cwjiN+R)$4_dDVnN53w0pMQB~DX6@@%Co(7@`MXNID1lw>NCCoLj!)=91 zv8n9of~2aNZz+49DRqiSI9YVX07TYi3%UYj=9+5!nMx)qQgN~5ZD~6}_yABlzO1Kh zU~@`bqJCw0PN$(>_FgFA}_3zNL3~uTSn0c*(z@%IkbIuF`mW zv_7T(RR|ICuNi*T=wY0Ze>L-K^Zv7+a*5Rj;=Csi;D^1%cGB2|^og8NiGf-)py|87 z`S3}aE^C^mY2)TwsnY!>tsfLsjhakbgQsSM3Sw)zG_ORGIaO1R7L5woMZ0vyb57m#Wn+DOnqFv(>8r+lw{%RJNWChM zqWJmw`Q=~B0r3+>Q7qy#H;!NC7ptt^Uufx!<`Vub5ut2V6uQ88S?^h`4uxILKq+|| zF2yRfZplr1t$0U!l8x*}c5KBX?<)MWw?)}EcE6mnv+MG4>go^|{0Zt>e_CA1uLv63 zx=9Nu>joG?^n^Z^uE}L-7W!?~;wkx2t4qsVh=WI_@uyPbOxMgRaI}nY@ zgO09Sd4V!!mAdS-@Tptb`Rztq^$>&B>Vj1Gt>meca_bR1_kHWu}@wGTh(q6OW#3c7q zg872wTG=pXwsO1J=Wve738(7{b%RXQRbxz^WXgQ!zGhl5v-D z4Q0p}r-98Lp9>+GD>n+WV#9%#uSZ#QV$?79xb)4$$+(oqWK4qnYU9U~ko-Oh@X)|d ziXIpaGjm)ey(UWu+=xD}J2~dQgr}sOvT`RnJ9TGgW;W2+&}y!|3(IoOil1NWoZ|0O z$!W5CVCD0(7x5nfe*Pe++bX(KX<~`=>UrE0o9uJgQ74>U9QV@mI%RYJuyLzrgHyZL zCg-u~xxT^TWSP*doM%qSMaXP!PU|*$kR8tP9{@5Fs_#ymh|5A?20{oCWa#?NvGCDk z`;pdYmQuAU^SwKf?NnoD?g+}cBghrXM>}^*@1gFd$H@OFy!e4X0^Io^D4mWQ`<`|T zot2hLsSeWFL6vtkckI)k$E)`pn9i%@lNR?+ajXz!AmxcUW)R#uIsuc%d#wr@{UycQ;keZ zJF=fC7r$w!!j7-}XIfo~m(hwONur$dcr!@>qEtu)MM)6l$TE_PP$inVrY|lPb(JJ$JjQA=YfjPq8_GgUHWfZSsxX9IgTVJSi!mSAvXT`&ck|g1J+7@#z zqAbf@CWHc-rfK8cy9yKapjAX2^LtHYq0ezm*&oFrm$7u zUfCVP7~=;GNr+iI2+o9|IDPb?!rwf)8vP)+2>3?1d}}yKTR)*u?NU`5OZuTrKFp%i z=$|o}shpF@FojJ;9~L@^yMeI7qHZAMpol+glj%-96@9G3A{Iom?v<@WtX3aQUo|e4 zNRJ?GOPQ=i+MMrxx-QDL4(X6mgC48&66q0q@kL)Gy4IsC2!fEqVsre8I!%qv ziEXr-0=_^hacn>VRJ(3LTGuI9`AVfC#~{m&8z@Z=VmlC;<|mFFrvKtQ^`n zv~r~86XWOS=M%agK%}Uu%Ia915ZhF2%1XPeyIv47Zuu zzHE5`;urNBR%fPfH!hY)kEp>m%-kZMuX^kfbj^I{zUEOYc9SiVBXoBbW_`xAEK@dp zv9wt&XZ>vs2q7(H6i`+1`Fzr6DY*a`nH9aMI@&g9ZWDS-jXOfibD1fwFidVxgO37U z-9i99aQ$Hr@D%&z$Af)eF9^oHfllcrJ#Zh)&n54A1!Y~Z;pu12O_sG>P{%SSUk{0O z%7VBkU%1u{qnFy!iluOQo7yldFTZ--@&E$ooIhw!Tpa}JW9}PBt5zuo?6a}09ascM zC)fO$!6-wcTh@Huqx-<8FW>%-&O-?y^8_G5@=HaIVIOu4q7lPj<98|R!d~gj(;9!? zDvYkEw<#mPkMPNHY%5maN7?vjz0B{F&at1Yy>t`Vmg>v7Ra)7aI0v592Z=rsq*_8N zI^!Ks7r!?sM9w4plWVVbrmjl;eS=y(V;;^o_PY)ov+vqz4HUGCp(BL$As~d-w9p1h zPS6kRGd=EIh!T_jtKYg1LWoATQT`rdNdr=y;>D$|C%G(tfrQ>JA)mXJwuW`R0|okT zBC6XvDUjerNC;e*+Z~fgqzaFhQ%^J^9)SCWK-+=Ht-&xuH@anw^B&y?K7IN2cLupd zC}6B{dNZ1*xj4vR?_qf#8-J?N-B_+r_eMw+4d@-RPDzm-pyC@afC9zo8|$L2%fI zu1ABpqjy?;@=y)RxWtW&J1O6brNYZT^`_3xFpVZ>S$jq^ST_759H9HuNMs)ps^=rx z+0~;!>RgoWBr}11-fExsxNfzEquh%$L}5qUZT(hqTBw2We$Z+K?IJIJ9|=)PPOV+2 zSfLZ8JHXEhd6U9Ir;WuhZ~!ZpLz!@gFRE=wpUKEJg2@hUxZ-} zCVT8+7;y6f<{K63^=wH#M+wUmQavNW1QS`dHxK|Y3ww=gR$<#K;p@pVTl9K*;UO~_ zEH{HO7I4ASS98uy_YyAQSADa+it;0M1ZKpzF0a#_tSZTgcbj*CFLtc;_^;hl>xN(9 zjL%^@q+cU-K?@Em5Kc!Ag(hqfItTlEX;FFf^sqpG zpH4S$HZ7|@UPk*c0y9IopHgF`!uu?TDrp%KR7b=`38K&mM2Pi8QIARpAw(rIr5^KW zfakK}RYn0H%@11gw+L_0otitn{)` z`LTdKS1Rq&UEP8kl|?_=R7>I3@emj z;;RDOAy0y3XBYxf;qP|X6o!R)Tp6? zsue+WN>#^8(cyJia(EiN(TkDgfBLyC_&@GQKAVyM&uK6{xS6c^nN_7F#LD=IV+xz( z7x5Iieq&LlP(&tI5`n$u&vcc3{m!An=yweSE+oi90~5x~8@H!ZU)@ko&z;yfPJSU* zzsc>St$Mu#@Vx0cWo+6GA_xzT} zWvt`ivULRge0ajm`blho?`I#2^ zbJY^hXBXf+3=XWL8y;TXYB2G%1ye}{fD^dG2SaCChwv}5bJaFXUo}3E^4h%hZ)CS< zkX3zZKGT5L&i z(#tuf2LqJ61cWdU0388s7nnpYIP5_(UDu<}f^i5Z{PGXmex&mW-BkxqYmsOhPWDq+q9gJ=im<)l(h=bsS z6NW*eaF`La2rWt&1m{r{5V=l@E-2#`FvfH2vBBr9JzPwAjVg1<(Y~71kiHU!{bc)L z$=ySu+7f*^QwmA+eF)FubJ2X1D9t)g-RtU;!W%^BObY)^Ixt_u1m+b<78Z#I#z%Qp zF3vOOWN;Q%&m!n5E|wgpWi(5jXRSTBYaa&SLZ-WMEDkSEKkj?Iud$y!(Do`DiIe0b z0bXSG=ciPZR|PUWFJt&?*{$Lyu4hkKac8?*R+x(Ne^u}iAbb#r%eS(2(FolShuh;H z9u%)>?S5Lj5p~wXfx6-QAQt6ysIERWF<^8NLThY8 z`GukRU9{e!M#IjPx{EM;9cl4WPQ(Rnk)qN@eX@@!cYA@+N<;^cG4ikPB4bpuisI|0Kq%QjEs-lk1 zCH&4;So+HJn@4d3EYj-$l=~>@%coJc7%FqDlT_*w@)-JC8hO{EDkIcga30dO$bM_X z=6TwFajBy5LcgxrfTR<1d0*pc(Q8(@rulqgE9a_&%aXm8yEm$;st>x-J4_rFU2sFB zdYwmFDZ`kDetfn3=6m4R|5!-oBvaUuiB_Vn; z5ktq`LQZWr9f4&VE0pOb@X;1;DC~F%@kv*4u|)d3mbz`LiK^Mnt>?gstrq*(x>U}U$vN?Lf7)i3#1vk8D>yM- z*ECH+PvlKtnQIG|d}d-0-~Q&|p|5!(ZlxSbN>IiY8ZjrfLn+OgFmKwM*d(X`N;JzznIhg>G9_-U2$s<$STV zWE!vU{ZmS|$<)vybKWI{gv2Pc@qtES2AQ@Q(=ZIfiGd8mGF*cp-7qwGqXpQX_~C;( zh1D=tgD8F3IkdU^Y(2f-Jtyp@G(5XLvek9O&C}Us$2tx#e+0qA^a5QYX5FD_m@3)z z(iIGLY=u)VIj9%y1bI)eypF|OSC-cN@b)$?qXMPihq4Kzy={S}{pmzHx_bH^bg!uy zoM#m)h6uUa@(Lclm&i`HV052H*wjd)CxlrOA>(m2|R|MD@!ElqIKX zfGHaQtCB{R$g+n+t~wQW)7qv5ze{_?fhPr7bDBLyk_W#|;u&h%?#K?DK49VV}_nkROG=fVZHIdK&6ydC~={i0MTRr4O;>}w9#k(}h z$L6S%o; zhUC^g*(2Xjp{`TXXOB<6{B;`Ex5YHG6JF&XdA>yR-`L8;daD9*`J5{5aO?-6THP9p zPPU1K+1Ds|yDh|ZTmpc!K*+{&XD`L=)Tqui3sf>OPoh|Aggl@hoLt(!Rq8YE~*>|OZfMJn>^x| zvO~hA_m`38(%}rm`C4(8a+9E|lP==b%KRKCscBF4+4EWN$)4o$tQV4#RxX{?vCVEK zTZ7=gejc0rLf;8HoN#X5XGUmz;RA_~CtE$eo(|n239Btl>Q78nsikNXCofyrmf}dK% zt4-!A8~-QPHf5^LdyF6*->L@w1Ae4J%@5)2={Yzb&R^T#VF8|~Xg+9}L<8zHv6;G3 z2F-3NtXX_O(d2@<@%0F39|^PiUd?&!>E$xeq^Xp_#)=>^P}-nryK0k?+A@<1&awD_N++12z@Ir*&wWlp$LQ~qIs3Ua-Du@{~~6V*Qi zxhWKdAT;f->=8I5u(#HWzaMRQlXjE-K(>sZveE2O6hvB*ZRyi&gxFU5;k1LDf4jg% zY4s^%idaXkWS#$3c`7!jh@t?ADP7&RA6$H}a}mAmA1goy7FJ8m8?XBf=uih@fRHPF{PBvr!_j%Cj&gG>;!a+#z2bH+Q6 zPxZkWw1L~x*|<}VqH+Ek?w}ib;CY=y(0zwjUifTFrCJvnLRZ*e^mP(RhGt5r=QPD@Ow!t=g9D;Si zIjR2LXVhrm2sjdsiWNU;>R)j5M5T~*)LP|?K{uXTq$4Y-^s^e|%1JlWS~o6zq|s`% znwY<@k)~R1VgA*&4M)dDLSe$1P6wNeoCf2tg%yBX%@w}08y{>{aP3cRxb3DMg>COo zJ-A-Fn>WOU7o&Onq`Lmb0z2hoikNgKcDf>Janq8@K6kTP9)V){o7Xue)m)by1BRyVn`_Cr znwu-Td7~g)GcSMAn*B>6KbCHsSqc|d?pH5962YOmQ3Cex@=9x zc~B~zmm{)iyvFe!uk}y@BIV7b^R~CwDMSqj=e_x*;8S3~2F|(kc=raX4F+co?|IeXy3Sa!+gnEZYDm&^119UYcp0ayyD4~MC2lghimPv^YZzf(WDoB% zvR2wxFAM4YLi6U5H1jixOUPUWi!jyw;m@*F;%gjNGv>V}kI&s=x%=?prUO@j@G$l>;3GM*uliGxaSu zRwjw3>dwS?`Vtc^&oLKwzaPzo)4D6)af?FcRGbj%Un2L#G+LQefnt}5$pp_o#YirD zKawAdFzHL5u#7Vn4Z5Q8(nb_E{TrUOh16MSmUu;!`fHlw6ie4^FE83(%}yO7%?>6c zgsi%!-{;~cF5|n_^7F93_q3UXE>3>a?Sw=n{=RM;?8-y<;JU*SpE_1_yin6R8faW+ zxxm7-=}&u$I&V@sSWuJA>ywcciE6i*w<=$~yypt_+TEkj0+U$#pE<5;iChT5u+a^& zODWAWzV*{{0mF*~$oV~x1Cg%yue z<&?06Q-lnC+{{Ni#%86JvMpcn!5p@5h9`Ur zxNZXC#&vj(Y=rwb1&K%{`7evvRF-`$E-aL|X!-zQ$$ zfX*G!G=iN?>PGMoY~*P!QuzM+#0OT0c$RRvS2>3j4WY^{Efnd-3uz(rYV+y=sES$>VAv49 zLoURecBuhR=>zN6@QypLZZvW|9}!htNg8ytzi0$#<^xpMYd82y%6)BzWQCaQ<>@ADxa z^C_S6#b5o?f2+|`zz{Hc7y}FmLm7SDq@oq8c-#gEyQ`_3tv3KiK_u?B*3Jy7hr|;4@Q}E68CjX*R$EeS{7&z*cvNN*B3_tiy1^)ii zjkz-u$Sy{HMR!I4p`r%sZjqa7O|R|8G+p)5&lCJKAw~rWCfFa81c??{DoKhfu2e;{ zoj_1W(=g#qkE|1y8boNpcNrPB8=P|sLZP_L*rfW0D)QWB5M8q znMkn94Yn7TJI8o6Ng~+2I9|6%7)RA=O}3H+>{8CI08K5MIMv!C7m1W8L3c)IPR4Gp zi&fCw$f`42vZu~(WrDU~MXqNFOGxE%T&|5FY{vLf$z%Vx2rA4CC+OqAM^cy~&W(Uy zv+^rm%^~lVnP`U+hj`MGiG6Wv0AQ8_fc@2)dG0PTdj(9Jix9$RL;- zK{ZwF3ouuTYj&q)!;;`KaZDOIbkFuZE(Hz=we&8@)#@6{)G(>EvT)Cw!9!tsi$!S8 zZg_USN}D#hncTkOP5@B8oMZ}8n4(mtJv*kOd9c{e!I#c|N#-li70q=GnJQ;Bozar7 zGLf815;aa|4S`Z@DZuY4|2XZQF6nsE4z|(rQ?(bbbkvbGJqQ9a;uxk-2ta0je`N)@ zjID(%MaUJ7wY-pZirQM5QOscoiCPXHLFYJ|<0O(hblSg}GhG(TiPNNI+X9Vyw|E!C z5hC-Q+b?kar}-Jt%GRCgZX&>t(lt@STWUtOtkm3?Zt#OwTfX6*^xD>SO##@x^(MLr z%t=ir1ox<7(q4=M$p)1e(jhUu5bnw1l&9jBTwELYTaITk)0w#))mQN}yJ<|ZV2&C^ z!BaBASj$$_q)Jt*p4@cXvH30ciEr1vz73?%^9yv2!V6Ns1%+WT581>rBN9A{{=wqq zZdjB&_7+w|{&evh&OyarY!a7OK_CJ|(K6-R&irq%ldR4M6$AG;?kLaxp1v);bWy9W;bf9H1lv@pw>FFeng7Mly^afWB6`%2i21kR;^Y^JN;W zaIqaXW7v#Y8mk^Jx&Q}X)84tMgC>(F+iqfPQy)hG=KaMq_EJ|%s<+V;>J8yr9tILd zVx-V%f>%faaWAR@=YA1hqyz$-I6X%eA0p&Bgq>CMD051Qh92fEkMZV(+9F23)g}T6 zAtN#&GqRxo3Zf7uViG1}I%Z%dW??mwp|&vu<^44OXUTIs!(Wj44o;8;`p*B-${Jts ztNCY#tn2Iam2}_UZ|&Ru1_xX8d-Vg`J)xgP*#NiVgzv*o`_LEkbmwkC>uIf8*ZA)% zmudcteFZ>UTh991P%}zQxy=+G|9(9|ap%8#O!->z|MS19rco{r`lM zA6yw<;r5wnmK6pL8?)M!S@RYjjzC+|R`GP_>8q`?XZC|P?l=D!pa8Nryca0HJ}l=p zTid?&!-FNq^~WnWD1Q>zd0#x7V(K~N5Jv$(2prKib}F6Kc%wC~UF*X^l02FylTd_6 ziI`HPP|&Qioz#Cgd3HW4ISCIkxS}Te6f9|_tKO4fm9Oxoq03Tu;hQ@Q7ODQt3A~H;Rh^o5c9s=u|Z4zoFFbwY`!FU-Ltk+)!rf1Nn^R0 zzdsWU)2;cA8RwMmW04&1Rmk1GQ~TDMXZoE(Aa3p%*S z9+~gKEMSn1G-ooF*1h5Y7_!GyKJ1JQt@$xKP+%-pP4YuCD*_6bgmDUoM_jwoDELQ@ zkf^*HzlL{|A$qP>vE8_oKqfajJZp9oKC9|$D$db`c5;kbSX^UkupEu~n?WlNjz@@6 zsx1AJ@Uc^OAk7aagp+b+^mtB`RqY^t<(V5}iW-O6VIzwc0Ulk3YN;aXuS>qInp#64 zTn@#@it4rAToJHUGph4}S0kVBgQqJa6wdsG7ivjD*Ad=3Sv=)#!{61{oJk#Zzsp^ zDv}EKIjN*Zf5Ws9OtB3)fOcJXfTf=>G;Gp)o{a&TdnywxUfttLmW7sBXJfp1WU?e< zj9cliM}brDxG+76E7G#&#&AD*2EU)%_b-kFykXr4PSS=P`0`T>v*^f3VXylSmA4tB zkpfL*QZ=o*<;?9(Y!Px{SZ-V9x_pS^80P)x;su;hBI&ugopC{vIK~FPG(jfYoEQlP z(vfjjIPANcl|n1-yJ^UwNxPG85^gAKEiRZD1eFuy)_twS@VxX+H%}$RYmXTNpJ{HK zN*yhzC?40TO2;=9){kE%nKqHV9P7}7!)etyr`P56jNQ)UWbTe%XR>yWw3EI2W|&-4 zci9|w9JfWQj{8nuS)FU^)tl>kVtF%c3pmA$-`c1%VFxcc%Xj$U%?bwRbg40a*S;_B z!?V683ZK_|v@$QQ-OV_rX^3=~gUNq=H>+L>ajUW~Kp~WSVq)gT_P)Hl!Z*C*2B=QF z`l`3VqmlOovFOwBJT#`iQm+S%ne2};+GswgjO!*vjR75+*eLokT`Y?0A*u3C5h35^>q| z!n_27sH~^bj+y)F63TF6GGN`Qi`;+c%+5qK#l#$Bmb$k!fIB<7lIbIf^s|xFM9pPn zalylM)v?zQv~%|fni*;hh0mcYnejGx`q}}RbTo~Ks;PzbQaEmFYwLU~pEQ8`Qr*m) z-D}in7j^p<_8D~o@P%5ui@c?Do+#Nwx1!>&vi==E1n<+zN3}wj7X*4CLeqE(D z=gHC${Bm3azWVMyoYPqEAC=vZR;Q0-$YG3pc$nk-dYr?W-f}0=3|2E9&gxyuNv#2r z_NooV^V4SggLh?Q!78F|t-Vui5sLd#EU#|4p!iS#!hg!-?X*maZMNHCr(Jg2W3PSo z`&g<24m#wpWtLlErBz866`qn?(5&1lYN>-W%afDAm=88~b3(Y{Xl$eOHbp(1?&5w7 zoEwzo+Ol-Ipqm6P3}iPpKZqyglC>&S{R#+7y?CN{EPlqO1Y<{eUq9{nE0r|Soqjb} zQ=2ND(hR!w>aY|K2RshyG%4qsLYvA~L6_>1p-=q{IDG+@yy`LgqNFY{+;XVL3TmJx zXjR0xEObVyt~;tou8j6HOeSJ-F^!w0_n5sK`*TbTf4zPvZQcy)_#y3hx#NB()}J3S zJEjGo3IHZWWdfz733hWz2ncvM}wkNd<3O51_0RWgwm`7q5>HhFxFbGSU zUz|KFHWkBMHGOv&!%O9|%YZ7Z@hsbf-DO{62ruQ>1Pm26by$jq4zj3jby(9H%4zGs zkdMQPXgTKsu_@Ds25oi>Ny=1|(FVd0O)`qb znBK}EfkIvvSYGu5bgXR3DnU3wle8caS37$~$F`48YJPw4vIIa$iF~;PSdAdB^2yR!F>4m;pMm3CL zGg>TXVj=8omfqA(C*8%5Ilz|8j*?6a%Z*}t={w31EaYPVGEG_A8Q z1)Q;Fe}{OB;D!&$GSsH8Dt|nx`LaiGXPL5&bAf9Dd5$qx%}-|llKdX1;;}nVdr!|v z3BZ*w&=D)OwO?0DzQ~O9-ST7-GZ7ziPXxLo48p`m&GkcedBIP&#F>d2YIPC4Trx49 zBCY8vzoh{jmpgGp1l{BNE}gzi%~ z1mO&V$>M1I+-s!8nVJ-a zwCjesl=;YelsqbJq7|Dg#1EEDS996 zut5*tFz&%3)a(>3e;RB&b{~6>!xSsLrDF8QClh)ck1>G%4h9US#VYuf@|XoZ7zy)r z4K0YgTD0}(@FUl>qXT`w%b6d(-JEu+ z^vziD_uYngHBDF(?5{4g+!h<+RL-9&Pebi3C9X6#&1|I$xD_~$9l(?Cwn}UZ8b{tF z;!2!TZe-5AxBUUf;ji%2y2A7jk1#ui6h@xqS~=2@{4L`4EZCeAAz7kH#hf#&Gcf4X9CZt<0OBQq`yKJI;WoTN7d1$TU!L$+d$Fjaiy`Krc46SIzQ>2I$vA46 zn?ulU4y@{wM=CyB_j~P_BqcpNp?)hlgHq&iL$DlxdNQU4TH*U%uzMD@!!k;y<5|qw z+WTb=@*&?63n@p%344MN6-D?&p?Sk1LtzOlx1eEA87*qlC04>2Y<6WHuGI9eYt3M}n{lzC3 zaExi%$5b>skwN4V#Y831bsSY8dfQxG8!u))@%{<>l~4K)b~L$r?FBo9A)Qza07slC zO)qVYPBmku&2q$R#D9Mhf;hQ9Gx-BIWG^%tbq_pEUbCicBl3Ijjn8uY9X9OxnXmtO zHEH254yln?Bpu0c%#ZQbFU_}^Nr6|~ga5EeEOQe*{M3Mi#V$^`Nlpb0KHQr_(WVKK zcZ}chR4m;3BE1YL|7uwGhHn~Yn#H+4FHW4;cw4e^W(@Zjux3uc&XU_EJPxyo#1%c+ zMEh^I87C9+wKz`Nu+H_YZ-ekRC8BZr9Mw$jZ{XL9D~&bXwQeg;wr_sY4$-HgfEa{W zshWJgR6*rxMGczt4$>qK&SgCY^ zyBpHX79NO!OT^DJk4o*SP#cv+c5U_g9#h^|MT>zZLlYEf ziTeqa(rh*_?3uRX@R^s&irR^j`Bf{`xG&xOP?1mkKpfjg{-o(zZB6v5T85o_o8WD! zyv>Sl|7KR?Q2_Y%~dKrTC=_TJq!Ag!DEO%DXUNvjZNEyRf`NN&bm+n#Ln|EUZt zHTc}v<<+L$R&?!mw~NgG&-w%Ar|jSM8n=!|emkbccy>B9l|!Vs2S9cF`!?lI7&O8E zMb>)3jzn!C(pt8bZYyct{#>*KbT+fQ#ZHqLdQ)y)9>M>CAv7n7i!&+RDi@caI8}-! zsl8ZJQ|l?0_Dznxtc2{~eRWyuB-AgnIKhVAykCW%S2<{}rReOlmh19~b&u!J#X#&_ z?^%goQ6bfu8Qb?wmA}SvBk&NZKa|uMgzw}ft|D=7jC1-0WX~<#T;5d-fA6r^O@wVD zib>jK+f9tcS5qAglvu8o_Ax^EqAw~7YF`S z{!=Y96m!i2PBaxoHF zeW7csRxVLp@7>`~4%6J+Sl+O<@8+q7j^@&4|CSW>g-_+#k~F`%X1V8~9v5X<@Ut49 zx32Ujyu)YPEd!e``tb@W+L@HAs$Z|h>Eq)K@n_BPB|D4L_c^^KeHnaHCXTuBoZ>XY+#;+}qJ$Ech_fGamuyI@$!CZtEI~%tsoDXLZ zminc+PAM53{B3hcEh%ZJKk_kEYF(zB?UxU`p>1Y;CyNRXKtqe z@RD3g>;Fy%z{Gu2hb!w5`eFwV8N;c;^dx!UaBB{-NJRhu>(_XhU-WyeAI!&IzmN~ zV;2QYoGvhuxqYT+-%HMlnTm47U(dB`i%GnePstJ8R6(Wsj+q41X_XBB=14iDM3q#p zGZ7DJkSw0h!bF-?U#tGwDZ@6$BgXV}9 zD7X9*5$Q}v&7hWu)KOWNyU0IBbg@Xh`*;>aoyTgkSYZ{N%v?T*SrBqpZ3_dSHX1Eg z4a%k<>t>D1!X2QEO%rA3S=k|I*;zaC{=`q=WT(c*G*kgeX$Przgs#El5=G`^C7Dbo zJ_s?$h0dCxU;t4(lWWTn*di;A<)GDN%?v?*8T7f~A=f(i<8($5^2sO~L${@^~Uf}_09KgjLeI<<6I>BwRRY*95 z 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 F003~6+#dh{ literal 0 HcmV?d00001 diff --git a/files/glowing-bear/fonts/OpenDyslexic-Italic.woff2 b/files/glowing-bear/fonts/OpenDyslexic-Italic.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..9b78966bb5d2b8dbd89a875e16f4900e53160bb6 GIT binary patch literal 107968 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

    Nht5*!e)amzriwY7!3ppE*%+2m!$*Qwl+6Q^$H= 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%0DsDG_~*=lw&&q+I%8pxy&mOQ<9l>J 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 z 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 literal 0 HcmV?d00001 diff --git a/files/glowing-bear/fonts/OpenDyslexic-Regular.woff2 b/files/glowing-bear/fonts/OpenDyslexic-Regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..4ee220be7e9b551ad100468bd08ba35f6f9fe2f8 GIT binary patch literal 103336 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

    %w};7gHsFu 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

    1R7gcs@)jm78CPaRWvU6m+!_J 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 literal 0 HcmV?d00001 diff --git a/files/glowing-bear/login-hero.html b/files/glowing-bear/login-hero.html new file mode 100644 index 0000000..cad7368 --- /dev/null +++ b/files/glowing-bear/login-hero.html @@ -0,0 +1,16 @@ +

    diff --git a/files/glowing-bear/neodrop-crypto.js b/files/glowing-bear/neodrop-crypto.js new file mode 100644 index 0000000..8eb8aad --- /dev/null +++ b/files/glowing-bear/neodrop-crypto.js @@ -0,0 +1,326 @@ +(function(root, factory) { + 'use strict'; + var api = factory(); + if (typeof module === 'object' && module.exports) module.exports = api; + else root.NeoDropCrypto = api; +}(typeof self !== 'undefined' ? self : this, function() { + 'use strict'; + + var CHUNK_SIZE = 4 * 1024 * 1024; + var SMALL_MAX = 50 * 1024 * 1024; + var LARGE_MAX = 1024 * 1024 * 1024; + var encoder = new TextEncoder(); + var SHA256_K = new Uint32Array([ + 0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5,0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5, + 0xd807aa98,0x12835b01,0x243185be,0x550c7dc3,0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174, + 0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc,0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da, + 0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7,0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967, + 0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13,0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85, + 0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3,0xd192e819,0xd6990624,0xf40e3585,0x106aa070, + 0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5,0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3, + 0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208,0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2 + ]); + + function rotate(value, bits) { + return (value >>> bits) | (value << (32 - bits)); + } + + function Sha256() { + this.state = new Uint32Array([ + 0x6a09e667,0xbb67ae85,0x3c6ef372,0xa54ff53a, + 0x510e527f,0x9b05688c,0x1f83d9ab,0x5be0cd19 + ]); + this.buffer = new Uint8Array(64); + this.bufferLength = 0; + this.bytes = 0; + } + + Sha256.prototype.transform = function(bytes, offset) { + var words = new Uint32Array(64); + var view = new DataView(bytes.buffer, bytes.byteOffset + offset, 64); + var i; + for (i = 0; i < 16; i++) words[i] = view.getUint32(i * 4, false); + for (i = 16; i < 64; i++) { + var x = words[i - 15]; + var y = words[i - 2]; + var s0 = rotate(x, 7) ^ rotate(x, 18) ^ (x >>> 3); + var s1 = rotate(y, 17) ^ rotate(y, 19) ^ (y >>> 10); + words[i] = (words[i - 16] + s0 + words[i - 7] + s1) >>> 0; + } + var a = this.state[0], b = this.state[1], c = this.state[2], d = this.state[3]; + var e = this.state[4], f = this.state[5], g = this.state[6], h = this.state[7]; + for (i = 0; i < 64; i++) { + var sum1 = rotate(e, 6) ^ rotate(e, 11) ^ rotate(e, 25); + var choice = (e & f) ^ (~e & g); + var temporary1 = (h + sum1 + choice + SHA256_K[i] + words[i]) >>> 0; + var sum0 = rotate(a, 2) ^ rotate(a, 13) ^ rotate(a, 22); + var majority = (a & b) ^ (a & c) ^ (b & c); + var temporary2 = (sum0 + majority) >>> 0; + h = g; g = f; f = e; e = (d + temporary1) >>> 0; + d = c; c = b; b = a; a = (temporary1 + temporary2) >>> 0; + } + this.state[0] = (this.state[0] + a) >>> 0; + this.state[1] = (this.state[1] + b) >>> 0; + this.state[2] = (this.state[2] + c) >>> 0; + this.state[3] = (this.state[3] + d) >>> 0; + this.state[4] = (this.state[4] + e) >>> 0; + this.state[5] = (this.state[5] + f) >>> 0; + this.state[6] = (this.state[6] + g) >>> 0; + this.state[7] = (this.state[7] + h) >>> 0; + }; + + Sha256.prototype.update = function(bytes) { + this.bytes += bytes.length; + var offset = 0; + if (this.bufferLength) { + var copied = Math.min(64 - this.bufferLength, bytes.length); + this.buffer.set(bytes.subarray(0, copied), this.bufferLength); + this.bufferLength += copied; + offset = copied; + if (this.bufferLength === 64) { + this.transform(this.buffer, 0); + this.bufferLength = 0; + } + } + while (offset + 64 <= bytes.length) { + this.transform(bytes, offset); + offset += 64; + } + if (offset < bytes.length) { + this.buffer.set(bytes.subarray(offset), 0); + this.bufferLength = bytes.length - offset; + } + }; + + Sha256.prototype.hex = function() { + var high = Math.floor(this.bytes / 0x20000000); + var low = (this.bytes * 8) >>> 0; + this.buffer[this.bufferLength++] = 0x80; + if (this.bufferLength > 56) { + this.buffer.fill(0, this.bufferLength); + this.transform(this.buffer, 0); + this.bufferLength = 0; + } + this.buffer.fill(0, this.bufferLength, 56); + var view = new DataView(this.buffer.buffer); + view.setUint32(56, high, false); + view.setUint32(60, low, false); + this.transform(this.buffer, 0); + var result = ''; + for (var i = 0; i < this.state.length; i++) { + result += this.state[i].toString(16).padStart(8, '0'); + } + return result; + }; + + function b64url(bytes) { + var binary = ''; + for (var i = 0; i < bytes.length; i++) binary += String.fromCharCode(bytes[i]); + return btoa(binary).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/g, ''); + } + + function derive(secret, info, length) { + return crypto.subtle.importKey('raw', secret, 'HKDF', false, ['deriveBits']).then(function(key) { + return crypto.subtle.deriveBits({ + name: 'HKDF', hash: 'SHA-256', + salt: encoder.encode('{{NEODROP_CRYPTO_CONTEXT}}'), + info: encoder.encode(info) + }, key, length * 8); + }).then(function(bits) { return new Uint8Array(bits); }); + } + + function importAes(raw) { + return crypto.subtle.importKey('raw', raw, {name: 'AES-GCM'}, false, ['encrypt']); + } + + function setU32(bytes, offset, value) { + new DataView(bytes.buffer).setUint32(offset, value, false); + } + + function setU64(bytes, offset, value) { + new DataView(bytes.buffer).setBigUint64(offset, BigInt(value), false); + } + + function makeAad(type, profile, objectId, size, count, index, length) { + var bytes = new Uint8Array(60); + bytes.set(encoder.encode('NEODRP01')); + bytes[8] = type; + bytes[9] = profile; + bytes.set(objectId, 12); + setU64(bytes, 36, size); + setU32(bytes, 44, CHUNK_SIZE); + setU32(bytes, 48, count); + setU32(bytes, 52, index); + setU32(bytes, 56, length); + return bytes; + } + + function makeIv(type, index) { + var bytes = new Uint8Array(12); + setU32(bytes, 0, type); + setU64(bytes, 4, index); + return bytes; + } + + function encrypt(key, plaintext, nonce, additionalData) { + return crypto.subtle.encrypt({ + name: 'AES-GCM', iv: nonce, additionalData: additionalData, tagLength: 128 + }, key, plaintext); + } + + function typeFor(type, name) { + var value = String(type || '').toLowerCase(); + if (value && value !== 'application/octet-stream') return value; + var match = String(name || '').toLowerCase().match(/\.([a-z0-9]+)$/); + var types = { + png: 'image/png', jpg: 'image/jpeg', jpeg: 'image/jpeg', gif: 'image/gif', + webp: 'image/webp', avif: 'image/avif', flac: 'audio/flac', m4a: 'audio/mp4', + mp3: 'audio/mpeg', oga: 'audio/ogg', ogg: 'audio/ogg', opus: 'audio/opus', + wav: 'audio/wav', wave: 'audio/wav', m4v: 'video/mp4', mkv: 'video/x-matroska', + mov: 'video/quicktime', mp4: 'video/mp4', ogv: 'video/ogg', webm: 'video/webm' + }; + return match && types[match[1]] ? types[match[1]] : 'application/octet-stream'; + } + + function kindFor(type) { + if (/^image\/(png|jpeg|gif|webp|avif)$/i.test(type)) return 'image'; + if (/^audio\//i.test(type)) return 'audio'; + if (/^video\//i.test(type)) return 'video'; + if (/^text\//i.test(type) || /^(application\/(json|javascript|x-.*script))$/i.test(type)) return 'text'; + return 'binary'; + } + + function safeName(name) { + var value = String(name || 'drop.bin').split(/[\\/]/).pop() + .replace(/[\u0000-\u001f\u007f]/g, '').replace(/^\.+|\.+$/g, '').slice(0, 240); + return value || 'drop.bin'; + } + + function request(base, path, options, jsonResponse) { + return fetch(base + path, options).then(function(response) { + if (!response.ok) throw new Error('NeoDrop request failed'); + return jsonResponse ? response.json() : response; + }).catch(function(error) { + if (error && error.name === 'AbortError') throw error; + throw new Error('NeoDrop request failed'); + }); + } + + async function upload(file, options) { + options = options || {}; + if (!file || typeof file.size !== 'number') throw new Error('Select a file.'); + var profile = Number(options.profile); + if (profile !== 0 && profile !== 1) throw new Error('Invalid retention profile.'); + var maximum = profile === 0 ? SMALL_MAX : LARGE_MAX; + if (file.size > maximum) throw new Error('File exceeds the selected profile limit.'); + + var base = String(options.base || ''); + var progress = typeof options.onProgress === 'function' ? options.onProgress : function() {}; + var signal = options.signal; + var secret = crypto.getRandomValues(new Uint8Array(32)); + var objectId; + var objectIdText; + var uploadSession; + var chunks = file.size ? Math.ceil(file.size / CHUNK_SIZE) : 0; + var totalSteps = chunks + 3; + var completed = 0; + + try { + var keys = await Promise.all([ + derive(secret, 'object-id', 24), + derive(secret, 'content-key', 32).then(importAes), + derive(secret, 'metadata-key', 32).then(importAes) + ]); + objectId = keys[0]; + objectIdText = b64url(objectId); + uploadSession = await request(base, '/api/v1/uploads', { + method: 'POST', + headers: {'Content-Type': 'application/json'}, + body: JSON.stringify({ + v: 1, id: objectIdText, profile: profile, size: file.size, + chunkSize: CHUNK_SIZE, chunks: chunks + }), + signal: signal + }, true); + if (!uploadSession || !/^[A-Za-z0-9_-]{22}$/.test(uploadSession.uploadId || '') || + !/^[A-Za-z0-9_-]{43}$/.test(uploadSession.uploadToken || '')) { + throw new Error('NeoDrop request failed'); + } + progress(++completed / totalSteps); + + var authorization = 'Bearer ' + uploadSession.uploadToken; + var hasher = new Sha256(); + for (var index = 0; index < chunks; index++) { + var plaintext = new Uint8Array(await file.slice( + index * CHUNK_SIZE, Math.min(file.size, (index + 1) * CHUNK_SIZE) + ).arrayBuffer()); + hasher.update(plaintext); + var cipher = await encrypt( + keys[1], plaintext, makeIv(1, index), + makeAad(1, profile, objectId, file.size, chunks, index, plaintext.byteLength) + ); + await request(base, '/api/v1/uploads/' + uploadSession.uploadId + '/chunks/' + index, { + method: 'PUT', + headers: {'Content-Type': 'application/octet-stream', 'Authorization': authorization}, + body: cipher, + signal: signal + }, false); + progress(++completed / totalSteps); + } + + var metadataName = safeName(file.name); + var metadataValue = { + v: 1, + name: metadataName, + type: typeFor(file.type, metadataName).slice(0, 255), + size: file.size, + lastModified: Number.isSafeInteger(file.lastModified) ? file.lastModified : null, + sha256: hasher.hex() + }; + var metadata = encoder.encode(JSON.stringify(metadataValue)); + if (metadata.length > 4096) throw new Error('File metadata is too large.'); + var encryptedMetadata = await encrypt( + keys[2], metadata, makeIv(2, 0), + makeAad(0, profile, objectId, file.size, chunks, 0xffffffff, metadata.length) + ); + await request(base, '/api/v1/uploads/' + uploadSession.uploadId + '/metadata', { + method: 'PUT', + headers: {'Content-Type': 'application/octet-stream', 'Authorization': authorization}, + body: encryptedMetadata, + signal: signal + }, false); + progress(++completed / totalSteps); + + var committed = await request(base, '/api/v1/uploads/' + uploadSession.uploadId + '/commit', { + method: 'POST', + headers: {'Content-Type': 'application/json', 'Authorization': authorization}, + body: '{}', + signal: signal + }, true); + if (!committed || !Number.isSafeInteger(committed.expiresAt)) { + throw new Error('NeoDrop request failed'); + } + progress(1); + return { + id: objectIdText, + readUrl: base + '/d/' + objectIdText + '?k=' + kindFor(metadataValue.type) + '#d1.' + b64url(secret), + deleteCapability: objectIdText + '.' + uploadSession.uploadToken, + name: metadataValue.name, + type: metadataValue.type, + size: file.size, + sha256: metadataValue.sha256, + profile: profile, + expiresAt: committed.expiresAt + }; + } finally { + secret.fill(0); + } + } + + return { + CHUNK_SIZE: CHUNK_SIZE, + SMALL_MAX: SMALL_MAX, + LARGE_MAX: LARGE_MAX, + upload: upload + }; +})); diff --git a/files/glowing-bear/neodrop-plugin.js.inc b/files/glowing-bear/neodrop-plugin.js.inc new file mode 100644 index 0000000..861661e --- /dev/null +++ b/files/glowing-bear/neodrop-plugin.js.inc @@ -0,0 +1,27 @@ + function neoDropFrame(url, kind) { + return function() { + var element = this.getElement(); + var frame = document.createElement('iframe'); + frame.src = url.replace('?k=', '?embed=1&k='); + frame.title = 'Encrypted NeoDrop ' + kind + ' preview'; + frame.width = '100%'; + frame.height = kind === 'audio' ? '80' : kind === 'text' ? '420' : '520'; + frame.loading = 'lazy'; + frame.referrerPolicy = 'no-referrer'; + frame.setAttribute('sandbox', 'allow-scripts allow-same-origin allow-downloads'); + frame.setAttribute('frameborder', '0'); + element.replaceChildren(frame); + }; + } + + var neoDropMediaPlugin = new UrlPlugin('NeoDrop media', function(url) { + var match = url.match(/^https:\/\/{{DROPS_HOST_REGEX}}\/d\/([A-Za-z0-9_-]{32})\?k=(image|audio|video)#d1\.([A-Za-z0-9_-]{43})$/); + return match ? neoDropFrame(url, match[2]) : null; + }); + neoDropMediaPlugin.exclusive = true; + + var neoDropTextPlugin = new UrlPlugin('NeoDrop preview', function(url) { + var match = url.match(/^https:\/\/{{DROPS_HOST_REGEX}}\/d\/([A-Za-z0-9_-]{32})\?k=text#d1\.([A-Za-z0-9_-]{43})$/); + return match ? neoDropFrame(url, 'text') : null; + }); + neoDropTextPlugin.exclusive = true; diff --git a/files/glowing-bear/neodrop.js b/files/glowing-bear/neodrop.js new file mode 100644 index 0000000..25fce0b --- /dev/null +++ b/files/glowing-bear/neodrop.js @@ -0,0 +1,62 @@ +(function() { +'use strict'; + +var weechat = angular.module('weechat'); +var neoDropCrypto = require('./neodrop-crypto'); + +weechat.factory('imgur', ['$rootScope', 'settings', function($rootScope, settings) { + var BASE = '{{DROPS_ORIGIN}}'; + + var showErrorMsg = function(message) { + $rootScope.uploadError = true; + $rootScope.uploadErrorMessage = message || 'Encrypted upload failed.'; + if (!$rootScope.$$phase) $rootScope.$apply(); + setTimeout(function() { + $rootScope.uploadError = false; + if (!$rootScope.$$phase) $rootScope.$apply(); + }, 5000); + }; + + var process = function(file, callback) { + if (!file || typeof file.size !== 'number') return; + if (file.size > neoDropCrypto.LARGE_MAX) { + showErrorMsg('NeoDrop files are limited to 1 GiB.'); + return; + } + var profile = (settings.dropProfile === 'large' || file.size > neoDropCrypto.SMALL_MAX) ? 1 : 0; + var progressBars = document.getElementById('imgur-upload-progress'); + var bar = document.createElement('div'); + bar.className = 'imgur-progress-bar'; + progressBars.appendChild(bar); + + neoDropCrypto.upload(file, { + base: BASE, + profile: profile, + onProgress: function(value) { bar.style.width = Math.round(value * 100) + '%'; } + }).then(function(result) { + if (typeof $rootScope.registerNeoDrop === 'function') { + $rootScope.registerNeoDrop(result.readUrl, result.deleteCapability); + } + if (callback) callback(result.readUrl, result.deleteCapability); + }).catch(function(error) { + showErrorMsg(error.message); + }).finally(function() { + setTimeout(function() { if (bar.parentNode) bar.parentNode.removeChild(bar); }, 500); + }); + }; + + var deleteImage = function(capability, callback) { + var split = String(capability || '').split('.'); + if (split.length !== 2) return showErrorMsg('Invalid deletion capability.'); + fetch(BASE + '/api/v1/objects/' + split[0], { + method: 'DELETE', headers: {'Authorization': 'Bearer ' + split[1]} + }).then(function(response) { + if (!response.ok) throw new Error('Unable to delete encrypted file.'); + if (callback) callback(capability); + }).catch(function() { showErrorMsg('Unable to delete encrypted file.'); }); + }; + + return {process: process, deleteImage: deleteImage}; +}]); + +})(); diff --git a/files/glowing-bear/server-manager.html b/files/glowing-bear/server-manager.html new file mode 100644 index 0000000..08d99b4 --- /dev/null +++ b/files/glowing-bear/server-manager.html @@ -0,0 +1,17 @@ +
    +
    + +
    diff --git a/files/glowing-bear/server-manager.js b/files/glowing-bear/server-manager.js new file mode 100644 index 0000000..df7042e --- /dev/null +++ b/files/glowing-bear/server-manager.js @@ -0,0 +1,56 @@ +'use strict'; +(function() { + var weechat = angular.module('weechat'); + var names = 'addresses proxy ipv6 ssl ssl_cert ssl_password ssl_priorities ssl_dhkey_size ssl_fingerprint ssl_verify password capabilities sasl_mechanism sasl_username sasl_password sasl_key sasl_timeout sasl_fail autoconnect autoreconnect autoreconnect_delay nicks nicks_alternate username realname local_hostname usermode command command_delay autojoin autojoin_dynamic autorejoin autorejoin_delay connection_timeout anti_flood_prio_high anti_flood_prio_low away_check away_check_max_nicks msg_kick msg_part msg_quit notify split_msg_max_length charset_message default_chantypes'.split(' '); + var secrets = {ssl_password: true, password: true, sasl_password: true}; + var booleans = {ipv6:true,ssl:true,ssl_verify:true,autoconnect:true,autoreconnect:true,nicks_alternate:true,autojoin_dynamic:true,autorejoin:true}; + + weechat.directive('neoServerManager', ['connection', function(connection) { + return {restrict: 'E', templateUrl: 'directives/server-manager.html', link: function(scope) { + scope.serverManager = {visible:false, loading:false, saving:false, servers:[], selected:null, isNew:false, status:''}; + var manager = scope.serverManager; + function validName(value) { return /^[A-Za-z0-9][A-Za-z0-9_-]{0,31}$/.test(value || ''); } + function safeValue(value) { return typeof value === 'string' && !/[\r\n\0"]/.test(value); } + function optionModel(name, row) { return {name:name, description:row&&row.description||'', value:row&&row.value_is_null?String(row.parent_value||''):String(row&&row.value||''), inherited:Boolean(row&&row.value_is_null), secret:Boolean(secrets[name]), boolean:Boolean(booleans[name]), dirty:false}; } + function refresh() { + manager.loading = true; + return connection.requestInfolist('option', 0, 'irc.server.*.addresses').then(function(rows) { + manager.servers = rows.map(function(row) { return row.full_name.slice(11, -10); }).filter(validName).sort(); + manager.loading = false; + }, function() { manager.loading=false; manager.status='Unable to load server settings.'; }); + } + function select(name) { + manager.isNew = false; manager.loading = true; manager.status = ''; + Promise.all(names.map(function(option) { + if (secrets[option]) return Promise.resolve(optionModel(option, null)); + return connection.requestInfolist('option', 0, 'irc.server.' + name + '.' + option).then(function(rows) { return optionModel(option, rows[0]); }); + })).then(function(options) { scope.$applyAsync(function() { manager.selected={name:name, originalName:name, options:options}; manager.loading=false; }); }); + } + scope.newNeoServer = function() { manager.isNew=true; manager.selected={name:'',originalName:'',options:names.map(function(name){return optionModel(name,null);})}; manager.selected.options[0].inherited=false; manager.status=''; }; + scope.selectNeoServer = select; + scope.closeNeoServerManager = function() { manager.visible=false; manager.selected=null; }; + scope.saveNeoServer = function(connectAfter) { + var server=manager.selected; if(!server||!validName(server.name)){manager.status='Use a safe server name.';return;} + var addresses=server.options[0].value; if(manager.isNew&&!safeValue(addresses)){manager.status='Enter a safe server address.';return;} + manager.saving=true; + if(manager.isNew) connection.sendCoreCommand('/server add '+server.name+' '+addresses); + server.options.forEach(function(option) { + if ((!manager.isNew&&!option.dirty)||(manager.isNew&&option.name==='addresses')||option.secret&&!option.value) return; + if (!safeValue(option.value)){manager.status='Values cannot contain quotes or control characters.';return;} + var full='irc.server.'+server.name+'.'+option.name; + if (option.secret) { + var secureKey='neobear_'+server.name.toLowerCase()+'_'+option.name; + connection.sendCoreCommand('/secure set '+secureKey+' '+option.value); + connection.sendCoreCommand('/set '+full+' "${sec.data.'+secureKey+'}"'); + } else { + connection.sendCoreCommand(option.inherited?'/unset '+full:'/set '+full+' "'+option.value+'"'); + } + }); + connection.sendCoreCommand('/save irc'); + if(connectAfter) connection.sendCoreCommand('/connect '+server.name); + manager.status='Changes sent to WeeChat. Check the core buffer for any rejected setting.'; manager.saving=false; refresh(); + }; + scope.$on('neoServerManagerOpen', function(event, name) { manager.visible=true; refresh().then(function(){ if(name) select(name); else scope.$applyAsync(scope.newNeoServer); }); }); + }}; + }]); +}()); diff --git a/files/glowing-bear/sidebar-resize.js.inc b/files/glowing-bear/sidebar-resize.js.inc new file mode 100644 index 0000000..6d9c492 --- /dev/null +++ b/files/glowing-bear/sidebar-resize.js.inc @@ -0,0 +1,85 @@ + $timeout(function() { + var sidebar = document.getElementById('sidebar'); + if (!sidebar || document.getElementById('sidebar-resizer')) { + return; + } + + var sidebarResizer = document.createElement('div'); + var desktopSidebarMedia = window.matchMedia('(min-width: 969px)'); + var activeSidebarPointer = null; + var workingSidebarWidth = 0; + + sidebarResizer.id = 'sidebar-resizer'; + sidebarResizer.tabIndex = 0; + sidebarResizer.setAttribute('role', 'separator'); + sidebarResizer.setAttribute('aria-orientation', 'vertical'); + sidebarResizer.setAttribute('aria-controls', 'sidebar'); + sidebarResizer.setAttribute('aria-label', 'Resize channel sidebar'); + sidebarResizer.setAttribute('aria-valuemin', '120'); + sidebarResizer.setAttribute('aria-valuemax', '480'); + sidebar.parentNode.insertBefore(sidebarResizer, sidebar.nextSibling); + + var maximumSidebarWidth = function() { + return Math.min(480, window.innerWidth * 0.4); + }; + + var applySidebarWidth = function(value, limitToViewport) { + var width = Number(value); + if (!Number.isFinite(width) || width <= 0) { + return; + } + + width = Math.max(120, Math.min(limitToViewport ? maximumSidebarWidth() : 480, width)); + width = Math.round(width); + document.documentElement.style.setProperty('--neorelay-sidebar-preferred-width', width + 'px'); + sidebarResizer.setAttribute('aria-valuenow', width); + workingSidebarWidth = width; + }; + + applySidebarWidth(settings.neorelaySidebarWidth, false); + + sidebarResizer.addEventListener('pointerdown', function(event) { + if (!desktopSidebarMedia.matches || event.button !== 0) { + return; + } + + activeSidebarPointer = event.pointerId; + workingSidebarWidth = Math.round(sidebar.getBoundingClientRect().width); + sidebarResizer.setPointerCapture(event.pointerId); + document.body.classList.add('neorelay-sidebar-resizing'); + event.preventDefault(); + }); + + sidebarResizer.addEventListener('pointermove', function(event) { + if (event.pointerId === activeSidebarPointer && desktopSidebarMedia.matches) { + applySidebarWidth(event.clientX, true); + } + }); + + var finishSidebarResize = function(event) { + if (event.pointerId !== activeSidebarPointer) { + return; + } + + activeSidebarPointer = null; + document.body.classList.remove('neorelay-sidebar-resizing'); + if (workingSidebarWidth > 0) { + settings.neorelaySidebarWidth = workingSidebarWidth; + } + }; + + sidebarResizer.addEventListener('pointerup', finishSidebarResize); + sidebarResizer.addEventListener('pointercancel', finishSidebarResize); + sidebarResizer.addEventListener('keydown', function(event) { + if (!desktopSidebarMedia.matches || + (event.key !== 'ArrowLeft' && event.key !== 'ArrowRight')) { + return; + } + + var direction = event.key === 'ArrowLeft' ? -1 : 1; + var step = event.shiftKey ? 25 : 10; + applySidebarWidth(sidebar.getBoundingClientRect().width + direction * step, true); + settings.neorelaySidebarWidth = workingSidebarWidth; + event.preventDefault(); + }); + }, 0); diff --git a/files/glowing-bear/weechat-settings.html b/files/glowing-bear/weechat-settings.html new file mode 100644 index 0000000..b304e0c --- /dev/null +++ b/files/glowing-bear/weechat-settings.html @@ -0,0 +1,20 @@ +
    +
    + + + +
    +

    Changes are validated, written to WeeChat, read back, and then saved to the corresponding configuration file.

    +

    +
    +
    +
    + + + + + +
    +
    +
    +
    diff --git a/files/glowing-bear/weechat-settings.js.inc b/files/glowing-bear/weechat-settings.js.inc new file mode 100644 index 0000000..440a598 --- /dev/null +++ b/files/glowing-bear/weechat-settings.js.inc @@ -0,0 +1,150 @@ + var neoBasicColours = ['default','black','darkgray','red','lightred','green','lightgreen','brown','yellow','blue','lightblue','magenta','lightmagenta','cyan','lightcyan','gray','white']; + $scope.neoWeeChatColourChoices = neoBasicColours.concat(Array.from({length: 256}, function(_, index) { return String(index); })); + var neoColourHex = {default:'#f1eaff',black:'#000000',darkgray:'#555555',red:'#aa0000',lightred:'#ff5555',green:'#00aa00',lightgreen:'#55ff55',brown:'#aa5500',yellow:'#ffff55',blue:'#0000aa',lightblue:'#5555ff',magenta:'#aa00aa',lightmagenta:'#ff55ff',cyan:'#00aaaa',lightcyan:'#55ffff',gray:'#aaaaaa',white:'#ffffff'}; + var neoAllowedSections = [ + {label:'WeeChat appearance',mask:'weechat.look.*'}, + {label:'WeeChat colours',mask:'weechat.color.*'}, + {label:'Completion',mask:'weechat.completion.*'}, + {label:'History',mask:'weechat.history.*'}, + {label:'Network',mask:'weechat.network.*'}, + {label:'Plugins',mask:'weechat.plugin.*'}, + {label:'IRC appearance',mask:'irc.look.*'}, + {label:'IRC colours',mask:'irc.color.*'}, + {label:'IRC network',mask:'irc.network.*'} + ]; + var neoAllowedMasks = neoAllowedSections.reduce(function(result, item) { result[item.mask] = true; return result; }, {}); + var neoLoadedOptions = {}; + + function neoResolveWeeChatColour(value) { + value = String(value || 'default').replace(/^[*!/_|]+/, ''); + if (neoColourHex[value]) return neoColourHex[value]; + var number = Number(value); + if (!Number.isInteger(number) || number < 0 || number > 255) return neoColourHex.default; + if (number < 16) return neoColourHex[neoBasicColours[number + 1] || 'default']; + if (number >= 232) { + var gray = 8 + (number - 232) * 10; + return 'rgb(' + gray + ',' + gray + ',' + gray + ')'; + } + number -= 16; + var levels = [0,95,135,175,215,255]; + return 'rgb(' + levels[Math.floor(number / 36)] + ',' + levels[Math.floor(number / 6) % 6] + ',' + levels[number % 6] + ')'; + } + + function neoValidWeeChatColour(value) { + value = String(value || '').replace(/^[*!/_|]+/, ''); + return neoBasicColours.indexOf(value) >= 0 || (/^(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$/.test(value)); + } + + function neoEffectiveOptionValue(row) { + if (!row.value_is_null) return Object.prototype.hasOwnProperty.call(row, 'value') ? String(row.value) : ''; + if (Object.prototype.hasOwnProperty.call(row, 'parent_value')) return String(row.parent_value); + return Object.prototype.hasOwnProperty.call(row, 'default_value') ? String(row.default_value) : ''; + } + + function neoNormalizeOption(row) { + var choices = row.string_values ? String(row.string_values).split('|').filter(Boolean) : []; + var type = String(row.type || 'string'); + var value = neoEffectiveOptionValue(row); + return { + name: String(row.full_name || ''), + configName: String(row.config_name || '').replace(/[^A-Za-z0-9_-]/g, ''), + description: String(row.description_nls || row.description || ''), + type: type, + value: value, + editValue: type === 'integer' && !choices.length && /^-?[0-9]+$/.test(value) ? Number(value) : value, + defaultValue: Object.prototype.hasOwnProperty.call(row, 'default_value') ? String(row.default_value) : '', + min: Number(row.min), + max: Number(row.max), + choices: choices, + saving: false + }; + } + + function neoSafeOption(row) { + return row && /^[A-Za-z0-9_][A-Za-z0-9_.-]{0,511}$/.test(row.name) && + /^(weechat|irc)$/.test(row.configName) && + !/(?:password|passphrase|secret|token)(?:$|[._-])/i.test(row.name); + } + + function neoValidateOption(row, value) { + value = String(value); + if (!neoSafeOption(row) || neoLoadedOptions[row.name] !== row) throw new Error('Setting is not editable.'); + if (value.length > 4096 || /[\u0000-\u001f\u007f-\u009f"\\\u2028\u2029]/.test(value)) throw new Error('Value contains unsupported characters.'); + if (row.type === 'boolean' && !/^(?:on|off)$/.test(value)) throw new Error('Choose On or Off.'); + if (row.choices.length && row.choices.indexOf(value) < 0) throw new Error('Choose a listed value.'); + if (row.type === 'integer' && !row.choices.length) { + if (!/^-?[0-9]+$/.test(value)) throw new Error('Enter an integer.'); + var number = Number(value); + if ((Number.isFinite(row.min) && number < row.min) || (Number.isFinite(row.max) && row.max > row.min && number > row.max)) throw new Error('Integer is outside the allowed range.'); + } + if (row.type === 'color' && !neoValidWeeChatColour(value)) throw new Error('Choose a WeeChat colour.'); + if (row.name === 'irc.color.nick_prefixes') { + var prefixEntries = value.split(';').filter(Boolean); + if (!prefixEntries.length || prefixEntries.some(function(entry) { + var match = entry.match(/^[A-Za-z*]:([*!/_|]*)([^;]+)$/); + return !match || !neoValidWeeChatColour(match[2]); + })) throw new Error('Invalid IRC prefix colour map.'); + } + return value; + } + + function neoRefreshExact(row, expected, success, failure, attempt) { + connection.requestInfolist('option', 0, row.name).then(function(rows) { + var updated = rows[0] ? neoNormalizeOption(rows[0]) : null; + if (updated && (expected === null || updated.value === expected)) { + Object.assign(row, updated); + neoLoadedOptions[row.name] = row; + connection.sendCoreCommand('/save ' + updated.configName); + $scope.$applyAsync(function() { success(row); }); + } else if (attempt < 5) { + $timeout(function() { neoRefreshExact(row, expected, success, failure, attempt + 1); }, 200 * attempt); + } else { + $scope.$applyAsync(function() { failure('WeeChat did not confirm the setting change.'); }); + } + }, function() { $scope.$applyAsync(function() { failure('Unable to verify the setting change.'); }); }); + } + + function neoWriteOption(row, value, success, failure) { + try { value = neoValidateOption(row, value); } + catch (error) { failure(error.message); return; } + connection.sendCoreCommand('/set ' + row.name + ' "' + value + '"'); + $timeout(function() { neoRefreshExact(row, value, success, failure, 1); }, 150); + } + + $scope.neoWeeChatSettings = {sections: neoAllowedSections, section: neoAllowedSections[0].mask, filter: '', options: [], loading: false, status: ''}; + $scope.loadNeoWeeChatSettings = function() { + var state = $scope.neoWeeChatSettings; + if (!$rootScope.connected || state.loading || !neoAllowedMasks[state.section]) return; + state.loading = true; + state.status = 'Loading settings from WeeChat...'; + connection.requestInfolist('option', 0, state.section).then(function(rows) { + $scope.$applyAsync(function() { + state.options = rows.map(neoNormalizeOption).filter(neoSafeOption).sort(function(a, b) { return a.name.localeCompare(b.name); }); + state.options.forEach(function(row) { neoLoadedOptions[row.name] = row; }); + state.loading = false; + state.status = 'Loaded ' + state.options.length + ' editable settings.'; + }); + }, function() { $scope.$applyAsync(function() { state.loading = false; state.status = 'Unable to load settings.'; }); }); + }; + + $scope.saveNeoWeeChatOption = function(row) { + row.saving = true; + neoWriteOption(row, row.editValue, function(updated) { + Object.assign(row, updated); + row.saving = false; + $scope.neoWeeChatSettings.status = 'Saved ' + row.name + '.'; + }, function(message) { row.saving = false; $scope.neoWeeChatSettings.status = message; }); + }; + + $scope.resetNeoWeeChatOption = function(row) { + if (!neoSafeOption(row) || neoLoadedOptions[row.name] !== row) return; + row.saving = true; + connection.sendCoreCommand('/unset ' + row.name); + $timeout(function() { + neoRefreshExact(row, null, function(updated) { + Object.assign(row, updated); + row.saving = false; + $scope.neoWeeChatSettings.status = 'Reset ' + row.name + '.'; + }, function(message) { row.saving = false; $scope.neoWeeChatSettings.status = message; }, 1); + }, 150); + }; diff --git a/files/neodrop-manager/manage.css b/files/neodrop-manager/manage.css new file mode 100644 index 0000000..7725555 --- /dev/null +++ b/files/neodrop-manager/manage.css @@ -0,0 +1,32 @@ +:root { color-scheme: dark; --bg: #09040f; --panel: #170c22; --line: #62377d; --pink: #f45bd2; --cyan: #62e7ee; --text: #f5edf8; --muted: #b9a8c2; } +* { box-sizing: border-box; } +body { margin: 0; min-height: 100vh; background: radial-gradient(circle at 80% 0, #281139, transparent 42%), var(--bg); color: var(--text); font: 16px/1.5 "Atkinson Hyperlegible", monospace; } +main { width: min(1120px, calc(100% - 32px)); margin: 0 auto; padding: 48px 0 72px; } +header { border-left: 4px solid var(--pink); padding-left: 20px; margin-bottom: 36px; } +h1, h2, p { margin-top: 0; } +h1 { margin-bottom: 8px; font-size: clamp(2rem, 6vw, 4rem); letter-spacing: -.04em; } +h1 span { color: var(--pink); } +.kicker { color: var(--cyan); letter-spacing: .16em; font-size: .78rem; } +section { background: color-mix(in srgb, var(--panel) 90%, transparent); border: 1px solid var(--line); padding: 24px; margin-top: 22px; box-shadow: 8px 8px 0 #050208; } +form { display: grid; grid-template-columns: minmax(220px, 1fr) minmax(220px, .6fr) auto; gap: 16px; align-items: end; } +label { display: grid; gap: 7px; color: var(--muted); font-size: .85rem; text-transform: uppercase; letter-spacing: .08em; } +input, select, button { min-height: 44px; border: 1px solid var(--line); background: #0c0612; color: var(--text); padding: 9px 12px; font: inherit; } +button { cursor: pointer; border-color: var(--pink); } +button:hover, button:focus-visible { background: var(--pink); color: #16051a; outline: none; } +button:disabled { opacity: .55; cursor: wait; } +.progress { height: 8px; margin: 20px 0 12px; background: #08030c; border: 1px solid #3d254b; } +.progress span { display: block; width: 0; height: 100%; background: linear-gradient(90deg, var(--pink), var(--cyan)); transition: width .15s; } +#status { margin-bottom: 0; color: var(--cyan); } +#status.error { color: #ff829c; } +#retry { margin-top: 12px; } +.section-heading { display: flex; align-items: center; justify-content: space-between; gap: 16px; } +.table-wrap { overflow-x: auto; } +table { width: 100%; border-collapse: collapse; min-width: 760px; } +th, td { padding: 12px 10px; border-top: 1px solid #3e294a; text-align: left; vertical-align: middle; } +th { color: var(--cyan); font-size: .78rem; text-transform: uppercase; letter-spacing: .09em; } +.actions { display: flex; gap: 8px; } +.actions button { min-height: 36px; padding: 5px 10px; } +.actions .danger { border-color: #ff607f; } +.muted { color: var(--muted); } +.hidden { display: none !important; } +@media (max-width: 760px) { main { width: min(100% - 20px, 1120px); padding-top: 24px; } section { padding: 16px; } form { grid-template-columns: 1fr; } .section-heading { align-items: flex-start; } } diff --git a/files/neodrop-manager/manage.html b/files/neodrop-manager/manage.html new file mode 100644 index 0000000..ab2fc95 --- /dev/null +++ b/files/neodrop-manager/manage.html @@ -0,0 +1,52 @@ + + + + + + + NeoDrop Management + + + +
    +
    +

    {{OPERATOR_LABEL}}

    +

    NeoDrop Management

    +

    Files are encrypted in this browser. The storage service receives ciphertext only.

    +
    + +
    +

    New encrypted drop

    +
    + + + +
    + +

    Ready.

    + +
    + +
    +
    +

    Managed drops

    + +
    + +
    + + + +
    NameTypeSizeExpiresActions
    +
    +
    +
    + + + + diff --git a/files/neodrop-manager/manage.js b/files/neodrop-manager/manage.js new file mode 100644 index 0000000..77b292b --- /dev/null +++ b/files/neodrop-manager/manage.js @@ -0,0 +1,142 @@ +"use strict"; +(function() { + var pendingRegistration = null; + var busy = false; + var $ = function(id) { return document.getElementById(id); }; + + function formatSize(value) { + var units = ["B", "KiB", "MiB", "GiB"]; + var size = Number(value); + var index = 0; + while (size >= 1024 && index < units.length - 1) { size /= 1024; index++; } + return size.toFixed(index ? 1 : 0) + " " + units[index]; + } + + function setStatus(message, error) { + $("status").textContent = message; + $("status").classList.toggle("error", Boolean(error)); + } + + async function api(path, options) { + var response = await fetch(path, Object.assign({cache: "no-store"}, options || {})); + var value; + try { value = await response.json(); } catch (_) { value = null; } + if (!response.ok) throw new Error("Management request failed."); + return value; + } + + async function copyUrl(url) { + await navigator.clipboard.writeText(url); + setStatus("Share URL copied.", false); + } + + function actionButton(label, handler, className) { + var button = document.createElement("button"); + button.type = "button"; + button.textContent = label; + if (className) button.className = className; + button.addEventListener("click", handler); + return button; + } + + function render(rows) { + var body = $("drops"); + body.textContent = ""; + $("empty").classList.toggle("hidden", rows.length !== 0); + rows.forEach(function(row) { + var tr = document.createElement("tr"); + [row.name, row.type || "application/octet-stream", formatSize(row.size), + new Date(row.expiresAt * 1000).toLocaleString()].forEach(function(value) { + var td = document.createElement("td"); + td.textContent = value; + tr.appendChild(td); + }); + var actions = document.createElement("td"); + actions.className = "actions"; + actions.appendChild(actionButton("Copy", function() { copyUrl(row.readUrl).catch(function() { + setStatus("Unable to copy the share URL.", true); + }); })); + actions.appendChild(actionButton("Open", function() { + window.open(row.readUrl, "_blank", "noopener,noreferrer"); + })); + actions.appendChild(actionButton("Delete", async function() { + if (!window.confirm("Permanently delete " + row.name + "?")) return; + try { + await api("/manage/api/v1/drops/" + row.id, {method: "DELETE"}); + await load(); + setStatus("Drop deleted.", false); + } catch (_) { setStatus("Delete failed.", true); } + }, "danger")); + tr.appendChild(actions); + body.appendChild(tr); + }); + } + + async function load() { + var value = await api("/manage/api/v1/list", { + method: "POST", headers: {"Content-Type": "application/json"}, body: "{}" + }); + render(Array.isArray(value.drops) ? value.drops : []); + } + + async function register(result) { + await api("/manage/api/v1/register", { + method: "POST", + headers: {"Content-Type": "application/json"}, + body: JSON.stringify({readUrl: result.readUrl, deleteCapability: result.deleteCapability}) + }); + pendingRegistration = null; + $("retry").classList.add("hidden"); + await load(); + } + + $("upload-form").addEventListener("submit", async function(event) { + event.preventDefault(); + if (busy) return; + var file = $("file").files[0]; + if (!file) return setStatus("Select a file.", true); + busy = true; + $("upload").disabled = true; + $("progress").style.width = "0"; + setStatus("Encrypting and uploading...", false); + try { + var result = await NeoDropCrypto.upload(file, { + base: location.origin, + profile: Number($("profile").value), + onProgress: function(value) { $("progress").style.width = Math.round(value * 100) + "%"; } + }); + pendingRegistration = result; + setStatus("Upload complete. Registering encrypted catalog entry...", false); + try { + await register(result); + $("upload-form").reset(); + setStatus("Encrypted drop uploaded and registered.", false); + } catch (_) { + $("retry").classList.remove("hidden"); + setStatus("Upload succeeded, but catalog registration must be retried in this tab.", true); + } + } catch (error) { + if (error.name !== "AbortError") setStatus(error.message || "Encrypted upload failed.", true); + } finally { + busy = false; + $("upload").disabled = false; + } + }); + + $("retry").addEventListener("click", async function() { + if (!pendingRegistration || busy) return; + busy = true; + try { + await register(pendingRegistration); + setStatus("Catalog registration completed.", false); + } catch (_) { setStatus("Catalog registration failed; retry from this tab.", true); } + finally { busy = false; } + }); + + $("refresh").addEventListener("click", function() { + load().then(function() { setStatus("Managed drops refreshed.", false); }) + .catch(function() { setStatus("Unable to load managed drops.", true); }); + }); + + load().catch(function() { setStatus("Unable to load managed drops.", true); }); +}()); diff --git a/files/neodrop-manager/neodrop_manager_agent.py b/files/neodrop-manager/neodrop_manager_agent.py new file mode 100644 index 0000000..27a4d92 --- /dev/null +++ b/files/neodrop-manager/neodrop_manager_agent.py @@ -0,0 +1,1143 @@ +#!/usr/bin/python3 +import base64 +import grp +import ipaddress +import json +import os +import pwd +import re +import secrets +import socket +import socketserver +import struct +import threading +import time +import urllib.error +import urllib.request +from http.server import BaseHTTPRequestHandler +from pathlib import Path +from urllib.parse import urlsplit + +from cryptography.hazmat.primitives import hashes +from cryptography.hazmat.primitives.ciphers.aead import AESGCM +from cryptography.hazmat.primitives.kdf.hkdf import HKDF + + +BASE_URL = "{{DROPS_ORIGIN}}" +ORIGIN = "{{RELAY_ORIGIN}}" +MANAGEMENT_ORIGIN = "{{DROPS_ORIGIN}}" +SOCKET_PATH = Path("{{MANAGER_CONTROL_SOCKET_PATH}}") +CATALOG_PATH = Path("{{MANAGER_CATALOG_PATH}}") +DOWNLOAD_ROOT = Path("{{MANAGER_DOWNLOAD_ROOT}}") +ASSET_ROOT = Path("/usr/local/share/neodrop-manager") +HTTP_SOCKET_PATH = Path("{{MANAGER_HTTP_SOCKET_PATH}}") +MANAGEMENT_NETWORKS = ( + ipaddress.ip_network("{{MANAGEMENT_CIDR_1}}"), + ipaddress.ip_network("{{MANAGEMENT_CIDR_2}}"), + ipaddress.ip_network("{{MANAGEMENT_CIDR_3}}"), +) +CATALOG_KEY_PATH = Path( + "{{CATALOG_KEY_PATH}}" +) +API_TOKEN_PATH = Path( + "{{MANAGER_API_TOKEN_PATH}}" +) +CHUNK_SIZE = 4 * 1024 * 1024 +TEXT_READ_MAX = 1024 * 1024 +TEXT_EDIT_MAX = 256 * 1024 +TEXT_EDIT_LINES_MAX = 2000 +HKDF_SALT = b"{{NEODROP_CRYPTO_CONTEXT}}" +CATALOG_HEADER = b"NEODROP-CATALOG\x00\x01" +OBJECT_ID_RE = re.compile(r"^[A-Za-z0-9_-]{32}$") +TOKEN_RE = re.compile(r"^[A-Za-z0-9_-]{43}$") +READ_URL_RE = re.compile( + r"^https://{{DROPS_HOST_REGEX}}/d/([A-Za-z0-9_-]{32})" + r"(?:\?k=(image|audio|video|text|binary))?#d1\.([A-Za-z0-9_-]{43})$" +) +PROFILES = {0: 50 * 1024 * 1024, 1: 1024 * 1024 * 1024} +PROTOCOL_PAYLOAD_MAX = 12 * 1024 + + +class ManagerError(Exception): + pass + + +class Response: + def __init__(self, status, body, headers=None): + self.status = status + self.body = body + self.headers = headers or {} + + def json(self): + try: + return json.loads(self.body.decode("utf-8")) + except (UnicodeDecodeError, json.JSONDecodeError) as error: + raise ManagerError("invalid JSON response") from error + + +class HTTPTransport: + def request(self, method, path, body=None, headers=None): + if not path.startswith("/api/v1/") or "?" in path or "#" in path: + raise ManagerError("invalid API path") + request = urllib.request.Request( + BASE_URL + path, data=body, method=method, headers=headers or {} + ) + try: + with urllib.request.urlopen(request, timeout=30) as response: + return Response(response.status, response.read(), dict(response.headers)) + except urllib.error.HTTPError as error: + error.read() + raise ManagerError("NeoDrop request failed (%d)" % error.code) from error + except urllib.error.URLError as error: + raise ManagerError("NeoDrop request unavailable") from error + + +def b64url(data): + return base64.urlsafe_b64encode(data).rstrip(b"=").decode("ascii") + + +def unb64url(value, expected=None): + try: + raw = base64.urlsafe_b64decode(value + "=" * ((4 - len(value) % 4) % 4)) + except (ValueError, TypeError) as error: + raise ManagerError("invalid base64 value") from error + if expected is not None and len(raw) != expected: + raise ManagerError("invalid base64 value") + if b64url(raw) != value: + raise ManagerError("invalid base64 value") + return raw + + +def derive(secret, info, length): + return HKDF( + algorithm=hashes.SHA256(), + length=length, + salt=HKDF_SALT, + info=info.encode("ascii"), + ).derive(secret) + + +def make_aad(record_type, profile, object_id, size, count, index, length): + return ( + b"NEODRP01" + + bytes((record_type, profile, 0, 0)) + + object_id + + struct.pack(">QIIII", size, CHUNK_SIZE, count, index, length) + ) + + +def make_iv(record_type, index): + return struct.pack(">IQ", record_type, index) + + +def is_text_type(content_type): + return bool( + re.match(r"^text/", content_type, re.IGNORECASE) + or re.match( + r"^application/(json|javascript|x-.*script)$", + content_type, + re.IGNORECASE, + ) + ) + + +def content_kind(content_type, name=""): + if re.match(r"^image/(png|jpeg|gif|webp|avif)$", content_type, re.IGNORECASE): + return "image" + if re.match(r"^audio/", content_type, re.IGNORECASE): + return "audio" + if re.match(r"^video/", content_type, re.IGNORECASE): + return "video" + extension = Path(name).suffix.lower() + if extension in (".png", ".jpg", ".jpeg", ".gif", ".webp", ".avif"): + return "image" + if extension in (".flac", ".m4a", ".mp3", ".oga", ".ogg", ".opus", ".wav", ".wave"): + return "audio" + if extension in (".m4v", ".mkv", ".mov", ".mp4", ".ogv", ".webm"): + return "video" + if is_text_type(content_type): + return "text" + return "binary" + + +def safe_filename(value): + name = str(value or "drop.bin").replace("\\", "/").split("/")[-1] + name = "".join(char for char in name if ord(char) >= 32 and ord(char) != 127) + name = name.strip().strip(".")[:240] + return name or "drop.bin" + + +class EncryptedCatalog: + def __init__(self, path, key): + if len(key) != 32: + raise ManagerError("catalog key must be exactly 32 bytes") + self.path = Path(path) + self.key = key + + def load(self): + try: + payload = self.path.read_bytes() + except FileNotFoundError: + return {} + minimum = len(CATALOG_HEADER) + 12 + 16 + if len(payload) < minimum or not payload.startswith(CATALOG_HEADER): + raise ManagerError("invalid encrypted catalog") + nonce_at = len(CATALOG_HEADER) + nonce = payload[nonce_at:nonce_at + 12] + try: + plaintext = AESGCM(self.key).decrypt( + nonce, payload[nonce_at + 12:], CATALOG_HEADER + ) + document = json.loads(plaintext.decode("utf-8")) + except Exception as error: + raise ManagerError("unable to decrypt catalog") from error + if not isinstance(document, dict) or document.get("v") != 1: + raise ManagerError("invalid catalog version") + entries = document.get("entries") + if not isinstance(entries, list): + raise ManagerError("invalid catalog entries") + result = {} + for entry in entries: + if not isinstance(entry, dict) or not OBJECT_ID_RE.fullmatch(entry.get("id", "")): + raise ManagerError("invalid catalog entry") + result[entry["id"]] = entry + return result + + def save(self, entries): + self.path.parent.mkdir(mode=0o700, parents=True, exist_ok=True) + document = {"v": 1, "entries": sorted(entries.values(), key=lambda item: item["id"])} + plaintext = json.dumps( + document, separators=(",", ":"), sort_keys=True, ensure_ascii=True + ).encode("utf-8") + nonce = secrets.token_bytes(12) + payload = CATALOG_HEADER + nonce + AESGCM(self.key).encrypt( + nonce, plaintext, CATALOG_HEADER + ) + temporary = self.path.with_name( + ".%s.%s.tmp" % (self.path.name, secrets.token_hex(8)) + ) + try: + with open(temporary, "xb") as handle: + os.fchmod(handle.fileno(), 0o600) + handle.write(payload) + handle.flush() + os.fsync(handle.fileno()) + os.replace(temporary, self.path) + directory = os.open(self.path.parent, os.O_RDONLY | getattr(os, "O_DIRECTORY", 0)) + try: + os.fsync(directory) + finally: + os.close(directory) + finally: + try: + temporary.unlink() + except FileNotFoundError: + pass + + +class NeoDropManager: + def __init__(self, catalog, api_token, transport=None, download_root=None): + if not api_token or any(ord(char) < 33 or ord(char) > 126 for char in api_token): + raise ManagerError("invalid manager API token") + self.catalog = catalog + self.api_token = api_token + self.transport = transport or HTTPTransport() + self.download_root = Path(download_root or DOWNLOAD_ROOT) + self.edit_session = None + self.lock = threading.RLock() + + def request(self, method, path, body=None, headers=None): + response = self.transport.request(method, path, body=body, headers=headers or {}) + if response.status < 200 or response.status >= 300: + raise ManagerError("NeoDrop request failed (%d)" % response.status) + return response + + def json_request(self, method, path, value=None, headers=None): + body = None + request_headers = dict(headers or {}) + if value is not None: + body = json.dumps(value, separators=(",", ":")).encode("utf-8") + request_headers["Content-Type"] = "application/json" + return self.request(method, path, body, request_headers).json() + + def inventory(self): + value = self.json_request( + "GET", + "/api/v1/manager/objects", + headers={"Authorization": "Bearer " + self.api_token}, + ) + rows = value.get("objects") if isinstance(value, dict) else value + if not isinstance(rows, list): + raise ManagerError("invalid manager inventory") + result = {} + for row in rows: + if not isinstance(row, dict): + raise ManagerError("invalid manager inventory") + object_id = row.get("id") or row.get("objectId") or row.get("object_id") + if not OBJECT_ID_RE.fullmatch(object_id or ""): + raise ManagerError("invalid manager inventory") + result[object_id] = row + return result + + def resolve(self, selector, entries=None): + if not selector or not re.fullmatch(r"[A-Za-z0-9_-]{1,32}", selector): + raise ManagerError("invalid selector") + entries = entries if entries is not None else self.catalog.load() + matches = [entry for object_id, entry in entries.items() if object_id.startswith(selector)] + if not matches: + raise ManagerError("object not found") + if len(matches) != 1: + raise ManagerError("selector is ambiguous") + return matches[0] + + def parse_read_url(self, read_url): + match = READ_URL_RE.fullmatch(read_url) + if not match: + raise ManagerError("invalid NeoDrop read URL") + object_id, _, encoded_secret = match.groups() + secret = unb64url(encoded_secret, 32) + derived_id = derive(secret, "object-id", 24) + if b64url(derived_id) != object_id: + raise ManagerError("read URL identifier mismatch") + return object_id, secret, derived_id + + def manifest_and_metadata(self, read_url): + object_id, secret, object_id_raw = self.parse_read_url(read_url) + manifest = self.json_request("GET", "/api/v1/objects/" + object_id) + try: + version = manifest["v"] + profile = int(manifest["profile"]) + size = int(manifest["size"]) + chunk_size = int(manifest["chunkSize"]) + chunks = int(manifest["chunks"]) + expires_at = int(manifest["expiresAt"]) + metadata_cipher = unb64url(manifest["metadata"]) + except (KeyError, TypeError, ValueError): + raise ManagerError("invalid object manifest") from None + expected_chunks = (size + CHUNK_SIZE - 1) // CHUNK_SIZE if size else 0 + if ( + version != 1 + or profile not in PROFILES + or size < 0 + or size > PROFILES[profile] + or chunk_size != CHUNK_SIZE + or chunks != expected_chunks + or len(metadata_cipher) < 16 + or len(metadata_cipher) > 4112 + ): + raise ManagerError("invalid object manifest") + metadata_length = len(metadata_cipher) - 16 + try: + plaintext = AESGCM(derive(secret, "metadata-key", 32)).decrypt( + make_iv(2, 0), + metadata_cipher, + make_aad( + 0, profile, object_id_raw, size, chunks, 0xFFFFFFFF, metadata_length + ), + ) + metadata = json.loads(plaintext.decode("utf-8")) + except Exception as error: + raise ManagerError("metadata authentication failed") from error + if ( + not isinstance(metadata, dict) + or metadata.get("v") != 1 + or metadata.get("size") != size + or not isinstance(metadata.get("name"), str) + or not isinstance(metadata.get("type"), str) + ): + raise ManagerError("invalid authenticated metadata") + normalized = { + "v": 1, + "profile": profile, + "size": size, + "chunkSize": chunk_size, + "chunks": chunks, + "expiresAt": expires_at, + } + return object_id, secret, object_id_raw, normalized, metadata + + def register(self, read_url, delete_capability): + object_id, _, _, manifest, metadata = self.manifest_and_metadata(read_url) + parts = delete_capability.split(".") + if ( + len(parts) != 2 + or parts[0] != object_id + or not TOKEN_RE.fullmatch(parts[1]) + ): + raise ManagerError("invalid delete capability") + entries = self.catalog.load() + if object_id in entries: + existing = entries[object_id] + if ( + existing.get("read_url") == read_url + and existing.get("delete_capability") == delete_capability + ): + return ["registered %s generation %d" % (object_id, existing["generation"])] + raise ManagerError("object is already registered") + entry = { + "id": object_id, + "read_url": read_url, + "delete_capability": delete_capability, + "metadata": metadata, + "size": manifest["size"], + "profile": manifest["profile"], + "chunks": manifest["chunks"], + "expires_at": manifest["expiresAt"], + "generation": 1, + } + entries[object_id] = entry + self.catalog.save(entries) + return ["registered %s generation 1" % object_id] + + def browser_entry(self, entry): + metadata = entry.get("metadata", {}) + return { + "id": entry["id"], + "name": metadata.get("name", "drop.bin"), + "type": metadata.get("type", "application/octet-stream"), + "size": entry["size"], + "profile": entry["profile"], + "expiresAt": entry["expires_at"], + "readUrl": entry["read_url"], + } + + def browser_list(self): + entries = self.catalog.load() + return [ + self.browser_entry(entry) + for entry in sorted( + entries.values(), key=lambda item: (item["expires_at"], item["id"]) + ) + ] + + def browser_register(self, read_url, delete_capability): + self.register(read_url, delete_capability) + object_id, _, _ = self.parse_read_url(read_url) + return self.browser_entry(self.catalog.load()[object_id]) + + def browser_delete(self, object_id): + if not OBJECT_ID_RE.fullmatch(object_id or ""): + raise ManagerError("invalid object identifier") + self.delete(object_id) + + def list_objects(self): + entries = self.catalog.load() + inventory = self.inventory() + lines = [] + for object_id in sorted(set(entries) | set(inventory)): + if object_id in entries: + entry = entries[object_id] + lines.append( + "%s managed gen=%d size=%d profile=%d name=%s" + % ( + object_id, + entry["generation"], + entry["size"], + entry["profile"], + entry["metadata"]["name"], + ) + ) + else: + row = inventory[object_id] + lines.append( + "%s unmanaged size=%s profile=%s" + % (object_id, row.get("size", "?"), row.get("profile", "?")) + ) + return lines or ["no objects"] + + def show(self, selector): + entry = self.resolve(selector) + metadata = json.dumps( + entry["metadata"], separators=(",", ":"), sort_keys=True, ensure_ascii=True + ) + return [ + "id %s" % entry["id"], + "generation %d" % entry["generation"], + "profile %d" % entry["profile"], + "size %d" % entry["size"], + "chunks %d" % entry["chunks"], + "expires %d" % entry["expires_at"], + "metadata %s" % metadata, + "url %s" % entry["read_url"], + ] + + def prepare_content(self, entry, maximum=None): + object_id, secret, object_id_raw, manifest, metadata = self.manifest_and_metadata( + entry["read_url"] + ) + if object_id != entry["id"]: + raise ManagerError("catalog identifier mismatch") + if maximum is not None and manifest["size"] > maximum: + raise ManagerError("object is too large") + key = AESGCM(derive(secret, "content-key", 32)) + return object_id, object_id_raw, manifest, metadata, key + + def decrypted_chunks(self, prepared): + object_id, object_id_raw, manifest, _, key = prepared + for index in range(manifest["chunks"]): + plain_length = min(CHUNK_SIZE, manifest["size"] - index * CHUNK_SIZE) + cipher = self.request( + "GET", "/api/v1/objects/%s/chunks/%d" % (object_id, index) + ).body + if len(cipher) != plain_length + 16: + raise ManagerError("invalid encrypted chunk length") + try: + plain = key.decrypt( + make_iv(1, index), + cipher, + make_aad( + 1, + manifest["profile"], + object_id_raw, + manifest["size"], + manifest["chunks"], + index, + plain_length, + ), + ) + except Exception as error: + raise ManagerError("content authentication failed") from error + yield plain + + def decrypt_content(self, entry, maximum=None): + prepared = self.prepare_content(entry, maximum) + manifest = prepared[2] + metadata = prepared[3] + parts = list(self.decrypted_chunks(prepared)) + return b"".join(parts), metadata, manifest + + def read_text(self, selector, edit_limit=False): + entry = self.resolve(selector) + maximum = TEXT_EDIT_MAX if edit_limit else TEXT_READ_MAX + content, metadata, _ = self.decrypt_content(entry, maximum) + if not is_text_type(metadata["type"]): + raise ManagerError("object is not text") + try: + text = content.decode("utf-8") + except UnicodeDecodeError as error: + raise ManagerError("text is not valid UTF-8") from error + return entry, text, metadata + + def read_command(self, selector): + _, text, _ = self.read_text(selector) + return text.split("\n") + + def unique_download_path(self, name): + self.download_root.mkdir(mode=0o700, parents=True, exist_ok=True) + safe = safe_filename(name) + candidate = self.download_root / safe + stem = candidate.stem + suffix = candidate.suffix + number = 1 + while candidate.exists(): + candidate = self.download_root / ("%s (%d)%s" % (stem, number, suffix)) + number += 1 + return candidate + + def download(self, selector): + entry = self.resolve(selector) + prepared = self.prepare_content(entry) + metadata = prepared[3] + destination = self.unique_download_path(metadata["name"]) + temporary = destination.with_name(".%s.%s.tmp" % (destination.name, secrets.token_hex(8))) + try: + with open(temporary, "xb") as handle: + os.fchmod(handle.fileno(), 0o600) + for chunk in self.decrypted_chunks(prepared): + handle.write(chunk) + handle.flush() + os.fsync(handle.fileno()) + os.replace(temporary, destination) + finally: + try: + temporary.unlink() + except FileNotFoundError: + pass + return ["downloaded %s" % destination, "url %s" % entry["read_url"]] + + def delete_remote(self, entry): + object_id, token = entry["delete_capability"].split(".", 1) + if object_id != entry["id"] or not TOKEN_RE.fullmatch(token): + raise ManagerError("invalid stored delete capability") + self.json_request( + "DELETE", + "/api/v1/objects/" + object_id, + headers={"Authorization": "Bearer " + token, "Origin": ORIGIN}, + ) + + def delete(self, selector): + entries = self.catalog.load() + entry = self.resolve(selector, entries) + self.delete_remote(entry) + del entries[entry["id"]] + self.catalog.save(entries) + if self.edit_session and self.edit_session["entry"]["id"] == entry["id"]: + self.edit_session = None + return ["deleted %s" % entry["id"]] + + def numbered_context(self, index): + lines = self.edit_session["lines"] + if not lines: + return ["(empty)"] + index = max(0, min(index, len(lines) - 1)) + first = max(0, index - 2) + last = min(len(lines), index + 3) + return ["%4d | %s" % (position + 1, lines[position]) for position in range(first, last)] + + def edit(self, selector): + entry, text, _ = self.read_text(selector, edit_limit=True) + lines = text.split("\n") + trailing_newline = bool(lines and lines[-1] == "") + if trailing_newline: + lines.pop() + if len(lines) > TEXT_EDIT_LINES_MAX: + raise ManagerError("text has too many lines") + self.edit_session = { + "entry": entry, + "lines": lines, + "trailing_newline": trailing_newline, + } + return ["editing %s (%d lines)" % (entry["id"], len(lines))] + self.numbered_context(0) + + def require_edit(self): + if self.edit_session is None: + raise ManagerError("no edit session") + + def mutate_line(self, operation, number, text=None): + self.require_edit() + if number < 1: + raise ManagerError("line number out of range") + lines = self.edit_session["lines"] + original = list(lines) + if operation == "line": + if number > len(lines): + raise ManagerError("line number out of range") + lines[number - 1] = text + focus = number - 1 + elif operation == "insert": + if number > len(lines) + 1: + raise ManagerError("line number out of range") + lines.insert(number - 1, text) + focus = number - 1 + else: + if number > len(lines): + raise ManagerError("line number out of range") + del lines[number - 1] + focus = max(0, number - 2) + if len(lines) > TEXT_EDIT_LINES_MAX: + lines[:] = original + raise ManagerError("text has too many lines") + if len(self.edit_bytes()) > TEXT_EDIT_MAX: + lines[:] = original + raise ManagerError("edited text is too large") + return self.numbered_context(focus) + + def edit_bytes(self): + text = "\n".join(self.edit_session["lines"]) + if self.edit_session["trailing_newline"]: + text += "\n" + return text.encode("utf-8") + + def upload(self, content, metadata, profile, generation): + if profile not in PROFILES or len(content) > PROFILES[profile]: + raise ManagerError("content exceeds profile limit") + secret = secrets.token_bytes(32) + object_id_raw = derive(secret, "object-id", 24) + object_id = b64url(object_id_raw) + chunks = (len(content) + CHUNK_SIZE - 1) // CHUNK_SIZE if content else 0 + session = self.json_request( + "POST", + "/api/v1/uploads", + { + "v": 1, + "id": object_id, + "profile": profile, + "size": len(content), + "chunkSize": CHUNK_SIZE, + "chunks": chunks, + }, + {"Origin": ORIGIN}, + ) + upload_id = session.get("uploadId") if isinstance(session, dict) else None + upload_token = session.get("uploadToken") if isinstance(session, dict) else None + if not re.fullmatch(r"[A-Za-z0-9_-]{22}", upload_id or "") or not TOKEN_RE.fullmatch( + upload_token or "" + ): + raise ManagerError("invalid upload session") + stored_metadata = dict(metadata) + stored_metadata.update({"v": 1, "size": len(content), "name": safe_filename(metadata["name"])}) + stored_metadata["lastModified"] = int(time.time() * 1000) + metadata_plain = json.dumps( + stored_metadata, separators=(",", ":"), ensure_ascii=True + ).encode("utf-8") + if len(metadata_plain) > 4096: + raise ManagerError("metadata is too large") + metadata_cipher = AESGCM(derive(secret, "metadata-key", 32)).encrypt( + make_iv(2, 0), + metadata_plain, + make_aad( + 0, + profile, + object_id_raw, + len(content), + chunks, + 0xFFFFFFFF, + len(metadata_plain), + ), + ) + authorization = "Bearer " + upload_token + binary_headers = { + "Authorization": authorization, + "Content-Type": "application/octet-stream", + "Origin": ORIGIN, + } + self.request( + "PUT", + "/api/v1/uploads/%s/metadata" % upload_id, + metadata_cipher, + binary_headers, + ) + content_key = AESGCM(derive(secret, "content-key", 32)) + for index in range(chunks): + plain = content[index * CHUNK_SIZE:(index + 1) * CHUNK_SIZE] + cipher = content_key.encrypt( + make_iv(1, index), + plain, + make_aad( + 1, + profile, + object_id_raw, + len(content), + chunks, + index, + len(plain), + ), + ) + self.request( + "PUT", + "/api/v1/uploads/%s/chunks/%d" % (upload_id, index), + cipher, + binary_headers, + ) + commit = self.json_request( + "POST", + "/api/v1/uploads/%s/commit" % upload_id, + {}, + {"Authorization": authorization, "Origin": ORIGIN}, + ) + try: + expires_at = int(commit["expiresAt"]) + except (KeyError, TypeError, ValueError): + raise ManagerError("invalid upload commit response") from None + read_url = "%s/d/%s?k=%s#d1.%s" % ( + BASE_URL, + object_id, + content_kind(stored_metadata["type"], stored_metadata["name"]), + b64url(secret), + ) + return { + "id": object_id, + "read_url": read_url, + "delete_capability": object_id + "." + upload_token, + "metadata": stored_metadata, + "size": len(content), + "profile": profile, + "chunks": chunks, + "expires_at": expires_at, + "generation": generation, + } + + def save_edit(self): + self.require_edit() + old_entry = self.edit_session["entry"] + content = self.edit_bytes() + new_entry = self.upload( + content, + old_entry["metadata"], + old_entry["profile"], + old_entry["generation"] + 1, + ) + entries = self.catalog.load() + current = entries.get(old_entry["id"]) + if current is None or current.get("generation") != old_entry["generation"]: + raise ManagerError("catalog changed during edit") + del entries[old_entry["id"]] + entries[new_entry["id"]] = new_entry + self.catalog.save(entries) + self.edit_session = None + lines = [ + "saved %s generation %d" % (new_entry["id"], new_entry["generation"]), + "url %s" % new_entry["read_url"], + ] + try: + self.delete_remote(old_entry) + except ManagerError: + lines.append("warning old object deletion failed") + return lines + + def put_text(self, name, text): + content = text.encode("utf-8") + if len(content) > TEXT_EDIT_MAX: + raise ManagerError("text is too large") + entry = self.upload( + content, + {"v": 1, "name": safe_filename(name), "type": "text/plain", "size": len(content)}, + 0, + 1, + ) + entries = self.catalog.load() + entries[entry["id"]] = entry + self.catalog.save(entries) + return [ + "created %s generation 1" % entry["id"], + "url %s" % entry["read_url"], + ] + + def cancel_edit(self): + self.require_edit() + self.edit_session = None + return ["edit cancelled"] + + def handle_command(self, command): + with self.lock: + command = command.rstrip("\r") + if command == "help": + return [ + "help | status | list | register READ_URL DELETE_CAPABILITY", + "put-text NAME TEXT", + "show SELECTOR | read SELECTOR | download SELECTOR | delete SELECTOR", + "edit SELECTOR | line N TEXT | insert N TEXT | delete-line N | save | cancel", + ] + if command == "status": + return [ + "catalog=%d inventory=%d edit=%s" + % ( + len(self.catalog.load()), + len(self.inventory()), + "active" if self.edit_session else "none", + ) + ] + if command == "list": + return self.list_objects() + match = re.fullmatch(r"register\s+(\S+)\s+(\S+)", command) + if match: + return self.register(match.group(1), match.group(2)) + match = re.fullmatch(r"put-text\s+(\S+)\s+(.*)", command) + if match: + return self.put_text(match.group(1), match.group(2)) + match = re.fullmatch(r"(show|read|download|delete|edit)\s+(\S+)", command) + if match: + action, selector = match.groups() + return { + "show": self.show, + "read": self.read_command, + "download": self.download, + "delete": self.delete, + "edit": self.edit, + }[action](selector) + match = re.fullmatch(r"(line|insert)\s+(\d+)\s(.*)", command) + if match: + return self.mutate_line(match.group(1), int(match.group(2)), match.group(3)) + match = re.fullmatch(r"delete-line\s+(\d+)", command) + if match: + return self.mutate_line("delete-line", int(match.group(1))) + if command == "save": + return self.save_edit() + if command == "cancel": + return self.cancel_edit() + raise ManagerError("unknown command; use help") + + +def protocol_text(value): + return str(value).replace("\x00", "").replace("\r", " ").replace("\n", " ") + + +def protocol_records(record_type, value): + if record_type not in ("LINE", "ERROR"): + raise ValueError("invalid protocol record type") + payload = protocol_text(value).encode("utf-8") + prefix = (record_type + "\t").encode("ascii") + if not payload: + yield prefix + b"\n" + return + while payload: + cut = min(PROTOCOL_PAYLOAD_MAX, len(payload)) + if cut < len(payload): + while cut > 0 and payload[cut] & 0xC0 == 0x80: + cut -= 1 + yield prefix + payload[:cut] + b"\n" + payload = payload[cut:] + + +def handle_client(client, manager): + buffer = b"" + try: + while True: + data = client.recv(4096) + if not data: + return + buffer += data + if len(buffer) > 1024 * 1024: + raise ManagerError("command is too large") + while b"\n" in buffer: + line, buffer = buffer.split(b"\n", 1) + try: + text = line.decode("utf-8") + prefix, command = text.split("\t", 1) + if prefix != "COMMAND": + raise ManagerError("expected COMMAND record") + for output in manager.handle_command(command): + for record in protocol_records("LINE", output): + client.sendall(record) + except (ManagerError, UnicodeDecodeError, ValueError) as error: + for record in protocol_records("ERROR", protocol_text(error)[:300]): + client.sendall(record) + except (ManagerError, OSError): + pass + finally: + client.close() + + +class ManagementHandler(BaseHTTPRequestHandler): + protocol_version = "HTTP/1.1" + server_version = "NeoDrop-Manager" + sys_version = "" + + def log_message(self, fmt, *args): + # Request bodies contain capabilities; keep this endpoint deliberately quiet. + return + + def client_ip(self): + try: + return ipaddress.ip_address(self.headers.get("X-Real-IP", "")) + except ValueError: + return None + + def source_allowed(self): + if not self.server.peer_allowed(self.connection): + return False + address = self.client_ip() + return ( + self.headers.get("Host") == "{{DROPS_HOST}}" + and address is not None + and any(address in network for network in MANAGEMENT_NETWORKS) + ) + + def api_allowed(self): + return self.source_allowed() and self.headers.get("Origin") == MANAGEMENT_ORIGIN + + def send_body(self, status, content_type, body): + self.send_response(status) + self.send_header("Content-Type", content_type) + self.send_header("Content-Length", str(len(body))) + self.send_header("Cache-Control", "private, no-store, max-age=0") + self.send_header("Pragma", "no-cache") + self.send_header("Referrer-Policy", "no-referrer") + self.send_header("X-Content-Type-Options", "nosniff") + self.send_header("X-Frame-Options", "DENY") + self.send_header( + "Content-Security-Policy", + "default-src 'none'; script-src 'self'; style-src 'self'; " + "connect-src 'self'; frame-ancestors 'none'; " + "base-uri 'none'; form-action 'none'", + ) + self.end_headers() + if self.command != "HEAD": + self.wfile.write(body) + + def send_json(self, status, value): + body = json.dumps(value, separators=(",", ":"), ensure_ascii=True).encode("utf-8") + b"\n" + self.send_body(status, "application/json", body) + + def discard_request_body(self): + try: + length = int(self.headers.get("Content-Length", "0")) + except ValueError: + return + if 0 < length <= 4096: + self.rfile.read(length) + + def forbidden(self): + self.discard_request_body() + self.close_connection = True + self.send_json(403, {"error": "forbidden"}) + + def unavailable(self): + self.discard_request_body() + self.close_connection = True + self.send_json(404, {"error": "unavailable"}) + + def read_api_json(self, maximum): + if self.headers.get("Content-Type") != "application/json": + self.discard_request_body() + self.close_connection = True + return None + try: + length = int(self.headers.get("Content-Length", "-1")) + except ValueError: + self.close_connection = True + return None + if length < 0 or length > maximum: + self.discard_request_body() + self.close_connection = True + return None + try: + return json.loads(self.rfile.read(length).decode("utf-8")) + except (UnicodeDecodeError, json.JSONDecodeError): + self.close_connection = True + return None + + def static_asset(self, path): + assets = { + "/manage/": ("manage.html", "text/html; charset=utf-8"), + "/manage/style.css": ("manage.css", "text/css; charset=utf-8"), + "/manage/manage.js": ("manage.js", "application/javascript"), + "/manage/neodrop-crypto.js": ("neodrop-crypto.js", "application/javascript"), + } + asset = assets.get(path) + if not asset: + return self.unavailable() + try: + body = (ASSET_ROOT / asset[0]).read_bytes() + except OSError: + return self.unavailable() + self.send_body(200, asset[1], body) + + def do_HEAD(self): + return self.do_GET() + + def do_GET(self): + parsed = urlsplit(self.path) + if self.path != parsed.path or not self.source_allowed(): + return self.forbidden() + return self.static_asset(parsed.path) + + def do_POST(self): + parsed = urlsplit(self.path) + if self.path != parsed.path or not self.api_allowed(): + return self.forbidden() + if parsed.path == "/manage/api/v1/list": + data = self.read_api_json(64) + if data != {}: + return self.send_json(400, {"error": "invalid request"}) + try: + with self.server.manager.lock: + rows = self.server.manager.browser_list() + except ManagerError: + return self.send_json(503, {"error": "unavailable"}) + return self.send_json(200, {"drops": rows}) + if parsed.path == "/manage/api/v1/register": + data = self.read_api_json(2048) + if not isinstance(data, dict) or set(data) != {"readUrl", "deleteCapability"}: + return self.send_json(400, {"error": "invalid request"}) + if not isinstance(data["readUrl"], str) or not isinstance(data["deleteCapability"], str): + return self.send_json(400, {"error": "invalid request"}) + try: + with self.server.manager.lock: + row = self.server.manager.browser_register( + data["readUrl"], data["deleteCapability"] + ) + except ManagerError: + return self.send_json(400, {"error": "invalid request"}) + return self.send_json(201, {"drop": row}) + return self.unavailable() + + def do_DELETE(self): + parsed = urlsplit(self.path) + match = re.fullmatch(r"/manage/api/v1/drops/([A-Za-z0-9_-]{32})", parsed.path) + if self.path != parsed.path or not self.api_allowed(): + return self.forbidden() + if not match or self.headers.get("Content-Length", "0") != "0": + return self.unavailable() + try: + with self.server.manager.lock: + self.server.manager.browser_delete(match.group(1)) + except ManagerError: + return self.send_json(404, {"error": "unavailable"}) + self.send_json(200, {"deleted": True}) + + def reject_method(self): + parsed = urlsplit(self.path) + if self.path != parsed.path or not self.api_allowed(): + return self.forbidden() + return self.unavailable() + + do_OPTIONS = reject_method + do_PATCH = reject_method + do_PUT = reject_method + + +def linux_peer_uid(connection): + option = getattr(socket, "SO_PEERCRED", None) + if option is None: + raise OSError("SO_PEERCRED is unavailable") + credentials = connection.getsockopt( + socket.SOL_SOCKET, option, struct.calcsize("3i") + ) + _, uid, _ = struct.unpack("3i", credentials) + return uid + + +class ManagementHTTPServer(socketserver.ThreadingMixIn, socketserver.UnixStreamServer): + daemon_threads = True + request_queue_size = 32 + + def __init__(self, address, manager, expected_peer_uid, peer_uid=linux_peer_uid): + super().__init__(address, ManagementHandler) + self.manager = manager + self.expected_peer_uid = expected_peer_uid + self.peer_uid = peer_uid + + def peer_allowed(self, connection): + try: + return self.peer_uid(connection) == self.expected_peer_uid + except (OSError, struct.error, ValueError): + return False + + +def load_credentials(): + key = CATALOG_KEY_PATH.read_bytes() + if len(key) != 32: + raise ManagerError("catalog key credential must be exactly 32 raw bytes") + try: + token = API_TOKEN_PATH.read_bytes().strip().decode("ascii") + except UnicodeDecodeError as error: + raise ManagerError("invalid manager API token credential") from error + return key, token + + +def socket_server(manager): + SOCKET_PATH.parent.mkdir(mode=0o750, parents=True, exist_ok=True) + try: + SOCKET_PATH.unlink() + except FileNotFoundError: + pass + server = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) + server.bind(str(SOCKET_PATH)) + os.chmod(SOCKET_PATH, 0o660) + os.chown(SOCKET_PATH, -1, grp.getgrnam("neodrop-control").gr_gid) + server.listen(8) + while True: + client, _ = server.accept() + threading.Thread(target=handle_client, args=(client, manager), daemon=True).start() + + +def main(): + os.umask(0o077) + key, api_token = load_credentials() + manager = NeoDropManager(EncryptedCatalog(CATALOG_PATH, key), api_token) + try: + HTTP_SOCKET_PATH.unlink() + except FileNotFoundError: + pass + nginx_uid = pwd.getpwnam("www-data").pw_uid + http_server = ManagementHTTPServer( + str(HTTP_SOCKET_PATH), manager, expected_peer_uid=nginx_uid + ) + os.chmod(HTTP_SOCKET_PATH, 0o660) + threading.Thread(target=http_server.serve_forever, daemon=True).start() + socket_server(manager) + + +if __name__ == "__main__": + main() diff --git a/files/neodrop-manager/neodrop_manager_plugin.c b/files/neodrop-manager/neodrop_manager_plugin.c new file mode 100644 index 0000000..296e722 --- /dev/null +++ b/files/neodrop-manager/neodrop_manager_plugin.c @@ -0,0 +1,327 @@ +#include +#include +#include +#include +#include +#include +#include + +WEECHAT_PLUGIN_NAME("neodrop_manager") +WEECHAT_PLUGIN_DESCRIPTION("NeoDrop manager control buffer") +WEECHAT_PLUGIN_AUTHOR("{{PRODUCT_NAME}}") +WEECHAT_PLUGIN_VERSION("1.1") +WEECHAT_PLUGIN_LICENSE("GPL3") + +#define CONTROL_SOCKET "{{MANAGER_CONTROL_SOCKET_PATH}}" +#define SEND_LIMIT 8192U +#define RECEIVE_LIMIT 16384U + +#ifndef MSG_NOSIGNAL +#define MSG_NOSIGNAL 0 +#endif + +struct t_weechat_plugin *weechat_plugin; +static struct t_gui_buffer *manager_buffer; +static struct t_hook *manager_fd_hook; +static int manager_fd = -1; +static char receive_buffer[RECEIVE_LIMIT]; +static size_t receive_length; + +static void print_error(const char *message) +{ + if (manager_buffer != NULL) + weechat_printf(manager_buffer, "%s%s", weechat_color("lightred"), message); +} + +static void disconnect_manager(int announce) +{ + int was_connected = manager_fd >= 0; + + if (manager_fd_hook != NULL) { + weechat_unhook(manager_fd_hook); + manager_fd_hook = NULL; + } + if (manager_fd >= 0) + close(manager_fd); + manager_fd = -1; + receive_length = 0; + + if (announce && was_connected) + print_error("NeoDrop manager disconnected; reconnecting in the background."); +} + +static void print_protocol_line(const char *line, size_t length) +{ + const char *payload; + const char *color = NULL; + size_t payload_length; + size_t index; + char output[RECEIVE_LIMIT]; + + if (manager_buffer == NULL) + return; + + if (length > 0 && line[length - 1] == '\r') + length--; + + if (length >= 5 && memcmp(line, "LINE\t", 5) == 0) { + payload = line + 5; + payload_length = length - 5; + } else if (length >= 6 && memcmp(line, "ERROR\t", 6) == 0) { + payload = line + 6; + payload_length = length - 6; + color = "lightred"; + } else { + print_error("NeoDrop manager sent an invalid response."); + return; + } + + for (index = 0; index < payload_length; index++) { + unsigned char byte = (unsigned char)payload[index]; + output[index] = (byte < 0x20U || byte == 0x7fU) ? ' ' : (char)byte; + } + output[payload_length] = '\0'; + + if (color != NULL) + weechat_printf(manager_buffer, "%s%s", weechat_color(color), output); + else + weechat_printf(manager_buffer, "%s", output); +} + +static int manager_read_cb(const void *pointer, void *data, int fd) +{ + ssize_t count; + size_t consumed = 0; + char *newline; + + (void)pointer; + (void)data; + (void)fd; + + if (receive_length >= RECEIVE_LIMIT - 1U) { + print_error("NeoDrop manager response exceeded the line limit."); + disconnect_manager(0); + return WEECHAT_RC_OK; + } + + count = recv(manager_fd, receive_buffer + receive_length, + RECEIVE_LIMIT - receive_length - 1U, 0); + if (count < 0 && errno == EINTR) + return WEECHAT_RC_OK; + if (count <= 0) { + disconnect_manager(1); + return WEECHAT_RC_OK; + } + receive_length += (size_t)count; + + while (consumed < receive_length) { + size_t available = receive_length - consumed; + + newline = memchr(receive_buffer + consumed, '\n', available); + if (newline == NULL) + break; + print_protocol_line(receive_buffer + consumed, + (size_t)(newline - (receive_buffer + consumed))); + consumed = (size_t)(newline - receive_buffer) + 1U; + } + + if (consumed > 0) { + receive_length -= consumed; + memmove(receive_buffer, receive_buffer + consumed, receive_length); + } + if (receive_length >= RECEIVE_LIMIT - 1U) { + print_error("NeoDrop manager response exceeded the line limit."); + disconnect_manager(0); + } + return WEECHAT_RC_OK; +} + +static int connect_manager(void) +{ + struct sockaddr_un address; + int fd; + + if (manager_fd >= 0) + return 1; + + fd = socket(AF_UNIX, SOCK_STREAM, 0); + if (fd < 0) + return 0; + +#ifdef SO_NOSIGPIPE + { + int enabled = 1; + + if (setsockopt(fd, SOL_SOCKET, SO_NOSIGPIPE, &enabled, sizeof(enabled)) != 0) { + close(fd); + return 0; + } + } +#endif + + memset(&address, 0, sizeof(address)); + address.sun_family = AF_UNIX; + memcpy(address.sun_path, CONTROL_SOCKET, sizeof(CONTROL_SOCKET)); + if (connect(fd, (struct sockaddr *)&address, sizeof(address)) != 0) { + close(fd); + return 0; + } + + manager_fd = fd; + manager_fd_hook = weechat_hook_fd(manager_fd, 1, 0, 0, + &manager_read_cb, NULL, NULL); + if (manager_fd_hook == NULL) { + disconnect_manager(0); + return 0; + } + return 1; +} + +static void send_command(const char *command) +{ + static const char prefix[] = "COMMAND\t"; + char message[SEND_LIMIT]; + size_t command_length; + size_t message_length; + size_t sent = 0; + + if (command == NULL || command[0] == '\0') + return; + + command_length = strlen(command); + if (command_length > SEND_LIMIT - sizeof("COMMAND\t\n")) { + print_error("NeoDrop manager command exceeded the line limit."); + return; + } + if (strpbrk(command, "\t\r\n") != NULL) { + print_error("NeoDrop manager commands cannot contain tabs or newlines."); + return; + } + if (!connect_manager()) { + print_error("Unable to connect to the NeoDrop manager."); + return; + } + + memcpy(message, prefix, sizeof(prefix) - 1U); + memcpy(message + sizeof(prefix) - 1U, command, command_length); + message_length = sizeof(prefix) - 1U + command_length; + message[message_length++] = '\n'; + + while (sent < message_length) { + ssize_t count = send(manager_fd, message + sent, message_length - sent, + MSG_NOSIGNAL); + + if (count < 0 && errno == EINTR) + continue; + if (count <= 0) { + disconnect_manager(1); + return; + } + sent += (size_t)count; + } +} + +static int reconnect_cb(const void *pointer, void *data, int remaining_calls) +{ + (void)pointer; + (void)data; + (void)remaining_calls; + (void)connect_manager(); + return WEECHAT_RC_OK; +} + +static int input_cb(const void *pointer, void *data, struct t_gui_buffer *buffer, + const char *input) +{ + (void)pointer; + (void)data; + (void)buffer; + send_command(input); + return WEECHAT_RC_OK; +} + +static int close_cb(const void *pointer, void *data, struct t_gui_buffer *buffer) +{ + (void)pointer; + (void)data; + (void)buffer; + manager_buffer = NULL; + return WEECHAT_RC_OK; +} + +static int ensure_buffer(void) +{ + if (manager_buffer == NULL) + manager_buffer = weechat_buffer_search("neodrop_manager", "control"); + if (manager_buffer == NULL) { + manager_buffer = weechat_buffer_new("control", &input_cb, NULL, NULL, + &close_cb, NULL, NULL); + if (manager_buffer == NULL) + return 0; + } + weechat_buffer_set_pointer(manager_buffer, "input_callback", &input_cb); + weechat_buffer_set_pointer(manager_buffer, "close_callback", &close_cb); + weechat_buffer_set(manager_buffer, "short_name", "NeoDrop"); + weechat_buffer_set(manager_buffer, "title", + "NeoDrop | list | put-text NAME TEXT | show/read/download/delete ID | edit ID | help"); + weechat_buffer_set(manager_buffer, "hidden", "0"); + weechat_buffer_set(manager_buffer, "notify", "3"); + weechat_buffer_set(manager_buffer, "localvar_set_no_log", "1"); + weechat_buffer_set(manager_buffer, "localvar_set_pinned", "true"); + weechat_buffer_set(manager_buffer, "localvar_set_type", "other"); + return 1; +} + +static int command_cb(const void *pointer, void *data, struct t_gui_buffer *buffer, + int argc, char **argv, char **argv_eol) +{ + const char *command = NULL; + int background_registration; + + (void)pointer; + (void)data; + (void)buffer; + (void)argv; + + if (argc > 1 && argv_eol != NULL && argv_eol[1] != NULL && argv_eol[1][0] != '\0') + command = argv_eol[1]; + background_registration = command != NULL && strncmp(command, "register ", 9) == 0; + + if (!ensure_buffer()) + return WEECHAT_RC_ERROR; + + if (!background_registration) + weechat_buffer_set(manager_buffer, "display", "1"); + if (command != NULL) + send_command(command); + else + send_command("list"); + return WEECHAT_RC_OK; +} + +int weechat_plugin_init(struct t_weechat_plugin *plugin, int argc, char *argv[]) +{ + (void)argc; + (void)argv; + weechat_plugin = plugin; + + if (!ensure_buffer()) + return WEECHAT_RC_ERROR; + + if (weechat_hook_command("drops", "open/control NeoDrop manager", + "list || status || help || put-text || show || read || download || delete || edit || line || insert || delete-line || save || cancel", + "Manage encrypted NeoDrop files and text revisions", + "list|status|help|put-text|show|read|download|delete|edit|line|insert|delete-line|save|cancel", + &command_cb, NULL, NULL) == NULL) + return WEECHAT_RC_ERROR; + if (weechat_hook_timer(5000, 0, 0, &reconnect_cb, NULL, NULL) == NULL) + return WEECHAT_RC_ERROR; + return WEECHAT_RC_OK; +} + +int weechat_plugin_end(struct t_weechat_plugin *plugin) +{ + (void)plugin; + disconnect_manager(0); + return WEECHAT_RC_OK; +} diff --git a/files/neodrop/app.js b/files/neodrop/app.js new file mode 100644 index 0000000..d73da19 --- /dev/null +++ b/files/neodrop/app.js @@ -0,0 +1,88 @@ +"use strict"; +(function () { + const CHUNK_SIZE = 4 * 1024 * 1024; + const PREVIEW_MAX = 50 * 1024 * 1024; + const enc = new TextEncoder(); + const dec = new TextDecoder("utf-8", {fatal:true}); + const state = {secret:null, objectId:null, manifest:null, metadata:null, chunks:null, url:null}; + const $ = id => document.getElementById(id); + const show = id => ["idle","loading","viewer","error"].forEach(x => $(x).classList.toggle("hidden", x !== id)); + const progress = value => $("meter-fill").style.width = Math.round(value * 100) + "%"; + const from64 = value => { const s=value.replace(/-/g,"+").replace(/_/g,"/"); const raw=atob(s+"=".repeat((4-s.length%4)%4)); return Uint8Array.from(raw,c=>c.charCodeAt(0)); }; + const to64 = bytes => btoa(String.fromCharCode(...bytes)).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,""); + const u32 = (v,b,o) => new DataView(b.buffer).setUint32(o,v,false); + const u64 = (v,b,o) => new DataView(b.buffer).setBigUint64(o,BigInt(v),false); + function aad(type, profile, id, size, count, index, length) { + const out=new Uint8Array(60); out.set(enc.encode("NEODRP01")); out[8]=type; out[9]=profile; out.set(id,12); + u64(size,out,36); u32(CHUNK_SIZE,out,44); u32(count,out,48); u32(index,out,52); u32(length,out,56); return out; + } + function iv(type,index) { const out=new Uint8Array(12); u32(type,out,0); u64(index,out,4); return out; } + async function derive(secret, info, length) { + const base=await crypto.subtle.importKey("raw",secret,"HKDF",false,["deriveBits"]); + return new Uint8Array(await crypto.subtle.deriveBits({name:"HKDF",hash:"SHA-256",salt:enc.encode("{{NEODROP_CRYPTO_CONTEXT}}"),info:enc.encode(info)},base,length*8)); + } + async function aes(raw) { return crypto.subtle.importKey("raw",raw,{name:"AES-GCM"},false,["decrypt"]); } + async function decryptRecord(key, cipher, nonce, additional) { return new Uint8Array(await crypto.subtle.decrypt({name:"AES-GCM",iv:nonce,additionalData:additional,tagLength:128},key,cipher)); } + async function fetchJson(url) { const response=await fetch(url,{cache:"no-store"}); if(!response.ok) throw new Error("unavailable"); return response.json(); } + function typeFor(type,name) { const value=String(type||"").toLowerCase(); if(value&&value!=="application/octet-stream")return value; const match=String(name||"").toLowerCase().match(/\.([a-z0-9]+)$/); const types={png:"image/png",jpg:"image/jpeg",jpeg:"image/jpeg",gif:"image/gif",webp:"image/webp",avif:"image/avif",flac:"audio/flac",m4a:"audio/mp4",mp3:"audio/mpeg",oga:"audio/ogg",ogg:"audio/ogg",opus:"audio/opus",wav:"audio/wav",wave:"audio/wav",m4v:"video/mp4",mkv:"video/x-matroska",mov:"video/quicktime",mp4:"video/mp4",ogv:"video/ogg",webm:"video/webm"}; return match&&types[match[1]]?types[match[1]]:"application/octet-stream"; } + function classify(type,name) { type=typeFor(type,name); if(/^image\/(png|jpeg|gif|webp|avif)$/i.test(type)) return "image"; if(/^audio\//i.test(type)) return "audio"; if(/^video\//i.test(type)) return "video"; if(/^text\//i.test(type)||/^(application\/(json|javascript|x-.*script))$/i.test(type)) return "text"; return "binary"; } + function formatSize(size) { const units=["B","KiB","MiB","GiB"]; let i=0,n=size; while(n>=1024&&i<3){n/=1024;i++;} return n.toFixed(i?1:0)+" "+units[i]; } + async function decryptChunk(index, key) { + const response=await fetch(`/api/v1/objects/${state.objectId}/chunks/${index}`,{cache:"no-store"}); if(!response.ok) throw new Error("unavailable"); + const cipher=new Uint8Array(await response.arrayBuffer()); const plainLength=Math.min(CHUNK_SIZE,state.manifest.size-index*CHUNK_SIZE); + if(cipher.length!==plainLength+16) throw new Error("invalid length"); + return decryptRecord(key,cipher,iv(1,index),aad(1,state.manifest.profile,from64(state.objectId),state.manifest.size,state.manifest.chunks,index,plainLength)); + } + async function allChunks(key) { const parts=[]; for(let i=0;i{ const span=document.createElement("span"); if(/^```/.test(line)){fenced=!fenced;span.className="code";} else if(fenced||/^ {4}/.test(line))span.className="code"; else if(/^#{1,6}\s/.test(line))span.className="heading"; else if(/^>\s?/.test(line))span.className="quote"; else if(/^\s*([-*+] |\d+\. )/.test(line))span.className="list"; span.textContent=line+(i{const a=document.createElement("a");a.href=URL.createObjectURL(blob);a.download=state.metadata.name||"download.bin";a.click();setTimeout(()=>URL.revokeObjectURL(a.href),30000);}; + } + async function downloadLarge(key) { + try { + if(window.showSaveFilePicker){ + const handle=await window.showSaveFilePicker({suggestedName:state.metadata.name||"download.bin"}); const writable=await handle.createWritable(); + try { for(let i=0;iURL.revokeObjectURL(a.href),30000); + } + } catch(error) { if(error.name!=="AbortError")show("error"); } + } + function renderDownloadOnly(key) { + const preview=$("preview"); preview.textContent=""; const p=document.createElement("p"); p.textContent="Encrypted binary object. Decryption starts only when you choose Download."; preview.appendChild(p); + setDetails(); show("viewer"); $("download").onclick=()=>downloadLarge(key); + } + async function load() { + try { + if(new URLSearchParams(location.search).get("embed")==="1")document.body.classList.add("embed"); + const match=location.pathname.match(/^\/d\/([A-Za-z0-9_-]{32})$/); const fragment=location.hash.match(/^#d1\.([A-Za-z0-9_-]{43})$/); if(!match||!fragment)return; + show("loading"); state.url=location.href; state.objectId=match[1]; state.secret=from64(fragment[1]); history.replaceState(null,"",location.pathname+location.search); + const derivedId=await derive(state.secret,"object-id",24); if(to64(derivedId)!==state.objectId)throw new Error("identifier mismatch"); + state.manifest=await fetchJson(`/api/v1/objects/${state.objectId}`); if(state.manifest.v!==1||state.manifest.chunkSize!==CHUNK_SIZE)throw new Error("manifest"); + const metaKey=await aes(await derive(state.secret,"metadata-key",32)); const metaCipher=from64(state.manifest.metadata); const metaLength=metaCipher.length-16; + const plain=await decryptRecord(metaKey,metaCipher,iv(2,0),aad(0,state.manifest.profile,derivedId,state.manifest.size,state.manifest.chunks,0xffffffff,metaLength)); state.metadata=JSON.parse(dec.decode(plain)); + if(state.metadata.v!==1||state.metadata.size!==state.manifest.size||(state.metadata.sha256!==undefined&&!/^[a-f0-9]{64}$/.test(state.metadata.sha256)))throw new Error("metadata"); progress(1/(state.manifest.chunks+1)); + const contentKey=await aes(await derive(state.secret,"content-key",32)); const kind=classify(state.metadata.type,state.metadata.name); + if(((kind==="image"||kind==="audio"||kind==="video")&&state.manifest.size<=PREVIEW_MAX)||(kind==="text"&&state.manifest.size<=10*1024*1024)){state.chunks=await allChunks(contentKey);await renderPreview(state.chunks);progress(1);} else {renderDownloadOnly(contentKey);} + } catch(e) { show("error"); } + } + load(); +})(); diff --git a/files/neodrop/index.html b/files/neodrop/index.html new file mode 100644 index 0000000..7c0d7de --- /dev/null +++ b/files/neodrop/index.html @@ -0,0 +1,71 @@ + + + + + + + {{PRODUCT_NAME}} - Secure File Drop + + + + +
    + + +
    +
    drops@relay:~
    +
    +

    >> neodrop status --public

    +

    Secure File Drop

    +

    Encrypted in your browser. The server stores ciphertext and never receives the key in this link.

    +
    +
    ENCRYPTION
    AES-256-GCM
    +
    ACCESS
    CAPABILITY LINK
    +
    STORAGE
    CIPHERTEXT ONLY
    +
    +

    >> Awaiting input

    +
    +
    + + + + + + +
    + + + diff --git a/files/neodrop/neodrop_server.py b/files/neodrop/neodrop_server.py new file mode 100644 index 0000000..cfdad69 --- /dev/null +++ b/files/neodrop/neodrop_server.py @@ -0,0 +1,613 @@ +#!/usr/bin/python3 +import base64 +import hashlib +import hmac +import ipaddress +import json +import os +import re +import secrets +import shutil +import sqlite3 +import threading +import time +import urllib.request +from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer +from pathlib import Path +from urllib.parse import urlsplit + +APP_ROOT = Path("/usr/share/neodrop") +DATA_ROOT = Path("{{NEODROP_DATA_ROOT}}") +STAGING_ROOT = DATA_ROOT / "staging" +OBJECT_ROOT = DATA_ROOT / "objects" +DB_PATH = DATA_ROOT / "neodrop.sqlite3" +MANAGER_TOKEN_HASH_PATH = Path("{{NEODROP_MANAGER_TOKEN_HASH_PATH}}") +LISTEN_ADDRESS = "{{NEODROP_BIND_ADDRESS}}" +LISTEN_PORT = 8080 +TRUSTED_PROXY = ipaddress.ip_address("{{TRUSTED_PROXY_ADDRESS}}") +TRUSTED_UPLOADERS = ( + ipaddress.ip_network("{{UPLOAD_CIDR_1}}"), + ipaddress.ip_network("{{UPLOAD_CIDR_2}}"), + ipaddress.ip_network("{{UPLOAD_CIDR_3}}"), +) +ALLOWED_ORIGIN = "{{RELAY_ORIGIN}}" +MANAGEMENT_ORIGIN = "{{DROPS_ORIGIN}}" +MANAGEMENT_UPLOADERS = ( + ipaddress.ip_network("{{MANAGEMENT_CIDR_1}}"), + ipaddress.ip_network("{{MANAGEMENT_CIDR_2}}"), + ipaddress.ip_network("{{MANAGEMENT_CIDR_3}}"), +) +UPLOAD_ORIGINS = (ALLOWED_ORIGIN, MANAGEMENT_ORIGIN) +CHUNK_SIZE = 4 * 1024 * 1024 +PROFILES = { + 0: (50 * 1024 * 1024, 30 * 24 * 60 * 60), + 1: (1024 * 1024 * 1024, 7 * 24 * 60 * 60), +} +UPLOAD_TTL = 24 * 60 * 60 +ID_RE = re.compile(r"^[A-Za-z0-9_-]{32}$") +UPLOAD_RE = re.compile(r"^[A-Za-z0-9_-]{22}$") +UNAVAILABLE = b'{"error":"unavailable"}\n' +DB_LOCK = threading.RLock() + + +def now(): + return int(time.time()) + + +def b64url(data): + return base64.urlsafe_b64encode(data).rstrip(b"=").decode("ascii") + + +def token_hash(token): + return hashlib.sha256(token.encode("ascii")).digest() + + +def valid_manager_token(token): + if not token or len(token) > 128: + return False + try: + expected = MANAGER_TOKEN_HASH_PATH.read_text().strip() + actual = hashlib.sha256(token.encode("ascii", "strict")).hexdigest() + except (OSError, UnicodeEncodeError): + return False + return len(expected) == 64 and hmac.compare_digest(actual, expected) + + +def valid_object_id(value): + if not ID_RE.fullmatch(value or ""): + return False + try: + return len(base64.urlsafe_b64decode(value + "==")) == 24 + except (ValueError, TypeError): + return False + + +def database(): + conn = sqlite3.connect(DB_PATH, timeout=30) + conn.row_factory = sqlite3.Row + conn.execute("PRAGMA foreign_keys=ON") + conn.execute("PRAGMA journal_mode=WAL") + return conn + + +def initialize_database(): + DATA_ROOT.mkdir(mode=0o700, parents=True, exist_ok=True) + STAGING_ROOT.mkdir(mode=0o700, exist_ok=True) + OBJECT_ROOT.mkdir(mode=0o700, exist_ok=True) + with database() as conn: + conn.executescript( + """ + CREATE TABLE IF NOT EXISTS tombstones ( + object_id TEXT PRIMARY KEY, + first_seen INTEGER NOT NULL + ); + CREATE TABLE IF NOT EXISTS uploads ( + upload_id TEXT PRIMARY KEY, + object_id TEXT UNIQUE NOT NULL, + token_hash BLOB NOT NULL, + profile INTEGER NOT NULL, + size INTEGER NOT NULL, + chunks INTEGER NOT NULL, + created_at INTEGER NOT NULL + ); + CREATE TABLE IF NOT EXISTS objects ( + object_id TEXT PRIMARY KEY, + token_hash BLOB NOT NULL, + profile INTEGER NOT NULL, + size INTEGER NOT NULL, + chunks INTEGER NOT NULL, + created_at INTEGER NOT NULL, + expires_at INTEGER NOT NULL + ); + CREATE INDEX IF NOT EXISTS objects_expiry ON objects(expires_at); + CREATE INDEX IF NOT EXISTS uploads_created ON uploads(created_at); + """ + ) + + +def object_path(object_id): + return OBJECT_ROOT / object_id[:2] / object_id + + +def report_invalid(client_ip, source, detail, destination_port=None): + event = { + "ip": str(client_ip), + "source": source, + "detail": detail[:160], + } + if destination_port is not None: + event["destination_port"] = destination_port + payload = json.dumps(event).encode("utf-8") + request = urllib.request.Request( + "{{NEOGUARD_INTERNAL_URL}}", + data=payload, + method="POST", + headers={"Content-Type": "application/json"}, + ) + try: + urllib.request.urlopen(request, timeout=0.25).close() + except Exception: + pass + + +def cleanup(): + cutoff = now() - UPLOAD_TTL + expired_paths = [] + object_paths = [] + with DB_LOCK, database() as conn: + for row in conn.execute("SELECT upload_id FROM uploads WHERE created_at <= ?", (cutoff,)): + expired_paths.append(STAGING_ROOT / row["upload_id"]) + conn.execute("DELETE FROM uploads WHERE created_at <= ?", (cutoff,)) + for row in conn.execute("SELECT object_id FROM objects WHERE expires_at <= ?", (now(),)): + object_paths.append((row["object_id"], object_path(row["object_id"]))) + for path in expired_paths: + shutil.rmtree(path, ignore_errors=True) + for object_id, path in object_paths: + try: + shutil.rmtree(path) + except FileNotFoundError: + pass + except OSError: + continue + with DB_LOCK, database() as conn: + conn.execute("DELETE FROM objects WHERE object_id = ? AND expires_at <= ?", (object_id, now())) + + +def cleanup_loop(): + while True: + try: + cleanup() + except Exception: + pass + time.sleep(3600) + + +class NeoDropHandler(BaseHTTPRequestHandler): + protocol_version = "HTTP/1.1" + server_version = "NeoDrop" + sys_version = "" + + def log_message(self, fmt, *args): + print("%s %s" % (self.address_string(), fmt % args), flush=True) + + def client_ip(self): + peer = ipaddress.ip_address(self.client_address[0]) + if peer == TRUSTED_PROXY: + forwarded = self.headers.get("X-Real-IP", "") + try: + return ipaddress.ip_address(forwarded) + except ValueError: + return peer + return peer + + def destination_port(self): + peer = ipaddress.ip_address(self.client_address[0]) + if peer == TRUSTED_PROXY: + value = self.headers.get("X-Forwarded-Port", "") + if value.isdecimal() and 1 <= int(value) <= 65535: + return int(value) + return None + return int(self.server.server_address[1]) + + def is_trusted_uploader(self): + address = self.client_ip() + return any(address in network for network in TRUSTED_UPLOADERS) + + def send_headers(self, status, content_type, length, extra=None): + self.send_response(status) + self.send_header("Content-Type", content_type) + self.send_header("Content-Length", str(length)) + self.send_header("Cache-Control", "private, no-store, max-age=0") + self.send_header("Pragma", "no-cache") + self.send_header("X-Content-Type-Options", "nosniff") + if extra: + for key, value in extra.items(): + self.send_header(key, value) + self.end_headers() + + def send_json(self, status, value, cors=False): + body = json.dumps(value, separators=(",", ":")).encode("utf-8") + b"\n" + extra = {} + if cors: + origin = self.headers.get("Origin", "") + if origin in UPLOAD_ORIGINS: + extra.update({ + "Access-Control-Allow-Origin": origin, + "Vary": "Origin", + }) + self.send_headers(status, "application/json", len(body), extra) + if self.command != "HEAD": + self.wfile.write(body) + + def unavailable(self, detail="unavailable"): + report_invalid(self.client_ip(), "drops", detail, self.destination_port()) + self.send_headers(404, "application/json", len(UNAVAILABLE)) + if self.command != "HEAD": + self.wfile.write(UNAVAILABLE) + + def forbidden_upload(self, detail): + self.close_connection = True + report_invalid(self.client_ip(), "drops", detail, self.destination_port()) + self.send_json(403, {"error": "forbidden"}, cors=True) + + def read_json(self, maximum=8192): + try: + length = int(self.headers.get("Content-Length", "-1")) + except ValueError: + return None + if length < 0 or length > maximum: + return None + try: + return json.loads(self.rfile.read(length)) + except (json.JSONDecodeError, UnicodeDecodeError): + return None + + def upload_authorized(self): + origin = self.headers.get("Origin") + address = self.client_ip() + if origin == ALLOWED_ORIGIN: + source_allowed = any(address in network for network in TRUSTED_UPLOADERS) + elif origin == MANAGEMENT_ORIGIN: + source_allowed = any(address in network for network in MANAGEMENT_UPLOADERS) + else: + source_allowed = False + if not source_allowed: + self.forbidden_upload("external upload") + return False + if origin not in UPLOAD_ORIGINS: + self.forbidden_upload("invalid upload origin") + return False + return True + + def bearer(self): + value = self.headers.get("Authorization", "") + if not value.startswith("Bearer "): + return "" + return value[7:] + + def manager_authorized(self): + if not self.is_trusted_uploader(): + return False + return valid_manager_token(self.bearer()) + + def lookup_upload(self, upload_id): + token = self.bearer() + if not token or len(token) > 128: + return None + with database() as conn: + row = conn.execute("SELECT * FROM uploads WHERE upload_id = ?", (upload_id,)).fetchone() + if not row or not hmac.compare_digest(row["token_hash"], token_hash(token)): + return None + if row["created_at"] + UPLOAD_TTL <= now(): + return None + return row + + def do_OPTIONS(self): + if not self.upload_authorized(): + return + path = urlsplit(self.path).path + requested = self.headers.get("Access-Control-Request-Method", "") + valid = ( + (requested == "POST" and ( + path == "/api/v1/uploads" + or re.fullmatch(r"/api/v1/uploads/[A-Za-z0-9_-]{22}/commit", path) + )) + or (requested == "PUT" and ( + re.fullmatch(r"/api/v1/uploads/[A-Za-z0-9_-]{22}/metadata", path) + or re.fullmatch(r"/api/v1/uploads/[A-Za-z0-9_-]{22}/chunks/\d{1,4}", path) + )) + or (requested == "DELETE" and re.fullmatch( + r"/api/v1/objects/[A-Za-z0-9_-]{32}", path + )) + ) + requested_headers = { + value.strip().lower() + for value in self.headers.get("Access-Control-Request-Headers", "").split(",") + if value.strip() + } + if not valid or not requested_headers.issubset({"authorization", "content-type"}): + return self.unavailable("invalid preflight") + self.send_response(204) + self.send_header("Content-Length", "0") + self.send_header("Access-Control-Allow-Origin", self.headers["Origin"]) + self.send_header("Access-Control-Allow-Methods", requested + ", OPTIONS") + self.send_header("Access-Control-Allow-Headers", "Authorization, Content-Type") + self.send_header("Access-Control-Max-Age", "600") + self.send_header("Vary", "Origin") + self.end_headers() + + def do_POST(self): + path = urlsplit(self.path).path + if path == "/api/v1/uploads": + return self.create_upload() + match = re.fullmatch(r"/api/v1/uploads/([A-Za-z0-9_-]{22})/commit", path) + if match: + return self.commit_upload(match.group(1)) + self.unavailable("invalid POST path") + + def create_upload(self): + if not self.upload_authorized(): + return + if self.headers.get("Content-Type") != "application/json": + self.close_connection = True + return self.send_json(415, {"error": "invalid request"}, cors=True) + data = self.read_json() + if not isinstance(data, dict): + return self.send_json(400, {"error": "invalid request"}, cors=True) + try: + object_id = data["id"] + profile = int(data["profile"]) + size = int(data["size"]) + chunk_size = int(data["chunkSize"]) + chunks = int(data["chunks"]) + except (KeyError, TypeError, ValueError): + return self.send_json(400, {"error": "invalid request"}, cors=True) + if not valid_object_id(object_id) or profile not in PROFILES: + return self.send_json(400, {"error": "invalid request"}, cors=True) + maximum, _ = PROFILES[profile] + expected_chunks = (size + CHUNK_SIZE - 1) // CHUNK_SIZE if size else 0 + if size < 0 or size > maximum or chunk_size != CHUNK_SIZE or chunks != expected_chunks: + return self.send_json(400, {"error": "invalid request"}, cors=True) + upload_id = b64url(secrets.token_bytes(16)) + token = b64url(secrets.token_bytes(32)) + created = now() + with DB_LOCK: + try: + with database() as conn: + conn.execute("INSERT INTO tombstones VALUES (?, ?)", (object_id, created)) + conn.execute( + "INSERT INTO uploads VALUES (?, ?, ?, ?, ?, ?, ?)", + (upload_id, object_id, token_hash(token), profile, size, chunks, created), + ) + stage = STAGING_ROOT / upload_id + (stage / "chunks").mkdir(mode=0o700, parents=True) + except (sqlite3.IntegrityError, FileExistsError): + return self.send_json(409, {"error": "identifier unavailable"}, cors=True) + self.send_json(201, { + "v": 1, + "uploadId": upload_id, + "uploadToken": token, + "sessionExpiresAt": created + UPLOAD_TTL, + }, cors=True) + + def do_PUT(self): + path = urlsplit(self.path).path + metadata = re.fullmatch(r"/api/v1/uploads/([A-Za-z0-9_-]{22})/metadata", path) + chunk = re.fullmatch(r"/api/v1/uploads/([A-Za-z0-9_-]{22})/chunks/(\d{1,4})", path) + if metadata: + return self.put_record(metadata.group(1), None) + if chunk: + return self.put_record(chunk.group(1), int(chunk.group(2))) + self.unavailable("invalid PUT path") + + def put_record(self, upload_id, index): + if not self.upload_authorized(): + return + if self.headers.get("Content-Type") != "application/octet-stream": + self.close_connection = True + return self.send_json(415, {"error": "invalid record"}, cors=True) + row = self.lookup_upload(upload_id) + if not row: + return self.forbidden_upload("invalid upload authorization") + try: + length = int(self.headers.get("Content-Length", "-1")) + except ValueError: + length = -1 + if index is None: + target = STAGING_ROOT / upload_id / "metadata.bin" + valid_length = 16 <= length <= 4112 + else: + if index < 0 or index >= row["chunks"]: + valid_length = False + expected = -1 + else: + remaining = row["size"] - index * CHUNK_SIZE + expected = min(CHUNK_SIZE, remaining) + 16 + valid_length = length == expected + target = STAGING_ROOT / upload_id / "chunks" / ("%08d.bin" % index) + if not valid_length: + return self.send_json(400, {"error": "invalid record"}, cors=True) + body = self.rfile.read(length) + if len(body) != length: + return self.send_json(400, {"error": "incomplete record"}, cors=True) + if target.exists(): + if target.read_bytes() != body: + return self.send_json(409, {"error": "immutable record"}, cors=True) + else: + temporary = target.with_name(target.name + "." + secrets.token_hex(8) + ".tmp") + with open(temporary, "xb") as handle: + handle.write(body) + handle.flush() + os.fsync(handle.fileno()) + os.replace(temporary, target) + self.send_json(200, {"ok": True}, cors=True) + + def commit_upload(self, upload_id): + if not self.upload_authorized(): + return + if self.headers.get("Content-Type") != "application/json": + self.close_connection = True + return self.send_json(415, {"error": "invalid request"}, cors=True) + data = self.read_json(maximum=64) + if data != {}: + return self.send_json(400, {"error": "invalid request"}, cors=True) + row = self.lookup_upload(upload_id) + if not row: + return self.forbidden_upload("invalid commit authorization") + stage = STAGING_ROOT / upload_id + metadata = stage / "metadata.bin" + if not metadata.is_file() or not 16 <= metadata.stat().st_size <= 4112: + return self.send_json(409, {"error": "upload incomplete"}, cors=True) + for index in range(row["chunks"]): + path = stage / "chunks" / ("%08d.bin" % index) + remaining = row["size"] - index * CHUNK_SIZE + if not path.is_file() or path.stat().st_size != min(CHUNK_SIZE, remaining) + 16: + return self.send_json(409, {"error": "upload incomplete"}, cors=True) + created = now() + expires = created + PROFILES[row["profile"]][1] + destination = object_path(row["object_id"]) + destination.parent.mkdir(mode=0o700, parents=True, exist_ok=True) + moved = False + with DB_LOCK: + try: + os.rename(stage, destination) + moved = True + with database() as conn: + conn.execute( + "INSERT INTO objects VALUES (?, ?, ?, ?, ?, ?, ?)", + (row["object_id"], row["token_hash"], row["profile"], row["size"], + row["chunks"], created, expires), + ) + conn.execute("DELETE FROM uploads WHERE upload_id = ?", (upload_id,)) + except Exception: + if moved and destination.exists() and not stage.exists(): + os.rename(destination, stage) + raise + self.send_json(200, {"v": 1, "expiresAt": expires}, cors=True) + + def do_DELETE(self): + path = urlsplit(self.path).path + match = re.fullmatch(r"/api/v1/objects/([A-Za-z0-9_-]{32})", path) + if not match or not self.upload_authorized(): + return + if self.headers.get("Content-Length", "0") != "0": + self.close_connection = True + return self.send_json(400, {"error": "invalid request"}, cors=True) + object_id = match.group(1) + token = self.bearer() + target = object_path(object_id) + with DB_LOCK, database() as conn: + row = conn.execute("SELECT token_hash FROM objects WHERE object_id = ?", (object_id,)).fetchone() + if not row or not token or not hmac.compare_digest(row["token_hash"], token_hash(token)): + return self.forbidden_upload("invalid delete authorization") + if target.exists(): + shutil.rmtree(target) + conn.execute("DELETE FROM objects WHERE object_id = ?", (object_id,)) + self.send_json(200, {"deleted": True}, cors=True) + + def do_HEAD(self): + return self.do_GET() + + def do_GET(self): + path = urlsplit(self.path).path + if path == "/api/v1/manager/objects": + if not self.manager_authorized(): + return self.response_forbidden() + return self.manager_inventory() + manifest = re.fullmatch(r"/api/v1/objects/([A-Za-z0-9_-]{32})", path) + chunk = re.fullmatch(r"/api/v1/objects/([A-Za-z0-9_-]{32})/chunks/(\d{1,4})", path) + if manifest: + return self.get_manifest(manifest.group(1)) + if chunk: + return self.get_chunk(chunk.group(1), int(chunk.group(2))) + if path == "/" or re.fullmatch(r"/d/[A-Za-z0-9_-]{32}", path): + return self.static_file("index.html") + if path in ("/app.js", "/style.css", "/favicon.png", "/avatar-login.jpg"): + return self.static_file(path[1:]) + self.unavailable("invalid GET path") + + def response_forbidden(self): + self.send_json(403, {"error": "forbidden"}) + + def manager_inventory(self): + with database() as conn: + rows = list(conn.execute( + "SELECT object_id,profile,size,chunks,created_at,expires_at " + "FROM objects ORDER BY created_at DESC LIMIT 10000" + )) + self.send_json(200, {"objects": [ + { + "id": row["object_id"], + "profile": row["profile"], + "size": row["size"], + "chunks": row["chunks"], + "createdAt": row["created_at"], + "expiresAt": row["expires_at"], + } + for row in rows + ]}) + + def active_object(self, object_id): + if not valid_object_id(object_id): + return None + with database() as conn: + return conn.execute( + "SELECT * FROM objects WHERE object_id = ? AND expires_at > ?", + (object_id, now()), + ).fetchone() + + def get_manifest(self, object_id): + row = self.active_object(object_id) + metadata = object_path(object_id) / "metadata.bin" + if not row or not metadata.is_file(): + return self.unavailable("unknown object") + self.send_json(200, { + "v": 1, + "profile": row["profile"], + "size": row["size"], + "chunkSize": CHUNK_SIZE, + "chunks": row["chunks"], + "metadata": b64url(metadata.read_bytes()), + "expiresAt": row["expires_at"], + }) + + def get_chunk(self, object_id, index): + row = self.active_object(object_id) + if not row or index < 0 or index >= row["chunks"]: + return self.unavailable("unknown object chunk") + path = object_path(object_id) / "chunks" / ("%08d.bin" % index) + if not path.is_file(): + return self.unavailable("unknown object chunk") + length = path.stat().st_size + self.send_headers(200, "application/octet-stream", length) + if self.command != "HEAD": + with open(path, "rb") as handle: + shutil.copyfileobj(handle, self.wfile, length=64 * 1024) + + def static_file(self, name): + path = APP_ROOT / name + if not path.is_file(): + return self.unavailable("missing application asset") + types = {"index.html": "text/html; charset=utf-8", "app.js": "application/javascript", + "style.css": "text/css", "favicon.png": "image/png", + "avatar-login.jpg": "image/jpeg"} + body = path.read_bytes() + cached = name in ("favicon.png", "avatar-login.jpg") + extra = {"Cache-Control": "public, max-age=604800"} if cached else {"Cache-Control": "no-cache"} + self.send_headers(200, types[name], len(body), extra) + if self.command != "HEAD": + self.wfile.write(body) + + +class NeoDropServer(ThreadingHTTPServer): + daemon_threads = True + request_queue_size = 256 + + +if __name__ == "__main__": + os.umask(0o077) + initialize_database() + cleanup() + threading.Thread(target=cleanup_loop, daemon=True).start() + server = NeoDropServer((LISTEN_ADDRESS, LISTEN_PORT), NeoDropHandler) + server.serve_forever() diff --git a/files/neodrop/style.css b/files/neodrop/style.css new file mode 100644 index 0000000..8f0dace --- /dev/null +++ b/files/neodrop/style.css @@ -0,0 +1,79 @@ +:root { + color-scheme: dark; + --void:#07030d; --panel:#150a24; --raised:#211034; --violet:#9d5cff; + --purple:#6f2cff; --pink:#ff65c8; --cyan:#55e7ff; --acid:#b9ff4f; + --text:#f1eaff; --muted:#aa9abd; --line:rgba(157,92,255,.38); +} +* { box-sizing:border-box; } +html,body { min-height:100%; margin:0; } +body { + color:var(--text); background-color:var(--void); + background-image:linear-gradient(rgba(157,92,255,.045) 1px,transparent 1px),linear-gradient(90deg,rgba(157,92,255,.045) 1px,transparent 1px),radial-gradient(circle at 80% 0,rgba(111,44,255,.24),transparent 38%); + background-size:32px 32px,32px 32px,auto; + font-family:"OpenDyslexic","Atkinson Hyperlegible",system-ui,sans-serif; +} +main { width:min(1120px,calc(100% - 40px)); margin:0 auto; padding:54px 0 80px; } +.label,.status { color:var(--acid); font:700 10px/1.4 ui-monospace,monospace; letter-spacing:.18em; } +.login-hero { display:grid; grid-template-columns:minmax(250px,.78fr) minmax(360px,1.35fr); min-height:390px; margin-bottom:28px; overflow:hidden; border-top:1px solid var(--violet); border-bottom:1px solid var(--line); background:linear-gradient(115deg,rgba(22,9,40,.96),rgba(9,3,17,.78)),linear-gradient(90deg,transparent 49.8%,rgba(85,231,255,.12) 50%,transparent 50.2%); box-shadow:20px 20px 0 rgba(72,24,122,.12); } +.login-portrait { position:relative; min-height:390px; overflow:hidden; border-right:1px solid var(--line); } +.login-portrait::after { position:absolute; inset:0; content:""; pointer-events:none; background:repeating-linear-gradient(0deg,transparent 0 4px,rgba(7,3,13,.16) 5px),linear-gradient(180deg,transparent 55%,rgba(7,3,13,.8)); } +.login-portrait img { width:100%; height:100%; min-height:390px; object-fit:cover; object-position:50% 27%; filter:saturate(1.12) contrast(1.04); } +.portrait-code { position:absolute; z-index:1; right:14px; bottom:12px; color:var(--acid); font:700 10px/1 ui-monospace,monospace; letter-spacing:.18em; } +.login-intro { position:relative; align-self:center; padding:48px clamp(32px,7vw,86px); } +.login-intro::before { position:absolute; top:28px; left:0; width:46px; height:3px; content:""; background:var(--pink); box-shadow:19px 8px 0 var(--cyan); } +.login-kicker { margin:0 0 20px; color:var(--acid); font:700 11px/1.4 ui-monospace,monospace; letter-spacing:.2em; } +.login-intro h1 { margin:0; color:var(--text); font-family:"Arial Black",Impact,sans-serif; font-size:clamp(42px,6.4vw,76px); font-weight:900; line-height:.78; letter-spacing:-.07em; text-transform:uppercase; text-shadow:4px 4px 0 rgba(111,44,255,.65); } +.login-intro h1 span { display:block; margin-left:.32em; color:transparent; -webkit-text-stroke:1px var(--pink); text-shadow:none; text-transform:lowercase; } +.login-deck { max-width:520px; margin:30px 0 25px; color:#cfc3dd; font-size:15px; line-height:1.75; } +.login-status { display:flex; flex-wrap:wrap; gap:8px; } +.login-status span { padding:7px 9px 6px; border:1px solid rgba(85,231,255,.35); color:var(--cyan); background:rgba(85,231,255,.04); font:700 9px/1 ui-monospace,monospace; letter-spacing:.12em; } +.terminal { margin:28px clamp(20px,7vw,82px) 52px; border:1px solid rgba(157,92,255,.5); background:rgba(5,2,10,.94); box-shadow:12px 12px 0 rgba(111,44,255,.12); font:700 clamp(12px,1.8vw,16px)/1.75 ui-monospace,monospace; } +.terminal-bar { display:flex; align-items:center; gap:8px; padding:10px 14px; border-bottom:1px solid var(--line); color:var(--muted); font-size:10px; letter-spacing:.08em; } +.terminal-bar span { width:8px; height:8px; border-radius:50%; background:var(--pink); } +.terminal-bar span:nth-child(2) { background:var(--violet); } +.terminal-bar span:nth-child(3) { background:var(--acid); } +.terminal-bar b { margin-left:6px; font-weight:700; } +.terminal-body { padding:clamp(20px,4vw,34px); } +.terminal-body p { margin:0 0 8px; color:#c8c2cf; } +.terminal-title { margin:20px 0 8px!important; color:var(--text)!important; font-size:clamp(20px,3vw,32px); text-transform:uppercase; } +.terminal .prompt { color:var(--violet); } +.terminal dl { margin:24px 0 0; } +.terminal dt { color:var(--muted); } +.terminal dd { color:var(--cyan); } +.input-line { margin-top:18px!important; } +.cursor { color:var(--acid); animation:blink 1s steps(1,end) infinite; } +.sr-only { position:absolute; width:1px; height:1px; overflow:hidden; clip:rect(0,0,0,0); } +.panel { margin-top:24px; padding:clamp(24px,5vw,48px); border-top:1px solid var(--pink); border-bottom:1px solid var(--line); background:linear-gradient(120deg,rgba(34,14,57,.97),rgba(10,4,18,.97)); box-shadow:16px 16px rgba(111,44,255,.1); } +.panel h1 { margin:.2em 0 .6em; font-size:clamp(26px,5vw,48px); } +dl { margin:28px 0 0; border-top:1px solid var(--line); } +dl div { display:grid; grid-template-columns:140px 1fr; gap:20px; padding:12px 0; border-bottom:1px solid rgba(157,92,255,.16); } +dt { color:var(--muted); font:700 9px/1.5 ui-monospace,monospace; letter-spacing:.14em; } +dd { margin:0; color:var(--cyan); font:700 11px/1.5 ui-monospace,monospace; } +.hidden { display:none!important; } +.meter { height:6px; margin-top:22px; background:#090310; } +.meter span { display:block; width:0; height:100%; background:linear-gradient(90deg,var(--pink),var(--violet),var(--cyan)); transition:width .2s; } +.file-heading { display:flex; align-items:end; justify-content:space-between; gap:24px; } +button { padding:12px 18px; border:0; color:#09020f; background:linear-gradient(90deg,var(--pink),var(--violet)); box-shadow:5px 5px rgba(85,231,255,.14); font-weight:800; text-transform:uppercase; cursor:pointer; } +button:hover { background:linear-gradient(90deg,var(--acid),var(--cyan)); } +.file-details { margin-top:20px; } +.file-details dd { overflow-wrap:anywhere; } +.file-details code { color:var(--acid); font:inherit; letter-spacing:.025em; } +.preview { margin-top:28px; } +.preview img { display:block; max-width:100%; max-height:72vh; margin:auto; object-fit:contain; } +.preview audio { display:block; width:100%; } +.preview video { display:block; width:100%; max-height:72vh; margin:auto; background:#000; object-fit:contain; } +.text-preview { overflow:auto; max-height:68vh; padding:22px; border:1px solid var(--line); color:#d9cee7; background:#08020e; font:13px/1.65 ui-monospace,monospace; white-space:pre-wrap; word-break:break-word; } +.text-preview .heading { color:var(--pink); font-weight:800; } +.text-preview .quote { color:var(--cyan); } +.text-preview .list { color:var(--acid); } +.text-preview .code { color:#c69cff; } +.error { border-top-color:#ff487f; } +.error .status { color:#ff78b4; } +body.embed main { width:100%; padding:0; } +body.embed .login-hero,body.embed #idle { display:none; } +body.embed .panel { margin:0; padding:0; box-shadow:none; border:0; background:transparent; } +body.embed .file-heading,body.embed .file-details { display:none; } +body.embed .preview { margin:0; } +@keyframes blink { 50% { opacity:0; } } +@media(max-width:760px){main{width:min(100% - 24px,560px);padding-top:28px}.login-hero{grid-template-columns:1fr;box-shadow:10px 10px 0 rgba(72,24,122,.12)}.login-portrait,.login-portrait img{min-height:300px;max-height:380px}.login-portrait{border-right:0;border-bottom:1px solid var(--line)}.login-intro{padding:42px 24px 36px}.login-intro h1{font-size:clamp(40px,13vw,68px)}.terminal{margin-left:14px;margin-right:14px}.terminal-body{overflow-wrap:anywhere}.file-heading{display:block}.file-heading button{margin-top:12px}dl div{grid-template-columns:100px 1fr}.panel{box-shadow:8px 8px rgba(111,44,255,.1)}} +@media(prefers-reduced-motion:reduce){.cursor{animation:none}} diff --git a/files/neoguard/neoguard_agent.py b/files/neoguard/neoguard_agent.py new file mode 100644 index 0000000..0a697b2 --- /dev/null +++ b/files/neoguard/neoguard_agent.py @@ -0,0 +1,132 @@ +#!/usr/bin/python3 +import hashlib +import hmac +import json +import os +import secrets +import socket +import threading +import time +import urllib.error +import urllib.request +from pathlib import Path + +SOCKET_PATH = "{{NEOGUARD_CONTROL_SOCKET_PATH}}" +BASE = "{{DROPS_ORIGIN}}" +KEY_PATH = Path("{{NEOGUARD_KEY_PATH}}") +CLIENTS = set() +CLIENTS_LOCK = threading.Lock() +LAST_EVENT = 0 + + +def signed_request(path, value=None): + body = b"" if value is None else json.dumps(value, separators=(",", ":")).encode() + method = "GET" if value is None else "POST" + for attempt in range(3): + timestamp = int(time.time()) + nonce = secrets.token_hex(16) + canonical = "%d\n%s\n%s\n%s\n%s" % ( + timestamp, nonce, method, path, hashlib.sha256(body).hexdigest()) + signature = hmac.new(KEY_PATH.read_bytes(), canonical.encode(), hashlib.sha256).hexdigest() + request = urllib.request.Request(BASE + path, data=None if value is None else body, method=method, headers={ + "Content-Type": "application/json", "X-Neo-Timestamp": str(timestamp), + "X-Neo-Nonce": nonce, "X-Neo-Signature": signature, + }) + try: + with urllib.request.urlopen(request, timeout=10) as response: + return json.load(response) + except urllib.error.HTTPError as error: + if error.code not in (502, 503, 504) or attempt == 2: + raise + time.sleep(0.25 * (attempt + 1)) + + +def broadcast(message): + payload = (message.replace("\x00", "") + "\n").encode() + dead = [] + with CLIENTS_LOCK: + for client in CLIENTS: + try: + client.sendall(payload) + except OSError: + dead.append(client) + for client in dead: + CLIENTS.discard(client) + client.close() + + +def attempt_payload(fields): + if len(fields) == 3: + address, detail = fields[1], fields[2] + port = None + elif len(fields) == 4: + address, port_text, detail = fields[1], fields[2], fields[3] + if not port_text.isdecimal() or not 1 <= int(port_text) <= 65535: + raise ValueError("invalid destination port") + port = int(port_text) + else: + raise ValueError("invalid attempt event") + payload = {"type": "attempt", "ip": address, "source": "relay", "detail": detail} + if port is not None: + payload["destination_port"] = port + return payload + + +def handle_client(client): + buffer = b"" + try: + client.sendall(b"STATUS\tNeoGuard agent connected\n") + while True: + data = client.recv(4096) + if not data: + break + buffer += data + while b"\n" in buffer: + line, buffer = buffer.split(b"\n", 1) + fields = line.decode("utf-8", "replace").split("\t", 3) + try: + if fields[0] == "ATTEMPT": + signed_request("/api/v1/neoguard/event", attempt_payload(fields)) + elif fields[0] == "COMMAND" and len(fields) >= 2: + result = signed_request("/api/v1/neoguard/event", {"type":"command","command":fields[1]}) + client.sendall(("RESPONSE\t" + result.get("response", "No response") + "\n").encode()) + except Exception as error: + client.sendall(("ERROR\t" + str(error)[:300] + "\n").encode()) + finally: + with CLIENTS_LOCK: + CLIENTS.discard(client) + client.close() + + +def socket_server(): + try: + os.unlink(SOCKET_PATH) + except FileNotFoundError: + pass + server = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) + server.bind(SOCKET_PATH) + os.chmod(SOCKET_PATH, 0o660) + server.listen(4) + while True: + client, _ = server.accept() + with CLIENTS_LOCK: + CLIENTS.add(client) + threading.Thread(target=handle_client, args=(client,), daemon=True).start() + + +def poll_events(): + global LAST_EVENT + while True: + try: + result = signed_request("/api/v1/neoguard/poll?after=%d" % LAST_EVENT) + for event in result.get("events", []): + LAST_EVENT = max(LAST_EVENT, int(event["id"])) + broadcast("EVENT\t%s\t%s" % (event["level"], event["message"])) + except Exception: + pass + time.sleep(5) + + +if __name__ == "__main__": + threading.Thread(target=poll_events, daemon=True).start() + socket_server() diff --git a/files/neoguard/neoguard_plugin.c b/files/neoguard/neoguard_plugin.c new file mode 100644 index 0000000..710e0d4 --- /dev/null +++ b/files/neoguard/neoguard_plugin.c @@ -0,0 +1,186 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +WEECHAT_PLUGIN_NAME("neoguard") +WEECHAT_PLUGIN_DESCRIPTION("NeoGuard abuse-control buffer") +WEECHAT_PLUGIN_AUTHOR("{{PRODUCT_NAME}}") +WEECHAT_PLUGIN_VERSION("1.1") +WEECHAT_PLUGIN_LICENSE("GPL3") + +struct t_weechat_plugin *weechat_plugin; +static struct t_gui_buffer *guard_buffer; +static struct t_hook *fd_hook; +static int agent_fd = -1; +static char receive_buffer[16384]; +static size_t receive_length; + +static void print_line(const char *line) +{ + const char *color = "chat"; + if (strncmp(line, "EVENT\tBAN", 9) == 0 || strncmp(line, "EVENT\tPERM", 10) == 0) + color = "lightred"; + else if (strncmp(line, "EVENT\tWARN", 10) == 0) + color = "yellow"; + else if (strncmp(line, "ERROR\t", 6) == 0) + color = "red"; + weechat_printf(guard_buffer, "%s%s", weechat_color(color), line); +} + +static void disconnect_agent(void) +{ + if (fd_hook) { weechat_unhook(fd_hook); fd_hook = NULL; } + if (agent_fd >= 0) close(agent_fd); + agent_fd = -1; + receive_length = 0; +} + +static int agent_read_cb(const void *pointer, void *data, int fd) +{ + (void)pointer; (void)data; (void)fd; + ssize_t count = read(agent_fd, receive_buffer + receive_length, + sizeof(receive_buffer) - receive_length - 1); + if (count <= 0) { disconnect_agent(); return WEECHAT_RC_OK; } + receive_length += (size_t)count; + receive_buffer[receive_length] = '\0'; + char *start = receive_buffer; + char *newline; + while ((newline = strchr(start, '\n'))) { + *newline = '\0'; + print_line(start); + start = newline + 1; + } + receive_length = strlen(start); + memmove(receive_buffer, start, receive_length); + return WEECHAT_RC_OK; +} + +static int connect_agent(void) +{ + struct sockaddr_un address; + if (agent_fd >= 0) return 1; + agent_fd = socket(AF_UNIX, SOCK_STREAM, 0); + if (agent_fd < 0) return 0; + memset(&address, 0, sizeof(address)); + address.sun_family = AF_UNIX; + snprintf(address.sun_path, sizeof(address.sun_path), "%s", "{{NEOGUARD_CONTROL_SOCKET_PATH}}"); + if (connect(agent_fd, (struct sockaddr *)&address, sizeof(address)) != 0) { + close(agent_fd); agent_fd = -1; return 0; + } + fd_hook = weechat_hook_fd(agent_fd, 1, 0, 0, &agent_read_cb, NULL, NULL); + return 1; +} + +static void send_agent(const char *kind, const char *first, const char *second) +{ + char message[4096]; + if (!connect_agent()) return; + snprintf(message, sizeof(message), "%s\t%s%s%s\n", kind, first, + second ? "\t" : "", second ? second : ""); + if (write(agent_fd, message, strlen(message)) < 0) disconnect_agent(); +} + +static void send_attempt(const char *address, int port, const char *detail) +{ + char message[4096]; + if (!connect_agent()) return; + if (port >= 1 && port <= 65535) + snprintf(message, sizeof(message), "ATTEMPT\t%s\t%d\t%s\n", address, port, detail); + else + snprintf(message, sizeof(message), "ATTEMPT\t%s\t%s\n", address, detail); + if (write(agent_fd, message, strlen(message)) < 0) disconnect_agent(); +} + +static int reconnect_cb(const void *pointer, void *data, int remaining_calls) +{ + (void)pointer; (void)data; (void)remaining_calls; + connect_agent(); + return WEECHAT_RC_OK; +} + +static int input_cb(const void *pointer, void *data, struct t_gui_buffer *buffer, const char *input) +{ + (void)pointer; (void)data; (void)buffer; + if (input && input[0]) send_agent("COMMAND", input, NULL); + return WEECHAT_RC_OK; +} + +static int close_cb(const void *pointer, void *data, struct t_gui_buffer *buffer) +{ + (void)pointer; (void)data; (void)buffer; + guard_buffer = NULL; + return WEECHAT_RC_OK; +} + +static int ensure_buffer(void) +{ + if (!guard_buffer) + guard_buffer = weechat_buffer_search("neoguard", "control"); + if (!guard_buffer) + guard_buffer = weechat_buffer_new("control", &input_cb, NULL, NULL, &close_cb, NULL, NULL); + if (!guard_buffer) return 0; + weechat_buffer_set_pointer(guard_buffer, "input_callback", &input_cb); + weechat_buffer_set_pointer(guard_buffer, "close_callback", &close_cb); + weechat_buffer_set(guard_buffer, "short_name", "NeoGuard"); + weechat_buffer_set(guard_buffer, "title", "NeoGuard | status/list | show/add/remove/extend IP | action IP redirect|message"); + weechat_buffer_set(guard_buffer, "hidden", "0"); + weechat_buffer_set(guard_buffer, "notify", "3"); + weechat_buffer_set(guard_buffer, "localvar_set_no_log", "1"); + weechat_buffer_set(guard_buffer, "localvar_set_pinned", "true"); + weechat_buffer_set(guard_buffer, "localvar_set_type", "other"); + return 1; +} + +static int command_cb(const void *pointer, void *data, struct t_gui_buffer *buffer, + int argc, char **argv, char **argv_eol) +{ + (void)pointer; (void)data; (void)buffer; (void)argc; (void)argv; + if (ensure_buffer()) { + weechat_buffer_set(guard_buffer, "display", "1"); + if (argv_eol[1] && argv_eol[1][0]) send_agent("COMMAND", argv_eol[1], NULL); + } + return WEECHAT_RC_OK; +} + +static int relay_failure_cb(const void *pointer, void *data, const char *signal, + const char *type_data, void *signal_data) +{ + (void)pointer; (void)data; (void)signal; (void)type_data; + struct t_infolist *list = weechat_infolist_get("relay", signal_data, NULL); + if (list && weechat_infolist_next(list)) { + const char *real_ip = weechat_infolist_string(list, "real_ip"); + const char *address = weechat_infolist_string(list, "address"); + int port = weechat_infolist_integer(list, "server_port"); + send_attempt((real_ip && real_ip[0]) ? real_ip : address, port, + "relay authentication failed"); + } + if (list) weechat_infolist_free(list); + return WEECHAT_RC_OK; +} + +int weechat_plugin_init(struct t_weechat_plugin *plugin, int argc, char *argv[]) +{ + (void)argc; (void)argv; + weechat_plugin = plugin; + weechat_hook_command("neoguard", "open/control NeoGuard", + "list || status || show || add [] || remove || extend || action redirect || action message ", + "Inspect and control NeoGuard bans and per-address actions", + "list|status|show|add|remove|extend|action", + &command_cb, NULL, NULL); + weechat_hook_signal("relay_client_auth_failed", &relay_failure_cb, NULL, NULL); + weechat_hook_timer(5000, 0, 0, &reconnect_cb, NULL, NULL); + command_cb(NULL, NULL, NULL, 0, NULL, (char *[]){"", "status"}); + return WEECHAT_RC_OK; +} + +int weechat_plugin_end(struct t_weechat_plugin *plugin) +{ + (void)plugin; + disconnect_agent(); + return WEECHAT_RC_OK; +} diff --git a/files/neoguard/neoguardd.py b/files/neoguard/neoguardd.py new file mode 100644 index 0000000..fdaca63 --- /dev/null +++ b/files/neoguard/neoguardd.py @@ -0,0 +1,455 @@ +#!/usr/bin/python3 +import hashlib +import hmac +import html +import ipaddress +import json +import os +import re +import secrets +import shlex +import socket +import sqlite3 +import threading +import time +from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer +from pathlib import Path +from urllib.parse import parse_qs, urlsplit + +DATA_ROOT = Path("{{NEOGUARD_DATA_ROOT}}") +DB_PATH = DATA_ROOT / "neoguard.sqlite3" +KEY_PATH = Path("{{NEOGUARD_KEY_PATH}}") +LISTEN_ADDRESS = "{{NEOGUARD_BIND_ADDRESS}}" +LISTEN_PORT = 8081 +TRUSTED_PROXY = ipaddress.ip_address("{{TRUSTED_PROXY_ADDRESS}}") +EXEMPT_NETWORKS = ( + ipaddress.ip_network("{{UPLOAD_CIDR_1}}"), + ipaddress.ip_network("{{UPLOAD_CIDR_2}}"), + ipaddress.ip_network("{{UPLOAD_CIDR_3}}"), +) +WINDOW = 600 +MAX_FAILURES = 21 +BAN_SECONDS = 24 * 60 * 60 +DEFAULT_REDIRECT = "{{BLOCKED_REDIRECT_URL}}" +DB_LOCK = threading.RLock() +NONCES = {} +URL_RE = re.compile(r"^https://[^\s\\\"'{};$]{1,2039}$") + + +def now(): + return int(time.time()) + + +def database(): + conn = sqlite3.connect(DB_PATH, timeout=30) + conn.row_factory = sqlite3.Row + conn.execute("PRAGMA journal_mode=WAL") + conn.execute("PRAGMA synchronous=FULL") + return conn + + +def initialize_database(): + DATA_ROOT.mkdir(mode=0o700, parents=True, exist_ok=True) + with database() as conn: + conn.executescript( + """ + CREATE TABLE IF NOT EXISTS attempts ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + occurred_at INTEGER NOT NULL, + address TEXT NOT NULL, + source TEXT NOT NULL, + detail TEXT NOT NULL, + destination_port INTEGER + ); + CREATE INDEX IF NOT EXISTS attempts_window ON attempts(address, occurred_at); + CREATE TABLE IF NOT EXISTS offenses ( + address TEXT PRIMARY KEY, + count INTEGER NOT NULL, + last_at INTEGER NOT NULL + ); + CREATE TABLE IF NOT EXISTS bans ( + address TEXT PRIMARY KEY, + started_at INTEGER NOT NULL, + expires_at INTEGER, + offense INTEGER NOT NULL, + action TEXT NOT NULL, + target TEXT NOT NULL, + message TEXT NOT NULL, + reason TEXT NOT NULL, + rdns TEXT NOT NULL DEFAULT '', + active INTEGER NOT NULL + ); + CREATE TABLE IF NOT EXISTS events ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + occurred_at INTEGER NOT NULL, + level TEXT NOT NULL, + message TEXT NOT NULL, + destination_port INTEGER + ); + """ + ) + for table in ("attempts", "events"): + columns = {row["name"] for row in conn.execute("PRAGMA table_info(%s)" % table)} + if "destination_port" not in columns: + conn.execute("ALTER TABLE %s ADD COLUMN destination_port INTEGER" % table) + + +def normalize_address(value): + address = ipaddress.ip_address(value) + if isinstance(address, ipaddress.IPv6Address) and address.ipv4_mapped: + address = address.ipv4_mapped + return address + + +def exempt(address): + return any(address in network for network in EXEMPT_NETWORKS) + + +def add_event(conn, level, message, destination_port=None): + conn.execute("INSERT INTO events(occurred_at, level, message, destination_port) VALUES (?, ?, ?, ?)", + (now(), level, message[:2000], destination_port)) + + +def confirmed_rdns(address): + try: + hostname = socket.gethostbyaddr(str(address))[0].lower().rstrip(".") + if not hostname or len(hostname) > 253 or any(ord(c) < 33 for c in hostname): + return "" + results = socket.getaddrinfo(hostname, None) + returned = {normalize_address(item[4][0]) for item in results} + return hostname if address in returned else "" + except (OSError, ValueError): + return "" + + +def resolve_ban(address_text): + address = normalize_address(address_text) + hostname = confirmed_rdns(address) + with DB_LOCK, database() as conn: + conn.execute("UPDATE bans SET rdns = ? WHERE address = ?", (hostname, str(address))) + if hostname: + add_event(conn, "INFO", "[RDNS] ip=%s rdns=%s" % (address, hostname)) + + +def expire_bans(conn): + timestamp = now() + rows = list(conn.execute("SELECT address FROM bans WHERE active = 1 AND expires_at IS NOT NULL AND expires_at <= ?", (timestamp,))) + for row in rows: + conn.execute("UPDATE bans SET active = 0 WHERE address = ?", (row["address"],)) + add_event(conn, "INFO", "[UNBAN] ip=%s reason=expired" % row["address"]) + + +def normalize_destination_port(value): + if value is None or value == "": + return None + if isinstance(value, bool): + raise ValueError("invalid destination port") + if isinstance(value, int): + port = value + elif isinstance(value, str) and value.isdecimal(): + port = int(value) + else: + raise ValueError("invalid destination port") + if not 1 <= port <= 65535: + raise ValueError("invalid destination port") + return port + + +def record_attempt(address_value, source, detail, destination_port=None): + destination_port = normalize_destination_port(destination_port) + try: + address = normalize_address(address_value) + except ValueError: + return + if exempt(address): + return + address_text = str(address) + timestamp = now() + created_ban = False + with DB_LOCK, database() as conn: + expire_bans(conn) + active = conn.execute("SELECT 1 FROM bans WHERE address = ? AND active = 1", (address_text,)).fetchone() + conn.execute("DELETE FROM attempts WHERE occurred_at < ?", (timestamp - WINDOW,)) + if active: + return + conn.execute("INSERT INTO attempts(occurred_at,address,source,detail,destination_port) VALUES (?,?,?,?,?)", + (timestamp, address_text, source[:32], detail[:300], destination_port)) + count = conn.execute("SELECT COUNT(*) AS n FROM attempts WHERE address = ? AND occurred_at >= ?", + (address_text, timestamp - WINDOW)).fetchone()["n"] + if count in (1, 10, 20): + port_text = " port=%d" % destination_port if destination_port else "" + add_event(conn, "WARN", "[WARN] ip=%s%s rdns=pending count=%d/%d window=10m source=%s" % + (address_text, port_text, count, MAX_FAILURES, source[:32]), destination_port) + if count >= MAX_FAILURES: + offense_row = conn.execute("SELECT count FROM offenses WHERE address = ?", (address_text,)).fetchone() + offense = (offense_row["count"] if offense_row else 0) + 1 + conn.execute("INSERT INTO offenses VALUES (?,?,?) ON CONFLICT(address) DO UPDATE SET count=excluded.count,last_at=excluded.last_at", + (address_text, offense, timestamp)) + expires = None if offense >= 3 else timestamp + BAN_SECONDS + conn.execute(""" + INSERT INTO bans(address,started_at,expires_at,offense,action,target,message,reason,rdns,active) + VALUES (?,?,?,?,?,?,?,?,?,1) + ON CONFLICT(address) DO UPDATE SET started_at=excluded.started_at,expires_at=excluded.expires_at, + offense=excluded.offense,action=excluded.action,target=excluded.target,message=excluded.message, + reason=excluded.reason,rdns='',active=1 + """, (address_text, timestamp, expires, offense, "redirect", DEFAULT_REDIRECT, + "Access denied by NeoGuard.", "automatic threshold", "")) + conn.execute("DELETE FROM attempts WHERE address = ?", (address_text,)) + level = "PERM" if expires is None else "BAN" + until = "permanent" if expires is None else time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime(expires)) + port_text = " port=%d" % destination_port if destination_port else "" + add_event(conn, level, "[%s] ip=%s%s rdns=pending offense=%d failures=%d until=%s action=redirect" % + (level, address_text, port_text, offense, count, until), destination_port) + created_ban = True + if created_ban: + threading.Thread(target=resolve_ban, args=(address_text,), daemon=True).start() + + +def active_ban(address_value): + try: + address = normalize_address(address_value) + except ValueError: + return None + if exempt(address): + return None + with DB_LOCK, database() as conn: + expire_bans(conn) + return conn.execute("SELECT * FROM bans WHERE address = ? AND active = 1", (str(address),)).fetchone() + + +def duration_value(value): + if value == "permanent": + return None + match = re.fullmatch(r"(\d+)(m|h|d)", value) + if not match: + raise ValueError("duration must be Nm, Nh, Nd, or permanent") + factor = {"m": 60, "h": 3600, "d": 86400}[match.group(2)] + duration = int(match.group(1)) * factor + if duration < 60 or duration > 10 * 365 * 86400: + raise ValueError("duration out of range") + return now() + duration + + +def format_ban(row): + until = "permanent" if row["expires_at"] is None else time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime(row["expires_at"])) + return "ip=%s rdns=%s offense=%d until=%s action=%s target=%s reason=%s" % ( + row["address"], row["rdns"] or "-", row["offense"], until, row["action"], + row["target"] if row["action"] == "redirect" else "-", row["reason"]) + + +def run_command(command): + try: + args = shlex.split(command) + except ValueError as error: + return "ERROR " + str(error) + if not args: + return "Commands: list, show IP, add IP DURATION, remove IP, extend IP DURATION, action IP redirect URL|message TEXT, status" + operation = args[0].lower() + with DB_LOCK, database() as conn: + expire_bans(conn) + if operation == "list": + rows = list(conn.execute("SELECT * FROM bans WHERE active=1 ORDER BY started_at DESC LIMIT 25")) + return "No active bans." if not rows else "\n".join(format_ban(row) for row in rows) + if operation == "status": + active = conn.execute("SELECT COUNT(*) n FROM bans WHERE active=1").fetchone()["n"] + attempts = conn.execute("SELECT COUNT(*) n FROM attempts WHERE occurred_at>=?", (now()-WINDOW,)).fetchone()["n"] + return "NeoGuard active_bans=%d recent_attempts=%d threshold=%d/10m" % (active, attempts, MAX_FAILURES) + if len(args) < 2: + return "ERROR missing IP address" + try: + address = normalize_address(args[1]) + except ValueError: + return "ERROR invalid IP address" + if exempt(address): + return "ERROR protected internal/trusted address" + address_text = str(address) + if operation == "show": + row = conn.execute("SELECT * FROM bans WHERE address=?", (address_text,)).fetchone() + offense = conn.execute("SELECT count FROM offenses WHERE address=?", (address_text,)).fetchone() + return (format_ban(row) if row else "No ban for %s" % address_text) + " offenses=%d" % (offense["count"] if offense else 0) + if operation == "remove": + conn.execute("UPDATE bans SET active=0 WHERE address=?", (address_text,)) + conn.execute("DELETE FROM attempts WHERE address=?", (address_text,)) + add_event(conn, "ADMIN", "[ADMIN] operation=remove ip=%s" % address_text) + return "Removed active ban for %s; offense history preserved." % address_text + if operation == "add": + expiry = duration_value(args[2] if len(args) > 2 else "24h") + offense_row = conn.execute("SELECT count FROM offenses WHERE address=?", (address_text,)).fetchone() + offense = offense_row["count"] if offense_row else 0 + conn.execute(""" + INSERT INTO bans VALUES (?,?,?,?,?,?,?,?,?,1) + ON CONFLICT(address) DO UPDATE SET started_at=excluded.started_at,expires_at=excluded.expires_at, + action=excluded.action,target=excluded.target,message=excluded.message,reason=excluded.reason,active=1 + """, (address_text, now(), expiry, offense, "redirect", DEFAULT_REDIRECT, + "Access denied by NeoGuard.", "manual", confirmed_rdns(address))) + add_event(conn, "ADMIN", "[ADMIN] operation=add ip=%s" % address_text) + return "Added " + address_text + row = conn.execute("SELECT * FROM bans WHERE address=? AND active=1", (address_text,)).fetchone() + if not row: + return "ERROR no active ban for %s" % address_text + if operation == "extend": + if len(args) < 3: + return "ERROR missing duration" + expiry = duration_value(args[2]) + conn.execute("UPDATE bans SET expires_at=? WHERE address=?", (expiry, address_text)) + add_event(conn, "ADMIN", "[ADMIN] operation=extend ip=%s duration=%s" % (address_text, args[2])) + return "Extended " + address_text + if operation == "action": + if len(args) < 4 or args[2] not in ("redirect", "message"): + return "ERROR usage: action IP redirect URL | action IP message TEXT" + action = args[2] + value = " ".join(args[3:])[:1000] + if action == "redirect" and not URL_RE.fullmatch(value): + return "ERROR redirect must be a safe https:// URL" + if action == "message" and any(ord(c) < 32 and c not in "\t" for c in value): + return "ERROR invalid message" + conn.execute("UPDATE bans SET action=?,target=?,message=? WHERE address=?", + (action, value if action == "redirect" else "", value if action == "message" else "", address_text)) + add_event(conn, "ADMIN", "[ADMIN] operation=action ip=%s action=%s" % (address_text, action)) + return "Updated action for " + address_text + return "ERROR unknown command" + + +def verify_hmac(handler, body): + try: + timestamp = int(handler.headers.get("X-Neo-Timestamp", "0")) + nonce = handler.headers.get("X-Neo-Nonce", "") + signature = handler.headers.get("X-Neo-Signature", "") + if abs(now() - timestamp) > 60 or not re.fullmatch(r"[0-9a-f]{32}", nonce): + return False + with DB_LOCK: + cutoff = now() - 120 + for key in list(NONCES): + if NONCES[key] < cutoff: + del NONCES[key] + if nonce in NONCES: + return False + path = handler.path + digest = hashlib.sha256(body).hexdigest() + canonical = "%d\n%s\n%s\n%s\n%s" % (timestamp, nonce, handler.command, path, digest) + expected = hmac.new(KEY_PATH.read_bytes(), canonical.encode(), hashlib.sha256).hexdigest() + if not hmac.compare_digest(signature, expected): + return False + NONCES[nonce] = now() + return True + except (ValueError, OSError): + return False + + +class NeoGuardHandler(BaseHTTPRequestHandler): + protocol_version = "HTTP/1.1" + server_version = "NeoGuard" + sys_version = "" + + def log_message(self, fmt, *args): + pass + + def peer(self): + return normalize_address(self.client_address[0]) + + def body(self, maximum=16384): + try: + length = int(self.headers.get("Content-Length", "0")) + except ValueError: + return None + return self.rfile.read(length) if 0 <= length <= maximum else None + + def response(self, status, body=b"", content_type="application/json", headers=None): + self.send_response(status) + self.send_header("Content-Type", content_type) + self.send_header("Content-Length", str(len(body))) + self.send_header("Cache-Control", "no-store") + self.send_header("X-Content-Type-Options", "nosniff") + if headers: + for key, value in headers.items(): + self.send_header(key, value) + self.end_headers() + if self.command != "HEAD": + self.wfile.write(body) + + def json_response(self, status, value): + self.response(status, json.dumps(value, separators=(",", ":")).encode() + b"\n") + + def proxy_client(self): + if self.peer() != TRUSTED_PROXY: + return None + try: + return normalize_address(self.headers.get("X-Real-IP", "")) + except ValueError: + return None + + def do_HEAD(self): + return self.do_GET() + + def do_GET(self): + path = urlsplit(self.path).path + if path == "/check": + client = self.proxy_client() + if not client: + return self.response(403) + return self.response(403 if active_ban(client) else 204) + if path == "/blocked": + client = self.proxy_client() + row = active_ban(client) if client else None + if not row: + return self.response(404) + if row["action"] == "redirect": + return self.response(302, headers={"Location": row["target"]}) + message = html.escape(row["message"] or "Access denied by NeoGuard.") + page = ("" + "NeoGuard" + "
    NEOGUARD // ACCESS DENIED

    Connection blocked

    %s

    " % message).encode() + return self.response(403, page, "text/html; charset=utf-8") + if path == "/api/v1/neoguard/poll": + if not verify_hmac(self, b""): + return self.response(403) + try: + after = int(parse_qs(urlsplit(self.path).query).get("after", ["0"])[0]) + except ValueError: + after = 0 + with database() as conn: + rows = list(conn.execute("SELECT * FROM events WHERE id>? ORDER BY id LIMIT 100", (after,))) + return self.json_response(200, {"events": [dict(row) for row in rows]}) + return self.response(404) + + def do_POST(self): + path = urlsplit(self.path).path + body = self.body() + if body is None: + return self.response(400) + if path == "/internal/attempt" and self.peer().is_loopback: + try: + data = json.loads(body) + record_attempt(data["ip"], data.get("source", "drops"), data.get("detail", "invalid request"), + data.get("destination_port")) + return self.response(204) + except (ValueError, KeyError, json.JSONDecodeError): + return self.response(400) + if path == "/api/v1/neoguard/event": + if not verify_hmac(self, body): + return self.response(403) + try: + data = json.loads(body) + if data.get("type") == "attempt": + record_attempt(data["ip"], data.get("source", "relay"), data.get("detail", "authentication failed"), + data.get("destination_port")) + return self.json_response(200, {"ok": True}) + if data.get("type") == "command": + return self.json_response(200, {"response": run_command(data.get("command", ""))}) + except (ValueError, KeyError, json.JSONDecodeError): + pass + return self.response(400) + return self.response(404) + + +class NeoGuardServer(ThreadingHTTPServer): + daemon_threads = True + request_queue_size = 256 + + +if __name__ == "__main__": + os.umask(0o077) + initialize_database() + NeoGuardServer((LISTEN_ADDRESS, LISTEN_PORT), NeoGuardHandler).serve_forever() diff --git a/scripts/customize-glowing-bear.pl b/scripts/customize-glowing-bear.pl new file mode 100755 index 0000000..94cdc09 --- /dev/null +++ b/scripts/customize-glowing-bear.pl @@ -0,0 +1,524 @@ +#!/usr/bin/perl +use strict; +use warnings; +use File::Copy qw(copy); +use File::Path qw(make_path); + +my ($source_dir, $assets_dir) = @ARGV; +die "usage: $0 SOURCE_DIR ASSETS_DIR\n" unless $source_dir && $assets_dir; + +sub read_file { + my ($path) = @_; + open my $fh, '<', $path or die "open $path: $!\n"; + local $/; + return <$fh>; +} + +sub write_file { + my ($path, $content) = @_; + open my $fh, '>', $path or die "write $path: $!\n"; + print {$fh} $content; + close $fh or die "close $path: $!\n"; +} + +my $index_path = "$source_dir/src/index.html"; +my $index = read_file($index_path); +my $hero = read_file("$assets_dir/login-hero.html"); +my $core_welcome = $hero; +$core_welcome =~ s{