From 2aa4dfa0ab07a58b9dcbdfe0854216f5e82dc0e3 Mon Sep 17 00:00:00 2001 From: exzile Date: Tue, 30 Jun 2026 17:00:00 -0400 Subject: [PATCH 1/9] Add standalone Windows installer, uninstaller, and repairer for OVMS Introduce packaging/windows: a per-user Inno Setup installer plus PowerShell control scripts and a tray Manager that make OpenVINO Model Server installable, repairable, and removable on Windows without admin rights. - Installer (OVMSInstaller.iss): per-user install to %LOCALAPPDATA%, modern wizard UI with OpenVINO branding, existing-install detection with a repair/upgrade-vs-uninstall choice page, and caches the pristine package under %LOCALAPPDATA%\OVMS\packages\source for offline repair. - Scripts: configure-ovms, start/stop (process or service), set-path, service install/uninstall, validate-install, repair-package (verify + restore + ovms --version), and uninstall with a 3-way data choice (preserve all / keep models / remove all). - Manager: WinForms tray app (start/stop/status) as an MVP; full GUI to follow. - Bundles the python_on OVMS package (OpenVINO runtime, GenAI, tokenizers, Python) as a single version-matched payload. Co-Authored-By: Claude Opus 4.8 Signed-off-by: exzile --- .../OVMS_WINDOWS_INSTALLER_MANAGER_PLAN.md | 1277 +++++++++++++++++ packaging/windows/README.md | 43 + packaging/windows/installer/OVMSInstaller.iss | 315 ++++ packaging/windows/installer/README.md | 29 + .../windows/installer/assets/ovms-small.bmp | Bin 0 -> 38566 bytes .../windows/installer/assets/ovms-welcome.bmp | Bin 0 -> 618006 bytes .../windows/installer/build_installer.ps1 | 59 + packaging/windows/manager/.gitignore | 3 + packaging/windows/manager/build_manager.ps1 | 22 + .../src/OVMS.Manager/Assets/ovms-manager.ico | Bin 0 -> 270398 bytes .../src/OVMS.Manager/OVMS.Manager.csproj | 12 + .../manager/src/OVMS.Manager/Program.cs | 212 +++ packaging/windows/scripts/configure-ovms.ps1 | 75 + packaging/windows/scripts/install-service.ps1 | 46 + packaging/windows/scripts/ovms-env.ps1 | 33 + packaging/windows/scripts/repair-package.ps1 | 91 ++ packaging/windows/scripts/set-path.ps1 | 44 + packaging/windows/scripts/start-ovms.ps1 | 86 ++ packaging/windows/scripts/stop-ovms.ps1 | 38 + packaging/windows/scripts/uninstall-ovms.ps1 | 71 + .../windows/scripts/uninstall-service.ps1 | 13 + .../windows/scripts/validate-install.ps1 | 36 + .../windows/settings/settings.template.json | 16 + 23 files changed, 2521 insertions(+) create mode 100644 packaging/windows/OVMS_WINDOWS_INSTALLER_MANAGER_PLAN.md create mode 100644 packaging/windows/README.md create mode 100644 packaging/windows/installer/OVMSInstaller.iss create mode 100644 packaging/windows/installer/README.md create mode 100644 packaging/windows/installer/assets/ovms-small.bmp create mode 100644 packaging/windows/installer/assets/ovms-welcome.bmp create mode 100644 packaging/windows/installer/build_installer.ps1 create mode 100644 packaging/windows/manager/.gitignore create mode 100644 packaging/windows/manager/build_manager.ps1 create mode 100644 packaging/windows/manager/src/OVMS.Manager/Assets/ovms-manager.ico create mode 100644 packaging/windows/manager/src/OVMS.Manager/OVMS.Manager.csproj create mode 100644 packaging/windows/manager/src/OVMS.Manager/Program.cs create mode 100644 packaging/windows/scripts/configure-ovms.ps1 create mode 100644 packaging/windows/scripts/install-service.ps1 create mode 100644 packaging/windows/scripts/ovms-env.ps1 create mode 100644 packaging/windows/scripts/repair-package.ps1 create mode 100644 packaging/windows/scripts/set-path.ps1 create mode 100644 packaging/windows/scripts/start-ovms.ps1 create mode 100644 packaging/windows/scripts/stop-ovms.ps1 create mode 100644 packaging/windows/scripts/uninstall-ovms.ps1 create mode 100644 packaging/windows/scripts/uninstall-service.ps1 create mode 100644 packaging/windows/scripts/validate-install.ps1 create mode 100644 packaging/windows/settings/settings.template.json diff --git a/packaging/windows/OVMS_WINDOWS_INSTALLER_MANAGER_PLAN.md b/packaging/windows/OVMS_WINDOWS_INSTALLER_MANAGER_PLAN.md new file mode 100644 index 0000000000..8a0980cd10 --- /dev/null +++ b/packaging/windows/OVMS_WINDOWS_INSTALLER_MANAGER_PLAN.md @@ -0,0 +1,1277 @@ +# OVMS Windows Installer and Manager Plan + +## Goal + +Create a Windows installer and GUI manager that make OpenVINO Model Server +simple to install, configure, run, and maintain on Windows. + +The user-facing experience should feel closer to a local AI desktop server app: + +- Install OVMS with the required OpenVINO runtime dependencies. +- Include GenAI/tokenizer support for LLM use cases when selected. +- Optionally include Python-enabled OVMS support. +- Configure server settings during installation. +- Provide a GUI and taskbar tray icon for later management. +- Support start-at-login and Windows Service modes. +- Allow repair, upgrade, and optional feature installation later. + +The first implementation should live in the `model_server` repository because +the primary product being installed and managed is `ovms.exe`. OpenVINO Runtime +and OpenVINO GenAI are dependencies consumed through the OVMS Windows package. + +## Non-Goals + +- Do not turn `ovms.exe` itself into a GUI application. +- Do not install unrelated OpenVINO SDK/toolkit components unless they are + required by the OVMS package. +- Do not mix arbitrary OpenVINO, GenAI, and OVMS versions. The installer and + manager should keep the installed stack version-matched. +- Do not replace the portable `ovms.zip` package. The installer should exist + alongside it. + +## Recommended Repository Layout + +```text +model_server/ + packaging/ + windows/ + OVMS_WINDOWS_INSTALLER_MANAGER_PLAN.md + README.md + installer/ + README.md + build_installer.ps1 + OVMSInstaller.iss + assets/ + uninstall/ + manager/ + README.md + build_manager.ps1 + OVMS.Manager.sln + src/ + OVMS.Manager/ + OVMS.Manager.Core/ + assets/ + scripts/ + configure-ovms.ps1 + install-service.ps1 + uninstall-service.ps1 + uninstall-ovms.ps1 + repair-package.ps1 + validate-install.ps1 + schemas/ + ovms-manager-settings.schema.json + install-options.schema.json +``` + +Existing root-level packaging scripts should remain in place: + +```text +windows_build.bat +windows_create_package.bat +install_ovms_service.bat +setupvars.bat +setupvars.ps1 +``` + +The Windows installer should consume the existing package output: + +```text +dist/windows/ovms/ +dist/windows/ovms.zip +``` + +Final release artifacts should include: + +```text +dist/windows/ovms.zip +dist/windows/OVMS-Setup.exe +``` + +## Product Architecture + +Keep the server headless and add a Windows UX layer around it. + +```text +OVMS-Setup.exe + installs files + writes first-time config + optionally registers the Windows Service + installs OVMS Manager + +OVMS Manager.exe + owns the GUI and tray icon + controls server startup/shutdown + manages settings, logs, models, and feature repair + +ovms.exe + remains the model server process +``` + +## Installer Technology + +Start with Inno Setup. + +Reasons: + +- Fast path to a polished single-file installer. +- Supports component selection, custom wizard pages, Start Menu shortcuts, + uninstall hooks, and scripted service commands. +- Easier to iterate than WiX/MSI for the first product version. + +WiX/MSI can be considered later if enterprise/GPO deployment becomes a firm +requirement. + +Inno Setup is a build-time dependency only. The generated installer must be a +normal Windows installer that does not require users to install Inno Setup, +Python, .NET, OpenVINO, GenAI, or other runtime packages separately. + +Runtime dependency policy: + +- OVMS, OpenVINO runtime DLLs, OpenVINO GenAI DLLs, tokenizers, and bundled + Python come from the packaged `dist/windows/ovms` payload. +- The tray app must be published self-contained and included in the installer + payload. +- The installer must not download required runtime dependencies during install. +- PowerShell may be used for install-time configuration because it is part of + supported Windows installations, but it must not fetch external packages. + +## Install Locations + +Program files: + +```text +C:\Program Files\OVMS\ +``` + +Persistent data: + +```text +C:\ProgramData\OVMS\ + settings.json + models\ + config.json + logs\ + ovms_server.log + packages\ + downloads\ +``` + +Per-user startup, when using login mode: + +```text +HKCU\Software\Microsoft\Windows\CurrentVersion\Run +``` + +Service configuration, when using service mode: + +```text +HKLM\SYSTEM\CurrentControlSet\Services\ovms +``` + +## Privilege Model + +The installer and Manager must support a clear privilege boundary. + +### Machine-Wide Install + +Default for the first release: + +```text +C:\Program Files\OVMS +C:\ProgramData\OVMS +HKLM service registration +Machine PATH, if selected +``` + +Machine-wide install requires elevation during setup. + +Admin-only actions: + +- Installing to `C:\Program Files\OVMS`. +- Writing machine-wide PATH entries. +- Registering or deleting the `ovms` Windows Service. +- Changing service start type. +- Writing service command-line configuration. +- Opening firewall rules, if added later. + +### Per-User Actions + +These should not require elevation: + +- Starting Manager at user login through HKCU Run. +- Starting or stopping a Manager-owned `ovms.exe` process. +- Editing user-writable settings where permissions allow it. +- Opening logs, model folders, and diagnostics. + +### Manager Elevation Behavior + +Manager should run unelevated by default. When the user performs an admin-only +action, Manager should prompt for elevation for that action only. + +Manager should not require elevation just to show the tray icon, read status, or +start a user-owned OVMS process. + +### Future Per-User Install + +A per-user install may be added later: + +```text +%LOCALAPPDATA%\Programs\OVMS +%LOCALAPPDATA%\OVMS +HKCU startup only +No Windows Service support unless elevated later +``` + +This should be treated as a separate install mode, not an accidental fallback. + +## Installer Wizard + +### Component Selection + +Suggested defaults: + +```text +[x] OpenVINO Model Server +[x] GenAI / LLM support +[x] Python support +[x] OVMS Manager app +[x] Tray icon +[ ] Windows Service +[ ] Start at boot +[x] Add OVMS to PATH +``` + +The UI should present OpenVINO and GenAI as required runtime capabilities of +the selected OVMS package, not as unrelated SDK installs. + +### Existing Install Detection + +Before showing the normal install flow, the installer must check whether OVMS is +already installed. + +Detection sources: + +- Apps & Features uninstall registry entry for OpenVINO Model Server. +- Existing install marker under `C:\Program Files\OVMS`. +- Existing Manager settings at `C:\ProgramData\OVMS\settings.json`. +- Existing `ovms` Windows Service registration. +- Existing PATH entries pointing to an OVMS install directory. +- Running `OVMS Manager.exe` process. +- Running `ovms.exe` process from a known OVMS install directory. + +Install marker: + +```text +C:\ProgramData\OVMS\install.json +``` + +Suggested content: + +```json +{ + "productName": "OpenVINO Model Server", + "installDir": "C:\\Program Files\\OVMS", + "dataDir": "C:\\ProgramData\\OVMS", + "version": "2026.2.1", + "packageVariant": "python_on", + "installedAtUtc": "2026-06-30T15:00:00Z", + "installerVersion": "1.0.0" +} +``` + +If an existing install is detected, the installer should offer: + +```text +Repair existing install +Upgrade existing install +Modify installed features +Uninstall +Cancel +``` + +Rules: + +- Do not silently install over an existing OVMS directory. +- Stop Manager and OVMS before repair, upgrade, modify, or uninstall. +- Preserve `C:\ProgramData\OVMS` by default. +- If multiple possible installs are detected, show the paths and require the user + to choose or cancel. +- If only a running `ovms.exe` is found outside the managed install directory, + warn about the conflict but do not treat it as the managed install. + +### Server Configuration + +Collect: + +```text +REST port: 8000 +gRPC port: 9000 +Bind address: 127.0.0.1 +Model repository: C:\ProgramData\OVMS\models +Log level: INFO +Log path: C:\ProgramData\OVMS\logs\ovms_server.log +``` + +### Runtime Mode + +Offer: + +```text +Run when I sign in with tray icon +Run as Windows Service +Manual only +``` + +Recommended default: + +```text +Run when I sign in with tray icon +``` + +Advanced option: + +```text +Run as Windows Service and optionally start at boot +``` + +### Optional Initial Model + +Offer: + +```text +None +Add local model +Pull model after install +``` + +The MVP can start with `None` only and add model workflows in a later phase. + +### Finish Page + +Offer: + +```text +[x] Launch OVMS Manager +[ ] Start server now +``` + +## Manager Application + +Use .NET WPF or WinUI 3. WPF is the recommended first choice because it is +pragmatic, native-feeling, and works well with tray icons, Windows services, +process control, and file-based settings. + +Suggested projects: + +```text +OVMS.Manager + WPF UI and tray integration + +OVMS.Manager.Core + service/process/config/log/package logic +``` + +### Dashboard + +Show: + +- Server running/stopped state. +- Runtime mode: process, service, or manual. +- Active REST and gRPC ports. +- Bind address. +- Installed package variant. +- Served model count. +- Latest health check result. + +Health check: + +```text +GET http://127.0.0.1:/v3/models +``` + +### Server Controls + +Support: + +- Start server. +- Stop server. +- Restart server. +- Reload status. +- Open logs. +- Open model repository. + +In user-login mode, Manager starts and stops `ovms.exe` directly. + +In service mode, Manager controls the `ovms` Windows Service. + +### Settings + +Support editing: + +- REST port. +- gRPC port. +- Bind address. +- Log level. +- Log path. +- Model repository path. +- Config path. +- Target device defaults, if added later. +- Startup mode. +- Show tray icon. + +Settings changes that affect the process command line should prompt for or +perform a restart. + +### Startup + +Support: + +- Start Manager at user login. +- Show tray icon. +- Start OVMS when Manager starts. +- Register as Windows Service. +- Configure service start type: manual or automatic. + +### Models + +Support: + +- List configured models from `config.json`. +- Add local model. +- Remove model from config. +- Open model folder. +- Refresh/reload config. +- Pull supported model, in a later phase. + +### Features + +Detect: + +- `ovms.exe` exists. +- `openvino_genai.dll` exists. +- `openvino_tokenizers.dll` exists. +- `python\python.exe` exists, for Python-enabled package. +- `ovms.exe --version` succeeds. + +Show: + +```text +GenAI support: Installed / Missing +Python support: Installed / Missing +Package variant: python_on / python_off +``` + +If GenAI or Python support is missing, offer repair or upgrade to a matching +package variant rather than mixing arbitrary DLL versions. + +### Updates + +Support: + +- Check for updates manually from Manager. +- Optionally check for updates periodically. +- Show installed version, latest available version, package variant, and release + notes link. +- Download updates only after user confirmation. +- Reuse the staged upgrade and rollback flow. + +The first release should not silently auto-install updates. + +### Logs + +Support: + +- Tail `ovms_server.log`. +- Open log folder. +- Copy diagnostics summary. +- Show recent service events, if practical. + +### Advanced + +Support: + +- View effective server command line. +- Validate PATH and environment variables. +- Reset config. +- Repair package. +- Check for updates. +- Export diagnostics bundle. + +## Tray Icon + +The tray icon belongs to `OVMS Manager.exe`, not `ovms.exe`. + +Left-click behavior: + +- Open or focus the OVMS Manager window. +- If the Manager window is minimized or hidden, restore it. +- If the Manager window is already open, bring it to the foreground. + +Context menu: + +```text +Open OVMS Manager +Start Server +Stop Server +``` + +Keep the first version intentionally small. Additional items such as restart, +logs, diagnostics, model folder, settings, and quit can be added later from the +Manager UI if needed. + +Notifications: + +- Server started. +- Server stopped. +- Server failed to start. +- Port already in use. +- Model config changed. + +## Configuration Files + +Manager settings: + +```text +C:\ProgramData\OVMS\settings.json +``` + +Initial content: + +```json +{ + "installDir": "C:\\Program Files\\OVMS", + "dataDir": "C:\\ProgramData\\OVMS", + "modelRepositoryPath": "C:\\ProgramData\\OVMS\\models", + "configPath": "C:\\ProgramData\\OVMS\\models\\config.json", + "logPath": "C:\\ProgramData\\OVMS\\logs\\ovms_server.log", + "restPort": 8000, + "grpcPort": 9000, + "bindAddress": "127.0.0.1", + "logLevel": "INFO", + "runMode": "user-login", + "startAtLogin": true, + "showTrayIcon": true, + "serviceAutoStart": false, + "packageVariant": "python_on" +} +``` + +OVMS config: + +```text +C:\ProgramData\OVMS\models\config.json +``` + +Initial content: + +```json +{ + "model_config_list": [] +} +``` + +## Startup Modes + +### User-Login Mode + +Behavior: + +- Manager starts at user login. +- Manager owns the tray icon. +- Manager starts `ovms.exe` hidden. +- Server runs only after user login. + +This is the best Ollama-like default. + +### Service Mode + +Behavior: + +- `ovms` Windows Service owns the server process. +- Service can start before user login. +- Manager controls service state. +- Tray icon is still provided by Manager after login. + +This is best for machine/server reliability. + +### Manual Mode + +Behavior: + +- Nothing starts automatically. +- User launches Manager and starts OVMS manually. + +This is best for development and low-impact installs. + +## Runtime Ownership + +Exactly one runtime owner should control OVMS at a time. + +Runtime owners: + +```text +manager-process +windows-service +manual +none +``` + +Manager must avoid starting a duplicate server when: + +- The `ovms` Windows Service is running. +- A Manager-owned `ovms.exe` process is already running. +- Another process is already listening on the configured REST or gRPC port. +- A lock file indicates another Manager instance is controlling the server. + +State file: + +```text +C:\ProgramData\OVMS\runtime.json +``` + +Suggested content: + +```json +{ + "owner": "manager-process", + "pid": 12345, + "serviceName": "ovms", + "restPort": 8000, + "grpcPort": 9000, + "startedAtUtc": "2026-06-30T15:00:00Z" +} +``` + +Lock file: + +```text +C:\ProgramData\OVMS\ovms-manager.lock +``` + +Ownership rules: + +- User-login mode may start only a Manager-owned process. +- Service mode may start only the `ovms` Windows Service. +- Manual mode never auto-starts OVMS. +- Switching from process mode to service mode must stop the process first. +- Switching from service mode to process mode must stop the service first. +- Manager should show the current owner and block conflicting start actions with + a clear explanation. + +Port preflight: + +- Before starting OVMS, Manager must check configured REST and gRPC ports. +- If a port is occupied by another process, Manager should show the process id + and executable name when available. +- Manager should not blindly kill unrelated processes. + +## Feature and Package Strategy + +Use the OVMS Windows package as the unit of installation. + +Recommended variants: + +```text +Minimal install: OVMS python_off package +LLM/GenAI install: OVMS python_on package +``` + +Do not independently install unmatched OpenVINO Runtime, GenAI, and tokenizer +DLLs. The Manager should install, repair, or upgrade a matching OVMS package +variant. + +This avoids version mismatch issues between: + +- `ovms.exe` +- OpenVINO runtime DLLs +- OpenVINO GenAI DLLs +- OpenVINO tokenizers DLLs +- Python support files + +## Upgrade and Repair Strategy + +Upgrade and repair must be staged and recoverable. + +Package source: + +- Installer builds from local `dist/windows/ovms`. +- Manager repair/upgrade uses a matching OVMS release package or an installer + cache under `C:\ProgramData\OVMS\packages`. + +Verification before use: + +- Validate package version metadata. +- Validate expected files are present. +- Validate checksums or signatures when packages are downloaded. +- Run `ovms.exe --version` from the staged package before swapping. + +Staging path: + +```text +C:\ProgramData\OVMS\packages\staging\\ +``` + +Backup path: + +```text +C:\ProgramData\OVMS\packages\backup\\ +``` + +Upgrade steps: + +1. Stop Manager-owned OVMS process or `ovms` service. +2. Download or locate the matching package. +3. Verify checksum/signature and required files. +4. Extract to staging. +5. Run staged `ovms.exe --version`. +6. Backup current install files. +7. Swap staged files into `C:\Program Files\OVMS`. +8. Preserve `C:\ProgramData\OVMS` settings, models, and logs. +9. Restart OVMS if it was running before upgrade. +10. Run health check. +11. Roll back from backup if version or health validation fails. + +Repair steps: + +- Re-verify installed files. +- Restore missing files from package cache when possible. +- Re-run `ovms.exe --version`. +- Re-register service only if the selected runtime mode requires it. + +The Manager should never mix individual DLLs from unrelated package versions. + +## Update Checking + +Update checking should be explicit, version-aware, and safe. + +Default behavior: + +- Manual update checks are supported. +- Periodic update checks are opt-in. +- Updates are downloaded and installed only after user confirmation. + +Update source: + +- Official OVMS release metadata. +- For development builds, an explicitly configured package feed may be used. + +The Manager should compare: + +- Installed OVMS version. +- Installed package variant, such as `python_on` or `python_off`. +- Installed Manager version. +- Latest compatible OVMS package. +- Latest compatible Manager package. + +Update states: + +```text +Up to date +Update available +Update downloaded +Update failed +Update requires restart +Cannot check for updates +``` + +Update flow: + +1. User clicks "Check for updates". +2. Manager fetches release metadata. +3. Manager shows latest compatible version and release notes link. +4. User confirms download. +5. Manager downloads package to `C:\ProgramData\OVMS\packages`. +6. Manager verifies checksum/signature. +7. Manager stages package. +8. Manager stops OVMS if needed. +9. Manager applies upgrade using the staged upgrade flow. +10. Manager restarts OVMS if it was running before update. +11. Manager reports success or rollback result. + +The update checker must never install a package whose version or variant cannot +be matched to the installed stack. + +## Configuration Safety + +All configuration writes must be validated and recoverable. + +Files controlled by Manager: + +```text +C:\ProgramData\OVMS\settings.json +C:\ProgramData\OVMS\models\config.json +C:\ProgramData\OVMS\runtime.json +``` + +Rules: + +- Validate JSON before saving. +- Validate against schema where a schema exists. +- Write to a temporary file first. +- Atomically replace the destination file. +- Keep a `.bak` copy of the previous valid version. +- Preserve comments only if a comment-preserving parser is adopted; otherwise + treat files as strict JSON. +- If config is malformed on startup, show the error and offer restore from + backup. + +Suggested backup names: + +```text +settings.json.bak +config.json.bak +runtime.json.bak +``` + +Restart behavior: + +- Settings that alter the OVMS command line require restart. +- Settings that only affect Manager UI should apply immediately. +- Manager must validate config before restarting OVMS. + +## Security and Network Exposure + +Default bind address must be local-only: + +```text +127.0.0.1 +``` + +Binding to these addresses is security-sensitive: + +```text +0.0.0.0 +:: +LAN adapter IPs +``` + +If the user selects a non-local bind address, Manager should: + +- Show an explicit warning that the model server may be reachable from other + devices. +- Require confirmation. +- Show the active URLs after restart. +- Avoid adding firewall rules unless the user explicitly opts in. + +If firewall rule management is added later, it must be treated as an admin-only +operation and must be removed during uninstall if created by the installer or +Manager. + +## Model Download and Trust + +Model download can be added after the MVP, but the plan must account for trust +and storage rules. + +Model download requirements: + +- Show source, model id, license link, and estimated size before download. +- Support cancellation. +- Support resume when practical. +- Check free disk space before download. +- Use a cache under `C:\ProgramData\OVMS\downloads` by default. +- Support Hugging Face authentication for gated models if needed. +- Do not auto-accept model licenses on behalf of the user. +- Record downloaded model metadata. + +Metadata path: + +```text +C:\ProgramData\OVMS\models\model-metadata.json +``` + +Suggested metadata: + +```json +{ + "models": [ + { + "name": "OpenVINO/Qwen3-8B-int4-ov", + "source": "huggingface", + "path": "C:\\ProgramData\\OVMS\\models\\OpenVINO\\Qwen3-8B-int4-ov", + "downloadedAtUtc": "2026-06-30T15:00:00Z", + "licenseAccepted": false + } + ] +} +``` + +## Installer Responsibilities + +Install: + +- Copy `dist/windows/ovms` to install directory. +- Copy `OVMS Manager.exe` and supporting files. +- Create `C:\ProgramData\OVMS`. +- Create `install.json`. +- Create default `settings.json`. +- Create default `models\config.json`. +- Add PATH entries if selected. +- Register service if selected. +- Add login startup entry if selected. +- Create Start Menu shortcuts. +- Launch Manager if selected. + +Uninstall: + +- Stop Manager-controlled process if running. +- Stop service if installed. +- Delete service if installed. +- Remove login startup entry. +- Remove PATH entries created by installer. +- Remove program files. +- Ask whether to preserve models, logs, and settings under `C:\ProgramData\OVMS`. + +## Manager Responsibilities + +- Read and write `settings.json`. +- Read `install.json` and report installed version/variant. +- Read and update OVMS `config.json`. +- Build the effective `ovms.exe` command line. +- Start and stop `ovms.exe` in user-login/manual modes. +- Start and stop the `ovms` Windows Service in service mode. +- Update service command line when settings change. +- Run health checks. +- Show logs. +- Detect package capabilities. +- Repair or upgrade the installed package. +- Check for updates. +- Manage startup mode. +- Enforce runtime ownership rules. +- Validate ports before starting OVMS. +- Validate and atomically write configuration. +- Export diagnostics bundles. + +## Build Pipeline + +Initial local pipeline: + +```powershell +.\windows_build.bat --with_python +.\windows_create_package.bat opt --with_python +.\packaging\windows\manager\build_manager.ps1 +.\packaging\windows\installer\build_installer.ps1 +``` + +Expected outputs: + +```text +dist/windows/ovms.zip +dist/windows/OVMS-Setup.exe +``` + +The installer build should fail clearly if `dist/windows/ovms/ovms.exe` is +missing. + +## Uninstaller + +Uninstall support is a first-class deliverable. The Windows installer must +register a standard uninstaller in Windows Apps & Features and provide clean +scripted cleanup for files, service state, startup entries, and environment +changes. + +Uninstaller entry: + +```text +Settings > Apps > Installed apps > OpenVINO Model Server +``` + +Uninstaller responsibilities: + +- Stop `OVMS Manager.exe` if it is running. +- Stop any Manager-launched `ovms.exe` process. +- Stop the `ovms` Windows Service if installed. +- Delete the `ovms` Windows Service if installed. +- Remove login startup registry entries created by the installer. +- Remove PATH entries created by the installer. +- Remove Start Menu and desktop shortcuts. +- Remove installed program files under `C:\Program Files\OVMS`. +- Ask whether to preserve user data under `C:\ProgramData\OVMS`. +- Preserve models, logs, and settings by default unless the user selects full + removal. + +User data removal options: + +```text +Preserve models, logs, and settings +Remove logs and settings but keep models +Remove everything, including models +``` + +The uninstaller should avoid deleting arbitrary user-selected directories unless +they are inside `C:\ProgramData\OVMS` or were explicitly created by the +installer. If the user configured an external model repository, uninstall should +preserve it by default and show the path before offering deletion. + +## Diagnostics + +Diagnostics should be available before release hardening. The Manager should +include a "Copy diagnostics" or "Export diagnostics bundle" action. + +Diagnostics bundle contents: + +- Manager version. +- OVMS version from `ovms.exe --version`. +- Installed package variant. +- Install directory. +- Data directory. +- Effective command line with secrets redacted. +- `settings.json`. +- OVMS `config.json`. +- `runtime.json`. +- Service state from `sc query ovms`, when available. +- Service configuration from `sc qc ovms`, when available. +- Port ownership for configured REST and gRPC ports. +- Last 500 lines of `ovms_server.log`, if present. +- Recent Manager log entries. +- Latest health check result. + +Diagnostics should be written to: + +```text +C:\ProgramData\OVMS\diagnostics\ovms-diagnostics-.zip +``` + +Sensitive values, tokens, and credentials must be redacted. + +## Test Matrix + +The Windows installer and Manager should have explicit install-time and +runtime smoke tests. + +Installer tests: + +- Detect existing install and show repair/upgrade/modify/uninstall choices. +- Clean machine-wide install. +- Install with PATH enabled. +- Install without PATH. +- Install with Manager startup enabled. +- Install with service mode enabled. +- Install to a path containing spaces. +- Install when `C:\ProgramData\OVMS` already exists. +- Install over a previous version. +- Detect existing unmanaged `ovms.exe` and warn without modifying it. + +Manager tests: + +- Start/stop/restart in user-login mode. +- Start/stop/restart in service mode. +- Switch from process mode to service mode. +- Switch from service mode to process mode. +- Block duplicate start when port is occupied. +- Report owner when another OVMS process is running. +- Persist settings changes. +- Restore malformed config from backup. +- Export diagnostics bundle. + +Uninstaller tests: + +- Uninstall after process-mode install. +- Uninstall after service-mode install. +- Preserve models/logs/settings. +- Remove logs/settings but keep models. +- Full removal. +- External model repository is preserved by default. +- PATH and startup entries are removed. +- Service is stopped and deleted. + +Upgrade/repair tests: + +- Repair missing DLL. +- Repair missing Manager file. +- Upgrade python_off to python_on. +- Failed upgrade rolls back. +- Upgrade preserves settings and model repository. +- Update checker reports up-to-date state. +- Update checker reports update-available state. +- Update checker handles offline/network failure. + +Security tests: + +- Default bind is `127.0.0.1`. +- Non-local bind shows warning. +- Firewall changes require explicit opt-in if implemented. + +## Implementation Phases + +### Phase 1: Foundation + +- Add folder layout. +- Add README files. +- Add settings schema. +- Add install-options schema. +- Add install marker schema. +- Add runtime state schema. +- Add validation script. +- Document service/process/startup behavior. +- Document privilege model. +- Document runtime ownership rules. +- Document config safety rules. + +Acceptance criteria: + +- `packaging/windows` documents the intended architecture. +- `validate-install.ps1` can inspect an unpacked OVMS folder and report missing + required files. +- The plan defines admin-only actions and non-admin Manager actions. +- The plan defines duplicate-start prevention. + +### Phase 2: Installer MVP + +- Add Inno Setup script. +- Add existing-install detection. +- Install existing `dist/windows/ovms` package. +- Write `settings.json`. +- Write empty OVMS `config.json`. +- Create Start Menu shortcuts. +- Support Add to PATH. +- Support optional service registration. +- Register a standard Apps & Features uninstaller. +- Support clean uninstall with preserve/remove data options. +- Implement elevated machine-wide install. +- Fail clearly when required elevation is unavailable. + +Acceptance criteria: + +- Fresh install succeeds on Windows. +- Existing install shows repair/upgrade/modify/uninstall choices. +- `ovms.exe --version` works after install. +- User can start OVMS manually from installed files. +- Uninstall removes program files, service registration, startup entries, PATH + changes, and shortcuts. +- Uninstall preserves or removes data according to user choice. +- Installer-created PATH and startup entries are tracked for cleanup. + +### Phase 3: Manager MVP + +- Add WPF Manager shell. +- Add tray icon. +- Add dashboard. +- Add start/stop/restart controls. +- Add settings page. +- Add logs page. +- Add start-at-login toggle. +- Add runtime ownership detection. +- Add port preflight. +- Add minimal diagnostics export. + +Acceptance criteria: + +- Manager starts from Start Menu. +- Tray menu works. +- Manager can start and stop `ovms.exe`. +- Health check reflects the running server state. +- Settings changes persist. +- Manager blocks duplicate starts and reports port conflicts. +- Diagnostics bundle can be exported. + +### Phase 4: Service Mode + +- Manager can register/unregister service. +- Manager can start/stop/restart service. +- Manager can set service start type. +- Installer and Manager use compatible service configuration. +- Switching runtime modes stops the previous owner first. + +Acceptance criteria: + +- `sc query ovms` reflects selected state. +- Service mode starts OVMS with configured port, bind address, config path, and + log path. +- Manager reports service errors clearly. +- Manager does not allow process mode and service mode to run OVMS + simultaneously. + +### Phase 5: Model Management + +- List configured models. +- Add local model to `config.json`. +- Remove model from `config.json`. +- Open model repository. +- Refresh health/model list. +- Validate config before writing. +- Backup config before writing. + +Acceptance criteria: + +- Adding a local model updates `config.json`. +- Removing a model updates `config.json`. +- Manager shows served models when OVMS is running. +- Malformed config can be restored from backup. + +### Phase 6: Feature Management + +- Detect GenAI support. +- Detect Python support. +- Detect package variant. +- Offer repair install. +- Offer upgrade from python_off to python_on using a matching package. +- Add manual update checking. +- Stage package upgrades. +- Verify package before swap. +- Roll back failed upgrades. + +Acceptance criteria: + +- Manager reports installed capabilities accurately. +- Repair verifies required files after completion. +- Upgrade preserves settings and model repository. +- Failed upgrade restores the previous working package. +- Update checker reports current state accurately. + +### Phase 7: Release Hardening + +- Add code signing path. +- Add installer versioning. +- Add upgrade behavior. +- Add modify/repair behavior for existing installs. +- Add update checking and package-feed compatibility rules. +- Add diagnostics bundle export. +- Add CI packaging job. +- Add documentation for support and troubleshooting. +- Add automated installer, Manager, service, uninstall, and upgrade smoke tests. + +Acceptance criteria: + +- Signed installer builds reproducibly. +- Installing over a previous version upgrades cleanly. +- Diagnostics bundle contains settings, logs, version, service state, and health + check output. +- Test matrix runs successfully on a clean Windows worker. + +## Open Questions + +- Should the default REST port be 8000, or should it preserve the current local + AgentTools convention when used there? +- Should the installer default to user-login mode or service mode for non-admin + installs? +- Should the first version support model download during install, or should that + be Manager-only after install? +- Should we ship both python_on and python_off installers, or one installer that + can download the other package variant? +- Should Manager require admin elevation only for service/PATH changes, or run + elevated at startup? +- Should the first release support per-user install, or only elevated + machine-wide install? +- What package signature/hash source should Manager trust for repair and + upgrade downloads? +- Should periodic update checks be opt-in during install or only configurable + later in Manager? +- What registry keys should be authoritative for installed-version detection? +- Should non-local bind addresses be allowed in the installer, or only in + Manager advanced settings? +- How should Manager store Hugging Face tokens if gated model downloads are + supported? + +## First Concrete Tasks + +1. Add `packaging/windows/README.md` summarizing the installer and manager + ownership. +2. Add schemas for `settings.json`, install options, and install marker. +3. Add existing-install detection rules. +4. Add runtime state schema and duplicate-start ownership rules. +5. Add `validate-install.ps1` for unpacked `dist/windows/ovms`. +6. Add an Inno Setup MVP that installs the existing package. +7. Add explicit uninstaller scripts and Apps & Features registration. +8. Add a minimal WPF Manager with tray icon and start/stop controls. +9. Add diagnostics export and port preflight. +10. Add manual update checker design and package metadata contract. diff --git a/packaging/windows/README.md b/packaging/windows/README.md new file mode 100644 index 0000000000..059ea019ad --- /dev/null +++ b/packaging/windows/README.md @@ -0,0 +1,43 @@ +# OVMS Windows Packaging + +This folder contains the Windows installer, uninstaller, server-control scripts, +and lightweight tray app for OpenVINO Model Server. + +The first implementation intentionally keeps the full configuration UI out of +scope. It provides: + +- An Inno Setup installer that consumes `dist/windows/ovms`. +- A standard Windows uninstaller. +- First-run settings and install markers under `C:\ProgramData\OVMS`. +- A minimal tray app with: + - Open OVMS Manager + - Start Server + - Stop Server + +The installed application should behave like a regular Windows application. It +must not require the user to install Python, .NET, OpenVINO, GenAI, or other +runtime dependencies separately. Those files are bundled in the installer +payload: + +- OpenVINO and GenAI DLLs come from `dist/windows/ovms`. +- Bundled Python support comes from the `python_on` OVMS package. +- The tray app is published self-contained so it does not require a separate + .NET Desktop Runtime install. +- Inno Setup is a build-time tool only; users do not need it installed. + +The full Manager UI is planned as a later phase. + +## Build Order + +```powershell +.\windows_build.bat --with_python +.\windows_create_package.bat opt --with_python +.\packaging\windows\manager\build_manager.ps1 +.\packaging\windows\installer\build_installer.ps1 +``` + +Expected output: + +```text +dist/windows/OVMS-Setup.exe +``` diff --git a/packaging/windows/installer/OVMSInstaller.iss b/packaging/windows/installer/OVMSInstaller.iss new file mode 100644 index 0000000000..97c1d88346 --- /dev/null +++ b/packaging/windows/installer/OVMSInstaller.iss @@ -0,0 +1,315 @@ +#define AppName "OpenVINO Model Server" +#define AppPublisher "OpenVINO" +#define AppExeName "OVMS.Manager.exe" +#ifndef SourceRoot +#define SourceRoot "..\..\.." +#endif +#ifndef OvmsSourceDir +#define OvmsSourceDir SourceRoot + "\dist\windows\ovms" +#endif +#ifndef ManagerPublishDir +#define ManagerPublishDir SourceRoot + "\packaging\windows\manager\artifacts\publish" +#endif +#ifndef OutputDir +#define OutputDir SourceRoot + "\dist\windows" +#endif + +[Setup] +AppId={{9F35B167-C72A-4E1D-93E9-448CE4AE5270} +AppName={#AppName} +AppVersion=1.0.0 +AppPublisher={#AppPublisher} +DefaultDirName={localappdata}\Programs\OVMS +DefaultGroupName=OpenVINO Model Server +DisableProgramGroupPage=yes +OutputDir={#OutputDir} +OutputBaseFilename=OVMS-Setup +Compression=lzma +SolidCompression=yes +ArchitecturesAllowed=x64compatible +ArchitecturesInstallIn64BitMode=x64compatible +PrivilegesRequired=lowest +UninstallDisplayName={#AppName} +UninstallDisplayIcon={app}\OVMS.Manager.exe +CloseApplications=yes +RestartApplications=no +WizardStyle=modern +WizardSizePercent=120 +WizardImageFile=assets\ovms-welcome.bmp +WizardSmallImageFile=assets\ovms-small.bmp +WizardImageStretch=yes +DisableWelcomePage=no +ShowLanguageDialog=no +DisableReadyPage=no + +[Languages] +Name: "english"; MessagesFile: "compiler:Default.isl" + +[Tasks] +Name: "path"; Description: "Add OVMS to PATH"; GroupDescription: "Optional configuration:"; Flags: checkedonce +Name: "startup"; Description: "Start tray app when I sign in"; GroupDescription: "Optional configuration:"; Flags: checkedonce + +[Files] +Source: "{#OvmsSourceDir}\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs +Source: "{#ManagerPublishDir}\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs +Source: "{#SourceRoot}\packaging\windows\scripts\*.ps1"; DestDir: "{app}\scripts"; Flags: ignoreversion +Source: "{#SourceRoot}\packaging\windows\settings\settings.template.json"; DestDir: "{app}\templates"; Flags: ignoreversion +Source: "{#OvmsSourceDir}\*"; DestDir: "{localappdata}\OVMS\packages\source"; Flags: ignoreversion recursesubdirs createallsubdirs + +[Icons] +Name: "{group}\Open OVMS Manager"; Filename: "{app}\OVMS.Manager.exe" +Name: "{group}\Start OVMS Server"; Filename: "powershell.exe"; Parameters: "-NoProfile -ExecutionPolicy Bypass -File ""{app}\scripts\start-ovms.ps1"" -DataDir ""{localappdata}\OVMS""" +Name: "{group}\Stop OVMS Server"; Filename: "powershell.exe"; Parameters: "-NoProfile -ExecutionPolicy Bypass -File ""{app}\scripts\stop-ovms.ps1"" -DataDir ""{localappdata}\OVMS""" +Name: "{group}\Repair OVMS Server"; Filename: "powershell.exe"; Parameters: "-NoProfile -ExecutionPolicy Bypass -File ""{app}\scripts\repair-package.ps1"" -InstallDir ""{app}"" -DataDir ""{localappdata}\OVMS""" +Name: "{group}\Uninstall OpenVINO Model Server"; Filename: "{uninstallexe}" + +[Registry] +Root: HKCU; Subkey: "Software\OpenVINO\OVMS"; ValueType: string; ValueName: "InstallDir"; ValueData: "{app}"; Flags: uninsdeletekey +Root: HKCU; Subkey: "Software\OpenVINO\OVMS"; ValueType: string; ValueName: "DataDir"; ValueData: "{localappdata}\OVMS"; Flags: uninsdeletekey +Root: HKCU; Subkey: "Software\OpenVINO\OVMS"; ValueType: string; ValueName: "Version"; ValueData: "1.0.0"; Flags: uninsdeletekey +Root: HKCU; Subkey: "Software\Microsoft\Windows\CurrentVersion\Run"; ValueType: string; ValueName: "OVMS Manager"; ValueData: """{app}\OVMS.Manager.exe"""; Tasks: startup; Flags: uninsdeletevalue + +[Run] +Filename: "powershell.exe"; Parameters: "-NoProfile -ExecutionPolicy Bypass -File ""{app}\scripts\configure-ovms.ps1"" -InstallDir ""{app}"" -DataDir ""{localappdata}\OVMS"" -PackageVariant ""python_on"""; Flags: runhidden waituntilterminated +Filename: "powershell.exe"; Parameters: "-NoProfile -ExecutionPolicy Bypass -File ""{app}\scripts\set-path.ps1"" -InstallDir ""{app}"" -Action Add"; Tasks: path; Flags: runhidden waituntilterminated +Filename: "{app}\OVMS.Manager.exe"; Description: "Launch OVMS Manager"; Flags: nowait postinstall skipifsilent + +[UninstallRun] +Filename: "powershell.exe"; Parameters: "-NoProfile -ExecutionPolicy Bypass -File ""{app}\scripts\uninstall-ovms.ps1"" -InstallDir ""{app}"" -DataDir ""{localappdata}\OVMS"" -DataMode ""{code:GetDataMode}"""; Flags: runhidden waituntilterminated; RunOnceId: "OVMSCleanup" + +[Code] +var + DataModeChoice: String; + // Existing-install detection state, populated in InitializeSetup and + // consumed by InitializeWizard/NextButtonClick to drive the custom page. + ExistingInstallDetected: Boolean; + ExistingInstallDir: String; + ExistingUninstallString: String; + ExistingInstallPage: TWizardPage; + RbRepair: TNewRadioButton; + RbUninstall: TNewRadioButton; + // When True, the "Exit Setup?" confirmation is suppressed so Setup can + // close cleanly after handing off to the existing uninstaller. + SuppressCancelConfirm: Boolean; + +function GetDataMode(Param: String): String; +begin + Result := DataModeChoice; +end; +function QueryExistingManagedInstall(var ExistingDir: String; var UninstallString: String): Boolean; +begin + Result := False; + ExistingDir := ''; + UninstallString := ''; + + if RegQueryStringValue(HKCU, 'Software\OpenVINO\OVMS', 'InstallDir', ExistingDir) then + begin + RegQueryStringValue(HKCU, 'Software\Microsoft\Windows\CurrentVersion\Uninstall\{9F35B167-C72A-4E1D-93E9-448CE4AE5270}_is1', 'UninstallString', UninstallString); + Result := True; + exit; + end; + + if RegQueryStringValue(HKCU, 'Software\Microsoft\Windows\CurrentVersion\Uninstall\{9F35B167-C72A-4E1D-93E9-448CE4AE5270}_is1', 'InstallLocation', ExistingDir) then + begin + RegQueryStringValue(HKCU, 'Software\Microsoft\Windows\CurrentVersion\Uninstall\{9F35B167-C72A-4E1D-93E9-448CE4AE5270}_is1', 'UninstallString', UninstallString); + Result := True; + exit; + end; + + if DirExists(ExpandConstant('{localappdata}\Programs\OVMS')) then + begin + ExistingDir := ExpandConstant('{localappdata}\Programs\OVMS'); + RegQueryStringValue(HKCU, 'Software\Microsoft\Windows\CurrentVersion\Uninstall\{9F35B167-C72A-4E1D-93E9-448CE4AE5270}_is1', 'UninstallString', UninstallString); + Result := True; + end; +end; + +function HasRunningOvmsProcess(): Boolean; +var + ResultCode: Integer; + MarkerPath: String; +begin + MarkerPath := ExpandConstant('{tmp}\ovms-running.txt'); + DeleteFile(MarkerPath); + Exec('powershell.exe', + '-NoProfile -ExecutionPolicy Bypass -Command "if (Get-Process ovms -ErrorAction SilentlyContinue) { ''''running'''' | Set-Content -Path ''''' + MarkerPath + ''''' }"', + '', SW_HIDE, ewWaitUntilTerminated, ResultCode); + Result := FileExists(MarkerPath); + DeleteFile(MarkerPath); +end; + +function RunExistingUninstaller(UninstallString: String): Boolean; +var + ResultCode: Integer; +begin + Result := False; + if UninstallString = '' then + begin + MsgBox('An existing OpenVINO Model Server install was detected, but its uninstaller could not be found.', mbError, MB_OK); + exit; + end; + + Exec('cmd.exe', '/C ' + UninstallString, '', SW_SHOWNORMAL, ewWaitUntilTerminated, ResultCode); + Result := ResultCode = 0; +end; + +procedure StopRunningManager(); +var + ResultCode: Integer; +begin + Exec('taskkill.exe', '/IM OVMS.Manager.exe /F', '', SW_HIDE, ewWaitUntilTerminated, ResultCode); +end; + +function InitializeSetup(): Boolean; +begin + Result := True; + StopRunningManager(); + + // Existing-install detection: just stash the result in globals. The actual + // repair-vs-uninstall choice is now presented as a custom wizard page + // (see InitializeWizard/NextButtonClick below) instead of a MsgBox here. + // For silent installs there is no UI at all, so default to repair/upgrade + // (i.e. just proceed) -- ExistingInstallDetected is still set, but since + // the custom page is never shown/navigated in silent mode, RbRepair's + // default behavior (proceed) is effectively what happens. + ExistingInstallDetected := QueryExistingManagedInstall(ExistingInstallDir, ExistingUninstallString); + + if HasRunningOvmsProcess() then + begin + if WizardSilent() then + begin + Result := True; + exit; + end; + + if MsgBox( + 'A running ovms.exe process was detected, but it does not appear to be managed by this installer.' + #13#10#13#10 + + 'Setup will not repair or uninstall unmanaged portable OVMS processes. Stop the running server before installing if it uses the same ports.' + #13#10#13#10 + + 'Continue setup?', + mbConfirmation, MB_YESNO) = IDNO then + begin + Result := False; + end; + end; +end; + +procedure InitializeWizard(); +var + Lbl: TNewStaticText; +begin + if not ExistingInstallDetected then + exit; + + ExistingInstallPage := CreateCustomPage(wpWelcome, + 'Existing Installation Found', + 'OpenVINO Model Server is already installed on this computer.'); + + Lbl := TNewStaticText.Create(ExistingInstallPage); + Lbl.Parent := ExistingInstallPage.Surface; + Lbl.Left := 0; + Lbl.Top := 0; + Lbl.Width := ExistingInstallPage.SurfaceWidth; + Lbl.AutoSize := False; + Lbl.WordWrap := True; + Lbl.Caption := + 'An existing install was found at:' + #13#10 + + ExistingInstallDir + #13#10#13#10 + + 'Choose how to continue:'; + Lbl.Height := ScaleY(60); + + RbRepair := TNewRadioButton.Create(ExistingInstallPage); + RbRepair.Parent := ExistingInstallPage.Surface; + RbRepair.Left := 0; + RbRepair.Top := Lbl.Top + Lbl.Height + ScaleY(8); + RbRepair.Width := ExistingInstallPage.SurfaceWidth; + RbRepair.Height := ScaleY(17); + RbRepair.Caption := 'Repair or upgrade the existing installation (recommended)'; + RbRepair.Checked := True; + + RbUninstall := TNewRadioButton.Create(ExistingInstallPage); + RbUninstall.Parent := ExistingInstallPage.Surface; + RbUninstall.Left := 0; + RbUninstall.Top := RbRepair.Top + RbRepair.Height + ScaleY(8); + RbUninstall.Width := ExistingInstallPage.SurfaceWidth; + RbUninstall.Height := ScaleY(17); + RbUninstall.Caption := 'Uninstall the existing installation, then exit'; +end; + +function NextButtonClick(CurPageID: Integer): Boolean; +begin + Result := True; + + if (ExistingInstallPage <> nil) and (CurPageID = ExistingInstallPage.ID) then + begin + if RbUninstall.Checked then + begin + RunExistingUninstaller(ExistingUninstallString); + // Hand-off to the existing uninstaller is done; close Setup cleanly. + // SuppressCancelConfirm tells CancelButtonClick to skip the normal + // "Setup is not complete. Exit Setup?" confirmation, so the user is + // not nagged after deliberately choosing to uninstall and exit. + MsgBox('The existing OpenVINO Model Server installation has been removed.' + #13#10#13#10 + + 'Setup will now close. Run it again to install a fresh copy.', + mbInformation, MB_OK); + SuppressCancelConfirm := True; + WizardForm.Close; + Result := False; + exit; + end; + + // RbRepair.Checked (default): proceed with repair/upgrade as normal. + Result := True; + end; +end; + +procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean); +begin + // After the "Uninstall existing, then exit" path triggers WizardForm.Close, + // skip the "Setup is not complete" confirmation prompt. + if SuppressCancelConfirm then + Confirm := False; +end; + +function InitializeUninstall(): Boolean; +var + DataDir: String; + KeepEverything: Integer; + RemoveModelsToo: Integer; +begin + Result := True; + DataDir := ExpandConstant('{localappdata}\OVMS'); + DataModeChoice := 'PreserveAll'; + + if UninstallSilent() then + begin + exit; + end; + + KeepEverything := MsgBox( + 'Keep your downloaded models and data under:' + #13#10 + + DataDir + #13#10#13#10 + + 'Yes = keep everything (models, settings, and logs)' + #13#10 + + 'No = choose what to remove', + mbConfirmation, MB_YESNO); + + if KeepEverything = IDYES then + begin + DataModeChoice := 'PreserveAll'; + exit; + end; + + RemoveModelsToo := MsgBox( + 'Also delete your downloaded MODELS?' + #13#10#13#10 + + 'Yes = remove everything, including models' + #13#10 + + 'No = keep models, but remove settings and logs', + mbConfirmation, MB_YESNO); + + if RemoveModelsToo = IDYES then + begin + DataModeChoice := 'RemoveAll'; + end + else + begin + DataModeChoice := 'RemoveSettingsKeepModels'; + end; +end; diff --git a/packaging/windows/installer/README.md b/packaging/windows/installer/README.md new file mode 100644 index 0000000000..8caadaa96f --- /dev/null +++ b/packaging/windows/installer/README.md @@ -0,0 +1,29 @@ +# OVMS Windows Installer + +The installer is built with Inno Setup from `OVMSInstaller.iss`. + +It expects the OVMS portable package to already exist at: + +```text +dist/windows/ovms +``` + +The installer adds: + +- OVMS files under `C:\Program Files\OVMS`. +- Data folders under `C:\ProgramData\OVMS`. +- Default settings and install marker files. +- Start Menu shortcuts. +- Optional PATH entry. +- Optional start-at-login entry for the tray app. +- Optional Windows Service registration. +- A standard Apps & Features uninstaller. + +The installer must be fully offline once built. It should not download Python, +.NET, OpenVINO, GenAI, or model-server dependencies during installation. The +OVMS package and self-contained tray app must already be present in the +installer payload. + +The uninstaller stops managed OVMS processes, removes optional service/startup +configuration, removes installer-created PATH entries, and removes installed +program files. Data under `C:\ProgramData\OVMS` is preserved by default. diff --git a/packaging/windows/installer/assets/ovms-small.bmp b/packaging/windows/installer/assets/ovms-small.bmp new file mode 100644 index 0000000000000000000000000000000000000000..134821c273cd2563f8ef42f098f793da90c3560b GIT binary patch literal 38566 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 literal 0 HcmV?d00001 diff --git a/packaging/windows/installer/assets/ovms-welcome.bmp b/packaging/windows/installer/assets/ovms-welcome.bmp new file mode 100644 index 0000000000000000000000000000000000000000..b32e7c5dd10f75a513875429849532754311d602 GIT binary patch literal 618006 zcmb@v>6fKdmG0}g-_Dmi#`#b-beR#6nP5jIQd(A7Ri_kzY@*GUE(PhNQNR`uq)QMR zNLx8Ic*;kbt5hN+&8k>ZyC~`EtkkGw##Oxz>8$y(96Aduyy(W3FcJh;;CK zpJ&ds_KuHCy!ER8{1*P-2k`$V;s4kEr?s2mnk^5n-lVqq;nirHcCOyMb4|2eYqsoEL(sIXhB(|O*`e>h4-OhhQYqt&fE9C^Y*{* zTr~veEuMPb{!`g2*uHq`_C-!AICc904%w@H%>6+QKX%aVeHn0g{vkCiIcWRCS~`5{ z1q1E;ftlFzNNoN%f=5nuk6>uSYNs7J_2X^BYCCM=3!Av?!Q}AvXwD;Gd!PDtGG}6g zwjI$V-qVwQ^SS}6@4FCtxQ*?i!IrB-mh{?-j__3%9ytYp--koLk0!Z+4I83qa~+oX zp+Rn5)2t%yHNV@@_vA|+aj;r%;(pCVnB;s8_5K$hS<`QiuDN)iUGnIfXpgPAJhNbMVp>mF})XUOg-Zn z4p+>~ciX~>nQR*uR-n!7W503V%C>FVw{p||e%ri%CEH@R9jL=C2UZSm2Ul)U+j?*% z+adLiJ;cmlJG^qM+P1^15Nu;x)x@4r|H#U1Y*ISA#ZzR^xUJgN3l9`?xUmUwe2wt(JR>Q;IUBzY>$s_ z|K;fUkG}iDht_Pme`M{?M$WuvwLm=DuL!;vl544@56K&fyI=O4q&xFZcdJeeXJvOC=Cj$aJ8K$~z zdUnP1o)y!xV`?k-SU|(1f|M zqv45xc)y2wfOxon5^-lWhRe$yZqQ5EtDSvd zq|**+h<>1*qnUFKjj$b5@3`~?e9fic`hn54_l%rDu9vHgoO!Qe(k-G3+93MAfI8>~ z(U^Q704L_++C8Ce=w1Ttv5B2%09+EUo>04i;zZj}n`p)bZQ+a|L1r79p3Au58jJ(y z!3Mx#0|+%5U@tL(25QE=X0#UwFX>LSVGlO532M6n1D-KhhE)i(1M?LETy&fF#5t)a zwvH79#dZ{lxhF||2XOOVs4t{9fVap4PY)fGz66Fk(dK3>l~u>t7Yx0p438QVTKUiz zXuVYr(K9G4V;Dqp9&s6Zk7v{qUN;EzeSZTtK9cK}}` z&Y0;ij-lx;fzi$$fS+BUMnDB$a|!iYT>ot3jMVE8ZqQxOPRWLLchR<3cew5dcj~o; zyDQma6Ax3b;pBsB0#3RObp$}WX%=qwh3h>lre;@6sZX>!k}a_Y>{4x`os1J|w-)CT z%i9BI1K#C&CG9=h0(u~9mN|o%J%DvDio^CporCC#b}&xu&PIe4JBVH~P06&xf-bg(6dM-Dwzfomaw5kyNwIr49Ie~5lPKBU|)#ll9(+)0sO3H-f>+@-b1*pw_uLri2EtbGf^!C8%L~yCL^Pl- zVqF5`9B50p3)&HwYx5pTE!ZA7Re88DaD#@MaAOby?E>7I3@+hHT>6 zr1$71<}Kh|(gX7j*Yx4gYd7jOt$3r?#fnR>*CHjqA6y%4at+2&d~>>Oy)M0#y7rwc z8 zvKO=~*9CAh4tUd?cjUVTT%J4>{Lzu~P)L7Jbu;JJiFWJ5L$A}2Q?KtE1=q^2jkfv$ zsF7LMEW5aIR@5QWE}$t0)o!e~Yw6inx>LKmP!~fUPzTopTv@gRS_QP>R=i}~L-Oke z>Wx5no^&&aL|XyVY8h`#W{MrjwQ6N_>5*SM<2K9DTeaN>&Zc;P<%aaYxk$DGPExFc zXsb35D+(^$yeh;xq!;Z@DqD&Hpizy$drEJ#(K8^eu{qx=h?eq-P46`6^xK$p1Dl2D zcD}c&HxcFoEa%Q3ojchotzda;N-$%qd6`k*4eZO1u|-*voF~*DVT& z^Cf;CLyc`A*)7^hw-wxI7r+@L)FI_4us^!G<(j3lQWdve|4gN`ggOi30vQ>1NH)bf zO5zZ1;4B|*sC#I`geTWB;qc*Z%(6qcqkwi4u0yXW)}7jTshdS%oFMmF73(73DvYyq z<_dWcYX%*$mI*IhOQ}PzJFz7@#M(aGiMIQ2-Atb|>6Q;K8htdPt>cAj!`t>iCWv;y zJn*D~2TjDE=A1iCeFARqV_SJ)1PLjzHM#kQ#+KW>)U0BuSp{FYC*8OR<J_<%O$szXuYO(3w>HSq>opfYxMm|vwe;Fn9AX^>G^N-y z6 zg1CIE?xf_Kq&KZM>@108@hhmwBf(^E1|`Zdqj{5CXT-8-O`@@_1GwIhlc3Uj0&`>A z5)E>LSqJQ)(UfUIy>I!}eTpsFWwVC~xQWI~D%y!WXXMOFP>ec*hHJ<)p{5UC-l>W= zXj8231Z%7`W033(lxeterqyf;>VcQ4;x)_G{gw{b zz`SPJy3>LoFSk&{T@@$YK-j(LHq=XTEvQ${%&!FFI_=8jI#nAE+%2J2er?HaguCdq zvuqR1{-`aiI1o0)r7trOVow%jufdWE-Xb589f*~4aOpc>4~y>9TiRV=><-)c5+f+B z0L}ocHA@(JHJJ5MyQhP5%kPlbM5AXQ^u)4;m@F`MNN;iO>}mIBENrFSF+-e9F$0M& zhoQnU=U@}Gmgb>)yc?Fh%D5~!ZhKh;ZXnKl4)g(U6+>qsW#5CnQN14Dz(Hqt+-0!;JR~1CEa+}iUVrv_1HKQ?WPHEp{;}L^x;t+&*XY? z_XuJu5z--K{MT znHILx?!s@0OHh_FNWIQLKg9rMhHjQ=+6$OWd@ z=RmLo*D1=$Y;FTwB-&^31VXV1REwU#8fL9qZg=A7}c0uJvDv978O z;g05FT5^pS2K5dai~i<-KQeMoa$WU0RJ%bNIJ-O^S$058z%##&z~@|I94z;0<1C}m zhfAz+)CH(J1vIF(uBIr<#%0uAmfiU99)i@kq>4A_8!6oa0Y)aZ7j9S_Eh3E(Z=fFQmH`J-@MmP;XhwFlQ3wUeG9b3U4p2Y0FU+ zAL7rec8gZ-L68Wy)R)P`xe@my-DnFy(_N&z!cMe9)`dBT6B*CE;Vd_9 zz?EXBUOUn5W!bG2j{;f)HEQ5pu1$3I5Nn-w31>3Sfalk#+C1&bm@Katl3APaKG9^{ zLs5JHJO>rPBqJ!L6E&Cm04>kd~&^D*ZI8bH7(6ky}KL@ z32$oS!}WSN;HF+|7PL!Hfc={TliML(w8o6tG_5VOh03zQK|4eYJiRmbhp?JuUWOOW zv6{?sk}sqjYtI1D$#P=b0X%iNLppbgUu!NIZvoGxx~dK2H<1@~#NYIJXFWunnnr!8>>FG&`#y{hj;+4v0qFJUnc_O2ZqTMu zlj|_yI`b;|bq36`aZRN$s8$F{{!Gw=ZdzT3DQu>Ya-bpbjV~wC|21#W3&TsyK!Mlit{}M zGM@>230aP3LcD{$bPwLZmIi(Rb5YD!ZP}+)_aZciCZ6fB8-$bAT+MBo2c#kEf|q-8 zKKKoIO|GyFgf&CP1+N5}FX5_*E~>3p750sJr$?&Z1$>Az$A%8qRO-|3Sw4vN8RGg3 z=GU2JL$7(@6^6X%bt$9qTB-E9Im;&6rF0g;EwS!!ohi1f;xOcN<3+e}+Qr+XbmJ_e zHCDU`H^myQe5Spe^Cn)fC`t;Z~n@Gbh^A>z3%@X!C<12AupFZ3e?! zy2x!YcTBp4HiiVyX!j-sdzEbO>`fkR2;BJQaOrLoP4C}d^KPSE_$}&O=8Y|1Ykmu@ zAeZn4tqlAeD3eCpFT|_36K~S&7t2BPzMKzuIb;jyAk!YAH--^-L-Yl0y{fac^vu?U zK%2md*%BCVtFTxm(QPx%-5IEM3U|WZ5beCX?G1S5;O5&kV3nr<9Qt%_Mqw58y! zQYX}dboV41bo)3vQ|!(MyHp!5CVb_L(&_?o3BrfBT#H|l-fi^ZC9Rflx2iozaXUkV z3(E?^e&;07Gv-TW--YG>4br8&@j}3bAK@8FYVsK5VkuZ|m!!f1GxwW2&$9<;R&c#f z;4B!uQya7=Cyi=d)jTFE!nqTB$|MN&aA{PB5nY%S#g*mmuwZMzF)Tq@>I9Wy(mk&R zuIB@7BTxJx>sEFLz24eAn1CN1Ir}iUK4peJTwEvJ!F6WY^`?p>n_?Y$U9I>~uGazT z;9Au)5l!JPTqEeE*eTf*>kia;sJ(kdsYcz3#a2l{0fIkz6iTe6#yxKF!W6{jI@PrC*SXnCB?+V}%whI$>7Yn){}#g-cv)WwQJtg97opw6l| zDW+1hF;G=JiDu~x7te^Z8_^zsx+-w83)Fo#4zvdh zdDw5W97M0$ynhvS{BIzdiV5hjv-AZ?PnMxJ#C|Dw2W@Yo{^||eSDD|=%MI@U>}I*; z8gT)*HJ(N%S~;ZO6?}4j$C_guxN`7AD2dC5-`jAVlHC;02sIm6rer7AL_2-BgHB1DdRB0D zJMF4f@lb6`HVfk`)ZoTjs96lBYNJ=9ObcoR#yNt7TDM7)<=`4(oinoHMXAZP>t_4_ zNT6Mz7SYVL(NeNaH@GI@!H5CC7#65}50dY@v-EqfLa9 z<&n*MV;EfLtNcFfn?{yJcXC}x-zu&@{=k}5vfigwR__l8n!vg{yDcqKhRE;zSA*RD&l!6OK@cANJkG#$IeT5OVKL#oLb z7V5cVT1_tB7UEl8#i94`CD^I`BD!E(f-b^*+ul-Vm_!Th6(X8F2{p?Cya4N^-jJ^X zygimhw~59o&9gOHJ!4z$(Bdl7VwtX+*qZKnZsvXl5?`%awE=Q8zr;gtD@!#n&Ui@) z$Tb^g+)KDqzAzO}!pgK#Lk$ zgLb3WQtgMDl6bdtwt-NGQd_c}T#rYJ9oij4Te4HHi)07U4cCNPR-A6UZ9VVZrq~kh zBG#7gj!Y-lA=W9`C9^)7AqS6i0pk{Wd>xeVl&r?wudB62op&MIaBAG z7p4Tq=I$^B+WX0}w}q+}JoP0`gtyEbg=O*^x;(bIqtSS|WtxGOLVSsBwn8)lw?64a zIAmI{0*Ts5ey!bogah6#!kd%j4%(Omp#^QnOCp@SSE!qry&1PeC)ZuT<=Y3!=0(Iq z!GZiiaeY7Znp^{FH|EzB?Q&z>sx8Sb2iXEVE}kjBW?ZXh_Tl=b1y;|-R6|RydAYPH zj1M`>2Hm<`YNBDwTeJ(&hPsRP@X}eJ?F%Y>x^2a4em$Vq1@J&Sp|%gF36HjF(}LQ* zRU7xMg0=3o&B&?MJWo_J-KLJW)p9HiX{~~r^xP)8gY?8O&`#C%5N}&~_m2?%L9|x6 zN6nixG`5myDtm0mAc*dxEq)1m2HpU)W72^i2;@CT=Z0t!Zb4l@CfY_7`wO$)6GOc! z_E>6-Huihi?UzIt+XhrSAQj+4fj!D3S%xS>pfi{s*#wq*tr6}n;7-7cf}8j1(zhN& zN!)r(AO6uSomJH?rL(w!MznQTyh?V_>zZo^*JEp2z2&r&7nqK#C7{fa7o1%`DlGVvp&xD-OI^8%JThoOS_f z>2;NCuuMZPsM*_!XTOVq4SDn+8uBf!YgN2KTULDK)SiUe`8BP0w`eB7jkCo%B)hBE zh3=YVw~6*3;FvMy3@q8csnU^eAQ?m#H!jHrCQU1Jx07ugTnq4=7oL6-)7Ob@&eNg? z{+%D%6Kf~Pd~>~<(T=P+NvDF#a%eu)IncIVQ;zl8?CUT=7SV-k;|#`IU^B*~$t{67 zRn{zKb3*`bkTHp1tmCl(>B49r>^Cvjn#ayUcL~IGKy7&0hYB-DqQ&pt<)qj|XAcz? zyxxFS4mmSN*dtEZi)2Sit_Ov)@5sRyQo-?e4GymU`2DAJxK7pXTJdVavvgL^vH`W5 zO*nkGthh}0{b|K@=2d;TR2v{yt|QB~UJr2HgW86?h1$ZMTvN5-x&d`^O{GRLTvoiE zb|JY2*G{o@OT3SE*3Hayh1w>3s1*m!f;yZzE96UZt#Vl>zfSQjEWc?0)^g9{s?BVg zQLqI|MSokCrOqTh(GK>zLrl8mGeOQd(H5|QdBW=<`czv7rB_f^izsJMC^pCi=Mp5* zMTjfWJ%nSpNeFLR7(?sG_dJJOHMt5fG`20gh;xz}&3G@H0>O)+Rog5lzW~{!n`j|# zU;}?{NXE4%t@vC(E$T)3Al=DzKpi?RH!iL(0M`)WAJd1kWpd2`b+ezMbcPgr^mOdW z!no0{)ibEJ^jiJc+WXnov5nG-6K$zB^XrZk?^MMzzlLN>wNt5W$N_TZ*S#!z(25sB z9@R6j%m(2;TItMy*DM=)JrruNJlv44+PKhf#d|wQz=gR4+Fa9(dl<*r!Kv$MW~$pK z$Rs)ix(xtzETuCS!m&Bw?Y%b8&i84D8HZ}OLqM8Pi{;+1sBn^=2y1g$9TEWH6-3WU z%|7Wi%MH+ye5&ijAV$D|H#1T8=d&#h{WPbKbye#$3lt1-bG|mdPx+W-CNT0ED$+ zNsyCqa_TrihSQ$IOrmX^dqdOhN%RU@z$@A<OTUGzFsd$b6*kGk3eFD2Tw zbQYIOBgHn_x`Adx-c-+Oemw}aYvWYyMz4cz-cgZWmkXtFDaBV)BERmSy;9XPft*&n zK+U3=0Iz4+qPRo%{K{!V-SjM)&97ox&?iA4(2PsN)f8632{i)d*EtlnJ^7YKYfp-` zL1vHrgr!e(k{-l0h!xBSmo!5KUt;NhciyO)R=l$Kudw5ivfEW6cf)y*o`0GyItE}qqME~+-fy51&TDK`$5g>&r(xYm8MzGNHf zCcm~DXHIP^o`yWQCeBN7O{FI3%(4sM&aVgRS>B{I(wZM~ZrcOT$)1X_Q{teJs&Hl%aae_MfQn^|p+xJt0;4z#Vp-eYT> zF$G#Jh{imL_GAE_Am`8sha4A;7Pg)Y+0{~IIiTLCRrb(g%5nA)P@^|$3B7{l8_6%? zKpTPErdiIE`EcysmVgi88p54iL$6Qo>opQ>psoB`DR!tfOXAspGh!QZaNW?I1vF~6 z677JRchA~W>{M+f+AB6ZM5Xp!arQeEce(EPaMQgTP?PHk;|$ei^-PS*gip3s+;Pu@ zyL9H>_8WbHy3y-S^=zPMrUS3g?gBLxybYV;#H4ApL-E@%_p zz1V5e?WH?ti{cSbY=i@95RI8c+rbdbrPQvRV>K|x$FUErK3{b+aDCcS+aJLp>;_ zBHAjSr~-sX-?ilrm*4b@@#_{&n4x;+QVq(a+4Ke=Ikx%GySF?!^O^ncJO`O9t#!iN z#sP0Gm7zCtn1IVvxBRwoz-z_}(Zn`b7O-V#Q|%?kQf+zcmgS1D0VnU4VB_3EU6vB+ zme%E^L1iP^F!P62ZTj7rm;QOj_a6E1r$e=qLB3&$OORYI zjBb4Nl&!Ds`0nD#7wjA5Gr_2~fnQE|+4yl4&BW(c04X)vs}kQO&@R$UigQm8jW?nF zZi#kW&<;5!&TSi_&MnJr3^vEm$R@!@Ji5{NC)zE`h})quXi&^a=r3WU3Xc+7yu87d zO9MksN{;)y6Y3P`0(b;c?arjEIA-k3NxfT|^G*9lwk%SwgX_K(PqC&CZ(8x;4!YOH zlWSz$r7AvzYgfhBJxH9_yHB*M50@1mazO>P@rpK}2Hm#e*6Rjsi}li~9g=Om7S2eh zeS|%;SNsC%Jts`;T`>uk)lewoDfaBL$=TyJ%pN~Jw`?3=gJ${OJ32FW!Z^u25l_+S zy~`&MsFH@^)EqV+KR%C1z>YuR2gAH_qcs{|n6~%$$-T!<%%3o^Z*$EnRa?kFEQFAT8xuo z()~BJ+1!S}4KECMOAsbJ=et8E-Fg&I!4vSH8;qOl`-1B@zfL#KlP{WZ+!Yt#iFVcN znFyE}VSv-mysv_bPzDaen#uQyV_<+!Z^XzwEYOZMq)+ zg)HDJ8b)V+{!iO}x#`-yU}4$RFHgVd@wL|gXMQR1^2y(hU;f+`w?F@h+n$*C!aV+h z#=AECdgjyn-gWjqd~@2^#=|FVeE$4vpTF$(=PthO$iH3z%=euz`P7*gKYzuJ=Pudt zi!(m?6uSGcljO9U%KNL>pnL>y5;ecw>>fbS^PLax_|l1 zlV@Ch;DeXp`9NPiHucoTs}6kN@`aHp4ChBS{`>=HJu&r#*=1WC%;T&7_`emeT^%}c z=Bcfp-}laQ7NDNTPd|F{mgg?`;&YeXfq%|Z=iI!o>Ks1Mq}TZNS2qG)=}v4zj(bDP zu@I&}OPWEnxaKedDX;Zcz$WQso*tXovG*8Bvn;5M_EKCM;R>%_-VPl{--UN}`3%V2 z6FuPNaIjhBy9&Mu-~T|pUSqum*Qd3T&5wb&bQa&V;L;iEX3Yf^4oiM5sKK>c_2Is$ zGR%$VMR5qX@1ChvmRUB%I??8Fwob9lHSG8Ju9XvL>WP25@RiT)c7hnC~f4VsT?h6)zPs<_^XEsW53ZPc^>aI(x$LgTKXeHpy7bEnE4Kb_?M1Kdxcld) zfBIJ+zWBAz-tvF_c-MjVeR5%xsKT@_9y9*et8e|w_h)~->H434=%QCYd)w2Oe`8_! zrupSFzx>Cu{-2-R|Lb$U4w0p+x7h~NqnjRm=f*$Zbk_@?`S!0jeEQcPz5IobU;pPj z?|yv!wR?}9IP~7l|MA~`@Zya>`uRt$`pxN=zH!@k9$$Ce-nXy+<9VO{({ z7V2_M#j0&9Zm5H90wed9MJ+ZbqccHA;2iGDU>WrJ@;QIBO?%4nLpPM~l?cTAe zxzVXdPu}?2?cbSSeevvZ>-H?0Jg{Qj>o?!E|AW^oj;?*}v$wr;-FF{Z_k|-Tj=%E7 zJ72!xTl-JF?C?9sU;ffvb0?j@=kGqc=N;>2-*)EwvWZ9DxB0~zzq$XtAA>4Av;O>N zKlP2B|7FAMJJ#-b+q${8uRA!l{*9aNJoMq~_a3_r&i3*5&iv)ye{|r~PeKsw+ZT@= z|MRDB`_(7zntj_kIN`%%<8R#Zjf4OE+4;Ax{nI7azHsTCf4t^v3nzUH3eNp<)ccoD zy#ARRe|!0NX5TRhUSQ*A-!cB=znt~@SAV?l-b)U>d-|{6{NaHQT($Su4YS8g{Py3@ z{o{>4cx=tNFJAwR*^#qn|L)8^Z(Be2*0poTPyFs5&wKu}-`+cRHcSP$e&rK4AKq{y z()qdLrk>w=#p^eI=TBewZ}TTzuz-|g+03(RxBvdSyLTPC_1QDeeI8E(ay^6he|G%h zH}3lBt9Sfl;oaL0jZXaa%inrz^2R-HT{m~a)a(gUd;V@6o`iq+(hujBZ=D~TA+z{C zXR{o12gpgZ(Pl4@1#jg&Sq`pKe3@m7Sp|ZXhg6Yb2hvuGBoZOK-0 zea6p(GgUj3T2@?uOR0Is>4cFVPHrxYumU!Ss)dJT0B)vl7Q z(phuV)!s`)yEejz`zua_Aq<-M{+WUB|9}`XA4J z?(^T>jZg35EDWjiG3#Hw;-&+eZvEvcQ@{Vhx1T)Y;-@b9@>8dO{OOP1`P|u``T6FX zo_N>v>v#S5x0mdA`of!@zVPPfuDJE_Gd_Rl-J4&!@f-V3-adEi`19MZeC>`O{%-pX z&s=o#vlrg{^u;?KJ?#^(-1t>ivBr>QZa%nb{FN`wZ3QBeHesJ97EajlW#I<@G!7-uIr1_DS@q z<4AkovEh{~Z~XQ4FCRQ<^2INHWBQlK-TwUbckeoGi@Ang1OF%9zxnmA-hJfXu6pH5-`IQ7_GdP1f8n~j_Z$Ni#y=M6 zHuZFI*@ic6`TF9&etvICHuV~)R@Dx)t;mIFJOo;_CD4SO4YFH;R)QO@&2k}n&hQdv zQ5-Bwlt(wt=ISgd2DxUuL73{?4!MV1=j0x+te8Y|DOyW$#^yRO7yd)J=99r(Td#j4 z6JGUt)aiD7`lDMqqYrPac*(EpSvC*6n!1@v;>fQ%T-U<5OK0%mQ5E;ql(we{FHH_S zOn3ve#2QL%qLb@{+WB>4*_mGxYBmY9`<8L&_5M}s{<`Ci7q9=xA3wR{^&Q`NeC9>~ z^2eLLw`c6E`LRjl+6%{0rWZeY{qMJ20zb18Yc>k3P%O~*P`N5SNUc2FrgYU0gFCI7k`loJtbjz*t$8I3k z$831z@*59M-t_E-3jp2jw@*EN`t}z-_icO@K&3exYtB4-+V)>D4>Fv+unZA}a?Yhu%5;@=gE#)PKG7wXgp0&_7*qRks{I{Y$gQZ1~MTpZ)S}ckemj>}S?~?1gK; zJ9on7xf7oDCW#= zH3z*7)^|QD8n2E|ix<8AQHpg)HnKGZ(Njx1YxeJ_a~nqqgj)&&)vc7bbu z*@C$4>2=SFGsRxXwo7_lBwH!A54>Q-J1Mq(c&UmrzYd&9G@Dc#eU%|k-!-p@P z`nlQT&U|$B#@BED){&21{o3bl{^dD4@SoP)aqE9`#`c$X{9xazvtRq%t&gm`VeYM` zzjE=X|N4Wu`I9d^v}(gEH++5n>I+}F`isBb{*^s%+pz!mGhe-S$754pI&k9n|9$sQ zpE&y~vu|Jji<75czvDXxKXmn;zdQ4Z_icLZw(sma@q#~o>{HKu<~#T-EsXK+)?e@+ zckeuK$`z^Co8iO%a`nwGe)+!r?>Y|~e))l|Z+!Xt2iIJJ-{GougZ(Mi#6I*WG^VSUqmalv5hOZp@=(SJ2XVd?@XXj(|9ruH&|X>*pcLZ=HGh6Q6tf zn(yp>+ti`=ZhDnmpG&SU{Tj@9(c--T{Fw2VKXK!cvu~Sy`?|;f>-mrT>*Wih6HlzW z?9j>QJh|m_``>f!qw793w{jcG<^^qG-a)%ZG$9q&2)L9)mmo#CsB;HxuR^0O(#aNsT;j^=}cm6LoTK6>9r+WedgLLe1sinORO!~KFh9pjf-azYxRa&HMACORmGiL z!-pr=Qf+zfPCXo4XX(sV+-P^WMwP7O*Ngw~g}KoUyWX+>x%035-DP(jUN!aVwRgU7 z)m?wM{MMIm`p&_B{nR7xnuM?3_nz}-PndXm?Rmey?)!82a=ha={ORKBj!b;V~~1OdVV`_0knzeDMq4`orZrUcT%-F`CpS=0?JHHQyK+;uwgFoN< zjtwtg@x>=E_{xD*lP_NT)jwQz%O5`Z)t9ci{pDMJaPaRh$EnlLPucR?^ow|K{R{u9;sxi7MQS z7k&0Om)y1Mt>fl;r?>{rPp!Y~u)6SM0o$Q^>2LXD+m7Vy4`PG``pK_{?+y!`<9*lr>kyyX6tAE)^IdlE*uD)~6 zN!#af0w`3AO!ruBhSXvrJSJMlX7-NRTAO0T9x|9s-qo<=9vM!N!T%(IW|8+yG@T;pDfe7Mj~rH(7&4ceu2)+>oK%MPNM zVrS`$pXx%(6q`Y(B)($Z14Nsr*xiF{-aRY%we`BHc86=#!;xb1Y6^30H`T)fZHTp$ z8odkSX~kDf&!$XEuUn`ic0C+=z3+XW-E-WTyZ`Qt7ccwl@2>pjuD7jUSTS+V6 zAME{!oA$qR>*9$Uk9_EY#gorPeu|9y$Uk3n@RaQf%UK+QBi%nbb>su*9sb9Q4!wKk zmCxUD=mS?Tux^(5^<_67Jmb29C(S(iFBczJvweQq)WMTBFTVRMA9I7*#gjH2e9zfD zgJz1o871piKY87=*L-j87@T@fsBX65S0C8&=dazpc&ePhyYSue(~rFWydxjFc;AWJ zcvi(z@|nezGe`dEfZ_<<|;9zPDg%=N;1&tF_N{?}XX`uWCN zcfWPr?C}$`Crl!EZsw9d-uxqE4ZGjI;puHxJhAml^T(d{+BIK%>BevWYVB1oU3ceG zSABC2&ca5f8*(#!Ch5SILkn~UGaOQ^8O)LE$}-hFn&$)Xf_4Y$f^!K{i!H$+#Emp3 zyrOt{u)I5$;qmnjbhAUYL(79_3*A< z$7M77aHZH}oH#dbTzb7~?SKEuSD)PWwO@SXq8BdsJgT^h|9s`%k#SVZ_l{1@k0S4z z@}-pd71MFK6vy0(dH)0_;45(m&Tm@4k=DW(ua{uxC9*#{X0e5|Q4*4j6Uw!1Hnb)ts z^N-hl|H<*s{_3>Lp8wdjfBy0h9^Y^s%WHV;m_Dn53n6$z{@Qv&{0{iVMy7Q_tquIG z@bB74t(08uTQ>3MFW&ykbH0KaAn)7o@O}Kx*WYnu^44cQx(&x$4MBA`{qD=Ms#}m}miRqKUB4E)y&KDG(OM86uUxgqO&kgrKVW3 zr&t%sE^hqc%(abn7R`vZ&$&9^pt5qj5o;=SbD=c8G9~qzm2jDG;+&FAH{OL>!O|K%b?EEWnLu($eqt=^46&Dj{4$g+sCz1L5;Y*P#U++ zcqUbEiB~)ioiy?CXKy+9{!dk|PndY=q8ksdyMEttf69aB)OxLNoZ@{D#5*Y9Jgmav z*woV-uloJvx8p|5bC=$J_=BI|T{R$_KUcpPhlT6G0PvPcl=T*Q!{pQZ-g^<)_cu50 zT{iQ?hc9^SjH_`y^%s+$$07dX@89~%nJ?gj3H%eKU>~*gcW(Oirq3?C^K8`LaJF^m zT^pa>{)OjoGw1RhPi?*NxRzK`zF9zHG2Bg<&#%Hs7VeRb@4->^@f-FWw|;J9g11xDmf|{8TY&RUX(b)J z6w<{`MGx~8u7ad-!|=d+w(dU>?l)0gx#_^Ww(dV^Yi{UK%x$#aWq$^^B!;_iC^DCO zr2M(&RC`Lyc{d1j12Q%kUiTd03d-@5up;gJ+%jCFouui-&Dd2s=RIy5?ge}JIXE3! z&Emc&42f#s;Aqcr6F40}L&1$g3|U{X5yv?0HiK<4+f0*X zxeMA15^Xcy?diQ|X34$;S8m+!4rke-9DNckr~#w6p5B91u_&&GIu&8m3nHG_m2bhr7n zVz8Wv_AnDJw3%WTL(UIu#y6gAU@<%;+jTR5Tms!o(ScW*aOK)C;gMwzfm+_X+V6&I zpJIdJxGSDSV+K&W7sV9rUc-OPo*Cdec}Z|8ttP85m_zUd?~0VR?nIIcyBjyg;|;ai z0uHW;Hd=jQGmQC`S*#}Gexdt=)ivF@IqVb`$!RdJ!s zAwYKQKz}+7GyWTDTxEm!Mi2;_YjD~C-mol?MS9>&qT6QDE5D>wO~8gaW5)A|Hf370 zf@t}0K^>AUqRq8+IeP8Ue4&`^4=1`uv4&Hg>@79V1fq=(fGn&&5BYWIHIBL<*=j|s z(}(wNiMO{?&IH;$sFUkK$>u3`TRj_AH*-C_UQH=kwxOmck8>`cV$+2Cz$?YtMYF7m z1L{?5vux1oQ0+Lp2G?=a1+kVP2ike&1<6J%fp%ZTT3i>LE7~Ty$F=FszM#Dk1vIk* z^a8ZRaH(N$-pmf2Ebocc(mYv)H2|t*+W_5Ww&A*>9Tekm$~c2f1iWEl(n&OC*o1t< z8Wy4lgBI=l+lU~Vf4?~Bmd8$Y4v-^*4*RW1nQaTSHF_=x#VQ~z6r1HB+FX-dS#I~< zOo~gh5O;eS?10*U2f0SL^abry;oZxLEg(&7lj3Eb@eqB^b0_15YsPy~;cU1rS5sQL zT{>&&R+im8#il?*wZn%C>gvPWEL&Go#C5HkIk~P?aa-}iatU^>-0<+qES+_auvrh! zVmJcj*PO9fvk$Iq!pU_&oetb49Fv7;;S83K0<~28#6;V{iTE%VXNWKY4G}bLQ^pE_ z5^Ce_u?27*m~l^jlkpzQV3ygpu=P?P94wc=d`h~d&iwP`cH=RWyGGn^smPe8QhOM2;kpEY zHr+L;j~0Lf;Q}>+BzlnLLUaVAZ;F7AxF?e2aU{U>uyCp%5nk4UJiV(OX6&bd0XNt8 zwt5}6Q}|izV#R%OZM0jcqk0CSnP{hK%Y>(1vu=jgwc`4QQrs+6-AwiHtcus|v1)0=C(){ugC6HRh4PeM7PRnpqT zbu##suO{HaIRc~YN%fXy5gl9)Big4|*6Sdb@;yj#nUPYPWsyED`)z&^t0lJSy~(o3 zmAlreL5_KYJUYEQ>1LowFzfOcBPhnHL8@y){_*5H~%Be^!(43uRnxz??-sERjSC)5qs0=zAW zJGrj;bwG`Ct`_RXitkoEe3%uF>Y4KE@?GMnhfhXTya;z1@0w^+sX@9vo7rU6^5jmg zQ>nqVqTc7u0TQbla%WC(@Jem$ED1hR|+pF8Vtd^q4IhFkfN>Ex)~?mf{#I zgqsMPU((9sIdPp7d#OOpJr?D{JBM=PA<&j-_MyvGXW>k1ok5#TGoGV@JMdD-w8gqF z%?0WVB9$JUmi=y^mK;lkgXJWe0^Jei!J$;!Xrs4SH(FeDxdhWj7<+zA6+Xhy>@b~9ypgHY(Y)oc8cA*b;eJ16$kF4u7+z_@yN1$k5ot4;JSmh zKhH%UUWsO{%sBU;R&w3u*THpD47XCZJ#uOcXNI9oQ4SRbr%b>DbJIh z)$FCeM3^FOkU@8sXtAux7HTW6X>B;I@QPv&Cm$yAy``$)KyJ*Ky#bQ*0AmdYxbMz#6tZmAdG4)XkQLn!+u;&ZDkcI&+rY zDV-T})y*bYG$Y8Rb&jwl*%WK*_1=Ez45D0RI)q!~n%~H^Ib$Li41?N}M!Uou8rUAu z9-@yR@$5p{&!Bs&y`dR*YA>QI&RHVE3@x|H1tMAx0S-f&3)<}rV=(JI4vcX0a?$Nf zYBV)hk{!ByG@^wtHt^4@L8cYVR<5DlnD42x(Jp{DTpR7+n%Jt9fI}e6N%D&TL=$Sy zONhldSSI7OwFsAa^6O@SR=kt_WFU+MI zQn%;V%&+CWc{^oDicO+>$+fJw#M+f`pIIv_VTzu3X!Pr(RdssnlvA*(SI4 zATIH?x8KHr*@8zO$u=Wp4QrgvVT~BXF!?ujL}v+ zgzLTFdd)PfwUcY=wN+byH`TLpp_Fus>mgTDR246!GX{-V1LxY9UuP>&w_+{8SwM@T z84kIm*F5Sw0)C$(9L+d|RX2z9-gAew}C!fm%wPTm#Qi11~{f zPVFmPN6=DiX>Mjh$~_apoeEwk7P%&o*m_<;Om>ZT-D&)bd|R^7``6Auemn2j6xA-| z7LCSCHiE2H0uD`UqRl_JKsPQa?}2QDJqc_%41tzd17yzVZ?yn$GG56YWVwKBmTA1< zz{jT8f@tIHp<`vuTs6O{au=el&WSVh8fdeLUy@$iWX6*O8TvZ{gelV`8Z2W7Y)N;^ zCWdZW70BQ>0cQ|x*(B%=z$5R*67_oT>T{si_#U&uwb2IM(Rk&IpZ-8oW=*Ab;N%*5 zEy?DUGnB`(XlA+_y)ID0hbPfOn@X(|dtHjP^Xm#Vi6+iMy90GN@XiM|nNVj=O|A#g zX59=p52n~@#p7Oz>)|Siceu7v4@hxU|#9^(I)*iH`#0!cAIT;sUs4 zau44;>*tc-0=UTS;oJ&0e~_9d@tc>x{}7TMtufm`)uKEMZGa4@L!AL8g*#N6$#rdA zu1$22>1HTtCd)({T=SlZ0oUI&2daZ~7j;gwr$n@&c783E1-KJukxrJA=+xz;*qoZ> z-2!vh=wzTBI9Han*+cY%S45LmFfO!>a{;*nZ;@sP73Ut;IrP&2+h%b!g-6Ey zvITW1ps92QmJ{s&+(fhY`L(~m(8X|HE7jq3NVd6_35ReOu|`ln{Q<7ijmJ?JKK)_6 zPSr-~Ec6;IORs^p+hBg(y&_)oYZlF-B;Ki>bxe3VaNjor*G5}?b>J$DQ>>#x&j0>1 zzb--ObSVtf^F8p$`%ddw8;aK(K$YM=k zO|)_D(k*gBmkqcy+C&$wCCVV0n2Ts9)LpbC%48NG@1+EXE;A6Y(OaF3wl&&NC)(y$ zJ>*#Aj*;c4k`TDGz;A)cW7TyA; zCqZZldQd;Kd;&8MS+B`8hisa`&GXdj>cb`6J+6C_4X#x>8#}$A9UlM@)Xjlc)oau3 z6#D@(UVXUGu8FoXYjZ8Abr?DhuSjN_+-^0t9~Nr`)s zPNL1Pf>3A1h3ni<{uDydXc0|mPN)ml5m=h3-5^>$;cdC*_d~L!I-Bc)HiXz4_!rD2 z)=f|xIM7yHG}?juw#r}0vWZR~KDB$SD)JDGPLTBkn6xxQrjvmaU2zi7w5momb9?wj>)+4_NU5sGVi^#5${IP-@DzE8)IJ+C{r( z!uzM#CDA6@Cr-~tV{N=CmzC<7^qL}0t_#j3Xkm9O$+kM!H`JG4 zn;sN;!_aQOEs0hF&L5GO2io%6jw{+B&#h z=J()_P-K2>uHB;~&Qt6>^YZz1mur>IdR)huS3#RxJKd&OM}8epgJ?^(phkW@c+R!{ zp_Loh8l`4coUK~%%&eJccj{(T>P)Wt_rpnXH@P;~aW%yb9KF1^dUDNMDACe~E5#yZk#_tyjRt3(Qb5E6icj$`I2bk zPl)RC=K3E2a-2o)1YDABv;*n@Tv}{?qZik@lRv{hW6BK;%W~Rwk2(9_9>( zlIa*4#sY66$J~}$OmeZOr8sbIxYi!NL|mV({91ZFdRkR&9cPy-;tG2Cb-MBVZc+$0 z#JbVzQWy{6hF$~ka*FLEY)f|GI+YrF-GSOB99)-rcq(=H@ByxYx$n#7uVO`?T1>){c!!mSukXXz}pyO7>;ZLuyQ+u$j{MRA1`M0dIN3)P$4 zcrxTmILXxzXeqLsd2772TJ3jlI0S9M%j|;zdhlB;cgVEdc*C`&*_Inx?7$Q=F1l=) zZj3h>=aAT{m6&2JmOXE2Hp_`N5RS|`%r?js^?=kf^xkeDcZ^l9reWBKa>#Tc+E8-? z@Fd6$*D=#bvp^=xNi>6S*P6^>73BiBvF#0mo&C_ei7h zmU#Kh=IK9H>1^QQ+292ga^0e>v^r0_lvc}xXMXJqrCqUpaAi^I^@%gjuUn`~#Y{o> zoNJYYd)4IbNUlp}ZJb>+3$$CVCDVYqa!nIXoZZT?b;pXEZt?3oX3<-+Tb#RbW5SJL zqsXAL+brnCX4loivK|gev}D>(53+3GX6{d04rUYZQ0D?Qf`(|Svm4TCIdBb==*E5% zaAWJhfMcf2$G260R`0BC98ibTuA&^;9pDGZCYn&I6c)%AiVMpY>p-{#xsAJAlhzdL zf_X()CY&r&nnAR{52yvW6uIhhJ0#J_e-mwj%vgXs5Q*kjf?G^=HQ0Te^^ymdk3UEs zK8`lX_3Y}if2MOTa;=8sT1{5GqRlT(Y3kuV?E=?2#ZE(Bpe|_3iqnLb##3zEH{%5r zeK9EuXyq!Y+_PEG}bv@y-Uhj!Ac%a=vU9OTA6Yija zS~3m6YA&U8kGi-dz(Ek(QfMc$mDa?w0^8jaJ243)bEy;H$8nXt13m=wYgo7|%i>xh zPQa^V7mAypi#AM4XmlHdKsN|i6J9l10v)w($sXy{@DE>)a9tl$#wP(*9kSRi+3-jtm2SaHYA(&yK?QKnYa$s z?m-QT8?>V;o>04VR;pywYZKjY?G(GP+yPvC1?-a15}VD6t*JD*hJAqIAeR(3jEiEv zo6+_#&<@E?mifXUx&#f&tz>t;y^Y0ia82#5Ecaq-bdPb-Z6A(aDom&g+M&xuuSGPO zog=w|w?OScS+kbf%2>782{LEQG6V3N!(AC*h6ORYaVhdZAL^Vky>oOzbc0+4%9oSq z06Z1hx}1HMzglcF9?zg98ga`qi005Tjh@40LOZ!m`JUK~BW&um&#ymHCEIt!Q>+O% zZ<8Xw?i_gCGj{qKz!IxB-?&4h3xdftE)xt=qT{*0( z-M8Ns=q}eJI=;4|1Yp*BZOl`hi&#^LE6YTi>P#zc(g`dRYL>wV8~IJ5!(bC?a_ye5 z18v|OL?bvF(W%bZ!<;&a9woDuYz2X^C3`sC>Af3}t;p`lvIUxunqulTh^F6mAerV& zD)smSfwoDXz@?YjlZy}Uan1Z1Rq^nMw_Z#BwJ$Lub6?~sF)4Z${Lxb z_jcPCCVWYv4da0R2CXfjt!lUX3&NT-{_Oc!h-zC5{chO@{^p(80hHH_rw{J|jyhp8 zgPI{92vG*78}B#cj6R7jRWb^+TA)q6E-Ys(X*S4HMXbfO#hNVdY0$1XC)Wmfk9@WI zN%3B6cKUD?%E+=Bxi-!v=+X^@cd;eQA=Y8Y3Ai{tI>--=Ot?KfG9Iumw?Ow;PND9iASqU|9S**KRz#JV6HfG5{wUh1s0 zI=D`#Jp|fn7V98a{9>NNLb0_w=61?nlg zMVFmBONiyMV~HF36z9wX89cabgQ0#v0fts^aZMi%gMIf%>NTt4{NfZhn(%D0;=%P# zB-Xs3l2F@?JHLkaPRTacSrYeAR~}wBRvcW{BkTv6Ru9z8{FS85`E_zly#~dk+mhW) zuCr)XE8%m!4}F|CJ%^_1x6uxy+%4rr~iyT_7cu0V)1yNSbPGi=kvX z(C*F?VZYWyBWA#ay34YjB-U&6dIVL~PJ|284nn3=sS|Bkae|DmX$|2v(bMz3WD>P; z^GmdADvfwauIaHQ)`e>l4Q3_Qu97uq(}Y`;r*=nRqD{A1X56YX=`J8gOn5yhb+#5` z(opA+*)$vdb_r~%2YSP6mJ87(;HtoMAixXhOR>B`jBfzZ4=fkUCFr7U;VydJtdD9|$VDareapI>@?xwz+1hZJCR}?dYy;YLYovjp;i!3_t2ID@7eF(kc=nM!Mkv-v=%%Y zv^Vk30|`~HX3w|syimm+zqwhCvY2aPW|`i*+dyl&aZ5ARIqi3dwTySnJC0sZr{xa1 z!Fa3A9$K1(b|cdi=tP)*qk$kN(N&!b&Mn%MW;Z3*mSY%iwiPYWWIQxlO5MgO$5e1D zvdne>J0Q~uvT!Ea2*9!e&}w%LNHdN=-Wy^~y;koyhedN!pi`ZVZ~$JVnfpPsp%&nb zHC(pgep>N}f%eYj6ZYZaI?lOJ508UvR>l2wXO`@8icQHD*Q%SrjaSKrO!urfpbkT> zv+SstInj2-Og*9Qa$O}`pVqVk*9WoFiU-uG)G5|c26vX-aBaPARa+^xKpqCQHM*Mc z#&X+-hwv5qJ&2EKN}?&FV$&p69&?glmYB2-D7fCidum@MJMfC!cBcLHLb6l4%XRmX zN|zY~9jMEe7;BlFQ~oS;hcX zC9+AVwlELNUE&VWWIR%4+H%GaYm*Dc1L0mkgcD?Q{qU&Z^*qT9TJ5?U<6T&e;KA6e zVS~2iIQy#3@YN7#`R&9Obh`!DfSOHQM*yyOpS-R0;o-*fsH@h^Qn*zTkE*zCiN}GL z(UwNnTW7N3E!5>UY1|SA(X!$N>agOxbyo6gNp|_%$3Wd|B2K&PzvXnVO$??^!k^&-p`E4~%dzK!@d9-MUYvG35R934Pk4KZ_V%Cu2U?d}sDAP3s|G;3wqAjj#IHM+0V z@vY7jYqbh*p}5HOU_j#yc%{o?oHCs`b%okQ+kTVWl3Yu;i8J|Cx;@6gl0C>W5oWo2 zJThpoY>jpgLP<9!38{!Syj^vM9E)WWjXr~bx0PukEM0~)BM`rmX@YDA9^@8~fwQ^x zjC*m-x|w}=n_}lFcGSad$gwRio>{LuQ0Hk^Tsdo@ZjZVKFN#~KZN+O{qdLW(RJlEz>HAM*%z!uS2g%G`Kd}%&+S;GnLEQqFG0>6KZfl)fO^CT(?m| z-yvFtSu>*Yq)q#%$k>yNS3wVurS%12PA1w66mwN^muo*{(r*Xa20Uu`iMB4=kaX3` z0IxA8#idY|$S2wqYnB$R%M7XyZ^b&5I{(zTj5mF_?6+`cX5DLnt<~Am9KFzn#}2^z zI9r|7lW1|RKxJ*sB*+r(9?l*Xeu*}li8jR?K7>heO|->z7wuq~M1xatjrhTl4eI5w zM?h|&I9#_`rr$nFYd{vo>&3PEV0@Tf%Z=NL%ZKx`U3uDNuKQK-PU-B-d*b}Ms5Vn< z=GQpCM$ya{RN_~1>yFLbumRM`Xs+~j+v)|^|VqMVQ8G22#P05B>mnH`egbUX@2h>?s zJOnz_nSiS$xdb^{A`E^pQ!F=!B09JZgj1clGz{wX_vd`Wa#8AncF_Is^6_1b55Ifl zG_)V0Fs=`P^dvj0;x)PciO#v~#`)bTk!1sILJgc-$u9Ru6#(b@flcW(882e3Kp(-j z8_x@+tqGT2vw#-o*HH}D;WhuBX1#3InDClh&swb21LW3(yHM7JddQt{G7@M9G69;5 zH=MTZw@^h)c-;rx$#N#q%$JM)h9UQ!6!C&^z63Z2(S8UVMYYLqh_&eEFK;()b*5OG z>*B^O&C!c)2(*WU8Y~-U1|9pI8eND+9xafe(F{~8L*K|Wf$g9zs5xW6Ig~~#kEU36 zxK5Dit{bto*`5TypxYEPNPY{~CfYJBqEnzltT{Bo((a{LCe%`AvYhH{kU8`uf(Mdr z8SkMW*U9^rug5m@LL1~3iotb&eBZJSXk}=w?^#oQ_<$A9dnq-)M)fRjo#Cj9UyejK z4wg&x3^N3Byf)juKlo0g%aT4^-Pp^+1 zrPv(Oa*OLYyoNMKW<4C|j{O$Mx`QXE6YT`Ni*p!n6HRqyqhvFnWQRI8bQhM*IN@!$ zPNG4sxh{QWxp?mm(T2L99XJ=d85EF9VEc_>ZK=gYlo3#u-9$9G7SWYr5iPn!bU-b= z9*|}tTpEdHL5xJJDIm*i333^Fl6~m)nkk_AgOQKiJ$l;RqaUGU%ZIx!rL&S^*Hi4V z(|L+5AD&QKtbzFe+AGd1Ttlqy6VY9+TPseeq1q~-@dKO6uL*T~F9r4RovYAz$mJ$C zK3F#+(KWw5ajGZQJ+9+~i=X7G4jk%+VQL)3&Tz4B1UfakL6!Df%-UL)*uhbHy^snX zX?Uy7RCcSg=nm5BuO!%waG7-0jG^ZJZ(+}W7jx>+>y&9{(14fou-vKCnOPg>rZ?A3 ztqf=@k4~}n-&jey({%^nM0nQTJ9-E-8|DLK@mrwYwPF&D!^opcHXZ6*K&~2{s=afJ z{7SeZNPeAASEwU{mfx=SyD{59TSNnJ!s}s=We-U-u+=v74@ii!kD=As0*xihw0g%0 z?{aX>Ccq;uGva#dJ*R-{)5JB;DZN)3sIPLQ7l<32XOj7|2t^lcDm7pKi&bi6lAmaWK@jq?6ZVx*+2jc{JfaP^2I{S4<=XaiLuBF$M>>k=6TG!7S zvW2nCg6)!cBA==)BGc_O{+XqM1W5@uU7M5!e@LH5pnp2bu#R~3&I!mBI z`cRF&Z`rzgm#s%bfcDU`4M*qNAK2{bb(3F*UI*6=+EF@dvTT;obT1`J;!x_M*O_7m z*O6sM#Z0%vlWw1O0q5ezSu_*QB@ovvnsw2R(=Ish(sXx}|20x~>?d`2Eg#-D;rSoG zv2b=T zs43RtAeyKGYM|XD&gR!dQ;tDyXtdNhXGrnrIJgF|*i$HO10k#>9%DIQMxSWYha+Bp zKLAg7OJIQp!Vy545rbCK4Q9zT$(1x0nPzZrpw0N9<%MhcaOkyL--^?RrxhpHZRt#^ z9eUlOU7$`k&T}qEwp6Ub$Bh)obO-AAZ~i2S8q^tjon%olOWadffjlVLizjVDi;R0n(0v*xxlZ->l1w-= z?r`J7a1M>O2^ZHEXg`#qP}U*Z8Asr3u4%l{%(&cm0M0XOEm5HJj}@jNFRI;GZe`Ge zl5M)vgd6JUlVWGqWLYx~gmx;jac+C?t5%G6sIw;lZv|Y^oCsUHRqHMw6L88jHQJMf z=!R=>+MsQO?YGl%17s0>zXHa> z+pDDDnx!)q%~Sx7^XvGWCU2bqa5->h)_YQ{RSDN;Jy;U&K}~+qiV5d`|McF`02GET z&fPee9VB`v%flGoIAoG0oW(IvOw9Q_amJkw7P{`X8SR2|`TfIhxKQSQROHn7S68lE zv;%OmtO{7%MR7LmG6fwt8&4U~O6l8m?{M9aX&P_+(KOp{>vd(hX!IUA?Ls#!ce-xc zZ?=YOOS5NEriC^tW7KFHZ^JIhws2d!16V?BnO2_^175Y5bmHtu$8y@vmtnj!P)$25 zH{qpTyA_;EkaUMAa|o6}u^SjqqPtL==)y9BpNVt?sLt&?*<3@fKMbOOkok27ZG8Zw zk!yl!p59bkfG2wB9om^*0Jih2mnRR~pBa7in zL2a~|Vs|Rxykl0N&iuMUUAUG&3vDU2#5%aH!cEmCXlO(E9Xcs~xgSAk-JPP?vd+>O z^KSRmjoUDEpk`)m@12sJN}W$9KCD~=XCR7$YdUb%z}aVzN}c=?aEW!(*UDJyx>Keb zqV2cA<}YGgSyx)41!{t#MP@z7$c za{w--){N1%{VsiKbSSlnu6-JB=rShRC%;{pHo|0?9$R}Hs4sLgxEHO_=$2^3Yk#&3 zje8!%QCH>qBM@upwQr~Bf{M<(;xn7oic_zP6^B@>Dh{p#Z4jNU+&aUtS25vEu{&10 zK|8BwRPCzQSwO2tT}-ig$kn@=;zKSfb#s1Q4!QEOSpgj4(!G?DZal1b%Jjy0L+!NG zD0TaE%S5ls=22XC;9T~b?lR1`>e6koZjlKkcL!*WB zc%ofFhD>{jIdy4~H3RAm507my+R);MgXmznXmlkyg&Q-5S7ouNjAdEO4&16OmPK@+ z-Eb{_NwgRbvB=%dHqHTcgLW6{wf8PVBhf$`vAO=~DO0GA8EW=%)I~$iZ$_dg z*JrWCb+zIl)|PCe9T!v@sDo>!*vhPxT-Ox4m29Eihr0Oi;O%H2t>pnp&KIr&xzB52~{&V_;c~gJK5e z+AKS*W(;!OSEyMoTkqim2xPF+bqB?Qy+bqwnq04o-dtnI!0=L_JGzW~xn&us<}k!M zB%AO`nu)VD8hy64xXJ>(2G=^j{&47ZSaDuZ(X~>3^Dxn7t6x6+V{olcYj)ju|G+D= z?6p4&u6c@Wx_eNkWEZp{)=acbbaEYfO{i9!@m>IYQXl zjm+9-0TOE@+KF&LEx+wJi{7MLRk9&Om!esqt+cvBbkJ?@t-JkZyp+hycx2N>rWNSV zptttB=FTR%QR-w_#v3eKnzQsB0v+jdLv({SKwkdp;7(Y(*|Z1Y)`LLR*9a zbCa8BcR=P+i#EiU8tq?gxiXn>&-tsWfH)Ceu}&5$%YX{W?hnN*za)Qrdz5Fl!y<>Vz%4h+=(l^T@~)p-P_i3jh*dK zvFXMrm}y$6?M*Kwu$LxirXZU8hxfaI(ZNqC?=02&!e@8`UcG@=7x2=5I6 ziX)ERyf-pG@NE}y;@r%pxYk*Boy@8(*ZJMOV@KSZwBHtMd2+dK+waYFH{BFyqK(^Y zv{)~wm*18g>tXqA8t=}!9g!`l&uDavH)T2+eFJoBB_G?Ax#O8-MAyy2V*{vEAfK9$s8avN@Wf1+G1&LcmL}`}*si68}jD zXqA{1-R9b_!=SAu*RtXvI$X1+=89w+>S=lh)RXQBquFeh51W7e#^3ZO;9t#;`iuCZ z^9!ozj%w?~qIkTxwtN@eKzsAvVi`DV*>!JwD)Nc_)*T(C{-7Dau(|eQOeTCoBYd@6Dei8c+P2){#t))!_+UgA0qsWux+TRD% z#q~>*>-SV#L$6(8+lS9!+>v+%i`a@i)$)1=FPx3SRRW*DJrgWG~m%|_(mzUulvAjb=23JSa%XWB)gP4 zbT5HE%k|{6`PGxed2I0T4B$J?NA1>kbkA$~aB&Tm^>glJwKdvkN37d~!+0}Qi0eM+ z^}xAfa1xz@8k=6^ngXqv6CWeZZM@OLDvj1nFhn%S73t)9piP!VF=02$y=kt&vbo-& zR^nau8$lTtE9+H07tvil7uqu3sHr2+z2WoZx)467a~W?0VuBiUuVtAou0?b_wzwv< zWx2DVI_pW0EBig6zKw0(~S_Ppk` zUErD}cImaN>~$fwJbC%>mwP(Jm9_G4LOrZF9QZQfq}zG;fZ9asxJ{k$wFkZSQ5#j( z=k+>@=9hi7w*pJ+^@g?u^oX7%*vA5S6JZ$fRE z?&E@*I8>j5h?+(OFw@ zD0NlY^5n4JE!;p`OFmps8|`qtqO;k>Cf7{Q6qiZ3N%Vvoj9aXiWV5)oShr+btljFG zdVM-u<1V#Mxf5~Ia#tH`BN|WsPF&;oPnB;A=Y@6)^cHvD zcnQyo=$CLTgI(%e(v0T~ayF(oPugt1_=ULMbvazOG-o5mi)-p~3$)eQXhX6;y8zK+ zU5M+)f7-bjxbF0hw=Rb?NzmJhFBoR?$k8W5G(G2uh9k)Ev*y8<-&@Xp4+dK6p} zZP6X58|_(N$BLI;cXa0Y@LjLdzviWyR%*ONM|8Gx?F30L_*QD54ecY~TYJl;?!kc{ zBv=M}a@~6%{5SvhO*}Nq+_>DXXU?274s`oGL&+X!$5)(G)(~i$aDi;1nR~OKwpbf& z97(q+=Du<64YH@i4w>G1QmO3jUt7_UcwQe`f``z^> zDVg>9$TE$0*2~(MVta4uvZZ+mbSrgjSVsfxRWCQ%TM=C{{bFQVToYt1u)O>2O{PUU z#d@s!+*_BmQSEGg>A=sfPcQF(dT}42`tQE|(@($qlhSKQwpCjLDr#gOuH4*8Y(?U$ z;RU*DG{tmRaec4Fy1HGNJ#%O_Q}Kp+puKgwPW0N-DXX{!(f_QW6dQ6?)@fn?udgQ( z=j-$9e_2)btgo@p3!b|64UD5$@&ffxYA4~e#NZlO9f%W~li9)NoZ)Bwo(dK&4Ey>1D?m~O{@Iu=HO{G2(?PtVw5xuxJ&d$BbwQ;6ua}SDDTyILP zh%A67D|0EWW2X9xaXE0HowWqo>Rep=d7@3drrE{@%&H|#ihEN;L#YXMj$*lqrtuEK z)MYJitj;K?t=EI%8{CIqZT5#mTSNn1Z1gbY^M*s!gRHTqiNJSVywI z`O|;Z`nPWaRj(6@nU9UtjOWStaDe;()m~ip`NXPyD%lop9eJ`UvG$2;M>{dNs_CKE zg|@UC@J7U0MDs66v<0Pe<|{rJ-zqC(q(VFFP4kw1Y*=>tuN)hZNI^+7G)a1*24qZmT4TdfjVD@>n@6W zBSmg?7SRS7Tnp_;w#w(LGayfyHq;PkZg8w+u0PqijulTTuFJ7Ab!NIbokG=qm`lBE za?Q3Ex#nC-E&Fh#;*Z?_EYX=7*}kKA8rg>~c17YvgW@D&^YrT2Q;b{y*iwg|;<1N4arHYC#RUPegeG{NKO% zH&|kSdw#d&kne?gBzs)pg=ehVN3P?^Ez>En*J&z-WO03HZ1Hrre7N0sxR&>p@%9THb;GkS%<=U>(^em}3=sw|^P3_{^(b>ke47slD zN_6(p7l-MTM_-%OE552e?M&Z^ZF6F&Oa ztf|3rFF^#LSkj6$htlNQ3fr5M&#lO{5z)b!`zhZ`wduq4^>fU_#WlV=*MeGmh;qf? z_TkHfPak3j?!=58E|=KE*_HM3-mF<_MWYGzak1VRT$lY`I7_en&_%Sl=IvxbYkBVz zw3Ue|^p4*a*O6&DaQX0qWK*ECfOCkZ@z#@Nwh8apn``RzM)ZxBeoNQ=Vu`in*rLoM zDV9cO6R3gkq+48<-?lV|WkH>1XuJ#UFiwQ;3GjPXYVkXX_MY||pZSRvxc=(fKW(mo zw&`{YyJp41bqC|n>(0iDYhK%x@w1)lPu;?P#3eSxTD|OC1A^$RxYlKxGT~pkgNVmSbF7lda^ZfItp{-L{mDu4LKHQ6v z-8f68Nq2FL4Y>BvGe0=8D?Jtw#zW(5%T2MC<^F?>ci!f>8`IN%Lz<<|)a4O+Q>?Rw zMkf%%GnQs;8tvLZg$;X(=mwb^8*d#qt^xILZ;<8EXj2SB9;mI+o9n*1Ur^uw{Q8TZ zU*|)Y(sf)QH_Opz%e3iMu}nF>BGlI9&-mn80Qv9`&wO!t|10PMn| zcV+yHsd#g(T05z@BpW7taGmIksy!On@!?fyuT)$!rMb3CsW|j{S#e#9ja0k~ZO@w( z)G^`F>mk-`aw$FA`drDw<-;GO*Ay>1RY0xWsry_LAMJ@-Dr<^074}cD-xKp9+BoZ< z=Sw+5i)s(;2F|(`o3Nup9p^BAHlB{0-uvfQWnIN}{dW2_^~*}5RZ~y{_qJrOqh#8y8}Jfp6J6fhWi`2` zG+V46wni_dKB)8l@I^c{*9Q4;1h64`s54mp0xZj5e{raqhvl|XN0(cs!*#1O#d?xE z_lDXUUB|m0H`l7K&2^<`h|xH8roposKRcVA>3R^Ww(9HCD%)sC z?v`J1St+%Xa6-K=u$ipvU)x=C^V5I-#@~2>eQdyfKV!!GsMCV|d~+SN>wAgogz!GG zEGynWq5E;2n4N@Xl<79%5^ndiDANa`rP@DXt2%le2aZ2%&|X|qoh{jo^W0QWCZfxJ za~^mFWv-x|jNy4mvkU6sx6cP1(oG#@CYI-gmRW~noD`LnCI>$5E5$xklt3g^41sk6Df_wnUj zgy+=j2XM^*4QSULRHkIFR9pet8c@k)Ae=huDqF(621-4C1_$0fuXz~=aOP-=2UPl< z_)4#9pcGsmp>}#U(QY@6#OwiFgXs8hyteZq`%NEyUZ#OI)!E}@-Wy~PP1QEnQD-w=W_v)bI+_hEaP76n;1FfXbQRIm zXi=<wb5>_sn_88%WwY`d^noa2OqwAUQ+G%%ZE4JjKsa%@NzGk zsW_(27>Unbb~Um!ewMM)a6O>z5}RTjH=f%fof$l1fF_wP)vnMCuN;k)ssHP#qhGP+^nI-hFq834bE-C)!rHkD^wd;ZytDrh@U|_q@SKZl$BYj zbv@Vmsrb|4C)9~ZXCau48WB%%!4kv2pnubWc1mn=Esb6U^(5M5^%Co@sWCH~339@cI%^S;iOKT}I5FYC#_OPtZCDVA1=2qv* z#~{klWfN_>RaP7D7r$VAJ(mSKGA-9FkXQV>z3x) zM4E+maE?q%vP+;hqWj5>Wpi!7Db`fvu}YdP&^i{yL#7LDpjsdwb-7d<0=?EJ7uRNj*hrxo{GfoM{tW>g6E;+m>`*C(pY8Xr&c^dhva)E4VVHj4-i)udq^ACBKqmwWgOwzwwR zP-+w=)zvcBgKlLMs-{_4Q>k4|+kP*-b{*aJdq}p7x1oMC#@iaLQu>To|NfDey(G{A zS#JbGv^Sz(vQqCwwA4A0?XsGM^AKn&HNCfp9>)7d$@Go;2AodYff&hk${lIOhbG#e zT_?ySnwxutwgImSTIAY(FRrideZqAY&tSvjETV@ZTb(D-*#5gsOl4gL0>C+=vWPa|o+jl{XnUYES9k^L!L=>`sb02D z{-fd5Rkp17PyPU?;Sv|xott5l)NVX4@8!V3Lg=nLo5kV+C3@W*G&yi^y;sxL;+^YF ztofmDcax6cxHlJd$Rl~h)xuy zOzg_mTKfStM0^l^=VNO09X*3RH{klW)axH3AA5&=t`~-CGZI&oZLVR(HG5Wtc8T?x zJ^QFy*p2ocooPUY%`b4RMmEsi?t7NOv*MZ!uRp>yqO(rV*#Q59n>sV(OWA=d zh&w?W=N78=L9(3#;70|~+zaaV;k?BtpV^=`*E|OBg99hmE~pOyI8U3DY!JP~8qa8f z-^68c-HgtPKQ)XqPehHT&uo5aGh&Fy5YraJQL#_D3xk+Q|Z~=)@vH_F)QAx4VmV$ zA)jNVRbRJc>xyh~UA=6W@Ogz7tLy{Ue5ouSzM?a6ZL}SlxxVgRwuuhc-|)*GbpNIG zdMj7c@Um7CD6z)+7fU4in8>S?I{d1#Hq?G*tFnC(ID>YJbvDC+hil68He;rU&rPl- zx>OrP9~`*!no!Gumk%$Eo_d}7I+eAoxVTq_1sA0S*)*;#;>md=ID=gD{ zk2UnVblGAJqAk$&+jog@)VZK8fi9M<$gR{%pg}aeH;=WJUNbj?STDU^Gb+i$|bzPLLadAL>3&6aaote6i_PPaYuz}dy4adgQE0|% zyQJDvuS>Z3Vzy2>E(6y>`@r?N(UjtPje;Mb{@Z_JM0UD>^L)~D^zkHb~Q~!KBLiA=c&=$yR0U{GT{qqX|#%HL2bHqq!0g` zl6@3tsIwN(4&Y0puiyLBN{vlicX@1=%pn>e(|Df}-5&cBX))wjXj7MMwxP}?(|Xce zQ?-LO%=~X3|4aJt>$lzx*Qu``#I^feJ~}{4D$e>ExyhjHi+)kx!HNH)%J=TU#+gt%@^d3wufz>*=8F=2Wo7VI-BSg zWfjpU8clU3*G+WPS*lHzv57!8+RRfa@+_0RAR+t!kwO-a6PZwG}pP!f+Twk zlv1x5hL2PnKHRfsHss91|5=qatL%b$RoVO08D$Gxb2Zn5T8kz2f=FnSH4%NNuVue2 z)~8VC83104Q?G5pdqeFe+8%Vl*<*37lL=G1BiangoZI^bFQj{LP48V?>)f?*T|^^u z0Mz)ibXKOx6QZ5r6YDka@9DsSa~)Mj zABlDajZzw1Q<_s#OQWUKxb@Z`IyhUJfwt=C?P#KbvrTyE@+Q;MavS8Xpz$GbeL&kp z1L~4#Z9cAtkYi|c%d|z=6tAPr_GJ0;HemnI$BR23UfdpB-+KGXKHOX{v>Ba|Yt5dG z=&bAO1Zd)#wf53$SJ`twMcpoy*fmxPyV%FMOX@8Q7nXCc>?Xm$LHG9U%Qt9;% ztCy{Nld8m?-LBs|5?{A5gk=Bt4`0V}iTxLUP-P86UQja_?-HAv66>P7f@OtfFyZ#$ zyqxNrKm9-9`UtfpyZN;=Pqb^_f=;dS~4`Deb97LZ*`vJoz6K!SPRA(ief^J1*r%DZ+X}?u9lWv#Klxa}B6Ma{r%%hfxroj&2 zQsIL%H^tZhX#>#Vr!VQ+FJ0=j z(9V@03C0h4ote@xcviFGqdP1o0pYi4L0 z*QvF?`Pb6x?q4s}9<+wy33X#$_=9Me_7vJtZPwI8JExAW=#!Y)hZARM5_>=`H?Bgay9|VycE|$*iOZ%557E4*4HGl2aIH~Esb8ryNTAOH2PtfZBkrEdhc0Hr;esZ*Rn=KvTqRBooGTW zkR#S&S@klX*P<2Y`XpSFXiIZ%q|rt6)t!%`+5}ca=U7TjfhNV|S~&Mct{cyPaKZKA z#VsG3YwGpY3tW|o1L_r^MY6+n8}iP^9i64yMXnQ_S*#6pce@aYH`gexwT`K{Z?>Q= zHV4JAIuft+Y|Nhd+Ah3Qa@i*JTB`v6y4*P2Bcn5|bs5O2vSmbt_SgT)ZX9UG&7R?! zWR+ff13Zbgp|1M+Jl8|YZN+z}m7C4DY}ac;O~X)G8M&6PIL2j_mBoSk+{I(`n!m4A zn}x{{=Q;g^hP`KC#~=)Bft0>NVGY&b7x%+0Op3 zxNf?|^}5dM9M_@S1EqkvZlc1O(jGtC(asfKzZ=(LI~ex`n?~EJ{m);=D^RoIlWXn` zHPtFmD-TC1F0M10q5+kq*Az#nB#Z0i!xf1G>Xz*Eu>OOXbKiR1dp|!;0>g*n>qxH~ zXKYkilVuBZZzR_Ik=U@-5iA>L$n=40Dzz7lckT0cSX>`!YO^f+-CV~Jk?vAzLw(4~ zI8mneXVDuvM6U~Hfb6X7hsJqw4R`Ii&_jn>a@To!jx<}HTcaE2 z4UDD+AHH*~Y<%5vf%SD+an7DK*MQoqtoYW*ZoPKf zt5v(Wh83@wQokji^!i+tJ=3$+Ys&Pd*W=zPQXITEa{)-9%_^HEHi;(Gc=3DQGJp)d zCP&4!=x(u&UYBII5R2>o@_+rue_3>o`kEh&_pa!Sb^4xxuaQytaQ*=LG5o{yQKz8z z@XE?uQ;)ln`k18LFM8aovPwapNwr)yReqw-s-wu~8(>qwiBHsC6Ua z^5krc#K!8`vsP`~M!Bbq%^ zbXKa(UN-MB&W4xuTK7jneZ5lgek%}WXl!J=)rF%2v`WPpj0^B#$W>)KL$d~@=jCiX zulaw8WG|>C+_*tOT&~5DHn_O9LneU-N=ChQK~4Kj zrRKUP$&OMt-QEyeL#>T88fa@tvhn^kyFe=qqwALCW;hn_{qglXSa@iPtAXW*vfRkT zD9sUNZ6etKxs=*+Jdd#4^4k+<>}?g)G~o?(Di>e0)!sW|9hsI7 zKdaPs;M8cEaIbx?EL=MxQ)s5QL6=xBnQrfm%_O>t=+x222A1P)Ycx!Fb6q&!{oH=r z>Kuygy_ZHqh;72PkuF=N#WiuZ%`T|Hujsbf2HL{eM4#J#D5Wl$2Gm^E<+U-$^*s3{ z-8Ze#O|&zm}dmZ4U97QJTAi(FHzbNyybmd-Ji4<5d4w3}`aP2uL;c#n&>WZwhS zJJ(y!%jLFxc(=Xg8~sqP>t+iQ?rp48Tz9Q)oY9(Tu2+d&R{T(9)04Z~m0;YdR8$g( z{q+AU$sWNt)i$bKTz57u?T$H@Meom~hmTBq)@5*wZ={sWXA%l@t>Sv~-U-dxf%hho z&2v``i;8hjte|Y;x|-AhJXc~G=RT&g9z@G;L%Ur~%Y+AKa_y81|7${yQ=<#v81EKnxNd&v=KEMQ-hIS|>%EJc zA6?w~w0!uR66*unD6T=bs_ah1>-x=&>kN&5NUno63vHI$Hsqcu1<`vjzH@zkVjPjU zZnjXtIIXxcw2s8P=cSp_+QEHdf^5JaI^S6_B zQ>h`-u0*8Q0ND$F9Bp_GtW}|R6RpijDa~XoP(Sh`P^^5+Vy!tMam}-_ba@=xdoQTn z<>buCBkjXUvGrOko9M;$O37fqm6AOGZBZPJR!bT;y~mOR_XbW|XuFPHEH~8N5bDMC zgc|#j>Dqu_`|YFazPj}R8IMvQi6+Q5n{Gg@6^aeAk09DhT>tok@BRqng6oNPOSV*7 zL*w${lx)8<$e1ieac$LRBtE%T&nsx}cT-_>hDNry=0#rnl_0R+R%I8wdxC1)x~Rcn`6t7sM4C70luXsggp&r6>C zfbD<&uy797{DNw1`KVLJF#unsL6y>q%Z^aDMh9vtHT9ZHTzeys*{v?9vC%9UpV7w6 ztRvUCxT67=KufGknt%T&h;FEpeh;FnVU78dU8%nU&ZxgqTytZnCD2VY-|KBu(@DRD z^D!ce_imiUG9{ZS8CPj^6HUu~D5VXu#QOFp*KdD}MX}cL`VnLn(OghuFX?i-?qa#s zc_*4ITbi|jKof9^GBzd6y(y?)c<04hiea^$&e=)XO*p5n}xQ} z=B3#XYq@dg^=Xw&s6QdsTnfgMjW^K`=6b8LXEsivGk!)xZm1{MD71BjSC5P1Ma$64 zT+5A9(KgA(j7neLSfk?|SQ&7Y*oPQxsrJE^)1pht>-kNlb&8-;Pw#E6*U6-Oc+f7c zS2eAa%=UZdddJx&JXsl`ZmuQM#2F?Bds>~rHSb?BLT`o;)CkRX zs3FiGx|i=VP1S}>3vG+_ONBG(K8STiWDLrR=v7LirZ&;u$b0h{f^6@t4P}~WTcDMO zmES(2(O@}BO>!;GqWg$;{I;C700-K!-yhI>FTX9QOP6W04YgR#Lwj!?P4SRv;Or;4 zX|Cb7$@TT;-r{nhO$XkK-LAnkv+=66O|SZEj2Mtg5~ zxx~h#%989aG@U}>=Ij|wxK~fAsL*yDXS8z(=hSOKO;3(7mAVY1@3#;)-e@aaa)!KS z&s=NI^bBMXI!0$+)@~kMEW2u+<+k_!sAQUF0PD5>mA*m>>e%l=G!r~MQ~>U}VB^}+ z_cGz0B`dncb>S@4)-Rq6eED#59h^nCxJCf3H(xm6TGg~=T3icl`tZui$nqKcZN^+Y&q8?>l|c7$8CGxl-UTPeL{n(FLDjlTIF_LgaF2FPUj-3ux;7B=Ae z6YBL3f$eXuo&(n-J=>thCvdXVXv>EK?KLr;TDyaBaIGp^HyF2SI}%SY{>a@%yChq; zNZQYlOBFRaxUFS3&Lb5?%M9 zpG60r^gA-$VlATS#uwU0t|83_y#~L6dcd-w4FG1hS1cO*qxLR&c)B)EQBjRtdBaULcEWkxRe@^#a*AgJ>^v{r-1rO8nw}hDO|BK7HQGtfO0^w{cQ!7i-u2oS zc}1_6Y7ewWFb<6%*Bn1nq3szJaGh+NGSpmW6QWJGgv@li%5KR{JZ{M@#02<4y9ia? z4Q!>t7G)mwaD`)}_^|8&ctL1R9kq#A*LTm&A7sB-`^$JwrREQ>ngYKI>Gnc1OI$;p z6Mz@RjWdn+k!$?XfU~CpmI>FT91~|N^@zUH+d_%GptkEK+O;Cnvfsv81vSSQtjqIA zglA37caZ6|hu&^%ok80~r-9XV^aeHfZN}xg!!<$Hf_xX$47agF?qaz?_Qq)AD6S24 zAF0Smxm%{q^5qK_Ys+!aE_L>kO|&=Ye?hO!^=~NF&%H_27T4AD657;mT?v9h8$_$4 zt=!DBXU7RNa=ijH4x!yhD&DoW$Ip1ID!aKpWM~;Kee|U-9(~bPT-RkUE3OO;*Lfv9 zqu)z_)@ZZVK6@*bsn>OBc3%I*f+x^$+28WEwT2Gk)xnK$TS|B>-t6bd#TWv8okQurdv?6vgSfr-Nz%;X>Sd&UdCH` zoy1HId}iQ>eirD?yl4ru<1(7?o$E}V9KAQ*ass_+qdl6`!+yJ!`af#EqlAZq)|VlWRz}TV37rs_`>Gy||`cw`5OGt`{vE+1|7jH`*m_6g#XM z8Yj{0d~IlRveXNzY6iR3eh}cndB}7^^(gfT*BUMJcfrrV+}mi|c;h_7aBuV8BAU^+ zH&JRuWTcxB8IR3!r{DgYI5E>7M~MV`3UWK8)PrR@@NMjbHFbhAO&4qq-1b`z+ij;Xnd)8*Y97E?pEi* zxnl!i4<+_?m!$WLYiHx^ ze6han)!Dcv(6$UM=^44Mw*?8^;#zbQY6at`*|_ey@HH9o%#F8Xcjv3C?4Kwh$C%2D z$NNS}%eC6awrU4$jiN<2sh%NvA-TBjw7hTz%MxoH&GM?I@ilo`2+=-oY$m+v=1+2z zX+~tyXq%1oTQE8(nFiNZ>I2txy0Zz_bsUVyDkZ~-QF>iOJ1e92?%aD-(=<*CYA0qw z+bqj_OR39yEBBW1ru~jmyOhSm4Ql#u8gFYfRU3P}p$w0iC3Ex*mhsGy=uaTidQwD( z>rm{_JI7_eKh}5{jd!ukaP0af%~od}Wwxo*q1ZSB&vMJfH;`{X=H#~VGO`UfeG|r-XI&kipGq|80M~F2q(JHQYoEOx^vc^Q6a?3u<#c#JY^P(S|gmlVzgez1h{;9JtHs0{obg zQKkuXI@I8IUpM_QEQ@FY+h{|bubO4bw998$Zf_1psx#N~TnV}t+9;xrGJWlNSn+o* zo_qV^d2#*2_rCK(DDoS`8EBJkH@s$mrb{@Tp6NQT8!x2i<#>F{&^UXxvT;wUXhx;b zURdr4qaWHFJRF zy>+=(`qcO>>KEAx>V>vLh8F9b@e1d`^_G4woLNw7Va7}wsHrha#x(txdx^4pwoDKEc z7tev~j~@Twd&y4VKlU<~1F&vYr~veC&ueTh%M{4%E!OCCWaA zWd~(yT~W9{vwVA;Op;wnZR5St@0RIAWJH@vZE4oVQ1_8yZGqm7M~#kT8|~y{rO^VJ zdd(0_Xg9y78~g3B41Ouofm(WfblN4>&ynS8&x2)f&EqvbY_6r(&jM|!Hr==uxMtf6 zAJv+{xB#~suQ{~7XQ>Q1OgPX^Q=5^ve0W)L)Y|KMkdGg^`>}f2%El?y((C2M^*(*~ zZN=M=pJr&ldGx$qHq<&=vN?qIV6+chlW4``M*GM$(UyGsc#dmBx)j``i`-$e19+gO zK+AIT3-)Fi?)-X1$S<=QPR-PIOEtDr8NCET7ovGI=Oj`x;W%X^D! zK)n+ks5g-9z3Vt<#z1k2wd-i=HTd;WAV;P_aX&mI`n^jF^a;yy;P1qTZ(LiNtsA6%3IaB2ekcA5=;f}hmm88vMBa5{W+0ome2lIqnh@aL{>p8_fI0InRp*HIzRtW zrp+}pn)fv_&Zb*jvoUR=r&4qFUJ==zlG$=wrWebAdMLH`n^=QoR@QC5S4#`(yr5py zbd0x3Y=mPL=x~iX+E7EImrNUEX>=-UnQ)0U-*YN@4QaMIgY*Hla_^}2tqyCC~UZ0>ky#-n~M8#KDKDHTyQfh#_L5)nzZX6)jl0fI@pAOu=sm^0c$;>il zzb)1{*BxY94jdYd=c|;~oPgXo#hTvxDA1GZLqVN^6Sk)nfa3_3bu~vrP48`}6?dn& z#vb+?6z^P<<2jfkOnSPt-I;xs3w83(6Z_9L)daIyOO^ani zJ-7zcU|eXQAsWvwmM?*DoVL_?Bf4>hOuv2cERJtoJPWQreC*|&>vH48wdT+o?JXPE zma`bH=8{-fL{`Sz5m_{P3(DM^#z|P4*l!xJCD4bmdO$7LtqwKS zdFi#qdNs4Uny%h7y!U3mn`@{u_h(9JsWZ_g-ClSv=?ce!vkU4{XO+^?>k{ap&O@me z$jx=s`O>=lT$I`xO|JjQGRw5zAR6n4V}7^C0;+&WI>EookA-k%Am z3ukOLmibWM#b5kCfjWhQmAbedCS0R9^xpVo#|qINwJok$L<4Ho)JvutZEQk!S?=N* zL+mb!5Cc#j(_md`%Mc%MM+Qks^V#(QxMmYIX0n$~8a4TMeiJAj(rn`pny zJr{^R)oAl;b=EO5U0grgT+4?)Gq`4emJChNS$DpC4>WMSqdmCRjSXF5H`i=?32I7q z1!$e2Ev|hx6;G-3ibtMw>5ka&5HL_9{B$ z#v5(wW36J%B7W3v@+e1*84~Y}syWTxEKj2S$x-K^J-?ApFZmgw)P?f^S-olKvLmwP zy{*?mI~rZ{^E%_vij!+mykuGrWxN||ojecKG;lu2y=le8wa}gpeAjD(oamcSQ=0K4 z=aj6`6_o>)78aCSf3g<>#Pqf_vYXxtjdvnlkFe}fT-V@=K>}CT;-5`tl z^?c#%u`zueoG$p)8tVS03u>NWbXSC}c3@3CjkjI5i9SfSs*)xe8;kWO)8)E%2VT*4 zrDU8XIB;D>w7BN{3Cn8!uVo<)btfz7_tfYl-VL<`8c&MorPRxNd)kER%vLq(==8I= zzpbnc@KUUsXl#Z|a}U35fi9UA&eUrX?P~f2YNp>5=!W{rjVgoO`&MUeNOYNPs(>hEQf=xrmkaHv_AInVfaZ7qsfHK0KA`PM z6(7Mh=vIuz$j_6ExLZf7d>m+Fe{KeGT(~w&ZDom3b@9A+3s|-V~d6i`2 z4{Cmi?qgrO75oU-&~ALF8Pvv99*+z5V9QVN31R=|>#O;j{)_uo`i_kCq|WSNY4uOY zb5Sa2i}my*)aY7;GXn>%YG!RR4a?07Ee|p+s7Z7-w%=Py291_duZYZCt3!P#tEc6* zQkO~IaJC)X|6x+ElAfAYwEEYUqXUm8{s*YV`D z%6`PEy+ZPe$CIIz8yDK+)=3o{sp3|l{Xbc8cWaxIn^FsEbKP|`i4M-qHRCd} zOq@F*tzZSPI9 zjX^RN(I-kRy5Ap4y>lIPRu8MZcSD`H+o3m)_S>~F)OB<+R!S{_w(Blw7RyFB0u6PJ zQb(rWyx^v|e(9a>yoB*lK~1zvuNk9Bub;IQ2iJcL?He9Nt9z1dA za&P*_zkd{q{j3>xJ0)wP3+KwmI{j{_$u*a~cjH_e_p?@6&4hFGrYriU{cfDa@~Ea; zsnwyLP(z&!IQ;fd>e%mevVgNgZ?s@`?```noW(UgwxVxs7?Ba`9Cw^qLHn8HV|L&c zXlV2mkj-+4c1xNL+y%AjXe;$4G&<3Ddv7asA#8O9(Sn-BTYDXUb3w6w5Z8_N zDzwXr7uS6cG)i^?w8iydUM2B(Nw$VntlI2+rPe-=HUqR)Z5#3=X#l+2UL!{1g`BLo z7uN*5>1Nw2i+ydz{kEVc*StQfeoYx~{3(=sPoj@d+iW+{%X@1$ zzXV!Dv-xPWM`e9zX1yqoeKgdLzH>}O)=+E1n!3c=AP=#oOuL|7M2lrSB+eI=W=q z0$or;tU)mW=dqy%*ZAk}KNh`yH9nkH{D`)=u0k7De73#FHPJ4vu^Dch?QFjL&ze-p z1z!%(y4JQKmnSdP)}%^0+EHyvwwqs8?UHQGtGL!yhW0?N@v^KKZK(E-_@NVp%3Iws7I(oS71vNl6 z>CxzN;JHveT(6p1DcOj~PPyhYIAE-3Bd;#sE8qxy;faa@03T;NL zr;^u3g$odff zRi|M@dlb?7cBu%;brWhA(dK&UwbdEVa3k+szhi}mu18cyOQ~5wD3l{wdviD&@X0<`uu?YK zHrxCVjkhhgj}zn$0L8LvicwAL_mWaOTSz}kAVZ@=G#-AXt2tamGZPceKIZ!O0d?bS z`(14;i*?^!c9qgyQ>#gRtf{Hg<+|OcJ`fF-RaqzN4%(a%<-O|z_2AlKoqSAC<6Smp z?p^s9p`JwBcpK`~#^R7kLoJO4)OO%kN2Qkit~z=UP05B>Umn9T5M44oy*I0ABHXT< zGX1n`Y8)-r#r2EknowUo4F^u)9>I9fR>NzeUA4ADa-&_HuNyaebR3?12IFPObB#99 z&dtWt*9OrahU+zlhU>f_*;Z{^aVO-ivaQ<9wc_zcd(4m*+IU%h`86(ia%#8ZajG^1 zE3bL@@a?vTmh2Yp0kw5p9@w}I9tX<{(t46~gVusK?EmxeBw%Ksd{akA3#c}yV#^}1cR(S}m{Vs=O0fI4@RJEUaGc)KxOmr)njX;1UA9o-UP z;B1!rNWEUh8lv97Qd+N15Y=`|B_UFzk|*PAS{A=$-sT@vC#TWBvgzM<`56$v+rYk6{az98BA zwVb{gTFsZ{iq0BVG2m5h=bEq2_YBR0rk$Zpt_RwAktV~HGgajh58)DUn;J<1bX2tme~z#sOi8{Q!64;;nxPI$9F9P0QUx8~&HVt{Z@y^CkVuNm4@!WNRlPb#4GOw~~ZDiwG?~H8x zylNl0PTNcIxFwsay`ep7?FXv122Dvf7FC;=Td&8UY4^4L(nYP^7j@Q4UA-`ZP*7uI zzzZJ%RcMFtg1tyL?~8h~@8hoQ^3^JwcR6Mt_D7a}m~F_!KPP|G_TE%#oxWB$7HKZM z-t#dK?Ugg3xt;(I+g6@ruZll`W|4x+T+v_T{s0 zR%Jb9`ZvTm#(U@bX)5)_GdQ+DH_>lgd+IFLuYhZzO}b^ptMkRV@z71lW_mUY?Xu$Z z;R(>x^U?*{(Cb{LU4^#i&{pRwBP*FhqZRj*snM2j$B+|nNH(v|UNKsYqEWJ|`IT&( zw!E+C1lLfLYHc6xd8l+Z6?fIziPX#jr7et4)#e^dfjDEn&@0ke1!wVE5`Ka$w?)~5 z=6ua)Uw}=vsuPNEA{K5`>ktBuP4_M?o`=eTwGJEsn->ZV^i~`>3JD&qJ859 zEOO0zs!+RKXgfgD^myNX0i7>pXb<1A58t`&T6;^#6`-9#yZc{O2PSFYnr=|4UHvb2 zx9jD)RNHi~1~<}jM@bc|k(XV&^-Npe0h(*@hMG8Qnc3dYPZ&5i!nJYhd0Ff7+y2(; zd3g!Bi`kFX8HwjB|2jD?gv)93PoX_TnVVG59`e~N_i)|hS4(XyG_cgkq66PF+DS-p z%|L9H(ot%m?PeDHAV52VWTTTst{2pM?tOq-4}tI&dJFIqfySH7F%t{R*t}a0!Sz&X zg4}E8`m~OY_jV7<;h2sD*+dVnCDWC4n`=1j7HD{HDm82B1Jp(I)2|U~s&@Nu$nh&z zPZ4ca*%WR`c7*#Fk5jJ$xC1m9^6AFa_A=e#+VS{V$yTjxw0X6culbT#wcO?%ju}&nxL?N- zYgf}G8c()TL!GfN%iRuKrL-J)p-rfV<*tZ~ZLG52Ez{ZzrH)3QxNeowlIcyO#kGmH zSWkfl#c|z)n(K9Qjm;A1>|eVUu0i*k7f-+Y*!?%Z^CG#veCn0Ur*Ukqi*C2QJcm}Q zT^U+k6~fW+uC*cAthINpquO<6mHnEpR&8=Ev{yE6#?{dd+MHL>`MkN78_$(rZOBD8 zuKbc4$7?SaiDYWUs$C&Dp~jx(Gnxg#a)K0@i*_$VZeC)`E!=f%`mix{er6sCvdHaE z=*|2z?EO5CO>upre0OAGdWJtzPlOi2`1wsSe-Ws#hfEHmCjP}K(D)-b>#j{(Zf~N_ z18N&@oP-)pTd$dZ>s_J*b)hYsnR_?Uy%E$B zYYv~NNv$`BeJ^?qX|__&QW|yid{}y|#H?I*Tkgd*OKB)Ijwqr_mq!mv`Pk(wrH?6D z1lmwTrj2%p2F{dbX*BoP^b*%EzWMFu+Gsx=PhLGQm)kC})Ao|2Jq(KgYe`PGtLN!sXZyU;!W9<(3TCEG$f-R)|D72Q=I}ywN7ya+<};m7VA+;3vEu0MW7eg`m={(r)0h-{4UVxWTC9?ni|p!`^}hi5Z!x? znk4b|*oodsrj%M-3*iUJw0hHOPlI1@O`N%2m|RcSop8(%+0^LBvQmfX0b@@;UX(57lnw7)Dv?oRjA?xH)2sj(LCTTItxpdDF9I)CQSPI`_6-%W2o& z({c9@>oVSr_DLs;Gool?oyasSH@SvPr;Z*_OQzYt;(fG2G*~W~mgTnVj`tpxd$?{% zGuv1uy6R})>@^*@N@-4;bVNqW4XCfc@>~RY&$=6JY>r$H<4uir5nYU%Wj<-+P4C@Y zQ>-b|7U+XazxvRV2Haf#<~!k9XxoZYxEYTR$v)+}(1vPrOyvz(@#Y#GZ8f!_+Vte+ zx(n^p+Ir`{QteESzem8=%~fWS*25|WJpC_n&8QrOwieL#tNP?YUfWornxjE93HmsdvD&mjrZLXg)T^+jx^r2q|qxP zJ8;c=*y=itsnof{EyFRdBx8VjmD07BKue~h(R?R&yKa@$T|`5U2hm}*Y#`a-`klw_ zL$AU0F9r4D`s%4)BO#A!v*)EL(~}WX8*)LtH?>#uD`*eZhFJ3+#Wgyv{+9}ELCtcz zBwJj2hMZ~n$jP_PmjN%mZsF#pC0iS+wuDw^(-g`ANBMaQ#u)?*Vm7v)a?G z(X`)6yz#a&d+5CrZNDvzrtuEfGTZEGP1o(X8^_hjvPMg+PkFJ{nJ)p)zag8UNYh>WRq+SonzG8Yt zu1^fPYHeJjooxKr*RGo|?5YhbJ`!>Y_c_%z*L7?+{=SA)cCOI{>nlX=e)I@e*V@CA z2W_{&n(?4*XD+%~HV(8;ocTt#7$NE9Z%G!{uH$~D7^KdUcLNyG!K@T{JvrpKb-6a{ zbiuE~lzaaH7Sa9*OP%qf7R%*BSVX&yj!e6CRqE%O^0IK$3{W7A0EOn zDYaWy@!rIFajiLFrDTKUk$9_=hEk`EC9Wyc-NPc+ROixYD>aYram{?J>2~fNsIAV5 z$ncDyX4cJdG8pd~8%s6)R!sP^++f+OS@wo3drg_XlrFEXbRJr=hu^l@UdI)VNs+C~ zIBHR*e@)fSYObZ%PXg^$?O&;#&9;}S>^?dhf0g%M*lxeTkrf*9If}MAUo_+gu024m z7!7)@kbK1BMEkbZ3dw75W!@VNs*RBR4!QPC$mPb(^`yJ5?&M6`r;_X?+*NlU8evv# z!#)(;j6}YVfKRT+zIAp3^MqCpvToz7^+kM60L8z_0T6J zd+%~1<+_cn2F4=Reg;R!jJ;9qT*g~9^=G;>74*7T?hO&HC%MT8nX_)j-CFA*K}JMY zXgeHZLA|xH0yW?F%?`X-t_|yGuOrb>>VrTx+SX{Y9Gs6t174v09Jp?fqt0!-tCTKv zrdU(5%XMP|eti_kDl)m%Wy*IvdAC}utFRo$B zjW!LrgnPtj$k0l)+1D<~Hq?FP*TyyFTOI9{q3JHBJ&pFxjayiip(!LM+KX#l)EPJ4 z%`es3)&H_;*X1FTYa8;Wds)Y>6U&pk5!Tm&HP=JI6&ep}jE^`9Xu`_-aU75i(%a7y zSTk!OE;+`N`4DH}LiA$R&osi8W);r(IlU~_IYy?FjGZyw=DK?awW&a?ld*=HmGv2l zPv=63vsos^+@CYviMy9ZuYnUqWW4&%T%XbC(Y-3yEu!D$5fra{%np1nrC;c9Y;ANk z77#`NeoC~^wl2qeqlhNUvER?Apk7mC*5wKH>(hH*JpG!hX^FDi)01WFi)f}~uRcWY zJ)t(;;QH;y?!WQvd&TupvJ36m(Z&!JJWwT36(r^mNZv`BX1@waHjaiunAO?@i{ zL9JUS0q}C;P;DFXw&fCTPm*SM)vo39qd>+a^-w!G=qOV?Sh-*MojF<72C zmX_=T;02V`khlr(1z?k?3Du^!Oglb*TnVmyf5_*Ae9iTBbV_NQdF`Z6GLm3%&DvS9 zK-Ae8Af6fFHum<|+~6-Tba`6tCD7%%RYBJ@KL4ZxYM0VFw)ZB#=}KFvqt`N8n@p2v zX>`}r+^~FZkO?*EZe7+UGA-kc54GPm+H~E7np|@=%W~b;=yKgIsCj%2XiJ?X(`B|# z&@QtrmZi>unhy!}F3@s+o z2}$;_;z`oj`KkcTov&~$$xdI}lKnd0U*Ob@uco$&Zg#$aGlg3Txid6baYEgyUD{1U z{vfnRl2&d!s;!Gei1wT$cmJzzT%1cq3^+4hOt9cZt`^uS+Scw?@Fv|Gz$KK5vJ&(L z(DdP9FvMmNz0L#cqmTY@>_hkA89gk6jqbB>KKx+)kWjm+$7b{@qMPeN+xb|IIr}*f zlQaWx&zT%#T7KI_^ojANOrw-`W169NS?+9AFj!Ezr^E=K9$as1b`X83WXPY_5ZI z&?d!)rSe%a4V(wX*uV176Z4to`jx9Ee{q>rhI|1|t{tPL*2YDhysp!=w)Hx0obkBO z)<7ECUMRZN{Mx3+->h02XnSyF_O%Ds#2i*!>jZ85r|VV>^QNY#vOg@II-t%4;=SRwiL+g|C7WD} zVnc157t}G{;rf|3Ak!t*!+1xmH{%UaCgV?mZi+QnrdZ=hzm3gs-QH8FZMGZaSIqU$ z?#1=xQ$N3aqS3|%g*E_pM_bJ=me`EZs`G`-;F?u-7uqSe%a9B0mhAMu`m(QZtpIJ* z+PQlYA~m$VNH_0!$jd{b-TqJ4O~^;B?Mp?JlP}e_a8tD>-A21F^Bhrmb#UAfvvy0w zo9M#^G~tXKCVVs7Ci*yG zQaESAgaVE89&tYSZ9lBI+i2T+57%v|laj@F52fy8%u2oN_wwFqX32-^c9**YxAAuF zji8K0G<(ymqy5k_&G(sF_M12-AJgzyX*9hz!!eog(|oMa2E}uwD{ZJRo+Z@E$4-wM z(e~THS>C&dKEW9vmrN`1Uf%oKldoVs^n@2l*Fs0^?Z@uD{_T6{aEWW6O}d9-2ogbR_6Rn-8~uqqkvm#4e65IB9!`DZ1SV7 zh<((<{PX%8oiU`;r>B$+YFTd96g$)!EP>M=<#Q2zP-^~7%6K=+j=QUlUQnMYrSV?? z*UkTnjq5VrV7ZL9;%+|Af;ua8G;d%#Yii205^o+oNG60Gi%FnIH9c$U0^Iy=NA|F+ z)BwD4?~-ZjHHfB6GZyn2JuJKK5qA^tVtF*C9e39;rS!$qub$E9)X|-IlW36(oUwo9 z+7n#TYXW}l2_p}#-x^#O+BD=u`@(>)rZ$CJhJ2}ZjiQxyKl_@YK94p%IiPN|HL^l0 zUT)murtAHH%ykvoYJOR}QE^MYi|&rmEZKM9#)-B)`OF+J@@3qHS5OP#WwsAQFLh=h#$le| zyeqXpZi;EP<+p2tuC&jks-t1KwPdpeHO{?5tQXEr@yVuGE~p{Rh{X&wiLT|#r4@Jc zf~S?occPzj)2fwvp?xWh=D^8OsRebTU2QD&v)XUle$#b} z>l5R>hhq|G5nWKXUYl_pORw)juYY#&#Luzf##^;*$T?rC)o#2E`O45F*^1GwFS`5Q z<8vCVxd!7K+9zY=$JX}hYpVr@|87Y(8F#Hc-mH@?utHl2If?#AN!kh8skoC%`tJCWFm~?X>fu%KH2XP4TwT z@5N{I>x?2geXHESS#&FAthjqX-DpFFc^Bw?t#EARWBz~9B^y9{h;_WTh*tLs05*Pi&5efZ+~$=9zv`PO51?Zba|`2#?0u8Z#I zwQB7``^q!qHI2q3O;e`nXm?+`I$siQK+Q4o8bv!v(r|@H0B1r@x|bX8oZRE4o-&mi zXP(BKJa=5F7;Qrv!cEm~?WTf9vSZFmwe?zE@9{^$ifkPXs?a`BaG^~Fk3Nb)3aB@S zV?Xc8mmlT7{q0!~fKR52mK-mZ4Rwwt+TZ$6M>_{I$m3)+iOxPOv!K?(JP9(!+?yzy z+=uGOa?nOHX4k#zGC>y3*esdGlNM-h;=K#!CR*w&fo`-T(~iX;*#l~|u>f_rb}|N> zSzjNZ_Cxw@F6Cp{+j1usv+LfxcbRa9V{B%*rq=O5v|=$UwZpMhN-vN>w3q5=RnteP z%Xow60rf+K`h@Ez?89IC_FcGc==IMopP*`s?w?mY-sN^rnOeIUquG-O?RD{&Gc+E{ zlS8%5^+X%*2V~*aeHdOyNFJ_(_PLz==4fpT?c%y6yOXrusQM<+bH$UxO!{gOzl`ZZ zX+)=XX0KV!dfX|6j3b$KeoH!kThwi!%Y{~aIv>Wi=G}^)kun>9c zW>{l3RXuU-i_M}HX#4s72=;T9DE9MZ_pi2|)IXnB)J7^ zdh_0_pb4_+UJb0(!!p#R(Pgt8h}nw!DC6yLtOXiSAGmJee&`8u{n&wPxbYbBcH<@4 z1MRqR&Z`vKx>NC(HC=RblG?8eKJ3+;zFlV-I0 zh79b2k?uy@c^WNx2j&y%-n-)F+jnm5Fki||1X{j_%(aMHz6~{x=CL=y)6b_Qx9kqy z{rvnK?8hg6{wN1U@-@dN;~D%&_>jI!|493W6dPXmtgaGCip?^IObj(ah7T{}%?(RALVeD7dlpoF zd#Q6+Hr)xjXH6}Z@jPO&QA!8ur-8O+OME27dKj?|-Be^eGyV3~kDf9ur)|GIkCbe( zob`iWJ@kWLl4Wdm;TG3#K6dxjZ{J0Gi+X*jWkY`A#*1$BwTEi!T27$d7lzDvl|q}{ zZ9%QOtkkt3!;?4K*)U97!{n!`?Q1+UOukeb^W=P~ShaZ^jj&YTi|!NE?nrG%TgpYQ zX;zzViCx&iz6J4gW6><=dEo7jZn+(xxN$6+151^Ara=2zn<#Z>-BxO;^NHEs#M;s5+OX+324Yf3Sw4?*|#JTKux$e%#tkJ}odj0xkQnEt$K=i=5xVGO` z_lk|_gHl%ot;Td!(=p!GXdMCdFA2350TPe zTe!vbPIs=vR$21G+HsBxyj2|#JO-5+|Zk7qAsnmu~7MS`3LVaIo>&Q>e z=MOvGPcD%CP4SieefwC?@N^WhW*a&W>le}QSWdg7+1^{0yROt26qoC^_m=VY*>Y$! z&9>1V#+y%;%`VFgqPb>2da=A~G;#JbQRf9UUAK()rqN=VZro76iTm#js8dH@J^Lo^ z3ZikcgZH*f*HO85KrW&w&EeWIEwp913*o(pre6OVA6j*EN@*3*orx(KLmhqX$%S(( zwN;x?do8quIl0EU;>~YCukQe1=yk6`n}ExW`&fPLo<w|vu?w`%Khu;X>y zW_$onmYeS02#uh93i#x!5DR*u+n9&kdS=o3pl9%9{ULvS?EOrCyRnh+UcOovXvmEl zY8D;*sQq>-=&G7m9leOwc!?giWcObZQ3lIruLH~VaMjMCTbD?4FSMue-ia2@h{Xsp z+gK562{euOZn;5mRntzn!!_&ZUI3YUK#f~?B_%6?hS}yyI5uP&6eB2;MhoXSa2oGj ztm(S7%6J#%fST%ju{3&j-6uV)fwMsdw!geamO=5^g%7=Y?Fn%GYjXXA|8ensaQ#0- zHw}5Iw$KLA>~6z~dwC!Y3HkEmtI)P5-)6|A+H7qDZHDAawfmw@j;tJ$G^=)bayP%! z1=A&9xoW%6cDXICS1+vRPM0UQA>Si4TS~UWPKEn0tF{0yI@+jj3O-4n`{uEcoSgPY zdow?6FzZu9YjMsP;~NQTmdXC{#)g)It$hCc3+e^3a=icGN<)RE>T(6f%VQX6Ny+vDKc8a-N9L!$@Olx92x zyx@9|$QIG4rmLVX%WbHug2p>apCcL?jpx(464AsNEC=T;?gr+Cwgvi0kjt#wYpb2< zw8`?d^F$Zs)a&1T>rQhGw9PdQc~%+n>VFNc2{iy`+slT0TpJ=!zOD^Hp*?HuF1KOD z!T6~mU#cB9zQQzfJyl!6eR>s`t`;HYs&p3m?klVo_v}=p^v>GwkeZUBlu@X{58bdfR_p3Z_%#%pwR*uT&sdc z(+Yo+y8KFiqN7Hmz$vaL)K=&E)xO?(dkEzBD%&wX}t3QOSoIU1vm|@7|(HmHlcg){>Y|2(@z%l;C=9WZcp*W zGTJP(RofSFQy0KEb8^{o1?FHG%OdVQgu4JwJ8U>}O|uBiPOcCf8m9AY;R4f^&mhEVo!Y1j9p@Ayi~0+kDsv z%W3!3?xTpdI#ZW52s-QN#WMc*y55$_nD#r%pt#l9`^7a_=JgsZqP@-}-Ui%px73+j z&&6a+`PdG%q*)OeBs-I1D;7&WX5%fT-omkR-CI63EO%AY7f%6duDy;H(N#q6)iiOY zOfw&AX&wlZ=${keBiDvnKHOYGufP8f7vBTd=h0@E#t~E7a`nHMq;;*0O$>PoZCv){ zE5GXcFU^_)?WWt)XhXF_ch}n3fM_2V+MY=R-78GR(BmY??Btg7vodYgCV&Sqz63pPpH581bzh{|l{zV{N>H z_Et)>g7#X;7!WSNyN>2&Ks||OET++J4Ub8wh47})^-KrdMKoOZrCII`9~RLo>!v7g zMKt1W24x}o$Tb*0AzIH6XG1Nbn^SLuHdzMLKPS|4ZJ3u{-~QRf_y3+;fA1fzHQmg{ zW5_Rm0M)i|18OGZb>-L3RcI?7586z~N%zxQ4fqVnBiu0L)^3L6n`*BlP46LM;l>4? zx+lX8*4oYWKEA@K@`l=~U39bhwrYC@6aQ>KrN!duQq92rHHoK7RxH4g|pFC;%!~-esmSl zJJim^O0Q+V9eU#!2VUwdzdZ%ob@Y1X>EfCjr8f zHqpwug|;Z(Y_^{<)Zp4^OSl{AC^*g=Z+z>{uO7eskKp>+_qdL#jU8W+&!)QYYR z0oPn9v|G4awST#U8-u2;+Dyo&YTKEgsVhZ+_B|&8L;AB zJ?_SwJ?`9kg@6llp=|}16>s70jbG$_+;K?tjVB3c9)^1t$Yh^f z_a_@qYOeoP32vbpIi8|iT3kjV|71dKUtMRXi8J<+Y2{!>y98QFZE02xwxY1Ao$+TB z&gw@e2P>`vwTaeIq71H`byv`hhk!Q%?O3cIZqh8eA{ ze(D!r`8(r8Th9dc2GFSHAs{^=bUmYwT6tT4*GEtOVS(&#jjycJOMRMuJU!Vz+wo^s zj?Lc-pG>0N<%cf!26BwwJrOrZcPBb%6K5}KbRzCPf5vi`Mz>Oz*{1g%O)CRltt(u& z3vzk&?u6PGROXqzg64Qht*v`iEZch%WU>5gvTmt!QCwL!aP}g+osTV+JvLTEtCXfd zvy@IOrh;1hE|8mOY(lg)(|cn-pbpC}s3*v$`$iiIj!E)2zIEGr{dd>?oKRD>?a3cd zYjx-fD9* zDnA9h({jE78|@0rS$&_=ZktkkNZRcq={Dden3HZH$?M1><#m&XnZNZ%`8fo0WAhx; zhBOqPoLl_QPx!5~kbX{4Y;q~nrOU=y;e$(QyK5_T?d7z^a++4yxAC^S2FUos?iF;Y z^9saF_YmmTXrjHKF0MtfE%#|GCa67LVzYgwls3pm?+t!2;4Qyh8V!)4&SwOgTo=o= zq3d=j?PJur{C3CPi*6E~@enHW__&I2hL9c)L_$?^% z-(CA2SE;r#w63)|uQFAewRXp7=TtjMTDfso+~WG+$$|EwTVWb&?Wx*G%l9yih8#rq zBG+JftzcdgEUdT<_>^zSiWGdI?P1iayUzeF;pXd~8ypS0HrzL5!skJ7SZ|djSPC?@b?&q;t%lr<%&A&$Z?NaB#GA6`$ zo&?2oLEgj{4PCb7o={Vr4^Y?tU}-e}TLE|sHb`%Qw%Nu*Y<%=H&}+N}B+F+X%Vs+n zdtIS-%QQ3^`?B0>OqWa-)D-Jxxi-{guU9D0Tr(moziqR<;Vg|-);(M|6Yr_f+6&uq z-2?5PJ@malh3i)y`oZhpx(%+8m_e^6*U)aq<0B-m7_Dn52YYpFJeSa7LGX}3sM>0QEYf4&s_wC>g`Q+2odVx63y0i2p{ z9LC0&`+4fP7eH&wd(-swrh)Be3fnWxj?W3sY%2@x`o2EN)DKf>7=;)=xip#x%bA$s z;jvc*&1lh1dmY`Y;vY&li{ho!dALJut^+btGUi~-wFEjR=N)RaKL*YRu8Za6zzgTL z+?&~MqBop@HVf+NVMVE(bpz_Bo8r@rpspU4LhoN)802{*;MQdx*}bwrv#cJLJNuts zOWbWm2E|rn5Dl5u!+E4q`xE8{BjU~Ve=n~8?&8m}My*Xlj@5-WXHAu%IU$#D6KYMP zx&O6VU`*2RCP7+K?Uj&ETMpG8d731fs$JtND!PHQuNf(>t=c>S=b~E;Ze7aFvwfv% zt=*@>Ex@HURva9o;Jh?Us}%ego`-Iu-37SF0zM0E@4;PfdXHy%Kf&~VKl*FhMXz&3 z|8srud`^8?J-l%T2p@?qsEIZe*(~SyAe^Ddjd`G^QWwkJj8L*&XuEJOiqWW|QtQM^ zvocpMV?AL<2WSSbS zzLky`9-D0}1>l@8A=h4ExuD*HZVI$D+8eSwVzD96rgh=`XQ0?z&rP!*Ltb3pgkFPd zp-rf*-IDC@{k@>x(f&TU_Hsf#nqMc~ZO@wO2-QXx?EJXt6X?fG#&KxgJ0AA)?VzdB<|Fmog@T$aH@2q;!J}Y3U`LMW0%+2_I zTxWx3T)kub+Xi-hPQmN1jOVwNpQ`x{yiM`k41>LNc|J*;!>>2OnSU{FGR56(XbLpn z#zlbdep`bjE}E`hSao#Gf~uRTo+dpup|&pfMh_E_f#rB_Lmm6Q;cT=k8AI({>YTEg zrF3n;Co-)fT4)cVg);y@5M3;{OfT=fN@;VQPP8@pXuO59`31}0`$w!lD~2Jsb|?gm-)zHpvr74Ai`4YsOdKjYME5$)Q!CAc@M zB(W9~cI&d}2Cyy7d~Y?|>|Wb>Z}U-XuL_WuD!BM+i9ESJVT|{ z?Y3AipCP&>n`YYuHRO0n^HW_-pE_-8v~fN_ZCxhR7jW87s&td^*(^@K_cLiUq1H0g*oSU@)a);`;qYJk)@^VNY5u>j{kMg->DI9f z`O46WZVs-bwH?(ydqalR<5qW@o_wk{##d~}aXfanuSd8g-we|#PYc?emW%6_?-8k~ z;>MLDym$nR+m^G(?X}Rhf{&N0<$C~5ovKB^Z@=rwmXdF2dSo3~37JKZK|4LJQrA{l z^>4r&!1h_9MY*5ZHdg0NquH4PurvE|lRO$p`6KAP2-L*GF+eA0lX1px7 zPO9a)W4u`$c}bvo%1tt6qWfWFdaAQ z@}cjezW&8yH~;?P&%yOX`@d7Nj|sV*`S9ceZTG(zl4n)LJyqLo94)Zb1w(85S9^?B zg*Kfzi01Na`KH>uRa$fHirdb7_;U+4q2{74xGDC)y4zg0IWNp@LC3L0TnU?Xyo&KE z$;E!pvthFV*bl?tcst*TE^@x*J%p|MlhO z`UGv-@=tjwnz)WtD^l&?x`bOlqvVz3z`2{Yd(-ZvX1>Vxyq+B|2__MkAV}k!oQnDtbLu-rfc5|! zn`|!4`KK3C^i%E^wEc3Qif7ZQB*bwZo_w6)1Z0yge(S?KAi^HUm-RQbH1oT6`s`n{ z&~iRaR2?#C>9QY-)&Z@~CK|m<+(C2*bU~dIv&#Mdfanhof#yV&>tml&l`Mblb|`hv zTb&E^;=qqk3+F14sn#ulrc4WDd2A-sWSI`Ul4u9P@~+Xa+$0)xE%!a+oPIl8G;j{5 zJt@BbCZPW9{Wq!C3_`W90Eb?~hl6V*)W4KoOSM@*V|$)W>9#ZOPnqkf+VSh(8L^rUlU}ES z$2Hb#THwq_VQmNepx{<9JT+z(EOU$r4!E}Poda%=6Hgv59*4f0{p<^8A6c{-Vci+z zv}v9*D1J4_&r?Bswxrmbb>lL^;97xvwIw^(hD8b^X7_>^<+w`RT@&M)PyWHV3|LS* zR^F6lF>xIwZpVPStK9y99dQkr2Go&CW6~sSc6slpa$B8Q5DRry9?kzalGvU$kef5n zE!I&JQxfgOxmkXGfjaW&vCbqWt%_(Dx}SS{W7(S~`giv!)0W_L-EaQ(fuPP58=D)^ z+orkxmzVz(1@K=!_xb_t$hfs+06p7tQ?$TyaQz*6|L^;*D&rSA=!9;W84mP~-~Cb@xo7LzGLb4-|VXPzdzYWyeI=Aje%a zH`{41Nwm#&LS510A?HF9gf-#^isEIJ`ceQZc7+KgHicF{%hsPT@|pIsesbSF|9_XzMwVnBbnd_K9%+K2{F4G<%e2=AF6!J+({FRvVbaPn&D>dqZf+LHGsr?WrFlRNgxR3fgqM{u zZ4QuuaJ6vV3(jI$emji!NTrwDxj|M2U8%IaH(7Q&5G{3Hpr+*}%WkCjefsbu+L&u^ z-3o9_#R$Ol|9tX)O0U5+^x6%8vxeqe`#pPd^T)u3afl&Zj%O zb&9f!_&Wlp(mrNwnf_hbF6~s7)rPeYXL^F?eW$Z21$E?xrqjtTpJgAf$ zTa+c!fSO!Osoz)cc=mWXlkQY`asB7Nd-+d)_1qipK6pJPn}$5mMxC6ca%bF{*Jc^5 z(8koZX19A5EGM{2webtaT5jsKD+BGC-G*xao`yV% zA;%kJoNb<}&VL9DGW+_pUOfU-d#<_Xr^s~@&A*8!pfy5M9e<@%WI~;d6lWn!?iOnbv<&v5&Skk-5KFNp&K70-FV6_rmo!JbYP9}`Xc}*N?;+5P zq03nlV{E90I_KIFvCI;;p$?*HzlHDubxSjqx^$Tu9Z(}U;kq>4ui_>F54|SWAQyTq zv<>w{yR{p1Ybjb5)8dis{7r^jnU+ynSUec$e#ZxyMu=B*GfhB;;W&EFAQ;VEe*#R>KM_unwx7-W+tH|DqrR1h}=?ZsRF z&nJKWyO+rIFP?kt7eG7PnrrW~+gfY7%x=q>a~XLx3wJFy71vmO8X5P7c4#*xJBw*r zST3~dr&s0*7XGAC*mAk_oa5F4)U2wNKR4i%Z#ccRW^O?#z;Tr};8vd~uUVm};1qE( zexl<^Is~!Up*Whajc$#bXdHZrwt*c7*OAg+NG;BfELdmoVcFMb;Q7@w^3gxT=eHK) zgDEDt7%71^(J|w%zXJ{^uEnzJ+j2gfy86QZ8p}Sd*ZA97l(8wCPc&LiTP1Gg(OzK~ zd9;i-E8e(!M?vgLrfs%W6O-k(G*6ZdwWL`x?d9B~I7VqU%cD=HZNF`e4%eMB{T3FF z(QH2;&e0-|uF2>VoKvP-ZOy6S70Yk@hIH>-6YY@ojcbZE8o2&lEHMN~}^0kuYMW?OWc=*e7`*+d`?R;RQ<-2~LVa#!JvYREfwFzySbF_Lc zjMv5m+Nt1s%^X|{?ZuxHa6nz8?>Y{ydBCpbl6CSjT5@gBMo%8S8DLI|4Wrc7RPx|l zw+RMS(elfQmVQ>YOrN(#%>nblLX%$a2Uu zG+Hv9Xoot(ekakb&JA^WZ=szsy&G>EW@~h7Zi=;7Ce*(vs9V0noLj^x>&bY*jwipM z*S~$~3s7fq{W`cd+8D8RJJ-&18;N$*(^MpvWan~IC*7sjSxHlo9RHt4RLK3nh*i6s zIcK-k;L=GqxKZ4g5l_HB_dim&T{b7(dThkCwFx+&#%7{z;a1&dENh8t zH5Z)w+TImh%B5X_fLRb1l5!Z=0kvcE8*l~7B2H4vae^8A{=brV_X$1@HppgHnyYsS zAx?gA{CpS3=;Py65bnAt#sS8*dMR?I&jOjd_$PuoBTy1uz2Gff)*m)A=%RQhS`=gN ze|(tF0#K&iw3a)I+lIP{cJAysEZ4-is3~Qd*>rFnPTTx0eTp>@h69gOxnph`t8o9hdQ&yWuil%#b(H~&GrKj?PkelY>-d-bmIj$xc>LY!S&Cr z*X)7zYh}n096Wh0Tyd$~4~gh!8C)kt}X8+YE!$#IB*8+OWuuNZ)kJAI`b@^@7Z@<*oK|`rr^X`3NDo- zO4rTw`2f0KAL&4Tcv@mRTG@2v(I|*bs1-w$MK{%X)o6}vIRCC4_y%=&SKeBmx7;@F73u$1wQh){j+AV~e}R@DwL`?A*BjtNzG2P@dvd*abzI(+ zgV&{AK>}j!V-JX`m#uYaon)!T-a%~!l|`TNH19L61N1JFWhVuZ8gMUJj(0zh8=u*$ zM;coxvW3|0y8N~%rn|Pik<(6%4wmh=%WPYnwW(Pup&imJgbV7(p^!u~l?KAC(Ng4? ziOv}-Jpd?*8|swltcI~TwrF(d@~DY9k1nV!)6W}cCe*`khvn8tCedaYCGO|cSnGD{ zY&vlU-CgLmux>=#b^qqU8*KOA`1Kjr$ucwU8TYAlub^J15C7SNR~v2B&??tXL(X&? z6}Ix^ngR>D!U)U_lG63dz2M~rf@YK`9 zlOBL~gM2w?i&KJ^%^cKsr@ESFuuRu&kR8-!(MKBq_WnzsfA_&_ z;94z(n;Ex~?%~Nd)du5@cB!_|-c;L+gX>PZopHBn_e7ZLY4qfqE$^h;t4}=<7V^zs zEYFPF!L;Rzb`J$_XKuz*yEz@k3zhR?l5bqYmpX2=aX|RhM7}qRtTW^dEGU+FCc=yf zyG=d;Z>W7LsqhWJUhRsHijz1&Wo4WldMLG;7cl&)zdu7#WtE6IB3Q|Lr58raI46B}$p2IF{+N=$1MI@HF0U{~jRY zx4fv%n?TcVn`QN*++70AU{U8I%YgcQ@xBus(rnA!#@kR&v@aN^WT$FRKmP`}{vVJ3 z>^Coc;oaxVHTzI)ICHAD+TzKN%S}l)9}(k4FV#bi7cyn_q6ef<{&r=|7Ddy($ivNzAD-_?IR zX4^EUexr=dvf;(qgs^+gObO>!-rkGv5{>saYcYxDjZXYdiVJ5+vq8R8YQjsi-O^l@ z?Ny+OwnbS)lk1RaS#El4{L=$%R<_A?x$cCT1u-ydnf^WEX}L3@-lQ3u$ejUl1}n}G zWvMpR8AQ8{S?Q8y)x=JSriG?hLwOlEi7s*{)D<6(@yOO!_MKdR9{m3FzV({@&j;N# z|21qmt$1m-R9k4fjK)OUXh+5^w8^zqySSEizs+KrRGam*kniy1Vo?9 zMB8#V)WlhHSdmSW=(m2$HY;OU78_>UGHqcc$gXv}AFf*zzy9m{um6fB909HPv4Ld_ zZbav1D0p!F1YE!R(+6zn#;w|~Lb6-6a|%r9c5^MpnRnZhhjyQ!O|B=}!L=lts_ka9 z`CoaSWZbT*W#0Xn&bwVwlbC`*7FX z94u$z9CpZmQujo=O5D_9%d`XckYfeZWwIaI1J=+Q0 zM!Nv7z<^`*8h!Ya&%=BFR$`z0(l088e9u)0B)k6uH6@0{|SuuPws!xP@f35(MGPV z1!)6qPlVZ)H`)^JH~g~ot(GHo^kw-oEv=z`i5OQwOdQfXz-B>J}x%yqkNNU+AEx8HUj zx=gf5G+C}-ao2R+=GQp?>K>t8`mjldgh!EM-Y&4$?!rIqU7|FqPC| zO$+0#Y+k9iZFy{3eU3BWspFUHRKfTVbc0j)H0c7I;|ehDR~@O3w08ntH-zzWoX4`u z^Mw9t?g_{6FaTR#x`GOQmLU?7^GAMl;I*yrCwllV8N|9Y)3heC=%%9CVxOUp@H~q}A`-e+68VZn|-K z@=mu=Cr`8^F;qM9Zv7}?aGk%z;)$?J z?e zPNC=cd)En2^W-&e$JV~E-j5kn<|F_3~`fGCi$#?F5@|_2- zyd%|St{tjPz_XZ^XoGRm?ZxD)a6gDeryyEM_wx95Fg}*0m$AfWfrdOZA z=Zg2T?lT~Xvx!8c@QGvvd6-f4Jp^&yOh9X$hv#p2Nv@}&aL#qSaUS{`ew!nnma<-x zS?(HtD^a|fZQ~qkNK_E(+&Q4mnzrw{=v~&9QiIte&V%AfG;?QCT*foVw5i>R_M+NcQl6^Kz!maQCx7ET{El({o|5T~^=a!* zG^}V7YMFD%x2MBYPb15z+R62t?A}+HNA^wCj&*AX1*d#(79AI@b$q{i<9aUGtyYxp zrQyn7k@wFna!w6QiNWqYB2F<_R2tQ0GZFSk@;(WTSlDvzY2?UFZVejY+#D2}-{@8T zin#-(%$XXi0+ynTK_i@dkvN|?ZHqDhPj$95dm^I+TK`hE+2Gf%o5^yoCkcd^GNaIq z3>teW)?QnZ(rm8Jpe~{jq}e9sN}mliy!Uft85#|=6Kb;T)=4yr+c^_mu3MJ-SCs4! z)5J5lPMpoPp(fYWaQss+&tx38i)v7C>-Bq2K8LhgT)#rqrf}Pk18wHrOuAdOA>V1s zgKn0}C)bH~0PZqc6w}I?_b;7(YF)t+8MhSNTxYf1i&(mz)^lN|8+|6-fp!Wv^KPWr zl5hPsi?VMg-6Qq3d`AwxVZJ>z2EkIJa#_4KnLBQ#(Zxbmp>4%XJ>}|F!|w6DHP)Cv6SK#TUV3d^9_qY6tvP7TL{}1>0!^Z$HOq@S z({d|`w%JaE!E#o^O!1{g|B4#@+Ar^!Yk)k_j@UPZn;93^q2PFU6Fxk+zW>UP@56^1 z?N^j&2i>ZnU7+o}`(#-fguCasqnP$Qgj+wU1nmy_4ycXxu;q5<%XC;(%VQ}^X?ISC zm39m8aOMMTx^!GQ?&Aj>I1<_SIze`#;3eNRO*UW;`34kCx)l81OUFaOL)N_*1~^;C zgKLuL*65X<8pDk{aT@%}S_iz_VOOu!2R77ZHg8iO&LVd4Ynwf7jAxk_U8ZWM7E^^O z&0Y)^8f{Vb-#i7{IJ5sW(Uukq>YZp|o@H$rZza@O5KEZ`)V~{mr`c|t!7`{i_GG$D2SGp6}f=zakn?C)WtXHAhy!Teyqv z3i4grz@uLG-^Dd3{*ky&)fV7Nx>vv_-ClaC6)X~Ntzc2o%_lwW%rynZqhWvhaB$@2K`+sU7(mB z03KU7i)G)wz^PLb3bDR;Y~s&CqN&v8cMUl2oU6h}F@R+qEUIDLjOOwe|Ba}^$0l;+ zw_~Dea4pxZ|Ba$#x@y`)`$#lKdOZmdj^!ov+lmuvvTUN;Z)b^&CGG-wi7nHw!+sZT z0MHC72yzh{UPH~^!W}(dBK#G!ImgTUZ1omf@LO^H%O{`x$%9wGwc5*6?GSDS$g(rh zmM32puBfDzNw=Tf=F=j@^`hEq#x3nm;m%pGu9hd=UVyrxjf`6hP~Cg7+iP0ZyxXK_ z*l{r40>}8nFc=?9aV@*0MTwSNn^}wU%5O7n33k>@uH9zhJXaG9 zkTaFu5f;&47UPjh2f~Rq-C9^~&R%UAJ^Z#Ux5TB$G$Q0+t;fKTm4wOj>r;G8A3T%5*?TXb8vvj^RUb_#b) zcJH?Q!-Tya9^pz<*>Z4=>2K=wLBR*(XMpF0M=9ZDskNz`ChM#B>Z%6s3(ouI=3@z3 z9Y1l~Vr+`m>Wff=T$>TpJ)}?dilhI)3eIaXpe_YxCZ2=1q&se-u1XP+QA%!u>Pa;J zM@44YA~?9-7z`3q<*_-DoblX+@p_>H_I$6-g*`I=qr*bg0)2Vc+9~$EE=4(^W+^-G zjf9t_Fp;}v&}pr6ek#nip{B3yDXNMS;nd}xfKGQkZMO4hk7%OGy39W6U~=Gl5-o}W za<%4~>TGE)%PoNhN(Q+CY(inx2qW1f!s3@bG&-QBWM{)+0k~gs)(^n_roL$`F;>F- z{_&rh>mS^I2~a23gt}C_(e^A@EK6I2yVkCFWg7b`rlod6wab=kUaaXxo!p)rM02Kl zv}^5NN^0rM-+G^`)KbAiyZtyxD)^y(zA5mkIkgIeSPE;>nyA_#U+u-XZ9~ej?=aS4eX0c6yvL0wm3Ofv`bH(n*maV zWhuu%te zZ~XwgbR3_ApFv!I;TKOn19b-1iFN~?s!emw#dqdsW<-TkxjKr&2iN!*5$`}a0(6j z3�~C@bnhdr|W&r>n*uau3oYTW?u+ZVpnMtyj)&X1DyE2>W(nW`#eo<;@{m9J5+z zA-qgH*=DSw9P>>z822uHJF$#g*$L5-V=J6td5UsDT?K6y!L%vM zolpy8pe?ACI2XS&*rb`8pqSDuioJQj*`mDrZ4*t`oh{Pm2X8PC(N=0fcfvBpZLR6L zLzfx+f_iPPYuv&en?*4WuJ|+`G#uadCx_=;mK*sL39F6)poNXPg@S*_Aj7@cDsbm zi^P?4W#9TghWck5jJX+45hv-mP;UeHz(I*QrCd{KR`ZYiu>n6YzDVSW-1pre%|Ir? zBvEplK_9?zdxo=qepDQ0Y!%3jar!+Wo@f)R*Fu{;_+ud@%IIFqD`nl z_e49iTU;yS_ImPI!D7|sGb7nN1@<$g+thA~HGFslyC>h0?pZURXd{l2+WH%bh4xXq z$7=JO9qan}rGkU;6mbUDZuQb5k-otmS9?2lLOs@~S8Ui-X%FPVBdJHb5_;ba*oTY~ zz#kWvCGAt*R#Z&Pg%+n=0eJ zn(}sSE#*7rzAX*$Kq#*+{s*8vO|}-DQXk;+{^;fpCvCGpV{$Q zAUTc$EXSqG-bIj0qr+^6!3NGEH`MuvGiR&<>O>nXvIM7yO&ryNUr~Qa4ppa z*M;^_?LqgFamV^JmDIE*%?r!@%*dSMCfau9u;py3tvTcFxv*s1vtYBIi&&;PcWn** zntHRUR&8eAk%MzhOJ?8s^NE}RkELs&;PtDV8APuL6L7Q|RA6_VM4#XcX06c)Z&+(1tjhM=09l)Bz8pjo zVM+Glu_w`?&aQ7)i5o1toe^#09W2MB6);B;j37&?RS@F{+t6jiHxLbVMm0=r<+PXu z%hgWMK2va`U4U1xD0r345$N7xu7CCzTt9(cSCeE@zFW0Px0CLe0z*n3>rNx%&L_ei z)H5UCnoSw^Cy{Qmq(;?d1JOMf7E9EafYXr2bQr~23f{}hJLz6)=4KquoNLwigQx_Y zjJJXl@FUs*xYBJE)<8OQa9oO3@Kwigp)y;1T2VcO8z8HZnrfgAaWUv|Z(hZcPQQdC z&X>>gRIFo~S=P0j0;^J8@1lDSKdP}^;GH1juBC4+NFB%DLE}5o#(A)8a+xf1&@P(3 zD5crKQU@zhj+&TRR@Uq!8mTeYhE?v2e{{sv&m>wPL!D0qnjidPspQ?Ir{V$Kd z0ItFB_wGF|uIb6|tHG0JJ=f3EEpNU1hp^uVG^S zUmkz{r;q;_6o2>LV>F>1fGgd0(%r(1JHVN6zZ__H-VG~W!j0I%4Yaq^J5{^T&Wu~d z^Sx%SA1!bBern!b**A%nb|>cH&u>(4qn&``3Y1r$YTl|uwAqUBD@`}=MS5)>5j!$& zcyZ*vP_;p;dfVe9m*WE2XRg!MX1%p{C9vi+q?z}kaM5!-pzd$2V?u}}!DAO?I^nIQ zfHi{PQ*Hv8K71PNEl#c>%AAaL%1nW_(`N7n#QH2#W=(9i)M&bHi!yqa!l=~HWdx

_H9SvTnxbc1j0Mw}uJG!%ofLNAD` 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 literal 0 HcmV?d00001 diff --git a/packaging/windows/installer/build_installer.ps1 b/packaging/windows/installer/build_installer.ps1 new file mode 100644 index 0000000000..868738a173 --- /dev/null +++ b/packaging/windows/installer/build_installer.ps1 @@ -0,0 +1,59 @@ +param( + [string]$Configuration = "Release", + [string]$SourceRoot = (Resolve-Path (Join-Path $PSScriptRoot "..\..\..")).Path, + [string]$OvmsSourceDir = "", + [string]$OutputDir = "", + [string]$InnoSetupPath = "" +) + +$ErrorActionPreference = "Stop" + +$ovmsDir = if ($OvmsSourceDir) { (Resolve-Path -LiteralPath $OvmsSourceDir).Path } else { Join-Path $SourceRoot "dist\windows\ovms" } +$managerPublishDir = Join-Path $SourceRoot "packaging\windows\manager\artifacts\publish" +$installerScript = Join-Path $PSScriptRoot "OVMSInstaller.iss" +$outputDir = if ($OutputDir) { $OutputDir } else { Join-Path $SourceRoot "dist\windows" } + +if (-not (Test-Path (Join-Path $ovmsDir "ovms.exe"))) { + throw "Missing OVMS package at $ovmsDir. Run windows_create_package.bat first." +} + +if (-not (Test-Path (Join-Path $managerPublishDir "OVMS.Manager.exe"))) { + & (Join-Path $SourceRoot "packaging\windows\manager\build_manager.ps1") -Configuration $Configuration +} + +if (-not $InnoSetupPath) { + $cmd = Get-Command ISCC.exe -ErrorAction SilentlyContinue + if ($cmd) { + $InnoSetupPath = $cmd.Source + } else { + $candidates = @( + "${env:ProgramFiles(x86)}\Inno Setup 6\ISCC.exe", + "$env:ProgramFiles\Inno Setup 6\ISCC.exe" + ) + foreach ($candidate in $candidates) { + if (Test-Path $candidate) { + $InnoSetupPath = $candidate + break + } + } + } +} + +if (-not $InnoSetupPath -or -not (Test-Path $InnoSetupPath)) { + throw "Inno Setup compiler ISCC.exe was not found. Install Inno Setup 6 or pass -InnoSetupPath." +} + +New-Item -ItemType Directory -Force -Path $outputDir | Out-Null + +& $InnoSetupPath ` + "/DSourceRoot=$SourceRoot" ` + "/DOvmsSourceDir=$ovmsDir" ` + "/DManagerPublishDir=$managerPublishDir" ` + "/DOutputDir=$outputDir" ` + $installerScript + +if ($LASTEXITCODE -ne 0) { + throw "Inno Setup failed with exit code $LASTEXITCODE." +} + +Write-Host "[INFO] Installer created at $(Join-Path $outputDir 'OVMS-Setup.exe')" diff --git a/packaging/windows/manager/.gitignore b/packaging/windows/manager/.gitignore new file mode 100644 index 0000000000..b8c89995ae --- /dev/null +++ b/packaging/windows/manager/.gitignore @@ -0,0 +1,3 @@ +artifacts/ +src/**/bin/ +src/**/obj/ diff --git a/packaging/windows/manager/build_manager.ps1 b/packaging/windows/manager/build_manager.ps1 new file mode 100644 index 0000000000..2b145d5351 --- /dev/null +++ b/packaging/windows/manager/build_manager.ps1 @@ -0,0 +1,22 @@ +param( + [string]$Configuration = "Release" +) + +$ErrorActionPreference = "Stop" + +$project = Join-Path $PSScriptRoot "src\OVMS.Manager\OVMS.Manager.csproj" +$output = Join-Path $PSScriptRoot "artifacts\publish" + +dotnet publish $project ` + -c $Configuration ` + -r win-x64 ` + --self-contained true ` + -p:PublishSingleFile=true ` + -p:IncludeNativeLibrariesForSelfExtract=true ` + -p:EnableCompressionInSingleFile=true ` + -o $output +if ($LASTEXITCODE -ne 0) { + throw "dotnet publish failed." +} + +Write-Host "[INFO] Manager published to $output" diff --git a/packaging/windows/manager/src/OVMS.Manager/Assets/ovms-manager.ico b/packaging/windows/manager/src/OVMS.Manager/Assets/ovms-manager.ico new file mode 100644 index 0000000000000000000000000000000000000000..c31506f868644a68c74e6e33dc185f84dd2b5868 GIT binary patch literal 270398 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 + + WinExe + net8.0-windows + true + enable + enable + OVMS.Manager + OVMS.Manager + Assets\ovms-manager.ico + + diff --git a/packaging/windows/manager/src/OVMS.Manager/Program.cs b/packaging/windows/manager/src/OVMS.Manager/Program.cs new file mode 100644 index 0000000000..e650726200 --- /dev/null +++ b/packaging/windows/manager/src/OVMS.Manager/Program.cs @@ -0,0 +1,212 @@ +using System.Diagnostics; +using System.Drawing; +using System.Text.Json; +using System.Windows.Forms; + +namespace OVMS.Manager; + +internal static class Program +{ + [STAThread] + private static void Main() + { + ApplicationConfiguration.Initialize(); + using var app = new TrayApplicationContext(); + Application.Run(app); + } +} + +internal sealed class TrayApplicationContext : ApplicationContext +{ + private readonly NotifyIcon notifyIcon; + private readonly ToolStripMenuItem startItem; + private readonly ToolStripMenuItem stopItem; + private readonly OvmsController controller; + + public TrayApplicationContext() + { + controller = new OvmsController(); + + startItem = new ToolStripMenuItem("Start Server", null, (_, _) => RunAction("Start Server", controller.Start)); + stopItem = new ToolStripMenuItem("Stop Server", null, (_, _) => RunAction("Stop Server", controller.Stop)); + + var openItem = new ToolStripMenuItem("Open OVMS Manager", null, (_, _) => OpenManager()); + var menu = new ContextMenuStrip(); + menu.Items.Add(openItem); + menu.Items.Add(startItem); + menu.Items.Add(stopItem); + + notifyIcon = new NotifyIcon + { + Icon = Icon.ExtractAssociatedIcon(Application.ExecutablePath) ?? SystemIcons.Application, + Text = "OpenVINO Model Server", + ContextMenuStrip = menu, + Visible = true + }; + notifyIcon.MouseClick += (_, args) => + { + if (args.Button == MouseButtons.Left) + { + OpenManager(); + } + }; + } + + protected override void Dispose(bool disposing) + { + if (disposing) + { + notifyIcon.Visible = false; + notifyIcon.Dispose(); + controller.Dispose(); + } + base.Dispose(disposing); + } + + private void OpenManager() + { + var status = controller.GetStatus(); + MessageBox.Show(status, "OpenVINO Model Server", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + + private void RunAction(string title, Action action) + { + try + { + startItem.Enabled = false; + stopItem.Enabled = false; + action(); + notifyIcon.ShowBalloonTip(3000, "OpenVINO Model Server", $"{title} completed.", ToolTipIcon.Info); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, title, MessageBoxButtons.OK, MessageBoxIcon.Error); + } + finally + { + startItem.Enabled = true; + stopItem.Enabled = true; + } + } +} + +internal sealed class OvmsController : IDisposable +{ + private readonly string dataDir = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "OVMS"); + private readonly string appDir = AppContext.BaseDirectory; + + public string GetStatus() + { + var settings = LoadSettings(); + var runtimePath = Path.Combine(dataDir, "runtime.json"); + var status = "Stopped"; + + if (File.Exists(runtimePath)) + { + try + { + using var doc = JsonDocument.Parse(File.ReadAllText(runtimePath)); + if (doc.RootElement.TryGetProperty("pid", out var pidElement) && pidElement.TryGetInt32(out var pid)) + { + var process = Process.GetProcessById(pid); + if (string.Equals(process.ProcessName, "ovms", StringComparison.OrdinalIgnoreCase)) + { + status = $"Running, pid {pid}"; + } + } + } + catch + { + status = "Runtime state is stale or unreadable"; + } + } + + return string.Join(Environment.NewLine, new[] + { + $"Status: {status}", + $"REST: http://{settings.BindAddress}:{settings.RestPort}", + $"Install: {settings.InstallDir}", + $"Config: {settings.ConfigPath}", + $"Logs: {settings.LogPath}" + }); + } + + public void Start() + { + RunPowerShell("start-ovms.ps1"); + } + + public void Stop() + { + RunPowerShell("stop-ovms.ps1"); + } + + public void Dispose() + { + } + + private OvmsSettings LoadSettings() + { + var settingsPath = Path.Combine(dataDir, "settings.json"); + if (!File.Exists(settingsPath)) + { + return new OvmsSettings + { + InstallDir = appDir.TrimEnd(Path.DirectorySeparatorChar), + DataDir = dataDir, + ConfigPath = Path.Combine(dataDir, "models", "config.json"), + LogPath = Path.Combine(dataDir, "logs", "ovms_server.log"), + BindAddress = "127.0.0.1", + RestPort = 8000, + GrpcPort = 0 + }; + } + + var settings = JsonSerializer.Deserialize(File.ReadAllText(settingsPath), new JsonSerializerOptions + { + PropertyNameCaseInsensitive = true + }); + + return settings ?? throw new InvalidOperationException($"Could not parse settings: {settingsPath}"); + } + + private void RunPowerShell(string scriptName) + { + var scriptPath = Path.Combine(appDir, "scripts", scriptName); + if (!File.Exists(scriptPath)) + { + throw new FileNotFoundException("Missing control script.", scriptPath); + } + + var startInfo = new ProcessStartInfo + { + FileName = "powershell.exe", + Arguments = $"-NoProfile -ExecutionPolicy Bypass -File \"{scriptPath}\" -DataDir \"{dataDir}\"", + CreateNoWindow = true, + UseShellExecute = false, + RedirectStandardError = true, + RedirectStandardOutput = true + }; + + using var process = Process.Start(startInfo) ?? throw new InvalidOperationException("Failed to start PowerShell."); + var stdout = process.StandardOutput.ReadToEnd(); + var stderr = process.StandardError.ReadToEnd(); + process.WaitForExit(); + + if (process.ExitCode != 0) + { + throw new InvalidOperationException(string.IsNullOrWhiteSpace(stderr) ? stdout : stderr); + } + } +} + +internal sealed class OvmsSettings +{ + public string InstallDir { get; set; } = ""; + public string DataDir { get; set; } = ""; + public string ConfigPath { get; set; } = ""; + public string LogPath { get; set; } = ""; + public string BindAddress { get; set; } = "127.0.0.1"; + public int RestPort { get; set; } = 8000; + public int GrpcPort { get; set; } = 9000; +} diff --git a/packaging/windows/scripts/configure-ovms.ps1 b/packaging/windows/scripts/configure-ovms.ps1 new file mode 100644 index 0000000000..b12f7305d6 --- /dev/null +++ b/packaging/windows/scripts/configure-ovms.ps1 @@ -0,0 +1,75 @@ +param( + [Parameter(Mandatory = $true)][string]$InstallDir, + [Parameter(Mandatory = $true)][string]$DataDir, + [string]$PackageVariant = "python_on", + [int]$RestPort = 8000, + [int]$GrpcPort = 0, + [string]$BindAddress = "127.0.0.1", + [string]$LogLevel = "INFO" +) + +$ErrorActionPreference = "Stop" + +$modelsDir = Join-Path $DataDir "models" +$logsDir = Join-Path $DataDir "logs" +$configPath = Join-Path $modelsDir "config.json" +$settingsPath = Join-Path $DataDir "settings.json" +$installMarkerPath = Join-Path $DataDir "install.json" +$logPath = Join-Path $logsDir "ovms_server.log" +$utf8NoBom = New-Object System.Text.UTF8Encoding($false) + +New-Item -ItemType Directory -Force -Path $DataDir, $modelsDir, $logsDir, (Join-Path $DataDir "packages"), (Join-Path $DataDir "downloads"), (Join-Path $DataDir "diagnostics") | Out-Null + +if (-not (Test-Path $configPath)) { + [System.IO.File]::WriteAllText($configPath, '{"model_config_list":[]}', $utf8NoBom) +} + +$settings = [ordered]@{ + installDir = $InstallDir + dataDir = $DataDir + modelRepositoryPath = $modelsDir + configPath = $configPath + logPath = $logPath + restPort = $RestPort + grpcPort = $GrpcPort + bindAddress = $BindAddress + logLevel = $LogLevel + runMode = "user-login" + startAtLogin = $true + showTrayIcon = $true + serviceAutoStart = $false + packageVariant = $PackageVariant +} + +$tmpSettings = "$settingsPath.tmp" +[System.IO.File]::WriteAllText($tmpSettings, ($settings | ConvertTo-Json -Depth 10), $utf8NoBom) +Move-Item -Force -Path $tmpSettings -Destination $settingsPath + +$version = "unknown" +$ovmsExe = Join-Path $InstallDir "ovms.exe" +if (Test-Path $ovmsExe) { + try { + $versionOutput = & $ovmsExe --version 2>$null + if ($versionOutput) { + $version = ($versionOutput | Select-Object -First 1).ToString() + } + } catch { + $version = "unknown" + } +} + +$installMarker = [ordered]@{ + productName = "OpenVINO Model Server" + installDir = $InstallDir + dataDir = $DataDir + version = $version + packageVariant = $PackageVariant + installedAtUtc = (Get-Date).ToUniversalTime().ToString("o") + installerVersion = "1.0.0" +} + +$tmpInstall = "$installMarkerPath.tmp" +[System.IO.File]::WriteAllText($tmpInstall, ($installMarker | ConvertTo-Json -Depth 10), $utf8NoBom) +Move-Item -Force -Path $tmpInstall -Destination $installMarkerPath + +Write-Host "[INFO] OVMS configured at $DataDir" diff --git a/packaging/windows/scripts/install-service.ps1 b/packaging/windows/scripts/install-service.ps1 new file mode 100644 index 0000000000..74985ac9d4 --- /dev/null +++ b/packaging/windows/scripts/install-service.ps1 @@ -0,0 +1,46 @@ +param( + [Parameter(Mandatory = $true)][string]$InstallDir, + [Parameter(Mandatory = $true)][string]$DataDir +) + +$ErrorActionPreference = "Stop" + +$settingsPath = Join-Path $DataDir "settings.json" +if (-not (Test-Path $settingsPath)) { + throw "Settings file not found: $settingsPath" +} + +$settings = Get-Content $settingsPath -Raw | ConvertFrom-Json +$ovmsExe = Join-Path $InstallDir "ovms.exe" +if (-not (Test-Path $ovmsExe)) { + throw "ovms.exe not found: $ovmsExe" +} + +. (Join-Path $PSScriptRoot "ovms-env.ps1") -InstallDir $InstallDir -PersistMachine + +$binPath = "`"$ovmsExe`" --rest_port $($settings.restPort) --rest_bind_address `"$($settings.bindAddress)`" --config_path `"$($settings.configPath)`" --log_level $($settings.logLevel) --log_path `"$($settings.logPath)`"" +if ($settings.grpcPort -and [int]$settings.grpcPort -gt 0) { + $binPath += " --port $($settings.grpcPort)" +} + +$existing = Get-Service ovms -ErrorAction SilentlyContinue +if ($existing) { + & sc.exe config ovms binPath= $binPath DisplayName= "OpenVINO Model Server" | Out-Host +} else { + & sc.exe create ovms binPath= $binPath DisplayName= "OpenVINO Model Server" start= demand | Out-Host +} +if ($LASTEXITCODE -ne 0) { + throw "Failed to create or update ovms service." +} + +try { + & $ovmsExe install | Out-Host +} catch { + Write-Warning "ovms.exe install returned an error: $_" +} + +$settings.runMode = "service" +$utf8NoBom = New-Object System.Text.UTF8Encoding($false) +[System.IO.File]::WriteAllText($settingsPath, ($settings | ConvertTo-Json -Depth 10), $utf8NoBom) + +Write-Host "[INFO] OVMS service installed." diff --git a/packaging/windows/scripts/ovms-env.ps1 b/packaging/windows/scripts/ovms-env.ps1 new file mode 100644 index 0000000000..561f547cc6 --- /dev/null +++ b/packaging/windows/scripts/ovms-env.ps1 @@ -0,0 +1,33 @@ +param( + [Parameter(Mandatory = $true)][string]$InstallDir, + [switch]$PersistMachine +) + +$ErrorActionPreference = "Stop" + +$installDirFull = (Resolve-Path -LiteralPath $InstallDir).Path.TrimEnd("\") +$pythonHome = Join-Path $installDirFull "python" +$pythonScripts = Join-Path $pythonHome "Scripts" +$espeakData = Join-Path $installDirFull "espeak-ng-data" + +$env:OVMS_DIR = $installDirFull +if (Test-Path -LiteralPath $pythonHome) { + $env:PYTHONHOME = $pythonHome + $env:PATH = (($installDirFull, $pythonHome, $pythonScripts, $env:PATH) -join ";") +} else { + $env:PATH = (($installDirFull, $env:PATH) -join ";") +} + +if (Test-Path -LiteralPath $espeakData) { + $env:ESPEAK_DATA_PATH = $espeakData +} + +if ($PersistMachine) { + [Environment]::SetEnvironmentVariable("OVMS_DIR", $installDirFull, "Machine") + if (Test-Path -LiteralPath $pythonHome) { + [Environment]::SetEnvironmentVariable("PYTHONHOME", $pythonHome, "Machine") + } + if (Test-Path -LiteralPath $espeakData) { + [Environment]::SetEnvironmentVariable("ESPEAK_DATA_PATH", $espeakData, "Machine") + } +} diff --git a/packaging/windows/scripts/repair-package.ps1 b/packaging/windows/scripts/repair-package.ps1 new file mode 100644 index 0000000000..66a36f13ad --- /dev/null +++ b/packaging/windows/scripts/repair-package.ps1 @@ -0,0 +1,91 @@ +param( + [Parameter(Mandatory = $true)][string]$InstallDir, + [Parameter(Mandatory = $true)][string]$DataDir, + [string]$PackageSource = "" +) + +$ErrorActionPreference = "Stop" + +$packageCacheDir = Join-Path $DataDir "packages\source" + +$resolvedSource = "" +if ($PackageSource -and (Test-Path (Join-Path $PackageSource "ovms.exe"))) { + $resolvedSource = $PackageSource +} elseif (Test-Path (Join-Path $packageCacheDir "ovms.exe")) { + $resolvedSource = $packageCacheDir +} + +if (-not $resolvedSource) { + Write-Warning "No package source available to restore missing files from. Falling back to self-verify only." + Write-Warning "Repair cannot restore missing files without a valid package source (checked: '$PackageSource', '$packageCacheDir')." +} + +$required = @( + "ovms.exe", + "setupvars.bat", + "setupvars.ps1", + "install_ovms_service.bat" +) + +$repairedFiles = @() +foreach ($file in $required) { + $destPath = Join-Path $InstallDir $file + if (-not (Test-Path $destPath)) { + if ($resolvedSource) { + $srcPath = Join-Path $resolvedSource $file + if (Test-Path $srcPath) { + $destDir = Split-Path -Parent $destPath + if (-not (Test-Path $destDir)) { + New-Item -ItemType Directory -Force -Path $destDir | Out-Null + } + Copy-Item -Path $srcPath -Destination $destPath -Force + $repairedFiles += $file + Write-Host "[INFO] Restored missing file: $file" + } else { + Write-Warning "Missing file '$file' could not be restored: not found in package source." + } + } else { + Write-Warning "Missing file '$file' could not be restored: no package source available." + } + } +} + +$genAiInstalled = (Test-Path (Join-Path $InstallDir "openvino_genai.dll")) -and (Test-Path (Join-Path $InstallDir "openvino_tokenizers.dll")) +$pythonInstalled = Test-Path (Join-Path $InstallDir "python\python.exe") + +Write-Host "[INFO] GenAI support: $(if ($genAiInstalled) { 'Installed' } else { 'Missing' })" +Write-Host "[INFO] Python support: $(if ($pythonInstalled) { 'Installed' } else { 'Missing' })" + +$ovmsExe = Join-Path $InstallDir "ovms.exe" +if (-not (Test-Path $ovmsExe)) { + throw "ovms.exe is missing from $InstallDir and could not be restored. Repair cannot continue." +} + +. (Join-Path $PSScriptRoot "ovms-env.ps1") -InstallDir $InstallDir + +try { + $versionOutput = & $ovmsExe --version 2>$null + if ($LASTEXITCODE -ne 0) { + throw "ovms.exe --version exited with code $LASTEXITCODE." + } +} catch { + throw "ovms.exe --version failed during repair: $_" +} + +$settingsPath = Join-Path $DataDir "settings.json" +$configPath = Join-Path $DataDir "models\config.json" + +if ((-not (Test-Path $settingsPath)) -or (-not (Test-Path $configPath))) { + Write-Host "[INFO] Regenerating missing configuration via configure-ovms.ps1." + & (Join-Path $PSScriptRoot "configure-ovms.ps1") -InstallDir $InstallDir -DataDir $DataDir +} + +Write-Host "" +if ($repairedFiles.Count -gt 0) { + Write-Host "[INFO] Repair restored $($repairedFiles.Count) file(s): $($repairedFiles -join ', ')" +} else { + Write-Host "[INFO] No required files were missing; no file repair was needed." +} +Write-Host "[INFO] GenAI support: $(if ($genAiInstalled) { 'Installed' } else { 'Missing' })" +Write-Host "[INFO] Python support: $(if ($pythonInstalled) { 'Installed' } else { 'Missing' })" +Write-Host "[INFO] Repair complete." diff --git a/packaging/windows/scripts/set-path.ps1 b/packaging/windows/scripts/set-path.ps1 new file mode 100644 index 0000000000..eae7760340 --- /dev/null +++ b/packaging/windows/scripts/set-path.ps1 @@ -0,0 +1,44 @@ +param( + [Parameter(Mandatory = $true)][string]$InstallDir, + [ValidateSet("Add", "Remove")][string]$Action +) + +$ErrorActionPreference = "Stop" + +$installDirFull = (Resolve-Path -LiteralPath $InstallDir).Path.TrimEnd("\") +$pythonHome = Join-Path $installDirFull "python" +$pythonScripts = Join-Path $pythonHome "Scripts" +$required = @($installDirFull) +if (Test-Path -LiteralPath $pythonHome) { + $required += $pythonHome + $required += $pythonScripts +} + +$target = "User" +$current = [Environment]::GetEnvironmentVariable("Path", $target) +$parts = @() +if (-not [string]::IsNullOrWhiteSpace($current)) { + $parts = @($current -split ";" | Where-Object { -not [string]::IsNullOrWhiteSpace($_) }) +} + +if ($Action -eq "Add") { + foreach ($req in $required) { + $exists = $false + foreach ($part in $parts) { + if ($part.TrimEnd("\") -ieq $req.TrimEnd("\")) { + $exists = $true + break + } + } + if (-not $exists) { + $parts = @($req) + $parts + } + } +} else { + $parts = @($parts | Where-Object { + $candidate = $_.TrimEnd("\") + -not ($required | Where-Object { $_.TrimEnd("\") -ieq $candidate }) + }) +} + +[Environment]::SetEnvironmentVariable("Path", ($parts -join ";"), $target) diff --git a/packaging/windows/scripts/start-ovms.ps1 b/packaging/windows/scripts/start-ovms.ps1 new file mode 100644 index 0000000000..9a8df6770e --- /dev/null +++ b/packaging/windows/scripts/start-ovms.ps1 @@ -0,0 +1,86 @@ +param( + [string]$DataDir = "$env:LOCALAPPDATA\OVMS" +) + +$ErrorActionPreference = "Stop" + +$settingsPath = Join-Path $DataDir "settings.json" +if (-not (Test-Path $settingsPath)) { + throw "Settings file not found: $settingsPath" +} + +$settings = Get-Content $settingsPath -Raw | ConvertFrom-Json +$runtimePath = Join-Path $DataDir "runtime.json" +$utf8NoBom = New-Object System.Text.UTF8Encoding($false) + +$service = Get-Service ovms -ErrorAction SilentlyContinue +if ($service -and $settings.runMode -eq "service") { + if ($service.Status -ne "Running") { + Start-Service ovms + } + Write-Host "[INFO] OVMS service is running." + exit 0 +} + +$restPort = [int]$settings.restPort +$grpcPort = [int]$settings.grpcPort +$ports = @($restPort, $grpcPort) | Where-Object { $_ -gt 0 } | Select-Object -Unique +foreach ($port in $ports) { + $listeners = Get-NetTCPConnection -LocalPort $port -State Listen -ErrorAction SilentlyContinue + foreach ($listener in $listeners) { + if ($listener.OwningProcess -ne $PID) { + throw "Port $port is already in use by process id $($listener.OwningProcess)." + } + } +} + +if (Test-Path $runtimePath) { + try { + $runtime = Get-Content $runtimePath -Raw | ConvertFrom-Json + if ($runtime.pid) { + $existing = Get-Process -Id ([int]$runtime.pid) -ErrorAction SilentlyContinue + if ($existing -and $existing.ProcessName -ieq "ovms") { + Write-Host "[INFO] OVMS is already running with pid $($runtime.pid)." + exit 0 + } + } + } catch { + Write-Warning "Ignoring invalid runtime state: $runtimePath" + } +} + +$ovmsExe = Join-Path $settings.installDir "ovms.exe" +if (-not (Test-Path $ovmsExe)) { + throw "ovms.exe not found: $ovmsExe" +} + +. (Join-Path $PSScriptRoot "ovms-env.ps1") -InstallDir $settings.installDir + +$args = @( + "--rest_port", $settings.restPort, + "--rest_bind_address", $settings.bindAddress, + "--config_path", $settings.configPath, + "--log_level", $settings.logLevel, + "--log_path", $settings.logPath +) + +if ($settings.grpcPort -and [int]$settings.grpcPort -gt 0) { + $args += @("--port", $settings.grpcPort) +} + +$process = Start-Process -FilePath $ovmsExe -ArgumentList $args -WindowStyle Hidden -PassThru + +$runtimeState = [ordered]@{ + owner = "manager-process" + pid = $process.Id + serviceName = "ovms" + restPort = [int]$settings.restPort + grpcPort = [int]$settings.grpcPort + startedAtUtc = (Get-Date).ToUniversalTime().ToString("o") +} + +$tmpRuntime = "$runtimePath.tmp" +[System.IO.File]::WriteAllText($tmpRuntime, ($runtimeState | ConvertTo-Json -Depth 10), $utf8NoBom) +Move-Item -Force -Path $tmpRuntime -Destination $runtimePath + +Write-Host "[INFO] Started OVMS with pid $($process.Id)." diff --git a/packaging/windows/scripts/stop-ovms.ps1 b/packaging/windows/scripts/stop-ovms.ps1 new file mode 100644 index 0000000000..061fa9940b --- /dev/null +++ b/packaging/windows/scripts/stop-ovms.ps1 @@ -0,0 +1,38 @@ +param( + [string]$DataDir = "$env:LOCALAPPDATA\OVMS" +) + +$ErrorActionPreference = "Stop" + +$settingsPath = Join-Path $DataDir "settings.json" +$runtimePath = Join-Path $DataDir "runtime.json" + +if (Test-Path $settingsPath) { + $settings = Get-Content $settingsPath -Raw | ConvertFrom-Json + if ($settings.runMode -eq "service") { + $service = Get-Service ovms -ErrorAction SilentlyContinue + if ($service -and $service.Status -ne "Stopped") { + Stop-Service ovms -ErrorAction Stop + Write-Host "[INFO] Stopped OVMS service." + exit 0 + } + } +} + +if (Test-Path $runtimePath) { + try { + $runtime = Get-Content $runtimePath -Raw | ConvertFrom-Json + if ($runtime.pid) { + $process = Get-Process -Id ([int]$runtime.pid) -ErrorAction SilentlyContinue + if ($process -and $process.ProcessName -ieq "ovms") { + Stop-Process -Id $process.Id -Force + Write-Host "[INFO] Stopped OVMS process $($process.Id)." + } + } + } finally { + Remove-Item -Force -Path $runtimePath -ErrorAction SilentlyContinue + } +} else { + Write-Host "[INFO] No OVMS runtime state found." +} + diff --git a/packaging/windows/scripts/uninstall-ovms.ps1 b/packaging/windows/scripts/uninstall-ovms.ps1 new file mode 100644 index 0000000000..b051b0c2d4 --- /dev/null +++ b/packaging/windows/scripts/uninstall-ovms.ps1 @@ -0,0 +1,71 @@ +param( + [Parameter(Mandatory = $true)][string]$InstallDir, + [Parameter(Mandatory = $true)][string]$DataDir, + [ValidateSet("PreserveAll", "RemoveSettingsKeepModels", "RemoveAll")][string]$DataMode = "PreserveAll" +) + +$ErrorActionPreference = "Stop" + +Get-Process -Name "OVMS.Manager" -ErrorAction SilentlyContinue | Stop-Process -Force -ErrorAction SilentlyContinue + +$runtimePath = Join-Path $DataDir "runtime.json" +if (Test-Path $runtimePath) { + try { + $runtime = Get-Content $runtimePath -Raw | ConvertFrom-Json + if ($runtime.pid) { + $process = Get-Process -Id ([int]$runtime.pid) -ErrorAction SilentlyContinue + if ($process -and $process.ProcessName -ieq "ovms") { + Stop-Process -Id $process.Id -Force -ErrorAction SilentlyContinue + } + } + } catch { + Write-Warning "Could not read runtime state: $_" + } + Remove-Item -Force -Path $runtimePath -ErrorAction SilentlyContinue +} + +& (Join-Path $PSScriptRoot "uninstall-service.ps1") +& (Join-Path $PSScriptRoot "set-path.ps1") -InstallDir $InstallDir -Action Remove +[Environment]::SetEnvironmentVariable("OVMS_DIR", $null, "User") +[Environment]::SetEnvironmentVariable("PYTHONHOME", $null, "User") +[Environment]::SetEnvironmentVariable("ESPEAK_DATA_PATH", $null, "User") + +Remove-Item -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Run" -Name "OVMS Manager" -ErrorAction SilentlyContinue + +switch ($DataMode) { + "PreserveAll" { + # Keep everything under $DataDir. + } + "RemoveSettingsKeepModels" { + Remove-Item -Force -Path (Join-Path $DataDir "settings.json") -ErrorAction SilentlyContinue + Remove-Item -Force -Path (Join-Path $DataDir "install.json") -ErrorAction SilentlyContinue + Remove-Item -Force -Path (Join-Path $DataDir "runtime.json") -ErrorAction SilentlyContinue + + $logsDir = Join-Path $DataDir "logs" + if (Test-Path $logsDir) { + Remove-Item -LiteralPath $logsDir -Recurse -Force -ErrorAction SilentlyContinue + } + + $packagesDir = Join-Path $DataDir "packages" + if (Test-Path $packagesDir) { + Remove-Item -LiteralPath $packagesDir -Recurse -Force -ErrorAction SilentlyContinue + } + + $downloadsDir = Join-Path $DataDir "downloads" + if (Test-Path $downloadsDir) { + Remove-Item -LiteralPath $downloadsDir -Recurse -Force -ErrorAction SilentlyContinue + } + + $diagnosticsDir = Join-Path $DataDir "diagnostics" + if (Test-Path $diagnosticsDir) { + Remove-Item -LiteralPath $diagnosticsDir -Recurse -Force -ErrorAction SilentlyContinue + } + } + "RemoveAll" { + if (Test-Path $DataDir) { + Remove-Item -LiteralPath $DataDir -Recurse -Force + } + } +} + +Write-Host "[INFO] OVMS uninstall cleanup complete." diff --git a/packaging/windows/scripts/uninstall-service.ps1 b/packaging/windows/scripts/uninstall-service.ps1 new file mode 100644 index 0000000000..ed6f0b8c61 --- /dev/null +++ b/packaging/windows/scripts/uninstall-service.ps1 @@ -0,0 +1,13 @@ +$ErrorActionPreference = "Stop" + +$service = Get-Service ovms -ErrorAction SilentlyContinue +if ($service) { + if ($service.Status -ne "Stopped") { + Stop-Service ovms -ErrorAction SilentlyContinue + } + & sc.exe delete ovms | Out-Host + if ($LASTEXITCODE -ne 0) { + throw "Failed to delete ovms service." + } +} + diff --git a/packaging/windows/scripts/validate-install.ps1 b/packaging/windows/scripts/validate-install.ps1 new file mode 100644 index 0000000000..2e472905b9 --- /dev/null +++ b/packaging/windows/scripts/validate-install.ps1 @@ -0,0 +1,36 @@ +param( + [string]$InstallDir +) + +$ErrorActionPreference = "Stop" + +if (-not $InstallDir) { + $sourceRoot = (Resolve-Path (Join-Path $PSScriptRoot "..\..\..")).Path + $InstallDir = Join-Path $sourceRoot "dist\windows\ovms" +} + +$required = @( + "ovms.exe", + "setupvars.bat", + "setupvars.ps1", + "install_ovms_service.bat" +) + +$missing = @() +foreach ($file in $required) { + $path = Join-Path $InstallDir $file + if (-not (Test-Path $path)) { + $missing += $file + } +} + +if ($missing.Count -gt 0) { + throw "Missing required files in ${InstallDir}: $($missing -join ', ')" +} + +& (Join-Path $InstallDir "ovms.exe") --version +if ($LASTEXITCODE -ne 0) { + throw "ovms.exe --version failed." +} + +Write-Host "[INFO] Install folder validation passed: $InstallDir" diff --git a/packaging/windows/settings/settings.template.json b/packaging/windows/settings/settings.template.json new file mode 100644 index 0000000000..3f5734aa38 --- /dev/null +++ b/packaging/windows/settings/settings.template.json @@ -0,0 +1,16 @@ +{ + "installDir": "", + "dataDir": "", + "modelRepositoryPath": "", + "configPath": "", + "logPath": "", + "restPort": 8000, + "grpcPort": 0, + "bindAddress": "127.0.0.1", + "logLevel": "INFO", + "runMode": "user-login", + "startAtLogin": true, + "showTrayIcon": true, + "serviceAutoStart": false, + "packageVariant": "python_on" +} From e529f2648afead1e5727ba3d4aaa3a9e118f6370 Mon Sep 17 00:00:00 2001 From: exzile Date: Tue, 30 Jun 2026 17:12:21 -0400 Subject: [PATCH 2/9] Add OVMS Manager GUI (dashboard, settings, logs, diagnostics) Replace the tray-only stub with a real WinForms Manager window while keeping the tray. Split into Program / TrayApplicationContext / MainForm / OvmsController / OvmsSettings. - Dashboard: live status (pid), runtime mode, REST/gRPC, bind, variant, health check (GET /v3/models) and served-model count; Start/Stop/ Restart/Refresh/Open-logs/Open-models. - Settings: edit ports, bind, log level/path, model repo, startup mode, show-tray, start-at-login (HKCU Run with --tray); atomic save with .bak and restart prompt for command-line-affecting changes. - Logs: tail last 500 lines of the server log. - Advanced: effective command line, repair package, validate env, export diagnostics bundle (zip). - All process/HTTP work runs off the UI thread; single-instance mutex; close-to-tray; GrpcPort default fixed to 0 to match the template. Co-Authored-By: Claude Opus 4.8 Signed-off-by: exzile --- .../manager/src/OVMS.Manager/MainForm.cs | 576 ++++++++++++++++++ .../src/OVMS.Manager/OvmsController.cs | 403 ++++++++++++ .../manager/src/OVMS.Manager/OvmsSettings.cs | 25 + .../manager/src/OVMS.Manager/Program.cs | 213 +------ .../OVMS.Manager/TrayApplicationContext.cs | 128 ++++ 5 files changed, 1146 insertions(+), 199 deletions(-) create mode 100644 packaging/windows/manager/src/OVMS.Manager/MainForm.cs create mode 100644 packaging/windows/manager/src/OVMS.Manager/OvmsController.cs create mode 100644 packaging/windows/manager/src/OVMS.Manager/OvmsSettings.cs create mode 100644 packaging/windows/manager/src/OVMS.Manager/TrayApplicationContext.cs diff --git a/packaging/windows/manager/src/OVMS.Manager/MainForm.cs b/packaging/windows/manager/src/OVMS.Manager/MainForm.cs new file mode 100644 index 0000000000..9ae56d7903 --- /dev/null +++ b/packaging/windows/manager/src/OVMS.Manager/MainForm.cs @@ -0,0 +1,576 @@ +using System.Diagnostics; +using System.Drawing; +using Microsoft.Win32; + +namespace OVMS.Manager; + +///

+/// Main GUI window: Dashboard / Settings / Logs / Advanced tabs. +/// All process/HTTP work is dispatched off the UI thread via Task.Run and +/// marshalled back through the WinForms SynchronizationContext (async/await). +/// +internal sealed class MainForm : Form +{ + private const string RunKeyPath = @"Software\Microsoft\Windows\CurrentVersion\Run"; + private const string RunValueName = "OVMS Manager"; + + private readonly OvmsController controller; + + /// + /// When true, FormClosing will let the close proceed instead of hiding + /// to tray. Set by the tray context's Exit handler. + /// + public bool AllowExit { get; set; } + + // Dashboard controls + private Label statusValueLabel = null!; + private Label runModeValueLabel = null!; + private Label restUrlValueLabel = null!; + private Label grpcValueLabel = null!; + private Label bindValueLabel = null!; + private Label variantValueLabel = null!; + private Label healthValueLabel = null!; + private Label modelsValueLabel = null!; + private Button startButton = null!; + private Button stopButton = null!; + private Button restartButton = null!; + private Button refreshButton = null!; + + // Settings controls + private NumericUpDown restPortInput = null!; + private NumericUpDown grpcPortInput = null!; + private TextBox bindAddressInput = null!; + private ComboBox logLevelInput = null!; + private TextBox logPathInput = null!; + private TextBox modelRepoInput = null!; + private ComboBox runModeInput = null!; + private CheckBox showTrayCheckBox = null!; + private CheckBox startAtLoginCheckBox = null!; + + // Logs controls + private TextBox logTextBox = null!; + + // Advanced controls + private TextBox advancedTextBox = null!; + + public MainForm(OvmsController controller) + { + this.controller = controller; + + Text = "OpenVINO Model Server Manager"; + MinimumSize = new Size(720, 520); + StartPosition = FormStartPosition.CenterScreen; + try + { + Icon = Icon.ExtractAssociatedIcon(Application.ExecutablePath); + } + catch + { + Icon = SystemIcons.Application; + } + + var tabs = new TabControl { Dock = DockStyle.Fill }; + tabs.TabPages.Add(BuildDashboardTab()); + tabs.TabPages.Add(BuildSettingsTab()); + tabs.TabPages.Add(BuildLogsTab()); + tabs.TabPages.Add(BuildAdvancedTab()); + Controls.Add(tabs); + + FormClosing += OnFormClosing; + Shown += async (_, _) => await RefreshDashboardAsync(); + } + + private void OnFormClosing(object? sender, FormClosingEventArgs e) + { + if (e.CloseReason == CloseReason.UserClosing && !AllowExit) + { + var settings = TryLoadSettings(); + if (settings is { ShowTrayIcon: true }) + { + e.Cancel = true; + Hide(); + } + } + } + + private OvmsSettings? TryLoadSettings() + { + try + { + return controller.LoadSettings(); + } + catch + { + return null; + } + } + + // --------------------------------------------------------------- + // Dashboard + // --------------------------------------------------------------- + + private TabPage BuildDashboardTab() + { + var page = new TabPage("Dashboard"); + var layout = new TableLayoutPanel + { + Dock = DockStyle.Fill, + ColumnCount = 2, + Padding = new Padding(12), + AutoSize = true + }; + layout.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize)); + layout.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100)); + + (Label caption, Label value) AddRow(string caption) + { + var captionLabel = new Label { Text = caption, AutoSize = true, Margin = new Padding(3, 8, 12, 3), Font = new Font(Font, FontStyle.Bold) }; + var valueLabel = new Label { Text = "-", AutoSize = true, Margin = new Padding(3, 8, 3, 3) }; + layout.Controls.Add(captionLabel); + layout.Controls.Add(valueLabel); + return (captionLabel, valueLabel); + } + + (_, statusValueLabel) = AddRow("Status:"); + (_, runModeValueLabel) = AddRow("Runtime mode:"); + (_, restUrlValueLabel) = AddRow("REST URL:"); + (_, grpcValueLabel) = AddRow("gRPC port:"); + (_, bindValueLabel) = AddRow("Bind address:"); + (_, variantValueLabel) = AddRow("Package variant:"); + (_, healthValueLabel) = AddRow("Health:"); + (_, modelsValueLabel) = AddRow("Served models:"); + + var buttonPanel = new FlowLayoutPanel { Dock = DockStyle.Bottom, Height = 48, Padding = new Padding(8) }; + startButton = new Button { Text = "Start", AutoSize = true }; + stopButton = new Button { Text = "Stop", AutoSize = true }; + restartButton = new Button { Text = "Restart", AutoSize = true }; + refreshButton = new Button { Text = "Refresh", AutoSize = true }; + var openLogsButton = new Button { Text = "Open Logs", AutoSize = true }; + var openModelFolderButton = new Button { Text = "Open Model Folder", AutoSize = true }; + + startButton.Click += async (_, _) => await RunControlActionAsync("Start", controller.Start); + stopButton.Click += async (_, _) => await RunControlActionAsync("Stop", controller.Stop); + restartButton.Click += async (_, _) => await RunControlActionAsync("Restart", controller.Restart); + refreshButton.Click += async (_, _) => await RefreshDashboardAsync(); + openLogsButton.Click += (_, _) => OpenFolderFor(TryLoadSettings()?.LogPath); + openModelFolderButton.Click += (_, _) => OpenFolder(TryLoadSettings()?.ModelRepositoryPath); + + buttonPanel.Controls.Add(startButton); + buttonPanel.Controls.Add(stopButton); + buttonPanel.Controls.Add(restartButton); + buttonPanel.Controls.Add(refreshButton); + buttonPanel.Controls.Add(openLogsButton); + buttonPanel.Controls.Add(openModelFolderButton); + + page.Controls.Add(layout); + page.Controls.Add(buttonPanel); + return page; + } + + private async Task RunControlActionAsync(string title, Action action) + { + SetControlButtonsEnabled(false); + try + { + await Task.Run(action); + } + catch (Exception ex) + { + MessageBox.Show(this, ex.Message, title, MessageBoxButtons.OK, MessageBoxIcon.Error); + } + finally + { + SetControlButtonsEnabled(true); + await RefreshDashboardAsync(); + } + } + + private void SetControlButtonsEnabled(bool enabled) + { + startButton.Enabled = enabled; + stopButton.Enabled = enabled; + restartButton.Enabled = enabled; + refreshButton.Enabled = enabled; + } + + public async Task RefreshDashboardAsync() + { + var settings = TryLoadSettings(); + if (settings is null) + { + statusValueLabel.Text = "Settings unavailable"; + return; + } + + var runtimeStatus = await Task.Run(controller.GetRuntimeStatus); + statusValueLabel.Text = runtimeStatus.Running ? $"Running (pid {runtimeStatus.Pid})" : "Stopped"; + runModeValueLabel.Text = settings.RunMode; + restUrlValueLabel.Text = $"http://{settings.BindAddress}:{settings.RestPort}"; + grpcValueLabel.Text = settings.GrpcPort > 0 ? settings.GrpcPort.ToString() : "disabled"; + bindValueLabel.Text = settings.BindAddress; + variantValueLabel.Text = settings.PackageVariant; + + healthValueLabel.Text = "Checking..."; + modelsValueLabel.Text = "-"; + + var health = await controller.CheckHealthAsync(); + healthValueLabel.Text = health.Ok ? "Healthy" : $"Unreachable ({health.Message})"; + modelsValueLabel.Text = health.Ok ? health.ModelCount.ToString() : "-"; + } + + private static void OpenFolderFor(string? filePath) + { + if (string.IsNullOrEmpty(filePath)) + { + return; + } + OpenFolder(Path.GetDirectoryName(filePath)); + } + + private static void OpenFolder(string? folderPath) + { + if (string.IsNullOrEmpty(folderPath)) + { + return; + } + try + { + Directory.CreateDirectory(folderPath); + Process.Start(new ProcessStartInfo { FileName = folderPath, UseShellExecute = true }); + } + catch + { + // Best effort; non-fatal if the folder cannot be opened. + } + } + + // --------------------------------------------------------------- + // Settings + // --------------------------------------------------------------- + + private TabPage BuildSettingsTab() + { + var page = new TabPage("Settings"); + var layout = new TableLayoutPanel + { + Dock = DockStyle.Top, + ColumnCount = 2, + AutoSize = true, + Padding = new Padding(12) + }; + layout.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize)); + layout.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100)); + + void AddLabel(string text) + { + layout.Controls.Add(new Label { Text = text, AutoSize = true, Margin = new Padding(3, 8, 12, 3) }); + } + + AddLabel("REST port:"); + restPortInput = new NumericUpDown { Minimum = 1, Maximum = 65535, Width = 120 }; + layout.Controls.Add(restPortInput); + + AddLabel("gRPC port (0 = disabled):"); + grpcPortInput = new NumericUpDown { Minimum = 0, Maximum = 65535, Width = 120 }; + layout.Controls.Add(grpcPortInput); + + AddLabel("Bind address:"); + bindAddressInput = new TextBox { Width = 220 }; + layout.Controls.Add(bindAddressInput); + + AddLabel("Log level:"); + logLevelInput = new ComboBox { DropDownStyle = ComboBoxStyle.DropDownList, Width = 120 }; + logLevelInput.Items.AddRange(new object[] { "ERROR", "WARNING", "INFO", "DEBUG", "TRACE" }); + layout.Controls.Add(logLevelInput); + + AddLabel("Log path:"); + logPathInput = new TextBox { Width = 400 }; + layout.Controls.Add(logPathInput); + + AddLabel("Model repository path:"); + modelRepoInput = new TextBox { Width = 400 }; + layout.Controls.Add(modelRepoInput); + + AddLabel("Startup mode:"); + runModeInput = new ComboBox { DropDownStyle = ComboBoxStyle.DropDownList, Width = 160 }; + runModeInput.Items.AddRange(new object[] { "user-login", "service", "manual" }); + layout.Controls.Add(runModeInput); + + AddLabel("Show tray icon:"); + showTrayCheckBox = new CheckBox(); + layout.Controls.Add(showTrayCheckBox); + + AddLabel("Start at login:"); + startAtLoginCheckBox = new CheckBox(); + layout.Controls.Add(startAtLoginCheckBox); + + var saveButton = new Button { Text = "Save", AutoSize = true, Margin = new Padding(3, 16, 3, 3) }; + saveButton.Click += async (_, _) => await SaveSettingsAsync(); + layout.Controls.Add(new Label()); + layout.Controls.Add(saveButton); + + page.Controls.Add(layout); + page.Enter += (_, _) => LoadSettingsIntoForm(); + return page; + } + + private void LoadSettingsIntoForm() + { + var settings = TryLoadSettings(); + if (settings is null) + { + return; + } + + restPortInput.Value = Math.Clamp(settings.RestPort, (int)restPortInput.Minimum, (int)restPortInput.Maximum); + grpcPortInput.Value = Math.Clamp(settings.GrpcPort, (int)grpcPortInput.Minimum, (int)grpcPortInput.Maximum); + bindAddressInput.Text = settings.BindAddress; + logLevelInput.SelectedItem = settings.LogLevel; + logPathInput.Text = settings.LogPath; + modelRepoInput.Text = settings.ModelRepositoryPath; + runModeInput.SelectedItem = settings.RunMode; + showTrayCheckBox.Checked = settings.ShowTrayIcon; + startAtLoginCheckBox.Checked = settings.StartAtLogin; + } + + private async Task SaveSettingsAsync() + { + var current = TryLoadSettings(); + if (current is null) + { + MessageBox.Show(this, "Could not load existing settings.", "Save", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + + if (string.IsNullOrWhiteSpace(bindAddressInput.Text)) + { + MessageBox.Show(this, "Bind address cannot be empty.", "Save", MessageBoxButtons.OK, MessageBoxIcon.Warning); + return; + } + + var updated = new OvmsSettings + { + InstallDir = current.InstallDir, + DataDir = current.DataDir, + ModelRepositoryPath = modelRepoInput.Text, + ConfigPath = current.ConfigPath, + LogPath = logPathInput.Text, + RestPort = (int)restPortInput.Value, + GrpcPort = (int)grpcPortInput.Value, + BindAddress = bindAddressInput.Text, + LogLevel = logLevelInput.SelectedItem as string ?? current.LogLevel, + RunMode = runModeInput.SelectedItem as string ?? current.RunMode, + StartAtLogin = startAtLoginCheckBox.Checked, + ShowTrayIcon = showTrayCheckBox.Checked, + ServiceAutoStart = current.ServiceAutoStart, + PackageVariant = current.PackageVariant + }; + + var commandLineAffectingChanged = + current.RestPort != updated.RestPort || + current.GrpcPort != updated.GrpcPort || + current.BindAddress != updated.BindAddress || + current.LogPath != updated.LogPath || + current.ConfigPath != updated.ConfigPath || + current.LogLevel != updated.LogLevel; + + try + { + await Task.Run(() => controller.SaveSettings(updated)); + ApplyStartAtLoginRegistration(updated.StartAtLogin); + } + catch (Exception ex) + { + MessageBox.Show(this, ex.Message, "Save", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + + if (commandLineAffectingChanged) + { + var runtimeStatus = await Task.Run(controller.GetRuntimeStatus); + if (runtimeStatus.Running) + { + var result = MessageBox.Show(this, "Settings that affect the server command line changed. Restart server to apply?", + "Restart required", MessageBoxButtons.YesNo, MessageBoxIcon.Question); + if (result == DialogResult.Yes) + { + await RunControlActionAsync("Restart", controller.Restart); + } + } + } + + await RefreshDashboardAsync(); + MessageBox.Show(this, "Settings saved.", "Save", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + + private static void ApplyStartAtLoginRegistration(bool enabled) + { + try + { + using var key = Registry.CurrentUser.OpenSubKey(RunKeyPath, writable: true) + ?? Registry.CurrentUser.CreateSubKey(RunKeyPath, writable: true); + + if (key is null) + { + return; + } + + if (enabled) + { + var exePath = Application.ExecutablePath; + key.SetValue(RunValueName, $"\"{exePath}\" --tray"); + } + else + { + if (key.GetValue(RunValueName) is not null) + { + key.DeleteValue(RunValueName, throwOnMissingValue: false); + } + } + } + catch + { + // Non-fatal: registry write may fail under restricted environments. + } + } + + // --------------------------------------------------------------- + // Logs + // --------------------------------------------------------------- + + private TabPage BuildLogsTab() + { + var page = new TabPage("Logs"); + + logTextBox = new TextBox + { + Dock = DockStyle.Fill, + Multiline = true, + ReadOnly = true, + ScrollBars = ScrollBars.Both, + WordWrap = false, + Font = new Font(FontFamily.GenericMonospace, 9f) + }; + + var buttonPanel = new FlowLayoutPanel { Dock = DockStyle.Bottom, Height = 40, Padding = new Padding(8) }; + var refreshLogsButton = new Button { Text = "Refresh", AutoSize = true }; + var openFolderButton = new Button { Text = "Open Folder", AutoSize = true }; + + refreshLogsButton.Click += async (_, _) => await RefreshLogsAsync(); + openFolderButton.Click += (_, _) => OpenFolderFor(TryLoadSettings()?.LogPath); + + buttonPanel.Controls.Add(refreshLogsButton); + buttonPanel.Controls.Add(openFolderButton); + + page.Controls.Add(logTextBox); + page.Controls.Add(buttonPanel); + page.Enter += async (_, _) => await RefreshLogsAsync(); + return page; + } + + private async Task RefreshLogsAsync() + { + var lines = await Task.Run(() => controller.TailLog(500)); + logTextBox.Text = string.Join(Environment.NewLine, lines); + logTextBox.SelectionStart = logTextBox.Text.Length; + logTextBox.ScrollToCaret(); + } + + // --------------------------------------------------------------- + // Advanced + // --------------------------------------------------------------- + + private TabPage BuildAdvancedTab() + { + var page = new TabPage("Advanced"); + + advancedTextBox = new TextBox + { + Dock = DockStyle.Fill, + Multiline = true, + ReadOnly = true, + ScrollBars = ScrollBars.Both, + WordWrap = false, + Font = new Font(FontFamily.GenericMonospace, 9f) + }; + + var buttonPanel = new FlowLayoutPanel { Dock = DockStyle.Bottom, Height = 40, Padding = new Padding(8) }; + var repairButton = new Button { Text = "Repair Package", AutoSize = true }; + var exportButton = new Button { Text = "Export Diagnostics", AutoSize = true }; + var validateButton = new Button { Text = "Validate Environment", AutoSize = true }; + + repairButton.Click += async (_, _) => await RunAdvancedActionAsync("Repair", () => controller.Repair()); + validateButton.Click += async (_, _) => await RunAdvancedActionAsync("Validate Environment", () => controller.ValidateEnvironment()); + exportButton.Click += async (_, _) => await ExportDiagnosticsAsync(); + + buttonPanel.Controls.Add(repairButton); + buttonPanel.Controls.Add(exportButton); + buttonPanel.Controls.Add(validateButton); + + page.Controls.Add(advancedTextBox); + page.Controls.Add(buttonPanel); + page.Enter += (_, _) => RefreshAdvancedInfo(); + return page; + } + + private void RefreshAdvancedInfo() + { + var settings = TryLoadSettings(); + if (settings is null) + { + advancedTextBox.Text = "Settings unavailable."; + return; + } + + string commandLine; + try + { + commandLine = controller.EffectiveCommandLine(); + } + catch (Exception ex) + { + commandLine = $"(error building command line: {ex.Message})"; + } + + advancedTextBox.Text = string.Join(Environment.NewLine, new[] + { + $"Install dir: {settings.InstallDir}", + $"Data dir: {controller.DataDir}", + "", + "Effective command line:", + commandLine + }); + } + + private async Task RunAdvancedActionAsync(string title, Func action) + { + try + { + var output = await Task.Run(action); + MessageBox.Show(this, string.IsNullOrWhiteSpace(output) ? "Completed." : output, title, MessageBoxButtons.OK, MessageBoxIcon.Information); + } + catch (Exception ex) + { + MessageBox.Show(this, ex.Message, title, MessageBoxButtons.OK, MessageBoxIcon.Error); + } + finally + { + RefreshAdvancedInfo(); + } + } + + private async Task ExportDiagnosticsAsync() + { + var stamp = DateTime.Now.ToString("yyyyMMdd-HHmmss"); + try + { + var zipPath = await Task.Run(() => controller.ExportDiagnostics(stamp)); + MessageBox.Show(this, $"Diagnostics exported to:{Environment.NewLine}{zipPath}", "Export Diagnostics", MessageBoxButtons.OK, MessageBoxIcon.Information); + OpenFolderFor(zipPath); + } + catch (Exception ex) + { + MessageBox.Show(this, ex.Message, "Export Diagnostics", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } +} diff --git a/packaging/windows/manager/src/OVMS.Manager/OvmsController.cs b/packaging/windows/manager/src/OVMS.Manager/OvmsController.cs new file mode 100644 index 0000000000..7a2b0df68b --- /dev/null +++ b/packaging/windows/manager/src/OVMS.Manager/OvmsController.cs @@ -0,0 +1,403 @@ +using System.Diagnostics; +using System.IO.Compression; +using System.Net.Http; +using System.Net.Sockets; +using System.Text.Json; + +namespace OVMS.Manager; + +/// +/// Runtime status snapshot read from runtime.json. +/// +internal readonly struct RuntimeStatus +{ + public bool Running { get; init; } + public int Pid { get; init; } + public string Owner { get; init; } +} + +/// +/// Result of a health check against the REST /v3/models endpoint. +/// +internal readonly struct HealthResult +{ + public bool Ok { get; init; } + public int ModelCount { get; init; } + public string Message { get; init; } +} + +/// +/// Pure logic layer for the Manager: settings persistence, process control, +/// health checks and diagnostics. Contains no UI code so it can be safely +/// invoked from background threads. +/// +internal sealed class OvmsController : IDisposable +{ + private static readonly JsonSerializerOptions ReadOptions = new() { PropertyNameCaseInsensitive = true }; + private static readonly JsonSerializerOptions WriteOptions = new() { WriteIndented = true }; + + private readonly HttpClient httpClient = new() { Timeout = TimeSpan.FromSeconds(3) }; + + public string DataDir { get; } = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "OVMS"); + + public string AppDir { get; } = AppContext.BaseDirectory; + + public string SettingsPath => Path.Combine(DataDir, "settings.json"); + + public string RuntimePath => Path.Combine(DataDir, "runtime.json"); + + public OvmsSettings LoadSettings() + { + if (!File.Exists(SettingsPath)) + { + var defaults = new OvmsSettings + { + InstallDir = AppDir.TrimEnd(Path.DirectorySeparatorChar), + DataDir = DataDir, + ModelRepositoryPath = Path.Combine(DataDir, "models"), + ConfigPath = Path.Combine(DataDir, "models", "config.json"), + LogPath = Path.Combine(DataDir, "logs", "ovms_server.log"), + BindAddress = "127.0.0.1", + RestPort = 8000, + GrpcPort = 0, + LogLevel = "INFO", + RunMode = "user-login", + StartAtLogin = true, + ShowTrayIcon = true, + ServiceAutoStart = false, + PackageVariant = "python_on" + }; + return defaults; + } + + var json = File.ReadAllText(SettingsPath); + var settings = JsonSerializer.Deserialize(json, ReadOptions); + return settings ?? throw new InvalidOperationException($"Could not parse settings: {SettingsPath}"); + } + + /// + /// Atomically persists settings: writes to a temp file, validates it + /// round-trips, backs up the previous file, then replaces it. + /// + public void SaveSettings(OvmsSettings settings) + { + Directory.CreateDirectory(DataDir); + + var json = JsonSerializer.Serialize(settings, WriteOptions); + + // Validate the JSON round-trips before touching anything on disk. + var roundTrip = JsonSerializer.Deserialize(json, ReadOptions) + ?? throw new InvalidOperationException("Settings failed to round-trip; refusing to save."); + _ = roundTrip; + + var tmpPath = SettingsPath + ".tmp"; + var bakPath = SettingsPath + ".bak"; + + File.WriteAllText(tmpPath, json); + + if (File.Exists(SettingsPath)) + { + File.Replace(tmpPath, SettingsPath, bakPath); + } + else + { + File.Move(tmpPath, SettingsPath); + } + } + + public RuntimeStatus GetRuntimeStatus() + { + if (!File.Exists(RuntimePath)) + { + return new RuntimeStatus { Running = false, Pid = 0, Owner = "" }; + } + + try + { + using var doc = JsonDocument.Parse(File.ReadAllText(RuntimePath)); + var root = doc.RootElement; + var owner = root.TryGetProperty("owner", out var ownerEl) ? ownerEl.GetString() ?? "" : ""; + + if (root.TryGetProperty("pid", out var pidEl) && pidEl.TryGetInt32(out var pid)) + { + var process = Process.GetProcessById(pid); + if (string.Equals(process.ProcessName, "ovms", StringComparison.OrdinalIgnoreCase)) + { + return new RuntimeStatus { Running = true, Pid = pid, Owner = owner }; + } + } + } + catch + { + // Stale or unreadable runtime file: treat as not running. + } + + return new RuntimeStatus { Running = false, Pid = 0, Owner = "" }; + } + + public void Start() + { + RunPowerShell("start-ovms.ps1"); + } + + public void Stop() + { + RunPowerShell("stop-ovms.ps1"); + } + + public void Restart() + { + Stop(); + Start(); + } + + public string Repair() + { + var settings = LoadSettings(); + return RunPowerShell("repair-package.ps1", $"-InstallDir \"{settings.InstallDir}\" -DataDir \"{DataDir}\"", includeDataDirArg: false); + } + + public string ValidateEnvironment() + { + var settings = LoadSettings(); + return RunPowerShell("validate-install.ps1", $"-InstallDir \"{settings.InstallDir}\"", includeDataDirArg: false); + } + + public async Task CheckHealthAsync() + { + var settings = LoadSettings(); + var url = $"http://{settings.BindAddress}:{settings.RestPort}/v3/models"; + + try + { + using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(3)); + using var response = await httpClient.GetAsync(url, cts.Token).ConfigureAwait(false); + + if (!response.IsSuccessStatusCode) + { + return new HealthResult { Ok = false, ModelCount = 0, Message = $"HTTP {(int)response.StatusCode}" }; + } + + var body = await response.Content.ReadAsStringAsync(cts.Token).ConfigureAwait(false); + var modelCount = 0; + try + { + using var doc = JsonDocument.Parse(body); + if (doc.RootElement.TryGetProperty("data", out var data) && data.ValueKind == JsonValueKind.Array) + { + modelCount = data.GetArrayLength(); + } + } + catch + { + // Tolerate unparsable bodies; we still know the endpoint responded OK. + } + + return new HealthResult { Ok = true, ModelCount = modelCount, Message = "OK" }; + } + catch (Exception ex) + { + return new HealthResult { Ok = false, ModelCount = 0, Message = ex.Message }; + } + } + + public static bool IsPortFree(int port) + { + try + { + using var client = new TcpClient(); + var connectTask = client.ConnectAsync("127.0.0.1", port); + var completed = connectTask.Wait(TimeSpan.FromMilliseconds(300)); + return !(completed && client.Connected); + } + catch + { + return true; + } + } + + public string EffectiveCommandLine() + { + var settings = LoadSettings(); + var ovmsExe = Path.Combine(settings.InstallDir, "ovms.exe"); + + var args = new List + { + "--rest_port", settings.RestPort.ToString(), + "--rest_bind_address", settings.BindAddress, + "--config_path", settings.ConfigPath, + "--log_level", settings.LogLevel, + "--log_path", settings.LogPath + }; + + if (settings.GrpcPort > 0) + { + args.Add("--port"); + args.Add(settings.GrpcPort.ToString()); + } + + return $"\"{ovmsExe}\" {string.Join(' ', args.Select(a => a.Contains(' ') ? $"\"{a}\"" : a))}"; + } + + public IReadOnlyList TailLog(int lines) + { + var settings = LoadSettings(); + if (string.IsNullOrEmpty(settings.LogPath) || !File.Exists(settings.LogPath)) + { + return Array.Empty(); + } + + using var stream = new FileStream(settings.LogPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite | FileShare.Delete); + using var reader = new StreamReader(stream); + + var buffer = new Queue(lines + 1); + string? line; + while ((line = reader.ReadLine()) is not null) + { + if (buffer.Count == lines) + { + buffer.Dequeue(); + } + buffer.Enqueue(line); + } + + return buffer.ToList(); + } + + /// + /// Builds a diagnostics zip. The timestamp is supplied by the caller so + /// this method stays deterministic/testable. + /// + public string ExportDiagnostics(string stamp) + { + var diagDir = Path.Combine(DataDir, "diagnostics"); + Directory.CreateDirectory(diagDir); + + var zipPath = Path.Combine(diagDir, $"ovms-diagnostics-{stamp}.zip"); + if (File.Exists(zipPath)) + { + File.Delete(zipPath); + } + + var settings = LoadSettings(); + + using var archive = ZipFile.Open(zipPath, ZipArchiveMode.Create); + + AddFileIfExists(archive, SettingsPath, "settings.json"); + AddFileIfExists(archive, settings.ConfigPath, "models/config.json"); + AddFileIfExists(archive, RuntimePath, "runtime.json"); + + var versionsEntry = archive.CreateEntry("versions.txt"); + using (var writer = new StreamWriter(versionsEntry.Open())) + { + writer.WriteLine($"Manager version: {typeof(OvmsController).Assembly.GetName().Version}"); + writer.WriteLine($"ovms.exe --version output:"); + writer.WriteLine(GetOvmsVersionOutput(settings.InstallDir)); + } + + var logLines = TailLog(500); + if (logLines.Count > 0) + { + var logEntry = archive.CreateEntry("server.log.tail.txt"); + using var writer = new StreamWriter(logEntry.Open()); + foreach (var line in logLines) + { + writer.WriteLine(line); + } + } + + return zipPath; + } + + private static void AddFileIfExists(ZipArchive archive, string path, string entryName) + { + if (!string.IsNullOrEmpty(path) && File.Exists(path)) + { + archive.CreateEntryFromFile(path, entryName); + } + } + + private static string GetOvmsVersionOutput(string installDir) + { + try + { + var ovmsExe = Path.Combine(installDir, "ovms.exe"); + if (!File.Exists(ovmsExe)) + { + return "(ovms.exe not found)"; + } + + var startInfo = new ProcessStartInfo + { + FileName = ovmsExe, + Arguments = "--version", + CreateNoWindow = true, + UseShellExecute = false, + RedirectStandardOutput = true, + RedirectStandardError = true + }; + + using var process = Process.Start(startInfo); + if (process is null) + { + return "(failed to start ovms.exe)"; + } + + var stdout = process.StandardOutput.ReadToEnd(); + var stderr = process.StandardError.ReadToEnd(); + process.WaitForExit(5000); + + return string.IsNullOrWhiteSpace(stdout) ? stderr : stdout; + } + catch (Exception ex) + { + return $"(error: {ex.Message})"; + } + } + + private string RunPowerShell(string scriptName, string? extraArgs = null, bool includeDataDirArg = true) + { + var scriptPath = Path.Combine(AppDir, "scripts", scriptName); + if (!File.Exists(scriptPath)) + { + throw new FileNotFoundException("Missing control script.", scriptPath); + } + + var arguments = $"-NoProfile -ExecutionPolicy Bypass -File \"{scriptPath}\""; + if (includeDataDirArg) + { + arguments += $" -DataDir \"{DataDir}\""; + } + if (!string.IsNullOrEmpty(extraArgs)) + { + arguments += " " + extraArgs; + } + + var startInfo = new ProcessStartInfo + { + FileName = "powershell.exe", + Arguments = arguments, + CreateNoWindow = true, + UseShellExecute = false, + RedirectStandardError = true, + RedirectStandardOutput = true + }; + + using var process = Process.Start(startInfo) ?? throw new InvalidOperationException("Failed to start PowerShell."); + var stdout = process.StandardOutput.ReadToEnd(); + var stderr = process.StandardError.ReadToEnd(); + process.WaitForExit(); + + if (process.ExitCode != 0) + { + throw new InvalidOperationException(string.IsNullOrWhiteSpace(stderr) ? stdout : stderr); + } + + return string.IsNullOrWhiteSpace(stdout) ? stderr : stdout; + } + + public void Dispose() + { + httpClient.Dispose(); + } +} diff --git a/packaging/windows/manager/src/OVMS.Manager/OvmsSettings.cs b/packaging/windows/manager/src/OVMS.Manager/OvmsSettings.cs new file mode 100644 index 0000000000..44b25be2d9 --- /dev/null +++ b/packaging/windows/manager/src/OVMS.Manager/OvmsSettings.cs @@ -0,0 +1,25 @@ +namespace OVMS.Manager; + +/// +/// Plain settings POCO persisted to %LOCALAPPDATA%\OVMS\settings.json. +/// Property names match the JSON keys case-insensitively (System.Text.Json +/// is configured with PropertyNameCaseInsensitive = true wherever this is +/// deserialized). +/// +internal sealed class OvmsSettings +{ + public string InstallDir { get; set; } = ""; + public string DataDir { get; set; } = ""; + public string ModelRepositoryPath { get; set; } = ""; + public string ConfigPath { get; set; } = ""; + public string LogPath { get; set; } = ""; + public int RestPort { get; set; } = 8000; + public int GrpcPort { get; set; } = 0; + public string BindAddress { get; set; } = "127.0.0.1"; + public string LogLevel { get; set; } = "INFO"; + public string RunMode { get; set; } = "user-login"; + public bool StartAtLogin { get; set; } = true; + public bool ShowTrayIcon { get; set; } = true; + public bool ServiceAutoStart { get; set; } = false; + public string PackageVariant { get; set; } = "python_on"; +} diff --git a/packaging/windows/manager/src/OVMS.Manager/Program.cs b/packaging/windows/manager/src/OVMS.Manager/Program.cs index e650726200..b2598aa51a 100644 --- a/packaging/windows/manager/src/OVMS.Manager/Program.cs +++ b/packaging/windows/manager/src/OVMS.Manager/Program.cs @@ -1,212 +1,27 @@ -using System.Diagnostics; -using System.Drawing; -using System.Text.Json; -using System.Windows.Forms; - namespace OVMS.Manager; internal static class Program { - [STAThread] - private static void Main() - { - ApplicationConfiguration.Initialize(); - using var app = new TrayApplicationContext(); - Application.Run(app); - } -} - -internal sealed class TrayApplicationContext : ApplicationContext -{ - private readonly NotifyIcon notifyIcon; - private readonly ToolStripMenuItem startItem; - private readonly ToolStripMenuItem stopItem; - private readonly OvmsController controller; - - public TrayApplicationContext() - { - controller = new OvmsController(); - - startItem = new ToolStripMenuItem("Start Server", null, (_, _) => RunAction("Start Server", controller.Start)); - stopItem = new ToolStripMenuItem("Stop Server", null, (_, _) => RunAction("Stop Server", controller.Stop)); - - var openItem = new ToolStripMenuItem("Open OVMS Manager", null, (_, _) => OpenManager()); - var menu = new ContextMenuStrip(); - menu.Items.Add(openItem); - menu.Items.Add(startItem); - menu.Items.Add(stopItem); - - notifyIcon = new NotifyIcon - { - Icon = Icon.ExtractAssociatedIcon(Application.ExecutablePath) ?? SystemIcons.Application, - Text = "OpenVINO Model Server", - ContextMenuStrip = menu, - Visible = true - }; - notifyIcon.MouseClick += (_, args) => - { - if (args.Button == MouseButtons.Left) - { - OpenManager(); - } - }; - } - - protected override void Dispose(bool disposing) - { - if (disposing) - { - notifyIcon.Visible = false; - notifyIcon.Dispose(); - controller.Dispose(); - } - base.Dispose(disposing); - } - - private void OpenManager() - { - var status = controller.GetStatus(); - MessageBox.Show(status, "OpenVINO Model Server", MessageBoxButtons.OK, MessageBoxIcon.Information); - } - - private void RunAction(string title, Action action) - { - try - { - startItem.Enabled = false; - stopItem.Enabled = false; - action(); - notifyIcon.ShowBalloonTip(3000, "OpenVINO Model Server", $"{title} completed.", ToolTipIcon.Info); - } - catch (Exception ex) - { - MessageBox.Show(ex.Message, title, MessageBoxButtons.OK, MessageBoxIcon.Error); - } - finally - { - startItem.Enabled = true; - stopItem.Enabled = true; - } - } -} + private const string SingleInstanceMutexName = "OVMS.Manager.SingleInstance"; -internal sealed class OvmsController : IDisposable -{ - private readonly string dataDir = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "OVMS"); - private readonly string appDir = AppContext.BaseDirectory; - - public string GetStatus() - { - var settings = LoadSettings(); - var runtimePath = Path.Combine(dataDir, "runtime.json"); - var status = "Stopped"; - - if (File.Exists(runtimePath)) - { - try - { - using var doc = JsonDocument.Parse(File.ReadAllText(runtimePath)); - if (doc.RootElement.TryGetProperty("pid", out var pidElement) && pidElement.TryGetInt32(out var pid)) - { - var process = Process.GetProcessById(pid); - if (string.Equals(process.ProcessName, "ovms", StringComparison.OrdinalIgnoreCase)) - { - status = $"Running, pid {pid}"; - } - } - } - catch - { - status = "Runtime state is stale or unreadable"; - } - } - - return string.Join(Environment.NewLine, new[] - { - $"Status: {status}", - $"REST: http://{settings.BindAddress}:{settings.RestPort}", - $"Install: {settings.InstallDir}", - $"Config: {settings.ConfigPath}", - $"Logs: {settings.LogPath}" - }); - } - - public void Start() - { - RunPowerShell("start-ovms.ps1"); - } - - public void Stop() - { - RunPowerShell("stop-ovms.ps1"); - } - - public void Dispose() - { - } - - private OvmsSettings LoadSettings() + [STAThread] + private static void Main(string[] args) { - var settingsPath = Path.Combine(dataDir, "settings.json"); - if (!File.Exists(settingsPath)) + using var singleInstanceMutex = new Mutex(initiallyOwned: true, SingleInstanceMutexName, out var createdNew); + if (!createdNew) { - return new OvmsSettings - { - InstallDir = appDir.TrimEnd(Path.DirectorySeparatorChar), - DataDir = dataDir, - ConfigPath = Path.Combine(dataDir, "models", "config.json"), - LogPath = Path.Combine(dataDir, "logs", "ovms_server.log"), - BindAddress = "127.0.0.1", - RestPort = 8000, - GrpcPort = 0 - }; + // Another instance already owns the Manager; exit quietly. + return; } - var settings = JsonSerializer.Deserialize(File.ReadAllText(settingsPath), new JsonSerializerOptions - { - PropertyNameCaseInsensitive = true - }); + var startHidden = args.Any(a => + string.Equals(a, "--tray", StringComparison.OrdinalIgnoreCase) || + string.Equals(a, "/tray", StringComparison.OrdinalIgnoreCase)); - return settings ?? throw new InvalidOperationException($"Could not parse settings: {settingsPath}"); - } - - private void RunPowerShell(string scriptName) - { - var scriptPath = Path.Combine(appDir, "scripts", scriptName); - if (!File.Exists(scriptPath)) - { - throw new FileNotFoundException("Missing control script.", scriptPath); - } - - var startInfo = new ProcessStartInfo - { - FileName = "powershell.exe", - Arguments = $"-NoProfile -ExecutionPolicy Bypass -File \"{scriptPath}\" -DataDir \"{dataDir}\"", - CreateNoWindow = true, - UseShellExecute = false, - RedirectStandardError = true, - RedirectStandardOutput = true - }; - - using var process = Process.Start(startInfo) ?? throw new InvalidOperationException("Failed to start PowerShell."); - var stdout = process.StandardOutput.ReadToEnd(); - var stderr = process.StandardError.ReadToEnd(); - process.WaitForExit(); + ApplicationConfiguration.Initialize(); + using var app = new TrayApplicationContext(startHidden); + Application.Run(app); - if (process.ExitCode != 0) - { - throw new InvalidOperationException(string.IsNullOrWhiteSpace(stderr) ? stdout : stderr); - } + GC.KeepAlive(singleInstanceMutex); } } - -internal sealed class OvmsSettings -{ - public string InstallDir { get; set; } = ""; - public string DataDir { get; set; } = ""; - public string ConfigPath { get; set; } = ""; - public string LogPath { get; set; } = ""; - public string BindAddress { get; set; } = "127.0.0.1"; - public int RestPort { get; set; } = 8000; - public int GrpcPort { get; set; } = 9000; -} diff --git a/packaging/windows/manager/src/OVMS.Manager/TrayApplicationContext.cs b/packaging/windows/manager/src/OVMS.Manager/TrayApplicationContext.cs new file mode 100644 index 0000000000..d2f7bdd5f4 --- /dev/null +++ b/packaging/windows/manager/src/OVMS.Manager/TrayApplicationContext.cs @@ -0,0 +1,128 @@ +using System.Drawing; + +namespace OVMS.Manager; + +/// +/// Owns the NotifyIcon and a single lazily-created MainForm instance. +/// +internal sealed class TrayApplicationContext : ApplicationContext +{ + private readonly NotifyIcon notifyIcon; + private readonly ToolStripMenuItem startItem; + private readonly ToolStripMenuItem stopItem; + private readonly OvmsController controller; + private MainForm? mainForm; + private readonly bool startHidden; + + public TrayApplicationContext(bool startHidden = false) + { + this.startHidden = startHidden; + controller = new OvmsController(); + + startItem = new ToolStripMenuItem("Start Server", null, async (_, _) => await RunTrayActionAsync("Start Server", controller.Start)); + stopItem = new ToolStripMenuItem("Stop Server", null, async (_, _) => await RunTrayActionAsync("Stop Server", controller.Stop)); + + var openItem = new ToolStripMenuItem("Open OVMS Manager", null, (_, _) => OpenManager()); + var exitItem = new ToolStripMenuItem("Exit", null, (_, _) => ExitApplication()); + + var menu = new ContextMenuStrip(); + menu.Items.Add(openItem); + menu.Items.Add(startItem); + menu.Items.Add(stopItem); + menu.Items.Add(new ToolStripSeparator()); + menu.Items.Add(exitItem); + + notifyIcon = new NotifyIcon + { + Icon = Icon.ExtractAssociatedIcon(Application.ExecutablePath) ?? SystemIcons.Application, + Text = "OpenVINO Model Server", + ContextMenuStrip = menu, + Visible = true + }; + notifyIcon.MouseClick += (_, args) => + { + if (args.Button == MouseButtons.Left) + { + OpenManager(); + } + }; + + if (!startHidden) + { + OpenManager(); + } + } + + private MainForm GetOrCreateMainForm() + { + if (mainForm is null || mainForm.IsDisposed) + { + mainForm = new MainForm(controller); + } + return mainForm; + } + + private void OpenManager() + { + var form = GetOrCreateMainForm(); + + if (!form.Visible) + { + form.Show(); + } + + if (form.WindowState == FormWindowState.Minimized) + { + form.WindowState = FormWindowState.Normal; + } + + form.Activate(); + form.BringToFront(); + } + + private async Task RunTrayActionAsync(string title, Action action) + { + startItem.Enabled = false; + stopItem.Enabled = false; + try + { + await Task.Run(action); + notifyIcon.ShowBalloonTip(3000, "OpenVINO Model Server", $"{title} completed.", ToolTipIcon.Info); + if (mainForm is { IsDisposed: false }) + { + await mainForm.RefreshDashboardAsync(); + } + } + catch (Exception ex) + { + notifyIcon.ShowBalloonTip(5000, "OpenVINO Model Server", $"{title} failed: {ex.Message}", ToolTipIcon.Error); + } + finally + { + startItem.Enabled = true; + stopItem.Enabled = true; + } + } + + private void ExitApplication() + { + notifyIcon.Visible = false; + if (mainForm is { IsDisposed: false }) + { + mainForm.AllowExit = true; + mainForm.Close(); + } + ExitThread(); + } + + protected override void Dispose(bool disposing) + { + if (disposing) + { + notifyIcon.Visible = false; + notifyIcon.Dispose(); + controller.Dispose(); + } + base.Dispose(disposing); + } +} From 50ae59cd7f603a37c0d8f11426911fc44f246b80 Mon Sep 17 00:00:00 2001 From: exzile Date: Tue, 30 Jun 2026 17:21:24 -0400 Subject: [PATCH 3/9] Modernize OVMS Manager GUI (nav rail, cards, icons, theme) Replace the TabControl layout with an app-shell: a left nav rail (Dashboard/Settings/Logs/Advanced) with Fluent icons, selected accent bar, and a Running/Stopped status pill, plus a content header with a refresh icon-button. - Theme.cs: color/font tokens + Fluent-icon glyph constants (Segoe Fluent Icons, falling back to Segoe MDL2 Assets). - CardPanel.cs: anti-aliased rounded-rectangle panel. - Dashboard: status cards (status/REST/gRPC/models/health/variant/mode) with colored dots and a 5s auto-refresh timer. - Logs: dark console (Consolas). Settings: aligned TableLayoutPanel. Advanced: command line + Repair/Validate/Export with inline status. - Logic layer (OvmsController/Program/Tray/Settings) unchanged; tray Open continues to open this window. Co-Authored-By: Claude Opus 4.8 Signed-off-by: exzile --- .../manager/src/OVMS.Manager/CardPanel.cs | 55 ++ .../manager/src/OVMS.Manager/MainForm.cs | 708 ++++++++++++++---- .../windows/manager/src/OVMS.Manager/Theme.cs | 91 +++ 3 files changed, 728 insertions(+), 126 deletions(-) create mode 100644 packaging/windows/manager/src/OVMS.Manager/CardPanel.cs create mode 100644 packaging/windows/manager/src/OVMS.Manager/Theme.cs diff --git a/packaging/windows/manager/src/OVMS.Manager/CardPanel.cs b/packaging/windows/manager/src/OVMS.Manager/CardPanel.cs new file mode 100644 index 0000000000..cc445a5777 --- /dev/null +++ b/packaging/windows/manager/src/OVMS.Manager/CardPanel.cs @@ -0,0 +1,55 @@ +using System.Drawing.Drawing2D; + +namespace OVMS.Manager; + +/// +/// A lightweight rounded-rectangle card: surface-colored panel with a 1px +/// border, used for dashboard cards and grouped settings sections. +/// Double-buffered to avoid flicker on resize/redraw. +/// +internal sealed class CardPanel : Panel +{ + public int CornerRadius { get; set; } = 8; + public Color BorderColor { get; set; } = Theme.Border; + public Color CardBackColor { get; set; } = Theme.Surface; + + public CardPanel() + { + SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw, true); + BackColor = Theme.WindowBackground; + Padding = new Padding(16); + } + + private static GraphicsPath RoundedRect(Rectangle bounds, int radius) + { + var path = new GraphicsPath(); + if (radius <= 0) + { + path.AddRectangle(bounds); + return path; + } + + var d = radius * 2; + path.AddArc(bounds.X, bounds.Y, d, d, 180, 90); + path.AddArc(bounds.Right - d, bounds.Y, d, d, 270, 90); + path.AddArc(bounds.Right - d, bounds.Bottom - d, d, d, 0, 90); + path.AddArc(bounds.X, bounds.Bottom - d, d, d, 90, 90); + path.CloseFigure(); + return path; + } + + protected override void OnPaint(PaintEventArgs e) + { + e.Graphics.SmoothingMode = SmoothingMode.AntiAlias; + + var rect = new Rectangle(0, 0, Width - 1, Height - 1); + using var path = RoundedRect(rect, CornerRadius); + using var fillBrush = new SolidBrush(CardBackColor); + using var borderPen = new Pen(BorderColor, 1f); + + e.Graphics.FillPath(fillBrush, path); + e.Graphics.DrawPath(borderPen, path); + + base.OnPaint(e); + } +} diff --git a/packaging/windows/manager/src/OVMS.Manager/MainForm.cs b/packaging/windows/manager/src/OVMS.Manager/MainForm.cs index 9ae56d7903..e3ac0b186a 100644 --- a/packaging/windows/manager/src/OVMS.Manager/MainForm.cs +++ b/packaging/windows/manager/src/OVMS.Manager/MainForm.cs @@ -1,11 +1,14 @@ using System.Diagnostics; using System.Drawing; +using System.Drawing.Drawing2D; using Microsoft.Win32; namespace OVMS.Manager; /// -/// Main GUI window: Dashboard / Settings / Logs / Advanced tabs. +/// Main GUI window: app-shell layout with a left nav rail (Dashboard / +/// Settings / Logs / Advanced) and a content area on the right. Pages are +/// plain Panels toggled via Visible, not a TabControl. /// All process/HTTP work is dispatched off the UI thread via Task.Run and /// marshalled back through the WinForms SynchronizationContext (async/await). /// @@ -22,19 +25,31 @@ internal sealed class MainForm : Form /// public bool AllowExit { get; set; } + // Shell controls + private Panel navRail = null!; + private Panel contentHost = null!; + private Label pageTitleLabel = null!; + private Button headerRefreshButton = null!; + private readonly List navButtons = new(); + private readonly Dictionary pages = new(); + private Label railStatusDot = null!; + private Label railStatusText = null!; + private System.Windows.Forms.Timer? dashboardTimer; + private string currentPage = ""; + // Dashboard controls private Label statusValueLabel = null!; + private Label statusDotLabel = null!; private Label runModeValueLabel = null!; private Label restUrlValueLabel = null!; private Label grpcValueLabel = null!; - private Label bindValueLabel = null!; private Label variantValueLabel = null!; private Label healthValueLabel = null!; + private Label healthDotLabel = null!; private Label modelsValueLabel = null!; private Button startButton = null!; private Button stopButton = null!; private Button restartButton = null!; - private Button refreshButton = null!; // Settings controls private NumericUpDown restPortInput = null!; @@ -52,14 +67,20 @@ internal sealed class MainForm : Form // Advanced controls private TextBox advancedTextBox = null!; + private Label advancedStatusLabel = null!; public MainForm(OvmsController controller) { this.controller = controller; Text = "OpenVINO Model Server Manager"; - MinimumSize = new Size(720, 520); + MinimumSize = new Size(860, 600); + Size = new Size(960, 640); StartPosition = FormStartPosition.CenterScreen; + BackColor = Theme.WindowBackground; + Font = Theme.BaseFont; + SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.OptimizedDoubleBuffer, true); + try { Icon = Icon.ExtractAssociatedIcon(Application.ExecutablePath); @@ -69,15 +90,13 @@ public MainForm(OvmsController controller) Icon = SystemIcons.Application; } - var tabs = new TabControl { Dock = DockStyle.Fill }; - tabs.TabPages.Add(BuildDashboardTab()); - tabs.TabPages.Add(BuildSettingsTab()); - tabs.TabPages.Add(BuildLogsTab()); - tabs.TabPages.Add(BuildAdvancedTab()); - Controls.Add(tabs); + BuildShell(); FormClosing += OnFormClosing; + FormClosed += (_, _) => StopDashboardTimer(); Shown += async (_, _) => await RefreshDashboardAsync(); + + SelectPage("Dashboard"); } private void OnFormClosing(object? sender, FormClosingEventArgs e) @@ -106,64 +125,359 @@ private void OnFormClosing(object? sender, FormClosingEventArgs e) } // --------------------------------------------------------------- - // Dashboard + // Shell: nav rail + content header + page hosting // --------------------------------------------------------------- - private TabPage BuildDashboardTab() + private void BuildShell() { - var page = new TabPage("Dashboard"); - var layout = new TableLayoutPanel + navRail = new Panel + { + Dock = DockStyle.Left, + Width = 210, + BackColor = Theme.Rail + }; + + var railBorder = new Panel { Dock = DockStyle.Right, Width = 1, BackColor = Theme.Border }; + navRail.Controls.Add(railBorder); + + var headerBlock = new Panel { Dock = DockStyle.Top, Height = 76, BackColor = Theme.Rail }; + var titleLabel = new Label { + Text = "OVMS Manager", + Font = Theme.SemiboldFont, + ForeColor = Theme.Text, + AutoSize = false, + TextAlign = ContentAlignment.MiddleLeft, Dock = DockStyle.Fill, - ColumnCount = 2, - Padding = new Padding(12), - AutoSize = true + Padding = new Padding(18, 0, 8, 0) + }; + var ringDot = new Label + { + Text = "●", + ForeColor = Theme.Accent, + Font = new Font("Segoe UI", 14f), + AutoSize = true, + Location = new Point(18, 14) + }; + headerBlock.Controls.Add(titleLabel); + headerBlock.Controls.Add(ringDot); + titleLabel.Padding = new Padding(40, 0, 8, 0); + titleLabel.Location = new Point(0, 14); + titleLabel.Size = new Size(210, 40); + + var navFlow = new FlowLayoutPanel + { + Dock = DockStyle.Top, + FlowDirection = FlowDirection.TopDown, + WrapContents = false, + AutoSize = true, + Top = 76 + }; + navFlow.Controls.Add(CreateNavButton("Dashboard", Glyphs.Dashboard)); + navFlow.Controls.Add(CreateNavButton("Settings", Glyphs.Settings)); + navFlow.Controls.Add(CreateNavButton("Logs", Glyphs.Logs)); + navFlow.Controls.Add(CreateNavButton("Advanced", Glyphs.Advanced)); + + var statusPill = new Panel { Dock = DockStyle.Bottom, Height = 56, BackColor = Theme.Rail, Padding = new Padding(16, 12, 16, 12) }; + var pillInner = new FlowLayoutPanel { Dock = DockStyle.Fill, FlowDirection = FlowDirection.LeftToRight, WrapContents = false }; + railStatusDot = new Label { Text = "●", ForeColor = Theme.Muted, Font = new Font("Segoe UI", 10f), AutoSize = true, Margin = new Padding(0, 3, 6, 0) }; + railStatusText = new Label { Text = "Checking...", ForeColor = Theme.Muted, Font = Theme.BaseFont, AutoSize = true, Margin = new Padding(0, 4, 0, 0) }; + pillInner.Controls.Add(railStatusDot); + pillInner.Controls.Add(railStatusText); + statusPill.Controls.Add(pillInner); + + navRail.Controls.Add(navFlow); + navRail.Controls.Add(statusPill); + navRail.Controls.Add(headerBlock); + + // Content area + var contentArea = new Panel { Dock = DockStyle.Fill, BackColor = Theme.WindowBackground }; + + var contentHeader = new Panel { Dock = DockStyle.Top, Height = 56, BackColor = Theme.WindowBackground, Padding = new Padding(24, 12, 24, 12) }; + pageTitleLabel = new Label { Text = "Dashboard", Font = Theme.PageTitleFont, ForeColor = Theme.Text, AutoSize = true, Dock = DockStyle.Left }; + headerRefreshButton = CreateIconButton(Glyphs.Refresh, "Refresh"); + headerRefreshButton.Dock = DockStyle.Right; + headerRefreshButton.Click += async (_, _) => await RefreshCurrentPageAsync(); + contentHeader.Controls.Add(pageTitleLabel); + contentHeader.Controls.Add(headerRefreshButton); + + contentHost = new Panel { Dock = DockStyle.Fill, BackColor = Theme.WindowBackground, Padding = new Padding(24, 12, 24, 24) }; + SetDoubleBuffered(contentHost); + + pages["Dashboard"] = BuildDashboardPage(); + pages["Settings"] = BuildSettingsPage(); + pages["Logs"] = BuildLogsPage(); + pages["Advanced"] = BuildAdvancedPage(); + + foreach (var page in pages.Values) + { + page.Dock = DockStyle.Fill; + page.Visible = false; + contentHost.Controls.Add(page); + } + + contentArea.Controls.Add(contentHost); + contentArea.Controls.Add(contentHeader); + + Controls.Add(contentArea); + Controls.Add(navRail); + } + + private static void SetDoubleBuffered(Control control) + { + typeof(Control).InvokeMember("DoubleBuffered", + System.Reflection.BindingFlags.SetProperty | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic, + null, control, new object[] { true }); + } + + private NavButton CreateNavButton(string name, string glyph) + { + var button = new NavButton(name, glyph); + button.Click += (_, _) => SelectPage(name); + navButtons.Add(button); + return button; + } + + private void SelectPage(string name) + { + if (!pages.ContainsKey(name)) + { + return; + } + + currentPage = name; + pageTitleLabel.Text = name; + + foreach (var page in pages) + { + page.Value.Visible = page.Key == name; + } + + foreach (var nav in navButtons) + { + nav.Selected = nav.PageName == name; + } + + if (name == "Dashboard") + { + StartDashboardTimer(); + _ = RefreshDashboardAsync(); + } + else + { + StopDashboardTimer(); + if (name == "Settings") + { + LoadSettingsIntoForm(); + } + else if (name == "Logs") + { + _ = RefreshLogsAsync(); + } + else if (name == "Advanced") + { + RefreshAdvancedInfo(); + } + } + } + + private async Task RefreshCurrentPageAsync() + { + switch (currentPage) + { + case "Dashboard": + await RefreshDashboardAsync(); + break; + case "Logs": + await RefreshLogsAsync(); + break; + case "Advanced": + RefreshAdvancedInfo(); + break; + case "Settings": + LoadSettingsIntoForm(); + break; + } + } + + private void StartDashboardTimer() + { + if (dashboardTimer != null) + { + return; + } + dashboardTimer = new System.Windows.Forms.Timer { Interval = 5000 }; + dashboardTimer.Tick += async (_, _) => + { + if (currentPage == "Dashboard" && Visible) + { + await RefreshDashboardAsync(); + } + }; + dashboardTimer.Start(); + } + + private void StopDashboardTimer() + { + if (dashboardTimer is null) + { + return; + } + dashboardTimer.Stop(); + dashboardTimer.Dispose(); + dashboardTimer = null; + } + + // --------------------------------------------------------------- + // Shared UI helpers + // --------------------------------------------------------------- + + private static Button CreateIconButton(string glyph, string tooltip) + { + var button = new Button + { + Text = glyph, + Font = Theme.IconFont(13f), + FlatStyle = FlatStyle.Flat, + ForeColor = Theme.Muted, + BackColor = Theme.Surface, + Size = new Size(32, 32), + Cursor = Cursors.Hand, + UseVisualStyleBackColor = false + }; + button.FlatAppearance.BorderSize = 1; + button.FlatAppearance.BorderColor = Theme.Border; + button.FlatAppearance.MouseOverBackColor = Theme.HoverTint; + var tip = new ToolTip(); + tip.SetToolTip(button, tooltip); + return button; + } + + private static Button CreatePrimaryButton(string glyph, string text, Color fillColor) + { + var button = new Button + { + Text = " " + text, + Font = Theme.NavFont, + FlatStyle = FlatStyle.Flat, + ForeColor = Color.White, + BackColor = fillColor, + AutoSize = true, + AutoSizeMode = AutoSizeMode.GrowAndShrink, + Padding = new Padding(12, 8, 14, 8), + Cursor = Cursors.Hand, + UseVisualStyleBackColor = false, + TextImageRelation = TextImageRelation.ImageBeforeText + }; + button.FlatAppearance.BorderSize = 0; + button.FlatAppearance.MouseOverBackColor = ControlPaint.Dark(fillColor, 0.08f); + return button; + } + + private static Button CreateSecondaryButton(string text) + { + var button = new Button + { + Text = " " + text, + Font = Theme.NavFont, + FlatStyle = FlatStyle.Flat, + ForeColor = Theme.Text, + BackColor = Theme.Surface, + AutoSize = true, + AutoSizeMode = AutoSizeMode.GrowAndShrink, + Padding = new Padding(12, 8, 14, 8), + Cursor = Cursors.Hand, + UseVisualStyleBackColor = false + }; + button.FlatAppearance.BorderSize = 1; + button.FlatAppearance.BorderColor = Theme.Border; + button.FlatAppearance.MouseOverBackColor = Theme.HoverTint; + return button; + } + + private static CardPanel CreateCard(int width, int height) + { + return new CardPanel + { + Width = width, + Height = height, + Margin = new Padding(0, 0, 16, 16) }; - layout.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize)); - layout.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100)); - - (Label caption, Label value) AddRow(string caption) - { - var captionLabel = new Label { Text = caption, AutoSize = true, Margin = new Padding(3, 8, 12, 3), Font = new Font(Font, FontStyle.Bold) }; - var valueLabel = new Label { Text = "-", AutoSize = true, Margin = new Padding(3, 8, 3, 3) }; - layout.Controls.Add(captionLabel); - layout.Controls.Add(valueLabel); - return (captionLabel, valueLabel); - } - - (_, statusValueLabel) = AddRow("Status:"); - (_, runModeValueLabel) = AddRow("Runtime mode:"); - (_, restUrlValueLabel) = AddRow("REST URL:"); - (_, grpcValueLabel) = AddRow("gRPC port:"); - (_, bindValueLabel) = AddRow("Bind address:"); - (_, variantValueLabel) = AddRow("Package variant:"); - (_, healthValueLabel) = AddRow("Health:"); - (_, modelsValueLabel) = AddRow("Served models:"); - - var buttonPanel = new FlowLayoutPanel { Dock = DockStyle.Bottom, Height = 48, Padding = new Padding(8) }; - startButton = new Button { Text = "Start", AutoSize = true }; - stopButton = new Button { Text = "Stop", AutoSize = true }; - restartButton = new Button { Text = "Restart", AutoSize = true }; - refreshButton = new Button { Text = "Refresh", AutoSize = true }; - var openLogsButton = new Button { Text = "Open Logs", AutoSize = true }; - var openModelFolderButton = new Button { Text = "Open Model Folder", AutoSize = true }; + } + + // --------------------------------------------------------------- + // Dashboard + // --------------------------------------------------------------- + + private Panel BuildDashboardPage() + { + var page = new Panel { BackColor = Theme.WindowBackground }; + + var cardFlow = new FlowLayoutPanel + { + Dock = DockStyle.Top, + FlowDirection = FlowDirection.LeftToRight, + WrapContents = true, + AutoSize = true, + Padding = new Padding(0, 0, 0, 8) + }; + + (Label dot, Label value) AddStatusCard(string title, string initialValue, bool withDot) + { + var card = CreateCard(220, 92); + var titleLabel = new Label { Text = title, Font = Theme.CardTitleFont, ForeColor = Theme.Muted, AutoSize = true, Location = new Point(16, 14) }; + Label? dotLabel = null; + var valueLabel = new Label { Text = initialValue, Font = Theme.CardValueFont, ForeColor = Theme.Text, AutoSize = true, Location = new Point(withDot ? 32 : 16, 42) }; + if (withDot) + { + dotLabel = new Label { Text = "●", Font = new Font("Segoe UI", 11f), ForeColor = Theme.Muted, AutoSize = true, Location = new Point(16, 44) }; + card.Controls.Add(dotLabel); + } + card.Controls.Add(titleLabel); + card.Controls.Add(valueLabel); + cardFlow.Controls.Add(card); + return (dotLabel!, valueLabel); + } + + (statusDotLabel, statusValueLabel) = AddStatusCard("Status", "-", withDot: true); + (_, restUrlValueLabel) = AddStatusCard("REST endpoint", "-", withDot: false); + (_, grpcValueLabel) = AddStatusCard("gRPC port", "-", withDot: false); + (_, modelsValueLabel) = AddStatusCard("Models served", "-", withDot: false); + (healthDotLabel, healthValueLabel) = AddStatusCard("Health", "-", withDot: true); + (_, variantValueLabel) = AddStatusCard("Package variant", "-", withDot: false); + (_, runModeValueLabel) = AddStatusCard("Runtime mode", "-", withDot: false); + + var actionsCard = new CardPanel { Dock = DockStyle.Top, Height = 76, Margin = new Padding(0, 8, 0, 0) }; + var actionsFlow = new FlowLayoutPanel { Dock = DockStyle.Fill, FlowDirection = FlowDirection.LeftToRight, WrapContents = true, Padding = new Padding(4) }; + + startButton = CreatePrimaryButton(Glyphs.Play, "Start", Theme.Success); + stopButton = CreatePrimaryButton(Glyphs.Stop, "Stop", Theme.Danger); + restartButton = CreatePrimaryButton(Glyphs.Restart, "Restart", Theme.Accent); + var openLogsButton = CreateSecondaryButton("Open Logs"); + var openModelFolderButton = CreateSecondaryButton("Open Model Folder"); + + foreach (var b in new[] { startButton, stopButton, restartButton, openLogsButton, openModelFolderButton }) + { + b.Margin = new Padding(0, 0, 10, 0); + } startButton.Click += async (_, _) => await RunControlActionAsync("Start", controller.Start); stopButton.Click += async (_, _) => await RunControlActionAsync("Stop", controller.Stop); restartButton.Click += async (_, _) => await RunControlActionAsync("Restart", controller.Restart); - refreshButton.Click += async (_, _) => await RefreshDashboardAsync(); openLogsButton.Click += (_, _) => OpenFolderFor(TryLoadSettings()?.LogPath); openModelFolderButton.Click += (_, _) => OpenFolder(TryLoadSettings()?.ModelRepositoryPath); - buttonPanel.Controls.Add(startButton); - buttonPanel.Controls.Add(stopButton); - buttonPanel.Controls.Add(restartButton); - buttonPanel.Controls.Add(refreshButton); - buttonPanel.Controls.Add(openLogsButton); - buttonPanel.Controls.Add(openModelFolderButton); - - page.Controls.Add(layout); - page.Controls.Add(buttonPanel); + actionsFlow.Controls.Add(startButton); + actionsFlow.Controls.Add(stopButton); + actionsFlow.Controls.Add(restartButton); + actionsFlow.Controls.Add(openLogsButton); + actionsFlow.Controls.Add(openModelFolderButton); + actionsCard.Controls.Add(actionsFlow); + + // Dock order: bottom-most added is at the top visually for DockStyle.Top stacking, + // so add actionsCard after cardFlow to place it beneath. + page.Controls.Add(actionsCard); + page.Controls.Add(cardFlow); return page; } @@ -190,7 +504,7 @@ private void SetControlButtonsEnabled(bool enabled) startButton.Enabled = enabled; stopButton.Enabled = enabled; restartButton.Enabled = enabled; - refreshButton.Enabled = enabled; + headerRefreshButton.Enabled = enabled; } public async Task RefreshDashboardAsync() @@ -204,17 +518,23 @@ public async Task RefreshDashboardAsync() var runtimeStatus = await Task.Run(controller.GetRuntimeStatus); statusValueLabel.Text = runtimeStatus.Running ? $"Running (pid {runtimeStatus.Pid})" : "Stopped"; + statusDotLabel.ForeColor = runtimeStatus.Running ? Theme.Success : Theme.Muted; + railStatusDot.ForeColor = runtimeStatus.Running ? Theme.Success : Theme.Muted; + railStatusText.Text = runtimeStatus.Running ? "Running" : "Stopped"; + railStatusText.ForeColor = runtimeStatus.Running ? Theme.Text : Theme.Muted; + runModeValueLabel.Text = settings.RunMode; - restUrlValueLabel.Text = $"http://{settings.BindAddress}:{settings.RestPort}"; + restUrlValueLabel.Text = $"{settings.BindAddress}:{settings.RestPort}"; grpcValueLabel.Text = settings.GrpcPort > 0 ? settings.GrpcPort.ToString() : "disabled"; - bindValueLabel.Text = settings.BindAddress; variantValueLabel.Text = settings.PackageVariant; healthValueLabel.Text = "Checking..."; + healthDotLabel.ForeColor = Theme.Muted; modelsValueLabel.Text = "-"; var health = await controller.CheckHealthAsync(); - healthValueLabel.Text = health.Ok ? "Healthy" : $"Unreachable ({health.Message})"; + healthValueLabel.Text = health.Ok ? "Healthy" : "Unreachable"; + healthDotLabel.ForeColor = health.Ok ? Theme.Success : Theme.Danger; modelsValueLabel.Text = health.Ok ? health.ModelCount.ToString() : "-"; } @@ -248,69 +568,77 @@ private static void OpenFolder(string? folderPath) // Settings // --------------------------------------------------------------- - private TabPage BuildSettingsTab() + private Panel BuildSettingsPage() { - var page = new TabPage("Settings"); - var layout = new TableLayoutPanel + var page = new Panel { BackColor = Theme.WindowBackground, AutoScroll = true }; + + var card = new CardPanel { Dock = DockStyle.Top, Height = 430 }; + var cardLayout = new TableLayoutPanel { - Dock = DockStyle.Top, + Dock = DockStyle.Fill, ColumnCount = 2, - AutoSize = true, - Padding = new Padding(12) + AutoSize = false, + Padding = new Padding(4, 4, 4, 4) }; - layout.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize)); - layout.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100)); + cardLayout.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize)); + cardLayout.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100)); + + var sectionTitle = new Label { Text = "Server settings", Font = Theme.CardTitleFont, ForeColor = Theme.Text, AutoSize = true, Margin = new Padding(0, 0, 0, 12) }; + cardLayout.Controls.Add(sectionTitle, 0, 0); + cardLayout.SetColumnSpan(sectionTitle, 2); - void AddLabel(string text) + void AddLabel(string text, int row) { - layout.Controls.Add(new Label { Text = text, AutoSize = true, Margin = new Padding(3, 8, 12, 3) }); + cardLayout.Controls.Add(new Label { Text = text, AutoSize = true, ForeColor = Theme.Text, Margin = new Padding(3, 10, 16, 3) }, 0, row); } - AddLabel("REST port:"); - restPortInput = new NumericUpDown { Minimum = 1, Maximum = 65535, Width = 120 }; - layout.Controls.Add(restPortInput); + var row = 1; + AddLabel("REST port:", row); + restPortInput = new NumericUpDown { Minimum = 1, Maximum = 65535, Width = 120, Margin = new Padding(3, 6, 3, 3) }; + cardLayout.Controls.Add(restPortInput, 1, row++); - AddLabel("gRPC port (0 = disabled):"); - grpcPortInput = new NumericUpDown { Minimum = 0, Maximum = 65535, Width = 120 }; - layout.Controls.Add(grpcPortInput); + AddLabel("gRPC port (0 = disabled):", row); + grpcPortInput = new NumericUpDown { Minimum = 0, Maximum = 65535, Width = 120, Margin = new Padding(3, 6, 3, 3) }; + cardLayout.Controls.Add(grpcPortInput, 1, row++); - AddLabel("Bind address:"); - bindAddressInput = new TextBox { Width = 220 }; - layout.Controls.Add(bindAddressInput); + AddLabel("Bind address:", row); + bindAddressInput = new TextBox { Width = 240, Margin = new Padding(3, 6, 3, 3) }; + cardLayout.Controls.Add(bindAddressInput, 1, row++); - AddLabel("Log level:"); - logLevelInput = new ComboBox { DropDownStyle = ComboBoxStyle.DropDownList, Width = 120 }; + AddLabel("Log level:", row); + logLevelInput = new ComboBox { DropDownStyle = ComboBoxStyle.DropDownList, Width = 140, Margin = new Padding(3, 6, 3, 3) }; logLevelInput.Items.AddRange(new object[] { "ERROR", "WARNING", "INFO", "DEBUG", "TRACE" }); - layout.Controls.Add(logLevelInput); + cardLayout.Controls.Add(logLevelInput, 1, row++); - AddLabel("Log path:"); - logPathInput = new TextBox { Width = 400 }; - layout.Controls.Add(logPathInput); + AddLabel("Log path:", row); + logPathInput = new TextBox { Width = 420, Margin = new Padding(3, 6, 3, 3) }; + cardLayout.Controls.Add(logPathInput, 1, row++); - AddLabel("Model repository path:"); - modelRepoInput = new TextBox { Width = 400 }; - layout.Controls.Add(modelRepoInput); + AddLabel("Model repository path:", row); + modelRepoInput = new TextBox { Width = 420, Margin = new Padding(3, 6, 3, 3) }; + cardLayout.Controls.Add(modelRepoInput, 1, row++); - AddLabel("Startup mode:"); - runModeInput = new ComboBox { DropDownStyle = ComboBoxStyle.DropDownList, Width = 160 }; + AddLabel("Startup mode:", row); + runModeInput = new ComboBox { DropDownStyle = ComboBoxStyle.DropDownList, Width = 180, Margin = new Padding(3, 6, 3, 3) }; runModeInput.Items.AddRange(new object[] { "user-login", "service", "manual" }); - layout.Controls.Add(runModeInput); + cardLayout.Controls.Add(runModeInput, 1, row++); - AddLabel("Show tray icon:"); - showTrayCheckBox = new CheckBox(); - layout.Controls.Add(showTrayCheckBox); + AddLabel("Show tray icon:", row); + showTrayCheckBox = new CheckBox { Margin = new Padding(3, 10, 3, 3) }; + cardLayout.Controls.Add(showTrayCheckBox, 1, row++); - AddLabel("Start at login:"); - startAtLoginCheckBox = new CheckBox(); - layout.Controls.Add(startAtLoginCheckBox); + AddLabel("Start at login:", row); + startAtLoginCheckBox = new CheckBox { Margin = new Padding(3, 10, 3, 3) }; + cardLayout.Controls.Add(startAtLoginCheckBox, 1, row++); - var saveButton = new Button { Text = "Save", AutoSize = true, Margin = new Padding(3, 16, 3, 3) }; + var saveButton = CreatePrimaryButton(Glyphs.Save, "Save", Theme.Accent); + saveButton.Margin = new Padding(3, 18, 3, 3); saveButton.Click += async (_, _) => await SaveSettingsAsync(); - layout.Controls.Add(new Label()); - layout.Controls.Add(saveButton); + cardLayout.Controls.Add(new Label(), 0, row); + cardLayout.Controls.Add(saveButton, 1, row++); - page.Controls.Add(layout); - page.Enter += (_, _) => LoadSettingsIntoForm(); + card.Controls.Add(cardLayout); + page.Controls.Add(card); return page; } @@ -438,10 +766,22 @@ private static void ApplyStartAtLoginRegistration(bool enabled) // Logs // --------------------------------------------------------------- - private TabPage BuildLogsTab() + private Panel BuildLogsPage() { - var page = new TabPage("Logs"); + var page = new Panel { BackColor = Theme.WindowBackground }; + + var toolbar = new FlowLayoutPanel { Dock = DockStyle.Top, Height = 40, FlowDirection = FlowDirection.LeftToRight, Padding = new Padding(0, 0, 0, 8) }; + var refreshLogsButton = CreateIconButton(Glyphs.Refresh, "Refresh"); + var openFolderButton = CreateIconButton(Glyphs.OpenFolder, "Open Folder"); + refreshLogsButton.Margin = new Padding(0, 0, 8, 0); + refreshLogsButton.Click += async (_, _) => await RefreshLogsAsync(); + openFolderButton.Click += (_, _) => OpenFolderFor(TryLoadSettings()?.LogPath); + + toolbar.Controls.Add(refreshLogsButton); + toolbar.Controls.Add(openFolderButton); + + var logCard = new CardPanel { Dock = DockStyle.Fill, Padding = new Padding(1), CardBackColor = Theme.LogBackground, BorderColor = Theme.LogBackground }; logTextBox = new TextBox { Dock = DockStyle.Fill, @@ -449,22 +789,15 @@ private TabPage BuildLogsTab() ReadOnly = true, ScrollBars = ScrollBars.Both, WordWrap = false, - Font = new Font(FontFamily.GenericMonospace, 9f) + BorderStyle = BorderStyle.None, + BackColor = Theme.LogBackground, + ForeColor = Theme.LogForeground, + Font = Theme.MonoFont }; + logCard.Controls.Add(logTextBox); - var buttonPanel = new FlowLayoutPanel { Dock = DockStyle.Bottom, Height = 40, Padding = new Padding(8) }; - var refreshLogsButton = new Button { Text = "Refresh", AutoSize = true }; - var openFolderButton = new Button { Text = "Open Folder", AutoSize = true }; - - refreshLogsButton.Click += async (_, _) => await RefreshLogsAsync(); - openFolderButton.Click += (_, _) => OpenFolderFor(TryLoadSettings()?.LogPath); - - buttonPanel.Controls.Add(refreshLogsButton); - buttonPanel.Controls.Add(openFolderButton); - - page.Controls.Add(logTextBox); - page.Controls.Add(buttonPanel); - page.Enter += async (_, _) => await RefreshLogsAsync(); + page.Controls.Add(logCard); + page.Controls.Add(toolbar); return page; } @@ -480,9 +813,18 @@ private async Task RefreshLogsAsync() // Advanced // --------------------------------------------------------------- - private TabPage BuildAdvancedTab() + private Panel BuildAdvancedPage() { - var page = new TabPage("Advanced"); + var page = new Panel { BackColor = Theme.WindowBackground }; + + var card = new CardPanel { Dock = DockStyle.Top, Height = 260 }; + var cardLayout = new TableLayoutPanel { Dock = DockStyle.Fill, ColumnCount = 1, RowCount = 3 }; + cardLayout.RowStyles.Add(new RowStyle(SizeType.AutoSize)); + cardLayout.RowStyles.Add(new RowStyle(SizeType.Percent, 100)); + cardLayout.RowStyles.Add(new RowStyle(SizeType.AutoSize)); + + var sectionTitle = new Label { Text = "Effective command line", Font = Theme.CardTitleFont, ForeColor = Theme.Text, AutoSize = true, Margin = new Padding(0, 0, 0, 8) }; + cardLayout.Controls.Add(sectionTitle, 0, 0); advancedTextBox = new TextBox { @@ -491,13 +833,23 @@ private TabPage BuildAdvancedTab() ReadOnly = true, ScrollBars = ScrollBars.Both, WordWrap = false, - Font = new Font(FontFamily.GenericMonospace, 9f) + BackColor = Theme.WindowBackground, + BorderStyle = BorderStyle.FixedSingle, + Font = Theme.MonoFont }; + cardLayout.Controls.Add(advancedTextBox, 0, 1); + + advancedStatusLabel = new Label { Text = "", ForeColor = Theme.Muted, AutoSize = true, Margin = new Padding(0, 8, 0, 0) }; + cardLayout.Controls.Add(advancedStatusLabel, 0, 2); + + card.Controls.Add(cardLayout); - var buttonPanel = new FlowLayoutPanel { Dock = DockStyle.Bottom, Height = 40, Padding = new Padding(8) }; - var repairButton = new Button { Text = "Repair Package", AutoSize = true }; - var exportButton = new Button { Text = "Export Diagnostics", AutoSize = true }; - var validateButton = new Button { Text = "Validate Environment", AutoSize = true }; + var buttonPanel = new FlowLayoutPanel { Dock = DockStyle.Top, Height = 56, Padding = new Padding(0, 16, 0, 0) }; + var repairButton = CreatePrimaryButton(Glyphs.Repair, "Repair Package", Theme.Accent); + var exportButton = CreateSecondaryButton("Export Diagnostics"); + var validateButton = CreateSecondaryButton("Validate Environment"); + repairButton.Margin = new Padding(0, 0, 10, 0); + exportButton.Margin = new Padding(0, 0, 10, 0); repairButton.Click += async (_, _) => await RunAdvancedActionAsync("Repair", () => controller.Repair()); validateButton.Click += async (_, _) => await RunAdvancedActionAsync("Validate Environment", () => controller.ValidateEnvironment()); @@ -507,9 +859,8 @@ private TabPage BuildAdvancedTab() buttonPanel.Controls.Add(exportButton); buttonPanel.Controls.Add(validateButton); - page.Controls.Add(advancedTextBox); page.Controls.Add(buttonPanel); - page.Enter += (_, _) => RefreshAdvancedInfo(); + page.Controls.Add(card); return page; } @@ -547,10 +898,14 @@ private async Task RunAdvancedActionAsync(string title, Func action) try { var output = await Task.Run(action); + advancedStatusLabel.ForeColor = Theme.Success; + advancedStatusLabel.Text = $"{title}: completed."; MessageBox.Show(this, string.IsNullOrWhiteSpace(output) ? "Completed." : output, title, MessageBoxButtons.OK, MessageBoxIcon.Information); } catch (Exception ex) { + advancedStatusLabel.ForeColor = Theme.Danger; + advancedStatusLabel.Text = $"{title}: failed."; MessageBox.Show(this, ex.Message, title, MessageBoxButtons.OK, MessageBoxIcon.Error); } finally @@ -565,12 +920,113 @@ private async Task ExportDiagnosticsAsync() try { var zipPath = await Task.Run(() => controller.ExportDiagnostics(stamp)); + advancedStatusLabel.ForeColor = Theme.Success; + advancedStatusLabel.Text = "Export Diagnostics: completed."; MessageBox.Show(this, $"Diagnostics exported to:{Environment.NewLine}{zipPath}", "Export Diagnostics", MessageBoxButtons.OK, MessageBoxIcon.Information); OpenFolderFor(zipPath); } catch (Exception ex) { + advancedStatusLabel.ForeColor = Theme.Danger; + advancedStatusLabel.Text = "Export Diagnostics: failed."; MessageBox.Show(this, ex.Message, "Export Diagnostics", MessageBoxButtons.OK, MessageBoxIcon.Error); } } } + +/// +/// Flat nav-rail button: glyph + label, with a 4px accent left-bar and +/// tinted background when selected, subtle hover highlight otherwise. +/// +internal sealed class NavButton : Panel +{ + public string PageName { get; } + private readonly string glyph; + private readonly Label glyphLabel; + private readonly Label textLabel; + private bool selected; + private bool hovered; + + public bool Selected + { + get => selected; + set + { + selected = value; + ApplyState(); + } + } + + public NavButton(string pageName, string glyph) + { + PageName = pageName; + this.glyph = glyph; + + Dock = DockStyle.Top; + Height = 40; + Cursor = Cursors.Hand; + SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.OptimizedDoubleBuffer, true); + + glyphLabel = new Label + { + Text = glyph, + Font = Theme.IconFont(14f), + AutoSize = false, + Size = new Size(36, 40), + TextAlign = ContentAlignment.MiddleCenter, + Location = new Point(10, 0), + BackColor = Color.Transparent + }; + textLabel = new Label + { + Text = pageName, + Font = Theme.NavFont, + AutoSize = false, + Size = new Size(150, 40), + TextAlign = ContentAlignment.MiddleLeft, + Location = new Point(44, 0), + BackColor = Color.Transparent + }; + + Controls.Add(glyphLabel); + Controls.Add(textLabel); + + foreach (var c in new Control[] { this, glyphLabel, textLabel }) + { + c.Click += (_, _) => OnClick(EventArgs.Empty); + c.MouseEnter += (_, _) => { hovered = true; ApplyState(); }; + c.MouseLeave += (_, _) => { hovered = false; ApplyState(); }; + } + + ApplyState(); + } + + private void ApplyState() + { + if (selected) + { + BackColor = Theme.AccentTint; + glyphLabel.ForeColor = Theme.Accent; + textLabel.ForeColor = Theme.Accent; + textLabel.Font = Theme.SemiboldFont; + } + else + { + BackColor = hovered ? Theme.HoverTint : Color.Transparent; + glyphLabel.ForeColor = Theme.Muted; + textLabel.ForeColor = Theme.Muted; + textLabel.Font = Theme.NavFont; + } + Invalidate(); + } + + protected override void OnPaint(PaintEventArgs e) + { + base.OnPaint(e); + if (selected) + { + using var brush = new SolidBrush(Theme.Accent); + e.Graphics.FillRectangle(brush, 0, 0, 4, Height); + } + } +} diff --git a/packaging/windows/manager/src/OVMS.Manager/Theme.cs b/packaging/windows/manager/src/OVMS.Manager/Theme.cs new file mode 100644 index 0000000000..7d9949c403 --- /dev/null +++ b/packaging/windows/manager/src/OVMS.Manager/Theme.cs @@ -0,0 +1,91 @@ +using System.Drawing; + +namespace OVMS.Manager; + +/// +/// Centralized color/font tokens for the Manager's light theme. +/// +internal static class Theme +{ + public static readonly Color WindowBackground = ColorTranslator.FromHtml("#F3F4F6"); + public static readonly Color Surface = ColorTranslator.FromHtml("#FFFFFF"); + public static readonly Color Rail = ColorTranslator.FromHtml("#F8F7FC"); + public static readonly Color Accent = ColorTranslator.FromHtml("#6C2BD9"); + public static readonly Color AccentHover = ColorTranslator.FromHtml("#5B21B6"); + public static readonly Color Text = ColorTranslator.FromHtml("#1F2937"); + public static readonly Color Muted = ColorTranslator.FromHtml("#6B7280"); + public static readonly Color Border = ColorTranslator.FromHtml("#E5E7EB"); + public static readonly Color Success = ColorTranslator.FromHtml("#16A34A"); + public static readonly Color Danger = ColorTranslator.FromHtml("#DC2626"); + public static readonly Color Warning = ColorTranslator.FromHtml("#D97706"); + + public static readonly Color AccentTint = ColorTranslator.FromHtml("#EFE6FB"); + public static readonly Color HoverTint = ColorTranslator.FromHtml("#F1F0F4"); + + public static readonly Color LogBackground = ColorTranslator.FromHtml("#1E1E1E"); + public static readonly Color LogForeground = ColorTranslator.FromHtml("#D4D4D4"); + + public static Font BaseFont { get; } = new("Segoe UI", 9.75f); + public static Font SemiboldFont { get; } = new("Segoe UI Semibold", 9.75f); + public static Font PageTitleFont { get; } = new("Segoe UI Semibold", 16f); + public static Font CardTitleFont { get; } = new("Segoe UI Semibold", 9.75f); + public static Font CardValueFont { get; } = new("Segoe UI Semibold", 13f); + public static Font NavFont { get; } = new("Segoe UI", 10f); + public static Font MonoFont { get; } = new("Consolas", 9.5f); + + private static Font? iconFont; + + /// + /// Returns a font for rendering Segoe Fluent/MDL2 glyphs. If neither + /// family is installed, GDI silently substitutes a fallback font, so + /// this never throws -- worst case the glyph renders as a box/blank. + /// + public static Font IconFont(float size = 13f) + { + if (iconFont != null && Math.Abs(iconFont.Size - size) < 0.01f) + { + return iconFont; + } + + Font font; + try + { + font = new Font("Segoe Fluent Icons", size, FontStyle.Regular, GraphicsUnit.Point); + if (!string.Equals(font.Name, "Segoe Fluent Icons", StringComparison.OrdinalIgnoreCase)) + { + font.Dispose(); + font = new Font("Segoe MDL2 Assets", size, FontStyle.Regular, GraphicsUnit.Point); + } + } + catch + { + font = new Font("Segoe MDL2 Assets", size, FontStyle.Regular, GraphicsUnit.Point); + } + + iconFont = font; + return iconFont; + } +} + +/// +/// Segoe Fluent / MDL2 Assets glyph code points used throughout the UI. +/// Written as \uXXXX escapes (Private Use Area) to avoid any source-encoding +/// ambiguity. +/// +internal static class Glyphs +{ + public const string Dashboard = ""; // Home + public const string Settings = ""; // Settings gear + public const string Logs = ""; // Diagnostic + public const string Advanced = ""; // Repair/tools (Build) + + public const string Play = ""; // Play + public const string Stop = ""; // Stop + public const string Restart = ""; // Sync/restart + public const string Refresh = ""; // Refresh + public const string OpenFolder = ""; // OpenFolderHorizontal + public const string Repair = ""; // Repair/build tools + public const string Save = ""; // Save + public const string Health = ""; // HealthSolid + public const string Export = ""; // Export +} From 60ae672f4adb998e2833dadca7f5a742a55df9bf Mon Sep 17 00:00:00 2001 From: exzile Date: Tue, 30 Jun 2026 18:03:46 -0400 Subject: [PATCH 4/9] Fix Manager layout and build out Settings/Logs/Advanced pages Layout fixes: - Nav rail buttons now render (NavButton no longer docks inside the FlowLayoutPanel; rail uses a Fill nav list between header and pill). - Action buttons show glyphs (Start/Stop/Restart) and no longer clip. - Wider status cards so values aren't truncated; larger default window. Page build-out: - Settings: Server + Startup/tray cards, Browse buttons for paths, Save/Reset with inline status and a non-local bind-address warning. - Logs: toolbar (refresh/open/clear), log path, auto-scroll toggle, line count + last-refreshed, "(log file not found)" handling. - Advanced: Environment card (dirs, version, command line + Copy) and Maintenance card (Repair / Validate / Export Diagnostics). Co-Authored-By: Claude Opus 4.8 Signed-off-by: exzile --- .../manager/src/OVMS.Manager/MainForm.cs | 699 +++++++++++++++--- 1 file changed, 608 insertions(+), 91 deletions(-) diff --git a/packaging/windows/manager/src/OVMS.Manager/MainForm.cs b/packaging/windows/manager/src/OVMS.Manager/MainForm.cs index e3ac0b186a..d9e188aa0d 100644 --- a/packaging/windows/manager/src/OVMS.Manager/MainForm.cs +++ b/packaging/windows/manager/src/OVMS.Manager/MainForm.cs @@ -61,9 +61,13 @@ internal sealed class MainForm : Form private ComboBox runModeInput = null!; private CheckBox showTrayCheckBox = null!; private CheckBox startAtLoginCheckBox = null!; + private Label settingsStatusLabel = null!; // Logs controls private TextBox logTextBox = null!; + private Label logPathLabel = null!; + private CheckBox autoScrollCheckBox = null!; + private Label logStatusLabel = null!; // Advanced controls private TextBox advancedTextBox = null!; @@ -74,8 +78,8 @@ public MainForm(OvmsController controller) this.controller = controller; Text = "OpenVINO Model Server Manager"; - MinimumSize = new Size(860, 600); - Size = new Size(960, 640); + MinimumSize = new Size(1020, 680); + Size = new Size(1220, 780); StartPosition = FormStartPosition.CenterScreen; BackColor = Theme.WindowBackground; Font = Theme.BaseFont; @@ -167,11 +171,13 @@ private void BuildShell() var navFlow = new FlowLayoutPanel { - Dock = DockStyle.Top, + Dock = DockStyle.Fill, FlowDirection = FlowDirection.TopDown, WrapContents = false, - AutoSize = true, - Top = 76 + AutoSize = false, + AutoScroll = true, + BackColor = Theme.Rail, + Padding = new Padding(0, 8, 0, 0) }; navFlow.Controls.Add(CreateNavButton("Dashboard", Glyphs.Dashboard)); navFlow.Controls.Add(CreateNavButton("Settings", Glyphs.Settings)); @@ -186,6 +192,18 @@ private void BuildShell() pillInner.Controls.Add(railStatusText); statusPill.Controls.Add(pillInner); + // Dock carving order matters: WinForms carves docked children from the + // LAST-added control backwards. We add navFlow (Fill) FIRST so it is + // carved first and would normally claim the whole client area; but + // controls added AFTER it (statusPill=Bottom, headerBlock=Top) are + // carved out of navRail's bounds BEFORE navFlow's Fill is resolved, + // because Fill is always resolved last regardless of add order for + // DockStyle.Fill vs the other dock styles -- WinForms processes + // Top/Bottom/Left/Right docked siblings first (in reverse add order) + // and only then gives the remaining space to the Fill control. So the + // actual requirement is just that statusPill/headerBlock are added + // AFTER navFlow so they end up with a higher z-order and get their + // Top/Bottom slices carved out of the rail before Fill claims the rest. navRail.Controls.Add(navFlow); navRail.Controls.Add(statusPill); navRail.Controls.Add(headerBlock); @@ -204,7 +222,7 @@ private void BuildShell() contentHost = new Panel { Dock = DockStyle.Fill, BackColor = Theme.WindowBackground, Padding = new Padding(24, 12, 24, 24) }; SetDoubleBuffered(contentHost); - pages["Dashboard"] = BuildDashboardPage(); + pages["Dashboard"] = BuildResponsiveDashboardPage(); pages["Settings"] = BuildSettingsPage(); pages["Logs"] = BuildLogsPage(); pages["Advanced"] = BuildAdvancedPage(); @@ -357,7 +375,7 @@ private static Button CreatePrimaryButton(string glyph, string text, Color fillC { var button = new Button { - Text = " " + text, + Text = string.IsNullOrEmpty(glyph) ? text : glyph + " " + text, Font = Theme.NavFont, FlatStyle = FlatStyle.Flat, ForeColor = Color.White, @@ -409,6 +427,297 @@ private static CardPanel CreateCard(int width, int height) // Dashboard // --------------------------------------------------------------- + private Panel BuildResponsiveDashboardPage() + { + var page = new Panel { BackColor = Theme.WindowBackground, AutoScroll = true }; + + var dashboardStack = new TableLayoutPanel + { + Location = new Point(0, 0), + AutoSize = false, + ColumnCount = 1, + RowCount = 2, + Height = 656, + Padding = new Padding(0), + Margin = new Padding(0) + }; + dashboardStack.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100)); + dashboardStack.RowStyles.Add(new RowStyle(SizeType.Absolute, 456)); + dashboardStack.RowStyles.Add(new RowStyle(SizeType.Absolute, 200)); + + var metricGrid = new TableLayoutPanel + { + Dock = DockStyle.Fill, + AutoSize = false, + ColumnCount = 2, + RowCount = 4, + Padding = new Padding(0), + Margin = new Padding(0) + }; + for (var i = 0; i < 2; i++) + { + metricGrid.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50)); + } + + for (var i = 0; i < 4; i++) + { + metricGrid.RowStyles.Add(new RowStyle(SizeType.Absolute, 112)); + } + + startButton = CreatePrimaryButton("", "Start", Theme.Success); + stopButton = CreatePrimaryButton("", "Stop", Theme.Danger); + restartButton = CreatePrimaryButton("", "Restart", Theme.Accent); + + foreach (var b in new[] { startButton, stopButton, restartButton }) + { + b.AutoSize = false; + b.Anchor = AnchorStyles.None; + b.Margin = new Padding(8, 0, 0, 0); + b.MinimumSize = new Size(108, 42); + } + + startButton.Click += async (_, _) => await RunControlActionAsync("Start", controller.Start); + stopButton.Click += async (_, _) => await RunControlActionAsync("Stop", controller.Stop); + restartButton.Click += async (_, _) => await RunControlActionAsync("Restart", controller.Restart); + + (Label dot, Label value) AddControlStatusCard(int column, int row) + { + var card = new CardPanel + { + Dock = DockStyle.Fill, + Margin = new Padding(0, 0, 16, 16), + Padding = new Padding(18, 14, 18, 14) + }; + + var cardLayout = new TableLayoutPanel + { + Dock = DockStyle.Fill, + ColumnCount = 2, + RowCount = 1, + BackColor = Color.Transparent, + Margin = new Padding(0), + Padding = new Padding(0) + }; + cardLayout.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100)); + cardLayout.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 248)); + + var statusLayout = new TableLayoutPanel + { + Dock = DockStyle.Fill, + ColumnCount = 2, + RowCount = 2, + BackColor = Color.Transparent, + Margin = new Padding(0), + Padding = new Padding(0) + }; + statusLayout.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 20)); + statusLayout.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100)); + statusLayout.RowStyles.Add(new RowStyle(SizeType.Absolute, 28)); + statusLayout.RowStyles.Add(new RowStyle(SizeType.Percent, 100)); + + var titleLabel = new Label + { + Text = "Status", + Font = Theme.CardTitleFont, + ForeColor = Theme.Muted, + AutoEllipsis = true, + Dock = DockStyle.Fill, + TextAlign = ContentAlignment.MiddleLeft, + Margin = new Padding(0) + }; + var dotLabel = new Label + { + Text = "\u25CF", + Font = new Font("Segoe UI", 10.5f), + ForeColor = Theme.Muted, + Dock = DockStyle.Fill, + TextAlign = ContentAlignment.MiddleLeft, + Margin = new Padding(0, 5, 0, 0) + }; + var valueLabel = new Label + { + Text = "-", + Font = Theme.CardValueFont, + ForeColor = Theme.Text, + AutoEllipsis = true, + Dock = DockStyle.Fill, + TextAlign = ContentAlignment.MiddleLeft, + Margin = new Padding(0, 2, 0, 0) + }; + + statusLayout.Controls.Add(titleLabel, 0, 0); + statusLayout.SetColumnSpan(titleLabel, 2); + statusLayout.Controls.Add(dotLabel, 0, 1); + statusLayout.Controls.Add(valueLabel, 1, 1); + + var actionLayout = new FlowLayoutPanel + { + Dock = DockStyle.Fill, + FlowDirection = FlowDirection.LeftToRight, + WrapContents = false, + BackColor = Color.Transparent, + Margin = new Padding(0), + Padding = new Padding(0, 19, 0, 0) + }; + actionLayout.Controls.Add(startButton); + actionLayout.Controls.Add(stopButton); + actionLayout.Controls.Add(restartButton); + + cardLayout.Controls.Add(statusLayout, 0, 0); + cardLayout.Controls.Add(actionLayout, 1, 0); + card.Controls.Add(cardLayout); + metricGrid.Controls.Add(card, column, row); + return (dotLabel, valueLabel); + } + + (Label dot, Label value) AddStatusCard(string title, string initialValue, bool withDot, int column, int row) + { + var card = new CardPanel + { + Dock = DockStyle.Fill, + Margin = new Padding(0, 0, 16, 16), + Padding = new Padding(18, 14, 18, 14) + }; + + var cardLayout = new TableLayoutPanel + { + Dock = DockStyle.Fill, + ColumnCount = withDot ? 2 : 1, + RowCount = 2, + BackColor = Color.Transparent, + Margin = new Padding(0), + Padding = new Padding(0) + }; + if (withDot) + { + cardLayout.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 20)); + cardLayout.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100)); + } + else + { + cardLayout.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100)); + } + cardLayout.RowStyles.Add(new RowStyle(SizeType.Absolute, 28)); + cardLayout.RowStyles.Add(new RowStyle(SizeType.Percent, 100)); + + var titleLabel = new Label + { + Text = title, + Font = Theme.CardTitleFont, + ForeColor = Theme.Muted, + AutoEllipsis = true, + Dock = DockStyle.Fill, + TextAlign = ContentAlignment.MiddleLeft, + Margin = new Padding(0) + }; + var valueLabel = new Label + { + Text = initialValue, + Font = Theme.CardValueFont, + ForeColor = Theme.Text, + AutoEllipsis = true, + Dock = DockStyle.Fill, + TextAlign = ContentAlignment.MiddleLeft, + Margin = new Padding(0, 2, 0, 0) + }; + + Label? dotLabel = null; + if (withDot) + { + dotLabel = new Label + { + Text = "\u25CF", + Font = new Font("Segoe UI", 10.5f), + ForeColor = Theme.Muted, + Dock = DockStyle.Fill, + TextAlign = ContentAlignment.MiddleLeft, + Margin = new Padding(0, 5, 0, 0) + }; + cardLayout.Controls.Add(titleLabel, 0, 0); + cardLayout.SetColumnSpan(titleLabel, 2); + cardLayout.Controls.Add(dotLabel, 0, 1); + cardLayout.Controls.Add(valueLabel, 1, 1); + } + else + { + cardLayout.Controls.Add(titleLabel, 0, 0); + cardLayout.Controls.Add(valueLabel, 0, 1); + } + + card.Controls.Add(cardLayout); + metricGrid.Controls.Add(card, column, row); + return (dotLabel!, valueLabel); + } + + (statusDotLabel, statusValueLabel) = AddControlStatusCard(0, 0); + (_, restUrlValueLabel) = AddStatusCard("REST endpoint", "-", withDot: false, 1, 0); + (_, grpcValueLabel) = AddStatusCard("gRPC port", "-", withDot: false, 0, 1); + (_, modelsValueLabel) = AddStatusCard("Models served", "-", withDot: false, 1, 1); + (healthDotLabel, healthValueLabel) = AddStatusCard("Health", "-", withDot: true, 0, 2); + (_, variantValueLabel) = AddStatusCard("Package variant", "-", withDot: false, 1, 2); + (_, runModeValueLabel) = AddStatusCard("Runtime mode", "-", withDot: false, 0, 3); + + var actionsCard = new CardPanel { Dock = DockStyle.Fill, Margin = new Padding(0, 10, 0, 0), Padding = new Padding(14) }; + var actionsLayout = new TableLayoutPanel + { + Dock = DockStyle.Fill, + ColumnCount = 3, + RowCount = 2, + Margin = new Padding(0), + Padding = new Padding(0) + }; + for (var i = 0; i < 3; i++) + { + actionsLayout.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 33.333f)); + } + actionsLayout.RowStyles.Add(new RowStyle(SizeType.Percent, 50)); + actionsLayout.RowStyles.Add(new RowStyle(SizeType.Percent, 50)); + + var openLogsButton = CreateSecondaryButton("Open Logs"); + var openModelFolderButton = CreateSecondaryButton("Open Model Folder"); + + foreach (var b in new[] { openLogsButton, openModelFolderButton }) + { + b.AutoSize = false; + b.Anchor = AnchorStyles.None; + b.Margin = new Padding(0, 0, 10, 10); + b.MinimumSize = new Size(120, 48); + } + + openLogsButton.Click += (_, _) => OpenFolderFor(TryLoadSettings()?.LogPath); + openModelFolderButton.Click += (_, _) => OpenFolder(TryLoadSettings()?.ModelRepositoryPath); + + actionsLayout.Controls.Add(openLogsButton, 0, 0); + actionsLayout.Controls.Add(openModelFolderButton, 1, 0); + actionsLayout.SetColumnSpan(openModelFolderButton, 2); + actionsCard.Controls.Add(actionsLayout); + + dashboardStack.Controls.Add(metricGrid, 0, 0); + dashboardStack.Controls.Add(actionsCard, 0, 1); + page.Controls.Add(dashboardStack); + + void SizeActionButtons() + { + foreach (var button in new[] { startButton, stopButton, restartButton, openLogsButton, openModelFolderButton }) + { + var preferred = TextRenderer.MeasureText(button.Text, button.Font).Width + 72; + button.Size = new Size(Math.Clamp(preferred, 120, 280), 52); + } + } + + void ResizeDashboard() + { + var availableWidth = ClientSize.Width - navRail.Width - contentHost.Padding.Horizontal - 28; + dashboardStack.Width = Math.Max(560, availableWidth); + SizeActionButtons(); + } + + page.Resize += (_, _) => ResizeDashboard(); + Resize += (_, _) => ResizeDashboard(); + ResizeDashboard(); + return page; + } + private Panel BuildDashboardPage() { var page = new Panel { BackColor = Theme.WindowBackground }; @@ -424,10 +733,10 @@ private Panel BuildDashboardPage() (Label dot, Label value) AddStatusCard(string title, string initialValue, bool withDot) { - var card = CreateCard(220, 92); + var card = CreateCard(250, 96); var titleLabel = new Label { Text = title, Font = Theme.CardTitleFont, ForeColor = Theme.Muted, AutoSize = true, Location = new Point(16, 14) }; Label? dotLabel = null; - var valueLabel = new Label { Text = initialValue, Font = Theme.CardValueFont, ForeColor = Theme.Text, AutoSize = true, Location = new Point(withDot ? 32 : 16, 42) }; + var valueLabel = new Label { Text = initialValue, Font = Theme.CardValueFont, ForeColor = Theme.Text, AutoSize = true, Location = new Point(withDot ? 34 : 16, 46) }; if (withDot) { dotLabel = new Label { Text = "●", Font = new Font("Segoe UI", 11f), ForeColor = Theme.Muted, AutoSize = true, Location = new Point(16, 44) }; @@ -447,12 +756,12 @@ private Panel BuildDashboardPage() (_, variantValueLabel) = AddStatusCard("Package variant", "-", withDot: false); (_, runModeValueLabel) = AddStatusCard("Runtime mode", "-", withDot: false); - var actionsCard = new CardPanel { Dock = DockStyle.Top, Height = 76, Margin = new Padding(0, 8, 0, 0) }; - var actionsFlow = new FlowLayoutPanel { Dock = DockStyle.Fill, FlowDirection = FlowDirection.LeftToRight, WrapContents = true, Padding = new Padding(4) }; + var actionsCard = new CardPanel { Dock = DockStyle.Top, Height = 84, Margin = new Padding(0, 8, 0, 0) }; + var actionsFlow = new FlowLayoutPanel { Dock = DockStyle.Fill, FlowDirection = FlowDirection.LeftToRight, WrapContents = false, AutoSize = false, AutoScroll = true, Padding = new Padding(12, 10, 12, 10) }; - startButton = CreatePrimaryButton(Glyphs.Play, "Start", Theme.Success); - stopButton = CreatePrimaryButton(Glyphs.Stop, "Stop", Theme.Danger); - restartButton = CreatePrimaryButton(Glyphs.Restart, "Restart", Theme.Accent); + startButton = CreatePrimaryButton("▶", "Start", Theme.Success); + stopButton = CreatePrimaryButton("■", "Stop", Theme.Danger); + restartButton = CreatePrimaryButton("↻", "Restart", Theme.Accent); var openLogsButton = CreateSecondaryButton("Open Logs"); var openModelFolderButton = CreateSecondaryButton("Open Model Folder"); @@ -513,6 +822,9 @@ public async Task RefreshDashboardAsync() if (settings is null) { statusValueLabel.Text = "Settings unavailable"; + startButton.Visible = false; + stopButton.Visible = false; + restartButton.Visible = false; return; } @@ -522,6 +834,9 @@ public async Task RefreshDashboardAsync() railStatusDot.ForeColor = runtimeStatus.Running ? Theme.Success : Theme.Muted; railStatusText.Text = runtimeStatus.Running ? "Running" : "Stopped"; railStatusText.ForeColor = runtimeStatus.Running ? Theme.Text : Theme.Muted; + startButton.Visible = !runtimeStatus.Running; + stopButton.Visible = runtimeStatus.Running; + restartButton.Visible = runtimeStatus.Running; runModeValueLabel.Text = settings.RunMode; restUrlValueLabel.Text = $"{settings.BindAddress}:{settings.RestPort}"; @@ -572,76 +887,186 @@ private Panel BuildSettingsPage() { var page = new Panel { BackColor = Theme.WindowBackground, AutoScroll = true }; - var card = new CardPanel { Dock = DockStyle.Top, Height = 430 }; - var cardLayout = new TableLayoutPanel - { - Dock = DockStyle.Fill, - ColumnCount = 2, - AutoSize = false, - Padding = new Padding(4, 4, 4, 4) - }; - cardLayout.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize)); - cardLayout.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100)); + var serverCard = CreateTitledCard("Server", 320); + var serverLayout = CreateSettingsTable(); - var sectionTitle = new Label { Text = "Server settings", Font = Theme.CardTitleFont, ForeColor = Theme.Text, AutoSize = true, Margin = new Padding(0, 0, 0, 12) }; - cardLayout.Controls.Add(sectionTitle, 0, 0); - cardLayout.SetColumnSpan(sectionTitle, 2); + var row = 0; + AddSettingsRow(serverLayout, "REST port:", restPortInput = new NumericUpDown { Minimum = 1, Maximum = 65535, Width = 120, Margin = new Padding(3, 6, 3, 3) }, row++); + AddSettingsRow(serverLayout, "gRPC port (0 = disabled):", grpcPortInput = new NumericUpDown { Minimum = 0, Maximum = 65535, Width = 120, Margin = new Padding(3, 6, 3, 3) }, row++); + AddSettingsRow(serverLayout, "Bind address:", bindAddressInput = new TextBox { Width = 240, Margin = new Padding(3, 6, 3, 3) }, row++); - void AddLabel(string text, int row) - { - cardLayout.Controls.Add(new Label { Text = text, AutoSize = true, ForeColor = Theme.Text, Margin = new Padding(3, 10, 16, 3) }, 0, row); - } - - var row = 1; - AddLabel("REST port:", row); - restPortInput = new NumericUpDown { Minimum = 1, Maximum = 65535, Width = 120, Margin = new Padding(3, 6, 3, 3) }; - cardLayout.Controls.Add(restPortInput, 1, row++); - - AddLabel("gRPC port (0 = disabled):", row); - grpcPortInput = new NumericUpDown { Minimum = 0, Maximum = 65535, Width = 120, Margin = new Padding(3, 6, 3, 3) }; - cardLayout.Controls.Add(grpcPortInput, 1, row++); - - AddLabel("Bind address:", row); - bindAddressInput = new TextBox { Width = 240, Margin = new Padding(3, 6, 3, 3) }; - cardLayout.Controls.Add(bindAddressInput, 1, row++); - - AddLabel("Log level:", row); logLevelInput = new ComboBox { DropDownStyle = ComboBoxStyle.DropDownList, Width = 140, Margin = new Padding(3, 6, 3, 3) }; logLevelInput.Items.AddRange(new object[] { "ERROR", "WARNING", "INFO", "DEBUG", "TRACE" }); - cardLayout.Controls.Add(logLevelInput, 1, row++); + AddSettingsRow(serverLayout, "Log level:", logLevelInput, row++); + + logPathInput = new TextBox { Width = 360, Margin = new Padding(3, 6, 3, 3) }; + var browseLogButton = CreateSecondaryButton("Browse..."); + browseLogButton.Margin = new Padding(6, 3, 3, 3); + browseLogButton.Click += (_, _) => + { + using var dialog = new SaveFileDialog + { + Title = "Select log file", + CheckFileExists = false, + OverwritePrompt = false, + FileName = Path.GetFileName(logPathInput.Text), + InitialDirectory = SafeDirectoryName(logPathInput.Text), + Filter = "Log files (*.log)|*.log|All files (*.*)|*.*" + }; + if (dialog.ShowDialog(this) == DialogResult.OK) + { + logPathInput.Text = dialog.FileName; + } + }; + AddSettingsRowWithButton(serverLayout, "Log path:", logPathInput, browseLogButton, row++); + + modelRepoInput = new TextBox { Width = 360, Margin = new Padding(3, 6, 3, 3) }; + var browseModelRepoButton = CreateSecondaryButton("Browse..."); + browseModelRepoButton.Margin = new Padding(6, 3, 3, 3); + browseModelRepoButton.Click += (_, _) => + { + using var dialog = new FolderBrowserDialog + { + Description = "Select model repository folder", + SelectedPath = Directory.Exists(modelRepoInput.Text) ? modelRepoInput.Text : "" + }; + if (dialog.ShowDialog(this) == DialogResult.OK) + { + modelRepoInput.Text = dialog.SelectedPath; + } + }; + AddSettingsRowWithButton(serverLayout, "Model repository path:", modelRepoInput, browseModelRepoButton, row++); - AddLabel("Log path:", row); - logPathInput = new TextBox { Width = 420, Margin = new Padding(3, 6, 3, 3) }; - cardLayout.Controls.Add(logPathInput, 1, row++); + serverCard.Controls.Add(serverLayout); - AddLabel("Model repository path:", row); - modelRepoInput = new TextBox { Width = 420, Margin = new Padding(3, 6, 3, 3) }; - cardLayout.Controls.Add(modelRepoInput, 1, row++); + var startupCard = CreateTitledCard("Startup & tray", 200); + var startupLayout = CreateSettingsTable(); - AddLabel("Startup mode:", row); + row = 0; runModeInput = new ComboBox { DropDownStyle = ComboBoxStyle.DropDownList, Width = 180, Margin = new Padding(3, 6, 3, 3) }; runModeInput.Items.AddRange(new object[] { "user-login", "service", "manual" }); - cardLayout.Controls.Add(runModeInput, 1, row++); + AddSettingsRow(startupLayout, "Startup mode:", runModeInput, row++); - AddLabel("Show tray icon:", row); showTrayCheckBox = new CheckBox { Margin = new Padding(3, 10, 3, 3) }; - cardLayout.Controls.Add(showTrayCheckBox, 1, row++); + AddSettingsRow(startupLayout, "Show tray icon:", showTrayCheckBox, row++); - AddLabel("Start at login:", row); startAtLoginCheckBox = new CheckBox { Margin = new Padding(3, 10, 3, 3) }; - cardLayout.Controls.Add(startAtLoginCheckBox, 1, row++); + AddSettingsRow(startupLayout, "Start at login:", startAtLoginCheckBox, row++); + + startupCard.Controls.Add(startupLayout); + + var footer = new FlowLayoutPanel + { + Dock = DockStyle.Top, + Height = 56, + FlowDirection = FlowDirection.LeftToRight, + WrapContents = false, + Padding = new Padding(0, 14, 0, 0), + Margin = new Padding(0) + }; + var saveButton = CreatePrimaryButton("", "Save", Theme.Accent); + var resetButton = CreateSecondaryButton("Reset"); + saveButton.Margin = new Padding(0, 0, 10, 0); + resetButton.Margin = new Padding(0, 0, 16, 0); + settingsStatusLabel = new Label + { + Text = "", + AutoSize = true, + Font = Theme.SemiboldFont, + Margin = new Padding(0, 10, 0, 0) + }; - var saveButton = CreatePrimaryButton(Glyphs.Save, "Save", Theme.Accent); - saveButton.Margin = new Padding(3, 18, 3, 3); saveButton.Click += async (_, _) => await SaveSettingsAsync(); - cardLayout.Controls.Add(new Label(), 0, row); - cardLayout.Controls.Add(saveButton, 1, row++); + resetButton.Click += (_, _) => + { + LoadSettingsIntoForm(); + settingsStatusLabel.ForeColor = Theme.Muted; + settingsStatusLabel.Text = "Reloaded from disk."; + }; + + footer.Controls.Add(saveButton); + footer.Controls.Add(resetButton); + footer.Controls.Add(settingsStatusLabel); - card.Controls.Add(cardLayout); - page.Controls.Add(card); + // Dock-Top stacking: add bottom-most visual element first so later + // Top-docked controls are carved above it (see BuildShell comment). + page.Controls.Add(footer); + page.Controls.Add(startupCard); + page.Controls.Add(serverCard); return page; } + private static CardPanel CreateTitledCard(string title, int height) + { + var card = new CardPanel { Dock = DockStyle.Top, Height = height, Margin = new Padding(0, 0, 0, 16) }; + var titleLabel = new Label + { + Text = title, + Font = Theme.CardTitleFont, + ForeColor = Theme.Text, + AutoSize = true, + Dock = DockStyle.Top, + Margin = new Padding(0, 0, 0, 12) + }; + card.Controls.Add(titleLabel); + return card; + } + + private static TableLayoutPanel CreateSettingsTable() + { + var table = new TableLayoutPanel + { + Dock = DockStyle.Fill, + ColumnCount = 2, + AutoSize = false, + Padding = new Padding(0, 32, 0, 0) + }; + table.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize)); + table.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100)); + return table; + } + + private static void AddSettingsRow(TableLayoutPanel table, string label, Control field, int row) + { + table.Controls.Add(new Label { Text = label, AutoSize = true, ForeColor = Theme.Text, Margin = new Padding(3, 10, 16, 3) }, 0, row); + table.Controls.Add(field, 1, row); + } + + private static void AddSettingsRowWithButton(TableLayoutPanel table, string label, Control field, Control button, int row) + { + var inline = new FlowLayoutPanel + { + FlowDirection = FlowDirection.LeftToRight, + WrapContents = false, + AutoSize = true, + Margin = new Padding(0) + }; + inline.Controls.Add(field); + inline.Controls.Add(button); + table.Controls.Add(new Label { Text = label, AutoSize = true, ForeColor = Theme.Text, Margin = new Padding(3, 10, 16, 3) }, 0, row); + table.Controls.Add(inline, 1, row); + } + + private static string SafeDirectoryName(string path) + { + try + { + var dir = Path.GetDirectoryName(path); + return string.IsNullOrEmpty(dir) ? "" : dir; + } + catch + { + return ""; + } + } + + private static bool IsLocalBindAddress(string bindAddress) + { + return string.Equals(bindAddress, "127.0.0.1", StringComparison.OrdinalIgnoreCase) + || string.Equals(bindAddress, "localhost", StringComparison.OrdinalIgnoreCase) + || string.Equals(bindAddress, "::1", StringComparison.OrdinalIgnoreCase); + } + private void LoadSettingsIntoForm() { var settings = TryLoadSettings(); @@ -666,12 +1091,16 @@ private async Task SaveSettingsAsync() var current = TryLoadSettings(); if (current is null) { + settingsStatusLabel.ForeColor = Theme.Danger; + settingsStatusLabel.Text = "Error: could not load existing settings."; MessageBox.Show(this, "Could not load existing settings.", "Save", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } if (string.IsNullOrWhiteSpace(bindAddressInput.Text)) { + settingsStatusLabel.ForeColor = Theme.Danger; + settingsStatusLabel.Text = "Error: bind address cannot be empty."; MessageBox.Show(this, "Bind address cannot be empty.", "Save", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } @@ -709,10 +1138,20 @@ private async Task SaveSettingsAsync() } catch (Exception ex) { + settingsStatusLabel.ForeColor = Theme.Danger; + settingsStatusLabel.Text = $"Error: {ex.Message}"; MessageBox.Show(this, ex.Message, "Save", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } + settingsStatusLabel.ForeColor = Theme.Success; + settingsStatusLabel.Text = "Saved."; + if (!IsLocalBindAddress(updated.BindAddress)) + { + settingsStatusLabel.ForeColor = Theme.Warning; + settingsStatusLabel.Text = "Saved. Non-local bind address - server may be reachable from other devices."; + } + if (commandLineAffectingChanged) { var runtimeStatus = await Task.Run(controller.GetRuntimeStatus); @@ -773,13 +1212,40 @@ private Panel BuildLogsPage() var toolbar = new FlowLayoutPanel { Dock = DockStyle.Top, Height = 40, FlowDirection = FlowDirection.LeftToRight, Padding = new Padding(0, 0, 0, 8) }; var refreshLogsButton = CreateIconButton(Glyphs.Refresh, "Refresh"); var openFolderButton = CreateIconButton(Glyphs.OpenFolder, "Open Folder"); + var clearLogsButton = CreateIconButton("✕", "Clear (display only)"); refreshLogsButton.Margin = new Padding(0, 0, 8, 0); + openFolderButton.Margin = new Padding(0, 0, 8, 0); + clearLogsButton.Margin = new Padding(0, 0, 16, 0); + + autoScrollCheckBox = new CheckBox { Text = "Auto-scroll", Checked = true, AutoSize = true, Margin = new Padding(0, 8, 16, 0) }; refreshLogsButton.Click += async (_, _) => await RefreshLogsAsync(); openFolderButton.Click += (_, _) => OpenFolderFor(TryLoadSettings()?.LogPath); + clearLogsButton.Click += (_, _) => + { + logTextBox.Clear(); + logStatusLabel.Text = "Display cleared (file untouched)."; + }; + + logPathLabel = new Label + { + Text = "", + AutoSize = true, + ForeColor = Theme.Muted, + TextAlign = ContentAlignment.MiddleRight, + Anchor = AnchorStyles.Right, + Margin = new Padding(8, 8, 0, 0) + }; toolbar.Controls.Add(refreshLogsButton); toolbar.Controls.Add(openFolderButton); + toolbar.Controls.Add(clearLogsButton); + toolbar.Controls.Add(autoScrollCheckBox); + toolbar.Controls.Add(logPathLabel); + + var statusBar = new Panel { Dock = DockStyle.Bottom, Height = 24, Padding = new Padding(0, 4, 0, 0) }; + logStatusLabel = new Label { Text = "", AutoSize = true, ForeColor = Theme.Muted, Dock = DockStyle.Left }; + statusBar.Controls.Add(logStatusLabel); var logCard = new CardPanel { Dock = DockStyle.Fill, Padding = new Padding(1), CardBackColor = Theme.LogBackground, BorderColor = Theme.LogBackground }; logTextBox = new TextBox @@ -796,17 +1262,35 @@ private Panel BuildLogsPage() }; logCard.Controls.Add(logTextBox); + // Dock-Top stacking: add bottom-most visual element first (see + // BuildShell comment for why this ordering yields correct results). page.Controls.Add(logCard); + page.Controls.Add(statusBar); page.Controls.Add(toolbar); return page; } private async Task RefreshLogsAsync() { + var settings = TryLoadSettings(); + logPathLabel.Text = settings?.LogPath ?? ""; + + if (settings is null || string.IsNullOrEmpty(settings.LogPath) || !File.Exists(settings.LogPath)) + { + logTextBox.Text = "(log file not found)"; + logStatusLabel.Text = $"0 lines - last refreshed {DateTime.Now:T}"; + return; + } + var lines = await Task.Run(() => controller.TailLog(500)); logTextBox.Text = string.Join(Environment.NewLine, lines); - logTextBox.SelectionStart = logTextBox.Text.Length; - logTextBox.ScrollToCaret(); + if (autoScrollCheckBox.Checked) + { + logTextBox.SelectionStart = logTextBox.Text.Length; + logTextBox.ScrollToCaret(); + } + + logStatusLabel.Text = $"{lines.Count} lines - last refreshed {DateTime.Now:T}"; } // --------------------------------------------------------------- @@ -815,16 +1299,12 @@ private async Task RefreshLogsAsync() private Panel BuildAdvancedPage() { - var page = new Panel { BackColor = Theme.WindowBackground }; - - var card = new CardPanel { Dock = DockStyle.Top, Height = 260 }; - var cardLayout = new TableLayoutPanel { Dock = DockStyle.Fill, ColumnCount = 1, RowCount = 3 }; - cardLayout.RowStyles.Add(new RowStyle(SizeType.AutoSize)); - cardLayout.RowStyles.Add(new RowStyle(SizeType.Percent, 100)); - cardLayout.RowStyles.Add(new RowStyle(SizeType.AutoSize)); + var page = new Panel { BackColor = Theme.WindowBackground, AutoScroll = true }; - var sectionTitle = new Label { Text = "Effective command line", Font = Theme.CardTitleFont, ForeColor = Theme.Text, AutoSize = true, Margin = new Padding(0, 0, 0, 8) }; - cardLayout.Controls.Add(sectionTitle, 0, 0); + var envCard = CreateTitledCard("Environment", 260); + var envLayout = new TableLayoutPanel { Dock = DockStyle.Fill, ColumnCount = 1, RowCount = 2, Padding = new Padding(0, 32, 0, 0) }; + envLayout.RowStyles.Add(new RowStyle(SizeType.Percent, 100)); + envLayout.RowStyles.Add(new RowStyle(SizeType.AutoSize)); advancedTextBox = new TextBox { @@ -837,30 +1317,63 @@ private Panel BuildAdvancedPage() BorderStyle = BorderStyle.FixedSingle, Font = Theme.MonoFont }; - cardLayout.Controls.Add(advancedTextBox, 0, 1); + envLayout.Controls.Add(advancedTextBox, 0, 0); - advancedStatusLabel = new Label { Text = "", ForeColor = Theme.Muted, AutoSize = true, Margin = new Padding(0, 8, 0, 0) }; - cardLayout.Controls.Add(advancedStatusLabel, 0, 2); + var copyButton = CreateSecondaryButton("Copy"); + copyButton.Margin = new Padding(0, 8, 0, 0); + copyButton.Click += (_, _) => + { + try + { + var settings = TryLoadSettings(); + var commandLine = settings is null ? "" : controller.EffectiveCommandLine(); + if (!string.IsNullOrEmpty(commandLine)) + { + Clipboard.SetText(commandLine); + } + } + catch + { + // Best effort; clipboard access can fail in restricted environments. + } + }; + envLayout.Controls.Add(copyButton, 0, 1); - card.Controls.Add(cardLayout); + envCard.Controls.Add(envLayout); - var buttonPanel = new FlowLayoutPanel { Dock = DockStyle.Top, Height = 56, Padding = new Padding(0, 16, 0, 0) }; - var repairButton = CreatePrimaryButton(Glyphs.Repair, "Repair Package", Theme.Accent); - var exportButton = CreateSecondaryButton("Export Diagnostics"); + var maintenanceCard = CreateTitledCard("Maintenance", 170); + var buttonPanel = new FlowLayoutPanel { Dock = DockStyle.Top, AutoSize = true, Padding = new Padding(0, 32, 0, 0) }; + var repairButton = CreatePrimaryButton("", "Repair Package", Theme.Accent); var validateButton = CreateSecondaryButton("Validate Environment"); + var exportButton = CreateSecondaryButton("Export Diagnostics"); repairButton.Margin = new Padding(0, 0, 10, 0); - exportButton.Margin = new Padding(0, 0, 10, 0); + validateButton.Margin = new Padding(0, 0, 10, 0); repairButton.Click += async (_, _) => await RunAdvancedActionAsync("Repair", () => controller.Repair()); validateButton.Click += async (_, _) => await RunAdvancedActionAsync("Validate Environment", () => controller.ValidateEnvironment()); exportButton.Click += async (_, _) => await ExportDiagnosticsAsync(); buttonPanel.Controls.Add(repairButton); - buttonPanel.Controls.Add(exportButton); buttonPanel.Controls.Add(validateButton); + buttonPanel.Controls.Add(exportButton); - page.Controls.Add(buttonPanel); - page.Controls.Add(card); + advancedStatusLabel = new Label + { + Text = "", + ForeColor = Theme.Muted, + Font = new Font(Theme.SemiboldFont.FontFamily, 11f, FontStyle.Bold), + AutoSize = true, + Dock = DockStyle.Top, + Margin = new Padding(0, 14, 0, 0) + }; + + maintenanceCard.Controls.Add(advancedStatusLabel); + maintenanceCard.Controls.Add(buttonPanel); + + // Dock-Top stacking: add bottom-most visual element first (see + // BuildShell comment for why this ordering yields correct results). + page.Controls.Add(maintenanceCard); + page.Controls.Add(envCard); return page; } @@ -883,10 +1396,13 @@ private void RefreshAdvancedInfo() commandLine = $"(error building command line: {ex.Message})"; } + var managerVersion = typeof(MainForm).Assembly.GetName().Version; + advancedTextBox.Text = string.Join(Environment.NewLine, new[] { $"Install dir: {settings.InstallDir}", $"Data dir: {controller.DataDir}", + $"Manager version: {managerVersion}", "", "Effective command line:", commandLine @@ -962,8 +1478,9 @@ public NavButton(string pageName, string glyph) PageName = pageName; this.glyph = glyph; - Dock = DockStyle.Top; - Height = 40; + Width = 210; + Height = 44; + Margin = new Padding(0); Cursor = Cursors.Hand; SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.OptimizedDoubleBuffer, true); @@ -972,7 +1489,7 @@ public NavButton(string pageName, string glyph) Text = glyph, Font = Theme.IconFont(14f), AutoSize = false, - Size = new Size(36, 40), + Size = new Size(36, 44), TextAlign = ContentAlignment.MiddleCenter, Location = new Point(10, 0), BackColor = Color.Transparent @@ -982,7 +1499,7 @@ public NavButton(string pageName, string glyph) Text = pageName, Font = Theme.NavFont, AutoSize = false, - Size = new Size(150, 40), + Size = new Size(158, 44), TextAlign = ContentAlignment.MiddleLeft, Location = new Point(44, 0), BackColor = Color.Transparent From 3e21edb6a0eeafc0f0efec88aabd638fd839a153 Mon Sep 17 00:00:00 2001 From: exzile Date: Tue, 30 Jun 2026 18:11:07 -0400 Subject: [PATCH 5/9] Fix NavButton stack overflow on page navigation NavButton subscribed its own Click event to a handler that called OnClick(), which re-raises Click, recursing until the stack overflowed (0xc00000fd) on the first nav click. Only forward the child labels' clicks to OnClick now; the panel's own Click is raised by the framework. Co-Authored-By: Claude Opus 4.8 Signed-off-by: exzile --- .../manager/src/OVMS.Manager/MainForm.cs | 69 +++++++++++++------ 1 file changed, 49 insertions(+), 20 deletions(-) diff --git a/packaging/windows/manager/src/OVMS.Manager/MainForm.cs b/packaging/windows/manager/src/OVMS.Manager/MainForm.cs index d9e188aa0d..006683f088 100644 --- a/packaging/windows/manager/src/OVMS.Manager/MainForm.cs +++ b/packaging/windows/manager/src/OVMS.Manager/MainForm.cs @@ -392,6 +392,31 @@ private static Button CreatePrimaryButton(string glyph, string text, Color fillC return button; } + private static Button CreateRuntimeIconButton(string glyph, string tooltip, Color fillColor) + { + var button = new Button + { + Text = glyph, + Font = new Font("Segoe UI Symbol", 13.5f, FontStyle.Regular, GraphicsUnit.Point), + FlatStyle = FlatStyle.Flat, + ForeColor = Color.White, + BackColor = fillColor, + Size = new Size(44, 42), + MinimumSize = new Size(44, 42), + MaximumSize = new Size(44, 42), + Cursor = Cursors.Hand, + UseVisualStyleBackColor = false, + TextAlign = ContentAlignment.MiddleCenter, + Padding = new Padding(0), + Margin = new Padding(8, 0, 0, 0) + }; + button.FlatAppearance.BorderSize = 0; + button.FlatAppearance.MouseOverBackColor = ControlPaint.Dark(fillColor, 0.08f); + var tip = new ToolTip(); + tip.SetToolTip(button, tooltip); + return button; + } + private static Button CreateSecondaryButton(string text) { var button = new Button @@ -464,17 +489,9 @@ private Panel BuildResponsiveDashboardPage() metricGrid.RowStyles.Add(new RowStyle(SizeType.Absolute, 112)); } - startButton = CreatePrimaryButton("", "Start", Theme.Success); - stopButton = CreatePrimaryButton("", "Stop", Theme.Danger); - restartButton = CreatePrimaryButton("", "Restart", Theme.Accent); - - foreach (var b in new[] { startButton, stopButton, restartButton }) - { - b.AutoSize = false; - b.Anchor = AnchorStyles.None; - b.Margin = new Padding(8, 0, 0, 0); - b.MinimumSize = new Size(108, 42); - } + startButton = CreateRuntimeIconButton("\u25B6", "Start server", Theme.Success); + stopButton = CreateRuntimeIconButton("\u25A0", "Stop server", Theme.Danger); + restartButton = CreateRuntimeIconButton("\u21BB", "Restart server", Theme.Accent); startButton.Click += async (_, _) => await RunControlActionAsync("Start", controller.Start); stopButton.Click += async (_, _) => await RunControlActionAsync("Stop", controller.Stop); @@ -500,6 +517,7 @@ private Panel BuildResponsiveDashboardPage() }; cardLayout.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100)); cardLayout.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 248)); + cardLayout.RowStyles.Add(new RowStyle(SizeType.Percent, 100)); var statusLayout = new TableLayoutPanel { @@ -550,18 +568,24 @@ private Panel BuildResponsiveDashboardPage() statusLayout.Controls.Add(dotLabel, 0, 1); statusLayout.Controls.Add(valueLabel, 1, 1); - var actionLayout = new FlowLayoutPanel + var actionLayout = new TableLayoutPanel { Dock = DockStyle.Fill, - FlowDirection = FlowDirection.LeftToRight, - WrapContents = false, + ColumnCount = 3, + RowCount = 3, BackColor = Color.Transparent, Margin = new Padding(0), - Padding = new Padding(0, 19, 0, 0) + Padding = new Padding(0) }; - actionLayout.Controls.Add(startButton); - actionLayout.Controls.Add(stopButton); - actionLayout.Controls.Add(restartButton); + actionLayout.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 33.333f)); + actionLayout.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 33.333f)); + actionLayout.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 33.333f)); + actionLayout.RowStyles.Add(new RowStyle(SizeType.Percent, 50)); + actionLayout.RowStyles.Add(new RowStyle(SizeType.Absolute, 42)); + actionLayout.RowStyles.Add(new RowStyle(SizeType.Percent, 50)); + actionLayout.Controls.Add(startButton, 0, 1); + actionLayout.Controls.Add(stopButton, 1, 1); + actionLayout.Controls.Add(restartButton, 2, 1); cardLayout.Controls.Add(statusLayout, 0, 0); cardLayout.Controls.Add(actionLayout, 1, 0); @@ -698,7 +722,7 @@ private Panel BuildResponsiveDashboardPage() void SizeActionButtons() { - foreach (var button in new[] { startButton, stopButton, restartButton, openLogsButton, openModelFolderButton }) + foreach (var button in new[] { openLogsButton, openModelFolderButton }) { var preferred = TextRenderer.MeasureText(button.Text, button.Font).Width + 72; button.Size = new Size(Math.Clamp(preferred, 120, 280), 52); @@ -1508,9 +1532,14 @@ public NavButton(string pageName, string glyph) Controls.Add(glyphLabel); Controls.Add(textLabel); + // Only forward the child labels' clicks to the panel's OnClick. Do NOT + // subscribe the panel's own Click to OnClick -- OnClick raises Click, + // which would re-enter the handler and recurse until a stack overflow. + glyphLabel.Click += (_, _) => OnClick(EventArgs.Empty); + textLabel.Click += (_, _) => OnClick(EventArgs.Empty); + foreach (var c in new Control[] { this, glyphLabel, textLabel }) { - c.Click += (_, _) => OnClick(EventArgs.Empty); c.MouseEnter += (_, _) => { hovered = true; ApplyState(); }; c.MouseLeave += (_, _) => { hovered = false; ApplyState(); }; } From 95b623f24adb9e82e0083eeec1cc867bd0b9248c Mon Sep 17 00:00:00 2001 From: exzile Date: Tue, 30 Jun 2026 21:48:13 -0400 Subject: [PATCH 6/9] Make Settings page responsive and modern Fields now stretch with the window (180px label column + percent-width field column; text inputs anchored, path textboxes fill with Browse pinned right). Added card subtitles, consistent row rhythm, muted helper text for bind address and gRPC port, and a footer divider. Co-Authored-By: Claude Opus 4.8 Signed-off-by: exzile --- .../manager/src/OVMS.Manager/MainForm.cs | 321 ++++++++++++++---- 1 file changed, 256 insertions(+), 65 deletions(-) diff --git a/packaging/windows/manager/src/OVMS.Manager/MainForm.cs b/packaging/windows/manager/src/OVMS.Manager/MainForm.cs index 006683f088..ff9bad57c6 100644 --- a/packaging/windows/manager/src/OVMS.Manager/MainForm.cs +++ b/packaging/windows/manager/src/OVMS.Manager/MainForm.cs @@ -394,29 +394,39 @@ private static Button CreatePrimaryButton(string glyph, string text, Color fillC private static Button CreateRuntimeIconButton(string glyph, string tooltip, Color fillColor) { - var button = new Button + var button = new RuntimeIconButton(glyph, fillColor) { - Text = glyph, - Font = new Font("Segoe UI Symbol", 13.5f, FontStyle.Regular, GraphicsUnit.Point), - FlatStyle = FlatStyle.Flat, - ForeColor = Color.White, - BackColor = fillColor, - Size = new Size(44, 42), - MinimumSize = new Size(44, 42), - MaximumSize = new Size(44, 42), - Cursor = Cursors.Hand, - UseVisualStyleBackColor = false, - TextAlign = ContentAlignment.MiddleCenter, - Padding = new Padding(0), - Margin = new Padding(8, 0, 0, 0) + BackColor = Theme.Surface, + Size = new Size(58, 52), + MinimumSize = new Size(58, 52), + MaximumSize = new Size(58, 52), + Margin = new Padding(4, 0, 0, 0) }; - button.FlatAppearance.BorderSize = 0; - button.FlatAppearance.MouseOverBackColor = ControlPaint.Dark(fillColor, 0.08f); var tip = new ToolTip(); tip.SetToolTip(button, tooltip); return button; } + private static void SetRuntimeIconButtonState(Button button, bool enabled) + { + var activeColor = button.Tag is Color color ? color : Theme.Text; + button.Enabled = enabled; + button.ForeColor = enabled ? activeColor : Color.FromArgb(145, Theme.Muted); + button.BackColor = Theme.Surface; + button.Cursor = enabled ? Cursors.Hand : Cursors.Default; + if (button is RuntimeIconButton iconButton) + { + iconButton.ActiveColor = activeColor; + iconButton.DisabledColor = Color.FromArgb(145, Theme.Muted); + iconButton.Invalidate(); + } + else + { + button.FlatAppearance.MouseOverBackColor = enabled ? Theme.HoverTint : Theme.Surface; + button.FlatAppearance.MouseDownBackColor = enabled ? Theme.WindowBackground : Theme.Surface; + } + } + private static Button CreateSecondaryButton(string text) { var button = new Button @@ -489,9 +499,9 @@ private Panel BuildResponsiveDashboardPage() metricGrid.RowStyles.Add(new RowStyle(SizeType.Absolute, 112)); } - startButton = CreateRuntimeIconButton("\u25B6", "Start server", Theme.Success); - stopButton = CreateRuntimeIconButton("\u25A0", "Stop server", Theme.Danger); - restartButton = CreateRuntimeIconButton("\u21BB", "Restart server", Theme.Accent); + startButton = CreateRuntimeIconButton("\uE768", "Start server", Theme.Success); + stopButton = CreateRuntimeIconButton("\uE71A", "Stop server", Theme.Danger); + restartButton = CreateRuntimeIconButton("\uE72C", "Restart server", Theme.Accent); startButton.Click += async (_, _) => await RunControlActionAsync("Start", controller.Start); stopButton.Click += async (_, _) => await RunControlActionAsync("Stop", controller.Stop); @@ -516,7 +526,7 @@ private Panel BuildResponsiveDashboardPage() Padding = new Padding(0) }; cardLayout.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100)); - cardLayout.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 248)); + cardLayout.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 230)); cardLayout.RowStyles.Add(new RowStyle(SizeType.Percent, 100)); var statusLayout = new TableLayoutPanel @@ -571,21 +581,22 @@ private Panel BuildResponsiveDashboardPage() var actionLayout = new TableLayoutPanel { Dock = DockStyle.Fill, - ColumnCount = 3, + ColumnCount = 4, RowCount = 3, BackColor = Color.Transparent, Margin = new Padding(0), - Padding = new Padding(0) + Padding = new Padding(0, 0, 6, 0) }; - actionLayout.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 33.333f)); - actionLayout.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 33.333f)); - actionLayout.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 33.333f)); + actionLayout.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100)); + actionLayout.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 62)); + actionLayout.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 62)); + actionLayout.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 62)); actionLayout.RowStyles.Add(new RowStyle(SizeType.Percent, 50)); - actionLayout.RowStyles.Add(new RowStyle(SizeType.Absolute, 42)); + actionLayout.RowStyles.Add(new RowStyle(SizeType.Absolute, 52)); actionLayout.RowStyles.Add(new RowStyle(SizeType.Percent, 50)); - actionLayout.Controls.Add(startButton, 0, 1); - actionLayout.Controls.Add(stopButton, 1, 1); - actionLayout.Controls.Add(restartButton, 2, 1); + actionLayout.Controls.Add(startButton, 1, 1); + actionLayout.Controls.Add(stopButton, 2, 1); + actionLayout.Controls.Add(restartButton, 3, 1); cardLayout.Controls.Add(statusLayout, 0, 0); cardLayout.Controls.Add(actionLayout, 1, 0); @@ -834,9 +845,12 @@ private async Task RunControlActionAsync(string title, Action action) private void SetControlButtonsEnabled(bool enabled) { - startButton.Enabled = enabled; - stopButton.Enabled = enabled; - restartButton.Enabled = enabled; + if (!enabled) + { + SetRuntimeIconButtonState(startButton, false); + SetRuntimeIconButtonState(stopButton, false); + SetRuntimeIconButtonState(restartButton, false); + } headerRefreshButton.Enabled = enabled; } @@ -846,9 +860,9 @@ public async Task RefreshDashboardAsync() if (settings is null) { statusValueLabel.Text = "Settings unavailable"; - startButton.Visible = false; - stopButton.Visible = false; - restartButton.Visible = false; + SetRuntimeIconButtonState(startButton, false); + SetRuntimeIconButtonState(stopButton, false); + SetRuntimeIconButtonState(restartButton, false); return; } @@ -858,9 +872,9 @@ public async Task RefreshDashboardAsync() railStatusDot.ForeColor = runtimeStatus.Running ? Theme.Success : Theme.Muted; railStatusText.Text = runtimeStatus.Running ? "Running" : "Stopped"; railStatusText.ForeColor = runtimeStatus.Running ? Theme.Text : Theme.Muted; - startButton.Visible = !runtimeStatus.Running; - stopButton.Visible = runtimeStatus.Running; - restartButton.Visible = runtimeStatus.Running; + SetRuntimeIconButtonState(startButton, !runtimeStatus.Running); + SetRuntimeIconButtonState(stopButton, runtimeStatus.Running); + SetRuntimeIconButtonState(restartButton, runtimeStatus.Running); runModeValueLabel.Text = settings.RunMode; restUrlValueLabel.Text = $"{settings.BindAddress}:{settings.RestPort}"; @@ -911,21 +925,23 @@ private Panel BuildSettingsPage() { var page = new Panel { BackColor = Theme.WindowBackground, AutoScroll = true }; - var serverCard = CreateTitledCard("Server", 320); + var serverCard = CreateTitledCard("Server", 400, "Endpoints, logging, and model repository."); var serverLayout = CreateSettingsTable(); var row = 0; - AddSettingsRow(serverLayout, "REST port:", restPortInput = new NumericUpDown { Minimum = 1, Maximum = 65535, Width = 120, Margin = new Padding(3, 6, 3, 3) }, row++); - AddSettingsRow(serverLayout, "gRPC port (0 = disabled):", grpcPortInput = new NumericUpDown { Minimum = 0, Maximum = 65535, Width = 120, Margin = new Padding(3, 6, 3, 3) }, row++); - AddSettingsRow(serverLayout, "Bind address:", bindAddressInput = new TextBox { Width = 240, Margin = new Padding(3, 6, 3, 3) }, row++); + AddSettingsRow(serverLayout, "REST port:", restPortInput = new NumericUpDown { Minimum = 1, Maximum = 65535, Width = 140, Anchor = AnchorStyles.Left, Margin = new Padding(3, 6, 3, 3) }, row++); + AddSettingsRow(serverLayout, "gRPC port (0 = disabled):", grpcPortInput = new NumericUpDown { Minimum = 0, Maximum = 65535, Width = 140, Anchor = AnchorStyles.Left, Margin = new Padding(3, 6, 3, 3) }, row++); + AddHelperRow(serverLayout, "Set to 0 to disable the gRPC endpoint.", row++); + AddSettingsRow(serverLayout, "Bind address:", bindAddressInput = new TextBox { Anchor = AnchorStyles.Left | AnchorStyles.Right, Margin = new Padding(3, 6, 12, 3) }, row++); + AddHelperRow(serverLayout, "Use 127.0.0.1 for local-only access. Other addresses may expose the server to your network.", row++); - logLevelInput = new ComboBox { DropDownStyle = ComboBoxStyle.DropDownList, Width = 140, Margin = new Padding(3, 6, 3, 3) }; + logLevelInput = new ComboBox { DropDownStyle = ComboBoxStyle.DropDownList, Width = 160, Anchor = AnchorStyles.Left, Margin = new Padding(3, 6, 3, 3) }; logLevelInput.Items.AddRange(new object[] { "ERROR", "WARNING", "INFO", "DEBUG", "TRACE" }); AddSettingsRow(serverLayout, "Log level:", logLevelInput, row++); - logPathInput = new TextBox { Width = 360, Margin = new Padding(3, 6, 3, 3) }; + logPathInput = new TextBox { Anchor = AnchorStyles.Left | AnchorStyles.Right, Margin = new Padding(3, 6, 3, 3) }; var browseLogButton = CreateSecondaryButton("Browse..."); - browseLogButton.Margin = new Padding(6, 3, 3, 3); + browseLogButton.Margin = new Padding(8, 3, 3, 3); browseLogButton.Click += (_, _) => { using var dialog = new SaveFileDialog @@ -944,9 +960,9 @@ private Panel BuildSettingsPage() }; AddSettingsRowWithButton(serverLayout, "Log path:", logPathInput, browseLogButton, row++); - modelRepoInput = new TextBox { Width = 360, Margin = new Padding(3, 6, 3, 3) }; + modelRepoInput = new TextBox { Anchor = AnchorStyles.Left | AnchorStyles.Right, Margin = new Padding(3, 6, 3, 3) }; var browseModelRepoButton = CreateSecondaryButton("Browse..."); - browseModelRepoButton.Margin = new Padding(6, 3, 3, 3); + browseModelRepoButton.Margin = new Padding(8, 3, 3, 3); browseModelRepoButton.Click += (_, _) => { using var dialog = new FolderBrowserDialog @@ -963,18 +979,18 @@ private Panel BuildSettingsPage() serverCard.Controls.Add(serverLayout); - var startupCard = CreateTitledCard("Startup & tray", 200); + var startupCard = CreateTitledCard("Startup & tray", 240, "How the server runs and whether the tray app launches at sign-in."); var startupLayout = CreateSettingsTable(); row = 0; - runModeInput = new ComboBox { DropDownStyle = ComboBoxStyle.DropDownList, Width = 180, Margin = new Padding(3, 6, 3, 3) }; + runModeInput = new ComboBox { DropDownStyle = ComboBoxStyle.DropDownList, Width = 200, Anchor = AnchorStyles.Left, Margin = new Padding(3, 6, 3, 3) }; runModeInput.Items.AddRange(new object[] { "user-login", "service", "manual" }); AddSettingsRow(startupLayout, "Startup mode:", runModeInput, row++); - showTrayCheckBox = new CheckBox { Margin = new Padding(3, 10, 3, 3) }; + showTrayCheckBox = new CheckBox { Anchor = AnchorStyles.Left, Margin = new Padding(3, 10, 3, 3) }; AddSettingsRow(startupLayout, "Show tray icon:", showTrayCheckBox, row++); - startAtLoginCheckBox = new CheckBox { Margin = new Padding(3, 10, 3, 3) }; + startAtLoginCheckBox = new CheckBox { Anchor = AnchorStyles.Left, Margin = new Padding(3, 10, 3, 3) }; AddSettingsRow(startupLayout, "Start at login:", startAtLoginCheckBox, row++); startupCard.Controls.Add(startupLayout); @@ -985,9 +1001,10 @@ private Panel BuildSettingsPage() Height = 56, FlowDirection = FlowDirection.LeftToRight, WrapContents = false, - Padding = new Padding(0, 14, 0, 0), - Margin = new Padding(0) + Padding = new Padding(0, 20, 0, 0), + Margin = new Padding(0, 4, 0, 0) }; + var footerRule = new Panel { Dock = DockStyle.Top, Height = 1, BackColor = Theme.Border, Margin = new Padding(0) }; var saveButton = CreatePrimaryButton("", "Save", Theme.Accent); var resetButton = CreateSecondaryButton("Reset"); saveButton.Margin = new Padding(0, 0, 10, 0); @@ -1015,14 +1032,30 @@ private Panel BuildSettingsPage() // Dock-Top stacking: add bottom-most visual element first so later // Top-docked controls are carved above it (see BuildShell comment). page.Controls.Add(footer); + page.Controls.Add(footerRule); page.Controls.Add(startupCard); page.Controls.Add(serverCard); return page; } - private static CardPanel CreateTitledCard(string title, int height) + private static CardPanel CreateTitledCard(string title, int height, string? subtitle = null) { var card = new CardPanel { Dock = DockStyle.Top, Height = height, Margin = new Padding(0, 0, 0, 16) }; + + if (subtitle is not null) + { + var subtitleLabel = new Label + { + Text = subtitle, + Font = new Font(Theme.BaseFont.FontFamily, 8.25f), + ForeColor = Theme.Muted, + AutoSize = true, + Dock = DockStyle.Top, + Margin = new Padding(0, 0, 0, 0) + }; + card.Controls.Add(subtitleLabel); + } + var titleLabel = new Label { Text = title, @@ -1030,7 +1063,7 @@ private static CardPanel CreateTitledCard(string title, int height) ForeColor = Theme.Text, AutoSize = true, Dock = DockStyle.Top, - Margin = new Padding(0, 0, 0, 12) + Margin = new Padding(0, 0, 0, subtitle is null ? 12 : 2) }; card.Controls.Add(titleLabel); return card; @@ -1043,34 +1076,60 @@ private static TableLayoutPanel CreateSettingsTable() Dock = DockStyle.Fill, ColumnCount = 2, AutoSize = false, - Padding = new Padding(0, 32, 0, 0) + Padding = new Padding(0, 24, 0, 0) }; - table.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize)); + table.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 180)); table.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100)); return table; } private static void AddSettingsRow(TableLayoutPanel table, string label, Control field, int row) { - table.Controls.Add(new Label { Text = label, AutoSize = true, ForeColor = Theme.Text, Margin = new Padding(3, 10, 16, 3) }, 0, row); + table.RowStyles.Add(new RowStyle(SizeType.Absolute, 40)); + table.Controls.Add(new Label { Text = label, AutoSize = true, Anchor = AnchorStyles.Left, ForeColor = Theme.Text, Margin = new Padding(3, 10, 16, 3) }, 0, row); table.Controls.Add(field, 1, row); } private static void AddSettingsRowWithButton(TableLayoutPanel table, string label, Control field, Control button, int row) { - var inline = new FlowLayoutPanel + table.RowStyles.Add(new RowStyle(SizeType.Absolute, 40)); + + var inline = new TableLayoutPanel { - FlowDirection = FlowDirection.LeftToRight, - WrapContents = false, - AutoSize = true, + Dock = DockStyle.Fill, + ColumnCount = 2, + RowCount = 1, + AutoSize = false, Margin = new Padding(0) }; - inline.Controls.Add(field); - inline.Controls.Add(button); - table.Controls.Add(new Label { Text = label, AutoSize = true, ForeColor = Theme.Text, Margin = new Padding(3, 10, 16, 3) }, 0, row); + inline.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100)); + inline.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize)); + field.Dock = DockStyle.Fill; + field.Margin = new Padding(3, 6, 8, 3); + button.Anchor = AnchorStyles.Right; + inline.Controls.Add(field, 0, 0); + inline.Controls.Add(button, 1, 0); + + table.Controls.Add(new Label { Text = label, AutoSize = true, Anchor = AnchorStyles.Left, ForeColor = Theme.Text, Margin = new Padding(3, 10, 16, 3) }, 0, row); table.Controls.Add(inline, 1, row); } + private static void AddHelperRow(TableLayoutPanel table, string text, int row) + { + table.RowStyles.Add(new RowStyle(SizeType.Absolute, 24)); + var helper = new Label + { + Text = text, + AutoSize = false, + Dock = DockStyle.Fill, + Font = new Font(Theme.BaseFont.FontFamily, 8.25f), + ForeColor = Theme.Muted, + Margin = new Padding(3, 0, 12, 6) + }; + table.Controls.Add(helper, 0, row); + table.SetColumnSpan(helper, 2); + } + private static string SafeDirectoryName(string path) { try @@ -1474,6 +1533,138 @@ private async Task ExportDiagnosticsAsync() } } +internal sealed class RuntimeIconButton : Button +{ + private bool hovered; + private bool pressed; + + public Color ActiveColor { get; set; } + public Color DisabledColor { get; set; } = Theme.Muted; + + public RuntimeIconButton(string glyph, Color activeColor) + { + Text = glyph; + ActiveColor = activeColor; + Tag = activeColor; + Font = new Font("Segoe MDL2 Assets", 13.5f, FontStyle.Regular, GraphicsUnit.Point); + FlatStyle = FlatStyle.Flat; + FlatAppearance.BorderSize = 0; + UseVisualStyleBackColor = false; + TextAlign = ContentAlignment.MiddleCenter; + Padding = new Padding(0); + TabStop = false; + Cursor = Cursors.Hand; + SetStyle( + ControlStyles.AllPaintingInWmPaint | + ControlStyles.UserPaint | + ControlStyles.OptimizedDoubleBuffer | + ControlStyles.ResizeRedraw, + true); + } + + protected override void OnMouseEnter(EventArgs e) + { + hovered = true; + Invalidate(); + base.OnMouseEnter(e); + } + + protected override void OnMouseLeave(EventArgs e) + { + hovered = false; + pressed = false; + Invalidate(); + base.OnMouseLeave(e); + } + + protected override void OnMouseDown(MouseEventArgs mevent) + { + if (Enabled && mevent.Button == MouseButtons.Left) + { + pressed = true; + Invalidate(); + } + base.OnMouseDown(mevent); + } + + protected override void OnMouseUp(MouseEventArgs mevent) + { + pressed = false; + Invalidate(); + base.OnMouseUp(mevent); + } + + protected override void OnEnabledChanged(EventArgs e) + { + hovered = false; + pressed = false; + Invalidate(); + base.OnEnabledChanged(e); + } + + protected override void OnPaint(PaintEventArgs e) + { + e.Graphics.SmoothingMode = SmoothingMode.AntiAlias; + e.Graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit; + e.Graphics.Clear(Theme.Surface); + + var buttonRect = new Rectangle(7, 6, Width - 14, Height - 13); + if (pressed) + { + buttonRect.Offset(0, 1); + } + + if (Enabled && hovered) + { + using var ambientPath = RoundedRect(new Rectangle(buttonRect.X - 2, buttonRect.Y, buttonRect.Width + 4, buttonRect.Height + 4), 12); + using var dropPath = RoundedRect(new Rectangle(buttonRect.X - 1, buttonRect.Y + 5, buttonRect.Width + 2, buttonRect.Height), 12); + using var ambientBrush = new SolidBrush(Color.FromArgb(18, 13, 24, 38)); + using var dropBrush = new SolidBrush(Color.FromArgb(48, 13, 24, 38)); + e.Graphics.FillPath(ambientBrush, ambientPath); + e.Graphics.FillPath(dropBrush, dropPath); + } + + var borderColor = Enabled + ? (hovered ? Color.FromArgb(86, ActiveColor) : Color.FromArgb(34, 13, 24, 38)) + : Color.FromArgb(32, Theme.Muted); + var fillColor = Enabled + ? (hovered ? Color.FromArgb(254, 255, 255) : Color.FromArgb(248, 249, 251)) + : Color.FromArgb(246, 247, 249); + + using (var buttonPath = RoundedRect(buttonRect, 11)) + using (var fillBrush = new SolidBrush(fillColor)) + using (var borderPen = new Pen(borderColor)) + { + e.Graphics.FillPath(fillBrush, buttonPath); + e.Graphics.DrawPath(borderPen, buttonPath); + } + + var color = Enabled ? ActiveColor : DisabledColor; + using var textBrush = new SolidBrush(color); + using var iconPath = new GraphicsPath(); + using var format = StringFormat.GenericTypographic; + iconPath.AddString(Text, Font.FontFamily, (int)Font.Style, e.Graphics.DpiY * Font.Size / 72f, Point.Empty, format); + var bounds = iconPath.GetBounds(); + var targetCenter = new PointF(buttonRect.Left + buttonRect.Width / 2f, buttonRect.Top + buttonRect.Height / 2f + (pressed ? 1f : 0f)); + using var transform = new Matrix(); + transform.Translate(targetCenter.X - (bounds.Left + bounds.Width / 2f), targetCenter.Y - (bounds.Top + bounds.Height / 2f)); + iconPath.Transform(transform); + e.Graphics.FillPath(textBrush, iconPath); + } + + private static GraphicsPath RoundedRect(Rectangle bounds, int radius) + { + var diameter = radius * 2; + var path = new GraphicsPath(); + path.AddArc(bounds.Left, bounds.Top, diameter, diameter, 180, 90); + path.AddArc(bounds.Right - diameter, bounds.Top, diameter, diameter, 270, 90); + path.AddArc(bounds.Right - diameter, bounds.Bottom - diameter, diameter, diameter, 0, 90); + path.AddArc(bounds.Left, bounds.Bottom - diameter, diameter, diameter, 90, 90); + path.CloseFigure(); + return path; + } +} + /// /// Flat nav-rail button: glyph + label, with a 4px accent left-bar and /// tinted background when selected, subtle hover highlight otherwise. From dcfc6fd163320eee699b13ee89ef58f92a0865e9 Mon Sep 17 00:00:00 2001 From: exzile Date: Wed, 1 Jul 2026 08:26:20 -0400 Subject: [PATCH 7/9] Make Advanced page responsive and modern Environment card now uses aligned label/value rows (install dir, data dir, version, config path) that stretch and ellipsize, plus a dedicated monospace command-line box with Copy. Maintenance card presents Repair / Validate / Export Diagnostics as titled+described action rows with right-aligned buttons. Responsive layout matching the Settings page. Co-Authored-By: Claude Opus 4.8 Signed-off-by: exzile --- .../manager/src/OVMS.Manager/MainForm.cs | 1102 ++++++++++++++--- 1 file changed, 904 insertions(+), 198 deletions(-) diff --git a/packaging/windows/manager/src/OVMS.Manager/MainForm.cs b/packaging/windows/manager/src/OVMS.Manager/MainForm.cs index ff9bad57c6..237b7848dc 100644 --- a/packaging/windows/manager/src/OVMS.Manager/MainForm.cs +++ b/packaging/windows/manager/src/OVMS.Manager/MainForm.cs @@ -73,6 +73,31 @@ internal sealed class MainForm : Form private TextBox advancedTextBox = null!; private Label advancedStatusLabel = null!; + // Updates controls + private Label updatesBaseInstalledVersionValue = null!; + private Label updatesBaseLatestVersionValue = null!; + private Label updatesModelServerInstalledVersionValue = null!; + private Label updatesModelServerLatestVersionValue = null!; + private Label updatesGenAiInstalledVersionValue = null!; + private Label updatesGenAiLatestVersionValue = null!; + private Label updatesVariantValue = null!; + private Label updatesManagerVersionValue = null!; + private Label updatesStatusLabel = null!; + private CardPanel updatesBaseCard = null!; + private CardPanel updatesModelServerCard = null!; + private CardPanel updatesGenAiCard = null!; + private CollapsibleActionRow updatesBaseInstallRow; + private CollapsibleActionRow updatesModelServerInstallRow; + private CollapsibleActionRow updatesGenAiInstallRow; + private Button updatesCheckButton = null!; + private Button updatesBaseInstallButton = null!; + private Button updatesModelServerInstallButton = null!; + private Button updatesGenAiInstallButton = null!; + private Button updatesModelServerReleaseButton = null!; + private Button updatesGenAiReleaseButton = null!; + private string updatesModelServerReleaseUrl = ""; + private string updatesGenAiReleaseUrl = ""; + public MainForm(OvmsController controller) { this.controller = controller; @@ -183,6 +208,7 @@ private void BuildShell() navFlow.Controls.Add(CreateNavButton("Settings", Glyphs.Settings)); navFlow.Controls.Add(CreateNavButton("Logs", Glyphs.Logs)); navFlow.Controls.Add(CreateNavButton("Advanced", Glyphs.Advanced)); + navFlow.Controls.Add(CreateNavButton("Updates", Glyphs.Update)); var statusPill = new Panel { Dock = DockStyle.Bottom, Height = 56, BackColor = Theme.Rail, Padding = new Padding(16, 12, 16, 12) }; var pillInner = new FlowLayoutPanel { Dock = DockStyle.Fill, FlowDirection = FlowDirection.LeftToRight, WrapContents = false }; @@ -226,6 +252,7 @@ private void BuildShell() pages["Settings"] = BuildSettingsPage(); pages["Logs"] = BuildLogsPage(); pages["Advanced"] = BuildAdvancedPage(); + pages["Updates"] = BuildUpdatesPage(); foreach (var page in pages.Values) { @@ -296,6 +323,10 @@ private void SelectPage(string name) { RefreshAdvancedInfo(); } + else if (name == "Updates") + { + RefreshUpdatesInfo(); + } } } @@ -312,6 +343,9 @@ private async Task RefreshCurrentPageAsync() case "Advanced": RefreshAdvancedInfo(); break; + case "Updates": + RefreshUpdatesInfo(); + break; case "Settings": LoadSettingsIntoForm(); break; @@ -352,20 +386,15 @@ private void StopDashboardTimer() private static Button CreateIconButton(string glyph, string tooltip) { - var button = new Button + var button = new RuntimeIconButton(glyph, Theme.Muted) { - Text = glyph, - Font = Theme.IconFont(13f), - FlatStyle = FlatStyle.Flat, - ForeColor = Theme.Muted, BackColor = Theme.Surface, - Size = new Size(32, 32), - Cursor = Cursors.Hand, - UseVisualStyleBackColor = false + Size = new Size(42, 38), + MinimumSize = new Size(42, 38), + MaximumSize = new Size(42, 38), + Margin = new Padding(0) }; - button.FlatAppearance.BorderSize = 1; - button.FlatAppearance.BorderColor = Theme.Border; - button.FlatAppearance.MouseOverBackColor = Theme.HoverTint; + button.Font = Theme.IconFont(12.5f); var tip = new ToolTip(); tip.SetToolTip(button, tooltip); return button; @@ -431,14 +460,14 @@ private static Button CreateSecondaryButton(string text) { var button = new Button { - Text = " " + text, + Text = text, Font = Theme.NavFont, FlatStyle = FlatStyle.Flat, ForeColor = Theme.Text, BackColor = Theme.Surface, AutoSize = true, AutoSizeMode = AutoSizeMode.GrowAndShrink, - Padding = new Padding(12, 8, 14, 8), + Padding = new Padding(16, 8, 16, 8), Cursor = Cursors.Hand, UseVisualStyleBackColor = false }; @@ -471,14 +500,13 @@ private Panel BuildResponsiveDashboardPage() Location = new Point(0, 0), AutoSize = false, ColumnCount = 1, - RowCount = 2, - Height = 656, + RowCount = 1, + Height = 456, Padding = new Padding(0), Margin = new Padding(0) }; dashboardStack.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100)); dashboardStack.RowStyles.Add(new RowStyle(SizeType.Absolute, 456)); - dashboardStack.RowStyles.Add(new RowStyle(SizeType.Absolute, 200)); var metricGrid = new TableLayoutPanel { @@ -499,9 +527,9 @@ private Panel BuildResponsiveDashboardPage() metricGrid.RowStyles.Add(new RowStyle(SizeType.Absolute, 112)); } - startButton = CreateRuntimeIconButton("\uE768", "Start server", Theme.Success); - stopButton = CreateRuntimeIconButton("\uE71A", "Stop server", Theme.Danger); - restartButton = CreateRuntimeIconButton("\uE72C", "Restart server", Theme.Accent); + startButton = CreateRuntimeIconButton(Glyphs.Play, "Start server", Theme.Success); + stopButton = CreateRuntimeIconButton(Glyphs.Stop, "Stop server", Theme.Danger); + restartButton = CreateRuntimeIconButton(Glyphs.Refresh, "Restart server", Theme.Accent); startButton.Click += async (_, _) => await RunControlActionAsync("Start", controller.Start); stopButton.Click += async (_, _) => await RunControlActionAsync("Stop", controller.Stop); @@ -692,59 +720,13 @@ private Panel BuildResponsiveDashboardPage() (_, variantValueLabel) = AddStatusCard("Package variant", "-", withDot: false, 1, 2); (_, runModeValueLabel) = AddStatusCard("Runtime mode", "-", withDot: false, 0, 3); - var actionsCard = new CardPanel { Dock = DockStyle.Fill, Margin = new Padding(0, 10, 0, 0), Padding = new Padding(14) }; - var actionsLayout = new TableLayoutPanel - { - Dock = DockStyle.Fill, - ColumnCount = 3, - RowCount = 2, - Margin = new Padding(0), - Padding = new Padding(0) - }; - for (var i = 0; i < 3; i++) - { - actionsLayout.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 33.333f)); - } - actionsLayout.RowStyles.Add(new RowStyle(SizeType.Percent, 50)); - actionsLayout.RowStyles.Add(new RowStyle(SizeType.Percent, 50)); - - var openLogsButton = CreateSecondaryButton("Open Logs"); - var openModelFolderButton = CreateSecondaryButton("Open Model Folder"); - - foreach (var b in new[] { openLogsButton, openModelFolderButton }) - { - b.AutoSize = false; - b.Anchor = AnchorStyles.None; - b.Margin = new Padding(0, 0, 10, 10); - b.MinimumSize = new Size(120, 48); - } - - openLogsButton.Click += (_, _) => OpenFolderFor(TryLoadSettings()?.LogPath); - openModelFolderButton.Click += (_, _) => OpenFolder(TryLoadSettings()?.ModelRepositoryPath); - - actionsLayout.Controls.Add(openLogsButton, 0, 0); - actionsLayout.Controls.Add(openModelFolderButton, 1, 0); - actionsLayout.SetColumnSpan(openModelFolderButton, 2); - actionsCard.Controls.Add(actionsLayout); - dashboardStack.Controls.Add(metricGrid, 0, 0); - dashboardStack.Controls.Add(actionsCard, 0, 1); page.Controls.Add(dashboardStack); - void SizeActionButtons() - { - foreach (var button in new[] { openLogsButton, openModelFolderButton }) - { - var preferred = TextRenderer.MeasureText(button.Text, button.Font).Width + 72; - button.Size = new Size(Math.Clamp(preferred, 120, 280), 52); - } - } - void ResizeDashboard() { var availableWidth = ClientSize.Width - navRail.Width - contentHost.Padding.Horizontal - 28; dashboardStack.Width = Math.Max(560, availableWidth); - SizeActionButtons(); } page.Resize += (_, _) => ResizeDashboard(); @@ -923,25 +905,35 @@ private static void OpenFolder(string? folderPath) private Panel BuildSettingsPage() { - var page = new Panel { BackColor = Theme.WindowBackground, AutoScroll = true }; + var page = new Panel { BackColor = Theme.WindowBackground, AutoScroll = true, Padding = new Padding(0, 0, 10, 0) }; - var serverCard = CreateTitledCard("Server", 400, "Endpoints, logging, and model repository."); + var serverCard = CreateSettingsCard(650); var serverLayout = CreateSettingsTable(); var row = 0; - AddSettingsRow(serverLayout, "REST port:", restPortInput = new NumericUpDown { Minimum = 1, Maximum = 65535, Width = 140, Anchor = AnchorStyles.Left, Margin = new Padding(3, 6, 3, 3) }, row++); - AddSettingsRow(serverLayout, "gRPC port (0 = disabled):", grpcPortInput = new NumericUpDown { Minimum = 0, Maximum = 65535, Width = 140, Anchor = AnchorStyles.Left, Margin = new Padding(3, 6, 3, 3) }, row++); + AddSettingsCardHeader(serverLayout, "Server", "Configure endpoints, logging, and where OVMS loads models from.", row++); + AddSettingsSectionHeader(serverLayout, "Network", row++); + restPortInput = new NumericUpDown { Minimum = 1, Maximum = 65535, Width = 150, Anchor = AnchorStyles.Left }; + StyleSettingsField(restPortInput); + AddSettingsRow(serverLayout, "REST port", restPortInput, row++); + grpcPortInput = new NumericUpDown { Minimum = 0, Maximum = 65535, Width = 150, Anchor = AnchorStyles.Left }; + StyleSettingsField(grpcPortInput); + AddSettingsRow(serverLayout, "gRPC port", grpcPortInput, row++); AddHelperRow(serverLayout, "Set to 0 to disable the gRPC endpoint.", row++); - AddSettingsRow(serverLayout, "Bind address:", bindAddressInput = new TextBox { Anchor = AnchorStyles.Left | AnchorStyles.Right, Margin = new Padding(3, 6, 12, 3) }, row++); + bindAddressInput = new TextBox { Anchor = AnchorStyles.Left | AnchorStyles.Right }; + StyleSettingsField(bindAddressInput); + AddSettingsRow(serverLayout, "Bind address", bindAddressInput, row++); AddHelperRow(serverLayout, "Use 127.0.0.1 for local-only access. Other addresses may expose the server to your network.", row++); - logLevelInput = new ComboBox { DropDownStyle = ComboBoxStyle.DropDownList, Width = 160, Anchor = AnchorStyles.Left, Margin = new Padding(3, 6, 3, 3) }; + AddSettingsSectionHeader(serverLayout, "Logging and models", row++); + logLevelInput = new ComboBox { DropDownStyle = ComboBoxStyle.DropDownList, Width = 170, Anchor = AnchorStyles.Left, FlatStyle = FlatStyle.Standard }; + StyleSettingsField(logLevelInput); logLevelInput.Items.AddRange(new object[] { "ERROR", "WARNING", "INFO", "DEBUG", "TRACE" }); - AddSettingsRow(serverLayout, "Log level:", logLevelInput, row++); + AddSettingsRow(serverLayout, "Log level", logLevelInput, row++); - logPathInput = new TextBox { Anchor = AnchorStyles.Left | AnchorStyles.Right, Margin = new Padding(3, 6, 3, 3) }; + logPathInput = new TextBox { Anchor = AnchorStyles.Left | AnchorStyles.Right }; + StyleSettingsField(logPathInput); var browseLogButton = CreateSecondaryButton("Browse..."); - browseLogButton.Margin = new Padding(8, 3, 3, 3); browseLogButton.Click += (_, _) => { using var dialog = new SaveFileDialog @@ -958,11 +950,11 @@ private Panel BuildSettingsPage() logPathInput.Text = dialog.FileName; } }; - AddSettingsRowWithButton(serverLayout, "Log path:", logPathInput, browseLogButton, row++); + AddSettingsRowWithButton(serverLayout, "Log path", logPathInput, browseLogButton, row++); - modelRepoInput = new TextBox { Anchor = AnchorStyles.Left | AnchorStyles.Right, Margin = new Padding(3, 6, 3, 3) }; + modelRepoInput = new TextBox { Anchor = AnchorStyles.Left | AnchorStyles.Right }; + StyleSettingsField(modelRepoInput); var browseModelRepoButton = CreateSecondaryButton("Browse..."); - browseModelRepoButton.Margin = new Padding(8, 3, 3, 3); browseModelRepoButton.Click += (_, _) => { using var dialog = new FolderBrowserDialog @@ -975,37 +967,43 @@ private Panel BuildSettingsPage() modelRepoInput.Text = dialog.SelectedPath; } }; - AddSettingsRowWithButton(serverLayout, "Model repository path:", modelRepoInput, browseModelRepoButton, row++); + var openModelRepoButton = CreateSecondaryButton("Open"); + openModelRepoButton.Click += (_, _) => OpenFolder(modelRepoInput.Text); + AddSettingsRowWithButtons(serverLayout, "Model folder", modelRepoInput, new[] { browseModelRepoButton, openModelRepoButton }, row++); serverCard.Controls.Add(serverLayout); - var startupCard = CreateTitledCard("Startup & tray", 240, "How the server runs and whether the tray app launches at sign-in."); + var startupCard = CreateSettingsCard(330); var startupLayout = CreateSettingsTable(); row = 0; - runModeInput = new ComboBox { DropDownStyle = ComboBoxStyle.DropDownList, Width = 200, Anchor = AnchorStyles.Left, Margin = new Padding(3, 6, 3, 3) }; + AddSettingsCardHeader(startupLayout, "Startup tray", "Choose how the manager and server behave when Windows starts.", row++); + AddSettingsSectionHeader(startupLayout, "Launch behavior", row++); + runModeInput = new ComboBox { DropDownStyle = ComboBoxStyle.DropDownList, Width = 220, Anchor = AnchorStyles.Left, FlatStyle = FlatStyle.Standard }; + StyleSettingsField(runModeInput); runModeInput.Items.AddRange(new object[] { "user-login", "service", "manual" }); - AddSettingsRow(startupLayout, "Startup mode:", runModeInput, row++); + AddSettingsRow(startupLayout, "Startup mode", runModeInput, row++); - showTrayCheckBox = new CheckBox { Anchor = AnchorStyles.Left, Margin = new Padding(3, 10, 3, 3) }; - AddSettingsRow(startupLayout, "Show tray icon:", showTrayCheckBox, row++); + showTrayCheckBox = new CheckBox { Text = "Show OVMS in the Windows notification area", AutoSize = true, Anchor = AnchorStyles.Left, Margin = new Padding(3, 8, 3, 5), FlatStyle = FlatStyle.System, BackColor = Theme.Surface }; + AddSettingsRow(startupLayout, "Tray icon", showTrayCheckBox, row++); - startAtLoginCheckBox = new CheckBox { Anchor = AnchorStyles.Left, Margin = new Padding(3, 10, 3, 3) }; - AddSettingsRow(startupLayout, "Start at login:", startAtLoginCheckBox, row++); + startAtLoginCheckBox = new CheckBox { Text = "Launch OVMS Manager when you sign in", AutoSize = true, Anchor = AnchorStyles.Left, Margin = new Padding(3, 8, 3, 5), FlatStyle = FlatStyle.System, BackColor = Theme.Surface }; + AddSettingsRow(startupLayout, "Start at login", startAtLoginCheckBox, row++); startupCard.Controls.Add(startupLayout); var footer = new FlowLayoutPanel { Dock = DockStyle.Top, - Height = 56, + Height = 82, FlowDirection = FlowDirection.LeftToRight, WrapContents = false, - Padding = new Padding(0, 20, 0, 0), - Margin = new Padding(0, 4, 0, 0) + Padding = new Padding(18, 16, 18, 14), + Margin = new Padding(0, 2, 0, 0), + BackColor = Theme.WindowBackground }; var footerRule = new Panel { Dock = DockStyle.Top, Height = 1, BackColor = Theme.Border, Margin = new Padding(0) }; - var saveButton = CreatePrimaryButton("", "Save", Theme.Accent); + var saveButton = CreatePrimaryButton("", "Save changes", Theme.Accent); var resetButton = CreateSecondaryButton("Reset"); saveButton.Margin = new Padding(0, 0, 10, 0); resetButton.Margin = new Padding(0, 0, 16, 0); @@ -1038,85 +1036,175 @@ private Panel BuildSettingsPage() return page; } - private static CardPanel CreateTitledCard(string title, int height, string? subtitle = null) + private static CardPanel CreateSettingsCard(int height) { - var card = new CardPanel { Dock = DockStyle.Top, Height = height, Margin = new Padding(0, 0, 0, 16) }; - - if (subtitle is not null) + return new CardPanel { - var subtitleLabel = new Label - { - Text = subtitle, - Font = new Font(Theme.BaseFont.FontFamily, 8.25f), - ForeColor = Theme.Muted, - AutoSize = true, - Dock = DockStyle.Top, - Margin = new Padding(0, 0, 0, 0) - }; - card.Controls.Add(subtitleLabel); - } + Dock = DockStyle.Top, + Height = height, + Margin = new Padding(0, 0, 0, 26), + Padding = new Padding(26, 22, 26, 24), + CardBackColor = Theme.Surface, + BorderColor = Color.FromArgb(222, 226, 232) + }; + } - var titleLabel = new Label + private static Panel CreateCardSpacer(int height = 18) + { + return new Panel { - Text = title, - Font = Theme.CardTitleFont, - ForeColor = Theme.Text, - AutoSize = true, Dock = DockStyle.Top, - Margin = new Padding(0, 0, 0, subtitle is null ? 12 : 2) + Height = height, + BackColor = Theme.WindowBackground }; - card.Controls.Add(titleLabel); - return card; } private static TableLayoutPanel CreateSettingsTable() { var table = new TableLayoutPanel { - Dock = DockStyle.Fill, + Dock = DockStyle.Top, ColumnCount = 2, - AutoSize = false, - Padding = new Padding(0, 24, 0, 0) + AutoSize = true, + AutoSizeMode = AutoSizeMode.GrowAndShrink, + Padding = new Padding(0), + BackColor = Theme.Surface }; - table.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 180)); + table.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 190)); table.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100)); return table; } + private static void AddSettingsCardHeader(TableLayoutPanel table, string title, string subtitle, int row) + { + table.RowStyles.Add(new RowStyle(SizeType.Absolute, 78)); + var header = new TableLayoutPanel + { + Dock = DockStyle.Fill, + ColumnCount = 1, + RowCount = 2, + Margin = new Padding(0), + BackColor = Theme.Surface + }; + header.RowStyles.Add(new RowStyle(SizeType.Absolute, 28)); + header.RowStyles.Add(new RowStyle(SizeType.Absolute, 30)); + header.Controls.Add(new Label + { + Text = title, + AutoSize = false, + Dock = DockStyle.Fill, + TextAlign = ContentAlignment.MiddleLeft, + Font = Theme.CardTitleFont, + ForeColor = Theme.Text, + BackColor = Theme.Surface, + Margin = new Padding(0) + }, 0, 0); + header.Controls.Add(new Label + { + Text = subtitle, + AutoSize = false, + Dock = DockStyle.Fill, + TextAlign = ContentAlignment.TopLeft, + Font = new Font(Theme.BaseFont.FontFamily, 9.25f), + ForeColor = Theme.Muted, + BackColor = Theme.Surface, + Margin = new Padding(0) + }, 0, 1); + + table.Controls.Add(header, 0, row); + table.SetColumnSpan(header, 2); + } + + private static void AddSettingsSectionHeader(TableLayoutPanel table, string text, int row) + { + table.RowStyles.Add(new RowStyle(SizeType.Absolute, 42)); + var header = new Label + { + Text = text, + AutoSize = false, + Dock = DockStyle.Fill, + TextAlign = ContentAlignment.MiddleLeft, + Font = new Font(Theme.BaseFont.FontFamily, 8.25f, FontStyle.Bold), + ForeColor = Theme.Accent, + BackColor = Theme.Surface, + Margin = new Padding(3, 10, 0, 6) + }; + table.Controls.Add(header, 0, row); + table.SetColumnSpan(header, 2); + } + private static void AddSettingsRow(TableLayoutPanel table, string label, Control field, int row) { - table.RowStyles.Add(new RowStyle(SizeType.Absolute, 40)); - table.Controls.Add(new Label { Text = label, AutoSize = true, Anchor = AnchorStyles.Left, ForeColor = Theme.Text, Margin = new Padding(3, 10, 16, 3) }, 0, row); - table.Controls.Add(field, 1, row); + table.RowStyles.Add(new RowStyle(SizeType.Absolute, 58)); + table.Controls.Add(CreateSettingsLabel(label), 0, row); + table.Controls.Add(field is CheckBox ? field : CreateCappedSettingsField(field), 1, row); + } + + private static Label AddReadOnlySettingsRow(TableLayoutPanel table, string label, int row) + { + var value = CreateReadOnlyValueLabel(); + AddSettingsRow(table, label, value, row); + return value; } private static void AddSettingsRowWithButton(TableLayoutPanel table, string label, Control field, Control button, int row) { - table.RowStyles.Add(new RowStyle(SizeType.Absolute, 40)); + AddSettingsRowWithButtons(table, label, field, new[] { button }, row); + } + + private static void AddSettingsRowWithButtons(TableLayoutPanel table, string label, Control field, IReadOnlyList buttons, int row) + { + table.RowStyles.Add(new RowStyle(SizeType.Absolute, 84)); - var inline = new TableLayoutPanel + var inline = new Panel { Dock = DockStyle.Fill, - ColumnCount = 2, - RowCount = 1, - AutoSize = false, - Margin = new Padding(0) + Margin = new Padding(0), + BackColor = Theme.Surface }; - inline.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100)); - inline.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize)); - field.Dock = DockStyle.Fill; - field.Margin = new Padding(3, 6, 8, 3); - button.Anchor = AnchorStyles.Right; - inline.Controls.Add(field, 0, 0); - inline.Controls.Add(button, 1, 0); + var fieldHost = CreateSettingsFieldHost(field); + fieldHost.Location = new Point(3, 8); + inline.Controls.Add(fieldHost); + + for (var i = 0; i < buttons.Count; i++) + { + buttons[i].Anchor = AnchorStyles.Top | AnchorStyles.Left; + buttons[i].AutoSize = false; + buttons[i].Size = new Size(buttons[i].Text == "Open" ? 110 : 150, 52); + buttons[i].MinimumSize = buttons[i].Size; + buttons[i].Margin = new Padding(0); + buttons[i].Location = new Point(0, 6); + inline.Controls.Add(buttons[i]); + } + + void LayoutInline() + { + var buttonWidth = buttons.Count * 10; + foreach (var button in buttons) + { + buttonWidth += button.Width; + } + var fieldWidth = Math.Min(700, Math.Max(420, inline.ClientSize.Width - buttonWidth - 16)); + fieldHost.Size = new Size(fieldWidth, 40); + + var x = fieldHost.Right + 10; + foreach (var button in buttons) + { + button.Location = new Point(x, 6); + x += button.Width + 10; + } + } + + inline.Resize += (_, _) => LayoutInline(); + LayoutInline(); - table.Controls.Add(new Label { Text = label, AutoSize = true, Anchor = AnchorStyles.Left, ForeColor = Theme.Text, Margin = new Padding(3, 10, 16, 3) }, 0, row); + table.Controls.Add(CreateSettingsLabel(label), 0, row); table.Controls.Add(inline, 1, row); } private static void AddHelperRow(TableLayoutPanel table, string text, int row) { - table.RowStyles.Add(new RowStyle(SizeType.Absolute, 24)); + table.RowStyles.Add(new RowStyle(SizeType.Absolute, 32)); var helper = new Label { Text = text, @@ -1124,10 +1212,200 @@ private static void AddHelperRow(TableLayoutPanel table, string text, int row) Dock = DockStyle.Fill, Font = new Font(Theme.BaseFont.FontFamily, 8.25f), ForeColor = Theme.Muted, - Margin = new Padding(3, 0, 12, 6) + BackColor = Theme.Surface, + Margin = new Padding(3, 0, 12, 12) + }; + table.Controls.Add(helper, 1, row); + } + + private static void AddStatusRow(TableLayoutPanel table, Label statusLabel, int row) + { + table.RowStyles.Add(new RowStyle(SizeType.Absolute, 54)); + statusLabel.AutoSize = false; + statusLabel.Dock = DockStyle.Fill; + statusLabel.TextAlign = ContentAlignment.MiddleLeft; + statusLabel.BackColor = Theme.Surface; + statusLabel.Margin = new Padding(3, 4, 12, 4); + table.Controls.Add(statusLabel, 1, row); + } + + private static CollapsibleActionRow AddActionRow(TableLayoutPanel table, string label, string helperText, IReadOnlyList buttons, int row) + { + var stacked = buttons.Count > 1; + var height = stacked ? 118 : 84; + var rowStyle = new RowStyle(SizeType.Absolute, height); + table.RowStyles.Add(rowStyle); + var labelControl = CreateSettingsLabel(label); + table.Controls.Add(labelControl, 0, row); + + var content = new TableLayoutPanel + { + Dock = DockStyle.Fill, + ColumnCount = stacked ? 1 : 3, + RowCount = stacked ? 2 : 1, + Margin = new Padding(0), + BackColor = Theme.Surface + }; + if (stacked) + { + content.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100)); + content.RowStyles.Add(new RowStyle(SizeType.Absolute, 36)); + content.RowStyles.Add(new RowStyle(SizeType.Absolute, 66)); + } + else + { + content.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 360)); + content.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize)); + content.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100)); + content.RowStyles.Add(new RowStyle(SizeType.Percent, 100)); + } + content.Controls.Add(new Label + { + Text = helperText, + AutoSize = false, + Dock = DockStyle.Fill, + TextAlign = ContentAlignment.MiddleLeft, + Font = new Font(Theme.BaseFont.FontFamily, 8.25f), + ForeColor = Theme.Muted, + BackColor = Theme.Surface, + Margin = new Padding(3, 0, stacked ? 12 : 18, 0) + }, 0, 0); + + var buttonFlow = new FlowLayoutPanel + { + Dock = DockStyle.Fill, + FlowDirection = FlowDirection.LeftToRight, + WrapContents = false, + BackColor = Theme.Surface, + Margin = new Padding(0), + Padding = new Padding(stacked ? 3 : 0, stacked ? 6 : 14, 0, 0), + AutoSize = true, + AutoSizeMode = AutoSizeMode.GrowAndShrink + }; + foreach (var button in buttons) + { + button.AutoSize = false; + button.Height = 52; + button.Padding = new Padding(14, 4, 14, 6); + var preferredWidth = TextRenderer.MeasureText(button.Text, button.Font).Width + 56; + var minimumWidth = string.Equals(button.Text, "Install Package Update", StringComparison.OrdinalIgnoreCase) + ? 230 + : button.Text.Length > 12 ? 170 : 140; + button.Width = Math.Clamp(preferredWidth, minimumWidth, 240); + button.Margin = new Padding(0, 0, 10, 0); + buttonFlow.Controls.Add(button); + } + content.Controls.Add(buttonFlow, stacked ? 0 : 1, stacked ? 1 : 0); + + table.Controls.Add(content, 1, row); + return new CollapsibleActionRow(rowStyle, labelControl, content, height); + } + + private static Label CreateSettingsLabel(string text) + { + return new Label + { + Text = text, + AutoSize = false, + Dock = DockStyle.Fill, + TextAlign = ContentAlignment.MiddleLeft, + ForeColor = Color.FromArgb(55, 65, 81), + Font = new Font(Theme.BaseFont.FontFamily, 9.25f, FontStyle.Bold), + BackColor = Theme.Surface, + Margin = new Padding(3, 0, 18, 0) + }; + } + + private static Label CreateReadOnlyValueLabel() + { + return new Label + { + Text = "", + AutoSize = false, + AutoEllipsis = true, + Dock = DockStyle.Fill, + TextAlign = ContentAlignment.MiddleLeft, + ForeColor = Theme.Text, + Font = new Font(Theme.BaseFont.FontFamily, 10f), + BackColor = Theme.FieldBackground, + Margin = new Padding(10, 0, 10, 0) }; - table.Controls.Add(helper, 0, row); - table.SetColumnSpan(helper, 2); + } + + private static Control CreateCappedSettingsField(Control field) + { + var host = CreateSettingsFieldHost(field); + if (field is NumericUpDown or ComboBox) + { + return host; + } + + var wrapper = new Panel + { + Dock = DockStyle.Fill, + BackColor = Theme.Surface, + Margin = new Padding(0) + }; + host.Width = 900; + host.MaximumSize = new Size(900, 40); + host.Anchor = AnchorStyles.Left | AnchorStyles.Top; + wrapper.Controls.Add(host); + return wrapper; + } + + private static Control CreateSettingsFieldHost(Control field) + { + var fixedWidth = field is NumericUpDown or ComboBox; + var host = new SettingsFieldHost + { + Dock = fixedWidth ? DockStyle.None : DockStyle.Top, + Anchor = fixedWidth ? AnchorStyles.Left : AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top, + Height = 40, + Size = fixedWidth ? new Size(field.Width + 22, 40) : new Size(0, 40), + MinimumSize = fixedWidth ? new Size(field.Width + 22, 40) : new Size(0, 40), + Margin = new Padding(3, 8, 12, 8) + }; + + field.Dock = DockStyle.Fill; + field.Margin = field is ComboBox or NumericUpDown + ? new Padding(10, 5, 8, 4) + : new Padding(10, 8, 10, 6); + + if (field is TextBox textBox) + { + textBox.BorderStyle = BorderStyle.None; + textBox.BackColor = Theme.FieldBackground; + } + else if (field is NumericUpDown numeric) + { + numeric.BorderStyle = BorderStyle.None; + numeric.BackColor = Theme.FieldBackground; + } + else if (field is ComboBox combo) + { + combo.FlatStyle = FlatStyle.Flat; + combo.BackColor = Theme.FieldBackground; + } + + host.Controls.Add(field); + return host; + } + + private static void StyleSettingsField(Control control) + { + control.Font = new Font(Theme.BaseFont.FontFamily, 10f); + control.ForeColor = Theme.Text; + control.BackColor = Theme.FieldBackground; + control.Margin = new Padding(0); + + if (control is TextBox textBox) + { + textBox.BorderStyle = BorderStyle.None; + } + else if (control is NumericUpDown numeric) + { + numeric.BorderStyle = BorderStyle.None; + } } private static string SafeDirectoryName(string path) @@ -1292,18 +1570,48 @@ private Panel BuildLogsPage() { var page = new Panel { BackColor = Theme.WindowBackground }; - var toolbar = new FlowLayoutPanel { Dock = DockStyle.Top, Height = 40, FlowDirection = FlowDirection.LeftToRight, Padding = new Padding(0, 0, 0, 8) }; - var refreshLogsButton = CreateIconButton(Glyphs.Refresh, "Refresh"); - var openFolderButton = CreateIconButton(Glyphs.OpenFolder, "Open Folder"); - var clearLogsButton = CreateIconButton("✕", "Clear (display only)"); - refreshLogsButton.Margin = new Padding(0, 0, 8, 0); + var toolbar = new TableLayoutPanel + { + Dock = DockStyle.Top, + Height = 72, + ColumnCount = 5, + RowCount = 1, + Padding = new Padding(0, 0, 0, 10), + BackColor = Theme.WindowBackground + }; + toolbar.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 66)); + toolbar.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 66)); + toolbar.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 78)); + toolbar.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 172)); + toolbar.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100)); + toolbar.RowStyles.Add(new RowStyle(SizeType.Percent, 100)); + + var openFolderButton = CreateIconButton(Glyphs.OpenFolder, "Open Logs"); + var changeLogPathButton = CreateIconButton(Glyphs.Edit, "Change log location"); + var clearLogsButton = CreateIconButton(Glyphs.Cancel, "Clear (display only)"); + foreach (var button in new[] { openFolderButton, changeLogPathButton, clearLogsButton }) + { + button.Size = new Size(58, 52); + button.MinimumSize = new Size(58, 52); + button.MaximumSize = new Size(58, 52); + } openFolderButton.Margin = new Padding(0, 0, 8, 0); - clearLogsButton.Margin = new Padding(0, 0, 16, 0); + changeLogPathButton.Margin = new Padding(0, 0, 8, 0); + clearLogsButton.Margin = new Padding(0, 0, 18, 0); - autoScrollCheckBox = new CheckBox { Text = "Auto-scroll", Checked = true, AutoSize = true, Margin = new Padding(0, 8, 16, 0) }; + autoScrollCheckBox = new CheckBox + { + Text = "Auto-scroll", + Checked = true, + AutoSize = true, + Anchor = AnchorStyles.Left, + BackColor = Theme.WindowBackground, + Margin = new Padding(0, 16, 16, 0), + MinimumSize = new Size(140, 24) + }; - refreshLogsButton.Click += async (_, _) => await RefreshLogsAsync(); openFolderButton.Click += (_, _) => OpenFolderFor(TryLoadSettings()?.LogPath); + changeLogPathButton.Click += async (_, _) => await ChangeLogLocationAsync(); clearLogsButton.Click += (_, _) => { logTextBox.Clear(); @@ -1315,19 +1623,20 @@ private Panel BuildLogsPage() Text = "", AutoSize = true, ForeColor = Theme.Muted, + AutoEllipsis = true, + Dock = DockStyle.Fill, TextAlign = ContentAlignment.MiddleRight, - Anchor = AnchorStyles.Right, - Margin = new Padding(8, 8, 0, 0) + Margin = new Padding(8, 10, 0, 0) }; - toolbar.Controls.Add(refreshLogsButton); - toolbar.Controls.Add(openFolderButton); - toolbar.Controls.Add(clearLogsButton); - toolbar.Controls.Add(autoScrollCheckBox); - toolbar.Controls.Add(logPathLabel); + toolbar.Controls.Add(openFolderButton, 0, 0); + toolbar.Controls.Add(changeLogPathButton, 1, 0); + toolbar.Controls.Add(clearLogsButton, 2, 0); + toolbar.Controls.Add(autoScrollCheckBox, 3, 0); + toolbar.Controls.Add(logPathLabel, 4, 0); - var statusBar = new Panel { Dock = DockStyle.Bottom, Height = 24, Padding = new Padding(0, 4, 0, 0) }; - logStatusLabel = new Label { Text = "", AutoSize = true, ForeColor = Theme.Muted, Dock = DockStyle.Left }; + var statusBar = new Panel { Dock = DockStyle.Bottom, Height = 34, Padding = new Padding(0, 7, 0, 0) }; + logStatusLabel = new Label { Text = "", AutoSize = false, AutoEllipsis = true, ForeColor = Theme.Muted, Dock = DockStyle.Fill }; statusBar.Controls.Add(logStatusLabel); var logCard = new CardPanel { Dock = DockStyle.Fill, Padding = new Padding(1), CardBackColor = Theme.LogBackground, BorderColor = Theme.LogBackground }; @@ -1376,40 +1685,114 @@ private async Task RefreshLogsAsync() logStatusLabel.Text = $"{lines.Count} lines - last refreshed {DateTime.Now:T}"; } + private async Task ChangeLogLocationAsync() + { + var current = TryLoadSettings(); + if (current is null) + { + MessageBox.Show(this, "Could not load existing settings.", "Change Log Location", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + + using var dialog = new SaveFileDialog + { + Title = "Select log file", + CheckFileExists = false, + OverwritePrompt = false, + FileName = Path.GetFileName(current.LogPath), + InitialDirectory = SafeDirectoryName(current.LogPath), + Filter = "Log files (*.log)|*.log|All files (*.*)|*.*" + }; + + if (dialog.ShowDialog(this) != DialogResult.OK) + { + return; + } + + var updated = new OvmsSettings + { + InstallDir = current.InstallDir, + DataDir = current.DataDir, + ModelRepositoryPath = current.ModelRepositoryPath, + ConfigPath = current.ConfigPath, + LogPath = dialog.FileName, + RestPort = current.RestPort, + GrpcPort = current.GrpcPort, + BindAddress = current.BindAddress, + LogLevel = current.LogLevel, + RunMode = current.RunMode, + StartAtLogin = current.StartAtLogin, + ShowTrayIcon = current.ShowTrayIcon, + ServiceAutoStart = current.ServiceAutoStart, + PackageVariant = current.PackageVariant + }; + try + { + await Task.Run(() => controller.SaveSettings(updated)); + } + catch (Exception ex) + { + MessageBox.Show(this, ex.Message, "Change Log Location", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + + logPathInput.Text = updated.LogPath; + logPathLabel.Text = updated.LogPath; + logStatusLabel.Text = "Log location saved."; + + var runtimeStatus = await Task.Run(controller.GetRuntimeStatus); + if (runtimeStatus.Running) + { + var result = MessageBox.Show(this, "The log path changed. Restart server to apply the new log location?", + "Restart required", MessageBoxButtons.YesNo, MessageBoxIcon.Question); + if (result == DialogResult.Yes) + { + await RunControlActionAsync("Restart", controller.Restart); + } + } + + await RefreshLogsAsync(); + } + // --------------------------------------------------------------- // Advanced // --------------------------------------------------------------- + private Label advancedInstallDirValue = null!; + private Label advancedDataDirValue = null!; + private Label advancedVersionValue = null!; + private Label advancedConfigPathValue = null!; + private Panel BuildAdvancedPage() { - var page = new Panel { BackColor = Theme.WindowBackground, AutoScroll = true }; - - var envCard = CreateTitledCard("Environment", 260); - var envLayout = new TableLayoutPanel { Dock = DockStyle.Fill, ColumnCount = 1, RowCount = 2, Padding = new Padding(0, 32, 0, 0) }; - envLayout.RowStyles.Add(new RowStyle(SizeType.Percent, 100)); - envLayout.RowStyles.Add(new RowStyle(SizeType.AutoSize)); + var page = new Panel { BackColor = Theme.WindowBackground, AutoScroll = true, Padding = new Padding(0, 0, 10, 0) }; + + var envCard = CreateSettingsCard(500); + var envLayout = CreateSettingsTable(); + var envRow = 0; + AddSettingsCardHeader(envLayout, "Environment", "Review the installed manager paths and the command OVMS will run.", envRow++); + AddSettingsSectionHeader(envLayout, "Paths and versions", envRow++); + advancedInstallDirValue = AddReadOnlySettingsRow(envLayout, "Install dir", envRow++); + advancedDataDirValue = AddReadOnlySettingsRow(envLayout, "Data dir", envRow++); + advancedVersionValue = AddReadOnlySettingsRow(envLayout, "Manager version", envRow++); + advancedConfigPathValue = AddReadOnlySettingsRow(envLayout, "Config path", envRow++); advancedTextBox = new TextBox { - Dock = DockStyle.Fill, - Multiline = true, + Anchor = AnchorStyles.Left | AnchorStyles.Right, ReadOnly = true, - ScrollBars = ScrollBars.Both, - WordWrap = false, - BackColor = Theme.WindowBackground, - BorderStyle = BorderStyle.FixedSingle, - Font = Theme.MonoFont + Font = Theme.MonoFont, + BackColor = Theme.FieldBackground, + ForeColor = Theme.Text }; - envLayout.Controls.Add(advancedTextBox, 0, 0); + StyleSettingsField(advancedTextBox); var copyButton = CreateSecondaryButton("Copy"); - copyButton.Margin = new Padding(0, 8, 0, 0); copyButton.Click += (_, _) => { try { - var settings = TryLoadSettings(); - var commandLine = settings is null ? "" : controller.EffectiveCommandLine(); + var commandLine = advancedTextBox.Text; if (!string.IsNullOrEmpty(commandLine)) { Clipboard.SetText(commandLine); @@ -1420,38 +1803,39 @@ private Panel BuildAdvancedPage() // Best effort; clipboard access can fail in restricted environments. } }; - envLayout.Controls.Add(copyButton, 0, 1); + + AddSettingsSectionHeader(envLayout, "Command", envRow++); + AddSettingsRowWithButton(envLayout, "Effective command line", advancedTextBox, copyButton, envRow++); envCard.Controls.Add(envLayout); - var maintenanceCard = CreateTitledCard("Maintenance", 170); - var buttonPanel = new FlowLayoutPanel { Dock = DockStyle.Top, AutoSize = true, Padding = new Padding(0, 32, 0, 0) }; - var repairButton = CreatePrimaryButton("", "Repair Package", Theme.Accent); + var maintenanceCard = CreateSettingsCard(450); + var maintenanceLayout = CreateSettingsTable(); + + var repairButton = CreateSecondaryButton("Repair Package"); var validateButton = CreateSecondaryButton("Validate Environment"); var exportButton = CreateSecondaryButton("Export Diagnostics"); - repairButton.Margin = new Padding(0, 0, 10, 0); - validateButton.Margin = new Padding(0, 0, 10, 0); repairButton.Click += async (_, _) => await RunAdvancedActionAsync("Repair", () => controller.Repair()); validateButton.Click += async (_, _) => await RunAdvancedActionAsync("Validate Environment", () => controller.ValidateEnvironment()); exportButton.Click += async (_, _) => await ExportDiagnosticsAsync(); - buttonPanel.Controls.Add(repairButton); - buttonPanel.Controls.Add(validateButton); - buttonPanel.Controls.Add(exportButton); + var maintenanceRow = 0; + AddSettingsCardHeader(maintenanceLayout, "Maintenance", "Repair the installation, validate the environment, or export a diagnostics bundle.", maintenanceRow++); + AddSettingsSectionHeader(maintenanceLayout, "Package tools", maintenanceRow++); + AddActionRow(maintenanceLayout, "Repair package", "Verify installed files and restore any that are missing or corrupt.", new[] { repairButton }, maintenanceRow++); + AddActionRow(maintenanceLayout, "Validate environment", "Check that ovms.exe and required files are present and runnable.", new[] { validateButton }, maintenanceRow++); + AddActionRow(maintenanceLayout, "Diagnostics", "Save a zip with settings, logs, versions, and runtime state.", new[] { exportButton }, maintenanceRow++); advancedStatusLabel = new Label { Text = "", ForeColor = Theme.Muted, - Font = new Font(Theme.SemiboldFont.FontFamily, 11f, FontStyle.Bold), - AutoSize = true, - Dock = DockStyle.Top, - Margin = new Padding(0, 14, 0, 0) + Font = new Font(Theme.SemiboldFont.FontFamily, 10.5f, FontStyle.Bold) }; + AddStatusRow(maintenanceLayout, advancedStatusLabel, maintenanceRow++); - maintenanceCard.Controls.Add(advancedStatusLabel); - maintenanceCard.Controls.Add(buttonPanel); + maintenanceCard.Controls.Add(maintenanceLayout); // Dock-Top stacking: add bottom-most visual element first (see // BuildShell comment for why this ordering yields correct results). @@ -1465,6 +1849,10 @@ private void RefreshAdvancedInfo() var settings = TryLoadSettings(); if (settings is null) { + advancedInstallDirValue.Text = "-"; + advancedDataDirValue.Text = "-"; + advancedVersionValue.Text = typeof(MainForm).Assembly.GetName().Version?.ToString() ?? "-"; + advancedConfigPathValue.Text = "-"; advancedTextBox.Text = "Settings unavailable."; return; } @@ -1479,17 +1867,11 @@ private void RefreshAdvancedInfo() commandLine = $"(error building command line: {ex.Message})"; } - var managerVersion = typeof(MainForm).Assembly.GetName().Version; - - advancedTextBox.Text = string.Join(Environment.NewLine, new[] - { - $"Install dir: {settings.InstallDir}", - $"Data dir: {controller.DataDir}", - $"Manager version: {managerVersion}", - "", - "Effective command line:", - commandLine - }); + advancedInstallDirValue.Text = settings.InstallDir; + advancedDataDirValue.Text = controller.DataDir; + advancedVersionValue.Text = typeof(MainForm).Assembly.GetName().Version?.ToString() ?? "-"; + advancedConfigPathValue.Text = settings.ConfigPath; + advancedTextBox.Text = commandLine; } private async Task RunAdvancedActionAsync(string title, Func action) @@ -1531,6 +1913,275 @@ private async Task ExportDiagnosticsAsync() MessageBox.Show(this, ex.Message, "Export Diagnostics", MessageBoxButtons.OK, MessageBoxIcon.Error); } } + + // --------------------------------------------------------------- + // Updates + // --------------------------------------------------------------- + + private Panel BuildUpdatesPage() + { + var page = new Panel { BackColor = Theme.WindowBackground, AutoScroll = true, Padding = new Padding(0, 0, 10, 0) }; + + var actionCard = CreateSettingsCard(320); + var actionLayout = CreateSettingsTable(); + + updatesCheckButton = CreateSecondaryButton("Check for Updates"); + updatesCheckButton.Click += async (_, _) => await CheckForUpdatesAsync(); + + updatesModelServerReleaseButton = CreateSecondaryButton("Model Server Notes"); + updatesModelServerReleaseButton.Enabled = false; + updatesModelServerReleaseButton.Click += (_, _) => OpenReleaseNotes(updatesModelServerReleaseUrl, "Model Server Release Notes"); + + updatesGenAiReleaseButton = CreateSecondaryButton("GenAI Notes"); + updatesGenAiReleaseButton.Enabled = false; + updatesGenAiReleaseButton.Click += (_, _) => OpenReleaseNotes(updatesGenAiReleaseUrl, "GenAI Release Notes"); + + var actionRow = 0; + AddSettingsCardHeader(actionLayout, "Update check", "Check for a newer compatible release. This will not download or install anything.", actionRow++); + AddSettingsSectionHeader(actionLayout, "Manual check", actionRow++); + AddActionRow(actionLayout, "Available updates", "Compare the package, Model Server, and GenAI versions with release metadata.", new[] { updatesCheckButton, updatesModelServerReleaseButton, updatesGenAiReleaseButton }, actionRow++); + updatesStatusLabel = new Label + { + Text = "Ready to check for updates.", + ForeColor = Theme.Muted, + Font = new Font(Theme.SemiboldFont.FontFamily, 10.5f, FontStyle.Bold) + }; + AddStatusRow(actionLayout, updatesStatusLabel, actionRow++); + + actionCard.Controls.Add(actionLayout); + + updatesBaseCard = CreateSettingsCard(360); + var baseLayout = CreateSettingsTable(); + var baseRow = 0; + AddSettingsCardHeader(baseLayout, "Base Package", "Installed package metadata and matching package release.", baseRow++); + AddSettingsSectionHeader(baseLayout, "Version details", baseRow++); + updatesBaseInstalledVersionValue = AddReadOnlySettingsRow(baseLayout, "Installed version", baseRow++); + updatesBaseLatestVersionValue = AddReadOnlySettingsRow(baseLayout, "Latest version", baseRow++); + updatesVariantValue = AddReadOnlySettingsRow(baseLayout, "Package variant", baseRow++); + updatesManagerVersionValue = AddReadOnlySettingsRow(baseLayout, "Manager version", baseRow++); + updatesBaseInstallButton = CreateSecondaryButton("Install Package Update"); + updatesBaseInstallButton.Click += async (_, _) => await InstallPackageUpdateAsync("Base Package"); + updatesBaseInstallRow = AddActionRow(baseLayout, "Install update", "Download, verify, stage, and replace the installed package.", new[] { updatesBaseInstallButton }, baseRow++); + updatesBaseCard.Controls.Add(baseLayout); + + updatesGenAiCard = CreateSettingsCard(260); + var genAiLayout = CreateSettingsTable(); + var genAiRow = 0; + AddSettingsCardHeader(genAiLayout, "GenAI", "OpenVINO GenAI backend bundled with this package.", genAiRow++); + AddSettingsSectionHeader(genAiLayout, "Version details", genAiRow++); + updatesGenAiInstalledVersionValue = AddReadOnlySettingsRow(genAiLayout, "Installed version", genAiRow++); + updatesGenAiLatestVersionValue = AddReadOnlySettingsRow(genAiLayout, "Latest version", genAiRow++); + updatesGenAiInstallButton = CreateSecondaryButton("Install Package Update"); + updatesGenAiInstallButton.Click += async (_, _) => await InstallPackageUpdateAsync("GenAI"); + updatesGenAiInstallRow = AddActionRow(genAiLayout, "Install update", "Install the matching package update so GenAI stays version-aligned.", new[] { updatesGenAiInstallButton }, genAiRow++); + updatesGenAiCard.Controls.Add(genAiLayout); + + updatesModelServerCard = CreateSettingsCard(260); + var modelServerLayout = CreateSettingsTable(); + var modelServerRow = 0; + AddSettingsCardHeader(modelServerLayout, "Model Server", "OpenVINO Model Server runtime bundled with this package.", modelServerRow++); + AddSettingsSectionHeader(modelServerLayout, "Version details", modelServerRow++); + updatesModelServerInstalledVersionValue = AddReadOnlySettingsRow(modelServerLayout, "Installed version", modelServerRow++); + updatesModelServerLatestVersionValue = AddReadOnlySettingsRow(modelServerLayout, "Latest version", modelServerRow++); + updatesModelServerInstallButton = CreateSecondaryButton("Install Package Update"); + updatesModelServerInstallButton.Click += async (_, _) => await InstallPackageUpdateAsync("Model Server"); + updatesModelServerInstallRow = AddActionRow(modelServerLayout, "Install update", "Install the matching package update so Model Server and dependencies stay aligned.", new[] { updatesModelServerInstallButton }, modelServerRow++); + updatesModelServerCard.Controls.Add(modelServerLayout); + + SetInstallRowsVisible(basePackage: false, modelServer: false, genAi: false); + + // Dock-Top stacking: add bottom-most visual element first. + page.Controls.Add(updatesModelServerCard); + page.Controls.Add(CreateCardSpacer(20)); + page.Controls.Add(updatesGenAiCard); + page.Controls.Add(CreateCardSpacer(20)); + page.Controls.Add(updatesBaseCard); + page.Controls.Add(CreateCardSpacer(20)); + page.Controls.Add(actionCard); + return page; + } + + private void RefreshUpdatesInfo() + { + try + { + var info = controller.GetPackageVersionInfo(); + updatesBaseInstalledVersionValue.Text = info.BasePackageVersion; + updatesBaseLatestVersionValue.Text = "-"; + updatesVariantValue.Text = info.PackageVariant; + updatesManagerVersionValue.Text = info.ManagerVersion; + updatesModelServerInstalledVersionValue.Text = info.ModelServerVersion; + updatesModelServerLatestVersionValue.Text = "-"; + updatesGenAiInstalledVersionValue.Text = info.GenAiVersion; + updatesGenAiLatestVersionValue.Text = "-"; + updatesStatusLabel.ForeColor = Theme.Muted; + updatesStatusLabel.Text = "Ready to check for updates."; + updatesModelServerReleaseUrl = ""; + updatesGenAiReleaseUrl = ""; + updatesModelServerReleaseButton.Enabled = false; + updatesGenAiReleaseButton.Enabled = false; + SetInstallRowsVisible(basePackage: false, modelServer: false, genAi: false); + } + catch (Exception ex) + { + updatesBaseInstalledVersionValue.Text = "-"; + updatesBaseLatestVersionValue.Text = "-"; + updatesVariantValue.Text = "-"; + updatesManagerVersionValue.Text = typeof(MainForm).Assembly.GetName().Version?.ToString() ?? "-"; + updatesModelServerInstalledVersionValue.Text = "-"; + updatesModelServerLatestVersionValue.Text = "-"; + updatesGenAiInstalledVersionValue.Text = "-"; + updatesGenAiLatestVersionValue.Text = "-"; + updatesStatusLabel.ForeColor = Theme.Danger; + updatesStatusLabel.Text = $"Cannot read package information: {ex.Message}"; + updatesModelServerReleaseUrl = ""; + updatesGenAiReleaseUrl = ""; + updatesModelServerReleaseButton.Enabled = false; + updatesGenAiReleaseButton.Enabled = false; + SetInstallRowsVisible(basePackage: false, modelServer: false, genAi: false); + } + } + + private async Task CheckForUpdatesAsync() + { + updatesCheckButton.Enabled = false; + updatesStatusLabel.ForeColor = Theme.Muted; + updatesStatusLabel.Text = "Checking for updates..."; + + try + { + var result = await controller.CheckForUpdatesAsync(); + updatesBaseInstalledVersionValue.Text = result.BasePackageVersion; + updatesBaseLatestVersionValue.Text = result.LatestBasePackageVersion; + updatesModelServerInstalledVersionValue.Text = result.ModelServerVersion; + updatesModelServerLatestVersionValue.Text = result.LatestModelServerVersion; + updatesGenAiInstalledVersionValue.Text = result.GenAiVersion; + updatesGenAiLatestVersionValue.Text = result.LatestGenAiVersion; + updatesVariantValue.Text = result.PackageVariant; + updatesModelServerReleaseUrl = result.ModelServerReleaseUrl; + updatesGenAiReleaseUrl = result.GenAiReleaseUrl; + updatesModelServerReleaseButton.Enabled = !string.IsNullOrWhiteSpace(updatesModelServerReleaseUrl); + updatesGenAiReleaseButton.Enabled = !string.IsNullOrWhiteSpace(updatesGenAiReleaseUrl); + SetInstallRowsVisible(result.BasePackageUpdateAvailable, result.ModelServerUpdateAvailable, result.GenAiUpdateAvailable); + updatesStatusLabel.ForeColor = result.UpdateAvailable + ? Theme.Warning + : result.LatestIsOlderThanInstalled ? Theme.Muted : Theme.Success; + updatesStatusLabel.Text = result.Message; + } + catch (Exception ex) + { + updatesStatusLabel.ForeColor = Theme.Danger; + updatesStatusLabel.Text = $"Cannot check for updates: {ex.Message}"; + updatesModelServerReleaseUrl = ""; + updatesGenAiReleaseUrl = ""; + updatesModelServerReleaseButton.Enabled = false; + updatesGenAiReleaseButton.Enabled = false; + SetInstallRowsVisible(basePackage: false, modelServer: false, genAi: false); + } + finally + { + updatesCheckButton.Enabled = true; + } + } + + private async Task InstallPackageUpdateAsync(string sectionName) + { + var result = MessageBox.Show(this, + $"{sectionName} updates are installed by replacing the matched OVMS Windows package as a unit. This keeps Base Package, Model Server, and GenAI versions aligned.{Environment.NewLine}{Environment.NewLine}Download and install the latest package now?", + "Install Package Update", + MessageBoxButtons.YesNo, + MessageBoxIcon.Question); + if (result != DialogResult.Yes) + { + return; + } + + SetUpdateInstallButtonsEnabled(false); + updatesStatusLabel.ForeColor = Theme.Muted; + updatesStatusLabel.Text = "Installing package update..."; + + try + { + var output = await Task.Run(controller.InstallPackageUpdate); + updatesStatusLabel.ForeColor = Theme.Success; + updatesStatusLabel.Text = "Package update installed."; + MessageBox.Show(this, string.IsNullOrWhiteSpace(output) ? "Package update installed." : output, "Install Package Update", MessageBoxButtons.OK, MessageBoxIcon.Information); + RefreshUpdatesInfo(); + } + catch (Exception ex) + { + updatesStatusLabel.ForeColor = Theme.Danger; + updatesStatusLabel.Text = "Package update failed."; + MessageBox.Show(this, ex.Message, "Install Package Update", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + finally + { + SetUpdateInstallButtonsEnabled(true); + } + } + + private void SetUpdateInstallButtonsEnabled(bool enabled) + { + updatesCheckButton.Enabled = enabled; + updatesBaseInstallButton.Enabled = enabled; + updatesModelServerInstallButton.Enabled = enabled; + updatesGenAiInstallButton.Enabled = enabled; + } + + private void SetInstallRowsVisible(bool basePackage, bool modelServer, bool genAi) + { + updatesBaseInstallRow.SetVisible(basePackage); + updatesModelServerInstallRow.SetVisible(modelServer); + updatesGenAiInstallRow.SetVisible(genAi); + + updatesBaseCard.Height = basePackage ? 444 : 360; + updatesModelServerCard.Height = modelServer ? 344 : 260; + updatesGenAiCard.Height = genAi ? 344 : 260; + } + + private void OpenReleaseNotes(string releaseUrl, string title) + { + if (string.IsNullOrWhiteSpace(releaseUrl)) + { + return; + } + + try + { + Process.Start(new ProcessStartInfo + { + FileName = releaseUrl, + UseShellExecute = true + }); + } + catch (Exception ex) + { + MessageBox.Show(this, ex.Message, title, MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } +} + +internal readonly struct CollapsibleActionRow +{ + private readonly RowStyle rowStyle; + private readonly Control label; + private readonly Control content; + private readonly float expandedHeight; + + public CollapsibleActionRow(RowStyle rowStyle, Control label, Control content, float expandedHeight) + { + this.rowStyle = rowStyle; + this.label = label; + this.content = content; + this.expandedHeight = expandedHeight; + } + + public void SetVisible(bool visible) + { + rowStyle.Height = visible ? expandedHeight : 0; + label.Visible = visible; + content.Visible = visible; + } } internal sealed class RuntimeIconButton : Button @@ -1606,7 +2257,7 @@ protected override void OnPaint(PaintEventArgs e) { e.Graphics.SmoothingMode = SmoothingMode.AntiAlias; e.Graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit; - e.Graphics.Clear(Theme.Surface); + e.Graphics.Clear(ResolveCanvasColor(this)); var buttonRect = new Rectangle(7, 6, Width - 14, Height - 13); if (pressed) @@ -1663,6 +2314,61 @@ private static GraphicsPath RoundedRect(Rectangle bounds, int radius) path.CloseFigure(); return path; } + + private static Color ResolveCanvasColor(Control control) + { + for (var current = control; current is not null; current = current.Parent) + { + if (current.BackColor != Color.Transparent && current.BackColor.A > 0) + { + return current.BackColor; + } + } + + return Theme.Surface; + } +} + +internal sealed class SettingsFieldHost : Panel +{ + public SettingsFieldHost() + { + BackColor = Theme.Surface; + Padding = new Padding(1); + SetStyle( + ControlStyles.AllPaintingInWmPaint | + ControlStyles.UserPaint | + ControlStyles.OptimizedDoubleBuffer | + ControlStyles.ResizeRedraw, + true); + } + + protected override void OnPaint(PaintEventArgs e) + { + e.Graphics.SmoothingMode = SmoothingMode.AntiAlias; + e.Graphics.Clear(Parent?.BackColor ?? Theme.Surface); + + var rect = new Rectangle(0, 0, Width - 1, Height - 1); + using var path = RoundedRect(rect, 7); + using var fillBrush = new SolidBrush(Theme.FieldBackground); + using var borderPen = new Pen(Theme.FieldBorder); + e.Graphics.FillPath(fillBrush, path); + e.Graphics.DrawPath(borderPen, path); + + base.OnPaint(e); + } + + private static GraphicsPath RoundedRect(Rectangle bounds, int radius) + { + var diameter = radius * 2; + var path = new GraphicsPath(); + path.AddArc(bounds.Left, bounds.Top, diameter, diameter, 180, 90); + path.AddArc(bounds.Right - diameter, bounds.Top, diameter, diameter, 270, 90); + path.AddArc(bounds.Right - diameter, bounds.Bottom - diameter, diameter, diameter, 0, 90); + path.AddArc(bounds.Left, bounds.Bottom - diameter, diameter, diameter, 90, 90); + path.CloseFigure(); + return path; + } } /// From dd2deb39684589733da6c42b6a4e454edd304a42 Mon Sep 17 00:00:00 2001 From: exzile Date: Wed, 1 Jul 2026 08:28:25 -0400 Subject: [PATCH 8/9] Add Windows manager update workflow Signed-off-by: exzile --- .../src/OVMS.Manager/OvmsController.cs | 254 ++++++++++++++++++ .../windows/manager/src/OVMS.Manager/Theme.cs | 32 ++- packaging/windows/scripts/upgrade-package.ps1 | 100 +++++++ 3 files changed, 373 insertions(+), 13 deletions(-) create mode 100644 packaging/windows/scripts/upgrade-package.ps1 diff --git a/packaging/windows/manager/src/OVMS.Manager/OvmsController.cs b/packaging/windows/manager/src/OVMS.Manager/OvmsController.cs index 7a2b0df68b..ffbbd4ed53 100644 --- a/packaging/windows/manager/src/OVMS.Manager/OvmsController.cs +++ b/packaging/windows/manager/src/OVMS.Manager/OvmsController.cs @@ -3,6 +3,7 @@ using System.Net.Http; using System.Net.Sockets; using System.Text.Json; +using System.Text.RegularExpressions; namespace OVMS.Manager; @@ -26,6 +27,42 @@ internal readonly struct HealthResult public string Message { get; init; } } +internal readonly struct PackageVersionInfo +{ + public string BasePackageVersion { get; init; } + public string ModelServerVersion { get; init; } + public string GenAiVersion { get; init; } + public string PackageVariant { get; init; } + public string ManagerVersion { get; init; } +} + +internal readonly struct UpdateCheckResult +{ + public string BasePackageVersion { get; init; } + public string LatestBasePackageVersion { get; init; } + public string ModelServerVersion { get; init; } + public string LatestModelServerVersion { get; init; } + public string GenAiVersion { get; init; } + public string LatestGenAiVersion { get; init; } + public string PackageVariant { get; init; } + public bool BasePackageUpdateAvailable { get; init; } + public bool ModelServerUpdateAvailable { get; init; } + public bool GenAiUpdateAvailable { get; init; } + public bool UpdateAvailable { get; init; } + public bool LatestIsOlderThanInstalled { get; init; } + public string ModelServerReleaseUrl { get; init; } + public string GenAiReleaseUrl { get; init; } + public string Message { get; init; } +} + +internal readonly struct ReleaseMetadata +{ + public string Version { get; init; } + public string Url { get; init; } + public string PackageUrl { get; init; } + public string Sha256Url { get; init; } +} + /// /// Pure logic layer for the Manager: settings persistence, process control, /// health checks and diagnostics. Contains no UI code so it can be safely @@ -46,6 +83,8 @@ internal sealed class OvmsController : IDisposable public string RuntimePath => Path.Combine(DataDir, "runtime.json"); + public string InstallMarkerPath => Path.Combine(DataDir, "install.json"); + public OvmsSettings LoadSettings() { if (!File.Exists(SettingsPath)) @@ -163,6 +202,86 @@ public string ValidateEnvironment() return RunPowerShell("validate-install.ps1", $"-InstallDir \"{settings.InstallDir}\"", includeDataDirArg: false); } + public PackageVersionInfo GetPackageVersionInfo() + { + var settings = LoadSettings(); + var versionOutput = GetOvmsVersionOutput(settings.InstallDir).Trim(); + var parsed = ParseVersionOutput(versionOutput); + var basePackageVersion = ReadInstallMarkerVersion(); + if (string.IsNullOrWhiteSpace(basePackageVersion) || string.Equals(basePackageVersion, "unknown", StringComparison.OrdinalIgnoreCase)) + { + basePackageVersion = parsed.ModelServerVersion; + } + + return new PackageVersionInfo + { + BasePackageVersion = string.IsNullOrWhiteSpace(basePackageVersion) ? "unknown" : FirstNonEmptyLine(basePackageVersion), + ModelServerVersion = string.IsNullOrWhiteSpace(parsed.ModelServerVersion) ? "unknown" : parsed.ModelServerVersion, + GenAiVersion = string.IsNullOrWhiteSpace(parsed.GenAiVersion) ? DetectGenAiSupport(settings.InstallDir) : parsed.GenAiVersion, + PackageVariant = settings.PackageVariant, + ManagerVersion = typeof(OvmsController).Assembly.GetName().Version?.ToString() ?? "unknown" + }; + } + + public async Task CheckForUpdatesAsync() + { + var packageInfo = GetPackageVersionInfo(); + var modelServerRelease = await GetLatestGitHubReleaseAsync("openvinotoolkit", "model_server").ConfigureAwait(false); + var genAiRelease = await GetLatestGitHubReleaseAsync("openvinotoolkit", "openvino.genai").ConfigureAwait(false); + + var baseUpdateAvailable = IsUpdateAvailable(packageInfo.BasePackageVersion, modelServerRelease.Version); + var modelServerUpdateAvailable = IsUpdateAvailable(packageInfo.ModelServerVersion, modelServerRelease.Version); + var genAiUpdateAvailable = IsUpdateAvailable(packageInfo.GenAiVersion, genAiRelease.Version); + var latestIsOlderThanInstalled = + IsInstalledNewerThanLatest(packageInfo.BasePackageVersion, modelServerRelease.Version) + || IsInstalledNewerThanLatest(packageInfo.ModelServerVersion, modelServerRelease.Version) + || IsInstalledNewerThanLatest(packageInfo.GenAiVersion, genAiRelease.Version); + var updateAvailable = baseUpdateAvailable || modelServerUpdateAvailable || genAiUpdateAvailable; + + return new UpdateCheckResult + { + BasePackageVersion = packageInfo.BasePackageVersion, + LatestBasePackageVersion = modelServerRelease.Version, + ModelServerVersion = packageInfo.ModelServerVersion, + LatestModelServerVersion = modelServerRelease.Version, + GenAiVersion = packageInfo.GenAiVersion, + LatestGenAiVersion = genAiRelease.Version, + PackageVariant = packageInfo.PackageVariant, + BasePackageUpdateAvailable = baseUpdateAvailable, + ModelServerUpdateAvailable = modelServerUpdateAvailable, + GenAiUpdateAvailable = genAiUpdateAvailable, + UpdateAvailable = updateAvailable, + LatestIsOlderThanInstalled = latestIsOlderThanInstalled, + ModelServerReleaseUrl = modelServerRelease.Url, + GenAiReleaseUrl = genAiRelease.Url, + Message = updateAvailable + ? "Update available." + : latestIsOlderThanInstalled ? "Installed version is newer than the latest stable release." : "Up to date." + }; + } + + public string InstallPackageUpdate() + { + var settings = LoadSettings(); + var release = GetLatestGitHubReleaseAsync("openvinotoolkit", "model_server", settings.PackageVariant).GetAwaiter().GetResult(); + if (string.IsNullOrWhiteSpace(release.PackageUrl)) + { + throw new InvalidOperationException($"No Windows package asset found for variant '{settings.PackageVariant}' in the latest Model Server release."); + } + + var args = string.Join(' ', new[] + { + $"-InstallDir \"{settings.InstallDir}\"", + $"-DataDir \"{DataDir}\"", + $"-PackageUrl \"{release.PackageUrl}\"", + string.IsNullOrWhiteSpace(release.Sha256Url) ? "" : $"-Sha256Url \"{release.Sha256Url}\"", + $"-Version \"{release.Version}\"", + $"-PackageVariant \"{settings.PackageVariant}\"" + }.Where(arg => !string.IsNullOrWhiteSpace(arg))); + + return RunPowerShell("upgrade-package.ps1", args, includeDataDirArg: false); + } + public async Task CheckHealthAsync() { var settings = LoadSettings(); @@ -355,6 +474,141 @@ private static string GetOvmsVersionOutput(string installDir) } } + private string ReadInstallMarkerVersion() + { + if (!File.Exists(InstallMarkerPath)) + { + return ""; + } + + try + { + using var doc = JsonDocument.Parse(File.ReadAllText(InstallMarkerPath)); + return doc.RootElement.TryGetProperty("version", out var versionEl) ? versionEl.GetString() ?? "" : ""; + } + catch + { + return ""; + } + } + + private static (string ModelServerVersion, string GenAiVersion) ParseVersionOutput(string versionOutput) + { + var modelServerVersion = ""; + var genAiVersion = ""; + + foreach (var line in versionOutput.Split(new[] { "\r\n", "\n" }, StringSplitOptions.RemoveEmptyEntries).Select(l => l.Trim())) + { + if (line.StartsWith("OpenVINO Model Server", StringComparison.OrdinalIgnoreCase)) + { + modelServerVersion = line; + } + else if (line.StartsWith("OpenVINO GenAI backend", StringComparison.OrdinalIgnoreCase)) + { + genAiVersion = line; + } + } + + return (modelServerVersion, genAiVersion); + } + + private static string DetectGenAiSupport(string installDir) + { + return File.Exists(Path.Combine(installDir, "openvino_genai.dll")) ? "Installed" : "Missing"; + } + + private async Task GetLatestGitHubReleaseAsync(string owner, string repo, string? packageVariant = null) + { + using var request = new HttpRequestMessage(HttpMethod.Get, $"https://api.github.com/repos/{owner}/{repo}/releases/latest"); + request.Headers.UserAgent.ParseAdd("OVMS-Manager"); + + using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(10)); + using var response = await httpClient.SendAsync(request, cts.Token).ConfigureAwait(false); + response.EnsureSuccessStatusCode(); + + var body = await response.Content.ReadAsStringAsync(cts.Token).ConfigureAwait(false); + using var doc = JsonDocument.Parse(body); + var root = doc.RootElement; + var tag = root.TryGetProperty("tag_name", out var tagEl) ? tagEl.GetString() ?? "" : ""; + var htmlUrl = root.TryGetProperty("html_url", out var urlEl) ? urlEl.GetString() ?? "" : ""; + var packageUrl = ""; + var sha256Url = ""; + + if (!string.IsNullOrWhiteSpace(packageVariant) && root.TryGetProperty("assets", out var assets) && assets.ValueKind == JsonValueKind.Array) + { + foreach (var asset in assets.EnumerateArray()) + { + var name = asset.TryGetProperty("name", out var nameEl) ? nameEl.GetString() ?? "" : ""; + var url = asset.TryGetProperty("browser_download_url", out var assetUrlEl) ? assetUrlEl.GetString() ?? "" : ""; + if (name.StartsWith("ovms_windows_", StringComparison.OrdinalIgnoreCase) + && name.EndsWith($"_{packageVariant}.zip", StringComparison.OrdinalIgnoreCase)) + { + packageUrl = url; + } + else if (name.StartsWith("ovms_windows_", StringComparison.OrdinalIgnoreCase) + && (name.EndsWith($"_{packageVariant}.zip.sha256", StringComparison.OrdinalIgnoreCase) + || name.EndsWith($"_{packageVariant}.sha256", StringComparison.OrdinalIgnoreCase))) + { + sha256Url = url; + } + } + } + + return new ReleaseMetadata + { + Version = string.IsNullOrWhiteSpace(tag) ? "unknown" : tag, + Url = htmlUrl, + PackageUrl = packageUrl, + Sha256Url = sha256Url + }; + } + + private static bool IsUpdateAvailable(string installed, string latest) + { + return CompareVersionStrings(NormalizeVersion(installed), NormalizeVersion(latest)) < 0; + } + + private static bool IsInstalledNewerThanLatest(string installed, string latest) + { + return CompareVersionStrings(NormalizeVersion(installed), NormalizeVersion(latest)) > 0; + } + + private static string FirstNonEmptyLine(string value) + { + return value.Split(new[] { "\r\n", "\n" }, StringSplitOptions.None) + .Select(line => line.Trim()) + .FirstOrDefault(line => !string.IsNullOrWhiteSpace(line)) ?? "unknown"; + } + + private static string NormalizeVersion(string value) + { + var match = Regex.Match(value, @"\d+(?:\.\d+)+(?:[.-][A-Za-z0-9]+)*"); + return match.Success ? match.Value.TrimStart('v', 'V') : ""; + } + + private static int CompareVersionStrings(string installed, string latest) + { + if (string.IsNullOrWhiteSpace(installed) || string.IsNullOrWhiteSpace(latest)) + { + return 0; + } + + var installedParts = Regex.Matches(installed, @"\d+").Select(m => int.Parse(m.Value)).ToArray(); + var latestParts = Regex.Matches(latest, @"\d+").Select(m => int.Parse(m.Value)).ToArray(); + var length = Math.Max(installedParts.Length, latestParts.Length); + for (var i = 0; i < length; i++) + { + var installedPart = i < installedParts.Length ? installedParts[i] : 0; + var latestPart = i < latestParts.Length ? latestParts[i] : 0; + if (installedPart != latestPart) + { + return installedPart.CompareTo(latestPart); + } + } + + return 0; + } + private string RunPowerShell(string scriptName, string? extraArgs = null, bool includeDataDirArg = true) { var scriptPath = Path.Combine(AppDir, "scripts", scriptName); diff --git a/packaging/windows/manager/src/OVMS.Manager/Theme.cs b/packaging/windows/manager/src/OVMS.Manager/Theme.cs index 7d9949c403..16691c80bf 100644 --- a/packaging/windows/manager/src/OVMS.Manager/Theme.cs +++ b/packaging/windows/manager/src/OVMS.Manager/Theme.cs @@ -15,6 +15,8 @@ internal static class Theme public static readonly Color Text = ColorTranslator.FromHtml("#1F2937"); public static readonly Color Muted = ColorTranslator.FromHtml("#6B7280"); public static readonly Color Border = ColorTranslator.FromHtml("#E5E7EB"); + public static readonly Color FieldBorder = ColorTranslator.FromHtml("#CBD5E1"); + public static readonly Color FieldBackground = ColorTranslator.FromHtml("#F8FAFC"); public static readonly Color Success = ColorTranslator.FromHtml("#16A34A"); public static readonly Color Danger = ColorTranslator.FromHtml("#DC2626"); public static readonly Color Warning = ColorTranslator.FromHtml("#D97706"); @@ -74,18 +76,22 @@ public static Font IconFont(float size = 13f) /// internal static class Glyphs { - public const string Dashboard = ""; // Home - public const string Settings = ""; // Settings gear - public const string Logs = ""; // Diagnostic - public const string Advanced = ""; // Repair/tools (Build) + public const string Dashboard = "\uE80F"; // Home + public const string Settings = "\uE713"; // Settings gear + public const string Logs = "\uE9D9"; // Diagnostic + public const string Advanced = "\uE90F"; // Repair/tools (Build) + public const string Update = "\uE895"; // Download/update - public const string Play = ""; // Play - public const string Stop = ""; // Stop - public const string Restart = ""; // Sync/restart - public const string Refresh = ""; // Refresh - public const string OpenFolder = ""; // OpenFolderHorizontal - public const string Repair = ""; // Repair/build tools - public const string Save = ""; // Save - public const string Health = ""; // HealthSolid - public const string Export = ""; // Export + public const string Play = "\uE768"; // Play + public const string Stop = "\uE71A"; // Stop + public const string Restart = "\uE777"; // Sync/restart + public const string Refresh = "\uE72C"; // Refresh + public const string OpenFolder = "\uE838"; // OpenFolderHorizontal + public const string Edit = "\uE70F"; // Edit + public const string Cancel = "\uE711"; // Cancel + public const string Repair = "\uE90F"; // Repair/build tools + public const string Save = "\uE74E"; // Save + public const string Health = "\uEB51"; // HealthSolid + public const string Export = "\uEDE1"; // Export } + diff --git a/packaging/windows/scripts/upgrade-package.ps1 b/packaging/windows/scripts/upgrade-package.ps1 new file mode 100644 index 0000000000..6733e6b1ae --- /dev/null +++ b/packaging/windows/scripts/upgrade-package.ps1 @@ -0,0 +1,100 @@ +param( + [Parameter(Mandatory = $true)][string]$InstallDir, + [Parameter(Mandatory = $true)][string]$DataDir, + [Parameter(Mandatory = $true)][string]$PackageUrl, + [string]$Sha256Url = "", + [Parameter(Mandatory = $true)][string]$Version, + [string]$PackageVariant = "python_on" +) + +$ErrorActionPreference = "Stop" + +$downloadsDir = Join-Path $DataDir "downloads" +$packagesDir = Join-Path $DataDir "packages" +$stagingRoot = Join-Path $packagesDir "staging" +$backupRoot = Join-Path $packagesDir "backup" +$safeVersion = ($Version -replace '[^A-Za-z0-9._-]', '_') +$stagingDir = Join-Path $stagingRoot $safeVersion +$backupDir = Join-Path $backupRoot ("{0}-{1}" -f $safeVersion, (Get-Date -Format "yyyyMMdd-HHmmss")) +$zipPath = Join-Path $downloadsDir ([IO.Path]::GetFileName(([Uri]$PackageUrl).AbsolutePath)) +$shaPath = if ($Sha256Url) { Join-Path $downloadsDir ([IO.Path]::GetFileName(([Uri]$Sha256Url).AbsolutePath)) } else { "" } + +New-Item -ItemType Directory -Force -Path $downloadsDir, $packagesDir, $stagingRoot, $backupRoot | Out-Null + +Write-Host "[INFO] Downloading package: $PackageUrl" +Invoke-WebRequest -Uri $PackageUrl -OutFile $zipPath -UseBasicParsing + +if ($Sha256Url) { + Write-Host "[INFO] Downloading checksum: $Sha256Url" + Invoke-WebRequest -Uri $Sha256Url -OutFile $shaPath -UseBasicParsing + $expected = ((Get-Content $shaPath -Raw) -split '\s+')[0].Trim().ToLowerInvariant() + $actual = (Get-FileHash -Algorithm SHA256 -Path $zipPath).Hash.ToLowerInvariant() + if ($expected -and $actual -ne $expected) { + throw "SHA256 mismatch. Expected $expected but got $actual." + } + Write-Host "[INFO] SHA256 verified." +} + +if (Test-Path $stagingDir) { + Remove-Item -Recurse -Force -Path $stagingDir +} +New-Item -ItemType Directory -Force -Path $stagingDir | Out-Null + +Write-Host "[INFO] Extracting package to staging: $stagingDir" +Expand-Archive -Path $zipPath -DestinationPath $stagingDir -Force + +$stagedOvms = Get-ChildItem -Path $stagingDir -Recurse -Filter "ovms.exe" | Select-Object -First 1 +if (-not $stagedOvms) { + throw "Staged package does not contain ovms.exe." +} +$sourceDir = $stagedOvms.Directory.FullName + +Write-Host "[INFO] Validating staged ovms.exe." +$versionOutput = & $stagedOvms.FullName --version 2>&1 +if ($LASTEXITCODE -ne 0) { + throw "Staged ovms.exe --version failed: $versionOutput" +} + +$runtimePath = Join-Path $DataDir "runtime.json" +$wasRunning = $false +if (Test-Path $runtimePath) { + try { + $runtime = Get-Content $runtimePath -Raw | ConvertFrom-Json + if ($runtime.pid) { + $process = Get-Process -Id ([int]$runtime.pid) -ErrorAction SilentlyContinue + $wasRunning = $process -and $process.ProcessName -ieq "ovms" + } + } catch { + $wasRunning = $false + } +} + +& (Join-Path $PSScriptRoot "stop-ovms.ps1") -DataDir $DataDir + +Write-Host "[INFO] Backing up current install to: $backupDir" +New-Item -ItemType Directory -Force -Path $backupDir | Out-Null +Get-ChildItem -LiteralPath $InstallDir -Force | + Where-Object { $_.Name -notlike "unins*" -and $_.Name -notin @("OVMS.Manager.exe", "OVMS.Manager.pdb", "scripts", "templates") } | + ForEach-Object { + Copy-Item -LiteralPath $_.FullName -Destination (Join-Path $backupDir $_.Name) -Recurse -Force + } + +Write-Host "[INFO] Applying staged package." +Copy-Item -Path (Join-Path $sourceDir "*") -Destination $InstallDir -Recurse -Force + +$installedOvms = Join-Path $InstallDir "ovms.exe" +$installedVersionOutput = & $installedOvms --version 2>&1 +if ($LASTEXITCODE -ne 0) { + Write-Warning "Installed ovms.exe validation failed. Restoring backup." + Copy-Item -Path (Join-Path $backupDir "*") -Destination $InstallDir -Recurse -Force + throw "Installed ovms.exe --version failed after upgrade: $installedVersionOutput" +} + +& (Join-Path $PSScriptRoot "configure-ovms.ps1") -InstallDir $InstallDir -DataDir $DataDir -PackageVariant $PackageVariant | Out-Host + +if ($wasRunning) { + & (Join-Path $PSScriptRoot "start-ovms.ps1") -DataDir $DataDir +} + +Write-Host "[INFO] Upgrade complete." +Write-Host $installedVersionOutput From 23752ee5de61197f57704ca26742d5171af8dbba Mon Sep 17 00:00:00 2001 From: exzile Date: Wed, 1 Jul 2026 08:49:29 -0400 Subject: [PATCH 9/9] docs: add OVMS Manager screenshots (dashboard, settings, logs, advanced, updates) Co-Authored-By: Claude Opus 4.8 Signed-off-by: exzile --- .../manager/docs/screenshots/01-dashboard.png | Bin 0 -> 66462 bytes .../manager/docs/screenshots/02-settings.png | Bin 0 -> 83085 bytes .../manager/docs/screenshots/03-logs.png | Bin 0 -> 286023 bytes .../manager/docs/screenshots/04-advanced.png | Bin 0 -> 86190 bytes .../manager/docs/screenshots/05-updates.png | Bin 0 -> 87641 bytes 5 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 packaging/windows/manager/docs/screenshots/01-dashboard.png create mode 100644 packaging/windows/manager/docs/screenshots/02-settings.png create mode 100644 packaging/windows/manager/docs/screenshots/03-logs.png create mode 100644 packaging/windows/manager/docs/screenshots/04-advanced.png create mode 100644 packaging/windows/manager/docs/screenshots/05-updates.png diff --git a/packaging/windows/manager/docs/screenshots/01-dashboard.png b/packaging/windows/manager/docs/screenshots/01-dashboard.png new file mode 100644 index 0000000000000000000000000000000000000000..acfbd1a437fa37257607c1b755b7b9c23be736c2 GIT binary patch literal 66462 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

7rn6J( z-3I?6R4}mCf440v{i$^Ky5PnKL4_~^MQ~K}6If_9Gr_Ge*r>U6dR=8!N&GhGT`R4z z$2_&Fo7d#7wl~r8snYReG}_%%4a&o#-RNOM!r?fdJ59La4Gf$QK*O5Gfx2-}zGsqM zg63}6G9X&G{!bK!P-g3Y7!zIByif`G)7?1I`@g7b>u_z-tUT+gCz)Hw9{Q=U^HsKW zygHFNTq#C(>t=A5Jk_5zNY!~Z>!n5Ywteb*Uj*sqprRf}oB9V-HjGtQVM`5DP47qE zd6Q4t#yibSd*+(wG)Kq_wu0r7aR-D|-gssoh)#d1uU_qJ3&+UMimS&7m8=%0-hZ7> zSeu8E2vBD&JB(ZWY*tcr_1br4*hw<;p1mGfwx@r@o}_|L>j&PUmfvMk)@gj=K#n``M{L`%S=j z2{4H@0OXvq5Sa8JxnDYxt2sBirY#C*>KI4%Y>nFN0&KscU}ga4LzPCA`_FJ&4==%h zgrZQ6+jleJA)Gq;s*kA4Li5y2)eeQR{F)dwtax`Gu2SOA_FDW&=`a-O80ZE`ZT{2j zp{}sTTotl^gYy9y-{!hksbBdvBVY7BgW)u&>3l1koyjSv&ifPAwE_BYt5ra?d~yu9 zY}({o!b*_z2N`}qVcQ-}vVh0AWwx{gsl7dfdUL`odth%sUQqXN)i8Nh>l0@uvAC+x24zp0226bKl)3DU_^wUh!)M&qt~q`vl#`f0yxVHB*J zTw`6npg5lA`~QmV4lVVLjyKL0FL;qxju}M#7qCsOq?5@l#2o*h?X0MX&h@{XluUj3 zR9Ec;C070T@U*Yjt?at_6|-|phrSMTalg1aVT{aJ%H_>$6Q<*pn+e!Ki%a4!*UH>n zY4H^SCJah6;tBY)KblHs=hq%gwtSEtrM#IVxE&h1NjRN}ZfXq=X@?5y;r$S=MlC(H zVd8ca)6wU-rgTQ72@@-61Q$V2ns9HAgtJR9KfzTLXD>*mj2@ip>I zrdvbEMv-|^$2+-9>_tvm#Uc6RGPKZr9snO31tTX*G@67ac`dAiQRX};%l;oj7yXW#2t`*n0)hAyglyEyKlWHqpZ z+GzX7_$LDZVF|d5R0-=xta*rO)RT~xV=$O%CJ6d;9Wspk-qhv&glNmFE%7ltlNmWB zR1_F3&Tm`%E{5BY=gU6BnKOk`{iD`wq)D0os&ChVthE1ff#iwSs@A~wI0O5vQ4`*@ zxV=7<#bwHjg*iHxdc=7udcmbRnHj6`t2og(gH6KJv%y7>^I@z>aoH^8st|&Nc8-5= zPQ!_W^vbj?})Vawl#l3n~o@FGF!BrB~gF@6C2x%DX&E4=arMcc>j=Lil zZ^Xb|;^BS#bhIxC$U2J|7bTbcdXGd8D1bDqCxT824ZaaOAF`LQ(x zIP!w`tR>UN`0J1SgveLm26AnTlJmG{(rxJ6;kTmTit4$lPT#JVTlwbZmlLhpH^!Ws zANDCETfGsn`AMfj{%q=j;BzkOTI=q(e|oDJ@OXxJ1`YJKVM?p zReKhC*LPGev@Mah?(8ar|y#uh$gX z7N|eFb%g1`B^^v&Onx~;FnyIBm%^#f;j=vij^-UB&Kqo{ z9XR9hun<>Sx>&fg%5yEkQB6Z&Go$_Xca~&R((_F7r_oBk>TqLzU`%V@UEkcSv*O*} zt)c-oQ|KLmAvTOX6B^l}I^5ERH8uY;h2`|6&<(~2!w9oT(NfTE}< zSlq;bG)zTV0)V<+4Iirpd!Bp-HU@~f?}~XEM>jUu$v}QCu_^TIy`S$ChigGrYx|Iy z)H|iTQuS;sCIsG;ZAw9ViP0uXBrNND#cp5YYZUwvzN`f5& zUuoDpmgP*wA7;IFNjHQ*b3gb&WYL9LR*5}r+5ug=0o_`~psN4R;Su3f|14qs=^JJ@ z;9-<`Nn`^%}*HH#Ce;=IffV1ou#rdqx%x9DWHQYV;XJ;4JHQdPerPO$) zJ^DN&OI#bjGL^sj2zN6>h-xn~jx~~jv-d8$iWR?#OV3-DI-!jMr`xiiHVzrSw(r^( z!$t!u+68VM?M#lE&|re;5ax4{rNId>GxKL0_&%2jnbE)GO;@YIp*y+v-z{E}x)J{t zl{NX)QgoR8_AhSN|E=?tUeWa8H2*d=6}}Lcb6Xk2ZXN8?A%<6DZ^1ku24#<6@RO@o zwm$NY?Q?r+j)0LI5Xhd~xE2A~CT>pCcMeJc;4RI@ z*{DtTFTqTPat<(0z_Z1xRp_|=^SFvh&x~DJyz}F|{jjtD!jj>1}Nvz5x z+7R~jGi2C^DilgHz(!pbgdO<02_Cl9Aw}YJ2v|-bi5{ zaH^tn7Ni~Hlh7W zeZ5+U3)ku7D;f*}mUw!0QBrks8LBmqw9I$E)>^_!XNRU!5AJx`wXN+Swg!_Cv3AM6 z^(f+Y&!%Sr___gu8RHTbGIy4<)A+9EHR)9WW>v2M3@PyRn#gU(Blg_OXznjK9w2yW z`KP{f=vw;bpuX0e=p|fY&RyDuXOv{T6eiRMC)UAm4W1L-O%{3OFa;hG$ls-X0he|0 zUDu&tjr`%~W!@B$w&!cXSX!;$G40k@-6h=wuceD9>}3G}5x1=Q`3iuZpp>{pZXB%L zc)F1YhFZ3DA|%X!(Op4->Vuf1_f`ozpL1ax#xwJq@9a+}={0#VfA^qg-NV~qOKZB% zMAF}yUkB~TwH$@95owiorqNrUip(N)6WmR57q%htOEAm)q1_=ZL~HBZl3z{63cw8t zdS0(~{Ny~VETrLPhLY#YycoG3k=u=$&3x=rtwRR$?eS}w`F8ll&tUMI!A}!R=0+!Z zYmL}Agundn7Gdw-9-Hf6bjrbazwPM&#_0zy=d1bD>%;z=!5mlyM;sWfC9mvPq$R)g zuU}BZTy|LW*602lqruu4lDI7)HiQDt)(t)!=MadG-jqzvOb1 zAe&$bxN^HTdi{$n0P4+i9&dk|!A>&lb)mKYYL`jW`?(uW^3lO=VvQbW{k|$NU=GUw zj;&=4fH`4?J9t}W2LCpjI2(W^1;(Gq^pxK-djbwsrDhSWwC#VnDCA%&az~5c{xd9@ z#s8*%X1GF99=P8@{`a0G7HXT)k_;HFt?Ns^O#mFQ{hbn=I{$H1k;m0UW`Ji#y6>{y zg0!Szlp}VDzsX&0hY0!so%tvM^N!XqMX2VCj|#+s@t!rGh=ND>_(IA?2I};lC#;(h z^(#xk9d_F~-qabDA5E@L&V`qtYA8xtycAmtlw;}B$^`^^ikYKBzI{UCKp*m6^N#h` zof(Mfy~T!u_{@z_A%x(BXU*lMAkk);~bcI3q9GT1TVvBrKOM^&q80 zR?f9Mvc=?f<8eG^yOR>&(r{{=b2m(tR}-_0Uh9>|&n3)D9>#sZ-(jq5xR%XTIWael zR+Vn4mh}%7<46mxz?m@IZJE5MW9hJzM>@vrW=S3!eH|I%8}j5;s%28ky_1}bS6t)j zu)qgkP;xD&!4~H3(6+6|$G82G`5`_iZ+%DT;o>;fLsSELdsK1G;0=H}&Nt^b3u~r{ zM4KJG-Y7UA4;-&!FSBio&hYmni3d~Nv>U#!SO5tUS5~qPL^qNVk~rG7Lohbdg$eYt z8qHyk6D;X2@B)Wz&f8(Ekqk919lwkO%?8`x^d|uWttM)D;Ln)dCKD#)5B#A1W#b` zNgMEO!FG);Bv(s15${*QeKD+o4pDH^Zc_Az5AU=76G(p33x>-AE?wG_y4vTS!el-D zm2>io{{;6mQ|NyU)*R7MvR4BdQ#w6P6Bq~Z^fWExHd9vF2kx#hN>T?IGi*|#pJ#1% z$ggxUiL}ax=SdIB4HIXYHnx=32ud7{D)UH>vc)}sc;&L6?;tT3ul?aUjM0=c1mml3 zIHJv|s)X}pmx`zQ+OK$D|h+v1Tiu-ku>14 zEH=ABl0j>H-@3?$-cFm-4|O7*#&2Gj?>XR2$7lYL+;UHoU*s24TUhA4{52}7^bHAy z1#f||PkOm_PZ9Syzw0&G7C&9yCZS;KP4b)n&(4`4qd?ge)U1g-3h~ ztdWOjwwc<#ShEWnxaOr*(QBHOL(-QwA)CGNqkn9@Z=Z28!h1S8eF`~>&{8UF*>3PF z6$UY@uAD%z-~Suo+OoLa+auL}t@$wjr2UF01CKRDC;Gfi1xLWCmd(u~y1fr{%!_BA za(8C`aOt*i@XT^)FkeBol*<_?m93?hmmTR1xN6d{(Sq#8v5odG&t|h7ZAf!n8VyJ7 z-Ba1H>81eaCjRDa?EUa!bi^y@HDxp{oAmhBaJi&%XZR87PE&_O#hUr5)w)w7mT;A8 z3(qiYbk^Q2hx4TU@DhStGG$AFz2ch2J;h)q?3>rrylcv18CLq)83j1s`gwPidihpE zEAaTohZAiYP~I^p^5rNxPL(8n5L3h*wB(b;x7UP;qfPvu1fNR06qWW!XReabqq-Ro zH5#Qs&#tOC5MiHO4FbRPrw?r6d=r(GmoYD);kjt}T-y=R$f-Kt{j0d6aUMO*>&MVU zM~}t%P8uOIrXaTok*WOEYzMoh|9tjYIe#jb}Bw7_F0h9*!haOI5r&kPpr>`Xml z8_eK0T!4+!U7SUbQDtMC51p=*=Anwk=q#r53S&T1a%L$ov006s6L!t7k!x}5OD@|X zopc{AUgK2%EZXGag;Vk1p|Tg_F;uc7EIjqV( z!C0>Pr%aXr82j(C^f&S=7jR3IhtiHm(|%4)s7MbgNv}_ICD%QTy1(8ibeZtX$eA99 zECqL82Q{Oc_G&jhMF<*}Bnmu_&&{qaN-AU>u=am|3fLQB_)Q;0OklPEeFRj3xXFu{ zvv35e)v-aM*}`ebtjwkB8K^<8QexaHetzm~n5qU=pZqgygTt{^M7$lSq?;pPTgFTQ zj3;Z|OLc{;i2X*P<@}gh*udJd`pX^z06iFzf}=eM%D^8W9_9Q|Q?~3#jsIT1hR`+$ zAQ#<*!L@+q8B4pG==IjDkv05pm4Ju$t2x5@5q#sV?4IA2Mb|S*t^qVbbNyJp|Eosf zgY|!eS^32sZOVqX?!(tot=V!)JRJIT+MP8G${Q;@ulP4_bi`+ECS$WWs=Ux|YXdaH zL~EnBNi$5W+m|rn+7FF!`@^ZEPjNcRb+7;Qwmr+_1ZZ%Zbu{#hF4oPsUc`3KQNZ;D zjTVG~&gB+^BOI`a^>V5%={_0^5&>YBu46`S<%VfqS7y@g&t|)>sj=J_{ZJ>4vh&-v z|7kq1RaOq5r?#gBt7k-;rDhJd+y)#6z~NY3A?ZlC4F6%=T^V0aOt1S2zcBRgYi@B! zj(}%l9~^SJ@8DgMg`5kYqArNH`GE*HX!B}dZ0&Sh`l1&G5`ICd&^^Uh!twmSDqsX$ISlQ2v zexPgq-12Evypc*XtV!NqkR2$5i(*eHzDPJ8cJ=j?E7weJ-OrPv78QDqtAd}psLI~M zY?iPQj=srpXHLA<@HENAR(!Ac`~Mq5wJGGF?*SZE67-o9W)@hx35(igC45eV06wf1dSt+F^D7rsMuVuh)qTE?ub&vun3UDosY774iqZoIStdw*2 zKMg>D*Xut?uL9zj|8s0A(jVeV{Hf0VOaYU2%gQv81fSz_1`SW1b_uygq$D}7WVBkR^@++j}rm7q5=rxTN z|6ms2K^D{)!<0a75Cr3Y;4KO3+p@ze8n>pX@Am(YOV4-jBtSo!^Vq z3J?cyz!lv`phfWG4=+U{Bu|P?)f|vWhb%t)*CEdkez}u68-ii%a{FAaIYdeyH2v!Y zUQ>8-T8bClf=znbD4k)3>t7q{-y+M9l&zcm{{Phc=obiVK{_bY26ZTM_P*{&<>&)Q zejA8y9u%pA&GK<*-Hr@1SZ0oDjFT?;y0!|5KJxyh7lkAnQpuRDzu`0JHHfu}7^3!g zw2wwyvqZ*tSn*mZcNr|7H_?CDrhQ6kJFPE^Nt?m#gnQJUHe0HvBc-=cw+59A^^M#F zQ|)2jbS%dd2W=-t#I6VVRZeM*~0Blv4#8vWly#agZvu1=T(+Qg*5u}aovXR zjXYr%;5F^DQc(i8hW;*PW&Hjaqt^mXwvO1XC)L!ky_NZQntV%D-_IGKr||N5SVAzr zl23F8_Z;gWJM06qS^XlraP-C~LJpLM(q=+{n&LjP9^6m3sH)>Ib@lY3<{EopVJNfk z6=rJJ84d=()2k)nRM@stUGu#?5UdC80y$6rI9ABrf;rIw{lO{s=KC!#!=wbemio?m zfj=Q^Wu6W3KxQ0dkrpd3PwsTo^LN&q=2raud#e6pAM0 zwFa%%G{&Gy60@+ZW_S}b+`rfV{Wajay!Sy*Rn3E006+9YZRGv|P?$Ttt9t9{pk>hQ z!`K!pJb}M$>p(%Z?mWhcLe8-(0k4c=;+85nr*qZajk(V+(1|{xs>4(^~Zf z_Xy`~Kb+GGYQZhhTR?Er1y^s0IXX%a!mAM>YxzYP)yhzUfNykJ!Xc8QR>%kCKmaj0?LJPTM+8`eBD-i>;o^@ zapmfMZ|+QrvWQ9yednoneR%Ch9Qf{L_g)d_JCk@w9i)2;CD6S`lFom#SUFs&T9Mln z@jbmF%f7Gs-~K&>rWjHm z_|+OxeR&b?8^Ic%`F)e1a!Kl(n6esO=Pe6_aqyQ9{00L^XKaCVoi#t2fQ)$bcJk-{ zk53&$4WJN0`Hjswlurz)1Uv{Ciyuyh^Apjp&4^33-|kva5cF#H&LdDX8c7Tl@u1#b zmIMd!z`v6E7#(&Ewo$kW>noLyS~0U-H@*@4_~ZQ6er4CE8xBp?C!LwHiveY`v{W02 zf>9xfF0X;TjV+T&9PhPBk3F3JP`?q0S%3Mril0xgBb2YdlxPSs<=IegaSX|n-%BPj z6Rb*y(nK;j6b5#Fx0htqFT#p=_1&glVr1ej!Bf81kQF0PCh`d3gw4b+5W;UWCVr)b zq&gBI)ElVV>YOM>2ZuJMNNNt^N<&A(Sx^WYJJN@R7-=Frg`$r{504CwvB7uT#z4L~ zMWdgHW=jy>!~zkINnr;PSfye?FWw5nANhcjFa(CBr7Y)Ck*J2((eyK!T2ss-}X?J?uaoBxc0-lNB4i;yh7- zf)YK=#zG=f(fWK=m9oazn8sN93NDr}fZV!zMike`ghE(2;kphas|$&uPaXY|-h3cO z>?R&!DRlCpuo){!uyPjj$5wFyFK~+Ii+Y+h*kRE^$&jQ}xMd$Hlgh&K#niFJW>h3@ zRD+Uskdmy?3H6YOSc(oid59t$Mhq49B2J9e^H^wXU}>gI{~+)oukg!&v}|6XB0e(5 z=CZ}dzNI=piE~^by7*jK3Hkv~lqz7cY^Foj{Spy<`$sHV@kh?E${h7E-ArO>KJnbg zMlz-#5L&+#LsA#DH&HPAOao=Yfca%YQDedh%nLKL^hYXJAP*`5iT4c^UwT+U+jS0I#x$S^jL zL=NJ&Utb8sV62!@MUhh`f~b!Qp)~Vrd9)5zWich0hmIe{ZCHZsoA#~oiN_2YC(RIt zTOmz_GNywDf$HSZi6yMqXg)s~ z1zF31n8SI+--p=fG4P)CVw5Q{+LYhT}mUsX$lgQ;^ zM2exlM~JdLpg5t*8ZgX8U{Xy&NBPaYM01T{Q^HmL(l{c}COwJ-(%2HzAUwBZ3a3LP zufSTr9a7{qreXW9cVe701Y;U!zRv1*Ufh9!^`l^heXn3u=#<}?2lrz|G=V-MTm7U+ z86o;zB*e^>kcC~zkgfn4!r%zvyO}Jw$7rz=r9^B#lO7Y7JmVYh!P&LR7587cVT4{(oSM`ZdN1&trc{zpei!5 zgQX<^ZH%pY`_(iJU|@S{X4?}bH7F#86HN>Px0(*o^KoD<%1AY_)JOWH9q#kO{=35iw~*NQ3c{8gf!Yf*F{!At!A}X#!;OfSf!a;Tf28Atqf2IIlPvWSI=I z!1`d)gPimrrTNjx7#qADCJ)HTY?cgoGkHKx9+0p;m^>gS56H;_(&FP}00GtplW>p8 z0K#MdVKRWQpkOk=BGZSH_R*w$G-)4A+DDV|Bbh#&w2vn3qe=T{(mtBR`AhZTBmiX+ zfHDa{0riKI_R*w$1ZH3op!>f9pnDb~5`>Mp?2A7zrHd>3 z`BaO`H+Juy_FMJ4C(ZjTZm(F>r|`Dv0~NdXRlBAx>bak%x#F2EVZ_|JxxWaQxtm}? z)%#NM=>E5jYoICR1P2f8{Zga2^lztq?G@?GFEDrWmrBdON6>YTAmF|LALo~9&j)`G zD@91@{J}$$LzY}fdF;Zxe&91{oJ^WHwkDYsUpsvM?H{^|d{nHWJ1(OQ||6wx4ew9y25<-S~TvFr%` zcvI@HCG@(pY7XX`BPCp)%}{)mm9G`Dq?GW6ikO0WDIqzluaP}o_Op~X$gG;wDQtoI z2h+&a2Qw+b7#@Q=IxIxW6@-`|ry;B-cs#5H>W&>o>98;%!tQFVd@5=%NKG^+NXG6i zCl@25AJW!n&&LwQ!*oQugr^hTDG)bfi^NQFNPNhzh??C&9 z1epkFY2WaotY>StJ8dB^?j_)P3U3^wvt`kOu=%| z=}-!(sRhymoLsF-MsE+l6?#c5;E;aNNC)?5E5s?8CVA~t+?31@;`uPn09{G?^_Q~UCn(EACK@A+bTYeGE8jdC7r`@}IRqxIy#-4l4UJUd^AQ#G#r)3AC7ZwSaal-1 za1nQK1dRwWG?PvV??sgsnV?033x`mM8Z1vLYqDlUEm-j!7G_sh1!<_V2ker}(n1~~ z=*-_1m4AD_5JLWKBYbM^?d>SeU PHFxc>{QcQBm-GJv&(aQ# literal 0 HcmV?d00001 diff --git a/packaging/windows/manager/docs/screenshots/02-settings.png b/packaging/windows/manager/docs/screenshots/02-settings.png new file mode 100644 index 0000000000000000000000000000000000000000..27669cfab955e5a1cbc74a1542ce9b4004edfbe8 GIT binary patch literal 83085 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 literal 0 HcmV?d00001 diff --git a/packaging/windows/manager/docs/screenshots/03-logs.png b/packaging/windows/manager/docs/screenshots/03-logs.png new file mode 100644 index 0000000000000000000000000000000000000000..b85e4d0a4a576791272c988fd4251e64461c988a GIT binary patch literal 286023 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%0A0lYTt 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�f2VJ@{32ll#kBN=L7D06jR#~CV;a?BMfhX)fDUz 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

19fSDPth;>+tJmaKVVL`^)^PA}tYe1sZt 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 DfOXg_ literal 0 HcmV?d00001 diff --git a/packaging/windows/manager/docs/screenshots/04-advanced.png b/packaging/windows/manager/docs/screenshots/04-advanced.png new file mode 100644 index 0000000000000000000000000000000000000000..080dc656dd8f3e39af07ee9c8d4f3f37cdffbc40 GIT binary patch literal 86190 zcmd?Rd0bL!7cXw3m8q4LmIK+K*&vlA&SZ7+n3biKnFE@Ym5QO_3{+~KQ>m4unFCpw znK|W%6XitaKxKv#l9Hkbq9UNcX8*RGW1Z7`-+O=m-22D9d>TG(_kNyd&1-$v+WdL! zsFmW9wM*pW_DvJQ3{50qF6XB6kL15czSt3n?=f zdugg6vZ!$lmL;a6c zzs2sg%3fr+`S-^c4%n^x{pK<~i-%9zoamX76yCJOWNq`B=8)j3?A}dBMWtk0I%}^1 zanu)#AdD%?EPuPV(R%g|;{Cb(AHg<|i}-!^lJ&iBi`6_Q=jo{5Y*4)W^VY`p|A((? zQsA=Q!uDb$q55W4sX12QXP5R5*7z8<4#^)jTp6Qo@)88X2R0DMX*Uof_7(Op}s>RF*M>0CdNQK zCtmS4=8flKutH+DEUxuMA~$b4ef}5{e+7}{`O@Xi8u?+DH|oB~?GY6YSORlaB57n9I!t(v6jy zd=7OWpEp16atXuHjyR*)8u7D-m^hb{v{pz{zCf$%E^SX=N4N-DtIt}`k%EffP5Oai zTOMF(pDW|tnQFMI7ntr>X0F>XMA`R^nmy|Tb36uf_zvTNBbGpWI~F>u?h({x#rtlQuTf zEcEa1q9)znxq?CAhkZ0|P>_kQniN~k)9|QZSK9L4JIkn+K8LgD=-Zmuu#EA#NQqdi zPCH({WWa9+=UNVk8|Z->&H(8otenqSPCXvZv^o;Ly-q*_ozB#2S9WS6C>X-! z8exrbY*PcUMACED6oDa?qe#?4KBH$Ai-MR+$fuaFS;pQQ@s7zSq+s%4VECDaHNe%z z8&5F%?U$}m5z=f#(RC7v(SS9_sPfgHrC33|wrAyb)sCRZ0YCR}y@1vQ`TN}oKKf>{ zlm}jL&s^mKcS**?9xTJ(oiG&{Qks(-UzV${pF-sF%gSns0@w;KYYP&@u($#XowTPZeI&KE=&7~rlKKIE+-->?)&6vD_v#X2G8yd@ z+*BWo0UjLAfw_OJ;@m9nKqeyNx zTy;I9q~|EwA$osksR&v7TAUgE<^B!8`!yvn>dCSk8PB-`Cdx6;PtL9=NzTrXwIh3# zli)3w#&V+OxZr^)ycmPLd_(-8do}ep&mOdD3B~`uL2lvaXf*y1OK-PKI?#Hg40myK z#IV-lfp}S5MLyBRqhlbkW$P6--lSlC*i*=M|TL@}o+(q9EeTNAgv(sI3nttWy=$F3mW zvS9izM>&mC$2Eciaf-u(MZU5A-4zqs`$XK>Z$<51Vj_(oL z(Vh!Z|Hht}#RV9NJB+!*MCl=u=us=Q@&EMT*8aW~E}A&Y$vbql3QRj!^ik6xKA9Sv z)}JiT21lPJlc$^~*HCe0uyImcUef5)BeavVmDK;@k<$dL;O&t<4S-@ytt?a~Uexp; zS8q1nLhk=y2eMUvh&NX@#cJC%8%Z9Wt=vXHT}AN}vf^TzZetIBT@xKqya#9Lt-7m0 z`(mRV4s)@qb3q(#&hY(wvbqPISJvWeUNBx}GuXvz(2CB&q>jg|EO0Rw5GdHF24;3+ z3+f`nOnD7VJ(|C%cDyc-b`pJ*%^lZZHK*RXH%?ji#%b8od7nG3-q6cbB4qdLG59 zFOBA$>XPsD=$2h-0ZCX9$mEi)l9HKMau4~ZWEXDO)?KVZC76HFUpA`nq&C!#Z!glO z#g%!}@uvy7wyAw71MdT_1(xNEqKrm+NSl*PRf}Cr$AwenIbelO8ud|@J7LuSRH=hX zNv8|wPC`2!2{t$|s?kn~^54qQopt}o=$6melH^j z==&wK{$>utkiGoV^Qtu6KE+{SwW>~MC4X~P&&`z225Xv`O zR6hWlF^+AGg55zXOJ_OrP5(6O74`};s$6RFtx)$8uvcuWRc&rume)j{7CJQw<9E;6 zTh|4zNZ{L`BQh11C%5;9b<#_eq)eZYizy$KA9`T)8PtCKLm6r9r;=etT#+iF5Xz8_0KUQn(GI|Qz z(RpmQ(st{k2-%yTkDT-QTV~M-8#C1jZa*Heem$Gk@3*u@R94~!S<8TA) z^v~5^&1Sf!H^yP8%G;mg6#j0R9*ht@BWAQM$4@Rc%Y1z9mD_}1>y+AO9xaH z3K;up)t<@&9+!_NGEyWc@-(eQ7zzS3*a==GA1&Y$31)fBUS-0GDo`eGBS`pPY|+>_I4j6?6ge?M?E? zm%ZY~T6UGF*H>r`dJ@(+5I6l#nQ^r5X&m0QYT|udwnVx2l`Al=-i`zT!X9M-0Yu4? z*|xc0CYvlP^>rxag_FfXu&hlgg@Yn5{w`G_pxUnNiq8lg`WGct+J$T z|8ov+6Wjyjqw`K7aiS`nX0Qen5H6)PgF%FeeGnapY-Mni^&0~}g%+?7;7jA@N>d}C zh4dpZNG3`|;7;@wn;zcD|EAx5G|m0M0fOcvVXV)pC0>I49n64(g@by4Q3sD7Q`(!B zw=iFn2fFad;9wWwMK6I+1_guvnMN!Xd;$b20GtlE^LK*=WPVsnn;7#D`6aXwL|+04 zAWZg3+}F3YodE(2N{jyT|IqG01TITV*VW3i7*`;sOxLxuE3DU8gr=&_nq`QI()d`P z?Tiq-YXI>j83Bs&24&s^Z^&AA1@WJ&pTf0|eQQvtHH8 z%6s0v&2DGlCXe?-8UH6=Xia%1iMVY`Brr)aJII$Z5Sx80#2o878#%rWcTh}ul}=TG zpruL!&2|zME<|l~m)+r2i!22-L@-h3Gqp2k#h5sv^d+$p*fCm@@}Jf|@+}AscKLl^ zh;JpL4!zg1O`iy5SKj&Cy*0KK#7XjyFYpsW)AmxCBq%v^44hDh>$uBahO<0*4oLCG zY>evQf4T`5SYkvkDt!GSnS+*i$pe}_D{9tdrp4ku_l0TJfECD)^u>~q%t_`Q{K;zY zE#suf)#7%=4&DDSBu-bbK&{Y1#HnO688pN|2;z)CTT4CdXtf?uUo?ME(` zNm~ZVQNYH+23Ut+2aJ=6kgKC;p8OA{>2p9`GGN-$24IenmsB{+{|s*D=qBxvy~&Ll zUm>I412VV~)hBR4piMj6VtLQDV~hi1QQ7T8L+t(i14v+BJ}$onl0R3RxHyv>Ch=3;(dxyih~rr4K0zivkS+|(x&WuU7D&-0K)@CvCnO7!yzL8(pIhX zW3KUc{vbR~RhU)GZ`NHD6DYM9IwtGlHFO!gTP)VaR)?WF`XqW_}*DGJ*+ z0Km6D;Q1JAk#qugacaj25Chxb2j<`|8srwGWtfaSHm@|+_B3=OWRbbO9!}AN=Z1c0 zsdd_8oQ8Dh0h><59Ro%{D)9tSLb27g1hz;~U@6l3mG71pzWSU0Wx^!Kh3Vmqy80(1 z?rOaY25{Qbsa5R5>b)(s<2&5)xahg>);w@g>PV~=br_J5J2}WxsIo0gWzKMgG$339 z&)UZ;iVb&3x6uyb?+(>FF-kat3 zN6H%xPHgBb2BYA6vgd6CrfO*SO5%;T7t_OjnDs{6Rts00052HJZHfjS&yqpj}QFQI}Z$&X-pEQ0rmFOkYGYyIbRwT;s*XnfhgoN zSG$MlohI`o+%0qZFfJEmb@7FviEQV<>d?JjYWY-AJ3{?{?KooV%9Y}xZ#Ts??P~~b zw)C;#Dd#cG1uUFxo^E=;>q=ZzBu-~CcHaQTX4+~_pqd{7Co5(bCXy2rv*W*-tK88& z--XwY$;6+rSn`pXylL&zRf`^F4jJIGQKn;^@B?}4{}3NX;>gYflgx4BGwna!rJ0^2 zSn`)we%TAfBbE0wn^DR&02AIv1#SFQ-hPjM{G90a2t@C%F2c_~MScP|CvYqhuf`F< z2Z)X}+>lE=z$8c6qC5XoE% ziIkR>$(+aB#4WUGw@MF^288%lSidmSXi#Q6``|miN-hU8=AuP?bNWe$p1g2PBKqR* z616iL)IY%4-x=|EPpYZIfj2328tPbYz2f7GNCl|dwd8T zC}tC6RB#Of`7gKbXW(q6jhuQGYS@8_9K}4W)bM7pv*s~NfTlO^{V+Z->T0>v?hY(!Xv2simHA3GT0H-jII+np5B*|9 z3Ex_+--m#2>-s}N+6NhJmWkmat%Cc6o!+e`8iOK++YaHMqE34mp&Tq`+rkN1VvZ{0 zJkO4ri>v{R1ZT?>#hni~&l*>hf2!C}$mZ|+kv^?9A>gAUKQ9E-U)yre~_`U zlGu;JGwYwHg%)2`wvfIsF$>Re{OxhvKSOR)%#PD(gdH5XSr$=Q(1e(?O`a2_ORXq* zl*v(;6Q(hRz?B_y3B~UlBEPIQBPSLmJ1y4c_*NZy6JEU}&sxoi7w%*pJJu7x+}azE zAHJcXGCX&*jH-K1dd>Vud=M#aPvP7*MY>$8$oDve+U?+ephAK=v>&*aWFq!8T*QSn z73JePHxP+-9mHhTCJE&yS$45~p2)DgP(d**G3{Mmg!rjh9|4$7ZW*6RK3m4~$m6F3 z@uh^dh@^j&6r|;==Sp8?ye4r;KB>pwSb)YVJE(I7``%diBF|J;huGoHZLVThe`B{s z0ZF>d#Du1}5q3_gFZM>y5!H-UOD80L2-TEl#pvpPktxEIcNWx&p9KSHZn zBK2yq2Lx>Zu}WGzP;S6@?PqC0fDH9FJz9;i!Q~EgDLFq)=r*7`_C;Dy4@6IiQRl@(v}@rGfT> zQL4oYC1q63Oi^;&l5pf-f#HH$Wd&|sGdHXz%(zZpzCXtLjg|&VlujoHufRR7wnOc* zrRwIsfZN#6k>lsExr!|2^rN-HxR*g%LKdZ4RY=Sl+4|6|6L|&q>iyKbFq4Dnqi%~* zjGy!9lcZ%9yU#p9=6bp7bWnTc@~`y7b84BWlO4!QuIuCcId|D=xSz4jVdR8`Y>LS) zhCw;yBpYBqa6skBYGtSsDDea`IeOX{Z1e?>3VL8j)J!qEFV44r~`RltW6CWcTqMK}Nvsm+lPwH1K+LikRZrM@&+4Xgg ztS+D6T~(EB@GM(@5-uS=njDFQ3i-^l8te-RHB^$uRq%|UqBH{ds3O2wVqQ1PI$oou zy6j;1@d=yb)3UEPw3+PiL-NafWcMi}Ut9yF0UI|S+4?iH+G4(iM+WhNuQ7=1M8ecl z_DuRINCXF*+6Ca0YC8-_CLl#|d7vYf2`4+!r+bxOhQVQ{@{qw#9W~uJZBp%jl>x~f zV*#Lt?I{)>8O{K{d;e_-IBMi)jHWBQ7;Q50zCi}n;r%V18x$b4U~Io^Tk)Ij~Oq`CQjK2I;RCNy7z~*@?VJb zIP{`F=1o4&-QA3G>>v)?(?!ov*kp-AHWi=F+9Su+xQ|}_PLnv9$7L4$BZw@aul%<- zo7CG$Mq@W~BKp3Sz0prWZ@1W!rdW^|hq5qK$(Ogy^vv-+v$>e)#W%t&PJ5Nt%|!=3 zWK3T9oKM(Sg(a}gC*y88tl6EdvT^IK1AI~4D_IX)(VBd;V``pcC?+wV8a)^yf1Nv} zH}N=T;KBS{A+7M+gq4_!mopw^ z+*oWr{4?9kZT&ay;m5CZpl9u8>TgDy^XsD6pZG}`5|s!!Vk^s&k{?l-iGn# zhb}utWrx2u;V1XCapytyhTVZAJ3evL>~k&ek$tDcx>HU4yT#fH@Ee4Z6O56F< z$%vPxZ>8rY*y~URZH1PelYHKbSQ=}9SW=h0aHAnNX7M{!9otgnR|oHGMV4~;c1e(y zcIA_|Cx(Su7zRn9{_CmTYP*8M&C*h=jDD0%_p<$d0bpzyUj<97JIHA>`}k;xpYy6< ze$&=`&Uh*L%lz&p#HvUen(fjDO!bwawW1^j9kdhNa#t7Fb5N(Zp}?V9*%vhW$yhah z9|+}yU&6c#4-=#t31J*>?;lh4#O=KU`K5ereobrj&6!lLj=hKczPB^t$|C0KrD9 z3&2Xy*TNX}nyfHQl@7WVlPxU?KL6$R|GV+S|1027izN`iRmhg9`#R*&L2K+7JA&QY zhnr34to?Lf@e53Jv-z(}8F)nFr!S5FMu*d$@hT;*0;W7N3qQ$3WE0K8OU0cM*r^$O zXB9Ny^VcVT>*wjysqyV0om)kW8F=y}PCTTV>^a)>?*rv_IS{0$1ikXG z28R9Y{c>{aWurX2t7dhHh0QeO?Lb*WiC#aI0D-jMq5Pq5R{@ zE7cnOy@(}}IkQ);3ifr_`Wg0R@%b($=WXp?#M>VDB#B}Z$h;>y2dZ^ zVLz^%hW{Tt40xy#MenL`#trgq_gGW~RhS%pe+QZu`1f%rB}!sXZP3$#Kng8alp;5b zu~zH-n<}ti>2+C18L|5yy5twO!8)stk$qvLkY9L3*hq<-_JFoa|7E-Q)D``=7@(1+`$%AdCG+_jt^~KvP#IyHC-hPdyS7Ma|9YZ3Rf+U z{Gl3dv}Ho&;8#~HM*O}KM|lN`5@K(KBRzCHkSVD0YHzPJ*+3$iw09Wu2;?mXo^G!3M9^SNOX69t+HBCL&J)cADPsDm%A=+d%(= zdBj}&@GV6A&cnk&cCvwFn*mh;>;%E^81?pHq`~>jNsI-eAc-_H3i4(e#}2iU_vH~-`comArXz|0z1ise-^);Il z=1?kRe-NL+ZnYTgFJ_Bxm1aBf$8ghnKqn?KJ6nQH>MmSnwy2>ZA7u9q{N}=cY!=#2 zR%jBjO`ez}PgsI$D;(56Bh-3Q9^l3Uu~q1;i-#z2StC}$8>pr2CG-jkPjIdXqb0qAtwNpW|0`SJML^Ms7TfdOrCq^oZe|qt``&j*`uCJVgmJW4Pjt zx%v~9$d(&K3SavvXro|0V&P;`<@ zXrN;&^o*$m^uJc0ay?7#V3p;jlf1egA#-4$hG`MGuqUpFIuE-#uKP$7pzvJ&)A2IK zg0JJRg-%*R@RKU>CI0Exc80rtKLy`XxP*3?L|`GP3n-G%x0Jlhd+r~?+= zAzv8OMosvt-0Kfpz@*10w7eD`A7X505_{`*Y&xebHX>_l`-l5Zf4S@NUgYt(r5{s~ zl}~s(xi=JZ7^t2eBm18}7zOOt4to9Q%_Kgt$##(>TD;~s+Q1>GrAYiEDwQmTbX}!J zmT_$A1x3+#3&(apXL>@S3P&I|G&3+n#R|_k;`NhpBaU(Tgvp0D0kw;T!9D0L9Mlf; zJ4(bs$bZH(uaNC&tC6{(G>4+GRh5h0)T%FeF063ILxgxs9=sr8)d{i(Y((rwtDn)Y z<2+>QT6>C+Y|Q@HMH0{SV6}IN`?#NktrBaOYy}B(( zJR7uy0}q}Qy{8q~Oa}=zNiw5>BOf%sOmBre&81;hjn~|RGdrK@fGwQ3g~x{$RDuOH zvWu>Sfwm~p+*$kRu=u&T@CJZ2B8K4h4nHi3yX2OZFf0zfpN~|14!bbuxf7ODP(P4) zJ4;Q-Lf;Rx zty@>gBP=*>`~nvK;%UzXTe{%T!g&a23jFVn_XbGYn0Jgl48L?Dx=kBceg4s=@sZ5o_zZqn&G_MWuBH5>Tl8I$ z!V*4WPLVB7m+2)ToxpP*ifd*0X(7pitxLNc=G~9$HV^to7?3ku1j*k@ksBANC z&fZ%+sN>gR1g_{HP%+I#z7#2@f{qg6^iy&YU<3wDli1yukCDQTo??fpDPP8>MYyI{V@^&5(V0?^r9MP6l3r*Y@rLrirWw3c6Y zY|G?hMX!Csf1e-(H(CdsU;`C%BrL6s08@P{{~yZ+t1r6F zB^aGxZE17?Nj`t=_~yV&s!ONm6VB}|81@b`a#%Y{qt1Mv)9^#Ijz67sGwa`t`0Eay zby^b=TLCqTY{!D0*-n%q<}B4x=`s7@YCv78L2Cz^VdknXVYNOMyZ(cwDB#l6PK8Yq zO>=aw)u(I@-dr3~C+2r|8!|K3*5W>XY9Pt#0qg6P31!Y^zK(wUW8S7nRHNOe7PW;9 ziNn4nvTL&XI_w~8-Kdibt?aRn;TN$PJRt{tIH6j<6eikfn(!yf?L?~Lak6}a7A^UH zlE~m;TiO-horFtt(uj$Ep;_*f*+H%Ps!0bo}*oQ5*hZ ze8>Fnj33S?E1q55XF2$1gVD3!V;%KND-U3L29J-R=3A3C-Hxx0y#Ic__K7mz)hjg8 z8Jqn0JJPwk!$Y2i%HlrZH!`zJtq_*q*l-c=h5s>qhq$1N)vL8HNau6x+YP_~)%U88T<%zq!)gEU!s&A&CHMKsSBlYa+}!wh|)w;9ped>&=v7<%RA9Rs2R!0tg*02U} zfa!Zu(|kA0jGb2J=Dpqb#<6_0%1vhLq^^UZ)$^YF1r+|Np56tg_j`B`55lwF&hn_knk76N)dL;|#=h1F)8EAkb_;v=>af)K^mC(zX4XI%v6QJr++^Ts zKUiucv(wa05+C~3`dc-(#uF}0YYAr=M$(+RLA$-g&kUPEgU+Ho{fy2jmR`5tWH{vk zQYA^2*vgCapLrokPVTB;KU9={pf8qm?{z~<*r9*XCp=KgHIrUZ9;+@Fx;APSy07k+p^Gh1i?^DshPK zH*QzC-p66-i9$57E#IizPh{wI0H^X~{pXRgaWe5KnA(zhtDxI&Y3$bO*vq?EuRC1B zWB!u5Tl`Gr9uQO``x^JvXDWY^!b3ZKOq1KCdf|T8w(`vtQhAx|7jKK&n-ej|y3&WEF}d)3(iNTk5D(^N z-tY?!euhDuYqhlTO|@^Z2(<9J2{hY3BH!5OQpJ3!=i(71e(i4*pefqXK`sCu`o$j7 z2-1I^B8gm%<7j%UJ(if8STG}ZMu8!#Of+@ApOkWUVbioaY?sGPLTp~K(BQsv*qmD- zwX^xiC=>XGdG~_5JB&9^ zo6?t=%OU+}ysi zKskbYZp}x^H8GP1d=l*9@&kLA%-2bnqbZDU(%t9SM}DsrugF+N2nn;rH9kye((&)O z50BaYEJwGkbW^OD=lzMd7*gx|TU}6{{*JFQrMUTjYqiykR=X%l+P-G!-hY=rwIO`4 zk^Jaci=F^3GlDUG|1f_YR`UozTDI=VO4&wWIE| z?>p4(kFzd`NsTxRXwK6~dfpA`o|KZiooTlVHdx3fc@%atiSzCi#HCWJ@q>TX z_5?8e79|N0h2~)~0>SpQ+WX&3j=r0GT7(Ng?xF;4WW9J(z&cw)vQ_i`oC)>zqF_;b$>NwiL1sUvtA09sYs zt!zo31P{y;>qGm!{-RqhIdTS@lPoy%Nj1<#F^G$H4HKcPbE9K8s{C~I^VVs zt!dD3(vM&GnIf*#6is2xDM=wW^{AMZC&~gcid4P(9Od&3DY)ApuhDZbhTY9*jLRSs z6k;cN-nk5q(t)9^4jqZ+iBYeI_xzQ-Up=y~gW&D!-~e|;%O0;5Pu6?2=R}lkBPERn zKxNZhpQ(G1Dgxm*<$*%vV?_D^=V~3=;C*qo+tbrl`d6ClruGwZ35rP*_F~QWzoaek zeTlryw%wmH_0Y|!gW=Y@aNfP1k^=t^sii$7W!$BdCCc$cU5N5DY8EzDL-K68SzutR zdcB^~oSS^5I})?W|C1fZ$r;}a5uZLo{J6&X#?Ouh8Ok11T!P^rv4f-Cgq5NPBy07W|4zrgtZ)Z+Ruv;89$lXLuDNMx-RSO$)cd-Kk1ooRwqs8f;`g=f z$b2qci9scMj8LU_$>|DCew3AqYOaOg>SgtB_fk6WR^PfBeZ2nYZY@e`wsH?|EWn~{ zZ1%@-QO=(3N;R@($^A>Fwc|ClkILdy8tBW25s&U-zZ_m0=IndH;ug?c_>f#S8gR5t zXcg-<;kg;DYvH-6pSc83r^h8&vo_Zj3_jVQ<%FolG+&nlFV&`t&bfVxW)f!7787MJ zzgVYxA^Oc8hY+~|=)wC9pC`==tMp)CSh6vdvS?bpf?|r2d@A0n1Ul%G9GOg54o%g-zxHDsH7GJ-5WPb-? z8>BWPx)*n)%Q%06Q#x{f22j;tWUX~x4&2;5TN{4e2)*+&{xuMb1214lzT%633xY`& z@nu?XTnS+egDoSF#LXjG;IKXD(H9Huuat&>!GOx)dAP{B*TSg{q&(aOkAl-nflvk18=%0#7 zLBA6OG&;KZe|ZL1)l_*UWwRMmv~PBns^Z2&}? z{BZSaQ8G==j9%@!F8sGQMWL}Qs7lQIweGtp`G(`!NlLS`U54=EepoE;4Abln@@dyq zZnB$K7jKo1hLtwG~wut2>dskWSqldwGuu7x9d zv$0nhng+^4%;c5VSE&fmhFEI%E#Ga6&;dgYpFVrlU$c7tiy$L%n|8@^o3zd_4God0T7nFc}PW55p++ot&c=0vT1G%#m zq7RvUQzxE|RdT~rZqj(A)ZpN=wnA2eO0;BVCF)E!M0r10Gww|KVVrVuGtD1W#e`T} z;efeW8AHvN+MT1ZqgwVFvl+SUxk$^@52bU5s3Byrxj4bwbGai^2g*jpspvxDX1?7GfRmv^#xWvr(*9D8i%E2r)TQ&nF4NR|?;17tyYQ)nmbKR#+@)^Vh?VZc2hMvHQq~M%k zYR(MC&BEP0wP?t7|JZbsPiIn#T7R-?7v6&YCB%I3n1N)MyX1a8VL4kK$W9z0L;78= zN^?n6q+klmO)%{Xv}}K|r|6XE!Bm%_%0+E$S4@p&@aIs~b5??LaU=Y7{VoJy%ph`G$A_!B+uc7cBvt?7WspN$ zHoM;N#dp09;-0oJ&l`c-CYNqG+x{X$*w`0W$!?j9o$wXeE_o!WA&gM7I+ODOBJX-B>Ua)SC(y;`H&`Q$Dk;J|qKW%?CP zQfi2e{Q=M4fL<^Sxl$M!T5l@|YE2s@JG&r%7u_8h)Q^*_c=L6@GZ+8R zySsT^s67P4$Hs+^{*@;||9(-05MH>edT}JUt&AwVk1xFswyU<`zLo27cv5$Pv}t@f zZrfZ>ckn4C{%3nJ8QK|Y2k;WU5m)ypNJ!RD)d-v4Daw;w(VBus3->Sj+1kFcYmr2v zp&~3jzgC3KlqhKFaeTWU1uP}a4T1o2SA2G;&JtFwy4>Ju^s+^%QL^J5plaTN^G`Oh zYD=6%vh~~Y50}t0j#cMzo8K=uE}=T(JP&lhdY0wyPOFKTJFb?lL+!9i~JYuYIL3OXSyc%b?S)=a7qO3xQ(DlSL=(g4|)xMhM#LKsk?+c^9racMuD` z!t~C$cBtwo3%mll_e2Q`&u^$1r%KeDJxV`WUP@bySR9E^I^d%!rl|@OyA>QzYQ|Po z+#mhglx+}LFJCL`Zf`gIM(&N2&7?S(q{WFwU`oa9k&RBCKwgj6X5lHg?M- zB9n=N$j9${m?HFg!R;w|4D9$ix>(}>R@UE91SdVlmG~HQlvxD?{4RGwaNEHTqI$&@ zm&g5T-qm88nFn-ugZA+_Oxd=rR6vQ`YM{g zKe{sw;a)kY2?v}7c0*&$r}+GSJ#eSZG%=uqFa** z!-9eKR$aZ{`=O6H_T~aVrvdM$AwR4Y=~<}>ZtoS@1oqnQ; z$PsE89drlXRlHHI6XLf|q<&Xnkwcc#+5GaO(6KRg58qAg~i#b&AwN@ z=5FSoE=>O^STh{P@R~@+Tnf|BVUWdVjydR5#;VcsFh20S75OiGhc8L@Ay;n`OPljb zC{dL8h}vR;?Vgwmh=+y&XH^AW~ZB&&p0=X&=bl?xMVWC2Mcy{5Xv1QH7W$-?afxuLkK zGRKXfQCx?u!@;Wz-H!(uABY=qMQ|qYRIN@OSH&6<}hVe7~WoYD3E3MRK zFxp0Jm3FuTDg6d`uaV`V<_-9BtAcYhohmrw4+Pzn!pv<^pRwywwk0x_TWAxc`Q*wT z;C3HA#>?)(yv;|xLbTy8m<{AtS1osY zT(uL|Ke+X08+Rta5Qy@KfSv@0447K!Jsst+lRk(wLsDB+(Hv=EJbEp5* zo|dkfvqpr5w<8re5db!r7}iA=&M5wAVW^8?$Yru?2^q?%ib?5i?-dn#e*ZOeT`6e> zE<@uY30)|qA=-zH99Hfx^GD$0Tj$4?yo`kfU@!^tf{QpzSQ+42zis4wDij@gFLFQ zciAcW%_e`{Uvf19&AiOTr7Ac?xDxDXN-hw~!IFO2|Nn1#l_-k!kKMI8OA%EcS;VeUtMyCDoe$^RB-G4rcNu8=N5 z-X@qsxZRtCzel_}yrC29n0~4}^QxU+1#Y^%v>&Amr2_fqIR`qxI4EhbsRp{J)<=&) zyBji);TwM3Tm?kHC}gdf4V(U+MDsQz;8<3TvuEU%qG5Hv-XVYm_anvM-_|U3nn_^Z z2sivSZ`R=rwSZ=b2>WhQKd8F^{eFf3y8VpRXzRL z{eFfT(f2Id8~N8v+_jd29kw$Aloj9cgc+6+BMAamL5wFVt6JLRUIBMN$p#!=BJrbD zMP{VIC6bv(2>Yt9q|c0Ny*3f;y8t6KmX|<_m+qTAI4X;Gk}=iOWaERIP8_)d4zQct zVHTnt{!m|HW`zq-AQK(L4ol#DBo`jP20F4_6K+ zS+UCs=#CY5TTG9d2hTa=^&0+X<|#J4YI1E3j?>6)?o?>cP(51U>%qd(^HMWpF&g%L zl_@gg&fQk6L0?lLHbn2X;}zoPxk|AiGN-f*)QG1 z-?04D>+{ezrD4A7Kg1&0gK1X*g&r>@=}v)cOZ6$TGcb;-r`#LK$%l1#LnHVSR`=r< zN{6Ya7y2%w<1XdUGC{I^*uetl4#tgxo}!ngNjQH>oI8Vn;}?XR!d zGyc1GM4bUk^b$}-?{+mop|an`Z0S@#(O{~uA+!0&70$yDms&4;;|s#mhWjarRT=)T zOFUfmTeSo+XI|TUgcP2`j!Ipz!%z#iDcN#DAMp{+Ll z7Lk=I8ao*q$QALKlhOM`Js~N+-O2RLAKLOpooU%7+e$G#)K%8^%x=zF5W%}5Qw-U| za-RAkv8TlKWv-bj%{n)+2JcoltN=~SP&+nJEAn+VGt9Uyi(<-w{plA<4oh5FUp2pa zwow92?EPsPTxF z=A|3hReT=~bG3acfr)%C9yVufBDsbl69+K&DdyRpGRItsbKVKNwN|#>Pg$9o)YPx0 z&+t)ir4^f`hiQzY#!5||#8Vm+Byn6cPprq^2p(GH}sg_AL zK4m4J6H7*o#x&>+-wL+(rdLUiP8b(f21;ux3HTvfIbm4D6#td(P&5Bcu13p z;LMgpBu(Jq4Hg3GYWCxmMZgm3Z&cQ6UkxUuD!lD?eGaw6{5-xZlU89^LG_`NZ3M** zj2EB$HDM4F-UkJZ{weM$N#pjBwx_YCbpF`Q;l;MJnnP?@{*w(QHdDH`EO~eEQ*}nN zoL1|p1ycj^2@|X{-%aRj2Sc^%@Q%gT_ZO!39ZTw4w{@|fO?QPGJj<&rrYpEVI59)Hd~Owyemdpu#>NNV z2ZuZG5WGJ*S_o&=%DRmHKl0u?uBoi=7qz3(R8&w(bX1T*h=|f5mQh4hRGa~&L_|OZ zf`D{LMi9_Z$OuXiAu0kQN|72$B1JMt3DOcsAR;9~8W56@es{1wGtc|p^SSpv=iGCz zf6gRf@3q%n>$kq`H*KHIWrZ()vu#=(mDzzyLq&rJs^po1`Fxr0)0F;9U$0tK`~`y93xi!rPaK3ro`9v)$3?wBi( z!>wf@5lQVb`j>W-uj|?dOk?h}#EAk~I-1lD-*kwp&o~uvul)6Njg_I@EGT+TpJoKav)cfNIw)(AD*h^_CTX|4A)=u z8WH_;7In~oi1*6`UM=OS=qVS@gQoc{FO9}aAd0?8zPh4g2cPx^?%XRswDE?My07P< zx1Lm%6FAQQkl)SJmegJ=jW^?slGCHNkos}I+oB={k;t~hQgw%kBRA0j(GJ4h6{1@{ zKZhFB66^CM-L#XqqNKV9ke&;L1JWwn_Yd-o+r|1v0mbpOCSLaWy*Xq ziw+4So!9BGhbbKkrZ!4ia^TWsdP|$fRoa5e=Y~k3l0ac2+>@JzB?P6)0z8r5N+D32 z@k@}3nzXNJO5N^&^e^@0t3wWO9^fmUNU2)dp7CT(NhARWIqWW7HN)|yGG0a#p}+QZ zcv}u&3jidTT>A`pb+Yy2$QqqhK`JyJJi#8WL@=vbkJ-`UcXK0f)2>Rl*+QMWImQYK zDV5H4B=u45A-R^Y9rbIUl-9$O*IYXW%mw_iJEfE8T^+%&$h?k=0~p4gXj^C`&c%7^ z&=mv}WNzoVhZHGvRO`9L-s6I>EFy*>NW6o5I?uV3(QbLa(tGKAcFi4k1ob@@k<7R^ zVD?F&b70paaFnt)o^jDFkTL>DM(68*Qu5bt?}Sar!7fyVb36n-h`8%YDn3g|FW$U6 zT37mI3asa%)~IjfdISO6pQ`;WYam?W31si)*XuX#JJ7YCcz=cOz0(BgwPYziAo&=<@_R!H zq`Cao3bRw8ucO;bbNS4oo^F@rC=@{ARriC>QU_V7<;TNeH9;FtDSS+>S&gIX&-Fzg zU=#7HfqH1&w>RLZmdPjRvJRW@pAeXvh%$g9>e-J!BSCOV1f%%+y7X8mJQv-tMX6RO zxX+9%7POQVpM}Cm+5EuZ9S@PU_)11dbjRE_SYeTn8I)0jlBac+Ltprh&7b>?2+4_j zUC%8j2B*;~^~=KW;y|>BtL=h<>_dUe$VX&v5Y6K>Jfs~xr3b~wiTM$BK_4fjoTm`F ze{8Dp-iP|oAp<>1T~&?S#TxmHjSZ)aMfxkw-|1p36v6`C8NJ93i&AgD7Ea$dN+DaD zlF0!p)YfD!OMN%=+@Oy&kaP&``@8Ye#4a-Nbuf5I^|f$G9yDO5Rofy?!7FB9XG?(qaq2luoDdsPI+f0Hs@zC`vV#8q*^S+U8PtnW? z{&9zp;+o#})^b3zGEtOuPJA!47GqzRIwjfg4nN@mcnJyIH|a;*z)c*GJ9)mQIS`NWX(_AHTx9v#}ivmd=!w2?9t*+G3W8Dx?079Ta2mE4ad!y{m-K|ltkF&)L@ z9JJsLV3(eN+Iav+Al#X+2OynD@?*%#y39qE!w_GMGhn%?0RCZwx2GG-aY^@`&jC#9Lu%8e%Ab{Y$=1lzl^Z7)L( z0;bIEb{FmXnT}e!g0w@`T@-i=}+tgV`3!r?NVqS{4QwNARC@1^>oI+fatpFlNU?laNd z74ss`WvHseMK?;FbmYRGN=(ft`X%msm>{IrbRuNr{D{V~=o%G3-7LSm2kmC8;jy`Y z10Ck{sj;gdI{iGx2V8fuiB`}{na)cMUwJ;_X*GOxcmVs&E;{NwuCco!W#4(v3*8m> zYl~>=J8R4~k$}VhkWt>nEkGWttR*8 z9VaK|q)a+yM>|E277rIP`>jnA1fm4^_|8U2cZVX|a5*VI5w#;u zY}9z6c70grNLWEq#H1wLiBfhK5gj$7D+&KITmC~3Y4)brZ7zU+6t@4Lq>*_dUwv z^re9y?A1c=X1jj;DnQpCz6YyT!@DUqtKkY`0mp_0I#cfaYwI>VCAH) zb%hA3bF?0+nlwP_3&*BbSr8{mn>sc;!Y*9sHrIx_qAVIDZ)}5#Izxaru}yaQOnAx8 zclT{p$xbgb%zk?kqR1^9a{eJi zmFxZ6o}-PDa72&#(uoy%OXdb{3T-w)%780BzDj6kHwM;BQ|z;NSG@R>GB=2{=Vo*g zsgv18$b@PxqP65G3PayAAFSYeR@k?!^(#7b&04m6qW@VzHW6YyPwZUTP_^>r12ctsd;c4utfUK+x~EcvOoJLtYKJ7}cpZ zBnluFjI`s#iu^ZlH*Z}!n7ng0n50gpR(kHNa18=d0{9h6opjtpnN0xNWBCUsvRQWA z-pG^$t724{>Wd&p*j`k}G9rwKj1dIBZP`{qw+cJDZ63Kw7`p|+@b{*qUlhJe z#o^DoOYdGRaa9ni?$W1G9_TJ(x(^(-0QL+%$J7_Ud>ZYyNg#N{aKsFMe01T}JPCx! z7QIifDUE)OS+y4Rva|jg*ujfqY{w(`W!HCs<_O=0^GT@xS!$=XS>zvB$)j=<-iYdd z-|@{B+hp=uEW6%u^b2UUQh2Axv5Qi5Q%W9do&S)&(-&G3utkd^x*`!=5!W0qSAch) zM8C3iM>yHIh7!HR?|%389-qL81JCBcSZLtz%@3Q6K0oCM6CGdA#qV4}%J@)M8Ze7x9w5k)rY<4$DD63fohltQ?^mQzx z_9x|~T#=CK?Uj8A!F-ULE6x0M(V)alH_1?8$jC%>SN+Kgr7zw@1>e|~Aa3(;>IFiT z-(4?MzwV)c3wkzVB-=~Xe7$2tB}qhbk07gK26=Il^x=mUG0BY*#)m9a^q;^eE+A(^ zm>F*EOtDO{MBH;ze2!FNp>it0`t@TVf`fZ6diBydY($s!6G}V@71?FEmJ)jC(EM0r z%`&(PwXH0F5?Om!O6I-rkAkfoHi;IEe|oSuW6z0CQglM!(7e~JZFf;^z+16CmT}J= zVI76ceumedkro8?IVw5U-9^}3_c#z$cB2Flc}x1~kPK@h!(>n*0N9mP+9!E0nd-FJ zG?$XkD2fxmF<$p~$kLmUT8fwB$H18n0l0yE`|rOYAKx~TV9%2mpzi?ZaK^`xT9zYN z)ABh++^yFKAdL%*MeJ0t_J67_cFEAQbllIJ*|BJxyH(dWeXSF5XE|E4VTWg0aEL3uz|Kk5@ z+irj*0G(56f3u373FKtpAsfQb10lgOLEDxf4Yd2hBg;V{T~@U{Fwv>M!nHaLjefTT!` zO;mp4STO!~+=A6)SPP~PO@#xzvQk-9+|$aB(H zVxPVqRsSL{H~wD$oS&Ikf|9Lsp$oDf*>k3B$1P)cywkvW^ieRI4-l~dvOD_+)bF3{ z5yLg~Od2hnQsw%;kln=R@a8e*w>l?tEd8;Sqc$;Q{$t0~Rn2My+^hbX+ z4fU`ahk@nppB#os>%lH-r#w<+=&K09M?j>xKu%S~c8Sgh`xInzSBbQb0#ZBmq3tDS zr41c<+4*3%!Xog4dKXs~Y`f{oN_^W;krLHpGdUa7!(jpHJV-rurO2P5pLV6?LhkP> zjxxrkQKB*%C*P+7A4%y$tL_p0b)vuG1W=Z2`1;tS+8Oe*9zmXiepjAjS5867LL)J+ zB3DEFya7l}gPUMKlfa2T5KY-5DO&?!P-eM+5aD@o)Lz*z|A)zquapMinD-=^jzZL# zg{Cp{IPHv1K3}~Jg3M|vimJ?t?2|l@@5?BAzwd!Qkfe-0_s=_PYl!sLc!Pr=pF?~M z(!qUMdg_&gS8KY4e6PKlo?4uJUp60r&I~M+e=OR3w-w?^&Gm7Bw0RddMdky)jSF-~ zsCQ=#6*4bzJ2X|UCh4+oY3{333>B!6x~h}{!w(_!>=d*JncKD(rQ zBtq0>GS<-Jyue_SsfpcUFf~xxtqWqAKum!WO>$R zw5yKmVo};tlpDpLj@UdTtwt>M*erGJ&d%KZm}Qnf;G@4&MvAcS73NFJfSyZe{@3>k z(Lb&uWN+mM(6gsdT4(T$jDx6SCTq&w5u0BViuKYN@{aO5;fxM!R3MMUDHhvXLP+H94Aur?`5r;+#K}8-8b*JYU4guR}rNxyY5hZG$G{F z#2NK;FeevqZCct?8HW4b2~7oK9Wc?TsM+;1w*tx;mxOD1PlV`b>U=kGikouk`h~l% z${z16yBoo*UH}S;8E>{P%La?#PilG}rEyzgcGK(CeNkz(r-w3Fpwl*^Z|Yj8`m|o3 z0vCx30a+@>bBq0tJ7DYr?R%+}9AD+)8yMQw>H}LwV$1#}V9C2_9Nh)E|9?_Nr|HX8EZ_a@~RJ6>L>=Wy?!%H$q)f&8utDj;X0$ z$F0*xWeabf8kZM$N#%IVhc4gCrf0oOO^?TrySWB*`>D;aoRBHvM!Wmo6MIz#b;KPo z@Um=M^z=l0d1rXZrbKk;-9-Kla%QDb^g}X$K-#!fwN^8kx%MUAw4d?3dGkGt1h1kj zVgccdKfkk744x~t%)_WJK9fQVX;u;01^+?{;=H9AIwKq$Bb!cKb2t?^4D84z-^fh- z=3Sl?t0$PJ`@`L!>q_jWAG={NwQHYLD1GGlQ)vp>aEQWiFl9Myz(Xk}bMc^{7#jwW zZWlK&jIaCqA0!syemnnA3P0uV>g{6REjjYb#h0?O1-+ZvEj14G^pDh;b^a+ zV7&2QlVp$IQOAVPfZYV5O0S&#>;z4VbcFV-lykFrKs<`Or~I?gVjt~g233?nlNOA) zbv~^M$!zMK-BwJBTBMO_A(vqs+0pmj$iE^NooUgV5QY%3*Bgn!oMO|w_6nj0mwc(y zM^b~o-@!2%{Ox6-k6u*VFZHtro@f9IgZ8)L;anQU8G=|R-PzVISM(ygbz(_GU`(S# zkvff@>On<36^!L)Ki5J`WHMSDUlfZXY8eDnp-6xoTHhpb`73lg+a7K*aj=?b`q;m! z&)rRB3BfMeJDclw5FNwj3I29qQA@Aj=RUKIzZuJHop(~oM=K#{o)4|I)+eryHmq(;G#j|;>T~j2C6JtkxYIp6H0iyDhX+RcOGM?SLTyB4zoik zEIa!bke}kjmU*=sxu7VHi%LwI%d!dFNM@gdUZD>ld<4OSy)sN^<^WOq9k4X~sR?vN zfo9$eEErz{+jz`i3E%iAeM({2PRjy;i!dzLxV)`=Z{;)Q$QvV7E^@O?l&|jf6N26z zc$5q5?oj$3lb_lXX_+$2+{VQL9rRv5NP4>r$QkUEW4*NRJjV|*#3c21*D2jKBS?w# zie3vH6#<2SrKb;?-6@WHIbNzCtvZ*eTLq>&dLj6c+TLg+aF3bKzTKn#t^u5_7qjdTJor`_Y%;I4C6bV!b&iAM>In-$ge;-R~#MvY1e~R zUls!@O$Qi`dWu;CIxCJH$BLuxD^asyT6h8}6nHQ&HN6%zRaW*#?rR|J zuTER>=e^VOrpoO2nA+j4z^DN_anHEw0WU8DBll0A0`?kYPaxBFB1wNSYE!Ntt|0cb z7~1<(0q`vZ%e)cO^rE^nhpI=DO$fUF*Pew+(GJck+&srcO2(@k>t|+GV|XpBA?Wph3tTP7KeM!zwD^S)QD0Vdd4ElB%Y~({;)GEv(2$*u?bOUFPnX% zBk=!9N9;BN=m-Pu-{^=JrL7KgGDCmU+jp#eUkmNfHhPmj~?;x;>26mZvNS-VXI|Z--2M209%^iKfg-%Sx<4 zV+rnpYnoQe#6O$q(xq2-pLCZVF;e3Kc``+;#^O%g)b0{_>WW5*!TgDXf0;kZv2sq3vpirqy6>Jk3l2wlg=9mB;Frs1N?I;gv0Yb2&uT8@}T1I3LTM zDe+=I>>lb*kyaE%SoX?^D$ILr69WJgJ@GHPGvqlXM(rAmHO%Z!epYtZ~fARl-9FgDnw826X7X;G=4CS4kHwE7#umG}W=J>^)2x=M((9659^_r zr0Z$8)aWzwH#L3P#0LKAPD-!!aeeH)q6=<>PCpG58Qkz~dy+-T;qEs|4*#xYVNC~} zvpGJ0^+t6k9Wzn_frR+}1Qgqp4YiJ&$I=WTn{3L_N)3G3ugL^+fxzkLySxtZi&}Q5 zJywnsn6z4$-@De~McKqHz!UVxa^kM<@UyT-20weT`0%qoz|XA67ub-m_%krQ#&&)^ z0?2~xfLA58#=nU@oqqTz#%b{dK-^o9l)k$Q`hJfDfH_BGkRE`eXuajO3ZV0sRBBL> zBW`)^Q+}z;Vv;35%6=+#P52Nc(-g?mf@bezipy_+#zHQhMQR#L`OvKIDNsD!{S>x* z&zrThqfSiHQ%YO$@-kG9YPehvcgW69^>yEQ$Q|?{U)qRtXw1Gd;vBOjFW2OMy>5_%1l5 zLn-{zoGM6EeS}zt)r^$@!0d&#FS1hLIzRvW|3rY`f6DFiUqmbZZ!h%yDyPi^sEd2w zh=gHD1M)kovJe?*oGHWBzk`f`n)$0(_}gy?lr6tWlmY4JkJ@EpK!^*x^<=9b-}-+C z#4Y4r{uAn3$fW##N+W!HwU9OZyfZ7hPNwUHHdr_sob?6-xeHR?nRcL?$jLmH&K~oH zu3c5GU(bABuAwDP3@mV4EJ5l3W`qdTDraG@d7Q=#jC>H6C&`+2wYq*I(!LDclM-p? zgLBs;w{h7oJF~LHyyqoSrkhF$3LWSlE|gdGIuKPCt@-)OnhPfB??Pulql%DJ5H+3D%maf^>b(O^F6}es3Y_HRP2C@ONzk9sj0!20&8wcl%#;e%{}Q*Nctsc>I6hN$Zb_a+eO(Pqm*u#QQRmp-2B^BuQ`e`W)fn+fymP5h+3h9En0k z>_Ix~xFFgp;n%PHaIvx#Q4VTFSk{n*L`)4#dAU4yU%NRJE+{N+jw^v_SUW~Xz+w1b zp=NjGeL*^#xQLIU#C8m_P|QX;qQdA0D^LTW5jfd29AhrH1!M&>koUv^fT4n7TyE+i z4|l0o0DF@?S5;G!%Ue#94R6~G(G@KKTLi@8PruLU>yAwlK>^D?w5=Y(?x=R+<}GrE z^xsQaEv$Xrnk?{`GX3&MZ2sku1ljQsWf3nTr=%I)fRCf59pPYoe#hg;cXcFH$}elu zK+deYhaof}%04Irl}mYz^K)@RxE*|bi`xh&h%fv>Y9^lRNLi)INVN*@$& zj1d*%D|ruYH&M>4(TH!^(KPEp>!|nI5~AD8)CHwFuSR3fucoWs6f4qJRpF_AJEEO1 z4O`10bTB9_H48p`G6k3sG=|W%OCpbYX+1*(0O$GJLI;b_Q_k`Gga33gL7Z@4x5mu@ zJ64o`taQ+n4poX2(*9UFp369W)VgB$Fg6tx2JNjSTC4MXX|pcRIPs}~076B?HhV;< ze`rl^ANu7Ko8ukXBoReD@c%760{HWQwSM6Z(EDMynIS;zOm6HB5pBA94VUWF`#?Ft z&VE8Qb}qGiSfsc}@c@GAex3N+$Q3Efw{0u$r{BRT@-s$a=hL9nMt=JqF;I$Cz1jwp zxOh?ykfpmY2fnH1fD9i(lVp243Oqttft`_S%tXkrwf40!nFEGBb|d(7N|L9-^mw0Gi}abmEf!~Gl6^bN9wH^r?fbVVFg34Xmk!-F~oTc)d*?vT>;GNN(t{Ng`aU&*Q{NmgR&{T+k8em$dEUdU*w*Q*S!BS=0$b9^N&8W*P z9*B;>FwERoxHcW>uXIa4u08h2%*}}WU3Va7trcF~5o`X0cK_)SC3VBx)=-Crz=0?t zh~m4Z)}=CE8O;uP_kUKZjWcYkGv$RjjIx?NZ4A(ky;|q|T|(UKS%G~18wO zljG}Sr$;#eE|_*udZ4(kMQ_d{xxW{v~U>t=58z{)b}dNP-v;8v#3}nexGj?D|s-oF}Aap*lL}luVb`P>Hy!%RZ`U zQfc8sVCg2Qd(gA=>x33ce5lxU(kTB~En%>?oSearhGr zL@Q1LZky0O!il6+RxS6#o0B$^;w_@@`aO3{sE+gbc#pWEs_YH($Y?H`Q?Z%+Jh}dW zXIeY?p)GmIEW6tlDRhB-&UlFXV+Q6Ja>}wO@utn`o3%JNuNtmbJb{dl+oX{Z=J_+c$De8#ot4*SZ*?7h+e6agVK76jj=Tcth2*0fY z9aEaJJ=E=cxxGN`1AZOoQR9Z~E0sEKYTdTY82PY!!J}0I`R36&o&DXT6{bBNGvhV& zNG|hzdL)jh_DX9_W!7ZR7=Q^vW@}Eg1c!p7W2~GV!!bC*y(^HtL5ybLek0mKlNg96 zh;c*3<@Iga1i!gwvvs~j{uvCk;3GR-X1h{+6Pp>6%*OQMs9^unNh_}EcHk1k&H8PWcHiCXvV8{mrZmY$m?(m3Z83s_PfHIP~vPI21za79+%pQ z^^$ah^ttI)CK>F9Sf-I@kT|h&18r(>HHut>y5IRgFA3rY9?ot*afZ-kc9(~PP)V-6 zC^NkKz%Z+06b@CI3qG519btAKpSaHoQ@Xdm+NCtAso^sVhp@darG1;Cc3Q9Tb5t@EUB zB@bHmk||wuwC#iy;JZSv=zblbK7hAtF`x6dP8)cgJEMxh)iBWL<1sTMX6;$*i~Q;# zU5d#}DWft60Zl?%%eAE3#j+kvOdTt}*K+A4+C%uxyZymr7WRfQ(kdi*%;1Lu&Cq0t zRK}|wcr(nO&+l9~?xQqJP`1M9UPsmF$X>CT7UgC33!$jpB-XD{lJZOg5Ue0`oL1K) zpE9V>INyG-_3-}gcvaV|hR8$@z@3GUGw>K(sh_A{5NUd;HBOw9 zse72@9p7zgQsgf~mq7t1#yj6e4baLskwvkg{W{c_BD5OR#^;KgT+1UG!k2q~Dl27` zm_>tz9A`XwOE}m+OH9Sc3tH|2ed+Ydup+CJGBQpyFIP#Om<2%j)3R|0Le58Ln1O(H zlC~|B(33&I8>|VfPC+>C1H98NAhq@14MPWzjAc!YdNvYqt?7Wq%}|rYzU?VufS)u> zXq4C-0YWRBSBJeQ`+cioP<(8HY4g!~Lh58p;)pqQ;f&> z)bNba-_32Q7I)n+bhC|Z_|8hgf4P>P-PY|wt@Iw;mC7Jth-q^bq3sp9*7vzQ&XcmU z+GX`s2(ibpN*gYmx{MmK(Q6|{^)=zmMGZ9TexT_?qijl7_6&6j+~K*7%d5yBQIe`o zS!Yq(!wt?&vB?FLG>^d~oN6W$jOuZToSaE)b;|GbX?fO343n&mmVbv6<|k%tM+5p} z0J;7QF@=Hw+&~aC!tU@ssY|EaKZU(nB0UQ*m(;C|vKDl1pOh!#cf|#rcz$}d_23(T zGrQH85}uy6OjC^G3_2KFR37IaUUNUA?YNqGghnC*J=NImvb(qP9w}6(N7601ba$xY zUUpAh#sy#5bH}f!&kDYkieCKW`f&m`{nWKHn({s29Z-u>o0?R?)T3_c4T&eNx5K#r z-@xD1(RYz4b7J{e={soInRw5T+j;tNIY8yq8aU-D7T>rMBH|DOM|`drq?AZ+Q7s8x zJoMc`O>wlt6#K6|X#S=;YvgXp+@p|*PUuKb)+StU_=)!347CSle_#5(pkh@kpXuDB zjRf%bM;@u(E_Hy~BMYm>-x>6gmVGQ6pH_t=?BaHCQH7XU&WF4k$FT<|^j4JXsWk)g zY}0Mnb&XG5;E0|hMz{bXh=XVh-+v4NWV$%}9W`+tu63P2hZl#|k6lw8+!a&pJD<6# z*vnu^vJntwkT#XyTuk4`Qb1K~A~>cY_Jlo*^6$s)ww!{kbNV?nr{ z=7nl)3_Z{V4?Jna*ht;uh&$aGZZRCrkI0zk?o+g_^}zZkTNi&222KkeSp!cdUYrO? z83o*r-no{=83@%Bb6h*cHtFxP6fk=!W%Qh~z|9(#2CM^w*JM-?Pq*ztQZ z5GZ5agudZi>Wi}TMQnljH%JPFcOD?|z0$d=qz8_G4~ z-Y7o1r=@+Ll`b8%M>eWPp2-2;RMxYWlgVVyAE*PMOHqQ|gpPe1bye()J%aOq&&}Pi zB<8XCE>LA@xs^iYowj+v${mGx>ZqcyjGAk0px*?V%hjUICayg|X|zTO$=%^Yo#Fm-Wf)au_GAYX|tjklTsj;BL;|LS-mnda#N?(+n4C*Ri1 zIXPfD^5OPY8=$oN%CN}V&=lBn6UL2z-YL^=%ZP8c)UTgPs|0+&7|9&t&R?8b1eE{l ziXMPQ9=0PH#@PVe#UF7yp4j*P;945HqK19Fopy_LC3!n&AsO%sf;9x>T0gdM2TU-_ zM|C!HRh#BUF!5sot8MIMfK&^h|0mfWDH;IcFmn1OCBM#*fh`G3W9O`V&T<(jH0bl| zU)O-PVu|c6L!JyG+fdzD#qG99Kb(MS9NZBi z=6sm0=w`MjJIGxGw7PoxI{HB5u~KA)u`(vYz@c(Yx2o{ePAEA^SHw_;+Dkq)i_zUy@lFn_#J zM;tVMayz~F_7dqtbxHO;Ajmc^{_?NCSHF6gtHY;x2o4IKTLbOOw*C`?`ecwGCjC-P zhBLKq{t5Wohwq%&{?AVV{=%ktLD`jb?A(}mT4fes>$m;;Pu)tLR@PJ>2GG#V1QrHb ze|`F~fNKYMuD`lKE=UEP$QM}g2(6C>3D=QuWHDLJNuN1%#hf)VpXSs($uf_jM>fjL8%fG9pmu zh%l8e*#-nl8lY)E#8hhSTj+k^LX^%r_ZemU2_-@ge$RfJe!lR1VCmlZ2^lLET#<&U z|1hCaW*{(7e!U!@E&J59BUC))4x-e$7pt@u#o#Rtr^c zM4y7e>CJ%O_TH0irfxqxm!n@Bbc|n%GCK;T`&VxGZSg$t6mVX{L5Q0rl4=~dg?*mG zs60D}16I`Tjx~1#sT0Tl@e@Gs;lsmf*;Vp{QT3$~WP%B#9{VPj#-K0s*p zd(Zwasd-j)f)4*zyZEZ$t%@+G5BOJ>si`nft;1mJ)1 zdm>I2Xa{1wObt`j01U@1Da(It!>->FePnHb@^5_JwJ$_ImoD1;^#sWcC|XS)@_@cS$X|4;k;gNoYp~6ri5W)Lr%1uX}L# zZKmT=^=l{U9T^Ey6r)t95U}B&4NVR-V)deGKUfF={gI7ZNZ)Ed@=aZ@{62a|#oHTO|IlRa*7(SVf14ou&NN(fKaBJ^aF$k?S>Lno}*K^uqv`s!BW zes-%#vkGEc#d@6JGrZ8#A)@*4OEwZj?1?#33MGHC91gY?4u!&^%e=ToAQ3QRydc#s zNaJfApzCh_?Y~Wr^mSa5hGQy{`>2&|gDdveZyioQC9`&Y;ed#)b`D7A3fJc@EAwhL zs3vI{mv4P{8VNFj(84+rTEyx`c^|_wqFEZ@)}ikW+4XZnns|OY-`idHF~}Um;DCm^ zda_6pM^L73kc$4R&l^}={q@G<`X@7NwWN9Jip)tvEY`l`w%CANo_p?IC@AQ`|+`vT+ zy=m^+5zs74>yt{oS*+;oXx1_*yO9#~@S+4EL6 zuqEQgia57}@xNELI9(g~AgMWUVVMR~E+!O5Y43R9eB$&^y2pMxY-_aH>h0E_w(Z%5 zQJxVW`SrJ7FHO*v*Om6%yEk(`_7=o zVXFow=m9YjivkiBwbM!5rpqhB!4 z_#-jt3OlsUhRQ`DxbXJW%1tX2sSh>xKH{mRzC@{cHRnR=HN<{wZef!RAwtL* zJur%^E>A4#4$cZ^-qepY$R&Uvs250xC8pb~!_weA+mjod0YQqwy@C8(rll9xH9A_r z-XyJ`8lt>Va_eE>+dtK~(y8`hJX2D!Tk8=x{ACP>%BvNI-yiH0;a@*)DLq9t~FOg4(O>HcV%~O#>Nou(KbD zeTqVrLyrg6HA%X4mgGP!b&kC>Qi!X;PFjjIiLKxVLaf;Gy!U)$MS;J;QANcU+|qfn zz^7L^Aq3%o0sV3Wt5$4^B>$-stk8rNVsBWPRfS03gDLVaKCL&DOBiRO_@^8g`F{4P!0qV*~X8lHA z+WCi(j9;~Q^a_2k$e>~ld)O{JHiuzDMHG!{iCr|sJUw^{NreAnk~Rm-*Jr?d_4+>0 zC;f;ZrBAr}`EI?ASY#;88lzrpq%cQ?k%~bk-i*>A@eJ%ePC3&#!(*cSS4AN;-dO&R z6%C_}2adhCoW+O!RQ2`{vVC?WjrP9so$#`A1gy5W{iI7z^BZ0B;j!8FMF!{nEsx)- zLTi>Ur&>lPxfa|wgJm@v>RZR>(j2Y*bJ&73P&2CQBuo!cPpi5|lvXzf>G)0tT?r9C z863rHQ0Qj4m27aWeMw#=$U47L_*WK=9-e?JS8v{tAifPGXj_jM*ARYztk;5se)OpO zghzF6i8?FNyg2!fO;Btb%>f~b2H znp$G>-5;x4|AuC$;0+*w_PQFUBk~WTJS6hW!j)Yg_cKVfD)=a!N{LQ+Ov<_c9W8LI2Y(OIW zM?8|R3ho;(^5X;$TuAe!#Rfbzoho&S#jb!zuE>an@5f%z7OjYZ4ScG|jz~g2tTQn1 z8ER%kww9oLCd`&EdK0{xo_3agKS5lEY6dCKHQf-9{e*js=n3~;48lDzP{TdATCMg?&Pla57y zthj!n=4uioGRla$*U})TxJ&{<+xvM}Au#ODBGjP$)q(0knhJ(HQK_kT6D(loUmHHq zN;o)YsVuenIilk&Enaw35_POsNnA_&(}gFZLfJvvIIZ)Ak-qsniZy;+oRHqBA9XT2 z$k}eQb*r^*RJ%6}?Ar7RQ!r}aMw&;Tb7js8Hj3%D`@w#QfdCuQ@J20y2%+97y&~R0 z%hR)h9;>P%^pv1zW8X%wy#$gf_(L+{Ao4bbyYV*BmIc21JC#>^)qrm9d3E>1c0 z_6i9bY$0spWJKR>%W^JfOsCNUfQqay{3fqMvEix5!vRDXw%1IFx?a*4?NVKziz~S< z{)2jUs+6dtG-!WN0y%<6v5IJ)Exsf0n;S3k8F}P@1Eoe8bhxD~#{n}I9rVI7p3eYV zvbqHY;%BKG{Tk~6AE3qV)h*=UVH89hv^R>eqYawViXTSfz`>;X>UCAX5|{rDK*riD@nq6DTM^WAe;s}l$ zQEL%&P?9`aw5gn+Nlgwim)4*gsqbc~Dee$LE6}y`ciIIaxFFpfv1{M&pcS;Y?$XQE zTE^n*64(V$WfT!&RXhW4X{%}yO?ixU^#XxdO|Ry_sI>dSakdD2lk^U|9wudm)^^UR zcm|Qk#=!WYf$@6;jNigruKLJ^6!v^QqZV9Mr$?4nH<~FyRW$k`h^JdWBzrj3z%Q1l zZG@zveX`DH6TL%*(BrkFryf~W)Jn497z||*|AcIQd%O&nW|sd4F1JoRUDw!15_;fY zqD1`Eq0o=!W2r2^Etc0MD9HQS$7B1{Hd}f1EOv+256un*+lm#S#&l&6A)tVbaz;#W zXGV>9Y7?pXMWba`zf58=$4Sv2(Cs*W8vs3~U5Y`hY6)k{b~Jl7Pt)O%$yNj@oXx`q(L9Sfrk&!Dt=!6MD>Frd zoDdBo_3rYnUzH1!MoTn`x$M#wl#KO;7~HgANJ zTl$A)JPzYpg@1UCHi{{IJiZyMIr z_4W(fQlVA`|5^nZ60KV52#OHKq}F*NR;#EW5m8X41S5ngi54YQE3r}qnWCa1Dg;Fc zV**5p2q7X!fFuM6CPF44kPt$$&koqr$M*Snp7(mM>zsY{3pRVNweEGVd-&bM>O{)d zpS?ar((CU$fZ9gV>6O4LfkJtRhPvrB^;0~|<_fXS8#dNyAuzNNK`nJneV`wZn+b$3 zdt@&Bz$ycPA3HM&jYvgLU6uFk{W5LbKn8!Lj38~U7;ws2tzN$_CaN(~X^Ih1mn%|N zPtBe>UG+-!G0U##8o5B{FOru+BGK5wP}4bm9wDYlL9H`8M077|9FHX3)K3aZ&B+x+ z%hVz)?izpv%D>_!l(zr{{u(p3oxt@-*|p)g1DqVTI@xf_U44o3Ks~WRiY{XPDni0( zb0xoMlUAYudx--*rJFjTU|d0TBV&alu_08>CDZ!E32j?x)uAeiK)xh#62~r~YI{R> zRqF>0B33MpT_663y&6p(SL(3BDcl{e4t@n$O}tAf6^Syvgu96m3jl{guw9}zA6dQg z-dTSzifCJQ&;d8t9kmOXDmpz#ym||)_H7{!Mk9;3Awsk{v3tqLltYiXo4rJBvw(BC z=_pRQSPdg9B8q@(I&xNi-?f0s;3VT2BK&oRG_Ho6iVI1KvQ`Y-4|bemIbzZ^4qBNn zD;}6ml(JrLItsS69s*1i&c82Cxa$yW!6^1MU-|2EiaU_bb}S-&(Jr=@WTCpZOVyMX z2$iS*&cmL54!ytABC2w{JJ^nzuK$qm0lsak#Em8&K3XQpoE$^>v*RP|Qo?Vuj-T5D zY@Ez$V9r`W?`Ug~*jPz7SZpTsrR#PZ4Hd9MCZ}ygwGvk?f|W*)?pzK!;-_0VAjmQ+ z+nm0Y*LgEhu{i0NA3V~}AJ#o5nI`nJ3>>H^|oi-E});c4z(xnpU> zi<}{8T0-Q2QRglox4okv^16`@IFmQ6sz-@@EH|7VdpbjVd&5!3@y=M*%{YZ4kuXL+ zFd@7Un~~*7J&kD9Iwj?vW9@S{?vD%LuvU*-QUVC_o2()2RE zJ=PmJO*K*{yhz&Zc@gXRP|~q9K-nZ~=b+NTM$pynfB43C3h|EtdsG`RR#PHwV7F!+ zsH6f&5EchQe&s1kHSurx5P_tDZN|&x^uky{+k&e+eK_T+Qp0AJQ1e@-9m+>RFN{;`c|*!;xu;3&<*Vz3theh z26lu8dg&_G>!p?SAfRAl(n9P+>AUnJui#wgr-u_j=Po_$8=(5){RM@5N>40DES8X}sqn0nRwN59oVj2#jz5>=F{?fW)&}_3TtjJnOp_1Ve{_Oq9;;^jN4o{v(3crOC){H zV7??T61^ft+lnDn7WNk-raI0KjFg6v|JZz@6YQOEKUfYf{3@e?QB4?|GgZ%3ZkIZ$ z{~(yuj<^>Y6$Yuk7`6Y|0XsEwy^Ab;`ObIGVk?=3iL`N5|E8oLYmKlZD;f`}*dhXBd!N?mgg;BL<|o+9SV zDMHv=fxCTUxkGrqw@hfsH)=BiHOV0sZMowq&q|EuLj@g9S4}77W&5SLSc+H)|3E2M zuJ@o%&$Sku>-5k7l?;zEj0*vK{fS?Uvl#PD>=Y7i7^1ON4n?@lT7S0O%PMob(kBWc zK!isLJ;I~*&_fu|m$c23K{c9bTV@D;4Qe4KT`;iy*|4ZwSIsu5r01)*wmrXGC%Du` zd%Q7@`6P5&p(51V;F|4TAj9mNbvp53MrT*rs@Nfl0IOH?b%Z&Q$>{%gKZ|Q zYA{bK{$nw)Kw5^LpP_w0)VWR}dAb+quRqcfbq3ME9ij-F=rP>rwq(({Y7U6}b~OLB zG$>JhO4TSqZDZKq1c7eL3JzoHn2LcYf|l7fuiFUPzin1JrMD&8-Scmk-w079>2<_# z12vSg^{+Q6Q!+ocHOjDVio!TzS~52W3yPX+z+75pBB$Ozm26xex9-!x>o^31RNRKr zyG_n600%zzTPgA3V?FlZZky(H=Zb;=l{ir6_~ktW6qEg5onvOSRw^`fOfdkBllc@# zm~+FW$p(M}7+z@GD8PIJrw1Hcmi5_SaH6&eRfU`YR7eDxJ~66cD}ixg9x8hmxS8QH zD?pte^%{_+p>ULsD9?}R#m&#rpRX1V=72;Rv|6VuD}y#o3}^xTI*_pn>41tt=&;Zt z05-P|s4fg~ZlcG7`W53~u3NFtMJD0H37!0eL7owZidFRspd?!ARJn&;N8;ePIGQF) z6W2BApM!`LhgoGrGO-n~N#fs@KKDBw>2s8Ay_S57^kTH_1Gt3ufHKqU0dP z{SztrY~I!s{oXcjy3}|hV6EYw)AyjwwKV4btxNvwMEd zECw6-l(O82d%(#*+mLZe`1gkAbQcr7_vD%<8*TZIq}QUD2Fg6BRU1xY0l$P;Lj=Yf zd*eG>K12qWBuzGIT7T4kAhA`1!2#QorgD+|A$7YrBW-`OzWwb!W$TY2B9tcM?;;lz zsCKONkBg{-LGNcG)`7cf^Uqx~x%7oPjHJ&yRiIwKk6g69@2LEK%d%406zf*Fp&VR7 zaJvD(KEQ)4;m0;gRW-o0r61P_!cz1F7oty!!=-5^Lq6t1n&NAH%66JOWuO4zRgAfl zd(aarw_A@BW7>o5@|I`9kN|<1g+ag+SD;LJ z)wc9(=gDC@X_G#%Y&|xxPoHklt{I8Z8cD%ZKHDnXGChx3m?hKiRRj@3C(n$tYva97 z3T>=%Nez@SVJGtr!HM@ZqEQ$XYK0O}$|DmK$GIQ#jfBZ&-HOLHjHMZ7K0{&}iPC2O zDUM&8uozUYA%BILrJ%k7{c^<2Z=YVBIY~2r6|XZ=V)0)uRvPv4|MxG(E@T=)5xQzE zPiR?k+09Y(xEU z^!i%+fL%vBK**R!pJ1c2kZ|2WRX#%RF;($t#g0$(TZmpCQEgm})o1HH+bL9kNY4T# z{$!KT6;QK?Xv3r*Wo(Aid&gd2pT`EOv#10vJ_hK9w<5l6`8ap$+~=2)ckgVf910@x zxD4H9m6l2mBN)1+@L`J)fu997FB)r7D#mD7!7g9FqV%XA&jaCe0m4;<5Z$l ze1@TyEAx)fY<&t)K2^jGrdEk$m_5`Ad*}(e%km?JEhxl6YulJ+m&L z43jjrHN&tfv*MUv-|zH&FP8Ybm;d?V=@T0@QT-~NozBqX|7OP*!dv=5$$!hd2w;rM zh8pDLKBJm6K1+s`fI%V_p`J>fOff&_U0~3W5n-6*GA<$VXMTPDVm_3(h|Mp0@)=Fc zbv)>&OErIVm~kU!=6)RP+iukMGwgLfX8p8hWUOBWpN>~ECeO@YhpqqbdC{q^gvG8g z8pfP@yP4(RF&duF(rnZWTt|{fNv{~ZiYrY=?L=C> zrTBDKFTV4l=ceNksyeO2mP{LR|rMREXCbMB>1+oeW)=UY-vaeGE%_5wWu+ z4$3=aTtk)wB!ZrygDvGJmQ@iaXJxzJI__1tLMPY}fm7H&q45%Wyzx%YMXF(K`kg5#J)q$KN9GRhjC3hzzc+qXxJwe(UJ(&+FAM^CmT-N zz!5Sf!}X4!;pE2}UE7yr#YI{v5T)^mK;x1GbYAdcePUAcZZ+>nLTV|`A~pWG!J}p7 zQs&-_X;LLH4FX3Aiz$`+P2iFx{9<4e7CpLhtTlhQ3R#YBw$$m+mNp#%1FLLhhRh8_5w2FRkZN`u&Qt%uXhLV}GzVdqLq9Swk3kV!#f zA;r0%0lB=))k{W(kHBp&BIyqiFc}B$vT3sHgKlqz7wfTH+;VCSTwTeV+0Rt6QAs;` z$jB*Lrn3i5*V3j=`-tnN7Fp5D;I3aI!Ei3cmrN2BHlI%#Yt&Yx=++38_1LFf3QY55 zm}$gX@6Tp)#!{DjA&IC{giFBGZuz{bV;XUxI2JL_iqzxhDnkPg@i_C#_mFBo1#ZNn zBLWt!UpANX8NnVi4I}wlG>tjf==ahwMW2VvN1C=^QPD)urj?Dp*sAm4c&zJE$ksb~ zeKz)>r7oXxf?`<+rriy=#Y$J0^`&o+K?{khr}5t=z0(gST4nNh=pPQ33su>{>{u4> zG|dMtRwGUM!l$%>>Q5B8ZKR0Nw_Qgz9lC5ZVc#&`8rJIA#fcNdwB+Hr7P{>wqY46T z8%^2swKKm1!cvD1bG&2-4!9uN0(&e?kExkd%@`N%A=B(VR!p>cB)LUGe;KE~Q&FS8 zI9bScWJ~D%2C!!+JHLmfyBbC8@vbbfyND)Y>19*pkzIfuKB8!a+#CImm>nZ-G zLh|xI!1U@ZQ>R&Yy-Z1b<}lu!CT_zBq|eh)bTlE_AyV|15MPsy%}DcL94(MuKYC~_ z);pcxQ1tUq!dg$^OU#3#;sn%=kgNig_xD#JB?r>teKDK3_+twYiK&K|>lI?ZxSp9r zM(beXaT_$(F;P8))@s#JuQ8O==`N>F<;WJaI}N8vi098r{8q;}>~9J?HWp{uy0ys9 zaeY8R%wnz=jXjs*Xtr9D-Fu=)Um4gN%DG#q4v(6)oH0L7vxuUYsJS|vr~N<#<9ih< z#KsEMlbe;61*b~aC3urQe#d>1W>eH&`MVTM5W2)kOTL-ti&@Vl9CI2jk?cFBbA?S) zqx^>%T_{2sh{NhJse#F3F{&-Od-eN$0vzMl6a@3v+0id8(d3(Lqvad+)Sc$_J-eSu zTUcZrn0&tr`!(%$xhXH)E_ZX^)O=PJpU^kaAg1}b=Qg|fkHjw6eEkwPqD5@Dj5n8H zE_0pfzH-mYeY>KCeX*0ja(^nnhJhZq6d3|d_F;r1ywZh`LlXo~pvv~(LnEs1y;}z8 ztH`CLx+9hGfe~E1F0ZvLq-eL3chTvZ$HA+-9T$B~4mEgwpyGCw%SS3K5r{mM67Yuw za325`;g_WEDQ!$~AvS;;M;uW(Iwh@fK_u>{CU4bQ=F%4G8WF(5{@@(}N|gcTg6(OP z&(>Xwa`H~yog1!&naV_&Dct*0hcDHO$bq58qnS~XYH8@Hd;=`>f9c2oDQ@bqyv`r3H=o7^QU6D?zO zJ!|ZMd%#t34oxKbtp#nxjeGtyHnBpqGtwpI7?yVo!@hD)5(g$kcVm5X{KJk6C6O)! zPXs&`;NqJ7wfKdUl8VT63FhmHfo@#~1SuEgBs7N*dzPoVlmdt3&wNcud0adZsG{yQ zBQ{c~1)|E=O+guif#jcpng0*d^nhJ9f$vwS@UB`pK%+ae6J$Wq~9oA$QL~nNv_Bb}eC@)qGtK%XM$$ zvc$-Ko#d9$tdXTnD+m{vFzMHDzlpisFP+lN>YRuY!b&)f=X(Nm8Rcxna?sy{ht@f% zVT;VIp7U&W7N#BTn4@t3`Vlw0824XR+)rImx@P6G8ve)@o;fFGm95Pd4YV2U=m8K@i{zka<++&Z$Hux-mKb^1OaU@iwO z>*tP5aW22~Og?=KB*u9?2s!^EI|r(1)N3_k7SbZFA2!?k{nSsM&!|0OcpDf4{neu+ z!gt(B4H9X>Iw1LeJ7IqlC^UXT{4li3;@h(lE>GjSE(+v}KDPywjrMcRAgy}Ze2_7S z$7rnEUW!btuY-SiggQx;oYqf2z{0mmBEqr?hqKGn6PZWO3cE#T-h1~H$RFG)4S{m5 z`Vg^*-Bm%vF_$GaZh;-+yN^+A6RUjZ>~1M-qxj+clkiw>jSIX8pWEh96h0FA(`j`a zDD6X1ak0Wg9&%E$Goh+NDuANK5^h%*m!InK;05F2kfd8yd0BL|C8&5H^H2nCB;4qe z9cN7ADvd$Jp>%NxV_xnX;3v->ZtQVq?W?#~P8rxH@h`v$V(~zF|HA#cool7bQzB{_ zuRl2PHBA{FP*c+kZvUD9?#Bw79^z^uTfA4vl{?wA|3bkIb=IG%kiNT2J5r-;kDbdc z`=OM5D9+bEF^RpV0xcg|e(M25IiTL(bo7#_`n3wCDLL0zjKBpfn47v1-1e3BNPWz% zA0oWmY}MPj>xlv{k!Y0+*Xpshyy!h*!A~W+9ehM|^+8<^li+qs?|r#Qb245}bP${XwzW2rkDIah`7;xh&bp!`6_0$X0ApM z$#i8##x*M!o@Y`2H38(#F6qwUYOHqF=AZAnh!S6=?mD8<)FBF<(N zU~Mmw>$a*Hz4Z62lJ!7bXj%Hvj-B3%mRZLewrS)bxZxz7{E)j~tFF>_<=mE-Dd8h4 zCf6U6ctRKhSnv*?^L@{CrE&P9&u+)uqxckv*aAcV#E^JD43Rvng_Q`}$1U6Spm6kV z%0(rgCe9h>luii!(_{8NDNCe>8-+lz(_cFKFkQD5J*nKna${Wgo%+&e>H%iRy0P#$ zqv}*CllJ=%N@i7$y23?$;`Z(Z8lmD5*RA`ss&3PnTrq1O>E@cd0vHUTGr_nKoE@0^yZ0kgWI3+QLX{Zo=v&Q|Q414bmye$QaiP_|{=2*S)0>&_RfM|i0JqgsD{xL# zIWH%Tn(`ATkTYq&%2|x#R!WznWwh|>jlxmKh_0Ib+$nq+wX@6eW6mJLw zFS-ZiU+Eg$p1b&f{NEpAO{s6VApX)DLhK>9hBN;#b@VH=FE8ynh~t3F2gAnUeQE`d=OJXyzMGQ!o?Rm0dw^(0AyUeThxM}B{U8(3}$lAw0>w2wCg zhTGE1nNHQLy~Nu!cKa?#9})(0j)s;zotP_be}1FYsevZ>Q{da5-k&p^ft4)U0S3;W zE>L(qg@~w|)@?051OutIbACAihkAvGYr9=sa_i}cZ6I!t+ z8pGxHxMy0XDxypuU1nADxQdB%J?v>|KK4pcxbIN;2E>B>VMO(EGOmseCK(I4a4?l5fmdke6ka4)XF1K zKhE}hY!`SxWqxg-LsvMP$Xxd`;+NDO%rx*InF%BUXH8c;{Yf`x3+20uO}LX(SHPmm zyJ)TPQ#zxIo)H9`CEVuNp5riwpIo_6<5kAZ1X7L#BwFNA$E^$j)BaV!pGIYzqHkLK z=Pb;lDOiM6J>v^uj5l$}IMn&+6vk#_S+eo@zZW%{0et=+r1n1v8#2s^5j|QbfS;s6 z7_cew9B;_K}I4ngyL=5u+46KrrYe zI}DZ1>{hv_QN=7)Tj^iKOOC{mRh};|s6*ZgAtj$8EVbhsjJDTuFrKwk6{;atI!q|h zukpW`L^8n^>ELs|bUK3>Vv77vJ6pPLEZK&^BoD2-6q zqeU@(LsRV3WG*yP@|~{xR^sNm`>2gjS(*DERUBs-M*t7ZC)CuJEM2p!MNZOgPkz5ynDwE79iBw1Z;!p74`;$)KdTfK8zas=pX5_X;$25g=ciZD8uFV>puKWSb9nTpY z+KTj1gzO_-Vj5O3b?wFYMtc3yxcJkMg>vE=9~qf(=8kpsoV&3#?a}#EKSlQp`eTon zUgz0PDEr7}C=?KAM;u4SQ`keW%MzxKA?*Uj}%hv%s1SZ&m0-( zd0_nN>DPb&m}nE{g!WyTnXA3Y|2=Vn8G`&Dm-xqlZs6LAl|~MFWZZ+py1BIB*;Pt& z-52K%1V5Uyo@&H$AAQQWG3HH#{nRWq9)_Wrt+bj|Oiam~r>X@1>3qV>cA3nQQSN^K zvKkE8&$^R4qtHPkAoPFubC~t0jmqlSjwDH`BRgO8ih?+!peKNTzAq6gswCQ1gpexk z$7C8OQ(3M5SuK=sDdFt0@44f7A8qBzjH0$*rFEs+F#*hPd@^9!=Dokg8$IG5eP)=f zFD@oo=m&L!UW7%+gCAwuz9F_($0(KpOG*X!PJ5m|G^MGjepAAPQuPFHUoW*q<>?*T zVjkB((mzab{t*31hv*#C`I_jD=B`V{F~I#p4N9r)o?5h;jx`=1+z;g6c= zhgbLI6Rqg0ZOUSk2V%>)#NgUu!N~b|RlZ3>O&6b?N`xX_c{Cf&x3b6a|IlR4EC+*hl3Tg?o)zk(W;4^5galN^knn4~>%# zCMCIY^KK@>V_V`|RGdHB_4Pcbgn*UcU7{6S|ETzIMMAp_8*G@6sQ)_xrt4ltz<#sG z@A5uMg@&ah54^my-qsn%vyJrP`#Fw;B>z}0knh8IXZ&vXWz$r_Fj9!0Z{dG{8~pq! z%E|Ut3U`^OQX6gqMH?!&)k`zoQ-*~ff>#Al|GW}@P;>Y}`ujk#EWz4G^3hOZIPA#j zTET)w!n})q#~)K->6Ri<&!g^8#?y0C6?l8ke=$zycrv>;t*Q;FYG87FVdXshs(6=| zzaz$TAkJjcmCF}S6wCj_R1Kn6ew|vgapM{Re7=Hc5V~@mOMK;TVUn{Q=GIY|O zxkaq(VfV+7Cm)5$mC`>5@Q|{Kf$TI|Xjzs!7YpTnDXHp_Bsx5#vWhvwY?D5CTfK-Q z7rp)0p>>F9gK1~J(!R9P`tcO%5stYtR?PyU1mw z5oi7TVs2Cs``7Q~F~^H0aQnrb;hKu|#Q&a3-|j)Q+Tp(`hrZYg`b#Na1f2ctwyolU zX+|1yo*CNh_183iM1Z~3qGZu)^MzHB_vvLs@OGK%*tGDB%5^!FeX&CZYxu*K=J8#R zDvZ!+c!eOlX$OESC`SG0#BCIIo@ZHtVBG4)w!Shr}Sc;>9pX^ zPi}v+$$#S=J126PwdFRLPOko0^}g@2yu;F(<(Ayg`s{v-Yw4P3dLQ9?pd}*syDH!Q z^*eV4aOXk~EU65<+w8^+KRAB)RN28qpL%@kb6)e+7LU?v?avz{L3e&YFFC2OR^$yO z;BGN2v8;WioMt>z#3{sq!hzEV<{aA*K@p%%?6X*nd&I(9d?rdU-=$DT0cVJfl}T-* zaMbrV({rK^uY!mO`y^dnl>Qz4XkYA;l&gPSK^(d6-9zXN@RCt0Q!X=Z!;j`7NP+$C zPJ}&o>+@?Cu&!4giXp#$RkVFlTTa6I`fLyBIX^E~YDf(iaub6GrOtStRhlF5#to}{ zZ|+L*IUQ9!d;<1+?m5*VESNPZK2vURO{gT_jTa}O`QG7*8jW{AB0?R_cRb-btvTFh z&8P%sfek(~{=|>8c$XjDBXp1ASKBXlRM=U3n`S~6j8;)sMC}GQ*ef6@+`HDkXP{Vs z3ahoZO0SAE<*xG19R?3Wu@|Y)Gmo`m{f^un0o-AmdZIPCAg<=881CbtXO+F!_-<50~*dy7C+9#2T-;C{l&=XBww+`XCgBJnFJyp!xA{y%Utt+#0V?wmeJ! z<5Y`i7(xQ$M`mD-DyIwkRk(&OVlP9cZ7}(qEavnrEnT!R>M7uKp#u5IpKV@l=qDFJH~Y z4tczLT&}DjuMXvK69=WmY2}djx~J|2-xE+$l7yhxR*f20S+v_2Fl^%#bG~QK4hPu(pSn6G>UJ>RJm>|q)@nF2M z?_5S@K6##bHzalfe}D7PZ52KN==e}w(Pu*ytvJG-HU})v&*=HSTH>+I<9%`X=ajtb z6DK_}uc|Gn&0#5-E==Xv^~reE$Cg5YunLURW4)&QHF-LpNXGZXiL_ZphM!KTf9Z@b z={a2mL%V81%Iuu%9Ju^^RcH&$UhU^_KslHg%D&bb?_0EcsGNkJ|8-BmJ_d)awImYm z@PvAnAo``QyO82dU-;R)jNxC4TpXC-Z_%MN#3eYcTaIUYY;ENxn)tOyhlieqJi6^b zK%f<+OsREC=62pGGAvm~DCQg3xog0BYXAa|lCBX?y zyRYhzUHPV6`sYJ^F>-AOqz%JR+w$X!JvfF+K1BT=2Td{cxW9F`WNh!kR=c@j5Zc1S zpA)SHtY5XzMvgyw$BBI zZ#G9O16oGp7kPG6JBYGD!LJl`)9X$&5|SfdNYsXpNaz-H_ir=@cxphZTzC?8{9?E$ zCT{$YOS`>kbK0gD#GhzV3+QO(d0pOw57WlZf>OO?N;}*(qWxf3@&s5qeK%?2MyNcz zy2hgb%$LUx;j5}gGb+(09~noMgrDW#-b4%^fjfr#_I%|`Uz?EhO%t^(EYKRXYcR8B z3>%@1skrs}gh(*#9#I__*6DDIhdLa#B-cR=U^eoLY}B06sfnX)7ZSs2+FhYeb|}`6 zzQuc8fxM*<$^es+*3ED=JgFv8c8mc zP;l0_BT_;5_{rk1Z4`TC(i{AXz>UkHr4G*9O(X>aj&FEKt`JOjrx8hnDVWshOeezd zeKME@kF;vJ%6hT*e!j5Xc|($}cKG416~Tr4(6e#EZ>X#rtjO7iW{heRBfQqR5`<;% z-Bo^U>+M^Tco=S;nRh{bDB*4PhKOL;EGMwDBhNnI&B!$>@`Ig4OAn{!*>_IeXtBkt zoDsV@DXfS((buzd#v{B@Cj1S4A=mx}GSN2aIRduD5=?OBz9Wjjv<`JntMG{xsk=b_ z@D{r<8~tb~V->Ab|1g;l2PKBrZ+j2tc*v*;|01OFiYYy>F1jcvuG($~%S1L7siiWI zmZdIC!^aGlcPwX||ErM)rqVeT;c$Fg-JKJRiaxxeY&Ln>ELjsM8Y(V~4__YcUaC6m zj>-L+kpia)z*s@-fhO@l3+}sT$^p=aUYr+fZ#p?*!1BIH*8nX^*MMUEW9kU%?thih z#=;PGas1?aWm=#1*QL=3$9r}qoh68sEOf^cs5;+F{A{-e9c!*b*HmkVrWEkL{87y_ z6o@q(IsppM+kH59_a4G`jIo`=ec{ptCWHCRd_GD4L5+wIf#^*|%zRe+v9x!FV|z@+!U` z{|i)DL2p0+;wv>W*!Z^de-mRVHXjPHLRBD=x*7T^l?I10AyW0a(aU#}G^OJ(5;afw z)S5Bpcqc0=OQ4SG`G$UE2_!Q#oqgL!Sodpi7&nqpa7UM55cqwdNre#gAMOocRbZ9q za5-lN?MQr=WZU!N zHNDIPLjcdmtrTIOV-uy6DF@FIP82d+Fw)5FphTLo<(2wkkEs_xNS5AH|90xkkW{i@ zvufbE#{-o^JLG^QUUNn-k5_X~>Kb(e>(#`THD%)&!==EUAvUcqUXmDajH#m zy4adw-WTQDbhhu5;a)P%cD6q?*AAj(R1^F1+!cI4AAR&1fv&Q3ucl{BQMZ! z=tHW0Vo@S69+!d89y&kFGxI$H+*DIj6Lfivw$N$;@q?aZrHg^MLCs<6&E0(b0XSa6 zKAsqfc2g$x^w`=XhY#um&-SRFX(u&;*ljE~tbciqeEn<*RwH=%Hs~y0?g@=dt?1{A zg0GnIOSoPu`C`mkERCzg#>StcXR)G^*kw|709Vm%oobcZ`m>cQ7~=Cw#DgWwG$kSm zQbQZ;$?+Gs0u6IR*?Abf$=UX4YqHa2#uwKF%b8=PP~nL>zX`HeCYGOW1@$$1qTlCc z+gY}`6H{)7x2=M%B1vbLF$Jv&S@`NMK7MUa;JGzC-8kAj!(2`oOCG7<)yscRJu@Z# zl~C(b0l$2zOS)i4=@oBMx3!GB%R7)wLdG%;a}~x(C*2ML!sQ~*%A$hc)ZE>eDR7I< zbP_9aeWId-)uq~RiC(?RlqoQW(wOVTjInC|nPG%Kj&nY#LUO598<&uD^;C-9sYf4O z{{5W3B{-L13&b&qRhyS!iAMk~%;m6E$6~nFAp)(ttTPDHg0t-AaRiH^9C3SEJyHNj zdv)VdoG?x}D9u@v%W8k6@u>3djslU+a$-5~PBfeKdf$Q*(;9dmXC|N4efDMQsFj(l zjyo7iDiMqhhY#e}e_?0{ISz?(vi}B2YG!iVSj+(}NQ!~f0yTTK_U_~%HGRZ&ccAkA zm@BWF2@g%*F3DP~c2qzWMD^jm9shDBS&^zn5V4D#P__*3oZ5rk%o{uI<5QjsRnr>K zzkDq`d7ZJA?>m_RCYfTOh23CiojwxTD9zbGV|Vc7H+9*^AUSAIU=~^{g~gNuC;tf( z**|MO?`l7s0w_)@{FnJ0MktGkp{j;UV;HaMzdk%+BLz>jt|3`DFz$Ps7ZR>ezrnYx zBe&q{iWxer6<7e|_Akf$w@Z{F#aOcRT`^*PXW>oAQ&dtXh1bw9R)+B!4E~18i&zGi z7?7qX$xm()H~(0!92@s-L}Ql`6XkI0wMsK}YcXOZ|J!>yJ2m##f1x_Ti>wM@%&yEJ zV0ci5`4LQqJ9MJldy!=(>|OF?R}dgUX3`pxH6!`2BvEr|X+95|6VgQX`hxTI@mAdM z(U1!-U7G`ye-5}&WIeTiRM!wF6(2_2V!2BpYBTQlmFU&u+pbJpbHwcV*T~Db#Cr)U zoE*mNz|`6q67NCzif6-@T{)r z4jJA#`B6QI7vG{i0`q7CtMW|}U$pdzIl6T@*CLuNJpJ>sn6(iTPuC-^a0B?Qz z2XOYqH&Zp*HB7>5m-dSpTw_&2yD`TEjN%>7*LzO33o~JFeZejy-v4@W+cu&f;Wbwy zS*+fi`>zrIdqA-iu-m=g9voyJ%b4b*wvOtX8!P;)PUSB!?|%qQ1&95AQOW<~81?5= zJr6b=f!(^#G&hoZI^|EDe&nw`&TpulXPL$|O5X6G>5u}#h*{gz2aR@voOgWfj5Icz z)rm0K?7k<^ShMl;(%%U6@vljZ;hO|qdFGkx5INk>8?H&yKA>FimrV}%d$o# z)Wq}G>h8x6pJm95WqHHv?i!u<{ilI&SqW%<+E=pYyI57!k0Y@lkgSQzWXaqhRqn z+3ccyL1f51wUsdLZ)h=Zk%Iz*Y@YG6L-f z$ijITH6bqC_e3Y6`%n~WfwhC0%#nL*B+Jij9wFSJNrO~%6YAX#a78vcZek`M*dOYf zuF#aX>5j`6nV0zm?FCJCtU*!5#H@ywscHh(e@;bXX+q;Z`1l#!*ju`+T4T3fCfQ&? z>E3I;2oa|*y-<@eE55J zVvjNngN_=semHILTH^(+BRe@Ar&*jy7(%$pkZZ4Ug?s}DgXsCij2FO|ToC)c@P~O+ z>m0=PRa5OzJ%J?gY>6!-#B?OlN6`#FT=k|-y|bYD`xJfpKUmOMnINIRL5wdnaEKGT zHg2)v?zB=LXnIKL<+wuB=^Cij2#vS61sy`6&+eUw*My)7)BCug|9nJDNpq*}zz~PVNYO5@#2$;?fTS?hUMBy_f1za95xPYyxtOnyGr+ zi5}xCB3g(^>-rM>q9g7`QABbzr)uEYCEiL%TfHRY6?UMW`|-*@&XiXL*tN$Uu3rU= zVdxHJp@>%ue94bP^nz0r=tUWpGG-7l9;iUCIQ@Wwi(9a1lCv1&J%o5K?6$08nS3BT za$7uWJB7fpy6C7g4DXyaX?DF3UK>sP=T@yM;S1C+*yw22X+oJ9x%^;&ZUs5GJi_b6I{WRhHQ*BY z=(Em&UNS39SGVZdiWnXRzCDfQ*5f;pu?P&k%JIx_q{#a|(vA|Kv3D~q(%#=PaRLTLt-LOt0JG z<>Wo4Q5BKCrYUX6qWp+5?R~;q;Tu`iP&sX~?zq=i4w?Faga&>>-S9^5)M4SE2#I30 z+s%1wnpq**Yo0*DS1$}?%;xRLVyFkD`?OO{7D*<8vU>bLnFpK-c2m-)kd@m$6azQN zYgdj;tRNST+3YDR>8KXTr0o-htvcU2%z{$0JDI%i zDbA^+i9r#W8~%zyfLd*LVYNMu=a;2KhR`FI9Ef`w?8=4X9rkk=?eQHJWlVf*SW9>v zfhiF*yh_pctp^LbZ_L*qA-o%uFLK^ULa1Vo`G%?kcyB+>KZp)i&*Y;%5Y@~vziwnl zJn^t6A+NUiIGFk{a_vk1%RyjSRGUV5zh_JBoIz4#A7)J+q4TKCor6zZBCsyKtF6BD zx-AbJD9`H)3aNR`PiP%Jx3L^;2Gl)!NM?ZjnOqXrN>X9PU92p&;JACuNxKENbs)Fk z9flyR?z-4=j&E$%vaXnZeM<7^wW}67kv{b#_cBQH1bRqn;e^cq8|3%fkty8eQ#ePg z(A9n7LLUgP!VF+xhFtSalX%TBptAyE)(6J@K~-mOVboy0F`bmj_N0l0hQ=UW+#@)w z6Sar}|;ez}(Qn&!+8nM@WZSaSs zqPVPAn|hbHv_J7wy!_Ec8}eH-{Dc;}$AN=cBM0mPtJ)_)vrnQZ`B_yyTO#zqHE^Gv zwY&Q!oI$!0){Lls9jdtcltIA#}q>QqDI{mKY1?FQJ~GYJiSrZL`e9 zGc@&G$dB2ON&K)ns`d~pLQr$zxM#UB=JBlM;O+@tF>SaXzq(sftdHB52`?KFEfPA~7A>Ovu^%UI z<1S6I$8jWr_2wMP7&d8*CuP&C_=8GVcSlss2d1H2eN^II_UFqxKJgJHl1^KPHW}9C zfx_eLAK~X5iXx78T3tu;Ie@hu?7h-NYS!88L1FBs3k20Z=anQqOyPYRQloMIfoM_T znLb+XggG^B^87HJg>;UjADNdlwa`!y<3^c6;;#|HiYZ4s=B7*tYJD^@x`R6CSHgMD ziwBTsyG+76im1b?t-k(3(247dEGCcYF_C^JuG1VaR`L|>h#QXCh^h5i->obT9FI0* zwOIzHF_|yn&+lRP1dx2acR=rx8Bv`SAufdILgs~(+u8%g=IZR`itV zEjkS@eNVKg4{ zaVRN|la&bLApr{5LoG`jfY~RkcjtAyy+hL`qqEVyewGGN zo77(V#j@RFr=N#&HmLhlmNci0kCeww+of+D^HGlXUI}<7qSqdz8~Nw>bX^lzdxQy0 z(GMIOti^AwQ`U5ToAT@KRuV-!_%Ep`^%lMBKW+nK}N!HO5Uy-#_D_+)l$vNRDatot*;WoLO{ zfAk}tqDq#2^w^-$9G(^Omq9Bz)rstRZ)uLDr1-9ZrU;BN5P`4&ZKk}8HqCI@L%wC9 z`)Kxx+`!vo5gx7vB3>j_^@zlS>In#135E>CWr_OQij6N(o-zhr(xEs^+B80KSQmbS z9~f6tPbA-ZkTNhBUgg16xYxsGw?nWXY>Shsd61%@DnX(=%O*;#<3}w^I>?T+B_t0 z96MjfiSjCqq5>}_Wm-$_nX#SPyCaUT4>0A|;($hJcAWPO?y}OSXRO+-7soC?%J3@z_#>R84a6V1g@?nwrd+r0#m$#wcZ$V^y8NC4(?fP5muTlqb_ciA ztp5(I+$bhak9U@=TUa?cy}tW@=lgKiJ7=38TwwB1?kRUxhv;DKB*s<45=iC46#Azz ziFF3-X5nq5I3Io&+8B`j_W2hv?r}(JS|z0MR8F(owhm_*HQs)agP$Ur@e_B%=$)Pa zcE&^cVwPHY)HEe;Q|xHkhsM6Jkod5Vc59`|^u^5$C}D0VGB!TyW7bjJh26GlWD)zu zri8E~jyOZ|gnBEhdcejXObaMw|Gt%V)1CSxcI~vt+A-6h$>`1%g&ub|-^Iz~fm+7$ z1U6YgsI{|5X5K}g=n}Vma7pHmOzu`AT*d^1dp_Nvm-y?yx@GamUq8|V_WTMbJ4N#g zr0D@2yqY85ML*T+`wF^Oxph-0D@pILJ_%hZ!^Ox2RDlkdBl+3&*%1q=_ zU&l;qt|c?+*NEEqB(To0`-m!shWG~U9tW*Hh6^l}))iEiUFeIQWkpjKlYu{c*>YO~qcynFVhYzeEFfTI%qFIfJoZg(T zXHE|BCj1PfdP*+Na>7@|k9;8QomzeLc+cPPI|JheN$sjVff}@Xv{VXi&-`KOEa!w_e7W zU%DCW8rl2HKinJ_S?GJPt5}5Bb-CFG;b4_cF=pK*NTB+hf$N8Z7%fb3a$iF)edIh& zH9pDXu|P9L0f0_;l-dXTyTCII|7VIp?`-&0C%Dp~eH7M7sVW-Wq!nl6sfyeiy2rzc zn(j&V#93Zq+4}y|>js;&5Z`&nf%y}VO0b#G_u=N0TC`UpY5}ih=>g1dgqCvqv>hi%}M<(~9M2 zqCf5L0#C}QMsM6f?Lwb8qE4877Od0$0QRMMwZ5as4|{BpPiTW=o)3H^*dqVsKg{Ds z3tjTv@sq!K+a4#A-c_X3jl~`RU+sN)SX0-#E{cU(8CoZ1&|j<65fv2>Nc7M;)GF2q zMkM1<6$q9Ozb2t!DaAQ2G}6#@nbA&iDhBxKsz*>?r3KP!Fi zANQW;Jontg{!3!A_8Pu5eBXM%_x0|qjnf1T99%wx1gK3;wTOwgYq_7%GV+6N`7cz} zCKt&Ma&*USlr9f!R+~~D@+`=)^{<4FlXP3%z7ca$Oz45LRKE80>$@2bpoP=Ouc9Gy z#QT=rkvwWBez6^>R~(|g9KzW=HEmw(Gd}93s(xru++F^KkG;Ku0Fruvvf-u3d2mC0 zt|P_)ne=jT|LMY4+{x$sVrTSeou z2+wo$LO!Zw1xx=c#3`gLCmlS&wnt%iaTb(XUY-6?(8_t$kdtLEJ4w(q9B|8l*ntn} z=r{!87mnu28I%`|7Udg~WGM>5>RMD2rHvP9O}ZAPnkpK6 z;bq^0o!25V>ByZlyk9U0Cmob@!=a|l+3j84GcCJmoB&x76XT)^p7tEjI8f`cSsAN` zsB}YJPDkHNi`Lanb`Sd4K@Mp}+aB7$>Wdj5#JU~v_qt%gcuG2^E!GWAN{GRn;j+1Q z5}enkjaZlXp+svXrZ3vT#mULEIr-GkvZCj(`N+_=@@C89u_=JIkQZW!_V6zShEVSI zW_O&$j7P_djTKV+j3GA$(F(Ffc7rOp4N)r$RpM(JQ7zzhW%ftok+*7yf;`p8&c(~N zttkz6z3OP$xPP=V`(Fhl>~WtmS`}!tDjg1(ki-k~Oz#^VSo2Xa&Td1J>*Rg`Up{;- zDs;`|RGhEniwDqWzj1(55xJJ`uW41S9I_OdcjXMbH6|wQ(_ZU9k?s1}S2EVpA^ZvvceCy*%x}!eC#`Cvi z6cTw91{Bnsz@h4|7S@~MD64q!P;P|m%zi`=qtS*&Y-uzfS9Zi?6zOF+B8cH&QPA&Lb{UX}SPYvfAummW7 zEr5z}^Sq4chvBRx)sM8r7LY6Z!a>G~WEl7x#ykGjE&R)1OC_idGFutDGbfb?AbM+M zIxw~G<3H>Za^P-&V>3N0plY1V+2!j(4u9>i#1c8Mw)tc@k++FYTyNfQYeAwR7UKQo ztNAheZqJ3|DrHEeCg}9wa*HH|C}y_ftJ=PM9pNg&^+li5Hs$%;*ze1F3#4lnuTcV| zK}o!-BW=2IYqe(P&urQkSXcS{q7gP~1rmGiNp@@WEo$`Xu$6urRVv5ct-#j9DBgdY6NOlwZKm486P%-eSTkwO2B<3bVe1n=1VYN{kFRMWu>~k+i?PKBVvnCfl$qML- zx@?OLj5O~KY-@M(XEd8TZQx=N_zhtD;8d>@VY4H6vN^Fp8LKVS<5FAa`aV5B@OSR| zp!hhD#XDQM3zQ`^;ayFG2MQGtds=*4DEr6 z!{h6=Q^6|24mepn2SokfQ7*Wc!`18JTXc-zd8n!F-#Ow!vK|Mv+jEOxtW>Ssz(r`U zERF^j?hYeD7=EO%bRhUz{w)Peh!y-@B^j znXTnU!Ca!+`kSNTv^vm}6MdV2H|8_Wu3*o|32wf3q-0mZVwbFI-KP>HcQv&< z!hLsWAxSNULsE&zTwk?iHK9MXIOLbTM|GQIPuc&91oN4{yxAeK8`lhOJ{p&+ zdlF9%66MC7Aj;PvD_*MA-X;}_Q$={rJiTfT-tqe-^raW6NO_=#Brv{gx9d(k;C+%+ zpY4#Ye%qI10K(sUlC1(fzIKL?n8e#s(iERilO*29#+w5mCs^`Ne)bLuzuXWCwmpBE z^)Sx5#O60=le6#~cgWdz8X)2gBDbKi308}IfRM#*T_*rr6483a*q zZah3-^gZi>4zmz)x}lym_Bq7Mvu9f{N_?Jd5uIG>vFEqWuRk9kCs$1OY1lTxh%GUG z^bIRwx&0Iiq|;&m3Ne8T8sMMggK6IO$C4rOZ-os-jc?`#eN`INbi6pk@odfV-b+BB zsHZiLL-$VYYOsCK{|ZH(!FJpziX~Qf`W?sHStY_>VXPjoWAwu9BkJeayy5blbbWs6 z4J#(29%okmeZI{?3m*wY)?>tgfG*3Wg=DvmPbd3Q{cw_j#q^vFAdSJWx854X;DVc6 z3UIcud$NU(E6^5_mn)snVOVq8yQstIK!u=hG2PKQ-obtL?MHJsH~Mz)Dr1attQG!+ z0IfDD;@}$a!r954)^|yHVPowt#4lv;c<=2H{2Lp<@#S)#_E|GN* zpAbHy90M%ALs?E+->!++X$JXSM^?r*&=x+Vye_mYm%MtDCNU~qY6lA6ZC073-yv>V z!{=e0U}%&gO;l70N8uBBSq759o3Tz0DStAT?^D^0hLq#&Ei-A{QK~YV8X9Y01H26t zro=tvT#c2NmUR$sAaPv|Igz+XMy{YVKEEtO=lW?@AWwfA022*hy-s3!Ra`|!mboDg zo!Fx11?Qq&USJdH4cTu)+Z@?(S)#z#R5yTJTRh@U-VWiMs3|%W=WqQAu+4eKaEIS( zOF*++uDS3GaA$7=ahbH30Xx`1t6bFLH@xRAtacAGw9vdVtFI~BDho$nrnghV&P<6{ zXTeIdQ<8_qyoS#qKzJW(+*t?c33BPGGB2xvwS6leEOGf0oyJ z)|wl_%yJV~h}nS=v=ItxLPn1$+r}un^|$%y!dJdj9OETpzw)K9LG0Hlvzs!Eo8Ah@ zm$LyrLz2drOTIgA>$Nd=+)+ zM^}#Paq}QRC)CzIvj1<^=(JIPP^&oSx$1zg#k~#OXBX|1{Z}mN@&G@7mPMajm_uqs z(;BXDCv~YoDuuh*jSZAq$6rx4Jd5}W-wQYsTGNX)whPlvvjkG!wHncxx$>=tVUIHb z`0tvXq4a8g3|~E++racV#4pL^LL^%MEL81&K4Cr3;n^FTA4K8cKA49s^?y{j;-@ke|iOWP&~v!dacjgv~e{ljVQke zRLuLZi5kq7Ds^U{926GAbHI0CkqyY>l| zTSHqZ?zJ_`!>4+Lcka zW9L}R8~yM|D+Ni=_AJA%aBt+59BZYt)gDsyCFy;qAJJd0I)dJu47WvZ2vJTo+7PtL z=kdIxH~df?kK68STTb@rIuj9RulKxAN@!9}TlhTDb&h4SsA+kRiHJX}=Vb~u6ONML zB4(7hmn(?OF7q8(bvgabIP)I)OF zxkP$)$6A#Bjjrb;@tn;C7h7c`oO!b5IC(zi9=aV321En~#Q(&*0kKbR7V)-87)0Wm zWdkW>NLCf^xf6>7!3})jkdvEA`zYSaU2OW4#REWB9-$$zlo;UdWk$!f^YAJ9%4Z4L zHSxR(AQgm7tMqO$ETB7BvH@$Y@I?W7jXn$Z_#Pz!@-T!O1Y`u^mn{Kd&WcMScmw-| zzV4Kg@hHpfKF77(q=20j{*{thmKqJwvH7Fk&)QGMTu0MaR7oS@Ah?Dnd40v}B$an` zpz6~&-_%D`TnqnLv2+Z_E zUc1ck* zSxkP!h0!fO_0pL8yo%NT>|EmTCcObo=L}Lb?qOpSJ-wVPB`zR$#+rxwTDRkq+w!#3 z;u&~(6@Z7O$0e?6sad}9Xmw8W}(y1X=kGS2EWFP zdihI6VHDx5%=sGh0wdFbZKgac5AoS{EBAyA9ypZ99IMEXz#8s9pa;O!$VDG4xg6bDySiewKfK}b42F%&6ASi`S5h$;IEiqF$Np)wZY9!M$^q^8bm z<>&~FiC3$Zdpy1NX8=N1YC(c0mPcy$O2ECU^rWpOvGjo9_lHuHpZLRufgNkD6rcjA z<>dO8=G+;qzKBnmzuPEj0O-~UfmE|n2jWxj_QsgR+@o26_y=Xs8?`=b60F|SO;Gsg z2E1yu*We!OoG6xl>%)dlvSoU|8_BDzcNKf8eHIusFhvuUrDX(pOWzKi=p@r_mFM(Hcd4ud`D83;Yp3&ZnJR5GdlShOeFXxt_@Ud-%}e1KjSkKc zVdFipTmT)mCHo#dGIYzqh67m@*#8bM23< zOqyVdMfN|urtTV1$Ra=DJe4rs>JPB=#9tgO%2*>Wx%q&hIJIm9fZG-3pL_|f+B$8W zcFeeEIP}|51wnHbia(-QCW;w3NtCJdlzB+kam}-=4;^PpQ z0m}QI9;c(iyglbz3=oMi(WEz+xYI7Jgy6p<6h{6E)PZjR`l`P|hK9c;=&SzcGQ#gE z?nj3(R6S6G9iaKRB}=zta&u%dxb?L&frbq$#>axV_+O4 zh9Z@r^+{BSq=&%~L(hb6CP^=M3y@7GDr<^=Jk8ef#o8!Nq&ttQzZW0)u%RxzF1-1muxG>$ zyU3dX>$jga)^wMwC$1ujvK6CTb>X+*8?= zF6jRu@i)0pRJi|b%8c8>2Oa*3lxg*}=IR^I@S6p(n~(0r!mj=CgD zy}oalt`scPtT{a?YFOFCaP#Sr#6Y(CmP8ov=QPf{gZ{yP`EOet`~c}@JhoD92JN72 zfc9wByDgx4?!tr2m!i=g%6msQ=RWC70LgizSlY~z_#dwFnr)sHjG9ZajbN)>B$1hK z=0?T?Y2GUbm>K1>4Ye(?TC)FtQy75Gt0lLblVx?x0>>-xcW@2wN2V zWrV&x>HRHPPD(PT@M0&4o_0D-0&KOZ z8~Ro>0nBnBV$(^M86~)y>51~^F%UYmGczm?c@LA%(eni?KI)_?y5-WiUM6@YG$>mMjMr^*yWF`W(gh>0PkMUX&9V8z^11wsl;Q<`_6x&XU+1hQ zj}TwuU99huLWeg&zh?$+$=UA`z2tdhfgHMp$0wp~3b@{B^D)KDBl|%Qf0|a2m{cS7 z7%)hVfoE)nnJzsNbh#m?tY!2wXM+M0xE$>I53@h0siEeE4sah%qO{E7ELZ?oIBTXZ%2N#}(XR2ZKI{3H<38v`pXar8k%=b!6lMQk_SNhS& zKj|SMLqPV2%Fz4#Tdzi^#~`h`?gzYYTxr6ESDUPUoqc4QX~y|W(X&{37b3h%UXMXm z>wxCs=re^VZHbl`s2qdzG!5NJl}9J4bD0e+$*_4f&@%A5}fa=HLwqZAy0VYvDecDYVczU z8RevK%7D{n!HUy=e$rO`=*IP<2S@VnT;G>|;zRAI56kNP zu%2MEfB%!Gvpx_$0?d~0i@LDrgMkH}+WWUJ@cW>XfzSKCsO^OxGzIwS?~A&AV4@+T z>SYrnGHOK=rZpxAH!(-XmWYW}YfP?hV)-4lhlzdUof_rD&OT}n6GxOWG1G~&*4R<= zf70o97~yp~bnheXX>)XZoVaqO_bKtzl`CASHeX#|8z3(-+MImp%FnhB7eDxyckg5K(W9P>(TgLwnBT5FjhNd0 z%b441v^G73xIB3wYhJ{c@AQI=wyf4Zw!UMQQI+ynq6CUJ*mpu_c7+nu1f-Dp9 zqlp;XMEGzb#5#67oCqIIgb)8O!iTZ(MPqhk%KS>L_7}4WBF~;a0{^56r~3V$V$Q&bKsc<)?0GbX zHZ<}&I(pZ3O!KE+L1r_FP8#GTqM`A;h)CooNZ=46ex;{)GoA;dr6>s_ZiMA#OozH3 z;1HOLHkS_Ov-@S!rep-86^Kxw#lbS!NR}UoC*RbOxKxR;&KLo$dOG=R)i zlSasFQYwdj(()UvL?@GJ@?3`y?|aCI>m8D|O(4g0q8LP{Zb75*fgCvW9)e4NA&Q8i z@0HbMxj13a6u7UREtJskIDh|f{pNBLe+LOhq7Y~!;-er!YF&fscb!cGX=WXg+KT+v zkL%Q{+a!T74+=|xNdh4c?U|&fkft8e+qo>ToIN&yyB65Nhs}1aueXw8n0BYou#$LiIC562kc=T_VYMh{D&21S4{$#tKQPe?VHIlu!}W07=^`=t#>EN*e0x$B&f` zN4k%YHzFOp`;ERVW^5`fSfrq=sN&_o+s+|e3qxzKt{VOQkP8NwhP}~0wN;ge z#OajzJl$hwElH(TQ5GrCggGyns%ujCnrM)Vnfwb?k8q83qBhEG2%^o_Nry~{DF5B# zMu8benx{lQXOa|~^eS#XTj&DDRNp5O$lZV)2H zH!5DPlr5$72LC?p4H4sC`v28O25vON(xy+lWr-987f9FxWYeNxi+~js zl_h!<7ZAcCgbHvRaoofZ~WfQ7}(^`Ff|js!oMutxrw5w~;WKP}4I z9mkL_pG2(Rw%)>`BKr$-=%>i{&!d0bA7^1PXUX*Mj7>Wizp=1@i#Gjh{qCfYaZr-8 zSVrw3n{b0Jj`ebg$x>YV6scSBczBzI0ljyX$2j5^n`Rr>-TV`wVy{9H$VGcT2B%xZhrc-^=a|39P*e1R@Y6LFMeN~Ti{7|-H(6I!cFIIb_V4?x4p39yE&xzXOI}4 z!VR6p#ef(2+f>e(W2xELVo1=2TG9fTZqOnAS|+E3uI+A)`f!7eO?RN3I&acI_Kofk zoe6kzc$_pqXPH>=*yhT5W(sIf)iYM$T8GZkt{qxmQF|kGx2;Cdr+WbFNCR1%%c5x3 zUQ}3+Q}#~;(%qbE66eah(^jJ-Asv4LeN+!XLG>dT%Qj~l4(_U~AsI&uu=qo8Z>fPWStV z9gdBc^Qjb#=hc?uudgLAvaiSOU`YF3#I1O*oHrXv_u9T0p5PTi84-Cv*o<~qYimc=2lyFca&EpeF924TO+7rZtlDp+wmuNZ zG)_e+hwos!I(Bfo=3g_+0>sxN2``+PZ)r z9MLWCPOoF;@&rA!*Ea}%6`lJys%-T$vx33 zQdJ5&lydZSzQY5XS%4z8VR))G7HGNXowknz7wL}cDr9M(gm{_N(iitNOJpP9w8-h* zvBE%7o|2udur5efMYGij-wMgz>r?}`_cFVE%XsS(3>BBMaM&gjR^vD#$J&KuE##&3 z9gYF}-I|8)33rjWiTg<~Tiflbz(z>cQw@-&x&u3)qKXrS6kFfZGj?+~A}GA~OBh;? z%Wu5KcWr-dwRz4r8QxcSc5j-e7wCo-thNaSYH}U^(KUpr96ndS`iztNxNz2*IKdoN z!E&d7X=`E2T}xmRp$C;+>Qa^`P7EfO)rr5GPb&2_6vYJ+SrjW?Xd}{ zKo`u8Oi^7!QwKP7u0nVj+53?`)s0~O>QiSed+It)u)0*vDtCypTb25GMJ=pyYYL5b zTq&Rn>Hu^>P9oRi8`q<(=a@52#niLP;bMdIHW%+g!VV|@hH|EXJkttPM{&^LP)mNe0{g!SHY#_hPm&f$ocI% z5p5aVoCpWIR9k;rqi>gi{2NS-Vm(2{M=If%^)EeM7!_gLra{#jc$^#^iJcpi3`pz=3O>|r~ zmlHyAD2hr{IQ+}@TdN6n+_{oVJTGKkm6}O98)jg<(dz-otj) zc(y{^HSXb`oCVV}~=lOW+n1)vdSb zMO~^^HIaDYvcsF|x`xLd_2Yy^1P(+ZMbBf2=A_?}94HdU`L*(95Xtx0Q8lTO4)%9Z z?w7=Lj;cGy$FT*U`8V&EW5=&EX>Ln*6n@vL)1u}q(dE+H)cXQFV5Ua z(s8S_;FvSLdrPcND!;5Ef~td67ag|B(rRLk^p&nY5``?Q9*8)?2xbpP-tB-C$|mK7 znXPQCy;?j+)DkPZF9`@xS$)Oq5FASSr(2N%^M9z4u;`b_0d z6^4a#-@Ck<)H{V$U8%q_xlXo{;oB-l-{g~IU~?*v0wP%&WdYYS`yhZ##qX20XFEG4haC2PaKPu~ zf0%{G{R^wPQ)w4J@cm}p|4GZ}xjFxEGL-#yZ0Iv=|1GJX^WX9BsMLGeP>lM&`J~Ye*tIB$D1Uq3K#U>QXmL zO4F9gQ*E*LXu1+SvqtkYn-&C)N8qGAgiSuGV7ouO#Py<^V~v=5AEbR>J^yimH|}l- z_&mELkXXM5R4&Jr6`H$+yAALl97G-cBH}#Okc}#Kf~62cB;rHcbtWaNIDlxbO)+r2 zMH^AzJ+|^`9Q|7izifx(ecDLh2y*B+3K2f)cX5|g)=tLx&3=Lr@jgUL{}(X9)WYfX8lh!&fx|xo(^V0DD#_* zZ7d@S8Wvn7Dg>cWk9-Tn%GJY&T-frB7<>s$n5+ui$_{5IGhdYx^B7Nd~D7!6AG9dtUocdzd_T(t$hnxUL$=3mk_y^t+gbP z6%O358%9ZgOE3TWKUAI^X|G4sstbTr9Zj|By4gVnv^Iz56pI6xcTgQsu7*^H4y zLK>7IzZgJl^4s_8fA|vL8f(BdKa~I8UONbiUA9uiLi1aL;Z0toU$uTsl1L#*_Rzw6 zkN-ncodVN9tM>8_9iF2s-Q9Gx?n?-U;Hd}^4(Q`=P1AB-j~-{0YzZh^3yaI~J8P!W z{s-%J+5m7f3XIVzA&)!KAC!#G?!c^2{>@0uEOO-hp>jCSHa<;7qTV%)#u^Q-3?`QB zAF(4u3KydHNFCR#Kse29K{$;bfKO^$fNYeWt~OPP7(Q>TMCycYyp5_`{6#Ph4-N!} zfybEF?S4igV2AfAFeVY2TcG)+u&J15eq(<|>0Nc1&y5VW2T!w-xjeFq+x_RF! zWOHwwhH3VUG|*i+vfQp%DAkU&4fgvo%CPj2i}I0j)dX;$uM?#=sv+lO?r7DBY z-j_JiQm}sDb_tH^IdEHy-^);2tFZJX1JLFK<8gc$);|5bfl_DcT+TdHW7juUam20> zGhUJKxB((!%RO&qkJMDj5t1T?$=Afe^c__F#FiavmpdEivvgAs+^~e^9c0?Xa znmb_g6i9o8#^1rR9WBbzh9xt|!N9^3L7|ei8NlcpUwt!ko1>nXu%d6zTR9Du!~S)- zT=g=#wQw)PrQUXJnz{}1Dm@JhJ&0%|4@pKt3SrYkppKou5#MF*en!Ifg;8H_=_QWQ zhfYSMqu_~S78%3)2f};M?`>s!G?gH!3zit0(?!||lZy@3$HEXRk;8pp+S=a#gT0Hx{5qKBpyd|=3u zYh-@n5t{I}omkQ{8eURjwL)Rj6TlLo)_x`(B9`sg;c+W7F@8l~@LM89<$PsfQnI;~ zC2_Yj9SUqd3?tHTH-!GuS~I5snpmRd+p%)22iz5nwx3Rxit}YjypCZt)~*?JmvQ#1 zVFd83Edz+F7j3n+#N^({=?Ha z7m3#Kh$ke*G#aT~N?!)IE-@?iTI$gO4E#W$gvb$&r!=5e&lPRY`hl~87n)sq!%;7r zsXm>6$y#JwN=x>R`K~b7V6rV%>#Ro=4}q7AznuZ(^Yuj9avZ6w5>Qf}EC^ZhkY#wE z4R##8Cq&bXE%K(!z_x=t?gcs+W%js_`w>N()XEv==coW%SQFO9$8!=mrq?$nG=K3L zg=hb6Y24cTkR~lMi)SR)MgFnRC;O|0{84BA2FHnnrY#)50T+21*_A0A|fu`$cT5H?| z|m_n^m=edSeoKSIw%=NM;<@I*Z5hp zwJz_)65ru4F&an=Q1c8qqhf=u9Htxbj3YC3F-f@UFJQTJjZ_XZVI}zwSKS@Lqyb`S zlZ5$SsO^%TLz!=-B$o4?>I9(^qX)fN1t|yX`|0L&>o}5dV+u+VHXic(HK(0;nx{?G z#``zI#tQTNX%*TC+egX!895{0{!OmK%ru6c!NzhVvX}}`FZ}u*i_fM_bzOrvb{9tL7?BDF+o zl^5{U>t0z;DBbZzb{R*Sl#p6SzC{1+S~>nbCvN6+ox{VXZc%0)t2mpc*T^dYn0Xt< zHNT;4rt3=W@{}(EzL+u!`1c3{6fXO>b&S85;Ow7d6Xw(g=n+Pz^#do;E!J9%pC%Tv zfMdMF__^hRlk_-id>J(P^wf2@ENkTH=|g<>@`dr)EZ*h^a>}>R)<-?cvP+`u8$kd4 zZ06MU)Hd6n?{x{Iyq&ZQznzwARvO3#qO8Z#(^O&UV5-<2GY$`opotKrp4Z)J8}#FQ=U8yFX==f(Z;(FrR5S`j@J+%zfN#`u zL}WF*Sheb_kE3w%KfbqqQ+2Vc%|+;P{0mFHi0^JW+PIFp@*rM`3*zyNw@gp2PnKmb zVJZ8|aoV=2%$5;Bl#aks%dOeA!57L7p5wb127hUIE3U7k&xGIdOKIoRz}`V1nEs4X z!iN$Ot1@OrJ-!Z9S|XiT@C7h;Ps(`P#m}6c1W^z6suSAtK7{N|$M3PE$*ekEQ=rHn zYrbPY$+86Un3C;CqacJ2Zr2HUdUPHjf(@WIYA=ziBj}oxtQ53V`rF6(fX`RkjNx?s zDkx!W9ec7()26&{srFb$v}!LBf6;gye)fza5KP2YA$uV2XXVX3OP?4_i>MN;31?V2 z=w+;gb3BrfqU$Ah;J!KsygdCUQAd8W#hH&L438cc0VM35w`u!yop4|lsMw;#(~U$7 zPYF+F>|i&n=ZenpRYF(rw!DD>)z>9!_v%z+(uP^4<9|uaoNu&C38=ZFdTIkX?o6=L z8O#z(eLJWK+c&_2mYN>uHw(@i^^}gRti!`Q4b!pM9P5D+b|Y<{JIb;&&?pci+I5J_ z{bw@%A@4KOY_b}yXHTKC892U2Q-=LTU= zHm_|SkzGL)EARl?_+Y(bSvqmpFso`9i|L*})kP06U#R}*n`b#+>UZjLY zs1NP3j#lqG45UPy&hB?{O*c>hbby2_hU7T7Ti!u8XUOl;wdw%sa7WzRT5~rV&gPed zBlbl^LF-W2!V(G4U%r+?piqtvF zco+7gai1}_%v7^mM!UtcP)<|-njpyJPzC5&iG&k&9DF30Pxul9@ZH>R-YB6 z4!)ul^bJl{4zZf5{Kne=;sD0|pqk?C8wg%M-2ue`{iFN5r1zKxF|8+5cRfAT25^pK zVFyHYZBYu`;b%bw3)uhg^Pn46Ah1)4Uu;l%5T(J1qzRPYs8iTJm4;_qs!R=*4pJZt9wxSYK%#2822fyDf1LPeR%ulMhqs%WINbAv;G6XE5-PNQ6g$S)($hooK~YgV zkEjrrTh#`3MCpB<-#gt+ajO49Q8ITYH^??qyk1l3KY%2i{>($J62=Sr1%kn3R>ukM z{F}L#(jStwvnJb5q*S!|2QbV(8^lUW*g^ zRVH@g_-~N3I%Ci*l4&#O`?>v|^xk2w$3qT@HdJ-&XdY0cGVat6U$CNV?kI>wc4@-} zQQ>^{fRpr@)z?>N7~d>W<`8>H9EI&w!9_>%Xi^I6B1fp3^k49e!a<*V3`==VV$(l_ z$z;;bzl8qH0=!JPd~pMmjAS3$F{_N0Cj#PCjOFW*B9IKz%ys4mW-Ac}bw>I#-umwF z4s0N`7k&iVDXeV)#Z}w2@!iMa$cGaRGmT-w+{h9r?$gttYnPBAMF7r5Es!eD(=mR! z!<_ewEgYiZi?I%{&o3X;=JWBtGWkLlx1I5~xw?p1;X5b|g-y4tTi@q%=WqU(29{T) z9C!3f_{F0ZI@`3DZjyaA8aRE8^`CPOtBd~QnleiA8XxG@bOpqYvDfgWgj>h zfeM&z^(;rmhLBH>osM#^Fh``V>?ZJcNm7O-a%U9fLTlIPj=%O|()WN-P|6edp+9{N zy>Q0ciysV_UdvDc7(AVmA_HyD+lyoV+Qb|W-A%v2hi2$n@X+_r_}|`Mb%JZilbUO; z+y-Acc@Ffw z?{;MIFi;KMOaUa`&8^DX-~Jefc-L7^?3T~~P!2N8tD*dNTe0}XbgY+HZwy%#=Uw)v zSxxJ*BmrrDvZm=1Fm}D&ip9D&8F+JXozX;b9YOustUZcwP5EjTM?stH3ltG)TJcoe z^e7kdd6G0TsysBB81!B+(aVk=*yuLSq|g0hzr%C&TjsTvqu!lA+E|Y7IG6^$`?eB| znEg!m@jp0`jKEK;FNfmZ{joIzY3w|-2HxH0URz1a!ORmteK0-M85W*M>;8cKyDc@G&`o0k$SPKS)R!4AMP| zeF@uJ(hL6mF%hg{_t*GYhPalSIRzh)3ZGOs$PJRE1@#}FZ2RJJD0DgDX3p;)pZe;S zwdVG{o1|o($jGpZK-cn1DZQ4IGa{>7{oHz3I2= zfB~uJ{b7ey6dT(sAKl7IJaUfK5+$iU;JaIj8ABM>n;|N)Bi=UjhNgi)UMM|E)c}=< zK+=4bW|loRJ^j5N^(;yQEu+@t3u`>z_!HGfJ;&*%&{o6sbTo{oxVr;C4ENu8)_H##!PL0Ej7} zg=&JQOcDCl^3=y9DIBETXX-&pI`Np9+<(zxE$g}OfZp#@MO@OYI(mZZT6LA@V@7OH z10b9Q1fWjUDz@r^NXU%k^v5|rl#X|f?twKzW`N9Hs^S}mL~?U)Bi2p|;R1qF+z7J7 z1m#4dj`7J6=+Fa`&@Mh5#9+F-0}8Uma_bg5KozMS7s(F{T3YHvpF7F#1rj-A>pVqP z($m3`V~q+?wdf618)(V^3QF4X zW!-Gv++RpDhn3~9`E;Bjs&wYapaZNdH~*8HS>6^7wrkc@)BCPLCmxC#>(C)gR}rvz z=HxJH7um7bcJUzt+xYO*CZTXydpUpY%5kBDs4F$=14l+qQb<5vu15I8x}ilJ;wrSM z2MCJqqsW~pwS}|{+M0X#;HYavsir0dkb0mCZ2cz(-g(EDr&f)tk587vi3!>b-|dg6 zYH-w}Yq*}{{ya@#nGCO5!!SESD zKj3%|_sO||8U`}0I5Q0_S(vyH$kZnunGesuZ>jMZrx!tbQ>v~=(=cKZSOebDVs!~= z0nbYne?}@I+2n-67l!AtVO=@hc>AkWvajEA_2vDQZ|F!C3DRKKrxW(2RH5@_m#sc6Yq2^3cJtV2lE9|m)SaXKLMG@V2|ek6*_Lk z+pSpKK8Z+}YpM7_X;IJ1r%;S+5&zV^X6Vhs1 z@sX^ExD!Zq#)zyk)TS92)|svrFb85c@;b{$-=#_U!jUDEalh_Y@B+Y+|b zYIMv?>E?8(hv9Hb+M3VM8K3yn)It{oyO9<)cJA{UiqC048Ae9@zexHGJ=!-qWY%?5 z{Z;Go<0YZ7zR@&YvrhUO5t;+$G-J9PPV4$kPBoq5a8$tt7oM`v{usK8TUQ}zduYm( zvpa^L&JWvLm&s8F!@r&!LxMtG+eA!}BGG{NLYGj}aSz{#Ir==Z-*3}fuT=U0({fIH zLLEGoP|A)3b@GnW86u-dT7nBG@Yna+lqtl0zzV2|8g~~G9jp%_a<|8AGMmJc%|%*r z+VGWyWG+LPABC>s_mChzix#5VIh&ZA@1V%0ZUv{~#9rVYeCpwZzvTrri>?%v)Bm0M zK2>o1ssZBJc-_an2Gb7M0CuTJn=jflp_7NNIz?2IsGhZW+fL$AOH<>;8OW&I%$EgG z2qW=0UY^c^S}hr=XbOwWzHVQWF1Q5Lz;^_zSC8W(BXl!PjX;REbEuOR9`3=v&&VFc zAU>dEewiUij`hBeavMkE{~2->p9UU&pB*_`H9!MixtDO{3if?+$ArGWoX?|BD`|#G zpt)$gC>enxKfW6(QX8x3Z7+k%z=!HZNU{U1dY|uPrG~;ig#I$ZoXuUqbGid_%a*qx zvpw&)|NnI|=*|P;byv_ndxMkR2cl~SlJpgFcYIP^%Cdo#9b5bh?jqUX5B?O)z~49C zOok(QGo86L*<)b$@hn07H@AFLty6J+h6h|Pr@S*2Z z?o!!egX74hf=_m3kyXMk5Hi-KPv^dRVh?|=#eF|bLc#i17x44c&u*SPQa*PQHO`A( znPJ$uYGt$a&ZU2@woYRE>BR%He!TscMSuUkp1AbN!v*9gTidl2g*W<-$KI}?xQrnG ztK7fLXLOl>`ugpn4^-26b0i}TDYch_pQ^>8iyOC3l=HEWyC|a2M5~`+Bg{kZwvCYb z-`&JihNZx|tHW-}#}g5PMd;nc$9cz`!5CQwj}9=wu9$;p(`}EZp z$XT&1qcC@nq>gp*si8Q*wbk*>mnZwMw+wiur&H(l zxq1})b9G+j?3GWjDlO&f_UAP<)OWl0T;@B*KO^ik3ywM(kYLs4L+n)v1H=%kXKRE5@v4e@fC#SEWW1678s@pu*5K@ zUCZG@7Z+RgNIxWSZCQrZPf&+F`+P=E8n*p}Oy0p03pnuH&9ch-^^`0t;U;0SlULJ3 zicz`EccbSRZ|KY00Kr?~?IF3}9xJTriv$(s9}ErIhiGnvyHJ6N2c3leO=UuL zEICiWg?=zMO}q*`xu^!8mqOd%BkiTywKt@^>`bPvKp_`J@(6ti907aZB_}#T@?01d z>zcbN^};4V*pDNZ#R_+ASI1#uIbz4oC)z7EoPn}39}zX`Y`=7|B@T7FKEPdeWXkPR zaeb~kfa0!*cp4`3#S|qB#~7YQvOx7eC+Z`*+U7TO$vlG5y@F#B7h&fa!?wh{#<&YP zZ2D0=7q?|qtnA<;Pe%&;SazF3X=N{W!uts9bM$UQns9vX6~SCsGLOR$)v*sRQZvYH zTT|MmE77wN(`ws^6n=1D-0fknkRx$yJE5K%)x8-B^?tnt7QD+kH~9$ zH#TH1yT}$kF~m-&m$k$$_0ca=j|>4zZ`4X!E57aCmK7?F^HJq5HWb94{qzd>4Qszw z*R>?L-%V#;(fl+&btq;@wu{#1huI-p#`HiI@iDOIc5Qa+@Q+<>`RaZl3(3^Dj7MSl z(eTjmTlZ%ntT^E^?Jve(*aGhSJM%99KSVErR@KRJH4fq@w!=4c=;~Zx*{qkyWVs+r za>4vJs&R|_mEG%{$^7iH0)})1E%la_BvbsUbPe6R1=H=o2an2}4U~UrDhR&`{mrE1 zxcDEfYBK;?domn#{7Rh2JHEF+M2bBxJ`Y6bC7Zk2zQdAc*EqnwBfR|@Xe_Q~S(()B z7=4K);6m`$nznV#?@4_4aG-?^`tQ56D+rC%PpP*xlUb9zO_M&d=BUoBg@v5b_LxOg z@F7X7*L=-f?L;=Y-}C8}q^*sNC7(8Xez)TI<1l*-WDg!FKHR=hwJ)}1g9AHz1Ern~ z7aoQJ52Uot*5?FcSogkCqhQI!WHZ7Ti$G-JW_8b9lpggem)VFnrQvCZRRpV@H`(z z8}<^bQ8sA-I5<;FBhO@$muTIcSp;d=_a4v4?7jW)nZurqx(VFvCSGoaI`0mNGZ?W| zT{q@7KIw?rQ17(VX?S$v5pau?$ALZbeQqse>*8AG6~*;vA^Rj3T_NYdG&fQlkDxMJ zhcmOCA^fw|@|C&pp6${T50MOh1NCPFSR{y_2VTEd{)MaNg%pcW;4 zyfS|%rIWV3(GaVl&eoN&B<1wmvRbzx-Ac{eja=fb{2Ted3NE~-^-5grZVLR36MQEw zpk@9R!v3bcz>!x@>Yw+M;c%2DV%MOXf1f`=(qFj&0t?6azke+KF_b=n7K%GGj;7}F zd)mNQT4$}U3yDCqO2N6=*(F`@7TKYx1C&XWv0^#dEK zq^bwWkC3t{-#wfI%D%_qG}6+e4UkzwByi$`u8b62-#8kSDW$8Ru=a@TL*&xW#oKD! z^t>zDE)FFsW|Jb35oW;bF&*eV=cC$7Vd_gcHO9-E5&pQ2zhi}_!hp+dR&b{6ArfQ1 z({L}(J1w|yc!Q5KJK?rt*ilKX55!sIxzW?t;Geb3aCzpdE(Fd#)E;`So?gi;>Ii$f zLO9Kse^ixrObqEKvPob{P=De0BH*&K3Q;z~{zU^g?cBf{@06kQZGwS9YP2U1+H!dTV%&hwdxPtVCD5T z-2t|HGM>j4=<_rCq=&|iANCuKLElu1ChF$D(~W!y+%s(q9fA-VVHH!|0WAHAM(8u_ zGW2itddrZM?Xik1Y}0df-ci|i5tDABRoQm~2p}T)QO6A$Fo*1ti6xy5Yj(+~k!-y2 zCMhopw>Q|Rnt+>t5vRDQr?gnb=%qD7AdCJsifj$-;U{#LXd{F!uDg22u1|NWFhg}6 z&5^h?P=Wt4mwrWTJPg0an-Xgr=$b&ZbZSYWcfHi{`})ZjCh6EZ44tuiw054+*7H!h zL!%%+$9UKvH)l=#K#IX%5xAMmWmdDAYrF-QtUqfa@RM4X7-eMu#Xp(W(cSduMJSzO zok2~=Ei$;^SXX2vmplW84Gcc~TDHuY#qH`*j@G!zd0|4Cp~U&o@Q)!@RuVk(q%JO- z^Lw%?Ct;({t@Ek%xjBD$Rc()ReXiDkJ|gssEgV+dUOO^3F)7R8ir_*pY1}P5B)8Yl z_9E_ryZ-X#?7JJ^GR-GFYyhXh7974Il=KWM`eIR;{S~B35rsLK;$iUC_*>Pv5f4AA z{2jGnI_%DEDW|uT1@D6@$HtMC(VmvWc4f|rEzT8OBqb?L&#GugKf7)2U_G}<{6ehQ zXRhS!lI1?=JxP$hJX{nXR3NScT1x{ctxGg+-2(2uwH`ssR3(!hL%hv04DSAZMruFx z7?P^^jMAt=!=qZ6GthV0XB>~)*eK|IQo1XN;LQ|@pjEPC9gw>Lf5za_kNX~RJU??9 zqt4b6E4QmCO$o8W?ZE7;&;VKO@1D+n3LB>|3ixUOvn8kfr}igd-(zq6(r;oP&P=iy9v1or6m{>c zCl2IG#aWJv6L5qUzMbqs_jf%Yf$6yuhv}{rt7^HJCTrZxOy7{G6NpespG19rO*@@2UGNEJj~Fh78AyGfoVpe={AtY#x-;OUeRd3gWRt zX{HRKSztTkM`!m2ng_Uj{LLpPe0NSQ1wVhuuR_j!5V~?4)tRXf6}1E)8cawZ2`EYD zMc+z!9lHf#&okhPE_O&YD7+}wqpi#KZ-rtZm(|`i}-BDgMJq%@FFK4qP!4X zHYcAMVL1JGX}XIa*<4P)GqR2j8kP$8$k5%EK#9mW`ZYARj;^K2inr*Z;fcmW-o3yk zccdr09fuTuqsKJTJ0{q6je0#jESU}IV7~g4<8*Zp{STxbPvq3Su$~mIwuH9WwVyso zg#y8-45EQ(Gli;)uC_O0;PxO0e-!~Dkt>kTG&bQ|nx?ZWBf8>4exvtagY*-XU>@r4 zwTYoq4S(whTJ;fbf$pM}z&|IruwA5W4y?SP2?}D}&PFkab}ic;4K=n#c_n;|Pvq9c zB*ZjBZ%U#2Vo~)MnpiNRINjBnuBB^~&@{WoqDBZ9`plQtM;LampCSLF?;5u73b>* zJ6do7=jOjQNN!P|egx;x%SRq~+sn~>Bi`{8%OEz7LUKQgM&P2?y@zCJB0%WG9{vcm z!4#r;=@?2&D65@~yXR)$oOggR(`r+DGPy*Db)0Dv%9)!#A#W8h@tn(RDl!s&S}t0`h7Y!!P}xU z^zU`lGwx#J22&CxD&z5PiCIsJU^uW`gbDp+St~wjRzN(jR9*j)VY^iA)WQ=#G(IF5 zI!qDhz11 zKV~yN(({_Dwbrhbe>wyXHfil#*ZRJ&eNZvt1XZ-@GSIwTgC!`-SEZpFXzteDDjfMP+#DDz3v|9 zJvkOlITo74^U;TY7Xnj(tr%Nn9>^BVPDdUrZV-pWbLtY=-jnElytnWp&EfBpb!eKS zjD&$&$v3&O<4nhuG+<mzH?ODxT;QCC8N3!!kz z9jPbJ^feeU?adxXbt@840t8TbT;h6!^ReEhADGo9?z^r{xm;+&@-|Fs=?k06hQvyP zLa|}g(kjBP0T@r8DJPm467z$Hei3m}Jrf!5C?gTVdhqp83Iz1g#G_ge6fL4A7+*uz z#$Zraf7IV-_>0YMZE4X9wrE($Gn_173!TJ+W?SUCI_x%FvIY|RKUQ(#oO=SrpTC^;y6^M|OM_OczBXgfXy(_^ zgDJ6js}We}Pe`832`M1*PSX|^v%IiG2V&Z;{F{~V1|2AY&bW+DIbz|yu- zsuMEE-q!4uj-49lDw~PCnc!V;j|)X`jys`r@+RnLD!GAHa8r+ff_G7SY%!@y)SiG4 zW!ZC^dirkPew!P%)c?V9$Qu$yytdhu-DcT&Ju9cPnVSs1Cq4^79#46r6CETE?}U^~ z%mJvGJ&qJ)Htt3n5p-^luUsje%CV5x&bimEP|>+ycS-Jfr0U;3KOX^|hUc2Hs8pZj zOdbcjv5}gqzla;n6kL@!z1{Hx8q!`r{wJCyg%%*AS<9@Byk;=cM853 zAPDZD`A!n})zbOMs~)^km8~g$4bXRzi16q_k#CJkkGoTb47Rn_T4s9;5C=G zDBcZdj5{MvI1PDAggCuxmc3rFxSG`fwVyCP!pEZrQE9^Fa=y1kc7w(YcFdqUW+88F zc)%etVxmKy8AmDFq}hwIxo*GI1jTNYUmu<7Yu__Hz2SkN{?%W|iqpLmg?tLPcS9W?InZL~ttcGp zE!(~Y@E%v20bAVbphq~ZLE#`FG6Wq9Y3c`*$#Qxt_O=bM#S(e;KZJLRF5{&FPpL@@ z4G-T9#+(2VBrRaB9)H|bgyff0Hq8-Ysu_Xs8>G7)^TKbcWI7kd1RqOBo>%!QR)H^V zCt<&PCXo&~uE1J9yBBB+Rk@w&5Im=X#?@mw?ZUO4j`%vU0qSR_e-ev^Xrw$6n7wS0J$4Z9ntC z$z&3@ADa_Omtr^C0PbR9y@`-;J!ws9YX#p#&_&0NS7(EJCFt5-Ml_ExgPMO)tF!toCuhpET;bUZuEm9p-g zG90u;2w#)X!=G1(MqiO~Z_-~Q)HX=#@j+>P-!i121<0DAi3%4qKzz-&Qv&5U?h2X< zZfam|Yy`ZP3engnlg%8R?#p^O&s;v=sW=X3p~ER(_} zq6ZhfA9|%9Dd(3%Z`=k#Xh|=F5}Gk)|AhBmYq}(%&Og+{cf4jRiAXwEcr?04Dj|f! zR|LD9x{wj$mF0Xl!Oa}T$29^TQ?@p@7&WgSb+d5?7IR2_bj>|}NHEzg{)TVU2+NSy zqQD1BXk(AqjfV|6L=DRij1w6XIl3jLw-v>iRC9`?Jp~<7+KvI_{NGM)r+vI1t`0v6 zy{xu0{^~a&Vtn=_e$dpUx3dJ=mAW@rLlj)+kYQ^X-_704%%dFV^CIC1Kg*V@w%=?u zKKNz(p^xum>Eas47ZVMv+&-z}Ghz9m9wxQzDC?5ZuqiUR%`s@g0B05c>y;Yq?=e z-fkF~Ju_*m9K!LY?0P5NAAE!e9 zYr_2hwi!4RS2G?aif~H4p0a2l`fuFH7gyx&{#2anQiW3fbWx`;H;(d+jlMtn%a%Cm z&-9sDIB3|kUmejDI#Gp;Hl4_6dpGJ=j=Q?P$*%oWVOhv;%T=Z70DsEhR^4L~CfBLk z;`Pe>$JaaL3Et8D$`o51kXS!kPME;K9R}d~l&TYC zwvAT5*_SZVmek;Q7IjIuOEo3aRnaDeXSwI-1RH`$_}l4V)HK57cs3LcjURqHsU*K% zCBc7FSmNaMw(?WPQ;&`!T?nTm>AziB*tEsJE#X1D^(EOdC>E}rxh{QhvCYLUzdoMr ztrb>YR7+9w^seHv?6Q~f4AWp#f>%gHI`L6lr&h~!dZbqAc2;_HrK84-o~w`?eA((M zhAxa2KA!m~E-rdDZEw8N?160PnI$bJ zVYa*@GYNlmV7e#MW&PFCS?D2n>{MZgZblMf0HGB5VXJPtp2Q2-+8PGNh zf3b|@P!69yGL>+@4Je-K|D-w0DePtaRxec|II>ng++5ZjSwio@r>tn6I5~{QF*V3Q z0Z)sdvNRKK9=&X+<|(tfzv5Neq(oN-lOu47)QRNz#{9=x?`Vdby5gbMt2X<^S{Niw zj#sJKn`(l+241mSzkRBJ?9~{!2pIw=G2EeOB8H{JCddD2f{H)=D!U{uEx&h;`>5!IwE?FWQgZtYVd? z)JwwJ^K&PmVLhiM?tHLbV)u6>RnlbkZXB(MU}RVpW`Ae%a!6a%0C8_Eqj@F?H7Gf&e=uB$C2Rb%8V`d^a$xERhOm`$oIZt-gvGqX|0SAT!PH@tB2~( zVpSVF)NLtO*6ZbK9EqpQ=+_ z)XwX~NVl^%;iGY1dFQ`MS=Z(B4r4xH4^Q2PX)f!VByTNEET`Z0Y%O4}_?z@zeid;% zH9RBAM!^nen_4k^buv5rR$cuUg#2r-)Z~(KVr)pOo#OlX6w79%KdNLdV&8?!3}GYL zTH*2~1U$$6bW~@oKJXfKRIk4AwAi68eX{&Os_2f~T^xZ4kvHUs^U((~x{&k7zl)A~ zI=kA+f{LF(c?f9wb&3HrCx1^N$r-l!W^^>l77$T6&;%dUzZ@hScHK4w=OjGw(4XQw z*+Dc@kFLz0Z5Is3H;=5hn6;YsE^%9Z2D_<<10JHkn$K0V>z}kDPlS_>rq~XMOfRV? zL6SF3Z!c@ZK|Wj2Tq^1&&Z2G=UGwUc4H@H_B0rQ;5ZC?vaVPa%Rdj(qNuPyt$`0LW zw$-j#P&1*uBD9-v-fyG1z>r-|3y6W|@ty6PcZU=|j>h*(J+3e!>CX^ZjQt0usqIMp zSM(#tVFkH|=#aQTj?cFZl4q!$g5+R}uX!sH&%VR@llDUl8Wc@sufLTe}x@OwvNYE5^qoy#~8_lRrvi%)NMVI(Tda4#g$bd5BYPeBmt_x zUn)zF$Dym!)WGJ^Xt73)4DzhPa|IyxDdZK!o$#DcSV4Fm@`s$)@LB~YVFWIxKiCrx zv-p>6h{fSCnoT>r8>#t>df1Cx129 z&uG3Y{mTT^uFiRCGshp=7aJ5uNryZclMY0>-~BYbxE4P{-A?T6M7C!rCTrOCp|kO~ zy%Hm*)#qNLZtc`aoiNc)`Rj@RxdaP`LV#Q`eT}U^I%sz?#=gClzn&7kKo$%n9!M;Q zBa4%xI;mFtuVP@jdPu+=zk89lKa3%~%^&{~7GW}sXpwrH2e~UzJH}{wgd#90#sq|% zi_g=QtmgQO?$Zs9vu8Mq7TxZ<=)mogn5n@r?8Oz0vX-MCbcMuk!gYE8f%(oH+PJ;c zcj}c>O+U%pJa&)fCCp-H-MzK`iHrAQHtYTl(bXTSm25PqjzKOG&(^N4Z$k^q65v5raJLL`WL@nrV3y~Uw%f;)*)Jt&d-$9mk?u&E z=z~ilx@ZFEq>z}v)P_s(Hwj-{lHEk*204+oB*FpFu+}!~w$>*rPheSaD^pz?NsHF~sqxSe z)%{mzk#LY=6|kpmA~l?j=aPb~-Zob*wrdw9m;OSVft%a*d~i(Vt9G0D)-+KGFV9Sq zth@vt2lU3)$S##u@98kXF9!~nS)+c@@1Wb$-*(Lh7vMKS^zEU;hvy`|bW9F|KIxjM zzT0YMQd!rm+oXQm;2J>M3S(7}3q_=%$alhxP}9hKKCn3-F4rinxV@#FbT@IsHBa$; zBr&IeJ>%Z)d5<42p5HqKLM0XUSE@Ar^(f}KiK1ya~d@L zB{H72jrA>l9f>jsWCOS3afh+TuHzcwcA;jq;`xGcLbKI8w>vs><><>1Z}l0tpAZpA za#>h?Zb<4Jvv|u>FLE}s@T}yogOm+Ho+M?XsBp-QhNA7p4=dE))l^s6`iIdrU`C=N zy5df~5^fy8rs(#-z#nO0`X>bGA$pCDR?WzIEFm4BCgJ#Qa~gh3r{4F|-* z(76+hzgTLcK2=$0o?u3`mc+7v#>MZo1PZ)Yp>m=7s%DnDGh5FSU9d zo*f}3ubE5o(U+_ym8OGyCL`PdU5aWd$FXzLdBbVw`7B+Hkf}^jraAIxwG!_LVVb@P zx}}`tEx}+oK|l;zeF`XMIi_jRoxA=n$0E2!8HV$Gcg#F2r$ybudxjge&)hV}waM|m zM5W(glHurmN_zg9?spdD+~A^HoD{N@R%4&BLk*OYbRtSYyz`#7x_q?v)<9uODVz%i zYE-vfKG5ZZB}^+}ZxC+_d1uDa6|Uj%Hu70>vqFn1Q5+-Ci%;%9q)YB3(0*a;KNK-V zI+SW|PRMnpQ&t;=*HAvo#sQrm+luJIL0Rg#|5%Wl;wXwKn;JpNbEqVYM$ELEWM`5;rz>@` z7GEg1_3A#w53<*Jg?pe^1aKFl*wX;C4Clw)xElFqx;eIv2ZWgS$?`t!?`NOYCDw%? z)gBAOK*IK$3~l2f54&{HkjEGN)5>W2VrLgr2Hxg?al44%yBqwpiw_Yj-2EE61*c4z z%++H1BeDaH|3f+xg3VECqo2ea0qWeJ6{&Tw{1j_NDeKDXI=Uo!B ziQL?I2FMTnQJRY(pzROj5<-F_GZuuQs&i9AiinTKE;bDD4gD}#(J|Pm`*v~y(9}W^ zpECl%?qB!p6Lu;+XdX|5#o7W|0~G=hb80@p2N`;xe5N0n*Wh3MEuZ+*Qjyzb%FhBz60CEcEjtUaMDsuhpSbyoO2QlF@tk!PUH+6c&W7s z0Kx%$=!I@E%pNID|44|~N?`XeO~>ZX;)A?@pCrJ?yt+@bi{*O+)s1W3ZyDvS#Zo&S>#lk$YQ>Ee;ga6x$y-EmmQkCfwaniKEA-DSwolP&>&!6h z&Me#uh3U5|XPr_BLLDDSx1tH2q|reGJm4`tBnuNB`V=mOD-W zB{e=WtBg0p9W;jDC)hLoU6!bg&Dij zTQWg)JW=Y%RN%d(J*3%O&}VL}avG$MGglH69RKA&NDQS&Ycb=K|A#xBGi9{x^1QGk zU03u0dZXQWQnLspZ0EwM#~@V=8tmCA3ibq<-Or99ZjS{bJmL8=XZs5*?v_YscX{%2 zT?(7erc=BuhcHArh!lU3UYh#*h|E9^Hww=^V`&GBH}Q=9xy;d_CPh}uwg$Ul+~m?S zA*uBV+H=oBlA^$U>BVr6nJ7)PgQVZ*8$K;HQ2`nGQ~I}RXlx;dzCtFg_9rAO7&!I$G&`LNwSUrJ^|a*E4*G3{_;!3~c0&fR)U%fg zwgFFmVfN~=yP2CLEt`ZNN}VSto?*dv*AYVj`@{=fZdr7LX#TotGW0Dv?rmLT>b_*j zfk3OtH<3V#$Vif*KFUzfU`e}tDf#YvNWn|TZJ@)$^@sZ|xzAez=@K{l<&MeB-v8Z0 znQ1B48*(?SDQ!P)!`Z)QXk$|rzuD5!d|NSgJ3dW$cYe6=rDMm9{%wG}KDTYTbF;u6 z`;$~_UHm4=&?ez4+hlXV zgxgv!cX5KM`(HTdM>(3U^f zccvcG`L^?Ev3ig`Kg)d`q`3L7p8$ll^+ejB*%h`}-A`=UnLzZsA7aiY*)-b7kuEdv z0(?3b7xJ$sDTChoqPas7Ytd`USDvJhgP>SNw+ z*_>dU)T}eM5Spvgytn^T!PO9(bvAmHRQQ3C7GjA3J5A`1%f?|RaH~f;;E6E;i+cgw zZte*fnl@7oA(gm>qo>PZAr&W+^raVY&A7pn7{Yk7$)!+L6)!p(>-LZ=f#(7x1Uwce zMkf#VvnRv)2S8}%C3Eb_fp|~QpWc+hE%UB&e})hJI+V`QkAls^9L%ww zHuJ8@GCx$AsL5f;({k6$(R}a8Gz5}#LpkgHu+oc?irGxUKYry7nVoAz1+%aR#0_6a zVDqU_sdrC}BzyktUoAem901HDmSkuWzrxz+9}0qsAK74v_t}nf?YgEfkk{ zpJUe@o-yLvmT7#&dv-o-NNoxX20_ZDz1_8$vbB=f)m?ui`EHR-x6>CH)6>qS8%TFd zB-LZlysn_>#XSW4tH(OLFi2Z{OLdhM&;_6?j+Loj(BWAm+n0RC`<7&VYC~v4Ko{Y; zm?})XC*okJl83OTZ!EglXP3k|M42!2DfYt%4l^Hee*#}C@5F>Y`Ugv)b7tm>;O2t% zTpmb}=|_ZZD_^~6BNv{oN(6AEF1q@w^5PwZ75V@(3Qw_m6+) zryq+~JQt)OWnYhu`gd9DDL`GzG427QOmO~6;a?Ruqtp&=8I>5i6 z)La&vS1oAERGan>0SEE6NmpM0f}Iy^DWFH;-X?E`ad}-n6yn$yUz(|l`Swvx(YW~7 zXOS#e(_MspWtVHspw79Fw9eIFDTcf&ZLe)LiS|w>iVwz|8QOZyPB3w;L6T?>$$l{D zJeX9}&b>d}X|&)k+o#=q<*=7gp<$mDKM1121eWq~LcYpI&p5(u<0iS?L!?xxy5@Ht zPnBe+BGILi;gXPMz-vLj2GaNm8}($*>F6MNDI*@=Rt}fO5P^jI17yPLdiP_F=I5=N zM`uIRe#ym4Ks9{oFGa;WW*F7UC3zTTieoSV7GMWa1V=vvI+wqIopC;^{=6$Fm733H z(+4XV356WfU4yQ$FJmu+ORuuz^YV30k;s4Yy1f>y0;Jp`wVq~|&Ey&lWB2wUW)3<< zyu&CEyGWrjFRnm)KmCI#wXm+G_TgRk9^~)p7 z)K^9F&(tuD+~Wno@0Csk=ig zS*Tn*!<>z3Z;e4}YgY+>L^jZylF!0NYhoUn^oP0)7jR#N%|Er1e6K102BY)MWrLE3 zSH04Ki~4m^z&t!J#859&BEaWdYlkp2$*F~c5pJ?LrW z%pE?VL@col!hEaczr@R0$8M?%`47q8d&j6d5oIK{J6JIs02xjWdCA{8&~=yZY8#+k zeV#90z2D$SDZ1CESM-Dt`_pTwYXea~&1TVzb-QG{B&5szxhs)YBd|S zuKXBHryjGpq8NGy{!>T(OG#IqrPpCdFFM33z?WqkYo7{l$?Q!o3Q%{H&_t+uor`6D zG!(SX9zH+#%*h>|VrNHLGRF2#sQd)hEUIrvS1LvY=mW25uHt0Jqu?M4-EE#Cs-~h* zOOD-)O|$NM(Kf6pSHRV*!j;7}>p)l;vqeSI`^%a;M49pkQ;#)rNrZaGOoY8_rgqN1 z#u*QP?U*@XnXPAed(P1GP3jl*63AhQPQ#RK1Fxxr2b;YR${6s{BDC(DZ1KEXL-K~S z3Gkcz-LtnkQ$%$Nl5m5!Z~}7^V?yj>AGhdW^DtC9*IWhLtH|vQ+}<1etnh{{Y7YSW zKaeiVT+zpm!4&Z_UC!eXQtuCK*f?2RxF-O|985wx`tqaW%jgi&Rm)pH(pNBq&iMw< zT>N0#qSZCy^lq0kk*3MywFC3bMxFNsc>+(a@<6YPi2H$GMl@LloH;~hEZ59%Zs4%I zaSVCQi8REap}+jx^atf=(2i(s8&E{r&aXx{1c{5+LrIqqgDNtGnQRYAs!9nbi%XfG z@a*C0&}#{WWNq-mvgC`RscBHLyD&t_OOun~<`uli7idD4Y3P`+YI8Di^W*YHlL7BFFqu z_aNGVo0!w^b=8_MH4ptWs=0P~Tjed;7Mz*d@1O&Yg?p+}&AYpm@Onp2vlxe5W?){G zi{C^gG_r|a$FkFh7A4s!cPZBIa!udb_Ny>=KI6-=wK*>TFD_^D$5PTTtS}Dq_iLc=f_({OLFguYdu-qMbv4;OaEI zPcf$>-eP%!Ov>oOs2}8hW174_2iAC))jGd(jg=Lg{dnSr!HM|Y+X4k-WoByka~ayq z2z%OP(VD?kRk?G1rlQaw5xCn0r=UbTUku?m!C2xmG!eD#8ur8kznC)+4eJ(?h_^3r z$_m6G+=c`D0DJ{*kyEsgY16quW`)ZRO|H%ufAJAn>N-IVo}mSkl%E^72`3l-%UoSZ z`hs>g-=ZzWB*^y`wbME?1*kI34Jx&fcn7R$Ca3;#C+z~ z0hteN(%>BYwkU8vcuWEHQ#8gKZ~{M|n3&ji zR+9V9_An#iC0%hy*8H?rYd2&3vGpw=C1o!KR3r2*8zCsiX~E;Y_h@>kT<{@~0LV?B zuJ>&gm2h~rt8Y4Z%Zi$k+b+{{AOvIeKmv=VI&21*^dbF7o?vcLnY6vKkdvH0%PHFe zJyve7vdWg-eZM-!O%OxKqVO0lcCTwW)>cqW?^fCjRxr73*^0s~wrmRpB*`M7miYB# za#Xxi994@75`r#fr=(u>yr7#zV`%fvw$<+q_CoU8%fwrMW(2AR&rXDRw}(+KA?(!m z@c0MKk=m1!OCbgpI7933Oq8ibmd5DcN)kj z)8i?H58}}s81IGs0ApE9V8EojW2AvQi|~aWJSZIU^D3Kweu7_z!TQo~2iYr_Z%aK} zckBMtJo?@aw^_9Ic@re=#uNn!wZq?KZw6BBiRhTX=vO>;>}EB%AK$y=iCZ3B3`hIVd#uqHJcd~v z&x@`iawB@yCiTuo>{6|L^cSLX-1$OsDd=_7vdh(4uK!cDtem!n%AMwr0F1>b6l5Q+ zROQbPlF3NZ{p@KAHTMN|Zefxn2w=0^`sTwlzWC^BMuL*WJ&u_@DYemqj&fBsNIA&g z5Nhe*TUCg-M~O~ZFfT6<3^-N4ycG}LDf}Xn?Hg*O_Klx6U)(= zvjDztDa96Rdyj;B`Q@6I0nE*LyuVp?=Q6$pn7NA0tJJnTXFz(+R~E4rmhATyD0Ew& z1?N^;Q0Oy~eRsrHNAlJplJ8gRS|yWFvC0SOr?n^F?V1Ig(dqL8q@J}yVmZau4652E z+ehgpJm)V&4^Am@)(`_<}gUIHh;-&4Gk*LtCXq(^PC;qiMJ{k zfnxrvzo+_bg@fku)i&EfA6u)f-*{y>5@pkq3x@a>%fX<0J-bqe8p~mcG^UZhS`gIv za()-JUfbk5NneYR)UYSwE)wdaDOsJCj#JxQW-@yb{;)s3YfR>$xL^LAQ(wV545}^M5#N@b$L$C zF^O4X5%7Bpi%fjqvWmmCyL06`j}fFk#S!-uAqp8N#NlC4We?-h@zrum>ME<7mVe5^ zbXvx6BQY0iJqQU79pbo?D(a>ZaP&>_psv{-6l<#+=w$NzFAAKl-0$FUxq~a=T zf_oI1sf(5wkzGy{?U*6%1g$@2@jRF5Em^P`m2DW#HRgAv6l+hLiV8z9l13VUNy5qT z5~u7PmPYG=K2VkIBYf!qU0IyR`w92*q?RORH>Jp-#002WIY-BnA>P=b6wP++mL3h? zr|1Nz{umN=_?Bn^LYn5qK(Af*QqUupLbI7qBDVFJvA5rFuS#)~@6rXm ztPZ-`6p%O+A&B<{TXUY$1EInaZ7I6-BPhS%#;KF);<28+-;jb_$Niq64< zAq?qv5pH>9u5)B_?+K<+75VJc95Z)2H#O#7Q{>qI`pLKG#J6=m6MggUd*OOna#z7r z6Td{le>GW7YY6G4+Ow^cto{bW20pjsu2`C>D=*Ok37f%ggd?7Jk+egwpT~n1D>U1* zCxI?uD3Cgrh3Nsf_TsCSUu&=cyPA?Gv{2J-rk0-?YR$B~XKB??H@7y8IBri!01(~` zv0L9mF}oNK^8QKSdBCGtHyOkO9fg@aR^%P?94XppPPOGb>k?YKAv|xE}Q7 zMzit!?YVOjfEf|78h5{akv_pwjRr{ZLG^}WARxB=_)WQf?~*I<--m#8QTf~%*c+od z0Bj!`??$n&0V_nBKVMWaEJ~;o_RwA3lo@S*J%Pg*w*W;uPU-*L@-)N`P6Y38$p0)x_OorI=_orF7NB<;*kE@xOt<|ZencKb= zQ%ZCP(}5yqibki(*9z%};XofP;VGQm;H48_WfKdz?KhEfWK3eUHY*gTX#ND?BOs*D zKK)#PDU;{3;TSZZ@zHv9kE6jr0m1rB+h<_kFRlEKCJ{?>z0GH7@1QrA!-70#aK)-n zdA`sTSxt#H>CK}BaLwqjM2Gs$EK93Yb*VsDn5GVZD*Wg7t6HG*!fIecHs{`ohX<#A zN?ULf7XSHzsm=zJwD?TrKOI+^J$FEs)s<;97*EwPHHiM0?f=dwB3QIIrE1|b>ES_U z!jl^2ojZ9RKc0O!00&y@YvOf>f& zfZh53Sar4`r*HHh0gCz`DcHN2@9WI-0JyE9#h3=sLNafFevhuo^9gx2d>L$igXx?) zIxTpd#5;n-(o)85v`7OKvz18t&I4p^iWVqBG&0I$yf0xl9R{k=liV*~gJ|CLGVe&b zLbuh!n|luLoMALj-{+@m5X<>pmT_Ka)XZXLWv1sA46oDb#b!T9LP@i%tarx@ZuW2&b0#7+i!&;W0k( z(j0-X_GLcyPG=l4mP(+MxD!KT2jy9l-6nR$dVA zfjVSW&{qH*MibNS0znxmkQE|#`-DzOp$eiebop{o98BqYklQib>QJ7HQbCwV7TLq4 z_d0CUs^C)Cq}F*N-eZ1eISZK>gg*+@!)eEOOB3@ejBvTB$^aC}n~WYBl{VwOYMf7S zR^Lm2Zkf$158;GI@4TJGR0QiJ%-G7-FuKI=S<3PIJpxG*J?f=lAgcZtlQjz*hfs- zHZ2RXQR`MKJ?zxhEHBAb(U$B7datGNN#E!CS;m(_aoSEU^UIf>>qS^$GD6#l^adNW z>95$JTHRNP;YMWly<*N&<)k9z4B0+rRZTDFDMWtZ%luySor^tjOzswta;xHw7+eMJ z@}-ml)xonqA;${&GIz(q`oA#R#t~;E^-%6~cf%w8cAcp^(S{p~+oH~r6#&itx$3r} z-g!(b1?xbC?V%mW3^6V&Hj9b^wCS-#6~2VDT(I(eNdcr=n-KS;(>I5h`EWY6KK1$h zMmwt9>{4VQq65o=n!y6vQS7%GDN$9Y^;B;?Ro^jcd~|v8H0u zro@I%we&-^@Uz{}FENzrj7;scd#4?GG%4s(Kl0n@q+V^!R}Cg#*&C4VjJ5$V1O^P~ zOh~uOjGxI1h%iSIfJ4;kOr&GqkJ~8V<}SSt7M{Ek4HSR2vQKo#{^uN8*wEiFBVX>+ z)%GBn#0}{q-!j^ovO_U#nuR3Qos1DvFJkf9RLzR7Y2yW@X69-s9*n_ebVYJSh+)vD zE&bDv`gif&fkOq(f3#Dx40+p;yNos+YI)jZQudg}9vy96QRQ+Zb@6%1#|6mvWLa0j zD(|=Sd+JhM&SFioj#FM^_pUYV41R1ybuBkLt!eh{kH{ktrbE7MBPnlD=dUBCj#zi( znp>)`(rWwg|c z84JKbFTq`-zjT>Fjyr}yLyvJ3BGHA#s2gQhryUy`WD#K`e3m+Rme_ ziCy1H%(uAJ-?Mx6N1&>iUT$kdlzUEda^wNWp|R@571T!>%_Via%>a=+w} zg8u3*{Vx)ix4U7>z^%46%f%nf_8TqinkSlao4dsmLxf|&t5Qd^QdmH{GON~k*9jsi zE_t!*FssR~BCV=`$TG$S%(?ivyCxj1pvkQ)#w4O1!-e?>yA^ zX)(snMy@ERUo5a4U+vF->_YjQa-0KhoMD)35`ou=lavTAvK-- zr?4Ohk^7Sbf1E3_WOw!GVZj*t1e{L=S9EE^}v&m_S_G2r+4+F zT=a}*5ekH3sF&NOSJ$Oah?Bc)gI+|iaMz_NjiLHhFt;8uzaZF|3zEb9Asl<0diTwm z@wt5%?EwtVjB>z-YElOpd5+||WpsSu^%Wt~FvO9KzwIvov(o92U=sy=28<(yV{(;1|UiYA4yY2LiO`D z@PK3Foa7uTI!-fc&|o;r~L!Nq@gw{f|%?=DcQw}b^>*?-~_O6maW z?t9Si-@ZUq>+EsLG7`FJ_>IHc0lh}jH6=aPa1^}~PamS5* z-FOT`TgHg_zk*-yc_ma|48vBcL`a+sZV4d?7|t5QdlaoF~-*Amt_Sl)1ekPa=E|qDJ%^KXss1%6;|9?oI-0^yhOVIrp@igEng=0gE$oP z!wfG&zM$t&fBECZKyX)_ZV7uaoXS5CFO+*S@geAcV5=a$;GdQ?l;~Xbrl2P-)#R1$ zDHN6-PX8|g%x`Us-r=R#`En6)6Y&8STS3ee>xY*QdX-bkyG7QTotcj{9H0aAKN!^GW<|AUMj_ z$gb z8#A=PV!NNB?M&n`{!q1DSrOM*X-qM-F6r@ zEB4h;oM%<`P&_$<_(^!q4KZ9Z|DF;yKmoK2dGB^Tg@C;2s6^PLi zw(Y$obo=3m1K&044k%zCNtN+G{CMXKEfV!i{~h1kC=qCrA%}$zhT`0G0w%yIqHu)$ zX$6w~(fd;HiwMJ!tsDT131Bh>x(V>4-*`E#CM8O76faSo*ZuL%05pE6ellzpd4y32 zJ3KUmjl{a|qrsHB8nXZjzBtN4x^bRp2pz78r6O5e@@xH=^J)1Vh`gna%%ka*6LkXs zPE$d&BcYtTRAtCg9{!{qHOEPRY#DO81~Tz}&n(!sBqVOAK8qRauAEHav*&?Iyzrg- z@aa=b;8d+BdM?JzQd{aQLqt(Cdt^xwdxxTkQc0)fnw1OYY93haV~_SK3)jlIqPYm* zs7$xThb>?|L95QxP`n}vwF*0aTGx`JWz_g*Lx7;1Vl9uTQ)`$DpUD_YoE!C+P0Evv zK;MZI0rxOP%#>l^?lg@FdU4loZI+5NUjo4IDE+aXZgBG{A6s>6w~pE=6C#HQ3`=zY zenWDH>3}3pK<;w&=dT00-``UW7#&z`SU;kna+>a|WOejB^JQlf%76Qb5S%weotD;m zzK|2!ps2YI0OLo==I8(hyDeG*=G7~N1Q2ikHd0HJR}@Q4m!1>*%HU5&0n8INq*BxF zV&6`%vBtntVLX%76koh178$Z>L@d9lDh!R+k|y&-r{9`W!Po4%@DMpw`b)L7yr2CB zxAEtl=V-?GhXBSqQ@L!6-9ncSeE>jeVcJ6L3U~5)jNp!RF5MWDTS_>2axZneoaO1g zFw7gQ<*F)Df7WjEj&x9q$k%WQn5Cgz>}_9KC6F1MOrWw6ilPVN`_rdnBdT*Uj&$y( ze42X$j^RN<#%Q{=TFot{7LwZnU*kCgLeC6^$?9xyDI-8Nm2zSm%tFY<(c6`v(=-Ki zU_b)UA9NAEo{B*`@Ruo=Mt(FL6b;hOe=s*M8A^1lr_F)K>v0acvX;6|qq?MTRVjsC z8-(Btc6Aqc%tg&zeJ}SKK&J?i?{NcEasmMR5Yt0(DA^A(-U$pF`xZ-pRVIts@!}Uw zZ3IsTPq+7;nZvauH2fGAx72eGp4yl0?m!>-R`V^)VF21gbj*Y&Y_h z?mqp;Rd+QM=Fq76Oh5e|G2|p|`4~kAoYHK%$RsQ)gAwcS^67!U7otBMua}PItBHNM z&mL$$H(IAVvh2q;ZZe>T19Vl{@1zl{ytS(HT0`x}kcBdTw;ls93AK7IO`p*WXn9jX zJrW@2fZF3_+B>l+p`^&=JzvZ_Q)Fkb<9dx$4v(;W5%9>2I z2X50FhQv{mq7Cof_*2-D_;q%y@Vx=;%Y&#K4KF7(*E-i=vc8C(yXRJg@c3Jhm%O>W zQ|Wb^VD+?pSeH6CXt@01=gW%&`NrA(OsrI@1Fl++RNcm`L zu8AZ+@M%@)I46@=(h@x(UsBI(OcV*s=HPfL*dYfj&$-UxC+ zn*QKR7DZ$_lfy)@&pp2m6r)jRz7IimTnuxrN-jxRywOR2XMu9H=dMVK5sVf$JNu4>rqd4G$UeSk5sYqq2ce_EMCtk}d~x4E)2 z8h^HmgYl&o1}3uUR1vD+j(b;+(pEaW37W&fZifXu;otzytY8Ks_w{)+x&N>Mv%f=H zSmIKi>U|!Xp|=Sfj5%xQI5sLb1To6B07zYicib`XDWjvSdnUq6){zn4=7fp+2ak~= zD8uYNl}QAKRNA85!UzpN$*i{5oTh#>xLNE3%?wt?SMt{E#RRd%?v8CUo@gkYlGqA#YXIy9SxNduNm&Qt z?UZ^=Pa^v`hf#~V@EMMJTF++QEeEO{Hz_)=C_pKlbeZQK(US3(zYmsrwp-^l{W7oH zPfpvDu$NS`diz!hEh;v4O>Q;!>#a2>z{xNC>yY*dkFiUN@G zH3;#e$0(-R54V5}!KuS?N@rx$TjkW$P3yh9vL*6#2Ey0I7%vtLtPPIPW{vuUZ@c4}Q(KbQ`0kKf&ZQ2j%M&wRE2MQ% z(vU#&JFWX_VbTNO%RX<>TGanT57~O>$3-tCuMhy4!|M9Z1OXHQaToZNqx|+KJ<{#(5$gr17fSjhI`H{dO8{aQ z_b=}y%Oh+Wn;)8o=0W?ZleavTk^#VfPM61v+3!IhV_HzbOAoOvd`)ng;D^0RxD|bkf}D=a z$pP~2;PW%fBY(3TrYj7~a^t+c%x*WIzWIRBGfz!VZ|``i;eL!CD~~JH_Jy6_x4S+> z)ydpel{dSZZi|lTCdFCokst@%SEHgfu+4vPm_Zl!AFJc~pNH;2qS%PHch7S>)QGiI zoP(GAhteY6Cj6#ED4n{;&}_7YW9T9@c?BukN34w$r)Gs&HM@yVg@zN~dk;npW*Wx0bsuOW+^ zH+;nbD|Ba0XP;d_Fn|S@trsWnBO{Qn6-|FvP+YXB*A|m|HxALtwa!uBb%4rtFAco0$l%i64aG$SuCpKwrX76B+4i%`p8~n|k|0ai_S{`v z2K4=PF)ntoJL~9`9!~(x?engvC3aw63U4baSAW>TJH9tFE+3DW)9hz)AE8!|f>Ijt zU(&r&R&cDzlIRe`oQ}fhU1WQ`ao(_Jn6#+7Ea5)>1rMp#qP*svnJ@XM2a+W_3{cre zo)*K|ZOV?q+>N9I$uJCmquQ%W!}nDtpUq;$#M!J9=a<~_1jQ9DR0o|vB5-7dg~80t z07R95tKU*i`1YlDMeiy1`@T+VEuzB4(d`T?!w)XTEjzw`7w%=oJyljT#aXL|t?P%s zy>Jh-6lITH`1J?YCjK(SUdP824a%bJ{K=|lZV;AgxQEfT_xa7Ad$(Ql)fFWi7EAn% zZ$&AG=cP-5%Kv|0|4)ft|5g|BzmV`%sAmjoHE#~ttL$}$S)Ua`N(OEoz5FuWt{&wI z-LmCn(`Mw$(DdvdemwQyvR&k-gpKsCxBT^i&D!;!eSW#A)x^d)A?m~Iwa<$MVnJC7 z?p@H%A(z9!TCW}-MR#v+aBy!z8Q*hg-4`yua?Dn(R&V&f{uiM{fmMde;QBe>KUxC_ zJGIiQWLVWANW#v=$KQlMUi2y$u2@Q1*V)Ul9C#{;seLrewMx;KWu6I z5i<0Vdl=CGaw->eZqxXl_j5eovK+f5T@|3x9t$z{jsO#9w`g&nldIrni3?DP#c%b(g+j15a7 zYfN1OXqD%)3YhaoqL1uVaa;e^kiw!hjL(TF66z-qs$Q;*FJr6LUYwX{VlNV3d#C(e zkZHS0g?AWGQGF3O!H{LPhuleeWf}Bi1o`ImbHCzhw7BiEpO z={D-1<~b$2Bx70*K&Q0UKb&tCl)`f|rvcp>wjOF0Ueeof;E}K4`jj-;E@}(#=xXg` zzr}@+7J^6743BsRpoxUdA-*lhd>y8J&p!HooWm>-?I>o^lMm)yILO#G^fACU3z}xM zW4b1#=N`vVkTVh*em3bXp03oh4w)ht!D0#y^q&R64&{pbgs+t(|7cg z*Q7Z=J8wO4)zX9--8Eg(ZTDZz#*c;x{?9TZ%d_41-k>!%c&SF|0;#9s1#M{YMT(vX zE>48ier4cfA8Z!jdNHZm1M$*!G*e*-x}?__8=agq=*b#&s2-BK@X(Ohn7;U-(MjE} zpI+iF+%SCF3B))i8Guc=TLF^87x#kiQDf@XLHyO36_(M6?;-1l$cGnv}(nOxx0 zN6qa3C&4zH!O&dOmUDsk20p!zv<84D|LuMAE8vDtEu0WAqejiL5;S9h8v&p8jD`VB zB6nd1O=-olkgeEg=HuKKbnN`;_{s0b5RYq=C(h=}7s-he%-k1GLAX7K*3Ob=QM7dGNs>3^O z@u{rL&D9rLx84)}m}?rGEE^bB0}h@|(w1Lj=4@fG&&gg~e+o~~pa zsF;vGmK_7(YCNQZ3Bh+`bytNXlaUsbaOTo@JbhR^kNQEX+c#Q(yFgBvn5it}J%{l- zF7s90^v_)v=dx17JA+FdYe4-xhQHs_81w?bCp65A>j%-2rvEOxVh~jHjSA53)Zz{u zAOYXpndEO75#e-%_-P1(}df z1UFRKGEi_u%8`(w{1l@yM&~&<3qrs;BuUE&=E}#&L6(Zq_{Qh*1 zAL}k1yh!e^@~|of*-ueKhx+ZLNdY9A;NjjW`X*rJH~nGeH)m>E!x4UfT$kU7pW@8BcErq|nzHY;@e#C z!c_JevA-yD()}+`+V`-T?UM=UqF$fKk%N%QxgWEVQ;iAe{bbZ%w2j?wgxTl@V@Bv$ zLI(5zpq$74pqxPx7Qwb)?B=?@KYf>-y8ro&t$-}c`V-M@X~=#)60^lB2ll30YW!j6 zT)}hrPFwqaN8iHA2j(iyImOtyv{6gFj~w$lRqgX+R&fTV?YJa3bv`vj zS0tQFxmw||2;qtjQKaZHAqiz^T3Xcf5?R2&7bz1z-8(ew&v!bykZww551VB_=bgKP zwL)vrEkedmG05b6A;}6^7NobBf9D=q246h>6(jLyD(K~2@FX>;AM*rzRYjHFQ+e2F zsXcu1)2UP$o~C8opt7Tj7{<`VSj@Vl*urR#-?6c|EVX)*ES_8CRwi@Clf|?2dfgpc zkq7RpR-N+p`fs-bM#J{QUl+2nf`+RS~f~trNMwM2AzUB7AgqV!PTp&?`X!qxZno zwTlTs4;Orj=`6Dj8G-yt^bO`hd~(PY`pf*KY2xXy0?#rgAxkDpj2{}A!@g6w^lK=I z&y`ID6*%aIZ*S)OQDx4~_+=OU^z-g$NNmPKY-EGoY(n4YgfO5s!#FVf(SC~`$q&4& zQN8{9DLr0P!d3?S#mKQ9La(+dZL!vszs=ptp^G=E8g-7|(<-O;(C^fG#Zyt$K78hx zB30AnDd_oJ@PA|PO`w{*+IC@mZKbUP4posU_0yKNDu@VSOloNzu!4#blp)$wQ4u0W zhCl`_3Q~kvCsc;0sE7y=2Lgm70z$M15g7s`Awq;eLJ~sAJUsssuomC9?|07m*E#=x z*80AzuCB$3+0TCVzV|&`_kCZR%^tWc-aVhVmI*o2Je zV?M4i9r&&+ee@Z}XSebSqJuiWfL-a}Tkznm&_^r?$}j}-T1F+=_?ltSU>BSWD%-6e zXz&CcX#AD+t@lKW%2d+FGbzRgm#VU!g+fRNOAVi)eH1#0;c!;0A|@7V-f^0B-n;kB zLv3Xp2C|soYm{FfvRR8vAFP(5GGNqj(P~a1;;MX*A;etv)c90WmbtTadc>;Zu*D9+ z{mMGle1dO0jlMk2$O}@pc7R~oed4CQ3V+)SNf|tf25tiphXM#<2JHuBy>&Bf(JDxo zge`j|$tKif2m>NJ4>ySlEQW8&8<6k8LqrAo-Kw|2@REWgP#sH0_WK+)HH)hT6WD;O zap)BPZX}Tq&to%pJBX=X0Vv|Jmp^^Z5Lc~R8{a5BU>{9i;JFGO2_49W+Sk_sv6s9D zd0#9!ds-1UknI$4+`QvQ)<D(S+<{;e3ei*WqyAsO5~yt)lF^j;7r8@useXctI;R zwgvU`tF1iNU4uAArD|rFh=BFQXGp^hsvVq?#*Za-BWfrJIQr4J$oj_nb(@v`)L89F7L_c)FkaNRc!5B;LVLaxd9XgHVfDW^IS0>Ke64 zHamd6JlJ#3qM0S5jPw2|cFf}qjYEriq&rwVpKY-+WkAYt>sS|4RqlCE>5YYYu;!6c zi@nZ$# z3r76nJ$^((i@&)dnB;UsE0h4&PO(c0lF>ytejEuJAC8*Xl9=~f;)()XUDcTHlUe2i z;d{>hI9!|TdW?e(cE~>3JdiQ}o-R*)knTvoIUla&9ju8J+aYs*AGtjsPYH^2@@u?p zrQRxWl^!`fueaZL`w#mqnAv?^5yVxVWzEyBc-|S|e1$s_UxF#HTT>`0l9v$A)a;?} zU?#)j!&G6nt&mDSKhdos@@`}?+D+lx%g28i3ymYbSb(Ic2Uj)R+=XDHTY5&7x$ysVJ=e=fgFTo$&7~tP~@omu$Np7Dfe2 zj4MczGvMZ{LqkY@alo+hiPs%9_mxXa{NZy)_-4JH!g#FhaV9)phG_{vHoetlA0{(% zLa2#1yxZ)fwfBY`dJ`31kLnFQkCz^=N6vasY)~Q3(n~1=ddU^+t|VMa6*mHAZsGWP zi*g~ic1MN)nlWsz@hVd*K0RRF{X=1bwrV5RS88xjXdBI@* zj7c<7T*-vOEjbGoa40QN^UE$~yCV)0vq2!++e;5j&MS+aIdb$TXa2^x5p9P9JsR8IyQ4h;gN*BB+3O? z8F=+1@?HUI_w2L`RskG|K%~AAOI{n-d@oCa9iDTeMB<$77vB=Xalx;CM7FD_ma8xa z;{nxmLc6H-y1{WQue$?Z8f`l2Uv_YWUTrf-BR1Aigxg~iRW&jBnuaTR`r6++&(XC? zM;_vM;99beUU3RV)LuD8LXQZ7RG1rhL*_oeIC?oJVjak@O386FkVY+XX%Wk#^CqLG zoSsy4%4}IU!?qYh-Oh{$l0TPWEj)0KDE&z0O+WWvKqX>4THC)%&&i=y5>DeJ57nq{ z`$SFp!a9`ndCjlPDtnfTl=aq1SRdWr+O=)u_Rl-lRztM+&T^TDb)mcG;1z4oShn=C^p0o;MZvX^j%0|I> z_hv9?17~>c$P}B3>^U$ht>NP^`7bLS>1zqgRO+#eWj^t{_wgbnDfU-UTcaH$N*9Ev z6G)VJq&tE`2c2PK`f;}irBC;W^?s~Zi7j8fbs_g=Glm~sm<$Kkb@u|2=BeQ<@cK$E zm67#2-aF?>+Q8c`fg?A#Q1!IwCW?}-Q#Nm+FCC_l=my>GI7TO7wnEyG<`~SzLXH;% zikf==&EhLW2`rULB-h6n zqy5mif~CbNWmJawL^<5J>!WqPeKIpXhoKt?)2|*IB?W@9}K6f}dD( zaKxH$ZW;Vk4(XeeUaNc&SOr6u-jVstd&XG_%E`CJJ0x)KD-QKee-}s3jTuSz`i%K! zs1ITQe@5cW(Oj72MQ>rP{tBdPcqyY1s=g;KB^p@GcDkX~-Lk8%9W_NO$-9WU@q~Co zuAvVOOq+JaYtlJ?ht4eiulU!MoQ-f}D4rmSR8j4ayX1iCfJ$b?vFyO+lu#48nnV#4 z#}cpL#*`GF|zW15Eli2CdIeCx8)AO5~W z@aEI^^O|z#{||yWmSy#>nPLU44b6X}822&%Mz_I7{y#>Z{wF8v6$!n^Ap?KL9p>gg zsQ-~bL60!U#E&{qaO^{_8`$@lApxEF&F9rl@56kb$K^neUDV=w3?GB$eFDe*K)m15 zfl}+>X^^fP7b;1piP)t>N9Zqh>yU8jS3W3ZlmmT*B^{SYb#;;nXiq&AHb4)94mCCL zh`(_&kL5byNkfXvlW5yI)|6Fe-o9YdAJh-)3Y*mVA8ZNvkuE|h1^quj(eQ-;`*8}6 zt|bU1tK=*3SR7=S+if2`nxJ1!qG0zEFuBcMJYFEqF4urG>rXbQ$jMd7G)xnpvN2d} zWqS;~z<^T!%ilnQhx)GATQ?1#q{aIEN}Z{G(0rY~w7$NPWa0~BNrNv~enZ+{ZflJSS*5MjevhLBKNH>B;R^7ICY7XV3y1O> zGUBpdL1JVtkEn(%SW9_>ZX9bapY6i{OHC#`0c{%?9(i!dIfi|w)hY}%*ca-y|8FK; zA2U$E6%+heryCQM|yKX4CgF*!dmH3H?@!W;!BEeIBC;pIi@tncKU_)%ROr z=JC7m5za#UxqkzjvR^Qpjn~VW@z}Bkl^goDVCiFw=J!^@*-Y+ci`A!0Sbbs8Y(o`f zU1)~j^wTZ@>u=7>!nHFJ+5%bT)8p2QZ>8zlJsm%79B&U(lDrrruNa+)#zydZ9l(t9 z)BkB)rT`f5#TLVEQjc{nW2`wSI^MgOxs(D~JJuzu}B|CH}>#*A{f zD*EG25O49Ci6W|Ug3x~%Lk*DZHr3ifwq%>6wRAr7nv3CbLeDxY`(&)cpy(JG^uEM_x4&t`z>Ax&B+z@Un?+CD;XtG(1d}*V}c_ zAmJA*RzMm@tRCBKS#$)ISp_jGtwC!s3BXSlV4gTMX*>RF{gsZzj@OeqM2WIpM4Dok z%8W#ZfC-JQ7Jd6Ty#u&o(CYKWgE^XeatQ1*KnFTYFW+Sy%qiNTjTSxsdiuwIxln(* zCnJCBZ4tl$(%(yw<_#^q4{kku+Lfh$;+{}u&62K5mVv1MKJDXES`PG=xaK1qi!a3q@OZyB{P(k=k=Ep!o=NCl9$U?v6ro%jV3f60o z5?dI7hp6JYV9H2eYK9>BA}}ixV{?2;96Q-nCNJM)_){uG4ysukkJ;tHXM( zuX2Yf0H2cMj6j6ISG+pgAJqa2^W)=icw(RR!uy0X*BOFGOD?k#hL5QNOjRmXYT{g* zMDFc(Pd-HZU@2mrcL|oNa$(gE?C-H7BO@*oqs;>)W-j%2rc8eckZ`4rTMX%+UXy%< zR0uGpWz-1qI(eAos8lq6u;yuJO~cE)9Y?t6UCgT90r5*=&_~qy#Mrh2KUmArSRa2v zGbj((ok1rNk9 zvL%vMMN3mI1*ko1x>{>4oYm1rf|ncfMnqAt#P+WXm{~klx*(xgTd@Tq;NvIqmFoBV z-nEQm%10=ujlDu!VU}s3hq4^*ei*qMKQfG<%p_B>?m&NsG=sf0t53ppaQ)4tjHcc9 z>!^(fs~5&_{WtqyCv_z#%bVrd5Rg$-%Ke0r>uAV9J3y?PQ8H*{mOe%Dhp@25F zZp!h9ui71QoqS;pmqwo=Kr_xgs#oj^8J%Yj0;!7PR04uA%1Y&y^EgCu9 zQ0~q`FlpZ<;e@fY_Cvi?%W;pH3T;3^#MyH}k(F>y;?bZ87yIk=O+AIiH-?xjX_YsM z$W{p;ENz08lPL6jGFLGO+)R_03HL19xphCGla3+GJB~2cqV?)Ra z+XrFHM=+Uq5WMz%zHt)@7)x;OWL4Pq=D<&l9vNGt5u)GE$HDKttL>(yJQje&5BrU( zW)-H8kTSa^ORcIjC;!}qkC!v^gh&Vm&_H&T4oh6s%~^lp}p>c zt1GxJ|UXRiwN7Ui_9|=<>{%oq`9wA#DL)njQrFqufcX*&q9`~T7+z1 zIN^^!seT=N9B+9}&!Z`4Twt4bAvNAC)p3MlPj7f?0@S0LW|ujY0$vi?5GwJ+{77wk z4NJ^KwV2O6J%M5~R<6g{@ym(E7&`+i+f*Xh4>7jrO@~xvA2oBwoNN#k@Ri!W5Z*|h6EynYT}ek|K%^!WUd*yG%`y{eMH(gbg&XVJoi;D_fyh-Crz#` zB^W+!O@PFvfLP^CH8Y_aKW$f`vNfDKpJei>lJdN^*pA*O*g zZif^tOP^X8qX|DSLhLs}>Z2!%p&mF*0%w!eZ+rLr*Z6B+q@!sRrPAf6bO>T`yXXKX z_b(@ZpNcsQ0+&VAx&gY_kWQ*2nn5TKGbzyz07sa9yT#NV|L#wK5G=F-{w3nD)Bw5s z%f4G`a=-zWy^jO^w6c9u1rDO-HoM4weD9G4#S$DoM5WXqMa5sJQYsTa|DV1GamK%X z50*5v}YeVTe&})wO%7d%5k2yuM-C|DVF8}ysIo$eK}Bg@KgkC(no2aTr4Pp#e3(J+KUlpqR*iI+@= z@MRX|?hx?aPFZTTLTn8_a~utZbd~W7;x+P0%hb{@Oi4`aV>+_@n{hBuP&~bPv`x5xzTlG`(iVp3ybF+m`B*z1OYF0r@M4d?PBy{$Y9hYq)<F1r|KV-#GcV=-4h9JV59ieI z4IqAp*kayxqMZDVcUd{JDt7#`-al6O=loYp@k)w%{{ToGRfD?#5whj1Nx?O`ltF5? ze5d?YIf&}Bo_~r1Nv3Vd72Xd6Z&&gurIv$$@iK;V)XL@O`-^&Q-%K#GeFW~h!mvb}`PWD8M|Iw6nEgcN=EACd)wUZB8&hRlNwaR8RQat|RHFtm?Xn#|hsu>@jJl9wP8jU4GZ2T>OiNhn|1Lmc}>)ny5&>JU6~&!kBA z9eD2+Sox`u=sESJt~8~O08vkj@Kh(Vdd=L=tOi;JYB#~u2~buCzQHh<0L^iMXvSX4 zs?MOP5wVtHW+Hwrhf2>yCHbiQKYEfFDRVHiiB^Tps&_SMjHdcTb>@YW@B-y;&=`a`fey42o zM%JsPqJ`)-vZEn5$GwNe(EeJ>qOgft}ofySBr`t6x7n5tF4i??|(tMIsh~o#6{srgs(U!xL z7U{v{S+30==|-8Z<+*RdI>%&MF+yGx3su-0yPc-4WnO?)vbFYdz0GU*ymF)7zPAhb zciijN2M+0 za9N8O{dl)~i7xWFLm-CEMsJXeC>B2^`N7J1VzX~B$Yy1zqnyj?(Cs_fX}#>gCo;b#X5K5zom(nRYLHX6S$Cbno-W$TjPoS!eAn{&P~ z9(39BDe_%Nf=M$f|E2au zww%ppP4U6WD}mjg^wu#Wv@1XJT%~cuA@E7kCNbR_z4JZz#4W1m8SJ(6Zqm z@+D?LfL#%QF)$ujUqk(;fwN2+vw5$p7BC2axj;+**K1M0LJ?pSxo{#$dBRW8AVuG! z$a+Z?6>Y0{L$iKd^2@CBEt`ej#pO&{3zSHS<>~Jwj}N7f%HJ^{d4{T1>LoXb0ce5X z^Qmk2whNi4k&P`fBL(kI}ZL9 zsD-l7M802DqLahVK%W$U@Nf|Svsm4U z{|>=FgX+I;{kXfXZ^!G($sGCQSI17<;cpE6dZh2@H;2L}k*~=gRn=uNwjEzzaTFxR zah^;pOpJ9ae9At7eFlF%V)Kr&qlGS?N1R)2@BC#})0BsQgP0;4lSz-sXJ1@7WqH?5 zXt>GI{+KF>lg`!Tdkp;dYy2m>!8w#=N|fWn_|+Jy-q;DXoa+z-Wdb&vT=BU#lOZLE z50hPJDVp_8O;>tMp352oO%7FZSmB7n~Z3MSWR+CKoJ$ht$tE>eb=r<@gw zP9yhfAL=i>B~y1|MWb2ovV3x)du{$J7EMgP`<4I2f)OjIns}^K z&yN<}Bb$w2^99+rYFNbH|M-RaGv(9N?b&Ow-Uh=n&qP| zuyjrN+k%85%ZYxMsT<7+BsjvPzcBhJ@Tr^~pDjEsNJoUazH2VB|H!g2>1)+UytJyb zL<be9q$IRtqW@N-1c z3uR)S_QT3{F$v{{z<>0qIM*OQ9E73c;V-CT&<|#*gcuN%JPNV{*rO>mG7@NfG!MYQU@*9o<>Op;}fkf!q>(>jXVh4!gheP^5-_>g}d&tf*l_Y+&DNB|? zDrK3U&0{jioz@H5U&DWTfQ6nkT3bESOae4daT6_JZ_AmhZQq8GIS5Sda3A5DYU$}t z$|pAC{?q;(*nc0mh)2{Q(tEde@tiR!RX|jPtG>T8bjj5B9l2WCa}M&=CxTs1!IXpL zGg;%;OdLVaQTS10Br9D51SE!3Y1|vIE$7;OFm%K1nG? zYRQrX6f=@E4hQ9;%=DQ-@6sh;M$%u|_Or4~GkRm*XhfGGXluitbDZ4hHI3#yiKFb! zr2;5LhMcP_LG(h=a$ls6wkyG%Lqz==$;ZtaWa0#8qcP!R@n3sAL-eE znJg~lN+mHXmTwKG?5B#3#J|iqrXl)X6ApQ~ z6f3VD-QzDf#7Fl&n4Xf%;$KdhjoKioU7&fi<%LK#1_MiDJ4t9OYOZgu$yF*^XLuzly3)c?@syZows3Xpy4rsZJ&D>x5h*amWcH_41zJ{vh+Pu}o6U$6qs?bhD zXksbMg_-yl-s!9HUIrC)}1*FQkKCg19~9_c&S`ShYKc#R4dO`zf83G1GBoJa9v z*}IS5FFK5kmE4Gr3$KFwx+$N1s?Am(C?P1*=5)3B$SR(pJTHSqqTs`HBAgXTUKyK6 z`pMum!TB|^azf>;QM;sHc|G)b&6k8VZ`M%)(7&aXUK&kqy~445TFuEKQ8bmo6k||U zo22O)Lg+NJ_*p0?MG&p<+S2p$ICnr79tL)xvA96u*YU80jj*6P$+&}Ltb)to<4osg z2*p?Go9Ycbvu|uKe;$-8%&v)RFax%cJe#@+S=VhJ4(>a%$gJrRFS^!OG8~+W*%uD> ztU)O|V&<&xlg7lg{6{x8pyp$(z8s>_*+YNbkYlB9SubFD)UkX<@)voeM)r5mXZ1-d zPKlNofr@(80U=ISGCnK~R%S8JGpx@qMh6Q=(OChbn$$5zdO-Y=2zx znzOZlcB+O-A7h#5LeH-3SV*~f)^{UE`bxfMTy^=b?2){qwLmu`M~ZY!*r%A z`|1r#fe5(dXiJSsuBnS`(}by;j~_kS?(^!SwW-0!riBeVBG|&sS#8Blb-%-GCCReo z^9mkyo#WcNHO}0S&+aJyWtQW{LEh<^@Sq-lWYoObRt=-fwrd8{)-eqM(uO@-urfxN zoubtRL_p(^pp@5f9g-tiy+Hv65APYkm{Qn;s6&;3T~G1+)9vINr@$$zt7|GU@8KH%K z)AqyRZh=M4VWE7apYNA5?|`>!U1TULKZmLJQEBJ=Abl~5vzNQ)?Po_I1kyVNP72Q@ zk+2a3IyOZWT8Oeq@R^m$MkU=}U5vT1#)xYG=$ES}Wn``&Wx3qx5N0G3GoKMp#LvzY zZZTaCIO@EB*s^2?C*l)!Sfg_+G=-lvAlPi;EH(4~z{k`zrQ=J}&AaWBi3-&Y_SJo? z357l4@=k|ZFa2?cFhLpc^5C-oUZhxg;bCFO&(mhX)g|zq=r09ngfHE}mx*2{Y()!x zIvcM*&7MPe*&H*F?W5?j5~$xOyY+o(Z?0|0AZhYxmqFP%ct316Kgck)j0AU&OcVY5 zT)JxHjjxAjSu*Zqt*GR(SJ_+q{xTZK=faacP9-wg7zF`aBh&nd|yX|pAVS$@}_JjfGLQYs$)QI5hYQ>rJDPImA2>%p*8F%`S zOf6}$%G#4L{r-N;s*KvZzuVUD$a(S@4XqB8xvKIW-5;zt4>p8hF&cck@~YhmZXNgA zJX+(ZX!Fm{L7wtaNzd#w{xUgT5NoFStm#}pek4(bhUMqH-QOxaGY5`*^33|Tw=Laq zerfH}Y;Vd8xlas^wQDSylX@YS4{X$m>0~FGY)y+yYi* zS6YOAJ-hxHexmz6rPd-yU>7 z(>-h0&&ucclA=ou-S!A`+~X`CWQO67{70a=>E?pQOKFqV8`LQ#+$^uqJ<6?Q^IXAO z=Bwzuc#LTEel9nwEZ39TDkNp4#NIBu08}3VqT-&JvXWa)QSD%nlYZhmL+qg@{ceAB z+Lc?ofqc4t`ia-pkcpF`w7AAEyU0*U-zR$y3>p*Fd6UFG=fEC%%NJ4M)4RZ1^L%K8 z*{xwJ3gPyq;}Z;NYoaatd)9=-*kn(e+px;q5=oCB`pM9Gi~H5L$TIqgs{gJBoQ#bA zYt};kpMQ7wZn+7hDq)(1;Qt6%xbf9DNuhLAW{1LpwX9$UD6pRNKiO<-C)BB{nws_& z(AFfo7)LYaG;2y`Wr9}^vNm(oaV`+Hj^mgH`Fc}+dJJh2(Af){aMc^Tkh`dnhU4ze z#Lx&W^Gzxl7m<&|A2A;F3pDBy9)EKAxJ>BE10(G07gw9OaQk_LRoXnwHINLrY#~9W=YOI@Tb;P*#~WNMkuX!_^B8a#m>Qy;5MpJa$w(Boc6925G9&{(Ya;j_3OMDONL zn3#V{7dho)qVY4;+fe$~3d2DCdYW5Z`i%JGS1kghVV6=Wz>vSTm-t^52H*+iq{}3@ zMll%5LAOFW4VO(BO>0?4-Ua!CEf$ry46H*zWKcGatFH5m)4uaHvvT5DW;M49oi;jX zHRH0z5E46rW*(!vSE6Ss!OrrWC!|7ohe;}Vl3n6=ha&gE-A6fZ$s|7ik2uE#IV$oN zi<<#bc!1#Uw+Y)&#GkiClEkMG7bsyh-hOTcPLZl!{GwzWAT>zBsVe_zO--p(1u`Rj z{8YQO*Q#+y&_fkIr_tO_gV@K9AP3(;eNS&p1j(UbvGrj^(u28HgLjXPka}T6-t&A1 zN#RLCW;t9l<6}DOLb0b>W2!!B#C{#Qm_K2Dr@bTnc??p{{HEhv18DAFM5QY#+SfRI zmL_gcEggcAK|Vhg%)_iNA18rW;Fk07sE)Da*| z7IX=SkUqsl2yrzb)6`I2(Ytgn9;@_URLC-qyQU*uCU>C9Qnj6M21OKgNUr|w>%I=X zVKC{6%uv(J?GwRW+|MTpHV|p$%uc@wyj~LD_D*_EeENU8N%-#q?ssi`|Nj+mpEX?z|EpL!gXEA{gcabosw!^@58h*I zguZ1U-%A;q5+SY#&QZCm^)&Hg8I>Z0-4QbIn^W>XC?1*PV4#FoZ_CFHb~ixJ=DuUy zK@>^?Z)8T1?>eR!yTzAC{iITZr5HpA7GvboYmD-C=(F4@)H@~}ZBGPF1vXPhU1n8O zHAj`W<&=dWZb~5NOcqiAl=zXH;t9cX=)G~ruW9(4Gr~PE&K`Cq$m!Eklk8>4tK0!6 zg|HP3oYB9?ctk^PI{5NTSamr4n7X?~(M}GA7Zpkl*y@vZ#3-w}VbwLBXn#gRVVPY; zb5&EXd_eq@LA}FoVFB27)u4`>omB9H%2&W5WTp98Svg|ZaVqzrE2JcDcLF}8RE)9Z zCx{<1W<~&q!CLJn(Pn6})t4mG<1G$t9>jvwK(i~0SWpmX!k%B3F{SVYECupaQyAU7 zv%j#A`haUkKUU#>{Rb5Lqdj;G4ULPPDON$B1`Fn)vrLnfD{(#&Za}t)1}A1J4#)o# zM8+R-4FH$x`}jK`H~yGs_M?F>LV@e+1zrIKf}Q@9MEm?fyvBXJ@|wuhZ?)M{?Yr8l zutB-X^-4$T%Q5WneR2E->vQew8>3!cV+mZgK^5atpizY`ilnB%rG~rkBHi><2E55a z@N+W;2IY&bj)f3IQXrbUk^|nat5)*CE7AYZtA7n4bLdj7gh41c>qWXMGE`Ew<5mre z_TuOxu2I<~lv)<<6jv6*p&|~CnC4WO#YAEX1@rxCVx_anm%F|g6L$;F4nC+79a7D3 z%ZCTO07}mt@A;tAD(uh*vgUh+D7UG3W#b*qR$j--9ghTgXvQ+WZBek`C^BnK<}#Yx z_m@U%tU zy48T)Z6DmXIwx2J?RX_|*l0PlF)860?4ax?nHy#YSU8BfdnP!D0(FWb%Bo^9H>KKq zGEXm0ZTIr-k0LCpmizkb{Ho$^q*K`spv>Kymq3aXw(kDA-`;|6>Q0+M(NW zv6|E;)$+>198)kY$s||s#5?p=J*tV6C{|~CnX6qWcE-7Kb=4+Ep;)reuT1D!#Ha3} zz!Md;>>k8eUG&`8-58#@&A)}OH8dAo z;7Q*)LyS0x#@$wBe^yo^8rx2UX88=pQT?v}PF>;<6f7ogoF%%GvdW*?$Ul#)*JBnC z$(_vq*oVzdWnLf`3*x@2l)g31WK~u+570#G;AfXqn2jpw6B$kA4jE@|eSr#aA7x`g z`_(KQJspsT0s!(r9Qi8T`h4JrbZAW^lS%McdfCSP8rs=~05uIJQp=b(9Pt-)W5>>J zG8S;!q4`UgWQGo3A>p27bq!VOor7@xzWPRu*t^eq-m~SJ%OaP<&*P6du&QE+fs*K@ z1(bwhW$xh-Oi>kEC5J}N32SwwwDcXeKTObQ`xBF_kb;B1oQ;)uwj2^`tCvS8c>8}# z&o_&rjJUuhg4pO+x`XlAd+Ni6)i+_))xMMlRQI4osAl|D5bT##6N_ic|Y!yVH3gkk@24O+!@@#CoV5=}2%Zsr-_*Qz`yvij2PY-72wC^uuG-j}8 zu_N%1W>ed=JliQ<4TIY&(#`1L z{wp^djo7(cc;+h<%_!g?Nok>)^L~U}IDYM)wMLM&cU&tpne@^M$LfuD^gi4d`nnDZ6cC8MbkpOwlDFkOvy1jQ7y0Qu;x zX(P+)Einwi;%f3X;muEhnBPd>R7%T<1@#N4@Ii^+Ad$5L01DOd7c}1t@0`*V1M&+B z9Sv<{2timQ%9YkaO&0_;a#|J-T9(3C%CC|>6H(+Psw_b3K?T?5Dhsh>_CNT_NNtTn z9(PDztn5m}cHI>PmW^JqBJ}EQB-CG8&Mt0^u_6<1VfJ`3Zit-kRss6e#bC8MjFQUU z0#nyX)!9i3a_%pXhzO>nF8O*y&0&u?zDjgNkp$}AWm&o&P{i&P=FzHaHDUUc7*&9N z^wQhRrXC_Q3kMR=*=FJA&h;Do9Xzt$gTGV#Zv9TpF$u1>3qN7PUNrR^hCYuVwhcjS zn*2K3fek-W%e`Clq4-?%T&vW0+F-)XlfOjBlIqc~(*gdsV5SR= zqf)rxju3<_>Gh8ymwO_0-TLeJ8dg&5Bh>mq{R?I8y`%KErcTkDj+_v*TTSw!pZR*5 zfaUu&j3ombE}^`N`iMoOl~~^w*QT#jbiU5ivp1S6w^&SCi6+6&1ibmNZ99amWyhpZ z0?{c19J5dD|P$`8lnk~y2qiUBRpq=40Ec()FITq47BzuMitN59gGY~ z$)QR^+(u%Xmoe`d^x-?kD|9uB^<)4vE~Y^oZ8V7_<&`>7 zrYazP-#`(}cVzz#2dN?l3Lj{douKHdBB3?xI+MpDcEm6tSI?}dZdh=h^wvA@g zSWA<{;MH@Yz*ZfcBYn!qHh~um;(J#blqg`(?pf8cTgAFG^#k->&S`-s#5_m19N$)@ zYL@h$o9Bq>w-Xc_YR=m(tMDQgr|}|>*Z7IPJlI|p)3Qrh!P!^B+G&4ghbj_1gmJ0? z$>Dw~HN-NU6*|YHu)>yMF*6wT`if|i!D}hVz?CqvIeTqAnkr|9nqjkUZ=hW_#uPcS zWiV=}T#3z;%#C?kWp^C3Bdhl{i8jfEFP7n+De*5k2ep><%4rGKCW4G|^^!a0K!+r5 z!-n2Sb!aeB(;l-iCkwF6VK`{62Jo^@UI#Pft%!A0$gf}VouLERIp@uqW1FRc#z-=oed?o znGcNV?bxl*3#n|s*U`9!~OdsaptwFTiW`0`!{f& zDP(3|nIq!x*PpTCc%6Tk*4rmbNezkg*S8a{V}~9a1oM z8OqD6d~<3CTGy-_Prx8AJVQC|G4meVDw1x3`f&#;7WFdT%43kH>P6%8d%44glx1ea z7sPPT1;0XReIt5PiE>mW221pV`^qDB;K4w`w;XEt;nKDNz z9<+x=l5;z%@T$78#D74k-LT#WGPmDr_u{Mt7B{IK6BU1?lvR-w&c5IBqe!<6aO`Ua zTUyiIno*nWQHPCPI5gjevqmaj1DRbxzS)Q2M6Xn!_3&ZnXyb9 zZlj~Yh5lFvET8xx;#YtboC3XME<75&3t8r z)_dIiUEQFSM>Tk?S`HaJI4GVtx;iO)1!?7dRqB^jH&42FLNYP-Fk<#GT8Ri}@O3H3 z&EUpleV0i|Jc{h|Y6jU5S(saFzwc8S2^%Y8UyWjN?j|vFA=*!vE!+Drp1LROaH`f4 zKYRjOzhi|p;H<&t2lI@iuux*viX8cAp{ibd|mtTEES^se+Vi<|+?bk0F zD{bl_?Z@!=kibt!PnIh`GlM-An)t`4!w7+y3v!NmL#kL;fqkc4k%n(4-hR63XzOT_Z96$bc zjPf#PqIYJQ1z!e5($-yjp!X(2iKWj-HpdJaHcFoDFEzY)QVH;;Ati>;>v;2G64dpL zHSA6SqR-`X3oY5_j$4e*A1!C97fz7UTth7OG!Pg=c2XeAimOSY}SP-25R zd_ZPOJMa6VY$wkvOQG-eJl!J4$rKvA6wF13P?7GJnOuzx2Xx zLCqBCJpwqx;hnaZFQAAiM}o3CXSif$(;Wxd(B-NFx8yLjOqA28+hcHjMn%{q|Kw+3 zKnu(#87VV|j1Rt(#2v77U>vF@NMhf2tXjA=rV^)EsNA6L2`n<#fx{s)B~%3kBmpEu z-I7)H>h&`k&7+9<$HBINRt!>#`lCRzUgU*=two!d44@@GC3~6T3Hhc$K!CjGypZwm z^QLwXB5mEYcQyQ!{>h4xEG*7b znnYI$e(R!x#Att%utP|uw=ZHrisG^rWfNVkJ>>U_7o=b^N2Bw0&t}I@P=}1pH@u6D=B1sQL|Alt(p`@c{+?7CH)Zzm_{p@?{KO(ly6;h>l`>6fs9+M4iNHF^6bj zxo%mV$aLIV3_1AR!m>N}!oRc)x~Yp!qmKEmDzcJQt3K(q?W*@kRUepbZ3kB;l4yR{ zoFJO(!dYo*XdT3M$j7XIgaN&MkX<%`w2X6Ot{KcG{*Yn%3Va5YB;50%cq2x*0i!hY- zjIe30^izex2~4k37KLt!V2W(cnk=1kpv`|rZu-w8s>D@ZYO0k+4YH@^`Y?$M!(okV z6QMBKWIT4IOkUy{86{s%G18&EpIDs{XxcFZTyq zURTc)x}t@G?_H%w9 zS6n>6l^6cWi^k8VS=UWv>ZpC5XCuz>#}39AmsHosCms(Z^)&Cz_b$+?qw$*GUz?_% zG^z|F%4LThD+gjM7?21Og2fI?94U(?XTLFZ+Xb$Vt-Wzvo0) zzGx}M0Lcm_toF1!mTR5fs;PSU2dg!n}g2{eB5_|Gdrih*@<#y#jt936wbfWKZ_lAPUIR4Nt zJO=Zd_W@-94L3a8)4#;PWazJeAg}O3qOozwM5aUw51(;39lslUFGXy+L%;U>vV)+k zDUGjHa_uU7wH3{ z^Z$KdYGMcy>cR4ZDu=s^&HE@(DjbImza^KmH_~qNSVQ?myvAW3erC+UAAbja94v** z!CbXoAjPZ+WTTVWzoPS)qvS?o3UMPH!Zx<#v7XyWJfx zp&*(OB!il1bTa5IC(2rNz!|{R4nVV&?LGR|`lPP+$<++#qzq7?pC-`NP7`H3QXl}C zw83@($bHO%^8Ee3!&GJ&m7!|vx(W1@#hY=Eb#o|UT`2e9SMS410g%3#u5TArGOeJJ zw?IuZKz*o%qrUbZuqL&Pe}Wh|p+8w1)%DzGRvG__GmTFIOKtrgXM#gof53AFY3GT5 zfTG@VXB3%~6k__jnm+{?-BW+T!c2{yOiY38WGu&t|NWOc68>)=Ptak*aNWZ33|`7M zPRViDoHs*J>}7sXsSV!>KH;hdQoEWx;ASEr8GBi}yoNLCsj-sLhe^>IGqewW>yh&fNw#4SjP%w*x;xs^0QB1Z&f zziY{rdJ`Go10OijVc;JpTFdvYkJ-ST1b$N&KI5lgIl^cZw@(l7nea!n$W9+eaLv&J zoN5uT-p{j-II0^>|LA)T_vkq@-em|rgr8_2?*4f5FFPR(=$7w1jO!I>th}-i0RnMF zwaX&BgN=uka^aT>I9@ItI+W7hwGb7|B%l+?g)k3|av>f`>{A7k+uU#xW(8rXGVvVC zc6O4bIN9WE|5UMFYN4-OB|Fx!nfU7wU|yFUfM zL-U$Pc%Gt|+=Tnp#ST3S$0zpT#&P)pI6H#y7Q$r)8v!O&g0OA|NrH%5UZ3l@&7Z?h z;4r)F1LG{kTTLQLa>P+4gCHJtK@y8yHO{f(Fr}E!x(;1L?tnAesdEqWSAD%|h=s`L z8Xle;i{toM`Z}2=*^{4X_BVkvzn>O+Ox=n#HcL_UrfzSm8*sNIAnOr-eb~2sO!~-& zLC(@3#l60^gLZc+#Uzq9qX#_rRX^$dImPUHJk1ltVIjCK7Wwf~`-$TT;2vS!(J>sY2KZyfPjGdxlXNryNY+$d{F zVdW?)o01q&Z(n<*7Y{^{g!bvZp&E+B;5R|IDsx18vv|+R37{+nVtYpLRre{{J$Zx@ z-9ZtPdYypROZfp%n@%T9o;83uuNMM3ofVc0qTW?E-(!(8V1kE8TQ^!IVPGz{=iT&~ zQ~E7VdX9v2$b;0f1>N z+VwDnC9~m|lvG40{csWl-HWlRz?r=cpWBE$Im7$J)mp4R-?C5fs#A)eI4&fvVai-}t#w|uvq??7 z3mIhYh3d!F8~@$Mepu>LISZg$kqjYgRI{Epd{K~pJX&m!kr=4Rf~$9#14mIp{rgnLPTSSDEg^OQ8CD)A-C`OYRa37 zyD2q4(v^j;aSlqt!JP!-HPN~u4Dr-W-^>Lj%goeR>+@CQ@b3xD`T`i&hvCp2JDQ?q zJs`K4X?^(w@(38^XLQMTmCoM3aMhEd?8@Y&)2H1SVTR@`J49IY^)Gh%fHxU~|)h^wuZjqgUC|t)HtCy5rfT7#JVj zGwgV25=JZ>$C`mCp@qR2YT6up=aRv|7l*buJ0?UOX~;H0KN^LVjlrUTwC&40_e)3e zinDuhz4DbLtpR|w?AcDyE~~BPsGcEQD^BAIHnS(1Tf>%?{%6h2%``S%y|(h%-%uxE zmiCRiu|KXf6dmJa)R%Oueo2qT;pnVC`TdI!@aW2xI( z!(_x+B;lJ+Z4uDHo_dTCneTH2el9K<@W#u*GLHvxf z>^3F&YIA?B%vqDLGX(_r{H8UV|$HHE^l4D zik6r~<&St?^b5E{>A#>p*Op*>v%KoGts;9wG?&JF$=UB3R*{WNM2Lv(zKmj%&%#VC zR?yk9oh=U_PW>D>BPr5N+LOZzf5BOy*1vA)@8$RWu1;ienXgp(W(=qdyUxE9#6G!7# zqo)3%Nf5Mp&G856_|lLmxt9c))2@c#py_wyORJW8|D)Ww(SF1CDJ^Ha{Db$5g&ctS z_n~jF{bN>5Enk0Ak~mA`r_;T0Vml=7bq!jNAOokP1W?hQu{0aGpyW6iW=bAT)#@7t zstJd=QQD8ZQ%im=Nb6NRIHT$M7g=;^t81cD0%>kChU;YFb*jR$w63S&M7b#aH*D`v zFyR3?bR66(#uNUPJs-_Gn}nve$`?55EszDF05crQ+pmedR;WlsozT9(w|{PiDbMob zf1hK<-c2O@1)#cP*8?U|zV5wGXPML?J|0d*Q&02Ij59T{hj+TBRGc_FqN?zS{4SrB zN8lW(vv`>q(CQM|()@k0W>6cl7B(HC&Np}+hr*v{#%EmH8Z9v{V01LJF7>ITR+DcO zh(+mDPvpl~r57}p)7fq7``qGLGs$Hk9=|NeE<002*}^BE96?qKHahyN7_|xKHQnV; zSl76l!fv%z$Fh~F@QPM#0zZ$$H(|6;g_AYK2BxSIv3^M5tuPNbu~yW*yjKx90N}=y z4VvWjT|!JvYIGXO`%kdoCSWcF33Z|M9v9xESM7>E5HWbMc-8lN15R}hd`_A-_-KXe z!<$ai+248WKMs?9R#0|h#3dba;1N@rjtd6u{bh-1@&gMIfU;WQ1e)BKMdLSN{sDP2 zjAzv6UL+U|-8pUaS*Miu2$(F4NF>`%Y)?TPjtMw6|WUnIjENj_5?6b_Ws^=<+C^6o6 zfI`ZN?yORSK{I-O*y-()jqB}t_bdOn6 znzpic{?K>PUF7WIwvLrowRyu()EQdrO2-*KrjS0D%vQXUbeP~y@|6#X9C(2@M7mdN zR(L`9@xi4OIQ`2!I$$^kYqnd%x04eoF^MJhfZO(%S8SAU){VvRuqmcA_eE`o)%IzA zO85e}X}+V!SK`>EP>Yn=G9m)W#AX3la}lNUuzz z|N69-RXwyHT;^atuguXIZb$~s+5Y^PWR95;+E5xle@=sI&Z^7k{z}w>`XY_Xi3)5} zVXG+kWT`8BjAkbpM9+0!`=O+Kr^Ip?6q)>0GPu?{&?NcvODMj*DvPK=7^qIc4ut`VVMVzhkfsjE`ND^~(OV_2eh3U*7k;@Z`#iZ?o3jX$WO;e-OIds?R_E#)UHV=Ib42klAOvCK&4XM%YZ70G*qQy$HN8KV-Jk7odH3~i+@BufYzT9ogP#Mabe?_i=Rs)= z7fXq*-6D#sFmHapqhim~@4^avh0Ud3k*=>=xh%wTO=0q^pQk>JVZ>g2;<6u(a#!aP z%TY*ob=%e&LW(JrnBCXwoahaF$fewvdis-?CxSOGfM?+DhnNkvMs@vnd4)>toCIpG zJkqiDxxOK!C-AT-7rx=7zR5xH5D=-5_G>g2FwI#aw^TzZnqB-daTJj=Ak%ip{{{K1 zgJ-(*nb!M)fE+VmsA2XvW=%34DLQ=|;_PAZ`imwV@mvtx;xu%1zIpT>KIYK_q;i>K zkVWT`1QY*;CwzSIJrzzV2Z_$fRS#x3-ccfG8Q6wJ`W!kG^R}$*x@Lv+J9Im zmS;elLjDADwivHtB3zTj|7sX2;3_lz`B3h|OaNx|S3%57=af8Wc#%mA_XB_B0G%xV zCo^bthXdQ0QL=fo@C$N!oAM+Mh{e&?TO;@z+k~>di!x`x}TFXZkB78ztHdv*Oy7ZYf4y+pM}EaT-3`UnOWggt_^}dFOv2KM zHWYiz2CrT9CdtLTYMQb3qh8ieYzzeiQx$skic0vKzD_{U$!!PdO1!c5ACMX&u9-so zc5W3(LFs`Je2Phx{P|bIU3ClLyadyQoLf#C>;n!*Ow?^6V%2SnIf){yW_!1{@+D?U zOXu@>&3mg{_g&bjUOQ!X)vSGQ){tIIIqI_V6Zc~Udta}aCpq)+!B37^ZF=Z1fAcRp zN@q33N0;~H4|EMn8cT?g98@u)IK*py^&yVp=(MxNUfZcdc`Lr<-}O>7c3Q8@XLpk6 zX-r&tYGP5uZ398;aR8Myg1%B>-KCXo;;(`mebry0i%9cD+x0pF?t&T)?q928{jR~g zv}cUxkqw@9NN4*y%*VdyY19Y?zC$j(Th(6&Lzmn7FC} ze=9($n3efGo$%S&2tB-TcdD0T;0d{OtF~c81;tpm!Hfdfg6mjXm;vflEtqE#a;8U5 z9R>A=$|{(e@+qORK1zOID#QvAC7`|g@ppWz&LgR?4R0^bZfJq4`sEgs#2J1UWZuHc~P;biAFC(#R0@iR(iIx{^|&I_8PuARj6nou{%9d1?0^X_hN97T2&$I!~4? z=k54kbOTT2O(G8!ijMW2-4NxksCyb_)kb9u_X$Q6l)|hxT-bGDbty4g-(BA*68%Vp z^*{A9J~@&B=ckrFOeqP}x|qrnI*o;Ye_Q2Q;TiLkHog~Q)vGVlxO&q2V*E9)lK*ZG zE(aqBO65p;04bf18)+C(An+cBu^w~uKaVv6{vg5lx^<+NMM`J-Xjhn&fq)iVL8_*e zv-Q8W$r^GHK#Po955~R{ni#p4u@9~T9Ah~Oym^^ePq@<1>6}lH!|>qYMR)U7frG6A zoG~|37a|DT4cE=_02Qh_GWiM95$vaf`vKiAKr#<^;WctW-$c1eK0$L!!|^v4U;4H< z0-mz%ZSi50$rego1UxS;?E{3AX?$@|U4~^kn_8!VfCm`;AXUctL-kqE!&%V8uYuX} zy?%L{gStG_j$hWk>+JubhdHAy&ArD_cx;tvb3Z%8Nl_j*d!eB$S(cSsd)@{Sk_Vl4 zAGRSf`j5#LT8v1>-A#pLK!+fN!>t|$5~3%^T5}N96}H(OCA9d2DkX?tE8RU2qEn1J9194(y*v7E(SXdV^I0z^o@GAh+iBcy<*fbRHnE{ zdr!np9+VY{;WO4Wl5-mHczIWxF^gJDf40vihiv&UgIpYp3U=mV>5Y_6N%|#OECZcd zTO3S@$!BX;al8o~YC61?r>2M_QBqK0Dl>xS7Ir5*S-sDDST;ms!I_E{Y3~K#Q&9zi zb^`8fFmva6!r+4_l2M%=DwapvgGe{N-E#tN1}~iQdP&1_<)#qQ9`E{lb*teHj}O&$ z?%hS~t;?;=f2NEsDfIGzjmUEg8g+mFhj)<-VWe5zP+gQp$tZN{>^KT7HNl0)!w6Jy zc)6`#tzNZhCnRx-u#8WxQnbYTuo*JJZ5l4R{-YFJbWklC+%VC2gY02pjSZYCh=Vy( z@!oA*TjqX+kt@fAarLIPzG{?=OfPRomZr)dwupyoqS?mqa1tv(1guBU6urk{8P5J}DRhOz9}8PtSssId)Ktm* zmyTt4skR)8|GqXaGcC2B5d=$Dvez24cj=wKic*se8{zrB=|ctjS;}svFHzNTpLH$e z(H7A@{jjWnw7Wl5MJHQ4#QdI)srkS$CvNfffTDR@9JC#W=7q-C=7z;`l-s8<{NaS$ zglal&Zf&;BCq-YtnhsW;>4?IPCveo+m3 zpVx5UHY%|kd8a)ln2aj4`7*{-B)U&mS0)u*6%#(T5RFH_e#axENm)ki%rDQ+>o~mk z6f;2oY)NIhce@;;#g=e#LNnWY)wsX_Wida&myn0Ge~@H(fm*M{jWxlST}i^{q#6#L zvT@wY!Mk{Lv_uta!X*OPmoVndDn@@|tX~8U|4N>Gn&Vie?6>1L4hh0b#p}LG^sV%* zmMjqjyp*MeMe%RlVixNJG=F)D)RCABWlCyzO18ogL9Gm*mr~WVPZqeXnuv$+ckz7Z zr7ckjExtKDkSUfhpY^gM;hI|esRalb3!E}R3Jx>>_mYl+gXutd@rsb*fSc_g)H*ag z)cp1K%%nnoV}#b1(^g8*WhvD613f$P18;a;FTcE>`i?_jM_pqT#5-Z=J__lF<1L>SSG{ zjR@Po9om-N1Cp>0@%2Ao=;yZT=n1@$2^xP~J?sq25mws^O>4{b95w$|xTrie zHrk1JyYYlx&wJxpX_E20#Wun*Kln!$7l0KB9QbdUe90T1XIk!Nb^Av`&_Ui>pDa?nD(@Gg&e%P9M?zhVie4BCg4p^TAb z=HIgLXm`g_aZQU!#-p)OFfmyx z4_+E=+=HZ+dwDF^{NTi)C^?gm3 zm0*DBxXoQH-BKCu(;{Y-t{4c4y)Ldu3c(ZGND$xn)7eohQ>MHC57vjvVh6o>?gc8- z+G0J&Q~>-|$~1>hwlB=c403im$*wknLxUK_&uI}Yw0HUs(>t8s+!1jRy&AHQ$S?crlDEv-9T6`!PmB zHkmX7yh9_4r`>Z9-Mg<`b$)L0^`sVWC%A)iqoU@GAoxe`oI&c-CB%q=V10#^i%O=T zFJ)AOdQ?u~B`I7yUdL=NMr<5;ChgrUFJlCGQcmi2(b>w5_5IWP*)Izg!^zx&KGRxk z4^ySyOW}s>@C|D4lrf@Z#$r4o2@x>P;l{ICPjWbDwo)KN#fk=}j&%Z@tkU8^kb66A^%U&)>q+|5_C93Aa*lWhu6 z$KjO}`WC$5&|OhH+N$4U2X=xg5#hvm?Pzy04tA|e&@Ix~>%Z1MIOptG>aJ?RK3n zfNgzLvyCnO2FAQR78azY$Lp0WabMm|m_IY6C@SsE8=ZR&Q6TKYQd7?Ok6tWi z%khTTk`fsZcJL+g@YZQGsgT|D5lZ~H?us38*~8;f8MH@|k8^hCv)+XF_AB>ss5B^) zujq4Orp#>~?bJXyaFJMK$ajx*M(q7Dvr8UD7MeDqDg`E`Nj;bk#M0n}Iic{cdb_F4 zRJE~(LCQ%5CwvjGQG9oHQZ#kWwPIY#Xidg0=QB3q^Bjw(Njw%*#$NYS1=gz$M0NAf z)kFRMZHj`365Yk&s^URT>xwOQ``V7uX&a5S z3pHT=97OkREtjZ$iL_zL)JN^=ea1bEVzCon7jY9|R~(B~xIU;c zqPGyc$k*wySTgyNe@{pKo4Og7_DJYVTVW*`Dc5UOa;UoMe4pVAmul7HGYzNdDU5XP zV#jlDqNuV!d%XbvY}m}?>&eFlmCh%W&-y`*hkHOuj41I_!Rr*WEFPM-+TpJz*!%s# z*WM0kmD!Z_LlUog(l9^svA176(V!a(H{>Qi;GB?jm1fx3Eam+Q?ZRZ`CO-|#-Xv?R z!=RWRa|^^l4c;0K2a663Oy2yXKndN}dT<;`5`xeITet9ln{fy? zw7``fD0GdwX?)!-gdMFcxsoHXS4FW@4jpBRPet1dJC}x4s9FtJa$5-t5B^k-rmP%p zv}c)!deXEyxX%8V*?s%3^m;Qs+BiNDDMftLG8`Y4V(5bxWu$8IlsRdf9)njv@`nU%K zQ=zp0VGZ`eN|3@62#3U-?AP8A0pb;*tOd34i4t_R6aZ-23Sl$a3p2G6P z_?#t~_}!+CeaU(L{a9iq-h?22GpRIV$6ndUDd}cCe&@Iz&n$`@Db9M1ULEljZxurS zGXUZdPLkw-v4yFK`o1l&h$Htnov?_fr>%RX3E#uibVpG*iKR-U#1KDTgQ@ONn|5SO z_8utm?~eXoJ-?dN!$HpTce>!%A72GFft3_TaR1$#BP044^v-Zwf^Jw3=sNEnxkqmt z$>96iI}&slgP05q68j4#v}Dlzi7)H?hX?Ox_4yCyLow7yVK|yb2IM2T)_$|i6rE0H z=>5P|9gPC-wfqcb{hgfxVF&>G&q8R< z&;CxYa5ha?eir<;#evP{O(W$LaSRxrcJUY*#kt=RIItL5!wF$;O+H*}=!-v^e8kg8 zZ;SJc&9L8XM4+V+l4NSY4?tg*qu_Y8@sHKZVJUB|SMRf)7YEH~oxi;p3QlZ6yYg3&f2 zED+;hQ^_P)_Xl*M%bTg++FP#M{=8| z*}IG6G*z16;sYXJRI;&NmxE>M2$9VR73_)442c&cFDxsCLp7uKxuVmaoJZriQR2+8 zXW#8BaaIo3k+kr-^6-H`_#SA_ZQ@`*kYcSb1h~siAsjZaMJzt>njdppJYV)2LF%^= z-REmJG2P}+pnzrtg=B0K=MlnHdyWtGmx&Mhxw)EC#9REn4Yh2~axzWqW7l`cJd|8+d377`igW_hRsKr zn+y?1=uOIgwD!&QvC64ZiQCzmYBbvS{6|EYf-842tOLEX1eq*n1f3`UdzXX{m^nDo z4ev{x!QW4nl&57IGlra(-kzZ-N7EK%4wjRIGEe5=1N;YKLza`Pp)db9_fQTW zZB=jTwP9j+yyZ&3e*Swy^uG2|qE}TQ%QVDEd;m9NeE)n6YW;ycQ2iOS8#e#Xof35#N7hSZVP$hUlpNf=pVQf>iD?mB);rszbJ z*=AyaxH#&hD;C>A2Ur396z4KA?htwLOs3zm?(|~P2%?fTSvvxz7i7%1rnz=v%s$gt zD}t0cZ;k8$Wc+8p^C^rD`AyR?bOFl;WO=VcbN!@(RS)rx678 zWXtWWAsnPnx z+Y?912W+5prMKH3-rV#z<-wq1*}ep%ZJ;W0J5eYT0c1o z(EGa}K;&ifZ}o7(3LnhqJ_G8Pw}U);<9RRw?@NPvS#?6yrjvGffArU1rf;~yR@my{ zsbjB3Gzusi%6~TrXTQ)<;PBa|k=9#(E&wwQ%17j6ldCED-KFMtKMb_75SG?3d{A^O z|Cg#(_b;aXfUf$R&WBV=d~@AkPKiAJz0rd=Dj`d2)5rmhAtN58zxgDKan&?G(?hZLb>kW#E#9VJG#x@>8Kw&N&@rM zjlt8c{d9XZqm7h4V&&UXXK$3n-~u3zF<2W*O{sgYp={%IwqGct76P$RT@3vVkex|H zq_zE)6H&yeI+ulgb&JH@fjbP9(ytSjz1JpI0>hi?h}PC{j1NxJy0BK}r%9=TUe5!} z0(?A{2sXP7?-Nk9aOhh1%j|XC19qpT-0=we7|%HQ79Z*{1AQH}$m&L4+^1u2UDGWt z{Wf!NGeRBN_*?1mLjg3fdckjRRwzD^Zqls+S)KmUuhUMS;9d!J=EFRNE93#QEA zAei3W89DHe)tSbHf3f12(I6yr-VS(Tq4?odi2`AqacJo87Vg6r5L0r#Am5uH5R2=R z%IpIljJOn1>g&io)$$i3k25$YLe+~A({g71#j926ke8t+l;~}c5o_*`xTB255ohZq zIo`iGAfZ{X9JcG{e^KgoI^<($KJ6#JoN2yNKC<$LI z=BTBie8-aRD&Owe&U%%!S2whS7Hjoa)4RNZsv~Qudd@uK{xODkcTMS>239LB>R-fD zr9^u+s=J3FIaEaKYP^Yr3J^?2wC4bV_Q@54tJODu-kzA{G9%t)B!H-n=odRht$IP> zw=$CEXA75r?&j2LdwO*#x#ze8)sm7@rcqhA1{#v~@;drQ#ln%lAeCu~P0TW)>kDUM z4j$)j2vK(;aK}uGtVZxT#WP0rM7#l7^Pf-NQ|4^_dy@xS7GR9`aaSdLBL8$Uh|}^@ z6Bep~#DO-|&h zG1B6B#*i3IiG$s;h`-JB(-EPM7_$30c6vqNvd*xIc*vvZFDh!_njvVi;^a{ZDcr7v zNdO+8s-E7Ctf<=ag`893!P&2|PS{ta%p}+_jgWwbmGBo)a%=yB5f;$$kx<<|#;OZ^ zs&5#x1~<*n*JE%Wwo)(Vw7EW1hp9%9PzvmV^A9`t={6-1cCmCkGquM)0{3__*iGi7 zai;a`B^MRk=FhXVLD=7t)z8xBkY_%eTeol$;qh?Mq>X6Vr8Di6e=hPHC8zyG|KfkD zCk-)E6UNEDg}b3LHY^kefXmK2`{5^z32}eX+~()NiC0<3xghI