From 70a7776da56e840b3caf7c5487fae5cb439b48dc Mon Sep 17 00:00:00 2001 From: Kevin Adametz Date: Wed, 25 Feb 2026 17:05:52 +0100 Subject: [PATCH] 25-02-2025 --- DEV-NOTES.md | 119 ++ .../Http/Controllers/Api/EventController.php | 199 +++ .../app/Http/Requests/StoreEventRequest.php | 27 + .../app/Http/Requests/UpdateEventRequest.php | 26 + backend/app/Http/Resources/EventResource.php | 26 + backend/app/Models/Event.php | 38 + backend/app/Models/User.php | 9 +- backend/bootstrap/app.php | 1 + backend/composer.json | 1 + backend/composer.lock | 1009 ++++++++++++++- backend/config/auth.php | 4 + backend/config/passport.php | 48 + backend/database/factories/EventFactory.php | 28 + ...4_161650_create_oauth_auth_codes_table.php | 39 + ...61651_create_oauth_access_tokens_table.php | 41 + ...1652_create_oauth_refresh_tokens_table.php | 37 + ...2_24_161653_create_oauth_clients_table.php | 42 + ...161654_create_oauth_device_codes_table.php | 42 + .../2026_02_24_161710_create_events_table.php | 33 + backend/routes/api.php | 14 + backend/tests/Feature/Api/EventTest.php | 186 +++ docker-compose.yml | 3 + frontend/.gitignore | 2 + frontend/MOBILE-APPS.md | 226 ++++ .../Bildschirmfoto 2026-02-24 um 15.44.48.png | Bin 0 -> 95324 bytes .../Bildschirmfoto 2026-02-24 um 15.47.21.png | Bin 0 -> 92341 bytes .../Bildschirmfoto 2026-02-24 um 16.11.48.png | Bin 0 -> 66252 bytes .../Bildschirmfoto 2026-02-24 um 16.11.58.png | Bin 0 -> 119886 bytes frontend/dev/UMSETZUNG-FLOATING-LINES.md | 103 +- .../dev/UMSETZUNG-VIRTUALISIERUNG-OFFLINE.md | 456 +++++++ frontend/package-lock.json | 429 ++++--- frontend/package.json | 10 +- frontend/quasar.config.js | 69 +- frontend/src-capacitor/capacitor.config.json | 21 + frontend/src-capacitor/package-lock.json | 1094 +++++++++++++++++ frontend/src-capacitor/package.json | 14 + frontend/src/components/AddEventButton.vue | 2 +- frontend/src/components/AppSettingsModal.vue | 322 +++++ frontend/src/components/EventPanel.vue | 45 +- frontend/src/components/FloatingLines.vue | 473 +++---- frontend/src/components/GlowDot.vue | 132 +- frontend/src/components/LifeWaveSettings.vue | 111 +- frontend/src/components/ModalCard.vue | 171 +++ frontend/src/components/TimelineView.vue | 347 ++++-- frontend/src/components/UserMenu.vue | 278 +++++ frontend/src/components/ZoomControl.vue | 134 ++ frontend/src/composables/useImageCache.js | 175 +++ frontend/src/composables/usePanelDrag.js | 137 +++ frontend/src/db/index.js | 17 + frontend/src/layouts/LifeWaveLayout.vue | 244 +++- frontend/src/services/syncService.js | 253 ++++ frontend/src/stores/events.js | 275 +++-- frontend/src/stores/settings.js | 40 +- 53 files changed, 6719 insertions(+), 833 deletions(-) create mode 100644 DEV-NOTES.md create mode 100644 backend/app/Http/Controllers/Api/EventController.php create mode 100644 backend/app/Http/Requests/StoreEventRequest.php create mode 100644 backend/app/Http/Requests/UpdateEventRequest.php create mode 100644 backend/app/Http/Resources/EventResource.php create mode 100644 backend/app/Models/Event.php create mode 100644 backend/config/passport.php create mode 100644 backend/database/factories/EventFactory.php create mode 100644 backend/database/migrations/2026_02_24_161650_create_oauth_auth_codes_table.php create mode 100644 backend/database/migrations/2026_02_24_161651_create_oauth_access_tokens_table.php create mode 100644 backend/database/migrations/2026_02_24_161652_create_oauth_refresh_tokens_table.php create mode 100644 backend/database/migrations/2026_02_24_161653_create_oauth_clients_table.php create mode 100644 backend/database/migrations/2026_02_24_161654_create_oauth_device_codes_table.php create mode 100644 backend/database/migrations/2026_02_24_161710_create_events_table.php create mode 100644 backend/routes/api.php create mode 100644 backend/tests/Feature/Api/EventTest.php create mode 100644 frontend/MOBILE-APPS.md create mode 100644 frontend/dev/19-02-2026/Bildschirmfoto 2026-02-24 um 15.44.48.png create mode 100644 frontend/dev/19-02-2026/Bildschirmfoto 2026-02-24 um 15.47.21.png create mode 100644 frontend/dev/19-02-2026/Bildschirmfoto 2026-02-24 um 16.11.48.png create mode 100644 frontend/dev/19-02-2026/Bildschirmfoto 2026-02-24 um 16.11.58.png create mode 100644 frontend/dev/UMSETZUNG-VIRTUALISIERUNG-OFFLINE.md create mode 100644 frontend/src-capacitor/capacitor.config.json create mode 100644 frontend/src-capacitor/package-lock.json create mode 100644 frontend/src-capacitor/package.json create mode 100644 frontend/src/components/AppSettingsModal.vue create mode 100644 frontend/src/components/ModalCard.vue create mode 100644 frontend/src/components/UserMenu.vue create mode 100644 frontend/src/components/ZoomControl.vue create mode 100644 frontend/src/composables/useImageCache.js create mode 100644 frontend/src/composables/usePanelDrag.js create mode 100644 frontend/src/db/index.js create mode 100644 frontend/src/services/syncService.js diff --git a/DEV-NOTES.md b/DEV-NOTES.md new file mode 100644 index 0000000..a216720 --- /dev/null +++ b/DEV-NOTES.md @@ -0,0 +1,119 @@ +# Dev Notes – Stand 25.02.2026 + +## node_modules-Konflikt: Mac ↔ Docker ↔ Cursor (gelöst) + +### Ausgangslage + +Die Quasar App läuft in drei Kontexten parallel: + +| Kontext | Pfad | Plattform | +|---|---|---| +| **`quasar.app` Docker-Service** | Docker Volume (isoliert) | Linux ARM64 | +| **Cursor IDE Terminal** | `/workspace/frontend/node_modules` | Linux ARM64 | +| **Mac Terminal** | `~/Sites/thats-me.local/frontend/node_modules` | macOS ARM64 | + +Der `frontend/`-Ordner ist überall **derselbe** (gemountetes Host-Filesystem). Rollup und andere native Pakete benötigen plattformspezifische Binaries – ein `npm install` auf einer Seite überschrieb bisher die Binaries der anderen. + +--- + +### Fix 1 – Docker Volume für `quasar.app` (docker-compose.yml) + +Der `quasar.app`-Service nutzt ein eigenes benanntes Docker-Volume für `node_modules`. Dadurch bleibt sein Linux-`node_modules` vollständig vom Host isoliert: + +```yaml +# quasar.app Service: +volumes: + - './frontend:/app' + - 'quasar-node-modules:/app/node_modules' # überschattet Host-Ordner + +# volumes-Block: +volumes: + quasar-node-modules: + driver: local +``` + +Der `quasar.app`-Container führt beim Start automatisch `npm install && npm run dev` aus (in sein isoliertes Volume). Er ist damit **völlig unabhängig** vom Host-`node_modules`. + +--- + +### Fix 2 – Rollup-Binaries als `optionalDependencies` (package.json) + +Das Cursor-Terminal und der Mac teilen denselben `node_modules`-Ordner. Um den gegenseitigen Konflikt abzumildern, wurden alle relevanten Rollup-Plattform-Binaries explizit als `optionalDependencies` eingetragen: + +```json +"optionalDependencies": { + "@rollup/rollup-darwin-arm64": "^4.0.0", + "@rollup/rollup-linux-arm64-gnu": "^4.0.0", + "@rollup/rollup-linux-x64-gnu": "^4.0.0" +} +``` + +npm installiert davon nur die zur aktuellen Plattform passenden, schlägt aber nie fehl wenn eine fehlt. + +--- + +### Fix 3 – `npm run dev` repariert sich selbst (package.json) + +Das `dev`-Script führt vor dem Start automatisch `npm install` aus: + +```json +"dev": "npm install && quasar dev" +``` + +Damit werden nach einem Mac-`npm install` die Linux-Binaries im Cursor-Terminal beim nächsten `npm run dev` automatisch nachgezogen. + +--- + +### Wichtig: Cursor Terminal ≠ `quasar.app`-Container + +Das Cursor IDE Terminal hat **keinen** Zugriff auf das isolierte Docker-Volume des `quasar.app`-Services. Für den Web-Dev-Server gilt: + +- **Empfohlen:** `docker-compose up -d quasar.app` → App läuft unter `app.thats-me.test` (isoliertes Volume, kein Konflikt) +- **Alternativ:** `npm run dev` direkt im Cursor-Terminal (teilt node_modules mit dem Mac, aber Fix 3 gleicht das aus) + +--- + +### Workflow: iOS-Build auf dem Mac + +Nach einem `npm install` im Linux-Kontext (Cursor oder Docker) müssen auf dem Mac die node_modules neu installiert werden: + +```bash +cd ~/Sites/thats-me.local/frontend +rm -rf node_modules && npm install +npx quasar build -m capacitor -T ios --ide +``` + +--- + +## Allgemeiner Projekt-Stand + +- **Backend:** Laravel 12, API-Routes unter `api.thats-me.test`, OAuth2 via Passport +- **Frontend:** Quasar v2 SPA, offline-first mit Dexie.js (IndexedDB) +- **Mobile:** Capacitor für iOS/Android (in `frontend/src-capacitor/`) +- **Neue Komponenten:** + - `AppSettingsModal.vue`, `ModalCard.vue`, `UserMenu.vue`, `ZoomControl.vue` + - `frontend/src/composables/`, `frontend/src/db/`, `frontend/src/services/` + - Backend API-Controller + Requests + Resources in `backend/app/Http/` + - Event-Model + Migrations + Factory + +--- + +## Wichtige Domains (lokale Entwicklung) + +| Domain | Zweck | +|---|---| +| `app.thats-me.test` | Quasar Frontend (Quasar Dev-Server) | +| `api.thats-me.test` | Laravel REST API | +| `portal.thats-me.test` | Admin Panel | +| `thats-me.test` | Landingpage | +| `assets.thats-me.test` | Vite HMR (Laravel Backend Assets) | + +## Services & Ports + +| Service | Port | Purpose | +|---|---|---| +| `quasar.app` | 9000 | Quasar Frontend Dev-Server | +| `mysql` | 33070 | MySQL Datenbank | +| `mailpit` | 8028 | E-Mail Testing Dashboard | +| `redis` | 6383 | Cache & Queue | +| `laravel.test` | 5180 | Vite Dev-Server (HMR) | diff --git a/backend/app/Http/Controllers/Api/EventController.php b/backend/app/Http/Controllers/Api/EventController.php new file mode 100644 index 0000000..9ea816f --- /dev/null +++ b/backend/app/Http/Controllers/Api/EventController.php @@ -0,0 +1,199 @@ +user()->events()->orderBy('date'); + + // Delta sync: only events updated since a given timestamp + if ($request->has('since')) { + $since = $request->date('since'); + $query->where('updated_at', '>', $since); + } + + // Cursor-based pagination (default 50, max 200) + $limit = min((int) $request->input('limit', 50), 200); + + return EventResource::collection( + $query->cursorPaginate($limit) + ); + } + + /** + * POST /api/events + */ + public function store(StoreEventRequest $request): JsonResponse + { + $event = $request->user()->events()->create([ + 'client_id' => $request->validated('id'), + 'title' => $request->validated('title'), + 'date' => $request->validated('date'), + 'emotion' => $request->validated('emotion'), + 'custom_color' => $request->validated('customColor'), + 'gradient_preset' => $request->validated('gradientPreset'), + 'image' => $request->validated('image'), + 'note' => $request->validated('note'), + ]); + + return (new EventResource($event)) + ->response() + ->setStatusCode(201); + } + + /** + * GET /api/events/{clientId} + */ + public function show(Request $request, string $clientId): EventResource + { + $event = $request->user()->events() + ->where('client_id', $clientId) + ->firstOrFail(); + + return new EventResource($event); + } + + /** + * PUT /api/events/{clientId} + */ + public function update(UpdateEventRequest $request, string $clientId): EventResource + { + $event = $request->user()->events() + ->where('client_id', $clientId) + ->firstOrFail(); + + $data = []; + $validated = $request->validated(); + + if (isset($validated['title'])) { + $data['title'] = $validated['title']; + } + if (isset($validated['date'])) { + $data['date'] = $validated['date']; + } + if (isset($validated['emotion'])) { + $data['emotion'] = $validated['emotion']; + } + if (array_key_exists('customColor', $validated)) { + $data['custom_color'] = $validated['customColor']; + } + if (array_key_exists('gradientPreset', $validated)) { + $data['gradient_preset'] = $validated['gradientPreset']; + } + if (array_key_exists('image', $validated)) { + $data['image'] = $validated['image']; + } + if (array_key_exists('note', $validated)) { + $data['note'] = $validated['note']; + } + + $event->update($data); + + return new EventResource($event->fresh()); + } + + /** + * DELETE /api/events/{clientId} + */ + public function destroy(Request $request, string $clientId): JsonResponse + { + $event = $request->user()->events() + ->where('client_id', $clientId) + ->firstOrFail(); + + $event->delete(); + + return response()->json(null, 204); + } + + /** + * POST /api/events/sync + * Batch sync: process multiple mutations in one request. + */ + public function sync(Request $request): JsonResponse + { + $request->validate([ + 'mutations' => ['required', 'array', 'max:100'], + 'mutations.*.action' => ['required', 'in:create,update,delete'], + 'mutations.*.eventId' => ['required', 'uuid'], + 'mutations.*.payload' => ['nullable', 'array'], + ]); + + $user = $request->user(); + $results = []; + + foreach ($request->input('mutations') as $mutation) { + $action = $mutation['action']; + $clientId = $mutation['eventId']; + $payload = $mutation['payload'] ?? []; + + try { + if ($action === 'create') { + $event = $user->events()->where('client_id', $clientId)->first(); + if (! $event) { + $event = $user->events()->create([ + 'client_id' => $clientId, + 'title' => $payload['title'] ?? 'Untitled', + 'date' => $payload['date'] ?? now()->format('Y-m-d'), + 'emotion' => $payload['emotion'] ?? 0, + 'custom_color' => $payload['customColor'] ?? null, + 'gradient_preset' => $payload['gradientPreset'] ?? null, + 'image' => $payload['image'] ?? null, + 'note' => $payload['note'] ?? null, + ]); + } + $results[] = ['eventId' => $clientId, 'status' => 'ok']; + } elseif ($action === 'update') { + $event = $user->events()->where('client_id', $clientId)->first(); + if ($event) { + $data = []; + if (isset($payload['title'])) { + $data['title'] = $payload['title']; + } + if (isset($payload['date'])) { + $data['date'] = $payload['date']; + } + if (isset($payload['emotion'])) { + $data['emotion'] = $payload['emotion']; + } + if (array_key_exists('customColor', $payload)) { + $data['custom_color'] = $payload['customColor']; + } + if (array_key_exists('gradientPreset', $payload)) { + $data['gradient_preset'] = $payload['gradientPreset']; + } + if (array_key_exists('image', $payload)) { + $data['image'] = $payload['image']; + } + if (array_key_exists('note', $payload)) { + $data['note'] = $payload['note']; + } + $event->update($data); + } + $results[] = ['eventId' => $clientId, 'status' => 'ok']; + } elseif ($action === 'delete') { + $user->events()->where('client_id', $clientId)->delete(); + $results[] = ['eventId' => $clientId, 'status' => 'ok']; + } + } catch (\Throwable $e) { + $results[] = ['eventId' => $clientId, 'status' => 'error', 'message' => $e->getMessage()]; + } + } + + return response()->json(['results' => $results]); + } +} diff --git a/backend/app/Http/Requests/StoreEventRequest.php b/backend/app/Http/Requests/StoreEventRequest.php new file mode 100644 index 0000000..2556d13 --- /dev/null +++ b/backend/app/Http/Requests/StoreEventRequest.php @@ -0,0 +1,27 @@ + ['required', 'uuid', 'unique:events,client_id'], + 'title' => ['required', 'string', 'max:255'], + 'date' => ['required', 'date_format:Y-m-d'], + 'emotion' => ['required', 'numeric', 'min:-1', 'max:1'], + 'customColor' => ['nullable', 'string', 'max:20'], + 'gradientPreset' => ['nullable', 'integer', 'min:0', 'max:9'], + 'image' => ['nullable', 'string', 'max:500'], + 'note' => ['nullable', 'string', 'max:5000'], + ]; + } +} diff --git a/backend/app/Http/Requests/UpdateEventRequest.php b/backend/app/Http/Requests/UpdateEventRequest.php new file mode 100644 index 0000000..da31962 --- /dev/null +++ b/backend/app/Http/Requests/UpdateEventRequest.php @@ -0,0 +1,26 @@ + ['sometimes', 'required', 'string', 'max:255'], + 'date' => ['sometimes', 'required', 'date_format:Y-m-d'], + 'emotion' => ['sometimes', 'required', 'numeric', 'min:-1', 'max:1'], + 'customColor' => ['nullable', 'string', 'max:20'], + 'gradientPreset' => ['nullable', 'integer', 'min:0', 'max:9'], + 'image' => ['nullable', 'string', 'max:500'], + 'note' => ['nullable', 'string', 'max:5000'], + ]; + } +} diff --git a/backend/app/Http/Resources/EventResource.php b/backend/app/Http/Resources/EventResource.php new file mode 100644 index 0000000..a547f62 --- /dev/null +++ b/backend/app/Http/Resources/EventResource.php @@ -0,0 +1,26 @@ + $this->client_id, + 'title' => $this->title, + 'date' => $this->date->format('Y-m-d'), + 'emotion' => (float) $this->emotion, + 'customColor' => $this->custom_color, + 'gradientPreset' => $this->gradient_preset, + 'image' => $this->image, + 'note' => $this->note ?? '', + 'syncStatus' => 'synced', + 'createdAt' => $this->created_at->getTimestampMs(), + 'updatedAt' => $this->updated_at->getTimestampMs(), + ]; + } +} diff --git a/backend/app/Models/Event.php b/backend/app/Models/Event.php new file mode 100644 index 0000000..a4463f7 --- /dev/null +++ b/backend/app/Models/Event.php @@ -0,0 +1,38 @@ + */ + use HasFactory; + + protected $fillable = [ + 'client_id', + 'title', + 'date', + 'emotion', + 'custom_color', + 'gradient_preset', + 'image', + 'note', + ]; + + protected function casts(): array + { + return [ + 'date' => 'date:Y-m-d', + 'emotion' => 'decimal:3', + 'gradient_preset' => 'integer', + ]; + } + + public function user(): BelongsTo + { + return $this->belongsTo(User::class); + } +} diff --git a/backend/app/Models/User.php b/backend/app/Models/User.php index 2d9bad8..abec552 100644 --- a/backend/app/Models/User.php +++ b/backend/app/Models/User.php @@ -4,14 +4,16 @@ namespace App\Models; // use Illuminate\Contracts\Auth\MustVerifyEmail; use Illuminate\Database\Eloquent\Factories\HasFactory; +use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; use Illuminate\Support\Str; +use Laravel\Passport\HasApiTokens; class User extends Authenticatable { /** @use HasFactory<\Database\Factories\UserFactory> */ - use HasFactory, Notifiable; + use HasApiTokens, HasFactory, Notifiable; /** * The attributes that are mass assignable. @@ -50,6 +52,11 @@ class User extends Authenticatable /** * Get the user's initials */ + public function events(): HasMany + { + return $this->hasMany(Event::class); + } + public function initials(): string { return Str::of($this->name) diff --git a/backend/bootstrap/app.php b/backend/bootstrap/app.php index 7b162da..d654276 100644 --- a/backend/bootstrap/app.php +++ b/backend/bootstrap/app.php @@ -7,6 +7,7 @@ use Illuminate\Foundation\Configuration\Middleware; return Application::configure(basePath: dirname(__DIR__)) ->withRouting( web: __DIR__.'/../routes/web.php', + api: __DIR__.'/../routes/api.php', commands: __DIR__.'/../routes/console.php', health: '/up', ) diff --git a/backend/composer.json b/backend/composer.json index cfe0ce9..cb428cb 100644 --- a/backend/composer.json +++ b/backend/composer.json @@ -11,6 +11,7 @@ "require": { "php": "^8.2", "laravel/framework": "^12.0", + "laravel/passport": "^13.0", "laravel/tinker": "^2.10.1", "livewire/flux": "^2.0", "livewire/volt": "^1.7.0" diff --git a/backend/composer.lock b/backend/composer.lock index be6f4be..227afe2 100644 --- a/backend/composer.lock +++ b/backend/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "d7d431a0966cef8d76de033164bdaf6d", + "content-hash": "0200c9a860f66ce072c8de2892b42e7c", "packages": [ { "name": "brick/math", @@ -135,6 +135,73 @@ ], "time": "2024-02-09T16:56:22+00:00" }, + { + "name": "defuse/php-encryption", + "version": "v2.4.0", + "source": { + "type": "git", + "url": "https://github.com/defuse/php-encryption.git", + "reference": "f53396c2d34225064647a05ca76c1da9d99e5828" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/defuse/php-encryption/zipball/f53396c2d34225064647a05ca76c1da9d99e5828", + "reference": "f53396c2d34225064647a05ca76c1da9d99e5828", + "shasum": "" + }, + "require": { + "ext-openssl": "*", + "paragonie/random_compat": ">= 2", + "php": ">=5.6.0" + }, + "require-dev": { + "phpunit/phpunit": "^5|^6|^7|^8|^9|^10", + "yoast/phpunit-polyfills": "^2.0.0" + }, + "bin": [ + "bin/generate-defuse-key" + ], + "type": "library", + "autoload": { + "psr-4": { + "Defuse\\Crypto\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Hornby", + "email": "taylor@defuse.ca", + "homepage": "https://defuse.ca/" + }, + { + "name": "Scott Arciszewski", + "email": "info@paragonie.com", + "homepage": "https://paragonie.com" + } + ], + "description": "Secure PHP Encryption Library", + "keywords": [ + "aes", + "authenticated encryption", + "cipher", + "crypto", + "cryptography", + "encrypt", + "encryption", + "openssl", + "security", + "symmetric key cryptography" + ], + "support": { + "issues": "https://github.com/defuse/php-encryption/issues", + "source": "https://github.com/defuse/php-encryption/tree/v2.4.0" + }, + "time": "2023-06-19T06:10:36+00:00" + }, { "name": "dflydev/dot-access-data", "version": "v3.0.3", @@ -508,6 +575,69 @@ ], "time": "2025-03-06T22:45:56+00:00" }, + { + "name": "firebase/php-jwt", + "version": "v7.0.2", + "source": { + "type": "git", + "url": "https://github.com/firebase/php-jwt.git", + "reference": "5645b43af647b6947daac1d0f659dd1fbe8d3b65" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/firebase/php-jwt/zipball/5645b43af647b6947daac1d0f659dd1fbe8d3b65", + "reference": "5645b43af647b6947daac1d0f659dd1fbe8d3b65", + "shasum": "" + }, + "require": { + "php": "^8.0" + }, + "require-dev": { + "guzzlehttp/guzzle": "^7.4", + "phpspec/prophecy-phpunit": "^2.0", + "phpunit/phpunit": "^9.5", + "psr/cache": "^2.0||^3.0", + "psr/http-client": "^1.0", + "psr/http-factory": "^1.0" + }, + "suggest": { + "ext-sodium": "Support EdDSA (Ed25519) signatures", + "paragonie/sodium_compat": "Support EdDSA (Ed25519) signatures when libsodium is not present" + }, + "type": "library", + "autoload": { + "psr-4": { + "Firebase\\JWT\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Neuman Vong", + "email": "neuman+pear@twilio.com", + "role": "Developer" + }, + { + "name": "Anant Narayanan", + "email": "anant@php.net", + "role": "Developer" + } + ], + "description": "A simple library to encode and decode JSON Web Tokens (JWT) in PHP. Should conform to the current spec.", + "homepage": "https://github.com/firebase/php-jwt", + "keywords": [ + "jwt", + "php" + ], + "support": { + "issues": "https://github.com/firebase/php-jwt/issues", + "source": "https://github.com/firebase/php-jwt/tree/v7.0.2" + }, + "time": "2025-12-16T22:17:28+00:00" + }, { "name": "fruitcake/php-cors", "version": "v1.4.0", @@ -1274,6 +1404,81 @@ }, "time": "2026-02-17T17:07:04+00:00" }, + { + "name": "laravel/passport", + "version": "v13.5.0", + "source": { + "type": "git", + "url": "https://github.com/laravel/passport.git", + "reference": "d5bff1040c764da679d96edbed1705b542b33c3d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/passport/zipball/d5bff1040c764da679d96edbed1705b542b33c3d", + "reference": "d5bff1040c764da679d96edbed1705b542b33c3d", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-openssl": "*", + "firebase/php-jwt": "^6.4|^7.0", + "illuminate/auth": "^11.35|^12.0|^13.0", + "illuminate/console": "^11.35|^12.0|^13.0", + "illuminate/container": "^11.35|^12.0|^13.0", + "illuminate/contracts": "^11.35|^12.0|^13.0", + "illuminate/cookie": "^11.35|^12.0|^13.0", + "illuminate/database": "^11.35|^12.0|^13.0", + "illuminate/encryption": "^11.35|^12.0|^13.0", + "illuminate/http": "^11.35|^12.0|^13.0", + "illuminate/support": "^11.35|^12.0|^13.0", + "league/oauth2-server": "^9.2", + "php": "^8.2", + "php-http/discovery": "^1.20", + "phpseclib/phpseclib": "^3.0", + "psr/http-factory-implementation": "*", + "symfony/console": "^7.1|^8.0", + "symfony/psr-http-message-bridge": "^7.1|^8.0" + }, + "require-dev": { + "orchestra/testbench": "^9.15|^10.8|^11.0", + "phpstan/phpstan": "^2.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Laravel\\Passport\\PassportServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Passport\\": "src/", + "Laravel\\Passport\\Database\\Factories\\": "database/factories/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Laravel Passport provides OAuth2 server support to Laravel.", + "keywords": [ + "laravel", + "oauth", + "passport" + ], + "support": { + "issues": "https://github.com/laravel/passport/issues", + "source": "https://github.com/laravel/passport" + }, + "time": "2026-02-23T15:45:16+00:00" + }, { "name": "laravel/prompts", "version": "v0.3.13", @@ -1460,6 +1665,143 @@ }, "time": "2026-02-06T14:12:35+00:00" }, + { + "name": "lcobucci/clock", + "version": "3.5.0", + "source": { + "type": "git", + "url": "https://github.com/lcobucci/clock.git", + "reference": "a3139d9e97d47826f27e6a17bb63f13621f86058" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/lcobucci/clock/zipball/a3139d9e97d47826f27e6a17bb63f13621f86058", + "reference": "a3139d9e97d47826f27e6a17bb63f13621f86058", + "shasum": "" + }, + "require": { + "php": "~8.3.0 || ~8.4.0 || ~8.5.0", + "psr/clock": "^1.0" + }, + "provide": { + "psr/clock-implementation": "1.0" + }, + "require-dev": { + "infection/infection": "^0.31", + "lcobucci/coding-standard": "^11.2.0", + "phpstan/extension-installer": "^1.3.1", + "phpstan/phpstan": "^2.0.0", + "phpstan/phpstan-deprecation-rules": "^2.0.0", + "phpstan/phpstan-phpunit": "^2.0.0", + "phpstan/phpstan-strict-rules": "^2.0.0", + "phpunit/phpunit": "^12.0.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Lcobucci\\Clock\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Luís Cobucci", + "email": "lcobucci@gmail.com" + } + ], + "description": "Yet another clock abstraction", + "support": { + "issues": "https://github.com/lcobucci/clock/issues", + "source": "https://github.com/lcobucci/clock/tree/3.5.0" + }, + "funding": [ + { + "url": "https://github.com/lcobucci", + "type": "github" + }, + { + "url": "https://www.patreon.com/lcobucci", + "type": "patreon" + } + ], + "time": "2025-10-27T09:03:17+00:00" + }, + { + "name": "lcobucci/jwt", + "version": "5.6.0", + "source": { + "type": "git", + "url": "https://github.com/lcobucci/jwt.git", + "reference": "bb3e9f21e4196e8afc41def81ef649c164bca25e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/lcobucci/jwt/zipball/bb3e9f21e4196e8afc41def81ef649c164bca25e", + "reference": "bb3e9f21e4196e8afc41def81ef649c164bca25e", + "shasum": "" + }, + "require": { + "ext-openssl": "*", + "ext-sodium": "*", + "php": "~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0", + "psr/clock": "^1.0" + }, + "require-dev": { + "infection/infection": "^0.29", + "lcobucci/clock": "^3.2", + "lcobucci/coding-standard": "^11.0", + "phpbench/phpbench": "^1.2", + "phpstan/extension-installer": "^1.2", + "phpstan/phpstan": "^1.10.7", + "phpstan/phpstan-deprecation-rules": "^1.1.3", + "phpstan/phpstan-phpunit": "^1.3.10", + "phpstan/phpstan-strict-rules": "^1.5.0", + "phpunit/phpunit": "^11.1" + }, + "suggest": { + "lcobucci/clock": ">= 3.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Lcobucci\\JWT\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Luís Cobucci", + "email": "lcobucci@gmail.com", + "role": "Developer" + } + ], + "description": "A simple library to work with JSON Web Token and JSON Web Signature", + "keywords": [ + "JWS", + "jwt" + ], + "support": { + "issues": "https://github.com/lcobucci/jwt/issues", + "source": "https://github.com/lcobucci/jwt/tree/5.6.0" + }, + "funding": [ + { + "url": "https://github.com/lcobucci", + "type": "github" + }, + { + "url": "https://www.patreon.com/lcobucci", + "type": "patreon" + } + ], + "time": "2025-10-17T11:30:53+00:00" + }, { "name": "league/commonmark", "version": "2.8.0", @@ -1649,6 +1991,65 @@ ], "time": "2022-12-11T20:36:23+00:00" }, + { + "name": "league/event", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/event.git", + "reference": "ec38ff7ea10cad7d99a79ac937fbcffb9334c210" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/event/zipball/ec38ff7ea10cad7d99a79ac937fbcffb9334c210", + "reference": "ec38ff7ea10cad7d99a79ac937fbcffb9334c210", + "shasum": "" + }, + "require": { + "php": ">=7.2.0", + "psr/event-dispatcher": "^1.0" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.16", + "phpstan/phpstan": "^0.12.45", + "phpunit/phpunit": "^8.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Event\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frenky.net" + } + ], + "description": "Event package", + "keywords": [ + "emitter", + "event", + "listener" + ], + "support": { + "issues": "https://github.com/thephpleague/event/issues", + "source": "https://github.com/thephpleague/event/tree/3.0.3" + }, + "time": "2024-09-04T16:06:53+00:00" + }, { "name": "league/flysystem", "version": "3.31.0", @@ -1837,6 +2238,102 @@ ], "time": "2024-09-21T08:32:55+00:00" }, + { + "name": "league/oauth2-server", + "version": "9.3.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/oauth2-server.git", + "reference": "d8e2f39f645a82b207bbac441694d6e6079357cb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/oauth2-server/zipball/d8e2f39f645a82b207bbac441694d6e6079357cb", + "reference": "d8e2f39f645a82b207bbac441694d6e6079357cb", + "shasum": "" + }, + "require": { + "defuse/php-encryption": "^2.4", + "ext-json": "*", + "ext-openssl": "*", + "lcobucci/clock": "^2.3 || ^3.0", + "lcobucci/jwt": "^5.0", + "league/event": "^3.0", + "league/uri": "^7.0", + "php": "~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0", + "psr/http-message": "^2.0", + "psr/http-server-middleware": "^1.0" + }, + "replace": { + "league/oauth2server": "*", + "lncd/oauth2": "*" + }, + "require-dev": { + "laminas/laminas-diactoros": "^3.5", + "php-parallel-lint/php-parallel-lint": "^1.3.2", + "phpstan/extension-installer": "^1.3.1", + "phpstan/phpstan": "^1.12|^2.0", + "phpstan/phpstan-deprecation-rules": "^1.1.4|^2.0", + "phpstan/phpstan-phpunit": "^1.3.15|^2.0", + "phpstan/phpstan-strict-rules": "^1.5.2|^2.0", + "phpunit/phpunit": "^10.5|^11.5|^12.0", + "roave/security-advisories": "dev-master", + "slevomat/coding-standard": "^8.14.1", + "squizlabs/php_codesniffer": "^3.8" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\OAuth2\\Server\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Alex Bilbie", + "email": "hello@alexbilbie.com", + "homepage": "http://www.alexbilbie.com", + "role": "Developer" + }, + { + "name": "Andy Millington", + "email": "andrew@noexceptions.io", + "homepage": "https://www.noexceptions.io", + "role": "Developer" + } + ], + "description": "A lightweight and powerful OAuth 2.0 authorization and resource server library with support for all the core specification grants. This library will allow you to secure your API with OAuth and allow your applications users to approve apps that want to access their data from your API.", + "homepage": "https://oauth2.thephpleague.com/", + "keywords": [ + "Authentication", + "api", + "auth", + "authorisation", + "authorization", + "oauth", + "oauth 2", + "oauth 2.0", + "oauth2", + "protect", + "resource", + "secure", + "server" + ], + "support": { + "issues": "https://github.com/thephpleague/oauth2-server/issues", + "source": "https://github.com/thephpleague/oauth2-server/tree/9.3.0" + }, + "funding": [ + { + "url": "https://github.com/sephster", + "type": "github" + } + ], + "time": "2025-11-25T22:51:15+00:00" + }, { "name": "league/uri", "version": "7.8.0", @@ -2741,6 +3238,204 @@ ], "time": "2026-02-16T23:10:27+00:00" }, + { + "name": "paragonie/constant_time_encoding", + "version": "v3.1.3", + "source": { + "type": "git", + "url": "https://github.com/paragonie/constant_time_encoding.git", + "reference": "d5b01a39b3415c2cd581d3bd3a3575c1ebbd8e77" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/d5b01a39b3415c2cd581d3bd3a3575c1ebbd8e77", + "reference": "d5b01a39b3415c2cd581d3bd3a3575c1ebbd8e77", + "shasum": "" + }, + "require": { + "php": "^8" + }, + "require-dev": { + "infection/infection": "^0", + "nikic/php-fuzzer": "^0", + "phpunit/phpunit": "^9|^10|^11", + "vimeo/psalm": "^4|^5|^6" + }, + "type": "library", + "autoload": { + "psr-4": { + "ParagonIE\\ConstantTime\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com", + "homepage": "https://paragonie.com", + "role": "Maintainer" + }, + { + "name": "Steve 'Sc00bz' Thomas", + "email": "steve@tobtu.com", + "homepage": "https://www.tobtu.com", + "role": "Original Developer" + } + ], + "description": "Constant-time Implementations of RFC 4648 Encoding (Base-64, Base-32, Base-16)", + "keywords": [ + "base16", + "base32", + "base32_decode", + "base32_encode", + "base64", + "base64_decode", + "base64_encode", + "bin2hex", + "encoding", + "hex", + "hex2bin", + "rfc4648" + ], + "support": { + "email": "info@paragonie.com", + "issues": "https://github.com/paragonie/constant_time_encoding/issues", + "source": "https://github.com/paragonie/constant_time_encoding" + }, + "time": "2025-09-24T15:06:41+00:00" + }, + { + "name": "paragonie/random_compat", + "version": "v9.99.100", + "source": { + "type": "git", + "url": "https://github.com/paragonie/random_compat.git", + "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/random_compat/zipball/996434e5492cb4c3edcb9168db6fbb1359ef965a", + "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a", + "shasum": "" + }, + "require": { + "php": ">= 7" + }, + "require-dev": { + "phpunit/phpunit": "4.*|5.*", + "vimeo/psalm": "^1" + }, + "suggest": { + "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." + }, + "type": "library", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com", + "homepage": "https://paragonie.com" + } + ], + "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", + "keywords": [ + "csprng", + "polyfill", + "pseudorandom", + "random" + ], + "support": { + "email": "info@paragonie.com", + "issues": "https://github.com/paragonie/random_compat/issues", + "source": "https://github.com/paragonie/random_compat" + }, + "time": "2020-10-15T08:29:30+00:00" + }, + { + "name": "php-http/discovery", + "version": "1.20.0", + "source": { + "type": "git", + "url": "https://github.com/php-http/discovery.git", + "reference": "82fe4c73ef3363caed49ff8dd1539ba06044910d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/discovery/zipball/82fe4c73ef3363caed49ff8dd1539ba06044910d", + "reference": "82fe4c73ef3363caed49ff8dd1539ba06044910d", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.0|^2.0", + "php": "^7.1 || ^8.0" + }, + "conflict": { + "nyholm/psr7": "<1.0", + "zendframework/zend-diactoros": "*" + }, + "provide": { + "php-http/async-client-implementation": "*", + "php-http/client-implementation": "*", + "psr/http-client-implementation": "*", + "psr/http-factory-implementation": "*", + "psr/http-message-implementation": "*" + }, + "require-dev": { + "composer/composer": "^1.0.2|^2.0", + "graham-campbell/phpspec-skip-example-extension": "^5.0", + "php-http/httplug": "^1.0 || ^2.0", + "php-http/message-factory": "^1.0", + "phpspec/phpspec": "^5.1 || ^6.1 || ^7.3", + "sebastian/comparator": "^3.0.5 || ^4.0.8", + "symfony/phpunit-bridge": "^6.4.4 || ^7.0.1" + }, + "type": "composer-plugin", + "extra": { + "class": "Http\\Discovery\\Composer\\Plugin", + "plugin-optional": true + }, + "autoload": { + "psr-4": { + "Http\\Discovery\\": "src/" + }, + "exclude-from-classmap": [ + "src/Composer/Plugin.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "Finds and installs PSR-7, PSR-17, PSR-18 and HTTPlug implementations", + "homepage": "http://php-http.org", + "keywords": [ + "adapter", + "client", + "discovery", + "factory", + "http", + "message", + "psr17", + "psr7" + ], + "support": { + "issues": "https://github.com/php-http/discovery/issues", + "source": "https://github.com/php-http/discovery/tree/1.20.0" + }, + "time": "2024-10-02T11:20:13+00:00" + }, { "name": "phpoption/phpoption", "version": "1.9.5", @@ -2816,6 +3511,116 @@ ], "time": "2025-12-27T19:41:33+00:00" }, + { + "name": "phpseclib/phpseclib", + "version": "3.0.49", + "source": { + "type": "git", + "url": "https://github.com/phpseclib/phpseclib.git", + "reference": "6233a1e12584754e6b5daa69fe1289b47775c1b9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/6233a1e12584754e6b5daa69fe1289b47775c1b9", + "reference": "6233a1e12584754e6b5daa69fe1289b47775c1b9", + "shasum": "" + }, + "require": { + "paragonie/constant_time_encoding": "^1|^2|^3", + "paragonie/random_compat": "^1.4|^2.0|^9.99.99", + "php": ">=5.6.1" + }, + "require-dev": { + "phpunit/phpunit": "*" + }, + "suggest": { + "ext-dom": "Install the DOM extension to load XML formatted public keys.", + "ext-gmp": "Install the GMP (GNU Multiple Precision) extension in order to speed up arbitrary precision integer arithmetic operations.", + "ext-libsodium": "SSH2/SFTP can make use of some algorithms provided by the libsodium-php extension.", + "ext-mcrypt": "Install the Mcrypt extension in order to speed up a few other cryptographic operations.", + "ext-openssl": "Install the OpenSSL extension in order to speed up a wide variety of cryptographic operations." + }, + "type": "library", + "autoload": { + "files": [ + "phpseclib/bootstrap.php" + ], + "psr-4": { + "phpseclib3\\": "phpseclib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jim Wigginton", + "email": "terrafrost@php.net", + "role": "Lead Developer" + }, + { + "name": "Patrick Monnerat", + "email": "pm@datasphere.ch", + "role": "Developer" + }, + { + "name": "Andreas Fischer", + "email": "bantu@phpbb.com", + "role": "Developer" + }, + { + "name": "Hans-Jürgen Petrich", + "email": "petrich@tronic-media.com", + "role": "Developer" + }, + { + "name": "Graham Campbell", + "email": "graham@alt-three.com", + "role": "Developer" + } + ], + "description": "PHP Secure Communications Library - Pure-PHP implementations of RSA, AES, SSH2, SFTP, X.509 etc.", + "homepage": "http://phpseclib.sourceforge.net", + "keywords": [ + "BigInteger", + "aes", + "asn.1", + "asn1", + "blowfish", + "crypto", + "cryptography", + "encryption", + "rsa", + "security", + "sftp", + "signature", + "signing", + "ssh", + "twofish", + "x.509", + "x509" + ], + "support": { + "issues": "https://github.com/phpseclib/phpseclib/issues", + "source": "https://github.com/phpseclib/phpseclib/tree/3.0.49" + }, + "funding": [ + { + "url": "https://github.com/terrafrost", + "type": "github" + }, + { + "url": "https://www.patreon.com/phpseclib", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpseclib/phpseclib", + "type": "tidelift" + } + ], + "time": "2026-01-27T09:17:28+00:00" + }, { "name": "psr/clock", "version": "1.0.0", @@ -3127,6 +3932,119 @@ }, "time": "2023-04-04T09:54:51+00:00" }, + { + "name": "psr/http-server-handler", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-server-handler.git", + "reference": "84c4fb66179be4caaf8e97bd239203245302e7d4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-server-handler/zipball/84c4fb66179be4caaf8e97bd239203245302e7d4", + "reference": "84c4fb66179be4caaf8e97bd239203245302e7d4", + "shasum": "" + }, + "require": { + "php": ">=7.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Server\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP server-side request handler", + "keywords": [ + "handler", + "http", + "http-interop", + "psr", + "psr-15", + "psr-7", + "request", + "response", + "server" + ], + "support": { + "source": "https://github.com/php-fig/http-server-handler/tree/1.0.2" + }, + "time": "2023-04-10T20:06:20+00:00" + }, + { + "name": "psr/http-server-middleware", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-server-middleware.git", + "reference": "c1481f747daaa6a0782775cd6a8c26a1bf4a3829" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-server-middleware/zipball/c1481f747daaa6a0782775cd6a8c26a1bf4a3829", + "reference": "c1481f747daaa6a0782775cd6a8c26a1bf4a3829", + "shasum": "" + }, + "require": { + "php": ">=7.0", + "psr/http-message": "^1.0 || ^2.0", + "psr/http-server-handler": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Server\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP server-side middleware", + "keywords": [ + "http", + "http-interop", + "middleware", + "psr", + "psr-15", + "psr-7", + "request", + "response" + ], + "support": { + "issues": "https://github.com/php-fig/http-server-middleware/issues", + "source": "https://github.com/php-fig/http-server-middleware/tree/1.0.2" + }, + "time": "2023-04-11T06:14:47+00:00" + }, { "name": "psr/log", "version": "3.0.2", @@ -5395,6 +6313,93 @@ ], "time": "2026-01-26T15:07:59+00:00" }, + { + "name": "symfony/psr-http-message-bridge", + "version": "v8.0.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/psr-http-message-bridge.git", + "reference": "d6edf266746dd0b8e81e754a79da77b08dc00531" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/d6edf266746dd0b8e81e754a79da77b08dc00531", + "reference": "d6edf266746dd0b8e81e754a79da77b08dc00531", + "shasum": "" + }, + "require": { + "php": ">=8.4", + "psr/http-message": "^1.0|^2.0", + "symfony/http-foundation": "^7.4|^8.0" + }, + "conflict": { + "php-http/discovery": "<1.15" + }, + "require-dev": { + "nyholm/psr7": "^1.1", + "php-http/discovery": "^1.15", + "psr/log": "^1.1.4|^2|^3", + "symfony/browser-kit": "^7.4|^8.0", + "symfony/config": "^7.4|^8.0", + "symfony/event-dispatcher": "^7.4|^8.0", + "symfony/framework-bundle": "^7.4|^8.0", + "symfony/http-kernel": "^7.4|^8.0", + "symfony/runtime": "^7.4|^8.0" + }, + "type": "symfony-bridge", + "autoload": { + "psr-4": { + "Symfony\\Bridge\\PsrHttpMessage\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "PSR HTTP message bridge", + "homepage": "https://symfony.com", + "keywords": [ + "http", + "http-message", + "psr-17", + "psr-7" + ], + "support": { + "source": "https://github.com/symfony/psr-http-message-bridge/tree/v8.0.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-01-03T23:40:55+00:00" + }, { "name": "symfony/routing", "version": "v7.4.4", @@ -9796,5 +10801,5 @@ "php": "^8.2" }, "platform-dev": {}, - "plugin-api-version": "2.6.0" + "plugin-api-version": "2.9.0" } diff --git a/backend/config/auth.php b/backend/config/auth.php index 0ba5d5d..d3c3651 100644 --- a/backend/config/auth.php +++ b/backend/config/auth.php @@ -40,6 +40,10 @@ return [ 'driver' => 'session', 'provider' => 'users', ], + 'api' => [ + 'driver' => 'passport', + 'provider' => 'users', + ], ], /* diff --git a/backend/config/passport.php b/backend/config/passport.php new file mode 100644 index 0000000..aed4358 --- /dev/null +++ b/backend/config/passport.php @@ -0,0 +1,48 @@ + 'web', + + 'middleware' => [], + + /* + |-------------------------------------------------------------------------- + | Encryption Keys + |-------------------------------------------------------------------------- + | + | Passport uses encryption keys while generating secure access tokens for + | your application. By default, the keys are stored as local files but + | can be set via environment variables when that is more convenient. + | + */ + + 'private_key' => env('PASSPORT_PRIVATE_KEY'), + + 'public_key' => env('PASSPORT_PUBLIC_KEY'), + + /* + |-------------------------------------------------------------------------- + | Passport Database Connection + |-------------------------------------------------------------------------- + | + | By default, Passport's models will utilize your application's default + | database connection. If you wish to use a different connection you + | may specify the configured name of the database connection here. + | + */ + + 'connection' => env('PASSPORT_CONNECTION'), + +]; diff --git a/backend/database/factories/EventFactory.php b/backend/database/factories/EventFactory.php new file mode 100644 index 0000000..6997173 --- /dev/null +++ b/backend/database/factories/EventFactory.php @@ -0,0 +1,28 @@ + + */ +class EventFactory extends Factory +{ + public function definition(): array + { + return [ + 'client_id' => Str::uuid()->toString(), + 'user_id' => User::factory(), + 'title' => fake()->sentence(3), + 'date' => fake()->date(), + 'emotion' => fake()->randomFloat(3, -1, 1), + 'custom_color' => null, + 'gradient_preset' => fake()->optional(0.3)->numberBetween(0, 9), + 'image' => null, + 'note' => fake()->optional(0.5)->sentence(), + ]; + } +} diff --git a/backend/database/migrations/2026_02_24_161650_create_oauth_auth_codes_table.php b/backend/database/migrations/2026_02_24_161650_create_oauth_auth_codes_table.php new file mode 100644 index 0000000..c700b50 --- /dev/null +++ b/backend/database/migrations/2026_02_24_161650_create_oauth_auth_codes_table.php @@ -0,0 +1,39 @@ +char('id', 80)->primary(); + $table->foreignId('user_id')->index(); + $table->foreignUuid('client_id'); + $table->text('scopes')->nullable(); + $table->boolean('revoked'); + $table->dateTime('expires_at')->nullable(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('oauth_auth_codes'); + } + + /** + * Get the migration connection name. + */ + public function getConnection(): ?string + { + return $this->connection ?? config('passport.connection'); + } +}; diff --git a/backend/database/migrations/2026_02_24_161651_create_oauth_access_tokens_table.php b/backend/database/migrations/2026_02_24_161651_create_oauth_access_tokens_table.php new file mode 100644 index 0000000..3e50f7f --- /dev/null +++ b/backend/database/migrations/2026_02_24_161651_create_oauth_access_tokens_table.php @@ -0,0 +1,41 @@ +char('id', 80)->primary(); + $table->foreignId('user_id')->nullable()->index(); + $table->foreignUuid('client_id'); + $table->string('name')->nullable(); + $table->text('scopes')->nullable(); + $table->boolean('revoked'); + $table->timestamps(); + $table->dateTime('expires_at')->nullable(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('oauth_access_tokens'); + } + + /** + * Get the migration connection name. + */ + public function getConnection(): ?string + { + return $this->connection ?? config('passport.connection'); + } +}; diff --git a/backend/database/migrations/2026_02_24_161652_create_oauth_refresh_tokens_table.php b/backend/database/migrations/2026_02_24_161652_create_oauth_refresh_tokens_table.php new file mode 100644 index 0000000..afb3c55 --- /dev/null +++ b/backend/database/migrations/2026_02_24_161652_create_oauth_refresh_tokens_table.php @@ -0,0 +1,37 @@ +char('id', 80)->primary(); + $table->char('access_token_id', 80)->index(); + $table->boolean('revoked'); + $table->dateTime('expires_at')->nullable(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('oauth_refresh_tokens'); + } + + /** + * Get the migration connection name. + */ + public function getConnection(): ?string + { + return $this->connection ?? config('passport.connection'); + } +}; diff --git a/backend/database/migrations/2026_02_24_161653_create_oauth_clients_table.php b/backend/database/migrations/2026_02_24_161653_create_oauth_clients_table.php new file mode 100644 index 0000000..9794dc8 --- /dev/null +++ b/backend/database/migrations/2026_02_24_161653_create_oauth_clients_table.php @@ -0,0 +1,42 @@ +uuid('id')->primary(); + $table->nullableMorphs('owner'); + $table->string('name'); + $table->string('secret')->nullable(); + $table->string('provider')->nullable(); + $table->text('redirect_uris'); + $table->text('grant_types'); + $table->boolean('revoked'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('oauth_clients'); + } + + /** + * Get the migration connection name. + */ + public function getConnection(): ?string + { + return $this->connection ?? config('passport.connection'); + } +}; diff --git a/backend/database/migrations/2026_02_24_161654_create_oauth_device_codes_table.php b/backend/database/migrations/2026_02_24_161654_create_oauth_device_codes_table.php new file mode 100644 index 0000000..ea07831 --- /dev/null +++ b/backend/database/migrations/2026_02_24_161654_create_oauth_device_codes_table.php @@ -0,0 +1,42 @@ +char('id', 80)->primary(); + $table->foreignId('user_id')->nullable()->index(); + $table->foreignUuid('client_id')->index(); + $table->char('user_code', 8)->unique(); + $table->text('scopes'); + $table->boolean('revoked'); + $table->dateTime('user_approved_at')->nullable(); + $table->dateTime('last_polled_at')->nullable(); + $table->dateTime('expires_at')->nullable(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('oauth_device_codes'); + } + + /** + * Get the migration connection name. + */ + public function getConnection(): ?string + { + return $this->connection ?? config('passport.connection'); + } +}; diff --git a/backend/database/migrations/2026_02_24_161710_create_events_table.php b/backend/database/migrations/2026_02_24_161710_create_events_table.php new file mode 100644 index 0000000..e021372 --- /dev/null +++ b/backend/database/migrations/2026_02_24_161710_create_events_table.php @@ -0,0 +1,33 @@ +id(); + $table->uuid('client_id')->unique(); + $table->foreignId('user_id')->constrained()->cascadeOnDelete(); + $table->string('title'); + $table->date('date'); + $table->decimal('emotion', 4, 3)->default(0); + $table->string('custom_color')->nullable(); + $table->unsignedTinyInteger('gradient_preset')->nullable(); + $table->string('image')->nullable(); + $table->text('note')->nullable(); + $table->timestamps(); + + $table->index(['user_id', 'date']); + $table->index(['user_id', 'updated_at']); + }); + } + + public function down(): void + { + Schema::dropIfExists('events'); + } +}; diff --git a/backend/routes/api.php b/backend/routes/api.php new file mode 100644 index 0000000..110e93f --- /dev/null +++ b/backend/routes/api.php @@ -0,0 +1,14 @@ +group(function () { + Route::get('/user', fn (Request $request) => $request->user()); + + Route::apiResource('events', EventController::class)->parameters([ + 'events' => 'clientId', + ]); + Route::post('/events/sync', [EventController::class, 'sync']); +}); diff --git a/backend/tests/Feature/Api/EventTest.php b/backend/tests/Feature/Api/EventTest.php new file mode 100644 index 0000000..6f25c78 --- /dev/null +++ b/backend/tests/Feature/Api/EventTest.php @@ -0,0 +1,186 @@ +user = User::factory()->create(); + Passport::actingAs($this->user); +}); + +test('can list events', function () { + Event::factory()->count(3)->create(['user_id' => $this->user->id]); + + $response = $this->getJson('/api/events'); + + $response->assertOk() + ->assertJsonCount(3, 'data'); +}); + +test('list only returns own events', function () { + Event::factory()->count(2)->create(['user_id' => $this->user->id]); + Event::factory()->count(3)->create(); // other user + + $response = $this->getJson('/api/events'); + + $response->assertOk() + ->assertJsonCount(2, 'data'); +}); + +test('can filter events by since parameter', function () { + Event::factory()->create([ + 'user_id' => $this->user->id, + 'updated_at' => now()->subDays(5), + ]); + Event::factory()->create([ + 'user_id' => $this->user->id, + 'updated_at' => now()->subHour(), + ]); + + $response = $this->getJson('/api/events?since=' . now()->subDay()->toISOString()); + + $response->assertOk() + ->assertJsonCount(1, 'data'); +}); + +test('can create an event', function () { + $clientId = Str::uuid()->toString(); + + $response = $this->postJson('/api/events', [ + 'id' => $clientId, + 'title' => 'Mein Event', + 'date' => '2024-06-15', + 'emotion' => 0.75, + 'customColor' => null, + 'gradientPreset' => 2, + 'image' => null, + 'note' => 'Eine Notiz', + ]); + + $response->assertCreated() + ->assertJsonPath('data.id', $clientId) + ->assertJsonPath('data.title', 'Mein Event') + ->assertJsonPath('data.syncStatus', 'synced'); + + $this->assertDatabaseHas('events', [ + 'client_id' => $clientId, + 'user_id' => $this->user->id, + ]); +}); + +test('create validates required fields', function () { + $response = $this->postJson('/api/events', []); + + $response->assertUnprocessable() + ->assertJsonValidationErrors(['id', 'title', 'date', 'emotion']); +}); + +test('can show a single event', function () { + $event = Event::factory()->create(['user_id' => $this->user->id]); + + $response = $this->getJson("/api/events/{$event->client_id}"); + + $response->assertOk() + ->assertJsonPath('data.id', $event->client_id) + ->assertJsonPath('data.title', $event->title); +}); + +test('cannot show another users event', function () { + $event = Event::factory()->create(); + + $response = $this->getJson("/api/events/{$event->client_id}"); + + $response->assertNotFound(); +}); + +test('can update an event', function () { + $event = Event::factory()->create(['user_id' => $this->user->id]); + + $response = $this->putJson("/api/events/{$event->client_id}", [ + 'title' => 'Updated Title', + 'emotion' => -0.5, + ]); + + $response->assertOk() + ->assertJsonPath('data.title', 'Updated Title'); +}); + +test('can delete an event', function () { + $event = Event::factory()->create(['user_id' => $this->user->id]); + + $response = $this->deleteJson("/api/events/{$event->client_id}"); + + $response->assertNoContent(); + $this->assertDatabaseMissing('events', ['id' => $event->id]); +}); + +test('cannot delete another users event', function () { + $event = Event::factory()->create(); + + $response = $this->deleteJson("/api/events/{$event->client_id}"); + + $response->assertNotFound(); +}); + +test('batch sync creates updates and deletes', function () { + $existingEvent = Event::factory()->create(['user_id' => $this->user->id]); + $newId = Str::uuid()->toString(); + $deleteEvent = Event::factory()->create(['user_id' => $this->user->id]); + + $response = $this->postJson('/api/events/sync', [ + 'mutations' => [ + [ + 'action' => 'create', + 'eventId' => $newId, + 'payload' => [ + 'title' => 'New via sync', + 'date' => '2025-01-01', + 'emotion' => 0.3, + ], + ], + [ + 'action' => 'update', + 'eventId' => $existingEvent->client_id, + 'payload' => [ + 'title' => 'Updated via sync', + ], + ], + [ + 'action' => 'delete', + 'eventId' => $deleteEvent->client_id, + 'payload' => null, + ], + ], + ]); + + $response->assertOk() + ->assertJsonCount(3, 'results'); + + $this->assertDatabaseHas('events', ['client_id' => $newId, 'title' => 'New via sync']); + $this->assertDatabaseHas('events', ['client_id' => $existingEvent->client_id, 'title' => 'Updated via sync']); + $this->assertDatabaseMissing('events', ['client_id' => $deleteEvent->client_id]); +}); + +test('sync is idempotent for creates', function () { + $clientId = Str::uuid()->toString(); + + $this->postJson('/api/events/sync', [ + 'mutations' => [[ + 'action' => 'create', + 'eventId' => $clientId, + 'payload' => ['title' => 'First', 'date' => '2025-01-01', 'emotion' => 0], + ]], + ])->assertOk(); + + $this->postJson('/api/events/sync', [ + 'mutations' => [[ + 'action' => 'create', + 'eventId' => $clientId, + 'payload' => ['title' => 'Duplicate', 'date' => '2025-01-01', 'emotion' => 0], + ]], + ])->assertOk(); + + expect(Event::where('client_id', $clientId)->count())->toBe(1); +}); diff --git a/docker-compose.yml b/docker-compose.yml index 1c6c6b9..2def612 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -81,6 +81,7 @@ services: NODE_ENV: development volumes: - './frontend:/app' + - 'quasar-node-modules:/app/node_modules' networks: - sail - proxy @@ -160,3 +161,5 @@ volumes: driver: local sail-redis: driver: local + quasar-node-modules: + driver: local \ No newline at end of file diff --git a/frontend/.gitignore b/frontend/.gitignore index f1d913c..1360c61 100644 --- a/frontend/.gitignore +++ b/frontend/.gitignore @@ -16,6 +16,8 @@ node_modules # Capacitor related directories and files /src-capacitor/www /src-capacitor/node_modules +/src-capacitor/ios +/src-capacitor/android # Log files npm-debug.log* diff --git a/frontend/MOBILE-APPS.md b/frontend/MOBILE-APPS.md new file mode 100644 index 0000000..835fca1 --- /dev/null +++ b/frontend/MOBILE-APPS.md @@ -0,0 +1,226 @@ +# Mobile Apps – iOS & Android + +Die "Thats Me" App wird mit **Capacitor** (v7) als native iOS- und Android-App verpackt. Capacitor bündelt die Quasar Web-App in eine WebView innerhalb einer nativen App-Shell. + +--- + +## Wichtig: Zwei Umgebungen + +| Umgebung | Zweck | +| --------------------- | ---------------------------------------------------------------------- | +| **Docker-Container** | Quasar Dev-Server, Vue-Code bearbeiten, `npm install`, Web-Entwicklung | +| **Mac Server / Host** | Xcode, CocoaPods, Capacitor-Builds, iOS Simulator | + +Xcode und CocoaPods laufen **ausschließlich auf dem Mac** (außerhalb Docker). Die installierten Tools auf dem Mac-Host beeinflussen den Docker-Container **nicht** – beide Umgebungen sind vollständig isoliert. + +--- + +## Projektstruktur + +``` +frontend/ +├── src/ # Quasar Quellcode (Vue.js) +├── src-capacitor/ # Capacitor nativer Wrapper +│ ├── ios/ # Xcode-Projekt (lokal, nicht im Git) +│ ├── android/ # Android Studio Projekt (lokal, nicht im Git) +│ ├── www/ # Kompilierte Web-Assets (nicht im Git) +│ ├── capacitor.config.json # App-Konfiguration +│ └── package.json # Capacitor Dependencies +└── quasar.config.js # Quasar Config +``` + +## App-Konfiguration + +| Eigenschaft | Wert | +| ----------- | ----------------------- | +| App ID | `media.adametz.thatsme` | +| App Name | `Thats Me` | + +--- + +## Einmaliges Setup auf dem Mac + +### 1. Voraussetzungen installieren + +```bash +# Homebrew (falls nicht vorhanden) +/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" + +# Node.js +brew install node + +# CocoaPods (iOS Dependency Manager) +brew install cocoapods +# oder: sudo gem install cocoapods + +# Prüfen: +node --version # z.B. v25.x +pod --version # z.B. 1.16.2 +``` + +### 2. Xcode einrichten + +- Xcode aus dem **Mac App Store** installieren (~15 GB, etwas Geduld) +- Nach der Installation Xcode **einmal öffnen** und License akzeptieren +- Developer Directory auf Xcode setzen: + +```bash +sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer +sudo xcodebuild -license accept +``` + +Prüfen: + +```bash +xcode-select -p +# Ausgabe: /Applications/Xcode.app/Contents/Developer +``` + +### 3. Capacitor Dependencies installieren + +```bash +cd ~/Sites/thats-me.local/frontend/src-capacitor +npm install +``` + +> ⚠️ **Wichtig:** `npm install` immer nur im `src-capacitor/`-Unterordner ausführen, **niemals** direkt im `frontend/`-Ordner vom Mac-Host. Der `frontend/`-Ordner ist per Volume in den Docker-Container gemountet. Ein `npm install` dort überschreibt die Linux-Binaries mit macOS-Binaries und der Dev-Container funktioniert nicht mehr. +> +> Falls das passiert, im Dev-Container reparieren: +> ```bash +> cd /workspace/frontend +> rm -rf node_modules package-lock.json && npm install +> ``` + +### 4. iOS-Plattform hinzufügen (nur wenn `ios/`-Ordner fehlt) + +```bash +cd ~/Sites/thats-me.local/frontend/src-capacitor +npx cap add ios +``` + +### 5. CocoaPods für iOS-Projekt initialisieren + +```bash +cd ~/Sites/thats-me.local/frontend/src-capacitor/ios/App +pod install +``` + +--- + +## Build & Simulator starten (regulärer Workflow) + +### Schritt 1 – App bauen + +```bash +cd ~/Sites/thats-me.local/frontend +npx quasar build -m capacitor -T ios +``` + +Das kompiliert den Vue/Quasar-Code und synchronisiert die Assets in das Xcode-Projekt. + +### Schritt 2 – In Xcode öffnen + +```bash +cd src-capacitor +npx cap open ios +``` + +### Schritt 3 – Im Simulator ausführen + +In Xcode: + +1. Oben links das **Zielgerät** auf einen **Simulator** setzen (z.B. "iPhone 17") +2. **▶ Play** klicken + +> **Hinweis:** Für den Simulator wird **kein** Apple Developer Account / Signing benötigt. Signing ist nur für echte Geräte und den App Store erforderlich. + +--- + +## Nach Code-Änderungen + +Wenn Änderungen am Vue/Quasar-Code gemacht wurden, immer wieder: + +```bash +cd ~/Sites/thats-me.local/frontend +npx quasar build -m capacitor -T ios +cd src-capacitor && npx cap open ios +``` + +In Xcode dann erneut auf ▶ klicken. + +--- + +## Production Build (App Store) + +### iOS (App Store / TestFlight) + +```bash +npx quasar build -m capacitor -T ios +cd src-capacitor && npx cap open ios +``` + +In Xcode: + +- **Signing & Capabilities** → Apple Developer Account eintragen (kostenpflichtig, $99/Jahr) +- Zielgerät auf **"Any iOS Device (arm64)"** setzen +- **Product → Archive → Distribute App** + +### Android (Google Play) + +```bash +npx quasar build -m capacitor -T android +cd src-capacitor && npx cap open android +``` + +In Android Studio: + +- **Build → Generate Signed Bundle / APK** +- Keystore erstellen/auswählen + +--- + +## Native APIs / Plugins + +Capacitor-Plugins ermöglichen Zugriff auf native Funktionen: + +```bash +# Beispiele (im src-capacitor Ordner): +npm install @capacitor/camera +npm install @capacitor/geolocation +npm install @capacitor/push-notifications + +# Nach jedem neuen Plugin: +npx cap sync +``` + +--- + +## Git-Hinweise + +Folgende Ordner sind in `.gitignore` und werden **nicht** commitet: + +``` +src-capacitor/node_modules/ # Lokal neu installieren mit: npm install +src-capacitor/www/ # Wird vom Build befüllt +src-capacitor/ios/ # Lokal generiert mit: npx cap add ios +src-capacitor/android/ # Lokal generiert mit: npx cap add android +``` + +**Was commitet wird:** + +- `src-capacitor/capacitor.config.json` – App-Konfiguration +- `src-capacitor/package.json` – Capacitor Dependencies + +--- + +## Troubleshooting + +| Fehler | Lösung | +| ------------------------------------------------ | ----------------------------------------------------------------------------------------- | +| `spawn pod ENOENT` | `brew install cocoapods` | +| `xcodebuild requires Xcode` | `sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer` | +| `Cannot find module @rollup/rollup-darwin-arm64` | `rm -rf node_modules package-lock.json && npm install` im `frontend/`-Ordner | +| `Signing requires a development team` | Für Simulator: ignorieren. Für echtes Gerät: Apple Developer Account in Xcode hinterlegen | +| `ios platform already exists` | Normal – `npx cap add ios` überspringen, Ordner ist bereits vorhanden | +| Weißer Bildschirm im Simulator | `npx cap sync` im `src-capacitor`-Ordner, dann neu bauen | +| Pod-Fehler | `cd src-capacitor/ios/App && pod install --repo-update` | diff --git a/frontend/dev/19-02-2026/Bildschirmfoto 2026-02-24 um 15.44.48.png b/frontend/dev/19-02-2026/Bildschirmfoto 2026-02-24 um 15.44.48.png new file mode 100644 index 0000000000000000000000000000000000000000..38592dd611ef727c775965a8e53a7a5a72730e6c GIT binary patch literal 95324 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

sNEqRUmb_GF}{6QVa6coYLO73(M7Lf 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 F{|EipPhS84 literal 0 HcmV?d00001 diff --git a/frontend/dev/19-02-2026/Bildschirmfoto 2026-02-24 um 15.47.21.png b/frontend/dev/19-02-2026/Bildschirmfoto 2026-02-24 um 15.47.21.png new file mode 100644 index 0000000000000000000000000000000000000000..2542bebcb7ba7f35f2395ac46b684017be9dfead GIT binary patch literal 92341 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

c+>y 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 literal 0 HcmV?d00001 diff --git a/frontend/dev/19-02-2026/Bildschirmfoto 2026-02-24 um 16.11.48.png b/frontend/dev/19-02-2026/Bildschirmfoto 2026-02-24 um 16.11.48.png new file mode 100644 index 0000000000000000000000000000000000000000..483b2ca7f5bbe51573b04a40a41a03eb8819e5ba GIT binary patch literal 66252 zcmeFZby!r}7e5Tc07DNw^dJoaLrBK}0wSrXARPiC9nv*|bf_R9jUb@XNXO7hhYCna zhjjPv;Jx0<{k_lo=ljR|Jl}bq;T-lkyVhQN?ax~417TVk%0&3I_!t-%L@Kv#-o?Pc zf&gDN2o6wk*d1<%fq`FTt)QT#qM!iRa(1w^wza^(xE1y~0ar`=A$7-w_cC)P+fC%{ zCG{5?7+lQd82E!tO1D5@`A{z5lCr92JmH~`cuGUcJH>Zeqd6-S?=-DHyMC>+Mi)x? zdIM8oWWu3gBYC5)+QrXhviib%J=NW+7c0QFn>6BiF*nBYwIo(4bO<9IwPr^>2nvVC za5+vp=9pRP>OzpVofi`_Zp@>h6Q3A|j}HzmzJ2xZ;iAUiB>Z_ZEiO5FQw75WO{w|_ zBLj+~^iXh1Oct5QEr);8!!ae6114Rlpq}z*<)+3XF#=N;j7?TzXT~1<;9px`*wE;8Ji0r$t>b#K^=QEVg3Uu=gF2?^06%{4>sqF*a#%(Tx-1cMZp`3p>Trc!{f|E}+vHo^F

Ybpt2b%FEEdO*~umqSPHzUqC0Gj3!SEx7YQ| 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%0DZc~S{PrHBbxr}r zV1uhY7sX8YF9+owmE|JRLFU!(eSt`{H}c>bfI0zMh6gDW?;q=GsRWPQOiD4NhB*1P zQg;nzXnO0rd7q_-1zU_IYVwSlzgY9Ep&@kOy8HomRHSmW((E{ z=QS@Beby{i78_Zkcp%=X4^FO==*^h9t6Ib@R;=xhPdskc#cowr)hZtvc>uOn9XS<0 zjyFLP$AxD~u@xl<(ebJ*&-9C@FMM5BTnFQ| zfl#bamb41#G@`v1SogC-!x2Ar#6!c2*M|fNp1XR8Y_XJ5Q0LCu-K6BP?fT|Vqimbz zh~!y!K9o<&dobuM_`Por2DaqW`}E|#Vk^LGH(3HN8M*#^PA!o<(Eo)t^S8B%#6lr{ z<@y)#qFzKE4lZd5uo6hy9=rLJV1AI&U(NxeU0y_a_kL*(aN+1k;<#~pad4*3oyaXW zzqf2LtIi;;AQTqHw)Pp%#Q(h6+0KQFw)5Vn*jK$tE+n8bYVq?7ALuy`YV;afloS?n z35G^%g0}wVRw%`z)xh%B8I^h``XJ1=wdEaMYa^?kSaW*85+6vN>7DFtXjZZcxM)wz zy`S2D$KpDklS3l2KXZgfe)n^Gw1s{ZIB3k%eFUEmB$25yp>LKa$i~~iL7k7$J|I}b zOG;aYW|*`DIxgoVXeIA6 zdGIq5e({q1`9gvC3*QUB=+p@FO9}-AiT6lL_}Ij{TN{waP2#Tx0yZ;}Q%4$3GhrN5 zx#@n#2COYMmrJt=zb=dlICvpwvQd9v-{_#$RpT_2O41#bB-rI-P71GlsJcrC z1k%@pgMTu~XHeR0h^g*0_|^wQ6J1D}fpn|hK;q)3RilHNHXt|p15~7x>p1DTNZAJ@ zrz0-2pQ&!O>L7wQ7>r;X9{wP7w?&LcD@*v;_<{(w1qLPMYbwk;NX4g@x!T+m=i6H^ zV|=owCxreQbT{6|hh^`?0McW`rRz%oZk02H_rp3xT{zt}Wsc@%K9=>qIck$~0ip1e z+&}C!u7N{Y^g+x7xREYDMu)O|?M3$W$Mn{NE8w?Y&OeO4OP`{b){+oAqzk@gW-jsW zbYf-urp{YesRZ7Gvd4;A_G%|?i$9^P7H0iAnxS}pn6`9UN9 zIq)N}psJa&@I~d&+R|m(b}KGdD(5#bOXlJw+Kjmv3I=VQU@;w{XMlXWYhlK*sdB`3 zfDF(uqn&PQ*i_WMlf*hy( z^zy#%0(RzgQv@b?=3mVdIo3;BwMYV`*47!t?70M5t4G^6U^KhZy8>DBZeGqsh59MlZgm%3w+ZUPy>hQq##(>^nR(@8@(!IZZ5 z(Teh*szbWe1Kkx+BXY|`fHcto~YC)6N#VJ>FJ^@|0Q*8 z-Y%hbd_J6Rd>W^%!2aon3LO+*gjJfS<<=#`;_#Af5VP}F&T&a&S}>tnZL3qKp)})H z4yiDR@kjdEFRQl8B*P34I#-_b0YW7*?xc-CUVMC?yEsrFaSC8^L?qPBu^p+_kamdi zjVT=p+shCH+9rm)G&YWxV9xr`F;zOY!xwpAJIe8)p5BDM-A}p@%Df!sdN>#lX9h){ zWeW{{R9a5FcOYmp02GCWj)BB zbnkH_Zq3x$x{kqR2yF4^Il$#eH}nCrF`paHlz#&UcCrl2;7OgD!jYS3A2@~fxdM~H(@={~@6WvIyJa4K$ z%H|~%O^foGa5XqF`K}GKCIQg^S%yY$C%~hWB?-SNuyxIFzcitzlLmt$#ZjILge=01 zRurRmA9wN;0zISBG@^)}=lN9UV|+S8eP(9Ikg`e;jP}6`x{QytU1nWDPH0<`NG^{> z$*H7Tf*Vt1?AIqHYuKchRW!L7w_k)%08FO7GJ&51C*La@zDbQwUG9bUG&H~#8Je+k z@Yb)e3)lkWE8DsP})fcmQ(LxF!YT5c`YB^)~`c zO1{?>n9J2pRzAAk^;GN0>k#RAS#m2ic)L%mP%j=w)|}+FJNng}eCX=DMa}JaY~D64 zKZVS4Z*h@aE+*|2Fxib#5Q^|}G3qWeVXeLz_!uWc>F4*P_Df=VCK%ZnUWgzPLmK*( z89g6)A?%`V{M0gVyNrrO0PF2eUcn#7q*FITS(Xcya{&l$bA;s9`t@E<^*PTLL>rx+ z3}Xy+IQP7{QJoX~opKxF$U5^mke_j-K0fS_HTq~+TQO~Jw*heYB1G$c5)GxPTVML8 zX*(&46fvIN=B2m9fRKI!uJn?e-NB)}xpeQcDaJ9t$$Lo(tV3hsC+E40Kw@rt*SB=@ z4|V(i;uUeheV3A4{}g~kVf4s>$AXV2y<6`9hn>HiegzH*|xOa~-Hk1rX7Sc1&y{Do(}dPBfavm{Vq^-jBByFvPrEiwtlulUWf z0>Znp_qq*c6V0Q!F7uXi2XrlEjGHjQ$8Y%V0=X?cD(StmLh5QC&&%x0o&IzhqZVQh zKV!hS&aYcVnrC)d?L6$+eG?ZGA$}%Q@6e}z3Wm8LS=i01AaO4*HTZa+)|Cah5kcLs z`MkP|qvJB9UtJQMpBF;8i4ZDdu)qvxE(6;e_psNZOB-x!D(1EJ(P)YLoSk3jMPqv10jO79)QzC2~SKe%+p z4;3KH&#S_@7W5E=xDFvSvqbFJ`k6$HzLwcZ>YEcr%#s;qm}OX1e%*N`)I+2F$=PQ@ zw{|CW!@#7UbcssPnBTOrod4?@ptYJ*R=Y_Z-WbECR4FYr8`V^h$g!Wkv(l#f{6Wnb z24;2rHwvAiPVKiEh+Md3(&jITUNb+28}{Qy@;^eQTzOh=-G~Eo+AL2Zt0wmfMS0AU zr1pU0R5YP7ZX(8ed^WrY;1OAXa8BJ}%efj=EBA}uAT(C-G(F^X=z?%~!PpiqvhzA~4;x6IpY6QYsppP(X?o|K6^=Q}JA5CO5WzPG z{@mVH@2lR``m=*jHgO{EV;~2b8QvDD!Cpwbw2^wou=T?MXAMA#-mJX^#2Ase*MGFLWg^f=1NQfK~xoMt&o$ z87-T%7Ain!uyeZ8*T-+=QoMtv&R5(l&z0t-GqjbTg9n{&T$~rVwa(qgZhpkxG9quR zUU!?KGqmWrSf~vjHi#0!TSwx7#u7A=(z&GF1fwK6!n%^t9>ICg5K>QV_~~YdYzmZ@ z*V<;d(5?^i?BFF%NM*xb0eLjtB2x>Z_~fUuyUI3o)+vysc+)>J(04QuO`~*7v-G8v zTBr8MH|JEO`5mF|2gk|7TL&J{j1cfd*k|t%hRD(5RpW~vTMH$%O9FD|*~1u&n|>g} za#?^bxKQ{*7(Tc<4KVPmWOFq<)ePYX7qW?`EO3p-&>U1K@~l(Yrn*CpE_H_X?0QSa z`r^ofz}GOllg3Yj(fqV4=1EaIkJ1)h2HWGIy07$36<{|Fcs;d@3M(4zHxm}`F@g&9 z^)5m&8e(6>7ud|RHM+EN#!}q4&0G*^K>Zf>v1Ls_B!K$ydknZte0zivTCw++63q$) z$4>K29x0qtTcU-`Psc!Z)qUL|bd|_yJ9YQd;vzu7l-ABeE`?cTyZ7cGO{55(1;qP} zx48y>@cw{ z(Xn+}^4jVfOvYTz=pwtQMTOfejbCw(MjqvxceB9agXHtBb&Yk2JyZ|&mtbem!;f{P zFHwF>@Jug-{b)peO(_jXm9R4MqSq&@0EkBq;Z# zp^O%XUUi2kItmEoIlremGjiJd;a*^4$U}|cp#VEnA>hS@bdw25g`kcuX)BTYM|QIf!VMqRmQ!rwv^$C? z#W?78oO<*=_@88t=+GXWzL&ydhISH^5511Q<>It3EB0*msPP`86$&y1TM3x)ncygI z3j!QcW3Fh;K-$`TLz(Fyo~ki5<*L#f*mzy22hC2z3@GVyhAQmkW`o0klsffsMH z-TR5nQSw1neNzB^wCuCFiHLmBaE6K=Tj+_zaJ5D+Zux_u;S?7E`PxtS`iE%`IIt}Y zgI;ailHA(<2u<$ZbiQP8l00EwYgNTm_P>oEK8o+c1^vwue!#V!EO%Dt-9kvns#qM` zm^Xb%8zy8s_QM8I>sLEl_}L5N?2^fOoNQ+IFCi<*wlVrrxNyH5q;5+Jg^UAC*uK}y z<6$tPHO(G1XAcb((Rl`Q z#p#3R{65UDq)b)B(IT%m?*)g$`r!??F`)~$3#5}mgPo1Ttnc#dyqB7<17*aRLEh?|gC$>9gJ+liUsyPLFlcysyx_d%K%xq&cxaA=(SxI1uAoA*Eq(c?g%; z3}k6A`RaMBWaax!2^n(mYsqPey_)i13MPHW0u_swLLsNIJCcBZcktSHO7A2 z-8-@DlP(?r6GU)JZOf>m{QaIsUfogn^&z3bW<8P=1scVqQCnYn)-%}7T-U-0!|=Ov z_*tB+b`F#2OOKEhgvl;k!;FzJC(lJe2X<$1Q&P7>)9$sRO+8SWSlC0`s);P+@E zaIU`Tll{TS_**)b1)Y$j02hV<%chhERW^3ZJDOXf!zPx9ZIig+Ip!M1nKLEMpn$A# zIPV^Ek|oC7D>|;L+oY`G}coVjQxdgv1k*6T0u$0@56OZY0oEViNA8scn= zO_rlW%XJGPw2Pdg9=XdkJ+>-=!2oG?l4w%s7vAK{#HZH>5kt-i?!orU0P8rRv;a9u zc|`R#*KL|QniyZeneUdYh|~XdPPab?AfC0QI~cFU)N$=_1tn<>`(u} zin2aJuYc2krmE-dn~+*>w%PFbpu13_XM}fP$c;bPkPl zNp~Y%(!$W)lG3db0@4jqN-H7V-6bG!F1_#Pecp3Eo=@j@&iOL%gFV-^W9_xqUVE?q zYU*WF_a@-xYS~+8eQMDB&MoXR(cySHPcIEo@L0vPk*>8nwS8_q>a9 zK&kne2#KKI1-r&B5*sxL(oNPutTcogd%lXPQ*!@syMVpq@!P>rO?b5RcpM^^Zim>C z8Je~qK$Z}h212hy^)E!GCfvkM`Y{(Ofsm=>pGeEYYlBtGMt8)%L=s3M;G^%w9uopr zN;XxtkE)NKc@eNvTeFx_=EssH4+d-Mj*FSdHoaiD=>i?0Qy_O;;gah{sV>Gp#uI8Ww369{7EzjBCnTsy#Ek05 zAuW`Tls?-g$%cha^pvVVD#aJgtR>~VB4o`A*E4$F)5vS;SAk1cz$1g?pg$MA7!(O2 zKMl0fc39)l@4u6$M?GZT4nnmMhjcChQ>6@k?3Va?@XL0kXyIo(T5$_fT3o?F zZVFdV#^aSvvP#h97q3=ayKH(3JR;1a2kM$CIw!Hm`VAuM(5c6jlfo)Ng*3%n;G?-x zHmF-6x2`rvqz!vV{O;Q~_f0z3%f?c+e5`?^r@ZcR39rU!rvy|^1?l9~K&E-gN z!Df5-%u942)$=D`&dIeDo44x5LlCOq7XJ&CO1Z<)P`uPaY9=ev``>+{H7L2h>+?%l z0+(~{FFdnU^b=zTK(ueOdXRhtNIO?T!gj?&x{*H~XF0F-v(ST7yO`Dq!B4Jz!*-)N zDGM=K0}e5}>IZ6}&-9u;PB+=xvZ^y_5n#!uK6`rf3{Fw!xR^l!3@ zWBs|f8T`JHS|!U94yCQN9A6n@3-T6HFF$o^e2^YIdEv=1Pz4)7m7z(NN zJ&lcDeBz(a9qEEX@U2-ESarBXKyQg>`zwA`W}4ALsFI zwKSm7qmDrPg0qV0!;=aASdXLwvL2}=ay2nJhXyT4$|U)o8gi~%{em10Nb9&VKc3mR zvQC(Gu0=w?F@l#Sm>duP=$#@GLBZZq#yfz&rUkl`ZSC+ovSae!Ex+e#Qhku5#j)h2 z>`4Y$6WdW66xKyFVv4K7m&Ec>16R*0P$BRbN%V{0|VXfO2bGYlpcwOW^N(o1ONszNafvt!dCU_*f(NP1{= z>{mYAL+?3X8Dwe*_D3e@l5$9>n8H`iV=gojtO_|@8JmO^^beH3OD(ZQvhm9^&JiK_ zWX#yQKaTRbByI)qdk8?mWI0_JW?08aXs-Bs%-FoH&L=&iy{_t;vvG(H6v^2X&190DtcP+x)iS2hyTP&6->G~_Y0&~x3W{-?0%zngF0b6@E;Y3uR# zl5J~VYQIjuWsGoLgIymSKDM#LI1%*Q4AJy?Z z(t$jvIOi8&x2}m%RB0zVmMV8WVK{&kCQYgzc<`WurX&hgq`A>7xJO`SIc{poP+6k< z6i#?k9{HJ>XJiAF5X=SqilAu-s``k`grfiRESy_j zyw_ZB67Zj3=F`%S$2iM%(^7K}!uHT~zc8_BOE(hr)vQrbJb_Ls9&iyJ&DmHlwbHiz z*-xMf21^Syy_x9myX|cl75h35g|LfROSL#VCU-iC{a*Q;o5{eVRU?+(5*1Ec9=-zj zUma&qL^)@eM&w`P%_A3X4=&C1LVmGhjpqwfr*UQ-_)_vZ$nuOuFgd2ySi5{vm6_+l z3Z}GFJxiy4gRyt|Lbm*V~)l!+t(4d(-cjzUv`PfSW6Ti zv}ocT(>)?s<@RWuqhpq`=qr>=RK1}M1h}5M>=5?R3~VZ8OpGTL zEX-L>5g3JO3&~*;PccFk?7-M6y5FtS?Td+Cj!Y$c1&qC#Qs`CyqT1fpLWtN8GRupc z@upWIr6qw&{05KM1K43NJZey)_zqliZp?!M4{)i-%70h&Ep-kl3AwMnbKM;&NkUnJ zfl*irz`9b~K`(MuI{RsFA%J6b3J4ml#gtIJ`rcQ423Y-}pi=dvrr(NRN+ud_9Wv#S z0i#`>h$rd+yv=9lnHvs$swiq=v_b>6#DFv_B1c)2m^DtG^zw#6NnC|hCgb~xGeY0G zM0nt=MmPx57VZGCQo(&j}H1|wHsD~8~w>?$Ok?Tkq2+s;eaW$GQ8fM!HJnB`q^Oi$*tfM zjH__Y)E0T_1Ja|j;EqZhFh;T2FP9vM=E7$s!+#u+4RzSC%yUAgQPHEe+-vN~bH0CE5_M+NId* z4l^YkZJpkoWUGft?cV0DJ3zp8C_Ckr-Eu&HFI0*RM4{2YtB!ucVfN{X(GxZseSyQ4 zQ}sI~t2$!PYXMRG7Z)4OWn)n;C$0nCnZmAD4O|$@mNFz$GVn+EpzP(-Bu2V8m43#O zpmCS=L6R?u>Org7WxjV4+x~Kfk*?L@PulG}))Ui~s<$g!O!fI$)B`UT9T&fOe4Vt{ zaq9cDEAuIeAoO|Y)3>6a0684AW@;y|q+_S^rT4%0tVCxuf0#=Wa~?2E5)ci^g@Fk0 z(LsUOL}VVP6z97`=2^C8{VUrYvLz?0VpC}EQ?L_{@rmP)S9&;}6F`WYG&J<1Ktj=J z;WceN%}&7Cpid%V>9K&oX9kmg<0rfm51mzH;~j7xR*;vc(n3oi4TqMw9V@WwM{3a5 z*9++7`nV!=qYvqI-I*W_3`pD1W;RFb-x9VAIp*T(}3<&Y@23! z96ji?zb|V+ky#Vhe~Ajbz5OX{K3 zIhv-r%XGmeGH;6L4oCq8!%8G;?mTX{gLAdt=owKT5UIsV^o>v=yYuVVuI(qc-NK4= zz?!(E4fZU#jJiZ!4Ht+IQuc;Gl%iQq9-cFs*64+k4@?`8L0Z(;#6VunT8#=ii1d#0 z?o5&^YliI+G6TtbNs*2=~GC@S>9jw1!-lV*mLD;r`l@mRcw{=AlAhnecfpNCW9OuLFMlrOrvfgoF|E3sGc zcMJyFdQ+@@@Hsg7!E7Xc)={2IT^_MaA>Bm!Jka(DbO|JV3t07r%=%<)GCWc5T1Nj3qq39QL zd$9W26jjuTpCqBSFDl%IRyTSekCyV5n!357`=d3cg%pS#O2{3p@k$n-Z$An;b(#93 zTg#JSOvJUgEtzS@yPwFe_+lNsp|TztoUPd2h9cSIEW@7IP~tyEsihlpG_Wq#3LNc0 z6t!M0Xy0J2Mg}+s#YeNhMJ!3JdyPIUQqMJ&oQ@7e?nBSAR_0>^D*l{BlQ1@E=UJDL^Vl$>Xzh=S1p>B}Z$ z{=M~JN&$!E!&)n_BX&rDS)FN>xJVU_3rC7FhX5}905Qa4EKJ;ybcI?K-YTZJCNG@j zsHd%&2*jgRldV4j7tFIjFz6g?#&(yrLd|vC!yk@7%)wotZOQ4agR@YH8YZZ>Fy@XV z7&OudFt^N%q51Q=_a90S{iWkLT}F^?6{g*@)j3xY0r_6YrF!wEJiC*WbAW zpXARzdd!u==@7(;tPbN$YHB<{T@(4_Wo=j3CIK0B&86;774jG?ahR{)>AS2kB!jfZ z_PNUM3db}kj-35fi%qp5ELzI)uw}af4#E++Y3}I5k({ERF@m^+btaSmD2870}? zx`dXFa=m^OLhtUnOZ(s>v@BYCpYr(*8dhCKAa z&0fN%{#VuOHm|la3tfBc_?bB?gUtZ0M->=HjcFl9su38F-b_3mj{pK@}f z;ifXOQHN0CTfvZLV=hX&zM{ym7`^(LL=hq+LOLcjWUwaH3heQiMI2bhZppp8nk=ds zc(2>?M!T0XaF89(%khb0YQLwpP*oNAsQN|9po>dknbBgz{CK*z6TbZMhrxz>w`u(J z4GF{V3u{H+IAh#6K3(F~3<^HdqnPKQVoX&$w-h z0i$@B0Rq-r=T0A*`J-Yvf4}=&jMt)}52tn+phpkJ!-Lon@b7xC-R-?P5$o#+4=57a zOMQHH(osdTifht13IezuxA>~fk)^sM)xjf-+Qs_#gV85yWg8NiTgg%5uE#?aIeSKbEcLB@)N=AdJ{A}915#(hfG!eHy2zOv|jv2 zEbK!&{q7w3AQ>#QR8WcDz1J3M&H;aeN0~9;;7aL&p;c>%N#O{R2s@8?^Sv>N4a};EJMqSF7C!5 zu9{T5t@#s}iq_6~oXd@L9a}m4^8kl8e9ZnaM#{KfXs2@x!PYgYU*>@N@-gL_?gR;B z%^jDv2{u`xhj%Dl-}X_x$XNv$U=$qFG0>?xB7FVw6*2%%BeNu%PxVH+MT*u6$LFl zAE4UlQ?zOYG|_V+MaEdb!r#UYmZf}6=8kzN><&`c3XLqylNUH->JtKPL?|p|Qf|xy z8Q%PyBF^M-lq=@#z>dKxOKgJ+$3>I?X;)5EeP?{hv;{hsAN1rC8gl)>+y0nwh;!?j6-v zFLOu}o(kdzW_7iHF={GYJdEt^tlOevu1#IS?vqTgUcrBwOj6YK2sh)+N~vq1AUM?XxtqMG!givB{G*!I<%rl?DXPLOXJ;I7-HaM}5S!Hm-^}{#za<}6kAkX+50Pp@84oGedCd-^IDCZK{no)j z5mhzr!{Rw`k`2gBI(G1e@Cvf1Gn_NgIcXZRB`TTaOe62{9k)#=Pl}Dq%~^^_zr`he ztdAtm8F{$E)Wiw@cah{23g08cnyiKix!9;hg;Z}1LdaPt|5GphVFiO|$alwNFE`q2 z*PnGv9yG78qQmJQ%Ah?*Mb>=gRtnsbali$oKX{4t1S64M)|>~8jWRztg%bO}A|Hyn8LV!;K3iWPne(6V{g8h0fieSs3%jCxp)gpLBlqFC~USzrbm9newGG@URS7*@A8=KH6~wy;eI6y$|%B4V9Zfmkw3Ux3k5*86zklKUgj zqrOtFLNEPG0{RG3MQ#gsUFY$cp-v`d#;++6;khP8HBkg4L&r9I#D{`!(afk$a4BMX z%(Rc}ysR2T2ZJF&6w|kWL+wK*a_A6^nzDPe(4ikg>8BX0Bq)GspV~a@=veH(IOE}EL^PwP2opM*Y53PJR%Fdv)^I~1I z@UA{mioXP|q8(aHi9v#lC1!%HoB1MkiIN~sO86D;g1GQhvo~tFF^~cnCIE2K7t<3q zPUi!0NIdCY7$6n8`3P+7z5xr)ZT(1F5n?)|XEXGDLtWdA`vb+^yLCn$JBoVa_7ak?&cdo|~pT?_>oJ1u#fL z$*7+<1*kkwDO02EL)a|5Y|=R{Qq-M-64v(1yxA1csE)45`Odox|}c9EAbPxJeU?+2?%!%_*2HNmEV;)04?; z54?&0%J|Z3+BwS*gJ%Szv;Q_LUbocdQNAq$u4fLpwyfC$mg!_}*ct&KqQ_2n(J!NU zm|yDRG4Xn~sUDumiS}Zy&a-PmV3X09c`c9k&-gdftMHINi6LvsCn!O~18A@**swm$ zss+F(Y!t&B;lk*&1DH55>~#0ecufr^N2`i}$qHGS&s`4xEnA8Me$$O7fs>s)pzx>* zKHC3vO^>2@Ng)VN-6gD~J;#?z4uopBW)rQ|pqAS8Y>@bZ7wuBnZ|IrETGHX8IF#1M zJEmO2dG92`O;(SDtY?b#DK%k#1r|7>>Ie`B^T<3Gc+O|SXnb$-brgCEocwZ8E=@se?x?`6y-7bx|ZV0S^_%)c*;@jTDQ-|vuRk6fRrN6tr2&p4GKEs@( zH;SRf0i~EN&tU^FNn#2`WXGq51e^2x_D7+F(&!a_)2g%>qT`Vqu}Er@I&=^yL@rVe z$I=Z?47`lh<%$TA{_vC~fn5@1G6%@=^0WdlX z5@75rilFF&hv8(pF#{t)^k5M)hYS#sYe}r|_mT*I+-3SDG8A+WpB7r8G77Vh(C0aavdp6I%q0srw)&2$?HlnY~;Qbz$fHd=7B{6U+eW_9$;hCJ>j_aL_d@o`GDV@6qof*Xl2dpJ+U zWK?Qq^Q0$;J34?j;WEoA(nKL$%ij^BwHKgn+2s1>?+z&p&I1>0%(9;tG078roc2!s zG@Z6rU?=l2Uds#PXeF!g%~Ig<#-ysJm}d37?qa6uq&=g>208yOLiTlL7`HFWJZ-#9uUh#N=A9Bpiod`fZe z@YAAf>JO*WXuSx#g<5`}2h(AgdDrZ^3H!^|-ve1L#pXL(-LRt^NDCUUI6W%KBTFT% zvr0aQ^Gcwx6T9_%@h%Ba73-xfz@tCn9PbM3DxuN!Rk3{Ez{JJz-s^>v`>GTzE*+FF zCz^m7O_#!pztp_TxVVyu#EcQyaRvKXn>>yk+7ye}=!4Qy_v%6&g}>DymUM;G!2lB& zRCh;c9PXlw+py1N2FTi7?Vzu?*bB0#Cg-4zq92Ku!IK?j*BePj*2o?ei&0^8f3OfA zY#sK-y<6yF#2m2B=7&q%W5tt%B27ZHs%O6$!p33m8`_SECE=|Q&peYivp(2e+9PG5L=*^j*N zkG>PqJ=nomDfcK^@rE&mBZ3XU*)-b--*}lL_K_4sxNYJkxvye6bjoV*)gbCYoTeIR zJ5QtxGn#cgQY-u<*O2v;+U3x51*&*H`d7+2Zq0I3Hk=&SFu{)u2A%2L=|x2eK!FiDF3}3pX~n? zUybhFc6vwScZ>B#!SUzKk7g-^YS( z`;(R<;7Ml5O^cX*(EA6K6Gxll<;w!;h^jUUdSsyUAGv_l@sc)@{ zyehQxgw{H_E6V~y0b61XA75Z#(*@y%cOnzM+`2ch;;O6>dk$e|{o0o6xb2E)*jWf` zc(aE3hDfHBGsbKwR7?su!eC=7*MwDjk_gP>Z@LJrvRTh`8OL%ao9sM}IUWAAiNd ze#|OI^uP#&d!_59-#Og5E{Xbp3H;`iA{lGVND@Rsca>QkEHr%cb9>>q*7*S{nODhW zy5AfP24?xSs>r9T-FSzCqAB7}w}m;IFUW~5J8qA@Jt=4mQ}V0DR2030B2U7rk-NaX z%*Qw;prkkBG{;XsP9y2W)4?BOsLcKQTyo|H6=BM3GtuXw`m{FcqarF+fBaUs&HYb zZJK1VXU9n+mCX3Oi&6z*FoY#}+{rCS@X)xDf1Juy@?Fo%q|1mrKC&Cg2?|b6ZdPS* z-k;l9kVUbunCIJ|SbIK*JLutQ_Ee>=sxUje!)yOEY38%3#f)oUZ$Fy)?MTP+>4+%X zTY^neGJQ`mhvhyYy=vliAatFGESqnk{^3BW=wZt_OQo1VV31lzzI+Ms%|TLI=(|DR z9m>1G_)7-*_Puj)?@#_rw&|a&Z;ED5O}?f)CQy0C^7=ptz&pD=*k5Mipr83tDpkB2 z_$Iry3M~>-KFVUEqbH#IIYKHTL29>${aVOF@jGZ%Y!{z|>cCj{jlj!mbNy%$Ltf$8RYXNSqZnVHvWgUZ3L>?^oU(S@6xcrVg^VSW zDMh*I$JP-(OB!ZTE@$NK<94ZmAuZmc_!@$739(JD2h?+apxwZ5rJqs-DXq+6pPNa0 zW!+`DIp!}?&f8?T4%1V^csr(XK?X#yRAX&EFliuS$)MRUgMqCVOk0;;Kr`jwI~&y5 z?0LOq6=A)ZWv+lG4Mk5E0~II*R3~$$o{+MkqKWUK9wVl>C>$WQFy7|r?{PVC?v}cd zHvZ}BkvFA2cBS%h@@O|UvR(86#{;z)q07*YB%nM4cc;8$2U@^ZkLwFGE6=`}uqPc8 z1CNNFZ9k10g~OlpCwc@ezPGqfz4gm-<%rZk_*TxIu3M#z2{I#zqp=e)jQeqm+S z{@MY8s_<+4CmXuB0DIpIADZCyb)W zunI!n+@IM$VmF{h^W)I;RE2#-Tn0E}JBh*A`x656QXOP#f2&oE+T+xdvEVd3FQ6RY zRU^SN60N6o zYBCxx>~yYZA>y31t$0kd%kE2eKUu@v480V*FbHDz;Omi^o7~@da(rbT6QPj!1u@N4 zU(3&KKUWmpa#kOk6BQ3g(Z^tu{wf~&<2o!br|c?iuwv&_Q?%>+>QPlZ5QRx;KyNMF zvny$9D!jzKw43C1YkLt>L9^KemQFxfXX$;OZI2N?zF$CI`jMl9V=2SnETeCD%25by z*)Ohw^}KdehLR19TI!2f);FgqCP(tsUbi)1VxYU!e2aOicEJgu77QbwgiY`|Tqspp zvsy7j!x?eU?BqjP7GDiiR!saHOMGCDCTtt^9*02scOv`7>Kc}_ODoq?)mR#zl*Muj z0TG%Ep0!&@uw2NR8==L`JGZm($xmkd7_`5t3vJQRDg267(N{w9j`C;6sw^4b8@Y0n zCpD7Cb@HKML@$S$Bk)=Dzg2Kl_z{tHKi8K9(R!*nFTc$f1d+gy*b$Whi6tM?0+YWw zKSFrPUn=%+`Qus_wpfG`M>kw$yX7ugb*0huKIDKTd!vbU``l%59p2>zsop3C^}Pi5 zt9zClJqgxAE)e`41C*smw>bzng)D+UVL99RJ)XgKzb z!Wc`9m5dS@@&rmsDKYU6+kW*$uKhdZ)eAwa;5v3|?uov`_dnWdhq~X7IGdklA0TXK zFzY`4l2vca3NGUQc=rOE_9@a=*Go1$_M_N}nojf)eMu3C!LHhu#sS-i82#d~ETZnw z5`K#+60$$o^ctA}aWFDB%<2M0S@TaYJ1dgCx5PD!NberN4^)qSJ&+i?rs1f=y}uYa z%d}DQpvQHY6{+*HxvBY<;%k_`W?~I!zzfFS&d1{wR6m`o#Xowe-YF$Q0xL8v^ug-EDzqdNd;a z$9qbjlFgtSCh?r~dsk`E023ok7~~cs0cX$d{SQK?;|x+8bGn_C5?6r}%;%@(n}=^Y zBT)5*b<^CvGoKdL)u*x;t71J6O{_QMsw(Iq{!TLchx}6lug*}fBRKn4)Cn^Hfr^}= z57-P~m5$9z7w+wS_7~byAa9%~w%Avm(ksyGE6`v!=*ULjHvP`-D8<=O`Wt`a%N+HY zw|ZAIsVu*$Ka1l2(tHHOqADsm)%o$a)16MGq3|KAVD#Ajjn zQ>c_DS}1(=>wZgx7f2?}Nvvq)CFVV)Fjw7$5Z$G@--0D{_R2ov7r!W;U;cPtw>j-A z+mjBKi}bwJS9X=lS7DEqaN;Srpm&i1Nzevd26PS#8*&l9`00O4WYRQp`Xq`tBA!D38=qu5M56{#zIb0dMdB({PT(+hH1K0YFqLM1Gm ze7pvZ^Vj^;L8Ef6pMaDH=4^p9ia38z9DGOsC`|%fKcW(%Gy4~O6U~9Fa~8qFaPMvw zXn%~QEB(eU=Na)J%iDxS&g&$C9A*3TJAL{dX}w@c3JH{2Fsi6Wku}HNu0bqa*1I~l zfpIyFLNh(pM@aTQGw6FC?Zgs60|1X<=K`d}#6<*DG8h5$lvrU{KwinekP1sl_}+z^ z3v6j7%@HR^Q^H?zK@(DrSH8IKYFmC+dt6eJL@jF=Xx>@#jOEIOV3yfg?A@~Jl7i`y z2NR1pIvitKFZ3i0N_0B@rSxs0kRPEz48VgT$kYd({~T~gnfIX5b^g!nHU@XWa+IFg zOSD?_oHox7(gebzZ&Jo+qOKd4X~QMxSqQ%L@J(pmDW^tO!t2q+SROX3nXli;nSZa0 zP$+G|Z61fOd+nGKcccPLEGzE(uL*xU?CK!@O=Cvw|r0$iJN_n+s4|PJR|M zY1MRQ>FwA8#GYr-hwK;h!0q??m<#LkzJABvbh@b3BaGl>8s|RruVw(C=;`AhjoTe( z=g2v{2rg+v__q(3w1k0t(;ka{rwzf=8*0D{GXhqOUrAH{%L`0nMLJ;kR(djE2b;$- zerP6FJ{L@1z6u~V6Nv5X)qyxEH8N#o`l9~$E>+Yodo#GooFuaHu_CpX1Wq^Z-wY+A zqDZx6IhC57vMI0iA6bR3Cx>F8CRB}x+)U3~gGl^ka|KbqhBjy`EYV>sm zyS2`ZNl(~04IO+OMvdIyl#~=64u6_5R#fV~Ol(mG`RQE5qQhD{PIA+DkyvE+OnJcY z0Z%bI+oISLHsLEHOD^$8M+DpsgTNEr7&^4k+T54Yf`)zP{!Ix23r4^eZ+jEUC(WDd zMsUzacl3y73z}6d-j+OFOZrMweLE|_NO@r6F>4n8V4xfSshz%U6a}_AQ&<@hRZKvWpWhnYp!YSrhU-*<7;4XX zF(Fi9!!Yp({wh1B_Nmd^+br=&j|Bh`%Orem?@9D4p2Dj#Kmw+wlpt8m`u8iHyMJT#aDY(X`lFOrQWp1Xpyw*M#a{KWQY|0Cz0MDjb zL>PN#&!)`JXm*oHx?pU|YU47tRo{yAxNx)Z%DL(#AqZ0z5r{Ve@#}tX9@FmS`hDNA zW5_sC1FC|cqm$4yK*xMV^~54=L$EeV6alA=t4ezy~ z{g04KqMqjuw%q;vT7Ufbp<{2)B8-u)G4>7z1c3)2baB9VSNF=aKSW;M%yX;%h;_8C z;F($6IIobZv~0ZjwsBO|=u86+F*drtOi-*0y!=tBe8&0&(y(feja^~zscfjSpkY4{ zPhU{?(7vhNW=n&+r!>mZm4aFE16xoD>uzwMfBBnmJm`@E;+})?{&bJ{3G1IXqktB0 z8hYKkbs9q5B5Q2+Z;5GMe8i?Wjv%r3Bw&?s+B@p2RZf+rXbWA$_h+3J@f5vkH3pBY ze2JPr9ZX!r7s*lA&?rnBHy?|2f9u*GPa7TPkl&3Bh9Xc<|M~b$sDc<3T9S$)C4l~Z zFCZ6%^3Qw!H2Vw$4&G9nq5q%10M)^ULR-oOuw(xpSxk}?DkmrRvADQ*veM{~1p{5? zKh1<9;IrsW?z@&(S67<4y05TtfK1p-FI*xcBYBFwtyX(u>P)&Z=;4LqCJ+BtbKhVA zkBp3pDsO56au>Dl@q!5XvG z5B?ph6{4-=0O$jZi~{J~)sq&HHg)q62s}O(gblt%Blg7~lvRN|`t{GqAf_Na)X+eH zc9iSi*w{E(?`UM(VE=x7eVyCK=tsr!QYlb>a?o|Nik_bB+qZA)T-N3E>K(FhaIS+2 zL*hrtKX-8aBP6mcP+J5f3{4neKbkAXW88tl`&4%sQLkbuhJxH99$f^7faj^bW~wdf z+_u%k#b4hsJ5By=rVRts2cc4lqyR~TJ@~v|H#-~>#PvLv4|wwz5H=PzgoK3TpbL4& zJ{C3lOtwTIiA7-||77L71~!V+F0^c~wBI+(D-sLp6`(QyM5KMuSG(&pQ(Ssgu^9(zIwh z!dnw1$`{zK8$e-Jr2qZx)H$8CEFEf|fty|Q-(g2Q0)4^=&d8w1V^Z=@1F#K3JVxUPl&%t)^|Ds~tb|;7C^{t2B@v{t*58E{Cjuxl)zSu0ImB>(MfAiau zcP2g{9^4c6S2X_l@O+dTkei7;lr7wBhHCOHjpKkP1PqRQm6QL!6kI$|NJU%Q8ep{T zYa?LXuZSh06P>OI{`S;AAB*5XTItixkwf7BBEEdWkhUKp>r(%%I{XEEOH8}USga4N z3y4}zFMJ37_P^`#3wXt7jg>Mz{FjDpGRc3Rj7$SVARL|5djD&!@+F4De`(t$lmEZ3 zSQEJDI|>S}`3p%gjsNeo`u}g~|7}U0J%es7v^M{knktbod4m2Qn`8-zf|~d6Ef-*n z2m)F3<{9sPpDJgH_%+#2SLKaSGbm@<(aXfT?OJ|IGr=KawL23Lb&ExqnB*yD3H$(T zr#*n1SOuWoid`Rk`*(!^R^<`&YF0QdjmTUmF1aaSPSlxx!Oj%+d7b&;2*Aoz19|5r z>?=pITn3pGE0jdfMkQW<@g#9ypVqv$Uh(Py6_L6u2R*441KA#yX)QkA6iC=H+VeNKMQCA46=LHvT2*G5~S*=nm{UGxERvoaH{L zqp7DyX_$4wjY|7iUbo^q+eMX0w;cfZt_KSI_(S@xea09f{vXvht_ZgUi7&SK87Lz+ z;2K(5%_dU1C0>vW`6}biK+WCIfKg@w%70gOpyHma@!Y5;02{0dNMg4DtXX@23#pFA z|M!?f(>B9wgLA>n-N{$Bdfm6+V9ki>|GWl@=x{}T#Ddh%zs}48fKvw*5)^S2v&n5I zgHIizn|h0B0Kl7~gHDEiy)zg*AL}}6U;mkG#yE<&Y&mexx$k=y%zH8O$bNSjr8!#u!=HydZ?Omoy7-$}phwlK)r=I{TJ?z46 za?Wd~rGCbe(kebD$B~gj`4ZTT_p|$~1S%l(1Ug3UleveU4u{a`p z`L6Y9BeTM;$^DhH^QWh?K!O-MAb3b=(B-`e089^?O}EOn3BttZ*;lW3eM#>D+)C0k zG;~lFK2N?q>c+3weDp)Voq@Mj)zEs(REN!wcUOu()ycPrZ+rVM@Tqgo-V=wR-K%Ek=}!R25g zg_vcHs0#0=kW!P1Fki(q_D=iPt1-N~@0V3Fl=FHoO~M|gyz+=}-%%VrMFp~Na)0>n zLH;AYVKgQ0Fghdm8TTixR#s)v+uChf=Q7fLWr@!Vo~wA5z7dQ$zMRLo4H~l_$d-Ye z$u$7-yvTbtUjQE+Wj;%85}UDkuUfuf^>I$gj;04-3Q^j(Tw#WUG#@m5z1q4AL;sH= z?3YAF<3lJI@*6S5x(~Z>*lOcMuKRzi2cV+a0S2Q(e>6pR#>bC(rabkM1kmqCnrt0n zm=BZrqC?wTfJ~hgVilJj^X^)I&2P0z=?aIDrdfyP#(i~k@VRsg&`k%}?G*>Ms*at2 z64?laYe!=^zf%_tmK|`UQ>Y;#JDUW-U_bcMq#MCDv1;VJymy7-$ zn`Q8_g-k$IO=VSv$}(vKsR2bIXbmauiWZY{{O|Z1fBpVv`v52c^I$|TW^e+%Ow-eY zCeHHE5210veapK$4HT=dxONBnC|D=v2&E9C`j`ftQ=>F7Ls}ytZzf+J9C2EHgEa$* zk`xv{Tl=sKpo)={8pcPlHubkwnuumNa+vi-_f*le<}KwdKYx{G`@406bW6;1U<3n# z3HDRc+<7<})Yqjo^rPSi$VieAdSX4+Xx+Z(dm3Z#dd9-xSAtK$a@3$FK%)IQCPTAt zXnPAF^&A)d@BOMG^k~+-Y8m0BPyuCO8=bc0CKdd+P9KXv#uebc{ zOQ?f$2`bzNP)&erjBc~w7%hW=d*Iqg<{9o*O_O-#GNK7oA*FQ{M62l_)t$N)aCEhq z(~RNYF!s@Yov9f}6)E(qboaB$mTWfkBc2;81x3-xD=z?mlhu5aw=DmCb8I2t2++Ds zdCCKu`18@ZF6S$TSOHSqrr?Y=x5HwU3#v zBhfIMu*!B!M%fcJ&z9X7Jk6+lYtUEu)2ocx2<|hTJJ66~)Rq)C-S}b={AF zY0{iSi!kjQ@IOB88Knqp#I*B zxuI07661Z!8g(#`t6+dzll!-fM4{W4_M#%d2eQwWR_pVHM5|#_9GruN2}Z{p@*54_ z-XJ~K+}df+mMm|Uc#K(fw8<55T|1%V`hj?k%ZgSzUnK4V48~&{_u`#OD&Tw-o*^Cs zN+BK68qNCjf9mn+fZRMdFq7IJ`s{tG80Kn`irEG9n4xWH9H}ruQ5f&#%a@8g`?3fX zSyg&%qSv3Tf44a>{`{GbQV_a*(0q8nqxb;wDxQplq*2fLRfCFNHl&;%JHzwCI1Lov`Z#|HDHM(ErMOeT;E^2B_JO*GSdga7M2hRqw?2y3FRy-9Z>2*pshk34xu~ET4&41D zBDJL+g+(8h9123&n$Al$=&jRv>@%8MKm3teKKRzK5(VjxaX=@8uL}Jng8p>L-tkhs z-EJh;g+N$tHIJzOHLrd>8=VX|5(SuJ_xIL(hR^@Q9^22tY8%V5yhp$D02NJ;=h-x|*^hFnTIQ&JTWJF?6kJQSWo5{td3&63OE;zyK zHljCDBj{??^x?xoMukATddd4R#pgp@W)fl)g0Jm0mZU9hamK6n*@tlgJEfiuBbfJor$8=ZK`O7cgyTw}z;nCm z0fuFO98Gap1u&C1?5a93j%)1eW*Fw2y77*0&65;KS(~=C?3vcwvU50utu&~Z+Sqz|_?(Jk?*2cWls;o74}LZt@DyiX>RJWy zEjC{Aj8)&a-{hM^b$U^UDPCdy-vl z@Lc8;g>Q~^+7fah6ufBTFlk$12c5S4bN{=V1x+Z z*qxhOv3pS!2#t4&gcymrlAB4t5EP1c_W~#3EF+QEJzH`7(rbC#_sO3>CfL|?_WZXd zqu4@dqtwqj6KD(1PB)d+jvXcmX@%4WsI$Y)2ZGs*?ooa(Hx~>dH?c=$qTch_92lK6 z91AjQyrT_rwHe^E@EA5>AxH4#D%Z&Tu>kp#6B_;+5%qf{K@rrsQoozYV4iZ`2h9KA z`J7hZq0amMd&BNmCVTHH1Iqan;^U>cN9kQ_frsbf) zYZXh;yiu(XI(vs=)1F^o1e)c7=+(B$tD9q(#COQ|<>tGV(6c}NE1|lho0iDOW79%^ zJsX%BOId0VF!fwj``~!>C|$&L2=Y)`|Ezg^n5;N-#zD~mMB}yhAi+>BSHy!U4N3lb z8i~}6+s*^Om}@Qw0hdSo8h^I%`_&HwBz=o<;{orm&0Q?cIuZuF#707v%36V0v~XkN zw?PxP@KPqv^v)}wYut)m)^U$hHkvHAFw!r;k7L+KrE~l5t~)O|?}Iit9tF{b7{pVo z=#dOZ&wDppUMn-QTt3@x z2_g~T8q>jhEmkPxehEpb%aGrPD+t^e>N;;J*d}7S`jB#vI_!KM1T;1OscABVJVhv6g0sUavw7&IAQ$<>clH#90L8=+(Ktt%vyl~5|&`52D zgl?&ReT4r2=k18BG~s-4#HVg5CRET7Y-s-`YI-8b_2j>P7fUbFfFbQN@Wy z_u08MpH1}UlOtFLX>q|uZ8l&2y{J8MFlA5(QM?QL{usM%ZW_F z7PtVkp7km_1XB^cDFW||9i@54gwjJT-c4H{fX0tf1*wZ_egy8PULm(WpJXxMmL6g<(o}!+$y| zEoczVGC)b&zye106dr`G89qp@+!qsF#A-IRt|O%p=ULVLt(lqKYA7VLiaXNF``PTR zfttPm`Yn>yu8c+t(#OR(ID`}SDOOq?Ty|-g3fPU4IQkwS?|OhzI19)_e?VhdfHDqs z;jJD4b$n=t@Xu_-V|<{HLm~q7*DnShHvv=7bw3tTP#OHw^6#~wBw@)<=zm;%NGr0v0|pIJ60LgQm!$G>#kHT-qrTvgL~6Ix&=^C&c9pVP$FR}CIU3A`o=R#w|%6h`zYlIOMW4a>zql^5h|}= z@7h|1=n^u{O{y`2aLl|^_SBJ!L7;;V_U`mJi1&M*|MO9eU?ks|-jOrcQMH0WBO=;P zgq*~)Cqaj%v#Q|infYq`QcL35&3es$wh|b_OUeKYOY$1TLgO-tT0h3oa$w{v71t1x z4>~DDUJRh@Q@!V`3Yi}JSb@sx|KU{4Gn9<$vrx#{DJLMc3KzNu& zv)?&CGyErs~W>_w)Ul;@^QSUkSoU9JIW1{qHpj zp7Rhi60`iN{Fv_FZ~t$Y|IOwvA`9XF<+Yiw3~>R?T*||}Y-#=qQWO@--t8ukmnccg zT@-^;@}J|>3kH9+P^JvLUlUX02}mn$+Q32po3t8-UJ;u6n>{yzc%P4 z25ETLtf%k4p2Trq32e}NS$!@4?jM-%05<5Q;5%9We$HVtut68+YF7XKc4-i(3mkIi zB>(*!V@e!(zAab(@3;Rq%>QPSvSW<$|F2)0vK6aYKDBlTwM*x>=5-Eu%~hv}l>77T z+t1W~@8XNP&HyO?b+<$JX$F)Im?*sD`UozUfRr+F=S}}bBP6jL4x=~>s{(`9*3XYB zgvvqb)xT3DmUsZ#{?taqG=ZK+t-mf_paQMYK&gvo`i1?;+U8jBg@7!_WD9gr5l|j+ zj;frz#uP)jmO?;&V$njmyHQ$~#!~t{Pf_Z9zLxJAxS`K=k)7##j zllGe+=3`dR{LVizQmG25fGIt=1}lu?XOa~8rlw+rS@osmDw`lKA1)6kxjYA-;)&l| z>u3dceIb|@U$@eSz@cbx-IKnx0)B*G)#*4fx*Ao-7p~BY3V+^Wqw@3f00M&oCDUlo zOGf--_aU!G;qv8>0;jb*e|Bs=olb>@fa$%82jE2uxU=$?H}3C%3ZyXUOx7!@Jk1y( z_7=@o;%P*;WHrfba1_i4qWdGH;dFQKFU!wdB~+66yoh;wpQNUo4tCCrcvZY?iRN)c zSZ+-KC-N4-E8|upcks|S`SZ;jnL3NV+O%YW$dI2}__5Ug#sZUf$xN z3g}fDGUen+sHFM~N)|rB>~BE3a9&F7#g?ttt2XkX5z;@b%UqC5;^ln(@qX_1^B=Q2 zpZau8eGYUnnK!f_klCns>oxy+`d6bLkkJJ(RMt8JSdaP2$6$A7y%Z($*$uaDbd$F4l7Y@*TYaL1p|`ofN6gWC~KUUGP`r*>-B zyu*+DWw9hLx0G^GX8#EIHe1@ePSpz1Ue$ip6T9K749>UL?41pnvodNA8@G~qA4b34 z*e-CX>j7n=fk^qC<2)BsE%S14WZtPnr#;s?0E!jSPlEPhjB#|XYZM$%H;P}RYS36V zn$qpurSa!?S-HbH;l)c>u;u(gt;8@zcfU#EmaQoHAPJ!;%J*E3G>7HY3JFvN4R@~| z!&ACi>9eC-nbF@6+oorZp4%$X`T3x7+(9@h{I&d3X0Ng*Hpu-{LxYUUtu0XbWa`s7 z2yMt%TdBv``aYX=6__QVdl5-jx_U+BTAol2{}#=y%ABPd$xm4mdsr@H;C&{AdVlXM zP=`eaU5ev`ezZCvcxXn0-*H^wSAfJoBsjNTJMDAKZ25tEAnM|q`;HyHv7BHLu``6L$6DX?zWDY?2AFs^?d8WxeVQBk z^b$-ZLt6)6XVY~NHc(kzh{h^GN*w@m4ke9C*awDpiOPst(L5h;Wp-(0Q6WJj1@&OV z72%tYym6sAozRQ&@WB>=HyVcM#K4Ac_Y|VjEVR}5o*{}s5o{W2=HDe#(sqog8-*IO zOh;u?UTjLL1LR#I#Wr3mmilH6D=R46d7uI~FQu)jsc2UODgm(g07_O)hyZ{dNd>OL zc@07%?3TB(5J;)L;9J*%jmOX98Bmh|K;4%{)*T7Hn+a8yC_d>2ia8AGb>eVJajTQw zCA#IrsD<+A`8DC;5b#n3<=H&-3SHct$*t_Ug^7g-#Ox5K5^v*sO`IgJt zlwIRc7lgm~irJs(41s`b+Uga((2|aGovQq7auz@&MN)YlG`;TG^2XlBk`M8^~;FSyA5NsBSHZ^$Ib*=3V|}Q zOIw{COQEEH!}UrTxQ5Jh5$CQ*(!{4%tmY&3susLOpfL9x5#7AWz)225KBs1HTZV1A zO;NB+D^x^Y0teITs&0qOFK@2ryil)WBwTs2H#2b#VyUDQev?J!6g1WnJ zA4#f0%z@+OJGA4db+R73?^vIYsKA{!@#mVlX@cM{L+!s{~E>J=zemWqg4Kmm+sN8J{o8%sNKZEUVgPwzM z9ap(tjb|_uY`42)&aqU_9NiZ|)I1jrkm+jSeox-o;F2!Xeyn#VQ@P8K?q3ZT6k``8 zt*D~x^5W5zX+)%J0H5y7lSB#hk{(gtPevmkvZu`(mON~ZRSJ3W(ej|Y7D7nnBiU*$ zBI*%CGVJA1r{+8S$8jC)8T;P^D{^4a-V@XTMX0cjmb2d z@Nn-q4xvijy@&?Q#W5mVRd}Qw#8*_E|BdXXNbV8Yz(F->hho@C3YDU@emnOGBJk2S zZ-O}7R&MAVyhp8LHaRuI>1j%skx@UH1m zRTPNUK>-y0D>)?i9!}mkS0TV31pf|M4OYl{aW$k+o%bgoQu}D(YS|96+g!kt5FYD22L-~DmqzeYylyBv3y3@ z$V~~9Z)0&eZAa)|+)TqPltmp!HZkY60h6RtiCce0@+dPZvD;s?*3xI#-CJ3dQbn^fmy?P9ojQbPf-k6q%3wqSqLJPN*_1zOdJRo)dD#33Ck#=6 zNR{5PvDWUs&kXEr2#F^mKR`#~V~-YioWw6EJo|LR<1SB+WF-@|C=Gk-HTQSM@RAdv zAFuPKay`mxd4SqmbjWz(k-p$jC&cuy8W))ZBbrxKU_9QO4L|a$81aV)kUOkxPLUta(d6I@)3sdkxK!bDJJ6& z=c|2%>F1QPB3N|?))vukCS2;f)$n9Jda2$P|(HkRt49(G$TluB|GL^^T1U6Poovy2kWbi0n z#-ybr!vKS{)Pc5|seIrX=AMjq));CiHizn#44*-Md-6on@mGDA?i!VS2--Xi#?>Zd|WwYZ&&n1q+2zlz{>jo z{0@3x#fj;pHM#c+U<8YBDr+upftZE$_EDl#;K&*ZgZG_{!`GA}#h6lCAoi8Zn6 zFC+Cu*+?tiEtT_E>uK(mVkWU}F;r8L1&&Hl&6{;chWp6tGj^CBYq}s+qZETa$E=_D zQQmmC2vqlTXq=NcF}_ly%{=@At@l>$qW-$Or<~H+o0>;^anu@;TFDhtC%ix`ZWlB!Xl?e$`i|U*TgG( zJU@%W=}Uv1AECb+7t@@4AF|GMzN=52vApB*Gi?UN=IIMWhFp3qvTk%JYH;Ld?78Sw zMCA}1%^=WvdFah7C2ziR4#WHf+-qin533)7uP_v(Y zf>H=yYvdNdJ|~i2uuqyz&b62{)nWlv<_8`^aAPoOnVcgRJIIB)C`aa`8Is<&Q}q)S zT-s_>{FD`Cn>YAJv{`PoX;xq0V}rXKzCoPN8)YS8jDezqA)WU+W?FL$dc66^<3npn zfv(G6)6H@iiRR@Mn9f?_%CG9Lvow2?c2k`sG4n&hDc7eWK{74443boKP&YHGSd!jR zUHhe|G|Z2@k6g8dXe{G`1%QX8H@9?2N&LrpsebgwOIe9)dlPc(i#I zV1!O1Rv(D8YnqUjl-2qY&u2Cj@pu=y$aw@3m67BjfotU$>g=X5)IzfdA0Lnw*3D7n z>7%zUG_WxA4fN&BWBb1O`hHaKZ-i+b>d(w!ND_lzjXcI6=VI*6~pt-mjY;YuRMABRj*>-T)zoCy{b=ANx zeguW{kolRXe^yb(=NoE{~i=ghVS7soW@>l8miD*-A zbm^uW;V6Hyb7&4I2jEn4Z1iHiXxqA&gF%^HWI~_&FVK{5n9~;Iu``Aur3UAD^m5CZ zzUqF_M3i+2$X&e*(6xs{Hn&dyhT#Z|9L_xAwR#tDs6^tZ>uH>2bIfv~s4V>X{i?Eu ze?6Wu;yVCVR1*92vj|3cILVeW`S6xN-k-9jM5T^*nUydt|J(d#DB8T`vo5 z0XiIkWVN}B%CU=&+WEmPj+NnHyDuWdCs}xZHP!`aOjrT$>`Ev_P;*tQ;eErW*c$LT zF@P|oZF=;Tcvb69z#(l(3IA5)->Wvyj9`85*<^WDgc2)Q7*MRHpvLd=F?gOO@8`06 zD*#y*J+d1C0e1>;2iZWP?tove>VO#T0HWG3D(`5+R=2x0XT#pCLM)}o;sV(5%$#OQ zR^7LFzXIMb(g7q+Q-B!8SkbU^k@q%#b+D<*hrlUNcw)`l9iMLjv~b?=ouNF|SJgK6 zvh_F|b+{jbZwV^Y0=)oSidzFLVWuqa>XXa&LuSUxV&?h0O4;85CDLVukPcD zKMc7G&NckTVDr(F6gwlA_m`YfQdO zp~Du$(fL4T+Q|O=zmEi}a_U|7|G>7~;G|XT~C^j2MUTs$h zR|IN50kh=&iDAHZWT4c_@BlqFIrr3%*WY2S>zHr-8rdHJPaR9nOh{)60wIl+1e5oR z+`JMxuR+~mqwG?7v_T#Kuv34*tJO|t=EDA9UU`^abCkvD)NwBbc-%|31fN@WSOy@? zI-TLyuwB>@Xj#0lo>SJ}H)43UR(RU~>ZvvKh z&IpbhSS5AUgRM=Z018&7Q+B}si*VC^5S||Ytqj2O0wD_pxI4FIPRU7Kmg&lS;7G^G zEoP;xd;1ixTg1bqWAScN%5P6wxAP`r$E$A_XJ?zJJz!!Q+tF}T zz8dx`)xHm*-tl->AYa`n>cevzH+j2p?}Dex1G%;fLAzkNGkZG^c#vF7&zA|Hp+HY~ zBHJLJgCzJSafQJ|GUx!-@p^pA{yU@yjUi^41l+66uMu{6+(YmWtyPmsr z^gA*a@s#geqFYV87g~G0D|n@0*Z1*>&Wg9kU^%yh-$xyj9+7o80HxY1wQ*}h}H0o$+&z$93(bG|J&z5I)3zY?}`Rm(6e*Z=xdrWUq#6q`7djP6G1IegO} z;lL#!rn6t08ptjJT7%yBw$xR*94^5X3YuTy_w2y}DmP+(dldkDav(%R$SmVwo6Y_u zQIihpzMoZH+u}w%6=xGHU8^`=pf3!`lw@=8+)_N(?afqG*v)#Em9c_3V#scg!O{=m zFAywoJpe5Cj$XA{t#&SJB8B^2$x7VV%F<-#x_vIlZtHDD_)S*9mCgG_$&5_$k1b1= zD2(y57VOqk1&#Pk!A^K5OqegHCQ3l1(eU@Ojh3Yg8R zEM{t+eJUUEVte~P8dHXPK3(`#S|-4EZMmsuh!<4`gx$JtKY79GCRW4ybo`PD(CnX{ zQqAn@s*6Lz*w;G6Qrc300OG4^@v7R2Vi4~mN5D(o(sG-mu+3Q})7h*TNi}l4WTRMm zw{{&6z*TE&3>EThTRTSDRRaLQx^3?Yz=10PV&2{-&Ds0F3DjN_>j<)1=fbH2v_BdYLn}8M`yW2dZ*aZ5%kl*DH;? zAL>>UR_dnKOyz*uW6v%lve!(%t3#!5i=CginhK}eYaN*tP*1kD&^q?juxWl&U#gu; zR>KgjG5gJy$q5Ap{ z_4exkwL)065k$Xx^Ye z?sM@2=G(W=UVN~1r8dXb>so(7KuNDSmObN8Q&H4HevNpFcj1xM7>#++AZaOqNpsg) z2CQ5qnnLPXz(T%F5EmbRhAkx>3Og2q>di3ctYHVdp1?k4Ro1Eo@oat41c^p<7omY* z8{F!<6K^#`q<4e6@fCE%l9>K*H5FI%MKz$vish>+5M*O#FhvAoE=86iU0voVTQ6qc*q?O78-+-QEgaU1s+mJM_i%w9R%^gnt)B`cg%T z<0boa8Ge48{h*<&Vg0@ML+bE7p|PLm6#0pQ24P!agGWBx+G5$TcP(Sp-0tDJ=Q5Ly zn<6*wc~HlNn5&$yqKjJNRp~hLVwvNL$yN(b1Ke+<&h%G2Txc5_eN}YABt06;$#d z3KNKuZEiRK!e;w#0_SV7N7HxCFLZ`q>myV0{PT&uITg1OeN`?& zCS6d)mC7B3t3#lSx+3pA#R-uv2XE>&x$lRBkKm6=4=2c$Ba$4{wKXNj^_Ok*?*Ki< zbdss2j3Bb+P@BJ~veBpGY6~L^Bx!o@wO+T$lB`ugKuO*NV59b-b~fGkoFddX;34df zRINw3#Y9oZtPeeNz_lM*Q(tTphi4Se#x#PcHZ9jrVM2|pO!O(Q3UZgU=ajd**}mDzcZtlC!4c9lH&SWDUs z=_c!jnvwD1K`a5}tFgl^!=*{cH7E=q-|<20uGey?YhEZz5U5U&r!%p4WO|jy0b2~0 z-SQ}IQ__?#flKIncWZ97Vp6t>`?CEp;E4xXagp5G9W8?kSgCxGBs|?$)y6 zOTRwKttwJ%lyeJhKX3C<0l=t=>Dg|60Q}hEZ%SS;Df~IgkO;rb(Rg|JrLW18Lohtm zDmQ2GHFw^qJ4D>;9`jD7k6y)_38#)~*7O~pEN;i|0aBXq{?2eCISb7@Vi3#~RtvPd z9m$bd+-^6s4&VFZ%(-KHZxKCs=2d}y_Iqtf7UMeCXsuejYKKlj2s5KgndTBYde@|c zX!s=JuIC;MJbiAI>D3CGYTA8FCvx+U1#`i1arNhWO0t_B)-)!r7##~Z|Gs&AkRC|J7D$Rp0yv`2+T;6)RyT822k6SDYa~u>pHl0RcJF%h_DmZinm$gWOD_;Q z>-C2?k`*yubrW&GPE_^TP&R)w`vCMoIRqOQ7@rhpo+`ZpQBeB~Pgw^D`QVH}pYr*m znrWCOG4l>RTlTdZ_?|_?&W(jYRA}a{cIVj`vmqNL=tr35yEr!WY$dPjFX?nbYH>wT z+x-RoRsJ)B$1QWc51SxS{+3Qq)*2?eg0%A3EABwalAv;g>2DjZFC1Edn8+JY=6Hk1MdHsspiHEZ?|(CTD5=LtKid06V0j|*Je+q{uIuTjdug=u2a)SE;w=v{tvuhD%QP-`Q+N9} zaU4&@>J8#Pte*v3ku_6qf!z%^crhHocdPDFJ)@j-%j=}642xH*pUABvbB5;tC9Lpv zrtsNy%zU5MHx-e?l!ma*1@cS}R_V^uQqk#LqoZzmBhFYSJs>jGEZKWQkYC!w_#_h5 zesVlQ`J0SjD@!B>bPDUCa&f(i2O9^cDL8@L&(@Orht49W^e3lMdWt#928axI36 z5XKaYyWy68^)jQ$H!>O85K|VTtg3nRf`avNOP|!kl6-pR=YP@r9vVAKGeI+^-?-G1 z>#(Io6CFtNYXrB2*K2Y!r@NBdLx&SElXV|ChDFa3I;qH^0yhDP0F#M$y5Ul>s9H!> zNxzQX^c)wv8^3nnqf{yduohLv4t49E?|7LW;a5?1D{qtuJCQhuNv~OW9%{%%Bg&Zd z@Mb2lFq5XGh;E73BI)z7)V$$SNN0V(uk2AQPcdlPGup6r3S`D(GVCVF2J!CJJ1%Z` zQM#?F>v8X2$9_2vW>Ba#>liy;0cEsCa_97-g2MvOw+)w!94sp?YPqO&d!U9Qw@!l9 zcly#tvApEt0xr^=MV-m!p1ZZ*!bTy~A}GM}>!9r*o>BaHV%{W>$x)6<+eciGZHFZLo&5cE4zjA}4z(|}NrkvNgQuv045Q%7>l=_~tK-D`d?8Ujo zKkqC?0ALQjB_zJEjhV_#2`wjZyH-#N;_|8U`apPd)lHVfp1CxZHBWK4x{S_@>g+|O zC@ZX5&F00;ut#WyUI8x7vU?ck6I9%*H(+KmA?fOZP(vNEk}knOdo-Q7Z`r-xT~Yph z@UiD28y!Q(@3||&i#kgUtq{x?n*H5vXcW_Ultx3J6=X`}JH9z~PaF>C=|*u$fM%~p z6H9lkk(EtXD6lmeT1r#UEh7S39f8NRu~jk?F!UxTZvKGY^Wva4e#yWtCYKn5tYW2A zU}7jv;`m}D>X^R76)k#9eYlTOJbV*RMR#aMvf_gH&UxiRL>%$H%NLP?Lc|(=YBWh& zBj~Xx9JMzZ9GB@Y5G11*l*V(Q8uP{o>Ff;7>D1x$6CoEk(;hDx+8_b(;ii-UXHvhk z729$`;W-jr;ogPx8mkXyf7XwhLK>&`?nL?KsTp~DNx@O3ilJxtd0tOkJj{shVuZTx zuc0=InlolK>if&Yv2?wHKbEPW3@>Dr5^CCpnvzH*cYIz|dr7VjH{0Ih)V+JYq%r0O z1|v}Up7UC4vy`$smwDeS`C~{irH5`Um4$NO3Kb>AJD3Q$$NWthsNtnA~A)Hu& zK0Z1u+d9+WRxbr3%jbuoO!|%lZuj>GeNG;twFs!$S`AwF4P>3|ST%nizcDU?EwH{Q z39m#WN)#t?;Uc~nU&uo#WvM}LG|rE6-|yDE4M>-DZ}^; zF9VBSL6QW;TpwF&e9%}K?8U?P!vdewhRu<8eM~bU7se{ByajaVe0{m$Yelxe=i(|i zGY!}lq_fNx%z8m6UHl|3@@q1x_#?A%x(w3=6vhtKT{vloW-BwLo#R(H_+iNblL@4E zyK@X`pm;+j`vLgvHDz)$483RuSFW+9JwbZLFyK1TLLTnD!kxztPlWHwQ@-?J=&CVi zc~sR0U)OisVk*0)xj`GEq;$b0BUKXOOo&Mw4H?4WLPo5~9OHz^h-Y|JzoKO#BzhB+ zSZ~S0lYv3Xg0tJa_Hvq`#Zjc^|U^UDcflUingx z|8gE)s25|m+3*!+o4!IRC|${#d9l|UZO}1O*V1Ys%B-q!%biwt071rIyON!Gp8P5_ z?r8AQnkLR1oDG*9RX!IyYe{OUk*L%&e8ckGm1>~l7M@7 zkTA><+}W;8Ke!oNSh|^I!VXhWNykvU$4+y8yg<5CJ8t?O$ISpmalGj3h2mL(emkIA zLtNs`@=}Tmsk#H{6G&4s6Ktjdh#g31jQrrbBV1EF@FG#Jib~_f?r~lSq4#T?SaKX4 zdS!^Fqk8sJ7@9!E--Uns$C-9~U)!(*wU@Xl4~Lz^Vk4ihjc9f|e=6ei_c$8We3tgqUrS34|LWiZ zm`}cvd^CM~Dwxr@*iZ4K(~LBE4;r!YFE`>1UdP^7;(*05*7vrRT}Sng#>ia_sD7&b z-m8j=fx20!(_koNySgeeBP+)aN^)p%&iDiK$@y-z7d0K~aE5I-^M_Jurx*;zft}6R z_0bU#jZ-%-j?mFsQawH^3T4pvkuCqTw4=pmge({#{0ux#^P$&(R@{Ljh`K1rP&WmiGVpr$agRq0{lx*r z3&J;A*m#Nr*fFAy<3mtx*Il(3VqLgJ4nDPmT`CmDJh?ZG7E(_;2mfG-T#dtHVS}v4 z^}IrFKynm_OAwSJ@~>~zva_(ePt+sr`jj}DLs2@pc={ZM6vI7 zcJfW4kzPGcU?S@mXf=5NgNr5xFs#VYDTeu46$(pe-sYV%Txw6~_1Z-5gpp&I3q-4&D5G{;NYw4--=&RrOLId-(fpri*i=o>^*>2^T!jVQ85B`9)S;>H}{3&pZiipRI&E~Vj$jOla}VA*61{FY|#7 zc99;alhwy?ibgR1D|D56rl7+sNh}U-y%R>3e}_QA5KsO6H{ErNostK-@fiZAgTLc< zEz}q9N}o<>qwbjL6qP$<51G>Yc?08&%~o_By>L6pO^5Y(gH+WbL$Y{FPDb;B0^kr% zCY3eaXOFYfd_W%swD2v?O-n0Y(>;>4Y02Dd zFhM!GC5)u6w7?@+i8UpBm_IXSPN)vRwmxn<;^lK zBPHl9W;I|OE+qD=bRMM_3AcL3a#Sc4E)^HGeC?BsF?l4qCK*?0G>!_mt{cIy!MlLt zv!}Kq<9pPfah-Z={6Q6)-!W?z=laZ?Wf}Hg4*D-1oVAo%X=ikWen`;2r(@|4&Xs;X{wj^|Jk>Z(4DBJ3`MscvG>Knhv9cb*Qx%!=9o3XW{vG;QTzrxT{{QD~4+vvS zL_imb{+rKH;25%aZxslkVyoObY@Sc4%kNR_UMSMn)kTX4^=yhy7ytwpl}!5np?YaS zZvoTCO5pC=-dLpu1i(WZIesz9gfT{9U+5fq3dl__ZFQY#;NS+nRj2`d&h}fs?A<6j zaLT34AKdezDK1wYPc3zB`U1qCh38zL)fNzr@&^H#l0U$bz75^%w)rz6q5@&2itSu3 zKyH>W<7D-KB2Zr4+vtm>_?wL}SpdgZimz7!>t>B4w6fV84R_+F{y;cj7Z4YouSb<5f{s^$#X$6LHcMhI^kC265oM^N8lS9i0 zgZ~j3>gDZmNXow%*H@By&$S^)|!fEYfJA|&`rZ=N|Q z1CKGa{`L$Bv>p__Iv{y4K`Klyd;lYw+F7dj<%*VH-7N{k#_E(hoeMCnOH|pv(y)=U z3RouJc^z+B0N;yen{qFH#q-A|NLe_*j3S6xzRw>>$+p~JXwIRSUI`N9311?$aDX5k zBU@2_G!$UXS{-cBDgYBY$EC?6SBcpI=&4XLkfaw_mfF(MwxoI{X!G0!^$uPF#f+{T zP3go_q}n;rO<@56`94dFNUQ*dWajxB{(!mxI=O1U=v#dldJR(0RpvhWi^!LM4q`{} zUu)-y1s-n^*Ggd~xt_(DEyl8CT&x<)l^EMWK!f3|1@!(^3Mc5=4E+WTZHx0@#mW;< zRr_TIK;a*a13H5XkTEd{hprxXS;Fb%1oWy=w}$~AIB)?u1z|ieS`4jcG@YS11yW4? z7~7;90Ig>+oxzb^D7*Czee%54yt&$J`dW=4nmf>VQMLRhK=Hq)yIf2Bq@58sc(V1h zwb>z!qx$Ug%7@*=2$+snI>j~*W`N8->xJ=*&NJde%P={hLy=PYzE(GZ8lWNWRmed+<66J|y%})-1>a7h` zYB+o3&he&(!tV5fiXd~@*^P`#us7yN3ITyZ&az?lmOaI{x=`^W>}?#o*tA(U+c!W% zT2%8+GgD@u2>c5PF950NgiBL*8-F6Qv>EpkOlKqJSEK?i_}rdU^9G__%GLE*>^3V@y;;-&*ggOMcm;PDgfq zr^TiA1@%=iBVzlt6M5~q^h968{>BtA;Yx5)OeCb?z}zN#iQQ*gQLL-trBD^{0+1B%M77m92m+aLAo@f3qTDGxPJ0h958M z@Y@uMnbYpra0_5A9hw8`ay+LCz9>8GhWkqz5#w$C)j<;l7QA5HC>;7pudt>mtLfr? zI#{F)i1(eRCCSRyqW9{q-*6}NM)%4@2)03U=tQi=eQij=>Wup?3pH*-z|BM0uO+aj z6oc981~9t|K)n;MF zy32c$jR$LL_Q`0QTwvihS`qTGqIT?}R^j>0w`bTWVqz{4)zvy7va)W>Qn4M)JI7?c zdFl2!q@p7rCQY!Z9>%-(K>EC}i z7C(AOpgnzwr*X@m)XQ(UY~~7xxA)%zlX_L<&p@Pi$S($nxoa(aZbKm|O(0SU`^8bX zU2Ai5bFC(Q@A75K>s;%3x0~Il+^soa#O>9n3qNSMRjQDT3q;Iy?ac=k?OEXi20Sdk z%+>(aar)S^f@iqZF1Nh^J&IZU6krT=I!b<0jrbhFRsAN~6`B`P{c8QA zlep%gNa<_BIl`N$-!?9Ei5LwCp?Z278${JHL+1C>%q>V!RbB5CD{^CfKLh+2SOKU(Hoi9Tg+BtD5jeos_F48LvaB*Nu@@w)W~0Dqn!FV!Ij!C4X-rXLgS>$WXvTN|@0OqMn%oSq1kajEDS`9-<#{ zue;0rSp_U!}}A@=Jkw{S+HmT;O8*a)4zb80n&+FjmNRDsII)+Ji{aA$1Kh044! zGgXyLHH@5-!6hhwTX13Uzyj9ZVNoPK^f_WXQiVT|5o44cZDcG^!zLw6Fu*b4+!0&qI zF@k<~w4Bog<0^pF#FEIVSR3s;|BR_j_n#uyB4~PaT?Lm)r^Mi znncxGEtkO_echnB$Pnirs13dQHY&wu8KHbPvaV-sFF75AoPH}EI=%V8-&n5nxLvXk zk4@S!U$BiARi|0`C3gD>iHvy9F9zy5~WNou`-`s{>ntS z31H*SAZCQVLs)CRO)7~({cngMw(2|AjLu~axW5yAPeZu=&IqUpCwEFOoR_E04Xyu_ z&LfhlGNPs|0X5^`91)da6bYMHJ|+vlAHcyny5Wy+In?l}@3Oj?zB`;dDQU3FRCl18 znk`R^>!H2153TM+OJ;Ar+_yW@4%|Ohqa?WE^)&^pJ%Qx;oVvt$T1bJGjBn$7WH*2M z(V=7t^{0Mn$Tc4*-X~wDl-d<$r>8{s0HWsTPKdM zZ1h<5ggY%{r~nvB30FJ)s6TNYH^XtOy{D%fCSKk*4^wz&eRr`fmlN&h+VV&y-RXVDzmg z1sg$DRCHUgD%GO&scEv7?n7&?x+n&Z5t(aL~%GO#Om=&2~vRTF2hE1vDW;jS=fksLV9>a|`Q|-Mw=Nw*1jnTvxS02MXC%&H@$y zRL1QOWN9JNurL=F-?7}Zu)U!g_zg@G(w!&Ia47my>$F2lMn=qZjD@0a86&if`h9|n z$A&j;i@)W!`uXSSg!ZH3`2acu87`Thw{MTawAAkSe&sNHjNO6O-h>v z8V4Sh!+)Mze6Fh+F8!;vO=Apxz$QL*f#79wE8YSMiLXi>4H9LD8}P&GbGD{fE0*yK zNE1?#HOjc}qwXnF!=-t)KI3O~3#pB|ufeOkeT~FLnJeS(b80|cvc5^M)MD~Wf%5rt zvz)=5LnmJxaw!Siy%QDs;+-)P?i)2_qMPYv`QsLx-m}kz>loWHF>q?^QmBCh`PY2+ z9+f{oyuYOya}4G=VD$(hVrDjIS7}4AJqR^siUzy9QcO2=B%CDQI+(_}F|WMy!kU1Y z*DWzp8yS;-QD#@qs`Mzs zbz;$t%eTW$0tvh2$30Wsv7_2A?5& zVygOKRo0)LAnRl0pQ9GmLMpFvJ^)|UgZl+%)gz826}aMGC!eKM{~7T6VaWKPQ5S4p z>Ziv|8P8qMyUKzth%PzG8y+`l+@wWxNPWw;w&|ztvrTMD!uduy41(u$iX2NHnR>~M zBy)AhF3~G;qg$mNwhm_zGe1B2{>wGG%6#bn!+=l zqSyI9?Vb5I)O#4mHO9uYms4^-6P@%I+;h+A=kNKP@AvbZ=X{>$`M#d#{rTin z+gGIM1=ag{VO2RPJx7I}sQzN*NJ*tS~2?WI*NGPaQ^K@hE8NqOgF}*nL4Bcnz z`CkhC9qjB=_ZG#_?!2Qg zz58XSR!ddTPfA-@U;w^9>x@Uo4lbRICQt(}9cAQ1;YM(maaWhp*BZN-=bJiegzzlK zU-cH$5}F)yX{vBLW!}7lZ&p*Vhoud1wsV3F|D0oh${yYSEbuZ2b1pn77&0*{OzfZ+ zIxX`W$y5nx)Kh@4U3NM_DF0FEC|M1!iL^Bz+v4;%U{}NZ1*k_u`Oo9;VNe4{>dg@) z;Fw~ZX7pr1zM(Z3#y9I0tY%YkyUnbeSmz8E_CCBS*PHbF^*CcyS!fUYm%) zrFwAN8g_|?-(sox;qF27;AkuDs)+jE)9^4@7POtItFQH2Z%UTfz2vKl5(ae0HQ7kG zS@+^8ukKsMa6OVT(sqi0SvdqktBTNyeO4=67Ff&b4mW6-dkv-gv;$oHkkYfJn<_?_ zZ<0L_)&TC{>>?%qKw@J6Px4=e~f>8_U#|gIcTx&?lu|2a4Np2zK zkDVV7e1tNyt01niL69vs>HP#*VpIPF#^Iy!BDz(kaSIK zT~08App+u*B1vTmMg1w}6o?>JFHRCW5ait3TI5Kzimh4;1;ozDCUtlUp2|zzTy7D} zS%l!da4%4s6(j!P5nzF}P{5jy8}EamRWgx!Y>StlqaR6`VxFHG*waqlxe8 zaf&_(8|@O!D_-t$F=Yy4DMSyict!|KH%cE#ILmM!8!p=m12x*Zb$l!xx{4)Cm#f_R2qxk3@s!wAF^+K_zj~%Y4HSnJ3$-V@( zUA)0*;X^_|;uoK;$bMPP%P#{-FrwF`7aR)}=W<<7nY1(5C8I(WgETF-jOIp3=A+tr z39QNte3E{u^CrLik*5cG5bV$1dU3;J)`xh0dk8ss#Bwox*p_oMgwsQ>G!BrAA@~LS zBED$mjAmTNu*~KD^2j<`qn+GW9<+x{s!XJ3>n$)o6EyL;2CWZc8|2<`4H8sh77Nh> zDxs5YUD}i_W{K9CnOa#Wq-o&F2C0wPL{xn<$uk;iM!$E1<({deubg(MX&kg3jOUw# zfnCg*=Qv|i1!;bx2JrFWP+!74#*onu)&vy-1Z)x(YM67(_v=U+^@o~0_!o2|4uIsG zb8Wt&=ctD^Au0)^JiCnRYxdLfalpviyI=dye$R!40FhZ_Jzn+GatE-<@rr%N zX20jxXa2J0v@`y{eG@bQ;cU2m7W#FweV$K&03brIy36_RI5Pvxa84;Ff2ttx_{ZJA QHAPAuu1uFgXV&3=0Shf$9{>OV literal 0 HcmV?d00001 diff --git a/frontend/dev/19-02-2026/Bildschirmfoto 2026-02-24 um 16.11.58.png b/frontend/dev/19-02-2026/Bildschirmfoto 2026-02-24 um 16.11.58.png new file mode 100644 index 0000000000000000000000000000000000000000..0534e0b97437d6b08e2752f38bfd29c4e929eb45 GIT binary patch literal 119886 zcmeFZWmFu?8a9dy?t?>ccXyW{K@$=rxI=JvcMA|aI0=^EPH+$If#B}$&TaNSd!KN= zKlk5Vcdc*M4Bb=R)m8P@>+ds!DJx2&AQB)#KtQ0#%1FL}fPe-=K!60{VSyIdt^#NX z2*f&b2?=Fc2?^ZL(}CNzqqZ3NeZhbYxW!h+}P1 zGEgA#P&&@?$~u3B@KE?fY;Ek6u-FD#5NZ$8D9UVL25K>}#-lq95^{}zt z!P{Y>{?X$g-NkeW+ShUbBO<7b9%7q3g;KCJgqRRlsiz4Fos=}1&UVQ**T6(w9bVM3 z?{Qw(ne2Dyd^PdZ&E@6exDHv>qct6BjkK_RQZP?z9Gn=)}}UKXS9 zIM74*3%^JrzAn!~-A*hy_IB)DYFYIGx(%5;iDFfFT$4i-ZccFh+KL<&9P$Fhc zDCl%K%9c+Hh9sD9DdGsF4)Y*bx1)pB_l@|dGAykH7Ic?*P|nJ0Sz3e-FyGMM1%DHt z%=!GT7RL|_{{qeCYhBrzxvJboust?>^ zGznD!SRURwP#G#ZMuL`lkAf4^8si53izHVL{%8Q6tUOf-bt0xkSW=i$=wU*9JaU3o z!Uh9EyeeG+1JS!5-zL7CrF>Pape&a`lC>X`8iO2z8Iu_EU{A4pbwS+|XS^1*_Thx; zgyV$9IJ_c?T{9)W@lE}kda>(|CxqDk;bDj>#^tX{UZwOQBxuqHd;`5xd6!5p?G*GO zcZY8B_FKmXEG~g+osoK9YT(|vQ8n?);yg%c#FA@^Il zUVi(FL7~Z8Zmxv)l0xEE`Kaav7Q7!MEsQMQen^|#%F8y(`p{ornK!iB`O%PGLsVm4ZRS2b3}ZNc?HXi~~T^TY7e(AYw*mxhNe zwNu`${J}tbN{^}Vn4c4)Q@c~*_TFTDAxF{oe8Mb-U-Km%vM$Qed7H&a-_*XjDB6f- z<{TEXjId0Kls<-+h?$NBo!PrHc>NUZAsrF5F6+sf*P9p_VC}Pw(obJjp~%7LpzSS~ zDCjc#slMo1VwYhTbxeWjkI+HcWt1wL+8bJ!Vjj88KQ1+%Wb)a>vQn#(pps_8$bscF zcjMj0C1V*5as+2YI!-Nwn==(Xm5V!y+s1@&_+w_1oAd16VU1#q_^ek=^!~)Y|K6`@uGyx_+N#YNwV6c+ zQh_UhB1bcO*Il#qpDuIjSFK?yoKxoMDiPy6rnshI4#lUw5#@6J{isQ|$n+GE<$iXP z*sD9MKgP}@cTIUrc~WNWYDMOY=f~&J>RZwbxkE%u7t?gmB+x$g5Jy`p{V?_49L|{6 zfz^3YN?*FUAhjTPc)xHjk7PoB%6b|VT^!w+zhD};-u-^)$5O-z$`R9<)uqa1#L4#~ zj}4ox%st&z5v(PwGR7rwQfgLSTZbjD8s^mg5)(9-dJq%Z2NY@;X^wcE#|k zl9AooD(xw)+grJ+S7+^8J6o}Mi^-po52k;Y_Z!-Dn)e{Ad|t6T9zDKY4Z*!)n*Nbx zlRe(l-#qi_AxZgB+Dk%4fPriLc3H?O&2#Aw{hpy{nQ$tVwu9NqO-!H+3ZTg`;W2d zjp;7VZinCIiyIouE|W50L`0@B%ks1Ps=isWINNM2;NIq3R^PW@<+`_AJmlOjqK2Y6 zk|2vrzu$kO?Ip9RY=@#nQHsyocyzQ+(JcM>L$Sr>#OO}=NB=J;UrIkxz1Za^_H0}S ztxE38#>ENj(47aNC`%}IC>y>qbWzb#=_$-oVH!LbJkPgMB;hr*%{wXT{=MSR>2ST- zJ+zrY(oEXS>dJO)VAKC8u_wuZW!@rvamJhP>SU7PL5;bZZFWfayv}{&^K7-s6#f*U z4ez2^-L_-pgId1s?ri!jp>_S-haday4fTeKJ@o=QF3bz(O&;sSw+m52Zs|nYueH$* zSQ;1aeJ_{RC6+sCquEKKgmunAr(cf>cg8DB`G>!GS6&sD%+}vpM%xSzZek3RT-tl+ zJ~H3mTj)L@okUc4-#_dmU9b!zU!l!;S1-L=v^d@!ZSxnIc$hx!z8mZnX?kqr!xEUd zR6TLtn-9Kxe~9L3dpE-Vg8OdI@TO-pwq5CcCaSlIr}ZuPG}ni7m*K$TnkT|$a511o z1YeGX5YvG&Eld?62$`1-!Pf;2g0u%xRLmWI#lM%>qdlwl(H{ZoF^uN+2tk5B>3wHZ zt#lC*#EX}~+w>4`8zJ#*qR5*d_m;BoRPK)?4~4DO*I4p?DHwFvyK;XgxErUwy=j@a zS3<-3=5zW8wV#bY zNXW_pM-@YRV`FOvGaJWg1>P;70l`*A!vO*UhwAAADf@=<2zdUK`CD~Ibp?5TLmMk* zeIpwKV`f(?+o$J12)gnEr&h*}`lPN_mevmZu0rI0-N6r>KQ*(Elm2y!qlFN;x`HyP zgpIv1DK|4KGb_0;A}J}UpuLd^{~JlE|8xhw36YyQI@u7FcP5Sg)eFGaOMuWdRFhdAh>F#>~p{@3Voff={jd%I2=dmKu`gRshX_F@)Jzc{v6D z>hOPD`tOi`bXEUvR~}yOKYRXh<$rs=b1=4-u(1NhbQJ#Ye*LHOpBMkrQIO?n>3@*o zZ#w_g3J_WtQIO@|O%q0>UljTY?Bfe_Nu{^I5#X|?7Zfq@hxYH|(|O4f;vgDuT@*rA zQtYiOl7S+p?nq5T`Sd-uvP9~Ii5YRHLhKdDvYyo@>!HY!^7?>6YQQvbye;c#W zVByGihOP910+H`(O6$Slf820J z<|l^9=*2)uiFH%v{9WcxMpco@S`3uZMF{(_lKtCC#rdU^-ZP2Y0{eY10Iq1$i;w@7 zuaBWcf_WU=Jlh`c*!x}CQKV7XK9It(e_3Td4&?)io;~|bpYu$J&d4Bfku+;85$>!O z8u={e>ewu&%gBm!TNb=MUOb+S(>`A8H$9}Wlf{NZJbtuIW;2vZ=CR2@fbWEcOzu2x z(UExl@aKHVS>J)sVIMY$wn7m>T|1NCJMt7#<<*s&-%5U6r1`QJ$4sfkX>0%Bm1zOz^I zXYw-fFrXH`!t2w`ko}t3p-ze4(91O6m7Z-5x?eY_k2pMmK`j`YK~){jOG7l?hi9nC zJF)~RtipHc$kGsR{G-5uSzj+r=-UX*mbw{+=ZvOI?JIK>6j4@g)3DD?c<@$1@a?SX zP-)7dHYT`Q5_0xf^r**05|mlJ!lPo=h4EY)<0(P-wUV6DTy+Yx=`t-VTijl0Sv>B9 z#}rT@CZCqsE{kJg90ZLBhR)zhcs!?@3Y0vJ?IB3q;QC}8b3@^ZjUNM(2r2A6xqmxb zHh~g|W$XxHQpe2ePc{a$=2*4T#_|Fi#+F-@woFd z0&Sr{;$jxX&mav;YKrG1`a(e79*MJlmCXoUc#F7B|BM!c=(cQrrv7A#=Ns}dx(o|p zi9wPS7;L6PFErD8Hzg+`76*D6K0agaP|;hEmOLv$>SWrlVofzQR!#=$_h9h3B;;-K zbop*c!;A*|*Fv4Ui`TTd|I?8Hgbs&nM?PoY&-8AQBX(mdGTH3C3?~Jms}kriLQf`6 z)$|ohQ1hR19@;tq&Kl1oQ{0^@e^ zGEja#mSX+&;d0)k*5&0-!sWVix@R=Mmxa*xRf7_<8&}}rN^>35c#Db2^+a~D;La2t z8=YzI+xWTV*MX}0WFn)yCcy-jkh}B2Ma+pa9%uq6h?pT?vk;gyjy>h6@cp_5n;{TFR z8sfDthi`(KTPaAcJuyhUc+9o2CJ5B7A422|@31*E=|S<~^{@ZoJryW;gaw9jlflon zxBIoJWoCH=LgN=|yZS!EktXD&|uP=LI*@;$IV?6&KHm zkO^)j^wVy!{9Tc_A#2NTg@6#u!K78kY6-A|bE~SPOeXu=@@Es%TZ3QH5S1xr-lvogAn&en37jh|KV7OV)en@ zRppFPQoF3$9JRBHqI@&ML2!zgj% zcltvw`1w&UiTmS@YkQqf#!*mSEO;E2xu1Vvy5}ExCmn?Qhmyl{f^wzY7)-@2X*}uc z#Q@*#RYngU{1Tv)YTDVp`*XFhDZpwc)l2JE!WR$_GLhPhEZitz>wgsNJzHE12CWC> z^vpouZn-M8WBV|@W~r>A^l z1FGY!GUug_8WMjt=m!LZpA&=&6B8qOZ)J|s*LABu#L=fe<40s+zqc~-soYj+u7Kxz zdefb2*TLMdXHYm*tchz~w;UW3PVc-|Gi$96@LDA=&w}e0rZ5YUv*EAcC$m3o({kTV z?6Id`>asZ)iTLN_q7a_!Aat3ob#T!Drs@nRZ;v+K?nN zY2xTyR3rsOur#}V`dHHOUzTcJ0vFIw@_v7>6BaCy3ac&SdACY}rsQ)ozTfw-tNVy3 zP3&egU1hGKqIUCp*xUK)C`824?(rn4C2&*tvL18H`y?(CS;?(Wg>gtu_h#&9cJZO6 zuo1hk0fg?!;?^q{E-&(UJq%aUkNDiybJMb_ai3Mia}ceAYa3UI4)JO?dqf`W^x(mm z-GnfJbqTyNeQb0)Z3h;7W1D$9*V8BttR?9t-jaQH%zcRBDVR9cYyZcADO(Z>5Ul?FM?hGwx>hJx&MPNe?zd8v=k3&#<$)e9|` zd8cK*VK>FP?Yz`(tI`Vz@f?DLhXtw9cG7c*GaiKm#s4s5aB6EBpF?|X^LerD;_bqe z;u)|faZd6J?z_cI=~s#Z`&h!KDZ_ysXd-iC=^h95+=zJz_4Q0dW&N=pe&)iUyyxRJ8d-49j1%<^gP*OrN{Etu(TEQ1aQ&I3( zQZp0$`nco)bX9<;V6VKB-N&wuW?(!1~K%L7(!GaX!EsIyVHE{uK-3$ zykC-3OJA=WZ+5F-~oMwhhHEwXBlotOVBPlH{1)!nQq&vQucAC=O*ZO=e zA1{PaJ7+KFx^JONI3)6T=Vw4p7OTY^TuX{`;9T1fG;7^37|hP3+dQYG)+iI5&4T8& zB>|1wptF@1qX%X^Z@1B9?_EUmUi8}f5cJUFlQF=M4<<7Wn?UP(PV0vFO)EC;Qelf5| zFG|)Ftv~R2yoF0_X_{&}Fur{_j`m5e$V=Ov7VE}g7Yn1Zy!S3vV7>W)*P+L3oy>;nh%4(_6v7+V za&^C5fUV>!M_v9==YC{VBi~GOKGXQSVfX;@3HLE3P}07ab)w~>y7YHq%for;^7XJ! z^I*Fv-PD(8;h7phelt<;CXwc`z)Bu7w4ahP@6PmOU14b*?UI zTZmBk*3cPdJQhxg33J{t)3gU-7wDYj;HHRXL&ZZgppinT6PzFVJbJj*-U~1JLd)w} z0jh1ITHj4;MdZ9tiAlBLB+#|s=cbj7N2-_oz$GBS%Lq!Y;!EpZ>%Mvdrvn^T?SOBv zsIy?z(%?i~6a&E%h$RlI9}|4y_GV-CqrgySP>V8a)G)X$Nypus_u*<4`VjrUz7U=_ z)Sx?ca2MvX+FNmQ8c2BR20?)GwM-;8BO&c-%_rEmiY&J-Ew|bnYuknSA?}mk-VNEd zoALyLgf4nsILNzh3M^{C!y|k8AaUQO^oZH;2Jg_P>za7o6{`{+@1hbC|a4 zA=;0w0K1OPM(EzH9DP%3>JvVOKzAAZ%%%TuckP!N!H&*Ltb=;O7-F3v%^>c7dN+|T zj4gao9<32uhcf{!sL?p`@kE8Y{hgY&F>&z(lA*v^^glYMRT*rymV!sE6sRkT5SG@N z;c;Ltw1;NS z^}30x3bp%bH17(0YI49&JwjNf?9VY-Jn7j2c+Ge>i`PRg?K~~lgRO|rX&fCMPoBcj z!eukhUhSfHB3jSOk@ygYTycNHQk|xml_jUvR%)L>REd0ai6U#!*6}BAg`@TNLv73b zU?*G#3bGwF6I*1YXo@;w)ZN&~;HlY58QYA|3?O#H(`~^yTGP^)M9S{GBN%$b%)FAk z0;Dh*M|<&KHzPP%lxY~0pH?!&S>Qn4msGMVo-^mL4`(EBsMjjfxz#zclYdkoEku8$ zYUs-HPTB|$t{>@%_v{w;+@j|MS zexEoLMY(tk`M(wW$EDD7 zgnxS~Z+o%5BOky|ljDh%d%t4*d{YPUDvITNxJN63M+S8Nx(1P`eif$e!=CDb7~aBQa4e|fbMhP#GBt~# z(P;{7@PZ!cjnSN1%gv-;LhQF7#UPOXQbMU`uJK@>y!=gx=^18hLLO_Y%Wq>`IW-*c z0GI0qN2WO}tBtOay>nA5Ivq9HEjmr|*Ij~qasS>?IAT}5cZb0wt3{PV71+7Skpt*i z?(Oi|$MN}sU7s?%Z?-R_?1uCIqPnQy3+HKlE+L8dSUv_VIMr-&R*ejcf`5$|>w8ef z-5Sm8T;ExdMp;m;8k$^8OsE?8@>2`RN+ib+D@F6?TEB=x2}jp$cpV7jRr@Vq&+V~< z4nZ5TjfY-`3?v5aHXA&8trd)P*^HFlfL#cgcUf#I%y&yoHCiCqx06?FCncCmC;hACAWkh1{jMDS5Tcb(?_@y?B^O!9tll5V_prfd&tcxIp!qY3{tl z1?5TCTUD@Q`flg89Q@d&mfV+=Ibw$Ga~KhW(`W{C0$eziIn4{&-@ePyJ)J#k0CAV) zj+Un4Va|8U-);dJXbY&5@F zC3$qku%Qo>WElb+vAVA}|Hcp_kbWOBLLHs*K78k6Lo|$8_t%#+&Gd3!YOlpi zCOPh;5guLGkI6ffl!-x;>;J^!cYH42sHi4iL6qym3l|7F^dtQ$4rOQm+c@cW3}a%9 zvD+J+{KSc5JZ=(Q=?3SP1GUt9nHO$rvD_HJh;3Ic z$QM!$aOfnB^H(DhXw~kWwmE1%R~@T~(E9-Mj-ee|lOB1)ZeW#xESg&9;HjlKq%va= z5xg_;)p89!!Z~26!|dclFdI0`>eB~;g7z=mWMrzeVd9nlQCFmZsR^T%AfO)Z{E3LL zAT{6t_H?4$AZxsxKP0As@55d2A@MpJT@J)lEX$NP@Lo90z&)s2MO`G~#|95fiDsXK z(fBSa0N(Rv_+7s)Iu8)qURoijE&|fuNV`967+pQzh~(#RNGYEX14xC8jN==mc-8+5 zFO@1xh~5y{riJSm{KCy`aGD?v`;yE z!fCQFW+|(PxT_*xi!_)E@B~Q^Medf-_F*2!;--JD5e89Y zm%vWJmmPOLbT(J*>NT*y7C0S(F*9QE_hfiOfqJB#=ihZvNbZ*4BIf7O!Hf-k zpT0NJr94G(w(ALMu+*-)4uf19#d=+ISjD9#opNh;_b|p}ZS1x12)Zaca}LARE(VO+ zKdNYJeZ(Rg0q>5BEnqWvRS0mX;CFu&pVF=_P>c>#6wIqXBm}tJ3Q|&r%Y6e1kN=5% z6~L{&-5)!>DX(_q&3o)QG!ld`i$3*!%i3<7FgZ#2#!Ep*xz%fG{PihpXvApzzPuKv zWW7zmO5=yyqi@Dh6lSb{zdsI49czQxrC#ppEMLTmCB;EWqCN)MOB}vw>m^Ht>`Z~C zxQ0ww6n1*@xSw>8uc#>KSP@Ru&cGWcXDye-s}KQer7Rt{Ghwlv_Z=}p-^3t5S>J+x z13*y*P+3Y@VHuU?xnz8FoICZ_me+BFuGVz?dfokn2W3#_Q!IA`Nau7g3KO;(~&m$b4O0U=Pcdx<$>dg(Y#WD=aMu^4`cOf3!{y36ykycdq@9C}e3s z0Z9-g*P{TE7p`#la=R{IAdGG~%7PR6DV6c$Ql%Sl6`D&c%IHyY=qI_M1R}9CvNkTk zu#`x|aE21IbS-(m5WQic%c?58v&Xwl5i5DZeqXkfRNvP_7bkMNPXSa)tsgJE zzrbN*T&WeDAVQI#)1k-W?1}6Au8!Jy@vJvQAcApc%!Wgfwll(0?xMW)WltFm$+va$ zvEh1$&Cg}oP;4$MpX8WjU6ihd=1}^6Dl@uH^m~*xUC`@L_yBJHl-K6V{7tbGbhE~h z=!yiIxmx!Oc=?l4o?MmM0>l5B4{}yZkd&efavw~mW^0$2FKbH5rN{)*Kz=Lqa(l3g z5vz;%zn;`zB@K5mpwfx^wjpMdEw!=NA~8_mZ}<9i{$A-obwQ4|=8uz^&@kNGqu zyq4i_irazaov@h2USQ|UjEr!qKk`znOF(7y<_d~E_6i95GMSvh^$Kv4NuzN6$&`y; zUlt3lKQ*y5U@uHXZZ+z*aw6K# zr*v%?(43ab`ktq>cEB+)1rgE$|N7T|=it6!0L@Y_XP;%{L_zX#Ut!Qm7^}V5102`kvS8gFpKQb}H-Yq^JE8&HXjPS+H-Qq)i>Y+W(#O zQ>gL(S4zwOh?#a-^y>J`Wzh~4XWbp7{%89ovo=8{1IZX0L+OOfEq5oZRx?$s+}x_C z$=l84Fi1F-Og(cyoZ9oq5&zeLm1%I1(KEgGiwWu@eKhi#9duSyf#lFOnt@vlfSrkN_3Gn?I#}vkM zL0ftfv^%N^gnt9fr<2w-06>!LxxxRuppGmEXluWgK>k0M0*R6A3CM8Vu$DB|pY48r zG=NwhB`MQ9*Pn4u^E*k|eO`HCJpu)*%0xy*1#OS#hoo?r2IF&>Oj|VYX~1CMQA26g zTBAHw@_`IL{liu9zfWX!1Gy3#deneJ54W!C>kA;UsPdrD>lsZ4f^QCaU-3{U}5dZ!zM z`m5bh`u8{IfMbawR6h(G71sAp(YuM7brjvkQxX#eZ|_({Dca6Tioe^vYl!6{$)Q>> zC(6n#`IzLCezW%>Ipz2EvBPJd%YhSU6FYW4F=97adh^xSTXBoxzXh%CC^sr{<=`}B z0Pq8iW#u4u&?On4h!?hBEX7hg(P*>vJU>Es>~~0h{l8S1UoYj7cvgbpM_h1)vZ%D+Cf1s~hGNyW`Z?PwkD1c_AX@ zxUAn3?h%%NQ})t!e~Xa76ry#v=KDxbTnfC$;}$!&lhl3lM!XjA)xipxx3O*-1jeR%4<~kX zU=R7>H?j>8R*6(zgbi_0@(&rxla&)vz&^pt$QKa*M+8M(5bDYoK9r$Nj-BX>Y;d*)fNK zWN9*I#um%|R%9!C3^FCqq?j0JhN6`<|J`@hUXD>>;au?F!s=%Sn!yGe`I8+&<%~eo z`_iJmAyA6X4U_U=2D2VBNcn7N6;SpzUq6sr$96l(GxKWct=+DQF+%mQQ?=2bcG8KT z$uJW6_Wo+bG+1sAA{ctB#p{LPcL6`LL`In$_+L>S!S{0x48-54_b>SB@@3J=>2aSp zpfN4XPWP)5*C&S10f(i{ppl;^192uID^j>P*loVnp_&RJmSLIPzj_x4#jF$K_RkvO z^ge=!pP&G; z+JaXz7U2=XoSwferz~y>lgdP~!q)k>Rz*Ji>WQ%CZ|7qoSaq zVE35j%~g=2D@Dzsw};1XEpMG0z{S~uf+Q$g?@#Jy7==mvk0+_;h)_pr79zT%ZHqY{ z6tuZHTe+AbX45kO10~fg8)mj0y&l#izbYJtD@{+P%pL@8!3rloh%o06Tb4HRiRB7g z(WUF8l}kD=k7*@rE29SRj(!K2tqgw2%KyS0%%Xh>clW<41_kC{-raF<+^sImH7kv~ zz7R(GBI3=47Wn%f*@k?R7Mx>tbj6HE?MZD%?*?Xoy`^E0%u}0gHQE)%2D?(=Fsh>i zNQ9TiPl3`8d0(j&AZ$YeRQZnmP~Sh5HK_n!!p-7LE6x!PO+j49P)JEp>&i|1L?6w- zEe%!-^vu;lQQ9P`TdN`1h)p{MtQfmvDhBvyhZ&P7CzM)4T9tUNn8iArIRI zViw=tP_01A!AY6KnzBQywDexh>0<6*!syYtD-?lJ(Mf(gjatt|ZNd^UG!jvs`{F_hKC{ zcQ@sVdDbC@W>V7{IL1L`XbeOc)kGEDA}qfR;gt)oLuBpIG)Uga6G1lYW<`QCUpg}JTK*kte;3?Z5N#!ulZUm zb@@BPDp<5@1~xe2q>Ez?2qPHi)~UWpZju5a&(^utQ>trc%>&3IXgjk_$#K}xPz(v* z?qTX2`Qrux`TJ%4p)@|{pH92Kf;ff+InwO==$23VSu!IHw(y=d#+C9$L1roHD+&N9 z)Uj(R*V_N~?t6R1wAr!t-vM-%2gqbN!|J;+yEIp|!> z^3{O#rCC>6SY4aEgZy5nlnaJ3_XC4l*NayYY2oZYL~Yw*NUFRuQlfNUlv3i|{Gxcm zeesXeJvLr89TEwj#72V}DJR>DYZnL>9xiG_TJHC4CY>!(;m^1r1;O$^4nkUAS^ZUt z19Ef(X3(x#$F>xt#I9NM05ohFNckf!-fi$eUuOJm*a5^D4vWrk+cV8#hkU#(B6u^aC1|bS3M%_7P_}HWd>b{vw;29 zQ-(hah*|P}DnJqGoP0`}4k*HRK8x|X?$<>HiuafDTAXoGc7NM-|3R_bxHGO&x2UM9 z)>cbuy{v}=mlmYQbKOVd^!)oVgh~0|9@zP;GpRxlutMD;u%2rNnRsW`bv^Ud(8qbP z0r^}^%3P(d7T5$hB`#iv$q^rmpw?0)8owWybwnhj{dhRM86deplrOkW zw_zp9cn8cH_3=9M5g)*kS;gWzALsEj(FtzLDzV4U|69d@3v+HD5Nd zuzJSez6NhW-gb~Ypg$Gk0k@TBwgxDK2+bXOUm~Fa=@BFr7zwIU05^05EJEOJTgj)w z^~sZZg4c2TrMoQfc>*~UCT(QSUe+K{EMkdP9aM&mF(ZyO zY87=-vfWf^)x|*OknY6Rg{wqjW;PX#aWdheX4sKAu3XeDsYJ%@lL`3=uEnxqO+M;J zUhp&@qj<0pOVH|^e^U#xC~b1qGTQL=1keh#`bv>pKFdhDyeB-9yrMUwmmnZXD7bdyCi>W$z#w~ zfxcrGjmWj^tq}{+7hEk{v8zmACyoHL$&ZbKa9$B^!40-(1SPK>m12pWq)pR!SSyyy z!682)-EVD=2?RGx=~3Ihom9W~kMtMExK<6IJTWb54TsD%Ky6F2?tNc@@`EaLV>Kqstk-7r0c zj}%Hv0O|)R^LoH^pa!x#H%aG127)D4BgPdMJ*ePocvuB**m1Pghm>OsIELR!(Q4NNfshUq?3eB8jT^F`$d7~wev}FWM zQYC5SP}va4V`c)-lbQ??cZ&k(iF|J)pq_=7ceZciBfzLpL3#A1vD9;&Vfm@>)c;+2 zFpZC+ah=HqfyHZEPC;G^s15vu4q8q; zi3&s}XYCsoY!|@rbfyX&&Pmm7O-H_T9|)LJ9cJwH3}6VqgP;amew3`*#Y`o~L|{V_ z5S8!8jTm6N+9nR}1AZ*b6#Kgj^E7h%X9TT$mL7;b^X{YZ?kw(@Lbs6xF*2YKr=X-1 zs#__^-FaHBx>#^9i@tXm&H|VPe4XQPHBj(}3HMlHLsVS=T%s{-UhMg!I^B)1$g_j@ z^znZ2kx1?LH=+R8^@t_Z}A8NR2Dw+Lkk4(Ue~{P**IhBrT3Y|`tP0R?0QmM{9&I&&HV{j(h#0v z_*7F{j*a&GI=_flVBQMdyJiz?qU|{PlKSHqU;>J~_>Map(xxJ zQe2OnJFddxnp{9N?gqe$=o#w;(FN;V2Ts1v&1ciQ=1DB0^8PR(1VB|#@Vr66U*snT z-+$k`|KSD1%v=~f$=;0^w)-Z~v&E+wmSk;>*9z$X;I7$dpULWphfj{a z>)z8dh=x2mf4LLHyqI^<)%=yb4ABggg8Kz4`NzK09jnn;UB{%0->g)NcQB^M%SkP>XP55T( z3kpj{*`epAz`UrH+sX$T*2Q*`wE3TnjFb<6HUHS3m{Ct9mx#rXwKVwEaAiF6;jGT} z%iR~kU{{Viygb=^@y1N&8S_>Cm!D;I85DW?h6CT>9Mu6^VLc4uPw2~5TW2AWZjlav zpkT)9mYnZ6&{O;k6cTjL*UB64{KW2!u%L*~O`s$?l!VUT5|S%QQ+&a*{;{2B@`*b# z4iP~$+#tCOP7;|Y-;ol-wfV$eZ>W5Hh)zU`Bh%WI2ebA?h^av~<_XJ7?}g*TOp{J& zj)k$#sCqrT2x1T}dWIS^MMVeIt%`n3ZlUW7Uh6zCI#Q!4x%Wm-g_5^sH*Ino@OxX!qHyM4=2}9%(2{P~g!cJDn&5af86Jb7xs)X#MB+S;*{-KsO1@EV0U{@55 zkd#Qf!9ao}6~}DGdhZl1xxqXRjkE2Za1@EHUAA^>60^|d-dnxf9fOm`N3Ch4X#Oq56W z@=C9uHsVbDmp9@dBPn-d4|&6GfnmJnq_O1D!yfrY_?P61Nnw!Q?*uWKDJ!6{*2CFW zX1?G=<8^L6%FD(CAcbM*REJf^r>ylVoC0t?@)smDroY|{H_{^EIu<9S+h%`h?vL{o zRmf8Fy<=ll#|}FVixk;=DO&D8aZFyy)3}UcQdIuy;R*EAURUTm2Y{X=1Z+ddja>au zf?qVXGqUt3G`SudSPa-IoV2GpvezcT8AicI!$uKn3(^<0cf5LCXYgH{gj$acKjOGs z-aZ#Y;A})(trs#bnE#kS31E7P#N3GDs#3Q$Z>aJr3 zMZb2g^%!}r)d(iu7QH#76}Yx9M$auWbNERXGQDQmr`XIH74i z?&jbMXwG9ESw8gTv`ULBI$)CPwR@X2$lBVTBEzXD#Q=8$ghR3ne100dA#tLm&y`pd z=gsfEOmpMm04Vvzh!GjgnC+s_mKa)vV1a2B(}Y~4@B8y$?y#F~SF;0{8SWj(O9pcb z6ffK4qC4?=KJH8U4*Y`eUyI*e*hfFyobOuoTI~p4A2XvLNF0QG=m7KL_{>=hcr4Y; zNifb1_PMzl(DCdOIcO|h0+`v(2*HCmXW!e*+qf&&6my9>X>*&p$G+^ilem_ay9j6e zgGQp{>RW^~fvGt6S^4Y2=&I^8fu{1JWQlt7-MWv0m1ffB<3FdGysHx816Iq@FY4ZB z>5Sp1FzfIq4sA2&!VN{)m%YJpfU19(fT3RaMaV2qD9V=tF~H~0WL7F0LMEp{auO4w ze!S)Sg>k*riIR!PNlWQKXzWdhy4C3HJ*ReUU*^W|(#68XqKVGa4VBEB_$HB@_Zk?G z^4-BaRGwVlJgm-SFm<%?l9zU=j9!Zf;eMJbg zJCs}Ssx=BP7%K4&ruweCsaqVAib7i z1m+U!YEI_%dY>$0;asJV*K?X|95RD0@MWrW5q&l)>SBx^H8VI?`vJQHHy{8>;mfOG zp$_sszu?%U+L1D_tMWadENc&o^g6q!uf7R#uB^8XhRMYS$H6i25cucJ`bovt+Bjg2 zV%`8D^P;thDpGr0>*<@_wow53r9~yw#=7En09o=P$;;LEXlq2pFNQt|nj)P&{&Z>C z->$Rs9Ra@&=?xnzv1@3WT{r&n8ZTOqY{}e_w+bdn$AAz=Jd9!D?xCOkiR#+wm+9}^ zv1z-(vuFBf9?A3586TAhFd|9Z#lHz{9l6^bARDj#@K{<7iRmKsg$sUhDB7wl4}BhG zchPjBXIBL1v?6LLG$9B0Ew)!(@7x#mz4MumNV73=o9#p#DFDn~s9d_J%ux=t`*ok+ zu2QORTk5ZuI|5Ri=B`H_bSQ#v@d>1a{7AYnorXg+-L)e5sD)Hh%_2jym@9HH_6b{r z^jOKY@M*mI=h z`q@=*Pd~mGJne%{XSd7j2;h`w>>BU#+V3CCyFQB9EN*7hl#R9`kdYvKnW}LxxcBuA z?|!2HG$`HQy>=9Vd-v?j6E;(~c(1DxbR;@6wgRXO5a<^roMS@l4Q?~xt_R4HR%%-$Z z0@4pH)0dg}C9}mLn&T^hMB+=PtcXHG?t;2L;U?adiDE-i6xCuih?sJ2j;<%mHcn>v$4tAn%caAh1!Hxz8AUS&se$C zo8qB9R%YH0Si;OOm)7EK&PC{i6ed-XOla`h>W-Bhh0S+xEu|b>h||NO6KUlOU1V9M zTWzuQ%z4zJIwO?=Qw3T{dGkTl2_lDmh-##0mA&JHrkw)#v zvs-crc4j!L$i;{Z=eLQMcqAl7kyWA{fZUoYg*(T0u+-|*F0n2(8j-|oQ*bD9Iea0} zFPEn_!VZ4qmBd~1SX?RyL;Krk8L&kX!$F5;h7XQ_UF6{|RHxT^;~<<~5D_k%LO!J{k^?jf*DGr#>|#}RJx98nYb|^1(?TMV znDQXInqOz{Dg~``C&B7)tSy%QQIFFnW-^$%pVd=B!bva_x;W5J!tTXpl?v3}>^AUG z{U+*6KAqAl1E~`(CpvyK3p#d~s(|zy!;}@=iLJ+8TV6f3PP>{M6J@XO=uKXW^AJzx z)@8RzuIjj!ESLD{+km+2UHLzaI9MxYJ5}j?&1#dDWqIcZnvNz>WPH@)@)DlE2g>|8fMfAw2%00tw}u+a3-4VvnZ` zr>Bs5rEYR+GH*)Z(o``Vc{+Lntv&XuS1d<2FEtL-=d@pK*5@n#bgX-<_?-SW9y%VJ zJGb7inV69K`bTYxg*{ov>$;fgwn@~oM^aaVg5t5qs-mcqVE9E-TBMT-ag0*{av0ro zzy`LF8}1Wei=6uRExug8V|c;s8kh-Tw$%Eqz^@(oaI5W)M&sJK5Bf5Zq>67Y-qIz` zAD3*^uOAstX_*#MjJO7zDR0+xRpc;E6aR!;=1q*gjaw3vmLF|Xy3Niw993xiBNcQV z={-F!K8LWw(+=+#ZZ&ER%bs}ej$Ka6UN2spg4mN+^S&+fXdXZS{df3YO2mtUGG4Hh7k&LO=;BDdbyu!qM7n^T@us^&sWmtRXh`P1 z!a}@6ESXpxw`Mcb?RL4tkhNr}xcEMKx!M?RXY zJCPnT8@~C9FeQstmV7$JcKDLVGd{DLkB^XWy&-BtarK>i?jcOwcyrg)v;)NJrQuD$ zq$RI@&r|(JbVgW64g_VlcH{X`|Gklb0t;(f*yz!^rTR;2zOB^kV;J6~2MB4J)R9OD z#e8u54pIch)bt{>?(73Qe!w6jJo)4rtNzQ%zscjBJ5uFfv;0zy;(iMT&1<{7mT}q9 zRi%Bta~umiDto(W&!CpVqvv&RdT4lD!SEDR64!pEq?}LAr1GMjtgZv4&yO> zgzK|~O8GG3G}VC-o{t|GG|F$PC%6l4s^3Ild$D3c$#J=)TE`@jM~tws`U3)oT@$V( zd>=W*z{v!`WgNSX+bY?vG481iZ*xX`+nXh_fwq|ZpLudgu5^i^AezU**j6dUJ#hUD zRBE3nl%=cozzzD9F=@TnxyRo(crml8QQ;jBFU&}nLiCM;_>`tk75Y|`Mdn5u`l50m zkSBZ0F83Ma-02~#1cs-qP8exn_?o#F?v~+TZNq~;@PAarol~8|n={+yJc|Ki<)Oyo zD_i#Y3ENaSSA-&BF?Px3H-<9EV!T(Kf834MyJ^}@lt<@|>}HcgFP)1ft1{oXMbZ9} z_v_0C_6@2Hgt3gBbVbkj{T?~gmXp3OxfdA#breLWu@4RER&jtcwJ7;Zz#Gp-dizOm z?K>}i5sJhETUc{uJWi*kQ=3DbmJpylwoFO{!;jA6#X9Re>Xc$a1`fsm>3u9tQBHO+ zBr2BAgi2E=^}ZE#98WYhxZ#t=Criq;t!DNX+Puhco-j61gOiUZ^y)$^7|{q_h%@hm zj#H&|z|Xw+ziBT5Q=P*qOF1&7Bf{I2N z8Vmi62-0jB!o$Xp~w0 zICd>#*aq2`l@A47=ATA+MbqV{y!Glk{S9k-%4V!ZTcu2~r_`^5Kk3nZW5yl6BgC^=E2-#MHkEZSf%RRT<5 z$y!n-5tRx;uVjXSlNG@P2I9t3#eMVGU?dq#PNSxo5Fz?s!IS|v-J@=mzprnrl3}Wp z!4-L>uNJ;jHe?QqZ%s<16V%CyQGJ>?N-$=Y3KEu=Bg>kk%w%?eC)8r}D>$-m%qzj# z4k5hN8fy~zLr-Oi)m1ZzK>Z;X`FIB~n<#QFjP3}n@cLLRV2}Euq{-J)u7*o`pW5H{8hMEDx&qH0OE@#k1u#NNYDz7-_7etA_thTehp zK8h@4IcLUTEyi-2(=7ZeeP;RhJ9OU3^LOsR&Sb+5?oV7k%kN%)iKAtbykS{?I#IwI z0Rc0ZQsrh%IU5*XQ#dUWcXyhSYb9)-zPhPU&01bfFc*@U|NQukyOG{yDxk`Yu` z2w3Ck!sW^)Xm@IjV`KAzGebYuO(F#A*?yQ_eJwYT@p@)OJYZoZCqH_u0Omy|P~Y=CHE$&)6Eyn*G@gD8%n317s2{+~*f^{%6dl3^hiO1Y zn$atIxZ9i6#EJ>j=1#7j6TR(}WEq`M%uY$-$pul+M#1`HB}&%z44V+nJjL(Ap9@bH zki#UYC_dW+t{zQCsC}y*a!6B#1=4l&N~lkari2sn>#yq_TCsS>!PJXw`F4H+?|B+* zYBWug8c}YzOf*Z@*`+x#PxUgB-6Oqm7~U<*aMl4;CGPG7H8G)~7NBpp^TH`?Brel- z!LAk9mK*rK^&7p3U@M8Ks(#R+HiuI=9r|W!PA#WBmzFgADd&XG!4ZtHu8=^h_&^O$ z!ZBf@`mQ-SPJ;No05UyDCBr=GgN@gEuW9c(`Gvt1FCc`7l@XzhbiU8N zg;h~CXqk66=kjjPoqjgXzMqhnAJtM-gWD4_fa?6~N31&*C`YY<)CGkyU_-kewHqj& zr1(5Xq2`)Al@0V7G~k&dn^O|bacDlR(fMxPZ=hf@a_pL7A zj_F(mGJ1N(TsaiAWBaixQ(hK!=O|)v%aKeH{CCs|u4dOa=XL=X$+Lm)S zmnsgqL~?0`{JK#%Qom;$8a6sKW4XpQ+9ihbo0^y}nK9B4BkD{e3XxxmkPwp*agIOq zI)^G2w&&J4yB<=HY4{0_IjtN@SRI&jeKQi1^=fi&akaxW0!;T9&R7hwmUwhbXW@sA zSNzL_rjQyYxjKj%Z9X>ISh?z1kcD8&yqYXjg%B>-$#pJ1#-+jCcBvNyQxNq>OLp=! z3rvQBz_`PWR8}()9jOWwgEsp(Inz-J&p}~<2reEx^d3ehWe?uDuyOH|nDKdSQZ}IN zx)*gCnmT-i|Ek1{V1M7xhd}- zka!TV#p2T-j0N0PEq_Qm^W-GhZF1G-oC$0KLh(E_X(wvuAAdp>bhRhi{*KJjjNH`E z=Y+H2dNFo-(9$Minh2#jXQy!bgOMoM0ZG%?(_|X^TL{SWa&$ru{Z%P^cG3E>FOLY; zrjDoGl{38bwD|nYC@kTqWGg?;WQH)PdG5CBHh`duH&R&56BAP_>d7|s$O{?k(j~Tv zN^ugx1+7U*lsAn=jmr8GX|0DpMb=M?GLGgYF*a$-F=hlRj$p609xvsX|3v;! z4tqI(mfh2{ilimOD(!9cXI#Q)r|`C;W~Kg@b+*CXYg>>iYuKi4A*XXR7F_KBa{~QS zx8GkGM5oBevP%Hj&OyY4sq(doF2u|&;^3x0E2zfSCymxpNapuUTm)>+Hj~44x_j|% zM>9%fGRO+(3&F;kdoSJ@^M@BIoJK2>#^C(jYN;G-EPnZCc3Y7L%%vYiI)6caX7}6E z{SEvFiH3t5BGf)#37N(MMO$Y6F# z`*F?&2o@lz*wv}-kwNa>m_QjQONX}$yhe)hytaz_AR%~%uHXtLjlHml1+AThYcyk^2t1ySqOpU6 zF~LDNSYC3UpXy}*-{+}w5BZ8S&Chgi5<a#{zgGK>zB&uBE+nAxTf!V}E~ zlkFcDvo?b_Ic;JT8#YRw+Db1S^;sDYSY5t9$C=ckDL5$@=RYtpNsasEI4IJJ*?sYO z8r_LY>(>@uAv3|Uq!TP~1FfSqd^u@AN{!=9`A5KfnPjO}w>&W!UXv$x(SpHXpxxJL z$rKv{cha3SN*>R7E>CY!?qa3A{1GE$0>N$*swaga8B-hTP8Fyd>;J7ughSlZot_aQ z836-5v47os_T!lrSEx+$pH^N1Slb)bP#Ix4j5fW2G$gi_hUrHngw@9mgO_olD=%>- zt);Gx#K{PE6Ti>#TzRIQcTU8N8cpiig{r<-Pa0(!JsW*}WTz_nHl3LtoDmP-hu}uZ z$fKUd|53euZabqx@%_Voaa<7@ts3_tlCbwc=AP=jAsHcVzN3&!D>(04yK|+L;h6W_|pB%gSCnv6$ZA`jP$esIkq|HRcxD1FkOt@v(IC|3U*F!Qq z=7hvBUe7ptsvh=KnYgCA4c%Ze*}DERJ@;%a`?MJM*DKq{92KQxcAmi2VB%U@bn~a? z?-P1EiN$14;FXe2_B~{Mz!CD5! zqESDs!?@B7>oyfduoefb4WZ=lwfgG|5!&wcoQt2_X}CZJsKVT&%|<3bU`PHVk<<4v zOd}^$V>#j1IEMElS&x?dva3m?EynZLp&_)vH0JC2rm4Kci{Z*wsCWz%BeHn`V@lv8 z4|O+IMx75>sDVCpDRr@k-b3ox$7^O?l)}tF<97!#LA&pM$2~=o_|IR(u*E3k-a`QS z(iH7>Mn?xBw2rmV8`k>;n8zhx9t$jtSza{MXXc$SiEChk)%(`bPMpD0<$1;a4D_%n zuR>)n+QztS!-9#DIo|2x<-0r@2E{EFMn0`r8!Xs}hq_oX^9;=l9rSjgV;2NZjvDGw zLZ+O<4Kq#-zrKo7-s7=j4fFP((1b}cbJ|-`G*NdHe4Y{lBIG>KS8g|h>Sm_lNCs45 z&PA#D9TK(ni(^Y-LQG6Jp@$HRsBxABq1j@5#loJ9?+zQH#&ei(o#3iMX5a|WN8=|CJTXgaNzB$e}` zb9Bok^Ll841DZDR>|Ui7^c0KeX_-{;yh(akdXP;ivki?Nf4bO?&42qQ@Xn^&l=f#-kYT)r%-~0nyXPNr=Hd^fA z*?Z74LJ8$=VRR8T&33W3@DXUTwvznlWvE=h?Nrc+nh7rduF2f>%;1|Mi-?J1710&X zP}nmJtEUQv8OA^wHD(=g;LovGIJ1mn+DJtcl&Q-6VARY6H_k@sl)jVV*+h6V{XrW zat%gEXKhY){b)O`uox&v?H6T+d6kptcnXyKf-viENT;o6$o^mm{FAO=0%s?8(XuV! znI1)T(0ooy5-7nisIxD-_hKbJ=52=)8pT&PDbDM8ygGUUnT1gVhD|+ZUls-oU7REq z{gENZ!)q$S#=y6ZM>i*sCibfmfkh0m0vC^fvab9E9EXA`s>N&7?+ed%eq1)jPiFn; zkH#9M%3J(ck=S@l(T&Tk9{c&_otwh~VQfdk1Sp*5_lpX9r9jBV#AON*+t_K&S^N@p z*dd+&!g;PZE<5A6i!7B}L0=s|f_rZOxXtL?)aVh>Hi6#hMjW^bO_W==3x9bA`40w| z0B+%&S2Q7!Kr--UiC*@QSv>dQ!Pg^`M{at4NAf~Xa8ZMssce#H3vkhLEfc185A3{W z;o$z^CQ;#97Jps&)&Q?QF_2Wf-0bn8C+kmA!o=9?_s<|jw1bi*HSw^_cL}Sn>~Kw_ zSQ*FrenhY9UR-|48k)@0lVTaNgtVADs*l7(WB?m4bhRn3>_ig$p?_k}k#myKL64-t zU>FseCj5lY+ zVP*0?mJ1q;BX2^!{p_Lgj>1A=dd~a%X(N6g&X!pZWYMW6!Q;lv^Dxcg6*yWdXzb}r zIq-0jvlUU`2BkfXbV}LVdF}a%e1ixC4G#_V7${`4!G{K8Hg<;!i{Pu=p~eZW!)(n_AQ=Gm29$iiXG9CkIt4ZfpU1ZTDWKaK;98jYw1>? zDSl_6Kmu9A`@(ZOLJTgx+1o3E{C-4z#%3f#Z;e?LogmYBo1|MTH+G*U6{82F>%Wu|8iHeR z#yk1$tdxqI1)(~sF=-ELtF#)h-l(TZjP;%(ugdbYhkk-n4np3}1MiehkHT1&opVw$ zJh`@bBjK3ruy=G!t#2(Eb3S+u)e4>OuxJsGklh-ccw1?wJ-s2Ze4tr=a%qU62 z5tCwc)TbZwo3{vvoo z_8;1iKZuf);QoYV45E2=VM-G&ZRVRwX5VI87URlT7Ujyg;y>?@f)$BZDSh?1Zf@BI z*mx#+lXZ*Wtr%N(6cD$Y`#KAs`Lj|nUpKH4RU#J@h7t>krU*2Z8>DRQ8i|%*d5JPV z(<%NO9fbrGj4Yk5D77TJF1Zv|VQ+U#>tKZY(!rhLwZoAtax4fe!(>Vi-z1?2+9;fS zSAx246Je=n^V6(Yk zczNr%rbr7W>BvVPdYy%j)Je5VJso1Igjj@z^*Qdz8GnmBekJZ|0Ks8*Z+%jONwng8 zSF#!MGSNs4P5{Jv2aGL|r=4j$NJ6SWA=fsz;`fbejOd~p6AvRX`of5E+^30f8s|9* zTn}(Ya+Z%Ex-3UGHQ3k-W-UnCx);Bc+m63^jo;X|52^nyiGzy&$^u9|$^P1ISX7>jXAUa>WRN zyWm)78rPP<{{c-Sb#VL52QMWIQh=OgTI@nAG^#90!30C*+UAqxH1JGrADkyXOF`Wj zIsW*fwusqM7L1z5r8%~3ZM6Zhn-Mesd-YpSH;^>I7=`UU(ntuomp*hf51l8Hr&kbF z+*ep^RtTNy7k^;pMO_hXVs+>Dzf>~DPq|(Fnmc@CXSz3+5aScC(pkU&(nv6r z-g&VuPeqzVeU8KSvb0)=aP~(XjyHeJh|gfEkf;}9Zd^n{DfwJyb1bRJQzk(oM{7Iq zA-COZ`Zt9Mvqo;Vnv^KGDWTx}5Cefoq97+%mA-I45N;*%&!fNX29xS>7Q&*YmUxZkCUV-I;6&_R z>2bsPU2LqFu1+Bb6bf64c)q3Gw$yH?T<6EY%Gydx0a^56I`lb|7WZ)gHCS~+PM2qn z=eOvIo;=+vMCzeaFuAlQL8 z7=g*7k>&#j((XDi!IMc_T!FA8I+xAR0x{R0Y+;_SCEY}h8fQMu+i5yj!4#IH!DV&KlenpFdPj-QvP-@Z;v53o%b7Ux7Q=n) zD*etjAT9@gbXc8sJ1Gkeae+Q&H_~u$^fVeHm)4J(;Q(s;E!ypNZ;-7)2@JmA*KB^)z~pSm?XJX7W8OBwQ;^A z&P0`Tm(BihJE?vwKPhE`Z}n~j#Ww3SlF>o}oVKnUsQg>HN1cJDBP`p;5n#LM-N`eY zTCm7YU2s?PS%Yn!`o(LVMkb1*u^49iYJU3|kQAEf@Mjh0@UGbVS7!8HBtR!I`2s`R zsQVoCQ7S(_hx^;br!iEzR;~=Gd6lnEDUM|-z_BuGXl`vgru#QR92;#_!LG$5RI_np9mr1>)gT%Z0i@|aju)gCLtu;n(E)i!ef;d(PY4cDRZ%$V>Q2vUdIR4 z%EmggEe?@rAT$SKW`IXyEEb zA*gR6!+G)CC;;xvq+yeta`n3D#x#;SZg6}T_+jlj?DbQaq;6`kRO}O34_3^`5!CVK zM(g^^#lPSAoGHjxxU)HO!%6da?W^junmbT}`SCK6e;wxrhX|_{;@eaA6t;}>gb@5H zy7}E9G)l0(&n}7SM7wnP2p9lmuK;y>*CDqVcK)DaPNpOe86iWU}R2rGtAXO>6E9) zIeifRxl(r&dknMWP~M^*Zn^9q6qyUdJn|C{n3LU_MxfpwBWd`_NYmd`B~A6`I@okT zwEI@gGSnN-EK$e5ip-zBf_zItFVjMIPUY}pDYt&G?YgX(H5`2Yz_k_5VtBvScUUiQ z@oFkx8h>bA-oRBQ-Ol&fiTv;Div`i-438HOyZULBv{GE#>9R-*W15<1dQ33dE~9@h z`q8t4(XvnH*%t9P344^nz|vB{p(2_Yzxrp|kJz=WM9Om!unTUi3%Iz4&EKWcx>`uh>pOQ4)``rax+x_( zn#H+IFx%rD#2 z?r=?)e3oU5iUm4i_umBk`u$$aO%#8DyNQL;;x|(v8E!Bc*RyZOFpk3yv{Gv1VWk+u zNiG_eONMNs&GUSI71`(6`lmeuZOqCPo(tm_%@@NuZk@t`%S^cXMPyb*j?>K)3oIx> z4W>|<}wSyU_MQ&2@xK? z)!SV-TzDTAVB0cxJ18~`?f`KG)~eZU2qvbv7T3Bt@UCrmjdx!NIf)tY&RGrT%t4QU z}>!%NZ+x#ZRvk4)Z3PG~AA`=qp#-IKujAOfv{3c)n*{8^O z^4*CSzbp09z#EwW?`y*^CEsdRUmRi`BF3%K1_D>rnd@REJ@(Y*6y{!e8GQLkoABb! zMYr%uphV~Jt*UgU=M2-Jz^CKvIjRJ&wY3kjJ+x-&mgM#%)R=BX`ET-#XomLkhVn8A z>uM%PRHa0A%W4&<=DiM;(6URF@hoB_Me~NTeZvK6Q0#HC;LPy2GI`peGTo}G_fR*z zJxJEQazM*&jlMahvr^q{%>0mffG0mcp192G-UPBt(Y;!gv5W7gKP>9W=)37Oadq5y z6lNUeFWk3h){mQ(xo~O(-Uiwcg~6_qGPItfU|)4&ylyHj^QhHh6;pD-QLb>gY0X+B*I zz>ab5#e1g47S-@`=7c;skX2P26Dx|@VE;sHtZ00oOUHr6-8wsP{ZYh8!5EVH#YO53 zUuMg@R&GKGr_~qTsFIGp-_A%0WXrkRQx*|nPfoSG2V65MOYD-#imqe^eL@w z7Ar3v{tiJ=A?>vD2Fcuv{6=zbvL9?w9xRWDqlH~(yoC^vIhU`IAM>xZ$}P0S5mpY}-QosDPo&S#Y+TjDzT1#T!O-%QkM;j$9yb?T&SIZcA) z%}-+Mbkn=x3$3shJe;wn@U^Gc1muIZCVQBHFoHp#nnR0nOUGC@O+%0ZJ`qxia9MN? zP@4S}-Ol(59v+4IY{6CS$p(sfB)Xa;C@cfX{;@shE{72YQ%wQ#`?feiVFc!hL`wMC zr^CV(5jLeum)?@?F3(RibeZ`*-DudGPVF55@B3Zyuz$h=0G7Qo`*6^7WPlv9^IPV` z81?g-D)3>zMq<~Ki&yO8K_LML*{Vm%`^=R#p=q7|OcZxRwCR?{J^>#r_AiN1I;#54 zy_@V@6ET>uXGy`x@g8Dv!7W#1gbD2M&M=YDw&2JXB zMsIh#l#SH*o@EPIjAdt?{bFP5Xu4ORCni*R>nQhh#Wo8Q7Zo{-if19*5*)ZJkLfU{ ze^#kTKw~nepS=1?*+(2bY=WB|J$P~hblB%R!W+D-4GOCm^UiFE{X{!r2^r|D5Z)nM z&#KF|I)m5IL{0V3u*QyC@yD9J-9Sft*?1*|WZMM6=E3lLP1}`%)lSbe_@*7SDz1>Y zk+hM#6|G3%`gEziE&thaa|D_*7y8D_I&QNDcGct{Tsgn5fIQ%-W6^n`=&p4^LnN{~ zZKE=SmCX|eOJ#x8YB`l8*E>vfudojxTcRY7RcIjWy1j({Nj#p`xV~A6D7TD^b-$qT zl8%f<>|V?h0c1h7flq!{z}-cn3-{@{qd-=UJYNqJdB>8LnbumRsewP`aJ~vEkI#Oq z)=rKs;7WyocBo4eDT3t@z2=jjx2oO)RPbc$LZa~eoB{hX+V?dneK#{gB`iJZ9U4_0 z>CY~!3}KRD4!vm{Tm1fezuqfFwZ{qIX_7aDREn?5erKjhVeWbNg2n&#~#IXde+sH>C$a2Qo}lPn25X#j38V{DorfhdZU5ey=+}s2$IE;tlG#V?F>u+8B>K_=4I!qmUn52UD9oUK(8qnK#d+X7K6E}O{aH~(l zgbEEKJ}2O*J!@8;b$?6rJqMqO1xpJznf=|$N@w+3+I|@v@e+1V_sg7ijxn6K(dkLy z8AQ?zj^oMx7UNK~2gQ(0YGew^kPx_Rvw2DS-{_67lmN=z(sWqZx56)&p@Z+#519}# z^%5+8-M`rH8%U5%TTu8U3J5Ov-u-G}?1?yB;kg_cC(bqTp`oJR`>OuCk4$q8fBxgM zid6Rdxk4!vGW~CdXP#T9FrcL!4TbL&F6_Wl+^|065kHFF_62kq;XEimUGs^D3t3^+c>Spf*9VL5 zIMU)HoyUVKjM7EejaEJ*K7b)Mh!9&hMVT)A5jEn+5zqSgS7*#N4k zVvydE>04&_B9&DAKdL3Iql87!t)VQl`i)a;v}WjLDE&L|?}~OUH`bA!@6b z+IgjxwqIL^t3)3SeyMnLmP`7f3$HU8gD%?laCLpHx5U}K`*J|Ho2UCnh27TIyL7uD znLpI-GdVgoQzN=rfC2tw0J^Q;wiw#Bcv}{y|J_P0lPv(k?)bj8lNae2=FLO}&suO8 zu{#~~8gUu+xbUmJ;?;=9jIjFCNZO0e52ItH4>WIxD<=McO7QqT;yvqH-!sL9r+#HJ zq#j#e#WL)M6o#|J#UEfd$qx|U?0HZsS=$XJp6xcj?%LnPFK$-Q!jc29YZ@nV@M=Wl z`U_@+;@yW>WY}`gu$Y2~m>Nii2_M4tJI*5g58AZ_Lns2B zf06CFNjd#!p7qb;DFL6Y7t^H;mJi40aX17lN9mKqr@ z2`m7aHrnl4;7-ej94t7L$0GfDOP`(yGx-N&P_qZUtJ14+*!;&e-QN~H(UC_kB=eUU z`_dh8rJ;zX{DCXCn2;1_K*0c55gph{j}Uv7?TYf{WjX#A?b2;H!`iQYjz^1-wYxBaXS+BHGun%*t`y7v@!dB>Vn<983v`9!CkCK!K`y+0#5iR zDt)t$cHg~)y8YuFyKE~Tsn+Zr=crURkpe{k(=UQNlL`;k`35BdGmN)Xzjm0S?1!s5 z_J1%Hi4ri-cr;#%Ww+lR77O{k!?ic*wri?lHq z;_K8+y^X)i1)*r;41NIAr@jieK47GtGq)OGE|TO35lmfL0WsW9~0c z=gOW5zr?PG9_+5a>BaNq-4r!)7)rZM!^Diq@??DyoK+7wQ;jfy>-e~L`6v^0su7WP zR>AvnG&$MiKK?jj4)b5uKaoE<_GVnRB#f*eJ^V_HuTzlA}8}Zu!|9yfA3{jcc6zw3zV&j5+VEHx=MDQ z8n0rPYglzAI(slN9_7U->3^cvy#Fpo|JY%w9Knn*rOuV=$oNb@-c3NigkrWk_swf| z0n^YU9A zUas`_iehCdlrcaUO2$Jr>E1`io=i-*D!*HH?&X?)QbB`dxt!H1A;Yhjh5*yy5(N8v3ea8^YQYOtX#z1$dKsy!c)+|4wlf zcoT5xV4W+upXHo}gFW&kp7DD9+FV8iot|#K`>=`1C-QoiVcrq#9l?%{GX_yJhiX(Z zS{OfG?@_tY@7H3t95d;4_fHd4on=hoFh^$+@6n5ISpR*%Kw_QQ1+p8q$r-z|vG$?V zU7x)!2+Oh-x|y-gElJhYow&6Yj@`c=xb~45eV}RXd$aAIpZFA9cdxu#exj#@6+KN8j0_JNreTrF$Tn$WF7&O5H=W3YKnUPe}nk?9w>E}gKuR1ovD9e zv7iV5X@}~M_2$3Odi31?$0PT+x1?4c*k@VB@LwWqt*u0xN-zz_@v~N<=?7w=n+%=dX--~LqRu}~P$ruJ z#rF}TCUP4Uw(-{EpNnI&td#)Iu$4eUa8&)WFe?BQnlM`U&$*QG0$T_OIY}Xqn+N8@ zPTgwEgF1xi+0N{n>HG`|H(_9EN|a-basr}(Vt~FF{et_vy(vH-Vq&$b17vENTTuFq z|2ee{(IyU{B#3GBytaqNI|OjlL$3oF=ymiIfw*A8hc(JX$E3r5m8|dZ7s3}{(P^V) z{C(9DSp=Juus|}DU{j#U)D&O^^AU_$mOQ5dm|TyU0#YU94c<(>_|YbT%2eJ-Y)nl3 zwS6@$*dJSJE;j0OfGG>3EoztDuQc+RgM0>)!@|`Yan* zM_P<%KAU4(03ZTXEC|*T;Lc7G)a`s7XvY&+Fu~#NW#D-;E%^`X5^9Lz3t%=r2MCw} z0AkvoY&pCDIMyn%6#!ddaP^rR=iOon=) zAfAi}u10YKYIsUSrdQf(BJn6_(8j|;Aus;=%5!V^ZCgeKHv^ZK57m5Q#B%{&s9P-iBshAw`dtI zJg@~qh^rw8XsfjEHSUWYNc`mt5~Ksp6%4$#@;};%3e~+K{>N>kN<7>iX<|}N11P@O z#S#|UB>KZgMY2mb$0Oi@6t3F*yr;7b6fpaL#03Hu2?2v?gJZP^V$eVV&9sfh%t{yF z4gtOgn0z>7#y*u97}2RAovp^28Gp~7RwTky7Z@_{y24V@%SdA6ui{9ZtBWkhi`)`-`RUTv} zF2tUw-E1ChK_HKmB^tUqSJ3pTQ&3|gsJ7#luC60TuC4<=yn{L@gsu&X3PMQL(sY`C zF5Jv3(#TsSGI63mlCUGM=5bmsyZy@on??P3AOOG&g-M5nIJR6ex$Q5CKAEA=nDhwV zC=EctW*M~#EWl)x$bJ#z@8+6o5yV3TBC1ve6d(lM4XsW@x>ngnk&s)!Iu-G)fpjZ> z%D>|e{z!DQd=gPZ9zCUL9ieuWg@R2i zOIKglI_SV|(C6DyEsstR>Pd;n#b(J4Kv7{GeI5vsRp4&heFbs9;-L|EoGsxDiVuKc z(Fq>^u3TY36#Vr?Y`!ds2{b~i_ifVj%f@KL@*rF~LacjM;26LaAOZ{U7%9}u@&6jk zKmTN>OQc{BmY57xM=PJ(Xab}B_tQWh>>EIoC@O)m`KX_bq=&E2o5bzUY}LknY?Nw- zhyKs^h!`Glv-f#Spv;py*r|)--{<-3WZ4p`pm@?q%S_J#Ta?K9jm&w{$n++m!2)0) ze}5qWW$ob`lELV24C&h72k!Q)FB!$k9!C1l5sq;n@+X^P3~st~JOD$z2Q43$@#FoF zDL%==&HQ_qEX;8r!e9*W-bYd_lt=;w*%^9`G8rF(e?M232&BS<$VUO|32hSe7@-!V z|LezAq{yg|uODL_=lrj;#(;1cU7qW_e(}E!@tS};&MG;coA%$a0pI^E-zq^b7iyvX z{|@;7?qRmX|0QNKrXINWvoSo&|E@mA^I+-U`5=)A%o^dG>U99qR?`dc?AHT4{O|OU^DPJ z>@svUiOv0YO8z!zmB>{_e&86I7JPV(Z65tp8_I8|gINDy*>5*{wfr3rF?vuEiBLOe z7~-EVnVQ-IyfQ-xa5U#MKr2ja!Ti1T#(#Xu5vK{AMghpN>9BjW(PRH&N8pzaQL>&*F}KU_-Y5F8mlc7XsWd}A`v)Ch zFc6vSl}NejmV%ss=KSh~^RWN%U)F$kA>;%=Tra9YwpJS1{DbA5246 zy@2)s`LO8u0(T!{LWr99E#E^jx4f2O?C@jfBiFxDX&i$<*0Bs+HU2&TX4G1rP=5TcyB%UOp?m-M zeIHXAdkvghb_K}2-u?W5h;k;3dINYG{kEWflp;HkOi$0OouyFwu@8-1Q?LTia*CIIyd4-n$>g-@5aTz&o-eAFWt=kcEq znGRgwCv3ZREN0wT(KDTrNqlNyK05$w6!;bv*olI}4nd7j;h$xM1M#c)<+m2y5s4t| zJ3ZT4Rbp}^B+f(y8Oi6RBsFt3U!d~p)&+!0UFnKf0LPBPp?)nnRiGd-!~gEmJZu<# zJa`c6f0OrST~<^I%`f`t4@`Z><~ON;Knd#gtB?Au9SpKjn7{~a{!(xNBt#(kW{SJ7 zVuaQ)sbZ)74%#qy`~kza7Ch=@SpA5r6R(Csgo5>2%IjoIPXA0!qWU5If1$1WsABhG zHI_CQqsD(VTA-b$hl&W$aBJ2KcknEs+28>L_KnVNdVx1x;9EAZ~_ynV>?bi_*JSonFY!oO+4g(x;uK8o{2Lm@XmeK8%tMIBxS z;5d;Z50aV7@8xJB4c`>;@os)BmKwAX{j}N zPZlm2AXQ7vdJqLR*+Iprv6$AD#~^INXVat9S>o^|$s~OXTnF=LXhdgy#V_V8pC>y& z&RIFH2tF4huot{Q&BX>g+x6L|_?d0CcXzFfM+R^d+DXHqVk5}a6Kn3KzjlU$L8x4^7 zH^7{qWypMy9RJ29#=ZUBj_wdpt%13fYvb6=TsBkz)1}`lBlgs-#qM#GzDH4Oa z$p?XGlfRpAi?K1#l7)gIS5}G`@Sie9N)2*hfP6CLrO?BU2 z9UMNek*BBRjS}z~F}a~>ZLRw*kw3tCL^|Z@vlU+h^{(FFqW>~`$FU*}LPQnIYc`MM zF$98seiYny;gJ6QzRVdU4l-lx*5W2g{U1Njj72OKmyOe3T$o7#BtXqNHEv&W2#r{s zpQdxlGLnAITQmFJ`@WRF^idpLYR=ceR&&BtoYdFfH0eikP#Syb-*u`~1%gPCJ0lD?@H6`hBkC&g;{F|u6F$cC|5DxarbUCh% z1qYIEUiY(=C$dX7Y{CJ`Wu??`iKu}t5UHp2?e&%D+IBQRAO$6);FLaNZ$ewel8Sb0 z=Lt7D$(G_eqEB&F_SSzsdo5T^`YT8FBe2G!1s0)&&C!6drrGLHN38)>Y+Muv3n2d25b$A&MFID-O7|1S z*u&ani6CbX2)~c73>V3=|A%5E-2=zkamyHVL>TNO&=pkftB zS%_llF+f4e0{M!Deo(EpcE^)YW}fIRAi_Z%neV3v- zul?B$aTr{_7pu#8cCoQ2zeR99$cZ{YwaBYAKdGMr|f?_7>AyM z*IF9u6?zHHxfEwn4C>NkW!UAY@}sNS zS~po;x7B(l62yqA?oa)@D%$yT|G5rg2+awkIlAE)4y`k?-MqlOaC2KxxhcEjQ-TN4 zgn}dl4-y2LDvM#`laWO3-j4P#O?EKQ!3|4&pMu-~b_OoGtNM9Y%_KPA@IL- zR3D}Q9muOZ8;nsJt(YataOF-E^&hnyyXJ-s(w}m z#w=84mE<)olnQNodhXV(8#sOf-`fX_ctV5$`D>#8tWMDH(+~szM=wX12FZPZ>dmC} z7d_w14ZdQ(Nz!rW2UpDmQ`wS-BxWQ+L+9IF1(YuSuP{=3fX=Cs#GuSW_XkXTWnyV( z>{4;xo_q?E^841_$jWKUsv$rhOrD9SSw;nX(Zeyy02(^QxHRv~a8x^G#}?gxaxx1E zB|uDZC01Uhl2e1X5UL}rg}oP0I2_p>pj9rFesGZVNAQja)3CzEg82_#EB&+Q|HRRd zE?6MoRkfYA>jAuw7z+{o&2)VKdy%N|O?K0#CjMtBd^C>l2G;-eMu1=x-2%=sbv3u= zWee_a$2&An+Do+2Zd#82H@jEYMhhZ~4bWlfGW0F8ZWoy=-Qo z??(5_J6Z!VFqcX+x9#^ATFe%jQ7$_;_3&YX7O|@zu2-t+1GmUYpVfv(UWRjE{6ZSUc8yejl>00GRR ziW&S-ih6L)^Jx+;QV@MN*_ds3G&utkEK~jpY(y&kv-D~{)j$5iy%2b(Hd~+U=2cI6 z@2jFOjO_uz&HTj9P5Zl9>C)(~T8|8GKT{8P6aM4RbjWz)iWFC{{}^J6Bj=6lj`IA^ znnjB=2e3bM5U!a2?j>5by1|&GeB+z{S+zh2IoKu+k~-8M3xID4#wwWR^!}Acut%sU zV1|)L&ipZifmH#~~Tlz=ha_V0gwnx+;w6HM_m|A_?p9l9WR$+_hB=cg61fw)I}_vJs1lO~)K#0?{+}Umg6SclpQm()1W*19zz+k_ ziMqJ5fBwf|FOmU|#TPXBFDeL*@c;fE(D(nlF8_ND(D(lTE9an!smby&R}C)u!uJFh za@*#M9C`rGKV@?B-2HvUB#~{P7noNy1EtZ#H@jc8fchu&M0*RAl5L@i;{W9_o#mn0OxuD6iBtkUoi$Z+ntaP z+zt0@0T8it4TP@cCqT==R^W;!Pqk)Xlf1|It%TUP(D8kA+&%=jU3tub-A+m>7jcZT zt@J+I#B<=e+oMMQO$txw&EC#FBp6i{Q1jf#3vUI{^|@8A{lGI|Gf)~mL}mgX#0-Su z?z8t_{P_N>q0s7kVHw`IeWTxZIMM+l2xp7%{0D&KTQP|wU_Qc)02M*e6QRL@jp?@! zw&^8~CoIBSf^ovR-p=q3tro}IfiV9S5N37kn@0zPK@6_;mUWlKx@t4h+#RI`Oy+}N zIk^k)$S~2h)N25(pgEAuspQ`o+oo1@=XfLj%l7ClzQjcc;;fHOLHn{cG;sp_!TWvC z=F9}KakJ(?42%1tA0H7S>J83MJR~q9hga)HlsQAuU6>Yu z(~66BY--oi9UyvyLX(z>`(VGHUiT>F9Xg3e-Cpg)=beb!IsFa-Y&hQ(Q3&n#b6iK|%pkP)yW`A~@GAKNO|0HagtdgFfUA}|s0R8MdcL-dMBw%4*&t+1?o68B-Z=x_{0Fal-xj3rj%!%5C=69oln;=jpd-Df!3Pdj2zI}ef5D);I(fxg})+v3A!F9!Ys#0ew2Pf%0 zW+TP#z6PONl<$V86@b65@nlTISm@dN2_{V1jYB~-T1?+GKSqZJ3Y+UR>sFRFL601g z&!%JKUiU#GDI%KtWzvN1362|L$0tocC9~)r2FtM(AQ%IK`D1AJrn}PlIVIm3XCR(o2e4n2&rg8kKAYT zfT&Dq>uh)&U!}UgDu1+%?k&Fcm=_O`4N#p8*-M?|n5ATB3dsRO*EfJBqB{Tr)=Rp2 zHElqS-*Kcg!CBk)rN=y1z^_=`4{f#wLjKr9Y6XiXJz4Fy{&f$%)U-!fQ|Kc|(NJ6V zF}@0PyXi{7@aEa~_P0@CE;M~H(%&Iqt)=R3BW}QBdW+ovj*GCRTL@z6Quo#`n|Hj0 zC3jw!u=Vx3S~k^VX;_P>=85S%?bAz}fOJEEMid%{lwMu=nr2DEt$f?29^fhlhj)96 zMl7n@VYM!Xy*oe;mwrh|7$ntkK_&VQzf7D+o;iK=4gU2_>sv(x`Pj*Pz|E5St(ONe z&3Bwiw@7jC17(WFL+rj@ExHk>@AviNvH_t^`ySBm6V+RwH_`(_I2sc;HDk=pl^F~y zaTf!v(U&MLb6x6#wFu3y#F_Ti89kh2#>RjWR)ruU%i)5>{MaF!L?u`UV6{3O>zJf3 zNxvd~P3_xVA)t&vK{1FJoQ+k4%fLk=;!pe<(7_Hod=>G65?H3aX>YQ#zSpVMZhbm^ zN6&~nW7P8+PxY8~d1z2z7^eg+T9s*B*#Tr4w4WuW7C5iUQD>Oy1BAQ{ASCl!Os4m6 z)=#p%ahh5TyH`w#lg_UkegAOBhhsTE_7g#oPai;54rJEwSTkYP^dFUFcnG;i;)`y> z$e1M+?Tc?Bn&!6?sa_R5aEVWz-vC#i)bZBBsk=tuF7g3h5VOHOk(=0M3~qgVE^1e} zGhI=_c)8}*;-@A#Qhw&Mp-+c>g6Uc4F0ChC@mgDZQrV*!7lr#lAKvrX;~^q~co;mG1AmNSMO1U19xAaK$ZzP%KWnlY;gI>z z^MR*{_RYn-`>5I?I#Tj6G!kWuhNVh0-8{01cs83ci3ovgy3J5vi~zW7X}KrBHy2M3 zmt$kC8rORHp;Zl3l~5Q{(mJ_fF} z3G)QnKx;GXH;XF!ciM?O%+bsx;L4Vgrh@*2n6JM?C&FFIV|LZgQz{}jldUfb0t71S zRQxT9o8JKB^mR?aY8FAbA)d`FXT4dXeKEyQg0y7B-GZs~>f)4dvfoZJ=B)}dR$J{7 zYCRv5>eU>GqRB+HxV;anKt0(kZyKZ0Znx^l+?W*HAc`%HsvuZVm2hfvPIHVH&ezMm zk5eL@9LtM}Fc4{N!14j$T-NOaoUVFX>MY^85ApD$k++pr!CJzUM=l`J(H@Q~cj^lN=zac$ zg7~dUzlR#U{V72JUZL%U;P2qu5IMv>xsXPH0&;elRZFXYfREg!{>KO=>T#fwij0_v zyKp@SbuP=EU$x;08>UO2_cd6fdY%^jyr{;w88t)CWRN<_r|^L0Z#r&`?9pAv90Q!T@}M-cV0qfv5C9@l8sGY5&0zUDN{eO(Zm|9bhx zcehX?#73{I)l<$Ro#s)mv@W=EtGk@bfW!qz^7>W1H6 z&33Ge)Fm;{I?XL-Fkp+wKWpW9N~t>Vkz@p)vjjGOUQn~D5_*?)gGb4YK|l+^j)%}M zdO{>daAHO3M}^mY8c4i2dMNYq>!}hPMdT-!cs0HDX!xf~a^RZwdpPAanYy&!M&Jeq zhQBzKYG1BRCt^gqWzU{OKaPmwg93w}J8fdxj^3c@l01cxpfTTikp5xAz~{5eFF5i&--b~>=%GtJ}LCvP_D~BwpjByKJqZOLp ze3BD(Wl7DGhuRp{#Tk@ZF-?<5KOr#COLc!yR6GQ5rKgnNo5M5LBsh9{aD=>MHHi!F z4Wps_?=zzTJW2pwBous>(4T7~Wf(26pr*9nDkBuF(Y?khDm0ryIgfmW$sqJTDI!di z;oJ8D%x5b%iFY?zq zwctqDiK#OrPD2BrBtY#2+&?VX9RD34MCuVZ^TkB5N)i+Tl15o;5rHSTOw~)=;wZLA z-6aPG>g66$aR>2bS$_+ndrf!#UhB~Wz#^9QgT9E~xy`fibq5cDzGMjSF-KGi5OKNh z<$na}K6N)gzqYRNCLAFB+fDDdNNeQsRh9$Z63{6QeMu#hDCZ?Fv85!@otF8Zb@EC^;A8;s;NSrtCaZ*(Rl+beSYEXbVPsosK*mox2g+WJJw zuAJ|}DUu~}GKZ2v`sLUbxZ{Kft<@END8X9<%YBC`^|TW#h@r!NoOFs~-scE_L_Ll` zLIfl>#qHtoNf80R!VuJ4NC3!d)Ey3xKV-RLwv_zk!Dip{Z#zfd)js=sAG6f+y9_5z z=Hl{JaGLAg=4pN|iIUSh_ZQ}fYtGgF5W+>wmaHCn8Bw&NJ-mW1?Q^@v=QaQXV$~R( zLs65Ysa_Eh#EglxOK6y_tJk;q6P~pZoRV?EY(dCEbVEV$*-aKMjvoD>d>RT2h>1*9 zP?Cx-ql*M~SiyJpPb6U8zL=4&1*^-yi~=uWkj(bu`#5lTQda>fBG!dbKyp&Wn}o7{ zW(X@|x6?52`XlMGYhNM!L)pk@oc>KTREi66PHDLpZSscoj}j9m(~4-w{Z!?kNy_gGq&jP~w&NBvch1*;x zxz}C7aT~UFb??xzCZrxNF9FQxiDGo!{m(LV(=fRq$uzk^i1j07R{!VdAhrk%?CX^v zf||u%ky2+qj-{b6& z{XPPq2hfs2Mf2Wa%RGUr>WkGnBY1+!%m(fkcPLM5$j8w@3*;ZW9kW|u2nxTPC-8Vv`nMuUR5>*8acq~1sK0j!h8{<)7?M79nDOp_ zl;8a|0c#evdKO|ugo*Z-H~F8*W|MKFDwbu+7QNE>CU0`l^aW()8-Uf&`fzX=k)XZ* z=GWc`;5jconRhTC#J!X{5i&oo9l3cc%`cK5#&FU4DvSSv%E)<>t4|9!Nxw5MY|J+W ze2}r<+;J$T;PtppA(3_^C(<~fJZbZXTSH|)QwDR~g5f9^>CD@IKeZCUry;;PXdm0d z5nB*>@l#8x&$lRzE;33qI13m1wAJ)x$(Uk}yly2z4fshee0BLs356Z*@D?~n5LF?c z1^%5UTkNZGnN{Wf#L(4W4AIf(ql^ zxY)_qRQX6wSYHVMiKd-r@_XC?V=tmo6(+a?3{wlkGhnM0t)60<=u~__fb?Shcn2 zctGbtsA1!Cy-OY;mK<9C7I#@u1b}SNx5xc8$a1z|o1IU5I9bn_Dqy^>yNfVp)mw8+ zn+KTK;Vm2F=8uVlHkn&-p|J#ra@ZX?=^8& zf9P-*}QC8e7}VKCv5x>r`tNmY11NEwyUN;2nv(i5~R{pnY(1T1W^gLO1WP{0vVOI z6DOIv1zMny<610GdI^oY!#@*v#H}lpUl?FU8pJ+;$8+O7_yuwZCSLlA$+763W&N-a z!Ph`i$?t;VD^_%Id6I(de>;)DujjbO1VU7Q=k`x{dG3AfM@ltHKVJijL`t7E2sLZ? zMU}+i8mtyUP~~yF_oxz!Br-T)`YM~@V<@?=ZW7DL%1bHotz$$zoLF&a2JI<#I;l0r zZccAlg9hE=)r3_`F6k|&LAf`tnLrC5cs0)t)d?wWR;#wMYCG4)N>$G-`PTteUYJP5;Q-I0(xa91#w#Hp8bVQzYTHC_7* z-km3p@_^&Y+0NQ(ECs9Os2K1UosU+;UzX_I3Fp>rOyOh~>_{;vuAg!EeBk-~iOCZ; z=YJ^dmRPlciYHdwl-dlYebC^tM83z9J1Vm;)-j~2-ULHnEjfH^M1 z0O8--^s-vE1btgC#D$EJ_+ssBU5#$Nr1BlNx1&RWT(^=y` zLKt|5H~JH0hyDHl;x&1JQV1fieethSMO(g-;2m3e8&bbk?Ds!xso>LE@MlKTH;1<)#koVfp?w2H!!)u{HL7?&>n z{K>AGkoIq{y6r5iOj`M=a85>LS|%7m#`&ae_J=c(tF6cvXFTrk23ZkEc*AF`r|=d= zJS|*C#!|WWep{u-pI^UD&zjwwRUJJ4d@`N2xds0B!n=Mh;N6{%F;mqJ!t&S8$@f)H?3#o2+LGE@?tWp*>Q<#uC5T3;Xu z->H=ph>zzUo&9_k9fB7N}uBI;Z4%GIK`aee+zH?O2>ww62K$04)2r@{8NwPpW!cf zii-JzI--B22_t*JBiPP3K4JYm{0)jgjM%)S{VQKNcLh8m$(Q^yD%mBb47qd7%CpjzecFe@Wv|_$L_@koBY7Z=LuV;8=V>9}zM<&`Qe4tS z-PUw8@+m6;T9yvDnV(8Pw6akC@zu2f@jbyejfcv?@mi8MDDATp(Fc!TK5*bQ$aYQT zHmaX+{R!YY>)s@GYmnNVRv%k`wdT$%-8I1UzG2kx@P>xOL5LT4#a8;Acl1w_T|aS# zF!dSAFln)?r3>-_RJ33cpqD#D#SiA+TZ8H;kz^m6j6wRZH6Swz17soX2cQ(*e8tMK zOzBhxYU8vR0wA)`ZnW^YMZ)L!zT3w;dTAhb`=+J4D4UwFS{;G@U@b@$CY_i&FQ6at zgHUGG=0y4P8%s9*=~e*3BNFibVtWLVYN(>ms06I#j+89AKrG$~u)l070SPmmT+eV= z&}nAE`f=AefDD8*q|Wla03WQs)@6A_#AtYJ_`RRc5dc9l06;Wn2oeC+08+`_TVY+0 zDUbJto`9J#KCl5KFQozxXEOC*xhn(ofNz!>B2jwj$EAnq0b-(pfUx-Z?8nJ`KLAn9 zS=7>XVlER4k`YOr=H3O7h<;$II+Zr;ie)_POXWMBSdjh-yIcBIhlnk?0DZ2w_nIEuil!u1)^_84Gi&ko`+ofp9ECmQ+xPS;x20D*9VGqDX z4`LR2BbuMO-q1v2XKtNTHmM-BZW5o{`-u#SQH@CQOWfCOcppfYYtRJEB{|2vUp^`m zL;ad9@>0uC@om;hkhGsxkYeyMZ0u)~&$lm|YajJYZlF_^ULI|+VbU4;y2iep^ZtNF zoR1|YAh=m*{5mRotv@3J;LRDbS47)~Fj5F9YpNb_mXrn6fkf+m0Iwy?WToxhLc{d$>WoB)C6(6`AeBhp`EBLGSxoez=hk$J-{wSZNCH}Ds z_4nTD>=Dx!66o?uxiE<1bj=OWDf)#Oo0cPH+hY@O7`?00Lk59e;*=8PW$yeBcs+{#AkO1UgS@+Y5P~N`+!JU--@BO zx&TSasQ`G-uNkyy!hS^WXtSLywDs4 z%kGjL&2+Vc&65}X3sW+VW``2Kj~qGYMR^>Fm>xgme8@e*g1KJkx01MAsFq>9Lwxw* zQLJ3vYS*!8Ea5T!dJeCdOhv@85A|wEN-@(`Okha+&mkrz=LV^t=SMX!g6@Q-;_QP? z_vxSoS>4F#i35{mF3afk@^+F>vvq(|I?;2F@TvI>Gq!lw(pfhvK;;P@7Cg5!ptqLD z1yX4GS!k`RD;Nm4Ki|oW+Y_(7cPBwaY+;mU3rFxpefoVvi<8~iowmz*JV8-PdL_4# z2|<7-G3z8SgL?0>#oYs;S{$l(68DcZSIt^H+5+8IR@;X_CgOdDCGNcxu6yZiL^o%6 zHA0ssSTsVq0NUyVh#Y)Rt9sYLE1h%=?3jIC1M+$G>jn_OpNhgPeG=&oZOTqv=o-3C zjoZ1U{XYJhLi+TBrdc6M_3b;NlRt%=eHcLW?$Zx7(c-~KQr2{UZVlAe^{9aI7~o(x zPuN^fOxrAZ>9F7xJ)HB&UZyI>Q(?~U#Ap;SOH9Q#dzBj$Ul5xwgOs?kVM(9kDo6YS z-!8Vo*WUo0ddGjN8L$t!sC&5?Zb=Re@b}PK(9>6u%Z3q_JBqvE{%EF^o#LKKa~qT# zUkdk`fnUIbN4nJ*UTcf1s1!=RDMt-PM%LTJAho|KHFtU=NW=sMN=z9MB2r_!j z>v&xgS`^uUnat_$iF?SqgfZAQL^T)iK=$9}AhN#VzY?!Nn7B6QxqO*38enHc8LXX>t0sUmwEeImJCz_9 z{)~7b9nX__pMOX;L}W2fnZBpFx|wE|_A%SDOy@vxj6L$cRJNjD)nZmv1J{Myf)96i zKXgRd+`tyd5(>p`q(Orn1qxZQl~Yi$MB64ioDH)4om@%hottiA-g>xXQ}8LlFvXMC zluYs&in+77et9v^jm&8B7BoH?gN(=f>ts8mOqUu$v`DJr&s`eDg|os-!ZxPNA4x`J zTEvQW4y}#ox)_gta+7fU$o?YJd}D^-^;DAXS$V)lSE7=hL$1we+CJd%+Ckg!hEREpnkpl9ZswFNR~`&OOt~CR8F-Inhv& z%gHt6U6Z)^GvcqCqg|y}%0aI5M7Z=@r`c_yR0gRw&&=V^PX+99D+o(`;^6B0uKRN# zfUq%iEQer4U^e*3YvA1SxxV1KioL4P1nvmEvYvVu83+b%iMbT+JLvhP4XQjt8mHR48)06^5zMwHF(1>=w6f?QEdq1NILvcI zovBR9xGU14o|g`Xp3#;Syk%fq@Gk)wzHi5?0cFM@J|x$?;5y+s$Z_qJ3asNhNF9P{ z`P0j2NPbO{eDZxg1iEWRPY5zPDvS#N_w18Y?q&y5t@je``A{)yXQS8?f_KU*PjZ6@ z<_~T$V=_T_E)z+3yTZ~5H)V7jjms^0iR60wl&^);d)p2ems-C6#*Mal3KRp6HvrmQ zCF?a(D7Bu!`o{DAw6(Cs0wo#p_5x6NsvZ(Q3r>b5zS0q8#88-88psmAx7PtwzU4G~BNP`F z?KUMSvFaYhg853BPy3R^9!Op-r^lUgobsMB3UeJrh3T6K1~#2L7_2Ik@R0;+F(eW1 zUCx9Vg~)tJYh3ev|8tcmpj>uB={uTl<#S2=nGoum%_>h=Cu!|?`3b0I|1K_90X1h6 z)-`lHW>KvfcP+13lg7Kvg*7ZlKr?YKexWNSz78;LGJwKvzKFT~S zouUo=eYx+~Oj>_B?W`@t3ChN$*XQ03G&P2_Vjr~H94@YeKsWDlW`sZ4bIG$|kfr$= z!MFEQChdS}n3P8c8%wk-3&0SB?*cTAsJb4q=H5<7zVCQcGONmH1UJ z2ej`X3@DI|wlSwhJv;^~pId~J@DQM2)gu;a>m+o@s>-T6Rpag?b$PYrq~;6bRraKG zj+E){=EJ+EZkrp11*7;bG78ix`3(!8EKUe9^#tVNYvm!?YG;a9gE`_-Ho>?{cMX zX}{2QFMY7QaxeS(3r-)#mM0N77#P8#lhe{~#O)L5w*anDRiP(! zcX0seArnOZkY1C}#$1B+-M$3Up43ys48DA&vurhdXU0m0@*T~Wz-!u`yrMjchqUJ+ z`g5^3qVI^67!$}yd{1VJSK5NZabP!{=@Ch+R3juLg1m-2GPn=qwPAHf!}r`lV#y?f z2XE#-w%v_1djc_T@!r?sA53toOELts5F2PK4a5m9+p?t7kMV1!dz z8DkSUj<`tuUU>xwWgTwhigTEZ$bvMuB7PbvUQO=ex4+bu$vkfddNd^U5x2LgzmdEp zPN&lzDkCKmWb7}-Vn<+pi{t1LRTw(uaN@Wpi<2Eu>$DxInTzQF5=|@Se8sj6y{L$r zeX=P(HY;LnCuufc>a3KJJd%a$u?k&iQ^S zFO>6B@X8k6AVE;@T(D;Ia&M)Bv%ugQsbs=pAu-`FKmVT*X#dITskx1-Q{@hz* zL5$Y!5#qGU2CYNlSHL`roSMSt3#8@DGzG#E$V+A_9y$d~$v|3$3REb>UDC~rYU#Wb z1*-7&aKF3a;eDc7@1i9r%|2&T@%J7eFq!G^p(hK|JIH+zOJz<@AhDlz9zzj@bArxv zQ+et6E4E<=arYfQ=AGw`iTgCf(saG*CS?R6tfgIyOv-rnmC@kcj7BadMFnXnNl5RiUnn1BBdlb0=B8{^Y&n!OhA@jY8y_E@N| z)uqUcLxwDr<6?nn-AL^Cd|Q!M%PaV@P#HbWTCt`z1?$}k{91*lJHw?vne(a6kCPddBKh zf}7a+k?GiBnM@yI)~N%5fDxBCh4PvQ(X^FO+H^na^lFXoQH|bHl~pvIILfsuc&Vu< zrMVbQiP)#35Rpmv*2BD@I7my-NPN*QcFc}0^oJCMHGdv_>2nb`R&OYtCGf>?T+sg= zw^vte-Z|xlQ<}%zbco(`XnF|rA@+`7m{gW!1iW$G^GX@{41SOwXG&N{VpdI@^Ny|> z&z!}3Tsqql-Lx-?f;wjeTrXZdk-3?ejW^|)^1`F7b#_a2;?AlRYwNmUjZ7=oUessu zM^^W@>4h&7VX(-!9Nh*?pyxFyA{*p%>N$DD-3sT+1n*o{`kLS&ZrrCQa;Ahw zmYRdK^Kmh0CIM6Es*aBfxx^%f8ruJTv!ImU zV8}gJsXDPl3F13SPhZC^v~;$i7A4P{PxCq;M|Ar_u+*_6-&9e?mWi8$s_mFZ6sa41 zB0irAtxGYThBcf0dM9pqJ9=s!4n*lc5bat9R$!ka@{*b5xKKVjBDIRJX~Gwl+T5K3 zUF(fj2tCO8@$GA+%BOnIlgPN|*$atbam^o4ud=>2%A&lOJ>yT!_FZLIrb#^`;4G9r zy*FHD@qdR!>+ptNscHC^K7F$`&@vHA)A*&@2!k(a5Ag8p^u{f6nzSw0BSA~Y$^CA%sf5<6h^W^h0fy9SA>-aBZU-(>f6r_9;#*Hny)kLJaapD7>>bCK+WmctA~MpR z#8;B}j0jIQV-WB9RJPXOQ+}@^)Ax;%VsjWjC~o=qp~TDOtwXabID5wnj2U5ZaFY-? z>AG_=D`wj(7?+@+s;f-`JaG=M=VNBJ@1c@-VG!_y8Iz-WQJWyF-4~e3QWg1ABIRqu96Ujc8)gB5ZAl1+&uRwlx_>!Hx)8(y+36i;BytNOPWW-+6a zkHS0KL!e8+#`ilv67#Oy&E`70wl)jBF5W4}5rXZY7(SEjKbeZ#FN^U8+R5AYU|$;^ z#%q1I07I7QPQM{0;ZlBHP8d+Ie8$PmBvp-a;e4PCLSkaP0|`kigE3|2vx-d4uA?{` za~dlvh~O=MYS0ii`}`mT9+K(2EZs?PU>ZJ@Ker1U>RyLMT zA=sox`WMM!riR-;$lZ(&i#3}3tGRxw-as2f=k-B_=p)}?Qeuf0i95>gyShe(?G#vP z2W<%DjG^I0&a%380s3{3tBZGAuO0-J?}gRX`qptzNvCM7OA@=|k9-n1L0QbqV9wnR zgtcOuW<$G(!xcgzC#oDHUW3D#v5X97UeBF1hlYHHw=E+Zx?n7j8bxizA;w5p@!lbY zfw~@pT>$^}!Aa+d0K3S^st3o$=wJGHDOA-W!|5+-p#x174?boMdb*sv4x`WZj9lXLW=b_j~`jv)>`O!#WD znTRLzxv*IwBVr$B%Jw~R!?RAq)%=l~%rlU2^J#fOS578+p)RjnI{Lu0V?)8VfDuu| z+Q@LdT*auq{zd%qT;R3uvp$>&9!h(}<~YKV(Zvdeo$W`LSm0|guY8N9-!+k&1MqkS zpQ^KY`|yE0oiNCtRv6ZDd2GK80o~IFw1fUroq$SS&^uDqH~c)SCGeqDn>wf!H1*9= zAy=GYDZ(qh=k22gdC8eAzbau*85l(gEOJqvCTgLXU_j2{WS6Zyl%VPj<)MdBb)@e` z$n(nhP&E;rpy(^NdR5YFAJhqLlLdTaq2yi4egDD4R+Ns%kDC%=#fs2prN+!=AT*97 zRTp98IXtI4lU}}fz7AoODN<70FKfS{`~>SA=Q$jmf#T4kViER_if=)-!`uKNSGI}m{IoL zb3v;{%`NDLUtw2{v9nk-QZI zpZFf$rv8O(p|E5F^NRZ%@+IMLa~N??zY3hPU^uDb3DF0{RcfsPgD= zd4PbHyu3%jiB?(v{cOSj0vi6@_3t{?6-)pD)&2PTG5K%o^Y_0fcd$nJZCZ7IPAvj? zmlz}yi>v$T+wzZ|T_-hPcvH1UD zv1M@F>$Z7}jOB29qjfYGjPhoJ$7^bsCcj2+k7W|lFX}R0Wb_;v$1g_@iENcV`GxXC zARTe@*{>rI_Oixy=o4j%K@w-HAGq&f|I4K@gLsfr0L0e!_QnW!t#WW6RL*Yfd8rI~ zC!?~Ej#!}~a^>Siy`brYW(pKR-&--|F^t|dO+n}(G3ci!f7^&70zC`cf#BVL_GgJH zPDN8ukxb91SP=ZKl_GL3oWI1~sN&ab;{tg&5D0$#NDlD-k(;n0B4XkX0#{AM1U;C4 zJvkfdi#e|q(b4e3<4koeGEU!fF|;4#RjPs_)M~CdIgeaToZ!YRpotm^wD9`RDpz2o~pz5oo#m8KoJ-N(U6|Y z7B8(_k_`V*HZO^hf+9p%Svt#IPlWploXsIE@tlf^E6<+${rdo1T=i8s=zJQ^aJfZS zFQe)JLCf#J6W9jD;J_nw5otcBnc7~w$pIf?@h2g2(a}r4mLUZ?LPm^>Ykaso7+ho( z|KB?gnF4K{&4WH>!N@`k&1Gbmc&e0tf!uX?`HW2aBKys|Gj)}I6wp_8-30L&4adJ# zQocfoSt+tAMqMHZ7j?a;C5k&+_biZi^ zaV!|DEc>eG096)pFj0*QGphw@ny)i+={PaF>W7NV*<0-&=()z^sU)3SGH`zb_4m>M zl3)CS3r}GlOp0FxKJNCW@bQxVNtZJVeJ2U=4Xsgdin4M;Eh9CK_Zr$c-Iz`}5w!*9&PqptHkq$zrnl(NLs#BdpuZR#lf+9q zcmY+{2xC0xZnuBDG2~QR6H;Kts*!D2pcWrj#Cewvt$RK}@yUssmlx;I0$A;!_kCe~ z(PZ40m~iDI5Y6vHPi@&gPv55a6@sXdl-A@OL>Gql*e!Y{nHRIT2Oz_8uVHC3-MDxx&3cY-9Y8cA!H!*43SN^KG52lsc_+6%jnGMyXQhjes*i zs`-wM{4eLHzaO!Q9*!S$zA&r~1pSoP1WjWZ%~u zSP?QGn!X7=auu(Xc~)BHk%`t0r_bOFOc#6+*kMdubt?%q!r_eSXV{SuzDn#_zqN-H zbc=~)UwJ4thWbWtcF@4$B1vRXt8n|_4{C~W$YvyXiSjKEE@HI{sb=j_>qlFa2Il{TrFZ{Sj{!0LNT?9ui4_AhOp zjx4n?D7s$$W%n!`zA;juGWY7n@Mzl%u5dAzyZS%h8G$r_ZfuyB%1ODM+CHb83!$(8 zC8TO9`yxX%y=J8FB4Kps-%O%KrSjq$*_KvqKR>b@mZ!J@I3m?DOnTl=Z}NPTR;&$w z^LYHhEwC3T zOq?mR+B%7i9=}7yu?RgpAkG!4a0c0VBNOnA%S4PVw0w=kX9L8ahw_5g6hylJ*;88> zq)LyJMYa30Aue8+upeNrBtK(%nEUT7rW}RjHd`2?4-6VCgfMqPc3C-=LY7y4RI0>=F;u6-z)_jN?_wGyKR{I&u4F z9#YAHQ#>2$8Zh}M-^ez*i@-G!_rn?oW?Y61)rQXJi zOpmZ{`u*E{z-M3!Gti_0Z{SyevtP33@V)+;frn9xROufPWMctNPlpZ-2XJqY*0`rk zaJ?1_yC0r-k%nZ|phX(m)|mj_1lhfqA_;K3)8Gq_1NHMPHf0WQ@zxYe8V`HZuMuPZ z1^|F`0GCEf@J?P3`oM%D6`}3D^eUgbD*JQ5YFqjrl;F3z)EuU5Xb~Q#j3U)Zl&Hv-&J<=@821HBDzAkOUkM)Xwey69wzZX z>g$^u6mROcWkv3TTz_jcrwv_vWmUV@(-YKsW<3Ih6fyw#J_wAhV(v+swN#K#J^f{O zcKRGJ`qluzEC|d?uHFh8G;2;Hlmvx~k^Oe2_Oe)N9q3|3Tp<{@=kFJEoH2w3v?bhqn%MGwpI<=3D#c50fC zV|osPbow`?OjV~IpB?h^8XDYj>tTMHT58lVl?sT00}r2#3B&Oszp<2@qvsPF$OAE_ zpj4rVVvTJwze)l+y$FExbl+s-pA*#$o~3r(ag1w#Uc+nGFli^k)3D7StY?X~-9gE^ zsZW55S#rpzHPNQ`nl71-i5lv8>PsMMt zw4H0LqdRm5)o{`PVKEhyY8gitE$Knrl6i(7>pdSASM;b|OgfDiU7NbEyo=sJT$6Wu zla~rOoWYuLakj8Nu}E;%ieb*T0;I-C!D$9Q(PJ$|I8$olTR=TsbDJC%MAz%50(#!w zd@0?bln>4GI|Bw~Kgch4oD5Z;0|t&8P{C<{v9Hf3drbwY@9YSY#ll5Fz0Q7~rgL+e z1yG}>ZFhY&u+-_k+!6zQtnO=r$uJrXg0?)EYTm*?oBv6T>sl%=U*>t5o(z4t8}pG| zy9;gCa;Q@FTOn+3#?^2tE8EG6f_K(kucUg@`fj6-+e=b?^GN2B6ZEBde1fhqlmTj9 z=Xtk!N3qK(Y9g{({S`ayVnZ|(rqRO968EIM3#)S^bjgS|r-Kc_OL^Ds1yJ=^AL$aa zZk{e+3II6@I&{GS^v55CKoYP~uAuy&d|IMEIAc|AVhbNMIa@*DVe56>>lNKhVYetP zvg^ojaUn8TF7bq!577Kr6|U-}exmq5>6@-AibtTn%`~H7&lg{tZj82)_n=bw5#WQQ z_6yI?Y=exl6jqPeI7&g=xJ{7eIIw8ahuK2V7UC+wl{Ef(s6GGCHw4h@0zgd>N2*UI z0e+nMFn-o-PxE9I_2-#)_{YM)&c$8A7S3Xm$T_Q7PXC8d#}(;5%XZF2ll(m(tFRXK$?OKYEH zO$R>3cwR5G2(*PTnyUMb8;V-q+gb({CyV*DGCRM4$g}`15rk8F(W+TI@WmyRJ1D%G z`e@GUg)(32N`Hg&9N>>00RpZ8hAadM?Q(U3m@fb!FBJ+8ZcJNmQC3xTe&L%*lN}+k zn+7N z0RjS&bEZHn6fmF!2@(ZFvLq!)&QOX-P6{Z3L`4upa!!JX1j#u=NfLyAE_8pV{pX(B z+I_kAX}9Kn&<#~<%{AAUWAxE`AN!ka_T*v@8zNVO9{@f;xkQEC$2sqv{^_3V1@U^o zUIShIGWV#kDL*HYBqJ!)Fg(PXzC`VJu7re1c@!TJj{9l`?D6hQ;JhFwNZbwuAb zj=}rfCDtQvK}7D>oV^aQUmu>=&x>Gv`24e59U>e-!>#{i19<-2E~%4D4+h>hLy(_; z`K2ebOq;j4PLIWc1^p`c;mQ#pM->APbjOuX^?e^8ZtM1qYbLrSq!*5p)%QX9bKh(7 ziwaU?oydaNkrW;6!d+wtZTTtK)6Y^jHd7geO_jBK?#qApxDKi$IXRZ|;MPN6Pec3) zJ7RP2({UqBd|V6uchgmv{8{bCmT~H}Vvl(O;)jf%C`VH!#L29>WU#%ex(YdzI#Jr55mJgD<)^!f} z)d>6Tcibs(@&vBlE4W;zrC-q(Zep)}oJocI8M<;UeK>kn1@`r68Z6UMr8diz`4*lJ zk+-lbAc}tR5T7we4!213rDW)uIy8WFc1ZBb@kl+T6T%1z?`y(Bz>#fX=5jHY9}Zu>M#XnVKlcM!%X7qJEI`fQbU9-x73}4m@xO@=cgL+ZWxn zTP<+CgM&hzZ9kosvTgmDVC4n$69=F3QXs$+X|mhy>IrNMp+weU59rC|*N3oiug` zar%Xg@<282F6d7~e>Oa`Vzqpvpru|b*Ij0glgnuMJJ0;m$cG{`)ORpJ!;INI;Ts|x zc%F@ENB#W7m<b7zKd2yBjE~!dRxK@aK;K zZ`G=Ze^PPP>p9Biw@RdYJ(CfRpw^H+s*N6PKB4t7>oy$Q$kyGBn35&5@uiGS2& z(heDhBf9HuR8;E(PHK|#PsL7Z2nbz?HPpmTFiv)rWz}B31iV#0{0L^>pNYG=vg@-m z)FP4ZjnCZx__7MnDo3-b2}hot(CsnN^+OUw=ATf;=N7?hs&N? z$YKMYZQGW=_?ylNr9C(#PP%l-bETw36HGT@@-|T`)ug7@VEWT+l!5Ps_{C(`kyQCr ze>N__ywK+{oS$0X5#d?@BH!}-6ycJj1o4uyc76O1LxFc<6LNojd(C-YC-i4;zgR2j z<)B1dt5q1@eGR;d#FfNNYaH(xyT z^sCYjRx1%aW}04a5&PgD{|ut(R*|8>KuR(R1md~1l^gFE>y=o=j(1bWruRi@GO4KG zG-K&qZ!~O45zQ(V@=iq?M-kr-$qR#}MnpC18K^0)ABndwE~#d4T+@bm)`+&$g@-3v zn}bOS?;|e=vxS!jpmEhHcU4Fb;Y7x#WkHS&CCnjy1rsF?eE+N&>JGML#_YM`x!yhzrguX|Bxe*w;Rdzd95|_gY|qe=XHiymF}(3E^8DW8AvbEhK#)30k`0imA%-7cze-n3{{+DgjQ`VOA1vedTGN+R8XFhX zMNc*l6jjb8w{;Y3dvGKBm46KyFGum6(Rci`&39)-z31$@dn?^S-m8}M#~%J@Z9!>t zofDzSFG=4+Pbkh=nHq`4WgEP2{lqAj6s8de9M>{@&Ko7OB0}WRMy~^*biU@dte45| zCm^o*R&4q@Na#qEkxAewz(y0!Zd%!)tH|xw$a$*hm~+X19!|g(SrqNHgww9*Fr5JVV`U-1A|wfpvjkt-lIJHMd41 zVrCj5(|+x)JI*T>cZpQz6UM^E2w+rR!dD528_jCP`~u!p>e|2Q=;bc7*dEaPpn%g% zWCdcrN+4la9m$qq6PmTq+6Tt-&4SJyBMv_3FUZ-eFH>g#cr~kCyQ{e|Iy2O<&QdfF z#0Lg9!??I2-pJlWf%t6B{n#w&Dm*9ue9Z4dx-y*8;Mk`rV~U?^7O%^mVtIR~V^v}& z(^9{my=*urJ?GG?^8v_+z9%$QdZUtIm&k2+JZ+-Jz42NH7^yqGAd&f^ZT?_7&R7wW z_FPc%5*8;_nc|k+x*=1TW+B7iSbFzR)G=9WgtN}lw!3Rd3q=dYi}uU4?TZLQWcH3K zk0$Dp8k|komQF6FLxUB93!B}&g}u-3YfeS)bjG#5pQsNooT?%NUTT^8 zh>2TPPq$mx{O*T}(Obxzg|%q+gAC;w^_rvxP1T&*vjXh{Uu|W2?X`MUP)(a>dJ+Ce|}L}1nO7j4qr0> zscppb$Bug~q)Z^$2`vwg!-YM$Rs9F#D51h$!8#dt(@ZMbr^-_|>CW;&5W6uHngwD( zs8f8Wl?u>@f|HH~_#~jZQ7ah;Ylo1VXE5&uCEeEl%}-shgL#l$IqkmK*TlLHWGh1n zfqUvI7s|T4U7j1t&py*x>39N2C};4XpJjcN{D6Q1$Aw#Wlz-kGOKDG|$AGSL$&6-} z(x%sg64Mhb#RO6OQ+%DQoo6G4aZHLf<-QiH12*p9opX-pJ6j;v``{>PrEq7=WQob1 z9W*iqcj9LO!~KPs@wy8+D8wWn#hMSTka}!3!L299A zSXTH@C8Fp5jD!UcFn6uXZ1q*1jBDR80a9s@Dn-27suuxgW9krx;D%ISFgpi!!%vTd z!*WQi>pXNP6D;`SMo=VV*-tHTaBV!@3bFoYZmJD0p_p~|yO%CoGIxeZ5o6DOfh2)R z(O~d5Q2vNQQ^kA?`L1nf-v`ylU664~cBM#3fiaSjV4gr2&@XB#8eQRz248eDN019s zD|N`(wo=88IXIkF9dV^1A;-ZlOi8vX9aro=U}XUFb{bejfIQ%N6O!tMGeig#dQ@Jl#QYX6h&yI zLu44U=jB@Z$TW;PPuE`)NQiOOSu7+U(4M*|ZuhP8ox_jeclU?-#(2*%^IK?Qg=Yek z9Ha}Wwv!zv4jo#XqZq|jHjSzR-~w>yQS+;U1Cec*yHF4lFfN06p%KSjV*a0JeS`C{ zLWpq~MexxHLT%f@&h^&nG6MjWcJ+z($0|x( zc}-yVu7E9L0hn9=Y))RXG}6Ow{{d@j5T-2yxvmx9A%bZj_r4ievxwdQF1&1o0;ta0 z=cXJ6lX`p52iF6XeU8~CH#_k4C!jc3@#vTeHC1*mj{I6>(BU3@DKF}SwAPp3KtJf~{P5MvV zHQS^2L&-vlT##+qkzX1A2*`F}*#Hbm1bb|_(Qxh`FMuzkLe+@Wl$5Y(sw>BPElT8@ zzO`iy`_P<)Dl&pPHezb4`P*Qw+Fe(WZ0XU6`I-#V`-?+qvB3I2?|(3?2kEN>cmC&H zeJw=z?iRp6-*H-QDO?&N4OgX9_3GyW!UIpW-+L_wh;-u03%!t5;y_qU=Ao59#`yRZN=w*C((Ntj{ z!q*@-Qg{1tfV8xw)0Fs&ToqEn%Tyq`rKid9Kw*9Es)gPwOm^=y@}FmMsIi|T+#j<8S-Q7PN(F#r1^X#3YA!yF zkN$f=-Q-lhB>YnI9!+37J>-e% zE=ZzUXk;o)GkDn)P8C4>lABR@hKeAJF{lv?JG)w9_FhH=Xjldiz&xov8(3jURu07SVo-oNKh z7;ZwPt1Rg1KN|s?a>|`CZCK+#Aj9?9TimHLpO$})t%IZ^o?Zvfyu4jb-23ln3fB2nG_pUhcF(_@iA!>6H=%^Z~lDL zpFmE>!Np56rdl1#G)0?_Zu&E%`)lwids>!S^g(g%Vf$_DsnD?vAO;;@0WuSJD{gKA zu?+ShycCerLx}9qq`U^F^m#7N78uP33;!%-2+m{KX|%MKN5Xix6hWYr(`#sI*$Qv6 zFggotV%=j1y@d4wAL~B^#?`Bpn_NyT?-3g4y5g5Wb+72Tr)y|$MRXd^kEHHYK(mv3 zib-N7p|(M%7J^8($h?&Xud9DOvXY*ZqZbJ!AMV|M-`gxqfQxOIPJ#R1^XQr$p&Mi0 zO!uuFOuc_C(t4qmBT~Tpk~~((X0yFDdrg2XFoi4a#!XXG;dfy^8fgDe0<_9U z9c`JW?%1$dmWZpQ2yVmAKwz9@sT+kxq0WR@&jNja`J%MaCR}{((Zpgn5lWN+)`Rfwc3AAFw_5yERmgx5$}`WknL()BE` z-lL>ILdGF2v|j&O3k$9_MvQ@j7L0>ac*J@KTY<-SlSQ2$Z@oO%B;m{n0)4FRgLAvk zE5hJ!v}?JQ`ZpK=3jgerMC`YSn!kG|UO9^+01t>h${A=WO=0(r=Uc3>T|op7m++{; zdtUL_daE8Ti;%0py3FHSrZt8PeFyCy2H{dGR~9^_h#LHAj*lM6olnKzAl9`qC(6#o zEezx*NNg-F0^{&w2cEbp(OJB~Yn*A@?I7}oCc&CLb38zA)UQTi=~0x6Uc21icOZt*>`ANKVfHtkk|KJB@xHZ38f-R}%bl$;yCm5aE{Lp?M=RB9+Y+Ai`N%F?S|CcHkw zEIV_Nl4sqkcHK@CIU!R+qK-?~U) z&A-ajmcd3dHXs1Y#di_d7$$1Pb&{y2GmHb!*!LT5;`bS7D1y~f?_gNI?B*JoJagyB zh9lveP4OG*d@i8B;lT)?gOJSCfdTPx-a?(gZQ-t-v3b4BmDc*uYp-$alw(D85n7{- z^Qo>eUZ7u{pO%5Yre64jVO;@uE1!J>pd4*z@p=Bn!GQ#v(`?SmfcfYY{v7nxn5YxV zN~S!bcgIv{i&a>?ey{uv)6Mo9*i&a-vc05l4LdbP8~xhJl|lHmK_zG~YL_+yyoMh~ zf6>NXQ|UAWchDJZx#3PIluW^FzWC*C%+^GnDHBZVCWU591XDi7Nc;BKegfZ1umnZ zO~EbG`43GzpPi?W^wbP7PygKNPq-<=Rwzr@kIPjJJkHy6&`CbJ^LBw?91JRWBaqWN zdYbRl>0ybF6#9Q~6(j~QUN|BhJR8CJLq ze2c}TMx6qEQg;0;jt`VBpj8~mtITgaT#xu*$Z2Xc0VdnskdAAkQ_Do30I#Eef~GVg z9A)tLtObfm1F~?-ob8pNe&MU9EK-!$r8(-g3bb?G#^W#?`#}BXy*2GN&3P%NfLnQV z)9rWT>AKRwo2;{VB5kdG(Xaluo(ZpbArM~dSSG#+|B1uS(Av}D_rAWq=c>r`MgXwo zKyDj_{d2BpV>r}xH$kNa{urDCOatYvrXV!}gQaT#xFF`90L$6`wSO0&y zX@DRQNVG&Q>GQ>(Gw@1E0a6I%9q7kbNdJRlh?GYBVL7$(0jfCRy_j>B2Kxxkx=$Wi zk5|BTgw+zVLs!i4x5WPMS8VWBCf*SA7U-aouS5KQzTDP(U3sHmHS&-f6vz6x|C?*o zwbPyjQZ#HZgrSH={|VR{*v3}AKL7!HKA_2$-gf2t0Pcei%1WNw{?9A^WFT3m5?~oO z(9or8{(Uj2ssH~sTktKl9SCl4q|i!R{STOpF0j|Kd_Q;70X(;xCqPaA{|dpBUIq-C ze2G^s;AqZUHK+4bwO-2TL?tN|@nt_NmmId?bOncCio=hONh*QF5c~F4n-@Su z=73|i)M=74;((6uiBZYdJN~!BG_cQ+1fWJ$*EGN&-n&igES_-d)H0nw7zh@-c?P^L zj3=?;%3nALAi|xC75+*6UNmAwUOW~|QWP%}cVF4cFMIS`uE^!KRZ!O3l1BXiEpjLq zFtHHyM5)J|wT0?%G1J<|_ZH7_y+L0Of~v`EXw%+GZPx^EuH6Z^c=R{F7aFeZr>-US0;gLqE>xsxnA-0A?;%6{`% z_wQ!6+Ea>fHo$_gE8nW)d3k!SW|Fy5zUA}pwPct?DMynBgi>C8wbVd7pp#YBM{`?J z=Qotb0sB3$`C##x9AG5`qzU(#JpX3-=CsuKlyb4M=L*A}c0=zoNp0k(8Tt=j$!We+ z;-PyMD<^#i{pEFiipvkT!6XW)(PC}P3qWqZ3!L0UKvh=*QOTS^x;#RjHzh!{Wb$`An=(T))@j3lk{ZEk^fy8 zz^$1REPb9dV1K;VxP&5Csxc>Y$4^qG1Rw2nj_bTy1*v0*5^FdFx0SmfXP-o4$v@@Iq=w|07378%LjStTQ)XO$1WA}dURb~ z9tKYd;02m@@JkV9TJMeW&b#+?rdZG)9lrZMcDo4(G*v+7u{n3!Dd#UzJt9aC%_ zXj7jpXi3D`d@D#wqp5quyMYZF^Yj6>A4y;$TMB??4c3F?lrpxkT(%1kYeNRIp`0Hc zd=E}F7)39Ve!PF8Z*Mbe)qERETZJ>dm3_zW_do=qg;|IYkJ?}oCJ)~yBUdo@q-Kq> z3`2xlCii-DI|EyErbZaQph%J&BNx|Gafmnj-*1HWpqG1$t&X{{C5lnU>lJr!BcP_) z#whIQH!NMr@ZJiCkUw&v5?3@E`U_-q2YJvSMmp0>CAihvsjmo_0kDAsJ!uNq5a3x6 zf*gVH8tpmIHBp3lQ({)y|JlpZmpGQ=-sbV^Uit`Nh*j@U5;pJNQ83&leoB~|%VrOW zhB|#dBt+}pPX1=vU*nlE=VF66UtWbuuh$@Cy^y780`KfIDkxtte)yk_sP-+vFQ;(h z8r15}1#(08Zdk(;{pNTi4K+YvpF>2*f?facQSxXe0Mey>?J5Zih0OOLP!Q4kBbpM9y43I_G3((O5%eY~OOwGsK<1dLUrQ13`PGjT0(W&*iW|UBGC|j>qN$Kpal&m&oe-NThDF#?x7jy%y#ofLf>;5 z>U~QRL+;CWfVsdN=r_J~!GdOx$N^}>NPvNh1zJ5<7Ckr5vchzom;iFW5BP{HWQ!P3 zlG}+Hq)6SNLDIreL2yFLnbs%ngwh>fsJXZVh@r!gR|R_b`gtF@z||g}RC9luo<{UR zK%w-%CT076j|P~#l1-Vk*ld$Ee>IDz%f7286FK)@hDs3+3_2XE?n-}w&|L+>YSnr_ zMiwvN;Br83cwaBM3h0>iHC@SGXF%8cc8n4jHMX*(?WqQbM-ZGQ zK54zw1WrM9^d>bmec%zqX=eus1$DtqvHlAo|3BnyYGW##$hnjctUR6tw-rvA2S-x$)X#$>R07Clo=iDgF z;$el+hy&o+Yh}N`bJA>PkA#HXHa0r+jymxMu%+0?Vmq#B=;zI`vGz1YSz49wzb$%Y zdc?CdT&wxHyiRZ_+m~vkjx4PI;(E5FZvSbW|Gz3T{tI0I!QkKG6~Gez*7*>K^DiXw zFC+qvgn!W^kT;*8ivLGI8|+>oC`0Z}1~W(k6^I1H+sW{^jJT&v2x)yFJ%cUK$m|1T zqcaFW!?dw7B!3H71!zUmU${S687pE*7iI9^%SA0PY4}0}sCVQY1#6U@1b*-JmInpB z%sI*8K?($%C^kP2!y0o_9PaIaj#C*>ZY4odIgm3Z0ZA+*nX8q@cZ$t{Hlkq8$DXh6 z1%PAH92hN~aN-^gCU}~fJX(FP8UHzpbmaAQ&a!sC{6vMF?+pcDe)5ju+$f~(huqbn zmPi-moqDb5d^;YJiOd13+)}F%(?E(&U_7wJ_euykssh^mhM4*~bP-G@f(o z0;@#=Vf+Zhr7I9g9{kBs%UlU=1U~imAV!Cn*28-58mX`7Uq1pUlfL6S zX8Kky&g$JP9ZB>4Q zNESJFaggx603CGw->))!hYzROj(bPLxw0P~38J4c3pcnSsl$Q**?u4u%;+7Mds4dr zWw$B!OQ8}cMj{Nj3`hUH*t7AsCvo=G8<^a-DJ`wCwJxnVZ7t1dNwT5Sb6QDubBBs8 zove}_o%`EY#T6jKsSgfpp1Vk#xJzuU7VugxA zBp?!&2e^IEaLf;f>vd?}R)Bz?Iuf?~M6mh*6XW0z$k`=DtYHmm)#HI-ehTSn`&uYK?I-OTzceq(aKU?$Dd@$=nMcy3(*watMCV)zlp z&CVO&Ra+>U4WTgP<=8voRru+Jy=&Pz*G)u zfv*sejrB8_XU-V44y=5eya93S8yy=n&F6Yj{zTA;`}T1$=~1n76w4j^_XGDCA@Zac z7+Ayis(Je}sOE>K6H~kSE(3#Z5y)xylgCfmInva?Lm8nK9Z7BiKR|2##$GFoCBB2b zMhRJ(Xg;?hV(li$hs41ydo4Wp7p#+4_LHi+Hdx!cg^9VpinWbVg6%H?c_W)$ECPV> zxOROgvomUzykrkBBJB4sMKjUSWzQHU;16auKah~4Op9ifj`w3_0H^Kc{41VaN56xV z$)n891W;aB=^pvizNfyVP?wAt`AQX4S%g7*DLp;Y{q;KJtiB1#U9b2CBS*1ang+O8 zTPjgV4ExId>I~`O*z03RB6&213TQ1BT=QDX0V5Xl+AkddnNe|1 z*2naOX&Z)$-O6Kqrv{>_%B#Q{%s#_F(BvdeT`PovKB|%TW|R93K8hv+lCwyOs6*yy zA;0}d34LKnRA3C%6d?uMz5{^x+yy>H&eK@XH7o&k-Iw`Bb3^E@dCUoo_%^XCe@+_$Q>{GybKt)F^?UV`7^>!SPbA@Ge+#1(gVy{Ij$~R@7!%yx>s?Zxff!AREI+-*-uyuOTR7NwGPI~_oJCZpIjI)%?DMK~ps{=+LG zCZ5NHtW+URXw=g>Mw};6>m#tA$|xj5&JG6DX*((raK>-$KBJ*hH?SQQS&*Te&7QoZ z2>=|K0Vdan3_{?9FqDjG=*5hhMqSs9GK;y?IqK4JA)eUh26h5n7v^e$BsZ*9Lgjru zPizbnR9yfbOsUo!c{Bt#uKcE^r+A{yEXAuZX&6OeE3+b36hWOqgD zVZ@^?UnLp{80lxl+;=(081>PGlaG}frL7a;{s&Yg;n#Z<)E|1fT%9;)eng#-8aht) zdC-#G5ysX~*_trU#0pXYA}) zis7qB9hZ;o-VUENxo{zk7HsCK)q)8F^%f#|S0Y(+&$$ie9XT3L6RN8UPMRatvT5d&<&f zL~dPU|0c+iMwrIPg)+amv!2O$f%|w{5_Q>C3nPBD+@@AsS4#xMpPcj7`e&OX9+42J&qD;jY3Vt@&@UUDj}iKLD46k`M>Pz2 zew5!xOf?Xd+gyKYKW5r}m%uHig{0^-D^rvgAu&CMFe~^;tbgeB7*FTAAF*E%&A;5tZA9tl;tZnRN<@La&gI!#p< z3RW=W3AM)-=cGp2d+cIvV4dtepKl1ts>X{>CaJ=%naI;Wkgg~dImCG+Zy4S!mHliN zMD6eDTJ)61EkJrw@lu70@7fphEv&f1dz@{R>!Y&X7snFms~5jcj*o7-cFxT6BzyJ0 zIipdas=I>&#JBFF8mgqP4FIaXX`y>aOjY{;yFor%H>P2&yLj&aKAOV zbO~6aBAKnzC^%oQjwI2@itLh%$*OT}UzI_Sf0_0S$#Ie2C7Qnt>CeDkAB70`8PRLI zNZHU6B>+1a3{aR%jVi+XG&7sw2qJPe@<4s3W@)5I;v(Xra`9BC*zM7hnTtgt6!hvu z#Bc3pP=i`M^8RL0;vv4ZP7Ql6zPuFq84Mdi1!!hc5LL4jU;-wuQVNWnVMrxtljPU? z()-JQtKXF4GLpFXWohCIDDKHQ#bypzN{W* z-okO7YlFkdchHjuzX0T@R+>!JJl$crq0G~!fuvk?1K5EmZeqWvy=%%F!aV+ml^JPN8Jf!>Y@)}Z zl?;N{u691DGYma-$ulJ8k|*awxKZS?JfKX%*aE&wEo=x}OGrKK-~8!{PXpbP+V#gS zB8SZgl%8VWrs2g2_8MUUMkf6z%!{GY3!2LphLhE`rg~&Nj4KuAdy*V;Yb1s`j~0(F zS{443Se-sH|IWC}&%&=b{eANRe1pVJ-fV5RLyRK!+-Kvh`j={%V_vzU@-dHlRcl?8 zoX5WZj;v_p55H!)%`LSXofUcZYD*m?>`=HXkLRWI^E~HCzjd$-I?k(}aD_|v&3>Nv zk%%g10!!LBB`=^)7REG7MN@^46W`|*P9+KqXpUeQHp3xNAEzlBoLc%@O;1rJZY(_? z%QmZPwcsUIa1__vmrU(;%C{{f!Sf1d%P@Re^OQ8gGT}V6pK>(hn32mVw2~iZNl{Gm z(k}#u@JCC3`uXgFmwdDAJUJ1$gmmxAOGOpSi&~_J!oabGYqi)$&&JjUoK-8S|JF6Z zkY3XX9lxwv5lvLh(fQEJ9{YgacVNA`qQ<)%9Zxzg!_;S%hL*S z`F$oAs=q={I=bvB4ktHuPLI#V)soH1(mnN>xcDF-asKq~8DcgQDVU(bAbF&DVu~ZY zG+OU;4`Tp-cy@+PWWs%BF)#dQ!zxW*^k%M)SS0(%q>%T+I?M zcxg9~z3k?xbE4TY&$q`G<2j}4Zl+AH`j36i#%(;Ri_=&Po|85H%?^iq%Af>QD9r^M zV2&`i@X5ucgy}R~?KFmkr)9KkoJd~S)2~8EdJORdI00_;?8Y6yh2ZK^3MD8(Pd=m# ztb+a2!lql@50d+0yS3rMAC&gne4-L+Kd+DeZtWG5V&m{KT9C8C*l>)AOzit0LwT+D z;GaHhc=%`egn1ICpAUIGzzvwIcz;ZN(jn9!mrL#SvKGF}_$>%$nhtk;fx@Ueg*a@* zvD(9s__S_-l7N=n>h8J?{ZcXRQwZj`D{aGX&8u0S%U7ZOHaZ*N7c?3lrU%0`&O?C9T;a*~6OUScI2exKI0 z=boYX(iWVbfl#BG$XqE6zx?a$hhSJh^Y&~0&5Pf|e3I0H>P>sp ztT*6@-wA9b%x((auPW=lV$912i;Be3Eb!smrx4uw2CulB2^#IP6G?t`uksd|IIEZzH?TFM;D{2bYFcW?&ixI5Xeu2=dk4>seRui&hT)Wp7OXb z)A;6Q8uD)bFgz+=#;+uz^IY(GdBW5*=0=M1YK2pwWrccos2)0>)xA-9TaA=ZCLZUc zNces^5%4R9P?&b*VH7+@wjx%R5^-cr(%>r@?|XvXbT+OOd=w-|j8^C)B?(EYsO#_Mn560E7)Wyv`KM}P_v+khcJ!^L$G#-2;ArS6E%EP4YVXd| zP#37cA0mTmWS0(s0L$sZRFz}(>CeApeOk)ssLMY2-l@9#^s4k{D*;|(j7_~P172Bi z_g(o&T(!F>L&cK;&t~t`%UGw_$hTnzFays{~q)JrkyflD>0#yb*YT1t)`=PhpB|@TaqQeGnc+qn%pry!0%dh>Nc#7G}&H@ z%EwY*N+|b@qijai^B;h5CG9RxI`yp__h6ty@2I%s$Fp|~R2DzNXkjj*=&YWgQyrK= z_tfhNgH8%6q+oCvo_e}2`r_j%y1OWs$i>UTYTsb_x8q|5w!rGZ-OIPMoDfelw3FZB z5?8l*?D+c}Ls8*mT{nHos%Um45m}q$u=8{NyYIh0V+cQZf};9%KA?`&5jUS03;fTD z;UD!nm!*{oCvTk%@(jC;^;C!HiMU#cUSICGkWN7u_r2Cs67z!PzI{J|%Cg%?Rm^PH zMYIS*;9DQPJzoi5_XgF9l=%!E8w8A~YG-J=;cUk}&i`b+MomeW3ewn!s6QG&Qi6Q_478pE~jK zWA;9k-gpW^nIxR@FphgLgn@9_s)m3a2+Iw>oCqOmggr9)P2eZ9^@Dm>Q`pbh!s zXyDU)I;Trz$v}zOs&n?9TeGHJr$$UR&gSK_bsB#)b}AGrAzl~z7x^rpi-{bX-hEl+>wSv$cp}DICh4mjPlW2y4$W8DgY>aG z!n>-W*`CQ|yDFx$=r7p!13uZo7wZDQXR|vjVK$oV!tTI7I|q?_&ByYW)PK+88@)7h z@)q-wkO*FHeZupA^Rf2~f_)}tBre{AgCO0vwZXo5U-83J0h2&vpRO9g^{-bmW|Mh+j3qn=!ZItVKGxY?0R^-I+R4rXgY~tQ2HBALwWdvbktG4#@J!_DX* z0o&67f%nVo12lzd#@dZL&_BU|5VvgfW52bm!>iRn%?p80-t~>1{*rX{Lh$@*n)L?(*{GQA7 zqA;|u^yU(gP`g<0y*<*aHm4Isb;BrNA_!MUa$VGYj&xVNE`OC4@63l*>7{aCVQN0CMEckW#8ze`t+|~ zDit&aUq}MlDvHg!FQUH)*d)`jR+zh1bvYIpifIp~Nz(HkM=rPQ)TKGo(P+db{w-d9GZhoI`mK)SpYj=04$s zGXvD0@CLDzF?D$|g$dfbofZ{T!EvRv-`1k8#SLTnM6d28 z9LLsx)s=X{rBtx38)iS%e9!;!2;l&!Czk^omT^i)DM&Mk9Tx~k_;7IRvmV-T+<1cX zB_#HWSY@6r+u$U z3+46rO!=CHN9;SC$;&7(~Y*zrIhw%-KW(b;9zTw?Z_^DT?$`Vsru@s$}IF=*~) zy2`2fV!t#aEO{)F>G=W*1MUPh7(?s zqd~VVacb(rzp6$B<$cOOLr~}Et8)5 zgSpQ0g`6rFM(^~m_JMulmaVx`T-Z@z@mj=1O##=?k)OAD^wADAzj8S^j=YW%<@(Jv zgL2>cQayS>6%)j=oYll;-XELj%@Na-Xc%|#i96FxtaRu_z3LPcDtv+aKH}okaN*6w z)$jj!0k{^P)4dR^=FfW!CH7uX%B0~`Y=^YeoQjWKU+O#($4gn4V_OgCK5J#Zf?JKF zRKI|H@gQy7EfvGj+dg>mlhpn>2=KFiQ9Uct-&@1eQ(qQUBEuXZW!@s|-mU$ZdK1-&hE(Z?Y$p*VOH9m;1adGnax%x_*297zLzRaMF4KJtm*iO&<(xbX-Ay3B5lDeqR|}WE3Ct6x?P?e?Xs3 z3*CvH?VU zF2a`)V3%EIsl4w2KAoJ%KY4HW*6^Q2Ou)RL9O}FZeH^&STd*70sHIk`DzF5myzsA$ zpNsnbT|#Kv{JVtz?!tdxWEa;8NH6C;y$*;5Hh{VEvFTeM5gENWrQcpd3XpnLLWbG& zBW`mRP5A|-m&*WM>e*%$82g-@d{#&+k$m{Wf5OR?{(`oelK_f?D+9zP95kH@4elmc z5hoL2YX?6cZTq(i=3xLq%f)s5(Rh{Df-2ka=zh0{gRZgL07RR5; z^uRw;^E`$xT)FeBZ%*6eqYl2y(YH(n2;u3OxhOqrPbUM~*~_oT{*>OC`>T$ARo@FG z#`$V`eAaZDHvy;0LGf^sQcCK_gZ{Uq{`;R6b5kUN@@O=B)v3rAT!9_nM73*lyjLm+ z_d6)tIrz_=*#Cd*y=7FC?c4UP2vQ0&q)HA9pi-g&B0bb7D1uVbB~nsSQUZevC1cQK z5F#*iHw>Ya5`u*EfWS~g=X;D^|LeZj{jB@_{;c(U)U|}uGmhif_usZ{`*ot zb5f6G<=J5MX%+_E8jzNqFLmt~DO`xyX(LyRaX)ntc3F3R`VdGLzWdG!n%Z{DA0NDy z>^uhYt`7XNXT1+GnCsx(?m)i3`1=KrTK^ui@AHe8+BFC0T8rJKiVoxD-kJrS{L6mw zAe=5!g;U`AO?nnZGb}YVF-k$ao?m@gr)f^Iez(i2h2K|~@tB&cjP9SKjW)8Rp|kv- zO+lT4RERrNOul$SHxVv~9dfAM{1L^x)pu9gv0ERGMw5PH7r0IPcp!hX_upyeVxh&2 zA8nOC%81dm1DCol9{sHUV`2y`D@$A&Z?sI&?r+V2n-4n31y9&F0Kw6KF9^plC2s=? zp)vyy@pF6MPP-I2Y4B)t*`r+0Z@*3cNUS4qeM5rGO$T{E^0EOtBJNSq8Yv3GIML{%^^zkd^e}B_?8umey#wj9WmGh=VIaZS>Ql}pXe>Qet9vOzx&kAhQtS$q z+jtMsoUrFFRFL-jivMlDpFby+vn%TTMg1%NG3gTUuhm7)i&9+CJ((W>)Nx5bnPh%Y z?BzCC{i_t(yc$=3V4b|`EbaOWB=L-c*DTc_9_;cgmM`c1tgg)ROL%`KJQ2Cs~pD!4rIicJRDBXJx3d0 z?hRd0WGcON!JO}tVQM@E`!rN~^!+4RDX@&ixds4C(BZyNCsiIr`@Z$_2T>4C`;Z9I zPU!oVO?o-b!le=gSqqi19^;ukm3dBXkG&dqN<gH10D#VAys$urQ((?+DS`$#>%NWtsd%q4OvG`}nr|eh!xEdPM>^~1yG&M9pkRlbM0hUm_duHWJ1AH5Uel0zy&{_1)@hY zm!4(#6EKj?760vOmFsu-;ZzXf3vRT8R9c2Y0TD=mC!A$U_cbw<5-@~v^CjHo4)s7% z0uA-x7|=)2h!7ST@|T+-6v}YH)Gpf5>DMmQGM&;QA!0LGVC2{w*9Rz`;N7m9j+THE=PHy1?f|oVxkIkX`=*0?DmljIaQyfx8N-;JeWo#SmmR^QCL{gvSiny!gM`X_fM$YaqoxTGRu zaJpM+F1eR=&H>~VWu)kqk8js)$HeFilGF@eH(Si~TgqOuOY>#V0oRrYf=rIKjY{12 zLki)D_Jn7hy&WUN!8=M&pB@5bY6hBWj(SFQ0VLWVTAWvC-QaDPf)#=^GS*&Q%H|yU z-Pn>>?TRcdn0e9H+u$Yi4Z25Tv@=3Lg~CHc*4 zO>z1CpFOuz?jNdsl0E#bDLQu{+Vp5WZkB21oQ)sf2ITQH^0`V;a4%4z80e07nI3*C z+yAv)H`@~rWjJcO3O&^8_QUJQ=k76%m`lT0Xkp zsxV?u^8=)+@*GW=o5V{7hDvSrXUUaDhV0UdT1QfDUzz4zp*7t>RQ5zA?8|ni<@W3v z{M|`G;WG%To9`E3BkB(?sp>=LMO?3e9x@7);zc>`r-NS^Mso8zvwiua(ba#OkI zg42Pxt~_^%H(2pr@D*uOuDpUWJ=Er!is&<~!c^|JYV0mJ@~LYEktk~M1kASp!QWKZ z1cPVTa}Eq0OLZ!{!4f^ofQy>ArTlg*0W!2Dkq^id+qXrN?JC5SgJQ%6a0*6ch~&(H zG#pFVR{OQVQlz7i@1w!&Vb*{$L=csQ$_=1{rww#>R!-srnry?R5l_dntzV9yC$Qz;yi-wS1PyaLIhFhH5_|#L zG5wz`g>WG#N-YH) zR$fbRv~F4fiZ<)ghY1oQD66CrH4eZ%gxL1<+OBe^JH~w~Kz*^~E2xT|`EiLnvyA>S zT>mWqM^LX3c_$98Hg*+ZnTd;j1nwt;|rg+@V*^^v*L|U zjC;n+P4HSyL;G*HKTy;%uRy|GAP4v2-;wP3x2qAeB|U( zJR#px#a&8WJVZTHc2`#ms+u!Mr7x{(A%Q>~zbbY14qyB_C{OkwV$~5CbX#VZfE-*f zr@DKQk)e92NZmk;)#0-`*P;p=p6ZozD%uXDfBi&y+WCA=4@`NidCeO%VXeR0zB#zz z2{d(r%hr=GnRf|#v9J&CSr{zbdsug9256wQ0R1`V!VMQRa9dC z=RqlKR_ztrHvox*)g6_GppIIeXnt2yoKA|SVAkY=59j=LS+>d_eTK6}2GV{IC`%XY z(nX@p&7?lP;r8_kRXMF_BL#!Q#e|L1$80Pv;tbAMym}tJxO!NA{)Ao{HeIgq5M8`R zW!}}>Kybw1HpAF3Oo$Kp$M*+V5kVvGxB5kF{N_S2&c+s1cbB0*Sjmt3z`3Gg2-{H@ zPhG|`$b`L9C;jUHFB$h?88!twnz~^^ZMDhhdkJp$lz8LcMo#=Tf=p2%eg{qaL79nP zy*w5JX|QWawQl@J+IvlE$*nYetU#aU#U=O>h>c@N107xQ&`r8mbC+4kKFYG5GMtg()W4w@ zg7RRrAZLhE(#^%<{C=PB@oFWHP&Pz*U4g6XQibisT;U(4s$gO;rm`{lr^30&1IQ4$ z)^i~@dB|IP>kB92g(%*u-GmBB_mnU)ggl2C8COee=CzkE&OggH@gJr-Pu3P=QB?NO zc9ss;G805Aa&h^(mJ{SrTUh{sXT&JU>=f^z18r`l0~mfcCo?D2;#4b&RY<@xRcP?T zWeB4Z@5_+P*Np{SD0C|(2g;t@QAw{BVp!lOr$)pw!pk{{XoJ<8Xv{sE3W>1$ldXd> z{BDj{MbYHM4?VZF2c>k57uPq}rizdibgUvjM4A|1pgg53w}HYobV@|8TH>(h_&}5T zs$1$g+H6kVwj-+TGi6VBlm5a=P-k$E>Wti(VXcdo-OfC2O zZiK2sK7{O?xsUubZkJh=N9NWS-+8&wHSik)*|5vjPa8GHHerUVOYeB^mE5ImGm_1f zDYlr;BHZK+!6>9d7d)=M*C$UNFSBY8c2-nq?z-H~5o`ZuZ>f&2Ax1jZ{%qoDC`0Ns zGed)+5##K;(f%7BBSifO{F2PCmKhmP69I>V0nAe(WglKf72bZL2WtZR3$*bE`3$hF zjNVFa{(RpMUNLlDO_yPMgxU1I<&@XwBhQq+Zo_0mlj>;?M_1FIz6y~l(&ybijIv`x zP~P|iF=dmA_6z`QB@eb)+`K4y_iveq`%W5&%5(B>w<}L?=EMJwTdJ;)l~uXfJX|ltpL1r2Ip1Y zQaG)a&`3Tj@fK0vK^igqfn%)V{~jxpRuV|pm~`}5Kv zUDh!3qwq!;nXD;JH;+76d7`MhprL}xj>k6mG%W*pd4p?O+u;d87IarzE(dvnW7OOp z_D%<2d^&n2-$n!SD7sE>8-Ek3=?KEV%z0`3GNb;85R0EuZwnd|t;wjIpfA53u)jZa z*Y^#ZbBA~FA^l4hEu4VtT9~HLcEbK0SJNcRWjC^d+Uik<{1G{lMZnM71ihj}dp%d3 z0cuC2a%=Xyn`UoRjr{|n!Ww!}&sXNX%MS(h_^Y?(E4Wg(q65Y!T>Zia%&bmSDow~Z zH8c+$6s#5FUj%i!i5svZ$iB=a@|2yL9Pp6tLons4dqJsNUR~XKOump?=g>%Cr_6Ov zsxt&sl+9CAd;I6)g%qL2I6j;o{+Z&;g4@QV;rQMU)SO;CrC;NZZqJvFX zJX)0TJK|vbxRvvZ>u;TM;DmE`b6e09s0tL;_KH0(!ESb*Zv(whH)F#6!@-8#kZwCB z<(5B9Si-y5ITCO1RWLK5p{DOEQkj3M&9M}2wU$@*neEF$ov=8R3T5X4_RcA}S*a7c zO4JcIVNL!I@~GPEe5y5)u0*_2K=p?lAlonVcy)@kMdo*w^_0JM>gWV5m)NqMPThAw zv2)=VZhXb6^I4t+c6B6=Ak$>9^Xc!~25fP4#z}9L?4Uk9&gdAeO~_ND+9f;kdLZ)~ zRQ`lV?8~4FJEqO?(+#Q<=m9qAj(SKA^6mZMy1gv<_y1=+uh$K9d+nLs6NQI5l}{K zn&bt9g#i)9m4TdGv56mKo`(bchulINyjZB)%l3#YSv6ymO|B={ywt>s@{Y3cBuXJT z`DwkJp}^0^nJcwrcJ*6Lar6BWZa0Q4Q|&Z2J{rgA_*OJY;-!tc_J=L5=p2u1delbm zLW2r&B4r2;#+KOAhKzL5^2-uk zy7Y#b23r#DJp%G|Ynho+zuP1w)lyyi^tl8?rN=ZY+kZMV#1~@-z)+a7ol#jxYBM-J z>r0~9s*BKfoUXR18YEm!Lwul(`72YL829!1RVmT69he`2^KG*f*&Yv<&!Gttk^8_u zFLX-xE45_ctghp=JM<@qTvA}CcZL~H5R@-Q+_A8>aw)pwAU%LcU-ZJ#P>Vs6^6E8; zN6PvhKpaoB{t8&HNJ{MMsq}s<#)uae%+j0cx+X(a^yRhK2KTK9mR#-7C`aV?IJB9( zuQH9`uvG;ALOd2zaIw+vb^G__?1dG3o4<4oRF$hE2?z^pbT4Kk4q?&$T%>hD{|qkK zS$^teOKEUO!yQ3g8)Bh?$q#Xn8|eEZI`(1`_Sv5=d@0`({-GS%{6!#b)JO*3%U8${ zMm@ETa&~n&6QO_U%9d%IGrFf{&lgJ*HlSzlZD})dH!0VC+N}7k_#~;x zt-sIdf<+bI2_RPSKgUl3`A767)J2oe*t~xtSgrKx`HBFXV<{Dyb62OHFU`Ym7>cJnV^28u+NiRBIn&+2JqK|Rystgpv?rcSmdp7Zgx z7O}Th>jWy*Q;DuPs9I-HYi0%I^35{8{4N%9=fNZf$Q(c(`w{x(!cS}MN4OCPUPng% zhLe;+Q`)5Z_nJm|PiYq5YNn)Wm=S z;@jBcF=`R@$vCdxM%{7kTsKkUmDdwY1U(O2|0ZtuX{EXCq9P^71EEHtFtX-F?;@nY zHQqmk4padEaH=!f5@O(wEL>#43|0R^l;EiMHUVA_OZo-i4$`@2JnON_&!b%UQHlD0>i=#1+$9K>hd_Aeq6C&PD!6=Qt?EEH)o%@j&AClO) z;2(Bw@RyzcGGbzI`(FBm&VUntsgQFgr|&6BIjLdfRSsvG#~2tZXAO?pUz(mlZ6Pql zA+L*8rt7P1^!}^CvzCEBvyxqJn|}Z2{j?$pNvi~UGC~qO6eIo!CjRS%7SrQGZa1;k6*zo(29g$;Bbq?R zv`jViuNs)5gb1xU3+#o<02`ZmFDK=M#R|=yFQ5sR0`l2o!!$1`h9-k%T39#Gg;WGJ$|>gNTQM_Lujtv%^l_9fpY{ z>NL7YYG$+k)oQ{8a1F`WpNfiJd}sb^)@hoG~=0Eqy&; zj=RhKyT^a4xMlbZeMs?Z2gy`X-$~jo5~+2q6_EXXt81EbyW*;5=|}#>(c2Cb;j3pC zPBU_3FNPoNmHx$EP9ikae(ci~UER^ucZvs^V-vP?3(9dlzjd<;55z``UI9}D zC5b0$LRNv$aI+TdCxXN>k2Id379;fH&R4y<-X(DIAauh+z@7Zg0W*C3W%>d3y^8m?(AeU1Ce~%4xxA zz*_;oBWbb)!W&Qwi^nJ{9_@nzinzc54@1O^eZ&d-foo~Iop=(5a+&Lw z(Ul|GMv4D8m!H%^IP2u4l$|pcqKG0tSq!Gl#+*A#So1+tJkC|JB z1{o?L55@;5eZWcYN^<69zDE`VF|60OP3;wn8~s?X)2Yf9y?pRT5dnUFZFr2> zz>ypR=~XEq`FiWKn<272x~{_WgJ^4c1Wv`I)5a}&@#8L~=JxYl_SupF_K=u0tycZ> zrfxTaaI>&V=l;yf3%u{;KVp1CT~#(y93p)McAgN&Y#p-R_|_-dw~iWBgX_+6+k0!> zr8T~-jM)>|=S(Ro68b9$WLIt2P8omrOVs211;CX6%EA-ITXQONRipETPQ-V$EPtsVl=}Z@QZbe^b1F>Ng zos`cPbrWr>mjdtBlS*$sIst(a(B!;F6X+*6rv}=_Lm*b@X9r1?jL5gdlKWTQKYt)^ zQaGGBhTH({Dsa-?A5T+Q9YHjea)L#Sl`KPUZr4Q)L@n}@bL?p#J}muQZo4sjalF*X zrphOs_mQU0aNq4!Ne0%6X3Xjycza|U2U^ZGy(tJ5(9#nSjK6X;Iwv=H00vNT9_x=O z^VIvi89z5Kx;FPP$TxJeIsb{s(^NZk_KGspyMXQLaYvD=`44wtfmd9bcSwSaQCKUR z{8sDGFo){+1cbV<%1h{RlD(R6@&}DU!82fnNL5#8kbTymFy+Hg)ffJ zt{y*JwwCK4QmUOCU*>9iB{5_ceAN^LRUNnnRIHfUoWXhQy!6>BPBU)(>Ur`*B2be4 zcOVRumuFJ5Qh;)1TL|93sQPMmi^gXB1S3O`Vjjw%Qtcj^MzG0)4%%-MGh#BUF>9W{ z4bPR~{nh?);C4E*ZPDj1=^_T^W%g%3WG2g_zT7?p2|EwkKbiIQeHQpswG1+zjL?@C zgBBUNXxnsa2)9FK=56$KjRaAsvFv5pvaw8J?go!pcj1Reo1;$Dp`6%mrKYg@HW|EF$i@5Lu+}mVH=geJAwTPL7I77fR5X<7jIFOvXj`1z zYK=MZcx9M8V$5SC&*AuT!}ZtR$_=s`@9BkS9$YCC>+_cugyB$2?@kW44!duR$S?|8 zX;5GHI%n@FaDAj&qKoNxUTshiW^U3bU$&gv0T7&%;Pz?7?|g8y4-XkuH;DSd4KUVB z=DV#(>6^Mlb=}GlqJdAcT1B$&`WF=qoG(8dEk)LNuqg{+VISm&3*CV5;1uD(YP_A_i49dosbN+b#9}sL~GZnZ$D@ zM37hESKAI9RCe9V82g;0;WZKq$I#F53J!N}|FGLi8b5gSlTWON*rS4mSo&m!UPL6n zQeM7Qlso&CjxFV{WLVbu#N_l`ANe zcQ>N_@YOxc6z4iSrmM|&UlR-^b~Vk!fU#l!O&I}BOc)dRWe*#gIJ#3E8KIvb=R!YG z>=F&AsMAMjTnQ{0ziect&v&)5IT;zHLA0}l;ivh$XK_CQPDju(t@G}PPMywuR?ROM z7BlMMGyU|i(dV1u zVHfeh_xoM7W)9RdOblWg1N;~^ zHyn2Ga8gyl0Itsu&uK+R={U&|f`JjYjMt%Bre)W6y7DCS6bxPA1e?k|z1Ns{UqEib zD6~I&IRWkm*KG{n)M{N*`Oz0>3)C=sW*T|LFnZow($j(sx{BfomZz+e>3>-!A;S> zB^aq{wxjCwfoaj7gPQ9M-j>k{JmYL?k%B?MoedB&LDx$b6?J94p{*Noz&p@$Jt*{s z2j8HZoPF40#C>j_nezMKyG7SB-`A!15u$jXDol>yyx@Yaxj8q~u$v9;!aR9Z9EsT2 z__=VxG1&e%F#PLkv2QN~E-Sptu%i+T3`8&5o>?gdl5=S#_7Z2{q zes4Hb2Nr7t%eLyS*;4(Do;AEB_Kq?YY#DeF0=4V-|FV0bvp~i_e_q9ZU=3w_)Z-!g z8it&W-<#@J{e1Au#oN~zVU4D8Q^FIyrA6V& z%`M^e9LbrtbsY?Ja_Nc>xIq}U=^@^}dnG_0f$)jUze$nZJQ{B+N&Ck587}K-6ybqi zSPw86Dce`nYw*GK?^l#%C-G%;Twoat#XfPSmSH{)*$ibyN@oxX?%B0{}j|=4cb8s!2NJ=P}xPUxWcAx zb+Xa1`eFzsKHI*}iiH~2eP1VxO8S~hm@T7w@a9X;nvY9;YzV|i9(JTf?cF9&jP(ts zsI1%Yz#+U?5wzUY$Sh4!dkFs*h29d=)v~dCG>nYrbq~~$EK?Y+f2Aat>O0-^_qzmQ z?zvDWz%ce}pHZ=ltQTqPmp*YiKO!PMzwhjr*g5M^g}pNwj_axCxF_>CX~9*?G)?Do zPpR$Djy)^wXotyGkp=YGobC%W~#i9xCXxNKkgHzKyVJ&S*3l!a&L^;irw_|WvLp-A=s@ms2IFt?e9B`$|#AJt@vL+M=)WiSmE(jv7u_z6(>z4RC?Pn zLdTXLfsmml)7;=TftEbHoZJ{7bjqlBXM$*4KISM*VQww>v-a&#{+h zmbdOv5x2EtZg3teMMJGb*@vhaU}Kq ziTok>yBxpuNM4z@Ipuc-OfAPs4|CjXg6fI<>UeR*#u!YF7RJ*pS^tMgwkEPcrG6xE zey{QJ3F##Ef;!w*K0e;xS?X$1Kf&O+3vSV`qq$dAY{V4IpvcA{ zlrp4J5ry*jY1ezIqykY8um8UM^GotDR_C**LSeXu@*Fn`d7VLJhWiKA&2oXkazE=G zFKHXl@b?yColOc>ysBsYB+%ftEeVD3}6!o)YY=yMS+QM+( z?)tIY@{O(HG%rve6zuf%U7pZVqx!#IS63z1ujYr^I7CUmGOyOPgit3aOGIrx^=P$| z$J}M3nB!@~T6R`wUb==XC@s_fDbd|sdPi(@K#+?QPk9EnGC%l$nsZH|3e9N75lE@1 za;`~F=9cu(!`f?&0iU;INDSNXYSLmZA~$fD%!hCVyId^?Yn(dGh8mY87;VoqiJ33@ zo7D!nOD7nD)WHscP8<5nYo7hqVvR;H1%#D`8nWPe(d`Po4U*IH@Gsy78`D?Ptu}AK zK%b~nokT?XmNK4vuE8DUc)Sl`XcuAlLV~TNfIVYspid1+i4DUyy3Gm&St*@&I-1=>b3s>79L-YTxV z{HI-1SG)KSWhtGsgiz`l9x2wz&F9y17K8bR3<#2Qox)#aV6k~kN%xhN!0$<-KI&dn zZw*#aA2$;?&o*trF1!2CXCH+k#E!k`7I;17JN>1JiKS`1G2rNa{q6xtc1fkN^Oa~L z$7r8xPuP{=fK6WIglCIXeCjUuYB|^t)8#nkaZq zR|>-+g1GVUj2Jh;pY3t=&cfkDBlYv}makUEPH&0fCk)2QUuW0sB?qIO3%ME4$=oRf zw^urZ@1kkaJqu5K+-1M!aJlqp&Sc)*%jD2C9}!W|>aN62KWk69+8#Stb?kC?JSS}a zp>AL;19Z4M3VA5R)T&}S{Kb2?q3PY(?%+7R-S1faTQA)v7jCZdkjHom2RJ_w@SsIBd?|Nl8#O;X52~a(rc))u4Xfy%?R%x+Si2~*<(FWRr=8!=Xfrg%dfUGl5=&7oL_ZnxvAHjMw=jd3n^^E|q9 z6m>4b`L9@sKYan<7E7y5?9u9$l9LRGjQ0L{m*Be2!RDENiZ+*+ozAmYX#O;i1u9%5HskB*kq~+<%;~ z5!&S;*{g`{YH~#+tI)s!@B^f{pOW#?tS7OKxBfj}m?3RX6RC z+h4+iSkU@`hcZZ?Ws?2mYiZja*0a{W7(_H$2;tw9ZjwGTC>_vg>m>obN~TOH`|oP;UT%VcOAB*S?e?!~Dp}$h;1+7U zPC!j-ug^y(HG{#Ezzqs7`UED{=VEFe!W@pQpOanr>3c*>ODk=0;wO9xJ0_oaNcpex z_@NnoAtS_*l^=T-?LEkDJc_W8 zn8u3Q=N78Efj;2brAPgeGT&bUw?cHw`qlP>9AJqa`}e~BPfPTu#glDcC%q`2atDJi}XCCV*Ve78E`HTi1ZKLY>6U3Z4nx*rfBUP$G?MiyiQl zTh~<`$=TC=1{M1a-UfGpnT0=&xmDBhJuebW@e26^r+iKMO+A;-Td;$}nNH=%*z%78 zv~#w$=3!>h}6nv6{K8aVF1f`vzJ;58c8S^hay;WsF$m zhJUW?)D<)V{5%q^Z1HQvKxqpjgLO@KUy2tCn- zPZmI(eiy(%IT7mG##v%NL;_+{Gdc~%VCOKSIx29bCgOF6&b!DvuZ=`90G3w9&5 zBQP4yOkV=srJ6mu_HOnikRmQB;`z2l^_iI3bKdu%}k z=-WwiqUDoZ20iE41S$p4&p)>9rdKbyLzDNyAI^# zqWsC%eg=-cPTlRak(f*IG$8^db&2o+@Ymv zm;sR{dkj+XcV0{W4Cn@0nXW{Vmyd7$1~&9Llm@u6SUcQD+)2hrzShZ&K21?v;bFoy zZCk5eHDs3bL56f@Z-c1;LMoOuW{W-XelxsWmp-VRM4a@XGJng*O@1w4lGgO`ubo!O zSh@P&cbpOxg0ilOX7;5fZ0N}kBc_0y-#&FS*M|8O#4_Y9sUb{CjLzKg0zoL2b%5%! z^opL~N+sD)b6btaqoQ53)6S(KhcoN{STDgK!R!f#NCZ<;TKn6D-7KTd`Zt<#-o3k7 z4yHUM9w2Vom7qi~`}E-1SNpV~ODCttkB_$7@}Zluc(G_(PT(1d+uxKP-@OZB1u*}{ z3Rpo`rI#g#yCZfUt%iGq@`#%Fm6O0Eaz)NNmCu8XHnZ6RC z;P^evncDvdNJ}LrYwAwn&VDIwx&&)5r|<^*g?`zp@?(mA)jHQ<*wBwnKbBjD9zfRc z2n=x(6$E4)*nYtPb0(J}FfoB8@VPQikFrWSgaH@HY`*zWrty61n~t_pa>M#MHh1tk_+1+WXRH8pq2rP_LyvIuWYK1)M-sb;t>} z{F|^(9)dKmKvZIT+1D6gYZ73F-I|Y&^IZr4=pjb$WP=A&(EGxed{f;|leaWvfU{E+ z-Y0UKz`XvuGeU9XW9_xy`9uU#Uz|QCTufYk(q3dV9^GKJ|qY{!MEXUjUo1t7IDO<>(T;FSrk(G)-4crR+3 zw*S>=2Y8{R6zAh9l`%wvYB^x-Vs_xLuit+;5L()Cn8p$&_x9h%`T!aqhu}d<2Dz>_ zQfg9BsUGDixV=~SjOhTy+3U5c!CEZF&QR}R*V#dcg>@T;rvs#r9= z7#!n4erZ$!^NTxULHS*&xc1H`-sL{(vKL~s(C=jGhY?n~&0CN>0db`2E1|GRY zvBH-$B-mz=VeW#6Q6ax%~3m zl|90O$y^5$lmb*?*gyg!gYL&lm_go_Z`e)PM<<_=k?`!$he8NWe@ARoQoyi!NFh&clSwxB!&R2gl|XYNYPzFo6XMPU^BF>N=0`u8tf zIT&8Ps5p};2w&J+v}8$Tt({j1x!%NwT-6A3?;lqiZOP^?(v3CFcgzcOtIUI>Xd5Cs zADL{F3Sg!Bj$Z62J>JYpjX*&cBVv5XFwbKxf_g!g-YG>Op8OvPDqDEV-CX#!>f{_ZDa{y@NcDSI9e(O}# zrhSQJJR*pBnK|D}bxvP%{en!{mXo|=QopD?r<%45rV*`f{Z9a!_dyRx2Ke&Wu z>y17b3^SEz3cXiK{Ui=^rGisGGf#+D_ah~^6?>@;U5-jJw;T(pcqAEN?`z3}3k`1I zuk~DR_}q6_{WcPPeqtEsc)A;AH0&6d<7gR{0%0glVT~|EDhD)uU_5l;ir1qOeb2%Y zk&U-ZmhW>}VPsga7Pi!?Zj)Ws!UvWaOtQ{do;tO%=o01uj4h98Pqrkg`Ztza$)G)c%nq?y!zerdl;Z4BsNi!V~`Ky^^BI@-PZJJEpw&TpFreOZgq- z9?+f{8nK-50^*#S+>O)OzZ2Q9AHmqjqs-g)q2<63jMXV@?t0+3y8D`ip?!yB>n}PL zJMg$MJNKkfbw%H*)Lc$oI!ZZr!cA<^?YAPkL0P2BpSL_6v*TId-l?_CY5zrua~;C~ z>9(f&6@)W5VWEV&SYH81P~}w@qT8M7TP}{g@Geak^(ilXC^b9wo)D|@r+xVl<;Z*g zqJTS8ApB8_o+k&DVt}L7kD@bm%{N9g?G|1R04Mp4Dv5!?gaxm7K<0m~r%__5OXTK~ z-7>2VcIMO{BDw8ILMz%!;N;QFztowo1?5#VD=|)j+%$acs>ygtTY!Z(mbZF=+ug&_ zE=z8TGpH-PJmmvb_)Qfd)B%LyR}bl4lzdyS-C7&$RSCy16svVfFv;XrM_IL*Ys*mfoQKaYcxTpRho z^1NbdE+blCYFGfiG-P4J@50hfxY7$8IcCnN!G*lJE8OCQ^fX;vsDst$?R;P#G}mF_ z*D~EtG+vPvY{-0>Yvx zMPUg-q%;KQfNyz#u*f_#)<#%VP0J% zE&Q|O@RxzE!={ul{Yc~7DPljwII2R)d7v=o{!WUfg#8QP za&(}knPqfh`?^*3c{D6_Ez;&~ig)e;kDTIXP`XY1q=hz%JvMr=#!W?j$|q9=qHyEc zx)^&{%|ql6mUYro_6gtG!Pz-)hSHv7Nsy=*N#6M^GqjTX-6)qQv(@X_uU$%yy&P%7 zes)G=qi`Dg)fFK)jW!OC*2m_X?9_q>K|i`c=;k@SX^UUOmxq$2937-}QF7WP%|y9j zdX~r@1I{po{I8I2Vsjrg#&ZZJvV%?C8m)oOn}-u1bD-8r?s2h?iA>1uid(?{h?ycS zHWrOr8UCZ96%#=`7jx5jPU=cg>^}22;mNK1Q4@LY>B+XO5hp_ zi{s^(gE{%wvyCOV@MkUOsj5^MC`K4qKnL*8U3uKAvG@1A0bA3&K(CV=BnVwUQ+L$~ zx=GT&LH0-u-Uttenzhzx;tKFybEX9p@ZKAp!=K7Q-K4z3!mVGSf6dWvY4nCEo9X6f zJ!X59fJ@T0HqiNrUHobw@<*5rqQpqGTodTumJsQt?D$5%X6g8dAPEGqR|pYCs*{6> z*mTaEh4x(6vgpzaoY=F*b5Cb&Lv?h>hd74? zO*X%$=^XF9_w1gm3Vd65qQ9qTwNk=PFz(HsuUF*@oyi7wNV&*n6Etv!B~uhdCsY|; z0Eexw2h~Waxuy=-52`SjQ&Ku6EXf!~G@TYZTV4_{cw_Sz{c(=wF)eHPxrnWVz7*Er zGMlPHz86ul40Lf9>KpV%CfW2g#JNWNQod9qSq`^+{%D+ghG134=(?=q*4=GMURA&K zrgdaa;|Cp!NYm?#rXRVjxvd|J_4aFBm&Np}oJth!(wu%JYT~QC&!q{zL40UYQ>;PQEL0@`F8-tkZxmg7NRWU-t;0Y=U_?@#;6t3e@D_04qB z*T+Hq*P6E2%R=@>y!tv%jM<&m@r`-7O8MV0^Gj;YBKRl!YA+)700IEcu( z^IXQ=CZWb@tb%)jOsXLjx_FYGuZ&Oo&H-<||G$BBTD*y*DA@n5%XT=nP5vcvlx{=?kxh3`)anbm&yP9#bJgG#}+HkqyqLmAAsoynelQ~22TJO_X=`R=i`^l|E_36vm>M( zs4HAv1^p7&%`aX2`=we|I{WILgI@OnkI4J8{zGkkiBQyp~O^j)TV z`4vuVtI(7P#6?{q$ga>}EUFal&_|Eo0nI;)w5SaJhr7*#_ir+p&; zz_oZ9_p*=O^{^uTi0t2>t^i`<^Si7|H}MBTPOQW(786cy?xpp1O0|_?CX(!SQaRW+ zEU&Co0Gi=2ff$L4GihcTs7-+Y%HBx*-#IH#8j_}0%j#1?YA@d;LX%yX^8f-y4pT=P z%-=evy#1^7SaJfWA3uY)eRo{4Rz7j~T5+WT6o^vEc`8`dvCB zJ8&o??*;xB48C#Qj4nEGgVq16g!J^D>e)lmG%O1cDv}1_O^bQImdVZmb4gO6?Sr~j z{kU1LOjNZ$y+d@(MbAo<4F{=qPaB{Z2qo#ckFOLu_}Y~J8POq%YJYJ7JoJsNR?s4A z6i&&4D3LrY_P;Es1>i`Rjm13kkVhIrPPyNSp9ytJUofKvAW4`nCup$Sx$0q8_Wa|J zK}(YPT!H%MZ3Sg_usVi>s#SS*&@4GXc=t*Oo)ROS8<*aOdVxETgR%xXUiG|UCoR}= z;&#(;Vn+*!L2SXb>>z19^Vmh8GMS;8q(d6gMxLmb?{%uj=P**YO@3A<^6ZN8%FXTY zN?zHfsBxe2c0$&dfow@hkx9F1y~7p$rdl;CQ3zqpcqY>Q3t}m(Ie4q+m zbptU_Gs*kCcQ8@&z9xCJ;KpY(t4%pwZTQ8HaKllr?FMbC3Nf3e;%>Hkk_$L2vjtu| zscFB_)T__M#=Vio!VIp0S9+QZxV1_H#nPf*dtxRm`~eJ*k$C@AtMn0F$>H}yf&d1=__sNHDX-wbc^=1rN?dwg7x=HI4y zV6^63W}w>wMMPT#u9z@@+^cNRj%7)%LI4a`Wwi(_nluA|ITa2+&5*T&cw6TucTAe~(styGnUIo2;~1N1;G{r~@AY-*^5V4a{8d9imIVQv9=LQ^KjWqtjC>uh z?|3Fc?P8KfPn4V9)O#zQ*Ob;Ida1@$@u79}`ra!@KIXERSk|=|RgVhUOe^l=wb1Pr z4vILu=xryC@Ev`r;*vBuBWjrTYxC1}UGDfQHmLI=cRI+HM4qYgbIYocfe_vO)6Udp zZ7Oo0$#H`bB=P^w+cLV1JA>B0Y z>IRP@o6{ZBrzULqyAgRJ+g8%zx-PxEpRkb5|AG;~?Z22g!xCAH;_2GW-E9_xQt&=4 zW7xlGbXLVxbxEP7cDh$_;;ely;qW+=H8iye^%ed z_?VUhjwZg!{ZVeLiBPgh^`DiKKfL^ePw{D0|9CNExT>5wA)Y$HA})_6iw#ZEjaaFh z_bz~BBu`0l31>V)ZuWv=> zf4%;E|2L3&^roIUroj6si)m}p*P%(A2Jt^He5A&N0p-oDn=A&q0?DgdWy45+d$G&#NM zNr6Pv5ERwtl{WISH5yw~rc)UvQ-GMx;hV3k3eh_$^=nkixBMH!j1lH%FBiuI8kQFN z`+xt&SXBfi>usQWZj(&ogJ;5?zXY+;!n9mgT)uTgGz}A#ggw zPT13vB$2iJ&W5t|Wnr!O=P|QT0u^QS)R>4-hPcAR?%-Rn_)QUhONRP8M2OZ`^PQvH zLAJg?HB zva*RjZjH4Xwap6yDure*`eUdS((kXH&OeEdrEP541{JzZrIcQmLg+kL|mWw%fWPD$fb}|IT3ChB0e1wF2=HR=0Jf{FvYASv|X`p4a3-`ql?Wf zYV**^KzVhhi3HOm)=~Ub1Ty%OK>s>yw$d~`6Zkv)*e?fyyS!F-3c}K+FR%{GmWR`$ z@C8aH;8=S+ohD=$$dk6O^$gj9#B!vh@-@C}K1|94NI*hWGG1RGn?lb$3B<&9rjZ?$ z5ByLDTp_tqV|rmrX@o?{96VB8f^N0-8i+kl`uaHC;DZ^TNl5qy~Rb^3}RhvR%pADW2|44sr zdgTks5A56Spr%-m)1YYX!e+zYhr3J^BZ!NEnyWk^KhvS=Lfw+kurT%Sc70bZ9{G8z ztJRrNeRWLrdoIHNXs+QBHZf{#UF1 zcb-4iJw=nb*5y#oxLm`1Dj`}s(Tu8PmQ!XtEsBld4Kk9N-+8+q`{epk(+#5%q39k2 z$29BwRMo#;=xoGaJLP~C#z5&UUKt86(-wx;cy`Dn81)c)Rhscs;Ti@mW{MG?e0X4Qfu_1yvv^pZ41L?d?# zKA%0;F@tL@>0KF_*pr7S(j}K-X$H#p;9NH|IyzDy6S90dlkg$-k2rbeke;VhL%YPv z5u!~;=LZ~KCbM9*PKzB9HyX7w9G9P~s;D}kEd6x{6X~NXx3($g*sv$=I_#a5v=8tg@RQ* zvZ?D~mwJb2_Fm(+o}rr6^m0ermXO$hYn_e-Iv@0-2QK(FuA*;E~Yv!mEC>ofOd z#c#g{S6y+TN`9%L*u5?k5GRqgsTiy*eS3yMg?>CK5M>D^ zUTLjIzc^M|2e6OdiG(oJQ4O1hWCHKwxTMqM&O3QBLSH zkou$~Gti6fuhS16z@>A%+e&F>lw0`SadI#)mgXITxNot1Rw{L?0s7t6Yp&<)P$d!4Mj>(SHb8v(mnD_ElE+x`Ms&w~^7uH`53+dQ zizp|!_@|Ao1nxQ~4mL{J!kgaNh4@lF!7V;~t>EC|0bxC%QjH4Gl#NN~!YBQkV|7Q%ue>}6~AwJt*TT{#GM!h0c4>=phF^=ewn0>!u>n%U_ z602m!DJFg@i<&tno$~2O$SV_dtPvATUIfNFKxkr>ZNHc+>+H&l>c@CWh!=_97_(HW zt)sT5^A03U`yf6N1iog(iW|Zi4G!YoYKyV6VonjjwOF1tml=PG&R6k%Ac7M3!d_xj zFG7r6%x3gXWV=G&{R)3S{CUIneqM|$2}e*u-vGzmCOCEz3w(9a2LE+&$6I_ z4fDhuR@lKM0(t;_=`EG>LW9H)zu&($7jSXIDa#Dv1V*=TasB4rB1vLVuN_E-y*)E- z*Va?Tu{5KXU!baqqb^0}rhTR(&TU(JA?xx~HpI-{2@~TmITqmWyP*40gv;1BR8e=0 zGD#s;Y9tGL+6}sRn!WLwdW-GpU8|0j0I)jlifKLC>isRBBxG5KSS=|kyC!4=WH~ZK)mi;Q(y*twNqj7Z74UV+1dBI*$%n{vzrN0o~_QUl-PAc3u0kqF}^=t)rU{Ht3 z-H?z#3}oIEOyw+_xM`Q}W4W7y>dQz>(#RjT2&!{p3 z8#{F%X!Eyy=7fDI2S!m%uHAJ_zL_6R77wx3 z&&}$n92-4bo%QVQ?X?=c`0{Aubyn2V@cD4qC`g_#E;b6|j z_1N3C&rs=8Y=B%YWU?=yd`Y;WjhJBO=CkV>D*jTz*(zD$C93s5>VbSsVUpuaS)ohTYjmD`lP2#YU^H3(DFbO+BcP z#8(2Je-g-8)m!k80BeW=Cn-_%i8d&kw{foTK0T9i6)YE*QuPs8KurOoi< zaToW}Rkd7i<@1FgQ+bQSnPZ6>k;+ZDtbGH@k<8rnpyAta(HZ-c<+N>e?`P%9$;plm z_ulo4#sTb*zeupSc4y^2+9R_$ZXi*SfD<;Q*nUwW>lhqmYEOHzU{G@$5iEXj?eD#c zWGC%(y^my-L#0?EPKE!0<|v%>L6GA^!iPCb6y6bfh;TNv4^N{WxSMQQ;y%!P*VGYY z9C3${;ZaU0T&*MkHYok&YS+Rw^Ds2!c*lF|RsFH=YWnd`pM!;kg;@FV&Tjn>F>&wi z?VNYscwD^>BsrP0-pI&75!9AeOP^4h!mcopa}$>9qi;zw?&&P~VQU4WQ7dOx#_UTe z4D~#+iVznVP(ik!XvW1QOt^{&fGx#~2ZK(&lAn}Cloa&x{N0AE57ZOT@oZ#knuC#L zq9i8nO0{zxSlBHjtHiv`W)&8%6-7JP-&-_VNvEC3tX(%}y5CoI|6!y_hZBt0e96e( zU7Hyu{2R{bIy?Wq=e~Oq!@2wey6RyN3Y)TnV$dJ1es-;*8*jF$_&vHS6`QC`X7%dRnHe<;Xc&!3j&`ND7(Z> z80bG^N|BFBz+R#BVPnPX)sp~Bl0^t-gP2eo)b;G^KFvBoJX(Fd=5pQw3a$$)mLv=q1l$CtdCVBSWQ@x zTNEADUKAv(3@u~!j-AH!HWB*Oqdl#ZDj;D}m)+Cp?8fb2rh?a4Ozo0LXZxM(aIz2w zzFa>4(G8D&Kt-jcL8to>7pavPy@O|O+FSw7L2vnW?!421X;utP`|$oI@-gqMi*{x0 z>dCaEsUz9ylIVg*Qldb|OIcX~=QDgHobR-OXiRjU8OeyNsmPTWhm;oD=Cipi&N4PKmBf_ooUW!^<~(r z5#vv%bdwY!Kpd;Ww;BIkuv=j+m{rqkdH6&5)A(uZZS4*=p;5EHy1rWVZHcFgIXff8$VY`nsshUm1s&;K+VVCGvHev4!C7mxPak2CAOVSHjO z`FNjD$)Y-F&J^vTA0rO&74d61eB7uM%V|@+p>i)HpQqi5ilZxbis$s3s&7`x2_kzc zKDqRMY^O|PlD9}fWoi6ws}Ld*cwDSW-9kOgQfNI)&Y@&Eedv#E$z{5AyAbVyuO?tm z{MMfLieJIB=<$!^sFAN%m*=(Xp3?k?r>_K|mDk~X?r z>^w8az_4Tr2X>qy9!!8M;1-N_ugt;BiF*oLM2V;nUlmhvs$qXQu3E;=gW&i{Qgu&* zlY8Jp0SrzG>d-5nek zmM#=+6MWCXndC8!J3323Y%`A3@K3#fusRlOZ08WH%cO6j-*qvu9cJq4Q@p4Cyd`w{ zKIyb7TUHEKnmp^Q?S0-d5_-mY@GYKnSG4^>X$%QCut%(!cP<=G%DA6tQBWO*wN6P_ z#qe>5hxEO-%{G%=@UTbuBoyYp&(Xzopr%uxkUA_Gt%Xep0D^w3*x@?QGW#r1R~PS~ zS%^1WCSw!(6^bz2a{5l6Fmhl3-bxo49`45$t))5~hrI`mqB|rtgJ0Vnc#SE|a%?Db z!geEBKGg4?DrTFtHSMxIm(|oHIEy)tm_^OySgG&tMrleYuj*cDT+m-4u0yU%g7cDh z`nH`4aP;H)c@s#9qex}HgFV!wmUyrb&wYsIAnhf)my3sf8y(#umS0PNQb14OzTYh} zEOcy)gE_@VokIyh)!lw`NKdk~({V?Mrf2*4ut~`jXX@(0bbMnD4|6B)VhQ8~aJ$&) z(qccHWjcs4y6@Cp=|r}itE-#jeV;7XqxZVuG-g?z#4&tcwdb~gtEE#26Sf;F3XNOZ^O6HKHC_p~r4^WS&DY;w>15 zvuDmCJAyU(UAySVzVGjHE{HA()?(*VYBR1GpeJi5lv!Ca()sGRFPmXWh0Tso&DD)Wd+$g^TNB$jUBNt}r)DMZGeN<-F`qDV32xk&~u!y-;0!`U!KpRDcg7 z0$*!f`tOM3#3gBpdGnkj17N0-(3?{JuRpF@3qHe54F^xCp!#npG}7wse}~e58yoxG zrZ;~IJZ%abMt-f9`+t2pHG4321z1S5Kl6}U-2g?TNnEV#+XTIvX{IVhp`$y{c44jt z!=Xo!>=a9|V%D>aX)k>$`|*1hJ2V|Mu^Py@xL$>i62Q_>;UT|Y%<6iWz+Tb0Fh)nG zVroVNCKp^gEJzp;4I}AYY~TYJfdl)>W~p*S6DCf!xVTJZWnjqAIh7C)BBgJmv`h#- z5F);IlE6)6S7EXgX#-US^i7 zQLGR4_t<~-cQn}FJ6{w~!T#3NL+)!SX3Ns78&FrB+K!9;{HEgQpBcOr4+iD76Y-ss zYG#CigE)?Teu@^dpD?!b1>D{2zC@H90p}dDmzy_wA?Omcz@_7gBDpH&miyO;hYUCW z_h9+ogXRD4^VfEIi%qBMA-RzIL-{0jULK3ShX#J9X4Blytp8q3Juq2W(@+%>D7t(L zo$y7}f35p~ijI_s-7lElASIJcBh^m3kW){`$4cuMMRsRUb>e?2Pbu%=QJ% zuUMb?*~YI{!=K+4(kClr3Xexoh)gtq^!v(?vY6tF ztbf-xh@z;UBY*Bv0ahypU1={4{+dj8aO~QsdF^=lwDVB@xZKch8v|bgvhF5s^OZ8U z9v+v}RH7ALJv0BrP(n8CaDg8Jrv6NuXPgK8x)qNV~*I3;>&F1047y-o)85>q~)B!hk_a&B$1y14da zAyP4o&#ou^kxLJ#*0$yIK_X_w^BLv$#(?o5q?UWaVCs(DH)fbGiDN#Tt+y*TW*VeM`X zyxj}>(^(U%a=CA5valK|87iQ@NWYp81prLP-u@0Io_Ws`Z)h#&YnsNrQKex%klR=iJ&vkR8H@d&ssT0Q^ zd_k|l^_j*YkmypArxd~tZURXS;&SlW7Z@0I1|p#BU?o2!CUX#V{;# z1hKfRQy(Bp{(Al1=vycW%IN3kA9?^muvShBP6EmSu?r5wWt-#Jje$~cK#G8q@xeub zDSa@sr|5t!(=~r*1#8O*IglG){%dX9lq4p zq8T;t|604-c>X0Jm@pP_hq|#;EYR7g!>K~>+3?#O>bLn=!pGEaVumwd-k&)hkuxCE zJi|eelwo&!{?DqS0dG?=F5sT|Pe$rnj-Hg>TU?WR zOs1)V$?7O|Qv10StE3ERb7Vf|eyupOj^FO}^7IRv&?_Vx>Tr0fUW3guSpoPW!L@*g zj~KdINpna&-))-p0Zcv6qZ1T&uYl6-szUq^!h#$)0ZygPY-RM@F^HfjOkv?ye#l_C>fgqN165Ed$R?gUBo7+ zOjz(?+32vBpI=$*vZ5ArhTSSvlAV(sl7_u+e$-k=!^MW-%96_OkV(Gv=JpQy0qG;> zkK4FzfQ~p;^u)f&pF*1rr~+{7U{z-+GdMGDf+NeePx!Fsi}Qe75IpBW$Oy3%>hj+0 z+uc_8oQCE@*`VHZHa|L1>FQt=wB?7vF`C0C zIl%!I{3nWWpXpZ6fA9IiG!Dd}f+82+SaQpHNVU!j5ltbHIQ1^hWH?@rcfY{;IMo<5hM#lcbUw*=kA5C{kIXzC9q@X;Uv= z+jDVv0gS&It7&r8e~>rAi3)TVOtdq~-o!Q9n`^1+#=YINp86X|H=KvPuq!X>kS5YI ztrt3#3_=$)5qF=oKA(40xr!pVx_@<+=$eG3Ea& z>KflTf^?%d*u>cGxH&nmV@XA}fjqg*TB0kEY8vm!2<~T91jMFja=ho4i1toT%fXz| zZua_Q4Slcn^p_j?FVO1`2Mz)?0d1M#%hBn5SH0FBS%Pj~2yhj&554PHo$pG#jCkOP=X>8NzCh2{@NTkeLrLKlGB1E;JUfV zjQ-2!a>(lWe*Reno$ShfHOu|#;Z(CVeQklh4r;qkgC-ke4P1xzWN>$ z-U)R~TLChnMH#ILJ5uSvb7#`ybh9f?>?MIU%`nqQj_7*Pg3y#U* zu+(TAU>U?vcwATV*WqB1p?)46T$rM@cDkBXZ9~U7kWzi!jyBsuA@b7oSA3Bh4lWFp z*?v^|)-9s)r&1DXxv^#w>IW`?f~IH>u4Es7ekwamr};e#^|vH-izix#M~Df7F3A)_ z5LyeoZz80*r4OMv@4FW5mIZq-*Z@+!D+7}HA^XCWRiNIh5EQ*+`weL)7!WdlNtd{MD9kg{%x#I8^ zsT@y8s+-mFhiS{%emcii#@2w^%B?85I0oe^HiDkJ1emUR3xexiOVzTD85Q3LD(?tQ z*Q>N(V4%hEs6Uo~(1wl2z_vt(U8BI$wL?+Z@T*TZ;ET?qI}y%$vC&p9NW7bgk#gnD zn12}~vlwPMwqm&F(rTj++lVu&%hnW0R7eewI&W8wKAGJznROf0;~~ODP)Z~*=6Wxm zXvK7R@bc= zo1S3hmmwtlq?6&OY{XSZw93mnu0UsFdz=Z%&wsf8H2R88__lz}7AS6qy5S_NCvd^< znw#HImn@YGQb(KleV9lQCQ5H;nQsW^u~9djrh!6BNJ?d*NY!U6E z1#BqH57I$CKn}LnI&y2g?F?KnRLCTF!0#abTn0IlM3CQ+Ao|ald@k!)_~wqk*m}kA zUCVkzpK1&D^5$4=Z_nqHUPU9Ga&e*$K;@*w+H3{f{gdqJi5m-ThL+|`#yz)a0xGG9 zOSYh=%(rlA!$9mdi<^oKAUl4i4oiOjI857RL^8+gaAgG&P8kO+Ky0t>3R3b~$8W2@ z3XqWEWMd6RczM#2`B1k=fLfrB+gKeU=y-&GFwyPeu=Q#*i-TIW^2a~fQvX(l7TFr| zzHgIl;{s#wxiN-?f5xCe-SVgCf4Ibm5?QXjZCF^|>O-Du{`!Mso>Gz%3J~`a(Pa$mE~WoR}?^G8;=z`fvv0Ez3~P$|LvRdSjW++;(=bP ze)n$0JaZPsp%6Yz{bz8Vq(YO-l%e5rb&y(B)w*voe zED9tH4D3)o04b7EKqJ7By*dA@gkcyR3bq4FEJNkXa^;Ez1i3bm9ExGN1~ER#|1Tj~ z%9{vTuFgK46Nu;@Dm}HUfy5*D+T`$Jct>sikcJAUZ;vRKNk9xkuue&wosahd8t!=34Tjn@| zo{A~l?J0klAfxz012zH6%RdQqppXtIL53qYsJ_0vC!fH9WD3ve-3!$|%}_7feE*|C&}( zRwju_Tcajgt?>oA)njNIzorAfO2_yBnBr%Jn{C|ncN^b;r_(rwWN5)XR!)Y(vT{^p zt^*S8B@Z{XOPJjhH>GPD{yz98$P(^+=~4v|8UIZjy7&M53hJ*wVP+63+?*A*`GWHt zzYq_|4+QY*ebIDFBl!sVg`wD#_Vq%w!oP23!scB-NL%X1LKhHQ$CE?rNWl3&kh5cq z645r$Qr@W3jdLbgD{ZYq+JhkkrI5gO=uTj`;au&FGk{+}D3 zED^fq;c8$A=^5mA_QmBFB6?JLH+szQLw#!lw3U2n# z8zJPH1RLt_me7}p5^D4enT9~91j48t&g>kUXVIg&Zr zEFq)X&z;zCbuB^gsgS3XVS8EX*bj8J6xZ;F^PJC*wr%=E&u#0uH%g4Y-F5M20cS`& zdZ2OBV!kU^y@N@bSX;18N{XGBqF3xQCa~?GSGFheNneo=p6ZKwJF&3W;D$S?1v2R= zx3L78i&DD+_>kGq9UAsSy+Dk9Q-1!kIQ`Br5aa6J0*)J>0U`EF;EHWkK?#0@FLJx! z@0%ZUnXHg4nbQQpv28&}d9g1tb0Fj#g4b}yEt)_I{)!6a)Q9==7!eR<#(h7lFGFaO zgv%J_<#KX$zMH11Eb>bsQ`jqk?l#(8&R}$GKG0u2zji%0tp|j61)q=(+KCKo0WF4+ zMd@h9+kwZdE8f})A2>yt-Y6Rj1D%5-<}T-_Z0iH>gPEc@$_wB1H69h|T7c{LuiJ;$ z-1$id&m?OW5P5*IL!IloF=*N@`i-F=6r_a9%>gvBlHoB^N=1wxF{CUn2_S&NLx0dF z2~l>^52RBKfgZas3m=xq?`MybK64Iq-MFbh*=I~4Ly&i>um)^CZTe>jRZ4k{s5cKQ zoXaShp~&e~NQZpkvfSu8Sbi}7>XEmu*d&Ag*nv<*j1?ApEdjY*rZjx5}!6L5>JT`~H(CVxu&BO}pP<4G!ayjYFg=Z$pD;6hh|Wg0q;i z>T&Tg(4{`KGHwI~sAGYn70(#|PCt}K8t~0pCH?9wda?Hn44vZT8g)7F%2Olo7*YXu zl=acARC`#IQ}(L`z>VRpkb|$`g_arr`RUU4sI%%}33f8dS>z-1+XELkt$`!#lru_$ zVW|UkZZ`F|a3ZmPzUUg??rRn6>qeITxG2on!udvCXX9epYl^`^m!u+E&g|z$1RA3L z0vubPsOB0ADwoM`X6RynT3WUwmIof_OcfB`Jp1kVa_vJ5X=1GB`lqD3 zw+n%?nzYL>|00n}!eFJ1#wHmp@{~XXXkyc1nAgvvN8oryB0rygTU#g`kNCSUXg@UJ zi%#zPta1qA!SR0eKIV%LBgF24L}?}usc~}^)6Chw{#H5v5x6~BU9Fc7E)kRZr;d&5 zLwS>>6o4V6UD*&3FX-ZAgP(wn-Xha0*XY+{x79rxnaO3zW?u&z7G>aoD7Q}^ zzXXKyQp_P74akDPE3g5lx#=7FCBO*~{iAc*bZeo%0qe3$U)Z5nYc=pnuRRom9%B+? zk3;Wr$pGnIw9aKB=~!-qN|>xN0;pT>CGZ2<@|G zdDA-H{fo1?U~F3!@8J8iKTAzyT)-Sb^p}|tjOn|cCRbn=YU2bfc4uvViT_e#jHW|G zOD7uKK>8YBhR^7b^iAu>Q&)P^EDW4!8A~)a8`a=sexIv2cJez((xul35WmQs2kAU8xNeX$fg>= zmuJSIi6$WQm|jM6XC-|WJsaY;<1HJT>$)rZvxw}F3ivvGJ81CqvsJBd5x4W}q4 z?@-YXKd@8UUuX=&luHvBU6Ii@^2tY`agop7&@5N=oHeT`v*JmogO2-e&lCxam z5!5F#Ni4)XjOPG*!9HSUMz+ZkS3E8@r~`hJzUow^+=*&S==!CL^?yniM);5}1hi>S zKC<9(G)2hE(piTR6q0=RQ8SWLuiNLGOZiollKAUYC@WoZ#A_#MrMj~)?9{@k(Yp%fg36ePiMOCoiMUL(ca>9*+Dn%vTT=~QY(1hHbsq6Un z89-fvddZOKApkr2p!P0R`Jg8Qypi9ziURfka5*A4whtun9**j|yix3biN#8>D*2cY zH;l|VTu%y{khQM!cljNtu%KOVAM&-LzO`4EzJaZx6LYo1@c8?sHk7GB6%gP)W)8cB ze5<9Ik|qc>%qpWUNn;DB>pn}?kKx6U~wYp@H zic_bm)5i*&e33+CN(xH}@1b%A$iB5u(ly1U1`0y76f?pd&q>o`=iZBe^n_3isZ27` zw|u6jDLHTd&;#)@Od%TIx#qxM>K5jgXz7;G7HL-M-=5`525mL~On0p@v2q*e)NBbSu|4y+k0X5WqcydKa5Rkyvp^`{sPBOY?!dyZUz{EGKqs{~eQ z?lloyFb;KfrjbWP7+XtN{dH{Ro;F9o>bMoNM5jfIb!|d~96-%l6z2_aI@c0>ubihg zU?RsG3EMTVDv?#o_(=?f9cX7cOI&r?tkVXNl1>PEX&h&FURC!hGNo?0Cq2rcj(DN~ ze^$u4A)|5cXpvDdUEpVxTw9&ri`#kOFvJ7o_d^D%Tq;(Ny@?t62UZrsF&a4#X#EcF z+N2bDvwi=bB%kQ!q}m2Q$#1{3-XUp!l;PjQw?2hX9Gj**Z=It|+T_CBY4tp;2JFj8 z^{~RKiLR6aUv9skO6-mpN{0XvwCvwo<3mNW&Dt1<9T~&QtxzBVrcV5OeW{pouC6SJ`npm@B{i_jxV8ywi z`A#nSpu}(x#;R3H)m->U3}n9wx!r1UyffW9qT^u4H|6*k(-z#>=7S%f{z6kfUss)U zU7c@f0-eFs-o36G>Z}K8TJ?-Uv#8oo0x2pE;E9*y4Tc^~ER;A|oh-#rT4@V;aY^t? zT*Aqpy#NQjXKhP2Mq7wBgKHLqM1tI;;w^MaoB+nTxTJOa9?tVG z7y*(~*zaTahR)Wz{!UJgMP>}oaa^07`xGnm~cpPSg>)&L| zRa1Rj_~;f~IF1!lO5%IiKbuF0krh=1=7>2|T#xKfZDN3;Bk)C3@2B}V%9q*?CaN7A zv@5O6yuub4bkAPr-_;Ah39&$BRXScjLm}(}hj^&lQ(c?Zhk9BbCoi zyK-^b36SB#LPC_EOoHJNJkDnC^JKQ`(KkpFidL@fwIz+pvYf7Sdy&Kt@`Lm zQC!^U*P_rcUV~xmqz-l*y{h8G`aWU1<>CJ^&n;+t&{F%zzfF(yI_~$KzebV(tQYAz zj%E2#b0mF-Xvs)Yn$|-F8SU9|2BptG=&AR4X)kYL1o;5Usk#ugvt$wZwC+gds}ru( zm>tkmhp^Hl?W%Z3FZPrpWyV} z($rYtWOM4!qoT)$;=rt1mwjHC2rA@Hba0oe%fr+2OFOZ9lcl~~I;?iSuiCC}%V=Ha U_Wwk@x&{6`l~$4}k~9qZKQUahHUIzs literal 0 HcmV?d00001 diff --git a/frontend/dev/UMSETZUNG-FLOATING-LINES.md b/frontend/dev/UMSETZUNG-FLOATING-LINES.md index a70403c..9a35f00 100644 --- a/frontend/dev/UMSETZUNG-FLOATING-LINES.md +++ b/frontend/dev/UMSETZUNG-FLOATING-LINES.md @@ -79,11 +79,11 @@ displayEvents ──@viewUpdate──► onViewUpdate() // Layout: screenToUV(sx, sy) // sx, sy = CSS-Pixel vom oberen linken Viewport-Rand function screenToUV(sx, sy) { - const w = layoutWidth // = 100dvh Breite - const h = layoutHeight // = 100dvh Höhe + const w = layoutWidth // = 100dvh Breite + const h = layoutHeight // = 100dvh Höhe return { x: (2 * sx - w) / h, - y: (2 * sy - h) / h + y: (2 * sy - h) / h, } } ``` @@ -95,6 +95,7 @@ baseUv.y *= -1.0; // Y-Flip (CSS: top→bottom, GL: bottom→top) ``` **GlowDot Y-Position:** + ``` yPercent = 50 - emotion * 35 emotion +1.0 → top (15%) @@ -103,6 +104,7 @@ yPercent = 50 - emotion * 35 ``` **Screen Y für Shader:** + ``` TIMELINE_TOP = 60px (CSS: .timeline { top: 60px }) screenY = TIMELINE_TOP + (yPercent / 100) * containerHeight @@ -131,6 +133,7 @@ v-model="ghostEmotion" ──► ghostEmotion (ref) ### 3.3 Event-Farben Jeder Event hat eine Glow-Farbe basierend auf: + 1. `event.customColor` (falls gesetzt, hat Priorität) 2. `emotionToColor(emotion, gradientPreset)` — interpoliert zwischen 3 Farben @@ -143,6 +146,7 @@ events.js: getGlowColor(event) ``` Die Farbe fließt als `pointColor[8]` Uniform in den Shader: + - **Kreise:** `vec3 circCol = pointColor[p]` - **Liniensegmente:** `vec3 lineCol = mix(pointColor[s], pointColor[s+1], t_seg)` @@ -158,29 +162,30 @@ Die Farbe fließt als `pointColor[8]` Uniform in den Shader: **Props:** -| Prop | Typ | Default | Beschreibung | -|------|-----|---------|-------------| -| `numPoints` | Number | 0 | Anzahl aktiver Punkte (max 8) | -| `pointXValues` | Array | [] | X-UV-Koordinaten der Punkte | -| `pointYValues` | Array | [] | Y-UV-Koordinaten der Punkte | -| `pointColors` | Array | [] | Hex-Farben pro Punkt (z.B. '#ff0000') | -| `lineCount` | Array/Number | [10] | Anzahl Wellenlinien | -| `animationSpeed` | Number | 1 | Geschwindigkeit der Wellenanimation | -| `lineSpread` | Number | 0.05 | Wellenamplitude | -| `fanSpread` | Number | 0.05 | Fächerbreite der Linien | -| `lineSharpness` | Number | 8.0 | Feinheit/Schärfe der Linien | -| `waveFrequency` | Number | 7.0 | Welligkeit | -| `bezierCurvature` | Number | 0.2 | Kurvenstärke der Bezier-Verbindungen | -| `circleRadiusPx` | Number | 75 | Kreisradius in Pixeln | -| `circleGlowSize` | Number | 18 | Glow-Ausdehnung um den Kreis | -| `circleGlowStrength` | Number | 1.5 | Glow-Intensität | -| `linesGradient` | Array | [...] | Hex-Farbwerte für Linien-Gradient | -| `bgColorCenter` | String | '#0a0514' | Hintergrundfarbe Mitte | -| `bgColorEdge` | String | '#000000' | Hintergrundfarbe Rand | -| `backgroundImage` | String | '' | URL für Hintergrundbild | -| `mixBlendMode` | String | 'screen' | CSS Blend-Mode des Canvas | +| Prop | Typ | Default | Beschreibung | +| -------------------- | ------------ | --------- | ------------------------------------- | +| `numPoints` | Number | 0 | Anzahl aktiver Punkte (max 8) | +| `pointXValues` | Array | [] | X-UV-Koordinaten der Punkte | +| `pointYValues` | Array | [] | Y-UV-Koordinaten der Punkte | +| `pointColors` | Array | [] | Hex-Farben pro Punkt (z.B. '#ff0000') | +| `lineCount` | Array/Number | [10] | Anzahl Wellenlinien | +| `animationSpeed` | Number | 1 | Geschwindigkeit der Wellenanimation | +| `lineSpread` | Number | 0.05 | Wellenamplitude | +| `fanSpread` | Number | 0.05 | Fächerbreite der Linien | +| `lineSharpness` | Number | 8.0 | Feinheit/Schärfe der Linien | +| `waveFrequency` | Number | 7.0 | Welligkeit | +| `bezierCurvature` | Number | 0.2 | Kurvenstärke der Bezier-Verbindungen | +| `circleRadiusPx` | Number | 75 | Kreisradius in Pixeln | +| `circleGlowSize` | Number | 18 | Glow-Ausdehnung um den Kreis | +| `circleGlowStrength` | Number | 1.5 | Glow-Intensität | +| `linesGradient` | Array | [...] | Hex-Farbwerte für Linien-Gradient | +| `bgColorCenter` | String | '#0a0514' | Hintergrundfarbe Mitte | +| `bgColorEdge` | String | '#000000' | Hintergrundfarbe Rand | +| `backgroundImage` | String | '' | URL für Hintergrundbild | +| `mixBlendMode` | String | 'screen' | CSS Blend-Mode des Canvas | **Shader-Architektur:** + - `drawCircle()` — Zeichnet weißen Kern + farbigen Glow + Fog - `waveFocal()` — Berechnet Wellenlinien entlang Bezier-Segmenten - `bezierClosestT()` — Findet nächsten Punkt auf quadratischer Bezier-Kurve @@ -191,9 +196,10 @@ Die Farbe fließt als `pointColor[8]` Uniform in den Shader: **Zweck:** Klickbarer DOM-Overlay pro Event (weißer Kreis + optionales Bild). **Größe:** Dynamisch aus `settingsStore.floatingLines.circleRadius`: + ```js const dpr = Math.min(window.devicePixelRatio || 1, 2) -const dotSize = 2 * circleRadius / dpr // Matches shader circle +const dotSize = (2 * circleRadius) / dpr // Matches shader circle ``` **Kein Zoom-Scaling** — Größe ist konstant, unabhängig vom Zoom-Level. @@ -207,12 +213,14 @@ const dotSize = 2 * circleRadius / dpr // Matches shader circle **CSS-Position:** `top: 60px; bottom: 70px` (unterhalb Header, oberhalb AddButton) **Features:** + - Pinch-to-Zoom (Touch + Ctrl+Wheel) - Zoom-Range: 0.4x – 3.0x - Scroll-to-center beim Mount (letztes Event) - Ghost-Event-Insertion bei Panel-Open (Create-Mode) **Emits:** + - `@dotSelect(eventId)` — Event angeklickt - `@viewUpdate({ scrollLeft, viewportWidth, containerHeight, events[] })` — Bei jedem Scroll/Zoom/Resize/Event-Change @@ -221,6 +229,7 @@ const dotSize = 2 * circleRadius / dpr // Matches shader circle **Zweck:** Haupt-Layout, orchestriert alle Komponenten. **Verantwortlichkeiten:** + - Empfängt `@view-update` von TimelineView - Konvertiert Screen-Pixel → Shader-UV-Koordinaten - Berechnet `shaderNumPoints`, `shaderPointX[]`, `shaderPointY[]`, `shaderPointColors[]` @@ -234,6 +243,7 @@ const dotSize = 2 * circleRadius / dpr // Matches shader circle **Zweck:** Einstellungs-Panel (Slide-Up, 75dvh). **Sektionen:** + 1. **Linien** — Speed, Anzahl, Wellen-Amp, Fächerbreite, Feinheit, Welligkeit, Kurve, Kreis, Glow Größe, Glow Stärke 2. **Hintergrundbild** — 10 vordefinierte Bilder (`/images/bg-image-1.jpg` bis `10.jpg`) 3. **Hintergrundfarbe** — BG Mitte + BG Rand (Color Picker) @@ -246,6 +256,7 @@ const dotSize = 2 * circleRadius / dpr // Matches shader circle **Zweck:** Event-Erstellung und -Bearbeitung (Slide-Up, 75dvh). **Features:** + - Key Image Upload (Platzhalter) - Titel-Input (inline, groß) - Datum-Picker (QDate mit deutscher Locale) @@ -311,26 +322,36 @@ localStorage.setItem('thatsme-settings', JSON.stringify({...})) ### 6.2 Quasar Theme (`quasar.variables.scss`) ```scss -$primary : #d946ef; // Fuchsia — Slider, Toggles, aktive States -$secondary : #a855f7; // Purple -$accent : #ec4899; // Pink +$primary: #d946ef; // Fuchsia — Slider, Toggles, aktive States +$secondary: #a855f7; // Purple +$accent: #ec4899; // Pink ``` ### 6.3 Wichtige CSS-Hinweise **Timeline-Positionierung:** + ```css /* TimelineView.vue — eigene Positionierung */ -.timeline { position: absolute; top: 60px; bottom: 70px; } +.timeline { + position: absolute; + top: 60px; + bottom: 70px; +} /* LifeWaveLayout.vue — NUR z-index, KEIN inset: 0! */ /* inset: 0 würde top/bottom der Timeline überschreiben (CSS Cascade) */ -.lifewave-layout__timeline { z-index: 5; } +.lifewave-layout__timeline { + z-index: 5; +} ``` **GlowDot — kein Zoom-Scaling:** + ```css -.glow-dot { transform: translate(-50%, -50%); } +.glow-dot { + transform: translate(-50%, -50%); +} /* Breite/Höhe kommt dynamisch aus dem Settings-Store */ ``` @@ -366,16 +387,16 @@ npm run build ### Dateien für die Weiterentwicklung -| Was | Wo | -|-----|-----| -| Shader-Code (GLSL) | `FloatingLines.vue` (Zeile ~67–366) | -| UV-Konvertierung | `LifeWaveLayout.vue` → `screenToUV()` | -| Event-Farben | `events.js` → `emotionToColor()`, `getGlowColor()` | -| Settings-Defaults | `settings.js` → `FLOATING_LINES_DEFAULTS` | -| Slider-Ranges | `LifeWaveSettings.vue` (`:min`, `:max`, `:step` auf jedem `q-slider`) | -| Quasar-Theme | `quasar.variables.scss` | -| Glass-Styles | `app.scss` → `.glass--panel`, `.glass--button` | -| Dev-Referenz | `dev/init-fl.html`, `dev/floating-lines.js` (Original-Prototyp) | +| Was | Wo | +| ------------------ | --------------------------------------------------------------------- | +| Shader-Code (GLSL) | `FloatingLines.vue` (Zeile ~67–366) | +| UV-Konvertierung | `LifeWaveLayout.vue` → `screenToUV()` | +| Event-Farben | `events.js` → `emotionToColor()`, `getGlowColor()` | +| Settings-Defaults | `settings.js` → `FLOATING_LINES_DEFAULTS` | +| Slider-Ranges | `LifeWaveSettings.vue` (`:min`, `:max`, `:step` auf jedem `q-slider`) | +| Quasar-Theme | `quasar.variables.scss` | +| Glass-Styles | `app.scss` → `.glass--panel`, `.glass--button` | +| Dev-Referenz | `dev/init-fl.html`, `dev/floating-lines.js` (Original-Prototyp) | ### Nächste Schritte (offen) diff --git a/frontend/dev/UMSETZUNG-VIRTUALISIERUNG-OFFLINE.md b/frontend/dev/UMSETZUNG-VIRTUALISIERUNG-OFFLINE.md new file mode 100644 index 0000000..52574e4 --- /dev/null +++ b/frontend/dev/UMSETZUNG-VIRTUALISIERUNG-OFFLINE.md @@ -0,0 +1,456 @@ +# Virtualisierung & Offline-First Architektur + +**Stand:** 24. Februar 2026 +**Bereich:** Frontend (Quasar/Vue.js 3) + Backend (Laravel 12) + +--- + +## 1. Zusammenfassung + +Die Timeline-App wurde um eine skalierbare Architektur erweitert, die hunderte bis tausende Events performant darstellt und offline-fähig macht. Die Umsetzung erfolgte in 4 Phasen: + +1. **DOM-Virtualisierung** — Nur sichtbare Events werden gerendert +2. **IndexedDB-Persistenz** — Events überleben Page Reload (Dexie.js) +3. **Image Caching** — Thumbnails offline verfügbar +4. **Backend API + Sync** — Laravel REST API mit Passport OAuth2, bidirektionaler Sync + +### Ergebnis + +- Timeline scrollt flüssig mit 200+ Events (vorher: alle DOM-Nodes gleichzeitig) +- Events, Einstellungen und Thumbnails persistent in IndexedDB +- Sync Queue puffert Änderungen offline, synct automatisch bei Reconnect +- REST API mit Batch-Sync (bis 100 Mutationen/Request) +- 12 Backend-Tests (Pest v3) bestanden + +--- + +## 2. Phase 1: DOM-Virtualisierung + +### Problem + +Alle Events wurden als DOM-Nodes (`v-for displayEvents → GlowDot`) gerendert. Bei 200+ Events: zu viele DOM-Nodes, O(n) Label-Berechnung, unnötiger Render-Overhead. + +### Lösung + +**Visible Range Computation** in `TimelineView.vue`: + +``` +scrollLeft + viewportWidth → visibleRange { start, end } +→ nur visibleEvents rendern (+ 2 Buffer Events pro Seite) +``` + +#### Geänderte Dateien + +| Datei | Änderung | +| --------------------------------- | -------------------------------------------------------------------------------- | +| `src/components/TimelineView.vue` | `visibleRange`, `visibleEvents`, `visibleLabels`, `visibleYearMarkers` Computeds | +| `src/layouts/LifeWaveLayout.vue` | Smart 8-Punkt Shader-Selektion | + +#### TimelineView.vue — Kern-Logik + +```javascript +const VIS_BUFFER = 2 + +const visibleRange = computed(() => { + const start = Math.max(0, Math.floor((scrollLeft - PADDING) / EVENT_SPACING) - VIS_BUFFER) + const end = Math.min( + total - 1, + Math.ceil((scrollLeft + viewportWidth - PADDING) / EVENT_SPACING) + VIS_BUFFER, + ) + return { start, end } +}) + +const visibleEvents = computed(() => { + return displayEvents.slice(start, end + 1).map((event, i) => ({ + event, + globalIndex: start + i, + })) +}) +``` + +- `v-for` iteriert nur `visibleEvents` statt `displayEvents` +- `trackWidth` bleibt unverändert (Scrollbar korrekt) +- Labels und Year Markers ebenfalls gefiltert +- `activeLabel` optimiert von O(n) Scan auf O(1): `Math.round((centerX - PADDING) / EVENT_SPACING)` + +#### LifeWaveLayout.vue — Shader-Punkt-Selektion + +Der Shader akzeptiert max. 8 Punkte. Statt immer die ersten 8 Events zu nehmen, werden jetzt die sichtbaren Events + 1 Boundary auf jeder Seite gewählt: + +```javascript +const shaderSelection = computed(() => { + const rangeStart = Math.max(0, visibleStart - 1) + const rangeEnd = Math.min(events.length - 1, visibleEnd + 1) + let candidates = events.slice(rangeStart, rangeEnd + 1) + + if (candidates.length > 8) { + // Gleichmäßig subsamplen, first + last behalten + const sampled = [candidates[0]] + const step = (candidates.length - 1) / 7 + for (let i = 1; i < 7; i++) sampled.push(candidates[Math.round(i * step)]) + sampled.push(candidates[candidates.length - 1]) + candidates = sampled + } + return candidates +}) +``` + +--- + +## 3. Phase 2: IndexedDB-Persistenz (Dexie.js) + +### Problem + +Events existierten nur im Memory (Pinia ref). Page Reload = alles weg. + +### Lösung + +**Dexie.js v4.3** als IndexedDB-Wrapper. Events werden lokal persistent gespeichert. + +#### Neue Dateien + +| Datei | Zweck | +| ----------------- | ----------------------- | +| `src/db/index.js` | Dexie-Schema Definition | + +#### Geänderte Dateien + +| Datei | Änderung | +| ---------------------- | ---------------------------------------- | +| `src/stores/events.js` | Komplett refactored für Dexie-Persistenz | +| `package.json` | `dexie: ^4.3.0` hinzugefügt | + +#### DB-Schema (`src/db/index.js`) + +```javascript +import Dexie from 'dexie' + +export const db = new Dexie('thatsMeDB') + +db.version(1).stores({ + events: 'id, date, updatedAt, syncStatus', + syncQueue: '++queueId, eventId, action, createdAt', + imageCache: 'url, eventId, type, cachedAt', + meta: 'key', +}) +``` + +| Tabelle | Zweck | +| ------------ | ------------------------------------------ | +| `events` | Alle Events (PK: client-side UUID) | +| `syncQueue` | Outbound-Mutationen (FIFO) für API-Sync | +| `imageCache` | Offline-Thumbnails als Blobs | +| `meta` | Key-Value Store (Token, Sync-Cursor, etc.) | + +#### Events Store — Fire-and-Forget Pattern + +``` +User-Aktion → Vue ref sofort updaten (UI flüssig) → Dexie async schreiben (Background) +``` + +- `init()`: Lädt Events aus IndexedDB, seeded Demo-Daten wenn leer +- `dbPut(event)`: Fire-and-forget `db.events.put()` +- `dbDelete(id)`: Fire-and-forget `db.events.delete()` +- `dbQueueSync(eventId, action, payload)`: Mutation in Sync Queue +- Jedes Event hat `syncStatus`: `'local'` | `'synced'` | `'modified'` + +--- + +## 4. Phase 3: Image Caching + +### Problem + +Bilder in GlowDots und EventPanel laden nur mit Netzwerk. Offline = keine Bilder. + +### Lösung + +Thumbnails (200x200 JPEG) werden beim ersten Laden in IndexedDB gecacht. + +#### Neue Dateien + +| Datei | Zweck | +| ---------------------------------- | --------------------------- | +| `src/composables/useImageCache.js` | Composable für Bild-Caching | + +#### Geänderte Dateien + +| Datei | Änderung | +| ------------------------------- | --------------------------------------- | +| `src/components/GlowDot.vue` | Nutzt `useImageCache` für Thumbnail-Src | +| `src/components/EventPanel.vue` | Nutzt `resolveFullRes` für Key Image | + +#### Ablauf + +``` +1. Memory-Cache prüfen (Map, instant) + ↓ miss +2. IndexedDB prüfen (db.imageCache.get(url)) + ↓ miss +3. Fetch → Canvas 200x200 Thumbnail → toBlob('image/jpeg', 0.8) + → IndexedDB speichern → Blob URL zurückgeben +``` + +#### API + +```javascript +// In GlowDot.vue — reaktives Thumbnail +const { resolvedSrc: imageSrc } = useImageCache(event.image, event.id) + +// In EventPanel.vue — Full-Res (online) oder Thumbnail-Fallback (offline) +const src = await resolveFullRes(imageUrl) + +// Cleanup bei Event-Löschung +await clearEventImages(eventId) +``` + +**Strategie:** + +- **Thumbnails** (200x200, ~20KB): Immer lokal gecacht in IndexedDB +- **Full-Res**: On-Demand wenn EventPanel öffnet, Browser-Cache via HTTP Headers +- Durch Virtualisierung werden nur sichtbare GlowDots gerendert → Image Loading ist inherent lazy + +--- + +## 5. Phase 4: Backend API + Sync Service + +### 5.1 Backend (Laravel 12) + +#### Neue/Geänderte Dateien + +| Datei | Zweck | +| ----------------------------------------------- | ----------------------------------------- | +| `app/Models/Event.php` | Eloquent Model | +| `app/Models/User.php` | `HasApiTokens` Trait, `events()` Relation | +| `database/migrations/*_create_events_table.php` | DB-Schema | +| `database/factories/EventFactory.php` | Test-Factory | +| `app/Http/Controllers/Api/EventController.php` | REST Controller | +| `app/Http/Resources/EventResource.php` | JSON-Transformation | +| `app/Http/Requests/StoreEventRequest.php` | Validierung (Create) | +| `app/Http/Requests/UpdateEventRequest.php` | Validierung (Update) | +| `routes/api.php` | API-Routen | +| `config/auth.php` | Passport `api` Guard | +| `tests/Feature/Api/EventTest.php` | 12 Pest-Tests | + +#### Events-Tabelle + +```sql +events: + id BIGINT (PK, auto-increment) + client_id UUID (unique) — vom Frontend generiert + user_id BIGINT (FK → users) + title VARCHAR(255) + date DATE + emotion DECIMAL(4,3) — -1.000 bis +1.000 + custom_color VARCHAR(20) nullable + gradient_preset TINYINT nullable — 0-9 + image VARCHAR(500) nullable + note TEXT nullable + created_at TIMESTAMP + updated_at TIMESTAMP + + INDEX: (user_id, date) + INDEX: (user_id, updated_at) +``` + +#### API-Endpunkte + +| Method | Route | Beschreibung | +| -------- | ------------------------ | -------------------------------------------------------------------- | +| `GET` | `/api/events` | Alle Events (Cursor-Pagination, `?since=` für Delta-Sync, `?limit=`) | +| `POST` | `/api/events` | Neues Event erstellen | +| `GET` | `/api/events/{clientId}` | Einzelnes Event | +| `PUT` | `/api/events/{clientId}` | Event aktualisieren | +| `DELETE` | `/api/events/{clientId}` | Event löschen | +| `POST` | `/api/events/sync` | **Batch-Sync** — bis 100 Mutationen auf einmal | + +#### Batch-Sync Endpoint + +Der Kern des Sync-Systems. Verarbeitet create/update/delete in einem Request: + +```json +POST /api/events/sync +{ + "mutations": [ + { "action": "create", "eventId": "uuid", "payload": { "title": "...", ... } }, + { "action": "update", "eventId": "uuid", "payload": { "title": "Neu" } }, + { "action": "delete", "eventId": "uuid", "payload": null } + ] +} + +Response: +{ + "results": [ + { "eventId": "uuid", "status": "ok" }, + { "eventId": "uuid", "status": "ok" }, + { "eventId": "uuid", "status": "ok" } + ] +} +``` + +- **Idempotent**: Doppelte Creates werden ignoriert (kein Fehler) +- **Max 100 Mutationen** pro Request +- **Alle Operationen** sind user-scoped (kein Zugriff auf fremde Events) + +#### JSON-Mapping (EventResource) + +Backend (snake_case) → Frontend (camelCase): + +``` +client_id → id +custom_color → customColor +gradient_preset → gradientPreset +syncStatus → immer 'synced' (vom Server) +created_at → createdAt (Millisekunden) +updated_at → updatedAt (Millisekunden) +``` + +#### Authentifizierung + +- **Laravel Passport v13.5** (OAuth2) +- Guard: `auth:api` auf allen API-Routen +- Token wird im Frontend in IndexedDB `meta` Tabelle gespeichert + +#### Tests + +12 Pest-Tests in `tests/Feature/Api/EventTest.php`: + +| Test | Was | +| -------------------------------------- | ----------------------------------------- | +| can list events | GET /api/events gibt eigene Events zurück | +| list only returns own events | Keine fremden Events sichtbar | +| can filter events by since | Delta-Sync Filter funktioniert | +| can create an event | POST mit UUID → 201 Created | +| create validates required fields | Fehler bei fehlenden Pflichtfeldern | +| can show a single event | GET /api/events/{id} | +| cannot show another users event | 404 bei fremdem Event | +| can update an event | PUT mit Partial-Update | +| can delete an event | DELETE → 204 No Content | +| cannot delete another users event | 404 bei fremdem Event | +| batch sync creates updates and deletes | Alle 3 Aktionen in einem Request | +| sync is idempotent for creates | Doppelter Create = kein Fehler | + +### 5.2 Frontend Sync Service + +#### Neue Dateien + +| Datei | Zweck | +| ----------------------------- | ----------- | +| `src/services/syncService.js` | Sync-Engine | + +#### Geänderte Dateien + +| Datei | Änderung | +| ---------------------- | ----------------------------------------------- | +| `src/stores/events.js` | `startAutoSync()` bei Init wenn Token vorhanden | + +#### Sync-Ablauf + +``` +App Start + ↓ +Events aus IndexedDB laden + ↓ +Token vorhanden? → startAutoSync() + ↓ +┌─────────────────────────────────────┐ +│ fullSync() — alle 30s + reconnect │ +│ │ +│ 1. processSyncQueue() │ +│ → Sync Queue lesen (FIFO) │ +│ → POST /api/events/sync │ +│ → Erfolgreiche Items löschen │ +│ → syncStatus → 'synced' │ +│ │ +│ 2. pullRemoteChanges() │ +│ → GET /api/events?since=... │ +│ → Last-Write-Wins Merge │ +│ → Neue Events → IndexedDB │ +│ → Sync Cursor updaten │ +└─────────────────────────────────────┘ +``` + +#### Conflict Resolution + +**Last-Write-Wins** basierend auf `updatedAt`: + +- Remote neuer UND lokal `synced` → Remote übernehmen +- Lokal `modified` → Lokale Änderung behalten, wird via Sync Queue gepusht +- Neues Remote Event (nicht lokal vorhanden) → Einfügen + +#### Netzwerk-Erkennung + +```javascript +window.addEventListener('online', () => { + isOnline.value = true + processSyncQueue() // Sofort pushen bei Reconnect +}) +window.addEventListener('offline', () => { + isOnline.value = false +}) +``` + +#### Exports + +```javascript +import { + isOnline, // ref — Netzwerkstatus + isSyncing, // ref — Sync läuft gerade + lastSyncAt, // ref — Timestamp letzter Sync + getToken, // () → Promise + setToken, // (token) → Promise + apiFetch, // (path, options) → Promise + processSyncQueue, // () → Promise + pullRemoteChanges, // () → Promise + fullSync, // () → Promise + startAutoSync, // () → void — Startet 30s Intervall + stopAutoSync, // () → void — Stoppt Intervall +} from 'src/services/syncService' +``` + +--- + +## 6. Datenfluss-Übersicht + +``` +┌─────────────────────────────────────────────────────────────┐ +│ FRONTEND │ +│ │ +│ User → Vue Component → Pinia Store (ref sofort updaten) │ +│ ↓ │ +│ IndexedDB (Dexie.js) │ +│ ┌──────────────────┐ │ +│ │ events │ ← Alle Events │ +│ │ syncQueue │ ← Outbound Queue │ +│ │ imageCache │ ← Thumbnails │ +│ │ meta │ ← Token, Cursor │ +│ └──────────────────┘ │ +│ ↓ │ +│ Sync Service (30s) │ +│ Push Queue → Pull Changes │ +└──────────────────────────────┬──────────────────────────────┘ + │ + POST /api/events/sync + GET /api/events?since= + │ +┌──────────────────────────────┴──────────────────────────────┐ +│ BACKEND │ +│ │ +│ Laravel 12 + Passport OAuth2 │ +│ EventController → Event Model → MySQL │ +│ │ +│ events: id, client_id, user_id, title, date, emotion, ... │ +└─────────────────────────────────────────────────────────────┘ +``` + +--- + +## 7. Noch offen (Phase 5) + +**Chunked Loading** — Erst bei 500+ Events relevant: + +- `src/services/chunkLoader.js` — Scroll-triggered Loading +- Nur 100 Events um aktuelle Scroll-Position laden +- Bei Scroll an Boundary: nächsten Chunk nachladen (200ms Debounce) +- API Cursor-Pagination für initiales Laden großer Datasets + +Wird erst implementiert wenn die Datenmenge es erfordert. diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 88b8033..d9eaf63 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -10,7 +10,7 @@ "hasInstallScript": true, "dependencies": { "@quasar/extras": "^1.16.4", - "gsap": "^3.13.0", + "dexie": "^4.3.0", "pinia": "^3.0.1", "quasar": "^2.16.0", "three": "^0.183.0", @@ -34,6 +34,11 @@ "node": "^28 || ^26 || ^24 || ^22 || ^20 || ^18", "npm": ">= 6.13.4", "yarn": ">= 1.21.1" + }, + "optionalDependencies": { + "@rollup/rollup-darwin-arm64": "^4.0.0", + "@rollup/rollup-linux-arm64-gnu": "^4.0.0", + "@rollup/rollup-linux-x64-gnu": "^4.0.0" } }, "node_modules/@babel/code-frame": { @@ -655,20 +660,20 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz", - "integrity": "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.4.tgz", + "integrity": "sha512-4h4MVF8pmBsncB60r0wSJiIeUKTSD4m7FmTFThG8RHlsg9ajqckLm9OraguFGZE4vVdpiI1Q4+hFnisopmG6gQ==", "dev": true, "license": "MIT", "dependencies": { - "ajv": "^6.12.4", + "ajv": "^6.14.0", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.1", - "minimatch": "^3.1.2", + "minimatch": "^3.1.3", "strip-json-comments": "^3.1.1" }, "engines": { @@ -717,9 +722,9 @@ "license": "MIT" }, "node_modules/@eslint/js": { - "version": "9.39.2", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz", - "integrity": "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==", + "version": "9.39.3", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.3.tgz", + "integrity": "sha512-1B1VkCq6FuUNlQvlBYb+1jDu/gV297TIs/OeiaSR9l1H27SVW55ONE1e1Vp16NqP683+xEGzxYtv4XCiDPaQiw==", "dev": true, "license": "MIT", "engines": { @@ -1515,9 +1520,9 @@ "license": "MIT" }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.57.1.tgz", - "integrity": "sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz", + "integrity": "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==", "cpu": [ "arm" ], @@ -1529,9 +1534,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.57.1.tgz", - "integrity": "sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz", + "integrity": "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==", "cpu": [ "arm64" ], @@ -1543,13 +1548,12 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.57.1.tgz", - "integrity": "sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz", + "integrity": "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1557,9 +1561,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.57.1.tgz", - "integrity": "sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz", + "integrity": "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==", "cpu": [ "x64" ], @@ -1571,9 +1575,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.57.1.tgz", - "integrity": "sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz", + "integrity": "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==", "cpu": [ "arm64" ], @@ -1585,9 +1589,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.57.1.tgz", - "integrity": "sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz", + "integrity": "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==", "cpu": [ "x64" ], @@ -1599,9 +1603,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.57.1.tgz", - "integrity": "sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz", + "integrity": "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==", "cpu": [ "arm" ], @@ -1613,9 +1617,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.57.1.tgz", - "integrity": "sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz", + "integrity": "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==", "cpu": [ "arm" ], @@ -1627,13 +1631,12 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.57.1.tgz", - "integrity": "sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz", + "integrity": "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1641,9 +1644,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.57.1.tgz", - "integrity": "sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz", + "integrity": "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==", "cpu": [ "arm64" ], @@ -1655,9 +1658,9 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.57.1.tgz", - "integrity": "sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz", + "integrity": "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==", "cpu": [ "loong64" ], @@ -1669,9 +1672,9 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.57.1.tgz", - "integrity": "sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz", + "integrity": "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==", "cpu": [ "loong64" ], @@ -1683,9 +1686,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.57.1.tgz", - "integrity": "sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz", + "integrity": "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==", "cpu": [ "ppc64" ], @@ -1697,9 +1700,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.57.1.tgz", - "integrity": "sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz", + "integrity": "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==", "cpu": [ "ppc64" ], @@ -1711,9 +1714,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.57.1.tgz", - "integrity": "sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz", + "integrity": "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==", "cpu": [ "riscv64" ], @@ -1725,9 +1728,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.57.1.tgz", - "integrity": "sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz", + "integrity": "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==", "cpu": [ "riscv64" ], @@ -1739,9 +1742,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.57.1.tgz", - "integrity": "sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz", + "integrity": "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==", "cpu": [ "s390x" ], @@ -1753,13 +1756,12 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.57.1.tgz", - "integrity": "sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz", + "integrity": "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1767,9 +1769,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.57.1.tgz", - "integrity": "sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz", + "integrity": "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==", "cpu": [ "x64" ], @@ -1781,9 +1783,9 @@ ] }, "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.57.1.tgz", - "integrity": "sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz", + "integrity": "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==", "cpu": [ "x64" ], @@ -1795,9 +1797,9 @@ ] }, "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.57.1.tgz", - "integrity": "sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz", + "integrity": "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==", "cpu": [ "arm64" ], @@ -1809,9 +1811,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.57.1.tgz", - "integrity": "sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz", + "integrity": "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==", "cpu": [ "arm64" ], @@ -1823,9 +1825,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.57.1.tgz", - "integrity": "sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz", + "integrity": "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==", "cpu": [ "ia32" ], @@ -1837,9 +1839,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.57.1.tgz", - "integrity": "sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz", + "integrity": "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==", "cpu": [ "x64" ], @@ -1851,9 +1853,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.57.1.tgz", - "integrity": "sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz", + "integrity": "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==", "cpu": [ "x64" ], @@ -2077,13 +2079,13 @@ } }, "node_modules/@vue/compiler-core": { - "version": "3.5.28", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.28.tgz", - "integrity": "sha512-kviccYxTgoE8n6OCw96BNdYlBg2GOWfBuOW4Vqwrt7mSKWKwFVvI8egdTltqRgITGPsTFYtKYfxIG8ptX2PJHQ==", + "version": "3.5.29", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.29.tgz", + "integrity": "sha512-cuzPhD8fwRHk8IGfmYaR4eEe4cAyJEL66Ove/WZL7yWNL134nqLddSLwNRIsFlnnW1kK+p8Ck3viFnC0chXCXw==", "license": "MIT", "dependencies": { "@babel/parser": "^7.29.0", - "@vue/shared": "3.5.28", + "@vue/shared": "3.5.29", "entities": "^7.0.1", "estree-walker": "^2.0.2", "source-map-js": "^1.2.1" @@ -2102,26 +2104,26 @@ } }, "node_modules/@vue/compiler-dom": { - "version": "3.5.28", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.28.tgz", - "integrity": "sha512-/1ZepxAb159jKR1btkefDP+J2xuWL5V3WtleRmxaT+K2Aqiek/Ab/+Ebrw2pPj0sdHO8ViAyyJWfhXXOP/+LQA==", + "version": "3.5.29", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.29.tgz", + "integrity": "sha512-n0G5o7R3uBVmVxjTIYcz7ovr8sy7QObFG8OQJ3xGCDNhbG60biP/P5KnyY8NLd81OuT1WJflG7N4KWYHaeeaIg==", "license": "MIT", "dependencies": { - "@vue/compiler-core": "3.5.28", - "@vue/shared": "3.5.28" + "@vue/compiler-core": "3.5.29", + "@vue/shared": "3.5.29" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.5.28", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.28.tgz", - "integrity": "sha512-6TnKMiNkd6u6VeVDhZn/07KhEZuBSn43Wd2No5zaP5s3xm8IqFTHBj84HJah4UepSUJTro5SoqqlOY22FKY96g==", + "version": "3.5.29", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.29.tgz", + "integrity": "sha512-oJZhN5XJs35Gzr50E82jg2cYdZQ78wEwvRO6Y63TvLVTc+6xICzJHP1UIecdSPPYIbkautNBanDiWYa64QSFIA==", "license": "MIT", "dependencies": { "@babel/parser": "^7.29.0", - "@vue/compiler-core": "3.5.28", - "@vue/compiler-dom": "3.5.28", - "@vue/compiler-ssr": "3.5.28", - "@vue/shared": "3.5.28", + "@vue/compiler-core": "3.5.29", + "@vue/compiler-dom": "3.5.29", + "@vue/compiler-ssr": "3.5.29", + "@vue/shared": "3.5.29", "estree-walker": "^2.0.2", "magic-string": "^0.30.21", "postcss": "^8.5.6", @@ -2129,13 +2131,13 @@ } }, "node_modules/@vue/compiler-ssr": { - "version": "3.5.28", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.28.tgz", - "integrity": "sha512-JCq//9w1qmC6UGLWJX7RXzrGpKkroubey/ZFqTpvEIDJEKGgntuDMqkuWiZvzTzTA5h2qZvFBFHY7fAAa9475g==", + "version": "3.5.29", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.29.tgz", + "integrity": "sha512-Y/ARJZE6fpjzL5GH/phJmsFwx3g6t2KmHKHx5q+MLl2kencADKIrhH5MLF6HHpRMmlRAYBRSvv347Mepf1zVNw==", "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.5.28", - "@vue/shared": "3.5.28" + "@vue/compiler-dom": "3.5.29", + "@vue/shared": "3.5.29" } }, "node_modules/@vue/devtools-api": { @@ -2187,53 +2189,53 @@ } }, "node_modules/@vue/reactivity": { - "version": "3.5.28", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.28.tgz", - "integrity": "sha512-gr5hEsxvn+RNyu9/9o1WtdYdwDjg5FgjUSBEkZWqgTKlo/fvwZ2+8W6AfKsc9YN2k/+iHYdS9vZYAhpi10kNaw==", + "version": "3.5.29", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.29.tgz", + "integrity": "sha512-zcrANcrRdcLtmGZETBxWqIkoQei8HaFpZWx/GHKxx79JZsiZ8j1du0VUJtu4eJjgFvU/iKL5lRXFXksVmI+5DA==", "license": "MIT", "dependencies": { - "@vue/shared": "3.5.28" + "@vue/shared": "3.5.29" } }, "node_modules/@vue/runtime-core": { - "version": "3.5.28", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.28.tgz", - "integrity": "sha512-POVHTdbgnrBBIpnbYU4y7pOMNlPn2QVxVzkvEA2pEgvzbelQq4ZOUxbp2oiyo+BOtiYlm8Q44wShHJoBvDPAjQ==", + "version": "3.5.29", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.29.tgz", + "integrity": "sha512-8DpW2QfdwIWOLqtsNcds4s+QgwSaHSJY/SUe04LptianUQ/0xi6KVsu/pYVh+HO3NTVvVJjIPL2t6GdeKbS4Lg==", "license": "MIT", "dependencies": { - "@vue/reactivity": "3.5.28", - "@vue/shared": "3.5.28" + "@vue/reactivity": "3.5.29", + "@vue/shared": "3.5.29" } }, "node_modules/@vue/runtime-dom": { - "version": "3.5.28", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.28.tgz", - "integrity": "sha512-4SXxSF8SXYMuhAIkT+eBRqOkWEfPu6nhccrzrkioA6l0boiq7sp18HCOov9qWJA5HML61kW8p/cB4MmBiG9dSA==", + "version": "3.5.29", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.29.tgz", + "integrity": "sha512-AHvvJEtcY9tw/uk+s/YRLSlxxQnqnAkjqvK25ZiM4CllCZWzElRAoQnCM42m9AHRLNJ6oe2kC5DCgD4AUdlvXg==", "license": "MIT", "dependencies": { - "@vue/reactivity": "3.5.28", - "@vue/runtime-core": "3.5.28", - "@vue/shared": "3.5.28", + "@vue/reactivity": "3.5.29", + "@vue/runtime-core": "3.5.29", + "@vue/shared": "3.5.29", "csstype": "^3.2.3" } }, "node_modules/@vue/server-renderer": { - "version": "3.5.28", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.28.tgz", - "integrity": "sha512-pf+5ECKGj8fX95bNincbzJ6yp6nyzuLDhYZCeFxUNp8EBrQpPpQaLX3nNCp49+UbgbPun3CeVE+5CXVV1Xydfg==", + "version": "3.5.29", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.29.tgz", + "integrity": "sha512-G/1k6WK5MusLlbxSE2YTcqAAezS+VuwHhOvLx2KnQU7G2zCH6KIb+5Wyt6UjMq7a3qPzNEjJXs1hvAxDclQH+g==", "license": "MIT", "dependencies": { - "@vue/compiler-ssr": "3.5.28", - "@vue/shared": "3.5.28" + "@vue/compiler-ssr": "3.5.29", + "@vue/shared": "3.5.29" }, "peerDependencies": { - "vue": "3.5.28" + "vue": "3.5.29" } }, "node_modules/@vue/shared": { - "version": "3.5.28", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.28.tgz", - "integrity": "sha512-cfWa1fCGBxrvaHRhvV3Is0MgmrbSCxYTXCSCau2I0a1Xw1N1pHAvkWCiXPRAqjvToILvguNyEwjevUqAuBQWvQ==", + "version": "3.5.29", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.29.tgz", + "integrity": "sha512-w7SR0A5zyRByL9XUkCfdLs7t9XOHUyJ67qPGQjOou3p6GvBeBW+AVjUUmlxtZ4PIYaRvE+1LmK44O4uajlZwcg==", "license": "MIT" }, "node_modules/abort-controller": { @@ -2274,9 +2276,9 @@ } }, "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "dev": true, "license": "MIT", "bin": { @@ -2297,9 +2299,9 @@ } }, "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", "dev": true, "license": "MIT", "dependencies": { @@ -2479,9 +2481,9 @@ } }, "node_modules/b4a": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.5.tgz", - "integrity": "sha512-iEsKNwDh1wiWTps1/hdkNdmBgDlDVZP5U57ZVOlt+dNFqpc/lpPouCIxZw+DYBgc4P9NDfIZMPNR4CHNhzwLIA==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.8.0.tgz", + "integrity": "sha512-qRuSmNSkGQaHwNbM7J78Wwy+ghLEYF1zNrSeMxj4Kgw6y33O3mXcQ6Ie9fRvfU/YnxWkOchPXbaLb73TkIsfdg==", "dev": true, "license": "Apache-2.0", "peerDependencies": { @@ -2809,9 +2811,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001770", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001770.tgz", - "integrity": "sha512-x/2CLQ1jHENRbHg5PSId2sXq1CIO1CISvwWAj027ltMVG2UNgW+w9oH2+HzgEIRFembL8bUlXtfbBHR1fCg2xw==", + "version": "1.0.30001774", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001774.tgz", + "integrity": "sha512-DDdwPGz99nmIEv216hKSgLD+D4ikHQHjBC/seF98N9CPqRX4M5mSxT9eTV6oyisnJcuzxtZy4n17yKKQYmYQOA==", "dev": true, "funding": [ { @@ -3329,6 +3331,12 @@ "node": ">=8" } }, + "node_modules/dexie": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/dexie/-/dexie-4.3.0.tgz", + "integrity": "sha512-5EeoQpJvMKHe6zWt/FSIIuRa3CWlZeIl6zKXt+Lz7BU6RoRRLgX9dZEynRfXrkLcldKYCBiz7xekTEylnie1Ug==", + "license": "Apache-2.0" + }, "node_modules/dot-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", @@ -3415,9 +3423,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.286", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.286.tgz", - "integrity": "sha512-9tfDXhJ4RKFNerfjdCcZfufu49vg620741MNs26a9+bhLThdB+plgMeou98CAaHu/WATj2iHOOHTp1hWtABj2A==", + "version": "1.5.302", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.302.tgz", + "integrity": "sha512-sM6HAN2LyK82IyPBpznDRqlTQAtuSaO+ShzFiWTvoMJLHyZ+Y39r8VMfHzwbU8MVBzQ4Wdn85+wlZl2TLGIlwg==", "dev": true, "license": "ISC" }, @@ -3570,9 +3578,9 @@ } }, "node_modules/eslint": { - "version": "9.39.2", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.2.tgz", - "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", + "version": "9.39.3", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.3.tgz", + "integrity": "sha512-VmQ+sifHUbI/IcSopBCF/HO3YiHQx/AVd3UVyYL6weuwW+HvON9VYn5l6Zl1WZzPWXPNZrSQpxwkkZ/VuvJZzg==", "dev": true, "license": "MIT", "dependencies": { @@ -3582,7 +3590,7 @@ "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.39.2", + "@eslint/js": "9.39.3", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", @@ -4256,24 +4264,37 @@ "node": ">= 6" } }, + "node_modules/glob/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, "node_modules/glob/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.3.tgz", + "integrity": "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0" + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" } }, "node_modules/glob/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.7.tgz", + "integrity": "sha512-MOwgjc8tfrpn5QQEvjijjmDVtMw2oL88ugTevzxQnzRLm6l3fVEF2gzU0kYeYYKD8C66+IdGX6peJ4MyUlUnPg==", "dev": true, "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^5.0.2" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -5072,9 +5093,9 @@ } }, "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.4.tgz", + "integrity": "sha512-twmL+S8+7yIsE9wsqgzU3E8/LumN3M3QELrBZ20OdmQ9jB2JvW5oZtBEmft84k/Gs5CG9mqtWc6Y9vW+JEzGxw==", "dev": true, "license": "ISC", "dependencies": { @@ -5829,9 +5850,9 @@ } }, "node_modules/readdir-glob/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.8.tgz", + "integrity": "sha512-7RN35vit8DeBclkofOVmBY0eDAZZQd1HzmukRdSyz95CRh8FT54eqnbj0krQr3mrHR6sfRyYkyhwBWjoV5uqlQ==", "dev": true, "license": "ISC", "dependencies": { @@ -5912,9 +5933,9 @@ "license": "MIT" }, "node_modules/rollup": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.57.1.tgz", - "integrity": "sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz", + "integrity": "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==", "dev": true, "license": "MIT", "dependencies": { @@ -5928,31 +5949,31 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.57.1", - "@rollup/rollup-android-arm64": "4.57.1", - "@rollup/rollup-darwin-arm64": "4.57.1", - "@rollup/rollup-darwin-x64": "4.57.1", - "@rollup/rollup-freebsd-arm64": "4.57.1", - "@rollup/rollup-freebsd-x64": "4.57.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.57.1", - "@rollup/rollup-linux-arm-musleabihf": "4.57.1", - "@rollup/rollup-linux-arm64-gnu": "4.57.1", - "@rollup/rollup-linux-arm64-musl": "4.57.1", - "@rollup/rollup-linux-loong64-gnu": "4.57.1", - "@rollup/rollup-linux-loong64-musl": "4.57.1", - "@rollup/rollup-linux-ppc64-gnu": "4.57.1", - "@rollup/rollup-linux-ppc64-musl": "4.57.1", - "@rollup/rollup-linux-riscv64-gnu": "4.57.1", - "@rollup/rollup-linux-riscv64-musl": "4.57.1", - "@rollup/rollup-linux-s390x-gnu": "4.57.1", - "@rollup/rollup-linux-x64-gnu": "4.57.1", - "@rollup/rollup-linux-x64-musl": "4.57.1", - "@rollup/rollup-openbsd-x64": "4.57.1", - "@rollup/rollup-openharmony-arm64": "4.57.1", - "@rollup/rollup-win32-arm64-msvc": "4.57.1", - "@rollup/rollup-win32-ia32-msvc": "4.57.1", - "@rollup/rollup-win32-x64-gnu": "4.57.1", - "@rollup/rollup-win32-x64-msvc": "4.57.1", + "@rollup/rollup-android-arm-eabi": "4.59.0", + "@rollup/rollup-android-arm64": "4.59.0", + "@rollup/rollup-darwin-arm64": "4.59.0", + "@rollup/rollup-darwin-x64": "4.59.0", + "@rollup/rollup-freebsd-arm64": "4.59.0", + "@rollup/rollup-freebsd-x64": "4.59.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.59.0", + "@rollup/rollup-linux-arm-musleabihf": "4.59.0", + "@rollup/rollup-linux-arm64-gnu": "4.59.0", + "@rollup/rollup-linux-arm64-musl": "4.59.0", + "@rollup/rollup-linux-loong64-gnu": "4.59.0", + "@rollup/rollup-linux-loong64-musl": "4.59.0", + "@rollup/rollup-linux-ppc64-gnu": "4.59.0", + "@rollup/rollup-linux-ppc64-musl": "4.59.0", + "@rollup/rollup-linux-riscv64-gnu": "4.59.0", + "@rollup/rollup-linux-riscv64-musl": "4.59.0", + "@rollup/rollup-linux-s390x-gnu": "4.59.0", + "@rollup/rollup-linux-x64-gnu": "4.59.0", + "@rollup/rollup-linux-x64-musl": "4.59.0", + "@rollup/rollup-openbsd-x64": "4.59.0", + "@rollup/rollup-openharmony-arm64": "4.59.0", + "@rollup/rollup-win32-arm64-msvc": "4.59.0", + "@rollup/rollup-win32-ia32-msvc": "4.59.0", + "@rollup/rollup-win32-x64-gnu": "4.59.0", + "@rollup/rollup-win32-x64-msvc": "4.59.0", "fsevents": "~2.3.2" } }, @@ -7035,9 +7056,9 @@ } }, "node_modules/three": { - "version": "0.183.0", - "resolved": "https://registry.npmjs.org/three/-/three-0.183.0.tgz", - "integrity": "sha512-G6SH2jfefIVa2YI4JL2VbgQhrrbp1A8dRc7lr3PW827kdVyaX2RgH6M5FmjmdVFLgSHppyg3OYOZdTfWElle+g==", + "version": "0.183.1", + "resolved": "https://registry.npmjs.org/three/-/three-0.183.1.tgz", + "integrity": "sha512-Psv6bbd3d/M/01MT2zZ+VmD0Vj2dbWTNhfe4CuSg7w5TuW96M3NOyCVuh9SZQ05CpGmD7NEcJhZw4GVjhCYxfQ==", "license": "MIT" }, "node_modules/tiny-invariant": { @@ -8034,16 +8055,16 @@ "license": "MIT" }, "node_modules/vue": { - "version": "3.5.28", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.28.tgz", - "integrity": "sha512-BRdrNfeoccSoIZeIhyPBfvWSLFP4q8J3u8Ju8Ug5vu3LdD+yTM13Sg4sKtljxozbnuMu1NB1X5HBHRYUzFocKg==", + "version": "3.5.29", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.29.tgz", + "integrity": "sha512-BZqN4Ze6mDQVNAni0IHeMJ5mwr8VAJ3MQC9FmprRhcBYENw+wOAAjRj8jfmN6FLl0j96OXbR+CjWhmAmM+QGnA==", "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.5.28", - "@vue/compiler-sfc": "3.5.28", - "@vue/runtime-dom": "3.5.28", - "@vue/server-renderer": "3.5.28", - "@vue/shared": "3.5.28" + "@vue/compiler-dom": "3.5.29", + "@vue/compiler-sfc": "3.5.29", + "@vue/runtime-dom": "3.5.29", + "@vue/server-renderer": "3.5.29", + "@vue/shared": "3.5.29" }, "peerDependencies": { "typescript": "*" diff --git a/frontend/package.json b/frontend/package.json index e072091..91ed7f8 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -10,12 +10,13 @@ "lint": "eslint -c ./eslint.config.js \"./src*/**/*.{js,cjs,mjs,vue}\"", "format": "prettier --write \"**/*.{js,vue,scss,html,md,json}\" --ignore-path .gitignore", "test": "echo \"No test specified\" && exit 0", - "dev": "quasar dev", + "dev": "npm install && quasar dev", "build": "quasar build", "postinstall": "quasar prepare" }, "dependencies": { "@quasar/extras": "^1.16.4", + "dexie": "^4.3.0", "pinia": "^3.0.1", "quasar": "^2.16.0", "three": "^0.183.0", @@ -23,6 +24,11 @@ "vue-router": "^4.0.0", "vue-select": "^4.0.0-beta.6" }, + "optionalDependencies": { + "@rollup/rollup-darwin-arm64": "^4.0.0", + "@rollup/rollup-linux-arm64-gnu": "^4.0.0", + "@rollup/rollup-linux-x64-gnu": "^4.0.0" + }, "devDependencies": { "@eslint/js": "^9.14.0", "@quasar/app-vite": "^2.1.0", @@ -40,4 +46,4 @@ "npm": ">= 6.13.4", "yarn": ">= 1.21.1" } -} +} \ No newline at end of file diff --git a/frontend/quasar.config.js b/frontend/quasar.config.js index 3ec6b18..b90233b 100644 --- a/frontend/quasar.config.js +++ b/frontend/quasar.config.js @@ -3,7 +3,7 @@ import { defineConfig } from '#q-app/wrappers' -export default defineConfig((/* ctx */) => { +export default defineConfig((ctx) => { return { // https://v2.quasar.dev/quasar-cli-vite/prefetch-feature // preFetch: true, @@ -11,13 +11,10 @@ export default defineConfig((/* ctx */) => { // app boot file (/src/boot) // --> boot files are part of "main.js" // https://v2.quasar.dev/quasar-cli-vite/boot-files - boot: [ - ], + boot: [], // https://v2.quasar.dev/quasar-cli-vite/quasar-config-file#css - css: [ - 'app.scss' - ], + css: ['app.scss'], // https://github.com/quasarframework/quasar/tree/dev/extras extras: [ @@ -36,8 +33,8 @@ export default defineConfig((/* ctx */) => { // Full list of options: https://v2.quasar.dev/quasar-cli-vite/quasar-config-file#build build: { target: { - browser: [ 'es2022', 'firefox115', 'chrome115', 'safari14' ], - node: 'node20' + browser: ['es2022', 'firefox115', 'chrome115', 'safari14'], + node: 'node20', }, vueRouterMode: 'hash', // available values: 'hash', 'history' @@ -56,24 +53,34 @@ export default defineConfig((/* ctx */) => { // polyfillModulePreload: true, // distDir - // extendViteConf (viteConf) {}, + extendViteConf(viteConf) { + const srcDir = new URL('./src/composables', import.meta.url).pathname + viteConf.resolve.alias['composables'] = srcDir + }, // viteVuePluginOptions: {}, - - vitePlugins: [ - ['vite-plugin-checker', { - eslint: { - lintCommand: 'eslint -c ./eslint.config.js "./src*/**/*.{js,mjs,cjs,vue}"', - useFlatConfig: true - } - }, { server: false }] - ] + + vitePlugins: + ctx.prod && ctx.modeName !== 'capacitor' + ? [ + [ + 'vite-plugin-checker', + { + eslint: { + lintCommand: 'eslint -c ./eslint.config.js "./src/**/*.{js,mjs,cjs,vue}"', + useFlatConfig: true, + }, + }, + { server: false }, + ], + ] + : [], }, // Full list of options: https://v2.quasar.dev/quasar-cli-vite/quasar-config-file#devserver devServer: { // https: true, open: true, // opens browser window automatically - allowedHosts: ['app.thats-me.test'] + allowedHosts: ['app.thats-me.test'], }, // https://v2.quasar.dev/quasar-cli-vite/quasar-config-file#framework @@ -91,7 +98,7 @@ export default defineConfig((/* ctx */) => { // directives: [], // Quasar plugins - plugins: ['Dark'] + plugins: ['Dark'], }, htmlVariables: { @@ -118,10 +125,10 @@ export default defineConfig((/* ctx */) => { // https://v2.quasar.dev/quasar-cli-vite/developing-ssr/configuring-ssr ssr: { prodPort: 3000, // The default port that the production server should use - // (gets superseded if process.env.PORT is specified at runtime) + // (gets superseded if process.env.PORT is specified at runtime) middlewares: [ - 'render' // keep this as last one + 'render', // keep this as last one ], // extendPackageJson (json) {}, @@ -132,7 +139,7 @@ export default defineConfig((/* ctx */) => { // manualStoreHydration: true, // manualPostHydrationTrigger: true, - pwa: false + pwa: false, // pwaOfflineHtmlFilename: 'offline.html', // do NOT use index.html as name! // pwaExtendGenerateSWOptions (cfg) {}, @@ -141,7 +148,7 @@ export default defineConfig((/* ctx */) => { // https://v2.quasar.dev/quasar-cli-vite/developing-pwa/configuring-pwa pwa: { - workboxMode: 'GenerateSW' // 'GenerateSW' or 'InjectManifest' + workboxMode: 'GenerateSW', // 'GenerateSW' or 'InjectManifest' // swFilename: 'sw.js', // manifestFilename: 'manifest.json', // extendManifestJson (json) {}, @@ -159,7 +166,7 @@ export default defineConfig((/* ctx */) => { // Full list of options: https://v2.quasar.dev/quasar-cli-vite/developing-capacitor-apps/configuring-capacitor capacitor: { - hideSplashscreen: true + hideSplashscreen: true, }, // Full list of options: https://v2.quasar.dev/quasar-cli-vite/developing-electron-apps/configuring-electron @@ -170,7 +177,7 @@ export default defineConfig((/* ctx */) => { // extendPackageJson (json) {}, // Electron preload scripts (if any) from /src-electron, WITHOUT file extension - preloadScripts: [ 'electron-preload' ], + preloadScripts: ['electron-preload'], // specify the debugging port to use for the Electron app when running in development mode inspectPort: 5858, @@ -179,13 +186,11 @@ export default defineConfig((/* ctx */) => { packager: { // https://github.com/electron-userland/electron-packager/blob/master/docs/api.md#options - // OS X / Mac App Store // appBundleId: '', // appCategoryType: '', // osxSign: '', // protocol: 'myapp://path', - // Windows only // win32metadata: { ... } }, @@ -193,8 +198,8 @@ export default defineConfig((/* ctx */) => { builder: { // https://www.electron.build/configuration/configuration - appId: 'thatsme-quasar' - } + appId: 'thatsme-quasar', + }, }, // Full list of options: https://v2.quasar.dev/quasar-cli-vite/developing-browser-extensions/configuring-bex @@ -210,7 +215,7 @@ export default defineConfig((/* ctx */) => { * * @example [ 'my-script.ts', 'sub-folder/my-other-script.js' ] */ - extraScripts: [] - } + extraScripts: [], + }, } }) diff --git a/frontend/src-capacitor/capacitor.config.json b/frontend/src-capacitor/capacitor.config.json new file mode 100644 index 0000000..b4e059f --- /dev/null +++ b/frontend/src-capacitor/capacitor.config.json @@ -0,0 +1,21 @@ +{ + "appId": "media.adametz.thatsme", + "appName": "Thats Me", + "webDir": "www", + "plugins": { + "SplashScreen": { + "launchShowDuration": 0 + }, + "StatusBar": { + "overlaysWebView": false, + "style": "light", + "backgroundColor": "#000000" + } + }, + "ios": { + "contentInset": "never" + }, + "android": { + "allowMixedContent": false + } +} \ No newline at end of file diff --git a/frontend/src-capacitor/package-lock.json b/frontend/src-capacitor/package-lock.json new file mode 100644 index 0000000..048149f --- /dev/null +++ b/frontend/src-capacitor/package-lock.json @@ -0,0 +1,1094 @@ +{ + "name": "thatsme-quasar", + "version": "0.0.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "thatsme-quasar", + "version": "0.0.1", + "dependencies": { + "@capacitor/app": "^7.0.0", + "@capacitor/cli": "^7.0.0", + "@capacitor/core": "^7.0.0", + "@capacitor/ios": "^7.5.0", + "@capacitor/status-bar": "^7.0.0" + } + }, + "node_modules/@capacitor/app": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@capacitor/app/-/app-7.1.2.tgz", + "integrity": "sha512-d4I/oF/PRu4megL7/IGKYfe5j7yzSON1FRFgq6kH+m5kH6g7V+wyjHRLauCzGNjdRx4S+nWOumINds0qcRBtKg==", + "license": "MIT", + "peerDependencies": { + "@capacitor/core": ">=7.0.0" + } + }, + "node_modules/@capacitor/cli": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@capacitor/cli/-/cli-7.5.0.tgz", + "integrity": "sha512-mlohsvLZjWrO5eAVTn1+dABNQwQawcphVp6NQVJZ3I4x2BAoNmJj53QflX7PYGUipL9gF9EM9Yiku3m1McxFZg==", + "license": "MIT", + "dependencies": { + "@ionic/cli-framework-output": "^2.2.8", + "@ionic/utils-subprocess": "^3.0.1", + "@ionic/utils-terminal": "^2.3.5", + "commander": "^12.1.0", + "debug": "^4.4.0", + "env-paths": "^2.2.0", + "fs-extra": "^11.2.0", + "kleur": "^4.1.5", + "native-run": "^2.0.3", + "open": "^8.4.0", + "plist": "^3.1.0", + "prompts": "^2.4.2", + "rimraf": "^6.0.1", + "semver": "^7.6.3", + "tar": "^7.5.3", + "tslib": "^2.8.1", + "xml2js": "^0.6.2" + }, + "bin": { + "cap": "bin/capacitor", + "capacitor": "bin/capacitor" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@capacitor/core": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@capacitor/core/-/core-7.5.0.tgz", + "integrity": "sha512-4Y4trISe2Bp3lwsoGFoQIvgX4hiZO8S1Slmbz6oFaMxAuEc4noipQGCQx974PF4glwVVe/8+H3P9iEmCXtrUgA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@capacitor/ios": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@capacitor/ios/-/ios-7.5.0.tgz", + "integrity": "sha512-HlEWLjmPMSyjD8pM2FSTYF7a7aoYDdrlUoA3Ybm8OnmOaby3R7L8jpzJr96igh/i2SpsHvDI7v3sO2FhSNKCKA==", + "license": "MIT", + "peerDependencies": { + "@capacitor/core": "^7.5.0" + } + }, + "node_modules/@capacitor/status-bar": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/@capacitor/status-bar/-/status-bar-7.0.5.tgz", + "integrity": "sha512-d0DI/Usy4RrNiV5xfnypXNRLmWYMixC2yAUAwe6sCQQ0HF7oskDf4RpCxcZqbxnpc4H4A0qqiOSltfJLFAYshg==", + "license": "MIT", + "peerDependencies": { + "@capacitor/core": ">=7.0.0" + } + }, + "node_modules/@ionic/cli-framework-output": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/@ionic/cli-framework-output/-/cli-framework-output-2.2.8.tgz", + "integrity": "sha512-TshtaFQsovB4NWRBydbNFawql6yul7d5bMiW1WYYf17hd99V6xdDdk3vtF51bw6sLkxON3bDQpWsnUc9/hVo3g==", + "license": "MIT", + "dependencies": { + "@ionic/utils-terminal": "2.3.5", + "debug": "^4.0.0", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@ionic/utils-array": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@ionic/utils-array/-/utils-array-2.1.6.tgz", + "integrity": "sha512-0JZ1Zkp3wURnv8oq6Qt7fMPo5MpjbLoUoa9Bu2Q4PJuSDWM8H8gwF3dQO7VTeUj3/0o1IB1wGkFWZZYgUXZMUg==", + "license": "MIT", + "dependencies": { + "debug": "^4.0.0", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@ionic/utils-fs": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@ionic/utils-fs/-/utils-fs-3.1.7.tgz", + "integrity": "sha512-2EknRvMVfhnyhL1VhFkSLa5gOcycK91VnjfrTB0kbqkTFCOXyXgVLI5whzq7SLrgD9t1aqos3lMMQyVzaQ5gVA==", + "license": "MIT", + "dependencies": { + "@types/fs-extra": "^8.0.0", + "debug": "^4.0.0", + "fs-extra": "^9.0.0", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@ionic/utils-fs/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@ionic/utils-object": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@ionic/utils-object/-/utils-object-2.1.6.tgz", + "integrity": "sha512-vCl7sl6JjBHFw99CuAqHljYJpcE88YaH2ZW4ELiC/Zwxl5tiwn4kbdP/gxi2OT3MQb1vOtgAmSNRtusvgxI8ww==", + "license": "MIT", + "dependencies": { + "debug": "^4.0.0", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@ionic/utils-process": { + "version": "2.1.12", + "resolved": "https://registry.npmjs.org/@ionic/utils-process/-/utils-process-2.1.12.tgz", + "integrity": "sha512-Jqkgyq7zBs/v/J3YvKtQQiIcxfJyplPgECMWgdO0E1fKrrH8EF0QGHNJ9mJCn6PYe2UtHNS8JJf5G21e09DfYg==", + "license": "MIT", + "dependencies": { + "@ionic/utils-object": "2.1.6", + "@ionic/utils-terminal": "2.3.5", + "debug": "^4.0.0", + "signal-exit": "^3.0.3", + "tree-kill": "^1.2.2", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@ionic/utils-stream": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@ionic/utils-stream/-/utils-stream-3.1.7.tgz", + "integrity": "sha512-eSELBE7NWNFIHTbTC2jiMvh1ABKGIpGdUIvARsNPMNQhxJB3wpwdiVnoBoTYp+5a6UUIww4Kpg7v6S7iTctH1w==", + "license": "MIT", + "dependencies": { + "debug": "^4.0.0", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@ionic/utils-subprocess": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@ionic/utils-subprocess/-/utils-subprocess-3.0.1.tgz", + "integrity": "sha512-cT4te3AQQPeIM9WCwIg8ohroJ8TjsYaMb2G4ZEgv9YzeDqHZ4JpeIKqG2SoaA3GmVQ3sOfhPM6Ox9sxphV/d1A==", + "license": "MIT", + "dependencies": { + "@ionic/utils-array": "2.1.6", + "@ionic/utils-fs": "3.1.7", + "@ionic/utils-process": "2.1.12", + "@ionic/utils-stream": "3.1.7", + "@ionic/utils-terminal": "2.3.5", + "cross-spawn": "^7.0.3", + "debug": "^4.0.0", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@ionic/utils-terminal": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@ionic/utils-terminal/-/utils-terminal-2.3.5.tgz", + "integrity": "sha512-3cKScz9Jx2/Pr9ijj1OzGlBDfcmx7OMVBt4+P1uRR0SSW4cm1/y3Mo4OY3lfkuaYifMNBW8Wz6lQHbs1bihr7A==", + "license": "MIT", + "dependencies": { + "@types/slice-ansi": "^4.0.0", + "debug": "^4.0.0", + "signal-exit": "^3.0.3", + "slice-ansi": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "tslib": "^2.0.1", + "untildify": "^4.0.0", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@types/fs-extra": { + "version": "8.1.5", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.1.5.tgz", + "integrity": "sha512-0dzKcwO+S8s2kuF5Z9oUWatQJj5Uq/iqphEtE3GQJVRRYm/tD1LglU2UnXi2A8jLq5umkGouOXOR9y0n613ZwQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.3.0.tgz", + "integrity": "sha512-4K3bqJpXpqfg2XKGK9bpDTc6xO/xoUP/RBWS7AtRMug6zZFaRekiLzjVtAoZMquxoAbzBvy5nxQ7veS5eYzf8A==", + "license": "MIT", + "dependencies": { + "undici-types": "~7.18.0" + } + }, + "node_modules/@types/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-+OpjSaq85gvlZAYINyzKpLeiFkSC4EsC6IIiT6v6TLSU5k5U83fHGj9Lel8oKEXM0HqgrMVCjXPDPVICtxF7EQ==", + "license": "MIT" + }, + "node_modules/@xmldom/xmldom": { + "version": "0.8.11", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.11.tgz", + "integrity": "sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "license": "ISC", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/big-integer": { + "version": "1.6.52", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", + "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", + "license": "Unlicense", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/bplist-parser": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.2.tgz", + "integrity": "sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==", + "license": "MIT", + "dependencies": { + "big-integer": "1.6.x" + }, + "engines": { + "node": ">= 5.10.0" + } + }, + "node_modules/brace-expansion": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.3.tgz", + "integrity": "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/elementtree": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/elementtree/-/elementtree-0.1.7.tgz", + "integrity": "sha512-wkgGT6kugeQk/P6VZ/f4T+4HB41BVgNBq5CDIZVbQ02nvTVqAiVTbskxxu3eA/X96lMlfYOwnLQpN2v5E1zDEg==", + "license": "Apache-2.0", + "dependencies": { + "sax": "1.1.4" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "license": "MIT", + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/fs-extra": { + "version": "11.3.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.3.tgz", + "integrity": "sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/glob": { + "version": "13.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", + "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", + "license": "BlueOak-1.0.0", + "dependencies": { + "minimatch": "^10.2.2", + "minipass": "^7.1.3", + "path-scurry": "^2.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ini": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.3.tgz", + "integrity": "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==", + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/lru-cache": { + "version": "11.2.6", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.6.tgz", + "integrity": "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==", + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/minimatch": { + "version": "10.2.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.3.tgz", + "integrity": "sha512-Rwi3pnapEqirPSbWbrZaa6N3nmqq4Xer/2XooiOKyV3q12ML06f7MOuc5DVH8ONZIFhwIYQ3yzPH4nt7iWHaTg==", + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minizlib": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/native-run": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/native-run/-/native-run-2.0.3.tgz", + "integrity": "sha512-U1PllBuzW5d1gfan+88L+Hky2eZx+9gv3Pf6rNBxKbORxi7boHzqiA6QFGSnqMem4j0A9tZ08NMIs5+0m/VS1Q==", + "license": "MIT", + "dependencies": { + "@ionic/utils-fs": "^3.1.7", + "@ionic/utils-terminal": "^2.3.4", + "bplist-parser": "^0.3.2", + "debug": "^4.3.4", + "elementtree": "^0.1.7", + "ini": "^4.1.1", + "plist": "^3.1.0", + "split2": "^4.2.0", + "through2": "^4.0.2", + "tslib": "^2.6.2", + "yauzl": "^2.10.0" + }, + "bin": { + "native-run": "bin/native-run" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "license": "MIT", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "license": "BlueOak-1.0.0" + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-scurry": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", + "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "license": "MIT" + }, + "node_modules/plist": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", + "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", + "license": "MIT", + "dependencies": { + "@xmldom/xmldom": "^0.8.8", + "base64-js": "^1.5.1", + "xmlbuilder": "^15.1.1" + }, + "engines": { + "node": ">=10.4.0" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prompts/node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/rimraf": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.1.3.tgz", + "integrity": "sha512-LKg+Cr2ZF61fkcaK1UdkH2yEBBKnYjTyWzTJT6KNPcSPaiT7HSdhtMXQuN5wkTX0Xu72KQ1l8S42rlmexS2hSA==", + "license": "BlueOak-1.0.0", + "dependencies": { + "glob": "^13.0.3", + "package-json-from-dist": "^1.0.1" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/sax": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.1.4.tgz", + "integrity": "sha512-5f3k2PbGGp+YtKJjOItpg3P99IMD84E4HOvcfleTb5joCHNXYLsR9yWFPOYGgaeMPDubQILTCMdsFb2OMeOjtg==", + "license": "ISC" + }, + "node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "license": "MIT" + }, + "node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "license": "ISC", + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tar": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.9.tgz", + "integrity": "sha512-BTLcK0xsDh2+PUe9F6c2TlRp4zOOBMTkoQHQIWSIzI0R7KG46uEwq4OPk2W7bZcprBMsuaeFsqwYr7pjh6CuHg==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/through2": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "license": "MIT", + "dependencies": { + "readable-stream": "3" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "license": "MIT", + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/undici-types": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", + "license": "MIT" + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/xml2js": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz", + "integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==", + "license": "MIT", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xml2js/node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "license": "MIT", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/xmlbuilder": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", + "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", + "license": "MIT", + "engines": { + "node": ">=8.0" + } + }, + "node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "license": "MIT", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + } + } +} diff --git a/frontend/src-capacitor/package.json b/frontend/src-capacitor/package.json new file mode 100644 index 0000000..688f5e5 --- /dev/null +++ b/frontend/src-capacitor/package.json @@ -0,0 +1,14 @@ +{ + "name": "thatsme-quasar", + "version": "0.0.1", + "description": " Thats me Quasar Project", + "author": "Kevin Adametz", + "private": true, + "dependencies": { + "@capacitor/app": "^7.0.0", + "@capacitor/cli": "^7.0.0", + "@capacitor/core": "^7.0.0", + "@capacitor/ios": "^7.5.0", + "@capacitor/status-bar": "^7.0.0" + } +} \ No newline at end of file diff --git a/frontend/src/components/AddEventButton.vue b/frontend/src/components/AddEventButton.vue index 485e17d..2a58325 100644 --- a/frontend/src/components/AddEventButton.vue +++ b/frontend/src/components/AddEventButton.vue @@ -20,7 +20,7 @@ const isDark = computed(() => $q.dark.isActive) bottom: 16px; left: 50%; transform: translateX(-50%); - z-index: 30; + z-index: 10; width: 44px; height: 44px; border-radius: 50%; diff --git a/frontend/src/components/AppSettingsModal.vue b/frontend/src/components/AppSettingsModal.vue new file mode 100644 index 0000000..09ab13b --- /dev/null +++ b/frontend/src/components/AppSettingsModal.vue @@ -0,0 +1,322 @@ + + + + + diff --git a/frontend/src/components/EventPanel.vue b/frontend/src/components/EventPanel.vue index 3af7bdc..ea0d2de 100644 --- a/frontend/src/components/EventPanel.vue +++ b/frontend/src/components/EventPanel.vue @@ -1,8 +1,16 @@ @@ -76,14 +125,12 @@ function onSelect() { transition: opacity 0.3s ease, transform 0.15s ease; } -/* Clean inner circle — shader provides the glow around it */ .glow-dot__inner { position: relative; width: 100%; height: 100%; border-radius: 50%; background: #fff; - overflow: hidden; } .glow-dot__image { @@ -91,20 +138,63 @@ function onSelect() { height: 100%; object-fit: cover; display: block; + border-radius: 50%; } /* States */ .glow-dot--ghost { - opacity: 0.7; + opacity: 1; cursor: default; } + + .glow-dot--selected { transform: translate(-50%, -50%) scale(1.15); z-index: 15; } .glow-dot--dimmed { - opacity: 0.5; + opacity: 1; +} + +/* Event label (title + date) */ +.glow-dot__label { + position: absolute; + left: 50%; + transform: translateX(-50%); + top: calc(100% + 6px); + display: flex; + flex-direction: column; + align-items: center; + gap: 1px; + max-width: 90px; + pointer-events: none; +} + +/* When dot is in lower half, show label above */ +.glow-dot--label-above .glow-dot__label { + top: auto; + bottom: calc(100% + 6px); +} + +.glow-dot__title { + font-size: 10px; + font-weight: 600; + opacity: 0.7; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + max-width: 90px; + text-align: center; + line-height: 1.2; +} + +.glow-dot__date { + font-size: 9px; + font-weight: 400; + opacity: 0.4; + white-space: nowrap; + line-height: 1.2; } diff --git a/frontend/src/components/LifeWaveSettings.vue b/frontend/src/components/LifeWaveSettings.vue index 95bdaef..c36579a 100644 --- a/frontend/src/components/LifeWaveSettings.vue +++ b/frontend/src/components/LifeWaveSettings.vue @@ -1,8 +1,16 @@ + + diff --git a/frontend/src/components/TimelineView.vue b/frontend/src/components/TimelineView.vue index e1c0724..1101565 100644 --- a/frontend/src/components/TimelineView.vue +++ b/frontend/src/components/TimelineView.vue @@ -1,51 +1,70 @@ @@ -117,51 +136,123 @@ const eventLabels = computed(() => { }) }) -// Year markers — shown between events where the year changes -const yearMarkers = computed(() => { - const markers = [] - const sorted = displayEvents.value - if (sorted.length === 0) return markers +// Year ranges — for each year, the world-space X range of its events +const yearRanges = computed(() => { + const ranges = [] + const events = displayEvents.value + if (events.length === 0) return ranges - // First event's year - const firstDate = new Date(sorted[0].date) - markers.push({ - key: `year-0`, - year: firstDate.getFullYear(), - x: getEventX(0) - }) + let currentYear = new Date(events[0].date).getFullYear() + let startIdx = 0 - for (let i = 1; i < sorted.length; i++) { - const prevYear = new Date(sorted[i - 1].date).getFullYear() - const currYear = new Date(sorted[i].date).getFullYear() - if (currYear !== prevYear) { - // Position between the two events - const x = (getEventX(i - 1) + getEventX(i)) / 2 - markers.push({ - key: `year-${i}`, - year: currYear, - x - }) + for (let i = 1; i < events.length; i++) { + const year = new Date(events[i].date).getFullYear() + if (year !== currentYear) { + ranges.push({ year: currentYear, startX: getEventX(startIdx), endX: getEventX(i - 1) }) + currentYear = year + startIdx = i } } - return markers + ranges.push({ year: currentYear, startX: getEventX(startIdx), endX: getEventX(events.length - 1) }) + return ranges }) -// Active label — closest event to center of viewport -const activeLabel = computed(() => { - const sorted = displayEvents.value - if (sorted.length === 0) return null - const centerX = scrollLeft.value + viewportWidth.value / 2 - let closestIndex = 0 - let closestDist = Infinity - for (let i = 0; i < sorted.length; i++) { - const dist = Math.abs(getEventX(i) - centerX) - if (dist < closestDist) { - closestDist = dist - closestIndex = i - } +// All years that exist in the data (for prev/next navigation) +const allYears = computed(() => yearRanges.value.map(r => r.year)) + +// Sticky year labels — positioned relative to viewport, clamped to edges +const YEAR_MARGIN = 24 +const stickyYearLabels = computed(() => { + const sl = scrollLeft.value + const vw = viewportWidth.value + const viewLeft = sl + const viewRight = sl + vw + const years = allYears.value + + // Find years whose event range overlaps the viewport + const visible = yearRanges.value.filter(r => r.endX >= viewLeft && r.startX <= viewRight) + if (visible.length === 0) return [] + + function makeLabel(year, left) { + const idx = years.indexOf(year) + return { year, left, hasPrev: idx > 0, hasNext: idx < years.length - 1 } } - return eventLabels.value[closestIndex]?.key ?? null + + if (visible.length === 1) { + const r = visible[0] + const visStart = Math.max(r.startX, viewLeft) + const visEnd = Math.min(r.endX, viewRight) + const center = (visStart + visEnd) / 2 - sl + const clamped = Math.max(YEAR_MARGIN, Math.min(vw - YEAR_MARGIN, center)) + return [makeLabel(r.year, clamped)] + } + + // Multiple years: first pins left, last pins right, middles float naturally + const result = [] + for (let i = 0; i < visible.length; i++) { + const r = visible[i] + const visStart = Math.max(r.startX, viewLeft) + const visEnd = Math.min(r.endX, viewRight) + const center = (visStart + visEnd) / 2 - sl + + let pos + if (i === 0) { + pos = Math.max(YEAR_MARGIN, Math.min(vw / 2 - 30, center)) + } else if (i === visible.length - 1) { + pos = Math.min(vw - YEAR_MARGIN, Math.max(vw / 2 + 30, center)) + } else { + pos = Math.max(YEAR_MARGIN + 60, Math.min(vw - YEAR_MARGIN - 60, center)) + } + result.push(makeLabel(r.year, pos)) + } + return result +}) + +// Virtualization: only render events near the viewport +const VIS_BUFFER = 2 + +const visibleRange = computed(() => { + const total = displayEvents.value.length + if (total === 0) return { start: 0, end: -1 } + const spacing = EVENT_SPACING.value + if (spacing <= 0) return { start: 0, end: total - 1 } + const start = Math.max(0, + Math.floor((scrollLeft.value - PADDING.value) / spacing) - VIS_BUFFER + ) + const end = Math.min(total - 1, + Math.ceil((scrollLeft.value + viewportWidth.value - PADDING.value) / spacing) + VIS_BUFFER + ) + return { start, end } +}) + +const visibleEvents = computed(() => { + const { start, end } = visibleRange.value + if (end < start) return [] + return displayEvents.value.slice(start, end + 1).map((event, i) => ({ + event, + globalIndex: start + i + })) +}) + +const visibleLabels = computed(() => { + const { start, end } = visibleRange.value + if (end < start) return [] + return eventLabels.value.slice(start, end + 1).map((label, i) => ({ + label, + globalIndex: start + i + })) +}) + +// Active label — closest event to center of viewport (O(1) via index) +const activeLabel = computed(() => { + const total = displayEvents.value.length + if (total === 0) return null + const centerX = scrollLeft.value + viewportWidth.value / 2 + const spacing = EVENT_SPACING.value + if (spacing <= 0) return null + const index = Math.round((centerX - PADDING.value) / spacing) + const clamped = Math.max(0, Math.min(total - 1, index)) + return eventLabels.value[clamped]?.key ?? null }) function onScroll() { @@ -179,10 +270,19 @@ function scrollToIndex(index) { }) } -function scrollToX(x) { +function scrollToYearCenter(year) { if (!timelineRef.value) return + // Find exact year, or nearest in the requested direction + let range = yearRanges.value.find(r => r.year === year) + if (!range) { + // Find closest year + const sorted = [...yearRanges.value].sort((a, b) => Math.abs(a.year - year) - Math.abs(b.year - year)) + range = sorted[0] + } + if (!range) return + const centerX = (range.startX + range.endX) / 2 timelineRef.value.scrollTo({ - left: x - viewportWidth.value / 2, + left: centerX - viewportWidth.value / 2, behavior: 'smooth' }) } @@ -273,10 +373,13 @@ function onTouchEnd() { let resizeObserver = null // Emit timeline state so the layout can position shader points function emitViewState() { + const { start, end } = visibleRange.value emit('viewUpdate', { scrollLeft: scrollLeft.value, viewportWidth: viewportWidth.value, containerHeight: containerHeight.value, + visibleStart: start, + visibleEnd: end, events: displayEvents.value.map((e, i) => ({ emotion: e.emotion, x: getEventX(i), @@ -313,15 +416,32 @@ onMounted(async () => { onUnmounted(() => { resizeObserver?.disconnect() }) + +function zoomIn() { + const newZoom = Math.min(MAX_ZOOM, zoomLevel.value + ZOOM_STEP * 2) + if (newZoom !== zoomLevel.value) applyZoom(newZoom) +} + +function zoomOut() { + const newZoom = Math.max(MIN_ZOOM, zoomLevel.value - ZOOM_STEP * 2) + if (newZoom !== zoomLevel.value) applyZoom(newZoom) +} + +defineExpose({ timelineRef, zoomIn, zoomOut, zoomLevel, MIN_ZOOM, MAX_ZOOM }) diff --git a/frontend/src/components/UserMenu.vue b/frontend/src/components/UserMenu.vue new file mode 100644 index 0000000..d78d130 --- /dev/null +++ b/frontend/src/components/UserMenu.vue @@ -0,0 +1,278 @@ + + + + + diff --git a/frontend/src/components/ZoomControl.vue b/frontend/src/components/ZoomControl.vue new file mode 100644 index 0000000..c53bb45 --- /dev/null +++ b/frontend/src/components/ZoomControl.vue @@ -0,0 +1,134 @@ + + + + + diff --git a/frontend/src/composables/useImageCache.js b/frontend/src/composables/useImageCache.js new file mode 100644 index 0000000..8685a28 --- /dev/null +++ b/frontend/src/composables/useImageCache.js @@ -0,0 +1,175 @@ +import { ref } from 'vue' +import { db } from 'src/db' + +const THUMB_SIZE = 200 + +// In-memory URL cache: avoids repeated IndexedDB reads and blob URL creation +// Shared across all component instances +const memoryCache = new Map() + +/** + * Create a thumbnail (THUMB_SIZE x THUMB_SIZE) from a source image blob. + * Returns a new Blob (JPEG, quality 0.8). + */ +function createThumbnail(blob) { + return new Promise((resolve, reject) => { + const img = new Image() + const url = URL.createObjectURL(blob) + img.onload = () => { + const canvas = document.createElement('canvas') + canvas.width = THUMB_SIZE + canvas.height = THUMB_SIZE + + const ctx = canvas.getContext('2d') + // Cover crop: center the image + const scale = Math.max(THUMB_SIZE / img.width, THUMB_SIZE / img.height) + const w = img.width * scale + const h = img.height * scale + const x = (THUMB_SIZE - w) / 2 + const y = (THUMB_SIZE - h) / 2 + ctx.drawImage(img, x, y, w, h) + + canvas.toBlob( + (thumbBlob) => { + URL.revokeObjectURL(url) + if (thumbBlob) resolve(thumbBlob) + else reject(new Error('Canvas toBlob failed')) + }, + 'image/jpeg', + 0.8 + ) + } + img.onerror = () => { + URL.revokeObjectURL(url) + reject(new Error('Image load failed')) + } + img.src = url + }) +} + +/** + * Fetch an image from URL, cache thumbnail in IndexedDB, return blob URL. + */ +async function fetchAndCache(imageUrl, eventId) { + const response = await fetch(imageUrl) + if (!response.ok) throw new Error(`Fetch failed: ${response.status}`) + const blob = await response.blob() + + // Create thumbnail + const thumbBlob = await createThumbnail(blob) + + // Store in IndexedDB + await db.imageCache.put({ + url: imageUrl, + eventId, + type: 'thumbnail', + blob: thumbBlob, + cachedAt: Date.now() + }) + + const blobUrl = URL.createObjectURL(thumbBlob) + memoryCache.set(imageUrl, blobUrl) + return blobUrl +} + +/** + * Get a cached thumbnail blob URL from IndexedDB. + * Returns null if not cached. + */ +async function getCachedImage(imageUrl) { + // Check memory first + if (memoryCache.has(imageUrl)) return memoryCache.get(imageUrl) + + try { + const entry = await db.imageCache.get(imageUrl) + if (entry?.blob) { + const blobUrl = URL.createObjectURL(entry.blob) + memoryCache.set(imageUrl, blobUrl) + return blobUrl + } + } catch (e) { + console.warn('Image cache read failed:', e) + } + return null +} + +/** + * Composable: resolves an event's image to a displayable src. + * - Checks memory cache → IndexedDB cache → fetches & caches thumbnail. + * - Returns reactive `resolvedSrc` ref. + */ +export function useImageCache(imageUrl, eventId) { + const resolvedSrc = ref(null) + const loading = ref(false) + + async function resolve() { + if (!imageUrl) { + resolvedSrc.value = null + return + } + + // 1. Memory cache (instant) + if (memoryCache.has(imageUrl)) { + resolvedSrc.value = memoryCache.get(imageUrl) + return + } + + // 2. IndexedDB cache + const cached = await getCachedImage(imageUrl) + if (cached) { + resolvedSrc.value = cached + return + } + + // 3. Fetch, create thumbnail, cache + loading.value = true + try { + const blobUrl = await fetchAndCache(imageUrl, eventId) + resolvedSrc.value = blobUrl + } catch (e) { + // Fallback: use original URL directly (works when online) + console.warn('Image cache failed, using direct URL:', e) + resolvedSrc.value = imageUrl + } finally { + loading.value = false + } + } + + resolve() + + return { resolvedSrc, loading } +} + +/** + * Resolve full-res image for EventPanel (no thumbnail, just cache check). + * Returns the original URL — browser Cache-Control handles caching. + * When offline, falls back to cached thumbnail. + */ +export async function resolveFullRes(imageUrl) { + if (!imageUrl) return null + + // If online, return original URL (browser caches via HTTP headers) + if (navigator.onLine) return imageUrl + + // Offline: try cached thumbnail as fallback + const cached = await getCachedImage(imageUrl) + return cached || imageUrl +} + +/** + * Clear all cached images for a specific event. + */ +export async function clearEventImages(eventId) { + try { + const entries = await db.imageCache.where('eventId').equals(eventId).toArray() + for (const entry of entries) { + if (memoryCache.has(entry.url)) { + URL.revokeObjectURL(memoryCache.get(entry.url)) + memoryCache.delete(entry.url) + } + } + await db.imageCache.where('eventId').equals(eventId).delete() + } catch (e) { + console.warn('Clear event images failed:', e) + } +} diff --git a/frontend/src/composables/usePanelDrag.js b/frontend/src/composables/usePanelDrag.js new file mode 100644 index 0000000..98a6896 --- /dev/null +++ b/frontend/src/composables/usePanelDrag.js @@ -0,0 +1,137 @@ +import { ref, onBeforeUnmount } from 'vue' + +/** + * Composable for draggable bottom-sheet panels with snap points. + * + * Snap stops (in dvh): 100, 75, 50 + * Close threshold: below 25dvh + * + * @param {Function} onClose - called when panel is dragged below threshold + * @returns {{ panelHeight, handleListeners, resetHeight }} + */ +export function usePanelDrag(onClose) { + const SNAP_POINTS = [100, 75, 50, 25] // dvh values + const CLOSE_THRESHOLD = 15 // below this → close + + // Current panel height in dvh (null = use CSS default) + const panelHeight = ref(null) + const isDragging = ref(false) + + let dragging = false + let startY = 0 + let startHeight = 0 + + function getViewportHeight() { + return window.innerHeight + } + + function pxToDvh(px) { + return (px / getViewportHeight()) * 100 + } + + function findNearestSnap(dvh) { + let nearest = SNAP_POINTS[0] + let minDist = Infinity + for (const snap of SNAP_POINTS) { + const dist = Math.abs(dvh - snap) + if (dist < minDist) { + minDist = dist + nearest = snap + } + } + return nearest + } + + function onPointerDown(e) { + // Only primary button / single touch + if (e.button && e.button !== 0) return + dragging = true + isDragging.value = true + + const clientY = e.touches ? e.touches[0].clientY : e.clientY + startY = clientY + + // Current height: if panelHeight is set use it, else measure from CSS + const currentDvh = panelHeight.value ?? 75 + startHeight = currentDvh + + document.addEventListener('pointermove', onPointerMove, { passive: false }) + document.addEventListener('pointerup', onPointerUp) + document.addEventListener('touchmove', onTouchMove, { passive: false }) + document.addEventListener('touchend', onTouchEnd) + + // Prevent text selection + e.preventDefault() + } + + function onPointerMove(e) { + if (!dragging) return + const clientY = e.clientY + handleMove(clientY) + } + + function onTouchMove(e) { + if (!dragging) return + if (e.touches.length !== 1) return + handleMove(e.touches[0].clientY) + e.preventDefault() + } + + function handleMove(clientY) { + const deltaY = clientY - startY + const deltaDvh = pxToDvh(deltaY) + const newHeight = Math.max(10, Math.min(100, startHeight - deltaDvh)) + panelHeight.value = newHeight + } + + function onPointerUp() { + finishDrag() + } + + function onTouchEnd() { + finishDrag() + } + + function finishDrag() { + if (!dragging) return + dragging = false + isDragging.value = false + + cleanup() + + const currentHeight = panelHeight.value ?? 75 + if (currentHeight < CLOSE_THRESHOLD) { + panelHeight.value = null + onClose() + } else { + // Snap to nearest point + panelHeight.value = findNearestSnap(currentHeight) + } + } + + function cleanup() { + document.removeEventListener('pointermove', onPointerMove) + document.removeEventListener('pointerup', onPointerUp) + document.removeEventListener('touchmove', onTouchMove) + document.removeEventListener('touchend', onTouchEnd) + } + + function resetHeight() { + panelHeight.value = null + } + + onBeforeUnmount(cleanup) + + // Event listeners to bind on the handle element + const handleListeners = { + pointerdown: onPointerDown, + touchstart: onPointerDown, + } + + return { + panelHeight, + isDragging, + handleListeners, + resetHeight, + } +} diff --git a/frontend/src/db/index.js b/frontend/src/db/index.js new file mode 100644 index 0000000..85e7dbe --- /dev/null +++ b/frontend/src/db/index.js @@ -0,0 +1,17 @@ +import Dexie from 'dexie' + +export const db = new Dexie('thatsMeDB') + +db.version(1).stores({ + // Events: indexed by id (PK), date for sorted queries, syncStatus for dirty tracking + events: 'id, date, updatedAt, syncStatus', + + // Sync queue: outbound mutations waiting to be pushed to server + syncQueue: '++queueId, eventId, action, createdAt', + + // Image cache: offline blob storage for thumbnails + imageCache: 'url, eventId, type, cachedAt', + + // Metadata: key-value pairs (lastSyncCursor, userId, etc.) + meta: 'key' +}) diff --git a/frontend/src/layouts/LifeWaveLayout.vue b/frontend/src/layouts/LifeWaveLayout.vue index 63fffee..de8fa40 100644 --- a/frontend/src/layouts/LifeWaveLayout.vue +++ b/frontend/src/layouts/LifeWaveLayout.vue @@ -2,12 +2,14 @@

-
+ +
+ {{ floatingLinesRef?.fpsDisplay ?? 0 }} FPS + {{ floatingLinesRef?.dprDisplay ?? '0' }}x +
+
+ + + + + + @@ -64,7 +95,7 @@
@@ -74,6 +105,37 @@ :open="settingsOpen && !eventsStore.panelOpen" @close="settingsOpen = false" /> + + + +
+ + + + + + + +
+ + + +
@@ -85,6 +147,9 @@ import EventPanel from 'components/EventPanel.vue' import FloatingLines from 'components/FloatingLines.vue' import LifeWaveSettings from 'components/LifeWaveSettings.vue' import TimelineView from 'components/TimelineView.vue' +import AppSettingsModal from 'components/AppSettingsModal.vue' +import UserMenu from 'components/UserMenu.vue' +import ZoomControl from 'components/ZoomControl.vue' import { useEventsStore } from 'stores/events' import { useSettingsStore } from 'stores/settings' @@ -93,8 +158,15 @@ const eventsStore = useEventsStore() const settingsStore = useSettingsStore() const isDark = computed(() => $q.dark.isActive) const settingsOpen = ref(false) +const userMenuOpen = ref(false) +const appSettingsOpen = ref(false) +const floatingLinesRef = ref(null) const fl = computed(() => settingsStore.floatingLines) +// Timeline view ref (for direct scroll access in render loop) +const timelineViewRef = ref(null) +const scrollContainerEl = computed(() => timelineViewRef.value?.timelineRef ?? null) + // Layout dimensions (for screen→UV conversion) const layoutRef = ref(null) const layoutWidth = ref(window.innerWidth) @@ -139,33 +211,59 @@ function screenToUV(sx, sy) { } // Compute shader point positions from event positions -const TIMELINE_TOP = 60 // CSS: .timeline { top: 60px } +const TIMELINE_TOP = 40 // CSS: .timeline-container { top: 40px } -const shaderNumPoints = computed(() => { - if (!timelineState.value) return 0 - return Math.min(timelineState.value.events.length, 8) +// Select up to 8 points from visible window + boundary events for shader lines +const shaderSelection = computed(() => { + if (!timelineState.value) return [] + const { events, visibleStart, visibleEnd } = timelineState.value + if (events.length === 0) return [] + + // Include 3 events before and after visible range for smooth line continuity + const rangeStart = Math.max(0, (visibleStart ?? 0) - 3) + const rangeEnd = Math.min(events.length - 1, (visibleEnd ?? events.length - 1) + 3) + + let candidates = events.slice(rangeStart, rangeEnd + 1) + + // If more than 16, subsample evenly (keep first + last) + if (candidates.length > 16) { + const sampled = [candidates[0]] + const step = (candidates.length - 1) / 15 + for (let i = 1; i < 15; i++) { + sampled.push(candidates[Math.round(i * step)]) + } + sampled.push(candidates[candidates.length - 1]) + candidates = sampled + } + + return candidates }) -const shaderPointX = computed(() => { - const xs = Array(8).fill(0) - if (!timelineState.value) return xs - const { scrollLeft, events } = timelineState.value - const count = Math.min(events.length, 8) - for (let i = 0; i < count; i++) { - const screenX = events[i].x - scrollLeft - xs[i] = screenToUV(screenX, 0).x +const shaderNumPoints = computed(() => shaderSelection.value.length) + +// Base X positions in UV space WITHOUT scroll offset. +// FloatingLines applies the live scrollLeft in its render loop for perfect sync. +const shaderPointXBase = computed(() => { + const xs = Array(16).fill(0) + const sel = shaderSelection.value + const w = layoutWidth.value + const h = layoutHeight.value + for (let i = 0; i < sel.length; i++) { + xs[i] = (2 * sel[i].x - w) / h } return xs }) +// Scale factor to convert scrollLeft pixels → UV offset +const scrollUvScale = computed(() => 2.0 / layoutHeight.value) + const shaderPointY = computed(() => { - const ys = Array(8).fill(0) + const ys = Array(16).fill(0) if (!timelineState.value) return ys - const { containerHeight: tlHeight, events } = timelineState.value - const count = Math.min(events.length, 8) - for (let i = 0; i < count; i++) { - // GlowDot: top = (50 - emotion*35)% of timeline container - const yPercent = 50 - events[i].emotion * 35 + const sel = shaderSelection.value + const tlHeight = timelineState.value.containerHeight + for (let i = 0; i < sel.length; i++) { + const yPercent = 48 - sel[i].emotion * 30 const screenY = TIMELINE_TOP + (yPercent / 100) * tlHeight ys[i] = screenToUV(0, screenY).y } @@ -173,14 +271,7 @@ const shaderPointY = computed(() => { }) const shaderPointColors = computed(() => { - if (!timelineState.value) return [] - const { events } = timelineState.value - const count = Math.min(events.length, 8) - const colors = [] - for (let i = 0; i < count; i++) { - colors.push(events[i].color || '#ffffff') - } - return colors + return shaderSelection.value.map(e => e.color || '#ffffff') }) // Parse gradient stops from textarea string @@ -191,6 +282,29 @@ const parsedGradient = computed(() => { .filter(s => s.length > 0 && s.startsWith('#')) }) +// Zoom state from TimelineView +const currentZoom = computed(() => timelineViewRef.value?.zoomLevel ?? 1) +const zoomMin = computed(() => timelineViewRef.value?.MIN_ZOOM ?? 0.4) +const zoomMax = computed(() => timelineViewRef.value?.MAX_ZOOM ?? 3.0) + +function onZoomTo(value) { + if (!timelineViewRef.value) return + const clamped = Math.min(zoomMax.value, Math.max(zoomMin.value, value)) + // Use applyZoom exposed or set directly — we use the internal method indirectly + // by computing step from current to target + const tv = timelineViewRef.value + const el = tv.timelineRef + if (!el) return + const cx = el.clientWidth / 2 + const worldX = el.scrollLeft + cx + const ratio = clamped / tv.zoomLevel + tv.zoomLevel = clamped + // Restore scroll position to keep center stable + requestAnimationFrame(() => { + el.scrollLeft = worldX * ratio - cx + }) +} + const toggleDarkMode = () => { $q.dark.toggle() } @@ -203,6 +317,13 @@ const onDotSelect = (id) => { eventsStore.selectEvent(id) eventsStore.openPanel(id) } + +const onUserMenuNavigate = (target) => { + userMenuOpen.value = false + if (target === 'settings') { + appSettingsOpen.value = true + } +} diff --git a/frontend/src/services/syncService.js b/frontend/src/services/syncService.js new file mode 100644 index 0000000..f360f61 --- /dev/null +++ b/frontend/src/services/syncService.js @@ -0,0 +1,253 @@ +import { ref } from 'vue' +import { db } from 'src/db' + +// API base URL — configured per environment +const API_BASE = import.meta.env.VITE_API_BASE || '/api' + +const isSyncing = ref(false) +const isOnline = ref(navigator.onLine) +const lastSyncAt = ref(null) + +// Track online status +window.addEventListener('online', () => { + isOnline.value = true + processSyncQueue() +}) +window.addEventListener('offline', () => { + isOnline.value = false +}) + +/** + * Get the stored OAuth access token. + */ +async function getToken() { + try { + const meta = await db.meta.get('accessToken') + return meta?.value || null + } catch { + return null + } +} + +/** + * Store an OAuth access token. + */ +async function setToken(token) { + await db.meta.put({ key: 'accessToken', value: token }) +} + +/** + * Authenticated fetch wrapper. + */ +async function apiFetch(path, options = {}) { + const token = await getToken() + if (!token) throw new Error('Not authenticated') + + const response = await fetch(`${API_BASE}${path}`, { + ...options, + headers: { + 'Content-Type': 'application/json', + Accept: 'application/json', + Authorization: `Bearer ${token}`, + ...options.headers, + }, + }) + + if (response.status === 401) { + // Token expired — clear it + await db.meta.delete('accessToken') + throw new Error('Unauthorized') + } + + return response +} + +/** + * Process the outbound sync queue (FIFO). + * Called on app start, every 30s when online, and on reconnect. + */ +async function processSyncQueue() { + if (!isOnline.value || isSyncing.value) return + + const token = await getToken() + if (!token) return + + isSyncing.value = true + + try { + const queue = await db.syncQueue.orderBy('queueId').toArray() + if (queue.length === 0) { + isSyncing.value = false + return + } + + // Batch sync: send up to 100 mutations at once + const batch = queue.slice(0, 100) + const mutations = batch.map((item) => ({ + action: item.action, + eventId: item.eventId, + payload: item.payload, + })) + + const response = await apiFetch('/events/sync', { + method: 'POST', + body: JSON.stringify({ mutations }), + }) + + if (response.ok) { + const data = await response.json() + + // Remove successfully processed items from queue + const processedIds = [] + data.results.forEach((result, i) => { + if (result.status === 'ok') { + processedIds.push(batch[i].queueId) + } + }) + + if (processedIds.length > 0) { + await db.syncQueue.bulkDelete(processedIds) + } + + // Update syncStatus on local events + for (const result of data.results) { + if (result.status === 'ok') { + const event = await db.events.get(result.eventId) + if (event && event.syncStatus !== 'local') { + await db.events.update(result.eventId, { syncStatus: 'synced' }) + } + } + } + + lastSyncAt.value = Date.now() + + // If there are more items, process next batch + if (queue.length > 100) { + await processSyncQueue() + } + } + } catch (e) { + console.warn('Sync queue processing failed:', e) + } finally { + isSyncing.value = false + } +} + +/** + * Pull remote changes since last sync cursor. + * Merges with local data using "last write wins" on updatedAt. + */ +async function pullRemoteChanges() { + if (!isOnline.value) return + + const token = await getToken() + if (!token) return + + try { + const lastSync = await db.meta.get('lastSyncCursor') + const since = lastSync?.value || null + + let url = '/events?limit=200' + if (since) { + url += `&since=${since}` + } + + const response = await apiFetch(url) + if (!response.ok) return + + const data = await response.json() + const remoteEvents = data.data || [] + + for (const remote of remoteEvents) { + const local = await db.events.get(remote.id) + + if (!local) { + // New event from server + await db.events.put({ + id: remote.id, + title: remote.title, + date: remote.date, + emotion: remote.emotion, + customColor: remote.customColor, + gradientPreset: remote.gradientPreset, + image: remote.image, + note: remote.note, + syncStatus: 'synced', + createdAt: remote.createdAt, + updatedAt: remote.updatedAt, + }) + } else if (remote.updatedAt > local.updatedAt && local.syncStatus === 'synced') { + // Remote is newer and local hasn't been modified — update + await db.events.update(remote.id, { + title: remote.title, + date: remote.date, + emotion: remote.emotion, + customColor: remote.customColor, + gradientPreset: remote.gradientPreset, + image: remote.image, + note: remote.note, + syncStatus: 'synced', + updatedAt: remote.updatedAt, + }) + } + // If local is modified, skip — local changes will be pushed via sync queue + } + + // Update sync cursor + await db.meta.put({ key: 'lastSyncCursor', value: new Date().toISOString() }) + + // Handle pagination (cursor-based) + if (data.next_cursor) { + // There are more pages — but for now we only pull one batch + // Future: iterate through pages + } + + lastSyncAt.value = Date.now() + } catch (e) { + console.warn('Pull remote changes failed:', e) + } +} + +/** + * Full sync: push local changes, then pull remote. + */ +async function fullSync() { + await processSyncQueue() + await pullRemoteChanges() +} + +// Auto-sync interval (30s) +let syncInterval = null + +function startAutoSync() { + if (syncInterval) return + syncInterval = setInterval(() => { + if (isOnline.value) { + fullSync() + } + }, 30000) + + // Initial sync + fullSync() +} + +function stopAutoSync() { + if (syncInterval) { + clearInterval(syncInterval) + syncInterval = null + } +} + +export { + isOnline, + isSyncing, + lastSyncAt, + getToken, + setToken, + apiFetch, + processSyncQueue, + pullRemoteChanges, + fullSync, + startAutoSync, + stopAutoSync, +} diff --git a/frontend/src/stores/events.js b/frontend/src/stores/events.js index 7afa82c..ab4eb55 100644 --- a/frontend/src/stores/events.js +++ b/frontend/src/stores/events.js @@ -1,5 +1,7 @@ import { defineStore } from 'pinia' import { ref, computed, watch } from 'vue' +import { db } from 'src/db' +import { startAutoSync, getToken } from 'src/services/syncService' // Color interpolation function lerpColor(a, b, t) { @@ -33,7 +35,6 @@ const GRADIENT_PRESETS = [ function emotionToColor(emotion, gradientIdx = null) { const preset = gradientIdx !== null ? GRADIENT_PRESETS[gradientIdx] : null if (preset) { - // 3-stop gradient: negative → neutral → positive const [neg, mid, pos] = preset.colors if (emotion >= 0) { return lerpColor(mid, pos, emotion) @@ -41,7 +42,6 @@ function emotionToColor(emotion, gradientIdx = null) { return lerpColor(mid, neg, Math.abs(emotion)) } } - // Default: 6-stop interpolation if (emotion >= 0) { if (emotion < 0.5) { return lerpColor('#FF6B35', '#FFD700', emotion / 0.5) @@ -56,114 +56,162 @@ function emotionToColor(emotion, gradientIdx = null) { } } -// Demo data — 8 events, 4 with images, 4 without +// Demo seed data const demoEvents = [ - { - id: crypto.randomUUID(), - title: 'Erster Schultag', - date: '1995-09-01', - emotion: 0.6, - customColor: null, - gradientPreset: null, - image: null, - note: '', - createdAt: Date.now(), - updatedAt: Date.now() - }, - { - id: crypto.randomUUID(), - title: 'Abiball', - date: '2004-06-25', - emotion: 0.85, - customColor: null, - gradientPreset: 1, - image: 'demo/photo-1530103862676-de8c9debad1d.jpeg', - note: 'Was für eine Party!', - createdAt: Date.now(), - updatedAt: Date.now() - }, - { - id: crypto.randomUUID(), - title: 'Trennung', - date: '2010-03-15', - emotion: -0.7, - customColor: null, - gradientPreset: null, - image: null, - note: '', - createdAt: Date.now(), - updatedAt: Date.now() - }, - { - id: crypto.randomUUID(), - title: 'Bergwanderung', - date: '2014-08-12', - emotion: 0.75, - customColor: null, - gradientPreset: 4, - image: 'demo/photo-1534067783941-51c9c23ecefd.jpeg', - note: 'Unvergesslicher Ausblick', - createdAt: Date.now(), - updatedAt: Date.now() - }, - { - id: crypto.randomUUID(), - title: 'Jobverlust', - date: '2016-11-03', - emotion: -0.6, - customColor: null, - gradientPreset: null, - image: null, - note: '', - createdAt: Date.now(), - updatedAt: Date.now() - }, - { - id: crypto.randomUUID(), - title: 'Hochzeit', - date: '2018-07-20', - emotion: 0.95, - customColor: null, - gradientPreset: 5, - image: 'demo/photo-1506905925346-21bda4d32df4.jpeg', - note: 'Der schönste Tag', - createdAt: Date.now(), - updatedAt: Date.now() - }, - { - id: crypto.randomUUID(), - title: 'Umzug', - date: '2021-04-01', - emotion: -0.3, - customColor: null, - gradientPreset: null, - image: null, - note: '', - createdAt: Date.now(), - updatedAt: Date.now() - }, - { - id: crypto.randomUUID(), - title: 'Neuer Job', - date: '2023-01-10', - emotion: 0.5, - customColor: null, - gradientPreset: null, - image: 'demo/photo-1530103862676-de8c9debad1d.jpeg', - note: 'Neues Kapitel', - createdAt: Date.now(), - updatedAt: Date.now() - } + { id: crypto.randomUUID(), title: 'Erster Schultag', date: '1995-09-01', emotion: 0.6, customColor: null, gradientPreset: null, image: null, note: '', syncStatus: 'local', createdAt: Date.now(), updatedAt: Date.now() }, + { id: crypto.randomUUID(), title: 'Abiball', date: '2004-06-25', emotion: 0.85, customColor: null, gradientPreset: 1, image: 'demo/photo-1530103862676-de8c9debad1d.jpeg', note: 'Was für eine Party!', syncStatus: 'local', createdAt: Date.now(), updatedAt: Date.now() }, + { id: crypto.randomUUID(), title: 'Trennung', date: '2010-03-15', emotion: -0.7, customColor: null, gradientPreset: null, image: null, note: '', syncStatus: 'local', createdAt: Date.now(), updatedAt: Date.now() }, + { id: crypto.randomUUID(), title: 'Bergwanderung', date: '2014-08-12', emotion: 0.75, customColor: null, gradientPreset: 4, image: 'demo/photo-1534067783941-51c9c23ecefd.jpeg', note: 'Unvergesslicher Ausblick', syncStatus: 'local', createdAt: Date.now(), updatedAt: Date.now() }, + { id: crypto.randomUUID(), title: 'Jobverlust', date: '2016-11-03', emotion: -0.6, customColor: null, gradientPreset: null, image: null, note: '', syncStatus: 'local', createdAt: Date.now(), updatedAt: Date.now() }, + { id: crypto.randomUUID(), title: 'Hochzeit', date: '2018-07-20', emotion: 0.95, customColor: null, gradientPreset: 5, image: 'demo/photo-1506905925346-21bda4d32df4.jpeg', note: 'Der schönste Tag', syncStatus: 'local', createdAt: Date.now(), updatedAt: Date.now() }, + { id: crypto.randomUUID(), title: 'Umzug', date: '2021-04-01', emotion: -0.3, customColor: null, gradientPreset: null, image: null, note: '', syncStatus: 'local', createdAt: Date.now(), updatedAt: Date.now() }, + { id: crypto.randomUUID(), title: 'Neuer Job', date: '2023-01-10', emotion: 0.5, customColor: null, gradientPreset: null, image: 'demo/photo-1530103862676-de8c9debad1d.jpeg', note: 'Neues Kapitel', syncStatus: 'local', createdAt: Date.now(), updatedAt: Date.now() } ] -export { emotionToColor, GRADIENT_PRESETS } +// Generate realistic demo events for testing at scale +function generateManyEvents(count = 500) { + // Realistic life event categories with emotion ranges + const categories = [ + // Positive events + { titles: ['Geburtstag', 'Geburtstagsfeier', 'Überraschungsparty'], emotionRange: [0.3, 0.8], noteChance: 0.4, notes: ['Tolles Fest!', 'Viele Geschenke', 'Schöner Tag mit Freunden', 'Alles Gute!'] }, + { titles: ['Urlaub', 'Strandurlaub', 'Städtereise', 'Roadtrip', 'Backpacking'], emotionRange: [0.4, 0.95], noteChance: 0.6, notes: ['Unvergesslich', 'Wunderschöne Landschaft', 'Endlich Erholung', 'Muss ich wiederholen'] }, + { titles: ['Hochzeit', 'Verlobung', 'Jahrestag'], emotionRange: [0.7, 1.0], noteChance: 0.8, notes: ['Der schönste Tag', 'Für immer', 'Tränen der Freude', 'Unbeschreiblich'] }, + { titles: ['Beförderung', 'Neuer Job', 'Gehaltserhöhung', 'Jobangebot'], emotionRange: [0.5, 0.9], noteChance: 0.5, notes: ['Endlich!', 'Harte Arbeit zahlt sich aus', 'Neues Kapitel', 'Verdient'] }, + { titles: ['Konzert', 'Festival', 'Theaterbesuch', 'Oper'], emotionRange: [0.3, 0.85], noteChance: 0.5, notes: ['Gänsehaut', 'Beste Band ever', 'Geniale Atmosphäre', 'Nächstes Jahr wieder'] }, + { titles: ['Geburt', 'Baby da!', 'Nachwuchs'], emotionRange: [0.85, 1.0], noteChance: 0.9, notes: ['Das größte Wunder', 'Willkommen auf der Welt', 'Unbeschreibliches Glück'] }, + { titles: ['Abschluss', 'Prüfung bestanden', 'Diplom', 'Master geschafft'], emotionRange: [0.6, 0.95], noteChance: 0.6, notes: ['Geschafft!', 'Jahre harter Arbeit', 'Stolz', 'Endlich vorbei'] }, + { titles: ['Bergwanderung', 'Gipfel erreicht', 'Marathon geschafft', 'Triathlon'], emotionRange: [0.5, 0.9], noteChance: 0.5, notes: ['Was für ein Ausblick!', 'Körperliche Grenzen überwunden', 'Nie aufgeben'] }, + { titles: ['Hauskauf', 'Wohnungseinweihung', 'Renovierung fertig'], emotionRange: [0.4, 0.8], noteChance: 0.5, notes: ['Endlich eigene vier Wände', 'Traum wird wahr', 'Viel Arbeit, aber es lohnt sich'] }, + { titles: ['Erstes Date', 'Zusammengekommen', 'Liebeserklärung'], emotionRange: [0.5, 0.95], noteChance: 0.6, notes: ['Schmetterlinge', 'Liebe auf den ersten Blick', 'Endlich getraut'] }, + // Neutral events + { titles: ['Umzug', 'Neue Stadt', 'Wohnungswechsel'], emotionRange: [-0.2, 0.3], noteChance: 0.4, notes: ['Neuanfang', 'Alles anders', 'Spannend und stressig zugleich'] }, + { titles: ['Arztbesuch', 'Vorsorge', 'Check-up'], emotionRange: [-0.1, 0.1], noteChance: 0.2, notes: ['Alles okay', 'Routine'] }, + { titles: ['Meeting', 'Präsentation', 'Workshop'], emotionRange: [-0.1, 0.4], noteChance: 0.3, notes: ['Gut gelaufen', 'Viel gelernt', 'Anstrengend'] }, + { titles: ['Friseur', 'Shopping', 'Einkauf'], emotionRange: [0.0, 0.3], noteChance: 0.1, notes: ['Neuer Look', 'Guter Fund'] }, + // Negative events + { titles: ['Trennung', 'Beziehungsende', 'Scheidung'], emotionRange: [-1.0, -0.5], noteChance: 0.5, notes: ['Schmerzhaft', 'Warum?', 'Es ist besser so', 'Brauche Zeit'] }, + { titles: ['Jobverlust', 'Kündigung', 'Firma pleite'], emotionRange: [-0.9, -0.4], noteChance: 0.5, notes: ['Schock', 'Wie geht es weiter?', 'Unverdient'] }, + { titles: ['Krankheit', 'OP', 'Krankenhaus'], emotionRange: [-0.8, -0.3], noteChance: 0.6, notes: ['Wird schon', 'Hauptsache gesund werden', 'Lange Genesung'] }, + { titles: ['Abschied', 'Verlust', 'Trauer'], emotionRange: [-1.0, -0.6], noteChance: 0.7, notes: ['Ruhe in Frieden', 'Fehlt mir', 'Unvergessen', 'Schwerer Tag'] }, + { titles: ['Streit', 'Konflikt', 'Auseinandersetzung'], emotionRange: [-0.7, -0.2], noteChance: 0.3, notes: ['Muss nicht sein', 'Hoffe auf Klärung'] }, + { titles: ['Unfall', 'Panne', 'Autopanne'], emotionRange: [-0.6, -0.2], noteChance: 0.4, notes: ['Zum Glück nichts Schlimmes', 'Ärgerlich', 'Hätte schlimmer sein können'] }, + { titles: ['Prüfung nicht bestanden', 'Absage', 'Ablehnung'], emotionRange: [-0.7, -0.3], noteChance: 0.4, notes: ['Nächstes Mal', 'Nicht aufgeben', 'Enttäuschend'] }, + ] + + const demoImages = [ + 'demo/photo-1530103862676-de8c9debad1d.jpeg', + 'demo/photo-1534067783941-51c9c23ecefd.jpeg', + 'demo/photo-1506905925346-21bda4d32df4.jpeg' + ] + + // Seeded random for reproducibility + let seed = 42 + function rand() { + seed = (seed * 16807 + 0) % 2147483647 + return (seed - 1) / 2147483646 + } + + function randInt(min, max) { + return Math.floor(rand() * (max - min + 1)) + min + } + + function pick(arr) { + return arr[Math.floor(rand() * arr.length)] + } + + function randFloat(min, max) { + return Math.round((min + rand() * (max - min)) * 100) / 100 + } + + const evts = [] + const startYear = 1985 + const endYear = 2026 + + // Generate events with realistic distribution (more events in recent years) + for (let i = 0; i < count; i++) { + // Weight towards recent years: cube root distribution + const t = rand() + const yearFloat = startYear + (endYear - startYear) * (t * t * 0.4 + t * 0.6) + const year = Math.floor(yearFloat) + const month = randInt(1, 12) + const day = randInt(1, 28) // safe for all months + const date = `${year}-${String(month).padStart(2, '0')}-${String(day).padStart(2, '0')}` + + const cat = pick(categories) + const title = pick(cat.titles) + const emotion = randFloat(cat.emotionRange[0], cat.emotionRange[1]) + const hasNote = rand() < cat.noteChance + const note = hasNote ? pick(cat.notes) : '' + const hasImage = rand() < 0.15 // 15% chance + const image = hasImage ? pick(demoImages) : null + const hasPreset = rand() < 0.25 // 25% chance + const gradientPreset = hasPreset ? randInt(0, 9) : null + + evts.push({ + id: crypto.randomUUID(), + title, + date, + emotion, + customColor: null, + gradientPreset, + image, + note, + syncStatus: 'local', + createdAt: Date.now(), + updatedAt: Date.now() + }) + } + + // Sort by date + evts.sort((a, b) => a.date.localeCompare(b.date)) + return evts +} + +export { emotionToColor, GRADIENT_PRESETS, demoEvents, generateManyEvents } export const useEventsStore = defineStore('events', () => { - const events = ref([...demoEvents]) + const events = ref([]) + const isLoaded = ref(false) const selectedEventId = ref(null) const panelOpen = ref(false) const editingEventId = ref(null) + // Load events from IndexedDB; seed demo data on first launch + async function init() { + try { + let stored = await db.events.orderBy('date').toArray() + if (stored.length === 0) { + const seed = generateManyEvents(500) + await db.events.bulkPut(seed) + stored = seed + } + events.value = stored + } catch (e) { + console.warn('Dexie load failed, using demo data:', e) + events.value = [...demoEvents] + } + isLoaded.value = true + + // Start auto-sync if authenticated + getToken().then((token) => { + if (token) startAutoSync() + }) + } + + // Fire-and-forget DB write (UI already updated via ref) + function dbPut(event) { + db.events.put(event).catch(e => console.warn('Dexie put failed:', e)) + } + + function dbDelete(id) { + db.events.delete(id).catch(e => console.warn('Dexie delete failed:', e)) + } + + function dbQueueSync(eventId, action, payload) { + db.syncQueue.add({ eventId, action, payload, createdAt: Date.now() }) + .catch(e => console.warn('Dexie sync queue failed:', e)) + } + // Ghost event for live preview while creating/editing const ghostEmotion = ref(0) const ghostCustomColor = ref(null) @@ -194,7 +242,6 @@ export const useEventsStore = defineStore('events', () => { function openPanel(eventId = null) { if (eventId) { - // Edit mode editingEventId.value = eventId const event = events.value.find((e) => e.id === eventId) if (event) { @@ -207,7 +254,6 @@ export const useEventsStore = defineStore('events', () => { ghostNote.value = event.note } } else { - // Create mode editingEventId.value = null ghostTitle.value = '' ghostDate.value = new Date().toISOString().slice(0, 10) @@ -220,12 +266,12 @@ export const useEventsStore = defineStore('events', () => { panelOpen.value = true } - // Auto-save: persist ghost → event in edit mode on every change + // Auto-save: persist ghost → event in edit mode function persistToEvent() { if (!editingEventId.value) return const idx = events.value.findIndex((e) => e.id === editingEventId.value) if (idx === -1) return - events.value[idx] = { + const updated = { ...events.value[idx], title: ghostTitle.value, date: ghostDate.value, @@ -234,20 +280,21 @@ export const useEventsStore = defineStore('events', () => { gradientPreset: ghostGradientPreset.value, image: ghostImage.value, note: ghostNote.value, + syncStatus: 'modified', updatedAt: Date.now() } + events.value[idx] = updated + dbPut(updated) } - // Watch all ghost fields — auto-save in edit mode watch( [ghostTitle, ghostDate, ghostEmotion, ghostCustomColor, ghostGradientPreset, ghostImage, ghostNote], () => { persistToEvent() } ) function closePanel() { - // Create mode: auto-create event if there's content if (!editingEventId.value && ghostTitle.value.trim()) { - events.value.push({ + const newEvent = { id: crypto.randomUUID(), title: ghostTitle.value, date: ghostDate.value, @@ -256,9 +303,13 @@ export const useEventsStore = defineStore('events', () => { gradientPreset: ghostGradientPreset.value, image: ghostImage.value, note: ghostNote.value, + syncStatus: 'local', createdAt: Date.now(), updatedAt: Date.now() - }) + } + events.value.push(newEvent) + dbPut(newEvent) + dbQueueSync(newEvent.id, 'create', { ...newEvent }) } panelOpen.value = false editingEventId.value = null @@ -267,6 +318,8 @@ export const useEventsStore = defineStore('events', () => { function deleteEvent(id) { events.value = events.value.filter((e) => e.id !== id) + dbDelete(id) + dbQueueSync(id, 'delete', null) closePanel() } @@ -275,8 +328,12 @@ export const useEventsStore = defineStore('events', () => { return emotionToColor(event.emotion, event.gradientPreset ?? null) } + // Auto-init on store creation + init() + return { events, + isLoaded, selectedEventId, panelOpen, editingEventId, diff --git a/frontend/src/stores/settings.js b/frontend/src/stores/settings.js index 15b5a7e..bea0137 100644 --- a/frontend/src/stores/settings.js +++ b/frontend/src/stores/settings.js @@ -3,6 +3,20 @@ import { ref, watch } from 'vue' const STORAGE_KEY = 'thatsme-settings' +export const ACCENT_COLORS = [ + { label: 'Standard', value: 'default', hex: '#9e9e9e' }, + { label: 'Blau', value: 'blue', hex: '#2196F3' }, + { label: 'Grün', value: 'green', hex: '#4CAF50' }, + { label: 'Gelb', value: 'yellow', hex: '#FFC107' }, + { label: 'Rosa', value: 'pink', hex: '#E91E63' }, + { label: 'Orange', value: 'orange', hex: '#FF9800' } +] + +export const LANGUAGES = [ + { label: 'Deutsch', value: 'de' }, + { label: 'English', value: 'en' } +] + const FLOATING_LINES_DEFAULTS = { // Linien speed: 1.0, @@ -15,11 +29,15 @@ const FLOATING_LINES_DEFAULTS = { circleRadius: 75, glowSize: 18, glowStrength: 1.5, + lineBrightness: 1.0, // Hintergrund bgCenter: '#0a0514', bgEdge: '#000000', gradientStops: '#e947f5\n#2f4ba2\n#0a0a12', - backgroundImage: '' + backgroundImage: '', + // Labels + labelSize: 'small', // 'small' | 'medium' | 'large' + labelColor: '#ffffff' } function loadFromStorage() { @@ -39,17 +57,29 @@ export const useSettingsStore = defineStore('settings', () => { const theme = ref(stored?.theme ?? 'light') const floatingLines = ref(stored?.floatingLines ?? { ...FLOATING_LINES_DEFAULTS }) + // App preferences + const appearance = ref(stored?.appearance ?? 'system') // 'system' | 'light' | 'dark' + const accentColor = ref(stored?.accentColor ?? 'default') + const language = ref(stored?.language ?? 'de') + + // Developer / debug + const showFps = ref(stored?.showFps ?? false) + function persist() { localStorage.setItem( STORAGE_KEY, JSON.stringify({ theme: theme.value, - floatingLines: floatingLines.value + floatingLines: floatingLines.value, + appearance: appearance.value, + accentColor: accentColor.value, + language: language.value, + showFps: showFps.value }) ) } - watch([theme, floatingLines], persist, { deep: true }) + watch([theme, floatingLines, appearance, accentColor, language, showFps], persist, { deep: true }) function toggleTheme() { theme.value = theme.value === 'light' ? 'dark' : 'light' @@ -66,6 +96,10 @@ export const useSettingsStore = defineStore('settings', () => { return { theme, floatingLines, + appearance, + accentColor, + language, + showFps, toggleTheme, updateFloatingLines, resetFloatingLines