From fb892ea9f2dfc741f1782c41f3cc0df568541137 Mon Sep 17 00:00:00 2001 From: Antoine Date: Sun, 27 Sep 2026 23:16:45 +0200 Subject: [PATCH] Translate the whole project to English and fix outdated comments and help Comments, docstrings, logs, CLI help, map UI, legends, PDF sheet, scripts, compose files and AGENTS.md are now English. Data keys stay unchanged (relief_oriente, densite_sol, visualisations/, API JSON keys, link params). Wrong comments and help defaults found along the way are corrected. Co-Authored-By: Claude Opus 5.5 --- .dockerignore | 6 +- .gitignore | 20 +- AGENTS.md | 101 ++- Dockerfile | 17 +- Dockerfile.maps | 32 +- README.md | 9 +- docker-compose.cpu.yml | 10 +- docker-compose.maps.override.yml.example | 36 +- docker-compose.maps.yml | 58 +- docker-compose.worker.yml | 48 +- docker-compose.yml | 50 +- docs/DEPLOY_WEBAPP.md | 10 +- docs/GROUND_CLASSIFICATION.md | 33 +- docs/MAPS.md | 62 +- docs/img/neuf-brisach-a4.png | Bin 729058 -> 750361 bytes download_lidar.sh | 100 +- lidar_pipeline/__init__.py | 2 +- lidar_pipeline/cli.py | 215 ++--- lidar_pipeline/dtm.py | 959 ++++++++++---------- lidar_pipeline/export_pdf.py | 248 ++--- lidar_pipeline/fetch_ign.py | 149 +-- lidar_pipeline/gpu.py | 173 ++-- lidar_pipeline/ign.py | 36 +- lidar_pipeline/index.py | 754 ++++++++------- lidar_pipeline/mapserve.py | 858 ++++++++--------- lidar_pipeline/mapui.py | 18 +- lidar_pipeline/pipeline.py | 411 ++++----- lidar_pipeline/progress.py | 74 +- lidar_pipeline/quality.py | 75 +- lidar_pipeline/rendering.py | 194 ++-- lidar_pipeline/tests/test_cli.py | 6 +- lidar_pipeline/tests/test_dtm.py | 194 ++-- lidar_pipeline/tests/test_export_pdf.py | 62 +- lidar_pipeline/tests/test_fetch_ign.py | 60 +- lidar_pipeline/tests/test_gpu.py | 66 +- lidar_pipeline/tests/test_index.py | 202 ++--- lidar_pipeline/tests/test_mapserve.py | 621 ++++++------- lidar_pipeline/tests/test_mapui.py | 8 +- lidar_pipeline/tests/test_pipeline.py | 98 +- lidar_pipeline/tests/test_progress.py | 40 +- lidar_pipeline/tests/test_quality.py | 24 +- lidar_pipeline/tests/test_rendering.py | 58 +- lidar_pipeline/tests/test_tiles.py | 210 ++--- lidar_pipeline/tests/test_visualizations.py | 134 +-- lidar_pipeline/tiles.py | 435 ++++----- lidar_pipeline/visualizations.py | 493 +++++----- lidar_pipeline/web/map.css | 66 +- lidar_pipeline/web/map.html | 122 +-- lidar_pipeline/web/map.js | 667 +++++++------- requirements.txt | 12 +- run.sh | 301 +++--- start.sh | 42 +- 52 files changed, 4356 insertions(+), 4323 deletions(-) diff --git a/.dockerignore b/.dockerignore index b268f2c..375f336 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,9 +1,9 @@ -# Données volumineuses montées au runtime, jamais bakées dans l'image +# Bulky data mounted at runtime, never baked into the image input/ output/ data/ -# Divers non nécessaire au build +# Misc files not needed for the build .git/ audit-findings/ docs/ @@ -11,7 +11,7 @@ download_lidar.sh run.sh docker-compose.yml -# Caches Python +# Python caches **/__pycache__/ *.pyc .pytest_cache/ diff --git a/.gitignore b/.gitignore index 97932f3..775f07a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,15 +1,15 @@ -# Fichiers de données LiDAR (trop lourds pour git) +# LiDAR data files (too heavy for git) *.laz *.las *.copc.laz -# Résultats générés +# Generated results output/ output-webapp/ output-maps/ input/ -# Fichiers temporaires +# Temporary files temp/ *.tmp *.temp @@ -27,7 +27,7 @@ build/ .coverage htmlcov/ -# Interface bâchée dans l'image (régénérée au build, cf. Dockerfile.maps) +# Interface baked into the image (regenerated at build time, see Dockerfile / Dockerfile.maps) lidar_pipeline/mapserve_assets/ # Docker @@ -44,27 +44,27 @@ lidar_pipeline/mapserve_assets/ # Logs *.log -# Fichiers de configuration locaux +# Local configuration files .env .env.local -# Données et artefacts internes (jamais dans le dépôt) +# Internal data and artefacts (never in the repository) data/ .swival/ audit-findings/ notebooks/ -# Éventuels fichiers de cache matplotlib +# Possible matplotlib cache files matplotlibrc output-test/ -# Maquettes et suivi des sessions de brainstorming / SDD +# Mock-ups and brainstorming / SDD session tracking .superpowers/ -# Plans et specs de sessions de travail (internes) +# Work-session plans and specs (internal) docs/superpowers/ .playwright-mcp/ -# Override local de la carte légère (modèle : docker-compose.maps.override.yml.example) +# Local override of the lightweight map (template: docker-compose.maps.override.yml.example) docker-compose.maps.override.yml diff --git a/AGENTS.md b/AGENTS.md index 815a738..f4959ea 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,88 +1,89 @@ ## Workflow -- install: `docker build -t lidar-lidar .` (deps baked into image) -- lancement local en une commande (GPU facultatif) : `./start.sh` (carte 8973), `./start.sh process [options]`, `./start.sh logs|stop` — crée `input/`/`output/` à l'uid courant, ajoute `docker-compose.cpu.yml` (`gpus: !reset`) si Docker n'accède à aucun GPU. +- install: `docker build -t lidar-lidar .` (deps baked into the image) +- one-command local start (GPU optional): `./start.sh` (map on 8973), `./start.sh process [options]`, `./start.sh logs|stop` — creates `input/`/`output/` as the current uid, adds `docker-compose.cpu.yml` (`gpus: !reset`) when Docker cannot reach any GPU. - build: `docker build -t lidar-lidar .` -- build carte légère (Raspberry Pi, déploiement 2 machines — cf. `docs/DEPLOY_WEBAPP.md`) : `docker compose -f docker-compose.maps.yml up -d --build` (image `Dockerfile.maps`, sans PDAL/GPU) -- build générateur de tuiles (machine de traitement) : `docker compose -f docker-compose.worker.yml up -d --build` (service `worker` = mapserve sur l'image complète, API + tuiles + inventaire pour les cartes distantes) -- test all: `./run.sh --test` (rebuild automatique de l'image avant les tests ; en `docker run` direct, rebuild manuellement d'abord) +- build the lightweight map (Raspberry Pi, two-machine deployment — see `docs/DEPLOY_WEBAPP.md`): `docker compose -f docker-compose.maps.yml up -d --build` (image `Dockerfile.maps`, no PDAL/GPU) +- build the tile generator (processing machine): `docker compose -f docker-compose.worker.yml up -d --build` (service `worker` = mapserve on the full image: API + tiles + inventory for the remote maps) +- test all: `./run.sh --test` (rebuilds the image automatically before the tests; with a direct `docker run`, rebuild by hand first) - test file: `docker run --rm lidar-lidar python3 -m pytest -v --pyargs lidar_pipeline.tests.` - test case: `docker run --rm lidar-lidar python3 -m pytest -v --pyargs lidar_pipeline.tests.::::` - lint: not configured - format: not configured - after every edit: `./run.sh --test` -- **RÈGLE 1 — toujours lancer via docker compose** (jamais `docker run` direct) : carte/API locale → `docker compose up -d --build serve` (port 8973, mapserve sur image complète) ; traitement ponctuel → `docker compose run --rm --build process [options]` ; logs → `docker compose logs -f serve` ; arrêt → `docker compose down`. -- **RÈGLE 2 — TOUJOURS `--build` : le code est baké dans l'image (jamais monté).** Sans `--build`, `up`/`run` réutilisent l'image existante et l'ANCIEN code tourne. `--build` est quasi instantané grâce au cache (le .dockerignore exclut input/ et output/ du contexte). Après édition : `docker compose up -d --build serve` recrée le conteneur sur du neuf. -- test rapide sans rebuild (code monté par-dessus l'image) : `docker run --rm -e PYTHONPATH=/app -v $(pwd)/lidar_pipeline:/app/lidar_pipeline lidar-lidar python3 -m pytest --pyargs lidar_pipeline.tests -q` (~3 min ; ajouter `timeout 600` devant, et PAS de pipe `| tail` qui masque la progression) +- **RULE 1 — always run through docker compose** (never a direct `docker run`): local map/API → `docker compose up -d --build serve` (port 8973, mapserve on the full image); one-off processing → `docker compose run --rm --build process [options]`; logs → `docker compose logs -f serve`; stop → `docker compose down`. +- **RULE 2 — ALWAYS `--build`: the code is baked into the image (never mounted).** Without `--build`, `up`/`run` reuse the existing image and the OLD code runs. `--build` is almost instant thanks to the cache (`.dockerignore` keeps input/ and output/ out of the context). After an edit, `docker compose up -d --build serve` recreates the container on fresh code. +- quick test without rebuild (code mounted over the image): `docker run --rm -e PYTHONPATH=/app -v $(pwd)/lidar_pipeline:/app/lidar_pipeline lidar-lidar python3 -m pytest --pyargs lidar_pipeline.tests -q` (~3 min; prefix with `timeout 600`, and NO `| tail` pipe, which hides the progress) - debug: `./run.sh --debug` (file:line logging); container shell: `docker run --rm -it -v $(pwd)/input:/data/input -v $(pwd)/output:/data/output --entrypoint bash lidar-lidar` -- mise à jour d'une carte légère distante (checkout git + override maps local) : `ssh "cd && git pull && docker compose -f docker-compose.maps.yml -f docker-compose.maps.override.yml up -d --build"` (procédure dans `docs/DEPLOY_WEBAPP.md`). -- rattrapage des sidecars qualité (dalles traitées avant l'ajout du sidecar) : la commande fixe de `process` (compose) est remplacée en entier dès qu'un argument suit le nom du service, donc `--quality-backfill` seul ne fonctionne pas — utiliser `docker compose run --rm --build process python3 -m lidar_pipeline /data/input -o /data/output --quality-backfill`. +- `./run.sh` passes its own defaults to the CLI: `-r 0.5` and `-w 1` unless given (the CLI alone defaults to `-r 0.2`, `-w auto`); image quality, format and ground classification fall through to the CLI defaults (60, avif, ign). +- updating a remote lightweight map (git checkout + local maps override, see `docker-compose.maps.override.yml.example`): `ssh "cd && git pull && docker compose -f docker-compose.maps.yml -f docker-compose.maps.override.yml up -d --build"` (procedure in `docs/DEPLOY_WEBAPP.md`). +- backfilling the quality sidecars (tiles processed before the sidecar existed): the fixed command of `process` (compose) is replaced entirely as soon as any argument follows the service name, so `--quality-backfill` alone does not work — use `docker compose run --rm --build process python3 -m lidar_pipeline /data/input -o /data/output --quality-backfill`. ## Conventions -- **Un seul serveur web : `mapserve.py`** (image `lidar-maps`, port 8975 léger / 8973 worker). L'ancienne webapp (`webapp.py`, `export.py`, index.html/`_APP_JS`) a été supprimée : la génération de tuiles (portée de la webapp historique — `/api/preview`, `/api/generate`, `/api/status`, `/api/stop`, `/api/queue/clear`, `/api/cell`) vit dans `mapserve.py`, l'interface dans `web/map.{html,css,js}` (relus par `mapui.py`, constantes `_MAP_*` conservées, écrites par `write_map_assets()` et bâchées dans les images). Sur l'image légère sans `LIDAR_GENERATION_URL`, `/api/status` répond `available: false` et l'interface masque l'onglet Génération. -- **Interface en panneau unique** (`web/map.{html,css,js}`) : un seul panneau à onglets Affichage / Dalle / Export PDF / Génération (masqué si le générateur est indisponible ou non autorisé) / Partager, remplaçant l'ancienne pile de blocs empilés. Sous 720 px de large, le panneau devient un volet en bas d'écran à trois hauteurs (`closed`/`half`/`full`, poignée `#sheetGrip` glissée ou simplement touchée, ou onglet actif retouché). Un clic sur une dalle la **sélectionne** (contour) et remplit l'onglet Dalle (emprise, IGN, recalage des passes) sans changer l'onglet affiché ; re-cliquer la même dalle désélectionne, cliquer une autre déplace la sélection. Échap désélectionne la dalle puis replie le panneau (bande d'icônes sur ordinateur, volet fermé sur téléphone — la bande reste utilisable, un clic sur un onglet redéplie le panneau). Raccourcis clavier : 1–5 (onglets, sans effet si l'onglet est masqué), P (mode d'affichage suivant), Échap. Intensité du relief (`&I=`, contraste 0,5–2×, défaut 1×) : réglage de confort personnel mémorisé dans `lidarMapView_v2.intensity` et partagé dans le lien, jamais figé comme défaut serveur (`★ Définir par défaut` l'ignore). Deux thèmes clair/sombre (`lidar-theme`, `auto` par défaut, suit le système) et tous les réglages communs posés sur `:root` en variables CSS (aucune couleur en dur dans les composants). Clés `localStorage` (via `lsGet`/`lsSet`, silencieux en navigation privée) : `lidarMapView_v2` (vue/couches), `lidar-print` (réglages d'export), `lidar-panel` (onglet, hauteur du volet, repli en bande d'icônes), `lidar-theme`. -- **`index.py` = catalogue + registres partagés** (plus d'interface) : `VIZ_LABELS`/`VIZ_LEGENDS`, défauts d'affichage (`DEFAULT_VIZ`/`PRECISION_VIZ`/`VIEW_MODES`), `PANEL_VIZ`/`KEYWORD_TO_STEP`, `scan_tiles`/`cells_with_all_viz`, vignettes + sous-tuiles + inventaire `index_tiles.json` (`build_index`). L'inventaire est servi par `/api/tiles` de mapserve aux machines légères (`LIDAR_SOURCE_URL`). -- **Generation is 0.2 m only** (policy): `/api/generate` (`GENERATE_RESOLUTIONS` in `mapserve.py`), the compose `process` command and the CLI `-r` default all produce 0.2 m exclusively; 0.5 m stays available via explicit `-r 0.5`. Completeness detection (`complete_cells`) requires the viz at 0.2 m only. -- **Génération du nord au sud** : les tuiles sont traitées par ligne décroissante (row = nord en km), colonnes croissantes — `find_laz_files` (pipeline.py) pour les passes batch et `_resolve_request` (mapserve.py) pour les runs lancés depuis la carte. Les workers prennent les fichiers dans l'ordre de soumission : la carte se remplit de haut en bas pendant un run (`--file` explicite au CLI = ordre utilisateur préservé). Parallélisme de génération : `LIDAR_WORKERS` (10 dans les compose ; `auto` sinon). -- **Sub-tuilage intégral** : `_CARTO_SUBTILED_VIZ` (vide dans `index.py`) découpe TOUTES les couches en quadrants 500 m à 0,2 m ; toutes en AVIF 4:2:0 q75 (`_SUBTILE_AVIF_QUALITY`), encodées UNE fois depuis le raster d'origine : `tif_to_crop` appelle `index.write_subtiles` juste après la dalle (plus récentes qu'elle, `build_index` ne les réencode pas ; l'ancienne chaîne dalle q60 → sous-tuile q55 cumulait deux pertes : 18,1 dB/SSIM 0,84 contre 19,5 dB/0,93). Le 4:2:0 plafonne vers 19,5 dB sur le relief (teinte pixel par pixel moyennée par 2 × 2) : seul le 4:4:4 irait plus loin (q75 : 28 dB, ~1,6× plus lourd). Exception : les aplats de niveaux (`_SUBTILE_LOSSLESS_VIZ`, la précision) en WebP sans perte (`.webp`, accepté par `tiles.py`). **Pillow ignore `lossless=True` en AVIF** (q75 avec perte) ; en RGB aucun réglage AVIF n'est exact. Une couche qui échoue à la découpe retombe en dalle entière (`_fallback_full_dalle`) sans pénaliser les autres. -- **Tuiles XYZ réutilisables hors du projet** : `/tiles/{layer}/{z}/{x}/{y}.png` suit le schéma OpenStreetMap (256 px, EPSG:3857, PNG RGBA transparent hors emprise, CORS `*`) — JOSM, iD, QGIS, uMap et MapLibre le consomment tel quel, avec découverte via TileJSON / WMTS / `josm.imagery.xml`. Le 512 px (`@2x.webp`) est réservé à l'interface interne (moitié moins de requêtes en HTTP/1.1). Toute évolution du gabarit d'URL casse des configurations clientes : la changer demande une décision explicite. -- **Bilingual naming**: all code identifiers are English; every user-facing string, log message, argparse help, and comment is French. -- **Adding a visualization requires 4 edits**: (1) `generate_X()` in `visualizations.py`, (2) entry in `VIZ_STEPS` in `pipeline.py`, (3) entry in `COLORMAPS` in `rendering.py` (or `RGB_LEGENDS` for an RGB output), (4) entry in `VIZ_LEGENDS` in `index.py` (title/legend/description + sampled cmap gradient — single text source merged into `COLORMAPS` at import, also served in `/api/map/meta` and le TileJSON). Missing any one breaks the pipeline. +- **A single web server: `mapserve.py`** (image `lidar-maps`, port 8975 lightweight / 8973 worker). The old webapp (`webapp.py`, `export.py`, index.html/`_APP_JS`) has been removed: tile generation (the scope of the historical webapp — `/api/preview`, `/api/generate`, `/api/status`, `/api/stop`, `/api/queue/clear`, `/api/cell`) lives in `mapserve.py`, the interface in `web/map.{html,css,js}` (read by `mapui.py`, `_MAP_*` constants kept, written as `app.css`/`app.js` by `write_map_assets()` and baked into the images). On the lightweight image without `LIDAR_GENERATION_URL`, `/api/status` answers `available: false` and the interface hides the Generation tab. +- **Single-panel interface** (`web/map.{html,css,js}`): one tabbed panel View / Tile / PDF export / Generation (hidden when the generator is unavailable or not allowed) / Share, replacing the old stack of blocks. Below 720 px wide, the panel becomes a bottom sheet with three heights (`closed`/`half`/`full`; handle `#sheetGrip` dragged or simply tapped, or the active tab tapped again). A click on a tile **selects** it (outline) and fills the Tile tab (extent, IGN, strip alignment) without switching the displayed tab; clicking the same tile again deselects it, clicking another moves the selection. Escape deselects the tile, then collapses the panel (icon strip on desktop, closed sheet on phone — the strip stays usable, a click on a tab expands the panel again). Keyboard shortcuts: 1–5 (tabs, no effect when the tab is hidden), P (next display mode), Escape. Relief intensity (`&I=`, contrast 0.5–2×, default 1×): a personal comfort setting stored in `lidarMapView_v2.intensity` and shared in the link, never frozen as a server default (`★ Set as default` ignores it). Two themes, light/dark (`lidar-theme`, `auto` by default, follows the system), and every shared setting set on `:root` as CSS variables (no hard-coded colour in the components). `localStorage` keys (through `lsGet`/`lsSet`, silent in private browsing): `lidarMapView_v2` (view/layers), `lidar-print` (export settings), `lidar-panel` (tab, sheet height, collapse to the icon strip), `lidar-theme`. +- **`index.py` = catalogue + shared registries** (no interface any more): `VIZ_LABELS`/`VIZ_LEGENDS`, display defaults (`DEFAULT_VIZ`/`PRECISION_VIZ`/`VIEW_MODES`), `PANEL_VIZ`/`KEYWORD_TO_STEP`, `scan_tiles`/`cells_with_all_viz`, thumbnails + sub-tiles + the `index_tiles.json` inventory (`build_index`). The inventory is served by mapserve's `/api/tiles` to the lightweight machines (`LIDAR_SOURCE_URL`). +- **Generation is 0.2 m only** (policy): `/api/generate` (`GENERATE_RESOLUTIONS` in `mapserve.py`), the compose `process` command and the CLI `-r` default all produce 0.2 m exclusively; 0.5 m stays available via an explicit `-r 0.5` (note: `./run.sh` still passes `-r 0.5` by default). Completeness detection (`complete_cells`) requires the viz at 0.2 m only. +- **North-to-south generation**: tiles are processed by decreasing row (row = northing in km), then increasing column — `find_laz_files` (pipeline.py) for batch passes and `_resolve_request` (mapserve.py) for runs started from the map. Workers take the files in submission order: the map fills from top to bottom during a run (an explicit `--file` on the CLI keeps the user's order). Generation parallelism: `LIDAR_WORKERS` (10 in `docker-compose.yml`, `auto` in `docker-compose.worker.yml` and when unset). +- **Full sub-tiling**: `_CARTO_SUBTILED_VIZ` (empty in `index.py`) splits ALL layers into 500 m quadrants at 0.2 m; all in AVIF 4:2:0 q75 (`_SUBTILE_AVIF_QUALITY`), encoded ONCE from the original raster: `tif_to_crop` calls `index.write_subtiles` (through `rendering._write_subtiles_from`) right after the tile (so they are newer than it, and `build_index` does not re-encode them; the old chain tile q60 → sub-tile q55 stacked two losses: 18.1 dB/SSIM 0.84 against 19.5 dB/0.93). 4:2:0 tops out around 19.5 dB on the relief (per-pixel hue averaged over 2 × 2): only 4:4:4 would go further (q75: 28 dB, ~1.6× heavier). Exception: flat level maps (`_SUBTILE_LOSSLESS_VIZ`, the precision layer) in lossless WebP (`.webp`, accepted by `tiles.py`). **Pillow ignores `lossless=True` for AVIF** (q75, lossy); in RGB no AVIF setting is exact. A layer that fails to split falls back to the whole tile (`_fallback_full_dalle`) without penalising the others. +- **XYZ tiles reusable outside the project**: `/tiles/{layer}/{z}/{x}/{y}.png` follows the OpenStreetMap scheme (256 px, EPSG:3857, RGBA PNG transparent outside coverage, CORS `*`) — JOSM, iD, QGIS, uMap and MapLibre consume it as is, with discovery through TileJSON / WMTS / `josm.imagery.xml`. The 512 px variant (`@2x.avif`) is reserved for the internal interface (half as many requests over HTTP/1.1). Any change to the URL template breaks client configurations: changing it requires an explicit decision. +- **Naming**: all code identifiers, comments, logs, help and user-facing strings are English; data keys inherited from the French era (`relief_oriente`, `densite_sol`, `visualisations/`, `--ign-classes sol`, stats key `telechargees`…) are stable contracts and must not be renamed. +- **Adding a visualization requires 4 edits**: (1) `generate_X()` in `visualizations.py`, (2) entry in `VIZ_STEPS` in `pipeline.py`, (3) entry in `COLORMAPS` in `rendering.py` (or `RGB_LEGENDS` for an RGB output), (4) entry in `VIZ_LEGENDS` in `index.py` (title/legend/description + sampled cmap gradient — single text source merged into `COLORMAPS` at import, also served in `/api/map/meta` and the TileJSON). Missing any one breaks the pipeline. - **`generate_*` signature is strict**: `(dem_file, basename, vis_dir, resolution, shared=None)` returning `Path` on success, `None` on failure. IGN overlays (`ortho`, `topo`) omit `shared`. - **Return `None` on failure, never raise**: `dtm.py`, `visualizations.py`, and `ign.py` all return `None` to let the pipeline continue. Raising aborts the entire file. - **Logger is always `logging.getLogger("lidar")`**, never `__name__`. All modules route through this single logger so worker processes can configure it. -- **Ajustement conjoint des lignes de balayage (3ᵉ passe du calage, `STRIP_ALIGN_VERSION` 3)** : chaque ligne de balayage (~150 lignes/s, découpée par `_scan_line_ids` : retour de la dent de scie de `scan_angle`) peut être décalée ET inclinée (roulis) de 1 à 15 cm — lignes en creux isolées, passe entière basculée visible en bande (mesuré sur LHD_FXX_0999_6882). `_joint_line_corrections` (`dtm.py`) recale chaque ligne (a + b·u) contre le consensus des AUTRES faisceaux de sa maille 1 m (plan local par la pente), moindres carrés tronqués à 5 MAD par `bincount`, pas amorti 0,5, arrêt sous 1 mm, recentrage (pas de dérive d'ensemble), estimation sur 1 point sur 3 ; CuPy si GPU actif, repli numpy. S'y ajoute un **profil d'étalonnage par faisceau et par degré d'angle** (`STRIP_ANGLE_BIN`, commun à toutes les lignes du faisceau, moyenne retirée, pente conservée car l'inclinaison par ligne est indéterminable quand la fauchée ne traverse la dalle qu'en partie ; classes pauvres = valeur voisine) : il retire les écarts non linéaires en travers de la fauchée (±1,5 cm mesurés au bord), sources de marches parallèles au vol au bord de fauchée. Lignes sans recouvrement : `_scan_line_corrections_beam` (contre la surface de leur propre faisceau, composante ligne à ligne seule, σ 3 lignes). Validé sur blocs jamais vus (damier 10 m). La gigue par fenêtres de temps (2ᵉ passe) n'est plus calculée quand `scan_angle` existe (redondante). Coût CPU ~26 s par dalle pour tout le calage (73 s avant). Sidecar : `lines`, `line_window`, `line_cell`, `line_model`. -- **Comblement des vides entre points borné à l'enveloppe (`GAP_FILL_VERSION` 2, `_fill_small_gaps` dans `dtm.py`)** : à 0,2 m ~80 % des pixels n'ont aucun point. L'ancien `fillnodata` à 1 m comblait tout pixel à moins de 1 m d'un point — chaque point isolé devenait une pastille plate de 2 m (teinte `atan2(0,0)` = rose saturé dans le relief orienté) et chaque trou recevait une bande extrapolée de 1 m (liseré coloré). Désormais : fermeture morphologique des pixels mesurés (rien n'est étendu vers l'extérieur) dont le rayon suit l'espacement local des points (`GAP_RADIUS_K` 1,5 × espacement mesuré sur 5 m, paliers `GAP_RADII_M` 1/1,5/2/3 m, 1 m mini pour boucher les trous de voitures), puis îlots < `GAP_MIN_ISLAND_M2` (1 m²) retirés. Morphologie par tranches numpy (`_morph_step`, ~10× scipy) ; ~5–9 s par dalle 5000². Version dans le tag GeoTIFF `LIDAR_GAP_FILL` (3 : + fichier annexe de densité) : absent/différent ⇒ DTM régénéré (`_gap_fill_matches` dans `pipeline.py`). `rasterio.fill.fillnodata` écrit dans son entrée : toujours lui passer une copie. -- **Openness à échelle fixe** : `generate_openness` normalise par des références figées `OPENNESS_POS_REF` / `OPENNESS_NEG_REF` (degrés, médianes mesurées sur 15 dalles réparties sur le territoire) et plus par z-score de dalle — même ouverture = même couleur, mosaïque jointive. +- **Joint scan-line adjustment (3rd pass of strip alignment, `STRIP_ALIGN_VERSION` 3)**: each scan line (~150 lines/s, split by `_scan_line_ids`: flyback of the `scan_angle` sawtooth) can be offset AND tilted (roll) by 1 to 15 cm — isolated sunken lines, a whole pass tilted and visible as a band (measured on LHD_FXX_0999_6882). `_joint_line_corrections` (`dtm.py`) re-fits each line (a + b·u) against the consensus of the OTHER strips in its 1 m cell (local plane through the slope), least squares trimmed at 5 MAD via `bincount`, damped step 0.5, stop below 1 mm, re-centring (no global drift), estimated on 1 point in 3; CuPy when the GPU is active, numpy fallback. On top of that, a **calibration profile per strip and per degree of scan angle** (`STRIP_ANGLE_BIN`, shared by all lines of the strip, mean removed, slope kept because the per-line tilt is undetermined when the swath only partly crosses the tile; sparse bins = neighbouring value) removes the non-linear across-swath errors (±1.5 cm measured at the edge), a source of steps parallel to the flight line at the swath edge. Lines without overlap: `_scan_line_corrections_beam` (against the surface of their own strip, line-to-line component only, σ 3 lines). Validated on never-seen blocks (10 m checkerboard). Jitter by time windows (2nd pass) is no longer computed when `scan_angle` exists (redundant). CPU cost ~26 s per tile for the whole alignment (73 s before). Sidecar: `lines`, `line_window`, `line_cell`, `line_model`. +- **Filling gaps between points, bounded by the envelope (`GAP_FILL_VERSION` 3, `_fill_small_gaps` in `dtm.py`)**: at 0.2 m ~80 % of the pixels contain no point. The old `fillnodata` at 1 m filled every pixel within 1 m of a point — each isolated point became a flat 2 m disc (hue `atan2(0,0)` = saturated pink in the oriented relief) and each hole received an extrapolated 1 m band (coloured fringe). Now: morphological closing of the measured pixels (nothing is extended outwards) whose radius follows the local point spacing (`GAP_RADIUS_K` 1.5 × spacing measured over 5 m, steps `GAP_RADII_M` 1/1.5/2/3 m, 1 m minimum to plug car-sized holes), then islands < `GAP_MIN_ISLAND_M2` (1 m²) removed. Morphology with numpy slices (`_morph_step`, ~10× scipy); ~5–9 s per 5000² tile. Version stored in the GeoTIFF tag `LIDAR_GAP_FILL` (2 = envelope, 3 = + density sidecar file): absent/different ⇒ DTM regenerated (`_gap_fill_matches` in `pipeline.py`). `rasterio.fill.fillnodata` writes into its input: always pass it a copy. +- **Fixed-scale openness**: `generate_openness` normalises with frozen references `OPENNESS_POS_REF` / `OPENNESS_NEG_REF` (degrees, medians measured on 15 tiles spread over the territory) instead of a per-tile z-score — same openness = same colour, seamless mosaic. - **Filename special-cases** in `_expected_output_path()`: `pos_open` → `positive_openness`, `neg_open` → `negative_openness`, `hillshade` → `hillshade_multi`. -- **Génération imposée** : la carte ne propose plus de réglage de classification ni de raccord — `_build_command` (`mapserve.py`) passe toujours `--ground-classification ign --ign-classes sol --edge-buffer 100` ; les champs `ground_class`/`ign_classes`/`reclassify`/`edge_buffer` éventuellement envoyés sont ignorés. Défauts CLI alignés (`ign`, `100`). -- **Classification IGN par extraction directe** : `_extract_ign_ground` (`dtm.py`) filtre les classes avec laspy (retours ≥ 1) et écrit le LAS sol sans passer par PDAL (4,9 s au lieu de 13,5 s par dalle) ; la lecture de la détection automatique est réutilisée (`_LAST_READ`). PDAL reste le repli. -- **Pyramide mise à jour pendant le rendu** : le pipeline régénère l'inventaire après chaque dalle **par défaut** (`incremental_index` sauf `--no-index`, quel que soit le lanceur), avec passe différée quand l'anti-rebond de 3 s ignore une dalle. Côté carte, `_bg_poller` surveille l'inventaire toutes les `BG_WATCH_S` = 10 s (fichier local ou charge utile amont) et lance un scan dès qu'il change ; les tuiles des dalles modifiées passent **en tête** de file (`_bg_enqueue(front=True)`), devant l'arriéré. -- **Pyramide complète générée d'avance** : par défaut `tiles.zoom_cached` stocke TOUS les niveaux jusqu'au natif (`TILE_CACHE_MAX_Z` = `TILE_MAX_NATIVE_Z` 19, `TILE_EVEN_LEVELS` off) et la maintenance de fond les génère d'avance jusqu'à `18@2x` (défaut de `LIDAR_TILE_BACKGROUND_MAX_Z`) ; sur le Pi elle les TÉLÉCHARGE du worker. Carte plafonnée au zoom 19 (`maxZoom`, 1 px écran = 1 px LiDAR, jamais de tuile agrandie). Raison : le rendu à la volée du Pi (~170 ms/tuile, 3 à la fois) donnait 1,5–6 s par écran aux zooms 17–19. File de maintenance bornée (`queue_max`) : chaque dalle garde dans `_bg["incomplete"]` l'indice de sa première tuile refusée faute de place et reprend de là aux scans suivants (avant : le premier scan saturait la file et le reste de la pyramide n'était jamais généré). ~110 000 tuiles @2x pour 3 240 dalles (~5 Go). Stockage réduit toujours possible (`LIDAR_TILE_EVEN_LEVELS=1` → `EvenLevelTileLayer`, niveaux pairs, natif 19 demandé tel quel). -- **Mémoire bornée de la carte (Pi, `mem_limit: 1g`)** : `_open_source` (`tiles.py`) met en cache une **copie détachée** de chaque source (une image AVIF ouverte garde son décodeur, ~18 Mo de plus par quadrant 2500²) et compte 4 octets/pixel (PIL stocke le RGB sur 32 bits) ; `Dockerfile.maps` fixe `MALLOC_MMAP_THRESHOLD_=1048576` pour que glibc rende les grands tampons au système. Sans ces deux points, la navigation à fort zoom (niveaux rendus à la volée) montait à ~700 Mo de RSS et le conteneur était tué en boucle par l'OOM killer (502 côté Traefik). -- **Carte autonome (Pi sans worker)** : amont (`LIDAR_SOURCE_URL`/`LIDAR_MAPS_URL`) éteint ⇒ la carte reste servie depuis le disque. `_remote_payload` mémorise aussi l'échec (TTL 60 s, délai 10 s : sinon chaque requête repayait le délai réseau et `/api/map/meta` ne répondait plus), puis l'index local (`_build_index`) prend le relais ; coupe-circuits sur les sources (`_SOURCE_OFFLINE`, 60 s) et les tuiles (`_UPSTREAM`, réarmé à expiration) ; source rapatriée datée à sa version amont (`os.utime`) pour que l'index local garde les mêmes dates ; pas de requête amont pour une tuile sans dalle quand l'inventaire vient de l'amont. En cache seule, une tuile périmée reste servie (`no-store`, `X-Tile-Pending`) en attendant la nouvelle. -- **Pyramide téléchargée en tâche de fond** : avec `LIDAR_MAPS_URL`, la maintenance (`_bg_process_one`) TÉLÉCHARGE les tuiles des niveaux stockés depuis l'amont (stat `telechargees`), sans attendre l'affichage, et sans pause entre deux téléchargements (le worker encaisse) ; rendu local en repli si l'amont ne répond pas, lui seul suivi de `LIDAR_TILE_BACKGROUND_PAUSE` (ressources du Pi). -- **Première apparition des dalles (`_apply_seen`, `index_xyz/.sources_seen.json`)** : date effective d'une source = max(version, première entrée dans l'inventaire). Une dalle écrite avant mais inventoriée après une tuile (TTL de l'index amont, anti-rebond de l'inventaire) périme donc la tuile — sinon trou permanent à ce niveau, sur disque, en mémoire et dans le navigateur (stamp `?v=` inchangé). Registre persistant ; absent avec un cache existant (mise à jour) ⇒ tout est périmé une fois. -- **Coût navigateur de la carte (mesuré sous Chrome, Intel Iris Xe)** : le filtre d'assombrissement du fond OSM (`.base-dark`) est posé sur le **conteneur** de la couche, jamais sur chaque tuile — rendu identique (opérations par pixel), processus GPU 92 % → 56 % en déplacement et 99 % → 53 % au zoom molette. Couches LiDAR en `keepBuffer: 1` (tuiles 512 px = 1 Mo décodé chacune). Mesuré sans effet notable : `backdrop-filter` des cartes, `isolation`/`mix-blend-mode` en « normal », `will-change`. Tas JS 2-5 Mo, CPU au repos ~1 %. Décodage AVIF ~12 ms/tuile contre ~5 ms en WebP (compromis assumé : stockage AVIF). -- **Encodage AVIF rapide** : `AVIF_SPEED = 9` (`rendering.py`, `tiles.py`, `_SUBTILE_AVIF_SPEED` dans `index.py`) — dalle 5000 × 5000 px encodée en 0,6 s au lieu de 4 s (+3 % de taille, −0,3 dB) ; l'encodage était l'étape la plus longue du rendu d'une couche. -- **Workers bornés par la VRAM** : chaque processus du pool prend une place fixe à sa création (`_init_worker_slot` dans `pipeline.py`, file multiprocessing) calculée par `gpu_worker_slots` (`gpu.py`) : au plus (VRAM libre − `LIDAR_GPU_RESERVE_MIB` 512) / `LIDAR_GPU_WORKER_MIB` (2048, pic estimé : contexte CUDA + calage conjoint CuPy en float64 + EDT de `_fill_nans`) workers par GPU, au moins un, entrelacés ; l'excédent tourne en CPU (`force_cpu`). L'ancien round-robin par numéro de fichier mettait 6 workers par RTX 5060 de 8 Go avec `LIDAR_WORKERS=auto` (12) : OOM. VRAM illisible (nvidia-smi en échec) : round-robin sans borne. -- **Préparation sur GPU** : `_fill_nans` (transformée de distance `cupyx`) et les gradients de `SharedDEM` passent sur GPU quand il est actif (repli CPU). `NUMBA_CACHE_DIR=/tmp/numba-cache` (Dockerfile) évite la recompilation des noyaux numba à chaque worker. -- **Default output is AVIF**, not WebP. Use `--format webp` for WebP. Quality default is 60 (visually lossless on smooth color ramps, ~÷3 vs q98). -- **Calage vertical des faisceaux de vol** : chaque tuile mélange plusieurs passes (1-2 `PointSourceId` par passe) parfois biaisées verticalement de quelques cm (±2,5 cm mesurés sur 1000_6882). `create_dtm_fast` mesure l'offset robuste de chaque faisceau (points sol, maille 1 m, surface médiane itérée 3×) et retranche les offsets ≥ 0,5 cm (`STRIP_ALIGN_THRESHOLD` dans `dtm.py`) avant rastérisation. Offsets calculés **par tuile** (ils dérivent le long d'une ligne de vol : jamais de table globale), mémoïsés par LAS sol, consignés dans `DTM/*_dtm*_stripalign.json` (sidecar de cache : absent, ou version/seuil/paramètres différents ⇒ régénération du DTM). Désactivable : `--no-strip-align`. -- **Gigue intra-faisceau (2ᵉ passe du calage)** : les lignes de balayage successives d'une MÊME passe peuvent être décalées verticalement de façon aléatoire (vibration capteur / bruit haute fréquence de trajectoire) — un offset constant par faisceau n'y suffit pas. `_strip_jitter_offsets` découpe chaque faisceau en fenêtres de temps GPS (`STRIP_JITTER_BIN` = 0,1 s, origine de temps propre à chaque faisceau), mesure l'offset robuste de chaque fenêtre contre la surface médiane des AUTRES faisceaux (maille 1 m partagée, ≥ `STRIP_JITTER_MIN_CELLS` = 40 cellules), lisse la série (médiane glissante `STRIP_JITTER_SMOOTH` = 5 fenêtres), la borne à ± `STRIP_JITTER_MAX` (10 cm) puis l'interpole au temps GPS de chaque point (`_apply_strip_jitter`) ; en recouvrement à deux faisceaux, chacun reçoit une série (chacun absorbe sa part). Requiert la dimension `gps_time` (silencieusement ignorée sinon). Sidecar version 2 (séries dans `jitter`), couverte par `--no-strip-align`. -- **Couches produites et servies = `PANEL_VIZ` (`index.py`, aujourd'hui `('relief_oriente', 'densite_sol')`)** : pipeline sans `--only`/`--skip` (`panel_steps()`), génération lancée depuis la carte (`_panel_viz_steps` dans `mapserve.py`) et couches servies (`tiles.available_layers` filtre : panneau, `/tiles/…`, TileJSON, WMTS, JOSM). Les autres visualisations restent calculables avec `--only`. Les tests de la carte lèvent la restriction via `_setup(..., panel=None)`. -- **Précision (`densite_sol`) et affichage de la carte** : `create_dtm_fast` écrit la densité des points sol retenus (bande de raccord comprise) dans `DTM/*_dtm*_density.tif` (mailles 1 m, moyenne 3 × 3, pts/m²) ; `generate_densite_sol` la quantifie en 16 niveaux (`density_levels` : échelle log fixe, niveau k dès 0,25 × 2^(k/2) pts/m²) et la garde à 1 m (dalle 1000², ~200 Ko en WebP sans perte, `rendering.LOSSLESS_GRAY_KEYWORDS`) ; tuiles au plus proche voisin (`tiles.NEAREST_LAYERS`) pour garder 16 gris nets aux zooms 18–19. Interface (`web/map.js`, onglet Affichage) : plus de pile de couches — une couche principale (`DEFAULT_VIZ`) et trois modes relief / précision / comparer (`VIEW_MODES`, barre glissante, lien `&P=compare&C=gauche:droite:%`) ; `both` (ancien produit) lu comme `relief`. Texte « Comment lire » : champ `reading` de `VIZ_LEGENDS` (carte + PDF). -- **Relief orienté (`relief_oriente`, seule couche de la carte)** : image RGB unique (GeoTIFF uint8 3 bandes, rendue telle quelle comme ortho/topo via `RGB_KEYWORDS` dans `rendering.py`) — clarté CIELAB = openness positive **locale** (MNT − gaussienne `RELIEF_DETREND_M` = 10 m, rayons `RELIEF_RADII_M` = 5/10/20 m, 16 directions) 65 % + ombrage 35 % ; teinte = aspect, chroma fixe (`RELIEF_CHROMA`). Échelle log fixe `RELIEF_OPEN_RANGE` (pas de statistique par dalle) et support total 40 m < bande de raccord 100 m : dalles jointives. Rapide : détendance + rayons sur grille décimée ~0,8 m (`RELIEF_GRID_M`), noyau dédié qui n'accumule que la moyenne des angles (`_mean_horizon_*` : CuPy `RawKernel` sur GPU, numba parallèle sur CPU, numpy en repli), colorisation fusionnée (numba) ou vectorisée sans trigonométrie (CuPy) via une table L* × teinte (`_relief_lut`). ~5 s de calcul hors préparation sur CPU 12 cœurs. Tout changement de constante change le rendu : régénérer les dalles (`--only relief_oriente --force`). -- **Openness sous-échantillonnée** : `generate_openness` calcule le lancé de rayons (l'étape la plus coûteuse : 532 s/tuile à 0,2 m sur CPU) sur une grille décimée par blocs (`OPENNESS_DOWNSAMPLE = 2` : max par bloc en positive, min en négative — préserve les reliefs qui bornent l'horizon) puis rééchantillonne en bilinéaire. Coût ÷ facteur³ : 532 s → 40 s (×13). Signal archéologique préservé (corr. 0,93 après lissage) ; la texture de bruit sub-métrique disparaît. `--openness-downsample 1` = pleine résolution. SVF et openness anisotrope ne sont PAS concernées. -- **Raccord des bords entre tuiles** : les rendus à grand noyau (openness/SVF : rayons 100 m ; LRM : 15 m) tronquent leur fenêtre au bord de dalle — bandes d'artefacts à chaque changement de tuile. `--edge-buffer N` (défaut 100 ; toujours appliqué par la génération depuis la carte, `EDGE_BUFFER_METERS` = 100 m dans `mapserve.py`, plus de case à cocher ; 0 = off en ligne de commande) fait rastériser le DTM sur la **dalle nominale 1 km alignée sur la grille** plus une bande de N m remplie avec les points sol des 8 LAZ voisines (`_neighbor_ground_points` dans `dtm.py` : PDAL en flux, découpe + filtre de classes IGN ; voisine absente = téléchargement automatique depuis le catalogue IGN avant le run, **isolée dans `input/edge_neighbors/`** pour ne pas gonfler le corpus des passes globales (dédupliqué sur tout le lot, `_fetch_edge_neighbors` dans `pipeline.py`) ; introuvable ou échec = bande vide). Les visualisations calculent sur l'emprise étendue puis `rendering.py` (`_core_tile_window`, via `tif_to_crop`/`tif_to_png`) recadre les sorties sur la dalle 1 km exacte lue dans le nom LHD — les AVIF restent des carrés 1 km alignés dans la mosaïque. Tampon consigné dans le tag GeoTIFF `LIDAR_EDGE_BUFFER` du DTM : changer `--edge-buffer` invalide le cache DTM automatiquement (tag absent = 0). Bandes voisines non calées par faisceaux (contexte seul, recadrée hors image finale). Coût : ~7 s de lecture par voisine + ~44 % de pixels en plus à 100 m/0,2 m. Nom hors pattern LHD : option ignorée (bornes d'en-tête, pas de recadrage). +- **Imposed generation settings**: the map no longer offers a classification or stitching setting — `_build_command` (`mapserve.py`) always passes `--ground-classification ign --ign-classes sol --edge-buffer 100`; any `ground_class`/`ign_classes`/`reclassify`/`edge_buffer` fields sent are ignored. CLI defaults aligned (`ign`, `100`). +- **IGN classification by direct extraction**: `_extract_ign_ground` (`dtm.py`) filters the classes with laspy (returns ≥ 1) and writes the ground LAS without PDAL (4.9 s instead of 13.5 s per tile); the read done by the automatic detection is reused (`_LAST_READ`). PDAL remains the fallback. +- **Pyramid updated during rendering**: the pipeline rebuilds the inventory after each tile **by default** (`incremental_index` unless `--no-index`, whatever the launcher), with a deferred pass when the 3 s debounce skips a tile. On the map side, `_bg_poller` watches the inventory every `BG_WATCH_S` = 10 s (local file or upstream payload) and starts a scan as soon as it changes; tiles of modified source tiles go to the **front** of the queue (`_bg_enqueue(front=True)`), ahead of the backlog. +- **Full pyramid generated ahead of time**: by default `tiles.zoom_cached` stores ALL levels up to native (`TILE_CACHE_MAX_Z` = `TILE_MAX_NATIVE_Z` 19, `TILE_EVEN_LEVELS` off) and background maintenance — enabled with `LIDAR_TILE_BACKGROUND=1`, set in the Pi override — generates them ahead of time up to `18@2x` (default of `LIDAR_TILE_BACKGROUND_MAX_Z`); on the Pi it DOWNLOADS them from the worker. Map capped at zoom 19 (`maxZoom`, 1 screen px = 1 LiDAR px, never an upscaled tile). Reason: on-the-fly rendering on the Pi (~170 ms/tile, 3 at a time) gave 1.5–6 s per screen at zooms 17–19. Bounded maintenance queue (`queue_max`): each source tile keeps in `_bg["incomplete"]` the index of its first tile rejected for lack of room and resumes from there on the next scans (before: the first scan filled the queue and the rest of the pyramid was never generated). ~110,000 @2x tiles for 3,240 source tiles (~5 GB). Reduced storage still possible (`LIDAR_TILE_EVEN_LEVELS=1` → `EvenLevelTileLayer`, even levels only, native 19 requested as is). +- **Bounded map memory (Pi, `mem_limit: 1g`)**: `_open_source` (`tiles.py`) caches a **detached copy** of each source (an open AVIF image keeps its decoder, ~18 MB more per 2500² quadrant) and counts 4 bytes/pixel (PIL stores RGB on 32 bits); `Dockerfile.maps` sets `MALLOC_MMAP_THRESHOLD_=1048576` so that glibc returns large buffers to the system. Without these two points, browsing at high zoom (levels rendered on the fly) climbed to ~700 MB RSS and the container was killed in a loop by the OOM killer (502 on the Traefik side). +- **Standalone map (Pi without worker)**: upstream (`LIDAR_SOURCE_URL`/`LIDAR_MAPS_URL`) down ⇒ the map is still served from disk. `_remote_payload` (`tiles.py`) also remembers the failure (TTL 60 s, timeout 10 s: otherwise every request paid the network timeout again and `/api/map/meta` stopped answering), then the local index (`_build_index`) takes over; circuit breakers on sources (`_SOURCE_OFFLINE`, 60 s) and tiles (`_UPSTREAM`, re-armed on expiry); a fetched source is dated to its upstream version (`os.utime`) so the local index keeps the same dates; no upstream request for a tile without a source tile when the inventory comes from upstream. In cache-only mode, a stale tile keeps being served (`no-store`, `X-Tile-Pending`) until the new one arrives. +- **Pyramid downloaded in the background**: with `LIDAR_MAPS_URL`, maintenance (`_bg_process_one`) DOWNLOADS the tiles of the stored levels from upstream (stat `telechargees`), without waiting for them to be displayed, and with no pause between two downloads (the worker copes); local rendering as a fallback when upstream does not answer, which alone is followed by `LIDAR_TILE_BACKGROUND_PAUSE` (Pi resources). +- **First appearance of source tiles (`_apply_seen`, `index_xyz/.sources_seen.json`)**: effective date of a source = max(version, first entry in the inventory). A source tile written before but inventoried after an XYZ tile (upstream index TTL, inventory debounce) therefore invalidates that tile — otherwise a permanent hole at that level, on disk, in memory and in the browser (unchanged `?v=` stamp). Persistent registry; absent with an existing cache (upgrade) ⇒ everything is invalidated once. +- **Browser cost of the map (measured in Chrome, Intel Iris Xe)**: the darkening filter of the OSM base map (`.base-dark`) is set on the layer **container**, never on each tile — identical rendering (per-pixel operations), GPU process 92 % → 56 % while panning and 99 % → 53 % on wheel zoom. LiDAR layers use `keepBuffer: 1` (512 px tiles = 1 MB decoded each). Measured with no notable effect: the cards' `backdrop-filter`, `isolation`/`mix-blend-mode` set to "normal", `will-change`. JS heap 2–5 MB, idle CPU ~1 %. AVIF decoding ~12 ms/tile against ~5 ms for WebP (accepted trade-off: AVIF storage). +- **Fast AVIF encoding**: `AVIF_SPEED = 9` (`rendering.py`, `tiles.py`, `_SUBTILE_AVIF_SPEED` in `index.py`) — a 5000 × 5000 px tile encoded in 0.6 s instead of 4 s (+3 % size, −0.3 dB); encoding was the longest step of rendering a layer. +- **Workers bounded by VRAM**: each pool process takes a fixed slot when it is created (`_init_worker_slot` in `pipeline.py`, multiprocessing queue) computed by `gpu_worker_slots` (`gpu.py`): at most (free VRAM − `LIDAR_GPU_RESERVE_MIB` 512) / `LIDAR_GPU_WORKER_MIB` (2048, estimated peak: CUDA context + joint CuPy alignment in float64 + EDT of `_fill_nans`) workers per GPU, at least one, interleaved; the excess runs on the CPU (`force_cpu`). The old round-robin by file number put 6 workers on each 8 GB RTX 5060 with `LIDAR_WORKERS=auto` (12): OOM. Unreadable VRAM (nvidia-smi failing): unbounded round-robin. +- **Preparation on the GPU**: `_fill_nans` (`cupyx` distance transform) and the `SharedDEM` gradients run on the GPU when it is active (CPU fallback). `NUMBA_CACHE_DIR=/tmp/numba-cache` (Dockerfile) avoids recompiling the numba kernels in every worker. +- **Default output is AVIF**, not WebP. Use `--format webp` for WebP. Quality default is 60 (visually lossless on smooth colour ramps, ~÷3 vs q98). +- **Vertical alignment of flight strips**: each tile mixes several passes (1–2 `PointSourceId` per pass), sometimes vertically biased by a few cm (±2.5 cm measured on 1000_6882). `create_dtm_fast` measures the robust offset of each strip (ground points, 1 m cells, median surface iterated 3×) and subtracts offsets ≥ 0.5 cm (`STRIP_ALIGN_THRESHOLD` in `dtm.py`) before rasterization. Offsets computed **per tile** (they drift along a flight line: never a global table), memoised per ground LAS, recorded in `DTM/*_dtm*_stripalign.json` (cache sidecar: absent, or different version/threshold/parameters ⇒ DTM regenerated). Can be disabled: `--no-strip-align`. +- **Intra-strip jitter (2nd pass of the alignment)**: successive scan lines of the SAME pass can be randomly offset vertically (sensor vibration / high-frequency trajectory noise) — a constant offset per strip is not enough. `_strip_jitter_offsets` splits each strip into GPS time windows (`STRIP_JITTER_BIN` = 0.1 s, time origin specific to each strip), measures the robust offset of each window against the median surface of the OTHER strips (shared 1 m cells, ≥ `STRIP_JITTER_MIN_CELLS` = 40 cells), smooths the series (rolling median `STRIP_JITTER_SMOOTH` = 5 windows), clamps it to ± `STRIP_JITTER_MAX` (10 cm), then interpolates it at each point's GPS time (`_apply_strip_jitter`); where two strips overlap, each gets a series (each absorbs its share). Requires the `gps_time` dimension (silently skipped otherwise). Sidecar version 2 (series in `jitter`), covered by `--no-strip-align`. +- **Layers produced and served = `PANEL_VIZ` (`index.py`, currently `('relief_oriente', 'densite_sol')`)**: pipeline without `--only`/`--skip` (`panel_steps()`), generation started from the map (`_panel_viz_steps` in `mapserve.py`) and served layers (`tiles.available_layers` filters: panel, `/tiles/…`, TileJSON, WMTS, JOSM). The other visualizations can still be computed with `--only`. Map tests lift the restriction via `_setup(..., panel=None)`. +- **Precision (`densite_sol`) and map display**: `create_dtm_fast` writes the density of the kept ground points (stitching band included) to `DTM/*_dtm*_density.tif` (1 m cells, 3 × 3 mean, pts/m²); `generate_densite_sol` quantises it into 16 levels (`density_levels`: fixed log scale, level k from 0.25 × 2^(k/2) pts/m²) and keeps it at 1 m (1000² tile, ~200 KB in lossless WebP, `rendering.LOSSLESS_GRAY_KEYWORDS`); nearest-neighbour tiles (`tiles.NEAREST_LAYERS`) to keep 16 crisp greys at zooms 18–19. Interface (`web/map.js`, View tab): no more layer stack — one main layer (`DEFAULT_VIZ`) and three modes relief / precision / compare (`VIEW_MODES`, sliding bar, link `&P=compare&C=left:right:%`); `both` (old product) read as `relief`. "How to read" text: the `reading` field of `VIZ_LEGENDS` (map + PDF). +- **Oriented relief (`relief_oriente`, the only relief layer of the map)**: a single RGB image (3-band uint8 GeoTIFF, rendered as is like ortho/topo via `RGB_KEYWORDS` in `rendering.py`) — CIELAB lightness = **local** positive openness (DTM − Gaussian `RELIEF_DETREND_M` = 10 m, radii `RELIEF_RADII_M` = 5/10/20 m, 16 directions) 65 % + shading 35 %; hue = aspect, fixed chroma (`RELIEF_CHROMA`). Fixed log scale `RELIEF_OPEN_RANGE` (no per-tile statistic) and a total support of ~60 m (20 m maximum ray radius + 4σ = 40 m of the 10 m Gaussian detrend), still < the 100 m stitching band: seamless tiles. Fast: detrend + radii on a decimated grid ~0.8 m (`RELIEF_GRID_M`), a dedicated kernel that only accumulates the mean of the angles (`_mean_horizon_*`: CuPy `RawKernel` on GPU, parallel numba on CPU, numpy fallback), fused colourisation (numba) or vectorised without trigonometry (CuPy) through an L* × hue table (`_relief_lut`). ~5 s of computation excluding preparation on a 12-core CPU. Any constant change changes the rendering: regenerate the tiles (`--only relief_oriente --force`). +- **Downsampled openness**: `generate_openness` computes the ray tracing (the most expensive step: 532 s/tile at 0.2 m on CPU) on a block-decimated grid (`OPENNESS_DOWNSAMPLE = 2`: block max for positive, min for negative — preserves the reliefs that bound the horizon) then resamples bilinearly. Cost ÷ factor³: 532 s → 40 s (×13). Archaeological signal preserved (corr. 0.93 after smoothing); the sub-metre noise texture disappears. `--openness-downsample 1` = full resolution. SVF is NOT affected (anisotropic openness no longer exists). +- **Edge stitching between tiles**: large-kernel renderings (openness/SVF: 100 m radii; LRM: 15 m) truncate their window at the tile edge — bands of artefacts at every tile change. `--edge-buffer N` (default 100; always applied by generation from the map, `EDGE_BUFFER_METERS` = 100 m in `mapserve.py`, no checkbox any more; 0 = off on the command line) rasterizes the DTM over the **nominal 1 km tile aligned on the grid** plus an N m band filled with the ground points of the 8 neighbouring LAZ files (`_neighbor_ground_points` in `dtm.py`: streaming PDAL, crop + IGN class filter; missing neighbour = automatic download from the IGN catalogue before the run, **kept apart in `input/edge_neighbors/`** so as not to swell the corpus of global passes (deduplicated over the whole batch, `_fetch_edge_neighbors` in `pipeline.py`); not found or failure = empty band). Visualizations compute on the extended extent, then `rendering.py` (`_core_tile_window`, via `tif_to_crop`/`tif_to_png`) crops the outputs to the exact 1 km tile read from the LHD name — the AVIF images stay aligned 1 km squares in the mosaic. Buffer recorded in the GeoTIFF tag `LIDAR_EDGE_BUFFER` of the DTM: changing `--edge-buffer` invalidates the DTM cache automatically (tag absent = 0). Neighbouring bands are not strip-aligned (context only, cropped out of the final image). Cost: ~7 s of reading per neighbour + ~44 % more pixels at 100 m/0.2 m. Name outside the LHD pattern: option ignored (header bounds, no cropping). - **Tests use lazy imports inside each test function**, never at module top, to avoid importing CuPy/GDAL at import time. - **`_`-prefixed names are critical private**: `_create_ground_pipeline`, `_fallback_to_smrf`, `_fill_nans`, `_init_gpu`, `_process_file_standalone` — do not call from outside their module. -- **`build_index()` écrit l'inventaire + les paliers sources** : `output/index_tiles.json` (dalles, couches, URLs versionnées — servi par `/api/tiles`), vignettes `index_thumbs/` (≈3,9 m/px + `_mid` 1,56 m/px) et quadrants `index_subtiles/` — paliers de la pyramide XYZ (`tiles.py`). Chaque tuile du run en cours porte ses coins WGS84 pour les cadres de progression. Plus d'HTML : l'interface vit dans `mapui.py`. -- **Export PDF (`export_pdf.py`)** : Pillow + pyproj + reportlab, sans numpy — tourne dans l'image légère seule. `/api/export/frame` (cadre) et `/api/export/pdf` (planche) dans `mapserve.py`, jamais délégués à `LIDAR_GENERATION_URL`, verrou d'export unique (`_export_lock`, 429 si occupé). Composition directe en L93 (`tiles.sources_in_bbox`/`load_source`, recadrage + rééchantillonnage Lanczos), sans passer par les tuiles XYZ. Planche : quadrillage L93 (pas selon l'échelle), coins WGS84, flèche du nord tenant compte de la convergence du méridien, échelle graphique et numérique, rose des orientations 8 points, texte de légende tiré de `VIZ_LEGENDS`, encart qualité (hachures blanches = « non renseigné », ligne « Donnée manquante (sans relief) » pour les dalles hors couverture), 300 dpi en A4 / 250 dpi en A3 (borne la mémoire du Pi). `NODATA_RGB` recopie `visualizations.RELIEF_NODATA_RGB` (numpy absent de l'image légère) ; hors emprise des dalles = blanc hachuré. -- **Sidecar qualité (`quality.py`)** : `output/quality/{basename}.json` (`QUALITY_VERSION`), densité sol par maille 50 m et dates d'acquisition, calculé après le DTM (`ensure_quality`, y compris sur un DTM déjà en cache — mesure alors directement le LAZ d'entrée) ; rattrapage batch `--quality-backfill` (cf. Workflow) ; recopié dans la table `quality` de `index_tiles.json` (`build_index`) et sur les machines légères (`tiles._persist_remote_quality`, depuis l'inventaire amont). +- **`build_index()` writes the inventory + the source levels**: `output/index_tiles.json` (source tiles, layers, versioned URLs — served by `/api/tiles`), thumbnails `index_thumbs/` (≈3.9 m/px + `_mid` 1.56 m/px) and quadrants `index_subtiles/` — levels of the XYZ pyramid (`tiles.py`). Each tile of the current run carries its WGS84 corners for the progress frames. No HTML any more: the interface lives in `mapui.py`. +- **PDF export (`export_pdf.py`)**: Pillow + pyproj + reportlab, no numpy — runs in the lightweight image alone. `/api/export/frame` (frame) and `/api/export/pdf` (sheet) in `mapserve.py`, never delegated to `LIDAR_GENERATION_URL`, single export lock (`_export_lock`, 429 when busy). Composed directly in L93 (`tiles.sources_in_bbox`/`load_source`, crop + Lanczos resampling), without going through the XYZ tiles. Sheet: L93 grid (step depends on the scale), WGS84 corners, north arrow accounting for meridian convergence, graphic and numeric scale, 8-point orientation rose, legend text taken from `VIZ_LEGENDS`, quality inset (white hatching = "not recorded", a "Missing data (no relief)" line for tiles outside coverage), 300 dpi in A4 / 250 dpi in A3 (bounds the Pi's memory). `NODATA_RGB` copies `visualizations.RELIEF_NODATA_RGB` (numpy is absent from the lightweight image); outside the tiles' extent = hatched white. +- **Quality sidecar (`quality.py`)**: `output/quality/{basename}.json` (`QUALITY_VERSION`), ground density per 50 m cell and acquisition dates, computed after the DTM (`ensure_quality`, including on an already cached DTM — it then measures the input LAZ directly); batch backfill `--quality-backfill` (see Workflow); copied into the `quality` table of `index_tiles.json` (`build_index`) and onto the lightweight machines (`tiles._persist_remote_quality`, from the upstream inventory). ## Architecture Notes (from code audit 2025-09) ### Module structure & data flow -- `cli.py` → `pipeline.py` (LidarArchaeoPipeline) → per-file: `dtm.py` (classify + rasterize) → `visualizations.py` (17 products) → `rendering.py` (GeoTIFF→AVIF) → `index.py` (catalogue : vignettes + inventaire) +- `cli.py` → `pipeline.py` (LidarArchaeoPipeline) → per-file: `dtm.py` (classify + rasterize) → `visualizations.py` (17 products) → `rendering.py` (GeoTIFF→AVIF) → `index.py` (catalogue: thumbnails + inventory) - `gpu.py` provides CuPy/NumPy proxy (`xp`), lazy init, OOM fallback. `safe_gpu_call` wraps all non-IGN viz calls. -- `mapserve.py` (FastAPI, image `lidar-maps`) sert la pyramide XYZ (`tiles.py`), l'interface (`mapui.py`), l'inventaire `/api/tiles` + statiques dalles pour les machines légères, et l'API de génération : pipeline en sous-processus sur l'image complète, délégation via `LIDAR_GENERATION_URL` sur l'image légère (Raspberry Pi). Job unique + file persistante (`_job_lock` est un **RLock** : `/api/status` appelle `_queue_summary()` sous verrou). `LIDAR_API_TOKEN` (worker) / `LIDAR_REMOTE_TOKEN` (léger) protègent les appels ; `LIDAR_REGEN_CIDR` réserve la génération au réseau local. +- `mapserve.py` (FastAPI, image `lidar-maps`) serves the XYZ pyramid (`tiles.py`), the interface (`mapui.py`), the `/api/tiles` inventory + static source tiles for the lightweight machines, and the generation API: pipeline as a subprocess on the full image, delegation via `LIDAR_GENERATION_URL` on the lightweight image (Raspberry Pi). Single job + persistent queue (`_job_lock` is an **RLock**: `/api/status` calls `_queue_summary()` under the lock). `LIDAR_API_TOKEN` (worker) / `LIDAR_REMOTE_TOKEN` (lightweight) protect the calls; `LIDAR_REGEN_CIDR` restricts generation to the local network. - `progress.py` writes JSONL events (O_APPEND, atomic) read by mapserve for live progress (frames on the map). ### Key design decisions (intentional, do not "fix") - **`_res_suffix` hardcodes 0.5 as "no suffix"**: coupled to `index.py` parsing (`_strip_res_suffix` defaults to 0.5 when no suffix). Changing requires sidecar metadata. - **GPU scoring** (`major*1000 + minor*100 + mem_mi`): compute capability priority is intentional — a newer GPU with less VRAM is preferred. - **`mapserve.py` reads env at import time**: deployment-focused single-purpose server, env is set once in docker-compose. -- **Repeated try/except in visualizations** (14× same pattern): intentional convention for uniform `return None` behavior. +- **Repeated try/except in visualizations** (same pattern in every `generate_*`): intentional convention for uniform `return None` behavior. - **`_d8_accumulate_numba` defines `@njit` inside the function**: `cache=True` makes subsequent calls fast; the Python function object creation is negligible. -- **`pkill -9 -f "pdal pipeline"`** in cli.py signal handler: belt-and-suspenders alongside `os.killpg`. Scoped to "pdal pipeline" to avoid killing unrelated PDAL processes. +- **`pkill -9 -f "pdal pipeline /temp/"`** in the cli.py signal handler: belt-and-suspenders alongside `os.killpg`. Scoped to this run's temp directory to avoid killing unrelated PDAL processes (e.g. a concurrent generation job). ### Performance characteristics - `_priority_flood` uses numba JIT binary heap (single int64 array, flat view for elevation). Python heapq fallback if numba unavailable. - `_d8_accumulate_numba` uses numba with `argsort` top-down sweep. Python fallback exists. - Ray-tracing (SVF, openness): processes one direction at a time to limit VRAM. Auto-falls back to CPU on OOM via `_ray_trace_horizons`. -- Multi-resolution: primary res (default 0.5) has no filename suffix; additional resolutions use `_r0p2` style suffix. Ground classification done once, shared across resolutions. +- Multi-resolution: 0.5 m has no filename suffix whatever its position; every other resolution (including the 0.2 m default) uses a `_r0p2` style suffix. Ground classification done once, shared across resolutions. - `ProcessPoolExecutor` has a 2-hour wall-clock safety timeout (prevents indefinite hang from stuck workers). ### Numba usage pattern diff --git a/Dockerfile b/Dockerfile index ae39387..a63f0f0 100644 --- a/Dockerfile +++ b/Dockerfile @@ -21,7 +21,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ WORKDIR /app -# Install Python packages via pip (liste unique : requirements.txt) +# Install Python packages via pip (single list: requirements.txt) COPY requirements.txt . RUN pip3 install --no-cache-dir -r requirements.txt @@ -30,8 +30,8 @@ RUN pip3 install --no-cache-dir -r requirements.txt # the pre-built wheel (sm_89 = RTX 4060 Ti, sm_120 = RTX 5060 Ti). # nvcc must be in PATH at runtime for JIT compilation. ENV CUPY_CUDA_COMPILE_WITH_CACHE=1 -# Cache des noyaux numba (relief orienté, accumulation) : sans lui, chaque -# worker (processus spawn par dalle) recompile ses noyaux (~1 s par dalle). +# numba kernel cache (relief_oriente, flow accumulation): without it, every +# worker (spawned process per tile) recompiles its kernels (~1 s per tile). ENV NUMBA_CACHE_DIR=/tmp/numba-cache ENV PATH=/usr/local/cuda/bin:${PATH} RUN pip3 install --no-cache-dir cupy-cuda12x @@ -41,11 +41,12 @@ COPY setup.py . COPY lidar_pipeline/ ./lidar_pipeline/ RUN pip3 install --no-cache-dir . -# CSS/JS de l'interface de la carte (app.js/app.css + Leaflet) bâchés dans -# l'image : mapserve les sert depuis mapserve_assets/ du paquet installé. -# cd /tmp : sans lui, python3 -c met le répertoire courant (/app, copie -# source) sur sys.path et le bake atterrirait dans la copie au lieu du -# paquet installé (dist-packages) qu'utilise le conteneur au runtime. +# Map interface CSS/JS (app.js/app.css from web/map.*, + vendored Leaflet) +# baked into the image: mapserve serves them from mapserve_assets/ of the +# installed package. cd /tmp: without it, python3 -c puts the current +# directory (/app, the source copy) on sys.path and the bake would land in +# that copy instead of the installed package (dist-packages) the container +# uses at runtime. RUN cd /tmp && python3 -c "import pathlib, lidar_pipeline.mapui as m; m.write_map_assets(pathlib.Path(m.__file__).resolve().parent / m.ASSETS_DIRNAME)" diff --git a/Dockerfile.maps b/Dockerfile.maps index 4361a28..b16cf00 100644 --- a/Dockerfile.maps +++ b/Dockerfile.maps @@ -1,8 +1,8 @@ -# Carte LiDAR à tuiles XYZ (image « lidar-maps ») — cf. docs/MAPS.md. +# LiDAR XYZ tile map ("lidar-maps" image) - see docs/MAPS.md. # -# Sert la pyramide de tuiles Web Mercator (schéma OpenStreetMap) rendue à la -# demande depuis les dalles du pipeline, plus l'interface de consultation. -# Aucun PDAL, aucun GDAL, aucun GPU : Pillow + pyproj suffisent (ARM64 inclus). +# Serves the Web Mercator tile pyramid (OpenStreetMap scheme) rendered from +# the pipeline's source tiles, plus the viewing interface and the PDF export. +# No PDAL, no GDAL, no GPU: Pillow + pyproj + reportlab are enough (ARM64 included). # # docker compose -f docker-compose.maps.yml up -d --build FROM python:3.12-slim @@ -10,9 +10,9 @@ FROM python:3.12-slim ENV DEBIAN_FRONTEND=noninteractive ENV TZ=Europe/Paris -# Pillow >= 11.3 : encodage/décodage AVIF natif (dalles et sous-tuiles du -# pipeline) ; pyproj : reprojection Lambert 93 → Web Mercator sans GDAL ; -# reportlab : planche PDF d'impression, pur Python. +# Pillow >= 11.3: native AVIF encoding/decoding (pipeline tiles and +# sub-tiles); pyproj: Lambert 93 -> Web Mercator reprojection without GDAL; +# reportlab: printable PDF sheet, pure Python. RUN pip3 install --no-cache-dir \ fastapi \ uvicorn \ @@ -22,12 +22,14 @@ RUN pip3 install --no-cache-dir \ WORKDIR /app -# Seuls tiles.py, mapserve.py, mapui.py et index.py (registres de couches) sont -# importés ; les modules de traitement sont copiés mais jamais chargés. +# Only modules that import without numpy/GDAL are loaded (mapserve.py, +# tiles.py, mapui.py, index.py for the layer registries, export_pdf.py, +# quality.py, progress.py, fetch_ign.py); the processing modules are copied +# but never loaded. COPY lidar_pipeline/ ./lidar_pipeline/ -# CSS/JS de l'interface bâchés dans l'image : le code de la carte suit l'image, -# pas le cache de tuiles (régénéré à chaque build). +# Interface CSS/JS baked into the image: the map code follows the image, +# not the tile cache (regenerated on every build). RUN python3 -c "import sys; sys.path.insert(0, '/app'); \ from lidar_pipeline.mapui import write_map_assets, ASSETS_DIRNAME; \ write_map_assets('/app/lidar_pipeline/' + ASSETS_DIRNAME)" @@ -37,10 +39,10 @@ RUN groupadd -g 1000 lidar && \ mkdir -p /data/output && \ chown -R lidar:lidar /data -# Seuil mmap FIXE (1 Mo) : les grands tampons d'image (décodage des dalles, -# ~25 Mo) sont rendus au système dès leur libération. Avec le seuil -# dynamique de glibc, ils restaient dans le tas après la première libération -# et la mémoire du conteneur ne redescendait jamais (OOM sur le Pi). +# FIXED mmap threshold (1 MiB): large image buffers (tile decoding, ~25 MB) +# are returned to the system as soon as they are freed. With glibc's dynamic +# threshold they stayed in the heap after the first free and the container's +# memory never went back down (OOM on the Pi). ENV LIDAR_OUTPUT_DIR=/data/output \ LIDAR_PORT=8975 \ PYTHONPATH=/app \ diff --git a/README.md b/README.md index fb9d5a9..98cea1f 100644 --- a/README.md +++ b/README.md @@ -90,10 +90,8 @@ the CPU (slower, same output). Tile IDs are the IGN grid coordinates in km (Lambert 93): `1037,6779` is the tile whose top-left corner is at X = 1,037 km, Y = 6,779 km. You can also skip the -command line entirely: open the map, go to the **Génération** tab and draw a -zone. - -> The user interface and log messages are in French; code identifiers are in English. +command line entirely: open the map, go to the **Generate** tab and draw an +area. ## How it works @@ -131,7 +129,8 @@ flowchart LR - **Three view modes** — relief, precision, or *compare* with a draggable split bar. - **Relief intensity** slider (0.5×–2×), remembered per browser and carried in the link. - **Share** — the URL encodes position, mode, comparison and intensity. -- **Use in JOSM / QGIS** button — copies the tile URL for the current layer. +- **Use in JOSM / QGIS** — the Share tab lists the XYZ, TileJSON, WMTS and JOSM URLs, + with a **Copy** button for the chosen layer's tile URL. - Keyboard: `1`–`5` tabs, `P` next view mode, `Esc` deselect / collapse. - Works on phones: the panel becomes a three-height bottom sheet; GPS centring over HTTPS. diff --git a/docker-compose.cpu.yml b/docker-compose.cpu.yml index 93330b8..be8e5b4 100644 --- a/docker-compose.cpu.yml +++ b/docker-compose.cpu.yml @@ -1,9 +1,9 @@ -# Surcharge pour une machine SANS GPU NVIDIA : retire `gpus: all` des services -# de docker-compose.yml (sinon Docker refuse de démarrer : « failed to -# discover GPU vendor from CDI »). Le pipeline bascule alors seul sur le CPU. -# Utilisée automatiquement par ./start.sh ; à la main : +# Override for a machine WITHOUT an NVIDIA GPU: removes `gpus: all` from the +# docker-compose.yml services (otherwise Docker refuses to start: "failed to +# discover GPU vendor from CDI"). The pipeline then falls back to the CPU on its own. +# Used automatically by ./start.sh; by hand: # docker compose -f docker-compose.yml -f docker-compose.cpu.yml up -d --build serve -# `!reset` exige Docker Compose ≥ 2.24. +# `!reset` requires Docker Compose >= 2.24. services: serve: gpus: !reset [] diff --git a/docker-compose.maps.override.yml.example b/docker-compose.maps.override.yml.example index 766979d..b54a5c8 100644 --- a/docker-compose.maps.override.yml.example +++ b/docker-compose.maps.override.yml.example @@ -1,40 +1,40 @@ -# Override local de la carte légère (Raspberry Pi) — cf. docs/DEPLOY_WEBAPP.md. +# Local override for the lightweight map (Raspberry Pi) - see docs/DEPLOY_WEBAPP.md. # -# Copier en docker-compose.maps.override.yml (ignoré par git) puis adapter -# les adresses, le dossier de cache et le routage Traefik : +# Copy to docker-compose.maps.override.yml (ignored by git), then adapt the +# addresses, the cache folder and the Traefik routing: # cp docker-compose.maps.override.yml.example docker-compose.maps.override.yml # docker compose -f docker-compose.maps.yml -f docker-compose.maps.override.yml up -d --build # -# Compose >= 2.24 requis (balise !override). +# Requires Compose >= 2.24 (!override tag). name: lidar-maps services: maps: - # Remplace ./output par un dossier sur un volume plus gros (appartenant à - # l'uid 1000 : mkdir -p /srv/lidar/output && chown 1000:1000 /srv/lidar/output) + # Replace ./output with a folder on a bigger volume (owned by uid 1000: + # mkdir -p /srv/lidar/output && chown 1000:1000 /srv/lidar/output) volumes: !override - /srv/lidar/output:/data/output - # Plafond mémoire : un rendu déréglé ne peut pas emporter la machine + # Memory cap: a runaway render cannot take the machine down mem_limit: 1g memswap_limit: 1g environment: - TZ=Europe/Paris - # Machine de traitement (docker-compose.worker.yml) - - LIDAR_SOURCE_URL=http://192.168.1.50:8973 # inventaire + dalles - - LIDAR_GENERATION_URL=http://192.168.1.50:8973 # génération déléguée - - LIDAR_MAPS_URL=http://192.168.1.50:8973 # tuiles téléchargées d'avance - # Même valeur que LIDAR_API_TOKEN côté worker, s'il en a un - # - LIDAR_REMOTE_TOKEN=un-secret-à-partager - # Réseaux autorisés à lancer une génération (défaut : plages privées) + # Processing machine (docker-compose.worker.yml) + - LIDAR_SOURCE_URL=http://192.168.1.50:8973 # inventory + source tiles + - LIDAR_GENERATION_URL=http://192.168.1.50:8973 # delegated generation + - LIDAR_MAPS_URL=http://192.168.1.50:8973 # tiles downloaded ahead of time + # Same value as LIDAR_API_TOKEN on the worker, if it has one + # - LIDAR_REMOTE_TOKEN=shared-secret + # Networks allowed to start a generation (default: localhost + private ranges) # - LIDAR_REGEN_CIDR=192.168.1.0/24 - # Petite machine : la navigation ne rend rien, la pyramide est - # entretenue en tâche de fond + # Small machine: browsing renders nothing, the pyramid is + # maintained in the background - LIDAR_TILE_WORKERS=1 - LIDAR_TILE_SOURCE_CACHE_MB=64 - LIDAR_TILE_CACHE_ONLY=1 - LIDAR_TILE_BACKGROUND=1 - LIDAR_TILE_BACKGROUND_PAUSE=1.0 - # Routage Traefik éventuel (HTTPS : requis pour le GPS sur téléphone). - # Sans Traefik, supprimer networks/labels et le bloc networks final. + # Optional Traefik routing (HTTPS: required for GPS on phones). + # Without Traefik, remove networks/labels and the final networks block. networks: [default, proxy] labels: - "traefik.enable=true" diff --git a/docker-compose.maps.yml b/docker-compose.maps.yml index 1e105b0..6cf57d5 100644 --- a/docker-compose.maps.yml +++ b/docker-compose.maps.yml @@ -1,10 +1,10 @@ -# Carte à tuiles XYZ (style OpenStreetMap / Google Maps) — cf. docs/MAPS.md. +# XYZ tile map (OpenStreetMap / Google Maps style) - see docs/MAPS.md. # -# Sert la pyramide de tuiles + l'interface de consultation + la génération -# (déléguée à la machine de traitement via LIDAR_GENERATION_URL sur une -# machine légère, locale sur l'image complète). Même dossier output/ que le -# pipeline ; les tuiles sont rendues à la demande et mises en cache dans -# output/index_xyz/. +# Serves the tile pyramid + the viewing interface + generation (delegated to +# the processing machine via LIDAR_GENERATION_URL on a lightweight machine, +# local on the full image). Same output/ folder as the pipeline; tiles are +# rendered on demand (or ahead of time with LIDAR_TILE_BACKGROUND=1) and +# cached in output/index_xyz/. # # docker compose -f docker-compose.maps.yml up -d --build # docker compose -f docker-compose.maps.yml logs -f maps @@ -21,40 +21,40 @@ services: ports: - "8975:8975" volumes: - # Lecture des dalles + écriture du cache de tuiles (output/index_xyz/) + # Reads the source tiles + writes the tile cache (output/index_xyz/) - ./output:/data/output environment: - TZ=Europe/Paris - LIDAR_OUTPUT_DIR=/data/output - # Générateur de tuiles (worker, cf. docker-compose.worker.yml) : la - # génération lancée depuis la carte y est déléguée. Sans cette - # variable ET sans pipeline local, les boutons de génération sont - # masqués (image légère de consultation seule). + # Tile generator (worker, see docker-compose.worker.yml): generation + # started from the map is delegated to it. Without this variable AND + # without a local pipeline, the Generation tab is hidden (view-only + # lightweight image). # - LIDAR_GENERATION_URL=http://192.168.1.50:8973 - # Jeton si le worker exige LIDAR_API_TOKEN. - # - LIDAR_REMOTE_TOKEN=un-secret-à-partager - # Réseau autorisé à lancer les générations (défaut : localhost + - # plages privées RFC1918 ; liste de CIDR, vide = tout autoriser). + # Token, if the worker requires LIDAR_API_TOKEN. + # - LIDAR_REMOTE_TOKEN=shared-secret + # Network allowed to start generations (default: localhost + + # RFC1918 private ranges; CIDR list, empty = allow everything). # - LIDAR_REGEN_CIDR=192.168.1.0/24 - # Serveur de DALLES amont (mapserve du worker) : sans données locales, - # l'inventaire vient de son /api/tiles et les images sont rapatriées à - # la demande dans ./output — de quoi servir tout un catalogue distant. + # Upstream SOURCE-TILE server (the worker's mapserve): without local data, + # the inventory comes from its /api/tiles and images are fetched on + # demand into ./output - enough to serve a whole remote catalogue. # - LIDAR_SOURCE_URL=http://192.168.1.50:8973 - # Serveur de TUILES amont (autre instance lidar-maps) pour une carte - # déportée (Raspberry Pi) : une tuile absente localement y est rapatriée. + # Upstream XYZ TILE server (the worker or another lidar-maps instance) + # for a remote map (Raspberry Pi): a tile missing locally is fetched from it. # - LIDAR_MAPS_URL=http://192.168.1.50:8975 - # Mention d'attribution servie dans TileJSON, WMTS, JOSM et la carte. - # - LIDAR_ATTRIBUTION=LiDAR HD © IGN — Licence Ouverte 2.0 - # Charge maximale : rendus et téléchargements simultanés, mémoire du - # cache d'images sources. Défauts taillés pour une petite machine ; - # à relever sur un serveur confortable. + # Attribution text served in TileJSON, WMTS, JOSM and the map. + # - LIDAR_ATTRIBUTION=LiDAR HD © IGN - Licence Ouverte 2.0 + # Maximum load: concurrent renders and downloads, memory of the source + # image cache. Defaults (shown) sized for a small machine; raise them + # on a comfortable server. # - LIDAR_TILE_WORKERS=2 # - LIDAR_TILE_FETCH_WORKERS=2 # - LIDAR_TILE_SOURCE_CACHE_MB=192 - # Pyramide complète (défaut) : tous les niveaux jusqu'au natif (z19, - # 0,2 m/px) sont stockés et générés d'avance. Stockage réduit : niveaux - # pairs seuls et/ou plafond plus bas, le reste rendu à la volée avec un - # cache mémoire. + # Full pyramid (default): every level up to native (z19, 0.2 m/px) is + # stored on disk (and generated ahead of time with LIDAR_TILE_BACKGROUND=1). + # Reduced storage: even levels only and/or a lower cap, the rest rendered + # on the fly with an in-memory cache. # - LIDAR_TILE_CACHE_MAX_Z=16 # - LIDAR_TILE_EVEN_LEVELS=1 # - LIDAR_TILE_MEMORY_CACHE_MB=64 diff --git a/docker-compose.worker.yml b/docker-compose.worker.yml index e87e043..df03f7d 100644 --- a/docker-compose.worker.yml +++ b/docker-compose.worker.yml @@ -1,31 +1,33 @@ -# Machine de traitement — générateur de tuiles (cf. docs/DEPLOY_WEBAPP.md). +# Processing machine - tile generator (see docs/DEPLOY_WEBAPP.md). # -# Tourne sur la machine puissante (GPU + PDAL) et expose l'API que les -# cartes distantes (Raspberry Pi, docker-compose.maps.yml + LIDAR_GENERATION_URL) -# appellent : dessin d'une zone → téléchargement IGN + traitement GPU ici, -# dalles et tuiles servies aux machines légères (/api/tiles + statiques, +# Runs on the powerful machine (GPU + PDAL) and exposes the API that remote +# maps (Raspberry Pi, docker-compose.maps.yml + LIDAR_GENERATION_URL) call: +# drawing an area -> IGN download + GPU processing here; source tiles and +# XYZ tiles served to the lightweight machines (/api/tiles + static files, # /tiles/XYZ). # # docker compose -f docker-compose.worker.yml up -d --build # docker compose -f docker-compose.worker.yml logs -f worker # docker compose -f docker-compose.worker.yml down # -# Traitement batch ponctuel des dalles présentes dans input/ : -# docker compose -f docker-compose.worker.yml run --rm --build process [-r 0.5,0.2 | --force] +# One-off batch processing of the tiles present in input/: +# docker compose -f docker-compose.worker.yml run --rm --build process +# (any argument replaces the default command: repeat +# python3 -m lidar_pipeline /data/input -o /data/output -r 0.2 -g all ... in full) services: - # Générateur de tuiles : carte XYZ + API de génération (image complète, GPU) + # Tile generator: XYZ map + generation API (full image, GPU) worker: build: . image: lidar-lidar container_name: lidar-worker init: true user: "1000:1000" - gpus: all # retirer cette ligne sur une machine sans GPU + gpus: all # remove this line on a machine without a GPU ports: - - "8973:8973" # joignable par les cartes distantes (LIDAR_GENERATION_URL - # et LIDAR_SOURCE_URL pointent ici) + - "8973:8973" # reachable by the remote maps (LIDAR_GENERATION_URL + # and LIDAR_SOURCE_URL point here) volumes: - # input/ en écriture : l'API y télécharge les dalles IGN manquantes + # input/ writable: the API downloads missing IGN tiles into it - ./input:/data/input - ./output:/data/output environment: @@ -33,34 +35,34 @@ services: - LIDAR_INPUT_DIR=/data/input - LIDAR_OUTPUT_DIR=/data/output - LIDAR_PORT=8973 - # Les générations lancées depuis une carte distante utilisent le GPU + # Generations started from a remote map use the GPU - LIDAR_GPU=1 - LIDAR_WORKERS=auto - # Workers par GPU bornés par la VRAM libre au lancement du run - # ((libre − réserve) / pic d'un worker) ; l'excédent tourne en CPU. - # Pic estimé à 2048 Mo : à ajuster après mesure (nvidia-smi pendant un run). + # Workers per GPU capped by the free VRAM when the run starts + # ((free - reserve) / per-worker peak); the excess runs on the CPU. + # Peak estimated at 2048 MiB: adjust after measuring (nvidia-smi during a run). # - LIDAR_GPU_WORKER_MIB=2048 # - LIDAR_GPU_RESERVE_MIB=512 - # Une ligne par worker : BLAS/OpenMP mono-thread, sinon 12 workers × N - # threads écrasent les 14 cœurs (load 68+ observé pendant les runs) + # One thread per worker: single-threaded BLAS/OpenMP, otherwise 12 workers x N + # threads swamp the 14 cores (load 68+ observed during runs) - OMP_NUM_THREADS=1 - OPENBLAS_NUM_THREADS=1 - MKL_NUM_THREADS=1 - NUMEXPR_NUM_THREADS=1 - # Protéger l'API si le réseau n'est pas de confiance : même valeur que - # LIDAR_REMOTE_TOKEN sur chaque carte distante (sinon, laisser commenté) - # - LIDAR_API_TOKEN=change-moi + # Protect the API if the network is not trusted: same value as + # LIDAR_REMOTE_TOKEN on every remote map (otherwise leave commented out) + # - LIDAR_API_TOKEN=change-me command: python3 -m uvicorn lidar_pipeline.mapserve:app --host 0.0.0.0 --port 8973 restart: unless-stopped - # Traitement ponctuel des dalles input/ (une passe puis arrêt) + # One-off processing of the input/ tiles (one pass, then exit) process: build: . image: lidar-lidar container_name: lidar-process init: true user: "1000:1000" - gpus: all # retirer cette ligne sur une machine sans GPU + gpus: all # remove this line on a machine without a GPU volumes: - ./input:/data/input - ./output:/data/output diff --git a/docker-compose.yml b/docker-compose.yml index 51f7aca..6c2af25 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,16 +1,18 @@ -# Lancement du pipeline LiDAR — TOUJOURS via docker compose : -# docker compose up -d --build serve # TOUJOURS --build : le code est baké dans -# # l'image, sans --build l'ANCIEN code tourne -# # (carte + tuiles XYZ + API sur http://localhost:8973) -# docker compose logs -f serve # journal du serveur -# docker compose down # arrêt -# Traitement ponctuel (sans serveur) — --build pour la même raison : -# docker compose run --rm --build process [-r 0.2 | --force | --file ...] -# Jupyter (opt-in) : +# Running the LiDAR pipeline - ALWAYS through docker compose: +# docker compose up -d --build serve # ALWAYS --build: the code is baked into +# # the image; without --build the OLD code runs +# # (map + XYZ tiles + API on http://localhost:8973) +# docker compose logs -f serve # server log +# docker compose down # stop +# One-off processing (no server) - --build for the same reason: +# docker compose run --rm --build process [--force | --file ...] +# (any argument replaces the default command: repeat +# python3 -m lidar_pipeline /data/input -o /data/output ... in full) +# Jupyter (opt-in): # docker compose --profile interactive up -d jupyter services: - # Carte + tuiles XYZ + API de génération (mode ./run.sh --serve) + # Map + XYZ tiles + generation API (./run.sh --serve mode) serve: build: . image: lidar-lidar @@ -21,7 +23,7 @@ services: ports: - "8973:8973" volumes: - # input/ en écriture : l'API y télécharge les dalles IGN manquantes + # input/ writable: the API downloads missing IGN tiles into it - ./input:/data/input - ./output:/data/output environment: @@ -29,21 +31,21 @@ services: - LIDAR_INPUT_DIR=/data/input - LIDAR_OUTPUT_DIR=/data/output - LIDAR_PORT=8973 - # Les générations lancées depuis la carte utilisent le GPU + # Generations started from the map use the GPU - LIDAR_GPU=1 - LIDAR_WORKERS=10 - # Machine de traitement pour une carte distante (Raspberry Pi) : - # décommenter et définir la même valeur en LIDAR_REMOTE_TOKEN là-bas - # (protège /api/generate, /api/preview, /api/stop). - # - LIDAR_API_TOKEN=change-moi - # Réseaux autorisés à lancer les générations depuis la carte (défaut : - # localhost + plages privées RFC1918 ; liste de CIDR séparés par - # virgules, vide = tout autoriser). + # Processing machine for a remote map (Raspberry Pi): uncomment and set + # the same value as LIDAR_REMOTE_TOKEN over there (protects + # /api/generate, /api/preview, /api/stop, /api/queue/clear). + # - LIDAR_API_TOKEN=change-me + # Networks allowed to start generations from the map (default: + # localhost + RFC1918 private ranges; comma-separated CIDR list, + # empty = allow everything). # - LIDAR_REGEN_CIDR=192.168.1.0/24 command: python3 -m uvicorn lidar_pipeline.mapserve:app --host 0.0.0.0 --port 8973 restart: unless-stopped - # Traitement ponctuel des dalles input/ (une passe puis arrêt) + # One-off processing of the input/ tiles (one pass, then exit) process: build: . image: lidar-lidar @@ -60,7 +62,7 @@ services: profiles: - process - # Exploration interactive (opt-in : --profile interactive) + # Interactive exploration (opt-in: --profile interactive) jupyter: build: . image: lidar-lidar @@ -70,11 +72,11 @@ services: ports: - "8888:8888" volumes: - - ./input:/data/input:ro # exploration seule : pas d'écriture dans input/ + - ./input:/data/input:ro # exploration only: no writes to input/ - ./output:/data/output - ./notebooks:/workspace - # Pas de token vide : Jupyter en génère un et l'affiche (URL de login) - # dans `docker compose logs jupyter` — le port 8888 reste protégé. + # No empty token: Jupyter generates one and prints it (login URL) in + # `docker compose logs jupyter` - port 8888 stays protected. command: > bash -c "pip install --user jupyter && \ python3 -m notebook --ip=0.0.0.0 --port=8888 --no-browser \ diff --git a/docs/DEPLOY_WEBAPP.md b/docs/DEPLOY_WEBAPP.md index 8db06b8..cb93e7b 100644 --- a/docs/DEPLOY_WEBAPP.md +++ b/docs/DEPLOY_WEBAPP.md @@ -135,10 +135,10 @@ tiles and maintains the pyramid at low priority — see `docs/MAPS.md`, section ### 3. Generating tiles from the map -The **+ Zone** ("Add area": draw a rectangle → IGN download + run on the -worker), **⤒ Compléter** ("Complete": already-downloaded but incomplete -tiles) and **↻ Générer cette dalle** ("Generate this tile": info panel on -click) buttons are hidden if: +The **Generation** tab (**+ Area**: draw a rectangle → IGN download + run on +the worker; **⤒ Complete**: already-downloaded but incomplete tiles) and the +**↻ Generate this tile** button (Tile tab, after clicking a tile) are hidden +if: - the browser's IP is outside `LIDAR_REGEN_CIDR` (default: loopback + private RFC1918 ranges; a comma-separated list of CIDRs, or an empty string to lift @@ -150,7 +150,7 @@ click) buttons are hidden if: A request submitted while a run is already in progress is placed in a **queue** on the worker side (an in-progress job is never interrupted); progress is displayed tile by tile (orange/blue/red frames on the map) and the -**Arrêter** ("Stop") button sends a SIGTERM to the pipeline. At the end of the +**Stop** button sends a SIGTERM to the pipeline. At the end of the run, the map refreshes and pyramid maintenance resumes automatically. ### 4. Centering the map on the GPS position (phone) diff --git a/docs/GROUND_CLASSIFICATION.md b/docs/GROUND_CLASSIFICATION.md index 823b76d..2380aa6 100644 --- a/docs/GROUND_CLASSIFICATION.md +++ b/docs/GROUND_CLASSIFICATION.md @@ -54,7 +54,11 @@ the reference tile above. bundled in this image** (`filters.ground` / TIN missing) — would need to be added to use it (or via lidR / a custom implementation). -## B. Fast hybrid (chosen for implementation) +## B. Fast hybrid (original plan, only partly kept) + +> Only step 1 below is in use today. Step 2 (lowest-return floor) was +> dropped and step 3 (`_interpolate_holes`) is no longer called by the DTM +> builder: see "Synthesis / decision" for the current gap handling. **PTD / Wack & Wimmer** principle (Wack & Wimmer 2002, *ISPRS Archives* XXXIV/3A:293-296: DTM from lowest return, excluding the lowest 1% per cell @@ -66,10 +70,12 @@ to discard outliers): *measured* ground where the vendor failed (rock outcrops, clearings, forest floor). 3. **Topographic inpainting** of the remaining gaps (terrain-aware - interpolation already implemented in `dtm.py:_interpolate_holes`). + interpolation, `dtm.py:_interpolate_holes`, still present as a helper + but not called by `create_dtm_fast`). -Expected: **continuous** DTM (0% holes), robust in forest/relief, -**~10-15 s/tile** instead of 326-355 s. No GPU dependency, no training. +Expected at the time: **continuous** DTM (0% holes), robust in +forest/relief, **~10-15 s/tile** instead of 326-355 s. No GPU dependency, +no training. ## C. AI / ML models (supervised — require labels) @@ -115,18 +121,21 @@ deploy. ## Synthesis / decision - "Fast" hard constraint + low maintenance → **fast hybrid (B)** - (~10-40 s/tile, zero training, zero GPU). ← **chosen approach, IMPLEMENTED** - - Base = IGN pre-classification (fast, ~10 s). `auto` prefers it as soon - as ≥ 20% of points are classified as ground (threshold lowered from 30% - to 20%, since the DTM is subsequently completed — see below). + (~10-40 s/tile, zero training, zero GPU). ← **chosen approach, base + IMPLEMENTED** (step 1 only, see below) + - Base = IGN pre-classification (fast: ~5 s with the direct laspy + extraction, vs ~13.5 s through PDAL). `auto` prefers it as soon as + ≥ 20% of points are classified as ground (threshold lowered from 30% + to 20%). - **This gap-filling note is superseded**: gap filling in the DTM is no longer a distance-based `fillnodata` pass over small holes. It is now a morphological closing bounded to the point envelope (`_fill_small_gaps` in `dtm.py`): the closing radius follows the local - point spacing (measured over 5 m, staged at 1/1.5/2/3 m), nothing is - extended beyond measured pixels, and islands under 1 m² are removed. - Large holes (dense forest, steep relief where ground is - under-classified) still remain as nodata (black in the renders). + point spacing (1.5 × the spacing measured over 5 m, staged at + 1/1.5/2/3 m), nothing is extended beyond measured pixels, and islands + under 1 m² are removed. Large holes (dense forest, steep relief where + ground is under-classified) still remain as nodata (dark grey in the + oriented relief, hatched in the PDF export). Deliberately no floor at the lowest return: under dense canopy that return is vegetation, which would print trees into the DTM. - Maximum quality in hard cases (steep + dense), ~1-2 min/tile + GPU + diff --git a/docs/MAPS.md b/docs/MAPS.md index 0c6fd65..db7a5d0 100644 --- a/docs/MAPS.md +++ b/docs/MAPS.md @@ -20,17 +20,17 @@ docker compose -f docker-compose.maps.yml logs -f maps ## Interface A **single tabbed panel** (`web/map.{html,css,js}`) groups all settings, -replacing the old stack of stacked blocks: **Affichage** (Display) (main -layer, relief/precision mode, basemap), **Export PDF**, **Génération** -(Generation) (hidden if the generator is unavailable or not authorized for -that browser) and **Partager** (Share). On desktop, the panel occupies a +replacing the old stack of stacked blocks: **View** (main layer, +relief/precision mode, basemap), **Tile** (the selected tile's card), +**PDF** (PDF export), **Generate** (hidden if the generator is unavailable +or not authorized for that browser) and **Share**. On desktop, the panel occupies a fixed column, collapsible into an icon strip (**‹**, always usable: clicking a tab redeploys the panel). Below 720 px wide, it becomes a **bottom sheet** with three heights — closed, half, full — changed by dragging the handle, by simply tapping it (one notch), or by tapping the already-active tab again. Clicking the map **selects** the LiDAR HD tile under the cursor (dashed -outline) and fills the **Dalle** (Tile) tab (footprint, IGN info, pass +outline) and fills the **Tile** tab (footprint, IGN info, pass alignment) without changing the displayed tab; clicking the same tile again deselects it, clicking another moves the selection. Keyboard shortcuts: **1–5** (panel tabs, no effect if the tab is hidden), **P** (next display @@ -42,13 +42,13 @@ browsing). ## Generating tiles from the map -- **+ Zone** (Génération tab) — draw a rectangle: the 1 km LHD tiles it +- **+ Area** (Generate tab) — draw a rectangle: the 1 km LHD tiles it intersects are downloaded from the IGN geoplatform and then processed (0.2 m, options below); successive zones and clicks are additive; -- **⤒ Compléter** (Complete) — all tiles already present in `input/` that are +- **⤒ Complete** — all tiles already present in `input/` that are missing at least one of the requested layers; -- **↻ Générer/Régénérer cette dalle** (Generate/Regenerate this tile) (button - on the tile sheet, Dalle tab) — a specific tile, even with no existing data. +- **↻ Generate/Regenerate this tile** (button on the tile card, Tile tab) — + a specific tile, even with no existing data. Run options: target layers (default: the panel layers) and forced regeneration. Ground classification (IGN, ground only) and edge stitching (a @@ -75,7 +75,7 @@ assets (`LIDAR_SOURCE_URL`). |---|---| | Projection | EPSG:3857, OSM XYZ scheme (north-west origin, `y` toward the south) | | Canonical URL | `/tiles/{layer}/{z}/{x}/{y}.png` — 256 px, PNG RGBA | -| High-density variant | `/tiles/{layer}/{z}/{x}/{y}@2x.webp` — 512 px (internal interface) | +| High-density variant | `/tiles/{layer}/{z}/{x}/{y}@2x.avif` — 512 px AVIF (internal interface; png/webp also accepted) | | Zoom levels | 5 → 19 native (0.2 m/px ≈ z19 in France); beyond that, client-side over-zoom | | Outside coverage | fully transparent tile (overlayable), header `X-Tile-Empty: 1` | | Pending (cache-only mode) | transparent tile, headers `X-Tile-Empty: 1` + `X-Tile-Pending: 1`, never cached by the browser | @@ -99,8 +99,8 @@ Discovery: `/tiles/{layer}.json` (TileJSON 3.0.0), `/tiles/wmts.xml` - **uMap / MapLibre / Leaflet** — same XYZ template, or the TileJSON. - **OsmAnd** — online tile source, XYZ template, max zoom 19. -The **"Utiliser dans JOSM / QGIS"** ("Use in JOSM / QGIS") button on the map -shows and copies these URLs for the selected layer. +The **XYZ imagery background** section of the map's **Share** tab shows +these URLs for the selected layer, with a **Copy** button for the XYZ template. ## Full pyramid pre-generated @@ -129,7 +129,7 @@ off is picked up on the next scan. ## Tile sheet and compass rose Clicking the map selects the LiDAR HD tile under the cursor (dashed yellow -frame) and fills the **Dalle** (Tile) tab — name, Lambert 93 footprint, then, +frame) and fills the **Tile** tab — name, Lambert 93 footprint, then, if the tile has been rendered, resolution, generation date and vertical pass alignment (beams, offsets, line correction) — whether it has been generated or not, without changing the displayed tab. IGN information arrives @@ -146,9 +146,9 @@ carries the local relief (light = bump, dark = hollow). ## Display: relief and precision -The map serves only the layers in `PANEL_VIZ` (`index.py`): the **relief -orienté** (oriented relief, the main display layer, which merges local -openness and slope orientation) and the **précision** (precision) layer +The map serves only the layers in `PANEL_VIZ` (`index.py`): the **oriented +relief** (`relief_oriente`, the main display layer, which merges local +openness and slope orientation) and the **precision** layer (`densite_sol`: density of the ground points retained for the DTM). Other visualizations present on disk are neither listed nor served as tiles. @@ -156,26 +156,26 @@ There is no more layer stack. The panel offers three modes, one click each, or the **P** key to cycle to the next: - **Relief** — the oriented relief alone; -- **Précision** (Precision) — density alone, in 16 shades of gray (fixed log +- **Precision** — density alone, in 16 shades of gray (fixed log scale: level k starting at 0.25 × 2^(k/2) pts/m², black ≤ 0.35 or no points, white ≥ 45); reads as a geometric-reliability map; -- **Comparer** (Compare) — a slider (mouse or touch) separates two layers +- **Compare** — a slider (mouse or touch) separates two layers chosen from two menus (relief, precision, or bare OSM background) on either side of the cursor; the same layer on both sides adds no split. -The Affichage (Display) tab also carries a **relief intensity** slider +The View tab also carries a **relief intensity** slider (0.5×–2×, 1× by default): a comfort contrast applied to the displayed layer's container (CSS `contrast()`), remembered and shared in the link (`&I=`, written only if ≠ 1×) but never fixed as a server default nor applied to the exported PDF (which keeps the standard render). A -collapsible **Comment lire la carte** (How to read the map) block reuses, +collapsible **How to read the map** block reuses, for the displayed layer(s), the reading text from `VIZ_LEGENDS` (also served by `/api/map/meta` and the TileJSON). The precision legend (16 levels, tooltip in pts/m² on each level) is shown as soon as precision is visible, either alone or on one side of the Compare -slider. LiDAR layers live in an **isolated** container (`isolation: -isolate`): the slider only splits the LiDAR layers, never the basemap. +slider. The slider clips only the LiDAR layers (a CSS `clip-path` on each +layer's container), never the basemap. The share link carries the main layer, the mode, the comparison and the intensity: @@ -186,10 +186,10 @@ ignored) open without error, in relief mode. ### Freezing the configuration -The **★ Définir par défaut** ("Set as default") button saves the current +The **★ Set as default** button saves the current display — main layer, mode, basemap — to `output/.map-defaults.json` (never the intensity, a per-browser comfort setting). Any browser with no local -setting then starts from this configuration; **↺ Réinitialiser** (Reset) +setting then starts from this configuration; **↺ Reset** forgets the local state and reverts to it. ```bash @@ -205,7 +205,7 @@ the old stack (`order`/`on`/`blend`) is ignored, except for the basemap. ## PDF export (field print sheet) -The **Export PDF** tab shows the settings (A4/A3 format, landscape/portrait, +The **PDF** (PDF export) tab shows the settings (A4/A3 format, landscape/portrait, scale 1:1,000 to 1:10,000, optional title) and, while it stays open, a **dashed yellow frame** showing the area that will be printed (it disappears when switching tabs). The frame is **anchored to the terrain**: it is @@ -214,11 +214,10 @@ position if it's still visible), the map zooms to show it in full above the panel, and one can then navigate freely without it moving. It is moved by dragging its **✥ handle** (mouse or touch); on release, the exact Lambert 93 geometry is recomputed (`GET /api/export/frame`) — a release immediately -followed by a click does not select a tile (300 ms guard). "⌖ Centrer ici" -("Center here") brings it back to the center of the view, "⤢ Voir le cadre" -("View the frame") zooms onto it; changing format, orientation or scale +followed by a click does not select a tile (300 ms guard). **⌖ Centre here** +brings it back to the center of the view, **⤢ Show frame** zooms onto it; changing format, orientation or scale recenters the view. Settings and frame position are kept in the browser's -`localStorage`. **Exporter le PDF** ("Export PDF") downloads the sheet (`GET +`localStorage`. **Export PDF** downloads the sheet (`GET /api/export/pdf`), named `relief_{x_km}_{y_km}_1-{scale}.pdf` (Lambert 93 center in km, to three decimal places). @@ -245,8 +244,7 @@ full image and on the Pi's lightweight image alone. Contents: - a **quality panel**: a thumbnail of ground-point density (50 m cells, color classes), key figures (average density, weakest cell, share of interpolated area, acquisition period), areas **hatched in white** where - quality data is not available, and a "**Donnée manquante (sans relief)**" - ("Missing data (no relief)") line listing the tiles in the area that + quality data is not available, and a "**Missing data (no relief)**" line listing the tiles in the area that haven't been generated yet; - a title block: title (by default, the list of covered tiles), scale, format, dpi, L93 center, area size, export date and IGN source mention. @@ -376,7 +374,7 @@ environment: |---|---|---| | `LIDAR_TILE_BACKGROUND_MAX_Z` | native (`18` at @2x, `19` at 256 px) | maximum level maintained in the background, URL numbering | | `LIDAR_TILE_BACKGROUND_SCALE` | `2` | tiles maintained: 2 = 512 px (the interface's) | -| `LIDAR_TILE_BACKGROUND_FMT` | `webp` | format of maintained tiles (the interface's) | +| `LIDAR_TILE_BACKGROUND_FMT` | `avif` | format of maintained tiles (the interface's) | | `LIDAR_TILE_BACKGROUND_PAUSE` | `1.0` | pause (s) between two renders — the discretion lever | | `LIDAR_TILE_BACKGROUND_INTERVAL` | `120` | seconds between two tile scans | | `LIDAR_TILE_BACKGROUND_QUEUE_MAX` | `65536` | bounded queue — each tile remembers the first pyramid tile it was refused for lack of room and resumes from there on the next scans, until its whole pyramid has gone through | diff --git a/docs/img/neuf-brisach-a4.png b/docs/img/neuf-brisach-a4.png index 0fc2e21541d8e974565c2582fb856f52de568a45..e2bf9612bcd21b41d807359ad0bea43f1ae3d3f7 100644 GIT binary patch literal 750361 zcmc$F^;erw(`}HJ;FQwh?k>gMwYU{`cZc8<*FtfZ0tE^bcPmi5xVt-{xaU57zwcf5 z{s;Fge#i>RlOr>G_UxGxrJ^K*jzWL}0)f!wWF^%=AcPMf5WEB!9(d1&Q3yP0T|YC+Cqa)l5KdV~9Zfr#d0XGI7YIZl6?9C!7vpIoFWxY|(LJ|)e2cI+pV z3EzGz_dT8|?cDe4Lb~!N1^;(=6M|l)k^Oh5Si=2x1aqMN_cO^lqW>NFqwxP77VokC zJLu|y{&$FGyh8l%7-sta@>uZyo$miLTloJwUAj7+Fz91fcPZgvC-gR+2V>3LL8NJq zryMrMd4-w>6`9&yUAbIV+G(J@R$l4-pOwMJ;MQ{!49741)+5LUFWb9L>A;Rp$RYXr zK4jpVZwP3;z_VWb4ESnQZ7J*aeb~^t8Yj`2r|iy{uNOU5#|%!3?cK2vd*U3Oh_3z| zG%7pUd0iGSWS=&w5msJtIDKn(%=zD~cT!%H#8~Oe1*Q#hxHDRqI1EA59wY6K0`Jv=NA{pjnFDqqZ~UG=^E zVVe}T;IV2p5RV*k-p?BFcf{zWmJA$1=J$MT1k38WClteC(QkI%>O-FQ5E>V7+l#f( z>G8+@j}@IOBRoX}-bKKA1tve-%p6}^<@w)q2P4F9XY+d;%~k3Nj^_z@IeL2D?2TnL zIv92O-2*fKMi;%^3@jpo4b6)`N88B%TEXaH>gD;-!{FZ!W*M}3K5rn2Z1@Ctcz9S? zSU@1Hx|PDuSJQ=b4AHJPCpu`ooQl4O#c8>|XDw}Kt*BCyAFTf1pu9p9!;zv-k>4NB zGt$@BH!>REbsZOhJLrolsJdfOfSq_qKmKGgSK#tFLZcczN1KS?D?$`j~3L%);_#eB3v; z^!NcY;2dGOv2M}6x__-dBP+}IZ$GYC&BEbyDK0MV+o(R}fQz@PI8JNri?$7T;XZpA zRzw5rikB_>xt~q$t`4V%%#)~w{DiB^kM1w`QNw<1Y~&Zx4J44>`okEF?uXCM&w;tk z&ClPSE~hD#!h!BKF$2M36KAV!X=!P!2Cen=^~qzFBfA&-BCva}uE*8t2G-aAZ-iXZkNM+~kr7l>)UM~{F8`w$`cwV+7bfbU% z1RO|^mTOgvSzZn%QsPLpRH62s0}C)1aB(*c_K80SBZQ2#^KR=irZ8Rf*5B;`^)j63 z!u7|s+uFsGi;G$lyh^PKtqR~dhieceMv7;$aVYhjn%2Q!`t$JuvVIMM+9UmVT*|c_b!S46- zXys~~&PO;E!%gtQ$>lBphxqHi?qQHb#ie*`0TNSDP44i$)na&OFpo(p+-^5tMJ(Xy z&QBadc61G?)ItD(!c9WR=H}+WA>M%19$!N!5_vt2X5t8WrVi^%Y$PNkyjENW5-DZy z!c}ozNli*bU>LNx7SGy-iIamvSPWWc?CO_Klc=H!znkE3DvDf9NW^bjX98P0QVRm* z)A6&h1r>fjZtYlm=u993qxHsb6AAnAW{s_Rt^0SpO&Hh)78fmD1T1cTt;1JJwcY&? z8w9F4=8t!~I+%=#ih^{kwf$mbWPH4Z1_D!rwn2r(uyTF&@HI7+a|Hni%^S0{(0Mu1 z?&22~R+@INm{r5s-5L5?tcDEMhXXc!jlYRcw}Tq9eEwQu>7>G4PqUi&dTH2+kpv5C zVKgAM2Mq)YAv4CC<7CE;LPJ9{#%lzCv!;eUcOUR+h7uo>-0W;WsPB5#_C|1?TyF~OsJ`vLIRajW z?cRUSH+#Q+{R#pBKvFynLU_;flD-_)CqCc)Nr-wWHAqt3Szff7P zuCE=I8_~l};DnF)@jZeXUeR6RTP5k}+=c^2I_xa-0D`p`f z$h|+C+$n%H9V<@0oY;qnZ!XlB$;1=kPSo@wwbR(jGbou9dt%&+0c$FSGrx=Z&m9Sul)12c|*uRAZtzna0swwqtO-}0=pl)?#A&;lKzdb!- z@!OrS=YIiFFl{6Ui0exYb_FU2Q^g7ZU{T6ljAncQcCL=e&e5?-g>IoSXJl6?SMVNS zHgKSzZEs$pHRtRT{NKJJTVq;Rak#wew}2UPbF^~@d~zB*7fjf{KRi5?rK-Jma4N#y zKtH*uZa8(qsH)NNbh?5=6r1-T2SZj_-~vVFeoM>7|F6M_V)@-HTKR4tO)HBSRLq8l zhubf|EX{X%UhXM|kmUwE95ys?EjK0*3p6%2^Kx*gv82H+SYa0v1rk6wTYuW)@j6|4 z)q76*JV}Zl&d$&OFdz6l-@#)(e)(_mPnYBKwhe&UfN)WxUZrFO`cEAf^fSupo&oR^x8p z4^jcr;XKp&tmDUfXe3B5PEn`4M}TB5E-nI7MeE($+tbq4_GQejGVEyefArMUB#isr ziz(u_{TqGWqse~J6^KU}85#O4UNzKfdE*z{~`H*W-xA>0% z0Jfd+ks!RLzCLuDH@Z+=UH#DgUo-=J7wXvt#OZ}j|Hr$#yAjr|b|945bNd4S&E1UK zZU(SJnj$gR{BUv87pYs>EdBZ{16@EJI-QFb!d-Jep37XRz2ku^x}vqy7|uPvsIVBB zS;ObQt#r&aW9ROM-Zb0QlC(jC3v=^dtxzXO+Q-WgVwt zbyd}x+qh74p+?2*YMa;i*qBG#Dz2e-!7Z5A^CaD2xx+*y=^H>%0Smp_BE4qlg1tNf zP+7P51N!*k!-piQF!6$qG#_|*z4t~l_VWS_u|hjLJ9l??Asx9&rJ9=l*R$Hb+v)p0 zNmPnTO7RH^uwN*>F4?=g7E-F*N-a%=O}DLUS;j6zr95VJ_eF+Vdm_H-?ER*Hv6BnOXBfMN!2HSHp{ANFr=8`{pK74_G109WBu5(ZP)dlCt#Zg1QJ!% zzzR)CNiia8p3fqM4|#Al(F`ccw{mJtBi)VxGsb`zW(od-wL0;6LH%crA!c1tC;P4+GVXMZ&gJGhtLAZ>UZb7@%Ba;bm4g* zsT@y*9d+9Q^IB{gFvG#d#>Ue#weUN@h`*O-ex&g* zXmWTYhI-4CPV@QRFpbo9l&j!$0QTH|U>;URnT3KO|2rhicT5a`+F-bS)z#nZu z0?7Z$OChFMCv-g!_6!06j1MndaheLeb+J1_2F?}sUvkL?ScKo9f)V7TX23Auem9H9 zDZF=+QYPLy^X8;({A{6yGDThppr;*NedXlxZ=JNZ=d1x(a?E=m*t95>x?SwZ zq4ic7w9OH&O&?x`q2d-!T6Y+BxgVm=!>ZPVV5ES3 zuYd@EOwL!s9)Lfy1fiRjasRWU*@|6PA9Hi_ZN7zLHRyez%~C1wO#mr<0doE}@2+oO z__oDQIPhSi!0@${s_@?^WpK#36YR8W*5mmy4<;DDeGU2d;;9M1aaO-gRH#4H*I@p6 z3%84xi|e{f*&oP=U}w-5M<=DSCJh3_p00 zlkrPVMG4g_f%W@8OwO6Wp(xKs2Pw&bkLastT(g7VZojUt(_1`(IGj_iQaqQ+13#fZo-+RsHsUU z$M8O;6Ka<^=h!5rI^)qXYg<-+^w{aJ47exYvzh;qg6>*yVx)T6K2Fy&RqPj^wN_Ed zjag1}j@dRW**2_w|6!ri(O;Wt;h=OvY@Inrc;hSK4vpG)d^tKQFR=+XVPa*y6<&&E z8tG_G=*V2h?kJV3)LI6Ttqghy9lC{#m`lYU?$U$X!o&clT`vz9-XlQ7J9~Z}k?{~fesTttUL<9s6SEV9C+}t<7*&cZX z-g-fSY+M9(DN<_l0OXQ~Ig?J$b55JQFQXsE+b?sVemjXWB!N$VpC50#0Qd#6G(iBp zfVlt>Y#zwWGsgXBz7F}_1KP=`m2e%f3;@86ozE{{1`vGohWgfA?{be7$D@)8=|CWe z%Ml!C!>7}Wjg4(W0FQ|1LLb z9Pd!BR{|ldavcr#0Ax!T=5Z78a_jSOa~qsiVyv9gES^NY_nv?Kgn8fMI2yX++7fpa zH<@LzxMrLsU(9WZ%+n~fcGrKyWR-=-Rb9r_N}hF@-6yj236Yw39vQj^I8NDGejPWMBqUi01zbzKOFc1 ziMf;CHesn!&KB?4*Sx14fSBL`;=?(R`qX@~cXr0=Ws^&~fv&^)-YRDc`luy+`@{rj zSCBpSBq~zK0r~hPkcD0Wru2kBde@EHc^($W#fKOETo-sVP6C7uKz;cNoEH%xArP!` zl#m8o@WS0%^b1rbIO7VxN02}wP0}?O-o^Ao68;#^9gxmHJ$Zfz?>f_dX@x^rKQO*T zI~*q#4)By0?OqNZ!yqEWpzbaa(&Q--cf4E%o9lGLzT_Q`gBQ=2M0gCd09mpe-EQPnodJ%+1Wa@E5_3 zawg*8=hvmfkyN#BS_UMl+q2dAY9qifVV6+9eF34IoyQl}=PA~)@p0HD>5GYz!77lP z|D)%DfLtfydt>jE@Lm^&yq$wpkrWg z3WY-D*uf!?nhzDTw&$oY+Ktn9T-#P68HPN&4M?zOkJpIp{tFA7KpE50H)MpKd8&ikw`Qz|wxs>;TurH4vNDyIo z+dj(fH}F=F+z69}uBS9u?W&_utNS5<&Fg?xsERYTe+ir?Vo%^L^d+b2xVrP<=pW<) zKKhl)=k9z{g$~G(NqtWMxz7`zPe`PG=LHcYnd#|(m@kGELZ*Uq+Q1nuUS1bKUf(JUvU78%DwSdq@dj<*0g#75D!c+P zXOrG8Ana3PM_~ru^*-L5>gnpLXd0?YAQTSVoUk5OXd;%W$lz2sh>%?F&$ySC^9 zDvR@mC>_qf;0qyn2fz~W@kbLp5+J+m@bx-Zc#-K+hnG+VZ0>8W&q;;Rvu%eV>~#I* zv^wCrf-d^z`dTjOn~g5b*QkC|K$4sRyoSVQClQcuV+!enU+%W8#&aDSbX)ZQc&thn zy@`_+IS-xlG4WWXEGl zHypQ5Lm<$>X_Wo4Cv=)5i#Ehp$-W~~3~Pl5T-nrJuPwpqxVXpfiu zDEMKc^sl7vy|2*9%6Ocx{mlFG1axeDKvZb@fFpIiro}u`K7SltxN~`5P(Ut*1*BNU zcuG{*wM>8nvCbBoW)z^KIjdVacj;a>Ya1NnE7~o>lqG~6l=qN*J%eyL7ON=(K?q6sJlHUQ5WvW)>gshshAA%xqUIY=&_5ykV6up4 z!2fTIksrXNPaj_b9|4{MpsbZMIs*L5Q1cieC)oxr*(a<2DdU`%EVSd;yJ=*`T^SjF zy~tZ#(OZSKYnxyGux4EeJYRh^e1iLg{Nm;Q8@4)ag=G3~$qe%z`z3h>6 zIy%7uw#JW!#=qNcD+j7mZ>)QOu7E0+-?^d@5-CWud)+V0$Zad|k^U!r?>aO$(6^!E zMyzX|6voxyP~HbSj9Lj8cG`OAT71Zy6}Y$e2Kf6p8gx$^&Bor z`edUVKw$9P_!nX}v-YI1AnOyOWEk5Ja%f>i(7vxselV<${8Go zDZ$Q4kJbaUVfA^Pm_dZvB#41)KX1IOP(n7wVQK+?L~k)KChi_T&yGJYtY3A&k=O?UoEo6JJGD9J5Ftz|uT%=VtlI)H`(MB6@8BCwKqyD`jY*R`do z)g2H{IuhIsL_ALxBrt_=nBF|*fp<>-#vqAed3#m{Jnt~#8>xchuU8vcse`}U+My4| z{Q88=Mj$LTwb6g^P%nd@K|b%s(BQdLc%i|#*ebnnMDWhYJgx9c zJ~@1DT%PTdIlHd?O5*CZgaUz6TLEX=o(Z^F+WIKnKKQTxqOQiIOvR6Rl}ec-qrZ3<%=TJ2p{hutE9PDAI=|1 z2FcvsGSF&6ON2Fg3=w@cnZw@B!=2}Fb&K3Dlc-q`2Oihy1fNKNmghNKs2{4&qdb5; z#E?uw2KIE4B<~A)js2-ab}oryt3ab)6$xaA){hu@5Tr7w$=af-o%EW$!!&I~-g+g> zpvlg?BY5fvOSlkMRR|7Jb?StyLhY9JqXsk=DB)7pKrvVbZZ^@4%dZ`$^@No_W-k_$75*l+;nJSv7 z@7@KghlZb~b#Mam#Q$I@M&C0cxh{TA5RC3+6T^y={=CggH1JN!#URZ>XWoN(gaQnY z*yGtoj1ln$@eLweFI#2_wH&L(s$gLbW;^o8ySl0faqVpSXjxQ!NEBm1=Id|D3;3J3e* zx*6|dhSm6vrt|Qys@#$BQ zsZ~Dbm9=zhUz^>$p(aEUvPq5&OQ{ZtROpoFm#o69viH__H$?S6!U|0csm$Ule`1YE z;rF%BtYv3K$7?0&&6#`EYsSHIkqgdYOEHmzee5-V(jrEL6NF2uiayJx3Uu8&k)+|` z`$BdotJl!zKy09E(B^VsZUI8C&S_Hf%I$ktpJeC%LbW}K!tb6&VV-pQj{gnU$4Sd2 zYf9S%13G~tSw#x*U+*`|Qf<7*o6gFR#n{;mxfg{uYq!5QR^Q`I{l@E+z^>(>OXo6@ z9dyR~!+{Cy+|`s*KS! zwi5qDv!k3ZN4+=LO z2{b*(cHvVqvAWL_dnuFNTdZGp^Hgd>+(Hx-6oAS)P-AXlGzqG*2vpilAP@*pPyCnd0`f1>U{1H?&D_D*9Bf_WZjBW78|GpRB`&uw;VVDQ_=)-f zJaKKX)abWf_fffJlUiF{PPi@~O`d?7Ya z@7L|JfrW|NDvu{_A1g{+8Uy#mWSR{H6bTNlw;Zr(Hpa`|XUrdK*|E-^14(!aX?juO z*>($CwqnS=UxtTLa1CmMTDnT8v7dRaXJaMnT9QM38-Hr`dXG|k#8V|Q1=SEhc#g1$ zP(BDQQ{_i*nFNte+P(?3qqs3%Ca0IgXhEMGz56j7!R#`5v^JH`{8n~h>xAGnD3!5{ zSe#=Egr(&DE{|Jqlv5W6NAVsZW8-q6~#&MOsN28GaS~O;{_$fed!DHu)GA zQx-a_8!t{3q>4=(eaAfV_SLIWVv)D;yD9Gx9zYRC&eE?clTXtqp`@;g;Dr=l4i zO*BPxA)=UfZc}?ZAZSx0Mp6L+pePnqG=-EZUO0U;dl^OWL@ML~ zmk=_lg3G7bFn#{IHdgy)vJsA$ruTn_IHH{eDl8W2beX=Vf2-UdIFO_cGlj>pI;bIj z1YxP*gcZ`ENih#N&Q^q73%-pS5Ocxj-m0w#n#2oDwo#uN)<9SZ7!bmVJ8Bi%=(~3- z&8i}G(U(pU3jDHtch&e&4vL*>L~D?*4tm47oy6Z;d52du#4E237JZ~iFr&tDCRY5* zUQ}U;z7kLSzS46+MrW1t-J)xQMsnNbAIjRoh0K5e3&knT=x$@uzaXq%Z?O9`BB@kK zB?RA|!%4+Ww@3217Gb|GGWfLn%qHtfzI4UjY)2PPvB*ro!yCp4NtDIS85kD+` z)GMa+h*dhJWgN6eJcX^8Akvf{-=MfEqwtBsxVMEHV=W(oY!TT0Y=qy0OB$@FL%26@``aW!J z8L*?W1-w`iWoK*~fM?|b-6&^mP#QTktWY4m^npMg0I93B%4xk55G)y@fjT5(3QGL8 z@9i0&KL4vZehxAZ9y`GeKF=OHJcM0Y8GUDERgP8C;u2%e=9Swa_K^LFm3z>vU1Oa zhWwMRVcBKz+{-BvuIiyvJgF~h-D+m!U~OJBjSqpN`%-wtK$JbzuW@&QX&kkSjoRWM zYUZ3@tU9y7+$<)OCb$;ilc;f7jOfHw?v-U_#Avuh6RoeziK=1_I>8}K3twg`1!I0* z*>@l;DJ^&;CXNm@%$h`Qnla_mQOKQFnGtrD37{pI_P_sv5>;O2b;`{Gb;}TFMAu7i zvz9xpN=2kg^0>}aq@rL=-isGMtZ3$;tSqUnKeO_JvHNY+5boS{AhCu%^9_W*W1gHM zQjDPX$9?c)4{W+`Vo`Qyk-aQEMcc+@d#!@FI-Oro${(5`&PyKDJiQ?YQ zD#K~mDNcq=Pw}4JEgyV-v)jA8`_b6w!E!w?{gOj^XF0NC2MH}>Al^aF@Py(&*a>d# z;{M8&V-a-gl9zH_(^QEglxV|yKr-Rn8{K8Lw|o4)+T}Iojo->~i?q6`UQkFdS&a!D z^k!$9)1W*c9W}g9Q($}|PDq_jtcz3nW++I;m>NME)Z`zSAG4xc@Zoc`R&Jj$194oLp;T#p%*T0j|PpdLux7b z#&ce6@8!d<`*>RsN~Z{nslR+;B6@@D{_eD}qJg=<+McNjpGKAp?c^=V4yA@RH`RKO zl*)~VE8n`gPl5@ToL2uem(Vyvz@nINU)T%hY3KP$f=&99wF8<3=4}2`-=EX2%OP0B zt;WGBeTj|ZsAD#t8%?5YY<&FMO>P}u7EtyiHs%qD;Es2Ycw{w#ZJu{eJjN@1=0yf| ze`RgIstDU7d3Cp%rNHChkYV<*%n>bAS}Gx)+(C74jv_dVPjg<7T6s9i1_lM$HfvwF}EZr8(2O4-LN%{5Xx z#yJjkG6B1tsymLls&RI;AkKt$IoLL5k&@x#a1|yE_&wOFh$H;NXKVoR%N z`6!59A0IJrD6E$}!dg<&9{R61sxDjKmL^Oc3R5{G`{~%=R%<^KGf>oJzdp#_xMcB6 zQ7jDb`o(wwsW&ysE|L=@lET>)_AeQeaTfG4G~8|-l%y(}%wYHimFXq;{Oekp@Gljj zL(~MZrDeR*=|m#K{s)wgg&rebs9F)}LN~IP;$9SH94XXdFD$%LO_i9b$)|;zi+*Fa zp{+BIn8M8uRSs!{yS)7#st@7CXeeuxWl?p=wB_7;{(a0g=A{Nq?(3_(L8Nj&WDNa* zu1U2;e5m{gYxhSONSSdF zw(;DnXf86eFeokTv*#hl?wht2;zbqSUp1u5D%*i&~Th27^Kerf>=UnwL!AwEt3LZ-_F5<(F?ShR8eBBr7-y|6n(@ z6^V9}OOKq8P-IzbnDK7=LN>%#>@t78lO|C7d?qW?4z1Qbwv zprrc<6u@&bGA2DbZvWH);0;t{=Z~+0gM)#5;jR2r2u3G_D;(h4=@x#H~{x&Y;l$GwX{#efp zyxu90kWp~Jr|c0gNc^^uRLDI{EOC>WsWKNkavJVy$5jchuWluPEnm&};_)s?xp@(P zKZwcjS~K~}@#cG_#5>J`4KFhI82QffENnU*W;rZ-ZHE@3fqs*R%ujHPkQn%32l7|m z{SX;$`(ZaNe&UANgCDrBdNrtuSCjP%e!$mL>!jGe(wqsOi^7xCoc~jwI$D*f-YzxK z*B1T**;2b!Y@(VmwZM~qx7|7%$81O?C;mjBla>oj!m(9pMn%=g@Qt3Kx`&WQ!wS*s zr;;LB*EIL~l25N3z!L(@y^Kv3QYXBoZHzJPVN58@T@_;AofujVZ35<73veD%;kYP_ zDvd@7K2xjZrSvxpGw8Ry%j085VfI7|bMMIhfoVBZy{T)}=^g0C{EERxV&sr{3ESlT zC->FgNe&WB2YZ)_!A-re*{)uD7QP%oy2PA6x@}dCtVRM@7B37rck=Ap`>T_w*|cv{ zl+5bw0@i=!=}nYs5Yo5T%CyS1WD_mkQVl}VsDg<6)m&YiZrg1?#icHt*uUKy`OP>Z z{~_!obKJ3I3hT>OJA!f^LR7}ZQGVzyHHVQM!%?(WMnc=QW?c(SLB%OA(t9`ycGJ(% zgel0S482X}iS{wM72M13+!V)n^f`LuO&fQIr|hUwWN3UnEHtpH^$d&XgWOU zyS9|}dx!B^!pxtq1)3dD+J82h(qHRlT)0=OH!aP!mV0I~tj!wFe-JEMu?6Q?ioGe$ z3~H46IH9HDRZPCY)v{r4#K3SOdRawEGIINvw&5vw%em_j4#y;P_ z)9`1*kGW~U%rMi(m5uk0MS-TOh)!0I~Oz9PvoS1Xx~f0b4Ii`&v& z=M$vLd$iiDh~>wGr@cC9rn&3(Rb_A?%|-VC96|sOPAl(LNZ#6y-$DA z7C)LRepJ=a(N#d8c_qiOgPl}Jz=A3vY+0UT+tzu&)V_nV{%fqNib2z2(V;1s`?Xem zQA&6Y|0f#Sz|qeA>i*thhNdQ!RrQPpy-X8%lJa724hU?OR%80z$7OZu$xpZKsW!z8 zKev|^xC_0cJ{}E6r+O*KkDwzg6GPaiE9;- z9YVu?zZVR*jogG}{4mOjn8{**?`DUKZ14*x&cZ}hLApw{sMVA4;Jnzj)Ta~BE@#lz z(HvEB?U<@x2w~l5p!w>n;43UUVJ#;>Bc?y!5Tq+-J51{L z^f@bsaeap9Ef{E5KAI^5RGc0*K~7G@-t&J=|0A`4HiR1|O+0`c(K}}OfgrAA+Gd)Q zmX@|+wtSn{Yt3iBSRsv5@fiBAbG*?3y4;jNH3SrfI=6|T&Ct%rUz^TOisB3@YB&^IR>F4L?=*W^a22?B5=dai1puuBIKQlTkI90h!hKuQ@xam;`&3Tc@cn7sz=+Pt~ zyp{?V&b&LV)N9(P=_~3# zAbd`TO3{(Y#2PqM=5y{$ekc3hn=yJ4w!?^ zsg!~(ZWD|lu*tUdoy1x+q?+m+YnWohrKB-6FhA?%IBMlO6AR&iuPa%)C~|(Rk=*VP zf#s7Ns1fyVo#8N7esV2a?ENuLqLw{jH0{*$F~-Nn8CjeS#gXn>vjV+$>j&dT%N7dn z*W-4S+3-v04HknP4Df^@Q?D17c&6pS8=f4*HqCaWzZ7YAY_1>9G=;N|r)5Y)EJCtZ zI`!zkn5|}pIYjtXIBy$#T9s-mQH~9g6H2S#8870?>r15jL{J<^ph!9qt~?1BgKW*;poE^L;cpZIp_)xhRH-9 zy|qmrSju95LPj`_ax|9)*HiK!-i12WsL~_@@0NwNI{9shqgk`Ua+2LodTF^EPfh=kKs&2d^aJiwNDXu`WcV9~{=#J^ zJl`R$=d;z$B~mg~)Cy?V4K)&wuv-*1OD^Zr)>H+wuL%oj9;WsBp{`g;mjpf)saIT9 zOt;;lVN5VqFiuteB3q`dEr_huM@+sPpzuY45=4HRbBy%5!?g9E%4kU|ypb`J;~3p% zCfojbN59-@IN8Mh&4EjGga+?5SrPhzTSGcD!?s8(LWcw&N;;$a#cK0qt(Xw?v|`>i zccV{ZqJK#+BRBe2>__isv}j15Vivf-x~glOhnXqb{qIj=2|LFC0irr`TywCrI7uAT z`XgBU7SiO)0C%IQKQR4(g?5wweKW|~t5W&Lu7nvx+aJZPxGL@H>C*Xkfe@bADZnU=?Mb=SPIIiWeq(a*!T9(TgE zL-w!Pj^YeEiKTWclOQ*(SG2r3qlo*;aE5IC8R-{|#R4h)@sZqo z-KWU#FDPMdUxY0#=bNB{zNbuTY3>79$qH-}J$H-|E-wrL{ycZc1M|q`TjK^=W?BFw>9{mnosKXM)JFlS8Sw$_!L$AP7R^}17 zQXxqiaO!F>`2m5=t|<2;Ka;Le=o`Fet>w-z0~`IbIedi#vGGdct8~OSVD<%*^i+X{ zM^V@399Z?epBF)-*X>K4NTrvI?H)O#mAyw;U0Qf$YFTMHyuIlm^vI?eXz&b#L1E9* zTZ?s8y_@GVGc%J#G6wU+cz7Vt25_B@F8ZN!eSRJZB#Fw9l<+j`r?he*Wl z{vFqV`|FVXn#~4twa)|Xyc-OWxpPeFXnD}`CIz*+v5J|b`Ifw{!pf9 z{y~LAA;O@*w`Zo-ATQYLO&T=Zg-^&2Bm3aHeLQg|N&?NK311!bJ(ql;->@O>j+z1d zmaJr-Gp@7&l{tQ9g7|6pNlSCSE{+mwW}E|qLy1k%mNQYdDc&rCMemPgC7d0~$f_VZ z{CKR+_+FAt0iWejff?T6mJ+4XB#Y?@*}N1u+|M@PkfBKAVTXhej{!0L**bJwY4RC~ zr*MRVP6`C+waWpl=3V!!&T4CUL{V{!*tb;`ZOj9e$6Jw~Wjje}CvkedP#I2(h0;*V zATi5GMFwQ*;Mx`O&X$mi&R8H)`|UF{cPf&mvW=b2_|deM$j>_3P1s{lNxd1hJQNEy z5y!BX$|p=Z&#&aXR}o3ggq!X3oF{L$l_Pkqh|O(NEGvMWo->um{iABLl_&PAu-wP6 zl5~k};%K|uIPGH|&yd!S<0?sm;uzlso!8Ht)cn7WsZ(0NBWsjpK^T(e{T6v1sr)ev zS)HToNHI5TrJ!nHT{FvtM6|W#wnvlDzD2X z2WR4G?5Z-&`_e7yN;w}a8;d%GZKVZj;u+BzRkSJymR%;^=jtOVS%=@Ts+{;b;YK0* z5|3Y(`H^F%mbN)pDOTfECl$XSc#HpS6hHca6Q8Ubg=LCxdR)R4P3^HVMU=+{x2m&+ z6E;H^NhoJr8BjZ|=u~q_+myc|fAVvQnIyEH5Ilovp&|We#Ch%*2}~iy4vHbf$l2RA z=9S$1nV|CbQz3JOOSUt8iJ50oW}F!t2AKh#vrwOx4R~TZewKX7!NcEuci7S6K525! zJuGIGeLJBOx|ZYh5sDHf9zsSJJvBdXm1$WtDO;?@8?TTAw7LK1?oo*iK&w=N{Q3mw zO>@Be@{vX^3Ao^iBPB(VXjx~o?8%*#LRGeWy64I_epxO!YPnRi6l^OTC z-zDO#egBU^+wXAGh_f!Mft@~L^<~E&tVZqp<5-vWO&-T5%DF}l!=uFwWl_B{XMC<6 zCC+AJL`k^6Loc-~${60sq+F`nya`8n=M_KoUhq_EFy+!={iyy^I5~ZE_rIpmLp(08 zqX7ZgNBG@p+x8~wTdBv1W{4Q4CxusV%kP${Y4xd4Mf7Agoks7qEB8m;siXM(*J$`b z<7COlg|DHWbm>1ug;6Au=Z+pk^|2^VFB0YVS;%~FN=QhQFisZFJ~Zf!n1Xls2!j0w z>e#=!!{Nlksf_W^t7{P{91qeVlUKzqoP9NvKRKtW9XGjY+aVztQyTaxiiSUPVWV{0 zt=Fl4VRwD2ig3ByxQkkgJ5mySgeCBa+5w#SmSimPOK31xddczxn}#w&nm$%VMegxB zx|mOT7(GSfSVx8>0lM1dtlFgBCoid1*R$2BmVn#hWbU?C>PUr~4vCfYdw|CHTaMi<(J^)-LC zj@FLgByaT~?OK_QsMdJCrr(H|`fbh^=1IMBM^~@j!1taJWvWgYcY!&alpA7uke{cna`xPvoTp} zfj{Whjm}QjW8Kr(6i57H^D2#ERg_mj4en(w!=DnOYBSt{`YniGzC8vlk@}_0^yTFX>hm&ujk~P8W~;~l6hv9krRf~q1{_~(n0um>WUJwtcqwQ z3D@L=N|UotOYxswOmz6k1rv={I9W-(yt!o&e7SG+!op8gA5sa)Uwf_OFnM)U)Pf}W zS(HpcF%5*ZgYYIqJOV9-b(t7ZD{(q!5RR zJwIEw_%Isq9IPiJ>|**nf@E1@-kwdPvK;>tZ$*mX2Zxd9l&Xg{bN1oHtRy?X49JsR1L?y%<_Selr07bNc4XSw{lEfr;e498Lon^tg4)r=Q?u_}zcq9k+D z%u1s7bauEcNQIA`ult!F&mX_j=LsqG#hT_S_mPx}zMRq>=ibReN7=~)FLnIi&00bT9el>GZ`h!2C0Tjz!4!7#R!y4dZ3d=JjKViknXHq18@DPA?h!8*{lPRk$#Bc z%W%KQ9i56>b*GeL8VV-g<-dF#FlHJZm9HO?b8G^$5p4=(uX^Dt>+6I1)FLZ|K-4)x>CUKNu!(m+cjwmS znuKne}Ac!otGy&p*#F zOz%$!f>0E-EDP8aP;m2ue?uN^PQOhvy;1sW)!6G+@+MpS*#+My^Xs`rEx`+@@+8<62-d3;j}1~Qm$_? zF^un;e0fxILe>SX)vaZQL1s6I*0+?NMdFD*-%wPVDSW`d*xCD&xh^V+U>%&|!S<(c@Fk(J*XPRnv4IcCxrZtQsD&=-fvo7j`bQtih5J|6h z>U=e&yPZQUb5XMrbaFPFA2qih&bE%pSKw}wlWN;r@&&FSSur|or2UMZWIKNJ9XW1R z?l{#FM0*GLXkFAT!*w)c#H#{Kw2fyJi74ydV7I7;l$zPTKN+1H*il<(!mT;SY|)G| ziJ1&_D{iEO>~FrRN_%B5LGr`Cv7EklvDRW$6>BezQ6r~tI}>8sA+qGAKynJ_zHX94 z*-2VL$>pC=*K)>?`MQJla2T zeo)6uS=TVqMVbt3=*dpmi4S< zJ)>GSn*{)1LzeZdWj$GDnr1eeRaLdwY-Y1r5CV(EVj__c#qLU>()4$+;*f}6sx2RT zK<%rC{bMKoz=^<|4)9IA4%;c3)8oD`x$r z#woI^+9Ju_n$b~~!c!YFwg|?tnUGy*#$w+BT~4xq;=gkjNQCGrB^DZ zp0t`#7(uI~5~3+GY-z-rkZaq0BD+OJU7y(NM%^efHxOBqyLAeE^co@Qikhx!xYsVD zOMM0P(PZEM2h$I>TaoJIjh%QGz7}Scyq$=vn9C}k(HZc?mv;3!uk4(eSv5V^OaQfCPjqMKn>6yzN3e z0|O3#QMxN&ttRGsIChD5xLd3pg+Ki0@4s;2+pX&-!x)0oj^xP&!3Stz0zDfsw_e4k zyU^tMQYeHpNOEn~51Vek8_wGu`0jYPg0$Ms`o)F9?$D!C*!*=wWoGlkeN4f0Cy8rY z@IomvqA!*E62<3{*-_!{dzo-Ny=MTRG4=+GV!9g=%y%!5JJh(FXg8k{)B!bDZ!k2n z#x#{E;(IjQu+?icU$P)nVLi;NkD%W^C<*_trz=_oUdh zYu7&c$xo)!X~%JTbA=mQWNwJ3&8Do)+gxr)gxmJheDei2+sQV(c{Xonxp}kBjV|3* z$wtA=iJM#B=+c`h2tm+m_w?M{`sNIqE7=?|mVl9Dm#TtGdYt7Joe%ePxWS%eczyvUtzNMUaYdCB>yM$bxthjZ$FC^L@vKNWQGO zgNXIu*wMeLoNCmic#(Z;S3OJEEtZqN>gGQM)%)+!(7|Km96SSeWG(k+YmIVbJcd^*;$Y1bB#R5J|hCIdSBd8YvoOfxJ zPQC(C(e;_##yZZxmL6-N!){H_$yde=VinU%R6>|z4k}H*`2U^5OWB=@%{C~K9HCBa5 z-V<|u+$}WA85I{+Nf`FS<&qX!(va~a7wud7-AvVqHxCXQ4|ex1m>t5 z9`#UI#VAG5dDm8a-&SE8vEy>V2g{&k?z85TvElO(rCdJwer&dd7wQR$v*7NPkWwRg%luPAUG)hsF>$xBQ z=>PlQ{r|q|SnE6_O)IAnurtu5`3U9dDia~H{r#cwts!dI>f0q5dfBF7fncKX6KMA4 zsvQG-+t~XNC$uOw|~=eY`N2TVDFum&vmL$UX{=i#N->R<4;p} zJv3n@OSd|u9id-uZvU&xSDu_)eHWK2*OZlq6c>csW5!U3NVV`=6%!8oL<#_82+>^u zhijz7_;e^{%Mr>%6YWK?EGb<=MqPqSWrjmM9R-D$<+>zjpg=#aF(kgG=urrW8ePl4 zSs#KmB}rzV_|1QX!>H}KPe1dcwUsJ)F{my>TZb9m>R5E;|<3t;F8`BptV`gM9YHsb5g;vb7MaYVWsA4D+(pz0qj=3=y z_6o#$y&lK;2n4|~0*!#xWn05ci*zFt*6_9RxM*p>qF%{QDQnNWDk0C&3aLw)_TSn4q?B5p^{ zCHQ;lMC@Ah_l`@UhHL&BI^W$pSYQ73F6oCLvwfkvYY4*EGT9WF`3Zrz`F7%#WE<>N zgSRyamtLA`bVouNC><+fs^JbM`FtjP9Yp(ad}|l0;H^pq1|x~VqRnceL67%&?In^< zxq$kMJ*P;L%w#f&L}IhMbWbk)Y=N~|KfSJkc{2q!YmUw0<8_tUMwi}57rv1)dm~A= zx#`#K(i@%E>ngK1lB%0q->l4D+wI$GeqCkuTB*9(1{tg~`}yn4Ubt|*eD%uCdmm85 zwiS!EHHh%-g46;$kYK9_K@hGbjYK1o2Z4}`0yPds`>_NZVQk;j+D(>% z0b5}R#M5m9a%3A#u_ysST@NxvU2&WUMspM>C~Xl$!!|@y&YDzDD(TU|lvrFRwcJ9AwDy4jUNiUpa9>tjQj8S3NaVcwDnPwqsz^;mh`axO1K z_zU6pF-o;hy=2%TE4LVa>bS3NTVFKkdcUwR9t{zb*;{1p2uZrJHX}Cr5sgD32({|T zT~LfO<;t+(jU_>qR2S;BkK_hzWN^pSl};y)51c>{xe?EH5{Vc)ACBLHq`X15QJ)*K zIC5(0Qv1gK;&p;C9Y?Q{468~k8nda8ZZ4#3(14m-I&yL_an+&w95;rEFdbflF-l(< zWbm3_U6pF1t?^w4rhi!f(RM8}6kT6+4adhv=yZv-T8ex~@!P~oTd1V0&KjE9NlfX| zjWn#mu7arYD1gi`T-QmlI*&_UKhYH84i1vni7sBd(Pu67`IkApu>;nkQJ_e~Iu-=@ z^%NLG312n=3Z@uW0&%1c_?V{QmeO$jTC*DS!HlHTC|BzU*+#RkyCg6wXfR9sc-!uW z@uTzDQc|KXz!cm#$7`#R(CEVl5A_WU^ki8&oyKvzR4VmkSua>oZy|py7K_K@wqw_8 z^;|mp%&V_nnVFp)-x><@sw(Nakxr*&S?+W?xm?co{hqaqrvG+rSv($ZwOW>CrPFCe zQ5ucL@bEB0JF5%#!?l6T8Qzj<`C* z;-Qd!rKnumf)!kM{YF_HZmp6b+EC{dPyhUbXYo8jg% z2De<-U6xk2N%9s5gA$kyf;7l9nXF-IDSHCs6L~w!V<|gsSJWs(O`d2`xfUGfjTzZ; zJgy|lcxnBKUwOjyJov3dnuQ?f=FOW=Km9aCQI6yE5_D`Tk&9j+rPl@(6QfAMdJk?%ac-Q;hD_6UbOxkwregbXy01AQO5NTMh&amr- zcfbS-AttA4>nv<*I`8qfgmM8E!*pE2Rm;N}P|3M=6A;27`W0B%Sc zi<%adfNCfT$Xx(*09Cx~m%JK$IF=|_brL0$s4qhr*i=B)jlnLDpfHH?nf^khI~iea zIY1hZu6EjCoc0jhG8_-#07jKn6H&ujiiJ$MYS|19yOu9mC{3D!2;~5(f^X{G*>YV(r^90LzQ;3 zsaknMPT023g-{gEqOj!}7QoJ7jZD?;2h-g_q6!o`-RJJ8EfLX(0VqvoXou>IGSO>1 zLwmGq8Z)l4Ur;FGmMi)YyX7JTz|EG>5u?rJEg*DZ_lN!?IUFgk-KU%7cw}5wVl3yiVPgx&M>6rM z*W@*|K@CiTI2%F@MWAtl2e`%DR$M7gvv`poMw?X_mxfVxiSBdZSlgVfch`r-JHb2H zGdFI$AAMJ4+Gz^S6cFiz1`AH<-5QJRn!YS8rKrrB*Fb8@7#UfQWF!qS4L=3oB}8Z2 z>x7QMk{!W$F$IOSa*OdBLSu{E^f^4@OWwdPD|!DpEb3@JXf;ESi-0(1+YAQ!;h4`c zpk9esFo=TM7hOukcF3Ym&wfaDR|CPlXAOExe z8mm`}&f4tE+*+ZVO2xx`s8X#C4h{gmUoMxU(dcGb)@al%%gSbRp64ox8ji+JpTBta z#b>Y0oLjkd@hku3KRo%(&%3iPm2RAiC**L*$A`8I-~X$?oe%jevv1q~@%?bZtbP-^fa(-Z3Tkyj%owGmGyz9VMO|}yLawvHk-Pxr_w1|mPrgfa^zs&&~P*qK6>EJqkHd# zp}uy>$MEH4hkiflLGgM+Lm98jSRF!{*ion(wxTP@ z9?A1Ft|0kx8uVo*cU|=(a@)|v0pXTr+^U&3Rd>-tWdH#8Z<|`&F?>tt4iaQoDWVj1 zGB!}N#8D8@n6RO>7$1hvn2Ct1R+sG#U_{)45Z|Z6h-^clteZh_R;D5#or0O+#qbW9 z9P83qg&ol#9!01M#1?dBs(p2*E~X(Yk0J@pRfo1LFyk=EG?liZX?iG@GTLc8AwbQd zpOuZ;9ra>2yc5q(i&R^vHyqRGhKnAWNP^IIK(EF!Q9X(f+8GiKYfK+DtWvEJXss{Q z?;yjFzdmW}Pm)7Lr5)=E7(>U9(hgXGLRuPHu~abv?GiY?4>Vu`MDgmHi8vNAq0WT3 zn#uqPy|9b#x}+H9V*&Z^Z*(W1ZP^&po%X&g`|z#olO<)6ZRJ_GSuh&hut6{OomRw=Ea@ z2Pyb-&ug=(@6BJ3*X`bGuh^R@2!dds%-(`Bd-d3z{5hVUMCqyl_>&SR?G~9 zDkan2lVw^&Js9%4HiKA=$IKo6bUgb_p z?!bd}wdflywc6RIt?$UW&Gh62T_;7<5m&iZaZJ7>CHWs`?=QC`N;tnq7ERP)1$jKh z8k0|~@WZCKkWAfkJsMS;O~=Rk6+eQ>TX_FWM~@9G#7fhZUOwk#1~a zmi5LGzT^nqbr*|~eaU^}pFT}M)!f;P=tYC}25B^JF^qf zri~@KUC+gEhLX9uV0T9RwjNE1ZkAy(#c+DwbIPKB&{A521E{t~fqe!AhOjO{aGni7 zj&Jy*p_t3zCDWiJBW(hrRu~HNayAVEnF_&&Az1=w9f|rRcnc|QHDlHB!#8b6g9jAV zxodc+FO!KU61}x$Jy}+-*8u=Xr_;7=U%Ys6Y-}u@PUrK5bSB+uw?6%EKRGze`|8Ax z#U=07smnJPu3o&9i6q7+#_H8ZrBTnM(|^xe)@%R(kV&8&TmD1f;Gc@;Q>cQ*l%l~5Sx#+g{D9A*bc5gJ!#u4y47nf5EXXxUk ztGCLNAH8w4(eJLrXtHJki&)N5Y^7$54Ub{{nB1uu?cr^s(TaM!?me~^9k$SRo(K zB+mhKf;KHpR*hlZV?2MUUQ7*Svhk!O$$kBOs;aiz?RY#606?W&rfHgH=z61`&GqpZ z{j!`SZ10zbkKP*DQLNQr2HMwFh7U}gS-k#{L~@4lnrrfQC>%#Gi*9wyvqw<96VsYn zDI@x(%a(yKs!OYq4k(nX(|gLdK)oh9k_{^;0+X<}b9~6X?;UNqiJ(vvCL*>~>>pfJ z#c8l5QE1gp@}SaoblmYE0ySY((r@@i3V<^*5_4?`fhiD5L0Er{i51C7k(dyW6a-=t z0z-h0nN9@?brfw+^~^S>hIufEB2Bg0pH9zabEc_w91S*|n%!Yd2Oxm99mDa2@82A7 z6rCMdQ&8T5_U+j6YPDgtF(kB`02ljxki+>xh@>643?!5KRRUXWw&fut)l8%oT{znI zvc3srlsPj$BFcS)8gVX-;nfM!3x!RA3iW{^hA$^P8;6MwMDci7vQ8f?KfSeoycnG> zq0kTkA?P>&lU^7Bt>sA!ZN?Y`h&W(Z#W2O4F~w8q+Uz(~;NZm($WHPHs>iV*UBh*3zIRS zjd@ZSB`Sc!Xaes!7Vd<*-DTZDFiLc)9uVsfff$OVeYoy>bsgU7IThP;Ju8d>F6J|~ zf1{PRG-qov?)U-@z;#o=VbXIH941uNU34_cr#w$ffG~_935GU&-!#l905v>a5LKF> zArEl?W-vs{2&4IsZ01=5=SaJ)98xndc&*cb7mRHO??>~*|s!$4_dzowBBI>YiTIrv)5DiJ|zmy zia%|2+ve4ZWtlpgmDW6r$r{)aIkbjRRS&x*koTxAw3WasFZRVEh&u?R`DGQzx5J(p zife8Q@cLaBrMBoK{fx@*lfw+Zy+i74dvzS6yQ9NvjmEG|$h1xh?F^DPJiG37ye=h@ z$(?#<7OOj|XaeIB*_ZunBu{?*_-hforN3v{2uwWO7v#8$$w=VzuKSF`4J>SwxYgP(n9aDi#gF5fJAz)Iv0$#HlD7 zA`;OXD%|LZgk`1LDwc>>;mEoM%Np$iC_un%uPOWXZjmjsC0LbwKzXGtDXmV#Gk0Z% zAAH9>FbtPUC642Gp6^-9(&@Ay2#(`OlH~h7$8jvn&@}zs?|=PT+oYoVckj+jDE_Ed zUGIzDnrox7eSGfN559Ls?y7g*xvy9(Vi=Z4Bs!gr4_uPRU*tdVnIJobZXCp^pGphlnT)kRrH1~JAtpxf)M~SS@4!JoX zY9*~DnPe|1oK=yYGwI~&4ByrUa{YhF58SwR<8bNp77V+dIOy7r%o!4l&4@5ZIYw!H z+qT{Lt|HdFUn5pSqw05kI%H8ysEt`}TQH5A`oz#+a)4Twm()_|z~TE=otK5OvG6EC4Mucdb zkP*+<5!7-_%tBC@Y}V4C1ygXTSTJ>~f3Ux=zh6_;X0w&eW*`WvR;!UngyXn!xr|~M z&k+C5kDk4RhC(>uq_a0_-Kg8aSfn2xDW#7JH*4b~cb;?XY-{lzWc=i|cQ>ut1k^F9 zQJ=vqNNl@u*8+LDoK)a7UsLt^M0q_UmL*dsAjn0~D2yE3IUarBJ?9m`am*$_@p2~= zj~*k5uwp7KS%7$3>W<)i8T28si=ey#p*HSywOLaz5jCmf84pa>5MF?32~7cV*LUrX z2lN|?mVk=;?uTST3uK|(O3k?DY&a*BKx~-iK&z7xY5_oQUIETTSzP+tVq- zDFL9R==}f!fX82EaRwrAE*p)P4WV9bZ;wwFL5W6T&+`FYw$RQftSbmWyADYc z8VW}+5TgLefrjuF;?_|vtrBn(mFh5#Tt%J5a8M7IPPOn_G86u@EHdY2qSO>ENXnt7|8HuUU+Y$yEHjm7FZ(S>KakDcM~F z9l75on}|$Xs;G2WlOcuUlLU3H(+zVwow2)R2p+NQ5zeQW^`;37%5^O~WU@(_pgXdW zlPfV3-#(bR7FMBV)n$gO4nagH*ik@3F@3$IVi77#qSlJRADnpSb?5R{C&Kp+T+vrZ zBYRi+*PkVR)VW&Eu~CN9G&++-!d?V;MiO>gjEWdJl*#+;LEpr1zpmyXpRPfjJ&k(8 z6_-(6cGF4Kh4QrVsNrE7xQmM7IwQje&efxGC$E(!}L9)vo9jsm@P!Gu0e~85| zs@aDC%T?xHg)p*xX^1!bCl10W0)wDwTdlV6^f$iv-7o!ruO0uJTx%Z2We|3_NaWzw ziGia>k)bIs_FxlB%oy8RB5ezEv<{&Fuk?ycEfz`Q`fu2Cqm02HcZ|oLLJT zY+j2a3o-H3dwtpIubqW5l`?d+bZwAFSGP=EYt;#b*Fq!X(p5;lVRhxAEwBLl&Lj8g z`8ut?6wNVW-hzKvK22J9OfNZj|%;{cebt{Wj(X(;#N&{BVR&T;x3 zPi24=&-D#mMHm#|O>0dzb<0O_A0|-+aEl<&w5_V*(1^<+p44?H(?fkn(>=V4M7oBY zmh;2S>syU$xDQy6M}QV(N>hNmJayM~1WCfI2GCtN&O!)9M|~D_+FcJKlCY$^Zq^~zaNv_AAJ zj|a1vfieq}+0RjCOIK%>SJnGZ&GB+F4D%CgKF31n>u1z=lpNgX33Q2`ywmqLYh(Qsl- zGL*L=#b$lik$f+2wh_S5RJfvV-VHB`2o^d>a zvw5w{#Kt7lq!UGi!zBcDb_yfr_9DDLU^~c&@L&g{oa= zk6Ojl?ojvAo}uiS9Z$5n>HAW#(g2y%T``Ho>}qLnyeVRN7Ygh1uH89m_!e%hkbK7O zM0j{zDPZypMBA8-rm<#7_|Z|j)7dsw>6BEnn=M_L#?>?hG*M3>hX`A!b#BD5u$oE9 zYB#6q5)%t)nBMPc`CFb|Tdc!L1;6AGfEs6{+KwF3=KQ8u5nUPqfvjc5A#a5kn0HDe z9Ni}2yw%FNp3hKmlq_M9_0saF-7q4FqFGrg(d*O*WfW;-+Z<6?6>eto$%DHdJ!5>0 zTxFsxUqNf69HS^wCl$xRNStO!zKSrMDO=>0iVjBACC)T<`K>jYTnA!^*a)jW+D6dH zy;T#2!H^&{2GgTYCiYyD3W?VBtUoM(TdS4dZnuyQ&TV+TjMtw-(~PB_yCp0;D% zQb}*FUNKRvF`x3f9+i~k!U&+AWkw9?+MU}9B#)WgN z(x$iFU_bOqtA4m}W*@7ThxWFeKGHeqcTexgFKxZ!T{F2|c5|UCNTcboTB)?Qa>=sc zS>2uN`c@`&WH7dS=eFI`(QBtqaZs*NZ}RayBU90me7RE%O(yq76P@#&6~rXumDRq{ z(Ouhi3k#K*{A_n1HKsEzMnybBx6$VE3MrMt*@*_At9VAm<5>!BT2M#oglw5)c?^Pa zj3fY?ax4Z!_(Z%-Mqjn#T4?gLh~2t))|czK?AYS+d_2O2BQZe`eBVzdlcr&wJ%8~O zD25__AI7mEDi#ZIOo#wkfIuUlY%wf_G#wTJaUB5LBW}wA{Q+CxJg^23w6L~STT0mJ zZ~3F0j=!t+%22x@c)II*C=Pl|gtBkRc6Ak4{|1;I{9Q4pPJD zuxrbZRdszv15;kaMP$M3FuDaolmYpaUo*g}rH-80Jwrv2s|cbA6g6#%WxP%;%$%M91H*m1&y=_)^rz_FQ3%HfH-=!I zk1;?SN9U7-!iS}5zG4ei26EG&s^A3~gEMH$Y_A zCnC0vI7CP_J1IZD!m*5Ok1|++i{lcaVGxL>Py)T&fpG~3BCaLOBOnfdKn^rph_DCM zrlYVKVX8jE5cev6DX=-cjUwh(1 zfz2#XW`Q#MIm+zP$!oJKw^H}q%V-8l0CmIDJg{A^6A0DC%pur6BXwL2m`>!%x-^N? zD}?Wg;wVa#9g~MKly+eRjDZwSvkHOwiWBwF8yvS-tlo(cVl;%%Oi}KJ*a(IaaAdfs zSt*EH0&{hnz>#Fl@o}pjhtm}o^cCOdb6TS{FH4*sTGX2p4f`hN#S6{(=9=g0U0tu* zC}2vWk;g@e)7EnS^)#LA#QVddZ^W3I)nN?_$2iYJ26;N~m|=i2Je9zqx&iegmsmOi!AG9-6pe@v^eEO)0Z10l>O1!-H5DOgDWp zIuhD_pbvS~u1R)sL@SMFlWPB94Psn_9w#c%kZHFU?9eF4=H_5XS)G5#bJ~4?U?8$d zB(zE@RBa+eLdV#N?e&hf6R|AkX{#&qpoS}zAqY{30W?it0en-{qNvDOOg!Fy4%Sm_ z8e+m4fU%^|*7Z?{UuCHIYJSjdxuHzMl6X_2jPv%|wE;tRDb=Gf8L`FgT%wsevg_cJ zm2XbgBSy|HTlFzLRP}|t<0N1v;~7~5uwZ0Km_K9-G6lI}*~WG@0Zs>MyeR`d-!M^U zRnEj9r!9=7kz*15^s2l?t&PGCk9o0ZC~D+GEVK@Z4B+F2e+QVr2gPc;LfRM&TONcK zTiuu$TVcW4+O?c9vWWH*2(4;O9V7b9C_$SBG*or02u2^zuh1>YM%k!^-@S9k_8r@+ z)hYl2=~P-2#f@;Xx~|uo&CAD*ZJC-RC^{OA3ZiuUg>OK9qC5WUKU)3Cr+@kV{nJOE zd_^`Qcg?g#zvD=z>Yo16t>aHUJ$DRWybw_qV_Tv`IyJpx7?>FA;;E=CR9P zD~Cm6KG{cu_8zYxP-07$x1z);YKm`|d?d1hAj4=4Qz}~vYaqvOp;CMry3E3|o2I~! z5VWyrtb!+*sC+&nN!wcSO~@- zUu#mrwa1@$*T4A4Zw@6=JN8Vk*-Bx)P@vOSmTO1Zc;BvZ5i8^?tpvGqGTy4%mygd@ zYYU5eckjOY?gu={TfTW^hyh^Kg*+Inufrbj{*Qco@AUN7&YVg`NzOJ|f)S-w!UnH} znE`~r5eNoU#R5pn4`U#}#^(UAt^WVn`>!C)k}JOxbiZ2P`)L{Rg%%kRsVXxov$7;q zL8E~d5G|-l8?&|L!~3^7&<&uf02ELx+cjEYG_j7;nzn$avce-@%amXhk!CD>RkAD8fdmrB1 z8`@a6#%A}-nbp1By&t^x!#~;iaHMdloZ%^15LAxKKF$jrrd(DzF&xyWVqrRc<&+e6dq>G@-iMv-Um z=ifG!YU|;5zWtr_mse)n+uJ|>@sDL${)ou+)SjXoesTO!3`vq7`9D7KSA~d=&7v8Grn-|MO1#D=YacW%j>GnZ5Vk2Zu*H zmtXlz61ow=VkZzJDs=-IK?5=wP8uz<><;A&*|<;Tf=D6|rwfwP@rLFwiU9WQ&UnMtyGHwQ5e!QlZDTK! z=&m(PQmZ-GP)SdK&S2E`?7=8;oY9~IPFQ;5@MDkk}xFzfs^A7QyUz;O9Nw-+y@By1QCZc9qJYJK`Zo z7_5`@UaR$+&O>STm0QAm#%V|56p0unm;{n z3rlr75V*I7=Cx*5f*bcRaUor3W2)h9RB}62B_Fyy!lgmQv4aKIQ{h1p-!1v$ zm`JIZrv0N*NEB=52aJQ2`XfwpkzGNDcP)1|yjYm?-tONkdaqd0-UTN*QQ}Uzc`gWK zmKX-k^)$+r$PeRUjVO6k4AafJciN{tfXP1Au@{&7`UFLyRer40-)V2J`0Glnivp*! zRUxz|soZXLWzUYv6xC%UY9JS~GdGvleDx$c z$XG`#oh4-r4OMYV3~>ZvF7^_FLE-VCydQZ?NXgdE?$J4=QuwnFV#N zR=qa!Y4+MT#|txpw8&ba$u%qL>KmbuYZEJ#_)$haGPN&+RJ*(yXuL+~w~6BJ>B%cF z{($LS9ki%yx{O0!zF;e&5uDx+>dUgyb|0y&?wvGx>wvj3>@CMT12+E??%IiMux1P` z|2RGGj`LSTc-T0bn!^EkZ=C9}mwFILc6uo|mIdxhzx&_Wt}QCEEXuq<{QKAcwItAz zNwr&vBG#_2PLY~-GB#ZD@>+Ff#N3Va_`&^-EWl^Zp7-11ci#ChN=L0`GFhGf`gi_L zrBWWYI&Z%HPGh3bzx8gXeZs1lhq+5Ii7Pmc;}FJvn8w)z2a*s&`ZR%&I~GY6K#v7B z!(uhV*K13I-ofszz4aq+{lSAjyz$_GUwY-m#go`_V``QnHHM5x963mdjXJcevRu!I zSB&>bW`Qns!fUWV?p8&0yIsISpHPuGjTd-X8qw`x z(klBgM-h*eIWuKl)4nuFts?$;LaBj-*{R4oSXN4u7UPtztMVa7LDNI^ zo+s{Psst7aHYONqcAZQ`cbrmH8kF`J!VAqTVXBc$Q?xHqiJZ{g@=l)6SkxBR_IJZQuEHj4?+4(f+0}0N^8Mnx=nk@ZW?N`77v< zU*wGZB7fwsKs}yrB|?bjd5+^gvC8ZdM4C-e?79vUI7OP+A<{ZSXYJPro|uSLm#2nhlwF+*p$Xlx2FQOX6ld+5gj7iFlSiyb21 z(s94}DccS>V5P83$2FDrB)C9Mv4XS_II$HB(~%9(cr-5Y0!u{Ws9)411zWOnFiwnf zR5X|K4#-T25v)YqO3TZLbn^6nXdU{!LZ*1m9rC_MnUoRt-lmuOw&xPc!*dJI#tz!4PbaR~UXKvAs1 zG893^Wc+Rb{pP_+=l1m+9?h(Ln0q$Whctz{uExU3Uh}~>?YsGvi*HIHZEr*9sL?(X zG53bSneOg0b@4x}eDSTW{YvY58Exhy-7gGL)n6|q2Y~q0gZR|(bW+!*uYddPhkseX zcURcj+`^Z(s{V~mH=}m}cJAD=URo}{U%ogSN0HZOm5SrZI$e3v48K?my3kps@&+ER zq@Z2&erg==y(3Ssa|;dD;MtwSyVSV#L}&zq4_~OTf9UP$55yM*F~c7-@vs@xcl}vT zOBvF>1X^hv!TR$SxO;o!-~5jBf7?GtJ$mC0f6cv?){gl2jKZjNf-H&?B6EwX$oJS^{m*rxM+_1Xoy@+_@k4>R0{W*3wo6#GC8hwqZD~n0 zZ!VLVEMK6|9W4lbdgj6A(dWL5OQrHt%749HkK?%C?-xo%lqM$!Ckz)q*?e=KcFb^M7i${3nCbC>QLy@np7% z70A@u(hK*@{S%XnySW#{XWuA4Ob3UX@=LqJkqW1tC1%?Gk4nyXOL_4!1IBgH$Cnjm zV97Sx>n`)9^~_FxFvAhc)2jJz%&0W}<1>-30`=#dkscphK^+Vdn=gvC$HvLJUTAMR zGf{B7wmhZy$L&$Ky`S=9nf|+cls`V%Z5_mPEkV1y!g|su28MTXTIpm6ppmD^| zi)x9PYm}RlvZlwn8%|GMNl5@y5^ALl5uczF@!~LLgfN*JnG%W?eBVtgJt`4X9HlOq zj8AAM^&KkJJcdsrp$C-=aun$4BIrS`kdkf!B?c#a&PgO0ga#<`a7=}!NlPS5WE>*| zlE8zpZR%3CkV^zkZc^2%c zh-lqE6YWk;{>FRhh(7IlT%z~7IX5mgjQgp1)*Hc;@RD$btr0v(U}7U$1;mux@SOe$ zG295BWr-)Hi7R$C&5Zl@=$)^`-0aoQzTW)7FMC2gJ;H0X+E>5&RZY|W3TgI#wRrb& z|6f7W{$jx2RQ3Bf5BB2||Js1RQZD?(n&Zb&w14IC{@QBh-^8~4n|{|{yC8opLHBQ3 z$-j1?{wApJM-xB(&A&JiLWmIhc=Lc?DYO42iy2xKBqWknAD0EuO~y$KaSF#cg$|uc zv1KPqO2GuF3=~=5_=v#-T`nscYWV{v<%EYO0x+E2|=bZO;H=Asp9w9sz6$z2NS-G1Hm0%T<( z(&bAsEv`$nJ8Dx*1cHH;W_wtl@a(myS*?Hm@x%)4_3L!IFO}Xmt)g+NdhJXIXzCe< z%v~-Ne}va7W4csXF*=X_$0vXB#hEWY`fU5|n>!Pk&qRrzzK@mq{WM2&gPg4hoa&78%sPl2%K9zbXolTzif0o=X9rBileyyZ!e{P8sEZg`ZIHXmlwZx{BHk^$MJ8!^tnsVoU2spb8~ZwstyK&4?p-| zbNgtvG;wv|!WX~vWdOjrdzWr(-T1@S`ai%h)smiH!0LjgW*tZ$`U!%NraA1{7R}Al zLL`etQfGZ1%0ijIu`rs1tWIE#@b=O{sZHfHCrcL}MuZx)&Qcx`kdg0zz=}{B3Di1{ z*FD+xy`h(xa{?HIe-fWF!*1RB$xN@GqA;KcfuTq;&56|FLUrZ&7dP?~_xB!R!1WU_ zp>L)W3vWuZe&7lMI7zsDrV*q}6e8NQ(?oJ&%tfA*4%jqBzLP@F4v3JzY-DlRA&EGV zR78}DjRK#^7?`gx>?}!ZRJ7x93FIbtE)%<60FjW*k_1B#FJ*wt#(mu%1;Kj9BSPN_ zBNC65gp>f8Qm$Y@TVMrNwgFoLz5x&)PH=P)3!@OyWyoH8?#s6~wmWQ);fxUBCbl;?&0lFKjY&Hs59^!NyF>;nw_{2VS;)XRot7U%-4z%8D zNSOIKk}pPZmZvt8C%Uk*bxeWem+qVS^nky9{rdIm*TJvs{}A?x?F8@%s%GAN@59~0 zt!tnC0uei$$Qcoma{}rN2Y{G}NRnkAI{L+wOf;GGQ-z_e2o*&N2x=$rCq>>&K!V~D zMFvE2e>}(rQP=hKz?k43RN-+}OaK=UZs2`-HND?_XPkDNf6S&@x}onSVje;8!-m(7Bq>WB8lQK zCyf(gXb)H}dpHhG!9B;3VMTaKs(F`A>N3{l=$9oSy$6I@) z4G~7vNctrKtmRlkEi#|vzg(lgj zJmVU}j1^N4kQn#M&JO00=GrA>9JuX5w2P^pU_QapKtPt~kBrViA=y3W#(feETFEgtA5$7-j^)+X?sPhswpduYQ+*t*})n)z~fe zM8ynCq<)&~;aKuIoMFGrkz>Am14g~?nLN=F|%cH0zhR$Z{PZ&9m<5!)bJu$2M zohsQR8U7@|Zb~S_P^)S`WKFx@7m$NB(W8gk@7#Rv-bT0GX`P<_=m)Q@-`jfd{eSyE z{JVeg)~$Q{@BDcf&WO?etq*>`fA{+jKK#k<_T4HlYZD9eFT8x=*M5Cv{(0ldH-F4s zz3r(-J+f%^O=a!_KZ;Gg5RV2vb7&NheR8J%2ZUPP2JuT#^D$eQ0e&Fsaxk9eU6UAQ z$E`8}J2Ad&Hn6w>ZDvc9t>hQn-aSU?B@qP{Ap4>R4%b6U=fv_{^NX!Uq>Rk{1##cTy zb2_rZhbMZlh-zDnt8_}M=wKY|CkGzcgR_mP{A|Xwn#TilHuId8Z9lT!j67CMwMsRY z&lmcGe(XB`uOI&W-T*u^k@=0^_;ug+PEJmjR+cx~&icDQ{ZxGcFI{{eqO8vY8Xh`9 z=$RwzrlC(_Kx51R3UIgz2o9t=3}w&N=!9ZGT~`PQv-?%aGdpxEAIY0Fj+xx z(}1=@%ky#s{HfkLXa+>&i@}NSYpKb4{yWQ~-C1)pN(@ZJ1PN(O)gcll!qcA%&wpFDIC8D%tf^aR=S%KzETx#v>sKxzI{*z#xw1#I!zB zFEsMiLb-8=uhWy4GL1DSdq&Pp-tj6{ly}K2#wCy9M<#3e)WBe4m(4<)Cggz~ zKG@Q?n`z>ROOiTYS4FW{lBH^Ps-EL4lu$A5L`F7@vdCo;NT*QY1OnLDr#P(0f<2B? z36YDFAdh+@WbN6;tfy79i74A{>c?>?yQJ*L&utYa9lsyNtZYVgB|)e~>!}EsB<^D( zn`CQ7aM~F3Yx&|Xp$U+*K!KK~xD3JDPA+rxfq=EqR$eK}S*6NKWJXK_7jmQr_*@dS zam;xtuH{d{W-)F#@$QOg7APsy^25NV*0*%j`_^}U`_QE19;ZCBly$<7q+gzl4F0vHt(}wO>{?eYARi%kTVn;qqyx1n{wT1>j?C z2|me^@e`!XHt#&x-rZk)<+Bn&n1BI#-`6zU_7Mv;j#G=;DR$3AOiR^rfG%W(PC}D} zZ3^iL?wXu?y!}G3J3o{6DlbySqK}Xf zr!>XB>6YF<))&V2FUw$maxOH}3;nIKOj}B6FV)Dcqn8-{e`;KK((P$RXC4M|1YmFX za`$9%UT9tU?G3R;w|?}wIC1CG4-U4<-24zYR}G)%bT+j6&=*20PaMp}$t-Qd_~8OA z-c-}kD8^(jD`!Kw+(EUn)69V3WcExVQ46W-WcYJx*<5|j)7=Vb4}82@i`VjKh4SLuux85S96aOU{s{ojG3(;mVC;Ua>C3W*=rj+tp@n^X!CmrMO_cxaCu@|N*-eegD zQyFn>V&0gmgmmad5x`&w7|v?}f5b!agee~R<G-5ygEi zNrYpN5T?gXcwrWYV&X#v)@3RMV!l?D1ZfbUAw`C1sC!{Pa?eH0S(=J@m1R{kwtdUa z8h+D3L(dD14~9-mV^Y>1&X0~6zn8TS#V8g?njy#(#)62ied@*9i!Z%yc<&$dScV@^b*6e-z=tP#lv;UInn#myKG^j(oq$E@{VZ@b%E^Fe6&i?>I9Wx+dcifE zZ1E6aVGu7t($tudqcns#5=vv-D>1}rU-x}Ko6UZ7uRlqW zM~@!0+wC+>GnvfCumAs|ktDgfx!G(sJ$f#$0UgpCV~ND z_!(6W2sS6APXb){!bx_iSUrhPz2{@4(3T>6pg1PRwK!-)eVECx{H7(0$qJ z0IE>V&Mf35O_Wh~9t(w$M*})z6Vw=F0%5{~Sp#NAWac&&u7q|&5+#M@SU%RYkSOiN zhgo2oy=x&R8QYcCC~_3wQR^cIi4txQbOtu)PQzV(^7t9fvRs47ubEgfXazvOVK;ethr_YRi2+Kcp%B6pkirHbS)Oi%2nN_RyH-f* zBYz5TMy9wA)afuTVD)Eow!*FCO4WP*Vbtxvl>OBBO#0~EH=kj@aBGq$(Rd1ZRfbZu zl1&j(Y%C=`P^ep6_CBPO$eE1|Qjp^$UNnYPCijrbwZgFJ3}4tf{ePsUUJpn?9CEoa zQ8!S_{4;DO5t%D8E()ixwc2zb~v0)6C58kHkulzCRS*$HOlM`YpG`u4`sIXlWt3BDd5AiI zmaCr>R^LEnr>DPazB>_RrqZlO9Wnt?B)&jqmX|Ire^4qzzc90$Jq-JbwSu7A64$Sg_246pB$WT`uM{Wh!~MvI$<5POMaop1;sgx$oi zyO>e2HaS^2a|PuWwu9mzWF8$__aB~YJvwb28;2dwHF~Ij>{(&#_<^mbZl8z}0!2a; zC9%iE38F}d5|Y3Kj%f^70!j#F7-^1xb^n+k=y!+V{mt$NJ^cNLt)0zL|J0!kVzE4R zuHN7!#d55^olt=-6I8&+1;ULnrhp)&Ks1kdLDgh9bdUS(;}q+vmzyOUBXP)ikH#A0l|-AE{hnX=I=l!8S!g?nngp7jhc`a4Cl}r|K=~L z%$^3n_uhN&zyE$1hSh3ydwcsQKlzEOs<&?4IyyR%B&5O+OV9 z_wV07Jw5I9dev(6?YH0l+0T9!$8it@Z@>L^qtP%;^R2huDijJl&wu=#fL|%Izfqa} zt;7A@H zS!12V)_mf(R5m7X1tfl9-ixzrP8s-kxjfkf5gLS$ND)fI_l%fLV~FB`VHbE1 zM#DUa%1KaV$e6bc%u}>B==yIoTj9*5DxnBWW`}_T&*?gp5sP79>&{^8i2_H(wsqt1 zy)u;p3Knr%V;EZGLI$7&jA?eB z0wRqYQr1fW<&TquVMyG8zCNP8qX#bxZ%i*tZILsb*l79TJyQDV2|9L=vHxMox_ebH z-P%lxni1^IlJ7Y2fa9OJLno!q`wKj1F*C;jX6=Iuem&q1xnBD>%U4@hzqA8p0h{I1 zQ%oEf{k9}#e;>H?D6_%_ns>}k)>7+a)<|4*D+)|5?Dc87>Dy=But(z~w^1g_jx=<7 z{c1)9*qh_DHY-zcz>Q45DY&#JIu5`CT}DqPfq2^|BQBJ!!N zumXUofL(%!Z4h&*<0ir_exm1$x;h!axzjjVwIXJ+Z1|_Tv!5OpeoL7DdG<&Cdb}WN zR4yw3*^{OQn57blQ7e`-V^F+FizAFugy*UJ8*Dj~GV>%`m1!ROVlvF4=(0JiFoL-R zJxyym&I%1q=#gX{aln_PdR2zasL6sbacsvZ;)Ij=fZ$}B6HR3I>?UnbW*Do)qJ5%2 zwXd z=^dluorY_TqEeB^5ZpgLE{1dSQ|H@!OEP|@pp!5=1!#GL%I@vhqh4#Wp1}zJ^WXpX zq&2GKy*q5(z|n%&4v*U)&lYppA|nM9X$`vqr%-8c66pbLdI8Pz86Sfgh09_;VdxWp z@+5DP;j!V&Vd@NFIy9g>K&8In>Ls)P$PP#Q+oEy*kGQkj4m%y*%DQ@Kh&6Xefrug@ z!ayXbswO}8nd@x5{IjlkXq#DDBsr2x##wIWt?5^P>^FJ?*BiGqJmRo7rYPSva+C|I z#cKT=v--ljX??#1H#Y`@{odfHmG;^=aLLfgri4gDK@_pEpG%22w$l_QiN!z(Fbu{J zr4fcH26RG#1ch1z_>>eNBq1RKI!~)e&O%A0M1l;B!JxC&+W_8SI&hlfX!pQ0Tk*we z`I)IIPvd}yeaA`(f=qcTga)1D{ft3QajcTnYWYgGD2Lra%KNEM3*!#g6?)y+p)@Y%b5_gEn6^fPv>mVv>JT>DCnjS) z?@&>R8ZJmoNd_YD1XfNX%Xd60B|2nkjNMUE7{Ppa+MR$>k;*j{(nZ2?qztX*x4-#Y zziiHoAc&)*qv3E!lH|jO5AWW+J3T%9{qKLjQmJIK*(Xn)^m;vpVQ$>G(d~9$fBp62 zEz3GSKF(w^>+9>qVsUeGvs^Cc^Z8G* zX!x%t3EqA8U5?`hgTXuRyi=`K_xJaYj*dS3@IzUa-+udT0Kn$v<_8~qFh4*4#v5-u z_uO+&ck`e9vwv2v*ITXDlP6D1(4fH^UP~EnyOfY(x%HqP!>U_<%XYBDB_Vqjspe_BtnIn@hi4ld5R>k_#AoP!zrF*2N+XLWt3dYF_ z5uv=agD%#R>`e6NdEPpe^M}M_= z6}e7MEQ$GSKF|NuQF5kVcHUS;c}c4@V=a?JCEHI{zdThF+ghmeF<|NPJ}akj zB;m*g@}}<-{gjMp1t7pfMSv}l*cqo3q8FHBIo|R~lL_m2tX?h*Nd8qH*Q? zpEd7(%C7I_UF5P!Xb>^7krW$V;JGQK@qsNv!id=%1&^r#Z^n5%Us5N-yfET;5(a}P zT@9c$SvyHa6d{D}gv+Z6WJJnVi73`Cq!fwCp#h@E>VlD-Dvg-T5Ol&K5lW!jYZl?m zKw3Uw<#*!B((WiS$zuxD2ns|gAW&JB6pDwW zM<%wwvYAYN(~AM*25EFU4uaU7j?G2NMk%J;p@z`FaY@(S_0itJ;maU-y?*xnetOlo zr6y592XiAse2Ri10p?Iig;ziIs(k6$?-|`E37;V~i4s_m?aQ^FQ%etgwmN)(D1A&T zBuYVQ)1op}TB)76AeYbF9PoGc?a|{+XYUmFK1DzxamXmZfFP2TNKqWdMdMx)*qF#- z>|w|uBF2f&Vv(jepQS?x8H7a0Q-HV-KtfPRorB_dV>gtCflC=cjEHopw7E5HZa#gb>AUgordI1Q6yjvq3%^Q{AI} z%OXbCf+Wh%*zC|cY1zmM2u#M3>Out_TP%qX4}wIDXp_+Tc0%(kOO8#P47@|q*(JIsI@NHOr(?qTm~3 z#Tbvg`wtQ#{ML8AouZT=e>r7#=gyr=moAmdCcqB-yqNA$;M57veakDC+y)|Nig(?(gpG?1W(`iXzYRj^j*BOkBBg zWn*LG)mL8~jYgG9rC2O}@-IUDSGbse`}Xa#XV1#A{NTZZ<>lr5{e92#L{a?8SH7a_ z`sCzfx7$@!^=n`I+K+zpqgP&eB~4S3B;S4a-GBU#|M8n|z8OW)`Sa&%wb~#5@gM*8 zZ~yjF2uQ!*|H2o(!1MgYix+?O2EgA+ncaQ&gPSM2pa1IDdX8yZVV;*Gii!<0rjzxi zMUwoJ!zb4zb(5xNAd57*rCSw58|Wl&r**B?7wCb<6hykGkL$Tw7oq;2|G@Q5pG?io zS^UgI=Fs<hbCd|M-l41p+?foWn{4$Jd#%qA%uhfW8Fizy*%WY-$ej!_OrIZ@np!^Pl;k#Zev zg%KxghC7yuN0zy7rgg7356!HMx8cNYI#n?4z2HHySg4jKz6U&XpkI~6N}X`y9Hka8 z)Pa3mfO#GVt5oYxR)70Lw>o3*$k7Rk**ucREZT`fFgpAV59b!t8&2y5JhPeJDUJ(+ zTJ5cNvsLYEQmf6(fhO4nq+VG_7jZ=e^76Hg#_b>7Sk#+SjD?|8im4AO+KD4*6X#4bxF{@AiwpW_ zW5J8nEV1nmYKib6fqLyNE>X8r*3{#Qk9EP)?Wjy+h3Eyk#W;ygW!+Tjhl8zgYu<${ zyIjvr+ANO_$669sne&56=6JkG_f-vD+9%&2J3?B>V0cu5k&Sz_Z?93#21jIkq8zLD z;2;S?7AkQXkl{cGh6|xO)aqTtkFXFJ=9+Odbx}D`D9Lvn|8d^6Fjf;!gu@-ZSPTN6UyAkyYeK z7E+0FB%-?_V3DIBRTv9m(H{er@FU48Fs=A= z#+fCS_nBS`GT_1K17p8et2PGx&Rg&Qdp4?Et5zRak)) zauX^g-h8-mG-&g@nxja9Bq>^EpiBUATFVl-A|_Y_eK+zq%s7t68VJq^e8Q59HAaB( z{g`w*-2iS|*7ctGVgAy;vS7v9od_A$WgEi-7RLZmGQ|{g?Bs0e#m{{ynV9<%oqBg@ zR7sw}4pf*^w(*3PJmfawF=li9FfKT!g)H~-v!530&untl8>jfu<3WG#Fg!gZEFH!H z1WX#nIIyS)lL!-OSip=PI{)MX;rVcj%90?UAzQ>aqCF;YN(hT6$fhR%cMIX5?hQ+j z-Il=Au>Vy*Xw{Zx&;iLuJ$Yg`aR#GdJzxgvWFxm+nw~32kQ5U;iM${{r{le53=HN> zVky$k4Z4(u~Y zB1OeM83c~YIU^U0Is1bMABRa+h?ZuywX7Y>oC;jS*YR#$h4_R+a%E;WT!&nO!?@2hSahD$L#?q`&>mZ>Ja$1o=xT z2GcY(O(RJ%m&+l9{@@S(;EP}UVy#wV80Or$bB`ZCzIpTJH^2E!P1AC@oFE9F{`9Bc zdFLIPrVE9FEX)7uU;QhBAkLjTS1Ogpm-~GF< zzy5kQo6Tf0ola+MZEZXrudS`U{`%`jM@O%|`s(K9=8u2;!0LB{sd7ofFv>y(@DaST&NBtZyR@R=k)G8+^a#8EuQ@Q7e& z1~IN@Md5-XTN20Fsye2LoRKrzW8m5bPotco27bUHM;0m~4G@i0UKo#u3?ZH*(a;S8z$^+< zj9HncS0%y#J=*4a9ymvsJ?&gV`T58RncSTi>0@Mu;(Rg`uo2VRFl1bOFk@u08KpBm zs5RN|(hJ1E`Z{;I0dt~cj z#7|ZP{zDmiE*X&xnxVI?(e=sNetd`YR%-O=eI2pVHJ5@Z72HpVJY`euyRVGLOfCiV zkRuCu%xO!{o^0Q1=9Hc8gPds#nTew$s{5%}V8saWp&n@hKREE1Y1eyHuI02`F3W2w zM>f4t%w0WjTh-Vy<$V#-GL%%hM0shY345Ra^Sd+xyME z%*z+Q`PRW}U)h@!YyDNNxLaL2b|V`VlfZzqa~POBh-IJ`h!Kza5!bgeQ$1hoBBmc( zeV;sMcp?KGv8aRLVk~v2!dkYzxGepv-G@sfu{IB%`1+Dt;&TNW-038zM&xoyzit#6 zi4O%R#FALUL#&@kl_FW_m6YE8a5~!JQC&^cFk8qA(R}rlQ&lEC>2aT|j2V+^?9tqh zbL@;w$GOI4_@)*GhvG4A`sc~v1PcmWIWI;6O~^pdU^vid6-g!(csKB3)1eehW_M7i zxIT;lf)Ki)8YwhWk#p7ub|JY0Gv|9!ET_0;=JHac0KX84{w zJZ|#OiX1}Cvuy7#@HlgdD)NOp)ZI+Cbs8=tsYWw0KHj=^`O=0~_OW&lgT<4LStR^{ zGVeCi--+l!>5J24?`{*!ri*urm0-Aaao!!!Zn8TV+eiJBz=vlSa!bO6&dp83^Q}L4 z=f8h+`tVBiTf}OY^rh#ocU!GuxiB+3t*M0%AK&tx zJnEGiQX|jFS~(_94gCOsC`1b!EXvg}2pNAn3u4i>u|s$a;W*?l3^M&ryLWoX5N8nk z6Lt9mn-}BblqqJ0Pb&Hom{L9oSO(__`NGUHxmF_XX6KZO#ON>*CCB#8i?nk%u$w83?k0ePdh;VA4CdYHa+0aDLcNHBBjUv!&buJrNFuK0VgGVEoPeZ)%>FMc@oT{p3v)QNr{V3omfCFQE{`~omJmqrv6HasZ zubDIZ#y7t4jc3K5qRj(3lquP-zyyM}~<#GEFsA4lyVV7)LyO0+`cON9i&WbDNv zwH<_IIa{OULXirCgq06rBl%e*8hA}3i&?rmg62}%=wgt)L{?1>2su%qq0(&qY zp^n%P{r<~y3wEV`$LGhGc-(H*OyeTu9g6$|n~wG2ER`40f#B-1c8qiAu6^)DbRsvd zjOrIRO-~D%j1(l}(STi~G2gPEOvc6O0&z-N4aYo?W*maak%N#)$(X6QPs&n!Le6KL zUfCO{xlgeT@yI%%iAun;56A6Q5AV~7KNzeGJ%PhdV8HheSq7vL+YxJ|YfUrB zjkrU$PChFsI3LpL+#5l<){R-Ykx}d+KcdK@6YXY(?s;P7{oK9FJKAKKcjl({pyZ}; zoal;|LrdL|gfZKQ zsPJTD@Z8KX98PzJfTTq!n_+W3c9)LFG{qpmVoV^AO00xgnn(eQsC`^I!_tYu$)cOY zWF|BFP+U5&R}UQJuA6lOrA5hsJF)GxbM{yajz#09c6z%cbSJY`13W&%bqZ2AM|m_$ zi=Ma>`p3X&qQd={iY7o$jW+|xkk%pRXub^nxR$zrYKVuwlv0yODl<`)XrcUD;OP{xbEszc%Kv_fvA&9Bm z&DeUS%NFXIyi|OhBR9fl8%drZoEV>pNSzwI5pd`CEtn^s72qD9KX;QkmLCnzipo(% zh%5`*;}M6{G$&cLbHu7S2TZq{AZqAY;(8it>~a0do{_9d^8fw+`cEh887}NBUwfuC z9Cu*ca!=D^vPhNB&E}ON1+b7&aOUt@YrfPYyf8xD5gmAOH~{ zAVe^&`mTz}KrIHiJ>lNSCOhY>gGRVj6z$W(L;;f?jTX(51n-=~*&@$Vns6$>`2@;@ zUw{P3;#7(P&Y`HthF;YfQ&QnI)UP*tXZyo%_xJ9eJ9ns6DID|q!1Vn+Gej|M0jf@k z4NazyGxWm4eT$8hS1!!E+1%0SR7xodumVkmNyLL}qSjDAzj)?yzseu=Z;V6djB$Q? zdSct!AL=6(=aaMwLX{xTc8DuctUY1Zwxe9evR0g(9rhsaJ@W%;p*U>PUWLemNCdrgJNnS|khz&YNGqy8`3 z1K{J#g^$A*KEgWuBD>+KQ&E(sT+@%!E5Lsw#D0X;c#5k3l`Q-CD;Iz5l0IED0Dvfp z%gf78DI|)bJZ0EEC1rd>|4-BOX~Octg$vbc^&^hPuc#S+TV?jalRLLJ9$tR+3xsaP z6b&h^O;UmzbE*)HEhd|B21YffcAap6<~j`hXy8;OHRTf~g;|zivmC{hDCfItYQt{YdNElG090_3|X!Hm;bPLph|v=`zD4h@2_ZyFtM;13Q9`bn8%d{rdJ zr@8EWi=thI{&4@$I53_k9!hes17~)eXeH`#WKS6HF2!6$?DT>o%rxq}y31WZ9GV~* zkJ4aDKP<#?PeN?>Bn@DPg{kAtF>4L_csD0+>1G9Cj%38xb5a9Qr8s7l{(V|fY+;!j z_@vNKO6oA~&WI5o{nRE&&f6`xCt12ahWS{0#^f_zgwG%e<>+n8bkNEy?drqbioF(z z=P3MG@P`h?y3R<$wjfLcjy$w_3YRbEvMxe_2}hBu209k`8g&Y_^dzyL^W3Jk(j}_R zp!QR}aO%wMAsG$fdc5|?t*@t7hRUaSdD+ih9g4M_kgX^IP1*f)Bta{U+Kb>!vsCc< z_g}3%vsJEr;9+BUxa^;D3|rx54+J$6xF&-equuA>(!J-Vy~j5$Pd;;dHn(j%yyM9< zdn!^B{y2{v4jV+oIE#QFy@$mc)s>icN&(gK+SzUH!()mDdi5Uq_^rK-#GRoKLJ6E@+dh-vggRz{E~fa8R^K11SjGuhj8!fog)W1(~ZSied6jXpIusB zL14JE`$3X=W(dinu^D9N8`Ie`6(ACDg*F4#u+1diev5^%pUq0XA1p2}FU~Ksyre3! zB+0E-i)GndE;rW4IK`j)%%|oj=5IdS?eA^%dnQrJ(~_tXEU9L-6M)!XUWji!9iOddYkakh@hVUw^8fB=YnkOnD$48g`E zEXVYVmc3a*HXSu$XOiHHM52f?R4?|5S(mz*LE~q<(+c7E>KK7uRyZ?M=d&=%!#1Qv z$jKs20FK~s#FHZe^s?Y|#4ACx-!ON+qEl1TjsH*CJ8T`Lpg_{O3^Wytlgac`U!$2|0W5nSJTop_3o+L^**hl=CTRW9=+9d}(;HEa@edAprWorLT0=7t;a-~9Hs)AX0C zW_~26KC-8m&;FMQ4j?%V#@@kB1Pv999iu(zsZd%9Vr;E;nI z+qlSUV~V9oc0yBVQCJ^3T;LZJx|GXw2f83CET^2XKyutnu?zy3Ffj(PhFF#(eWZ8X zbdn@x3XdZk`>v1090a0>S&FDjoG9jcy)hn+NZm@SjpMF92Y96m7HYML*zY3x?L?!E@=w#Ct%=wxrH^qGH4 z;MKq{v(zzHS`V~rpEQH^nuC8_&9fFgg|-BdH(XI-cq=1JqI|zt^w99CHnqptWfTq| zSWPU*#^vA<={WoBb6W{0cW$o46vK{m|28p<*JiJ6$aIB}9-{#15eH}pc&N(9PLy-F z5e{;$9Y`qUz(j4)oq=fG&XYqa_72k{aRum_Zu@W0YRX9b(oY5J<>{Tqa zIWIBQ#_WaH(5?CI1koTlv|9{DI+3bIkYQ9q&LeHYKV0V`Q;&U>kO)ck{gg^M=np0$ zctU_i#8uW7I=sau{9Z~C$S?5hye5wsHVvaPj)|h?v3V_3jSOdwyi}YEprA5DLi#dE zo18+%RLpsqBq(vYfjWvQy%QO_(+r2*#9v=I`Na4x$9=!ETl?Cy|BaQe-zBsMoc4rcqe>^ftHUy7vI^bXF~+Gi|0Zip5DQSgXwRl&)y^SrN6FfC+s*&V-Ok zx$r!p2j;dpG+H{|Dc2I;rbNlP-0o1Pe;8fhG`&T=!~6Rt1kLRUrS|{Fi_6*3Vu)yLcv7EROXt0f|DPpzFHpxV2i%bzR4EUw!d~ zso66`1V6aV88pF1^Y z<1V_p5$g#Y9h05`0uMt9U;r>6QGkh*C)G37=BoAHNL>n4iiRJoh26fCQV*%UpJDi zBznK(9>YL4jh2>$j(&?1Sk3snLnS6l5SEYZH~@v4O&%N~ID< zL`E#gbcirT5ZLg2dx%NoE0P|g84`pnVTEzz+C~(sE-r{PmU-I;a*CKB*mTSRC(q^c zf!|sYq@HaDI_R3#H63iEo{5)Pz`~nMFicDwB{&#~PQd1oNDl z3}lXOx~bv2)qG(br4Re2MBziRcc>O}+b!?m^22@@Xt@|-@FSCN z?(ctEzhBG{uScS61!t+|nvk}|*-Fe8i<9EqRS%p%*ALy49{N5RX$U-iCD=$Ct0R$|Vu+qB zpkY#FdOTM@PRfpn&T?c})}U@^B16W0B|ra~0NRhYe{;MyA@u?Xl|by*OPfY(!pkH{ zD;fGC3K-e#co9o-cA{orN)acr>1DX=sjL!SSi?Qa z-=z?BMEWz~fz9}8Xip{au}F=bc$Lf_RoUT_(@V9N;!3twDg{)6#$%23Nw1&h3KD|V zadKL4iv|3(UyV%^?TARS96#0|#OE>!@YEuHb`XKW10y5TX} zj*brvwyKqLJe#FFI%Wt~RdbrA32z*%ixF%{o&VwXJN6)D!gzjh-f?ZyFzfYt7>1+K zs8lSa7+aRHGC%j{x9^N|vl^6fN?3Lp1x6m5DDqL@lYu{uhDG{X%?K z4crnrDzJ`|ArT=K5Mt@_Fegq#xImFU?H2)tJi}3(%E)1Mg5X%6R`ZcABX10iKFDNK zw@Q$k8RDTV7}NxY`EwLcvjwY7oznMSdY)+^Qk+b#RIzVq$>i@}+8UN+dZ~qNF@Fz%_{rvXbd)pgd{PL^T$N)6i@nbLY#F)xt^KuX$Qf{T=vGu$R z5=G#BoVN8ya>rO?Vu0$RB#MaSfQo?2pi>v~J}1!xX4JbRmkSa>WFbiwab#EyPHDhk zSzrv$s7nIPsv3e-O>Ct>d1!DdpNQ<(>VY8GptQ{FwQV@c`&3>i=Zd*Vq~A8|qrQ7= zq!Yxz3=$X!wPGoN%zpRiQFpt+iWycANeu~HUZ$NeEJBV{Bq2!lAwm?PFpQp%51p`% z6G@YgjnE0m#IdrT(+^`Xj>|F#%WHrvM@i3#)VwU;OvL+JC$HMavz4q}SqP)Ud9S5s z701bDlBPiVcfq9R`oPT~S*eq)gia8mDd?RDbJ?LWOX+TO7VQjp-|Em5pXypLB(X^l9unO!Qi0WzTF*C7pQ*k4T~(9hH+!(zFQF zE{0={Nr&Pj3Y;`x8WYQV)E(_0W2*UFs0}4a_N?=@Ia|)QVRB+ozM&>kejki;<`Wp; zJmI1^rCdX`nVK1EQgD!Qh0u)T$_c1d#lkwI$DLCZ#xg8RDv4kO0_Qa3TNZr@x`9lL zyQnI1DjpuA?Ni60LWy8V?7^}+xi49Z<6{oTRNB9sd1j;h(jZV~QV>k7ntD%*jE+7$ z8@Zg8e8`HRAK&K+lc=yNr*9H`Ey_O3T-m2FT;At3?VmFV5JVCoqTrt98 zL3<2SQ;&5-%#V{9WuBXnwCextW@m3ippt+EYen1s@CAs+4osbK;cqe60gK%9EvG_O^! z6{!&y^iChgrvA{Ff;9I}e*KHOX^zL^LZKi_%K6o~i5m06jUC5!lgQq%{lUgCvusu07Z!WKj^#VYG+`4|%fLtx18Ns^}hB0;7?LC($X;#S%9RVsa4XzY1% z+#6`!?ibzcQZ8$!`$dqPOrIk;*^A9aj3SorXL1{!-!}BnPaC3udFJ3?EF{$2e9;Xo z!*WwbB+@7f!wh6a3imL1m8eZLCgV(YR#2x3%jDYi*~xOgvbwr@X?aEwXNyRPC-^jz zVKN06kUf=fb3`a|&KURA;7}orBt8+sUCQ5!f&#Wq8Wd!uPZ*;caM?n%%Zf9u=7{Yg+}old9Q?b0;;)?07=y}$SOBuV;}GW(T% zf|S|&w>~&IIQYU>el2jVQ52Dh+YQ3`1O~E@L~sKoOKwb7YlhEG^Zba2<55(VIagzO zil0+Ci57N%bdtvt>Lk5US3$d61jFcw_<89;~vvIQ?T6#LjhJna4 zFo_4gbFaO-Mn!@-Zp=Jjm;eixpZt^ zjLlwVsZ2Suc`8+_9j*+A{TU`KH|F)(%TXwa^=H=oV{f!KAJAuVVn0_tu$inrPPyD5 z7?Ad<;EyDyiTy!fp8DqDqj6o3fhI3t%~WggLN zhU~37cHm1g07jxtNQxi!)e!iSb`MR=Aw?m&j5KqQkdk4zfL968Q5|rC$KVwH}YD|zLGVU)*>3 z_r~cYh+d9wyg>StrnXe|j9X0MDyS`dV|m#wLOf{4gOP}h2ZT%Fe#V0uS*k8p5$E=T zqoln)n^jp}jl6JfZiXPp)6-K`%PcM}ce`6%uf+y96gC9K2DzB>#b}rS@=%*Y#fhV>QUCpWlrsh-g9uQG?P`$7^iI+JBi}luoYS1Y zm2>y`q{pS!1im`VtQqW+8g5z{Nlfke)ZbCGoOJF`Bf@BKcKCLgOm_;O5!f)HyJ|#1 zg=b+jL8+VBDnrRd=Qt1CA$BH^K=X8y^dlk*q;e_}EM_Qe@(lwp+nZ#F#n{c6@k~fP zOZM)o2X8COeO5c*$~}tjC4fniHjXII|^SL zVU9X`6kVc~Y>g5zCrC<;Q?hoFh^fc(MNCsNgCX{}0(;j*Bi$<6y<*U3Kxc78@cw8J#AeF-MN3 zW-3W;Wj6`Hk)D&GQ_lAc@p0-YvpkIs#&)MG^ ztt*{Tt*lr$>7Qarv66<6XG!0HNx>Io6^>;F*n_3ipH9r47#=zM z3w?>4S^gt6;@#~`%u_h_BC}+O91zm7I5 zT&Kn`lq6;(_E=^^0`#JM;K2>@Iz9D#c80CXu`oA%w>N@TP$1h#rX0!Ri^Vh%rYp?RW`Q~2#gMeDI)0{ut=p2s56kryo zD;lB1Q!MTKW5zn+aiYO=37s%A%)Q4?9^c)cotQ-+%I0#CDE^0^{rsMl%oe1spL}Dm zImh%MDTcru#_5rtBraeA@(A&}K{(&JduG@~fQ$jc2`RF~vkOJ$a^*v)~#07Hp^4(*j|L!el>llRu&1-ct57j#Ck4S~12grh z7}F4d1d~UCvEtQp%7xb_6ovpGVKD!-A)i*6faWJjMyzJfbylY+Z+t0CNlC_qR7#PM zD|L`C$D|J76+C&5Rsmq=7|B#6jTJj=q%mlNWQ%F$X96*LaFYlI37f+)J>w;{=AKwz z+j(~7N8OFuXxMa)Cv8Mi6q%q?0P`p(er$-1NoMy#wdqcC>%zNI!O%1vY`mi93i{F0jY$ zxNG;OC6pm@xim;q(C$UnL(p5Hc5yc&|XT`c)V9c2$iz#}0O+iXIJ4Am}nURR0}w}NcVGE8krPu)tmo%3xFy3NsuIJ_|zJmi&_ zUORuh@;l$7fAd4T7B`KR?M)Eh9(nD?@X@7&isX}A|HE_MjjM$LDn6NU)&=1(bRTYv z+`S#qgQS|K^T0ArY#eEcWyb;Z!;}>6vx*R!koPj))-08OS2$}0fPbVLLb4Vg=^@zMmYi+%ILK3!jqtO7!;s8R{aNSAP~^7kaz(~ z^JA`{s@kl**Y8DCKJhIJGfcwfX(FIP5ZPMj=7Cwwh@D(sMTeF0WV(FeuA6&fKXOk` zh}PR|yEhq8B-iS9hO3yzkd6QjslkzR@YUEot`@~ae4a|=m5ZIsj2*Le7`(%1Pev0L z3)Am(_vX`5y0ZFyyASP)j6yU=?zhpQQn_Nj8%3tfE% zwnaP;jl&lj@?dd_7t@Yd8xs?R8c%~39a~k#c?6}{OJ;%*;EhFjmZ+CW5Q_Yaor*JD z7^evvmDcHuj(li}lcucGMnIZfh@T1gJ{Uru%otQvVopodzLCn&cp8C#RZRwHXk7Mx z^3`a4N(jxIUIm0k1hF7JQiOcs%EV#7N>%qZayDgJQl_$MWz8kbW~)2NoAWPEW+Al8|u(M()d|tGZ&aN zD2XxP&t1G{HrJfv6ES|#8VTVJM!?4o5e7sOCxdv&_>=>ntc<#AIXrX;$ zD90QNDLox8VQD~|Wb7QPO{PL@Le!iKBCl9?`*f4SPw;k6iqRu z0m+g~FYyz|Z^zWlc2_n|iI`#tQX&Bn+6AsYU`mG~xfr{IkdyNnM=Txc!uM#(vuwDv)G zgWWz{tX{#|kx0l|Lgnk#P2)&$`!-UugXRnQ1m@*Kaw3d}bFQ96V{7hO5;-VvW`mB# zs4eyU7GI~M*dzE%(2_kXwjICMO-~=qr1z*=9jt!+?TO$1Bjfqb;S-^G?@VyK$c{Cw z2h6^SQO}68Y|9a% z5hn&c=S8~cf<6 zw=55P^GwxV`t*)zNhIJ&POM%S5-7l`l_J{Qo221{$u>Xy0Al*YzfE`pnmRbIyL~A;nQB6qE?XY9soM{E(TE znUNnd^8Dg?&iOy~Xmrovr?+?BXHxaWXI_lr=$*HI_)q`YKU_b3?(vJ~r1klau3gC@ ze8?zmX8g7_yL&&;r{albbxsUWY#ydGC3Jz6MaUyTQ!0Ub0Y3qE##=s@j7m zA_Mc15oXTukY8BimARe1Tel`D9eF-zkKD3rNkD`Ulo&CJaq=KoadU(r<6@b> z+(m^0Myv+YI1j}RMf ztv_C=r3*2a+Kv}xxsXD%3wG9xV1s|@)%NNovsIZ>UQgKhus_f2@f3+1HPSi;tpkF^ zM10`RTHRrTaR5q0zmO?~yp#!rxL!qGeBZ2R?`O$Jk%IZqaZfAoL- zKNQxLE8l*j%`e`@g_+#&*pBE7o^;03%96+ArD)I3XJy}mIa`eqj*>7T^QsJR-8gO|hf>bUYWux^Fv_vtIf~_>`gyU3Q_$R~pn}^lDQR&X~<8d}M z)UL-&o$Sa__r~H*pPx?Xq{sCp%7Z?$J3>cYxM#NRAL~aGVd^P{UyG%Rn{^IIB}h9? zg62_}h?uZ2%rX)(-`d)zN87*r?>N!?Kgh}lD4-NV3IK%=fkn_e^3z`kBY(A2un6fTpg^#h1_FXx6KB=({YnWQ8|A8&Dw;u(Rt|LIse2_COL^gxOoMuae z#5@^<;neng*S|#tY3J?}?!mI6SLZ}+y<>#L9`0T46#7cphJ2YJksqDV3Vp+oEpAe4 zEICuIb=sAg4sRC~a?9$Ko!iG&YnTQaf*jxjRx);|x)j;b?=O+C@gjbyleEru%{&M(n&Kmp$w^Cf83dEsctgBwPjh z5BZR^Bw<&q1}O~yUq@1`h;JyTKrFyCP|^V(jx!^q{VSSrwZuBrmD3-d`|?faL>j4Y zdA;X%fB0C%r&@LbGKbaEm}P6k_EP^*>p)KomDN{p^`p5@{f*J+{SORdKYH=z{t-yt zrE6mP>@&c7r1ZmE{9UgbZh4&w|5KjwLWeVq=x%6jCs7~gp_pWTu5pNyd8!ubISOeS zh(wIBBM5oTVOBJ8)|$KJXZx`!c!-a+V*({VLDuFZnHE8svtfn$3Ys1ybtYLo%$7$X ze`1zt?US1=d4G7c5#LXB(?x|9e=y%{b9!+X7Y@+IN2xaJGY`5(aBuVC&gK*3M;j;7 zq;X-S){s00S{E(aFtGYC>A~YvklJE~0PkCT?fb>YCstLl2Wb>1yvz~j!@%JOZb=fL z!eXVu`XVRcymOL+)@1x@V|?|wIPOO5cf4g#y^GOLu8dqZZD5kup78N`a($Rd5QtHG?rKKeD^qrB}XZ^%v`4ATQ z$Sej0q41d8@E|lMGp`JS>xZ{K_;8a3@p5bR+i$#e_K` zsFU?fde1vDdOf8Z$-G*v=(H`Q20?MAI7|tk)5V1oTw6OLRy*zI?s(N67ARB8ePgm4 z4t8s2&VT;1pM7q1`TExFVVq0T@x@UWP>};%0So7rn*RAqznf--&{a^KCj=4bA=!q4 zO+wxGDUSD)Wm+hwOJ}bghLazCfXpFfQI6QPba;}CVmYrc1zu@l5}oDfop!r{ghDi1 z4p+kY^Ye>m^?K%8hrUPRjIm+xKwjU?=jW!&j_|@B*|`Ydo;)`{IU0-1EHc~fg!gZR zakK(rzF@V58Yt;;l=kIv;PP!~n=G7UafWFcjG%3u7%~3hxz|jOF()|*R{RzARtu+sA*mMtJ9A@Y92p?XJ5#<8tjfa)0EUOM=KeZh$0O_hM@UUMIljl zb5>g@s+tze5*|#0G~q>3fjw+JkpX-Q5S{W4wL1*d5(8%ec39H0o;(UzX~= zC|Te%OIBIVVZ%sBhW1hS%U}G9%IxEWSny{eWdC$I`?oH5gi-!O3LDX~tJ13eVH3Vq}edwUs?ZfD~S4If0xdT~@=HrlukwCW1n|E)+ zh~|k*nc93KWSFHCr4Uzz;I_Hx`QC<9&>09gv7 zM2M*ca#B=TwGtqF>?s#J>-!>=tb@bJTg}nY+SEUb)4WrkC}}syXe_iOZ3spnM&{1$ zuhgY@?c5#d{MEr`eJ@m+4Zf&4QZunICaXSjJ{_?`7R zethv~Kd64{qxj6|_-NHUY^yRuk6)4wKP(FKv83wCU0}_pWgnQ;@!c{21r#75@cGtz z74f?Dj_Q8z$>H@cWDh@FckUnEIXkj{Icy$3@mIcGT$6!NBi6Pz^d^*r&z@ZVxy6!hHdq>QsZsrny%A@&h zf=gjU5NL)Ri}Jh406G)s^jF76W!J3{q;E7-i9}1C_l;FHAzSrJU-!=4oz%Ogs18gw z8A;O{HS7A*_7B%(f8nKHzTbI1wy+~tB0J1ei_WY?lFYqP$<@Jq#8dGN~O9JJ3TVY$f{DJz`k-?rbwvyNJD8nm(K!JT9?v9 z#)VQ%Ni9t*${Z(g>XF(uj<*--alndcP=>@GCM=Ec-1z8mDw&HO=)MsM?#q62OBSGm zicaZ7lV=+e)U>-~QVQa-xCFFjqAF9d$%Ue%Despa2U&2DiMC3Mm7M0H1Xv7Ureb}{ z6=+zmfTk0TUufWS&%ZeJXNfi5^Z=sqYK$H1is5XLFVp~FvLN68-a)kYNzGZOftuRjKnBroyl+$o)mK+6< zl?5#1=g&$iDirn1F3^cXKoKeOanw0?_P;TP@4edX#mU>oY$ftv?2S~isG+9J)EdRk z6QBL^yK42VR4BuO0&R++5A;4zrP%gkvzFz1nmj9<=q_CB?F9Y@@5?ib!YtvH0)S;4 zL`ny!jg(CODNs!uT zF60gut8X9Q7u+$Q?x*2Q_4Tu-&-C{0zQ22|jXM{nJ1f$Cd;a;WwWoZ$zo?&%^_2&x zSnv}9k1bS^ftF+Hh5=5pc3F#1I_<@$Pq$^2H{8HW!)C68nDR8AqQG}$$d|uIxxI8_ zdo=KGe~%$|*Rx2(fDm|3B$>n@6)Uvg#`ScW->ydF&+t!-+RBV`y6*BkPWDmpR_Cf^%Y_D{)01utia1P|9m%4(2Sh6T~2* zh>S-t69L4sZ~jUdcDF9_>;6PG#J>CZ`-i=<*kck{9%6Kqna>SNSvoIOwE(+r1d=R8@7Dpt>;*u(4EJ#&} z_Y@5Fvf`srH>>HcrBjtlW}BD&ch{LwNA(XCvYqgiOb;S1rv(eRS;{HX6bnT=9Rs^m zZ%B1r9wkoV{Nd+1(b=lisIv1a3F@cGu~S`e)Ew!*}D9f->Cld)sZ0Y-g+iF7D|j)Xi-pa zNBVT-GY3)Wg#ExSwEKLv=1236sYqiXbLXV<5t5_I;15{kV7!)dPd`4SuRMG9_f9My zA01yn{u(a6#%7%B$;4=LqN55$Vx-QIG_)p#PkYjf=UeA%bq#(Bc{sT_eO zK?R1_3%cAuZb_I6cu5IHnW_hb-!r}WNq-n`o58F^iNjMbapuQ{lOQ*=1!r6IZEXQ{@*sW#0f36yn5?kJQ;R;{x zO((uD(k!Uty%ejVTqs(;r!emfyH!yy#<&$vLwG+nC(qD(a~K>oIuD}^`)C!xW->77 zz>CN^-SgbdBo9=nb{G{hW${2-afd#`3VCV|w;nuF7FJfIuFErkC?o*93}fPEBWONY zG2+sR#cpUMgZajb_2lA` zj{PHZ>U8yTY;To<{LSIf*RM_{dvc?+;+5pprY3RG$T%EX3-kQ zMtPm&1BOkf%5qe{bo#=qnN9kKk%LQAu&4#&>nJ8!*8ZGn-KzwTj5NJu9cn1>Iz>L* zPTaDqy9~&ul;P5$ySo(BEK%xHI#Vw_a0ZgAveUb#js4^H!h2?41KWBD&m#N&!w*WR z`o>#tKk<|2m7v?%y{#;+d{AddoQ*iR0~t24}rab6GHMrZ|5qGFad zOOugRBB-@e;SoFY{4kFIjWCWeQih4KU}nAW-L>g$FFEXXH#vVIuu)N3Vw5ITSzT&D zg*0(Z(nY%{wX?%>aikVc7fYThST(6olcKcR$cwF{)NwevfX!7lEVe6yqNpI2706Qw z9W4~K=->vXH{X7*7I=S=JhPA2tiSj7{@!Rb3d8X4|NXyDDgFNUzdsxf-+AYqVzF2# z6#iB5j8Xt7fCxZHve-GgGQRnH$5(%QaQ6?7@BM!7{vUTAezkw_{mJn9-sV@wlbd@x z-#j>edoa98A(Z7BMl6Jo&>TPr|D?s4=Q%>?YhU}?cfRu-MNwXR?X}lld+lpq`&z%> zzi{EgC%GG+$n3`^v-=<3y7J)mXP zAmdWErJ!!&R1q#QaFS;!!X%*2EH&?gNjCF2k!KP%#W7$qmWRF(>WD-HhbXQq>M(UK z%0i-v+Y`IZN>qgVPK0q9`u1#Mg4{&iTbHm_D#KE#bP$1YBJ)|WP%0BCEFzFY`Pf4y zrt?Iq*IG(RZ&X*W*vE%nZ&i?0Mdo>pr-)L+gAxsxx>)~F?Bgg3Wg)jUmem~w9i+I( ziY-pvMoKUqAC8aQ{SP0-=87KX)zi50=oYRWd(u2jLXaDN2FH72hyQ@ns}?z(I=qex z9=Hp-6?#y$>qM5#?!REMTm zl96?v&Ab{bhCFj+vUSpErd98OKUdD^3&rAEfmM3vkWb#6`$90e0G1!3j{;ixgnSE`k3rNDK33ymai?I7n) zIZX4JQ=z+;yB^E%uAp#PI^zW|idv#%WK8BB5}s8R5z;;dp_wwW@9~6>h>lXPn7AS8 zXNlt^^QF9TpD2c3_U0;5x_82wIAZ?37vdaKR4sVJ$6bE(==pwGRlF$0B00d$^WYtbq3YgrHG*~HNyOi;@ohZ=a8hi%^x;$$zVZWLFQb;eJvao>+VqCC*2*`+aInPr``LGNf!)Matx^e48 zzsD@V-5 zFJz<5{)~n~C>BIT(@}{^31NxAHZg~XvbK^;&$HRhYB^)78ZM*SdaocretlP8Eiq+Y zmK(Cz&`W7~fvcT0a*gGKS{_X$jpl8uu#CL$>FoB%0l)aAFa3K=XZo}Cs;_+IE8qCW zHvj;x>rSWB?|=XMs;a*K{`d@(c%>P|W&(1@Ihff8)9Hh)?i*VN-wP6#=QTyFKmaKvA8$eX*p%P>?stFd zw|Wvr-|SYBH&n; z^jVY&JOaFc(zGlP)A3SX6vaYSB2gGrBq5+yOcLI9+bR?>6@j!NmXwV-8xRE`Hte+$ ze+VQ+t@NSfB@`#n1iZ;=ck|BJz=NaM6xb;|xD2vfl_Sb&3G^fu@R)bZc|m$Jj@*%X z&#T2M9iPdQ1#5aM|LOPHN%APAWS$+vm- zI2bG$A1yg|>kI21ZiaD^gobFvGX^NaLZawlPnY+OAjLhLg(_59wLBwlW z))LAepq0Ju@Ius&>KireT~8eBGX>f&S1<2oj1;*OL<&YP^CwyV-kfoB>Eyz99{(?X zKU|u-_Qs3MZlf3~YRlwBl~PodY^nmTQEmVM002ouK~#xMf1VEcB7?L-k5b+DS>|LZ zuv?4*sGs3FS0(>k?fjGd#R{lDSF&RFJ1-Hmb-wx9)ae+}MM4@?Ky@pS<^p-a&ph4V zy8z_w(n^x9fRf%UcKUp{H9R~xEb{zIYU#Oim1ez(CzCfF*OmK z^Ao;xe(r+VITdn6m|I82N9F!r+x1X9EvJ)ah3zcNmrp)FYPV!J<``H8SX)3EgZb)GqLxaMld$YKjI!Hhk7wG|61x{G!^V#S;%D-Qt zy{X#}$`QdEOuARg_VeguT<&sp7@`+*r{0Vo0$Wt7CzR4$S-AkJ#Cux1wNh{3dpA<@4#6-zFn)W4RR$KQ1=mHTLoH$f2CQJ(as=?}9 zIc=xgliTxv9j7~U29Kw~#+eiPS}?GuqJ^g#JR>gw+`Pv*xj=4AKyJVI=gYY(P$)T^1(arjr#|`@N+-E zvEKQ`Pe1mHpMB}MN9*fl`@27SZTt4_);9F~cCC7bt<{$lS}utVRaoMpuH9=;$47^3 zHsiB>lo}66b`PjSAjg2+G54xZB>(mQ{eL&tXe)~P^pj70_S2tb?8&VgX@Bi+f|VCa zCl=ovM%McuqQMb>0CFXjOOU!j%1?z{$>qGW#>1L@C1gux;cT9~`-1=BoKipJ(E=7c zFs+jI_vW6~!r2nccaT(ZEXPZQ(({*2FZb}FZvB}%~!vy)lFfOyDeJLY~iGjfm>g{%!jofS0Jsm1%N z*)W9HWY|jCC%1HT(z9y}Ov)Gul!|$gLuDQnF&i^F5t?J71OjFT53*uiglxcZ1Fs8= z2@TCOc-FFae(8(9`0qWP>0|fYzJ0q^t9|WjU;9gc=`Y>7bxRP0JkK>v`|M{wODTna z(!0#v+4Kj$K78XJxI6DcW3PGBNIRrVNX&$E}=7b_ZEGrap%!G-v zH@yDv@CQz8SG0M7(*S@UZz)3vUA=mBadGkW*I#e9+d&XC8jZ!p#f621Ph|Fq%zkV# z+rN4Hy<0b4`k9}jUIh7UhVrs8DyyZIz(s1Jj%OS7+Uv8yibta&p10$G3&%-5&RLF7 zo(CGG(`W>Je{HU`mskaFR+Ffm#tI>A9#MkPD4^I`^B z?rNEZLF4?Un=m<`c|v?EGA7#Y2Tv4y^OaxuWA0~qoBbEY-&?J))8?vB>I4{<(y&A6 zadlpgm`tn)Lj9<;*mdb8LGE+DJc~ERvz(4moHfes+pY8e-O+Gz=YDHiWtpdj=<=uO z()P2b-rIctnZTT9kW_k-KfCc!Y*&YYo=)d^eB^5rn9J!E5Tz&&C5#E%6u3N1nO&-8 z!^wQ^A8;Pat_T83y^+YAHB^zYc29H~-xeG0@Tew;AWENv>25t$$97w(4Cr{?9+v8B zTk=JvSkk zRu(SLAdb|sH_IBVHRe|GjC#|DryBDIbfShf!t!CxjB`cthc$$Ogt#mm%cM2-&nkJe zxV+8jqu6iSex%AIb<+rsnYtTblBwc6zRrzVP_Y zh|3aK!Xg#u6?NU84hwNtEYz`f!e%f`r7Yz`m~=oeEpN!;Jkk!Xhw*Z*vrO)z<_400 z+GnyIETSyVnNaUC(wTOpER3cYZB9Zp7negt6w~7ZWSm&2E|7M;lqVnxJUc-w0m%U& z$?M~N0SHXW@x1u$S6?G(e)7~wgcwyX^m;uCn9G+h$-G-s``(=og@bFacZcsCln%|3 z<5$eEvQ)0I3SLkoiH`@#EQ5|1J2o9e=4}uS!ijhJ3ym-R)z4Lm_3>mJ1b)3<4?OFC z`n?bDZI#Fr-8AA4dT#Ij6<~}ZW^;^7w1w2w8L=*nycRnu(p#r(X0cTNHgBFtlWJ#i zTjUyG-4;X-o!?^%Y#7PoLkxX6XFGIi$zZ^hZiZ|)UVrMud}-aAbo;51Fo+qk2_&(F z{8Cnrg_Op(F-#fE9x<^TPuD%1F$828CZ$ZV+%&GcxW%=;Q(elWY*tua$+OFbfzn^ks|yq6wiSA(adR!8nkBvDd?Sq_d>V zNGhgvs82L8M(a-$wVQR=&t?n0cAn*@9VIGuSVf`NMiNF)bDCy(LNP|Hl%y_!5OHz_Xq<;R z1UX_UVp2f1hgTjPzXK58F0LYkKd$y|ZEc-6apKgeQ@-y@k~AC+<2Zi$>8C%D*(Wml zvB~Vl*6nN8?>zO=^In2ONg3I0Thq5qTO$xw^qxa1`rQ4Qxen+^70Qz&_LBSg@k2X4 zD{77|^MD&A9tgtIt5i&3CU43U>y&FfOU>} zC_zaa2UZ11B~_ZG9^>aACl!gy%H=HMd6q43nggZ7G@+8{C6kt)%wd#C1oeAMeou{u zk7LBOYVUiqOH@qMQUQ14kS4>a+$Tq83D1+pAxtyK7kT*YnH9Pz6 z$Y%QPc3_3u*UzPUvIrAJ#~KOIDSGh{xl04k}%Apt<%B&)69?*38#aP z(8M~t<93CL@cH)2ORApH_=+*e6{Pa4Pl7Zgn#1aH;$#wFKpdm_s`S&9^;hEgC*D*) z(~BQZ#AZJM|H2e@t@x$m@QF;mx4irytdx?G9*!k2Vnr=NV2CPeVAU|YM**KZVjhk? zpXZB{c>f7oxx@Lwpx>#>HZJ-~`SrttrVnHZgCuND^-8qwq3`uWdJ4wN?b@KCjD52e zOI|^nfzX>x3%oWv9zluOue7?m51(`sM=jM=PAL>^+sSzKnn44=rOxnt#47dX4NeoF z$N?OZj9`6W^s7Lw7Su4#Pc$oWz0$RV#Beoo(3T1@Vp+uUe0dsVtuQ8B;rEi7=SK4h zXmjbIVNgbfbY_kpRA_E7#EVdzMe>X+uXY|*xKZzzW%4+do;M}o2*Jp_F3Y8fO4?=^V_*u}+K}sRz5mU;0936Jzo6jZPakX6*)Kbodo&WuAkrz;p zm)3bDEdx)Kx!w4qb#vT=BVOz)bkvT+dypHY+-8yyXIwKLs`gU3wEE2R^CPF{+fG6l zHUl2=6L>Tiq$d>kPKmLsRxKGaa9_&80^%@=RmLboC6bQoUUw(wxhz)%ZY`NS#aZL% zmNn_~8N`*JkeT$S{K5M2XQt15E;#YrVa~n%`iIJ$x6e-B`rm$f`AKy$z4p~sl{XG< zF{vVy%S@crLct3j$g$nd703%l7?c=*RE@!2>EfJPP+U8S5^A$K&2mwUk8m`9C|y`x zPnP%(Z(he)o^zUp3-ggX)~h~0Prcq8|MHDmMahCzu%{xNH5YjjS9HZ7C{I$#$&*Oe z@~}#y<(fojMxYeNhtRNc3^&oNHxyf5W@a7!i5VP z8yn9&^UUh%Dj+$;n7F3-?O%7^{0apWa2!OKkQ5?B8BEfUA^-(B%cGnmgc8a!j9f`m zpJE(k9zYD@)i@6+BN9Lf78%Tk1l&CQ!Neae)z68XOei^j{`|_y%K7u>UwGk#S6+GL z^Pm6xQ%^nh3Cli_*^g6ZKiIkd;YU|K^V!cBlLMUl5M-LjySb?a$%i2Cc1JZ@@R9p? z5coAbGBWMZI!LEh=ruXrV-qfmgFH_HvQbqZ#xp$vGK$!A!huAU~1LpY)&##~zxBohfh-Ryan={aqD;Ijjrg=0=yO6M{6uT%%3SLs^vL$Ezc$%jK!HHx z0ox8869b1N?ja>rJ`cwMh(R^p>rQNo?mC!vrVpXUuR$I-gA4~YUU$4 zJmY@!)Zn0`G;S;dkUe|?v4N&UDj7wN8Xu*+7U1?c;Spv{CaU4F5~aliR0S|6Mzzuc zZLAJeMbC|zG6*=wF$Ql=&I|s_%Zo3n%Hj6W4r{48=fT)BLF9lU;#4~o4r9{}wuaW} z>+s2&@pjrD4&utbYicvXMi18~=$s}`>s*PQ@Fc2X&Xa08>CCrbB|k(F$k~D-LK~-T z({5JQXBsW3>M+G5;@2u@qMw>i#$5&7JQx)PF;$Qd)5~V`)av=KoxETttgbH_VqJ8} z7zJdULZ$8p!aAZv4+q=3?KCK#SttgRI%K2Ns{r~C0R|=*D=M~IJgJqHi~~%$-H(M+ z0(LOoXOztFW|UV1O=7fj`|dY1RU&YwG+A$QW9_U{+=x>zqf^u#e)4AbKkR0@i@;y|uaJj$}t$7A8U-~ZA2@{*sxKm3Dl{n2-R|HJ)*s}F{GE#q)6r@eV0 z6Xb<5I4S|J=54#(e&mS1XN9gYFT;gcS>ZjSFDwRk4C`}k~i~(~rh;In9TMOp3`|$yrvZ2$I^heg$biHX0O)Ift z0yzr@gd_~J@*xHV>&}Ucsq#}pAJRx@rg|!5DdrCNH8V%+&Q(gU`5BREah{xAK6&{D z*|tahktfu+^{n%AH*3G}f&9$vP`ZEX>Z#*5{@SCfwW|6z|K{H)RZ4Snr7wNv!cV-g zI&&U&-`hOVT%`ieNYTneF6VfH(mcby*C}8t9IJCHw#POL0$}jew^9N~j#UVd6HMgO z`?a-u!yDPmP6Tu|$rhNx)f!$Wcu~v_r7%Hwelj|zapgzayLo~`$d*gfNhstK!eL`H zT@}?(6hc}UiSVc91#`|-)_t?%F4y?*`4 z7eAE|m%~iNu@XrNS;U6vHuS|HZ)TL`vPT4EORvP%*5k8Y)Y9Lvj~|taf-V&qFtQ9W zrFylnX&Vck=_+zSgq)G8tiGLiVQ&=W4xhzI&T3wI-#c!E!3>0K;qb(~W!@kp&I zrJ3NclH?yWF>Q5fIrciJIcV=J+`FjnUEevn(E5e0g(vaF$N{f^tb>3biE@qLxw|3mvAq z)Q@lon_+sdO8H_otS~sQHVZ}3=8HIreDFylgCUMQ{KN*^c$^N_`?rWW!b%_CM) zSw|XKYAB_uWXZNSf>!;Mz5et(DM2@BN{xMt0W;-WfKP%J%i2c!Y zetPTDnbyN6|N0N|R^jef7sW}T+TrwOy;8KHr`p|s3+CB0^bA576eZQ%84FH)JZ|C& zFQp~yj{)tcy3edRGXn?0Ssx`$aNGLc?7`c0Z>W*}Y2RwZ2jj-h=6tb0k~yFY3Llk3 z2*OUW9%V;^@URia9Xw&+pb6qkk4kDi2Z)zDhf3=~yeL!9lZqMlvFtP#=E@x z)&^*Eb$wQ-V?j@}a(-+a#^DlFajP_lV#aOBtIEf_mssSQqmZqiok0a89^v%!Z8bNkks#)6yo}vVN zyBw!|POa7#IF4dT#3;6@Dhd)JGzZyH#9}N{X9jsTLWugQ#25(pQDiBJJEYVN!OkpL z&n#IP#i`lSiU|osI}K&Fh(b;Q2d;!U_ESP&@?wcX_JKkC%UUhf#e3oStyaW0ukUS4|o?8TK6 zo!)fsVc&_fl#QGd-ta^UuvTb_iYI2N7wDY0Pzi;T=WtOO4M(FusJO{wbmRB0zuv!l z_4?tJ2OnPj?v;0b{*})?cJA^|KmWuN8yoZGT0R}_uvoAgWoFplLq?>z3zwyuh=y(6+KOOBpENG-??yKPp=B|`` zFm)ILB+Sggc%IcFy;NoxQK<E340*r;>Zno1_s7*lY~OOl}7x zZzlp|77VdOU_28b%9cXO{dxjwN9z~hg0j52Qw~OX^F!{`#5r}UQ=HUEc)SbarR&Ve z;WW{XyPDDSKYuDChU}0m znlKb{1o=Tw(v|kPjiX5t9(rOF7psb$1RnJnh#;Fe0*-=-Elu~czPtTU!2nC;ZsAi6 z#N)iGNSD$YUdRSD0(PZyqy|q-gfcZ17PYCxAi6=23psTb$f^FK4T1 zxt*n|uxhP5qHs%Tb$N2w{ncOk(!cjUvp+S^zkX2)5zc1=`=9=|snJ8c2r&yl3J9eL z00=0}A_3#uUVG!XyD8q@UZ;*s@68 z5ZOqfS&ouC(#_Bh?%xO2S+PipI>BCl*5%VinF;4LsadKBEF0p|EE6}8#$cM#5G`5_c~k$>pfXY9#-XpWBe zU*;RPD#b_b1JtOl#YYU6X+cua5iZJ^ab(f)bvIPa{z{>tDuOJ{Jq&RvC}o9e=r{s& zm>hFZdowB1*>tUp9>#<76XVpGSKig0gejxyI zIP`WLV>A^QOAU*K(QKDZRhgwSUxk#Jc|(!c%v6-JgmL+&JGIxEl|Q&Ps15dB32!&l zjB=GMxFQF~oInD7buQa)m5cY;2J4#n(e*WNd*LU4^`BIK@uT-|eEz6=rZb;)+BxPV z$VXum>w?0HrZPtyDwjpW>@EUSlZ7AZt(^KAU>3o`M9*1@?h)&OO&)@Fdl+k!k!ALj z>N4m~ZXPCyQ;fXlrRLj@6y6LvpORZ%Vd@L3CT*1jse}d6JmIlyg@z5a?FmX!T^{hK zj%;=V(R&&A0X+M_5hb^IJ1!=@@e8xfMd!Pp%HC=fw&uZ2W3+SNe!4LCbN!A!a^AZ? zmU`aBz%G#}oU$PdA`T$LyFm^RQ&qVIS322bR*Pz_3|E?*?44dO6@(s-hdm?X_*7J; zwzb67hPpJbHi4{;V_r&Pjtxj=r*XVeEl&YomiSp{^^^;LFpgFa%*Co`m5YGIxeqT^ zRHKnb(+3J+b5b{@V&w33U6sOVqkz~vWTV6xA6F%gErywwWGFI2u|mr`G8+eKsIejl zsmYx!3FCOb=8tTpoRYYZ23cZrX*S1^1u*ehN7blngtc^Y3Bt9t^8wCsf;lFMpcX;- zg?4qnz7$8ny6?8u*6)+hnUTS4JeOsM(n9K(MQ~cxe@L(lpdaK&jY}^R_ z<}6st7fv?jey6eSI#gEh`-!q)Zk?7HP-RKIR^1+ zo|ST>0`&x|$`wwZzwr6*BfVW)d2apuFc^8GT{%mA6fdz6@U~{I$u1W9!w1uuu~=)r z^2$$GUV3u%)Ld=#%Ffnw8nmUVDUNUky9h-wn({?%)_t7W{L3$KfBB{L$1Xl%m_{7O zIidgPH^2Mlr3dqQcaa9Nn9ZY{VR)=^SS%D68E`UG zPRd*jS1ug1p1P!Hg+eg%cEw2K!o8G&JyN93OwDIrj2yCX+wUw+K?Rk6z|7Tzr{4zN zrRbm}ML2Hngcom#%fEW!5!m(y{e3TD0L@quktFwlAHiY*<`|gnviy?C=&8KPeYbGu z)mjGrKz?$dynGeGha=P;rIGmP1MSioto>*6%)3aOE&o8oHxNuf2m32)U zkH=IQlo!^0|w(kLnd z)$z@qJ>`H5Wr3n(j>er*JOukkd&f!6CfwYKXnPrjGwq@4=hUBT>8-m0OaME$cjakl zALk-&?47EeReAN3jEqlY_8(AYyKn!q_wVg~ z`tl-;4I#XjdjmT-OoDc-YOjZ3WqkZt3@0MjPTiyUsMFo$X!j$rMZt!Nf<(j$nd>DepF_p5ELBLd?RLvtA=55iPtq5Qyw0&U4{g`1 zCg!|a3svpV2S90jYZ`BR9E!b`X)rL?afSst3IaA^S8+Z7k>Jq1$ZOGAMMfY%_vJ+K z5=GF8MP;#6M6&zxagAv9D9); zDUCOhm3W%%;Jnj+@8akiu_0wNGzJK&ZqvozG zP!85o(-%s>!(ezH5Ld0Xl3e6ki{Fj1`#XKz7khbqGncvt`?bAqcaA@N!oU79cMhaQPz*v5Cr;!Hq257>4J{HYsL)oUX+} z%qQ0r5$_x<)ikA9cdbK`iIL2CCb8^kM5w^X7|KQect&{^7K5Rk{+D!X-pVwLzHEq>NOUnvR)qr&4q91v(fG#9>&-h4{~9DX1RSQ z9ZvboUlX!__-lXX!-sci|KMj9JBue)%catEIwgcOn@!ucZQJg2I&l)4Gvm?|j~+#b zM>hr=+R`|C5PPnia5BnFCy_L%QzPj?uT;#eDXmw_Bi@VBNTw2(CqpdHjr3-PesFl? zI{7?vRF@b|TLzV-h`oPed>061MFJP$aYc!cQe9a+G3IzNrEQ@);?#-bq;@oyl36^6 zVw{3VPxtI7JrA<>`rNMLLV)8DClHL|%%_OS5zHXUD9Iqs5K18;kWC>(tddfS zS;;3f&0|I=9XP$AKYD8ZX@ve&&ecC{b_%Xfcz(#x}xx0Q7-3MlT#`yD<-4uyHQL$(M<>JXvI2c zBUgZV#(*)8_fjn7aS=HpJwg`u6S&Td_l`)Agc;!;cFgf7g7_wIMHiMTMAfz|!m;-W;f z@UE8@Cl+~q@AgxJ{p~o~BXK3sIrYSSLFD5uuWt;f0Nl|!fO(-5m`N$D=Nv|;o>wU0MOn&g<|M4sPeC_&IzrgjCW_wnI3}rS` zvcR$s%+eS!vfTHrdFRkpWC@?im?RG!Y?$Z7?U6fe7V0c#eFTNg{_>-c1Kcl2K(?<+6=+^c)jpB}uupiHcCJ>sO2EHL@@qt@ZVT<7|n zhPfqIF5YL`2Q!4@Nhcq(p%YHu`~2izJ|~VVRU@fa+tQh?bYY)4^DTJh*0?Y~g*(~i zbEDVf@b%{5)st9*rK8?ti!-ho(MQqpE9H(aO%7mu_aU?%}KP#TeB~z<5%t4)vb6M`0!8v8^SXG4JP}3IXSI+(mhrM?5 z;PI*X1a#M0b8Jl$XfP&rGf;EQ825LkK{<_v7kpcvQ{J}YWdZ^!-@zS?gXwr6)fTPN zNjcT;@lu$ptWPBk%{V27P#!x=JoBFH;jX#Bw-nZ|3YyKCnUgT;BA4?Sp-Vb^b9&sh zwB^{MqGkdyN67MRj^z`!%Ey99LRG1H1PYiNhS)$^$In;=97cQ!2$eTBS*>UX5;Hbp zIZfDA*OGm(R9)?sA2R)J+vzMwO4vT@B;sCfG_1{fv7pPm#y}qNnacT;ZE^Wfsb7x^ zD=9-5f$?^0!@I?WwO{`7e{w>vz4oeV%Cbk-}!$1bjzQm8TbBV2=OlD;? zVp5m&l+s-L*)~#J&4&j)AxSJH_1NS<77jzji#w-dsrBaSV{4+n z`nZ8IGP{M+eFd7Q(;b83nQW{A?>BF}d3g1W;cRM5%zCBrSHJZ0Pd<9)!imn$fBLx> zo;iQv(ML|5K2spwgs#>ZtmR zsh+0%xk2NUS%1D*-azFRD>Z5&WJ+0ku34d;9d`M}A`5{c52$B$`6;vh%2^Sq(cajFVXpA3 zQB)u^vf(%)oRoV^;+DgDuW)8xtU^8Z{heSq00c0I)3Usp%zS+|IXb@BC||sE@jD+r zJP?DO-G_nUH7jL~=NpZN<2bf$w_2?QHskac5z-`@h(Mt7a_i!tVDbb1Sb56w zho{qb$@Xm~0l)mqU#35{ni>7LyBWRuFVovspsv9%0)h-71r!2EA>t^4l;o7=kYx!; zD5ZoZY3fmi0hq}^9%Vkk3@cSrNOR1l5CTTX0g3^nhz$uL2qln>^EAa`LJ7-=JKiMB z<45b~J}H}hBD4QcGQ0o1-@N(o;LN3kp1ChY(?J}K^3>t=-QYE!LvTf{hdmID33}gSuNmPnYWZ?|qwiHT;ftbpG z(Atu&@F~Yvt8K0@&u~T5ShPZDheL&CD8q|@k#vj*Qq(fdP~xWtnG=Q~00Pd7479U^ zig|L2BRbVv1Th4-x^$d-i!4M$h}7~l&nblaX+HLi)k%ESI(*5Z+H&)XKVFN=yhR3x zC~fC_p;o>dCv}=ssf{(o@#5UxuPF6?vBucOB}peb8(VHIALU*?4;?|1W>A}r4Qp^~ z?eN{^skLA4{OYw2j{ei(cUI>xua~MT%e#z`psEV*8XHR*)@yx zq2zP9sW6PfV#LBMb~4=J#cj6zt*L(g;9VZvnnhW9XSaR!*)M(hOK}_v zg80ap3*UJAb%X_-mogbA1aUmhNNcQ}rpc`2PKB_kIOjbjv3yetD-2gw<~AB-I7}yD zl=U)Ulx8`NqqGbHj#61lQYPgii-kvd)AX*&Yxjb=HCdik>n%2v$=J)`DD9R)cb^e8 zgezq4=-|!moj0#+JzT7}_6Lrt6ctT1O$S0)C=@2+ahhfG^YfnP&1Tc59=rU)<@0WG zsIab;xth7pr@q-fEg=|lw+wds7=wwP3JW{RX~QW$)@~M> zTD73ba>`}y(6u4KgD?~IhEC^}$}i=0RzTe>O-9(VvdL;VIY+93zM5-UkxfTfKoDb) z70D#PN4nt@v(BlLmz=_EJm~d^9L7+jCCZiy!ETT`r_<@fYPss5R2lB#^OHVWoKN$`TG~XOE0Wc;RGpB#4s2m5}U0S1f95#k+PW z=3X$jAh+%?gXu7zv8Oa93>b$CPb$rt3hj7gfAPy-{;_p4DFqN^oA=^x{ys!3#4JDn zMloPGKr+M%6yyLi5CVVz%~QZI6hX*wfWb-T6O2-l0A9kp8l-+qvkWl_pa}&D#2J7& z;&X^1fG9u-;u1M7sRQjV(0-=nA{n)wWN7Y89#|&4DJC7Huex;d(`C*DUXQp!r%jEa@y5&vg zd0G}Yo1qgYYM6||Ip1&&PYq{x-I3eRR;q2c2&yTcvO&dGpfWI~upllSEZsoXDUsfpYtR)(5eB(u-!27!BhSDjX^GXyyvuUgk~evt)>KH;R?q7W}QM zf4icTIic9lo8z+=zoEalo8-3nJC|?2{nsP+ThBl7z47KRTW{%wQ}wmSzo&LS3@>db z>#vQt4<1I-<14MBH!cpZ>cOp-!h@1xHqw{@O3HwYU07q#80~#EWJqt}d3V3v$!Q?u}AbVS{FSVT&mq z9D1DDT~&&hc(={)3_M;C{G%wH1;u&P1K^_z){K>uG1tzB4g8tNu!17yPQc3CN4^MX zQU+<7=aYnI(@_YVHj=Xl^gtm2%#ebDJ=25PLNZYBU|t46eAG;hrlv%gEJ#A8<0E$% z=AsrckjW#!#X#A2!})w|C@=2Y?uO4)SyinS-bt<%!@{bmwU*TAk%f1=_fA2dN)^b9 zQi2?WDX|a4;`hD$h26I<`#V1b(eUu$^N+p!#lQSlC?TWKNY%CZR+A_B)ykS%8R3~wxmy3UIs#(th2M1DAM5fSJ4h9}kr)c?+n zSHJ%K-x+M~JaYC)mSw8ds%ct;fOfkTgu!$=snx1kmiI=JryqOb#h0FX`I(I;PIVUM zi)Sjr(`U6WJiq?@G7}9x5V!Bs+2PJTG=9&rAQhWVZmJv<)fTf_Ieblew2S{L-? zR;!gFsih#1nPJCDlYk&3sjDG>5-Sm6rc24&D!Ce?9*WcsEsqL34q+x}3>zYX8BuLw zKM&cVBV3w$6xKj@dq;FFFHad?JI$r3H1;(7UEFwa$X~Cw@9ZA2!*RxnPg=(>$J?M* zK69e>pZ(m=luFI7{^*bO`F54n#$yqlVfXd#;B-Q9+r&jflsk zJYUk^y8kA?NRg^Mw}6;JjTJT-$R^bSpVfeo$JPmG`HaxxTI;cE13-)ejc_e(?H)cV z@;a>C4rVpyKG2G{yqY-N`HRoZ{Ih2PXqv{q^V`%7p}>J8ffNCZ zAR$PQX_f%Y(kupqP(T3$gl3Qz)6k?0lV(AVK#~V3$TL8K%mciVBAh{-ASMNvFk(Q` z1mYax1hNq!h*bg#2&ITstQ;Ks;}_ePIL!S!9nAdGSN`dpj~8M>$iL-t2qFKP=l*nz z`oA_({o{v!_H+L9nNNnV|NoQBzJIm%=JkiQ=l+I)YAz@=l@_VBV`>R_sDyX5JkDfZ z1ofSau0eNzb;BJM6NYYCP9#4KW-($JCXCG zL&%vqH$JH3wW?mkidn=mlbYuC@?g8X@yh>0+mLR)`dFzA=E?!Hnq>*5W`QI_M$2GUjC}$aY7Ve{%lEA+ zuiL61q+PbWItoKNnjuuAnl>lNcVwE(k}A>aY{H2v1^#I&EO86--)y#j60%QBb77RX#A~ zY#*tEc;QBflkV({8CZOlP_t%@&n`Z<*Eu1^;!0t)zW8`heWJB+Db=+u;2!4Ki|-c< z`#p62|6><72YSO^d|dmuA6f*~@%ub|B7ojb;VdC3oA@mc$4g`$=vcuAV&Y5th{kX?Wv| z*vy5}iim%YLobFCD5SbCu;TO}7b3PkiUOE*D=Ck8;2~b|$1=_$P>={ysHlfHjAzqx z_MJKMP*yTRu3kPOH;s-dNy^_olQu4+VxrvMewX1NT(rgMhr!{ire7$u9r&)0aPU zV)4x9KL3R*N&169xm;EhrF+~xxwIi+eC^hEWv<2HLRPNd$dS&H3=x6qI?K(V3q5v` zoHn$5njP`E>bY2r`1RG(*NuTaa7iY@%v6$HZFYCb_)*n*3ud?16XCGgxWhFoj<;w| z&&K8g5I?}#AbMQRN?L9$0G#vbIPiP1=cSa=n6R*{Rp%>fFFgH9sZ?|wZ#W(*Dl(^* zVfyp!4li(qVH69xC<@2N{VdIwS5{80E}vLidF-(#R#z5V?J9|lpZnF%o>$M13U0zU2Uyu zE35UBZmCS*6b27ftN=ckCPea3!j%?s%(8i3)|XD#VInGfHrJ%5xiMNRnG&;7(}|M<6T!GOiq?!)6G&L_K9 zpSbw!$qT0~%j$GGX_^j)!&$#r}$v!nnb4nZ769Gf6lu4(TM@A>1IE*BT!AQ1^CEl*jeP18)) zF)oz|LSm_#;WPfxBx5{WM`9D@9Wl`#X{`nY`a4(t`7a#K%qO284Dav}e4d7f=TE#9 z6sq@c;$ZxxA6Lzc5CCEJ?mOAl4Fggv@3$K@h?)41z!qgg@2Q$0t4iJf5>GE6;O|<34`lzjiqE z&)$!s$oG9g5dMv?{N(zNT4sOr#(P`0KU!RBJv`XI5)`-Xr5UsFfH|X!^QBV5D~g)f ziZn||9hNPRAYBN}c`i!?L}C3f1u>9}pwi7&Z^2fNwoONFanSR^0_La&9#Mi^s~%@a z0GX6Isz~DKIF1a-f7l|^n>X%#?(}6f4&E7WRphZ0Mn)2p1G`LvL+bY|;y8I^kD+}$ z7bQgo3<;uHRPjAOcJ+`ugkCb5vb3tYGDEY36Av_bJa$%sSxp`t;M58UvSyuJ`JUH( zCdRc!YbJuzFbM>HOfm?|ia$EZ3s5d)8MB`Sj3c5bI-I@7!qTlo%#XSkWiiWfsm0tR zL9eT91Y@$WIN|J&g?Qv zIxE)s+XVbu>YId-tYgURokfl zgQ;?3`*bNS)!`Q2}vHh*|IdTmA6SG74`S8`sL&|-m|AM$b+oq8CS!%0sa z|8Uj#-lOo_PzzxJ1wg8@@ZH$1xnWbGqOv|JoH7^z$xCDYL`4u+s}=zH(Lv|V3%;q*9vFzNv3BytNCJHMq;tVb=`3gx&W4U zy#V{Hvi|bT(5~FOztCRa6v^`RK+>lVcYC^A_RAWw;vV;iBI%5ZJgkMxO6vPs&RdeG zW`0&}-Ayt=n2Jk9K_PkH2~FDpMSJ4_+rdpe= zPEH6TZ@&Tng^*_xhNB5oOo5q?hR;dz2R8Flzxai+z@Ip|k>=T8FsM{2vMe7TA4`%{ zC>9Ee?#=A4Z@w+@3dk^2vI^n?Hjh%FOj;BpHyx1~YGkWfv%k&Qk5~%u#z)LLTGID7 z?`2jDIS%oSWktWpczmOk@!_Odd$U$+-L)@$GT+CTqi|Km5m{YSs|>aSVDd)Kz_?A*Mk z>VRNCL#@z2LAF&LrR@AWD+C+i{j!d%t>iUyRaMJ9* zTEdbf{o}9EnGGcgA_%e!`pgCkknkEo45FwJq5HsrO7u%oxKi3}l#p2@A zYGqy4=Zn?T)%y99>tC2}UKYgCzOn6-EQTmWJY@=JkI{Pv)OFh{DH}V-}~P8E?&HtBuSp<48t5A9!ipgG5$AtZhL#X zTrPhstq(u^uv{*OVHk#?BuQZy_If=@l78bie&giHlfLgyr&EsOe*3q7TM&dOiWEiJ z-QBHJDp{88@9#^J#4yY!z107BWkx7P5dQ8DuesZMpSgS?sK&OC@7k#8haCtvo_|U>ND*a%4q=}ugrP)C?lMTNDhBvt;ar&*` zogm&7{8203Z)JIi4g_~o4!Sfu+E1}KW)SP|xd5j?SigswyT4!^qLOfrl}9|=Hm<(_ zd{oMMQKFCb)?vECh`Ua(?&;OV3tbMWcxlEoyof2Yg=(>|&5LlBRh4WGnkwkmszTme z{$TpxvGCdg*(wm~^4cip#l*V=y@CiU6>X2@$s|7Ao@+Jp8*$g^4T`uE$i;nch9e;6 z(`eR*C|(3ulQ{_{hlLf_a#n-5K!$a0-^f9W8llQO8v9V#UosYE#a4|0X7#sq+ z0y$2@S+U(f)x$z%(#s0X)ghG+tO@I7tH!v_Opw&P&DZQO58c7pi7WE_gNX2>?S}cy zI(TQbo_~1pnSbG&1>Cuw(AwteKTsZfZ!oLw|LBtO=2PZZFVOGT6uKmGpj>`mUla(V z5iiQ7nKNa~zGXg?2Jf!TUVjO__e5=2Ub?tjudUS^S-DYiC!wrJng-LDFI4Vjl4vvc zZ~={{Tx{|zM@8PrHA{{X$<_H$m8yy?DPq^ms4)ry}H#K}P7%c8=9vNS&u zv<|_6B=LD9@uDAkd&EMJZ>Lt0Uqij)k;XQlKT6nBoP%o8wDRnvd$gkaW~qcTPEYrO zObCTqNbJzJhM{E8Y7}S&jQ324lc1bVav0_wIqxJ>C6v8ckVjb%GBQl#EDnMU zx?ytBiTprP1^I~CU9-4)RsmhWjd;pq1Ek5)<*UuhLUU^58h7RlLK1_Ye-(U5WE zdVF@K^-6R)(J$;JUbP@$E!e+#m&=)mMvun2DzA@<3uo99VWmKm+fQ0|a+I)PfFj%T zH>IZxG02F0`Z`Ep$VNAoEpP%P>&M-_(RRvKx?)3nK zje31Ho2iQW{4-CV+F0+*mtK7K#Peq>D{Xqb^)APSC`_n7PA8+iY4+w(czDEGWOZ%6 zvDy$5)=iTT6CMgBBra=g^<4YhlsEe3!&)NcQe>e(p;`Lw=s za6hqAm|7|sKz10Bq{Ji2ULsQY z{U83JAkm-x>0jblw%6-58jU|&Et^iKNs_eNZO3tJ+p1UVYEioN{X3#4kAg`nl9kL0 zn1a9xHrR8f$;rznv*C?v;XW@ll{`%}DT;}#X!q!FaPzjV37EAN0p&cP2oeyjr89&y z7ikrN#F_v(Rq!SYVzpSvA7*ATD@1yAVkI6|zCx=Lga1@qEiZI-v+^`NK8;;p)7+u) zD_{I^$czwxP=4n@_V#;7kwBb6fFZ&VBaj0CAVe4t09ghRLMfqX#FpEYFZ@^fr7vJX z1(X5^00k6K000C4Kp+XFPW{3{?fikYH%mjvsv*EGAqnJsN^>lEgdkS%0FDvkj^j9v@7%ewy}kX7Z+zo}4?ehf@gm1@ zgb+f=pSB>s@|CZ={r20F$z*eL^PP9z5d^_B%~xN2^}`Q8gb=>^>Z=bQKJ4{+w{G29 zUS59Zop*lpqaWF}ee>qcPN!qr_IJMXojZ5#jK|}*-+ue*)vKe?=**cjpY$~U=%Sy*Al`5#(;rMciA_RJAna66(>ofmb^T$MjhKqQDFMPd^9%MOf~&5&xR?<;#$DV z4*^-8L{|g>yVlwK=$(=>}s6e7BHBG!m!c`LMjPmCW6;l=aMRRog;o9*UR{Z;s4rOd#vhv9Kg0 zg(-B$xvGaJ?(0j(6SgMgOgN!&XyriR_>|29kQP|Piv`Sa2)AX|J}GbSkTE+Ekov?i z3jxrdq+TMCwoown<1*IXx9e7Nn9U4HSKV+ng{TqDOy1H1ubK3Z z<<9LmaUv4s{&HeyvG1j`+VFdyQ(gV+N^ts@zPA3e|J{D!;Qc%Hajx1TpM^`#SHIx= zqv!C0H5EwB`R%#Rq0*GIRTsC$sf%V~&Weh&yC;J8s%Ue)FgeqK=g*zg7f}g-@%HF;f^J zxFqm8WGun}S<)&3L$qd{jVnSZ@M!>i(HS?RL}JvCXP5|ikW08Mr->qX0J2K);tHE5 z{On1NE?41f!0%SRH-17=F%yK$G@qpM4n<6m^cqYY} zS45$n&&H{^7eH(aU8$B*qZWl~IG$&MV+jFsy6ihcj@k5GHJcT(9OPb*hYgZ8>BBl; z977m{wwDPYet<^l^gN@Hme%7B29p?MF>Xpkg?Tfe%`6~4k@UIML&^Rt<^qr>}`)A zgaTw3SYv^UB95UJqDGb~e3A;DN&UVU97dVpr!dN)4Y8R51G3wOb%C$^=HLDoFTeP+ zk6gH*Y5H_JOQQ7G{`>#(%8frP>NLqmsq0xOapJU$n5okzU4bAARfH@BHp> z|L9#VhIemW+1uUw+PA+ALCOof=enh0Q4x8|FcHI4tJNru_V*8})q15`lLh93? z(BmJUU|l4kk|`}#8CDApWd%lb{7HfDw9j{@#$Ig1DP>a3Fd$qYL%Y^=O$v;ez!$1Y z<+-Iw8>45w@G}Qje@Bwj8@Q@pxp{m0>!%g2{@C;9PM$Li`$eMycX%a^`oNL}04cAVb64vMbrLld|S7lXkxKL$C zU7y?G!aKJ<$hj3(UoEA09;XpA(I{Kux~UgEhn5 z5wH+2i-i^tC9Q@ljHHoBiJ~a7DRq<0ZnmrHa<}fS>uqMOtTj*C#bR-5YwP{@-(O!}@AZ0{o12+T=AZnNfASCi;Xk}~?b`YC z=WW}5`|Y>?=HL9AZ@u-_;o;%W{oK#B+wJdu_q(d9=5o14qfx0;&YU^Z@Aq|Gzj*PY z<2X;AJdtI2adELysl4^pTWOm9@-P4L-}`%iZ)RrZ<(FUX^?J+8%Ph-&(l+}~TFq?V zyY{U|_f{`oLe1S3hdI_}AK6bUngSWT>Khyr85Si;@?)n{z^U(hV%RPPjY;ezw$rta z`Kf;*S^%qS!+2|fHqpWYHUH}GQcC6Vpu~%T$RX`Klbf%I^NX9WGaDD?SW=o>T;VL9 zyCv}6nJm1-nPPaY(SA4Re0YcMnJ!EG(^p2UME1LW!vOg()6Rp&8xX;uvE?K{Dp#~ z$)cypL}5~1sYmVr2W^{-M>mbuy-fe%Lhw;pkt7O+nDU^+dv;04Pjvmz3}HOTQP2?N zC@{nHY21IfL6Z`n#gh0D790L#t<&p+9>pj!i$cek(e>?!F{XSbyFBomjL0-oTVZ=| zhVA<47otp-cHCKgslz~QJ8EPu11?*d&6U=~m9vqQAB^p?(b*L7hs!_r)$M~9`yZ`k z>3;U)HGa|Yb8D7teg5e`Zu@aZ*_cBsCC4!nJy~y=xv3?KC^D7T4Hy@Ab=GF!C{qyc`zZ`$-Dtq^| zM55~ALGH6h`Oh}x^9N*=HXN#Vl#KVvlN+b(4=xG!OC|sE$ydtfKOHW7j-NSC=htYu ztX4KGf-}WB7P*mOHAY^{`UU$jQYhPY3C0*nn;=QWN*B*=>AQ;|tFZMZ!3L*iyuG^rJ}82i9C zxRJ^GK~HoohZY3PLW)Wd<$xH#7*Zw z^KnkeZ)9rXA>o+-~^#0YM0Zag6~qW?WU*%7%RnoI*G%4f`zB71R*UGKvQEe8kXE~ zAk81Jba%2Zjogqc#Hk$U%a4aolyJmG8W&n|+!x%Vz{`$sTXh?Ghc5FPE{83{pgnn! z%Xik9O4u@eF*6Vf8 z^G2glsZzT7{ENd@x7&Q;DyfuG9-(9NQb9&Q@gXx(JM4V2W)%kzkK!P5L}^m5 zcAwl9Tq{Kb3GTRbn0GJ(lL_Di2P;;W@w&c0jZzR|6r@;}3CKjd0d~g8U;XS~{J;I5 zekE5bQwZw1-s|fwr z<9W2s>T2726uDi^^)o1G3#(j+0tRy=lY)e{4)Vn_r=C0abhJJ0Sp-u#I*k=HW(9(A zGBCn)e>~p#)alRs)xY}JW~+skjj!G9lmx57sK=_iFR!l`S7G9Yz z_4%X3ky9M&8YFO~kZaV-YQS4uDs^rH3;x0{eEB~%HG>cUA#uF;xBmdL9Ap^ahY%t_ z(J%!7A&4QM5WxUa3`|o>)s?^W-%{BEz$u^*_z&O+gb+e1C5b?bCral&=-nU0VF*}^ zcpFe2L>8n+fF47xkBJX(j!^;(5&(ayvYBBx{9}NQ@B8=e-TTT{z7ogrWHK>L^PP9z zVOe%_b8|A8EH5v=@WKlaLXP9+=H@mxH)m&O1wpuT=g#-O_q|Le!?Ntvt5**W4irTp zgcJ&eXWQI!x!hzjF$}{njC=R)#c_-fvMh_HX`bhY!{M!4w@RgwuItrmbubvLt*x;v z`$^mEKWQ?%bMxUxcfWJ>az=`$QA+JldMH?n0AxV0L~IHHnvC)Sw;xz@6vJSr1St<{ zp=`ybOH!Y8aF!u?J(pWJd1G$RVf{ zQ6^I@j-;vz;X@s+S<#B@f>7eLrXAcKB zqdo=hhHG5Rirmt?SeOwK-lXIN(+TO9{b9t;FXyZIrCF{rpCF265;q}vZs}i3FLtio zKOsAGbuktfd%@Eijqjr7gRA{-e9C{1(pN`pTJ*a<@2z;2tnzkoJxRg@NFnlM-!S}1 z5XT&&=TofHQ@6AxD!JJLk+7DXUEHm_@qm8*@0ttWdhB!_zWrkF_g@abf1du@Mdo;} zARO0DPBO1M;>pMSnS&q|2fKKDtJwM8^Mh}kWFDWc99*q2FR%PO``TaQS1$7#uNY~O zjqE}wdOY7xDM4Qt2WT%)>4cHRj3g#HMLbS|f+EuCLnDaOTrJ^dN2hA@o1Ux?4DoBbN%D zWs15ulbb^Yr6P1gx0?{)dKPEz27cc&53O*_#8e7==ns=H@KP8DV>%2E6NZWrj7gaC znA2$*5eh}|NJm45WfdMt8t`SS!$2X7puxoKKDX>7OC`Z9v{wo5A zo>8-h3{5kL-by9aO(%Y`ay(42qK2le7teL6~Twz@W%X=n~G3oYXd2bMsZt z3+nZ{5300-CDIF(j0I|L|V#N#hTH*)u}g%J_(dOzb-vh;wL@^>?RDJH@=$Ese669NH+rcv-(etuQXrQm;E&}3Qm!i5VQ$K`UlbLY-2EiElAEq&@! zpE`BwlpqLeYipXO0RW1{;?mO6+}s??vJAtVJb6;nwAWvM{lbL{k|ZrHEnT>9A)n7z zDwU0mjm5>qa=E;^y1KNqw79r<`t<3Qm6Zz@E<6Lf%a<>oJb6-8)h~VNOG`^jrBZ2S zWkr&tPeuX$Qzx@`@4a`tyY&-4`{rO8(@r<`Z$Oxlg<=iU9E4MvkwTEq@ef@q3ur)T zJXFn?;?>z{8B%xoYb6sjMBCr&F0JE{$|}2DUHeDCqB3*>Du! zKQxBwa5#+j(WvzTwhv?9ocN?Y-t4jb`4j)vnAk)lQa!=cc%ldRc|8Zl=U@H& zZ^>t#9xg^atp@&QtkU4@&)tfeTgUs4wwA-Us3cp zwb>-e<_k^F&2ak2pPrEQZQ{*wm3zsgWg*{oWa=>cPjrkcqlm*8_L zHIk<3NM6=>OA6;@wNfn&DCVJI@3r9qE#y@?mn-J*WJb?4q)t)0Zd4V4jWxhFE@3 zv+-Ug=O$L!r*(rV@i+d`{`{wGVb%$y5t%_y zbKGXiLNg+dLSX`R$8q_{3@0t#>&B@aDf4Lnx-rO5IR<10sKY!|9|J|pBZ8YS2Cu%8-ocPlcUM((4&*J8(Z&yLA>+jkGK zGadRMNO>zj6FU+JG(EaVgb5oI$sl3{7-UmAGlrlsFiJ{|&COm3OgKZfLv{}fz#9u8GAwT)DqRy%#SLAd)Wu0IMzRYh_C0;LR~kP+<0m7p z7ll(JXu0@-%S?w}e5x=?Ps}b4itb)>G!GVRj$z`&VyMRqGj`l?RGAg6Gc%J#ph04vWCu$&i686JwQxKLkb1brq5 zBLJy1fog5HyYu09zyF<^_wn`Z|L^zT+iug|?XJ7FYVE&$e)Alnxpu3iYS}^|#{vBO zmCdyk5s_YV|H&AzaO&@NoxvaybJ?|m%yXlOH6Hj}L0sEZS2ODIG2`|FN5_Frak)5( zq27QT)12rcT|GIw*WC+-eiB4NWaLsy&GK%P_$E$i`|DKpOk_>1yuv}5?+{9+Fksn9Z0z2>OG%kL&Xg$v1(FrKDa&Cd$AXjw zxEkX@W&WdSG*5BGg4_%VGR88AhIpzm*`&TSw!I{Dn9=sjOkA8-9Q9h-KMl$4{8-e+Ojt^*cL{ce|%Q{Y#U{aM6xBGqbm*16j}t zzB3L3m@p&_7%6*@j5(S?0hVzb#Q|0&KgB};FO7mYxB6?jjNh|nJ&qQXeV;CM*c$Xl zB4bGN4!uA#8yFTnNlvs4$OfXoEOY6yIGHL-oX?@;9`r`%nR@Ho#_xCA4Akeil;TDs zC|AaGBV9eDmM~czs4ups+xpRcr%;xlirM;&hPA+Dc7)jSkLH8Xylm7c`yw?o%jI2Bj9!Ca%$gu0%Eno$aP%*wQt;D zmsWBx7P+Ekhe*i`Q(j=IMuwt7T!bA8WGz9-rcqJl8`FLo0va1GvNi)ND|W~1+$>8V zNdsgor44~%yKHT3a8E}}L+l4~M&qjYTr>5|bo!(|vNGj@T3WEN+!2ct!$TnW&7gMt zbfk}3ISkjd!9-Qs1GpYh9k~w&Emiy}P74Yu=rVKFOnwS-`<#+a?2P%YI`~~WJdR>2 z4@Qh>@-!;oVUkIT8Tq($<{x{Dw?<;K-(nBmEe*c6-1z+$y&GAr>6Vv^V(}<{{;u|O z*M#Ty@Y>X-xX!Ko@wJWPuP=oE_Qm)~@zM*~v*&VW{t|!kjehP-3(mQ|8G24xP&gPH zUN1lBM6`Ak*Nhl&{_ff|{t%;P3$r!(qqLcmn%QL0dmljTwQa#MBl_W*tDM*dP zu#HG(0JmLtJLf)h!v^$)AP7@$$OdG9t*qxqvF8o;tksqLwjGDvXr!C%Ae{t>nRk0T*wg*M3@9q_vnjkuh7}t`&R(teL>S*o?E?@v ztVHJOf?nnF6?t_gQ@MDiT}TJE8>dOhV`k98!pqgi!yA<2a{}TSxCi({BE>ioaE4+P zE^>Lu62^~ktO}*Ox3^5YKRaL7^*l|}&#+9EYJ)WvEkSkI= zhQUN&xJ1w6(Fl&%Zl;)&(^8-5+H+iS`RZwr8#cQm+fPDdM<81FLp}l&1_?|6gEuSu z^2+8{i(k0g*Naxy2&N@xPh(M1n!VlX;kQ40+MN7r`@MtCdu%~%&7O3bl0~nM*wY?9 zX(RKLb1TcW9`X3@n})Rz!Q7YkDYF0 z9FEO)>U2?(u&kfurlnrw*4R31*nHM>g$sp~*Y+N9p}VraUMv&_gFb<%SSZfS)=q59 zox89W21lcVhf@!CJuqpL#)PV>i|cE;&rO?_6^yl|{8t8rtZQ7eBg}x50`vs3rDVWT z>3AZSoZQNWG=jt7z@q|8(NJO1P!~KS2_4Attjb#^hr4h6>&JI)w%_@!(|Ts5cHza( zeAXBa1yTGFZ`pJ@t=H=i!gjm;Y{0hL?Phg7o7JPpzWc#VE|8~jPzsPtL#d=Sr^lH= zkAY06tMMdK879$$7{{0;REz~peCNj76a)oYta_s!71rTwq*`)pWhqIHZ4yZV$h)Ld z$E8GPme^1bhD}?@)XQ_o?*ybui5kFrDlbTJX4)fktkn278#b5mSAKz#8EamGN zru;i!6afIj_}e!~ZweR=5DE|qBm~kdU^x=T0MZa52oPX7`uXRmnHs`QcCZ zF^c_2yaoB=`Z!|a--F0M9u)WwQs$p@{U;FipE{X6ynX%F{o9|rbg^sqAEFC8(NYpk zE?Gl)bPEJ`yFn~?5~`KQ2&yz$iDIbbeAlezxv@uV$2}Qlj6&%TDeJR?ElrB|1PvZN zdCj_4&^=9xp2p4nF^EFw#CZ-3K_ax8efEFFx4gPl%B88aM;s94P9FwAo%l?*o-)+ormkjv`z)rGRfpz%of zj#9~0S9DFhs6_#r%8}Rr+=%Ca6U}Go9!c{0$u7^2J zf^<~o)V|}*VX%->`wXfMdh5C6zxRV1kF69huE*`fOu5i@&$ge;(X?5au@KiVJwKu% zQTUp-e0cEqbKX;mnby13=G;P?IR>L!i=xnC=OkgM#-o~g6|2jJFvjEd!DQkY!;&Aq z;$<`E`6Fqx%usH*l3^rwcJ;gQ#fQurccaR^rk6Q-cccGXKj}YsS!*T*bDk1MrC)lO ze=UmiJIvXxt6<}S-hc4I@xOez|4*00w@$FV*|h>agNySgjG0%c>Xji>0!AOFl4MTi zWg(Jz-!yd^a1w7ML7E76ed}@@EaYiK)enm2pSrn{QoWr9nl0>c;Qf|c7;~(+?BY0J z$s{59fx}c*JeIZWz_Vf2Z4fwwp(ip~nsq=FV?K7wL}KR8V2y_4_cF_k2^!HJ)PYq zYhk!Nr=Gg6y$I=_vg^N)=$D16nkk4tXvfpXz}${UcRQ}xWa=fUormm3sGo$wav{69Hgjcj_2uQ&7uHuU zE}l9oFR(f=3-!F?90}%743DN^!!~x+$)V>r+^Cszo;c~qk2Jd39XHd zlbu$@=vHKJL01+l*(;ZSqIdcEg~~d$`j>*tx+bi()cHq|LwWA3r^}8~ET2%;i@n}0 z%10eZ?-1m%j7NKElIjs&q!8h0o&FL;ZgiLBL=G^NsG7hN6NY1QCLMT*$y@mXm7nA%`+emjQ+vIBgChl;MTeWH@Gxp&3jL#W4=2OyU~Ul(rx5BKY9A1w!}r zmtO=Jgi$mZb#C0hHZ}aErIopQaiOeM7ljxM8c!c_BeP{D2M3{s@~g88YR>N(kL>24 z6fa&`+}QE%!eRHA3sy`zVz>rhLUC-H)eKy#ov8})pwXHjAB7AB1;k2pXhm=uc~YiK zq(vs(8Jm^bPkvL~C^O|;CajceSv~v1-m+&qnx1vbo?%(1(_t8 z?MIdvvjoYxd@%z(TEK5>Q1jYr_LNP^NXs^~|nqkthWe4Z;M(1Rxd)0)PlaDM%ocCE|oYklD|_3Pk}x z0RB`-{Qy7+S;YLKqkA-DL|U}sRHj9aVkt-m7{{0(ipg^dO$#)|e7UyDK#G7r+N1fu zoE-MU0cJl^Ka5{L94-6tyZuOR*$-nD{FCZO&VS-9``-U?<5EoLyE7?e8^0SiO}M6 z#UT11l)`+Rihx>?(;J0QhKkP56Qyzn%1%)pRn>bS%DbHfP0pud zTwY}p`H~nP6rnLb%-hFV-0YdH$4?x%wkU=AD4dcAmJ(p#Sn!F-<)Bce*g_HVkF?X~ z)OUxSthLK$>`aQ0wBRM2=378cqM&z%9WZ)j;ss;3rT9*UjF$y~@^CzI9GceseZrJu ztvHXIkxbn_?tMyRC@vuUoE-WThYgr9awkD$ZN@wrv8LBM&d*H81^9LJ`DjzMa&OQVQeD9&x?3S<~O&(%ROGW?yY8*wGAL;Te^C>M!L zIxHzal`fg;$p&-jG1%Nm>L2v^-R6_Z)^9vFx?W4(+hiKE^Q+nNyqCM^NhfcJ^}9h~ zY+${2pdSC;a`QK5hrhq!USE|Og$g~ha&rB|Pm{HueZ2766QPuKLId!Q$EG!J|v`Y9)1c4Gxv-$*Cb6(<> z$}$dO-b$@T?`WLHuU)?Q^0yf?Nd~-(Ei7bH0P;Bsrv)a^X}}2PyxOS>EfqW=$w3|N z#^w)JTHjCbU>qJbNB5eONq=0MgsZ84MPxr^YWed_#a*a~<)s-R1zw{O4wFd(4cbv~ z|DZjzZIVW~GjhV=)OBI(IZl{(ZrUT19K?ZVQ?cuM1KXaO)2?W_eFu-N$Qb$~k0Dfj z49_lTC(5PM=VrgOdHQnx%=tH;dqpj=D|t0nk`g+EK@x_^*mk3Vf#cyIIAZO`X}FEN zrsf^5kJt*zp5L6W)T`FQPrt34xan5AWO+J{7Q%Ff2_rxsrv5mX%mr}CrDy_*`Lj|n z{DHaCNiq}<1mL8Yosvn>A$3$lJcBWI8JJ6*K$J?Q<;l^IFy6|_iYSWhPMcwvXCYyp z@0Uttg2+l{{`SMILmn)!SwcY*L>BS|z=;F~$eo6^+SLWRIFz3>BkUdV6>vU#LdtN5 zbR7Bt$N*FV;-$Iz^z0XZ%bS~-v~mnc1Wf?MWRd`AF^SI`+qKwjDl<`D{f2z<=_8j| z1?WX2BD7dqAz+atOJTY{|K{&7r_+NLJ$c9xcG-hd1bc4K_oMbO;(~PF;r%uo+4)Xb z9JqB||Cwp=wHHqO#F?vKkd{|ZRf;Po&L8;4!DK@GaVO}7UW)~ojvs|eCTbu4-rL`c z?0DnUsbBve{_a2c=wGG2@#4wnoBe*NTt0pB^yX6K!nu5NcrYDD8K>Rc*&hs)#mbVZ zD1qd*I~}_}w^%sIO2%z(7kYBQ>VR07fhJ7gFcthnTPb98((epH7f=w25`r1UF|ac= zbo6o-oZivJdudQjqV1#WmrtHQeR6X!7(B}@dp3z#tJMGiolfUtETd_RAB!BB~{jG0&;~Sk$=iIq-KhmT67>~aG^{!IP1BFRpJ(_LhT&Jg`qfjXPJIk&Km2Z=w88!ylG**cZ$G%V zbLLZ@>Wv+x+1OZFzBUauoc%NTjVBj=?)RJB3&!xoa^)c(m#lzBFyZBjGSg&~G)4Ou z%p>)2arUk+(XN#7%r}GUD&v{jxlURA`fitTc8aVi#&Fdhm7+&|&g=L(<++K&&7|8R z)k^rn)KAs}N&Dg#?^n`$Ti;!?9_jJzv&p~V@E-5qjgt?km=@Exi}G_UYRg;}i2;b` zQ+AlC-j}4|^yxXunB_&EZB96wzxGTN-rt;w{O$;@v&u08iIy<|+Q z7Aq1g89~X45p6b$&^sqfks?T{PB7pBt3j8Rq%EmdNr&?m_H|@T2cwC(!J~j5YeKfd zF(bAkJKK4oE>||$d}$gR1LTy0wCJfxR-QNpr|APkG>e%qx!vZ$OIq4z4n5N{r%o{m zRmPR$Zbhnevv3+GE=8eurY`tL{~B>!NutDrN#&P_?p=3XUEXw*MA+qz_fGw z{3%#?VG>lH%g*aBoK8yRy^gz<4J$=IM^n5II?-NexqW*|hQmScpg%VJ$uu+r-;ENTy`*p=%wctNrt(U4^UcdEm#@71)3a-v zOSx=uRs|>!U>xHx^dsA~yueCQZv|DCm)8diYY%PSh`GKnNW<=z60@jCK+Ogq-U(CQ z9YO4Drptv&?bzi?+T3_1ZX7<4FdcKEf{iRa3B2K=&l(b|BE%6+%_^(_F-QpJcW&QV zIlGp|5dol7EKMd8&-0!QY#tsSa*DL9&i=v8w=)@?)^v)YcpO@cQS{|(DjC!y>ltV| zs|lGs@lk~Y-w)9G`25w}a!{dEGA&2+m160^+0T6=&Rj8iZZ?Y%!{R`Mi9=IV>KEO^ z915rTldatH@71q7Ihw%7j~L9xAVyTYjC6m|`#YudC04GT;{?r@@iV61rXA}+n^%P&2zuiB z_{5x!d}{Ch;6!$I>3l9hgUMuX(nIs~^Q5L@=WWm16%p;SRW2ChlJUf=7yG!rT7ZS1 z(K8c=qG@(4$ZQ72mKWQ5S$V2~uq$KA48t@f;2_DppC z76%LhYxu0H!H@@8G(sRkD)60wQvddI==$!PNOaI%oM zyOd4LN1afwFvUIm;LV^DOJL9LBop$BzxdqFrAqEK~UIH^J{oMMq4%naC$OZsMp|ABC52r(s zl`Fg^(Y%|Ilu#8;%`k$K5)5ca=(3>w7xgukLeK6wilTq;5B|Z-%*?rS=N1+gewd#y z#$WyFSKoW@y-KC>&;HpzTU%ROSXlVmfBSDINwU4Y{oug^j^lja|N7UzPEk~;RDuw` z_uhLqZrlI>Jbd`DTCM)0fAo(CA!(Za&hPxry?giS_4vnUAp$84o*pUg9^4XU4wB`YimwD7T z%xN)jQf@kN5-ouqvwoMZ-5o(Yin{&Z-)Q{q=b3|idAcdPr#DUvD&KF1&W^X2QtN;-o`s zhhAR|oDC}0bcxH#fKnv68j&Opxvs@fkUc~=nnW9g(!>cvm_3GpH$J4PY7=QQ46M;= zm(}~2S>V|zqNfor`2LIp2YzQ`*s`Szi-#gpB402zWs>P4Jkt4It-lCWJv~E|@H&;~YO&km9P|$XB8prTWC)zclK(gF9mT zLEv@l>D&j?g{StKHK6nPO|||L?ZV4`=ITH@jg<0SCR^N?m-G1<-NaOr21hh#q+S<~ zACKKFciOba{d9UTb)1PO#ficNlQ42v8jZ1gJn81$WD-p$p6Quk-^q_1acb*o?lbxN ztLJ9VoIL;HbC+ISI+>T`lw%?_>#yV$W$C4N1d)Rj)Q}{xMQXar352OvkaEbnlQ0s& z(1u`bQiSErZOF=|Q^;-<>r{Ji+rey+Aq7ZyWYdgCQ6fzeNuVln7O=>qQJse0?( zch~2t^|{&cc>FPzjmP8VZ*n^0R1$8cUHxo-2aZ$+~o__UP(**6_!>M&53>V`=MnaS@$&+yb zr92;t#Eb+M61$LiiRZJnVZ~wJjUHKsH!`D%+wG-2i?))JbpEIN#Y3ur;aBt6=G*2!s70bn5ug@U*?D;dXNP7K&8L~za z5BH5;lf5*vtS$3nukR0R!98_0dvQ|okBkPf?OJU5tPrP8d5{GTEL~Xd^C2D`3~W9~ zA>=thLU!m)oLxn(qo}YPKWPL50TgT1a;aRlZF@4A)M_=1arcjRYIQmtmSqct!ZQn6 zrCRNo!{7a%zMe9qGPlHZ13z?mHqWI%bS64YAsq7>+o453fk;RN7)FSmrpZW>o+egj z`w13VMiDP2LP_WCVqOSYlS;5B%7~R>f1!{$Oj2)Tf~hr@`Q_wc0V)Gp282vi?XlTC z)g6{$Qpgqe5SxLr*`0j($J+t$Y*Qr5vcK{xzw+fTfB8G#`OaVe>wi6$%Y6(w@dw+$ z4nT~F6%a252?2rt5Dh{MXcp)h!V937W6mx7X{F3R?wSDzz;AY%y$H_;T8!a1N+^Id zmIr`3^1TET1SvvDS&;vWnbnWUEKSp|eeG+tT5W!Qer|5=*~w=g`J<0M+S}V(Sy{Pp zasO!MrN4Gd!BGk%wV2Vr>%iW)l-+D ztS8aujgVD`Hlza}3WuJUj8N9^ z(Ae4)t{#c=-#-56jd=HLN%+C~e+7I_8hGcjZ(4b{z_qLXzqn)kYcsl17B=W0Vz_`~ zg$Xjpn4FBZUS~~JV)h6KbxjAvg61~qXQP4vMlMKMs;EWIvU@9W_;K}O+vvPXFU1?? zJCD9U?>tTt8-{5$?`(E|K1dfh3b`XWRN|z> z33k+2J(rn)Z6>}|`e*roV`<;7*IMpb& zz)}XSt;zGf%zSDEljDz0XJ_MLH3m}poNEL?)LpvkM<)o&cIa zWxv}p{e|@5vP>xor%<^NCX9Vh_jb#HbA7r+IYlEJ?BP+-mwYk1=#9tP<~3(Y^R^Q4 zg&v@uD+HuK%Vw92%^4;{*bc&7+c?Zd$6T^C?9+&$d`dU*e9U76X&V-8jn*W|rQ?LO z3SpE|C=R;QksVO89=ilplyWD_3%_*ku6*qjQo=VJ~EL zUUqqNVKiz$|DB!f%1q65oY}d#XS-j@R?Y0(X6?h-7bl(Jr(ySd<)um#aEvgGBY@?i z+t<>OFO+xn^@qzZ_AoLZ-=o`Y62*WK0h_7&yO)Bon4yTWy1jVzoy;1%`z=H>#o$90 z&gPZNtlV2<8}Dgr#b7E?a4OC&kbn|8yr<~2gc$FbOmr*H^R!9OIFJxSc@7%KNi>ib zL^)a~xtW=(&(DtR5!Jjt-g{^N>66~X_lcFrPAYedUPCNxey?X=iAv>a&G$n>aIsYO zTyJA_@gMxk#jkzitv~!19}WEizBRqpES>n`rN#AJleuq=KWa5s%e7yktG{WDjy+c! z$m(opH|4%&m7ac-yfRnWef^F0_aE@1A?-18jw3aFcxb`NAAAZzrA)m$yx;nbfAw2u zPX<9S8IS8TGe06?KJ%76+tF07*MlIir&hV7gf3k>Uua(&_yQZaaXGZo*d-E48E!NR zh$uO6oQqhSmnk|*s34Bb5-$Osi!l}w(}yj|+Jr7}1Tm9F)8J_dV@@i#v>+0%#Pmja zp0!wsU%ea0r$hJvBpa0h0g*5(Yp3DF`3{K7k@46e3{)%#;KPGfO|q`v2cncA7xII+$+w34)NNI2uAT zP7{&>zyN?#0sw)S&_Dbe5JJ^z_4xSs=FOY0yz((vHvJgU16g^Adc(!3FP1Bi~nG+{YJe%wM z1k3*X^vtdwY;S#Z|J3D|!jTOv>*{A-cQD?w=n*ql<9G@-*HYgVR2U7IXnK~V2Rs1* zHEkT7$t^$S=nveqM`vCfOkXkwR;Kz@9)Ogi5+}?l^cLPCo1aaUpC0nAMKMvv|u44|%`jjGivX;*9tlld;p@?=<~p zj1`^dhpNm8Vl{buo*F_a8w=&gifBBAX*-GOVSG>+nQ^8+RaF8Qw87H`hxrLdchB-JF8C*i<50-kvlkZ>NbTlG+AM)$L`b! z(+ZU!K@Je4g6@Vd`aGpaEip>=SPducA}!uB2eYAPvdM4|La9&-+9Zh@VV8;H1Z@^6 zG?sh@VI$p|8x0mR^EBtm){`Xm%RGe04G2566eY0=(s*Y)s!7#^vl^xkr{T+dI$56G zw_0t~p0K45*70RnWD4L;~gIVu(^gT#}Jv4QJ>G~-M1|Q|Gc$jfKQW$~r@}_w18QzQ&r)t-hRQ8{Ppv%c^j_`X zFT)AJc`mcQ#Zd|1%M@J`qjPFBNR3=3GqNd=Wx&FOE z>;7>!f%}6|yJvQSQ6#g$)rxWvEPYB``bm;ofQ6-yw>G7bsymkJsJHyTzmwVRDYtVXiqP@FPFln@=oaUce6 z7?}F-_9=3sA`ur4i<557Ggju#eRK0{V#3#0<923|$I~*TcW6u^AiBt(QV&Rai#29rWvCRw6iYOexR}HDH~mNRKo|%{0@H#Qs7VOY6uKtoBqLwg3Ds$| z2qSt^LG|itX>nz?GC$?<$OsB(e(1Kw(WuTuN^tae>+bf$-Ak8VA=^o87%Y_)Bv?6Zy^IEFRng#&HAqiTv~ z_PQeksFdXbC}+9Aa-&6xm2>5%71cX3&&{0Fi+Vnve->!+Bi^!)2R1#=8w>_BwHeDZ z@7!sslW8f^4r$C-W-;|4bOe<{6vr|{C}YZTQh_Hh4pA}{r4~seL_K-(5e>OnSPGSL zK4le^;T_9z%+s`twEPJ0Hz(-dtbsTZe&PzuWzIT1oC z&+&g{W|^U=XE#kz)aO6{`7eFxOINR6{b6Gn0AO}@c57?v@bK_wfA(i}U4JG)K7*~r z#l>tko6Tl7Ha51mx7XL#=jZ1sihA{^o<;zP;OY7_F-~8q`FJ8Qu&*$HM`)!)0 z|Hj|=8?NgbhH>%YMOl_VG5G)aA+slUAHDzKdtbP6)-t+yYM+1erQNMPW51EoP1&3> zlAh!BDM})O447XND!Uv`rUnSdDXO<1b&E0SIDXlsMYa4@q?zWzo01|F!(+;x!Em!a zC-8*mk~bco)z1DwhUbG&1rK?o6bn_T_4-k;P7tFzy8TEnn+GI$oiV$`)kZRSd3d}~ z<$nVhsFAhlg_EbhayY|wn)hb})=um0XUJ z<7mOzL8ak!Pg$nUkCo;7J`&6w+I%QdRD&182|cE(aYA$0jo8?5`~it}Mu+EyTlsiz z)k&Zh?z;AxhiB&ta(UHbsc3qD1Jkqgqsf*uYNZp>rUDiKn)NR z&@RJ{-0(U0=mKXb)w6fx6J1v_;=mnsp&Rd~HtlvPw|gATMk$#Iwkl~C0dLkBbUB>3 zy_t9zF;6!O?8GkQnWZAAsJ?p%hadw($5=sZBbOlwm8DW2lcCvV&8fhMDeEl( zhvD6E=$i(iX`tXqhvpwr`Er6T%fMld)v2q?(k@oSC>A6kg~A;yty!H4>y?*YeHR6g7<9o}Xz={6JG$#X9vO+ zMLt(pyi%%&vn33pCj=k442fy%S&0#gQYuGUk#PK+VAGs0FcytRB9A7FDFrSMV+ADy z3Lz47K;ksWM+5?}A8Gy2c!MMz={#a3n4;DkSWQz;!Fsv{b>V(sup-X7G-JX zZWJXUqyfYb)11(T!Q6CUEWPyg>)*Lh%y@BJuhtMvw_2@CCZnpVWmz<$H&1L%pPCOJ z-^%8rAk7IW_OX-(PGAR>;qeK4ER{Tm7?NeAWK@(*v{i36t0KznjVN3#VhG^uT6ufKB0T`PBPlhr0wI0;cegl!QtI&DdomzGv)W%2*>yZ@R7Y~FJo^pZ-dmDl9M=s_5cc#P)kI3ri5 z$vdLeTAZ3Te|;~Odg*yK;+ED55$}&%-4O7M?}%9%uwZQSeeG3MHJj<^;O^ir{`AlC z0@rG_ez;rq49kKbcqTdz27_9y#xjhQ(cb#rcW*zuvr??U(2s1pNM$)bE2%=1P;8;@ zE5q0id0vAm6-&|>SX~yz0{3YD5pVPZg`W>#4#Hzj<&asWV#xSTYO%4WKx2SpB-bj@ zFk4v6SRo0Ns`vr z*Uy|e^9h#yc_XvCkKcK8>%q$BzS!;u!En6WA9lK<)^L21P>0<9Zo-sZ)&U+&2@ZN^ zC9zF=w3|qTKZ3(?h+7;GBXczgORO?fjhug9^E1c1ZiE;Jl>jaD#pQsOZyGTe@DdyO zja!_kIBHy67#aS2pqE6nkjwdNwK2rS+^0WK*_ZsWDT~KwGZtz>wBN$0_h|h3 z>`&aHo+gPRWiyMRl~pJsGUfuSl0IN3el@ou%vUujr_5j6=W~OQ55mPGxO~K~GE^{S zTIk^DVq#P)vJE9%m@B)jR@CX6#s%PL0vvOY0ca&7lwqgDAw|g)1Sy-(QDi83oTo4J zFxC^dm%3bkWY8Rmj~7&m!*Pbo^_arY%X&iXo@Xw0Oi3^JKuQoQIjxtJ!A$jhPhH!! zQ_Gsfj+IUa-1LcuoeVAS1{!N|?d00|VFPeQfZMeR1~{2UV>x!6AfUpO!GQ-yYe0fU z9^?wRGP7Jg)0qFcJMhFcv-I0W<+qQW;PH-l^!~!Zzd1kn<`=*p&SxJMi$t$n7|;ED zOFT!olI{CIU3rM8tTiA}EXF}f;DNV2vZPak#hLtb^wR0yM*(LzV&b=)hly#|Y05!h ziW3f{k+5tNK8<84%_ceGS;HV8IOvqU$*knMv>;bk&IcXipb(zea|_rhXDg%+fNx@<|NmPWSp`Lv5;v7sAQ+CNHR2IW)p38 z_UtyojysU4c@oo=;DIOrT)oirE!KAG$bS&<743Y;@FQ0AkzhN`7gNaR>b^#``~5uG z$iSh-B1pVG9rGd8A?}mb;TkP0logTcYp|QiV0rPy59Ouil&o4u6;$Oi6-#i1Fag=c zZRyh~qGkZg$~jS;)A;(5{1kDlD5l%aZwT%CaF~*b+36&A-1W!Fr;_T=-YdTG$eFnU z@@?p5y&caUlgO7t5Aqovae$&lmgfYH7SfF1E3zYyHXDxE#LkIqHVxI7Av{abwg)D) zNC{F;VKRVDiUf%);KN8LvO+;)g-S$vPug2LDtJ7FDORP3L!cKWT$&Of3KSubGVG9I z_#5xubi0$y^J|mgL{St?(|WxgA*5U`kEhcUOEXU!{qJBV$B1kKB4;!(ley0QP5Y=^ zp9#vEX$&r@r;IaS_*U-oI3dqdpf4@LH1ZQ>1ch9L1}N7^D_Le{XY+J#sorjnkFGtS ztN{#S3@8yvCt@?tg;ai%TbTJl`Nb`K`RR}_<6bE_cp*FpGEpggmqTI;oLG`)%^Z~q zrG_|{$4NwE= zkDa97GsjK)(o~$zrB9;Lb41I`E1C0e_NKRO%d(>QoV-l(%f|TW!Qri#%blFtm^u?p z%}fnrFfo7o4}RnF^!`X`+axn?c{yi(v0m9G_n4rYGG#tqm*lx!F#dFRE_~&u-cIgT z8&9;fl!@t?7nl6l88w=`%tVOF7R7!X`;*opTnmbX3;nOW`E#S`SkLMoTmC=xmeuQZ z-}eWD!LwPvR;yVm7Fp;oTwHUf4jRNQHpqK4okpBeA{fy26rJ4Y+C!e@LWHe2wkR}& zt}n7j?So`6Eh|D%mJ_XHLve|e6HOdAnJ5yA86ni>uZ4kbusLmR$i#g&*LL_vmRFma zLTUacRRUJZBu?rBfhs+*45M-Il|NmO=>uQA$|E>MU85Wx)@bM9bt9X}D+LYWzPg%nlMIXo&ZLaV8spIOONSn$2qPzn9y=*# zJwOQ?2G7TVBC;MwR}l*7Y26(Rq6gLC12b(8C;R7YCX$<~c|7G82$e=a!?>@dK7gVd z?#)D_?(BIJoRm;G%!C7bf5S+-z&*?#TRpw4C=U@LPasIyjnXhr588@*< zjy`PPQ?{P`eCJ!s!Ee28zjvX^Z7iWnFa1=1^|gK98&JLB@vY3%(gE4y3Z^yX(@5|K zUN|OWQu1L+x88G%qE)is!jP)9HGD1_3)nx&z@4S=DQ}0Pp z(i)$b%V>dhPpqL3Ni6Nesfjs08KlO}3<-}hScV+0BYt?0&r}kMby1Eo4c{D+Xn(K2 zm*@CGp{S}GnS~2G`oh<(g4^D^>Nc3HOs0g_mmX8)vnXXsc_n(h!GttB47dTNac&$8 z3(r5LqeX{3Ux?n}di5k-6~kq*Ic6SwXx=gRcd7^d7i_Z+^web?vQCSYvJNJ(B{JF& zi4o=t0+%v~<8_Laiiqd(WhE;x;gk|k3SA??qku<%9>?suKX@v2s%~AAkVx?qMQ24R z$>fNd0bx+i&F`kYU^Iffh6I77A;%>X94Wq}BVPn5leifv$U>y7tn=;h{l^baUO1^| zvb|mp08lQM4bvn^`0&x*-+y9bW^n-oshtLnQ*Pe9VzuYjt7(2g@D@;Q;lA|BF*+$( zgH0tJbD9`O5hWhbd4Qn@VGs)_iw^1+TIIz@2TvQ<@6hG|q%$ECn3puHMEf>7}Il@sL`of##^zuyB6BUHxjRJDy|yKjk;a*`y9QV*R~ ze!C}(N9?%_vuQE`a+kfy*TCIiK`aW=>pXIc30S z*IlO^9rcqW8XnMlO)u>YA*WGC!g!}>kNB+oULWH78Lf$Ff( z3qw8Rths0~rQEeBu9TIV;sHuhNh;=ORE+j2axI&m{Xnh@=^~+%7)?$CQLibgP#kJS z&vGy2GEB9qGLU5jDi-RJyc37m2%f9X2N}=?ie-*#g2QoBKjss_Rs<$y(F~RyPE0Yy zz+g%z&cSvznflP%x7=CaIkLPchFIWhv6~`)2P;9Md03qTh~X$17&>m$l~Pw;dB>ys zLz}n8*qflZqgzjA-N|lc?tk<(zO@?%6V*8`j@zku#F@wRaEJ9;KAL}-uQg`T>+^A?Y!Xq;X0pYGB4(4R>RyZS6F(V ztT4D-5#hN~QOl_e6-GRo*iTXHg;7{YF%OL>?PVuPq)6NDL*CgB!%{p73!x++R>?;F z%#~el5JH@fsFmC)1_%S%N>WOrmMst$p(D8ALTxd~NaBQgI-UjzC`f|O02oj%zj9|h zEm}Li?_?!5;gx;9HjUD`D1eCbBq0Svp+MgsqbSUzlF1j}+P{AR`+P=^XgKKGs#t1? z6pBPAVjaYUFk{-t4Wmsst!UXqDRx;lZ0_kC@53bLOax|B2pSBlGJ38NPh=zHxW!Vw zoaz$jAC?OXdzLw`DTiJJT|URxVUie$l^R~YxH`~TXtxHjy<{;R&Va+6vpC2WD{V=j zxseN59M6bQ8439?70d`Cn?2(>@I>xgJ+~&W?B@!*lX}W5e-9^x{oAinQ&(hMN-{&T zGojb)<5^9U`LZq}R}>=ZOqmure#=4r?=Y@?eF! zwuz4GoVh@63sMt=k14M^@+&@^8PioBjGqkrOt6S}9)(_jXo6{m=LJdBm7L5oNg5(H zf@m~Iro7S0qm`ky0-f=qR!@XT5SRq24g|L*Mj=3YHNzmy1=eBzh?g`5ahP&q5Tt=w zWMv?6GAlFL+=Q}G;*>D6AM^W9?iBKxC`iR(abg(mc=Xj9_y7Crt#Y|^E!>Xh=p+ppxea+K^gJA!vRa*A-8p&bHY4AC z_|)D$V3QaG2Bu{I>1xbKO8tS#4&6BQ1mBI4uzkYbIvaN-B|5?EPjeg}3=pAtyuehR zJElm^WW`_$K}Qd15&AnkmzvZI0J2LLALUgLZHfM%=^Cf3aXHVXxHaV{A5*Tl2!J_a zCm4z>w3WnJOo9LyZHhIzZo!Cl39ETRkua_7sUzm%Pb^&UGHvVWH^=^9M1dreJDyx` zJ=!_Fd3kAZF^s}uxjMJH@xAZA+wZD$E$gbCCw)eqR4$ZGu(ipd*F%s-oZJ+=j`9B0 zW-^%1^zmDZL?Q+RB?J`a_|X%ZB!L$#rIuO{T9dv+D4bFDI!_9Tu4i?g=bu^rqbPbN zVh)GHXWg<+r=zN>rfHo{CruMYk?lD4K5BKnz7UZNlo-9}U{+1ia#nNFo{ce(6i%R; z5)v38edEipF3j?HAFU~u{PIGRJ>kWe)RGXh1)yue8`&FNe?pz|83 z5A@nG7E$C93NGoJZ8pg<#UX#%JlOd$XEXoT*^H;X51J%_KwvRqa0m%QV~8-M6GEpH zodA?jbV86nNwiIkqT!DtX{H1~2)zXV<$LW`kWv5=h%kTzKnSRaKmpNqiXmijEN90_ zO%VRO<>dm)k{^%EKB-U0?8hRrAKZTL;e&@4UOH9oHm!rbhbD@EH|N~;vWqoEMY1HY z@}X@72nbdrK!C9489{mEA8Oho4-XUnbQGKgk~cpeP@E#kLyqq`ZZxEl%v_U)Z^qHF z#vU8;I>&Aymhqxf?kynD0VXA*V{mkyskfu{iowbyl(TO0m3rUz7gP3-nV-bHvw#T- zS^y^vuXNf~9^@Q9PA{c!DKs;s`nHD`L!OJI2@wI?Ki$(#lxZ zl>joSt!o}kG=iK$r7B_$1RhBYr`S+5U z@AeAU9Em#W39;H`Q-1U>{}0pe^UI+CI1u%8@#07-O8w)iHs@jLo__J@_^1}xro2vs zOP;*gK~#m6YOKjHL5K&+6kDReC!U^+Tf%EJ7b;1&N8JN~b#*M~=`fjNzdycN2pSYV zn2;cJ1u-seWVO4<@Io;gs46RPO36zi6Vj4xcX?KTD1ppUMz^fy5ey^KeQ|Z}n$_5( zxUOeUjY&ZXK;oqsDn6S^K=qkfi8PTN8hDepMW)lhoMU+WXi5Y-HV-qjta9X^u)^o_6Q(ptStHHxzE4R|$|~I?wJt16R9O}kv86L6PqPs%i4?^$Nu0)j z*2b9kB+5U8J3Dt@c;zC1jM;7e;~#wZs|~oU%XNR^Bq*F(%SZQ~2hHlaEA8wRU_?2S zO3El?y+v%d<)TaFC@S?Sb)3*j5I2>~R9TD`Y9A;I*Y?cb<417k4&{e9NdYBcDq@g= z7;(b!Ab7ew{$9CdXaCt?4 z(rm^Fnu3zDu%; zB84Ev|3Nq-0Hg%a5I_L_>wBZ$>v<|o#{^K2N(lsz;t}#w!cjB^kfWfPVwiyE^ZCEA zFh>YMpJ3T1WcFuBX4hJchaWw<{Mwsf;N*!8m#hA*r>D-J9|oQ%uoA5gA#H$kjuv@D z38|YT)5tcx!9*2ATbxY2{WbD_POWh4%_Q-%k;fTK=uyclKZ{LJC-xI!>b0RyG6 z$upD_NV7X3o(~CCodu+JN6?g`eUX){40OVnPE$@)wAAA0Wa3TxZXh`#7%>kHr_Iu; zjtT{{*_W4pCt>ui(jjifc++K*?MEcGq3#UmU;zDQ(HutDJxc4} zi8ZtD%1)vM`}A;kEgohS{^aUv?aZ4?CtgISKQ)pzcd3ON-qIaYd#5E_pAB7g1KUOPhGqet9LSv*Y=*9ItmvEW&Rx|4%!Y+M@&pqHhSO=OOwE1 z+-g9{`9+x9K#G=?gb<_^D`}O~>x0IHNH3nF#or6Z-ZVhC7rK_~C-G)TG9t2lufc#bb_Acg=RKe~Tibt5gXw zmZEX$cdiuJ_f~6vr^U}deatIhBrVU5)p^l4opXj73(mc1|RM%QA1f_p0N=%LC8km?FcNl3T|C6LUOUy8-!A zL1};WOe;99vf~4fKx1>R>O2;LnwvM-g3rh)hLB+`4`aZ?MAKMa5CPBWG$VV24LQdJ zlh&YNyEUvR5r>Qb=MvTu1S=t~#qIk>)n*j$uIrf$uTX3jbA_0KVdAPpfPj+}IfV&; zDItDUPz*oay?;v<@V~ge^*>F}1=-y&n`Y|vE$`yd_g)Pitet<&trvsjh_=QmD-Ww{ zQ3@V0i*3lt*!Agxk-)s~4`voxOXu%;=&fz%_`yNaH>k-zG>-{ILt5fVDg$rMzpKIH zLh$57a9^djSCE^iu?DvDM6M`kcV?C*)eJ?I5v|FkCj{H5vWE0bkqV_!SXt5{N2Am1 z%wjiXwu7{c58}u|QzM6p*Q*zA+B1PCu8+DNmnjKVzzaQL0%$d)LCmNGLx4O-6o-sh zp_ry1a3oAZe?JAiAY@0za+JhlQO>-~&7Y`CX6yJ#>^Qbk^(VoNn|CfdzHeAIjG3B@Pl2TCUSNkQD4$)T3%R?4R#niuDw0t;VIv2TKEnMcAJuTW%x1bpcF2hN z;9QV>$LI4G^9eMYLR91>Zh!Kr3BrFpVgb|(6bOKQV=@8IZU?+WSStL_u8SYu= z>mL)|zf&*)1px(t5tIM?w)rocp3WgcfS(coU`zmuV3`?DppTU(u5H{N~YrI!XVeXVVM)M##~%YJ^-PE#cE3XX`3aWpO@gTQrZ z&*>lUW&N?4lf-K72qz1n>!>2fvm%YNvF*n}G<9Mm4FRytk$mJ$IaLlntOV)l+1fsx z5vd?Xl~i6)n54>1Ot!>RWH#>aDr*C3*|ylz{wP+N@K! zK>96pvDvn3;~mX>_?owO3N;2&sZA}BIBX@dlO)YB=Io*D^?C0QIFmFOd7iO@^&@AT z>D_|n+Y8ZtUW_*8msei@i}P20wz+VIr7L9hjo-5JH>Qj4IhDJHy4MG6=Q!?fy*z&M zy6CXd;1mNpl{k)_(~Lsb7reCFuvwR0Q=O6K*d?iw&SkHoqY7|GvRX9_JW~z?rijuw z&2%6);j&#TEhJf@XZ#?|aM_VoFu@c=PLpI)FWs0@r`-@NXp?MV#F^hR1MKEqeJ&Dhm9*O`xjTcqQdeCmpCHan| zbAHdqQ^oNTr5r*-PDbq%b0o;oT-I%a;kLoaLsVFVP!arQS`fm49oZaR)TvyUo$ax7 z&%`C99|p0W&_vcmt>Qu^nED|@(UcgIfS5fe%|%IYA?{2ii3FLF%JirthzGXG2!Kgx zkp`R>jr_1*6jo@dR+Oy(@nPVl*yy+gDqw-&OE^(j;FDn~nkI6UjeG|8HNYyN&%{n) z;|u>sbmG;gH?KH1?`trMCoequa8XVB%dhn!J!18Sn_ZxBrZQ^>fFp6oK29f74IvXc zz!>etVc#ES@NV9*CjM=C;JG+-0@Ju>37%gONP$VrM8q{Fn_vPVOc-ly zUh59*LnAvxj1RP?m9RealF@2vpOO5axcm+lOQWGniyF@`*zZPINyw1lw+&K*NaDB= zO2r6MxfR2r?0l25n^gj(b{>WsnGw*XJY zlQKxRgt8N%G%+Xh8;46Lw|4fnuRo+leH6tY4nXJ;NJBiGNhb=*4SRV5Kl6+;K{Z_UxPUmk$>v#%PBf^*ji&4Ew>I?})T^`TV6giJQmA ztEWzW`KMphDd+y9?d7Sh22NnZ4Shk$gX1(1V-b>2M%hgGRh4uAvrIz(3~Fg(?#Xz^ z?~my;rW3rvPbU&(_MHNu)U0;HJz_@W3$K6PcI?q`RIAk}it2PaKZ0e`>C|OfdiuatHzf@gK>k6oin5FicaK z<^SQSRh34c_`E(Lvp-`p`?a^f-+sLHg*U%=3?qR9`s(SLI~g-QHl{^gbAe=~RGLCR z7U}WMjMw95>qh13kyHsl5~MC0v93+Nyl`Zp?Qaq zX1RXA!|f<#yALlI*VoX~P1uKYafexb6r;kZ(f8Ox%ao_hqH~`Q4idX-yFp+~jM2F7 z4khm}58Cyta^Z!Sr3>e3r+=n==1cdp>))Twd|)lyp4R{8M)u}GH17N5-raTM{S(IT zpT@&kp?5VN%EinsTe*yw=1gVmM{bbGc|_opRxqLMood9E!!TE@PnNH``ugJtmpq#j z7gMOpOsdALq!65hI!T4pR(KDCoJv_Ws<6$f9gFr^wdOWr_hHdxe0p`9-Ix=ngPio} z>DIVyo*lYB)iJ7~laZc!6qb{`qQwz@v}=oVVF3}27rEVFD>8tR%uHhc*o!s*1r%#A zei)i8?FaMRG_B3AWV81I2Tn6FC8}{9=d?!H)v+w%6eUWga$zXzI5t&L^VxzIOp~Ml zXot!tuv?ZWan<$Vs6;NCqgkiaqK%H}kFtb4+#)g3mV#UA9fGrP86vp$u>EVomva~iz zUGXx<9qZoabeiV5$8=D2@5THSQOu106!0LQJk2Nc2r`lvx8iixwnds-tZ!7y%mXGp z7>?)Cc9%AV=(A0@naut&EoY*X)Og404 zarrGalXIe&0jxz)36U20r+a%GNQmGMvpQc`N=IYIacC+lmZgu5Z=O~+tA&c9sVu|% zu(#}EEVFHUW@aXiqDH&<^n=@3GjO6%N*IVhF2mEIiz%GRqDI(5v}kaVpT-UwO_|h1 z&gkfvF?~i^sYc;z05|IxNnA?t8?+gSLxmGTZqbXy}tHYErn6hS)1RLszXrDI43 zkPd0uim0cD_+f)|EI0}P&47r&UI1>6$^Uyh{ku=ozrP=~e5`U16A%&TCs<*rgb+fg zh+seJy@KEJrfoD=<*hlFjOaZhup0yu@6*%=6N|%0Z_aQOW=tIGyvk zxx2;U$3wGbXLo&T!QXuf7;G5Gv3JVBam;38gJsymFfAv!``lPNImLn;uq+(d{OpB6 z5OGXYlp1Msrl@h6D?CK=U5Ag7khpufAl#3ftw0OeonmsZoVFEK88I_EWX-a}gUH3E zomzoCJ*ZgsWUmu@ooQ(HtuQesQtTAxE5+H$vsa$G_}s7dSDzcq|LIrp<&jhQb~y8o z5A^ritT|$P({?(#anZQ{cyN4Sj2Wm!yNA)h&uA+)P@FJ=*7E@z6UXVwc+`s3W?!o!#Aolj_L8hJrmME5czj3~Vy(4j4Xcp1Y0>f9B9s^o_d=R7$r9p8`y71S;owxzXIct*^hX zd*?_Zt2qfs+32C^d$_nLO1Q&9G4UvqGNX`Z)dWXKNb<0|NcyR6PpzOj?z*~&3Z=l& z0!5lH&Zt^h7Q%uYL3}JGcNyc%oA~X-X%9M2bnnl}DaE?3WEq);gbi5aL4{JA4*|^* zmt?8$D}yZp zi7AN}uvwGL1V&mEO))}#kVvo|cCn~DB=aO36$^Y00XFORP}p#cB47+8ko?BS@eCJo zJ;F9KP%GueOgSAHSGd{{&ShY<#q>yyWbshdN{8(1Dnn1}S0gf4scrtW^pqQGSK!=3 z&R&T6Wj+~6r%lQkOb|mlPY=C^Y%_JNMqbSYFvY zx7F=*D5Zr$vAIy6^3j9)ua~lFW=0L$DKEEvK4 zRpaPvx^p(cR7eFCN}{5R3?K23U#oV#Gfa@psTPAAj)KgGLiup8lZ=jeAwHia2kIOQ z8x53lY%&m*4^X|%6kJSBqLgH8HN*+)qr|buNDbaDdbgRt)L6Sj4w1GZg0^U!9NFk= z|C&`Z{^#;D0pJ>namUJ{46saw*))MbU}DN-5XF$83=UHqLnh^LjF|x9jKduVo*3}Q z2jJB+`ZpiJ|H}^jW}Ch{r2Uv;L^%vH03ZN71_XeJQV38=2?0o8aFP)OQI27pG_4B4 zf3vlqu^50)yH$QFv!A!j-nzYacK_DZ=brwsKdCs=khkP1tfb?CoKM4OE;wcoTC0^E z%q1>YM0goFcy0YH;pw-WqIi1t3vAp~ix8~dNQ)}Y&+?_YnPpna`2Id}>5&SoOOVUJto+KIxR%$^)F}meJsp-Kg)Ko<0@b z_)$)i68StDEJmGJ@Y}&4WbGP-8P9YRXOt{_6036TlSt*GVU^Svb;+7=ckXshbUkAk zE|ms}F!XRa$~d{=tI9iRX?{Y>Iey<8F|zP%b~>SF#dwg#HnNUze7u<6E1;t#G)S2c zr~6HBWI+`8jX@^01L??1>9`-7-FR{Yh9_jQ$41A#KM~_F<*5s^bs;Bi%~h8-=brcv zyK9#j_4#+W%fHiazIPnmnCLf##od$s%Kj(Sc>9|D{Tkla(*9?Br^p!Pg5)aaXT&GnJCdk|EZ+Na8)W<{YouN6jGZZav|Ajr z*BVhskT>01sbr1I*f6X8H&@*c&Tr0)fALTL z6ZXp8D0xv$HcI~gu$V^#JQpsFmuBvAld&5!fxL{3+sq@+OY~Sk{OpL&*>;3Y@{5{q zrwSg7tQso`jNmHEO)_20E79WI(e&h;RI_s>y*GU$GV4Lg$cboH*Y)bdvK&s1jsn;+ z@`;L-3>|6ylI=F+@~xbbm}s3Tj(M>nz$oQSCQ+H}fiqa?_e809miCuu0Vr}34nuC? zW`ZBXcNCQyFxmt%OT)6sQmY(dt`G+B$e8i-hsqVxZ7*`zM^VxAoMe0u=lg-#oZcw`KIH*SISG=H zYc|aoO^1m9ewy0$WTXkna;$P(ZKOtW5*L%i1?<2psY=r19U1YS!?9LnUlH;kAbPo- zrmH?^$`e02)hGb0n52;^7G#bU3ky}v&h)}*EZiKsDW zQIaV%EK!rNXBw*Hg_5jf8jo}wdpUiVZxzMGGRn#lG1&YnowbWqk5`up`AB6%Of#+8 z3{gj(U9=w*8hpefnq-8LJdqaxl}MB+VB1blhPx|+-fBMep%=x#hmiVK-IuKLV#wnw zrE`OV$|fTR11CU|#to^{^rJRXJ;q0NpurAJ{bB|xSz5DR!;X4hkc@{BT zl3TA-47C>poa$#~wsfMl)T~x!#S}()IqBcBE%8$Mzah@mkNe4WIaU^`K(Uf zeCO@Ur3(v7bF!@bk6Grr?##?g7>1+Ks8XrQqI7(E^x)R11Pgo+Dg-i^ZV9F->X5{;I$;M%W*%l`m!P)qk&@&wLqH5 zVm{izK^sTCi#+1Ufz*xk_LpQ@5C4lg3 zlwpEkjF}9e2s4CbVuV79Lx^ICd;|%HsDJ_p0t^farx36V;24lnz+jqC3Lwn@%?O~7 zG7zSeau`8C69Qz0iAkDJNHY4@*6Lrb=E$dK|38)4ABD{B+`4i1?%m7JJfBSV=i^aE z$6d!St0k5^T3}LIzhX+ohewv;n;off2R?qrJ^8lRe6>AX>+XEk-|O<+UBbH)YXFpVccQ4~SW8M^E&jqiXSxAIsByJCE%utq+%6=Di%g7LT( z9nOX0k4>RZ|8V8&5A)Y|-PJdv=C|71_m9Q1F_#61xAzqLr+;er-An3_;k~?O9E<#= z=s1?TO(E_U&-;#l8CGcd@>;2Eu3zsB>><_SxW`g3>6vNN8i>)Nv%Lf}jG3ZK3bT4I zNc6;u3QUW|Lb3FbADa`YstPR30%&C>QDk6bJPOTFVX$xHqwxJq<%8V7f4F}3`ql9# z^}=-d(laMd{+S=b#c%9y2W|Cn@~fq-U;75i|KiC#Hn;Pg;^#g|);El8F1XLho1EHm z;X6`r#=t@f5|NG;64>Eedu&aiy)vayl5#<33bkFU!~+#c$p@wdcaxVZ?4;2i4i4gM zes+3$oLC-#3j(s!)707P`l$f&jK~BS?k0H@ip!+$<`AW7%t^HfT7E1trD4)nW1r8d zlY~?NKLM0r)s=}O+C}E2S4p{^60juSS!H`H8jjy2Wy*!P31CKMp zZo~%55_HNHE^m)kA^pP~?Hjm81ds5Scv)BG%PHMmL$!}`nD@%_b^xVe} zf5csQ{uQ=1V;rxB(-~MatIdFG6e=sDPN6In4SU*_N9#$D4-vCsliIZI>4*CK$S1$1_{6tC*6n$LBx3}ANVMtsCo z%jA?pvF~ogNkf_m%Sqzx5Rl_kRp7LeEE~zt4dy>VJU{5v(vtw(4$ek-Bh0){{3ur} ztSH3-Q^;jP-eLH%Hpk4=u|zq>7ZZ0HkMa(iiOF7IUNY?vrbe3O+>Y%V-aES9{m49X+1)Wx+SqYi-xvMgrUDUcmPkSa_!uiWSbAAax0 z*?0(fA!ArRnHG~B#94J5H1IeFKdL1iQ&Kl0Mg?)EcJrVUr``%Cr}@WX|3Gl|3sK2c zJSW6w{CQ7geir>9|YoG=tIC`poFeiASG@?$6E7zhW2@giy6w{TD2Y<9IL_RI62v=lau8cs4n{b=$#6^3!}w z1OX$KMUt8Yv0q|NLr375i6Hni%>Zr7$}pk9Bobn$#grncP-oeN#7N^4EjqqAM#h)ZX$QTI~^U=#viT6N0+>9hE)JC z0JE+8$5-WiuMBd|ts*#H5HwqkWdE!n1U%o7neie?GHlhHtlwcv(XX-2dBwl~+9~#D0_oyH<8;nl)8Ag2K2g{#*-^mm9 z{67EmCw+fzau5bbxyd~(JY>UNYTwOU4>1&s`lNx)psi*m(wTe5J zOI5WZF$x#xTrN1hsyB^7S!8qNE?Cuv}rQ^z-_X*L@1y&W{&*D zv}@3*&zCB5x$Eb)%GaM=z4+4X`d8e=O$Tq?7QXljdg{icd>mCi8neS8f|Io5e*78h zr)zY35!%m#JB7S@Q*Ab4$*C`Ma9G2ls9)$d&X1F*8ufe>mE8P9U&_L8k}LHs1Y&RM zPNCT!1&3lt%6w(WBya-GrzlvvHpr_$C^#gkQZ?Z~QO|bv?YhCL*3#~5>n&*1F&F^-W-@~yd||HbF!t@2Jt<^ zo6AyPObC{q|DBXxd~o;D%Hm(=$<_OJK9{opXkqn2(B&zur%+%y6GGqZNg=K0^FbMK z5zq1slb1uR8h(OgNE}YVbsyQ1J2KKjVjY()Q=ghi!YBe76uNhYc9vvK>J$;@=G>y) zRtthrD?zF3%Xya3T;MewdtL^GBJV#JmGSz$R%hUP~YCK{zt| zf;E9`lB8oM_4w#mjbql2rg55CW@)tD8sB|vbD4SmH{VN?wK(=D*H7g*<(VKoQe^Cf z4la(xl9eURVi{k#{Mz2=-Yaio&xR}_jKpDoIo#uga0a-l*vI_%slfA!ki%^unQn0K zq;&=I<(c#>REnzKSpt(HZ}qs026i2Io`h; z3LOjQ1Wp=@34t|7KYYdK1tp}=@auXrZDur?G6Xg$ z88Gn&C~y1u3xi3BY@JKb{BdTvl;=DeTgf8e)-j%ju7%Rta$bFqc0PRb!>@ei%cV+r zI-Po+*K9VUDEenC!G`(4`|SAZknno@03y#;K};QL*Ct0I@u#A&~*) z*^f!&y2IeOufb9*%+0!kmDGrof*=T5ZUZ$cTbs|m!k}!@Ut;QK z4ik6mPU5eRaG7xBLeRZ;I`YPoU;p~oeqJ&I5I_JSf^th7J_;h2ViAXk$q1l4n?Rgl z6cUtROgR)I6agGS7(tXWkP%_R01Lrh0tf_dMt@c{13{2bKmf%EWB{lPj3^K>$_N1f zi5LcHHX{n(d3+|%VhX{hF8fqwe zW#gM~-U@n?ctTZAP0L%Z|H_wke)|RaLi^GeUZ?!-?eG8Z4_@E6{sPykz3Y73@hynY zFX(el^m^tTn$cnoD|2E`6S+9Hl87_{cV0NX!+~`shm@F?WRpdy>*a8)Y2isK)Y{W? zm6@aZrb5DF?+k=2#ES?CENk+_(Rc3E8bSByKZc*YS8eQ$ zCzlFU7#=L95s>jC&Rd~{V;qXOG^A36LWdw41Pm8-qig|j0rZH~2PDa;5rm_%Jz&Cd z)ny{jSy))4FPwY(Y{wr5zLd>p=UGN9NR`{`Pf#Q$GQ-A<4q^xtg=LG}{AA&hLA*#H zdnPQqT7yabxFb%zSPFa+ri>y%m`R!z^{)svZOo1&vFiorQ(Y`>GV_l?4MT6=&&FfR zfvKvpB{i>0*y0i^4WdbcTSzU|YFW~evy+~;J(>o521L&dA{?cx6-0w@TA18gG44Ef z{=(_Azq)T0@^*(M+=u`%GE$Ot1aX>XF(w1bN5PcUm9vGFAAPX1_tr-^^q`;-7?o(E zaFCa9gL4%rmRQi>B0=6btv*-NT4}zishd-U(Xxc8u9Ye0Gd|9mY2%4AwHk5_oGvPw z`ySUiFBFV;iY77-I58KPk*#LQVv&Oq=g^$*iqd`@X_$#LB{JzsTJNn-5&Ml?rh6t{py#0 zRg5FUcc<+(n^J=oM3-#LZH{!`h>`^Y27=#LU}NOw z6fiO)HH7iD7i5S6L^vD~3>X+93|JgeoIn&(lrWI6D8(>kV1!`801rYBfCK^rVFoFO zD1-n(03pZ#;1RG=Dj?vdRAexM#7}|DqQ8HodQBIyPxmoDmDwMi%>L;ge(&(%CtqDs zZXVxIPait$kIQCwdHoCj?b6kso|4u52N#@opTH-QLM5>=lxOP}c%O%^vHKOiYOc-Y zq>3ld#pXGwHsdFOh!9g)uA)*kr##4QYRqP?zEsdkk~V9XXCDnh80bEYhbg~L=Tmaw zCd?yTjvXJSFr6Q+P|ScU#i^4=vjYRb`k^zb>b z|Fo#DY(7<=y|{S(CAEBIX5+Kc(r0;TNz8Aqv{u!|nv`2fN;4Kx`&637+Jv%aR$!Ug zD2iQk5ZO*@2euzrK~S0ur_Nz!CDc4}%tN7n!cC5KudBx9av2xv?9~gG9{cQ<>W}?0 zf8`gp#fyFW+`e-4zx7Jr+n0WPqP;hf9`3pQp)G~RV%o0zuYYNJq?U9ngj;k+7BNFv zHrG#6BQMDwP*>RIaq*m6xcH%e)as&4XY=t;70%ycv_=15L1)F1;6~Y%{QM2?jvQ8I z#`X0lf8~ccvDdZFtI9xGt2xz*&T@Ev3{K04Z{?6DQi_xN+YgffUSLL!q8+gFdODqt z2rSLNC03+i=NT5C3f;p=cisR+zcxF&akioV*3L)vqixL4W-850?dJ}Mf8KrQp1b`! z%tAuG{4K)&;=R|uvex+h00F6Kl(yO{lnj^pmGw_+x)F4olAP2`yHjsw;|A5<@VUT2VzQ z+p#01W|1JsgG!=~^E!xo4lPt7BW0+WCQ4wl)CeR5E~5yF$_xdlRD$x0 znBz3AZSzY-RvyDRjdDd6OtDtNdcLuELR{iu1x{7-Vbhxos^>=2yTyo4ND54QQ`T?k zOu-+sNv|lNn9FGDmDA&h@EvjMp7HS}k&AP@iggQ>2(o4y%M8^xT^MtyJUL<5Y3fBH z?G)1_$Icnp5xhgi{9q&Dhb8#7bAYpx6~{j>=}_YCDQh3V4H4xgv6o9aemYu-b9tQh zu(ResnO6biIZ2KYetdp&PaGWGKa`W9udBeToIn5M3t#y)tzHsX;VWPHaug?bd;Ox} zFg{chSTA$?bcmutgK#3aN0`hOL?()N0%4PBRW{^D?SsThI1&LebR&UB=OUq)#`}7j zDH}^~J$NlUNniTh%Na?#oo=mG<2bI}ZfjaDr{~U2PT%Y;**%NF24_Q88U?%!`;Joow8X^>WTe~{aRZsWLc z`2%P0%iV8Zvu`jW?iChER*wK-#)BrWZ0jO6jps{i>c*O0D*c4ydP!@RtB7*0FQ^A2 zoQtIW+}w9M2P?kE8t>t=htztsY247^Sa9ytf_G_h zf0mwH&QE>Oe7v|YE|r1Tmzks?s3R^3Ja#9%{61fw0eCL2pJQ;owN$ z!BzWC)ATDYoW-qqlEs7Rl#OX96n8R#ABPuwv!&sImfIT*h$H8E z=1f{K7qxF3{vZjzPWt&`~PQ@-gxorf7{E+ zeI{d6MN)NP5J!xiTwkbO8nBNJkKb4POF01tkVbNjCf>u0tq=s1#PLr!lC-jz&E-Cc z685-zCzR)>PA%8GSuYItcc0X{}x(F}`vZgiXt@m6j{Z7?(qu7OmP#3L2I57+mtVm8^q!{e3i!>i7t z$FFD~Z(M(6d*=(55!Y6z%Pwll7&o*0#u*ne2$cYa0A@7Hrk#Yqn6fMuPxIAY+VUU&@ma_@F&FsQ9vOUtLVqgrhgb*!?IJc0cqX4eo?rUr+q;t+ zH!#R3!&5{w?966HmF4T;U@46v*@jYssx>Wc7X-E|HM$_Z<^WFWifAfp1>%nQ==7G8 z%{T$C5uFz6^J_OyVeE$I6(@{52}$#$E21l>`Q{QV`g*m+kT%trC>)j6cR8Q)fFuzK zvl-4CF-6p)a(V2Ad@y#Ur6VHnhOdX}G2{Covw+xqNeW3?>|v9&YsF3R>X$yq!b0RW zakrUN$Ex}+2GrP1BC4RQm0HE5J8K+MULcH{PhyPfhpgy0te!*?)6^RC`_?PNQRwlR z6rSW8mp=EEFBBBD*=mi)leLR0{YSUYdcK-a(TSGl7k8zR<2j|MptI^NECsA?4HK+sL(_J*6KzocZ z%!X%qxiaxGmRW7*0>G(G9ESFt!0a34usJeu@DLBZ@)}|OEBWLD^U1D`k_fCS2sl4HG!C)v`)Apb}=ih_mI5c|E_$@Hl+q7O)XeSrkpQC3N z3sHqTSdm7nVq9x!nj&73=FQ4yI?`ODv4N`V`SMJzG{Y)tUf={t<9IoY69ZcTI9>-{ z6?=JB7bKW)_Omqp=J3bW9b&^}R_lc~cpk68~7Wj^kio zB0+_AxNIoJy>XP$puq+d#iRC<|%0>x|0xlP@Kc!F%3I=mn#YvGn>gC;? zAZs#xU58z^0jA&iYX2rbU+qG}MpPc1!#LDS()CB#*z}ifb zAn{)I)9!lnhR=uoU}?;^k;OvTjmjt-q&UmF;I3F$ zom#VV!p`BbPAdv0+0vkIMdd(h%q)EvJD~TmnpQ(WI}Q!?L3n<3Jru*t&dso^@6N71 z>`s5B^8+V&mp|G3(mg9HKKe+hl&a-?0ka44%qTUj>3ErFMIjntUyVE( z`3o{XDT*XE;&`x>F;Eu9a^1?(gf?!QUTt)L&h7}Is_1GmuRM%dr#N#vGpGG&01{P< zRx<%fdJYSjA~7N_L(j_8N^5Jvq$h*1MH!xmEvZ?`6_KXC?Ptgd7cx)eXD3|92a}i) z!Y~S_cD}yQwY-Jq+6hy3MlqkH4K7G<)EVtfV!MoUiYPLW)0jAOhXkg1MTuFZOc)nV z@ArHmn=3UhEYE*-W%1c;_TqH*#YKIiu=v7v@#@37Cs+LrfySEQ9jKg=7`80>eD0LV zMUYEl(rlFOl&b&qCpX-?w-`aDoJbfbvY>$DMcCt5Zib(FQYF+M&!cH1ip9`TCH5F( z1>dV?sl~1lB&0l^0kJI8fb1_LdZLL&XV6Z$$Qhnj92=K3EYGn%;93*V*AtgPzRra8t;nTCq#=m;t3_?nPR^#$5Zam1Q7GOo}6ATdW z0VWtm2)QW=AW}7G#2`YzN6>{Zf#56xF$D|)JOgA5t(1xwcp2akjVO>9=mumx$A0?> z{YzCLr2zkr%4B@nP5e`t{n6xRet7ii-dmd&E9Z~1w`)&*680aD#$RB{M{Ca!X6a1& z#hdK;R9aP9*S{NWc;Vbl(0F|?J?EavF?r7(pSJHbtOrj!AL-;B$^1BP|MXgNXPMqD zq<5DXr!1w5?D4F|&tT^9^UKw(Cl+Tes;#BM%IEm}+U(M`+RQbv`2<51P+H$jxt2g@ zwALP`!11C4@)#wQk+r-g@WMaM~M_nd}d%`BdD_M{QPX|!c&d& z&ug1c4Od?p6rTGQc>JeU^?zvV_uJatQ`R^!$z*`-{d{nH&3XSx@8hksQ^u#4GQ+8} z6;=*3kw+^In|})0tj@LBdPx>J&EREipNXrM?Ma(!m~(T&t=##k9XD|>&ay^Se2`z8 zF}hx5tpiH==ul)%4xriVoif2z8JA)0%E#gbDeYba>3zLgpVD76q9-*yeB!0oiHcqQ zqKJ|O?P%nd86Pru017J47OHwW?Fyw!qjbE^vAcA#MI>0ByOEA1OJ3t@Zz$I?Z>0U6LfbE7C7ygDzhOgNB1?1y+pU;QN#!!(`V)86!kI( zrx~R7!)tQT#YX6)8s}KyKt66Ly2gX4#l}DAn-#N#i3ydJd2 z4hvCPuQIWdPe*xr=5qlCF6DK>9_S?TLBhb|2+BAJI5jUL^&pcE`{_bx`TlOsIcdcb zav7SK`LYBrU%5|g)^#2+>FL=XlVQM`ri^C8*__CZMt;27KO5zOZbqi*lfjqSB_ ztIJC(j^ir2c=MyTPg7n<5kIwOo2`RV+q3;L(d*jMF@BG6)LXeLiW7(ob)!OD%C;_4 zwg*Gxcr0KLB~bIJhRkWEBz#?!EX`sfhK2gWHM1zbuyU@1_Mf| zD2kuT=2Myd++_CspMLb(u9tu2FW#Wc`#xKS{!7pb>azwX4*|G6JPeO+iapaG-Ua4c zE7|zn_@rY0@Y&$tVv%avy?Ju?Iz7nC>_)xTtZC0IuGW_xE3_`i)iq_|@zrxL$IYi4 zaotlEaCOV3YAHW!MB)TslG0%!C4vVD*<9VFzB zsL{#5u{SsI7ZnG!gQLu}q-j^NPgYfN;mXD3t4|9TpT^qCws`$5?!q6M&2Jv7pA58n zXSP4IvPnm?Zar-sCOJ+|NT^ntwozw3nL<96o;?dD zbBV&u&3rV8cxO~1gA?D?N%0e5E$-g`96vaaKrTT?mQf5qBIoB5XCLgG@a>xR{Eb%BP9loVL$9nX}y54s2qM1pk&s^ibK7ROsr9PMom<&xxh8 zM6E(D;Dm?+Oe&m@Q&ptjOJ+WtD9fH32Q8)#FSX+(-kEtd~ME<_j>lt zB-BsCd}LKNSn)<~k@HVD*Q*NxC)lOJxz|wk>*Jlyaxoh1ucv)m=-bA$pVe%lTK+*k z98ZZ2%ouW7kCx8-F%u4moWCSp<4@AW)J zSv9>bib7%!&K)i-9clAPvVAE$$1Tj<3GbB{_5Q)ZrYNIaRAFF_tpR=I2!Rqw zWH_auI>dqqOuVarD>JbTxDVN8XsTF-romeEN7QE2ZSsvvS79be~(Cx9hyq_A^$u!4{ zNS{4%r>fjcX~t!OreV|Sh)kMICmEzxOaY|tfSK)nsxz2PGRTYeln(5%V4PLcy)+pn zp&7AKiJNtcxE=3|&)y49&jx*TMrGHFcpOmvx!P?8&50{e3Nprc&Nd~Ws*y4C> zUMlg&wbCDa_XE^E!3@e+j`DILJ6iKzx!}H=*L7Ppo2i$N5=v7wnE*KjnB?+8lA4#0 zeX+@&F>)=mmka0jisI@1%}Q|GHti&wThYb7#Gz5-SFYSPPi8z$)Z}d=nDd7P74PA) zIE^YCIYI!U6bMN)^`T>@06x^_>)x>}E`ywosV%S?7g@>RL}swVf?_5BhKV?BRxgV% zXs}F5)PO^~a`Vmo$yat>ThgO5y=mErZ%k$;tVUk*+`)t~Dc6+QLR*-@e8o=#mgXj$ zhBM0qNf7!ib67G4C5}rdcy?{gZ4^G)`#`k&>`X10T9=p4&8;l;y1n_<+~K%)=kQLM zD1D-6hSX?no`JJ4Bh^56s?{U3;lOLTFqB#$z0YDZ}bu!mW~G6`|K z5Mf*>=Y;LvdwV;F=VvdDM%L7J-uRv0g7+8%tcF!q^TNSRhUz6j4NA#6Uu!Nq{5* zA3`ew35L1^&LV&?2nk3D)i?+t$S6oDND}%?760EZ3V&@w%(0MA04RYF-o1PGumAPG ze*gY`K@k4ZU;0bK;V@0p_4W0iEvcXS=2Myd9Ax&&`+xuR<6D1xONq1ZJ)XU?Bz9Ig zsaBSix>HC_SEZ9C-dm)jwbixa;*40X6_EV|o-Q<2^0Qa?g{KsGw!Hd6Zs|Iozb4LI z2f4Y^NaggUkd|DM)=G_uJ>9d%!C<(iFvUE7W=|c<%L#mjv5}-jIy2$xuE>^jqFx@$Wos$FD zDwk|CzMzyoQVORNN=E$1uV1smu#!KKOOFtEWFs&*t{cO`U{`R*1<+a0(Aw1(^{4+t zdF9K&{P`cc)eo%V?{&*>^h?KsFz$~S+mQXEN_6~Kc<*BN!MreONEqcs1;;aNHIs@8 z77ff*@XWR@2mn;DSIKxFoWI2wi_X5vjs*kqQ7MjJt3+N;YREunX9L#UU$NWO`tzqu zpa%BiBK0n<+;0yn>gRr{%xa^PH8duT1K-M?1n-?a1C`ew~ zcu4q_@nGGZsCsLAw*Kw$UGL^UsSZDww;nz33B#vf{84y~udViT=9LUQ2B=o#dFC!; z`;w%Xyw_k1z7qQ39fQqxmOF-wibeD$=f+=|k3 zqXe;9nmdOu(_BoEE4qI8h? zyvrJTwdlH-iQR0HCJD%LyP%k!ZR?$FAM42Wo*KM%Qt00r4oaTpR^|mb@i}`Emq*DM z+oP6T`Y^F7)?7DNNZmo5ZN9^@vPH@+Tj~rKX6FuNuNpHryj@N+T^rpEl7q>GU&&Pu zDhFY}xZ`aBYa1mhs5zdOjxZz{T+EkzwUj`x#0evvC!u{Y8e|eWK_<Bo?+%@Lr$X5 zYlte~8H34rF>JCB6P6QXwY=yNc3xc@s?20)9a%joPLV8#1QZ1+;YpmJGEbspk^}Ly zwDA6zc+l@`0rLfp{{TZm+us zA|HxyS|O4KCV7~ejjdC)96;$ls$*li5Sz-yg@63oYyQ2Ph-V?gK-OFI-+#*f;kER{ zpS^gbW;xQAsKT(8&#)D^1dFw^94uu>Pugn&N9Hbj=5#~kJ94ojc!$VxH)*=qau7w6_7=9r^NZTBxF^BTU5M1hGg zO(zp5m)#)9(%D+!1oLdbQDW7Tr$Lf(16*RKHKA4iQFwA~?_29L&G+j|y>yD* zL&-aODK`As$EV`@ow+MGI9v>sp@cPJO+BH)1f6tr)%A|K(`D=7vO7rtw2+pol^`dn zx%6RrHW=85_?RW3RDXJPqgXDE#^c3i86AHH*oSoatsyvXGy%fYE{Gzec4ix2oD z7xf#SvycmZT8Q0oy+8EpQfuz9rAMRF#PvZ+xh#$q$qrmGvC1SXRAdWG-}&C}-+lXg zqmz#Y_kTdxEJvnKoV$7-tRSBr`cY|PF@OK0#&Z!TCYh2wUH^V`<4KFL_>Mn)Lj?aThxA@|A zS}To#cIn!W&2820R178#>|gu0tC|5JJUctRO zs_6fCf%`AEg!3Av6i@&V{AY{iXf!%HI$~M2(P+H&)?3%EUAuhwaWdSb~( zW3-=zH_t3^@S4;AG3Xzv)@{{$Pz~*Ad_=5p$8Q+U;fwvZS2O@oqH%bowtN~msXqx| zZU-qNYf1CaSg01lmD{cL!?TYcSI!>>_SmO58RVjeQ8ui0ld8M&O5usW@7B}4obPQf z4Q?vlqkIu9)P=d_&AF>zCM#QaBK7vD^t;a74^HKG2bwW&~mi&(@%w(Os z|776MVn7R?!eoHSi_o7*oeI89QtAK!002ouK~$nxNx582(wC%`ZpSBOi}t)>o`t1q z(Nx(sE2)uD$$(S13}FivRUtTS3AJ2R&V=H?jq84ZIY4Tce&oSLXMdZHXGfjuY?u^^ z164n^!dl-`P+85b4SfopD6~AOFY+Gcn;(#hi&bH?T zn%B|}VNHY@*+_@sz=$_?9-?aYDmJUM!rd013SE>{;q z_gv@4>lc6NorNb>CO^KbAZD7+@ujh-zu?_9&_MwR(@d?yiOzI)!}uH`M({|@4#w90 zM#!WY!=P4i9*k|XBDL0a&ZuntH0W|ir@tvI-)tgeunS^qK)uT=&zh+8FpkPB?*YRZ zL?Dya*mTGwM#{9D?i^|ymY3d-LM4u-iP#8(G~Elr(KOT=M#zSsUMY@s_gy7-<5H(UfpKmCbYO0hwOx!_83Sl6o6myEp3CE+j z3>YVxYJ%o@W;G|A5dsLJVU!`MkXPK1Ij_tV7grx4>BnPtE)EGv7k#JZ9aK?Nmi1hr zI;oxGQA=F;e7CUhG0~dDpUD-doGav(7*5euQNmGP6apEmGy_@EjC8BKa6dOU1@e&B zsArT+r#>_Dj-o#N>5rgiP*DY9ZY90@qW8*YBk=LYm+$M%r~OeGIR@j^puyv#A+;MB zM>)F!%tgMsTWZCIxdez9f~6qi$>!4>+^G)h@M@n?$*Ca@US6f8S+ zA27BpE9XreAK32VWIwD_Gw2sp`5rf8j`oW&wOMp+BCE5{yk0(^%gK|-ET?!NI!PqT zvD@<>Rimnatqg(&;T?`PNpmDgqnJ>eGMT`Y>&2R6XQTGfASu+6@g09`Hyg`I92HBI z+4;F2{G-1oNm>}=QkECj7w^*pNM#xn&pYt0G6BIxEPwq-4C3^j2o>T7CTh*EKqokJ ztdL68h%X8%_HC2TmY3<%Uh;*N`ej( zg%?nAD%C}Mv>u|-;<R`PriOvxeoA0)#-Rgx1%X3#(X^p%+8I(2&A27Yrk4 zW}u(JP5|QsK!!pDw(_v4fIqW>|LZHvf4ItC(GiB=XKgWmCa$0TzhzmrZSU;tbi3W1 zot+C8E@+xIKR^Ge%s!Rb&rN1Oy?b~D+6YAH(|H!oM#u_v_*3q9QW|+W9HpXY;>Kr z<#qc{vJVO4eN%-kEWCFNWJyDNt3BXP_pxU}Z)o#!@*qRvaDmKRX$87FOE4 zQpT$f)#XEyAD=or)_)K>@u-vc9@vWb&`YRc4bm8q{RP+e6(_JC~9;WNG>2pFx- zWuPS5_ubLlSzc>42k?YrH|Wv@BNFA);|1g#%s+O_Rw2R$$_re)rEy*!Qim}!W{Zl| zxy46})=MTU)GovHoj~B);}^rY|JY;yAWN2~($g?~U-7l!{mVnI3`u^8``yLaZ{JG8 z$!Dql>o=s0(g5}$gQmaxW%KtnseMvvSd^C>S8=)*;|GW@?3HR^>^uJ6Wt(7jalLry zRyp^oJ8C-WTy7?%x9q_iobS0fmuF{vAqygl1yzlk>YUWastoc+50tzRSmXyC(A}C*a z5Es0WD@|TsF@npR&-@3)wZ}e0=dOPJhvV*_iEh4AaaFhYf_SChT;7w0S&DSHo~boV zk0r`0sOanZkUYu-rbKE%H^RY;QJ3{{VI1aMa(I|b`aRn=IUGnU- zlzBlE3sk^hmxZyN#@#5+8%~*H0AN6$zq$->1$m7IY7#KeAc<^7N;|2eq1Cc`l#gqb zB3^I2&$YKxx!s?p(+N(cAQZExvWB|4K54=wTBy04>|-)$-)4!l8^t3VDHylp6h~ng zOs%*&@Ibe7upw4>RVx(qfDBKa{K)Hz>7FX&7_6z9Zm{C%X$oZJw&QZ~lm#)e%x7s@ zoUMvt9dc&An|iiV}Mv32@E3_v;vYe1?PEQ7IK2cD#Rvb8l7`+$rrg?o*J z0m(yUkq95rxKNJyDvIY6s!;fj5+s(tRwv{1Ia66!~Ak^qUb^;#4Q zs=SkPJ=>l^imlq>V-$G_dlH9p- zXMKJBt6%-9q9`xF{Bo<+div?7Wm*0o!{}#2LI6fUmf%7IJ#!9Sn1@>}G*<%WYH+I# zH%j1{I(&Kt{L&2k%j@tjucQBH4ZTo7H32dZq!j$DyxG4p0gUne`}b8<{pwf0D$BC# zx{@SqZf<@mv;SWY=HH#EEQtUDu~g7BFrl38BV1;@Q`!Z*vP0a0y~$*0yL)4G~f}Jq)(;El%LE2USvF*(Pq){ zs%64TX-~}RN((hFwT(g3f@IbbIecg7c3FuF*Bx}4S6LQj{i#L-=-Wb`zm9H8THw3m6!@kZ-_z-F4Y+gJiAMVcrF^F3{p8__HC{yaeIak) zDr-jtHrh~{Q7xIYX^n|bk|TIV=Y@DDJIHT$8}n6$;-voM+oQPEy{XSNi7MrX-7bhZ z-bP}X6Pk#IG<6fwhS^l+T5k$1JV>jI!s^dyXp~MLR8f0`vO+jJ;x;jJdxFf^ynaJp zhQ7VlL!sUOg^ibQv&apT%W~|*0i*}lvkKz10k7=9)5pUk5-N{IngaZbSR#xv&Dh({ z=@$)C7SQXNI!>1K>|l>sixRYqx-8o*va8uf@txs*^5`9xx%hsM|B8cVomVf)Czq~N zALYLEJyJjCo?M9EX~YV{F~!#7yCMNTk^`?H=_fH$i|8AZ{Hx&e7w9e<9tFqnO71HQ z^X%L0H>{ZVGOc1Ssg=0xMlblIvqE(koCrZ-qLiA(-Jm&_gt=3xb`)e+!aEtXfm>#H zbg1O=o?OfiZcEkVBvj}o%ew6>R?$fJvCXP{mS=_W7IxZl{k1M=bbkC~r#tz~);~DH zr_odMJ0Ja$Z2fsxeWF`opMLoiynC_x{af^6z|M`i`Dtn{d1tIt@zo2VYkQ<Co= z<1UPm3?fWnp0ut?t9Q%i-*%HP2YD=a3RVbEcE>vj#rYcYxj?W2wvrJ+mA88z<^z4B zf+yW=MXO6HpQ#(%=+1Jf`RcH}W(CVMQ~l)BA0*SMabm^_UlR&J&|3wGu2=fG4Hcol z@v)j?eQ$S+dV=iuPE8H0ED$Wdg5sDcABOoku_aQKs0ph|o@2r^F{ENI@zRt@;!tvf z8GrIlyZ%RFgJzJcFgOtc$;@NOnYhe$)1KZ8Oen|BKCy!L{ zel~itPpS*tKO7BSnw}6@41xCW?87ZjcWAv^f<$Cyj*%;dfh!3MAi6J%hoK0j_T@OB!K3Hrn0V{bAH4R~uGh>8 z+~51j@BKfv{ziY$*JSlS|4;t>-}*c1RtTW3Z3-MRb45@0_>f@2nu$!Yx8%v{#4F7(9!`x&ff9*uG+{pz@Odsg z4dfCF%vpBsA!3E%>S=M^Ig4eDSl#{n?1f|2x#-(poW5&lk(*7q>_;0%2Xi>+22npN zfuD7}{5NG80APN8{;&L%zw)y?U-`;c001j1EC25v`I!LeKYw9Sfkg#uG|<1A+xah! zveADDI|ly0o`A0FfA-J**`M9n+S>Y8e*H8)mD$fB_F`^|z=igL@sM6VTkcWia<(WAmbrNRpW@T_I$$Ty-`y-4hi3+g-p$ekgq|4^WtqL z6uQ<^Qsr!ImqsgH5i?^v6MPnK0qI(?T_{=h!Vilv_$4QL(Z)_1m zF12EqJ{{bPQ8bqZhca){`TSIV?4mlYS6+*h8~x#`$vnnUT9i+yJ|E#@Fz}pF&8)Sv zlI|Sj16v`mJg;9m_ZesLyq1aF!sWj^N)D#zG?H#aFg-e*O?(NOk2{YP(5C8u2X+zb zfEBu|zaIOe?9q8x^)LVXkKFCgx9`p|GrOXG)UWI`KHm~=TBWK$+ltelDXM{8jN_iU zZ_UhCZ?${%bbF~$c?;v^v%qJUP0>A9DSRu^FYcb?9C@VQt<&}o4 zz{UC4I4IlpdP(`c96Qr?D|t2}iWk}sL18f<%bqb=z5a@in#aUv&V38#%LA16ezihA z)MR+KP``WsV<{V2@||bL!P6(FU);KK_@{sKcf8WQUgw-oU*-%1nM{Iv^70&!otR}f z&*m*A;CSfW5Bm{Tw~`N@_s9kVPFvGAPp2>A|An~r%wX>u``#I01#qUEo4!Sr&iB}- zH~JxTf0BxnEi4&n1K@1C+n;BqvRsQ&G&M)6KIZ^$JsljE>zqG^Nt#hFUhg2b{%g*_`zTHZ|Mz$(cY%<^|L zHRwi@dFMFKA0`=Bu?b<>G_X{xoiU2;Ona(c2^l0Ysic^Joli23lTO2(>ul~mLxu^7 z@X~y`%^^;ZRC&4bp#VVG8(C6jv~k*Iqj4D}I#*ag2^F7`6Fo^tGEO1C9BbyCbn#6z zHy^|`CT23L6a|(nS+v0Cg+sP?S=_MLqcz0r6McVpQlU4}J6FSx!H0C43IZTco*?58w7#3nI*>B=0DyZl7mBla3+#Ma`+j4r>@rQlGxKKleope zwW%KVed|l`>FVkOkh2q2MX|j(-G@d%#T14+u4(60(|7e@{!6ala_OiO%|zmc5%%Ii zoF)2Z;R>6_6y+^}o4);%r*q2#HjAQ$qRpd1eYWIRhK^As9=`QFob>L^^Lgq;jvnO*G!%S?6&Toqpd#d1U6gOwsxH3q9w0MZp66;Tl1NX!#FmQ zY^C2<9q6poVJKZ|{N|4r+vDRsMxA-p3Kej^ARa@%*X&5?e ziRT!d)jAnh4wL6vGv8t!it(sy@GRzfpcD(U_n{Els3SP3Z4_fmgw0W|MtiQ3d1NYo zA^*~Ajgy7`JBJLzG1VvQPk*b`$$oU>Uy;zi*=|pkWdHz-@y~Js2q75b{}~v;e_4JE z(0_h~|9m1D1ql4J&tnMwYfJzk^e+Y&<42BuFAqb@i!oT&}?t>dQ^~I;VgGZ@* zz)yGEC-0;7>zsSH;eR-j-l|1+=d*`P(Z@ynXbtRM#1BkmutB>|W#+>YzZ6cMQ)>2w z=UWw~+M1E7mnH?ZDiu$JOAgyCDiTpH?25BlKy$)!CN>~n^&EtGbcP)^N|=Dw63LO~ zNNmczQC_LvA3Rzm1c^!qqo5Mw;)}nQEIw~$mA8Z9-#ROQ`&hm)6#aHmFpgK; z8yC}iGx*Lrv!9del7K@PZz2vCH~T6)PpV@5*>rK^A-7!gj!UX%wSAL&=g6@9286OQ`l=!aY zeKbdII=SjX77m%SMVn}P{zGuYq(y1!t%Z|!RpDkfPY2yPbuBs7!uD?^-i@;h z(Sckp^#fd=FHA6SV&N#B?^1CFa0h7iG_X{slTVe!Qt}b>?9Soy#<;<%f4_C{MzBO+s~Z;2kpa`cEYbLy!_oI{obSkV{2h_%S=9jetD3F+LQ*OlwpDMd=X17 z6k=A*f>91c6G>*n(9F~jX)%unQGo(AaM-~6XkxxSb!l#TRPKL6Ow4Db&wiu1HPe0d zO8m+dp?P~Xf8U>LO|M^FTFKAINBYIXX?F|h4uf3E)Z)OED)*!(i0Sr_T@M`t8*JKB zY!JsqSCKRGP-D^scyFz|`YpX$iZU|EprSTZi38z;VwkaP3LLpGF*;@6s=3ua(6r9_VKP>{w>AY##A_$5DNbHYb-{-X|CcRiclqr zv@r-rSX4lffJ9{yT`BKGzGhFaSL?VrpRt%wps9Hamu{QjWXxWioP9=p??!U-PS39; zPK#k5fz<7fuPSPycKc4Gr-iY|W&qiUn{#`d4{p2Sop+wSF!{GDr zM|FKPm^nABU6F-cEQTh;Z^Q(5Szs^qge!N{&&27amDR_OiZgZ=0$i9;>Uq5>w7wA6 zaXao69V_589-Q)SzZlyVbm{`1aQe|8$x_vtcIK$dNv%k27-?tNMTg2v&F|NQj0Lou zW@}rY`4DHvL4-iULU|gP8$N9atM5yVietGs4cSpj#zO3*L>ZGHhNNMAgQkpT|580) zJSle!f@tmY??}yKho1?#6v-jnQ=+sB7nYx9L%-Y|@{)s?^Z z{%hWVR?|J$CmU-sw~C#S!(!yJt_g)wkBm68nAcl@D4|#@BDbBFcTT2Y9ITRqdE8D} zm!pVF$m~&lnHzbv8&qq+^#jbmsE+u@G*$2EVkWTg;r1V%WWrEGMr|s)?Ao9 zX1BXOT9b>Oicb@xVx{Ni=U+d2#TYuPkXD%pNn;=6$DE=?k5)W)P63AZXbixT@6VI7 zNDr#UK2qko{Cc20(XPy;Y(2)g-JlFk9)105|F(TIA%qAagwW3h|Kj@p*|YyrV3cH( z5Cj2(;Lq;BfBgwyj4{SP_rkfK#{d7y3{V0g`sfe-cm18)U%nhK_&bbbuO-8m!CBg* z2v5(c(tJs&7G_&Q8P+boTU_3Zs`=)h{#Kz`iMT=jNn2<&aW-MkcY=CBscuWPiK7UF z^%F?KBVp2J8JrSZ`Pr;;-YCim)Qr^4h~_3Go7 zKfmzA7aNbgv{QWMhSU1tl=;20#qV_Fot~>rcbAPfuLrM4sPlAq>}vc1jNICc&iF-I zl$z>MLFm%@7F(R?Rf7s1S9R>&FO}vyLe6#h)p8i=0)Qclr43dHbSDAF)Sv`a9M{PS z`C~d-cWjdcG)h}O&CNF3&Jo8q#|J-LN!v55c3kEgAjK*JWd4LlnJHa|LRj|v-14J9 z&I6Z5U`|>24#$Abn@tpLA z9>IW$C`r!2tRs$R`(yyMv1itTVGS^zGWShUfmY`fD#@Vt`Qz_B-Ti*U*+J=WZguvf z>n{!ytC;rWV9&%y3!%pptRL_=iIOc^$cH=6TlYS$ZT{VRrC%QCi*w-P=tzm-dj@~>;invBDq}R3KKWz5~^pRTIqh|dG8D` zTY$naVJpK!e)6{D?>(OpTm0a@GyIK7dAixywj7ZRy0-i8<)8kC7yk5)J7fFx&v#!> zxsUSd=RR1va_8tl$OUq&RUtcPK8SVqBU{_(-cy6yjy(`yMMhB+xfyjrix)Bh=&0=2 zFRrZrV4?Ev@#M1OKxdRA=4{@xh}Ctd3b{dqO_AoDDJssMI)!oM=7$|$)nQ;uLHB^V zvy`OT)q@mh7Fwi37#HxTg1VniBw^BzhC{@X@hIgT5Xv{AHr-u+o%pXo)1`V19S zBq9d6qU74fS4E9!Hho3{5Kkf;3;83%+L>6rskzvf3i{W!p1yD5D&R-|zVV?_TDU#;(rINW zk7_ZSPvkYsdz|~-t;x5i^yFX+MknNGNZ;)0y1#g-nkVV$rpVvV&02C?2$DkAZfu_W&~Z4&I`0KW>^`gK9^}gJ z_6vtG)o>;=Y>5GuYu6$KkbD`9f#}Db?Q#SIZZ^!REScJIchzif^6Y)yo*eC646cRi z3x}Zl{c&s@`z!qu2Rbq%4hWW}nU+GmRjEEvH_FR5oe6E<9iz#!wD!v0&F8LuW_Gq2`cY12 zb7nHIxPYXQU2Lwdp20l{lnF@B!D6TA#-TlxmcvBSqHdlDvgRIiJ|?}B$2D@czGOqV zmP`qs4PCVCfh9EojK&w%ocLs3(pFyjU+zx(`E;mK*`-z%f^xc~XOlR3DA;0QzNpT$ z?hExv?4FkzSm1rupIZJoMIV;=2RCa*Ric&phJP@1BRBkA#GPlxA*joCr;)SlZ zDGCj-ROu+vp_hEuS~cwX78Qn4{N91t7#)1=Yk%U8q6fggLHr9{eJYYqB(I`q?yVsBy8xuy-nvFk+u4N>dPM<@HhL>`1DrYy7{vA?&H~Zowb1? z%+Lcy7inlJJTs!@f{<^k^O|^mT&@Clr;s=xqb@U;4UKv>a1u0(aU~fjsLD}r+pyFq zC`4$YG-V7SHS*rL&NEOFGA7Lfjpk@Lcp&-tsJVP%$rq?1my(#*>gF?yeIeV!>UOXMfI(lR^O6$=Xmy1X9t_v=tl)RtZ^AB$NfEbYv_ z_}#I->6G&!Ri%QPqo?CLVrJ*aw3zf(*xG$rE>7=@y^nS0R+NpoaIlL6#~JuwYK~66 zw)=Zkf8Wa{JoW08aD46je+Fy2!;MV)C9ipzcP76%Cw%b7e)SIxZ#_z$2@f@vC;GMj zyK!89~KivGQe-J$-_6A?-#Kuq) z=~)KNvbcY3hgzZsn!d+TIf512!ojJPoXWmH3Q^5dBK_LxJJ_}Q+%jA_vq+2HiV|UsWc0jHvfAGEMw6E&a61Eh&UBl3GuU78|BM>#Ecoa z6J{XbIK&K+iP*mbA^C$b;Cl1NtDk>=62B13N@MZ9%<@i`n6$~Y~Zp(y|o zqNGy#?+(1%@9yK!ClZGw^jzGpDY@O&!nim~d6h(|M{qMZA=?=arwvN3muH_p6myTPo-~qX)YbPh$hG(HMz++geu(m=1k|{$jCxgx&-iGL zk(-`TY>M4t-Z06W!tu#j(%IO%KcxcgWSGiFM2IT}f#Ao91 zgjqiUDK?yn&_Zm=Dv}MhVs&ZCO!IwwF?TV&)HoS$Uya_J=MJ1&VGOzRlb)F}kKNbQeouFsh`S;EQ5ObC{q_ zg89ke9CRS&WwH5A#47`91u1;AznBf;dMV23J|s~<>IMB?B+f5C=XTWrSNqa)&-ZP| zIN50l5Tyh~8SgPku4L0(%jju^Ieut#xrf%^09l7(gH#vXx=f&yU{_?2pTiHxbtT>BHRk@M~ZH z`u}%j_OsNtBuT#Ujc0snKYBT8iw`_;+hJ^Z)Rn>)w3*3)h#AXvvT1a+>=D zla1q#uBro1;Ko{!iN_e=AZs@>!X(a;GHJ5I8i#XObg3IT6Imd#BE%`>!zs^VB0x0@ z?Z_%jj{tVfDCGbNdtFRmLINGQ9@}zK$DX#O%q@_-r*G^*tJ&`eEXAC`#V3l}&0==M zT9p(H8EHD~x01xhqIuh;Dw=tgTv5H&xR!qDFaB@Tryd;# zVf)qWFubxq`77+`&KLfp|H8dA*SYm;$u?W`k0f?whzY!1I{M~UuYK|6xuuV%#c9k| ztou~78&LQN2+S}#mL=H^Ir61HD1UiB+`csF zs}XEK#uYQhwHvM{Usz_JSQ=Y*!nXB#a*}QMC3Q^3?B3~=d!M7$KHTn;( ziLI03wbQIn5l%dgV5l;I`*^V_lyZq3REi}-k}NlHDA_lIA|MK4XQ>k_g2{?8I!#7r z-G25A_Ud^h5=0UCDhevp80Y64UK`Wc!a}0tu;*wZ_vU!I|Hc~(LWF~Y0IsL^R@fvc zto3u1sQ^o{Bd2G}!Omi|3t@WzV8N|zfOd;tyuGki>rIFwq1Lc&HHekfGM*P%sCYnk+-&~by)Wn`Ud z_|O%x13Q`V|77n!gDp$0^FTDW_wIOquJ={9d{BWa{3g{T=lO4Jaf2s#l2fd+^+KzE~Ebyb)5*Sm9%_uG5-epF0H2S_0#O5)&+ zuzuXgz0b7aPV>!KwdLo7j_sce zlC`|lcU(2(0O6Z1mhWY11-enwC)4LHRz7;stfc$e9LU^Y(*lZi{N~)~pzoO{ERAt4 z93>Z9#hI}&rt_yfXSc|)O|q0lVcWYG;?pXc04|g@_63tCbu$A4ra~mB@Rsdq-M&f) zv*EF8cI~N&`RRoP*L86i));eVPjjKP-#1r@Tu&PN0mVSbWQ25h`;O_I_JGTjTmZHU ziS;{|Dbx6cp7dx*ymWl#asbkik4K228+{Zv&G2*2{HPfrB!{se-nsu?QEdbmV#6`) z1v*$E&?zpc#dr!JDZh&MVNJEeC788%prVWsh6OaKaPXUZS2IdS&!rZEd6vd87^M>n zH7Y_aWkyK)G{uS>)Epuy(nX>}y_3S=Sx!_i)xly>-4pborTy2b&h(!i4;>DNzxu1c zn$2bzhMAwA{~Cg`XKkq37?AFmZFx?gmkA0Bz93)1mU^I?Z*mLE`a#e?cV;TeqlY>FHiB&r4XadF+ z&s$dl%CZ$&;`LV1)IA=c0ple&&FW!Th$Ctu#D*XpQ7JSIdLG}33+&h!lZ0h#o3=d~ z_!;GTGPqv0u1|;c0&AC3*+lv1{NhQYJRS2#Vs_~|@x&W(`S)PJB(4qX{J>}q+pkMD1cP<33(BypOw;xLb3C6otE zU?LA@4o@FTbP@SMUDbUsE@ip7|@A zY2#Tk=Y=%KkNB0@}2!n9;s z94_oLX*DtkNKd1f%#(NdOyAZ-15mI>L1Z7sVE15>F?}Yan3$j_KZa(!(Ts5y!ZePa z)yXMB6aa=sy6eD8J^Dx}m9sRAp#+455jt^x@yGj&BIuXm)Y1)D8me4TIHuq(A0dtx zs9yIqum zBZ>~me%08^vKf^X@_=Uq)FI+|N)j?cUTE;d-lVpX_Ah$6OWQEO1RPtu%|3h@sU|bU zJCdJ^I@1We=eCg1m<+wp<`3DUiepaU+_WR7GciPwSY~-WleY(Jg}B8-!(wb=hdRjO|gwmjK`H zMjzk5jPq@a5adWkVlRWB99+u zqXkE~yT9e2y0dfP@X9MK<1UK@GNdtK96)y4134un@}cY7kq(R5iDZ?!<}?-~Dij$% z^i|An3?QEqZ}$%AK5HlPEA}WIf`cR%nz4ytV>F9eu+1elj4T|(7C8&(d>4>0j0-N2 z6>#4gO$SCdRQ$gD`Okmh|5{}B0D(QIcR3smx3{;SdFGiPkO1os<%h@&fH;OA=-|TF zF7MPA&mEUqw}92s>@EhS?qDRL^hj^S(`-3J4}s~*E)!xgmu>@NGJw}mzhKA+o(z15 z#@TlXDsK1Z0yGeYt+CH|+}P1vhz#P<(QptYXYP1jWqiOgA_2F>D6j+8M|mam*HtJq z+`yw)D-3aH&DJM1RfTEIUZZ+@MXR4R4|vY9t$P_~tqivaOvTuT+kX z*r|VMPWQXH-;2dp*NxG3W2yh-#syX1UE#gC_{Si)T6?Ny9%vo0H$&m%YqLN1 zwfk2-f9b2gxKRBUryu*n8_p-zZv6MT;E$jF#Grj*aenUCjDpw6pHsd)wEi&PM~e#PW9^S;y_3D?zy>I`Fy{%_=NuBRif9BtgyFasbv6x47R2Q_HOgQM^ zM8npP%k3jx%R=vy*1Z*ZDTje|{~j}f;IQTTDj?)^=q9XAAK%qYlZ4v5+5#vh(kagA zk%X{=q~%ylB8r2YwNbKUI|O640zGM{taspqabm1cG$UgflfVQ5WwW_aY4uNpQb#dJ z-+5d!&&7sq-=6Uge5NkJ36VrR+zUgHkIl60m+|B8POK7|wFD5GiggRe0tEN>Id_mi zLY&CYB=Xs*WtD~R@5s*;PLpSj)m*BJMw>w+--ro{2{2rMVzr>retGfyXQ(%$(fJ$@XVg3B+c$3r0Nul2dsKE6mS!34-a3ETwqya7IG*B00d?Uf8y7Z(AfD>c5g(0d5 z=*|w&^tHAw_iYp$qt9F!-{@Z1eeCh45=m)19uAcLxV2?Eo}|I4+^m^{9Md!`=WIa6 z(xGkPE<*}|Gm=v48&_k^4Wy}RzrEc0);MtZ-!w;h@T6wy^A z*1TZT53MNVBF;tokP->x84Cxrp=Bf*IySRr9%SU05^CA8uNm{ygQ) z#>z!+Paiib!Ai87ojlA>qHv$)r_9i?x4;Rhy~ z`JL~4N7FQ#rk{NBN$^9?iyz7l6w~bbt1n$&TU%MJruSSIlh+`Ni_{b*C;32(&^FNR zQ50izDe4$@z}Q?HjvH1QM(~c!4z+OJQhpDb(|gg9dMQKWclcAX=}=)ubRr5GP!z03 z5YXCfXPgVL0K#1-t@ySdXtM1qRu?ros5OlBuBp0XD-FD@`LH(h4|&I7`*Eg+dC^v3PIRv)KINJAjzcsu#o~vzkI= zl?{vMJvRsWX{#*|5XUlljAhIDn~oouybRQ=?&=IY9yb}qQ*9;%;|=)aq3$5Vu9`>= zp-48>r)_VLKTc!C>r^SB`T?eNLERqL$AkN{JW3E4YP@wqxB5Xuy7#*rOsm6?>5j*4 zMc>bn3%fBFl335os<4#uTm$81oPIW20rZTYJX!-uSY%?i<#}BqNLM9lJ(et+=Lk$k zw7n3&K02uEzw(RwcUQcFVv>PB{E5cQ-x>?gS-B54{PyVHA4+Pr>*qe){KF5;g}?jQ zUwy@;KGu2rXOVG#YH2<3**eLS=AHojq8&A&cHZts0f(k4Yk^(RQBzpiMldNHK8h5~ zlGKCY$kGT{;bM>{N_*^N>?5TB+r=}Em1Yu4Dx}NG79Pw=g>#3{#c%cr?=bv%`^{UG zmG}D9pA|RXgSS7Yoa{aOD}Tr5wLAC!Uj3aD%i-Tmf9iIh{+X?>ej&Z}&FZtiZ!IP^ zuWuPSd++sgTYvB&deVCM*{?Y8NIR8-*dyll`BRyHOC07e@BY6;d$bbP;m5yQ_))6c z@kdvm8h`uYaNQB1xL4s(GywkK*x{zn}?Ob0TQSfhA$(9OH8*nE$3BhuzflG=i_Ws`7I z*(Qk=93@Chm?_ccXWpSd?23^m)4OA}|sQBrgtlpvG4B+N8=P_( z)wX^85H=2Lv1P!#5QrW@a~Q;9P#{Q`@q%s=0?on!;f3&~m9XTg19*NLnI@t|5U-+q zmO}O8lCux3XT7ay_nPX2x6R@tKIvpv82S;A;3%Yd+*LFwf7u=GZr#Zmt`=I=Fr>0Y z7PHDIDlwdb4hOP2X~7PUE1uxdI1(tcVqv|%F=IA#GAOvgBsAJ*6HVFR0eS?_D#bJP zU>pXd5#ZC*+oJOx1KN}QyE53_#L`o$bI!PGvDF5h7RbPbb7n}exY>5G48}RQGBV(n zqoiFyP0Sxaju-(9EqPH4V%Us0LA6-ZF03xxtE2=B^R?doXduSu95=V+)jS!!ck6m@ z(0%SBPiwGc+-~|Y>B#WIm8m_U>pBC(5?OKLhI%2dhPc0NL*s30U>|H|vE4_9(L<)3 zJi~uk$SM2!Q|(?Z@cTiC1qe(cF$QBi)`a1_4ExEP~!rotE_P}ts?W!qWQ z6k=VX&1BqST!*JBCU70o35aS0fnKxqU!f4taWC{0wl-E&>eY(CaC_ zda$alZv^n6-27rq$&?;@RiyR7An#hS89`wyR>C_GK)Mc49MA38`c_jj$zEMD2W{Qg zJ$X3Vh4e#c+>W%m>Fxn%zoLyJjNEb?^SS|{B#S~?^@Nxy%~qFN^pXu1R3fnzrb!^4eID=PMpAIO|Q0s08yKv zjkKa#P;W0qW*Zq59k`43;;1#F^)-mNY3ydK7)3EIusI$?PBX(|VT4}rp=eBVd@z8D zLr;6cuhTPG0_xEuODEE{r#%!q~Y@bW1jEAn}QQf@R-dY zYE&Hh$@PJe_9%=-Sk0mH>3(c5Mz8A-mSIp<1VRKs_#Lq6w~Vymog6s=j!O@J?8}*B z|NEwXXD5Dp2cxkwHOygKzw-;-*Q#fV|LW0Sc~7l=PQ7!SvEjtoZK2Z9b{8S8!Z0!m z;l4LdCkdL|29VosWns!Fb2b*ip2J6u5T^H-5^EV*a8Pq?!AC+Iw-675K+~o@*t_A! z%0B;iI}l6WSB>UTnLRRlWY_!p+|H$sO+Wt|$7j;-U8D1#eboc!l{H#@cCj z=ZsI^U;UNW{CH{O9X9cWFPA=ZaCm2R>&uU7wMvzIH*=)U{<6>;p2zzCD)*E8?)ua5 zTPV}p#PVyAAdMkuu#f9ILtr`7@f_UFMn*47Ux$*9`k0s~FgrAL+wIvSy$od!ver)j@I#KzCl!Pu3>+m0+K0k0A~=Q_dP6UuWjOQ< zlfsxp91)0j#|&pfI$%gzcawN{A4W;bL4Cl5h=_&_JO&)6<6(jV`9yLQM3j{Hqf0mK zMh!5`BlgWDyazEH0nL`jYZ>p36oM&62$Lucd)e%X3utKdc1;S=f^^lygk<{7#Dp>! zWMVY~BPP=GV8{t|#5xS)c3YDfMYg)*#W4kNiDQr47Gd0>=BU-346@+eVwm8XGD7y+ zI+IcSLK8l<39Zhe&}2$S1SB^1LcL|jEa9*_wgD5F00Fr`C*V-WBhwwnwlgK92LW29 zpw3Kn%XE*MHl4_JJWq~Vi0$T3-ik$?F%L;Q+Zr!tpYT%2k43?W<0s#%EZk6Q=XBVk zk4~l8jublXMAKI0)x9=7-RQIgAA@t*vD+72J3t#Opt^8q#D!@)z+u+{C~of-3|NDN zE$E2PoSLK;GkNaL-n9WVO2Y+%$`nP+v5DXL=69bweJo!sUwr3=3zEpFJ%_T|EM2!< z%#QMHBq!Wa+=FuQk((T)x(%egZ>ytnpr7TAy?X2uFUri*wY^EZE7IuHgiu|OfE0O{ zy~B|?ADQLCJro)na03qW2qr}_>_&o<@KBbXl%itc4hZwI#?nH-qa4EqzMW4b;+&vAt8J7iBg96cX$i@aEao%^&7%k&3JH$ex9#EBOxnKX^kHRptoX95 zeExI)S$Ssv1rx#$1YsEFFaFH^FFxi6k>!8Agtf4>np!pCvwrRPK)ZJ0T zG#X7CsN-SD-U{s|Z+JF^j&y72A(`QJ8gqRL5h6QZ$@uVy3Dp7$5h%tpIM2d4Hj`X= zqAl^2yp$;)u~RcA)61Zou@aAkD?iz1QmnAhLaJ>afs%6-Ug7v6=UOzma zHnVX5L|$~K77|cbplkDMT{!3zC}h7PUQ)QMFAsa$Y=;6 zkMcCgQ|xH(h(EL=ZQ9#8QFQP5gY^C-4%(pnzG?Lb=7HPZ;(IM59>!|-Mi9&yeIeow zydG}|8>GOQ7)vLvc^Ij*llW*1%hPs7Cpj@PIV7kN;Xh5v2x@9ekS&o^KH2xG~q>}KTfe!ax;H4$emuK+>_v-Nz z|0Fzr_UbEtrx;$JJ^#}m{~{VJ|9b8(*JU$j?eZvo#2wDN5mWL0vAuWldhJt{)~`uD z`0~xaq1>BX>bygw*XUndcdgR>cYe__ugxqD+h6<1VVju!8!sfLd$!6dhfDqaNfVCd z&)FO}i|sBzS$OdyUnx8?*k90>NSt7v=TFm1Eb(wU$nIzsw$3& zjSReVf0xE&0;GdzP&oZg;ru3gbQ7NW?!ln3*9~=@$FU@^LkzJ2OoSjAvh!g`hYq30 zX%jnN%-yAx(CWMH2nk{mXMDtp;Y1S_>;MxYtPE&3qUuTw#VZ#%5p;F7-$gSiBaTAL zgGr=M#I(t#MRpL^Vt8U^@XtV?4T^%pQ zWQ5s}-@{S16?v}hn>LnoEtqENG&#m#C-evumIH+2rSH~S>ld%UBs>|`KJ4wV5;5S= ziX1#TN(jpz_UBfot7o$dAJ5G`l|J#@naRbL*}gTdVR10$L>7;|jzpY^2rw4KXv9FU zr{M?%VF8CgUeqo)hU5;;f(BIR?Z|NtV&u>awEQ4WvAAR;rV}6{(UFK*v3qaL-0_WGg8|N=cSww`jkgLi|>ML~%xjClYL>Du~;VjSNi+$QFTJ@MCnSos1cS zW7UK>2g5O;Dlx5FiUL)LXq?5{*GE=Dp3;(Ed`CR@ozXP!XR?$cC`lpx*xRWRe%L%7 zC-Dp<58n~=JH6!6keK8mrJ%_$%K*(lGQaEtHHyiUd{7Eui=K!f-;IkrA|kk0_uP1F zFRH}CT=gnimum-_z%mdP`J>rf`RvKnqsvPO2;aHzZh+>J4l+`s#kuMjZ+ec7Yebp& z=&eGEl|9H+4Of|~613Z^ds-fQ^0%p@NN4A796~cfY3}sw^zjcfM^04cD`qzNR!u)E zn<>UsP|z?DCB$e9F2$IG_=uavJOW{baY{fDKMli_NK;8l1L3x*z^J&Z^jeKOS*jSK z0T%T>>|;ts$70a+i!q_eJ#RoA)38%v1mUpZ;{?`z!outNu)d@3HWE@YDN$|3ho}{%ij~i-bbo zXHWk0s{doA`_nk@gN+Z){vT5K;I{mS@YaK$q9}Sl?eEVt=`Rwl{eaW}hyeh?_?3cv zd(rL^QKDHt_z}>KQHVWN5K8SWPu&CNX`rdCXW_Zjwf=Wr!Ft5 zB9Cu1?wk)?MxZeV7n9RtzC0N2KM`4;H_s-ICqg(A4iSD@hDLM@{PAE`B1HzVa0zOwqYk zxC7*2PEDKH;t~nEW}`DOa6;S)MzeZ&UEq`P)J}MCM%gAQ%2fbXDj@>2?;T9l)u{TI zfDTjG!P{^)5f2e{vqB_nPqfJdZnrgpnZ*o+)aVEvQn`8@tSZqlkqG>eFI6!egPf2j z2o(6-@T-_3&CH!A3ho=NUcH}wY@|hk+6fT{TP@QOViKhAkV`aO~o<_8vo3 zYfygQ#%ALYz+l4gQ*_`{k?BX+=td5GqcYi zLUOeI?;&gQ;e}8CX6=>f3ojf^{L~BcQ$+KdFLW@jPaO|;|2VqYtAG4t5KN5U94`IT z?~BI^7k~3t^n;yG{ZC)n-pStHN%k7ky{}-DkfV=6L3=*hqq)iNPW)nEUtjdUUN8Mh z!rVEE|HEDC6MErGuQ7izRsYW8uKJVAy+58=RXX$+$(3KLV0(MS5xu(N4Wy_Z<3k}j zLPAS~urW`H_ruH%m|JSyA-T$T$<{TJAQzW0VV;AgaHl#ERJ~; z?hM9aH~HA)+&a?TfP0?X>i9f^&<3nkyfN)+d?d;EoT8EmitoqqX~!yI9V(IUjm?5c zm}KOs6buEMP-j7&c(n4+i+A6lHvFnU)A`68kD{S5PD`}MR|QcI2B=R>C9{KYM8Hny z4@qC9qil+%eZ;iC_!e8VI`V;%XL-(Y=m3_^CL9c+1&-cAyVpN`t6K> zZwm1Oq0B{19b{3H1C=fBb0c?SFP}7~-tdP~M@h`WlLWIIm3`PmMsz^+Y94+t8|{n+ZYxTqFjmL*MDoKL7d~QL ztGTkziDKyUcsg!7%R=@hT5pD6LK){cRw!h~;W*r>zfrrDtszv3Inq$4)9F{s@J?Hq zQJ^Lfz0rz4+dB7`pL*)FhX;!o!r}whsX3wOD^|_`KoW{)H``6h)S0aUAzOIu9DA zY2rAJqUiU$|2{b5`zXBs#%c5!eKOXcz5afAY5Ck+$+qR8i*n^$_;6;iDQ#>e#;QKyF zlJ9p{RaFp#KW&C>+YdJ3!M6YaD2jrjC{5G<*WSbU!SR{F>$l!p+uZ!vhbEI^PMXM1 zOitmc2u6wOCCrVTm%prHD^)i3x+6OeNU{@tHroR%4=Dki`)7L zrWA)8glMS8eT(bLrrbSb4a7pyoq!qYWJi&04L=NWYh&cDjCtUQhMnj|$3*tbC@~!p zOJ#8aBhuxQ4+DNNn|@Nwq>8bZnVI0Hstl$Co(H_%1VXoI+6f0u%|nLn3`r=QrL-N) z!>-duI8CnLo{Jb%I6x@4;W-g%2xgGQCPE7LNT;P*LkA*yD8{Al8?iWyTS#LrWG+kX_3#7^?Bg0)Mz*SN!-&t(46^amO zp{*B>PyJdgx3GUBd+?=&a-sdiPhKBdRcDYk@kh9&|9z$K_O;FzcUx!Y#{X}7_la#* zI{(-I89hi|f1_X#4+U3_Qagv4FZ>ZXpWMH7*_hrQw;rqg-a`9j-rD6@;B$$BM~h({ z6ag+KzGSHI-5q3MY1@p#{v}%J*T~0GBPyA2Uex@gs-FjXD#GI2$$yr4Hq)u(rYEl> zA>clIm^*!tK7S)R)l?*{(N0B^pQL}UuVqG1JEeOJJ5F!}U#R?5n;+;4VW&)~(c_WEWFsY;syB!S}W1Gd5 zdc@=?LLIsc#GsU#3=+6^GLE&o2qoXNUW=5bZ@8i7(4MP$7UVl6;4-3T;7%_Hw=7N>KWOe5@>Z|!k32o#p91OZ!a0&pl+(CrZb2BHua>EsxY+)^|P25Aye#1{M zdv|B34lk_Wl(nfbuAe%9DBPJXVyYbJWp}TGLVGZiFpVV}XaK@=oz?95qo)U{xVCd0 z#z>uj!a?IxPkaWTkZrq9K6ZMib+6lLPTH0?#Hw?vZXVLcL*Cj0T)Y``~&{pg;1~AivNZG#5}VH%CEil+Hg3mR4VK1 z>kPxR+ilPDZr;3k{rdGnq43g6FHsbw>$>AOG)>oPHIgKwC~7nsJkJjX165Udp8p_s z|8O{b zXNRWgD2fgb4>1gLUANI_NRp(gYOB>sBogg*+p;VS!y1jo0}yGN=JxhB$8o>6=wh@$8NumwR-uh(-NN0wzx(;UYc3>pD|Ga0Yf_#Fi~59}r<62V8mRxyGRG zqN$OpkkCl8LnL+~5jhwdDndDCNcjyH3MGsnIL7eN8;UNtD3+f{x=Io6$8azQ0ZxEm z$bN=5(X-;!p<0ALkxU|M?qEbcZ8<}dBgyNk5u#(N!%xB<%z{Io^{LQ9>?g5p39;U?E_*HWWja zhH<>_#zY8ZVlP0@YLqeA{-HTICGb9h2g6H1gVhi=ZO2v(%cnzw8W7_3Ylh`E1s~YN zyoZ#AR$|)K3*-^3=%9WF1KcEFoQl9>J!AiMkq_a_!b_!4knCfK&Vgky+H-bt*a_z!Vf(+nvz6f2K4cT(;jkGoG7T__-@P zFPv_^X^H=H#8VFQJOA30Z(Pg%l)h;fgp1Pum+8IowE73y(Jx#}Ka{%rrC+gS{L`QQ zTgu$<8vJa1?-alH62ZR;{d~L4{j~DSRh)af@Nbdfdkpc7o4dg;IAA&V>Ngx_CHUm6 z#fkr|?aptyj2?&X?>?*EPr^}4v@?*fEuCM~EthDJ`R9>PyK1Hh+J7^rrQF=YbY$O}Tk_PzJ|8VID3RWZh0nBdtUD(J+5 zbjD8|ggu1@nhWEjsLvQI%}9xn;ZgpsWiLZ%z4~nj8RwkGwsa)*{qU#-eiw z0>VnbR?2jPFIUF#=Q{6f>dNVWbF}gee>&Hq%hgQJLAG=km)wSiVgagb1C*sWhkJ zvAlvb?6`H<@9d8z>T*ajQ+)Cfnwd(YwQ?mi*Wa{tzD{H$=yFNdH9qS?(o&$a6F)lY zUQb%yy16@9kCxK-kk$92>Oo9Z!-kfA+#}V`po#Y;meJ10;!b*~mG$sXs{##3W>Dd$jQD}Ts`>{x6amT zw|2@LKL*ery!t24Kk{TMm1LO8^5V3A`=Xjy#7Am$rSa(Jj(#)Q*Im0maNG)WV1D~_ zj3va93{5}@_9H~$)z(}4_XkF}gJTtopBxznd1qD;M_@GW2N~R}6HciPC1$3MY~J1v z^=JfwG8}ox$iz1yRa6D~CQ`uuEd2J1#A0E~wxb$YSl+l0= zLI4?|?yVvp{jI7V9loCNRkXk0P`m=rhKhJ{FiR!KA`y;p7+nAJomH;uvMdWhP^;B4 zP4n8dYo6y#O-)_Acrl8i!C>(2yYFsoZB0#0&Cbrg_~MJJtE;AI`o914(@+22@BQA{ zvuBINqN=JlZ{9=@WOa2Ff}kJ>UU}t}{r&w%9(iPUcNfF3bLY-oym(R5w0u5~$^z468yySuxao10-6QWT{q%Erb)5el5CrY-?^h}nK@hH8yC#a_Bab|SVOS=UaU5qj9KQ3; zJDpBP*LB;rTdmgN;o56dxOEiFpQ<8rAwDC zoj7q~etsUu@!@dz`s=T6Zf>Shsdl?vtJPAelwlaHR_ix@<2OF{xzBMNx3;#{Y&LVb z-0JG8s;ck2^A3U_xm@n8x86E-?3ihq$z<}CS6*=(r&_H(m>q(kOeXW`Pk%ZL!@roa zq(4A;W*4t~cY9;!@n@d&-B1BA=h_^DVzHb;)I1xe1zJM93`1mCxC}exa*`#Yl`O+0 zB{7l7C0LAPSgC*^Tv;Sa$;9GJE}boMr83RrQ<({nn6Y5q#rdfuUFNBDzM_*z2w{E* zhlDQ>cn%{0mqnS1ha>_xX<#YclQ66zb4PtgnYIt&6sbGSqTfX*7!L+|WV5at!A@YC zOdMip5W3^G>-pAT(i;M=9fcZ*Ea3I?K?f!*81e#SAVLZo7$}HDxJDy`bkty?VcSti zMTtY~UZAkLR`XC+2Zuybu&@SE7$aifGAU~EK9NfsB$S&A@f=O%W3DhSWrwMPPo#5+ z3r_t@9rS{P{Vi~NMnRyyY zPUl2cqJ>JruaZNaHmR`3vqjNvH|(|`10^(x(2Tgb0Y@m-U}*M8HwodHPE2%UcY!&=_pf~96OC>%KjRCTmf1y(bxtjqQ8rM@?g*ZrR_g{F1tN^_!oaafD6qR7HU^MIsfzj=H%&%H(vZg zy>q_EzEbv2_9vjZ|L%9l^k^)usadK2)+4QNCP#OZ&i>Ifd1|6sJ+b&MXd}b>D{(N) z3Y6+zGWdFDO(SbYlARhI7O@ZQGxPnBJ#GrKlK4Aiv3>oWbKy2K`7wXu=XWNALE}=} zpEp&0L*)h#j<}-`iXfVgW0#D;oUKs6aN=Mw#_4c_gSTx`!kn8h%#sM2_I)3tfg2}X zr{q}?j0|P1gtDcj8ML#u<=I`RAOPBhbO7PKxK&k1z@+=3A_O9uuR;dL)kC3;eAsS7yESvsgGT%+8?|kEim1 zT@Dcfj`L)q$>x$OD4ss^EzhOKAf_|$;A%3)UZSM0AC5iQkVtFFZyiG|D~2{b=aybi zj4j)=LuVYDu4P&?z5a|AmZpwWe)Q+^vyaTqo}ZpM&fFz@b!*?S9^5kIl{A9@ZFVbVzfQ#iy}^BR%wvotUA7 z%du5bm`bX+pYihHY&UVbW8*C9bu@LkeK`}aNzoo04BhemM6ab{twE?vL<1g)HmM>C z$|lByA>eKOczI%LBDJyqovali2;RN@(&E%ZQ!}&OZkOSiwR=s>V|)O#kvmT%&^dh5 zIi!3j=SXnLTBEZ8B*1Qz(ES3ku$D|WdV^=WnR2>-R++mLWcS>FnN^Y8Jm~@vZ<|aM z4KZ$}A&-qwHzM2ui9k4D16p)4FovcDu^~c&?>dA>bK+rWw9SYh@ORf<6Kr)BC9U*g zpCl4PMBq!2h!Bq3fb%2LO*7=I4@Na-;jj|HQhPaU8=i zeE1OL)Ue)*=(UuI5;>!5G0jK zZEtTMJ$lr2-M8L)OVhOJ>1hN(Zr;3!Vc7iq{MOc1B9S$O@9!!VL0<2XKl{=A|ntE;OwZ{7p|Jm{59rxzC&Ez3G`G62%`~G8(J+`s2arEd>1VMVe9t1)8eEyYJUis;t{^{M_-O*_D z+0TCV+O=!Ct|t-+9LGQOp%0NHdF$4#bUMxR{Qdj)8HU;4--jURx#ym{b?cU8S*xq7 zqA1?EbLZZ@dn8HD&d%=c?#|B6KJcrZIB`PP^^J{ zgQ=;hsi~>&U#|ZDp2%#!Ilgpn^V~4CbqQWFb7d4bIJ#GLAtsv#Z zqD?N0(Tqt|?kRZPVERF3U5V>$BQ~_Q5)5^?*LUm2=*mu49=90l&^7C@NAwM^u4%U6 zE8TABs)jQjX;zVD3z;;G_zW6DzV8KEL;P9HHuX3Cj<2M@)=YfIu;lA7DO) z7~>(KDoSMO0p^AjB`d1e;EWzJ)QdqwgV!~Cq}f=`8k4bUNAPaAghVQE6$qG;(}(~% z0O?_v>N+^^SK8)swokZ>Iq!2lkhBp0Bf5p3dy5n$YR>}Y#ef2`Yo4GQf+YDqIKqs{bW zohQDsuMiCmd8HT`s2A!_~yC);qBJmGrO;RPR#!1Q-AaK_S}!vn_tN1Uz=rL?=M;k_hfK? zmG1s_@zFJFYUn7phZ3fCvdXQ6-b?xM{ghLai17T%EVo)D$(8B+7r7bn0E?0^!K0vM zY1BxfA1eHNJ(o8!(*?TG+E1en8SVU~VW)Ad@@)pK?q4HHm9I@avZG9TV795M#oDXS z^~N2h!xMpvqX9t#03xG!!s*W#?L^QR0L}NX&j#Gp;%P>2(HIojH9lqo3}<3Df~>0J za3~GoM2ujyp1F`rm5!bM9dn#EJ0gTyI4wH^*Ns;V57-206Ai<@Vwm-wksR3*XMLoS zfV!yFw+=BXaTtjPm)wtxs_zd`APsO1Q3DIw)64fPK!-%%YZUE+Bxv2xTYRrB#k5J( z1*h+m{5B*qn%>oil6hN+glb>?WIDT9KGH|#%Y;}B+oQyklANhwz>UwerG;AI(B_^ z-l#b-9g`^s_Gn<7L|vUVreZo0X0{@)V$^5zr?BZfDx_t$)UKQ&UrKzWHXYR(s}|XK0#ECX=q~5(H5yl|)f2m&>hIYh`8SLEvw0Zf-anavZn3 zyv#66rBa!jn@goq58PJ(fV+3^KKI;ntyZg6t5qtM;c!S0#E~OM3WY){mAZZV_INy= zo}Pa3#TN^O!t>8Rf9KAfW5VVGPlM-ar_yLV@2X9YpX=ko+XsH%GY{CPnT_V@QorP2cz z*WBD(B9WjdisQJ^XaoQ#7K_h2v;6q3cLD6nNU=YTm2oxKR8|sumdv-4bl|V~U zutQ3+*P)#-o6E)soF+IEjwLK2;bCCHeVVc?h^9nUZ4hpl&y>?bq2ssLbv#XoYCsPl z(r`&xjS?{y_`_@vUr&^s$oR0*!m$J*60+U)F=ia)GLT8dHQzA?9xFrYlsiOBbx}wS zL}>)j+v|Hj0+;qD$O)`*yS2{3%Oj8{V>cSznqnyxQBcnzD5*(Kq7ceOniN_{)NGm^ z7pjuLL15ZvN~Sy%U4`c2I?Oihylz4?0Z;+M0Ev)z z;6?;#VXzm`UZ9jH1cD%7^&k>ZgfNZ++>RxmY?DMKfbOzh+42jq?&UI#Mu*0OQlji= zEhQMSFks0!D{4wJ{z`An*d`a8Opw#Shd4kHio zgbE*wVgwh9P87BE?t+KSO^VlDGgfehF?)tehSsXLVUy8O* z4%Q8T<+_K2d6?Jx6l7J)>B)RfptC~Z{C2edj^;gVJiR}AN(Wb#jJJKa_#Ig-tUJ3W zf9bv2%O^rGO?N}bUOYB;;ER*)T<^@{ubb-Bd++p<*)Br)ii=p{k>NMb$X}ijKmOI@ z&+WrW+mAWdvtvwh!Hhj9*<&o1e*+mjQgfpGl5OlvMQ`84X+8E6VR8bVAs~YH{j!@& zL>Uw#oEWlHgG;f==T`pMz4J!*<`Fjt5$ITG{Wj>I0#Vf^7rfPG^=Je41V}1CM3?q2 z2dxkFxCDm-b8p5W28FI}Ze9T=3vO``Xz2iuS*C^7)^sP0QcsXMMj%JAI?(NBGYi}C z0qdJhoPEc{vt#(PKx*eHnXA?nv7vX5{}W79vZs=aa-F@wYQEYaw}+mLQ1+U zB^!BuLpytcCarp=Tnb7y?$(UD;iYQ0aajYBdFJNkpu^2D*tfj z@{G}bKFyruP#hC03DzWt&9OZt(j#BaIgu5OTb66gLd=&TW=nG^&8&|g5do`@;`@Imi5w0FEI@B(T{%g zFXpVgefu`YansY&Kd?kxwr#)s^2;<$Klj{of9^ppU%q_u4AhrRRJL0;7)D?|=lQ>3Opk=H@Ll$;0wc_i0(f-2Q#YY zj)5513fYf%4jlxJ--Y2e2Ee=uLj;U(D*@z2p6~HNl+k%6qSl@|AO;1m9gOHmx0pi+}syN@O?9}$beAO+W`BH7Lyhhv;* zggmi95UC)p(1<&Q3(ZiAu-+-xo5tZ59pruUW)MuaAe+NRa4zk;0~>)*Vl+mxD1VnC ztRO$-Ac;uBp}0d)NTB)qRU)pzKjdoVAmOLUE^MJ>#H99((e-`L@vqiIeb_w?XUd$*Q%#)BU0Fr3qYZ~t(-N=x??1?FpTey?)*p? z?Xqp!uB^i7*5pr8#<&9xHQT1Glz^or$y6X$sEa4T2aAP?7ZVu$M>R9c1+BJ{05R(C!!3(6#BAi^i1`;e0Zx zO2II-|K0VpV20eh>*+B?;4Uo!MbnMeVL1^2V|XDvfP5xvdNgvrCd{6my1=mM1q)-!Pc$Gl_#C52!#7e^$+iylEwPy}!y9fLIi zm9>Cl=_f^?0vbkhz=oNyObeA{rqpiVfMjD1pPDT!Ciov|x@>vy?ks;%49iX`jR7qQ z0Sgs#fKx@;um}O5+v7byw##-{HmnwgPg$17Cl7GyV6?|#M={8c5Xc2$u>jR-wJ5@O zNgv)@KPt0+EHL7P;TqHY3Lw{dz1lV=d(D%yuw-R|HaX`&4mG$xsr3ZQN?>Cm$}9pN zoeTGx@9-#$BvxH=T7y~yR1!=0pu5WxJxSYAsEKSCr_sTy{rgXKi&Kw(v`q~90|GcL zKI%W|-qy**krmCF*CU6UCLhcCV;uIMKRc2w|92Wc4uimG9fEz8we-{_4a*ujYua;fBeM={DwBycBoa|Y)4sP6+FhX*$bS65f#I1a-QhT-=$-=F&Z#-Hi!`yesIgUIXyGd@U}@xJDR#}B^z z{&W@Z4^C0kv(G;JAO`xr@&}jvpzrrA`F(pHs6F)1Ll3s)L3H^2j_;3|N~J#asZVhn z_rCpq`s(GMNg(pUeS3fE@3Zsoe;pWxd7l4o>jpp!AOOIjpR9%DSKVhTWdF7iMKR0p z;If6nnnPOwi>Nz+C>gFw_iI#6Hdp&Y@Bc}-Z}RM$J5ypTO@fJJv|MM6d-ubn1+%z1 zjQqehQG}>k-2m;n?DW`E2+PLpuGk1eKdC_y1~-YOVL5xX)VNMR>HTrVG|&d=}o{x zh?=N#AHAPB;?xJ}L_hMkr^v+%k#Tl#*Gzb~gUPBv!o`^Z=%aYTN4XKhwC$*vhI%Qq zZ-zxI%z>5+ArRP!lWc@fB9?)vL4>j{%h<629BU(BnXpXL6I&4p%mBa+K5Hj*;j7>CqCD_~LauGzt{y?zp!1WQfO3>ww>()4xXm?L0lGosP z(v)S?w>H;T;69Q<#sQ5FtyV6nYMT`oW)h+=k3a1xW*&SaoYFLS1=$)wD?W#MRU{bK*09A}Dh=URn|+Zk50q zOWqsr#9b$=p)OIHbZyw`9r73w8o8M2rjLG^ds+Vz;v6>&Ud;DwhUXA&>XC!D_h{oe!MvoWlXeSN|@_HLI}7xPEa(7;9CcsC-0(9 zuRPVd{jCkZdE4hGerAlSR6wS^;bl}8tVulBs``_McuokRiFgmhQ52;oD9pj4kUj!A zxD{*jU_0XqRdjBH?5DJG96~aQC*x{~;>|>8X>?Zg9fUO9AT*sJle}+5yiJ*&jPVmr zX(Bdk(hFUV;aw|^=x$>_<+pf=7z-flvuO}8_#p-L@G#}!sfLfNk~qYt52ApzT#1Ct zn9-uZ4#Koc*9d4m;Hst@#=|(|Zuj8XK(9y@0JWNq-W&G~#REv{2*H$7=Oa1Aa3C)* zhl)e`(T;&Le0G=blt+kGWW#Y#@kS}QXhU`Z@podT-vN{Cuz_U;W0DNmYT|Ye?90&ozD`X*WsSKyRGY<+q)W@RaxX?snP^w! zCw92WiEQesYDA;NDXP8`qq{Nggw?A?v_wDD%-k6?L_Q8Da&Os|LT zG?q(4Ky_TV3gZxiMM!Chnr!C$sW==tqkWGi0SEtiJs%J5R0csH%W^WAWLfsX5&nQA z;{9~A|H#1T2eI1s=Z|<_=X>ZgzUSBPKlPtE$Ol;`zQ>F|lSkuw8t*^8Klle(bN@q3 z9N%Zj9~}REjP<8AAHcE?(vN+R{NnrU)%UdjOr7uH0sgPeo%@5#X9m@Kmx#vwgRB2~ z%Z@#SwU7)7g^?3Rz~QZN4+Esxro-VSl;mu00n{)OyefQn4fAG)-uF9 zKN+|6{cDf4 zX5NB!;$jI2--7&O>kuS`hEY~Te!YB{x)_7RHGM(A|Pbe0gKM&-ny2m5=t z4--CO`B2iN1DHyX!I(cB`?@aPGyW(Xhx`otigv6spA~QXV$NLWrRIrUyj@ zHlJh=V$Sa|pw(A9b(!$V-2OPSd}j`Wl*(TVxMUee!FaDog`Y@r@8EA(wrk+`)YRmF zqI@-oA-rH+#|Z+X&Nt9mKT!gb*)nNT@qIYsQadx?N>YJNV<@(=aM1-`do<6(WfEzi z%;B(K3G)@)r6@wtp`M3Qa6HdIUD#ndRw_UBCP7Xadn``x*uivwjq!cQ7YoJ?o0vYx zpY5-`eZ)`^Oc-EyNOu{-376_=+iD4&fgkzoyX~92IbOk(>0GAF{N&B`Z{2PD59<1p zkJ`e++~ALs%U9Qye%XI*H0{3}{V%@!-Wl~mv-+dkG&nZ??i>6w-!&r4xNzLqFAsJT zz?!Hexk^4&c($5-rMu$i+g zL$VMSLaqZr9!voQqI~M!{lQFrZu-d2+}!_;F}{NOVge1QAb|W6ccIJ|Wo4gl>ZXuz z2|kJnfX3+k!0HZ(RXvfsFtip_sDgUDfbIaW?mcF}`eWv+0@v6^gi07dA*#R>@0vLi zP0{HI!i%*?4!RoOB z9X)z%x>>k}g|Y%M6{d7;$|45eS z^o{GUOP&50btk~`Wbx?sZe7)!S?U;`ICxhH+QbZQ;*&T$l;HL9;5GgB+_0cWE4tds z!{tqi8$=`DBtw7Og~^jz;GV}yeD8sy${SlLgR)Oax*@N`C7^y6T z?T{@J>C+pTk5pZ-gkQ>}3STDp!FKgyxnPGaoydOltD=qc zcFv6CrSQZT)>1x;5xWwXN6uLc4&xUf^HCYB`naf`$r7FpIR*1*SeSq?2vSalzef{ z`J+dpR$ah`&hBwbQz=Ze$3?4?c55|SXEbdEw0V3D#_AS8sSty4pYR85Fgmm*`n|1U z`auCoHp@P7e=5v6R zHsieN7#uA22?mu%sYvETFO0Oav~WS3ZjPiAahHl}1TZ;H&@mPEjGWWNDD+mCx<5)M zkdW65ju$C1nVy*7FH+SKT+$?)LBL~{AmiJ6B#(J!8_yN=S=I#_zk^a*uX@rHH4eZ`qi-}~}U z(ei7ng*&ao1@rKn8_pt5zL5Ry!jh}6FLvLWO3l7^?CF}YxZ4+LHwx$=qB$ZA`dktW z`!QzN$wkr$5>BHU*g`l=!-ytib=-qo`?yz+vs5=ZE#<|VE#<~~V;a)yHNF{^w4e*R z?Qf4(YWIob7oeg(ad6gT+~db-8SdiqS9*U<1K%L12G(x2AUc z%b2?W1#_^kNjwU$+{n(5)9qs?Tsr9^5Ug1~iov8*v$39TV45aFZo&_EDoVmy80yCW z>htLw1(GC8iz$rF1DuO|VAwV<&7}DpfysOjWhR%_xGdxi^%zZfz96RBgfKSrj3B<{ z>m}>p5!B^LC_|;L1zxhgUgVI7N+B=+UTp$|mH@+!%=jK5>q*D@Dxd0%$`b8#DeYySPX@0F=#fizVB4?*z0Yi+dCI%+QMB=(29Z?i*tJ!0r^ zv#r8IVjTepSXl(ioNS(+@S!WV-pC$1@60; zm3D&@12KIkqF{s6urw2N3_#%!ZbTPRT|;$%As`p~IT!~BjNzvSQRa-&+^cYrP2ngE zQS6$jD1AARPP}yYB5Q@mJRN5DhY>0wr4A&?eo^!tpJE%3LNyMK`#PK>_o2=}CYlD7 z3R)sL-0m6UR{isz`%C{xHvk^Q5O3VL@zP5#DT?B{uCD8?R;$@;Hk-{xqtWm8>-GA= z!oq*mY^NW}e+%*hg3JI6LI20qmy%byf9=OVbGecrVBzOVM-Qiv^JFaZ{L1tb_e!fD z;Xn75kp6MG96$XNf9!NJ(DILiTDFvm#EhQ#u-a*++{3ZHzie)8kQ(880whEzj)ZAa zyHr-|c|WhwqYIJZ3?1IhxT=mSuIJU zJ@@hi!Sr^k$x=d`FY&Vm%?Ig1jZQm;m$90ez>!O=i_h%R6PzWw5T+qogki4Tj^!G2 z2tU5`P-9sdhw#rNA6bMmcY~5QPDzZnt@$y^MvC9@(vyYbrZ}$0D%Jawha4jh?P7W( zO;4&)vTcWHdP$XN!vL(cfuI?{3whZTra!rhs?}lpteE%~jm((5mB>d??CVRBy4)S~$sjdKn0h=np-Ae-8Ls0Lto zvt`MJ-j&n-pFA#XoL@>z%*;;C<#&SXj&F{nOf)=91c#7yzpU&XL{?z(zzG#7V4=7U z6LFAqsY!~+ClaDZWebV4D7X^6FUzl~?LDA2YkqM!5>PunfhSL7$&-`$8>c^gVW7|L zZxAr=xx-Lxpdngy#`8c|QB5~ZTE*)C4S_mK1Ug1Js)0b$>tvtBq9BG4SssTnp$~Eh zt7D*}wopP)JX;7++&4JiI*OpVbhgf>Y^t(l@Ox$t+Q0QUm1pOd-Zn`)MtOqakT8Qw zYhs87W?=ObPTKOh44I5@@6f<87EYlnEmVQRn{OGdObhvCr1{O2)!#QO=lW|r&=B7( z=oe=PcM)?#)NhxO{;?xd$#ai7M}GnLPc#MOa#P5|`4%}22G)wBGnm_F*h?XDeE;6Z z@j>U|Pya#s$-%HOYt_3Skx-R;QXz+edy5JCvEA;ygf z#_#Nip*u;!tSv9AcS2CpVlD!S$R8(sgAj$0LyZ-4UrW~xdd}u%TGKardwF2S>X_=Q zO&rR(mgm`yg3sZr$jpKPjR;*vgMa}c6}Y6U#W765FpR^NZL4E6U!A)_9D6fNuJn-8 zpm3S$+L1lsoa|F1?0YSm)=ea9JBUK%_>z9Kcvn?JEO}s{I8&0PlpfQP87{d%&Ca(; z7)3lPfa#DLLOcb$!15>3iJj=aZ`BAGLzzT~(i9GlBeD^BS&Bj#Y){pOw)^hEz1;Bj zql8+*97)RU3yE2EY{4uNO?ic4KeC%+C`%Hd#BcS-8KYOEy#y}9$cRRvGK>NmlTCA) zAYv3`_@WD9KZM4%=c*$ruykeUd1{KwAXIu}P*irIhXzQ%v;v>SI0uT5pqB!w1>&CD zIAf3JV+shF5o$$)<|JeXLea-ih)dxSlqS+61Wkl)2$850UO_(o4#6&K?+HZt2I@&$ zYqJD|WMtJ}L#$S|p5fa*44sTRK)&*oF3`_{dv8Gbro`s5WFj3aO@Gpy

Ao7d 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

_e=ir zjun3g%du+`z``{AOL!x4?vdeLLlT* zzPf=Un|`eZsa7BCMorZwL4!*JR6Gw*S*QllPKS)@WMGE?B1$)_HAP@?-Q8KM*HdMW z#WM(Q`VL1!jE7hlzdJ~3QFi09m$N?gT2zzafm^H|m79Ov_xw>%T@W2Q|7q(jk z3j{3`f*==wah(xJ5}_Fok!e%gu62|5W z?#=wucg}9!Ts{(w%gT0AR`ODvwN1*GneG+Uyg53w{?GxM^&wdVb;~cCgkh3>pyuLs zn-(ccItaObxCx^mgOeH!8n93JBmtrzxEh9QHb|0w+{GczOfW!zmOxw=+II-o%T z0E&990n&?1-ZS&CZEaD+O>zdeM;SAFcF$vP^xc2q<{Y!$e!&XV7zTD6)`NOnibW_N z!%=_&6qG^EB%%SEDw%?vhM0 zgm88nV;MWr7sR7Mz8N_1ZbO+aT$>mhuX5xo9n>$@{vO&a+VEEI4#6}_l?WgUV<}!p zrB{^&xAq>a({w#|YiBu@q!0iiNKz1la=GmJULu|lMX}LnjE;@&o0>)qP2N5SAi;@a zcOfVe3I_h_)i=+V!6A%HbN29_(QGc~I!>ih35UauZGC@Xsm5AQ_crZRU)$FP&DGH2 zjxjmCXL@#Haei)7+Nnto3GJso{TK+su~@V#cG-~d^xY@*vU+RvR)TGsI%=p`REQSI zj?viQZKy;gX)akTb;U|SRNJ;`X0lm=AS#tIMNu5bHJeS>b>p$PX<11jSS*#V@_{p3 z-G`g=kwj?K1qQpt15??HEG6kA3p8!lDZ+T1;x0Fvb62lizkKmsEX2jr3 z?_$JDGl7{mmaqL6Ji=!N`W-vO@wZW~Td)1I&NXx9*q3%FI=13ynN+@^3LkLC-2j2Kkw^~W!I(-U5X43Hfuj; z?6{ddXJ9JXY(I#biyro+U-+_Z+qG(K*Kgn_vSlCNo%B4fQmG6L4IDdgloWfH*WT7Z zA&exW7$xD`TgJu1kwYOSasK=pvaQiH{rZPzYqu6pZ!MpK_$Qp&J>t4Ya<+rZ{$L5Q zlNRKP* zD;VTE5PcvO3zyAIZ(%Q0H+FDItrQ??2|a- zQ@|7kc8Lf|1UZNip`Z*=&5CHY>>Y!WWex;#RWh#tao?sOkEVzqg}EHm23(QBksNG= zaoZqC5()W2pM@uJdM_RBC&|A4&;S#iqS$?b%t7p&$U=@OGySIUJ10E8`U4*e+!bscJ5Sf<+p9CqK=WWDyeSq*l zSo2Veps?_bU?1gCD?)z>I70BpwnE1|c%1Q*KG;^wB5hg4z`*s~r(ViG6)+Cu6=;E} z)#0M)0Jmm7Q^<@dZ~hmd-h9TRyExl}K?%q21d=d}20SokJGy1|bhl%%+nC5XXpaIi z+nwhoAJwb!&g~T(M_ANOHAt!AzA)W~4h{XXBCNW-&o9m2<#^xD-Gj=^L2&;Ekpqj@ zS_dVbaJ}^mdnG~v%^e@500_ct$Yx!kT_+sV65?79020Vb%Txa@SpFsx)_QP9~WlbI+r>YE+NQxv;ja$QFP4T)BXd^$THsEbyO zADWcvmRj2y86JtnW0qyrYPD!I%JV`Z9IUtX%Jv%O-UJ*6SNm)s+H`KXvYOlX*)po# zSG~EP;(G*rMRI?oac!_~_z&5!O~Yt`)Jib1t-vn^X7)sJoFV>F^HvsCADtRIdi?Hq zGzLR(AQ-Y;HkBK#j-7b%v(N7v-%pFxJ9_tOWcC5L{VAS* z`(okL!ui)hPCyg>@KH1}HW~-U2M3>gDuRpKUuC)BS zKJ{=&5K5&|EdJLvP#?)M+qQSJWxLd0&-1F)YB(IGD5_X2?wQ;_Gkth#@IFh;#MB2-Wff=mP>oNIT0 zFwLP>$b_3DoO3$+G*%93sBh$r=oX@{8(q}ct22GR@_v%F1dEZh<|?8Q3TLSvX26&S zc_09RaDRXDjp_8;B?Sf}4utz40=q8Ydp>|bz74pb4>AA?hv;;|uxd4nKh+`y_sLsTtpR z{ln_wd*OW6wyixz(N~Jw&Q5Zm_}JkA1$3*58n!tPvS<&vzyUGC+JgWpg^(Bn<1UM^ zSu&{*4h``D%-Nu2m@uJwirK?l>-|{hO=sqSp8kN1Ga&b!RP_JdwpWxehVOy+2L-lI z%g6uy^e?{8K5l}MutUYr5f|Q5Vi@VbVIiJtf9LC5t@DC|djPS{2DeyYJHQeiny{e> zwFkR))AwB81VD;(Jq;;jd)CNGZ-mw0{PJ2|0c#Gd_(;n>9*B(q$C-;id0nj7wb{^oZQm{zy-$!7vSA5TJEEh$0~5xU|ZdojJq)=U;gE z*rB@~oSl7idLLR}RoZR%$l)zX{#6IW!plqxFq@TWj|U)H_Z4%U}9jfTI&a z&J`8eUiV?NyoM`SD!}kTmR_ZskiHq@X7fnw;`Iv{2@ekqce~wQub0VWY}>BaYN2qr z+mrs|x4$zxIhIRj${Xvyed=5$o$Ft{I5E5TQx8967)HI(2!+EeL%;ORzx+lQ34{X= z_6jTUepAtz9)86Mf8oU^0|LLZvokz4cF)m+{V^_^%?X0g?zA;k+l4#SYPCo-lFsG= zWa{>kfr^rwtZe15LstmWm z(uw3ZzVpp1c)(Hg`*o!n2sIkrPdVD_OU0uPKK;<>o;S{)+qQYsmXj3F#cc*MU^*B| z&@}9MsIzG*DN&xVYM|bz>W0)Qt(P0i4L8WdD^4B5dg{UkMx!K()f&yAp&{3Gx3;zj zik_XG+B>wTvm-AR-zo#uxE@S1DJ@bo>#K*2;uyhzf%G-Qnkn2o8V`L<*wg7KD6Puo z8t8iM0Nkv(L1(y|@0+Vu!kx8+<()(TPbA`zNL17GUauFAMY5Sbz;=N4mV^{WGDDH| zYTxv*yj4$)Wq;+DelZdWmCKcQJdWe|&dyFS5~=TO{^F^*X^I{Xn|;xM5zBulX^B!{ zcKhbQW1pTH8|z8E+3EfFOg`M&n(N571UR94B+3RcM6SB4o-^z=J-0_6KD6)6nmC@F z{QP4NR-3JCHg)FKo$m`{gQ$1l_Pg(y)~!HN$&YxLXyV`!0+3kHUaQVbWd8WgA6;gt zOftK_wRwmH8NeG@4D{^ApL0X<3a%Bb7?I zu3N2EqtWPJbIT}-<5>^@2eU&sLw>mY7km$Z!jq){wj*{AgPCsM7%KF+;pq7gNmMU? zR=P!@iWll{%WcU*dIB4?Lq$tAo7=g1H`F(9R`^uO$q#hJzC^f6674!3HNZqX$naFr z-vaFp-z8!;a=qW%W;g9AsnVim;mGu2u5f&C;%la=z_fMmHX@p z0%99%h&Bd2Cs?L$icW>-p=K+9WQI0`z@}+T$mXb}(|{%chU_T;(@49^tlhOuKh~*D z^)^{e9Gaf-hr(Bj*Jdq^0$c}1aRl&Pf0#Nj7at(38jc`12ta^MLSWAWV890<8bBfe zkaClE!GUBxohJi@FnGDozl?k9kX>=TD%-oP>)Qnv<}F$W0n^ke-=iVYCwY`1iI4!0 zDGB8rKdwW(i1q;h-T()R5-w@3;-Oc&=2p2;l7w!{*NxD+L$|xkj!hJlplHNZ1MS&< zUE@r}fGy0Yf;&D2fPiPTS{3<)pRxnsr`q)VBtD7%=XU^jJ_vz7{;MC)ZI%uvqqv{2Sy^IR%_TQj2NWLn;?S#o`Aq%TnnKQkF*KMDMLQ##se7ILjfE>G|y3O z4bo&-_5jf12<%pxakaA|&Y7vHo5{iNtuGlX>w%62^u*g9UL~jB%RX{LarK4Uc*`Kf z?v}DMO&+%;llzjm6eaiI!$fvvz zWlG-axd{RP++F)OkXD_SbQJEj?GYb+ZqM-BJmT4}=ZO{?NSx0+5Cii8c62$w{Z;dg zKWfhF3 zu|z&uzWES=Lqj7f$-PqdGL_O7qsaTs?jw&p?l`VtS`!mv0Y28Pn4Qj*df2enhyWF1 z!r3g1wMhMJ?^ZzNF*SGb(s_U|!r^c-ku(gWUav=@QHr8g?%es><+-&Tud})G()A?? zERO>#L+Q!Sef|rM>on?(P$-NH(bS4h?emoxkYvZ77_SVg7|I1RL7sxzPS-=yS zn~Hs}S!!w4$Rp1_aQv=7Kp5tNu&&{iN)>g7Xp+Pc3bGI%g+N!fbkb-{DGgndYg$+B zsfD`Pw=Z#Ycw}p1%`v(`P{~lyYclj!rM~*s2N;d6t}I8Rv1Bq)uh%`_KYHw*Ff}%R z>ym=6k}yvQvuO@>qd}OV*DcVkHGhjYU(4@1vsLetYx^O%K`9lp$*I2QTt8b}kglwI zo$IMo21bC3rxz7P%jXlWWAAKky>aS{z+wjv9O%#Wzx&Z)x|>z2lEeAAR7VdZmKnct8*o zwKtrZZq~Z8t;#y19ARJtutMuU4wjXq2L;zvkbD!|irk zQIvEhGd46<+Y$@NB8>Ym9hDuEQqj7;)Kd$h!$ic3pMp!l_!J%;DUx0+d|*fQw_Ror z&@nMm)>ig*d*|aL%azSzl?$|CM*{gRR%*5@X$eb4gXP%ZmX@(>gcI$A$6px}R!M~= zaRWu&TdN?3!;BCx02EX`1n+kl7^Mc)V9*9H;K+vIFoqN{tO1TyWLx$t*N{2U(lx+n zBPQfqti{3rO+ZNE;OI9(=ytD-0=!3H01SW-4gw|sx<1GNjtc-5=wqOR0RoM#t-{4x zhIV`qWPP#{3=qi4Btp|1O7a9kTQ*6$NMId-0~VIGJp=c;5N3Ow4sC@zh%izXx?#hM zr~y&yYwY9heU0 zNJEI*I65Y2uFN|99BU{3Je!pQYVQ2z=-Jf6-aG{1_(Q>U3-b`neOMi6G+W)*ZZUSV-PZtuhwm zLJ=75_b`McY=q=2vLC7S(hB8P`XvP)XH0jjp;LZ(leK238=L-(!@K7TuLte88o z6->Qfu|ki`v$Zt}?EJJ9dZQ0if%zyq00i$4;L3T`7B^{bZ0x0g=sQ zMBNt&4f9-%Tv-n9c^Uirb@Z2>QfQ0UUkUYJYs|ad|A3O+wnH|e;|7=a4G(l}&@us% zLr`p=qK=q~0N6k$zbFL%*I)ZmHkAs5LJ$a+D`f^Jez3aj4owiEa*r-Si8LTYzSZ`2 z7R&!Qj?IZ$Fh4XoI;`tPGMQ{Pn=k?&J#uKLX7-u|KT*>~KsLj}WH=R#1|e;^`NNcN zW8{fT7neP-olHbTQ3{1ZBuN&FMV{wQ?wOoBd*PLxYo=2kO%I-_p+4@Vcjitg_`J4B3v?UEJ}#Cn)RfS{yYD-EbZdJn91626TPPJB!&u)ezI)}J zJJ$OA;%1DF;W$Xs^zMEZ$8tQ+i?TE_GCCB`t}borNXsNTi8>i1Sv5rW%uUiX15nUr zT(73yTArKTKVzGAv(?IGbEU%8|8e?qYk2IQ^>f3K=$emZ#H~FzDfQ1hcHe!HB-QJU z(cz(eqeHgZdwr{E#`hF zsz%$bt%M`NBUZ+!jRgcrGWXF0&Z3{CBuK5lEs!sZ1-HdEP=*#}O@y=lh=Da2sLAXxeUT|LmTHwXI+J`diGNBca8!M+ozCU;M>^d^U_yh51_p zkOZ+}-Kh$)GKL$4zP;!8VZONYWP6iK^qq0BNVD|iD0{jG96oYfQRHASxU085+Qjrc zFP4a3{Lv}N1>dVQIEb)RDUpoRG*c`VDT)e(LhW|jFpP9MElE;W?9vE+-AmsIhDnI3 zR!cWezun*IjKyl}P<2csbb7*Ok~ekePKT`nBp43G6x<`mE`Y;*wqR1kkFdmW%jNhH zL@|eX=xV%IYD&XhAQTSqoMWp?y4jAldYDJ=B=DQOM?xc@FIgAoU>tJRv&*9TydwH*iJd*L1jx&scQ2U(Jy z)_IqXA#gdMMe#yL;vB0dF(g1^FoPTcSaZ>Pju$E|f`x$QCgsQ$eMY4t#c z&`}d}YbcR*@fw;Y3S^klyGSrEM`|j|UxAOe&rX zru(u7szI3JfG|}bv#t*lZG*EbdVz47x-OEfD^PttXuQMf*V_6<*K76bWe;k?h{ItZ zfyoqXsw~(C;~0lT2*l=D4vjE00HUS|qp}ZHZOql^S{`_TmR+U;!-wGkM&1SOoS=efmL_|$o&wC&Zs(x@Cv|Fh!=us424;MhA7v=01PLZ zXx;3ZL*4xjg-Cu2v|Q6w1r4K#==SszR}Xy}qH~#0?q*$`|8U+}o`+Bp09o1sS>J~s zM8vT+iKu|?yO5`E`(Duq46b43_Tu@xVNX-hHWcz8KqHBzc*a8@7(!UzAq*|3v}T&s zoM8~Qq2siISkCevGkEDYpZe6hK=Fcht!Yb#TYK~5VkI$@rldg}{(kz||E%qkOYP~V zPvd>BB**X6m-NQh!sxONv#sbMmzeZ)3N#b|Bmq?SP-aqEzFXVG2>;$k?j0K*r5OeS z!BVM|Nu_@H!|$D8k~u0k+g%FASeOf4u>ALKFa68zs_WWzG;(PF0bSPR5O9pJQB$BSbNJ-i`Guk zZKn0|5l^diz+XN7`NMbLJw80;Y0jy>glna%^ALsE1w5NI@;hOVd6X+=@m?RGMmR8{4Bcb55JDD3*xaw*8x6EEcTyN^u_uWuKfh#1xiXcrmv=>D#Mpb&N zkWlbID4Yr=7HmyZ;Y17J9p!d^?`8t08h30OwU&2a%*AOBb5R2ZNiR8Q3Lb_Isi5iF z3vdHfH^T->831hIE{y56yy0)ipyfD_@A`%Z%cz38zzEaVdg$mMDm_rseUbrC+J`v+ zMtsi!0mK6w*mfWgb8*NeP+!#S3-3p{bk31v7{K5N&Vbt-dBS3E=d)4Y3?KoSjO-=R z2GB-DTSo;5aY7(gKS00(b!`W2oga|%JA!TY<;m&GZxLk{wXS&q%p=;b--0H z&_V#fhvF?dx{i`*7tlzu3_2TPuiAq8{fWNB*d01E;^o!o%v;C-%KKD5GLXO&*zM^M zru#Mycodl~2C@(Yu)bk{IN=c>q^ALF6Egm)7(;i2r>N~fcqa^Oa&Ad=^oHj4G_MHY zsN-coFGS_4!O0!wu1$sxdENWkooNyka$bnH^D(bK0b)QosIM^SP0_D&Hf1viK|w5{ zhY-tS5D+y1%ufKifG8Z^<7ks5kUZE*a0+JDo#xgH&p+?~^mS&R#3%7Hl{15W@a?~> z)wh53si6>I;*JUGxMi^$kjw$?Q76=+B_9MP9TKBW8-*xOz`Q6#;vgwgKC}Xtm|h)5 zO&wG{$FV`jMZB~5&&=<8`nn6QROD-Gouv;id!E3hpB%&@xv3 zl<~K}^u+xx;umU{rjgFu9(F`x^5N?sS=~#}--|r>pS$;XrA-*$2F$@gD<#M?%-}nB7tFIRu zc6NAAd3lV6$W*d|2EV#he{%iGJ(1A2H`k|U_eCP%P&mBnB%Mm7Ow+8_>nz8|)5(xe zG;S^Ez&fSNvO}{i_wc^`A0Q#JeM_X4U?hO4v)32S0=_spHo?$zyZ759a%9LI6x za+%}UmCeHM{O~kHb?){3bK$Wu)4xCe=v!3sjZ>$N4kXgKT&Y}vVJIGt_j4thk3UcN^a?_STl1FjWgPv?m531$T4?QOjDO$?^Xk3IZQv)Pms>Fy&(S)5kdjTfJMqEV}T=i zslkC4PgLzQ7Ofv1MNt18KRkXD^|M-_stxbo&f+L z5{Z0-rBD=QxBt<$ZOhb;&)&a1Us}|bHJ(bB2PZ>=HzTS|uEvoV!yaT}4vDOUx2`{Z z-(%@)wp1!%7#4{{6jcoi^w9%%drMWNwDwm2v4$f4dS{-Ggf{v3T(k3!0+wZYMBh|C zonjeww`h!I*)wG2u8a# z+%ic=huwm2T!Qp9*x7WvJ2+^plAD)Ji}%Sy2Z?b3KW5&r9n&UlgNXpb{BZC_P{k1s zkEG0t^DqE=LJV~g9kwYSoHk(wc2lbByVgA9X^z792G1b|7vbpRiPJlh977bZZL@<9NAEq86P4^9M} zRDlVF0lpHMVj+FRjW?O#07!;dn?-9ml28dww~9A(bH7YBDHQS=6o~CGheKA7_uy?V zN`Z8d>?>nr#J`GI&9!yZZ#&68f#x{4Yok^}gk9LztDw(YJru;3QOp7`8h}Y#Wm?U= z!^Wss8zIi>>{bzj)`^qrz+FaJrj&~30FI_2Ocj6((~jXt6J9Ed2l_7Uy4_;0)ib?6)($!AuOw6cow#B&Ax|iAX_nF|s zc>0U_z%$!y+Vmy@$!DF2u6a$uV|0o%d?*7WAng%=wGOibh8%-*kzh2Kjeu?(#aF{| zOT)dw%@>~kyL1425}(A+j4}g!5QI86Utio>Ix>oAEs_AhHfEYIL?Mb!)@dN#!IMLt z9v~c*#8J>yT@x@+3dCR-sQHqi=xN{W@PzMRyy>en@ZRJD?+rXmv9zbF^B1-X%gdDVTVQeeRNq&q{&*(Ec-d@+|(v z*E?CLa0Nyf7eieHk9efXHfZol0`7JBe$ko*x(etcpbL1eK>+T!*1oH8JCBu%%;@1` zvwO$Jcc}rXbb9{Q_5b~YE8d=?Go6JaBl?sAlhARKlzx*B)86OC834yyqnZrhZ9X@agQdn6k%`K^} zJUKid1cPE%lq4ye&6=j!X|?Wq_&yG1E_`qk3D$ko>^Nwe!F0}rP}@->ncIePTxk@x>ieJl{LIK;sa#H{(;x_zN~K*l?rOE_1K{}NIM|a< zzak!>SRAb@UCC-T+dJYt0?>N;X@w1isD{efR!0pabHQZf&2POjJ3BrzJ^sqe?=V3+ z=-?Tu4mipx-`+a9|8t*y{ONY5V_8-zmC_A^6ND$9{`4>Z<}VW@_JwD^(EQ*# z3@NYW_OgEE{nyU)j}7$q^{uY1%8ImS&t3#UwzsxvngSqr@#@?^eCfML-_#R;nTXR! ztbYk|FBi(kTScFYKlIS25Eu@J!@J$A$z)Ph)m>TU`+luf<2WuD3d94UX2t19^R&0- z`2#g#e3Bx%-nE{(and=_pQfaG<K{+;8>C+zp~m`jbs1z;=T zSaXDFu5EU9wl=EO^7ZwNW~IupbUdDbVYpZ-_2u&`3peWm3K*si8#xo37MVR0`E?ZS zRGC=vo@j*WG!zT>e9~ksvjK-~0}Z*BI;Ao&KXWg;BEyx8z50uFfZToJQN5sX}#w{i0_jF4#>l9PJuMvTZTG{3)u+8 zN#?SC8XC}WDIKFKdAc%M{4uA*#1DaxfHW8Y2eIT8lv6~=)(K9p zRzNMKu@b1O01UvLfJZs#pn@_wMj50Qa82Kdx4{7BY~L}x>g`4(kQko`TX@KpZNuC_ zeZWFs&xa7JXByWCpUr>-3b+7Ht$EnFp1DzOP&@VCT>J1y^ZNqX7Ws~jIAs7MT^)iv z%~44J(>xTlbVgMSPqKU;2HDBTaBn!X1be5NmavT6&4F!>03e!zVV;gBIh9}<*5p{c~xHx)O(2QooaP$QQOuxrFNojPt>Ta;y9keg09{JBbcr+TUZ#U3oJ*uAcX=|q{`R<0s|ZX0D2+{XfR7k9O1%E9pAG#`-`2) z=cd9T4?^ERJzraE!dB6BVSu0^0;54l06R8njjL4{fwvjoM^G<>fea6rnqS=ZAtV98 zDRnF0?KHz9JIO&Dfuo*5xdv=)AgbH5k+iDxDP zma=Mv+pHOk0O5R`12LcuE!NH3h%>o#RXKC|&Ecs;fDJYpjZ7xvd0xF%+ug)0mdXN+ zU%h(cYee*!&hkhE`?fF^t=B%^S!{wlmKvCv7$XR>TCIXG9FIl+^hZBfSvAKpd7fng z90yR61nr1m161{CibA5{+qdrkkd=-_RZWY>USUGFSV!40uJHHp~s@CmYCVC^o;RkLQ_}+Zq$ndZzipgZsFpOrS5e$b> z2)wkscI@!cBeVO6MDpv)1--N6B$KF-mCD8ahoWLa$YX~0Tqgn-8_FZv24vf_hwlvqgkUiE@oZVU-A<>|00300)j%Myo86>2 z_QB(K<;nbFuh90^M)4Btkyv`#Br2=ob)LA7fw>!tXZrKGR4U!=c4bA$q|-hK?JVE< zy?4&d4Ni?Z-A^e+D8Q___Q6X1cn~~aX&gOvVt8;6!|-yYyt|3nXfzzxO(qiMYU%g> z=;dmmregp&kP3i&v9-~9^PNvm?gx{y!v){$dQ?>_y6ty={OYs!KTdO8p->2g!wkcm zo;$m(w-EqRY!6c4=On?NJn-WV^6=q(Cl4K%?At>V$b0J_(nPKevOU0(91QY;nj^qQ zjaF(~Fp{tZs$)H9Q{sf6RqF{650FG?aQxe-XlP|bvZot*FS0q8Qf(UsFxy_*flP%6 zQiAEqn89245g7w8ByLb`SUE=`kmFkj$%yWW6no?l!Sh-)5kmTSFg57?f7$!bZp+U5 zx)WW`%6YAw^WG=tR5=%bLM8wL1V{j+NQ$H-TWVWsS-!S>?e1aAmVIrxZCSQuS&|h< zkrc%MBF6$yK;?MOsguJ#VdosyUOD!QlF|0HhuLrL7(MQ&`324y`_1}|`Jd06sk4>j zS9cQ6UrGMz_xW>cDv5ZAhXa5(FywhK0=YJDWZ;^f3wbUCUJHRDcD%_KNy*y=kvfHA~QpxItH5CS07H{Yfrr;R~ z9&P5JParl?Pk|u%8Ax=YKgm-bz!b}Sl0Ageyl|eucPU;RC zBNPVZB+AgBuFpyBA+Fw=aMGVc7_rF^o587{4t)7jezXjXjiU6UcW<{=vjobTt`6`3 ziCYv_9Wt8;7VWo-0CN@s0uqi|!)Y(K402t#xg#pgB+&hOQ$WaUdSo{?Lm+UU-iR4( z*r-~%WopfgS{#=0L92@+mean|uCDc2oinI&r_u-;U7uL{4!&O8U4Y3@)TR&Bd;7G% z#ws=pp@ui$t#?Ierso$iiuCG}W^m)^FK)noaixZY59_c6VQ!zR`@2iuc<$kE{;j{^ z0`Tn9&qbo4Qn5@B`0n=BKlsBR$R{38gU-WJtuGR4V)#u1tY)RZ86j8d4H=NnJ@X91 zvaME2*Y$WjZW#K;-9?&bd_Mm_``#-z>N3|X1$=xo7Uy|B;1}lRPH+gfwe#Zw+zNF4 zJQ*W{p)`~1g4&M#wg@GFGJfmo6;w12A2?*$cBxpr*I%%|p9@98?|gFQ4{E(pOP&Sx z2YrX7V)>iOrY}AGLw4%lymR4^Opsw|+i|0j$jya?zkK5olM#lHwhyHvR2@N34i#yk z>G#zOCG6k2ze4j!6e8Mag|2Ll0`q6&oqMNz{;!#mlnt+${&0iz zf8@EMv4yL_Ffj=CD8eBS2r?lE z0}$|l10Wc3YzzPo@qkN0M9N;d9_jS@afh~gJW98H@e~M#vB`2I0kQosGcf?wEI12{ zI;0u2D(~4!N5XEnl-~9=bfj(w1%oXC5w<$E+hHLpVDl{OZ2Ln9BFwa#hymXU73=k) zzR<{`9Pr1}Oj^Ydp!QlUvWxnXCaz)7I_9aS*>gR^a?iHgPgmC|l&tqZqK}{PPaW+B z=5AP|&+KY8Bat_Q`4&WL35aT7G&H&Ty`7;61 zY}?y@ov13^bLOoeeQU7!lRo6bxOFLQyxwQNFKUar8~w_czvBJ>pf%&Z?(6@r$ZY4e z*Kh5t9-m<$ohNbB#4#7ANUR$}APDDd3=mc`4Vx8_%Y#JTIPK{DhNCP%R7un0jUd5} zzddyFX7E&1H*MPP%HG|N7T{tD^&rR#tp-v$%=o(3$DG?r_(%^K8q|Ccmhf11 zF?FCfdZM#-KGxt=e$WQ$h+gz#3g&<#0|R}1nG?s4go6HDJ}3Hop-|}kci$^=e58Nm zoSN-taW6Ks=MlfR-TZQGama-iyWOvS{p%dZ-OHB6<8jAzmlx*$-Sv&l+l4zHy|&GE z2ekUB$(a*p&xnH1>2x~nZZr{1Co-s&x-)+n__yjk7PE)r!Ejg*A$9(w5j+pDVe)`%6 zP_=#X=$vg@|MEZm+oUhTr4s}JhfzCCC3M^}-J&h~X~fKVyQrjBEI7^!Zq7Xa$)}4q zKN%SviN<1uLV;n~U?6bi@};ZI+`{yOSR1f#6*01yYd75pOpP;?dqQ8Ej?u*zZPH!p65{vE0s#09WfCE35Uams=RgS@}I6|NBR%e`koB?M|h6f&u@l= zzS4n%gGLUJ{z0U&;&lR+-{i)!6d*h0yhjdmYN@w|l()hrHT(3rm!Ew)6bb_XZr-^5 zTOY5Z11BfzH%~>--RMkNkwc~87m^3)p?=6u{iG(5#hoC_0=(?g>f`=Y$$OL1&ua9*>Z+~!kOr$(n9f8;Uoo=0Wd_agu8 zcKcqpezVyMheH%imx@J#AVQ%~v)R-&EfR@XwmIHE!sui(yRM>j%@i?u$mYqN)`x^0 z@na|ME?oy$FO^8UuDiFr{ZEz({OrtB=hhKk+z$+wcT0b7H297xn{48-haUzoQZAJ~ zi~Rpp%fBp_ip6X5Ynxm7U`%j|pJ12(jn4LgbSvY36v}_cEg#w092&&8RdJA{L8XSX z$iToL%d*8%3B$1f=lk*2hT~dM2emCXQqj^QejVD;Rcv~CiecGqr}y2DUPpX1j1r#V zQo8Nhy^w0xA#urx+7_HLI+3 zrZ{J98&)+m$VW`OjjBh-(M$~-PYk}vr~jZ6X<*Tohq{nw zdoTuB0C*Gv!=&TDo`awW%t9#bA}H{1$W=X8hCBjB7#N~}2Vur0-`!BJuf~1$plPDO z+VT5GU4-O>CU@9%`7j_E#Ijwt>Y~|>1=p3T0`0f4nyGcWjHPQG%c+_CKHwqEMD&CS zNxWY1fMy`c9nP257(bfYJ0^9-T=`D^4*8M(1qj>QqCEj z;-2S;s0Z7M&w_O-U}83H%cO@wmIVRK0yY9!0u4c=62c@BBgq~!;KhCz1q#O}Pj^iQYZ}X|yhJ(SBrNt{+pMI5L&5tbS}Q|Ac!a>kca5XkPr>e0avzi4O1I z3u?H&kWzl+r@Ps@FRz68)mJ!l^KZYnn|&Y zt(#x}i@$8fLcd;FFDFLx2J(1meb&*`(Y_y3^m48M<#!$TZgt_4AQ63c@kRrJsG(F6 zLRbu)^=uVILo{9>S*EeaD$Sy%5vWpCG{)pZmN7|Ka&%;=vhM?4FdFlV;!bw^-~aLV zug`wI*V0c`_Qq{A3-4HvZsBUDi9H1S;b=k%_kFA?VnO~2JD3l~<~QyhI(UF2>Ak(Z z|1T_ScRHJ^YyaZ?k1YnMjKDVXu~us}+j#8EN6*votd3RVEEd#YmrD~U|^upYN?&(aziclO+K0b zX*xC{4UBAB$i{B@S8(Nyf-9h|I6gXJR(qXhPA1Dx&0x)NJRWU%ONG{YzyEZ%re44Kfh|k_VQZ%}btH;- z<0Rd&nQ{!m%sD{f+UND|Hdu5R}QQyN-QW|T3lJob#)Ac6FeRb3(%ed zG5sC=0+H#Ijj!;$JbApOe?sE6tFw!aX6m*5M_H7Kvm~JO+q>1gJE2=+CCPy3pJ8Nq|8%O4umuqM8eN0N?-xo(BVnL}1)Q zA;|S0*Rv4?e_7*`h=3=suKadEO=hGECNq@uY7Vs;T( zqRh5_0nl{QHchAOxro}ZbPZQajFN>7T2Pe^ULidx46g&&Wr5!2bPwiWH)K0z%-%y$ za=oIg=W8b>hbQ_|YclS6stT3Dp5Xy2s#iwL{W@+r)Q}^@Wrl6T@KU9f-EIe)>}>3K zU~+U5l1dtGX{8tCtSeHtT(4iAS{EK^+gr1+LLow%pfHy+5!kh5+%QOtfe@SJ0ve7r zJjZiQQr8^Uu&kB_MQ^&TG39PQp~cy5oP!B5sso%fPz9A7y|Tf^7acT4RHvz}0bmW& zc8`+NW-do6CAA8AlIMv!-tTa+I?ThH8()6urTaOv`?^nNKkJ%#@ei+U?LIRd11>`l zFi8N244Z@nLoDIiG>pE@o&FA(aXYu4F1>QdcncvLG_F|!wB@HRhfcl`nFEkM9`#+_ zX>5OT!|AmE1UU$W(Hx0u9z|A!SZdOpuFqC4vcdnnltWI zp^#Tf9NY{Iey+RggP1+kC)o(xGjmqAUus8HGpNHDYN)N&E{x6`Kk~)dlw8RYl6T2J z@V-*FT({yxS}Ia8fQtge@1-y~K^41+16llWuc97lNGE!&HdkFsMDshZVfDLos~uFz z6TS6=?VCNG>Vy(e429Z(gNH|E&Ymq63c)~t=lRX$yMO$_73cKBRR}&P)hGmqaO7=^ zD6H)KeWCHjdhWpKM`x#}%H^`_IPpY6*Y#Sh77~4b{=q9LxOmdr_8@G;H+r|R7NY$F zgM+PR^RHU|tJQEgOi{F~b{{`^6t%WnL>o(U`r_eEb91}mdSlq| zAqwtU$-Te6NXCHn* zR+ZoVhyPnc>|YCqkCf;8yYeGMIyW5OYHfJoqgfn3Uc-G!pGNx)wWM3yk})0*9n%eG zb!oXJ)n;dA?@eXH2oi}zYKNsktfgzd$K0nq!eip;v5au5q87>y~&%b&7HI)qb(Vtfv zQaZf@i*mbqMyuhxSZ=Jj<&_93qqt4tJ-D;84Tn@inY9}2fZl2AB6EPJoR0IU2B-*n z@cQD#TXHLy0V7DENhWnw4XL$9-9{=MD7i7X-T8$tJ%bUHEcf>J_ru{3FNjL7yT8Bx zr&9HlUW&3JndvV;;V_D#`?>u?M~{ZN_?zGPk(kg9rkR@%A;6=2P@ivp8sMhm z{PcWldvW@}c%?oqOUXd!mIsYDYDdYyp67h)n_ngGmDTb5e;xVncDshIukG&t%Rl*n zy?hg-clLd}s~^VgZru_Yz1TzOc1`;lwsSoSumZ`%N1L7H3=~}4T*_7|?_HfANQ6iX ztgWnW+fbFNg;mmpfxqVty7YC{o*3?DFv7IWNHhW)=Ie_e+7VJzo1QH@hJhO0U{AAk z*>XGy#YehiD3koD-zID3Xa}YdvXSz?gVU;t1-rc?^*YKx?+oLrt@;yjrz#tpdsrf1 zA(R5seX_+Oq|bBuB(s1yIn?4!Ny3%EU3suC{$~+<-8M;xuwll62@OS281Ycxp(upG zHU@bBKmhRo?x6_m!KlZ$hyZyW;@H3e9&EWlfE*nuZvz@64IM@Zh-Yxhh~lLHS&o2K z0NJI`&YHvT$PGl=3^rxjvT6G%AIY|4UoHgMs$lRr+R2M;5Q_eD! zXt6rMwn$R+@-9V%T*b3p-IY~hxz}jdwhD<1o1PefP0F+F6MKLtX?~7)|+Bj<-jVO*L$reP)Q?M1R1xD8UfW? z4$MNjZCNRdYf_j@_;w*+$jzW@JB~$Kp6KWuSNHVpSxj0*LCG6MxKPKmBf68)>v62J z24DkcVj?zjs)hCm`5k;+_Xomj;Hq9sw6A zIfPZo(Ac~4`=vWe!0rNs_HdFy^pLBd1gxTCX{AkJ*y`-_?BF!gYB#Q2^9tLrWw7r&ePAZ8qI!?k61c1|WF_*9@S`y#VBTKo99M?-`1Q)!XJIRer=O=C*)X z;ua(ASG0pD!ppdB^)C6%Ay0^5{t1&B2a0bu5bmmFdjH~pwQ@u^IpFVvPi%!cthCC2 znrUyP^tcU2bH1tlh|f<37FB8P$<)i=c%iVL_xb!Z%eLy(SFhdd4aBB&Y)&a0^y4*P z&AZ6eZ1FeYcCLdC%$+^=-~+{C5k=8^FEPuN%0PerwQJXF8+X4lo{0&Emp$|Ct$IxF zJ2*FEm}Y-}zXy4xTsa#3Y#WCaeZrFuKhZ4Kc6)g@{7K80;YSDX5+WPfx18beZ}W22%dG7QsfHc0}#zFR)OR}LgZAg`V+XSZcdY}p5&ISD+=fw1Gp zj}8xJZr{BA;YUlR;!S0ON(@E4wnF=sP38el*q~*?@%n~NWlPHUfAl&+8Q)*NMNU0= zO1s1*0&A$SrE4dphJa&hM!nB<4@FRef&Grok^a>b-tJZ>WQb49TC(OM%Y{la#2sgR zDNVVos=I@k#}k5IU{`+JDQ{NHvp~a1s|j0K6K*#yletpQcG{IvFc=DjLZxD9a%y_% z&f;HGq{FFXyfe@Gr(G&~w_bf1ZcMwfdgP%ab2H^~+4H=6N6coknM$P~2r3i`iA1tu zWJ?y33{CvUEAOmkuf6#A&n5fPzxf;g1Z&H``aA!KB+1>qy?{ReK@i6?|M-9Z=kLFN z{`PjZH{Kt}vq5pVH$*P(|D`US5{^HOwO2>WYlG>)1{v_`twFE*y}inB{>ooNQ1sry z={+p_Y!kE7>0~k)!*Tm~YRkp0QG*SmI$i&WL^?i3SCLG)ReyYINqYS2GNQ@dPf|Na z1L4GqqpiXddz*Mr!{k4Hs}7)ZgMN-MATTBqRiEZ+Zar=dyS#nz_VvlWAx;z&RmDw@ z42_!#5`-+%DUpy&K&EYzKHb|S`5~ok!!V=xCUl?c6#)!fo2Cpag5MbFF8MUsL1Lmq z(^dz9AQu7%4ndCNdWa5VFfcVNjT*eq%ozabVNKYRNe@JOIx{k`DIgnO(*~psKpPhz zn8hH=gdG@$UO3xI_|2yAMSod6}rs0M4g$ZGHg`MH9TqHB<4c?(JkJ3U&#sAV7eGHhYtNp8yOf${%aWNV8Sf6 zOSxA&4&(C-*J=YaCR;_!s=}BJNT2CZ6_>!InvHp3M5N%L7G4?B-n5p1l6}M1;{2p?W$rt`kbXIpfk(Zq&;c6{jG3i}JGX74rRa^4g$oVYu+=se z98!BJqm1d$X1Urg!oT>9FaNZ{JInSk<26O=W97$SXF)(q0^;c`3H+`qFm9>h)>Tz^ zV%4Pt)Ds8+;seFObK3_VGJx)W@*}y`@G*pgDiokdmN5JXj%%lb2%jHDBUlhb@wW=t} zgAYA45*xj9^_Gs6EEpk-ph)t5j!L0g3v3mvoe*&}H}IH^G@sJ%<`c5cKdaO*Ukb?KM#r0OLI%we2qhq;f@RhBb8)FZXy#rs6)a7RIW5-3^@Hsn(U%W`;`>}97qzAx9-lbtS_3T;W(CUTBUOJcV7Fb zk1&(w*4f%eR@d0yDLi-NnV;~ng=;rv2m45xYImfAhmQ^prRFcc8VvCofTz6%5{cw& zX+;K6GrS8+S9@Gvn`03B?`~gHlGZ6hdP+1q$%(5r6sVO?xN1!!q0(+bAQ)eQW%yuv z*bGD+%z;oRhG4r*do+1&Hhrqv%~y(7NrxHcW+1j+GM8Az&mvPQR0?-4C0qq4iYz-u zrw4U6k3R5NAROm8hGn@sckVDOJCw=%qpP>O!QjcdAtY0nXkXJ1sT@bLG+kaG;5Sso(qV?^xxFR<72@ z+3}G| zg@=wD85kbg-`f{O-@TUq|Gq&@Q`B1Zqd@{c}jcyIJ*JP>QkgMw!c&OVfG}ZGc z{&X1Y7vVQt??Ay?9ZHoPZ35MO6hqN{unh(U|4*1|wdKrsum|IUicIUlRuT^j;@r$k zqu%gbyD4kmxqXe{Cuj$F7HV4*)dN88GR9^ZG$@w~^@tNfU_GHim0m(|VF=6c!Ju_L zE-#{1nUh3@8hUF4bUX>LVR>gC+An$W2nyp4>K79_vD?&oXQW?tA7; zl^WgA0otu9blgP|00R$pJOl?Qh5_Ip!1FA~^<2;JY#V|AYr>0Wiyu zL|}0>)wc2fz{1;I^SbQ};cyTb0o_JLw%EZm#haH`kAq^$Puh?*g#%nj&`iirN4D8M zNx{xjpDVzf!>kve;C_aZb*H>o{K`xBJ+u3|PiFr!GJ^mBd+%MizP1pw?}1cDPIwmiU)UMPGwe5^^}6IwH_ zI6AD&5Yjr8fvY{GIrhQTL(oOlXB^ zlxi&_Gz|sEEFUA+Wv^MX$ncP=40&cQnuH>U^0B#Phm+b6-m+05*z4`-7KBnWQyyAM zh@#;4sf}NJ=5bc=QxwJXe63z<)*8R}?uUHP&jae1)rchgZIpSx(PA2fC*aP-iu{F_ ze_mC4uIoi25w#~>xpKv`-9n-ATd#d=dDSUDePu6O+N{YY7NMNSpZ@~pc)$7Dn;TVU zf45jE=A!}87YuSJqG+0Kn2C72+wIzpb^7?jutC?9)rPTSws8WD@M4-FLpYYNxK~s4 z#!=JAXU4M%e5$-Q0pq^ODIyj>k5M~qPw8$Ruit!{nCmLSU0~!wv0LnjG=wJQS_O{= zj8Qb&4}1}tOgeNBrkNGUx?_jOa7Lub2xnGIl7z$l$WB8O1v>qaR4ACeW+`>{PUA@e z$U{S>cyKim`VZUN$@-n=?Rq;k{fdSD{O*U-@mvjCukG#ibz_{EZqseGwdU#gO!8RC zfo`ttU;Xg>S~d4?Uiphj%A!y>)hy96cBR&Md~}F>@{uY-qo=8~h!cw|TKDcFvv_A2nCr1YL`=KphSaFgPvZ1d;!iW(cdgmGG{bFQ&o z#%a8`8o?n7<0F0_!v!iPb!}nC(8wSGb*eJM&Asrc#$KoaH!8)0S6O1~RFOODmT#=&|DMk|0Iu5ry_*}ch?&tfCoPOxRbNl=Ip-@N=g#Rn@-|PKV%FXl2<+9)JM^S>O z;WM$IzIipanjOT{i*&cpv(6C{+b6ylCiByH`VSJvPgJvrAHIsFQYhkQNSiWQLpf?S zP0#kCkwSMR0rQj#1uZk#W|=5b=iJfcV7uFi#o}_O{l?nDh}HEwy6h^LtiwHy6r0wDsncx`=FaX3rJHI_G3`L8p0OQ73xA=2?M;MCjgUcj zkj8h)=+D^w1b33XzEJWcB- z+(HmQA>5Wd+g00X12LHW1OoA5ayr0K4Aug~mc@1uxy0&4FwbNK%^yu z+>Q17WOiTo$?Ru(W+4CJ+Y8zJ7tV|;0Cq4!w-p}p{Q=*Xt%$$6cYBx-Rhn#gvaG43 z%j${1`qa;#pZTS?+SL5@4LH98b($W4ARPB7l7-tCQAIJ1L>Lq^)L=%LJ+fMDE7ul) zR6#rlf;5+4MBt`8qo1_K2>fm^vV+I^^df9FT*Z=9aodhS-5RMF00MpL&WyAlFt~Ef zX{q(U_57n0!#le>J-_uYDf^}l`{WpbKJ;mD*0O1e3pkOii+O+6{ps zXTUwaUaiZeg4@!KcGHAeI51&4`ZTPI>@Xh5Y|<>!gT8p`pcssBEL*OWX_EZzJ8vTc zeIbFLZPzE$2{bd7l^nU6{RKmREn6Htekv1-n5G?#Mh#v2!5eSAu~oRbw|D-|$Dwo%Vtx`UH;;3ag zwQ4mIjglnBvP_6fciLqQUe#r&(;}yRAvQWr^Qa1MlccrfiA=ZjEJGkP86KZopoBl^ zI<>zL{0$DeX!qEJ2CM%}n?$$tyR^DO?x`KuZKS zSXen63w|4Z>`88p8eCh;UjXg?IGI3vl5EYFbvQwc52Yf^@aU`6HNLW&;%wY3$K=v{ z(>O|V(?9o16*Pju%79?YQ5g_j~S_|?ZsABXD!be zA362VQyj;Z%ViwLZOi)LqmTdG6_0tH3ADqH9QnZHZxxi6jB=sg8a#S7D*9waNhA`o zEY}*1zD(xItsB4n@p^Z&*e>O^_x7)@@4jEwZ*N?F*x#GqZ%+?T9X~kd^9RE`_x}8r zb@aGQntLm?##U~8dI-2~tKCkg(yFQ&w(;y^j~BP=@exEbdx!$Xeg0@Lq{8U7rXA3! zeA$HqTqqRq`Fsq+d=~k?hh_12{9beNy#|(Iu_TJZo%jSV}FyRy3W{>FtF;`$Dfa&?mEv}(Ezq;5cRn`G-yvrX5_ec{nP3}c!Wtr4VA z<$a0giusX))W(!T4+b^ukS*CH z#_7(~t4=FpQ7z1F!J2IqWN z{^jQG5RM@I69!IC7494@-bq8%9by^pEd;&%E}6-T(=ZlbkPd~=yAU4GY7wW#Ks^Y- zT4=Zc(Y9^`td41U7K5(4GKTuk5MDA653@dkpc=MPRq}luXO{#3B?p6|1w@ZXt~j=$ zmRnlWwN1n7kvLO=5y?S;D{f)F^`h)7E`9kvncdg@oY~J7Y_l*LM#YlbPTJ6x(D{$Z z;g5RaKVSRLb0nk_6l0hWPDX&z8920f`b$4?hn5#hP$7r(+MXeMz=KeP#DL$eyNsvP z{e)#Cm2BQO-0RC2J9+fZEyr{q0J*?*iC_?J4LUW53**r64pu3n-K2UxplY;YwJnsA z?T`da$3%ePGkc?w!CA4jPFYjhf9s{EIDuPP+DnkZi|~UoGX|+kHGQpHLT%N?#0f1L zZ0QClH*mr}sN6biv}xMg<&QEsR%jLq0T{K*9?E(Mjk^xyTATo380q?rE(KeA* zaIAlTBB^}7=oh&+KKb+&*E-6jXRKy2!4>%UdwV@^<<1Z+7i)Q<*M8vmQByag(MV5G zw(j0twr%b7nVO0YmV{ZiyxwVtI`;qTAN+m8v<_>U;PWZ%Mz*rbu^O-JB-D1($NT*J zKYjP&D-EKsv%j$TuO2x&^0_CU(>48G&BW}%sL#j$^t~UfdzWMQ(Du%B|5Spdr!#}` z9j!XlSit~lgg)nKX4Xr5yVI){8|TXTSx;5GQbPzo`ov?iqa)Gx&u^UnHZmTQZH{D7 zqbIHQu8`TmvtXbWb7T|8E4qnW?{`d2#`3u2%QvECR@(gt?s1#yOsk2d^YEj^Y$lz* z9S*r3d|NAAYdFtVmmXp8eLm_|YQM(Vze*0B|LHY`@;&qDH~bGQT)X>`oKMj4nL#nW zpBZSB`Q92Uj-ot>Y5@{5|Po;-du;19@huhD8mqfrz^3xxtNaHGS+1pM-E z|K8sYiTh@2E|Yo66;~&l?@7HxU&TKLjji|Lr=IzW$T9g`9!6l6W#vZgJ5^jUXPy2;F36h>!(UD zG@~Ajiv~gVEOW?e`8-1n+HUI--W|i3aLaN~isXA;#8Fy`vEyjZ&Cssv<@5Q&hYr3_ zdgS`8cq1MrRL775LiOFYuBIfPpKsw^H;E=&tcyuHqshS8;5iQfM^!th3J^PMV6f%j zz(f!Pw^U41TL1#KqS$mCI1q0;2ykJ*LLN!lnu(L5j>vWodE#&>=|gQg$hejz0DiQC zSpb7w3w0sb?YN-cGz`Zz9mzH@7qxH_1G1}jfuy^hYeP1pG+no8B3lp0%Uu%9`BMoB z3BWCs32IzKrBKO2nyL>~K~yS}a!*%T#{)9b6Ktt69V>cEq=#&KuBpOxl5!ob4&#MZ zN5{zV69Z>wqi?^ryPfTldc=z|CS~RvQug49Zp^@0n5j0gZk{<*2Ls2XiWmX{TIp&R zOm}LiH~7v{!OVGbICS99QN5=I_F8!kr8N@3*#!%wdaNHpdXd9b$W(>c1VG}G2O(Op z33?P+Vdd}rW5nOgO<=^#i&$rVXf$J~6tw1fRt5M>7?)w!H6+A^1EAA!yrZg}i{iBw zNa#(63~2~$dN^+OA|$m>X{y!rz(kwU_lSvJw^ld0y4{BL#;5~I2q)Wc%hh{Esple2 zx1+aFwzdo)@BZiizV3Tw|2I6dk3U%3TK&Sw85Iy1!~V7~bGwFqJ^SNRUd>~91TkTk zv^@q7B;Gjn#E+ec?K|6WuZyTvS62Z7c{qd+8iv~l9k3Z3^`KF0Pl-oML&ufnb>sFt z)#K29T;5sG*_o8~vr^_5aK?ePzfXRX3b))?ovwbgr@kJab@`ZdL6xh7G z`kQMz@X*00O7l~g-VLR5CbqbH>#N-yF3XCT$a3+W<@pmw4!a&yuQx7y@}ZH4u#}r? zE}<{E|FDfk1GN+lEup$PJ?|L9NNQ}$z_^q3Ay<(=oh@wZpI)<3?pKkZ@q zK!|MN-d@8I9D$}q(Z{mv{(esIamNmwS-qB(l=)s1?6#6Ah!@2^l;V60TkLJ^cUfH; za5Zwvs}1jca;CNY;Na<3=)GueOL712)pVYgC6;PF!H$kf1li32n3-55`N zu-hF!aI`O-ZnxW!NLbUfX0sIzg;5kO7K?trUl7DXvA~Nw3~@DU74`4d$|i012Lr(} zQ<1eD%bk0@Mg+K4wOR@Wf~j=s?$Xk4{rlfH2GU=pJFGyO!OTL-pnLLht)rsiu~R1% zRZaZ2<4aPf>l#M;=4-yr>emjQGROKGxeE~-8u$5Ssr&Qa_?7;28pE)kzVYU}`Ofs% zB#S@+z!NOhg*#rW`{1cFFaqCu%uCbsyBE$^i~FUa{`m5xzM)iwk6tLdWXmF93xTkG zw}f+IxP-p)=66Gx`1t6UBuTAiGnq`@bIb0{NED03d&RcRX45pySR@KOHx!^=9#7hG zvt6#a^r@z_Zq1S;$g>gK!d)0K+fHrU zUn!GqiLtu0aU1nkl6F4fW<|F^*mlq7r&tii1e%Ka7>eYBc|1~6pq|z^Uf;tky{)>i z+9Fj~LsPg6Ly_nnktsP6t|PMNNdO=YYCxoedSL)yO{YnmJ~VMnHxWdITWwuOV8-G+ zP4Q}y>j`=iv7k0yMB#nhi3RKtlqLe60i28bM4h&WbPwrN>WXF@h=%$@k!_=y=_m*z zT;g@r#&sBzY#prePd7XIRr4k*&I|Z)+ zR7iErCNM3??C6eT>cF-Fb@dH$u;}R1ge5US7r=f)PUvQj3i~j05qEc7ULc%&SMqw2 z*INWi6ST@wZ%gjfSgFM8JLBqhu(t-(9e-!Tl6z(z+;7deulr>7GtdkG(7tr@tU@LyTif6LidA#DuuDNL6g5*9Rm}EH2uu((Q!K{eg2_Gu26}+`&fO!Dez_VRc8#P)P&_ozCPs{3;09(xqU(KIg0epesq36bLwbw@e6>c2VzSEdM9TeHk;!y z&a{zhHqk+1x`usv(!m*Z+zhw$H&IX<}5cX%3+DSe0$aBXGg~dOT{8h(|(`d zFm)eJE!MHE)Hqt(MqHe7ED@oCyolh=e($52)2+*)S&dJ*h0{D*hkPw0@bwqJHvu^Y?dqP9QQC2e_?VhlzS;bh zpZnrdkDPsMDzkUt`=h44_4xn#Lx1p&i1O9;-)L-CGXr;Y=80ZuK9c#jx4YA|PY+?c z0xy)v?d9FQ#_rG)QxEt@_Dj{ImcCtX{G8ls`$(kRJnV_N!_RJP-R*8w!Pw#1qsLQ;q^hckL_*h%dc7Wt#qMF* zy+NdMxr`!cFc5%IeBt&UJ2_!tJH2YzFb5N8vP{?WNaqNa$uH)z*@YvIoS|Xt)ek>@ zQ`XNR=J9mgiX@jzv#7Ywc5|!S`{QRG^a*?<9Qmvu!*$(Ku_*Zc$7g3;%wO1Prf2$Z zIf166-=zbsTe-QJY07HAyL!#`OzWxVo=|(; zuH5VE>o*LeQmOoxBW95#$v_}*uNyg$NXUv@uh)~wR3ecYiNzI&e?Qk6Ma)A7$6k2; zdCM|qCa1@egY#FeR-|nf2##+g>9%Hk{eKh~#P|1~L<^ed7!Dq3sv#t~2KSQT(B$MK zNs_tT{#Z2n{_;i5YzeK+(S4~e@#x9JC(ixim(!ux#-G0#qr?`iD5gBrV+k*9s$ors zbWK)GJL>S=L1HsaU*`O(NeyaST?=?SHNaC4O8^g@k(Ak{0x&-fkQS){yM>xSCu4G_ zy;yd3h?uVQOc!xo2l5;UMLhz85eP*A2BSdgpzSi*&7*SpOf`3^vy(FGw71Q;&7TA<`~aq+Z1VtcQ`*WP1zou3MLbjxN zUEY#647k}cwYuDF*iGHNUX($dI-8!ZCdRKrvGe$$=?(hjLX}7BnptQ$m7b?44it4% z-jQ)jVl_Ex6W>7tUEK~aB!)lHZcVP)DN+mC$xpAwVHx3`c+$L%SwqCfxwD1#zAh4Cnj z@pi-`T@pv2!NEm%qO-Va*LDG-LskRwBos#jNF#=t3`%d)4y2m#c0tvvsZL+TsTQD3 z)nKD3s6#OC;N;UzxC0DIsywOFeSx$T6-N zI{(`E-g?Fnh9VQYrA-Kd`uqBE6#c_D-}+;UeoC*OfLjdAmJsKUG^|%DJP%7c0dCp; zFamD7l`*duzTF zjhGNabWl?192m)@`}@o53zn80qgQ9lJ=jDjLJfwa*_=|Y?T?KN`2B%)r`zkaU%Ptw zN@7l^Nwb~;!)mz;at)M5MBL+(QFcRKka{<;hI7z9S&PnGQHo!C{!v!&6^aFp6MR0g zTrS6wiLah}z-mi7+k5^9UqVo`tsdK}TxY8t3(26QM5OxE3X&^pt^gI+fAMS24h{{g znoe^x-XFaTBgoItmA z+xFzwOXRakp^BDpvi5tw@eejOZrsh*#)bnvxE`X2o0-1-X5*XX)xN=@TsVHM?VWC1 z3&ZAK+a1|m6cymRZLW~Y2!bqv#bhLVSlJ~R)wD>dnHrDdsd z^3bWNv9Vw<_!*V~0GiEaED}7SZd|%~qckzs#-y3wOWNt8vvvqrAPI{ocEG^bQpEldk6m0s)dFOQjM)5W!%u z(P-Q&w*BlMMgY9GzaNb!&K^71hiOkdcJAnr;xiE`_4Xr7;9rVdBu* zE-dmM%VRDw+tevorC}j%V;#b1K)7I7S<##9pqxKFpcc+vrz~?7>y*fS&JP=bQ7-`6;8??JHUePdm&v%3(X3D+<5Ba8mZ#SZC zp$w}*oGEx3G@w+l-j2|QcVMWDrCrEA)YK!RSc@z#;aJq5V60w)j;)b?)a^zrvIoJq zqam2&FmtLu@txBH_WL5^~uy z>wy4cUFYS3iU%B5U0+*m@9!LZ>_`@q>HQD7UNZm$0=9!TaO^s4w;_lTZBK5HYujGffFrP_k|=BG1~v9$j1H+yj~n&j zg6pBU?hLCkn;N_5k#x7t5dpoq^?6224NrNQX^jroumO`AEMn;r+qdh|BoS4(;VjuV z5S>AQw|#B%{tJNnx=&_5o6J_OU));SeEih2ziH;5E4=q5lk(`0i!wTd!!GWJ!`YLM z{vZA`iwnDOrRcR9KsP+#c{q&_fPzVY(LAJy9wZ52X!uCm#=6VPp0W?9Hqh&k69d#> z%I@|3^qM{I?=ghdw?w9FLZk%VVdfg8GNjq#R`vmDCy5&C$s@OSievRV zAtJCxQK&~fQooDwYBP~8^3gAhk3Dx_?$DD@S7}hb{y}i>3Ty`=!NV68-wy`ZrH$?H zZtqSo_ZzAkM)A+~r+X)JJ6BYB45r76dR0VcCA2-M`+_k&Acdvh%qz30x zkMoL~C~Q9X@I%?%{d{4Mz%flX(tVk;0|WV+mofnUYtz$@pFYWO^w{XwBM0a7#k={& znu#gC`l@Q&%>%W~`-{2CnYjrIfOfNS{=<(xjik*+{e+Z9cyUPv2cV)#Ww&<_Tl0sx zXeb;-o$5Yuv(Z)Cz2S}_`NJNA;4IIJqEM++01Sr$fo@O9#1j#O`RU?H28SH9si<_B zPYpmdO>lz79=5+@G!2O7A3A>E_^}g~Wi{$`iXz9xCg=dO{ox13@Z@Oj!Z`$5Nls$b z-N$_H??S07^EVG!On>CzOM|CK$Rdf@0F<7D)~mgXcdzA9@8PM5jOX6mk%~PvGU6s- zzA0OmH7|%75bbg@gVv0~Crw1GsYmp7sJoY5?KpBOXgzxURdM2&(?9e_#rm;s=}>*YBqkqw@Bx3ofA4Q45(&?PcJ}sKt>(_=PNP~2 zC&DyIQxru*_TI_{YRSU_`?bIEzYql3tXF^d_6JuHWH{YNIWR$rPS0JxcKP%ppFeuy zSRt2>Mx!K2Zfw-l)0bvTCT zccQ+ET(wAFx<2sHr*Ap5Io#jhYPC@Wy*C487{^8DD(}!Pk;4jrKABg(bg90!CZWEB!8#6dFB=lG) zCi)19@`=75y#9mw2k&QufgQIAt017#Cr77(4QTb|haBAEgrPt6&Ga`hMk`)IH}gn6 zj}Q3@Gl{TT}Wte7NQFL99&?5mY9(GY4z!Gb#z*KB{ zTX0TvP%k>UnMfIS7xEBQZa`8O?KWtmIHl)P#%{uF4y(Fon{AxJtUw(j2&g@16n$=o zwaRU@M$0bNY3E?8%@PqJ5=OAY`d*ktuMf<~HXiCVhqNMRHb*+Gicz;TWeW)yxRq#t zQGv($)J4cuJ(5JsyG+dTVjyF&%wSubr*K@fO`l_!V=*eCMuIt2P z4#zyV$=h8U#9Jh0nGl9EpD2!NF+A$TTr37v1|8jZeg!39|i&>_nv%qH&k zW3baCHu7{-2g8TjQmS3gmZgyp_PM7YUuvO!?JXo$_%rE7!HUA%2x64Dp0~n!Ea$TW zVq<@YX*K8c=A6+^8EE$|N66^8y=tJ zX(};3hRx0GuC0h$9|O4+6pp;IUjI<-9H+^))$5wBPiHFtJMS1z?X7*$)ZgXB#V#P! za?*ooU&;^NNOkbzd>GgUKJoI>OS83!|9-ln`r_XMh*=vi}A3AdC$mFbT8+-eE z|Dmh`Ch}zY791h6I`)WC#jWO=RB5y8ZVRDW0f7q!{47tSEAFCUYzo-nh3gv)Id|gN z;aar;02GZxI-O3p(}~C8eM1ARuJx+*?TwA&VjB=yo8iY?wFRw>+W{11jy-tx%-IKZ zL$6k=!BB`}*+!!w*IR$uEz14q^WD-;YGPlqpKa&!(a|5h_nyz)#2Hv;GUJvS1@I1U zMO`Ka^~oY;fSo%l7wN*tKxDcOE_c+$Scj8@QJ!F%Xx2gC039Vgq8S(3g~cP%?nI{o z3G{|3pO$OZi7#y_$RHJa@a!XvW+M@gpE+|1UvdHa*kV?8*L_ypy=Qtt2R z6*3qN5hR=JcU;VL*$Tlw{mkd#7~G=0rYH#^ya&)m-!QR@ronVmNw(5|fSQsp8_*n)1R+Ux|dn zk|Y%hg?Ky;0I+TI{OjL&_w~Q181&`ca?tAqA~8)>C#I*Srp67$dhEI9c!u8H-un2; z_3xDQR4l>3IF6DtmXs?kKKblR2WMyZ_xGdGC_xbAT5W%4_nHjd89ngS(gzQry-k03 zzP$e}Pt{$sXrjOVw}0i}%z<7`ZPhm${EpQI0Vs$^`#3u9k}6Le{dA+=F0GG`_k}`{ z|AAYEAcaEVvneeYhVPkbhG8U=NnO{g)oL=Cgkg{?6o!(imAdjONj{cecqEMN1^db_ zin|aiSuUh!nnYePsDAd))C?yG?RML>%>7H>HHCP~g8 z03#6(?J|&rw*s=c$y6}RUkx0%ZB(F6OO%y<_3nx8)lnxOb#4h(POv=DuKV@6ib*6? zPM8}$bSq@7kj)LvRvVt?nmu!Hcr`MyU*^!@oB-hgNIt4V+0p4uIz=kpqiWZ+%Mo=O z(@0eAt(lOMFCaU-9hTLD5!!E6k;g4kycL`V-BNcPs|OE127pUm#- zKAHV2&+L=yJ1eVSeel@Zo~rbQX0?!oG!3g}843@9g$K_3PO)PyEtR~S_Dhjn{@I9cqU&?|K-dkyBA0A-*m>b49T17Wuif+z!V3$9P`dOoWh(qYEK zii8ko?$?ZUnkGC122Q$#2io}ll(IYAt?n0EArbn<14sYF8!oJA4?+E{jQOgqYWevD zDE3+VEg_%#3_1&*7XnxqfT+*w#3kxLn-SxJqQAiSv{MUAgRkkEx;nbhp;jBNIx zhi;H<0_5V+cUuk07)4xJ1h>~%t(y%kFY z7@A{wuHEZN-EJ%%w{1(2OA8#t5 z!4t)6zHofiV^ezbsH^89<7W;(W;V2zc3wi;wFcjhMsZ&{$OsaAyPI^Ayf-X2swpFeu|=*-M)Z6han?fBI2B{Gq&MmwQ_E)_x?aQcB0G)eu{ z+dYaZmdk`={k;z^We1KUz?#6|WtaPWbv4l6_pi2cT%m9v;O}6C1MEJ|S`8v40u?a< zg^FD?e%Mm#?7DaN7Q5_`{m2?vPzkEhV@Wd^_v5;kty%>dOI|Y~oYmmG7L3phU>+tE zYId^PwDNo92M-`@8_oIapI+kVvZjC0*ahkF0)eec+UFWs5g&$wAzSbx zRFs5N8-j9OWA?yYv(-wcQvbDERwxwwem~Fil}hE_5%V4&Cz46qvfujjL%+Ef3qW1W zi#amr>|+Yl!zXdDVHz8>B8-y}nrRK&5C z!~w$UdiJPcGWGqz*<(lM4({&l#$z!Y!^+jFqpBaj^Xkg6Bk9#kFVl8oaO9%ojj5eE zLcUc{zxwrWVHjF07Y`gd7#GLpFU^+|IYW~Y8cov)hn8hH2N680_U8-Rw%ry*e>58X ztVaU?aPP2JWCAAO@+JUcUE=$dXA6XTQL{rJ5tSVvvm(d$9iJC>Rzb*SQ<(;qI9NT!T>qaEOPItNWm zGGs)Rt2)}zqNdZ*a02V-#{+%nVE;z1Ud0k5B=BelhtLKdh{83UFi;3XVX=dIs4F;t z#2rZROj-!lXc$sj{?x#clXIHWy0e;Vce}2iYSLlSP+hmvb?LayAs~l?a$N5T9<9*= zM6vT?G}e&_%W_CmEoBRZ3nNVINM^`}ol8!EwAB$CYte`d>xc#8keRm35kom_=>3RS z6jL`0VZFin*u#fYLjghesaG1(D)Z`Ufz%|fuXGTGYZF)XW_sh-9&sd`Tv!jJr0*VW4M7{y_>xqoN-KAGLu zeKPymWLE$9=Gw~A^AA1qyPnivG>@w~a1hK@ZL(XscIbKy>-JrcQQx3C^sb~~6RS*DKYNT1a8 zfxSC)-jqXOd5U2@72SsouR(=cx{d2t7K;zUZ76&9+0Q?H=+pyLNDMRRsbqhzyza;f zlo;Gt$gghiN0NM@P!M=F7K?kX^B?~8zm-&Vd~7tIFZld{Xee^w{qwvj{oTL)>jx$d zc%B;&`QP~VcP_%wFDW}20o|s9LAmn+fiLiphaY)(cyORUH3Cfj&fW()vWPT?d-j1L zS_}orF6C{@7sn8vznZ?4&FgMMWZ7gYt?PQFQi;W42#Pf7)rX#Z%!as+@0OBX8%u?= zUS_SC{iR19=^yATl}h1In5OAMu^1MGzqoem+Y)$OZard2YkVNkE*$pLzpwSHH?Kc6 z)&J;$C#B`Ko1RuhCW>yrC=xLX47M8r5D&&|B-ygdirb*#2O7B7qUwHVm$EF^oQmUu zD|UB{jj%2~s3&La?JB;MG1O#gY?n;koL~6XljkDI^u*{G!!XTGd+pk-EBTG`(9DUw z<#Zw`W5`vAKiSwBqO9BXdc@`7Fv*%NUnp%t=;CHsX*UlYJ)&t^wOYMr2$f2u&)hNq zz-L&NOeRg!tW>JcoISI%yt$b#_6_v|f*Yo&E^akzOGm^JHKnswKG0D<{f-EOzj>7>)?Kp=4A){Sc)UO#_#adP-v#G)?LFHqgqKxAz7 z(ucinabo6>$aC+1dUa!MdAz^x&o0eZ5pjS;cWf)JqKC7Wdp`c5&wsI!FGOQ89LMve zQq(8@@%fKRnKY>yFUS>bICD#5&HddM7;~ZRKKcAtV$pE1Sfpv1<2aUtfBeaOJrQ(~ z+rX|$&`8J)k^-=>TwATU)#Q!k;y@q4i$b^4jYJ~27X<$Y|~ZS1>I5|8%OaukT^GRxbrLDSUo(t8=LLvy^!0e-ps?QM^V%n zRe`yVL&xhOwhcP z8s`kivt1P;J%>GGx7AXmXA9 zb150^oE^W z@Y+X=B~}P3idSFQdij3N?7r@k+5a5P008?JuFS8mK6~Qxm)#svZ=SHyo@)XNFeKPL z`{2JWTAk%pSnfiQd8fapv>Tewd#>Ah#J**!_eXuWSe1}o$cfy z+|?1c?)KS`<1^cwiF*hpYDK!VJ$UGt4_E&DweNl9=YE}lolpK~0S&*ue!uXkJ5zWt~9p}|)v zztZ+xWzXyN#P&XJHYBGs+H?s==+LEXUe`0)o%6}PY5ZMDX6=9=Ms=Z$OCkKTLm=|_2rdgHwh{&cIHy}1?P zz|_n%%Wx!$96x;Ektd#LwHoziBb7|P@!&P@ocx+Rz{V!t;qp zxZbE6hIZ)CQPE4@+9@}wRZO<@4$I(aTpWfmy{FAL$rkGz{OHCa28@CJM6=nsm;Npm ziwwdeqPGQQZIi`RBo2DGXVMgpII>|8!q2nB--!{qXLpWnZ_x%v6aTaOUVi$*mY z5%W#`8&2a-y?F7$LW;to>3*fOpc{E9)*rBffbCPD7O929dh!*sL!(isg(w04Km1pJ zA0x@iX3o>_U=S3ca?5f2P+vGO1e3M_ZQ`mE3mo-xeSOKvHJ1PQ!;hXmJ~n&!xNRDO z$X9E10!1#|x^!#q+~mrgF(07^W1pH-roMj!YC#YlvMfgK@ zPpFE=f?^xps_t$5LXfVh+Le5{S*iTl%~ho2{=xhQ?=Rh$6p0985%&J+?)4JRYhor9 z3I;LL^3J=jSwISe4lZ4u9-4iRNv~}0{LPTFRJX^EJTNsmS|}7~nhpd4 z)l%W#|Je@~L%yT7I|vzve_!127F7k=lRpI#=2Uu&+B$^KWdl)JV0*X)Wik-DrZ zsEWe~2pRNlxr}1U*~cG_MPt2QuPaGYW22s~UAVfGL5??6s&rd2-1*t>X>P&D9O ztH8~N-NEs}fQ!i{k8Jwr9bejTBC^If!Zg4r*tIpsuSaH}!irVgfMWe&(>m0wW^~68 z83yNKFs1s%T{dJAdK>LUG-aUOu2Fs$bJJQmW9+M*Ynaul2_X(e!|H^OIylaqPRGYt zc*cwilLNO#JWU}i z3{Ejj$%&CJI^0yxojiIoHhNiNd_ZCCFzxX^h(QTpl9Y})9>O?)r(76CPy&Rzq~ieA zZ|hyu^E3#D5E$~>T9?G#b7v0(f>?2J-YB%C{HPpz=9&j~Yt zY6Mt|6!*}Q=c1!_G*?+$+PWLUVw3%|B-eUdZ=!%x$c&6c3=$_WAR|DAxh94&z{PCa zg&?Wkdv8}RRzj2H(Su`$UlWd8YIfO1)4@Oj3y?JANAxgM9ae3O<#DLzb9uux*nG3x zUhXOj;oh!UX`#~CwMw0K?h-(*+Y)bZD3ulXUW)VYk%-bVoR!>5_sQ(O?vvTi^vu?- zUb(fp_S~tNx14H2;*K|cCK2qwAuWFL`{N_;UAqL@HDE{(1VI!|kpQDS3~!EUW=%*} zDOl96MMX$rr}c{kczMag5g>{u8cPUs7i@KRq+MxNn+Kxe&~*Hovo&Z}UJo65N4J1nj5&!F-7T07LbFb6 zs0H)(-hR|lGrY6r8xK~)1GKfHTm~9!KsH4|0auSh&BtVCe_){Qr^n6qH^1_Af~Jc3 zLLeCAIIdVMvMj?e{J;F2KU>ke1wue;y;SuUsw@TS3qV;%wM|c5D#DJVP5R7al|nq^ zt_*iLWzaEW0e97K_LU~#b9W^WbOK^uPuSYcCI_OOPKV|BfG;pOF)kIdcQ;EOf#yu- z@zK}Unkw<4HCqDaXYMRQ4>>~%xZmqB7%#R$9xx z6>;?M{N+1(Ao#8BRyG>BWza8`H*fHn@2*^)?d0JY`a`KK6qb$Y0Uk9o-a2o!5y1A) zX1CNhGde1N`UVc~zVr(($0D&{*#G3Y$7@?%%#2{s@Q#sXkP>W1Mua zw0Aqmu)zl2vK?Zh@q$_LBAk;*Eo0<+gU5V&T=lMrv<9N=hqN$D@0^mcl^WK*I=hT zH95gBY^n5r9Wn3qXlR;NsZZIJ0Tdh_yk<9( zW%m$xXqVH*o8&<3!F1%vozbT+j(xQldd32zzO@3IBBW8CtZU6JV{OY+Nx(%Ro*3TImV97p@Bgk#G|p?gAj~F42)*HE(QS# zAUI+v7>0Owz(XL^D^r+dQkHJ^P!v&XEye5~?(3h9w7cE>a?6Db!!H2{sv`rz9`89s z6ODzff`xDLUeH9s4(9Nf$lE#HQk!&t#TDhX>jkYCOCC%3{d)6_j@iWl#hOmssvwRn z=v`87je9U)SQ)rejzu`qVs$gWqt}{!rx;%W-(GLY6h^WX6h(X?w2dNEpKCx!z=XMY ztL@r)XQ$^&pRMTtdFw~7ywZ~^TC;~rb{~tJ8jN=b?XI>lNb z;X*!t&n+t!iv&S%obUVJ`R>*aFNlJF-BJf?%bCVqw_TK#UQ^XdhEep~mM0tDI<6=D zS`c86gk=@aLG%G!pGAO`0DB+#31AX_p4selE9*<+Q-kSrh9b#)J}>gZE_OQlk}uGj1JfIq;C{BUC2)BRhuWi8@rkkjb~BkT|t zC(52NQ|-^74ux2!6l6SS%7G z$&=LIdF7ppIQO!=htkx?fS<_Clg$90Kw-bawT8kJcBB5HBcuY{?isF`4MnF7g{A^! zPNa~8i3U1WZNFjO$yNXUZ~c>GG_GoDI22M1Rol40n@#pS=dybXMz&$ssQ{xMVF7rWBwdX{x@yReU0 z#zi_b5JMA!s9|9kqrxIFzqG0-~V7qSVzr(V7ZdodoG7O_utKG}j7fS_}VgKa( zg*`~0j3zLzL1_?eMazVG!w_~&m_y(gp0Kmg$Wfzs9o z|LmDBe(S5hRPH*`!V*ryIhTBH=HRgtM^F^a=kvTMBEb8nKmA}Ql9{S3JO#<-@{>0Nuj&HCAQp*}bb<8^yaEL$eGUj)a@7rmpFqS&8v@9LMo{chX=W@byy zSSlrB@qd5uQ&r;+Lu2nSVbn$k!Ai{Pq?T7g?BE)Y#w6_2!SNpsP5v2qwu2^GI%B(% zyMGbM-hhgGkO@4LbQvazg+oMK#}yev5NPta>}@282m%iffoe=>vslk*9xbm$x;s^) zNkARMbNzHT88nitbHW)rudRvPE(gOQu=?FS~wBl#UMP)4~MmwrnR8%d9SL zRqkv9U#wpb`>AvcCBo>i)8|{K%%)-wnX!as6&%CU3wel@j7p+ggkWi`u3z%{Z|Uaa zQcsVJ`N@#QBv$CK9||3`>uad(bG{^;8tYtl^HUpz zv#QhR3tnm7jd&=^BF6y?3A$*yVc-=pFQXzpV3%Ajqv3avzAl#;3XP-(kM$UNY$Q_m z_2)q-MYBGmT8O4L@hFW3NCGaE_u)3549^mT_M~(?{Md$aYrid0tbOK!$S>*2r+PkB#IG7ZV^7tX+79z5y7DwP!PKC zDbQp>Wc!TyS;Z;vgB1*A^k$#3pVo4sx0TtwTq?Ij8vg6&CaAvn-8}Et8a}Gi7sT?0 zT<<|Vj2^`CVS&wz5qH^a)*HTpf9r-BK)W>pttX96Ehe^u2?rklx!b6w%{owF_FxHy z=#9n%l`2HMa%CG*EFTqSsqiq|n1ehuK6hOsr!whhUwppVXx{rm7YYRo$HSq}oA3Yh z58nNL1ud6gBHpeYF5l^>y`BqH2h$nxXd)MaQy)iJA5|1Q-b0>EK(q)xy>E z7C5N7AcmFVN^Y;d@eAMlYf}@Gf3^9;^MWAMo2~J&(FcysJagjk(kC}=ZGWe{i)Ng_r1gE&Ri>{~Xba`5!s-908u z1UbR7tVkpx%W}Kj_W6CD=j~*7fA`yO-dxYIn8%4+JQDe>Z~yu4bjfFs#wgUfBc|h( z-D8EU4q!KwU>aL_+$MZI4l~w-Lluf)9jc0_R^5QE;+2*nH=$0qaddo|ryzmn z)9ET&>DKj~Mt3mLFX4$ad?-T(cJ+@NTHVppEYAA^XxrM>yTlkb6{3WTtG95(E9Y{5 z=i;Zz;j=GnUtq#K%K8^|Z>U}w@RXf;YsBd}rytoRspGyN5{gLOy3erlt;)j6>Wg3b zCIp~zvFHy3{_EbdPNySD(!Kc9XIPfYd?c6JD0#FI&yrfRjC z2YaW+50EPI)<%tYK*_`V_}DDLgu=c?_WHw92aldUr5oB%IFcHh;CzYW<6}op9PvD; zP$;lG?-zyt^yfeL5HJCTiMwu+@B0+zv1;{cAAfPT_{8In0|-JMa2)5}@Bl%QS3myrR`+t5n|2)ZVE*HWU;NVe$Z`Io z%VwC~A=`sSn~6U6ui3duqpO>m-IWMB?t-GTxd=5kK`hPr@k#aV8EIaJs2ata7Efpa5NF31}MiD@XDRz^`f$o384VcxI{ zOQzN9F@Z*1#L4BESV^Q52v2i<3FUtH=Eqp6&GIzob;fKc2=guu4T$t@pXq6h1G+6( zI%X;>kgh9TvF)NZ9n_?N$#|)=O$gg{y;`qrX_lV~q73nbS?y=iRj4!IG#aGekFaGN z<8?wud^o^R3{eS#u~E_y+c;0aJ;!u#$AfSjGF3%aQ-cF1&mNF1W$V^HrP!8FW#DcP zB4rn=!Z2ivpq?&K9T&oe^sdY(B)W$>-X`J1ERpcI_5I6e8=4t>BEaCJeo1y{7-TrB zZQvmp!BDf{*fMIsA=u*h{;mhjRkz11eQRX&Bc(~gh#&VyJsyQ3b7)=V`8EbB1~j6G z4Wu?=%Dqs#2ih%|G<39Ipn~ztdDYHo_2GRe?mPC!l)nLiE)3B&PU^AlTJGmwe9^s6 zX7_cU%>L(|+2*a?kMG=k?!+^%!eqRmozp3s;tbHo4m`0K*7mnI5J~mSwg((Q`UJ!u zfL$B4d$cs5>AdH^ao~yO#tOK*Xp2l72}KP3Y~)Wc+o?jb(m`4fou@T9W2fd83#a$x4F>dkY#E39`(wTPkox9sGk z4h?{o9eT!eY`C-gx0Olk)|E*olaTYbg`u}`i;E)}<4O>CCK%>;`9kPEaeDkqzxuh+ zV94?u$8q-^o5@6Cb$RjMy!OHS*t`bh=LgH@+jktt4*(d1Vj~DfG1vhC5CS4UvaQI4 zoIceiJeRY_Nzg~|icZ{7K>~Nu`A~`oZdlQud-}15&z-wpO31RTD2kmF$ay+$_fq*C2YuRX zhm83(JH~g1^tC(i)D$OiVCXXp6UTA4+hti+5QIjfJ~=h<#Nl(>*KSt27XZR@M*>G> zWjU4RxD{ll=B!PM4=pY>%gZ;W4^Fc*+iJBlnGAswm3s5zH-9YE-qe`ZwJSd)BJTF; z&cA5r=Q!}OsJE4w>$uKKy_RTt{*%xCgdz$e&Vzd+y}gCa-UjCdG!z(#Hq1jDt&*vr|X8okQ-_MyUI0zy?M(j)|~aq1>DiWXoF|V!vP_HlWCUT zMDF$*OAG)u9S{XS69zt5S|pbAdG6Z_Ql?Y1sv(^Ifu{u7bN#9!D#=) zM2{e1C*pYQ^$%`-?$s|R6H2{S6aU(6*)Nuu#bWWVV_CUUQ6#A~QZK*$7Za!E7|YG0 z!0Ucc-(FYIU9`9SRHO3**+(Z2Iph2OxNFhX@{7Un_G;S!S^?8zbqeFh0~7!Qew~w| zj=Q?KR7xwNC|b6iOe94~$feUOH|}|6 ztyT*FL0OUh^0jZ@@H=TBKjB%kM`ur;e}tv!e!r*b+NqN#=89(l6}Y|n0}}T_Ych`) ztrXgbuP5cgtnl!UfAT|;iVqz+c>l3TE|)_Pq|sUeSN;-f^*vCNTln&JTji*2J={O7;&1NEzU>Ig~ZFN!+ zs)OD~qnnR(E3xlpPd!xr!>?v$&c4Y`BLT(r{c${ZDL-W(QEc|}RR$&;}G%@MNf5DcnBc?;De){ z!*YiXkEL_m#$I*Ui9*uckqJD`KptkqHPTL}9E^+ZLTIcZGcjt87$`&|(sq)%6_eZz z$BGv}ru%|0@z7AD&u?B@VXAA0^sr`yV9x*zDFP6j6JkFfqqL(jN%r4j`K;dsfW5<} zgAmP!)uBR{Zg2@J_5shzdLV%yHeB@N$%{BR5rRmhBL)(2_^#vh%)aCj@4;v8p(YXs zStuk)>}s>dtu*d;06ZYG2YEnd|HEzON1Jz-Z#{MH`40mXH1VUl9Fvj}K(g*P=7h_Q zJ5X1RzyOFM7S%v3$e8Dj1fyNC34m;aoYOP-=+;%BQjP?Y!g&-@Kvb$DD&|>7hV3z} zywg%!Za9^s&r2T5VK;V7K@*_RaKrHi`}k{c-1pDg>7yti9>jU5^yt6#XZEcv9t_@o zm}uuF`|d<~seTy39zhV)vUfwtf3zJX8KZx=w{fh0hcvKCESK}5trh=O1U`gRz)9)JyOXb8FEjGIFc)W)kZyhVHIb~L^R<714i$ZQY> zBuR;a*y(hFAjoEOmZ4v`c6IB<)jqyE99Et_`{Ds6St^!}9zD*o?0v0NE|>EI|LWxn z|9q*D7sOYF+oRmrU5Y)>?_?WWZy9lc+$lsJO^knSGrIET4+S;`F+x{0K@jg-{$Usv zCDHc0snUFsDwRju8op)@7&cC1xuVP{7S!(bZ%$yM=goZZ@wL6m-BTw{5CnPU+KnH7 z_s^K+OZ( z&W&(SeaK!^F1my>>(F@4AHoWDZ4Q7p-)w+ zJHKVsSDVAqp;KwHkWVw)(M{LI?T7^Fer7I|;mWm-4lf+ycy4=pJDEs+ z=7lHn`EC-|69f@K;Cj8zFpMNg8!Ic{xq4x6 z^u$7adkn;81oU;?{8ca*T1LcWAA9r>Fp8B#qTTL*5I~c}<)6O)CmOMbADV`ooXbA) z;wRF{M7!N`9Ji1!7^Y!a+QX+FDUjn=?)|I}?3mEZSXeCPcoSa1K`&39ZrAF4r;dWq zSg8bpV7*@FI8GGBy{)Z3|M|OLcbHEIfCvrSe5&h!&sDA|9P7*<&17X0L*A?J`f&g{ zDo+U*j^rK6?yBiSQ?Py^ItLE+JEgfqmgobt35 zCOH~r(EzbyGr9t1NsprZfOK_PVNJZP#|{98IONN)C}j(M+WFW*bS*g1Y?A|;NsHZ6 z$(tyPBZ3R~?Uq`8{U?MZWc~1{*8|xoiS|6@z*Z_Tf*spOCJleuF?%+&8S9?qf@T?s zhtqxJ41+Dng-duKI(^>rxDeKXV5F+oJ65BkvoJS3KAGaiu((BAu#fmdzZ}J(2q7-Q z4FReK5lrkPW6wkaz)mefH176FjvWwe-|ea0;oO14!>RP@=8nJXhWdzLbrG?U5G;%; ze&mHv<{krgF&K>w0#L#t^=ZE*IA$1Vc~6y1rEb`L6+M<6UzpFY;3ajiaUcK(95;fH z1|fA|hVTImC9|$g7MYg6d(LMM(_P2^apc%ZEL){ZY}6A#HS)tLKc;Yb;CU#Dqy(M7 zgB*&hLC}DakIkX41HK~B$nY5nMsQ#A0F;#7VUJjDzVd}v;sNmtcH#EL z<(1DJdHz;lw4C^no(7;y2q8#_#z&NXJD4`qp2vQI#hcTKbcKt-Q-V0h#fdQnae z;~2Tr(cE*U*`$%ThtiSCTSv2djvS*5)RTy7#=dfMf#+t2QQ!6Tj0;S1_)@YIEG@;3 zIUS^VNm}GPVPy$I;tXOx6b6UT{w6<*Oy>UfuYJkTMhwI8Ja@k+Fp)?!%DeycFMhO$ zEs&6!*OpKBmsw}%g|Hh#cIX@%pE~^c(>D`zt*;@r6GjjK$1wyzeymx(i?m$K=4>Va zSt`bdwB;k^lwATjM=RW9p;$mz6 z!^h5@IZxBnU@)+3E1%0-w!OEt{;%KL*b>s8bC$?-rpL;X(>_(d6CF62otoWQ-m`(B zn}S7S=ZH02{@~KpmG!yPN5}JpcB=*6Kc5=%McvUPW z`_+ZGSEbl1NYbt9V+b!$9%|Aendcd7u(i@29=jbUo^KUy>&}@|N6TjTBYN@&+wUzj zK0-I48}+*D1#f(G;le#koICKBQ1MJ zD$=DCk6TD9v>H%Q-VbakO7SMgbq0gS>MI_^P_~f_yIZs%y1g?gGD@cDSWPLJw^yq? z&OCAcq55AdU;6K`>=(vV9LMi3okdYJ471;DjaZ3?;A^0Fp>EH*dY{pX8vBq}RnmES z?BErWU)t<_32^n$$t@gnRQ34j-YZZ+wuM*Y^O18b+Sry%N6Dt)pSa_S<_#9=2?m)C0S~>+c5xe6#WO^_|~^?IbDW1 zUit1k9d0GKoeNjmeXCe1Hk%8>km0$L^XHna&8_Zhk`0Q{d{#^hi9s2u zN94G+)!L|)c?yFN7{f40k_=tHd+*-=^Ijz{E(eE{>OrqO0phoFoB_z2*YNT6E=TRk%~55#!~#i7VXk-i)c&h-$A z=C(7Pb0(0bP_HOK5wNTEUJLYvW{5a}>l>1U0<5M+-4I2v7%cH)Tym-d^EYfQHS`M| zo7Ge%L4E!3!WAHB=~l>PRyMcXTlXj_HEZ?{`2o#?edTzEXAYCls)!Fv<*b8{VN?y> znmr`VGHqcB&&{9yxe%y8oC@1{Ym4%60E9gl^&-z3j`nt1o(htbJU20)AZae* z+B^yREe>+}01QSZ9_Sg*k>S8YL5tLIADIqQ2S8XrnaFww!t*94$5sjsIaJ%mf-Nc~$Jk~ZEj84gkXjHk2W6!e znnRH9Vzd>-ei(MWi0Jj^^lq^rtn$f(ZR5`VSw6E0t~XIsK3Zo`@h#=eIUEP+{~c$+UmQ4T;I52JiZ zu$FECoqjCvB+eIYy23%ATURUwiqi)*=1l(7i;w+UIU~PcX_3~UAR^My;0B$a@*Egm zF|m_%<`83UzKr&V6Yaz1<@u@Dn3NJ6J|chsBQGt+pmUU?lo2p0xV`;^b7lO9zP$}P zI)cg5E-NJ5MYjg)mV|l7Bj+?c+*GnlW3&J2h38=eplF8Y`9`Bb5QL&AmT9i8u6<*3 zFpNFf+&R;(%nXNi5Cc)n0EA2upMLSF?}^ccjsBrr=+JTOx{)2jF&rQO5=X8P2jR%1 zMs`f`W)1^EA2%VW2Zx4)vQ!8zmbVt~tQ|hOFPq7#sx}-Ba`{|VN&eMOzoz!R(+Y9Y z=)GGmpF4Hjc3fT8i-n@?x@N!k2S54w4?^y5dZPq~BYa{q8iMsr)uRtS`OLwYsZ4&t zwd0N2nk-3VWamU>BRQ$}HE(3nvXIZDf1#5N!*FkRZ(;xJcy_+F)#?JPcGz=ANd}aQ zLYhh>YeBW_emu{et2No{tM8zgaB%;#OnMS5j4Q1C{V08*-1*Yr@)U=EARh8e?dkrd zyRKoN(Xrq*OLz(+CLqXxx;xeW3rwMSs<72shgaWqyip=ZefaLz-cB6u6aC5Be>y@! zCHhH)+yAZV?n>D>n4A4pc{OYp1u}&){WB+XEGwncsgXJoIeKB={DrsfKzdag*KgJ0 z^r$$KP5`V)_9pgxJDZzwA|VLEP*n%5+O0{#Vz%(J5f2|?Spgs zw}I}kx>m@YFDi4_7q2BaB#J^wRtTIhEMtD({Id_A#u2PP=#Lf0KDu%1_y5B`&nLzG zhtIcLjbH4+|G)qF|0K_x0V4EpWig#ftdJsDUU?E3erQrB_U)gXC<%gi|0RbYh=2U` zKmGaE@=zGC?)HpqL3~NUR5~^;+`Fc(?T%bml7w_R4M9-7UMC46l}^v*4-U%1i_M=A z05Jrz3?b6Ypzl>6epay2AHVm5guu?vFZB9@PQCVTFI=t{a%a68Q!ungisHa|&a0Zo zp4%y%F4yiE?Gcd8x&YjB^-=64?3kvA6hwF!p^V8>V-V?ISKc45YdX`G&<0!A6|uL-={aPbCjP=w3U1@jy|b5Q|U-#BBuV zb-P=81HS`iilszpmSheiK+*zYIBJghy&M8}U^4^~0m|D54uLM<$z<$s!N~CPDlF9@ zeKJ;`n8-4v%=no@7>BOj+R}R}!T|<5X2)0s4H$PA0}24GCanmAOEDtC7`Gy3^3J`C ze$zy}2Ew%JJ%6*BF6N}%G>c$;M;n4Z6NQK~IMm$EjMiC>AcJKhsKM^a2`lkEnHa_0 z`Pha+yI}VvDr&}^bO=E_gv6eYBC6TbJDY=+Dm5;9*2*>z%))ev#_|+yBlsW;AOr}S zm1y03e4f;?R z#t0ITlMyzLprPV5XbjpC4w}k5IJg^cZ9^muGfL6mG@=WIW(c@x+sVNtCl=k1NBx4K zbpmjE%rOnNSjVfUU3!a0zYf*E*t~X9zGo=`uTkd{$&C^odJX}^DoTfigROAN>h04h zO0(7!Ts#N69P2Ca}!h@o^8mNt@jt9F;b*dj!1DPwaa}g<*Ua#tA~3_eiT6w1ONyPQ4589_mKE!jWTHW2yhaWs6+v9 zfzZ>vFa!`7gs|8)BhS$T$g)vLGL!&wd?b`3Pu_L%~95FZLLasYH4u?y|=)@B* zCl!%pxr8E5PR($9_S)@@WH*3kif<`Ms?B`&>TW3y<>f?gFesHuzVA1i%}h1}L$G10 zkDh;mkCa=BKP`hxuq7~vl2I}!Lr0O_aj(KcVm|p~fgd}@0`3GqG>k6E|L3*cXIht^ z1BM@E4^)SpFOJsDI05jP&iY$16fhiwfHoUBZ3CMycJ`&>USSq*4$mKZ>Wa3AK%2Rz zJ`<2$s`o>*H_jyR5fn2 zTF*cGtmg*|P4T?&-(lJP>da23lgeap4ExJ(e*4nBt?8_Sp=hU8`=fV0zG%YCjdyE9 z?VgaF9T+yrq(+^mf>AtkpqW%&@Az0}=S!mf#@=v#;lRw~WTjFa4u|t|^CV4zzQ0?w zDidgba0eLCMI>o(VQ1_1fpEN8I`Gb|O1->xbYa4>Y|r=8sg$Z}gW;f1$lH!Xqv-VX z!2<`+1inX-lqiZLb+o>+a+_r8x!mD}T;J)gPN%Ye@ROgsOJ$$NybKBMU=%QN zAKAM5Ry}^7nOMAY`?ycQa^wOy$TIC1S3(mqT3#wE7*PgC=#)s46a+zuM55R4+pbf} zX5YE7csBxUh$)Pq1A_+c$ww3O5vr0TCjyGn`Bw%nVE%Q$TQS-Hl?6g zPb#(LvAZOhHkorl|Bl-o@8j*L1F2pWN+DL`3lvw7R-y8AwGl0Q8-&6bD6XSAmA=Bx1@9nl-z(xg*2}v_H>?oX4^E%od*Y^Ur(WQ?Y z5c=yK>vk5uOUs-)%J?AXsH^w3cN|b)=|nc!^hnVdao%Wl(33z_;`9cxfg*uRGsP&_ zQ6g9C%~278dox5rRTga6FGQfvj`?6fU?C9o9dmGK^U^$xf0%pfrXS?RgiKG7R064W@Vo(sd5MT!|m~ax9 zt`Pt@k>NCbXho0|gF`ekZKp#NX;C>!zx*4-IWd_j!#i0Ea??l)wjtje;q1NCvBAFI z(ibgp$J-aeMc2Aj%8yI~8B`*ci4j_fvss>b&tJqXFC>`E=FM|7vzKO}aPaW4Cz6>I z&;8dWrlKhAPS@78uYK^=A8oXykT}}je7w=d!;p#+R4ia1P5|(MbCZ7|S=V=67Nvo( zg2X66(!v-)Gl)BKZ6|^O5Jo^C2pwZ&$9<1%ldeqqVhjKvKw8Ld1P+rZ6YcD*-n>*g zd@z+v)oS%rI-L;dpY8dY=_b>;XP$n>v@DL}I^C}0*o|7_cW*RFNc^nd3KPt@Ri8xl ztw!&_BQH)*mn2d0eZSZ5GYq|NdTMGsGxCGoFhL`OIzkS@?k7rFhUW@}Lc7uE^xElk z2FLM6qd}4s&Crr8Aud1cw<2jnQ*FAFmUv+@KMT=t-?%mE@5Y|!Vo8ReLmBxG^#Rl< zf5i_rlJoC}&_C;MbWQNUi?5#9e@c+17u&72Ze|IbMnd1J6wv*hQ%`^J&WDHx{BQsC zpT6+Wr?*z`eQR$Qc1I$HL~x7%l%VN48A=KHV;#JFZ%t&v35+;mn+gN&8gP!qi=|{D zk%AzoR;v|@WBU)xSJs=PkL#yry`}Xjgf|l?h=CdiHiykTHP68eKyoOA`V7wSP>yCV zUb@L~%FAE)?DX7%WjQR%{&&-|`zQad>$W=`MM+R3`R#9iV}R(v-1Oaxs~2uv|8Qw@ zgB6b#5@2hv3ivt7R>DxRTQ3A{BAbqLV;|eWW~1`E&frp|ec<%NPd@qx2!dCxT*+oK z;}a9LTJ7%I($5Ca6XMZQqR;6+)nm^$lhcW8B~owMZ5l1HE#%|NKPpWY#>Yyd;Yic8 zv9U4N^*WtSGMSv5ob&@9M=?>7`orPwy~W?VdGl8GOr}{A1vyP%OM$b$)tI)B4_lot z{f*xw39{X8-^a3*wY7IYxJ;A8K$vJ4yQRGiJ7mfZSLt&;!(HgH6Xfjq@rj-Hzu%0) zV@HpYB-v;*AP7#U)26FeclPY~Sh_%h;H6rxg=op7QtVPA3mT!~d~dh*&c*kCkUnw< zb{;X>4I;JM_n+QZO$$1 zlkPurvF%(oOX9>vqq4Pe?|`#3GgzE55*S{ZE|mHpI5z5%GPMZDSd?L0?eW^`nBF%r zT8clun71QZ0oQi`4vz>d1_T=c623EMhXq>zXx>%$B*jo-7MGD-Z8$b`L-PWoS0sPd zwHyoz(vK~GE>rIq5|nE?smKr4;9w^RI4xFsYC7_r+2r;j#8Xwj1c3LDVXEtgc32C#ZO|=s)F(@`xIBIwi9m>XK>&In2&ZAYZaFx`A3l`e1!{X~+ie;$X1Od0M2(EGH2|Us zgMC+-Px_rh-g_)Kxh@AwgJT37j3{~o#Ml8ot?&Ql@z4HYM+7kp z5by$tHUh72LKMLjFpxHk_TA2dZRUeKAhTaiX04xJU)oxG_V~-!T|-j0kB7d?a!yQI zVAAmK9AVpJ{`z8BHXd=`b_2#6Zwt7M@6Z>j8(>F zKKt_X&*M08e~Br}a<|t*VCeeN)<1mfV+<4ywKpE>G-WFqf@&We0w4zm_;{N4jw)Xp zZrNew33udhSex*tt#*oxGjkKL!m6EC=zviSLIfD&h^yOLWP?Z_4AZ1Xcc0Wd?Kl&?mM@9-v_|B+wEpD`Gr#_mKWbe1h2Kd_B&5JaqQq> zIU(1ZjX(UeueZznY%yt>7DdyNBy~C+!!V8>KXUHyqt&H$2iR_eYEnzuAd(f+Xh^0^IHDT1sKJvo;=}A9y4;?&QP-fo$=z<1}vRuZ; z(Y~qc%T0og{_fxTU4kGCLqBlnk%9-_x$6Fc~1kb6ah5*BA zZ!54Q1fSdqFnsF3Csx`R?|p zKXYupH$4DJIyn1OOqXkR9E*FdinSx!Fsb zYoXI)IWCvaTZVbR%@fD*a=A=VlqgB@ywBEMn6c_f* z#@f=@!O5pzdI^Jo%Fd=FiIS}7rnz)y@jrd|VL?cypq!kUoXbPk`dd&r4)AdtGD4;Y zF-3{QRdskZtbq(hQWe z7JF?7#NjAZ27qJe^JkAbre&CBp-|8?&9NN>1m3v&CXPs~CWjClsofGwlj1%o025^V zK0YJ@_fWq}dm(_38Ev;+Y`vS0AOMKhYXCt)tc*lZ0AVRV#6bM85daK9aEdD^d6EWX zdUZ5pwRpycHi31>R)mNQ06%~BXwZQBBg6n$4}oDQx`~IoKA7m+N9r9C!;$^u%5=Jn z6>);ASDVcb7Uw42au;B!pJsj&* zg~EQBo$W@(IvWyT8Ya*hodO^Y1osX*&X5vOWE3H^1u+ebRYCv*f>B?sRSeDqm4ZZb zRFX)OzUhU%a%eDK5Tm#c5-O01u$TlKDF!{vHxR<|I5dcw04PQV7}!HEN={|R=2C%O zU)}A)hAmT!hULQ0G{9H|kz>6k6DT{pF&SV*zb?epP0nZ|R8A9RCvdQy*|8HWvzyFI z?cP*ljT12D$f2gTI|BG5khIl1RUdel%%#DJJehWc2@Q_f7@_Fo03`e<;Zkfj4tOwr z4>b&Vw;6{1A%N7e#1Ip7C#1>Lh3xF~RN_W|*>3A#2!sggqc}i{6krLlG)S-#RW8b)Ff3P&pKv5JpEjz?3}SXL^x%l)V#+bRnN4xRs4dZ?#*Pb2Kl zGH2qj4fbS(AWr0JS8b zI^+>F@afSYt2~>d>?9Wg^u)e{CkFjCiemRAuAbuvg82O(z5o7>R`lx+wHmomwFhP0_-5N&VK&Ui$vqXuuDXUj79fwPWD@TkRIVjcU+@Hn5Bh+8F~8141L5TVT1)^ z-3Kklgd1oKd43TLBL`4Gs5gWw0eCo!j$gZR7qnY%Ze71u?LQ_cy^uKyY8CZ6KfiVx z4A{rdp8M19zxJ(=`#f$>psj6T&M@#XwSUtGUwQS{N@GRGahi=rsWkoFH#D>tUna&CEY~ z_MGo|sdT#A?GiZhsb^j=Tw;CYu98Z~#`eXlo_piV89*+bCtM zwz=^~?Uotge{18txg$rN$ytDw%?P1EmyeKy$lTLzYwbZPoIp{?^WYnIum7FD^`$rl z8;yn_@EphgqF?A2w`GpwbUU3yB0-YmkAL>&w-&dK%$^i!TBLmuA#yY%Q7B5XJ-x-0 zw`gO#5^_gOb6m<$le0?%@p_|uqP}%P-Mecezx|cpj-seuuPchu?RNY9zMM?H_Fuj; z3!rR1TkPzuSGLYS`)Up!UtC)Or3MP9XmFfTl6`0~pvhF`(HmDTb_dnj$?^VhluRfD zLDp(Dp65kTY_(bhj(u?T>h}k2mV!U6RR;<`K$Z1w|K;kH0Q0Zl?WPXIB=g9zgMzF; zAo%^ae*X6L3lwC>w)vQ|(EunOIeU0~I-5y8`}k9{Q-!A=`^1sMv!sHac=Rb8f&b;7 zf9HdxPVBlYhS4zi=CvywV)RHMu}4RLu$}i-BgWkeh%LjWjG#Ei5eB}JQ|~>7nR+67 zC*qW9<$SNbd;I9PI~KQe_1wcx?VFj-<%-8=vxrr>y8M%KZ8qFjTpCp}5f0eE$sh>S zk--tNsH8J#UDx~lekPkK@77+sd5@r^iJtDb=&{(w3hA<+671nT$GlC}2&*A_gdbVF zV+s-3%T2tM^GIHTdU`bKf+C6r5*`O^*q(O$1vlw%3QuA<5oKtxE3$Wn>R8{2v}6=- z*4(9Za0mo}{E_`?Z0`b3tdj?GsduJxs^7%1>D~iR9)y?_` z7Y{J(p+UbXLt}*4EdT@2qcB;+G2GK0vK0W;R10VaZm6Px8G^2#2;nDYPIpQ2GALU$GDzwbA6fiAds1Y=! zxNiYgFJ{G{C&LyU11JepF&cLfF0h&i$em9=uG-Ns3j z!HXUMWUMX8=tS5OfB+^O8-oh*6w`fz+;9x9045}%Qpzw z2?F0kHlm`^f_zz9XL^IpDr9>=6azR+p#g{z29fMT$310%ChG`dyUh{M*HH-!QHF@H zgzXLp%|=Unpd?+#wY>3Dhat5c8rOG`0SwK4oH_qNSo@!9cf8^!Zqks?$b-W~ZFw(QKGU_@WUK%94eJB2eOwwCgwXyh5yU-)D z{HRq~PtBO4-Y4SvQos51ue>@nUb1bw)ovH^13e?#4B8O#bndzN+@1?-qL4b!&Ji>FV^4~3suH{(%N5?e2?q<+6eQ?r;ANf}!_E zWfVnSxpF0w%hCw?^XnhPXXlk_x4wAi_@_U8=J=7BsYwnN&6cbARS;KcHE;1pmcX7> zUOJaP+3H|7Ze2Tccv2MQa=F5BoFE9zR*Ryj-L36EySC&VI{MPuYfd8D!SbC>^X1Xq zNeHTor})y`o_QO0ko~iV%+cUK{OQ-Oe02HA!{pnj@R&nx<>(bBkM$aNG}c<*np?;e zi{qAMb-KOj*#(xN|KzJ*{R;;rizbmA+| zed@jUuL1Z932BHUF=FaqIy=ObfKC9KdA_-t!Y97QjUkJ#Kfmw9ORxTVLY6g6>kZW> z9{q&c-9wF!-T6ahb>IPLN)JxQ%2ur|P88=3%-`>5%4V|w2$_SyN_o|?our2FW>6}; z_RGVhBrFJ=E}wC_G}v!Y z4(9gQU>Jvp2x1ekPnmt`a3S7zmwmy+4d zw=dmZUp{~IQ%SXJGdKT!NKf>cSuEI#14Lgt>^S_$)+XJ%-5p@$K@k98a7f}Y%7u97 zhfS-U1<1ppf<~=gTxqz3$)d3sTdO1Y4RLY%2?VZvt^4IgYdx^9=BmWLIdCIlU|TL zaH40a&Tf~AAta9R5CDC^H9XU80iZb{|XXFA@y7RRXAU$4{9$$cH8VvKK`kr2liW*)#-Gy*=(!R{&(Mfvl}I3 zgIru+=aN{vTV**bMgiKfPaQda^}?m!fA>N@2_mDoB2dLnqa9%@{c3G6%=1zV0*QnI zf?%W3;5dG2s+7%^R_^UJ?W>{~>3jTukS91Io6cf9ra`?O+dAZ%vz7;BC(oQX$}r4u zIJ9m1{!Xw_ZzR*HgA0dSs(<#W$B!O7*lM*91WBb*YQO)_{^Y9>+@^e3=u`!-lsk4} zY4zr7w^y@r0>^+^$0>PRr0qZZYhN78=VKslHk*k=f}*Hqqlx0s```NRw~^cn+jm|N zfbPL#E=1MiPy-0nafui+BiswY3@wnf3_?alTSj%}@Yq8)@7~kQ=AlD}8jZ$ZFJH># za-Qe4+wD{)h2dngQTgVZZ?x0GBZ>sF4oA=pwU-gNbvN4XJE~^ZBJhsIb)Dp)UcZz} zsD*`F0r75q_&e>PtB;gZNA}MjY}D$4DDph7>-xs#*388CrLCRsy5bm!2k-r5`q583 z_3ZO;6jiI$g9qk|+587Ty1kP_de~h{!zLXLriNj!;_(kVbpF!KHwN|X`TYk3o^Q2U zFbv}W@NZuG=J3>$hqiYBneH*ns5f}RtWKcPp1g1o@iQ)-o_b`{Tz==m2dh>8`rZbr z$p0#%8sp;hJzWS?{?;bmFLPD~;!}Vdr$J~s`OMNIN7gC%gPzV4(2YwMg{FBfkRm|D z*~uEmuFmFQLF~XhX^!H+nbIjd@-GAoql&|z-F3W~zJpSTFoxT)!veTX6kCMb#Tx|= z&BeNdVMOf7sEJ~#gM&KCLjakLBL}k~t89Y<9F#yX>Ws8O-QsX*Y%J%Zf;D1gTB#sj z55$cS)Dawx*(U565g`Vg4hbfp1fYjQJ`8y+5T}748vwsRK)>qU5cDAQ&?J*7;ybl= zx8BuAel@iqoAZs>Z{Y@j7IxY3c^f|-?pcuO#e>iX^3HY(3B5j3gq);ECLcMwj+4%A z6TpdUWH;6#I>2cH7J!0`iY`Jey5&-9M+*ay=e8odh|xp9b%7B~!?x2E?fRJK0W{kK zP!Nt~w`JiN5F%+Us4thl@Sr#IK^~CVFD0{UZ(mtlU3qc(5ajzK`M|pIZ=UQ7Q062X z+Y3fB0$kAup%QhAa@5TR>e>KC#Hbi!`4|ydq=$6gGiup5o(0TJs9JXcpQCvIp&?L( zBce{zAs}QeO!8yEbSDa_Ef8_Q1D7N@W4tj+J$EN_`aA~SBK*s-eH@XiEHwncIE)<- z41=2Y`k#WbdR>{=9kfDikzlAUHHAc^!S+FN$dd#>ILFoIzR+#Uihu;BI2;9c_wEf+ z(lce;_!qDJX#(^H?ZMWcdjx1g1jw4FU1`LgdB@)N63L3(d?>f%a#KG1R)0kSQa!5sAZZM z7yvLqnqy>)0r=1W9Vjl_@SzFUZP611qqM~pC-y(@dmm2}m*Mo6t2dQgstrIVVLdR6 zE<5(wmtJrkx7loFvsoO+|L8Bj_H&mFJ5%RI-&>+9uYBe!^=9>Q-Hz+sC(fV8QG#WO zk8i9WT!r;9H;f1-|M0oe!O^~{pKImTUw(UhVJ4f&RVo!lQCOC(l*y;~z7KbZ*?bR)H7D)Y}x1xUhKU`SSo6tgT;|BY`o{*GG-w z!wd5q1t=3uHzOz>;P3LnNfeeFDz22@h!Wf=Av`|AmL%W_p)S6Vp$+1&( zYzJJAuuUx(d5{FBZuBJ(P`=cvs`?}3`DrI93xPJTD zPk!bzpZs*I-SIs?pU=TT@SQ!q#YxBF1jwO_ag19dG;FW5{5qwgyLx6#DlH;dVlV)q%IU9VY}jLVYx# zJR(9%9;!_GIDuH8z_J)$z=)p(y|J2M__`L!lQ_8we(0&nOmXV{9P`gC0_-DyW4H#v zmCbN_T=n}XH>XDGbm8MON8WVf4J%Y|X#2yrGednQrVX6I$gyVP5GNib68MnzMU|R| z;6uSy3-B(vJJ5*54cu|}csrWRWU>>7Dozw&xelJ^;n+n(8t82bV|-kk40qRA{3iD+ zJUVIN)tqOOgik>POaNPy4%vZdAtn?=s$FY&>HsMuIgW)o2Fit02oL&U4+;P=^kN`@ z5W@!mCX8Lcr$Y}1%oqTmI08M+4e0;@5y&-kJEMrjBblMAFYgR7t2sm5Yob9rp4`R` zDY1OWbf-{WhbJ7!8N|zWaB5AM1U)Dj$Do`^P0rGIgzVkh!N+!RA&a?Lq}B&DFN}j= zN(hlTf+>ta=_CfFQWca^19p}n83JV>Sb;SVvVDM`W0}i=mGJyYHg(f6N-*yGLF>-i zs}EiPJjeqw`=w;I_QvJK<&|HZI~LjNJSZu2Vgth%C(px}1u`%IxPc!knXOc~x3i1~ zp6|l|5+f+cM^Gw)G0qxRZUXKY0P8^KZWKgGSR_c4jRtK5v!HOo=raLN25jUxrKzzG z3Jc!@D3lss6OXRIq}{BY^`SVId&f8Ps+*=68^gmW03o5ib4jm$5DBh{I=!%~x4Qjc zh!PHsGDPfpLSLgu8e&eHfP`=+j|LnL;k<|d8nN7{lwtHNl$PIU-+AM!e=sGFZ)X?g z`~A6IRIm#Gh@cQfKr-(j!L3Qocx3~4%+wt>Q-px>gB>$sJ$eUeFX_L{&> zH6hMIx|Cjts05x-W?~bjfM(!@HW=cdLxG4L>zYMELzft$?lck$J|6doe&BaN=#&Pa zMwGL~DGKf|aN(Q$!pZ8bM=)!oOw5kw+R=^Iz1jgLm zY&m*;VgEcsvz<;Sih*P*Y1!87%#>>r?dEN-q}hXf96^EQD-?o@sjk~?_D2}Lu=xHv z5#Ss?dL)j4YNeV?CMk+)G#dm?2%(;V5{6;pAt_G*J~|fw=_{O zbo0KrtI=rOSI_r)z3aDc{~t@0xm1$If&ztmUhIT^-|;h`wxxzLd4S2~Zbd_^JN&e- zgVPH&Nx5dkh0fZS(CwPQUk2EmJKkH}C?3eL4CDKOBuSSpUiklf>qn_aUVeJ#>J%ir zb>K6X-+a5fvv%z0AxV;Yy{_l^imWV5Prxd&Ua_j#0YB1)!IVrk1nt@|R+P-y#a3f& z`O@QO&V2Chd*Ae9IGK5|avRKuJ%Y6>8^24Nmyz7B{;j_ohf!;NJ!VqoPzQbB%b)pj zV|T0GzCux$iw)9r2ov3jsGp2M80EhFm9GE*aKERLqNq-%4ZwB=Nm>? z)%NzTInzGeCh|D(>StaYjz+d+<#IW7H2ACUy|y`bDp#vwkUj#E%R}Rk=Fxnz3g5%@ znnXY5LfDntA3$Ne|G<6(K|Xx{orrL;(m1D@yL8;wEC%s0giqKmhtN6+oIHN)zSozg zX-SeC!+P)L-8~;>BZo3+B@pm1CZGUAQJH1B3HOeFE32bPW8C!}BtU2syEf@mM4fj$ zeXR~DEEkgw1frqXr{tpT9JhS|^EELcVHCkKm%QP=n%VNKy3v{k#yZS$U2Vuul0Yq-Is}mz+OqOBMO!-KN zQ;o1I#Gw#)+Xy}iNE(P(sP7{Y6XK*jGZB_+c)|iO#(~2S7{G)CTDqfQF$9n2%A+vc z8C6}NEf)ct1pVfIO&z;gnSB@XTglP!d~rCYjVNhHwl$hx6TU?fjyBXiL5sD?Kxc*fm8 zw?jL$1YR@yE970N{dBne{)IA$sF%vE^K)v<}Fj{qT$iWW*ZwhH0myVQYMf`+3t z$3sw10$84afDqv##2*^NB%tNzCdUuY0*E#oTHXi%Lja+`FamYM4Em{t&V~v36L0K@;E^W0@*ch z2@4tl{k3JV}zRRttfVWHLD#jSR!c=kvDfs@?9NT)eVAuH-^}tT%vX zj@})-|18b?_CNXGM#B*VK`+1fDvy$$XFv1#&reTG*6VeOqGVZaw_8CF2^{x-e*0S+ z!q`(gA3mutgW}W%M%>VmTMpVaw0w6lp)XIHYmv3u?P`8MMr~z;Vgdq5C;;P(h4ys4 zKC2w=s`!sz|KaT1L?)fCR;%}Av#m}Cu&h70euI*MoW!xLJkL_=dcSG7ll@jXH~E9U zv$dPRZS2_4T1X;cl-<~@Z11cm61<^nfA^2R z3P178bCfkt2yYgiSRScqa^L9Ib`a>(3k5@W)9F+k$Bjng#FSqDhpfZWWC&#i`K@=W-?8#Ak z*zNcJ=2w0*ok~OmSIM0CWHCS`smfqeIb>}RLcK#L|U)c!!XR{^S5r? zy1cc>W<{iJ_o?J#k3X)$-2O+;c0RuI>yLhdNs8J~EffltVSMdJKl(A9&lx*s?Hx@@ z-ECE$C3+F;V=9$r3pl6kdDkVkm}QbzH!m+tE!@3x@3pUAV~#!(qq>j8I|#NO+9j6+ z5Db8EbFDdke&6)iM6Fh%C`wV3PNxe3(c<#b*3jZ09CqxIilBju5tI)iG#bTYlNUlj zkC22#kQNeyAOqs}^3ZZJWMRs^yA`rzOaLa5NxHETb<-|<*o1i^>MFQ|(i9ti7`YQo zkTfi*XZrzCl_!$)aTwpB!*w{AH{7GHN5JY1lexpNfa5ANEl;@4`M}i?*$SsVW)Kkr@GT z01yKJMFJECc|EdR5E}~y$4mGiaN(T>6x0e(oyBgQw*5(n8BzA#*oW-Xtl5;E`UsXD zi`bMP<19u9kTDusmPa7N41#7s;ii&W1bdGK_Wl5-=#d>5l{jn-`ZI*5BT*bnS~LVa zNREgEj*EobHENUQri4PvapXJZ!{KP%j?9(qUwyF6e2@oZ_DjiZ{bzUAmajZLTddow z96H~^v3>T=UG(-`j|3qFh+-SU`-HNR^BnuO-tI!089^wBA_}2a*$iXJR3_1?+y*re zQVxQ~hVAG$rC?+V1c)f?Q=umKs^BVFAA48G{!kxAqlRw{LVFmy-oqo~n5E7t0uQ3^ zpj|0s0T8c6p%<&I#lJXW-lU*t1(5}Q!Y5%*bK=O203A_$0(VtPFwoSzhK(??1rV5H zk6g-*lMsA_WKU5^W(_wFS*Dh&OED7_^8nOw%uO!@931yT2k?xnGm3%0c5N4si^Vjrz;#Uv`a$GE z1RB8*U}#|gI6c0OMLz9ihNQ*et_gZR1SN@lC&6sR=I;(Rkra2$XG>PE-q}t~A9(oe z`D&#iNfOJl?RFakp;JeXP0AdBax}>tI&wIZ&ZSZ*k|e9uD#voXAapvNFbY%2lxN$; z@yUhK_?>#QySA9rjX`eO1qK-=m{pXuj^AIsx7%$20Epw5C`oFk{d@0x{Bvsj*}Y{^ z2^W1MZg{2-0G5d2@r0CW0gfJ;lPTr0kuGo7OF14zP~Z2`>9ne<_iYsS3n(+03`r52 z?_Qc4&kZGRd1Y&VyYt0gdzEFC(QuH<=Y8K#$jPTZ^-?L9tJP{GN#1|k=mkMOm;3%3 zZ~b1ocQ&-114hp5{QFdP*GDcG5jd=V!MOJdy>^(cFUbCEDPZ`W0B_d%J+Pi+F&ZR= zl#~b%L?o@7!7AegrS2N+(&Exj zJDqnO=cpfj#`i9_wT;e(hsRv3&O+E-ow~faG@s;nMXA?n*=!a7fGBj&E}V?a;b#zyDYNS7~KOtii0b-=zYPjaSr` zVmK+7s$0er2DwtJCC8EsMa!~07z`}SN~Y7@e(R(4<%uW(_>p7}87B-eIdb&`Vc{~} zw6r#;jSryE$Ko)Myr7eYE=!h_%Een1+Ycj7_F?MKpdm%|5M~}xU01O;GIRovlPG@+ z+6LQxW&{M5Wt(w2k@J!(*IPHAB3>?KlLaJL<&WM*Wkzk}hbrh%8HM}Sk@@dY4CpzN zvSe;-G%wzs;Io7WFjRsgFbRt+QE5rQfO31MUtdmx;IC=en8#B#wX^6drRTg7uj7}_SrDW_yY zAsVtm2=x&ZcWKbU`xG6J6qC)=rXHPn?1dIvsNd`R+=(1i1h{q)-T$G0)c^x@wj`CT zQl+H1yFZBVFrYFxSKy4{KzCXuieM0t0I-{s*oO6E2$@1TN1ibyo?{W5L~xR8$Kb#* zkJ1TdzK_W<1CPGW(@u_VF8+ch*;) zKY0Fa!bpXwv=^4*B7`(h?=oSN8ln(D7>3bY)D23}vaUjw6B+=6dK_i8(E};VK?s1R zjltc^ATtSy2jk%yh=nO!AOR@`^f)xz1UsW+E>`$21gfhQD)QOLFZlW+W^|ywm5gj` zY9v#a zJf~8CrR$yzfe09bacBa*?V7aZ0D)rei&0R*0~KrAb`$l`GwQ}1O)ul(s8>JSuc+zq zCmw%dFc{p&vR11Ff?z6@TG`uCyQ62HeP&|zgviOcd=^E~`_+oVeJl&ZY$iJzjfSI9 zI+aRhGAW*W>cElru3Sc8BOO6BNdSxi06>LC;+@9(AATeXk|HzTefz?{MdWi<|K+IL zNecae`ZB&;iI>~e$n{c1k&k#hwzV>iZF`NeVd38UZxRZ)Fn@3~8flt--$v2tbTXL? zjAIgto=7B?HrH=h#!Ip^SDfjM^n5;@%N3$1YSbH|Bw{F9tJlf<*57tJ48vSDyScjZ z&#&E-xzukD7v<8_bz$O`?cdYmOnLi@)}3=aXi5qy6ft_tC30?JJVYT;9&A8$v&o|& z6+qq;%fPHcpos6^u15{r+_$<|-|nq(ILdNdLQ#S+Si5;;+ti<#E!aR@X$}gZ1!L%U zu>xFONyH{hCLXry(+NtPUARZ)zE`d#+w0Gutrm=It#3bi=FF#_eYw8Wy}oyeO*Kh@ zsj}lc9GmX0yyC9#Jag!|=O5m`PhDHatu3F2{Lp9C*LKTg4~h>S*pDDcqtU=|LX;&* zQPOlNjKYR{vFAaGo%1BbH1AyPcGHdRPsHn>%r$+F9af&Fh%K0Zl@l?s=Zu3xOK9DwD2{ty4>(MY|&CT`U06hm9u@GpPx z!+R@@c;@IQlcBn}cJ{?zEtQHt`|dZ${kdRx;UM3*c4wW061lO$g*V^&-o4xQ{ONN$ zci>{~qK$mUQYC^G_MIP39oeZZLrj_1r2w2vB;=jwPG#7V`IA%G#9sOP;@V}u>>ezh z*c=CM_4llR8iQEW8yp7mgK87YG5hA`d%fQM-V57tXpDaAqjxeWp@%5xGbta9d?@g| zVmj^Q(SfFKgWZWC0N6vsw}^;xMCya=kSR|2n>D-Ff+PkGf#butLq#!+oVKKDI=h!j zasZhEs0wO%?cv-I)ZLM98F0W%9UH&PyazN#=ZMex2(=TBTo1NQc6_KqejrO@ADmzp zBa^oJibQYUS%tSQi4vc1HCMneH0y{NkibhpB^MjCkgDOu#dv1Vi*5%}WV@8^U{Ba)4=C~|{d&+7*Z#biu-x3#t$u>ceYA<;yEWbE~jWQ_nIA2wn^ z^!s=OX^01fITdAy5cNTEjVRTr`6cXF1KPLg9~oS4Mc8-=VqWOix5x5TA|6DuW^Cn0 zZOCiJ@#?`=EP_Oi0mOZ|kfIv>ZVgBEcvJ{tmStDTkTu~PfZ~jHkCI!qNFY)NL#sjT z8u2V*OR>8HM3xn>lz4HZ#_cw&@1>T$PhY#6?gyK)In<5hR`=B}Jg{aw$OAI_Wn}i& zo0oPsHa~Ifi+8}b5U68O!b2PkEb%c$M|XX{A4F-yw-UZrK0dS9+lX{G9t1StWC*a2 z!6$sHf-~9V!M@jUH||2o6A+ztwc9w4ikJu?pca!Qy+%Zx0FgI2M}}+`0wx^w$==Gz z!Clx22};Rk5_xs63Wq<`uc=nn2k~uV2dcj&a5_hV4V>3N1eViQ&xE`<#xM!>XTiQr z$_-e2WVDgCuEx&wnP^J}w?w!G>2PsuUI2%2=W1Uf6enO}A?s+PIO0rltlxKIw2dk) zjBsIQmzmiD6_7~?EL8yE5QE>L6XPRy3UzOj7(22#lO(`7K9NtMYR>B|l9_>T<|3yT z;tb$~f$cdE!AruJ5aS-av?BKpB#}A~MQgUQ*=mvAJ5$ zdNru7#^CS#?Y|p(9!1fA-CwVdM*sYeet%z=0T^pTKA=Y!=S1ePGb8y&$H$g-o8SA%d*6_X8D9Ea@A}oT z!|hi1IoNE0Jji8ScnNa7rdE((c`_#wgc^3=>I2(Hv7@6QxY=Hn1a54sWEe)L)44B7 ztyQZqhLxr!OOkRBBR>1mCwDeB2Ax)YWNdD&&^VFGWJr>%*XtBXDvHwSbb>I)M5%ZuSy~N(6&ETrD*x2H4UI`1CaDM+6pt;(2q`LnOc;np#MDm> z6mGrgdjTF5Mizk}h{BRSN;H9nAC;5zwBCWQT)Vjc_%sY4omS)hwd(lTWGtq`ZtS|F zaM1qAdmrq%=EF?j5!?Z-eI9e@eMc`U#ns*N$^P#1y!mlAWNiIlPJH{$pu4;I%nMIv znEdUVAFBKS66J^ScCLGOeF)4w_v@#Q9OVV!$;TeP@blNxTqj3%$4iNjnf62d@ZrOa zdV}RyQ52iaCJ;vxQ>8SM@>@YYT8WrwsPeL$O(EquzuQbE5JbQY^95?O9MPqTd4Xk> zL?VvkX0w@0CTW_k)oQXNz4hk%Kk$sGXWXr~N2_<2BYaLmPh|?3(hSSc9LF^p4GhEL zDEbFq{nP!2XM3gbi2%wr>g3_W42oU&=n9K-3sW+zHFHuvH^=O4tbF{vkJe-0?&+sy zmT#Xzj349DY`1?5wzmN6*{42{&LlI!Y^gxJ>#Ve(-!@|Jb^+40YL`HJ_8OyBFq!7CEPEr>$ zeJQXo{JhJUq_<|(b1H}F6(|NhD=Hj)JfwTs*hqqa4%xeLe;43c)g147aEM@%^UjR1 zYgRGPF!8*0VF@srAx}@5BFTV01>jgX=f$O%qj7|l9HPQXYhMkv%}34fcL*v7aiUrmNvvr$E6X6w1xk72@cd6SsdL3F{T zGOpUB6gb8qpk0SL${-pu9W3y@UOyKB;#}fGr-s{c38D6A+zLDZK{_A;dK3~HZakEI zQ}kjV(L%uNLsS$dJxFPA(>_oH&{T}3-0y!2F7GAN>0c?|a`=QVK{QewLPl!X1x#!U z$}27)J6;lEQps4ErEQ~g#rEOI7w~8c!2>Kw0jd$L9@o?!EiRIfVypz7!_#;JFxgRi zoE3eX9s%~c>$P-*7;gJks|3=s-rR>)X2WsF6l`d%MA>^lW)Jd!%>Ms)0r0cyOY7^; z?|&Mxpj|9TM<@ZpWaPnc5y46*0J)A?aC?1}>&l@f*^S*Y(6yMz5t*ou6>Ma`j)q_e z5wk`0?yYFl0@H^hAcn!Zf{V$>u99fl`Gnw)THr{>(jh!hac@Q^j`dmr)C*vqh=l3! zJSOLt-NYsR&7R#cUCFk6B)T&JHzbAJV+zgy5G2C$x=~Y)Fs1-G34As6(xHyq z$BvWJZ0Te)dFq9i{?5ZsyzufTUpjyIe6JhpH|s@drwUsWdJ+$9$njVxhv6daS}w{5 zq1yzaj%_z|8}sAbm~1jE-)b$GwcCYk7{O%7#DT%t{gRSHDp8E9H2D2GoB_^G;HVW?7oqve)Yp!=T9CjB$Jg&h39!e5Ps2_c;Ba* z$>mT4THRcmn3%*d>>J+2>T)$rBece^LaDqL_uQ=-nX_nxO4mF z#B>UQ(L^GJB1o-X=QvIh#b&c52ts*#>$NxDJ$&$hDRZxXuo&vb?LqzA+<|_7fMMwU zC1w;w$z*bObK{SH{QdQPCtj#*JRw5Ese?BW`bL0SgYHYZJ4GH}RSFb?3K7p?SPz$O zdtd^jLlpUHw|8XmgZYHmLz}P>_FZ0zI5)yXktP64qZ}P9OAN=#N0u*rys~klqk91b z*vV9--OyVGfZ&^$P&cCkBt%GDULT!^RH``DNsqnO?NbB)8HK#j4syvUmco}uo}3dd z->Ub@wNF0x*vW%W?k-n5+O1iU>X?XD(_en!Q!ofhl4M$TXSM2yLaQ`wOS2zt?S-S> zfl}HH{B$P!-~6}f;c)1A?(st>?G{}2%YC?+9S8?#RGH20mlA!%^ZRZA$-h_Lc=F*V z)7f+o1oyFwqNqx>D$DZj*5<$Z__i3fnP5?+ldj4ta#{$Pf$cte`UK0ewQ3b72qlsD zlW%=fEG9)IRq3wt%U6>756P**e_mW}vk*-4AbtcT6bnR-C?~{ezTvy?&Yq8VHvgy5 z;-#_E!tS*%ko6t1RGK?TlY}hGEKd=1qSr8c?0VH%r|PoIgAsTvO+`TZ4bh8w>y6f}?agvx-kxA3)QvnVLlXfy@ z@QRd(5bQDAZwcg;k@HZ~#6utg2;U8bl++Wo(qM`r$pH}m5E}}^(V^}Z=BSYmB#PYj zY-E~c4z(Ngw*B)9m^?Y*SqNgt1Wyt{8ub!j#3DFLr7FoHizeTKi90?KY9rEyQM=9P z`a%x|r&9db_$50lMbr*S9PoS&LK#H3$EWYnQaUgQOiDAUwpf(O^pH)|Bipt|`@B)c zZ;`%1A~P-AnbWpS1n!{3!OqTPf8Zko;#frNPCqpJr!JW4WwX#|5wXeGs-ub%!@M81 z;{$LM!-2*HVIL9uaLPfUFgAMZxPu81go3ybeefQzyO_);pKD%}13wb-IRyVGd7L!% zJQrDu@_uN|nGN331lK+E=z={xUSC^nhVT#}9UyN(o`{%27*h6i-MVvwWJf`mbHpKG zHDEXs1r3ZVff$8^l_*rhAZd(_k7^#UxNG#6(KISsv*h|d=h~{?mOIj~e&LlU3SkI- zzyS~PfXx1H$?Wp$H`ms#J+bg4Pv0$!hm5*v)mS^b0NxepSY1@d6b z4sn0VaHcg329XM-^9GeqDL9Sq>G4OX?&)s^K+Ku5ucw|}CFOtoo6nLQpU)&QobW>rMgZ)+cl9yc4eGqtg#Z}` z90S5&DE(n}-w1#;2=rkLibFqi!B&@x!9ppUm(dN8?Hj1+kcv6NBhSJTJ2bOfp*b~` z1~vg_OLwpqj3NN)L%tjKV0XCThGTk1KsZr>sfnzM0DV;l(8xz22c>AQCqzrIdp^HbmE5`s}hZa8Z*rT5BJo&^ky)C^`zOs$3!Yz1c zW)wl5k&{gktBib@75$NPduhjy`#eiqwnGqvD2nY)8-gLtvH#_pZ$?4l#%Z5yB6 z$2V}cK+vUh62;I&B5{Atm&s(>o!0;B&%e`@7sjofr=4mzeWWAs8xed%1D_qPajrJ# z;R!aCkf5$(iev(2VOL+J^bv&xDX2P(ygN~G9z#8Bs9GDesaQ5GLvb&{#u!>;;(E9( z_#ur>!8)h{%J{_8f(&dAwiD6tE+%fc5G=$Z#l>p;sM}5`VqBQp2=Vv(ori!%Tq#_|u>KbZ@!7-qFBvBO#`qdgeJrQ3ivdZCS@2 zIk&uCYYpp0d&wLOueO5kU+(PfZX_v4RuYLs;=X7to6Uw%IA6%$x_<8`Job>SE-(_3 z9>X|A3!;u%of$jhgh8jfr^pFS*F{le80P*3Jfb$eVyO^!p@ z9Z>!+q#W!v|JTmda%pO}XZ&5y`KR}~IS^@rcb_@u0wu?5nB%lc>>#~2)s@6TLfy)A2?SQe`Tu;buSfRe&HlU7g0c!)Ar zc4LKMqbOxb2%tB)=#(lAQtFP9JZ@1%gx+I_d%8Yu_(7D2BO(fYhDykjOk4c`aVDCf z)IghJOm>liH_&0wfN&i_bR_Ge1s6;CI2OusbnOau^$j6E^Vo3n zNYBs|0vF5`aX;(@t|Q(=GOp_!>&JZ1b9Co`2rc}|%dV}iw#pXlxu6C|XdconFvzQB z63MOY`~aqEL6`Nxd$SbK%58 zWqXgS;jez-)hLP{klBMgAhZ7wnSKA~H+R-Ho|=A=^!hCZ?E+L1z$nle!I}z*oruT` zc8~yjyI5#iRFQV7M02>?Aq;bjG8zC#pdgE)0|ZM07RY16N(&maVT1(utWCl=daMA7 z9dZ$br~#3S0@s3Z)(4LE`zZ_PGLs*rk53Q!BG2VS_WSza8q?0SKMMSvLbP*AAKc*S z7^huIcDfb}1WYoo4Yhb=a0D=iI&KJ+W4;upNL;)_#*DkQFh8cGQWQxwo6W!v3WdV8 zMw2r-5N|ApvslauUaTV-4I;0CoH*#RC}G1O5V&tw*+6Q%+6RlOLf zStMEx)Tke3^m{==J(w(nxd{sk9j_Moa0lTM`p#J7gao?*34(Ey#1fqYPuIsjX~h93 zi!Mh(r`EI&CmHt6+f`oChC@B5idW;7b9nwrh#(8&A!Z@uxOdv`ODy;+a$Zr#irK0q1u zL(QcW04v=x5MoitFW+0Mme)Lzd?z(ITV4GuKKe;^zrS1m3O4xmz&thxJ~4*WC*-qa)J4v?BVi^h5{T9cV2U3n5MB~lSeo97xirJU&MmdmLb3d`hz#*^ zWO0T@!4LpZ6oGIhA-5jx^t?uaKQPXUSrMUVLBZ(|mEX5@zgkV38U}e!T4i2Q@Y2*4 zll*qIKcn^^bDV1({kf-~P9zfDZa0~fCrVSD^|Fy>vV8J`YnzSM_LpD%wWAXYZ@=~K zi!Xh4eqo{4>p6~{PN(BIo|~N5y>`31Q_m@dcTGnG=y5uD{E<_cbY`TgnyTjWdDnAw zRlmJ_?~g~JBGLm(=4j$dT*IXiSW@q>K$>XO^oahgSjcVo6m0N48i+^@ynVp@#V*+*;D0OPY z_{?%wO=hGcfpfHUcx!o62X`dN?e{3(OZ>zDZZy09d+iD~Gxa)_ds^*C7`cs#XV08a z63IA<>h)SWlg2Sz)dnXH92)HgpvTXg5H6N)$$B2k&T5Q*%eO{-cA5e>(y&Z@!Q!^X zWXiRs5j@N%ij$>gqnXWS5d^8#>WZR75qPJvDZ)x%I!Rw-y~qn<6vYa2^Hm_b?(d;) zaIkGco(lpb3F7xk@J5mcTsXXSJ4z>U*qc`!2NoA);Ou}MWt8h_;-y}kfDxOCHr$p*+oe*_^v?DkHI)Xo(iyaHW%7|Do`!gDDlGc{jExOP`j09+?#n&I#8*AdJ4S+;l z`~xa4>)~X7$Md^1;7*)5v_#!KSNHfwRGqFpQ21sgz zXCsIWh(v%AV735m?E&xooRo{F-PW1r#*ig>M!J|!5>cEoz_&0G(R9f+rmTi-4~ka( ziRT|d3c1>5`*vV=uoy-d9x(`nO}K+3GWrpD{5JFmLQDd+5dqK&0~*Hqy_iG!+#DqA zP*~Tcc5Lu$-_;=SYA+rKi-&WETxwsrPYkviqnSx?t^36-wMpR;-)ykY^v$&o4geT&T9mKQoW zIWcG^;W$4rKB#Yoz)yX&Rk5TwO(XQ4>Y5`e#Zj29`KV*066C=3!iI)2;1uHN47ceB zr$)>;5iQxvCy!4(@#HfEjyIbP6h%cv*;>2z*3~YsUb~g^nO^dwkGdqm+SZufr}euO zU)^6^HiwAf1sbmeCHRo%q}Yc5(W*$2yCoiwu9rT+gPM!>cpw((+GHDFKYPA}}apGT_mi^bR?m_{M z!+-zHZ~fs%Tc4bqZ%ts{FdWZJAXFrGTX9wWwJ-jLlu9q|-bi{4j6%(w?t2FhQi1xv zbk{By7C!1(|D?WAF)DM9KD)QIH$5}$`$4bQ6GU-xq6qu6ZxXxuErM}-J;DvdB%kG} zXe;Vju{x8Tu>6^FbyblemSNNBOus+Kh(bK2aRpJKfIx zUk-x6t&cDM+gl%EY3et7cP2`6VR3E`p}%D!?4a_z-$5Z*8+4{ARLSH4lu`2801a>U zbkC;J>_iy(a4_J5IKeO;6M>ywBVt>WqM(%?WB?vxI4A%?EJkM(F+|*saU%jm7tDZh z7y~eb#EIV8X?UpzR?@@K8HNB;rA}tzTWyCocYhtW-n_o?@++^-Oiy>aUDtJ!$u!4O zBYk-5-pvEYPhk_2)xAn>bN#@tIegBD1eAcAsE3NJU06l#E;e~?-9y)NicdxurTe5Q2#aP+4gICo% zM-%L|%)F%=zfMY5$#gfcpMC5R2m&kRN-mc-RP84}d2_E?E|096)yAbgdYm|V?u1kg zJDolh@JSc6{kZDra0Kyf$5?>u0TIA`=g0u<5;jDWg?t`Ckb1o?2t3F0#$fc*kKYpn zCe{Wy4Z$KJ3!qh4$TQoge)6~Knx(-8RWLyX6&JRdoxnlNe`d^--g&- zCVprnHIySUV$KGU2;n$GzX9x&`Z}xk5C@2SAArKFz(CmT8_@>^%SeV$!p-O4qZkz+ zTmcAu#MR_be^)NHKiGjBOX2cxFrET4Y63%<3{8arO**89LiQ8_qC&Xp>73rATnqAA zdWerA%J-a9EMNx6WFj5z(_jF`Jqth-WMCnN6mrJ_Yd{8-2=mpQBZIeWXG4rE4bk9; zN+7-tF2pf-m781(vy)vrjyKZUTiL-i*5SQK<5;lx$gv{BOR2FN^7v(lae{yeNh5G4 z^u2lK<^Y|)Bu)l#)_^!43VoCUAQDU}QL7z(`_E98dcyA>7+wM}663(D<6{msskoJE zP|h(_j<`Bf+hcAWFu-m|y1u zA8}x8o>_@{+Ip+V`F)UaY#k?~G+>gE8IuG#p6YB>04IpuM#Q8jgqsb+zL0B>#1lh5 zMr{o#b5<*3!xvNCCN2+fVQ$dP08x5j8W`zENA)T-WS#o4zz&PhOwJ1{_b9kfcqdHQ`lu)&3Isr^t+fbnLd8v)WK$>1HoW2nd>W%dUFmEiOwr zYXZ(Npo}8MKr@|5;#2?2Z*BMQRoB*NFb&g!3BeHr!w_Jb&Q8Z1R!8Ti#7agEASxOK zLga751Q^p$zy?Ft($G^XL9vht_1B1_*Mj}1bz269vv##pIM@XDn_G)uV?A;S00shv z9SiMqVT0m94*?zub|(_u7BO%&k${A;G||POVe|jT-hT&4cAodW_1q%4XQ%>)o6K>{F=;{sT0&bza-lVj(6`s94> zA7i0-Wy`Wv*S~Vr#q-Bh_X*E==Tuj{pZY$jj$*;y;axSgJ+m-{LVjOg9}FX%%MX6|&H4I0k!qy5K5VLRq8va7+OsS5ZlGsmY-D(7cz9xR`KhwR2=rg+#!cY$ugU*^cwhu@iqey}lam`ABEwV2Fcz2Z|W`xauhF^$*KUho;rG zvcpscda@-N3DdMLNiUDHP)m#nr%o;vF)!#ACQ>*_QDjK$wR#p=R9Ue3~K<8pmD(o_3$x#_brae-$7Y@=RJrBabd#0UP#Q>Ttk zU75Wy8wduk-?Q)Tn{U43nrk=h+8>R@-fc2sSysK#3^MGOpMCxe7u%(lu7^b?8o3Gu zkk;93_e2&kx@LD-Vi?w%7Z2mz+HijC)Xco9w34x?X<4aMN>P+{tDVhc006M(nyZVo zD6&ZQTspS!{M9Q4%~Np`)t!Catt5IFswEY2d@v%celDN8)y2X8FntPBVS|y{4-D-gkd+uGqdLF)xWt z7V)PMXXUb=7Y8P6 zArJ_NqF62z&aD(;P*8LX-jX;O!64XjT{hcOV{}o~ONckvvLMT|eS&elMhqOut7)1M zkInmGIsgT5F9$<%mvYCn5JDsf915Zy1tA=PpM_eXwjYz?hGC$NYgxX~(2znTa-LG>mhM4kO7XTKZ_#F{b2$9)WvwKwN;E0o56hb^Y zkVZ`=Om<*u)qp8g4BMapf)$Ufz!A}ph?o}CtaKDxV{zV%Kp0)cD=&txeyxa*B4Ktv4ROO4NPcr5vAK{p1+>c_kQ>{;1JcCZOwZ)?k))^is6EX zF(X!Urg!_>Cf^I|SQt)09R>6f-S|+HdV?j$n3%^^H*lh?;pGA6*8UxAP7tyg++|l zAU2}6!oDV8fkkIqs731o8;Ss}btt~w#s_S6mA@;BYFgS1IZ>OFuEPzDDh zdzU63oK_H6RIGR&pcvGu1D1E$fU~~tdF}*i;Gy6}J(|+OF)X^0k3p(Bl5|KzI4PDgNl{Si#5ytHL5UijG zZK{$Fy)3zbO1(Eo;eetouWjgIn2unMPHI7=lQ29J+f+~NJ*udiSB?-t2g7(ca_9to zyLf3GGGNb?0c0a2Cjf1aS#X4O-b-vn#U%w@X^?Cp%%>#0t*MR>4ag8$nip3U$>>D4 z*H=21&YVnTBNznZBq0dGucrKqqL|HQUDquYi;F8uWL*jCl_)I-+}g{G!x$-5?zEfr zhi<=pqnDVfsyp`XpDI;fB(XbYr#2v%&PWVKJtpXM2<5zaI*sINC)U>Ij%+({ zfWYxmv2gIfwSE2DA{cY$Ew>8)7{pAaQnI3GjmC?Yr+-LB4w}*fcEio(R=C_egkLh< zo27OSZCQrLOT}%u%}#(w2(%f`Pw8mAQKftcMnk%zg6Nbt>G}(2%vY}J17Yiyt!&ukBQmn(!W?5UawP28-PEq9ZD@(Vmp58vtFXqSJ^w<|F z>;Fco!kseKx9z4w2b;~NWmy~G>zL-n#pSn)h0LCVSl0}~#NqWdO)?(5{koaCS=VtV zCMGmp6PvAL=gxF&MPNAKIM-c&UA0=(4FI)3O1~o-iEOBw8){jz)dCQB`jyvz$;9H6 z^nh6;dNNBmA6BK2P|RRL+vB-Jnq6yMEUzORns%_R*a3U`_K1zzvEy%y3=dN@Q>)d| z=`?~M#bPlMiR|9Hud&)bfB7{xmnm_9Pv|g_udOb=u)iy-xt%BQf%0@=*63Cn=Xc@6 ztsnYuIvTYdr(CY&^7#bM{&0E@5c=m^%T7LX8jEdNK7XUD{~~}QwVB=NNC#nFdhLYN zsFdoBA1_|&+qa92^MhUsp@JtGNBQ}4NZpXsT$Jb1!Rlg54Qb(_1h*|BD8PjQSw+=B zJwI+o%e5tt%P@julJPg@R?Kc!uyn#;3Dx5r(=}Q=@PsHl<#aH^&URJL zpnTUOe8>sXFZXy3l(#Nl_8H*QY*vTEnl>L&@)ni%$ki~}Yhxi4qAC6;i6@&@Qtn`y z3|z!@-5?)QLi-20__e8VG`-_0-Dq~EJ!O~4@T!C}EhHS#aolQGW(s2`J&UKfDMFe&{8%Z2SA~C7jCs!xhixCOw zI-{y#0<{a{{^pzZR5|2ls^VDGQf?@N;^sQq+Ap1* zU#^rw4!z8UWE>S>&T>eI&wqPwtE*#vvy}C=$9nQTJvfF{oAs3wFV%wzw5ELI;YZ#hv-j*hGW(aJnJ*r_y0Efu z(+#JsnGqA=QPxBW*AWFRQ!q50|O@|3}`DQyxl9XWi1F79_7TXKe#eLhh z?AX0$-?pBml@liySK@F)U;;Vk8Lp9(NII3$%)EGS2Vqi7UwiFz{mdtdzB z7!c;KTqXJ;$AoPsh6RHH16+HtU763~V|zk_GZ&ADjyAq|vnYzDWu=nIch#4F915A- zwR2}}Wv=TxRGh$_-XC&!yt7hk>No7aZQt%)KJZJGN-P|D>+*%in+RvvcOcHGp25pi z@gv1$8bp7b+bPbUyC0VvG#X7L367yq)N#FdJl5%UWl0K!!@WJZTsW^c_1^*mO@jo?nHLqb4%asqHo{IX0!#Yy09Mqc=xmJe2HNcR@|7g)zS30n=`!4xY-QEAyt#%0W@{9h77UD!>t8mM?V9*&4j4 zijQh%_s1b}XmSdRTx{2G_BvZB=TyVK_s+X?P1Q7Q1IwzldZ*L+yH^i~cJ1!BZOQ|x zg|O=@6ld?)zVq~{)4jdD(P&hWr1fU&SXNwGIpZOXKysgUc9W28Msn3+cTYm7cuoc-B$#Au*2ttNzh*Q=Sm;N5Qx_d3 zwu4XiT$#T3`b$sWe)}B=f-WzwM57Uo<67GIRReYZ1>Kkc_$yTv!?!8h+wHo5|7lH7mIwaw^oHT3^1|YfHi5 zqKjgTrn@kU`oXwRTCG1X)`x~L8pcZ=7QiF6E%rba(tBsVs}iNcBbqe$ zijqN$@;kO9nVzRNa_$_VSTtHGR-QliiU$B^21s3rD>~^AK1`(| zxSt%JwP4#ZX_aC$$#fyoM?EI+Mn9>VGQ79|9M}nmMnxiFSo0wtM#D)z?F7V_MF&8n z4~I`P4YY-abQm>Q&v!i638mtxuq~;~95i^s-8PQ&%mvS48 zzIq9cmO0k{p5+pLO99;6$UZ1-wZy^__O zT(cas&{T9jq%C6bY6%HQXfy;R6aG2`Ra<^HB0>=!JwoEJ6GC9I;Z}#*^){qkfP!5^ zzpcG0sP$Z%ZfGppRuH9R`^IoS4d1Z;ZAdxgTM)v{0Nb=R-ZypI2y zjk^XF$7nVg4YYspti60S6;Iw;z34)Sfcj!IeLplmuFiNk@zUGxT$){>d}fwFyrt4d-s_t2p1ntA z|00>KzIFNV`4{f(8J|MDpzY>-LU5WIViJzVpmvj?7}wQdmo|OKG+@u-EMMt|F3J_6 zx`?rKz3l;%k^)-*!YA|^C3G9{n{IljB%aU_cl-J93nGamO;#p2>D)=<24j>)*4yX zMmTC-LSbJXLV^fE`Z4O!+wSgmI-0I$G8x0rJ7O2|y{DRnK>*6`?6i1Bh-gd{C1Hl` zyRvw>*j~ydQxwVV+e|F~Rt8l{$;(W^Ybqx0iqK5O9C@U@&jzj_>Mv>N=z-nM2 z-e@%e2kCl5yAWVAE1Y4;E1kIlxN-ron}KV>THD77f+9C-?R{Q-CLh7fcb{<`qgQ9wQ%U*UdwSbv7O51Jl8E0 zi>Xv<*W`A!q%JR=>?F#5g>kizPZ4aOpJlK!&aC8!KC%1Qa(nvd%LBs$1VL~d-)uHF zDlxm=u3?zvYVj|ZYkDm6{<$|Zi6orqX>h@Jx;ES>e@I{IGO%7-*dE~dWXg9noF`jo zOmSQrfiJr#uhufS=aWvO)iFI@)kQ=#SU3<235cg5Y9SKurFimGy`1P&bSCOyy5v?h zgS0d{Wve>F5+t4?3DYa=M2!d+7KZj!0_nqs6mEzQBL2CS_Wnmc5v(-Bjk*>*lDb93U6ua&Y6oRxKtDkcP$(Sc`M_W#cm4J~ncd@; zPG01q$scDQC@+|gSj!2{Wn`5>xw{^`PgT@HrW3ira-lH@V7<#daT$u_W89md-+wWY%nM)Ic z#r4twHmBFlOL(zqbFf1-Y}IxBnokj3o5!8a*X_u^g6t%PZEY{38JEJ2 zMn?9FxX%L>4+sDn^n=s91~+DNT_09N)FXTsVFFlaQ|NN3v(|KH%H>SQ3I)ep_^{hG zm^u{*r@p?2EX`cNR_kcIKW}ySH`hbpasn;)`c25BGDu`Lgi3xA^@uEsTymANDhJKT ziX(><6LH9}sJosu-boNN5uV5*daX|Rr)j>8@>v`10~sZV*J(G`=_tYcQ8EmfG>&k` z9bHiaC8#gtx3lid{$`tV)+^SMA$AG1q}eiy5j$=@wB9%PeGu0nRK$al7GhrnQA-gs zx^i8$?1}Ot*9}kX*$)qlLkqR_t7}bnwT_og$wXYY~O|Cr1!oh;9ud+qL#Th90h4tb-x;?Th+6bw7X0*6!nFbca0>;!C! zwR8w^Y|jaXnTxC{&7MoL%&Ja!j^^=rpFt(vuIWiA(lSE4Jhuwzkc-(V1h_;FB`cd< zP+)1?@>IxbxjJUUsPC=Nc-ml+5<;-t#Q3nWuGf6~x%Ttp>XmKwsTyq=xTv8z#xRa# zd#XeSAdM58wT6IL0oGsCi7xDCp`H*8ijvqb#G;94BoehOt6Zt1l1WL|p1!&W!wg4= zeO|g3WfcP82uyiWknNeTO0U25isQRGwrmYhY;Gb^T0fIoS@i>{BjGr1y0~q)o-LBfs{sOfp@mR1Cuy+q8-C$*V`s^^JrKP_Q~SY~niV1~7ifx7%%dKRc|k z;MK!NI*sD!$Z$9uv2D9jsYIhumSvxN>&+iLclzL#ofq3B_rl2ryOd=k6dSE+R%_P0 z)L4wr#9J@D@YAV<=GgWJ$`>=Kp2Kirw6!={TbRRx%c|59B^)+UY;@^vW5>a3gZ+_m zxw=}e`qH26`03X|`QxEd9f04quA+%6UJ zbl`#whBYU!`A~%j1lTYh>w87hp_Va^QJ5m$6u@8{@JtL4s;;&bli^XOEL)NS^#x+l zM8-pT+4XvWRp;ClqbVA}0mN>Q(<#-c`GWzU6apwivWSq11`>QKFCygSu3XW)hvb#Z z^D75#x|a`fqA2EaIaO6#tyVgfA}LC2G-t0|>>C*&oodLiDN(L;8wakrCKih=EiEak z(%0Ab;_)MVoa8yq!MJ9tF2LwLx82qKe_~lQ9)~^fe?9Tc{O~BMH+K4Beqi)f(@Gm| zJe>$=)fmQgO$GN=HW0uJz1gh~MTd%wDVS@+9Y4Va6sWz{TR)oB|gm4%M>?SVx z!w|J@cfvsd!?2B^s~u77ALu(-s-0P#J?J93ZgVC=IV5mR#IuBqVsuZTrioh~FhiCN zNDpFQb0*zh@9PcX;num+aMBr-Y#Rs*f~!&XJ~34j;s}Pve3m4#Pyk)EYMBnv1(8KE zeHCYT4@srMqBdoi3w?5lQ=A?vilJ*~iL-czV4N&FDj!>V&0bvQ`T1V2+^0xBfwcn^ zMD}uy8ME;KV_pfCN2*;M>C8fwY+4bc(y+U%>cNi7iUjbWzNR^xOa({oEBc8mY_JOW z&1M;3mr$oyf(Jx|ra)rBqXpdqPFFCYV?I`JEMNvRT7E>WA(kby;;Jg~opnbCp6hIy z7!BWa=qnCiRihAxUiKYeppHxCJ1e3?S+L>gK5A1Iq$@n_qtuq6ROg)&;^7yfnalxk zDx($<3`aub`OLN?T*Pem1T^S(9m3@>(Y$_);+gelZpkOeEG;%K638|@46Or8dFzi-~Z^N@6FA8&)y@mf1b=dAA+H` z|LXhGb@|>c4_!4&VbkaXq=*r;X9RKlG@AvcoppU3rBs9=eN0Dqh2$}pJco8`Aqd)0vPgxj^L|(POuV!e2{En0nvC;iu&<}5&kN%}Ju__y!!?2qSQhC5)YeJcLVUlfDsoNg!w@0CUxEok z*Atp<`#!Ddy`!7j!RXvul_0l6fPykmVbrED=$7_XDxCi1@b(E49xF`W^0AL^-8^2d zR1gG7CX=cxoxXBq!R15o!5|D|>yo0YRoTIPEJT2|yS%KGheD(I(dhKjVxe5=&t)V@ z7J>rHvX{@F`J?BKPWEqJ(Ms=}Ja*r~Jt%@rwU%OBiuSw5)ox)8ak{nta_REi*ue+e zi<2z;c4821t$fg|p0Y3`(W9xIdb5HeRuprJPE7CWyK;jo`Pg$u-k4js{8Fp-gC~E0 z)}>o+y?JeYjpqX#%OW_mcVc(B&^cW^Y!Q~zjd})~31-6S9)T0P?wdIe5|!~&Q>UXb zdZ2$$QI$rckv2E!1MfDt&3Ic=}wszyaX zkj5-$bA2dR4!c#kN{hHd2sBO72o8~`?V>Q|&bby_YD{|6bBnW^hetS;izniWqO@AA zbUF>gaH&)p>K|Zm^3;pZFiA#$$x~-8-FE-IW22*<=N&(OeDl~QSyJcbn+Fcv1bZFd zl;+OO+;PY4kmqmY0&ZY*JQ1e}>aYLmt4kP?B!UzATz}8RDU1nr)qO)fR;Lz);g0G1 z76Q9I1UpPf5F+s9tMd#k#Cw=EW2w>RqTwMM^VVyp(?U>@VlTaNZf*7Qp@X{&-Iio2 zm&<9IRwxt_iA1$hdi%(cn|e@&2UsAYbyO@ExbwE#tJP{e9;Ye#$Q!Ty(Jx=MwjI2& zyO7NGT=j)JY~4c;Io$heAO951@zYb6UDwVIPMTU1v9dagUnpN;=-|cKwe33dg-?Hq z<2kY2*}HpZBpjcgUnpF@^s)PIg<%XJ(5_88;F>KV6-B8BOu*2{M0sXMX!q4-A<~oV z&E@~Al$go*zCUyRxK*DEj3Qk-0=v_MB*ZA}Urn@xl zRHM^9mLY_CjG(rt)Oa^(`Rlf#GN$V)q~iewCdMa19WOeC^mRej0`P7_oeBhSMCUy_ z?obM8loz*9K0$EJ|FZ+%8_+|p=2nfx)@biNyO0wGUXJDYydz+kc$eI-VAblHlGg$ zg9Jg8%jIxT_{E#gW|287k~F%JUX*5d93}*dA{w6Kx)$vz=@55hVNohCyQ=c^+ehA6 zUKqAnjL!HN$@q>9VTkAIG~GZkRP9R5cHJRIISPW&XuB$N=v$fS1kAu zx9)%F;RpL85q)mu?A)aUk%0Y1BpQJ6oO;up@pj=uO6iTBZL=-yvq2wiPqSWvbOefzWkY$Bv@W|B2@K7`dkdY?TImc+3VnTj7v4T{xX~*2_rHJT z2s*IY3ndE>{#w`Qk<{Ioyk;9@t9)IS3T6AkJPt*3XXGv_*70EELQ}gHR#BYCa1KMg zy5Z5T65weZWpuX$DeaIuLv zB+Ir9={`y!6u|(JjVeMuz(+ztREV~#((3fg z&b_;K?%XBIvSAplR*PZTa47WZ+b`&fxOZaL)l;YY2ZpzdPgJYbd_KPsbdJSh6oG&J z@gIK|3;CJUwTo9W1H)cs;Br&BCPdXOwa+s=fwyEa3cD&s1n8(hb4}g!SdR&)J_ObH z{;Ify*-XNXvcaI%IfD?{c;W`5P+u(1^be*o>71&n8!N|gtkab#QPORP&Zc##cI?v3 zhu-(FEXmPml%nY3(&Fzu_xew@__dI(D9_6?2=%(y0{5 z5Hu5XJFc3;FI5yCi^10Bl#Lf#OIvQ(2YXPv)6VDfx~6NowzRO+D9_R`YFbvN1Jfqr z_%IvE1cpc3t>}qhwq&mEE0#6;qUjd`hF42jXJe>YY?)W5sb~VA;_enyXRQu_P1-Ub znK-Oh1!I%!B{1i8%IR$&qOD(X=XaEU%*y3~@rN7;t(b@p3Y3ZZ8YVC!pfA5byf&n{ zy0pvPG<;sZ=*(5o2&P7q24#A2HgQK9@wwobCxmK$R z4s-z_u%=6N6~4XPwM5{$qZ2*kt#|&t3Ql@70l6|{7%tJaEl8Ul>Nqa&biV^U)nLOS z5l*MVP^q~1gYWX;6IZdlDBCsiYD*4<#hcP(62_xYAp=IxsqL|JFW# ztwYffsqScA+krd*D0BFXR{`*z zy+>yMBAFfe$y>99+1q#AN_I;fe|{OYlTeoTDTrW#u#S`to&;cQ zX;XTsc62jg%)q=^lOfo%84rRT0$?(ngjGb1KyGW@t?3>SusAwlCwwwcqF2Wi3iC=W zS7PO4*LT+#9Px>9S*JxLNC$noYE_CiV*L@mX!IqJ9k-rJY!O$g80|V?-fMOM9(EWK zs0!AqWy0nPk~Z9BJbXdZlkV>$lB**D_&@(P>{Su0K7xar7*X)2x-vTPpq4G7f~ zz1{9^M=>oBHA3B!oj2D{o-xffZWe4`b{Nk0^;@coyPd*YBZuZAle^2W$CAkpe)tht zl6>D!BoggT2lAYszx3LSf(`O1;4^TC;gAsw@hi$@#ak!*Uql|I!-XN$A**!40h*? z)}!MCiS#4@_{gS_YQ5%rekzrcCCRd^J-c>pj!YCA;_3Qxq{~3flw^Aewl|eXmEpyr zyPAfhtCz~ zk;oMjL;&gqqbC$=rzz#)NeJK^joOHh0S6}t$?_23;sAjWt%=C>t{bp02$pdRiO^Ui z6o3&#b1S~8hz*6SxuoVekJ8-{y(j=pp3 z($wY2kxgUcTRWZBMlN8bQi()kEW{G%(UU)q_7&db`~ojX{bD;A2$MEv;KbDea4rdsazwUXc5(uJCh zDm{=Sa4eBXT9#F>)noBkNQl06_LmAQ6NVSixTwinFz!MOJv7!aD_y0dyPd6d*zvk5 zQpbhm)7yJz2sgrZ+>(MgCd|3x-EJFq4XP%f0i0}yVCGDazqJ8H1LTXCldr3o(TTO^ zdX%nj2zeHRh=OIRCJt1`iCT081ZjM4NT}AyIZBawyXe_5P@h||Et3nNVH0Ul5d!Y_ zF&#jRVk80vXD%xW^?`G#qds)!kxHQ(knBdlxNLUEl2hF6e)%>jAXQULT`Eo@u6FqrLqX!{PY*+d}RGkM$5x)@IRCB~9rEJQkTec+nEaib3{ zp{wJYpHcjAb$C0MIPD@GltgG`n99UBcgfMomVBcP&Ie$?z;Gmm6KI->ERuZz-*bS7 zFjXNQ3x#Qqlu{uu826iqlAK%o(8CYEM`rKYdt~-6klE|coIH2#^c~|j;v{2X;gYqC zd2ARCL$Cz{*MpHdiu;xxhfo=ISl5I|)CR!g%oF0-orHV^4l5-QKt7DQK_Eq~ZUD^4 zFpYYcm9X8#CIA661aXd-GlT8WGUsEsv)OTH8?HtgjEWa1SLMt^P^BUSv1RAB_ChU4 zMvi74{YLcOQ^o;N>-Q|3q-`|HS&HeKnjhTcLKIn_-O4Geupqa5L{xTIxrJo93p>Ag z&mGZttWYTMJRb}SVn@_Ebq{Kkjj)5zS~%1TC3(ccO|R>mdH^8+0RR9=L_t(5B) z-!GSkM|y3fm zvUjl0Q>=3JmPbBe8%i>n@;pyf)k6mkuq?m2G=FS<^=deA?b@kKBJ#2e?vodWBF?$0 zv~_srEr)J7vNSupKKlW8z7IuKVv(v4UL|5vBK~O@JF(d*Us$^dDXC+Fj4<@<@fj4w z2GS8O7*JKUR<9u_9OMI+rZ1@L&B31C)y^>!UDWi^s2m7KqS0g&_8KeF^nh@{loD4I z^!f2k2d572r#!!Z%nYYqm*v&A@sLywk=}|dj(IIM)kgvu76LUYZYjQjfp2NfsHj{Y zq#TOG5Xf;H14b|e1BR}8Is^gKgWJB7rhJR;*oqr)hC7H0p$-JG0vE7xxKL>gRSGSn z7DI%&<(gT15~f zkw`R~O-Yfn*{q@{vMhJn?LYtCcYgHRJMC8Y{=062U}Svrrg%6!Ix%S)dMcIL2x7)! zQHEjaYb)P4H+7OsK3ZPf%g2rJ;dewN>&mG}+|V4zcX0a0V6(o2IwI~=> zTWU=)CnKzFT|&!iK@?Uzy`^9B6%fICMM0;X77`xEMP_!n4m>fRO-PbVQdBS)s8*|k zeSMj$xRM zY3MA+X0urV(tr5EE5rM?7CTMG13XJQo+ku@49jY=bo%Ptx2`Pp_3SM{Bb`7ngPGAt zI2;aRDE{`*xBG`O^Xsb!L>L%8A-T3qQhkx((P7gx8;wRh5yw!>w#*+MdmDx@!o{)@ zOGDW<&Yq-$hwaGz0CoYZ!*V+jk*Xemg0`xHOc8LNWDJAN z1UuaZ=OSKJ8HA@ghPAAM2u2{WCNvbVc?RuH$EXnz3M!tKjy)ar<4vOnm>sV%Dz#Lt z6VPiF{|ar$37s8F^>rh7*KrNVlo287M>LFTpnU>h046GMbKP#UT}{y{9d~i3a%rb& z8cqu{yRu3rt2Ib%Te^>WU~=~^;;#Guv<+8`t_L9sjN2XsnO4X|43HoUGh{)vNZcSp zxWLA6xcvS9;%ZVltiNyNOqaB28mc6QkLHI5jCIBI)@z#-t{st3&)s%k_1q`-4w((7ai;0O$a;^A-}@k#RH=?}g~X7Aa1 zWcDwT*^i%nwKhAmh3=>FNyOku4{uvnSvbf57)9L$GKhG1#%}r$g!z_6;5rsiVZs!` zC*k>nKrC_s9;?MYq0r+t#c z8#8-xX&Dc<*A*Bs$NZoNlf$_7(T{y>1Iq+Ks8lLAL8>hY0q`nME*AnRylxqyK&0EQgjS5Qnf zRj%DQL8h)s>qz?|^*iTY8UNU4M@A=r@1;_yPN!p9 z_M5N1aJsMrwr+!Uja8O<+zN?sT_3JjRt896%is>0ZqLmw@cTAx#!v5!206d zVRr#UuDj;oPhLK=I$hg3k;~Enaba;yzglPMQ(R_A4~I&H7CO36CvP;T&K$btyyk8; zMV;>c{xdI!T`$bh49mRn{OgBbIdNfb>g2J*C20kx=!w{Nkv7`UX+;4@C+HCYjAsRb zUlw0>fI_nUae3}zWC!i(LBgT4HoPD?o4fNpINnxVw%Z8|?T>IQM)O|0cUF~jQCsI? zW}|!;rr9{9V|qQmgagcqex)TXV#Hpv4b9D->>137 z?JkC)u~@9tYMG{)Nv93NXfzs;NF<&}wClBYr>&J&ui1al_1$D58ID9-&1Nc<+8Evt zjYcV&ZZv9-zjove20DbDzsp*Sjcq-TM!LnqO~bJ@%}rU-y3_8oYzm ziJ^q(fs;p1B$-S=Mz@TNxn6al)9UxIYx>fw?82OAZ`SvKpis9KRa%Dlf!6H$FJF0) zCB58?ZVraM9J#qZR=MK;0AoIiSLNmW@%EUiy78(GeCk|~L z9wKRGV>%~AQISYQmF4pnFD(~K2w`aejJ~`HQLTt;4Vpp4YjFL^WGY>)RO0dYMy7$K8^1XD zj!I+_I-&XCrO?DHLG~DDR=QVjmRyIwEE#o3%LFyZq%;2|yMIxuG36P&ZFh>t5Z~~^ zDG6-Rp)BG-!`P31uKzwWvb%1W;>N69I&IIA$Vqm2N~O-JzQt{&nFeiM59)u zLK(wOpkd3D?74o?)2kxF;$~zhm@WHU5%Z!}VN&fbQ@U;Aq(e>^#0+K9PB{#fEFd=_ zt6!yEiz{1*qw$U9;KM)>I6a4Z^n?1mEw5G7N#xF&1V=Xow5NuXe@2nNuHp zwmIR!FAmYZ~xpauIp};-2ICW z-MDOHk*@3h>VLZN)%SfEhCR>Q@ag;hfA?+t6A$mMVdMID&u)DECqDnhb-qVt|NHaI zp7~i}W?^e+GsP1CMuHyg*t%()PkKR}j_4l77)=a~0E946R78vhia0hALFr4;wcVt7 zgpD^A=TS|Jn|4I@bsuVzuxfWL*!6r&jP+RU1`1eh(% zLZ}7ER1wTKE#R6i8N|rIZl#!DsN+L7qa=OT<<|!v`q1$1{lIZk>6EIe0EQ30@@iw| zD0b*tSMMYcb<9?6x?P9SMn@j(yi=p9hml)$Wp89dXtR3JAUlY!z=n~tkTBcZLQX?w z1MzzI;7(zAI*<%bPE24Jw!Xd|4u?68Gj;v=TZfM@p#&MfLzU0;jvXsC|4j%wwp>1V z>zy=;K7HpK6v+`hcBKvXN60$=bH_jp+W(Y z=7ns8D23qpL$KuLHc^?rmyyV83KD78u5%32QL)m(=DwtZ8@_`EquE7-ZK@58M3tuY zao)j#Vc&%{L!~JgGA$gq5KY;hWjIFAwqSw=FrpedfnhX_09eIw*F^%l%X+@*HpDQS zTf>uUq?g2js$+53HeuK`T!3^Pcc#+Ox^j=Lvj7G#1{ff4jD1`^mh@vhI&tE}OSxR6 zx3|AmtLeI)&1Mb5sMTtzR0_xOLZNVI|A8dS;0U~H@7{1YEOt80W^*Iuzgn%vVlj%M zn$5<=qsN~#AS^t($Mo{Uqi2}Dqie-S6HL(!!p-T355lp8V|OS37Yz>uR@+8#glBQ} zxz~?=@S%@fdtg_y+gV>~^bPLFCc+U6v$#kwl0OSp&CWFJZW<=}8KNF*uW{UXqstW5 z)&c>jx3@PK40bvlQ564cPufZ)fWUuxVQtFBep@;X_e`7%W+qyz7{jav2kzRjgAD{2 zhA9?{BuPdhkxr*`{`}der=~DRN%r=}@y?nd=6xhh*ghK&gkZT;dhz6`3p5c5;z>x| zjH_m+de?mqP$X3-7Gv?ashYNwS_X9;8aq~A$Pe~J!%>nVi^U?#vhhUx z__?#|uGptzYd|~?E=RONpE=#zJ>9F~Y+}=stQl$1qq1WP{4)`hGnd2Wo7>FGt9sKg zU?Y_y95-egg5{uy5c88_K&Ww4+8NFuy7JeYYf^ziQSf6@MD$m4(B8vtNqRsY;A8{D&T&Hs2u{?%(Xy#4AC z_#f@vSMjd>cd_hOJ-qw*pF8raPy83L^*u8C-%e)7e*DWT%WGrN3CIURChge<4FWJ% zKY_U{=)oYL1cm~6wC4cWhY-wiea>}l6AMsEEFrz-sCIXiZ7Deu1Sm+1z^ex2ssJ`2 z-;q@a_e{bSb)L__t`paNl>r9b%^ARR#jeFBWv@vov}Xx6kr3(8Eh8w0LW}iTM7?O9 z8nfp5#p6-&lmtXK7}6=iZD6r7KlcL(b>( z1VJ=gtxB=*Qwcg26vi6Ud@_Gj_udceTC1Agylp6x{Ij3^Vs`BMLy1l03n#>G=g6t4 zl#m)9*}8i8$D4Z?-BO1QEg$YF_4M_TZQ7O~DkvBrH@drKx`VmISAO!6AIwaJ#9=HP zVYAsnA+&Yu&O7czapoO%mxbA{bu4LceG=-A45h zX&u3-)mCv=B%Ii`M<7uq&K)z6rXnTiz@iE7bJ{);G##6U5rEh%Oh5!lQw#)P1OdR+ zER3dcT6Z7{^&Hq|@qkT-DGWjg#gh%k<4n`AAhIvOMIv~N05PZ`kTmIN@d%H|Rh;(9 zZ{+MzH08-xqJTnj!;s|WG{AWw@~;h8)4Tk zjv@dJSXEV_U;qMaOD=P0z%o_W(VsrGaQ&9?$?;7~OUuJULlc`v55Ig0)Ag~v`&7$0 zZIEka6GG-xq{)DE7|IePS^~CB(m`T)cHt^wm&2i`?YhZC!nW;Vsg#aJe)j6Ce_gNr zkvUIfqjSm0{%-Yyu(}q`?wj0}Oe86aDwRqbYFWKrHx1*Bqp$NjC!@fHA+AF809)Ix zmlm2GI-2~G$N&21(RaG}n2}+5z&H?k2#o;Kjbu``WpOOaGR&ECXFF2EP6p+wOpx%F zRwZsTvtr|>dvD#CUchl&Fc_3O;!?3RQ(MS81Y&xOd^#mf)9q@fu`<9gT&kyOtRQN6 z(1=ldXoZ$0yRX2|#Wc3u#RH8t0>v^Z!{gnOf{{8NOPFaEBiEzA0QiW^s~omw!+j!} z=z@R_On|^JoZ8mkm1;$;Mf$!1VJ!gST_dJghFqtaF*+2T=N&znzgn49SL?0?(wrq> zzToLBOcZI5bh#D?rvd86OOVrU`*^53y|v4qBlXFS*!0{cqSkzJ*v#e=DambXpcQue z>y(|aJ7KST9M{Vb7VzkhWf(w{-R_j{SB-eKZ3e{YfHbX{x@)=PlRf<({I&1dq33N( zbr8eX4BOl+&dVrgx;|@)bu!%Lq85&1Gx74f&fimWjz22}v;&Bk>k2 zpYjJ34GL(=-cBjMT-dp9vN*6AUoC9$B>+1MhGle=R0IW4L@JUvGuVhDr=3MrcO^ks zry_Ys7b#jKBBZi?Sb`4)V z4Hk`lk!V5DqGnq^V$8i9_g$oznc;gM*w$thK+S=Oj#es|R#ujmm*?i@JkKkYN*69%SX*0LUS2K~ z3Yko%)oMNS%rlZC<@5P>o&0}_%+UWcmf-^cd|+xQ3?p`>S``wxFiz`)(;)8CTtjp0 zGz|NYL)*HKAVCYqFwcWv4n}G&*jXNDg3dkcu~T6gPkJE)ZiLa6j%N#or1^$!8>;6x zh-Uz(+m;iRxF7L!la`$p1<`hw_U%>H-O~bu0g2d{hnTACtj(X_DxmZA$feQ&AKchU4*gr_=F0 z7p0i#vp>xZZ)V5S#ihcClQdkvso7az4kIu`n$6zSDLHqc+ZaI>cWPH4)4b!0e;wn) zeCmb8r=NX`Ba^97PDTuG`mLI@1##niPUd0Q(BclP(md+pPRm9yci3!hx91je2d0F? z!-aQpVQR|*k46|;2!#yOICJXMw~oFw%$u=$Z+p7d8CkoK9qeE9Y6=uJK$OLBw~zjL ztA{MWJ9Pvlk=bH5fQ>)UlRk<)*X^t{G22v0%;x#vBo;2e-Z?v19Uo2YpI*6e^!PI$ z|MW+b$%NKwe(TMnPsGL^EtImc)Qb?EtFPIr;R>-^uHFCbCw_7ciwx2Nr^$12V1E6= zt=s!s7h3X+9s!A^6*ZcT*IPb4I11U|pfGSXQbyLnI^`6bYopQd*MI(4r|t}fLNSK0 zrNXF53`5tSHK!UAxD{(ZBuW-ze`8Axr(iSnz z-=Qp;HaacqyEF*fy}MOlWG0=J0n+bX+UtDBnO#m=PeOP1(BR(mn>6whfc8 zYx`GJJdb+_?kb+mICubcAsDjsF0hn@5V>sDO<6|tQX2sE~FvW`Fgt*w$d#S!&x&C!dNJETwimc8DHFW>_Q_-%%?NyOe+1WSQZQh z6-99!hhrGSFgl%XKA*EJYojd%K@jC?m4U!3wf4%jH(%QR*f^pjKoV2M;L0mqE9NE$y@&d6eReRH)OPUdiKJfEnC(h13cHN%60X|r()dGT0 zEtkKxE)8>Z#tUA`?!G9g52(-?+1G+#xW5lZkaD?95JWf}-e{kj&SX3v70LCb}>vh=mSdI$@gVkDJ8# zhw}MLo*K3ppR!E|=vZuTvy144By1n4j&Rcu89ufUcBAY9Gx>zmT zv~Sxpt5s{=tQ&X^w;FH(0DwA18*?254VJTsn4ovTbW=*;w|fwd|H{+iqFQ_VTiAZ*J1z5lxFbF6!Q z-{<=vC|PutWK-Nsxy816q?|i)hjFsltvSktG27LcCKHvnc6#Eg2z{|9l1`M>5*>bl z+>qH*R?6b-oEL_DHm>x_lPlnMZ~bZ0hf!i+@r_vcpPkQ}7yb&a8}SZNEIjdCoZj`z}<>Ui&4L**PS!g;vh4k9*BHwzxS%`uNp?0wIo(CIe zM3BX13nU_PJ@=wU$b2sD^T57*B=)UZs@zc< zQ+NW0Hs0{I6M{ZHImr<14BYexIO5Fn+6jU;A}D33)Tr`%C?a>$2iA{}Ax8{E7k31X$4eP`rpPtZ0g(Zn_zTn^BeFNJ-FVaS!vRRFve-o#hK`x|JSYfXhd}yzlYb?05&^nRrlZY4vd-J2=%o z80*qTOA-VlD(Y?Q4nIl+#;K{$ZQ^75XoBSzsbHOclXDv50@(uj!`5(>8`O!~wg{hR z5-*dpu^w$aa*!Q3Y`vQnM^?K63xX>9D?>1$&|p zJvmqp7~};V4CM-vUCaOx3RKD#PMZJ&McFb`7s9;cG)2(bd`k&c9DVU~y0AMln#pXZ$_>u33R;a~O&mufLFMY`&XT50HGq+FsZs@=qA;<)M{2z&9M zj8Q+=oHiLNgNk;s-kvP8+J8$ZrjR6JRl}^u++OujTbrYI_3vjRW!enspViy0ZIB&u z>+i#=mHcMAdUdMl5zhL)pifF_x;1GO2z~=0ym1>}n%f^0OKhLxYPXx6NO#Jlj?GZN z|7`ckEFQP~blP7!C5#X@`&Z{7DyERSatD>z3}91)Q^<*lU*=abA)&~Y1%m@iC=k1! z1~b4WG}!CsD?2ZV^<<~)qS&>eK7i5x*LeF^L!SzT7+^vYRO70h^ z`5CBHn=0d!gGQtCJKDw|={tvO`5|MjGJWu%^LhX4_;`=sgI|ffIszPTv;^tM={dv` zNS#2lb}~^%Ld=HUdd(NPw(z4-E_jLO)mdL4VXQ*seHb!|7cd^UYe!2<+GyC7MvnaOESW{$N^~K4KLmH0c`qs zKk4&3x9B-s?K^Qvf67|(*=O++o}*;F@AhjIc^idUl(&QBG~G^Dn!NqySA#O3Qu4z| z*u&CtQR>TPpIso|x2i(eBdak%rye| zto*Iv2rmi@L#$Og)r6M)%%!r@VzWOGG-n038qMxqYo;V z_kDl&>0;e^bg8W0^S}ry!eAjvx%_5XUbxjC6w?u%Oe{_@ zEY;w$@5S6xo5ILSizqp2O*!MKu1;nnrM?%vMkPFX^_j7xBB&ihtb?c4?V{-S)zES! zoj+DcdYH?g0m4X?3eC0n4$z+hJ7Yr4=(?*JE%3V{_Q?4K-UO96x2r0<>?@)dE5e^E z8fW6%#;J?oFVH_uuN_y?R@5*Wra~oX*hsb;Vwc%MNt<1CHdiMT!O<5DsPXl7pjQ9$ zR+IYG@$vCCm*eio8VA39;%z?P=bQQYdGhx;^7oqv(Kk>J7?hZp$fDZ<1qDf7x_+C! z-tY%q&WM7APzFR_#*{zy1Ktt>Zt(+ddtuN!pZ8)Km;;UlxB1;KR{tNX5P}Uncf&fa zyFvehPUBiAMfsd11fUF`J-}DnOXrV@boaGv?k{(TUjtqy{)a!qw;@9)C(#+(NP{PCoJ+4f(ms>7-KF)i(57TtJZ{r+1bAfr_`v3!deNqB~XL>nX z;(kE5q{s8k?)G!sHlNcTtkMEhAd_aT5M*o=ecMH!$rA-XEGXwe?(BbL-ox+t*U*3! zC*AXY=@4*0OM`TJo{~T)bGhDI zOf54p#6Hr9z!ltLH#bA`_ieNR!|4+8jT}V#LsFq5I09ZtZyLv!$L1ZA-CE(5>xnBH z-4yt*$PH7j6-1^PH^niutVk&EW^UyRQtCLt0MgG`vW%g-x#Wlb=cx|~d9)vTZsC}= zbD{pR&!`zDehN~D{Ok8IlHJHIY$!h6=oA~bw3A5&UdIea1Nw4Tt^#d()3d0s&TukU z)cLBR2Xslg3ZGC$lVl@HD^g6|+J+D?wkMLitQ7NuLjWGd@FRL7ax_Vg-Z{UgN-Q?Ajc9m^8`tNx&Rqc$s3m(1{58jC=b5cbo>kpC9lu|? z;o;)J6w&(HX+?8dRD=LP&*8yb2~5S}h{tshymOs9QaCI%>pq2K^Z+(j4zg;6Wvm=N z^Dfp`OH0@V0Ml@60LGS=BS5%fwY1W&xtc^@|4Zf%A;R2?y*uwm0>nh0)(ws7wqrOC zRIMQ!#ZxVJg?g3ulx>4ExR&d7_AjB`kN3x^1RY_g?E-vP5gX<&fq~wZJ8S#+!#rVE z|LjD`qk%xh+^@BH-AxbYc^`v=rDAuNYKKqNUG60@N!yLXexF6S4fBsy>|uQMcoc5? z)JDo$>~njaAj`J01uH1AobQ6U2)O$zIc87r7j%#f=0w(9S1WA@v*xu^nUYd24c3aX zt;`)jH3d58Mpt^}1P_y>_+a?4>D>5V5g?bgp?jD5?_n>)I0nsS|L;q2j93I_L*7Ry zLKu`d|#1h?_Kc{uO;rC_{&`Vphq|h?>^5K{QON)?{}9@ z35kgx`$`knS&CKXx!3Zk&TDqjrfJ0g*qf6T4S)2 zA(eH;1WF68`VfOlnwi}L3$Sb614?!4tzK^R=A6` z3(;b51l0e^%HC}l{*v<-vYXQv>7FO4OAoLFqqBSOjUVg2%SY};vsv~}CDwWHJX?ovT> zTF-LcQlINQ_4P{MC*XZQ50)mpBD_HhaqmaI+Em})^DG(Vob?;H0yfI*Deob(E~Mh7 zo%V=eZQU#qz@W2UkpWQXYtHwo%4jXtcpn=ElTY#zsMvfwfhdvm)XA?m5v3J_SlpFZ zs<`13O-AfKs&6{zmo&1-&Xh(!`CBoY&3#gFw-#Aezx1=2dJ0ExeN#7R^uZkOja8aI z6sg(!7HK6oZ-Oi3i4dio3-yZ`C1HTeM5Q4COXRzI2V+GE=ucmjQd^w^0*#y@S5@T~ z>TGp4==1oq?)p$4CdH+SnnS@`I)xfaHv(&P>MR*;>h8?m*}oRtC-dX$73MMzPH<0r zqb2eg+M#ck;~V;WGZ^}eI@xueVp=Om8a*qg`%6Et&){UAOF{N&z|F^Bb2&hg0hyoQ zR{bO02v=x*9;zriI!Fj}IS%+n{(1x8x1)}7$TJ(9eBs9%4&6nAhGU;n2v^YCthZT$4 z^S=_twMQN^*81AX7*j^!gLgmRmZH{?NsF1Ur*-*IJh+7zUnjQ?k$q@tfLZ9+^dqEu`v@}NY=43hxd}q=yq^{XJze^o6hwT_ z6Y)EpFZutrF4xl^MRSm}hwZNu&U_@pPC^(6osY}92|{1-Vn|cj zzOwLRidEK(FmR(I9|lTGTl?iMz2~i?2h@>!EDV9K|A#?`&f8(~w;lMNcR&y7z+W?M zgy6}^$^WO$xKb;__cKlK-B|k+Q46{EaEMH?ha%zjBVim z&wL;P-7w(&v4I%|%G|<2qF{D(R8}Bo*vZ$)=@zj4@dTM5*ZxPdR_1fHyjPs~{W;4f z$k2D6z5ND&Jh&{)opSL%m*eSMq5l)O_g4HbS9qLFKa1sCy`q2Ypo_fDCH&9H5_^?E z=1b+OrL(-Zu{?(8U}FNgB<2ZdD8|(Bx^Nq?;bg(<(!U#sHhD&814Z3Reo$$|A+pyh z1`C_YGE%WXZ?eHnHyNTY4<;M*#xSMKPzbYt(IZ8tEJuFhZfaxIuyXTa=Ie18-0*iHIvy=BtoAf--dOwEdVWIfI-^#L@n>-nLYr7OzwXWL;n8utOZS_hqZXjR9A2u zZ;_VfM?gH(DVHR`-c<7)kvAt=H3#s-}{o{71MgLH6O&qa~;ix**3%@#Ba!(`I?&w()4-YMF9gu>Yb?r;@R-`VY$YS$k!KPp zdJ{In91`>@@P9fG468!MrUq|(DnbRfT3OP`>#+IH!_``+8G{d^uC*ry?|G5+N#1H-b_r3*zo-oMiz2RTHT4cuJL6 zX?gd+8+Sk}tLq7ld;bgWb&GW7)zdxfmo52Vn4Ywm6BK=*4BF@U@iDM_Q&(wLqrsF6 z@j&;qw|g4_uV(z7?gv^o+|P6Jv>X^_M1dF6?<)r`+Un|V>fjJ`|C55rKu-OZQ8%t= zO})*h93!?>>lWJ)Im8Vpv=JDm@h2UUvjOkvk#vR6syHlw?{vw94DPg6_a}qXZy6;M z46t$xC`JU7tGLPF(_jl6AJDr$dQPc+Gc;$e2Bc`r#YwR=Tvt(?V7#M!Q~-A)T{eC8 zlPVPkYP0j*kNLl8V(vU9*T4iT!xJa*U@h_Jz${DYReo|f48XB)erFK^n1&?u0u|umA zW2@k|efXD)9uJ~Sen~vEE@FNrvVd8^UH-PX^eBuvTlSRK*XAJpYw79o{uQsCZmanY zx~>@-*7+WFB}l>}pzE;P)R2mt9#=et(D>33}X7oP)IDOb^H4-~C)|q2$ zKI}vz={UpAwLa|5?MVr$Uz-!`hCVd>rx&ci#HP@P5~PBeyyr``@zmipNGL~v5z}9L z`fdaKrL>^8a_F_?L^9E!f+K|?nM9KW3HW_oU+I3*?RnH~uXTvDF8dBKNH`NW3qnXx zpbF0A^>x5S{m2Idf_@~?omy~;4z%YK_ zS!yK;0T_-G{48c+uxR^!1ka+JM|+ zUItVsBZA@ZLh~%T=)!PgHWUer!O6*38o5Jful?Guey0i@9@pI;ujc`{6FefTEnO`w z?#DSEaL_>jhaUYjGstU!YzZG9A5ptEFz|a`mmsBE$c9D)N4pW^8aQT-jyJpzUe}nw zo#Z$`jkFg$)|>~HImi_2g@;;o9SgHzaK?N}rkku@><}-)MCIt78ckd2*B`{-XDr{v zfyN;1Bf>lKwi-yJ6a z#|zzoviDBWwe5Eun1D=Jni8CocaFLW*(@-|l&dcKvU*j=GA`*g>Pj${_fFBjIi@YE zyN+ovey&P-l9_soy<5XjBuybntBDIsa@cPClRr?m{Ff5zzkhHyFxGf#$&8IUyvM!+ z!~8Aa0h=7|H>^tZSxn>`Sv$~wU{-A` zrPON5oD(l5vs9Zg6?nZm_2VM@1X-=hq4?mFwooiard(FHe)@NmOJ9DDxAPc$f^xQ( zUC}KLt_}NETu6N@2XU%jlqB@PZB25vp;s4=i@Se*0=nn=%huM=<2`l^JM$Q%rqfIy z>GLPpd?hZEa5F%ae#2ZMT6ChnRn11y2@ExmV(g~>Atjhg@JzRSZ6ItO5{@VBBO&5_ zr!#Y+T$~qi0wA_{ReAUu;{UcIf-;gFH_QU6vk~s#;N%8~Rv$~SF8ARbG$;V~=h%f+ zXmL!5q1E+T%;bK3IsgR#i5;44Q_7vogZvcc+QnV8{oNd^Aim2K}Dq~e4i=rnn+Ud3}ne>_#LrzvZ* z*`&$7eDhoqO{A8!v=nGSMhq^8@XoE`8#JSm98lyo5T|d#Ng)EXr}t&6(oK{&E&zi z1?RpD`2q~8cW}g9c;tyf7;?Ya&^REynK7Fia;YZ@}J`@X$~wXlQprUrJOjhA&7`s!)NlG!3^vO*KfhJz~TFH8pkjHE}p* z%n%+P9z+R}i|)Gv!-hhQ(6H+WQ)8-qb$Y6;qw{(qBT5t{37IEg#gb^cm~hxpuw#ZG zpy*IV!qcz;c~m<BfS89W?ZE@Y#V;CJy00(a?To;#o9k_`M`4*%yQ ziPe#bdAnmo_~QS6TFH>{ak)k}5Ay5gjblz5yge^d@MNA8I7r%QVf)Wf*z`Iz%MiE} z+Xni0d*}MUp02HF&)kcE)@FuH>cPT60+!V9XyLo4FZaSz7d;Mqag=|X2Z`ZKwY6I9 zV{9~Q!zCP{S|~}Hh0r)IYf%FeS}Dgl{MLhCn~-j-HM=tNDVct5P<|d(yMHzL!6e=t zz{k}RU?4`kGPMexKHV}@=c$mOmRHuYnu%cE_? zpH1`wT1wu2>g)OMSJikAPypGAcpX^3Hv!Se!fDwGL+k9X3=IvLdtyd(GFz;8`U)OO`Y^OEiIcT6zHqGZo~axd`vzW z$eiK%wlFEfzh9}C8U=H^BF|(4xqML|ypZz3CK7dhRz@N;Q}3uH!bcEZg}# zEz4&gm#xEilz!Yo0~10`ZO@1=xWq>%>XpD zuf;Ad<7m4YmyM)>FvptA`f*gDLr?!oU?ac@4Pc$Dt{uC?rMPzIQQvi$dJ~NVDBI115 zS^J57tj29uIs}Pw4t5V-=?ldJ`Fd0OFF@FEaM3Vg>(3hlCe7$`^&K7KEwn$pE@}L; zoPVl7HP_v5cf8%NT^6~%(PoG!1CW2TnOhvG)CsesQaRX`nvB9!a*JWZN;Oa%rf#ihY`xr9ZQ?G;w6e0i?gT|Sm0XGj zYK#do6{S}mt(&vHm&qmR85%~Y`hvTK@%mCpL#ooQV4q+>*X>V7%9n)79@fV-)7esP zgbVNyCK6WH7j~VIPv|wz3LSC5`71tjK+@ILfFdjxmmiD~^DYQ&`dHuJ{Q*R2k%H2D%09DQBg0Ttho_{$=g{jbxc_rEX(Q9JLJ4_(S; z2-{iZH?uD82pnMaB*c(=*~67!39`&-Dmo}>h{JcExAc8#T}YJ&f)JZow!>@ep^-P6 zfjkWO2w62y2ThsK*Y2*?;`?;QQ?e&5#XBY|&O*w;?Z!T1g9%3Q*C4acEkROY7Xs1K zJdY;RH;P2P-Q09}Bb~J|Nokg_`plRlGP3;=UlI|T=4gUk?Uv~&Na0%!K{Yy$S%ukp zxztXKZDx&A#{Nb7gcd@@jD0f9Fn5Qp_{N$iRs|}X<`1lrhpm*(ldIBqw$!Wn6|)(H z*M$Y2OSN;mFV3UUuAFh;H$ z+lj_aLhZkg{HJ{zxc*t>S5rI9B^xDHv-drs;{kWTSxUMRiM1YyLplbtYn;_D#qt5z z4vM*Y=Cx{x?;Z_}JFV|gq#h!2z`Aq=>R$d}2Or$iATtIQ4~&!x;>|7r*JI`9sFC(l zxq+rHbu$W2lx+ExIp1oAre{pTs0%~dCdWp%)V%2qc{%^W?oLP2Ueo-dzzL_2v-mx+ z)}1W!98vX8fYxl%o+}Vhj2Xw+`^8*Te{{d)NPFVj1@O=Rx`JaOmeTx7)?#J<>p`nRD@a)mskJ^efm_kZ*d1XaLTAC-=!(-bI2+=3< z8dd4k*pJE*|C2~6HYQkDSb)e&l1r^t^juKGjVC51LPA3J_xF2%K0QFlRtywHpSwCr z3HTdFH@0byADj;nTDI!cM38wy?9aF{L#7;Sr>?I0t;|(xwpg%EC$p4F3s;b>Ur7n= zHV`q`k|(>xt_Ps8|35GIKUz8X-)9qqzcV)5qNII>x&XAI2j_2tAku-2V-b7=SUP%o z@Gkks?*AlaRnKeHabAGGvojXd&E3RTK#Q<|Ks%+F7g)IiLZg>`}=#J5k_!6HvRXv*E+C(T+)ot{bUdfeBs;)_*`t#y4m~v zaRm}ilm~u0{$KmTBffO)Hudaah!;q4@|I1%-PSN{OVs~!1sD~Iy4HX_edtNKp-!oX zrD}L4@MH9c?8F=<>=PyVx9V%D%Y}dYo@CK$0w^S-F84KnxK6DCeF0%>7ppzq{%!%-6pV08UL)LGl8Sj@4lWZO~7@lLGZa0;sHx$TB8 z{w|YrXv<@xy$qMO%V)rh=asvC!o4KAs;SSJZDX!{opIS#SS3x-Wlmg)|4mM>m3x{k zq-9VIN6Ohw@-YW1_=XD`sr}iuDDi1{81#A?si{Vr?ZU0Ob26J|^yg}3#dpR|fYSae z@oAo6ZkQ9~R0J{exL4V&AC2D3#*=m&r7^jbd=}zG94IeX8s1UQIj}KUUBT#Dk|&-G z(ldqBy%l!doY{iXjDkr3Q3$dbw}J(ccEih>E3FQM5Z6kkqW3TAnZt$=WirsmVaeO* zkxfqOPod*uxMSQ3BdTH=vc;9@=EJ{o#A`wPFwulW^cbJ%S|RToPCx3sz~BzsSEyfH zVG=(vWaJR&jaMF3^pdz?IT#`X^^wJcY$}E-ua z0=J-x#jrx|X2#RCe7c3HG;PdW(BdUow-#RULK#iV-fE+57yNZ1+9Z=yeY4J$FaFV% z6C1g!Q>EK+Pfuw4UWhzKns>1wE>ERE#fV=73+;Uf7;r;{JtBOe3WZMUy@+70G!=;? z;r+W)M+U?X4O}w7N2hH-6_FAX*r>Sb<4~s}iIt`>sSwLu_+f$u* zT9WPWG(Wh)KVDWop0dAo;YdSGu*L72ab}{v^CimKx^^Rki3`o7Pn6Wx%PD_?SPiA( zdVjt9xFQ4`W#);z&iXANYevJ`WeO-2VoqI0jKNtaLZb_bCMtU8YBHwpMHRzute7iH z(@OH*?y^D`rR+OayoF*GjnA*+z!V7Ja$zh4^DAKM`Bkn|VbRK`JT&u=O@xwEhqXn{ zK%;yYw_Mf~!fPkNsXYx{!*GHb;7?ogxkk+{mA-zbwdm3Bi+|^9f8T+M=C*8VH;Dj3 zAJ|;)qzvmfgbUW*WU@ru!!5`RB#S!S(F@S**!}bo4IdY&cbv*zZS^oZFGu65C`dbh z7Gmvn@LM$40IGJ%4|)n~UutEOeBXmeYi!fB^w$nOW}Kt&5v%K3I=i@JDEz@%TS^Hz zwkpbP;^hk;6xE!uhC7xCe2$pPwc5{6pMH#bb3x-TRHK}FVSn2-+Kjt`(Fvve5gZ8H zRuwMU3%4f`=4hIV=T%O6jL4jL7G(w_L@oxCJ>Y~o0IPJ*;MyyO8f43bG<;YgL+1Y+ z&>eDK$J5B?xbuw}PY@zKNoCS>zg&Opy7v1@6gS>rn{{;Ax(%^!W>1+@VEhArfJR0} zAb;F>LXV4Tka>z6v^oNr?74`#AV`2Zz>q!xfj1AH?EiOe%{uQu@W*y5;1c{6&A6@zIF9DWdEy>! zL~;4;z%79hocWG^(Oh?xzPg)cdfkJ_0EiDLBVS@bkcjmn$$Fwcl%PXToe)#5$K-x- z4SM?6!*|%~d^uGP@CJXpLkPvIDuoR{;3f!o9q_yx0V1At+ia+oA@}2gv}|qn1o-*A zCxD+5e7d$Ei@UE7ISDbZz0gfB4CEAAbGz144_ELfzOvq$!Xu_&G}w zQUA_5>H4@r`#O}%WVuv%Ghg4gX~FAaEAQ*AE{H>7etCJh=Pez42f<42 zi?6Lnk9+VuOTm%G%B;*&z!-!hA6h;1=!!peT3w3iaowIlF>^_jg_Zhk()LH5 zW~G%U;2ORx8~)n6|4KHNFa|+M%(KK;VpDio@77PjM#Fu6w09SVY5Ye&IoS9d zc#iE@q)PxN31j9vO`(Xi_$0D#yFJKvr^s~2GUqSGB_SRzABt3~)x4TwE)6r$y{}L- z72Fy0;x*$@TD8S5)f6ZbC}X4ipH0Uv8AZ2&24`6ah1t2$9TZ1LzHxn@`FRQK00hbe zu*=pqU0D?dJlrUhR47!i3b6-eZ_Gatb!rIR7wm3segQXaEoy zNfD)5eczjc?$PXCuOju1E&}TB1uNg`|^A+w{!& zS&5>2L5Jx*YZtCiz=Pq`Umn{<(5%?MaA1SX?wOQc4*H2j@yXB42SyY-5*ZMnu;s2b ze3H+9+)nms9(VH-MuA`J-mJ?2%Wj<6WB+pR-|KuIb$`rLGyn~>X+y8xJ+3^j&-y)Z zT}BFg=92Lf(1P;78(#@Z*KD~UHGok0daMdbG|?uI_$5{5RQdH5znA_Y{Mzm=ttD7d z8P35gwx#ca_~MwWDoH3L>&)+!!Y`Go3VEv@7dJV6m#tdN!%iEVq93<;oi9%rh_Tbl zo5ZJoWnR(*d`4nBI3G3I9+=fhzr3JVf79fa8y&=Wr~(FGUoH*nT`iOQ3$iCB1eFIB zvU5&i_0v#TIJIXb=qm~4=|aSm5nyF^mY)25)Y#LzF?()7p+XYRZ_%6s23EI6nT*EW ztOinXD$;STc6Qaos$HAq>m)ZhlcpCNv#HbXZO7Z5m#?k1UO~4w%f4WhTh}J>qwqdZU-E4nJ zb)cl;77I$K=}dQJ;AGtxzjPC)!5g)3BDVq5hLJjK_jg?Rfsh`iVOCn?sWmn~J@~|) zS1k?b+T79!a&TaHom`2gu1!cw(+Y?lZ)G6eULSY}!Tm6 z^_*%-6=$i9?8X6nqO|SvetN*&GDvAiB{02-HkJ%M^3fhl37$Lu~=vEJECN*3aij zHD!uxY=@4_ERxh2rT1xypq8j5E9DlI#Q}bFF-S7AR!&CAC*?=sgyyMGz^j3|dwDC* zp0$Mp38qo(h^ys~&r9rP$)$DNOr=%?9k+92#=4;qCVXLnln$eBOUGo1H_05y{2&w#}Z|#0AB=!zt zrendN7^7>cNzLT_^Pm&uTb((aF>kCawTf>4*_oP(Fgb#Xu7KZK$TiKLV#FjhsCD+) zn97QB)Vk)l;8a`YlG1TISD0%6BGgW_0B@oPyfG7#5^c`mnYX(iTT~NYOa5RXeH%W? zY>yE6NB}2Fs?^xGsxUklYa8xZ6Q@0f$UqE(E9cs2pwR)~qxX=@wEul5nYQlo6y6qPL$Dp8puqvL3}kvgk!Yq`6UpEM{o?^P>Ek z@;U>PY~|Ibq0s^q9N5qrh?qa;uLm3C;hHK%x0&B-x7S=+g+u_J-F7GwJVjU2zh zBfy?^EWo>w&*k@hB%%a+@x9oq4X#9Zon{nk^)sqj*1E>U0*=VO;+Ew zaB--i?tBSmn=Y{;&p`~EL9#gQ;n&V$6wc7$KLSfGp{TzsyQ4&Y7P`@+QE^KM)7nv2 zMF$pRP>f>46Lz2HcL%YlE}nZa9u}dA(ejhrzXz$L4EPZzb0c8z4oGHlmym_nGX5!$ zbVBXh4^NDR*F>m zeoV5_nRic%3sG3c;<-|xjWsbjiH)q=^)4)KXle2rU83yMLcht}iEdrz>&$ok8Z;&0 z&2m3epebh>!k^mSVc9?f#NfIf52sj(97O?UrWA^nRh5bj2{RV?7+i;fwel-v5_Q3o zl{|2+|PHTGAwcrC+3}Y?dl`H?xyv_QmB}-a0 zxnPQxwFc{EBq&+B)E$@QM~T8ebZ%o8mDyRI?=y>?ibboar? z$iAn-@Rai2TUn3U)WP4Xv*J^fl%o!FIj82^Xd!v%$=RrBWx!;b7ZVaHP1UgWm0keQ z==lh#RWW}vXledCqfn$2NjGY^9#n6c^XfIR<|-F!$NUMCVEdU8AGnVzbVNwqRfpWQ zP_BBf__>ISeK-0`aRz7l9MkPmHi6d)`hY|@e1QdS6B=?3E7fRZ6nw^T6dh5q+V060qdM_ji9-=ulTEK{!e zGStMf1kY2&!jde13pu}$I^Dz;dPctRnJnxsDy&6peF}r?f5AE8Xjj1U@vZKcvS&A* zOd~Zr{Oj$8U?}*F0o96a1cBQ4BkfuSS~S8#t#|*XSDHnvqxObP41?=aVX?@-tb##V z&4k>Elx+W_Ec9Tyx*9+5iXMFTXN{+7Q8VQ;)c@c0{r5t3Ggyx~k*{;guwn?oCuIPK zyz8D$b+O^^@OLx61ZhB+c06^t-H?C~1wTXy|X6F}s!0 zOH}aC%8A!j3wH0*!F$zn@1J)xKTcYd0f++{VwR56scEUNpG(gpB_+L#_|nR``kEd9 z;%P|-;9YdR7k)%oWVF?S{&xlZFQ|Z!dZe&@$;u*8zN3?HB9fyQk3d7d06Twkd{%e+ zaD6U>#YoZt7WL&hJ=UpL*)S@_JZj^L&;p_~bbdJU@;}#-vD`ZjXQ5#)-ivk)krJ92 zLDXFaQBj*l15OKN8$6fpG^Rm!shG$?g`FDp@a$3W`5`uRm{N!uD1qoOLxgDg3~CcF za5JZpjG2LiwaxzAhsj@OcRtHj+Hn`_Soydq@6UgeIjrt|48h7O>|ba)fBa3y=9VH2 z^X+$aZ~k*JCPHy(88yiaWPx;h>!hx3CKVqIDTFGsp%jUS%DK@J8R1|i{P!D80`B3U zYH8>kGp}D_%e)GD<9Q-|=KEm-^GJIxe$=pHTeB8RzobUNCViF-TQ;~p;r;9k#NO=j zmiLAnm4AL|?oZJ}8q`jj#+|LS4TM<8m?xqOix=Mh=jt~qBCP2O{t3CoU< z>Ud7o@}(LeDW@X9qpo6%yYVMVsgU!j7GDhzz+Rlt_=oHbRPiR<9wbnOH7`xuUpH)7 zS*G>QTOqDQZvje!;$-4eiI#^Zt|Nu`1q8y4wJLr>vYmHj55^ydtXRdRlQb17rIIC5 z-Ildh(1jpSf3UrD=@z``L+vi)drp1bi6auGO zbl*D@kT3f5Sl3vFEErI^a8jh}Q!Q)?ng0u_`qaVCk>fxWNinz_b;JGH+J5EMX?V_k zn6sQ5ie#4{tyJ#Y4=5=DntZmI$1aQ^;$jtt7U)HMA#50e=wG$JifHh6xZ*saTnKsW zsb`UlVB2YwJP~e$xh8j5q4|=U_0;e z4|(lTzaO$aa5kHnTwjs@yL}!$+gE#03LIhygTk3|p_7gdn!@aqYSbmuSz?|EOW7wm ztyR&BF06Kp6y0xM!Cm|7jj2EB;!Bm+R{0XMf)`k0ahIvZ)zZ-LM!fBlO9&XN7peIb zvKu8(>7h!45~bejf4jK!uYo-~9(we9{#h1-UM&HAyB*apW`{9o!6&%ziww6ay!J+6ZuGTq;~L0!Tx!jFOxvdGHGFpyA5#5k46k9 zW~duct6AqVh99_K0tW}DxNz~*?&EPumX~pJ@G4&9El}^$RL_PRMn*~-A~q7;n%znz z7%qzfIpZsoU`;jD|9v=&acD@xK>USu}HRqPfo$<0S_Bfx?iv1|T<8RL5H~xe4rtuFv+yxpGXvNqj zC$STr9}9%Mvq#?e{VjixRIqQMzI8ychamk8361ZVjZ;;fxpo`=-D0y6W7e?WZrpED z_(gd5Q#93q`Dl?J`*m0r`(n67>BY|kS%#p`C{@smNhD1O5uyD?=*Y1O#PR*@zKo$W z=1JIViIQ*mc^wMmS-Ir#23REmNw>a0N1%Avpil%*cojNDVZ<+XoaXb!qr=BoUPB9W z@o5CpwS{72W1=)i8G;p}O-lYe&uwlM`Dv=l<4fo0b^!1L8CBSv(0Av4*8MlDaT*e- ztTsin$9337w=;aFEc&GfA#VzU{0r(fagzfdP1ru(zRj<#WiInX%Gog5u?6z{Zz)T^ zE^HYRMPfp5#^;T1FI&3PjfV##35{^@(<)zcQf`TuVto!i*ywKl#D?=K-lKh*!QQ|c zj%*+)3tFn-X3g<=t&5(t4~T|=YFRRD1&CfUFM>TmFM!WRiQo&FrW(`RAX@wFgG*$) zgmr2D_d0*?k4uXEr&X}|k4^Z!>{f?rbfnfW7YAN7NJViwgtdd58?XKkzsU8uf*8ZJ zxQI4$&z>fF{D@n>u7ICEMU;cPB|n z!p(ap=cas@v8ZzWvw!yD@M3s^K&P6zl_qUudH?bAD1YN5@sDsK8x;Yva!Q(S48nn@ zEQQTIhpVQV&fgTNRb$sQ31|SMQ{w(uPYQ8$8>*o7+~NCyVU7u-1?Xg1*bu@_@jaby z02G@xvb|%!Qv{?2*gi21ezRTZ@Am9ya&rsUtoI7`*IUx$Ov@r#f6U`HVV@bN zU3C;=nz2xu{M<%m(~x2hq_sqlC3z0-RUs2QvusmnEE9(xZ$3+|^yN3~r3x(jRy^=9&uf8A+ zkK`#8L&`WU0$E5b2}2xZB`oL&n$LqOjHDuKBp%!AI1XQ4$EYeMDQB=KTy~bbMu+s@6}3le6EE ziJR|}yY%*E-)uOki!2tXmzLUkggH&-smk#P*-zUIunRxO;}O)J5umOx5n_m&YRdqt z&Iz+_`Qg6#BAV#R3!b#JbS~R3C7k2+eY4>@PmJQ-?y^jg$BKKKt8!o-k-0m~h%Ct1 z^z^#a7?iz=Rd6K&UA5_MEw#O=NMp|n&e~Ii67hI@Tp#2{?YaTZc6ejqB8oyJCD+b! z6xS2E_`R>D(lw6Svy%sLOWKP_U!*i^9Cwk2nuYBA&z{*gQCS}qO>IqDe>2p6Er7z; z)=23WntA79KBt$V|Bs_{3XH4m!f4cFVm5a2C25?-wr$(CZQHgRn~l?0jh!^M8~>;O zT+GE>oHI8w`@DPawH`EB1eg}1lhkB;zyDA>CMve+iWqT`@te*qRg5_yu_>ozWn^q# z1w{u8M;jRQJ1#3why&DfQV=0xz-q^2&1k0b!l<+YV%&WvQ!HVOeN~VPuSVO9zC~Gh zZ`MSiFck0=q7V!~!o&b3NfRrb{Y1qX{HG+73|>4HQm!tf2Jm!|zZO_zk@H^EWJ#!% z%c@k(R>dq|c(@!CO4P}(F@vTpV(<#U1(8YfzFuv_B&ANd>WeBM8^;V zq~Q#yxJzp7Yx=4~fBhCtwTiIKOL6>mQ`K#W;h%aWObwFl{tdON=xfa6iLx%{Cf4d( zJ_6I&HN!Sr1-i9R0)Yx1e*zIP>)3d$D|S&f6bcWFqVM3+ky+X1 z(;umvO}1NSGi3RE1^5k{TZeh6?-EA0BqzfdNHC?DH(?la(A%DnN6~Qf@sLX?&NlfF!8iRl?<7ak41&N$ z&=C>iQyW5!nFLhawza{qdu47`tER<|tZHsiq^4_5yx4Ld099K@33YPcRbE$DCvI-$ zjy+!LfYeDbRCVFn;=4MRrl3EgRoWh4JSNl^>QwWUn7ec|Hd?h{&9v4b7LH; zpBhy4r{%(4WyX~osY;d7m#R^#OXTo#HTErDmDCD3`>QDo1s(!o3^}9 zpp=DKfrGSEFWAC`){{X)x+cD=$i?Am~R5s<)OO(l1{w!3E3%B2~CO1J&HpiR;i9L|`H!)`gm zg@wsPO02G$PrV?gERzUB${AiL=YNire@iXS^!=}Cy@t`Ay?5hL>IDp=i(q@>^2-PK z;kg^>sT)XTaL{;KYs&+P;p2uO_K>E7oaZFuDDtBceH2674dokoW zHB7-%Y{RFFp5@Y90=MQ-lc=|I1hSVUC-ib{M8 zx^YPO{?5z$%T$@0kT2?4@Ox?yN*c|93)|rSA9nlP{DXazmRsGF^c8KX33tVq5~c~! zF14Wr$B_iIxbS&qxd`k$Bkr1&*`fRU-$cGo;oBtWuPL!ADL*Ze@)>lYgvec&eU-_C zcO_JoAIzFErAq(JXCpgmYI~>B9)Om7Ub9XuBLaG)2rxJ&CG6VY={;MfUNo|Cc$46R zg~q8IJHC4QlR-&2mLk)1mJ1j5V$Wr?+~TjNiH()<87=u$?NIJ`xTZfhp8rvTg4ZGi zpO?z&gl(Z&f((5O$w|mTmtQt(L&3}5vg!5>IUhE(<0KQOW&M4-_n!6ZH$qoedR8`< zx80M5hU)aAkK?z+U)O(p%~HPxF$#kUWx6`v+VXv9Q^#y=ZAFXb{ypk3ysw+Y1~a-R>hurK|P5ELcs#FM6g(C;UdW3Dm+Vkpt#jBt{Y z6XA%z_-Mo&2L<53>hED9%C1BJSzzoefi7gkk!Qq_H`I?NEp~(XFK|K|5$mO92J>2z z1s;)%5O|FuS&`-{ZCJ@IyFwxE+K`4th~9+Tb}M-nF(QndBMUudqJJtA=QLIHA*U8b zacWsPy(gT_S^wkiHLup3Sd)?lBe_*``9<3j$Gjq)4JRA*^RfCTM*@LncjMCivW^qFJ$aK(6-lc0 zv}>Mpj-c^tdrNzL5RkW(|8{uhNGYqDUiZ!3`s@cA6=d9z3WL%zi2g|LI2w6OT08G$gJ2ydjW%?McW{#p~TM0 zm%jp74DPh!N%VP|tYj@kZ9vbfG-Js@n(bqSG1?tYm}#C7)@j1eZ53)q6x^xzcvFh1 z2>V^I^2jzWNCM$Yvgd%L$UUna1zAl4r^`eTYNIrY&f*wV{iV^Zd-p&5*#rueiGkFz zA=KR)lg*H5?34XB4S{y@>5c=oS(*yYs%sCF#{{s&$@U3sbV1#O>?wK*yue`8B)rz* zZ{l_laB(qIE+pp=q#?@e}~d{#Fb&UWoG@^#AG zS=fss!)$p4h(8V7#so@x!Yu4{N(noK*9l@-(!1f=_+oyjj=`6ooNwi2;H%aI^D@hE zmcv}3NvJn!Z=<@MSoLL%yief;>b?Hy@qX}dtF1wL4UADJg6SymTx<)X5NcZ_5HI`5 z=e%vt=60=n9pS?no$DK&QXA+H+ zY#@hDlyhRq@-)qMTIeUS2x=NC?6}zGCP`IX#_UE8nxvFNHa)X|FgGJj8OIf8X>CqX zDESyvUYEz=?*)HPlcnXemwy5|VE5**G+i$%BLfJhTbHotqPXeWez*HqAEAqtpC^ZY-a-(R1|K(|2GM*pXu zua6J@d!;eA&fj37w*mz!1&oKl>c4e_>%}h@$izar%l@Ch<}E;9YEfZOW59hrZhx#_ z`CfT@Kc1hsb^TKm^wihayI*bf=9~E^sq1-u5yFlhenFp}nPH%#`wAE8_t2+bXMi16 zS=HIyog-EH0iE`m&z=?ee%*34O-E<^ik5MjIctW$B7hF$xA3VWmI^oKMN?A19=SZd ze7}(IV~HI?Q8De2W^2t-ks@2HCV7%#&5;(5qm|!quXN}`D8I3&!dz#;jnP|al?CL=#<&zqo>=e z32r|8?A+Cv%Dsg9;QbZN65&v-I78LBWl-ne2^`xnX+3q_t?_>x1mlL=k~eGgQ7XTN zhrxuuYF*4}#F%DeS6gpu^{@(4%4QXHT`);Mc$A*JU=KM&EYXfWhA3F2%ZibpLkXPM z7hhO`Iqt7*JllJ&K<#aUH!ly4ZK%DYx4u>#<#RX+VTb@D-uiRM)C^yZGO8%riB%gw zEDKPv@uQq^XEfqZxh1;GvZYEd)y%(6E!7xtb$#x}8_i0WFBnQ{ zscGdQk%Nu!s8;QCeBWrY@AaMTeZUza?~LN?KKi#GuA}*Jx_(tbwh(XKQb83UKr4b) zS7Udc&E>Mw_YoWWV8Jrpcz#=>UDxAlW_t@(H1Sh~H~Z%u$K)S5-0PSa%(VxWCCAPQ zVFFS%jHVE%&|(dhKB~3B9}BH*3o4gJ5P{_6DF_zxf?xsQm)wC@!sH-`(MRGVt^iU9 zscVIZ{d)Q{)F?7oC3aSPvUQ-Opu995LeGl(&Iq9j6hy?5v4BzSMRU}0sYxq;QL1Ok zf54YW>eLZW)Z2iB!urp0!&I1jXhk9k6?SU<{9Y#wN)hZhy+EV^J}g{ zf?`2%mQ#y4>Our1+QFnjLu%MqI2e*8qWn9zpr0Cg(_QWsBz=vjD4)Y9b1(-(CB0BR zDhn9Y6vDJj1exWOo2zbib4uVnanvf*NDGPT>E90}Nd~-fTd(9PGqhwWE10Q9&^;?m zvO|P%VNQgM2=)f_59?JUY6ENmuau+nKPx?k15=30#BP0US&$vd2h-(@`ba(vjBm{G z{!lyZM_kW7z0E5Pom{_E5pv~sm?cuk6RY=SjKe)lA_~A~;4+z_hylZb?fRmXtBKFv zY~CQt{q%1(r2jamLq;u&8a#@r-C>*{BSi)rbAXI{84AgyAMCg!Ss(2DFJsk({i9y$ z?jf0a6f`7d;DG{(%ek%tml0=bv5s)Up%&!xlu5wFjaQcsr+e&a%Vm-lgDP+w==Tgg ztY~w04&tb1m?8Gi3^zw?@C8^-yP{WHN;zcL+q)X!NO`Whgwqfd*1?sKRy%M+zvzs7 zb5RgAE@H`Nv_BQ>k6I;G1y?et5NRWXL+yZxpDYY@ziyXC-Y*owoq~wbA30~!BIA*5 zZbV%Oh$C!*jdNKFyYIC3s3BZ(_CfuEv7$NCuTVoy&1CbsR2Qm+!dVemw^m-JSk>(knr$!6Yz&~v}yIVFp z*jDplXK+M4D7ebK6OwJq34w?+iZi(Y)>zxL zP-wB~jsdeyAb%-6glS6`%xsxAV$?fk-W#7s_d?IIEdR}=?|CBW8 z^tvy9NBMh!we#NI-pUubt2?>L=L3nZ|oPz~8;^s@G=PX>jyw(_Fwm&Ym(@dWW!wH2H@ArnIbLA)# zC42yZ&Xu?gy-xczu*|yFnmcB)<#RU$RFne%X#`Z<<}-OcKF_zn($U`Dp7RVZ;6*v> zoZ)-5>DrVlRRX@N7a%YNBs9mz$5Ywt{(!o)kP6_l_ysoUXlW~|UY=+CKmOG*e#HCA z^1PRucz>UZwH5#zapB4pD`sM1noA$^cvw^i>~ZpnDlJ;Pp0_2$pk0TRr+1U@&&yN! z4@deM8h=OFdv9iik$pjyO~B~l^)j=rMo&{lmL|e*NM|anrhYE*2V3k9_lkqvGJC6` zzF$zVRYPm}ibKGRze_w*QoH@`VkMZ=9fsSb*>iirUXEuYYwbq(o0BB_8K@nU_?6d! zT2EW`K~C3NJyCC2eUVM5nN1!oWTN53v9$I^3Sp3OoWX(s2NfZM1*`^=-h9?EW|Ang zC*;ysHplZnW{Henn-8ad1xR!~P@=axG(1emZtko_3VUxb#R8CmX=cv_YXlSd@KQ+! zYi6Lj6BiB>WqXLo|!u+fcP-4Vz1`x61B z&&MCU^uc6>;jceVA!w&Y@4l97B&UlFdXF8S>$LTbWhWmGC(0@lwx1pOz56>O?EgMd zrpe)uUN6oo^~S`#7pN5fZ-7#6L!UaecrJn}Dtn?@-{;^UwJdye)Ngm`Zr~3>7F|wS z50Oibi04H{FX4#m&&{ka)a)FW6h#UVn%M4oOj5OiRGa9uq^0Cs0gYxF7^r5F0lS@N z?V$dBG_kKfe zz~c%KBGIu~P-oo0r#aM?U5jXgA?Mi&2b^{Bh8Yu~z`nHOLctOj1r&zpt=DUCo6QN9 ztK$g?W5^COb)98KAZqUhNs4iUT&FJM)QSf!E9Y1GEcI|R?VuT>#930dSvphIYIdTM zPZGct5WbUthEQVsri03R$RZ z<3vR}QeY1U65G+3X`mX)LSllG)!WpF{Vo~n0PP5U$HR8*?y>1Xt0#Dq8~fk)%=g58 zLM66xY?ER0e4lgFFw?fL*6x=Xw=AvhuSaCN3T(->Dpl`3<25x!wzxC- zoOl1lbMDz~;b9*H3X&Pv=9hpX1eys8dPDKg6;($z-5vDr_(z{uWtB}hc^Ur_ZE zD|B8+aOF9m&|H^l#1Z_eX=Ar%Ot=ywlY?(ySv&ZWqJ>|8iH@N{YhQ`5A4wJT=SQtf z2SL~`PGO8{MUJ^cV|2KfXiHBjP3s4U^rf7>#xapPK`VkV)3HhdhSxXC?5aXW(?BwM z8M0H&qH-vkcw(hS&Ju|2a5m^W4>1~#;RFhI)t@Vmx|s0>IKg5&m#HCHw`XXP$sZE5 z-J>YA3|zdUM3gzPC1sg;aJ;pF=ti@MteoH2@9d}y1!{tgDR9%yiEU5FI!T`oaB(by z&VzHOpxqn`HBmRl;Cqmq4s_+E4siY`<82c*9+Jq5XgcsR4}AH6;A%QqsaV2oeizoJ zA$v9$o$hgteTi5w6R1N zN|xVZYVg=K8)Q0*S%OV46saG+{<=Pb&~c1@0k#P~MZTk!u)+#+)3RlwqtPbV+O9%b zZyCvCd&S!Fe0W;+yXF_@Hxorv0#96FpZp&7NPy>5zfNO7GMbS)L6hZ!R(kEnx&F5q zTC~Vtjc>8`K7)-v%JcnR0O>R-n1HIPWKykO&#C7Y_f_{oU8w)fFxD5rfB)aWIf*n8 z4D26wVQjp=(qNob1~mMwTD0nxkB*KU@qu}UhL#pJX0$xt^B;gm(W=3eO!_Bl1A-m? zF&LRMK4wl%w-3wu{BGyiQAK5zYpt>1X#r3bdtiYUU^#q&>j2W4Gqb$gEtTcj#a$I&Llz9HDxCGs5+(rz?e zpCTGFRbB$c3l!iHgWwb~L_sVLh2bRhLEuQkog8#!W-@i;UKFV9Jme^7vR=*8fu=lC zzex9Qg4#|zYo}+A_E!1V&+Yb#GpaOeH(PD7;u*c4*r^_EH@g(Yd;WmL-l1H*5h~q9 z=EQJ@?o9h=_nrz#i4x`G<`hhxt)BTqk=j~Y2j(OwGNFfwB$Z3Eb89-#KZjTtY(vG$(am%8#9wk6`@=%dDjdXB_S8E}s%@18Q$ zJ3n_%*^xKf%2lf!@zJHtInv%wh|Tipq{-3V?~nLs*O!3xP0YtHU=yVy{qL`3Wg~i? z7Z=>fL<6Ajc_xH>kBQsf&kxL%5@^b0w6)|CSagpX2fQnq|6RVju;n3y5BBKEFEj(N zCAJuK_M3M8>qDL2tMu4hRburQ?I>vXjj79mWcczNBNwm1N2UP#D_7e5x>Ihe-1gNP0?jk{7aTMg1Sti- z02jK27Tdg#)=F-2TrjBNK!U#_2E}{=Ohn8I*$%MC^Bls4f+;Q-O1HAgq=q48tlQB_ zIbT?y(CKCpQO!YyIN!q(VvMZHrpCjPi6Mg?slJuCAc`67v0MoMICynbLIEM%8R}qH zHEvGLcU0ubYqG&@5Qor+X^^IRwJDw&ea(R*CUr(p$E+v4zzw9WF2f_H-waaQ#IodP z!7ZJ!|GlE6l_r!|4);AUoHH$2F=P*l3Wpf9CkFAme~xW@h!!DXmoUmJjn3&tuHWX) zDelH6Pt-AvOfjbbmye!PFpolv!w5ap%iNk6iB4xr5caDs!^DeUHBX`xT|(k+HasL` zaa}QOXRBZQknZWvyI%*_<-LV z-c!ran_Y4E9;XLwTc)s|P5Cdh5Q#N4Qw|)YQKWIo?i;T6Krn`O&?1-gjNhN)x}W}8 z#j7W)IDpc-t@XA8uz1{=``h>MGNIwA9^RjC(b)AZRW-wd^1w(PbkHB}voKugYkHG? z&4KKjOc9}lX0vKe4eaxKlPQaeA+Ts_iZ~-Gc*eG+^O(Vbh@qJ#*|_Fpwl(MyWV%ss zl4t=LRjQCq64F`OsAQfD5gz$cR!Gdjmx?KeB<6Dq>(<|fPIduHS zJB~NF+{Y%i9#eupZDB>x_$)ca%b0rD?O-_r! zG1)N?1*c*9&{OZw9$1%Av2W9%NKG0dOapPL#y*mPzzDOC_Pu|^S#Hq6g@V2+fh{!j zlxfy!UE7iEkdq((*1vL1@C$m==NtT?LcIwvjrlLX%l+Q=i9UONK0TpD4%NM{)scW2 z>+5$q=|vTNNovK48=9M&fisX+jhUv}XXW&>qU38ri@37aQU1?EDYWiznm- zxXMp$3{gjXcYGK@6xoFr8Kv!q3jP_Ix^AUP6~B{ozsRBrr;az^?02sV^KVyocvuuD zr#cz6*3$9< z#H)Od4e?VmGk}2mBjIOeu~v;M$|+Gl)6+hO%gu=e@4iadQj#O6CLK?^uH1 z9d_g_AxyU3PBTmg|0PQkt1&#B?ULs{oKb5}*&hA(YwDwua+l`SZ#-GmId3bz*^OGfSuc=Rl{99{M(_CkIA)gzo#@ySNVXaxa(FpR}7X|BM|O@ z4fF=qG88cWN|JN!*2csfBR4(m^p576g(SV(GDTP10aZ+VV9Xj;h9RA}$Y?iDC20m6A=h8>9F71uyqj(-TyOXeI9KzewSSUf}gLJ=fX{WCkA>k^~rG!vBeY@bD5PR zP1YEJpg~3D8-DMmnktxSIJR)xD9zVykuqCr>KXx=P z(Vg=MC4M6%Y{i*;oMVmnxin08y@-Hpku^e)ECjT}EwdjCtrkZk<= zd)H>$h3+>j%Vr~pJqo_D(g9-^a_5;`bSJ|aUIv@ea+%#{eMn*Q-e&Y`U{R z7Zd~zzNNLSJWN6?Nk%#fR2J~~1<%7h)C4BT16A*nM1qZ9j2mIEIb{eVLN&{z(q=tW zyf5b^1dc6^f_(!oRmSze_vw)5-PL= zWtibGet6cO^_56~^+A=G6jf{`j|OHMo_M*aXm@gr4{(xvZ~OgXE_fqV<9Ht#kBEr$ zHChy5cs{e)4*NpRyIz6H-qv=Dhuz7dXsxkQU|j4}O1(H|%!0c0Fh_N5#pF;9xhPBr z25e+cGH$l(f z=XT?mBwbATUeA}T%x>U`h8jBL2S{|9BJLErD)BoVCsa{=KC41?`8}+4%m*DyWynT& zC46@TA!4%Lj%ft1`OaHjUefMJgc&$kkore%C(9|b z*M=-g`w@Cfcq00D^zr^|2~^e2wDr9%Ex`teZIi)o?CibxJL-_@ZRcHQvASa3#0)ty zWixowqw9)r85E?3pvc4`G>>3gl*sH2D(qDla*wBQn&@R^j?@o;2PEFB#xklUAX$tbY>^ zEHI=H8gJa%TA^iBqi(`Gmz~Ud@REv}>rwd`8Mcg9Cd>9o8^ghQ=c?tuIGx5tQc%=z zu4IsjBO{*tDa}41rJqlV3y5&>L9F>4C&4jEyke&;RZGhrJ-=#obWnU``qL5q9 zP`*j>IM>Y~e_*s7E>}L+rg$!vb*br9X=uhDlmEgSjOjuDY}19_%lGLl?@tYaxZa+c zvY8nDoW6RCtEytR-`Z$0M-I6L@)Eiob|JzH0ZAw>Hg-mS{wSl3mlrPB?1dYkn}$T@ znT1hpq|N7aKJ14f>UKR_0+J{IQ;j|l8F98;M+DT6)5U5)Lvwd`2VCO2>>V&>Xm{8h zIG9McUH|wOsr1iHbH3UHko8xuPI9uc1Uw$~`8uEfxRIMtqR-gvzlhsUbwK6%CoFBX zb?@2)0+3>gDu9Y6yMT#>rJ1IytBV*EP*ed-y?z3NFm!Zu`=9TRZ*Om>r>C>C3e}5R znwlp^&HuWfrAjBa2NRJZMwXV6NhP77q1o*A(^FIb#N1Iu_nz%AL_R2@b2e<=_s5EP zN3W4C0L_R+J8|m5_3tbR#9?ekV=-*GF6$Oi_1@1*10fTm@kH|F3kZWepKo{8*49A% z2BtT_J791Eph+jE#ziZ@v~%TOaQvx{lJPOf|27B+w+T3%Ox)Za|6kBZnzFa^fA;$9 zH!Ods9h=phsGriB-0G{b%bm?`G0WTCL|IO&U`*9D ze*D6iw%AOshnAD{hx$q+td5K#Y}N6ndt1;(8y8mV)Z6q4p39{AyR(SFE5f0AOZAK( z2?&NM`PMgrxD4?dDO$654;@uym)*Ep%)0-1o>isDoC^=3eakvW-zkCdSIA(#_I@MF zVTl{C2uCck#x$7*mYJmgp!C@~2@p@|zv!Cq3N%cw>8d?(at;2Vk9p9mur4haEq|}4 zLs9+Pi;JRpPn@59LIHhPn^&%Dyj+{xW7kGA@$9p8*L{)lDOK7ym1aBG2nY%oNa)ii zb{#Y@hNMb`&`L0nmaSNq?}~Vy0G^^D5r<<(9r^EgP)Z$ZRDK7mdukNn>%lfQ&aW13 zTTR8==Qsa`6O)XZ8am0ON1~Ohwm0dcWjBlny%OJsRqVz6j*Z$X1Ke9tWE0~t$@vSt zlrFN@^2-2d@_BvLN=_*BN!)@F#~H!igA_+0q9!&mkQ1kBGzNbfFRrI$?{&9E=Y5E4ac;gwppvT7PH-A?e`m zJ0Q%jfM{+Y3LMl$FAxdP(zF~{2}jd;=+KBszPW9hW3n(5WsxlBnR1FmZPC(Sz;T(G zy;ZY5fLEVn@UeRy|0)dj)r>OvURkNt)0rAEY>&zAcZD~ToOiaq)qmpcCU-fjIst26 z1xCY~)XiwsaHiFS8aLVfyLij{wI){>76GO9s6_b$2urhSF*kRQF@r{f^4k0B$b>N%4;%cb5Cd`vf51UVg+NpCOE#kT%0wthD*-pxXj9Szb;GL#1(t$2 zpuzJ%A;j*3#oXP~b7@eABNe7ENilOWO(q3O8syqbV5?_D<>Io<knq8NjvsJnM@ zh2`qkyTNB=LpNeW-KGy3>A0kBn@687AHH=64bA}EtWaW`mP3G%fILla!HMx&*v-$Q#(xk4n)`gnq*|H8ab+{?e#;Q zle_b*>O`bImh8fsKYGkRC&O#KBr`A)qS}SYJ6cX1R-`q?k_EbF(ouNaJc3ipBVfoW z^N(h5)?=a#)CfmI(2jc7#5;UIDZ&bH(C70xT5< z7mz3mIK=>S4J#+7W!53!oK7Ay@#mPi15QV~o`hh1cW*!|jW`78+#&Pc&u(n!5ZOQX zegdZ{Ot{dpiPk9c+odi;sa=G1$sJPhJ08pt`g8VxlpWokW zL&+o*sIdblz}N z*!lQuJiW{N-6jJtPNob6Vf?oL=R0s`P!K+si^X!Su5aoZP&c0h%V`01FYwuMqBvn@ zRu(QEo-y{}PjUFCPw`)YhAUXT*P(z7amq|ShvR0sXYaFQP6kR4MU1-`Z}M=d(Ac(= z&*?qJhfNC61vXX@agEg!&3<3;ml}Oq-Cz`NumGVJ#~yJ8$4t3TjF{~Nm_$G!M^Js7 zp^?WgVHX3f2ny)DV`?N!=IgkMO3ez|;GNH|?l8ltu99jBc$_{_aAz$8#|6Al@&b2E zlb}|5-Iy1|TPebIqxZ`MWzH=Qkrzb}RMdb>T4y1YlYtvXsuIRFc#w8EcD zSV{izV-lPwdj+)En(Z=^nQ9aNn)XjQN`TiCmcC*bW@oqHxS;Jk&Je!Bs5mj(yH%?B zrn|w(m65&x!=9C%|2g;McFFl&gDL}P3@rbXz|@Jad$IwJ{`3h!P}?SF+njdSX4+R% zBcHcX`<@<@34+^Tn77kR1)oA~e~b65a+f2}ZE<0OVOGQyA|_ni{_oQV7i!U@KTAt$ z{4Gt3R-3-d1j53D&RARfjJ7N!b(=Y(&AvJ;gC!x)FQI`Wzv3c|k;Qa_E}#-pb<)f; zv={RX3kE|W1W}5JZBnHY>s4%7xAdx?gSq)#&)y3YVL4dtT7!Gm=8%8Y!1(qcRm8Hr zyTr&KQAEc{Lw4b33?t1uCRQwUEsNtbiSCEQU$=(;%?lMID%OY>D!ecvUu82HF}v=& zZy}sgv?~z*)*Yh32Mr^Wbi|lsY5=B7)Qq6qvZ;uvKw5LwiPsJ_z>FZeuaz@fGh- zjbBo#Y|_gM9hnjcnm^Q*Xd3#@>m`pl3_URFye-n8`HpLF7k^Aca-S?%M13KZRR-&^ zVu2=!&8l%U_DzVyjmaSSm4Tx7`1YSHMJn4gN)wBac<7>;xqO$L?DQK=XdV^2+3e-g z_3tA>enon$Z&7i>Mp;$gq^^3bO`kWTwQPNDeK2yjU&`hAQKLjXFswZ}>E z7Jp6IcsOBkY3SShEG!~p*0_(o@?D6h^m{(~Ofx)QcWNxNChB;lM-XgnZS@e0h}dx7 z=6jH`I5$tzBz!FRbrYNp18GBF7A)_j>`69(fMA!#Kd9!_=H8pPnT?ES* zvPn{jBs`ic#QK?fHL86Y5rqu3fzajd?1BnL8yk&uSIc4=%v~uY!mBnE8cZ;;&zvCG z<-PX6cKpK?xqxpLGZ%)x`x>H$9s?~$c=n7 zt`mIRtafCKt|cec{bV3lb|MPOf^5KpkKWjAav-CC8eXfbla;q;AHTn;bphdXa_Sf( zbWb+Xem5a>GhlGD=_)ujE`Q?kd#$XS^;v^UN{}p5Nx~qLY)^okrP`QSe}SiQN#&Nm z$7i)h>!Rg`;Sxc-Mf;XQn+21g!M+g)%be(qI-l%J+D?WA%v=2Gg*dhw&%!9aQ1}n8 z-t+saeD`$xFcohY3_AI^Ss%rsT=1cN}ic8Mds%q?`^ zwndii_H|$fe3~zK3zHuM)jC`KujJPsOYS7pM$@r;lg&~!`h`ejH%nIpd{{gYi380r{5*WWycxd^9VOfey{0{Pnur$g zcWbpF=a7hHtHQkS)lM>5*8%t0>0@C6mXUBgr*l7<*V;DAox(=^qqLJq2X2Mcs)3`W&B5(5e>O8Up z*P+8YwnXCSk9~rP)o`=K*vKkZ>QR5|`yI8Ykken|Q(ohbZceA!9;LNt)!4S$0Ad){ zFKZXAme_!&?Pl%3T#r{2Ii7#B<2<60eM7;}`7(0;p&ycaZmj1jKNFAoPoDSHxpQ4F zYgP;vG>jwu6;^oI;I6G1_(XhBc9JYd z>w&L?_G0q{77_#8m5Hc<)MG9cT&j1h9fJV~LYDHve4F0y(m5$j->x z)mF0}+EcQKqvWWwI``6ory4qKju9tk_*)~UhgCIx|6E*^DDm!G91LP$Utu&fIi`^W zp{WRhVXhV?9AlztB$VWyI>fvyt@IqJ7Xxe$$CM@QmaVObr?X}Ahpuu?M_ABq9wb)h;+#ha=CpuHDc

!f7ZU25T%Ee=xtoOVAwlyNkCGk8~>xSAX^xUx0;5WITxD3DW_f9*5 zUUQg$L_`>@>G@#QXgRNYI2^xZOacjdvJV^x?uqc3zjn&d>0q$5*=fd~dyzAf)on7P zatq%wO^etn8I?lgnd3ZCr%Yt2Lyfc+e=b~#o!{HT zjg`rSWK*w~Gy3H4G>Br}iTdy$gc`78lHN_cwq0RhJ`qZyQ1@N*+S*Uk6xET@N) zq%6pOeu;TubsAWNi9`#Hh%}+huhH#hnk3rXCfS}sT{vzmqbMX%-Xw|+YSvQ-gG0gt zMQ3@|zu}4uID5nyZS=FqCF@R~VIhoBy=6>%jyGI_;RG3L^GPgzH5pE6Q${K`683t0 z00H8+48xhW#)-C(b+(oD>oeP17v-UPZQ{NLa!KU&{68;X9K2r{)LMFaW?D6?D2 ztTLRi8$c}SyVA`3PuBv>mYh9JpSKddj|;5l6Aw}%?h27IK@x`1eEr5v_)$=`Qh%ZQ z)Qa2?4gP~aBh}zM)Q{y74NY6`BTe+0S5pP^m_b}G3XLQPvrU|X%Vh=|^pF`Uw^0~1 zM1gz5P{S7%YD0?zIXw0mC9CeylLs5*^4~k1wbvrj7_=m`;9n-7IhZ|eN+sf$s!Wl?BrhOFs+C@Z~d0*U3G!2 zkmFC{PTgmUo#Gz1c;b+<#K)-gmNUa#M0q)#mK-rWMCC`sV!jh-+24D3i;5P#(7E1H z(Z}N>KHtS0yx|LP*bO`aNKY+V&Wwz26Ml(!&aGi|WoR?89p|(&=L#|Caa(u%n*1Zu zqD2PcA&j@r2EPx^=+HqDos%k^_ZP8Mhj!`O{0PgQnr7Gc7{$Z(_+2CR?L#vLv`CY$ z%byOca&_hJg(EY#dfV%F1A-aI$!?}Lq+C4~OjFHEw`@7l#PxrhbmL{o7$aEeRze!? zMYT$zJjlDl-QwwKG1XB6mQx(t&fA&!6Ne@HqjAMlYV_%rVTPKIM1IdR)3>|vE(h_@ zZ97APtjsrbQ(WqoK4m=lkDIFI?-jO(ZbZ$TdDoL@ILZ->anRHnxx{ZyyDrr;vNNwTxX2 z63c*NBJqb<7y(wHL(buUP_weq2M%(~Hux{PGmbV4LdjGH4iNR&C6;31g`i-}0;U;r zY+OOGKxe9`7nJU57kE`VjHqiv(lm*ho%2$?t7b!1_GZTgE(~>-O}}=Jh6I%TVrJ>o zk!QLK4=N8*JYT~Or>ot;=Yi|fB%4)2E-RG@8V~uQOc3?oBkkpusZt&q4^m6-zU8T^ z(ens#A^d9Ysx{@txgViW_ewr}b2pv85P$GWl?e#-|s9l$f}e%*T0X^^ZkE zQ9jIQMRHa8bkDeG5mIaT<xscd6&Eq(AS@=8r`jKXzXbQKUJFU%5iWE%dgo za?VxYaV3>!@1KR~msz=q@ruEwopPw6w6(R1Fa&j zsjl3mubuS7J(3gv{!13-PuU)ALNYu#(foE-Ti93eusRIxPX{xqO7glrP# zzQLP)z#IJ_I=%}`=I`0ar__Bs%I((ed;IC8>)${1d~&h5Ws8@*+1v1QsW@Nh5!guc zeW=#I@XiL71@=ed{VSBF_{a&tz{8CE|Gwn6)@}0SaL-b}XbJtm!NtfFL|U|JRv8!! zayLkK?jsjDh9cWUifhJcrWC*f&zs1g4o&9>3#5-+vr!qSyumJ6IRNZbjkw|8PYvWpubcJQ~%h7zPy6zM?6 z^JyI8^Mcsx$vf26+kA4Mu?ecR_~Sp*i;lg!*r~A+!I%%x0^qPy-Se!YM*XnNWD_`L zFdHtuUat7#@D6Hn{KB<2ZY*5hF)^J;ChPTj5CnZ#)(>KSfGz7+26Ve!UDI*{1I=pX z|MQivSlR3Yk;FdW{e%uhUA-F37+tyM=;#0^c^v5)Cn=?pl|_T< zEmc<|0w?kUK~m9325AB7d2roqejzbed%?t<(C&)n8EDU$e9*y9hr9+ZnamE8E z-fS?@xEDASPFMgTaU#HY#qtddsWhr{x0VkLrphFv*7RID?qPaQvpHTe0|4#7f`A3o zrWUv!z!8hW8HQwOj-?>c381M%5+V+clAaYHPT4~&+eZVGgxJffl`pN1Vsa62Gh$pz z39a`v=utu*(1m9gXK3=^bYIW|&M@F(4 z94F%Oc)Q*1D`nWWolL|8gL!7H44K@BjEzi>kpwRH!1 zpL2pGy))neks#+cYIDsXG=Yq37vDou{OHhdu~gz%HX4n#DwRL@-gg&}(9f8~(TMbX zY}BvFpQ)}TrQ|z14ou*zk%)FX;^X}AoWE78%XvDALUcyRD!%Ek==8*NU($~vsgM-f zTCcu(>wMnwag7=5A`}dKoE^$1Hc{tY$J<|1P;1_VE!^)=p2J!$2d`YtEjdKYzfpJ7 zV?4kIR1qMai`7ss+G1Rr_HYOW6*^%cJWI?)ioDLm99<6HGi~ph+pQ~0guNU!Zceqf zhI;Ec`^2!B^xds!qUIht__@Tp_(cKB>GGQ7kzK?1qj`?Gi%Xh^y=^e># zwM6<2%tSlBLpEg=S`!CnQlldgcI11>hyMMhe$Uc5$vSnO!}185!Ffy&iZ*@-NTZ0^ zq>bmJhqWukp1M#hZ`7D;-EI}fBY_kuph$`kI0i35bkonIy~r$Z^EqY}5yx3Uit(3R z=e2eT^He!7HAqDqox{D?8@+6+nInmOuHborg_2}|$!NgntwEZLfj|$a(^R~?x>i_Q z_|(%+|J9J$UyD4!hfL}8Z)|&i^9f#kulMJlfBua(-k@pP^E}Va%S$KPnrug{L;izMOT_^6Mh2^@wqYryNdoBNcl0|scY<3l=@XaUv|>zL6rZ9-2p zk@iiW)vb0+RaM`%><+4ShUM#`dJ9)Jpi#t{%OQC+EN}8wL$#W?ZhMyB@`WyhwS*sI zA;k_7e6AfH-=K0WTxz*nDP2i=T+ZP9l~X^fZ(vSP$XJXw(a3A<1az>!q6?dHjT?YTaHZoz9>r+G{mm zyLyokc+QvFJ#9Br=u8~8#mq@Z!5k8!0b!ezL!Z&fJ*71>mfO_ygB$aW(UHIV+0V`n zCI(pN+?98C#GKtp0VyF897oLMB=x$9>2*Jo!p0%pap~*zj@p*T#tSp9-zsjEC4r|X zI+2KLn%3!b`fORLREk6*qA2!bozZBtA9c-Sv%cs4(bv9pIW}}xjF{3IXSn=3UHlhn z3!KuDKK|L{)czauOB7#>k^xQ*W<`<&BV-Bw(a$}#y=IO#CWEoX5|xR;j(-@kIH*)3<{vGZrn{EPF8 zq1p5=mQO`fS#@I9I>tY*sL{3MzfHhkI-<4L?*o{ydvDuwNs4ddxQ4(g$-{2_AgPI* zfTJJ)B#OGOZxT54Fw8b>hG9v{$B@7eFpOmg2w?z7obUkGGhLFT1D|3Tp5RzJ@F^7d zIIk!z3{`M48G$es1~`dnILlLPfReUvnLb3Zpsm}Q)iqqdz(kt3CmS-0F^XxLj-i@z z7{?vY_901AtY-JxZh%8rwgbCbeAF{YDTrorRWWzI86dv1X&ar&>Ji*+g(aj}d=in} zT+$HZ?-}s5g&UtF!t~xjRaT=TEItVGtHq)zZ3Y4YGVT z7K@i$S^x#7;_;7C6w&_)nWmY`Q-^} z-@kDAbF^4qd)*-!+x7+q25=m&R;!szrk|CVPA7Kn+RgdlxvTHmp;bqThP}PM<XerVY#%7TM<`xmlPI*YNDC5%FO1lA7Z2Gq zGGQTm9I}DwjB5qH1OftgL+3)*C#^&ijeMum*jSwxH!dQcopuzGQ8K<0hg#gac2LzR zaY%_p+5&_5LQDzOO|5C$Hq}XYIv?TqhwmJ1)UUYCddIWZ42rMXi2&Vu-%)g|VA{dU z*yuB>&B4ayPsp%3xc^HoeM6iE7v^W8qyRr5e9Ff zdNjb(1KD?6TGO!$iWx@&8aRaS(Y}=c#4BOuOwZ;`7+t#fsZW0L!-LHJ*YP)bU>Nqj z?|tw5`SSn(-}i$ccy}Em#(_(IjjGTjs_d>#`%0lPs3P=w11O*Zave?-Hu8lj^3VtjUJaBY4P!c#=T^-)?qMj3zBCMZ#!M z4Y*j@?(Eq&H8nfkY&0_2EQVp_a!KU)cC*IQJk)K=k|)u~tvL0%!LPvxOInoW`WSx` zqK7NjM3H+lV4kk7cM0l_qemH%3Q3WvnW^1_!?jZP{0)D0X6GkQJa(z%wIloeh`eOp z;$$(74zgmX%--OYVr2`8^e9c!uU&tAyf6?8N2}FZCX?<9WW-{zeh{-?8PMr;Ow-I{ zGQRIU_k(AaTsV_vcOeLxiaq0@2iF!J2XHZ0NKcMs!jXJ9cVm8iv)854&^BBOAL3|C zb#*C0!+@|gZE||N&&+wAS1ydlZ z0>eBDnmEKLn$&&NurU%RNP?y@6lbXr6D`U021bcE7mr6;K@i2!hGVvMn}(300JQBM z8AcgYB2gN_eHWK_N=DpX%P9x~Nf2!twE>7SbkXsdAaH$bt6iV&Er}#WL??r2{InvU zY_3u+eWBi*RxKqikhcG~)RH)ur}6{mb-P)=$*f;#RC*YO{=&~ZIXE{*B`%pIw-@-`} z1vrV74g1pk^1cWQDWIDj3=ep{c_@*TB4HgRRt(ZIj1tbY*L!~lDZSCQb{%_QAe#z@ zquXqmqN??JJ(I~$6jiEKW28qeoe9k{-@dj`o@*yklF0M1c#OdD{_6qH3*~YtKU~O) z<0}`gYzen8-w@Qi5Q=sA&Gn9b=g57Ir(RmT0KLF0ZoY8+MtykniEe8nn|&kT9$lHc zs{y+E?_J#9TJB`Tz1_qI}upsal0tu+xW{aV^KH?bjV5=J-0QFEt?+kRiDPhe{8`sN# z6G_gAyOjZ5WPPN>IW>~OeKl{jV=!+7!*K@_ndSyz%ksbijJ!@0sjeBbG>yPAh9tUS z8)a}5u>eM)HVG|&DirENC|Z=xA+k)648$Xz=MacY0tXX3oF*aZV-W<}V_p$@>Nj9D@br zr_z>!oFqa&ZfR5SdI5_?okPDDKI%YwhK-0AGFx50!8OrZwUCPcduAB649bBFohVJ- zYnj8{%`2;gahLH}wTbBURNHDGYS(w}&|JuOH7Y7wF5+0CB&<8gRIxM!!spyZuCnnM z;hFJB7$uX5u*9-G)V*PoBu-=zT|fgKLur6UC{d=2i)t&{wnEEupZes}@UK~&;eQ<; zwqx6@^PAuN=KTD8pRto=dEdT$yLa#Y@B}nJ9LOwy7>2$4+zYL1i?hR-H}jOr?Ft7Z zLUtnvJ}-;~f!hX@?U1}~K*bIGpa$V9^lbb{#SqQWpG z4oH#oz^+W38B4I^!_~szvStsEz1=)6Vq_;2T*nzhCIgaWum}xeH0lpvrYf-(Vy0|E z2|Cbk#qE56qzw;HmdXYV2go^%N?e!TF5_Ek^T zp`W5%x#k*~`tlCi`w5ZVy>Wg7$`^4d!r-$zcHsorSl<{N8a%xJ5MrxGkKg-^=U@DT zErZd9enClhV;9QSb;1UcH^9w_Hm1|gI-*FK?bl?vk}qj2HW`va4im%jaSudbnv zMI(+Z8eNCUBLdAr1q-Q_t;4$~S%y!g)2{2)YSnGy0g@#9>28K;Q8YO>zpf=YN`y^! z0U|yyX&#rTFy4UI8uj9y`2D%jL%oB$$d&Uy-)i}T`F1#5veg?7*{;|ANgxU_3a4oe zrMGmGB_h30r0qLp(^yd9L02PzXJe!!ggYoMdme?5I8B(QZI}kY0ZWONIb4f+7XG0hx~$CFW-X9z&@6i$``TnJnOp;-VO z040`ZVc^(WgrrzNP&91YF6tN~600~SPBIKb0+O^%mnT3ia5i-FV6zlsf)33f6t{tM zrmNjRVY_PMmT~|wJ52n9ww@9rMlQdGi$=?h`Y^g#yjg4fpZ~9aa^%n<&-Xf=P9~GV zalBkEvkaFnh7~v&CVS@ISsbE-2Bq_Y>X=cmzOcUV|0ultt zV5q6AE3yaCs-_MGjT?l(_<@1Ao+XbXC{Bi)`xmghs2Ke0!6zPm zfMxkkr(;=GHk*|d#kH*5zyOXD)oNuZS9s*uF)tkX?xJ1kd8y*{+KpS2$B(8Wv0|wd z4u?fitX8W4;1Nj*N2O?_z}rGsKP9q??`5Otq`+=ms9eg>`&`>Ms^yEM|2EA(xVFfP z+_P*xzj^V2=K0^2?!9Imo!|%&nn>G3*U;#MI65>E z4u}8KZ$6hpg5X>4yw%h@d6z*Ae9$Dkzzb2B4sMj%<-iDq&_d5?w6Ru`@y4+ss~hq4Q$*-JeTpg5*4AH(YT4D6upeK$~M31W`pjU)OfE$ zv^Bs@w|w6VN=%Hjvy@>vK4S#@CY~!{g)Ja)%4ii5J;V)bb=6}fRb8ii+oKuXaD5lI zSjD9s&xk_3j)Z`ZM0}>nkThYVq)z#G!NlS?u@xGXfqkB5M|$0ZOa1Zr%RhK?Bnrn4xu3{w9G$jhL zkg$K`$l(6N%L0F^>sa*YzenSfMo9^ej0Ul_7_v@+JnM}^+JOXX?0iKycu!~T*39mg z8qG0684_uwFjgE)w-{$F5_K3dPm(#X+Ogp7?$&t`XI1;})aR-L+^bXsx4qq*)MBXj zt5u)OzD7^%@WC|RsDu)WLL@NJ2?oS?eAzUv84l&(V>pqd2_`^293fCj=GaPQb)t5` z+HC&pC!Y@f7c%>Q9x_8wwApO_tAF*c+U@psrNZ#=aNp1Be{p8F-z@~i(C40gyL_|h z?fBt_c>jx;2VJmli^yoc zqjxH3ukPb62?zp2B$vth;l)Up3wW6j*J|~YSsxAHkdZGBkDo_4w_+kBju4Q;vNM4u zNukY9wnav4JI&O!;58Q3!%;_`wztPTzvqbKHfJ-+1f zSf>HQF~E2@=~)#G4OG5I?!ZD#p*H}e^T~X%XMXI#`$>i_7K_nnRN(nWy>V-KY1ORJ zK8caI=(8e>?@Kkx)>*!}lI0NCX&?2Fx21wqzVWD6{z`0cuG22PeId;fge1k|ae#qJ zwX*-MoVL1RPj4wAoOS)yH=qA* zqY`jruw&;Anx;O$mgRCe({Yqm{flp(E@uYrcg;MB-Uz3!mF-X0FVA=NAC;?w0915z zb+ed^`GgE9iXNYxx^?lEOsx-!QVYarpF{{(EmzjtRkPC-!=faGS%xiF{*%IOqtS3( zFPqJL=_jvl0C%=9!LcmQku7J#cl30Z*&(H=FyA9r8?|$36z_D4kE~x1ckeOcNsHoc zq1cAjo+wrxWH~J-Q8YtKp<+)C2{a!|7`9cko0Q}1B3TfQ;sC+y00TgRi0fk{&Epux z5||5c7yun32uSDzq523JkY0ePmI00_Fa?_s`cpf~}11fy{ZCmD2w+ZP%IW>@wg}oZ@z;%Mk_v17;duu zEu|E-J(d+auHLdh1Titp>l%7e45_YHca3-eeNNJ$15m&^_%QI2q{9SWg-fq>p=DX` zEB?cJWeRuJsPreFdWxp$?I5P(IMuE7=TE)gRb+`}aFPgz!}Vq}lgu33HRW8nHKShh z^Yv4k?PI&{K?x9+q-wQ_VOTPmlx3yeYEMm1>=>J7oK#I|*?i0FnUpty#mIK+oP$O} z`6J)w(vi(e576e1!UbvL<|j*UFXbX%?<_C>-|YQolwJ9G-iiLh&iUkAIRRD3v4KYC zOg59qZn7zwq%BHg%ktQg!`O4LXRfb<9A-32(s(F|lqpdbMT)7(ZZ_FD0cfBB6k;J% zJ~^L#&dzy0)Ky=OWh-4SP0miwbh};4vPz|rVHlq2oWFQ(!{{Zw7-4D?1_OgYU_>o( ze)rCVhtv=&1vy8Zk$*LX37>v-c(;ht0tG0<-XH1yVVUfif1aUzfuzKTw*G^-- zO+=&>6i76}{`UvO^nf_3cx%_!o_Xr&_sQ)4o@7=om;d=c|L4(WFw9R# zL-QwN0{}z_!Y{w@?X6qu{L~Wgtt`SLDRx_8`;dXkF&j+3{hIB;7S-RMjG)u;xIPqw!-BuK3XV9LY z=$sIHv$d8)RGQ>u+7SYsNgc{(v!iHO@$yrHQ74hx~^Vj-B9vLLt9a-umv3&X*SV0bk>VbW$o7DS@L$*zeF-CP*fRS)Lok z{nbOD9xu$h*#eV@>0Zc?u&Q-)O>0S708*SJ$&G-)R-2WTM&NLkndg~~tBFV^Xqpav z#FGfI5suUVL?IDIC;}w(p^jkRw!?^w^JGg`5sY|>Bp?70==%W(NZN-88ytaM&u19U z^nK|0F0dhvwj7-c(I5gH)6Ebe3ZjstSpvJB!4Nb{5iCW=IMzgzsts5y(*OY!Ie||> zGC}})Iz=$+mPgmN?i!VEljK-@oJ>z|L}WFxR_&?aU znwa>}+VXhYcn;Gi+uI)rv=?peGoSsO$aC*CF%3=M+}QZtvn#K^)3M)tYXtP8$BqqD z)zI`@KF`tY;S)z%A@iCkzF8qoOcZ9PCu_AD#yFG7>?DbmN+sKN>dpGT{dO?1*$}QfaYMcE#y9OJ(v0abPt~Q4s*|?mK#lAQ5%w2=3f^NREeeKf+Chndd zfBo9pn3y(0dQn%Kz+5xX5+NEaI2vRt&02ag8+zf+FkHLUN@p_HZe2aw-^{s!?Ynt{ z<${1DB{y!o9j+O;o%9n&kIh8+);LNHr-*IyViAJNChb)k`QCu;X{uqdqVf;_(XV$b z@12$|Ac?Wn@sZLL{h~%Ij&y@aRUJ1P8WlKo>fy(+*)X?XZf4vJ8BIl&A0JV&mZAoV z&=;A0mKkLjUEvLpcVz~~_%Ou=amhlIvmi%HV{m4Ho823qx@*kZzxTqsYXakq2a|y( zjTp-yv^|a;cUX*55%yAG#PD{XPPXO!TvR<_GJxYfW-n&r+L1Gc_0!Q zCzRV^zw1%!wvrpzQ|=1aU42~Oi%H*Z4fh^6K7Q{b2urVat+h7Rg5LQsv)kog&7ngr4Jv0$`6t@bYLFMX#sxOdRn-Toode`%zz#lg0Qse9b= zal*aKFxPZUJN=N#H+gDTlxfrRHzNHl;ARavFYzz9gOLeo9Go+SiHIq>rSsqbaO_3D zb_Sig3f`YH`@bcbUA=ns zD_{8v#`wL>(0;%F@sEEzpU=NfWC~Cw8xQd7G+4vpr}A6 zh%O&*dwOYfYYxCjXvL-8ZI|!1ToRChNbrO;5qUH#_DXTm)3HCu>T8p3eI094qfmAy zHyAk#E9s!g2SZt-1tpV}GtUk-UmktK*P4_SCJn-sHbPFP0UvUL)9bw`<|2p zL;|yWI8L~4akn5zvLrPc4TNzzm1@@;ZdS( zk9efL!ln3Sg4VmQjkWyy9{MnIcmbH+zxw+3_KZ!4Eb}X0{nd)Seux!otYC(s#I94J zOTmJ3lJKra`_^v$%ec#_X4o%Y> zX*%gR|Kj{LXKMbb(QPrF`o5jWw^nESH_WlUr%v8IH8r(=YMvPNmakt{d@47P{YdR< zjRGYt9XiAT;@rFM4AZ58l%m5hmf>MKU2Znj?ef&@bSjx@wOTeuMf zJQtV8W9cLXB$B}q6XyzaO1O<0o*xuYG8r3}r7^O&hZ5p)obM6{gOHBgx@TPJ4j%N9 zZamf^>3(O(%c(8H9cPj0HA7)+U=N_H0++)991;}J4Ve)Di3#KaNI`#uU?@^74LzEM z&!_!0*4%9(LqH6;u0U45GND8=)n_>e2fsm!B z5K#aimIWANh&&KE0Wr{Rk*DhBPz*ymf&m1M4;p3|(Nxf|44~#Zt0>TD@w4 z%3EwHv<%VhYJMFK&@oIh5|7a{CbK!ye@B5ek=8J>}j-5ENUD?z%T}dTzEc2T$-I|Lh zmY3h0$YwLyTrv??RdqNV7K=sC^V;q9j*+J2m`C;;>NG;NcN@e;TMZ^lFV2V-pOSn| zx@lO4H?Hgtv^RG>xmMf!j60ss%pYFN{Jo$1nYr1?37%fLw#9Y3Cz=)mL=a&n>*kKd@Pid8w0fTbeNPB8o&@!V$fjhA2dBqkS;eR_!fj7#x(otSiC zm)13FYv}o#A~W`_OIzg^bZoj>WaygZfvyGAA#Q45FhIJ7yK2}O0d)w5M&#HbMF7kY zNl};@PsS!wUcN9Wl&+X;f&@|TMBf2W4QnnytJQU=5V#eax zSTvY(0twlfh%jj?WZPLNvMeK0U4x>gz+_0@tOtS8Rr-N>75TAY^}wjc4ZD*vm7;7d zXe1}%$=O|g9h}}EH$AQd_%m^45QPk0(19AKHX$XHkR>syPZBH$64)Rpz(*q`*Z|#) z3FQA%A<6dalb!Yhff9}*Drhc;8OWzj&_cF2P58Yz?hPwK}&dnseT1Ned&y4}5?~jU<*PyuN zVM7-CL0-i{1lYzcMY|Zvnn{Zi^&KN!wb}}JN z1^(1TdSSfKWQ^19IlpIy2oba|qlm^F1qm5jkmG5F7_*vF9E1v;9$y+}4`08y89{=k zJ(eCxD9<9+NF^~2B~NwShF}s-q?sW|>r!H`km*t z&BVm)BtxEYqUm;!Ey>SA$gW&ECAv41)PeHWPf6l$=L)N%*%@YRd$hb>Pkvx__jjet zcg|cItbFgzTbIsq2#*y5#9}@^&d6DMtWP%&Hya@=*~V>LTXT&&+vH`-4aV#lE}oNw zc1RAwAeYab_`uweEyJo-hPgtlR2nl)v(xJ_1p2L4esn%wdeZA0khmZE!eG1pKy@~u&)=lTPcNjLP& zT}d`ulCLaZTbP*ieLIX`E|+sgqhI>szfH~^ot{a~C{mI_6e)R#GQ&vXvYEsL_8jcD z`<6}tKFjeo!UQh{e3~Ic2a!#EV7o?hxOLJWBNYY!kn%@O&muWyB0eF=sZG5nTV__F zmyJMiNfJg_pu2vMBq@L?0Rwwvm_jaz7j!?q%aZD48;ZXb-R~3Q%NvzHXZei6{td7;q2-z7<1m06B`G zIF`|E$F)WS04hV{V6URcIYMCaGxN83xjt$VL3p*XJ*_q-#IPTtd$c>bR8cL=-1O*Y z+iJGfJjJM2*J>aA^fQD0KvmTp2ko6qEm@W?oICfXX5^&wXwaRT8p~v|j^i|&&2&1A zF-)eDJj$FqcQKKzYMSqxVn3uImNX0oy30j=FBs@1X$DvfO)AcAj3TqE?c+Vh^(>h# zU%RfXbvG30N>}@NyK$?m?)mV?_UvA0x7(&^mP#c}*9^l5Z0pMxU%!jGY*Er3JGZvB z=2uR)ociju8$WvCN_r|cQ!4$FfBGv$BP^CspU!t~o;!A6A3-sLp*mJ7MIdT6n(1_! zrs;aU&N6H)5uYfPnybCl+gB2MFwv;*K{3qZ0fNk^w`(AS#bdAdH;{3*p{r>(`Kd4b zG)<88MssOt>B#)}#W&tihqOMfnaA@2g`n8twnky$nUG!(p*dAW34_ZA})^ z-@Et<1;v;(jOldV0e;~6;(UdeD@W_=Ncvc6KD)>Bd9j`-e2X5tY{IS=B*9?6=!9ux z`&4&!=@m@t?_Op^E{`WvG_uHH(n}RBKkthH^iFejAFw)VoJ55%%{50GB19el1P)SS z#0lYeCQ26QsXRM7Ely2|2j+7VM|P9be17jPI6bSD#;+wNF2Tgx0sXEaZdju1MJ<{S zS$1%}9VHU8ZZw2(pU}E&k4I#|mWD`HS$10x7u`UCqc~*deVr21^_bKrWr~b*M0~*Q zlHkyVz8&nT_^X_GrEVi$9TvjX{IFM|;}6eeVPNll;EBY$rBn=#Z&LlL2&S zvP~j4#tbu@jmX{v0<_?4GR#E8L_UiE!9m&s(W%bn`E2r=gVrZB-xiqH@ySl~@J8yM zRVx#d_(W_jlbJme^3ch*#P~%l7G3*+M8;P}@o;!J&PJ45AW@I>tE9MqQWGL*K$oUz ziPR7@gdxaz{B4hYXgF@}I(VJS4}57i%k1XTnN0pWqtRBUzh7i1&mvcDKJ)a`e}N4E z2qF4!q27nEKj8^}`O9BEfByUqkP!s2!?L=rf8h&X_z5AipNw>-2mk=Wu5AIWLyeG= zOsgY}yfZm$C;jMp3>K8UIeBxEC% zM2H96Frtu0i#UzzZIT<>w|qUdWj0&2APk}?%4W0OZZ`yAZe}*OwdxYcCnOJV@uIA! zMDKcQD$A{B1L0Mtn>pr zI3A5nxM6|nwYlWI?u3(5al4+iQ^NG!MQP#7z1wkcp$}AXbI-o4tS1Ruu0#y&+MlH9 z*u^V>Ib~W_r_;%1 zb5RsLaNpyj_VE1WFO^V7G9MUu*Is@8drJrRBaXgja`N5lw_e4&XCjm8g>&Qa`%c~a z)w7p48_(qhp1;{Fw^k`vmLm$2EiYmai!dAnAW16@2s|64*(D#PTXF+zluc>g=5v8Z zCOyi>nDARgil{&*) zJu;ItG7XR9m=G~EhyoBYl&EQ@69FGa0`MULS&H%l-}EQ~BIr0CgIdYu6yY`3%xmDwLlg3!H3Z%?w48PB@}d&BFFs-vHyy_*iT z@BaIFK`d`?FYMX{0H{ETv}?fmcySi(mL4|cj8g23bB!t|35KT+G-TDi4)_x-0>nt3nX ztKDw-LHL=^e)`5g-7d$E7Y7#{Q5|B1FxUtNZ%}CRPJAY}Z{YNNb(_5>A+bWU*_@o5 za9z)IoPYRtf8n3}yYH@dRZ+(INUu?Kn~*0HV{g6i!&D+k@~l4SuQ#<#RbN|guF7|1 zM%|DwAO^SN<7brA9Y%h*yA~4~S6I94-g_1PkKclRyA!Q?+q}2p!N8)FY`42A5X)I+ zFanq-fTXyFrv_VVAjvxYaeCrya%0zK zZMPSHi{e?sn6|fN!`^7E?cFm@In4B)yV(4JD`%H|2Ro2z3ehTQJglAWfc%SeQ3=f) z8Q-88gAJpIxJAa~2x`a-y~e(#bwweP&VDGM<*m!_QiUC?Tw&c5T|*9-*mJ%VrVAV zL;2T|q+6?X1me5(y*`~Mg_dfBkssL{UbT!l15W21owEM|=}bFkcDvo)+}!++8tDHA zpEON#G#dTs>IlX=SxJAEZ~rr1GndO9J$m$g2>Vaf*|TSN5N*dYV+YPEl}fc*Ef$ME z3Dbu^8Ds_l06>@@i{3rcCvHylW1^o@6{1h{vQGZ^@CO!2y(0dV^JIZA6LI3@1y^}f z%G4wJSSK)`&myZ^t7?sz(oF8N;Gwg*6?=2w+kkhh4jFAA3wdE+*bZ`zKMxFoeqaS?Y@sIj`;QL-K zm)n`>8XFs{ZmzK!m9~Q-hxRG#S`h4Zx=*qFYX=_av^GCj8JrnEc4nxLv*HZb&xBDI z#SgPT*Y&Oj_G^SP?IS67*F^to|9)n{r}AHwUYIIpE-MHI-f-X znmZKJVq4RWc}uq zu|02e{4da;-lyfmCl2jdGEKA7>14B6lA_v;=JJ(`o#mHP$DV$t*W#`995W}@<14qC z1WmO&{f?5%^w*bCL`O&d4c5<=`mth4)10Uo`tF%wFFm`aB$$pHRCb*&BxfrbFI*0W<)g6s)F+9~J zcW3!#zng}kk&Yv~n`Lq`)!j0xmD+GY%DMziQPA~08#prNypVP*jiCq-KnhWI6xfax zLC+6S7}+6$yh3=u$1Y|fh&;O;L_A_hn(#Hphj!ly0fI8d7=@fD>1JRNK}=>L^fh;= zgCOaW8ZD3{fki_zk1}`pa>J`p~}2m5Z0ppT4#K{(JSv+^#l{Djb(o zI(E0@Cg&A}k2D8_=SETN_C>pR`ToEB+5i6Q-~EHPU;kD*zelHqD9ZlwQ}^6i>$jRKJyZKPSGW{Cz8ze;s`<8) zSs;^wbnjYoLNN@ZdcBrRCMkw$wd=d~O$~U_9FP$g zzrmOfLgIHj9d*4{3ESZ*$Q8W~10L2~!f; zxCYueH&lsHbZaf0mENV9Dmm!{AqfJ?CJA6Tz)OUl5Y#zx;POmFxZ?n*7#NtLNs5L% z2V4u13BL&=5JsIaU<{W{JhE@_hiBJZKM+mPQXF07C{?E#HA-h}zhI2F5j|!zNlqnw zc!MOM?We)w1}A0AvWT{8HlH8(ar?se={@SGa9q6@nhl#RKK1yMGBiCkpBcNqTD=9_ zTEwz8tm>e&x7Ciq%1g1l4|oFNI!O@(pCv$plG{v}@f>71(<<5}5noEU$I7)=n1y{v z`eFR=l^}OWh^1r0LW=MuMMDw6QVF6@0FU*EJzn_0MCotcTn`WKD>31D%e+_TmQk+= zVHzjaJKM)))`!}+2HR4^=NT`BgTS|vc(6A!xy3BK)WII?%TD92REp+69JVyH*Kj(= z-Af*M+~F|&=O;7Y_eqlc<~P6j^FROdf0obB&dz@9V;>8G0Au_oz}9d${NfkC_-DL_ zKjSr@efHUF*RBx+@jit8@gK*w?MkJx<79T^$dTj6kN?`Q{TcwE*X#Z8hd=z8pZS@e z1n-QWkS7NL08(r>unA=!|^#P~nhMj^Y1f(62!7m+h!o>mwA)h=ABLi-=UphWbIK<__8BMiA#~E|%zId7 znU;s~T|Vlr46Ma;A<3>sSDj5|dhw}O-2T+scc_H(t)Q1DsHtEKlcXrR7RUGe=tTeS z?XkHZtY0{(uiHmU(zY zoa0`sU*osi|GvBdnj?|Z4@8-et=Gmu9r~o zGL`;YPd;H9M!VC=X0sGc54)Xft=jKhTsv{_p>2{2xY8Q7MqOip9=Dyb&2V|+l^^)0 z?mD%U>YI%zkRGDI>h+HUoQ-p4VQeA+Z|TG4@MekIPs5S!47Uvl`vd`pNr7#dj$%4# z%DAkK9wk%K)NG|ytF>O2yTlqeLfScNWG9m-9@;bFt}D6gZ*6|#UiPDAih1?++TF{S zq9YGxCuk3Ob<b&pdgo)oB+?MTTMO_4=Vhhe(p#!Lm#y)9dw16JzOA z+O*7etDVc`D2l39tAZdXiqdR0Ns^>#=8*>;sBTsrcJ%!-znfrpmsnPBH9|Qt&nssf zqgZQA#4>6)N`#!n6)c($FTSxmuKX4k!RuR}CY_6f^vvh~j_)|G<9MF)d#`+-q4x~8 z-uS>X6hS~y5NMGyq<|~eu58}@*z`RQKXB{;+Za6h8_#|BzFV(Ldo9oZ*b^!K z`!~PHC3j~j1u4^C3S|e6?m0eNUw(UWX+cqxR;%UvexXpBv zr3yY6jLvSHT`|V@?cM8*M?kmU^2qcW_d8$x*3bRSr&yLLm&=7hfh5UVt@?!zJ^uR5 zTW=D+PC+RMWY6Z3>B$olZgq2x&;!SZn!7c;<#)T*sPBikA|h;Umb5L(M}%W}Rw{Bo z;P5x>X3w#21V3QWQA}@tVMIuQM z!-#c*fQ$eW`Wzq(0z?rEf=G&n(2Lw;l0P&*`q4&v0nh0P*;#v6+N#hL0aJu;>0Y-N z#U;a;5o5G4EYrC~jReTNA4;nfJ+dRHT}8I}7BRW)!CC7H@C=qLe&Md83rhYs>!5E+ zu~pKGWd`i5Le$p<>{Ko;bw|&Yq$|N2`@3T)aI!2A7GV*H??RaOFylEAgr<`ELvw~R zM!nLoF@Wc_gohUIrYn>X%Zo)wNi#6I={fTb5fjZc1w?JAn@-cv@-Z|XK#`<&IrS`^ zh`a!KuH#e=k?sU9twV_`R7xq)R7}ce(9Hfsnh8!FE0ZCeiC}YKRI(| z@P!xeTz&OfSYm9R7W~#->L^X#j@YK-KdQ1%o|c)sH&h5?%!``z92ayb=UQr{#Y{wm zz$WQ%4I2G9@nX5BmENT?oa2*$~AqYsTyiuiE_4$Nb zCl%A7JRUB2h?n9Of&u|u325NhlWO{kFzLDDiixObFmBuq2_35Nz=1_YnE7@8C2=3OLaxAluLoXDIOXI>TFPxf`-84SR|1&CK)V5Xq!0@IT~+vdCX3T zbcf@a%v@MqF{hz!qm<8zE@Sa&Q=SeR-=EtvPbyriGomTNBe(;EzaaEt=vF1@bnw9? zz+1#knsP{gY)TrxIzE4B?b5w+@HSVBbvjSFo!eaIzQ-Qp8K%{4XR}#~q8g2cWd~O; zZzPhPa+tg9(_@=&)f{R;Tj6`BC0cZ7{^+C#F`+qhsvs+rCK0Ga4>-bI>*`LgJlI?| zE8V@>xvSULG6hy-?N@Y^Fo`A#>|qp)2BbaonH*_vPbk9MBUG%c%=--+U+kD~np%!@ z5@jNyFbD{47b`Syd89VBpp-5zr(@#l{i4-#Z2&n-XhT2GhBql>WwEZB8^9(TcC^8Mp35h6V zB?w#@k`4$Uf}5>I+(9<$!2UpCNk9=^NV~u#{gA^H&7cs_fn%)M*7^_~Zmj1p1WLrq z%rL%t#nJmFINfb@+STKPSPSqchs|U$7o{euG&I;Gu5v)KR;LGQl2 zB1;rSojG$RpU+QDPS$EQf*>-P%+3pz$z*KXZZ%u^eEyHrGAR~|?aVl4GMUk6bmQjD zXP)`w!CgnUE8TM&SEeS$d_%9cEsf7n2!!rv*xX>Gv`A6cHNCx3zDsMqGd}(5`sUyE z+AWV*eDq`4L~Nj{g+iX9X&6Ko)~+tt^!4j+P4C;A&17rU8p|=Kj-QyD%+Bo}U);L~ z0&xDqa^=>gHNTUv6JGw2%f!fA?(LnO%^;(ycM)P9OQ)6ocKgPq1AC7@{=}30Uf1)3 zLZM&{)xY!mfA|hR{_~^TGo}1X=h`f_}prY^06W40m8auyY+#w`CPeEF^oO3Hy~uwIW|V-a7L$w|^9HS2jdM zi)p|E|JD{%VhJn;fEm)3g%fFq$htfW$w5@ZA={#@Bh*1BGj%O0Q`m^2IDiQci8N-} zNQ{ucBhX~yI?YpvY*I>>;I#-L0DVM}h=>T-LRk!H02}}~8%Ta+@D!;nuXvWeM25a0BM3A?**)Eyvd zV$c2(d01_Q-$Dj4;J^STV@$$pY_VCa;Te7F_TEo?gE;wEJuan|`_wzrK^jVIU!dI3 zpYl7iWQaL%g(o286DT`J(z8iiiw|Z=bwb`fk(U-E-Uu;|h%m59fzOgkUQTb-n~7%o zH8WHv=4MDQj6WnD~*~Y|Jii#&54Z^~pbE?o z#zPN1^zCndJDpCuu6yv{!N(tee0h2K{Q2{r|NQ4Uj{C1ZZT1sHX8-QBuWf9uQ#siQ zdo*d}Y%=5LOj*;V&Q(_M$P~>}1{l+*g<%-nH5j*HPXq1vh!b2Zz=Q=ze;7=j9H*k# zOF_BQy8|2yvB#1giv$6Mh#VjSLzpxon+ivfB0>iY*KUqwqiv$#>O20A}6*5D!Te=4R)8nfrRny5n6WTHghDBSJ0$B7`IWAxH71 z*#ZN<5O>DxA8_Wa6Nev}+qJN>yjCa_Y};uy4A&j<5$CG}Kpd6Kf?${w?4WnBlqTaP&mFdh-J-x1B(~f2wzoXf zl=o(0KDeZX4%Hu2?V&mtZM^#CqaXRmTCa_WC>1LjZNA3{t1-Q5n#I9{pu`|+L#E$I zBq{yMW1-%Ug!uT4LHfk% z+n*87x9D@`wmFgVo5Iy$wTE~mfvGtL5PFcvW@E0N6Xh#@SKC^jp3bO-^Xboh{^-8_ ztmO>1?|1^^2diRd?Y2kdH}4$b>bGRh?6W6n`64G->sKd7qfT`zw6yhXoaHxl-DB;v z!t+_$os^`wlB>XuKUmHLqLxf%iH2zn8d{L%i^-4_8EV~^iX=mWazw`^GTsih2uC;F zB!GyfKu9n_Xn6oA6!t6^Atr($jz|hY4n}|g2$O(fBjmIOE*GMZU^r2T5u6Wv8zMsw zXc`g(soQ2uiCxekL{T#2MhI#?)B>0FfC-@maO65|)m^iK+0OQ~03tc95b28(~Sm!gx5AN4>y;Lgcy58&d z5ANB!y1u&E9Z{)6*ZP$)4$!=mNvC_g-bmLA`BE5#wxR#d4`2Snce@cw-5Es@ITrC| zMjZY6|M)-i$?;rb=98cLEBp5DS(@5CnI3=OzI!dxv~8zYDD;}OfBO61_-!=t547b+ z*x|Ql?z2``KH9%!?LYFVr#?A9xm$?H)xlM(t0v_smXT!Iy)6q&)p+)mZ&tUrPu+7* zA`$PYYPZo|3AVOKIu?r1vG=<0d*|P3JNVFnM^bY7$nFIZ;M&bAgp{pE9CihMKpg3^ z$LPYWaPK{1j}~OHKe)webzJne21J{b0%I7s4vwNHYcGGO`hDI-ywBX%%BR|nLjZ~ZBMM?Upa>L(h#nE+ zKIW1k?yzx}2t5!`VG!Za1DuQE0~~iDjv~Ya;fN3j&-Q(bjmLe!S$8(MOufx!jPNcR z3?W%Ad7@2|Jsu=NM+}%0Po0lyyR`AVve6H=ShX4J+%&z>x-lT_&5~QAx*R)`z-el! z(XKH0=lC4bjG68zUd%@EjH=&BjauEAQ@>(DW~45`QaAQ<_1q*UsXm(-Vm#|K1h1Lhqd8C_aazw1MdtwzkS~0J6!f z6C4yNH>PwnV;sS>EMB#()yDcG-oSC|j#X2zQS)1A52jt7%}Jd=W+?_zK!Kz{iK75H zBYj$szB(srqPHk~CDr`%rS0NWN-biz;`>aM=){3nYWiD_8KXSwo@;Ky|8=ckDo8tWJ)9e%f zvUt&6?Eu?x9W+FP0HmOwk)n2uvKc=!r!{--NRMYaID!b;4hRejJ7gEn8aAsZVw8_8 zR;P*7h+WMNYLh`HX~%p>`#2p$sgQN_+Z8Y2+$PttU5&^v2>NtbmcoG<&az&L!cjy( z=+$={lP^+ z7hk*b{4vjQ<%~|nWh!dHI&FEBG~?017%(L$XEPa;khkP33dOy3=1s@eP~TF!+S}W7 z{=OwaKwaqP`1yCf`kg2L$_IPcy9MdTlw!G4w`$$R1BZi3$m5MN^2M#GHz0ox)%5 zahrjC<5HMctF`-*Q@ZMQ6i1>HoDCE#kz80KmCM&IKfY(z(R&{v01|k64tN>F(hfLCp z;TwoVB%paNumI)z0ZlO+0i{Tfg+tYeSULs*eLN2T zGIYg6Gh~xQ<6A0V?>JMOs6zJc!P-fp3-~c6w{T@>eZ8Uol~Fk^fE#||p@;UTQz-!9 z_V#wEG!~D?JDt|j(jG~Y-m`e!!Lps%vRbVsilXx4Ca&sG(?+FI$+GNryOl^JgD9Au zTKJ#-`aeE@?KNG|>tbhX%_b`Q;~6|I?bb(X7TK}s@wWlIySH%wp=*Tvu_qq4ZF|R^ zwb$!qb2)?&2;mwtmVn9br3=5eS^1@3{6fD!*tw-J3~SX|KAZjIWA~%}*{eF*&AdY( zO{S8(tpEG(edCEE_wHF*io#%PYfF-)yYD&K>-QboDHe;Cu6_Nvm%c>B?h9)lg2ubE z_pWpY&uF!Gb@HbV-_`4NN1FEd<4=x_Pk!YO{+IHgI+lDmlHHiuOj8qAlm*-AS&pfh zG;+KbZeO`voKOZH8F_8REBBGn)1G+zVXa@gd1q^E?~zSuX;5kftf|_FfTBydEL4QV zF2l4{jYvv`2T`Vut`=+Porx*Ra31ORda#w%ZX6n1_gDnr771*Fo&{zI#Rw+kKutD1JmB(SOW+TttX0(_10+uqdaoPAhG3Y;h+D6+ELf$=jT82k&pbz-OTq?u7B_k{=uI`nE1#? zKJsUkQvS4S?yM#(E-o?*^FE6G@gD~OaQyi3U;M>irSEjZhBrv^CPl@e*|P6icB;O-5;cSX0L>U)R9 zmb~nmDHOVXFcf`s`|RywlgUqcxwFaRKdOEQ8pMz%TuzRKFyYue;y{lYs^uXe{5l3wVGj2t?U>b6{jsY#uZIM)H5 z=8k0wJNjH7j8O@lLzr+pOX1_e%&!qqxC>M|JBHPv{>l%df7~dVVFv# zvZKEAdcA}DPi(Ay+Pe4^l;NLC-Cy16GPVQB^7X;yeqz^_ZN){=^!g?YXD8CY>KGnq z^w*z&L33lxHc#X-nQFDlFbvDGuIE1ep-+A7x#xrOjej^_JTE=)rK{FQ^)-V_wuYVk zw)U#8jM-bK3wt-TOVjo9yYRkFF43bmJ>d`h?unr_4*W2kEkG%`rxLeT>Xee-MxlTDlK0$2nVcUZMofw-J@OTz>KH5k`DI3_5oarj^Vh248FTUL9HY zZC-pT3!m?}M;<;oUK;ZQzgnrp<8hKCI_=hrZ@;r|-`;p4@tz#J6A-@hg6+(fwOTEV zaXOtgHBB>&Y&Pdw#&D!35($Cl%9RSoakDd%6vl6yeJw=h{Gz|M^+t8=NL->0mQwXp zA;D1njn$vWh3^e-O&^~YSXPu3P1APrpdf_pR%;=jYW3Ep-TuC#CttsM?b+`>|JVl~ z$}4%taT<+AGMS_qCZojv=FdI+ufFs4%;l-xG1wubndE&JuAOTc!QcGYM_Zk)q9{A^ zUKobCT+Vfz8@KNKmhR?6@3HpPw-)bt32-0WTBad-@~{6K8AXQeOioN{nwE$s{~v$* zSAX*le)Y}ft9!T)7nRtyyU|O|=7zK1`S;)3b#R8`l(RI;D{-LTB7D1#14J4R-uL*I zH`_*+pJfW)y8%0{%kuZ`HaXor&AA#0BZ&RbbCSq*Mtxee=_IvR`^b&dfl|mmRK9$` zR~wRlhfjyZ=dUC=*0L?>B0yV&CxtW}$(-97Sa1L+HfsVp0Bu$u_ahb4(;lfI9R`s_ zQx&&%*a|)~@#z1)eU5<6kSdKZV0^#^XkC=XLY)c~m$YPzXbgKHh1`$^wukH>#6&2G zVPHTnL0^b?IalIc3cch-8*}aabwQYR>S;67U|K;$)#@K@9};)v z-s)V55Bz7Tne;&6d-}MWYN3r?vAMGcKX%hb9|+VN3`yeh5%0o?J)(Q1U@#o(BYtV- z%gs(yZ5$v5OXTRbuvlZ&GI@2MsyyJY2e_%r_;S<+1Dv6bWC%MR?{2$z8prmh6bF#V zvZ3#+BOGYG1Teg0=^ewcaNeQ)V{CP$XP?lhOIA5=)C#HbCOy5}-`J=2V`3~7=RMo; zC22rI+V9n)>@)>)X_4yQ9P!b0)lbRjVQw^OI~*l#-~c&bKOkPPdJ!bIu*Q_r_fdxl^a(TSCB$L%VqS1I zoMbq1AWO1rJO*Z43ET?1@gcq6lskY{{a{JeZd2(Exdx0j4!d`jx~R~SqQv0V}>Yo^WuaCw-pZ7cSAe|Ot8Tc&*w*C>8O=fZ zQNB*bT({vT^|%1zmQgcfb#G`_RnY`&3EMJ-#CRd_HdSxK&?%Xs_Q%yrFj%YGwwuVN zF%NZt<#>kUBoU8lB0-KwXQQiQlNf@CbOMyTI?Sk<-SbmT`cL9rAIAc!^% ziwit~=Rrt#1PL7<)7TFQDsoLd)cirjBq}cS!;m9LkrV)Ofe&1La7{D)A>P+o<54I} zF>-3xcIb~>pBTCAz_GopET#K^enP9pB_)xc-HzqH*E7krYyT+8ywL|Pn|S=;hdke_ z)oO`ELYC!5qw&A~>i^+Kh1#k)99H)q*yHurjQf3)5qaqz<$x&Ki*l?I-rm96gRHeNJoVH5dy-nP9^RhgwVG!&(|$WA=C1>_ff!lv|S(!4Rj;#nBoOdy~iu7JX1N zU!NRUAw`KY=&Rv+6Q^VWw-hH}0v^zYgrN%)3%YWfF|7!9Sirhk#!TLQ_;^&leHpHB zVK*DJV1%2rf)Qnt3`B82@e)biqT}14X`bq}c$$hq zEI@)ylQND^TkS3*fJh!kY(($y2fqK^?>zgx zh&hAVeMaL^k$;n$m><-596IeyL>N~&Qlz3`YJV7}`8(I2{QMUlee{D?m$Gcr&a_ys zS#I$`kO7Fs(4R_7@v(T*zd|_3;ZH;~3_u%~%Yh!Im7b=d~?&-6uK*fK1L3q=&jU zkBB@T-{s}<=LY`SM&*B?{l4vOLH1KmKaCKo*XxNyf@RrGt7RDawd*TG#%dS$Uw-5K z{s|?-c;^M%X=47-$Un|x(v@=M*T3}JXF#%89wgGG0d2kg((9pZPtQyy5{XWyH0&3P zMP1js-EN^!fDqQIHCd4k>^~Ct@apo{G|Uy~`E)M%BRn)oA(NW15m&F(PI!&V+GUg*?$>Pwo1C%)P7m#slW2#%OKG3?m`twD;)!0V4AbR4Ijq;vu5f zA+AZ-uL_b*@yS4(1vE#mCVinE=6ybG$+SOM>-KJWK_F>Nl$mQlu@soys6BAoTb3Ui zbw9we+v&n>+p0P6AQ#I~paIE>*(RxABo*tx_~G%C-Oj002ouK~$;q!V53F z@x~hq3k$7Q>$iUEx01BS)4X%aaQk zM@6rLn`WmAFluteh|2J2;D-A`xOc#ie#CS{Dvm0Wz};?8ux~}2Nb#@`^^z35kr4Ke zZa+9=Hc9hFM2NQQ_|=R#5IjhQtl~p#m=jXmh^?*+PE){N2tk5E<29gTrLKSB)dy8`n z$XsgoG956jWJ4ub*DEy}yGV?Xhq0%k4jyzUmsLVSgLaGv5JC%6dq|GlT)n+?c)ubF z7v8#Z|C3MfJ^?mo`X)6umU{BZkE?@TsZ=5eqT6YA+MR#rF#{=ns(y{iBwu&4RC%M` z)dVj$LopY@CC@WX;NnPc=tLO#z9>n_WO6th?nLM~j-5>d8l*&QH$`j7{f9I?uE@>Z$$uEic4j2cmWMZeUjrD9($yPuu?!YDTQtTG|jU$r`qyD z-k}>h)IvnMM%QyCh(ch~7(0-$gD`?Vw4or7P5?!kLcV929z4&;H5(`zjdDNX0pJk@b-igpR~tzIplZ;u1sChG`ZG1zp$6 zm1=Ek>pSnf^A?kRqOvZgV4cZ-cVMx1sv$kAF@+M?9DpjzErL;Y>2%6<-Nl*dgNIL~=1RrMQZ|#PX}VgiA%qlJ{MTRneSg`XeEhFEt=H_{7N#e4 z2kmjL{ngL>bS|H7wOUaW<@5P&uaCm;%G&0?M#>_vKRUeDj>#{Z^rx@CWiry?$9{?e zVJ@FH45Qoa?gWO`>-8N|w`#Szdv0O>;_+K|Uc0?KAh9o9*&ioK@n>Vmx;(@D)8#&y8Cw(Sf=p8NTxuj3slCy zV{ZJS)FNE2${G2dKT9YZcRlhO;NCUn!3KM;MIY4Y-CekM6wOxgzJXgv8Pgw*#p?LF zua+6#fS3Rn0RS8T7+`Y1G!f4S9smx6cI0}P!r?~U@j@#;#s=5!>28ylY$=|PM-wKP z!)jSZ3>@{tSaIav4w!~nS5!5gDa;<4z2LkZ_n1zOt#kt% z_6A%sY$qF?K)r}FY+$l>eL9+k;?jARNx1=q{5#I*@b-wO%cmoq5)}0G1RZSc1BCOsiYGOlJ<~b*>wj-n)xUzUlRAJ)UE`y zjqBy7pZ?^ZD+6Fhrh4h6msC{^!?0ej&&|#Km-fEeX|egf|I5Gp%Y(rnl}aryFB1f@ zy}f*`@Po^td_U#~JYhe0mK<>JNLo4Q?YBbK2A zrht7yqE%ibFc5w2CYW0RM#5rQlO?_OkR}w5%{n2l4Ox^56UpnnHy9@Z2n8^r5$M>? zIq+dZe1vw>TU;@4vUF?B)n8)(_t>e&r)Ov08`avG$j)Z7hGFzOoga>xCSguk>`gG5 z*IKi&u}y{DY&C~kHQ6mwp~q5=z}IVDx7Q6A!xDh78IUoiOZxRN-~-HwkZ_RKFugd* zX7hy~UcUDF^*28Gv5!6Z@MC}YqgQ+*GzQkG2lr>{-qbn3Cj z?W0QU>p~)4-}tM{jm=ooP`k{qz{ZP1>*Cd|<;BH^HhuPmS6)vDq#%l#rsZRkI=vptFxhO@ah%CQGGhJK)pwg5&o}#3fFFJ6F@~a($z;FZ z-@+Sy@mi&}aA@Yu&GwCC=`OQ2yZu%s zx43ZRcuG-X@p!YIzashqC8Q}T zY-;#s-I)U+nTlJ46^?wF5=n+oXfa^K4Yih{)C~Y-hnE$S=PE;jQ4|>c zA;Sp-2gxvs2-^01h?$-pN`c{!kOWLxkRyVKLX#xKhG|a{lo3&?Snz; z9_?AJ{e{%t>9JHMgE7wKa+;>8!{KOcQLR=PhR$R% z|NhIr(?l^Lk=xjEPbDUQ;i*r)b@8j|Ve@Z(=5y0CGtE{j3d3A3Hy8|}DCjhr|7fMk z2=kSF+2w( zCdU1hb!VXC?6l;PWC%e7ZALQqI2TYQo3SFNL0~Gf8Q?U)?*A=d*W2aTU=WUmhVF-^ z=j)!Oo8+L|X*apG>KCG9Y)BOGxk3@{D=AB7@}C?6pl+JtMdskl5o z)jfZWVXbL@1Yql3<)O*Z?BQTlWH&8F#uQzbox0O9hoyb}n^1r0Hp>Ry!h*2yW}-yv z!=gXlL+NcQEk{8-P=^HKol)cj&?88#kAqY;zj&MVJAQ92Box#f!i_4J6g{4^`Efq^ zjYK@rJg_nT(U*b}7XuvG$x;l!%yw9KF_@Ok@}k!x$>DW6HO`48j*|Ig*9k~{&?IQy zRSR)4;SABuD?-N%BhXJ_usajc%b{RGb)V$qq zlTqO7IP}Yo`#pWMXj+n-x$X@2JN=1RZsnaTPe1k4pVu`5A@tT;Zyh>xD4)--t*!0f zzyH6qU;NHQKS2;XT6n+TFBA%Q-F4UU@^Y)y`rPL}_tHx*-GBf6mSz3sZ~kVnSbX!% zH+P)O#>U3pC$sm->^}pUz5Ld>>nja>kc*4Y!%iF)JTgzKkjM`1GsVe23b!I=7LlLk0(IktEDQ z(98I-j^Ou5G~%;3Io&Gv^z{wIVuqCxgap{cK*T5te8dBLupNv%7nD?bT-6$!nlWL< zbYVcC5bZm3EDFnYeN$$_7#kK8!sp}5HaF`^ebDW@t7zk_-&+|Ggia^!o!^_!q$!Gy z$K&tWN~x-9nx-3g&)&H<=O^a@s>P{Tj|i!$)j@kyDN}22C#khdH#gOemYkT6D@np% zZD^fk9T%-3W>|$AHnHY26>BJ9z!o8svnjp1WegD(L2uRFV$?D^ z%04W1tGghra*0@e+|AEzI)3D`nK-vT9Np1CpxHmAZp4#uoXtT&UWNYFX8i%%yrl+* z?tO62?p@_dC6P#oqS)(p|KK~{y;9vy%N>)nW&J5F@B)*@TabI=homS3~A_4LF?H@on{ndfN+7IIm` zF!TAm<2bciEt5*^D8xL^CzHvy-ah?y-Q@S*N5HV&S^30A?wX&Q$@B3i?tfrmVRyUT z_I*E}&kqIz)3yme_{ZP-(b?4aUv1sk6Hoq@JUdgp{+Z#O{;rcp4;@Uz6Yr^IJ6N`( zmep!CilS1fRKMTXv{AO0ogQ1ra0$D=e7SL%2x19e=%LW}^*Bvxe%}t=Y9wb&An6se z+cyn6#3Es{V_>r%+UM9=&MerLl{8QgfXPy3?Vcxp)U-d_XqDVrj|yB@%Z(fqge8e) zz3mF}fgO+A6itb5luX|lB@#)mJ+RiQTwEat28T2Pm_a(p&>SSk4Jsnpa#Wczf`soS zR3g*dN@}$S+I=MqR~gK>J`CJ2@FL3qu6?-QO>NXpB*xw?fD0BDkw_pN0PI18!-xW2 zghJkyR4j7dAOoy5s@TIxbY&g;HqA}yXsk(AOlM0*BPjU5cEhP*X4q^o?qgDJ(2li@h&M*uswXk&8dimpxct=%Q&w_~n2iUJ|Y z;p3W;Gsqs}Ly4fOIQMOwUJk*s9u%U+Zk{WarWTSou-lc$Na^ZN(Z(d5*x-_1Q#F}o z8ya9DinT^z6m@!)PPf|CvSM|0x1j7xj9*=T*NORpKLCC-E+neRZ5s8!wpE9aXdot) zRS*z*!=*W-+k0FqBT@$KaZp&R8p3ev#!zK2?StrHa@a}~ezfKJSKs~ApL5P^XJ&kL zb=9`*;c)1A-kv>s{t}XWb^xnhuh;AKVzIcry{&1QuIsMr&dtr8K7IP3haS>({pQV^ zPd)Wizu(VfG9*b(PEP(ur>Wkr_sQ(fM`qu7>*kf)FHIj3raLMV^!Eq&jJYxul+&&w zMf6Y*44x}1lL$C&3T5w~y? zT?sYUA{d*_rz1C_V3nNLq3ja45jp)RwEDWax(z8N6x=D86$RWbfKEV6Tag->P1jMZ zMoxF)8t76s3G|{FLq3RnSX|h(>+s2T>&7545l(!#H}ltrGk;^feSsWa(Rs=mt_9X= zgaSk;G{qlJ!f}{4}_QowXh0-`a;`z|=DQzX_!&s@bOQ6 z=%aj)I(PHCefAnTN;~{45JkTK7H3o^VvoQ;XpOFift$@1IF8*>DN?Car_*s9XGaBm z@6_Dh-rBRcZ*kwCO$J+(|X4BIr$U%vJ=E8-RUgPqIw#)&KW1>6}NwTA_# zyH%^+{qWuY@^`*@ES?vp@82}KQcUi5#q$^5hzm%Nlw2-18jVy{jm2Z7Vre3gnUJUY z<#S@b*QrN>E=Q0OxQHX-A|Lc9(+b;)LvYfBM|ahJr{CvzMnF7M9#oL&?^2XloT&zc zZbcb5Y8d8_6x^Pn+lC(ns_im}6j;*6$a8^0(LM@n8xW2c;DAGv>N-h=fusd83d7Ycx2mG5ZILcJFjPp}Hl3?loM zI#?)^C=nbwd~m30qA2YQauFmsmM`46b0IBj+L~((eo8P4<@_Se| z91cgLQL$L`eZNvJOEG2FuBE-jT_1Yz9x0Y=Hk(lxW-?h_*So!5p;)+Z_RJTaeL+v= z|NG8mbE@=;N8aOfGn#IV@0}~|zO~YxJCQ1d*S5H53(|8SsS%^z;B_7skBmREb>;k( zwafeW?jZ@P{$pDRf*{1>amzG*=Ud-XC+^M?3TkbhnxpSMaiZC5&CV@kGPxZrD-;St zRn;uBm`VP#Z$I~kO7X$4e-9jfJHKnRUHzq~b-|#I-~Zsm*x1faXt7w_Ik6N)*}*cJ zrgyMxCtKYzt!lNhw6y2&{PF9T&u?#?9qNXyu`Z%066b|@1Ndcqa97n%XG^6bwF>mJ zeK{2slhTpjAji1|H#3rK2PIq$+Um^Qa0cQci_i_T=5bSkA zq;)-|S}Z27kBvH%N8wz6T>J7ZQHn9N5`|pCjkq8h$svga(JPGmpaE)nC^KPl%ENPR zkR1&t)m2l;zN=)yAPNI7^nB!dStmSYm~^L}XUN{(^sB8KbDHXth7AEifP*0ypeBw- zAOgTBxV;{Z4~RT4syVLLXd@Ac=?D(V2oqZ{V4B1;HjrnH&T(gbm$#aaR&H@frTnh5 zc}>U_y7WHPwHKs{(@*<8jM=JTxWRc5-^+YI0N_H3K%`0@{jl z4Ju8;hzbRn!XdY5iMr0Wj{=)hSRf}#tU?R1IAi-pV~H!iAWi(RDdx!#3FKMJ+pBv~ z)cfJkP}f0xt@C#d?F0SZv4aQar+2+xewWo(9D4W$C1=Al8zVsAOihC7(L`>*m zF9?kk?Cvss06BtD23)G<>qM)YM^&vM}ZA)>S_f1m21&f`ICQ6GTWI?8XFsX z{q@&-z21jE{9%sc{&I$vc4q%Q&pUbYc;Jrm9Z1^l)Xv0-Xz|yv-XO4ms`S zu3}-cG1@mjdDo#+)!XatjnzIPdt}cXXmQ9*dEo|=ae*FK-O-@GMj4eF%(T@TQ zDTbZOAGv*Jv+kT1{ZR^foU+H0npNvk%%1d{=*-3ii6KNmfC%kindf==KN|fh6bexk z)ob-+BE_=IV9?KIvpZO}qn7E0p^Zk4rGIgGYrQZv=64cRYu`LMTIzM*I_owcBs@1=ptIwCNSlG%hwQE4 z&AJo#t=PuRt5S@fnw)I5S}=-I=`>B#88LO|+&M~4QA+MJpZ?_C$4{XE96x^iz39vx zm;W8^_dKuJY-TbUj%6#AN-mp~WAUAcl3YH&v)Gu==e0)dXTSE{YlZn=YF`~IaE7Rq z?2SUN+Y-m0dHSh|iLp_m_4e7@rJ3W+RCcgcoy7r=lF4|?a+cfO-rmKJ)raoZ#+6J) zDHKW&!dk5^Nn$J(Yt-ve7^OYuvcU2G-<=Xw9co%Ok@&su z|L7}@kPycnu!p^L_H1|fH_ckdcNQM}z|sBtc5Zlw`*)0XB}w{mwQNTt-05}Z^Z5uw z?QZ+zp1TV1+>I;WApJ{gW?YVxqC$>HPw%!q0IAa<4ZOS7xLtR&^<9qlBBWDW*XOM( zss;FAz`MOPw!sHJ^bMo%h3#wU@D;;1O`Pr!Jzyiz&@;R;$PyQcwi*>h1CRUBjR|*y zwM2J>S znNdvkOja*zjLSrgIeQskBk3{>EWFHW<0`^oGPIyp7`z3$BoqUN7C4k*_hGBM$Qs2k2_sQ%(n_9d1{H2%I zF5kWPxaRfy6cZZMej@h$uoeO|t222MlcKAN>=clZK*b3XkkW0;tVOQpH**e~bnXP6 zSHZiQOf_SAF;@)j=$>8E>+a26Cn7O&YyH4&d0|O|`5`@I%Uhf{J4~i*%JHm;xM-KA|89rqYa>n@ zn!XiTopAN}65SFAtpj(t%wtLBxWvqkNU=csCzd7=#@TH4JuLG)uifnkEO)Edw$Uin z0cuicImSMmzOsH(Gc|<50#3x|4r~uPXU?5Fad3~E$t8;WGUTK-3ivD-H7=Vd-v?3= z^(eQ&crf1Yh=-1!I(6@_eeo;bdi88kB9<2BKXTt;PLP_-W+t1h*Q&qtmEUP9#fQA% zVlwxNkUTgnKLWHHiQf;ni?FX7b|w z%h#{;yvEV}2fMw#>o|o%VaIoLXHl+Nt;XYVQ4(vl8cC9gA8%rsW^XV^io*ZvJ3siL zi^gDLuU*Nfl`y~2bdfUBG}+=(_xJ=WS`nw*Tx}-P z+|tsL?+1-WJ(EuF%*c;TkLAVO%ilYbJixT=Yp5Z6WZrQNHljHpOZ#p>k4C=Fn95E&LSQ09v$dhAYA)}2hXx(Q=gIl`j+m*3DH=t$SnBFZbCGu3ByV@^ z57;W3Pf~Kiqp%^+mJ{7T#hEmU;pNF zzXP(*n6>*!>%!zQWhl-DY9G)){e{2bI&QtuIDXfOoRm8E!_yf8WHNfk#T_jfm&RFH z>fqJEuo}x8HGp*H%~wSc^DIl#bSxHYG#UWHbSC3F`h}NYkf8dvo_UBO2}zVf)7DHq zilSUDr>a9$RmaE2-+b-0zk6qxD9rvs<#oA~_?n;jM1P|gTGG-z_n$mI8jbq>eyLR2 zQOn+IVloVqOeS}BN=l{DkGlpo>J3Shj?RbXwoV%V4678&IklxXq{Fuf8V@4!2? z^WPVJ949;$xRzaEZ9DMEVA!Qio!2|##q1k*f84sV`PZVVHAZ}y+VsO56##M6AUrm~ zDO^nXj$~{hV!j=gEV7;;m(#;AuxMGauCMu?&%_d}heH?-fWi~dloSF>!cg#M2P^%go$4yNQma87e1LQ;ClOaAb>`#CT39fD?sME>A zFNk{vuCJ(_gzGk=GTBIs`9KL7mGB}&UFG&b7sysm(jas}{n*~y z)(zGlWC7fwm?MKu!mi{1Awk~0L@r&FU*e?|%UUACgJO~3g%ubpGIYyTxncj_bnZHV zMW^Aja>KHd0X-fL^I_u(sqrxUXePIR@9qn?u3SBLS>)h%-g-AVy?-T{-O!xFF=AVH zM9ke9wk6>14F+RewjEFZ-Y_b-e&`~q(%2oe&M3)SP`;Pumr~-FMy+T;)8{fF>&(K?j_pUxk}hUEuOE3jW7TJ^ z8bpH?x)*skYgPeVnXob~pPiRdgI%uGWrH|g>s<|9#--B)OyApI+e#8GZrY4Og=Ug* zrLwY$Y&YVPgrG- z8w4)IkxhhDyYc+YOGH{;As)3RAiGH^;Q!Lrq;1=Xl@dFd%5*|;#divGT*~%86&$I^vV)w!P z0gtc0)3`BaSrJa^4jI>t8WlhBz{78!dGmB_Fk3izt2Gy<4=DoDJ$h_RhFc9JlEPOJ%2B z%rYN%;?W)QNTpI7$L*ZZF(nouI6pDxxQc4lEU8}IP$N6R5`pg7T^kf2GoUra+QQ1N zRW2v>8*Jp$Okf*iufJ(l*2wZUPG?CH@1f{znT>)$jlhj=J8pU_79kJxxI}w6>Z`-7 zjNAZu08>$Dp)i6}j0#oT@-S8nRqKzIMm>cm7$(MMax0;IyHy^0CVndUexhErt%jo`lf#EZW<;AQNB(Pb}W(3q*JD84o7M( zm)+Xh?)Q7Mv$KLAG#U*EVK$rH!LpquX02XNXEF@UytlCV-bB|9M(6W+ilV;r{0o0? zfbWCq6K?s^!UGL0IN)pj!Eo_`C*!eLtJN+R3qcSd1a>VgS_4DvxRcXl#cA3#K@j4E z#M?mM>Rp@_)1}j1ddRZWY&LD%JaqKPzNv%Fwe?2l0*+-olC>=(*9M-z zM$U#9R|LShP)Al|`4kwCv{7cvPSWX5-gED-j$SLJa+J<-bnDb6_2)jiZLPy zqC_fpQ3$q!+E^cyM&U@o=Zb-ABQl@zD($e^Cv)+DkQ9ete49dPfg03eTHH?W4-#Ew zOLd%_Awhzt87?<5y^M|PM8pT)grn!3?(xp$DJ=p7LqH-RF^tgoo}(`@R!!Yza1>zz zL>}#%b5WCE$Yo(kx5>xU^D0XxEpK7i6z+OxvpgECw{TJ*AR2dW?$MkiWm$>TYq5LY z5XbfoZ_T;qe5Xm-sU|@?uFE@7DNJW4mRk0v>}d|c?=|@?2{cIF2P=LUaBh+e6jC=P zZC;+I62_Idu^EDBw%YyHt8Ya2pU~-jt2mrtECL5~0GA=|IN`VnK&UP_-8Zpvv!TfV zyHS(T2BB}ZqBx~z1CHM(YM2oyBDL$#F)|(hU$0)$QpH1YK0yY7!b}o5me6g7nB#*4 zi&-|wP~1D7d#zVJ=0^(8#ar$m{lPD>8P^4mu#qDrpD%A@OazHsCG5sV7iS0Mc;MXG z>^}3kA1M=O!Z0JA&Fu) zn~ROT)OfQ%fw&0AO{|8^j!U3qL>Jtn=Q86Cw#di~LDUms`pxS=H2|4J;w(@3F$%V0 zyy$|W?Qv##D|Ber7Oc1q6AeZ?+8?AXW#p5YV$qg!qssM7x~-E8fIcMUFtpggxeOiD zY;vMMNCl0iKzk%F4B5%KvGIw?Znrx&Hs*O=tJO-SQXI>+TCL@)m%k0tS~53dSxpT1 zAYx3@1vUl1Cg?%L9AIYK33LZ=rJk>w>M+|$(}VTF%p6*n$r+akUFv&Ex6jGb_dNNr z$wGEzt9rXrVa$u1VXOmv=V%I_-7{pe&2O`-8KgbpLGeE>bcH^K{$ytKi5ylWDMPO>c8nIPCO=GuN&L z(IAt_q*IxlQ*&qZr(Un`h#5bwmbKdLsmY1ejg4P;{UXkcow7R3x>>RbAEIPft&e!3<_F@SX-T6a}rc(p^cbrF13jSxLNw=i zY45AM%X^dFXNLC?`y;_ppMi9C$$RcyN<#d~iVB;Rr{c}`d%x#%RoGHAmB4KpB2CZU zXmt=pBRqKoQHwCr6HZA1mVx1Q-?~<9;G6FcP~ez zb=`mW#@pWtkNv{-=BH!$_tI0V`P!Gk=H0q}_JxnfqTy<_n#p7y{eX3Kf7dPRX3I29 z+jGl`#bO{3=;rev2uj2g?RMLCjE_I|Ob;La@$#Dk9OkJ;_6 zE9p^rdIh}+KnPeM!_g^>MhX@VfXslE*<^9UQE4C9U~(D&5MnrGI3okvM)2_zkX+>Y zwy{>f8|G7|w}&UUwC02>fE=xOY!B`WgcL9~99|ntNKlDLD^uC3m2)F^P3*px6`(oLgI`N zZum*uwa5H`jx$vdDnj}`*|7jfg*&X%-!_SUBm4V=&`X_ru4~_>tuoqDwj5fo>fY&_LF;)S!>gc-dle(K!tZmNkkqE&{`HC7# z1P28#Rk-^qzAn20WTBp+`nCzEcM^m?1WLPR>3w3d7dei)GUVV>V}q&wY$P1+DG)^AnDW)E!^_Bk_h!g5CAMdv>Onjeq+tc#PqgOxE|!maOU_d zH6keUVY9Z}7}QL8CaJR}!%0ovE6g=Y)hAD!9t?6@mD&^M&J2%?)EkXNJpTS$Z~w1z zyMB837juhFHvF!RJ*Sp~wLG}*=;NnO=Kfrk{lr#DB>v>(AJ$;>aGc$2s8h@#JR6dT zT&2DqYA|qM#APi}T~I-4#T#F`wHRmQSSH!1w>XaFd4BJyxhKnX!>HHm@nmviY4I0d zzg%I$`~320(0~)E9o_p-S+gRr0qHeTC5So%n9e$0#^Q1kap(veRh9;&B*;cXPRLILxtZxm31n zYjSErQ|*<@3v9>^3EN`3Mc6=$OCx+pu^;R-8iX*@s5^z*cRwI+`Jp=N(MzqVB@&wT8Y z2PQ^xxqP>X`DnK61G21J#Ei$|U0K%U-&QIW7>2uj(2^v@VsR8h?$0f}R;>>vcn@mX zDm26O)jEqaB(q9lK}S%mQcT{a# z^$r2pEF=ew(yl?(kzmZ)2_V)wej4$DYs8_p9dVVLSb{_q!`>>Vi8kgzv@z5{r`Cf( zmlU6@IZizO+u^5ND81vaoGArCk6Ive8WNB1SjT#WEw2N5WY~6SNN^BK^??couR|2l ziDgtYdFI%nv8c4zEn*;u!oe_zX9gu3RB4Pd5Q##{Mq>gM3J9xrTv(|;g=#Cf1*)CN zXx0hF^EPRN6esj1SuBYaUAS~hu5U@0r{f`%&S2JluNn|gn8PYq zyHow#XFmIvAkF@4`PuS6mNL6_`Tm{N<-SwBmMmhPIVF{2R*q!Be0Z#0-1%@bypYP? z>;X?O%l*xKVw6^1q3G?g|PyZ9yL6PH8jRa%c^&1|Ma4F`J|q` z2XAy5H6QXAf~@f*BIX?)2dV|U8ko|C@?fF1cYmMX4}>L2#>}<)}ee~GGs*^9P8cQtZWN2oPtr} z+`YB=gd&EMskb-lZ~2i-9eE7x-L(Ouc=yYXJ-t|?Zi30Hm)^%Rv5onw3=?|n*r_u| zPGJ~{p%}w*3-@RL_qWdPj2!tJJ9j4n!YfQ-q`muOd#4ib|J3I`Tgc}bmJI{~^?Kd1 z?Nl;(WA@(bYx#XM`xqO7C~BpqlE7eCIKakD*PYK-X#}P@6oK$63D+X=LkqWRx!t+_ zGb2JESSS>69DB5g`IDz+A_02dKmF<--Hc4IEb>WDi3NmPX!JmBJyF}dn`^e&o{d%q zPf&MBA(;0VHB>8=_Y=umL*8w@l)%#*#<~!dU_-TPi5L8V{-Ii}wwL~Hi=CcqM%Rp5 zt(H!wP1_DK#O++Yg=I5TPC~Xd(M5d$_MK=f?D`;&!X-zBymnLaX^m_V;QLYs)XBp^ zt}n@VPsQWmFA$7~bJXm*O5CV#Zy3^=P zHm^}G5f2XF{ry!8yHU+GWVBeTPc~Nb!DPgDKPu(ua2QCZ@``;!@`d{D-wAr})m%sA zDNRGUwWg`n%WQ;Tdm>pj9H{E^yY~GMc2w(NtEKy<)X8LeB}uAQt9^Za!C-K&)%PbA z-e{DjsMp?o@AsD$(-vQtTMcI;J=v@*NzGO(old)+r^wO|zW>TsHSjoY9M{d=L_F7O zzQD38s{7<~ABSBt9F3s}lFR4QsT4&L&1TaFfLJWnYPCY4z?oymfU;jx(2=PS3~%2n zMZ-iY7#k7&f-YSP;Yq_7y>WA{CGH@AWyqRo5^O{old9SP9&2UhTXk= z<2UB(ZHE4LI~Sa+;bpo950l|M(_5&Cr$ZS%O2B%oi~teCY}#Ir!c(f_Nd-=G11HbE z%uT5E&ZJzYFsf=%Jv=DYAM9Xe2M976%_|~?GfpV=W5NTp&UDpaeSR|wu2CWnsNw8D z^Wie4dx0PVI-m#AyzOuRW-ypTy0~GDSy_`J7W_`H)`vo<>EUi);5OmMw9TlGDF|z$ zB5Omq1LH6W!wBFy1WE-bVtJ`v(zaFDOjt}mc6in&0bA@vv~{?rA|IBu$K7`Sb4{kt zz24!P7R(w8+Zq=DiH?MZ3}~=J?3)vMhC7^v_x~X1x3rU%9}%3wK8d?S)>O!b%t!)B zDQt^UZ2_=3+roUsgx8nAlbSF}~M6=aA5x39)4r>xBnjlyOFiNsI zM%{qPZLKZnVy|bDP`Zu*A=1GpcGH4tD{Ef4@`@eCw4r0+bUY@638|x2Xu^Kr_<4~K z@sU($l3)`zb$ioR=VW8tC6YV{D^`{XbUZJ>va6c@ejD6T0xpI$_<@cAN}d;phbmRoq_2po2y&tv4MI?>MO{ z+P}+>uwpZdMSBlq_1qE@u2%~qeOZ@96FLZ!ZPIF~#z-5z zP+SX+j|^Ci0b2dsFMMg|-p%)KoyYnnnukyE!20R>#df<+JFQe8@X;@P?#lJKf-OIP zIMfEf{4VyT=N@NRem9q67)A&Pa=Y~>ufO(i^ysn5%BRr!rM_{eTKjvz&i6M;FMjEl z4MiqMG8hcj>vhYr(y7#Y=ih&O_F?+unU?CpFwq8s9%L9&lMqo7PfbMoLF`Jtv#7#s zgxc>2?HaTy@R>l)Tga`ou3hEuwl68khi7?Kv z0oH{e$aN`PF@cs1;AP9A!OAw|aqE=;%gPk3)bf6%pg43U){FD3?tmQDX|x)W3GkGg zzyliC@=*kJK?`O9|)&~-oiqiibMdSv{tN}ZGMOjIl;ud+wfp06FpHk0=F){u35^lBM0iW zhGkpPXtYc8NTpKwo{Xi^WLq|5Tbg8{+@<@Bwb;;j_70m7d8@efIOJB*)`% z7>2t=%tzg_M?YZodVQ~m`2kthZnwMV0wHL3b@jKeU!6}8q!6)j+VyNlYaSsIEvL0x z2a<3gZYwK}3Mpi~LsIodjDai9{qoBSKVI7Sh*5xpQNPwqPh^Tsrma_Vq?nWlUIhf) z4+O!sckNK)T~_ijGf4>Kg?P=kVIUZ`^JO^S#>3-?Pf~7Musi@pILzlTtAnvUoiLBV z9d8#^01OP7AYgFAqp35V2(@sdgTx>(rUN$WL>Lf(0nl?a$g&gr`!G9SQPvx%n*%}% z?m=0T4jZ!!K~zE5+M0EXg_)-L!nQiD246|pkpY2n1#K-4hnyB(*rI|9^wfX|jGNAn z6FrLn$2QlWm%{?2#Z)DaZma$_uC)$T>4QU~zER+8r$q|93#+KLir%NSpyg4$6^BN$ z{BUH>S>2^mCg!q`OCa11Pd8jd0hAsG&=BAVVPmjA=wS!|mKw_i(4o0l-JvcwTSGVJ zjB+FA%#Bl;N`z}pfaZon$&myvprGQp?K!>nqhe*X={o?S!&omMM|^sK!XQs2DNd$> z0)jSt?R;&$sX~faInun=150@*jIqK7LEo;IId!WS+HnzkK#Y4%fBDc@olyHWi`}`I ze~IZ#d&{FrWlyVpKJp&3SPhb`%iaO~Sh_1yB%-!`UJqXcjkk z(CPv9n;;s;+M#{Z=|qAch(e*z9XMUBR($}-MiUPjJBnhSqy#Dg-%}fdUeA;JpEccT zGr#)T&wl}hpqYKs`)3Yp?`$+GOV48RW~p6qb)1D9E1qANzp(M+loinfnL@GgzrOgy z(8y$^ROSUi5QJ8<@y>e}f0&+NI;}5>h4%+ft;_1)Gz)i&(uq%eQDB*_EZf6MX`RkX zZ@pa|+$Z3k2Scb0Dtc$gw_21R@7RtDyB$bo5A?;Xhw_GA4@T&L5asFqGJ(bzzkhXQ zt0d-nlMzKVlF6j5>y1Vu9*+|Q@x7OS@Y^Me6v&S^SEe|>5lXE{>c^x)zLOjI(2E1T zeUWfvaA?5YE&%1FZNPJgl!=BOSe?G2_hi8Ai~6*HKqOqpRM*cPRFS&k6*YPO&gEBM zeQl+!uwzesbFHQoixjBJid@PU{@KGFcW3)EJ+2emM>luhvNSo6%>s<;0h$8}BrQ4s z0*6o%Ex;|@l}T!#&n>x(w^P)aGMWhzFi$?T9Nr5@NEbta!SFxK@KTf zB7xv0gkY%qo(97C%E#=wIQclA$ZkN;tA%>Cg727Gd3SyW@nsA-)Z92p!=cHU8$@`$ zsz{BE7wz17t>p(|Kli!MASedG;P~hy;YA*<-la3dIuNA`#2722;!&F<3(&mfJESqa zyVaVVd++fxXF{P!sa)#GX1lU17K?S;R2hch0)ZHbV@R#gneS|`;X-)k;6dB6YOSV# zLI2x3cXN@H48i2|NeWgU+0D%b7~(W+t&t-d zo;U1Fr!-V=kQz8PbLM8~@NU!kkgnlEyhR6dE)E%Pki{1yxC!~R>aYrkLFhmv!GPj< zMsU?sK;?Llyw{^OA;3d1UslY`-2kuAFu!5FaMqqT-VhkR zN=9H9&^nT}duc|#b+CQk3N}_lo`li0wjSEt@u-wf>RV`W(7y3v>#oT+WV= z0Kg#~jIJZmf|KaL>OR#@lEE^KIv(lj)`ZcVx4>Ric#Be2UAm)s@oGMux6YFoAC6eP z!vk=HWLwuQ>{``yRfKW5026~zwudu|YVp2-QUFc@(OySS!gvYy8#=1{dIp1bEYGq1 zaeHadbB9kn0DH+-Wi7KcrbAR|r8&eZe?EWa?BXgfl3ec^MT`HOjG-RIQY z+}t1h!5_T#+H0LoXJTUF1Ht@9Rnbqc?=HHomrA93_wI2VN7Hn7 z2@nL|d+)tJ{nJ0CX&S?@uYdjP^?E%Pi(S8dJrD>G1o6{-03Xn8i;IilaQM+*-Me>h zetv#%aPR~Bb~>GV_wHr0SpWdepFhuWTo=;z(|6Pj64Yw7yLayn3=I5Cmi>>S%zkj| z`r6{$*+W94Sqge&hj8X84<=GO7OCy5r6IjnUrM0W6wwec9H-J~U;qkaLu|SnjBTpO zRqW&&*r|0d*0f5ryh*D!Y4^gAcBhW<*@_$`f$T?~s}kHx)m^s%fP}zcWB`G5h(088 zVjp5irSgW>F(8>oOkRlkaWN9|aLs_=9T$-$`(%S`18CdrDd7D$C;dtW>cARx!iTjx>%`r zEauwI`wI&#OgW-6S|+Z0>O!Xi)SN_1=or-l$M##M6^%wSsZ?(`43~5FH}AV`YTv=b zH}VBgN30GpI5k>OZoj|L`pTz1d*H~?Lb2PG#y2~yH(vSCS5+`a$N!hj8}-q??>p?5 zTicQ@v4_qanVEuNr0bS-TlO5w`sz2n(TGMsAu_-+jH@x8!4t3old5Uxi0Dbus!N#_ zHbKXFveAz7ez9VKZXd#jWJb1#@Oot5X5PB=`ge~U84m?Q-BAGqL0q|X@mFunX_@eT zDK|sGwP@;|<)5tV4wsj#$z!AAQyjzK1W_y&M>LtGofFaY*SNE%ybzh4K>H(F0aZDMqy!$lr+jAAu^uC+3j9e-zI`>%iT7Z{c)m&=~#MWWH9z{MfHytz)3 zOC=@WED8+T6ORRbLa?kY&0h*ePN`*mVdY|PHa$2vY?@}bO1=lk=zhR7)7U?AAjF55 zX#B~ipRp~gTCZmV!tb2F{7nh^Wo07~OW%x6NmY9QBbEXD_=(feaJV~FsXOv$cdKw~ z_LY&CbTph@6&nQL?VFq|6-&uvk|2m&F4x=BbLjAa;zG_Y)JH~eIe^`1?yz2DfDQl* zyzAV>EG-Z|u(Z^y=I6u7APm6qc-(fJYN>cEZ{iq zLneYJF{lEeLRFvPf|X7#NI(eCZW|3wrEwV_L=oxe=huBsFf<27Z<^L6#a?Z9X6n26 zWTc#{v=D%>oS^Iyrp2dw3*@OAAi=0@Ms~v%Hs6aBNsID02Ql2G97h`nYeZ$*z#s+l z6q2VQ48U{`5Q9c6f}=I3jk*EMrvShO9B1nE(Tb{R+6LmcARjY4s#lf?Pxm0ggCIjT zM^8;XG>lht80sWG-&u@Ayj9^)!tvS|>?3Npu{mb7xZcj|Q+yfY6yL}ubtKGTYt1HM z8>A4nrIf?rFx824XtDti#ugS!+M_rKNFK5S*4q#+0pRdL+YW;|3iO#-7+?dA`!=1} z_Q|M93@UsYibQ(h8=+!J-Et5Yvzm~02Xz#J24P2mAlLwL#Au{cDa-_BU3<8!$Z-pl z>Oo^yG~pRP`@Lw03}szBl~LJ!nY2i|ajvmdUlsCxS5vBWBw>wu2i$dO~T}{CtJ(yF+C_ z)r)W4{p?>*nRR_5j^h}HdHC?*FaF{$&d<-^yLWGAXJ=qw;NHD^APBzm&O7aPyIXl* zT3UMj_19aiRy-d6&Ue1Ey1JT7CV%v!A3c2d@Y1DAk|ZrIE_Q**D2m>=aYGPN4a=E;+vU2a< zy-+Ch;K751g$37jfBn~g{rK_YG)-@8Y`pZ+OAN!j`s%B;Z67*x$aUTCfB*aU@85?Y z=;qCvjYb2<@m8z#`s=S>yLRp9(W5NOzWeUGSFc`0QB>FUuYdjP1VJc@a_iQuS6_W~ zV`F1&ZLQI07>1EdCV%Ff{r9iT)-Sy=H^13?dCK2W^ymS$9vRMG`w z1RE|1Q;U(~YuMw9;E*kjV}8WxbVPoWw{H?wxli42(7dXbN6Yf~ zKw8aA&v(r4mABx!?9zM`3}8rzgjB?&U2G`ZA6=Zk3)-5Ehrj^W=hGHTD+HUdY}vdu z(0pS`TD(WFEf2Aw=!6JO)HfJYv}AeW#F3lumUZ)`4McK07=#g+ihzjGZz=)Lg^6I( zG&^z~#{-BSqI&7apPVukeJ|0~6+@yVd9J&*Fpsb*=OST}Y@%YX(S-GTl8Fr_4!wQt z?eWP$hT*rjx3hhHM-HEuUn$~z=-E@pPmfK+0_20`Td2siF|;2xf8n#AuGO0?!}2`e zYBd+88|e3pgS$9R;zig8&4z*UH{H^zB`9g z`}a*bw&@v8-Ls>J*#NPCZ#V#HIe-Wuo>C%h6O<7a8SY8PB=}yTRMf$dG!bY}YnXb) z_mzHkuu(16#p2AqX$;2;n;U<8;kr9?a4KLLiZzl76?}43-Qcy>LKE2kVi;AT(GDb)@o*D}Zm=1~ zfHO2Isk?DUJsggib+!ycpVDsE`#xa;0lI$ayvH)Gj)KiYrVo&0%QHz|H*CD=!7-E} zahPzu0PZxfI;{aAlGF%=w6q89O41L|p&&x|j$?Vco8~#2!X21Fq*B`|=_XCVqyr-> zvc9jfG8_x|F=5xLS9Eek;a0KKy;@snyJ;qDTjDcTjff`cK=igDztuK|s_MrE!{2$Z z{@7zrkBkiNwOF=Vt(GW`Pfaj5xAOjipXeaaT7C<43~o5Y#Z!Y#R4Lo@V!fla6Qbfc zUX!7yKroEsKOygTJ2_m}O(m1EEc*bkZ{Lh%8s$nQ90>gB+wcCP&Blvx=V{DcOAfs* z+J8r^UVnHmIyidf_)*{U^M!mU65&|3BZ`h=gKD$Zhp(-#%_RFi@xqI>T0I_*VHnmO z)5&pMwOSn=9f}A07G{eejf0#f73-i9ss;KZ6x#sTceFOcj#anY^NSBd5j>en8M<-v z+O2=SQb&S`|GD;%AD{XLo&3zsy|h|xq=uh5dnOi(eSll`fo$0xx2&5j>vm#3I{K`O zr!fpelBG_w{hd44<0r-ipM(J*%2259Y}$C;l2Xl%zy^zACu=h{7TJcqfT$hPC}8NZ zTUe4XU75gi%hhe^qPcW7zuhm%(ScL}D7EBzMl(3Y1YFc1BN@aqtrb9%f{jwr#MgVQ zWxf^$MT}k8i6jfXZ`8W>2MS=-7jBy~m#a0|06D-^Z07v&@6Y*qV zq*3r2I9$ar!PJKAFoaR4@467;TV^_w{4wQRuQyI^7XCM_^;%D&;6XT)XhNU>xp4uD z#6q|Gr`8FAvLVc|0D&gx#GKmi|WkD{t?bMc+CW0(1WPEXm!Kej;qL2!(=s(nI6BBBgCiUoR$!Q1@O{jMwmcfJ zgJ}a(ShV0ld8?Z9$uI=K)9&tpHyVHmcvvvcm;xtCsgiDlUb z4<4L7d-l8E{qD7E*Vfn9@7%eQN~My?} zHk%YhC6meB-CdF-6N$w5`1tbja;;W7bLI>Pg2#>>d*h8a4jnp#Ajs_Otnd5JJ@*`f zAmiiX1VPNs&i?2}Kib^f+}+(Rl}fL@_L^y$@4fe47uq~NKEAuVd+yvh$8mn|_kQp6 z>C^AO|2_=EhYuglWHPsJ->z1xk|fQ|&F$>$%*@POx^!uKdwbu$eOp^wCr_TFY5LcG z?bn`s^2rMqE?m8O_1w90moHylUthN@E1gaU0s&c;4z@0fd`uAv}z~Te6O!{yT5bsc=>6$is{1b}$R_iP)~eLUE9D5tvLZDy%@468TTrUK8J@FwHT_eeKz+x8GjM~V7k z`J)>99M%RQ3-n;mw{Um6&%T9WcSKSGEQuLR`9OP#UXJVYvH5HDLM0rHbf21*W&MO- z&}i_%KoIBhFi{A5f&t@17~^|;vd8uCZqB;f6Fd0hm*0Qw)gSa_vnUMj?C$)7zxKEO zkAL|0dwTl@`UYS8=nH3#4F1`}uV#Fp7v#S4y|9aEvLaKPcu)oHlYWI>IMfXsleX)Aw&yZ$DUG zS$gos-B~F!HIj_BmEcJb-b7*pty({pxL8(?eB{G36XPHRA&`xs8gG>d1gOCM^3W>@6xcVXTh$`tF^b=rTl~KmR7a` zV2o!%Ns2_NEepuAFy_XC{W0o6XREPNSDTj9mX${5?uJB}@r391(Fsamb?|1+KXg5C9lg(_YGyq&GrI!@m_qU;0^&~oV!W_mn3(n4~E zP})R>&cEKddHFVpq4j!$qNu$F+e9LvC`!BCj>Te*W0fkEWIAPb+W&F6GD$m6SovZg zcF|BjSH0;ME)N_z@zH0Vb{w}*EQG@$5{9pwf9o56`jQ2JDWSi1wGxEsk3937VQ8^f z6vy%IOiV!#DwPTV036E?4)&cs{WQ^}G9r0k1Xi$3ZgpMIFd=l1#BEJ^B^rrk($CCY zZ@%=$-+b?lAHKO;Ceopgw=N%#k#C0vdrPIKoc5eYpMCs^Oe)naVhV!5Fw7petUEM) zk6YI5#N0F0_KKKYS=NO)SF6=%G{W-&=b5(`cXw>2>;^Y%NJGPMUrj+kneZ$L8t1_c zEvM#dNee)TmJ|us@ZR1|l@bfhj=t=>1R6OC0XSF`4G%AA6dvnWNd}Qs3N$^-DJ&&A zs}aSnQM+xC?oAzW0lb8@nz%0$y*?6GP~0OUA{l~ZhE>#FFO`En z{04gZHR46p?Zqq;bVN=w2PLz&FrRbuIRFp9_9lNhaSF|7ukH!E1H-NYw0zHe;zqP8oy`0BOl29>#eQaVR zI;2n2lJw{05$fN(f`{P=OpvP{zq1OfrE=hY5=66^Uku6#9 zt0Q7-##qMbwE&faIg9{^{R+v0Wdl%gUlGx@xQU5iO7w`kWUsFGs8%Lrkho4HZ6-37 zC=%6e2Dn%&f~pRY08BJER6Z#^G#I5ugn5qiosPJ)1@SzNc^snjA$2Jn72tRtJRDIV z)aopNPTR#YigUPSxB$j_AYht20S)yJR-NQGjcrdCeH^1Oh{gFWu7?0s7y+s-)-FgK znK|9EDs6M@h2uj*gVk!)b=_1d)g3jHN~Ju{;|S#Kl}+DE90oBt#)4`m46_KwH5^Bj zHbTKM$08oAKLC9vo9V#_yjrU}wiAs;TWwM9NJxm-Z08!08A$8BbN)5R*N27%F5P|b z9mOBT@aIisDIUMql>VApSXZrqb+A7IpQq#4qjji_==lc%t>i|A!>m84& zfG7c&BnZ=}x2t=w2iE~8tM5+fEP@#vX%Muvs)%WY8tNIBsDftA0WDC%XAzPDMP7#jTKbI*7_P$=Yio~LpAtAG4k z3z2YsU;=_j+Lb@5EvoI74q>1F^538c;@x-NT9;}>a#TkU$J}s=o5T8&imM4gv~dad zBY7r)`L=00D|n9%k$7$GZ<^};QTUQb8W3wL=1EO*0U}+0Q*HZfVR_qGSal3Ufk0U^ zU>kyCAqE3cylFONpg{vH%|u}emQ{JDsoM^RJ75VyX)3ml41oaIYezLDBo*-ykBnmw#n`cSwY>RAQQVtwU&Lw$B_lgojnp5Vux|4^+~ z_kBMekN;;RuVGZH)o?h>a7=GDlVURqrTi{Ym`+RvNw8V1N9m-ms;lZoIJg8`7+qlA zS$KDRbSNHAbU$FpM}{x?zF#VpBGD)Y`2X~kx2{v%&&z9RCZ4C5aaTEHly@SNpa1z^ zgkdptfqLFvbCF3#RxwJr>E}oG4J$6}3L-QKBPqZHKZIpL@6|l_isg zRn_;S84V+pHc3-#nCY}-8$xmr9+ZG2ULRAtfcUD9Y5!H zSCD9IAl$gU6hl#y1Qpni=@AGmQ7Ez|@I!uk9bsiFI4yfw1GgNfV>L>YL{_h z4m&Mhgc9r9q58so^_`-vp?W`y6AGcjAR928uXQT;h6teJ^F*L( z48euwkDHB|04YH-^kCtOpZ@e;t^>gLeFQ-U2M2B2?lNmGUc5LmGV;_@Pc1Jm^E`j# z$PoYl9LEWV!zhZLIC0{_g$ssZJp1gkG)>3j@$K#H-rnABx+@lo34*Y@yL<26y|ZV} zvMjr~x#|19rfIsa@87@w`t|GKaQNK0b9+4j48w37H!v`eN~O-7JJ)PBYqi?(3R?fdG!nP>LjzcTyw z?NWaB^7NsJS_j5Gig6ss(=l4pno4K)I!vKQTP+?=mJ*S6D2Nk0>=e?qMxRZU0*ysD zJddAR^9Nk-(7V`F(H9IeG2AF5RUOpaaop36CfD^=4k2$h^N^(>G>B6M2PYEtf!o4i z+jU{imuyg7+yn_9ps*y&4P&9L1V;n5Yqw6;=_ZI>hY;8H1w9e5GK{M+K5c6nnGi;f zP3KGPKXukTxdXs9O4uM7fl=H8iHMKNfGaPrL@0lzost*=8w&MhQkG>UQ>pG?<}N(5 zTCGOHv1=>0Dajt=Q&gO1aonZ=y6brL0hQ>V*}yEF)TYkV!;%u?ZJ(o=!(U4EGLP(d3VB-ipS!HIMj&lfNxi zd_(_-zw|c&2r3qfEW>hK;FZ_D_G|OkR#Q)-77Rmy5ziTwu!maZ!@vB?>1ebqiZ6ZR z+v%Ymx+hsE)edqg0tHf`=se+x4Xh3a?|Mv5w__$IVg8)dV#?Ulh5>|wzlQX{&5aPD zJ>^tN6mnSB-xAWq#=;4~TZuwjrESNr6DVcFWZi%xc$DVYG(oMYH58UWLk7Gkz@x6Y ziEiXEE*lI5Ayp2z0LXE+j{*)D;zI@!6-Xg~lQ4mPyH&?^blLaoYa0gvw#JZ=M&~)V ziT0-FeN3r0n;=kHzxb4V;i~OmOtMwqB1o#Qx3AG?=(^r5z*Vc&E}*}VFW>|*I5fy> z;Q4pn!t7>GazD%RG865rOF|F}48}I)y9u_ZSx>BO-H%5Jieh82n4&1%AdBaDU0KGE z#24_BgRRs)QbEhk znxlz_r;p_FxkNHa;P~D|fxXh<9!kx!tV+3j{MgY-N1Ji(oWhSZr{vZp&(KPkO`7dpeVcc}9n65Tv60LEE}OZzGZ& zYa3b6zu(`kU^ME7Vb?NOia?llP{;vd0iR$@h_eGW<|)vihS|JG^gFc4=$dK}tu@#4 zZJ&2&WN;+2(NO1!p*G6)f*IPk0kuZemk6u5LnLptiO;S+I2Dz?*-LJ?5M)CLL~x!Z zLj83tVWFl9^QOm9whqDC3K%A(wY+oZbIG2nQf1g~Ds7-dFT- z#E;q`%IRra)Ep~UE$Or{5eP>mlUsur$O8&sDP^vwM1wQJKt~LYpSc1RENzoTA%yfZ zpqoV8O@_uDLxq4*4=x4F3>m1RL#saDcI>DvQU>qoK}X`o@T74z4d zu0cZh1PzKLQ*)gj)0A~r!}H!O6ue@f zQPid#FGhp!H%d4J@3L*ssIc2>k&PcBOzX(-Xa_;fTX(+j7q4b^RR~Fv-6(xFnBPm5t4QyFXNp78?xj?%{z!%I6Baotm05<#0cmElEuU{^XYOfj%rMGIGG6 z26$B}xNLU&36ZmY`eb*$DJ%>DzEM310YskpHJjI^va74h;}Zzf&AQ5z>%H|(7pQaQ zj{3=#+S%C&tR!UIwjgl@5C{r|e#en7ROIL9|HgMA=Hdd?@7+3|omH~2VFCLK#v8xo z)7O!0WLB;7zg@r~&viiI6s10YuMWvk>!@$=eiK&Xmh+cnk&G^PK;k?2u7M%XJrDkF z(f7i;)mb%_Ta81XYA`MvuYu1d-})oXv^S+}x|9ohjB6;TR0 z#ueuKY*))JMfw+^&MJI1csE+?;>|2py}oMF%S{7XGbJ7@)C@Db1VaY9{mq{I8rSxZ zquy)}ZAxKc`S4(`lWmOcivyt*i=Yq46pfcm?eP}$QX%r_lIKiLEfq39mIClj*O)D< zNcrkFIG7Z0>Xyoj%nHpfu0wae0UZd5WL|Gj{!z?7gwrhOr0%(`A`bsJ!KuGDyu#{} zL9eSjyY%w2&KbLi}*%TtBU(DU0S+1vvh7vVr=np~qGEQE~c}Stx@?%aj7`8VW zE?_1yvtYYYnXBu5;f*c}FD!_!&lXVXd+8q*x@@?xJ6l}9iUC8|qx(edX5fYFCCDp2 zK1c+H?%dDsbz~5ItC#&{%OsyUpnNpK9W~Xue8hQ-lSkBg%}Mh^i2z7@K2i3`@o{c( z^OvIqLmA2(gP1Xre6jzsdnG$_@}thPvC(-S40N@bccY+O1&4?+puD7vItiKDfa4uZ z6l!Xe_6-w#ukCxdq;#4>{aXl3CW2~Ok>-ytlTcUJ8U>Vkt7KF`4qFUhj5oJwBbRc9 z_wLj_E4YzH_S<_pcT#I4JvsNhdVYKx)_p`e%ik^xUpPcL6$VSVa)0gLxu|43CKT~d zf3+{ci3k+DxTcdEXm538U*2HXU2XL?vt#&F?X%$riCFub^hvC+dnyR2jQ*%d@j{~` zOO6@_M4u?LWt)xK8DP_D{TNJGbRCE45GpLL;P`RdU_22sXu z7srA+vpl8=62}%)N~3+forYw@1bczx!p}d|8$V;1+n|>px2`!*(3cVo{{0PBi{Gtf z=VLWelhtuzhe|A}!6Fb<3MQN4qNfr$#yq8wa5s9mwN|%c5kB@#_{=-3+818V_(q(b z7h2Pq0Gz83UY69hA2 z;mC)xXYorYEBVTsd9uQ>npV9uIo0Vz0pf zyXlZRBCJ8Pc5a}zJxHD@Dy}k0kav871Dk>nU%f+Z%I)v!tG9@SsK_=sm^kNC`w(>#NT*l5*&-MV&jzEqcGf3j5npAA0yA=%X8miXq$t zAd)7nMt&Nte&MlsaO0?hqo=J6oUNggh}!#$Xt3x@2KDt^^iU2y@(dng64*w-+Idbt z@(1x^N{#xWVV~Z77xRq}SU}$C6gDW@)jBKJt5{ZO8vjCs{(Vh&3iJ13QEv*Sn4FFB zhu0gKc$D0ICp37sZ}vwfZL{b{-z`aWkAVc-{^8nN3FeQ0Ix+;_`$i`1a7nVK(oi z4fb#Kt>HgkBt0rWE^{iu){a?R=N{#!Rd;#r&Og3GZ8^1AaJoak^vm&bAp$;}T!YlR z$orK4H@t)0dBJh5({Ly%mipn~*Vt*K;{echC=9tikmrAF_r|Hb)jfv0H&a|j@+A@c zq4$PHUuV%|Gwf28{pC{!f|`|xxFwazr?Oupf8#SRYfXn>DB_hrBUr*9G?)bx__4xW z6Au5e`1=<+OlbZ4Q$Wm*&x|8YS~DCX&~GhLN=eXQ=wWo5o|I*Wk~_%cRX@k8u!WH^ywCBTK>{rFrIv9}o%Z|bAH59_qq^ELY! zlShGHXx^`0>(kRgm2g-jdDL)(v#`iOgACGWmAT!^DBL2+d$4LiIBz0S&8D9WTC3w> z#cP(B?uKt^DG-~TD(6S8R;n^V`i0k@Tr*SC;)O2y7w^yRBP$-0^eoxzGWiDjY=jU<1BOu)2aCUN+!}3~XV;ZgF zKr!|lK`@GjH27U~wk*!}4Fo@ptnl|N4zQ8%W~lsaVM>f{yKaUQ|JImQV)r#*$>?Ouch_#u%&o!g)?IO!}HsTB~Ffz?X8n@bdCjvS9Nb8?&Y zlFmT&yV_`p{35Hs-l=AY*V9_Ehkv69-b&`AsYx6L(zf4yWzBbIb69S#hoiVfbpeN? zdJO*-EoQ<|D$6Jk(5hW%ZPZ)SSbN_>|2lDm$@UZXg)( z9VPLj{035p0HZMxSDW&JwV;>_n=((Lz2))c*b-ZO7^M0D8*O4t1mC2LADt*{2j7~L zRdwMr6(Z<}gaGZbUrH47X3(8XWSFDjgbV0XxsndVTHNYcIKkolO4i!fH^Qu{&01+`ilQ<3|pazA1e3TL+VpBYSQF_5ds$BCbnmK>FFzxuaILT|mP|RX{B;e_!-V+s-Qb$rSTK0197oMoD)miQ}3M@@z7nR&zU(|pRay%*=;M4D5SuQ z(4Ty*FRkd1`>SeAYSB_hqxEvRhY<+ms13mW;tCU2t;szCzW3$=Ib#$MZwzxYY;=RL6VX& zAlkT<#wFDnvWE>V!c41N>aMmd9$?c~d6Yzy%<{QlgKh83r$~d_1dDwM_=-*Kgt4PU zOoPe*2R#lIdU+)Vuqcdp>TuCm{2|NW;gphk`6&+Z-&R~&u~UQGAA6U%k8SBUn`?RQ z7ll#Z>5eh|A)vwU7gnRYAdK(;4!JMzs14x{wL7LAkodR&nrVE2nu)qhS2kony#>7- zvsT55)~tpa6?l&)?AEeCgsIwCiE0c|dHDhoR|{iKq?FJLqvf9=8dmA3P}8cn*A61q zLkA9`P%#CZ4~a6|U#l5gv>|U044S~bcbO{8DXlX~U6z*CoD5WCkAHJhQ_UNW+;miv zhD%4j|IL0rM>Bofv5-L$<-kw1uX?g2FtEi4>rD#U z&Y~E>Y0W1u(jj(sb|S1)Y8uWhA&(!BMs{i(PBYaMV@=39CD92rv0ey|c602JspN3b zy>FRF95oKh^Y6*YJ$A8P)8HIlKm256cN6|om-~yiv&+TN@fj8el{_G{h6NH(5V$pd#IF;w9vPWRrPEy3V_$~bfLVAxk+6kljKK_>+ViBL=LUAaMx+sXyR z6^e_C-J*0myDBVlV(pHYK07TSB)$FgYtQ8WikcQE2*ICjlQz1v4KGJVXcn4am9xloeod7Y+N|VrOuLE{R&`H-mj3}ye)E3L+%KFD1(sG zs2`_f0EjN)&KHtt!)Y{`Pr+aU#Y|~(%I~6M9#I@$h9#j~m*CDYW3}rj{66gh@rYM7 z3b|YV76vy`^f7QQv9;Bz6s0LD?wdvcf0Q(faSz{ghgL}bWwmJ&*BfmFhz9a4W&f8r^? zPBn5gv!tiN6b`SkZI+gnU+(rJly z}y@u5~L zuScp~kC&q?4#b~7f4&>}Sj9mY`5(5jY}%lKBkqKKM=gEY(d>3*(ge}1T4-ZspW$E{ zJu2-8$79jy^3Kfr^`FG_zv4RK>hJW=Kyoh1623UV5AbmfZgg?`e&cFJ0HR1QDpyf&8{0wK>PIi`tsCu zm3j6bzwJ-%$c|fiY@RmH&kNND)(M}&#MJ#K2>5lgXYHoVfhu_1F{2cDGsEwwdRq9M zehpVd^!UmydjHCKXj{#Y7bAiYA5_eurn9P>`qSNcPGB8J9V}tCz?qiOe7 z^M{=C&0Ne{n*+h&Kihk3|58B6=kzjI&Eil-a6XKnq&~^rFR7ry6OR~5e`2(AOawH^ z;Z6-y2PJX}%&hb~xxzhn^%{WGYpIrNWj)C$I+h6F+iyK?wO3Gw;m4z9O|B)trw~fN zjX@-fS6E?M5aIBtA2H|Sadd740A`|>!;xBp8YzeoBjoY1O>o&D2rj3)`WbC@{&<&; zK|Y8A%a1fsZIz+YIU<*1Lp1oMs8xkL_2S%bWuZzqB=#$f<_Y>&NUYSo?(0$412$Xb zT!enf`w$GBx$5HdreeOfFLvjm6MSv^Nz!q%hastQ8dff+3Aj{QVyJK+t7VvUt%zE2 zIYmppt$UOLb*P4*{|aZ^9gTKXIj`cJQ$8q4A0HmB65%7nQk0ymphU>0G>DfuP(p}H z4na$+?4uZpxEN2X-hCL;Nm!V^Z7EnO3`0UfQY6>5Zc1xu)%AQGL-LlSLrrC{{V|+{ z@1$jYrdR-wxnL-3Hl%$}&st)xM~!x~G26-&hxUC~C}Cu*)UyYk)MomYxcb$|7et4o zXuXO28R1B3V&~MJ(Z`iJsTNmz+}x#B4kMvq40vmAi#0!nMp}Bes3dPs1VeA*Puq_ubR=1ua&;NNVUo^854Cw_XL4$iIQAO4Ls90GF8 zL>*>kc5K#~LF_%`LCZxZY9{0m2z>6Exmy%TI313-b<>JATEgh=;Gl$r1a#f!$!nu( zs3>PurLVFWQRMJ~o??4Ejdv)ovW(_)lF3d97}bB{aqDB%_17^DhKc4Abzxhc?iR7X z5`kCy`P1kCG&d0#GH~Bs+nm1S9m~m$7N5CQ@UVYxle-? zDv9)8LxU7`FRNUK%07J5{=G!U-jh(%7p1xSA9P=11sZA%VUb0K_x|C~?cuTDiOK z8;D#OYS!tHJlKV6^(nYP*p8Eu!tFaX-170P--N19c)(U>Zd1v~7_54!4&vx29Gq=d z`}!Es$ANn=Q&N1yA!|yc-KQ$$iJPDU2J8Uw_$u8lk+EC8+D9&J8%sq#V&ay406pQnc~#S4DmE=z_mj^&ssO|`Mfc0PjV7q zq!OZ6jLt`yRLpGM|B8WU`w#>0_9MgK2nj-o@C!!V3+@fCoDojkO#eT1QOg0RY$x5G zu4?#X-5(ZL*1ztCXTSX0e--&sS2@s7Qv*Qyv~+X;$D3}``7rUiB=|I<+W8;5Y)5@ws#9+p@K> zvH5K8@O*#49B@TN_V7DbG`Lk^yrP1sk9GRck%Q0+s0kET;PZZVZP1V}o&jFKM6(Cl zyC;JM9DzJyD#<7y_|V4ZY2~x^YO~$W;L*|1 zD`XEw;*V~GMmWJ5F=DdaeFa^C6|Qw(r+Gftehw`v4)XMX)WlVyd-&}vDzJC&d`UVs zNWp^xX^DlRoCcG`o2X4Vr*j+Wv6;@1;~aV)o{iL2eukieOHGK=h;diyobbwh<&+}9;(b; zU%aPJvI~;WcEZJxdxuJQ_xU#kM6$o!X_d{@T9&0VSv0Ni^Dmi{+&AgCMTXJzM)|{X z?UsV{{+V(T`R|(r)}m&8ePs2<$EARL*T|z!`r*j|36321Y-4Wa66sBN$J)T9ROSvH zS)C5~(pOiOm|@BE@g8xJ2+naLz*~*gIUEOu8V+Z*A5YD1y?N5@_(^d5a~Mug2fs^` z!{%>~+|7?oCi{E)%pGszkAsB6IRH+Fg-*ufeCzy?=njoHfQAki%Nv#~3<9LD zy*=%|T_aV9^g2@Xe`@*7z2;y}JB!C^k0Ip^6H1xVgfVsQst2OW#zjo%zmH->$GEOf zugL1u(Oy7#So=;dHRD*KMhV`2z{~P@4K3!5w-_P$l)|2~)KJv^V?fkeFFOWb`os`6 z_q~9oFYCHAfBHYmTg4hewmu1E=rH2bcO@vflyAkaIokHlpL{ssL(T?Nqll`uuoxfz zZmhR{KJP!Y*;onr)XzS_zd{m>i-JG^eVN`Dd~xZ#XZ-E%bA9Qe8H6%%73u!6-rEa2 zGfwDu?fX+R0JNL-r8ndI0CF{)0YHA9LF|DzX2Cy&g!Xs-@LFQ~`&_iy?QUczHfOc{!}Fp=A|@ zKxfOD1o*jfCcp);O1J&(%=_5I*`-l5)|MWJ0Vh1H5>VGW7hlC69yb19PR1^wmY+$s z(P{H~Yy1h%zXCMd><(x2>N{>@!FO@(OO$Bi*e{E zCY~S{v5wL|ac!&zKF!Gxfe1wWic0ThO@r_A4V~fejf0iR!6%F`66PxClK=&1qinKL z{f6Hbsy0k^0q4L`xGa=5E_j4I|7LVBPku+3G&9u@_0t!*6f-D{m;t52@R9MzEoIja zcAvMAPCHUx7U?=z^p+^#C^F^Vdc~c@FD#3tQ7_+GHU&&cuS&a`#Dr(@yYcA?;gak& z;r)I4@2-R#5$QKik-i|dn`=h5Um@`J zdJ)}^AB-0K?Zqa&Zl(AjPPScJQ(6Ir6W_iAVxkn(z5d;cEYM&U z9d~Mj#wn6&I}bFCFE>fPWWt-Dy!#ceZY4(F;y<{!*DM(jvDAy>m_ONeJ#OhC%JHXY zotkg>GfKG1w8S{-_%qcp)z9B>OZtSur6 zmjz(20G#3fjT=M5&a-^_usqZJse`Yu=X^GAuP=akL`k{f*ro^YI5qEZ1A7i?-|yOg z+~Yy-@FXN9KZN;{A9VY{bzRGLU61nuR)bULA8%`{qHL*3%D5n3pxlm~Js|Jk`nsN4 zx|Z>brn~bzh=q}v*&DE{9G1>$RB(Oy;INFspX4=SLd8T;l) zOQD3N=MYKYB2E5lgmJChV20sFWD^dN2|NJ#i9A{Tfk`HTa|1(|Rw7)=br6`awtkgJ zqJ3kx;vpo+z}K}%@G)X;ZH*uokoTn=6K0hSF!)1GgKw62DV)Ni8lWN76Fsz3Qce!` zIZeU@WM?{6PvC^!Ala2NhMpV0@&E!{lCa&`Uyb}21T=NYIr03d^iZpEs|8|uE-63Z z!M4is8-+f?Sg+<5CGD)2{J0JhvLlwpuMrWL0jV-ASD#B|>qw3dl3$@h>}i!wslj>l zv~kikOZU-&p2z&ud=fK^|G4-BK?qE%@JDk|^Qd*gL=AnV0h)@4AmJ=h!{5gukE&O~ zS}6a%rGA`KSAyF0(tQ#PYo*8uWQ{UTRc}g7HrL1d@JZs=4tiX78>u3$c+C%_Wi`b+ zvyHl~p!Z~KcoA*;8_s(6$Q-BrJAjlc)oQP{==Rk;(b-Roj~?8k#r(D=__XZ2%S9rf zUZfCCNoygpI$D<|0#Qs$f}!zw@h(Qn*c{pp(Uv4ZU&2%244!2`qNh@UzZsPTnjy9y*9bH%8ZDZ>YS6}U~AyS{P|XQ527bSf?k z{(~PKk0~Hrosf5!))q#8gYVKV{R5gOVprhll1yojBShiYl~u(M8135 zRlu3g*+iqWbHei+uZ>p)C2#s}?@O?fS_(0ds6u@P%j>#@VCNFMU2D6$6ggMG)Kh~q zyUUOA#RN=)0DfE!RU4LT;eeX^*NVZf746$!)_~zpjHu#{6O_coJ5Onb zS4m423rXKmsv+-Ugccm-NT+w}!>zk#qw*C0+4lA8(`3*4QDVbsW#X%wMKp*DWq((P zVe-Q_?G+P1dPIxm93?PA16p-Tl`759@w46j?VRD-n2A6?^%U&UG35)H6Av`;(Syn4E2vHQNNJ#$4EN;d^$`T+yg>hLXY5JZG^L> z2E}wH*``sb8uG_pYmx|o#^5(^{)&>LsGawnD2BNSI;S+bi*pxJBuNF(4xZ{QUokmD z>}@q&r4pR2nD;`8j80_9qPBKTB+anl-0-P{*r1oybS19KxHUSh7ugJr{&Er!L!4?a zeDG7V&<@IWENj!dY2|<;m=#WVp@c`)-)nSZCwq@uN8+5sF!V<7^??%Ba&}zk0#~Qb zyx~GG@Kn?yQq@B@%SgLe{|-6^WJws1;+2R4*nNk7%rXz?In%5w5g2V!hF=rhl7}-{ zfYDd7mR7CjK09B3)0g9%hNd?tcd&PA+NEcH^E$0t*Ii{_Sz2-fb_k+KMASZjgcA&0 zsM7s^c^puDJAe10*<|hH_fxxc$qx?c=;pC*LcrsAp2?qFqvCxZD*&MZdkvtA1tv`` zBhZd(%l$k^WK*wE@!y8S0w8%MKZ;we=T~gHysi(XGBZhr?6|nNoSmKdCN$O6r<~UA zUM#shc1IF{DF412_YPpVnKu~JEFL;i#{TZ@6%okx*$$<%UT<%yu4d)t=H}q2udbe4 zSWvA{0VH6pZw{>kDiC;md>}+;Pg3wvVWm+YUq?fu*RDOC3|Q#G@)%iI1Rws!SEwA1 zBz|P+yx&gzsQMj8S-BzH99Rb%G%A!B(9qDvCMH;b4_@?R6A=*s9U`cG|2DdOTwL%# zptK?iFeT7N8d6Dg$G-Bf%5nT300XM-ouOuAVGeu`y3At`Y4b+jAU)*EIPa^&eo0T4 z1@GEL(REWG?mFk!AWhX%SfO)iboq+G!m&5$pQ<(VmOhjkldJF;+|!4ch=@#F6<4N5 z3a+gODG!KB`|Dwf$fq*H45&&wmUnFR&oK0st?-h|`Kt`wIfZP|*9)TG1RlIctahnp zmtP6K@i&^c&BV8)QT{W+@P5lLYj>05i=%Z{W6O=9mvSv1M8eY@+`s8-GoS@+P>#O5 z;-op$`=N8jhEs}sU-$DHCcFYeBJ#H2kF@O?wGX-}Rtv1~q(a^A3(oLu^K{6ZwuuN_ zJ==z<*vuLb;|>{gS^mEFGNT^7BcNz3DOW>noT5%dC|efHC}qj~u>eKBij(flv23xY zyPf)WYvjQp4+!Me5`ceZ|MzPoo30xP1%9r@WEf6=3JS@yUp$4ObTKFIBbmbmB5D(u zN#Q-=3K3Fp;!8GuxoaL{oC;*|7ugf@O#}8X&jpga3Zm=H21Ay}8KmLDQt~(?46GMkyTp zZ!DNrs2_W(iMgXO#6DEWRk@QugGojz=!%Ea#^C!>A%PfF(yc_RX}z<>Js7(#zGH_n zZ`ST;!?HP6LXS)z%l9Ydp-$mubuRC&dm08QuOm5OC_&Mbd4rw*{g}_qM|a63pMUhy zanbi5Gi~W@9}i-8J!ECvNaZUN3RNUYCHOMP2@okn@fUr=uf~ESKHy8~E^Y3~?fDJQ z%H^5lJ&vyytLg|~>6i3SsqkDxCINMz-X<^GN^SmGPk&4rI8vo<3*$)?Y(*6f~9coFL9`}VNw+gnGCqY2>`!f6B}M$1L>*Yl-E&bnUwME#ef?CbQX1${*1ykB^FFNmcT zur7Xjh#G%O30uZx+DTO=lWmvf@p7bDtA4=hAGsJX_fS}%o`r=!b5A(y6p1$ZzZ|! zMP1QNVhKldDf9A?f+{(rf!it9lIgvYBkYl=*%up@R4DH-ahqva$GA+BlD;TK*hoeOjz~8#FD4L@LdiSc#yR>WKr}!{EJw_9$|zvqmX9j~s~kZz}}emC2!; z<&uh8)!7SQ|H~xpcU)i7b*rhIcTc2f0nB2qkYx#1JVg|+HFpQiL{4qBd9CyK_k73f z-&tiiO!oX_G5j3F@Ur=UI9ikq3;9T<$19jUMIK79gmz8`wYG5A2zI-39xXxrVwXK) z9j~RJXusT>x<#+HLJ{grh-0ZG3JQm5hV5OBaaozsS1{b9{>sDs-KH($q))QZCc5P} zQ$`piDl#&GILz-zi}rB)VesY#0x%eVO;S|)LL>7CQ=_>43T{+o+&K_+SUONq66^) z=N}*|5PJl~s!I<+!2Xy*_d--RVCd)_Av9K8i z8u~qYn0gyUrwm+c&CBBZ8w7pJva@~!qItP`_}V4~3X^Vv29&bMKT-^Kj(c~@j}_1F zf2j-j2^;xJsAB~4h$VcQE9Oo5l4Yim)ZBpL`z!c>9P9@UrTSZactxR4LC%5WUSvGW z-v%bHoFa^4T^)j-0SRG1rGMWVKGC)FI8CWD(Tjt{OyL7Aeu)&|e_pJD5;7*2RbrDv zBpx|!o8?mI=nPn8uAE8LISS`%;Q zyC@Cw=;>EVr?N&5BtKYwlcF&PS}iv4)b&mar<#lC((^bzo}K^RyYBf;Qlk~vWU@-! z9Z}7wrY;332T^a|UsW5FHQTmVdk|V2{Be34A-H`0cqEip^PMf_mXQcriP!i5=`vZ; z+0$e*s@YMsIryv?5>4!t3H}QshD+*RlI$`~-+F^&#ugu|GW&8eN=_E&I*~fO!Iir%XkF{Kh!HzFm zrm(c3^z0#2td})npiumx$BR8pfQ{Al=&v2lKx_U;Ku?Z7zQfhk%galT-gg|{p(xVm z?WHzNUM{WG297S$uhTV3?MO6-@HPfGx^(W#arTuzjT9P&ii#dRJU)a~Dlt$C6R&@+ zvoX3pIF~vezvrHuJ~C_VIPC>I zykva{vZP3%;s?^`t$Uv&%lh+I{sC9&;Q1Nuhxprl=*1Z}VEG2a2>1dY4(t{7!h7p{3Cq?(T(ba_* zrjZtP?%nUJ>ECm$RudeXW}~SdBqW_ttT*RKhZS01)%EUQZ})7o$@e3MLw%6kJ^8;D z+QiknwF9GZYb3~zJ~#m!n>^OD88_CLdSilpO>c6Hn^FOESYM3A#*NduFf?KWX{EL{ z1jL{Ow1@^OD}QEqC*qPjxN6x@0_|#$gHq_9X}!@n?dpE68yp{$J=lxJh#U><<%1c5 zfRNEF)e6-f#z&UdLx5v>J?6Ch94Z9w>#M_iT!Pl?0#dzjs{fIsAI(t>`V%e6%Uxbe zV?|1~48t)FS8QZM%+X0i+FZ7e1!L^{9t8c^s~N05b=d*HQ4rYp=Vps2OUwtV0i}k?~V_ z_Cx&>UPd}H2=M?*uea(u>E+9Y}DM0}~IzE=AjbAgVdVPIm#*Ea*M+L4& z1@_lZkqr6(_FsGNcUoeWmX(sS$;}J_1M-JW?(zSyw>3QN@?~HU0xlbHo(FG!em+o@ z<(~rt#EhBnPXIR#Sn$_A{Ns)S^t*8Yh>auu0t84l<^EZ3>8N-0dFZa`3+t4F3y+!k z=L?6MARlgpv&AgsM53=w6z(?bja{f_oR4JWDr_zI+&|bLwmsVv1joxT%SNqT7ZB!M ztzDErxwqISIk?1qwKBGCQUT9fDY-=toq}NK!6JXAN@@wkX!C=CV`!LPfFTPA0Ur=B zn@6PG%zPa{ftq$ntChW29rJ6Q%cU+P&A4Z=doAlTGJ<)@f0Yd%GAggQf*SVvv0&rL zO$cysZEuh*q-}XL`E-YEG{9dfV0PqdC=w_yO!es|u3*S)m6ZX5aabOGsR_|YP*hz! zGAox{Za=J11ZQ_bXr;Kc2nUEt^JlMBeB~sMO&(=Og64{1dmN2*T z5SKdStddNL!Gio@`-+9Wv{toWu22yI&%(s)c^vs}Yp)Q+P^B1DDv@IF zI;shniI)_3oSm?8YOL8+wWV_=z>f3f4fX$onD1qVT4yvgZuLHk&%xc*NNnN8pd?|~ zq|51b@T0{jna9y#|9#0^dh&GY?Bs8$;+exv*{uCthllUf?ttG99Iw@?3$sP}{x`)+ zMd{~2O%RHoepvK*`Cdcca>b|p9*VQ)`Zg|+nwOG-wA5bzB_ys_vUhW-Yje8#4e6z- zv&K>7g-0g3+xHc`bzb~NciEPBF&Egy#VRz?lsM=vJ3rvOUZy(Nhwi?S@Y#YSCMz$& zhyjT*2;vITagN#;!F@e?lXjN)qF*CP{dr>kt||I?dLg~Ln!2!sY`e>AYr>(mZlm2~ z@O1GdW5x93PT9Ahf`nY;imlYC`ugPYp93^q1dOD;@>6TWn;ZQ;5E;R1>83?voJJ#3 z@eq&@rk1nyJVrh0?aW_HW|XscNIGuCB%F^p9Iy!9)Cy^+Ft;`L1^7yNs*v6i8f@H9S3fT-7EI&^?h#B0EoP=Q7&Q6i*5hD#)O~^44ka z()YDn+%XywRkpQKB!4cH6rRFx8YS#{lq&vqJTS)r#mJ?dtVOfA2xff1m)2<@ z%p=jv!w^7sTy^b8Sb1<>QF72ZRndoYWGJ0d&=zxcJd*a`aWfSmkqYI7f2S3T^F^Sn zJQn@X1bDJ=(T7Pvyx#o>i!sGQ8M_|8`bwoBxWpAS9*ImWgf2bE^YD$X(#6ZvP;OsN z(<6AfDbg}-KTg*%hfSV9bfuU>xz!nCu)LLC{Z24tRG$!Qad?(i9~6Ng|8tV+Z7|Ky z(&54=D5~C8qJ{(u)IJ`@(g;}`ByJV|Nge27D|r0yYm($mgoJYJC6B1 zq5YOTJr7u=IAg7T>QmpdM2e+rVoc&OQmzrbxA@d97B2-VW(=VtCceKKTg+YcNBPw2 zjN%9ba^4#00hhnfO^+56-uHhi@x6`gUiJl_mb&0M^JT%uv}L3Sjwixhw_tq_l1y!P z1bE>_E0?CjartG3(pI9glST2bjt@9%x=yiX9*#8~Gbbkvk{gSC(I-|{^qf{_T5p`c z7Ln+UJv{i`W1~A4SN0Sxm-36fugS@{ZzhbEe27N=oe+ICcd@x6b_-J|Ktyb0Eez@2 zYUJHi#tWFVoDmWtxoDzAqe3?qAUdE9(f{dItnjLoI{jEDJO7N`a)&)4u?9s^dj<02ZG9JzPOB}8?GE}IA9`+LJhgjWM|L6)n) zHjww|y>P@i`7|=bK(aRh3!|7$St*d{F3IXpqXflKV(=+$IH9x@$XCylnYW0nc-F8Z z4_CP{i=$UZ({kZQC=hA2_9!QAgvm0ng7%G?k6qHPz1HyR1)1Z+#>hi(C^q?$b>I(( z5|4(cO(i)Ecc?l_9RE$I=NvjN-@RxtC!ZX`P%Nrzh3fiVR4EUSpEl|;`8MuYOjDFy-uT>n^FV|eiwk%h;rR1}JK(J< zJr>5T*TZ!T_6_mhP<-|*YAs3;@2KRv2>r(FFl?g9`8&2fsf^;R%^R*}=rM#*%0o?$ z7s`ZG9Upv{lZAuBh!FV5#&PK+igmXCHsA->gf8e{XK_NML33ItvB+MyGoihzB}DkR zFZg!oN>3arK{+Lr@^xKDt^BKeNMJP?D-^uwc)j27_|>=C~T(Sm)E$%U~BWa=1 zpKkWQ7UPW{LCj(i*wg{Rl(5mhmT{2=uAi`mdwandnPNfrd=Wl%JNI+bHpio~q>$mW zhlX!&rFq9c_cnrB1Z2O&=Ld-P1%Ulef7iy4Uk_L}d`N0MrpTIhqDqw$fdqij^#BOp^T4?iH zj$2vnd)%TP8H>tR)`U^IABQA6evY*H7Cb~z(Le4hO54{zkr6Y$zOZ~}qvVFVV8((a<*-0fXFhdRut1!<8Z zO4_^T%+<72G7pIaH*&4`>X@j7VIcdHb5}ks%L=+3t{Q8lK=b|U-F{jaCl;JbF;WDI z@IrGB9a~wX4XU!ojJZ@B->Ph087+@yL@wk7!dTr%kvPCQ7oI=ZPXy`~P#nvbm3f{@ zdEinZrks}5KYgLOE=uCnv#p0arG>)g{H7FyeqV~VX1V*+ekz`c_gJ-u6D)tLTCI&0NvNw%f~g}b;RJ_7X}>h2&S>x zf_C36nB}3hygx#=u2~DU8r-1C5V|3FSPm=7jupFwcWZYC-AcZc=H&WZS2gu;Tae z6I3a&XmTZUewfj=e>#yt!gs<*_#w-Id&;d*UvseL?CpC|>GgCLPII&tm0%fvV*k@4 z=fQI9=xTY}RC2ko969{-{TJc7PwI&3OToKt{fdhWeVt(CxkAx)%*|5b?zGG-qeH%L zm#7P{2b`9!Q%tzhBtKIFe<*u4TOtK(^OJ*N`g6tD;*k}Eg6}>uZnMDmI~TK=cM`=i z1aPkfzz~?cL`gnwm+}f0E^QqM1sJ$He_N@v{w2|)WdbI) zHk2fgar`W9xaKn_eMfipyE!v5GpzD$9@9B#H8|VLbt|~=&r8EwMZhW<+4{pi-7}d~ zp>EpM{>1$TFSiC~=ZTURa+F8{D!L6qJnNedZPq40d?_r-&^SaoEv$GzJ+F&V-L zL{%}qh7goJgrdnDWu(%|YnD{Du5%TVO8DN`2sH4Bk(WP9K z2l6sLUJWU{zq6!-1S+e)yU_?6zj7KrV@5RT!ulTdruM@d-DPd*_+@e22X<$7)In1N0Nx_hjN@*8yJ? zL)>}^f9vT_&D`bNd<1q*+2y=on)SV5D|R7CUUIB0G}@x&7k7(~=MGJ2nC*40n~UB< zx9@2(K?E?zXq)2D9vZt%Mcl zG0oNX$9O-#w8AX8Z^F0SPA|OOCQB5%%$3donMir2l<#%RExMdK_G&^2l-;?0>EcNQ zn*Y>AQa_U&!uZ!!bBvwx_YY^X$wwDEVYQYMnjOdFc7u;w(tlZTWZ{mc<^CNeIu^_>yY}Xa7@c)FRtzOv2vs|yp=R*`hYmLcfsQ@6%9RBpvA4gC)7EMQz>CMIK zw!7UaEAvb1G=<0G2|mPkJDql4`j0QYKL6U=i<_mR59~)#yjH1(BVm#xchp-r9NsCP z+WBii)GnzrNVOT)Y$k>FDv z0Sda^Z$O}pp?E5hG)=SBYGqQ1OfJ88Z~557z~?^sw5pk7!;=plJP=~33>7jO%OwU4 z;ruAjqk6aN73rZUkgGU+yod;vS}i^C&7|14cn6 zX`k0f9k3d44I>adnT`X2F&rkP(Rj0r#+=B^73qS_|5eo^qrjABgv!Vr^?INS+<+>FR9DzUj`>xV$8MBsj#;-mNsBkeg*KTK)x}SgkuR@yLX#x50>Q2t_l~-P= z*Xu(=L*M(}_f}R`Mn*>N>$#7_%}2`Y|5F_RSKsQ~x^igOKu6c;pf{jx%S6|Pimczz z9C=BFa3m3Opb!#Ifs7U&qX^^<4Pcwn7d-GxK4MAx7cjqJZcH}hh)N-j2f9EuBMj`> z^S-WpUn&7|A3zb1j>I4kMvbJ`j{|nx?;=p0!hk@C%i9}vMFe>oBn2Nul7U%3fqo?z@^jkjn<(2?i?>mz%CDsV;Bcwdcnp_ z3?dLqZYkYfBgUbe6&_O{fLZI1EuWc)rQ_wzt#md+5X5%5oJ(iVZOxa|_Kc$@DET*YK?c2K_2*6sc7LUg%imFzt0RR+=1p?!)o?j@$d6{%mLG~P*D&4)jH%$F( zGp;TK`}A@$boPeSJw~6L78+OYzHfRADsKG!gA*@&`BzG%tsPc-tJCS0w|=^^z0So) zMEN;?eIuT(>gY3#i&|$s?ie5Jd9ngigrd~^#5sM;mFfTeSO2EdvV6MUB34w#<&~Ln zVway3Z-WA+dxGkw5OJ=gZEQOScYCb~QKl+*419Vpo!+La{J0G8z|Brf>dysfq*W#~wPt zhxl5f30V4ne)T*r-c224>xUkqC|{Ta~vVdUUOoz4p#ePoCOC z(@dw+jm2Upf;Jn?gZm~A?AzaJwO!YV#bf<`zblIQT=wE}MHf;>DF`OHrG_7+p(j87 zalis^zW6wvF zef&ub$LsYvilQN&w;g+UAir_B(rHVP30C&z)+=7jO2lvy4?%bQ+g*(+cn9uWz5dRb z*S0k^REVOkt0Djcx@}Pw6(&V6s%E|P{;P-g>?0|vFLuw|xp(R29B7$qE4Sg!g6AYQ zF%Jk42}tuu(gq3JG^?)iE8@KfhZ zDi3Qb>*GV011{DY$4Q`zcoao=EbK3J4cO-elD9B0h!yM@0%JPR%}7=dP_z(93APJ? z9Fb$yO49`m-_#vh&|Cz>Krnz*Ejf`cW`&jJ%_@~^VNnPJ!w85$SewrDAqw&=EU+oh zMgkl6ff^q6Kuifp+snuS7$YrdOAR1{z>*qFFg9DEJqHPK1k<4ICZ$GEBhr4M2i8iC zoYX;7a|U8Va3U3SG{Kj;cufJjc{}MqAm_1_rFDQMf0jZqZR-(xIZhh_2Fsu>f#lD? z>^%zr2`CznVH9uxa*x}jDH{T-8*;Di3xiC2fG}yOZgHIzu&)i@80?I=lAT{Gc`4ZVc6Ezma3|yQfa4H z{@dUFHp{Zh%gdrDuC1-vwte&FO`4`lr4oi=*=)94E?>BCVPj)setzDvtYk9zQG4S@ z%ItrjGAqCR&ihO2GY9q>x(&Jr8}Mf%QQa7eqN(*jtx4@c^RAD{X`kC~_gB-ZKhy?_c_aKJky*N(?(8->D6S1$E>_e^hLr(Py63!Tv zg4OXrKcz8%?Z-moOm>bezjX34qm)+JIXnBGG{4HM$GVK!Y}9qk*2wA7m2 z?{aLWFJrmb4>a61Rj$67kAO=pF}~-q)~1F)W(U0Nci1rXKqNy~oS!L1Ij0TsX-tU7 z*Stgvpi(_I4H>X}uN&W!0r~mT^2Z;2V)w3Hx?xDNM8VL1Idc&o8f;=DzFEQ;BJ3-> zZO=kvz1mOhdq5CyLp7rDm?=xY_40dHMC%_znznyblI36h2%te>@T8au~>|v zs9LQC0KWjGilVqvOS`qTb>P6hBjZP|UfNV`jbXP|TYb90>9AYVQ5p!~aMS>ZRm1*C z+l;N;`iFe?j)$K-^#}lhs;cI4Im@!vH#TQxr#o^mw=92bZ*lMbebrhm&hc;Fy1w+z ztIzNIR3$$sb6fJp%FM3A=|p0Cdwa(^v)k<=Fcgm`R8{SCI>}^mdwaXv?as{1kR(~D zRB(cb$6`Nz^_A~cwFGMqIVF=XUNwlx_O&FjTo#eK$j1nFC@%Db&`oh(SJ(6Csk=+9 zTIohO7D~hu+uPeL$3-KtYPEXbe5u##7Yl`d`#WE|iBr!EWy2&jZ<$+?S*q9lR_))v z@xiVmk2kxuTqH3#H0XO?xm?Z<3|u&S_Ser|iVg06p|yn!&CFZUUZp9(L=B1l%JZMY zFnq^+DHe-~qNu8BDxEp7XD@+;H}5nc9EwKDUb7_X1q_deS*!(J6h&!?j zrh7$P$MpcBY}NxJc2n`?1_$dP+qu1f;{M9o)^Gi6_2o@<^9SFb+B5sPXTI{4&wTF2 z{G3<5p2e9mDd+&VX+Tj)dPX#58?B1lvs?EleDPN1&IPAVb|}sQ07vUNUEB!Dz7_9j zfv#9RF>R>2+tloBM&B%S6s}pLyW2$=6mV2E+j~b&ydUv2+arKD;%34IV?$mU(|5Jq z2b|D$wtH82ULxYn?&?f4xz|lDb8`@$AYj_+*6gkU@eWO(ZNx4p0_Rbj=L4>VL7e9S z@ni(UL;=K`e$iLAVYg!dI_i*=M+OiO1Q1FPvs0tDbZ^yNB?3r>00g1h2#vdAa8{PJ2 z0{KmfU+aqxnr&sN|J>(3@Bby0*)QyBzWL2?IPAJEP1E20_O~OE$oIeh{pIE5e!mZb z;Ct`A=eq9T;2?^k1VOB-|v6sGoK+zveW5|jg7tW#v6*FT)uo6!>~%FGCe(w zqUcBB>?39NKT4TxzJBK2mASpUhfyVH!Bia^Imb>5YJHCjT`O;kuE8K^iOwF9_$V&) zV<3k{-iQ6cO5*{RY?0I%-y=H2Os9ofHgABi(+nsUBcP)1 zMA2xA&-I{?3{NUV%D~Wob9`0r-qD zMKb(Q86_4aVHOd~KJ)>UUTbtdBbEGy;eTaxl#)@5Ci9|1Q8lCq1tNwN|89y z>YAPYMlPR~B^5>BSUkRy6iXzMmSYPn6)3?ykdJs?dSLWt8)bb>%Od0x2ah#|ck{>) zlj4=?-Js_j*>n8YzW98rEpjZ&^L)KtV`%Et*WZ2_K&*K56YX*&LY~2MNNw#?l_g29 zt^=f%o;bCC-QyXu@7zZD^3ADZld(wr```QSkJc7;H&&aHTy8_h1`3&UPLlfB zT+Z{n`?im@S`EXnL?R)}@-Jd(p1<=djuTz6{m`MqF+{ksvJ}k+fYVhp7DLe(fV(_q zdDhK-?^b2*_e5pOfO3zV8XF#MH=FrF!8FZAqmj?&%k}EN{?W_vk%{@s8|}@7**z1N zuU-FFZ@eEFEW!qY@%bnbsbaNUs1PO?7=a^^NVnTek*p2x=bEiUN*5hTU+uL87aSPpQ$!f) z+6!&yE@ch0x3I19-9$2!Nv0W=x$lX&;|G>9J8;w@{$(xq1(35TX8j z#}Njj)%i@J_{1X*yS81gH)4tS#{B%hJbOtVn*7A}&2TIkAlxtv#Bp@F>3s6JPct-A ztyVD%+adYsx}MMHO~a@+>bquUrp6}bE-zWSTPZlYa@$fo&d<_9p-(I{dh?(Y9|6;b z#zpXc$*O>UEQ)}VANW|INy02(>KgX`o%vTb<~RyT_2)nL@rSo8<0t2Tlw%SvJou=z ztz2#Q7#1%FylW|k`%=nin*A=iRvowOrD^XT;9Yh4L{}5^B^OieI))QC*eDHVQ`A-zQLrGSGe?Vi=NWthlNpyGe9a5EHZ(YFE!`n%v~gGx zSW!QhwvCdkCpG;som-1{bWe=|QpbhB?Ve5|9E*fpleXcE!GowDxEAUYjt8PJ84+Yv znrAhIce;J3zlE}#YSRuEfFKC?o(aYCDHf6D&3k6hAU#clXf|*d2nry;1zgV~bQEhK zaVZF3*Wp}~3VMQHw?PQ@eIgNZmMTQxbOgWxnUFR{q8*2uPa}ATur+s$u%v(fv!DA*DYG3n$qN@QtgfyeJb3W#-Mbiu6^lhd5L8ut_~C~oNit27VHjQ4 zj~zRPAP9=02!hmVHCdLQd+s?!Q5ua#E|>e{CqL9w0G}b z*LA=3t#AERH);HRCLc1)33=UQpu5es=gK5vnppF& zu4U2iT$alR`e|D^xnWSr(2sDwtlOX7z6^RD$xS5;8+3IH@JCPWCUepM*lulinvm}S z1j^wsiNgVzs4|?3upkxzaS($bmN6<_)n48J0TZB68Z`ovA)ujbECkbdLn+)e6{6ps zkf95to9t@`nlTyERZL_YlCeUl4-XXwIAHK)y|p1XVH8IQhsMk>h@y}i0;C=uNOQ|L znmnkxjE8i?_T_YtRH5MjYm(~mhfc<$@mj5h;y4U|7uL6`g_r};36z#?5mz&q#B6{K z19ez1W$?RY}2Zx5HXQx&!USt%{IQq!Nm3wem#X)3xh_I44 zpsEco6p!9m5F3(5g?c0&G zGrXIIuu`Q4@#JkuOJ%~7Msqggjc0RBS1b10xuM+ghfZYUW2<*+7I@1?`gnhEAUWkG zeZ6&K$c7AtgQWGdS6-{hPP4SN2U4GX;o0NIj(fh>XtmObI1|1N^1iklN5@5;o0XP(2pmRf$!Jr z_50DX9sKY8K1~n;#a=fOj_lNXQ4}pi!l7^^Y}561$%yJ3w480lV47*eAgHU7Cxcq+ zC=yzAiAt-+Q25B`=zWkqilSmy)JiK`)!uA;=vGCtE0u38HDDnzMTAre1N&W0#TqVs zESnNyv9J)X*BcapzkcQBrH#~k@4WT#hxf1y*O#Pbv$=yT1^^%)i`k~}{hz9CkE2^{TMb+gsAY^fgWNI)Hcfm%>J;NhJ0-jmiSWx{w zjZ+W=f7l=#hM+gzdgEuM#Yc(*aR@!5qaTQYuUDs`;2@79-Gz8s_|;$iRoCc zWoi1~z5Lqi;oPUh^q&8E`#qh*fmf-n@1#SFu!*XyZNDhL8e zmQEZwNezU^{trN${})7ZI@-)(gNEHrotGTPyU3TOvtK% zZiK;bW@PtyYS;oWAMgY_Kme_Q5FvYS74zE4`sX@yDO>BHsdi%n!GKRTp(Y!;lf^YM z41#)4mt5Uv1da@n5P+l%iiAUcU<5vZ!UUj5SPq>hmoNi%p^$Irpuebj5Nw5r01rSI zwCqTpk4~m)op}WBS0K{%0oF%&3{1kHjvxuY0YHHSz>o(+o{u;uOfNRZr)xGb*AB)<$JVLKstQqD?nT1$5}qmo2=NHT=^ngIo9%GODQ z+d_pXq}qwl4GSEOhmo**t$ZaxvRddj7*hcB}h86&R z|B7rxH7A9aM*KzFZry2#jvk+krb)CHk}GivUm=keq_5Pvn&Bj25XJG^YI$G#?r>mw zYOU=;VvtNAXov+C!LHIy^(m}FGNFqUPb(dfQ?`)=I00fOM}-MiP<*A2tiDK^+~3n-OJtE;OgPo7L95?8KV*#V6G z$)Eg5xm^D2XFtpH{M_8!p+kpk+ui}BS(bJB^yz*3_U+lT=iIq-p67k_t6zQZz4t83 zdgPHuXquK~c_(5Qi^X6V&gb(x29zHuvyYV7{}5&NC+FW-np>UTGl(kERW4UU-C;=| zvYnFWY&B~*g2h}>;o=Z6lmc@)0mHa=MXG(3E9!PmRFCRh53BV;iS;DG`R=rx+7^gIr;bCWWw}l~7TZ``{aIy! zOpWC|GUa+JkfuudcuV9X`bAqVf_OnMkD`^=2d37lo&BB4r@(rQL@#*Ob5_Z1ZyoyN z-~Ekef7NUl*SD8}lqzW?Z!^(o$aJ?l;$|-LK&K~5y>c?0P9~DFEO)!zY$h83LA6#p zb>s*YqHdnMi6BO^y{;NI3lAlPWPd^6gY1K$0YA%RStf>?MyGycdhpPpBNRn;yB*K>01x_4 z?|)~*w|Fxtm##$AL3FwrqlpbRv{2#*!9`YrZ0qp+1;v+`Xgg?cIC!xVGDBw{p3h z>$=TGGZIe<0I_oMTsxVNED%>4DWDN^)tDh8aq2UF<8Q$*RIAk@(J0F>ul@A3KLf}? zSp8z>UL`e=)UDk-aJA8nM2p9c94VK}JF=`=sea=-e=v9ZmZmxsh2`_PAOITm2FI}s z%Y{OGfi0{ydngw8iHcZJK`R}m22-ri!ERfCR0Ie8E|tWs9&XzpF(eoP3@MI6vyrP9 zJEF=nuK(1p{YEkp%jU9^gJXqQ_|Ep+?_K^Gni|+5r#;WxrL+(A`he6?I~`60>1p65 zxO8CMEimbC=@4ZxGq!Akn(lTwsuPm>BevZ3dSy*jEssKxBl(b*8~rc%uJQW%khwh{ z*hi8F&g}nt?^&rRnm6zebGi@psdK}jWlQ!tRu=XiX*Mqw(;JZ} zU_o$V094k4mIB}~&RPWpNhtscxuoxUwuyo$;z;qMhs#Kkm%Ee?$@Wqkt*;UiqfxvQ zHh}=}eG)`+yJj@Ib;)&W1UBZ0GD7%JETCuyAxVrXBdlWS3CALxUfit5^&02fy&&Yn zOyIWJd_<{tbUXc^DHveM1A%bRk$AAijf<{>*x{HJ__jW(1#RzI)PT)CgNH~;z`1yG~sE|1ylvz{@WC!tqRYZumMhL){h>;Q0miHV7w(AUJo#PQ?DCnhEmiNuK$Ck`Gw7z%|B z9z1yH(4n0lVEKGL6bcOu4Mif6VzKy-J_tf@z5hFktV8 zEK6a@U7+F9=ru$;Uc+6dv1Ln1WgK+)GD1`^BCVwzq>aHVNiB>Rc%hI+VeFjMzNK$M zP5={#NySrvm2k-#K^iz|`>xxp%>=3QF#?CO25XU+KkClj)N1E$y>)8ukz_jE@Anl+ zy4qMTQ`{3xSSN`(=*KiE*MR&);yTznp{qk6_>=U=E4^S>bL(MD43R_~By!z0))6z0 zedU2;#}%a?PGyJldlwg$Rbp)~SzW~u9N&$=o7>7&&Y5nkbUH>On@wAW8BZiZ5UAE_ zLP#JeiY3Ug2n|T}i)*(UPIOD|bE2NeCR9ar4PfuyJ+WAPhxQ3VP?TqX|EF*ML>P53 z@Uy);DGodBMo!h&GUiR+@)oJIFgT?u=H}+|Eh;RI&EQ&)!(hOJc*`iDE{@xsYBfv| zv3N|D0BSTkM@`ED`ZXQtiEGCiWv1|01HMEwud}|LNM(@bS}cqcMl(|w z-goF|G#Ui};C{*fP6b{x8f~>&j%}wiX#yvH@S`99yH!=N^W}S&OtUjHvrFuWhGFFL zc}v&6`}TXUftmfPHsd!Co~XL$yreN*a|qHc>)KF9&J_1-@%ihQE}@=0JTlyFcPNVD zdA=`-W7CtP6QfHvuH9ga**Lj}OcE5BjNpsqCK>1-d-|EcwO@JZN0DeWpDzR;vV84L zNBnMFg-<^6#L&n9NmAFYT@wUhbaYgf6-$wS|NTqMKqlkJ_hi#|u}={)LII^yp17a3C-^cp`+)|yaB@Y^z^K4S&e2> zhzRLqaxf8VHCneCtK(rT+FP4p!rNfKyJ;PL>e+NMTB%ebkqFDOZ=ZSZKdr3>@xp z9M9M5b;ohWrpDc_apS@kNYj2%a{CptOU0Q~g5@iC#qw(m2s`>No5;>Ye2_xAo+0C) z;RS8niz>>mJasaa%kwu&}rh(JkGws)njKCW%6ij1PB;#qVfDwteSBy?vK; zbl*F{e)i{sPl&R`V}g&QQ$cJS29wg3VE19SS#jr%tCQWr^t`f)H*TL&uQt-fvqSqF zmXAmNmQ)6(wKH@9Bb{Yykr%0)i0PM8ah-0(f2|FfdmPdphIx<34ta zr&NHB>NMf?dsGbMF=BaP0Hr;E4cXf?;;x6oHYHdx5WP?B$U`*uTG*9g&St_1<@$XI8dFYAA` z-pu>3u^q$5ov^}(NnQ7WUci5ajr~#>0{9RG?ZZ^C9d)%6#=B1-3;v(S{XIL^@Zqz6 zc;lB&cYl1CRd)aBhilaCZ~ys2eKh_WDl-5C!JoYS{`HkDe)nwCQxzlud16F^2VHdy z2e(x};(}2tQjWvVwC`C=iUWEjL{`-1vtaI0%$JO(x%<|gP(cMRGzJO>}hrLvD6 z{yC1lRNg>U%OgpIjQLbvr6K^GXmFliFTpYxxCC#)7~YXs1O>an+6qWx0SColWCTfd z`S=phDoR~O^H!l{UbPZ^({)wP-`v$}bGEKyEye{oh0EqrDW1Avl|E3{LCf+<8pF|y zNA-x9hv)*(=}SgcwkP0>4bUYT* zRIOgA9y@+atQp%B;6fkNH!6gf1w(uXZz#QuI3AA;pSbYuYt7Qi(8MGH1pn@jzIi>C zPp1oEwMqL{#D(@?wYjc8p|lp=)#*+(A|y>c7|R~2W71;n_Q^w^nwfdv=WksEA@Eb5 z|6;K);Ck-;XxUC}Su`4Lw{|$CX&?a3z5mW{->qy(J@v-9JT|f3>6I$?CPqeM@wn$Y zufF=)znH6W9RH7cn|3DAMM<+!+iPFJ;FVUxo}x2b3FEG0_g(lvZckS-%B7{kKsFYQ z*J`yO2*M!&fsn!3U07GXca#I=Fv-wOZSeWh?XZU%zl|b8_mTwd>JL z@l7Vhs?}%OH_lgk&wb@9C=5an9E-&iNxHMR{Poo)f#&!aH|H$&FW*@C>01Qm?K*O_ z-R(jEkW403RastH9nPj^lLOc8%w?x}3DfFrD(V+vWI{yNYyJv~g!4!aCNrFwnoMi2 zHCH$f6@;+dli*h4!J|i-t(Ie1nOyFj*MIi4mtI-V?7;+Hftg1;n-BFiR8#Nwt#Hj4 zDl%_Ho3SqU|&Kde>81j*P&8K%++o2fbwcYpS1VRSz^; zItpG4DWh&GH1+qsLB#V8=-?3PxZ|d+;6jPbwE4*yJ6Q_Kn%?KRLw9L4(l3$WJ#S1t zFVhK>F9eCbp2%C5OJGX_V&g88+uM_3mO}wP=JzBBAROPb#C$P<wlo0^I_W zqF+#;xB+0iUDusVR$dW?6U~~}*W!DFU4X5suy89(Ll}?=2n)Uw4-nLahSg-m!xrEL z6$Y^mLdD`}h)qa3Pco}i`fXp?-)lrn6ZgAbyR&a{-`n8wQ2nw%NTFwV`s^I;Msj~_F>-a zFJ0|lh}ih0wSS>j`$(4kbysG75I`XK!`H5F&aWn?j&h2kp%o(NGj2=AQnwLSky-?V znivh@@RN$!WBVB-c~%&LMeP$%Xf766Rl$$fL=os+hqMz70%z$|2RsZdSCGwMpeb?HE4docJoZd8j&?*+==}qf`Ew_^B?4@gW-#-2N^weZJoi0}@1VO~(@vbPE zrg?Dx{>KkY&0V@&tBZZ7eYD8`+6&KPII%;GPo+}J%ZvZZ&)!_fM6+7?OU}|dn=yKw zv7R0h~u~Tb~7mnUt>C9a_duMfFp`Xr8 z4Myb7KAftd1TQ(;$nZ$%suv6Bt~bZ?Ee*=!F-xhAfRo|FC%$><_xI&TKl$`04;?u+ zIWg_JPQ6~gj}h64<+NKZ+i}wAwC&jKTIE}3Z=Y2ixV0I>m`kvZYno;*m(z7!H}zwO9&FCbeWg;TZudF_(TyQgfsXhg+E|uex5dqD?D*zlWvg^| za(vV5v5M+ZlThi7grZmsuL9?VQW`P3(C)mk(fWf-Q@YW>Hrf5+Q%XuP?d zN8L>1L0{K;SYdo+fC02GVG#I6{Cz?tidH#K=0G}APfj~NB19_rOwTimtP z5@P*-wFD5$2tU_p_%4`;(>a?(8^%pf6%mMb^?F4`q*4I{q^!nM;wIn(ZN>Dvaz+K1 zec=n>>dtH}yKcRXyY<@?a`3-%^0hH6rZLBc=RPFedoP zND$6>tDD|?F9Ve=KRv>Q@?%o@Si8(ZGKSzS94QfAO!weG9ojny@g8K>5ZqsuiFJ4g zv4#LIMCzTGLI4l|x@J5?l0(IxG~Sr5{Kp)64X3*&psE(h^f4IJ$TZldK|LIxA^^)E z?F2h$kA{lbf}zFjiMxpjt+C{8p2wrnf-<>DMOrjPVEqKbN?4QxH4edPT_00-t-{nY zvCSHE5=s?G4-Rk#K@^109C=bMW$n6vqm3ZRrwZGd@@hv}V;;K=!BL>5v359McDoXb zsvI745Puak=0x-mRQCga8q3}z^%1LnC^^u9>C>HFtuJ0y(G;02u%M(@@3i3&Bo*W6 zRcRBqq;opOE8=k>7R%%oRTsAm-JvuOXsA`FQ#ZFe!tyoFXvasXEw`E|-N9IOt#9N+ z`U{``tHjJK%UW4ksZ=VGBt;^TUy?re<tyaJJg_V^Rf*@pB-rCwS zO%um)1VKE{TU}j+VR$EhswfJM#C41>Vv>?oH>z1XSWt8YL-01`e*>HYt^<&pe0XsQ58k%_*4ViZ(vMP@o13B zMKc{-|5L96scL{>4nyJ?mh`ol*YXIx9!i26Ylne63@F=S7s3)L&`NrnIZ0G5d$5^lT!1UNxf9(a93)Sm&5Cl`HRIk(h=imQH zJw4jQh|fwDjLXbh&Qq-`MH8y>g}ZdPFgT_|t`FJf(4dlLIjIjMWk&RLKA*nwv?bbJl=V)s0YmW+K}#=GtXHi52_t&OM`r z^y#QaS34?=7$i&SnvqVY9LK5EY7>)V6Jw(U72dVy;NZYOPZa<32R}WTnZ}}Ino2o^ zfz;?UOuPErx$(iVY&r!5fglKX=jH(4U*A~&qo)64GF_~#SU5nK!LJAF=X*wOdf(V! zQ3!{7y`H9NnM}qsjdr^o2}f9t86GU8@T}OEP3#h(x3{|4BALm?u_EZVk@9@^EaA*_ z^~8k>?}E59Gdj@~dyeCzQYj%CA30Bci$Ty8_Z^N2#U5_EtX@8`P^_U-n`THpuQ7b-w>-&acG!H<8i3xZHT>1n&2fH zmcgVS%|FD#6`VIS1wU|F8x>Pguim)&-5_SAQj8;M2=!2BZAR7=!>wt(SVb8H;qnZ7 ztF!QML#P}$@WZO%D-c8DctA%DZ>XnepydQEPIw2#2kZj(?^VX_7)Q%1tdC9RV&?^u z7MYp;{t_^8%!L)2Gz|4nM^PyM8oHz{-(l1sq}Wjhrv{(AH+!ff_DGa6$q>#A0W9L) zx)R(t2U`+S7>VIzbEzv#BsfskvH zagA}Da6wW~Ujjw%Q{Sl^{;qOb?7kZ5;xw z7K#KA)C1{ljOzq>&%8ZI80BqMr^#Y4GDoL6a4}^IhES;yVZ=%%5GtkGDV3KHdo5@X zpw4bdx!ni+z+nx&;iC?~WC1kEL_9JscG`q#*$+?qfum_ z$V5#F90WC>xwu=8H=}x*Vz6*#(RNWdyyZK__HDomz1div(APA_F2s2pP_I<0RV8)+ z!ga!UWxIP6qCB2%;d!Ce@a$d}Vu}{1YSryld3I%9up89C<6FazpO(ysd|}e>LX9ol zAO6DUzv%lO48i~Xc}x%l@7%fbjc8jWx` ztSHLn=H~al_r1f14>y}lP19JGZM9l+b8~OK_12+7hd>al*X!MGR}chU*Ecpc7=}R* zWO;e{+u#27wQJXcAh>+_@|iPddcEF_8#ms4_ub9SO_C&EfBp5fwY8Cv5rQCkz24Wp z_O%_h+57LmfAQi)(=$=W&<`$L8!N;LP@pr6YxfH-DsW_q18;=+3zGb|)h$ZM zya7a~yLA>Y%K`uNul>#32u78bB4-ZVHn1rNhDvh^C_t1b9a*Z&A#rYHq z`W(Rlmd^21#X)@w(H#{@B&F<3ER?5FFYH5U0ugXO6^h-xF`plJ7%)QH-7^L&aUw%U zMuf1_cUCwYb`t{;w|NBBz$m$HI|Ef!P`YmI<`34Idq;EG!gvO?irjFO)NfTZ0a)Kg zS7AB3C;hahX=QPXA((7Fi=t?~UcZlT*nzmJsw#H7v3UIarORUPlFB!HgE#jJp;az@P#6Eij}Jn`C;B%tJo^UB4AiQ-YVW@<87E%&%CRHIZp~NjsPOdkBRth8 z)ta=O;(3p7Z`V|lB=DYSUOs;&66G_QY`I)cBoY{gl`EBWDwT-Gd!5dozV)UEGNJsQ zt_B5KjdXR&P?`E1qiRP^JVMh{EEY2ib8&G|?{!}6_~}UaSE~2Ke70h{PZ(`WYCGwX z2ag@)`H(1zrfFugS;H{;y?!c{+R09$C^j@Q6sOYGrq*UFC^}aw6M+`xsZ=gAAmUC( zJFCHXUZ2>$d+pNP<*CVuOeP~qQmfe<8z0Z)a@*V6u~>|unOHqY+7Rf|1P1$&LtP-MqZVXFqvU~uMJyTrUk$$1+dfpOXH;se zm@VV{lINsk8w-wgG2uw*I!pLl2tT5!m#0&k?J~4F4?}DQU=c&nJ!}hQ5!*E*tV02T z2?Y0U2Up()afrx`PU?-2u{x-=#`IN(mT?I6P0s^F#xz_Ln;0KtMn_;M*v8B6s_^@G zl65zS)TMSHGmj9t@I96eA+DOOGYMDhiouqsfa>Rg*;AjzaYJ8#QI!DySZ6<*@ zT*ihsQPTD>&yP4@K)9WxyNv`LDu#92klboSIJSw0a_Z)gx*A~74M8ues(}t2wK&+7 zQ7hR9wnxVAS< zUVr`dTeoh>viyS|{J^rTd-v|;^ZD<5=Q|fKUeq-0?YG~apPz?e_}H;yOG``N{N^`z z!dEZ7^wPq@f+&jPgwu^8#e|92FAz7 zcj9UvjlZV7nGghh`=uAR78-6w!(B#!(U7YooJNa5*EAM!U=*QE938U#K^JQ!1eIXc z%&pIMJS&BX$n|~IP1OvCGJbJg~U0$@IOQ0njVOE3=h8EVz{48?Hla7^u=tS%F3-wi@K zW*nUbP#cXFg@dQKl~UXaw8e|NYtiBm+}+*1I25P2OK=ZPDNr1WyBBx2xBp{?napI_ z%qBzb-h0nEAI}PLw#&EE6^NxhQ(9)Fy#nsWG|q0A=eq_{(6vA>tuohEw@J5$MZJqy z3`*b1yi0KZjZ0-fYzv9BD8D=*2}PSPV?u1v4;hjHE&>95o%zCiYM4RQuozmlpf(nn zB4*VH__Y>^f2NXuy0>}B-vk13nOQPS8^rHtkhcG6-J06jt=xd z0HrqLFgpqg%5P-J8RQl%o!VB(Qu~2pRu<8r3FIS9v9i8lt~sV<-rI?D6gc2sgm_3C zUSg8;_s0RpTR07)YIgwnwKj3RBkEZ0zQ?@_DZoYPr$w_Y#uXl-Wc~%!@2Z$@l7*|t zV;~($6HG)N#i@7)ze9$OK+)feI7D5tBtL$}M))DH?L@n?cr*YG{xd($qHv%4nC_?8 zSV4!)o(^xUQh{>oD3&E>@c@&sZ^}f@r@3yv=oqT8t>}gAZMN>P+8x*WfI)=Z#}El+_qAZf!XGjs*np)SEaC*a_iy#kS@nKG z({WbSZi!_n(00yW)5^nD1f<84(&G3M!%ZZ^vm7&MK`HZy2uf-k8O6OD4p4Qp^O4mR zspfZ&VKd!qvarSGWPX4th%mar($_)F>uz2bcg>iq3?U^Yo@EyxQ@rbJ-a?U3RxMbt zNosz*`@OPg@UUKZF9aI6N>|qneoQ6 zh5U~tt>4cyD*Ep(_C(fbXO zVNy-+i04SH?8ox=8(kC5qD7NpXhd^Onbl#LJXAXf9;nT-t4(<-GSPZ5(a`CkZuYl1 z{Up!ns{-?1SfRGJuDMv^CISLKpDAW&_nOJmd^Zn44INV=_w?UY2-XL(%94nYXKoVq z_YER^YMGkxt(vq(-3k*d7Lk5%CAkV)dDQ5BsET1{4oP^JqjNhavL7g$js~x`{Ig%# zPPoe!Hb6*qsKf^$7X&wcov(Hc%G`UJ65z&<{B88c+Ex+v(L<*|n`hG!H<*gk1_kwB z52O5^^yNg^R!F#^$Sx2nvZuzoG5@oRq)|O}Vm5D)$eIU427^PVhLVON66E8G|LYI7a30HD)guh@=FA{aimMHyEJsSf($tI*@^3N|L zkbk}wN&-}VHI*j_*>%}nGOMSZEJ4_u6f>QZgjI@>C5^XEicNF=`qaox{Ir)TN)!}* zNt=#dGN6NVpnV*Sz5dyT5CIuAetfg|>)PjgF&=X0LLAmwFTr(cK~p3 z1$YS5BJ=TVAVqwf|8j(@>weTn&>u+i2Apyn9Drd0APE9Em@nh}&NoL3Kj;+o0Gl;n zxce``T;F2@n6M>JPAY4q0NqqdN{V!%s+y~llar~bsg>11QL5hJ{rz7Hc0gz~hMTviqI=il3bX(H@Q_I&%}`8C44~JIiH<%}l{$(S^vDK+F9Eslw{PFb zn|NL=o?KPTK%l_&@z3TbS($WVv8L>ly0}4{Aw7q8O8$*8&J6ZyA|#*MR{EMce-_hl zHXRJ+?0ZxDn4xjax?~*Fd1K0^>kS%+*F!^2T=N?-{cJ-~3Hazuu0%*A2;n}w5t3d~ zpQ@5J=tn!Ev9Zp3ancpgX<&}E`W*D}LnSn>xk*Ra;0J9pW#yqv3gsUAx$(^5g1SD! z0p_Ox4rC!eD_`FV=JFw>ZYg+%SteB4psEi0Y97o$YN9|ZaA6^YuL4;NuAbi39K>ap z4AJZrS(X~2H~Bz;5sdShEw||qW+wHm%mucRV!EX`$MnHspB3!~Rql}o_45mh*t469 zrhfLLZG{&dhm+V}zXF)x+6e|3kAuP5sslIGaO9yTH2dy1^zdVv@7m$y6_@$|;JeJQ+nK2JB^g^S?Wl?i}n0SMCgM?wme16nj zfB~Y%gstr3L1=}>nsz#~{7+%;#geB{%=orA3Gi@UXFIxHcF_M&U1@s;8n zA3MH;TN;eI%04%t6m&cr>2sQCHfB8uh`FIA*e z^1B?UG7!1y@@0LE-8OF~?ufdfD#!7z^)WJFNctF`@K>I&17eHu(XLcCJGZdWXHnAG z@((J=dt!D^WF&E9v4c;8ST|9KFwPqkISM;w_=@EARI<00P_bi-MRM#0i#0BpPA6@8 z8I!UtQlX@`dR;~EnU?JNw;?6OMKGqv?QJ-BwQki`BT?|${?g+J*Fi#D+}1J9p+5Hk z+j|pF-){p6GH2bW&HH2Fi$FzHGL!yufMKZDPyLEd@AI*XSi$yTzG8p3@N^w38deTe zwUAB460pYsSKeIRtoTA`Fl)2ef{ujZk>$C7H*Mz~S9a8|sYy+4d{kFn(mr;)^ZA^o z_3;-5@N>D^djqPy5Gso6Tl$XAS-(sCuDRIC#G999Tm^m%`J6W9bX=VDm-$=?b=-Bu zdsujRg_$mRbzq7p0X^1NTN4LvNle?6jE-L^JKtmM_~Fs%>K4ATt2t`OI~sG|4h3x6 zLtxkhX{x-CGF78mLiy=NFH(&5*QbZ2wTKh%(x#3mTAhu*0cBXze~Y{uzpr?^%gZOw ze284JE4Y?oel;m7gRbg^!?BwoEbu&wMCgo3&OKq*Y)Ck>^U|#E8ypc^a=2b+BZ*d?XK%r^49WIt`qS zHg=`HG24AOiUmP-2vXmmoE-zKi1(1b4!mwwOY1sXtO1@(E~};M?lOJTMy74kXakVh z>(yPg?why}8xv33ysDKj`|L36F!>XCZqUgCF4&o6`cG&@GRN(+hOinYt}Z_C9Rm=ubj}71e;4X{X$+j74FalXn_VmA1T}oOs>p9F_&-dJ zw0nWd2xlG`dnzp3Zm=S~6msT2l}HY>Wi2&7Xag`R`^)=-y?O%!yAL)Fpb=Im1XBI= zlbYx$4aIa;6#roS8(vi?vTgkwuv-2bb*0HhGAtaPnyjE+OA^j9C9MS7Lbj-LNHY!+ zmtpK>T|Ceg;O|&ny{QH4GK;r_i&LL3s9G{CJ(%uEW({|_QhiibBe$aNpJ+{5Q{Y_DT zgP;G&{bg)z;iD;9P_8bM(8VA%AJ=1M*L~)*-}kg2+m%%Vos@w6(p*tab; zQ<${w;GS8>ieV-0e9Hbu-;(i1`kj05#1AVzmdpylry+B}1X&smd25b?G8fL|h^Egm z{Ly`Gc5AO)}{K&>|b`CU-Y!l^{Z+?1IBvvzg$%QHacK@HYub+)qwW?#y4aIINYA{uaLliHS+Yf1KwVEtA>zS6* zDW6Xxl5d3rvNt$W$%koS&30ltu0}pz4Op3eWUQ6P;ZGsPo_esuQKUtHtq-kV&vpQ5 z$U(vTU1VmLj0?2izg=Zs=ilk2k&y1Y!GQRZ%lqb4&sV8rq8!rGPFEDu8agt6DuSpv zYYuRj`$+1;vmOK4u*tVdMRu-2zN8+}!z{AyijN`EVBOMjWc&He2GqT}g6f}qYs;Fe z_4ZhOEK561AzQ1hF84507PS4G6Wciyw(8mbZ*ZCiE`uWzTUa?X;C$^eBSJTK#|@W8 z$AgK>1c>b48Wp@f zEe)M)MyCJzUrp!ev~C0^&pfUFLzt!`sH%z^kz7(O&<;XQhoead3!2U6*O(e)>FDa) z@h|Pmm|ERo$NZOilh%wpg1KW+XZn!8z>%w4@graB6zm4T*}nZ&vh>-0biNfPCl(%j zBj(&eFuOoR_RG0oM83uuO*p?}SGBA;D%Rk8&1%2n_xH<}>xyP!)fw|>qaL0QT%7`L z=#wTN%MakNfBKI8=$950?^b9t54DjHvzWf*gll%(8OXH-g}#r73gh^ER4&zqre%yF zn(V|*-S<_R0|Kk&bI=3}o_BvKI}d+cQdK*_K$VqCQURUuS{9fY{~^8Eh|i6znb8yzz*Csbu;U$& z^igzqLP}GGHN3<;65$^yHx$W`6Bm!re%N}-b{Crg)ZI?& zT8>T5J)8E4DiW#r88uSq{PVb|!I?LgZ1V;+E~4Tfiv1GS-?qK3v)1vKBI$a*0~&x$ zvD9qu;NW0kL7zEFCg|hg<<+M8sekKy-1o%!@%EINAPRt8#0lKYZ*S8?<^x0tYHI3G zQOYcZ@v*Vk=xD$`BKUOH2MnoI$^iI9ZEY=3LjVs7aE97iR(uKL+IizR0d)offZzvo zM%3Wmp&xWW&1$k=>kJGGOixeOWN-rQOU?FFr@RBm-BTB14Zpb|)!!gzUeBJXG zIdxdZVbkrlc0Vo^1*=Pi*|(}bQ>1`|v#WQ*{yGsmgen?GlqTAQKM2=G>g=xyZAhRY zvI$20dkR0~D}1tP>DXShX5Edv+PvV$VhA%BEyy%IszQf3$}A{`V4+=tr+mqEdlv6P zg%j`PBkP~WjJSwd@03^fmm7_X)^>*B; zVB^?IORSdjh9wg&;w3~M^067Xcw+_-ik{xs@wX;PGk*L-Q~0@!wZgujW>;9);4#8l z_Lw$!-I%(dQJW*{>jr*nXUiEZwOR~8icy&StkfdJ0?9(A|5ISuU0C^0?8lLPpS~=@ zSYx7Aq{W-JkZ{?V=SM73K}Q=mFHX)h{TA<%wgo;Gej^JrSz+@LMqUM|-V&z^qd@%0 z_YN0c43ID|+Y0aF+i6QN{jm9Fl#O_0YQ>|TeGtpTe0jjj+M@dV*e4lJwQyOFHa@HxHb@24M3}Yf70L z37W($ogU3|i-4~x-Y{(?_U^2&1Rq;ZuQD_-m}@pgQYBsB8{US4CccFHG`f6Od&||W zzCZ=6d%$55P_q?UD&C$bLs)PB0f;5RhUuY%(H*PfF@KNOJwqlWWs6wZfV>SDv0NxP z99Nu*Y%TA}yk2YkvZ=WlMJfz)^o07e70in|dmh_0U#F@`siJvP9dW7@( zd|FPvTU^|(TAep&^cTbk4og9rlHFv{waiR52JCz)71)OW!;?8 z^?Gg~k6R9VSEkI5=s^_%Eq>*b%6Z)Z$`svmMOJIJ1+CQBsJls{m9?I^LP9h8F7z&} zj!Ng>w3HEJXbq6COfKU{Js93E6uII92BEk0C3NDMYCaB1#|mX=zPW`}O8Zw~D|UPtgLlL-{+)mWit z*rN=vEBLV3;l`w@Ty6<&x3zF%14&|+jLkZG54fdGvi_bV+*0(s#W!E4Xkd zIKJ^J6xrQ64X2`M(o;|}j9iDAB322ix95@XAdZ1GD;ff+!mUh14YsUne~@}lJZEkB zta>ZaGey=8ZmmRoyzai}do(SayqsR{4Syn5GeuQhwf0VOJPq9wI(**o{z3^h(sCPM zBOGuf48uX(@bnwc7C841*!bbuH?0F)Jh~_EL;099A-vOF$=ri*%rf2#m^4-O;IU+)Gtv%^`_qo z{rKom+NRfCGP~)jFcquHcR#VX*jiU~&9eR!l(r4*mdDbD2P56a#M8YS2~Db(MsQcM z5ZH9Z?U9^^a6-DR8n!|=CI++n75Xu@lfL&+%wuLutGpT@;E|rHFfbS7QA!xYQ$ zbYYq9CMkFA!V!OwuCAV**ZQ}d^sMxgYwxx^Z?ZeUgJ@B&0V%6Iu26XmD(A~9j7U1E=p?a@-W-&3X6FO;_ zvFFYZ4n(4l(E+{9rSI!IWc92uVW!*7=B`KgcOyd2Mc zKd`dORm=CkMp8s{(r+SCf<@~WTp(OTQKrU@P`mODGCXQAV-#Q5s_m6hO8}~^Fa!%> zD4Xl~;aH-`3leb=+;7;&?wKsQE*Y;!73`ndAW+iZ=1v~ zM>4AwM`NE?-CwRm-RA0L-(n?@#w}OuBasL!U3Xq_b^fZg>Ci(F0a972tE;M1IT>=r z-76w()bO>U#4}S?we_Cn3*tDfmO9^w8?k~B>Cg};dbxe&nB8T~`YtHPtXwlUg`P6I z^vXCp-M5U8HR5vr)|PbrN+1+b0U^d>0j4I~V-+8d(&qiCq{Cm5cP4^@xCKS*n!}5> zn5gVDGKlEgO$cHs7|TfyF8T`B81p@mt(*P20_}~0GNVsRO-1wRIGtRokm9G=g77fW z+JALbc1wDqmeK040tIdoEU3;!`*cfqdS!Gz=|_;jXqRibR43#oz8H7IAx5)BcC)03?}!ksILjB9J}s2gy4ne=^r_sFA}M*o#<`? zBw#Q>F(ilu0kOsxd_KnzRlfwDI_{b5?)OA#5XQZ*9p3`Qo%!Y=^z&MjhdOHY3(lW% z3>*vB={y$;V-a{6grC1;A68hY-PyRajrhR=htU3yR_cAr6|3I{&BT45kh}q14gm zjbVH4_~Wad^P`bH{X3UDrKjI<{vJi!r&)^~Wu0H8WpB;2Le3K=HzYe`m0j40fV9?0 z>3@Sg;fqliXqHIPmN(sqoQr=72@2&p$x)wby@zA`+&`ofFv!2w-@e1ldfKJ}jk0Td zv3HreDyZ+q_Bwgq8TVYFLA7^&C*OXGnT3!1jNeEJ>;zuF@ABb*Y*kWBDsTDo*QHz% zm9%4$kY7F$+Xq?@QOv7maHu6Hc)U+8=g9LyrkP#TbmuWByW8x2npPCdlK%BXQ95Hq zGVY8XESyU#x0zLBWE8MDlu34a|NDD*oK!CkI0#rqa+BgUI;DJg(MmJpq%gS##IN@LUK98C>!BZjs@5Z_0JW1_kDq0~q47 zVE6H?$NgD1&g5E=otio#F4Bdgr{AgBaUc8))%57`K_G_I=7LFj3FTzj(7g9yrn=*_ zXQ~y2pPfD?e%s|_kWx5f;7RUf9OPd4fge3TI^OBKfABDm+tC3 z@AW_9;C|6Ybunz3^sm7BHDeE#Tc@q{_gPuB-?ja2)WWTvXR^x%v%vMgm1}6V?_o*b zy~`(@6SsZ`eoj_4T)dVo6s%i5FNeKIkvjdCWsN4;9leg#!q=4gRQDdkPno?hncuY>DByKlkFxwQM$q5h({8TR7+QDJOEJb>Jji%k26OZg zz)H;3OUL3Fj*l5bRs@GVmWCFPvC%p9-V}{@KLxt1;vs($7lu@3-;NEmj*Pjs{TBJTLofow=< zNi~&xxoqe=nYGBmTHrQ>(+cPs8{b^p1zQ6B$kDgVaS0JvW?s&1$X{aRI|5CS_#miDr=G%Y52ku4DMeCNq5=Bs)hWc=Guyo$$ z|7Fs_SiX!ajS#IFM&B5Eki{z(lR(O^XAv5?q(@G`Cz1TVLb8kKMMv?^?@`OvE(q0r zKuGKBSKHP@wX*lkZ*<6s>tNOq`k_AHGbgy1{PM$mWrSJP(8*r;T!)PjYs@skoJWsh zEx9nE%dB~k3hS7gl&&)k6*F?$(bcsr&sFBhVZZNVuNwnG<2*3`5mH-}msU8R2#m*f z3U@`8qhUk9*6ocm%mWSUEM$Kw z@(VlX;5lVcXK0-c*J!=oV+Y)`?_by+OZ0G<4aLq90)o0@%qWjTr3ksr8spM16r}r> zz88a)b|3_Y3yyV0^Wh@PovMx(cIrTbTgzZ=Z73$;%3%<9O9^-rF5<~VJKGn$R6mDr zlVy{6@8abonYJ$N6QJFnzO095snHW=D~LSMk^55ME80{;*E-!HSV%ckRNW(mm8*{4 zMFx4blL@r9W512h^{Siuw%)+|yLgD&8#HS$Ii2r@6{vVg#+fD?q}SOKS@>;*wYgkx zCOgsbHr>i+zF*K*{3e3(HoGAeBU@i0&Ru0$R4kh9TP!)NOlcA`Z@DcyQO?SX0mUzO z`W`we;!=L2Q9i*!ku-An#rYP=VjRxF#g*rXH>kBB8uoEh!pfy`nS4j5*FX!ZuzZW= z=`5K0-YwJWP?2;-?%r1#1{t=^*nb+RO3i6ZgU?7k+DdQR_Z1VdjZuhcnn zwP_5)z_wkJLALQhL!Zx^Rp?rDYYZ{=>O#z#;tS0+8LR9Z$N9vMoDg3jl9)}x*-|xs zpPP||nH@xlXnf>*?ANFXRa)aEH->cXT6_Cu)he4Rb))pqF^Jt8Ckk}5A4 z!FNyIaStqB9R&4lIF?v~j#y|g`bJEqnoM6-=U)E_xqtO@@FMtIK|7lWdvzw!-RCqD zx)0UmojG;^c1>H}MNo{|&roJvM*MjhvZ2q(p`!=q=Gmn5_%t$!56_}`6xWLy)p{A( z=^wy#DpeEcq?qA4&=kWoJiLPXZ{Hfmm)l$x-asECX9=7wDZfQelg%!~SM|-JvR|=J zLHTo;Qh$gM`(D=+X{|KwqmVDa%r$^uFqvNw`K5Okq=4YX{B`vM?t0`(J zGVhz#@dA34iW&NpBHc&wF2CRQP(i7P>5GUBnx!{=dhRn#v zZaX$2Cg5`YAVdZ-_V5C0r}DCid@K*g!Cg&%1lkB?0~QP|tXKS>A4Rx1M|-F9{|TFb z7=s*|b74smP*x;zE1Im&$cggW2Q5xayIk`u9SI(}dkcL~+~R8o{2Wx%_cVsCoQk`6 zla7WJ4W3#d$_TX}f6SAeHs1+XhBX$*yAYA3`r8(lS zmBAng_66(wlmR-H?#L}nX`RPmz$K3fO8D4TlIsS2;p5Mqa)y z+{yHiQmaJ__l8(vuO2DDsuhIm)EFL}EAG%xC-@1{KDt^f!bAz@LxZdo|M|V(`Z^pv zaG$}>A2KbE^reIT)U8M7L)l@*Xvm>GrLq`8O&fdBZ&|sybnKKFO74tol=s-t!T41H z^byJeSSuASaGa06+X0g-%E=C!Pj2Q~U$$+eD&G%r%yB{OdKbIl1cYtgu|$2U4-8VD zTh#x={f*q4j;-#Kk=;`fuk-VOZcU%9!t85tRQ z#@}P!PsF-3hRlT;-o4=H`CiXtMVpkVE-o%UYze(=VF})?_lBa?*ViM8Jnh=Q6c<|p zSd9O|*7g1FcYx*jL#I9i0c7qOu%)yD+35fX;QCm1A8*2eInmQq ziO_$_U?xbL__PZ@*_`Y1_{-6FSa^8XZO3WH)5S0lwmxW9um89>2Sn;F9p5B>)&QP8 zh4K4p&USm^< zDYN-7?I;|9X(N0V5Gz6=wirBOs+`{HP7q?Z_xBB43Z}mXh?3V|6>l3#XJ;VVrfNmA zybYLGSaVMPG*BqUIugcmhncROztEIIHn-oC$BVT87Qp!I1m2DACfl6x+lRyIQ@`oQ zyAharm~2syAuvq?^ku;HA0Hp9skyrIUE8Boui&o_RNxy^p&*fFm+eqyA^U%l zP`z;zHm-LB@BCkO#gvUFXZ40nV-73)m|Zuf-m_m8#kpUy^8Ky*j>8weeRTvx?5DqFW<1o+~+cd=BYe z2rY5+jspLLUn;;udAWM|y?tDyM~ZseG?yeXDC@imH?jYhNC(1)_Lx7YmK|X!%?o@g zy!3`F#1r6#Pzg9(nO;l-!f*kgUL5jjfT$M1aSSW_w#NG&U<21i5{29{K(<7IQrG8aVo9ZM8e7dweD z;ssWG5kGNFL`YuMbvJfxS4kVRiN`uu5sx+F3b{`9(zL5G3B9cu%C)2mm! z{Vr)*c4^;rt--wc7Z3Z%gYFcwxI{!@;p5LQJEU(TesU+v(rRW8C{~KZ=xTkf zQ7)XJ^hAa4j{UnJFsSw^m1-k`8Cx2WN$=hfo#~u@-g-(se6wBKWDQOK&*8D;LWh6pwNl~ZX;U!v?0t_xcPLY)z zLo2EJ@b<>C0WJvn5SvyC-giV0{6dy4J;~XF4^-XR%WT74sHL+p1qP%6Om1P3Q&S3T zrf3h!*{^6pvY)Q-6sO4A7{MU0UW;pbK>Tf$|DbbAh1S4h?9-p>r%#dj{YD8CAG=Z? zv%2oiuQ_iB9pWP66k6wN-R@H{T}6Vut3;2>5%=)@E99Na-3OWW0@WdI5elRPTwWCh z;853i4ihdCF#cUpz=UqRi>LV^oFGdl-CM*2`Hwa0cf2Wu9AfE`hSB-Fn)BuNVq?Pe z&Q4IenX3xS;SR1BVjYhz+q%w4<-w!0wbv9e92C!*t}oOE9=boIiPe>r3u!RWTrw|2 z)Up+n{J8k^^rM1Yxo|WwV`Y)+tLwze)ribgvg3ElO&Q;jUr9*fUiKdujjn{K=`$KN zQj@iUK67ZzaY!SGL^vh5ur$1W89yYsA5D~O=MJX84*CZ&>m#wlYuB+A zi$Hg7T0o_THw=u0db$i7gG-~_gw2I}nURGcVP4@OG0~iA1L|a-!%nVpYBu{C%Va1b z{)qDi+vSs$1?J*uTMrgq#`8{Es37|XayhoLesapDAD;5lWM)*s1fd{;KQKhHs7gZl zW`dX%C_m<_K*msA<4gmbEZd!OEbPZWqSery(n-KKyd5hDinK-G8PID;;0PZ2&QVV) z+W!*f`2HXL&uwV}?h= zbL;Z#?Cdae*U`C0N@}Y6Xfp6!UtSKFH{Dk~>9E0oBpQ%+?Yk70lysfP*mtw|03}es z`^M*SX$=@<7#VF&70Cg19DuuHW@h$I?$O-;##}%^V0wBQ7Vtus_ zTs%8BXQ~B&t^jH`Av!Li%*MwQi|z)AC{0Re(2u)_4W1n`FY%2T1IxZ z-%hdycPz|dL$qXi0jZvmiOGrN_GZbx3xJhiBjO;|MqQ?5X2Lu#X%R)LyI$J1xLMF& z*HMH#4x!C}`3F!R0K#l9K!~l&WS#+(cs@Qp`ba9U)AfN`^&FbW#LjT4zUL0Gj{t!@ z_OgKRzzpDQ&U*^_`fDd%X6C^4)aQ5tURHg72zH1<$>pl|DI+s;xM&^_$FJMwV(A9V zMr0S71ipOvAzSpax8?PORXCytYtaPu>TRcA-=eQwx#9)9aw;|qe`YzhqTk{Q@Ebr~ zU*W@19O0~UxMU^9R^Eiik3&W9)|q5$sI`o;oHXxa0Oc2!h41j%npP{RO*m?j?w7f! z*b00U!AXkn7S0*?t)%0~Ak}QuM*Sure?Iq^C~b7JMq$!4GrmtIE*(y|<$LRM#?Pcu z()h6{e&cw{B8Os<-M62)sP-v2f}Vf>e!HSnIx?hO=0 zxp>Mux;7dCf1h}nkLb{UssD6;h=0fS{aFnH)WAzt{WiWdrn|kUjPsx4&)YR0R#u;X zSNqekTli5DU8%3nT@P}KrxWKdBA|l40KUjJjEViZYtpplrlv&7wIAdBUnaToIM!#N z%YrU5`PSIogI|Svxp))@Loi2H+eIe{!VDRP4Oy;;*E|_>jpC#n@Lj&5&}+*#FBI|z zy6|qCd!Y8ihZ(`@Y}^mA`)YuDSgBW@H8SavY-VO!qd*?PqEt@IrTQXm%=ekxysSMQ z{D`r0hcVEZnd8w`hjEGzM@eRO5Wh=EaDE&qj}4(@t1c!=AB_wE)JmiQvRg&Dn|U(P zBwPtc_hfa714F;t5u(_*d~4!M@&&D0+EmI<3uatCi1y@GmM#%nzhmm`N+1)+)+eFp zVLMFLFpJY+tnq(MaNa|gkNRy?UfzT#a^&)I0Y&Rc69Q?){p1nw_wR8r@sAjSR)tc1 z_uyyxd+@p`ts+`37P{|eIzaakVZ$7SDU#8x^p^R-zclu)`?+32V^-NHViEbVV~ zFN-Hv9ZO_~E?Nh1}IvO&(kl)sfJx7M(zWbN-lMl2C92NQ`WTiz|HhjMr`+tE< zwcxa=?mha^158$+5r0z3d1~AE=VQ;rtMlF23y9<{KG@+gmh~B+W8RIMNHU-;B^b3~ z?t+?frSOvb`&yO_pAI9ts`{Oe&IxLp5l_2Fvs!XI+fWNB8`DV?`T~|7hJ`}EGLmi$ zgfRBPzsWUj`57>P+ zG3=uA#{kuH2Ql9$47VLKFdkksOSZC6;lNcMg#;8RJso%y&Fpnmudnm~^HZ{TedD3z zYA`TK0!G2^78joGcO2+}WX;KUMWs*>amo+C$xBJuPP0pQJ2JkT>;c(uHc1ElkTpL% zMHV&`bn^M}fIoE78i{l`x97_LU8ytL(8ZIgVse8Y$6skFR@;y8pSY>wlH&=SUEAm< z@Cy0PkA{vnO5{_7>$F?tLFE{;bvV^96`(n%F`d>cOYn)|13PQF*S zl1i{K^0ov^Hc?=0vKva-lr_V<+uZC5^+#K^c zG;Cd6%4Fl|g+HLD*Ez=)%(^zqS=basb6?Ny58~VVwg?-ko$}}f1{XE%<#?|?KYD-Z z+o&1XO3%!6hBT{wdK2UT=%v>lJJvGO(y%2QU0q%6?5diZZy&A?|1){fdqx8CqSNHKK2ucZ{f0Ap658Rv9$$6(A!R}qobpM ze+OqE8w!i6s~6?C6kJ zR;9sB&&g?K_?)GHg@x61yXu`!56J0i8N81d8?&>s0nMBn?72SY*(SBVBXcM-BLi40 z0LyeB(T6bX!;c}MhXNrWr3~;X0m5s51e{1SIyQD9*bBrk=zmHEz`y^+HH`beTo$Q( zOqK=y0Ek-vGM#G{Z1iAmqji;lrWE(7CoLqq7pJ6}Cy3=#A7+@Q8i%zzznXKv5W_dC3ZzKVyUV}_P^oqK zIK{VHDA;FBQnqE*=@({-2%I!#7;2)4!wbmATR-9h)9%vCoGg3pK_U__^m>xxCc89bXOtd&GrvM>UI3l>;lrQGUHlIiin?|4H@E&< z(}GmW>!TVB^Iitq`#Q(VU)|iQl_x9FhvZub=Bz!x(8>1xlNMSIsZ!Oht98U(H*gcC z2_@A0rMmCpFoB9H=z$A?516iBcQw z+1LR8ey>E})`$=Dw;R*_s7SWhwdZaBtUF|?*zb!jORbB#8$kue{}nJ}N6Ob$ty-Qt z??04sJj)hj=yCBorYmiUO=^IAL7R6EY1i1>EpiGiONE+Ld)bQL;UNzqEGd|Cd*7a7 ztl#1?9L7JudGgrumPZEiv-MEyi7e&Ps{>yiu$x2X)QVKjLxUb~j_~SIm^g9YOkCr0 z9W1>OSUtaE_nEfQ=jn@UE(l(GJ?m8ph^3ion)2Km>($TSD2O>C`#W-PQCAc*RP40&kCmR{YM#pdwip?aTwUAr`@V$w1v_Y$AG5_%fb zXVBzWE!imD|9*Ay*O{6>uzppOohs6(eqlMZ4M00(-x?9_Zt;}aoo)}iQB|wqt77DX z54HplkC4F4-}D-4``F0vKg*??@DfGMSh>op;SO!v>2cztvZ4b~Q6$q(6}QZG0b{~c z@{9OeUMVa#tuqvn_o6F?vnTu!NzCA=TMc5UuA^9u+n+y50ru%9d}x<=WiR41Hfglz zlzB=HCu5`4YiT^O967~*leabNKlo*_O$r3xsuoqEqLoKm+pVlb&+K7U)EI5HZ0mEu z=~(u$O+r21QW#aR?auf3PFio{rfY;j2ijjy(va2J5o(wsn(8f^r-}~uKs~>KjD_n@ zy!w(NIaFsmAIFk~{t+vqBiO0d8Z`I)=)LVU)j-Sp>L5D5fgvH1@QFxSscX~ttvx@y zc(B7!-@J77GQSF}#~AtT@fyVgoTp=9)A~UyG7n)0hic$W_trohZEsos%whvkReG@o zQ;XHmlBK0&z2W;X}d&JCh=k94dDROAOhP(0t>AOIAe7kknqZR^h{OGTcP%OSGU;5%`kUxSb+RHo7Gm~ zPoo{&sRv0oSZmQ)9dgG!`N7XM%Yo&IL?`x6xM@0$O$d?SwHkg5F3XU0lU%4_!HzBz z(;YDWYR-hd#TiI2P{fa<@%}yj_v2f*1FAh3_Cww9HDXH=7Ke$Wa$N(P#UZEURy#t0 zQNi+zwh*L4a6a4U%DUK3$3As4%W1j&`8}!-j~ln&Kh^QtcQsXbKT|u?tIY$I(8a$6 z3|cJ_9z`NAHeFcf2oL_N$eup8!rg z(6uRgW^>6;Z=C~W?cS%ewUq}lXPM#mbUwfgX-iTlafMXRSOFOcfVb8}%WaPNej}V5 zXct!w((~z=7#ThJvw^81Mf%s(F5nhYii{QAxY=$1i28{G%&h=(Ml2jt1l#3&vmZzV zTFbNK%^W3&l8{gannYG~K8JNsEMRY0{Ry;VZpT2D;!3l9j_pz^v;N8HX_xOK=YS)? zw*T_w3oyK$Vt$?i!h*;r*nKyDeTR5>(Bt>A*Z{*^2M54o)o)Y_P!0y`_>Nn+8D4 znVg<3_|H=g2o6n5Ol)kvVuwtZD854tHDU7vgy{dryPKPtd3k$J?_U9BvnxsmDB0^k zr|9kFb#uDb^?9EHY{i)g6P$2r)%}#*u4kX81V#>y;Wt31tb6wGfbFU^Eb;o8qANo1}J*8AW|IM@?Y-}EBkP&nR(a@lC}v%o^dUqQB_QB zAYAeJ+_4L*{{j9$0l#Gvvv@b0aylz+s{#;4qniKpv12z^ZpUz<=4D~pg8_tt!XT;) zsW4~A!}~@fu~;^jOU4uT7MEu!c(8+^9%5N-Pbm0iy*6?97z6^rUcjLw}_%uzAPJAM_AZv8_9SVBevW*S54_VUZ&WFI~E*Ri%?B z&k#6~%jb3-;FU_naokuWmd+%)QHl`SMRn5vU_|qDd;N$f%7wZL6v-)e0*$|4TYdVG zvvNnt^mM~6q}Xbrr<-e<+r{NrN&>ZpCOKTa1MmsQ%T9sJw^tT%sTT8~0nltge!kUu zP_5YvfMbNJOD5#1i_0z!eC=yrw=64P$OnU=W~2UZ-@Y`|e>iNmONKq5OD!1pR}B`F z0Fo99?PEtzdO6nX^|hMKe5pEl^Gzw(+mEO7>T*Xk5>|?$A{Lr$*o!^gC&mHSEffkKkH_QjP!!#j?rLnT3t1B#cpljQ@H}Rc z_4eswr*It0=kpXr?N()Q948nEpcvxiISvWs8jivRGwABH+;pULKbBBfq-B~2JM2pb z-n)0Jy}3|mH2*wX8iuNmgZXMGy4-C2a=@u}3{U^?kwb?#jx$ZOQmG`vp}&0TPg1++upo%+-So#Fyr zb6YEbrFuDUFdR}ZOyhY-Bu72 zKujDm>!jIsEwAiopUS;%QV+@(<=u7)VpGLePAS2*nbmYJF3Jufh?8m)(yjjDr9ip z-}}DGEw?>8&fa6APc^%JcQ?P=%Z!CRJp;sG$-lQq1~D3l=w;l+5Y@tr%43z;(@ezQ zd)gb>+cWr>j;Vf!+%xzYaN>zp{6w4X+0;D|4IJq@bk)YHYeg?jMO+ZEU`JUPE*cFb zDPZzoVwgm`f8>(nJ?ALljp${ynSb{AXPy79oY~US()#-PxpU{vpFh94x>_!mfBn~g zJ)6xcigM=6nP@bcPNzW-ymRNyp+kqF(dhQ}_Sv&%x3{+e0Py*ID2f&eg-)l_)z#JA z-A$6@*49=u8a;XPWGECmdi3bX$cSm0yF9aKGztJfEEYpilqAWnt}Ymc{eFKi7~J08 zh9Ky3pZgq+<6f_K_Y6i?SJ(di`*$H4D2kprbH*@?g@uLQ-rmE94`(u&csxEjI_mX$ zySux02_P7T?ea3h;qcJV(ER*-JRTnz8S#3(6h)1Xj~5DsYPI_4qmK>@46LlI3=R%< zb#--hbp?aLwY9abuCB))fBf~=Uk`;s$B!SUX&Ob*)zwvx$Mf0Ge)gSr-g)AQCxXEs z2!gu@;P&s|U#(X2`TSE)J%!`A>$)7r?ccvY8jWHYw!52&qG%)%>FeuTTU+yby$22) z*j>!<@USFF>+9=}Jn~2&5ZK(@Jay_+I-UNX@4y-IKh9EYTh(C1rNeU}40cch1S%CD z2(@UFfdJdZ3>@d0{Qj|4tJkRpX*&-_x|&Off#0Mj(zTsrGw-*QoUSY*Ih3bWg3Ew|*^UYEIELXJP?M@}lHgbv>}pX9X-(DaP!n=p zQ-=ZC!64VMVZbRuMz&G^$DjF%Wdf_s4H|+$95CU40iuN4h|=!%_GY@LClU%GIHs#I z+_7Pc2JJR#s&(B}uuw-9hlU0%(=3%5$MAeE&+#0~vLBTyZ@1g6R_oZI z1Lnk$X>T}ZBfWFRR^d1ymb3wPda86g8Kmf)-!&Mj*0UPVZ($1HE z>t8#LT`HBloR=ht-~Yh{9mh$-QqTZv7j%L$m1fG&>*37O{o4bh5@!~1uJo*K+Gp6z7Cp8lHv=h@zPXgD_I!u|2| znd8ST%PN&h48wT6-g>?E+RuJAHopHK{`#-{ES+@ZM8REt*GNT;V=6nyZHtmK1HX#pi4`y zt6C%`ow4+7@9?w&jDi$mLT}u?|BZioo@H50)5_&?I-UN>m0LHZ4myx-=4<;WMp;~kcf>!1;#81Z-jUvT=dGt6efamk_YwdR|LZ?^ zK3}W*d_J0{3xxts5PrX3Rn?xJ`1k7rTg~`a>~_bovw}t$VU%rWm?V+bXUcDP>Em7e zfyJd2nua|ds@`bs!Z-?r0t~|*k0%z3{bDBd#_DX+&yaMWt*N-UMYUz5E}S}k=(o9U z@_viAlC_5S?72rz;`sHI)c^`+5?zlz{KWFo636r5NW^S6|NP4IJjVZ;UDOhT3jlVk zRDQHST@57Qa!D}i1(~D_&bB(H-cD&96|x=GfXp^-h@p-Hnvw+ZuC=2Bt`G55B&v#} zVYArQCox6wVv>N(IlwxID}#7K#o=~dK@@mzI=q>6jPJqI3stXNrGTP%x~4Vn^V3WCAuip6WLW}q%?o02v@Ht7HK18eR1 zwzuzJw>&=wG9U=D0Ip&v0Am2C?B>cqzyNIvHc-MbOjLz!vg)9eVG{t@0^1Q)bnS=& zw$ftuvyIp54EN36U(d5)7A9*DS-$lK$oF=UwY@@#QN_vl!<*fw9D*FTN)xEtz&$yQ zwr#yfU$ziy114q|x2vU+?fJO6Lw6>d^vDFCc*o0KRD=UC{5{4iz(hdTO6x75XzMT# z!6_-sO1{$=&rVs9$wH8JsU4^%fP+x54s)yfOsS+hhc@(dbnK7ApZ9jCVa_!j20O;@U-)$T?aA5bN zg9i^DJb3V#wegm>S4ch}{5`0!z`*ZVgXvkQL9 zWHKN1oIH8*BL~L+WDbD;L6jK?06=##0QpGzFc#IAwTdAqMPcm{L@_c$kxn#?h@b~lQ`MEe$k;#n)i2bS-h?5-24X%mT(%kn42J;H zZhLfzHp}cb&91t2Ljx2$Vwf%i7D=$?Xw81jV;~(1@-%qloiJ)|=oSMR0EarLL#P&- zmC*sr6-68)RbGKm1VLbg0KAk9xjcY}Ay^XM*zX1{sjwRJcJQ-+3j(^#DNdcC0T{Fu zvD+VF0bsnp|Hk{v5-z0x)FpTotH4&!XHzJJT+i)%isvB+u9ho3!7y6BURRQ&%z7NM%^ z=SH?1WdeieZCq-A5f{l*U|zZdBzdx8e(>JA!y_ZfL=u9bTrNkD#AiPBnD2_`#VbFB zVgMiSR9Q@}ZDWOCGLjj?D-8zrH|nR%6*AX zxYfn^D}_~0|FJC_2-(6O#IBppeiQQbus^#sb0{--`t&K1Aj;(uPEzytZnQA<<=Er$ zX8Vyw9c`2cz~L6QyaoRhFrEuI6A{L{fLtJgGuif&wX29X>Oa}ztckVu+}8g7!7$Gm zmK_R(cF#p6lSx%m8@2k4)#Z0Xfx}YqF>M)-B(@M=J3s#mh@cyZrF`kDzx)q&W!Y}A z%TA~L+PfdzS=gDoyRbAh_xR@?)5eGY`M>|G&&NEU`}}8$<%)-4yk2jqSZG!&L!+aX zW9?SwbRB1NW8=`liSAVLrB_}Wi-YCCmbUc)W$uyf1WMzo{AQ0Bz(Xg7NRtOzuE#M5 z7Odrx_13)(`S4RuGc;w}c0Qj^r_*yYGdJ#BIypLiv!W*(4ZlA~d00^t+if8nj+lli zwmS^tiAJNp^VAnVyztY@^EVq&v}{=d(^b2*{>BG$cN{2;cbISM|M>amNruVi^8`Tz z0s%o3H$7`TUo^(0lvFTX(MQs9F#P5^9_2lzaNn7c={@t%j$|4x{A< zCB50PzxvGQ4~%S54As?@DHQS;PJ}|C+}8GYF1|O(xWCYRH<;|ZNcA%H{P8fl6Yjg) zaOw)8+L$UDpwYApC#HZ&LsQ(2qq%^h>W+wYY+1ABNHzuc!|f@KrLGvcWWno}T?whv z&{e=RFxcrPqBiZ?24xBkXhm4xFyT*HTnRq4^1j?N6?@d_lyEBCbD%H#+H1zem+{^` zhinly+q9!FPG!m4WqaboP&){^8Ug|){y=HU+rEqYymju-vTTPd3z%HWsitVyE@&os zGL=b>B=^86sycKu-M*bqlfqT3}K5G=&9fR_X(z-`0cOx`Ufq(ysG@CL#2M+H`8+4TxReYTF@X`2Pzu_)jY*$ZwL?GK8v-|VoD2m+;zTNxoVqiZC004HK zk{{U^Kf23D<9D^rM-zUuw%s{DN;Q3Si2kF-$H8NN8&2^NBkdy-+qQT6_wCy^ zK0f~O?co0^kZiZjaomFsKKOB9+u!DHe7y6chuVFRPrRA`-w(%iArSoE-(6Umysm@} zH`eo*Yf&v%9ev5J1+Fbybg~ z2S!K7%(Yt4h++){6k@vKf*q^U#F{0~iqUr+PG5EdqVBCbGG%S{X)}HLEQ+mFXsd`a z3KUcz@`J9C1-T66=HOt0GYlDZ9W)XE0znIv&4LCuJQipo7$sQ=m`WZT>}*v~$G&Ub zZI|yS)t!pjTBZXkAF^t7Qn3PbOkxD5mUXoDqx+9yI(U6~o@4lqs5m|VM1nOc+$}p9 zTf0>u6AX0n#L?`|4(sKUeBi~4ucW>42uL)2W)pxzYa-^OF%RYUdP$mj|MHbgAR0{! zZeM>d6f{5R9`NQv7D;i&&2C|<5AJDsA&p^zpriN$UcN_e%Tvo!gT390vvajpV_=}4 zq3P+FnOnDRb#-SD7-}?{i9`ZHkjo!@aD8)|8XDNLm=i61mGmq(Eng|;0br92^Qc{h zD_&n0Ao}mlTn7=u!*B?K1OkCdrIJj<`$B#5ca}6rabvL81BF5Oq>nH)B$5@=c!`XbEA zPSrG&XFvZeMUj^#l_S#0Jfw@(8y>;W<;ne<#qps`j$}(A&6Un5iDy^1q^@B?%sWG4axS^eDBY;;2D1a|#&7t9u zV7I?$Z?~Ixn(hbvRa)On8^!KKS|N#Cr!vsE+o=d=zwi$z6jgPd=XsvzaSZ$6kAF%~ zTrd{EYU{(%)Y!y$M{Em%5RWHZ5S(9J$Q81dVH8WHOs4DPxrbuj%u_uh<2)^GEr-pX z8s$Ib3C3}=sy5CYINB217>Wjh!Fsa^TKae1erJ;l;;wOA%GUz^<(mElqz(Yq;Ug2t**aMQOTlX(pl9WuP0)GFl6D=N(tEx&-%$Xx6OAAZYr8|zW z+}~ovv1hJWRzK#jtdVqf_OPU&B8&HL>>1zN)zw`r=1~+6ha-xrUcGejU);~yeX*l3 zyp$OdHRBhZ`kvv5Nw5FqQeKiB+ptteZ|jb2spmU|F5S-Ax-B+k1(QU>Q7d)8m&egE zHDHn>DOj3=r=-pzr6wg)yp3QfPx4b0YFqkKmr5-7;phcg&YfYI}*T{E)Uu&skMTN zY}l6RARcw;NOdZ$0UyRkull=Aip!2{H5V3@mK-D7XOwALEAOy_Q(Y$&wvR%A2#Q5; zv_y6DV&|XKUNfxqPGb)$+gG688=!eaTH(vafr+l@p&%R3cbHaQ+a{#DymE)pZpQWN zXKTy*3p<0tVxM_;SiC##fQ9Z8YaD)D$+uyluf5%17zj_%3?||PVOeEGeOPFPao;W2 z@R)WI4M48F7X<|mLl}11h0(SiapZ<%^~fzc#=hG`uP#VFw>65a4`^~nrc!N$pBVe! zhW96%k%!U7zoHFibL&|HBoQl zIOOajo%iv~(BHo5Z=lgW>e(It5q<5W!5@dQeSEL>Z?E?6==>XZ{P_GIU)$dR*#1{1 z{M(cN9n7|m-)pz=2{q&Y!gFR22>$*LUd>J2sdg>baPpdBkXLD2D| zK&KSjUnK~i+B|JRDhge5wOB({G^I-b83&aVwP&QK+dzKbK$fNcGn!-pRov#b+`R>7 zu!;s$q#Ct87*t>HcCPjtcgOWD3M+wNK!v^U`Ixvwd1Z|RTd$7r?dd68t@E58HTeqZ zq6j>qyN6pX%@CIvSOYSn?JB1lFdFFXO{tX{V!QjF5MjjQ$ML0%RMhir?<`=_0Zz`1r zL1=z%`bW1W>EXi$$5Xj7Ptn(0&*SAA`(o-(D6?MkT4(|$@O)(wGIXD3EIT&~p;|iA z)fNQPG=ssQ&(CL4-IPnNtWB$d?hNS*anya3vhtg~#m)vqw#(TN&&VwGr&r3yNcf+9 z@qt{a#<3or=Nt9f^(z;@eQR;M1B5yFgypnohS1wVM3-Uj&DrT^KmU9%7$}#^001B; za^dpze?OnC1JuF7Rzg_pYb^!OoE+)AxH_Qq*hq{(0Rx>jU`G;3 ztAY-8)Bb2M7L7F;4OLN-$)u_%tyU97kRPtBmwOI&ZLB>`BZ@yVuep8o`JPC4db|GY z7rzh;g>t#vt}H8+N;r(XJafMyh#8}UKvT=AoO1TQym0r(aE4($6iIR%*KD@7vYW53 z%r5!|@-*LGs>1COMxy~=fMJ+iK99h#*UK{`8S#XQ6yg;(A~7z%I)!xMZ^aUhgh!E30HZxP zypFJ(CUPC6`|yO?kx>i}27~R6=*r@cr)JxM$T6^;hz9PFzAu)`r}ph%^u~VLbT)N~ z0qnZ&P?}tE;ZeDEMk#=b)a($ts^^Rj-YKhE=|0#bQNIepg5Ge{$-LvZZpfAF4I}>^ zBNCXJ)Myb?D|Vx*wcf!60W!yG`Ecb*(@RW-eSq8nLEN`@)Y;x>e*2H1U^o<@W6}<9 zS}q8!a$P)u_8}5YA~`0K)Jyw{??$CYGn9CrI0zK$KKXi8E_4)FG&CM{jvXG`cl@wq zAho3}S8Xk!xFnl~6wx(3(OI)B&9W@bb{N+^|M27t|s8USs8wB@q4O(6#4+6JTRtOB+`Wp8QYME%1%q3(OW$I8LJ zI3TsQrt52E&Nbx#bGXUC20ItpztDBqBtj9$LcLznLvG^XC-aNH(Re9jTWhW$>6eR! z_Xk*LM1WK69A=ddo!Gz5kL`i_)JPMcjV@E=EDO=vmRN3Bt0=e~20+&Xhak}Mhu2B^ ztg!9z?BKM)BlZFxGz|okbx`RrI`l+qaW9@PG9iT2X;U9`Y+iRv-m?ay7(jKjJlk$7 zHs+Cb`nbd8eUJX}bVbf)AA<_VpzQ*yQ37f)NB%7Fl-Te;uUMA{``)vaz3rO^;dU)L zzM!E`e2&~P| zeCNX(TY-ZUv52s_c?`8*Bj~d$AC3j^1*q%x>ZE8-Bbq}>aGC~Du-#I#$?)+~wS8;) zMpq<|>gw)vI;CmmTUI8A_d4pPyN^?g0*-GW9r- zsE|#Q+VDU<&F#ST&D$Iz@q8c}i>j(xsaE3g*m^xm8w)fcI03wyW{0JuixKnHbt@1)7ukfnXTnDuW6p^ z3vQsIM*=al+wevh!mdFEQGnw;r?=__*s;syQZki}$K%;-Hkyc2E^zbSytKal_}Qb8 zSfbfz>{=P>g~IQ@{Z?J`e=!u%A@%gR2UJBd48tD?7`k3>wT6cWnckkInT1dQ{=yeO z<@1I?$PI_X%|;Uf!Ap1V{-;~hnao~~y0bqT`4I9PZddzEbW(MG`)gkTHBV)8r4?P% zN=>4MTeLUo>m_-A$ywcQ7yQBfuuM(gxWR{+NGOuc=AzNaE!Hm2wudFJYo&wnZu3^}$F35cB@kT`Q*}!i#_Cs`%~UrpuewPIO>X% zJHpRv#Yqj|Y;RM65mPOj*uGZf0kv*uxS`1fU1DpNu5Xiq5mgjXsoXYdVauYe)fY2d z8$UE$>og-fAL0!`bwS(;xDKRxT@m15;ud8#l=`@`(Tv3Y?C4{X1A?ZB4fX(qqV&B# zh50a<7^02V(MAIRwN2JfFWtG=NgV;>$(L5Nc6GC9v6;$(vd)b!-x~EyF@Ulhs`p(*#`Ca8+_l1G3SyT+OJR z*~G)s(Scr|jaZ^^|8BKZ!UKMjkZ`k{ko9t4bUxkf2fz^4F#^5@m(Vr*Q^gBkZN3yl z8Y?EOv_MnUzf15QDSKM{&}!6mK3%zL-2+_^Rt!OVwk(&rgpBNBcQm<|vPapp@kI~X5& zB}{C}n+b?IveXR8Z~?7&zF300{m0eIsO zSx8002*pENgXYF(+l9OQ);*!!BUt-XDC@|lb8{^dvNfQ$1DUe!+nYFWV63sWm=+-) z90i>)XnC$NP{b&8fms}}VWgLEA`oD~07V!+6J!y~1c17VsOs4ani1i|0#Se+_rD}?DG zVXte*f~B;16zM{xJS1ARCQf>iFt@d{@|j0JUEE$$JunM9B&zeamJve|YTyxhZuAP-SCn;E^O*sW0SAWaYy%f|?8b9KcR0Y~R1vy~b@xIcu& zu5T3Qax1~IHg7;pk5mC!D%bwf`P0Ar%$LvZKl%RLo13e%J%NC-$8XqF%g67H(WQHr zd6a6G1sgE#%r5<|K@LFmUbW)`f-4=bhC}#Bz0Rla8@ZoIA6V-SIFUpU<~zn+SzM9ZBl*`GAg5H^P1*5$y`R2v9~{Omv#7ccq&% z7t>wgOjnPe_n~dOwY@wM?9fyjhaemx8m9f#KmJ~~&mZP!RnroQgw*MDWcB2+TH#>e-@g7qY~a8+F7?6KN+8Y@N}oc3*XrUgz3}-!DD3sJhJ=C= zs4zPnKXAKZno6LLW>JraMx|=?cDoKUYR}Z2>)G=B>C@*B1j+7XJsywG=c`sK9rbsWaFK(MS6ywnQHf^D^0rfyj<2EcxfIQ8&@VCJD;t0t~$I_0{4 zu-yPL!qFHMb1*_jUBESP+dR>#;FK_fIk-yeAcC3-pbMC;n6}C&i$SF$ppNYV78u*~ zjV%Pj3EdSJZg-X|uGAdx=tmlt8)(_ZxUw&^73skdtqX<9@h$<2jMgT9d;5<+-I-!w zXa<(8PP1u3^Rn}ce$DOkNji8K3qYwcFmPF=-&+GeD?)$vH#NXP7VnSR#SO~E#z zENS9BtJ!he2xNAsY=Rn|W{tv|KhMSeAXFWaD_>ITM%XU+eDgGO!%S0xzsnAJBSFIx zC^3VpCf5y6Wt*2(F6v5pu+Q-Yw`lx3Z{PHYD@TbE>tP%CgekGfk^TtevXMHsu)=1zK8NaUob^Gcs(cTJHm=BPs9n znl6GMX+jJl3W%oz%6qLUiMar-f~bH&kc~JtB$%KHx{e7@D#U=Uw!-El$P;bHn~ZgD ztk<5LMwK=a47~yp0^!mYkJ|903PJ~Ow?@yB4>Hp730tY$NfIP*lzPI|G|}aL3`_$ai-CK z`qr`@fz<76p)|k!@UvfH;jpJVx0WqFy7%C-pL@;(Y*kYSW;i>7y42i2w9d^)@r0E?D&f^}r=P4=tGht5a;1V}STGorB)QdW3=9s9?j2s;T&OJM zFA&}JHug2KA_f`_E4-({D9WbIvaVwtJ#-=o`(_tQgbneE)ZNqfotLf>N4j61ybx2s zBS(%%veam{BH=Is0pGoP>#FWOj&TEiHV2w*#aR&ztAmP2tJ=N=x5(h=$@@ZW?c(L3 zzD%;Kt5ht45H!%&hoVTmR!bxjrfG_;)`xc||Ji$Mk6?pGVN5{aid+paRR7?BrYILL zUH;hzmtHB@cP1Bsc5eUvL)B_!S8g^M4b3pZKHp!w_|uCNcf>IFBF?rKzh73KFw0p{ zIdks8zP`RjqtWR|BNSf^c} z2#n{w9LLpaHOsUz>2x~T%UEPV%o{WpC&DvxbG~@$!ABosXetm0Y;JCq%Ed~#{98NX zBOc@g)DRL~v-Ro|Zdo_2xz*D4+Ro8~$A@6|>cR{f>oVo`IU$e2pk>H_RP4x_(rCw2 zAq*%a;5rTjTJQuF^5DbwST7=PJ?7kBKLOq}z%U88M3@qltg5Em-aX8hYvHI!W|n&Q z&Ssw6^7KNQ26Uxinl^v(ZMag7rus+3&9q#1V7G!(B#iZ-Xv4=&bEBixjfu+bpxc<` zyKbt{aCK_D(I{(r*^mIt9vJGiU0~Oq`ps}KEfttW69aJ$46*OTJaNs!Y zIsK`pLL(3V<4WtM3qXjWqD~$5MIAc<6*>qfV;tyO7~oQ-0(-UQ}Rs{D- z!H5pg&tzZx7v+}+V723tCAnuw3L(w#ii$w;TEJ4Vy3^B_`t<41wR-D@JNN+}Z`n|9 zr!pv(JkBz2wOkZzsFG4O`yg&)UrY{|TUIL%G&j5u4QC`TriDXAx_qp0Apouo*_;t1 z1jKao4P3ZBv~w*1>}(+THNePiH;YQGCXyeB#%zAOC^Hwt7$OB;%a!Vz^AmLaFd^A~ z5OG_UT2B@`Ly_a(=Gg``S`LnFf(irIJP4L97{6=>-}Dc68p4;Kf8KH2Pj)juiBFW- z-=)mHb$zEfKgk?F4XMJDg7Ua9-;Q#3d-h@86iW?u!@Y9&z<=VOD2oE2)uV=gT->|` za22~9P?~84>{v=5%5w;DvvE0SQ5<4>FrbE(VT7>;l!WJW>N+e8C5I)n`{7Lrmy zP*uAIyKo!@Tl!tfyd_VaQ|@rq?Fiu3f_%#Y>`H~g5{|n z-3!Ylf=juW-GM>V|&uvQ&c9? zHPAcSACH_p@+1!tx0dhHI%brmvTDYX^vyQF4y1=HJjQquLH{iWBwNiOl)OFl;b*?^ zT&AmQYilc!jvW{~aN%}w9S0cW248c%AgmBn$7)N)QkWQRuC`wL$@k|&$ww0I10?-^ zAd_lM_HWD_`v>0`861#hxn8SBV=)9lcJ~B1ju$(fxvA;NZ2dML-?;L#U_3QJVGRsA z?+>r{b!}{J(>tsG@XKG2CCN0+WFnDWTmE;izO%LWL^K>M=(e42oE+W@y4u#eH@Z%clZ#Q=9O5lePuEYr-F3lAPWrR+3X`Dra&tP5C=&T%~0q}o|&E5VF*i2kj+ zH~-Vj{mZ@kK3BZ=6}L0p-LtAA$#!cLbGCH%xfh<(G#$gR-E0{GL1J6j-rj^=C)t(J zG__o+oIG|ABCIzq|8&rrJ;dQTU#jIS1|1@goqqZH>rWh?ASfDuk&&KZ5A5w5Ja~0; z6HxVYFocodv*(|{38Gr9L?clg$AA9n&wg*K&`*Sqv?bNUEtvq?+!$k(`|7&eA_>-O zVL7FNw~Lb3>sgky+RkQAUvDT7Xf|7|Rx6cC?OI3ufxyjc*OlDMpJFO8t-|>IUI8uJ zt%2czVm|-+{na+Z%H3dXz8&q_=nA6I~cpz z#y{KIG3!miAAan?2g;SQuIb5SQc)D4Ej<0mc`4V?cN%QBb-i9vH?VFT4~61>K8fSn zZSw{M^c8FT?9#=7-ZTPXiY&$AaX}CyxpVUP>CxD}_b*?OMERMgo*F$g!Lc5{-(RUz zAQTRf#IN4jU~9rRIylwtTTAGZ-}X)Gz%R)bgkskPQc6ZG`X4Yf#o~ zPIO3*Gy3!N={f%q0gpoR4&VX?JZSc>?C;%f834UtaU%^~4#j$&`d&esAx3<>~v z_l_rOD}xk zlikcu;uB@|-%w_Ma^sFVzZ5=t;7s-EiS{;6@fXMTtpyS(hyzLSgzJ4d1ix8Y-=DWx z2s+zZF1yOM&QKD-8Eu~gJ2W|Q<|tWmX-U(qju#677%yR31DlO$Aq{tInxzdHhcw7W zG=OqU$FeO_XJnL~^Y$$B{cHX`%Yjq({oPQjBi_B@kRVBrl%v*p#%Eg(wG9v|&td{& zs9kE6FpZe(n2MU&(@XkTJKNqy%2$Oe6RoP`h*Okm@!hI!SNQeZ+{hd*4atS~f+fRqNyemfu5JeuRiov?#AL!(2oB3qh%cVYE1Di6A5#snLb z2G$zg5>w&aWGohmL}W$rdf2lkA9!bZw%l67?6x1Fi+5M>p4d;WT&2_fnU)G$cF&Q+ zjcSeOy*$qqi$z6|y1IKAj)_H56UjZ}!-J}A=(W z$Q2exj+`1D9p2f=Mj{amMQ86%zj67s0f;hmpe)>jibxJcNQ40hM>AGDP>f<88cXas z6-I6|KCD*G%-m>1d!K&lDOr|lwOTk5L0~wa&-;8nj^oPZO0!k_%M17BhTd zXZCoHtQ_bIZ_oWhz0~Z^d&@qKUN0XC21$|# z27{S+Vr_AHY~Q|r_`)v(5ZG$9B9SnP;cvhC>c5%E!kME_ij8p4yPzYXeEwv>(_skP zV*t{o*`#qWADt)L@diHm&<;?pCE`xAn2-Usc?@Q z?$1IspxNI0@L8UsuFp*W(QM(Inp81F5^w&(lh1@BQNQ2cYPIV1dUqzXwzBkpzdP+l z`yQ;7+ws(2Dd5P`2jixA0gK1%PACzFKsXkSYPw#jR6?N;3?n#2_GgCYC#S3Gx5Tl4)$VjzX zbwQ9L@c-M(?_H{I{YxOPrp9mZ{=s@ZgARaV8+AvH+iIQL zn+<=uZnno;Qx+5cNl&j0N}ysvULTo>yKlZ>U3-`49!UYMv|JSl95dkp!-q*1roA&P zKUU11+j)nBggZ?1y6X$c%2+#Bl|+}4P7X%<(|cMFl@%JWs)!ETf?&wBAWbuMlJ7Jq zt*%*?=>i%kvj}+ZGfz1aXMU}~-7%wW0u?|H0O;9eJdho;x z4<38rfw3@Ay|=Y7Orbv0g;m2u5g$b}DA{KATw#$Ef_b?55UBVNrUx#aF$Iz^EZ1q* zrpb=-+zVfD92@>*H}jMDM49~^%IrJ0{z|*QJ-+wwXsw=bScrwcGwL5!hyY`HA#;Sl zZeeI?^VPv-j)$o;ns}SNUQp|(hIF?H%+^g99qNtg<(3MQEmvhh&V_gs3lfOTSRERR z8z{zDhJm66D1(-UfLzua+u;tp(tGT~$nYW)?Es#dSg<#5RHv>R?G2PwNfH5Jy3LRY zi#e;92GU%DcKlLHLSfel^>-{o>SXrzdjfoCJ3qiV7;vBEjGX|zq|gY%nJ8*kJ1~Vq zWWtJM1Ysprcb-1}K(eR%-7DAD>Jo%&xa&b|%eG-wS0SLjoInzo9h*j z4TJ+weLY6@7Ezl~oUj6!KJw6!gOVgQ>h)kKgb~>M^mKE5`CwPi=KJf>L*2(7II?7d zNtb$1m9=u`{q5XiPdrKxc)45wK`<7J34&0s*TdmZC=}Fn7T zAvZDVe!KHju^}|7*>LakpZUyAHWvzoNRn&{?VtYeyIQAFAWh%oOqw6)Fx*CAmPC9a z)&&rlYUOl$$8GuoR+m7_1Dp4qV9%$&@)gi=sq1-JQ0WNW?AE{Ez?ff7h)3Om}*xb~|8s zY(U2-64YA{9XfFM{F(1BZIiBrwO3h>JJ{X-zG&Y6(aWrtqzUq0{rHuOy4$6i_|m;h zVE?8ex)<(Uu#n{zH2Yj58$V^ZQGs z5{e?#w(#w{lgV&D(Tf4xy?RhyQqB@#U9sb`xa#2nFD*`l#FLI=l~)K1Y@x;vHLll1Yve4*g?`F8Kc z^4yW54~hmmU1|uTmD$sO@X+B(v+@4L*N+Ev7M#XbE+0Mc=mV$Dv8-pea$hhQ+}_%H z_5Jr2!oI`B?Su!s0CCpV=4TdeOnP$n0f1LSvs=p({TT;BYSmgS79$8EpU*Q49Zy6# zhHo#nH-L`W>szf@_LiTeLvg>iA8c2V?P&w@bov_0z}&_y50CZt4w!~nE|-0Nzc1jI zr4EK-KEJPCt7(QAk4FE)_h0MdZkY1-Ak8$ zR&4I!J*4jJQ7Wox0*VQUWv69(gq65nMq#(5DY{|dIFJl@S_;;(5T+)5cJ%pr_vfru z`+#p;^N!zw*#?qc#7=5PYEWa&sMdwvlPg{hHah^0fxIdh_Tg>;=u%!#{jxKCamYv!|UjV8^BjE`ab*{WI61kLqyTt0^e za2?WId(92^HC7S5s+yW<1BzjX8EW5CkJyRF{*Si&Mu&!AzKO|%DH#v}fG_~^4uT@C zZGf~1lNQiMO^Y)P*D(M?>sHVW7H_*OVPq6lYH$!GIfT@`Bto*`qW=ixHosi@{bJ!#ZKmF)di(2B=fy=IsDTh%H-JjB5od`0haSjh&V1iIH@SmXH2X>i z^GmT8ojfhpM`3J`?yd%sw>aNbyDKN*oF3fBke6 z{U^Wm>k+B-?RVe*{^T`IH819yam@~BEj)M6bT)SozLyB9T=#u{U_jj_kQLIEd#ufb zyfmg5ewL6J+`=@_0MkG$zhv6g)^pE2>wdDE`AK}D%>Hg=_Twv)o#{88=_|yfLI-Pl zsOYVX>jyNI>j_xcFyMI$(x{r0bEshpciBh&vk$1 zz05(au0kkd)0ADR0wf1}7?o$0+J;|b2nRcOcweEIpW9l7EEjbw+qM}?!7Zf)`9Zg8 zzyJnBM4sFThhiXqoCVfZV5kG{gb}f$Bn7B~8V3%J7mLMR_E;{TKQw;eGmn4P>yMbE z5$^5&?pvFChojk6)>Q}9-V^JM?U0|lGP~Rz^M%9FcDpT#VltUDO)Fn0Boc``_iq37 zjhn&aBM#*mXjcpnpKPgsP>b18%QW^JJWf#*$8r=!RqC~HzKRPy;>CNZ!sZ>f9TYveZSK6YMh=s(C z$TIZZ_00=&l8-}%8Vk$)V}s=_z)u|)No;d$Nv(-!_61Hi+`N0S8Y!-^3 zHqnYfUaV=Z7-*cYFHi7+hfkkt$(o4t+VnLT?q)`e|Vg49y)(Ejy>4_|uqt@-5O zC}=#ivqd<_Ltp#Vfxu{PdhvD)tJ|Tyik}T9R0cSN3-L&3k%`aN<*$jGC;;!IM^8O; zKJ53i99JxsaFW1W=eNH5WN8W!fhnI2rZ8 z<;mrJJ@GHT@VR2C?DzXWs&uqlZ$K0~fnZQo)Ow>HjYc5^Dei3jTC`UH)7t*g6xsJkcR4|n(W#iEhxlQ-{d7l_QDuLI!GzAruh6^fx6jk=nj$Eyx05SxwFlcrd+Ra{<5VOx0lgD-MfFJZJ*^I{5P3dW{Q){*o{k_MJ9uwMa zp<4c{YjXV216nH5zHOo+(G0+?kh?eJ-Q`7y>4H;l*kD!q352Yy#EOV%~u* z%&`>A1xbz~QzGp3wO96+W?{>@>>1mD6Z>1GL8Vp|B?#7tE_?@IP(d%S%MHv{0T}>n z6==me#yWy9%4$HW%eJJufMgo6AanMsU%NMQ`n}1eWiV65l^zEQ0y}kAkz79v5H<|a zE{X%V3O5PUB^(2@JFt$32;V?}93Ip_nl;KQXqy0~V;;yCfC|&r_16^z!cgET@!o;@ zn^z*E)A6$^&qE{}L`0I23@%#sriWY0zmxs(Nu#6zpd^c?+*CRoRB7HfqE|gH{{Cb-hsYP|LQmW6W^XqJcx$eWH!nZJr)U`-i_D%(PsWbeondQ??OsfK{-atz$bDWI#F%$pc`Z%yN&z zCagix(cX)9uDyb}U>G8@1q%rDT5WV|`B{#*b@Y6DQ^241Y z39`OzK&IWK7sN}5En7>}PL&Sf8IvjXkjK4kdK~^Z4Hy z7_Bf-SD}wNW)c$LFadZcZ?^JZ&8`z9vZN6kkQ;9k!=eRfZX_AY1bv!qmkg1%2?U`r z2*P221lwgmK|s)AH60C*Zph>ZUK}~_CxM=oT0<&j&Egi+Zn#PZ0wF-0a_mXKMI6~> z2?rr~1R*6JjvM3=g<&mw5|>QP_S&un8xu7|ckr%>5s=39l`V~DejDrlxzS^GVy>mb z6yo5FTiCP-T;~Q|1~jDt-4p^1zHPN1dhmg%sf+D)v56SC-ryD8HRXmYAW{^w3=_BV zWF}zMqVo0}(YFYx`*ob9fHgi9h<*AHWr@ zpJsOm$tsi@Dn&$w{@tCq4{p5YZ`#S8n5rnTSj;etTCK|Qyx45~^Y6Vq7wGLHd!wkG zq}U}GsqCyhYIdqVc(UZN=JP~~O(#>WR%_|b%&YHC|6qO^={15NkE6}|`jJ(&( z4rN_FmO!eLK)(9uqn}1mBo>V&U}MjL1Ga-^7pKnkrN`pY&7IP4XuvvjoN;x^wHB-V zU~h8#GGu>bO>OU4*O^T+yJYT6+Y}@to-1^Q=gb#e~(`WV{ znJ5%Wfxv%}WjKxp0)bXb&~+^qk1MiVZ`5P47yyEXEWdg4_HQ-J5r_S3J8y;qZ^-a7 zt5c9%@ICm*P^LQ=3XSX;VKM&d^(zM={HCW>UfhmAp-8&Vu(JSC>B!m$Gbl00W`0p= zb-H`HS(dHUYKCD1gF%8MDUyiCVuoenAcTW_b9qLq*T3|&-(WdUv(Zo#H6D-4Qs>^} zLYmFImt&zH+( z5Cj8(Ku4BS$>eDFSbei)`vfd3Ql;_^)NSbSDDPKDx2?Tb#m%UB^6ks_SgJF;XQWgr zp(q*(g=+QMuFoU8wD7r?KXf9g-)vn)x|5fX*r8e-Fx6s5Qe}H{eKiq{eCNj0y<)8w z#%WFHlbVuNrA4J8>qZ0fx3>ePiKCEi=`euyMc77i?_!&yrK(5m$M{Di9S+4phR?T5 zptnGcVyRrq(#vkLjQ&I{<2f$(Zj`zxk=Y_p(YsAS^}aOcuawKfM!S%vF5G{Yl|q8=!PnvE?gR`Re#+3^mJ+zCutA^ zVz4%d$y=d}3Na5=ulz>)&0#~%S)ePZkRnvAj#Vjr03W{-*f&yqe*!NYIksn{H)`1y zZOB$>@$# zA#@cBotI6_BbDtNhHH_!4Crm0ARLkr+=|^M{squ)R3eXdMp@w^wy}`2610+#&q-!T@u@H&_(?{gU%= zM{m&htI}q=SWI`;AHj_U65UbDt}eosHrxg^6AWb{Nsg|oR?C4YQ1rlvivkFwIxsFG zO~-^uFS8KvtL(^&J%|1jF>6z|!R-x4k^$RvT^E310KtGz8gS|mfH^{gWP%XI(gY>2 z=8(GbP}>GT{3hAZOs$PjpyM4EFjtf_>2N5;IjhBWhWwMphnk{cN;|FrhzAjA2`U#I zz)b>4lu<;WZ5382oV}72zw^PXcHwG3D(mu2SlMLM&61S^bb;2kL8l~wNL=0kAfm`x z>!3o}&H>AGI8PqXj@FTlTz1d#ah~J1x3_&hAIq}4uft$4`0nK!m!^LHv?o{ZJzO+k zoZv*+z?GsFfxMpP{Y&ovv1gq21W-jho^6oyv@0>I z%nH_`&OoiaCt&Ax%xE%DtLDG^m#@7mFlJ}wGp!u@z`4cnUf!1>h6Wjm8zGd225bQx zfB{&WhhZ;`G97H)LdqH6YRJz z_&`sO&*#^5oeKnK=BNJf#qTy6_22&W-#U2kuu?7D-`=Rp>KF&VmK6})_`>Io^Bymb zW8r9c0LHK0DwPgD%2ulfILx3J*aCE0*(wzYp&#}h619>q%)lUOnpQL#DQ>O)`@i~$ zk=aK=bXRtX@_HWq>OTS<-U7_r{-+1A=K788ji5NX_rG8*u*L|OZQ^?;7)FC`F^IW%d%Zl zH{$X5e>vnA4uc?ADwU$K`1t66hvg2OeJB6@ME7-3<25+uA8lHq{G1cps+na%3X(ZdHTm5S@S(P*^O>9ks{ zXgtpGY=rl(&6d|I%TSMdyJ;&WZjUFNNk$=z-cc7tWjPZ*-C8$pPQ5!k+!Kw)%cYWS z+tFxD7Mj2H(>JaIfq&iFKu7nz6B_SYyZWB~u0gkJyKr+bo4)!mpWk+mbQny2#6g;W6YpqKb?&B|o7#O$S zDXpth_i+JyMD?=nTn@-dNKoyIz@4`H#*Yw)j3$Bsb(=F~j}2D|k4DlQ3PVmS+*lu~ z&6=Qn(RWZlxP8(VCbtR=0q8^DwVJl#Pgp=6=@_WBO#xFnX*)zbSfD$ua>M zFmMM+#_7{feH!qO{80ga0~%=HFb$g}oT-A|2CTs#>|!Vep$LdL5DYm6VPX=}gSpoSDD~t6=gUm6PgK!6N49KD6 z=t)KQXjYvK&b2ar2()2C0z4R|ce$N?OlJ;+VWi!s)N!04AhN5x;R$2uiT=O1m&^1V zOkuE0aj+X8w(9-ET`vucRn|9;5(poRwHe+c0tZCPm+E?x@Ru8c5e^KYex3FOd2S;x zBnwJ@E&uFu&wirJK8a71+5c%ct_y+Ce|YC7%G~T|SL@-;=1%71_eb_s-G+x224D8Q2(xM}@op4{%>QaoRCHEw|f}Ti6tG3)i03saJ#9+chpe;Z_ z0gek(xny*MN&RU&a}jEH7AK+YIlwUh5O5I+fItv-VcUgh%!$}Qy9sHkN-8J`25?to z;WO>66wus4!^=>jW)$AerdI>;OfiL4UaLsM}5cR&Rbr#NrGUp z?&2B)<0PH}s1-Lm-%%?{XNznva+cxR7GT$Sw5^dPh9E@-A z4g%tX3hSfnHd;3&3YWdJ*>#VfNXL^jO_xd~2!g`laI4u&#v&*8p4%|Exm=EN5v_f< z*P65WAk8V&$e2I7b0XvG8{1zlm4d+_O;PV(y8ef`&Phu;YY0p-k|SBPTzo3%QEhm} zL_hWTqo+=veP!|XTUNMVlYFW+xDYUr(GKqB|3imb+sp0 z(NEx&0y(9Kh)?HQ91l5SQ(uYuCyMtZyMY}(Ox2|ObUQ~oy36sUME6y|0?CNdgcJ2O zlz^GW^SXDx@Tz5?a9eM{`oc0 zmwF&hAtu&?Q4H^nPFk)VLFndw_B z5BmJUU@!=Rz<0j;*Z-~o|B}`^65-xU42s2_U(HPsK4vEZ|3B|;oQn3*Ug9rSHwdqf z*X=Q712$Z%W0TExUN==)^b2(cq6|oqRGsq@!+RzK)7aK@(NVEB)HVVgI)p;Fq$p0S zEd~OnAK1t)Idhl01SbVBI5XG@cZq|PDpi12f9z;NCK}$;u7Zxq+VBnq@*slpkPeuM zYOY_HwE*Z+s82(n!$J*FgxQ_!*%Ra6`0BY!(&Vj5W!W%r2vTWx0fKEAfDIir+dZpBcpbMc6*p=`-`q@u!hlhT*!(ViKgo`3LT%p+xfP;qU!X!wLj*A2hPKP1LbZysB zEC@DDL=`YoKyATr0286h6b%wgFig<3d|VpUl1jn{vb123?7FWBjGlV zg6rAj&>iow=Sp*j+!+@r#YG2~nwq{@GFwigv#Q|Nxg$P3-(PxjBpN-u|A`p~6|2QK zYz7c(9StvnMoL0bvP76J2#~rd_w5-DJowy))X_H^%A^jZO>zP+C=rRRFW7b4EcMp@J+iN!Qe0?C&6aIl3`06c;HaI zqul}Uj6V>>y*x!&hE#?nAUIhJGaHjSMX z(E-PP!&fO-q;A->(^e2^ufV_^E7KMC4RZ3rvc+I88Z%w>`$?^~jJ9NsFj2~_)LhbM z(?CXNx+va_IQy$vSQA*;1T6~!9M*M1lvA^9RJ9@9(PdZEbWyiVTd>foi~~h5Xku!Y z>W$jNpa)pBZ+oGrAdOx6@H#~*G)sX16b^?QjfSGC;cz$@341s%tm@LtjUl?R7#W9J zm1*CR@Y?3XWbOD1zoM&(-|wd=YX1KHe|mQw^#(uRT=DjHmAv6Xr+(5wY|A@cZa?(c z1DSMMQ}qwuzt}Z|Z`SK_Gf%s4TVlR|;Iqe%UT;wo2oA6St6AM_@cX7IOnq>Ms99uC z210WCMXXULA=*Q+7>VTdJ0yY8Ujtu>iul>`GEWN+6hSem5gb@VEbPf1}eTN1|g3+jl@!%L%tyFH^ zx$__EhMx9+eQPlsCuVWqM#I>w7qJH3P4>8)NFWPKPHr4KzMa#jm#@Bmf7y+m+7}Od z9UBvKpZ?O9Ov7|+=Z$;s1%g8uM`vIB*38t6Z<$S!?COG>y<9vALQ{pccp%{MaDjlo zRr{nl#n`|sWV`lH8AojvI~ZlP3)`n-Sg;?IAC_#OeJV?gamtof>3O&fJw2uVZJl^$7W~T24XP zMdomYAX4_WQ|f(+EsZY);Uw@JAEfV!IMOe401gZ_J659MNmA;KL3>Pf0`CH-^- zi9Fx>NeHS+b|BHr$AwkEtQ7Tjq0?D40}GykcxR!zct6p-XKZXjZaSK6`4QC*fpyfr zhAJ6ZPHI&~NRVm_wCvcPOzWX%{y;f)J!dyyrextJ1S%knKsp3#r%i}K=>Io+|J7~T zVV!5fE9ba#-Y4f!r*bZ!fC4~d5F`O+Qh}lctM z6lU>`O?HY1;d5dOLe;<{@Jzx_43W_lKDvd7^1bUHEm!q@k1wjA)rR`y5Dsw^!bG9! zAl3^d`lC_O!zjYHa!q*xh+;F7Z@UIsGNwf)#==o9M6q#)5IaqMaenc>nce5Unf>Et z_Vd@jx3aoM42A+Nn+m`i5ru=AFljt#fF{Ar`k=`K8xGY3k{Ppj7clN2KBrq_$`)nP z7U+%iCvgu}E#C+n0;LfQ;vv?+oE`{P0+;}x5ypKZ!+EP4yVb(2(mbdtAQ%KF0U;QO z0x4T#AtNAF*RuVF4jD!O)exS8xm=eC^?CbH=t$+){j9*s+03&cxgraxZ{U-G2W7u(e_Yk^wh@P2??mGqV zJ(@W3P;U1ja(I*+n{4$*ys!;fJ;iWKs?kCXANPcS1__-u!=f`pL=Y2Ng4{MM94uX{ z?z9(<9X}-X6jfC+>9lRz#hqd{lis^`PncoRB6(niKU|Jlz1AW*4PK54l9H#}3vaa;_AXqqmSN}pUId=g@2 zG8s+N6-C;qH~wy0xfDM(+1*NV%x%McVB^ej$fzghlz8V(ZOJVMo@LkY?sX65dZ|YD zE?rw4@x<#cNuY^?Q+>Ujl+ET~7_QZ8VkksWRH;-VNs{9@-8AOLM;#};zPthFmTL{k z-3~(}k&Cej%$CqwO=ycJb`{t4kI((`yKBw0@Wk)+R{inWRa6|^zVoD8a>ggV57og& zZ(I{4vQ~9n)S?kb9cem*VHlPy>8_*7@vcN#E{=i-=5r*nXJ%HxvuL;0!@7uOg1R7i z802jxyT!oS#+`fDhQU`ea}tFB=Y9s;s@k6o>kj9-l5Q+)tjOCJ$K%8ac|}2>8W9cK zCJH6wFblyLEosLqRRe+EkL(EoYRGJvbwx6ZpWc-a4j=y4-Q-PWT=xfBY!(yTC|cxD zKyg4g06_oa)RGSL@1{^`$spMT)r)l+q!$1xX&Jr&1#5C{am<7$X!Lm=Wy zZcy$T)#k%xC5N(&poe<01rnU)>L{vXilEsvmv*`v>gl&FO-kU^Bg*-x)&M}ZC!{YA zKUhqRkNWx?)NaQ6-p@QSC~tnVc_s=4klEZ-J3rPdN|s-03*|1i0`Xl$%vKkYo;mgK zBl!f}?RuaeWPQ4Yv73+psx0pnMbo!+FHjv%5+Y=ReDo_X0^Ix3v{U#b!eNbtc$>V3$c$Ax!5)(r61E zNj7a*Ek}Y1D3U@d9_m(D{rs4EHllA6K7=C9w(3)8QLD2XA_B$)ZGBJ+Qat-kF z1`R@3gQuV&+#)^7w$tmz(5k^a&{_(E#d|G-Je>fJ{pam*A;D!JS z!UYCLRGOzig!K)d)AdmQPvb;v`_f1zeRg#X(k&lHK@7k!Qv_N(WQ-XtEv9#Ym0;xt z;5mLc1&d*ZB6&84|>{Zd`B$PY#&M!rtIkW3F;*uENFg^7_P zRjeM`GElqo3soPhEYEd}2VeM|n2W97e$U8_$k+ozAxpB(x;8>1`(Q5X;f<1iS?Gp) z#`szK01GtJA~FQRFc^pFv-R&5fj&sZp{^&2jHJgoDBW|Y` z3AHLS2#tUC=_4l}d^m8uzyHzSsfxaLcJB4FXaD5(o!A)H@$JhkJrT-`Q=G+wlVV!( ztXsG4#X?*vl}0hFT&;##>R*262k+wi6Uxq~EUVC;TlG<(vhYo9`_`sbbb4gI+pMch zCl)57M3~rsF32iA0qjnunWe&wkjS1muouILP$(qH@^~UIu%WgrJ@(CS$PTi6XMQ%9 zwjsvxIn)8#B7J66x%zj19ZrNSFZgeN{Kv;qp?~(f{|5x4JB30zlfH27%)hv>=ETxp zZe7U6M!t>l!;SJYP-&fue&uW5KoIB?EfYnt(P##NpG+ouy>7SLO(jz+D=QETJpZXr zuUy&mkdQk%Y%1kWrxSp~Q)0Y9EqHQM#1F%C?DF{!;+bSFoi10(pRBueIvritGntI4 zsy$iK8qI%s>GlPJ_Ko>gx1x#9C- z?7ZxQhMeokSG+XRmZQ#Q%>iaBN>1u@td49}Xr&uiZ3y;wj6yMQ@8sBGJR#TYq^mEW zV9P}u9rQITBpV(GVlGe^p7{G?PdC#^=-y@j=2d@uPZ(J2SMPZ~-oZu94FsYxXEkhq z?%|k(MA9DDP6#Y2dZx6ey2jhV*+|sD+H=MVB6TvPF>rusgg*60=A%7F7_;gyT$Zp9 ziqA$;F+1lHsO-YF7eKHFP_|Ec?ty$_-}5j0$H<94D$M3xn8TGY;@4@$2_V3?Ex-o@ z9SjhsS_M`YgXSt`*pF0{ll5|oac}V?%Li=VreqONWI(qpOKtnbJ^AFh)Sj~{1tMJ=;{e3> zh=`8BE(%+S)u$@M5N;DeQAD9eg=XI0X#6aIEMDBGA7K?$0m;%KmrBb4PBF7$rD zZ8v4otsKBuFd9X~tcn1fQl>GlSC#Iqu72*mnce5Unf=3nAb5F0zVg9)a2CK(2=%rX zxWs@yf#HZk+TB^my8IdF2-5}XK}GkG32A^;y7B(L6fgKd!!lhPh8lF5 zMtKIMEC8ZCGy)(ZCl(0mL)I1@92OH-ZhQ>ej!#iEjzl1fK^jrNWDudX+=LrVg4;#F zGy*XJ3w;ooH$d}?jpZq)9e5>NTiXCp1gtetDyzl09u-eyhW3y2R*M`4eI)Gu@5IS9 zXOAu0KEZ)F610i{+6h?4BLf6y1DtTMpzW%?cFS(}9IftjDps$gbV^pYY4$onyA#w{ zNjp#xp0xWOv~bF{&@f9)Q!pd)8h(%KI0%%7Ls^FIwww!Dh)X)-cQ!XHze6!}JQhb_ zq*|>a2=bl3{PwNo#l3ru4uzAOWs>n%X-#5Rcg}8?D$T~fT`KLf)xCa`3iG{0s;#J5 z$)i0X*uu%H-tq?7>5CfACgp%@|3Ikx6-l znISi;2iq(Bt_Q#L)vq8B{%TdF zdk^i2Rx3D;J$U>$ zjKDj^Vt+RKo!8&`vzkAZji(VcB8IP%Nw;46U8}T1!_kAEdhSzSIrH|VAXf+AveY4Y zJ4z=72wk|>Tw|2MFyt&Y*FJUfVO|jH^}6S}eFFmnxm-4z8tCgkFp@7^eXmh#JQ71& z(2`y8%RsWGt&TO&k-Z~U;1C$|Pk;LlU<4@_OM)n15cuCO+_{DF|FpT0NzorCNBHf+ z*MinPi#z`KbMbJfR4TD7D~e*HQPUJ9o6EP`E!(oQxt#C&SFT*i=kk-&letuyLg};b zUL7Y)h&OIZ9Uh1X_^8dc7qv}KNk{T~-d{Sq^6}|Cd-q18v1YURNrHm=>#o7eCiG?|+__2{ALsa?CGvukSgp6x@;%;aW1zgm?GH+cc;sXMChHYi&*vXd{)bRa>8NduV^MOZWY?Y;{^D zZ}!%)m{Zvply)}Bv6OU!lh$F`11!_AZC2}Hpo1X@2}AoP`@MW-zPFv$6vc@(e7NT+ zL>K3zis!kI=aPKik01Hf_1qr3Q1IXV8JZpA=*+%ay+uhC28&v&eeUg;+rtA(MV%dT zblR+_VnhU~gt{@>S%{j>29a22#F*!FSGQ;SGs5oUuQI#-9!mf|IjhqO5i{^e0V7E- z%Gwia{JtQ@#s!5YwLa9I;;<*ChlGco`mg++zp1oG7Ju>U3b&Zbw`r;a5ia1OzV8Ep z4?uxlif;X7wDLp6SjuR(9xg5R1>D=i*#b?$0c{BpelSB7mZb|fbVVOU^j%7|4FfJP zxs*JzojRiPxe=hY8*p4P^9{qo)RMo=` zg7sj)C+Ie0kD1aqY+Ix==xpLdq)vuYWcV5$3^nE3q93%j#u}wbN8d`|sH{=~(&mzN zRKa1*g96vkISZYHERq&kDwHNvn(z(RS6$rev}fe#QZC-(wSFWd!A8;X@*o>9xZwfa zz-$6k+-v5*?lerg3|8~wrtKNJJ%A8fG`h9k-richKQp_}eKY$F!-f!7dU5g4NpF+98nmz;rH#_@+zN zTeZKJhw`zi;Bl0WU^L*uy)QM~kn5ucRSx{JulFF<1hIY%&UAe^;D<&Bd(93FaQ_cj zz0ukLWYYH`m~v>yFtrNEG69!{QNlx6*GFKdNP%lOu*d+{0caUQw?MQGVO@~$K%x!f ziiLI+O|hFjznir1NtB=tpmILK_G3hX5v$Y&V0K|68z)9-hTcKfco3)T(GSkvLuq|x zdaT*%(j;^C=DACEUS94(W2qq%KrXz$c4~5LIIhp`8QlcgKm2%o#6v&hmBnz`f&7!?upDolzPrZr;Sd{;FgNaO9|Gzt0mcAGyIS*I|4U!|Jc?q4LMa|k zEH2&ozpt!!a+3#jxd*O#NiIK!uZKEj3kRS)v!tGKI zm(}j~KK$Ur0<-_b=Wt+4S-8N5Qlc2rbv>8MIi6c7SE8{fhGLCQbN}={Kqglf->3NN zjI8M0ehSU*OY*KbOn_1p^-FYU)nyZf);=NYCQ=JJxhC}jZFvU|cUzrZm1}Dp<@dB? zJ?I2zOo0QSom4C@Fwp?RKxlLz!3@r9www{IVS>gM0NMs9nJ%F8c+K_!2qK*y9{cL0 z(G$4Q@PGJimro9H$+)&GS}YW36nJ}7ZD|nX!=0Fc&qqg6LGK}>r$&?s<4UY0Cp5S~ zayOX%enV$V#c=BQ&Y>6nE3kjnK9+Gq!?wJ^06s!#5T~L<-ctYwu48>L7}LVTYC1HR z2=7gZVRtG@F_Y632eH3;<*R?5Kj=d-wgZs6?8cZgUj@8T`KJbjxWP~k#rorGScJTz%W!;1#vw4^0ZSRE-WmiM39~s6 z5lh|0(w0x?MX8eP>K2eC!VdxI*;s5Spd&YXI1384>v_I+&om;k0tTiSbbQ={35KxR zfogb$X*w(k<4$vNVRP%n&wu{Dnce5Unf*hHW*`Xu{M?U~>(y_3`nRqS$abwj;XweI zBYxkUyRj8H_%dccQmPGEttqMKne}S`?;7Uumdz*-8%iD8JJ)I|7tzrIkat05E@+V` zh!UhhSRTxI2HGO17Q?(tk+XnbYAhC379j!#2%5os6mxP8S?AIk0tPX{aUg$j2}F^A zWhe&6NW_M`7n_Cw*A2(4I84)1EJP6;w_k6^Oc8a&Oe!6in(i7u3^uF1cM{Mw99BRY zM={(mi#{NLR4xF*f!|E(XQu2k480TL6fEq}A(!M;mgx}4T^78Bdz-#r_n;O)`vC_5 zM4P}WNwzwNdBa4)q=S}^xp2}UJGQ#%>J)@#O+MMtWfW?8nGyZA`qAx60|R`iTz>7$ z6@KEVT#*N(^beO-doglwEwy*o{?d5tjFTp(@iFm^;YXUfBfG+J$S%AdBQ=%c_OYEb_i|@wi{>ArOS6# zS888==oyZ?HdehJ-TmxK=kAOuF)$IvZ(ru+atLE|R6V~?(oFF8e)Crlj3}2&VmLyB z-Zy^m%9Zr)r+Pb&dy-0_S2X0o%IZXG=`0g_>bcLfTMZP&GMRKXk;3tTUdti!T34vn z_2?FQghK(lbpt^KK#AYJb7N}%1VfOudM%w!f6_)Fiee-Z9vYr-T=13UZmC+G!|JFC zYijlIk)s2HL%!=)%4J><1)hKB!w>)9b~{J0PdKYqV&XlEeBNytTF;B+5ANArC=@^0 zEh`sxzVq|fKi=sPI9J(rC@si^gCF0#^u&Rq&2Fbwt&NY5^E_X#*M+b+xA#P2ZKGYO zc%i|TSGNs?b@S;6SAsUXJ)eh%BOLqDl@COo1wqiVoqR6y`djb*perxrW)9ZY`)TSU zKl0r6drw2x3xweMjv91Zh|O*`qtkmM1ASpZ2!%rBa+wpjr%yd@IlY(=3J;C_=xXPK zbMK!c@RLF?;cpTiN;NHhXdn@ZCX-3avZ|G8EEc0Fx>BuR2quQa{#*{08MWNhLtCJ+ z0+m>s?oUL}7|tOmA)}VpUPh$yq&r!r=_{ryNj=HOH!bks`uP&ZnHof^MZ)c{jvum{ zvK^RuyGzt@kQj<_6Qe`7ffi-Dg8aMLscO=;O`wA&5>pYqK4U8jDw_ZSi4f?xc= zk@Q%0a8G*?1GYrB&btogVjDEiyDW+jJF$^wDEY7|We}ahn}*G$CEv!}8w3)-Mx?7j z<*GCHJ3o#b>C`q+J9wb!e>&hwY_9~t2BwEx0)r?R0aX%)P^=3_b$F)0oP3vj^t?S# zv_KMsaWuCkerkyu40)F42L_A*KH_+eYX_*MVA~33oxW&mELX7$!qmUfb< zkqDJkH(N!0L&vdwsE8-CFpjaQE3Z zszKZeDEq49*d_$%77WBKD%|5C2OY|%0suk1<}2{6g4Lb$H?ZJt6&%)}W02bbv@QrG z&|rC&{!t&+E%zPU;=a~FKGOi7?qQFr=tC;?n3H(eN$y1w0*-CdehK$VCP`AEJStEk zk>CKHF{w$&eX4bJjx7+`I6(pfO6ZV1BSGq}r--Kw7g5FTdyL(L)Ezr4mjMkw`?5 zm98RfUAlpe4D()fAUYYabK9x4B;8NuCW&}fhX54-%Uvv``H0gU z8XLC^GoFZ}5d62VzWSqLAsId)H6^pR5ogkkNF-9Y1fwBNjGoc37@F2s%X{`ccOjYo zPd|E-URxNn+m=fvD0m{-hm+Cj`f6+E&OiO_KL|&nJ3Bk!aG1s5KYjU^-&I48d4!on`2EZpuw-48^onKs^`|@v(_T^pAi$0Q%}o$YV@{E|F+{IeS$&+^3UNGe=i ze5zWzqMAkMdJ2=?HI)gaw^7|p?|$%s6GthE`lP5O8jY&Do{A@r962&JHA9&@cXg?c zNuLY=k^wr6;@q*v4;|bci9~JFX*3&&M2sMa|Ly&aMnh560|)kJ!z1MtxyGz+2~Dz| z1ObRZah~NIS5ftELzY}4_&PI;pdkWF6=PG9Fg)hAA26zYpu5aip{Cv+(C*&^ z>XW6Lb#(gm;V(*&VG>PbpmrAWDV~u-`6`zg)0Tgyeog?JJ=ewLGG4b<{Xp;Z8ja*D z^ga(E_Lnckg4XUsLrni5)oL1`S%GtHfSy*`5lGXCP0=ZnPE|Gamadq#ln7A=Pd>c# zz!&}t^6ZD3gzNbbje?M<5PTFe2w;H#A`oCl00*Q|A7?0>3@}iz9oh!Uni?%!(OLK= zl1NxO=c9-l@D@>L^(7zHgRtWRuAv@U-~7X0{f&{avF9FroJT^@Oy&zOytr@oUIxOx zTg0cJ5E5l|!goaeved}bI|z(K>KZDY+iEXLty)^zt_#^Z#-d&jQ!xNK=a8J8&^SQoV#jLSrf`JVoSTusbA_|7YWe{ddP^xC8 z2b#(Ps9(n8l+LAfP%yMqHWbF>x^wqO0vXk&QUMbIB_6hWpl3l8j(~PxP&oHaJ}3pw z6eOIkugKdah-7@4reR^iDYqE|hg2Phsa#sx+V+Y?0L1};p-I}J7z%{;OI_FqT+@}U z0CdzUg$Rxg27bigQIj2;7=pkq@0iz#`g(Wu7$Bz=x7veLGzEIBZ!{4|>vOLkM!Fx2 zez~ll^p*gp9zbmwthAs82(^5;B?Rga2^|L0do?i=u#Dx4E;faNp`=MB+t7*aTWjVW zrC#)4mr-mPgh`TC@KxVxphkQE3|S&p0oPer=D^(!n2@aI6T9*+ojt8HbTkwW2n>bo zcC)!@#708(egYT|#g$C<3P2xJm0f^aj;Eh~=DBLMilAsT8m&~SwR-i^2OoMH^`jGG z7URyF0PZLn7>Zb}J8zu7bmiJ;U-H2xo>Zh>BpjY!UcK5}_OQ~4#WM}vJ^IMWFFpLk zU^q_chU(%cAAQDm?U~tWL!(|QJA4ctWMdQ;b}CQwx?7dc-n_g1-L-CS_4I?7?Ia+W zLJS2QOD7+G?imtcAAjoexqQA_E(@Ya0Ion$zhda0{PdUqe;FR*(9g*0UNrX+8F!kc z2UeF^)5JgbwbwqplHiH)iOG7s?)!c!mC|+H3*7ztk9jS4XXQ)^J59R)VW}sWNSA5e z>|GYz$wtpx+g_kaB$w+W2;!5L|7bMYYPE!rxPR~7^RJzW=5wEU@dX$JN~Mw*5(Hi- zZ?6BlS3g|J&7AT&qg=4c5BasN1GaKYCx81_zKD|~1cH%Bq_nm9ou9sX!58PUb{e$+ zRIuRg7C*WPWtdtim5WOCni!8oLg7z7Zt1$-Y_{UD*x2}JJd%}mdWam1PGwfD&Q=4) zplC$!Zs{dmVx|Z7FYCno$8Z1fr7N9C{)NV!6C(bB5Hp&^-)`N!PKdj|_nUI&+SBVD}#+NCuh6;TRMpy4i+R8(sB;l)UQqkJ<4;)CueO#w@>kf}1f zFEs;ZGeEnhCw5d%?{cOc_!h{ge*W;6@6GNftJ~6F{kLo+ci1h{wu%Ra3mGz&*a#;$ z6z+r)aRgTcX2?}u=v>Od8i2c+sZ8nkMuNKlg+pC!bYwD}J+^_JfML8wqljAg-T9B> zS}B{$&nISXg4}@bX$VX}UX=tilyZI60w~hALD2S5*v1hHfc(G@f&lX^-&1S=GCdD+ z0^HURBY;eWa0wM>Owa)W%BC2dOo1-+x$?WusviT02k55Inm3f*stX5Ipe9qVrshPuws-UOJkQS^oC0ua zRaas<*@Q9B>t*Z)<90;@XI&5kOv`{Nm0?hL?$F-k<6nC@@x}ir$D7>}4*@>ObprtL zh(1t8Fd^XZ04NXpGRA-{lImGb06?}6=4=B%6jp~PdFBEnggnI}bPbG*=*qU$@{wIV z*zW*zfcdUfe5i|vh%-7qX4^JFQM-4|K`<a$)`Jp@C9;b4@SbjE)C|Rzw2< z%@@|!m10Zu-!QyuFy!4L(V?KmI8wORuxzakxG5K|5{_1tSBvG(e*S)I#(nOa**}(M zzJBKI&W*JP#~;6lwO8vM425w(KVUNh5Pc)Hw*sWf}0? z;hAxfQT~pw-X-k)&BbADhXZ^c<~9fiv6Tb>003e8_R2u?t_6i)`qs{Eqqqa&xKH7E z*UI~m>FX;6^6buBKBW;r)ru545HO00X>rm0w(7^T##KHo{hH($% z!!0bEPKRQ!+pgZG&?R+y%u*lqMw7gC-f=*jf%F=KRHn^VF+Q>C9D=XT!#0TFNyoDT z2o3-Q^h`igFdkOCR_9z5EMioavT_%%tnQ)kWU94Ysx;fxIM>6oX(Jp8;e#g#ABxjg zk#M|G8S(A1?j3&eaZ@v37>>naoo?^d*Is$&-49C;h{VEXSFa|<2&0_k+PtS&v$1&ir>u!bzw>$M0%wkzJ zj(+BOn!tkqh(sceuKlMU|Lg;nnoQ$IG2jLXY7!mF?!AD8Da|Fp@?awNM?d^gb9p5{ z&_6sptf^|N-Abj>003-nZ^z@&xtW=Ar8|FZ-AINdd6BdM(@zeBsd=OHao3>zp~dLb zLN587z4Z{!olEqsxWpHF?Z)=@!EbzP&-7F{K1g`6QYUdUARghld}{Dnh(Q>kqF=Wo36!^M`|b{Qhr zH8CCvhZ~JL07A(`!tcOPan7&%Ov1A;Pj`A2p!=+?bYWOly=$l; z$7MUAbT*M5rfqVTsp2T#lpmZOx||;>P$v@cncHyD=-$X+*_u$#`Lz|2EeCMNcVV^0 zw_U_mea~fK@W%%pJTv}GK7#iC>MvcKonwNjPSL_`%7wNV#vz6sE~0X52!)~;=MdIc z8#hy!3{xT7#|2GgnEoFphXU1VYN;-oM3M(@8B~AZ7%016@%Gvlk&eM5vrDnTZQYA{ zxQi12l+HIKdJ*RWs&s3Qiq51Au_4>YjLzCmVbq{uA00&tYXryf& zhno&iH7yhDlAhxkj!dXz*qWKi9&eod=0EX{UMiV3$V5O`rhFNK2vZM3BuwG3uQ9f_ z7j{w7(<$0Q@s{nOt|vLfK1ao9uZRFQO_cU6nieqv>X)u#V2DUXE*ndlOVW@dU_MLt zHanXK$?)X(Xt7un1p!8odbJjS{x7aB^C(JYuogEEj;1$p*ejI=y-~j7RLc+n1T@NHDu#wUG9+4l zA{O>pzIyQrV3`1k0W68p@U&T*wwE}ab9+SDGjzK~+LQ}fEu0Q~GNT2&CWJ{bIU8>n zSKs#=^+0_9kSUBANk&fB)-WqD5T65k!zRAL#JcNhAQ=S3BaqLyQp7TNdmHm>KGaC- zt)wakdWY-El;RRFmH>^2gSoCLw$!;sg9AbX>Gm>Q+A3Kl7GQw`071xiqM!^Q#i}i( z^*j-Z*_0E2t2l15;TasBAil3Ne4Wp#?auGowXI%b z^s#4HngSsx7K>J^HJT%GS(Gca3>mbo9w}-@JE}c4la9=!; z00H3c{LRxVKbrG;>G%OjoY6YvfqdR^oLDR-Ns^|jsdTzi*!l8LUQ48>N5T_!w;a)X z>xO|F8=BGB(J2(lL6p0?bB6?pEIU-J6<4dLZ2r8CJJkJY)u(>$@Yrj0x z9y&H;*{9&H#K&4LB-B7cVcC=fo)zx)0s#ObOsJglO2hTs;biF@&{nZ4E)T>?43rLzsr_-+ImrJEY zB1zL!r`sFI=SBucyUX(-tZO1rMp<74afzO8!ArE?18wb;(VP`*Bc1tML>%5KMHjcJ zM;)aW2Yinlj?prsmzx>uUFr3_wYyacD ztDaeXmJRO2`Uefr3v{M*iO$dV3)~-_`FPog;_yJwT03!ITG0&@f@`hDfBTzP3d<{V zd#6~6{`arF^@=3_rge`=h6;$UXg=P;>l!HQ5N4rnfaqSS1JC$ucN0_ty z+zlUs>{gkqGfi2k1U?oE!R`_cjXIzc9{wo4?~KRAXp7kadcNyHf$MlMiFsu)m&RjJaeGPs@LX}d zp2n1C<@a(O`=jKEGyM-+Tqp$U(@x=FP;y1?YGyVFz+>&#f2;8t#0DOc!lk0DSL=@3 z)A?&Qc@at0x$L2pcgErRi3i5VBHW6plu^}#Alz_i4})CW&|yHaI%d19mrCyTJgP~q z$?7STeC!UCdIJn>4Dkb3N4XA2BfibR>HrYNDJ(#=J|`HfGz_f!5fW1Zl5w24ZL)}? zv24dj(kQ^9wu*r&z)fPPj)gx$_@N5Y#sIq;NvW(IjsmAtZr}m?G8ZE02?#uq>m*Lm^2{>Nu*1PEZ?~a0sw$x?gmKIZJ};tdP08)AkBlEE_LUg6wJxa(s9g2F%)XpA{k3O5KU7y{ieMwk?V!-O7S zxLSE^{bSC&YWNaI>eY<90n2KmZK{$OcmjxFI1|wMZo*UCnq?$OLXhYX0@`(N8E|RK z6?k3~LioEi2Tv!SFq-=a^coQ{r8_g0>PaAV{N&{DP!I&sShUe-0KNyIc;(WWDhX`| z)KGK+2@l3ODnU~n&nG+UVFX+;{D1bOPcNRNaF4}zMO z?!nw~(-S19!BHBj_y?bU_Sb*oH|7ox?;6b>KlSV*`}c3I)Z0{E5QphZc5C_Kz+nFC zPkipL&-~0GdNIZN%*m&RMn*soC{@a$5aM`FZr1+YORv8rjy`IapEI_AcwY&`)XvVQ zrRoM7f5n^~Z-DtYzeRzG-nKZ2r#LV>2~a41x()o=oS;*sZ8FWf@| z1s@}?mCc;fheQa~Su1z$#Hf8f9(wEQ=>$Uz4vm)2^?I$a z{eRxuY)1xvzcde~=(9nzuhkhb%Dwp5k&`Dr>E*B08zGL7z(CqukMt^#?3WRg+g|v} z+(D$T|IPDfe(SO0`E>4oe(+Ys)e=Idb?&dzY&d5N3___W;0!4rSJKx<1FhNmwb_!SLum6P(e-10m&{j7x zvY~bp?aO?ypi0}Afe3=@%1Le*>OUQZhC|L?RA?pUrLMNEqJYh+L*ZF>!5 zG#ATwP@NO*2DZ^{p`~&ZCIN0H6;*p5yxt zVjHjrSOE;UFm6dWpsF~7#nXwIX|z*+x^Wj3mQ_(-)Hu-_7nLaHP+x zPXy9ozgJC7yqSMYG}>ROzx9l{i87fT2un1IJ2t#xW2Ihhr#rBY4p^x6@X9N58S=yf zGXyQKYRxu?tU&@`18LJ{Rik8^U^j4dxhYq|6wXfxT}o=;ZiiTA6nQYR_q`sDm}OJe}G7iirA zfi)HKTqj-I7U^Xl4Kig73b6UA}f@bnnzJO&`Po+-vz%e8y{si5&n7r<^;O<`leiq^GOS zE4n8fY(oK5)f{a!)*pc2nf})qV zwt$u%&@@2M2$~>)FbzUB$ z4wWZmWil!io7I4h?mu!A41h>9+H5vm*Nw&FKlljpPQPR`oZ^p_j#*;s$-*h2&9NxiXN$BihPKJ~yc+jV-~ZZ?~R zT>H;{{L`13z`oHe=jkUfvjX809Y^W^RL|V(TrW9t&!KJvsyyXngIHL?gMzuzh1^t` z6X&1i?zBA_^kMaayna-Iw3{37DCrwXbSxc>i!a#NO=cFLtSK1Cmk9aP!vsMc~0Oz**uHK6Si#*j*Q32{!+I$Z@klQ)k}bw0QzmF zcSqjV@Lg3mzxMI_N^5Iia7YwI7>3K`ayT63IIdi);lB5OzxCn!K=fa2)S>+E=_ zQu;M%YlWdEjy#x-#RNfUwpymDzH#oV+c6JkGrjuh+eXFRs85sR=YRcM6at?b89%ab z@1Onb6^-+7tr_hYq~3V+%U{nV)9qI4`qs|r^XK3C@S}p}ZEh7(A>MV}Y&M&WMWvc{ z_4ZOK5yvyqd=uPfvtmSy#B((ic(YOdO-V-rU=<@K2M1&E*e8`7EX%SCtJ~)8+5P(R zx>LKpX35gEs|_g75h>s&CzHp^=5Pq={x1LFi@>||%pO8ytB^Ls-blPWBM z3zvMD?xCU^gEg$@c!AylwHDw=8ssEQYrIc*RgBL26zZ8EfP$be!xhWZ6CRLvwrnpQ zk=eBX7TaiClWfltX!1KpAJ`l_nvr%k{_3yLf!qXGO=)e`rfUqf#pN-E^XO0(1VygR z6Iz78_j#_!MNu+r>zz=k9_7L>=VRA88=4znYNJoy@d5(~P#q~#R&7Ss)~TrOcszu# z7=i;qSLzu(dp}3->SND%X3qw25G6blfM6Y_Jum%KOumOc(2xsf>84fl&6nD>cB+&n#2qlCvH6pZ!g6?D#@FlFp`(!9g%o*yQ?FiJ=xq8iUFA#Tu6V5oT>3PCnX;B%o^1)`S~>*-><7{#wy@EmNj5Df!XfBW{P=|o-N zh7%Ze7xJs57Cs7eS*#YpL;6Yy0E}cZ8Hq;f^@e3zqhn+H4EU$98@>X)hz5eO;?77V(A8f5G=X z2!ii>znaRyj-fzTy5%t+f$Ze7{H zx;3bEvT4bhn%+A;olSL&-Umo!w-o7vvM9k4Xa=C2niE*|5C($;)LM(g|2~rFFG(pJ zIJdb9bh-e=f)q!<5)ZWFo`HEL7SFV+1#5L1!svkR1RP93p(c_5v|X+yNDeJwURS&8 zsa^zO!%$0aSIA@}MMbcd$0PLVFbyu9`w~}ChFU#d`~Zsal}Ktbz1XWK%ukIfkPl;; zQb%>J+p3o}dK`K>jtn3!9ryqk1U?W10M;W?ZHf|H-SY|5bV#N9*^O(0uLmH3L8!*G z%Rr^9yE`C3<%YL~8Ov)iyMNE_q5l3>vzg6i zfxv(Lt#|+U?#}40$uLA62GklsQc^kOIijU+?W}+P)1N)M`+?$eMHP!Bxh|;57{lP4 z!L>fxqKb$;(_RbO+IlF=rcxQ-_e$kTG!&WJGu|s*c2++eo*sSb+2_Cii6LtNXMGt{H0dsF{L(w5S8Dq2}g88Z?#&nSTvK*x*bc|tTvD> znP}I_U<^q?NlMY)pv~{xAc)g{foTz|D%5k-;XxN5Bqx%O*k&;6w-JVew#qv#*T z`qf(ZDW~vpQytoU?7-exil!^o8iqpWZrptH)?%Zr^zQ8(IPzsQt*m_bi-#ZiTD~s_ zfWW}u;P%eW>cX8c1s3aT&f@B)p8M6^$4)fr_07%oKfb-L=^9LFLTJ>n)ynqb!w;TP zRkhRU?%%gp#EGTLH+F=H0&Y*VI!O{j*^tU`n%yHMBtQIIp|DzRtWAtfbUR&~z(b)> zwN~{#KN^ef8}85W@%4*u+isM<=^$H*GbF@0Umw#X30cGyTXWQmvW?k62&PXTeD;GwpBZAk?)U$f27=j06m|&8PJuya zi63@2A%bBX+L{jBx)>V9;SjF%fmDb`3yzFcrKsVS2g85k7U0@;vb@miwJ0Fu!b}io z3d#VmS;OFU9Cm`bs6$z0+C*2TLu0W+^x5Hq1vrL{yIC2bi0oLrAMARoE7on zj-=Uf8c^<{XwT!*c0Dk3PpbFSqNCMB68zMuPYs>?%2{9dVQ2JheD4lCd6)d`jmVQ9 zlOYoXG(h8l9tkTtM6f;tIK};DFHHavN!?+24mNv)Fa)tMKruXV+XUA&$2D!-4`0K= zNf_c$vJ2v-LUa|rX%M50l?S%}9k2hg;JQPg@|2H-c>)Hi(J=qswZ%Jk78>Q+%=CCj z6f{*USE_sW?Wyk6-f!L}91U>{vE3cQ$ycK@Aeb48q%2-%y;fXXfScQT{x?4scL_#$ zUj*J0qdG&6-PTE<)&0U3zU27Myv=Ku4O9{hsBF4ek=CtSmd6xdj6lgXRJlf_;KP=}mmC zCI^ra5^-QTBfN?OkCwK#aQDvAHsXLjf#U?mLtqN1vVa3XI@cGjY}bs99hin8vK|m2 z1VWmCOeo+$OTQ@&g>>hMC#P)2!*OiS{-v$I*Ip zc)?EhFP|C4Y1))P-WdvHd={^Kd(hUn%^lK z<=fZqO!sG_(P+6`PN&lV0PO7SOioSinLJcj)3$319C1ftG{?>j@Z%cOR;~8j$O}7C zt5Uo>F*eR|e6dubaQxEJ^6%YV+ZXTqlvb%Ego`Hmnf82l^A=@^5CA*_O=)j`uh4Sl`4WDk394+4RTjcUl|%4{qk@B z{?^uJCY3omf4jc)&dEGhg8{rVj}vLn@pey7H5!d{I_>*D#c?7^|Id%sCS&4^QKp2* zCY6#}j;kp(LT)vk$8uBa3~=@0x#7NCDwVF*YCr%alSxVHb!261baMar0Ud-l>x;3@ z%{&-lQ=fbDkA}q< zD~0Uvd@T2t+Wk!N43o{hLD2ct#TVta5lY|GFu}E&`Z}YHu8>VnzR`g})QG?;s(Y#j zRa5?$Y)#u}qe9(PjU5P3;h+Y&>tVB;G0P)zIcD0v>)yiQWDgXr4hb5!hj;zx(68aS zNb85+lQ*}>v6Nu;kO0CxhVTKEYft(Lhs#Nzmq!$y*TNi;B0}Q~b-vcj>_L0?2_74+ww&1q0IaJ=8LN5Vr{m$KZHcV76|q{`lpdip>(;M;mWL zXmBz2nT7ZvUFhcl`+#0b!#gLP+D3NZ{p6wP=JtQwcxx2f=yDOwuH&`(9ed#K@xhUu zOSrUkottcvkINo)2#!vS<*Pt~ouE?PyS7%#HOQedO_K z|KopOANWv@EWxA%FqRWGJPS7g0P-k6au6>70t4V1U=VT5h}#OFJrF@$A~8lbKp4Y2 z*C%cBUL>+?fnD8GAY?+ZHNjkgjIfEtRJLudOUj*IyPfaoUs_q*wRhjOJtvpiS{}%l z{6rrgWzuOc96cva?eX)ic5Pwl*7=3y`FnRBd*H}Nm#&^)HEY?Ewi_SCEsP>g2Z7QI zj+kg1gg7$DA?66e2v}~x9Vy#{=4VXcs1^OP92pV-KrODm@WKnh{WSAF_s#4d-ZOjm z%nwToQf+Fcs#eD}pvAFTh&t@HI>@&+qU#MGozS8^%p|9ZK(GE2r<1j&4gL%mo zd@_O|AlBe;vBm*s@bd0D(GCrsiS@0z+q1fTo{rQO?|{AwQ5c7~Ngojq z$H9OO+qXf5m3zysq(XF^M`RPr)1aw4=H6m=qE}nx*B+|1ebo_Msa!i(T)XV3JB{*Y zVQtZ3nQxftH|v>%xaJyO(;( z=FYvRo_UtQiDt8bq9_P@Z@&G`%dfqj3B3Fm#gi@#B5gF?0K#iJ+S=aiUOS_=Y9$EU z(t2W7-XO>Ng!JBcrjd?RRWqtYSp+NYEcW%yLNJuhq;1R5)b6VvFK3I+=(u%H(+>gg zbq78ybpwcMt=!EVIQZ%3pLacPZE@lCyLYzx24}&EbVh7x@6}};_lGPZi?B??zo$c; zcz5{pg^P~g+_h_WtyYH-Boqpv2(0y_ONCBc(4><1ap)s{yFZZPBu|02=w{E=tVc$Sn425FRs3b|z zXo$t}cz#F}1fJ(BmC}v3-xGb{g4VH2C_H%VdU-Ks*kj}4@n{T&;ictez1RKjr4M~1 zc*gH?;n+=~uh6Zi^*ZG<0!B9c`H~Dqle1fR{Pu+p8r!R*W8<-CwAbs&vYbh$J-Wv$Jol z?ELjd-}T6y-8|!Zc3OmQXR^7CtLaSm50WV@hNR8U5nr5b!3`0POyQ~?vShp^Eo0z+Zdq%|M@*Q#oQKE`9CN)4W z(9?Z?`p{?K@p1a&4~+NU85qp#Sanb@C#($sYz!HS9qw_Y$;19`uPa6{J2T`8*+n1tjgH1h{Q3vW z?_EWB{#o_Pqos2-MUTlTO1Cq+y)qQ$t04XCJyq$XLt<>zX@}+;X^NT?Qw8ccn zD74zzHD~B;e{gbr0XDR2k!ir`hPTiB?qKrC!((@AcMGz~BCHK_GVDtMvF#BtMT^Ug zXg3JK%&|kWlX5rxqY7*2Y zW+c`wW}tY5=)}!lzsn~C{c?zvJc5J`6t*?TN`nr{QXUGkrC)rZ*vbfQ9jWflTu0RjpmtSH1IemE&(Nuhmp+OAo6B4Jgo#zV^nUAVLOW^Mg^m|Sb| z(=Zhk=(R8p+Q5vvGG=Rs5vd>5*|4`7PAo>JXUyfaUF#a_P_KTc+-R4BW<3PT=Rg1A z=kD*B-RHiU{Udv3Kf3Vx@=8&kn}nO&QMb7i$ucCLMY%hX{<_h(t7j&)o!JKSCW-C< zz+6|!DjLYf(fB;BT@!P}J|mQZ1oOqH2V>wy3*$YWs4cuc1L!@h zXn?ljji6T46#QJC1Mv1j_s)hRG2BqZNkI-L10?3ym}x%0@zH=5fR8` zUKV$~s)2gBO&|bl_>6`47}Hu^qX=|#Y;1FLGndaDIdB+M>1!)HbkfGq8rHk$=GzR}>_4lDBd#LS4U>3-nbzW;}R^gYR#4n^rF=qNFLtPH{m?sk;ArnK%#jcB2q z&Gk2skkf7-$ndvheKasP0ViROu8`wsOZoj@`>ij23cFC9-lU zFwzJbN>HclDu%bGlqQRtn|Mm(5>yjc%>h6sXTW`{{b4?z&zo87B#}QmICx zQP*=gg6o@@{qT*q0iGoyV>@~iSt{Ud;NH3S`vxOC$FYJyQdFf>LQ$0Ec?g8Y`=-Mk z>fN>XytE9qSb-XK!k(<%v^!T~b^b+6FH}^2e8$u#lC_D{xZX(Px zU;WK|CRM3aAP9=bebTb-4+(%qqB&p=zfa?s70xBy3nK_(#rL%OaPoZ{_yzNI0yjcN@ZCa!952vB={gIA3?b!%o z-Hsr|==6gYwzF}baOGWg!)Jxo3$X=!e!jE3BY6QTF7i*h6-9hT2%;( zNl>}(KK#w<(I+RA!rI^bbu^KI*`xsi{d%W~#|a+;`CJ<86Y*Xi((!O#klo{PXvjtZ z1ONL@GPS-v*x16t#A&u}?6gN4q)4-&9A6`wO-$?ZIIOf=oq`D&5)<{{c+?2HP{acf z5|HZXmIQ5kHl;c=fFinPbi2kOF%*x6uWM_O<`xZxCENmh9{`DfrGZ3_PR1te(%MTu zD{O0hjQ!cxFG6bX)S8=Uh`F&p}G`b zSInEe)Z5T_tLu&J+$dv60B1wJcOJm%d$UBMFRfR?OCCc92ozWW=$n98B$}AknQke# z0pZ=uuHoa(6HolMW-qpyj8_!QnipVQsE7K7fwH7eLLltBs&8zdoh3%<^;iFNRQY(3 z7=mmf3*7EEixvf~(x~hrOHhB;6%Y?40=x~#zJVn%+9EJT3otw%gK@)&-wNp2O)d&t-Y8|unZ%7=TE<_hMa!8H*GkZE_CbmQoUR7UEQN8iV2fJ zv(@NwI49NG{h9PqU}RB>jiw#UQq(H7rBJT**i#Q1h5>0PE?*DdYg-~1MhqSZf7?OdsMzV@r%kQK>w+;loE%aW?;*-XZD-CC{2 z34C8VwU2jKi`QQ<90v%Zm91z<{mk>H{=*Oc{_g7b;i(BlRZt9%Mk1X~ThomG{=UBc zex!r1H;PbX-D+rzKS+kMK~S96wug{7(YC)&cSlV5H-P&4*{MR){JOt(yQA-V`h~gi zky@<=f?y(%a2%)EY#u#$u)4kd;rgBHZGG05$h#dip}f4~2`hK`TyM7@KC`UIQsdBp z-4Fy{x_B{}O!fEo*K75a^^JfcuhQD6h_Y+;0}np*;K2v??%5jzeyLQ-WU_#%|J#)v zE;RF~RVt*1Uv;qkJL`Mu&Gk^$isKyKyDOt9tPkg4+q~sDm^|``RJ0aOzrx1FOgd94 zRU(lv%d(YnxxYUz?%Va&;yi%!+b*qaY+2>z{uiF#wRiW+FaPZ4Yh~}~DWTeUxVHsc z<-2#6+HKi|HQ>(nfq~s2Hu84v;L3LMx#Gpm;mNa_|J?Ei8KC%Q$g!?28mTlRiZu;Gkc1w zi%Q_RE`q6NXC8ZJ-&09KZ~o=CRlujyV+jq6+xOadjBrVwaB@Cb;0afo5@j0JS~aYgluPFp^KM*c(O2i5djpgKn6HV-dVuAa7kL zp1Y*!*5lswgYC2HXg`{J@ zL3xTR_vtcYPh8?MEB3h96{@6dgNChD#4Z0Z$=KqRXm=3;+KWEy*}Co$q)Obj*dvRj ze=2S6eCmaNWgj+*tF-S=JJ=)})Cn)AZS|4eHxcH8vJ2O(q~5q!wfkG%e!E0v%@4Ph zXJ}r<$uWaVB?UN8vM$N;$uu$49vRm{(Q~@gR>QLv?(wO4F&{>fVSY$XAG{Mkn(&O0 zQheclpV@uxo7q2}W`6kEM|BlW#UpiZBO-tl;$x9no4(Ej4X1Ck>3_Yxu>q~0MH>;L zxxYorJ{1qM1Br~)fe{pd5DbM%6~ zhjRhT-Y&ni*?#@DOYbhdi}(I4q#KO&%NJDh=X-ud1G+XLaJs?vBa|*eaR(Z` z&5pfFr0zmCEENG53WzXmK$c<+WRKJCX8q>r(cxX0Y_{HLpeV+&tSl?jV|#p!Yjzu< zeuprWj^dJ-HHleGqTHiBd)r;SG+$Qge2l_EiOG5ahV)k)_?agU9-5x{_=C%34_>{! z2-OtBbk^64j;-FgeGyIN`Xe;d)oCmaM1?+~dc6(Z{owqb1Jm(%!gZZ)ueY+W@E_iI zeP1%r`wuVb-4td81T$x~wZLy|EFS;HuV>TgQn46~Mk$7oy4_SdF*7-I^TW#k=6k%A zYf7Xw+UnUoVqU{kT%AL>F_JdH&rbO#Y;4fEz30VJ1(L zY{wduqw%<> z%m3Fq*GhQ!i|xB`U;mq4{Grkt$>q0K@R9!ML$#Hrn;&aSn?0q&135$tZ36YJ;!egC zkiKJ^^EX!3Z|vWNBY7)KqC8=F8_1idwY83 zt>&A}<<)3oB*igp8Ke#8CIa_WT4`PC;Vv#oyECFXJ6Ehm1 zet;7j8MuT;qdTFYhDWruW?y%MXn#DiGtWwvkR@-CgL5zgr`zMOV{Q zKOq4_J@0WMabO>_h?z{4tp!2n`{QHj8Cx9t1tl-0&9b}jI0jrJ}w5%1q$ zQOcu@@7FT3I+H|hedK@i0nzS)X!$Yoa!#AS8aj49cgker4Cs$}cW2!e!E+b-cT1u1 z4RK(!bNAnDel!Fj2uh%RTYSZ&Gb1u%{&eRVsY=2FZ^yK8QD z%T1Y)>(PTWoLNWl4`O4U$H7qO^?33U4Y;=HJ6-^?z7vH!0Ma&cHajLxAczPUosp4& zL?SK-f+R_<>rPCL@0y;`cX~_rR${{`B;r__Tl9v~G~M>@iMTZqeICO{s7MHwn@rDC z0eAF)sRJVuj40Z+t(BT)vm=#j59~i^6D+DWzV)qd#XaNh%107SAchxp>(^sPceb{E z}nMne}cM64EUms0TwOY*w!FV+KpWl4v!_=-PT&Iqi9~w#? zn&=A&LUE_4gYw9L*cmynvfaG*;af9PQ|WYC*9~1&BGE_y1ONz+i2dCbY+%+Z-ZJaa zl$**Yqms4Q2U*d9!S6wl?Bd;%T49CDKmWPs6-fahFr7{pwzj@^_QLfY$tzZU+{>i0 zVo2;uB@Z0m)jyhFdigKt6deWZ84Rvva>JGelm5*3G|e&1X0zArj`a7@1SxBJBpf;z zjuLF@_|ZejM9lYtN~IEw$9+TnlkflRCp3LhU3i?uUSeXY>e_R9WgXy8e*T+B5AMY+ zaQ^lUAt*!=O-Y|4yW_H)~z|89W z4T0b@zw$e;Tweb0{Aug(QGtz&8apE(eRXZ?p(mc0ni%(hKsC&{nYq(vF8=3M?*(P; zU^w&|Kc?<%{IRtBH=~ce+&y&I3V397p?AepCLnC&9*|QEa73v>AS=7v9zv@hId*}c z9SIG!DhqY{qJT#!H_MuKlUh^29#9mb$Wc{H*j;Dqnv)5 zniwFUb;^@+3fe^XQZVH6DHajOeTBypdVFFdF<|+<8MV|e-!642yyyz85|3g)(tlF` zxj;t0uML#2G{7Vx$;|$-GNWxNrkkx&JsTh=Qd9MPj~12Qu5&-AZ^=$LH54>vl`9GqdoS~a z?f7nwWCpF;gZjM~E;(XiBX@i!I+eD;l=j}QZ@oT*>NE_1plLY(pu^`(ZC)L%ucF@=bFeEs&F?5-RjV>j6u<$^`g={ub68GtS$^8$?LQPw{5>uO9SLV#c zLG5D?-nt#i*6eB0h-4w76i-}c#tj`n6mSh60btHCQn=Bm2xzgy0itaA=KfAka10Ls zCWi-bP_=za4M@RdF-(JCrj1B9XtUpnCV)7I(IG(edHWaQPO_PWNMw0y19E*I(PIQc zl1@OyOgz+Qbz^AiMzPKKw^*EOb_ATnArb_E4(LLRGaj)bX{${1U>3zkr^YSMw2Z`Q zoPv8mKmAmPI2ngWK8SvO+^7>s>AEn2K_rTxFe0q;bEjj6%KV^gz`ii1x36Y;B_5zB zDaskp>#E-FYDzVr?2@9@OuSoD zx^W#J;`2V^Y^paqEg&fkBsu)&xNLlpcTn zGyNmu`TVHwvBh$eu>5o5>CV~rfA66~k3I2(uIu%BqrX3YzVhBTT;d!66Jq>$SQM0O@4n z^^Y$6`?@g`BA#x~Q-f1$Os3Q}l8z3S3uNESz9WZwolZKF>GgV&EGLqQm#^Py`_M#$ zxpVj4wR=~m$0yV2RJ~reElUW8qmc*@cofA zPsJ0rZryBlx_@^1>Xo~9^C4z(Vk(o)Bw|7|5{DqDR4Va;KqBzZKECt=8BIr{4_VD- zXyA5R{sXJirjom!|Mgu{6FY^S!I8n4+{o&^YCe)L3$a4!2JUh&I-U?ol&n^p)n^i8 zXQ0%^`HvDg0YmUlI#v`_u}%Bwr#`EZ==p^!4H8Z4I-s*yPHhiD@Ydp1-`K=skDgLh zwOp+TVhFK~e|7$<07KvOy0=mTm+SifZ|n5+T@U`t)yCnC3)u$YfMbTJ)t%dA+oH5$ zOsx?PSR`}f(q?CG-)U-y?{(JsP&~-yEPh))O`?Q@&M+43BKHEkp>>h8x=RzlRZ0$k zW0hUUx)1GE-}|Nf#%u6UC_?C%qoY07l@{7-L!?sZ8Sc8L&o8}w8aJCR*SEiW zZcx5+FSPGk`WcJiFcceg*H7qogj*Bd~uAdhwu(bka3LeqVlGR zRyxTm3RLtvwAbjX&X49&V~38@cCOOnWxOQ>yaxj^jMGpNfYG0GlXoG(umYh+SzcQ5 za-fq7?|Qy5bm+%w74uZw_j_Q_LNwHAoYKl(ls+v!-gWoOTK`Rb%xGpFZB-lTxwHAN z_U9g&9v#`L-N8HCo+8=0y$Yl?O9C6^PZc_}qey7|9)wWsK>~$U3ffVxp1Atno-+Bo z(R!mFax3_Bf9!4G=JeL~381~2#x$76;m$s=!&8Wb)t=Ow8QN!gYy<3s^e*VZ$EzFt z=?sx|dX7X_TQlJ#7=l_Rl+`>+(7GfEKrm~oKInm-V&KX?P3@5Wn~;h2wvv{P0yWPt-#xo^^YxeDbS&W#2+(bYg6ErHH6hL;)|_M=lyK4o z-hph@wGK2poP$Y@$qep6{1j{kCScOItCM5^2^s~zhr4^~y|~Tj2o#q0D?ck}&0p;3mW?WO@SC_>;S$OZu>I`WtV4)h3L zRiiwc%Vm2C*l|M3I4CMtdGufxP0cg8oVo#m`Lp69D|8GsZ#cL9`nN}l{6kac%0$bR;vZW@bK`k z?btJuldG%uoNjMXflya2?-b6Se*48|9awPUN!N(pKA$Nq|ByB%8^)uDi2S5Cnl`*;1)AI5c`>WNQ1|2jtG1j}9lV zZghLH^wX94%csu_F=)QOpX0bnrGlc!@ngrZCeST6i2Z}zqLkz5I)UEm$Y!HVxeST) zU$}9zD;4+d*{5lGtJNAD8rnZTt!yrwTmMLF0VsnE4h;&tu(P>-x6&yT=2OhhHa*+3 zD}qY+Y|o37hihyL*&Gfh3-0Z<6LfVx+nDnL4*;wTrM*l9}TGZ@0$T4yKoXE`nP5=)ZZ^uCoqFC>5DFEmDAXhJeE3ui>U67b28a}a24Fv}LzOPM zg~&9n4{hVHC+_IYwCCZ)%RjOM7tag`s^mkA3-ehmT8$^VA{=uN6VD_AbrxUGA#x00 z)&THgM_B3kdrI@1+`v&(>a*TA+S6Nbo)c&G_4A{Xs|s*eU3EYw2T~zI2qRp?i@Dm4 zt2Q^y#I}8Kq{pSiHo~fnVx!qAM|_7yIS^4*xKqdfU-tegTCyy^&qe24OtE4Gb8N=k znYoj(Ad9i9tD39XQcEq#0v{d8bS;f>j*snoY|EBxwWMxIEw$8)1>J>Nm08J5n|beG zj>Wv@eJCG4T}zMmKIHch4>4klSTo|~8^8Gnfk14FvTD2<*p#IAYF2;C;lnUERezNT zg4>y=*0cK|!-gnp+Q0Xhu|-6vxv|IIDSSlgx}V(oi(l=2HyqQlm=K8$(=mxA<5#`G z4@~@3XP9UUakV_*8ZYje7RSd7-PcVW(7ufm5^ylc4`GdS(UH@kqKkGk&^gvCr_}x` z%ybZ44T#$Ze}5UuSlo`)2kJ-DV;T!q?B8zIpKsF*QMlpi5 z1`b$4^-_^|aVTAHw0=Sr@}NMnyHP-Pu^!=LdkybQNPn_+5utCd(siBSn-~O^>MC`z zYLB~7o2sck)2gh6h)Rr>me?rfo0%dV&4`NLE_a&**mh~r?C*-XL2BHQ62|uCx}|h7 z9L-}RE-?f=81|3}IUN9q6h_&6rgM3$`ECu}?Zy3GkaAES@yy3gPMkVC(eL*&nGDBq zjb;-CD3wkX21iIUi~e0te4P;;b)MpWnH|q6FHita#cmLw=?qOW2 zm~wlo!z9u@unSAx~0<&hU(5;$6tBtZ~LrJb+8a`sgPY@*VDd8{w!A<92n!T_C~=V+bN*;sOa!w-(Y9^zi)M^_7+DhY#&X zhVhBN`Jp^I@_hZ?!Xe5g| zY<6#4=`{B;+|!Rdlt`p%wHk(DsdU;jjK!t-|GO1wqTwgyQZF@d8{l;r2(Ez13nk0N z!G3dVM+<76>rPBenxC;7>jDP$(2?wORy8ee{WkJLSqIjeM#daZSkfb|pMD z_2ugAVb*xnW%sP!_;k$sDVuLL`%*+mr_!P**6Vc?plCFjh=qX}G}p_ykyLm%yrRre zDi(nW#OM}QsVMC@9B5WMOUsu@f|#0~c3rnttAzxiI6Ukr>JQ$2>%~GkVRcI@TPI%p zLR1uMwOS^dG>5q%!%@27b#%0rZA!OmGmkj@x1B=)U-$kPGzh+f+vP`xFR z-fRc47ulzch426Ct-pGl*FbL4ixhb_6cuxE zLAq+T-fh4QbCPXcd}#X@d;0K&lP`$5=q1YtTeN@$Wq}xSshIDDDDA!It{>8a$2-I* z)*XuEcuA_cqPp9*R zwKHSF+8YOEzi%=H6(Ne~>vE{i)`L9)vv*+6XGtzHj&(L{`6lwKj2E`6DPyTAs4=aY z@4d2y4c-+$I#w}08j8L*1&BH|y?6R<=hexomLGZM+Py^$P_5DNG)89xB1REm7!)vD zA^Qc(PSFX%Yg@6Ac?Kj6e4ar`Qyft5sV*E6;WY{GS3XUEPO zTDV6%uXTs~noO>7m3bKOpS*8o_qlIo|L}Dtgz)^?(-*Gapr%hIbu$6YPMl{$iM#Qz zYgQlb8~fzY2H;-dYQsHyL=Q|K)VHWBOT(}bhywRukr23;{ z1BF7-)Rgc1%{L%PPEYM>wOWeY-+yp_AwJk#?e&%I$?>3Ft1EIOnHX`{zHF_8#Und4 z(yFcS2_cusR;#sCD#^0!>Gw~+al15~KY9yQ-CG6)qq&hxE}Nd-yU+E!dcB@VrdWpl zPd|F~Y{MKKE0`|%Acb~#>A`-J5khKv?WK>sP|RcmAruOQs-4EWfA>Rf2faO*1kKj7 zLUg5YK;Q+}pmRpgR^*4C`A9q-t5hl!MJJQVUccvh&NELu2dl)bg>xFcXwXS4NRwQO zKwZXM&W_GHefF(0?|rbnu`;tSk9rTZr0CHSOL_t)> z_CIv^!2W17Dl3X@8avg_&oAHoAUv|X)KoX;v+3x>#MDzyKaCM^cxdE9Eo-$}xm=EA z*-E9tacn#u_ibC#jZ`i>HN9tZwPe;S;$y!|%)j-*BhMW=bnL^)7wL4mC(Bx+{(rAk zYYh37>g8mF`*Dy|x*JAoDN!eRDgu0y&=(U_qS|E^D)Ysd1TicmggA~BSa$c+EPYGY{n%bmM>3HX;>A-TTt%htWC1CbAiXs}xCHR>Z% z6RvIhzMoE~6-8+_+cSIjL_*Q^`MPdUvlF4~-A1=7MndBWnq)%87UoX5iJmxo>++>y zCXA7UD292S(^R$AYTz=yfA@*y`SpjMe`#W5s9LM#aygo&7w+8p>gl<$?CvK}`_<$` zb))|Wjcae3=7|#zzVO5ojdnYePO%J=O{LG>uu5(0fZ4fP>3#VtU&;~Q*4gh(>+ukq zS0ks}?z-tGu>etkosesXwd8Q-a0P5`%h$qeob+b8B!bwsi(9Z)gds>X{do(jSVwXN zJir@lbjY$9xG`y5J=EU}`$Y`r>Y?~N85!2=n%i!urQ_T4gS}1JabmRCorV{*+U%Be zFgp->;Nibg1G%~)`!Fe=yu)L(*2EpK>XVo(^&KnlN(1tGN?kQj#e`0vdJ$iJbn1Zg z*{>!}JT~XajjgiHGcMU-eJdbH4~V<0m}z4lXtv9Gd5qw2oN$C_?yyQbDtApDTS3BeMjqey==;Wk)HL>VT6KSFi#yR(|2oqUmf}y}qi)Ve zU(oF-w>T`N5_tw-Y=mS}!vw^n5YLDN2qYhRv}8ax(yatR!y;}XUO0jU=WV!GQOR~^%^ckLghgTU}T83hp> zvniW|ERFm+T`6JmJ|pblebRLd90PV!9m{+>V7n_z7)>Dz0)~hZg2&onT#4c!1(t@Q z+SL9N~3cZ?#t}zahe?s}$mt9iI+je7{v+Guw47MiC?jfY2fIw0hyC?y}od z62}gp6G!@;aoS!Fp&5e<<#9#f{4}SRiy2ud}3shB`n3zyi)pMQ0M;}m4BzsYv6mZ`B@i zZ7=Y#p_vm$kHq4!eqZ)1^WvSme|maB8$6D0&mXC-n>;vtU|%E>ZM9pmNF5 zq(@Mg+CH@J(4$X0=6im%`akwTDV^@uU;oL~eEO8zeuR)uGecXg&aZ4=A(I35W{+Io zS)Ca@>>%;h`SaOaba;5Q-|zSP{bI4;x-O1m`)Bt#oo-{UN5y@kd09s`1`7!`>9d=L z<6++D9wGheh1W(0^0{0_mX+;F>D3Dhdv+bZw7D}mlz8y?;aaVh$z(~2yng=NzkK_0 zB0lq^uVS&xcV+bA(%X~MQ{`~vmp}WN_03I56h%?&_51I=d!{-6R>7O!kn#<`#DDOP zzuW@)wryWX)tNE)&_-mT>H0oC_Jy7G-PT3q7>YTF#}7J=zS(&ThTV)eD%eP-DjvS= zwD{~;f;W|F^*qZqnE)#~^LxAVjJE9gl@epL2qR~cJ3Ke(Y?ywxt7Gxb(n!0eyBO}m z!f515tmbW6NB#Kz6DQA5jJm!cU@?H(f#t>BK?U?QW0z;uByA_6xRSZ;=sGYl3%NC_ zJ!DQ6cO7}_)C*S!Kb@U=xS8Hxx^RK4Z1~Apok>P;u+M%ikEol4sRC}d5?nn(he?#C z`VYG%nVfuU=)^MQpWS)=Q`#%DY=}xukPc9Btd^Y*M0kddcEm} zd*%@CkwPTHW@Z9~>fk;}K!BHLdJE^H?6>%n$ZmXA_FG||!Ci=k2_Rq?28e8%zFG;| z18N*2c`HEOawVn{rSwtK9IKF_h2?jt$~_NsW;N&8YMID$U)%TD+m#A*+Zbx5)fK|F z_#h-;6pmxKquW})w5hmY=6Lpz{fC}^$5OWy4Mfu|a{rdSFVsALpz^v1uHUhj9^2YF zmOk=!x>77JP9=<2)z!oCF+Vpr$tK5>;U+Y^{`O%&>Jrlih;|7I$9+h}H8kk;Huel{ zV*V+D=0#o$0@3Ogqv?>C?EwPQgOE$p>B2oIez!~dvXxaAKQCXs8Zy_>_`{XJs=e7I z@RvXHx%+!F?{nYG{*lb=wHsTvF8y2_6=vGiyV>-#voY&q?_{%*y7{qIBWI!?^XyH+ zKHBgKCNw-PIZ}i^hB>-NbfUNbD4n7ZO*3~QS_ydvZQdXd?wLQXjxtd(w3mYp$`uV6B05L}2>1xSPZs1Qztwi~rgqe1~L(;L!#T1t`GqE|N? zwdRKCGzFq-VVx0wjo+!p^U~!#A*a46P2^Jyx3b;Ty|p2pBQ|nxy#D%9V`rEdSZ-{P zP(F3)(EuS?mStHE0)Jv+f`t6a)|SAkqSRYc1V;;rQYi4&`((X1^vK;Cjn(z*)$-jp9y@8$WiKi*f#c)G7t zo>kkoA*?o59)IG=OuoP}OubguZ2juD-&OLDT+Vlk?e}tOO9*?uK6f;Jq|WOjxq;8T z{3+jc36hM(Vt@bR*Go3?TvzLMT-VKHGKo~85H1ESM>g*C`E{!sBe-}bDs1BoM!AMj z@!75ON1_=yJy7qK59syb81u&J=CjW{pU>xHSvGWyrkOuDbFLwUleM{1%dd6Rg-`tE z9~5$#Mx)_*UMii|b-mN+!1w)3Ce!Y8C$@>#*bgW7NZZ)9Nd~a{p16OJp|&h7|k$O z&%F2Ves;P)y65*RmxV<3@44g?bElsxaQ{6vX_Yi>YwpmI!-5d%cDt*q8{d58uVruN zZf+7d=BTm}TQ*ZwGlbKKjQV^nUfT*g&o8qR1FEx6$8Sjc*N8&jwG-tJM6%*xL-oc@ z#jD21X&mNydhHW0f8?Ki^;eHgPjh(co!eK&iT(q%GSE6rFW7PLs%!T^qbYRKHU~Yt z^t(pvCZU@2On(=Mb5Wd7U43$MG%)!Ik1F?jce|;LWid8 zI&Ic%r)QgX$F*3-*~pU@nWqP{zkBO}Blj%*gG)=bi%Y;|Jbv604(~M@kL%aF@$v2K z(ILWiIino)2?mR^NZ`km*yLqCJ=(nc>%DJHhjwTwI~eeQ)I=Pk0G8AnF3tZa^7sz| zFWqf_QmI7!@>W1pK?@i*azkTDF`MDEj?>^+1{bCRXof?-6%~tmZw6arnR=HRO`v3l z(g~OWcvQwQ4jlBzd0cH5dqUiI&V{LOSzza0Z)z#Xshiuxn_Z2!cUrqPwB`;4(x6%UxnNMG}@euBEJY58i$Rx598gdny48?i8>{WTk*utf* z%gYLF`3#lO|*A1hTJcT^Z=-XX~N zTICbf+it75#nYeu%x8iC-OtSKbKlJV!OZN=ow*CIjSLA^fUl>Dv%Xu6Wp8l<57gzC zTc%95&%t`rXAg9A$#*Tsip5ZvAPhj^fC>|Mmx=n2+d`~^0tGQ`0?9nv5ZO(6k!o%_)%D#&4)4^u>% zOmLjy(snQd(-|G9s?wg++Kc;}8OnN~K0dNAgmB<;G4;VCiHZv^oKRNq#ussAl&HFAWOB zNMBY8}uePGolX%9*ITlzxFXU}k z=Y_2s=cD7}&ph=kPT=KIDH@H{>(#${^9Km!kB4{VGkrjAZkA#Lku)MJ^9|;u2cFiI z*1a2drlxki_Olnin6Sv((xk)k85RYxl)3enyDB8J#aV? zNk*k1Wkrmq_(EO|Furd;%EPyox2C4{9zA;G!$7D|EWGmbH?COQqxSsXrL)Jzv)aL9 z{bny5jtLwcPb4)>`!Fqo5LT;IK@j5c_^q2a?{2P-@6E(L*(wZPDOLaW)mMuvm3)8U z!7qO?m&sbDmCa^4oo?WHODk)?v)qcs(+?_IA1AImp~sfaJ?2!mWEX}( z)<2(}7&?9a+$UcA$frN`shejnYwgZ&|IR<7DCU1|Pp{S+Zm<1~OZTej_)9yBLUQ0e z%l<<9W-69nj~u!qPF*X_KVnw{DLQC5I*U1M>c;yY>>3|UrjnIvH6DwFLZMQrM3Q7K zpOJ*P(IIP<9kCc^P4s5NR|H#LV$K$DZ zEJhGyyHPv8uyz@yf2H4tgZb}?1G#$n*QnlU1Mj&?x!+%^7(KNXh$fG%x8^4+uTOgiFq~avInNCdmYHsq9w`63?4Mh6 zT3>qhcg82Cml_|ahIM@JL%;IHPxkuqz|io%>1laY1vjn^$QHt(EBG>tDL%Aaxb2!I z*^S$n<8`MxEnrxV3$P#@6J!-;qIow%{Jleg*jh{X1t5;k`?sILGff>Nmmnm12by|?$j zxSD;6jAUJ5mP{XVGP_#h2*qVhDvq1p(@Q`6b?Y=flHQ5t5`8P=J1V3sEg*rf1v7sb zdf;q3Io<0&=^~YBM&OjIa^WPH>>(GgG(+1s1mg zn!t2utOkUQvpcF8b(N}GKi1U-25FJ!4Kh?#+Y@5Ef;`pofk82lvMIU-*&p^TOj&=r zcQa&em4nchzxC;@S97+~b@f$-xj$+4KKIS+ACAlr2I1e|y}bPXtA#;SBGVKbn?mGH zG}!j!W8K7IjqDN1&uG_o>L!$m*8zS*(ON|_i5Ze!--^o&FHZJ z6M=7GwoOFS=f=f1Ru(ZAq5uLs90+-iWEm`gc!Ed5i0R23NxM`mJ3O~qhs_2S4lo)~ zxKDc;7MLu;Eo`i8M()&tnhwkDmey4aiY`V6f?Qq-$Lb<`nWI!~6;_u)s|t0KBSyx$ z5gCwGRTW)q@8}@T^YcL_&&0D{ zr`-ez*V?jXtyxq6jCiO%Fa{5$2i=-p!ps(pY_w-^MMSn^tm0J0w3>m95il|}C?=Z>)Fvl+R{Ww>7_M6jD6u(ze7~UG%d%hp%fE8%&d)x$d}e3k=!5$`W24m7_DmhETtDX^v}blN%dpj2b!OM} z-qh~RduyFU+3ad@Pz*=&fskOSgvLkyqOLt{I@_%pT^M@tg%^6=o}wuEd_D+}(eHz5 zMZbIN#hJtPN4~n%aH{jSMJY;gB1dA~UO$~qf2d`WBt;?-S(baf-pcl>#EZ#z@fy#) z;#%pA#c^DJ={LSIK0fKWUM7?2bi0o0gcL#Bg|U|Ni!-8mxClP90ry7LeAasHqqm-yv6MRSDvIBh2I^CoOEx!&vvh zlLw_p6vr_`*Oyl}{>|OZUjgkY4*!enjMnJ=p1yidw}u`(a$;og?7KguqTJfXaxo;F zTi^MUD_8RgzH1}GFlQ_3K;LIwPh?o#v)W6m($3AiGhoG@-~uh=YbG!lr99BOv#+v{ z@FHVg5zyOjx9{e|}?GvkSoowDRz15Ln;_^qo`29^D z>G-rIe74cN@c5&DXNp)`jle8qq&O0utY0w+dX-AI%gdsPLjofKcDU1oz#s7RYFfVI z-5%H0_j?@OZ{=X|c*tPF%*XV1eC)5ve8|erWjp7M5DlvYM z;6pr9bqL$!eA@r9;fPL13`!3fP1~vMmV9HZ7&uTP{GRKmM6|1!9XD9iEY=n(h;s4gVTfp-Op|nr z4!`z0ptaO7=mIFVGiZ8fx|nNj7cgbw!~<4 zVGcGLeh4Q>$PosD2n0fpj%vQYXgVp^@^B{bDMeLFjm~qiu)>&R!k zYSo1)!>0(U;*)NG{zteJ3hPc%j~bJ;~OsCKfd9S0tPJ2*gC z-|;n1i)W?$VBwOhY1O_U;yM}lKpxbM4V%{LACUFU{KzhXVF-eZMWeDJ@12?&$V}b1 zIN!D_0|nENOB*OLB@W0`wQR3gO>7Jd_n>9T{ZIeWue!F?YPHhoG)a=}cJuD?>Nh&p zWV#T7?jA<5!xC?sBe2u!bX*U9`nP{gQe6Gdz^5poTP(|}Tqn>Qsvc=#hPhywrNE~7{! z5|Tv1^kQ;~u0yKlZZf2S6Y&e*h&4jnqMpBIEi zvq@vv-@NhW59sU(k$p7iY~&9&t@dM1`DV|RveTm+GFlg@TpGqx4hZ{36Yn-1gl31v ze3tyd&3BB3f-p9lib+zW)oOX3m(65#U5`X1mX9o4TVQFd9d@AAzycvk7jdG#>1&lX4CLR#z&Z+%-1yR~5m87sF2qF~D_w7{W;0KX!EHVpiWSRbC=@izCIK8V;pf*9J;0NAbd5_!!}~ zMT!L^$MqvbvdNmj#~{XZNvVsADZ^|aNh9K~G31(Fd}Mp|ME#t}bn~IT8;}0}f3XE+ zX-!~qUtPQ#o6P)&@#E^^GDlKJ9oH58N44G_GWA|8Q!HP8Jox#$a6@$=qts8x%OSm* zrO~+wv~15!5i5ftT_DpTM%c|ZZl$y5b(=LV)`whR6b&H-a&PzOm=>tO z0gC={Ql3nwFj{C}yWb7;J!&qhq;9d;2PHb^mp}E{Pa;3S@cU+VpZjL^|JBTb0K>4a z{po*hu5Cp}#$8y2kx-1K7b6^WuxH!#eTKV?wr=2!W3BCiDwu%IW{U?YGpqG2oab?f z2+AQm2IfmFEEAn^O&NA5ABI%SXKbB{v3G{}_m=MwE$KqtxCz0#BvdOqQBg*t;avkU;E-ZpsT=MHwhrCfcO0!? zuzN9Tk?WOuGQ+9_B1H{zbVdru#DL*S5wc^{L2sLALw6ObcTBm7ceeuh4o22UhesCO z29oOzIf!upOPD@J8~aD|C>E@)t#ZUTOVV-xNi2~FP2#=I*{iLp?>>BVpQdSwtR#|& zSUi@Erdw4T8GLazx7BEieJT|lMG@eDIp62v#26z|y48+^Bk_2gB&k-X-K*zuwY%YNP+rul{l}7B7{{;gC>jH~;v*{1+Vat=u#My%F4F!VxI$ zkiGS(-AB@iM7dmceSdO%Vs-J(>io~^I2`POh#+dbOR18(x$))S{r!j-s?};Au9#F5 zwOMbit}M(&$F}*|X{9tMRkf-kq2jh{Y0HTU)7Aie=eG zqZvuXs=eCV*VYPQcD~oHVB};pUafY9GTiO?#nFL6Sc;TNB>+G!ms3@(C-;00)Ho6Ta%LR_<{GIWRZ` zAnf(}$B!Hw8yl%r>p#2l*37`hmFx|^CqDs1SNzx4UN`wus&vfEfwBq57odBPS5TJb@@XF?zp$4BN` zD^9uk;E9J?t(N0Bxm-@uv`(j!%jSj#2N^(hH(ED3UPlbmc+0ij1TlmdkF;<0b$M@Q zw#6CmUcBI%##B1_FWx%WP^n)6%8r=&fk%9-x-i>Ws~$Xg^58y*;{wn3RqfF3v6WK! zJvI3(HN$w09O$aGIoeRBHCOj^h@1eCxnykr-kA%Oy@=@9P6G#(drTy3+)T;ar02QN zbHO$)>VNUrV_WHGh)cIRkfQQai)C$lXDiDQBg4bIz?aKq48T+>d2MZe`p^qN=&rW5 zG&Aga5rA`9LOIY6`wl`7?VB!;hw?w|uI5Ydk-?MS4|%ux)Iq)5!Rt%@E=NxLmO9#h zFQRv#O(=n%4Z;(Jn2_7MeBwXfoqDcUo~WJvNaycAWuG66iYgl^J9xd@Fxy?RzmikBw^9CzZSd;+ zDdUY1bO8~|jAzFDoF5|;!dgSb6~Zehjl3Ll1Nm~aUu?cNwRwqMKNH`%F{#|nCGsVH zSO8&-WOTj+C z8a&(Rf2?15|ItsrRo(zjP{6S<3@0UB!nzIeK-Ffy)NQt({-rlC=8<;iN$pae(lAF) zq%+^yd$I$$1g|N=;9jqwMe~0Ag;H_U1GiVO6y56Y51iAfOh|1Xq)jZD1c{-|P_b#* zvvRe-Gn*u!%|KVNvo<%3VIvX5JJBT#pOyLLOje{Y9}g^yzG0dz8^-{4*6i=@UEJj@ z!~+0HGZ#v32SM7V7IA8g@MyIYZ8+GxI8HRo1 zZ~m@QZ4M8N^ckqe2gco0DWs7a`e*|i)BV?Y%hBE4Jr(n57zn9sVt`;x*RnAzgvT39 z#2|z)Mwk>@hFdWalkw@27?qbLd)E;6eg0>J#n_Sk!g}9lSRQBA; zCTk=UMvUt%>&qLY<3iSl5Jdq1m<)ZH3S`RbH|RqhW;f+mm|z2dK8~pngDG7@4x642=y^$y{4nL?3qp;Bcwk{`<$4;x(OhC|I7aleo*|OS*-@)Iw5J@uF^gY35_u6pi-s1Ag&bd8flev7}b=-2f zR2&+7=*Y3!N_C}LJ359}<*hZDN)Tf_&s2kDRriJykF9QASL9kTS1@clP}D!Vctg$) z&XQPQm_v$rwN*OUzm{?A^^W`WSAK1{Sg2Gg6h*~iaiv~=cVm8J{8X3-%A6O1VqU-@ z$4Jes+qdsd>^?vdcq*CNDV4tY*MFNk^wKrKO7*r(Y^=wLX;bxUT6!@1VYzNPo$mMh zhG}sa`cHS)Ud`=4u(EV43}k_;8}9XvjJLQBN`*s+RM&Yv$8e+f7Vq3yxPIi&p^y+N zm&+7IPK=G^BVwbqbw`#rlHml_MvHg8@`=aaytDa(D|azj6?r<7Nk<|PUDw;~c07^X zKf70}cFU{lkVNgf*FXOBSB@M%-tBgET`v@i-A?0Azx6GpICRKsJ2?A}%kNveyl3sw zlHHv-HuC3Vk45g)#mdbueBzmpKJl>xpMUnL#|QGoq4=Iosn1b!kS%E~F%Bnsl4WU* z7vI~_-Ak)$*$6`u1i)Y<5^cBIKJX9cChwiQg-CyE>Z86*bXVs-^XV@R4h>Z*71#58 zQ~%Pd@3#l`e!RPsjYr-H!XL4^w%MC&nV=GdAhond3Zb7jTLB&Gk(Syg|irMw*>PJzrmz?@jJ2lxqld{C6 zAmJ;en08~ldo`{p9nbeXKT3F^iNei&|MJ?g-~IW()Ix((oq=YhPHoS*fDU3Qo~oT_ zEC+;XMP_yerp@Ri!7&Bg2}PKu7^~U7UXg!!^TMxtZ|@2l1UFm>#C092t(L6L*?QeJ zgwxJmtX|6W7eY$cb1X#AO%C-ypR`RrNLsA7h%1EB(Sok*rHjo(PCL7g$?SXP*>~u^ zT2z?nw!`{3Om-My*p1+fo&_z3jw;?JXHic1!vGydfR_hB)HX%fHjF z?qhd%_@@FL+OxtpB|O)#n9u`D82z!Du$&RM)qVnx_ei|my!BYA^JoS?7rNy3%EfRt z9Orb2D|_%Ivob;T-FOxQGy&)xmWyDBiKH&lu^FvZ!*+lki2(3G55EC&L=31nYr0m+ zQpXo2vpaZ_wjDbbO~ zv~`R6z$4oUT}p7?K&&fUFb8@`OKC6}0BwXVrreoV*cUZv63OfoF(n<*lR zUTcWq&_lVx3v<~A-zmKx?cSM0w|G}RQMWN|`%SlB3Is^O22RFx;wkOPP~y;JD7+bg zQ1_oTlMiHa>tuJ;4vRz_N2Uc;2W-bJO0q`CfN}LTCI({zg@!WUZyTO4>`~po@k6$3 zM24$N&8f-A=*VcLT1}@@G)ZmqkMg?4ZoZ}~Wp9gZZ*WPPW#@nG>( zr{~^VzA~Cke(U_rHyvRrmSP+)?kaPde#qY_OKNk$n|<*3!DGitr5%Q563L{}?VLV) zu|i~QU8Y?312Q%$m&s5n*t8xXZC{8@95|RtB%0OoAAR?ytAqOy8RA1(HUmjUOEl|S zB;jaQoS_PXL&;=PmgT;z6f&tl`q59`jt@N0x%F|nzn#j+2I$nA>Dq;L{jA*u5i2K$ z(k8BTT|p9x<#waFwU9_BLYx?lMVrkgz=`KhJtP?IrHk)wk=8ybi39A-`CsIw_OI2O z)hicjnldsl*zfm?#Ug=W8yg$@W@m>pgH~BNdF&%cPMqv?JEmb~b9vv?fA`yOoMxuS zX)-Iz>n=y{Y(94Pr^Bpp(Vo=`TP){wd;XT(Lp^taAWxzqhPi5 z(&LYxVi?Z0tyDUF`Pz-wxb(@!=0|Ak7lSjko$5=5debvrdinF&Os3IjK!C+!(bcu( z*ESj_M+bSoyQEhRX&{ym177b{TOWVy=|noGDsn!b|DXL3eh}1awL~JpGMwCPzj1rv zB1#TBTw1Abd1T${0gp~_X`F7}*5?Q9baH6lD+oMnS9amS_qhRT>Bj%&TrYVuSUIMWcN$D5P4g0cC@-SQh8QL1ChhY-G`5Z{Ru|-Pb!` z#iNdyXN;|mCuemX_kBAe{r&Mjynf;Z;?`C7y*CPj5A8M+O~TO#G6bsw`j+;}>k7&4 zfB1n5m#&W9Qmw1UreR$|769$31Ikrm0uM2^#|mG+(M*yo6nK+d}NTZhAvv7*(}kW z4O4FRO?}fTUhro*y?dxv(+$V;yiL-UEgxdg;*m;O9#Id0w9I>?S6@fA<*!BhV7xmN zh||NvPp1YS2Dzjb%B-+a$)g!~d)O)SScu@0AzbBfzDjNHAnR_AX{@e4(W*RBKGP;# z(s6f9jK2BQ@7`E*f$xi;{fW)@QMme@k@U7MutDcReUlfE0D}Y|vqWDLgJvRf2l9@r z9YOe%n^~vF>INF<+&Djmoiob>9Wa*tf_yKBZ``J-oLXs_*N<87wtxqXwdwGY*W(h< zj6+l+D$-J%+>LGTf&xsAc(hO_Xxj1ja4sI9ElW$Nr4bN4hi7)xjVNZsvPkB5BM6op zb5+%j`kS*@2VtQo9#JG7$;?PJ)+R;FvaNL`;&6NBV$ujh{2MeAi5yeGpI>Mo7EzZG&|% zTSTr(;Vmv6#WjZXHAZZc=7@%+0_a25Wg>RqqHyBvoWH!WiqjmhO$Y-(fG`mNrXPj< zSkMtcC&1PR;Iie)DQaJS!e3jzN7NnKM*w$m1U!uPi9jI)lM+Sy8Wyb6KobKeX%2&c zlkA1GcUcXXi-uP4`e~K13Dl$UsMA%*IBQG8y4mEmp|^Hd3c_C8>&T1MUbpKOiiMep z!FvJCRNS1+TEuzKxTHCzgE`0A)WGoWxAH?}g$+W(f*wSa#u-3&{TVBGQFX@lbe3}= zunSD=my+99NzwVVOVUJ-^fv?84T!#EE4UkLzHDhqC;XQvZ!>gmsYvE8VXG?PdqN~O|2{p0_B<=v%>^x|O} zyEhn+rPf0t`6sp3G2bOcY0o2%jE#;evhstU{^S~!t_{v2UnmNa!A~A@grSsr_1djx z4nOqNxSNHHm7E$_DoD+vfkG=ebZuD zVSIcd9*^I;eDR0tbwq@|;4~M9$IkYMUv4fC9J`g8cyP}|v)w`g%4Rdm^NauNhd+a3 z@d;eOaWU<*Owizk1g6RX#U9^tpeOeW`MjoS-EKFV%|Zy}elM1Y(=^@db=Fo_{>9}5 zkwr(g?qsl19b9vb>a2TPfdQcQh#b=)Z^o6*o^X2_G;j068|CUhuU|@j;?u8ffrGPC zg<`Q%sgNX@N~N}zHh%X{{&F=r!Ry=m4ZTiG-Sn!DG&e(D!^B(|02Xf_-E;IUHdHd! z5|&b-!mf$$Zkz?W9X5B655ffe`H`thduO7KuK(TF2?^sQe7GO#(~L|IGkxh`XM3OG zw=OSUzPr3`*VB11j; zxZ8A~!9GP%mcz;!l`_eO1-JHT%{1ZELcZt&iX;p^OOUGV^L?t+>fC57y!+{PDeCZ& zM-8TuKRfxt*Eb<1+XS2b#Ma$MoW|V;PrmN(q-;iTf85a=h*+mhK*tOXb;Vt}n2|Yq z#FwL(eTyuV9X7Xpc~@9DbEtUBurkn^aPLIOu_}8aZ)^Tr>t;=>1!AaoAiAMPVA9`oc$1m9fI4*^P{ISN?bi35omKx^Sw0iTg(!C;y zMU!INX{HVGle-J02}-?pC5p-h!xAo3$gWSRf-6mFL67g%(DpNU29HxKl@(lv5)Z`k@Q!X0@^C0ZkO5B*W6k|Igq1!TTgLNil|+nHWfe(6-(!wYrkT>`i8@P4g0~ znZsib8PPB+ukEud0xn!L>{E``G#j*~Jo`((?7J35kjX?s>9+smZ-4gJ>n)~`=6AMm zjj588IhWn)_76tQ-~7rK^Lu6nibdCTmlv15zfvWprYIKED7B>esgAi@m+L_muU9_x z(nsRSbidzM6lI`Tym#aBe=N0}f$>w_T3AB5=iN5w`1-AvHg6^NK31Q2K-07}?FCCYvL0@XG6N{o&H~-VpXVZS6J_ zKX1n#zJ2DSZrW9-ibS%z}tS{VieVw71e4*fbez{!Qy=QjM^!~Z!mC>QW zsi`Tg*M0Ni`FgQ1URxnD*`LGsOB=s9G?;jG(dtY$H>TCD=*2M7a*#DWIc(=5i+wz2?rhU& z6%`NGw!0oiST5}RD1iY?qOw@0u^)-NejX*464-E)+jy(IFJs+K8IBrK-y}YR0x=G4)m*#kpeZ2jP zh}F5Bdgxx^IXymw(Lxln1)ib9g2<5_-d|VgN4M_&%lcd<8dgH#dPnWbhNW)stu0sY ze?U4luh1jJBD#||l)1jvx7+dk%-vyeYu+KC-{%WZ-7RBXjV8A7VazgS)G+}-9ad@0 zvw-RP%#rD51;JyCx`;y#R1t0nK$7sz(>X*#2x<&=HrQY39i)4$BdzinAF&4> zd3)Dyd|Pv!W(S4iFKl1@WbN+GGf#Xc|73rqIbyFp(Kubfmy10h1b5HVRXMy%3`c#^ z$^?#v+Y31Ct3kY3-?M#%of-H>Hqz_`2ZQdoS6}iv@#@?$kf+VW( zd+5k5u0VqIJWnLp2o((r9G7J|iI30(8$iNPnh`R$ex#pXgB&j}=K8ov=}N#x z;<4=DDAj}j^BtPNaevsyA*Xl*;gi+|O)~E249WEAzK2*0NFKqk`=Xb-i*j2gS%~?X zXR#DTK*EW7VabCTk6Q_)i<&>_Z&$-D)P~{c*uEo!INb|0RqqE#^?_yLB*gIm1|&g5 z1|SSW&7i6sYLfv?os~OmBI|O|z%lrQ$>pLXOEEnX)97HJ%KJOi?lzqY`(2gnO>{|> z@ar5+IH0;!@5pX8pPd*ku0wUB9emChBnBR8Pk-@ycH6F8mALf-#{BWJHRNM(2;K%R zskes!Hp=fJ0S_=MmSL}DAN|vzFD?^4zA`rijHEAih)KLZuMTpi7EGil=KlgHzUbTSq*OslrF@t0>V6WKgUO8^)g4BDinuiqP`-L2I- z&wupU**$xEy`HM7#esoNt@h^^7xbw;QKfbW+JlkA+a3lsH@>=dWpi@R&q5~&B^=6) zI;N@VXB%FNw>;7x2n(W#$(w#NAH;91>n&wN5}A>qkq^tK_>drm#8SEZ$nl55KK#i> z`Sb^K56+J9>F83mrH3iK-P>H+3~|)KLx(@yo0QAt0)Xaj-S}5$?txJHOU6oz37_$$ z@x>b-RaXZ-_R04n1;=TBzh&Pzee2}z-0>3+F*H@KRCu0`Mx)JU({HR)|Q(X0K@}6XWq{CD>?oOM~%U&1%iIJGpG3*XxO5m}MCZLbcn= zuoxAsJ!y*u=tm3TtbAsac%$f49yFho9h?u&j0n&1q$nn zTsUkZ(TBEnd#mfAfS;L}%@^{qSllp-R;!iI=P`olRZD+z`uwFv_v+ajjA_5!)NWQ< zPl}CkyD4)c)$rqUPD<7MLha0EuLfMa!M11AWHdg!%1M8#P>-)HJ%y6qz`+o=(+;uF zp;##UUr z!D)R~y%IJSB%?z3I79nW(Wo?aaP_7C^R1~b>uy|LSlu{xE!f@w$VFjkGN>N!{M^SQ z?~Fd7OS3`9ezX_yV8Y*pb!}Td)-#~4)LMZ`TZ3y&`24^%^@@?Q) zs)t0gN9pmxw8SZ^7>dx0)MN=C5t~AEg$@t9OA!>a$lP@<@#d|I)~fbJdGZOfVIG-qpAtBDiN{W!=Lqj49LaCn9=B<`sD`|vxi1Hat|A?Yl40!3~ z&jjfHJhS`UH?x1x%)a*Kh0^MhH2Uyfv))YjyS(mh|GMs)6K$R_Y*8&64sH_>-F9Zj zCKM9Vx~b3{g+d(eaU`n~S(Xe@wDKzF_;Ly;j2fABkx+rmIvj08$IhX9`r2)l@qHWm z3Y!3Wh+ZM6onfb2VkFw7Q}00UL+SBJgy~ShcMHGCpf@qnwV)I%nt#R z0#eS8(Ja-IfWdY9Of!RRXF%f4rus8u~p};Wk zNFQ%@2q%EF)z`OItFniUPZSD*u)z+#A{{A!K_K61SN=LrDV5MEg!)7WriT;N!nJ@OcVR6`( z>BPV>64o|0RxBnIrh(`A371!rCs))h^ZIMwYB2%77XsVUiAZ4VZm$bQ9ZQU10!fIP z+u7Fop`w_V;;ig~p=jFRqh(c|*lye9Eq?dplOOvOhEO7rXtvq`hR*%nFTyfJxz=N9 zHxNZj?fv#Y|J{#$Kxitt>9YCACH8e`4XQ!`Uv z_|j*`M@IXytSU-2n++`I|NQzl&Ts>>iZx@{!@1Dy0NdHDeztxyoF987x~JOPinX+c zW$!B02FIVc>|cfb56Upe^amlHMMT438kjWNDx>!1CM`nbdtoUO7Q>ZFg<%*m9Lgoq zQ!JB@g>Ia`RCfb3kxT8YyCdQ>6MEp`CkcvFRVAO#*^bxR+5W%I+&IUkenq*HfT6d^ z3{_qG_}ZD-r=M;gd}tkkrNqpQh4s%2F~9ZIUm9YLwpZ=K5 zjOXG5D~umwsdZOgYhYn|V1tp3+MS4>$@0@M*0`lypUxZ#QHcxZ-WeVpOeT`0QkkZy zcDIXs@BF39|4AWE(%e2zxyt84mCese`uD_Ly&8&Ab_05yovrWu@U3oh=i*ZT-Qi~j z0wCY{ku0GVLjmJklCRjE)>%xH}o+}CL>mIPy=l_j-6U3zRRlMy*bkuZP zt&#DO*M9WMN~e8or!^kTCpp=0)rhPzN+qN9i@?VKWd#mHlY90RYjkfxmu(QaMCA82 zHpV+!J=c>=m-O*YRDWmWh0>u%{M+vYKYxv$Iv%h%tkq%XqqQGCuiZ|t0-1<)Ayk#7*Wa|Ys;N_#0nxS7dCQ7; zprab9Yr4Zo85^xg36pcEcFkj9C?!%JXc*-|zzuXJ`mE95-91)64hn-#N<%`+@R(jM z7?^o_|L$Mt0ge|KECvZ2VzNnx3|zLTK^udZgSScN`n^9-RNsH5KEE$__>Uj{Txo0Z zGu@xwBGv}XjnA*%N@g;D_WW1hx>LiuJ1&cVxxuUZzxX~k^FT|M!_c?S*?L7AYiZgRqngc1j}!E8^ID4ee1OeUJF=JC}Y z2S6r66T1XUqa4i0PH+sOyeQ^3J$uKpnZQSw6vmeUU9^@tH>EZ+v!ZKYFn zm_xKXjwxfnSE75`j<+7*)oQa3!$}Yo2_k{JHKg>B7ngmR2m<%o5vG6F3Vr%BpT0k7 z_CEK`>>n|+Z~pwdrRD8|>B4RsyF5(qbLF+rsfYnjC@Yv=QXS+vojxN1lNplYf!%{p z)Y-1&IUJ;L8r!BN+Ru<2`L?jwby`G9THA5QsSIYUZ~OJk=9O%2^JZ%mH@e98y_P+M zn-uArbU;$NL$*l-V=m!hdK1S-b%&%Z8SBR>F(MF~U853&wd|oDmw>M2$u4HwxT9K7 zwdk4hL)=Wr?+FsGabJS5h++4iM??wr&x)h(SMQte9A?$7qxv@i2<> zDt)5l5jOAe)pmEKq~)SR1A7OVzB*WKOtT|^vC005VLNSHSHsUc)N>3m9fsIRo#Kfc z%S5Q+?7!Rh(JM}X$!+8qh#hS9^sQc1%_XSpu5HF@SlWJzijgh_J1PKW-=g%L1EFXn z60KC$O}m-qyukP6pce`6qlD3VB;!LF^I0}f2NY~V50rSwO~i*YqlH*XNTQBX)f+hN zMLWEkz!?`%RZ|~o>GSQ<$it5f=kuZ{w%Tpvx<7sM)f+$hG>WCg6-9f^E;J8M-C&Lgcx}naAdE&m*%B~0APFaxjlC(dNAmC2luvA5*em+m!&70c z4c0OPFVA{ofdG2+rp;3ZF?r_QbNL81F*(_6Gzo%CB;ws}x8LvY-Mi=L{@HsA3u<_V z^E`nMH|B2bIr#9N>6yMP7YcdHarAck`2hf;M}pt~*MAUmJ?-lE!%`_MrBHaP-`x4w^DmGz z-|zQxxtyx1A8w{X2+4{vx486guihQYjOJXDvumXS8#dq+W~|&;KJ?<}UwHN<$5C$8 zuMysKCjan_Q2vfT9y8QWfc|k7kE>$1Lj$4n5?04>^Q57z8zJbW9&JgGkLP-lNCe{MgLQ^mcm-S|uJ) zNkH!K5Q0#hwKSw+kRve)&=61!WBu%duCy`vl^>(z@7Gp)>BJQz9c|S1%iGl_PW^e1 zMC(hq7#i_6k9qKw%!J#NiL7qc^=S zWKNQS{)y7Oz%-p$c$pl`xT$t7S1p+XOms1tTdvkKYIh6|B9Sp76_%Wx3>n8I&eRc2 z0!A%)LE!re?W)joa_!|5E7hSlO!nPuq8Z>Wz_!#j?&QNp)Abs!^e_(5TSk8u+wn2X zwE%0A9F@L6MBJ{$8TPeGH34U?2-8+;`+l9-eeRptKW=7!{>EF?<$GfzIfjU>=h9=) zxI+0SE3v8W_@*~NDqNFH)>$s8T7!d3A83LHA}Hk2ZJIy(HXg7Z7NUR}v9G%LCLQE-535zmT;Dl0krN~0 zUEQCByEE~VNpXAyt6VgGpn7iB-g~g0OTx%j{&`wDxwH3yKjJ;F+=2lDlnv^4vF3&v zPt}>pyn8$n=GL&eNzG0J9$@AG%ddC}p~xQSXV`=|ysy((FIQUvf0CiX^60uAsbL-~qciws@aO`j1TS)JIU@#{1 z0=!9pR;OcXy48aR2>;0A4?~1xSK02uCNT~92uXz)oEK=dX>n6vc6efJt^12||2pnEk}^Wl=`gvh5Vs?A*jn+H zH}2#|ve|UD-R|hRQ7je>!>ClNyQimC<}OVCjfxybjq}BtuNo6pa1>k z)^x~!x^-iXiOwN*&*J457(4OVuiAw%nGXL%#ut9_-M{&b&&PAco$c*VC?rYJd+(ol z_piRWp{UENYr95vwMdhou^tn*B<914Uy^rG0Aa3h&m=Va=VslfsG>oOf%D zL0kQ$-~QhvUKFF;1AAw?&GtG(YwP_Nk3BLxHq!6)3x&dm12VGNY!C$HaygsHoWF9h z-&+VXMxwqGr9$`aTp3RJV7ota^3jjK^g=`mXJR=B`132*T(AGCG|SY>zm6JuK6M$( z9@)9@BCh>)MV&J@hnS`p0wV3PI(+ZyLT;L4-@84P(9h!RP;g4;s-ZdAl?emb2 z8K#9PmMo<)Z+Q5e8tSMbX$K{&zpJ$vRyS;?>jM;a?Th;#eEqTCON{N2zwzIFMHL3a z(6_OGirKnFpg>GUNoBY047s>VIgp7~NuopZEgWlMP@!ppkakvovh&VgG8(na3IaID zW5CA(o7L;U3>&$SHndBzrtGljjYVl;VtkBz=JQ`W{MB#u)2;1>d2bHeS^=FZjx)H( zL;^pr-*f5A+`t|^5*0~A(8M4OSs{TUbW?~xwe!;U(o5~vr*Vzrb51N94iy61fNBrd z+D$9Cr;q-^-nR^?Cpx#nhIX&A^vT>V=lNrQ?QvZriG0KYMaLwY87}1GlG|Qy)Q56~ zN{ebRsYsAy{ZvXR+_p~7x5KN^Yx&sVK#&j}p0F;H7PxGjTB{O##Ib=C2weJutf8E2|wVjk5n`NYH35LTGdpXaikciQ&+h$#hWpJ8f+JS`;?5Jsv zv)m5LaVpLX<&=1&<2WT%Y1rQG-qJ3o1)^g&jJqXV2+QmQ=E#&rc>!-&Rom}bc3R#f zYdd8n==y%Hd0TUWPk-jK=zeB)pZjL^51ZLH-hNBIxv_s>d?OmP!wC-TDtr9nm1e%P zz2(wC4Un&E0A?+u3?yhP#0D0DAsR<2$=itFfb7#Dh7lcNTPL>kiu;&WlNY!gbSp7g=~ z@!X+_f>7J+;At zDVM)1WfRy4LnSC@jdgZZpr_0R9{2$&ngHXh1s9UIM>l)QdaW0ahxSfNVaMO{3OJmZ z44tsC{(}77c>C^tCwgn_!S80qqJ$vi5?6rUZEs^3KoA4{)1a{e0f*t4lxa-b_|1HQ z^cD~5fTFY%DnQju@_W>+J4R&)2J!pS}LtHelafZiL6DgNS77feDAq zyR=m;(n$ixNWI@<(k$!*s1)*sXYzwhv{Bl*p(BGgvZ5O+hoTLloF@2oJ+`wmpG`{$ zp-d*DX3iyPU$iRP z?WG0WH!zHt-nGm0sKtiH#HqRimi&m`RXx53y1kqi<;20JNH)B6ukJ^L5uDa5&Y}>` z%A3yF58jyDTE7|@|Ekm2OM9>5LxWW%-RPiPp*}S!+uP+@jkY71ox2Zw?2}^?)0>-{ zVpvM0a~ZL?bf@&_*zlp*8Ch0xxop4RZ?#&POa_Cn*Xzb&F$~8r6le_@wC5If=AV1w z6Dc9OwozhY$*+9=i=OXoZEmt5?)dD1z47R`wzif4`+Kd6Tq^laba+>J@zZ|qO@$jd z@tj{**4>i9dH^vrTT~oez4PAM_G-X#&p!Gn0Nzk`yrWc%?YRU@Dz*{hn7!juE5PyP zP2brG9L#YV6E)efeB=Yxw6;d3zxnKMlM@5rN8eVie8BD+_W>?Ao@lo$*meXu5YxjB zH?H>w+#p2MJ=$_T+w?bV*9aNzu)6kG>9y(LEY+*#TNC}!Cqnub10pt-b^yTGZuJQZyU;t9H>h2f5zyFytb+v!vCR&}xYU{qPhB#r59k^gKZfGLP))Sl}Q2`qb zQ(TxKahA-`ekqo$d-}=s)BmLUz7Qt-h$zv536R;=SWjUvwX1pW8t^?m1oXAN@>yGM zmpa?~3+zYsJ@()6lZ#fL^Z*21631PfXAF*V`5+%@1Gnd;JwMiUJRBdH?Q+csL6cSF zg?NAD9j+5o)TxRxJXFjMXUtyHz>G2<*U91%;ii3zV3cJ#TqVZ=$es&gizY$Y9v1}L zc=#O@h^@1qUijWofxiCoZ~kDRN%lH!RGP+Wlcc$ni?RUwlvicbP-(_O~>k42Vhk^gIL&*@c9 za?v0(8;A*o0rQ>tRJTk71qB0bYh@6DWeOW>xxVLAKuAWBN8IIFXra*)Klho>1%ZEm zp4olwo7q2PX8-N&)7XuQOOtxtG6JA9ji0*{fS#8^_C z?1!a-7cfM>E&vILF~Be|6i_<~*TSic<1n3yjDR>YF*Y?EGhLs+(`4#Xo!mnucri~M zd3Ey14S~5wVri3{$>-)M&H_G0g&@h{-4cn^2;R>EYdJiDaoJ(!b_B=AP_ZFVRbe)n zf+DG{1C;f9n1JRFJ+Li<(#C0;_e_c62*PJb5pc(xIxmd&v#u&>H8#B;^e~c*6Ol!T z?c*}XhYGpmR-N%8ZoC)Hm|20FnB_lS6;n2KQNRhL(;r7yQgw}Djj|NrQf;H zseQ!N3L|6Ly~o~p^ZlbA`@FI1z)Y&Zr}DhWC7`bY$mr$YWI1!s_(HPZ@VuKBKG;I_pT-Q zO@G(!@*9&= zyG21beevpn@jXQ;W`szbQuruEQ_+Vw?=I&db)*m>^*k?`N^u+q0BHC6->n)ipx#rt(1oFyq~iQOx3l50Q!o9K2TmM$@S(?O zka_j(@6mCbh2<&2d6+JouFI)nW^y2zEevGSnM-Fb!rFY+X9SPiR~XVMrlA4^6*@2+ zPnqef0jh^xoDW=782v9V|G%(Pk7icq>)-mD(9A9nB1pnZ`W{6{W=t~k1ui7LpxDRI zMj|AVxkIFs4wL-`9i;Wf^E;;x%5PG^-G=U-j7)y^z?a7P$p{-Ru_lejvlJJhB`5?v zZnF}o4UN*tWC_MASn(Cht=zps)hkHpP!u^R(1*+>AoL{Onql7SWMMBqt>;EEVJ<16 zlo$#k@$JNZ$_GzbXTM@!-4zc>*#UuPFc#-bqkt)_D72w)*5)?@7*omzdorVwVKe^x z)XR@Q@cT=VhwlWvjWtJfVo&+pNFg8X(oToamQMKC@NJDEY=}_TtFFJvPT0Yzt z(qqnag>@s=PC_B`gN4~gAF$hAO-#&*d4Zc863vB zncfD~c(8o_OIvRa5wh@4e*a&2VSTL(2c}XI_8d`n2eKCj2R~{$FHvK?$#^xbGr{&@ zb1O|Vry~=%5yVX&*W~@%^%0MS&rf^}-~y41kiDEK?KKH;FxnW#%Zm4LYY^_8-k?LS zG=0aEU5v_c9Fd3&uUA6mwBzQ-U z)_^;2`?a8xrNL|1WOz+^E+XMsV$y2`?vm-LyryO_a+^=B0qNO5u5eDz!bwAHwLlw1 zJx%@0XFhv>p4ol={}YH1`v3Vue0bUa$Upt+xxe`4P<}+_pvh7e!Nsk{uvVkh@HWOq zb-c%h4PO}}kQeeWQ{%80fq4XmBOEs=1OOog7$gIWEUYpb^j9Q37WE4VcmTutB;oiF z_X9E$-0WOK?Jh@SeI?*15MhCWFv|@>G{kT*=CA~yeCX8#l7m4sFdPiiF#>n^fbb;| z6r#~PTPsRc^<5D70Ac{cK>z@b0}KN=0XPhhKnSRW#hL`tSWhz`=z%OBgdqqcJRAyW z1NyA#1pcxN`i##4BnmDv2-hKG5F~LdP5Qo%U@RnMb79NzTOGrKpidH}y(zkUml1Is z+OC!|iCy{RZOrTHJ%D`RXrRAJ+I9)!$(L2t(kBgw&urMow^N+Vnth-KpCdMjBhv}FZ{ zq=J!nU^9U513a+1MJin9yozIRNUc|DVU^f5F$Mv#-KzTe;hJXjS#dF zB8Z^PVQByU7qI%f>2eJtrbIDp+s;pZ@=7vKi>w#%84N|rRIy%LA4y`f z2aY$J&GHA=!j!284i!*gp6>w4^@#wpJV3)hlN=Wy--7|=x$Wf0%D@=I(ca1`>U4;( zWJ4D~!1=BRD4ZfpmJtGXLRVR2GMHd81H5Ng{&vgPp_PtkeHSPm1USM{v4|uMsE8vG znxoCY^~0FxL${C1z*l{%2XqE_2@HlUnyFJh(i^}H0EQD37PH&5AIKyt1u9KA+d|l8 z@)$wJea)ew0rU(Q1}I3_oxER9VHO}U5O7T3nJ7R$;z?lpsOiy$i7GfLXew((17A%5 z0*Xb8q&u_~cAOy)DLRCK zTvDr`03`YJ=xEsLR;n1>BoZ{BL<}vvdf>)AuLGPQ6yPkx9NJ7fy}+k>pf%X*&^FEU zRC{FnM&AO43HV47DN)>O@-Y?1rc7-haBP975t?Q9)3y(>^d_E^%sz4*%fzF-RtQ03 zdgPK^mM}UXS;`hhbd}`cT8wjLYM0!xlF}+^*|u#%2LeO%d6H$qB*Re*iz=KOwL-k< znwC$7aJ&jB(&9s0e}D?01yBlz94`A2oORbfXIUZ1ON{pfdPO6I{-caJ^-E%5C%YiVGuAl zzypW?@B#=i1R=ly@BnZSfB*n5@Lb1-5RwE20U!{E2_S(01c5^!%L9Z5=l}vA1b6@lQ550Y4uRtUAPgV?U;q$=06@Y)J{bTCVgbNOit=$}SQbEtCMn=p zkfdyY5rK;V;N!T3Ad5lMFc3mGjw6J8-{)A4B5A{SaUVep`4D1(?*j+{006QCLtxNH zL4a%@1h|g^Kp@}&5I~G}T*vnV-}gU^k$m3=0N^+t1i^=25d;B25Mi41{J_LXBJe2) zJd$t_M*A2>Aj{F9<8v(6HB1l$7>4=24#0e}QXwx(Tgg!jZ|2!9lVHk#ap7-Ga5kepKsSyN0)0E@5p6B_#4U^DN6U z6lK}AX<0aqfA}VZ5W_HvBsm<{5CB2IBHzSm#}60`c&_aSCg0d-oC)N45U}{CCdjVHh9-2?-1t zFeH*df*LJLU11T*XH01ol~ifzR(CGkyI^CvaO2jMV#*XLN5v#y1x@53533+DfINla zH3KBWJYbktcb{_?=UysBa^v;>{ogy@`hHeDJu^L1J$-)tJw4s0ZN?O1T#;nlFw+Iu zv@I3O&nLrBw#5}ABAYQrilkynNn&ZvCF4>_t}-?W&hi{gD3-N_!ASpmrA*7Vt&Ct& z5xFEMMmE`uxKM(aU`&vZ#4JTNmoiT=;tpa&L`o`?8;Y19X_JtOIi^n4BvX;H73DKQ%;d~L zjBKVP5tH0xf-xn?kueO#q%D;roh~w%;+&*ylCTsrq$w1oxyUfaY?Y@3^;exw3>|GvcYtK9OgUBqTisSGiPR3wBcEoNB`!3{2m8A_4C?6eSBX&I*EToBLW+~6c7S%$O~ zQz=qHF$d!$$RUKqMR8$aX=$la`ZobUG6Mhr0D${3a_6fcBLe)hcEK1^O6mKU=?OhY zKehX;J^-+10!IY^?uB*%xw~;94*>uG0OSZArJ^GFE2MYH-|zYtU~~RzYqhf03erTv)Qe!Etks` zi^Y0-du`k9>FGIg0De~tg5OiC@Apz{kCoQ_xG2SlrYBn`}+$E z3$YFX0RBR71pq)!i$D=UvZ_E>LkZy*pjckWzYU!QH;O-)UKK%lm^mUBKaF~Jxc z92`7z=8W6zzIN@}xpU{Fl%1WOXV0FkuCB&v1OPxX0{{R3fIlYZ&NI_VQ4h{^_sl&B za(9j%oc+G<-Lr%}uhb9q#O|CuuiW$cyO#j)A8QeM%iP@prIfa9-@T#AyXYGs=xtk1 zU>!m(RPy_l@q5efo_hY^N`7yxzHjxu`&kV?5ahC4JZ83MoXoo)(m#gW)N}OxWcIx4 z|Ne>CEC2xhtV(`wVta6z{iAjG-q+uE9|7=J!E>q^6Hz9UVT>h{$@TSh-Lx2Ep-@QA zXN>8IP$-m2r8ws+D=YfIfPNPdrPFCWkw_%6*{ojp_V)J7%uFa0(sL4t#N6CmJRY|! zYiVhTF_z6{mzS3rV~Ip!c6K%%j}wu;bs!P#?Cgw;j0_GA-nny!Fgg?fzym9JI-O>W z1%p9-Z&o6T#bTSAo4SnanHw7$^YinTW$6i}R3s9K$K$&4>mn?r)Dzm$($f6=d@L5z zPXz*jU@*uSTU}k%JA#FUh1Jzn{n7gVuq!JoyE}q~g@u8Ef${Ni)NsgUqNSxJcY0S_ zTU#wHE%o*Fy}i8?6BC?skH<4IGII6m)wQ*?!-o%l^wCFNuXlTUyQ8Bcl}g>deY>-> zGZ+j$^2j5XE?t_Km^gj<^sm4E+S1bU+H0?MbaXJr%F4=!C=?0}3=I76!w)A;oG30X z{_@K&$HvC0tE+$f@yA=YZe_FC;o;%2v9Xn1>oZ$v7|)K`($;OU=vHK{)|MhPtxJl` zV2z?|Rm)TAQCa#+NceQ*uw*v7ZJIT%)(-^`*OL-#f$hyj~?Oi zCsTGHkd_<=7l9D`<7jo;$7lOMHU&2`gQ9SDL{D@(CN4d_ol0Gq<=~54U$nHeG&Kok zVlCcn*J2%W`Fws|T^*H5?e6YYbJ+b>zmNp_BMo_>GFIwpw!5CN*=+0R3BQ1VtH74N z3TqaNrKWG!(%5Km`Lb4li%2LmM|TGL`dXt-MK>9 z`qX-?4bb-n+aPq|FG~c)$EpH)=FI5mXk2UH(9lrV!A`(AjT>$NANE_lh&Eo*?#2u- zeQ+?i{9at#=JxisJG?_nH77JQ)UYU5qPuKxqK(BufFskAzd5r@gH`>g!}O%2rl9Vz zF@GGcGrU|yMFoH#$ObYO78Vc)1Rjs~tQi6$>ZQ`M>YsdkoSi>}{E;A$rky@@s&Nnk znPBE8@YypPJv}|08T-G`M?gcu*;z7sMi&aLfBEui;?ls{I1^+`iFb-*;$#jxnu$$F zKoC98X5aAl9~&82lITDHOsuM^k{6y9V`J{$r`FfoC#@8Fo2V=Km7afC+t7eY zULC0qU;ZBpb~Tv`fdU#ruVpY(pF?6h}w zP6`AZTfiqWjNO$hR|dn1E#KLuAc@(*^NWix`!pZ7RtDoH8lAZ|)`YQ>B(rQ6MGa_l zKtKhNc%JNGv^9%|msgJp1eAo5=n>ynf#G3c18Z9g1ax#{B;ZwdclRRKd8r5ugF>$x zJ?-o3(=iXk%;tUX0P>WS`PufH0#y~24!h7uQ{6&coxe1R1gkzGL5!MOqtAcsZvl-SnrSpUC>%tU8T`z6VL|@FJ8<8c0Z7R zYDh^=PEOH$d&dG`XK(&#KD~y7lh-pRSC*IefPx@%5M{meyWGhPnHWUcuFOLy6l!a0 zzoOBG1p;wPoS{ZuEZ>ahc1}Z{r~^62P#hHN6mqwA#$!PL;T#yw&$z_H2*eo-QGKju z8-E~|`k8**#F+Bpkw=6J)zbsCo(8ao+Fxa4Wo21Ur85Bf$mFctXPz~@g)~X)qV8RD z0zOxnJ&-fo9<)9@JPfjOem(?v09e|;SV1De^!0^+Co}s=F0_&*5{X10Zr-|eo|4!a zSRIbrUt@yeQs^KLi-?G@(}x=y0}pxG>3anQJ)eX>vxy^DSAUeu1yuf6+uVHHZ4V$9 z)DPSyM~B1V0A7Sbq1-~))Wk$&RFpKWgF>OmAJZ56NicvvW(-L+-7&YdwUth{6#uOF z{<vJhLX2kat4UXM?^cH!Y2+y=s;U=- zmp@A|aJH%t5UC-T>PTZ-C6VJ+%1%lT)=ogCQ$v>t6Cz;%2-e)Qj7{GYY|U;6PEyYRiU^)|nChTBUB QM_OL{!PEJb!-=(HbXb-pe8Vh_|afP^vNfTusouL~@p|M|D~H%c%W z;(yNs{Qo`@#)ujJKigz@>HlZ+|Bpl9zOenzwf)~~5oTcx`Tt(-{|@=}Mpf(Rf2>QI z+v$C`WSQ%8R7T9};pXAdrdNG$i6MRo>^nU_pR$0=Slxu;8gP4@EY_Qk3H+LrDY}|f zRbad+4V+x^|SlF^StwRUKbS=b*0%c@Ny8>*T*Nv|8B`Ac)KOu?e6Y;gEUf1 zz|2BAG2juJ+tk?T|8i{DeNsR6db;sCaeTY(x#2$?Pnv4}FrLoF-2HrYJtY`;*19in zw`dA%x=2bQMCEV1-Ze9~Y{L9&3_galyKwU(B`HQ3tr`%4d^>2wL-`1<1x`N2L}f#IyxH) zbY;c&YG*`>!ez-kRU1qRSh5g!xBa|pg?-|8zh+{P-3gCTM1627$zj3=64_ zL6@0>jZG9|V7=3KivM0O%$PNO9L%WOWWUnnak~8Sbg!tW`1JA$Z0h^p&Pm1*JuFQH zc#Ke{^8MQkxyI&XXOD@G_jGrkLqD3=b+os!X}kF&dw;g3EBLb{H$VsDN8syzpoB6z zL2R{tdsAzxw~5JC7@@;rm;ckwjv4>u!&G3v)7>cq0x46A$}g>`ZYytY_I%Z&jk<#7 zz9t)|Av1S4?N4S0bQ><*`UGf$HLLY_`1pv>!kJrlK0(>fJMY(BTAy2|{LfyW&LuH+ zbT=Mx`dLCnjHhz=`KIDyVt(}h4JYwAkQ97OAVb8&39q=IqV|Mn&_-+>fL zTxasdQ)G$^rqA!8?ELKP?0kIBw>5$M2~sD^jbj!Nc{#Z(eL?9&fm}y7H?_pVprCg- z`;M)*v(2n<8K#9#nQ+9%Kz4|M2W*_17~5lOf|Wtv1@G8skk&Ob`w4UVDRt zid4v@ujVujtLAJFgR}IFB_)SPlBoBaWtC?cn^)^?7pfnFVq#;{iw`~8<)LsOzsqPt zzWprM9Pd5+66i=hLzwaP2ar&n(qfx?#hOF+S=+Hf_P6(-|NJP9m=^>(@3@|P*v}0- zZCp58ZafC-Iz$d{FWEII(fA#y=9ZJ%6{%c4y@0;w<>k43Lj|Q}XX|%(UFM5NAMJzp zAC{Ju=xaKzs@u6*#(2>vu_p7c`XKU?ABZbgIIjSVQ zusKmuIN_+lt(t&a`uJfs!*YYb&k0Ic??Eh_oM1UB=B|HRyk{*1dQ1!b**+Mp&f5~H zV;uba{vM%aYIImgbKBIQp3CjwbHJGZ2c1QyAc>bvOqQaMDM~cgZudC#IV?)WVbYUQ zo;8ia>6pKI&%DZ@Z}AZIH@CkKS$gZG~88gc;*S<(~`YKc;6nmK7g=1A&I$qEi>5^0mO? z%2>frbD9Q0T((HbmGf&kI z%Rlgo|BY+t=L`T{K=)g^Wlq_B`)ZTDuK&n0UGvJz5TWC$?|Em5LbeGW6&}j`@w0z? z<2vNoQ^FBo>A)%pNy*&6SML(&!?Y;+#N_1N{e5Qf!^?T#+h%VFEG#VGIe;1arUGOZ zLi)V9=DDHYXp=${bsMk&_;C-h=W6e@9}Aw}MK8jB`_$Veg5YAa=siW?i<2cxiu0p#$x zIl%4yH)xsbe|K{T4d@R1+ZPG~LD`AXh9Oe|x>Xwcwg#O(x3OI7EjDxIKDM=1>;y=m z8JU^9-@a7?*Z_-wR%y_=3_zu#;uLebA_#;fet33f0I`s#!3riN09bNEQhlz|_kQpC zp{$G+a9&PM`2TQA%hR)Yc$>$0YhX9k(BQnM%X|#%JcSIcmGR8d1hLh?G{7~l$UHIr_WUBKMV&d&6- zQs*EGsOQw9MjKLGQ*$2A(?jUkarrypizPDv-?~TP56WwSZ!g_1r;cx%{120!U9Ouw zL61}Sm5(Ee0WJWO`lW4={v^+wn7p?jBqV$q)$D>1Tz{Jqw`kNkJuJz^5x-olGrfKN zo-PLu5=x}#XW`7OYHq$C7JR(~*abM`SiXx1z$L@itJE-KyCp#GfEfX>GwLi)q1RN9 zlbhvLo_qq>#vj1!dFVC&XLIfKI@4hQczHL@>$`R!xi2SvCa*4E#_EmnE<|C4F>aoo zZ%PCQSx$g6r^^j(UzV05fqI;?wz&>n`NJ1L4mS&8l1CD@v(Iug$q8D_p<<; zT8+Elt`9bshrXu40;Hx%my+?ukvoNshBhhqgAgBIx&%67)zEeH-&{ES0|eC6uFG|h zfS=B-~D91hD{Le9NAM&`TGo0K$mt z2sQio&*4pP2m+-v3@D4owOEN}d~&j@+sI$^zjM4z@m-Inc0cd>l-1SM0ZdSFvHg;I z`ITTQX1fJ&)_Z`yjt&pY?h%Oa@PO+X2Kex;2Ns<>d(!ZE3pYi^9B@g1DNJN#qXGND z$NvcT7hp|a0CmH|!j543C*Lq3fMkLkGpCMWiO0sre?bJ8nW=rP3z#c_UQAyeZzbbN z{7>qJaTv6wS5}_>vpZmCI2v)=^(5~?jbY%rKhi)01i4;!J@gV2h7>OrESIgCk3f+1h-on7uFr+CebSgu(`7j#$q|TOqfv3LeWiSkNNPawX{pXslK-Xqb>WQw z5AWaWeYa!tN-m(lg2~{7|Lt*gdjp=D(|H8wxc8v(@o_$YjR48@`X!#P9ss7XdQM)wCs;b;!1T7g`}gPSUZYa$awkc#S{t&L<9k--_`?6*5Kt;o6eim9w+n`E zr;dT`2Ce1gcwuWEEB2XOjt0#R#LsGP?>9+TeqNp!6RdB{2fPOUdbqniC*|A<>7;&p z{%!^k*mUkQ>+37>$vF|sA$ohv6uJvf_fEn3$Jb3s!aOCbi3|?G$C>!H_I78Y1^3R^ zrkfM>TkmVHoD!PR`pQQoNznI4U%avU$H&J>fR`S=as$8t{F2F>d=?BuBRmg}?CbRX z`yKw2=M7C$Zb0V!7sxys=9QHl-eXthjywj;FU&)#{$rM-xm%xKf?V7MJpZWxe>lJy zDEnDZ`t<-8_|LDl<9Gpavf<|G>A2ir4X_hHel(!X6Lm{T5zu#8rq-REktBP2`|a&* z(DzKot_L89=ss;)*}C+4`6@<(_1K5ob@6&1Myj;`M4#?C2FPsy_xbtxX`<$N6`#9; z&+)HWiO@*-eQqxP_H(VdK?Ps81=oT3bTS(2j_EGH949-dnVOxQ1p>miIRJJNBuUaU zGuwgCjWpn&aYnJ=%b}v+!%kA9*ne@+!TC9`p2ORh|28+tg2^1aU+&)H>XAvS@Yk6P zB6$&zA54j14T|JVuddo?WcLMSnh-;mQ?g7>16)^WCJ5rxDVX@EqwD45npO(NZ z_-hiq6gb9=6+coeV80>{ohD6+;s_I7qG0AxEaHOs6&IA7E<8Q_(q_n%`VIs{NPsR_ z`%lbNzU$ryT(NI%Y-*bKHJU&tf&iK`@UbLt8GsQ#m>f~W$7^HlCKBpAnl`t?KiRyV z5}y-*$ol0({ag}yvt-KR&6k7DL-v3$`|vKMmSJUm{q;%b#80SqXlTeMDGv0xa{!;NU>E<{l2+rEslntx@GN}1cyY}vy@Z~7N= z?Klbf!ZB`AodM}>09f?}pAe8<`1M9TTheCO<>%dLn9~2(3s5d+E!$}N3->2Wn9+kr zu){wo{?lByx3?qpdWt=&2mmc^Alg~N3%}U|N2XFl=F?!k2+DtC7$d;PKRiCp%w6ot zIX!{<&%FLOp>a?U#1HyEnG7Q{`2P|uZ);MC4M0BOzu>5Jiur*zHZCq8?ZY>0@iNWZ zzv2ZmZr}I?<#|D5>2mYFPNIRt0uub7u2$P_X2GR-j9$6yJ09ey1KLlN68zcGxyM(U z=3m7VzG7v6bM;ALu16Pd7k```DAQT?RoRGw)`TO--}DVv-SBm%bxB?(swHUSy&kTEYRV=^>2 zASs^(#pIEb_Ec7}J@~^mZ_F%;SG|E8eS=4617Xt~2 zMvxtek^-|bQ_AH6`=nAO5H}e^qe94U44@d6G0XF21vtlPOO?4IN z*%DFIjcMKRB8BvXCq9xEORP3{X(hiat&>#?DLw{K#C3}w|4qMf-&%F1zbo?-htCN{ z9`jB0ZOAIkrq#?gwOR}0&_Q1K95DS9LEzqXj;nT6??d#*%9#a6Ar z;1~89ojqjR0ViSQ;n?MlEflWb+0V^{iuZ+gW{T;32zfU1X(x2@4i|tEfj35*tiLOl zbj4ZuLbuZL7*TWCI-_}VxCHt$ts<`IDH{S^&(@D7C`R|??>Zc{PNBC+m*`KT#tx)k za?5wL-nfa*maibGAaRr_9g8$?9b%&$SIj^f{>U`SiqEbw1E1E#Q!^mH=S+lMDYCdH z?ACmAN8pU_PS0#cC#yCXo2sI4cgt3W>?T+>)ahT$O=75KJ*UthVt*or<%j5duV#M}8$6Wv9oz>Kr3G*n1)X^fYb-(L@ zW6x8b351BDv&lVc6;!ZUU<(gy^7hfr+zt3Gjn{2qaNnWB%Cs}_vB{;CL0CDF!kjfd zvhE}3H(SZNwUAA>RN85AAoP8-VC#bm47E(rpMik^fAkm0FIxfz)i-Jy9QCV16$_DZ z=}>$>|IB;p2mi?AHRCK2wITeWbur$6(@w;SEE5)I3`<|{E-Tfzqrx;yUe|Ti6ss1< z!#k}P zZ}Ic^S5!Mu!G(4*21YQ&pHRLULB*`xjb>-zDBJVw^l~wio+Brdn2y*$;bZ4IfJ+lY88Gu3zw zs?H&^LNF+o<5b1)uFqO7^T&q5ip|m&5!&&B!2#a#Uh(LJMps`f6VB*7I13Wf><)~* z!AQk%vXY<%vI?aL`%^})=RWQ^#uO7gT?vL<6BHj_Rx=M$;m}Z<4ki0Y>O|Em2{-Qt zRoQM*L6J!lB9)#K_{b<^cNe&p@}k+frJEV~R6#B-a*C2R+O5x-1@rTA2{_R_;n__h z#eN1Ks}?`1ClR9l(b|1D%f2sw8BOoAsSbDjhS>G~pKE3I&ky6;rl|VIRdv?;!g&mf zRsoe7uB;W-d#kJn<#M;5jdi~4b9=(kApSZnWheyMmcqPK(lDe|_Kr#JOn36Z!==X{k7;jN)#_W# zBMh2vG3!fPOU&0D%=#0?xOehPG#My{_64(LgZ@n8d%s2|QrB+~R!iid9e}JAye(6F zc>+ZGf4u)+wzqjBz_(1z3*R-;}R=|n1O z>h`v_b?^P`>T0H7vhq1Pc_`R?4M=K)8P8IiQ%lzikk8Fm=_0_x1NqG}CvJhKrKz~M zIEez~66n(0-0gMl+cUD^zdj%;(ql?pIPTobumyntt+flNqfj86^2tt-q5KqCsn>cH zgh0~c?6*A>d%qF*=6}D&C5Xufmz(}F!T|RTv{|HikH1?v|HsZk6|GNoewUpkHD%oF z`xN=SBeIDuQ(eX;-EQ-r6xhL*Go|Hkl{w#I-wZPCD}UW9wF);7+k^k?HRxO!9G zz`8aCSD3L+>&+)`<)f(zH^qFW-B+{r!tLzkOgL4NEDcO!u)(f<>Tt;#R}& z>dI+HOkO4;n4bAtXIzp@l)AOjXP;Gu!!Pkvip03KCu%8LP29oG0^Lko!JJbtGgHP;^Pp`w&d4S7`R?*XEvg2l_anHMPF0Md1FKpswV1mUp!dlCn>WZsfb?{ZB zo>I(wI6qZsax_EyEm30R`4A_Xtt8+Ef64H4SMfL27dK{io2i-8cSoCrcG*cAUWtX1 z2knP!)Lm5eC)+YUT1$#6KEjz;YH3t&r^D!m9PU{LtsE7fnUOdooqd9wdg9?TW*eV; z*HR+an1+T-enrmT%sZ4N_pBj9>*@8q5;FIEC>C1B`V@ye6pZPooT=ap@Y$?mUv`Qqo4^idrf=+))eaiL^pdclb@$Eq zwlcXNKQmmHG^ph@C}QT;gdu1>L55XC=AC&-S?oFDHQUksO(o<)BV?)t@UX8ug;BWM-yVbJESkGS&qt_ve0qv6}*f@9lZF`#Wx z`txT>7mm%fo7CtI+sa;5B>OS_@>M@0Hw?Gdo(M@?-zlD9a(k(2a z{3M}tBWUP%Nt!eA74ANH#Yr|8FT1{8wX!GWk}`E81Yj zRGFI2I~zMUv)KywarlzhE8b)!7xDT1=TuYb@TXN?rLS7O2ow*lsfL&~AMo4oV<$S@ zZw3<9+J)|(+U>2IO)k1e<;qh*rm&*&(4M^I*-SjU00!UYf9FKKozA< zrT<2PI%NW9?(*|83%$i7W*2SEu>N+(^yo}_ZScX?p-5(PayuQ_OYK=4=xV+?7k zW)_oXO@=@%ohdmLxNfVVPoKrf;Q6`eODJEoHH~nrRWXHn_ntOnLHSp*-{dc(rTlia zoXMT}0nP9gSP1Op-<``&YHCChWI|L>^L7SAQSFC2J&Eb4OG9Z`OBQOE)k#}Nf% zZMAZaTfAab+13nvTREPT_Ibq3I_XBzQagH?8crRPV0Vx8u)i1NOo(+|C^~)YU@_Ra zzB#lTI%pVavMol#Jv>gLJl1F*49tggoB0wAu!h!M=RnRpBAq?Bn*2yv*B@F@| z)MxnXo5DT9BO^X4m(3^Wy14Sr!*oOuOK<4vH@ZVVB;l2%oCv4H$QBqi8g`b!S{Lro(lXxtwjtW zN?sHF>OIg`5f%B9gMEr{ygfw~x#T^UG&He9_&y{e{02WCAy6sl8?ss$(+|o>$Y}YQ z>+&h}*bLd;Uw(rDV{U2o6;tl2PK$v#rmUjVWX;93ZnpOYq8WqlQS% zTVI*7O5McDrh(08d`=y)Wn8XQeq^F)sYRl>{oq3~;!s2? ze&6mMowszV^?iYMq3-Vko7G%T$=%DL`uhBDC;A=F&fib@_3fD_-3cf0RoQ+dF8tY` z!HPHE>Hhl9>F*_WvVgRQR5eG<{J>pZlCy3gE5Cl;qy8X~0ne;mM2G}k5DM2g6^z|^ zZHb`a0IQgaGVYYNP9>fr2CAs)X((-P(lrGdB#WQ!SXF`}g$>>+rso zUac_}a1+Z7pHSzOp!qE3iAMj*%@K>4%j+l7?S9I)o^sc(XTC3YIyj-7=j}Q zYb-5~ZOQV7n9Poe(X+1_ZtH7mQq^H;KV9}n3Lm@)Lc}NwNk)uDbW~Y^EQopdlu^IhF*U|t8|-9@W4_O9R`m67|Rc}m0Ap8BIHo^{k=VyAfWkU#4ItN zrUa@@mjWjY6tJ!A?0(VE&Hh0FvEoKEMl^UQVxIgBQSSbt$f+);Rq?IfYVf+gU2NHx;G|Q*(ZWXxbN@%>wp$*TvU4@l z#napjQ=Fr+@=*$-h=N9;DSYKV1->aE?CmzueoBl>+ zx~NX1hsGE2Lv1zP@p9D@w&(;BcC!Np!~Ab3T*1=2%pDlxIl&RKFs*t|cBi=C_`RQH zcFSzKehS(bHnwEJ2ZxnqMAbz|D^uWrKE)}OGO@8&V;J}CXd$dEx9_x2GBmP&6NH3+JvB(}{hM#-_t;so(fdbhq@Qm zgwvtYRhyB#%+|Ww`iY9RSlRj8MJQul&->$bHOg=kx`uQPjE`R^1`cNZn3i9eMsA}X zuw-WtOWM*-HmMR=e|A{j0E6l6A^rS7*wKZ@GsXQB{FZ8`{$;_=d3CU(<7@ zPA<7eG0@KU=?zKhz?_$VviNX;)~RtLd&wpmk)JG_Aj&wlqx=IqNRnk#0KfU>hxuOg zS0ba7b&=K`YUo2NN!EL`cuh?%Uax`z)CA~hY1C3*hhyk2_tcH!=C|re7Gmld4LO^r zE&E2gKg#t_p?Y)ioyaf*>t@TkbUvm*J2D(F{d}T7beSNNe)cs7CCH7Ktn)mcpMI4V z$~~a6gv#1DH1TuRm(ix9a{ds_#nCsIJyrC4v;S`2>(^8o%kYU9jsJRx-tpP^ULbYs zcG3tizDBFg#LmtRsDrTl3QAbYUAGNKKMC+y0Urw} z?u-ebGi&_{CgTeOqhS0!_`FN5?vAw&-h~q)&(X6RJ*)Y67Z#fP&D2&uatiBXC*h3$ zSccZJz*((3gcxcwG=9h#hwjr6qu{kFoa0_zEViRQXUe=AU7GEGyoTACM^Z8ocYMZB z&5lu;ZRsw~>YT|GQp(_z7Nnx44)H>AhWS!aN+ZpsCDxR6jLwxUll6)4L7^ACFC_GJ zj3PQ8ME0w6=ZP;CPu>aCi=nSZAC|WRRWY1)*Wh%c{^Zo!hD7ahnVGr93$1Qf zCd)RMzj-P%#{ZB;#_2L0{{&9JhzL2u^p@f)=ioGknoR8N%R$nr->oC1d4%VPjv+#K z2Bfr=th!fHc<9XGRU~!fhNMR)QkH_Ky66Pkzw17%4E3tERvLQsGTC|{Rx#wlIS#tKMc@rl_ZD{~4&@X?^cV>T5i0fGxBxO6k?Zn<tc|MF_}v#aq09R0d*Hf`iW;@d zMq86YJl>J^Xz%imP}Ve4ks?hNuS7T7@__=*G7Z^d5m{76w^r)TGuL88MGnm?(WO_t z4p;F71L2z}<;;&t`fd3NU=+VoQSyc{Th$7pKIC`IMPo3NEGXnsQ7gt%qk~@J zC@K-<^H~vJj>WXc+*CzmrYg(ov^}bg_V||kI&dLT4hsXT>^&DwAe%RmZ2QlSw3kc976lN?| zFaxkiFqws=<(fnDgav(yOh)nhklu%I8=9y=le*$!s<{2ny;O55+4jVSFV97I`Y$t@ zZ^Mk4On&?ST!BJ<_M{lILo>t!C_bF54Bwxvygt*%+B2T#6mMME;X~}Ipd$&bU;1Wu zBINGCXwgS?P63|kvL$2KVK$5%9QS7j>(%dp7A--7*t4Y<0@-S!qR@Gp3H|#PX8N%@^OqRe5?jZn?UCe!d|N1DBK)uXNE8f9(HZh0 zZ|l#Zg#@T#qP|5s%MNo4U&wgGYocc+;KIIY&?w?b)#I7@6_=rr>9>olB`0!e6&7(y zlex@C=r(rzicluMh!VFfzGsr+_wareYT+E$md=>PNzrhh?mM5 zpZ-u^gZ6M~p5L-W;=8GbJ=w`zs$e*b{fP?laa82n}9ue{6$Mq4!t)k(-G~I!=V%x#GNkN2#OaBf`ju?A=(HFsQoy z$>1Z=>sFWh;tbZ+-RKcb6zT0xac$D;3@Za`J6f|A@V8ChjmO*Lr^m&8;JvN?+c7O_Lk+qMLQ!NDI+8g{{7ROO$yuQ-8VCi z@rxgspkaC~5V=?*Sdd>6hN{QL zwZmmhBY)8lr&p{pli@bZcaJjFhf*w8f0=30;P>^xHbr7TVte@Tvjx;R`I8kq+8D&A zG#X@*JUB+FDT}9usWp-!U5}P4*TN^3dfNAvunU?W$5nM*QyWe`U0b&ss!fR!nfyG@ zS0ceo8(ZOl9$)^!w!Hnj80;B7xz@)PG^9-EkkyKeBGd@pb}&QJa^lLQgKY_`oKDEa zO4TMUMzF2ejUku@fqQ?j^zCE4x$rZ`*qOihbcU>2uIXRi&fL=EE#qxD<&wU?w$~2J zRDYCP>#Kt@>TWo-jcV_-O|nz?f*jbEhkio2)j7;7`BeMA z>5F$|tFD{K<)__!WrE8TDAH`BjF&K{jW(uxz;mBf?O&x#YRHQI`C~Qslb$4mGx{>S zo00iY1!`P#3SxO=&`sEvKoOVWZML-y^hgui??V4f<#lGx;vt#gpY(4H?KFDAp~ zi$anbwbml&F#&Ov8;}~$vs^J^{B;ozWOe3&&l%bh8iE8NE7%|lxc2_p1-cG51QRK= z(Z^g`_4wB_va{{2t(PE{ikh0KK)Wg)RqB{Fc=!J4_?j}j-x$hnX=&O2mnF=&Ol|bk z1H!;dx?-IHRwx1X1(N~ot^wV-6eD(=$QWiugHbu)Vx1z7vm@fb=~f%0Qug4Ca7t^t z>a-Jw=loMoQe8Sryz+tls_&+yV42!^P^D24IS3oQk>=Y{ zH^4@QWlpCaa)$G{B+ZUg*+E>X@Ld(wl7sDz#GZkw62RRpuPqCx-txJpD z5o0~rzlHnhqZE)~j zRpIPkjBwcvQr|L9;OLN~qLlggR0fnJ6>MBT1fY}Va*Gv!<5|YQ4${&H1Y;SLm}JCJ z6a~9o_07Trd*A9{ul~Z!tRpXCeMUIsgw&mbK$D54E}xyB$9uW?p69O{h-i_toe`W znXcW`JO2Y^?I2}M#Bb&KHFf-SC^P3Nw77p_GP`Rvez0f{6k;)8R|EN?TkVZvmXU~L zZX<4AzPO&pV+Y+`z4|o&14>a0^L1Sa%P=K&&vO(ecD$I%tWgYUU~oQ)=&eKT2yyvK z|MG9a=(Iz71$CnEHT#ca%J9sa&Xwdz)_2X#i~WOluF;b5yYhwfWLX(_=-z9R;=>gF zlcE2-!kpMCn)I=Z!aLjs={Spb^~2tRO~VcOJZ;A=#BiISj^KFjZZEI6P7G_wmkBIv z*^-SOJ=FKIS6?4_TiG2EgFVYcNAA9H4wbJcV#l!`8Istnvuw3&m#dm5W^&lA^Gs}< zf-QD_}MqOKA; z33O(tmO?Q5r$oDh3=_$++}p+OK_&K>|I|e10zU~0U5(3F-oKlSwti{pBxdg7qa%GQ zL@x|JroW#90ytEuH0RyZdjVVeNW4)f-|MTueTTt%YU~j{9dn3xFrkR*i2WP?2^gp z5;HoPJsB`@jm|KZEJNA8cFDZ)wvK-Gz&SQFam8G|^_WL~rLzC0SU?erXAa|Zc`@*I zdV11eWOvREn>B--8oSCm*?Q|E5oS@;Cw{f0_1P4l{EX2hlodrvTssk^ow&ge`j;X#mMtavA$78vy z)pA{?qSY+Yz6=pO;XAsn&(3cGM)94O|J<08#JHyY31rNJt@MJ&#D>=9g)Cgyvv&ybF%sPO79~%G!NV;nZV5$e^68$h`jN6Tw-b> z%YmviBnP+s>TdwjC7V7;CGi(RTMolI8fv!;HiKTSN^UicASGD1yAPFj$WRw`S8!~_ zQOjoytFC@^g|H8(rfc36X1FL^GH3}a%5|GN^TZf(FqiRQXFm6#pMPFbIs+s_o!yO5 zsxJNDVI4xGFJ_{>}Pfxvh3B-KZ zf7)4H$zfz1okct*NHWaHiL$Sp%-(Uw)l74%vF&x{^(|t1)BE9`rG~C;A}T`8jAdC% zCh1X=3*pHhV&&tyChDfy8qY-HRdUJgmcsobE`BF4x;C0799O$BqR@FM!nKDUZ ziHsFei4!>As8eytz^M{ng@%8~(2Iz1APZYh5|?VX<=F^?*x21^tF(R)#td5$XN5CO zW|XgGSQnv?Z#t>&_-T$L^??h%bvn|9Q%I>_s*ZB5o?VVOLGd7kB1!PM)$It&J(xz# z-fu9p{e5$Yn16O`kPPLN`k!~fcEty@{i6gDl5}0GNzB|C6tJ=t9Vv9|H2HB0g(sJB z>*|i2sBQTv9htVjOQNO751REXC_`GsrogaK2wWAybG@#5gEP+g8CnJc{7HiAV&V#) z9XO{QKUyiE7N(gaN2q)($YE|1f#H;ZZ!1uZ4xV3ejm%MDFD))6T7!qGx-eT-Xy^A& z{8=YHY-KUl?P0F`T)Jg3eK4j#H%Wj5zf9L+Hv5UGVQA%fQpgHV@@EI_?^4l`){cav zt=e=3#wm{Ji8ZbF7zJh_Yjo<4k*V+cI)+)*0;RvO^YX<7 zMIs|eM@(BXe8Z(kQmBHoY;>oxRSCC<$82w8Np?E!mVQO#z00gFy-peKJy8&_sEVD zDUv2CswF>S+v(No=yWqO82ryva~V>{D5QNl*B_e9i>;|XMFK$Wvr;b_js`Rsm#sIA zpWg$w0?8Bs_cRp!qY`C`MDj3#$?CL#acn3_Q~Si&TOPyOeE9>cy|#+U2!E{;!VVcvx2w?6iq0_rNB zI`4;^$|DX(=pR0j+%(sb@X7AMj&21_PFJ5WNj4%IuTk^3tGNDbOceCU7ff=ryH$|I z&-QQu51N$IMpGFdh zF7B2^{x1L5FB2;iiRPr@VAv`ZSkYl$J*HfRAJh5S33YB+$-};jRtfz5=Idldeg>>j z^*ETBj2@8rj_FH0uW|#g`--71rg(pPTdMKmK}k7TZ!*gc-Zd&h(QlMe)g{Od+c{r8CIr1}oUKepoGsVGonG`TP^i zR>e4$WzV>~gIJ_%fF(*}E+M4C@y#fvv~wwxAHm5@rsZbG|~ zpuW$S({r5ef5>(hjiOXbxgEKvPIdhWryZxR0{OGqIraL-MMkDwYm>{R^>Ysm2;nPlN0$`WQLf84 zdx%|Wqgd}mU<>8chhTS{BW~!;rO)i&Klk2u0e6A^%1O&5KP@PpGKer<%w@S=@)nTm z-DrJ22_-Gw3~U|TNPm^$ckO#rhFh?fQlf~WlDBBH{a#EOCT8f8O{A-YJRe_1EkU$}u=zMWN?ak9K9*@f2;ubETAw=E z=4bC%@l2@7myG4Joh-xHLEs_A|8#`jg!s=2-Uv-{=M5hl&6~~muO!Otq0}v zI~a;yibyPR8M$_P-=aqSU7eMy*o7;f3JRXzy6f&$X1?ZgGKFF?WI~_dgg!a5fZ%(K z`qG_Tyrwcu?^k#{pG@=^9;0-3Gpnxr-a@+$6!|wU=zkRwW?5k4WOKEJwnvbAl|AYa%9Wqp@W@$S(UtpYvyx zrGkOq*Avs<;DZ%NbG)zb0Q3_k%P}I>DzIQ+tHtNmFM?IL}vP>WLEyI|tsgzou$H5^}^q59cCdiYJWsxM=(SY)qKzih2qX`K{&zAc~Rl_2Zax& zr%vPq-VpTDMXEusCN4KWr)B>Zaz4Rj2{|4HYs`d+6Jc-V>(4W{r+6wIsRxp$k;9WB z=KkpuMDSTZ_8%|5*Hwj68T6U^O0!~W>PX#C?8Sy?d~-kHXoq@yaCdd3dqs@C^gbRc z54=aTT$N_q&0wb@hzO^~=)de~lqQ46itPCn?3C7Xu1oR>!_5dCGenu64be8KEqk?! z23Bpg;@1?%zDu+43lzzq#=~P7i5TzgWaaHQSLISVzA#3>Pi0!!|Lq0f(e)5yhbQmY z80heOxJqZU+~V#sTm)`bp0nYQP6Ybtsx+L59N7u#88)WCYbDK3?;4-9fFkhdE~_v` zx8CCO?suI=9dYG`B`YRo2DpXlgVTlLcEQd~BD1uapCqPv%4nM>GS)uEN6)xjr#Q?C zDvIbBvz|ZyS#`8EJw8kM@3TZ8Kw3XJ@^}uFbIO(1n-X(Mmc-X2!0`~ES&m}+>9(U` z({4`Vt+=jUf^!rUHNDHxQGI_;GHNvY1ST9tK(v~7^Cb4{pNqsSBOM&>=N)IKTn zL>O2F{YL)j)BDFcV~m?XazK0(UztP%fz`Oqk2=!?`BO6-#|H`&+$T4YuYSUN@L<(G zGUB)kJSe~a4C|A{#Rzl2B{ZJ@dSqBIHN_HFL7<`8)e6QUAvim3c{T$vkWBlyuzkJ0 z`C{l1ONIXjHO%s(PPZqI|Jl&Lu>9)SY43T|b&ksC1EY`hzbbXBi#CpiQ>|36H?u@L zV8twkzaXlIka)l~h_9wYw+}LcP+!05;J5nlFG|?ai zepLO^7P0lWAw+2S_WDJ%PHx{c&BeBplb%eKWzm_?2xt{1YLlT8NsS&Rbsj7;_h4$- zT~5zMn5kZ3?X z{SZMKTlwS4WK~v|S%10K_Vd)92$nz!qiBve zbRrNZ{lv?gBMav&S6wLQ5A<+}!~M7e0V6Rr1CR00_p~O-F;wIRF%SUF(pV=%E*8>G z9Cj_-G&REyaslI0(57Ob*-YpoEH<$9k|EFL_?^~4P+NXpPhHY7do_8+93M)|XADY! z*BwYZc292JD#m33r0baQbdnj&S9cS1GVoy>ReQs#+G=L%&lgs2j&om$S_r4PgG~%4c)S4Y{0u=Bs&jPhsc!Z06mdWI%(NQ)%h-QX@p!d%I*R`hV{q}0h) zc7~Sh^1hc^KL6O=`iE>pzK3SUTm6eWZed2aLeb~#Me5j7W98$;I5j^0t-H$WpKiXz zWcfn8qf~Qe+glp~nMP))_(%$IpVrQ5iFN7Xn?q{V8db8~7|LyHujKcN9MeYC!DNrq zi;tiF_IHE7UmTsA$uvh~FK|pEHygun%N{(ZSYB$P8P+`V@g8|Pk51>DZJBp6A>ud* zK~V=d*YSze7|G~BB8|}$na|k3(aI*Buyn{g?VEd)fASVp7ZvIi zvX&lvkn^|SxZeB+pZ|?&wQ5<`cs%|^w(Pz;c|Y<`)AWyj{NpE|eDZ!1^S+7szy0N3 zzW4qI&pz`MM6qsvkd|eJVJyqCZTmi!-4CdtDB5T=?q|#H_y1F=lxMA%V%4NUz@LaS5%M*D43~yS4qqIlu2E(JR!?VXv)oN3I;P1ZoX6*EQ ztYJe)dwo$i-C@KP=1L{PMjWFf&YpYx_R-%a(dQMfb5`5B0aF+!0A~7ivgRa70g?iU z!w3j8L79C(=0%nWF=8U*P-MZSQHm82E}>W|EwDT%~!c}MZS#Nx}+1|?V$pWdo zrC4Vtw|ZDiqZP!v>mu^S_zs7>7skEgMmL|H*iLuH5N?kIA2&a%I`diKhp_GFVGX5e zYiBwOhLk~Tx*o)l%S`p0qbRhj^~irajQcVru04F>?Mx{OOblf~tRfQrq321cpcCzk zgIEYr#K94w;BEm#g#@KXL~as$NE`!%SWX6+B#3B@BDpf|p)%j&3W1m*Y1X7`A;bEJ zlSI^pnXHV~mt)K(9o97ogu1o*&|GQ0#F{kGyT))Uo)rDt{WpbsrnH}FO8gi%HH8I4EW;-ZkE(5JSv|_ zoo>Kgof0E3Wq3z|CoR%5Z}OGI5z^W86)o)|r(Pa;PwXbOa=sTRhXFB+sGT1@|A5RM zkl6z=`_=mBgBx$W^n?HG_kNeKz<`1k1`#3XQAEx1dOS`iSWHuW$6rMS6OA|q?nJH( z5G~GMyY+Tg1S?s(lfgx#C=>m3XzxSxSeAdmAO5C-!KE@Ub2KSTY)x~+SuME^u~ei@ ze495XcQMmD)KAYAEpG%+k`1t!4kIfrNoWC0SO{W_=6C_qZ6TGpZRs)&)lMJfWCDpN zw#UMPOSl_;zc|VUSr!M@k?UkB7zCk{;8`jz&^U#Fx-mJ%LJJa7G|nSY3q%B5Jy0hQPt`J22T$yfT;c^Tor`6vk> ziIIUG6D`=sCtB9ac=PzkZsW#Zp0!(61`m=@fvK~;=ZW)Ol0Y477fiYK!5Q~9BR5=~ zvQhb#p{KP$(7BWGR9mk7_59Zl4B}CxhangdyR(oj*5U!yULJ8LA31p$!`sI4G+&)~ zkcp0RDXF1Pi(o>_4^f$8hYP>;_I|4hh%*PsPgmB(6>BA|B40 z8`I!L3GT*pVU|REh(MzBCtLFdtg!0+u$r;Zck_e@v zOC!WS9&_2%i$6E7h0KKzv~1;WCC+YA6zd_XXI27;CbsU3gOIO|9UNyp$w919hZ8XM z-l89l#WF>v`^6PUK7G}t*w6=oE}}jjV_C-_Q@qZKDT1+$hCoY6LZW!6A&egxQy#J& z8uQ8x114FSyIii8khpE!x)6Fs9=%7EpBfG>uKBn62ckUH56IKGQngaCZM$49-}fKy z@0N8so%>BpMNuwazWn7cfBF7EMx|VO>GfCt?8;kn-NE;_Uw-4I9~=(-(6LgoY}@wz zCT73i|3w7tzKQvZF%Hu-4b!ZYi~sBo|M1QmFTMH3^RK@6zrXSQe{=oH_tCA(3j!3= zuuw`(pMI?J*>8l$zO(_xmFySZMM{ckGBLzFjRMXYPQzHW;@fqux`(B9hUQ7cKr5A( z`kmrl>#JF=7fXga=(-v;Ryr2Qa9p?3+xzir_A&2ZNa2J#>r+1TLx;B7S}8Sie45?& z2g4ovxz%Sjk-y`&%*FJ%zvW#S<#(hk=HtY$oh4<0B3&?%Z6qN%E}aTI-$!sNb`u&c zCh>%~BaY#y6hbgOj4GIur!X`n=?EZE3JH7!@gSu}2g|x$p4a zcaxWvmWqY^c&r>her$DRWnuo(>4nGMzVX^lQTUI-vT~M%gRzO5oaLMeKe(s$maSA5 zoh07kzIdUBc$VK>MU)zaiYW1}SIU?r2qpnWb4h50(tB=JFfiBZt*GmkyVDJC`-u`m zmn5;(x$5}g^ZR;d7UL+VS>o6qu|)-U&VXP@%}gRqN@6phP!b!2{gH*qXc>jjkJBU( zav%ZNw1CTFw(3ZWIDKkUtR`?qVX`VYlOQ+>=p!sOFo{Q$^@{K1V|N5m+Csvmm0_Ik zl2oKSs@)Ii0*A*eQnaX^;S>8P`M9U;V>OjIm!HcG^sYKKAY)>9lSk7FQMZ%Im4c}Z zO?)6=Y*pxHrmRvO776h1fz`ikiceko993-K7ZNTK!t!t5opLMBP4&^!i<+ zyB!|AKGo{Bbzzw&#?ehYIJ))9dk@I$0hv7@vtO-iA8h>mmFJ7U{_A1@4IGKb>WC&o z)ySp`N@RnH9kYxTcmaW>OhYUb96aI}zQtogZDy@-oTR09r2NBZkdU;@ikgF-ujL2f zU}`TcEf*CAu}vFIqHctz!np1?3Klt2;B|H4;Yi)+KH(Ics_1H3!veNM6y2nQvWNzJ zff)O)Id&%;(Nu!aQ!w4#i^h2b#bT&qNVGFLS;$*yG}zzX%E~h_2}m#JMRrVzgv3U+ zpFjpBTpZQIScEQy%7-yn%yJn5%MPt8NWG41&d7HpA-H7S@S(4^EL< zCUmS~cD}fXlC_R_l0pfMjnmfQT6Ph`JX2aNvQMo}SFZT&wuPM~L6D}dGr7|dKvSzX z0{WD;Jt5|M6gL%9>pA<0gX=pOF&s}7Yts|ZkGy<+FgOuK(-$5NViXC(Yaro9gH${o zba$STj^Be_%lSyIFVoY7_Yc1Nkox#1OR1~U$anpRg17&^F&$A@O?8ZOZh#7+lozB>pW$|hk~CO z5gS>!tg=apObEuc$27}@b~sl{+jwTz?#d%vGF=MS>C|GsSjCfCV8yXyO}xx4a(3Qz z_o>~2Cx3^^n?b6METfM0iCS%8VgCMArC<1uzZl549}ByB_3C4fJ$B#3{P6lmfAzoq zdF}M_hev!5X{x5zXJAB1&-^RV&NNpj6BXH4FwRrNGFOVzW9^@Y}D{J1-JN&K!xXIsH zadDC}Rd>k3#{=R~3nP;zl<Uhk8ta0!>nqqW1t(?DCo!jI-YgtR)$_SNMO}OT zl?P<@fXp6{*{{|ISFil+r!Rl*cmGM=@K9P{Ay&=^BO?%9b1R8R6aymaZ;n8Uo5r~5 zh4eLZQVtJ2iKBua%gW zl|t4AV}^tw$;7mK&+Z(HGe}lK0CCN;mQh~y5Ij;@0yVlJXYZ+*GKs$1E-Lw7T@ak;QF={j5t*# zF-JyG-G*umwtM|20==*D87a0?b{uhZC2uRc89#<(w_=Zdc~ncBCfoD-Ktb~tO?I~s z<-PYEeF4;J=VIi#+~cC`#PVQB=p@2MDs;g~^5HPOx2>RO^Jmvb8#Ej)g)`*~+)L}% zj@`WGi7`u!5i^>)f@(@V_7sx2F z_egDF-#6J-=mdhlYZ}Q<{L!b3={`Ozd0~gG^w0*5a*!;fu=I$uNH@+9BAv>ifZox~ zK-ZzC2J3~o852w`LhE=p4aTzu1xlf59(=R1@|}ZsqQQqLG%S<(&wu8b zU(S2|GM3%e7 zapu>eN1r|^&1sK*<1K}!$CDZoN5=JyqOe_H^( zQ>CAnM_-$LxVe9s;K|TI!nTgV-0}>o#MXXia5DD{F}K@lZtH|})*mLfcK_fH{xI@f zZU632WNnz2kbsIT6w)k63=onr5^`9C+B7A*fk7jq0FiT~q~HJ`goSvDYD)-f!w92j zcGBZfpO^TF=DzadA3glo)C9UVW^*9`S5o2RDHC~ zi)TL4MkUlMN!h?BZ*Z6N-5VF#vp*#LWzVg;)t{C=Pr7Q3bGEn>L^Q9l_QZDk2~16n zQkFjUX9nKrMC;v@J<=nU1c(9SJWj7J%*}k}%Wn>CIq?r8W?DNEONF0dc-r*_JRBxM zV!AmL$1uzu?1Yd(;s_=91Z#)J0npPCo-r}Wz!<_&x_BD*Y-sh}(5cv(N)T-%V+Taa z**i1ZN<$_=2nPUWVipDQa^)e2roF(;<08N#K+=3N(oE=K9*V_*n`Qacx;ZY!YABFL zhvb@wez^HDhz7Y3+9ZiVA_;d(e;1zW7L+SXejhoa2Z>7S}aK$MwuK zf)=RC+HMRbqfT+zb{IaX>w0cZV2dO-wBkZHCbNnoA-nD5=7q&CzMi04KX~9~J|MFP zWcKf&_ttN`_LHAH^{sErpxll-Smrp5h-n|m$l?Tea|nLf4d%QAWuqy8=4WPFLz9!% zv~W-)AxXso;+Mn`f%z$jNEx;i1q&;u-gfljmU^MMcsoPs?PitFbV#h=;slMsfWp%R z8A7R$?v0KH2YR|#)(~xqi^jU{yGL2RNP&KaVM*L4XyM3DW_f;0lR?iUGeJaR1f9`| zXcx(*NXAo4XC~VR=qf7ruqcQamVy4*SQ44rp>m4OmN;g|9Mxb-)%$8<;F!#@lBG}9 zip5a^a)ewKV9QI^#0;dImTHwHQ6><>2oVe;F;tHL<^*|)R1iW zG$T?9ik8TnX7_PJRmfcIN&Ca=oE-0~LMrCZd!`TZHvw2Y*!O58L4}=Qlsb5IS?%X1 zEz;bPA6vFUvVzMRbvF&ux20KX5W*@a1^f$$RT|m|V$9k{E5gZ!RN0EX6VB+3Y~4q5-@;E|aqMQm99fEE^ME?7Ik^gccPB5g0XfrLTm?BISnP zT}22G_gl_ZDu{}__!3tMzj%qiNdx zIa$|rUwY}KuYdjP_p|&@KK|H8?;qsC?W=e1b>2IAYv##DH^|?(nNIHAnR#^DZRBJt zS6pQomSx$EjST?6|L|Y_?mI933rf9Pi1dU32}Q87_{6E>sYgG9Wao!ox{jCM@oV}) zkc)eEB8!eVqH>#&wrpJbF13>Fz5Cp$Prq7k1lH0cL~T8WbNcnu!i2`&el8C2<=MCS ze0$%S*6dS7qIv4`SDNqB`mtWbJ~Da(z)rhwMASstS3dpJGsdLl^d7#J{lwBxuQ!g+ z1RL^zj{qMsPR~yhg{3ul3mfh?Mh_v65AzCoblnDL13&u0GoQS0?rg8G9UOg_q8yjV zO9Yoh4jspy>%c(K2BW(-_CT6kLr_It6cI<@q2l?d?}d;=^j?Z5hn`+E4cw1?nqqC= zyMQ>%U>(qOkrzb1 zI6#%4_1+Ys-$6ju81+e(45Fb)%#X1T_HScI%0glr214Mj zQgL(U(j8#4R3;))T~wkI7Nc29&O)o}`yh`28SxL|&K$z%z%mKULVAwLsLmm%??4c( zc>qQ3h!kf-G{I`VKY7NJ_GM_K%0vBzjTW`Zvfy@SbRBTR}LMV zj+$vA9QI^z-ty}?YwHu5cIMZf))%M0*L7yQAAE56<^wW&KxPlf?B9dTHuhe7@duyz zoo`lg)Zx*2KGP4O-R(0ht^$!HkUODvQZBILQczsV2OmX>GAkVSJ;;My_AaN=0yr}BEEvsjr+NXT$0Atm1P>W?7hVl~H- zse;I{kZNl|NM(+c5lP8+CVCElP9Md`c0=t`Nv0n2Tb3RMB`#EVI`Wsj*mp-Yyf0q(;tz=@iz9(rT=Q~y z$qU=*=mY~l%%9!R?36WvK{H6kk2s)-n3y=OVKknl;rKf6`ZhN{sgi{3XTvvEap7=r zfz`GF-aXOYs-&=TCVPOpswK=B^}9)Hj;uuGd^{O3UQZWlX*Dbz;~V>Lx>3_SI$ZS9 zKlXLXE=;M1nWe=jtC^F12V(@N$rd8e#BPvlV#9Q1A)>IpKVUF2PjbW9suN|Rzc~xk zI!Om{I6T<@*e?rF51j}tNu9WTe>h$%eIv>4UfDc49TktH3GL!ANo}**Yyx9Kgh+r> zpycZY%Jn8u);~yW{Ww8w(Ah?i%o`SJ1EpnZL#>Md03ZNKL_t&&?A%1zhY1}!O=0!i zU!V(ca>$!ErkzY6AeHe4d;)9~OK^^{lX=W2dghsD?jK)*5N^Hk_a`k<#T%Od`IB$`cH_$5U>W2|Mta*Am)zO!hO?cU?+&kA zerx;A)z@Et```RA;;fT+wjze~oXk$0E-yU$NG7G8IR0YK8#E@N`BC4B!SHrT9FLPU z=QKrhaKM*)FZUjNrZ1c-n~Mf`@JpUtQa{yz?&NX9t6J$E$v7Wy!+p9mh!7Q|C?`-x&WrgOM-);f!6?W?C`o1b# zXKmVMM35w?=NXMY@U>^2e(qzlW0K_vU{w}xTk%LyFlb413MFU)!$guwqA-($axU8v zGVi+Rp26y*JW!Kyqdw>kHa2fV6022e-ENoTIF94G-R|bj?hnTeQ2-)WWVm7>n}tHA z8YV82rBJ9~Y*mI5CA8QfM#Zc6M4|1qKnW0^42iMZTQs|YOZ_}P1AE%S_)1pmS)m>$ zF~Fh{C+3fp&VJ_0_wYm+X$neXNaUL?Q(4@D+&Cscf^FgKiXZeaCh~pSH)V&RiOBI= ziA$R(f})Y&Miz7UMj{ zXeN+DayuaWF5*=!!AZn6mGWW;5;hF&`LH{5oeXiHhIEdEo@c0j&f`OFNKVRA=2%-J z7?a1Xq0SXEorZ>GW+uw6t1?M()i*bB%wa=q4x?=$US`QTkt2_P^8J9Qp!78CO-FZz za$beSoMGoON2n+J=-P?gg}cj_6iTi%C*0Ym-}u|VdO&6m$m{``{c2smd-T&6{^r!z zzf~sqBS&LG?l88^kwJ>GWsM~){IN5>V9-oaCW3^PxnbZ7L#I^AkF+6MT_tIrV5mGH zvqIVq(IDm|mi_xA6g%#$1U;_evRr@cNaachcnwX}y(CWfdu?*piQpbB&INhmlR3dqR8|2Z>Ry@YNPA`dkQ(*#i0AVwj7>y#E8VVV?bhn_^b05d@vFm1c4%#ce$wLB zsOcZT-j`tU#i+RKb^2Pp42#EbzbTQ3lD;5v+cm+9ML9lk>ESa!aQc|OmJZuDlAN9KX{u?2fXC=-C>z;iew89k+bxdVBnZ zO0^MhP28P_on#d5FQ!CQi>&JG71wnpp+Mjnznm1Nw^(cur)&X^9JC^UZ3A0Exd7AJ z%1z0c7z_)1JoFn&+D*gSD_fIdZmLN}njrJTmNl}zS^e~@+*RTzNb>9ms8!XiGe+MF z3K7U)l<#?zYlHAk2K5u6=1i{XaoPu>gZ3rI+#{$c;O&FaVx`RcW_pJGm!`+>U0d`S zlBaSw-Q&5n5P)LwR??qNP!EwRN`am8cZ^0BOIg755u~db{74>Cme*_8YI>~cQ;Bq& z14n_ia)fuvQ)NX}4GMw8$2%`Y{%VLbIh6eD#S7JH_5MJ{{Uz969>^$H%Kz)}5={Zxkk* z$0V${I)$B>J+ZQ6rfUfwt?7-|@Kn=TRQA`aqwdzqKbrSFlx#AHZznhBG5*i-`A4_4 zT4C{;N7lHoIJxl!+(OcYxwTU{r}DFulXxoPPPv@$7F>M)ptqu37_hpj*PAOHEn+yaWACy$>Hr?Wr1 zeC1yHRC|A?V!*kRYm%Ha?D2t?e5!P*7rxo@gRAde`{c#PbJ^Uf`Nb=*zlTsB8+WLX zu@x;_nEL8B|KsJQ#qa&~_t`0i^jy*>M^1kUuRhP`mlB)9AriSG(~#{jWC$i*zGt|t z$Xm1;9_iZ75vn3L#&+PMuWq;6AFLlVc4p^hZ?50{?vH+YTiY^IQitYch-N4O;AjdE zS&Gd;uaLNTYDf?xF0?8XAH((-%_0GY1&J0Rl}U>Z-oI+kH=J@Xxc$)J=g=9sz5xM1 zFpy&CrIiYLW~EQ$jz;xXD3v0gjUAuo^IEtm$8(-Ng6wU~w4<7qka!qp?Ow(9LY`~(Jqe;j@X?r$6D&@`$Y2sP6KNJ|lR;W%B?~DgkjBu$fTV^*Nx=&`lEBz$ z0f$j1XrQ{Li`vFm4P}7KUS=V4KBkd@-wqN{L|qIKQJ_#LP2kxwF}JXE;!K_n#Q1}| zDvHJzEI!PQduVGIuzt*xLm&$Ffc6E`So6~z*n~tMI-*ioIYMeBpkWm6vV|HLtC2df z5-L{OF_LwokH(@m-W~PcI_9)cLYSfRfHo~KMUm!gJ{6Nln=W=E1VgbJN)aJKX3jPd zO;%J6Bg&b%mvndHlkc>G+uAe|;aiQAhTbskMG=g<%J*o)>pn< zq(I;BmLxg?E^tHHc1E-)Q{27K{haDJ`HXLQsdCCU0grhoPjy{yIh(SBC`YDI2BBHu zz*Vcdf|J2t_S=kE1CjKx$wC*^u<*!>>Aj8}_R@g^{1FTGP`i-a)DrNy7apqdsoM$o=gfx|dA*k!)AP%7CY=`~~;;W8@ z#c132rdd9k*bEZwTR|oY5QqeU#zjGnrZnHTSfV!?yf99!?7saZy2H#Yk7>c|G=}6- z26bD4|Hw^P^Sm+q~7xBYZ3cry%uJ4W2!2zz8ZUE<@(Q5+~^XOT` z*vY{(K(#h~UgM_~>O>xl>d-mv+I3HPIJ;UepHL8!oIJ>8Dc+T6D~f{qi!%}AM3yBO7|>zLkUzML(*5WZDwKZG&E6-2&Xl@U`<|I_31VrnTj-CoPLRTJ<$PiXson0KDUQqp zTNaI&IQNhV>{8`Al?^8ejx&8MiZxi`rhFa^Y>VV`E!3y1L18?yt7lSC-7jj#QTP$k zS;8beP}7u}v%x{uA08^_M?E`h9S+-Uq|5+YKqQJGE9J`l<4XX5UmnQ#=$-dpd*_{9 zC;s(MKGE;>rBwRd#YbLv`Yn+~cyz+9_et`n$$8JN zFRNl?#Sx0@*-|3 zKlSCW{uWKsy>9=#*Iy^IS#16NUau~s#h>%X<~>C~(Ac$N&!sVxh6u%RejIxVVOxe9 z`!Eg!g3O9cnus}^NStlf#MZsky&wMU@@9ME+*iLmbF72!4xEUG_%Rgik`iG$i8h*} zB9=iZCR-C2FC4W({B9^GP8jYgxC$DZkz}j5OT5V zCovjB62vBfi6n*_lcN~9)9aCD8I|Xmz(QC$^l27QC?SZby%|NOCCdOV&7OX1@0P6% z3CI_~u?cVc(H;mC4zq4y7ff9VT_@M@t2yVdkn=@r6Sr4p#p|2_@=KM_ZE|!eD&(!f zI7C?I2!yu(#W1Tx6ZBk2=u(9iOdu3#x4^fXp6{*?+M559m76#Et*}D9NxG z?_vQ=KsuG)-Rl#xm8h?Hge0PIK(YqrPM7iwWZ0-P#Rx|bBp6E?VUmC_ap{-yY0>SGK@T8V1M z*#!*AuoM>2d=~nBY`K8SAi1LI=c_Z%=9VoxiZG#9ZzMuuhX@-6n@~6_GI4_CBqoV) z*K{C;4iKz}LsHg*h)8@8&?yXw-GmB6_T{6=T5JCg;ukWD=RT4zHQ-{{+F*DN9qV_K zLV5r1KUo&qxnsA$;acQ?Adu~k)G!mY8lR&;=hA=rN319{*U7~9!KDa!e|FSerVKj! zrkR@mx#nYt6%)X9Y}X-+S%3Po29tz)nLSXMpC? zdn#67PVLu6UtL44_;<-rDB2DxOP?a;KkYZfRxb}>Qaa%Ub`tJt*7XDKp#;B z!F$EMVKuW_OeYQe5XPxV17#v5BB&CXZp%?eN#C^#tQG41xGFA%mePp5r3rdkg7ti9 zjy>5|yZzpK0H3q*={g;xHeZ~nE@6T5xolxzO+4z^J@jh-&dc51&pvwc_ul^CPrrHV zGvT~RgftOnM>L8?OdcltmL7s7nHj#(=s%*WZ28!poRh}`1Bz9s+{+9(C9`#;&5qYz z=iRx~vr63YxU8w{253A8QW3*0`wmNkC3QTstLsn^>6*dZ!k1-zlkYH z(*1#qYOU7ob+eTcw2k5Ty?(FDvK&Lx6HTp{^+uVh`fERyFIN4+0jaTR_GkWh#r{Dh?%HTo zaZ}6VKlad(A5nFwI5SSd0RM<&rjJG^!_4*audk%8-R$j;+J+u?1L9n5QvKlShiO@U z{s%9u8~r7c!)vEe+Y79}-tm{58)pSgpZe^=Qw!y&yMBH1>M8cO2kCcjMB7wL{ICD$ zPi94Y>FlY0{FSd6hB-Yweg9x6%dx9#tA`tRo__2%Ytz#|zxvbk;a?l2nSPkcU^L-TNiX&hW`2ro z_@SXXTv}NE(l>wSd*Au)6?KHDnV49c=SBf@_cEo4uE!!hT&hTCR%d5k^shZUF ze$>;SVmP+Z53_cLlU&2HCjed5h22V6=F2l~tI)PJM-Kw2Am2)x$n<;i3O8zp9%z zZ-NJUp#Pt|nZ0}M#+xty=;?2KJ_k9JBb@{RB;DeFz=lK4BJO+6NVOYq^x;Djx0;M&dK--*AumnqiL_YZ zXbBOg;~1)P?!|`QY{3sl{6o1C0!!J<6wWR3Gp9#rdFV-ULjHwRos2Unyz-8n>?RLO zNE+fZp(VM1G=# z&u+Z>i9!Z_=pWdHwM_%+_pWDz?0zz{+1ktW?tGy-`*Y!v=aR<&;H*v&2iN@kBT+Dy zFTJ+7XVzx1+sI0u$iQ1G0oK%}ty-ceZo#%XEhlwq0mIp$T58X@($5k-0HE$Cjd$O1KH&?%VtG1m>n<8dA6ltwz^bAQ^YFy^<=NW(*Z29vCr>@~tDpXqVVYCbDvo3I zM*W9B_~9Ra^M!LKkNw8yzkKA_iXe!ULiMvxeBxid`u#5j%KS99?e$=xn5XDC#t$M` za}_m!h|qK(JV9VG#X~SMg+om^riF4=gd|A!WdTA%E`g+-s7+}!MtTuFa+;qH94QK1 zmPqPqSJw%gx?^_VP(;&l3{O8jvT6~!fS4mU$rK_H02F&f458T{0#W2FyW zXo-cJ^@9$Kkv`0LEnd$5fK5q&)S##fGn-O5j8lQ?7@8tjD(~8arHH{$hqyR235Y;r z!iIf3MrB}S61Y>E%_gT4laI|De`1h1U7k6yvUuod^*Aqu?dv|U6(|SZdMSuQv`C%QhY5c=RrqUVSv>(Zb9;>^Ae^nreHo!Qkp zw=cf@gHQhIZ|5bZWdQ+%RFZ4gl>&ycZm6)tL(6_1<@+gknx;tv1|Hxf#>4ThWz8~# z5#xxdN)lmsac|TZjfp12;xIAAb}|(fq23@QUvk=6Wj{bn8<+bjKS~jjKDJeVW&e>EabYt)}RjQGZCTqxEZN^%PW#>Ob3on!?Bf5 zkhp}2Q5aL0;`?@F??fo04l9g@SwTbuW{6^*!Uw^f7-+S|snKhPOLOndor-k@pv-%F z?|+2L{2(*8d3QBswN?=RQfcLE{c3;=!%@FFb9%E!ooQcbN!U;Dk3VRvpF(Jp_Yp@w z)@nJ>wZ+onyM6Bh(2l~(sdSwGV$Q_>;_sVv|lQ=$gTqz;Oko6JEu+_9>Yho&Nm1HEV)nkdh zwe4fG(0vott;^30(x z{`%=BezlDqYED1*?R{$7&%=ts*$;-?nY#dxwwr_3BEM@kd$awmEPbVppK9XFvti>0 zvGoakfXNySy0ZXs0X0UNPutB-RZO$WuoVf6BHFVzGIv#Tv|B>FN($Q$1JedR48?HJ!0Z9s&vGGSZ>ff$gE=h%n=mEaTt=8pna1!>I@an6Xj8e3K-z$pS=% z2|?)M047AzvZP@6yx&fsHpFwl)4a$xyM~BU+um@ixeg4350tS-p;}zkUyr@v%3uQy ze1rfv3d2ZTVEL8P^V3f}_YRQu8#i$u32|8T%xRu`L!L;%ZVwAWIJGNG)(wZ~9!N%e zNDy4$L=kKu0gBRc90MvT9$F}sr<2o*3k!!kh2v2EsDV|1P^qI*M-R4!@xy&@Q-SX7 zyX!r3ZCl@Jxpy9R)VAMkTibnawQc?6`p&C2lzST%Itu^UN;;htrf4Ffb4&RuU|1f) zw?eJpxDg1F-q;Rt5-URJP=g6Mq?45Ap)t^$6H}#`GOV%I?G7Lib0Mr?IY^0GgnAdj zxOZF!$IlOu(VW+}l3N2cB!Yvx%fCZ;3HdxO=sx&rjbr24;*IBg^z_@ zBhQ<$JVj{P7}=raNtz|gwe6Gu03ZNKL_t*jpg2=;q3FJ5NTd|w)HErRBsmB$+*4+R zOxv|hkqRMpfCM6pjU5wlG$thz7*ccmB8?H4sr!NhjeUqGDbWWW1RRDTuaASLLu8Gi z=N;eT2+kvh5%WNg7xr$PPxz^`7xv@H>8#icI1R^RYThnrq1n+?F+lthn1PXO@3Hzzn%=$q6@1wE)Ui&`2EcJGcU@&B9Q@RL@QLuTp_O? z+(6LdTD1OY&DoSQlufmX00Phn#BvGtV_EVZik(0*uaQ2g+_Ncb} z6g?^Gjgt~w#~~qePUrK|crcxuSP$I~SI&KnENxvKn#KX#gXhGlZz=k}bQ8OW!ghBr z=Lu=p8uRk2b&xVB9J+Z5jhi?!Oo;#l1d;857Si7=CuiG;h(;#jdJzOPgzXJH9-FxD z!BfIfIg{)4fl9`NzI)*8%(s4+kEO1oEHlT{0^e${(>7Pi9ldURr`(wHrh;h(--Ht- zx97(|)EinM6+Bqb=(P8Qz9$h&}cHSwe4i;p8s zSxA`4IF(7E`6@MrsJ!4hriz$>GiH6xPNqaxrKPeFsXo9_-;>aJsI*Xol!utlB+u7$ zML`d};UXXJbh((llZF-j0E1{$JdN3L; z=Q%wxLJvyH6gEd^X8*Z+=);%I<#E?|MNf{}-HhH(0Z-y`m$JtsD~6)cVQ8eWSt&O3 zI7)_R%caNP4!-+L=k4o(R7#!h%0-kaE{{QHfvu)JVNLM zcBBop4Ar;G#$bj(QKLoEqz0jdXr%c=%yo<~ z%^!?*4~;NZ2*T&tLp?569|St07qe-! zuh&E0L^2cHx*5TCEE3{!I$dN^0Yzz!7oc<+MH^lx0m?9}xd0N$Y={EO9th}!oRHfj zxjyK-n!&Ur@Zm#Al72P|^&1AzKi=&)qhW8g*4=Z$Qdb*GK+?5-oLJ7yPNXX% zO7O^11S1C{h-VUQ-|K~x>f?G$Id&8gcnx?fh+RZ+j-@=@N4TsVfSsLNk>i;K=6n#K ze9BGdXkWnlLW()88X_?nCs>pWX*!O#apqJav+o(6 zs%A-I;;@YnW?W6O5R#8AK(ZVa6HAcDlR5+lDCmRuz1pcJc7KQjCI<2&gDZ8DO z&V5H-y3nl=Xm{xD=N0p4bZ1f`l*hk#KUuhc>pjGu;7mwMO4oxan9BJ<`XvF1A{wIf(JVR{(-;DR6L@(Y&y7iD*Hqm4 za1jkVw3ra8!O%OI?4OgmoAP|Y8ql;s8LyO4{03PxTiqk>;C7kHs3V)*4aN!!&yD3N zHE=N?dXQGt_hoGCz+e&`$FN?2WeX)}3T`11hk8obN{0AgycIcQ)AlFgL^FHjP9%}= zR30whh(w$&e<(lmj=irNopa%=uz2*AZX7`s%u$FG48>>1BN6r1Vlts>rZxKYy^YUN%=Qc_lEhsfL!4;S^FrX{OcRAg zIEh7prblDY53+o<7in0WlO=?QgE3TBI`J5Gd?ysf-TM$FD0c$y;F*1;c$$0@8!Dr1 z35}Cx7Xlig8FQ*`2dZnBt~-_-c!CO6qoxc%nr1o>lRZ+I&7C?~{M_ET$|d5-TW%`X zN#~=%x(JxTL5A>30=>!rD@dTez7(}fq!HpIMut2r;)oO2eWjlqm7hhJCtH*0j9w3r zr8bh7aM-^B`KNlr^~saE2J+d286dr0?eNlLKfx-TOHhdmcN5Et?2+KisiyHLqO@ft_K*Xvk`@6NdiW{45N^7cX9XVXrq&3xX`Z9w8@2 zgAyL1j89UWK#335oH&YnDE2+GhelY8!i*mpp+S1UK~X4siZ7#Ba|`iQm}XwoVX@SM z)D#rN(_j|k<_^HU0J6L>*$eC>5G-OC0>TLSkxi8Zv=&qHh_&*$dF1SNHsPr2m9Rhd zY%d6kV5~!}!MK$+!~2Q~S&#~7l|k2)gG07>f_7ny=%XWaG^IAOJuVMJS2}LGV+X^+$j7M>8`siA2KpeGJ2*D6%YzB*~u^5CmPj zc5QKS@dHoxNPqt4e_p9nXqrY*G>W4C7`Hf%Ez2SZ;y>`gIF1KFU|AM|Ah&MaLJ;KP z!-vggvr?((y8a0G2hQyOlQtjje(%NaeD2HtJWZ3pLqlY=ro~x;urX3hi#kttc6&#~ zOoOzaq@^*7$5?10xam_Ve2|Uz0ZC0j1GX@UCkiQv(rGzn3&_~Y6~vB;OlRdy12jfs zB#a<{2e1{;@NPdYi7^~FLEwo53OuFaS!@{Pl4J+5F_bX_FI|0nRZf{L#D|`1 z)`M7NR%7yQ7wPuHzNJ&$n-#E;5hi-&71W{@F{=Q^cPM1+o%XH0MfhQsOc*fjIR~M( zcS=7~%kC|!>U8;2Z_j)}Y5Pt@=W{Vn?J33%LLPoObOgtGim(~C%@rzrv-4QnYNJ>2 zAP|toekKWP&H0esf<{fBp90yPY+f>Vgxq8)h`LPvwhj`2)N8O)=1OCGhw@h%otsmq z`hBG6Y@kiQCZ+B-pp^Pvm7p2=SbFl@%ZX*gRMYrKBSR*4(5fLZFDqq z98lh*;`L}W%XItZR=X2@+0MRwxU;pf^HjtH=`23L64mkVG5smAoe*oZ4bdyg8jc@zjQ>-y4_bJ7tcVs zENV^YVLs0Wz)#~+S%MTM`lx&ueCl(2XirrZ{(i4^dV*IXDdi7elz*kW-#-hPWzt(G z%63o|2-y?zSLkd~i<6`=K_~^19CJB}gh7mqNxx#LCQCJVozvQFsF5E=F2#@hhl0}I zgsft3%jEKx>_o}NHz0m63V3Gm9r%bjWFYEr7?zhZd78=&a&(MOZfLuoRQ7O$E~)B| z0i0Ff4RSq-8j+c(yT^K!+1K`Oxc&2A@X+$v?5fsI1@>_+jw+d<%UMs~EJq{u9sOEM{W zty}j;*eUtbXx0GT_e*rJ!^t5bZF31n5gxAZ$I*zyiMQ`R2-j{EW~JNyXym}@a7b?4 zhj_+k$t;f23=tS^0+00AnSoRfjard5k0ffYHz{X$4)aW}0RRr828{L9&e7OU!(QNy z&5((2`oSJc8}k@ebCxz z2V>nGc5z(`10M=}(hDHSr))EDH7>&OQ1=2j4owusQG||S1YmFoMR-g^2m}L93gQ%i z5g4UmLI`~v!d))INd~yZZK?Htt1FEltc1`;nImP_lqw zVW2|@V;BQ0W09y8h6eyQ{JdK;r$ROIxeRGt!8qB;Tzv26{5zB5IA8thSKojC{msqI z7hZTFlgYgB!VBO2_P3{|rrvnt4GhDsUcLIA?|f%#YfF~pWHR}v>(Bn|&yF8I{)d0~ zhc|BA$mjE4``Xvm*Vm_}roQ^suRbci@r`eorg`n!wKHeVd|=BS`P567F1`5Tix)0j z_`Tozy?>BfrBeBWKlp=p-+h;5*;1+WsPS9h`qr&mw{G0H@xAYTZ*Om}UazaF`ugjy zBM8#(_uqQ!t+lnaUwqELNVjIJ-hb)Ezx&*;eo4VlwWa1z_^P2jRxX1i&zk51Z=|km z=O$7+ee<-Ku3>Dmt&?QjRl7Nel_yFt2)d}a7mag6B$0;qEKk4t4guHi+36EFYLQ`E zcQAw8R82Q>SO;r`h6dFp$^UyU-r;4XY2I52=iDFSY7fqo#!MgA5;}<3JUw&zUfn*b-!-?=(B&Z}sh z%qL0jrOjwg$#%F!7e;B6w+w?aV& zhiQvtOa}+dpp0;pC&cVU!gaKMPN}4if9$)x_m3%ywQLKq5FYXs5TOW*HM%6}doiB% zTnwZ22%#{@1D*7sOF_9TJK2#_7%p{T9Z~EB5;Em^J7{Pzvfqc&Ht=I4okk*{xM1F) zGda#baNAU5a7x-n(Ruxom8woN4XQ8E(8* zMQj9NPUGT82+x$3{F%8*>Y3K$kx0ox5JHXN$4-3mrGr-f{J-|3gO@U&**j<+0i#8d zLZl4Dbo0375s_?+1++g44^di!MJD5>V#<#&1owg>X5XhN6_OHq?L^oPh-L`cSx8Yh zIUNq!upxlvFjh*+HAlN`kJe>ly8~*u_SI9p*U4d>8Fi6^j;bbanXB-@gE>bNVRp_O z-^QX;&za_;;d7^N(6x-^D}H$hN&>cX3jE+4Kl#S|Gv~vwBZU_jcwHte6hR`-HC)`? z@1b5&Ezb%w{j_6`71+{PveoMw|J9d&x6x=`{PtgOt=}gbw}-|}hQhl1(J}m%FX0&=|jr}VtzwyR_zGAGEY=^d~xlxaVPz**O1R?}zA}1`I zIVm1H`+@=1ES!KKnZU9btjLusfUsS6!l~&3Y#<@*!V(e+=?p#jm^8BjBk4Epch)zR zaBnXj^r0Aq!Z;2?$T1)YK>>_|APnQGe;adpK9)0}kb;O9CqiH$F(zS*i$MU1vDi-f zXo!->J;>*o9u_^_ZcLH%8eU)NHe!fTVGJP!kW>L)}jD4F*vW9ATYmbNb5sW#)cyE!*gCRR=+_?YX_Rlx_u3ft} zGc)t0FMVlqbMyJWzz{*bY;4R_=YJ&lB@jR)!JDb2^K zG)waS`p7zt5r(ZuA(0T$n;|!{piC}<8#bLRbi1v_Yd@mt%yy;lq=^z0@!kmJBZsB~ z#)>o!@1r#B8WRjJQc#MDA^_G+qZ$Z%P~cj_QKZg$kpYd$4AWH)o^@IYmW(-eJ3ON1VJz+wm+Wu(5RRn8XmZY1u`-FS1n>y9=7& z5e}`S{_FU0!ziD(wvk}Z4VVOasGAAv`>SL)d@h{5xiU*?^+i)`Bv-RNc}GSrZM>b) zkEmSQ;q#UO%v6pIP$e$9_)Ld~3%%hPSBFZ4Szo;qd!Gg6?E5J zt>g?jXxtSN3w>mm&*ltqkBs!rM$$7xiZTMa=n}V%KCP$;t8&iLuvwupH$T-GzrW%W zv*p5l?X6TqJpiya*m8ZM4JE+nVBQ{&D0QR_%W;Bd1Jt@}YjNbcT12Y&`kLl1XpoL9 z(U9cHa@a3&D?Y^LYL{Xh^0jgmW@eI~I=33HxNBMwe@2H;vZeOQ8KJx|MF z3>sqzDt3Z;2_+8#)AwQ)(7tO+l;C4=A{fv<72=WR?>^slx1amkr=JkW&x%4{we2O5~>`q`(si zhCl?KBEk%AVpPaWq7VQV&SkVT<%%g4q5fqW`U`1?edANqRF zREBm5P2{Evw$W^m?hPf{8(w)DIb@}vz`5sID?E;f&Kk)ic#&Oe?I$LlIPmnm+bho>}Oti`SpIkXNMt#GAtHhB+W(afI^n}ES9SJBrP%w4fLBsU?U-exQjR< zQKYSo<2W`oALs{$jo8jm8Z`DR|McIr`$W{AH2pZDs=W;u319?aA-s@ct5fMyAOCE! zGW(YUu-c%onTxGlg)lPjh{RDF}b{QSto97j~{G}y;dC_ zHe=g^JQIp>D2(7x$HEv6Yz!jOo*&}S^F>`VuohnlAdP~tyboZ)z+Sim*fM~K7=uQsR;Fu z0K?Ddw}I?a<9*n->A5MX#rF1gu~@uv<;u~cM*#q@ zzWVC1W5*x}x_tTaFaPo{fBoxUfAHYJ^Upv3>Z`9N5($puE?>U(Qke6m;SFe-ik%ucKvJse?Kyw zHmR$GKZW2sl%Kq^eeCITFSokSCDJ$xU+a$-31-VOX8_AhBo4Ga6y;46l~v!$B(C;G zq+?4CI^yjQBN=qDe5W-m11xZx#)!mt9!o{z06l|azCc%4%68rN2c2_63`~f961Wa^ z6jnnNycGN1&fU-W97D6sWd3h}vEYkDDmiwoObk#OYdd;@U=LX0&tCrKvK=0h=Tmat zuTuFKCowDzFeY#kMB)Go2ns337{kjPh<1UWL$S8f%Ond;*8rw>;Cj`B#N!Mn&^z5d z3DAR{T150b6}N1ePMC-fnQY}w-y7i=_1maZ4WX`>Hw#gsF+EYh71|)sI5u7P^(!%CM(fyf(e>?LMl4}$rqiF z8bE6hwge97qR`UD#|?Rq%Tx2%aQl+PtTduMI@DBi8?#5cq4aA}KU=uVJG^_hHnWLV3D$e8YNAqUAYmLXW#1lHVUfsQ|NM z;RaA`i(zdnd^0{N001BWNklKwl&E=}(Zy zZriuc9zOrS`O!xK@;bgOwy)(~*sr?wmiiGk)yATaA;>EX7}Z}rgq~?K*T_ykGo1K- z96oy>AEU79Kl#Wvp|{PEJn-Y?Mv$Xs|0*5u2hKABe^;(#3UAUq)r2@B)guC5Nw?DXd`*PQEi^~%vK}^$$4Xwx9ejgJ`5}!+#4b!~U zS)*ZK+oQ4(IebFkk`QEs)rB5h8S2MZ*8aa)ewT27{N#&VDw|l zhvIWn$;`=@+6Qf8?8Ge3N*)dkgi>fB4Gu*e&jwb~bOjMjEj_yhWm9qV;|H2H(xBQy z$iW~8fkGFGAsB=JV^~;rsQ|L}(KzM-RIm*P^;T3*OrLo@Vc^y}?~_6#kgP-mtt8a# zP<%41ta8I;RmTvM44{WnE~jW|`iTuH`S}?ADeY*}2ahaN-=x_p*N!pu)?T|xoihf^`MkO84er$h&CB60BK2m_v^> zB?M7?UMYX=-+$@no_&vUW)wyJbbpf|2oyz4(|k%^hl4AWRK!y|1oX=0LO7ymi<}OrfG5<_tSNL3RY2+R4Vn4 zg7YuZH?y_oOD}%wv%mej4CLx?fa1uO-YJqY%|WaMcR4KE8Z9kP-R|riO_rI^e^2k_ z7_6fYX@JTxVW-k5nry``Jq|T2Hc&E$_!&1!OeMvhX-Sa`g|O|4Ft?8*`9SN5g6z8# zO%?>mL_&N_Xs8@-=A>#cgr!d>JAFS?I+@T z;Pb@t;XM~G;NfY+9a8y$7s^g@1iGlV_|e2%C({p|HipbGp?d%^!En2jl439l30z2( zhmn=zBvB9U8#-&KF&$H|o&|#tu0FK2L!!3{^MsHik|);u;Gw$|S~F1MtdM=qsC?SX zPfTT`sa#$~v=#~rom-ShTPil9VA1NA!(fA`<=Xe2OD=Z{R8U^$2@{7GJfH`CvFk z6*$nk<3?p%pXrY&K%(d814IZY8@K^MlLOPW$ks#4&jzJJSQB-V!cm0br;Y!TlXWs8ZwwrAE20FGd ztDn|uv|r1N?P z<_OWly4e)8x*QD(UK`Dn*HC_hpKgzC7uvT!giCjhoUr#TLRXfKocde5P+GtAx*wh! zzvwtP64wOeYyqq?l-nSyPB%@EZ;M`WlkFZKRql~dGCq6-9$jc!C3zB^Bd(CPy|_+nfuuJkIl^;9;>5Lsf?m%tyYs|xl}5a zN>llCzPVm+4ONDK1ApYe2uu@sTG$v24c9jVEa3qQioAgV;vgK2Wt_RwFkR0KIG&>r4Dz<|{5YZv z+(@`AY7OY*tTXdOgFMlV*o{r?=CxIKuMG`{h&hCu5d@(SfblqvFzl#ihM47ZDFibQ zYu5tYI^yI0CJ*lZ)b7G)vt$7qORxKDIG`K!7$&(GO*XP?Bk|?3r>ip zlcC~KG?LA6&J+F0$!orp$LOwH3<2Gvk_p4IaF~SRQMARy+B@%G`?+Tyf*=_7|6J0J z=1VJ8!(0^J$5cG>5OaIR-f*>A&{ZDX%Vfc|1{#n%j!GVCE zf@K)y9}DMSAZK=O{ozaB{mv)9{2N#VAu*jw3U@SXIslt~D0`;K^ZZap#p0+ploN>^ z-wAxG#7icI(gZC^1kC|62!@(kMlg=Wka%RG_!LJsX}Vx~9a_k;w4yn*ET!xLMiMEG zRBfz;x-cW-L~I#Q+fyb&zY~TQ91y^z@Mzr7*WS6Jl2j^H>{^9tl5HX;?AVgG!=oeD z;%$yeM~N0HBz1Z>?jd6@lt>Dva^j2{wRkv8;>kSj0~`_szNOg31c4(oMM8>YjeMXv z0r1RXapLw+tESTrjUl2o9kUOd`U#^OkgzQ!%XZgxW>yI(NszB@Z3`pklhpm)RH6mV zqk8Qe)H4yiXx}b)a4w1NIqkq^(Q@UsGMj3>J!U~U(x$EZT;%NIxg%Qb7Ew=_o;6nH zE#awD_~X=MZ@5+gzU_|fQ1+tnZFFV6yAB(xR`#S5RaW%z7R0B;}*S`iKwKz z1u>OtsQVJ0EJ{Kr2*Y03qA&s%SQy9&9ZVkD8r2^sLc< zHH>IG5RD*bhV(jeyhltYnDS($6vU=V4duWM;xXqfw9-?0*gMWl-IQ~8`_0JNI&9o0 zSx?4S?n3ynn9|}w)fnc2Z1=*`8|!bJ$Skd9g?onQ#-?B+b-+)=or$OoBf!_A0ZT|O z$r5fquFFt*>;er$RdtwCU53Id3zOHuXbC18EHSisG-z<1e8+ot#^whxHN&&xghZMk zX3@5qr&-ns_oR9@K&YzQ@dNfu+kDZRikgbaUM|j=B$| z;9trV19kwzL8*{M!N^oDmxJZRmN)jS8Ywas>n1>hQl?$uk zIyQRe2@k$5BspDAH2uk~JAYpK;`RG){|kK4%=En3iB}c)OzhMRPXmY! z=!&NeF>_g+;ua#?Z5iXJ3)disR!Q_TdJScagitzi;O*7>22;I#HRxFsxRqrPFDKVKh|( z08}R@SC$WvKG?YXaBWAmP&iH|;Q)3+Hwt|v7}FMM$2g@q(ErWeeKlKlo(FzkIfuRW z+Bu&bI-TxD1Ko%ONRc3zMGf;DWVW`%8<~TD_-bV>O9T#(13KJNzW1x z@#^Kyv7To$#K5Tn06I)b*Gn=dP$n4?!# zKR(*WFz+lOrNn3)Sc2}f(}Tp@SKX0B%M;4F{lVjB|Cv4Onauw2KDu}BCx7{aFMaXb zvdlP+$*P55HjQx107wPPeUJ>!pLpe^VsF1&u1I8>jYD%&&X0qnKoDY4IkezVPihQW zr8qP%n&XfbcoM@R1}OvtQ<3=yaVV5d0xW{8$jsyD*w40DA_1A60milGfL?((A>wL| zZZUEKv+42SbC<5?hCoj7>m{-HmofZOg=}B(9Am~^Q$TD3e#}nGv!x)KHvQ;%7iOyCRZyM0Hw=Ouv5vAqZnPyk%H5`rVP5N|HxZU zoN#ga<0e)jG2n=|eK*|beC-o|w$6$-%^Bh*5^F;bPxJYSY14LwLb6WzGbG@0Iib9n zqB#Stof7IOl>$6*pvI=7ym$XOf4h=Bq>+c6;3*mH6};QI@GuQEB#GpN_cGpdD#t`? zo>p3rp<8S3Q&Z?hufxexrP7PJ2|_1{x8bJ`RmDxwC8vLYQ!hr+O*y4qZUt@KtaY2) z<-)S4@{^j^3v(hpA7XTM%#?)uYH)D70R1i&R1->9Rx!r`P-LBxJg&?WP(ej$WzouE ze#9GARLG$WDpCa+kvo_hR3HKyEfnWPgmxLyhfc_@*g!1{5Qz<%V5c~l#CVRu5(E?} z&X<5L`15R>^Y_TWVcZWcjo)2P4j5ss6x>TvGq-UeXs_GK>ow^&PB*U2jLH0PdiitT zusm^5YDKciB;9}`LMG=hO{CD?Hc`)`Y%@&*wU4l@!Im1bF&5p%H6lLul&S(Mw~Z8W z1GI4amTfO4%Oi2yOn528C-ln^j{~0ocx8^3e`cl8#P|%q;9Qu}xjYdV}%N!|;Qz z_l~f|_B+V)$M{?GDEMb)73-u2Cu3;N7jR>jO{%j*%dWk|5%z*$+an|FSM)><)zZ@0 zLb2FvH1xU73;e>u!iz7wI5sCIlWqi16!whrjsIkKWFUa<$f&&9q`sWm(QN%`{E_;W+7JGTB&PzjWowVx#up(QO~4VuIli z0K8-pBn}Z&ZCi&~;3FrtZN*8!b9Npaz4PRK+~4QJ!Pk%fK5vgWoB(K&qexW}-}sd` zikGgvb2{3!cr(owFck8&o=9nsgDErfj6&L7Xp=+Y92BQFl z2t*kOGXiF0>Q^ASZ0(D@?D-Kt6{y7~QoUQK z^E5?rUNJr-BfZ2aeT7^P;woj2X@Z~?J}r_0NN{l~Npl7k0q6<(gjv2v)=iGgISsGIR_9DbYy_v7fk z;8O`dvm%uN2~LLwGVutI`cyP$SS9p}EahW3g90}OlO$PlK_*inPR%T*PO=J9xE*;0 zLo^x5hSudy6|y{yiD-f)y!?1RR#TBC;YPU%X$Uys!O^`IgNlUHW=d0z;K_Jbn=B@Y zEOABO8BpNFMM*4FXyMdP4(ASyhoNVR5jIWOfjwT!4Ae?2-?}UVy}9=2um@&lu~dU7 z@<+S2tR4MR@6$x(ZtIhUXu87dC8pAqIWZ_&3T9O>9ydTdV0eYd2E{A3)b4*5( zRehLbr#QLL?yQ|A(;0@N#VtH_JeO|p>=HgdWCnrDE` zaj__pJwn7s&b4CrfKYv1Ezb@*oePJ2JAZN;PoXdMy`%XOfu-(F*7h7cJ@TI9*A*I zh$eh$36a6YzDos6NZ`TDhXzbXM25}LV1#o^(Ii7hOgQGkiI3%&6ajv@5G2B)ikPG3 z!mqxQ0l^xqVf#6x=Z2P-X`8{g$7>be<)K?;@f&fri4bP%%m=%F{XGBWL!MC^mrD}U zJvx243i!a3N(~aSboYZM*EIi9_*X1pDr=fErv8VEQ{ z*!wYc*73Tk*i0EHt-_^jED;Pw2x+f_SC z5;Eo?(pe$l&>}e|^jM{mregz>6td7u$Ir*yfPuBJSwNj0X6L*>;}(&F;cv(rKWJB6 zD>)^Z3?hbS=d9DUIUxeHd9`)J)iJC(XR0Zn17F{Y#D~Oup|Xm2{Kok&{vqolG*^WtYK z*#Dh$-~ZeDh+(fRFFK9`04Nj+zVH9T&3Fi5x7%&E+qaJgyBNk(jS5DO!Wgw?BI1a# zjzu^cCQdXc1qO&uEie?!6E5st?j52jz#s}yKr=|KC^gP3w=O;RH$n1&nN~7FVq%D3 zV@BOekQ8{l+b2jQz3}R`wDRd*l-=7w4-R0Gq8JN7h5`>w0*FQkMqpTsA>Nj&oi%>8 z;oXK3x2sZ}#1gW55gA``4|(if*&pRNbx>^QDLT zpb1l*tl&T=!L~h(Fup?3h9`bo?k>)+s9z18IEm^oBlbm@> zqte;X0U~?bc2SbcOXY|pdh_Y*AlYbC^9nKXEHuqfj1K*nqM1BFrX)o`UV)^_kvx6! zT$o*|DupIf%t1<_c|4UUkY#ZUBjB4UGGQ^(wjbu)N3+Nz-D4p>YqL0TvMLj4+k}EmZo00{dCAfU9%FqPU017}8_~uRw}C9JcWLqV_kQ$CGW$+X zPrvo8Z@uxx8^8Ozzx(ZPfBP9qp7qNmvs+L0{`~uY^jqKgjvl5qMkc{rcal8MTN&PA z*pKY~*At~%r8a2+XMpaw$y6&5ej;!5}DmdLU}SnZT6 zku_G7W`y_7;OJy(7+O#kW5o3Yz!N;BdEihxJRR;7I9{c42uiQu1g7vr=1C+G<2;$c z>o7i-;~AX29weHVZjjK;D}x#ACRsZiA_=+YCq*}c#fBlYsf-{b+-KG}Ect;g+JlpC zggtBVb)PM>>7blOz1(tUTNfwYV?MZ*uFiXpP_xpFT;0K^w^- z;Z#gvDKesF{=@0rmmiE2$$P|6hr`{=eiSiz4`Z2=;buFgwf(TUe1)TSIfli~PWvA% zR3XG^zIlmbW=~}0VA!FVG@RY9khWewGxHY8Np?sUpQ3^rn>qbXHPjLUVoB;ov*ppT z>+YlWJteqFfRk=`RMiGt8To>I(K61K@v&zZEtej524MIUi3B+zABs0)m~8F9CUV!otU(LfYR6ooS- zLn+?(gYMG-tyx+*KexJhzmJ4L4d)DCqAA&!my{&P7w{c5&EwPuIEIcF0G=LXI5T+) zDXJakHD1W^l$|9r&6|74^9-i5qUtW+S zq!VUX>Y$zcEE+945A(pG(HTI*mOjZ9i^r@Q&aKqzGoet-O0QM0$Jl6S8UQ6b{y{#9 zaxPjSu+od?er)wG+R+^bYnnPpqBB9oq4tQAzZfQ?Plkq1e+FjeceI^iegb8G%@axx zMiuiC7d~?1)JP%_*5h%Xdg5gyk=3r`FxVEXet%94DE#W>O6OO<{sq%80R+Wj5o8%j z62JcIU;E$w=>MV7`PdDV$TzwZL(}S|GaHL#nY2eJF^|)Oc(x zu3L?z?YqLbR+2Hs}>>f3*$i%2iZA^Tqpo=7d3Ufyg5?AZD_(NZ~Z9VwzZkkR?b&N&)}^ zDsxas$5I)uelA7rSvFtK*c+v0cQ}_vF{k%dX5kl^YRJuW?8GcAiFBdMEA=$!viVbn zo+40l-HAT0rl6)4P8`oZaT=1Wl-Z$XlL&~#K0^3wMUqA#pQMf=7LOh$&*vv$G zZ18aIAF}@aD9~8%C{0|_?c@HW9(J7;efQLNfQUH<=X~!#2y8pO`&U2xC7FG**(?Zx z4?p}c2!dxad)6cE&daL6M>i^n&phP_|1U`N*C*HZjrS z*efYqFGYd~7HNvdGf40#O|w~&W{Or?zHed42%Ku8QujxCI6~s-m|!{xCZi0Uqls|H zXBrEp%c;2^SqgOWBAX^2%8O4A9<_N|;;IKE_#!;1BbYt*W- zv4RsR2zjYq7qChXg2e#Mgos0F1HfsxwSYg=5<8e=qu?`0aq|}-XjvL6RWdZ&0#hef zi~^sW>M0X0<%mz+A9d8vDI&Y;-2bw)^pxXPot>Omdm8aCaL!_ZJmE_iMyt+Kg)VbT zZ`#ea-3z4Jx-lD~!l2?M*B0OS5nHJZbs5ZOl!V()0?Vm*Q!-8hf5hoKuDet74w`ko zve;RC@oRUNep6okR*YRj>u=iXR}RZxeQV*x?P66zC=`rX&BdD#l6C^OE(!SR%-Br}Lr8HV9;pCVB9w z=HsX4L5u2mXhtwGs%I?<-GgkAx9~#rpjeCdS5%?e2S)6Gho&c zdWtal6eD@$Hr9EIT;FG-q9i<+!-muEd(#!BvWy@6gijMaRl#G$(<&Dg7{IljTTKH4N&5-0gFuH)eRTq!%U`{|`K`Z}uf?8J#zvoyKg=sd zRFHKcR|wTnc5R+p`sb~y_%Z?gVK8p0D@LmcA-OLm=3@+ zqzPZsoiXl(pC-a9-3N-*BSA_*G6MjmkXnVhaCs|I7T*K8K@1Thts!a1um@b(2XuxZ zT-p!tU?Aq_a(UQ|^c(kqIYDt21qg#Dt9~F*TnYO-5Y18BRuWqbZ4~+hhRNtvU-~Rd z-gm_*L$ORYzJO!bS+v6!x?I^x_FvZ?%Y1wwU10H)2K@kuKz6@0(@ABG4Ky`RYeY#R z2*sO}!{Y&-l>sA&{EVGvNGeIoW!K0c- zK_fv3vV5QR#Bou}G3!|KulVQJ$#Z+_Uy9JxRNeB~FTX0EDV(X^YJP)hzWKu0Ho@-QaP7NB8Eegg07^ciT$<7?KFJGPfWGeTInMa7Y z&#S80eeWkXetBf}@ZrNRfBDO|Z{L02w#vTW_n^^BFnd>Pk8z2PX zGi2HdVO(b2Y33n72thA}g}h8Dl%;tJ2~keq@fe11j6%i-Kh?U-*h+UkR?<`7%r;h* zMtw(@*b-T9%lMd;6j9#yoaq$biBy!zhis)l^BE}~MCrrX3C1@V+E?iUi;+Ho5~51` zo`h#O&CH{?EKnwh4nu2fm|`&6ga%?6Ho>yGr6T+tiD_ZtX%=&Mh?ZM8QNVKSbi20% zf_AgS@q(s3mU1l}Y7|wFU?~uq{m6fM7z!+|qA^ro?Beq)k#nE`+SfIst5PzFk*B4l zrv~W<^Mai+c{LRX$u`4cyHAF`CtV8$Hny12l$1`7t;4tSo4bYM12bvUr6Mhl#El{e zSk{Pp?mglh0+vFtnAnd|tYfjHr!#1%QwhTP?khRUSwBbS*1MB2KG85q*{>EPbNrq* zAo@u)pYvB248vVRf`E6`|%9%GixtVzG>T&y8SNZlG>gsUN z{$rc<@6Eveao+gQp6QkT4Qlqz!Sw0jAdUxwjeJoqe}yS+wAmPoKgFCUwtYeX4+&!w zdd<+Dg%m4P**I{E3q?%oaa4Z_>Y&%ksv7gTFlL0}AZ zja1&5TZ_}j7GuFl?*Gay>QpX7|IU@_f2%N?)WrBPG=ty`qS0gdXHrd zQJ88|*>KpT-g{hPiqF!7l*WB!#^M{uiT1WiCh&2I89T=*NkJ zdr{=aK5T9K__^U@)jDM}IzqD~g%XFISEoMdrR7%#j3#D1~4ufL0hN+UzWJb{Wp?8Ru3Sk|G$EZ)6dLF-)4+FwIlcUNBvb zcwC4gR1YA#8x8YTb0~`1>_qF$x;VxS`xMtcg=64WpKzZ`JuCL7NJI^@RlO|R7C%Y2 zrn-z5S4_OTQaEqbx5CQvT>g1iy~@ik4EPuFMfVVyD($x_)z|Et*jTur(rksL{_O2v zmN&Cfsr2TXZ?3JaJ!9Fkei>!9bG-e|+dugBzx-`XlspvCqPUdC)6B7aq9hmYMb-s8 zyiS3ay5YFQVs_>-WS!%U43$X6CFsO+tSF%odr1#%hHvJ|W=0Sx&8bCqP96cQ90eJP zOCgD~M9lH0S;m=Jt6nz!uvSpX1e;O_@DWHQfp1#l-j~1e>#dD*ufO(|XSjC`G@6%s zWcg;-K6>{Dh5mlpyL&j@59m(aa)xno8nds+$$MtMn8ph^Fa;c~M>Y#UiJ}uF z*R{M%u3q=Bz#&+BP$q$sxr;cO!SiQ+GKc=t0zcnsiGn!$aaJ3<;JOTz*`Tl z=; z$R%s2Jy{96SCyuqAlu2PmU3kJK;#?AeD^9|94rp`OJSI1N7;IFC&YGwINNTjWvmXluQ?v+-)H zuy_x(u&_ik2+de!5Jf1FDa6b)T9J`!{*AC3^ohz0wzJ6aVOZbP6!ENpTP(Fj7#^+I4nu#iYD^ zm0{CG1o8Zx2+R>Ku0_5@BtD_iv=ES9q>s0@-}{j4**y)QI1Qc8r6;XgWH?I24wS_U z?-9(FH#`-vE3Q#ZAESw5L%ZeuGyD8pi@KqnvW(?Q~uq``FTFhN^D~#K{+`?YcV8Mm^WPLl8Gkm>AuF>ko z{jij!%R14fiONB`GIpyDR?Mh;MwM(+V?!c#W^TTMM(Gk${j&riaVT}|VXaW|6oW0c zl=bia!S6lW&3x7~nf>D(Zy$aC&;Ink`B(qt%uY;*K`iAUMHkECz@#W4vb80lc83ct z&)Kvn#Wb;P*;R;52#7nejY2(hNJ1gq@PbS@RD$7oDoZFvdV4f3&-wwHl~Gp9V(7&d z0y@<^U0|KLyQvm)GDqViO`%STDU7@~A1;Z))3Ns(Z@&Dqzxc`j@yXu(SwOF?ui%^{ zCU2j7@?T%Pc=?4_zx<_NKj_$>C-+stIz;XIv_aoUCQ0q9|Sp zrwJfQt`~#e(eYaH&_ksH;&ANpvD078RtGe`hfy1$=_xIyx;zY+u@&z7#L8^8m5wRu z7%wl89I#DdDcde)80>W1`4ElcDwF9rj!#I7I&Kf2h6^g&#h+Vk5C zi#utCDHVp7&o$$elu>Li7%rn&2(zj;^W8ay^K7X>%gh6C$It_U7R!DJ{yc`EJ;a3 zi);tn;*`ONz`kams^DPR@z&1#i~p|u&r|GI-gd8M$k&+WmmXJJc+{7?_vPWiEdx%c z=eBC!TtAnaYCEIZ_6$t2$m3GZfPN=n2}X)g#(>=|2J`Tk#eBfF3`s!!>86R_=CTVM zdLoG#k~&e=00l0W-yhFr#KKsgvEhE(Kh2}#6=+!qQI3&)szjQlqQ!QuwN8qyo3hOI z2Kf>iG0DIdBx_8kaFkA#qQXy^PMb{L&MrSV$!QPFlgID8KDzx@{wT%{D$S+3QqGDi zVExr!%s<4lHI-x$lAExcFq*K zXWFY;d}A8Wd!DdjgjGAfl|N59xQ+`bO%q%##xV>9UXY`?ZlsfXBh7>bb28dGfAxAI z^-XP_E)0QO5BmzL+jL;h*xAav~!# zl@diflSw7_AyXIOwC+r0`5T^EgfhTr9~WYjb+OPz z2{d*BXf{&&sklz!PQ3B*;X!ZuU<8dJijWA53Pf1RMrAZ7(>l%!SN)kx#-z~Bi2Q5R z8F~?;XeSQhD1u>{`Kga(=`#7vKWksA%`X?L_4fg|q#e{*V}h;;jCkN4x&be$_U`(e5y~= zepEhJx6%me9)sW+2`SVUGHS%yivd z+=`IyvK%kcya%_3{p&yci)S)>)-##?+KF%`>UW%6jSxNCL8GhA|+FaS&BF>6DVPEY0)qlh`Q^kD7vn z<}f0_ZB`;JY?wMtp6lUs9O5F36Pimh;6u(f-Ev|l6gE#{^0e1G-7Qv;w{y!II1F)6 zLOFtEcIHP?xBKt@_IKUi6IF66T5X9FAx;|Nhgcf~!rgZVj3_K{FUhy}>jsq3g@q(YCusm#`!Qfz(?4JsW z9v5E4OuO|w#w&jpmgnsG+ip78wVCeyh2h<^TL1OBm0oGuWP75n`cVxO6eA=l-+Y*8 z?0`ne0u?1p89kdT60=NCRX+g;AlL9jFBgigPvc=DpOV@vS8V>sKnRbEqdA4vCQJleNryzs zW*0~F{+cv*QG?Ld-C_eco{x1pZz!Fbn9NuS9wJUDs;gWhRB#R-kSxm5g%M&(a_;+l zpGaR|cfB5#>)7|4M&%b={;pr6L zTs~X8a`VWxKKMChdntyZXjVk53$YQ&B00lch>*H4O3l%h)Y24cRv4XoFxA6(GKo#JSOHN zu$A8U6>D~Uj<{#jn>hC}0uJ$BUn~I_tC6ak(-aBtUli9PL$?X4w%;xsL|BwIvJHPX9G7^rR^oeihvW!F0r!$?S1=jNNmBy}b zp2IUkQB@v~1E_HHEKNy3Fbs`g$UO5!H!0%ufI${;;dY26b4?)&Y#Q378fyhXhD7er z&%}I1c4*umP8o(3A)t7|nhjTiXKvd}!#4=tq78-`+Ikrk+s5iGjLRl$A46sNYe8SGsqP7pP>idRn8&)qTsZOyK% zUOG*EF9|{u=Q4T%S#Pwzt4$j%lk)(Ymvo*fS#y^uq0WRB6s3A**1K(r8)EO%5|zsM zaTsb8zR*Yf$g7Jg?h;DU!A^temY#@EU{YI7skh7 zG4;~2SVFz=l&oCp|IL@4|0mxsY!Y@Hm=9Brs*5d;FCT?!#hY80SN7={#e9sft=Ros zunQa~n9rHrtFGV~oQJy(G|u8HInV#r++^loL#n7bfve5dt>U zCF2H*Wh#Y0C5WMUP{tqowwyj)pWpp*-g|qEn4I3bY@c3@+dp6XXSdVkBs1Pf(kE(6 z>c`$GBMHCy#--oDN`g82C<=N3IQ0@TKxD)NfG9SL%N_|zbUe-M0`8oninC%49nXr) zoR4>saDc_O9%)^;oCUg?g#jKcXwV|%6Mw|Heaw5Zq4lLGEl@al_RL~F_vz}34-Qol zrQT*=e(xygc2Rjcs7^-=vYQX~maPw~$%6&ng`fYIH{&%BC|(fAh;7;d>kZ|Q4psbq zZ=w+OG^U+A-u0hQ`tb|iutEWbkLJ8U$0^Dt3_LvR8F!zMa^O8l>TUY+4R&lx~-MTmZ z$T?bw;x|Ti9(EYCAu$U)TUq|>zZlZ=UlAe^)l0yNa9|V436PhprwKgeJnT>vy1BD% zeQS4Tl-zwt%ts`_C0L|ll#0=M9#>HTCx$PYPl}?pS6fA5$sn9^q!I}3FsT^L^GK^x zU0qpW$HvGoGAuEHca*|CJSB-h?IY${J<&*G(PSKDs$_m5y{yTJ?dJ+q*?>dT=0o03 zoTxJ!k;H72AT^%)#DhsnleV3k_Hv!-+mok=(=EhDFr9ty<4?cz#+!jYdVKu%awI-C zI_d~muaewDKSL!$L$0R$;t1rH<^v)-8sMayssO{Y$WJ{xN7JgxoSLA?No!kq%ksQ1 zDW-^v5F{Dk2zCOZx+A}f>ic7L7R|@1@69LoF`SAco1#P%#h&TpnaqAE+HCsfg#Z8`07*na zR6Xqf=Rf!luYT>TkR?H6p4b7F5FX1aSy1A0#$a$^srkqPbyOBvgc7(AK#2ivMzb)+ z7=#8<50#f|Q$0V412}-bIDz7bF3}iI}5hbw2`4s_ZkoY==8ew-kpN4O5?)Y-&uq0tX`+Z~ZA}wnaErvOVvLnNh3{OC@ z5FOhiu373}JgOr$i1*(jsRvtEbmJmWW8dACNxi`pY%kezZq=Xr;yW5qp6yZkjKzSb z?+_V2&(fSYl1F zOd!Dt;a@etJ>j|3PAce=L|WV?q>c^hmd$n+^Zt~l&myUcG^qd4WrqXFLq7kxY3Ys6 zzWSde)tn_u7=8`U?$MKWGDI<*rcfN?=*(eoTMl=h+T_Do<)w}PYISoR^LI|?-5@>< z!Xyr;I3*AZH;{^2UR=O5lWUhS4ncZ`Ty|`3$3%*=lgu3ksX;Mf7xyu5UYKiEiWR{T*N`{X=jpUEZljZLRe zZC?4+2M5!X?k3t;;0hEtwR07bX(Lv2tcrW5y@DXI3HcTRbk(r5^dj}BF6Q_13)_aJ z0r!nU3bHj74RWqBxI6i)a?2tKHYrr)%VBLLZTC% z#c~ptu?*KEqh51#P+EU($0yl1f;L`iw;M|PhT}D`w8{{N+?goSys@i?Of2MLpGQ+6 zA|gCKd@jq=Cphro?}4`hVJ z_!Tty^5)g`wS&jcT}BA)@9tKswdtu=rCxYqwZ3U}cKu~8IHXv{$gHaa?cP1h8RgXa zT(wbNkl9$!g;69X;+=-;NOhNIAMD83l_tMj+kblIWxj=l{$Z~Nt1?2=&9jc&n z(=S@%ZTeu?>9^bm3{Ul0)yWDack{T{E)dCp;qFx~r?oSqH*aR^>zL+q#sdNE z7eSZ@u$F|g(GJNMzB&Jive%ol4p?%W0~YXIHp8)u+cRm!$4;uJ;A*31KXitX2=FM5 z3Gcq29_aLwzi?!~)k;_U%@y&eD=|G!KcC@kVn|Jpo)#yOC56;5-XkqF5|)RVvjfi_ zW{0`qh@R{&*rQ?n;%lBR;)|Di z_q$~GgfY(LkFN5M^=VNGHO}=GoMD2qnICb*(j*G#p24b8y(Ay%cA5oNYOs(>C<;p_ zW8Gee1_ke{1q!Z@c5ut{F{e%k1iuhSipuZ`D|rN;*>U*;Hfwvi(l>7Yjq&#S-@p5Qd`ay5 z{QT!W_qi)quAD!A{%>yz{eNl9?XLB2eevMxpX|K$d!zOn`#1liIlOoH;2XBv-?;U; z-r(jtSO4u^`&Gl-_X9&!Xa9eccIC>I2M->kX}Y$y_QfxL@tfcLW~bBn+r!@P=3SZn zWb)G5*0;X+7r*xLe-bdrcSFN5ra3$&LIOdLAXCH0mr9+3HJK9_l;&j7^oFfcdB-?d z6x0l2T0$Ghsd{*Qu3?0Flx2|2haROfSc#xJbXE(pUKFM{YjBVu2*dSGHyTi)P17g~ zVh~N*wx^Jo8>H-HD<9j$c=NqtjpatZQnsB$w{RjE)YK|2L}e}uGB+Lv`;@%OHK@}3 zY;!*0r#6G5qr{#kJVGqh2p*6!6*)&N#B97FQZHKV8lfHnjJ4_#No?U5j@KAiu+sc` zMykEF-sDgitvxBCTqVC&c~l^qZ@2|nvl|fYWHww`C^gw+1fZ~i;)V*c)r9?5#F zK$dtpCz+EZ#j%7=83)!(W33r<4yK=FY>*?{ywg98F_`X=)8}5vta-F*KJw8o>37xr zKdW|s@bO-|H@)-)ClpQNsR;KaJz~fcG(T1bMUObdiCJf)P~n2oc#S!D53Yaf;Kjo` z*qMdjKEHTeL=QImZ&KcYi9!O=B#s3MPGa*uRIoTz8z%?Qsf|0AP=Bg%Vz6*}(s^TF z7iOF!7wC3mFO1hw|MG(U<;VQ*pCYzSH*1BefX+PT z&c2VYoY+GP7O0(`ng4#2kz+3+s~jtY6LVBpCG7nmDXzr)w`55hZWif62GYfZc~vR9 z{^5Ib&%G)#fgM${zJk_fZ4a-?T_C)N2-=0SigfYz`s;Hm3oPQKeB83#Oms!mWgM5A zUGC_k{SiZsU#^O^jFV%p>&3;qtSCtK)J{c3ya-BGA*9*%82R%GxNUobX6=!o# z2PLRFu+8@UePGNb;Huqy+;?pT+qH+(Xy|iMiNc*2nh56Y?qR&Ptc7(TZ!h^1J?_zV zXaW#Ut7CKK%xX;RrjE~K_<_hzhr=!}S;0i+>$+x0f|KGNP0BLb^Kr)xQr-zcmQrZm z$hvAYB~tFtyO~5Mszkbv&zd2DI8R~5b*qmRn9UhkOa!s-Uef z+;bQ#2dXC=1JAlGs{Gdlrr|#*xf+E{=K10}@N+&=<@gn7oen2b1nz`v)y_?wop;#b zpf@Ihj1+~vD5<$GulV8jBz~$(nc|bTINFIYdZf5KfGE&2o6}2E5SdVeaSu;&L0%o} z55$-k{Oym~DXI;=HeK2|IPm3Tk+cF?7898LqaUVlmI!EZ?fL?hjXwITZxRY?Gi6Eg z^F&)Y*`b!Y`6scc$HYZ0?6pD$s7(jJFbI+iEL96Wp2Zy_x1fX$WL-dpu|uUYA|n8_ zc(lYGKPc5X!n~#RospB01y^2FVM!(vnz`6U)oS$(x?z5B{l(;y7 z8Zn$w?AVZUNhU*03_nrVU(%B9pJPO#SSAkeRqIJDvsSS zO9q3R2g6%eZ~tF@?5pw=O$qBuv-`d|LM(oe4yb~c>YJ=| zU}0NZMsIsJDDafOGetsMkdl}XNn~LOLD5y)C0OB&AadJBuN{fyPI`;r23;GUJS>{~ zvU_LQ-e}5rbzzxYI=hpc-6bozFm*Fp1;(jzb&Z5@luS3}jhN1~^$Wobfiy~uMTBMJ zDC_y-^Zh}a*Al&HRhv>w076jAtq-4T_7r-WOY(9ZSz0d+y2Bt~o2fS$xji~-7*Gxn zbAp)~Flp>M7GI)iOmmz(Nl4m%qQ%-!UKU7ZJHNQ92#!3Rd2Wl0hk{(FWu#fDfG5aO#A zgpx(V>9Us)EPiy67^7O+m(NpJoLYN0er9&;;FKB?3;;=Gy6_uh{>!)G>2T&^qke$v zAIyXwJzBnXa5Qa#Cz7nxD&>pTEdmkD>Cg|^(7tu9LtdAgdzq_|H z6bsa|tEDGq7iMk$n$^EKiWBGp1hP07I)KL~#Ih=hsZ$qD`^BPVk2$_#8aD*(uwWhK z@QDJj##~OCeWbAb-iJ8}&}Rp1V=34w2iF@pqc&X^%NOb8%UzV}!gG6mEiZX0-%RX@ zBT=5gJL5J-Q>sF?iP2PSpHH3rnOSVIyF?M+RXl6x&ylJ@VCS%SSQU?AFdqedAVFAs zHXGU1r5#?QkuW8e#HO;QdlE7ZZ@lx|>QY$6k=i80qMf1|QyhpT8qc4bZxBYm*J$qI zMXtO5bYo`IAIxX;#>yj;p@$`ooH17p_Lc>yP1>Hx2H{x2h=?QyuyDx=%Z+4WCnYg5 z+@uj5F5r7?V{Q=V+?Xmc&LAUVzbw;c0@*AoQKZ28Masn*3(dR6>-Es{k=xR&(1!~= z*LddScIcY1mxq}FVUb(7_$!lPrXg^Ipsx3}e0&x4Ya zWzs@3dfjunV(iBVU{*X=J9*~v8Mn1KxqFL=%)`{GWEtz1VlK5MR3@fN%S{1u`mQgy z33Oc?KfJen-F|!hD|fCwcIwe)qaFmo?(XjWYj-X^{us;hAAIKV$1a|oYZZU~xz#ss ze$6>pySs0X)*~;S*2TFTFU?GsbA+-aB0Dl*IPu^J$NFNpCx@Gd{^WY<_YyXa(-1eZ znf>4Rt^c7|ESiQ{sgy5Wx>R79H`d}E>=zwjS*;5%98H|tx8ZOAP=ZKaVq3O452O#` zq=HzoVcwsycDh6mQVSH-U5MJtRB^LXD280ZV^qj|yY!)|;TIt|!oi%QSt#nJt;?+^ zjk*Qge%lDRFkrJ-r%jj8gmk-QGB&vvI-Y`2U7FCb+{08|a{EclxkQ7^@Lh~H+(2L} z&1lEMMs`;|W;G_*lCKh86Nps`? zFf-$TB!Lw~JG^IijzH+J*85=Ws9HDNY1b}4FKwuys%Q(Qy@GzR}#Hl{ov98~E^Y7n%KfWZ^b=^;W>QfBE zT)ler$tR!u@v+o12QU17@5Mg|hC3NVS>$C9rJ<8S6gYzn0xmb}c>_wQ`0gM`Tm(Rb z;tYTgB^dzi$;LZd|5({R@FE9VaU;M@5;^OVww{aY&X?kvM?p@iu zE3=zSbz*dRXoFs^#nrQ82B-%HWl9)@JgN~QZ8m=K=;x>LwMgs#W0E!t;F#i+@Tz6 zK9rB6`%*o7p!-c;4mq)bGA)8df;xZ>7o;l3?iyxOl&sC~@gfkDPA$B1kz9XrakV)6 z=$d>6u%})!Jg?^*=$os)=gLLi>#bB6Gc-NVQ$(z-jZZ_AMq#=z6IyxEBYN)J64|g| zS{4e7D84jkkCDG>SW}ec)SD$Z=Ww6|02@F<7OB`HNVAu@D=r=s5i{DsSeTfI$SV_q zOUXdA@4AH0hEd&^nG!1x%A9K5ziOwmgZ+%lk%N0nGlhc)BC){j-JNA@7Ggbra?(x0 z!agA8_vG`o=VFL)VvRODIC@YWJve^;#5a%s@>_4CW5YX-5{G_~la&(2vJ&|;-MNSSE=_n=S&^owa^!q|@$_j`%=?}@Nw-0u`-3>6IhW1q1K6N%z zHy%5)zIpYrXh&vq2|35ETyEU~XU?Cz+K&HT!-**Owl)3qB^VA@EW^UVnBtCsAm6(S{25Np-br#O3sr+JQFnJN`) zGo=$B-JQBb0^G`98j8>S`C)OPSFAPX=1yFEwQzn&TnI1@#4ITtBdLUtR2Vj`cr@a8 zsc$^+_RsRi*S({m2^Xni+a985S>w!Bpo^8<*W(6e9;g%pQ}B4AtmkZgcxxh_%|-2o z^UkjNhzClQ@-d9%cHJPf^I;a6G3?!YXW_{YTnj6ri%^D)&|5C44?r^K#9O3j}=`#lXo3a;8m8mZE>OD6i7MPpH*`Th7K} zh?SYj5Ko&~izvx}*g>?Ni&+yRHPc@%<;zV5tCDvfj`2uXby*7F>m^>XHV{|v)VY?J zDFiXJtiVfoV4F<1&qlAk`GyQ6+cxiQY?u?H*=jbMO^Tup4i0j;Tu#j&Tb?<-Qrvv? zFE5(fSFEc$d;BZg;QGV#!H5E(D(8yxn`_$3fI=ip>u|x)4uCax&4>90xgAed0 zrOU|2no z-;kc7;|GMduVz0wGVX9*fRgU2b2q>(cGP{|%aq1a=eghMHr&M+9~L~n6-82p;yB?Tu2QK#80S|jN>lY6!i#8>MG1k4 zS+-8Z=j|pD^+qjXYil0{A&%jBDp4U%Vn}3GwyEL;cx>xf*^AqBm_C(|eqBk51zsS{ z$eRT$Eh@(-YoA73pTP0M2J4rjgv#MJ{pd_Qu~5yH&IcB|uNb?p{OBhlv%gys`^is! z@^^ptcVBz$wcq-!-^%53|79Xe?Q7rYe(8USwF8XdKpI0apT!K@m1hi28 zTbX(8AcYtLAjL46FNKNEi48w?Sgv$1zW?Ut|3gu7J-6_8|C`sZU!R+si{n@jggbZc z@I3GP{u56;@vdy%mDx`$U)kGyMpL1MFE6k04YFlz`QFHqEx=ZZ0%q4C5sDL14jqREvkSq*|XObL-GdNi|ZVTnvC zaX(HNnd4g=^zYn}^nr>URsmyH7T2xL2|`IER!LovmGXQIlS#ozXBx{w>TgVFw zVL}Vb8P(`w&-ct0QV~ZdA`h%mO-kA z>LcuEf6>8jSC3&(cf2&2P!?alHr7iz`aq1m$V5*gqNBz$DTE+R$n2&=L@DpO0|-DC zdMPKF!HDJV^Zh4UZyvsUp>pO6_#9_? zo@O`A3DY`x&54_#UXe;aoc&N|XX_ZGT@(_2H?Z9N(VMHO(R%(9|6Kjp=(QJ5f@>|d zQk`Ay2qNRsTEa;MB?z%2ZB%qX9}65`%Xz61Y{V4a2-y-o9uBq_)Kg|fp=s7!J@?t( zp1;>7oNY1$G zxSc}-IkDbHgl2({IIWF$RBzbce_(X$Z1sOE&YXhTn%SLT2~EP702uC2Lxz+|LZaOx zknM$2Y4}W``Lo-Fi+>q3@uS&$`DNhi-ye02!2MaxIvaT3X*LUXoWku!Fqu)R?X2s- z$cZ>PXtN@VduU6k&j#v_b)~@+5$)6`^hlP(?!DTv^J9-0@Y0RV>(huqtO$~5`M_Rv zcJJpm8E2GJa;?fmzlmqDDH@3>lMZAuqa8w~M&i4-Z@VX^GHvtB#DWels1F7{ z%RID0&q@l>sDjugE!@wy)Fd-0*~J*!ONj6x9kS&@InA<}20w)Sp6!IacnRN9VonHp&88L`HI-a9RcfIfXjDyms^u zVt(iom+d8Cer^o%p*u3|L>1_NORv=S4(GV(8*C-vrr#vziaqZrdvGEulex;xkUfKW z>&)=1w_r1!wiV|AucB}S17Iu&DecL08sASLq*5-nSy1CpbLHUS?Pxrp;RuReN_j0p zyv_2^v%Dle4Q9CIY3LpL9u}I06&X?3zIFZOjr%XRkE~z(_&;1)T=0BxGPUM{7?OEB3eMAP4|T&fYy1le_VhN0<gT7^>*?Yuc@FF;V^-lS!TQ4p>Hvo zi?Ds%DRNHX`Ja2V9dxPKup&sLDFSFhj`LA;k}6%x*E+g>-tGZ-M1g^TNpcD;zFQ3> zTeL*~Xow|}`;ekJGQppVF^1Q-1`nt(@ud$XeCtDkB zY|(22pMU=O=Rfg@Py8LrGSAY!@_WvW7jUVNMJ`6tSsFr!r&&k}`6ROG z!ffnM{!V5ohQ+ayLQF0kbA1ibLX>!R;voQ>G(-T!2kd*T)42j zy!_mA&prP53gU;D?u77PzV0bfm`2@8t8mH6RH zn9FY-s^wDI++C!jF;DjFIgCnC-#YlqA;T{W&t@xTzR%1c--OGQ~0&#K(-} zp`r=gaOXxjjTe-`)ud=Rm@-)l;QAwR-x7$DV7|YQSI;b2qu6UIH;%$ZnjQs{&`h1l z+DXj3Nz^C~o$cPTxMYEjLsinc@nV_1!i)Wln@jQ9N^+Mc@=vW+{d!>>x)LUgl*Yzj zq-YzVvA&v7OfB!>5D$|8^f!ZMCF;n2$y7`gYe0(A(arGlek8%zqKr68z214Zy)lP zuD&o=adPF8fP&*FKg6PZ#F~s>jhHc?(oqDsIE%9BjCvS3rycw>xA`#$B%l1$aWS}GVENWrGO`FLhJa0LTtoDsC!IzlCYGE zlNd>lIf`yNVj!Ry$<5Idc0De z1#AyV36)SeI@fi(+o8sdNRipqLZ(DkbrjDto#ODGS$;pK;ta_iKtyY1?Refx@?>-n zEBxN3U}lWR@x7 zzQWrY9!NAX={K0U8#KwgdMhylHs&z#B|lr{F5RoAEgx(8T3N&z6>wKOJPaxlIfF@J z>>DhUbj0KKi0e4#%2O|+JCaL=K~~V~jcNw`7Xcd81MRPb#)>e z2Lh)4+2{UvacLRD@ZbCWKYr~;FWne+j}loV16bUsqoX`HGNm((tV_~LJ?@}rz?jOn z)1khbSvq5rRZuwF%RO}hP5$-oe1>MoO1bK~ZmCqVEaPAPAD?~DDUS%`VVQ>mh$sY+ z3yFlp0T#@}`V{8n7>W_1GM71GsJP?fSY^ACpGO;uGP7SGPvXKo+1B zIUWpQh#y#3Sx+r(6m2X|uCFH#s3@?Kdf%$m0$YkbB$*9t*?IRICmNrC@oc} zlo%vHMHozClms$_kT!F8ICfhY;W(A2ebk|bCSXHaC0@#YPpxknD%-G>;#7a+JC zNN>)zYWQdY(W6q7p{Q<;=don@$;%T3j`W03_#MrIPG4ZSiS4vlF3yr+SROM<&jeE; z=;U*;{ooTLDqz>Q(fX5O?W?c7^Aqnr9LF&X`!7G3#z_0z|D5#p5X?~M1C~R9gUf}) z)ia3Fz{wyYI5iIR6e5!1{ZRK42LX^l45N5IH2pLnDJjZgn$3r4$gw3O&@%w~!Q{rl z4^K58XG#8D!MrQ8pL)Lf^3IiS{^b)N|A&yFJe&X+6hWN24hx9&ER+JS!X}k4;%YP7 z2y1E&kEi6_#j>LhSEXXc@qA!uu2lkp0Es|$za{}^IA~FDlOQ-J!YLxhOV`XnO`8n- zafu1sj3h(6YwQ#;U2}CFx}wbEEP@#(22fPsB!X#{(5X3<;!IJ*-S!^N+2Mo_!Y+YR z4DY#SMej68!SKC{xypa=MzLR<_e@rX+msPgxgtOcD(-pxX{P*B###t2xlOQjoqxQ6MQECX2dPyy-7wL%X$ox!*bKLR=tyr z^GXlEFdUM;Zxk>u2qjU-Mw6lPjF^gNETq&QOf${{$(Qf*J%t7hG%F{rQ!?&b-${y z@@v>=siT*9Mxl#iEGa4SAe|H-7nxTIB;0cdAro)!-=~VrW^8nrQc)^1szA^b%Lo=n zr%@JVR4$q9nJ9}ABD4)j0#S?tPeQ{|)C&lg@q60<^_4s>Qn0N<+A38$7N~GCr5+nm^_OvaEw5LG_Dh-`9u` zCH8PND^8XK#^`;u)Lgc^{bKFS06Q~!;}Yw)ge+0`DiiYV!A#nZk{wYJc@WR?F3y;q z8~b7-2ChRcqS)BS!F2nfTF4z9UJc2)95FND12BQ@xPGcMeeC=RD(+JFJ%z6hmZIya#Fh)fdo}GW*Wx>m!h<+ zTF#vBlUA^uKbby4HJ)BykssOh-(uOD4_ z_Nn(i{nUG9S@J!fW$AjY9t0tY6CeG>r$76-KUg5Gxb% z+nJyM^EUSL6*Wqbo7p7BSVR~x5G9&G+&dE7-qtN9NdTp6=g(CFQo_O%dy*0>5}m2Z zc*w2ZA2SJRa!lj_Y=6){F4eYEf5p{~@Ti5cd%>PExR>8Q+|M5Nj)dv_LQV(T>?{;7 zHk5_0eDf|l%@;}^r>CvgDXo7whG4IOkr<*HR z{^+&uzWwN>Gj;?x*TTFYNCnfiQH6YIGEuZlC@2+{&FJW@VUlyP!bEz3ie^{`XGt0& z3gG*hbJB1vDKj0XN&p6g7%?8(Aw!efzBz5jJGQ-AQY|dWQZh`3Q5)y+(K>YMe2L%* zK)74I9m?Vs@RTi2R|>PSARhRIHmtVOaz2CO{5#Z)hCV(kR6P zIgnD^V_e7PWh2NiQY{#$y0rR#Y6tH6o5w8g8U3B4Kob(z@NU3N3vzNkD?NhU9~YMo zCMN5;%Hh>TCGGseXFju;JAUok=d)S0Adsyl$bf*jwm-;mQlFA7E=L^o@m!HG_8Lii zIMuSe$^jh-Nm_^&MjVBx{GB*xhtY!&JMnNQ4s< zQT3zr$!^mQle`@`EBPkxkGr`GRJPB-k}NcWddtZzydEvaJ?wN*x*f*fMY9hb2_DtD z9w!{U`62V>`~7d95|5-@R)iCc$6g{0W$ z8$j9wA!m>CIZ1P}vdHYk%o;iM%D!=~XR39@kpx79DDqCK6=O;!-F-cr=r*e}4aKl? zYFR){;v_-VK8VRm!zc{0~<{jq`^TbO4Fyi}^`tjhU8i41VM zW`cnp!%7n2vAGlD$S@YdEfiQ)tkO?S%-3h!)Y9XnQ}ZuR9;$vkuX#1pSeY&VVeRqU zXgE}=dUyW}?iM7G5LJc%G>P#M!{^y1jObG3EtYASFeB@Cwhja1fiK_%jHal7jPxRb zI;89EC+)x zZyydAo!s?nhr}tcpZ&-G?tRx@`rdytmtgSWkvQ{M^zfISc~7I>U>Qc!vyM8}BEa!7ji3^*{e9bsutV^9%nboAj|H z#W)TGK2!=Q^l+t+x;iGvi9O07qSZ$1Pg00zr4f4C-^z?+^IoW@7=|&5AKQK!@M6P{ z9fqq0iO=v=J2Wwp*CQuLf;T(YF0~$i7iaIv?5CT}TW`Ja?bm+&qmKa02%;gKX_UJr zWW^hlau`ul{dSHLE51vlu^((zIy+JMV3U`Y&tR1VuS_4ViFNN)sl)12RgD*O0-zqiC-2?0e+e4DUJp(NNg1x9@28!Xve^Gl}>-+AuxQ-2y^ z`c5Qh`zNt+8z0LtsBkipcp(qk4+g)?Yj$g9# zzjI19y0UdBR7A&)3B&+W0U*SyI-5m1`^{DZPR2;6j&bH5oTHBJP5By!hd4Mg^2*-~ z6vp(l#5#BIgVo^0QsAo`H&}S@)Z)*NmoB{+FwghBbB}!Nf8&qS`}YmyK>WF}g;a3ar|5VKX(?t*&MjWR4B8U=DffiID>$ z&#^*=C54rM0BsFktjiA~si@{3XnF{V>FUZjVFUY(nFzcwa)mU7Rv@xMCqh)Euj*1hKTd}uj3 zpkvRov`L22*I$025)J>wKmT7-D>U!D`m-0#D6*W-=PkJ0pVe7TtGjuq)ZzBh51}%s={F9Yk%t^P{i*G`bHZvGwo&S*8sE$AKgQ zae{GN=9n1EW{wG1F7qq|5mlV_wOs@e#t0b2M8V{5WyZ?Q48wxNbrYADr@Y9v6OW)I zE3_##Zv;9`Nmd#o00h21@W*eo-*{^JDH12&rOdlB`)TFY&98s!+gG3b@I^1hC`vSN z#+4UJ&83&y6A|EcV6U<=#V`Ra07{@jdWU~v!kGs%wEC!Evif)w;D?CkO2deCa2;dGC6V# zigxN6krCMDV?E10#y+Qis zC35PpIUg{5bu`ZEO_Rj?M%q+)FD?EMseLCD6Nuc+Q{Klb76gYGAcmz8qrmI@s%f0Dpx zrZex1r211|S97~bEoEx22J_K`<1t|s9*MZy^shhTe09F8N+r3kTr`OJKA{|j$G#ja z9QNEZJtquqUeaGGC$Grk^?F<=R*aFcH?oIzyqUSz;xrwkg5-z^8qomO{J^1H3_2zX zhFNdM@6QE0{djwQ@Mc~k?+@Ig5xUwf>2bcqPo*%|jFSKxQPs1tW@7S+MM^vw`;;m# zp8I$A{lV78^TYiq#(cC?_F83@h$omkXTWled}Fw-4lUW*} zLz7^XqX!#C_3Vh5Lm0p7`^=c8>t!3~d1w=w(?Z1Ex?I=C3{ne1mcarig_+T_xq98q zVkT{J{1tbw+4Wkw>B>Te<@PK{VS1S2fpDxCmJBYY85u#2<7wM)tjJ#WP?oFq?6DKe)ZJ#m)_D~EZ}NJd00k8U=+uo9#q~& zrLH=|^~uv%AR~aXF6q})xwKTommj&j+1o{4XpmV<1)HQeiNiSN4ckDDow=UeX8nha zd(p}?!5phrgA*SFEQv>2oND=GuM{6`!}hYHBM#m{@x2#5|IIhQvA4MydhnnA(@&Kv z6-f}@|IAbGdE$w3rCh7ka=Bcm)4_4PP$-09FxxCFGhNqMw|hH}62g6^cjoBIfS8!J zYr9yRDs5wP8rO1|#XaTePURy!|M*y4O^Fsy zFKP7LsnV%J$sf5lL72vHexJT07zP>UW;k$)+h$mTVwSs{pwObvl3kD<4BVbJ^W^Np z%mTIH>A>`LoC-uKV1vj1RaJAjTo44ht~Z;_EX%sxZllqFIPw3o_ol&`TxXr< z$$ig!_x*kEesA4dxAsz1Nu^zuv5YMnFvi$s32e5Gm>`IOVW4|@nw}x1qrn3M3=YgP zfGry=+rqLf$(CeEC6!eBc5Au&z3;wdzPaz2C+CBLo+Wx_pu@!QLC?pG6Hh#uU;e** z&i^?F$I%lHAAJ6`myRc;4zfn;e!y1PF!Dnv02VJ-?grSfpa`vark1vS2S*(N#|(_X zf&m>?wCTe2%il^^7U7EwV#l~waq(KVKxV31)YqgVjffl6)3Omv6uHcxblkI4r35w0 z*QP_Aq%)bkWZ?iIA59kSYg^|tQK{qTk7C#T==%EiZ~t>>pZj-z0VgsDJv5BbOd;_s z5QYhwfG|!_h+Ivpz?~RLI6C3?plKfswdw=nfJ)-pDS*@_E*opeCMI}FEBx$(mN9nTClU{ zi;A@uxX9sfPymHh($iA7NMWQ1EsS51=K8Too0Kzgu!L0{9Xq7y{r> z&Zet=gh4+ULx%!rXgCN$rIEyNM;REsj@zq&q#>z_A1G5yr0ERBBoP%BiYXBGqoC)R zLrXqlGne{T&Un0g{E1fQQWnW)`1FtiQ=!jsh+>m6OC5~q!py9N<1<1j<~Ss5>+vwB zY`Rhgb%05j9V@BZs*_j)U@#i?v+ibU^*(Oyv<;G;XN@D&YLB>LV@oI`7OJA%WzW$( zU=}K)-nMBMu&($1$3DH$yUK7eh8PqcmE!V#el<3`1Vzpf-ZsV;tyTtPx9EICRI3hO z&CIqL^rXD4;p41pWI0Nq>P-((2QAoNTM0UYANr|Z>sAh3z4{~KAT?7#nM|#5_$IH3 zF_AV+g2b~zZWHGn-zp(ulgwfeW_`ykHE#LXo)@Pa4mZ%Sv7q^36NtIV^D8~Agodkx zSfFd8dc#~E7Kp;?N)*n{b zfh}%mbozbnZ4Le2Y2!5^dQ}_@?%DUiz7G0u-4#2@(VJ$boS(a3N;a~n&b6*1B%=WlX4sk5t zsBvd~y`7nR*a9r$PKZ3??%xiXlZICc_HfqhCTv+%PzFPRI#9{gY=o<|+qt}^`}JJG zc9}MgVNS?MT!twOsI+4YBhFN`>HR2~F;ynI$Os*mMop$`h=66Z-(#X`k&3hmCgLv6g`Wms_!dk5;~?v*{*IZ5>ZGggu8dSeew3)w|Dkb zhGHAFdb{09r_(&o%d(8)cs84LU3WAZO;1f9SUQkN(;s+zRrS}WFnfKy>$3< zZ3Jl-C!~lk%^pf^40lvL3ha<{+yp;57j5*QUH6n*<@p(vXC&vebwv7E{iFZ82iUEd(VVbrQJT%y1 zuJXeAs{qg$GD$ORK;;qw14L$zkOEk=qD1oxikYNQZ7Ef3`B*L^4lOK4F?Dy-r<6B5 zaTSsTp1)_jG%`2=ou;w$ZB&fIY(9PR(zn0-1J}Or_VwW9=aC>p5)`luFb#y4lF-9w z0meQ`2{176Y$evm37PFq{**{CD6!JG;c=p%-^=~$+OZ3d4a-p`L zltyyPLy^Q#>Iha$h+IB@fhin7^LBP>ppI}lbTlWYZpYMCU&nK#$pvHJg{rZ|;FT+m zdIHOQ8*o{f9LCsmOjA@iKese=@oc_k;i!muE{6CJxnw45y>K)R2)R8$kPM%bEucgZ zoY+Gtr4Q_kdv(K)7Ma3ZX5c3Akr+m?i6iNWZxj*y4Kz6H`4cc)(fplCy6d#LP?WO5 zg*c1ZK8+_n0JP!WZ&=?7tOtE*bCDgy*%N$#L_1uZQ;m%@UIt{hY2%?!iP_YKt+Co5 z?S&x6%|~_b;PGIiS0LnWm|#cm(0mRNy2rz!`4 zGD9aM2{s^!d)~o*qKM9V?~VJtyI*hKt%Sv;()@<#F+thGI*(iWKC8ig1X8o+*ehYY z30w{h6>|*ji>-0=a4V3i+*p#9=9lF}m_Xebj~o5LLDydY#BY54ovkN~Z`3K-p1LnB zO)F4H0&&8Ma^U897Igud2$rXG8FE(Z1ti;6yi>(YALA?XP7!p?C@PJdn>lw$XF0Iv z`yK{wmDAOTu9rntIezr_{39S@EaRJpc3${c44!-Z(6#o)hv80`o)PDM&w@LtI*;0Mt9DPqF3BuSEo{~ z(RCx}m>p8N`q9a&f{2sSqjeb1HtH%%i7aZM5e>RjEHpADQs&cqwC!;wy?-FLv`3+X zdvYbZQ6O{K`Qpp3y!m6Z9$pA5wZQ*zmD;Ge(#ncctmRYHrpc5^6 zi=^s~?x9}V@i*MCVfVWtm3917VD=)uM^G(?tmx~r$Vf6g1ND!KbePzH$HYWPN{wY2 ziHH2;+4tflofnw-N@n(*T5kZ=@%CWbIRW?th<+e7t}-8XPwxs^Y7@7~sb^Be!+!14hY!@*$CXfzOz%v9&! zxP4`s5Yss2#S>23HK{=1{WOwc5uHF>3x?^SMpI%x8xH+K#_R_{_Q=YLOpWi3T;B{~ zf=A;frd%gLRPvfNx4opUA5dM2;d`XfGhNA9O2v1MgKmK;XL$}Gs5lDye(VlRClGLm z4wD%G)9c>w!uXBr&wulw2R@uH(L z-go2^AA911N9I2M;j^FlL9BTy?Ohx(w{SJt}f z#vNTBlcPlRU>Ql}<{1%1EzDB=0L2ACgwZZwd5miC@qO^xgxoghC}VW^BsNQu6(a~qk0Yer8lIh5oB)!ihNWCZ_BA_6 z2%bt)po_RDh|?VZioO;M$9|?b8*x6v6d=<|X96Q%;_)KuLTI1D^nsMqL#h#2EK0@3 zJuyT>u#yyu)4|oh0OdDsO2-SGOTP868TN?|F@Eb9Up|kHcVBq%2dsS%dSCbx;D?AL z0N)2;jAXMw*ASY6zJ<{O^i5RE#@aAJAyJqCAo0{z6q+%b#3%?65TPJK5ht=WPX?5T zQX)if)i*f4ruiyHWdax?WX6tMo+*q2Cjo$Gib@>aoNRw=?g{iC#zNnV_sHxA8NdJX z{-wYF^6c4vu5c9Xkq!0{ct@sc{vR$LjLfC@}F8* zdMAjN5J8JNb*x>6B0+dl=~Un2J+jV_nHDDos(k9eV^^AQpUqXasi@7nD*AMB0B z*hDA8nPiyBAG?uVNL+KCtrn(F^^nrS(qlooJS3@!<h~!f=$qCHBGZ+L@M!Tj( zE5>1ZvBi-mUf(58q*B=A^?v$v)ZJ+kS?k*O>ks{qrDiHqfsc3cNl{5PR;j`_5%UTE z4#7dezy)b?%|HVpg+ek!n`MWCG}*?O3KC-|;zUU?PDg2S#5tAGu&IP{89I-%ng?(I?wT$c1vr>mi0LO*|%y#`Voj z&zPT->Y4Jr8LY7O3MMXbXdF{CMbH$>Y?J7w<$Qc_vDq2dKJ=*{e&oqVPd_|8Jq=^n zYPIV1I*OvrW~*AQR#@@*H=f1$oCs3-)S#~kFqT5InHo2Fbs8PcQ*=x+1VL@ zAgxxbP$-ZjsmKa~Ael@S#&H-1Q;jKtAV$LxhN7SRi4T9^;iVsXZ1Kk)JQ{gp1Mz*& z@ghx35CX&Il0*kqM;_g4t6S^i%ln}=q)||rEoGRz&#QgYHQmsUq*{S%%(3@H*;$Hm z%y2UgSrpsfCJZ&=U_3_E>*BaCEXx~lOKlQ#xzVyd`To65n0qs#(i^9p~6`o5UIJV;0 zcB9ci5TxC1*Xwl*!}|SxCX;y=%WT^&7K?>idC%H6nw>86=*Z6{l;p@McU+iWkehdp zE+319q(>*QY9d4&ViZcC6DkCW)hn@`>(>a1JcvY-l$R$ZhYagPGhm95pW|^H^>QQJ zpSHR|0*8q>pq5yq!NR1$6c~!U?p?0D{bzIcf7TrJZqROFOrJRL#J^_Zg>8HN?H@3i zMOQAz_ilqI240AYX%M);@z6{@v2>Icp>HA-105a96flwv)lL+c5QQiw(fNh+?88%s zKS{E=1S9-7aA06Zt{HhT#xiVvI9lx8J#R?mORD zK7FbkMz@@qZ8N>*EZy>E=F$g=!jdJ52TId>R40pZ2+8F9VHRq20ktT05{FUXs~)wZ zfjy_N?ui3Oplqlov}*(uT?`odU};(tGnxg8q|IYNnhz9Xua3xR`zq;Z-@CQ-+du#7 z-B$M=s?Pg&DM*ZM2T$}&Xm3I28MZfRQjW!`?F?`|0!OS6LZ@t4_YgxE61yy#>&ab= zn;S)lM1x4WB4BjCGef8;bkN0tY$CiqDpJz9$?)MIBTiF0pmKl!5KFd+gd9X^uayO) zC)T5oY(dLwdR`KQ*44hx?u3bO`|XwN^jIF&=cnIrX~t9LLR};o4w5Y@U*G`PfBT(~ z9`3u3R~v@eHz;Wj4SV~#W=D1$8!_QTgPP}sD<{l=oeIs1c(>7VWQfpM022o%C?k;UQ;7I`lz>TbfC6cO#JWO{KRrKe@SIEM%wOe>Zk)8j&bL z0uz>;Vc8_%usAVv(<$<3xpfn>j0($vyo$naA#~+p$};CProdtw)C6 zTk_sM8(vQ`5#Uy1Is-6}cRU(d91z8OaK3F2K)$my{`Qpq-IM7pGfPo97KS8>CAtOWIu0RYTp2d>bJ_#VOi9}xTwKOtuCvBw%Z1BS$dGtqzWgs|B zwcoU&YpCB%siK89B1DXF3!pfH*=ej0(k@OQSxOsPubyzW3UG}{%}Ly0P-7{ixR;I} zR_;BxhwcD>VgE9Rm2T!z z%lgJt9(7%HceBeZ%uu1dAC+hDbi@-QBF2NPt2ri_#={iER8yMkhQLPA{8*>RB8rZ5 z`<9Bh2o>gd}a?hj-0*FtHv+08B}?g{eF}aS$>}W3jU)rX$T$JapZNG84^Y;~6*J zviljkgK8rq>@?h1raA>Tj6+AE>+kA)u~?*O+V_GJOUJ){?wb*gORm9W zKn@}fNjjm$!;*_*SYm6YmbRwJ0@I?`7gdH&ycp^t~sQb{rX@kB*dR=r?%f)r`7{n{Y2OJ0Y7%co$8nm_>P^)*Wl&PC0XQ|XebY5*j>!27;uSyrW5 z4a2bC@7L?~xw$#lajVrzwNfDo{P61XC!c=e$DTNHc9D7dbm@bq)BCNry(l&f9U)1D z_Uogqw&H06>wFg%(dmSlE#%N7kttonBaDL_#_>Ge5V;xw;+()-^V+P}5fjbFdy_CT z31Th#4c%J8ZUeh$& zwo9dw=Xs;yC|AwjdTZN6P0~rSSU!#dg61o^Y=mOK0z#2w+DhBiJU-1J9!b&>2Bt~! zg6QnM^G1dYQLKbfE1Cc$gx2^X>mapICQxlUo={ROCDhF*a>Gg1ybk3x#uKu5911g3 z`t0m|hh7Nd9IihWZrBvMN6_QR=Hsya#=YQreOD8^ETzNV-bympCm+BABEq>(i>Q9|I{8>9N z^}zBWlzkl%VuIoZ1Sn2N7^em%&z2@pRcAwQZXu$^UGgIF5rLz;QebL)*4H zold1vF${yEs3?lUF!X&NL6FaV?sI3)p4Bvsrs+4{c%#$lgke~zR2;{_aU1{;MUiQm zG)=$9WdGvG?0c{E&%g4eU;K$*-mFTeuYS{I&xNYC8t`=Yz9Aac`ZXWLdspgQ_aRzF_~^--}jM2rav=j_cRJQ0zR6NG}YwkU`<0!&l- zQvo`hzMpXzOFD8#PoW+vrsq+#b~Qg+?D}~zT%fh-D&Cl`@1+;j&RZWLZ)C)f3i|+~ z$DUIGlOsf!;?PEI=?ccw`jf))!(>Y8P%3VyO+AiLs^{vn0pe#&N*mLzvY5$Ks8o+) zgP2LQ!JOytLAY|XK4@R46v_!EANP4P+iDC-?aWA1jVviXZ@R@+#38$MX@x7~gohJj0e|E0~$ZaEwSskWoN%oDgl6^Ti4cs&a)6 z*LKOdGwYtz4+bTryJC&V9I=t)bgD59XvEl{mk49H>>4Jcatoe^iyHt2Se2{8TAG> zd1G<()sx`DNoj9+sa9@0ait$blS!Cu|nRq6(lhM z6`Sg^sz+GygaU44cPa)k9pqCdXWGM^fT3It2pDd=2mru_4u^p>m);Ch-+kf5XSR07 zS2oibW_e`=!?1R{U9DD0k{k>M*=(lKXdG@FcUn6GwjE#^ zAZX^bw=mPP!$6KbJ&Fbsr{&`^&CGh-|NL*iUd}HbKYono1$ivDJMFbQ*SGeb;k=d~ zM^!I(mC{}P#!lzz^Dn)2^DE!@_QhAP?yRFe48y2YEcOP2M!k-r=)LvzN~J=-d)@?u zxm?b+9a&Zu7ngFmtm`^I_R*(4@u3q>o-SD3H$-D+2st{`OICO6qpx?2ovq=ewlJMp zIXYWq%2Z_S`iYcaC7R5OWVKQ}DU@gLY1bvkgD5-VDGZHfBN+=-lJKG=F)5cAv&)C3 zC(*D!He)ZqKuDpwjN9{807b{rp$+r-qz_4Ok`m?|K z1CEj(d-BJ#+3dUBO@bg=t^dP#2O%sJ3ZCbUMx#cfK@h~HOBc&Jl5Mpdr3AP`w zOoXTzx`0G97nbY{QC^C9_IAH7YAORsnB?))|KmaPF5rCxL_j8#CKmGrbaISKO zq0(1-7a6V`fMgs7DXu*5Ed--NjFSV4Bsdpi2Z7_k2qm~aLN5u0MLz$JESTfCMx$}@ z;>FK=<}@WO=)zxR8;=llL^uf2Bb)~%(brO$otbLY>W=Q!?N zAE9ZQzV9bVLJ)-S`@i;UzjpcZ<#M_FOTY9>*=+Xw`SZPA@9Nd7&ph*tVHnRn_uSXM z_O-dWxo4k!7D9OY_U&(c;~P;FjYgwew{CG9_oXj=>DgzWJ$CHaXFvPd{r!C$#~Y2t zdsy}_i_E_N(sOT}d%1M{QzJS2c%$@}QZ+qDywou*RcG^5&d%^}c9QnCREQYNCJ({BnRD0(x&QOzog7Zm~h&%RtH)>^jVu zzBq~&Y?|JSm4|flC3ZNksLO2hrBoThr8?dn6Gql%*;HBg6Oq(#Ok_)E?*Pe>l~sNq zBd&$qlX}ljN3YY#-Fa=N=iW+c8uHn!q?76jRrTrJ5TQ2ByRk0bZ{DZ}z5D||Su27>nle#R9$TEY zcdU~6v*piTzHs-DeftdI-^8QoK-kMp^AQwc0!#Y=$_Ge9ps3=JW&(Y^MUA&JVzm?b z7S!_YJ&dwbJ{1JU77`g&yJHJv+$|xA6eJvCl*cy?m(r;-r_U|?)}L|@J%7s!H!g$G zu%eERI5&>C-}+(yYja#&$d#1(5ASAXJfPt&CVBZ*um@E?t!~awZZ0L48~o%zT@a5R zTR8Lxm7e2jb9bHA`?9CB9K$k;NbUY}W6>G3XR=&WIr|;Uo(~)+9?eU*T$FU*u}y+- z_AF!yAb?~{A>I&DX$z-NEG(iVijHEK!xZGm^ar=+(;4&Xn`70+KOSX11c)(CY@`u= z%cE0zGR7q?3@Km={zOkm8pmP;M@XEcN+^}>vom#W6&K;f=3udFc8Y@q2m~r;=>*PjTslafF3$JTDu%xsdU}zBRR<}q`g)ca#$#j0n;%N z+(B{Zi2iGo<*|WacobyndW_~GOv2P5BK4gXE2{{>3=nM^I3;t$Aht?*xNozgp)oye zjqjNN6@eE49tjh{iH|Z{ZbZLA6cO8-9kvKxS*jB6Bo@1mOV~Z&8N=vq%0Tma&w{#v z&1G#fh0$9JQlubtGdDF;yu*yyFy+uRi?Un<5fTxwP?U0e7`v0`1X*j8YG-Kal`B`4 z56ozjNugLINm7<&k|ae@v~4>I!-e|l-+k)~S>DBI9*J2ti7D8Iv5C-WI^s1#HG(Mb zu5v|kA2jhOA4XV~I6SK8@>&azV+4!^oXSSl1QGM0H^Lm=rI8>e>^|wV5qGRcUKk|~ zOd=eS!$d|9J&YG(?ytY_k|;P>EUgT|NUaN?adJrxQ)Xq)cL&SfQH!+5euZ9r*vuSxU{Enf<`k{*9(B z3tXk+OjxEk3|tQVJ<|XHAOJ~3K~#XzF2*QP;J^q_=`qGOqtJ}Qp>O?k{rEqr?3Z7D z`Tg&I|Chh~Wr83WhAEfJilX2+{;R+GtFOKGS}vEHpP#>Q;lj+!3{BIEi;J=>f9-2u zyM6n%@B7o!(>HG1s8*{_J@wSfFTYF>#4rEyFTeTbn;RP&`F!4W-D0u$U&uBFN@6H z+S_^k`M-bk1MkcEhB!tq2tMxb&2Yel#)D2%!)&srC3zkwW0DD6XHtx!EIk>75oI}w z)y)&Osd=Pu zaJF_@A*VuVdBpKCk|kkexe72lRrj24-aZH{5%1>3T?0jjS%S>00>CywQ1^q>JGtamZY*)Z!G2M7;{)4X+fBZl8W?#G7^R}ZSMTmruoie}uZX zD2$6zXTY{($ zh*%GMf=@zeiK!mp^B`}Y%dnXTMP5y|H*aiwu;H^{q-eK?o{qFPG5tbDy_+63%R#iy ztF}2w!u|SamyDaHnN@%YeYcPDNE{K-pk}He)^$9DiV-~|Kxp^@PwV=1ddh?Dlqca} zJ0Ts;*bk}s5lJHIWmdCC3EK+UfGTWt?GSAy=91)1_LFSZ>NNw0G!ielG-aie5INo` zt?O&R6DlF69T)dUvP95nK*T&5C$1X;F(vjOGy^tGAw`lvF;UW-b>5IPAmsl*%AuLTG6fw)j5}i00>HD!0 z$B8<2&Cw{Fuzp`3-VFUas_!U?DUSR1Ze0Azwbz}#`xnoB^Y@?q<9MRmx^{Pc>%NmG zaU35GhaAV*j*~zr_c|Yb`eSEK-M6?j^YcIU#Bzg?P<^cHzG)31oa~P-?%2kF$Wc>e zQOI(kjW{~AXeVFJF00YY2pE#ahybjKWlbkSFt^|0)H4?HnJx~d|(4nkoG z&*B48@KF*otw7ZP-WfL4fBUPyb$e~irgPYMe2D4PvO*}O|6H*@e(;3vI)_&eV>mV# z3^v-fTD=)@n5fVW-oPW%ml^fUc zM4HVU+}8GI2ysX;0Kr3%j8Xcsx}ohfJ%$hnLPRK4I9g`dT^p1DLPl;Gt-Z=RPb#}i zHtdgkB9j_%6cNehLlrVNBC8JB`PTaN?2oV*0qV ze)G*YF$|lZpTBYA22InaPoI9b1KR8LXqqk*3e{>go6Uay^PgW^TYLKHr`OllAAR)E zH{X17b#>LUEF8xrNvhRq`}_Ngi;K@Z^Nj1dQ&UrS?%X+f^5ojun&){>KKbMqzxc)V z_4TKpetKtTXL@?N*XzAUX72`)B+0*!Qoit)fAEW+`PJY2!_Sl^*o}B@gF`bYTqZdh zb4%%3oOo3{*r-<9`#XpE9PU{T!tszc@u4=b+|XXx<+vITXO?c`+3zHG9(6}Sv39ey z_KUl=Ja^w;hTE$#Qwv?6ug2!C8dMtefy+5C-;Hjj(Fe_~UDADE$CD@d$MgP+)0h8h zqgj`hYY6jb`{1$J<*ytZYt27fT?-jWt(f}v=YJuXy8rKQKX)Vo|K@hs|CPrtYwUB^ zZ=Nhae$Hy6!!STmDw#CgeH@aIlz2)bP{|Yrr)is=S&cE6CXlRasBw@c&BU<0806D+ z6&3~HauV@f8(-*aBxolzy^CdNt5-CsR9$p^L{O2vyuU&VzDUMqMEdfOsZT}ZHB30l zvES3fVlY`AL{~G|XHp@{OP>gEqE*MG1>N;k*IaMBY@0~#yvQAD{bB0jXjo7td zhLB-29(Qh$ps|#zA;lD%njQP$*w7=QK+Dk=Cc=;2dUo&F>7vtj!|65mjXT4)4$Af! zHmP$5xyVO0=)fzc8y69BCEu>gbH()`AROB0)Sb^1zO%XsNM+CQ8s8U z0Glh8(lga0H=nic^HbPnUtN)91i41@bl`$!PTB%ab)q{@@7 zA|+vmD+0Om&9A=lZ+`YuQ64uY*DPgEmYp69tj#M~O1x%SzzI2sp&-Nwe!^55va%-# zak7HqA&&|!sL#YhRXov+-gy*|I+t3d z?dSG=t55~jU8e%+3>)@_ijwtc!X9%$f0*2xHrYEQ`G8fc!kO~1`=2GwH(HrTl9{F7 z`0yXCeItwKR|(Q3DIB9!Ozq^SO)qg`eFaE5YKbO6_6UX6!~I*I_=TS=mx}MgP!vV^ zd_IbzUawcJ*HD05x_IetuKiWt5109a0iNK9n6?1{QX}7~4D?Op|_ODj`=-v~_izT_r}| z^5Vj0e)?0HY(^PR5ER+m-TCCd`TzlJmPD~4SgO>^fQhpeHJJY-8hmjIAW`y|*^_Ys zHJw{KmmSBQ_*fD^8i6E%GC1Q3ITX(nB78!YS%%h8V+yhQzVyKCAv@vEo;f)lDPKLm z|L7dIwX^wsd+>*!`o%{ddE_7F9~&5kzx3iOfBmO#+Nh*aWHBxSsrc}0MVR7BCC!9p zd(=sJyh&uStm$gsGdEw2(Ak)oLPCK&42&z|A!Z>$sc_DlTSbO!~ba#lVKP| zQIaHiw`DROkEf=l;y7+LoAr9#ahw-ldZ}0_zWoQ+Tz9KvkTb$m5QGGQ*AA_m>ukS& zzG5sd+#2l{D1s}{-7JbnJ}dBlZoKo-=f6y)3pJ@aMMcLbcD;sGAj_~d7;+1qKO}?u zVH_`>e!F`q9XJ@9hLbSsRwCAxayc(ck7A?eN5sCRq3B1^?j}oQi1N?;)X)5&v=8oe z{6G9_0000900}x(O2*^FbrX;v5(h#TdJd9H#gifR@lTN_&-_#KztBAYJJ+9~>0IA8 zcqX?K#cJdw0L-vi1mL@_{-0L9a{o_1k(>E1cm>yWNs`2{{|nUxLEw2F&-1S9avb;n zZ1ZQ1BDWQRCSqz_ZSb&fON;-62g(!)zwV_Pb zr@w(zMi!NU=zuBop&&ZwJT5x*Dkp+RQfQ`#3FF)8`kaC6>uUF;v#W9XN&WIH>GzF} zuesCRyZNz7tu~(Pn30fA@Hv?#!H_81`J{9}(9;i;o-m&JnZMUIunlHJHfyoCqDv!T zW>f#X(%Qf4;)L3qg{?&}F5@=}z+WME=7mv~Hy&f7xS*wZCWD|f6Nf%D3EWSLT3jx~ zDGiq(q$$%F8h!_GjJ0;$b_-^R~oY*MF}|x6wuIQa88)5v?dNt=5$LrkvsZ* zt2s{=VscFPoO%gSfu7csL~wXdkTYjb z&b6%Ja{BRPb_o&i2%qZSNMHIhTdiq6s z>h($d+GyrpP<^#GDO~^7)b@)N>e@2=&g0Nqn?GQ%t3&ZKTf)(G^uaJFc$yn48@28? zKVZFqBRh)~wpu2RJoI1pR)4Wy{NOq<6VQTVwN#Jo_2X(5nb^)IifmysrcG0kMKXw} zc92-sk`QN7p#jt+QS~SfGaBWGo-Z*)AHxh|x5iMmj!PIBvssrdbi-s8;u!Dly4bwu z;F?KuI3?#T}AN>HOfc#68+--u-V=&-ix2y zVox@*@0(qop|B`FMWTe2^moT*KeBbp-9k;IYs-wfJ@K{}b<6VgIL;V;#JIlaJAoG# zBdi-H8Op%%z*Jqu!EN6$SfPFGuC#P8r9rK9ph(thTrIcq$jQYI969sk!Ic9Ca$Iq? z$fL5uz{qN+=x`&^S#6VZo1S|oXJ1>7Ojf=XLl{1UE6{#8fzxjVZ}X8>Nit) zBSa2qse;HGHFMDIq>z%$qIl>IaG^)xS_H9}5-@d&C}IG5(U6BsDw1Bg@%q{OPePcy zdqMcS$7R*)bqvLt&F0k16mBs$+AjtO3Go6)zz|C$=zEE~e@K{Sa}1b`_ANdJZPq^zGqTv(<^?dq4SGKO+E{$&tOZIAMy#!u{j)iJjchP+o5mr#4|>7d@`WPZ84l zj%1z?k3Tv%bY{9RKSy|~h#-Lzp>g2qxY-}V5vjK2$O54j`?)chxP#`7>1yY0ZEbft zOnH7U-JG63L@9^|V~}{BH#0MXqL`v6^{MKIe&qhfG;#0RojsH+Xtq35J930d+<^=( zQFxTtVPx77J%yZ|%l_}|y;-njSAFKW_B@Yg9`8Kny*KAnrj%$x0t5x7n8C(&x7~EN zqoN$)2-h*fLT*h&{(P&IhO^uC}Z+!m>8zK7ur0EKiL|G!ZOBDn} z=AfTi&h)!Zf`>9sYCePnQIGs_IrIHjUqBESVfY7Z;a*ytgIGs|AdWMh3u(OS5{8`G zzz3kqPR-9XBP1{n$4D}PQOoWhE6(qPu{rEzsczAACe;P4kTKZOcmC7=^V8BkczZKB zXrtK_z%bwiiEe`s0Dz(?6+uy8xFEq$NkTY@{>aCEg6Gf3)u)@QHqPD*f<_doq#)pe z31ck^N0AQzGRNnNwA}T><5Kp5Qu+y&AP53Q(H}Pl7)DVPf*}97_&)#uMbV=O|Br0- zQ9s@=ie=fO=MV&eAPCE{Z?5~cE&H$CnZ0s*;|E{+>V*&gEMxa3gt6y%5Ll6v3@AU) z1DZ*22W3a90IfEKCtQG06f}LE;gL83qsV!1#JxIm_FmxX7MS&22gim^QfLHOvK8CN zccqiMTY~PSFHCkL0Euaak2)Z8Qb=%~zk{3@cT)~>ld_3p;_MF}I`zu>n#^WPct4A_ z)`@c7X7-%aHlieUcB6;Y!r^Rp_f9rDixyF?@@&^B3qNy9Mlq{C3BnSq(`5WW+}kWJ z#>%wL&+7b)fU~8DwW$FztTU2~A&{pj7mZ_Wi*(TtF+u198zmJ^1U60N4#RfbbrUokVeS)l1F421 zWI_TRNUD^(vrGd|hMu#)?znRdVf3Sb~Aqi;}yjJD{E}XwD z9Iv6L?vSTy9wznnO7&;B_IEF~zg|J#n4zuglfNP^E;1*6wzT-Z*Ahs$Km{WR25FjC z0qsY|nAaVkYSYgfBW(_;7v1eD)o>!atmfqO@&N&C!!Vs2bwuhA5MO z9%820x$9=n^wV_Ivy<2lwis;ECk4yhmVFi%0LBz&NV>_H1XUR_b~@>yo_@`m`voLD z{`lD)>wdr4p^$DGAt+il#EA!@*ikl3+)Y_dy?N(;XA;vUUcnxk5&}w~~l{`<15k&=d;?qHw zCJocu_k+DbWTK-T;H(M$W;fPi&(9jy{n!j*yP~&mq0Nk5M}iayuZtn6MTdb)xz!uT^$`pNk(G;0&X1Uw zgeYW5yjb9;rl!9pzc;G+64{JUznb(y6j%%fC{|qC9c=Xe1G0m0H624*rIR+63y_IA zIbrz|a^z0Amrh9iQJ%at%Gu$hVa>`YP9MvUFb4pqYYk$5iQ^`Lf34}+Vqn$DFdb2J zWLg{qIHHG86xHwdDT>PFaxjixy7q(2Nbb5`&T^;(Q!--TX)66g zb70Dq?4WO#aMok64oBobkkGJ5GvB!L8t`-)<;H!3fHfB>DH6^>Ed?l&5@=UDFnO65 zL3<-BODq_kohn`Fv{U(&oJ`g+LI&h9n%$vsohm?a{-sd)%Z9Ii^Z)*7X%#T02lxml1-takn~2tjR3$j~3_Owl!}%v!CWTIM{poFTVWiANu)MvG51_RBU64XD;_O#d$f7 zHxDc@7ZbH?8lp6dQ8N%aoDxSCno8Rp9gC7lM82KlYTCy8j2$3|H^T7r&Xp&UHM5{* z6lNp7M~qMmadrmSA{~s3mMG;@6wXP7XSFG4nWAN7^|IsaB(8M0a_qJJbro4)$ebpR zsYrL1q?1@;6Z+8WC)Vf|CNkNRfS|IRx{OhMsVnt+J2Z)U!$ro&Nce87xtc#Q?tY(U z95T`sCw3T2+z)TuxT}|E>kv3@NZ>4%Bvm3t<57W^3<~dJ5`uH*CQfe=PF!Pdi)_4f zW=WPN)hwh#)S;~?=?RS3tIbd3*F8hzCrmE2JJbXRI?!je0L_b3w=b1vAggHX0vUHB za*Q)H8Dc^SUk zOy~A-e88dMShJp=Di0Hv)?X!3`5}Jh7(KETTw%|NK+)2$*IYX=1GU=+iT*fTjL*$m za!|&Y{Y*g;GY&iU`Dp%NH1);-*xg-SIQ-rT<1ao1>%y4It0D&28`4uP^bBy~wUB|s z02_X9`r2ePI%87Jw{+?Dy8`|w}q28Ty-W+ze)w5?Hv;24_j7t6eQtz8^u!svT8XqE{>(C zE+#RN-RnBXsSX9*fn(r8S&Xd^_XAvL=z1QTeZq~_Wn9ITAwnQYTwo&$M|$>X)vcuL zlXEA}`ATn7Yx#nmVlkWyNvQO5i9*JryER30Vsfi&?Yicwarpe!R-4*3Uva7Cj?ci8 zKa9@oChtFB-XU`DBPJ#b6USUai$<@dj7`(LjYrykCt-$oCop3lOMD0MtOM7ptsTrv zkM{xq?Ew+!zTtTwOqt!i*a-ay264xB!XeVL)d4Y%$61JEOX)L(^y%r9pIMl{Fni{S z%A8oGuaaa9B;QfN4TtJvw3uOrs-M~!E-Ao zXiHerE_tX330xrwGqyv7VKFu&a6Pi)K*$a<^_;t7sQ22C3@7K7CtLk{h#6v02ms7O zl8UJ^FP=O(O-x_>Bjr)9TT>{A5==sQ6heo9@&U1A9+s(~rDi0BYA?K}*&v)aometJ zM4TZX^mk7<+C#YThjS0#2^XBZ_n8rfYqsn9eH$Ga)OYOZoi3jWr95k~Q#I8Mq5B6`eY zUn(yHos;mv!ubC@!-k zQ_NXSkDdjg}El-dDLn6c!C3Y{QawPNp(VBDUKvw=>gK5opyI!}V9Fv4XH_@^- zz9-X@oI8nfU7Tcz6w8({zPbj0VwijUIAWj!45nXD z8H9lz1yx3w=2B@&q)}RjNk0faJ9YXWP`D6=y~F`l?fSD{ z{Ke-zXXK6 zVrHY1-FJuM@hHbJLX7uHCs#%RH9dQS=b6UqDZiyUtB1Jh_ak9(DQjUp%pzz;Ec#lJ?$%D*H>XPH|TY^PBsc6gurYZhK^XK#Li|; z^%0skEeH4ZMZHxO{T!d-GwfZhj%YT@XegvqRhnYZ`$XdJuRStR9m0{vozFLK=& zp{E}5ZF&XST<56b-nUmUBsW=U=Bq9v;bws4Ccb8?wJX;?6mAlJy2Q2xF3`If9)9@D8kjbueCr?>D6XZAc1RP}Z8O$P$Fv)!YwMt9NK7)Lq|b10dG5?7a_1iV!1?#j zpIn~Ji;Kr+Xx0)*$_pdQc0(gTea8$2mc30o8-aV5bL!I;$R_gX#btS>I^<41n}6q; zNi-rM9NOpojwoR)A=dqN({od-Ea#4lSc35+m6|G6*XG~#y}o$L+DoWh zLNEdvLNpv<7!sH(ZX**R+d>5ux&Ksta_jZ=L=%#b1Fl9h>AAp|O@dTn>`h#JE*SF~ z5g4tK1iowp9bWCgQ1cwi_60w_X9KEbZ;T+cg+sq&x-$m#Afi6@@Y&Bqiyu6@c=Evu z@7Y3i)UK1RTlWp%w|jo05RF=hHxA89cdzbl)bg3^fB1thUhVCz-gx2o+*!-A#wNx^ zK~z=gQy+V3;O%eUt+Dow*Sp=WaaNR{$xJ1pt3`wTgHawlAm*jL_?Bry2rw44L;&}h zBxS~mZuJTI)RNdAwVI;{O9%>tXhHRSB+wifW@h2ZJtn+GZLJsT!{NT^NIp6?c_EQ0BCJe1)Biki}e2(FC zg_!k#%Yuky2#VxM&$W@Bf^XcsOkhDaD%Zz;qpQLk5~gt!k;^NQy{X`ZSR(o8z85eA z8hRdS1WjIOwT%g2Knl67gE5F;Sgz+jm+##wk?onF{lcXy|4{Aw;SYcK2Y>Jfs;U+W zg&*-ZUw<6{G|?Pjhl%C_Kmb4hfB}FbiiAiKNC3bY;;9FJVsXq-{8t*=Zj4NEsYA~P z2mufrAh;eyE#K`1t{w#d02@aCYW9J*e(~S_+kgA)v(MJ+^^+%0{6F>qd;((BLTS$nraZ@>Fbcy^a`KjC1q9*7QHITY zixY^ROM7TFXnh3Ux|d0pDl5<7Li3s(pZaSqH8}Xod1pHtT|0|?D}h%^&UbMC1`!}=6!bzVO^`ZQN&zrLy}1Nz zaOq7v0sYMt%9_TaOd@J(HV;i8o=cM9I8kIc0WN!WI+$TgBXR)>*K?FoEfp{Xvi}n!cqj1M|w_V5>V*r?O2=xhS;}ut8q9i zPPPF{*j)shXrgF_BLrC<(T)?alLSH7n-dJl0e(o*ZmWwVC>f(NN9~&T9cr zXDEE(;rH9h^oZa>1gnSWAJ-7_`imcw32G{{1%MQ0`Cy>>#BpyQp~5#J<9r-;Xiw?x z>=Lsi;>vXD3O+HXw@FV&*(~5vEjM@$f9z_vZ`Qlg_Me^CzxI^ z+M+d9zcRwch17gsoJ%lVqG}c#Ejg)XnDpIH#G)3JFdfDS2i?Zj!_&pSz1=mMp%(!z zJ!e55bkb7B5TWikqd3Y0C10i-G!9UIC@QMHcMu9i1mM(`1A}G9OtLO+cB~+_s7J&& zRwpjj2o;HEmaDV(yawtQaIuP``yg=XuDl#V;8_}&uKCzFkmdv&tEK9CB3(qq#1 zxBseL=$ofDtfhC3eQf$Y9|Y46Q50hxY`yb5u~YM&pUmmQQ96@m7^dIv0|1T+0N2*mO6Bt6+`^UTza^wOpOaV&5o6?#ZdNRXhkTbv zCXGft%q@81o6_2}3tmRsO%#$b2xB6ci8}L1OThgFLi(cKH^x|_c~~&!#Cmhu3kP#t-Nz-p+8-z zrq~n}^eqdxHez-)*pcvV-`onGf1#6~E~?YV+~^Ch_E^}jR;q)+;K;L1Oq3seVit{q zmy9g*!~MM)ui;DQr&-1!oMFRgDcX!Z{;o=Jt?M5IfNN73*%=8za~Bq-nvfD@VS;Kp zI_!H0fp<`zP|zfXk#^|v%OJHnkD z*|L7WUn-UUm(TvMx4!ox$jX%AqYf!S6ri+inJk8VZzL2Cd9dIF3O-6yz%!ZkVS5==hG{Zs7Yx$=RWtj-}sH+SXx^8v2C!?X!M)E`J4Cd-IHbc#TQ>(U0r?SjW-^6 z-~j-@rAwFE?e-CS?6Jol0{}en#1o$9t*)+aZf^d)tg`v}`6D9Q!w*0FHZAt2GVuR; zehMKd0DxS-wnuWAa-~=(P7dx$+2wC{*BUNCifE1DTJ79pIW9uu*mQjyx!c*vLbI-E zZ7>?4Q++h#F*5Dd-tX_ry|XZ1-mO^dQ3~ULATkuAJ3jlOAm^l8nyw z&G;RmNv(6jKX+f=<0^lC&BoA#&n-Ua!Pm3WY9i$9!#qlEA-6`2ms9Zx3hj(_SQ%zx zHA8`@PfZ+Bkv-ae2OdaVs)xCc4g&+Xx@xJ~-49dftD2JS)j)NM0=<_Z`lv>8l~dn? zs6=*0Ua*vh|LEGb~IKR)b9v5 zil!Ha9EI2|1d%&Z+H|9;i=c>ny*rx0NJVPORJmHLSSI#bpyf0)^6Rvl3G?L}4(8!g zqSq}ed4f|rfaySKz1^_`xI;^SJ)p>TLt==RBV5>+bjh1Cx9Ph**0&lFmu9BW(GPJj zm&rs}L1w!58KB4TKne^hp||K0-wzmZf9U%MXL>&`L1!sdSvxh0CzU))-$s+&?BWmI zbI=QWZ3k`MPZ@vuq<(vfY^2jFR+^E(Da=dUIFm+=PPsbNuY@x3W%SW-5EaR-1aTVr zf*x(3i0CwzLGmYkEN&%US+0`FD2M{hb0TEyu5YugJ#hRCLS3;9#7fUqdaqrNd7o1X zF`Tu-1L<@?D;W{`q;C!l!8fN-rir_*_VVQXV?<~*n3+@!j6|Dv$(%fYGb}Hw)jQE) z-5)IUc041WDOHCa=7bc*l|@4zAlDRgdWx#{a}MqFvbnI7-rf)5sq9Cr&g(-4r^QpP z5NSp1so^aJ$vC}xWNd*zxxK5L2+=#7Gd*}2@p^ITY@+i59~7ccL>P(Ns32m({L$yi@2UFrW~Ba@?I5u4<4W7;vKt5$G0Y~bPT zR{NF|UblTCb_G{=oDg`C&_fvki4%INixZHUo5D6NGG@uFov=~RPoRJTdw|CHsIR#s zY!3||jgboiB|miT(*ie?Mbh=|Ucdj+_WFVBSp>A%u@g@#DSGH=DQ=tydEZIlk&okr zxYAHZiRA&2H&EOex=jz=!IMJEVwvKHmY?|c{jXyNBshUf@Q@}CxON&+BbUhvGK#P= z1@%lI5J;b%`9FT=&;Ffr%#_YO;gv+-}>~w{G%Uy-p3;f6gULW zMyy9|<3XVsBQKSviT=IpVDSR_#5MlQE1I!`A8_4FsbN*of|{2`v%j|89KM?wtY<1q zo}u9wPH^4W6Yb1#@8%sUeY<-6fPd`!vh3YoN1I&`SSW!fI9HAAJQ}8OOB6~s7EiQV zequu;*eVCg3>XbW+2z!e(GNo)n0yfgafB!suyN0oL!R-C+o2ulOpnI>Bq=ali$IDr z`#hML8cmw{;E|>JL?xwe{smvZxz<{{zR{y~A0>uY1r+En?%NkV`U3%8``y>NtIa?D zH^25T-+VdKQ`71%rgpS19BfK0BD1=+zV`Xyht5n^&x!rD_NY-$Z{_C5U*Tr1zF2#f zA9+54P#A~DeJ`PkI}&~VD8H+wGIQwhPFj?H$y z-0au5el5B66yk<*y>_QsM*fm4A>t?d|O?EiFw? zPopRr1i_Dl;*tM9I}i5cDsFadHneC zU;Wiz{jJ~nEnU|a7Z;E6`=9*eCof;VoXuvJmX=<4;RS|as@3XXFnIeU^q-nD+p|3Y zfJx-Zz`DP=^DCeEOnLdK*yoe+MV22DmXHO4XWYMqb16MJGnH-l!E7|#=mpCuxT?{w zgpJxLebLaThfS6vG|;+gkDpHpw~|0>FArnu;kNCPo=Z@#cXra0A2Y%MmL3hA0*R%) z!xUpb%RHoF#r5{(&xrK`UHD`AG&8)*+0sh!5jw7u+4*-F&waW1G#)Jo$cnEp=>TmC zX+73p*tr-Voa3R*VO^IAvJB;WQDST-Fg472DHsI`MV*oD?i^y&J#Ch(ih8$7E$=RQ zTerTR_A6tqzMu3LT1CJoT!UT5v)O~!=ASMd~UFJxCuxpDIJ`}%+Q*3ATiP5$3 z>YT|R>m#WxO)t`c3F7Nee&uj$X&@bo_IF9bj}G1u+{XjN45Qc{KiIw&@GX zo;5sXLdGA)yl)XF?lbC@{w`(>+Q{AI&D~=v#g)!CCqLkD((?l_CuTMQbI(!kS}@q^ zFoQpx&=1~?T`j8NM4=L%K8fRxzGP~gL-dI zg#2bQb%#~V{^(H}3H>Mxpd6rx1EY$nHg3$ zd15L)v}h0Ih5Tj%#F-wZ;`VG+s%95?^5GwlC${mY?l@N!;bWI4h|SVwh=Eb9Y-@A!lO z>4fpe4tMy|b1(exW+s<`(cj{-dc9t$REpzR)3idNzzcl!J5xGpcy3R}hzy$a1)hl7 z9#AFs5MqPg=yulQ-?o zwpSGzggs>|cYoeRvRMPa@`{l)SLRPI9N>5K(e_qP5W)*nDlcSeovoc4`P6i0 z)LIFF5O-g2jUHH#e_6`QUj;QTlJ` ziRt;!iJhl7-e%iB;;0H(j$9@ifn~; zKr;#0Lnba9?s{`oWcAt{35)Qsfuuc3oK6OkrvF3b>BNZ>zxR8;_shTh%PT7@KUS*< z!CNm8@T0|sa9>9h4ng2QQXe-gA4jRzM%^Pe2LR-MQFTHT?eFiSDEj1+Prmi@vuDr# z_HX|-Ns{yP^T&@LkK;I%O1(LI<;s=C#YM+)eBY-i>du`zpa1;lE0xOp{QR5V>&=qP z`}gmE_OqXT=9y=F-!GL)Z=0%rYR;_0@c;nHYio|5FBLEpS98U6Lyb)0G|t*+0}?oh z84{0Gf=x)^x~L1WRBymfo#T+T*NrG=QYX!bXN9|&2VWs}-czr8iej*4j>IS9hGcpK zRcUoQXROto^jMfUI#pQ+Mg%5oBEIL9Q16?jIbxXy+UuKPcIGMPGMp~=^meTSa{3P@ z?2lyCUphBS{WKmy?@8I(o^1WjC=SsFgRY#j9Lc9re%_imAibB>$k$*;N<+&-{hn2&Yd~HY$bKZDUU~Ci#BF`s?EEI?MInlPi51- z9eb};9AyiENDwzX{29M9vv>JHP6pFwy!4q{jwjk)j3HZE_nRi8cCY_4hT67Y-$WOt zj8-=T%DQ@;cY{RqwAVh0swQn}u1CNdq|fhDb0#W0Z{^N+Z_Y^011X|g#vaa`y%c0e z;mJ#E{*KGFw(WczzSu_9*6S5_?RwJm?xP}=MyV7YtG>N8vbGN4U8;45 z!8Bri?%L_o>z#H*L38lfv+fms0#fRFAwLWQR6a{D4UflxS1)tlZp%!BB(3 z;$|zA>aQL@U%9+{by*zmC}5|)J0DUMrQS?W@U71A=#Ib&QNRe?pdKPux#ePXD^e&N zh(p>K4%c_F2d6nN#QPe=24%@NfYyp+|jU*mN zGFD>i(gNAqJ}q!``yd+oSWaqfr0|5wzC_9K-V6WS(i@bfff7lbyGkZV+)9zYg7k`r z-4c0>jf9jW$3>IZCmo$vkTE)}!kg=rsyq6Az7w6;XO9xu#Qpr8U1^3qe;kZy+ZEhu_Y7Uu}DAG%%;>mH;Hw7+jA>kO_v|QH5 zV?07U4egNQI!Ud1?3%Vjp(u#s3a;N02qMAP1qcP;O$s+yZ|?~@AtWOz^jbJ5d6F5 zWKAwJdwF)5= zIR4-N>HpqnxBl?c|M~~nM`rKdce}+4=a#Op_cX=V9daQ!`wA>gm%Y2~{Y=7(WO5w4X5Cf!1BW#EUEXg>~6Bv`|-%xA- z$q5iMjO_xNvhkRO9F`KIP8)>uAvK?XLEg!E3|X>Rlfz=Z*r6h!x9=DlLWptZ%pC7J z+TA@@qKJ0AqfX;qM*ya}w25U#7DlS*(B1wC6zYp#{Nj;Q`SFRj?3rN`nb-;to(cDc z03d&B)U+67u-NiZp8CnevFrPOLT*_m0Q8$1V^xNcaGXRzFYs!v`SnJ+ zZV?Aw7@p0a`X9rY?AqS-vW)dfcoGUO15JvR-L^Tfrj521Z}+TzV$`Xj=d%DW=f-V$ zj>pkCaJix5aIx>BZsL>Xp_nuyOud_XnY=5ij^9c9ot{M?sD=eb0p$SBPcs;bkyDQH>f)1a80T!aN5~Kv;<&O) ziL%#xir&kMIV-jDswwos#BiLXwd?wE%d=Act{=tMM~oD^6Y(mK(6l$C-0gsg#L+zo zBsyJF2)*T6RUC1`{ytJG+pY8D!HMIOaB_hzzyCgc_B-%_?|8>9_wdGny|K48z4LOe z_uVJE|K}6J?%65G%*;$Lf3!FIzDkn0njPzm#D+^IMx;XGIV}(zXTFC_6sI%CF8m-O zAT`!S7bh!dmfKwpr`!^!D}oCy+Q%-l>-_AVbOs5l)4rBdN`W}ZtuK#;u$Vg6>O zBR0Qi-G91XyS6zL2KxDX&MBUMZ<6`hQuV~#v00Y98{nHJ;s;1$h3N+KbiI2qkC8O9kVy5GMDqM-<IN z-&tX+-Soot^gHk0-9kq7S$98+>|vN$z+{1<`b<|f_VNT_vjd3M=@`|qh_d|$;^8jW z9@p(ht^JMSjKKS}K$u9KMw6IGd5Bhkk&gg70>Jd0zSef|-G;D>%%)MIZ0E?iC)Nhd zF`#tvq1!v;L#+?UML^yU-uSEUeRciH!N))GNdzGEdj06-_(AZ6?|w%%{HkMaKr9?Y z$Cr*bz|ET9D*8z#h9zWWNbfu03-3CNpmOsisP@Bg)S~iPRVd-ZPR+9-H1tUVL9?{3 zg$Kgfbkv8r_|mnVU;DZLfnn%_gM(}~OOj--*P|%vC|lO+^(vK07>0+3hez&tq>ozd zhNbtnjMfrB8iAYgF$z!1X*s|s8*a?Bm7%QZNUGVMoRb{2c<>TiIg( zfJ&v3%jN#wI{^Skj_vOyqP;!-DLAvc2OCfS`BzW>{Lc=C&f)&S-Hq*okp?jK9XR&a z*d7Qe!G(vOt>TpI_cQ5C)3-=BU}3C<2LqO`flz_*e2fqjO!!{e+qHGD8$>#aCDho! zPlm*t9fX%h=G^L`A*%-cC|7#?rl$!3r=hV?>n>n1C*h^?qr*JYh8`ijt40E2YPuNN*Vq`jdFQFj6E6h!QEq+~gAz2;4A4UDqHlQkW*SO#`kXX>lIG{Jl@H&5 zEN!Fvfplkx-x;A(q7aicwsklY1-Vjogwqr^$;F;YYeauBK&WCIUl?0B%5$zwAoLxPd*0U)j=?)2))E zoG?lYFVoIgzuxm;7QOBDBLyQ|EO1dL8~Zgfiw9Z|&g4V1s}ewKyU>@R%Z=*O8GH>J z84;Ov!w9QVjvEq(_y|2D0tCbrZ*$2xbYcqS%b~1v2T-DES)fcNbI*14q4`LIDL?-B zSM9dmi8D&o;>nH!3Q6t_ulA7%b?4xX*@V5zVser>3>lUc@&U+Hs#^c`Jf%pMzVCUA zx{$D*?)hrMnt`V{z0fycoQj+@Ee}weQc5R=VT{KEEfPS4J%D=#Wkl(fouJQaU6mv2 zLybf$eRd+CCZvh?FzIwAu^TZ$#^H|Nh|GR-xBlM6NruH# z)JMUqR&k1el^F>iNz=LPiiUoJ zbY4{gKdi#^ zA-oT9G(qu5yhcx^@$q|e4|S&1o!w#k+MUE0BAyE{LPnICBve_YogW)3o&VDK>Dnl_ z-yY$nR!q7V?V*-U6tKsWgBm0jk+b^P*d|4K%!*{=D4P)O{V8y5DS+E}r))PQY0=6u zA*Jq8)QHHcF(SbFT(Fso?oyba1zd=QKH{`v%r`7&Fr3;A_+$JJTTI$k#Gqkt}!AP?2>LG@kgkMM50b=Uw8#KpHvWlThSR^-N7imE~aDv`& zxV@Ds(#BdN?!U7A%@ecLMix9iMa?jAh77yDe5sp#^keoCajH3fDB*(E$7t7iaT_#&Pg#Fa4W#$VBp{E!ye0{~i zR7&sLcNh*!@DNALu~Cc0LTPmSX0B3-_j8O$a1e9CGYmwy5a$+#g|QdAm%Z(svz~a_ zx$m*Q)2K zz3Nug-Ea5pz1iJtHYt&!L|Gb1UNspzHXIKIm`Q?UFhCX{Z5;~U`|rFQO_s{)jLY3jYN0dr?OEV^TsWvtA0@DN!?^hFh-}$CWqPFg zaR?@+%#8Ofl&5vey zt_%ky2X+hc_Gn5{J&X#YERPyyBi1O`dD%SmcH+SsT!x&dSSpa>pj-gqkSbhoZ0@hjD5GZig$6sC2L_274tb6WZc?8Fulr)VJ;>K zgaZG}aaZ`F9olW)`lxuqK02tzk4qBn9E=)xe&|0fR?a7xJYbY%ZlRki$hlK6I9j5| zLbSKXHTJE>G0BLuz(iRb4Wvj~5))F3kqsT?lz^;dc9Lk0=Wo{Nq|XRT`Anpu==6lt zyOg{71I5n|$i~TL49E^pxI~u(l|@cxK0lFk+-OfF(Uc3Xz`R^vhH)pKTeE>XgH_fI z#-nF#cGS&=hX?lR#%Zi?l$Wmk$Y_3efO+@X$;_#hYxDVWoV)swTfC-FO(_A7A>G3ZE?g_M<->6nzR~*IZt#HMY@{ktbE_bupf4@1o`J#Vx%*xeh&`Zpe zo>|FPZgRNJh;y!D6R5K)5g3DVB$sa@0`y9`PvE_WBS1#>#EDNg|5uECJ5sZ1={=$XYzVM3f@y zER-9s{Zw4s3JX{5CtRt_5{#jbNU0AMKO-J5r!-fr@V{8Oyd&qfyW{b_TVUD)K!G&U z3EYfJZ1K#!^5&dfJ7$->(IFlkHlu6>cA%8B*xr5d^k>8`Pgg#>QQzOAHwqL*aZ-!N zhI^!P9wE4=t}FokEO)$Jih4ppiB=dci-YvC`y&QCX`%TTwIs7Pk^_#CNGYUB-lDTw z6dS(tI8OIRYS-4=aek0VVCuhGI*(ueH7mHcYajGu86=L*zW5Q_|MPGC+f{R=Xci39 z&~@!|pL^}htFL^p=NZ;un0-&!x29?ST>G=xg8eMm(UO2=#X=_U3gIuN=0)%1VXN42 zZZ+UiG{dW>m+snKcbH%zhHP0wHANl_$Kx_Z-U9jN|NS4o_Svu1>-FJapzFG(X&+Z< zeSCGc-|x5EZG=##)A=|$8bsmJ@^Z0J>HKULIx{AOCS;6~Hpd<>mdh*En8q-ga~uF> zqYtc9V1WYmv(UPKk3+i586vO9S@se>7`l6EXifKTGWM-qN_9R~$)m>jR-LQ%$+qnE zp3CDVhuMO46z#k`+|TjYE6y@|c#28C`GcQ-Vr1qd;e#3OkNPm(%<*}w_fzAXK9rhvYIJp;_FFsva+v88;#M^S2T&ne> ze!Gy~0Lro(hO(B(;k6@-nY>jM7M|^K(mr79$?=3EBJUqx#L|PZ2H3U`j1-Pe#L=aY z!nJERx!V+$3p}$zqCB#r!pVkQd5t!`_UrGH z@|*6WIV^uG7N1bObN`*M?C&qlzN>I0F?Zq={JE%AMfAD$>S8wyK%xEpxpo3;b$#jV zxtAHa>WLYvsWiBoi^3#=ZI-k60|PLM7ZYwih;NI@V-Kv6IbELsJsqTVJd~c_pNw!e zX=QT7_(y#S>bUwM*f_amwYNuGBRQEPj;uR$`BnL z+NCO>`aV^L*0jV@4`yDda4J(lFlM7*w!>j%!Wh$op3D>&r5UB-0|eEiNQ9+F{>;cw z!f4aPMp06kAJrJw*NZ?}IAT&TfAmtGN7PZ1nZwCT@zaS?NVv*8o1Ap+A-V*LryRLe zn|$9ZZbtK+5~@A$Vn3lZuoPuuoqDb_EC@Q6Gh@FqPI?P7e8eIxoGfu7UpYUOL@Y#8 zY935*F;VA?X=AmXNqsB$vWuC|zxEx+OZOP={D~(c!%m8~li=d;(Nbz9lHADn#?qKFl>+?ChSjdI6n!Sdz?aUgz%B zz`Q5~=fTsdG;A?FDSWu+&zh<67PEPpx^GU7io>$b31dW27KT{O5Ybf86cnRak775^ ziK$ zC$gp{af)o_%+h{3H6Ug)keQY1KYWYw>FUbr$C*USvj4YlegBWd)I3D9C0$e){lM zL8`BN_7%>GU3lyGVbk6cZDjT6NB0{y#F%c^w zKH0tdl;e~t0}(sE7!Spyv@3;+J^OO4^uM+*^4{c7W*Ay#k$WPO8c_(A*M^YX#QOAjdZMU`Dys2noL7!vrVRUA>Cp>u_gFoF3$?cAjdEtN zx4V`*cdDKIVANY5haFAI55{<-p!BdVsiSxdsHy_6z_M-_QC{lJy{X0UvdX%%oyX(w z@`!$ThUkXNVaT5P-2jamdv8kjb@sQkjhvVLh5az*%9MOP_mI+^d1yo`gT^oWDgI`aKAqrq+c3ji=UxmQvb|TF<6U> zIqfU3%-4iy%#flvJCu5CaPPdmd1SbA>m~tulhtK8Utl4xbA%!r@=e8rB2NUG0A5BY z)L4@~3B3u-YCLO5BI=_?oMfHItYIo?D3!R3lW$p=vLc>GEMiPn&`?qlMT!Uzb7D#; zidmKt#Ls{@^-{u!iyJhh6j_;|MH#J-_p*WbdF`5Sr`eU{_61u=Ye0n@?3|1 zPV!vICThW)8hQbtCt_KI`4~woCC5nAy>L6UC8YvgxzF<$Iez;&Nk(W zc;fUR>z&ch9WcU4luhgHuE#&kU8%XMjFL?qV1pi^nxdS^1ZXgt%Dh{LU?8|F;lVmA z9*JQ=DCdR7Q{iwW66buZ&aLAFi7A|6v`?kgKKabzm8H#B9CmA`+vV+%ktT{LJv(}K zX5})bxY1Z38D8C3TPh*J>PB~l9~kI>8nU=^I>7+oTIcnE9Wx|fC zp~!LkYEgI=%&g%Y5;o<8b{umJrMEvZIZiN)2eZ3TC;I9yeI*RS@p!zju<&t_dAr?a zS+>*Z6bglpYw15eeilX1-Fx?M{NNXcYtjD3650>x(<8-dK? z{3gfW6~OU>k5Fnau{4itRxol(@e~fW4DpHlk9W}YESku?EQ6jI6r85;()c;fHjHv5+krti%X3}{4PjzxonR0Q!jiaz$1tt;|0O{PieW^_~2 z|GSmNPnqUZGW&#e%NoD_@BYJAf90RBi8%)%FPUqxiB}hG>}t9q#BvX@JR8?CXaQPq z{AuJf{%GH(ro_xdOG=NHv%oW}6Gqcwe-9{}10vdEW8B2evVso*y?Z#^#J<4vhu}%m z0m~;}_)uhI$nzv*5;y_0#BpV^(-ImV`LjAAn-XStvKJsVOIQkA&aRHtaihJ`d%|*w3ezC~UMOjF zu;a^}G&`p?J6bU(HQsPWXXm3pk*UP+nLCYRSy3yT<{? zWblkV@yvDOJ_=c~F?r`Jv?ps3;bj}3t|J^}*bW)aL9)H;k*Vk$s(~}1?5(tN-LuF% zSem;q+O4~@B}2;Tx#zFGv~ccg`L(Oz%4?5Y?IZr=<7w-j{$`@M+np=@hdjRf z)nF=AgfSmqk{68H!Y%=8sC6p`vqAs-)aOmU)~x*yKU+AM9u*Yeb1fx$m_%z4n@XV; ziE;HJFi$c0g+;|U=F;WF9~${bD}=}*Vr7lyls{a)NWo$uFA2vNI0#nuI^8UdmlW)@X0QsgEt%otG0 zh?oV4#VD}2$!MQb!z9c{!#r28#Jm|kP!rnVOW*bHx7|mlCIbS+m1I0MxF+#AFjhVD zbxl7%`WW4$>v+SS8{2}8xGWFA&^vM;3YVq8OZBc(+xp}EI~{J zs!*_ec6e~~XyO)QG3O|X7kNBVri4!;bU2Dq7_JTjFMBtLF;7S;84RmhC?RR6Vn(2X zC*&ZTE%1Va-3moUsrcSc-X%=*f4%?Y=Th^0yiEGT%RiptTX%YUj}MZu3+)c|`iNu@u_lQ{ z;H~*Ls(9O^cV2cLM*3)#72UjUu=^ZKPw~prg%(JB47rO`g2GBqVTJ*l2ZfiG)}Mg6 zpjC>ZDW~&xt2RaABg?A5K`z~f{;`mv2ip0+ab+b~E%&!0t;T0Gr(W{e;Z(}SoIc_s zG1DlVF>to07!@jX6oYU8rS5$UC!Ws?XNy1#EE2m#T6^WC6?tcPD+%I0Mk-K$_Q3~$ z6VGj&91I7|g@yIC^?WhE6%gP|ywC+s=FTF0sx(@sr}6|KQUQFNF}&F6(Guq&o<}QI z=^%598_M>hEfR)&oHk)@rj?S&@#9d#LZc!+akf_EbzRjK7MgJ!4+eveE&u&~zgR4O zjAa=AzvoV7vst-VynFp&4$F?~lrxc&Wrkz@IFbsb;&UgT98EQj$z+krDCLQhPI z={!*8-hwRXN^M&Y)o>%DSMvs*Geb?NC1Uz9y2SP)+?Iq+m^MVQAH@K&6+!fI zI!!SEY(tb-2>#pU_VdQ4x5Pdrvrl|yb`bv6AO9a;{hj~ffMKUD+RinXXY*&;VhQD4 zHmOK_mZwrQ)5u)#=ft+W{!Jaycx{ncZI1$Pfgo4nOo7RmzzBlv5adJam}~jjJUV{B z&Jz|Jklec>k>=)S@6A}LWQ?Z*r>)jeRyWZke{xk2LVWkG@MUL8Rzs1eR?1c9YM9ID zE_%g3yp75@9YSPlEHa8bQlOv<%)oiy^CGS4-r*Hnv%q0Rk%l@o`?!c$xj z#vLcFZwRos(n@l?7JItCb4psj#f(qu`46pwc-8^?cfMFto)zd?piX0uw}CBa`N(Bt z^-cuCLEoSg9Sx=o%M@2twx_Z6JA%&ihMBW-*81sJgGZt!JW?yRU#H2SA45N$`hlam z`vvEKhJ)0xvoLU+V22Pm-)&7FA@H~@belEx(o4Ukz3|)M+%MnIH!5KHLFI+t-!RrpAxwUG9l{7eGobcDR z+hA4{)0oMwV*XKUsRnIX%sV#DL=Ny^ciJx#k&05_T6t|_1mTFqfV#s>!@=yisoDg3 zwgBjyc#GtXegAlv7p#p%UqSq?ksfd26403;*)>MH9BB+twGrBtDvdCuL_5RuK1jzR ztYIG=WFhplR5NG&!;AUL+mpj;z3MtPGqZ!jdKRWtZhizUouU#VT4Yu6*j83XRBgvj zUShjglNH9)*SeEAFRoAd6B9$KjrWG!(%2neg8UXE8*=6L{xFXjAcQtW0#W>MN1KQH z4FCDq+m}TYfX#aOnHMIY$4>>HNkmaA+KQ!&ur;HF^D?R#1ybPDS?Ds%+}%lSRb-2`Mn6nZ;#-rg(6Si@Oi@;x?LNzC)7g&5JdmSVl!UXWpNE9AcNCKT zoY-j)aL79w%I{asqL^V&ut%%<>lDAS5OxMLOeTx zt^i}6Nnjd&@Ow<3OsDayNaS2V6XuCs!CB#6SWjz?>UWjMI9O%iaQ+iFS~rA zF7rOe|cKHR4%S&B#)c_d^rh8I)q zGvemtVw+@l`MLGjwU;<%>+tQ-F!<8vzl;#-c6-aq%b$Ds!WUjV_2|}3^SH13o=f-z z%Acy4TWnzZ%vgzZSG|On)QcX*3#9N{hu}5Co&qsM&1tqPVm55FUk5FfFA#Ajrsr%(oOG z8KuHJO4MNL3v9@WJ_8|(KS0Q}$LZ*JnJe1)^$S66%)Dh<^qi#k>PgvuzYV;+BB6HM z53-q2EF`idRrX<;jqrC8yc|tqD^d9To|{GX&x)kUq}v5k)tX zcx^_!v{NGX$?36I*o$J#Qcq`M^KXK(CtxbbDxi}z+8Bk0NW9m3P#7y8Hom|PZxlH! z(s9Cwg=l(MYgR#YB7Eaib$vS+oR7LUYiBH0yPWi16_SJM;yf1Ts?0E%Y<1UQCg#yS zqAi5z4Idxu?3&{(k~$aULjkf+5NkS&B$AQCQ(%oWlL6HX4mdXPkK?6FQk^E8=3aj)}qKD2(Rzx#ryDc0J)}H&KsQv_ad{+{bBnul-U3=h7 za#WBr7!#P&Uma_48qKAm8KH`mj9nX7{T*6U^5YxZBs$AL*3jGWUO|<{EHOFl!QjD4 z#zzDQ*&!>j{wQFnXwk5Rhg16UQzcn+lT4Ok#|d%7tO%oEivP|4|8M@I46q5RKN^Y zQ=ZF-1I{o78g~IH$9gTF6HH#m8JpLR=C|v^8~h|-u@;7sUN-bJ&eT$oCq!0s6-Vs7 z-1J>^v=xG~m~mT7e(ovvK;ye3`}x8CW^VC_@k}BlqDWLTWpM0qF_-9+ib!)ghRkeH z4w%e`Cfdll7ON0%;JWUMlXo|HP`&b+#+M-+IH^tj9G5E|>(ys0Y&b`WkUwS$156B( zWoORrit_vKJq&iX5y60@6lah!5V2-*%%RDpBrd?gCU5)f(`Gurr8A;n(R7$gluwRo0*Kz3-k%nah_Ql>ad#mZ#ZFoicXbKTt;tF{Eda9zn#Rut@yl>PG9{!9zApfdG1i zV!|)#h@TFJR75HU6Jn$6P#}LAgw`HTzsNHU3jJuuA&cWWolYS2* ze5Mf+mvR~pQcN>8Pb@U2kPjr*O1-(1c>su{8Q(3xam)X*tsKP7VUqsg3vla?*|dLShJHRow+qGdPx{@XwPBzI;kqLkv0 zgaOPF03d`pF?1=Cxl9m3pAwmiV(1fw&v90O<}unj1h;nS-7eUj({T(IP59G3{Wn|m z54N-a@p1Zx2iZI&5(6qCGl;3o0EuPhNd_QmaHt<=d5(`T9wiw7Y+DllMZ5gf%BKm+ zPs!{bK;65y{_=Z&{cHd1_xd!nCmoh1VrmW~vBG&aL(1_WalN^Hb14ka@(VZkR&jX0 zMt0lPg}vNrHzF6EUDb9oVh;ju)f<*2Z!vhRmKH)urHNcyd+lfVQ5m>Y)B`%a5{#+I z*TQ`uf`O>IQ9%cSC~Km7a7~LGIMy@sl>+-73N|q#AnzERI1qr|+fNs+^?_d@PgjCD z$xD6WXUPmFPJxc^hT#kO)87Q@)QMHkojHe>`QVg5)hu;p!Cik+mh%2&8cW)-ohlXO(HBrQ@T+EJ^31Y(CM)x7Bc8^oG62@*>xDLzKEImn~ktx_hQLk`BV>2gqVwy{=SOi1VSnbEypZ19|4%(=s( z#iBt4ptFKlF6f*@A-1D5jm37NUum!!Vcg>K%KP0X8(i5=!5q%2fj}h^V$RK+ z6O1wOkIy+&U)BCCTPFAK{Wr)x{N=Czo8!rI@BR3{`qf{5{KbFujgIxw$ZBcsv1B7? ziv8WZa(ss^tj=d4l9n|n#A&btBRih(vuCe*Q>~z- z0Odr+X667hZW>vP$s#WbJSBlvU?)jj2du}$aq1(aCNW6dfjQfLVRHX`xgcKtazA65 zSrlhsm;fpSN2vHPgDo#QX0;u;nx>A)7se|q+n9Uz$9J>N0bnGMxghfx;4xsb5KlJ2 z1hNknxj+?Kth~}t&U98@bm6$hB_Xh009HC_Mp-#f4|Qf)Ge25 zDI2u-h~+FXiV9RZ5``J6zT>U%V?uZ&`%bOaimBqpVA;<3jis1I&y#~;MdwhM6S*Cx zF0wMMFYhIdeEs|*^9xTXx(ZeY&??hug-JZ|ZW*daGQv#i!OYL#;>0TXK0(~ta&zs} z#ar{6T{og}vLwQHI*-zM^tl&b9S#N@&ld^>hGkA%T)g}4pVC0cC7d|*%vNvwIs z&G@>U-ma#W#5_sZLc$1DeDkl~dh*H6KB1`%esByRWK=H7*enH%#`zJ0F~BOH#1Jby z;Fx)Yh{W+4lQ7IU09_Z}AA=uvz`wo^{`Y7z`q;v(U;whzWoU z03;%?Def#uhCk)w(-gN7=QNn~k$aqsWo}-U^OlesgtJLf_d^m> zM{wkjczRkGW;{1m9v)5}6g31SE&&}Uh8`cXsUcLK6siyA!iDLaF;J16X2d&%rW20p z-l2uzqH~)g_g2WhoE@~dbSP?UGAzXNXVjpU{xlX`pG@2+n0CN?KN}t<(?i}mh`Fhg zMMccAIUupz>E-j>|mItoL1?i$rUTUEnA99 zAB9}bCubr z_v~GRgiv7l8MC1+y=^YFo!NtMyWOjg>qaF;J;`c1VU)XgBX>gU&hq)>Vr1^Vtp`w3?;HJ4q+!+z$d=wfFmsPx)nm2pEnlDBqvYa-q1{1h*Sk{^DTz zKOEfiPj384y0r56y=s8>U;CXmpWeDSdwg!*4fVCN4EKbyh7R`tulvZ^14YTfRuwQ@sGHT{T*W+?ay}1_!~U zs-RVVCbDV|@XE3Ith8>>30Kl4E-=&ZOy+u8ki%05RRUv<&(%fXaZ1B%b|uC0(Doc3 zjgMheihMi8oT620B9Mg=)~c)w3{zNS15{w7qC8_HBXkZUc$zbIv*DZ~)(wOZxGZr3 zxiC$pBr(D)WV0zj#P7Jax8A?A?jCKZ27d9&5vMPvROXne(3_P{}EGVNoHV||UqBJWLHY6tfi z`{1GwAw@#O&6p&!{9fo>tDf9T(&h4Vno+WZfM&Be;S`oWmdJCdcj#vYz88gI*}ti2 z`2`?@oMEdci7HM7UXF)^9OeA`6;F;LWN9mNvOwjcRa;^4-Ecfi0+sGVDP3K1)&V*R2j3`)$- z%t4(G(!cuOprp@Wg*LvEm%eRo%ZT*XErGnSowilYTUR@W~b^64U1IFPM#LvOb6!VkXl z!%uehK?Xt=ddEo|LjWPl3%&;dgfYWr7-EHwBj8d-)EGNP^AvF!;uI7^^IaY6wgroe_61IU;>9LBgJ2!58@88JBie?C$FOhNsWWc#E`@)yJf%zj_ z>JGE#uqg9{dp&(P@Qd^FIhMq-j9a$;bBvrIP#dcLX%pIGFeLI67(^{01uvG zL2l*ZV`o=Q{U!e(54{D=cVy`zIhcri9HG^6wW_5~)K$Wnj>QYj>h}wutMvC&o;~9` zlu*-~@2OFT$>$MVmE3PTMG^^Cj75j4e$OZ9C_^yA{m4Ek0Y;NZIs@L3KsSEX;d5? zO|70j`3TJViF=$w0Z?62p&JWE`}BF#deyl2b$Nb#yLIIk?8T3`Ymfcbhe7SluC_A> z5)TvGUG_g{*{}ao`?}kd0{~G$utM(|JcyNt?PB#QQ%S>_pe#1UQ%Y^~X{na)J^4Xa zT2E#JCTH*b9MJYIle`e@w0Yep2zqIAEgxjCCMOdGt(KONQg{ZP$)0DnE9aS{iwDB+ zpi~vTl<2WF#`8R(a&&xaZuq#2!o8P{zq=Ms7FH$wS&wF!I|b3X;)0vvLHbrUdd9*s z$}u4iqr^HB9Obo1CPWg`95XpH&8UAYicMK$4DW!=%l$N36vIKniWqjJ(QBPPFR7M@ zE|ryc-Puz4#huBcVxe*iEj%AaV?HrMdNzdDSCDqRKV!1=XafB9T0yKXoTg4^RW1Cb zL`UOcgUtz{Apw6-t5*i>`75t}Ti|zZ-TX~Sd82i8ZvuZOy>r8ZquPebs2kYb2x|xD zH;=|}LsKIIR7q!5kV`D~(Y%ed$5@!D+$vYtQp=fWay}~sc+d4YKM`!BFcw6Ud8>ej zR_JHAj^qXEnNl;H|9W+r%o`p}n z6qnUX#4kAxp)ARyGP6 zq->@`b_Rx_6;~wjZZJIIdKlU^j&uIL=i5lcxxjTIYI{y&6hmu&*>TRTo6PCwU3R&W z#4$EJ$rxp7fP`VdL6)&NFajc@wY-#Ru?@-sFEQActQLm9apnRBz+f^}a zWcQZRTfTsDR4yk`qQ`m8%~)ZL&YzeI1@9hmpP_KNz%>q%-d0vwnmSbXflye+LxKw< z(G<(eV{3Q0aP0u~=Mg3me>r9zYm?G!izXvMTjKHy6LlS8nk4-~rhR0#jrkO4)J|1K z(odw}H?VuvS>SXT^4N;K)Jf}^Tg@#ZUG_E6ku^8L8KO!&ZL)&TVU<41W#*7Kwqh6! z9XJTSBBnQLc#|6ptO2mtnYMCtygPdKOp^@)DbKMp%dQnm6UVtRJu*EOA%z3nMw#15 z22u(_7B^Gm;7%O1M{!{qp1-cf3(RnQH0Ht(i6j>FBFrR3?>Vj!LBKJFuKw)SJFi`M zl@b5}G)?nw8_oarj>gAruR%}bw8dFjYJ z`L0vjTz)ajt<89IKVQ)u;fLS<{wF^Bq?R&&=w^O~6(I@$BeNl8C`3eH;sjxdO$oF! zCRbvd2+dN6c_hea5(6K>8G<$h3o6L-up81*LII#{8FeB805N!Gp5Tw+EF>t;!H>QF zCJ&nu_lM`32!6US`;^T7Vf6UU```Ynzxn)28)?e4#|u9%FFO09%VIEWfAQx0a5d@P zQrG(Wg(sHTuzp&e{4mHyugu@8XAhqbtoK-Wf%PAWhu3fx>C2Itty_=psXvtHBN z3G!}5pfRvk@r32)t+T#(C&KS&yN?}bdSMP<{Jy-Zq@y(&jKl77D0PeVc8K5L+neEJi%pf@vq{1d|EZn{SSn6{&yJNdJU?h$ z97#lymmRCC5G~^31{XirzYT)2n8{f_p9%FlGjG$g15u`-=!axUS^6NIn3LTrgPo>L z&Ma=szxuEKC+)Rw-tmP2pD_7k@`s!=?afO6`Lo+!STSy2_^tnVWALl@gD>HS_w(L? zb(F%jV)2ZvPp3}U$|iHBRgB`hqSz$yNUI8&-I~m{xmHfB&66<>rVYy63HBBfER?^H zl0~PgIXnH|Q3`|d0T9R`rpicR7cXS3Q}+B(B~mp-cX^m+LQbd!Xpx7*4SH;YY)A`o z(r4^W1aqd@?CVC2)onRI!>t@AYy2e6o$skRccK`qc8u?jJtZ2$B0jW?)3%Mt6x7oE z!}UV9pS{Glk18{-8!zyii6Y5fHdbEx5nEZt>;kWLleZFbHaD|a0h8>xKTDJ5*5Rdg z^G|Vq^U;rfqqX)2efuAmhztkSkfWj<`HVDj001BWNklVfo#*QXxlq{Nnd}w*>%0H|;+}K9FO}++>mtM`%Xh|)gfLb~ zab}Kry7b{>?~-|41Wre$QaVIPQ%zaf3}uh{q1WywFn(Eq6QHl zQX;UT4$p;&86tiHMGcQ-J`07S2hdUs8Al$oBM}^r zT^zYyGCnE^7%O-g*OK#dhoX4VmiFe$0sI zOU!iQ5GSj6Y9@%K`Za5;5f}@Co0Ovj8Hz+P9EbXB2{-pCiNUj7>F1`5+9Bkc-N7S{ zcDyiB>*^DqnY$Eb(f!Vikul+sqxqN^QUAyP^j|-C=hauf`_0|f>|gyifAZaLy*?sn z$*_`Hkmu`}x$FSV@EB(k4r0vf9IXe^bM0|VjVcK2q5+s$Q40LjAI7TzIxSPt#Orf$ zg--}#Df{Iw|IaU8{`t9P^T&(l8;wSqrkzfwTCM*0iGZRgdyjX?TZhB=A?`T&Ktd@l zDk2`mNuZ&P^IHzCVyqOT7MH{_d5GK~oDC1QFf%Ta87$VXgqVTcR4$d6)p)MjSb3_W zsK<_0aTeM(ysgCYHbg^8J2Ct&4k|L_k#_3ncZN~gs3`(_+N zj7C<70f=ygv|U6>xamPmz`Y1gJS1l^-G|c%5*$<{c;WyJ!5IYe0@NeW^8f(pSsB~0 z5&)7qhY!5C#^M7n<_RoFVlP2Fj)F9CV|3%WIhFWmhS^6l`NytlfN*_GivR2?R(?s#X;cZC+Uik~bmIvlKI@;RAFk`a&dIL9P-11CtIX6!Vo1oE_z?bx$P;;wg% z517TS6RQBVeV+^J+hQge?B>gt9@Ek(U^MBBsMMU09^(FAxx>@~FxaK+&H3SLKcBvH z2H)8rJF<|hvgTTzZWI-qoK;FCKDyD&jtHDzR9E80Mkaqs%&&~dLOaQMabwHP4pPB# z`LQp|@ci+_v1gHM_+~Isr$^j$s#`-x@1WrxHQZ$NZOIvMtdWz_vkT?R7d9%FKAoNW zI8?Ho%$Yv_*=uRx2mQ=D?v;P&aSumHY8t6KThiT9bn7|qRtX%gu{Mn(iiRvn;zEVw z=g(rpQ0QlI!}I4t4#D9)Jm`HQ9o-?#9HN=j#W~}{(U5_gWUHG-!{+gJR-F9Z>^_Dv z>w)dyWGxxg7&wHXZM#SQ=!{&jfGcux%N3I>SLn17!Bn#1y}iye2~cFx65PI_eG*Q- zO@^dtcKOR#7`Esb+8!MFJQ)T6^Pt;^L5zn1i$sIe z!Xf3@K}<&}6%xd{tT5{GL!tCYqhI8lo`gxMLNOdy-T0=ho;BMhN?E-P?GsO(1IZ*M zaXSD7cpQW%vGpX8et@mlrtJtnPT>4Fenbr<*;Eyo-xsHmeLRhIeo%!(mU6$N2*?A; z*8%^2tNqy?)>0I#fAC-6`ZreRAK$pOcxqMjCRxIXXf$GJ&O(W-Ko1?z!g>PYBnZt( zhKe4i#Mu~aLVYEj&K!LPeA+#djV|FEvWe0pt!1+G=Rf!1WP3U=gEW$0Q^Mv|ymoE< zc`>9So{JH?kXX}{lNg0cGkS4di{lZC-_fJ8j&Foe!+J^Qp;~TE{SKr!9+5W9DuJ=2 zvUFp~B*Lz1uOb!{SUSigQ5RleM zcyr!-6N{|nB>(JZUo?#Ykc~;-iGwutd(e3dXeP+4CB01&(JU6JRs3t;{LV8Q&!lNu ztyYsH>2x}ULV+a7Ua!Y-9MAJN-}#a7cqj35z6vRvG?p(|GTImYHx>VW(q(N;-x1`r$y=`$9yESpJ8r){p+v1fBkpQ)OOmh)Xn#{iR}v(XJ7q|KZ|+l;N%yN z|Gvr1csk(;Fyd-q#IE`DH%WI@?>}2z7#3uemr{YNG%kmshwxZZ7=C*KlyT)9te2g(K4rvEqA%`cPYJrDZa4#n2x*kCNFTp=ls?6zh9p|9GQP zMsk=zi4QD{PM7rd6pgp!LZ|+(sUM>qp9z?hM{QvvEFiLx-@#M z>ATWspVK>8VDVIZx-N^$`R6x2wes`7&Y%9Zlf}=x>ttKn`VWa0{=KpM-f?>S5PLif zg1!+un(B?#;`{UF4`1}Vu0pfGzKq&K0e#%H?`LO%?+}8(`i?BDexJD<(M$Wm-NK|| z%5^0f_Ta~crrAix8-+})h1J#p0QJjgpWJY?#b zCyp1w|NY^Q!d{n*jRh~5*X)0`d;gc?Zu<%Ee~Z$@I(N+lzrVlv+}hfgs=tgmXCD@- zLn4r%c3}w4mY1_4ICZAS(783w)FxnZS%(M zmQc&C2V0w~%g@WI*{fc?K0JBG9!&A@Gv&E=tZ9{zfpuslfk_p-vBQmTiv&J^ra&5D zG?~q^_sMK~=9QDFo#Z=C)}5N|IQ7SmKbuYu+2q&?&Xf42uzaSR-Rrg}mb#eWWcE}$ zzWHQ`?sC|C_uGpE?&VkJ!ohomOm_PCI>@hh*@c4TWI}58XleF?v$R7f>j|60h_`z*=8fZ+vT#m|NSDjja?NMYl4bdwM_aBF)8sTrpLAeV)RQPl zL;`r8EeaJAc0A85pqSzaPL*#@$2;T0%O{5m9x2ti8`QWSHH})G=o}DYF@YZEWlLu+ z1OO>QapVlMBrg|gP^3pbOHzVOkmJs-=C@rdMJ|qk0)V^^sW6RA`)JTtnyA4RD;W+K z@s_2(5o!~pcP)LlY~C+WkJlvm!smYbTlFiWE~7@4r;#E1#k3?%AY~`S zg$6lZxbW?_wv5O7AdCP^5k_MKznTOFm)%H5K*-LA8k1Slgk}TJGF(3d21HGe91a~m zPmoR;Pyoy3o;@K*e0Bgy{Yq%y-m#IrkQiH1=ujAK8iQxJ%A+Q~9uJIgTueR0B$n@$ zkr{~Ok=2~WT_x%?8cQJ%^vF|F*`zU%sVcD%6nI+Gd4Cunn{z`hh@n_dsZi8RJHB(q zCi17R{GE17O}9$k$tf&r3D_}r_8m|LV6ht=o%XCTyk9jz9WQlBvuZ<%RKpaeDCh9p z&y_BXmYD6kH(0mps`ALSs`ZUu`Mp1Me7966mMayptai;Q*%^?t1fRKU8D$G~{E!fX zyvUj<^7q*SZ=~O8_tf;pHD5;s@i{G7L`+b5-a&H0LIJ(A+sJpTF*R5^) zD2+N`!c4=RO$L#={lL*~&3T8c_SVz(4W1bCH%YsMlx0Yo_|$e&Oa!xO?1*doyEZQntTjcNe40jc{C#H`k->j9j_H z=@;yo%(G{+XZEDnwHNmrpUzDt3>AC+X`ff4x=V|w$_MYTPB5?9(^I1CzmY>v> z2Jf=h(%!7ki2@d$yc65@PG|8Rk3JpjT3q!9hJJcKC|1ZD9{&NTHjP6yl|e(kWt#0# zu)-^t(!f(~e|$_Q)C9{66M0!bnezrhG5ZM7+QhT0wA|B`fYqD1uXo--od+fVRz80B z+2P}&-Olo-+)Karp7_Jb@GEEcUj9vPO7}b!P%XE_(M*) zt*mWX@IXuTkox&JxQjAJupv4FasS|ga_Vu>(|krkEW)X2u;&;%OO|y$90F>Oiw~7V zH^VW9gqE4eWG2P^yO_MxIt&0o=LBssfdCo~$QD;H7`5WKR=RjXWR~#Bn+jX#c_G0P z?rwi(HmFO*a_GjHT8if|?jfOHM~mYjn|ht3^}+ecttM_t<7&jBjF17SmyV~1T9TYtA@zuOslCg7FJ}#*Bh4Wun`P6^@ z*YNzHA9}8f*|y^Bw8%Uan-f*t#26bxU4(dCAXN5kW%=u`-0-#@q)7w`I>i$SPKs%F zJ|%Pb`zwCn@TM=EMg$$B!73#0GL0@lugyZS$QP3%CYu4%0qzeDoO{jD$SyL-UdWfv zJs{M_)9wY1wxCUTpuq>}FdfS4MVm8}QwoRKOhK}oJ)y8kLKPqyAfL}WW*7#h!4;Jx z>LQ@d`VX-D&|$5Zu6Er!1ThJ%b5SfZJ`&`xt*HVYp_H$0+~QT_g%#vfQgtX+??!%P z-;(XkOj?Su$(ln|jp2zfk<%FsDID^TDJ612#tA#Fy~?le5_e99Gb^;qoa>(WKlg>t zH)?fB6vHSgPA%qXfLvM@V3#L85ecKvqR zwEze~;3t*^gM;T?Vjl~9Jex`Q7V2X|KqGQ}eI3KFe!s6M3d^#(HhZ}BVD|T~rLn_e z!!2BsOp%3E4p=CONr_WV)gGFYg&>6jn$m890X<}UrIT0KOP!ymR!IlGJ2sH%f6tHPR0KpR~d}O8oq&R|J zk``!W$4P<0>^O1b9}_M8=H<+1@*lD6Bboh&IL-WDzW>&v@|kC^9!cN2bpGh@ph_^G zA&zsDzTp+0df{{1^guEnY~X~xcy`_~gL6-O*SjDoA{4V7ZW48zb-irf@u>4?JjSD>bF6qzu9N+MG3=;6>j_AD)M z`<970b@XS7SfRk`RFikY-;dMI37{K31@U?-eV<&O3;c@qu?2BHwgU>Gl(%m z!`zrBu&g39>x!~aUw!hITwz&R`~2JF+Vv5+6)k?pox6RA4i5~rJJp>j;kwnJf62JB zZa=t!Z5MF^3Zn}M^eRt4NjiZ%UaG`yN@w4x8r@K93HdqRk%V2&IPv-LQHP5rHp+mD!) znj0I(MSgKGWLf4uS=(}=t7PPo329-E`BKMn&W1a8qWGC~(1{99`JlI&Kk@uMzyEya zM|mZKsFbVCjhQX&`OW*5r<5SpR zK7aAG)n9pdsGYL6x?Shl%b$VB>BW=*yQ$qNg(yQYEyUxqRwl8RM1D(E(lB(r{Q^uZ zL_(NtB^e@;ZrWsV{G$!66ZuGHB)2J@;Mf?0?@&PN^gJ)%S+AK;DI*sNKET*SQe-?B zyD=xt`4l|tb%trI8|+HyyueecP`I0#kqPP$299Y_B4&>OjiZQ3CVhEsy*(PL%KSmf zhrC886VX)s@4f+fCc^H%y!|sDrrwR3x+3A2v>QD|z%c+;G zW}?6+!qCo?dV^cMI~!`dYch_fPJpp>X3E2*sl-w4A;~2IZcvbZn-cJWW3-4>sSUNd!-zqYaZ>6NuDMGkm}Or~nJun;2B4En9b(Od&=G1rMyzTX2A~*B%udbX zmBt4r57N;XK`N3KPVVlF29r~3OO|C9i^avIh1cJ^uG*v<6PV^?YRsm;rKCu5vNU+` zcHFrzWqCI3iMVNj29D_YvSn>~Mw~_%7P+{m1(?aCh8IO#%3~TIild(TVq_XwP8SE9Unm_)^i{9lAH7%7 z1`Ob4SjUV{EAHcKKm6cl+I_5omsXikKbo0G!4xZ@dBK9z=9x! zP(!dJf_(=707Mc@g0#ZIp`QYf+A#niv11?;z)R8_143?@hn) z>dQ|)bE%Xzz9KYzU;h<_QNGA`%kR=#`n6E!kqcnLmbl%o;G`9 zsEw^da&mjw`QV&?KaX#g^*0*vy;I>%9@}dYy#j94@@fs!VY#`^u+_6q);C^QsBYl( zCzQpfc$3vMu z4kk^L(aE_p5WSgIy2>+Rdn?Z7rGOJG|GvEXaWi~aTj*Nx6?}S3SZ&pu9)#B z+ivbf+TX0x)qc3UfoEN5?%g2fMl`0Lc|Rya@4Vm&A3Ie_MWdGES~PjWDW}6Li!c28 zzst1Z?RTD-abKrv1Q(yFT^38i;ox;@ zRcW0qV(y`n~^oR>xfW@If zaH#3_BIp@hp0&Wp$0@{Oe1=VwNzC1vChN{HaQbApQ?NPAR6sb*l?Z%o?T$=(?QvYG zZ60ia(2Y`SCi-*E3PBSArLa6lM^PeyICf;Jtdp@Ks!BQ$QmafYv@<#13l_w13=<6U z>#3mE*fb#|9JLZqjah>OLo1lY4r7N@;2|*w2)dlF_X(L)RXZRm2#c}obdp4fj;tv3 z9ML!MOwJVIp?+^?r~U3Yn+~J{x;!}oZLE6D=MP85Rg3K5lAa>P3g*FJSdbkmvkx;f zMA%`N%`1i56*ZZe(#n5G!O@K}WdA#I(pC$Z>d2o9%}5bxCcHWzmw`p#CkYc2g46+UlrzL%w_pye`YB0v6?`Q z5iwUA*n`m6tq}RcBqW%;;zvDJ@$|twk~G3&#zTQ5p(s7nEZXx>&?+Rf7pA*Ru}F~$ zZnwkWs?UeH3M%H_CB>t*{W(|1MQVzHNLP2^?$ZA2vQxc@j9Ro6hsi0d@L|4GjcWsj zV58DQzDRlL2}a`jjI%=4jVNV4C=(IcIcQk|MS{Q?_og&SUA*{&=Xsj0Z9d-GiXrr4 zW;>0kckU%v6i8_j0( zPyh5!fAE7JP!!c{Hb0WhM>6}V<*(n|z5c^*F1+~LuR$v}o>W-pd7RP_ zAXRqKjlWKd-yW{N*{0ePi zE-hRc2r-90#_ge^kts#t`S>KfVOa6VqumK}hAe)MUnveAW3+xXN+(OKf;GOK;{Vy? zv3~YB-Z|irl9nkq^t%a8yU8XCF1drFU{7(J6vual9G&i%0mWO+g1B%*3$)!K^NaH- z|DM?i`-5^g{s3FWQeX#Dk;{Fss|&W;iTbIRvc@#Ev>?g(NSSBsTNJB=Gcnye^b1GfB#Tq?lc48x|_ifQ+k4zNs_DXm|6-<4fWB&g1vGYyRuniP#Vj%!q9qP`xC=6=OV?^+l1L3l zp;(N;BWuQs3mD<#8P;_Mc}cw=POgL+Bc~!)5P~2 z$6>iwU3T0Wt2CWNp$uVfY6otwGQBI?TM==XnsCS<1*Z##E{TyHDmh?I?;x+{mxK* zft5BZ#leXN#HSD3p6a_54132qy66Rv6GyyK8V@mwiF5N4j3xz!@Atf|!|@KOs4k59m}2 z7KO>p%rI%v`^ju;D1|L*o+t_7hbzhp=NhrIKDA#Y2 z+bffYT3Vp&;~*UslC#@F=4^>0lg`Kq!x*>##%V%IsH?dcSt_K{P|zRs9~4meXurkF z!pmR#Ka=aPJW^^X(4Jd6e*@=f%N{VFpLzLnjxNN*nH?6g{xy8Rkf_y|iCAlhNpYl) zRrSQtMuU-OI1*RMQ3N7RvT(7*HDG9{POk~$`?Pcw{qTVGb%vpXfDYK0?p%#5m`ipa z85y#>qi@~M|F=lrJb34wpGx=r&hPxrAOG~)-}v;WKRp->UVr`dKlp<`SYBRc80I6{d?d4Bj*=7+~NF#{j3YXc(+y%7J%47n>WY9^*DkbvOVR-jyde0^ur*8=k!zI_lMBMSc zGa)s^hKo@*Fx%zI7f_Jyq{Dxqu70y#6NcR*@fWUpR87~;JJV7{N#p{dbqm4+-n_9F zn@jPOqSPTKCc1f=X_~oZT~sf$$9s+OJ{(|V`P&13d8*4o(WTtFF|*TdfogOitS8aL zH|yinz(%iv!OCn%5ad0yGP9%k@yUEh$c3t1q^}L%C%6BmJbwH1?AGaU?&h=q^hW<# zDu1>oMymmSnU)rEOqU%+yc%IP2e=_ye2&Q3)rueN-?2swYkjG(b|h%5b`(iy6q|jU zs7)iwL!AUPvb9l=-oyNV+8b<&b%vB8KhoV^FPW4)fu+5DZ~B}~x5^D3tJwnGO42#~ zXkB2oW)aTp({?+W(zU#w4%@r13Jc54(Loyzmi^r$LaF=0J0aB=?|P}`;tN%+vpl}m zF0^~PCd{lYX?@-A>{1zj(7edWpNi;q*vs_3#WtY_& z)#>{bDJzQ@USYVrg7HjVtd;|s4RI*oWC$alQfv^&fIXqh zsXA~X4k{Q;V-ygmi63S$j7T&Z;s;WpXXt$FFqWwTn{7a5Gj z-XD9X0AJ4KNP!R(6=w&vY;=u4K~Se5M@cw%`CMur4W&ui9$}@OIDlSSp3=# zU-J(iBMhY!Nn=jUedm+2Z!afSRDb?Ml_~khDY97#PBEKCH8xO3d7Sl9l!VJzq*WF% zb5zEFtCR*@rA5w~JX<7(i{9aTO3^&*EaJTrYv(k}Rq-B^2&`s$PAap+{!A+;ekaPj z7Zr-oTEH`-u%!})Pi12Nu^){ofXzW`GqOuA4UncvvMb~xBj6CXpNw_uQGYVVeSS9q z`jF3NF25?V=ePdiV!r%$rNtcdMelB8jz0m$e&Mt4^XK=o8)Uq@IHSyqoh5hNnRr&x)CH&(T<7)WN5H!?RtO#i{#o`tjv6^9%FcZkHm--~O%N zxb@ZtLgzi?dRZIE7n$AJn8oNaA@=E-k?5=LXoC;lu8vTjKMrEx@K0~MxVHFet?z-R_tR!`Apup{Z12R z5UUyyL7ZN{M&F;abdgZHa+U<%P>xv)Kw#{4`p~9W1~5ePnB&fxVu-B&9884uX3skX$=|(zsAOOHc2ms(9$dEu!esB>@@r7xDS|M5KeZ_m&>C(Hv@slqhPNZCqp zebdsU)Y$gKt%x4=OF}p~;g&Pjm9OM$T>nvnI&%`Y+9s$a+hly=`LkL#3H-&^(88-d zj2JMr-pecIF&Xu8bM>{wQgiJhdFm6xV*U0QyKXlB*Pis=iE!BU0)1T6`fK*RVtl9M zzg@v+XX2ZuBH$EVnkO;bjSw%Tu9U(ui4&AV6q=l}R4ro%_C3~b2+m%1;2@|jpoA-=q-PZa*wC65twsy+cbj!W>tdFg;;Yq$=G1N(S zS{%3$%w^PzA?syDN(VD7XgxVQ&gX@Gv3MNfDzW@M>XTKax=EogNMOp*S*S$lR`XXW z1srz|#hYwq=Wn!04tlyQZ8sWF)cJYelAxuW8U6c zoqi}i@q4cdPrd-}y$YEnCkAxcN8&GoeS>dB5b{yJ4E;*k-qrex1PJWg%W!|sy1V2c z7>7YntF2VG;OrbxlM3>lTI<@gS#R%)Uh%M=c-`r@VNAxUjW2t1RTNkyDz>ua|O;&yjXf+=Cyr=v)UJIf%9g`6rD z+m%(;rQ(H;9Wv$Zq|!_QRVz^;%y3PdqXd>97`BL0k(e+brP3(ttB1w8AyqiQIRneY zo?dayG*^0)RQ5i22U$}tzgy+3zbBt;n=}O1i{l7 z0r0^UT5PL}gUPTMyJI?g;sJcti}i_YiXFa60l5=T1vnCvTwjHf$vgb*zto6v7X|g<_^mGgqmzk zfmcQAuz>G-SaEh#5KW5-O5ExL7_psggz(glijIKSKldXpS5ZqQoa7zsNZ?(|%X^ld z+)phaVv&nyvVmm?_?jd3#o8nd;*pbJSwTLH%K020?{44I2rLIiySv-<`~pc)g+hTK z$*=vxw`iv31cZ?Avar_A99t1c0--Vvd_Fw3Fvt6hPo1`~Ybn50KRB|nWT8!Bc;l@f{#3f}PyXajip3&L(+dj= zU;gr!+wJxr{^1|O|JU4C2!SG_)9d)!JSIwT=0S#mV;>Y1*z>@TWyX-88vzDOCjnRy zVSxevQ3L(O1>%pE@g*Mpf9_ry3#esWNs=V#)TvV+$>t-O{nWCv zzyIB@zI@@I|8p7hD}0eFF1UboVC*>qm2d+XN|9B|aI&gMb|6dmd^YDN1VPJvyu|V4 z`x6*I;SH@EquNVTV()|)jOg#p!r@l`&IxhLrp(r6r~5dt{CM=CuMNEMy(^=AKDr|$ zH&*o4B4=PMkwA5vk^n9nQln}bxl@-O3(k6)UNGagFMR?A0Ugb~P1PQnF10({ftmK? zD6x(z*vSKBA?`ln{2f2gD#?NDbZpX8?JdHzv;g^zJ`Nt6Q_Y#SOT%wGp}o35+n26h zSa{|O{f#fy-KBPJ?rYeUza3Ssk4rZ@mf4>Xv%QM7Q+Kcbio0zJA;k(9HGDxkNQJmW zpZ;*}Lgau`;H0mAPy;EH;z)QRQ9t=%6bqVZxKgfAutT`EQncl)VHbT7rz3qe^bk25 z$KEOy6TD4Np^G~Eo^XG>`!t|;3u~sAIVaMX-|Lqyj!;^$c0wx4MbSbwyE$#C!*aB6 zKH^Wt(UYh&cQ8xNw)b5+^KkBB-bgJGSkAb{!tiLsNm9V{rHH^%{Vd~T2xIki3 z=zia#3%&7`1b=XP{hNkU_35Y7)(A!Ax;F=hDL|%(QFsZpdVu+aj#+A*P};A1qzoH(IilR+%M* znrV}3jK05zvz#fjlrWH-a>(SP;~piMOhz)2yA(MdL7proJbp&Tbb;Q5;9QslbP_|Y z;3(S*m#CeWpI?6AC1sWJ%q3!vv{K6yqWc4?#!w-K)nYU-tW8V$$3!;sm)6EJ+%!zv~G!ic53 z^nmgMfK`Nn(H)7I(t@W7$0s8OcMpKJJsLmLEu)L-1Fa*)XE%55tEbAdC@QCzscq#= zty-mHFFfGlBh6fzn7kq!(9~>3C3xg6%SE(eBh>$e&j=n0+jEIM)xv|g{4!nR78NE zG&Z)(KtOYc5Kle)emD(nG;u>J%mggXGDSd0SzJT}gOq%q7YGknQt=?ar1|iW#<(CB zY`Y?eKM?5~Z|;Mc1#k{0gXi7d%b~sz&_FHOd>oU5GO)XJUH6%l*&`;=Xc{|!`jJOb zm~5po?)ghrr$tuVlMkVFvKq+SX-C%g3+Aw)7V;bQ&GCur>g!f}0qQ+jnWivtdTQt- zRLO|(=}B89rry$X)OdCv6pA6@=N7Fn?IZ-|4$5gXwMOUsLnkIjDy57Q#kMU7qXBgk zJ=rPz>SN~(Y0S1*@5#~B%qrh?lJay)rZLGRbp>u)Lz$37>H{R_*d?k0C5NEoSH8-e4THFO4-?b%Ez4Pk*G2=D)9 z=RKb_KhOKVU+?wl{W<-dJ?CsWd$s|)z%B}bB>|8WX;DxiB{{NVmBf?8u}99NyvR5i z+mWo%WMo;HNTMl9g1{mIBnS|_ZpF5Y*oeD5K_KmY9Y~OM##i2=_^L^5DTqIPIi`Q39RSe1e;A zQpki<(v~+e9)Dn%mkgW`LH-T2oBfY-lVvB=ReW>&ob@2KpKl^{4eIN*a z;~U?2+u%9Jo9SNCfOC29 z*B8NOir_zAgZ{Gx=s#b8uH>LR@gF*k@jqP31rF z{FCOV1kGim;1rXxv6|&P191RHCe=iPr;Nyo6AS25&m6;UGsnRrMckd`AhFp7vD75 zr==Uyz#wH)cuK&8XHXI3CnFjiXH)AfyVXrrHUZ+pUFssdUXAY9u2aV6zf$??55XUM ziPKPVQoY&M zwlcl6p*Xqdp^Azge!3-hL_R3Pc?pNpN-F^gK1y}e$(v*R{NTOQNpbwtul|eMoo{S7 z>-LSa9Q04j=mmH7XyJ<9zve36bD~8?tMnsuH*}uRsr~s9;GL{k!-oIqj0}&wQ)T>` z3L9PU3CHtG58U;1Yzrx!rIdI?0wIn!d+=B8gL-=WFbz?u+$l6{lU5*rB*Pc)AuJty zTJ?&GErUF3u>#-UYemgkRNn>h9D>mlWY{w2-K<#_8>YAlJuKz715yXi?Az@?>%yLo zA(M1`AA?d;Nc9HwUua-AuZt;8N-N`Xl=}grF#cQwA!Z0jWB+)H3wgS2^k8Y@%<_7F z?~wM@h_Bhev;yB+3R}?wFAJe( zBOF%A$yA{c>Pn` zEegaRyz$-j(`yKV=5x7vt)9<{|Mq|WPy;`jn*B0^M&ijV)Gp{*8! z+`xSk;8qaCi9I$x%!p^oK==?yBGBzdWG+s@8FMEWIS4Tg&{U!tkjK4{V}BnghvG3+17_u80QA|zh!6I_$(_2f*s_tuo8E20P%dLayUa5qSWb9IhmTy2^EwqK1}_>Z3tsg-f$FZBK7dd z?>7lt^rC@p*lskgCkDd-3?fars?`paGar)zlq&9YP zmcm%QFIx8&fqseD#xZRviAfGIVJGh;WPG?rE!oHZ(@(JQnBAB|<_C-i_3_)~M=O%t zoqm3n;vs*+WhmEELi<2G2$DI*Ia2c6UVVP{d!ATr9kE=gmB0%NwfDNAI2r^J(>Q+V ze%qKG7dNUXX=y3YSkXHZT=n564YX7vDh(*ic(IQ{@8AoU%`s8%dtqF$p(-?@O!8wuqpLnJ$6F3Sh78FG0Bob*!np3p&>cxL% zTC;r*h29tzNB{sJ07*naRHxrTGQ}R0Gt285&T+tlN0$HW;Z01@EqLeaQ(YR zd9nS@SN$9N#iNh7|HM$otNPph$?#hSo?1UKM4CrqyXtpZ+QH*)XXC*gQF z?j%MNwf2hec7|})frp%s*mPI)dwInp(OEZLx{Xoq$EV^b$@tJT8WC>bBTbA(j^TN0^)Q>m>HYJGuDOW%2c|TA!?7% zsj7pj9Klc=CBUPh7SBKr)xaN6$0tapPWgLQZ5)tR;`)-;k^LM)6qqWOU&b>FTL(Y9 zn3_eAy+lWBdM|PKR0}N{!EEiapr@pj}AgZ=qK$Rc! zC%+mwExff7IyT)>2KVjk<&oPc813^OpkpdS=Eh9*Cc*|*l(+PfG!f^Qx3Cmdy1eP# zbk%_oVp&vp_oLUpcV>t_iF2Qf8>rfXI#1>=Q;zY_

OU%N!D*jNuXPg^sl*eUAJT1?+IPhu?B)QhV;ET!pj$Pr%#@ref;Y)kNx_A zu-Ki%Zv=(k-!Hz`!4KLtz2Bm|qgAIl13g#<_A^vJB;Xl{3?Q?Nlf%+t9VdA(O;0^# zlydiI@>0+X6JwA9BbD;_v7@xJ476bHb^wcvIS4sx<@kb~HW#q_22%lLzI;|jIHq~K zm?4ZHEMeL;o zRDvErVSIGwtfP@A_b0;4SQ-j3atkR%qX|FWx!kxzS(8$!2!HYT_dorK*nd-S_H#~n z)|gXjm;Zpyc2v=a;&T8;K)Am{8O4^@isCh5=1J|LuYK5uqr9chphI3TM0-pSn|GY% zGeLszIUplKE;3i?X%|_E!c{U zWBpw}e#_J|ife>p1)`(S#6*4MQEV8?Sj4~xuYzDIq;yYiMR6fS3>=dcKXC)sA|U-$ zQhrBK`c-LjLHoXpP>*5H{phWrv^$h^!oI5{h7U%t8Id{!F_ji2xCS9?pv~4iR`NLWcwzkOYM^InP*$jUf`JWUYbb zEW?k%Kq8Q;3UFj}Hx@n^fTzZw3S8Hf4akICOf^xEiPJ6=PBWx~Q|&M;$?ciE2ox89 z2s4sUU~}zIcqoPD$WIUTOZoQ0ccY#!{(g>dC0}AgHS5un=oYn zfDJ^1W0d4EQck}+)W;van|L9DqNiQ`S^s_}?H*2_>sC&SXj#e#ArySz^zpGr$nY-u z*lqG@!&?<yD4u`(9HtBU4V46%#Fs5Z9 z;V9Y~_ZPef7x2D4o6z=f5U+3O7NZu7er3KLPZd#Sn^p znIG=q_c0Rb29_?_`7pzxOF+<>uFu=HT`8BZkB_vCNzT0uxJ-%7^^bXN-AE;{Yj(0U z>tjH>->Y&nF(XC<0pIxtOkGi(qOF8m(}B z=}t$01T2O?R0qvT2=P`X;O92{XjXA@7|N|KOjG1f!rmHQjB(7MUE3I*hszJxc5~}y z3Gil;#7ns#5ciOJ7V`6My9R>^DH*E7K~O!OOi|z=xSzwxI4(UvkA;ORDxHErr=1-C z^!tDOxtV>==VtaF=k_b#`sCxui%(DmpbNw9CHL@3PS~t7A_&*Td_KQS;j>j?_0!t3 zhaPe!I({erwd){R0@xlkOCc$YA`b%`?E7J^b_C;MU-mGD3;{UlV%`LzvQz@$IW~o1 z0VF37-H|41G~%FvI!W26$PiQY-$8iPPL zT@S$$)lu#!(ET9;x%MTuso{M=Pbl}Hs171^D;spD=-lGm?8yty=T5zV%szSzICf8} z{hML@H~spx!^lzl1@+U%^dBup*Bvf?+S=-HnKiIyWmiNDsgf0Sc5%q^W0#wah+alC zLeKMXNN=3um-c8ll7Pk8B^;Hk03MUM3n5|D#UPPUxhDctpdD~5Ap`od?R5OH;Di}7 zFtY_o*-Plsg7gLqBvSyjJ9ob1p#f}LrAPO`h>^`FXt5;>;mp|woo))mIXLQ*vk&c7 zLD^mz-amil?7Oo46*AkgcWKhH&EaygOVvw%=~iZm+I$$gBHjSPZM{JcokpN7f>7Ox zABx7pz&~_MTRBK2Vc7@zT;**Ti|qEE7xA5q7g{f`kKaeVHi3?EOS9jZI*|Yo%aLjO zVILmNBz>&jdl}1!j(*tzIcV}F`Nm&o=U;!vc}6NvAD_Mh^ zo`v)V%U=t%TTL(+EuLn}&5T?G4$h%CPb&|M8zUFKE1&(v?#-ll_kXn*sasu8w&utC zzdX-m1V{qJS{9O>cnkWE zopARYxB$`nui47CII@p410CfYCm;r-Ja~5c;%jrc-JR`I zQtLc1zP>+xYN3(@2YY^4^6gC>-{T4uwWrcVThB6v5*yu!D*C3Kids$A!g124AKQ&9 ztR2@J1jwG+XU+or{HNuo?|B9aNLU0u!QiS09z{6KvkdH+RLo9C4oxt9Wpm5CVV#q9841U0n_t z(Fp8cHW?9cf#<6BKx6i+;gvDZb9k5L+| z4|tQ7;|v6h7z{S_5KW{AO1n{EZsvz$dh6!(#2N#5SVDWxTQ{)W+_l;l41r_=mVv

l4*S5?TAbs27N@Ab7$I%%kvJ0~pRj8o;pLr6F>2FuBDI+y4KAt>4HLbW=e zgbU|B3|xNPP7+hFhh7{Dk;Ny>TM2j0u&C<%_aYfo&_yc@5cHTe+MQXw-|%j$A_bTT zk>xykfF-kfCjqE6U|h^2nmH6L%uig6TO^E$leMNhH*!%nq@$sEjcCHD(v^_gxn?Sz zcH{JTZvyK=kdPp+!KqCcQslf#(T>N^{RpbfSdCX9?OGlxvJ@3%UL1r`9Xt9686!yy zhBAq8W++v47>zJMn3;Y4lA5h;0ExMOLxm>iEa;8F(U;CXR;^XTFfOK2=>oldn291+ zn)oNui^Ft3irAPSPfDRPl^%umeP$+YCW770K^Z^MY(^UI9XtUA509Nv3Fw$DA!KAH zu&2e3;j|(|5d1|e8e^LO%!~gtf{Ti}l@Hwn^xeSDdovhFLf|2(**wJf7wSMz`yiT} zrOG@>j8IsL{lX-kIkWV$+Yfoa&S6Y~&oBsW;*GlFPA52YtRT6i3fhdUZH7KIh{+tC zbA`ekyL%&^+wL>u7!-l{M$+xP`oqu7>~lUhv;R2%ys>xm>h)i``mKZ7vsMJnCe_3I zSHB;CS+`XpNf36TFtTw_)}>;sO)%GXy9=RBb0Ldb367^cPYpX6mL~!zj_eRNKsN-` zCQ44>j^;sO4$>slLxO||EH~|&8 zAQqJUVTxM*D7~mT4F_XE0QM7B0>)LdTa0d}b)WIVvbm2sT{2YX^ErTLj-CH|ne}HM zaP^l)!h6c>?;U~<`$?le5ysco&1pQIKNtuHL^`7=+@mw$o!{;Sq)iD8sA31 zLLCGQGMVt)6Hcd)N^B(4E7iEe+c2b)`1*8d`me$9jC*0LesTB6s{}&U@I?yOp;72I zqu88*!zeNqiSk||7mR&Zx>qy%V`mtl>zEb9KX2|53?buB{kgimeD}R?`Q80BDjit&P^Ks; zF2Nm8Gmd3a5Iv3JU>Z~a+cmB)4Wlxc>*l8SG;SIPcyubjdWZ2x>~Qm!yk{q0|A#N@ z8~f+GM<6x6wmtLD_3Q`us2MP+2h;J60LM%|bW|_|jJ5O?7WCp)Jq% z=p?Bkb}O|m1=q7`O9`Wl`~bCG9ly}0rtU`Qu1iUB;-p0bIfg)Vw)|u}bwzf$g;1@Oxq`_bWdD)~|%W)h|Byn6Oau!P;nQgUK#HOW(01CckN7hzy zAYR@zlBc7D%JSE#blo0DBRR!TOf=Ys^EwF(f=G+wDgll8?4RCkH}5w9*GWhkrIE{S zlNPGOba|XFA$ZD-Tf&L2D3=^_7r$hN>)n zVtTNK&_SvJmBa4MeQQ7u?RO=r5C$nWB!G#C$1o4GuI(XEDH#r2^+5=mUc3@Y-9*z2 z7RF~)Hbo&aIgr`8!tQw73Q$2AuR)TJg;N36mOUQYZ<^^lXgw=80yyiy$?@z`7X+@0 z&ofAp3xu4ToqpuP+ktl?+$9MaD&_{{%<;hkG93a4)i#<`951T-6sook-aYT+5y&)z zGKN?ms@>-teJ6W<jenjO%7@Z5NU{6La>jJ zDXX!+?x&`l_jzB1id2Iu3N+X?;uMJw$kc3M0kp-BCt!w#Q)0T)zgrBG2#n&`Bh`dP zh;6DquW2v@muf2$3^{;^Y0t-VJOBq{0H1O|p|L-um8Ws4?pQtgB6>QlCr7 z=X|!z?DyW@8UF02Uw&aqk0Z)5^KfoAIQV7xz%0`|T=JA!2`$8*TSl$}(camJ!V}0S}FQ9}l9qLbx4S z?+_rwCd^P=nwU2hJb(dQfYiyL&D-4w6ncS5M6iScbl>yowB$sgZ7WuTG*QO`%s-zvPmU67CP3|2}{yT%yDMzZJ6@acmj0i!rJCk)6FN{{CKjoyc8r``2kA)I~}J7vkx zy1-AMNCzM`ltXBusD)9WKGOEl)pIx7H)~o`^2#jjVh$*=YeuA=^oslSM;u@o7h=yQ zGaRhOw{G=z@^`nsEGst4h<*=eq`P*vA4tU{y2ObEU#`^?C2vfBcW&1-0!4C$ihxGSzoZ-3L@ zHuHQ3_a5zQOnOB0e(>!1Z@gJ9Z%zt|p=N@9#n}viju~S-3NEneYY{G@iR2p@uwS(0 z2Z8oAqXmYFiZ}vO%b<*e_1{LB&CX&RCYPL6Tz&En=r7;7{*$%cH(r=DkV@xIpy!ZD zJ#@4A-qz#u^#4xLhB@`v-lwJW%ztBx&BNr(c>i2>=R>bq(O|9iT&N(&>+J8!oiE>S z9AAItJ8}Qnf%`CN#oasq5P=^o`fL8hTbKXq@5s)@hkx`-Ky&YS_+e{fR@YWdIPV3Y z##q{GNZ361qbVN|%7(sB`F% zNoHs?k$J-PO#n8rTF;7q-XHWaPa)3)F`tK_8@XvlZkPFm3FN_H6GWU{BA^|Kifs@e zHyF0%#I6ZOR#1edEiSz^Xws0ngyH+*@f2ox5C+CUQP)_dcN{`QC^mQ)fE?2SDryqu zv&~Yf>?tVDqrQ|%(rYJ<-w6+d!OaC2>lB_Cd+9lTvvPppCvGl9GWMKpjQ zVSombzis!&w?76TG{Hd*^-e{5vxsk|N-~wPP_60?*y!j{^+pA_CxBfQ+s}8qi!hwU zX0~RpX3;Ky>9eT9@eK&tQ99d`p5X;f#n(MnjK`agVNf6>Ht=z6@(JVKGN2?j3`{tZNfthfq{L8~>f)niE)uOK&6*BgWl$kV0a1*<87+q3wfOy-+@WXo2@ z?{8aC=if+Z>=74t*#kY6v8cvm!6heo%8YFv3 zh9CnV77*`yma`UfFvi#@b5xkR+xR3NjebQbo}o_kpSkprrxKQ$!HHNmhGArc$!c+- zdi-QTq_Px#cjIPGIsgIJ0f+=}!f;W6PR=Eg2gU|cfy)$uL>qDQm|IA=SjXuA00S{mVto)qMoSA7iUViKKPo}>1Y|+(XcQkE|A;J#9>RZG@%5LT% z)Pbx@?1o{GcPDrzwH1sDdh!vBk+v&1F@VOT(|h1(IoBL`6GL)Dm`Z$u5G%u&eSl>1 zdY_@myN;!eP1;r!f?rn-bpQr9j>7m|E`=LM7$$&`?nCTIuc0(2C9q*eN{9-w+s87# z{RyfKda`oLeqZo5s>q#XB+8aJp)j2DmZOeybkF$2{KroZeGEh%!Hn>a6a@S4&p#Tv}^{=D+$o%44PL8rV z6M65858hguEBwB2b%LJD#2--MP62=e5}N?V$UyL@aMJ4C#(L8u<&1q~2RBulCSw~8 z4iLYaa?L1=C(ZGFE?u^$jlek*^M~!urKK|xmf@_AyvaR_u{7nuW6ns0fIfu_-guxk zZFGh-K^((mI{+-H1WX;#v4@BN7!rioNwN1(B23V{w-muY%ei552rcOGUeH9e%Ec1F^Y4{rmNN55Dr6+$ZUWD?_(sz!vagDiHewZ zV;}-x5oLV{i7?s@RXL7Wo(oYFa3h?+8w7Im{hNtn0%V@Wt+}Z8XmF^fhzT$ogAC{C zX>SC(%A6~M7=U0{LVH*cWjH$G`J6W?rzs4xM3$veQw27xv)ff~I}_dZZ6mfdA+n@s zZZBGyLZ4VjU%Wk?7n0UvnNrIgMshoySYQIaHzp!PH~~deIJi(f>9UBIJH3UK9Di>q zIpolO71t<8jKxgVcL@}W6GiU%YuU%%LatvK;#VG9{o@Fn4ic2(_WU$}LP6x_VxZ&u zQ)<_#rst}qSN!c^U-|p3J6g>`VK{+Jm~aT6tD&PgGy*s*K$q_TAq|id=J9QN_fcwT zm?g--93{T%%sI5fD4k_(HwTAp7+^h8_t6xZ3bOG*-0H{{Vzq2!d>%!=zxVD+dMQbg za=9!ByctaHe|$gh0i{&lc1zrl*Xq;krf@Jh zIa8^yT>%?HY-fmQQwOF@OFG(k@BZ7?;fLD8pJ~p96Eautb9$^hInhT$1_j@;W5Z;3f{}YPq_D*tsLmycL*W4nBOq`XF@Tdw1n7I6 zob9m+xg5FpCbobk6c!nCI0jMjOlu3D7TgnR}VJmTc!y8bgB(^Aj$OB;nqxqQm&~=50Y9cva6!)aoF`+y%HmiiFqoV7B zc;WnpIqdo7*CBG0GrD7!2pGw>Qh<~NEDW?2{#eJB?-uv>?*$rKst*@ucF8Qb}f- zq%8_YFb(i`QHLTj_=CZbfGrJCIMIMZ3qm1h24I2Q>U*{w>1@Z}pEjslE^x*1YE?9a zJGZpPw0Qni!k#{)e#n0%@X4(~+k+M!HYZp7RKWVFFnAlpp}_S*b{M3zqy9fArP}#p zzBxI0?D@An*@eiW$k&j`RC169-LVjJAQ+{WU)IpXu}DTZA4=jvMe)!HSAvxA0S&w% zB_Fiea%bo1qwlQy?OJ+aZf$A)?9-ic?N4Oo;9&HH4trPBEQ%AjqHhcE`Ia1 z#)nG#FRA?2E+4OTRvTaOTw4{^jEN-ra+5_8z>jIRAT(eU1LuflojB zohHfmfv@SW1=wqfkw13oH{Q1nm$i)(N%DuObFn@{j$W%t?|jo8?9C@#yCREUZMI(j z?cV!HCemUxZ(T*10d6d*E0|_3{K)W!#XHK1P>G7q@zV(*9}`~+s~#> zH>lX7rdV(!Ru&tzb7CUCf6`RGV4H+{bItqIW&0q&X32t#`9WmW{0R=i*>L6E z;yFeS>mCRT_`r-X+slKxfEgJ9v=d@JJC`oiX)g1rI$n$yrXP9gI#PCQzZY)TWzz+@ z0JV685E1Yoj1m+;Cq%x??c4GjN=$ko4bqkmg0R!`3|^M1#hihr%BW1R7#b4{8OWwr z^g|PL9gG?QgzWl_5DgPgkHmK zCbxH7#E9yTMg_R~q{*Pi({PHVju>kqZHo?wcnZay9;X)+qG%fmWot8#tdS+l3em(g z!b#Cf)QF1^3$w%kABfS~h7gBd`W|{-QjezT;->3dg3Z1tLOvFIZY9|9&?>4w`XhqT zyeQwf6XLF)R0(}diung{itV)@@gO+uA4Dc0ZCXsGBG!A+&bcgoU+N|BF%``OFjE2d zO(zsQ1jx;}*lY+_Bm~LGab)OaK)OTjM_$Jp4>TYyLy!Bcy8qUD^NXwX+SEjn5D@H+ zcLs{gx_E$;N^>Q}QO(4k(!t^sG@P^|cEt|0h#_wcw&Ug@#!W4%qch{zSHo+D;C^Td zytzPXGVKI@6o+0IMm`RL3Ie!6eBc4?(5FEZfWg=^X#cp&RTFfmW(FlNkyY0qxy=`$l=xk z3%WFzIHU*yL4v&b+FPHU?E80hwNF0zv>%8^SU%qqi$%|{Hq1_ja(C8bq zvW_N)thEr(hoPDb%{&8C0MB*2Kp~n`GE_1Ol;4^#_GB|32Y=NRaiwu(a(9!Ozi#q5 zH_>ow)(ewZb9p2(RNt{9s{w~l0K$@la6vo)z`iraTn{!S*d3d;6c{5^#{g%@C;M7p z<-!Dj4Hnf!lu|J|L#9}9J%9QXpFX8mA32118mK5y`fW4wmnu7H*|8EI8~$xY{owid z9x%s0jJY+tjAiK?fL*aq+!R?R<7KTqd(;W98J;kL<}zKfTRkiLh3`=D)tkeDMP1ytHmv}<|C8sGhmcB`DYrJP88^;>V_-`e$OnB4Q*VN=_E z1GiYyK%bU>Fuy+YhsS?av*Z`NgQp?1J+pj-UvbfF=@gYjU9}O0*>v%7 z18Te`cj9jFTgt14HR$yY`M+em?`7gk>dL!o-}u3>EgatZ&C$Ml4*93y1*f_9tL^t! z7W&^NAGzOf%H7tFWN~rluT~~6uk%kdAOFT1@n;orB|HO|Vw>oRQxe)B?ctHk9MRx`5PD&1X zQ=lmymIIbsnfJ4pLwmfw^4WO zC15tRW>wu^oG$GVjUN6b#cij-z;-EEX~b%H2>Vb)pjClo@z1?658<;HXXT%P6g3 zz6oLr7DVS6%}a7V7`iU%$^nvyWM(Icg1}$MQ&Hs9Q2(y$?cTT#01-sOm;AdqEMAGR zZH6kEH$>-v)ea)B30a-kob3C)458Cux`z~SDnT#^;q%vF!E%5)4#IJaLvBlpA|<~O zR{BvE0Lo+ic$Qo#q>x!I+$1*hfL2WIo4)lx2e>e8P}3f8hRMw1sJY^d(R}KTdareK zZ^aG|04?n{%IvgA#2MV5;qo$RHcfp_Rso(eVmij>60A2x<{I(-x$$l{2MfOYxYgb) zlt=wOA0;`Qsin`qLz%~7_y);7j~xK+dueb~QuZaR*$2?PZ9Q+?QHv+{`9g}y=|IK= zxr(>J1()d7xUiO)w|$nLC|p7lc(g>l@MpBc+~D| z1UM<87md`Yr80MJ-stS^p(J+Z{Mp?Pjwl~@9q&YCPS5C?FPny+X3rk!_X)kp`9sTZ zb;-os-h+Yd(-yX*M{~!;zo;z^nv>K0!(}g$!4OYi08J7sVJYB{L23@z#}ml`Cq78S z9EMwK0XtGh2~)B55I8wkn-b_jUIu`!GfL@oCd&@3PNmO22FNvLc!4ZASuhEX?` zTq&AZ$^q@Pl1a}DdY;#ToI&1Ihhj>TdiB@_5s)Qw^8AHVdNnnDX5=z=@S+js-_ar5 zA!J>WTz^a3rF-w^M=$-I(W_~}&4qEkdcvm>8utvV!GV>Hc(SN=JggZ8NNnH7t?U8p z4kNiR+=nQ5Y)>TLFDm>lg{vBdNZ>Zu7X}7uypI#KZ&f_=bux~b_<^hDm1K2K>f!zX zv>gM~jnVE|cXTJ|pSN?j@c|xg1MZS3OG=03p%@f^`x#h0b6MtYUEmxs#_!#lVi&T0|1MdZLk41+H62w9Qy>5co)C^ zul)44H}_j@`ues3q37fTnv%Z#P5*{<<*}ERe{(bme${%I;bVs=wV7g=j2Iu7qsSgp z24b+llw6R|LmiThDaeSkf{N=n3QmWS19%d|(t2DXhSyzfAqxDMM<}2h8hV@$fp{|s zM@PWP7F?O*UNYN@z2^DK*&cc~H+<_6;p;zH{{pb{z{StMr_0akxBog;9_@^N3HtdeOleW%p$K`_#fUKcYba6JC^k!3msflCF{!K|A?mbhLEPhDW^A=^yeVz zXN6xmn0PgHS0TRml3zhOpFGw6Ajc z>?Fi|*M`(>%rGRB^pK@8u9xDdS;X#G;@Lolr%zj2G|Xn-RkDDJK+WD#Zb?U$+kkp3 zYWiBMWaYM*6YX%o>du7ZQc0XfdJi*?vZ-8>e|Goy7ynGH-EL#rz)%cOG-S=6*Z{^x zOf?MgAizyFRa=FG!YKO00YV>)131V=o&rHM45nReNEEnGnF`&sH))3)ic$xuOn^@N z0hB>emt-{G4@q*X~!#{obYnCOQDtWRN1cPjd4kS2u9J8 z7(~&sEVpF4Et@S_o_46VyWQ%UaaV_G_f)kf*dE(*E0B^U(Y8pC5=j6IAR>|RfS2=q zH|Kj#&gaYzbg@{JrJ0edW>hm;zs`GWul0TF{8?YEz3)Dzpr-D`Qkv^ed-oSJfpK^v z$Y}$_v{&xhn6PGIcl@c_;-MruF`Qww07|<}SLv%BVu*U3fHes;5ON>uy$J_61(lctc&O@?D6dI71*7_z=_MngoTeca?XgEP* zA|42vZ9%pHOy5$2zCB8#qmPdqzSy|bRvIK)W0Ct|LYj)DPv6=(wr?_*NuRrY9`WP4 z*yUQ%(1Ee5b~R{0nN@2%iYy3=vtZxCP@%7t5oz0RwJA`Zbuw#HpZJ?TeW)cKmbw%H z4o#*<4&b8*L40t)A#F(?r1PcR~upax|Kj|M0h z;#iu7Q4iKw`p(?#JoR(+EYu>%xZX^dH}_zDEP}aOo1x>Tkl$7u&JH8ApTx2tfHta| z1Jj@lPV~A^srbf)t3Or0&BSs1XL96c_S2}$zViKV-#s^XZ128+!@ubwXyd}9)fn^^ z#(Fn<{w=-U>a`WTv&gn@8Om)^btt2BOK&|WZlpNAlBNjtuG?C1yt{SzM!tJF=&XeF z6$&68k7=E4)fJ~9F&xC(LHGnVOzqA)P&+`P2^vq+A)KdE>3BA_8-C!|Xa+}Schkck z&4vy=G;y?D$Qgm3pP%|=RQC-wrDAypV|+R~XEhPSh|3_72-WP`<1jK_5TZ1jo!y@v zo#j&rDmug^_tX5e#|#%z!a-_QI?_;YPl>l@$hr>flD0H$IdU+( zvR$VD8&djP{`wFk-_}ir8j21~!jIo@Rwf#~`}`P|A60SbTm4ddyNqd#lxmti{R^9S zJ{d>8{qPrGL_VRGtN*O^_E;oZ35IpeB8lD*L9RxTK#$l5VTzuvs7<`=uo{{FGwc!@+ly}jAYJ@XDyV0&*L?~1>O5B_?3-?=va z?8*;*{{F*%hY$V5zxwxA-^2crIzeldAi5QD$b)7l;%MwB^KI?=XBV3%rj`F)*vhT0 z|AyELJeE6&f}7SSDCy?Gt(!-@#+k&!!_DuE+YKf7Z@e1$voNSk?9dl@Ox?0bHYQP#8s8x5mspbv0 zTUlXAp8&Y$ZzfLc`^n z)HEQ}w6%ez>kb+5ERrI6sJjiEfo~=}ypN)jJn>4cxqSHwhWR7T>I06-g`jPo+~3tF z`q9GJv$friWOB#Y!jqxY1Lo9;XNK>yDQ~_yCs{_^g(-%-#8{S2CtO@dae)lER*xVN z64HGSW#I~Al8hzar|vjo;Et@dK+G~lU59!`kZ|ZWRsc`{X3-hQB&jvkoc9Ok$E0q> z&Bf(_oSYnnlS8@Wz*);dZjP|8+EJtLw6P)5WoVq+2xhEC(dpHFQmrVG(eF)K9*p{I zC}E&V3P(k%)sTVdqJ(c3C~?Orv)kwy{3AEPeW%N0#>hnD4%t)ez$0~>@w7@z&c|{y zwEnK{-rZ(qyVS%%Pt(O79UbcE>peJ_8C;Dyu!sj!W`7OKFldxTLJES(vN2;4<21IG z(l?7+G8~0bPf|7~qa(lc)JM{ZWG0*W*8lQVz~vz*Xz3tf5?};Y)P4){6Q!g+bfn+f z$`Ek7QW_pf#aMC4PyJa@FCw0~#aoQ1~r-8Tyt4nomMypYO2rUynZ5|p)hBDoa zWhWDp#lYW{MyD*9Srkjr&y^uqu~YgQMyMVe%~3Sx4Hmen@x z&@Roy?XGP=EHpk7PxZ1LROu|>1*1KPGi0?8>>Cu3E;AD}${710-{%5g>vlX`=)3VW zUN!9gr>%~qDtc)#O`*MzKU7CJHUKf@FkKTuD7Lm?o4^9yCY0m>tvnZh|k%08BPoY6n?o%)iv75yH zZOi_+Xa;f|RO_t?Y)QYn$DJ?&3CuB4#;Yy4aNy{Z0^WYL3Cb<;NM&v#sx~?X36ENA zYarpMlZXe9+Rhwq)(f`eLf!*iX37}Z34Q6bWCi5+ez&=vi}x)m4v~TT^OWMNH8$F9 ztsdwRR(#S@HJRKL2i|V;wnvWloXHMwB8_T0N+M+>!rQ9|B!#f_U{OI42GS_REbCAZ z}USP?eE1QyBPn4QZ~3y6)f5A*(#zU9!=rE6aZ{P zqGv;bPcRU}0KhpGjQEfTOODs7xd-ptwXW1VxGmdV$RT?i?$D_!IDAVmwWin8{a>+IF}6u)ewLY#96CvWa*&H zrjVeH8LrLS6c_^v&60@O;~|-FxVRrzF`#QoFwS>%i0Su2u2#oz4d*I`whJXBj#3N* z!KsV4S0KoaLA8DUawq^A>?jNiINY}gK$=h()teB3D0M`I#9*x4qwnAK8*4az``YQ- z5ZQ-^?m8i|r;ejh(d$JZJcOlsZXI@gA8}Uv*o565?sPfQxobKtN6Lt06Y^nXP_Vj= z2g!afiVrM^Fq{mRd^oiW9Y$U)FaXtm;5B${hwj^16xqW?KkC>@mjjv;+- zU)NnvahY;^%1gc(!^++5sV=u2O5ZU%pS+cM__2T42pgv_zw(8ROLUGZhOwmUYJhF& zy`XSlOH*i|mEm!U>{U6dh!s+XNy5-gA`0n;Vibf*2Y|i(5 zCk~|Ef=SPCGTg2;Cy0rgcqKsTb|^K~6mLZ)AL$_9Pj1o@nb`C3o!IHu=FcJ0^ARgf zxoO?h{J{u_ly+pu6|*U(el+aN%5HLaT!=E4(2}^Iwk@Yc+9c)&y#-5)8ahYxJ%&dV z9;0-}hS3O#VKS;9ng&FTjrcG>i`3Rrd)J-8F`u^y-XnSkX^x)_k5KU} z#fD;usj=yY$mB#kdKAk{k7N&vgfN=e6(npmGK66u7>#x`EEvdy`I)vbL$f1t{LvCN ziQ^*`A|pZh;mMCI`QaURWD7Z7!-iIju}w`-^hgik-<9M*^R%xZB{X6gO~mN=EoaGI z*LThkJB!mOH_N;o1~;PIVDSo!H}FJ)o=u3St5~C9HfdO{UO#O zsrEQt4pH-2Mh-eF0?|u_aR@PKOee^}45;%+F>EhnL3I>uxOU66TDIKT>PVI@A^lEy zpmypza%<6Vw|i}OL*^FR$lCU*+z-x+)K;l`x$PRt%!UdNNL^s;poMnNR~Xqr7z-R zhjc}!jJR3pcw#D)D>(xX?L=jVC-)&V(jeM;ZL4G%`5s{q)LP%n43Iuv9Z`!SO!j+7 zaO&A}w%lk!v)#~1=NhuJ_5^OY2`7ShCA*09z>GZ%8?9Pq^wrMAq54_OQDsb@m9!vS zTZxh_s`ty?xAq1dCpKQpjZlufSo0;}AYue2xb9iWqg(Z4XD5M_E%AKRn_ZpAHBA|^ zv|-CYu^fP;5l%Sk!@v(64c%8`*`Y)pN5<_yyzklt503`JIt@4d{s4`c8a&^XvzzcE z!xLwTo)03S*ohvp{JPx+o8-UN>Nm6J0&V1DL%;RvPYVXCG-yI!)aPGb@mdpKNe?6h#_jAcVETHPurGHx97~4Pi%ig(<)WYhK zfAej0{m9BG!3j^PXGi&sGWW@oaC~Cp^2?IzHXFz5FUIBTh;b`Ub(KIUug7@2W)=br z&VAcb$lJ@^iQTP16Ruw1r1y64r;uh~BCNgcBG^jtLE4HzF`qB|Zt~&mHj&)(*t)gS z5cjN)94aP0IVT6|9l>u`Tm;8#h=bgm-D6z?(@v^(*oVEWZG~Jl=*bz=4*<%5e8lyv zzIY%#5gv}dBipX6nr^?~nFuf~oEw7Zi(I$|g_DLZm@G|hT870@ZkXZ>1|V)=ey2Z+ zl@?tpg;Ta|P?8tK8U|{FJL14|cTo8T;)cCK1VM8s*0*#~whYI_2|!?i1cVf#uUO;* zJ#Qz$3lQP5)Ovd`*0)8&9!9B};t=n&2y%U9u}h))n8@HQ!WRP0?*9?uh~iG|IU1_nrU%AOJ~3K~&W+ zXVV~e-GacvQi8v7pxEj&e=&u&7PM~RQIm9s~AQT>qq=yd)#BFbL*fLai z4KLq_2Qzp`nAb^y;A97*oyBU;Ij%wPB1P44LW7tt9Fw&Ygo%?ZS8Y@#LW=BGE{tT=~^s{?(1ndb{07b=sZ; zB7p)w6KyvegoP%tF+XO0y>5EML!q{abIkw_c(5+(#g^KfwBr$*OlHW_sYKL8I_BMm zI+ahK@RA>uqlbc-B$60i*jNE3k^oo)vo%5zv@zBK0hWOUxSN7wj%Se=jv;q}H_pLv z61;tPj&(JRyk9~F7^Y&(gk`G+1pA%Atf)Zfjm5sJ@UgU=hUi9I#|w0T8a`a*gXYS& zQbza9cP{?Kz3=47lV{GHaUAFF-Mi!C;~#V_FE2-<(UT`nj*pN3_)nYvDBIcD!EqeJ zuz%27tyVWTHNy9g27;;(fBb`f0X?rp?{{#K5Q2&+#7%Q-KT#0FRaka z7Cc-dW*~O|hB8*cN80v?&J^YK!oGMUDGj5i1L&`EWOz( zBK>Vebr`+F>ZL|&C#-idtYr==rqQlS%e%ZL*1eM@WRCHGN8C2ysKq(lXg21LMiD&d z-p7$+ad$ix+7}5G9^JiYQBifqiym0;vu$chbXl0$HNbYMM7DuUx_+(=q76T#Xk3fR zZ#xMeEi89w!wM*FeBPRf_po_fko&1s2`xzpK^2M~SJ%h4%!~r206Mxs?6bk1eE4uZ zb11}SCWrSi{17!UljD<-i5WgO980IBgJv*>?T$yHf(m)%{b_t84u$Qt7`Xa&upDsL>Nzg7LhEfS9 zJtRrj0|DFWF5`Vk)A|mQOEctkYdhL5g%L~hm1JYfwv-ORbAC`kN`Fp1aoaqs%w12K}lcCcq|nRLqYT*A+wVY$r>)9fxW$Jo=OPR?$D3}adUabFY~DF zbRJMBW;gsdQGLt;&k(Sl8-oZAf{7ucb$OzX8wN?Th6SH-TEFUFe9-;HcV?dXW=~4*Xq?iCO1CDvX9J+$30Vvv-iuF9sWgiB>G1s;U>5A$ zI*zZ}Fragv@7q@%`jjC{!%pR>xBAZb&n>Sv_~OnZiP6r4aA7KWZDoaRm|dReg-X817 zzNQeaiE|FYGeZK4$R;b$_FdpMtRAJf78)lMtB=_YUC+Ce#(}b`154FCQZkK0nj9T}9eT_X_1>S>OkQNx0Lg6yc0gV1l>xZ}%>kC@wuV8jhao0KtQf)Texd)|ai zfk>*3lDjy+mmStDmlMM0HEVxg=?aNd{Ha$BGEVeh7@G7-DQuwOy$t}eKuy2V(KN1Y z5>*4CWxH&Ok(Rl)sM4guPH*hwxqUMmG?9cBN z%Lq-cx#0=jok%?T_mOPW5=ulTDRuH7%7wipoGY46#FGtrFJR1%LGIS@k&xpJ&~TRu zhn+c>0wc)AVYk1U-qjxrJc}=@ZB1#i)>>F!209(qE!=^w^Aw}+#9TY*698sNO>#Vs zP%%B8l+*BhvBX1gga}KLmI=qxsWggX$yjXem9rL^Vk`u0tD}>XO|s+KhM{?yPj5M= zf?6lUIV^vyN2iC#DL0_Cdq!5&M=VSj%3O)B#VWB*i1WpE+t6%zn>V$hna2XyYNuxQ zbqqLpQiTcFcg>g_BngtraQYCB)d3M_JRGx73o$*4N}O6>G^}9Cws!Hf93RFUH|hE^ zVi<;XxWZOOpO|yjA3{V=t-5%uF)#)Y)e+6O-$8szrSbD`y!(^&zGAUBKR^GaFMX+A zug}lVM*CebU8c5OxA2hQ>ClLS&s$*7LApAPq zPT1X=(u`^S9&ALU-WKW;YOQ4{5i>NWJAB9OphMQQ-YIq0RlUTSIRn5I*^}f>Ece@A z^A%n%>j<0xQq0+kVy@-1J4l>VVcQoJB>5_srn*)`c;Eua&9sUgxGoqpG%xq2f= zq}%D#rVjD_CLSaLfa$XusmKt^1tHpm8%u_e#l{e)YAY*_)3HorhqeS$uaguxQ1-)J z$XGk5?_{~u12eIg&<#^%M@R~XYMbB|sF=Sd%U9AHj};g3*ojvUJifMg;Wvw0d+$5( z`_9Jr#{6@#v-T+c-*1lLP3!l{XR>?Q`q6*$N=x70c|F;je{kXt{%mZRx%2X;n#IY{ z-0QJqM%h)%{kLE^34n`)s?$F zxP@V`tGXC$k`(N?6ygsVgRD{7Ao(emOCW5!Q9mM=;n(8$BNjc(xU`tdwma z5G)(2H-JWW?@f1?F1Xz~lnD7G=Ieb3F;S71r6jTMCTu5sE5_uZRJd+X+m8LVPH+;O zbl=7;JLi@uuZ3GC(q1*tnFql8j5s*)-zl}5swaPwW(<}6f25@0vFh_Z4W>Tp0{=5LeyD%5Yq?A(J?Soj%CN4 z!ITM1l22hwjf-cxeq_(Vm$ZJYXNkZUob9mhzlm}$Rkr%|VgWOUy~Y7l>G@vA@~^Ag z;X%<+a8utzRo4{dSf?{Bnvv*m`kBwgc0E15`{M`qKM@YFX%b2WusWx8loc5^f+Wsi z+%)a51gcORbBoWB$xm+JC+gFzorrv`&uD0<*E zSV}f;5pwr(Xe{jt8iWS2nU}kI%cP_79f+M}VH0j{?HxIBrM=8s?FJTu3_A^SdSK$R znV2BKdl-m|-Z+sulLRyR@FstxZ$cqrS2Wce-Zdv*rW#v3M#LIdwq@(^o};2Nvc4in#Geby?9bGrdaVvD0NoS~J zo?;g4P!iGBF-(K9Vslf3jUZ|BI0geNVijB+iZQsHOhC@S!hD({w|!&VhtrmQs{Eci zsO|*_%;4Mn5UtvX5e&x#4I*TiZV_09HaU+RW5fYyD+BcrK-Q5P9L*^JP72fyUV8H< z>wRl$YXE?Wi3vqfHa9n?rlxAO+Kn4G27|$G{nl@lN~N1OZx#xLrKP1qhYl?+E}lJm zc6D`idV1P*-Ak7)9XxpO#*G^ohAl5IheDzG`FW1xUVi!INF)M5(8k8b{{8#+?Adeq z@@0)Wd|r~Ie!pKV7ERN< zbm`K)RJmO4)mLBr^^XJd2s>*Sk@B4{FVtac#7!2ONeY;pJx~}`oGtZnpefqiQ zo?BjCUS3}2IIdc)Mx)Vgw|n&HQ2@X_S!SB%)vH&Ze){Q!g@w`4(Pp!GsVIKA(S|>VpqHh@$8{GM!H6`t|FDLSb=n@rz&l;tMalpzC@t z7<~BQhtHlp>$>jm{oe1r_~MI-qKu4;d@%gQ7hhalT*NRe5{djU;@sSvVHk%GA3k;J zl;b$MuJ7Bo?`P-CfI%h!0ItSD(fFOZb09=;kk$7fgyKz2^B_+HrfQNqs-J<0dOs$U zu^q!N8Hm~AaNC({b;cZR1A}E(4-#mLp|#%Z-fkUWGyeaFZm;=l!s7+-Y)375gx`!CvBy4ca($eoQHTqjso>{d5a z(@|MAqE$So8wQS}%BY1_DY^yc z8bHwXTES~9S@~NHl5#o{n&=7qf{9`hddXukm0}Sb!~J!{pMb$NR`)O;_sshQ^MV z3&r(J7m3{N-25jVzL6k;5}@2o3rcDj;t}JhdyO`EEkwSlAUm7yex`%|nNSx7nW`0v z74ImbwRIrc*{Md=dfeb|x7)ZuBs}Ua!R!MV3#DX1J6)|DbT}-&SFWt0n40i$lZ*jE z^=XEa)hQPAQ5p8Ic&8YTL`4|s@o~&`$yh9lSOdUmWNLKrn>{=|h(sf0X{rYov-mFsw^6ar#^TrK-z)zt&yHrFSN-w(b{er#~4*YE(pA;2!A!Nxj zBi*k&*4@($@B$TRaIDG%uSm?`(2y(nc zk#Sda35L-Xl;B~Q;5>MzBMHm$?&H5D&%eWo@A^P6;ecp1ZOvMxg8ra%L=NhQnXYd) z+63y_1BQj2c0m;F!qXAyR<7C=LtCgGm!c2Qa!qH5H``>-miM99WhmJL8tybPIz)Mc zn%*3ObEsz_rk&uynAI;5D>LFAL~swuB^Q`sma) zxvL*tGY)wTl2=(avV{!lFg$M6{kf!O! zKJnO}{D&8&kWp6ly4&R;acEq~D~N{qJpxGu!IdQ9$2~#k#s+RTYGaYGaDy@SLvc=? zoMBsA4k9}^BdrG9?A!5Uef+JM`K*tMUG5yj^F&|VBFQ9#z?9ZS^q8yFcp|Ag3mD0n zKyd9C1#>ha)!coP(>KctC3eK6QoLNElqLq#rg)fywlOv~>6aW{u%QM-?bS3HCEkvB zsr>Y#88%X@-WFZ!C+<`G_wWCsKl-C`xqNS$a_-!@P$(qJ^6>ERz1_y?>1oTdcJJN| z0PsA|ah(4)1woKbr*r!B=_j6e;-!~f+Su6m!WX{qiBEjuwbx#|e*HR%qEk~-H*em= zFl=jUt5hmgDwQKgj@+BQ?duf*^EVA08eql}adz z=JWY`sQ>^l41eV-UqMmyUbfGC<}&~QP1AzGAOu0f!^0Sc@jTD-yzl!rZ{Fm2zTIvE z09clV;s16N@64Gqk3ar6K@jzN{oWMn!i5X5SWK4Xds~e>&wr>=0Kn4H(%=5=-#+rl zBloB}juQ@t&!0b!Vc6W<+>=i}SuU3+CnxV|!AvGY5X3jW@r`IS`oVhdiO73YNs


|K>`fbw|LD#D~b`+ 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
m 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%0AfsEH3O~c>w9H?F+YM_R<@KlZu3TP#$LC zrp6m>aRQ}+&V@H~v)RJ<<_lXih*^3LbXGyO%7fuMx-VWcW-@6j7l#f1<|d0urQ7*< zlk?BkFzv`eDj0ey;8X^T)o4zk6^_d(qR4y!?zdVXiWB%G^B>>eq%SJ19s zhHB)C>v^LsxKH+v0O=6~(Gf2dI?=uL=xh8-Tl6Id^dFAPGuVWV; zea6x^I8Yj{uX6wZCkuv?K{rNxPn)w6>9QSWaMIk_!(_B`?Z$unvnRRw*onjCrN+rG z?gyRLWnhm+cH)R~flNIdHVT^fO#S)g?Yr+OTeVSZfjhn`?NYKQ!UHbcKW{%RoPXy%rAM!te=3K#sb~=hFtj){(bhiH z!lzDX-lp)6mjAK}hZ}r;jP$T<2~0FdDnpLJtunaP7zyC$vGw}k>a}Z-7KCtA*f^k0 zQ#I4ud+ElKfm>3Iq<1XyfV176q2!!q)k#t!cX4PUZMK}RzwP6Xub+Ny7)`g@Wt2^| zJW(i(7pa_VfRgD6zLp1?{^0&oE&Re{|BB)^7)-1{Vu~�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%0DJ2k3xxD6Z&&Nu>|nQP`u_dz_{p;P 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%0D3g#1BwhR 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ðT2GyE)Ar*hZJKv56mk``MrF?2~2r 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 Y>ok2#rmTXyjayg_L{xm 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

Tl>ymsGofE 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

Ele_K)+CxC7_OnTX&4!& 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 z

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 Prnc;eWC;=u=Qc?n7 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ⅇNaX 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/dev/null) if [ "$code" = "200" ]; then - log_ok "Trouvé: ${filename} dans la zone ${release}" + log_ok "Found: ${filename} in zone ${release}" echo " URL: ${url}" found=1 fi @@ -167,7 +167,7 @@ except: done if [ "$found" -eq 0 ]; then - log_err "${filename} non trouvé dans aucune zone" + log_err "${filename} not found in any zone" fi } @@ -195,10 +195,10 @@ download_file() { if [ "$magic" = "4c415346" ]; then local size size=$(stat -c%s "$output_path" 2>/dev/null || echo "0") - log_ok "${filename} téléchargé (${size} octets)" + log_ok "${filename} downloaded (${size} bytes)" return 0 else - log_err "${filename} n'est pas un fichier LAZ valide (magic: ${magic})" + log_err "${filename} is not a valid LAZ file (magic: ${magic})" rm -f "$output_path" return 1 fi @@ -208,19 +208,19 @@ download_file() { if [ $exit_code -eq 18 ]; then local size size=$(stat -c%s "$output_path" 2>/dev/null || echo "0") - log_warn "Téléchargement partiel (${size} octets), tentative ${retry}/${max_retries}..." + log_warn "Partial download (${size} bytes), attempt ${retry}/${max_retries}..." sleep 2 continue fi # HTTP 404 if echo "$result" | grep -q "404"; then - log_err "Fichier non trouvé (404): ${url}" + log_err "File not found (404): ${url}" rm -f "$output_path" return 1 fi - log_err "Erreur curl (${exit_code}): ${result}" + log_err "curl error (${exit_code}): ${result}" return 1 done @@ -230,11 +230,11 @@ download_file() { if [ "$magic" = "4c415346" ]; then local size size=$(stat -c%s "$output_path" 2>/dev/null || echo "0") - log_warn "Fichier partiel mais valide: ${filename} (${size} octets)" + log_warn "Partial but valid file: ${filename} (${size} bytes)" return 0 fi - log_err "Échec après ${max_retries} tentatives" + log_err "Failed after ${max_retries} attempts" rm -f "$output_path" return 1 } @@ -255,15 +255,15 @@ find_and_download() { local size size=$(stat -c%s "$output_path" 2>/dev/null || echo "0") if [ "$size" -gt 1000000 ]; then - log_info "${filename} déjà présent (${size} octets) — ignoré" + log_info "${filename} already present (${size} bytes) - skipped" return 0 fi fi # File exists but seems invalid/truncated, re-download - log_warn "${filename} existe mais semble incomplet, re-téléchargement..." + log_warn "${filename} exists but looks incomplete, downloading again..." fi - log_info "Recherche de ${filename}..." + log_info "Looking for ${filename}..." # Try all zone releases local page=1 @@ -291,7 +291,7 @@ except: local code code=$(curl -sI -L -o /dev/null -w "%{http_code}" "$url" 2>/dev/null || echo "000") if [ "$code" = "200" ]; then - log_ok "Trouvé dans la zone ${release}" + log_ok "Found in zone ${release}" download_file "$url" "$output_path" return 0 fi @@ -317,7 +317,7 @@ except: page=$((page + 1)) done - log_err "${filename} non trouvé dans aucune zone disponible" + log_err "${filename} not found in any available zone" return 1 } @@ -366,7 +366,7 @@ except: done if [ -z "$release" ]; then - log_err "Zone '${zone}' non trouvée" + log_err "Zone '${zone}' not found" return 1 fi @@ -407,7 +407,7 @@ except: if [ "$dry_run" = "true" ]; then echo "$files" | head -10 - echo "... (${count} fichiers sur cette page)" + echo "... (${count} files on this page)" else echo "$files" | while read -r fname; do local url="${BASE_URL}/${release}/${fname}" @@ -422,39 +422,39 @@ except: fi done - log_info "Total: ${total_files} fichiers dans la zone ${zone}" + log_info "Total: ${total_files} files in zone ${zone}" } # Show usage usage() { cat <<'EOF' -download_lidar.sh — Téléchargement de fichiers LiDAR HD depuis l'IGN +download_lidar.sh - Download LiDAR HD files from IGN Usage: - ./download_lidar.sh [tuile2...] Télécharger une ou plusieurs tuiles - ./download_lidar.sh --search Chercher une tuile dans toutes les zones - ./download_lidar.sh --list-zones Lister les zones disponibles - ./download_lidar.sh --zone [--dry-run] Télécharger une zone entière - ./download_lidar.sh --check [dossier/] Vérifier l'intégrité des fichiers LAZ + ./download_lidar.sh [tile2...] Download one or more tiles + ./download_lidar.sh --search Look for a tile in all zones + ./download_lidar.sh --list-zones List the available zones + ./download_lidar.sh --zone [--dry-run] Download a whole zone + ./download_lidar.sh --check [folder/] Check the integrity of LAZ files -Formats de tuile acceptés: - 1049_6895 Coordonnées seules - LHD_FXX_1049_6895_PTS_LAMB93_IGN69 Nom complet sans extension - LHD_FXX_1049_6895_PTS_LAMB93_IGN69.copc.laz Nom complet avec extension +Accepted tile formats: + 1049_6895 Coordinates only + LHD_FXX_1049_6895_PTS_LAMB93_IGN69 Full name without extension + LHD_FXX_1049_6895_PTS_LAMB93_IGN69.copc.laz Full name with extension Options: - -o, --output DIR Répertoire de destination (défaut: .) - -n, --dry-run Afficher sans télécharger (avec --zone) - --check [DIR] Vérifier l'intégrité des fichiers LAZ (défaut: ./) - --list-zones Lister toutes les zones disponibles - --search MOTIF Chercher un motif dans les noms de tuile - --zone ZONE Télécharger tous les fichiers d'une zone - -h, --help Afficher cette aide + -o, --output DIR Destination directory (default: . or $OUTPUT_DIR) + -n, --dry-run List without downloading (with --zone) + --check [DIR] Check the integrity of LAZ files (default: ./) + --list-zones List all available zones + --search TILE Look for a tile (same formats as above) in all zones + --zone ZONE Download every file of a zone + -h, --help Show this help -Exemples: +Examples: ./download_lidar.sh 1049_6895 ./download_lidar.sh LHD_FXX_0713_6347_PTS_LAMB93_IGN69.copc.laz -o input/ - ./download_lidar.sh --search 1049 + ./download_lidar.sh --search 1049_6895 ./download_lidar.sh --list-zones ./download_lidar.sh --zone RE -o input/ ./download_lidar.sh --check input/ @@ -467,7 +467,7 @@ check_files() { local ok=0 local fail=0 - log_info "Vérification de l'intégrité des fichiers LAZ dans ${dir}/" + log_info "Checking the integrity of LAZ files in ${dir}/" for f in "${dir}"/*.copc.laz "${dir}"/*.laz; do [ -f "$f" ] || continue @@ -477,21 +477,21 @@ check_files() { size=$(stat -c%s "$f" 2>/dev/null || echo "0") if [ "$magic" = "4c415346" ] && [ "$size" -gt 1000000 ]; then - log_ok "$(basename $f) (${size} octets)" + log_ok "$(basename $f) (${size} bytes)" ok=$((ok + 1)) elif [ "$magic" = "7b227469" ]; then - log_err "$(basename $f) est une page HTML (404), pas un fichier LAZ" + log_err "$(basename $f) is an error page (404), not a LAZ file" fail=$((fail + 1)) elif [ "$size" -lt 1000 ]; then - log_err "$(basename $f) trop petit (${size} octets) — probablement corrompu" + log_err "$(basename $f) too small (${size} bytes) - probably corrupted" fail=$((fail + 1)) else - log_warn "$(basename $f) magic=${magic}, taille=${size} — vérification nécessaire" + log_warn "$(basename $f) magic=${magic}, size=${size} - needs checking" fail=$((fail + 1)) fi done - log_info "Résultat: ${ok} OK, ${fail} problème(s)" + log_info "Result: ${ok} OK, ${fail} problem(s)" return 0 } @@ -539,7 +539,7 @@ while [ $# -gt 0 ]; do shift ;; -*) - log_err "Option inconnue: $1" + log_err "Unknown option: $1" usage exit 1 ;; @@ -561,7 +561,7 @@ case "${CMD}" in ;; zone) if [ -z "$ZONE" ]; then - log_err "Zone non spécifiée. Utilisez --zone " + log_err "No zone given. Use --zone " exit 1 fi mkdir -p "$OUTPUT_DIR" diff --git a/lidar_pipeline/__init__.py b/lidar_pipeline/__init__.py index 599e80a..aca311c 100644 --- a/lidar_pipeline/__init__.py +++ b/lidar_pipeline/__init__.py @@ -1,7 +1,7 @@ """LiDAR Archaeological Pipeline — detection of archaeological structures from LiDAR data. Usage: - python -m lidar_pipeline /path/to/input -o /path/to/output -r 0.5 -v + python -m lidar_pipeline /path/to/input -o /path/to/output -v """ # Lazy imports to avoid importing heavy dependencies at package import time diff --git a/lidar_pipeline/cli.py b/lidar_pipeline/cli.py index d06c289..581e624 100644 --- a/lidar_pipeline/cli.py +++ b/lidar_pipeline/cli.py @@ -14,8 +14,8 @@ from .gpu import log_gpu_status logger = logging.getLogger("lidar") -# Motif pkill des processus PDAL de CE run (renseigné dans main) — cf. -# _kill_orphan_pdal : borné à notre output pour épargner les autres runs. +# pkill pattern for the PDAL processes of THIS run (set in main) — see +# _kill_orphan_pdal: scoped to our output to spare other runs. _pdal_kill_pattern = None @@ -26,7 +26,7 @@ def setup_logging(verbose=False, debug=False): verbose: If True, include timestamps and level names. debug: If True, set level to DEBUG and add file:line info. """ - # Ensure UTF-8 output for French messages (é, è, ê, etc.) + # Ensure UTF-8 output for non-ASCII characters in messages (✓, ✗, →, ≠, etc.) if hasattr(sys.stdout, 'reconfigure'): sys.stdout.reconfigure(encoding='utf-8', errors='replace') if hasattr(sys.stderr, 'reconfigure'): @@ -63,38 +63,38 @@ def setup_logging(verbose=False, debug=False): def main(): """Entry point for the LiDAR archaeological pipeline.""" parser = argparse.ArgumentParser( - description="Pipeline LiDAR pour détection archéologique", + description="LiDAR pipeline for archaeological detection", formatter_class=argparse.RawDescriptionHelpFormatter, epilog="""\ - Exemples: - Traitement standard: + Examples: + Standard processing (0.2 m/px): python -m lidar_pipeline /data/input -o /data/output - Haute résolution avec accélération GPU: - python -m lidar_pipeline /data/input -o /data/output -r 0.2 -g + Coarser 0.5 m/px resolution: + python -m lidar_pipeline /data/input -o /data/output -r 0.5 - Sélectionner un GPU spécifique (index 0): + Select a specific GPU (index 0): python -m lidar_pipeline /data/input -o /data/output -g 0 - Sélectionner plusieurs GPUs (indices 0 et 2): + Select several GPUs (indices 0 and 2): python -m lidar_pipeline /data/input -o /data/output -g 0,2 - Utiliser tous les GPUs disponibles: + Use all available GPUs: python -m lidar_pipeline /data/input -o /data/output -g all - Mode verbeux (timestamps): + Verbose mode (timestamps): python -m lidar_pipeline /data/input -o /data/output -v - Mode debug (détails internes): + Debug mode (internal details): python -m lidar_pipeline /data/input -o /data/output --debug - Forcer la régénération de tous les fichiers: + Force regeneration of all files: python -m lidar_pipeline /data/input -o /data/output --force - Traiter un seul fichier (pour tests): + Process a single file (for testing): python -m lidar_pipeline /data/input -o /data/output --file LHD_FXX_1000_6881_PTS_LAMB93_IGN69.copc - Traitement parallèle (4 workers): + Parallel processing (4 workers): python -m lidar_pipeline /data/input -o /data/output -w 4 """ ) @@ -102,183 +102,188 @@ def main(): "input", nargs="?", default="/data/input", - help="Dossier contenant les fichiers LAZ/LAS (défaut: /data/input ; " - "optionnel pour --rebuild-index)" + help="Directory containing the LAZ/LAS files (default: /data/input; " + "optional with --rebuild-index)" ) parser.add_argument( "-o", "--output", default="/data/output", - help="Dossier de sortie (défaut: /data/output)" + help="Output directory (default: /data/output)" ) parser.add_argument( "-r", "--resolution", type=str, default="0.2", - help="Résolution en m/px, ou multiples séparées par virgules (défaut: 0.2)" + help="Resolution in m/px, or several comma-separated values (default: 0.2)" ) parser.add_argument( "-w", "--workers", type=str, default="auto", - help="Nombre de workers pour traitement parallèle, ou « auto » = " - "cœurs - 2 évalué au lancement du run (défaut: auto)" + help="Number of workers for parallel processing, or \"auto\" = " + "cores - 2 clamped to [2, 16], evaluated when the run starts " + "(default: auto)" ) parser.add_argument( "-g", "--gpu", nargs="?", const="all", default=None, - metavar="LISTE", - help="Sélectionner le(s) GPU(s) à utiliser : un index (ex: -g 0), " - "une liste (ex: -g 0,2), ou 'all' pour tous. " - "Sans -g : tous les GPU disponibles, un par worker (round-robin)." + metavar="LIST", + help="Select the GPU(s) to use: an index (e.g. -g 0), " + "a list (e.g. -g 0,2), or 'all' for all of them. " + "Without -g: all available GPUs; workers are spread across them " + "within the free VRAM, the excess runs on CPU." ) parser.add_argument( "-f", "--force", action="store_true", - help="Régénérer tous les fichiers même si les WebP existent déjà" + help="Regenerate all files even if the output images (AVIF/WebP) already exist" ) parser.add_argument( "--force-classification", action="store_true", - help="Reclassifier le sol même si la méthode est inchangée (régénère aussi le DTM " - "et les images). Sans ce flag, changer --ground-classification suffit : la " - "méthode enregistrée est comparée et un changement déclenche la reclassification." + help="Reclassify the ground even if the method is unchanged (also regenerates the " + "DTM and the images). Without this flag, changing --ground-classification is " + "enough: the recorded method is compared and a change triggers reclassification." ) parser.add_argument( "--openness-downsample", type=int, default=None, - metavar="FACTEUR", - help="Facteur de sous-échantillonnage du calcul d'openness (lancé de rayons) : " - "grille décimée par blocs puis rééchantillonnage. Défaut : 2 (~8× plus " - "rapide, rendu quasi identique) ; 1 = pleine résolution" + metavar="FACTOR", + help="Downsampling factor for the openness computation (ray tracing): " + "block-decimated grid, then resampling. Default: 2 (cost divided by " + "factor³, ~13x faster measured, near-identical rendering); 1 = full resolution" ) parser.add_argument( "--edge-buffer", type=float, default=100.0, - metavar="METRES", - help="Raccord des bords : étendre le MNT d'une bande de N mètres remplie avec " - "les points sol des 8 tuiles LAZ voisines, pour que les rendus à grand " - "noyau (openness, SVF, LRM) soient continus d'une tuile à l'autre. " - "100 m couvre tous les rayons ; les images finales sont recadrées sur " - "la dalle 1 km exacte. Défaut : 100 (toujours appliqué en production) ; " - "0 = désactivé. Un changement de valeur régénère les DTM concernés." + metavar="METERS", + help="Edge stitching: extend the DTM by an N-meter band filled with the " + "ground points of the 8 neighboring LAZ tiles, so that large-kernel " + "renders (openness, SVF, LRM) are continuous from one tile to the next. " + "100 m covers all radii; final images are cropped to the exact 1 km " + "tile. Default: 100 (always applied in production); 0 = disabled. " + "Changing the value regenerates the affected DTMs." ) parser.add_argument( "--no-strip-align", action="store_true", - help="Désactiver le calage vertical des faisceaux de vol. Par défaut, les écarts " - "verticaux ≥ 0,5 cm entre lignes de vol (PointSourceId) d'une tuile sont mesurés " - "sur les points sol et corrigés avant rastérisation du MNT, puis la gigue " - "intra-faisceau (décalages aléatoires des lignes de balayage successives d'une " - "même passe, type vibration capteur) est corrigée par fenêtres de temps GPS " - "(offsets et séries consignés dans DTM/*_stripalign.json)" + help="Disable vertical alignment of flight strips. By default, vertical offsets " + "≥ 0.5 cm between the flight strips (PointSourceId) of a tile are measured on " + "the ground points and corrected before DTM rasterization, then each scan line " + "is adjusted jointly (offset and roll) against the other strips, with a " + "per-strip scan-angle calibration profile (GPS-time window jitter correction " + "when scan_angle is missing); corrections are recorded in " + "DTM/*_stripalign.json" ) parser.add_argument( "--keep-tif", action="store_true", - help="Conserver les fichiers TIFF (DTM + visualisations) pour pouvoir régénérer les WebP sans recalculer" + help="Keep the TIFF files (DTM + visualizations) so the output images can be regenerated without recomputing" ) parser.add_argument( "--ground-classification", choices=["auto", "ign", "smrf", "csf"], default="ign", - help="Méthode de classification du sol : auto (préfère la pré-classification IGN si " - "présente — base rapide — sinon détection SMRF/CSF), ign, smrf, csf. " - "Avec ign, le MNT est la rasterisation pure des classes choisies " - "(--ign-classes) sans aucune retouche ; avec smrf/csf, il est complété " - "par le retour le plus bas par cellule + interpolation des trous. " - "(défaut: ign, imposé en production)" + help="Ground classification method: auto (prefers the IGN pre-classification when " + "present — fast path — otherwise SMRF/CSF detection), ign, smrf, csf. " + "With ign, the DTM is rasterized from the chosen classes (--ign-classes); " + "with smrf/csf, ground is classified by PDAL first. In every case small gaps " + "are filled within the point envelope. " + "(default: ign, enforced in production)" ) parser.add_argument( "--ign-classes", default="sol", - help="Classes LAS extraites pour le MNT avec la classification IGN (méthode " - "ign/auto) : liste noms ou codes séparés par virgules — " - "sol(2), unclassified(1), eau(9), virtuel(66), pont(17), sursol(64). " - "Ex: --ign-classes sol,unclassified. Changer la liste reclassifie les " - "dalles concernées. (défaut: sol)" + help="LAS classes extracted for the DTM with the IGN classification (ign/auto " + "method): comma-separated list of names or codes — " + "sol(2, ground), unclassified(1), eau(9, water), virtuel(66, virtual), " + "pont(17, bridge), sursol(64, above-ground). " + "E.g. --ign-classes sol,unclassified. Changing the list reclassifies the " + "affected tiles. (default: sol)" ) parser.add_argument( "--quality", type=int, default=60, - help="Qualité image (1-100, défaut: 60). Utilisez 100 pour lossless." + help="Image quality (1-100, default: 60). 100 requests lossless (honored in WebP; " + "Pillow ignores it in AVIF)." ) parser.add_argument( "--lossless", action="store_true", - help="Forcer la compression lossless (équivalent à --quality 100)" + help="Force lossless compression (same as --quality 100)" ) parser.add_argument( "--format", choices=["webp", "avif"], default="avif", - help="Format de sortie : avif (défaut, meilleure qualité) ou webp" + help="Output format: avif (default, better quality) or webp" ) parser.add_argument( "--only", nargs="+", type=str, default=None, - help="Générer uniquement ces visualisations (ex: --only hillshade svf lrm)" + help="Generate only these visualizations (e.g. --only hillshade svf mslrm)" ) parser.add_argument( "--skip", nargs="+", type=str, default=None, - help="Exclure ces visualisations (ex: --skip ortho topo)" + help="Exclude these visualizations (e.g. --skip ortho topo)" ) parser.add_argument( "--file", nargs="+", type=str, default=None, - help="Traiter un ou plusieurs fichiers LAZ/LAS (nom complet sans extension, ex: LHD_FXX_1000_6882_PTS_LAMB93_IGN69.copc)" + help="Process one or more LAZ/LAS files (full name without extension, e.g. LHD_FXX_1000_6882_PTS_LAMB93_IGN69.copc)" ) parser.add_argument( "--fetch-tiles", nargs="+", default=None, metavar="COL,ROW", - help="Télécharger ces dalles LiDAR HD depuis l'IGN avant traitement " - "(tuiles non encore générées, ex: --fetch-tiles 1055,6882 1056,6883)" + help="Download these LiDAR HD tiles from IGN before processing " + "(tiles not generated yet, e.g. --fetch-tiles 1055,6882 1056,6883)" ) parser.add_argument( "-v", "--verbose", action="store_true", - help="Mode verbeux : affiche les timestamps et niveaux" + help="Verbose mode: show timestamps and levels" ) parser.add_argument( "--debug", action="store_true", - help="Mode debug : affiche les détails internes (fichier:ligne)" + help="Debug mode: show internal details (file:line)" ) parser.add_argument( "--rebuild-index", action="store_true", - help="Régénérer uniquement le catalogue des tuiles traitées (vignettes, sous-tuiles, inventaire — sans retraiter)" + help="Only rebuild the catalog of processed tiles (thumbnails, subtiles, inventory — no reprocessing)" ) parser.add_argument( "--no-index", action="store_true", - help="Ne pas générer le catalogue (vignettes + inventaire) à la fin du traitement" + help="Do not build the catalog (thumbnails + inventory), neither after each tile nor at the end of processing" ) parser.add_argument( "--incremental-index", action="store_true", - help="Conservé pour compatibilité : le catalogue est désormais régénéré après " - "chaque tuile terminée par défaut (sauf --no-index)" + help="Kept for compatibility: the catalog is now rebuilt after every " + "finished tile by default (unless --no-index)" ) parser.add_argument( "--quality-backfill", action="store_true", - help="Calculer uniquement les sidecars qualité (densité sol, dates de vol) " - "des LAZ du dossier d'entrée qui n'en ont pas, puis régénérer l'inventaire " - "(sans DTM ni visualisation, ~5 s par dalle)" + help="Only compute the quality sidecars (ground density, flight dates) " + "of the input LAZ files that lack one, then rebuild the inventory " + "(no DTM or visualization, ~5 s per tile)" ) args = parser.parse_args() @@ -291,7 +296,7 @@ def main(): logger.addFilter(_file_filter) logger.info("=" * 60) - logger.info("Pipeline LiDAR Archéologique") + logger.info("LiDAR Archaeological Pipeline") logger.info("=" * 60) # Parse --gpu into a list of GPU IDs @@ -304,16 +309,16 @@ def main(): try: gpu_ids = [int(g.strip()) for g in gpu_arg.split(',')] except ValueError: - parser.error(f"GPU invalide: {gpu_arg!r}. Utilisez un index, une liste (0,2) ou 'all'.") + parser.error(f"Invalid GPU: {gpu_arg!r}. Use an index, a list (0,2) or 'all'.") if gpu_ids is not None: from .gpu import restrict_gpus restrict_gpus(gpu_ids) - # Kill orphan PDAL processes on interrupt or termination. Le motif est - # borné à NOTRE répertoire temporaire (pdal pipeline /temp/…) : un - # pkill global massacrerient les PDAL des autres runs de la machine (ex. - # job de génération concurrent). Pas de hook atexit : une sortie normale n'a - # aucune raison de tuer quoi que ce soit. + # Kill orphan PDAL processes on interrupt or termination. The pattern is + # scoped to OUR temp directory (pdal pipeline /temp/...): a global + # pkill would slaughter the PDAL processes of other runs on the machine + # (e.g. a concurrent generation job). No atexit hook: a normal exit has no + # reason to kill anything. global _pdal_kill_pattern _pdal_kill_pattern = f"pdal pipeline {args.output}/temp/" signal.signal(signal.SIGINT, _kill_orphan_pdal) @@ -322,14 +327,14 @@ def main(): log_gpu_status() try: - # Mode --rebuild-index : régénère uniquement le catalogue, sans retraiter + # --rebuild-index mode: only rebuild the catalog, no reprocessing if args.rebuild_index: from .index import build_index index_path = build_index(args.output, args.format) if index_path: - logger.info(f"Catalogue généré : {index_path}") + logger.info(f"Catalog built: {index_path}") else: - logger.warning("Aucune tuile traitée trouvée — catalogue non généré") + logger.warning("No processed tile found — catalog not built") return if args.quality_backfill: @@ -338,13 +343,13 @@ def main(): from .quality import backfill_quality n = backfill_quality(args.input, args.output, codes=tuple(parse_ign_classes(args.ign_classes))) - logger.info(f"{n} sidecar(s) qualité écrit(s)") + logger.info(f"{n} quality sidecar(s) written") build_index(args.output, args.format) return - # Nouveau run : remise à zéro du journal d'événements (file de - # génération). Ici, avant le téléchargement — les événements download - # survivent au démarrage du traitement (process_all ne tronque plus). + # New run: reset the event log (generation queue). Done here, before + # downloading — download events survive the start of processing + # (process_all no longer truncates the log). from .progress import reset_events reset_events(args.output) @@ -358,10 +363,10 @@ def main(): skip_viz = [v.strip() for item in args.skip for v in item.split(',')] resolutions = [float(r.strip()) for r in args.resolution.split(',') if r.strip()] - # Téléchargement des dalles IGN manquantes avant le traitement. - # only_viz/resolutions : une tuile n'est ignorée que si elle possède - # déjà toutes les visualisations demandées — une tuile incomplète est - # (re)téléchargée pour générer ses visualisations manquantes. + # Download missing IGN tiles before processing. + # only_viz/resolutions: a tile is skipped only if it already has all + # the requested visualizations — an incomplete tile is + # (re)downloaded to generate its missing visualizations. if args.fetch_tiles: from .fetch_ign import fetch_tiles, parse_tile_specs try: @@ -369,14 +374,14 @@ def main(): except ValueError as e: logger.error(str(e)) return - logger.info(f"Téléchargement de {len(specs)} dalle(s) LiDAR HD depuis l'IGN...") + logger.info(f"Downloading {len(specs)} LiDAR HD tile(s) from IGN...") fetched = fetch_tiles(args.input, specs, args.output, only_viz=only_viz, resolutions=resolutions, force=args.force or args.force_classification) if fetched: - logger.info(f"{len(fetched)} dalle(s) téléchargée(s) — traitement...") + logger.info(f"{len(fetched)} tile(s) downloaded — processing...") else: - logger.warning("Aucune dalle téléchargée (déjà présentes ou introuvables)") + logger.warning("No tile downloaded (already present or not found)") pipeline = LidarArchaeoPipeline( input_dir=args.input, output_dir=args.output, @@ -420,7 +425,7 @@ def main(): # Remove duplicates matches = list(dict.fromkeys(matches)) if not matches: - logger.warning(f"Aucun fichier trouvé pour: {pattern}") + logger.warning(f"No file found for: {pattern}") continue selected_files.extend(matches) # Remove duplicates across patterns @@ -431,17 +436,17 @@ def main(): seen.add(f) unique_files.append(f) if not unique_files: - logger.error("Aucun fichier trouvé pour les motifs spécifiés") + logger.error("No file found for the given patterns") sys.exit(1) - logger.info(f"Traitement de {len(unique_files)} fichier(s) sélectionné(s)") + logger.info(f"Processing {len(unique_files)} selected file(s)") for laz_file in unique_files: logger.info(f" → {laz_file.name}") - # Réutilise process_all : workers parallèles, résumé, index, nettoyage + # Reuse process_all: parallel workers, summary, index, cleanup pipeline.process_all(files=unique_files) else: pipeline.process_all() except Exception as e: - logger.error(f"Erreur fatale: {e}", exc_info=True) + logger.error(f"Fatal error: {e}", exc_info=True) sys.exit(1) @@ -450,8 +455,8 @@ def _kill_orphan_pdal(signum=None, frame=None): import subprocess # Belt-and-suspenders: os.killpg below is the primary mechanism. # This handles the edge case where a child escapes the process group. - # Motif borné à notre output (cf. main) pour ne pas tuer les PDAL des - # autres runs de la machine. + # Pattern scoped to our output (see main) so the PDAL processes of other + # runs on the machine are not killed. if _pdal_kill_pattern: try: import re @@ -460,7 +465,7 @@ def _kill_orphan_pdal(signum=None, frame=None): except Exception: pass if signum is not None: - logger.info("Interruption — nettoyage des processus") + logger.info("Interrupted — cleaning up processes") # Force-kill all child processes immediately try: import os diff --git a/lidar_pipeline/dtm.py b/lidar_pipeline/dtm.py index 1e077e9..3652c51 100644 --- a/lidar_pipeline/dtm.py +++ b/lidar_pipeline/dtm.py @@ -1,11 +1,11 @@ """DTM generation from classified LiDAR point clouds. -Handles ground classification via PDAL (IGN supplier pre-classification, -SMRF or CSF) and DTM rasterisation -using scipy binned_statistic_2d (GPU-first via gpu.bin_mean_2d, scipy as -fallback). Gaps without LiDAR data (common in -complex/rocky terrain) are filled with a terrain-aware interpolation so the -DTM stays continuous. +Handles ground classification (IGN supplier pre-classification extracted +directly with laspy, PDAL as a fallback; or PDAL SMRF / CSF), vertical +alignment of the flight strips, and DTM rasterisation (GPU-first via +gpu.bin_mean_2d, scipy binned_statistic_2d as fallback). Gaps between points +are filled only within the envelope of the measured points; larger holes +without LiDAR data stay nodata. """ import json @@ -23,7 +23,7 @@ from .gpu import bin_mean_2d logger = logging.getLogger("lidar") -# Classes LAS exploitables de la pré-classification LiDAR HD (noms → codes) +# Usable LAS classes of the LiDAR HD pre-classification (names → codes) IGN_CLASS_NAMES = { "sol": 2, "unclassified": 1, @@ -35,95 +35,92 @@ IGN_CLASS_NAMES = { } -# Calage vertical des faisceaux de vol (strip alignment). Une tuile LiDAR HD -# est couverte par plusieurs passes d'acquisition, chacune portée par un ou -# deux PointSourceId (faisceaux). Les passes sont bien alignées horizontalement -# mais certains faisceaux portent un biais vertical de quelques cm (mesuré -# jusqu'à ~5 cm sur LHD_FXX_1000_6882 : les deux faisceaux d'une passe écartés -# de ±2,5 cm). À 0,2 m/px ces écarts créent des marches et du bruit aux -# coutures des zones de recouvrement. On mesure l'offset robuste de chaque -# faisceau sur les points sol de la tuile elle-même (les PointSourceId changent -# selon la campagne, rien n'est codé en dur) et on le retranche avant -# rastérisation. Les offsets dérivent le long d'une ligne de vol (signe inversé -# entre tuiles voisines mesuré) : le calcul est donc par tuile, jamais global. +# Vertical alignment of flight strips (strip alignment). A LiDAR HD tile is +# covered by several acquisition passes, each carried by one or two +# PointSourceIds (strips). Passes are well aligned horizontally, but some +# strips carry a vertical bias of a few cm (measured up to ~5 cm on +# LHD_FXX_1000_6882: the two strips of one pass were ±2.5 cm apart). At +# 0.2 m/px these offsets create steps and noise along the seams of overlap +# areas. The robust offset of each strip is measured on the ground points of +# the tile itself (PointSourceIds change between campaigns, nothing is +# hard-coded) and subtracted before rasterisation. Offsets drift along a +# flight line (sign measured to flip between neighbouring tiles), so the +# computation is per tile, never global. # -# 2ᵉ passe — gigue intra-faisceau : le décalage vertical peut aussi varier au -# fil d'une MÊME passe (vibration capteur / bruit haute fréquence de la -# trajectoire) : les lignes de balayage successives d'un faisceau apparaissent -# alors décalées verticalement de façon aléatoire. Chaque faisceau est découpé -# en fenêtres de temps GPS, l'offset robuste de chaque fenêtre est mesuré contre -# la surface médiane des autres faisceaux (même maille 1 m), la série est lissée -# (médiane glissante) puis interpolée au temps GPS de chaque point. Requiert la -# dimension gps_time (ignorée silencieusement sinon). +# 2nd pass: intra-strip jitter. The vertical offset can also vary along ONE +# pass (sensor vibration / high-frequency trajectory noise): successive scan +# lines of a strip then appear randomly shifted vertically. Each strip is cut +# into GPS time windows, the robust offset of each window is measured against +# the median surface of the other strips (same 1 m cell), the series is +# smoothed (rolling median) and then interpolated at each point's GPS time. +# Requires the gps_time dimension (silently skipped otherwise). # -# 3ᵉ passe — décalage ligne à ligne : les fenêtres de 0,1 s (lissées sur -# 0,5 s) regroupent ~15 lignes de balayage (~150 lignes/s) et ne travaillent -# qu'en recouvrement. Or deux lignes SUCCESSIVES d'une même passe peuvent -# différer de 1 à 2 cm (motif alterné, mesuré sur LHD_FXX_0999_6882) : stries -# fines perpendiculaires au vol sur tout le MNT. Chaque faisceau est découpé -# en lignes (sauts de scan_angle en dents de scie), le décalage robuste de -# chaque ligne (décalage ET inclinaison le long de la ligne : le roulis -# bascule les lignes) est mesuré contre la surface de SON faisceau (maille 0,5 m, -# boîte 1,5 m, plan local ajusté à la position réelle du point, 3 itérations -# pour que la ligne ne fausse pas sa propre référence), et seule la composante -# ligne à ligne est retirée (série − lissage gaussien σ 3 lignes ; une médiane -# glissante suivrait un motif alterné au lieu de l'effacer) : les variations -# lentes restent aux passes précédentes. Fonctionne sans recouvrement ; requiert -# gps_time et scan_angle. +# 3rd pass: line-by-line offset. The 0.1 s windows (smoothed over 0.5 s) +# group ~15 scan lines (~150 lines/s) and only work in overlaps. Yet two +# SUCCESSIVE lines of one pass can differ by 1 to 2 cm (alternating pattern, +# measured on LHD_FXX_0999_6882): fine stripes perpendicular to the flight +# direction over the whole DTM. Each strip is cut into lines (sawtooth jumps +# of scan_angle), the robust offset of each line (offset AND tilt along the +# line: roll tilts the lines) is measured against the surface of ITS OWN +# strip (0.5 m cell, 1.5 m box, local plane fitted at the point's actual +# position, 3 iterations so the line does not bias its own reference), and +# only the line-to-line component is removed (series − Gaussian smoothing +# σ 3 lines; a rolling median would follow an alternating pattern instead of +# erasing it): slow variations are left to the previous passes. Works without +# overlap; requires gps_time and scan_angle. # -# Ajustement conjoint (prioritaire) : la surface d'un faisceau absorbe toute -# erreur plus large que sa boîte de référence ; là où plusieurs faisceaux se -# recouvrent, chaque ligne (décalage + inclinaison) est donc recalée contre le -# consensus des AUTRES faisceaux, à toutes les échelles (roulis lent d'une -# passe entière, lignes isolées très décalées), par pas amortis et itérés. -# La correction sur son propre faisceau ne sert plus qu'aux lignes sans -# recouvrement. +# Joint adjustment (takes precedence): a strip's own surface absorbs any error +# wider than its reference box; where several strips overlap, each line +# (offset + tilt) is therefore re-aligned against the consensus of the OTHER +# strips, at every scale (slow roll of a whole pass, isolated strongly +# shifted lines), with damped, iterated steps. The correction against the +# strip's own surface is now only used for lines without overlap. STRIP_ALIGN_VERSION = 3 -STRIP_ALIGN_THRESHOLD = 0.005 # m : écart mini pour corriger un faisceau (0,5 cm) -STRIP_ALIGN_CELL = 1.0 # m : maille de comparaison des faisceaux -STRIP_ALIGN_MIN_SHARED = 500 # cellules sol communes mini pour valider un offset -STRIP_JITTER_BIN = 0.1 # s : durée d'une fenêtre de temps GPS (gigue) -STRIP_JITTER_SMOOTH = 5 # fenêtres : largeur de la médiane glissante -STRIP_JITTER_MIN_CELLS = 40 # cellules sol partagées mini pour valider une fenêtre -STRIP_JITTER_MAX = 0.10 # m : amplitude maxi d'une correction de gigue (garde-fou) -STRIP_LINE_CELL = 0.5 # m : maille de la surface de référence d'un faisceau -STRIP_LINE_BOX = 3 # mailles : lissage de la référence (boîte 1,5 m) -STRIP_LINE_WINDOW = 3 # lignes : σ du lissage gaussien retiré (garde le ligne-à-ligne) -STRIP_LINE_ITERS = 3 # itérations (atténuation par la ligne elle-même < 1 %) -STRIP_LINE_MAX = 0.05 # m : correction maxi d'une ligne (garde-fou) -STRIP_LINE_MIN_POINTS = 100 # points sol mini pour mesurer une ligne -STRIP_LINE_GAP = 0.05 # s : trou de temps qui coupe une ligne (fin de passe) -STRIP_LINE_MIN_RMS = 0.002 # m : faisceau laissé tel quel sous ce niveau -STRIP_LINE_MODEL = "conjoint+decalage+inclinaison+profil-angle" # modèle (consigné, invalide le cache) -_SCAN_ANGLE_UNIT = 0.006 # ° par unité de scan_angle (LAS 1.4) -STRIP_ANGLE_BIN = 1.0 # ° : pas du profil de correction par faisceau selon l'angle -STRIP_ANGLE_MIN_POINTS = 500 # points en recouvrement mini par classe d'angle (sinon valeur voisine) -STRIP_LINE_SUBSAMPLE = 3 # estimation sur 1 point sur 3 (correction appliquée à tous) -STRIP_JOINT_CELL = 1.0 # m : maille du consensus des autres faisceaux -STRIP_JOINT_ITERS = 8 # itérations maxi de l'ajustement conjoint -STRIP_JOINT_DAMPING = 0.5 # pas amorti : deux faisceaux se rapprochent sans se croiser -STRIP_JOINT_TOL = 0.001 # m : arrêt quand le pas moyen passe sous 1 mm -STRIP_JOINT_MIN_POINTS = 30 # points en recouvrement mini pour recaler une ligne -STRIP_JOINT_MAX = 0.15 # m : correction maxi d'un point (garde-fou) +STRIP_ALIGN_THRESHOLD = 0.005 # m: minimum offset to correct a strip (0.5 cm) +STRIP_ALIGN_CELL = 1.0 # m: strip comparison cell +STRIP_ALIGN_MIN_SHARED = 500 # minimum shared ground cells to validate an offset +STRIP_JITTER_BIN = 0.1 # s: length of a GPS time window (jitter) +STRIP_JITTER_SMOOTH = 5 # windows: width of the rolling median +STRIP_JITTER_MIN_CELLS = 40 # minimum shared ground cells to validate a window +STRIP_JITTER_MAX = 0.10 # m: maximum amplitude of a jitter correction (safeguard) +STRIP_LINE_CELL = 0.5 # m: cell of a strip's reference surface +STRIP_LINE_BOX = 3 # cells: reference smoothing (1.5 m box) +STRIP_LINE_WINDOW = 3 # lines: σ of the removed Gaussian smoothing (keeps line-to-line) +STRIP_LINE_ITERS = 3 # iterations (attenuation by the line itself < 1 %) +STRIP_LINE_MAX = 0.05 # m: maximum correction of a line (safeguard) +STRIP_LINE_MIN_POINTS = 100 # minimum ground points to measure a line +STRIP_LINE_GAP = 0.05 # s: time gap that breaks a line (end of pass) +STRIP_LINE_MIN_RMS = 0.002 # m: strip left untouched below this level +STRIP_LINE_MODEL = "conjoint+decalage+inclinaison+profil-angle" # model (recorded, invalidates the cache) +_SCAN_ANGLE_UNIT = 0.006 # ° per scan_angle unit (LAS 1.4) +STRIP_ANGLE_BIN = 1.0 # °: step of the per-strip correction profile by angle +STRIP_ANGLE_MIN_POINTS = 500 # minimum overlap points per angle bin (else neighbour value) +STRIP_LINE_SUBSAMPLE = 3 # estimate on 1 point in 3 (correction applied to all) +STRIP_JOINT_CELL = 1.0 # m: cell of the other strips' consensus +STRIP_JOINT_ITERS = 8 # maximum iterations of the joint adjustment +STRIP_JOINT_DAMPING = 0.5 # damped step: two strips converge without crossing +STRIP_JOINT_TOL = 0.001 # m: stop when the mean step falls below 1 mm +STRIP_JOINT_MIN_POINTS = 30 # minimum overlap points to re-align a line +STRIP_JOINT_MAX = 0.15 # m: maximum correction of a point (safeguard) -# Mémo des offsets par fichier : la classification est partagée entre -# résolutions, le même LAS sol est rasterisé à 0,5 m puis 0,2 m. +# Per-file memo of offsets: classification is shared between resolutions, +# the same ground LAS is rasterised at 0.5 m and then 0.2 m. _STRIP_OFFSETS_CACHE = {} _STRIP_JITTER_CACHE = {} _STRIP_LINES_CACHE = {} def _strip_surface_grid(x, y, z, inv, n_sources, cell=STRIP_ALIGN_CELL): - """Surfaces sol par faisceau sur maille 1 m (moyenne des points bas). + """Per-strip ground surfaces on a 1 m grid (mean of the low points). - Pour chaque faisceau et chaque maille : moyenne des points situés à moins - de 0,5 m du minimum du faisceau dans la maille (robuste à la végétation - résiduelle), mailles à ≥ 2 points seulement. + For each strip and each cell: mean of the points lying within 0.5 m of + the strip's minimum in that cell (robust to residual vegetation), cells + with ≥ 2 points only. Returns: - (allcells, grid, key) : cellules triées, grid[faisceau, cellule] = Z - moyen (NaN si absent) et clé de maille de CHAQUE point ; None si - aucune surface n'est peuplée. + (allcells, grid, key): sorted cells, grid[strip, cell] = mean Z (NaN + if absent) and the cell key of EVERY point; None if no surface is + populated. """ x0 = np.floor(np.min(x) / cell) * cell y0 = np.floor(np.min(y) / cell) * cell @@ -162,25 +159,25 @@ def _strip_surface_grid(x, y, z, inv, n_sources, cell=STRIP_ALIGN_CELL): def _strip_vertical_offsets(x, y, z, psid, cell=STRIP_ALIGN_CELL, threshold=STRIP_ALIGN_THRESHOLD, min_shared=STRIP_ALIGN_MIN_SHARED): - """Mesure les offsets verticaux relatifs entre faisceaux d'une tuile. + """Measure the relative vertical offsets between the strips of a tile. - Méthode : surface sol par faisceau (moyenne des points à moins de 0,5 m du - minimum de chaque maille de 1 m, robuste à la végétation résiduelle), puis - offset de chaque faisceau = médiane de l'écart à la surface médiane de - référence (itéré 3 fois), sur les seules cellules couvertes par au moins - deux faisceaux. Ne corrige rien d'autre que le vertical : le calage - horizontal mesuré sur les données est excellent (≤ 1 cm). + Method: ground surface per strip (mean of the points within 0.5 m of the + minimum of each 1 m cell, robust to residual vegetation), then the offset + of each strip = median of its deviation from the median reference + surface (iterated 3 times), on cells covered by at least two strips only. + Corrects nothing but the vertical: the horizontal alignment measured on + the data is excellent (≤ 1 cm). Args: - x, y, z, psid: coordonnées et PointSourceId des points sol. - cell: taille de maille de comparaison (m). - threshold: seuil (m) en dessous duquel un offset est ignoré. - min_shared: cellules communes minimales pour valider un faisceau. + x, y, z, psid: coordinates and PointSourceId of the ground points. + cell: comparison cell size (m). + threshold: threshold (m) below which an offset is ignored. + min_shared: minimum shared cells to validate a strip. Returns: - dict {psid: offset} des offsets à SOUSTRAIRE (z - offset), ne - contenant que les |offset| >= threshold ; vide si rien à corriger - (faisceau unique, pas de recouvrement, tuile déjà alignée). + dict {psid: offset} of the offsets to SUBTRACT (z - offset), holding + only |offset| >= threshold; empty if there is nothing to correct + (single strip, no overlap, tile already aligned). """ us, inv = np.unique(psid, return_inverse=True) if len(us) < 2: @@ -204,7 +201,7 @@ def _strip_vertical_offsets(x, y, z, psid, cell=STRIP_ALIGN_CELL, def _rolling_median(values, window): - """Médiane glissante (fenêtre tronquée aux bords) sur un petit vecteur.""" + """Rolling median (window truncated at the edges) over a small vector.""" n = len(values) if window <= 1 or n == 0: return np.array(values, dtype=np.float64) @@ -219,35 +216,34 @@ def _strip_jitter_offsets(x, y, z, psid, t, cell=STRIP_ALIGN_CELL, min_cells=STRIP_JITTER_MIN_CELLS, max_corr=STRIP_JITTER_MAX, threshold=STRIP_ALIGN_THRESHOLD): - """Mesure la gigue verticale intra-faisceau par fenêtres de temps GPS. + """Measure intra-strip vertical jitter over GPS time windows. - Le calage constant retire un offset par faisceau, mais le décalage - vertical peut aussi varier au fil d'une même passe (vibration capteur, - bruit haute fréquence de la trajectoire). Chaque faisceau est découpé en - fenêtres de temps GPS ; l'offset robuste de chaque fenêtre est mesuré - contre la surface médiane des AUTRES faisceaux (maille 1 m, même - sélection de points bas que le calage constant — en recouvrement à deux, - une référence incluant le faisceau testé ne révélerait que la moitié du - décalage), puis la série est lissée (médiane glissante) pour ne pas - suivre le bruit de mesure. z doit déjà être corrigé des offsets constants. + The constant alignment removes one offset per strip, but the vertical + offset can also vary along a single pass (sensor vibration, + high-frequency trajectory noise). Each strip is cut into GPS time + windows; the robust offset of each window is measured against the median + surface of the OTHER strips (1 m cell, same low-point selection as the + constant alignment; with a two-strip overlap, a reference including the + tested strip would reveal only half of the offset), then the series is + smoothed (rolling median) so as not to follow measurement noise. z must + already be corrected for the constant offsets. Args: - x, y, z, psid: coordonnées, Z (constant-calé) et PointSourceId des - points sol. - t: temps GPS (s) de chaque point. - cell: taille de maille de comparaison (m). - bin_seconds: durée d'une fenêtre de temps (s). - smooth: largeur de la médiane glissante (fenêtres). - min_cells: cellules partagées minimales pour valider une fenêtre. - max_corr: amplitude maximale d'une correction (garde-fou, m). - threshold: amplitude de série sous laquelle un faisceau est - considéré comme stable (pas de correction). + x, y, z, psid: coordinates, Z (constant-aligned) and PointSourceId + of the ground points. + t: GPS time (s) of each point. + cell: comparison cell size (m). + bin_seconds: length of a time window (s). + smooth: width of the rolling median (windows). + min_cells: minimum shared cells to validate a window. + max_corr: maximum amplitude of a correction (safeguard, m). + threshold: series amplitude below which a strip is considered + stable (no correction). Returns: - dict {psid: (times, corrections)} des corrections à SOUSTRAIRE, - interpolables linéairement au temps GPS de chaque point ; vide si - rien de mesurable (faisceau unique, temps absent, pas de - recouvrement). + dict {psid: (times, corrections)} of the corrections to SUBTRACT, + linearly interpolable at each point's GPS time; empty if nothing is + measurable (single strip, no time, no overlap). """ us, inv = np.unique(psid, return_inverse=True) if len(us) < 2: @@ -261,36 +257,35 @@ def _strip_jitter_offsets(x, y, z, psid, t, cell=STRIP_ALIGN_CELL, allcells, grid, key = built covered = np.sum(~np.isnan(grid), axis=0) >= 2 - # Référence d'un faisceau = médiane des autres faisceaux. + # Reference of a strip = median of the other strips. ref = np.full(grid.shape, np.nan) if len(us) == 2: ref[0], ref[1] = grid[1], grid[0] else: import warnings with warnings.catch_warnings(): - warnings.simplefilter("ignore", RuntimeWarning) # tranches tout-NaN + warnings.simplefilter("ignore", RuntimeWarning) # all-NaN slices for k in range(len(us)): ref[k] = np.nanmedian(np.delete(grid, k, axis=0), axis=0) - # Résidu vertical de chaque point contre la référence de son faisceau. + # Vertical residual of each point against its strip's reference. idx = np.minimum(np.searchsorted(allcells, key), len(allcells) - 1) ref_point = ref[inv, idx] hit = (allcells[idx] == key) & covered[idx] & np.isfinite(ref_point) residual = np.full(np.asarray(z).shape, np.nan) residual[hit] = np.asarray(z)[hit] - ref_point[hit] - # Origine de temps propre à chaque faisceau : des passes d'une même tuile - # peuvent être espacées de plusieurs heures, les fenêtres restent ainsi - # dense autour du vol réel (et un saut de semaine GPS ne crée pas de - # géantes plages vides). + # Per-strip time origin: passes over one tile can be hours apart, so the + # windows stay dense around the actual flight (and a GPS week rollover + # does not create huge empty ranges). origin = np.full(len(us), np.inf) np.minimum.at(origin, inv, t) tb = np.floor((t - origin[inv]) / bin_seconds).astype(np.int64) n_bins = int(tb.max()) + 1 group = inv * n_bins + tb - # Médiane robuste par groupe (faisceau, fenêtre) : les résidus finis sont - # triés en tête de segment, les NaN (sans référence) sont ignorés. + # Robust median per (strip, window) group: finite residuals are sorted to + # the head of each segment, NaNs (no reference) are ignored. order = np.lexsort((np.where(np.isfinite(residual), residual, np.inf), group)) g_s, r_s = group[order], residual[order] starts = np.flatnonzero(np.r_[True, g_s[1:] != g_s[:-1]]) @@ -311,7 +306,7 @@ def _strip_jitter_offsets(x, y, z, psid, t, cell=STRIP_ALIGN_CELL, result = {} for k in range(len(us)): selk = gids // n_bins == k - if int(selk.sum()) < 3: # série trop courte : correction non fiable + if int(selk.sum()) < 3: # series too short: unreliable correction continue b = gids[selk] % n_bins cs = np.clip(_rolling_median(med[selk], smooth), -max_corr, max_corr) @@ -322,7 +317,7 @@ def _strip_jitter_offsets(x, y, z, psid, t, cell=STRIP_ALIGN_CELL, def _module_of(arr): - """Module (numpy ou cupy) d'un tableau.""" + """Array module (numpy or cupy) of an array.""" mod = type(arr).__module__ if mod.startswith("cupy"): import cupy @@ -331,7 +326,7 @@ def _module_of(arr): def _array_module(use_gpu): - """cupy si le GPU est actif et demandé, sinon numpy.""" + """cupy if the GPU is active and requested, numpy otherwise.""" if use_gpu: from . import gpu as _gpu if _gpu.is_gpu_active() and _gpu._cp is not None: @@ -340,12 +335,12 @@ def _array_module(use_gpu): def _scan_line_ids(t, angle, gap=STRIP_LINE_GAP): - """Identifiant de ligne de balayage de points d'UN faisceau triés par temps. + """Scan-line id of the points of ONE strip, sorted by time. - Nouvelle ligne à chaque saut de scan_angle de plus de la moitié de - l'amplitude dans le sens opposé au balayage (retour de la dent de scie) - ou à chaque trou de temps > gap (fin de passe). Les trous laissés par la - végétation retirée dans une ligne ne la coupent pas. + A new line starts at every scan_angle jump larger than half the + amplitude in the direction opposite to the sweep (sawtooth flyback) or + at every time gap > gap (end of pass). Holes left by removed vegetation + inside a line do not break it. """ m = _module_of(angle) angle = m.asarray(angle, dtype=m.float64) @@ -355,15 +350,15 @@ def _scan_line_ids(t, angle, gap=STRIP_LINE_GAP): d = m.diff(angle) moving = d[d != 0] sweep = float(m.sign(m.median(moving))) if len(moving) else 1.0 - # Retour de la dent de scie : grand saut de sens OPPOSÉ au balayage. Un - # trou de végétation fait aussi sauter l'angle, mais dans le sens du - # balayage : il ne coupe pas la ligne. + # Sawtooth flyback: a large jump OPPOSITE to the sweep direction. A + # vegetation hole also makes the angle jump, but in the sweep direction: + # it does not break the line. new = m.concatenate([m.ones(1, dtype=bool), (d * sweep < -0.5 * amp) | (m.diff(t) > gap)]) return m.cumsum(new) - 1 def _group_median(values, groups, n_groups, min_count): - """Médiane des valeurs finies par groupe (vectorisée), NaN sous min_count.""" + """Median of the finite values per group (vectorised), NaN below min_count.""" finite = np.isfinite(values) order = np.lexsort((np.where(finite, values, np.inf), groups)) g = groups[order] @@ -379,11 +374,11 @@ def _group_median(values, groups, n_groups, min_count): def _line_fit(r, w, line, u, n_lines, min_points): - """Moindres carrés pondérés par ligne : r ≈ a + b·u (sommes par bincount). + """Weighted least squares per line: r ≈ a + b·u (sums via bincount). Returns: - (a, b, ok) ; b vaut 0 là où l'étendue de u ne permet pas d'estimer - une inclinaison (a seul, moyenne pondérée). + (a, b, ok); b is 0 where the spread of u does not allow a tilt to be + estimated (a alone, weighted mean). """ m = _module_of(r) rw = m.where(w, r, 0.0) @@ -405,8 +400,8 @@ def _line_fit(r, w, line, u, n_lines, min_points): def _robust_mask(r, floor=0.03, k=5.0): - """Résidus finis sous k MAD (plancher floor) : écarte végétation basse, - points mal classés et bords de trous sans trier chaque ligne.""" + """Finite residuals below k MAD (with a floor): rejects low vegetation, + misclassified points and hole edges without sorting each line.""" m = _module_of(r) f = m.isfinite(r) if not bool(f.any()): @@ -420,17 +415,17 @@ def _scan_line_corrections_beam(x, y, z, t, angle, cell=STRIP_LINE_CELL, iters=STRIP_LINE_ITERS, max_corr=STRIP_LINE_MAX, min_points=STRIP_LINE_MIN_POINTS, subsample=STRIP_LINE_SUBSAMPLE): - """Corrections ligne à ligne d'un faisceau contre SA surface (à SOUSTRAIRE). + """Line-by-line corrections of a strip against ITS OWN surface (to SUBTRACT). - Chaque ligne est modélisée par un décalage ET une inclinaison le long de - la ligne (a + b·u, u = scan_angle normalisé) : une erreur de roulis - bascule la ligne, un bout plus haut que l'autre. Seule la composante - ligne à ligne est retirée (série − gaussienne σ window lignes). Estimation - sur 1 point sur subsample, moindres carrés tronqués (5 MAD) vectorisés. + Each line is modelled by an offset AND a tilt along the line (a + b·u, + u = normalised scan_angle): a roll error tilts the line, one end higher + than the other. Only the line-to-line component is removed (series − + Gaussian of σ window lines). Estimated on 1 point in subsample, with + vectorised trimmed least squares (5 MAD). Returns: - (corr par point dans l'ordre d'entrée, décalages par ligne, - inclinaisons par ligne au bord de fauchée). + (corr per point in input order, offsets per line, tilts per line at + the swath edge). """ from scipy.ndimage import gaussian_filter1d, uniform_filter n = len(z) @@ -445,10 +440,10 @@ def _scan_line_corrections_beam(x, y, z, t, angle, cell=STRIP_LINE_CELL, sel = np.arange(n) % max(1, int(subsample)) == 0 xs, ys, zs = x[sel], y[sel], np.asarray(z, dtype=np.float64)[sel] line, u = line_all[sel], u_all[sel] - # Référence = plan local : moyennes (x, y, z) par boîte de mailles, pente - # de la surface lissée ; évalué à la position réelle du point (la moyenne - # d'une maille n'est pas en son centre : sur une pente, une interpolation - # au centre crée un biais qui dépend de la position de la ligne). + # Reference = local plane: (x, y, z) means per box of cells, slope of the + # smoothed surface; evaluated at the point's actual position (a cell's + # mean is not at its centre: on a slope, interpolating at the centre + # creates a bias that depends on where the line lies). x0, y0 = xs.min(), ys.min() ix = np.floor((xs - x0) / cell).astype(np.int64) iy = np.floor((ys - y0) / cell).astype(np.int64) @@ -473,8 +468,8 @@ def _scan_line_corrections_beam(x, y, z, t, angle, cell=STRIP_LINE_CELL, idx = np.flatnonzero(ok) a = np.interp(np.arange(nl), idx, a[ok]) b = np.interp(np.arange(nl), idx, b[ok]) - # Seule la composante ligne à ligne est retirée (une médiane glissante - # suivrait un motif alterné au lieu de l'effacer) + # Only the line-to-line component is removed (a rolling median would + # follow an alternating pattern instead of erasing it) da = a - gaussian_filter1d(a, window, mode="nearest") db = b - gaussian_filter1d(b, window, mode="nearest") da[~ok] = 0.0 @@ -491,19 +486,20 @@ def _joint_line_corrections(x, y, z, psid, t, angle, cell=STRIP_JOINT_CELL, tol=STRIP_JOINT_TOL, min_points=STRIP_JOINT_MIN_POINTS, subsample=STRIP_LINE_SUBSAMPLE, max_corr=STRIP_JOINT_MAX, use_gpu=True): - """Ajustement conjoint des lignes de tous les faisceaux contre le - consensus des AUTRES faisceaux (décalage + inclinaison par ligne). + """Joint adjustment of the lines of all strips against the consensus of + the OTHER strips (offset + tilt per line), plus a per-strip profile by + scan-angle bin. - À chaque itération, le résidu d'un point est mesuré contre la moyenne des - autres faisceaux de sa maille (ramenée à sa position par la pente de la - surface), chaque ligne est ajustée par moindres carrés tronqués, et une - fraction damping du pas est appliquée à toutes les lignes à la fois ; - l'altitude moyenne est recentrée (pas de dérive d'ensemble). Sur GPU - (CuPy) si disponible, repli numpy sur toute erreur. + At each iteration, a point's residual is measured against the mean of + the other strips in its cell (brought to its position by the surface + slope), each line is fitted by trimmed least squares, and a damping + fraction of the step is applied to all lines at once; the mean elevation + is re-centred (no overall drift). Runs on GPU (CuPy) when available, + falling back to numpy on any error. Returns: - (corr à SOUSTRAIRE par point, id de ligne global par point, - lignes recalées (bool par ligne), nombre d'itérations) — numpy. + (corr to SUBTRACT per point, global line id per point, re-aligned + lines (bool per line), number of iterations), as numpy arrays. """ m = _array_module(use_gpu) if m is not np: @@ -511,7 +507,7 @@ def _joint_line_corrections(x, y, z, psid, t, angle, cell=STRIP_JOINT_CELL, return _joint_line_corrections_impl(m, x, y, z, psid, t, angle, cell, iters, damping, tol, min_points, subsample, max_corr) except Exception as e: - logger.warning(f" Ajustement conjoint GPU impossible ({e}) — repli CPU") + logger.warning(f" GPU joint adjustment failed ({e}), falling back to CPU") return _joint_line_corrections_impl(np, x, y, z, psid, t, angle, cell, iters, damping, tol, min_points, subsample, max_corr) @@ -523,8 +519,8 @@ def _joint_line_corrections_impl(m, x, y, z, psid, t, angle, cell, iters, dampin n = len(z) psid_h = np.asarray(psid) beams, bidx_h = np.unique(psid_h, return_inverse=True) - # Classe d'angle par faisceau : profil d'étalonnage commun à toutes les - # lignes d'un faisceau (écart non linéaire en travers de la fauchée). + # Angle bin per strip: calibration profile shared by all lines of a strip + # (non-linear deviation across the swath). abin_h = np.round(np.asarray(angle, dtype=np.float64) * _SCAN_ANGLE_UNIT / STRIP_ANGLE_BIN).astype(np.int64) amin = int(abin_h.min()) if n else 0 n_ab = int(abin_h.max()) - amin + 1 if n else 1 @@ -585,11 +581,11 @@ def _joint_line_corrections_impl(m, x, y, z, psid, t, angle, cell, iters, dampin w[mb] = _robust_mask(r[mb]) a, b, ok = _line_fit(r, w, gs, us, n_lines, min_pts) touched |= ok - # Profil par faisceau et classe d'angle : moyenne tronquée du résidu - # restant après le pas de ligne ; sa moyenne (portée par les lignes) - # est retirée faisceau par faisceau. Sa pente est conservée : quand la - # fauchée ne traverse la dalle qu'en partie, l'inclinaison des lignes - # est indéterminée et seul le profil peut la porter. + # Profile per strip and angle bin: trimmed mean of the residual left + # after the line step; its mean (carried by the lines) is removed + # strip by strip. Its slope is kept: when the swath only partly + # crosses the tile, the line tilt is undetermined and only the + # profile can carry it. r2 = m.where(w, r - (a[gs] + b[gs] * us), 0.0) wf = w.astype(m.float64) cnt = m.bincount(cs, weights=wf, minlength=n_bins) @@ -604,9 +600,9 @@ def _joint_line_corrections_impl(m, x, y, z, psid, t, angle, cell, iters, dampin uk, pk = ub[sl][k], prof[sl][k] um, pm = float((wk * uk).sum() / wk.sum()), float((wk * pk).sum() / wk.sum()) fitted = prof[sl] - pm - # Classe trop pauvre (bord de fauchée, classe incomplète) : - # valeur de la classe valide la plus proche, pas zéro — c'est - # précisément au bord que l'écart est le plus fort. + # Bin too sparse (swath edge, incomplete bin): value of the + # nearest valid bin, not zero; the deviation is precisely + # strongest at the edge. idx = m.arange(n_ab, dtype=m.float64) prof[sl] = m.interp(idx, idx[k], fitted[k]) else: @@ -614,7 +610,7 @@ def _joint_line_corrections_impl(m, x, y, z, psid, t, angle, cell, iters, dampin A += damping * a B += damping * b C += damping * prof - A -= float(m.mean(A[gs] + B[gs] * us + C[cs])) # pas de dérive d'ensemble + A -= float(m.mean(A[gs] + B[gs] * us + C[cs])) # no overall drift step_lines = float(m.mean(m.abs(a[ok]))) * damping if bool(ok.any()) else 0.0 step_prof = float(m.max(m.abs(prof))) * damping if max(step_lines, step_prof) < tol: @@ -624,23 +620,25 @@ def _joint_line_corrections_impl(m, x, y, z, psid, t, angle, cell, iters, dampin def _rolling_median_fast(values, window): - """Médiane glissante centrée (bords répétés), vectorisée.""" + """Centred rolling median (edges repeated), vectorised.""" from numpy.lib.stride_tricks import sliding_window_view half = window // 2 return np.median(sliding_window_view(np.pad(values, half, mode="edge"), window), axis=1) def _scan_line_corrections(x, y, z, psid, t, angle, min_rms=STRIP_LINE_MIN_RMS): - """Corrections ligne à ligne de tous les faisceaux d'une tuile. + """Line-by-line corrections of all strips of a tile. - 1. Ajustement conjoint contre les autres faisceaux (lignes en recouvrement). - 2. Lignes sans recouvrement : composante ligne à ligne contre la surface - de leur propre faisceau. - z doit être déjà calé (offsets constants et gigue temporelle). + 1. Joint adjustment against the other strips (lines in overlaps). + 2. Lines without overlap: line-to-line component against the surface of + their own strip (only when more than 5 % of the strip's points are in + such lines). + z must already be aligned (constant offsets and, if computed, time + jitter). Returns: - (corrections à SOUSTRAIRE par point, {psid: (lignes, rms, max)} des - faisceaux corrigés). + (corrections to SUBTRACT per point, {psid: (lines, rms, max)} of the + corrected strips). """ psid = np.asarray(psid) z = np.asarray(z, dtype=np.float64) @@ -668,7 +666,7 @@ def _scan_line_corrections(x, y, z, psid, t, angle, min_rms=STRIP_LINE_MIN_RMS): def _scan_angle(las): - """scan_angle (LAS 1.4) ou scan_angle_rank (LAS ≤ 1.3), None si absent.""" + """scan_angle (LAS 1.4) or scan_angle_rank (LAS ≤ 1.3), None if absent.""" for name in ("scan_angle", "scan_angle_rank"): try: return np.asarray(getattr(las, name), dtype=np.float64) @@ -678,7 +676,7 @@ def _scan_angle(las): def _scan_lines_for_file(las_file, las, z_aligned, t): - """Corrections ligne à ligne d'un LAS sol, mémoïsées par (chemin, mtime).""" + """Line-by-line corrections of a ground LAS, memoised by (path, mtime).""" try: p = Path(las_file) cache_key = (str(p), p.stat().st_mtime_ns) @@ -697,14 +695,14 @@ def _scan_lines_for_file(las_file, las, z_aligned, t): def _apply_strip_jitter(psid, t, jitter): - """Corrections de gigue interpolées au temps GPS de chaque point. + """Jitter corrections interpolated at each point's GPS time. Args: - psid, t: PointSourceId et temps GPS (s) de chaque point. - jitter: dict {psid: (times, corrections)} issu de _strip_jitter_offsets. + psid, t: PointSourceId and GPS time (s) of each point. + jitter: dict {psid: (times, corrections)} from _strip_jitter_offsets. Returns: - array des corrections à SOUSTRAIRE (0 pour les points sans série). + array of the corrections to SUBTRACT (0 for points without a series). """ corr = np.zeros(len(t)) if not jitter: @@ -719,7 +717,7 @@ def _apply_strip_jitter(psid, t, jitter): def _strip_jitter_for_file(las_file, las, offsets): - """Gigue temporelle d'un LAS sol (offsets constants mesurés), mémoïsée.""" + """Time jitter of a ground LAS (after the measured constant offsets), memoised.""" try: p = Path(las_file) cache_key = (str(p), p.stat().st_mtime_ns) @@ -732,7 +730,7 @@ def _strip_jitter_for_file(las_file, las, offsets): t = np.asarray(las.gps_time, dtype=np.float64) psid = np.asarray(las.point_source_id) except AttributeError: - t, psid = None, None # dimensions absentes : pas de gigue mesurable + t, psid = None, None # missing dimensions: no measurable jitter if (t is not None and psid is not None and len(t) == len(las.points) == len(psid)): z = np.asarray(las.z, dtype=np.float64) @@ -750,7 +748,7 @@ def _strip_jitter_for_file(las_file, las, offsets): def _strip_offsets_for_file(las_file, las): - """Offsets de calage d'un LAS sol, mémoïsés par (chemin, mtime).""" + """Alignment offsets of a ground LAS, memoised by (path, mtime).""" try: p = Path(las_file) cache_key = (str(p), p.stat().st_mtime_ns) @@ -761,7 +759,7 @@ def _strip_offsets_for_file(las_file, las): try: psid = np.asarray(las.point_source_id) except AttributeError: - psid = None # dimension absente (producteur tiers) : pas de calage + psid = None # missing dimension (third-party producer): no alignment if psid is not None and len(psid) == len(las.points): offsets = _strip_vertical_offsets( np.asarray(las.x, dtype=np.float64), @@ -776,12 +774,12 @@ def _strip_offsets_for_file(las_file, las): def _write_strip_align_sidecar(dtm_dir, basename, output_suffix, offsets, jitter=None, lines=None): - """Consigne les calages appliqués (version, seuil, offsets et gigue). + """Record the applied alignments (version, threshold, offsets, jitter, lines). - Le sidecar sert de suivi de cache : un DTM sans sidecar, ou produit avec - une version/un seuil/des paramètres de gigue différents, est régénéré. Il - est écrit même quand aucune correction n'a été appliquée, pour ne pas - re-mesurer une tuile déjà connue comme bien alignée. + The sidecar doubles as a cache tracker: a DTM without a sidecar, or one + produced with a different version/threshold/jitter or line parameters, + is regenerated. It is written even when no correction was applied, so a + tile already known to be well aligned is not measured again. """ jitter_payload = {} for p, (times, cs) in (jitter or {}).items(): @@ -810,7 +808,7 @@ def _write_strip_align_sidecar(dtm_dir, basename, output_suffix, offsets, sidecar.write_text(json.dumps(payload, ensure_ascii=False), encoding="utf-8") except Exception as e: - logger.warning(f" Écriture sidecar calage faisceaux impossible: {e}") + logger.warning(f" Could not write the strip alignment sidecar: {e}") def _strip_lidar_ext(path): @@ -823,17 +821,17 @@ def _strip_lidar_ext(path): def parse_ign_classes(spec): - """Convertit une liste de classes IGN (noms ou codes) en codes LAS triés. + """Convert a list of IGN classes (names or codes) into sorted LAS codes. Args: - spec: Chaîne séparée par virgules, ex. "sol,unclassified" ou "2,1". + spec: Comma-separated string, e.g. "sol,unclassified" or "2,1". Returns: - Liste triée de codes LAS uniques. + Sorted list of unique LAS codes. Raises: - ValueError: Si un élément n'est ni un nom connu ni un code LAS 0-255, - ou si la liste est vide. + ValueError: If an item is neither a known name nor a LAS code 0-255, + or if the list is empty. """ codes = set() for token in str(spec).split(","): @@ -847,22 +845,22 @@ def parse_ign_classes(spec): code = int(token) except ValueError: raise ValueError( - f"Classe IGN inconnue: '{token}' " - f"(noms: {', '.join(sorted(IGN_CLASS_NAMES))} ou code LAS 0-255)") + f"Unknown IGN class: '{token}' " + f"(names: {', '.join(sorted(IGN_CLASS_NAMES))} or LAS code 0-255)") if not 0 <= code <= 255: - raise ValueError(f"Code LAS hors bornes (0-255): {code}") + raise ValueError(f"LAS code out of range (0-255): {code}") codes.add(code) if not codes: - raise ValueError("Aucune classe IGN fournie") + raise ValueError("No IGN class given") return sorted(codes) def ign_method_label(codes): - """Étiquette de méthode encodant les classes IGN (ex. 'ign_1_2'). + """Method label encoding the IGN classes (e.g. 'ign_1_2'). - 'ign' seul = sol uniquement (code 2), rétrocompatible avec les fichiers de - classification existants. Toute autre combinaison est encodée dans le nom - pour invalider le cache et déclencher la reclassification. + 'ign' alone = ground only (code 2), backward compatible with existing + classification files. Any other combination is encoded in the name to + invalidate the cache and trigger reclassification. """ codes = sorted(codes) if codes == [2]: @@ -906,12 +904,11 @@ def _create_ground_pipeline(input_laz, output_las, method, ign_codes=None): "limits": "Classification[2:2]" } - # LiDAR HD IGN : le fichier est pré-classifié par le fournisseur. - # On réutilise la classification telle quelle (mode pur) : les classes - # extraites sont paramétrables — par défaut le sol seul (2), mais on peut - # ajouter p.ex. unclassified (1) pour combler les trous sans retouche. - # Les plages multiples sur Classification sont combinées en OU logique - # par filters.range (sémantique PDAL documentée). + # IGN LiDAR HD: the file is pre-classified by the supplier. The + # classification is reused as is (pure mode): the extracted classes are + # configurable, ground only (2) by default, but e.g. unclassified (1) can + # be added to fill holes without reprocessing. Multiple ranges on + # Classification are ORed by filters.range (documented PDAL semantics). if method == 'ign': codes = sorted(ign_codes) if ign_codes else [2] ign_filter = { @@ -967,9 +964,9 @@ def _create_ground_pipeline(input_laz, output_las, method, ign_codes=None): "scalar": 1.25 } elif method == 'csf': - # resolution 1.0 m : un cloth à 0.5 m (= 4 M particules pour 1 km²) - # rend la classification ~4× plus lente sans gain visible sur le MNT - # (la résolution finale du MNT vient de la rasterisation, pas du cloth). + # resolution 1.0 m: a 0.5 m cloth (= 4 M particles per km²) makes + # classification ~4× slower with no visible gain on the DTM (the + # final DTM resolution comes from rasterisation, not from the cloth). ground_step = { "type": "filters.csf", "resolution": 1.0, @@ -978,7 +975,7 @@ def _create_ground_pipeline(input_laz, output_las, method, ign_codes=None): "threshold": 0.5 } else: - raise ValueError(f"Méthode de classification inconnue: {method}") + raise ValueError(f"Unknown classification method: {method}") pipeline = { "pipeline": [ @@ -1030,17 +1027,17 @@ def validate_laz(laz_file): header = f.header point_count = header.point_count if point_count == 0: - logger.error(f" ✗ Fichier vide (0 points): {laz_file.name}") - logger.error(f" → Re-télécharger depuis https://ign.fr/lidar-hd") + logger.error(f" ✗ Empty file (0 points): {laz_file.name}") + logger.error(f" → Download it again from https://ign.fr/lidar-hd") return False # Verify point data is actually accessible (not just header metadata) try: for _ in f.chunk_iterator(1000): break # Read just one chunk to confirm data integrity except Exception as chunk_err: - logger.error(f" ✗ Données inaccessibles (fichier corrompu?): {laz_file.name}") - logger.error(f" Erreur: {chunk_err}") - logger.error(f" → Re-télécharger depuis https://ign.fr/lidar-hd") + logger.error(f" ✗ Point data unreadable (corrupted file?): {laz_file.name}") + logger.error(f" Error: {chunk_err}") + logger.error(f" → Download it again from https://ign.fr/lidar-hd") return False return True except Exception: @@ -1059,8 +1056,8 @@ def validate_laz(laz_file): info = _json.loads(result.stdout) count = info.get('summary', {}).get('num_points', 0) if count == 0: - logger.error(f" ✗ Fichier vide (0 points PDAL): {laz_file.name}") - logger.error(f" → Re-télécharger depuis https://ign.fr/lidar-hd") + logger.error(f" ✗ Empty file (0 points per PDAL): {laz_file.name}") + logger.error(f" → Download it again from https://ign.fr/lidar-hd") return False except Exception: pass # Can't parse — assume valid @@ -1071,17 +1068,17 @@ def validate_laz(laz_file): capture_output=True, text=True, timeout=60 ) if test_result.returncode != 0: - logger.error(f" ✗ Données inaccessibles (PDAL): {laz_file.name}") - logger.error(f" → Re-télécharger depuis https://ign.fr/lidar-hd") + logger.error(f" ✗ Point data unreadable (PDAL): {laz_file.name}") + logger.error(f" → Download it again from https://ign.fr/lidar-hd") return False except (subprocess.TimeoutExpired, FileNotFoundError): pass # Timeout — assume valid, will fail later if corrupted return True - logger.error(f" ✗ Fichier illisible: {laz_file.name}") + logger.error(f" ✗ Unreadable file: {laz_file.name}") logger.error(f" PDAL: {result.stderr.strip()[:200]}") except (subprocess.TimeoutExpired, FileNotFoundError): - logger.error(f" ✗ Impossible de vérifier le fichier: {laz_file.name}") - logger.error(f" → Re-télécharger depuis https://ign.fr/lidar-hd") + logger.error(f" ✗ Could not check the file: {laz_file.name}") + logger.error(f" → Download it again from https://ign.fr/lidar-hd") return False @@ -1113,22 +1110,22 @@ def _read_with_pdal(laz_file): ) if result.returncode != 0: - logger.warning(f" PDAL conversion échouée: {result.stderr[:200]}") + logger.warning(f" PDAL conversion failed: {result.stderr[:200]}") return None import laspy las = laspy.read(tmp_path) if len(las.points) == 0: - logger.warning(f" PDAL: conversion réussie mais 0 points") + logger.warning(f" PDAL: conversion succeeded but produced 0 points") return None return las except Exception as e: - logger.warning(f" PDAL fallback échoué: {e}") + logger.warning(f" PDAL fallback failed: {e}") return None finally: - # Toujours supprimer le LAS temporaire, même en cas d'exception - # (timeout subprocess, laspy.read échoué…) : sinon fuite de ~Go. + # Always delete the temporary LAS, even on an exception (subprocess + # timeout, failed laspy.read...): otherwise ~GB are leaked. if tmp_path: try: os.unlink(tmp_path) @@ -1139,7 +1136,9 @@ def _read_with_pdal(laz_file): def detect_ground_method(laz_file): """Detect the best ground classification method based on point cloud statistics. - Auto-selects between SMRF and CSF: + Auto-selects between IGN, SMRF and CSF: + - IGN: supplier pre-classification, chosen when >= 20 % of the points + are class 2 (ground) - SMRF: fast, robust for most natural terrain (PDAL recommended default) - CSF: cloth simulation, better for complex/urban terrain @@ -1159,34 +1158,34 @@ def detect_ground_method(laz_file): las = laspy.read(str(laz_file)) except Exception as e: logger.warning(f" laspy: {e}") - logger.info(f" → Lecture via PDAL pour auto-détection...") + logger.info(f" → Reading via PDAL for auto-detection...") las = _read_with_pdal(laz_file) if las is None: - logger.info(f" → Méthode: SMRF (défaut — lecture impossible)") + logger.info(f" → Method: SMRF (default, file unreadable)") return 'smrf' _LAST_READ.clear() - _LAST_READ[str(laz_file)] = las # réutilisé par l'extraction IGN + _LAST_READ[str(laz_file)] = las # reused by the IGN extraction total_points = len(las.points) if total_points == 0: - logger.warning(f" Nuage vide (0 points) — méthode par défaut: SMRF") + logger.warning(f" Empty point cloud (0 points), default method: SMRF") return 'smrf' - # LiDAR HD IGN : les données livrées sont pré-classifiées par le fournisseur - # (classe 2 = sol). C'est la base la plus rapide (~10 s) et de référence. - # Le MNT est ensuite complété par le retour le plus bas par cellule + - # interpolation (voir create_dtm_fast), ce qui « rattrape » les trous de la - # pré-classification (forêt dense / relief). On la préfère donc dès qu'une - # part raisonnable des points est classée sol, plutôt que de refiltrer. + # IGN LiDAR HD: the delivered data is pre-classified by the supplier + # (class 2 = ground). It is the fastest base (~10 s) and the reference. + # Holes left by the pre-classification (dense forest / relief) are then + # filled by create_dtm_fast (bounded gap filling + interpolation), so it + # is preferred as soon as a reasonable share of the points is classified + # as ground, rather than filtering again. try: cls = np.asarray(las.classification, dtype=np.int32) ground_ratio = float(np.mean(cls == 2)) except Exception: ground_ratio = 0.0 if ground_ratio >= 0.2: - logger.info(f" → Méthode: IGN (pré-classification fournisseur — " - f"{ground_ratio * 100:.1f}% de points classe 2)") + logger.info(f" → Method: IGN (supplier pre-classification, " + f"{ground_ratio * 100:.1f}% class 2 points)") return 'ign' z = np.array(las.z) @@ -1202,11 +1201,11 @@ def detect_ground_method(laz_file): single_return_count = int(np.sum(num_returns == 1)) single_return_ratio = single_return_count / total_points if total_points > 0 else 0 except AttributeError: - logger.debug(" NumberOfReturns non disponible — utilisation de la variance Z uniquement") + logger.debug(" NumberOfReturns unavailable, using Z variance only") - logger.info(f" Analyse du nuage: {total_points:,} points, " - f"ratio_retours_uniques={single_return_ratio:.2f}, " - f"écart_Z={z_std:.1f}m, amplitude_Z={z_range:.1f}m") + logger.info(f" Point cloud analysis: {total_points:,} points, " + f"single_return_ratio={single_return_ratio:.2f}, " + f"z_std={z_std:.1f}m, z_range={z_range:.1f}m") # Decision logic: # - High single-return ratio (>0.6) → urban (buildings, roads) → CSF (cloth simulation) @@ -1214,15 +1213,15 @@ def detect_ground_method(laz_file): # - Default → SMRF (fast, robust for most natural terrain) if single_return_ratio > 0.6: method = 'csf' - reason = f"ratio retours uniques={single_return_ratio:.2f} > 0.6 → milieu urbain" + reason = f"single-return ratio={single_return_ratio:.2f} > 0.6 → urban area" elif z_std > 30: method = 'csf' - reason = f"écart_Z={z_std:.1f}m > 30m → terrain complexe" + reason = f"z_std={z_std:.1f}m > 30m → complex terrain" else: method = 'smrf' - reason = f"terrain naturel standard" + reason = f"standard natural terrain" - logger.info(f" → Méthode: {method.upper()} ({reason})") + logger.info(f" → Method: {method.upper()} ({reason})") return method @@ -1230,15 +1229,15 @@ _LAST_READ = {} def _extract_ign_ground(laz_file, output_las, codes): - """Extraction directe (laspy) des classes IGN choisies vers un LAS. + """Direct extraction (laspy) of the selected IGN classes into a LAS. - Même résultat que le pipeline PDAL (filtres ReturnNumber ≥ 1, - NumberOfReturns ≥ 1, classes) mais sans relecture ni conversion : - ~4 s au lieu de ~9 s par dalle, et la lecture de la détection automatique - est réutilisée. Format de points et échelles du fichier source conservés. + Same result as the PDAL pipeline (ReturnNumber ≥ 1, NumberOfReturns ≥ 1 + and class filters) but with no re-read or conversion: ~4.9 s instead of + ~13.5 s per tile, and the read done by auto-detection is reused. Point + format, scales and offsets of the source file are preserved. Returns: - True si le fichier a été écrit avec au moins un point. + True if the file was written with at least one point. """ import laspy las = _LAST_READ.pop(str(laz_file), None) @@ -1267,9 +1266,9 @@ def classify_ground(laz_file, temp_dir, method='auto', force=False, ign_classes= temp_dir: Directory for temporary files (pipeline.json, ground.las). method: Ground classification method ('auto', 'ign', 'smrf' or 'csf'). force: If True, reclassify even if output file already exists. - ign_classes: Classes LAS extraites par la méthode IGN (noms ou codes - séparés par virgules, ex. "sol,unclassified"). Ignoré pour les - autres méthodes. + ign_classes: LAS classes extracted by the IGN method (comma-separated + names or codes, e.g. "sol,unclassified"). Ignored by the other + methods. Returns: Path to classified ground LAS file, or None on failure. @@ -1279,13 +1278,12 @@ def classify_ground(laz_file, temp_dir, method='auto', force=False, ign_classes= # Auto-detect method if requested if method == 'auto': method = detect_ground_method(laz_file) - logger.info(f" Classification sol: {method.upper()} (auto)") + logger.info(f" Ground classification: {method.upper()} (auto)") else: - logger.info(f" Classification sol: {method.upper()} (forcé)") + logger.info(f" Ground classification: {method.upper()} (forced)") - # Les classes IGN sont encodées dans le nom de fichier (ex. ign_1_2) - # pour qu'un changement de classes invalide le cache et déclenche la - # reclassification. + # The IGN classes are encoded in the file name (e.g. ign_1_2) so that a + # change of classes invalidates the cache and triggers reclassification. ign_codes = parse_ign_classes(ign_classes) if method == 'ign' else None method_label = ign_method_label(ign_codes) if ign_codes else method @@ -1294,24 +1292,24 @@ def classify_ground(laz_file, temp_dir, method='auto', force=False, ign_classes= output_las = temp_dir / f"{laz_base}_ground_{method_label}.las" if output_las.exists() and not force: - logger.info(f" Classification {method.upper()} déjà effectuée — fichier existant réutilisé") + logger.info(f" {method.upper()} classification already done, reusing the existing file") return output_las if force and output_las.exists(): - logger.info(f" Reclassification forcée — suppression de {output_las.name}") + logger.info(f" Forced reclassification, deleting {output_las.name}") output_las.unlink() - # Pré-classification IGN : extraction directe, PDAL en secours. + # IGN pre-classification: direct extraction, PDAL as a fallback. if method == 'ign': try: if _extract_ign_ground(laz_file, output_las, ign_codes or [2]): - logger.info(f" ✓ Classification sol IGN terminée (extraction directe)") + logger.info(f" ✓ IGN ground classification done (direct extraction)") return output_las - logger.warning(" Aucun point des classes IGN demandées — repli SMRF") + logger.warning(" No point in the requested IGN classes, falling back to SMRF") output_las.unlink(missing_ok=True) return _fallback_to_smrf(laz_file, temp_dir, laz_base, force, source=method_label) except Exception as e: - logger.warning(f" Extraction IGN directe impossible ({e}) — pipeline PDAL") + logger.warning(f" Direct IGN extraction failed ({e}), using the PDAL pipeline") output_las.unlink(missing_ok=True) _LAST_READ.clear() @@ -1328,25 +1326,25 @@ def classify_ground(laz_file, temp_dir, method='auto', force=False, ign_classes= ) # Verify that ground file has points if output_las.exists() and output_las.stat().st_size < 100: - logger.error(f" ✗ Fichier ground vide (taille < 100 octets)") + logger.error(f" ✗ Empty ground file (size < 100 bytes)") output_las.unlink(missing_ok=True) - # Fallback: si la méthode ne produit aucun point sol, réessayer avec SMRF + # Fallback: if the method yields no ground point, retry with SMRF if method in ('csf', 'ign'): return _fallback_to_smrf(laz_file, temp_dir, laz_base, force, source=method_label) return None - logger.info(f" ✓ Classification sol {method.upper()} terminée") + logger.info(f" ✓ {method.upper()} ground classification done") return output_las except subprocess.CalledProcessError as e: error_msg = e.stderr.decode() if e.stderr else str(e) - logger.warning(f" ✗ Erreur classification PDAL ({method.upper()}): {error_msg}") + logger.warning(f" ✗ PDAL classification error ({method.upper()}): {error_msg}") - # Fallback: si CSF ou la pré-classification échouent, réessayer avec SMRF + # Fallback: if CSF or the pre-classification fails, retry with SMRF if method in ('csf', 'ign'): return _fallback_to_smrf(laz_file, temp_dir, laz_base, force, source=method_label) # Try repairing file with laspy if PDAL fails on EVLR/VLR if 'VLR' in error_msg or 'Invalid' in error_msg: - logger.info(f" → Tentative de réparation du fichier avec laspy...") + logger.info(f" → Trying to repair the file with laspy...") repaired_las = temp_dir / f"{laz_base}_repaired.las" if _repair_laz_with_laspy(laz_file, repaired_las): # Retry PDAL pipeline with repaired file @@ -1358,13 +1356,13 @@ def classify_ground(laz_file, temp_dir, method='auto', force=False, ign_classes= ["pdal", "pipeline", str(pipeline_file)], capture_output=True, check=True ) - logger.info(f" ✓ Classification sol {method.upper()} terminée (fichier réparé)") + logger.info(f" ✓ {method.upper()} ground classification done (repaired file)") return output_las except subprocess.CalledProcessError as e2: error_msg2 = e2.stderr.decode() if e2.stderr else str(e2) - logger.error(f" ✗ Échec classification même après réparation: {error_msg2}") + logger.error(f" ✗ Classification failed even after repair: {error_msg2}") else: - logger.error(f" ✗ Impossible de réparer le fichier") + logger.error(f" ✗ Could not repair the file") return None @@ -1386,7 +1384,7 @@ def _fallback_to_smrf(laz_file, temp_dir, laz_base, force=False, source='csf'): Returns: Path to classified ground LAS file, or None on failure. """ - logger.info(f" → Basculement {source.upper()} → SMRF (fallback)") + logger.info(f" → Switching {source.upper()} → SMRF (fallback)") # Clean up failed output if it exists failed_output = temp_dir / f"{laz_base}_ground_{source}.las" @@ -1396,7 +1394,7 @@ def _fallback_to_smrf(laz_file, temp_dir, laz_base, force=False, source='csf'): output_las = temp_dir / f"{laz_base}_ground_smrf.las" if output_las.exists() and not force: - logger.info(f" Classification SMRF déjà existante — fichier réutilisé") + logger.info(f" SMRF classification already exists, reusing the file") return output_las pipeline_json = _create_ground_pipeline(laz_file, output_las, 'smrf') @@ -1411,14 +1409,14 @@ def _fallback_to_smrf(laz_file, temp_dir, laz_base, force=False, source='csf'): capture_output=True, check=True ) if output_las.exists() and output_las.stat().st_size < 100: - logger.error(f" ✗ Fichier ground SMRF vide (taille < 100 octets)") + logger.error(f" ✗ Empty SMRF ground file (size < 100 bytes)") output_las.unlink(missing_ok=True) return None - logger.info(f" ✓ Classification sol SMRF terminée (fallback depuis CSF)") + logger.info(f" ✓ SMRF ground classification done (fallback from {source.upper()})") return output_las except subprocess.CalledProcessError as e: error_msg = e.stderr.decode() if e.stderr else str(e) - logger.error(f" ✗ Échec classification SMRF (fallback): {error_msg}") + logger.error(f" ✗ SMRF classification failed (fallback): {error_msg}") return None @@ -1439,71 +1437,71 @@ def _repair_laz_with_laspy(input_laz, output_las): try: las = laspy.read(str(input_laz)) las.write(str(output_las)) - logger.info(f" ✓ Fichier réparé via laspy ({len(las.points):,} points)") + logger.info(f" ✓ File repaired via laspy ({len(las.points):,} points)") return True except Exception as e: - logger.warning(f" ✗ Réparation laspy échouée: {e}") + logger.warning(f" ✗ laspy repair failed: {e}") return False # ------------------------------------------------------------ -# Comblement des vides entre points (petits trous) +# Filling the gaps between points (small holes) # ------------------------------------------------------------ -# À 0,2 m, ~80 % des pixels ne reçoivent aucun point : le MNT est comblé entre -# les points mesurés. Un comblement « à distance fixe » (tout pixel à moins de -# 1 m d'un point) faisait grossir chaque point isolé en pastille plate de 2 m -# et extrapolait une bande de 1 m dans chaque trou (plateaux recopiés, fausses -# pentes : pastilles roses et liserés colorés dans le relief orienté). Le -# comblement est désormais borné à l'ENVELOPPE des points : fermeture -# morphologique dont le rayon suit l'espacement local des points (court en -# zone dense, long sous couvert clairsemé), puis suppression des îlots isolés. -GAP_FILL_TAG = "LIDAR_GAP_FILL" # tag GeoTIFF : version du comblement -GAP_FILL_VERSION = 3 # 1 (absent) = distance fixe 1 m ; 3 = + densité -GAP_RADIUS_K = 1.5 # rayon = K × espacement local des points -GAP_RADII_M = (1.0, 1.5, 2.0, 3.0) # paliers de rayon (m) ; 1 m mini : trous < 2 m comblés -GAP_DENSITY_WINDOW_M = 5.0 # fenêtre de mesure de la densité locale -GAP_MIN_ISLAND_M2 = 1.0 # îlots de données plus petits : supprimés +# At 0.2 m, ~80 % of the pixels receive no point: the DTM is filled between +# the measured points. A "fixed-distance" fill (every pixel within 1 m of a +# point) grew each isolated point into a flat 2 m patch and extrapolated a +# 1 m band into every hole (copied plateaus, false slopes: pink patches and +# coloured fringes in the oriented relief). The fill is now bounded to the +# ENVELOPE of the points: a morphological closing whose radius follows the +# local point spacing (short in dense areas, long under sparse cover), +# followed by removal of isolated islands. +GAP_FILL_TAG = "LIDAR_GAP_FILL" # GeoTIFF tag: gap-fill version +GAP_FILL_VERSION = 3 # 1 (absent) = fixed 1 m distance; 2 = envelope; 3 = + density file +GAP_RADIUS_K = 1.5 # radius = K × local point spacing +GAP_RADII_M = (1.0, 1.5, 2.0, 3.0) # radius steps (m); 1 m minimum: holes < 2 m filled +GAP_DENSITY_WINDOW_M = 5.0 # window for measuring the local density +GAP_MIN_ISLAND_M2 = 1.0 # smaller data islands are removed def _morph_step(mask, square, erode): - """Un pas 3×3 (carré ou croix) de dilatation/érosion binaire par tranches - numpy (~10× plus rapide que scipy.ndimage). Au bord, le voisin manquant - compte comme le pixel lui-même.""" + """One 3×3 step (square or cross) of binary dilation/erosion using numpy + slices (~10× faster than scipy.ndimage). At the border, the missing + neighbour counts as the pixel itself.""" op = np.logical_and if erode else np.logical_or out = mask.copy() op(out[1:], mask[:-1], out=out[1:]) op(out[:-1], mask[1:], out=out[:-1]) - src = out.copy() if square else mask # carré : séparable (colonnes puis lignes) + src = out.copy() if square else mask # square: separable (columns then rows) op(out[:, 1:], src[:, :-1], out=out[:, 1:]) op(out[:, :-1], src[:, 1:], out=out[:, :-1]) return out def _morph_disk(mask, radius_px, erode=False, first_step=1): - """Dilatation/érosion par un disque approché : octogone, pas carrés - (impairs) et croix (pairs) alternés. `first_step` poursuit une chaîne.""" + """Dilation/erosion by an approximate disc: an octagon, alternating square + (odd) and cross (even) steps. `first_step` continues a chain.""" for step in range(first_step, first_step + radius_px): mask = _morph_step(mask, step % 2 == 1, erode) return mask def _gap_fill_envelope(valid, resolution): - """Masque des pixels à combler ou conserver : enveloppe des points mesurés. + """Mask of the pixels to fill or keep: envelope of the measured points. - Fermeture morphologique (dilatation puis érosion) de rayon variable : les - vides ENTRE points voisins sont comblés, rien n'est étendu vers l'extérieur - (un point isolé reste un pixel). Le rayon vaut GAP_RADIUS_K × l'espacement - local des points, mesuré sur GAP_DENSITY_WINDOW_M dans la zone couverte - (le bord d'un trou ne fait pas chuter la densité), arrondi au palier - GAP_RADII_M le plus proche. Les îlots de moins de GAP_MIN_ISLAND_M2 sont - retirés (retours épars sur l'eau, dans une cour…). + Morphological closing (dilation then erosion) with a variable radius: + gaps BETWEEN neighbouring points are filled, nothing is extended outwards + (an isolated point stays one pixel). The radius is GAP_RADIUS_K × the + local point spacing, measured over GAP_DENSITY_WINDOW_M within the + covered area (the edge of a hole does not drag the density down), rounded + to the nearest GAP_RADII_M step. Islands smaller than GAP_MIN_ISLAND_M2 + are removed (sparse returns on water, in a courtyard...). """ from scipy import ndimage as nd radii_px = sorted({max(1, int(round(r / resolution))) for r in GAP_RADII_M}) r_max = radii_px[-1] - # Masque étendu en miroir : la bordure de la grille n'érode pas les - # données et ne comble pas les bandes vides. Une seule chaîne de - # dilatations sert tous les paliers (disque de rayon r = r premiers pas). + # Mask extended by mirroring: the grid border neither erodes the data nor + # fills empty bands. A single chain of dilations serves every step (disc + # of radius r = the first r steps). pad = 2 * r_max dilated = {} grown = np.pad(valid, pad, mode="symmetric") @@ -1513,9 +1511,9 @@ def _gap_fill_envelope(valid, resolution): dilated[step] = grown del grown - # Densité locale : part de pixels mesurés dans la zone couverte (points à - # moins du plus grand rayon), convertie en espacement moyen des points. - # Calcul sur une grille de ~1 m (fenêtre de 5 m : largement suffisant). + # Local density: share of measured pixels within the covered area (within + # the largest radius of a point), converted into a mean point spacing. + # Computed on a ~1 m grid (5 m window: more than enough). covered = dilated[r_max][pad:-pad, pad:-pad] h, w = valid.shape f = max(1, int(round(1.0 / resolution))) @@ -1530,10 +1528,10 @@ def _gap_fill_envelope(valid, resolution): frac = nd.uniform_filter(_block_mean(valid), win, mode="nearest") frac_cov = nd.uniform_filter(_block_mean(covered), win, mode="nearest") with np.errstate(divide="ignore", invalid="ignore"): - # rayon voulu en pixels = K × espacement / résolution + # wanted radius in pixels = K × spacing / resolution wanted = GAP_RADIUS_K / np.sqrt(frac / np.maximum(frac_cov, 1e-6)) - # Rayon voulu agrandi en bilinéaire (sinon changements de palier en - # créneaux de 1 m sur le bord des trous), puis palier le plus proche. + # Wanted radius upsampled bilinearly (otherwise step changes form 1 m + # staircases along hole edges), then rounded to the nearest step. wanted = np.nan_to_num(np.clip(wanted, 0, 2 * r_max), nan=2 * r_max) if f > 1: wanted = nd.zoom(wanted.astype(np.float32), f, order=1, grid_mode=True, @@ -1542,8 +1540,8 @@ def _gap_fill_envelope(valid, resolution): level = np.digitize(wanted, mids).astype(np.uint8) del covered, frac, frac_cov, wanted - # Érosion par palier, restreinte à l'emprise de ses pixels (les grands - # rayons ne concernent que les zones clairsemées) + # Erosion per step, restricted to the bounding box of its pixels (large + # radii only concern sparse areas) envelope = valid.copy() for i, r in enumerate(radii_px): sel = (level == i) & ~valid @@ -1553,13 +1551,13 @@ def _gap_fill_envelope(valid, resolution): cols = np.flatnonzero(sel.any(axis=0)) y0, y1 = rows[0], rows[-1] + 1 x0, x1 = cols[0], cols[-1] + 1 - m = 2 * r # marge : l'érosion au bord du découpage reste hors emprise + m = 2 * r # margin: erosion at the crop edge stays outside the box crop = dilated[r][y0 + pad - m:y1 + pad + m, x0 + pad - m:x1 + pad + m] closed = _morph_disk(crop, r, erode=True)[m:-m, m:-m] envelope[y0:y1, x0:x1] |= sel[y0:y1, x0:x1] & closed del dilated, level - # Îlots trop petits : retirés (8-connexité, surface en m²) + # Islands too small: removed (8-connectivity, area in m²) labels, n = nd.label(envelope, structure=np.ones((3, 3), dtype=bool)) if n: area = np.bincount(labels.ravel()) * resolution * resolution @@ -1571,20 +1569,20 @@ def _gap_fill_envelope(valid, resolution): def _fill_small_gaps(dtm, resolution): - """Comble les vides entre points dans l'enveloppe des données. + """Fill the gaps between points within the data envelope. Returns: - Tuple (dtm, filled_count, removed_count) : pixels comblés et pixels - mesurés retirés avec les îlots isolés. + Tuple (dtm, filled_count, removed_count): filled pixels, and measured + pixels removed along with isolated islands. """ valid = ~np.isnan(dtm) if valid.all() or not valid.any(): return dtm, 0, 0 envelope = _gap_fill_envelope(valid, resolution) from rasterio.fill import fillnodata - # Tout pixel de l'enveloppe est à moins du plus grand rayon d'un point + # Every envelope pixel lies within the largest radius of a point max_px = max(1, int(round(max(GAP_RADII_M) / resolution))) - # fillnodata écrit dans le tableau fourni : copie + # fillnodata writes into the array it is given: pass a copy filled = fillnodata(dtm.copy(), mask=valid, max_search_distance=max_px) to_fill = envelope & ~valid & ~np.isnan(filled) removed = valid & ~envelope @@ -1594,23 +1592,23 @@ def _fill_small_gaps(dtm, resolution): return out, int(to_fill.sum()), int(removed.sum()) -# Densité de points sol (couche « densite_sol ») : comptage des points retenus -# pour le MNT en mailles de DENSITY_CELL_M, moyenné sur DENSITY_SMOOTH × -# DENSITY_SMOOTH mailles (pts/m² sur 9 m² : moins de bruit de petits entiers). -# Écrite à côté du DTM (*_dtm*_density.tif) : les visualisations ne reçoivent -# que le MNT, plus les points. +# Ground point density ("densite_sol" layer): count of the points kept for +# the DTM in DENSITY_CELL_M cells, averaged over DENSITY_SMOOTH × +# DENSITY_SMOOTH cells (pts/m² over 9 m²: less small-integer noise). Written +# next to the DTM (*_dtm*_density.tif): the visualisations only receive the +# DTM, no longer the points. DENSITY_CELL_M = 1.0 DENSITY_SMOOTH = 3 def density_path(dtm_path): - """Fichier annexe de densité d'un DTM.""" + """Density companion file of a DTM.""" dtm_path = Path(dtm_path) return dtm_path.with_name(f"{dtm_path.stem}_density.tif") def _write_density(xs, ys, bounds, dtm_path): - """Écrit la densité de points sol (pts/m², GeoTIFF float32 à 1 m).""" + """Write the ground point density (pts/m², float32 GeoTIFF at 1 m).""" from scipy import ndimage as nd min_x, min_y, max_x, max_y = bounds cell = DENSITY_CELL_M @@ -1632,7 +1630,7 @@ def _write_density(xs, ys, bounds, dtm_path): def read_dtm_gap_fill(dtm_path): - """Version du comblement enregistrée dans un DTM (1 si absente/illisible).""" + """Gap-fill version recorded in a DTM (1 if absent/unreadable).""" try: with rasterio.open(dtm_path) as src: return int(src.tags().get(GAP_FILL_TAG, 1) or 1) @@ -1644,7 +1642,7 @@ def _interpolate_holes(dtm, downsample=8): """Fill remaining NaN holes with a terrain-aware surface interpolation. In complex / rocky terrain the ground under-classification leaves interior - holes far too large for a 1 m gap fill, which otherwise become flat + holes far too large for the bounded gap fill, which otherwise become flat nearest-neighbor patches in the downstream layers. This helper triangulates the valid cells on a downsampled grid (linear, nearest as a fallback for cells outside the data hull) and bilinearly upsamples the result, keeping @@ -1654,6 +1652,9 @@ def _interpolate_holes(dtm, downsample=8): dtm: 2-D float array (may contain NaN holes). downsample: Coarsening factor for the interpolation grid. + Not called by create_dtm_fast (large holes are deliberately left as + nodata there); kept as a standalone helper. + Returns: Tuple (filled_array, filled_count). """ @@ -1701,42 +1702,42 @@ def _interpolate_holes(dtm, downsample=8): # ------------------------------------------------------------ -# Raccord des bords (edge buffer avec les tuiles adjacentes) +# Edge matching (edge buffer with the adjacent tiles) # ------------------------------------------------------------ -# Les visualisations à grand noyau (openness/SVF : rayons jusqu'à 100 m, -# LRM : 15 m) tronquent leur fenêtre au bord de la dalle : les rendus -# présentent alors une bande d'artefacts à chaque changement de tuile. Avec -# edge_buffer > 0, le MNT est rastérisé sur la dalle nominale 1 km ÉTENDUE -# d'une bande de `edge_buffer` mètres remplie avec les points sol des 8 -# tuiles LAZ voisines (lecture PDAL en flux : découpe + filtre de classes). -# Les visualisations voient ainsi le terrain réel au-delà du bord, et les -# images finales sont recadrées sur la dalle exacte (cf. rendering.py). -EDGE_BUFFER_TAG = "LIDAR_EDGE_BUFFER" # tag GeoTIFF : tampon utilisé (m) +# Large-kernel visualisations (openness/SVF: radii up to 100 m, LRM: 15 m) +# truncate their window at the tile edge: renders then show a band of +# artefacts at every tile boundary. With edge_buffer > 0, the DTM is +# rasterised on the nominal 1 km tile EXTENDED by a band of `edge_buffer` +# metres filled with the ground points of the 8 neighbouring LAZ tiles +# (streamed PDAL read: crop + class filter). The visualisations thus see the +# real terrain beyond the edge, and the final images are cropped back to the +# exact tile (see rendering.py). +EDGE_BUFFER_TAG = "LIDAR_EDGE_BUFFER" # GeoTIFF tag: buffer used (m) -# Sous-dossier de input/ où sont isolées les dalles voisines téléchargées -# pour le seul raccord des bords : elles ne font pas partie du corpus de -# tuiles à rendre (les scans globaux n'énumèrent que input/ à plat). +# Subfolder of input/ where the neighbouring tiles downloaded only for edge +# matching are kept apart: they are not part of the corpus of tiles to render +# (global scans only list input/ itself, non-recursively). EDGE_NEIGHBORS_DIRNAME = "edge_neighbors" -# Décalages des 8 voisines d'une dalle (col, row) en km +# Offsets of a tile's 8 neighbours (col, row) in km _NEIGHBOR_OFFSETS = [(-1, -1), (0, -1), (1, -1), (-1, 0), (1, 0), (-1, 1), (0, 1), (1, 1)] def _tile_coords(name): - """Coordonnées (col, row) en km d'un nom de fichier LHD, ou None.""" + """(col, row) coordinates in km of an LHD file name, or None.""" from .index import parse_basename_coords return parse_basename_coords(Path(name).name) def _neighbor_laz_files(source_laz): - """Liste les 8 fichiers LAZ/LAS adjacents à `source_laz`. + """List the (up to) 8 LAZ/LAS files adjacent to `source_laz`. - Recherche dans le dossier de la source, puis dans le sous-dossier - edge_neighbors/ : les dalles voisines téléchargées pour le seul raccord - des bords y sont isolées — sinon elles s'accumulent à plat dans input/ et - chaque passe globale annexe un anneau de tuiles à rendre en plus. + Looks in the source's folder, then in its edge_neighbors/ subfolder: the + neighbouring tiles downloaded only for edge matching are kept there; + otherwise they would pile up directly in input/ and every global pass + would add an extra ring of tiles to render. """ coords = _tile_coords(source_laz) if coords is None: @@ -1747,8 +1748,8 @@ def _neighbor_laz_files(source_laz): neighbors = [] for dcol, drow in _NEIGHBOR_OFFSETS: nc, nr = col + dcol, row + drow - # Noms LHD : col/row en km sur 4 chiffres complétés (ex. 0638_6628) ; - # on accepte aussi la variante sans remplissage pour les dalles exotiques. + # LHD names: col/row in km zero-padded to 4 digits (e.g. 0638_6628); + # the unpadded variant is also accepted for unusual tiles. names = {f"LHD_FXX_{nc:04d}_{nr:04d}", f"LHD_FXX_{nc}_{nr}"} matches = [] for search_dir in search_dirs: @@ -1758,24 +1759,24 @@ def _neighbor_laz_files(source_laz): if matches: neighbors.append(sorted(matches)[0]) else: - logger.debug(f" Voisine absente : LHD_FXX_{nc:04d}_{nr:04d} (bande de bord vide)") + logger.debug(f" Missing neighbour: LHD_FXX_{nc:04d}_{nr:04d} (empty edge band)") return neighbors def _neighbor_ground_points(source_laz, bounds, classes): - """Points sol des tuiles voisines dans `bounds` (raccord des bords). + """Ground points of the neighbouring tiles within `bounds` (edge matching). - Lecture PDAL en flux par voisine : découpe sur l'emprise étendue puis - filtre de classes (mêmes codes que le MNT). Best-effort : une voisine - illisible ou absente est ignorée — la bande correspondante reste vide. + Streamed PDAL read per neighbour: crop to the extended footprint, then + class filter (same codes as the DTM). Best-effort: an unreadable or + missing neighbour is skipped and the corresponding band stays empty. Args: - source_laz: LAZ de la tuile traitée (repère pour trouver les voisines). - bounds: (min_x, min_y, max_x, max_y) de l'emprise étendue. - classes: codes LAS à extraire (ex. [2] = sol). + source_laz: LAZ of the processed tile (used to locate the neighbours). + bounds: (min_x, min_y, max_x, max_y) of the extended footprint. + classes: LAS codes to extract (e.g. [2] = ground). Returns: - (xs, ys, zs) concaténés (tableaux vides si aucune voisine). + Concatenated (xs, ys, zs) (empty arrays if there is no neighbour). """ import tempfile @@ -1817,7 +1818,7 @@ def _neighbor_ground_points(source_laz, bounds, classes): zs.append(np.asarray(las.z, dtype=np.float64)) found += 1 except Exception as e: - logger.debug(f" Voisine {Path(neighbor).name} ignorée : {e}") + logger.debug(f" Neighbour {Path(neighbor).name} skipped: {e}") finally: if tmp_path: try: @@ -1826,15 +1827,15 @@ def _neighbor_ground_points(source_laz, bounds, classes): pass if not found: - logger.warning(" Aucune voisine lisible — bande de bord vide") + logger.warning(" No readable neighbour, edge band left empty") return (np.empty(0),) * 3 - logger.info(f" Raccord bords : {found} voisine(s), " - f"{sum(len(a) for a in xs):,} pts sol") + logger.info(f" Edge matching: {found} neighbour(s), " + f"{sum(len(a) for a in xs):,} ground pts") return np.concatenate(xs), np.concatenate(ys), np.concatenate(zs) def read_dtm_edge_buffer(dtm_path): - """Tampon de raccord enregistré dans un DTM (m ; 0 si absent/illisible).""" + """Edge buffer recorded in a DTM (m; 0 if absent/unreadable).""" try: with rasterio.open(dtm_path) as src: tags = src.tags() @@ -1856,26 +1857,30 @@ def create_dtm_fast(las_file, basename, dtm_dir, resolution, force=False, resolution: Grid resolution in meters per pixel. force: If True, regenerate even if DTM already exists. output_suffix: Suffix for output filename (e.g. '_r0p2' for additional resolutions). - source_laz: Optionnel : LAZ complet de la tuile traitée (repère pour - lire les 8 tuiles voisines du raccord de bords, cf. edge_buffer). - pure: Sans effet (conservé pour compatibilité). Fonctionnement - historique rétabli : petits trous comblés par fillnodata, grands - trous laissés en nodata (rendus en noir dans les rendus). - strip_align: Si True (défaut), mesure et corrige les écarts verticaux - entre faisceaux de vol (PointSourceId) avant rastérisation : offsets - constants ≥ STRIP_ALIGN_THRESHOLD (0,5 cm) puis gigue intra-faisceau - par fenêtres de temps GPS ; tout est consigné dans un sidecar - *_dtm*_stripalign.json. - edge_buffer: Raccord des bords en mètres (0 = désactivé). Le MNT couvre - alors la dalle nominale 1 km étendue de cette bande, remplie avec - les points sol des 8 tuiles LAZ voisines (source_laz requis) ; les - visualisations calculent sur l'emprise étendue puis les images sont - recadrées sur la dalle exacte (rendering.py). Le tampon est inscrit - dans le tag GeoTIFF LIDAR_EDGE_BUFFER pour l'invalidation du cache. - neighbor_classes: codes LAS extraits chez les voisines (défaut : les - classes IGN du MNT, ex. [2]). Les voisines sont lues dans leur - pré-classification fournisseur, même si la tuile centrale est - classée SMRF/CSF (bande de contexte, quelques cm d'écart au pire). + source_laz: Optional: full LAZ of the processed tile (used to read + the 8 neighbouring tiles for edge matching, see edge_buffer). + pure: No effect (kept for compatibility). Gaps between points are + filled within the data envelope (_fill_small_gaps); large holes + stay nodata (rendered as no-data in the outputs). + strip_align: If True (default), measure and correct the vertical + offsets between flight strips (PointSourceId) before + rasterisation: constant offsets ≥ STRIP_ALIGN_THRESHOLD (0.5 cm), + then GPS time-window jitter (only when scan_angle is missing), + then the line-by-line joint adjustment (gps_time and scan_angle + required); everything is recorded in a *_dtm*_stripalign.json + sidecar. + edge_buffer: Edge buffer in metres (0 = disabled). The DTM then covers + the nominal 1 km tile extended by this band, filled with the + ground points of the 8 neighbouring LAZ tiles (source_laz + required); the visualisations compute on the extended footprint, + then the images are cropped back to the exact tile + (rendering.py). The buffer is written to the LIDAR_EDGE_BUFFER + GeoTIFF tag for cache invalidation. + neighbor_classes: LAS codes extracted from the neighbours (default + [2]; the pipeline passes the DTM's IGN classes). Neighbours are + read with their supplier pre-classification, even when the + central tile is classified with SMRF/CSF (context band, a few cm + of deviation at worst). Returns: Path to output DTM GeoTIFF, or None on failure. @@ -1883,33 +1888,33 @@ def create_dtm_fast(las_file, basename, dtm_dir, resolution, force=False, output_tif = dtm_dir / f"{basename}_dtm{output_suffix}.tif" if output_tif.exists() and not force: - logger.info(f" DTM déjà existant — fichier réutilisé: {output_tif.name}") + logger.info(f" DTM already exists, reusing the file: {output_tif.name}") return output_tif import laspy - logger.info(" → Génération DTM...") + logger.info(" → Generating DTM...") try: t_read = time.perf_counter() las = laspy.read(str(las_file)) - logger.info(f" Lecture {len(las.points):,} points " + logger.info(f" Read {len(las.points):,} points " f"({time.perf_counter() - t_read:.1f}s)") except Exception as e: # laspy can't read COPC v1.1 — try PDAL conversion logger.warning(f" laspy: {e}") - logger.info(f" → Conversion via PDAL pour lecture COPC...") + logger.info(f" → Converting via PDAL to read COPC...") las = _read_with_pdal(las_file) if las is None: - logger.error(f" ✗ Impossible de lire {las_file.name}") + logger.error(f" ✗ Could not read {las_file.name}") return None if len(las.points) == 0: - logger.error(f" ✗ Fichier vide (0 points): {las_file.name}") + logger.error(f" ✗ Empty file (0 points): {las_file.name}") return None - # Calage vertical des faisceaux de vol avant rastérisation : best-effort, - # en cas d'échec de la mesure on continue non calé (jamais d'abort). + # Vertical alignment of the flight strips before rasterisation: + # best-effort, if the measurement fails we carry on unaligned (never abort). strip_offsets = {} strip_jitter = {} gps_time = None @@ -1918,37 +1923,37 @@ def create_dtm_fast(las_file, basename, dtm_dir, resolution, force=False, try: strip_offsets = _strip_offsets_for_file(las_file, las) except Exception as e: - logger.warning(f" Mesure du calage faisceaux impossible ({e}) — MNT non calé") + logger.warning(f" Strip alignment measurement failed ({e}), DTM left unaligned") strip_offsets = {} if strip_offsets: - logger.info(" Calage faisceaux : " + ", ".join( + logger.info(" Strip alignment: " + ", ".join( f"PSID {p} {off:+.3f} m" for p, off in sorted(strip_offsets.items()))) else: - logger.debug(" Calage faisceaux : aucun écart >= " - f"{STRIP_ALIGN_THRESHOLD * 100:.1f} cm, rien à corriger") - # 2ᵉ passe : gigue intra-faisceau (temps GPS requis, ignorée sinon). + logger.debug(" Strip alignment: no offset >= " + f"{STRIP_ALIGN_THRESHOLD * 100:.1f} cm, nothing to correct") + # 2nd pass: intra-strip jitter (GPS time required, skipped otherwise). try: gps_time = np.asarray(las.gps_time, dtype=np.float64) except AttributeError: gps_time = None - # L'ajustement conjoint ligne à ligne (3ᵉ passe) recale déjà chaque - # ligne contre les autres faisceaux, à toutes les échelles : la gigue - # par fenêtres de temps n'est calculée que si scan_angle manque. + # The line-by-line joint adjustment (3rd pass) already re-aligns every + # line against the other strips, at every scale: time-window jitter + # is only computed when scan_angle is missing. lines_possible = _scan_angle(las) is not None if gps_time is not None and len(gps_time) == len(las.points) and not lines_possible: try: strip_jitter = _strip_jitter_for_file(las_file, las, strip_offsets) except Exception as e: - logger.warning(f" Mesure de la gigue intra-faisceau impossible ({e}) — gigue non corrigée") + logger.warning(f" Intra-strip jitter measurement failed ({e}), jitter left uncorrected") strip_jitter = {} if strip_jitter: for p_, (jt, jc) in sorted(strip_jitter.items()): - logger.info(f" Gigue PSID {p_} : ±{np.max(np.abs(jc)) * 100:.1f} cm " + logger.info(f" Jitter PSID {p_}: ±{np.max(np.abs(jc)) * 100:.1f} cm " f"(rms {np.sqrt(np.mean(np.asarray(jc) ** 2)) * 100:.1f} cm, " - f"{len(jt)} fenêtres de {STRIP_JITTER_BIN:g} s)") + f"{len(jt)} windows of {STRIP_JITTER_BIN:g} s)") else: - logger.debug(" Gigue intra-faisceau : rien à corriger") - logger.info(f" Calage faisceaux : {time.perf_counter() - t_align:.1f}s") + logger.debug(" Intra-strip jitter: nothing to correct") + logger.info(f" Strip alignment: {time.perf_counter() - t_align:.1f}s") try: @@ -1958,9 +1963,9 @@ def create_dtm_fast(las_file, basename, dtm_dir, resolution, force=False, width = int(np.ceil((max_x - min_x) / resolution)) height = int(np.ceil((max_y - min_y) / resolution)) - # Raccord des bords : emprise = dalle nominale 1 km (alignée sur la - # grille multi-tuiles) + bande de edge_buffer mètres remplie par les - # points sol des voisines. Sinon : bornes de l'en-tête (historique). + # Edge matching: footprint = nominal 1 km tile (aligned on the + # multi-tile grid) + a band of edge_buffer metres filled with the + # neighbours' ground points. Otherwise: header bounds (historical). used_edge_buffer = 0.0 if edge_buffer > 0: coords = _tile_coords(source_laz or las_file) @@ -1968,8 +1973,8 @@ def create_dtm_fast(las_file, basename, dtm_dir, resolution, force=False, buffer_px = max(1, int(round(edge_buffer / resolution))) buffer_m = buffer_px * resolution col_km, row_km = coords - # Grille LHD : (col, row) = coin nord-ouest en km → - # X ∈ [col, col+1] km, Y ∈ [row-1, row] km (bord nord = row). + # LHD grid: (col, row) = north-west corner in km → + # X ∈ [col, col+1] km, Y ∈ [row-1, row] km (north edge = row). min_x = float(col_km) * 1000.0 max_x = min_x + 1000.0 max_y = float(row_km) * 1000.0 @@ -1981,12 +1986,12 @@ def create_dtm_fast(las_file, basename, dtm_dir, resolution, force=False, min_x, min_y, max_x, max_y = ext_bounds used_edge_buffer = float(edge_buffer) else: - logger.warning(" Raccord des bords impossible : nom de " - f"fichier non LHD ({basename}) — tuile seule") + logger.warning(" Edge matching impossible: not an LHD " + f"file name ({basename}), tile alone") logger.debug(f" Bounds: X[{min_x:.1f}, {max_x:.1f}] Y[{min_y:.1f}, {max_y:.1f}]") logger.debug(f" Grid: {width}x{height} pixels ({len(las.points):,} points)") - logger.info(f" Rasterisation {width}x{height} ({len(las.points):,} points)...") + logger.info(f" Rasterising {width}x{height} ({len(las.points):,} points)...") xs = np.asarray(las.x, dtype=np.float64) ys = np.asarray(las.y, dtype=np.float64) @@ -1998,7 +2003,7 @@ def create_dtm_fast(las_file, basename, dtm_dir, resolution, force=False, zs = zs - lut[np.asarray(las.point_source_id, dtype=np.int64)] if strip_jitter and gps_time is not None: zs = zs - _apply_strip_jitter(las.point_source_id, gps_time, strip_jitter) - # 3ᵉ passe : décalage ligne à ligne (après les deux premières). + # 3rd pass: line-by-line offset (after the first two). strip_lines = {} if strip_align and gps_time is not None and len(gps_time) == len(zs): t_lines = time.perf_counter() @@ -2006,42 +2011,42 @@ def create_dtm_fast(las_file, basename, dtm_dir, resolution, force=False, line_corr, strip_lines = _scan_lines_for_file(las_file, las, zs, gps_time) zs = zs - line_corr except Exception as e: - logger.warning(f" Mesure du décalage ligne à ligne impossible ({e}) — non corrigé") + logger.warning(f" Line-by-line offset measurement failed ({e}), left uncorrected") strip_lines = {} for p_, (nl_, rms_, max_) in sorted(strip_lines.items()): - logger.info(f" Lignes PSID {p_} : rms {rms_ * 100:.1f} cm, max {max_ * 100:.1f} cm " - f"({nl_} lignes)") - logger.info(f" Décalage ligne à ligne : {time.perf_counter() - t_lines:.1f}s") + logger.info(f" Lines PSID {p_}: rms {rms_ * 100:.1f} cm, max {max_ * 100:.1f} cm " + f"({nl_} lines)") + logger.info(f" Line-by-line offset: {time.perf_counter() - t_lines:.1f}s") - # Points sol des tuiles voisines dans la bande de raccord (best-effort, - # non calés par faisceau : bande de contexte, l'image finale est - # recadrée sur la dalle avant livraison). + # Ground points of the neighbouring tiles in the edge band + # (best-effort, not strip-aligned: context band, the final image is + # cropped to the tile before delivery). if used_edge_buffer > 0 and source_laz is not None: t_neigh = time.perf_counter() nx, ny, nz = _neighbor_ground_points( source_laz, (min_x, min_y, max_x, max_y), neighbor_classes if neighbor_classes is not None else [2]) - logger.info(f" Voisines (raccord) : {len(nx):,} points " + logger.info(f" Neighbours (edge matching): {len(nx):,} points " f"({time.perf_counter() - t_neigh:.1f}s)") if len(nx): xs = np.concatenate([xs, nx]) ys = np.concatenate([ys, ny]) zs = np.concatenate([zs, nz]) - # Densité des points sol retenus (couche densite_sol), best-effort + # Density of the kept ground points (densite_sol layer), best-effort try: _write_density(xs, ys, (min_x, min_y, max_x, max_y), dtm_dir / f"{basename}_dtm{output_suffix}.tif") except Exception as e: - logger.warning(f" Densité de points non écrite ({e})") + logger.warning(f" Point density not written ({e})") t_raster = time.perf_counter() dtm = bin_mean_2d(xs, ys, zs, width, height, (min_x, max_x), (min_y, max_y)) if dtm is not None: - # Sortie déjà en (height, width) : seul le flip Y reste à faire - dtm = dtm[::-1, :] # nord en haut - logger.info(f" ✓ Rasterisation {width}x{height} GPU " + # Output already (height, width): only the Y flip is left + dtm = dtm[::-1, :] # north at the top + logger.info(f" ✓ Rasterised {width}x{height} GPU " f"({time.perf_counter() - t_raster:.1f}s)") else: stat = binned_statistic_2d( @@ -2052,27 +2057,25 @@ def create_dtm_fast(las_file, basename, dtm_dir, resolution, force=False, ) dtm = stat.statistic.T dtm = dtm[::-1, :] # Flip Y so north is at top - logger.info(f" ✓ Rasterisation {width}x{height} CPU " + logger.info(f" ✓ Rasterised {width}x{height} CPU " f"({time.perf_counter() - t_raster:.1f}s)") - # Comblement « historique » (fonctionnement d'origine, rétabli) : - # seuls les petits trous proches des données sont remplis ; les grands - # trous restent en nodata et apparaissent en noir dans les rendus. - # Volontairement PAS de plancher au retour le plus bas : sous canopée - # dense ce retour est la végétation, qui imprimerait les arbres dans - # le MNT. + # Only small holes close to the data are filled; large holes stay + # nodata in the renders. Deliberately NO lowest-return floor: under + # dense canopy that return is vegetation, which would imprint the + # trees into the DTM. - # Vides entre points comblés dans l'enveloppe des données (rayon - # adapté à la densité locale), îlots isolés retirés + # Gaps between points filled within the data envelope (radius adapted + # to the local density), isolated islands removed nan_count = np.count_nonzero(np.isnan(dtm)) if nan_count > 0: total = dtm.size nan_pct = 100.0 * nan_count / total - logger.info(f" {nan_count:,} pixels sans données ({nan_pct:.1f}%)") + logger.info(f" {nan_count:,} pixels without data ({nan_pct:.1f}%)") t_fill = time.perf_counter() dtm, filled_count, removed_count = _fill_small_gaps(dtm, resolution) - logger.info(f" {filled_count:,} pixels comblés entre points, " - f"{removed_count:,} pixels d'îlots isolés retirés " + logger.info(f" {filled_count:,} pixels filled between points, " + f"{removed_count:,} isolated-island pixels removed " f"({time.perf_counter() - t_fill:.1f}s)") # Save as GeoTIFF @@ -2089,21 +2092,21 @@ def create_dtm_fast(las_file, basename, dtm_dir, resolution, force=False, compress='lzw' ) as dst: dst.write(dtm.astype('float32'), 1) - # Version du comblement : un DTM d'une version antérieure est - # régénéré (pastilles et liserés de l'ancien comblement). + # Gap-fill version: a DTM from an earlier version is regenerated + # (patches and fringes of the old gap fill). dst.update_tags(**{GAP_FILL_TAG: str(GAP_FILL_VERSION)}) if used_edge_buffer > 0: - # Tampon de raccord inscrit dans le fichier : changement de - # --edge-buffer ⇒ invalidation automatique du cache DTM. + # Edge buffer written into the file: changing --edge-buffer + # ⇒ automatic invalidation of the DTM cache. dst.update_tags(**{EDGE_BUFFER_TAG: f"{used_edge_buffer:g}"}) - logger.info(f" Écriture GeoTIFF : {time.perf_counter() - t_write:.1f}s") + logger.info(f" GeoTIFF write: {time.perf_counter() - t_write:.1f}s") if strip_align: _write_strip_align_sidecar(dtm_dir, basename, output_suffix, strip_offsets, strip_jitter, strip_lines) - logger.info(f" ✓ DTM créé: {output_tif.name}") + logger.info(f" ✓ DTM created: {output_tif.name}") return output_tif except Exception as e: - logger.error(f" ✗ Erreur DTM: {e}", exc_info=True) + logger.error(f" ✗ DTM error: {e}", exc_info=True) return None \ No newline at end of file diff --git a/lidar_pipeline/export_pdf.py b/lidar_pipeline/export_pdf.py index 709c1f6..5c5e084 100644 --- a/lidar_pipeline/export_pdf.py +++ b/lidar_pipeline/export_pdf.py @@ -1,9 +1,9 @@ -"""Export PDF d'une zone : planche d'impression terrain du relief orienté. +"""PDF export of an area: printable field sheet of the oriented relief. -Composée directement en Lambert 93 depuis les sources de la pyramide -(tiles.py) — échelle exacte, quadrillage aligné sur les dalles — puis -dessinée avec reportlab (texte, grille et légende vectoriels). Tourne dans -l'image légère : Pillow + pyproj + reportlab, sans numpy. +Composed directly in Lambert 93 from the pyramid sources (tiles.py) — exact +scale, grid aligned on the tiles — then drawn with reportlab (vector text, +grid and legend). Runs in the lightweight image: Pillow + pyproj + +reportlab, without numpy. """ import logging @@ -14,20 +14,21 @@ logger = logging.getLogger("lidar") LAYER = "relief_oriente" PAPERS_MM = {"A4": (210.0, 297.0), "A3": (297.0, 420.0)} -ORIENTS = ("portrait", "paysage") +ORIENTS = ("portrait", "paysage") # API values ("paysage" = landscape) +_ORIENT_LABELS = {"portrait": "portrait", "paysage": "landscape"} SCALES = (1000, 2000, 5000, 10000) -DPI = {"A4": 300, "A3": 250} # borne la mémoire du Pi (~36 Mo en A3) +DPI = {"A4": 300, "A3": 250} # bounds the Pi's memory (~36 MB in A3) NATIVE_RES_M = 0.2 -MARGIN_MM = 10.0 # bord non imprimable -ANNOT_MM = 7.0 # bande des coordonnées autour de la carte -PANEL_SIDE_MM = 64.0 # bandeau à droite (paysage) -PANEL_BOTTOM_MM = 72.0 # bandeau en bas (portrait) +MARGIN_MM = 10.0 # non-printable edge +ANNOT_MM = 7.0 # coordinate band around the map +PANEL_SIDE_MM = 64.0 # side panel on the right (landscape) +PANEL_BOTTOM_MM = 72.0 # bottom panel (portrait) _GRID_STEPS = {1000: 100, 2000: 100, 5000: 500, 10000: 1000} @dataclass(frozen=True) class Layout: - """Géométrie de la planche, en mm, origine en bas à gauche (reportlab).""" + """Sheet geometry, in mm, origin at the bottom left (reportlab).""" paper: str orient: str scale: int @@ -45,18 +46,18 @@ class Layout: def layout(paper, orient, scale): - """Géométrie d'une planche ; ValueError si un réglage est invalide.""" + """Geometry of a sheet; ValueError if a setting is invalid.""" if paper not in PAPERS_MM: - raise ValueError(f"format inconnu : {paper} (A4 ou A3)") + raise ValueError(f"unknown paper size: {paper} (A4 or A3)") if orient not in ORIENTS: - raise ValueError(f"orientation inconnue : {orient} (portrait ou paysage)") + raise ValueError(f"unknown orientation: {orient} (portrait or paysage)") try: scale = int(scale) except (TypeError, ValueError): - raise ValueError(f"échelle invalide : {scale}") from None + raise ValueError(f"invalid scale: {scale}") from None if scale not in SCALES: - raise ValueError("échelle non proposée : 1:" + str(scale) - + " (1:1000, 1:2000, 1:5000 ou 1:10000)") + raise ValueError("scale not offered: 1:" + str(scale) + + " (1:1000, 1:2000, 1:5000 or 1:10000)") w, h = PAPERS_MM[paper] if orient == "paysage": w, h = h, w @@ -73,31 +74,31 @@ def layout(paper, orient, scale): def center_l93(lat, lon): - """Centre WGS84 → Lambert 93 ; ValueError si non fini.""" + """WGS84 center → Lambert 93; ValueError if not finite.""" from .tiles import wgs84_to_l93 lat, lon = float(lat), float(lon) if not (math.isfinite(lat) and math.isfinite(lon)): - raise ValueError("coordonnées du centre invalides") + raise ValueError("invalid center coordinates") cx, cy = wgs84_to_l93(lon, lat) if not (math.isfinite(cx) and math.isfinite(cy)): - raise ValueError("centre hors du domaine Lambert 93") + raise ValueError("center outside the Lambert 93 domain") return cx, cy def map_bbox(cx, cy, lay): - """Emprise terrain L93 de la zone carte (papier × échelle).""" + """L93 ground footprint of the map area (paper × scale).""" half_w = lay.map_w / 1000.0 * lay.scale / 2 half_h = lay.map_h / 1000.0 * lay.scale / 2 return (cx - half_w, cy - half_h, cx + half_w, cy + half_h) def pixel_size(lay): - """Taille terrain d'un pixel imprimé (m), jamais plus fine que le natif.""" + """Ground size of a printed pixel (m), never finer than the native resolution.""" return max(NATIVE_RES_M, lay.scale * 0.0254 / lay.dpi) def grid_step(scale): - """Pas du quadrillage L93 (m) selon l'échelle.""" + """L93 grid spacing (m) for the scale.""" return _GRID_STEPS[int(scale)] @@ -108,7 +109,7 @@ def _to_wgs84(x, y): def frame(lat, lon, paper, orient, scale): - """Cadre imprimable pour la carte : emprise L93 et coins WGS84 (NO, NE, SE, SO).""" + """Printable frame for the map: L93 footprint and WGS84 corners (NW, NE, SE, SW).""" lay = layout(paper, orient, scale) cx, cy = center_l93(lat, lon) b = map_bbox(cx, cy, lay) @@ -119,16 +120,16 @@ def frame(lat, lon, paper, orient, scale): "width_m": round(b[2] - b[0]), "height_m": round(b[3] - b[1])} -# Couleur des pixels sans donnée du relief orienté (recopie de -# visualizations.RELIEF_NODATA_RGB : ce module importe numpy, absent de -# l'image légère ; égalité vérifiée par les tests). +# Color of the oriented relief's no-data pixels (copy of +# visualizations.RELIEF_NODATA_RGB: that module imports numpy, absent from +# the lightweight image; equality checked by the tests). NODATA_RGB = (38, 38, 41) -_NODATA_TOLERANCE = 3 # écart par canal toléré (rééchantillonnage) +_NODATA_TOLERANCE = 3 # tolerated per-channel difference (resampling) _HATCH_STEP_PX = 14 def _paste_l93(canvas, mask, src, bbox, px): - """Recadre et rééchantillonne une source L93 dans l'image de la planche.""" + """Crop and resample an L93 source into the sheet image.""" from PIL import Image, ImageChops from . import tiles @@ -165,7 +166,7 @@ def _paste_l93(canvas, mask, src, bbox, px): def _hatch(size): - """Motif blanc à hachures grises (zones sans donnée).""" + """White pattern with gray hatching (areas without data).""" from PIL import Image, ImageDraw w, h = size pat = Image.new("RGB", size, (255, 255, 255)) @@ -176,8 +177,8 @@ def _hatch(size): def compose_l93(output_dir, bbox, px_size, layer=LAYER): - """Image RGB de l'emprise L93 à px_size m/px, masque des pixels peints et - dalles contributrices. Hors données : blanc hachuré.""" + """RGB image of the L93 footprint at px_size m/px, mask of the painted + pixels and contributing tiles. Outside the data: hatched white.""" from PIL import Image, ImageOps from . import tiles @@ -196,18 +197,18 @@ def compose_l93(output_dir, bbox, px_size, layer=LAYER): ROSE_L = 64.0 ROSE_CHROMA = 60.0 # = visualizations.RELIEF_CHROMA -# Classes de densité de points sol (pts/m²) : rouge = donnée faible. +# Ground point density classes (pts/m²): red = weak data. DENSITY_CLASSES = [ - (0.0, "moins de 1", "#d7301f"), - (1.0, "1 à 3", "#fc8d59"), - (3.0, "3 à 6", "#fdcc8a"), - (6.0, "6 à 10", "#a1d99b"), - (10.0, "10 et plus", "#31a354"), + (0.0, "under 1", "#d7301f"), + (1.0, "1 to 3", "#fc8d59"), + (3.0, "3 to 6", "#fdcc8a"), + (6.0, "6 to 10", "#a1d99b"), + (10.0, "10 and over", "#31a354"), ] def lab_to_rgb(L, a, b): - """CIELAB (D65) → sRGB 8 bits, même formule que la carte (labToRgb).""" + """CIELAB (D65) → 8-bit sRGB, same formula as the map (labToRgb).""" fy = (L + 16) / 116 fx, fz = fy + a / 500, fy - b / 200 @@ -226,14 +227,14 @@ def lab_to_rgb(L, a, b): def rose_color(compass_deg): - """Couleur d'une orientation de pente (0 = N, sens horaire), comme la rose de la carte.""" + """Color of a slope orientation (0 = N, clockwise), like the map's rose.""" chroma = ROSE_CHROMA * min(1.0, ROSE_L * (100 - ROSE_L) / 2500) h = math.radians((compass_deg + 90) % 360) return lab_to_rgb(ROSE_L, chroma * math.cos(h), chroma * math.sin(h)) def density_color(v): - """Couleur de classe d'une densité sol (pts/m²).""" + """Class color of a ground density (pts/m²).""" color = DENSITY_CLASSES[0][2] for low, _label, c in DENSITY_CLASSES: if v >= low: @@ -242,19 +243,19 @@ def density_color(v): def _pdf_text(s): - """Texte encodable par les polices standard (WinAnsi/cp1252).""" + """Text encodable by the standard fonts (WinAnsi/cp1252).""" return "".join(ch if ch.encode("cp1252", "ignore") else "?" for ch in str(s)) def _cells_of_bbox(bbox): - """Dalles LHD 1 km intersectant une emprise L93.""" + """1 km LHD tiles intersecting an L93 footprint.""" c0, c1 = int(math.floor(bbox[0] / 1000)), int(math.ceil(bbox[2] / 1000)) r0, r1 = int(math.floor(bbox[1] / 1000)) + 1, int(math.ceil(bbox[3] / 1000)) return [(c, r) for c in range(c0, c1) for r in range(r1, r0 - 1, -1)] def zone_quality(bbox, table, cells_with_relief): - """Agrège la qualité des dalles sur une emprise (pondérée par la surface).""" + """Aggregate the tile quality over a footprint (area-weighted).""" from .index import parse_basename_coords from .quality import DENSITY_CELL_M @@ -308,7 +309,7 @@ def zone_quality(bbox, table, cells_with_relief): class NoDataError(Exception): - """Aucune dalle du relief orienté dans l'emprise demandée.""" + """No oriented-relief tile in the requested footprint.""" _JPEG_QUALITY = 90 @@ -316,7 +317,7 @@ _SCALEBAR_STEPS = (10, 20, 25, 50, 100, 200, 250, 500, 1000, 2000) def _fmt_int(n): - return f"{int(n):,}".replace(",", " ") + return f"{int(n):,}" def _hex(rgb): @@ -324,23 +325,22 @@ def _hex(rgb): def _convergence_deg(cx, cy): - """Convergence du méridien : azimut (°) du nord du quadrillage L93 mesuré - depuis le nord géographique (sens horaire), positif à l'est du méridien - central (3°E).""" + """Meridian convergence: azimuth (°) of L93 grid north measured from true + north (clockwise), positive east of the central meridian (3°E).""" lat0, lon0 = _to_wgs84(cx, cy) lat1, lon1 = _to_wgs84(cx, cy + 100.0) return math.degrees(math.atan2((lon1 - lon0) * math.cos(math.radians(lat0)), lat1 - lat0)) def _north_arrow_angle(cx, cy): - """Angle de rotation reportlab (sens antihoraire, `Canvas.rotate`) pour que - la flèche du nord — dessinée vers le haut, c'est-à-dire vers le nord du - quadrillage — pointe vers le nord géographique.""" + """reportlab rotation angle (counter-clockwise, `Canvas.rotate`) so that + the north arrow — drawn pointing up, i.e. towards grid north — points to + true north.""" return _convergence_deg(cx, cy) def _wrap_text(c, text, font, size, max_width, sep=" "): - """Découpe `text` sur `sep` en lignes tenant chacune dans `max_width` (pt).""" + """Split `text` on `sep` into lines that each fit in `max_width` (pt).""" parts = text.split(sep) lines, cur = [], parts[0] for part in parts[1:]: @@ -355,8 +355,8 @@ def _wrap_text(c, text, font, size, max_width, sep=" "): def _fit_title(c, text, font, size, max_width, min_size=7.0): - """Réduit la taille de police jusqu'à `min_size` puis tronque avec des - points de suspension pour tenir `text` dans `max_width` (pt).""" + """Shrink the font size down to `min_size`, then truncate with an + ellipsis so that `text` fits in `max_width` (pt).""" while size > min_size and c.stringWidth(text, font, size) > max_width: size -= 0.5 if c.stringWidth(text, font, size) > max_width: @@ -366,17 +366,18 @@ def _fit_title(c, text, font, size, max_width, min_size=7.0): return text, size -_ARROW_COLUMN_MM = 16.0 # largeur (mm) réservée à la flèche du nord + son "N", coin haut droit +_ARROW_COLUMN_MM = 16.0 # width (mm) reserved for the north arrow + its "N", top-right corner def _cartouche_text_max_width(w, mm): - """Largeur (pt) disponible pour le titre/sous-titre de la cartouche, hors - colonne réservée à la flèche du nord (coin haut droit du bloc, même ligne).""" + """Width (pt) available for the title block's title/subtitle, excluding + the column reserved for the north arrow (top-right corner of the block, + same line).""" return max(0.0, w - _ARROW_COLUMN_MM) * mm def _draw_hatch(c, x, y, w, h, mm, step=3.0): - """Hachures grises sur fond blanc (maille sans donnée), comme sur la carte.""" + """Gray hatching on a white background (cell without data), as on the map.""" from reportlab.lib.colors import Color, white if w <= 0 or h <= 0: return @@ -394,7 +395,7 @@ def _draw_hatch(c, x, y, w, h, mm, step=3.0): def _panel_boxes(lay): - """Rectangles (x, y, w, h) mm du bandeau : légende, qualité, cartouche.""" + """Panel rectangles (x, y, w, h) in mm: legend, quality, title block.""" gap = 4.0 if lay.orient == "paysage": h = (lay.panel_h - 2 * gap) / 3 @@ -408,7 +409,7 @@ def _panel_boxes(lay): def _draw_grid(c, lay, bbox, mm): - """Quadrillage L93 + valeurs en marge + coins WGS84.""" + """L93 grid + values in the margin + WGS84 corners.""" from reportlab.lib.colors import black step = grid_step(lay.scale) sx = lay.map_w / (bbox[2] - bbox[0]) @@ -420,7 +421,7 @@ def _draw_grid(c, lay, bbox, mm): while x <= bbox[2]: px = (lay.map_x + (x - bbox[0]) * sx) * mm c.line(px, lay.map_y * mm, px, (lay.map_y + lay.map_h) * mm) - label = f"{x / 1000:.3f}".replace(".", ",") + label = f"{x / 1000:.3f}" c.drawCentredString(px, (lay.map_y - 3.2) * mm, label) c.drawCentredString(px, (lay.map_y + lay.map_h + 1.4) * mm, label) x += step @@ -428,7 +429,7 @@ def _draw_grid(c, lay, bbox, mm): while y <= bbox[3]: py = (lay.map_y + (y - bbox[1]) * sy) * mm c.line(lay.map_x * mm, py, (lay.map_x + lay.map_w) * mm, py) - label = f"{y / 1000:.3f}".replace(".", ",") + label = f"{y / 1000:.3f}" c.saveState(); c.translate((lay.map_x - 1.4) * mm, py); c.rotate(90) c.drawCentredString(0, 0, label); c.restoreState() c.saveState(); c.translate((lay.map_x + lay.map_w + 3.2) * mm, py); c.rotate(90) @@ -442,22 +443,22 @@ def _draw_grid(c, lay, bbox, mm): ((bbox[0], bbox[1]), (lay.map_x, lay.map_y - 6.2, "l")), ((bbox[2], bbox[1]), (lay.map_x + lay.map_w, lay.map_y - 6.2, "r"))): lat, lon = _to_wgs84(gx, gy) - hemi = "E" if lon >= 0 else "O" + hemi = "E" if lon >= 0 else "W" txt = f"{lat:.5f} N {abs(lon):.5f} {hemi}" (c.drawString if align == "l" else c.drawRightString)(px * mm, py * mm, txt) c.setFont("Helvetica", 5.5) c.drawString(lay.map_x * mm, (lay.map_y + lay.map_h + 6.2) * mm, - _pdf_text(f"Quadrillage Lambert 93 (km), pas {_fmt_int(step)} m - coins en WGS84")) + _pdf_text(f"Lambert 93 grid (km), {_fmt_int(step)} m spacing - corners in WGS84")) def _draw_legend(c, box, mm): - """Barre de clarté + rose des orientations + texte de VIZ_LEGENDS.""" + """Lightness bar + orientation rose + text from VIZ_LEGENDS.""" from reportlab.lib.colors import HexColor, black, white from .index import VIZ_LEGENDS x, y, w, h = box c.setFillColor(black); c.setFont("Helvetica-Bold", 8) - c.drawString(x * mm, (y + h - 4) * mm, _pdf_text("Légende - relief orienté")) - # Barre de clarté (L* 20 → 90, gris neutre) + c.drawString(x * mm, (y + h - 4) * mm, _pdf_text("Legend - oriented relief")) + # Lightness bar (L* 20 → 90, neutral gray) bx, by, bw, bh = x, y + h - 13, min(w, 55.0), 4.0 n = 40 for k in range(n): @@ -465,11 +466,11 @@ def _draw_legend(c, box, mm): c.setFillColor(HexColor(_hex(lab_to_rgb(L, 0, 0)))) c.rect((bx + bw * k / n) * mm, by * mm, (bw / n + 0.05) * mm, bh * mm, stroke=0, fill=1) c.setFillColor(black); c.setFont("Helvetica", 6) - c.drawString(bx * mm, (by - 2.8) * mm, _pdf_text("creux, fossé")) - c.drawRightString((bx + bw) * mm, (by - 2.8) * mm, _pdf_text("bosse, crête")) - c.drawString(bx * mm, (by + bh + 0.8) * mm, _pdf_text("Clarté = micro-relief")) - # Rose des orientations (couleur = orientation de la pente) - r_out, r_in = 8.5, 3.9 # place pour les 4 phrases de lecture + c.drawString(bx * mm, (by - 2.8) * mm, _pdf_text("hollow, ditch")) + c.drawRightString((bx + bw) * mm, (by - 2.8) * mm, _pdf_text("bump, ridge")) + c.drawString(bx * mm, (by + bh + 0.8) * mm, _pdf_text("Lightness = micro-relief")) + # Orientation rose (color = slope orientation) + r_out, r_in = 8.5, 3.9 # leaves room for the reading sentences rcx, rcy = x + r_out + 2, by - 5 - r_out - 2 for deg in range(0, 360, 5): c.setFillColor(HexColor(_hex(rose_color(deg)))) @@ -480,24 +481,24 @@ def _draw_legend(c, box, mm): c.circle(rcx * mm, rcy * mm, r_in * mm, stroke=0, fill=1) c.setFillColor(black); c.setFont("Helvetica-Bold", 5.0) for label, deg in (("N", 0), ("NE", 45), ("E", 90), ("SE", 135), ("S", 180), - ("SO", 225), ("O", 270), ("NO", 315)): + ("SW", 225), ("W", 270), ("NW", 315)): a = math.radians(deg) c.drawCentredString((rcx + (r_out + 2.4) * math.sin(a)) * mm, (rcy + (r_out + 2.4) * math.cos(a) - 0.8) * mm, label) c.setFont("Helvetica", 6) - c.drawString((rcx + r_out + 5) * mm, (rcy + 2) * mm, _pdf_text("Teinte = orientation")) - c.drawString((rcx + r_out + 5) * mm, (rcy - 1) * mm, _pdf_text("de la pente")) - # Texte de légende ("Comment lire" : phrases habillées à la largeur de la boîte) + c.drawString((rcx + r_out + 5) * mm, (rcy + 2) * mm, _pdf_text("Hue = orientation")) + c.drawString((rcx + r_out + 5) * mm, (rcy - 1) * mm, _pdf_text("of the slope")) + # Legend text ("How to read": sentences wrapped to the box width) from reportlab.pdfbase.pdfmetrics import stringWidth ty = rcy - r_out - 6 - c.setFont("Helvetica", 5.2) # 4 phrases dans la boîte, A4 compris + c.setFont("Helvetica", 5.2) # the reading sentences fit in the box, A4 included for sentence in VIZ_LEGENDS[LAYER].get("reading") or VIZ_LEGENDS[LAYER]["legend"].split("\n"): - # Sur la planche, les pixels sans point sol sont hachurés en blanc - # (pas noirs comme sur la carte) : même phrase, repère adapté. - if sentence.startswith("Trous noirs"): - sentence = "Hachures blanches" + sentence[len("Trous noirs"):] - # La teinte est déjà légendée à côté de la rose : phrase redondante. - if sentence.startswith("Teinte = orientation"): + # On the sheet, pixels without a ground point are hatched white + # (not black as on the map): same sentence, adapted cue. + if sentence.startswith("Black gaps"): + sentence = "White hatched areas" + sentence[len("Black gaps"):] + # The hue is already explained next to the rose: redundant sentence. + if sentence.startswith("Hue = slope orientation"): continue line = "" for word in _pdf_text(sentence).split(" "): @@ -514,21 +515,21 @@ def _draw_legend(c, box, mm): if ty < y + 1: return c.drawString(x * mm, ty * mm, line) - ty -= 3.1 # interligne un peu plus grand entre deux phrases + ty -= 3.1 # slightly larger spacing between two sentences def _draw_quality(c, box, bbox, zq, mm): - """Encart qualité : miniature de densité sol + chiffres clés.""" + """Quality inset: ground density thumbnail + key figures.""" from reportlab.lib.colors import HexColor, black, white x, y, w, h = box c.setFillColor(black); c.setFont("Helvetica-Bold", 8) - c.drawString(x * mm, (y + h - 4) * mm, _pdf_text("Qualité des données")) - # Miniature : emprise de la zone, mailles 50 m colorées par classe + c.drawString(x * mm, (y + h - 4) * mm, _pdf_text("Data quality")) + # Thumbnail: footprint of the area, 50 m cells colored by class avail_w, avail_h = w * 0.45, h - 10 k = min(avail_w / (bbox[2] - bbox[0]), avail_h / (bbox[3] - bbox[1])) mw, mh = (bbox[2] - bbox[0]) * k, (bbox[3] - bbox[1]) * k mx, my = x, y + h - 7 - mh - _draw_hatch(c, mx, my, mw, mh, mm) # hachures = non renseigné + _draw_hatch(c, mx, my, mw, mh, mm) # hatching = not available for gx0, gy0, gx1, gy1, v in zq["grid_cells"]: x0, x1 = max(gx0, bbox[0]), min(gx1, bbox[2]) y0, y1 = max(gy0, bbox[1]), min(gy1, bbox[3]) @@ -540,7 +541,7 @@ def _draw_quality(c, box, bbox, zq, mm): # Classes lx, ly = x + mw + 3, y + h - 8 c.setFillColor(black); c.setFont("Helvetica", 5.8) - c.drawString(lx * mm, ly * mm, _pdf_text("Points sol / m²")) + c.drawString(lx * mm, ly * mm, _pdf_text("Ground points / m²")) for low, label, color in DENSITY_CLASSES: ly -= 3.2 c.setFillColor(HexColor(color)); c.rect(lx * mm, ly * mm, 3 * mm, 2.2 * mm, stroke=0, fill=1) @@ -550,27 +551,27 @@ def _draw_quality(c, box, bbox, zq, mm): _draw_hatch(c, lx, ly, 3.0, 2.2, mm, step=1.4) c.setStrokeColor(black); c.setLineWidth(0.3) c.rect(lx * mm, ly * mm, 3 * mm, 2.2 * mm, stroke=1, fill=0) - c.setFillColor(black); c.drawString((lx + 4) * mm, (ly + 0.4) * mm, _pdf_text("non renseigné")) - # Chiffres clés + c.setFillColor(black); c.drawString((lx + 4) * mm, (ly + 0.4) * mm, _pdf_text("not available")) + # Key figures lines = [] if zq["density_mean"] is None: - lines.append("Densité sol : non renseigné") + lines.append("Ground density: not available") else: - lines.append(f"Densité sol moyenne : {zq['density_mean']:.1f} pts/m²".replace(".", ",")) - lines.append(f"Maille la plus faible (50 m) : {zq['density_min']:.1f} pts/m²".replace(".", ",")) - lines.append(f"Surface sans point sol (interpolée) : {zq['empty_fraction'] * 100:.0f} %") + lines.append(f"Mean ground density: {zq['density_mean']:.1f} pts/m²") + lines.append(f"Weakest cell (50 m): {zq['density_min']:.1f} pts/m²") + lines.append(f"Area without ground points (interpolated): {zq['empty_fraction'] * 100:.0f}%") if zq["acq_start"] is None: - lines.append("Acquisition : non renseigné") + lines.append("Acquisition: not available") else: period = zq["acq_start"] if zq["acq_start"] == zq["acq_end"] else \ - f"{zq['acq_start']} au {zq['acq_end']}" - label = "Acquisition" if zq["acq_sources"] == {"gps"} else "Date de production du fichier" - lines.append(f"{label} : {period}") + f"{zq['acq_start']} to {zq['acq_end']}" + label = "Acquisition" if zq["acq_sources"] == {"gps"} else "File production date" + lines.append(f"{label}: {period}") if zq["missing_relief"]: - lines.append("Donnée manquante (sans relief) : " + ", ".join( + lines.append("Missing data (no relief): " + ", ".join( f"{c_}_{r_}" for c_, r_ in zq["missing_relief"])) if zq["missing_quality"]: - lines.append("Qualité non renseignée : " + ", ".join( + lines.append("Quality not available: " + ", ".join( f"{c_}_{r_}" for c_, r_ in zq["missing_quality"])) ty = min(my, ly) - 3.5 font_q, size_q = "Helvetica", 5.8 @@ -586,21 +587,22 @@ def _draw_quality(c, box, bbox, zq, mm): def _draw_cartouche(c, box, lay, bbox, cx, cy, title, now, mm): - """Titre, échelle graphique et numérique, nord, date, source.""" + """Title, graphic and numeric scale, north, date, source.""" from reportlab.lib.colors import black, white x, y, w, h = box - # Titre et sous-titre partagent la ligne du haut avec la flèche du nord - # (coin haut droit) : largeur bornée pour ne jamais la chevaucher. + # Title and subtitle share the top line with the north arrow (top-right + # corner): bounded width so they never overlap it. max_w_head = _cartouche_text_max_width(w, mm) txt, title_size = _fit_title(c, _pdf_text(title), "Helvetica-Bold", 10, max_w_head) c.setFillColor(black); c.setFont("Helvetica-Bold", title_size) c.drawString(x * mm, (y + h - 5) * mm, txt) subtitle, subtitle_size = _fit_title( - c, _pdf_text(f"Échelle 1:{_fmt_int(lay.scale)} - {lay.paper} {lay.orient} - {lay.dpi} dpi"), + c, _pdf_text(f"Scale 1:{_fmt_int(lay.scale)} - {lay.paper} " + f"{_ORIENT_LABELS.get(lay.orient, lay.orient)} - {lay.dpi} dpi"), "Helvetica", 7, max_w_head, min_size=6.0) c.setFont("Helvetica", subtitle_size) c.drawString(x * mm, (y + h - 9) * mm, subtitle) - # Échelle graphique : longueur ronde ≤ 40 % de la largeur du bloc + # Graphic scale: round length ≤ 40% of the block width max_m = w * 0.4 / 1000 * lay.scale length = max((s for s in _SCALEBAR_STEPS if s <= max_m), default=_SCALEBAR_STEPS[0]) bar_mm = length / lay.scale * 1000 @@ -611,7 +613,7 @@ def _draw_cartouche(c, box, lay, bbox, cx, cy, title, now, mm): c.setFillColor(black); c.setFont("Helvetica", 6) c.drawString(bx * mm, (by - 2.8) * mm, "0") c.drawRightString((bx + bar_mm) * mm, (by - 2.8) * mm, f"{_fmt_int(length)} m") - # Flèche du nord géographique (la carte est orientée nord du quadrillage) + # True north arrow (the map is oriented to grid north) gamma = _north_arrow_angle(cx, cy) ax, ay = x + w - 8, y + h - 12 c.saveState(); c.translate(ax * mm, ay * mm); c.rotate(gamma) @@ -620,19 +622,19 @@ def _draw_cartouche(c, box, lay, bbox, cx, cy, title, now, mm): c.drawPath(p, stroke=0, fill=1) c.setFont("Helvetica-Bold", 6); c.drawCentredString(0, 6 * mm, "N") c.restoreState() - # Note d'orientation : ligne à part (jamais sur la même hauteur que l'échelle - # numérique — évite le chevauchement des deux textes alignés à droite/gauche). - side = "ouest" if gamma >= 0 else "est" - north_label = f"nord géographique à {abs(gamma):.2f}° à l'{side} du quadrillage".replace(".", ",") + # Orientation note: a line of its own (never at the height of the + # numeric scale — avoids overlapping the right- and left-aligned texts). + side = "west" if gamma >= 0 else "east" + north_label = f"True north {abs(gamma):.2f}° {side} of grid north" ty = by - 7 font_c, size_c = "Helvetica", 6 c.setFillColor(black); c.setFont(font_c, size_c) max_w_c = w * mm for line in (north_label, - f"Centre L93 : X {_fmt_int(round(cx))} m Y {_fmt_int(round(cy))} m", - f"Zone : {_fmt_int(round(bbox[2] - bbox[0]))} x {_fmt_int(round(bbox[3] - bbox[1]))} m", - f"Exporté le {now:%d/%m/%Y %H:%M}", - "Source : LiDAR HD (c) IGN - rendu lidar_rendu"): + f"L93 center: X {_fmt_int(round(cx))} m Y {_fmt_int(round(cy))} m", + f"Area: {_fmt_int(round(bbox[2] - bbox[0]))} x {_fmt_int(round(bbox[3] - bbox[1]))} m", + f"Exported on {now:%Y-%m-%d %H:%M}", + "Source: LiDAR HD © IGN - rendered by lidar_rendu"): for part in _wrap_text(c, line, font_c, size_c, max_w_c): if ty < y + 1: return @@ -642,11 +644,11 @@ def _draw_cartouche(c, box, lay, bbox, cx, cy, title, now, mm): def build_pdf(output_dir, lat, lon, paper="A4", orient="paysage", scale=2000, title=None, now=None, compress=True): - """Planche PDF d'une zone. Returns (octets PDF, nom de fichier). + """PDF sheet of an area. Returns (PDF bytes, file name). Raises: - ValueError: réglage invalide. - NoDataError: aucune dalle du relief dans l'emprise. + ValueError: invalid setting. + NoDataError: no relief tile in the footprint. """ import os import tempfile @@ -661,18 +663,18 @@ def build_pdf(output_dir, lat, lon, paper="A4", orient="paysage", scale=2000, bbox = map_bbox(cx, cy, lay) img, _mask, cells = compose_l93(output_dir, bbox, pixel_size(lay)) if not cells: - raise NoDataError("aucune dalle du relief orienté dans cette zone") + raise NoDataError("no oriented-relief tile in this area") now = now or datetime.now() zq = zone_quality(bbox, load_quality_table(output_dir), cells) title = (title or "").strip()[:120] or \ - "Relief orienté - " + ", ".join(f"{c_}_{r_}" for c_, r_ in cells[:4]) + \ + "Oriented relief - " + ", ".join(f"{c_}_{r_}" for c_, r_ in cells[:4]) + \ (" ..." if len(cells) > 4 else "") buf = BytesIO() c = rl_canvas.Canvas(buf, pagesize=(lay.page_w * mm, lay.page_h * mm), pageCompression=1 if compress else 0) c.setTitle(_pdf_text(title)); c.setAuthor("lidar_rendu") - # Image carte en JPEG (incorporée telle quelle : PDF léger) + # Map image as JPEG (embedded as is: lightweight PDF) fd, jpg = tempfile.mkstemp(suffix=".jpg") os.close(fd) try: diff --git a/lidar_pipeline/fetch_ign.py b/lidar_pipeline/fetch_ign.py index 359596b..a93bfe7 100644 --- a/lidar_pipeline/fetch_ign.py +++ b/lidar_pipeline/fetch_ign.py @@ -1,13 +1,13 @@ -"""Téléchargement des dalles LiDAR HD de l'IGN pour les tuiles non générées. +"""Download of IGN LiDAR HD tiles for tiles not yet generated. -Catalogue STAC (à jour) : https://browser.stac.teledetection.fr/collections/lidarhd -API : https://api.stac.teledetection.fr/collections/lidarhd/items -Fichiers (géoplateforme): https://data.geopf.fr/telechargement/download/... +STAC catalogue (current) : https://browser.stac.teledetection.fr/collections/lidarhd +API : https://api.stac.teledetection.fr/collections/lidarhd/items +Files (Géoplateforme) : https://data.geopf.fr/telechargement/download/... -Chaque dalle couvre 1 km × 1 km en Lambert 93 et est nommée par son coin -nord-ouest : LHD_FXX_{col}_{row}_PTS_LAMB93_IGN69.copc.laz -(col = X ouest en km, row = Y nord en km, cf. propriété STAC -"lidarhd:coordonnees_NW" au format "0816-6847"). +Each tile covers 1 km × 1 km in Lambert 93 and is named after its north-west +corner: LHD_FXX_{col}_{row}_PTS_LAMB93_IGN69.copc.laz +(col = west X in km, row = north Y in km, see the STAC property +"lidarhd:coordonnees_NW" in the "0816-6847" format). """ import json @@ -24,38 +24,38 @@ _HEADERS = {"User-Agent": "Mozilla/5.0 (lidar-archeo-pipeline)"} def parse_tile_specs(args): - """Convertit des spécifications "col,row" ou "col:row" en liste de tuples. + """Convert "col,row" or "col:row" specifications into a list of tuples. Args: - args: liste de chaînes (ex: ["1055,6882", "1056:6883"]). + args: list of strings (e.g. ["1055,6882", "1056:6883"]). Returns: - Liste de tuples (col, row). + List of (col, row) tuples. Raises: - ValueError: si une spécification est mal formée. + ValueError: if a specification is malformed. """ specs = [] for raw in args: text = raw.strip().replace(":", ",").replace(";", ",") parts = [p.strip() for p in text.split(",") if p.strip()] if len(parts) != 2: - raise ValueError(f"Spécification de tuile invalide: {raw!r} (attendu: col,row)") + raise ValueError(f"Invalid tile specification: {raw!r} (expected: col,row)") try: col, row = int(parts[0]), int(parts[1]) except ValueError: - raise ValueError(f"Spécification de tuile invalide: {raw!r} (col et row doivent être des entiers)") + raise ValueError(f"Invalid tile specification: {raw!r} (col and row must be integers)") specs.append((col, row)) return specs def tile_filename(col, row): - """Nom de fichier LAZ standard d'une dalle (col, row).""" + """Standard LAZ file name of a (col, row) tile.""" return f"LHD_FXX_{col:04d}_{row:04d}_PTS_LAMB93_IGN69.copc.laz" def _report_download(output_dir, tile, state, detail=None): - """Émet un événement de téléchargement pour la file de génération (best-effort).""" + """Emit a download event for the generation queue (best-effort).""" if output_dir is None: return from .progress import report_event @@ -63,7 +63,7 @@ def _report_download(output_dir, tile, state, detail=None): def _bbox_wgs84(col, row): - """Bbox WGS84 de la dalle (col,row) pour la requête STAC (peut être élargie).""" + """WGS84 bbox of the (col,row) tile for the STAC query (padded).""" try: from rasterio.warp import transform as warp_transform xs = [col * 1000, (col + 1) * 1000, col * 1000, (col + 1) * 1000] @@ -72,7 +72,7 @@ def _bbox_wgs84(col, row): except Exception: lons = None if lons is None: - try: # image légère (carte) : pyproj sans rasterio + try: # lightweight (map) image: pyproj without rasterio from pyproj import Transformer tr = Transformer.from_crs("EPSG:2154", "EPSG:4326", always_xy=True) xs = [col * 1000, (col + 1) * 1000, col * 1000, (col + 1) * 1000] @@ -87,12 +87,12 @@ def _bbox_wgs84(col, row): for y in ((row - 1) * 1000, row * 1000)] lons = [p[0] for p in pts] lats = [p[1] for p in pts] - pad = 0.005 # ~500 m de marge pour éviter les erreurs d'arrondi aux bords + pad = 0.005 # ~500 m margin to absorb rounding errors at the edges return (min(lons) - pad, min(lats) - pad, max(lons) + pad, max(lats) + pad) def match_feature(features, col, row): - """Retourne l'item STAC correspondant à la dalle (col,row), sinon None.""" + """Return the STAC item matching the (col,row) tile, else None.""" want = f"{col:04d}-{row:04d}" for feature in features: props = feature.get("properties", {}) @@ -102,20 +102,20 @@ def match_feature(features, col, row): def find_tile_url(col, row, timeout=20, max_pages=5): - """Cherche l'URL de téléchargement de la dalle (col,row) dans le catalogue STAC. + """Look up the download URL of the (col,row) tile in the STAC catalogue. Returns: - URL (str) ou None si la dalle n'est pas (encore) publiée par l'IGN. + URL (str), or None if the tile is not (yet) published by IGN. """ feature = find_tile_feature(col, row, timeout=timeout, max_pages=max_pages) return feature.get("assets", {}).get("data", {}).get("href") if feature else None def tile_ign_metadata(col, row, timeout=10): - """Fiche IGN d'une dalle : acquisition, capteurs, édition, téléchargement. + """IGN record of a tile: acquisition, sensors, edition, download. Returns: - dict normalisé (found=False si la dalle n'est pas publiée). + Normalised dict (found=False if the tile is not published). """ feature = find_tile_feature(col, row, timeout=timeout) if not feature: @@ -141,10 +141,10 @@ def tile_ign_metadata(col, row, timeout=10): def find_tile_feature(col, row, timeout=20, max_pages=5): - """Item STAC de la dalle (col,row), ou None si non publiée. + """STAC item of the (col,row) tile, or None if not published. - Suit la pagination du catalogue (lien rel=next) : sans elle, une dalle - au-delà de la première page de résultats semblait « introuvable ». + Follows the catalogue pagination (rel=next link): without it, a tile + beyond the first page of results appeared "not found". """ w, s, e, n = _bbox_wgs84(col, row) query = urllib.parse.urlencode({"bbox": f"{w:.6f},{s:.6f},{e:.6f},{n:.6f}", "limit": 50}) @@ -165,11 +165,11 @@ def find_tile_feature(col, row, timeout=20, max_pages=5): def download_file(url, dest_path, timeout=120, chunk=1024 * 1024): - """Télécharge url vers dest_path en streaming (écriture atomique). + """Stream url to dest_path (atomic write). - Écrit dans un .part puis renomme : un run interrompu (SIGKILL, panne) - ne laisse jamais un LAZ partiel qu'un run suivant considérerait comme - déjà téléchargé. Retourne la taille en octets. + Writes to a .part file then renames it: an interrupted run (SIGKILL, + crash) never leaves a partial LAZ that a later run would treat as + already downloaded. Returns the size in bytes. """ import os dest_path = Path(dest_path) @@ -186,8 +186,8 @@ def download_file(url, dest_path, timeout=120, chunk=1024 * 1024): out.write(block) done += len(block) elapsed = time.time() - t0 - logger.info(f" {done / 1e6:.0f} Mo en {elapsed:.0f}s" - f" ({done / 1e6 / max(elapsed, 0.1):.1f} Mo/s)") + logger.info(f" {done / 1e6:.0f} MB in {elapsed:.0f}s" + f" ({done / 1e6 / max(elapsed, 0.1):.1f} MB/s)") os.replace(tmp, dest_path) except BaseException: tmp.unlink(missing_ok=True) @@ -196,25 +196,26 @@ def download_file(url, dest_path, timeout=120, chunk=1024 * 1024): def fetch_tiles(input_dir, specs, output_dir=None, only_viz=None, resolutions=(0.5,), force=False): - """Télécharge les dalles IGN spécifiées, sauf celles inutiles au traitement. + """Download the given IGN tiles, except those not needed for processing. Args: - input_dir: dossier des fichiers LAZ (écriture autorisée requise). - specs: liste de tuples (col, row). - output_dir: dossier de sortie (optionnel) — permet d'ignorer les - tuiles déjà complètes. - only_viz: noms d'étapes des visualisations demandées (ex: ['aspect']). - Si fourni, une tuile n'est ignorée que si elle possède déjà - toutes ces visualisations aux résolutions demandées — - sinon son LAZ est (re)téléchargé pour compléter les - visualisations manquantes. - resolutions: résolutions attendues (m/px) pour considérer une tuile - complète quand only_viz est fourni. - force: True pour télécharger même les tuiles complètes (régénération : - leur LAZ est requis pour retraiter avec --force). + input_dir: LAZ files directory (must be writable). + specs: list of (col, row) tuples. + output_dir: output directory (optional) — used to skip tiles that + are already complete. + only_viz: step names of the requested visualisations (e.g. ['aspect']). + If given, a tile is skipped only if it already has all + these visualisations at the requested resolutions — + otherwise its LAZ is (re)downloaded to fill in the + missing ones. If not given, a tile is skipped as soon as + any visualisation exists for it. + resolutions: expected resolutions (m/px) for a tile to count as + complete when only_viz is given. + force: True to download even complete tiles (regeneration: their + LAZ is needed to reprocess with --force). Returns: - Liste des chemins téléchargés. + List of downloaded paths. """ from .dtm import EDGE_NEIGHBORS_DIRNAME input_dir = Path(input_dir) @@ -224,9 +225,9 @@ def fetch_tiles(input_dir, specs, output_dir=None, only_viz=None, resolutions=(0 keys = [step_to_keyword(v) for v in only_viz] complete = cells_with_all_viz(Path(output_dir) / "visualisations", keys, resolutions) - # Explicite : jamais de promotion quand on télécharge directement DANS - # edge_neighbors/ (appel de _fetch_edge_neighbors avec input_dir=edge_dir) - # — sinon une dalle voisine pourrait se retrouver déplacée vers elle-même. + # Explicit: never promote when downloading directly INTO edge_neighbors/ + # (_fetch_edge_neighbors call with input_dir=edge_dir) — otherwise a + # neighbour tile could end up moved onto itself. is_edge_dir = input_dir.name == EDGE_NEIGHBORS_DIRNAME downloaded = [] for col, row in specs: @@ -234,55 +235,55 @@ def fetch_tiles(input_dir, specs, output_dir=None, only_viz=None, resolutions=(0 tile = name[:-len(".copc.laz")] if name.endswith(".copc.laz") else name dest = input_dir / name if dest.exists(): - logger.info(f" {name} : déjà présent dans input/ — aucun téléchargement") - _report_download(output_dir, tile, "skip", "déjà dans input/") + logger.info(f" {name}: already in input/ — no download") + _report_download(output_dir, tile, "skip", "already in input/") continue if not is_edge_dir: - # dest.exists() ci-dessus ne teste que le nom exact : un ".part" - # voisin n'y correspond jamais, donc .exists() suffit à exclure - # un téléchargement voisin encore en cours. + # dest.exists() above only checks the exact name: a neighbouring + # ".part" never matches it, so .exists() is enough to rule out a + # neighbour download still in progress. neighbor_copy = input_dir / EDGE_NEIGHBORS_DIRNAME / name if neighbor_copy.exists(): import os os.replace(neighbor_copy, dest) - logger.info(f" {name} : déjà téléchargée comme voisine " - f"— déplacée dans input/") + logger.info(f" {name}: already downloaded as a neighbour " + f"— moved to input/") _report_download(output_dir, tile, "skip", - "déjà téléchargée comme voisine — déplacée dans input/") + "already downloaded as a neighbour — moved to input/") continue if output_dir is not None and not force: if complete is not None: if (col, row) in complete: - logger.info(f" {name} : visualisations déjà complètes — ignorée") - _report_download(output_dir, tile, "skip", "visualisations déjà complètes") + logger.info(f" {name}: visualisations already complete — skipped") + _report_download(output_dir, tile, "skip", "visualisations already complete") continue else: vis_dir = Path(output_dir) / "visualisations" if list(vis_dir.glob(f"LHD_FXX_{col:04d}_{row:04d}_PTS*")): - logger.info(f" {name} : visualisations déjà générées — ignorée") - _report_download(output_dir, tile, "skip", "visualisations déjà générées") + logger.info(f" {name}: visualisations already generated — skipped") + _report_download(output_dir, tile, "skip", "visualisations already generated") continue - logger.info(f" {name} : recherche dans le catalogue IGN...") - _report_download(output_dir, tile, "start", "catalogue IGN") + logger.info(f" {name}: searching the IGN catalogue...") + _report_download(output_dir, tile, "start", "IGN catalogue") try: url = find_tile_url(col, row) except Exception as e: - logger.warning(f" ✗ {name} : erreur catalogue ({e})") - _report_download(output_dir, tile, "fail", f"erreur catalogue : {e}") + logger.warning(f" ✗ {name}: catalogue error ({e})") + _report_download(output_dir, tile, "fail", f"catalogue error: {e}") continue if not url: - logger.warning(f" ✗ {name} : introuvable dans le catalogue IGN (zone non publiée ?)") - _report_download(output_dir, tile, "fail", "introuvable dans le catalogue IGN") + logger.warning(f" ✗ {name}: not found in the IGN catalogue (area not published?)") + _report_download(output_dir, tile, "fail", "not found in the IGN catalogue") continue - logger.info(f" {name} : téléchargement depuis la géoplateforme...") - _report_download(output_dir, tile, "start", "géoplateforme") + logger.info(f" {name}: downloading from the Géoplateforme...") + _report_download(output_dir, tile, "start", "Géoplateforme") try: download_file(url, dest) - logger.info(f" ✓ {name} téléchargée") + logger.info(f" ✓ {name} downloaded") _report_download(output_dir, tile, "ok") downloaded.append(dest) except Exception as e: dest.unlink(missing_ok=True) - logger.warning(f" ✗ {name} : échec du téléchargement ({e})") - _report_download(output_dir, tile, "fail", f"échec du téléchargement : {e}") + logger.warning(f" ✗ {name}: download failed ({e})") + _report_download(output_dir, tile, "fail", f"download failed: {e}") return downloaded diff --git a/lidar_pipeline/gpu.py b/lidar_pipeline/gpu.py index 7be410b..4dba636 100644 --- a/lidar_pipeline/gpu.py +++ b/lidar_pipeline/gpu.py @@ -4,7 +4,8 @@ Auto-selects the best NVIDIA GPU (highest compute capability first). Uses CuPy Device API (not CUDA_VISIBLE_DEVICES) so JIT compilation works correctly for any architecture (sm_89, sm_120, etc.). -All workers share the selected GPU. +In the worker pool, each process is pinned to one GPU (or forced to CPU) +by gpu_worker_slots / set_active_gpu / force_cpu, bounded by free VRAM. """ import logging @@ -27,10 +28,10 @@ _gpu_reason = None # GPU restriction from -g flag (host-level indices) _restricted_gpu_ids: list[int] | None = None -# Vrai si CUDA_VISIBLE_DEVICES a été écrit par _init_gpu lui-même (choix du -# meilleur GPU). Cette valeur NE DOIT PAS être traitée comme une restriction -# externe : sinon available_gpu_ids() ne retourne plus que le GPU choisi et -# tous les workers reçoivent le même gpu_id (GPU 1 jamais utilisé). +# True if CUDA_VISIBLE_DEVICES was written by _init_gpu itself (best-GPU +# pick). That value MUST NOT be treated as an external restriction: otherwise +# available_gpu_ids() returns only the chosen GPU and every worker gets the +# same gpu_id (GPU 1 never used). _env_set_by_init = False # Discovered GPU candidates (populated by _pick_gpu) @@ -82,7 +83,7 @@ except Exception: # --------------------------------------------------------------------------- _cp = None _cp_ndimage = None -_cupy_ndarray = None # type ref qui survit à disable_gpu() pour que to_cpu() récupère les tableaux orphelins +_cupy_ndarray = None # type ref that survives disable_gpu() so to_cpu() can still recover orphaned arrays _gpu_initialized = False @@ -91,8 +92,8 @@ def _filter_candidates(gpus: list) -> list: nvidia-smi lists ALL GPUs even when CUDA_VISIBLE_DEVICES is set (driver 580.x behavior), so we must filter manually. - La variable écrite par _init_gpu (choix auto du meilleur GPU) est ignorée : - seules les restrictions externes (run.sh -g, compose) comptent. + The value written by _init_gpu (automatic best-GPU pick) is ignored: + only external restrictions (run.sh -g, compose) count. """ # Filter by CUDA_VISIBLE_DEVICES if set externally cuda_visible = os.environ.get('CUDA_VISIBLE_DEVICES') @@ -112,12 +113,12 @@ def _filter_candidates(gpus: list) -> list: def _runtime_candidates(): - """Détection GPU de repli via le runtime CuPy (sans nvidia-smi). + """Fallback GPU detection through the CuPy runtime (no nvidia-smi). - nvidia-smi peut dépasser son timeout quand le système est chargé : - _pick_gpu() retourne alors [] et les workers passent à tort en CPU. - Les indices CuPy sont renumérotés selon CUDA_VISIBLE_DEVICES — on les - remappe en indices hôtes pour rester compatible avec _filter_candidates. + nvidia-smi can exceed its timeout on a loaded system: _pick_gpu() then + returns [] and workers wrongly fall back to CPU. CuPy indices are + renumbered according to CUDA_VISIBLE_DEVICES, so they are mapped back to + host indices to stay compatible with _filter_candidates. """ try: import cupy as _cp_runtime @@ -160,10 +161,10 @@ def _init_gpu(): candidates = _filter_candidates(_gpu_candidates) if not candidates: - # Repli runtime : nvidia-smi a échoué (timeout système chargé) + # Runtime fallback: nvidia-smi failed (timeout on a loaded system) candidates = _filter_candidates(_runtime_candidates()) if not candidates: - logger.info("Pas de GPU utilisable — mode CPU uniquement") + logger.info("No usable GPU — CPU-only mode") _cp = None _cp_ndimage = None HAS_GPU = False @@ -194,7 +195,7 @@ def _init_gpu(): _cupy_ndarray = _real_cupy.ndarray return except Exception as e: - logger.warning(f"GPU indisponible (CUDA_VISIBLE_DEVICES={cuda_visible}): {e}") + logger.warning(f"GPU unavailable (CUDA_VISIBLE_DEVICES={cuda_visible}): {e}") _cp = None _cp_ndimage = None HAS_GPU = False @@ -220,12 +221,12 @@ def _init_gpu(): _working_gpu = (idx, name, mem_mi) break else: - logger.warning(f"GPU {idx} ({name}, sm_{cap_str}) faux positif CPU fallback") - logger.warning(f"GPU {idx} ({name}, sm_{cap_str}) non compatible: " - f"{result.stderr.strip().splitlines()[-1] if result.stderr else 'inconnue'}") + logger.warning(f"GPU {idx} ({name}, sm_{cap_str}): false positive, the test ran on another device") + logger.warning(f"GPU {idx} ({name}, sm_{cap_str}) not compatible: " + f"{result.stderr.strip().splitlines()[-1] if result.stderr else 'unknown'}") if _working_gpu is None: - logger.info("Pas de GPU utilisable — mode CPU uniquement") + logger.info("No usable GPU — CPU-only mode") _cp = None _cp_ndimage = None HAS_GPU = False @@ -281,12 +282,12 @@ def restrict_gpus(gpu_ids: list[int], set_env_var: bool = False): def set_active_gpu(gpu_id): """Restrict to a single GPU by host-level index. - Appelé par les workers spawnés (_process_file_standalone) : CuPy n'y est - pas encore initialisé (le worker n'exécute pas log_gpu_status), il faut - donc déclencher _init_gpu() ici, sinon le worker retombe silencieusement - en CPU. On réduit aussi CUDA_VISIBLE_DEVICES à ce seul GPU avant l'init - pour que le device 0 du worker soit le bon : sans cela, tous les workers - avec plusieurs GPU visibles partagent le premier d'entre eux. + Called by spawned workers (_process_file_standalone): CuPy is not yet + initialized there (the worker does not run log_gpu_status), so + _init_gpu() must be triggered here, otherwise the worker silently falls + back to CPU. CUDA_VISIBLE_DEVICES is also narrowed to this single GPU + before init so that the worker's device 0 is the right one: without it, + all workers with several visible GPUs share the first of them. """ global _restricted_gpu_ids _restricted_gpu_ids = [gpu_id] @@ -295,10 +296,10 @@ def set_active_gpu(gpu_id): def force_cpu(): - """Interdit le GPU à ce processus (worker en excédent de VRAM). + """Forbid the GPU for this process (worker beyond the VRAM budget). - Aucun candidat ne survit au filtre et CUDA_VISIBLE_DEVICES vide empêche - CuPy de créer un contexte (~300 Mo de VRAM par processus sinon). + No candidate survives the filter, and an empty CUDA_VISIBLE_DEVICES stops + CuPy from creating a context (~300 MB of VRAM per process otherwise). """ global _restricted_gpu_ids _restricted_gpu_ids = [] @@ -306,20 +307,20 @@ def force_cpu(): _init_gpu() -# Pic de VRAM d'un worker (Mo) : contexte CUDA (~300) + calage conjoint des -# lignes sur CuPy (~70-100 o par point sol en float64, ~15 M points par dalle -# 0,2 m + bande de 100 m) + transformée de distance de _fill_nans (indices -# int32 ×2 sur ~7000² px ≈ 400 Mo) ; le pool CuPy garde ses blocs entre deux -# étapes. Estimation depuis le code, à ajuster par LIDAR_GPU_WORKER_MIB. +# Peak VRAM of one worker (MiB): CUDA context (~300) + joint scan-line +# adjustment on CuPy (~70-100 bytes per ground point in float64, ~15 M points +# per 0.2 m tile + 100 m buffer) + _fill_nans distance transform (int32 +# indices x2 over ~7000² px ≈ 400 MB); the CuPy pool keeps its blocks between +# steps. Estimated from the code, tune with LIDAR_GPU_WORKER_MIB. GPU_WORKER_MIB = int(os.environ.get("LIDAR_GPU_WORKER_MIB", "2048") or 2048) -# VRAM laissée libre sur chaque GPU (affichage, autres processus). +# VRAM left free on each GPU (display, other processes). GPU_RESERVE_MIB = int(os.environ.get("LIDAR_GPU_RESERVE_MIB", "512") or 512) def gpu_free_mib(): - """VRAM libre par GPU (indice hôte → Mo) via nvidia-smi, sans contexte CUDA. + """Free VRAM per GPU (host index → MiB) via nvidia-smi, without a CUDA context. - Dictionnaire vide si la mesure échoue : l'appelant ne borne alors rien. + Empty dict if the query fails: the caller then applies no bound. """ try: import subprocess @@ -341,13 +342,12 @@ def gpu_free_mib(): def gpu_worker_slots(gpu_ids, n_workers, free_mib=None): - """Place de chaque worker du pool : indice GPU, -1 (CPU forcé) ou None. + """Slot of each pool worker: GPU index, -1 (forced CPU) or None. - Chaque GPU reçoit au plus (VRAM libre − réserve) / GPU_WORKER_MIB - workers (au moins un), entrelacés entre GPU ; l'excédent tourne en CPU - au lieu de saturer la VRAM (OOM). Sans GPU : None partout (choix laissé - au worker). VRAM inconnue : round-robin sans borne (comportement - historique). + Each GPU gets at most (free VRAM − reserve) / GPU_WORKER_MIB workers (at + least one), interleaved across GPUs; the surplus runs on CPU instead of + exhausting VRAM (OOM). No GPU: None everywhere (the worker decides). + Unknown VRAM: unbounded round-robin (legacy behaviour). """ if not gpu_ids: return [None] * n_workers @@ -383,9 +383,9 @@ def log_gpu_status(): if isinstance(name, bytes): name = name.decode() mem_gb = props['totalGlobalMem'] // (1024**3) - gpu_info = f"GPU: {name} ({mem_gb} Go VRAM) — ID {_best_gpu_id}" + gpu_info = f"GPU: {name} ({mem_gb} GB VRAM) — ID {_best_gpu_id}" except Exception: - gpu_info = f"GPU: {_gpu_name} ({_gpu_mem_gb} Go VRAM)" + gpu_info = f"GPU: {_gpu_name} ({_gpu_mem_gb} GB VRAM)" logger.info(gpu_info) # List other GPUs for info @@ -403,11 +403,11 @@ def log_gpu_status(): idx = int(parts[0]) if idx != _best_gpu_id: cap = parts[2] - logger.info(f" GPU {idx}: {parts[1]} (sm_{cap}) — disponible") + logger.info(f" GPU {idx}: {parts[1]} (sm_{cap}) — available") except Exception: pass else: - logger.info(f"Pas de GPU utilisable — mode CPU uniquement") + logger.info("No usable GPU — CPU-only mode") # --------------------------------------------------------------------------- @@ -420,9 +420,9 @@ def to_gpu(arr): try: return _cp.asarray(arr.astype(np.float32)) except Exception as e: - # L'erreur d'origine (souvent OOM) ne doit pas être avalée : - # sans elle, un repli CPU est indissociable d'un simple bug. - logger.warning(f"Transfert GPU échoué ({e}) — repli CPU pour ce calcul") + # The original error (often OOM) must not be swallowed: + # without it, a CPU fallback is indistinguishable from a plain bug. + logger.warning(f"GPU transfer failed ({e}) — falling back to CPU") disable_gpu() return arr.astype(np.float32) @@ -430,7 +430,7 @@ def to_gpu(arr): def to_cpu(arr): """Bring array back to CPU (numpy). No-op if already on CPU. - Fonctionne même après disable_gpu() grâce à la réf de type _cupy_ndarray. + Works even after disable_gpu() thanks to the _cupy_ndarray type reference. """ if _cupy_ndarray is not None and isinstance(arr, _cupy_ndarray): try: @@ -454,7 +454,7 @@ def xp_gaussian_filter(arr, sigma): try: return _cp_ndimage.gaussian_filter(arr, sigma) except Exception as e: - logger.warning(f"Filtre gaussien GPU échoué ({e}) — repli CPU") + logger.warning(f"GPU Gaussian filter failed ({e}) — falling back to CPU") arr = to_cpu(arr) return ndimage.gaussian_filter(arr, sigma) @@ -464,19 +464,20 @@ def xp_uniform_filter(arr, size): try: return _cp_ndimage.uniform_filter(arr, size) except Exception as e: - logger.warning(f"Filtre uniform GPU échoué ({e}) — repli CPU") + logger.warning(f"GPU uniform filter failed ({e}) — falling back to CPU") arr = to_cpu(arr) return ndimage.uniform_filter(arr, size) def xp_zoom(arr, factor, order=1): - """Agrandissement aligné sur les centres de pixels (grid_mode) : chaque - pixel source couvre exactement factor×factor pixels, sans décalage.""" + """Upsampling with grid_mode (pixel-center alignment over the full image + extent): each source pixel covers exactly factor×factor output pixels, + with no half-pixel shift.""" if _cp is not None and isinstance(arr, _cp.ndarray): try: return _cp_ndimage.zoom(arr, factor, order=order, mode='nearest', grid_mode=True) except Exception as e: - logger.warning(f"Zoom GPU échoué ({e}) — repli CPU") + logger.warning(f"GPU zoom failed ({e}) — falling back to CPU") arr = to_cpu(arr) return ndimage.zoom(arr, factor, order=order, mode='nearest', grid_mode=True) @@ -486,7 +487,7 @@ def xp_minimum_filter(arr, footprint=None, size=None): try: return _cp_ndimage.minimum_filter(arr, footprint=footprint, size=size) except Exception as e: - logger.warning(f"Filtre minimum GPU échoué ({e}) — repli CPU") + logger.warning(f"GPU minimum filter failed ({e}) — falling back to CPU") arr = to_cpu(arr) return ndimage.minimum_filter(arr, footprint=footprint, size=size) @@ -496,26 +497,26 @@ def xp_maximum_filter(arr, footprint=None, size=None): try: return _cp_ndimage.maximum_filter(arr, footprint=footprint, size=size) except Exception as e: - logger.warning(f"Filtre maximum GPU échoué ({e}) — repli CPU") + logger.warning(f"GPU maximum filter failed ({e}) — falling back to CPU") arr = to_cpu(arr) return ndimage.maximum_filter(arr, footprint=footprint, size=size) # --------------------------------------------------------------------------- -# Rasterisation MNT — moyenne z par cellule (bincount 2D) +# DTM rasterization — mean z per cell (2D bincount) # --------------------------------------------------------------------------- def _bin_mean_core(lib, xs, ys, zs, width, height, x_range, y_range): - """Moyenne z par cellule d'une grille régulière, backend-agnostique. + """Mean z per cell of a regular grid, backend-agnostic. - `lib` = numpy ou cupy (mêmes primitives). Sémantique calquée sur + `lib` = numpy or cupy (same primitives). Semantics mirror scipy.stats.binned_statistic_2d(statistic='mean', bins=[width, height], - range=[[xmin, xmax], [ymin, ymax]]) : points hors emprise ignorés, valeur - exactement sur le bord droit/haut rangée dans la dernière cellule. - Retourne (height, width) float64, NaN sur les cellules vides. + range=[[xmin, xmax], [ymin, ymax]]): points outside the extent are + ignored, a value exactly on the right/top edge goes into the last cell. + Returns (height, width) float64, NaN on empty cells. - float64 obligatoire pour x/y : à des coordonnées Lambert 93 (~1e6 m) la - résolution float32 est ~6 cm — grossière devant un pixel de 0,2 m. + float64 is required for x/y: at Lambert 93 coordinates (~1e6 m) float32 + resolution is ~6 cm (Y ~7e6 m: ~50 cm), far too coarse for a 0.2 m pixel. """ (xmin, xmax), (ymin, ymax) = x_range, y_range x = lib.asarray(xs, dtype=lib.float64) @@ -523,9 +524,9 @@ def _bin_mean_core(lib, xs, ys, zs, width, height, x_range, y_range): z = lib.asarray(zs, dtype=lib.float64) inside = (x >= xmin) & (x <= xmax) & (y >= ymin) & (y <= ymax) x, y, z = x[inside], y[inside], z[inside] - # floor((v - min) / pas) ; les valeurs intérieures sont >= 0 donc la - # troncature astype == floor. Le clip range le bord droit (et l'arrondi - # float adjacent) dans la dernière cellule, comme scipy. + # floor((v - min) / step); interior values are >= 0 so astype truncation + # == floor. The clip puts the right edge (and the adjacent float rounding) + # into the last cell, like scipy. ix = ((x - xmin) * (float(width) / (xmax - xmin))).astype(lib.int64) iy = ((y - ymin) * (float(height) / (ymax - ymin))).astype(lib.int64) ix = lib.clip(ix, 0, width - 1) @@ -539,13 +540,13 @@ def _bin_mean_core(lib, xs, ys, zs, width, height, x_range, y_range): def bin_mean_2d(xs, ys, zs, width, height, x_range, y_range): - """Rasterisation « moyenne par cellule » sur GPU (appelant : dtm.create_dtm_fast). + """"Mean per cell" rasterization on GPU (caller: dtm.create_dtm_fast). - Retourne un tableau numpy (height, width) float64 (NaN = cellule vide), - ou None si le GPU est indisponible ou échoue (OOM le plus souvent) — - l'appelant retombe alors sur scipy. Un échec ici n'appelle PAS - disable_gpu() : la rastérisation est ponctuelle, les visualisations qui - suivent doivent garder leur accélérateur. + Returns a numpy (height, width) float64 array (NaN = empty cell), or None + if the GPU is unavailable or fails (usually OOM) — the caller then falls + back to scipy. A failure here does NOT call disable_gpu(): rasterization + is a one-off step, and the visualizations that follow must keep their + accelerator. """ if not _gpu_available(): return None @@ -554,7 +555,7 @@ def bin_mean_2d(xs, ys, zs, width, height, x_range, y_range): x_range, y_range) return to_cpu(result) except Exception as e: - logger.warning(f"Rasterisation GPU échouée ({e}) — repli scipy") + logger.warning(f"GPU rasterization failed ({e}) — falling back to scipy") gpu_cleanup() return None @@ -575,13 +576,13 @@ def gpu_cleanup(): def disable_gpu(): """Disable GPU acceleration for the rest of this process. - Libère le memory pool GPU avant de nuller les références (anti-fuite VRAM). - Garde _cupy_ndarray vivant pour que to_cpu() récupère les tableaux orphelins. + Frees the GPU memory pool before dropping the references (avoids VRAM + leaks). Keeps _cupy_ndarray alive so to_cpu() can recover orphaned arrays. """ global HAS_GPU, _cp, _cp_ndimage if not HAS_GPU: return - logger.warning("GPU désactivé — passage en mode CPU pour la suite du processus") + logger.warning("GPU disabled — switching to CPU for the rest of this process") gpu_cleanup() HAS_GPU = False _cp = None @@ -598,14 +599,14 @@ def safe_gpu_call(func, *args, **kwargs): try: return func(*args, **kwargs) except Exception as e: - # GPU actif : on TOUTE erreur (OOM, types numpy/cupy mêlés après un - # échec de transfert en cours de run, ...) le GPU est désactivé et le - # calcul est retranché en CPU — une panne partielle ne doit pas - # faire échouer la visualisation entière. En mode CPU, on relance - # l'erreur d'origine (déjà en CPU, rien à retrancher). + # GPU active: on ANY error (OOM, mixed numpy/cupy types after a + # transfer failure mid-run, ...) the GPU is disabled and the + # computation is retried on CPU — a partial failure must not make the + # whole visualization fail. In CPU mode, the original error is + # re-raised (already on CPU, nothing to retry). if _cp is not None: - logger.warning(f"Erreur GPU ({e.__class__.__name__}: {e}), " - f"retry en CPU...") + logger.warning(f"GPU error ({e.__class__.__name__}: {e}), " + f"retrying on CPU...") disable_gpu() cpu_args = tuple(to_cpu(a) for a in args) cpu_kwargs = {k: to_cpu(v) for k, v in kwargs.items()} diff --git a/lidar_pipeline/ign.py b/lidar_pipeline/ign.py index 2c9a987..0383693 100644 --- a/lidar_pipeline/ign.py +++ b/lidar_pipeline/ign.py @@ -50,7 +50,7 @@ def _optimal_zoom_level(resolution, lat, layer): elif 'PLAN' in layer: zoom = min(zoom, 19) - logger.debug(f" Zoom WMTS: {zoom} (résolution cible: {resolution}m/px)") + logger.debug(f" WMTS zoom: {zoom} (target resolution: {resolution} m/px)") return zoom @@ -58,7 +58,7 @@ def _lat_lon_to_tile(lat, lon, zoom): """Convert lat/lon to Web Mercator tile coordinates.""" n = 2 ** zoom col = int((lon + 180) / 360 * n) - lat = max(-85.0511, min(85.0511, lat)) # borne Mercator : évite log/cos invalides + lat = max(-85.0511, min(85.0511, lat)) # Mercator bound: avoids invalid log/cos lat_rad = math.radians(lat) row = int((1 - math.log(math.tan(lat_rad) + 1 / math.cos(lat_rad)) / math.pi) / 2 * n) return col, row @@ -95,7 +95,7 @@ def download_ign_tiles(min_x, max_x, min_y, max_y, layer, zoom_level=15, min_zoo from PIL import Image as PILImage if not HAS_WARP: - logger.error(" ✗ rasterio.warp non disponible pour conversion de coordonnées") + logger.error(" ✗ rasterio.warp unavailable for coordinate conversion") return None try: @@ -105,7 +105,7 @@ def download_ign_tiles(min_x, max_x, min_y, max_y, layer, zoom_level=15, min_zoo nw_lat, nw_lon = lats[0], lons[0] se_lat, se_lon = lats[1], lons[1] except Exception: - logger.error(" ✗ Impossible de convertir les coordonnées") + logger.error(" ✗ Could not convert coordinates") return None wmts_url = "https://data.geopf.fr/wmts" @@ -124,14 +124,14 @@ def download_ign_tiles(min_x, max_x, min_y, max_y, layer, zoom_level=15, min_zoo out_height = int(se_px_y - nw_px_y) if out_width <= 0 or out_height <= 0 or out_width > 10000 or out_height > 10000: - logger.warning(f" Image IGN trop grande: {out_width}x{out_height}px — zoom {zoom} abandon") + logger.warning(f" IGN image too large: {out_width}x{out_height} px — skipping zoom {zoom}") continue total_tiles = (col_max - col_min + 1) * (row_max - row_min + 1) if zoom < zoom_level: - logger.info(f" ↓ Retry zoom {zoom_level}→{zoom}: {total_tiles} tuiles ({out_width}x{out_height}px)") + logger.info(f" ↓ Retrying zoom {zoom_level}→{zoom}: {total_tiles} tiles ({out_width}x{out_height} px)") else: - logger.info(f" Zoom {zoom}: {total_tiles} tuiles à télécharger ({out_width}x{out_height}px)") + logger.info(f" Zoom {zoom}: {total_tiles} tiles to download ({out_width}x{out_height} px)") composite = np.full((out_height, out_width, 3), 255, dtype=np.uint8) @@ -151,8 +151,8 @@ def download_ign_tiles(min_x, max_x, min_y, max_y, layer, zoom_level=15, min_zoo }) url = f"{wmts_url}?{params}" - # 2 tentatives : un accident réseau (reset, timeout) ne doit - # pas laisser un trou blanc définitif dans la dalle. + # 2 attempts: a network glitch (reset, timeout) must not + # leave a permanent white hole in the tile. tile_arr = None first_tile_404 = False for attempt in range(2): @@ -170,11 +170,11 @@ def download_ign_tiles(min_x, max_x, min_y, max_y, layer, zoom_level=15, min_zoo tiles_404 += 1 # If the very first tile is 404, this zoom is unavailable if col == col_min and row == row_min: - logger.info(f" Zoom {zoom} non disponible (404) — essai zoom inférieur") + logger.info(f" Zoom {zoom} unavailable (404) — trying a lower zoom") first_tile_404 = True else: tiles_failed += 1 - break # erreur HTTP : inutile de réessayer + break # HTTP error: no point retrying except Exception: tiles_failed += 1 if attempt == 0: @@ -216,14 +216,14 @@ def download_ign_tiles(min_x, max_x, min_y, max_y, layer, zoom_level=15, min_zoo continue if tiles_failed > 0: - logger.warning(f" {tiles_failed} tuile(s) IGN en échec réseau ({layer}) " - f"— la dalle peut avoir des trous") - logger.info(f" → {tiles_downloaded} tuiles IGN téléchargées ({layer})") + logger.warning(f" {tiles_failed} IGN tile(s) failed over the network ({layer}) " + f"— the tile may have holes") + logger.info(f" → {tiles_downloaded} IGN tiles downloaded ({layer})") if tiles_downloaded == 0: continue return composite - logger.error(" ✗ Aucun zoom disponible pour cette zone") + logger.error(" ✗ No zoom level available for this area") return None @@ -280,7 +280,7 @@ def generate_ign_overlay(dem_file, basename, vis_dir, resolution, layer, title, result = download_ign_tiles(min_x, max_x, min_y, max_y, layer, zoom) if result is None: - logger.error(" ✗ Impossible de télécharger les tuiles IGN") + logger.error(" ✗ Could not download IGN tiles") return None from PIL import Image as PILImage @@ -297,9 +297,9 @@ def generate_ign_overlay(dem_file, basename, vis_dir, resolution, layer, title, for i in range(3): dst.write(ign_arr[:, :, i], i + 1) - logger.info(f" ✓ {title} terminé ({time.time()-t0:.1f}s)") + logger.info(f" ✓ {title} done ({time.time()-t0:.1f}s)") return output except Exception as e: - logger.error(f" ✗ Erreur IGN overlay: {e}", exc_info=True) + logger.error(f" ✗ IGN overlay error: {e}", exc_info=True) return None \ No newline at end of file diff --git a/lidar_pipeline/index.py b/lidar_pipeline/index.py index ecb8335..29bdd8d 100644 --- a/lidar_pipeline/index.py +++ b/lidar_pipeline/index.py @@ -1,22 +1,22 @@ -"""Catalogue des tuiles traitées : registres partagés, vignettes, inventaire. +"""Catalog of processed tiles: shared registries, thumbnails, inventory. -Anciennement l'interface web historique (index.html + assets) : celle-ci a été -remplacée par la carte à tuiles XYZ (mapserve.py/mapui.py, image lidar-maps). -Ce module produit aujourd'hui les artefacts dont le pipeline et la carte ont -besoin : +This module no longer holds any user interface (the map UI lives in +mapserve.py/mapui.py and web/map.{html,css,js}, image lidar-maps). It produces +the artifacts the pipeline and the map need: - - registres partagés : VIZ_LABELS/VIZ_LEGENDS (libellés, légendes), défauts - d'affichage (DEFAULT_VIZ, PRECISION_VIZ, VIEW_MODES), correspondances mot-clé ↔ - étape du pipeline (KEYWORD_TO_STEP) ; - - vignettes (index_thumbs/) et sous-tuiles (index_subtiles/) servant de - paliers sources à la pyramide XYZ (tiles.py) ; - - inventaire output/index_tiles.json : dalles, couches et URLs versionnées, - servi par /api/tiles de mapserve aux machines légères (LIDAR_SOURCE_URL) - et reconstruit après chaque tuile en mode --incremental-index. + - shared registries: VIZ_LABELS/VIZ_LEGENDS (labels, legends), display + defaults (DEFAULT_VIZ, PRECISION_VIZ, VIEW_MODES), output keyword ↔ + pipeline step mappings (KEYWORD_TO_STEP); + - thumbnails (index_thumbs/) and sub-tiles (index_subtiles/) used as source + levels of the XYZ pyramid (tiles.py); + - inventory output/index_tiles.json: tiles, layers and versioned URLs, + served by mapserve's /api/tiles to the lightweight machines + (LIDAR_SOURCE_URL) and rebuilt after every tile by default (unless + --no-index). -Intégration : - - appelé automatiquement à la fin de process_all() dans pipeline.py ; - - régénération solo via --rebuild-index dans cli.py. +Integration: + - called automatically at the end of process_all() in pipeline.py; + - standalone rebuild via --rebuild-index in cli.py. """ import json @@ -29,251 +29,252 @@ from pathlib import Path logger = logging.getLogger("lidar") -# Noms d'affichage (français) pour le panneau de couches. -# Clé = mot-clé dans le nom de fichier de sortie (post-basename). +# Display names of the layers (map panel, inventory, TileJSON, WMTS, JOSM). +# Key = keyword in the output file name (after the basename). VIZ_LABELS = { - 'hillshade_multi': 'Hillshade multidirectionnel', - 'slope': 'Pente', + 'hillshade_multi': 'Multidirectional hillshade', + 'slope': 'Slope', 'aspect': 'Aspect', - 'mslrm': 'MSRM (relief multi-échelle)', - 'sailore': 'SAILORE (LRM adaptatif)', - 'positive_openness': 'Openness positive', - 'negative_openness': 'Openness négative', + 'mslrm': 'MSRM (multi-scale relief)', + 'sailore': 'SAILORE (adaptive LRM)', + 'positive_openness': 'Positive openness', + 'negative_openness': 'Negative openness', 'svf': 'Sky-View Factor', - 'roughness': 'Rugosité', - 'wavelet': 'Ondelette', - 'flow_acc': 'Accumulation d\'écoulement', - 'solar': 'Éclairage solaire', - 'anomaly': 'Carte d\'anomalies', - 'relief_oriente': 'Relief orienté', - 'densite_sol': 'Précision (densité de points sol)', - 'ortho': 'Orthophoto IGN', - 'topo': 'Carte topographique IGN', + 'roughness': 'Roughness', + 'wavelet': 'Wavelet', + 'flow_acc': 'Flow accumulation', + 'solar': 'Solar illumination', + 'anomaly': 'Anomaly map', + 'relief_oriente': 'Oriented relief', + 'densite_sol': 'Precision (ground point density)', + 'ortho': 'IGN orthophoto', + 'topo': 'IGN topographic map', } -# Légendes des couches : titre, lecture du rendu (couleurs), méthode de calcul -# et dégradé de colormap. Source unique partagée entre rendering.py (images -# unitaires) et export.py (bandeau légende des mosaïques multi-dalles) — ce -# module reste volontairement sans dépendance lourde (webapp légère : ni -# matplotlib, ni GDAL). -# 'gradient' : 9 arrêts échantillonnés sur la colormap matplotlib (plt.get_cmap -# à i/8) pour dessiner une barre de dégradé sans matplotlib ; la cohérence -# avec rendering.COLORMAPS est vérifiée par les tests (test_export.py). -# 'ticks' : libellés des extrémités du dégradé (None = pas de barre). +# Layer legends: title, how to read the rendering (colors), computation method +# and colormap gradient. Single source shared by rendering.py (merged into +# COLORMAPS), mapserve.py (/api/map/meta, TileJSON) and export_pdf.py (PDF +# legend) — this module deliberately has no heavy dependency (the lightweight +# lidar-maps image has neither matplotlib nor GDAL). +# 'gradient': 9 stops sampled from the matplotlib colormap (plt.get_cmap at +# i/8) to draw a gradient bar without matplotlib; it must be kept in sync by +# hand with the 'cmap' of rendering.COLORMAPS (no test checks it). +# 'ticks': labels of the gradient ends (None = no bar). +# 'reading' (optional): "How to read" sentences shown by the map and the PDF. VIZ_LEGENDS = { 'hillshade_multi': { - 'title': 'Hillshade Multidirectionnel', - 'legend': 'Illumination combinée de 8 directions (échelle fixe 0–1)\nBlanc = Face éclairée | Noir = Zone d\'ombre\nCouleurs homogènes entre tuiles', - 'description': 'Ombres portées révélant micro-relief (murs, fossés, terrasses)', + 'title': 'Multidirectional Hillshade', + 'legend': 'Combined illumination from 8 directions (fixed 0–1 scale)\nWhite = lit face | Black = shadow\nConsistent colors across tiles', + 'description': 'Cast shadows revealing micro-relief (walls, ditches, terraces)', 'cmap': 'gray', 'gradient': ('#000000', '#202020', '#404040', '#606060', '#808080', '#a0a0a0', '#c0c0c0', '#e0e0e0', '#ffffff'), 'ticks': ('0', '1'), }, 'slope': { - 'title': 'Pente (Inclinaison du terrain)', - 'legend': 'Inclinaison en degrés\nÉchelle fixe 0–30° — couleurs homogènes entre tuiles\nJaune = Forte pente | Violet foncé = Terrain plat', - 'description': 'Murs, talus et bords ressortent en jaune — terrain plat en sombre', + 'title': 'Slope (terrain steepness)', + 'legend': 'Steepness in degrees\nFixed 0–30° scale — consistent colors across tiles\nYellow = steep slope | Dark purple = flat ground', + 'description': 'Walls, banks and edges stand out in yellow — flat ground is dark', 'cmap': 'inferno', 'gradient': ('#000004', '#210c4a', '#57106e', '#8a226a', '#bc3754', '#e45a31', '#f98e09', '#f9cb35', '#fcffa4'), 'ticks': ('0°', '30°'), }, 'aspect': { - 'title': 'Aspect (Direction des pentes)', - 'legend': 'Direction vers laquelle le terrain descend\nCycle continu : Nord→Est→Sud→Ouest→Nord\nCouleurs perceptuellement uniformes (pas de saut de teinte)', - 'description': 'Orientation des pentes — utile pour distinguer structures des formes naturelles', + 'title': 'Aspect (slope direction)', + 'legend': 'Direction in which the ground slopes down\nContinuous cycle: North→East→South→West→North\nPerceptually uniform colors (no hue jump)', + 'description': 'Slope orientation — helps tell structures from natural landforms', 'cmap': 'twilight', 'gradient': ('#e2d9e2', '#95b5c7', '#6276ba', '#592a8f', '#2f1436', '#741e4f', '#b25652', '#cca389', '#e2d9e2'), - 'ticks': ('Nord 0°', 'Nord 360°'), + 'ticks': ('North 0°', 'North 360°'), }, 'mslrm': { - 'title': 'MSRM - Multi-Scale Relief Model (échelles adaptatives)', - 'legend': 'Relief combiné multi-échelles (σ locales, échelle fixe ±3σ)\nRouge = Surélévation (mur, tumulus, levée)\nBleu = Dépression (fossé, douve)\n\nÉchelles : 2 à 200m, pondérées 5–20m\nCouleurs homogènes entre tuiles\nDétecte du micro au macro', - 'description': 'Combine LRM à 5–7 échelles — détecte structures de 5m à 100m simultanément', + 'title': 'MSRM - Multi-Scale Relief Model (adaptive scales)', + 'legend': 'Combined multi-scale relief (local σ, fixed ±3σ scale)\nRed = raised (wall, mound, embankment)\nBlue = depression (ditch, moat)\n\nScales: 2 to 200 m, weighted towards 5–20 m\nConsistent colors across tiles\nDetects from micro to macro', + 'description': 'Combines LRM at 5–7 scales — detects structures from 5 m to 100 m at once', 'cmap': 'seismic', 'gradient': ('#00004c', '#0000a6', '#0101ff', '#8181ff', '#fffdfd', '#ff7d7d', '#fe0000', '#be0000', '#800000'), 'ticks': ('-3σ', '+3σ'), }, 'sailore': { - 'title': 'SAILORE - LRM Auto-Adaptatif', - 'legend': 'Relief local adaptatif (σ locales, échelle fixe ±3σ)\nRouge = Surélévation | Bleu = Dépression\nCouleurs homogènes entre tuiles\n\nNoyau adapté à la pente locale\nPlat = grand noyau (25m) | Pente = petit noyau (2m)', - 'description': 'Noyau qui s\'adapte à la pente locale — terrain plat=grand noyau, pente=petit noyau', + 'title': 'SAILORE - Self-Adaptive LRM', + 'legend': 'Adaptive local relief (local σ, fixed ±3σ scale)\nRed = raised | Blue = depression\nConsistent colors across tiles\n\nKernel adapted to the local slope\nFlat = large kernel (25 m) | Slope = small kernel (2 m)', + 'description': 'Kernel that adapts to the local slope — flat ground = large kernel, slope = small kernel', 'cmap': 'seismic', 'gradient': ('#00004c', '#0000a6', '#0101ff', '#8181ff', '#fffdfd', '#ff7d7d', '#fe0000', '#be0000', '#800000'), 'ticks': ('-3σ', '+3σ'), }, 'positive_openness': { - 'title': 'Openness Positive (ouverture vers le haut)', - 'legend': 'Angle d\'ouverture vers le ciel (écart à une référence nationale figée)\nClair = Vue dégagée vers le ciel (sommets, plateaux)\nSombre = Vue bloquée (vallées encaissées)\nMême angle = même couleur sur toutes les tuiles', - 'description': 'Ray-tracing 8 directions, multi-rayon — détecte crêtes et sommets', + 'title': 'Positive Openness (upward openness)', + 'legend': 'Opening angle towards the sky (deviation from a fixed national reference)\nLight = open view of the sky (summits, plateaus)\nDark = blocked view (deep valleys)\nSame angle = same color on every tile', + 'description': 'Ray tracing in 8 directions, multi-radius — detects ridges and summits', 'cmap': 'YlOrBr', 'gradient': ('#ffffe5', '#fff7bc', '#fee390', '#fec34f', '#fe9829', '#eb6f14', '#cb4b02', '#983404', '#662506'), 'ticks': ('-3σ', '+3σ'), }, 'negative_openness': { - 'title': 'Openness Negative (ouverture vers le bas)', - 'legend': 'Angle d\'ouverture vers le bas (écart à une référence nationale figée)\nClair = Surplomb (bords de fossé, grottes)\nSombre = Terrain plat (fonds de vallée)\nMême angle = même couleur sur toutes les tuiles\nMeilleur détecteur de cavités et dolines', - 'description': 'Ray-tracing 8 directions, multi-rayon — détecte fossés, dolines, souterrains', + 'title': 'Negative Openness (downward openness)', + 'legend': 'Opening angle downwards (deviation from a fixed national reference)\nLight = overhang (ditch edges, caves)\nDark = flat ground (valley floors)\nSame angle = same color on every tile\nBest detector of cavities and sinkholes', + 'description': 'Ray tracing in 8 directions, multi-radius — detects ditches, sinkholes, underground features', 'cmap': 'PuBu', 'gradient': ('#fff7fb', '#ece7f2', '#d0d1e6', '#a5bddb', '#73a9cf', '#358fc0', '#056faf', '#04598c', '#023858'), 'ticks': ('-3σ', '+3σ'), }, 'svf': { - 'title': 'Sky-View Factor (fraction de ciel visible)', - 'legend': 'Proportion de ciel visible (échelle physique fixe 0–1)\nBlanc/jaune = Ciel masqué (vallée, fossé, tranchée)\nNoir = Ciel dégagé (sommet, plateau)\nCouleurs homogènes entre tuiles\nLes fossés ressortent en vif — excellent pour structures linéaires', - 'description': 'Détection de micro-relief — fossés en jaune/blanc, levées en sombre', + 'title': 'Sky-View Factor (visible sky fraction)', + 'legend': 'Share of visible sky (fixed physical 0–1 scale)\nWhite/yellow = sky hidden (valley, ditch, trench)\nBlack = open sky (summit, plateau)\nConsistent colors across tiles\nDitches stand out brightly — excellent for linear features', + 'description': 'Micro-relief detection — ditches in yellow/white, banks in dark', 'cmap': 'hot_r', 'gradient': ('#ffffff', '#ffff81', '#ffff03', '#ffad00', '#ff5900', '#ff0500', '#b00000', '#5c0000', '#0b0000'), 'ticks': ('0', '1'), }, 'roughness': { - 'title': 'Rugosité Multi-Échelle (3m + 15m)', - 'legend': 'Irrégularité du terrain combinée fine + large\nViolet foncé = Surface lisse (route, mur, sol plat)\nJaune vif = Surface rugueuse (végétation, ruines, pierres)\nCombine rugosité fine 3m (70%) + large 15m (30%)\nÉchelle physique commune à toutes les tuiles (références\nfigées mesurées sur dalles réelles) : mosaïque jointive,\nmême valeur = même couleur', - 'description': 'Mesure la variabilité locale — surfaces anthropiques lisses vs naturelles rugueuses', + 'title': 'Multi-Scale Roughness (3 m + 15 m)', + 'legend': 'Combined fine + broad terrain irregularity\nDark purple = smooth surface (road, wall, flat ground)\nBright yellow = rough surface (vegetation, ruins, stones)\nCombines fine 3 m roughness (70%) + broad 15 m (30%)\nPhysical scale shared by all tiles (fixed references\nmeasured on real tiles): seamless mosaic,\nsame value = same color', + 'description': 'Measures local variability — smooth man-made surfaces vs rough natural ones', 'cmap': 'plasma', 'gradient': ('#0d0887', '#4c02a1', '#7e03a8', '#aa2395', '#cc4778', '#e66c5c', '#f89540', '#fdc527', '#f0f921'), - 'ticks': ('lisse', 'rugueux'), + 'ticks': ('smooth', 'rough'), }, 'wavelet': { - 'title': 'Ondelette Mexican Hat (CWT multi-échelle)', - 'legend': 'Indice RMS multi-échelles, centré sur la médiane de la\ntuile (1 = niveau moyen, plus haut = structure)\n\nGrands volumes retirés (moyenne locale 35 m) :\nun fossé en sommet ou en pente ne ressort\npas plus qu\'un fossé à plat\n\nÉtirement quantile global figé (calibré sur un\néchantillon de tuiles) : même valeur = même couleur\nsur toutes les tuiles et résolutions\n\nOptimisé petites structures :\nchemins, fossés, ramparts', - 'description': 'Transformée en ondelette 2D : détection des petites structures (chemins, fossés, ramparts)', + 'title': 'Mexican Hat Wavelet (multi-scale CWT)', + 'legend': 'Multi-scale RMS index, centered on the tile\nmedian (1 = average level, higher = structure)\n\nLarge volumes removed (35 m local mean):\na ditch on a summit or a slope stands out\nno more than a ditch on flat ground\n\nFixed global quantile stretch (calibrated on a\nsample of tiles): same value = same color\non every tile and resolution\n\nTuned for small structures:\npaths, ditches, ramparts', + 'description': '2D wavelet transform: detection of small structures (paths, ditches, ramparts)', 'cmap': 'inferno', 'gradient': ('#000004', '#210c4a', '#57106e', '#8a226a', '#bc3754', '#e45a31', '#f98e09', '#f9cb35', '#fcffa4'), - 'ticks': ('bruit', 'structure'), + 'ticks': ('noise', 'structure'), }, 'flow_acc': { - 'title': 'Accumulation d\'Écoulement (Flow Accumulation)', - 'legend': 'Log10 du nombre de cellules amont\nVert foncé = Forte accumulation (fossé, chenal, drainage)\nJaune = Faible accumulation (terrain plat)\n\nDétection fossés et linéaires hydrologiques', - 'description': 'Priority-flood + D8 — détecte fossés archéologiques et drainages', + 'title': 'Flow Accumulation', + 'legend': 'Log10 of the number of upstream cells\nDark green = high accumulation (ditch, channel, drainage)\nYellow = low accumulation (flat ground)\n\nDetects ditches and linear hydrological features', + 'description': 'Priority-flood + D8 — detects archaeological ditches and drainage', 'cmap': 'YlGn', 'gradient': ('#ffffe5', '#f7fcb9', '#d9f0a3', '#acdd8e', '#77c679', '#40aa5c', '#228343', '#006737', '#004529'), - 'ticks': ('faible', 'forte'), + 'ticks': ('low', 'high'), }, 'solar': { - 'title': 'Éclairage Solaire', - 'legend': "Illumination solaire (azimut 90°, altitude 30°)\nClair = Face éclairée | Sombre = Zone d'ombre", - 'description': "Simulation de l'éclairage solaire matinal", + 'title': 'Solar Illumination', + 'legend': "Solar illumination (azimuth 90°, altitude 30°)\nLight = lit face | Dark = shadow", + 'description': "Simulated morning sunlight", 'cmap': 'gray', 'gradient': ('#000000', '#202020', '#404040', '#606060', '#808080', '#a0a0a0', '#c0c0c0', '#e0e0e0', '#ffffff'), 'ticks': ('0', '1'), }, 'anomaly': { - 'title': 'Carte d\'Anomalies (détection automatique)', - 'legend': 'Score d\'anomalie composite (0–1)\nRouge = Haute anomalie (structures suspectes)\nJaune = Anomalie modérée\nBlanc = Aucun signal (terrain naturel)\n\nSeuil auto: pixels > 2σ de la moyenne locale\nCombiné: MSRM, SVF, Ondelette, Openness, Rugosité', - 'description': 'Détection automatique — cible à vérifier sur terrain', + 'title': 'Anomaly Map (automatic detection)', + 'legend': 'Composite anomaly score (0–1)\nRed = strong anomaly (suspected structures)\nYellow = moderate anomaly\nWhite = no signal (natural ground)\n\nAuto threshold: pixels > 2σ from the local mean\nCombined: MSRM, SVF, wavelet, openness, roughness', + 'description': 'Automatic detection — targets to be checked in the field', 'cmap': 'YlOrRd', 'gradient': ('#ffffcc', '#ffeda0', '#fed976', '#feb24c', '#fd8c3c', '#fc4d2a', '#e2191c', '#bb0026', '#800026'), 'ticks': ('0', '1'), }, 'relief_oriente': { - 'title': 'Relief orienté (openness locale × orientation)', - 'legend': 'Clarté = micro-relief (openness locale 5–20 m + ombrage)\nClair = bosse, crête | Sombre = creux, fossé\nTeinte = orientation de la pente\nÉchelle fixe — couleurs homogènes entre tuiles', - 'description': 'Openness sur MNT détendancé (σ 10 m), rayons 5/10/20 m, 16 directions ; teinte CIELAB = aspect', + 'title': 'Oriented relief (local openness × orientation)', + 'legend': 'Lightness = micro-relief (local openness 5–20 m + shading)\nLight = bump, ridge | Dark = hollow, ditch\nHue = slope orientation\nFixed scale — consistent colors across tiles', + 'description': 'Openness on the detrended DTM (σ 10 m), radii 5/10/20 m, 16 directions; CIELAB hue = aspect', 'cmap': None, 'gradient': None, 'ticks': None, - # « Comment lire » : texte unique de la carte (/api/map/meta) et de la - # légende de la planche PDF. + # "How to read": single text source for the map (/api/map/meta) and + # the PDF sheet legend. 'reading': ( - 'Clarté = ouverture locale du terrain : clair = bosse, crête ; sombre = creux, fossé.', - 'Teinte = orientation de la pente (voir la rose).', - 'Trous noirs = aucun point sol : bâtiments, eau, couvert dense.', - "Entre les points, le relief est comblé seulement à l'intérieur de " - "l'enveloppe des points, sur un rayon de 1,5 × l'espacement local " - "(au moins 1 m) : assez pour éviter les trous, sans inventer de relief " - "ni amplifier le bruit.", + 'Lightness = local openness of the terrain: light = bump, ridge; dark = hollow, ditch.', + 'Hue = slope orientation (see the rose).', + 'Black gaps = no ground point: buildings, water, dense cover.', + "Between points, the relief is filled in only inside the envelope " + "of the points, over a radius of 1.5 × the local spacing (at least " + "1 m): enough to avoid holes, without inventing relief or " + "amplifying noise.", ), }, 'densite_sol': { - 'title': 'Précision géométrique (densité de points sol)', - 'legend': 'Points sol retenus pour le MNT, par m² (moyenne sur 3 × 3 m)\n16 gris, échelle log fixe : 2 niveaux = densité doublée\nNoir = ≤ 0,35 pt/m² ou aucun point (relief interpolé ou absent)\nBlanc = ≥ 45 pts/m²', - 'description': 'Où le relief est mesuré (clair) et où il est interpolé (sombre)', + 'title': 'Geometric precision (ground point density)', + 'legend': 'Ground points kept for the DTM, per m² (3 × 3 m mean)\n16 grays, fixed log scale: 2 levels = density doubled\nBlack = ≤ 0.35 pt/m² or no point (relief interpolated or missing)\nWhite = ≥ 45 pts/m²', + 'description': 'Where the relief is measured (light) and where it is interpolated (dark)', 'cmap': 'gray', 'gradient': ('#000000', '#202020', '#404040', '#606060', '#808080', '#a0a0a0', '#c0c0c0', '#e0e0e0', '#ffffff'), - 'ticks': ('≤ 0,35 pt/m²', '≥ 45 pts/m²'), + 'ticks': ('≤ 0.35 pt/m²', '≥ 45 pts/m²'), 'reading': ( - 'Points sol par m², 16 gris : clair = relief mesuré, sombre = relief interpolé.', - 'Noir = moins de 0,35 point par m² ou aucun point.', + 'Ground points per m², 16 grays: light = measured relief, dark = interpolated relief.', + 'Black = less than 0.35 point per m², or no point at all.', ), }, 'ortho': { - 'title': 'Photographie Aérienne IGN', - 'legend': 'Orthophotographie\nImage aérienne', - 'description': 'Photographie aérienne IGN (Orthophoto)', + 'title': 'IGN Aerial Photograph', + 'legend': 'Orthophoto\nAerial image', + 'description': 'IGN aerial photograph (orthophoto)', 'cmap': None, 'gradient': None, 'ticks': None, }, 'topo': { - 'title': 'Carte Topographique IGN', - 'legend': 'Carte IGN\nPlan topographique', - 'description': 'Carte topographique IGN (Plan IGN)', + 'title': 'IGN Topographic Map', + 'legend': 'IGN map\nTopographic map', + 'description': 'IGN topographic map (Plan IGN)', 'cmap': None, 'gradient': None, 'ticks': None, }, } -# Affichage de la carte : UNE couche principale (DEFAULT_VIZ) et la couche -# « précision » (densité de points sol), montrée seule ou comparée au relief -# de part et d'autre d'une barre glissante (mode « compare »). +# Map display: ONE main layer (DEFAULT_VIZ) and the "precision" layer +# (ground point density), shown alone or compared with the relief on either +# side of a sliding bar ("compare" mode). PRECISION_VIZ = 'densite_sol' VIEW_MODES = ('relief', 'precision', 'compare') DEFAULT_VIEW_MODE = 'relief' -# Couche « principale » (mise en avant ; index_tiles.json + affichage en -# direct de la webapp) : le relief orienté, qui fusionne openness et aspect. +# "Main" layer (shown by default on the map): the oriented relief, which +# merges openness and aspect. DEFAULT_VIZ = 'relief_oriente' -# Couches produites et affichées : seule cette sélection est générée par -# défaut (pipeline sans --only, génération depuis la carte) et servie par la -# carte (panneau, tuiles XYZ, TileJSON, WMTS). Les autres visualisations -# restent calculables avec --only mais ne sont plus proposées. -# None = toutes les visualisations présentes sur disque. +# Layers produced and displayed: only this selection is generated by +# default (pipeline without --only, generation from the map) and served by +# the map (panel, XYZ tiles, TileJSON, WMTS, JOSM). The other visualizations +# can still be computed with --only but are no longer offered. +# None = every visualization present on disk. PANEL_VIZ = ('relief_oriente', 'densite_sol') -# Correspondance mot-clé de fichier de sortie → nom d'étape --only du pipeline -# (les trois visualisations dont le nom de sortie diffère du nom d'étape, -# cf. _expected_output_path dans pipeline.py). +# Output file keyword → pipeline --only step name (the three visualizations +# whose output name differs from the step name, see _expected_output_path in +# pipeline.py). KEYWORD_TO_STEP = { 'hillshade_multi': 'hillshade', 'positive_openness': 'pos_open', 'negative_openness': 'neg_open', } -# Correspondance inverse : nom d'étape --only → mot-clé de fichier de sortie. +# Reverse mapping: --only step name → output file keyword. STEP_TO_KEYWORD = {step: kw for kw, step in KEYWORD_TO_STEP.items()} def panel_steps(): - """Noms d'étapes --only des couches produites par défaut (PANEL_VIZ).""" + """--only step names of the layers produced by default (PANEL_VIZ).""" if PANEL_VIZ is None: return None return [KEYWORD_TO_STEP.get(k, k) for k in PANEL_VIZ] def step_to_keyword(step): - """Nom d'étape du pipeline (ex: 'pos_open') → mot-clé de fichier ('positive_openness').""" + """Pipeline step name (e.g. 'pos_open') → file keyword ('positive_openness').""" return STEP_TO_KEYWORD.get(step, step) def default_main_layer(all_viz_keys): - """Couche principale par défaut présente sur le disque (DEFAULT_VIZ, sinon - la première qui n'est pas la précision), ou None.""" + """Default main layer present on disk (DEFAULT_VIZ, otherwise the first + one that is not the precision layer), or None.""" keys = [k for k in all_viz_keys if k != PRECISION_VIZ] if DEFAULT_VIZ in keys: return DEFAULT_VIZ @@ -281,16 +282,16 @@ def default_main_layer(all_viz_keys): def cells_with_all_viz(vis_dir, viz_keys, resolutions=(0.5,)): - """Cellules (col, row) disposant de TOUTES les visualisations demandées. + """Cells (col, row) that have ALL the requested visualizations. - Une cellule est complète si, pour chaque résolution de `resolutions`, un - dossier de visualisations lui correspond et contient chaque mot-clé de - `viz_keys` (ex: 'aspect', 'hillshade_multi'). Sert à distinguer les tuiles - réellement terminées de celles à compléter : une tuile existante mais - incomplète (visualisation ou résolution manquante) reste à traiter. + A cell is complete if, for every resolution in `resolutions`, a + visualization directory matches it and contains every keyword of + `viz_keys` (e.g. 'aspect', 'hillshade_multi'). Used to tell tiles that + are really finished from those still to be completed: an existing but + incomplete tile (missing visualization or resolution) is still to process. Returns: - Ensemble des (col, row) complets. + Set of complete (col, row). """ by_cell = {} for t in scan_tiles(vis_dir): @@ -299,70 +300,65 @@ def cells_with_all_viz(vis_dir, viz_keys, resolutions=(0.5,)): return {cell for cell, per_res in by_cell.items() if all(kw in per_res.get(res, ()) for res in resolutions for kw in viz_keys)} -# Toutes les visualisations sont découpées en sous-tuiles (quadrants 500 m) -# pour alléger la carte. Renseigner un tuple pour restreindre la découpe — -# les viz exclues retombent en repli dalle entière. +# Every visualization is cut into sub-tiles (500 m quadrants) to lighten the +# map. Set a tuple to restrict the cutting — excluded visualizations fall +# back to the whole tile. _CARTO_SUBTILED_VIZ = () -# Encodage AVIF des sous-tuiles : q75 en 4:2:0, encodé UNE fois depuis le -# raster d'origine (write_subtiles appelé par tif_to_crop). Mesuré sur le -# relief orienté (2 dalles réelles, galerie de compression) : l'ancienne -# chaîne dalle q60 → sous-tuile q55 donnait 18,1 dB / SSIM 0,84 pour -# 3,9 Mo par dalle ; q75 unique 19,5 dB / SSIM 0,93 pour 8,8 Mo. Au-delà, -# le 4:2:0 plafonne (la teinte du relief, pixel par pixel, est moyennée par -# 2 × 2) : seul le 4:4:4 irait plus loin (q75 : 28 dB, 14 Mo). -# speed 9 : encodage rapide (cf. rendering.AVIF_SPEED). +# Sub-tile AVIF encoding: q75 in 4:2:0, encoded ONCE from the original +# raster (write_subtiles called by tif_to_crop). Measured on the oriented +# relief (2 real tiles, compression gallery): the former chain tile q60 → +# sub-tile q55 gave 18.1 dB / SSIM 0.84 for 3.9 MB per tile; a single q75 +# gives 19.5 dB / SSIM 0.93 for 8.8 MB. Beyond that, 4:2:0 hits a ceiling +# (the relief hue, pixel by pixel, is averaged over 2 × 2): only 4:4:4 would +# go further (q75: 28 dB, 14 MB). +# speed 9: fast encoding (see rendering.AVIF_SPEED). _SUBTILE_AVIF_QUALITY = 75 _SUBTILE_AVIF_SPEED = 9 -# Vignette de sous-tuile (px) : à la vue d'ensemble chaque sous-tuile active -# décode sa vignette en navigateur — 160 px couvre l'affichage jusqu'à ~220 px -# à l'écran et réduit la mémoire décodée d'un facteur ~2,5 vs 256 px. La taille -# est encodée dans le nom de fichier : la changer invalide le cache. +# Sub-tile thumbnail (px): a small source level of the XYZ pyramid — 160 px +# covers display up to ~220 px on screen and cuts decoded memory by a factor +# of ~2.5 vs 256 px. The size is encoded in the file name: changing it +# invalidates the cache. _SUBTILE_THUMB_PX = 160 -# Couches à contenu photographique ou traits fins (orthophoto, carte topo) : -# qualité propre (égale aujourd'hui à celle des rampes de couleur). +# Layers with photographic content or thin lines (orthophoto, topo map): +# their own quality (currently equal to that of the color ramps). _SUBTILE_AVIF_QUALITY_DETAIL = 75 _SUBTILE_DETAIL_VIZ = frozenset({'ortho', 'topo'}) -# Couches en aplats de niveaux codés (cf. rendering.LOSSLESS_GRAY_KEYWORDS) : -# sous-tuiles en WebP sans perte (niveaux de gris ; 3× plus léger que l'AVIF -# q100, seul AVIF exact) et vignette intermédiaire sans perte. +# Layers made of flat coded levels (see rendering.LOSSLESS_GRAY_KEYWORDS): +# sub-tiles in lossless WebP (grayscale; 3× lighter than AVIF q100, the only +# exact AVIF setting) and a lossless intermediate thumbnail. _SUBTILE_LOSSLESS_VIZ = frozenset({'densite_sol'}) -# Vignette intermédiaire (px) : pallier entre la vignette 256 px et l'image -# pleine résolution, pour éviter d'étirer la vignette ou de décoder l'AVIF -# complet dès qu'une tuile dépasse ~300 px à l'écran. +# Intermediate thumbnail (px): a level between the 256 px thumbnail and the +# full-resolution image, so the pyramid neither stretches the thumbnail nor +# decodes the full AVIF as soon as a tile exceeds ~300 px on screen. _MID_THUMB_SIZE = 640 -# Mosaïque d'overview (vue dézoomée) : une image WebP par couche couvrant -# toute la grille, assemblée depuis les vignettes des dalles. Sous un seuil -# de zoom l'interface l'affiche à la place des vignettes individuelles : -# 1 requête et ~30 Mo décodés par couche au lieu de centaines. La résolution -# est plafonnée : l'overview n'est affiché que tant qu'il reste au moins 1:1 -# avec l'écran (jamais flou). -# Ordre préféré des couches (bas → haut de pile) et choix de la vignette de repli. +# Preferred layer order (inventory viz_meta order) and choice of each tile's +# fallback display layer (_pick_display_viz). _VIZ_FALLBACK_ORDER = [ 'hillshade_multi', 'svf', 'slope', 'mslrm', 'positive_openness', 'negative_openness', 'aspect', 'sailore', 'roughness', 'wavelet', 'flow_acc', 'solar', 'anomaly', 'relief_oriente', 'ortho', 'topo', ] -# Regex pour parser les coordonnées tuile dans le basename LHD. -# LHD_FXX_{COL}_{ROW}_PTS_LAMB93_IGN69 (COL/ROW en km, Lambert 93) +# Regex parsing the tile coordinates in the LHD basename. +# LHD_FXX_{COL}_{ROW}_PTS_LAMB93_IGN69 (COL/ROW in km, Lambert 93) _RE_LHD_COORDS = re.compile(r'^LHD_FXX_(\d+)_(\d+)_PTS_LAMB93') def parse_basename_coords(name): - """Extrait les coordonnées tuile (col, row en km) depuis un basename. + """Extract the tile coordinates (col, row in km) from a basename. Args: - name: basename potentiel (ex: 'LHD_FXX_1000_6881_PTS_LAMB93_IGN69') - ou nom de dossier avec suffixe résolution ('..._r0p2'). + name: candidate basename (e.g. 'LHD_FXX_1000_6881_PTS_LAMB93_IGN69') + or directory name with a resolution suffix ('..._r0p2'). Returns: - (col_km, row_km) ou None si le nom ne correspond pas au pattern LHD. + (col_km, row_km), or None if the name does not match the LHD pattern. """ m = _RE_LHD_COORDS.match(name) if not m: @@ -371,13 +367,13 @@ def parse_basename_coords(name): def _strip_res_suffix(dirname): - """Sépare le basename de base et la résolution d'un nom de dossier de viz. + """Split a visualization directory name into base basename and resolution. 'LHD_FXX_1000_6881_PTS_LAMB93_IGN69' → (basename, 0.5) 'LHD_FXX_1000_6881_PTS_LAMB93_IGN69_r0p2' → (basename, 0.2) Returns: - (basename_without_suffix, resolution_float) ou (dirname, 0.5) si pas de suffixe. + (basename_without_suffix, resolution_float), or (dirname, 0.5) without a suffix. """ m = re.match(r'^(.+?)_r(\d+p\d+)$', dirname) if m: @@ -390,13 +386,13 @@ def _strip_res_suffix(dirname): def _res_suffix_str(resolution): - """Suffixe de nommage d'une résolution (0,5 m = résolution primaire, sans suffixe). + """Naming suffix of a resolution (0.5 m = primary resolution, no suffix). - Même convention que pipeline.LidarArchaeoPipeline._res_suffix, mais - réimplémentée localement : importer le pipeline tirerait dtm→numpy, absent - de l'image webapp légère (Dockerfile.webapp) et cassait build_index. - Toute évolution du format doit rester synchronisée avec pipeline.py - (_res_suffix) et le décodage inverse (_strip_res_suffix). + Same convention as pipeline.LidarArchaeoPipeline._res_suffix, but + reimplemented locally: importing the pipeline would pull in dtm→numpy, + absent from the lightweight lidar-maps image (Dockerfile.maps), and would + break build_index there. Any change to the format must stay in sync with + pipeline.py (_res_suffix) and the reverse decoding (_strip_res_suffix). """ if resolution == 0.5: return "" @@ -404,16 +400,16 @@ def _res_suffix_str(resolution): def scan_tiles(vis_dir): - """Scanne le dossier des visualisations pour inventorier les tuiles traitées. + """Scan the visualization directory to inventory the processed tiles. Args: - vis_dir: Path vers output/visualisations/ + vis_dir: Path to output/visualisations/ Returns: - Liste de dictionnaires: + List of dicts: {basename, col, row, resolution, dir_path, viz: {viz_key: {filename, ext}}, dir_name} - Triée par (résolution, row décroissant, col). + Sorted by (resolution, decreasing row, col). """ vis_dir = Path(vis_dir) if not vis_dir.is_dir(): @@ -429,12 +425,12 @@ def scan_tiles(vis_dir): col, row = coords basename, resolution = _strip_res_suffix(entry.name) - # Liste les fichiers image de visualisation dans le dossier. + # List the visualization image files in the directory. viz = {} for f in sorted(entry.iterdir()): if not f.is_file(): continue - # Détection extension AVIF/WebP + # Detect the AVIF/WebP extension ext = None low = f.name.lower() for e in ('.avif', '.webp'): @@ -443,7 +439,7 @@ def scan_tiles(vis_dir): break if ext is None: continue - # viz_key = nom sans le préfixe basename_ ni l'extension + # viz_key = name without the basename_ prefix and the extension stem = f.name[:-len('.' + ext)] prefix = basename + '_' if not stem.startswith(prefix): @@ -452,7 +448,7 @@ def scan_tiles(vis_dir): viz[viz_key] = {'filename': f.name, 'ext': ext} if not viz: - # Dossier vide ou sans image valide → ignoré + # Empty directory or no valid image → skipped continue tiles.append({ @@ -470,10 +466,10 @@ def scan_tiles(vis_dir): def compute_bbox(tiles): - """Calcule la bounding box (en km) couverte par les tuiles. + """Compute the bounding box (in km) covered by the tiles. Returns: - Dict {min_col, max_col, min_row, max_row} ou None si aucune tuile. + Dict {min_col, max_col, min_row, max_row}, or None if there is no tile. """ if not tiles: return None @@ -488,24 +484,23 @@ def compute_bbox(tiles): def compute_zones(tiles, proximity_threshold=15): - """Regroupe les tuiles en zones géographiques par clustering de proximité. + """Group the tiles into geographic zones by proximity clustering. - Les tuiles à moins de proximity_threshold km les unes des autres - sont regroupées dans la même zone. Les zones sont triées par taille - décroissante (plus grande zone en premier). + Tiles within proximity_threshold km of each other are grouped in the + same zone. Zones are sorted by decreasing size (largest zone first). Args: - tiles: Liste de dictionnaires de tuiles. - proximity_threshold: Distance maximale en km pour regrouper deux tuiles. + tiles: List of tile dicts. + proximity_threshold: Maximum distance in km to group two tiles. Returns: - Liste de dictionnaires de zones: + List of zone dicts: {label, tiles, bbox} """ if not tiles: return [] - # Union-Find pour le clustering + # Union-Find for the clustering parent = list(range(len(tiles))) def find(x): @@ -519,7 +514,7 @@ def compute_zones(tiles, proximity_threshold=15): if px != py: parent[px] = py - # Regrouper les tuiles proches + # Group nearby tiles for i in range(len(tiles)): for j in range(i + 1, len(tiles)): dc = abs(tiles[i]['col'] - tiles[j]['col']) @@ -527,7 +522,7 @@ def compute_zones(tiles, proximity_threshold=15): if max(dc, dr) <= proximity_threshold: union(i, j) - # Construire les zones + # Build the zones zone_members = {} for i in range(len(tiles)): root = find(i) @@ -537,20 +532,20 @@ def compute_zones(tiles, proximity_threshold=15): zones = [{'tiles': zone_tiles, 'bbox': compute_bbox(zone_tiles)} for zone_tiles in zone_members.values()] - # Trier AVANT de numéroter : les libellés « Zone N » suivent l'ordre - # d'affichage (taille décroissante) + # Sort BEFORE numbering: the "Zone N" labels follow the display order + # (decreasing size) zones.sort(key=lambda z: len(z['tiles']), reverse=True) for i, z in enumerate(zones, 1): - z['label'] = f'Zone {i} ({len(z["tiles"])} tuiles)' + z['label'] = f'Zone {i} ({len(z["tiles"])} tiles)' return zones def _approx_l93_to_wgs84(x_m, y_m): - """Approximation affine Lambert 93 → WGS84 (fallback sans rasterio). + """Affine approximation Lambert 93 → WGS84 (fallback without rasterio/pyproj). - Origine exacte: (700000, 6600000) L93 ↔ (3.0°E, 46.5°N). - Précision de l'ordre du km — utilisée seulement si rasterio/PROJ - est indisponible (jamais le cas dans le Docker). + Exact origin: (700000, 6600000) L93 ↔ (3.0°E, 46.5°N). + Accuracy of the order of a km — only used when neither rasterio nor + pyproj is available (never the case in the Docker images). """ import math lat = 46.5 + (y_m - 6600000.0) / 111320.0 @@ -559,10 +554,10 @@ def _approx_l93_to_wgs84(x_m, y_m): def _approx_wgs84_to_l93(lon, lat): - """Approximation affine WGS84 → Lambert 93 (inverse exacte du précédent). + """Affine approximation WGS84 → Lambert 93 (exact inverse of the previous one). - Précision de l'ordre du km — repli sans rasterio ni pyproj (webapp - légère, cf. bbox_to_cells dans webapp.py). + Accuracy of the order of a km — fallback without pyproj (see + bbox_to_cells / point_to_cell in mapserve.py). """ import math y = (lat - 46.5) * 111320.0 + 6600000.0 @@ -571,21 +566,21 @@ def _approx_wgs84_to_l93(lon, lat): def attach_gps_bounds(tiles): - """Attache à chaque tuile ses coins GPS pour l'affichage Leaflet. + """Attach to each tile its GPS corners for the Leaflet display. - Chaque tuile 1×1 km est définie par son coin nord-ouest en km L93 + Each 1×1 km tile is defined by its north-west corner in L93 km (col, row) → X ∈ [col, col+1] km, Y ∈ [row-1, row] km. - (Vérifié sur les bounds des DTM : X_min = col×1000, Y_max = row×1000.) + (Checked against the DTM bounds: X_min = col×1000, Y_max = row×1000.) - Utilise rasterio.warp (conversion PROJ exacte) si disponible, sinon - pyproj, sinon l'approximation affine _approx_l93_to_wgs84 (webapp - légère sans GDAL — précision ~km). + Uses rasterio.warp (exact PROJ conversion) if available, otherwise + pyproj (lightweight image without GDAL), otherwise the affine + approximation _approx_l93_to_wgs84 (accuracy ~km). - Ajoute à chaque tuile: - corners: [[lat, lon] × 4] dans l'ordre SW, SE, NE, NW - bounds : [[lat_sud, lon_ouest], [lat_nord, lon_est]] + Adds to each tile: + corners: [[lat, lon] × 4] in the order SW, SE, NE, NW + bounds : [[lat_south, lon_west], [lat_north, lon_east]] """ - # Coins SW, SE, NE, NW — Y du bord sud = (row-1)×1000, bord nord = row×1000 + # Corners SW, SE, NE, NW — south edge Y = (row-1)×1000, north edge = row×1000 xs = [] ys = [] for t in tiles: @@ -605,12 +600,12 @@ def attach_gps_bounds(tiles): lons, lats = transformer.transform(xs, ys) ok = True except ImportError: - logger.debug("Coins GPS approximatifs (rasterio et pyproj indisponibles)") + logger.debug("Approximate GPS corners (rasterio and pyproj unavailable)") lons = None lats = None ok = False except Exception as e: - logger.debug(f"Coins GPS approximatifs (rasterio indisponible: {e})") + logger.debug(f"Approximate GPS corners (rasterio unavailable: {e})") lons = None lats = None ok = False @@ -627,7 +622,7 @@ def attach_gps_bounds(tiles): for cy in ((t['row'] - 1) * 1000, t['row'] * 1000): lon, lat = _approx_l93_to_wgs84(cx, cy) corners.append([lat, lon]) - # Reordonner SW, SE, NE, NW (la boucle donne SW, NW, SE, NE) + # Reorder to SW, SE, NE, NW (the loop yields SW, NW, SE, NE) corners = [corners[0], corners[2], corners[3], corners[1]] t['corners'] = corners t['bounds'] = [[min(c[0] for c in corners), min(c[1] for c in corners)], @@ -636,7 +631,7 @@ def attach_gps_bounds(tiles): def _mtime(path): - """Mtime d'un fichier, ou None si inaccessible.""" + """Mtime of a file, or None if inaccessible.""" try: return Path(path).stat().st_mtime except OSError: @@ -644,11 +639,11 @@ def _mtime(path): def _cached_file_fresh(path, src_mtime): - """True si un fichier cache existe et est plus récent que sa source. + """True if a cached file exists and is newer than its source. - Sert à invalider vignettes et sous-tuiles quand une tuile est recalculée : - l'image source (AVIF/WebP) étant réécrite, sa mtime devient plus récente - que celle du cache, qui doit alors être régénéré. + Used to invalidate thumbnails and sub-tiles when a tile is recomputed: + the source image (AVIF/WebP) being rewritten, its mtime becomes newer + than the cache's, which must then be regenerated. """ cached_mtime = _mtime(path) if cached_mtime is None: @@ -657,37 +652,37 @@ def _cached_file_fresh(path, src_mtime): def _url_version(mtime): - """Suffixe d'invalidation de cache pour une URL image, ou '' si inconnu. + """Cache-busting suffix for an image URL, or '' if unknown. - Les images de la carte sont servies avec un cache immutable quand l'URL - porte ?v= : le suffixe DOIT donc identifier le contenu du fichier servi, - pas celui de sa source (une vignette recalculée après coup, ou un cache - webapp rapatrié, change de contenu sans que la source bouge). Chaque URL - est versionnée par la mtime de SON fichier. Un recalcul change l'URL et - force le rechargement — y compris en direct pendant un run : pollLiveTiles - fusionne les nouvelles données et updateImages() voit un src différent. + The map images are served with an immutable cache when the URL carries + ?v=: the suffix MUST therefore identify the content of the served file, + not that of its source (a thumbnail recomputed later, or a file fetched + from the upstream, changes content without its source moving). Each URL + is versioned by the mtime of ITS file. A recomputation changes the URL + and forces a reload — including live during a run, when the inventory is + rewritten after each tile. """ return f"?v={int(mtime * 1000)}" if mtime is not None else "" def generate_thumbnail(src_path, thumb_path, max_size=256, mid_path=None, mid_size=640): - """Génère une vignette JPEG depuis une image AVIF/WebP existante. + """Generate a JPEG thumbnail from an existing AVIF/WebP image. Args: - src_path: chemin de l'image source (AVIF/WebP). - thumb_path: chemin de sortie JPEG. - max_size: taille maximale (côté le plus grand) en pixels. - mid_path: vignette intermédiaire optionnelle (JPEG, taille mid_size). - mid_size: taille maximale de la vignette intermédiaire. + src_path: path of the source image (AVIF/WebP). + thumb_path: JPEG output path. + max_size: maximum size (longest side) in pixels. + mid_path: optional intermediate thumbnail (JPEG, size mid_size). + mid_size: maximum size of the intermediate thumbnail. Returns: - True si la vignette principale est OK, False si échec. + True if the main thumbnail is OK, False on failure. """ try: from PIL import Image as PILImage except ImportError: - logger.warning("PIL indisponible — impossible de générer les vignettes") + logger.warning("PIL unavailable — cannot generate thumbnails") return False try: @@ -710,18 +705,18 @@ def generate_thumbnail(src_path, thumb_path, max_size=256, mid_path=None, try: resized(img, mid_size).save(str(mid_path), format='JPEG', quality=82) except Exception as e: - logger.debug(f"Vignette intermédiaire ignorée {src_path}: {e}") + logger.debug(f"Intermediate thumbnail skipped {src_path}: {e}") resized(img, max_size).save(str(thumb_path), format='JPEG', quality=80) return True except Exception as e: - logger.debug(f"Vignette ignorée {src_path}: {e}") + logger.debug(f"Thumbnail skipped {src_path}: {e}") return False def _pick_display_viz(viz_keys): - """Choisit la visualisation par défaut pour une tuile. + """Choose the default visualization of a tile. - Privilégie hillshade_multi, sinon la première disponible selon l'ordre de repli. + Prefers hillshade_multi, otherwise the first available in the fallback order. """ for v in _VIZ_FALLBACK_ORDER: if v in viz_keys: @@ -730,65 +725,62 @@ def _pick_display_viz(viz_keys): def _subdivision_k(resolution, tile_m=1000, target_px=2500): - """Facteur de découpage k (grille k×k) pour alléger le rendu carte. + """Split factor k (k×k grid) to lighten map rendering. - Au 0,2 m/px une dalle de 1 km fait 5000×5000 px (~100 Mo décodés dans le - navigateur) : on la découpe en quadrants de 500 m (k=2, 2500×2500 px). - À 0,5 m/px (2000 px) la dalle reste entière (k=1). + At 0.2 m/px a 1 km tile is 5000×5000 px (~100 MB decoded): it is cut + into 500 m quadrants (k=2, 2500×2500 px). At 0.5 m/px (2000 px) the tile + stays whole (k=1). """ px = max(1, int(round(tile_m / resolution))) return max(1, int(round(px / target_px))) def _subtile_corners(corners, i, j, k): - """Coins WGS84 [SW, SE, NE, NW] de la sous-tuile (i, j) d'un découpage k×k. + """WGS84 corners [SW, SE, NE, NW] of sub-tile (i, j) of a k×k split. - i : indice vers l'est (0..k-1), j : indice vers le nord (0..k-1). - Interpolation bilinéaire des coins de la dalle — le quadrilatère projeté - est quasi un parallélogramme à cette échelle (erreur écran < 1 px). + i: index towards the east (0..k-1), j: index towards the north (0..k-1). + Bilinear interpolation of the tile corners — the projected quadrilateral + is almost a parallelogram at this scale (screen error < 1 px). - Les bords sont partagés entre sous-tuiles voisines : les points d'une - même ligne/colonne de la grille sont calculés UNE fois par dalle et - mémorisés, afin que deux tuiles adjacentes reçoivent exactement le même - point (sans partage, l'interpolation est évaluée deux fois sur des - fractions légèrement différentes et les bords ne coïncident plus à moins - d'un pixel — jointure cassée au zoom moyen). + Edges are shared between neighboring sub-tiles: every grid point is + computed from the same integer grid indices, so two adjacent sub-tiles + get exactly the same point (evaluating the interpolation on slightly + different fractions would make edges miss by less than a pixel — a + broken seam at medium zoom). """ sw, se, ne, nw = corners def lerp(p, q, u): return [p[0] + (q[0] - p[0]) * u, p[1] + (q[1] - p[1]) * u] - # Bords partagés : les points de la grille (k+1)×(k+1) sont calculés UNE - # fois et mémorisés par coordonnées, afin que deux sous-tuiles voisines - # reçoivent exactement le même point. Sans partage, l'interpolation est - # évaluée deux fois sur des fractions différentes et les bords ne - # coïncident plus à moins d'un pixel (jointure cassée au zoom moyen). + # Shared edges: each point of the (k+1)×(k+1) grid is derived from its + # integer indices (i0, j0) only, so two neighboring sub-tiles get exactly + # the same point. def at(i0, j0): u = i0 / k v = j0 / k - bottom = lerp(sw, se, u) # le long du bord sud, position u - top = lerp(nw, ne, u) # le long du bord nord, position u - return lerp(bottom, top, v) # interpolation nord-sud + bottom = lerp(sw, se, u) # along the south edge, position u + top = lerp(nw, ne, u) # along the north edge, position u + return lerp(bottom, top, v) # north-south interpolation - # Coins SW, SE, NE, NW de la sous-tuile (i, j). + # Corners SW, SE, NE, NW of sub-tile (i, j). return [at(i, j), at(i + 1, j), at(i + 1, j + 1), at(i, j + 1)] def _fallback_full_dalle(entries, viz_key, info): - """Repli dalle entière pour une couche non découpable : elle reste - superposable en couche (images plus lourdes, mais fonctionnelles).""" + """Whole-tile fallback for a layer that cannot be cut: it still works as + a layer (heavier images, but functional).""" for entry in entries.values(): entry['viz'][viz_key] = dict(info) def _subtile_ext(viz_key): - """Extension des sous-tuiles pleine résolution d'une couche.""" + """Extension of a layer's full-resolution sub-tiles.""" return '.webp' if viz_key in _SUBTILE_LOSSLESS_VIZ else '.avif' def _save_subtile_thumb(quad, path): - """Écrit la vignette de sous-tuile (redimensionnée à _SUBTILE_THUMB_PX).""" + """Write the sub-tile thumbnail (resized to _SUBTILE_THUMB_PX).""" from PIL import Image as PILImage scale = min(1.0, _SUBTILE_THUMB_PX / max(quad.size)) out = quad @@ -799,15 +791,15 @@ def _save_subtile_thumb(quad, path): def write_subtiles(output_dir, dir_name, viz_key, img, k, sub_dir_name='index_subtiles'): - """Découpe une image de dalle (PIL, nord en haut) en k × k sous-tuiles : - pleine résolution, vignette intermédiaire et vignette. + """Cut a tile image (PIL, north up) into k × k sub-tiles: full + resolution, intermediate thumbnail and thumbnail. - Appelée par build_index depuis l'image de dalle, et par le pipeline - (rendering.tif_to_crop) directement depuis le raster d'origine : la - sous-tuile ne subit alors qu'un seul encodage avec perte (réencoder la - dalle AVIF cumulait deux pertes). Encodage : AVIF 4:2:0 q75 - (_SUBTILE_AVIF_QUALITY, q75 aussi pour ortho/topo), WebP sans perte pour - les aplats de niveaux (_SUBTILE_LOSSLESS_VIZ). Lève en cas d'échec. + Called by build_index from the tile image, and by the pipeline + (rendering.tif_to_crop) directly from the original raster: the sub-tile + then undergoes a single lossy encoding (re-encoding the AVIF tile + compounded two losses). Encoding: AVIF 4:2:0 q75 (_SUBTILE_AVIF_QUALITY, + q75 for ortho/topo too), lossless WebP for flat level layers + (_SUBTILE_LOSSLESS_VIZ). Raises on failure. """ from PIL import Image as PILImage output_dir = Path(output_dir) @@ -826,7 +818,7 @@ def write_subtiles(output_dir, dir_name, viz_key, img, k, sub_dir_name='index_su for j in range(k): for i in range(k): stem = f"{dir_name}_{viz_key}_{i}_{j}" - # Image : ligne 0 = nord → la sous-tuile j (nord) est en haut + # Image: row 0 = north → the northern sub-tile j is at the top left, right = round(W * i / k), round(W * (i + 1) / k) top = round(H * (1 - (j + 1) / k)) bottom = round(H * (1 - j / k)) @@ -836,8 +828,8 @@ def write_subtiles(output_dir, dir_name, viz_key, img, k, sub_dir_name='index_su else: quad.save(str(out_dir / (stem + ext)), format='AVIF', quality=quality, subsampling='4:2:0', speed=_SUBTILE_AVIF_SPEED) - # Anciens fichiers d'une génération précédente (autre format, - # vignette 256 px sans taille dans le nom) + # Old files from a previous generation (other format, 256 px + # thumbnail without the size in the name) (out_dir / (stem + other_ext)).unlink(missing_ok=True) (out_dir / (stem + '_thumb.webp')).unlink(missing_ok=True) mid_scale = min(1.0, _MID_THUMB_SIZE / max(quad.size)) @@ -851,11 +843,11 @@ def write_subtiles(output_dir, dir_name, viz_key, img, k, sub_dir_name='index_su def _build_subtiles(tile, offered_viz_keys, output_dir, sub_dir_name): - """Découpe une dalle en sous-tuiles (crops AVIF) pour la carte interactive. + """Cut a tile into sub-tiles (AVIF crops) for the interactive map. - Ne découpe que les visualisations proposées dans le panneau de couches. Retourne - la liste des entrées display (une par sous-tuile), ou None si le découpage - n'est pas nécessaire/possible (la dalle entière sera alors affichée). + Only cuts the visualizations in offered_viz_keys. Returns the list of + display entries (one per sub-tile), or None if cutting is not + needed/possible (the whole tile is then displayed). """ k = _subdivision_k(tile['resolution']) if k <= 1: @@ -896,28 +888,28 @@ def _build_subtiles(tile, offered_viz_keys, output_dir, sub_dir_name): ext = _subtile_ext(viz_key) stems = {key: f"{tile['dir_name']}_{viz_key}_{key[0]}_{key[1]}" for key in entries} - # Régénère si au moins un fichier manque ou est périmé (dalle - # source recalculée depuis — comme les vignettes). L'URL pleine - # porte un suffixe ?v= d'invalidation : on l'ôte pour le chemin. - # Des sous-tuiles écrites par le pipeline depuis le raster - # d'origine (tif_to_crop) sont plus récentes que la dalle : elles - # sont gardées telles quelles (un seul encodage avec perte). + # Regenerate if at least one file is missing or stale (source + # tile recomputed since — like the thumbnails). The full URL + # carries a ?v= cache-busting suffix: strip it for the path. + # Sub-tiles written by the pipeline from the original raster + # (tif_to_crop) are newer than the tile: they are kept as is + # (a single lossy encoding). src = output_dir / info['full'].split('?')[0] src_mtime = _mtime(src) def _fresh(name): return _cached_file_fresh(output_dir / sub_dir_name / name, src_mtime) - # Pleine résolution + vignette intermédiaire d'un côté, vignettes - # de l'autre : un changement de taille de vignette (dalle source - # inchangée) re-découpe depuis les sous-tuiles déjà présentes, sans - # ré-encoder ces dernières (des minutes de CPU par rebuild). + # Full resolution + intermediate thumbnail on one side, thumbnails + # on the other: a thumbnail size change (source tile unchanged) + # re-cuts from the existing sub-tiles, without re-encoding them + # (minutes of CPU per rebuild). heavy_fresh = all(_fresh(stem + ext) and _fresh(stem + '_mid.webp') for stem in stems.values()) thumbs_fresh = all(_fresh(stem + thumb_suffix) for stem in stems.values()) if heavy_fresh and not thumbs_fresh: - logger.info(f" Vignettes de sous-tuiles recalculées : " - f"{tile['dir_name']}/{viz_key} ({len(stems)} découpages)") + logger.info(f" Sub-tile thumbnails recomputed: " + f"{tile['dir_name']}/{viz_key} ({len(stems)} crops)") try: for stem in stems.values(): with PILImage.open(str(output_dir / sub_dir_name / (stem + ext))) as q: @@ -925,14 +917,14 @@ def _build_subtiles(tile, offered_viz_keys, output_dir, sub_dir_name): if q.mode not in ('RGB', 'L'): q = q.convert('RGB') _save_subtile_thumb(q, output_dir / sub_dir_name / (stem + thumb_suffix)) - # Vignette 256 px d'une génération précédente + # 256 px thumbnail from a previous generation (output_dir / sub_dir_name / (stem + '_thumb.webp')).unlink(missing_ok=True) except Exception as e: - logger.debug(f"Re-découpe des vignettes impossible ({viz_key}) : {e}") + logger.debug(f"Could not re-cut the thumbnails ({viz_key}): {e}") heavy_fresh = False if not heavy_fresh: - logger.info(f" Sous-tuiles recalculées : {tile['dir_name']}/{viz_key} " - f"({len(stems)} découpages)") + logger.info(f" Sub-tiles recomputed: {tile['dir_name']}/{viz_key} " + f"({len(stems)} crops)") img = None for attempt in range(2): try: @@ -940,29 +932,29 @@ def _build_subtiles(tile, offered_viz_keys, output_dir, sub_dir_name): img.load() break except Exception as e: - # Rebuild incrémental pendant un run : la dalle source - # peut être en cours d'écriture par un worker voisin - # (lecture partielle). Une tentative après une courte - # pause suffit presque toujours. + # Incremental rebuild during a run: the source tile may + # be being written by another worker (partial read). + # One retry after a short pause is almost always + # enough. if attempt == 0: time.sleep(2.0) continue - logger.warning(f"Sous-tuilage {viz_key} impossible après " - f"nouvelle tentative ({src.name}) : {e}") + logger.warning(f"Could not cut {viz_key} into sub-tiles after " + f"a retry ({src.name}): {e}") _fallback_full_dalle(entries, viz_key, info) if img is None: continue try: write_subtiles(output_dir, tile['dir_name'], viz_key, img, k, sub_dir_name) except Exception as e: - logger.warning(f"Encodage des sous-tuiles impossible ({tile['dir_name']}), " - f"repli dalle entière pour {viz_key} : {e}") + logger.warning(f"Could not encode the sub-tiles ({tile['dir_name']}), " + f"whole-tile fallback for {viz_key}: {e}") _fallback_full_dalle(entries, viz_key, info) continue - # Chaque URL est versionnée par la mtime de SON fichier (cf. - # _url_version) : le chemin court « vignettes seules recalculées » - # ci-dessus ne change pas les URLs des AVIF/mid non réécrits — - # le cache immutable du navigateur reste valable pour eux. + # Each URL is versioned by the mtime of ITS file (see + # _url_version): the "thumbnails only recomputed" shortcut above + # does not change the URLs of the AVIF/mid files not rewritten — + # the browser's immutable cache stays valid for them. def _file_v(name): return _url_version(_mtime(output_dir / sub_dir_name / name)) @@ -973,14 +965,14 @@ def _build_subtiles(tile, offered_viz_keys, output_dir, sub_dir_name): 'full': f"{sub_dir_name}/{stem}{ext}{_file_v(stem + ext)}", } except Exception as e: - logger.warning(f"Sous-tuilage abandonné pour {tile['dir_name']}: {e}") + logger.warning(f"Sub-tiling abandoned for {tile['dir_name']}: {e}") return None usable = [e for e in entries.values() if e['viz']] if not usable: return None - # Repli dalle entière pour les visualisations hors sélection : elles - # restent superposables en couche (images plus lourdes, mais fonctionnelles). + # Whole-tile fallback for the visualizations outside the selection: they + # still work as layers (heavier images, but functional). sub_keys = set(offered_viz_keys) for viz_key, info in tile['viz'].items(): if viz_key not in sub_keys: @@ -989,11 +981,11 @@ def _build_subtiles(tile, offered_viz_keys, output_dir, sub_dir_name): def _viz_src_dir(tile, info): - """Dossier réel du fichier d'une visualisation. + """Actual directory of a visualization's file. - Les couches fusionnées d'une autre résolution (run interrompu entre les - deux passes) vivent dans leur dossier d'origine — info['dir_name'] — et - non dans dir_path de la dalle affichée. + Layers merged from another resolution (run interrupted between the two + passes) live in their original directory — info['dir_name'] — and not + in the dir_path of the displayed tile. """ d = info.get('dir_name') or tile.get('dir_name') if d and d != Path(tile['dir_path']).name: @@ -1002,11 +994,11 @@ def _viz_src_dir(tile, info): def _collect_tile_metadata(tile, dtm_dir): - """Rassemble les métadonnées de génération d'une tuile. + """Gather the generation metadata of a tile. - Lit la méthode de classification du sol depuis le sidecar DTM - (output/DTM/{basename}_dtm{suffix}_method.txt, écrit par pipeline.py), - et les dates/tailles des fichiers de visualisation. + Reads the ground classification method from the DTM sidecar + (output/DTM/{basename}_dtm{suffix}_method.txt, written by pipeline.py), + and the dates/sizes of the visualization files. Returns: {method: str|None, generated: str|None, @@ -1016,20 +1008,20 @@ def _collect_tile_metadata(tile, dtm_dir): suffix = _res_suffix_str(tile['resolution']) method_file = Path(dtm_dir) / f"{tile['basename']}_dtm{suffix}_method.txt" if not method_file.exists() and suffix: - # La classification du sol est partagée entre résolutions : repli sur - # le sidecar de la résolution primaire si le spécifique manque. + # Ground classification is shared across resolutions: fall back to + # the primary resolution's sidecar if the specific one is missing. method_file = Path(dtm_dir) / f"{tile['basename']}_dtm_method.txt" try: if method_file.exists(): method = method_file.read_text(encoding='utf-8').strip() if method: meta['method'] = method - # Le sidecar est écrit juste après la création du DTM : - # sa date ≈ date de génération de la dalle. + # The sidecar is written right after the DTM is created: + # its date ≈ the tile's generation date. meta['generated'] = datetime.fromtimestamp( method_file.stat().st_mtime).strftime('%Y-%m-%d %H:%M') except OSError as e: - logger.debug(f"Métadonnées illisibles {method_file.name}: {e}") + logger.debug(f"Unreadable metadata {method_file.name}: {e}") for viz_key, info in tile['viz'].items(): try: @@ -1049,19 +1041,20 @@ def _collect_tile_metadata(tile, dtm_dir): def build_index(output_dir, output_format='avif'): - """Régénère le catalogue des tuiles traitées : vignettes + inventaire. + """Rebuild the catalog of processed tiles: thumbnails + inventory. - Scanne output_dir/visualisations/, collecte les métadonnées de génération, - génère les vignettes JPEG (index_thumbs/) et les sous-tuiles - (index_subtiles/) — paliers sources de la pyramide XYZ (tiles.py) — puis - écrit l'inventaire output/index_tiles.json (servi par /api/tiles). + Scans output_dir/visualisations/, collects the generation metadata, + generates the JPEG thumbnails (index_thumbs/) and the sub-tiles + (index_subtiles/) — source levels of the XYZ pyramid (tiles.py) — then + writes the inventory output/index_tiles.json (served by /api/tiles). Args: - output_dir: dossier de sortie racine (contient visualisations/). - output_format: format des images ('avif' ou 'webp') — pour info. + output_dir: root output directory (contains visualisations/). + output_format: image format ('avif' or 'webp') — unused, kept for + call compatibility. Returns: - Path vers index_tiles.json si succès, None si échec ou aucune tuile. + Path to index_tiles.json on success, None on failure or if there is no tile. """ output_dir = Path(output_dir) vis_dir = output_dir / 'visualisations' @@ -1070,16 +1063,15 @@ def build_index(output_dir, output_format='avif'): tiles = scan_tiles(vis_dir) if not tiles: - logger.info("Aucune tuile traitée trouvée — index global non généré") + logger.info("No processed tile found — global index not generated") return None - # Bounds GPS par tuile (géoréférencement exact pour la carte Leaflet) + # GPS bounds per tile (exact georeferencing for the Leaflet map) attach_gps_bounds(tiles) - # Une seule tuile par position (col, row) : on garde la résolution la plus - # fine disponible. Sinon les versions 0,5 m et 0,2 m d'une même dalle se - # superposent exactement sur la carte et celle ajoutée en dernier dans le - # DOM (la moins résolue, tri croissant) masque l'autre. + # A single tile per position (col, row): keep the finest available + # resolution. Otherwise the 0.5 m and 0.2 m versions of the same tile + # would overlap exactly on the map and one would hide the other. best_by_pos = {} tiles_by_pos = {} for t in tiles: @@ -1087,12 +1079,12 @@ def build_index(output_dir, output_format='avif'): tiles_by_pos.setdefault(key, []).append(t) if key not in best_by_pos or t['resolution'] < best_by_pos[key]['resolution']: best_by_pos[key] = t - # Complète chaque dalle affichée (résolution la plus fine) avec les - # visualisations produites uniquement à l'autre résolution : sans cela, - # une couche en cours de génération (passe 0,5 m faite, 0,2 m pas encore) - # reste invisible sur la carte et absente du panneau de couches. - # dir_name mémorise le dossier d'origine : vignettes, URLs et métadonnées - # doivent lire le fichier là où il existe réellement. + # Complete each displayed tile (finest resolution) with the + # visualizations produced only at the other resolution: otherwise a layer + # being generated (0.5 m pass done, 0.2 m not yet) would stay invisible + # on the map and missing from the layer list. + # dir_name records the original directory: thumbnails, URLs and metadata + # must read the file where it actually exists. for key, best in best_by_pos.items(): for other in tiles_by_pos[key]: if other is best: @@ -1103,33 +1095,33 @@ def build_index(output_dir, output_format='avif'): tiles = sorted(best_by_pos.values(), key=lambda t: (t['resolution'], -t['row'], t['col'])) - # Détecter les zones géographiques (pour info uniquement) + # Detect the geographic zones (for information only) zones = compute_zones(tiles) - logger.info(f" {len(zones)} zone(s) détectée(s)") + logger.info(f" {len(zones)} zone(s) detected") thumb_dir = output_dir / 'index_thumbs' thumb_dir.mkdir(parents=True, exist_ok=True) - # Collecte toutes les visualisations disponibles (pour le panneau de couches). + # Collect every available visualization (for the layer list). all_viz_keys = set() for t in tiles: all_viz_keys.update(t['viz'].keys()) - # Restreint le découpage en sous-tuiles aux visualisations choisies + # Restrict the sub-tile cutting to the chosen visualizations if _CARTO_SUBTILED_VIZ: sub_viz = [v for v in _CARTO_SUBTILED_VIZ if v in all_viz_keys] if sub_viz: - logger.info(f" Sous-tuilage limité à : {', '.join(sub_viz)}") + logger.info(f" Sub-tiling limited to: {', '.join(sub_viz)}") else: sub_viz = list(all_viz_keys) - # Génère les vignettes et construit les données pour le HTML. + # Generate the thumbnails and build the inventory records. zone_records = [] thumbs_generated = 0 thumbs_failed = 0 tile_idx = 0 n_tiles = len(tiles) - logger.info(f" Vignettes : {n_tiles} tuile(s) × {len(all_viz_keys)} visualisation(s)") + logger.info(f" Thumbnails: {n_tiles} tile(s) × {len(all_viz_keys)} visualization(s)") for zone in zones: zone_tile_records = [] for t in zone['tiles']: @@ -1137,15 +1129,15 @@ def build_index(output_dir, output_format='avif'): viz_thumbs = {} regen = 0 for viz_key, info in t['viz'].items(): - # Les couches fusionnées d'une autre résolution vivent dans - # leur dossier d'origine (info['dir_name']), pas dir_path. + # Layers merged from another resolution live in their + # original directory (info['dir_name']), not dir_path. src = _viz_src_dir(t, info) / info['filename'] src_mtime = _mtime(src) thumb_name = f"{t['dir_name']}_{viz_key}.jpg" thumb_path = thumb_dir / thumb_name mid_name = f"{t['dir_name']}_{viz_key}_mid.jpg" mid_path = thumb_dir / mid_name - # Régénère si manquante ou périmée (tuile recalculée depuis) + # Regenerate if missing or stale (tile recomputed since) if (not _cached_file_fresh(thumb_path, src_mtime) or not _cached_file_fresh(mid_path, src_mtime)): if generate_thumbnail(src, thumb_path, mid_path=mid_path, @@ -1158,12 +1150,12 @@ def build_index(output_dir, output_format='avif'): else: thumbs_generated += 1 viz_dir_name = _viz_src_dir(t, info).name - # Chaque URL versionnée par la mtime de SON fichier (cf. - # _url_version) : cache navigateur immutable possible. + # Each URL versioned by the mtime of ITS file (see + # _url_version): immutable browser cache possible. viz_thumbs[viz_key] = { 'thumb': f"index_thumbs/{thumb_name}" f"{_url_version(_mtime(thumb_path))}", - # La dalle source EST le fichier servi : sa mtime suffit. + # The source tile IS the served file: its mtime is enough. 'full': f"visualisations/{viz_dir_name}/{info['filename']}" f"{_url_version(src_mtime)}", } @@ -1173,7 +1165,7 @@ def build_index(output_dir, output_format='avif'): if regen: logger.info(f" [{tile_idx}/{n_tiles}] {t['dir_name']} — " - f"{regen} vignette(s) régénérée(s)") + f"{regen} thumbnail(s) regenerated") if not viz_thumbs: continue @@ -1201,15 +1193,15 @@ def build_index(output_dir, output_format='avif'): }) if not zone_records: - logger.warning("Aucune vignette générée — index global abandonné") + logger.warning("No thumbnail generated — global index abandoned") return None - # Calculer le bbox global (pour la stat bar) + # Compute the global bbox (for the summary log below) global_bbox = compute_bbox(tiles) - # HTML avec données intégrées : liste plate des quads affichables. - # Les dalles 0,2 m (5000×5000 px) sont découpées en sous-tuiles 500 m - # (quadrants 2500×2500 px) pour alléger mémoire et chargements navigateur. + # Flat list of displayable quads for the inventory. + # 0.2 m tiles (5000×5000 px) are cut into 500 m sub-tiles + # (2500×2500 px quadrants) to lighten memory use and loading. sub_dir_name = 'index_subtiles' display_tiles = [] n_dalles = 0 @@ -1224,11 +1216,11 @@ def build_index(output_dir, output_format='avif'): else: display_tiles.append(t) if n_sous: - logger.info(f" {n_sous} sous-tuiles générée(s) pour {n_dalles} dalle(s)") + logger.info(f" {n_sous} sub-tile(s) generated for {n_dalles} tile(s)") - # Inventaire des dalles (index_tiles.json) : mapserve le sert via - # /api/tiles aux machines légères (LIDAR_SOURCE_URL) ; le pipeline le - # réécrit après chaque tuile en mode incrémental (--incremental-index). + # Tile inventory (index_tiles.json): mapserve serves it via /api/tiles + # to the lightweight machines (LIDAR_SOURCE_URL); the pipeline rewrites + # it after every tile by default (unless --no-index). viz_meta = {k: {'label': VIZ_LABELS.get(k, k)} for k in _VIZ_FALLBACK_ORDER if k in all_viz_keys} for k in sorted(all_viz_keys): @@ -1239,16 +1231,16 @@ def build_index(output_dir, output_format='avif'): 'tiles': display_tiles, 'viz_meta': viz_meta, 'stats': {'n_tiles': len(display_tiles)}, - # Qualité par dalle (encart de l'export PDF) : recopiée sur les - # machines légères pour rester disponible amont éteint. + # Per-tile quality (PDF export inset): copied to the lightweight + # machines so it stays available when the upstream is down. 'quality': load_quality_table(output_dir), }, ensure_ascii=False), encoding='utf-8') - logger.info(f"Inventaire généré : {inventory_path} " + logger.info(f"Inventory generated: {inventory_path} " f"({time.time() - t_start:.1f}s)") - logger.info(f" {len(tiles)} tuile(s) • {thumbs_generated} vignette(s) générée(s)" - + (f" • {thumbs_failed} échec(s)" if thumbs_failed else "")) - logger.info(f" Grille : {global_bbox['min_col']}-{global_bbox['max_col']} km E × " + logger.info(f" {len(tiles)} tile(s) • {thumbs_generated} thumbnail(s) generated" + + (f" • {thumbs_failed} failure(s)" if thumbs_failed else "")) + logger.info(f" Grid: {global_bbox['min_col']}-{global_bbox['max_col']} km E × " f"{global_bbox['min_row']}-{global_bbox['max_row']} km N") return inventory_path diff --git a/lidar_pipeline/mapserve.py b/lidar_pipeline/mapserve.py index 53fe1af..8c858d3 100644 --- a/lidar_pipeline/mapserve.py +++ b/lidar_pipeline/mapserve.py @@ -1,57 +1,63 @@ -"""Serveur de tuiles XYZ + carte « slippy » + génération (image lidar-maps). +"""XYZ tile server + slippy map + generation (lidar-maps image). -Sert la pyramide de tuiles décrite dans `tiles.py` selon le schéma -OpenStreetMap/Google Maps, donc directement utilisable comme fond d'imagerie -dans JOSM, iD, QGIS, uMap, MapLibre ou OsmAnd : +Serves the tile pyramid described in `tiles.py` using the +OpenStreetMap/Google Maps scheme, so it can be used directly as an imagery +background in JOSM, iD, QGIS, uMap, MapLibre or OsmAnd: - GET /tiles/{couche}/{z}/{x}/{y}.png 256 px, PNG RGBA (canonique) - GET /tiles/{couche}/{z}/{x}/{y}@2x.webp 512 px, WebP (interface interne) - GET /tiles/{couche}.json TileJSON 3.0.0 - GET /tiles/wmts.xml capacités WMTS 1.0.0 (QGIS…) - GET /tiles/josm.imagery.xml fichier d'imagerie JOSM - GET /api/map/meta couches, zooms, emprise, version - GET /api/map/tile?lat&lng dalle sous le point (fiche info) - POST /api/map/warm pré-calcul d'une emprise - GET / et /assets/* interface de consultation + GET /tiles/{layer}/{z}/{x}/{y}.png 256 px, RGBA PNG (canonical) + GET /tiles/{layer}/{z}/{x}/{y}@2x.avif 512 px, AVIF (internal interface; + .webp/.png also accepted) + GET /tiles/{layer}.json TileJSON 3.0.0 + GET /tiles/wmts.xml WMTS 1.0.0 capabilities (QGIS…) + GET /tiles/josm.imagery.xml JOSM imagery file + GET /api/map/meta layers, zooms, extent, version + GET /api/map/tile?lat&lng tile under the point (Tile tab) + GET /api/map/ign?col&row IGN catalogue record of a tile + GET|POST|DELETE /api/map/defaults server-wide default display + POST /api/map/warm pre-render an extent + GET|POST /api/map/background background maintenance state/scan + GET /api/export/frame, /api/export/pdf printable PDF sheet + GET / and /assets/* viewing interface -Les tuiles sont rendues à la demande puis mises en cache sur disque -(`output/index_xyz/`). En mode deux machines, `LIDAR_MAPS_URL` désigne un -serveur amont : une tuile absente localement y est rapatriée (quelques dizaines -de Ko) au lieu de rapatrier les dalles entières. +Tiles are rendered on demand, then cached on disk (`output/index_xyz/`). In +two-machine mode, `LIDAR_MAPS_URL` points to an upstream server: a tile that +is missing locally is fetched from it (a few tens of KB) instead of fetching +whole source tiles. -Génération de tuiles (reprise de la webapp historique) : +Tile generation (taken over from the former webapp): - GET /api/status → état du run en cours (ou du dernier), file, tuiles - GET /api/tiles → inventaire des dalles (index_tiles.json) — sert de - serveur de dalles amont (LIDAR_SOURCE_URL) - POST /api/preview → cellules 1 km d'une bbox WGS84 à traiter - POST /api/generate → télécharge (géoplateforme IGN) puis traite - POST /api/stop → arrête le run en cours - POST /api/queue/clear → vide la file d'attente - GET /api/cell → dalle L93 sous un point (sélection à la main) + GET /api/status → state of the current (or last) run, queue, tiles + GET /api/tiles → tile inventory (index_tiles.json) — acts as the + upstream tile server (LIDAR_SOURCE_URL) + POST /api/preview → 1 km cells of a WGS84 bbox that need processing + POST /api/generate → downloads (IGN Géoplateforme), then processes + POST /api/stop → stops the current run + POST /api/queue/clear → empties the queue + GET /api/cell → L93 tile under a point (manual selection) -Sur l'image complète (worker, machine de traitement), la génération est -locale : `python -m lidar_pipeline` en sous-processus, un job à la fois, les -demandes concurrentes en file persistante. Sur l'image légère (Raspberry Pi), -`LIDAR_GENERATION_URL` délègue tout à la machine de traitement — les dalles -produites sont rapatriées à la demande via `LIDAR_SOURCE_URL` (inventaire -/api/tiles + montages statiques visualisations/, index_thumbs/, -index_subtiles/). `LIDAR_API_TOKEN` (worker) / `LIDAR_REMOTE_TOKEN` (léger) -protègent optionnellement les appels ; `LIDAR_REGEN_CIDR` réserve la -génération au réseau local (boutons masqués ailleurs). +On the full image (worker, processing machine), generation is local: +`python -m lidar_pipeline` as a subprocess, one job at a time, concurrent +requests go to a persistent queue. On the lightweight image (Raspberry Pi), +`LIDAR_GENERATION_URL` delegates everything to the processing machine — the +produced tiles are fetched on demand through `LIDAR_SOURCE_URL` (inventory +/api/tiles + static mounts visualisations/, index_thumbs/, index_subtiles/). +`LIDAR_API_TOKEN` (worker) / `LIDAR_REMOTE_TOKEN` (lightweight) optionally +protect the calls; `LIDAR_REGEN_CIDR` restricts generation to the local +network (Generation tab hidden elsewhere). -Sur une petite machine (Raspberry Pi), deux réglages inversent la charge : +On a small machine (Raspberry Pi), two settings invert the load: -- `LIDAR_TILE_CACHE_ONLY=1` — la navigation ne rend plus RIEN : une tuile - absente est servie transparente (`X-Tile-Pending: 1`, jamais mémorisée par - le navigateur) et apparaît après passage de la maintenance ; -- `LIDAR_TILE_BACKGROUND=1` — une tâche de fond surveille les dalles - (nouvelles ou régénérées) et met leur pyramide à jour en file d'attente, - un rendu à la fois, à basse priorité (`os.nice`) et cadencé - (`LIDAR_TILE_BACKGROUND_PAUSE`). Premier démarrage = reconstruction de - toute la pyramide jusqu'à `LIDAR_TILE_BACKGROUND_MAX_Z` (les tuiles déjà - fraîches ne coûtent qu'un `stat`). `POST /api/map/background` force un scan, - `POST /api/map/warm` reste le pré-calcul manuel exhaustif. +- `LIDAR_TILE_CACHE_ONLY=1` — browsing no longer renders stored levels: a + missing tile is served transparent (`X-Tile-Pending: 1`, never cached by + the browser) and appears once the maintenance has processed it (levels that + are not stored are still rendered on the fly); +- `LIDAR_TILE_BACKGROUND=1` — a background task watches the source tiles + (new or regenerated) and queues their pyramid for update, one render at a + time, at low priority (`os.nice`) and paced (`LIDAR_TILE_BACKGROUND_PAUSE`). + First start = rebuild of the whole pyramid up to + `LIDAR_TILE_BACKGROUND_MAX_Z` (tiles that are already fresh only cost a + `stat`). `POST /api/map/background` forces a scan, `POST /api/map/warm` + remains the exhaustive manual pre-render. """ import json @@ -86,7 +92,7 @@ from .mapui import ASSETS_DIRNAME, render_html, ui_version, write_map_assets OUTPUT_DIR = Path(os.environ.get("LIDAR_OUTPUT_DIR", "/data/output")) INPUT_DIR = Path(os.environ.get("LIDAR_INPUT_DIR", "/data/input")) PORT = int(os.environ.get("LIDAR_PORT", "8975")) -# Serveur de tuiles amont (machine de traitement) — mode deux machines. +# Upstream tile server (processing machine) — two-machine mode. MAPS_URL = (os.environ.get("LIDAR_MAPS_URL") or "").rstrip("/") ATTRIBUTION = os.environ.get( "LIDAR_ATTRIBUTION", @@ -94,57 +100,57 @@ ATTRIBUTION = os.environ.get( '— Licence Ouverte 2.0') ATTRIBUTION_TEXT = re.sub(r"<[^>]+>", "", ATTRIBUTION).replace("©", "©").replace("—", "—") -# Rendus simultanés : plafond bas par défaut — une carte se consulte souvent -# depuis une petite machine (Raspberry Pi), et un rendu décode une dalle AVIF -# de plusieurs dizaines de Mo. Les requêtes en excès attendent le sémaphore -# sans consommer de CPU. `LIDAR_TILE_WORKERS` relève le plafond sur une -# machine confortable. +# Concurrent renders: low cap by default — the map is often served from a +# small machine (Raspberry Pi), and a render decodes an AVIF source tile of +# several tens of MB. Excess requests wait on the semaphore without using +# CPU. `LIDAR_TILE_WORKERS` raises the cap on a well-equipped machine. TILE_WORKERS = max(1, int(os.environ.get("LIDAR_TILE_WORKERS", "2") or 2)) _render_sem = threading.Semaphore(TILE_WORKERS) -# Machine de traitement distante (webapp légère type Raspberry Pi) : si -# définie, la génération (téléchargement IGN + traitement) y est déléguée. +# Remote processing machine (lightweight map such as a Raspberry Pi): when +# set, generation (IGN download + processing) is delegated to it. GENERATION_URL = (os.environ.get("LIDAR_GENERATION_URL") or "").rstrip("/") -# Jeton partagé : la webapp légère le présente à la machine de traitement -# (LIDAR_REMOTE_TOKEN ici, LIDAR_API_TOKEN là-bas). Optionnel. +# Shared token: the lightweight map presents it to the processing machine +# (LIDAR_REMOTE_TOKEN here, LIDAR_API_TOKEN over there). Optional. REMOTE_TOKEN = os.environ.get("LIDAR_REMOTE_TOKEN") or None API_TOKEN = os.environ.get("LIDAR_API_TOKEN") or None -# Réseau autorisé à lancer la (re)génération des tuiles (/api/generate) : -# liste de CIDR séparés par virgules, vide = restriction levée. Par défaut : -# boucle locale + plages privées RFC1918 — couvre le LAN, la machine hôte -# Docker (passerelles 172.x) et localhost, tout en refusant les clients -# venus d'Internet. L'IP du client est l'IP de connexion (conservée par le -# DNAT Docker) ; si elle est dans le réseau autorisé, X-Forwarded-For est -# honoré (reverse proxy local — un client distant ne peut pas le forger -# puisque sa connexion directe est déjà hors réseau). +# Network allowed to start tile (re)generation (/api/generate, and also +# /api/preview, /api/stop, /api/queue/clear): comma-separated list of CIDRs, +# empty = no restriction. Default: loopback + RFC 1918 private ranges — +# covers the LAN, the Docker host (172.x gateways) and localhost, while +# rejecting clients coming from the Internet. The client IP is the +# connection IP (preserved by Docker DNAT); if it is inside the allowed +# network, X-Forwarded-For is honoured (local reverse proxy — a remote +# client cannot forge it since its direct connection is already outside). REGEN_CIDR = (os.environ.get( "LIDAR_REGEN_CIDR", "127.0.0.0/8,::1,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16") or "").strip() -# Résolution de génération (politique 0,2 m seule — cf. webapp historique). +# Generation resolution (policy: 0.2 m only — see AGENTS.md). GENERATE_RESOLUTIONS = (0.2,) GROUND_CLASS_METHODS = ("auto", "ign", "smrf", "csf") -MAX_CELLS = 400 # garde-fou : ~400 km² max par demande (zones dessinées) -MAX_CELLS_ALL = 10000 # garde-fou : passe globale « tout compléter » (dalles déjà présentes) +MAX_CELLS = 400 # safeguard: ~400 km² max per request (drawn areas) +MAX_CELLS_ALL = 10000 # safeguard: global "complete everything" pass (tiles already present) LOG_FILE = OUTPUT_DIR / ".generation.log" JOB_FILE = OUTPUT_DIR / ".generation.job.json" QUEUE_FILE = OUTPUT_DIR / ".generation.queue.json" # --------------------------------------------------------------------------- -# Maintenance de la pyramide en tâche de fond (petites machines) +# Background pyramid maintenance (small machines) # --------------------------------------------------------------------------- # -# `LIDAR_TILE_BACKGROUND=1` + `LIDAR_TILE_CACHE_ONLY=1` inversent la charge : -# la navigation ne rend plus rien (lecture cache seule), une sondeur rescane -# les dalles à intervalle régulier et chaque dalle nouvelle/régénérée met sa -# pyramide de tuiles en file ; des rendeurs à basse priorité (os.nice) la -# vident au rythme d'une tuile par LIDAR_TILE_BACKGROUND_PAUSE secondes. -# Premier passage = dalle inconnue : toute la pyramide est reconstruite (les -# tuiles déjà fraîches ne coûtent qu'un stat). +# `LIDAR_TILE_BACKGROUND=1` + `LIDAR_TILE_CACHE_ONLY=1` invert the load: +# browsing no longer renders stored levels (cache reads only), a poller +# rescans the source tiles at regular intervals (and as soon as the +# inventory changes) and every new/regenerated source tile queues its tile +# pyramid; low-priority renderers (os.nice) drain the queue at one local +# render per LIDAR_TILE_BACKGROUND_PAUSE seconds (upstream downloads are not +# paced). First pass = unknown source tile: the whole pyramid is rebuilt +# (tiles that are already fresh only cost a stat). def _env_flag(name): - """Indicateur d'environnement (1/true/yes/on/oui). Relu à chaque appel : - testable sans recharger le module.""" + """Environment flag (1/true/yes/on/oui). Re-read on every call: testable + without reloading the module.""" return (os.environ.get(name, "").strip().lower() in ("1", "true", "yes", "on", "oui")) @@ -154,11 +160,11 @@ def _bg_scale(): def _bg_conf(): - """Réglages de la maintenance (relus au démarrage des fils, cf. doc).""" + """Maintenance settings (re-read on every call, see the module doc).""" return { "interval": max(10.0, float(os.environ.get( "LIDAR_TILE_BACKGROUND_INTERVAL", "120") or 120)), - # Défaut : jusqu'au natif (18@2x = 0,2 m/px) — pyramide complète. + # Default: up to native (18@2x = 0.2 m/px) — complete pyramid. "max_z": max(tiles_mod.TILE_MIN_Z, int(os.environ.get( "LIDAR_TILE_BACKGROUND_MAX_Z", "") or (tiles_mod.TILE_MAX_NATIVE_Z - ( 0 if _bg_scale() == 1 else 1)))), @@ -181,13 +187,13 @@ _bg = {"threads": [], "stop": threading.Event(), "queue": deque(), def _bg_enqueue(items, front=False, rejected=None): - """Ajoute des tuiles (layer, z, x, y) à la file : dédupliquée, bornée. + """Add tiles (layer, z, x, y) to the queue: deduplicated, bounded. - rejected : ensemble complété des tuiles refusées faute de place. - front=True : en tête de file, dans l'ordre donné (dalles tout juste - rendues) ; une tuile déjà en file y est remontée. L'arriéré n'est pas - tronqué pour leur faire place (ses dalles ne seraient jamais reprises) : - la file déborde alors brièvement de la tête ajoutée. + rejected: set filled with the tiles refused for lack of room. + front=True: at the head of the queue, in the given order (freshly + rendered source tiles); a tile already queued is moved up. The backlog is + not truncated to make room for them (its source tiles would never be + resumed): the queue then briefly overflows by the added head. """ added = 0 with _bg["guard"]: @@ -226,18 +232,18 @@ def _bg_pop(): def background_scan(output_dir=None): - """Détecte les dalles nouvelles ou régénérées, met leurs tuiles en file. + """Detect new or regenerated source tiles and queue their tiles. - Retourne le nombre de tuiles ajoutées. La comparaison se fait sur le - mtime le plus récent des sources de chaque dalle : une dalle régénérée - n'invalide que ses propres tuiles (même règle que le cache). + Returns the number of tiles added. The comparison uses the most recent + mtime of each source tile's sources: a regenerated source tile only + invalidates its own tiles (same rule as the cache). """ output_dir = Path(output_dir or OUTPUT_DIR) conf = _bg_conf() first_scan = _bg["snapshot"] is None snapshot = {} changed = {} - resume = {} # dalle inchangée, pyramide pas encore toute en file → reprise + resume = {} # unchanged source tile, pyramid not fully queued yet → resume for layer, per_cell in tiles_mod.source_index(output_dir, force=True).items(): for (col, row), tiers in per_cell.items(): newest = 0.0 @@ -255,12 +261,12 @@ def background_scan(output_dir=None): continue changed.setdefault(layer, []).append((col, row)) _bg["snapshot"] = snapshot - # Carte alimentée par un serveur de dalles amont (Pi) : les sources des - # dalles nouvelles ou modifiées sont rapatriées et GARDÉES localement, - # sans attendre une visite — les niveaux rendus à la volée restent - # disponibles quand le conteneur de rendu est éteint. - # Toutes les dalles sont revérifiées (simples tests d'existence) : une - # source manquée pendant qu'il était éteint est reprise au scan suivant. + # Map fed by an upstream tile server (Pi): the sources of new or modified + # source tiles are fetched and KEPT locally, without waiting for a visit — + # levels rendered on the fly stay available when the rendering container + # is down. + # Every source tile is re-checked (plain existence tests): a source + # missed while upstream was down is picked up again at the next scan. if tiles_mod.REMOTE_SOURCE_URL: index = tiles_mod.source_index(output_dir) pending = {str(s_.path) for s_ in _bg["prefetch"]} @@ -271,13 +277,13 @@ def background_scan(output_dir=None): if src.url is not None and key not in pending and not src.path.is_file(): _bg["prefetch"].append(src) pending.add(key) - # File bornée (queue_max) : sur un grand territoire, le premier scan la - # remplissait et le reste de la pyramide n'était jamais généré. Chaque - # dalle garde donc sa position : les tuiles refusées faute de place sont - # reprises aux scans suivants (en queue, derrière l'arriéré), à partir de - # la première refusée. Les dalles qui viennent de changer passent en - # tête (la pyramide suit le rendu en cours, hors premier scan). - order = lambda t: (t[1], t[0], t[2], t[3]) # noqa: E731 — bas niveaux d'abord + # Bounded queue (queue_max): over a large territory, the first scan used + # to fill it and the rest of the pyramid was never generated. Each source + # tile therefore keeps its position: tiles refused for lack of room are + # resumed at the next scans (at the tail, behind the backlog), from the + # first refused one. Source tiles that just changed go to the head (the + # pyramid follows the current run, except on the first scan). + order = lambda t: (t[1], t[0], t[2], t[3]) # noqa: E731 — low levels first items, retry, per_cell = [], [], {} for layer, cells in changed.items(): for col, row in cells: @@ -311,20 +317,21 @@ def background_scan(output_dir=None): _bg["stats"]["ajouts_dernier_scan"] = added cells_changed = sum(len(v) for v in changed.values()) if items: - logger.info(f"Maintenance des tuiles : {cells_changed} dalle(s) " - f"modifiée(s), {added} tuile(s) en file") + logger.info(f"Tile maintenance: {cells_changed} source tile(s) " + f"changed, {added} tile(s) queued") return added def _bg_process_one(): - """Traite une tuile de la file, sinon une source à rapatrier. Vrai si - un travail a été fait : "telechargee" pour une tuile téléchargée de - l'amont (enchaînée sans pause : le worker encaisse), True pour un rendu - local ou un rapatriement de source (suivis de la pause). + """Process one tile from the queue, otherwise one source to fetch. + Truthy if some work was done: "telechargee" for a tile downloaded from + upstream (chained without a pause: the worker can take it), True for a + local render or a source fetch (followed by the pause). False when there + was nothing to do or the source fetch failed. - Tuiles d'abord : légères et visibles tout de suite, elles ne doivent pas - attendre des milliers de sources (utiles aux seuls forts zooms rendus à - la volée). Les tuiles déjà à jour sont passées sans pause. + Tiles first: light and visible immediately, they must not wait behind + thousands of sources (only useful to the high zooms rendered on the + fly). Tiles that are already up to date are skipped without a pause. """ conf = _bg_conf() while True: @@ -345,11 +352,11 @@ def _bg_process_one(): if src.ensure(): _bg["stats"]["sources_locales"] = _bg["stats"].get("sources_locales", 0) + 1 return True - return False # amont éteint : repris au prochain scan + return False # upstream down: retried at the next scan if MAPS_URL: - # Serveur de tuiles amont : la pyramide est TÉLÉCHARGÉE en tâche de - # fond (quelques dizaines de Ko, aucun décodage de dalle) ; la carte - # se remplit sans visite et reste servie ensuite sans l'amont. + # Upstream tile server: the pyramid is DOWNLOADED in the background + # (a few tens of KB, no source tile decoding); the map fills up + # without any visit and is then served without upstream. suffix = "@2x" if conf["scale"] == 2 else "" data = _fetch_upstream(f"tiles/{layer}/{z}/{x}/{y}{suffix}.{conf['fmt']}") if data: @@ -358,7 +365,7 @@ def _bg_process_one(): conf["scale"], conf["fmt"]), data) _bg["stats"]["telechargees"] = _bg["stats"].get("telechargees", 0) + 1 return "telechargee" - # Amont absent ou éteint : rendu local depuis les sources gardées (autonomie). + # No upstream, or upstream down: local render from the kept sources (autonomy). tiles_mod.get_tile(OUTPUT_DIR, layer, z, x, y, conf["scale"], conf["fmt"]) _bg["stats"]["rendues"] += 1 return True @@ -366,26 +373,26 @@ def _bg_process_one(): def _bg_worker(): try: - os.nice(10) # consommation minimale : le rendu cède aux autres usages - except (AttributeError, OSError): # pragma: no cover — nice indisponible + os.nice(10) # minimal footprint: rendering yields to other workloads + except (AttributeError, OSError): # pragma: no cover — nice unavailable pass while not _bg["stop"].is_set(): try: rendered = _bg_process_one() - except Exception as e: # noqa: BLE001 — une tuile n'arrête pas la file - logger.warning(f"Maintenance des tuiles : rendu impossible ({e})") + except Exception as e: # noqa: BLE001 — one tile does not stop the queue + logger.warning(f"Tile maintenance: render failed ({e})") rendered = False if rendered == "telechargee": - continue # téléchargement : aucun calcul local, pas de pause + continue # download: no local computation, no pause if rendered: - _bg["stop"].wait(_bg_conf()["pause"]) # cadence : un rendu, une pause + _bg["stop"].wait(_bg_conf()["pause"]) # pacing: one render, one pause else: _bg["stop"].wait(0.5) def _inventory_mark(): - """Signature bon marché de l'inventaire des dalles (fichier local ou - charge utile amont), pour déclencher un scan dès qu'une dalle arrive.""" + """Cheap signature of the tile inventory (local file or upstream payload), + used to trigger a scan as soon as a source tile arrives.""" try: return (OUTPUT_DIR / "index_tiles.json").stat().st_mtime except OSError: @@ -399,7 +406,7 @@ def _inventory_mark(): return None -BG_WATCH_S = 10.0 # surveillance de l'inventaire pendant les runs +BG_WATCH_S = 10.0 # inventory watch interval during runs def _bg_poller(): @@ -410,14 +417,14 @@ def _bg_poller(): if due or mark != last_mark: try: background_scan() - except Exception as e: # noqa: BLE001 — prochain scan au prochain tour - logger.warning(f"Maintenance des tuiles : scan impossible ({e})") + except Exception as e: # noqa: BLE001 — next scan on the next round + logger.warning(f"Tile maintenance: scan failed ({e})") last_scan, last_mark = time.time(), mark _bg["stop"].wait(min(BG_WATCH_S, _bg_conf()["interval"])) def start_background(): - """Démarre la maintenance : 1 sondeur + TILE_WORKERS rendeurs cadencés.""" + """Start the maintenance: 1 poller + TILE_WORKERS paced renderers.""" if _bg["running"]: return _bg["stop"].clear() @@ -431,10 +438,10 @@ def start_background(): t.start() _bg["threads"] = threads conf = _bg_conf() - logger.info(f"Maintenance des tuiles active : z ≤ {conf['max_z']} " - f"@{conf['scale']}x {conf['fmt']}, scan toutes les " - f"{conf['interval']:.0f} s, pause {conf['pause']:.1f} s " - f"entre rendus locaux (téléchargements sans pause)") + logger.info(f"Tile maintenance enabled: z ≤ {conf['max_z']} " + f"@{conf['scale']}x {conf['fmt']}, scan every " + f"{conf['interval']:.0f} s, {conf['pause']:.1f} s pause " + f"between local renders (downloads not paced)") def stop_background(): @@ -466,10 +473,10 @@ if not logger.handlers: logger.addHandler(_h) logger.setLevel(logging.INFO) -app = FastAPI(title="Carte LiDAR — tuiles XYZ", lifespan=_lifespan) +app = FastAPI(title="LiDAR map — XYZ tiles", lifespan=_lifespan) -# Assets de l'interface : bâchés dans l'image au build, régénérés ici en repli -# (dev, paquet installé sans bake). +# Interface assets: baked into the image at build time, regenerated here as a +# fallback (dev, package installed without baking). _assets_dir = Path(__file__).resolve().parent / ASSETS_DIRNAME if not (_assets_dir / "app.js").is_file(): try: @@ -483,7 +490,7 @@ _pipeline_import_cache = {} def _pipeline_importable(): - """Vrai si le pipeline de traitement est importable (image complète).""" + """True if the processing pipeline can be imported (full image).""" if "ok" not in _pipeline_import_cache: try: import lidar_pipeline.pipeline # noqa: F401 @@ -493,26 +500,26 @@ def _pipeline_importable(): return _pipeline_import_cache["ok"] -logger.info(f"Carte LiDAR (tuiles XYZ) — sortie {OUTPUT_DIR}" - + (f", amont {MAPS_URL}" if MAPS_URL else ", rendu local") - + f", {TILE_WORKERS} rendu(s) simultané(s)" - + f", {tiles_mod.FETCH_WORKERS} téléchargement(s) simultané(s)" - + f", cache sources {tiles_mod.SOURCE_CACHE_BYTES // (1024 * 1024)} Mo") +logger.info(f"LiDAR map (XYZ tiles) — output {OUTPUT_DIR}" + + (f", upstream {MAPS_URL}" if MAPS_URL else ", local rendering") + + f", {TILE_WORKERS} concurrent render(s)" + + f", {tiles_mod.FETCH_WORKERS} concurrent download(s)" + + f", source cache {tiles_mod.SOURCE_CACHE_BYTES // (1024 * 1024)} MB") if GENERATION_URL: - logger.info(f"Backend de génération des tuiles : {GENERATION_URL} " + logger.info(f"Tile generation backend: {GENERATION_URL} " f"(LIDAR_GENERATION_URL)") elif _pipeline_importable(): - logger.info("Backend de génération des tuiles : local (pipeline complet)") + logger.info("Tile generation backend: local (full pipeline)") else: - logger.info("Backend de génération des tuiles : aucun (image légère sans " - "LIDAR_GENERATION_URL) — boutons de génération masqués") + logger.info("Tile generation backend: none (lightweight image without " + "LIDAR_GENERATION_URL) — Generation tab hidden") -# --- Dalles servies en statique (inventaire /api/tiles + rapatriement) ------- -# Une machine légère (LIDAR_SOURCE_URL pointant ici) liste ces dalles via -# /api/tiles puis les télécharge depuis ces montages : vignettes, quadrants et -# dalles complètes. Cache navigateur immutable quand l'URL porte ?v= (mtime -# posée par build_index), revalidation courte sinon. +# --- Source tiles served statically (inventory /api/tiles + fetching) ------- +# A lightweight machine (LIDAR_SOURCE_URL pointing here) lists these tiles via +# /api/tiles, then downloads them from these mounts: thumbnails, quadrants and +# full tiles. Immutable browser cache when the URL carries ?v= (mtime set by +# build_index), short revalidation otherwise. class _VersionedStaticFiles(_StaticFiles): async def get_response(self, path, scope): @@ -535,12 +542,12 @@ for _name in ("visualisations", "index_thumbs", "index_subtiles", # --------------------------------------------------------------------------- -# Utilitaires +# Utilities # --------------------------------------------------------------------------- @app.middleware("http") async def _cors(request: Request, call_next): - """CORS ouvert sur les tuiles : exigé par iD, uMap et MapLibre.""" + """Open CORS on tiles: required by iD, uMap and MapLibre.""" if request.method == "OPTIONS" and request.url.path.startswith("/tiles/"): return Response(status_code=204, headers=_cors_headers()) response = await call_next(request) @@ -556,7 +563,7 @@ def _cors_headers(): def _base_url(request: Request): - """URL publique du service (proxy inverse honoré).""" + """Public URL of the service (reverse proxy honoured).""" proto = request.headers.get("x-forwarded-proto") or request.url.scheme host = request.headers.get("x-forwarded-host") or request.headers.get("host") if not host: @@ -566,14 +573,14 @@ def _base_url(request: Request): def _layer_or_404(layer): if not _LAYER_RE.match(layer or ""): - raise HTTPException(404, "couche inconnue") + raise HTTPException(404, "unknown layer") if layer not in tiles_mod.available_layers(OUTPUT_DIR): - raise HTTPException(404, f"couche indisponible : {layer}") + raise HTTPException(404, f"layer unavailable: {layer}") return layer def _layer_infos(): - """Couches disponibles + libellés/descriptions du registre partagé.""" + """Available layers + labels/descriptions from the shared registry.""" from .index import KEYWORD_TO_STEP, VIZ_LABELS, VIZ_LEGENDS out = [] for key in tiles_mod.available_layers(OUTPUT_DIR): @@ -582,12 +589,12 @@ def _layer_infos(): "label": VIZ_LABELS.get(key, key), "description": legend.get("description", ""), "reading": list(legend.get("reading", ())), - # Nom d'étape --only du pipeline (sélecteur de génération) + # Pipeline --only step name (generation selector) "step": KEYWORD_TO_STEP.get(key, key)}) return out -# --- disjoncteur amont (mêmes réglages que webapp.py) ---------------------- +# --- upstream circuit breaker ---------------------------------------------- _UPSTREAM = {"fails": 0, "until": 0.0} _UPSTREAM_OFFLINE_AFTER = 3 _UPSTREAM_OFFLINE_SECONDS = 120.0 @@ -602,14 +609,14 @@ def _upstream_mark(ok): _UPSTREAM.update(fails=0, until=0.0) return _UPSTREAM["fails"] += 1 - # Réarmé après expiration : un amont resté éteint est resuspendu. + # Re-armed after expiry: an upstream that is still down is suspended again. if _UPSTREAM["fails"] >= _UPSTREAM_OFFLINE_AFTER and not _upstream_offline(): _UPSTREAM["until"] = time.time() + _UPSTREAM_OFFLINE_SECONDS - logger.info("Serveur de tuiles amont injoignable — tentatives suspendues 2 min") + logger.info("Upstream tile server unreachable — attempts suspended for 2 min") def _fetch_upstream(rel_path): - """Rapatrie une tuile depuis LIDAR_MAPS_URL (None si indisponible).""" + """Fetch a tile from LIDAR_MAPS_URL (None if unavailable).""" if not MAPS_URL or _upstream_offline(): return None url = f"{MAPS_URL}/{rel_path.lstrip('/')}" @@ -618,26 +625,26 @@ def _fetch_upstream(rel_path): with urllib.request.urlopen(req, timeout=20) as r: data = r.read(_MAX_UPSTREAM_BYTES + 1) if len(data) > _MAX_UPSTREAM_BYTES: - raise IOError("tuile amont trop volumineuse") + raise IOError("upstream tile too large") _upstream_mark(True) return data - except Exception as e: # noqa: BLE001 — amont éteint : rendu local/vide + except Exception as e: # noqa: BLE001 — upstream down: local/empty render _upstream_mark(False) - logger.debug(f"Tuile amont indisponible ({url}) : {e}") + logger.debug(f"Upstream tile unavailable ({url}): {e}") return None -# --- rendu : déduplication des requêtes concurrentes ------------------------ +# --- rendering: deduplication of concurrent requests ----------------------- _locks = {} _locks_guard = threading.Lock() def _acquire_lock(key): - """Verrou par tuile, compté : deux requêtes simultanées n'en rendent qu'une. + """Reference-counted per-tile lock: two simultaneous requests render once. - Le compteur évite deux écueils : un dictionnaire qui grossit sans fin (des - millions de tuiles) et un verrou retiré alors qu'un autre fil l'attend - encore — ce qui autoriserait deux rendus concurrents de la même tuile. + The counter avoids two pitfalls: a dictionary that grows forever + (millions of tiles) and a lock removed while another thread still waits + on it — which would allow two concurrent renders of the same tile. """ with _locks_guard: entry = _locks.get(key) @@ -655,7 +662,7 @@ def _release_lock(key, entry): def _tile_bytes(layer, z, x, y, scale, fmt): - """Tuile encodée : cache → rendu local → amont. None si zone vide.""" + """Encoded tile: cache → local render → upstream. None if the area is empty.""" key = (layer, z, x, y, scale, fmt) entry = _acquire_lock(key) try: @@ -663,11 +670,11 @@ def _tile_bytes(layer, z, x, y, scale, fmt): try: with _render_sem: data = tiles_mod.get_tile(OUTPUT_DIR, layer, z, x, y, scale, fmt) - except Exception as e: # noqa: BLE001 — une tuile ne casse pas la carte - logger.warning(f"Rendu de tuile impossible ({layer} {z}/{x}/{y}) : {e}") + except Exception as e: # noqa: BLE001 — one tile does not break the map + logger.warning(f"Tile render failed ({layer} {z}/{x}/{y}): {e}") data = None - # Inventaire venu de l'amont sans aucune dalle sous la tuile : - # l'amont n'en sait pas plus, inutile de l'interroger. + # Inventory from upstream with no source tile under this tile: + # upstream knows no more, no point asking it. if data is None and MAPS_URL and not ( tiles_mod.REMOTE_SOURCE_URL and not tiles_mod._contributing(OUTPUT_DIR, layer, z, x, y, scale)): @@ -687,32 +694,32 @@ _MEDIA = {"png": "image/png", "webp": "image/webp", "avif": "image/avif"} # --------------------------------------------------------------------------- -# Tuiles +# Tiles # --------------------------------------------------------------------------- @app.get("/tiles/{layer}/{z}/{x}/{name}") async def tile(layer: str, z: int, x: int, name: str, v: Optional[str] = None): - """Tuile XYZ (schéma OSM). `name` = `{y}.png` ou `{y}@2x.webp`.""" + """XYZ tile (OSM scheme). `name` = `{y}.{png|webp|avif}` or `{y}@2x.{png|webp|avif}`.""" m = _NAME_RE.match(name) if not m: - raise HTTPException(404, "nom de tuile invalide") + raise HTTPException(404, "invalid tile name") y = int(m.group(1)) scale = 2 if m.group(2) else 1 fmt = m.group(3) _layer_or_404(layer) if not tiles_mod.zoom_supported(z, scale): - raise HTTPException(404, f"zoom hors plage ({tiles_mod.TILE_MIN_Z}" + raise HTTPException(404, f"zoom out of range ({tiles_mod.TILE_MIN_Z}" f"–{tiles_mod.TILE_MAX_NATIVE_Z})") n = 2 ** z if not (0 <= x < n and 0 <= y < n): - raise HTTPException(404, "tuile hors grille") + raise HTTPException(404, "tile outside the grid") if _env_flag("LIDAR_TILE_CACHE_ONLY") and tiles_mod.zoom_cached(z, scale): - # Mode cache seule : aucune navigation ne déclenche de RENDU local. - # Une tuile absente (ex. zoom > LIDAR_TILE_BACKGROUND_MAX_Z, jamais - # couverte par la maintenance) est rapatriée du serveur amont - # LIDAR_MAPS_URL — un simple téléchargement de quelques dizaines de - # Ko, mis en cache, sans décodage ni calcul sur cette machine. + # Cache-only mode (stored levels): browsing never triggers a local + # RENDER. A missing tile (e.g. zoom > LIDAR_TILE_BACKGROUND_MAX_Z, + # never covered by the maintenance) is fetched from the upstream + # server LIDAR_MAPS_URL — a plain download of a few tens of KB, + # cached, with no decoding or computation on this machine. data, state = await run_in_threadpool( tiles_mod.cached_tile, OUTPUT_DIR, layer, z, x, y, scale, fmt) pending = state == "pending" @@ -733,8 +740,8 @@ async def tile(layer: str, z: int, x: int, name: str, v: Optional[str] = None): finally: _release_lock(key, entry) if pending: - # Tuile périmée (dalle régénérée) : l'ancienne reste affichée en - # attendant la nouvelle, plutôt qu'un trou transparent. + # Stale tile (source tile regenerated): the old one stays displayed + # until the new one arrives, rather than a transparent hole. try: data = tiles_mod.tile_cache_path(OUTPUT_DIR, layer, z, x, y, scale, fmt).read_bytes() @@ -749,8 +756,8 @@ async def tile(layer: str, z: int, x: int, name: str, v: Optional[str] = None): data = _transparent_tile(scale, fmt) headers = dict(_cors_headers()) if pending: - # Tuile à venir (rendue par la maintenance) : jamais mémorisée par le - # navigateur, la prochaine navigation la redemande et la trouve prête. + # Tile still to come (rendered by the maintenance): never cached by + # the browser, the next navigation requests it again and finds it. headers["Cache-Control"] = "no-store" headers["X-Tile-Pending"] = "1" else: @@ -761,12 +768,12 @@ async def tile(layer: str, z: int, x: int, name: str, v: Optional[str] = None): # --------------------------------------------------------------------------- -# Découverte : TileJSON, WMTS, JOSM +# Discovery: TileJSON, WMTS, JOSM # --------------------------------------------------------------------------- @app.get("/tiles/josm.imagery.xml") def josm_imagery(request: Request): - """Fichier d'imagerie JOSM : ajoute toutes les couches en une fois.""" + """JOSM imagery file: adds every layer at once.""" base = _base_url(request) bounds = tiles_mod.grid_bounds_wgs84(OUTPUT_DIR) entries = [] @@ -784,7 +791,7 @@ def josm_imagery(request: Request): f" {tiles_mod.TILE_MIN_Z}\n" f" {tiles_mod.TILE_MAX_NATIVE_Z}\n" f"{b}" - f" {_xml.escape(info['description'])}\n" + f" {_xml.escape(info['description'])}\n" f" {_xml.escape(ATTRIBUTION_TEXT)}\n" " https://geoservices.ign.fr/lidarhd\n" " other\n" @@ -798,7 +805,7 @@ def josm_imagery(request: Request): @app.get("/tiles/wmts.xml") def wmts_capabilities(request: Request): - """Capacités WMTS 1.0.0 (QGIS, ArcGIS) sur la grille GoogleMapsCompatible.""" + """WMTS 1.0.0 capabilities (QGIS, ArcGIS) on the GoogleMapsCompatible grid.""" base = _base_url(request) bounds = tiles_mod.grid_bounds_wgs84(OUTPUT_DIR) or [-180.0, -85.0, 180.0, 85.0] layers = [] @@ -833,7 +840,7 @@ def wmts_capabilities(request: Request): xmlns:ows="http://www.opengis.net/ows/1.1" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.0.0"> - Carte LiDAR HD + LiDAR HD map {_xml.escape(ATTRIBUTION_TEXT)} OGC WMTS 1.0.0 @@ -879,18 +886,18 @@ def tilejson(layer: str, request: Request): # --------------------------------------------------------------------------- -# Configuration d'affichage par défaut +# Default display configuration # --------------------------------------------------------------------------- -# L'affichage réglé depuis la carte (couche principale, mode relief / -# précision / les deux, opacité de la précision, fond) peut être figé comme -# configuration servie à TOUT nouveau navigateur : le réglage utile ne se perd -# pas dans un localStorage et se partage sans lien. +# The display set from the map (main layer, relief / precision / compare +# mode, base map) can be frozen as the configuration served to EVERY new +# browser: the useful setting is not lost in a localStorage and is shared +# without a link. The relief intensity is never part of it. DEFAULTS_FILE = OUTPUT_DIR / ".map-defaults.json" _defaults_lock = threading.Lock() def _load_defaults(): - """Configuration par défaut enregistrée, ou None si aucune.""" + """Saved default configuration, or None if there is none.""" try: data = json.loads(DEFAULTS_FILE.read_text(encoding="utf-8")) except (OSError, ValueError): @@ -906,53 +913,53 @@ def _clamp01(value, fallback=1.0): def _sanitize_defaults(req): - """Retient ce qui est connu et borné : couche réelle, mode valide, opacités 0–1.""" + """Keep only what is known and bounded: real layer, valid mode, base opacity 0–1.""" from .index import PRECISION_VIZ, VIEW_MODES known = set(tiles_mod.available_layers(OUTPUT_DIR)) - {PRECISION_VIZ} base_in = req.base if isinstance(req.base, dict) else {} base = {"on": bool(base_in.get("on", True)), "opacity": _clamp01(base_in.get("opacity"), 0.85), - # None = pas de choix explicite (le fond suit le thème côté carte) ; - # seule une valeur booléenne reçue devient un choix figé. + # None = no explicit choice (the base map follows the theme on the + # map side); only a boolean value received becomes a frozen choice. "dark": None if base_in.get("dark") is None else bool(base_in.get("dark"))} - # v: 3 distingue ce format (dark éventuellement None = pas choisi) de - # l'ancien, qui écrivait toujours dark:true (voir map_meta). + # v: 3 distinguishes this format (dark possibly None = not chosen) from + # the old one, which always wrote dark:true (see map_meta). return {"main": req.main if req.main in known else None, "mode": req.mode if req.mode in VIEW_MODES else "relief", "base": base, "v": 3, "saved_at": time.time()} class DefaultsRequest(BaseModel): - main: Optional[str] = Field(None, description="couche d'affichage principal") + main: Optional[str] = Field(None, description="main display layer") mode: str = Field("relief", description="relief | precision | compare") - precision_opacity: Optional[float] = Field(None, description="ignoré (ancien mode « les deux »)") + precision_opacity: Optional[float] = Field(None, description="ignored (former \"both\" mode)") base: dict = Field(default_factory=dict, - description="fond de carte : on, opacity, dark") + description="base map: on, opacity, dark") @app.get("/api/map/defaults") def get_defaults(): - """Configuration par défaut servie aux nouveaux navigateurs.""" + """Default configuration served to new browsers.""" return {"defaults": _load_defaults()} @app.post("/api/map/defaults") def set_defaults(req: DefaultsRequest): - """Fige l'état courant comme configuration par défaut (tous navigateurs).""" + """Freeze the current state as the default configuration (all browsers).""" data = _sanitize_defaults(req) with _defaults_lock: tmp = DEFAULTS_FILE.with_suffix(".tmp") DEFAULTS_FILE.parent.mkdir(parents=True, exist_ok=True) tmp.write_text(json.dumps(data, ensure_ascii=False), encoding="utf-8") os.replace(tmp, DEFAULTS_FILE) - logger.info(f"Configuration d'affichage par défaut enregistrée : " - f"{data['main'] or 'principale du registre'}, mode {data['mode']}") + logger.info(f"Default display configuration saved: " + f"{data['main'] or 'registry main layer'}, mode {data['mode']}") return {"enregistré": True, "defaults": data} @app.delete("/api/map/defaults") def clear_defaults(): - """Revient aux réglages du registre (index.py).""" + """Revert to the registry settings (index.py).""" with _defaults_lock: existed = DEFAULTS_FILE.exists() DEFAULTS_FILE.unlink(missing_ok=True) @@ -960,26 +967,26 @@ def clear_defaults(): # --------------------------------------------------------------------------- -# API de la carte +# Map API # --------------------------------------------------------------------------- @app.get("/api/map/meta") def map_meta(): - """Couches, zooms, emprise et version — tout l'état initial de l'interface.""" + """Layers, zooms, extent and version — the whole initial interface state.""" from .index import (DEFAULT_VIEW_MODE, PRECISION_VIZ, VIEW_MODES, default_main_layer) infos = _layer_infos() keys = [i["key"] for i in infos] saved = _load_defaults() or {} - # Configuration figée depuis la carte, sinon réglages du registre (index.py). - # Couche figée disparue, ou fichier de l'ancienne pile (clés order/on) : - # couche principale du registre. + # Configuration frozen from the map, otherwise registry settings (index.py). + # Frozen layer gone, or file from the former layer stack (order/on keys): + # registry main layer. main = saved.get("main") if main not in keys or main == PRECISION_VIZ: main = default_main_layer(keys) mode = saved.get("mode") if saved.get("mode") in VIEW_MODES else DEFAULT_VIEW_MODE - # Fichier d'avant v3 (ex-webapp) : base.dark:true systématique, jamais un - # vrai choix — servi comme "non choisi" (None, le fond suit le thème). + # Pre-v3 file (former webapp): base.dark:true always, never a real + # choice — served as "not chosen" (None, the base map follows the theme). base_default = saved.get("base") if isinstance(base_default, dict) and saved.get("v") != 3: base_default = dict(base_default, dark=None) @@ -990,18 +997,18 @@ def map_meta(): "default_mode": mode, "default_base": base_default, "defaults_saved": bool(saved), - # L'interface consomme des tuiles 512 px (2× moins de requêtes qu'en - # 256 : décisif en HTTP/1.1) ; les clients OSM gardent le 256 canonique. + # The interface consumes 512 px tiles (half as many requests as with + # 256: decisive over HTTP/1.1); OSM clients keep the canonical 256. "tile_url": "tiles/{layer}/{z}/{x}/{y}@2x.avif", - # Niveaux standard pairs seulement (stockage réduit) : l'interface - # réduit ceux du niveau supérieur aux zooms impairs. + # Even standard levels only (reduced storage): at odd zooms the + # interface downscales the tiles of the level above. "even_levels": tiles_mod.TILE_EVEN_LEVELS, "tile_size": tiles_mod.TILE_SIZE * 2, "zoom_offset": -1, "min_zoom": tiles_mod.TILE_MIN_Z, - # Numérotation standard, comme le niveau de tuile Leaflet (l'URL @2x - # est un cran en dessous via zoom_offset) : 19 = 0,2 m/px natif, - # servi en 18@2x. Annoncer 18 plafonnait l'affichage à 0,4 m/px. + # Standard numbering, like the Leaflet tile level (the @2x URL is one + # step below via zoom_offset): 19 = native 0.2 m/px, served as 18@2x. + # Announcing 18 capped the display at 0.4 m/px. "max_native_zoom": tiles_mod.TILE_MAX_NATIVE_Z, "bounds": tiles_mod.grid_bounds_wgs84(OUTPUT_DIR), "stamp": tiles_mod.tiles_stamp(OUTPUT_DIR), @@ -1011,13 +1018,13 @@ def map_meta(): } -# Fiche IGN (catalogue STAC) mise en cache par dalle : un seul appel réseau, -# une dalle non publiée est revérifiée au plus une fois par jour. +# IGN record (STAC catalogue) cached per tile: a single network call; an +# unpublished tile is re-checked at most once a day. IGN_META_RETRY_S = 86400 def _ign_tile_meta(col, row): - """Métadonnées IGN d'une dalle (acquisition, lien de téléchargement).""" + """IGN metadata of a tile (acquisition, download link).""" from .fetch_ign import tile_ign_metadata meta_dir = OUTPUT_DIR / "ign_meta" path = meta_dir / f"{col:04d}_{row:04d}.json" @@ -1030,8 +1037,8 @@ def _ign_tile_meta(col, row): try: data = tile_ign_metadata(col, row) except Exception as e: - logger.warning(f"Catalogue IGN injoignable pour {col}_{row} : {e}") - return {"found": False, "error": "catalogue IGN injoignable"} + logger.warning(f"IGN catalogue unreachable for {col}_{row}: {e}") + return {"found": False, "error": "IGN catalogue unreachable"} data["checked"] = time.time() try: meta_dir.mkdir(parents=True, exist_ok=True) @@ -1044,7 +1051,7 @@ def _ign_tile_meta(col, row): def _calage_summary(basename, suffix): - """Résumé du recalage vertical des passes (sidecar du MNT), si présent.""" + """Summary of the vertical strip alignment (DTM sidecar), if present.""" path = OUTPUT_DIR / "DTM" / f"{basename}_dtm{suffix}_stripalign.json" try: data = json.loads(path.read_text(encoding="utf-8")) @@ -1062,20 +1069,20 @@ def _calage_summary(basename, suffix): @app.get("/api/map/ign") def map_tile_ign(col: int, row: int): - """Fiche IGN d'une dalle (acquisition, capteurs, lien de téléchargement). + """IGN record of a tile (acquisition, sensors, download link). - Séparée de /api/map/tile : la sélection d'une dalle s'affiche tout de - suite, même si le catalogue IGN est lent ou injoignable. + Separate from /api/map/tile: selecting a tile displays immediately, even + when the IGN catalogue is slow or unreachable. """ return _ign_tile_meta(col, row) @app.get("/api/map/tile") def map_tile_info(lat: float, lng: float): - """Dalle LHD sous un point WGS84 : emprise, génération, recalage. + """LHD tile under a WGS84 point: extent, generation, strip alignment. - Répond toujours (dalle générée ou non) et sans appel réseau ; la fiche - IGN se charge à part (/api/map/ign). + Always answers (whether the tile is generated or not) and without any + network call; the IGN record is loaded separately (/api/map/ign). """ from .index import _collect_tile_metadata, _res_suffix_str, scan_tiles from .quality import read_quality @@ -1089,7 +1096,7 @@ def map_tile_info(lat: float, lng: float): "row": row, "name": f"LHD_FXX_{col:04d}_{row:04d}_PTS_LAMB93_IGN69", "l93_bbox": [x0, y0, x1, y1], - # coins NO, NE, SE, SO (lat, lng) : cadre de sélection sur la carte + # NW, NE, SE, SW corners (lat, lng): selection outline on the map "corners": [[round(la, 7), round(lo, 7)] for lo, la in zip(lons, lats)], } best = None @@ -1098,9 +1105,9 @@ def map_tile_info(lat: float, lng: float): continue if best is None or t["resolution"] < best["resolution"]: best = t - # Qualité (densité, dates) : sous le nom réel de la dalle rendue quand il y - # en a une (best["basename"] peut différer du nom nominal calculé depuis - # col/row) ; nom nominal sinon, faute de mieux. + # Quality (density, dates): under the real name of the rendered tile when + # there is one (best["basename"] may differ from the nominal name computed + # from col/row); nominal name otherwise, for lack of anything better. quality_name = best["basename"] if best else base["name"] q = read_quality(OUTPUT_DIR, quality_name) base["quality"] = ({"ground_density": q.get("ground_density"), @@ -1125,14 +1132,14 @@ def map_tile_info(lat: float, lng: float): class WarmRequest(BaseModel): layers: list = Field(default_factory=list, - description="couches à pré-calculer (défaut : toutes)") - z_min: int = Field(tiles_mod.TILE_MIN_Z, description="zoom minimal") - z_max: int = Field(16, description="zoom maximal (19 = résolution native)") + description="layers to pre-render (default: all)") + z_min: int = Field(tiles_mod.TILE_MIN_Z, description="minimum zoom") + z_max: int = Field(16, description="maximum zoom (19 = native resolution)") bounds: Optional[list] = Field(None, - description="[ouest, sud, est, nord] WGS84 ; " - "défaut : emprise des dalles") - scale: int = Field(1, description="1 = tuiles 256 px, 2 = 512 px (@2x)") - fmt: str = Field("png", description="png, webp ou avif") + description="[west, south, east, north] WGS84; " + "default: extent of the tiles") + scale: int = Field(1, description="1 = 256 px tiles, 2 = 512 px (@2x)") + fmt: str = Field("png", description="png, webp or avif") _warm = {"running": False, "done": None, "result": None} @@ -1140,13 +1147,13 @@ _warm = {"running": False, "done": None, "result": None} @app.post("/api/map/warm") def map_warm(req: WarmRequest): - """Pré-calcule des tuiles en tâche de fond (accélère la 1re consultation).""" + """Pre-render tiles in the background (speeds up the first visit).""" if _warm["running"]: - raise HTTPException(409, "un pré-chauffage est déjà en cours") + raise HTTPException(409, "a warm-up is already running") layers = [l for l in req.layers if _LAYER_RE.match(str(l))] or \ tiles_mod.available_layers(OUTPUT_DIR) if req.fmt not in _MEDIA: - raise HTTPException(400, f"format invalide : {req.fmt}") + raise HTTPException(400, f"invalid format: {req.fmt}") _warm.update(running=True, done=None, result=None) def _run(): @@ -1154,7 +1161,7 @@ def map_warm(req: WarmRequest): _warm["result"] = tiles_mod.warm( OUTPUT_DIR, layers, req.z_min, req.z_max, req.bounds, max(1, min(2, req.scale)), req.fmt) - except Exception as e: # noqa: BLE001 — remonté via l'état + except Exception as e: # noqa: BLE001 — reported through the state _warm["result"] = {"erreur": str(e)} finally: _warm["running"] = False @@ -1171,7 +1178,7 @@ def map_warm_status(): @app.get("/api/map/background") def background_status(): - """État de la maintenance de fond : file, compteurs, configuration.""" + """Background maintenance state: queue, counters, configuration.""" with _bg["guard"]: queued = len(_bg["queue"]) return {"active": _bg["running"], "en_file": queued, @@ -1180,9 +1187,9 @@ def background_status(): @app.post("/api/map/background") def background_trigger(): - """Force un scan immédiat des dalles (rendu ensuite en tâche de fond).""" + """Force an immediate scan of the source tiles (rendered afterwards in the background).""" if not _env_flag("LIDAR_TILE_BACKGROUND"): - raise HTTPException(409, "maintenance de fond inactive " + raise HTTPException(409, "background maintenance disabled " "(LIDAR_TILE_BACKGROUND)") return {"tuiles_en_file": background_scan()} @@ -1193,35 +1200,35 @@ def healthz(): # --------------------------------------------------------------------------- -# Génération de tuiles (portée de la webapp historique) +# Tile generation (ported from the former webapp) # --------------------------------------------------------------------------- -# Deux modes, mutuellement exclusifs : -# - LIDAR_GENERATION_URL défini (webapp légère) : /api/preview, /api/generate, -# /api/status, /api/stop et /api/queue/* sont transmis à la machine de -# traitement (elle-même servie par ce module, image complète) ; -# - sinon, si le pipeline est importable (image complète) : génération locale -# — `python -m lidar_pipeline` en sous-processus, un job à la fois, les -# demandes concurrentes part en file (persistée, survit aux redémarrages). -# Sur l'image légère sans LIDAR_GENERATION_URL, /api/status répond -# available=false : l'interface masque les boutons de génération. +# Two mutually exclusive modes: +# - LIDAR_GENERATION_URL set (lightweight map): /api/preview, /api/generate, +# /api/status, /api/stop, /api/queue/clear and /api/cell are forwarded to +# the processing machine (itself served by this module, full image); +# - otherwise, if the pipeline can be imported (full image): local generation +# — `python -m lidar_pipeline` as a subprocess, one job at a time, +# concurrent requests go to the queue (persisted, survives restarts). +# On the lightweight image without LIDAR_GENERATION_URL, /api/status answers +# available=false: the interface hides the Generation tab. def _generation_available(): return bool(GENERATION_URL) or _pipeline_importable() def _require_token(x_lidar_token: str = Header(None)): - """Protège les routes mutantes si LIDAR_API_TOKEN est défini (sinon no-op).""" + """Protect mutating routes when LIDAR_API_TOKEN is set (no-op otherwise).""" if API_TOKEN: import hmac presented = x_lidar_token or "" if not hmac.compare_digest(presented, API_TOKEN): - raise HTTPException(401, "token d'API manquant ou invalide") + raise HTTPException(401, "missing or invalid API token") def _ip_in_regen_cidr(ip): - """Vrai si l'IP appartient à un des CIDR autorisés (LIDAR_REGEN_CIDR).""" + """True if the IP belongs to one of the allowed CIDRs (LIDAR_REGEN_CIDR).""" if not REGEN_CIDR: - return True # restriction désactivée + return True # restriction disabled if not ip: return False import ipaddress @@ -1242,19 +1249,19 @@ def _ip_in_regen_cidr(ip): def _client_ip(request): - """IP d'origine du client pour la restriction de génération. + """Originating client IP for the generation restriction. - Le pair direct doit être dans le réseau autorisé ; dans ce cas seulement, - X-Forwarded-For (reverse proxy local) désigne le client réel derrière lui. - Un client externe connecté en direct est refusé sur son IP de connexion, - quel que soit le X-Forwarded-For qu'il annonce. + The direct peer must be inside the allowed network; only then does + X-Forwarded-For (local reverse proxy) designate the real client behind + it. An external client connecting directly is judged on its connection + IP, whatever X-Forwarded-For it announces. """ if request is None: return None peer = getattr(request, "client", None) peer_ip = getattr(peer, "host", None) if peer else None if not _ip_in_regen_cidr(peer_ip): - return peer_ip # hors réseau (ou inconnu) : jugé sur cette IP + return peer_ip # outside the network (or unknown): judged on this IP xff = request.headers.get("x-forwarded-for") if hasattr(request, "headers") else None if xff: first = xff.split(",")[0].strip() @@ -1264,21 +1271,21 @@ def _client_ip(request): def _require_lan_for_generation(request: Request): - """Réserve /api/generate aux clients du réseau local (LIDAR_REGEN_CIDR).""" + """Restrict generation routes to local-network clients (LIDAR_REGEN_CIDR).""" ip = _client_ip(request) if not _ip_in_regen_cidr(ip): raise HTTPException( - 403, f"génération de tuiles réservée au réseau local" + 403, f"tile generation is restricted to the local network" f"{f' ({REGEN_CIDR})' if REGEN_CIDR else ''} — " - f"client : {ip or 'IP inconnue'}") + f"client: {ip or 'unknown IP'}") def _proxy_generation(method, path, payload=None, timeout=30): - """Transmet un appel de génération à la machine de traitement. + """Forward a generation call to the processing machine. - Retourne la réponse JSON distante. Les erreurs HTTP distantes (ex: 409 une - génération est déjà en cours) sont relayées telles quelles ; une machine - injoignable devient un 503 explicite pour l'interface. + Returns the remote JSON response. Remote HTTP errors (e.g. 409 nothing + to stop) are relayed as is; an unreachable machine becomes an explicit + 503 for the interface. """ import urllib.error import urllib.request @@ -1299,15 +1306,15 @@ def _proxy_generation(method, path, payload=None, timeout=30): detail = str(e) raise HTTPException(e.code, detail) except (urllib.error.URLError, OSError) as e: - raise HTTPException(503, f"machine de traitement injoignable " - f"({GENERATION_URL}) : {e}") + raise HTTPException(503, f"processing machine unreachable " + f"({GENERATION_URL}): {e}") def _viz_step_names(): - """Noms des visualisations acceptées (étapes VIZ_STEPS du pipeline). + """Names of the accepted visualizations (pipeline VIZ_STEPS steps). - Sur l'image légère (sans dépendances de traitement), repli sur le - registre de l'index — le même ordre que VIZ_STEPS. + On the lightweight image (without processing dependencies), falls back + to the index registry — same order as VIZ_STEPS. """ try: from .pipeline import VIZ_STEPS @@ -1318,59 +1325,59 @@ def _viz_step_names(): def _panel_viz_steps(): - """Couches réellement affichées par la carte, en noms d'étapes --only.""" + """Layers actually displayed by the map, as --only step names.""" from .index import panel_steps return panel_steps() or _viz_step_names() def _viz_step_labels(): - """Étapes → libellés (journal de progression lisible).""" + """Steps → labels (readable progress log).""" from .index import VIZ_LABELS, step_to_keyword return {step: VIZ_LABELS.get(step_to_keyword(step), step) for step in _viz_step_names()} class PreviewRequest(BaseModel): - bbox: Optional[list] = Field(None, description="[ouest, sud, est, nord] en WGS84 " - "(requis sauf all_missing=true)") - regenerate: bool = Field(False, description="Inclure les tuiles déjà générées") + bbox: Optional[list] = Field(None, description="[west, south, east, north] in WGS84 " + "(required unless all_missing=true)") + regenerate: bool = Field(False, description="Include tiles that are already generated") viz: Optional[list] = Field(None, - description="Visualisations demandées, noms d'étapes du " - "pipeline (ex: aspect, wavelet) ; défaut : les " - "couches affichées dans le panneau. " - "Une tuile existante est considérée faite " - "seulement si elle les possède toutes") + description="Requested visualizations, pipeline step " + "names (e.g. aspect, wavelet); default: the " + "layers displayed in the panel. " + "An existing tile counts as done only " + "if it has all of them") all_missing: bool = Field(False, - description="Ignorer la bbox : toutes les dalles LHD " - "présentes dans input/ qui manquent au moins " - "une des visualisations demandées (sans " - "téléchargement)") + description="Ignore the bbox: every LHD tile " + "present in input/ that lacks at least " + "one of the requested visualizations (no " + "download)") class GenerateRequest(BaseModel): - tiles: list = Field(..., description="liste [col, row] (entiers km L93)") - regenerate: bool = Field(False, description="Régénérer les tuiles déjà générées " - "(visualisations refaites, classification conservée)") - # Classification (IGN, sol seul) et raccord des bords (bande de 100 m prise - # aux dalles voisines) sont imposés : plus de réglage côté carte. Les - # anciens champs éventuellement envoyés par un client sont ignorés. + tiles: list = Field(..., description="list of [col, row] (L93 km integers)") + regenerate: bool = Field(False, description="Regenerate tiles that are already generated " + "(visualizations redone, classification kept)") + # Classification (IGN, ground only) and edge stitching (100 m band taken + # from the neighbouring tiles) are enforced: no setting on the map side. + # Legacy fields a client may still send are ignored. viz: list = Field(None, - description="Visualisations à générer, noms d'étapes du " - "pipeline (ex: aspect, wavelet, slope) ; " - "défaut : les couches affichées dans le panneau") + description="Visualizations to generate, pipeline step " + "names (e.g. aspect, wavelet, slope); " + "default: the layers displayed in the panel") all_missing: bool = Field(False, - description="Ignorer la liste de tuiles : traiter toutes " - "les dalles LHD présentes dans input/ qui " - "manquent au moins une des visualisations " - "demandées (sans téléchargement)") + description="Ignore the tile list: process every " + "LHD tile present in input/ that " + "lacks at least one of the requested " + "visualizations (no download)") def bbox_to_cells(w, s, e, n): - """Cellules L93 de 1 km (col, row) intersectant une bbox WGS84. + """1 km L93 cells (col, row) intersecting a WGS84 bbox. - Une cellule (col, row) couvre X ∈ [col, col+1] km, Y ∈ [row-1, row] km. - Conversion via pyproj (présent dans toutes les images), repli sur - l'approximation affine de l'index. + A cell (col, row) covers X ∈ [col, col+1] km, Y ∈ [row-1, row] km. + Conversion via pyproj (present in every image), falling back to the + index's affine approximation. """ from .index import _approx_wgs84_to_l93 try: @@ -1382,7 +1389,7 @@ def bbox_to_cells(w, s, e, n): for lon, lat in ((w, s), (e, s), (w, n), (e, n))] xs = [p[0] for p in pts] ys = [p[1] for p in pts] - min_x, max_x = min(xs) + 0.5, max(xs) - 0.5 # rétrécit d'1 m : bords exclus + min_x, max_x = min(xs) + 0.5, max(xs) - 0.5 # shrink by 1 m (0.5 m per side): edges excluded min_y, max_y = min(ys) + 0.5, max(ys) - 0.5 if max_x <= min_x or max_y <= min_y: return [] @@ -1392,7 +1399,7 @@ def bbox_to_cells(w, s, e, n): def point_to_cell(lon, lat): - """Cellule L93 de 1 km (col, row) contenant un point WGS84.""" + """1 km L93 cell (col, row) containing a WGS84 point.""" from .index import _approx_wgs84_to_l93 try: from pyproj import Transformer @@ -1404,14 +1411,14 @@ def point_to_cell(lon, lat): def processed_cells(output_dir): - """Ensemble des cellules (col, row) ayant déjà des visualisations.""" + """Set of cells (col, row) that already have visualizations.""" from .index import scan_tiles tiles = scan_tiles(Path(output_dir) / "visualisations") return {(t["col"], t["row"]) for t in tiles} def laz_cells(input_dir): - """Coordonnées (col, row) des dalles LHD présentes dans input/.""" + """Coordinates (col, row) of the LHD tiles present in input/.""" from .index import parse_basename_coords cells = set() for f in list(Path(input_dir).glob("*.laz")) + list(Path(input_dir).glob("*.las")): @@ -1427,7 +1434,7 @@ def laz_cells(input_dir): def complete_cells(output_dir, viz_steps): - """Cellules ayant TOUTES les visualisations demandées à 0,2 m.""" + """Cells that have ALL the requested visualizations at 0.2 m.""" from .index import cells_with_all_viz, step_to_keyword keys = [step_to_keyword(v) for v in viz_steps] return cells_with_all_viz(Path(output_dir) / "visualisations", keys, @@ -1435,9 +1442,9 @@ def complete_cells(output_dir, viz_steps): def missing_cells_with_corners(cells, output_dir, include_done=False, viz=None): - """Filtre les cellules à traiter et calcule leurs coins WGS84. + """Filter the cells to process and compute their WGS84 corners. - Retourne [{col, row, corners: [[lat, lon] × 4 SW,SE,NE,NW}]. + Returns [{col, row, corners: [[lat, lon] × 4, SW, SE, NE, NW]}]. """ from .index import attach_gps_bounds if viz: @@ -1452,13 +1459,12 @@ def missing_cells_with_corners(cells, output_dir, include_done=False, viz=None): def _attach_frame_bounds(tiles): - """Ajoute aux tuiles non terminées leurs coins WGS84 (cadre sur la carte). + """Add their WGS84 corners to unfinished tiles (outline on the map). - L'interface dessine un cadre coloré autour des dalles du run en cours - (orange : rendu en cours, bleu : en attente, rouge : échec) ; les coins - viennent de la grille L93 (col, row) → bornes exactes via PROJ. Les - dalles terminées n'ont pas de cadre : coins omis pour alléger le sondage - /api/status. + The interface draws a coloured outline around the tiles of the current + run (running, pending, failed); the corners come from the L93 grid + (col, row) → exact bounds via PROJ. Finished tiles have no outline: + corners are omitted to lighten /api/status polling. """ from .index import attach_gps_bounds, parse_basename_coords todo = [] @@ -1480,7 +1486,7 @@ def _attach_frame_bounds(tiles): def _tail_log(n_lines): - """Dernières lignes du journal de génération (.generation.log).""" + """Last lines of the generation log (.generation.log).""" try: text = LOG_FILE.read_text(encoding="utf-8", errors="replace") except OSError: @@ -1489,18 +1495,18 @@ def _tail_log(n_lines): return lines[-n_lines:] -# --- État du job + file d'attente (persistés sur disque) --------------------- +# --- Job state + queue (persisted on disk) ---------------------------------- _job: dict = {"proc": None, "started": None, "returncode": None, "cmd": None, "finished": None, "qid": None, "run_id": None} -# RLock (réentrant) : /api/status construit sa réponse SOUS verrou et appelle -# _queue_summary() qui le reprend — un Lock simple s'y bloquerait définitivement. +# RLock (reentrant): /api/status builds its response UNDER the lock and calls +# _queue_summary(), which takes it again — a plain Lock would deadlock there. _job_lock = threading.RLock() _queue = [] _queue_seq = 0 def _save_job_state(): - """Écrit l'état du job sur disque — survit au redémarrage du serveur.""" + """Write the job state to disk — survives a server restart.""" state = {k: _job.get(k) for k in ("started", "returncode", "cmd", "finished", "qid", "run_id")} try: @@ -1510,7 +1516,7 @@ def _save_job_state(): def _load_job_state(): - """Recharge l'état du dernier job au démarrage du serveur.""" + """Reload the last job state when the server starts.""" try: state = json.loads(JOB_FILE.read_text(encoding="utf-8")) except (OSError, ValueError): @@ -1528,7 +1534,7 @@ _load_job_state() def _save_queue(): - """Écrit la file d'attente sur disque (atomique, best-effort).""" + """Write the queue to disk (atomic, best-effort).""" try: tmp = QUEUE_FILE.with_suffix(".tmp") tmp.write_text(json.dumps(_queue), encoding="utf-8") @@ -1538,7 +1544,7 @@ def _save_queue(): def _load_queue(): - """Recharge la file d'attente au démarrage (et son compteur d'ids).""" + """Reload the queue at startup (and its id counter).""" global _queue_seq try: data = json.loads(QUEUE_FILE.read_text(encoding="utf-8")) @@ -1555,27 +1561,27 @@ _load_queue() def _queue_summary(): - """Aperçu de la file pour /api/status (requêtes + horodatages).""" + """Queue overview for /api/status (requests + timestamps).""" with _job_lock: return [{"id": it.get("id"), "tuiles": len(it["req"].get("tiles") or []), "en_file_depuis": it.get("queued_at")} for it in _queue] -EDGE_BUFFER_METERS = 100.0 # raccord des bords : largeur de bande (m) +EDGE_BUFFER_METERS = 100.0 # edge stitching: band width (m) def _build_command(tiles, regenerate=False, viz=None): - """Commande de génération : téléchargement IGN + traitement des fichiers. + """Generation command: IGN download + file processing. - Classification IGN (sol seul) et raccord des bords (bande de - EDGE_BUFFER_METERS remplie avec les points sol des 8 dalles voisines) - toujours appliqués. Avec regenerate=True, les visualisations des tuiles - déjà présentes sont refaites (--force), classification conservée. + IGN classification (ground only) and edge stitching (EDGE_BUFFER_METERS + band filled with the ground points of the 8 neighbouring tiles) are + always applied. With regenerate=True, the visualizations of tiles that + are already present are redone (--force), classification kept. """ from .fetch_ign import tile_filename - # -u : sortie non bufferisée — le journal .generation.log doit être - # lu en temps réel par /api/status (progression affichée dans l'UI). + # -u: unbuffered output — the .generation.log log must be read in real + # time by /api/status (progress shown in the UI). cmd = [sys.executable, "-u", "-m", "lidar_pipeline", str(INPUT_DIR), "-o", str(OUTPUT_DIR), "-r", ",".join(str(r) for r in GENERATE_RESOLUTIONS), @@ -1590,8 +1596,9 @@ def _build_command(tiles, regenerate=False, viz=None): workers = os.environ.get("LIDAR_WORKERS", "auto").strip() if workers.lower() not in ("auto", ""): cmd += ["-w", workers] - # Inventaire régénéré après chaque tuile terminée : la carte le sonde - # (/api/tiles) et les nouvelles dalles apparaissent en direct. + # Inventory regenerated after every finished tile (now the pipeline + # default anyway, kept explicit here): the map polls it (/api/tiles) and + # new tiles appear live. cmd += ["--incremental-index"] cmd += ["--fetch-tiles"] cmd += [f"{c},{r}" for (c, r) in tiles] @@ -1601,71 +1608,71 @@ def _build_command(tiles, regenerate=False, viz=None): def _resolve_request(req): - """Valide une demande de génération et résout sa liste de tuiles. + """Validate a generation request and resolve its tile list. - Retourne (tuiles [(col, row)], viz [noms d'étapes]). Réexécutée au - démarrage de chaque demande sortie de file : les dalles présentes dans - input/ peuvent avoir changé entre la mise en file et le départ du run. + Returns (tiles [(col, row)], viz [step names]). Re-run when each queued + request starts: the tiles present in input/ may have changed between + queuing and the start of the run. """ names = _viz_step_names() viz = [v for v in (req.viz or []) if v] or _panel_viz_steps() invalid = [v for v in viz if v not in names] if invalid: raise HTTPException( - 400, f"visualisation invalide : {', '.join(invalid)} " - f"(attendues : {', '.join(names)})") + 400, f"invalid visualization: {', '.join(invalid)} " + f"(expected: {', '.join(names)})") if req.all_missing: done = set() if req.regenerate else complete_cells(OUTPUT_DIR, viz) tiles = [c for c in laz_cells(INPUT_DIR) if c not in done or req.regenerate] if not tiles: - raise HTTPException(400, "aucune tuile à compléter dans input/") + raise HTTPException(400, "no tile to complete in input/") if len(tiles) > MAX_CELLS_ALL: raise HTTPException( - 400, f"trop de tuiles à compléter ({len(tiles)}) — max " - f"{MAX_CELLS_ALL} par run ; relancez la passe globale à " - f"la fin de celui-ci") + 400, f"too many tiles to complete ({len(tiles)}) — max " + f"{MAX_CELLS_ALL} per run; start the global pass again " + f"once this one is over") else: tiles = [] for pair in req.tiles: if not (isinstance(pair, list) and len(pair) == 2): - raise HTTPException(400, f"tuile invalide : {pair!r} (attendu [col, row])") + raise HTTPException(400, f"invalid tile: {pair!r} (expected [col, row])") tiles.append((int(pair[0]), int(pair[1]))) if not tiles: - raise HTTPException(400, "aucune tuile fournie") + raise HTTPException(400, "no tile provided") if len(tiles) > MAX_CELLS: - raise HTTPException(400, f"trop de tuiles ({len(tiles)}) — max {MAX_CELLS}") - # Génération du nord au sud (row décroissante, puis col croissante) : les - # workers prennent les tuiles dans l'ordre de soumission et la carte se - # remplit de haut en bas pendant le run. + raise HTTPException(400, f"too many tiles ({len(tiles)}) — max {MAX_CELLS}") + # North-to-south generation (decreasing row, then increasing col): the + # workers take tiles in submission order and the map fills from top to + # bottom during the run. tiles.sort(key=lambda cr: (-cr[1], cr[0])) return tiles, viz def _launch_job(tiles, viz, req, qid=None): - """Démarre un run du pipeline. À appeler sous _job_lock, serveur libre.""" + """Start a pipeline run. Call under _job_lock, with the server idle.""" cmd = _build_command(tiles, regenerate=req.regenerate, viz=viz) LOG_FILE.parent.mkdir(parents=True, exist_ok=True) log_fh = open(LOG_FILE, "w", encoding="utf-8") - # Nouveau run : journal d'événements remis à zéro et identifiant de run - # transmis au pipeline (LIDAR_RUN_ID) : les événements tardifs d'un run - # annulé (workers survivants) sont filtrés à la lecture. + # New run: event log reset and run id passed to the pipeline + # (LIDAR_RUN_ID): late events from a cancelled run (surviving workers) + # are filtered out when reading. from .progress import reset_events reset_events(OUTPUT_DIR) run_id = uuid.uuid4().hex[:12] _job.update({"proc": None, "started": time.time(), "returncode": None, "cmd": cmd, "finished": None, "qid": qid, "run_id": run_id}) _save_job_state() - # start_new_session : le pipeline et ses workers/PDAL forment leur propre - # groupe de processus — /api/stop peut le tuer en bloc sans toucher le - # serveur, et le gestionnaire SIGTERM du pipeline (killpg) reste confiné. + # start_new_session: the pipeline and its workers/PDAL form their own + # process group — /api/stop can kill it as a whole without touching the + # server, and the pipeline's SIGTERM handler (killpg) stays confined. p = subprocess.Popen(cmd, stdout=log_fh, stderr=subprocess.STDOUT, cwd="/app" if Path("/app").exists() else None, env=dict(os.environ, LIDAR_RUN_ID=run_id), start_new_session=True) - # proc posé AVANT le fil de veille : un run qui meurt instantanément - # déclencherait _watch → _start_next_queued avec _job["proc"] encore à - # None (serveur « libre ») et un second run partirait en parallèle. + # proc set BEFORE the watcher thread: a run that dies instantly would + # trigger _watch → _start_next_queued with _job["proc"] still None + # (server "idle") and a second run would start in parallel. _job["proc"] = p def _watch(): @@ -1675,7 +1682,7 @@ def _launch_job(tiles, viz, req, qid=None): _job["returncode"] = rc _job["finished"] = time.time() _save_job_state() - # Le run est fini : la demande suivante de la file peut partir. + # The run is over: the next queued request can start. _start_next_queued() threading.Thread(target=_watch, daemon=True).start() @@ -1683,7 +1690,7 @@ def _launch_job(tiles, viz, req, qid=None): def _start_next_queued(): - """Démarre la première demande de la file dès que le serveur est libre.""" + """Start the first queued request as soon as the server is idle.""" while True: with _job_lock: proc = _job["proc"] @@ -1697,12 +1704,12 @@ def _start_next_queued(): req = GenerateRequest(**item["req"]) tiles, viz = _resolve_request(req) except HTTPException as e: - logger.warning("Demande en file ignorée : %s", e.detail) + logger.warning("Queued request skipped: %s", e.detail) continue with _job_lock: proc = _job["proc"] if proc is not None and proc.poll() is None: - _queue.insert(0, item) # un autre run est parti : remise en tête + _queue.insert(0, item) # another run started: put back at the head _save_queue() return False _launch_job(tiles, viz, req, qid=item.get("id")) @@ -1711,12 +1718,13 @@ def _start_next_queued(): @app.get("/api/status") def generation_status(request: Request = None): - """État de la génération : run en cours, file, tuiles une par une. + """Generation state: current run, queue, tiles one by one. - available : ce serveur peut générer (pipeline local ou LIDAR_GENERATION_URL). - regen_allowed : l'IP du navigateur a le droit de lancer (LIDAR_REGEN_CIDR) - — l'interface masque les boutons sinon. Webapp légère : l'état vient de la - machine de traitement ; hors ligne : running=null (aucun faux « terminé »). + available: this server can generate (local pipeline or LIDAR_GENERATION_URL). + regen_allowed: the browser's IP may start runs (LIDAR_REGEN_CIDR) — the + interface hides the Generation tab otherwise. Lightweight map: the state + comes from the processing machine; offline: running=null (no false + "finished"). """ regen_allowed = _ip_in_regen_cidr(_client_ip(request)) available = _generation_available() @@ -1739,8 +1747,8 @@ def generation_status(request: Request = None): with _job_lock: pending = bool(_queue) if pending: - # File d'attente non vide et serveur libre (ex. redémarrage du - # conteneur en cours de file) : la demande suivante repart. + # Non-empty queue and idle server (e.g. container restarted while + # requests were queued): the next request starts. _start_next_queued() with _job_lock: proc = _job["proc"] @@ -1761,12 +1769,12 @@ def generation_status(request: Request = None): @app.get("/api/tiles") def tiles_inventory(stamp: Optional[float] = None): - """Inventaire des dalles (index_tiles.json) pour les machines légères. + """Tile inventory (index_tiles.json) for lightweight machines. - Écrit par le pipeline à chaque passe (et après chaque tuile en mode - --incremental-index) : vignettes, sous-tuiles et dalles référencées y - sont servies par les montages statiques homonymes. ?stamp=X → réponse - allégée si rien n'a changé. + Written by the pipeline after every finished tile (unless --no-index): + the thumbnails, sub-tiles and source tiles it references are served by + the static mounts of the same name. ?stamp=X → light response if nothing + changed. """ path = OUTPUT_DIR / "index_tiles.json" try: @@ -1780,17 +1788,17 @@ def tiles_inventory(stamp: Optional[float] = None): return data -# --- export PDF (planche d'impression terrain) --- -# Toujours calculé localement (jamais délégué à LIDAR_GENERATION_URL) : la -# carte légère seule doit savoir exporter. Un export à la fois : l'image de -# la planche occupe jusqu'à ~40 Mo (Pi, mem_limit 1g). +# --- PDF export (printable field sheet) --- +# Always computed locally (never delegated to LIDAR_GENERATION_URL): the +# lightweight map alone must be able to export. One export at a time: the +# sheet image takes up to ~40 MB (Pi, mem_limit 1g). _export_lock = threading.Lock() @app.get("/api/export/frame") def export_frame(lat: float, lon: float, paper: str = "A4", orient: str = "paysage", scale: int = 2000): - """Cadre imprimable (coins WGS84) centré sur (lat, lon) pour ces réglages.""" + """Printable frame (WGS84 corners) centred on (lat, lon) for these settings.""" from . import export_pdf try: return export_pdf.frame(lat, lon, paper, orient, scale) @@ -1801,10 +1809,10 @@ def export_frame(lat: float, lon: float, paper: str = "A4", orient: str = "paysa @app.get("/api/export/pdf") def export_pdf_file(lat: float, lon: float, paper: str = "A4", orient: str = "paysage", scale: int = 2000, title: Optional[str] = None): - """Planche PDF du relief orienté centrée sur (lat, lon).""" + """PDF sheet of the oriented relief centred on (lat, lon).""" from . import export_pdf if not _export_lock.acquire(blocking=False): - raise HTTPException(429, "un export PDF est déjà en cours, réessayez dans quelques secondes") + raise HTTPException(429, "a PDF export is already running, try again in a few seconds") try: data, name = export_pdf.build_pdf(OUTPUT_DIR, lat, lon, paper, orient, scale, title=title) @@ -1812,9 +1820,9 @@ def export_pdf_file(lat: float, lon: float, paper: str = "A4", orient: str = "pa raise HTTPException(400, str(e)) except export_pdf.NoDataError as e: raise HTTPException(404, str(e)) - except Exception: # noqa: BLE001 — message propre côté carte - logger.exception("Échec de l'export PDF") - raise HTTPException(500, "échec de l'export PDF (voir les journaux du serveur)") + except Exception: # noqa: BLE001 — clean message on the map side + logger.exception("PDF export failed") + raise HTTPException(500, "PDF export failed (see the server logs)") finally: _export_lock.release() return Response(data, media_type="application/pdf", @@ -1825,31 +1833,31 @@ def export_pdf_file(lat: float, lon: float, paper: str = "A4", orient: str = "pa @app.post("/api/preview", dependencies=[Depends(_require_token), Depends(_require_lan_for_generation)]) def preview(req: PreviewRequest): - """Cellules 1 km intersectant une bbox WGS84 (ou passe all_missing). + """1 km cells intersecting a WGS84 bbox (or all_missing pass). - Sont incluses les tuiles absentes ET les tuiles existantes incomplètes - (il leur manque une des visualisations demandées). Retourne - {count, capped, cells:[{col, row, corners}]}. + Includes missing tiles AND incomplete existing tiles (lacking one of the + requested visualizations). Returns {count, capped, cells:[{col, row, + corners}]}. """ if GENERATION_URL: - # Webapp légère : le distant connaît input/ et output/ complets + # Lightweight map: the remote machine knows the full input/ and output/ return _proxy_generation("POST", "/api/preview", json.loads(req.json())) names = _viz_step_names() viz = [v for v in (req.viz or []) if v] or _panel_viz_steps() invalid = [v for v in viz if v not in names] if invalid: raise HTTPException( - 400, f"visualisation invalide : {', '.join(invalid)} " - f"(attendues : {', '.join(names)})") + 400, f"invalid visualization: {', '.join(invalid)} " + f"(expected: {', '.join(names)})") if req.all_missing: - # Passe globale : dalles LHD déjà présentes dans input/ (aucun téléchargement) + # Global pass: LHD tiles already present in input/ (no download) cells = laz_cells(INPUT_DIR) capped = len(cells) > MAX_CELLS_ALL todo = missing_cells_with_corners(cells[:MAX_CELLS_ALL], OUTPUT_DIR, include_done=req.regenerate, viz=viz) else: if not req.bbox or len(req.bbox) != 4: - raise HTTPException(400, "bbox attendue : [ouest, sud, est, nord]") + raise HTTPException(400, "expected bbox: [west, south, east, north]") w, s, e, n = (float(v) for v in req.bbox) cells = bbox_to_cells(w, s, e, n) capped = len(cells) > MAX_CELLS @@ -1860,7 +1868,7 @@ def preview(req: PreviewRequest): @app.get("/api/cell") def cell_at_point(lat: float, lng: float): - """Cellule L93 de 1 km contenant un point WGS84 + coins pour la carte.""" + """1 km L93 cell containing a WGS84 point + corners for the map.""" if GENERATION_URL: return _proxy_generation("GET", f"/api/cell?lat={lat}&lng={lng}") from .index import attach_gps_bounds @@ -1874,8 +1882,8 @@ def cell_at_point(lat: float, lng: float): Depends(_require_lan_for_generation)]) def generate(req: GenerateRequest): if GENERATION_URL: - # Webapp légère : téléchargement + traitement sur la machine distante, - # qui valide les paramètres, met en file et renvoie son propre état. + # Lightweight map: download + processing on the remote machine, which + # validates the parameters, queues and returns its own state. data = _proxy_generation("POST", "/api/generate", json.loads(req.json())) data["distant"] = True @@ -1885,8 +1893,8 @@ def generate(req: GenerateRequest): proc = _job["proc"] running = proc is not None and proc.poll() is None if running: - # Un run est en cours : la demande part en file d'attente et - # démarrera à sa fin — jamais de coupure du travail en place. + # A run is in progress: the request is queued and will start when + # it ends — the running work is never interrupted. global _queue_seq _queue_seq += 1 item = {"id": _queue_seq, "req": json.loads(req.json()), @@ -1902,7 +1910,7 @@ def generate(req: GenerateRequest): @app.post("/api/queue/clear", dependencies=[Depends(_require_token), Depends(_require_lan_for_generation)]) def queue_clear(): - """Retire les demandes en attente (le run en cours n'est pas touché).""" + """Remove the pending requests (the current run is not touched).""" if GENERATION_URL: return _proxy_generation("POST", "/api/queue/clear") with _job_lock: @@ -1915,15 +1923,15 @@ def queue_clear(): @app.post("/api/stop", dependencies=[Depends(_require_token), Depends(_require_lan_for_generation)]) def stop_generation(): - """Arrête la génération en cours (SIGTERM au pipeline, SIGKILL en repli).""" + """Stop the current generation (SIGTERM to the pipeline, SIGKILL as a fallback).""" if GENERATION_URL: return _proxy_generation("POST", "/api/stop") with _job_lock: proc = _job["proc"] if proc is None or proc.poll() is not None: - raise HTTPException(409, "aucune génération en cours") + raise HTTPException(409, "no generation in progress") try: - proc.terminate() # SIGTERM → nettoyage propre du pipeline + proc.terminate() # SIGTERM → clean pipeline shutdown except OSError: pass @@ -1940,7 +1948,7 @@ def stop_generation(): pass threading.Thread(target=_escalate, daemon=True).start() - logger.info("Arrêt de la génération demandé (SIGTERM au pipeline)") + logger.info("Generation stop requested (SIGTERM to the pipeline)") return {"arrêt": "demandé"} @@ -1956,11 +1964,11 @@ def root(): @app.get("/assets/{file_path:path}") def assets(file_path: str, v: str = None): - """Assets de l'interface (revalidés : ils suivent l'image, pas le cache).""" + """Interface assets (revalidated: they follow the image, not the cache).""" base = _assets_dir.resolve() p = (_assets_dir / file_path).resolve() if base not in p.parents or not p.is_file(): - raise HTTPException(404, f"asset introuvable : {file_path}") + raise HTTPException(404, f"asset not found: {file_path}") return FileResponse(str(p), headers={"Cache-Control": "no-cache, must-revalidate"}) diff --git a/lidar_pipeline/mapui.py b/lidar_pipeline/mapui.py index 94b3087..c2e9e80 100644 --- a/lidar_pipeline/mapui.py +++ b/lidar_pipeline/mapui.py @@ -1,9 +1,9 @@ -"""Interface de la carte à tuiles XYZ (image lidar-maps). +"""XYZ tile map interface (served by mapserve, in both images). -Le HTML, le CSS et le JS vivent dans `web/` (vrais fichiers, relus à l'import) ; -`write_map_assets()` les bâche dans l'image au build. La page est une coquille -minimale : tout l'état vient de `/api/map/meta`, les couches sont des `L.tileLayer` -standard — le navigateur gère LOD, cache et animation. +The HTML, CSS and JS live in `web/` (real files, read at import time); +`write_map_assets()` bakes them into the image at build time. The page is a +minimal shell: all state comes from `/api/map/meta`, the layers are standard +`L.tileLayer`s — the browser handles LOD, caching and animation. """ import hashlib @@ -15,7 +15,7 @@ WEB_DIR = Path(__file__).resolve().parent / "web" def _read_web(name): - """Fichier de l'interface (HTML/CSS/JS), lu une fois à l'import.""" + """Interface file (HTML/CSS/JS), read once at import time.""" return (WEB_DIR / name).read_text(encoding="utf-8") @@ -25,12 +25,12 @@ _MAP_JS = _read_web("map.js") def ui_version(): - """Hash court du CSS+JS : sert d'URL de version pour les assets.""" + """Short hash of CSS+JS: used as the version in asset URLs.""" return hashlib.sha1((_MAP_CSS + _MAP_JS).encode("utf-8")).hexdigest()[:10] def write_map_assets(assets_dir): - """Écrit app.css / app.js (+ Leaflet vendorisé) dans `assets_dir`.""" + """Writes app.css / app.js (+ vendored Leaflet) into `assets_dir`.""" import shutil assets_dir = Path(assets_dir) assets_dir.mkdir(parents=True, exist_ok=True) @@ -46,7 +46,7 @@ def write_map_assets(assets_dir): def render_html(): - """Coquille HTML (données chargées par /api/map/meta).""" + """HTML shell (data loaded from /api/map/meta).""" return _MAP_HTML.replace("__ASSETS_V__", ui_version()) diff --git a/lidar_pipeline/pipeline.py b/lidar_pipeline/pipeline.py index 4e32775..aca9502 100644 --- a/lidar_pipeline/pipeline.py +++ b/lidar_pipeline/pipeline.py @@ -1,9 +1,10 @@ """Pipeline orchestration for LiDAR archaeological analysis. LidarArchaeoPipeline coordinates the full processing chain: -1. Ground classification (PDAL/SMRF) +1. Ground classification (IGN pre-classification by default; SMRF/CSF via PDAL) 2. DTM generation -3. Visualization generation (17 products) +3. Visualization generation (17 available products; a default run only + produces the map layers, PANEL_VIZ in index.py) 4. Rendering (AVIF/WebP conversion) """ @@ -28,14 +29,14 @@ logger = logging.getLogger("lidar") def resolve_workers(value): - """Traduit l'option -w en nombre effectif de workers. + """Turn the -w option into an effective worker count. - Résolu au lancement de chaque run (pas au démarrage du serveur, ni par - tuile : le pool de processus vit le temps du run). « auto » = cœurs - logiques - 2 (un pour l'OS/serveur, un pour les phases I/O et - l'indexation), borné [2, 16] — chaque worker traite une tuile et peut - lancer un processus PDAL en flux, le compte reste raisonnable même sur - une grosse machine. + Resolved when each run starts (not at server startup, nor per tile: the + process pool lives for the duration of the run). "auto" = logical cores + - 2 (one for the OS/server, one for the I/O and indexing phases), + clamped to [2, 16] — each worker processes one tile and may spawn a + streaming PDAL process, so the count stays reasonable even on a large + machine. """ if isinstance(value, str) and value.strip().lower() == "auto": cpus = os.cpu_count() or 4 @@ -119,16 +120,16 @@ VIZ_STEPS = [ ('ortho', lambda d, b, v, r: generate_ign_overlay( d, b, v, r, layer='ORTHOIMAGERY.ORTHOPHOTOS', - title='Photographie Aérienne IGN', - legend_label='Orthophotographie\nImage aérienne', - description='Photographie aérienne IGN (Orthophoto)', + title='IGN Aerial Photograph', + legend_label='Orthophoto\nAerial image', + description='IGN aerial photograph (orthophoto)', out_suffix='ortho')), ('topo', lambda d, b, v, r: generate_ign_overlay( d, b, v, r, layer='GEOGRAPHICALGRIDSYSTEMS.PLANIGNV2', - title='Carte Topographique IGN', - legend_label='Carte IGN\nPlan topographique', - description='Carte topographique IGN (Plan IGN)', + title='IGN Topographic Map', + legend_label='IGN map\nTopographic map', + description='IGN topographic map (Plan IGN)', out_suffix='topo')), ] @@ -159,9 +160,9 @@ class LidarArchaeoPipeline: self.output_format = output_format self.gpu_ids = gpu_ids self.no_index = no_index - # Inventaire mis à jour après chaque dalle par défaut : la carte (et sa - # maintenance de pyramide) suit le rendu en cours, quel que soit le - # lanceur (carte, compose, run.sh). --no-index le désactive. + # Inventory updated after every tile by default: the map (and its + # pyramid maintenance) follows the ongoing render, whatever the + # launcher (map, compose, run.sh). --no-index disables it. self.incremental_index = bool(incremental_index) or not no_index self.strip_align = strip_align self.openness_downsample = openness_downsample @@ -172,7 +173,7 @@ class LidarArchaeoPipeline: self.temp_dir = self.output_dir / "temp" if not self.input_dir.exists(): - raise ValueError(f"Répertoire introuvable: {self.input_dir}") + raise ValueError(f"Directory not found: {self.input_dir}") self.output_dir.mkdir(parents=True, exist_ok=True) self.temp_dir.mkdir(exist_ok=True) @@ -188,49 +189,49 @@ class LidarArchaeoPipeline: if only_viz: invalid = set(only_viz) - set(all_viz_names) if invalid: - raise ValueError(f"Visualisations inconnues: {', '.join(invalid)}. Disponibles: {', '.join(all_viz_names)}") + raise ValueError(f"Unknown visualizations: {', '.join(invalid)}. Available: {', '.join(all_viz_names)}") self.viz_steps = [(n, f) for n, f in VIZ_STEPS if n in only_viz] elif skip_viz: invalid = set(skip_viz) - set(all_viz_names) if invalid: - raise ValueError(f"Visualisations inconnues: {', '.join(invalid)}. Disponibles: {', '.join(all_viz_names)}") + raise ValueError(f"Unknown visualizations: {', '.join(invalid)}. Available: {', '.join(all_viz_names)}") self.viz_steps = [(n, f) for n, f in VIZ_STEPS if n not in skip_viz] else: - # Sans --only/--skip : seules les couches affichées par la carte - # (PANEL_VIZ, index.py) sont produites. + # Without --only/--skip: only the layers shown on the map + # (PANEL_VIZ, index.py) are produced. from .index import panel_steps default = panel_steps() self.viz_steps = [(n, f) for n, f in VIZ_STEPS if default is None or n in default] - logger.info("Pipeline initialisé") - logger.info(f" Entrée : {self.input_dir}") - logger.info(f" Sortie : {self.output_dir}") + logger.info("Pipeline initialized") + logger.info(f" Input : {self.input_dir}") + logger.info(f" Output : {self.output_dir}") if len(self.resolutions) > 1: - logger.info(f" Résolutions : {', '.join(f'{r}m/px' for r in self.resolutions)}") + logger.info(f" Resolutions : {', '.join(f'{r} m/px' for r in self.resolutions)}") else: - logger.info(f" Résolution : {self.resolution}m/px") + logger.info(f" Resolution : {self.resolution} m/px") logger.info(f" Workers : {workers}") - logger.info(f" Force : {'OUI' if self.force else 'non (skip existing)'}") - logger.info(f" Classification sol : {self.ground_method}") - logger.info(f" Force classif.: {'OUI' if self.force_classify else 'non'}") - logger.info(f" Keep TIFF : {'OUI' if self.keep_tif else 'non'}") + logger.info(f" Force : {'YES' if self.force else 'no (skip existing)'}") + logger.info(f" Ground classification: {self.ground_method}") + logger.info(f" Force classif.: {'YES' if self.force_classify else 'no'}") + logger.info(f" Keep TIFF : {'YES' if self.keep_tif else 'no'}") if self.edge_buffer > 0: - logger.info(f" Raccord bords: {self.edge_buffer:g} m (points sol des tuiles voisines)") - logger.info(f" Qualité {self.output_format.upper()}: {self.quality if self.quality < 100 else 'lossless'}") + logger.info(f" Edge buffer : {self.edge_buffer:g} m (ground points from neighboring tiles)") + logger.info(f" {self.output_format.upper()} quality: {self.quality if self.quality < 100 else 'lossless'}") if only_viz: - logger.info(f" Visualisations: uniquement {', '.join(only_viz)}") + logger.info(f" Visualizations: only {', '.join(only_viz)}") elif skip_viz: - logger.info(f" Visualisations: tout sauf {', '.join(skip_viz)}") - logger.info(f" Visualisations: {len(self.viz_steps)}/{len(VIZ_STEPS)}") + logger.info(f" Visualizations: all except {', '.join(skip_viz)}") + logger.info(f" Visualizations: {len(self.viz_steps)}/{len(VIZ_STEPS)}") def find_laz_files(self): - """Find all LAZ/LAS files in input directory, triés du nord au sud. + """Find all LAZ/LAS files in the input directory, sorted north to south. - Les tuiles LHD_FXX_{col}_{row} sont ordonnées par ligne décroissante - (row = nord en km) puis colonne croissante : les workers prennent les - fichiers dans l'ordre de soumission, la carte se remplit ainsi du nord - vers le sud lors des passes globales. Les fichiers hors pattern LHD - restent triés par nom, en fin de liste. + LHD_FXX_{col}_{row} tiles are ordered by decreasing row (row = northing + in km), then increasing column: workers pick files up in submission + order, so the map fills from north to south during full passes. Files + that do not match the LHD pattern are sorted by name at the end of the + list. """ from .index import parse_basename_coords files = list(self.input_dir.glob("*.laz")) + list(self.input_dir.glob("*.las")) @@ -243,7 +244,7 @@ class LidarArchaeoPipeline: return (1, 0, 0, f.name) files.sort(key=_north_key) - logger.info(f"{len(files)} fichier(s) LiDAR trouvé(s) — triés du nord au sud") + logger.info(f"{len(files)} LiDAR file(s) found — sorted north to south") for f in files: logger.debug(f" {f.name}") return files @@ -256,7 +257,7 @@ class LidarArchaeoPipeline: version = result.stdout.strip().split('\n')[0] logger.info(f" ✓ {name}: {version}") except (subprocess.CalledProcessError, FileNotFoundError): - logger.error(f" ✗ {name} non disponible") + logger.error(f" ✗ {name} not available") return False return True @@ -265,7 +266,7 @@ class LidarArchaeoPipeline: """Return the expected output filename for a visualization step.""" ext = 'avif' if output_format == 'avif' else 'webp' if name in LOSSLESS_GRAY_KEYWORDS: - ext = 'webp' # aplats de niveaux : WebP sans perte (rendering.tif_to_crop) + ext = 'webp' # flat level classes: lossless WebP (rendering.tif_to_crop) if name == 'pos_open': return file_vis_dir / f"{basename}_positive_openness.{ext}" elif name == 'neg_open': @@ -278,13 +279,13 @@ class LidarArchaeoPipeline: def generate_all_visualizations(self, dtm_file, basename, resolution=None, vis_dir=None, force_images=None): """Generate all archaeological visualizations for one DTM file. - Optimisation: SharedDEM is only computed if at least one visualization - needs to be generated. When all WebP outputs exist, SharedDEM is - skipped entirely (saves ~2min per file on re-runs). + Optimization: SharedDEM is only computed if at least one visualization + needs to be generated. When all output images (AVIF/WebP) exist, + SharedDEM is skipped entirely (saves time on re-runs). """ if resolution is None: resolution = self.resolution - logger.info(" Génération visualisations:") + logger.info(" Generating visualizations:") # Use provided vis_dir (for multi-resolution subdirectories) or default file_vis_dir = vis_dir if vis_dir else (self.vis_dir / basename) @@ -298,15 +299,15 @@ class LidarArchaeoPipeline: if force_viz: needs_generation[name] = True else: - expected_webp = self._expected_output_path(name, basename, file_vis_dir, self.output_format) - needs_generation[name] = not expected_webp.exists() + expected_img = self._expected_output_path(name, basename, file_vis_dir, self.output_format) + needs_generation[name] = not expected_img.exists() to_generate = [n for n, needed in needs_generation.items() if needed] needs_shared = any(name not in ('ortho', 'topo') for name in to_generate) if not to_generate: - logger.info(" Toutes les visualisations déjà existantes — ignorées") - # Still need to return results dict for PDF check + logger.info(" All visualizations already exist — skipped") + # Still return the results dict (expected output paths) vis_results = {} for name, func in self.viz_steps: vis_results[name] = self._expected_output_path(name, basename, file_vis_dir, self.output_format) @@ -315,16 +316,16 @@ class LidarArchaeoPipeline: # Phase 2: compute SharedDEM only if needed shared = None if needs_shared: - logger.info(" Pré-calcul données partagées (gradient, LRM)...") + logger.info(" Precomputing shared data (gradient, LRM)...") t_shared = time.time() shared = SharedDEM(dtm_file, resolution) - logger.info(f" ✓ Données partagées prêtes ({time.time()-t_shared:.1f}s)") + logger.info(f" ✓ Shared data ready ({time.time()-t_shared:.1f}s)") # Phase 3: generate visualizations vis_results = {} for idx, (name, func) in enumerate(self.viz_steps, 1): if not needs_generation[name]: - logger.info(f" [{idx}/{total}] {name}: déjà existant, ignoré") + logger.info(f" [{idx}/{total}] {name}: already exists, skipped") self._report(basename, "viz", "skip", name, res=resolution) vis_results[name] = self._expected_output_path(name, basename, file_vis_dir, self.output_format) continue @@ -371,7 +372,7 @@ class LidarArchaeoPipeline: # Convert to output format (only newly generated TIFs, not skipped ones) fmt_label = self.output_format.upper() - logger.info(f" Conversion images {fmt_label}:") + logger.info(f" Converting images to {fmt_label}:") for name, tif_file in vis_results.items(): if tif_file and isinstance(tif_file, Path) and tif_file.suffix == '.tif' and tif_file.exists(): img_file = tif_to_crop(tif_file, file_vis_dir, resolution, keep_tif=self.keep_tif, quality=self.quality, output_format=self.output_format, subtiles_dir=self.output_dir) @@ -408,10 +409,11 @@ class LidarArchaeoPipeline: return None def _effective_ground_method(self): - """Méthode effective pour le suivi de cache, classes IGN incluses. + """Effective method for cache tracking, IGN classes included. - La méthode 'ign' est étiquetée avec les classes choisies (ex. 'ign_1_2') - pour qu'un changement de --ign-classes déclenche la reclassification. + The 'ign' method is labeled with the chosen classes (e.g. 'ign_1_2') + so that changing --ign-classes triggers reclassification (the default + class list, ground only, keeps the plain 'ign' label). """ if self.ground_method == 'ign': from .dtm import parse_ign_classes, ign_method_label @@ -428,12 +430,13 @@ class LidarArchaeoPipeline: return recorded is None or recorded == self._effective_ground_method() def _strip_align_matches(self, basename, res_suffix): - """True si le sidecar de calage des faisceaux correspond à la config. + """True if the strip-alignment sidecar matches the current config. - Un DTM sans sidecar (antérieur au calage) est régénéré pour mesurer - et consigner ses offsets ; un sidecar de version, de seuil ou de - paramètres de gigue intra-faisceau différents aussi. Calage désactivé : - tout DTM porteur d'un sidecar (donc calé) est régénéré non calé. + A DTM without a sidecar (older than strip alignment) is regenerated to + measure and record its offsets; so is one whose sidecar has a different + version, threshold, intra-strip jitter parameters or scan-line + parameters (window, cell, model). With alignment disabled, any DTM + carrying a sidecar (hence aligned) is regenerated unaligned. """ sidecar = self.dtm_dir / f"{basename}_dtm{res_suffix}_stripalign.json" if not self.strip_align: @@ -462,34 +465,34 @@ class LidarArchaeoPipeline: pass def _edge_buffer_matches(self, dtm_path): - """True si le tampon de raccord du DTM correspond à la config. + """True if the DTM edge buffer matches the current config. - Le tampon est inscrit dans le tag GeoTIFF LIDAR_EDGE_BUFFER (dtm.py). - Un DTM sans tag (antérieur au raccord) compte comme tampon 0 : - activer --edge-buffer régénère donc les DTM en cache, le désactiver - régénère les DTM raccordés. + The buffer is stored in the LIDAR_EDGE_BUFFER GeoTIFF tag (dtm.py). + A DTM without the tag (older than edge stitching) counts as buffer 0: + enabling --edge-buffer therefore regenerates cached DTMs, and disabling + it regenerates buffered ones. """ from .dtm import read_dtm_edge_buffer return abs(read_dtm_edge_buffer(dtm_path) - self.edge_buffer) < 1e-6 def _gap_fill_matches(self, dtm_path): - """True si le DTM a été comblé par la version courante (tag - LIDAR_GAP_FILL, dtm.py) ; absent = ancien comblement à distance fixe.""" + """True if the DTM gaps were filled by the current version (the + LIDAR_GAP_FILL tag, dtm.py); missing = old fixed-distance filling.""" from .dtm import read_dtm_gap_fill, GAP_FILL_VERSION return read_dtm_gap_fill(dtm_path) == GAP_FILL_VERSION def _fetch_edge_neighbors(self, files): - """Télécharge les dalles LAZ voisines manquantes (raccord des bords). + """Download missing neighboring LAZ tiles (edge stitching). - La bande de raccord lit les 8 LAZ adjacentes de chaque tuile ; celles - absentes sont téléchargées depuis le catalogue IGN avant de lancer - les workers, dans le sous-dossier input/edge_neighbors/ : elles ne - doivent PAS rejoindre input/ à plat, sinon les passes globales - (« tout input/ ») les comptent comme des tuiles à rendre et la zone - grandit d'un anneau à chaque relance. La liste est dédupliquée sur - tout le lot : la couronne d'un bloc contigu ne coûte qu'un passage. - Une dalle introuvable (zone non publiée) ou en échec laisse simplement - la bande vide — le rendu continue (best-effort). + The edge band reads the 8 LAZ tiles adjacent to each tile; missing ones + are downloaded from the IGN catalog before the workers start, into the + input/edge_neighbors/ subdirectory: they must NOT land flat in input/, + otherwise full passes ("all of input/") would count them as tiles to + render and the area would grow by one ring on every rerun. The list is + deduplicated across the whole batch: the ring around a contiguous + block costs a single pass. A tile that cannot be found (unpublished + area) or fails to download simply leaves the band empty — rendering + continues (best effort). """ if self.edge_buffer <= 0: return @@ -512,30 +515,29 @@ class LidarArchaeoPipeline: if not missing: return edge_dir.mkdir(parents=True, exist_ok=True) - logger.info(f"Raccord des bords : {len(missing)} dalle(s) voisine(s) " - f"absente(s) — téléchargement dans {EDGE_NEIGHBORS_DIRNAME}/ " - f"(catalogue IGN)") + logger.info(f"Edge stitching: {len(missing)} missing neighboring " + f"tile(s) — downloading into {EDGE_NEIGHBORS_DIRNAME}/ " + f"(IGN catalog)") t0 = time.time() from concurrent.futures import ThreadPoolExecutor with ThreadPoolExecutor(max_workers=4) as pool: fetched = [path for batch in pool.map( lambda spec: fetch_tiles(edge_dir, [spec]), missing) for path in batch] - logger.info(f"Raccord des bords : {len(fetched)}/{len(missing)} dalle(s) " - f"voisine(s) téléchargée(s) ({time.time() - t0:.0f} s)") + logger.info(f"Edge stitching: {len(fetched)}/{len(missing)} neighboring " + f"tile(s) downloaded ({time.time() - t0:.0f} s)") def _cleanup_edge_neighbor_duplicates(self, edge_dir): - """Supprime de edge_neighbors/ les dalles déjà présentes dans input/. + """Remove from edge_neighbors/ the tiles already present in input/. - Une dalle téléchargée comme voisine avant d'être requise comme tuile - principale (ou l'inverse) peut se retrouver dupliquée aux deux - emplacements (avant que fetch_tiles ne promeuve les nouvelles - voisines) ; l'exemplaire d'input/ fait foi (_neighbor_laz_files - cherche dans input/ avant edge_neighbors/), le doublon ne sert donc - à rien et peut peser plusieurs centaines de Mo. Les fichiers ".part" - (téléchargement en cours) ne sont jamais touchés, et un doublon de - taille différente est conservé (l'exemplaire d'input/ pourrait être - tronqué : on ne supprime jamais ce qui serait la seule copie saine). + A tile downloaded as a neighbor before being requested as a main tile + (or the reverse) can end up duplicated in both locations (before + fetch_tiles promotes the new neighbors); the copy in input/ is + authoritative (_neighbor_laz_files searches input/ before + edge_neighbors/), so the duplicate is useless and can weigh several + hundred MB. ".part" files (download in progress) are never touched, + and a duplicate of a different size is kept (the copy in input/ could + be truncated: never delete what might be the only sound copy). """ from .dtm import EDGE_NEIGHBORS_DIRNAME if not edge_dir.is_dir(): @@ -551,9 +553,9 @@ class LidarArchaeoPipeline: try: size = path.stat().st_size if twin.stat().st_size != size: - logger.warning(f"Raccord des bords : {path.name} présent dans input/ " - f"et {EDGE_NEIGHBORS_DIRNAME}/ avec des tailles " - f"différentes — doublon conservé") + logger.warning(f"Edge stitching: {path.name} present in input/ " + f"and {EDGE_NEIGHBORS_DIRNAME}/ with different " + f"sizes — duplicate kept") continue path.unlink() freed += size @@ -561,12 +563,12 @@ class LidarArchaeoPipeline: except OSError: pass if removed: - logger.info(f"Raccord des bords : {removed} doublon(s) supprimé(s) de " - f"{EDGE_NEIGHBORS_DIRNAME}/ (déjà dans input/, " - f"{freed / 1e6:.0f} Mo libérés)") + logger.info(f"Edge stitching: {removed} duplicate(s) removed from " + f"{EDGE_NEIGHBORS_DIRNAME}/ (already in input/, " + f"{freed / 1e6:.0f} MB freed)") def _report(self, basename, phase, state, detail=None, res=None): - """Émet un événement de progression (file de génération, best-effort).""" + """Emit a progress event (generation queue, best effort).""" report_event(self.output_dir, basename, phase, state, detail=detail, res=res) def process_file(self, laz_file): @@ -582,13 +584,13 @@ class LidarArchaeoPipeline: t_start = time.time() logger.info("=" * 60) - logger.info(f"FICHIER : {basename}") + logger.info(f"FILE: {basename}") logger.info("=" * 60) # Validate file integrity before any processing from .dtm import validate_laz if not validate_laz(laz_file): - self._report(basename, "tile", "fail", "fichier LAZ invalide") + self._report(basename, "tile", "fail", "invalid LAZ file") return False # Step 1: Ground classification (shared across all resolutions) @@ -606,17 +608,17 @@ class LidarArchaeoPipeline: dtm_path = self.dtm_dir / f"{basename}_dtm{res_suffix}.tif" if dtm_path.exists() and not self.force_classify: if not self._strip_align_matches(basename, res_suffix): - logger.info(f" DTM{res_suffix} sans calage de faisceaux conforme — régénération (offsets verticaux mesurés et appliqués)") + logger.info(f" DTM{res_suffix} lacks up-to-date strip alignment — regenerating (vertical offsets measured and applied)") dtm_path.unlink() elif not self._gap_fill_matches(dtm_path): - logger.info(f" DTM{res_suffix} au comblement d'une version antérieure — régénération " - f"(vides comblés dans l'enveloppe des points, rayon selon la densité)") + logger.info(f" DTM{res_suffix} gap-filled by an older version — regenerating " + f"(gaps filled within the point envelope, radius based on density)") dtm_path.unlink() elif not self._edge_buffer_matches(dtm_path): from .dtm import read_dtm_edge_buffer recorded = read_dtm_edge_buffer(dtm_path) - logger.info(f" DTM{res_suffix} avec raccord de {recorded:g} m ≠ {self.edge_buffer:g} m " - f"demandé — régénération (bande de bord des tuiles voisines)") + logger.info(f" DTM{res_suffix} has a {recorded:g} m edge buffer ≠ {self.edge_buffer:g} m " + f"requested — regenerating (edge band from neighboring tiles)") dtm_path.unlink() elif method_matches: import rasterio @@ -624,61 +626,62 @@ class LidarArchaeoPipeline: with rasterio.open(dtm_path) as src: existing_res = abs(src.transform.a) if abs(existing_res - res) > 0.01: - logger.info(f" DTM{res_suffix} existant à {existing_res}m/px — résolution demandée {res}m/px → régénération") + logger.info(f" Existing DTM{res_suffix} at {existing_res} m/px — requested resolution {res} m/px → regenerating") dtm_path.unlink() else: if i == 0: - logger.info(f"[1/5] Classification du sol — sautée (DTM existant)") - logger.info(f"[2/5] Génération DTM {res}m/px — sautée (DTM existant)") - self._report(basename, "classif", "skip", "DTM existant") - # Sidecar qualité (densité sol, dates de vol) pour - # l'encart de l'export PDF : DTM réutilisé depuis le - # cache — la classification sol a été sautée, donc - # mesure directement sur le LAZ d'entrée avec les - # classes IGN du run (ensure_quality ne recalcule - # rien si le sidecar existe déjà : coût en régime - # établi = une lecture JSON). + logger.info("[1/5] Ground classification — skipped (existing DTM)") + logger.info(f"[2/5] DTM generation {res} m/px — skipped (existing DTM)") + self._report(basename, "classif", "skip", "existing DTM") + # Quality sidecar (ground density, flight dates) for + # the PDF export inset: DTM reused from the cache — + # ground classification was skipped, so measure + # directly on the input LAZ with the run's IGN + # classes (ensure_quality recomputes nothing if the + # sidecar already exists: steady-state cost = one + # JSON read). from .dtm import parse_ign_classes from .quality import ensure_quality ensure_quality(laz_file, basename, self.output_dir, codes=tuple(parse_ign_classes(self.ign_classes))) else: - logger.info(f" DTM {res}m/px déjà existant — ignoré") + logger.info(f" DTM {res} m/px already exists — skipped") self._report(basename, "dtm", "skip", res=res) continue except Exception: - logger.warning(f"Impossible de lire le DTM existant — régénération") + logger.warning("Cannot read the existing DTM — regenerating") dtm_path.unlink() else: - logger.info(f" DTM{res_suffix} produit par {self._dtm_method_name(basename, primary_suffix) or '?'} ≠ {self._effective_ground_method()} → reclassification") + logger.info(f" DTM{res_suffix} produced by {self._dtm_method_name(basename, primary_suffix) or '?'} ≠ {self._effective_ground_method()} → reclassifying") dtm_path.unlink() # Need to classify/generate DTM for this resolution if las_file is None: # First time: do ground classification - logger.info("[1/5] Classification du sol...") + logger.info("[1/5] Ground classification...") self._report(basename, "classif", "start") t1 = time.time() las_file = classify_ground(laz_file, self.temp_dir, method=self.ground_method, force=self.force_classify, ign_classes=self.ign_classes) t_classif = time.time() - t1 if not las_file: - logger.error(f" ✗ Échec classification ({t_classif:.1f}s)") + logger.error(f" ✗ Classification failed ({t_classif:.1f}s)") self._report(basename, "classif", "fail") - self._report(basename, "tile", "fail", "échec classification") + self._report(basename, "tile", "fail", "classification failed") return False - logger.info(f" ✓ Classification terminée ({t_classif:.1f}s)") + logger.info(f" ✓ Classification done ({t_classif:.1f}s)") self._report(basename, "classif", "ok") # Generate DTM at this resolution - logger.info(f"{'[2/5]' if i == 0 else ' '} Génération DTM {res}m/px...") + logger.info(f"{'[2/5]' if i == 0 else ' '} DTM generation {res} m/px...") self._report(basename, "dtm", "start", res=res) t2 = time.time() - # Classification IGN → mode pur : DTM = rasterisation brute des - # classes choisies, sans plancher ni comblement + # IGN classification → "pure" flag. create_dtm_fast now ignores it + # (kept for compatibility): small gaps are filled and strip + # alignment applies whatever the classification method. pure_ign = "_ground_ign" in Path(las_file).name - # Classes des voisines pour la bande de raccord : mêmes classes IGN - # que le MNT (les voisines sont lues dans leur pré-classification - # fournisseur, quelle que soit la méthode de la tuile centrale). + # Neighbor classes for the edge band: same IGN classes as the DTM + # (neighbors are read in their provider pre-classification, + # whatever the method used for the central tile). from .dtm import parse_ign_classes neighbor_codes = parse_ign_classes(self.ign_classes) dtm_file = create_dtm_fast(las_file, basename, self.dtm_dir, res, @@ -691,29 +694,29 @@ class LidarArchaeoPipeline: neighbor_classes=neighbor_codes) t_dtm = time.time() - t2 if not dtm_file: - logger.error(f" ✗ Échec DTM {res}m/px ({t_dtm:.1f}s)") + logger.error(f" ✗ DTM {res} m/px failed ({t_dtm:.1f}s)") self._report(basename, "dtm", "fail", res=res) if i == 0: - self._report(basename, "tile", "fail", "échec DTM") + self._report(basename, "tile", "fail", "DTM failed") return False # Primary resolution failure is fatal continue # Additional resolution failure is non-fatal - logger.info(f" ✓ DTM {res}m/px terminé ({t_dtm:.1f}s)") + logger.info(f" ✓ DTM {res} m/px done ({t_dtm:.1f}s)") self._report(basename, "dtm", "ok", res=res) dtm_rebuilt = True self._write_dtm_method(basename, res_suffix) if i == 0: - # Sidecar qualité (densité sol, dates de vol) pour l'encart de - # l'export PDF : DTM fraîchement généré — mesure sur le LAS sol - # déjà filtré (le cas DTM réutilisé depuis le cache est couvert - # plus haut, avant le `continue`). + # Quality sidecar (ground density, flight dates) for the PDF + # export inset: freshly generated DTM — measured on the already + # filtered ground LAS (the cached-DTM case is handled above, + # before the `continue`). from .quality import ensure_quality ensure_quality(las_file, basename, self.output_dir) - # Process each resolution: visualizations + PDF - # Option de calcul (surcharge le défaut du module) appliquée ICI car les - # workers (spawn) réimportent les modules à froid : c'est le seul endroit - # qui s'exécute dans le processus qui fait le calcul. + # Process each resolution: visualizations + image conversion + # Computation option (overrides the module default) applied HERE because + # workers (spawn) re-import modules from scratch: this is the only place + # that runs inside the process doing the computation. if self.openness_downsample is not None: from . import visualizations as _viz_mod _viz_mod.OPENNESS_DOWNSAMPLE = max(1, int(self.openness_downsample)) @@ -723,7 +726,7 @@ class LidarArchaeoPipeline: dtm_path = self.dtm_dir / f"{basename}_dtm{res_suffix}.tif" if not dtm_path.exists(): - logger.warning(f" DTM {res}m/px manquant — visualisations ignorées") + logger.warning(f" DTM {res} m/px missing — visualizations skipped") continue import rasterio @@ -731,7 +734,7 @@ class LidarArchaeoPipeline: actual_res = abs(src.transform.a) if len(self.resolutions) > 1: - logger.info(f" --- Résolution {res}m/px ---") + logger.info(f" --- Resolution {res} m/px ---") # For additional resolutions, use suffixed subdirectory if res_suffix: @@ -746,26 +749,27 @@ class LidarArchaeoPipeline: force_images=self.force or self.force_classify or dtm_rebuilt) t_total = time.time() - t_start - logger.info(f"✓ {basename} terminé en {t_total:.1f}s") + logger.info(f"✓ {basename} done in {t_total:.1f}s") self._report(basename, "tile", "ok", f"{t_total:.0f}s") _file_filter.basename = None return True def _rebuild_index_incremental(self): - """Régénère la carte juste après une tuile terminée (mode incrémental). + """Rebuild the map inventory right after a tile finishes (incremental mode). - Réécrit index_tiles.json (et rafraîchit vignettes/sous-tuiles) pour - que la carte affiche la tuile sans attendre la fin du run. Anti-rebond : 3 s minimum entre - deux passes — les tuiles terminées pendant l'intervalle sont couvertes - par la passe suivante ou par la passe finale. Les logs de build_index - sont masqués pour ne pas noyer le journal du run. + Rewrites index_tiles.json (and refreshes thumbnails/subtiles) so the + map shows the tile without waiting for the end of the run. Debounce: + at least 3 s between two passes — tiles finished during the interval + are covered by a deferred pass scheduled at the end of the interval + (or by the final pass). build_index logs are silenced so they do not + flood the run log. """ if self.no_index: return wait = 3.0 - (time.time() - self._last_index_rebuild) if wait > 0: - # Anti-rebond : la dalle n'est pas oubliée, une passe différée la - # couvre dès la fin de l'intervalle (sans attendre la dalle suivante). + # Debounce: the tile is not forgotten, a deferred pass covers it as + # soon as the interval ends (without waiting for the next tile). with self._index_lock: if self._index_timer is None: self._index_timer = threading.Timer(wait, self._rebuild_index_now) @@ -787,23 +791,23 @@ class LidarArchaeoPipeline: finally: logger.setLevel(saved_level) except Exception as e: - logger.debug(f"Rebuild incrémental de l'index ignoré : {e}") + logger.debug(f"Incremental index rebuild skipped: {e}") def process_all(self, files=None): """Process all LAZ files in input directory (or an explicit list).""" files = files if files is not None else self.find_laz_files() if not files: - logger.error("Aucun fichier LAZ/LAS trouvé !") + logger.error("No LAZ/LAS file found!") return logger.info("=" * 60) - logger.info("PIPELINE ARCHÉOLOGIQUE LiDAR") + logger.info("LiDAR ARCHAEOLOGICAL PIPELINE") logger.info("=" * 60) - logger.info("Vérification des outils...") + logger.info("Checking tools...") if not self.check_tools(): - logger.error("Outils manquants — abandon") + logger.error("Missing tools — aborting") return results = {} @@ -813,29 +817,29 @@ class LidarArchaeoPipeline: if self.gpu_ids is not None: restrict_gpus(self.gpu_ids) - # Raccord des bords : pré-télécharger les voisines manquantes avant - # les workers (no-op si le raccord est désactivé). + # Edge stitching: pre-download missing neighbors before starting the + # workers (no-op when edge stitching is disabled). self._fetch_edge_neighbors(files) if self.workers > 1 and len(files) > 1: n_gpus = num_gpus() or 1 if n_gpus > 1: - logger.info(f"Traitement parallèle avec {self.workers} workers sur {n_gpus} GPUs...") + logger.info(f"Parallel processing with {self.workers} workers on {n_gpus} GPUs...") else: - logger.info(f"Traitement parallèle avec {self.workers} workers...") - logger.info(f"Fichiers: {len(files)}") + logger.info(f"Parallel processing with {self.workers} workers...") + logger.info(f"Files: {len(files)}") - # Une place fixe par processus du pool (GPU ou CPU), prise à sa - # création : au plus « VRAM libre / pic d'un worker » processus par - # GPU. L'affectation par numéro de fichier (round-robin) laissait - # 6 workers sur chaque GPU de 8 Go avec LIDAR_WORKERS=auto : OOM. + # One fixed slot per pool process (GPU or CPU), taken when the + # process starts: at most "free VRAM / peak per worker" processes + # per GPU. Assignment by file number (round-robin) used to put + # 6 workers on each 8 GB GPU with LIDAR_WORKERS=auto: OOM. active_ids = self.gpu_ids if self.gpu_ids else available_gpu_ids() slots = gpu_worker_slots(active_ids, self.workers) if active_ids: - per_gpu = ", ".join(f"GPU {g} : {slots.count(g)}" for g in active_ids) + per_gpu = ", ".join(f"GPU {g}: {slots.count(g)}" for g in active_ids) n_cpu = slots.count(-1) - logger.info(f"Répartition des workers : {per_gpu}" - + (f", CPU : {n_cpu} (VRAM insuffisante)" if n_cpu else "")) + logger.info(f"Worker distribution: {per_gpu}" + + (f", CPU: {n_cpu} (insufficient VRAM)" if n_cpu else "")) slot_queue = multiprocessing.Queue() for slot in slots: slot_queue.put(slot) @@ -850,9 +854,9 @@ class LidarArchaeoPipeline: done = 0 t_deadline = time.time() + 7200 try: - # timeout= : sans lui, as_completed bloque entre deux - # complétions et le délai de 2 h n'est jamais évalué si - # aucun worker ne rend la main (run figé pour toujours). + # timeout=: without it, as_completed blocks between two + # completions and the 2 h deadline is never evaluated if + # no worker returns (run stuck forever). try: futures_iter = as_completed(future_to_file, timeout=max(1.0, t_deadline - time.time())) @@ -868,38 +872,38 @@ class LidarArchaeoPipeline: self._rebuild_index_incremental() except Exception as e: logger.error(f" [{done}/{len(files)}] ✗ {laz_file.name}: {e}") - logger.debug(f" Traceback:", exc_info=True) + logger.debug(" Traceback:", exc_info=True) report_event(self.output_dir, _file_basename(laz_file), "tile", "fail", detail=str(e)) results[laz_file.name] = False except FuturesTimeoutError: - logger.error("Délai dépassé (2h) — annulation des workers restants") + logger.error("Timeout exceeded (2 h) — cancelling remaining workers") for f in future_to_file: f.cancel() except KeyboardInterrupt: - logger.info("Interruption — annulation des travaux en cours...") + logger.info("Interrupted — cancelling running jobs...") for f in future_to_file: f.cancel() executor.shutdown(wait=False, cancel_futures=True) - logger.info("Travaux annulés.") + logger.info("Jobs cancelled.") return else: total = len(files) if self.workers == 1 and len(files) > 1: n_gpus = num_gpus() or 1 if n_gpus > 1: - logger.info(f"Conseil : utilisez -w {n_gpus} pour exploiter tous les GPUs") + logger.info(f"Tip: use -w {n_gpus} to take advantage of all GPUs") for idx, laz_file in enumerate(files, 1): - logger.info(f"--- Fichier {idx}/{total} ---") + logger.info(f"--- File {idx}/{total} ---") try: results[laz_file.name] = self.process_file(laz_file) if results[laz_file.name] and self.incremental_index: self._rebuild_index_incremental() except KeyboardInterrupt: - logger.info("Interruption — arrêt immédiat.") + logger.info("Interrupted — stopping immediately.") return except Exception as e: - logger.error(f"✗ Erreur traitement {laz_file.name}: {e}") + logger.error(f"✗ Error processing {laz_file.name}: {e}") logger.debug("Traceback:", exc_info=True) report_event(self.output_dir, _file_basename(laz_file), "tile", "fail", detail=str(e)) @@ -911,46 +915,46 @@ class LidarArchaeoPipeline: fail_count = sum(1 for v in results.values() if not v) logger.info("=" * 60) - logger.info("RÉSUMÉ") + logger.info("SUMMARY") logger.info("=" * 60) for name, ok in results.items(): status = "✓" if ok else "✗" logger.info(f" {status} {name}") logger.info("-" * 60) - logger.info(f" Succès : {success_count}/{len(results)}") + logger.info(f" Succeeded: {success_count}/{len(results)}") if fail_count: - logger.info(f" Échecs : {fail_count}/{len(results)}") - logger.info(f" Durée totale : {t_pipeline_total:.1f}s ({t_pipeline_total/60:.1f}min)") + logger.info(f" Failed: {fail_count}/{len(results)}") + logger.info(f" Total time: {t_pipeline_total:.1f}s ({t_pipeline_total/60:.1f} min)") - logger.info(f"\nRésultats dans: {self.output_dir}") + logger.info(f"\nResults in: {self.output_dir}") logger.info(f" • DTM : {self.dtm_dir}") - logger.info(f" • Visualisations: {self.vis_dir}") + logger.info(f" • Visualizations: {self.vis_dir}") - # Génère le catalogue des tuiles traitées (vignettes + inventaire) + # Build the catalog of processed tiles (thumbnails + inventory) if not self.no_index: try: from .index import build_index index_path = build_index(self.output_dir, self.output_format) if index_path: - logger.info(f" • Catalogue : {index_path}") + logger.info(f" • Catalog: {index_path}") except Exception as e: - logger.warning(f"Index global non généré: {e}") + logger.warning(f"Global index not generated: {e}") # Clean up temporary files - logger.info("Nettoyage des fichiers temporaires...") + logger.info("Cleaning up temporary files...") try: if self.temp_dir.exists(): shutil.rmtree(self.temp_dir) - logger.info(" ✓ Fichiers temporaires supprimés") + logger.info(" ✓ Temporary files removed") except Exception as e: - logger.warning(f" Note: Impossible de supprimer les fichiers temporaires: {e}") + logger.warning(f" Note: could not remove temporary files: {e}") def _init_worker_slot(slot_queue): - """Initialiseur du pool : le processus prend sa place une fois pour toutes. + """Pool initializer: the process takes its slot once and for all. - Indice GPU → set_active_gpu ; -1 → CPU forcé (VRAM insuffisante) ; - None ou file vide → choix laissé au worker (pas de GPU détecté). + GPU index → set_active_gpu; -1 → forced CPU (insufficient VRAM); + None or empty queue → left to the worker (no GPU detected). """ import queue from . import gpu @@ -970,8 +974,9 @@ def _process_file_standalone(laz_file_str, input_dir, output_dir, resolution, fo """Standalone function for multiprocessing — creates its own pipeline instance. Each worker gets its own temp directory to avoid file conflicts. - When multiple GPUs are available, each worker is assigned a GPU via - CUDA_VISIBLE_DEVICES to balance load across GPUs. + The GPU is normally assigned once per pool process by _init_worker_slot + (VRAM-bounded slots); gpu_id (process_all passes None) only forces a GPU + for a direct call. """ if gpu_id is not None and gpu_id >= 0: from .gpu import set_active_gpu diff --git a/lidar_pipeline/progress.py b/lidar_pipeline/progress.py index b99ee1f..8c2995d 100644 --- a/lidar_pipeline/progress.py +++ b/lidar_pipeline/progress.py @@ -1,14 +1,14 @@ -"""Progression structurée d'un run de génération (contrat pipeline → interface). +"""Structured progress of a generation run (pipeline → interface contract). -Le pipeline et le téléchargement IGN écrivent des événements JSON ligne à -ligne dans /.generation.events.jsonl ; mapserve les agrège via -/api/status pour afficher les tuiles une par une (nom, type, état) dans la -file de génération, à la place du journal brut. +The pipeline and the IGN download write JSON events, one per line, to +/.generation.events.jsonl; mapserve aggregates them through +/api/status to show tiles one by one (name, type, state) in the generation +queue, instead of the raw log. -Module volontairement découplé du serveur : le rendu des tuiles pourra être -déporté hors du serveur web — le producteur d'événements ne dépend que du -dossier de sortie. Les workers parallèles écrivent chacun leur ligne en mode -ajout (une ligne < 4 Ko avec O_APPEND est atomique sur POSIX). +This module is deliberately decoupled from the server: tile rendering can be +moved out of the web server — the event producer depends only on the output +directory. Parallel workers each write their own line in append mode (a line +< 4 KB written with O_APPEND is atomic on POSIX). """ import json @@ -19,19 +19,19 @@ from pathlib import Path EVENTS_FILENAME = ".generation.events.jsonl" -# Phases d'une tuile, dans l'ordre d'exécution. +# Phases of a tile, in execution order. PHASES = ("download", "classif", "dtm", "viz", "tile") _TILE_RE = re.compile(r"LHD_FXX_(\d+)_(\d+)_") def events_path(output_dir): - """Chemin du journal d'événements d'un run.""" + """Path of a run's event log.""" return Path(output_dir) / EVENTS_FILENAME def tile_short_name(name): - """Nom court d'une tuile : LHD_FXX_1054_6882_PTS_LAMB93_IGN69 → 1054-6882.""" + """Short name of a tile: LHD_FXX_1054_6882_PTS_LAMB93_IGN69 → 1054-6882.""" m = _TILE_RE.search(name or "") if not m: return name @@ -39,20 +39,20 @@ def tile_short_name(name): def reset_events(output_dir): - """Prépare un journal vide pour un nouveau run (tronque l'ancien).""" + """Prepare an empty log for a new run (truncates the previous one).""" try: path = events_path(output_dir) path.parent.mkdir(parents=True, exist_ok=True) path.write_text("", encoding="utf-8") except OSError: - pass # progression best-effort : ne jamais bloquer le traitement + pass # best-effort progress: never block processing def report_event(output_dir, tile, phase, state, detail=None, res=None): - """Ajoute un événement (une ligne JSON). Ne lève jamais. + """Append an event (one JSON line). Never raises. - Ouverture en mode ajout à chaque appel : les workers parallélisés - (ProcessPoolExecutor, 'spawn') ne partagent aucun descripteur de fichier. + The file is opened in append mode on every call: parallel workers + (ProcessPoolExecutor, 'spawn') share no file descriptor. """ event = {"ts": round(time.time(), 3), "tile": tile, "phase": phase, "state": state} run_id = os.environ.get("LIDAR_RUN_ID") @@ -70,7 +70,7 @@ def report_event(output_dir, tile, phase, state, detail=None, res=None): def read_events(output_dir, limit=5000): - """Lit les événements du journal (dernières `limit` lignes, invalides ignorées).""" + """Read the log events (last `limit` lines, invalid ones skipped).""" try: lines = events_path(output_dir).read_text( encoding="utf-8", errors="replace").splitlines() @@ -81,32 +81,32 @@ def read_events(output_dir, limit=5000): try: events.append(json.loads(line)) except ValueError: - continue # ligne partielle en cours d'écriture par le run + continue # partial line still being written by the run return events def _step_label(phase, detail, res, viz_labels): - """Libellé français d'une étape, affiché tel quel dans la file.""" + """Label of a step, displayed as is in the queue.""" if phase == "download": - return "Téléchargement" + return "Download" if phase == "classif": return "Classification" if phase == "dtm": - return f"DTM {str(res).replace('.', ',')} m" + return f"DTM {res} m" if phase == "viz": label = (viz_labels or {}).get(detail, detail) if res is not None and float(res) != 0.5: - label += f" {str(res).replace('.', ',')} m" + label += f" {res} m" return label return detail or phase def aggregate_tiles(events, viz_labels=None): - """Regroupe les événements en tuiles : une entrée par tuile, étapes ordonnées. + """Group events into tiles: one entry per tile, ordered steps. - Retourne [{short, name, state, steps: [{key, label, state, detail}]}] dans - l'ordre de première apparition. État d'une étape : running | ok | fail | - skip. État d'une tuile : pending | running | done | failed. + Returns [{short, name, state, steps: [{key, detail, res, state, label}]}] + in order of first appearance. Step state: running | ok | fail | skip. + Tile state: pending | running | done | failed. """ tiles = {} for ev in events: @@ -120,7 +120,7 @@ def aggregate_tiles(events, viz_labels=None): tile["name"] = name state = ev.get("state") if state == "start": - state = "running" # état d'affichage normalisé + state = "running" # normalized display state detail = ev.get("detail") res = ev.get("res") if ev.get("phase") == "tile": @@ -129,14 +129,14 @@ def aggregate_tiles(events, viz_labels=None): elif state == "fail": tile["state"] = "failed" continue - # Clé d'étape : le détail n'identifie une étape que pour les viz - # (leur nom) — les sous-étapes du téléchargement fusionnent en une. + # Step key: the detail identifies a step only for viz (their name) + # — download sub-steps merge into a single one. phase = ev.get("phase") key = f"viz:{detail}:{res}" if phase == "viz" else f"{phase}:{res}" step = tile["steps"].setdefault( key, {"key": key, "detail": detail, "res": res, "state": state, "label": _step_label(phase, detail, res, viz_labels)}) - # ok/fail sont terminaux — on ne régresse pas vers running/skip + # ok/fail are terminal — never regress to running/skip (fail still overrides ok) if step["state"] not in ("ok", "fail") or state == "fail": step["state"] = state @@ -147,19 +147,19 @@ def aggregate_tiles(events, viz_labels=None): if any(s["state"] == "fail" for s in steps): tile["state"] = "failed" elif steps: - tile["state"] = "running" # pas encore d'événement tuile final + tile["state"] = "running" # no final tile event yet result.append({"short": tile["short"], "name": tile["name"], "state": tile["state"], "steps": steps}) return result def progress_snapshot(output_dir, viz_labels=None, run_id=None): - """État consolidé des tuiles du dernier run (prêt pour /api/status). + """Consolidated tile state of the last run (ready for /api/status). - run_id (LIDAR_RUN_ID posé par mapserve) : ne garde que les événements de - CE run — les workers d'un run annulé peuvent continuer d'écrire (O_APPEND) - après la troncature du journal par le run suivant, et pollueraient sinon - la file affichée. Sans run_id (run CLI autonome) : tout le journal. + run_id (LIDAR_RUN_ID set by mapserve): keeps only the events of THIS + run — workers of a cancelled run may keep writing (O_APPEND) after the + next run truncated the log, and would otherwise pollute the displayed + queue. Without run_id (standalone CLI run): the whole log. """ events = read_events(output_dir) if run_id is not None: diff --git a/lidar_pipeline/quality.py b/lidar_pipeline/quality.py index 8e5ea5a..7e4587f 100644 --- a/lidar_pipeline/quality.py +++ b/lidar_pipeline/quality.py @@ -1,12 +1,12 @@ -"""Qualité des données LiDAR par dalle : densité de points sol et date d'acquisition. +"""Per-tile LiDAR data quality: ground point density and acquisition date. -Un sidecar JSON par dalle (output/quality/{basename}.json) est écrit par le -pipeline, recopié dans l'inventaire (index_tiles.json, table `quality`) et -conservé sur les machines légères : l'encart qualité de l'export PDF le lit -depuis le disque local, amont joignable ou non. +One JSON sidecar per tile (output/quality/{basename}.json) is written by the +pipeline, copied into the inventory (index_tiles.json, `quality` table) and +kept on the lightweight machines: the quality inset of the PDF export reads it +from the local disk, whether the upstream is reachable or not. -numpy n'est importé que par le calcul : l'image légère (sans numpy) lit et -écrit les sidecars. +numpy is only imported by the computation: the lightweight image (without +numpy) reads and writes the sidecars. """ import json @@ -20,32 +20,35 @@ logger = logging.getLogger("lidar") QUALITY_VERSION = 1 QUALITY_DIRNAME = "quality" -DENSITY_CELL_M = 50.0 # maille de la grille de densité (20 × 20 par dalle) -EMPTY_PIXEL_M = 0.2 # pixel du MNT : part sans point sol ≈ part interpolée +DENSITY_CELL_M = 50.0 # density grid cell size (20 × 20 per tile) +EMPTY_PIXEL_M = 0.2 # DTM pixel: share without ground point ≈ interpolated share _GPS_EPOCH = datetime(1980, 1, 6, tzinfo=timezone.utc) -_GPS_ADJUSTED_OFFSET = 1e9 # temps GPS ajusté standard = secondes GPS − 1e9 +_GPS_ADJUSTED_OFFSET = 1e9 # standard adjusted GPS time = GPS seconds − 1e9 def gps_adjusted_to_date(t): - """Temps GPS ajusté standard → date ISO (UTC ; secondes intercalaires - négligées : précision au jour).""" + """Standard adjusted GPS time → ISO date (UTC; leap seconds ignored: + accurate to the day).""" return (_GPS_EPOCH + timedelta(seconds=float(t) + _GPS_ADJUSTED_OFFSET)).date().isoformat() def compute_quality(x, y, gps_time, bounds, gps_adjusted=True, header_date=None): - """Mesure la qualité d'une dalle à partir de ses points sol. + """Measure the quality of a tile from its ground points. Args: - x, y: coordonnées L93 des points sol. - gps_time: temps GPS des points (ou None). - bounds: emprise nominale (min_x, min_y, max_x, max_y) ; les points - hors emprise (bande de raccord) sont ignorés. - gps_adjusted: True si gps_time est en temps GPS ajusté standard. - header_date: date ISO de l'en-tête LAS (repli des dates). + x, y: L93 coordinates of the ground points. + gps_time: GPS time of the points (or None). + bounds: nominal footprint (min_x, min_y, max_x, max_y); points + outside it (edge buffer) are ignored. + gps_adjusted: True if gps_time is standard adjusted GPS time. + header_date: ISO date from the LAS header (date fallback). Returns: - dict JSON-sérialisable (cf. spec, section 1). + JSON-serializable dict: version, ground_density (pts/m²), + density_grid (pts/m² per 50 m cell, rows north to south), + empty_fraction (share of 0.2 m pixels without a ground point), + acq_start / acq_end (ISO dates) and acq_source ("gps", "header" or None). """ import numpy as np @@ -98,12 +101,12 @@ def compute_quality(x, y, gps_time, bounds, gps_adjusted=True, header_date=None) def quality_path(output_dir, basename): - """Chemin du sidecar qualité d'une dalle.""" + """Path of a tile's quality sidecar.""" return Path(output_dir) / QUALITY_DIRNAME / f"{basename}.json" def write_quality(output_dir, basename, data): - """Écrit le sidecar (atomique) ; False si le contenu est déjà identique.""" + """Write the sidecar (atomically); False if the content is already identical.""" path = quality_path(output_dir, basename) payload = json.dumps(data, ensure_ascii=False, sort_keys=True) try: @@ -127,7 +130,7 @@ def write_quality(output_dir, basename, data): def read_quality(output_dir, basename): - """Sidecar d'une dalle, ou None (absent, illisible, autre version).""" + """A tile's sidecar, or None (missing, unreadable, other version).""" try: data = json.loads(quality_path(output_dir, basename).read_text(encoding="utf-8")) except (OSError, ValueError): @@ -138,7 +141,7 @@ def read_quality(output_dir, basename): def load_quality_table(output_dir): - """Tous les sidecars valides : {basename: sidecar}.""" + """All valid sidecars: {basename: sidecar}.""" folder = Path(output_dir) / QUALITY_DIRNAME table = {} if not folder.is_dir(): @@ -154,7 +157,7 @@ _LAZ_EXTS = (".copc.laz", ".copc.las", ".laz", ".las") def _laz_basename(path): - """Nom de dalle sans extension LiDAR (.copc.laz compris).""" + """Tile name without its LiDAR extension (.copc.laz included).""" name = Path(path).name for ext in _LAZ_EXTS: if name.lower().endswith(ext): @@ -163,7 +166,7 @@ def _laz_basename(path): def _cell_bounds_of(basename): - """Emprise nominale 1 km d'une dalle LHD, ou None hors motif LHD.""" + """Nominal 1 km footprint of an LHD tile, or None outside the LHD pattern.""" from .index import parse_basename_coords coords = parse_basename_coords(basename) if coords is None: @@ -173,9 +176,9 @@ def _cell_bounds_of(basename): def quality_from_las(las_path, bounds, codes=None): - """Qualité mesurée depuis un LAS/LAZ ; None en cas d'échec (jamais d'exception). + """Quality measured from a LAS/LAZ; None on failure (never raises). - codes : classes à retenir (retours ≥ 1) ; None = fichier déjà filtré sol. + codes: classes to keep (returns ≥ 1); None = file already filtered to ground. """ try: import laspy @@ -195,16 +198,16 @@ def quality_from_las(las_path, bounds, codes=None): return compute_quality(np.asarray(las.x)[keep], np.asarray(las.y)[keep], gps, bounds, gps_adjusted=adjusted, header_date=created.isoformat() if created else None) - except Exception as e: # noqa: BLE001 — qualité best-effort - logger.warning(f" Mesure de qualité impossible ({Path(las_path).name}) : {e}") + except Exception as e: # noqa: BLE001 — best-effort quality + logger.warning(f" Could not measure quality ({Path(las_path).name}): {e}") return None def ensure_quality(las_path, basename, output_dir, codes=None): - """Garantit le sidecar qualité d'une dalle (calcul si absent ou périmé). + """Ensure a tile's quality sidecar exists (computed if missing or outdated). Returns: - True si un sidecar valide existe à la sortie. + True if a valid sidecar exists on return. """ if read_quality(output_dir, basename) is not None: return True @@ -217,16 +220,16 @@ def ensure_quality(las_path, basename, output_dir, codes=None): try: write_quality(output_dir, basename, data) except OSError as e: - logger.warning(f" Écriture du sidecar qualité impossible : {e}") + logger.warning(f" Could not write the quality sidecar: {e}") return False return True def backfill_quality(input_dir, output_dir, codes=(2,)): - """Rattrapage : sidecar qualité de chaque LAZ LHD d'input_dir qui n'en a pas. + """Backfill: quality sidecar for every LHD LAZ in input_dir that lacks one. Returns: - Nombre de sidecars écrits. + Number of sidecars written. """ files = sorted(p for p in Path(input_dir).iterdir() if p.is_file() and p.name.lower().endswith(_LAZ_EXTS)) @@ -235,7 +238,7 @@ def backfill_quality(input_dir, output_dir, codes=(2,)): base = _laz_basename(laz) if read_quality(output_dir, base) is not None or _cell_bounds_of(base) is None: continue - logger.info(f"Qualité [{i}/{len(files)}] {base}") + logger.info(f"Quality [{i}/{len(files)}] {base}") if ensure_quality(laz, base, output_dir, codes): written += 1 return written diff --git a/lidar_pipeline/rendering.py b/lidar_pipeline/rendering.py index 0ca6d54..cdec524 100644 --- a/lidar_pipeline/rendering.py +++ b/lidar_pipeline/rendering.py @@ -1,9 +1,14 @@ -"""Rendering module: colormap registry, GeoTIFF-to-image conversion, and PDF report generation. +"""Rendering module: colormap registry and GeoTIFF-to-image conversion. Contains: -- COLORMAPS: registry mapping filename keywords to (cmap, title, legend, description) -- tif_to_png(): convert a GeoTIFF to a WebP/AVIF visualization with legend, scale bar, north arrow -- generate_pdf_report(): generate an A3 PDF report with all visualizations +- COLORMAPS: registry mapping filename keywords to a normalization (cmap, + vmin/vmax or quantile knots) plus the texts merged from VIZ_LEGENDS +- tif_to_crop(): convert a GeoTIFF to a bare 1 km AVIF/WebP tile (used by the + pipeline for the map mosaic) +- tif_to_png(): convert a GeoTIFF to an annotated AVIF/WebP sheet (legend, + scale bar, north arrow) — not called by the pipeline +- generate_pdf_report(): legacy per-tile A3 PDF report, no longer called + (the map's PDF export lives in export_pdf.py) """ import logging @@ -69,13 +74,14 @@ _FRANCE_OUTLINE_L93 = np.array([ # ============================================================ # Each entry: keyword → (cmap, vmin_mode, vmax_mode) # vmin_mode/vmax_mode: 'percentile_X_Y' or '0_max_X' or 'symmetric_X_Y' or 'fixed_0_1' -# For RGB images (ortho/topo), special handling is done in tif_to_png. -# Les textes (title/legend/description) viennent de VIZ_LEGENDS (index.py, -# source unique partagée avec l'export multi-dalles) — fusion ci-dessous. +# For RGB images (ortho/topo/relief_oriente), see RGB_LEGENDS below. +# The texts (title/legend/description) come from VIZ_LEGENDS (index.py, the +# single source shared with the map UI, the TileJSON and the PDF export) — +# merged below. COLORMAPS = { - # === Famille RELIEF : rouge=surélévation, bleu=dépression === - # Diverging: rouge vif=positif, bleu vif=négatif, blanc=plat + # === RELIEF family: red = raised, blue = depression === + # Diverging: bright red = positive, bright blue = negative, white = flat 'mslrm': { 'cmap': 'seismic', 'vmin_mode': 'fixed', 'vmin_val': -3, @@ -86,7 +92,7 @@ COLORMAPS = { 'vmin_mode': 'fixed', 'vmin_val': -3, 'vmax_mode': 'fixed', 'vmax_val': 3, }, - # === Famille OUVERTURE : séquentiel, valeurs normalisées === + # === OPENNESS family: sequential, normalized values === 'positive_openness': { 'cmap': 'YlOrBr', 'vmin_mode': 'fixed', 'vmin_val': -3, @@ -102,8 +108,8 @@ COLORMAPS = { 'vmin_mode': 'fixed', 'vmin_val': 0, 'vmax_mode': 'fixed', 'vmax_val': 1, }, - # === Famille SCALAIRE : propriétés non divergentes === - # Clé = mot-clé exact du nom de fichier de sortie (hillshade_multi). + # === SCALAR family: non-diverging properties === + # Key = exact keyword of the output file name (hillshade_multi). 'hillshade_multi': { 'cmap': 'gray', 'vmin_mode': 'fixed', 'vmin_val': 0, @@ -121,19 +127,19 @@ COLORMAPS = { }, 'roughness': { 'cmap': 'plasma', - # vmax fixe (p98 médian mesuré sur 20 dalles réelles) : un vmax au - # percentile par tuile rendait l'échelle non jointive entre tuiles. + # Fixed vmax (median p98 measured on 20 real tiles): a per-tile + # percentile vmax made the scale inconsistent from tile to tile. 'vmin_mode': 'fixed', 'vmin_val': 0, 'vmax_mode': 'fixed', 'vmax_val': 3.8, }, 'wavelet': { 'cmap': 'inferno', - # Nœuds (percentile → valeur) mesurés sur 20 tuiles réelles par - # résolution avec l'algorithme actuel (détendage 35 m, échelles - # 1-50 m) : médiane inter-tuiles des percentiles par tuile, robuste - # aux tuiles très structurées. Distribution plus large qu'avant - # détendage : le fond macro-relief supprimé, les petites structures - # percent bien plus au-dessus du bruit (p98 ≈ 9 vs 1,65 avant). + # Knots (value → percentile) measured on 20 real tiles per + # resolution with the current algorithm (35 m detrending, 1-50 m + # scales): cross-tile median of the per-tile percentiles, robust to + # highly structured tiles. Wider distribution than before + # detrending: with the macro-relief background removed, small + # structures stand out far more above the noise (p98 ≈ 9 vs 1.65 before). 'knots': { 0.5: ([0.089, 0.213, 0.296, 0.445, 0.602, 0.783, 1.0, 1.274, 1.661, 2.32, 3.842, 5.661, 8.936, 11.93, 15.06], @@ -160,7 +166,7 @@ COLORMAPS = { 'vmin_mode': 'fixed', 'vmin_val': 0, 'vmax_mode': 'fixed', 'vmax_val': 1, }, - # Densité de points sol : niveau 0..15 (visualizations.density_levels) + # Ground point density: level 0..15 (visualizations.density_levels) 'densite_sol': { 'cmap': 'gray', 'vmin_mode': 'fixed', 'vmin_val': 0, @@ -168,28 +174,29 @@ COLORMAPS = { }, } -# Couches en aplats de gris codés (niveaux discrets) : image niveaux de gris -# (mode L) encodée SANS PERTE (AVIF q100 en L, seul réglage exact) — l'AVIF q55-60 déplace ~20 % des pixels jusqu'à 4 -# niveaux sur ces aplats. Elles restent à leur résolution propre (1 m pour -# la densité : ~150–260 Ko par dalle). +# Layers made of coded flat gray levels (discrete levels): grayscale image +# (mode L) encoded LOSSLESSLY as WebP (tif_to_crop; Pillow ignores +# lossless=True in AVIF) — AVIF q55-60 shifts ~20% of the pixels by up to 4 +# levels on these flat areas. They stay at their own resolution (1 m for +# the density: ~150–260 KB per tile). LOSSLESS_GRAY_KEYWORDS = ('densite_sol',) -# RGB entries (ortho/topo) are handled specially +# RGB entries (ortho/topo/relief_oriente) are handled specially RGB_LEGENDS = { 'ortho': {}, 'topo': {}, - 'relief_oriente': {}, # RGB calculé (visualizations.generate_relief_oriente) + 'relief_oriente': {}, # computed RGB (visualizations.generate_relief_oriente) } RGB_KEYWORDS = tuple(RGB_LEGENDS) -# Vitesse d'encodage AVIF (libavif, 0 = lent/compact … 10 = rapide). Mesuré -# sur une dalle 5000 × 5000 px (q60) : défaut 4,1 s ; speed 9 0,6 s pour +3 % -# de taille et −0,3 dB de PSNR, invisible. L'encodage était l'étape la plus -# longue du rendu d'une couche. +# AVIF encoding speed (libavif, 0 = slow/compact … 10 = fast). Measured on +# a 5000 × 5000 px tile (q60): default 4.1 s; speed 9 0.6 s for +3% size and +# −0.3 dB PSNR, invisible. Encoding was the longest step of rendering a +# layer. AVIF_SPEED = 9 -# Fusion des textes de légende (titre / lecture du rendu / méthode de calcul) -# depuis la source unique VIZ_LEGENDS (index.py, sans dépendance lourde). +# Merge the legend texts (title / how to read the rendering / computation +# method) from the single source VIZ_LEGENDS (index.py, no heavy dependency). from .index import VIZ_LEGENDS, parse_basename_coords for _key, _info in COLORMAPS.items(): @@ -199,21 +206,21 @@ for _key, _info in RGB_LEGENDS.items(): def _core_tile_window(tif_file, src): - """Fenêtre raster de la dalle nominale 1 km (raccord des bords). + """Raster window of the nominal 1 km tile (edge stitching). - Un TIF produit sur une emprise étendue (bande de raccord remplie avec les - tuiles voisines, cf. --edge-buffer dans dtm.py) est recadré sur la dalle - LHD exacte : les images finales restent des carrés de 1 km alignés sur la - grille multi-tuiles, sans artefact au passage d'une tuile à l'autre. - Retourne None si le TIF ne déborde pas (rien à recadrer) ou si le nom ne - porte pas de coordonnées LHD. + A TIF produced over an extended footprint (edge buffer filled with the + neighboring tiles, see --edge-buffer in dtm.py) is cropped to the exact + LHD tile: the final images remain 1 km squares aligned on the + multi-tile grid, with no artifact from one tile to the next. + Returns None if the TIF does not extend beyond it (nothing to crop) or if + the name carries no LHD coordinates. """ coords = parse_basename_coords(Path(tif_file).stem) if coords is None: return None col_km, row_km = coords - # Grille LHD : (col, row) = coin nord-ouest en km → X ∈ [col, col+1] km, - # Y ∈ [row-1, row] km (bord nord = row). + # LHD grid: (col, row) = north-west corner in km → X ∈ [col, col+1] km, + # Y ∈ [row-1, row] km (north edge = row). west = float(col_km) * 1000.0 north = float(row_km) * 1000.0 south = north - 1000.0 @@ -234,7 +241,7 @@ def _apply_colormap(data, tif_file, resolution=None): """Apply the registered colormap normalization to data based on filename. Returns (data, cmap, title, legend_label, description, is_rgb, vmin, vmax) - où vmin/vmax sont les bornes physiques de la plage rendue (None si sans objet). + where vmin/vmax are the physical bounds of the rendered range (None when not applicable). """ name = str(tif_file).lower() @@ -244,8 +251,8 @@ def _apply_colormap(data, tif_file, resolution=None): info = RGB_LEGENDS[key] return data, None, info['title'], info['legend'], info['description'], True, None, None - # Find matching colormap — tri par longueur décroissante : en cas de - # chevauchement de mots-clés dans un nom de fichier, le plus long prime + # Find matching colormap — sorted by decreasing length: when keywords + # overlap in a file name, the longest one wins for key in sorted(COLORMAPS.keys(), key=len, reverse=True): info = COLORMAPS[key] if key in name: @@ -253,18 +260,18 @@ def _apply_colormap(data, tif_file, resolution=None): valid_data = valid_data[~np.isnan(valid_data)] if len(valid_data) == 0: - logger.warning(f" Aucune donnée valide pour {Path(tif_file).name} — colormap ignorée") + logger.warning(f" No valid data in {Path(tif_file).name} — colormap skipped") return data, 'terrain', Path(tif_file).stem.replace('_', ' ').title(), '', '', False, None, None vmin = vmax = None knots = info.get('knots') if knots is not None: - # Étalonnage quantile figé (appariement d'histogramme global, - # cf. normalisation radiométrique des mosaïques) : fonction de - # transfert en nœuds mesurés une fois sur un échantillon de - # tuiles — même valeur → même couleur sur toutes les tuiles, - # toute la palette utilisée, insensible aux queues locales. + # Frozen quantile calibration (global histogram matching, + # as in radiometric normalization of mosaics): transfer + # function given as knots measured once on a sample of + # tiles — same value → same color on every tile, the whole + # palette is used, insensitive to local tails. if isinstance(knots, dict): key = min(knots, key=lambda r: abs(float(r) - float(resolution or 0.5))) knots = knots[key] @@ -307,11 +314,11 @@ def _apply_colormap(data, tif_file, resolution=None): if len(valid_data) == 0: return data, 'terrain', Path(tif_file).stem.replace('_', ' ').title(), '', '', False p2, p98 = np.percentile(valid_data, (2, 98)) - # Garde contre les tuiles quasi constantes : plage nulle → division par zéro + # Guard against near-constant tiles: zero range → division by zero span = max(p98 - p2, 1e-6) data = np.clip((data - p2) / span, 0, 1) title = Path(tif_file).stem.replace('_', ' ').title() - return data, 'terrain', title, 'Altitude normalisée', '', False, p2, p98 + return data, 'terrain', title, 'Normalized elevation', '', False, p2, p98 def _download_location_map(min_x, max_x, min_y, max_y): @@ -371,8 +378,8 @@ def _download_location_map(min_x, max_x, min_y, max_y): 'min_y': context_min_y, 'max_y': context_max_y, } cached = (result, bounds) - # Éviction FIFO : chaque entrée ~12 Mo (carte ~30 km au zoom 10) — - # un run long sur plusieurs zones ne doit pas empiler sans limite + # FIFO eviction: each entry ~12 MB (~30 km map at zoom 10) — a long + # run over several areas must not pile up without limit while len(_location_map_cache) >= 4: _location_map_cache.pop(next(iter(_location_map_cache))) _location_map_cache[cache_key] = cached @@ -380,7 +387,7 @@ def _download_location_map(min_x, max_x, min_y, max_y): return result except Exception as e: - logger.debug(f" Carte de localisation IGN non disponible: {e}") + logger.debug(f" IGN location map unavailable: {e}") return None @@ -412,7 +419,8 @@ def tif_to_png(tif_file, vis_dir, resolution, keep_tif=False, source_info=None, resolution: Grid resolution in m/px. keep_tif: If True, keep the source TIFF after conversion. source_info: Dict with method/date/basename for metadata. - quality: Image quality (1-100). Use 100 for lossless. Default 60. + quality: Image quality (1-100). Default 60. 100 requests lossless, + which only WebP honors (Pillow ignores lossless=True in AVIF). output_format: Output format ('webp' or 'avif'). Default 'avif'. Returns: @@ -438,8 +446,8 @@ def tif_to_png(tif_file, vis_dir, resolution, keep_tif=False, source_info=None, transform = src.transform crs = src.crs - # Raccord des bords : recadrage sur la dalle nominale 1 km (les - # coordonnées GPS, l'échelle et la légende suivent le recadrage). + # Edge stitching: crop to the nominal 1 km tile (GPS coordinates, + # scale and legend follow the crop). core_win = _core_tile_window(tif_file, src) if core_win is not None: rows = slice(core_win.row_off, core_win.row_off + core_win.height) @@ -518,7 +526,7 @@ def tif_to_png(tif_file, vis_dir, resolution, keep_tif=False, source_info=None, # data is normalized 0-1 from _apply_colormap; apply cmap to get RGBA # Save the colormap for colorbar before converting to RGBA saved_cmap = plt.get_cmap(cmap) if isinstance(cmap, str) else cmap - # Bornes physiques de la colorbar (unités réelles, pas 0-1) + # Physical colorbar bounds (real units, not 0-1) if cmap_vmin is not None and cmap_vmax is not None: saved_vmin, saved_vmax = float(cmap_vmin), float(cmap_vmax) else: @@ -542,7 +550,7 @@ def tif_to_png(tif_file, vis_dir, resolution, keep_tif=False, source_info=None, fig = plt.figure(figsize=(fig_width, fig_height), facecolor='white') # Fixed data area position — identical for ALL visualization types - # This ensures overlay/superposition works across all WebP images + # This ensures overlay/superposition works across all output images data_left = 0.08 data_bottom = 0.19 data_width_frac = 0.74 @@ -614,14 +622,14 @@ def tif_to_png(tif_file, vis_dir, resolution, keep_tif=False, source_info=None, x_labels = [f"{(min_x + xp * pixel_size_x)/1000:.1f}" for xp in x_positions] ax.set_xticks(x_positions) ax.set_xticklabels(x_labels, fontsize=8) - ax.set_xlabel('Est (km) - Lambert 93', fontsize=9, fontweight='bold') + ax.set_xlabel('Easting (km) - Lambert 93', fontsize=9, fontweight='bold') y_ticks_count = 5 y_positions = np.linspace(0, height - 1, y_ticks_count) y_labels = [f"{(max_y - yp * pixel_size_y)/1000:.1f}" for yp in y_positions] ax.set_yticks(y_positions) ax.set_yticklabels(y_labels, fontsize=8) - ax.set_ylabel('Nord (km) - Lambert 93', fontsize=9, fontweight='bold') + ax.set_ylabel('Northing (km) - Lambert 93', fontsize=9, fontweight='bold') ax.tick_params(axis='both', which='both', direction='out', length=3, width=0.8, colors='black') @@ -652,7 +660,7 @@ def tif_to_png(tif_file, vis_dir, resolution, keep_tif=False, source_info=None, north_ax.add_patch(MplPolygon([[0, 0.5], [-0.2, 0.7], [0, 1.0], [0.2, 0.7]], closed=True, facecolor='#b22222', edgecolor='#b22222', zorder=9)) # Cardinal ticks — all centered at (0, 0) - for angle, label in [(90, 'N'), (0, 'E'), (180, 'O'), (270, 'S')]: + for angle, label in [(90, 'N'), (0, 'E'), (180, 'W'), (270, 'S')]: rad = np.radians(angle) north_ax.plot([1.0*np.cos(rad), 1.2*np.cos(rad)], [1.0*np.sin(rad), 1.2*np.sin(rad)], @@ -686,7 +694,7 @@ def tif_to_png(tif_file, vis_dir, resolution, keep_tif=False, source_info=None, # Round resolution to avoid ugly decimals like 0.499999959 res_display = round(resolution, 2) if resolution < 1 else round(resolution, 1) line1_parts.append(f"Res: {res_display}m/px") - line1_parts.append(f"Emprise: {extent_km_x:.1f}×{extent_km_y:.1f}km") + line1_parts.append(f"Extent: {extent_km_x:.1f}×{extent_km_y:.1f}km") if not is_rgb: line1_parts.append(f"Alt: {alt_min:.1f}–{alt_max:.1f}m") @@ -832,13 +840,13 @@ def tif_to_png(tif_file, vis_dir, resolution, keep_tif=False, source_info=None, return output_file except Exception as e: - logger.error(f" Erreur conversion {ext.upper()}: {e}", exc_info=True) + logger.error(f" {ext.upper()} conversion error: {e}", exc_info=True) return None def _write_subtiles_from(img, tif_file, vis_dir, resolution, subtiles_dir): - """Sous-tuiles d'une dalle depuis son image d'origine (best-effort : - en cas d'échec, build_index les découpera depuis la dalle).""" + """Sub-tiles of a tile from its original image (best-effort: on + failure, build_index will cut them from the tile image).""" from .index import VIZ_LABELS, _subdivision_k, write_subtiles try: k = _subdivision_k(resolution) @@ -849,7 +857,7 @@ def _write_subtiles_from(img, tif_file, vis_dir, resolution, subtiles_dir): return write_subtiles(subtiles_dir, Path(vis_dir).name, viz_key, img, k) except Exception as e: - logger.warning(f" Sous-tuiles non écrites ({Path(tif_file).name}) : {e}") + logger.warning(f" Sub-tiles not written ({Path(tif_file).name}): {e}") def tif_to_crop(tif_file, vis_dir, resolution, keep_tif=False, quality=60, output_format='avif', @@ -864,11 +872,12 @@ def tif_to_crop(tif_file, vis_dir, resolution, keep_tif=False, quality=60, outpu vis_dir: Output directory for the image file. resolution: Grid resolution in m/px. keep_tif: If True, keep the source TIFF after conversion. - quality: Image quality (1-100). Use 100 for lossless. + quality: Image quality (1-100). 100 requests lossless, which only + WebP honors (Pillow ignores lossless=True in AVIF). output_format: Output format ('webp' or 'avif'). - subtiles_dir: dossier de sortie du pipeline : les sous-tuiles de la - carte (index_subtiles) y sont écrites depuis l'image d'origine, - un seul encodage avec perte (build_index les trouve à jour). + subtiles_dir: pipeline output directory: the map sub-tiles + (index_subtiles) are written there from the original image, a + single lossy encoding (build_index finds them up to date). Returns: Path to output image file, or None on failure. @@ -889,13 +898,13 @@ def tif_to_crop(tif_file, vis_dir, resolution, keep_tif=False, quality=60, outpu data = np.moveaxis(data, 0, -1) else: data = src.read(1) - # Nodata → NaN : sinon les pixels bord (ex. -9999, 3.4e38) - # polluent les percentiles d'étalonnage de la colormap + # Nodata → NaN: otherwise edge pixels (e.g. -9999, 3.4e38) + # pollute the colormap calibration percentiles if src.nodata is not None: data = data.astype(np.float32, copy=False) data[data == src.nodata] = np.nan - # Raccord des bords : recadrage sur la dalle nominale 1 km + # Edge stitching: crop to the nominal 1 km tile core_win = _core_tile_window(tif_file, src) if core_win is not None: @@ -911,7 +920,7 @@ def tif_to_crop(tif_file, vis_dir, resolution, keep_tif=False, quality=60, outpu # Convert to RGB using colormap if is_rgb_result: - # RGB images are already in RGB (uint8 depuis le TIF IGN, ou float 0-1) + # RGB images are already in RGB (uint8 from the TIF, or float 0-1) if data.dtype == np.uint8: rgb_data = data else: @@ -926,8 +935,8 @@ def tif_to_crop(tif_file, vis_dir, resolution, keep_tif=False, quality=60, outpu img = PILImage.fromarray(rgb_data) pil_format = 'AVIF' if output_format == 'avif' else 'WEBP' if lossless_gray: - # WebP sans perte en niveaux de gris : exact et 3× plus léger que - # l'AVIF q100 (Pillow ignore `lossless=True` en AVIF : q75 avec perte) + # Lossless grayscale WebP: exact and 3× lighter than AVIF q100 + # (Pillow ignores `lossless=True` in AVIF: lossy q75) img = PILImage.fromarray(rgb_data[:, :, 0]) img.save(str(output_file), format='WEBP', lossless=True) elif quality >= 100: @@ -936,8 +945,8 @@ def tif_to_crop(tif_file, vis_dir, resolution, keep_tif=False, quality=60, outpu img.save(str(output_file), format=pil_format, quality=quality, **({'speed': AVIF_SPEED} if pil_format == 'AVIF' else {})) - # Sous-tuiles de la carte depuis l'image d'origine (après la dalle : - # plus récentes qu'elle, build_index ne les ré-encode pas) + # Map sub-tiles from the original image (after the tile: newer than + # it, so build_index does not re-encode them) if subtiles_dir is not None: _write_subtiles_from(img, tif_file, vis_dir, resolution, subtiles_dir) @@ -948,19 +957,22 @@ def tif_to_crop(tif_file, vis_dir, resolution, keep_tif=False, quality=60, outpu return output_file except Exception as e: - logger.error(f" Erreur conversion crop {ext.upper()}: {e}", exc_info=True) + logger.error(f" {ext.upper()} crop conversion error: {e}", exc_info=True) return None def generate_pdf_report(basename, vis_dir, pdf_dir, resolution): - """Generate A3 PDF report for a LiDAR file with all visualizations. + """Generate an A3 PDF report for a LiDAR file with all visualizations. - Page 1: Mise en situation (ortho + topo IGN side by side) + Legacy: no longer called by the pipeline (the map's PDF export lives in + export_pdf.py). + + Page 1: Location context (IGN ortho + topo side by side) Pages 2+: Other visualizations (2 per page) Args: basename: Base name for the report file. - vis_dir: Directory containing WebP visualization files. + vis_dir: Directory containing AVIF/WebP visualization files. pdf_dir: Directory for output PDF. resolution: Grid resolution (used in info text). @@ -970,7 +982,7 @@ def generate_pdf_report(basename, vis_dir, pdf_dir, resolution): from matplotlib.backends.backend_pdf import PdfPages pdf_file = pdf_dir / f"{basename}_rapport.pdf" - logger.info(f" → Génération rapport PDF A3: {pdf_file.name}") + logger.info(f" → Generating A3 PDF report: {pdf_file.name}") t0 = time.time() # Look for images in per-file subdirectory first, then fallback to main dir @@ -988,7 +1000,7 @@ def generate_pdf_report(basename, vis_dir, pdf_dir, resolution): seen.add(f) unique_files.append(f) if not unique_files: - logger.warning(f" ✗ Aucune image trouvée pour {basename}") + logger.warning(f" ✗ No image found for {basename}") return None png_files = unique_files @@ -1024,7 +1036,7 @@ def generate_pdf_report(basename, vis_dir, pdf_dir, resolution): try: with PdfPages(str(pdf_file)) as pdf: - # Page 1: Mise en situation + # Page 1: location context if situ_files: fig = plt.figure(figsize=(a3_w, a3_h), facecolor='white') n_situ = len(situ_files) @@ -1035,7 +1047,7 @@ def generate_pdf_report(basename, vis_dir, pdf_dir, resolution): gs = fig.add_gridspec(1, max(n_situ, 1), wspace=0.05, left=0.03, right=0.97, top=0.92, bottom=0.06) - fig.text(0.5, 0.97, f"Mise en situation - {basename}", + fig.text(0.5, 0.97, f"Location context - {basename}", fontsize=20, fontweight='bold', ha='center', va='top') for i, f in enumerate(situ_files): @@ -1079,9 +1091,9 @@ def generate_pdf_report(basename, vis_dir, pdf_dir, resolution): pdf.savefig(fig, dpi=150) plt.close(fig) - logger.info(f" ✓ Rapport PDF terminé ({time.time()-t0:.1f}s)") + logger.info(f" ✓ PDF report done ({time.time()-t0:.1f}s)") return pdf_file except Exception as e: - logger.error(f" ✗ Erreur PDF: {e}", exc_info=True) + logger.error(f" ✗ PDF error: {e}", exc_info=True) return None \ No newline at end of file diff --git a/lidar_pipeline/tests/test_cli.py b/lidar_pipeline/tests/test_cli.py index 6b8f030..fa0dcab 100644 --- a/lidar_pipeline/tests/test_cli.py +++ b/lidar_pipeline/tests/test_cli.py @@ -89,10 +89,10 @@ class TestSetupLogging: def test_rebuild_index_without_input_arg(tmp_path): - """--rebuild-index fonctionne sans l'argument positionnel input. + """--rebuild-index works without the positional input argument. - Régression : input était obligatoire alors que --rebuild-index ne - l'utilise pas (erreur argparse « the following arguments are required »). + Regression: input used to be required although --rebuild-index does not + use it (argparse error "the following arguments are required"). """ import subprocess diff --git a/lidar_pipeline/tests/test_dtm.py b/lidar_pipeline/tests/test_dtm.py index 60583a4..2324dc1 100644 --- a/lidar_pipeline/tests/test_dtm.py +++ b/lidar_pipeline/tests/test_dtm.py @@ -94,7 +94,7 @@ class TestCSFPipeline: pipeline = json.loads(result) csf_stage = [s for s in pipeline["pipeline"] if isinstance(s, dict) and s.get("type") == "filters.csf"][0] - assert csf_stage["resolution"] == 1.0 # cloth 1 m : ~4× plus rapide, MNT inchangé + assert csf_stage["resolution"] == 1.0 # 1 m cloth: ~4× faster, DTM unchanged assert csf_stage["rigidness"] == 3 assert csf_stage["smooth"] is True assert "hdiff" not in csf_stage # hdiff is not a valid PDAL CSF parameter @@ -141,11 +141,11 @@ class TestInterpolateHoles: class TestFillSmallGaps: - """Comblement borné à l'enveloppe des points (plus de pastilles ni de liseré).""" + """Gap fill bounded to the point envelope (no more patches or fringes).""" @staticmethod def _grid(n=200, step=2, value=10.0): - """Semis régulier de points (1 pixel sur `step`) sur n × n pixels.""" + """Regular point pattern (1 pixel in `step`) over n × n pixels.""" dtm = np.full((n, n), np.nan) dtm[::step, ::step] = value return dtm @@ -155,28 +155,28 @@ class TestFillSmallGaps: dtm = np.full((100, 100), np.nan) dtm[50, 50] = 5.0 out, filled, removed = _fill_small_gaps(dtm, 0.2) - assert np.isnan(out).all() # ni pastille, ni point seul + assert np.isnan(out).all() # neither a patch nor a lone point assert (filled, removed) == (0, 1) def test_gaps_between_points_filled_without_edge_band(self): from lidar_pipeline.dtm import _fill_small_gaps dtm = self._grid() - dtm[:, 100:] = np.nan # grand trou à l'est + dtm[:, 100:] = np.nan # large hole to the east out, filled, _ = _fill_small_gaps(dtm, 0.2) assert filled > 0 - assert not np.isnan(out[10:190, 10:99]).any() # vides entre points comblés - assert np.isnan(out[:, 99:]).all() # rien d'extrapolé dans le trou + assert not np.isnan(out[10:190, 10:99]).any() # gaps between points filled + assert np.isnan(out[:, 99:]).all() # nothing extrapolated into the hole def test_radius_follows_local_density(self): - """Semis clairsemé (1 point / 1,8 m, vides de 2,5 m en diagonale) - comblé ; trou de 3 m en zone dense conservé ; trou de 1,6 m comblé.""" + """Sparse pattern (1 point / 1.8 m, 2.5 m diagonal gaps) filled; 3 m + hole in a dense area kept; 1.6 m hole filled.""" from lidar_pipeline.dtm import _fill_small_gaps sparse = self._grid(step=9) out, _, _ = _fill_small_gaps(sparse, 0.2) assert not np.isnan(out[30:170, 30:170]).any() dense = self._grid(step=1) - dense[90:105, 90:105] = np.nan # trou de 3 m dans un semis plein - dense[40:48, 40:48] = np.nan # trou de 1,6 m (voiture) + dense[90:105, 90:105] = np.nan # 3 m hole in a full pattern + dense[40:48, 40:48] = np.nan # 1.6 m hole (car) out, _, _ = _fill_small_gaps(dense, 0.2) assert np.isnan(out[95:100, 95:100]).all() assert not np.isnan(out[40:48, 40:48]).any() @@ -211,7 +211,7 @@ class TestFillSmallGaps: force=True, strip_align=False) assert read_dtm_gap_fill(out) == GAP_FILL_VERSION with rasterio.open(str(out)) as src: - src.tags() # lisible + src.tags() # readable legacy = tmp_output_dir / "legacy.tif" with rasterio.open(str(legacy), "w", driver="GTiff", width=2, height=2, count=1, dtype="float32") as dst: @@ -221,11 +221,11 @@ class TestFillSmallGaps: class TestDensitySidecar: def test_dtm_writes_ground_density(self, tmp_output_dir): - """4 points par m² sur 10 × 10 m : densité 4 au cœur, grille de 1 m.""" + """4 points per m² over 10 × 10 m: density 4 in the core, 1 m grid.""" import laspy import rasterio from lidar_pipeline.dtm import create_dtm_fast, density_path - g = (np.arange(20) + 0.25) / 2.0 # pas de 0,5 m + g = (np.arange(20) + 0.25) / 2.0 # 0.5 m step xx, yy = np.meshgrid(g, g) hdr = laspy.LasHeader(version='1.2', point_format=0) las = laspy.LasData(hdr) @@ -303,7 +303,7 @@ class TestDetectGroundMethod: class TestIGNPipeline: def test_pipeline_keeps_supplier_classification(self): - """create_ign_pipeline réutilise la pré-classification (classe 2) sans refiltrer.""" + """create_ign_pipeline reuses the pre-classification (class 2) without refiltering.""" from lidar_pipeline.dtm import create_ign_pipeline result = create_ign_pipeline("/input/a.laz", "/output/a_ground.las") pipeline = json.loads(result) @@ -311,14 +311,14 @@ class TestIGNPipeline: stages = pipeline["pipeline"] stage_types = [s.get("type") if isinstance(s, dict) else None for s in stages] - # Aucun algorithme de classification, pas de remise à zéro, pas de filtres de bruit + # No classification algorithm, no reset, no noise filters assert "filters.smrf" not in stage_types assert "filters.csf" not in stage_types assert "filters.assign" not in stage_types assert "filters.elm" not in stage_types assert "filters.outlier" not in stage_types - # Filtre ReturnNumber conservé + extraction des points classe 2 + # ReturnNumber filter kept + extraction of class 2 points range_stages = [s for s in stages if isinstance(s, dict) and s.get("type") == "filters.range"] assert any("ReturnNumber" in str(s.get("limits", "")) for s in range_stages) assert any(s.get("limits") == "Classification[2:2]" for s in range_stages) @@ -340,13 +340,13 @@ class TestDetectIGN: @patch('lidar_pipeline.dtm._read_with_pdal') @patch('laspy.read') def test_preclassified_returns_ign(self, mock_read, mock_pdal): - """Fichier pré-classifié (majorité classe 2) → méthode IGN.""" + """Pre-classified file (mostly class 2) → IGN method.""" from lidar_pipeline.dtm import detect_ground_method n = 10000 num_returns = np.ones(n, dtype=int) cls = np.zeros(n, dtype=np.uint8) - cls[int(n * 0.15):] = 2 # 85 % de points classe 2 + cls[int(n * 0.15):] = 2 # 85 % class 2 points z_values = np.random.normal(100, 5, n) mock_read.return_value = self._make_mock_las(cls, num_returns, z_values) @@ -355,13 +355,13 @@ class TestDetectIGN: @patch('lidar_pipeline.dtm._read_with_pdal') @patch('laspy.read') def test_unclassified_falls_back_to_smrf_or_csf(self, mock_read, mock_pdal): - """Sans classification exploitable → détection SMRF/CSF classique.""" + """No usable classification → classic SMRF/CSF detection.""" from lidar_pipeline.dtm import detect_ground_method n = 10000 num_returns = np.ones(n, dtype=int) - num_returns[:int(n * 0.6)] = 2 # 60 % multi-retours (forêt) → non urbain - cls = np.zeros(n, dtype=np.uint8) # aucun point classe 2 + num_returns[:int(n * 0.6)] = 2 # 60 % multi-return (forest) → not urban + cls = np.zeros(n, dtype=np.uint8) # no class 2 point z_values = np.random.normal(100, 5, n) mock_read.return_value = self._make_mock_las(cls, num_returns, z_values) @@ -421,12 +421,12 @@ class TestClassifyGroundMethod: class TestParseIgnClasses: def test_default_sol(self): - """'sol' → code 2 seul.""" + """'sol' → code 2 only.""" from lidar_pipeline.dtm import parse_ign_classes assert parse_ign_classes("sol") == [2] def test_names_sorted_dedup(self): - """Noms acceptés (EN/FR), triés et dédupliqués.""" + """Names accepted (EN/FR), sorted and de-duplicated.""" from lidar_pipeline.dtm import parse_ign_classes assert parse_ign_classes("sol,unclassified") == [1, 2] assert parse_ign_classes("unclassified,sol") == [1, 2] @@ -434,13 +434,13 @@ class TestParseIgnClasses: assert parse_ign_classes("sol,2") == [2] def test_numeric_codes(self): - """Codes LAS directs, triés.""" + """Raw LAS codes, sorted.""" from lidar_pipeline.dtm import parse_ign_classes assert parse_ign_classes("2,1") == [1, 2] assert parse_ign_classes("66") == [66] def test_invalid_raises(self): - """Nom inconnu, code hors bornes ou liste vide → ValueError.""" + """Unknown name, out-of-range code or empty list → ValueError.""" from lidar_pipeline.dtm import parse_ign_classes with pytest.raises(ValueError): parse_ign_classes("foo") @@ -450,7 +450,7 @@ class TestParseIgnClasses: parse_ign_classes("") def test_method_label(self): - """'ign' seul pour le sol, combinaison encodée sinon (invalidation cache).""" + """'ign' alone for ground, combination encoded otherwise (cache invalidation).""" from lidar_pipeline.dtm import ign_method_label assert ign_method_label([2]) == "ign" assert ign_method_label([1, 2]) == "ign_1_2" @@ -459,7 +459,7 @@ class TestParseIgnClasses: class TestIGNPipelineMultiClasses: def test_multi_class_limits(self): - """Plusieurs classes → plages OU logiques sur Classification.""" + """Several classes → ORed ranges on Classification.""" from lidar_pipeline.dtm import _create_ground_pipeline result = _create_ground_pipeline("/input/a.laz", "/output/a_ground.las", 'ign', ign_codes=[1, 2]) @@ -471,7 +471,7 @@ class TestIGNPipelineMultiClasses: for l in limits) def test_default_sol_only(self): - """Sans ign_codes, la voie IGN reste sol seul (2) — rétrocompatible.""" + """Without ign_codes, the IGN path stays ground only (2), backward compatible.""" from lidar_pipeline.dtm import _create_ground_pipeline result = _create_ground_pipeline("/input/a.laz", "/output/a_ground.las", 'ign') pipeline = json.loads(result) @@ -485,7 +485,7 @@ class TestIGNPipelineMultiClasses: class TestClassifyGroundIgnClasses: @patch('lidar_pipeline.dtm.subprocess') def test_ign_classes_encoded_in_filenames(self, mock_subprocess): - """--ign-classes sol,unclassified → fichiers ign_1_2 + filtre multi-classes.""" + """--ign-classes sol,unclassified → ign_1_2 files + multi-class filter.""" import tempfile from lidar_pipeline.dtm import classify_ground @@ -506,7 +506,7 @@ class TestClassifyGroundIgnClasses: @patch('lidar_pipeline.dtm.subprocess') def test_ign_default_label_unchanged(self, mock_subprocess): - """--ign-classes sol (défaut) → noms 'ign' inchangés (cache préservé).""" + """--ign-classes sol (default) → 'ign' names unchanged (cache preserved).""" import tempfile from lidar_pipeline.dtm import classify_ground @@ -521,7 +521,8 @@ class TestClassifyGroundIgnClasses: class TestPureDtm: - """Mode pur (classification IGN) : aucune retouche, trous en nodata.""" + """The `pure` flag (IGN classification) no longer changes the DTM: both + modes fill small gaps and never use a lowest-return floor.""" def _write_las(self, path, points): import laspy @@ -534,8 +535,8 @@ class TestPureDtm: return path def _make_clouds(self, tmp_output_dir): - """Grille 2x2 (res=1.0). Sol sur 3 cellules (z=10), trou en (1,1). - Le nuage complet a un retour plus bas (z=7) dans le trou.""" + """2x2 grid (res=1.0). Ground on 3 cells (z=10), hole at (1,1). + The full cloud has a lower return (z=7) in the hole.""" corners = [(0.05, 0.05, 10.0), (1.95, 0.05, 10.0), (0.05, 1.95, 10.0)] ground = [(0.5, 0.5, 10.0), (1.5, 0.5, 10.0), (0.5, 1.5, 10.0)] + corners source = list(ground) + [(1.5, 1.5, 7.0)] @@ -554,11 +555,10 @@ class TestPureDtm: return src.read(1).astype("float64") def test_pure_fills_holes_without_floor(self, tmp_output_dir): - """pur=True : trous comblés par interpolation, sans plancher à 7. + """pure=True: the hole is filled from its neighbours, no floor at 7. - Le comblement est actif dans tous les modes (comportement - historique) ; « pur » ne désactive que l'abaissement au retour - le plus bas. + Gap filling is active in every mode and there is no lowest-return + floor at all, so `pure` has no effect. """ arr = self._dtm_array(tmp_output_dir, pure=True) assert int(np.isnan(arr).sum()) == 0 @@ -566,7 +566,7 @@ class TestPureDtm: assert vals == [10.0, 10.0, 10.0, 10.0] def test_not_pure_fills_holes(self, tmp_output_dir): - """pur=False : le trou est comblé (comportement historique conservé).""" + """pure=False: the hole is filled as well (same behaviour).""" arr = self._dtm_array(tmp_output_dir, pure=False) assert int(np.isnan(arr).sum()) == 0 vals = sorted(float(v) for v in arr.flatten()) @@ -612,7 +612,7 @@ class TestStripVerticalOffsets: offs = _strip_vertical_offsets(x, y, z, psid) assert abs(offs.get(1, 0.0) - 0.05) < 0.01 assert abs(offs.get(2, 0.0) + 0.05) < 0.01 - assert 0 not in offs # biais ~0 < seuil : pas de correction + assert 0 not in offs # bias ~0 < threshold: no correction def test_small_bias_below_threshold_ignored(self): """Biases under the 0.5 cm threshold trigger no correction.""" @@ -640,10 +640,10 @@ class TestStripVerticalOffsets: class TestStripJitterOffsets: - """Gigue verticale intra-faisceau par fenêtres de temps GPS.""" + """Intra-strip vertical jitter over GPS time windows.""" def _synthetic(self, bias_fn, n=800_000, extent=300.0, duration=20.0, seed=0): - """Deux faisceaux entrelacés ; le n° 1 porte un biais dépendant du temps.""" + """Two interleaved strips; strip 1 carries a time-dependent bias.""" rng = np.random.default_rng(seed) x = rng.uniform(0, extent, n) y = rng.uniform(0, extent, n) @@ -653,11 +653,11 @@ class TestStripJitterOffsets: return x, y, clean + bias_fn(t, psid), psid, t, clean def test_recovers_time_varying_offset(self): - """Une oscillation lente ±4 cm du faisceau 1 est retirée du terrain vrai. + """A slow ±4 cm oscillation of strip 1 is removed from the true terrain. - En recouvrement à deux, la référence hors-faisceau attribue une série - à chaque faisceau (chacun absorbe sa part) : on vérifie le résidu - contre le terrain synthétique propre, fenêtre par fenêtre. + With a two-strip overlap, the out-of-strip reference assigns a series + to each strip (each absorbs its share): the residual is checked + against the clean synthetic terrain, window by window. """ from lidar_pipeline.dtm import _strip_jitter_offsets, _apply_strip_jitter w = 2 * np.pi / 8.0 @@ -669,22 +669,22 @@ class TestStripJitterOffsets: assert np.sqrt(np.mean(resid ** 2)) < 0.012 for lo in np.arange(0, 20.0, 2.0): m = (t >= lo) & (t < lo + 2.0) - assert abs(resid[m].mean()) < 0.012, f"fenêtre {lo:.0f}-{lo + 2:.0f} s" + assert abs(resid[m].mean()) < 0.012, f"window {lo:.0f}-{lo + 2:.0f} s" def test_tracks_step_offset(self): - """Un échelon −3 cm sur la seconde moitié du vol est suivi.""" + """A −3 cm step over the second half of the flight is tracked.""" from lidar_pipeline.dtm import _strip_jitter_offsets, _apply_strip_jitter x, y, z, psid, t, clean = self._synthetic( lambda tt, p: np.where(tt >= 10.0, -0.03, 0.0) * (p == 1)) jitter = _strip_jitter_offsets(x, y, z, psid, t) resid = z - _apply_strip_jitter(psid, t, jitter) - clean assert np.sqrt(np.mean(resid ** 2)) < 0.012 - for lo in (3.0, 6.0, 13.0, 16.0): # loin de la transition lissée + for lo in (3.0, 6.0, 13.0, 16.0): # away from the smoothed transition m = (t >= lo) & (t < lo + 2.0) - assert abs(resid[m].mean()) < 0.012, f"fenêtre {lo:.0f}-{lo + 2:.0f} s" + assert abs(resid[m].mean()) < 0.012, f"window {lo:.0f}-{lo + 2:.0f} s" def test_apply_interpolates_linearly(self): - """Interpolation entre centres de fenêtres ; 0 hors faisceau connu.""" + """Interpolation between window centres; 0 outside known strips.""" from lidar_pipeline.dtm import _apply_strip_jitter jitter = {7: (np.array([10.0, 11.0]), np.array([0.0, 0.1]))} psid = np.array([7, 7, 7, 3], dtype=np.uint16) @@ -693,7 +693,7 @@ class TestStripJitterOffsets: _apply_strip_jitter(psid, t, jitter), [0.0, 0.05, 0.1, 0.0]) def test_requires_two_sources_and_time(self): - """Faisceau unique ou temps non fini : rien à corriger.""" + """Single strip or non-finite time: nothing to correct.""" from lidar_pipeline.dtm import _strip_jitter_offsets x, y, z, psid, t, _clean = self._synthetic(lambda tt, p: 0.04 * np.sin(tt) * (p == 1)) assert _strip_jitter_offsets(x, y, z, np.zeros_like(psid), t) == {} @@ -713,11 +713,11 @@ class TestStripAlignSidecar: data = json.loads((tmp_path / "TILE_dtm_r0p2_stripalign.json").read_text()) assert data["version"] == STRIP_ALIGN_VERSION assert data["threshold"] == STRIP_ALIGN_THRESHOLD - assert data["offsets"] == {"1049": 0.026, "1147": -0.026} # clés JSON en chaînes + assert data["offsets"] == {"1049": 0.026, "1147": -0.026} # JSON keys as strings assert data["jitter"] == {} def test_sidecar_records_jitter_series(self, tmp_path): - """Le sidecar consigne les séries de gigue et leurs paramètres.""" + """The sidecar records the jitter series and their parameters.""" from lidar_pipeline.dtm import ( _write_strip_align_sidecar, STRIP_JITTER_BIN, STRIP_JITTER_SMOOTH) import json @@ -745,22 +745,22 @@ class TestStripAlignSidecar: self.strip_align = strip_align p = P(tmp_path, strip_align=True) - # DTM hérité sans sidecar : à régénérer + # Legacy DTM without a sidecar: regenerate assert not p._strip_align_matches("TILE", "_r0p2") - # Sidecar conforme : valide + # Matching sidecar: valid _write_strip_align_sidecar(p.dtm_dir, "TILE", "_r0p2", {}) assert p._strip_align_matches("TILE", "_r0p2") - # Seuil différent : à régénérer + # Different threshold: regenerate bad = p.dtm_dir / "TILE_dtm_r0p2_stripalign.json" bad.write_text(json.dumps({"version": 1, "threshold": 0.02, "offsets": {}})) assert not p._strip_align_matches("TILE", "_r0p2") - # Paramètres de gigue différents : à régénérer + # Different jitter parameters: regenerate bad.write_text(json.dumps({"version": 2, "threshold": 0.005, "offsets": {}, "jitter_bin": 0.5, "jitter_smooth": 5})) assert not p._strip_align_matches("TILE", "_r0p2") - # Calage désactivé + DTM calé : à régénérer + # Alignment disabled + aligned DTM: regenerate assert not P(tmp_path, strip_align=False)._strip_align_matches("TILE", "_r0p2") - # Paramètres ligne à ligne différents : à régénérer + # Different line-by-line parameters: regenerate _write_strip_align_sidecar(p.dtm_dir, "TILE", "_r0p2", {}) data = json.loads(bad.read_text()) data["line_window"] = 99 @@ -770,12 +770,12 @@ class TestStripAlignSidecar: class TestEdgeBuffer: - """Raccord des bords : MNT étendu par les points sol des tuiles voisines.""" + """Edge matching: DTM extended with the ground points of neighbouring tiles.""" BASENAME = "LHD_FXX_0638_6628_PTS_LAMB93_IGN69" - # Grille LHD : (col, row) = coin nord-ouest → 0638_6628 couvre - # X ∈ [638000, 639000], Y ∈ [6627000, 6628000] (bord nord = 6628 km). - NOMINAL = (638000.0, 6627000.0, 639000.0, 6628000.0) # dalle 1 km + # LHD grid: (col, row) = north-west corner → 0638_6628 covers + # X ∈ [638000, 639000], Y ∈ [6627000, 6628000] (north edge = 6628 km). + NOMINAL = (638000.0, 6627000.0, 639000.0, 6628000.0) # 1 km tile def _write_las(self, path, points, classification=None): import laspy @@ -790,7 +790,7 @@ class TestEdgeBuffer: return path def _write_clouds(self, root, res=50.0): - """Tuile centrale à z=10 + voisine EST à z=20 (un point par maille res).""" + """Central tile at z=10 + EAST neighbour at z=20 (one point per res cell).""" import numpy as np input_dir = root / "input" input_dir.mkdir(exist_ok=True) @@ -814,7 +814,7 @@ class TestEdgeBuffer: present = [(637, 6627), (639, 6629), (638, 6629)] for c, r in present: (tmp_output_dir / f"LHD_FXX_{c}_{r}_PTS_LAMB93_IGN69.copc.laz").touch() - # Bruit non voisin : jamais retenu + # Non-neighbour noise: never picked (tmp_output_dir / "LHD_FXX_0650_6700_PTS_LAMB93_IGN69.copc.laz").touch() found = _neighbor_laz_files(tmp_output_dir / f"{self.BASENAME}.copc.laz") assert {f.name for f in found} == { @@ -827,16 +827,16 @@ class TestEdgeBuffer: assert _neighbor_laz_files(src) == [] def test_neighbor_found_in_edge_subdir(self, tmp_output_dir): - """Une voisine isolée dans edge_neighbors/ est trouvée ; la priorité - reste à une dalle à plat dans input/.""" + """A neighbour kept in edge_neighbors/ is found; a tile directly in + input/ still takes priority.""" from lidar_pipeline.dtm import _neighbor_laz_files, EDGE_NEIGHBORS_DIRNAME base = "LHD_FXX_0637_6627_PTS_LAMB93_IGN69" (tmp_output_dir / f"{base}.copc.laz").touch() edge = tmp_output_dir / EDGE_NEIGHBORS_DIRNAME edge.mkdir() - # Voisine uniquement dans le sous-dossier de raccord + # Neighbour only in the edge-matching subfolder (edge / "LHD_FXX_0638_6628_PTS_LAMB93_IGN69.copc.laz").touch() - # Voisine présente aux deux endroits : la version input/ gagne + # Neighbour present in both places: the input/ copy wins (edge / "LHD_FXX_0636_6626_PTS_LAMB93_IGN69.copc.laz").touch() (tmp_output_dir / "LHD_FXX_0636_6626_PTS_LAMB93_IGN69.copc.laz").touch() found = _neighbor_laz_files(tmp_output_dir / f"{base}.copc.laz") @@ -845,7 +845,7 @@ class TestEdgeBuffer: assert by_name["LHD_FXX_0636_6626_PTS_LAMB93_IGN69.copc.laz"].parent == tmp_output_dir def test_buffered_dtm_extends_into_neighbor(self, tmp_output_dir): - """MNT 24x24 (dalle 20x20 + bande 100 m), bande EST remplie à z=20 par la voisine.""" + """24x24 DTM (20x20 tile + 100 m band), EAST band filled at z=20 by the neighbour.""" from lidar_pipeline.dtm import create_dtm_fast, read_dtm_edge_buffer, EDGE_BUFFER_TAG import rasterio ground, source, _ = self._write_clouds(tmp_output_dir) @@ -859,9 +859,9 @@ class TestEdgeBuffer: assert abs(src.bounds.top - 6628100.0) < 1e-6 assert src.tags().get(EDGE_BUFFER_TAG) == "100" arr = src.read(1) - assert arr[12, 12] == 10.0 # cœur : tuile centrale - assert arr[12, 23] == 20.0 # bande EST : points de la voisine - assert np.isnan(arr[0, 0]) # bande OUEST sans voisine : vide + assert arr[12, 12] == 10.0 # core: central tile + assert arr[12, 23] == 20.0 # EAST band: neighbour points + assert np.isnan(arr[0, 0]) # WEST band without neighbour: empty assert read_dtm_edge_buffer(dtm) == 100.0 def test_unbuffered_dtm_has_no_tag(self, tmp_output_dir): @@ -876,7 +876,7 @@ class TestEdgeBuffer: assert read_dtm_edge_buffer(dtm) == 0.0 def test_buffered_dtm_non_lhd_falls_back(self, tmp_output_dir): - """Nom hors pattern LHD : pas de tuile nominale, bornes d'en-tête conservées.""" + """Non-LHD name: no nominal tile, header bounds kept.""" from lidar_pipeline.dtm import create_dtm_fast, read_dtm_edge_buffer import rasterio ground = self._write_las(tmp_output_dir / "ground.las", @@ -888,20 +888,20 @@ class TestEdgeBuffer: edge_buffer=100.0) assert dtm is not None with rasterio.open(str(dtm)) as src: - assert abs(src.bounds.left - 0.05) < 1e-6 # bornes de l'en-tête + assert abs(src.bounds.left - 0.05) < 1e-6 # header bounds assert read_dtm_edge_buffer(dtm) == 0.0 def _synthetic_beam(n_lines=240, spacing=0.4, seed=0, offsets=None, tilts=None): - """Faisceau synthétique : lignes de balayage (dents de scie de scan_angle) - sur un terrain en pente traversé par un fossé ; offsets verticaux par ligne.""" + """Synthetic strip: scan lines (scan_angle sawtooth) over sloping terrain + crossed by a ditch; vertical offsets per line.""" rng = np.random.default_rng(seed) xs, ys, zs, ts, angs, ids = [], [], [], [], [], [] x_line = np.arange(0, 100, 0.12) for k in range(n_lines): y = k * spacing + rng.normal(0, 0.02, x_line.size) z = 100 + 0.03 * x_line + 0.05 * y - z = z - 0.5 * (np.abs(x_line - 41) < 1.0) # fossé perpendiculaire aux lignes + z = z - 0.5 * (np.abs(x_line - 41) < 1.0) # ditch perpendicular to the lines u = np.linspace(-1, 1, x_line.size) z = z + offsets[k] + (0 if tilts is None else tilts[k]) * u + rng.normal(0, 0.01, x_line.size) xs.append(x_line); ys.append(y); zs.append(z); ids.append(np.full(x_line.size, k)) @@ -912,16 +912,16 @@ def _synthetic_beam(n_lines=240, spacing=0.4, seed=0, offsets=None, tilts=None): class TestScanLineAlignment: - """3ᵉ passe du calage : décalage vertical entre lignes de balayage successives.""" + """3rd alignment pass: vertical offset between successive scan lines.""" def test_line_ids_follow_sawtooth_not_vegetation_gaps(self): from lidar_pipeline.dtm import _scan_line_ids t = np.arange(50) * 0.0001 ang = np.tile(np.linspace(-3000, 3000, 10), 5) - keep = np.ones(50, bool); keep[13:17] = False # trou de végétation dans la ligne 2 + keep = np.ones(50, bool); keep[13:17] = False # vegetation hole in line 2 ids = _scan_line_ids(t[keep], ang[keep]) assert ids.max() == 4 - t2 = t.copy(); t2[30:] += 1.0 # fin de passe : nouvelle ligne + t2 = t.copy(); t2[30:] += 1.0 # end of pass: new line assert _scan_line_ids(t2, np.zeros(50)).max() == 1 def test_group_median_matches_numpy(self): @@ -951,7 +951,7 @@ class TestScanLineAlignment: assert depth(z - corr) == pytest.approx(depth(z), abs=0.01) def test_removes_alternating_line_tilts(self): - """Roulis : lignes basculées alternativement (un bout haut, l'autre bas).""" + """Roll: lines tilted alternately (one end high, the other low).""" from scipy.ndimage import gaussian_filter1d from lidar_pipeline.dtm import _scan_line_corrections_beam n = 240 @@ -964,15 +964,15 @@ class TestScanLineAlignment: assert after < 0.2 * before, f"{before*1000:.1f} → {after*1000:.1f} mm" def test_joint_adjustment_fixes_all_scales_against_other_beam(self): - """Deux faisceaux superposés : le faisceau fautif (dérive lente, roulis, - ligne isolée à −8 cm) est recalé sur l'autre à toutes les échelles, - sans dérive de l'altitude d'ensemble.""" + """Two overlapping strips: the faulty strip (slow drift, roll, isolated + line at −8 cm) is re-aligned on the other at every scale, with no + drift of the overall elevation.""" from lidar_pipeline.dtm import _joint_line_corrections n = 240 k = np.arange(n) - bad_off = 0.03 * np.sin(2 * np.pi * k / 120) # dérive lente (non vue sur sa propre surface) - bad_off[100] -= 0.08 # ligne isolée très décalée - bad_tilt = 0.02 * np.cos(2 * np.pi * k / 60) # roulis lent + bad_off = 0.03 * np.sin(2 * np.pi * k / 120) # slow drift (not visible on its own surface) + bad_off[100] -= 0.08 # isolated, strongly shifted line + bad_tilt = 0.02 * np.cos(2 * np.pi * k / 60) # slow roll xa, ya, za, ta, aa, _ = _synthetic_beam(n, seed=1, offsets=bad_off, tilts=bad_tilt) xb, yb, zb, tb, ab, _ = _synthetic_beam(n, seed=2, offsets=np.zeros(n)) tb = tb + 1000.0 @@ -981,22 +981,22 @@ class TestScanLineAlignment: corr, gl, touched, iters = _joint_line_corrections(x, y, z, psid, t, ang) truth = np.r_[bad_off[np.repeat(k, len(za) // n)] + bad_tilt[np.repeat(k, len(za) // n)] * np.tile(np.linspace(-1, 1, len(za) // n), n), np.zeros(len(zb))] - # Sans vérité terrain, l'écart est partagé entre les faisceaux : c'est - # l'écart ENTRE faisceaux (points homologues, même géométrie) qui doit - # disparaître. + # Without ground truth, the error is shared between the strips: it is + # the offset BETWEEN strips (homologous points, same geometry) that + # must vanish. na = len(za) before = truth[:na] - truth[:na].mean() rel = (truth[:na] - corr[:na]) - (0.0 - corr[na:]) after = rel - rel.mean() assert np.std(after) < 0.25 * np.std(before), \ f"{np.std(before)*1000:.1f} → {np.std(after)*1000:.1f} mm" - assert abs(np.mean(corr)) < 0.002 # pas de dérive d'ensemble + assert abs(np.mean(corr)) < 0.002 # no overall drift assert touched.mean() > 0.9 and iters <= 8 def test_joint_adjustment_removes_static_angle_profile(self): - """Étalonnage en arc selon l'angle (même pour toutes les lignes) : - non linéaire, invisible pour décalage + inclinaison, retiré par le - profil par faisceau et classe d'angle.""" + """Arc-shaped calibration error by angle (same for every line): + non-linear, invisible to offset + tilt, removed by the per-strip, + per-angle-bin profile.""" from lidar_pipeline.dtm import _joint_line_corrections n = 240 xa, ya, za, ta, aa, _ = _synthetic_beam(n, seed=5, offsets=np.zeros(n)) @@ -1020,7 +1020,7 @@ class TestScanLineAlignment: class TestIgnDirectExtraction: - """Classification IGN : extraction directe par laspy (PDAL en secours).""" + """IGN classification: direct extraction with laspy (PDAL as fallback).""" def test_keeps_requested_classes_and_valid_returns(self, tmp_path): import laspy diff --git a/lidar_pipeline/tests/test_export_pdf.py b/lidar_pipeline/tests/test_export_pdf.py index 299c57c..d951aa5 100644 --- a/lidar_pipeline/tests/test_export_pdf.py +++ b/lidar_pipeline/tests/test_export_pdf.py @@ -1,4 +1,4 @@ -"""Tests de l'export PDF (planche d'impression terrain).""" +"""Tests for the PDF export (printable field sheet).""" import pytest @@ -8,7 +8,7 @@ def test_layout_landscape_a4_dimensions(): lay = layout("A4", "paysage", 2000) assert (lay.page_w, lay.page_h) == (297.0, 210.0) and lay.dpi == 300 assert lay.map_w > 150 and lay.map_h > 150 - assert lay.panel_x >= lay.map_x + lay.map_w # bandeau à droite + assert lay.panel_x >= lay.map_x + lay.map_w # panel on the right assert lay.map_x + lay.map_w <= lay.page_w and lay.map_y + lay.map_h <= lay.page_h @@ -16,7 +16,7 @@ def test_layout_portrait_a3_panel_below(): from lidar_pipeline.export_pdf import layout lay = layout("A3", "portrait", 5000) assert (lay.page_w, lay.page_h) == (297.0, 420.0) and lay.dpi == 250 - assert lay.panel_y + lay.panel_h <= lay.map_y # bandeau en bas + assert lay.panel_y + lay.panel_h <= lay.map_y # panel at the bottom @pytest.mark.parametrize("args", [("A5", "paysage", 2000), ("A4", "biais", 2000), @@ -38,7 +38,7 @@ def test_map_bbox_matches_paper_times_scale(): def test_pixel_size_and_grid_step(): from lidar_pipeline.export_pdf import grid_step, layout, pixel_size - assert pixel_size(layout("A4", "paysage", 1000)) == 0.2 # plafonné au natif + assert pixel_size(layout("A4", "paysage", 1000)) == 0.2 # capped at the native resolution assert abs(pixel_size(layout("A3", "paysage", 10000)) - 10000 * 0.0254 / 250) < 1e-9 assert [grid_step(s) for s in (1000, 2000, 5000, 10000)] == [100, 100, 500, 1000] @@ -57,7 +57,7 @@ def test_frame_roundtrip(): assert abs(f["cx"] - cx) < 1e-6 and abs(f["cy"] - cy) < 1e-6 assert len(f["corners"]) == 4 nw, ne, se, sw = f["corners"] - assert nw[0] > sw[0] and ne[1] > nw[1] # [lat, lon] : nord en haut, est à droite + assert nw[0] > sw[0] and ne[1] > nw[1] # [lat, lon]: north at the top, east on the right assert f["width_m"] > f["height_m"] > 0 @@ -99,11 +99,11 @@ def test_compose_l93_half_outside_is_white_hatched(tmp_path, monkeypatch): from lidar_pipeline.export_pdf import compose_l93 monkeypatch.setattr(index, "PANEL_VIZ", None) _dalle(tmp_path, 1054, 6882) - # moitié ouest dans la dalle, moitié est hors données + # western half inside the tile, eastern half outside the data img, mask, cells = compose_l93(tmp_path, (1054900.0, 6881400.0, 1055100.0, 6881500.0), 1.0) assert mask.getpixel((50, 50)) == 255 and mask.getpixel((150, 50)) == 0 east = img.crop((110, 0, 200, 100)).convert("L").getextrema() - assert east[1] == 255 and east[0] < 255 # blanc + hachures + assert east[1] == 255 and east[0] < 255 # white + hatching def test_compose_l93_nodata_pixels_masked(tmp_path, monkeypatch): @@ -145,12 +145,13 @@ def test_density_color_classes(): def test_pdf_text_replaces_unencodable(): from lidar_pipeline.export_pdf import _pdf_text - assert _pdf_text("Relief orienté — 1:2 000 ≥ 🚀") == "Relief orienté — 1:2 000 ? ?" + # é and — exist in cp1252; ≥ and the emoji do not + assert _pdf_text("Café — 1:2,000 ≥ 🚀") == "Café — 1:2,000 ? ?" def test_pdf_legend_uses_reading_text(monkeypatch): - """La légende de la planche PDF affiche le texte « Comment lire » de - VIZ_LEGENDS, habillé à la largeur de la boîte, plutôt que « legend ».""" + """The PDF sheet legend shows the "How to read" text of VIZ_LEGENDS, + wrapped to the box width, rather than "legend".""" from lidar_pipeline import export_pdf from lidar_pipeline.index import VIZ_LEGENDS drawn = [] @@ -177,13 +178,13 @@ def test_zone_quality_aggregates_two_cells(): from lidar_pipeline.export_pdf import zone_quality table = {"LHD_FXX_1054_6882_PTS_LAMB93_IGN69": _q(4.0, "2023-03-15", "2023-03-15"), "LHD_FXX_1055_6882_PTS_LAMB93_IGN69": _q(8.0, "2023-04-02", "2023-04-03", 0.3)} - bbox = (1054500.0, 6881500.0, 1055500.0, 6881600.0) # moitié de chaque dalle + bbox = (1054500.0, 6881500.0, 1055500.0, 6881600.0) # half of each tile z = zone_quality(bbox, table, [(1054, 6882), (1055, 6882)]) assert abs(z["density_mean"] - 6.0) < 1e-6 and z["density_min"] == 4.0 assert abs(z["empty_fraction"] - 0.2) < 1e-6 assert (z["acq_start"], z["acq_end"]) == ("2023-03-15", "2023-04-03") assert z["missing_relief"] == [] and z["missing_quality"] == [] - assert len(z["grid_cells"]) == 2 * 10 * 2 # 10 mailles en x × 2 en y par dalle + assert len(z["grid_cells"]) == 2 * 10 * 2 # 10 cells in x × 2 in y per tile def test_zone_quality_missing_cells(): @@ -216,12 +217,13 @@ def test_build_pdf_a4_landscape(tmp_path, monkeypatch): write_quality(tmp_path, "LHD_FXX_1054_6882_PTS_LAMB93_IGN69", _q(6.5)) lat, lon = _cell_center_wgs84(1054, 6882) pdf, name = build_pdf(tmp_path, lat, lon, "A4", "paysage", 2000, - title="Prospection 🚀 bois", compress=False) + title="Survey 🚀 woods", compress=False) assert pdf.startswith(b"%PDF") w, h = _mediabox(pdf) assert abs(w - 841.89) < 0.5 and abs(h - 595.28) < 0.5 assert name.startswith("relief_1054.") and name.endswith("_1-2000.pdf") - for s in (b"Prospection ? bois", b"1:2 000", b"Densit", b"2023-03-15", b"LiDAR HD", b"6,5 pts"): + for s in (b"Survey ? woods", b"1:2,000", b"ground density", b"2023-03-15", b"LiDAR HD", + b"6.5 pts", b"landscape"): assert s in pdf, s @@ -237,7 +239,7 @@ def test_build_pdf_a3_portrait_size(tmp_path, monkeypatch): def test_build_pdf_partial_zone_hatched(tmp_path, monkeypatch): - """Zone à cheval sur le bord des données : planche produite, dalle absente listée.""" + """Area straddling the data edge: sheet produced, missing tile listed.""" from lidar_pipeline import index from lidar_pipeline.export_pdf import build_pdf from lidar_pipeline.tiles import _transformer @@ -246,7 +248,7 @@ def test_build_pdf_partial_zone_hatched(tmp_path, monkeypatch): lon, lat = _transformer("EPSG:2154", "EPSG:4326").transform(1055000.0, 6881500.0) pdf, _ = build_pdf(tmp_path, lat, lon, "A4", "paysage", 2000, compress=False) assert pdf.startswith(b"%PDF") and b"1055_6882" in pdf - assert b"Donn" in pdf and b"manquante" in pdf + assert b"Missing data" in pdf and b"no relief" in pdf # "(" is escaped in PDF strings def test_build_pdf_no_data_raises(tmp_path): @@ -258,13 +260,13 @@ def test_build_pdf_no_data_raises(tmp_path): def test_fmt_int(): from lidar_pipeline.export_pdf import _fmt_int - assert _fmt_int(2000) == "2 000" and _fmt_int(500) == "500" + assert _fmt_int(2000) == "2,000" and _fmt_int(500) == "500" def test_north_arrow_angle_matches_pyproj_reference(): - """L'angle de rotation reportlab doit amener la flèche (dessinée vers le - nord du quadrillage) sur le nord géographique, dans le bon sens, à l'est - et à l'ouest du méridien central (3°E).""" + """The reportlab rotation angle must bring the arrow (drawn towards grid + north) onto true north, in the right direction, east and west of the + central meridian (3°E).""" import math from lidar_pipeline.export_pdf import _north_arrow_angle, _to_wgs84 from lidar_pipeline.tiles import _transformer, wgs84_to_l93 @@ -275,12 +277,12 @@ def test_north_arrow_angle_matches_pyproj_reference(): lat0, lon0 = _to_wgs84(cx, cy) x0, y0 = to_l93.transform(lon0, lat0) x1, y1 = to_l93.transform(lon0, lat0 + 0.001) - # azimut (sens horaire depuis le nord du quadrillage) du nord géographique + # azimuth of true north (clockwise from grid north) psi = math.degrees(math.atan2(x1 - x0, y1 - y0)) - return -psi # rotation reportlab (antihoraire) amenant "haut" sur ce nord + return -psi # reportlab rotation (counter-clockwise) bringing "up" onto that north - east = wgs84_to_l93(6.0, 46.0) # à l'est du méridien central - west = wgs84_to_l93(0.0, 46.0) # à l'ouest du méridien central + east = wgs84_to_l93(6.0, 46.0) # east of the central meridian + west = wgs84_to_l93(0.0, 46.0) # west of the central meridian for cx, cy in (east, west): assert abs(_north_arrow_angle(cx, cy) - _reference_angle(cx, cy)) < 0.05 assert _north_arrow_angle(*east) > 0 @@ -293,7 +295,7 @@ def test_wrap_text_lines_fit_width(): from io import BytesIO from lidar_pipeline.export_pdf import _wrap_text c = rl_canvas.Canvas(BytesIO()) - text = "Donnée manquante (sans relief) : " + ", ".join( + text = "Missing data (no relief): " + ", ".join( f"{1050 + i}_6882" for i in range(12)) max_width = 60 * mm lines = _wrap_text(c, text, "Helvetica", 5.8, max_width, sep=", ") @@ -308,22 +310,22 @@ def test_fit_title_shrinks_then_elides(): from io import BytesIO from lidar_pipeline.export_pdf import _fit_title c = rl_canvas.Canvas(BytesIO()) - long_title = "Relief orienté - " + ", ".join(f"{1050 + i:04d}_6882" for i in range(6)) + long_title = "Oriented relief - " + ", ".join(f"{1050 + i:04d}_6882" for i in range(6)) text, size = _fit_title(c, long_title, "Helvetica-Bold", 10, 60 * mm, min_size=7.0) assert size >= 7.0 assert c.stringWidth(text, "Helvetica-Bold", size) <= 60 * mm + 1e-6 def test_cartouche_title_avoids_north_arrow_column(): - """Le titre (et le sous-titre) de la cartouche ne doit jamais empiéter sur - la colonne réservée à la flèche du nord, en paysage comme en portrait.""" + """The title block's title (and subtitle) must never encroach on the + column reserved for the north arrow, in landscape as in portrait.""" from reportlab.pdfgen import canvas as rl_canvas from reportlab.lib.units import mm from io import BytesIO from lidar_pipeline.export_pdf import ( _cartouche_text_max_width, _fit_title, _panel_boxes, layout) c = rl_canvas.Canvas(BytesIO()) - long_title = "Relief orienté - " + ", ".join(f"{1050 + i:04d}_6882" for i in range(6)) + long_title = "Oriented relief - " + ", ".join(f"{1050 + i:04d}_6882" for i in range(6)) for paper, orient, scale in (("A4", "paysage", 2000), ("A4", "portrait", 10000), ("A3", "portrait", 2000)): lay = layout(paper, orient, scale) @@ -332,5 +334,5 @@ def test_cartouche_title_avoids_north_arrow_column(): max_w = _cartouche_text_max_width(w, mm) txt, size = _fit_title(c, long_title, "Helvetica-Bold", 10, max_w) title_right_mm = x + c.stringWidth(txt, "Helvetica-Bold", size) / mm - arrow_left_mm = (x + w - 8) - 1.8 # bord gauche du triangle de la flèche + arrow_left_mm = (x + w - 8) - 1.8 # left edge of the arrow triangle assert title_right_mm <= arrow_left_mm, (paper, orient, scale) diff --git a/lidar_pipeline/tests/test_fetch_ign.py b/lidar_pipeline/tests/test_fetch_ign.py index 76e2c46..ef5f065 100644 --- a/lidar_pipeline/tests/test_fetch_ign.py +++ b/lidar_pipeline/tests/test_fetch_ign.py @@ -1,15 +1,15 @@ -"""Tests du téléchargement des dalles LiDAR HD de l'IGN (fetch_ign).""" +"""Tests for IGN LiDAR HD tile downloads (fetch_ign).""" def test_parse_tile_specs(): - """Accepte 'col,row', 'col:row' et ignore les espaces.""" + """Accepts 'col,row', 'col:row' and ignores whitespace.""" from lidar_pipeline.fetch_ign import parse_tile_specs assert parse_tile_specs(["1055,6882"]) == [(1055, 6882)] assert parse_tile_specs(["1055:6883", " 651 , 6630 "]) == [(1055, 6883), (651, 6630)] def test_parse_tile_specs_rejects_invalid(): - """Les spécifications mal formées lèvent une erreur explicite.""" + """Malformed specifications raise an explicit error.""" import pytest from lidar_pipeline.fetch_ign import parse_tile_specs with pytest.raises(ValueError): @@ -21,14 +21,14 @@ def test_parse_tile_specs_rejects_invalid(): def test_tile_filename_pads_coordinates(): - """Le nom de fichier DALLE utilise des coordonnées à 4 chiffres.""" + """The tile file name uses 4-digit coordinates.""" from lidar_pipeline.fetch_ign import tile_filename assert tile_filename(1055, 6882) == "LHD_FXX_1055_6882_PTS_LAMB93_IGN69.copc.laz" assert tile_filename(651, 6630) == "LHD_FXX_0651_6630_PTS_LAMB93_IGN69.copc.laz" def test_match_feature_uses_coordonnees_nw(): - """La correspondance se fait sur lidarhd:coordonnees_NW (format 0816-6847).""" + """Matching uses lidarhd:coordonnees_NW (0816-6847 format).""" from lidar_pipeline.fetch_ign import match_feature features = [ {"id": "LHD_FXX_1054_6882_PTS_LAMB93_IGN69_NE", @@ -43,7 +43,7 @@ def test_match_feature_uses_coordonnees_nw(): def test_find_tile_url_matches_and_returns_href(monkeypatch): - """find_tile_url interroge le STAC et retourne l'href de l'asset data.""" + """find_tile_url queries the STAC API and returns the data asset href.""" from lidar_pipeline import fetch_ign class FakeResponse: @@ -75,7 +75,7 @@ def test_find_tile_url_matches_and_returns_href(monkeypatch): def test_fetch_tiles_skips_existing_and_generated(tmp_path, monkeypatch): - """Pas de téléchargement si le LAZ existe ou si les visualisations existent.""" + """No download if the LAZ exists or if visualisations exist.""" from lidar_pipeline import fetch_ign input_dir = tmp_path / "input" @@ -84,13 +84,13 @@ def test_fetch_tiles_skips_existing_and_generated(tmp_path, monkeypatch): vis_dir = output_dir / "visualisations" / "LHD_FXX_1054_6882_PTS_LAMB93_IGN69" vis_dir.mkdir(parents=True) - # 1054,6882 : visualisations déjà générées - # 1055,6882 : LAZ déjà présent + # 1054,6882: visualisations already generated + # 1055,6882: LAZ already present existing = input_dir / fetch_ign.tile_filename(1055, 6882) existing.write_bytes(b"naze") def fail_download(*args, **kwargs): - raise AssertionError("ne doit pas être appelé") + raise AssertionError("must not be called") monkeypatch.setattr(fetch_ign, "find_tile_url", fail_download) result = fetch_ign.fetch_tiles(input_dir, [(1054, 6882), (1055, 6882)], @@ -99,10 +99,10 @@ def test_fetch_tiles_skips_existing_and_generated(tmp_path, monkeypatch): def _make_viz_dirs(output_dir, col, row, viz_keys, resolutions=(0.5, 0.2)): - """Crée les dossiers de visualisations d'une tuile (une entrée par résolution). + """Create a tile's visualisation directories (one per resolution). - Le suffixe de résolution n'est que sur le DOSSIER : les fichiers gardent - le basename nu (cf. _expected_output_path dans le pipeline). + The resolution suffix is only on the DIRECTORY: files keep the bare + basename (see _expected_output_path in the pipeline). """ base = f"LHD_FXX_{col:04d}_{row:04d}_PTS_LAMB93_IGN69" for res in resolutions: @@ -114,21 +114,21 @@ def _make_viz_dirs(output_dir, col, row, viz_keys, resolutions=(0.5, 0.2)): def test_fetch_tiles_downloads_incomplete_tile(tmp_path, monkeypatch): - """Une tuile incomplète (visualisation manquante) est téléchargée, une complète non.""" + """An incomplete tile (missing visualisation) is downloaded, a complete one is not.""" from pathlib import Path from lidar_pipeline import fetch_ign input_dir = tmp_path / "input" input_dir.mkdir() output_dir = tmp_path / "output" - _make_viz_dirs(output_dir, 1054, 6882, ["aspect"]) # slope manquant - _make_viz_dirs(output_dir, 1055, 6882, ["aspect", "slope"]) # complète + _make_viz_dirs(output_dir, 1054, 6882, ["aspect"]) # slope missing + _make_viz_dirs(output_dir, 1055, 6882, ["aspect", "slope"]) # complete calls = [] def fake_find_tile_url(col, row, timeout=20): calls.append((col, row)) - return "https://example.org/dalle.copc.laz" + return "https://example.org/tile.copc.laz" def fake_download(url, dest, timeout=120, chunk=1024 * 1024): Path(dest).write_bytes(b"laz") @@ -141,13 +141,13 @@ def test_fetch_tiles_downloads_incomplete_tile(tmp_path, monkeypatch): output_dir=output_dir, only_viz=["aspect", "slope"], resolutions=(0.5, 0.2)) - # Seule la tuile incomplète est retéléchargée + # Only the incomplete tile is downloaded again assert calls == [(1054, 6882)] assert [p.name for p in result] == [fetch_ign.tile_filename(1054, 6882)] def test_fetch_tiles_promotes_edge_neighbor_copy(tmp_path, monkeypatch): - """Une dalle déjà téléchargée comme voisine est déplacée dans input/ sans réseau.""" + """A tile already downloaded as a neighbour is moved to input/ without network access.""" from lidar_pipeline import fetch_ign input_dir = tmp_path / "input" @@ -159,7 +159,7 @@ def test_fetch_tiles_promotes_edge_neighbor_copy(tmp_path, monkeypatch): neighbor_copy.write_bytes(b"laz-voisine") def fail(*args, **kwargs): - raise AssertionError("ne doit pas être appelé (pas de réseau attendu)") + raise AssertionError("must not be called (no network expected)") monkeypatch.setattr(fetch_ign, "find_tile_url", fail) monkeypatch.setattr(fetch_ign, "download_file", fail) @@ -168,27 +168,27 @@ def test_fetch_tiles_promotes_edge_neighbor_copy(tmp_path, monkeypatch): assert not neighbor_copy.exists() assert (input_dir / name).read_bytes() == b"laz-voisine" - assert result == [] # promotion = "skip", comme le cas déjà-présent + assert result == [] # promotion = "skip", like the already-present case def test_fetch_tiles_does_not_promote_when_called_on_edge_dir(tmp_path, monkeypatch): - """Appel avec input_dir=edge_dir (cas _fetch_edge_neighbors) : jamais de promotion.""" + """Call with input_dir=edge_dir (_fetch_edge_neighbors case): never promotes.""" from lidar_pipeline import fetch_ign edge_dir = tmp_path / "input" / "edge_neighbors" edge_dir.mkdir(parents=True) inner_edge = edge_dir / "edge_neighbors" name = fetch_ign.tile_filename(1055, 6882) - # Même si un dossier edge_neighbors/edge_neighbors/ existait par - # accident, il ne doit jamais être déplacé vers edge_dir/. + # Even if an edge_neighbors/edge_neighbors/ directory existed by + # accident, it must never be moved to edge_dir/. inner_edge.mkdir() - (inner_edge / name).write_bytes(b"ne-doit-pas-bouger") + (inner_edge / name).write_bytes(b"must-not-move") calls = [] def fake_find_tile_url(col, row, timeout=20): calls.append((col, row)) - return "https://example.org/dalle.copc.laz" + return "https://example.org/tile.copc.laz" def fake_download(url, dest, timeout=120, chunk=1024 * 1024): from pathlib import Path @@ -200,14 +200,14 @@ def test_fetch_tiles_does_not_promote_when_called_on_edge_dir(tmp_path, monkeypa result = fetch_ign.fetch_tiles(edge_dir, [(1055, 6882)]) - assert calls == [(1055, 6882)] # téléchargée normalement, pas promue - assert (inner_edge / name).read_bytes() == b"ne-doit-pas-bouger" + assert calls == [(1055, 6882)] # downloaded normally, not promoted + assert (inner_edge / name).read_bytes() == b"must-not-move" assert (edge_dir / name).read_bytes() == b"laz" assert len(result) == 1 def test_fetch_tiles_force_downloads_complete(tmp_path, monkeypatch): - """force=True télécharge même une tuile complète (régénération avec --force).""" + """force=True downloads even a complete tile (regeneration with --force).""" from pathlib import Path from lidar_pipeline import fetch_ign @@ -220,7 +220,7 @@ def test_fetch_tiles_force_downloads_complete(tmp_path, monkeypatch): def fake_find_tile_url(col, row, timeout=20): calls.append((col, row)) - return "https://example.org/dalle.copc.laz" + return "https://example.org/tile.copc.laz" def fake_download(url, dest, timeout=120, chunk=1024 * 1024): Path(dest).write_bytes(b"laz") diff --git a/lidar_pipeline/tests/test_gpu.py b/lidar_pipeline/tests/test_gpu.py index d2d3053..3820670 100644 --- a/lidar_pipeline/tests/test_gpu.py +++ b/lidar_pipeline/tests/test_gpu.py @@ -94,7 +94,7 @@ def test_to_gpu_roundtrip(): # --------------------------------------------------------------------------- -# bin_mean_2d — rasterisation MNT (moyenne z par cellule) +# bin_mean_2d — DTM rasterization (mean z per cell) # --------------------------------------------------------------------------- def _scipy_reference(xs, ys, zs, width, height, x_range, y_range): @@ -107,7 +107,7 @@ def _scipy_reference(xs, ys, zs, width, height, x_range, y_range): def test_bin_mean_core_parity_scipy(): - """Le cœur numpy de bin_mean_2d reproduit binned_statistic_2d (mean).""" + """The numpy core of bin_mean_2d reproduces binned_statistic_2d (mean).""" from lidar_pipeline.gpu import _bin_mean_core rng = np.random.default_rng(42) x_range, y_range = (1000.0, 1010.0), (6800.0, 6808.0) @@ -116,9 +116,9 @@ def test_bin_mean_core_parity_scipy(): xs = rng.uniform(*x_range, n) ys = rng.uniform(*y_range, n) zs = rng.uniform(50.0, 150.0, n) - # Cas limites : bord gauche/bas (inclus), bord droit/haut (inclus dans la - # dernière cellule), hors emprise (ignorés), points exactement sur une - # arête intérieure + # Edge cases: left/bottom edge (included), right/top edge (included in the + # last cell), outside the extent (ignored), points exactly on an interior + # cell boundary xs = np.concatenate([xs, [1000.0, 1010.0, 999.9, 1010.1, 1002.5]]) ys = np.concatenate([ys, [6800.0, 6808.0, 6808.1, 6807.9, 6804.0]]) zs = np.concatenate([zs, [99.0, 101.0, 777.0, 777.0, 103.0]]) @@ -129,25 +129,25 @@ def test_bin_mean_core_parity_scipy(): def test_bin_mean_core_empty_and_single(): - """Cellules vides → NaN ; un seul point → sa valeur partout où présent.""" + """Empty cells → NaN; a single point → its value in its own cell.""" from lidar_pipeline.gpu import _bin_mean_core x_range, y_range = (0.0, 10.0), (0.0, 10.0) - # Aucun point dans l'emprise + # No point inside the extent out = _bin_mean_core(np, [-5.0], [-5.0], [1.0], 5, 5, x_range, y_range) assert out.shape == (5, 5) assert np.isnan(out).all() - # Un point au centre exact : cellule (2, 2) + # One point exactly at the center: cell (2, 2) out = _bin_mean_core(np, [5.0], [5.0], [7.5], 5, 5, x_range, y_range) assert out[2, 2] == 7.5 assert np.isnan(out).sum() == 24 - # Cellule avec plusieurs points : moyenne exacte + # Cell with several points: exact mean out = _bin_mean_core(np, [5.0, 5.1, 5.2], [5.0, 5.0, 5.0], [10.0, 20.0, 30.0], 5, 5, x_range, y_range) assert out[2, 2] == 20.0 def test_bin_mean_2d_gpu_or_none(): - """bin_mean_2d : None sans GPU, sinon sortie identique au cœur numpy.""" + """bin_mean_2d: None without a GPU, otherwise output identical to the numpy core.""" from lidar_pipeline.gpu import bin_mean_2d, _bin_mean_core rng = np.random.default_rng(7) x_range, y_range = (1000.0, 1200.0), (6800.0, 7000.0) @@ -159,24 +159,24 @@ def test_bin_mean_2d_gpu_or_none(): got = bin_mean_2d(xs, ys, zs, w, h, x_range, y_range) ref = _bin_mean_core(np, xs, ys, zs, w, h, x_range, y_range) if got is None: - assert isinstance(ref, np.ndarray) # repli scipy assuré par l'appelant + assert isinstance(ref, np.ndarray) # the caller provides the scipy fallback else: assert isinstance(got, np.ndarray) np.testing.assert_allclose(got, ref, equal_nan=True, rtol=1e-9) def test_safe_gpu_call_retries_on_cpu_for_any_error(monkeypatch): - """GPU actif : TOUTE erreur (pas seulement les messages CUDA) désactive - le GPU et retranche le calcul en CPU. + """GPU active: ANY error (not only CUDA messages) disables the GPU and + retries the computation on CPU. - Cas réel : après un échec de transfert GPU, des types numpy/cupy mêlés - (« Unsupported type ») ne contenaient aucun - mot-clé CUDA et propageaient l'erreur — la visualisation entière - échouait alors pour rien. + Real case: after a GPU transfer failure, mixed numpy/cupy types + ("Unsupported type ") contained no CUDA keyword + and propagated the error — the whole visualization then failed for + nothing. """ from lidar_pipeline import gpu - class _FakeCP: # GPU « actif » sans CuPy + class _FakeCP: # "active" GPU without CuPy pass monkeypatch.setattr(gpu, "_cp", _FakeCP()) @@ -190,23 +190,23 @@ def test_safe_gpu_call_retries_on_cpu_for_any_error(monkeypatch): return x + 1 assert gpu.safe_gpu_call(f, 21) == 22 - assert gpu.HAS_GPU is False # GPU désactivé après l'erreur + assert gpu.HAS_GPU is False # GPU disabled after the error assert gpu._cp is None - # Mode CPU : l'erreur se relance telle quelle (rien à retrancher) + # CPU mode: the error is re-raised as is (nothing to retry) def g(x): raise ValueError("boom") try: gpu.safe_gpu_call(g, 1) - raise AssertionError("devait relancer l'erreur") + raise AssertionError("should have re-raised the error") except ValueError: pass def test_gpu_worker_slots_bounded_by_free_vram(monkeypatch): - """Places GPU par la VRAM libre : l'excédent de workers passe en CPU. + """GPU slots bounded by free VRAM: surplus workers run on CPU. - Cas réel : LIDAR_WORKERS=auto = 12 workers sur 2 RTX 5060 (8 Go) — - 6 workers par GPU, soit bien plus que la VRAM libre ne tient au pic - (calage des lignes + comblement GPU) : OOM. + Real case: LIDAR_WORKERS=auto = 12 workers on 2 RTX 5060 (8 GB) — + 6 workers per GPU, far more than free VRAM holds at peak (scan-line + alignment + GPU gap filling): OOM. """ from lidar_pipeline import gpu monkeypatch.setattr(gpu, "GPU_WORKER_MIB", 2000) @@ -216,24 +216,24 @@ def test_gpu_worker_slots_bounded_by_free_vram(monkeypatch): assert len(slots) == 12 assert slots.count(0) == 3 # (7500 - 500) // 2000 assert slots.count(1) == 2 # (4600 - 500) // 2000 - assert slots.count(-1) == 7 # reste en CPU - # GPU d'abord, entrelacés : les premiers workers créés se répartissent + assert slots.count(-1) == 7 # the rest on CPU + # GPUs first, interleaved: the first workers created are spread out assert slots[:4] == [0, 1, 0, 1] - # Moins de workers que de places : aucun CPU forcé + # Fewer workers than slots: no forced CPU assert gpu.gpu_worker_slots([0, 1], 3, free_mib=free) == [0, 1, 0] def test_gpu_worker_slots_without_gpu_or_vram_info(): - """Sans GPU : tout en CPU implicite (None). VRAM inconnue : round-robin - historique (pas de bornage sans mesure).""" + """No GPU: implicit CPU everywhere (None). Unknown VRAM: legacy + round-robin (no bound without a measurement).""" from lidar_pipeline import gpu assert gpu.gpu_worker_slots([], 4, free_mib={}) == [None] * 4 assert gpu.gpu_worker_slots([0, 1], 4, free_mib={}) == [0, 1, 0, 1] def test_gpu_worker_slots_keeps_one_gpu_worker_when_tight(monkeypatch): - """GPU presque plein : au moins une place pour que le GPU serve encore - (le repli CPU de safe_gpu_call couvre l'OOM éventuel).""" + """Nearly full GPU: at least one slot so the GPU is still used + (safe_gpu_call's CPU fallback covers a possible OOM).""" from lidar_pipeline import gpu monkeypatch.setattr(gpu, "GPU_WORKER_MIB", 2000) monkeypatch.setattr(gpu, "GPU_RESERVE_MIB", 500) @@ -241,7 +241,7 @@ def test_gpu_worker_slots_keeps_one_gpu_worker_when_tight(monkeypatch): def test_force_cpu_disables_gpu_selection(monkeypatch): - """force_cpu() : aucun candidat GPU, CuPy jamais initialisé.""" + """force_cpu(): no GPU candidate, CuPy never initialized.""" import os from lidar_pipeline import gpu monkeypatch.setattr(gpu, "_restricted_gpu_ids", None) diff --git a/lidar_pipeline/tests/test_index.py b/lidar_pipeline/tests/test_index.py index 56d0fe6..046d0d4 100644 --- a/lidar_pipeline/tests/test_index.py +++ b/lidar_pipeline/tests/test_index.py @@ -1,24 +1,24 @@ -"""Tests pour la carte globale interactive (index.py).""" +"""Tests for the tile catalog (index.py).""" import json from pathlib import Path def test_parse_basename_coords_valid(): - """Parse les coordonnées d'un basename LHD valide.""" + """Parse the coordinates of a valid LHD basename.""" from lidar_pipeline.index import parse_basename_coords assert parse_basename_coords("LHD_FXX_1000_6881_PTS_LAMB93_IGN69") == (1000, 6881) assert parse_basename_coords("LHD_FXX_1049_6895_PTS_LAMB93_IGN69") == (1049, 6895) def test_parse_basename_coords_with_res_suffix(): - """Les noms de dossier avec suffixe résolution sont aussi parsables.""" + """Directory names with a resolution suffix can be parsed too.""" from lidar_pipeline.index import parse_basename_coords assert parse_basename_coords("LHD_FXX_1000_6881_PTS_LAMB93_IGN69_r0p2") == (1000, 6881) def test_parse_basename_coords_invalid(): - """Les noms non-LHD retournent None.""" + """Non-LHD names return None.""" from lidar_pipeline.index import parse_basename_coords assert parse_basename_coords("random_dir") is None assert parse_basename_coords("DTM") is None @@ -26,7 +26,7 @@ def test_parse_basename_coords_invalid(): def test_strip_res_suffix_primary(): - """Dossier sans suffixe = résolution primaire (0.5).""" + """Directory without a suffix = primary resolution (0.5).""" from lidar_pipeline.index import _strip_res_suffix base, res = _strip_res_suffix("LHD_FXX_1000_6881_PTS_LAMB93_IGN69") assert base == "LHD_FXX_1000_6881_PTS_LAMB93_IGN69" @@ -34,7 +34,7 @@ def test_strip_res_suffix_primary(): def test_strip_res_suffix_multi(): - """Dossier avec suffixe _r0p2 = résolution 0.2.""" + """Directory with the _r0p2 suffix = resolution 0.2.""" from lidar_pipeline.index import _strip_res_suffix base, res = _strip_res_suffix("LHD_FXX_1000_6881_PTS_LAMB93_IGN69_r0p2") assert base == "LHD_FXX_1000_6881_PTS_LAMB93_IGN69" @@ -42,7 +42,7 @@ def test_strip_res_suffix_multi(): def test_compute_bbox(): - """Calcule la bounding box d'un ensemble de tuiles.""" + """Compute the bounding box of a set of tiles.""" from lidar_pipeline.index import compute_bbox tiles = [ {'col': 1000, 'row': 6881}, @@ -54,16 +54,16 @@ def test_compute_bbox(): def test_compute_bbox_empty(): - """Aucune tuile → None.""" + """No tile → None.""" from lidar_pipeline.index import compute_bbox assert compute_bbox([]) is None def _make_fake_viz_dir(vis_dir, basename, col, row, viz_keys=('hillshade_multi', 'svf'), ext='webp', res_suffix=''): - """Crée un faux dossier de visualisations avec de petites images. + """Create a fake visualization directory with small images. - Le suffixe de résolution apparaît seulement dans le nom du dossier (miroir - du pipeline : les fichiers restent préfixés par le basename nu). + The resolution suffix only appears in the directory name (mirroring + the pipeline: files stay prefixed with the bare basename). """ from PIL import Image as PILImage import numpy as np @@ -80,7 +80,7 @@ def _make_fake_viz_dir(vis_dir, basename, col, row, viz_keys=('hillshade_multi', def test_scan_tiles(tmp_path): - """scan_tiles détecte les dossiers de tuiles et leurs visualisations.""" + """scan_tiles detects the tile directories and their visualizations.""" from lidar_pipeline.index import scan_tiles vis_dir = tmp_path / "visualisations" @@ -93,14 +93,14 @@ def test_scan_tiles(tmp_path): names = sorted(t['dir_name'] for t in tiles) assert "LHD_FXX_1000_6881_PTS_LAMB93_IGN69" in names assert "LHD_FXX_1001_6881_PTS_LAMB93_IGN69" in names - # Vérifie que les viz sont détectées + # Check that the visualizations are detected t0 = next(t for t in tiles if t['col'] == 1000) assert 'hillshade_multi' in t0['viz'] assert 'svf' in t0['viz'] def test_scan_tiles_ignores_non_lhd(tmp_path): - """Les dossiers non-LHD (ex: temp, DTM) sont ignorés.""" + """Non-LHD directories (e.g. temp, DTM) are ignored.""" from lidar_pipeline.index import scan_tiles vis_dir = tmp_path / "visualisations" @@ -114,7 +114,7 @@ def test_scan_tiles_ignores_non_lhd(tmp_path): def test_scan_tiles_multi_resolution(tmp_path): - """Les dossiers avec suffixe résolution sont correctement décodés.""" + """Directories with a resolution suffix are decoded correctly.""" from lidar_pipeline.index import scan_tiles vis_dir = tmp_path / "visualisations" @@ -129,14 +129,14 @@ def test_scan_tiles_multi_resolution(tmp_path): def test_res_suffix_str(): - """Le suffixe de résolution reflète le nommage du pipeline (miroir).""" + """The resolution suffix mirrors the pipeline naming.""" from lidar_pipeline.index import _res_suffix_str assert _res_suffix_str(0.5) == '' assert _res_suffix_str(0.2) == '_r0p2' def test_collect_tile_metadata(tmp_path): - """Les métadonnées lisent la méthode DTM et les dates/tailles des viz.""" + """The metadata read the DTM method and the viz dates/sizes.""" import os from datetime import datetime from lidar_pipeline.index import _collect_tile_metadata @@ -151,7 +151,7 @@ def test_collect_tile_metadata(tmp_path): dtm_dir.mkdir() method_file = dtm_dir / f"{basename}_dtm_method.txt" method_file.write_text("ign", encoding="utf-8") - # Dates déterministes : method.txt plus ancien que la viz + # Deterministic dates: method.txt older than the viz os.utime(method_file, (1600000000, 1600000000)) os.utime(viz_file, (1700000000, 1700000000)) fmt = lambda ts: datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M') @@ -169,7 +169,7 @@ def test_collect_tile_metadata(tmp_path): def test_collect_tile_metadata_resolution_suffix(tmp_path): - """Une tuile 0,2 m lit son sidecar _dtm_r0p2_method.txt dédié.""" + """A 0.2 m tile reads its dedicated _dtm_r0p2_method.txt sidecar.""" from lidar_pipeline.index import _collect_tile_metadata basename = "LHD_FXX_1000_6881_PTS_LAMB93_IGN69" @@ -184,13 +184,13 @@ def test_collect_tile_metadata_resolution_suffix(tmp_path): 'viz': {}} meta = _collect_tile_metadata(tile, dtm_dir) assert meta['method'] == 'smrf' - # La date vient du sidecar (écrit juste après la création du DTM) + # The date comes from the sidecar (written right after the DTM is created) assert meta['generated'] is not None assert meta['viz'] == {} def test_collect_tile_metadata_fallback_date(tmp_path): - """Sans sidecar DTM, la date de génération remonte au plus ancien fichier viz.""" + """Without a DTM sidecar, the generation date falls back to the oldest viz file.""" from lidar_pipeline.index import _collect_tile_metadata basename = "LHD_FXX_1000_6881_PTS_LAMB93_IGN69" @@ -208,7 +208,7 @@ def test_collect_tile_metadata_fallback_date(tmp_path): def test_build_index_generates_inventory(tmp_path): - """build_index génère l'inventaire index_tiles.json et les vignettes.""" + """build_index generates the index_tiles.json inventory and the thumbnails.""" from lidar_pipeline.index import build_index output_dir = tmp_path / "output" @@ -224,26 +224,26 @@ def test_build_index_generates_inventory(tmp_path): inv_path = Path(result) assert inv_path.exists() assert inv_path.name == "index_tiles.json" - # L'ancienne interface HTML a été retirée : plus de coquille ni d'assets + # The old HTML interface was removed: no more shell or assets assert not (output_dir / "index.html").exists() assert not (output_dir / "assets").exists() - # Inventaire servi par /api/tiles aux machines légères : tuiles avec coins, - # libellés de couches, compteur. + # Inventory served by /api/tiles to the lightweight machines: tiles with corners, + # layer labels, counter. data = json.loads(inv_path.read_text(encoding='utf-8')) assert data['tiles'] and data['tiles'][0]['corners'] assert 'aspect' in data['viz_meta'] assert data['viz_meta']['aspect']['label'] assert data['stats']['n_tiles'] == len(data['tiles']) - # Vérifie les vignettes générées + # Check the generated thumbnails thumb_dir = output_dir / "index_thumbs" assert thumb_dir.is_dir() thumbs = list(thumb_dir.glob("*.jpg")) - assert len(thumbs) >= 2 # au moins hillshade pour chaque tuile + assert len(thumbs) >= 2 # at least hillshade for each tile def test_mid_thumbnails_generated(tmp_path): - """Vignette intermédiaire 640 px générée et référencée dans l'index.""" + """640 px intermediate thumbnail generated and referenced in the index.""" from lidar_pipeline.index import build_index output_dir = tmp_path / "output" @@ -255,13 +255,13 @@ def test_mid_thumbnails_generated(tmp_path): data = json.loads((output_dir / "index_tiles.json").read_text(encoding='utf-8')) viz = data['tiles'][0]['viz']['hillshade_multi'] assert 'mid' in viz - # L'URL porte un suffixe ?v= (invalidation cache) : chemin sans lui + # The URL carries a ?v= suffix (cache busting): path without it assert (output_dir / viz['mid'].split('?')[0]).exists() assert viz['mid'].split('?')[0].endswith("_mid.jpg") def test_subtiles_cover_all_layers(tmp_path): - """Toutes les couches d'une dalle 0,2 m sont sous-tuilées (plus de liste courte).""" + """Every layer of a 0.2 m tile is cut into sub-tiles (no more short list).""" from lidar_pipeline.index import _CARTO_SUBTILED_VIZ, build_index assert _CARTO_SUBTILED_VIZ == () @@ -277,7 +277,7 @@ def test_subtiles_cover_all_layers(tmp_path): for viz in ('hillshade_multi', 'svf', 'topo'): avif = sub_dir / f"LHD_FXX_1000_6881_PTS_LAMB93_IGN69_r0p2_{viz}_0_0.avif" assert avif.exists(), viz - # L'index référence les sous-tuiles pour chaque couche, pas le repli dalle + # The index references the sub-tiles for each layer, not the whole-tile fallback data = json.loads((output_dir / "index_tiles.json").read_text(encoding='utf-8')) subs = [t for t in data['tiles'] if t.get('sub_k') == 2] assert len(subs) == 4 @@ -287,8 +287,8 @@ def test_subtiles_cover_all_layers(tmp_path): def test_panel_restricted_to_kept_layers(): - """Le panneau est restreint aux couches conservées (PANEL_VIZ) : la couche - principale par défaut et la précision y figurent.""" + """The panel is restricted to the kept layers (PANEL_VIZ): the default + main layer and the precision layer are in it.""" from lidar_pipeline.index import (PANEL_VIZ, DEFAULT_VIZ, PRECISION_VIZ, VIEW_MODES, DEFAULT_VIEW_MODE, KEYWORD_TO_STEP, default_main_layer) from lidar_pipeline.pipeline import VIZ_STEPS @@ -296,19 +296,19 @@ def test_panel_restricted_to_kept_layers(): assert DEFAULT_VIEW_MODE in VIEW_MODES assert default_main_layer(["densite_sol", "aspect"]) == "aspect" assert default_main_layer(["densite_sol"]) is None - # Chaque couche conservée correspond à une étape --only valide + # Each kept layer matches a valid --only step steps = {name for name, _ in VIZ_STEPS} for key in PANEL_VIZ: assert KEYWORD_TO_STEP.get(key, key) in steps def test_build_index_merges_cross_resolution_viz(tmp_path): - """Une couche produite seulement à 0,5 m reste visible sur la dalle 0,2 m. + """A layer produced only at 0.5 m stays visible on the 0.2 m tile. - Le dernier run peut être interrompu entre les deux passes de résolution : - la fusion inter-résolutions doit pointer vignettes et URLs vers le dossier - d'origine de chaque fichier (dir_name), pas vers dir_path de la dalle - affichée — sinon les vignettes échouent et la couche disparaît. + The last run may have been interrupted between the two resolution passes: + the cross-resolution merge must point thumbnails and URLs to the original + directory of each file (dir_name), not to the dir_path of the displayed + tile — otherwise the thumbnails fail and the layer disappears. """ from lidar_pipeline.index import build_index @@ -316,19 +316,19 @@ def test_build_index_merges_cross_resolution_viz(tmp_path): vis_dir = output_dir / "visualisations" vis_dir.mkdir(parents=True) base = "LHD_FXX_1000_6881_PTS_LAMB93_IGN69" - # Passe 0,5 m : aspect + slope ; passe 0,2 m : aspect seulement + # 0.5 m pass: aspect + slope; 0.2 m pass: aspect only _make_fake_viz_dir(vis_dir, base, 1000, 6881, ('aspect', 'slope')) _make_fake_viz_dir(vis_dir, base, 1000, 6881, ('aspect',), res_suffix='_r0p2') assert build_index(output_dir) is not None data = json.loads((output_dir / "index_tiles.json").read_text(encoding='utf-8')) - # Une seule position affichée (résolution la plus fine), deux couches + # A single displayed position (finest resolution), two layers tiles = [t for t in data['tiles'] if (t['col'], t['row']) == (1000, 6881)] keys = set() for t in tiles: keys.update(t['viz'].keys()) assert {'aspect', 'slope'} <= keys - # Vignette slope générée + chaque thumb/full existe réellement sur disque + # Slope thumbnail generated + every thumb/full really exists on disk assert (output_dir / "index_thumbs" / f"{base}_r0p2_slope.jpg").exists() for t in tiles: for v in t['viz'].values(): @@ -337,7 +337,7 @@ def test_build_index_merges_cross_resolution_viz(tmp_path): def test_build_index_regenerates_stale_thumbnails(tmp_path): - """Une tuile recalculée (source plus récente) régénère sa vignette.""" + """A recomputed tile (newer source) regenerates its thumbnail.""" import os import time import numpy as np @@ -354,7 +354,7 @@ def test_build_index_regenerates_stale_thumbnails(tmp_path): assert thumb_path.exists() m1 = thumb_path.stat().st_mtime - # Recalcul de la tuile : source réécrite avec une mtime plus récente + # Tile recomputed: source rewritten with a newer mtime src = tile_dir / "LHD_FXX_1000_6881_PTS_LAMB93_IGN69_hillshade_multi.webp" arr = np.random.randint(0, 255, (50, 50, 3), dtype=np.uint8) PILImage.fromarray(arr).save(str(src), format='WEBP', quality=80) @@ -362,16 +362,16 @@ def test_build_index_regenerates_stale_thumbnails(tmp_path): assert build_index(output_dir) is not None m2 = thumb_path.stat().st_mtime - assert m2 > m1 # vignette régénérée + assert m2 > m1 # thumbnail regenerated - # Source non modifiée depuis → pas de régénération inutile + # Source not modified since → no needless regeneration os.utime(src, (time.time() - 10, time.time() - 10)) assert build_index(output_dir) is not None assert thumb_path.stat().st_mtime == m2 def test_build_subtiles_regenerates_stale_crops(tmp_path): - """Une dalle 0,2 m recalculée régénère ses sous-tuiles (par visualisation).""" + """A recomputed 0.2 m tile regenerates its sub-tiles (per visualization).""" import os from lidar_pipeline.index import build_index @@ -391,22 +391,22 @@ def test_build_subtiles_regenerates_stale_crops(tmp_path): m_hill_1 = hill_avif.stat().st_mtime m_aspect_1 = aspect_avif.stat().st_mtime - # Recalcul : seule la source hillshade est plus récente + # Recomputation: only the hillshade source is newer src = tile_dir / "LHD_FXX_1000_6881_PTS_LAMB93_IGN69_hillshade_multi.webp" os.utime(src, (m_hill_1 + 5, m_hill_1 + 5)) assert build_index(output_dir) is not None - assert hill_avif.stat().st_mtime > m_hill_1 # sous-tuiles hillshade régénérées - assert aspect_avif.stat().st_mtime == m_aspect_1 # aspect intact + assert hill_avif.stat().st_mtime > m_hill_1 # hillshade sub-tiles regenerated + assert aspect_avif.stat().st_mtime == m_aspect_1 # aspect untouched def test_urls_versioned_for_cache_busting(tmp_path): - """Les URLs images changent quand une tuile est régénérée. + """Image URLs change when a tile is regenerated. - Les URLs versionnées (?v=) sont servies avec un cache immutable : un - recalcul DOIT changer l'URL pour forcer le rechargement, y compris en - direct pendant un run (--incremental-index). Chaque URL porte la mtime - de SON fichier (cf. test_urls_versioned_by_served_file_mtime). + Versioned URLs (?v=) are served with an immutable cache: a + recomputation MUST change the URL to force a reload, including + live during a run (the inventory is rewritten after each tile). Each URL + carries the mtime of ITS file (see test_urls_versioned_by_served_file_mtime). """ import os import re @@ -426,25 +426,25 @@ def test_urls_versioned_for_cache_busting(tmp_path): thumb1, mid1, full1 = read_urls() for url in (thumb1, mid1, full1): - assert re.search(r"\?v=\d+$", url), url # versionnée (mtime ms) + assert re.search(r"\?v=\d+$", url), url # versioned (ms mtime) assert (output_dir / url.split('?')[0]).exists(), url - # Même source, rebuild → URLs identiques (cache navigateur conservé) + # Same source, rebuild → identical URLs (browser cache kept) assert build_index(output_dir) is not None assert read_urls() == (thumb1, mid1, full1) - # Régénération : mtime de la source plus récente → nouvelles URLs + # Regeneration: newer source mtime → new URLs src = tile_dir / "LHD_FXX_1000_6881_PTS_LAMB93_IGN69_hillshade_multi.webp" m = src.stat().st_mtime os.utime(src, (m + 10, m + 10)) assert build_index(output_dir) is not None thumb2, mid2, full2 = read_urls() assert (thumb2, mid2, full2) != (thumb1, mid1, full1) - assert thumb2.split('?')[0] == thumb1.split('?')[0] # même fichier, version neuve + assert thumb2.split('?')[0] == thumb1.split('?')[0] # same file, new version def test_subtile_urls_versioned(tmp_path): - """Les URLs des sous-tuiles 0,2 m sont aussi versionnées (?v=).""" + """The URLs of the 0.2 m sub-tiles are versioned too (?v=).""" import re from lidar_pipeline.index import build_index @@ -466,7 +466,7 @@ def test_subtile_urls_versioned(tmp_path): def test_build_index_empty_returns_none(tmp_path): - """Aucune tuile → build_index retourne None sans crash.""" + """No tile → build_index returns None without crashing.""" from lidar_pipeline.index import build_index output_dir = tmp_path / "output" @@ -477,7 +477,7 @@ def test_build_index_empty_returns_none(tmp_path): def test_attach_gps_bounds(): - """attach_gps_bounds ajoute des bounds GPS ordonnées (France métropolitaine).""" + """attach_gps_bounds adds ordered GPS bounds (metropolitan France).""" from lidar_pipeline.index import attach_gps_bounds tiles = [{'col': 1000, 'row': 6881}, {'col': 1042, 'row': 6900}] attach_gps_bounds(tiles) @@ -486,16 +486,16 @@ def test_attach_gps_bounds(): (lat_s, lon_w), (lat_n, lon_e) = t['bounds'] assert lat_n > lat_s assert lon_e > lon_w - # France métropolitaine + # Metropolitan France assert 41 < lat_s < 51 assert -5 < lon_w < 10 def test_attach_gps_bounds_row_is_north_edge(): - """Le numéro de ligne du fichier = bord NORD (convention LiDAR HD IGN). + """The file row number = NORTH edge (IGN LiDAR HD convention). - Vérifié sur les bounds des DTM : X ∈ [col, col+1] km, Y ∈ [row-1, row] km. - La régression historique plaçait Y ∈ [row, row+1] (1 km trop au nord). + Checked against the DTM bounds: X ∈ [col, col+1] km, Y ∈ [row-1, row] km. + The historical regression placed Y ∈ [row, row+1] (1 km too far north). """ from rasterio.warp import transform as warp_transform from lidar_pipeline.index import attach_gps_bounds @@ -505,7 +505,7 @@ def test_attach_gps_bounds_row_is_north_edge(): attach_gps_bounds(tiles) corners = tiles[0]['corners'] - # Référence exacte de la vraie cellule : SW, SE, NE, NW + # Exact reference of the real cell: SW, SE, NE, NW xs = [col * 1000, (col + 1) * 1000, (col + 1) * 1000, col * 1000] ys = [(row - 1) * 1000, (row - 1) * 1000, row * 1000, row * 1000] lons, lats = warp_transform('EPSG:2154', 'EPSG:4326', xs, ys) @@ -513,14 +513,14 @@ def test_attach_gps_bounds_row_is_north_edge(): assert abs(corners[k][0] - lats[k]) < 1e-9 assert abs(corners[k][1] - lons[k]) < 1e-9 - # L'ancienne convention (row = bord sud) serait décalée d'environ 1 km + # The old convention (row = south edge) would be off by about 1 km lat_n = max(c[0] for c in corners) - assert abs(lat_n - max(lats)) < 1e-9 # bord nord = Y = row×1000 + assert abs(lat_n - max(lats)) < 1e-9 # north edge = Y = row×1000 def test_pick_display_viz_prefers_hillshade(): - """Le choix de viz par défaut privilégie hillshade_multi.""" + """The default viz choice prefers hillshade_multi.""" from lidar_pipeline.index import _pick_display_viz assert _pick_display_viz(['svf', 'hillshade_multi', 'slope']) == 'hillshade_multi' assert _pick_display_viz(['svf', 'slope']) == 'svf' @@ -528,7 +528,7 @@ def test_pick_display_viz_prefers_hillshade(): def test_subdivision_k(): - """0,5 m/px (2000 px) reste entier ; 0,2 m/px (5000 px) est découpé en 2×2.""" + """0.5 m/px (2000 px) stays whole; 0.2 m/px (5000 px) is split 2×2.""" from lidar_pipeline.index import _subdivision_k assert _subdivision_k(0.5) == 1 assert _subdivision_k(0.2) == 2 @@ -536,26 +536,26 @@ def test_subdivision_k(): def test_subtile_corners_grid(): - """Les sous-tuiles reconstruisent exactement la grille de la dalle.""" + """The sub-tiles rebuild the tile grid exactly.""" from lidar_pipeline.index import _subtile_corners corners = [[10.0, 2.0], [10.0, 3.0], [11.0, 3.0], [11.0, 2.0]] # SW SE NE NW k = 2 - sw_quad = _subtile_corners(corners, 0, 0, k) # quadrant sud-ouest - ne_quad = _subtile_corners(corners, 1, 1, k) # quadrant nord-est - # Le quadrant SW partage le coin SW de la dalle + sw_quad = _subtile_corners(corners, 0, 0, k) # south-west quadrant + ne_quad = _subtile_corners(corners, 1, 1, k) # north-east quadrant + # The SW quadrant shares the SW corner of the tile assert sw_quad[0] == corners[0] - # Le quadrant NE partage le coin NE de la dalle + # The NE quadrant shares the NE corner of the tile assert ne_quad[2] == corners[2] - # Le quadrant SW a son coin NE au centre de la dalle + # The SW quadrant has its NE corner at the center of the tile assert sw_quad[2] == [10.5, 2.5] - # Adjacence : bord est du SW = bord ouest du SE (0,0)-(1,0) + # Adjacency: east edge of SW = west edge of SE (0,0)-(1,0) se_quad = _subtile_corners(corners, 1, 0, k) assert sw_quad[1] == se_quad[0] assert sw_quad[2] == se_quad[3] def test_approx_wgs84_to_l93_roundtrip(): - """L'approximation affine WGS84→L93 est l'inverse exacte de L93→WGS84.""" + """The affine WGS84→L93 approximation is the exact inverse of L93→WGS84.""" from lidar_pipeline.index import _approx_l93_to_wgs84, _approx_wgs84_to_l93 for x, y in ((1054000.0, 6882000.0), (700000.0, 6600000.0), (950123.0, 6410456.0)): lon, lat = _approx_l93_to_wgs84(x, y) @@ -566,32 +566,32 @@ def test_approx_wgs84_to_l93_roundtrip(): def test_subtile_corners_shared_edges_exact(): - """Bords partagés : deux sous-tuiles voisines reçoivent le MÊME point. + """Shared edges: two neighboring sub-tiles get the SAME point. - Sans partage, l'interpolation bilinéaire est évaluée deux fois sur des - fractions différentes et les bords ne coïncident plus à moins d'un pixel - — jointure cassée (ligne blanche) au zoom moyen. + Without sharing, the bilinear interpolation is evaluated twice on + different fractions and the edges miss by less than a pixel + — broken seam (white line) at medium zoom. """ from lidar_pipeline.index import _subtile_corners corners = [[10.0, 2.0], [10.0, 3.0], [11.0, 3.0], [11.0, 2.0]] k = 4 a = _subtile_corners(corners, 0, 0, k) b = _subtile_corners(corners, 1, 0, k) - assert a[1] == b[0] # bord est de (0,0) = bord ouest de (1,0) + assert a[1] == b[0] # east edge of (0,0) = west edge of (1,0) assert a[2] == b[3] c = _subtile_corners(corners, 0, 1, k) - assert a[3] == c[0] # bord nord de (0,0) = bord sud de (0,1) + assert a[3] == c[0] # north edge of (0,0) = south edge of (0,1) d = _subtile_corners(corners, 3, 3, k) - assert d[2] == corners[2] # coin NE de la dalle partagé tel quel + assert d[2] == corners[2] # tile NE corner shared as is def test_overview_corners_shared_between_tiles(tmp_path): - """Le coin d'une dalle est aussi celui de sa voisine (même point). + """A tile's corner is also its neighbor's (same point). - Deux dalles adjacentes E-O partagent un bord vertical : le NE de la dalle - ouest = le NW de la dalle est. Sans partage, les interpolations bilinéaires - des sous-tuiles voisines ne coïncident plus à moins d'un pixel — jointure - cassée au zoom moyen. + Two E-W adjacent tiles share a vertical edge: the NE of the western + tile = the NW of the eastern tile. Without sharing, the bilinear interpolations + of neighboring sub-tiles miss by less than a pixel — broken seam + at medium zoom. """ from lidar_pipeline.index import build_index @@ -604,16 +604,16 @@ def test_overview_corners_shared_between_tiles(tmp_path): assert build_index(output_dir) is not None data = json.loads((output_dir / "index_tiles.json").read_text(encoding='utf-8')) tiles = {t['col']: t for t in data['tiles']} - a_ne = tiles[1000]['corners'][2] # NE de la dalle ouest - b_nw = tiles[1001]['corners'][3] # NW de la dalle est - assert a_ne == b_nw, f"coins partagés divergents : {a_ne} != {b_nw}" + a_ne = tiles[1000]['corners'][2] # NE of the western tile + b_nw = tiles[1001]['corners'][3] # NW of the eastern tile + assert a_ne == b_nw, f"shared corners diverge: {a_ne} != {b_nw}" def test_urls_versioned_by_served_file_mtime(tmp_path): - """?v= suit la mtime du fichier SERVI — prérequis du cache immutable. + """?v= follows the mtime of the SERVED file — prerequisite of the immutable cache. - Une vignette recalculée après coup (source inchangée) change de contenu : - son URL doit changer aussi, sans toucher celles des fichiers intacts. + A thumbnail recomputed later (unchanged source) changes content: + its URL must change too, without touching those of the intact files. """ from lidar_pipeline.index import build_index @@ -621,7 +621,7 @@ def test_urls_versioned_by_served_file_mtime(tmp_path): vis_dir = output_dir / "visualisations" vis_dir.mkdir(parents=True) _make_fake_viz_dir(vis_dir, "a", 1000, 6881, ('hillshade_multi',)) - # 0,2 m : la dalle passe par le sous-tuilage (vignettes/mid/AVIF propres) + # 0.2 m: the tile goes through sub-tiling (own thumbnails/mid/AVIF) _make_fake_viz_dir(vis_dir, "b", 1001, 6881, ('hillshade_multi',), res_suffix='_r0p2') @@ -636,11 +636,11 @@ def test_urls_versioned_by_served_file_mtime(tmp_path): continue path, v = url.split('?v=') assert v.isdigit() - # La version est la mtime ms du fichier servi lui-même - # (tolérance 1 s : granularité du système de fichiers). + # The version is the ms mtime of the served file itself + # (1 s tolerance: file system granularity). assert abs(int(v) - int((output_dir / path).stat().st_mtime * 1000)) < 1000 - # Vignette 0,5 m recalculée après coup : seule SON URL change. + # 0.5 m thumbnail recomputed later: only ITS URL changes. tiles05 = [t for t in data['tiles'] if t.get('resolution') == 0.5] url_before = tiles05[0]['viz']['hillshade_multi']['thumb'] thumb_path = output_dir / url_before.split('?')[0] diff --git a/lidar_pipeline/tests/test_mapserve.py b/lidar_pipeline/tests/test_mapserve.py index 41a99cc..5a3bd62 100644 --- a/lidar_pipeline/tests/test_mapserve.py +++ b/lidar_pipeline/tests/test_mapserve.py @@ -1,4 +1,4 @@ -"""Tests du serveur de tuiles XYZ et de sa découverte (TileJSON, WMTS, JOSM).""" +"""Tests for the XYZ tile server and its discovery (TileJSON, WMTS, JOSM).""" import asyncio import json @@ -8,19 +8,19 @@ from lidar_pipeline.tests.test_tiles import _make_dalle, _tile_of_cell class _FakeRequest: - """Requête minimale : seules l'origine et les en-têtes de proxy comptent.""" + """Minimal request: only the origin and the proxy headers matter.""" - def __init__(self, host="carte.local:8975", proto=None, scheme="http"): + def __init__(self, host="map.local:8975", proto=None, scheme="http"): self.headers = {"host": host} if proto: self.headers["x-forwarded-proto"] = proto - self.url = type("U", (), {"scheme": scheme, "hostname": "carte.local", + self.url = type("U", (), {"scheme": scheme, "hostname": "map.local", "port": 8975})() def _setup(tmp_path, monkeypatch, layers=("aspect", "slope"), panel=None): - """Dalle factice ; panel=None lève la restriction PANEL_VIZ pour que les - couches de test (aspect, slope) soient servies.""" + """Fake source tile; panel=None lifts the PANEL_VIZ restriction so that + the test layers (aspect, slope) are served.""" import lidar_pipeline.mapserve as mapserve from lidar_pipeline import index, tiles monkeypatch.setattr(index, "PANEL_VIZ", panel) @@ -31,7 +31,7 @@ def _setup(tmp_path, monkeypatch, layers=("aspect", "slope"), panel=None): def test_tile_png_is_256_rgba(tmp_path, monkeypatch): - """La tuile canonique est un PNG RGBA de 256 px, avec en-têtes CORS.""" + """The canonical tile is a 256 px RGBA PNG, with CORS headers.""" import io from PIL import Image mapserve = _setup(tmp_path, monkeypatch) @@ -46,7 +46,7 @@ def test_tile_png_is_256_rgba(tmp_path, monkeypatch): def test_tile_2x_is_512_webp(tmp_path, monkeypatch): - """Le palier @2x sert du WebP 512 px (interface interne).""" + """The @2x level serves 512 px WebP.""" import io from PIL import Image mapserve = _setup(tmp_path, monkeypatch) @@ -58,7 +58,7 @@ def test_tile_2x_is_512_webp(tmp_path, monkeypatch): def test_tile_outside_data_is_transparent(tmp_path, monkeypatch): - """Hors données : tuile transparente (et pas une erreur) pour JOSM/iD.""" + """Outside the data: transparent tile (not an error) for JOSM/iD.""" import io from PIL import Image mapserve = _setup(tmp_path, monkeypatch) @@ -69,7 +69,7 @@ def test_tile_outside_data_is_transparent(tmp_path, monkeypatch): def test_tile_cache_headers(tmp_path, monkeypatch): - """URL versionnée → cache immuable ; sans version → revalidation courte.""" + """Versioned URL → immutable cache; no version → short revalidation.""" mapserve = _setup(tmp_path, monkeypatch) z = 15 x, y = _tile_of_cell(1054, 6882, z) @@ -80,30 +80,30 @@ def test_tile_cache_headers(tmp_path, monkeypatch): def test_tile_rejects_bad_input(tmp_path, monkeypatch): - """Nom de tuile, couche, zoom et indices sont validés (404).""" + """Tile name, layer, zoom and indices are validated (404).""" from fastapi import HTTPException import pytest mapserve = _setup(tmp_path, monkeypatch) z = 15 x, y = _tile_of_cell(1054, 6882, z) - for layer, zz, xx, name in (("aspect", z, x, "abc.png"), # nom invalide - ("aspect", z, x, f"{y}.tif"), # format refusé - ("inconnue", z, x, f"{y}.png"), # couche absente - ("../etc", z, x, f"{y}.png"), # traversée - ("aspect", 2, x, f"{y}.png"), # zoom trop bas - ("aspect", 25, x, f"{y}.png"), # zoom trop haut - ("aspect", z, 10 ** 9, f"{y}.png")): # hors grille + for layer, zz, xx, name in (("aspect", z, x, "abc.png"), # invalid name + ("aspect", z, x, f"{y}.tif"), # rejected format + ("unknown", z, x, f"{y}.png"), # missing layer + ("../etc", z, x, f"{y}.png"), # path traversal + ("aspect", 2, x, f"{y}.png"), # zoom too low + ("aspect", 25, x, f"{y}.png"), # zoom too high + ("aspect", z, 10 ** 9, f"{y}.png")): # outside the grid with pytest.raises(HTTPException) as e: asyncio.run(mapserve.tile(layer, zz, xx, name)) assert e.value.status_code == 404 def test_tile_upstream_fallback(tmp_path, monkeypatch): - """Tuile absente localement : rapatriée depuis LIDAR_MAPS_URL et mise en cache.""" + """Tile missing locally: fetched from LIDAR_MAPS_URL and cached.""" import lidar_pipeline.mapserve as mapserve from lidar_pipeline import tiles _setup(tmp_path, monkeypatch) - monkeypatch.setattr(mapserve, "MAPS_URL", "http://amont:8975") + monkeypatch.setattr(mapserve, "MAPS_URL", "http://upstream:8975") monkeypatch.setattr(mapserve, "_UPSTREAM", {"fails": 0, "until": 0.0}) called = {} @@ -112,7 +112,7 @@ def test_tile_upstream_fallback(tmp_path, monkeypatch): return b"\x89PNG\r\n\x1a\nFAKE" monkeypatch.setattr(mapserve, "_fetch_upstream", fake_fetch) - # Zone sans donnée locale → le rendu local échoue, l'amont prend le relais + # Area without local data → local render fails, upstream takes over resp = asyncio.run(mapserve.tile("aspect", 15, 1, "1.png")) assert called["path"] == "tiles/aspect/15/1/1.png" assert resp.body == b"\x89PNG\r\n\x1a\nFAKE" @@ -120,7 +120,7 @@ def test_tile_upstream_fallback(tmp_path, monkeypatch): def test_upstream_breaker(monkeypatch): - """3 échecs consécutifs suspendent les tentatives amont ; un succès réarme.""" + """3 consecutive failures suspend upstream attempts; a success resets.""" import lidar_pipeline.mapserve as mapserve monkeypatch.setattr(mapserve, "_UPSTREAM", {"fails": 0, "until": 0.0}) for _ in range(2): @@ -133,19 +133,19 @@ def test_upstream_breaker(monkeypatch): def test_tilejson_is_valid(tmp_path, monkeypatch): - """TileJSON 3.0.0 : champs obligatoires, URL XYZ absolue, attribution.""" + """TileJSON 3.0.0: required fields, absolute XYZ URL, attribution.""" mapserve = _setup(tmp_path, monkeypatch) data = json.loads(mapserve.tilejson("aspect", _FakeRequest()).body) assert data["tilejson"] == "3.0.0" assert data["scheme"] == "xyz" - assert data["tiles"] == ["http://carte.local:8975/tiles/aspect/{z}/{x}/{y}.png"] + assert data["tiles"] == ["http://map.local:8975/tiles/aspect/{z}/{x}/{y}.png"] assert data["minzoom"] < data["maxzoom"] <= 19 assert len(data["bounds"]) == 4 and data["bounds"][0] < data["bounds"][2] assert "IGN" in data["attribution"] def test_tilejson_unknown_layer(tmp_path, monkeypatch): - """Couche absente du disque → 404.""" + """Layer missing from disk → 404.""" from fastapi import HTTPException import pytest mapserve = _setup(tmp_path, monkeypatch) @@ -155,7 +155,7 @@ def test_tilejson_unknown_layer(tmp_path, monkeypatch): def test_base_url_honours_proxy(tmp_path, monkeypatch): - """Derrière un proxy TLS, les URL publiées sont en https.""" + """Behind a TLS proxy, published URLs use https.""" mapserve = _setup(tmp_path, monkeypatch) data = json.loads(mapserve.tilejson( "aspect", _FakeRequest(host="lidar.example.fr", proto="https")).body) @@ -163,7 +163,7 @@ def test_base_url_honours_proxy(tmp_path, monkeypatch): def test_josm_imagery_xml(tmp_path, monkeypatch): - """Fichier d'imagerie JOSM : une entrée TMS par couche, URL en {zoom}/{x}/{y}.""" + """JOSM imagery file: one TMS entry per layer, URL as {zoom}/{x}/{y}.""" mapserve = _setup(tmp_path, monkeypatch) xml = mapserve.josm_imagery(_FakeRequest()).body.decode("utf-8") root = ET.fromstring(xml) @@ -179,7 +179,7 @@ def test_josm_imagery_xml(tmp_path, monkeypatch): def test_wmts_capabilities(tmp_path, monkeypatch): - """Capacités WMTS : couches, grille GoogleMapsCompatible, gabarit REST.""" + """WMTS capabilities: layers, GoogleMapsCompatible grid, REST template.""" mapserve = _setup(tmp_path, monkeypatch) xml = mapserve.wmts_capabilities(_FakeRequest()).body.decode("utf-8") root = ET.fromstring(xml) @@ -188,8 +188,8 @@ def test_wmts_capabilities(tmp_path, monkeypatch): ids = [l.find("ows:Identifier", ns).text for l in root.findall(".//w:Layer", ns)] assert set(ids) == {"aspect", "slope"} - # `.//w:TileMatrixSet` attraperait d'abord le renvoi de - # TileMatrixSetLink (simple texte) : on vise la définition. + # `.//w:TileMatrixSet` would first match the reference inside + # TileMatrixSetLink (plain text): target the definition. tms = root.find("w:Contents/w:TileMatrixSet", ns) assert tms.find("ows:Identifier", ns).text == "GoogleMapsCompatible" levels = [m.find("ows:Identifier", ns).text @@ -200,24 +200,24 @@ def test_wmts_capabilities(tmp_path, monkeypatch): def test_map_meta(tmp_path, monkeypatch): - """/api/map/meta décrit les couches et le contrat de tuilage de l'interface.""" + """/api/map/meta describes the layers and the interface tiling contract.""" mapserve = _setup(tmp_path, monkeypatch, layers=("relief_oriente", "aspect", "slope")) meta = mapserve.map_meta() assert {l["key"] for l in meta["layers"]} == {"relief_oriente", "aspect", "slope"} assert all(l["label"] for l in meta["layers"]) assert meta["tile_url"] == "tiles/{layer}/{z}/{x}/{y}@2x.avif" - assert meta["even_levels"] is False # pyramide complète générée d'avance + assert meta["even_levels"] is False # complete pyramid generated ahead of time assert meta["tile_size"] == 512 and meta["zoom_offset"] == -1 assert meta["max_native_zoom"] == 19 assert meta["bounds"] and meta["stamp"] > 0 assert meta["default_main"] == "relief_oriente" - assert meta["precision_layer"] is None # densité absente de la fixture + assert meta["precision_layer"] is None # density missing from the fixture assert meta["default_mode"] == "relief" def test_only_panel_layers_are_served(tmp_path, monkeypatch): - """Seules les couches de PANEL_VIZ sont affichées et servies ; la - génération depuis la carte ne produit qu'elles.""" + """Only PANEL_VIZ layers are displayed and served; generation from the + map produces only them.""" from fastapi import HTTPException mapserve = _setup(tmp_path, monkeypatch, layers=("relief_oriente", "aspect", "slope"), panel=("relief_oriente",)) @@ -229,7 +229,7 @@ def test_only_panel_layers_are_served(tmp_path, monkeypatch): def test_map_tile_info(tmp_path, monkeypatch): - """/api/map/tile identifie la dalle sous un point et lit ses métadonnées.""" + """/api/map/tile identifies the tile under a point and reads its metadata.""" mapserve = _setup(tmp_path, monkeypatch) dtm = tmp_path / "DTM" dtm.mkdir(parents=True, exist_ok=True) @@ -242,12 +242,12 @@ def test_map_tile_info(tmp_path, monkeypatch): assert (data["col"], data["row"]) == (1054, 6882) assert data["method"] == "ign" assert data["layers"] == ["aspect", "slope"] - # Point hors zone : réponse explicite, sans erreur + # Point outside the area: explicit answer, no error assert mapserve.map_tile_info(lat=45.0, lng=1.0)["found"] is False def test_map_tile_includes_quality(tmp_path, monkeypatch): - """/api/map/tile joint la qualité (densité, dates d'acquisition) si connue.""" + """/api/map/tile includes quality (density, acquisition dates) when known.""" mapserve = _setup(tmp_path, monkeypatch, layers=("relief_oriente",)) from lidar_pipeline.quality import write_quality, QUALITY_VERSION name = "LHD_FXX_1054_6882_PTS_LAMB93_IGN69" @@ -262,15 +262,16 @@ def test_map_tile_includes_quality(tmp_path, monkeypatch): def test_map_tile_quality_absent_is_none(tmp_path, monkeypatch): - """Sans sidecar qualité, la clé vaut None (pas d'erreur).""" + """Without a quality sidecar, the key is None (no error).""" mapserve = _setup(tmp_path, monkeypatch, layers=("relief_oriente",)) lat, lon = _center() assert mapserve.map_tile_info(lat=lat, lng=lon)["quality"] is None def test_map_tile_quality_uses_real_basename(tmp_path, monkeypatch): - """La qualité lue est celle du nom réel de la dalle rendue (best["basename"]), - pas celle du nom nominal calculé depuis col/row — ils peuvent différer.""" + """Quality is read under the real name of the rendered tile + (best["basename"]), not the nominal name computed from col/row — they + may differ.""" import lidar_pipeline.mapserve as mapserve from lidar_pipeline import index as index_mod from lidar_pipeline.quality import write_quality, QUALITY_VERSION @@ -293,7 +294,7 @@ def test_map_tile_quality_uses_real_basename(tmp_path, monkeypatch): def test_healthz_and_assets(tmp_path, monkeypatch): - """Sonde de santé et assets de l'interface (revalidés, jamais immuables).""" + """Health probe and interface assets (revalidated, never immutable).""" from fastapi import HTTPException import pytest mapserve = _setup(tmp_path, monkeypatch) @@ -301,15 +302,15 @@ def test_healthz_and_assets(tmp_path, monkeypatch): resp = mapserve.assets("app.js") assert resp.headers["Cache-Control"] == "no-cache, must-revalidate" with pytest.raises(HTTPException): - mapserve.assets("introuvable.js") + mapserve.assets("missing.js") def test_ui_main_layer_and_precision_modes(): - """Une couche d'affichage principal et la précision : relief seul, - précision seule, ou comparaison de part et d'autre d'une barre glissante. + """A main display layer and precision: relief only, precision only, or a + comparison on either side of a sliding bar. - Plus de pile réordonnable ni de fusion par couche. Bascule rapide au - clavier (touche P). + No more reorderable stack or per-layer blending. Quick keyboard toggle + (P key). """ from lidar_pipeline.mapui import _MAP_CSS, _MAP_HTML, _MAP_JS for mode in ('data-mode="relief"', 'data-mode="precision"', 'data-mode="compare"'): @@ -318,20 +319,20 @@ def test_ui_main_layer_and_precision_modes(): assert 'id="mainSel"' in _MAP_HTML assert "createPane('lidarStack')" in _MAP_JS assert "e.key === 'p'" in _MAP_JS - # Légende en 16 paliers exacts (échelle log de la densité) + # Legend in exactly 16 steps (log density scale) assert "const PREC_LEVELS = 16;" in _MAP_JS and "repeat(16, 1fr)" in _MAP_CSS - # Pile et fusions supprimées + # Stack and blending removed for gone in ("function moveLayer(", "reorderRelative", "stackBlend", "addEventListener('dragstart'", "blendOptions"): assert gone not in _MAP_JS, gone - assert "Haut de pile" not in _MAP_HTML - # Lien partagé : principale, mode:opacité, fond + assert "Haut de pile" not in _MAP_HTML and "Top of stack" not in _MAP_HTML + # Shared link: main layer, mode, base map assert "'&M=' + STATE.main" in _MAP_JS assert "'&P=' + STATE.mode" in _MAP_JS def test_ui_relief_intensity(): - """Curseur d'intensité (contraste) du relief : mémorisé, partagé dans le - lien (&I=, écrit seulement si ≠ 1), masqué en mode précision.""" + """Relief intensity (contrast) slider: remembered, shared in the link + (&I=, written only if ≠ 1), hidden in precision mode.""" from lidar_pipeline.mapui import _MAP_HTML, _MAP_JS assert 'id="reliefIntensity"' in _MAP_HTML assert 'min="0.5"' in _MAP_HTML and 'max="2"' in _MAP_HTML and 'step="0.1"' in _MAP_HTML @@ -341,12 +342,11 @@ def test_ui_relief_intensity(): def test_map_ui_tile_load_indicator_and_selection_pane(): - """Chargement : compteur de tuiles restantes + contour de dalle visible. + """Loading: remaining-tiles counter + visible tile outline. - Le compteur lit l'état réel des tuiles (une tuile retirée en cours de - chargement n'émet aucun événement de fin). Le contour de sélection vit - dans un panneau au-dessus de la pile LiDAR (z-index 400), sinon les - tuiles le masquent. + The counter reads the real tile state (a tile removed while loading + emits no end event). The selection outline lives in a pane above the + LiDAR stack (z-index 400 and above), otherwise the tiles hide it. """ from lidar_pipeline.mapui import _MAP_CSS, _MAP_HTML, _MAP_JS assert 'id="tileload"' in _MAP_HTML and 'id="tileloadText"' in _MAP_HTML @@ -358,8 +358,8 @@ def test_map_ui_tile_load_indicator_and_selection_pane(): def test_ui_tile_tab_replaces_popup_and_details_view(): - """Un clic sur la carte sélectionne la dalle (contour) et remplit - l'onglet Dalle : plus de bulle Leaflet ni de vue « Détails » séparée.""" + """A click on the map selects the tile (outline) and fills the Tile tab: + no more Leaflet popup or separate "Details" view.""" from lidar_pipeline.mapui import _MAP_CSS, _MAP_HTML, _MAP_JS assert 'id="tilecard"' not in _MAP_HTML assert 'data-tab="tile"' in _MAP_HTML @@ -372,20 +372,20 @@ def test_ui_tile_tab_replaces_popup_and_details_view(): assert "leaflet-popup" not in _MAP_CSS and "tile-pop" not in _MAP_CSS for fn in ("function selectTile(", "function clearTileSelection(", "function renderTabTile("): assert fn in _MAP_JS, fn - # Pas de sélection pendant le déplacement du cadre d'export ni un tracé + # No selection while dragging the export frame or drawing an area click = _MAP_JS[_MAP_JS.index("map.on('click'"):] assert "genDrawing" in click[:400] and "PRINT.dragging" in click[:400] - # Re-clic sur la dalle déjà sélectionnée : désélection plutôt que bascule + # Clicking the selected tile again: deselect rather than toggle assert "clearTileSelection();" in click[click.index("SELECTED_TILE"):click.index("});")] def test_defaults_roundtrip(tmp_path, monkeypatch): - """L'affichage réglé depuis la carte devient la configuration servie à tous.""" + """The display set from the map becomes the configuration served to everyone.""" import lidar_pipeline.mapserve as mapserve _setup(tmp_path, monkeypatch, layers=("relief_oriente", "aspect", "densite_sol")) monkeypatch.setattr(mapserve, "DEFAULTS_FILE", tmp_path / ".map-defaults.json") - # Sans enregistrement : réglages du registre (index.py) + # Nothing saved: registry settings (index.py) meta = mapserve.map_meta() assert meta["defaults_saved"] is False assert meta["default_main"] == "relief_oriente" @@ -402,18 +402,18 @@ def test_defaults_roundtrip(tmp_path, monkeypatch): assert meta["default_main"] == "aspect" assert meta["default_mode"] == "compare" assert meta["default_base"] == {"on": True, "opacity": 0.4, "dark": False} - # Persisté sur disque : survit au redémarrage du conteneur + # Persisted on disk: survives a container restart assert (tmp_path / ".map-defaults.json").is_file() assert mapserve.get_defaults()["defaults"]["mode"] == "compare" - # Retrait : retour aux réglages du registre + # Removal: back to the registry settings assert mapserve.clear_defaults()["supprimé"] is True assert mapserve.map_meta()["defaults_saved"] is False def test_defaults_legacy_stack_file_falls_back(tmp_path, monkeypatch): - """Fichier de l'ancienne pile (order/on/blend) ou couche disparue : - couche principale du registre, mode relief ; le fond est conservé.""" + """File from the former stack (order/on/blend) or vanished layer: + registry main layer, relief mode; the base map is kept.""" import json import lidar_pipeline.mapserve as mapserve _setup(tmp_path, monkeypatch, layers=("relief_oriente",)) @@ -427,30 +427,31 @@ def test_defaults_legacy_stack_file_falls_back(tmp_path, monkeypatch): assert meta["default_main"] == "relief_oriente" assert meta["default_mode"] == "relief" assert meta["default_base"]["opacity"] == 0.5 - defaults.write_text(json.dumps({"main": "aspect", "mode": "vaudou"}), encoding="utf-8") + defaults.write_text(json.dumps({"main": "aspect", "mode": "voodoo"}), encoding="utf-8") meta = mapserve.map_meta() assert meta["default_main"] == "relief_oriente" and meta["default_mode"] == "relief" def test_defaults_sanitised(tmp_path, monkeypatch): - """Couche inconnue ou précision refusée comme principale, mode validé, opacités bornées.""" + """Unknown layer or precision rejected as main layer, mode validated, opacities clamped.""" import lidar_pipeline.mapserve as mapserve _setup(tmp_path, monkeypatch, layers=("relief_oriente", "densite_sol")) monkeypatch.setattr(mapserve, "DEFAULTS_FILE", tmp_path / ".map-defaults.json") data = mapserve.set_defaults(mapserve.DefaultsRequest( - main="inexistante", mode="vaudou", + main="nonexistent", mode="voodoo", base={"opacity": -3}))["defaults"] assert data["main"] is None assert data["mode"] == "relief" assert "precision_opacity" not in data - assert data["base"]["opacity"] == 0.0 # borné à 0 + assert data["base"]["opacity"] == 0.0 # clamped to 0 data = mapserve.set_defaults(mapserve.DefaultsRequest(main="densite_sol"))["defaults"] - assert data["main"] is None # la précision n'est pas une principale + assert data["main"] is None # precision is not a main layer def test_defaults_dark_none_is_not_a_choice(tmp_path, monkeypatch): - """base.dark omis/None n'est pas un choix : il reste None (le fond suit le - thème côté carte), distinct d'un choix explicite (True/False persistent).""" + """base.dark omitted/None is not a choice: it stays None (the base map + follows the theme on the map side), unlike an explicit choice (True/False + persist).""" import lidar_pipeline.mapserve as mapserve _setup(tmp_path, monkeypatch, layers=("relief_oriente",)) monkeypatch.setattr(mapserve, "DEFAULTS_FILE", tmp_path / ".map-defaults.json") @@ -462,7 +463,7 @@ def test_defaults_dark_none_is_not_a_choice(tmp_path, monkeypatch): assert saved["v"] == 3 assert mapserve.map_meta()["default_base"]["dark"] is None - # Choix explicite : conservé tel quel + # Explicit choice: kept as is req = mapserve.DefaultsRequest(main="relief_oriente", base={"on": True, "opacity": 0.4, "dark": True}) mapserve.set_defaults(req) @@ -470,8 +471,8 @@ def test_defaults_dark_none_is_not_a_choice(tmp_path, monkeypatch): def test_defaults_legacy_dark_true_becomes_unset(tmp_path, monkeypatch): - """Fichier d'avant v3 (ex-webapp, base.dark:true systématique) : servi avec - dark None (« non choisi »), jamais imposé comme choix de l'utilisateur.""" + """Pre-v3 file (former webapp, base.dark:true always): served with dark + None ("not chosen"), never imposed as the user's choice.""" import json import lidar_pipeline.mapserve as mapserve _setup(tmp_path, monkeypatch, layers=("relief_oriente",)) @@ -486,21 +487,21 @@ def test_defaults_legacy_dark_true_becomes_unset(tmp_path, monkeypatch): def test_view_modes_compare_and_legacy_both(tmp_path, monkeypatch): - """« both » (ancien mode « les deux ») disparaît de VIEW_MODES au profit de - « compare » ; un fichier ou une requête l'envoyant encore est lu comme - « relief » (precision_opacity accepté pour compatibilité, mais ignoré).""" + """The former "both" mode is gone from VIEW_MODES in favour of + "compare"; a file or request still sending it is read as "relief" + (precision_opacity accepted for compatibility, but ignored).""" import lidar_pipeline.mapserve as mapserve _setup(tmp_path, monkeypatch, layers=("relief_oriente", "densite_sol")) from lidar_pipeline.index import VIEW_MODES assert VIEW_MODES == ('relief', 'precision', 'compare') monkeypatch.setattr(mapserve, "DEFAULTS_FILE", tmp_path / ".map-defaults.json") - # Ancien défaut figé « both » : lu comme relief + # Old frozen "both" default: read as relief mapserve.DEFAULTS_FILE.parent.mkdir(parents=True, exist_ok=True) mapserve.DEFAULTS_FILE.write_text('{"mode": "both", "precision_opacity": 0.6}', encoding="utf-8") meta = mapserve.map_meta() assert meta["default_mode"] == "relief" assert "default_precision_opacity" not in meta - # Ancienne page encore ouverte : precision_opacity accepté, ignoré + # Old page still open: precision_opacity accepted, ignored req = mapserve.DefaultsRequest(main=None, mode="both", precision_opacity=0.4, base={}) assert mapserve._sanitize_defaults(req)["mode"] == "relief" assert "precision_opacity" not in mapserve._sanitize_defaults(req) @@ -509,31 +510,31 @@ def test_view_modes_compare_and_legacy_both(tmp_path, monkeypatch): def test_meta_serves_reading_text(tmp_path, monkeypatch): - """/api/map/meta sert le texte « Comment lire » de chaque couche.""" + """/api/map/meta serves the "How to read" text of each layer.""" import lidar_pipeline.mapserve as mapserve _setup(tmp_path, monkeypatch, layers=("relief_oriente", "densite_sol")) layers = {l["key"]: l for l in mapserve.map_meta()["layers"]} reading = layers["relief_oriente"]["reading"] assert isinstance(reading, list) and len(reading) >= 3 text = " ".join(reading) - assert "aucun point sol" in text and "1,5" in text and "1 m" in text + assert "no ground point" in text and "1.5" in text and "1 m" in text assert layers["densite_sol"]["reading"] def test_ui_reading_legend_from_meta(): - """Légende « Comment lire » : phrases de META.layers[].reading, jamais - codées en dur dans l'interface (VIZ_LEGENDS reste la seule source).""" + """The "How to read" legend: sentences from META.layers[].reading, never + hard-coded in the interface (VIZ_LEGENDS stays the single source).""" from lidar_pipeline.mapui import _MAP_HTML, _MAP_JS assert 'id="readingBlock"' in _MAP_HTML and 'id="readingList"' in _MAP_HTML - assert " {\n toast('Serveur de tuiles injoignable."):] + catch_branch = _MAP_JS[_MAP_JS.index(".catch(() => {\n toast('Tile server unreachable."):] assert "BOOTSTRAPPING = false;" in catch_branch[:400] def test_ui_tile_selection_does_not_affect_print_frame(): - """La sélection d'une dalle vit à part des onglets : elle ne referme ni - ne rouvre le cadre d'export (contrairement à l'ancienne fiche « Détails », - qui masquait les autres onglets par-dessus la carte).""" + """Tile selection lives apart from the tabs: it neither closes nor reopens + the export frame (unlike the former "Details" card, which hid the other + tabs on top of the map).""" from lidar_pipeline.mapui import _MAP_JS select_fn = _MAP_JS[_MAP_JS.index("function selectTile("):] assert "printSetOpen" not in select_fn[:select_fn.index("function clearTileSelection(")] @@ -630,10 +632,10 @@ def test_ui_tile_selection_does_not_affect_print_frame(): def test_ui_colors_are_tokenised(): - """Plus de couleur en dur pour le contour de sélection, le marqueur GPS et - le journal de génération (AGENTS.md « aucune couleur en dur dans les - composants ») ; #1b1b1b reste en dur sur la poignée d'export (contraste - fixe voulu sur --print), documenté en commentaire.""" + """No more hard-coded colour for the selection outline, the GPS marker and + the generation log (AGENTS.md "no hard-coded colour in components"); + #1b1b1b stays hard-coded on the export handle (fixed contrast wanted on + --print), documented in a comment.""" from lidar_pipeline.mapui import _MAP_CSS, _MAP_JS assert "color: cssVar('--tile-sel')" in _MAP_JS assert "'#ffd24a'" not in _MAP_JS @@ -644,13 +646,13 @@ def test_ui_colors_are_tokenised(): gen_log = _MAP_CSS[_MAP_CSS.index(".gen-log {"):] assert "rgba(0,0,0,0.35)" not in gen_log[:250] assert "var(--surface-2)" in gen_log[:250] and "var(--text)" in gen_log[:250] - assert "#1b1b1b" in _MAP_CSS # volontaire, commenté juste au-dessus + assert "#1b1b1b" in _MAP_CSS # intentional, commented just above def test_ui_guards_corrupt_local_storage(): - """Une valeur corrompue dans lidar-panel/lidar-print (autre appli sur la - même origine, quota dépassé en écriture…) ne casse pas l'interface : - whitelist de type/valeur plutôt qu'un usage direct de lsGet.""" + """A corrupt value in lidar-panel/lidar-print (another app on the same + origin, quota exceeded while writing…) does not break the interface: + type/value whitelist rather than direct use of lsGet.""" from lidar_pipeline.mapui import _MAP_JS assert "function _sanitizedPanelLS()" in _MAP_JS panel_ls = _MAP_JS[_MAP_JS.index("function _sanitizedPanelLS("):] @@ -662,16 +664,16 @@ def test_ui_guards_corrupt_local_storage(): def test_ui_uses_standard_tilelayer(): - """L'interface s'appuie sur le LOD natif de Leaflet, pas sur un palier maison.""" + """The interface relies on Leaflet's native LOD, not on a home-made level scheme.""" from lidar_pipeline.mapui import _MAP_JS, render_html, ui_version - assert "L.TileLayer.extend(" in _MAP_JS # TileLayer Leaflet, LOD natif + assert "L.TileLayer.extend(" in _MAP_JS # Leaflet TileLayer, native LOD assert "tileSize: META.tile_size" in _MAP_JS assert "zoomOffset: META.zoom_offset" in _MAP_JS assert "maxNativeZoom: META.max_native_zoom" in _MAP_JS - # Le niveau natif impair (19 = 0,2 m/px) est demandé tel quel, jamais - # replié sur le pair inférieur (affichage plafonné à 0,4 m/px). + # The odd native level (19 = 0.2 m/px) is requested as is, never folded + # onto the even level below (display capped at 0.4 m/px). assert "z % 2 && (maxN === undefined || z < maxN)" in _MAP_JS - # Plus aucune mécanique de l'ancienne carte + # None of the old map machinery left for banned in ("quadMatrix3d", "FULL_CAP", "ovTick", "layoutTiles"): assert banned not in _MAP_JS html = render_html() @@ -679,7 +681,7 @@ def test_ui_uses_standard_tilelayer(): def test_write_map_assets(tmp_path): - """Les assets écrits portent la version et embarquent Leaflet vendorisé.""" + """Written assets carry the version and embed the vendored Leaflet.""" from lidar_pipeline.mapui import _MAP_JS, ui_version, write_map_assets write_map_assets(tmp_path / "ui") js = (tmp_path / "ui" / "app.js").read_text(encoding="utf-8") @@ -689,7 +691,7 @@ def test_write_map_assets(tmp_path): def test_warm_endpoint(tmp_path, monkeypatch): - """/api/map/warm lance le pré-calcul en tâche de fond puis rend compte.""" + """/api/map/warm starts the pre-render in the background, then reports.""" import time mapserve = _setup(tmp_path, monkeypatch) monkeypatch.setattr(mapserve, "_warm", {"running": False, "done": None, @@ -704,11 +706,11 @@ def test_warm_endpoint(tmp_path, monkeypatch): def test_tile_locks_are_refcounted(tmp_path, monkeypatch): - """Verrou par tuile : partagé pendant le rendu, retiré une fois libéré. + """Per-tile lock: shared during rendering, removed once released. - Sans compteur, le registre grossit sans fin (des millions de tuiles) ou un - verrou disparaît alors qu'un autre fil l'attend — deux rendus concurrents - de la même tuile. + Without a counter, the registry grows forever (millions of tiles) or a + lock disappears while another thread waits on it — two concurrent + renders of the same tile. """ mapserve = _setup(tmp_path, monkeypatch) key = ("aspect", 15, 1, 1, 1, "png") @@ -722,7 +724,7 @@ def test_tile_locks_are_refcounted(tmp_path, monkeypatch): def test_concurrent_requests_render_once(tmp_path, monkeypatch): - """Deux requêtes simultanées sur la même tuile ne la rendent qu'une fois.""" + """Two simultaneous requests for the same tile render it only once.""" import threading import lidar_pipeline.mapserve as mapserve _setup(tmp_path, monkeypatch) @@ -746,18 +748,18 @@ def test_concurrent_requests_render_once(tmp_path, monkeypatch): for t in threads: t.join() assert all(r == results[0] for r in results) - # Les appels suivants lisent le cache disque : un seul rendu effectif - assert len(calls) == 4 # chaque requête interroge get_tile… - assert mapserve._locks == {} # …mais sérialisées, et les verrous libérés + # Later calls read the disk cache: a single effective render + assert len(calls) == 4 # every request calls get_tile… + assert mapserve._locks == {} # …but serialized, and the locks released def test_tile_bytes_survives_render_error(tmp_path, monkeypatch): - """Un rendu qui échoue rend une tuile vide sans laisser de verrou fuité.""" + """A failing render returns an empty tile without leaking a lock.""" import lidar_pipeline.mapserve as mapserve _setup(tmp_path, monkeypatch) def boom(*a, **k): - raise RuntimeError("source corrompue") + raise RuntimeError("corrupt source") monkeypatch.setattr(mapserve.tiles_mod, "get_tile", boom) z = 15 @@ -767,16 +769,17 @@ def test_tile_bytes_survives_render_error(tmp_path, monkeypatch): def test_render_concurrency_is_capped(tmp_path, monkeypatch): - """Le plafond de rendus simultanés est tenu (petit serveur protégé). + """The concurrent-render cap holds (small server protected). - Sans lui, autant de rendus que de requêtes en vol : chacun décode une dalle - de plusieurs dizaines de Mo — mémoire et CPU d'un Raspberry Pi saturés. + Without it, as many renders as in-flight requests: each one decodes a + source tile of several tens of MB — a Raspberry Pi's memory and CPU are + saturated. """ import threading import lidar_pipeline.mapserve as mapserve _setup(tmp_path, monkeypatch) - # Plafond volontairement bas pour le test + # Deliberately low cap for the test monkeypatch.setattr(mapserve, "_render_sem", threading.Semaphore(2)) state = {"now": 0, "peak": 0} guard = threading.Lock() @@ -796,7 +799,7 @@ def test_render_concurrency_is_capped(tmp_path, monkeypatch): monkeypatch.setattr(mapserve.tiles_mod, "get_tile", slow) z = 15 x, y = _tile_of_cell(1054, 6882, z) - # Tuiles DIFFÉRENTES : le verrou par tuile ne masque pas le sémaphore + # DIFFERENT tiles: the per-tile lock does not hide the semaphore threads = [threading.Thread(target=mapserve._tile_bytes, args=("aspect", z, x + i, y, 1, "png")) for i in range(8)] @@ -809,12 +812,12 @@ def test_render_concurrency_is_capped(tmp_path, monkeypatch): def test_worker_limits_are_configurable(monkeypatch): - """Les plafonds viennent de l'environnement, avec un défaut modeste.""" + """The caps come from the environment, with a modest default.""" import importlib import lidar_pipeline.mapserve as mapserve import lidar_pipeline.tiles as tiles - # Défauts : 2 rendus, 2 téléchargements — taillés pour un petit serveur + # Defaults: 2 renders, 2 downloads — sized for a small server assert mapserve.TILE_WORKERS == 2 assert tiles.FETCH_WORKERS == 2 @@ -825,7 +828,7 @@ def test_worker_limits_are_configurable(monkeypatch): importlib.reload(mapserve) assert mapserve.TILE_WORKERS == 6 assert tiles.FETCH_WORKERS == 3 - # Valeur absurde : jamais zéro fil (blocage complet du service) + # Absurd value: never zero threads (would block the service entirely) monkeypatch.setenv("LIDAR_TILE_WORKERS", "0") importlib.reload(mapserve) assert mapserve.TILE_WORKERS == 1 @@ -846,9 +849,9 @@ def _reset_bg(mapserve): def test_tile_cache_only_never_renders(tmp_path, monkeypatch): - """Mode cache seule : tuile manquante = transparente non mémorisable.""" + """Cache-only mode: missing tile = transparent, not cacheable.""" from lidar_pipeline import tiles as _t - monkeypatch.setattr(_t, "TILE_EVEN_LEVELS", False) # règle historique : tout est stocké + monkeypatch.setattr(_t, "TILE_EVEN_LEVELS", False) # legacy rule: everything is stored monkeypatch.setattr(_t, "TILE_CACHE_MAX_Z", 99) mapserve = _setup(tmp_path, monkeypatch, layers=("slope",)) from lidar_pipeline import tiles @@ -860,7 +863,7 @@ def test_tile_cache_only_never_renders(tmp_path, monkeypatch): assert resp.headers["X-Tile-Empty"] == "1" assert resp.headers["Cache-Control"] == "no-store" assert not tiles.tile_cache_path(tmp_path, "slope", z, x, y).exists() - # Une fois rendue par ailleurs : servie depuis le cache, mémorisable + # Once rendered elsewhere: served from the cache, cacheable tiles.get_tile(tmp_path, "slope", z, x, y) resp = asyncio.run(mapserve.tile("slope", z, x, f"{y}.png", v="s")) assert resp.headers["X-Tile-Empty"] == "0" @@ -869,7 +872,7 @@ def test_tile_cache_only_never_renders(tmp_path, monkeypatch): def test_background_scan_detects_and_fills(tmp_path, monkeypatch): - """La maintenance détecte les dalles, remplit la pyramide, puis se tait.""" + """The maintenance detects source tiles, fills the pyramid, then goes quiet.""" import lidar_pipeline.mapserve as mapserve from lidar_pipeline import tiles _make_dalle(tmp_path, 1054, 6882, ["slope"]) @@ -880,7 +883,7 @@ def test_background_scan_detects_and_fills(tmp_path, monkeypatch): monkeypatch.setenv("LIDAR_TILE_BACKGROUND_PAUSE", "0") _reset_bg(mapserve) try: - # Premier scan : tout est nouveau, bas niveaux en tête de file + # First scan: everything is new, low levels at the head of the queue assert mapserve.background_scan(tmp_path) > 0 zs = [t[1] for t in mapserve._bg["queue"]] assert zs == sorted(zs) and max(zs) <= 14 @@ -893,9 +896,9 @@ def test_background_scan_detects_and_fills(tmp_path, monkeypatch): x, y = _tile_of_cell(1054, 6882, 14) assert tiles.tile_cache_path( tmp_path, "slope", 14, x, y, 1, "png").exists() - # Rien n'a changé : plus aucun ajout + # Nothing changed: no more additions assert mapserve.background_scan(tmp_path) == 0 - # Une dalle nouvelle (worker) : sa pyramide repart seule en file + # A new source tile (worker): its pyramid alone is queued again _make_dalle(tmp_path, 1055, 6882, ["slope"]) assert mapserve.background_scan(tmp_path) > 0 finally: @@ -903,7 +906,7 @@ def test_background_scan_detects_and_fills(tmp_path, monkeypatch): # --------------------------------------------------------------------------- -# Génération de tuiles (portée de la webapp historique) +# Tile generation (ported from the former webapp) # --------------------------------------------------------------------------- import types @@ -913,7 +916,7 @@ import pytest class _ClientRequest: - """Requête minimale avec IP de connexion (restriction LIDAR_REGEN_CIDR).""" + """Minimal request with a connection IP (LIDAR_REGEN_CIDR restriction).""" def __init__(self, ip, xff=None): self.client = types.SimpleNamespace(host=ip) @@ -935,7 +938,7 @@ def _gen_setup(tmp_path, monkeypatch): def test_bbox_to_cells_covers_1km(): - """Une bbox d'1 km² WGS84 sélectionne la cellule L93 correspondante.""" + """A WGS84 bbox inside a 1 km L93 cell selects that cell.""" import lidar_pipeline.mapserve as mapserve from lidar_pipeline.tiles import _transformer x, y = 1054500, 6881500 @@ -943,12 +946,12 @@ def test_bbox_to_cells_covers_1km(): e, s = _transformer("EPSG:2154", "EPSG:4326").transform(x + 200, y - 200) cells = mapserve.bbox_to_cells(w, s, e, n) assert (1054, 6882) in cells - # Cellule (col, row) : X ∈ [col, col+1] km, Y ∈ [row-1, row] km + # Cell (col, row): X ∈ [col, col+1] km, Y ∈ [row-1, row] km assert all(1053 <= c <= 1055 and 6881 <= r <= 6883 for c, r in cells) def test_preview_bbox_lists_cells_with_corners(tmp_path, monkeypatch): - """Le preview retourne les cellules à traiter avec leurs coins GPS.""" + """The preview returns the cells to process with their GPS corners.""" mapserve = _gen_setup(tmp_path, monkeypatch) from lidar_pipeline.tiles import _transformer x, y = 1054500, 6881500 @@ -966,17 +969,17 @@ def test_preview_bbox_lists_cells_with_corners(tmp_path, monkeypatch): def test_preview_rejects_unknown_viz(tmp_path, monkeypatch): mapserve = _gen_setup(tmp_path, monkeypatch) req = mapserve.PreviewRequest(bbox=[0.0, 44.0, 0.01, 44.01], - viz=["inconnue"]) + viz=["unknown"]) with pytest.raises(HTTPException) as e: mapserve.preview(req) assert e.value.status_code == 400 def test_preview_all_missing_without_laz(tmp_path, monkeypatch): - """Passe globale sans dalle dans input/ : liste vide (rien à compléter). + """Global pass without any tile in input/: empty list (nothing to complete). - L'erreur 400 « aucune tuile à compléter » ne concerne que le lancement - (/api/generate → _resolve_request) : le preview reste informatif. + The 400 "no tile to complete" error only concerns the launch + (/api/generate → _resolve_request): the preview stays informative. """ mapserve = _gen_setup(tmp_path, monkeypatch) (tmp_path / "input").mkdir() @@ -994,7 +997,7 @@ def test_generate_validates_request(tmp_path, monkeypatch): with pytest.raises(HTTPException) as e: mapserve._resolve_request(req) assert e.value.status_code == 400 - # Tri nord → sud (row décroissante) puis col croissante + # Sorted north → south (decreasing row), then increasing col req = mapserve.GenerateRequest(tiles=[[1055, 6882], [1054, 6883], [1054, 6882]]) tiles, _viz = mapserve._resolve_request(req) @@ -1012,7 +1015,7 @@ def test_generate_launches_and_queues(tmp_path, monkeypatch): d = mapserve.generate(req) assert d["demarré"] is True and d["tuiles"] == 1 - # Run en cours : la demande part en file (jamais de coupure du travail) + # Run in progress: the request is queued (running work never interrupted) import threading with mapserve._job_lock: mapserve._job["proc"] = types.SimpleNamespace( @@ -1029,18 +1032,18 @@ def test_generate_launches_and_queues(tmp_path, monkeypatch): def test_status_reports_rights_and_availability(tmp_path, monkeypatch): - """/api/status annonce available (pipeline local) et regen_allowed (IP).""" + """/api/status reports available (local pipeline) and regen_allowed (IP).""" mapserve = _gen_setup(tmp_path, monkeypatch) monkeypatch.setattr(mapserve, "_pipeline_import_cache", {"ok": True}) d = mapserve.generation_status(_ClientRequest("192.168.3.10")) assert d["available"] is True and d["regen_allowed"] is True assert d["running"] is False and d["tiles"] == [] - # Client hors réseau local : génération interdite (boutons masqués) + # Client outside the local network: generation forbidden (tab hidden) d = mapserve.generation_status(_ClientRequest("203.0.113.7")) assert d["regen_allowed"] is False - # X-Forwarded-For honoré seulement depuis un pair de confiance + # X-Forwarded-For honoured only from a trusted peer d = mapserve.generation_status( _ClientRequest("172.25.0.1", xff="203.0.113.7")) assert d["regen_allowed"] is False @@ -1048,14 +1051,14 @@ def test_status_reports_rights_and_availability(tmp_path, monkeypatch): _ClientRequest("172.25.0.1", xff="192.168.3.10")) assert d["regen_allowed"] is True - # Image légère sans pipeline ni LIDAR_GENERATION_URL : indisponible + # Lightweight image without pipeline or LIDAR_GENERATION_URL: unavailable monkeypatch.setattr(mapserve, "_pipeline_import_cache", {"ok": False}) d = mapserve.generation_status(_ClientRequest("192.168.3.10")) assert d["available"] is False def test_status_proxies_to_worker(tmp_path, monkeypatch): - """Webapp légère : /api/status relaie l'état du worker, 503 hors ligne.""" + """Lightweight map: /api/status relays the worker state; 503 = offline.""" mapserve = _gen_setup(tmp_path, monkeypatch) monkeypatch.setattr(mapserve, "GENERATION_URL", "http://worker:8973") monkeypatch.setattr(mapserve, "_pipeline_import_cache", {"ok": False}) @@ -1070,7 +1073,7 @@ def test_status_proxies_to_worker(tmp_path, monkeypatch): assert d["available"] is True and d["regen_allowed"] is True def offline(method, path, payload=None, timeout=30): - raise HTTPException(503, "machine de traitement injoignable") + raise HTTPException(503, "processing machine unreachable") monkeypatch.setattr(mapserve, "_proxy_generation", offline) d = mapserve.generation_status(_ClientRequest("192.168.3.10")) @@ -1078,7 +1081,7 @@ def test_status_proxies_to_worker(tmp_path, monkeypatch): def test_generate_requires_lan(tmp_path, monkeypatch): - """Un client hors LIDAR_REGEN_CIDR ne peut pas lancer de génération.""" + """A client outside LIDAR_REGEN_CIDR cannot start a generation.""" mapserve = _gen_setup(tmp_path, monkeypatch) with pytest.raises(HTTPException) as e: mapserve._require_lan_for_generation(_ClientRequest("203.0.113.7")) @@ -1086,7 +1089,7 @@ def test_generate_requires_lan(tmp_path, monkeypatch): def test_cell_at_point(tmp_path, monkeypatch): - """/api/cell donne la dalle sous un point (sélection manuelle).""" + """/api/cell returns the tile under a point (manual selection).""" mapserve = _gen_setup(tmp_path, monkeypatch) from lidar_pipeline.tiles import _transformer lon, lat = _transformer("EPSG:2154", "EPSG:4326").transform(1054500, 6881500) @@ -1096,7 +1099,7 @@ def test_cell_at_point(tmp_path, monkeypatch): def test_tiles_inventory_endpoint(tmp_path, monkeypatch): - """/api/tiles sert index_tiles.json (machines légères LIDAR_SOURCE_URL).""" + """/api/tiles serves index_tiles.json (lightweight LIDAR_SOURCE_URL machines).""" mapserve = _gen_setup(tmp_path, monkeypatch) payload = {"tiles": [{"col": 1054, "row": 6882, "viz": {"aspect": {"full": "visualisations/x.avif?v=1"}}}], @@ -1105,14 +1108,14 @@ def test_tiles_inventory_endpoint(tmp_path, monkeypatch): __import__("json").dumps(payload), encoding="utf-8") d = mapserve.tiles_inventory() assert d["tiles"] == payload["tiles"] and d["stamp"] > 0 - # ?stamp inchangé → réponse allégée + # Unchanged ?stamp → light response light = mapserve.tiles_inventory(stamp=d["stamp"]) assert light["tiles"] is None def test_generation_always_ign_with_edge_buffer(tmp_path, monkeypatch): - """Classification IGN (sol) et raccord des bords de 100 m imposés, quel - que soit ce que le client envoie.""" + """IGN classification (ground) and 100 m edge stitching are enforced, + whatever the client sends.""" mapserve = _gen_setup(tmp_path, monkeypatch) cmd = mapserve._build_command([(1054, 6882)]) i = cmd.index("--edge-buffer") @@ -1124,42 +1127,42 @@ def test_generation_always_ign_with_edge_buffer(tmp_path, monkeypatch): def test_ui_offers_generation_controls(): - """L'interface embarque les contrôles de génération (+ Zone, options, run).""" + """The interface embeds the generation controls (+ Area, options, run).""" from lidar_pipeline.mapui import _MAP_CSS, _MAP_HTML, _MAP_JS assert 'id="btnZone"' in _MAP_HTML and 'id="btnComplete"' in _MAP_HTML assert 'id="tab-gen"' in _MAP_HTML and 'id="genGo"' in _MAP_HTML assert 'id="genStop"' in _MAP_HTML and 'id="genQueueClear"' in _MAP_HTML assert 'id="genViz"' in _MAP_HTML - # Classification et raccord des bords imposés : plus de réglage + # Classification and edge stitching enforced: no more settings for gone in ('id="genClass"', 'id="genIgnClasses"', 'id="genReclass"', 'id="genEdge"'): assert gone not in _MAP_HTML - # Boutons masqués par défaut : révélés seulement si /api/status autorise + # Hidden by default: revealed only if /api/status allows it assert "GEN.available && GEN.allowed" in _MAP_JS - # Dessin de zone + cadres de run + sondage d'état + # Area drawing + run outlines + status polling assert "genSetDrawing" in _MAP_JS and "pane: 'genDraw'" in _MAP_JS assert "gen-frame-running" in _MAP_CSS and "genDrawFrames" in _MAP_JS assert "api/status" in _MAP_JS and "api/preview" in _MAP_JS assert "api/generate" in _MAP_JS and "api/stop" in _MAP_JS assert "all_missing: true" in _MAP_JS - # Fin de run : rafraîchissement des couches + relance de la maintenance + # End of run: layer refresh + maintenance restart assert "genAfterRun" in _MAP_JS and "api/map/background" in _MAP_JS def test_cache_only_fetches_missing_tile_upstream(tmp_path, monkeypatch): - """Cache seule + LIDAR_MAPS_URL : une tuile absente est rapatriee du serveur - amont (aucun rendu local : les zooms au-dela de la maintenance s'affichent). + """Cache-only + LIDAR_MAPS_URL: a missing tile is fetched from the + upstream server (no local render: zooms beyond the maintenance display). """ from lidar_pipeline import tiles as _t - monkeypatch.setattr(_t, "TILE_EVEN_LEVELS", False) # règle historique : tout est stocké + monkeypatch.setattr(_t, "TILE_EVEN_LEVELS", False) # legacy rule: everything is stored monkeypatch.setattr(_t, "TILE_CACHE_MAX_Z", 99) import lidar_pipeline.mapserve as mapserve from lidar_pipeline import tiles _setup(tmp_path, monkeypatch) monkeypatch.setenv("LIDAR_TILE_CACHE_ONLY", "1") - monkeypatch.setattr(mapserve, "MAPS_URL", "http://amont:8975") + monkeypatch.setattr(mapserve, "MAPS_URL", "http://upstream:8975") monkeypatch.setattr(mapserve, "_UPSTREAM", {"fails": 0, "until": 0.0}) calls = [] - PNG = bytes([0x89, 0x50, 0x4E, 0x47, 13, 10, 0x1A, 10]) + b'TUILE-AMONT' + PNG = bytes([0x89, 0x50, 0x4E, 0x47, 13, 10, 0x1A, 10]) + b'UPSTREAM-TILE' def fake_fetch(rel_path): calls.append(rel_path) @@ -1167,13 +1170,13 @@ def test_cache_only_fetches_missing_tile_upstream(tmp_path, monkeypatch): monkeypatch.setattr(mapserve, "_fetch_upstream", fake_fetch) try: - z = 17 # jamais couvert par la maintenance (max_z 16 par defaut) + z = 17 # stored level, not yet produced (no maintenance running in this test) x, y = _tile_of_cell(1054, 6882, z) resp = asyncio.run(mapserve.tile("aspect", z, x, f"{y}@2x.webp")) assert calls == [f"tiles/aspect/{z}/{x}/{y}@2x.webp"] assert resp.body == PNG - assert resp.headers.get("X-Tile-Pending") != "1" # servie, plus en attente - # Mise en cache : la seconde demande ne repasse pas par l'amont + assert resp.headers.get("X-Tile-Pending") != "1" # served, no longer pending + # Cached: the second request does not go upstream again asyncio.run(mapserve.tile("aspect", z, x, f"{y}@2x.webp")) assert len(calls) == 1 assert tiles.tile_cache_path(tmp_path, "aspect", z, x, y, 2, "webp").is_file() @@ -1182,20 +1185,20 @@ def test_cache_only_fetches_missing_tile_upstream(tmp_path, monkeypatch): def test_tile_selection_always_answers(tmp_path, monkeypatch): - """La sélection d'une dalle répond toujours, sans appel réseau : dalle - absente comprise, avec nom, emprise L93 et cadre de sélection.""" + """Tile selection always answers, without a network call: including a + missing tile, with name, L93 extent and selection outline.""" mapserve = _setup(tmp_path, monkeypatch, layers=("relief_oriente",)) def boom(*a, **k): - raise AssertionError("aucun appel IGN dans /api/map/tile") + raise AssertionError("no IGN call in /api/map/tile") monkeypatch.setattr("lidar_pipeline.fetch_ign.tile_ign_metadata", boom) - d = mapserve.map_tile_info(lat=48.0, lng=2.0) # loin de toute dalle + d = mapserve.map_tile_info(lat=48.0, lng=2.0) # far from any tile assert d["found"] is False and d["name"].startswith("LHD_FXX_") assert len(d["corners"]) == 4 and d["l93_bbox"][2] - d["l93_bbox"][0] == 1000 def test_ign_metadata_cached_and_resilient(tmp_path, monkeypatch): - """Fiche IGN : un seul appel au catalogue (cache disque) ; catalogue - injoignable = message, jamais d'exception.""" + """IGN record: a single catalogue call (disk cache); unreachable + catalogue = message, never an exception.""" mapserve = _setup(tmp_path, monkeypatch) calls = [] def fake(col, row, timeout=10): @@ -1207,7 +1210,7 @@ def test_ign_metadata_cached_and_resilient(tmp_path, monkeypatch): b = mapserve.map_tile_ign(col=1004, row=6832) assert a["download_url"].endswith(".copc.laz") and b == a and len(calls) == 1 def down(col, row, timeout=10): - raise OSError("réseau coupé") + raise OSError("network down") monkeypatch.setattr("lidar_pipeline.fetch_ign.tile_ign_metadata", down) assert mapserve.map_tile_ign(col=1, row=2)["found"] is False @@ -1215,12 +1218,12 @@ def test_ign_metadata_cached_and_resilient(tmp_path, monkeypatch): def test_ui_tile_card_and_wind_rose(): from lidar_pipeline.mapui import _MAP_HTML, _MAP_JS assert 'id="legendBlock"' in _MAP_HTML and 'id="roseCanvas"' in _MAP_HTML - assert "api/map/ign?col=" in _MAP_JS and "Télécharger le nuage LiDAR" in _MAP_JS - assert "compass + 90" in _MAP_JS # même repère que le rendu (aspect = boussole + 90°) + assert "api/map/ign?col=" in _MAP_JS and "Download the IGN LiDAR point cloud" in _MAP_JS + assert "compass + 90" in _MAP_JS # same frame as the rendering (aspect = compass + 90°) def test_fresh_tiles_jump_the_maintenance_queue(monkeypatch): - """Tuiles d'une dalle tout juste rendue : en tête de file, devant l'arriéré.""" + """Tiles of a freshly rendered source tile: at the head of the queue, ahead of the backlog.""" import lidar_pipeline.mapserve as mapserve monkeypatch.setitem(mapserve._bg, "queue", __import__("collections").deque()) monkeypatch.setitem(mapserve._bg, "queued", set()) @@ -1233,8 +1236,8 @@ def test_fresh_tiles_jump_the_maintenance_queue(monkeypatch): def test_cache_only_renders_unstored_levels(tmp_path, monkeypatch): - """Cache seule (Pi) : un niveau non stocké est rendu à la volée — jamais - une tuile transparente « en attente » qui n'arriverait jamais.""" + """Cache-only (Pi): a level that is not stored is rendered on the fly — + never a transparent "pending" tile that would never arrive.""" import lidar_pipeline.mapserve as mapserve from lidar_pipeline import tiles monkeypatch.setattr(tiles, "TILE_EVEN_LEVELS", True) @@ -1264,17 +1267,17 @@ def test_background_scan_only_queues_stored_levels(tmp_path, monkeypatch): def test_remote_fed_map_keeps_sources_locally(tmp_path, monkeypatch): - """Carte alimentée par l'amont : les sources nécessaires sont rapatriées - et gardées sans attendre de visite ; une source manquée (amont éteint) - est reprise au scan suivant ; la dalle entière (doublon) n'est pas prise.""" + """Map fed by upstream: the needed sources are fetched and kept without + waiting for a visit; a missed source (upstream down) is retried at the + next scan; the full tile (duplicate) is not fetched.""" import lidar_pipeline.mapserve as mapserve from lidar_pipeline import tiles S = tiles._Source - thumb = S(tmp_path / "t.webp", (0, 0, 1000, 1000), 3.9, url="http://amont/t") - quads = [S(tmp_path / f"q{i}.avif", (0, 0, 500, 500), 0.2, url=f"http://amont/q{i}") for i in range(4)] - full = S(tmp_path / "d.avif", (0, 0, 1000, 1000), 0.2, url="http://amont/d") + thumb = S(tmp_path / "t.webp", (0, 0, 1000, 1000), 3.9, url="http://upstream/t") + quads = [S(tmp_path / f"q{i}.avif", (0, 0, 500, 500), 0.2, url=f"http://upstream/q{i}") for i in range(4)] + full = S(tmp_path / "d.avif", (0, 0, 1000, 1000), 0.2, url="http://upstream/d") assert tiles.sources_to_keep([[thumb], quads, [full]]) == [thumb] + quads - monkeypatch.setattr(tiles, "REMOTE_SOURCE_URL", "http://amont") + monkeypatch.setattr(tiles, "REMOTE_SOURCE_URL", "http://upstream") monkeypatch.setattr(mapserve, "OUTPUT_DIR", tmp_path) monkeypatch.setattr(tiles, "source_index", lambda *a, **k: {"relief_oriente": {(1, 2): [[thumb], quads, [full]]}}) for key, val in (("queue", __import__("collections").deque()), ("queued", set()), @@ -1289,9 +1292,9 @@ def test_remote_fed_map_keeps_sources_locally(tmp_path, monkeypatch): mapserve.background_scan(tmp_path) while mapserve._bg["prefetch"]: mapserve._bg_process_one() - assert not any(s_.path.exists() for s_ in [thumb] + quads) # amont éteint + assert not any(s_.path.exists() for s_ in [thumb] + quads) # upstream down online["up"] = True - mapserve.background_scan(tmp_path) # dalle inchangée : reprise quand même + mapserve.background_scan(tmp_path) # unchanged tile: retried anyway while mapserve._bg["prefetch"]: mapserve._bg_process_one() assert all(s_.path.exists() for s_ in [thumb] + quads) and not full.path.exists() @@ -1307,22 +1310,22 @@ def _bg_reset(monkeypatch, mapserve): def test_background_downloads_tiles_from_upstream(tmp_path, monkeypatch): - """Maintenance de fond + LIDAR_MAPS_URL : les tuiles de la pyramide sont - TÉLÉCHARGÉES en tâche de fond (pas seulement à l'affichage), sans rendu - local — la carte se remplit même sans visite et reste servie ensuite - sans l'amont.""" + """Background maintenance + LIDAR_MAPS_URL: the pyramid tiles are + DOWNLOADED in the background (not only on display), without local + rendering — the map fills up even without visits and is then served + without upstream.""" import lidar_pipeline.mapserve as mapserve from lidar_pipeline import tiles _setup(tmp_path, monkeypatch) _bg_reset(monkeypatch, mapserve) - monkeypatch.setattr(mapserve, "MAPS_URL", "http://amont:8975") - AVIF = b"\x00\x00\x00\x20ftypavif-TUILE-AMONT" + monkeypatch.setattr(mapserve, "MAPS_URL", "http://upstream:8975") + AVIF = b"\x00\x00\x00\x20ftypavif-UPSTREAM-TILE" calls = [] monkeypatch.setattr(mapserve, "_fetch_upstream", lambda rel: calls.append(rel) or AVIF) def no_render(*a, **k): - raise AssertionError("rendu local inutile : la tuile vient de l'amont") + raise AssertionError("local render not needed: the tile comes from upstream") monkeypatch.setattr(tiles, "get_tile", no_render) z = 13 @@ -1333,14 +1336,14 @@ def test_background_downloads_tiles_from_upstream(tmp_path, monkeypatch): cache = tiles.tile_cache_path(tmp_path, "aspect", z, x, y, 2, "avif") assert cache.read_bytes() == AVIF assert mapserve._bg["stats"]["telechargees"] == 1 - # Fraîche : servie en cache seule sans amont ni rendu + # Fresh: served in cache-only mode without upstream or rendering data, state = tiles.cached_tile(tmp_path, "aspect", z, x, y, 2, "avif") assert state == "fresh" and data == AVIF def test_background_downloads_without_pause(monkeypatch): - """Tuiles téléchargées de l'amont enchaînées sans pause ; rendu local - et rapatriement de source gardent la pause.""" + """Tiles downloaded from upstream are chained without a pause; local + rendering and source fetching keep the pause.""" import lidar_pipeline.mapserve as mapserve results = iter(["telechargee", "telechargee", True]) waits = [] @@ -1361,12 +1364,12 @@ def test_background_downloads_without_pause(monkeypatch): def test_background_renders_locally_when_upstream_down(tmp_path, monkeypatch): - """Amont éteint : la maintenance rend la tuile localement (autonomie).""" + """Upstream down: the maintenance renders the tile locally (autonomy).""" import lidar_pipeline.mapserve as mapserve from lidar_pipeline import tiles _setup(tmp_path, monkeypatch) _bg_reset(monkeypatch, mapserve) - monkeypatch.setattr(mapserve, "MAPS_URL", "http://amont:8975") + monkeypatch.setattr(mapserve, "MAPS_URL", "http://upstream:8975") monkeypatch.setattr(mapserve, "_fetch_upstream", lambda rel: None) z = 13 x, y = _tile_of_cell(1054, 6882, z) @@ -1377,28 +1380,28 @@ def test_background_renders_locally_when_upstream_down(tmp_path, monkeypatch): def test_upstream_breaker_rearms_after_expiry(monkeypatch): - """La suspension expirée, de nouveaux échecs la relancent (sinon chaque - tuile repaie le délai réseau d'un amont éteint, indéfiniment).""" + """Once the suspension has expired, new failures restart it (otherwise + every tile pays the network timeout of a down upstream again, forever).""" import lidar_pipeline.mapserve as mapserve monkeypatch.setattr(mapserve, "_UPSTREAM", {"fails": 0, "until": 0.0}) for _ in range(3): mapserve._upstream_mark(False) assert mapserve._upstream_offline() is True - mapserve._UPSTREAM["until"] = 1.0 # suspension expirée + mapserve._UPSTREAM["until"] = 1.0 # suspension expired assert mapserve._upstream_offline() is False - mapserve._upstream_mark(False) # nouvel échec : resuspendu + mapserve._upstream_mark(False) # new failure: suspended again assert mapserve._upstream_offline() is True def test_empty_tile_skips_upstream_when_inventory_is_upstream(tmp_path, monkeypatch): - """Inventaire venu de l'amont (LIDAR_SOURCE_URL) et aucune dalle sous la - tuile : l'amont n'en sait pas plus — pas de requête (20 s par tuile vide - quand il est éteint).""" + """Inventory from upstream (LIDAR_SOURCE_URL) and no source tile under the + tile: upstream knows no more — no request (20 s per empty tile when it + is down).""" import lidar_pipeline.mapserve as mapserve from lidar_pipeline import tiles _setup(tmp_path, monkeypatch) - monkeypatch.setattr(mapserve, "MAPS_URL", "http://amont:8975") - monkeypatch.setattr(tiles, "REMOTE_SOURCE_URL", "http://amont:8973") + monkeypatch.setattr(mapserve, "MAPS_URL", "http://upstream:8975") + monkeypatch.setattr(tiles, "REMOTE_SOURCE_URL", "http://upstream:8973") monkeypatch.setattr(tiles, "_contributing", lambda *a, **k: []) calls = [] monkeypatch.setattr(mapserve, "_fetch_upstream", lambda rel: calls.append(rel)) @@ -1408,8 +1411,9 @@ def test_empty_tile_skips_upstream_when_inventory_is_upstream(tmp_path, monkeypa def test_cache_only_serves_stale_tile_while_pending(tmp_path, monkeypatch): - """Cache seule, tuile périmée (dalle régénérée) et amont muet : l'ancienne - tuile reste affichée en attendant la nouvelle — pas un trou transparent.""" + """Cache-only, stale tile (source tile regenerated) and silent upstream: + the old tile stays displayed until the new one arrives — not a + transparent hole.""" import os import lidar_pipeline.mapserve as mapserve from lidar_pipeline import tiles @@ -1420,25 +1424,25 @@ def test_cache_only_serves_stale_tile_while_pending(tmp_path, monkeypatch): x, y = _tile_of_cell(1054, 6882, z) cache = tiles.tile_cache_path(tmp_path, "aspect", z, x, y, 2, "avif") cache.parent.mkdir(parents=True, exist_ok=True) - cache.write_bytes(b"ANCIENNE-TUILE") - os.utime(cache, (1_000_000, 1_000_000)) # plus vieille que la dalle + cache.write_bytes(b"OLD-TILE") + os.utime(cache, (1_000_000, 1_000_000)) # older than the source tile assert tiles.cached_tile(tmp_path, "aspect", z, x, y, 2, "avif")[1] == "pending" resp = asyncio.run(mapserve.tile("aspect", z, x, f"{y}@2x.avif")) - assert resp.body == b"ANCIENNE-TUILE" - assert resp.headers["Cache-Control"] == "no-store" # redemandée plus tard + assert resp.body == b"OLD-TILE" + assert resp.headers["Cache-Control"] == "no-store" # requested again later assert resp.headers["X-Tile-Pending"] == "1" assert resp.headers["X-Tile-Empty"] == "0" def test_background_tiles_before_sources(tmp_path, monkeypatch): - """Tuiles d'abord (légères, visibles tout de suite), sources ensuite : - des milliers de sources à rapatrier ne retardent pas la pyramide.""" + """Tiles first (light, visible immediately), sources afterwards: + thousands of sources to fetch do not delay the pyramid.""" import lidar_pipeline.mapserve as mapserve from lidar_pipeline import tiles _setup(tmp_path, monkeypatch) _bg_reset(monkeypatch, mapserve) - monkeypatch.setattr(mapserve, "MAPS_URL", "http://amont:8975") - monkeypatch.setattr(mapserve, "_fetch_upstream", lambda rel: b"TUILE") + monkeypatch.setattr(mapserve, "MAPS_URL", "http://upstream:8975") + monkeypatch.setattr(mapserve, "_fetch_upstream", lambda rel: b"TILE") fetched = [] class Src: @@ -1457,26 +1461,26 @@ def test_background_tiles_before_sources(tmp_path, monkeypatch): def test_zoom_animation_transforms_only_on_all_tile_layers(): - """Pendant l'animation de zoom, AUCUNE couche ne crée de niveau : un - niveau neuf n'est pas composé par Chrome (animé sur le thread principal, - gelé ~90 ms par le chargement) — le fond sautait quand le relief orienté, - qui garde son niveau pair, glissait normalement : désynchronisés.""" + """During the zoom animation, NO layer creates a level: a new level is not + composited by Chrome (animated on the main thread, frozen ~90 ms by + loading) — the base map jumped while the oriented relief, which kept its + even level, slid normally: out of sync.""" import re from lidar_pipeline.mapui import _MAP_JS assert "_animateZoom(e) { this._setView(e.center, e.zoom, true, true); }" in _MAP_JS - # « zoom » part aussi au début de l'animation (Leaflet 1.9) : même garde + # "zoom" also fires at the start of the animation (Leaflet 1.9): same guard assert "if (this._map && this._map._animatingZoom) {" in _MAP_JS - # Sans quoi _setView recrée un niveau malgré noUpdate (tileZoomChanged) + # Otherwise _setView recreates a level despite noUpdate (tileZoomChanged) assert _MAP_JS.count("updateWhenZooming: false") >= 2 - # Le fond OSM ET les couches LiDAR héritent du comportement + # The OSM base AND the LiDAR layers inherit the behaviour assert re.search(r"const base = new ZoomAnimTileLayer\(", _MAP_JS) assert "const EvenLevelTileLayer = ZoomAnimTileLayer.extend(" in _MAP_JS assert "L.tileLayer(" not in _MAP_JS.replace("L.tileLayer` standard", "") def test_default_policy_pregenerates_every_level_up_to_native(monkeypatch): - """Par défaut, toute la pyramide jusqu'au natif (18@2x = 0,2 m/px) est - stockée et générée d'avance : aucun niveau rendu à la volée.""" + """By default, the whole pyramid up to native (18@2x = 0.2 m/px) is + stored and generated ahead of time: no level rendered on the fly.""" import importlib import lidar_pipeline.mapserve as mapserve from lidar_pipeline import tiles @@ -1495,8 +1499,8 @@ def test_default_policy_pregenerates_every_level_up_to_native(monkeypatch): def test_background_scan_retries_cells_beyond_queue_max(tmp_path, monkeypatch): - """File pleine : les dalles dont la pyramide n'a pas trouvé place sont - reprises aux scans suivants jusqu'à ce que toutes leurs tuiles passent.""" + """Full queue: source tiles whose pyramid did not fit are resumed at the + next scans until all their tiles have been queued.""" import collections import lidar_pipeline.mapserve as mapserve from lidar_pipeline import tiles @@ -1521,12 +1525,12 @@ def test_background_scan_retries_cells_beyond_queue_max(tmp_path, monkeypatch): for _ in range(100): mapserve.background_scan(tmp_path) seen.update(mapserve._bg["queue"]) - mapserve._bg["queue"].clear() # file vidée par les rendeurs + mapserve._bg["queue"].clear() # queue drained by the renderers mapserve._bg["queued"].clear() if not mapserve._bg["incomplete"]: break assert seen == expected - # Pyramide passée en entier : les scans suivants se taisent + # Whole pyramid queued: later scans stay quiet assert mapserve.background_scan(tmp_path) == 0 @@ -1593,9 +1597,9 @@ def test_export_pdf_concurrent_429(tmp_path, monkeypatch): def test_export_pdf_never_delegated(tmp_path, monkeypatch): - """Carte légère avec générateur distant : l'export reste local.""" + """Lightweight map with a remote generator: the export stays local.""" mapserve = _setup(tmp_path, monkeypatch, layers=("relief_oriente",)) - monkeypatch.setattr(mapserve, "GENERATION_URL", "http://injoignable.invalid") + monkeypatch.setattr(mapserve, "GENERATION_URL", "http://unreachable.invalid") lat, lon = _center() assert mapserve.export_pdf_file(lat, lon, "A4", "paysage", 2000, None).body.startswith(b"%PDF") @@ -1609,14 +1613,14 @@ def test_map_ui_has_pdf_export(): assert f'value="{scale}"' in _MAP_HTML assert "api/export/frame?" in _MAP_JS and "api/export/pdf?" in _MAP_JS assert "createPane('printFrame')" in _MAP_JS - # cadre posé sur le terrain : il ne suit plus la vue, on le fait glisser + # frame placed on the ground: it no longer follows the view, it is dragged assert "map.on('moveend', printRefreshFrame)" not in _MAP_JS assert "draggable: true" in _MAP_JS and "on('dragend', printDragEnd)" in _MAP_JS assert "PRINT.center" in _MAP_JS for id_ in ("printHere", "printFit"): assert f'id="{id_}"' in _MAP_HTML, id_ - # onglet toujours proposé (indépendant de /api/status.available) ; plus de - # bouton ⎙ ni de carte hors du panneau + # tab always offered (independent of /api/status.available); no more ⎙ + # button or card outside the panel assert 'data-tab="print"' in _MAP_HTML for gone in ('id="btnPrint"', 'id="printcard"', 'id="printClose"'): assert gone not in _MAP_HTML, gone @@ -1630,7 +1634,7 @@ def test_ui_tokens_themes_and_components(): for var in ("--surface", "--on-accent", "--print", "--fs-sm", "--r-md", "--sp-2", "--shadow-lg", "--z-panel", "--z-toast"): assert var + ":" in _MAP_CSS, var - # Palette sombre : système sombre (sauf clair forcé) ou sombre forcé + # Dark palette: dark system theme (unless light forced) or dark forced assert '@media (prefers-color-scheme: dark)' in _MAP_CSS assert ':root:not([data-theme="light"])' in _MAP_CSS assert ':root[data-theme="dark"]' in _MAP_CSS @@ -1638,17 +1642,17 @@ def test_ui_tokens_themes_and_components(): assert cls in _MAP_CSS, cls assert 'id="btnTheme"' in _MAP_HTML assert "const THEME_LS = 'lidar-theme'" in _MAP_JS and "function applyTheme(" in _MAP_JS - # Stockage local toujours protégé (navigation privée) : aucun accès - # direct à localStorage hors du bloc lsGet/lsSet/lsDel. + # Local storage always guarded (private browsing): no direct + # localStorage access outside the lsGet/lsSet/lsDel block. import re start = _MAP_JS.index("function lsGet(") - end = _MAP_JS.index("// --- fin stockage") + end = _MAP_JS.index("// --- end of storage") outside = _MAP_JS[:start] + _MAP_JS[end:] assert not re.search(r"localStorage\.(getItem|setItem|removeItem)\(", outside) - # Code mort retiré + # Dead code removed for gone in ("genClass", "gen-input", "genClassInfo", ".grip", "layer-row", "#gps.busy"): assert gone not in _MAP_CSS + _MAP_HTML, gone - # Plus de couleurs d'interface écrites en dur hors des palettes + # No more interface colours hard-coded outside the palettes rules = _MAP_CSS[_MAP_CSS.rindex(":root[data-theme=\"dark\"]"):] rules = rules[rules.index("}") + 1:] for hard in ("#0b0e13", "#10141b", "#f4a261", "#4cc9f0", "#e76f51", "rgba(90, 160, 255"): @@ -1662,11 +1666,11 @@ def test_ui_single_tabbed_panel(): assert f'id="{id_}"' in _MAP_HTML, id_ for tab in ("view", "tile", "print", "gen", "share"): assert f'data-tab="{tab}"' in _MAP_HTML, tab - # Plus d'éléments flottants : tout passe dans le panneau + # No more floating elements: everything goes into the panel for gone in ('id="layercard"', 'id="printcard"', 'id="gencard"', 'id="usecard"', 'id="gentools"', 'id="btnPrint"', 'id="rose"', 'id="btnUse"'): assert gone not in _MAP_HTML, gone - # Réglages et boutons déplacés, identifiants conservés + # Settings and buttons moved, identifiers kept for id_ in ("printPaper", "printGo", "genGo", "btnZone", "btnComplete", "btnShare", "btnDefault", "btnReset", "useBody", "modeSeg", "roseCanvas", "baseOpacity"): assert f'id="{id_}"' in _MAP_HTML, id_ @@ -1675,7 +1679,7 @@ def test_ui_single_tabbed_panel(): "function setCollapsed(", "function panelVisibleTab("): assert fn in _MAP_JS, fn assert "'panel:tab'" in _MAP_JS - # Génération masquée : onglet retiré de la liste (touches 1–5 comprises) + # Generation hidden: tab removed from the list (keys 1–5 included) assert "GEN.available && GEN.allowed" in _MAP_JS.split("function panelTabs(")[1].split("}")[0] assert "@media (max-width: 720px)" in _MAP_CSS and "#panel" in _MAP_CSS for state in ('data-sheet="closed"', 'data-sheet="half"', 'data-sheet="full"'): @@ -1685,41 +1689,41 @@ def test_ui_single_tabbed_panel(): def test_ui_panel_restores_tab_and_ignores_collapse_on_phone(): from lidar_pipeline.mapui import _MAP_JS render = _MAP_JS.split("function panelRender(")[1].split("\nfunction ")[0] - # Onglet choisi gardé à part : Génération rétablie une fois /api/status connu + # Chosen tab kept aside: Generation restored once /api/status is known assert "PANEL.want = PANEL.tab;" in _MAP_JS assert "PANEL.tab = tabs.includes(PANEL.want) ? PANEL.want : 'view';" in render assert "tab: PANEL.want" in _MAP_JS.split("function panelSave(")[1].split("\n")[0] assert "PANEL.want = PANEL.tab = tab;" in _MAP_JS.split("function openTab(")[1].split("\nfunction ")[0] - # Repli en bande d'icônes : ordinateur seulement + # Collapse to an icon strip: desktop only assert "PANEL.collapsed && !isPhone()" in render assert "toggle('collapsed', PANEL.collapsed)" not in render assert "toggle('panel-collapsed', PANEL.collapsed)" not in render def test_ui_tile_tab_label_stays_dalle_col_row_in_title(): - """Revue finale (finding 2) : 5 onglets dans 340 px — le libellé de - l'onglet Dalle reste toujours « Dalle » (jamais tronqué), col · row va - dans le title de l'onglet (survol) et #tileTitle (déjà dans la fiche). - Affichage/Export PDF/Génération raccourcis pour tenir, Partager gardé.""" + """Final review (finding 2): 5 tabs in 340 px — the Tile tab label always + stays "Tile" (never truncated), col · row goes into the tab title + (hover) and #tileTitle (already in the card). Display/PDF export/ + Generation shortened to fit, Share kept.""" from lidar_pipeline.mapui import _MAP_HTML, _MAP_JS - assert 'Vue' in _MAP_HTML + assert 'View' in _MAP_HTML assert 'PDF' in _MAP_HTML - assert 'Générer' in _MAP_HTML - assert 'Dalle' in _MAP_HTML - assert 'data-tab="share"' in _MAP_HTML and '>Partager' in _MAP_HTML - # Le title complet (survol) reste explicite malgré le libellé court - assert 'title="Affichage (1)"' in _MAP_HTML - assert 'title="Export PDF (3)"' in _MAP_HTML - assert 'title="Génération (4)"' in _MAP_HTML + assert 'Generate' in _MAP_HTML + assert 'Tile' in _MAP_HTML + assert 'data-tab="share"' in _MAP_HTML and '>Share' in _MAP_HTML + # The full title (hover) stays explicit despite the short label + assert 'title="Display (1)"' in _MAP_HTML + assert 'title="PDF export (3)"' in _MAP_HTML + assert 'title="Generation (4)"' in _MAP_HTML assert "function tileTabTitle(" in _MAP_JS - assert "textContent = tileTabLabel" not in _MAP_JS # plus de libellé dynamique + assert "textContent = tileTabLabel" not in _MAP_JS # no more dynamic label assert "button[data-tab=\"tile\"]').title = tileTabTitle()" in _MAP_JS def test_ui_tile_card_refetched_after_gen_run(): - """Finding 3 : la fiche de dalle sélectionnée avant/pendant un run devient - périmée (résolution, date, couches...) — genAfterRun la recharge par - api/map/tile sans jamais désélectionner (pas de clearTileSelection).""" + """Finding 3: the card of a tile selected before/during a run becomes + stale (resolution, date, layers...) — genAfterRun reloads it through + api/map/tile without ever deselecting (no clearTileSelection).""" from lidar_pipeline.mapui import _MAP_JS fn = _MAP_JS[_MAP_JS.index("function genAfterRun("):_MAP_JS.index("function genUpdateStatus(")] assert "SELECTED_TILE" in fn and "lastTileQuery" in fn @@ -1729,10 +1733,10 @@ def test_ui_tile_card_refetched_after_gen_run(): def test_ui_double_click_and_stale_click_response_ignored(): - """M1/M2 : un double-clic (zoom Leaflet, deux clics simples dont le - second a detail > 1) ne doit pas re-basculer la sélection posée par le - premier ; une réponse arrivée après un clic plus récent (jeton de - séquence) est ignorée plutôt que d'écraser l'état.""" + """M1/M2: a double click (Leaflet zoom, two single clicks, the second + with detail > 1) must not toggle back the selection set by the first; + a response arriving after a more recent click (sequence token) is + ignored rather than overwriting the state.""" from lidar_pipeline.mapui import _MAP_JS click = _MAP_JS[_MAP_JS.index("map.on('click'"):] body = click[:click.index("});") + 3] @@ -1743,24 +1747,24 @@ def test_ui_double_click_and_stale_click_response_ignored(): def test_ui_regen_button_appears_when_gen_status_resolves_late(): - """M3 : une dalle sélectionnée avant que /api/status ne réponde ne doit - pas rester sans bouton Régénérer — la fiche est ré-émise dès que GEN est - connu, dans le même bloc qui pose GEN.available/allowed.""" + """M3: a tile selected before /api/status answers must not stay without + a Regenerate button — the card is re-rendered as soon as GEN is known, + in the same block that sets GEN.available/allowed.""" from lidar_pipeline.mapui import _MAP_JS boot = _MAP_JS[_MAP_JS.index("fetch('api/map/meta').then(r => r.json()).then(meta => {"):] - status_block = boot[:boot.index("}).catch(() => {\n toast('Serveur de tuiles injoignable.'")] + status_block = boot[:boot.index("}).catch(() => {\n toast('Tile server unreachable.'")] assert "GEN.available = !!d.available;" in status_block assert "if (SELECTED_TILE) renderTabTile();" in status_block def test_ui_intensity_row_visible_outside_precision_block(): - """M4 (liaison de spec) : #intensityRow est un frère de #precBlock, pas un - enfant — visible dès l'onglet Affichage même sans couche de précision, - masqué seulement en mode précision (renderPanel).""" + """M4 (spec binding): #intensityRow is a sibling of #precBlock, not a + child — visible in the Display tab even without a precision layer, + hidden only in precision mode (renderPanel).""" from lidar_pipeline.mapui import _MAP_HTML assert ' +

Drag the ✥ handle to place the yellow frame over the area to print.

-
-
+ title="Place the frame at the centre of the view">⌖ Centre here +
+