diff --git a/.cursor/rules/git-flow.mdc b/.cursor/rules/git-flow.mdc new file mode 100644 index 0000000..e1936df --- /dev/null +++ b/.cursor/rules/git-flow.mdc @@ -0,0 +1,46 @@ +--- +description: Green-master git flow — branch from next, releases and hotfixes per GIT_FLOW.md +alwaysApply: true +--- + +# Git flow (green master) + +Follow [docs/GIT_FLOW.md](docs/GIT_FLOW.md) and [docs/GIT_FLOW.pdf](docs/GIT_FLOW.pdf). Summary: + +## Branches + +| Branch | Use | +|--------|-----| +| **master** | Always green; **tags** (`vX.Y.Z`); merge only | +| **next** | Integration; all feature work merges here first | +| **feature/***, **fix/*** | Fork **next**; delete after merge | +| **hotfix/*** | Fork **master** for **released** bugs; merge → master → tag → merge master into **next** | + +## Agent rules + +1. **Do not** commit, push, or merge to **master** or **next** unless the user explicitly asks (release, hotfix, or sync step). +2. **Default work:** `git checkout next && git pull`, then `git checkout -b feature/...` or `fix/...`. +3. **Before merge to next:** run relevant tests (`./gradlew :app:testDebugUnitTest` for app changes; backend tests for PHP). +4. **Release:** only after user confirms — merge `next` → `master`, CI green, **tag on master**, then **merge master → next**. +5. **Hotfix (production):** branch from **master**, not next; after tag, **merge master into next**. +6. **Hotfix (next-only bug):** `fix/*` from **next** → merge to **next** only. +7. **Never** force-push `master` or `next`. +8. When working on a named branch, call **SetActiveBranch** with that branch name. + +## Quick commands + +```bash +# Start feature +git fetch && git checkout next && git pull && git checkout -b feature/my-change + +# After hotfix on master +git checkout next && git merge master && git push origin next +``` + +If `next` is missing locally: create from `master` and `git push -u origin next` (maintainer once). + +## Dual remote (private primary) + +- **`origin`** (`git://f0xx.org/...`) = canonical; fetch/pull/push day-to-day work here. +- **`github`** = publish mirror; push `master` + tags (and optionally `next`) after release — do not treat GitHub as sole remote unless user says so. +- Topic branches: `git push -u origin feature/...` only unless user asks to publish to GitHub. diff --git a/README.md b/README.md index b3bbd47..433cb9d 100644 --- a/README.md +++ b/README.md @@ -86,3 +86,10 @@ Activities bind via AIDL (`ICastSenderService` / `ICastReceiverService`) for sta - UDP mode may glitch under load - Audio captures **playback** routed through the system (not microphone); some apps may be silent by policy - Single sender → single receiver + +## Development (git flow) + +We use a **green `master`** plus integration branch **`next`**: features merge to `next` first; releases merge `next` → `master` and are tagged there; production hotfixes branch from `master` and sync back into `next`. + +- Narrative: [docs/GIT_FLOW.md](docs/GIT_FLOW.md) +- PDF (diagrams): [docs/GIT_FLOW.pdf](docs/GIT_FLOW.pdf) — regenerate: `python3 docs/_pdf_build/build_git_flow_pdf.py` diff --git a/app/src/main/java/com/foxx/androidcast/AppPreferences.java b/app/src/main/java/com/foxx/androidcast/AppPreferences.java index 1d5c8a8..2142e21 100644 --- a/app/src/main/java/com/foxx/androidcast/AppPreferences.java +++ b/app/src/main/java/com/foxx/androidcast/AppPreferences.java @@ -20,6 +20,7 @@ import android.text.TextUtils; import com.foxx.androidcast.display.ExternalDisplayCapturePolicy; import com.foxx.androidcast.receiver.av.ReceiverAudioPreset; import com.foxx.androidcast.receiver.av.ReceiverVideoPreset; +import com.foxx.androidcast.sender.SenderResolutionUiMode; /** * Global app preferences: identity, PIN, tray icon, and default sender/receiver cast options. @@ -52,6 +53,7 @@ public final class AppPreferences { private static final String KEY_DEV_WIRED_DISPLAY_HINTS = "dev_wired_display_hints"; private static final String KEY_DEV_USB_TETHER_TRANSPORT = "dev_usb_tether_transport"; + private static final String KEY_DEV_SENDER_RESOLUTION_UI_MODE = "dev_sender_resolution_ui_mode"; private static final String KEY_DEV_EXTERNAL_CAPTURE_POLICY = "dev_external_capture_policy"; private static final String KEY_DEV_COMMERCIAL_ADS = "dev_commercial_ads"; private static final String KEY_DEV_COMMERCIAL_IAP = "dev_commercial_iap"; @@ -330,6 +332,22 @@ public final class AppPreferences { prefs(context).edit().putBoolean(KEY_DEV_USB_TETHER_TRANSPORT, enabled).apply(); } + /** Default: {@link SenderResolutionUiMode#SEPARATED}. */ + public static SenderResolutionUiMode getDevSenderResolutionUiMode(Context context) { + String name = prefs(context).getString( + KEY_DEV_SENDER_RESOLUTION_UI_MODE, SenderResolutionUiMode.SEPARATED.name()); + try { + return SenderResolutionUiMode.valueOf(name); + } catch (IllegalArgumentException e) { + return SenderResolutionUiMode.SEPARATED; + } + } + + public static void setDevSenderResolutionUiMode(Context context, SenderResolutionUiMode mode) { + SenderResolutionUiMode value = mode != null ? mode : SenderResolutionUiMode.SEPARATED; + prefs(context).edit().putString(KEY_DEV_SENDER_RESOLUTION_UI_MODE, value.name()).apply(); + } + public static ExternalDisplayCapturePolicy getExternalDisplayCapturePolicy(Context context) { return ExternalDisplayCapturePolicy.fromName( prefs(context).getString(KEY_DEV_EXTERNAL_CAPTURE_POLICY, null), diff --git a/app/src/main/java/com/foxx/androidcast/CastSettings.java b/app/src/main/java/com/foxx/androidcast/CastSettings.java index 30ca23e..ebe25af 100644 --- a/app/src/main/java/com/foxx/androidcast/CastSettings.java +++ b/app/src/main/java/com/foxx/androidcast/CastSettings.java @@ -102,7 +102,9 @@ public class CastSettings implements Serializable { HD_720P(1.0f, 720, 0), FIXED_1080P(0f, 1080, 1920), FIXED_720P(0f, 720, 1280), - ADAPTIVE(1.0f, 0, 0); + ADAPTIVE(1.0f, 0, 0), + /** Long-edge cap 480p (aspect preserved). */ + SD_480P(1.0f, 480, 0); public final float scale; public final int maxHeight; diff --git a/app/src/main/java/com/foxx/androidcast/CastSettingsBinder.java b/app/src/main/java/com/foxx/androidcast/CastSettingsBinder.java index c860e72..1d473ab 100644 --- a/app/src/main/java/com/foxx/androidcast/CastSettingsBinder.java +++ b/app/src/main/java/com/foxx/androidcast/CastSettingsBinder.java @@ -106,7 +106,7 @@ public final class CastSettingsBinder { bindVideoCodec(activity, settings, R.id.spinner_sender_video_codec); bindBitrate(activity, settings); bindNetworkAdoption(activity, settings, R.id.spinner_sender_network); - bindSenderResolution(activity, settings); + com.foxx.androidcast.sender.SenderResolutionUi.bindSenderResolution(activity, settings); bindCaptureMode(activity, settings); bindStreamProtection(activity, settings); bindAudioSpinner(activity, settings, R.id.spinner_sender_audio); @@ -323,27 +323,8 @@ public final class CastSettingsBinder { readEnumSpinner(activity.findViewById(spinnerId), settings::setNetworkAdoption); } - private static void bindSenderResolution(AppCompatActivity activity, CastSettings settings) { - Spinner spinner = activity.findViewById(R.id.spinner_sender_resolution); - CastSettings.Resolution[] modes = { - CastSettings.Resolution.ADAPTIVE, - CastSettings.Resolution.FIXED_1080P, - CastSettings.Resolution.FIXED_720P, - CastSettings.Resolution.FULL, - CastSettings.Resolution.THREE_QUARTERS - }; - String[] labels = { - activity.getString(R.string.resolution_adaptive), - activity.getString(R.string.resolution_fixed_1080p), - activity.getString(R.string.resolution_fixed_720p), - activity.getString(R.string.resolution_full), - activity.getString(R.string.resolution_75) - }; - bindEnumSpinner(spinner, modes, labels, settings.getResolution(), settings::setResolution); - } - private static void readSenderResolution(AppCompatActivity activity, CastSettings settings) { - readEnumSpinner(activity.findViewById(R.id.spinner_sender_resolution), settings::setResolution); + com.foxx.androidcast.sender.SenderResolutionUi.readSenderResolution(activity, settings); } public static void bindReceiverPip(AppCompatActivity activity) { @@ -551,7 +532,7 @@ public final class CastSettingsBinder { }); } - private static > void bindEnumSpinner(Spinner spinner, T[] values, String[] labels, + public static > void bindEnumSpinner(Spinner spinner, T[] values, String[] labels, T current, java.util.function.Consumer onSelect) { spinner.setTag(R.id.tag_spinner_enum, values); SettingsStringArrayAdapter adapter = new SettingsStringArrayAdapter(spinner.getContext(), labels); @@ -581,7 +562,7 @@ public final class CastSettingsBinder { }); } - private static > void readEnumSpinner(Spinner spinner, + public static > void readEnumSpinner(Spinner spinner, java.util.function.Consumer consumer) { Object tag = spinner.getTag(R.id.tag_spinner_enum); if (tag instanceof Enum[]) { diff --git a/app/src/main/java/com/foxx/androidcast/CastTuningEngine.java b/app/src/main/java/com/foxx/androidcast/CastTuningEngine.java index 74c482a..9740f94 100644 --- a/app/src/main/java/com/foxx/androidcast/CastTuningEngine.java +++ b/app/src/main/java/com/foxx/androidcast/CastTuningEngine.java @@ -54,6 +54,9 @@ public final class CastTuningEngine { case HD_720P: capLong = 720; break; + case SD_480P: + capLong = 480; + break; case FIXED_1080P: boxW = 1920; boxH = 1080; diff --git a/app/src/main/java/com/foxx/androidcast/DeveloperSettingsActivity.java b/app/src/main/java/com/foxx/androidcast/DeveloperSettingsActivity.java index cabcd2b..5e56a22 100644 --- a/app/src/main/java/com/foxx/androidcast/DeveloperSettingsActivity.java +++ b/app/src/main/java/com/foxx/androidcast/DeveloperSettingsActivity.java @@ -34,6 +34,7 @@ import com.foxx.androidcast.ota.OtaUpdateCoordinator; import com.foxx.androidcast.receiver.av.ReceiverAudioPreset; import com.foxx.androidcast.receiver.av.ReceiverAvRuntime; import com.foxx.androidcast.receiver.av.ReceiverVideoPreset; +import com.foxx.androidcast.sender.SenderResolutionUiMode; import com.foxx.androidcast.stats.ui.SessionStatsAnalyzerActivity; import com.google.android.material.textfield.TextInputEditText; @@ -88,6 +89,7 @@ public class DeveloperSettingsActivity extends AppCompatActivity { }); bindAvPresets(); + bindSenderResolutionUiModeSection(); bindWiredDisplaySection(); bindCommercialSection(); } @@ -111,10 +113,37 @@ public class DeveloperSettingsActivity extends AppCompatActivity { findViewById(R.id.edit_ota_manifest_url), findViewById(R.id.check_ota_on_launch)); bindAvPresets(); + bindSenderResolutionUiModeSection(); bindWiredDisplaySection(); bindCommercialSection(); } + private void bindSenderResolutionUiModeSection() { + Spinner spinner = findViewById(R.id.spinner_dev_sender_resolution_ui_mode); + if (spinner == null) { + return; + } + final SenderResolutionUiMode[] modes = SenderResolutionUiMode.values(); + String[] labels = { + getString(R.string.dev_sender_resolution_ui_separated), + getString(R.string.dev_sender_resolution_ui_legacy), + getString(R.string.dev_sender_resolution_ui_combined), + }; + ArrayAdapter adapter = new ArrayAdapter<>(this, + android.R.layout.simple_spinner_item, labels); + adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + spinner.setAdapter(adapter); + spinner.setOnItemSelectedListener(null); + SenderResolutionUiMode current = AppPreferences.getDevSenderResolutionUiMode(this); + spinner.setSelection(current.ordinal(), false); + spinner.setOnItemSelectedListener(simpleSelection(() -> { + int pos = spinner.getSelectedItemPosition(); + if (pos >= 0 && pos < modes.length) { + AppPreferences.setDevSenderResolutionUiMode(this, modes[pos]); + } + })); + } + private void bindWiredDisplaySection() { TextView status = findViewById(R.id.text_wired_display_status); if (status != null) { diff --git a/app/src/main/java/com/foxx/androidcast/diagnostics/CastDiagnosticsLabels.java b/app/src/main/java/com/foxx/androidcast/diagnostics/CastDiagnosticsLabels.java index 7b79c22..f3f740f 100644 --- a/app/src/main/java/com/foxx/androidcast/diagnostics/CastDiagnosticsLabels.java +++ b/app/src/main/java/com/foxx/androidcast/diagnostics/CastDiagnosticsLabels.java @@ -93,6 +93,8 @@ public final class CastDiagnosticsLabels { return "50% display scale"; case HD_720P: return "720p long-edge cap"; + case SD_480P: + return "480p long-edge cap"; case FIXED_1080P: return "Fixed 1080p box"; case FIXED_720P: diff --git a/app/src/main/java/com/foxx/androidcast/sender/SenderResolutionUi.java b/app/src/main/java/com/foxx/androidcast/sender/SenderResolutionUi.java new file mode 100644 index 0000000..19ad957 --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/sender/SenderResolutionUi.java @@ -0,0 +1,107 @@ +package com.foxx.androidcast.sender; + +import android.content.Context; + +import androidx.appcompat.app.AppCompatActivity; + +import android.widget.Spinner; + +import com.foxx.androidcast.AppPreferences; +import com.foxx.androidcast.CastSettings; +import com.foxx.androidcast.CastSettingsBinder; +import com.foxx.androidcast.R; + +/** Binds {@link R.id#spinner_sender_resolution} per {@link SenderResolutionUiMode}. */ +public final class SenderResolutionUi { + private SenderResolutionUi() {} + + public static SenderResolutionUiMode mode(Context context) { + return AppPreferences.getDevSenderResolutionUiMode(context); + } + + public static void bindSenderResolution(AppCompatActivity activity, CastSettings settings) { + Spinner spinner = activity.findViewById(R.id.spinner_sender_resolution); + if (spinner == null) { + return; + } + switch (mode(activity)) { + case LEGACY: + bindLegacy(activity, settings, spinner); + break; + case COMBINED: + bindCombined(activity, settings, spinner); + break; + case SEPARATED: + default: + bindSeparated(activity, settings, spinner); + break; + } + } + + public static void readSenderResolution(AppCompatActivity activity, CastSettings settings) { + Spinner spinner = activity.findViewById(R.id.spinner_sender_resolution); + if (spinner != null) { + CastSettingsBinder.readEnumSpinner(spinner, settings::setResolution); + } + } + + /** Original / 720p / 480p / Auto. */ + private static void bindSeparated(AppCompatActivity activity, CastSettings settings, Spinner spinner) { + CastSettings.Resolution[] modes = { + CastSettings.Resolution.FULL, + CastSettings.Resolution.HD_720P, + CastSettings.Resolution.SD_480P, + CastSettings.Resolution.ADAPTIVE, + }; + String[] labels = { + activity.getString(R.string.resolution_preset_original), + activity.getString(R.string.resolution_preset_720p), + activity.getString(R.string.resolution_preset_480p), + activity.getString(R.string.resolution_preset_auto), + }; + CastSettingsBinder.bindEnumSpinner(spinner, modes, labels, settings.getResolution(), + settings::setResolution); + } + + /** Fixed 480p + fixed 720p + native original + bandwidth adaptive. */ + private static void bindCombined(AppCompatActivity activity, CastSettings settings, Spinner spinner) { + CastSettings.Resolution[] modes = { + CastSettings.Resolution.SD_480P, + CastSettings.Resolution.HD_720P, + CastSettings.Resolution.FULL, + CastSettings.Resolution.ADAPTIVE, + }; + String[] labels = { + activity.getString(R.string.resolution_preset_480p), + activity.getString(R.string.resolution_preset_720p), + activity.getString(R.string.resolution_combined_original), + activity.getString(R.string.resolution_combined_adaptive), + }; + CastSettingsBinder.bindEnumSpinner(spinner, modes, labels, settings.getResolution(), + settings::setResolution); + } + + /** Pre-refactor sender resolution list (subset previously in CastSettingsBinder). */ + private static void bindLegacy(AppCompatActivity activity, CastSettings settings, Spinner spinner) { + CastSettings.Resolution[] modes = { + CastSettings.Resolution.ADAPTIVE, + CastSettings.Resolution.FIXED_1080P, + CastSettings.Resolution.FIXED_720P, + CastSettings.Resolution.FULL, + CastSettings.Resolution.THREE_QUARTERS, + CastSettings.Resolution.HALF, + CastSettings.Resolution.HD_720P, + }; + String[] labels = { + activity.getString(R.string.resolution_adaptive), + activity.getString(R.string.resolution_fixed_1080p), + activity.getString(R.string.resolution_fixed_720p), + activity.getString(R.string.resolution_full), + activity.getString(R.string.resolution_75), + activity.getString(R.string.resolution_half), + activity.getString(R.string.resolution_720p), + }; + CastSettingsBinder.bindEnumSpinner(spinner, modes, labels, settings.getResolution(), + settings::setResolution); + } +} diff --git a/app/src/main/java/com/foxx/androidcast/sender/SenderResolutionUiMode.java b/app/src/main/java/com/foxx/androidcast/sender/SenderResolutionUiMode.java new file mode 100644 index 0000000..3999a0e --- /dev/null +++ b/app/src/main/java/com/foxx/androidcast/sender/SenderResolutionUiMode.java @@ -0,0 +1,15 @@ +package com.foxx.androidcast.sender; + +/** + * Developer-only: how the sender resolution spinner is presented. + *
    + *
  • {@link #SEPARATED} — Original / 720p / 480p / Auto (default)
  • + *
  • {@link #LEGACY} — full pre-refactor preset list
  • + *
  • {@link #COMBINED} — fixed 480p + fixed 720p + full original + BW adaptive
  • + *
+ */ +public enum SenderResolutionUiMode { + SEPARATED, + LEGACY, + COMBINED +} diff --git a/app/src/main/res/layout/activity_developer_settings.xml b/app/src/main/res/layout/activity_developer_settings.xml index 77dbf2b..425605f 100644 --- a/app/src/main/res/layout/activity_developer_settings.xml +++ b/app/src/main/res/layout/activity_developer_settings.xml @@ -45,6 +45,34 @@ android:layout_marginTop="12dp" android:text="@string/dev_receiver_adaptive_display" /> + + + + + + + + 1080p (1920×1080)
720p (1280×720) Адаптивный (предсказание, в разработке) + Оригинал + 720p + 480p + Авто + Оригинал (нативное) + Адаптивный (оценка канала) Видео кодек Тонкие быстрые настройки Bitrate @@ -188,6 +194,12 @@ Лицензии Не могу найти факл лицензий Для разработчиков + Разрешение отправителя (тест) + Режим списка разрешений + Раздельный (Оригинал / 720p / 480p / Авто) + Старый (полный список) + Комбинированный (480p + 720p + оригинал + адаптив) + Меняет список разрешений в настройках трансляции. По умолчанию: Раздельный. Откройте настройки cast заново. USB-C / HDMI (план D) Монетизация (выкл. по умолчанию) USB-тетер (эксперимент) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 769389f..8fb8613 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -46,6 +46,12 @@ Fixed 1080p (fit in 1920×1080) Fixed 720p (fit in 1280×720) Adaptive (BW estimator, preview) + Original + 720p + 480p + Auto + Original (native) + Adaptive (BW estimator) Video codec Cast adjustment preset Bitrate @@ -199,6 +205,12 @@ Licenses Could not load license text. Developer settings + Sender resolution UI (test) + Resolution preset mode + Separated (Original / 720p / 480p / Auto) + Legacy (full preset list) + Combined (480p + 720p + original + adaptive) + Changes the sender resolution spinner in cast settings. Default: Separated. Re-open cast settings to refresh labels. USB-C / HDMI (roadmap D) Show sender status when external display is plugged in Wired HDMI uses the OS display stack, not the cast protocol. If no second screen appears in system Display settings, adapters cannot be fixed in-app. See docs/USB_HDMI_CAST.md. diff --git a/app/src/test/java/com/foxx/androidcast/CastResolutionTest.java b/app/src/test/java/com/foxx/androidcast/CastResolutionTest.java index 2888ed1..251d701 100644 --- a/app/src/test/java/com/foxx/androidcast/CastResolutionTest.java +++ b/app/src/test/java/com/foxx/androidcast/CastResolutionTest.java @@ -11,6 +11,8 @@ package com.foxx.androidcast; * - Cursor Agent (project assistant) * Digest: SHA256 6839d31665eec94c6c24a1a54c86dfaaef483d19196fe6b6a754eb7156c09b26 **********************************************************************/ +import android.util.DisplayMetrics; + import com.foxx.androidcast.sender.calibration.CalibrationSourceDimensions; import org.junit.Test; @@ -27,4 +29,18 @@ public class CastResolutionTest { assertEquals(400, size.height); assertTrue(size.width > size.height); } + + @Test + public void sd480pCapsLongEdge() { + CastSettings settings = new CastSettings(); + settings.setResolution(CastSettings.Resolution.SD_480P); + DisplayMetrics metrics = new DisplayMetrics(); + metrics.widthPixels = 2000; + metrics.heightPixels = 1200; + metrics.densityDpi = 320; + CastTuningEngine.CaptureLimits limits = CastTuningEngine.resolveCaptureLimits(settings, null); + assertEquals(480, limits.maxHeight); + CastResolution.Size size = CastResolution.compute(metrics, settings, null); + assertEquals(480, Math.max(size.width, size.height)); + } } diff --git a/docs/GIT_FLOW.md b/docs/GIT_FLOW.md new file mode 100644 index 0000000..e0a8476 --- /dev/null +++ b/docs/GIT_FLOW.md @@ -0,0 +1,384 @@ +# Android Cast — Git flow (green `master`) + +**Version:** 1.0 · **Last updated:** 2026-05-21 +**PDF:** regenerate with `python3 docs/_pdf_build/build_git_flow_pdf.py` → `docs/GIT_FLOW.pdf` + +This document defines how we develop, integrate, release, and hotfix. **Cursor agents and humans follow the same rules.** + +--- + +## 1. Goals + +| Goal | How | +|------|-----| +| **Always shippable `master`** | Only merges that passed CI/tests; tagged releases point here | +| **Safe integration** | Day-to-day work lands on `next` first | +| **Simple mental model** | Two long-lived branches + short-lived topic branches | +| **Recoverable hotfixes** | Production fixes branch from what users actually run | + +--- + +## 2. Branches + +| Branch | Role | Direct commits? | +|--------|------|-----------------| +| **`master`** | Production line; **green** (build + tests pass); release tags (`v0.1.2`) | **No** — merge only | +| **`next`** | Integration / release candidate; absorbs features until a release is approved | **No** — merge only | +| **`feature/*`**, **`fix/*`**, **`topic/*`** | Short-lived work; fork **`next`** | Yes (normal dev) | +| **`hotfix/*`** | Urgent fix for **released** code | Yes; merge target **`master`** first | + +**Naming:** `feature/cast-resolution-presets`, `fix/crash-upload-500`, `hotfix/v0.1.1-pin-crash`. + +If `next` does not exist yet on the remote: + +```bash +git checkout master +git pull +git checkout -b next +git push -u origin next +``` + +--- + +## 3. Branch diagram (steady state) + +```mermaid +flowchart LR + subgraph long["Long-lived"] + M[master\nshippable + tagged] + N[next\nintegration] + end + F[feature/*\nfix/*] + H[hotfix/*] + + F -->|PR / merge after CI| N + N -->|release merge after CI| M + H -->|merge after CI| M + M -->|sync after release or hotfix| N +``` + +--- + +## 4. Daily development + +1. **Start from `next`:** `git fetch && git checkout next && git pull` +2. **Create topic branch:** `git checkout -b feature/my-change` +3. **Commit** in small logical chunks on the topic branch. +4. **Before merge:** run project checks (Android: `./gradlew :app:testDebugUnitTest` or CI equivalent; backend: relevant tests/lint). +5. **Merge to `next`:** prefer merge commit or squash per team habit; **do not** merge unfinished work. +6. **Delete** topic branch after merge (local + remote). + +```mermaid +sequenceDiagram + participant Dev as Developer / agent + participant F as feature/* + participant N as next + participant CI as CI / local tests + + Dev->>F: branch from next + Dev->>F: commits + Dev->>CI: test + CI-->>Dev: green + Dev->>N: merge feature → next + Dev->>F: delete branch +``` + +--- + +## 5. Release: `next` → `master` + +**When:** `next` is feature-complete for the version, soak/QA agreed, CI green. + +1. Ensure **`next`** is up to date and **all tests pass**. +2. **Merge `next` → `master`** (merge commit recommended for traceability). +3. On **`master`:** final smoke / CI. +4. **Tag** on `master`: `git tag -a v0.1.2 -m "Release v0.1.2"` then `git push origin master --tags`. +5. **Sync `next` with `master`** so both lines share the release commit and any last-minute release fixes: + + ```bash + git checkout next + git merge master # fast-forward or merge commit + git push origin next + ``` + +6. Continue new work: branch **`feature/*` from `next`** again. + +```mermaid +sequenceDiagram + participant N as next + participant M as master + participant T as tag v0.1.x + + Note over N: CI green, QA ok + N->>M: merge next → master + M->>M: CI / smoke + M->>T: annotated tag + M->>N: merge master → next (sync) +``` + +**Versioning:** tags on `master` only (`vMAJOR.MINOR.PATCH`). Bump per [SemVer](https://semver.org/) conventions you adopt for the app. + +--- + +## 6. Hotfixes — chosen strategy + +### Default: **hotfix from `master` (option 1)** ✓ + +Use when the bug affects **what is already released** (code on `master` / latest tag). + +1. `git checkout master && git pull` +2. `git checkout -b hotfix/v0.1.2-crash-on-stop` +3. Fix + tests +4. Merge **`hotfix/*` → `master`**, CI green +5. **Tag** patch on `master`: e.g. `v0.1.3` +6. **`git checkout next && git merge master`** — bring hotfix into integration (resolve conflicts if `next` diverged) +7. Push `master`, `next`, tags; delete `hotfix/*` + +**Why not hotfix only on `next` (option 2)?** +`next` often contains unreleased features. Fixing there delays shipping the patch and risks dragging unrelated commits into production when you later merge `next` → `master`. + +### Exception: fix only on `next` (option 2) + +Use when the bug **does not exist on `master`** (introduced on `next` only). + +1. `git checkout -b fix/...` from **`next`** +2. Merge to **`next`** only +3. No tag until the normal **release** merge `next` → `master` + +```mermaid +flowchart TD + Q{BUG IN RELEASED\nmaster / tag?} + Q -->|Yes| H[hotfix/* from master] + H --> M[merge → master] + M --> T[tag patch on master] + T --> S[merge master → next] + Q -->|No, next only| F[fix/* from next] + F --> N[merge → next] +``` + +--- + +## 7. Protection rules (CI + policy) + +| Rule | `master` | `next` | topic branches | +|------|----------|--------|----------------| +| Required CI (build + tests) before merge | ✓ | ✓ | ✓ (before PR/merge) | +| No direct pushes of WIP | ✓ | ✓ | — | +| Only maintainers merge to `master` | ✓ | optional | — | +| Tag only on `master` | ✓ | — | — | + +See **[§7.1 How to protect branches](#71-how-to-protect-branches-not-local-hooks-alone)** below. + +### 7.1 How to protect branches (not local hooks alone) + +**Short answer:** use **server-side** rules on `f0xx.org` (or whatever hosts `origin`). **Local git hooks** on your laptop are optional helpers only — they do not stop you or someone else from pushing bad history from another machine. + +| Layer | Where it runs | Stops bad pushes? | Good for | +|-------|----------------|-------------------|----------| +| **Hosting UI / branch protection** | Git server (GitHub, GitLab, Gitea, …) | **Yes** | Most teams; use this if available | +| **Server git hooks** (`pre-receive` / `update`) | Bare repo on server | **Yes** | Self-hosted `git://` / SSH without a web UI | +| **Local hooks** (`.git/hooks/pre-push`) | Your PC only | **No** (easy to skip) | Personal reminders, format/tests before push | +| **CI** (build on push/PR) | CI runner | Indirect | Prove tests passed; pair with “required check” on server | + +#### What to enable on `master` and `next` + +1. **No force-push** (no `git push --force` rewriting history). +2. **No direct push** (optional but strong): changes only via merge from `feature/*` or from PR/MR — you merge locally or on the web, but the server rejects `git push origin master` with a normal commit on top without review (exact option name varies). +3. **Require CI green** before merge (if you have Actions/GitLab CI/Gitea Actions). +4. **Restrict who can push** to you (and CI deploy key if needed). + +`feature/*` branches stay **unprotected** — push freely. + +#### If your host has a web UI (Gitea / GitLab / GitHub) + +Look for **Branch protection** / **Protected branches**: + +- Add rules for `master` and `next`. +- Enable: prevent force-push, require pull request (optional), require status checks. + +No git internals required — the server rejects illegal pushes. + +#### If you only have bare git on a server (`git://` / SSH) + +Ask whoever administers `git://f0xx.org/android_cast` to install **server-side hooks** in the **bare repository** (not in your clone): + +- `hooks/pre-receive` or `hooks/update` — script receives branch name + old/new SHA; **exit 1** to reject (e.g. block direct push to `refs/heads/master` unless user is deploy; block all force-push to `master`/`next`). + +Example policy in words: “reject push if ref is `master` or `next` and user is not in allowlist” or “reject non-fast-forward updates to `master`/`next`”. + +Local clone hooks live in `.git/hooks/` and are **not copied** when others clone — so they are **not** team protection. + +#### Local hooks (optional, for you only) + +Useful on your machine, not security: + +```bash +# .git/hooks/pre-push (chmod +x) — example: warn before pushing to master +protected_regex='^(refs/heads/)?(master|next)$' +while read local_ref local_sha remote_ref remote_sha; do + if echo "$remote_ref" | grep -qE "$protected_regex"; then + echo "Blocked: push to master/next — use feature branch + merge (see docs/GIT_FLOW.md)" + exit 1 + fi +done +``` + +Skip with `git push --no-verify` — another reason server rules matter. + +#### CI without branch UI + +Run tests on every push; you still **choose** not to merge until green. Branch protection + “required check” automates that on modern hosts. + +--- + +## 8. Sync cheat sheet + +| Event | Action | +|-------|--------| +| After **release** (`next` → `master` + tag) | `git checkout next && git merge master && git push` | +| After **hotfix** to `master` + tag | Same: **merge `master` → `next`** | +| Feature finished | merge **topic → `next`** only | +| Started wrong base | rebase topic onto latest `next` (coordinate if already shared) | + +--- + +## 9. Agent / Cursor checklist + +Agents working in this repo **must**: + +1. **Never** commit or push directly to `master` or `next` unless the user explicitly asks for that merge/release step. +2. **Branch from `next`** for features and non-production fixes (`feature/*`, `fix/*`). +3. **Run tests** (or state clearly if not run) before recommending merge to `next`. +4. **Releases:** only describe merging `next` → `master` and tagging after user confirms QA. +5. **Hotfixes on released code:** branch from `master`, merge back to `master`, tag, then **merge `master` into `next`**. +6. **Set active branch** metadata when using a named topic branch (project convention). +7. **Do not** force-push `master` / `next`. + +--- + +## 10. Comparison to classic Git Flow + +| Git Flow | This repo | +|----------|-----------| +| `main` | `master` (green, tagged) | +| `develop` | `next` | +| `feature/*` | same, base = `next` | +| `release/*` | optional short branch; default = test on `next` then merge to `master` | +| `hotfix/*` | from **`master`**, merge to **`master`**, sync to **`next`** | + +We intentionally avoid a permanently divergent `develop` without a green production branch: **`master` is always releasable.** + +--- + +## 11. First-time setup (maintainer) + +```bash +# Ensure next exists and tracks origin +git checkout master && git pull +git checkout -b next 2>/dev/null || git checkout next +git push -u origin next + +# Optional: protect branches on hosting (GitHub example) +# gh api repos/{owner}/{repo}/branches/master/protection ... +``` + +--- + +## 12. Private primary + GitHub publish (dual remote) + +**Canonical repo:** your server — today `origin` → `git://f0xx.org/android_cast`. +**Daily work:** always `git push` / `git pull` against **`origin`** first. +**GitHub:** secondary remote for visibility, issues, and (optional) GitHub Actions — not the source of truth unless you decide otherwise. + +### 12.1 Add GitHub without replacing origin + +```bash +# Create empty repo on GitHub (no README if you already have history) +git remote add github git@github.com:YOUR_USER/android-cast.git +# origin stays: git://f0xx.org/android_cast +git remote -v +``` + +Keep **`origin`** = private server. Name the public remote **`github`** (or `publish`) so commands stay obvious. + +### 12.2 What to push where + +| Ref | Private `origin` | GitHub `github` | +|-----|------------------|-----------------| +| `feature/*`, WIP | ✓ always | optional (omit for cleaner public) | +| `next` | ✓ always | your choice: public integration or keep private | +| `master` + tags | ✓ always | ✓ publish releases you want visible | +| Secrets, `local.properties`, logs | never in either | never | + +**Typical OSS-style:** push everything to **`origin`**; push only **`master`** and **tags** to **`github`** until you are ready to open `next`. + +```bash +# After merge to master on private server +git push origin master --tags +git push github master --tags +``` + +Push `next` to GitHub only when you want public integration: + +```bash +git push origin next +git push github next +``` + +### 12.3 Daily habit + +```bash +git fetch origin +git checkout next && git pull origin next +# ... work on feature/foo ... +git push -u origin feature/foo +# merge to next on origin (PR or local merge + push) +git push origin next + +# When ready to publish a release line to GitHub +git push github master --tags +``` + +Set upstream on topic branches to **origin**, not github: + +```bash +git push -u origin feature/my-change +``` + +### 12.4 Where branch protection lives + +| Server | Protect | +|--------|---------| +| **f0xx.org (`origin`)** | `master`, `next` — server hooks or admin UI (primary enforcement) | +| **GitHub (`github`)** | `master` (and `next` if public) — Settings → Branch protection | + +GitHub rules only affect pushes **to GitHub**. They do not protect your private server unless you also configure **`origin`**. + +### 12.5 One-way mirror (optional automation) + +On the private server (cron or post-receive hook), after a successful push to `origin`: + +```bash +git push --prune github +refs/heads/master:refs/heads/master +refs/tags/*:refs/tags/* +``` + +Or use GitHub’s “mirror repository” importers only for initial import; ongoing sync is usually `git push github …` from CI or hook. + +Avoid `git push github --mirror` unless GitHub is a full duplicate of **private** history — it copies all branches and deletes remote branches you deleted locally. + +### 12.6 Suggested order of operations (your situation) + +1. On **f0xx.org:** create **`next`** from `master`, push `origin next`. +2. On **f0xx.org:** enable server protection for `master` / `next` (admin). +3. Create **GitHub** repo; `git remote add github …`. +4. First publish: `git push github master` and tags you want public. +5. Enable **GitHub branch protection** on `master` (block force-push). +6. Continue feature flow on **`origin`** only; publish to GitHub when you merge/tag on `master`. + +--- + +## Related + +- [ROADMAP.md](ROADMAP.md) — product tracks +- [.cursor/rules/git-flow.mdc](../.cursor/rules/git-flow.mdc) — agent enforcement +- `docs/_pdf_build/build_git_flow_pdf.py` — PDF generator diff --git a/docs/GIT_FLOW.pdf b/docs/GIT_FLOW.pdf new file mode 100644 index 0000000..80f2389 --- /dev/null +++ b/docs/GIT_FLOW.pdf @@ -0,0 +1,200 @@ +%PDF-1.4 +% ReportLab Generated PDF document (opensource) +1 0 obj +<< +/F1 2 0 R /F2 3 0 R /F3 4 0 R +>> +endobj +2 0 obj +<< +/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font +>> +endobj +3 0 obj +<< +/BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font +>> +endobj +4 0 obj +<< +/BaseFont /Symbol /Name /F3 /Subtype /Type1 /Type /Font +>> +endobj +5 0 obj +<< +/BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter [ /ASCII85Decode /FlateDecode ] /Height 620 /Length 35576 /Subtype /Image + /Type /XObject /Width 635 +>> +stream +Gb"-6NF*?3^A%XlSa623PLH%Y*(/:FQF(&.J.I12i=s]ie-[UhM@YCchBId4pcuJ(/?`kn0o/^m3%5B$ro0!rVHPN&Ke4TfQL+$Bc?9_9]?Pau#0*$c#uAZrbies$CmSZZf6h4_oB)LPB#a9Ezzzzzzz!!!"LAE<:@pKap?"Han+rp.>5Pkn_e!!":#huQB;UJ8c+"!oX1\A-IXE8/2CH!$Ed7>XYSW\,ZM3!T>5#"i:ECa9i1hOX^np!'jRM\;4+8DufsE!l@C%$A8ceO;/7&iM^!!$.&i?D/'_?Bq\$4%H1.M+345ZU.[LfAqE!R.+C%=75e$do=TRJ*;?ao@!6>KQ(Qg0Y/c\.;5e)VLJT(ViZ9f2_rqQ5kIsd8%=+:,d_?Bpi3$O2u09pt]^Q3hdjde&e,ROE=AtC@Gf)WYk!6>MHK^2k3qg:r?jNck*+^>!ILas#hie)1N!$M8+\;1[4"TX)J"5tFf#T!I@iX^^#p`NfA!/NiN0&hM&!<=8A5e)U\_?Bpip]KJ!4pVr)!9+NBMteE"!!%g>&2)spDufq]r]muL&&JJMJG96*,!H8K!!)!hKT#UJ>Q=b[57fI,K5^hk+T=X9L_%?+!.ahHi?CGk(B=Hp%tol9+C"mHLd)G'ie)1N!$M8+\;1[4"TX)JP@DD"nG.p7nTL&Ck?CWUYag:+4t'>;mkd-)H8^!@_3p9A5"chJZJR2Y52QEp$NL02'F6Wm_S%kd2sO,/L\232KF7b[IL(-LnPJsCM6+@/iGN*I>Q=ap!TYK\-Q[cbW?F`p`A5AJe4r06nF&U2q=SRs"5=]Gfg6OXJQ31=QO+a`nAK5nC*\b,^;&E=.V,s$-aoDZ/\8Vd#gj=F)m5h(q3`H(.6Z4XS"G"Jb0Mc=-eIpg8Ln\i=a`J$Pe6VR#L/Nc;Q8GIfOe7!M,#NUC5LdMi;s"pQ:<4Ap)&+F,4djVu0!.6[GK(_PJp/m#-FeQd=j_^,]Q=-p:LPA)/s+nXFZd[r(i5;`;L'4?Sbfo.A@8bdZaQU-2M@@CpA,Um$TM_?Bpi/WEGWgH=G-8FFF(I/`4pO.YX^nFkpslTCHK:U8G@9UW5IMU,Z"^onnrc\#t=frTItJu.$;N@A,$'+b%fU?.*P/P^BLi<_*$knDe020RWqe2O!NBc,<8TQ*08jr#sBI%I#:h#*GHMq#CJBci`WifGnq!,QL_,2C&)$V!I1',LSDLYB(NLd0,,$[3e&=IN[p;I:N-,BmZXpeupYB)s1Lnh6V//NnA7:ZIpM&/Qu!fa82elmPlKT&e>VDW%b*P.XI3?/1[HikZ6TqM36H`]79(!([-$,$`iI/>=bd[0uG:::U)eC1Q:(E5Fam9`)dH;n(#c5W=lU[+?2Z7qOa8db/efnJ5>Q=ap!G!BZg;Bb1o0)?r?d]uJ@i"Ij#)#WR@gd,XL=DbD1R9o`)7=DdR'pBET"!I0BP&Vs0ngS9[I'2]c024#gbeOInY<,$f:p?p(c[R]&)dQi5ft2_iRU#'?SuUK?of5'/9d9,cM;HO7(>GKrY8'qK@sL?\ot*"f%DRf>atQ.E^PLQA%!s%U,LJ@c!l7[D\E0^6MR<&VY#pq"8I"m95q&en_bf%R1g$H0->(QQK*oH`Zp>AtO!*U2U3%TrJ3L?.Pt5KSq/!k-A6]c!Je60@]1Vf,RM)XnAuQ1frbe8`jVH@Bq"\!!(["Unhrs7Ns]/\J).[*e3,T42YZ-Od5=ZR!Q8iGZjs+ZG+Bq4LE53+hf>tLl8];q$fdcAleHbbhWm!F!N1]2'piffl$(Jadj?ui\0pY,8!!'7"8MT2D2:j/j$"J:%1LK]F2E_U(!!'qV#Zi:h*l#]sJ&7^uo3,Yq9cNK8lA8(!9'ec+C(!R5e)U\_Hd2Z:!#Z1+A%*&&Kc\R38G"6"hW5n`-#L`aK&&etZg,RG#7,#oaj,Vajh6';6,,#ST]71p7>(F0:u/g=:<>U2%TE']Wei?D/'_F5(N#T"`m&2#/,+PbL[e29KjVO:pUf)!3/f>'3.*P]c9npZA%>AMll,RXEt[GQ,IEb?L^Q*GS?Ga3,\c-<"qqSqt#nSbB\L,i;Y]JT*oJk/WO)5c9#D-gDuKOdN,'P@OVd%=;AXN,#$Q\Oi3.qZM!ecJ&'aT#c_PP\fQnrQ<[G'EFZD\l6E.V;9%;:YPAgp:>l2C>A(GkcuSZ1NVKNodU\DX.(Ha-Z362k@\M5%YL@9<(7e+A%*&&ZGijY#W!7;@RP$q^2J6OinhT[bMfuP)Pg?=8=j^Ns:EKG\I+-e>3'lLQj<-%V/GMhKdKl4ju-I6.EPdBfOEgN'kW@e@G$N$k!$0(M@@'Y'6Mcd`,K:h^/mefQ'6eLfAqEf.(%a*3PdFe@lYWY0.94b,)f-Hcq2,q*Vmh>2jb6Y$8Ek#>a5(7$4ZtdBZ!`Ro]!]GB;W-I[`U4@*8T0,#ST]h5G;'$ZcMm:Z"'/iI4ZTbcEC5WE)mT2K)!n[YM4'D7&b1pg&)s2g[b,aAD9s>?>t?;"=b+"\AcKMb"QgG>j/fHarlN\@qA$P@tJ.\UUA;gr7'o[Rp_N'#h`\rPEA^=1[_.j2nEdD\*0jCdfIO7&iM^Rj-Y-3s/*\A)Y(_T/77l`ce,$:cAZrQ+U7$1jHY[m7X7t/Vhq;JZP9F1m4@$E4<.T!I7CW_Vo;]>NdX0h]]7*VHqc5?:db\+jnOdptaH"8gCAX9"pQbJt$]>CZ].JcGfY3CrgD]k?ABX(`[WBKQF+XubDj/cdhSdaS0j8m+dU^Dd5,UO'T8.m%M7&iM^87DYZJg:B67AL9DM^0V\/k?Tt>XYSW\4C'1iIWXYU5kR=Rg4_W5X)BI*KPNVua/i*j4E#F/.XPM&a!AI9"E']Wei?D/gT#(qdLARC!JLmPhhg9^P9dPF2,aT\T4sW;.1eSZH>1aU4#RicheMZTT3\^N38?[R7/>AHqfoa7@,bT2EMkhmO?7@Qns4WS6l3)Bl-4H/[%i:PZ-U9I'Ol(IJs1]ptcOoj0)maF-^\GU5:C0m%a1RDp#Meu0jOlm'bZD-B:Z+c6\n_Ib_&5AB.*/[u#/Vd$YY!%PK+!%qHcL\I2U]7o7pK_TKR(YYiPhl>8A9&%\D^+r;l(H>/2;L^R+p(>oO2dbf%;f/J&%,ldi!JHA%'c@A1p2GNnj21UnKm-er*ghsnbTMe:]"Km?e`\>_Q@eb#hJ^/X0k9+q\I,WQI9R8K>"(LGmr2L#mFGm`LV(Lt1iI"U'T3tDSds(jKP;[67amI,9tTjRojah)nZ:bma3?N*[^Tb5Jj0Q7(S,>ZDCg+aG5f#ISbIq,,BQ&KDa%!\=#u4^F>VR;p:o]"/842)5Z[-gHpZUIhf`4.rL\%gcsh$V[:N3B+5:_K;JUaE1i:959)gAc&5rP@FntfXj.-2sfs,d508'^2)[I7B.P_]Ufla;H`R=GX_/G&j%c25eg*^C-DHY,b7fu.`4LC`(MS".BS^GlG@>eOAB?,2FGBBl#4(dc:&JrU9k'fh<^T7suD<^o&h/ZIs&,[I-.TJjG+LQc>&ZHsAiTA]o[8^?N0+H&5&[(Br95:4B7Wm+tH7C@F.kdutru?B!UgQF9bnW/R0j@>u&9&o:IGZRl&*C8,$jE_(BH_O[B@cTRi&,,:.:mQ7ORk5&JRp>1.hbq5eJD9Q#W+1=QN0!.@1O;[BSR`a7s\;4+HTl=)d_kk6@pV+\_UchuErg.r@+i:A5.i(?`d2$#hVXo0JiMrX&$b*]W5YKUb/!Ih]8rG]Nh+AA!]n&Q+&a,k\B@$jb&^D^n'/"U@5UJb+LfBM1E6GD'kA^BokA^5/6jr1E:WO"LY0n?M,Sf$#$oY)E4611)`r-nBXOR^1I&/osQFGk"g)ghi]t6i8!8(?pp]I0@r6GIpi#FQs)1g19bMC^F7ko[4Vs?lo?09N.+^C+<5e)VLOeH^r1>9"[psSB'&E,7O#1WP9F&f%1]ZG?qU,MbJ>\^r6a2_Ca)_2W>e']Vk(!eG\iJi?##1Z!@TB:F,Gsc#m;UmT\pp4<>he^0aN?@PKj(N"NVdqp+"eYI?D@+bDcVr99^U44suSo.E&ALIl,f=k^DB.n`tD`$ERhL(DX[m8RWBF#EM(_A;Dgqu*Y9qp&g1FIWlS>Q80S/pJg:B67AL9DM^0V\/k?Tt>XYSW\4C'1iIW[5.i]WiBk&R(C1g&#nS^5"N#k3;_en:8.m%M6jSGRiML-.>`^3r\;1\%(W&ng5e%q.J8c)D&2&X*P(@R*q9&8k)E_?EL4KSp+eE$=#$%"o"O":,eU!oZJU.2`C-,RG#7+p>c:E)SM'/k?Tt>XSjN$fRsn+C(!R5e)U]#T(?Pa[!?Y8Utal+V67@mN2f8H*Od`8Yu@LaKH^kO:4CaL_'jdVf0?HDekP1ddjF/S!Fu7b=G>+k>AG4^K^b(\B'Rn\?b,G^]*oMb`(%O!$EL/>XSjN.k;`I!"o]nM[4lQAHd_p5_=Q+&Kq^gXFP6j82(T-+p>cJ'bDtt#ptpjH[B3n?[.;ZC6g#S]/+h0)h%=/cVN3YM7TdJ\*rk_S\kh!hgDdKS9.ng`Wp'iiLOSY?dIl[4ufn=V9dT0MsNA1M9iX2iI[$ki<#*K;F\/,BDk4s=fmr+q>G@-gm@`Y!k]8;)X_<(gX!g$ef8[s)@oF6Qs]]FioXWkr%[P3Y`[miAtRn@s_TDHLd001u/BX1`pR#Th!LR)=jhC__CeI=6LDpjN4DHR$82cD9>Wke#D/DiNCJYIL)U;=Z7NOuc5I`FI53oG1$(?a(tq^*n:Sa>@CL/5_O90ji=8ZZMjfFn7-tqr0=*;9ITZSr@/%okmca;-SLW/lpWUE&Dq7qF[b6R6fa*f3n3e&l-\;*e4@?KRMDB"WD2!'Ed6b?NZ[cuq82)J;>ac#s4CN:gK\WZMpJ&2ML&:@-#-Y8cZdd01rWmT:KV'Eu'7k$JbsRPakg.o+<0rNU3`"*dWQ-;jDApuU%?2_0T7cd@FCA8:ANPBe)(m"1%4l-G*qB,)>"dSVK?4iuf4]7IlF9(F`k[&PQZ"a=!N/Y&*G3F&f!5e$e>QkU2dTA*.ThluHZ+k>[@ADpR._PM\&,-&(S]C8,2$!.:'NA_\ppf"\ABj[.lmbf\]4I%'B>j>H$P=n!De@a$q>2'Hm_eqdfL+O&P1I@t1cq-la[pSuY!5\o/$\SmQJk8Pmd]aI]]K/K797+0JG.o=Er$:"6A]uh#E+96AI`+E4Dmp8)bYG[dKf_`X0=79*Wu6?YPFEnJ#$QYNehA*&\tL>&@UL$T4bO4&!JChGJk6j=;YTuL.q=X>g3.]0l4ahJS^YoHXJls/f`P=Hnu#M5$9(B"iL't!b/PHX?47W&NS1a2Lt^(eYVtnB&sE-BX(V5Q*fiO1ddX6t!E9U_fN]P(!"quJ#hM9%fh\:Mc+QT4fPXaIZk$jXl]&7R)`[F.;7KTPKOiUJBlDbm_mYT`e%:!>\H[h&O4A^%bhnL37(@ef:t5T[/dWUSS8ckjS',hh2L@m!]hk?iHX[Z2$]M:7Vj#?LG/@cU\6uXnDuiK`.3mW';gtLPT!2CQO.H2A$-B+tq1c%O,EGf%b1=k%4u]/-<*0)&Zs$C>q1bAKLRfNa^c2iBF8hW'`Ehb[9jB'BPU_M(W]FNPVE!1A_PXP(R+EbXXIp$1;0b'^PAQHSdmG?Q>BFKSp+eE+K3+$UB;pE"O6)Y,m.m!D"mU/g:G8Pnai_!!rkH7>*q9Z3%lH+Mg=QL_'hn<^=.p,T$e'&H^q6$4%Gu"9[U,66KN9@5aSu>Q>BCKSp+eE+K3!\,[ck#T"'SiQ;K5(OuXPGi=*1s,TBhIn#ST[O)8]7R4H`,a\]BpY,-j0>E,bDs!o0pWEQq8dg:[5_;S3E"PJDKI\Vc/cZ1^_F:7-KI\Vc/cZ1^_F:7-KI\Vc/cZ1^_F:7-KI\Vc/cZ1^_F:7-KI\Vc/cZ1^_F:7-KI\X0%j.C6SX$bn!+Z4cMb"Qg='Etg"X(WH\;4+8E2<`T"X(WH\;4+8E2<`T"X(WH\;4+8E2<`T"X(WH\;4+8E2<`T"X(WH\;4+8E2<`T"X(WH\;4+8E2<`T"X(WH\;4+8E2<`T"X(WH\;4+8E2<`T"X(WH\;4+8E2@.7hRt^$1K%9TJ;f"t&ZGij8dfsT!$iBe(Qg0YY-^I(!$iBe(Qg0YY-^I(!$iBe(Qg0YY-^I(!$iBe(Qg0YY-^I(!$iBe(Qg0YY-^I(!$iBe(Qg0YY-^I(!$iBe(Qg0YY-^I(!$iBe(Qg0YY-^I(!$iBe(Qg0YY-^I(!$iBe(Qg0YY-]0.E+!9i7d;H'O:`$V,#oajBgE7GJ-5u5,#ST]PnjWAJ-5u5,#ST]PnjWAJ-5u5,#ST]PnjWAJ-5u5,#ST]PnjWAJ-5u5,#ST]PnjWAJ-85n4#qS8Eq4]'8:o=Fq^R7L+V67+$0JS?Y.3:^#U2\i/M>=@r@^FM5e$do!'gU9Dufq=J-5l2!WW3#$)"B$Cj$SLoDnplJG=^;/cYkOO8pD.!!!!A!C4-p!!#7cJ8bMh!.Y1Pi;ruZ!!rYB"TSN&&cdRm!!!!E!!jA@!!#Oi&2!q_!0@1'>Q=a(+9Ci`[h$=Z!!!#Y%=5Ma!!#7cJ8bMh!.Y1Pi;ruZ!!rYB"TSN&&cdRm!!!!E!!jA@!!#Oi&2!q_!0@1'>Q=a(+9>G@<6WY58mMT#!.\&2kF[8'L[7$Gn/rIKe5]%ueA$h?!0H3e4fqfZI.>/l*fihV.O=.pJ,>_b^Pi-mONKhu?3iIiKF7b[ETQ_r_`mRe)ipG-SV@65U`d<1/\O\!@1.UgNj&FS2@Qd';T#q7eNC27TWX(k:e-LYJ,58D$=!!'R76/g6ujKs8S,;%ua\4opcE=hR'>Q4$>eE.+)DAGU!6UQ[Ah%Xj`<=3s1Rs4Nj\,ZL?=/^)?dpBnYgb!gLNn<[k&n?j-KVA;?1&A5M[_7n_eTN[KTj0stF$2[(YJF12k\HL+.k)lS2.!bGIW4$,/[m]A>olA#4<<2*<9j-sZCk+CZ/n.".RQc@@5RUTNi%uTlsBcke@:&H_M96l)4HAql'[$KrHWouq]-GhH+%F\W^69i?]E*LHo`f_['dH#!Y=*o3XG>Y($\!n5KN,ZAl-=oh%"\c9*g*4Cn[Ws*H(X]\e3kc(0(B=Hpb%cUQZD=>8i,J=u*BfEC04Uq4d?-%sPGu!]&5?4496\ue:<)!B](`Y_QF:#P9f3^O_#>h;B:S"ABjaJ-9;uFF@B?d"#ig&,d:Kj8]nWPi4@1#N[17tEG3>S+\(&3PosF@PN>9sM1IO%MPfGl)=Pct\RV/l^R;,ph&pqbY]I5#5*%97O&uMYX8;f$;ZIG=:hDkfo>jCFJEhfJE>uOR0TT1(o?+4dRqRq!o9NhdtI6RDGf)ah3!'jdlNGtq?Znp7Y:G)&*C'ZoQ;pP9#/a4`t3H80V?4Bge*I+3sf]4NU:7:G-p[DZM3r])\3P)_`Z'F@Y0b=3Q*uBt3EXOJdiqmpCF6[K[h##t-BJ$^'l([eGX)oMu='iDRqsAqD,(>2J>du-H1tB/rBPW849t8S/YBNFF_;Bsf2IFMV!T=([5[7HOE4Z09$_fB(hOgj*Iqbi%$gbm8JO?pUH'n^pkG0EBQk&sj=4:NQiEr`f\03^8,Cs!P@9QBCU26"k^rZ_/DOp.f=N6^ORFCI2IFMV!T=([5[7HOE-k2[_$F$N010iFJ[%J(?8#7(?>H4nE7#.p*[*.+P:MG\[nA]8)7kSV?b^PQ]&j&a6#10"Ck3mn,sCWqN\Q<_g`"sIGg!Hb:--kk+c?UDV&WBA0XTHrEk1G7jY]&ened_:6%9A/&mjEj[ut>ab(qKbFQ#^D]\XC^#(IF5gO(#K#DV;Ku>e2K#)b@Z>TjCq@&/EVmGg!r/6PcqQiLbU_l(V#Zn$)u:s"V1)4U6/QVYARN)G\GH+f>n/$dFOnT@+,!!!R3W,QGmN&=a4)D]mm@WdXo9ML0od=g73kLHi6es6rLe_4TB3dSBMF)G;=L8o]O!3h_-!8LnRbN#d=&Jo?P(am.'PG[0im]a-Q?];mPgn\H6>A@?qXdXhkG3/SO(:TW=ngpVlSt7QP9J<.K*aKcB1+cC*h@g`cSB$[g/huEa6&/^#],KYJUhc,O;C^Js,-SA20H+@2FYr&HgUuB6_A1bdlhEL`>Q=b[/,YA[H7$>:Jf6u.4O.a(`)n7)86KT2":rR&dEl2FG?0rc]A?jK\=@)od8A=#AqN22pnWQ?N.7`.*&W\hH/]fXq7s/cYmiQ*gtN1$@((CT9u8QBp5OMoB)(d1KtCE#4ElOT=?hp!m,8,2C+T?3((u:6o9QlXE-G5k=I(,,Grg.Fkb-hX792S,`,Ar_#T!I@ielem$VCVd8%905i;s!E>_-iC?[hesKF?`?!'je?E4tJo#(UXn!$JF0\6]G"!/(^[!:f3^loB@^jR7TuH`='-)#C.seA$h?!!#oe?iTuS1G^gbJ+uBM-^T!p]=Y\O/d_RY!(]DER[Sn)DI-Y@eE$Z1!!&u)mGqklBCjq`]A5)^3<0$Z5g%O1geG7_k4''g(:5m)>ZS_r3U4^8]`KFF$BKpM:DP:!#VsY?oq*Z*-aaIu")Te;"D*eY_\QNtXh?RJ2#&6+?oF"9@C)1(T$G!([M0/gBmP\,_&t!9#+W%tk;j8.6%^,4e(0!._ufi?C#fKF7cN$kP$8o0BecJA_HH+u0[^$NN^+&2#0u5e$fE_uSa?1(T$WPCIuOi2?VD'I'$:rqS3S8c;;KRR"B=bQHhDjN%;pfT.8(Iep\qO[K-)PP,O5OOV$eW]!o_-0#T&VK+P`>L\?ZHp)a>HM7-9&>@fkW3.M-LqJ8c*g#JuH,KIa)g\FB[<9u7]!o_-0#WE'RIHCGLL-W8*$%s62#Zk&XE8q1V]=tXuSEXk3V9VHmq*u-X.W`4rV6TMdgF\[C7mRj.H"l:PbIS\c301H"[dDdALa&BiS3*/q5%Wb%om*'S)K.',]o!u1]_'%VpZ\/og4mZU.RM.e9gUq\2`asMCta?H:=\&hhs[msS0YGHiNR(CfrMKNipC9([T2mXZaBkn`WX/D=m#2D;2lFl:4dM_Y/!Jfkqb^??eA(_4QCWU&cP!gl7ac-f6:FHL&tcER+o]<89X2+KDc'ok3"tEf,p:Iscp`g%Ejo5CPJZO:SoQ58``,TAgb,VN%+Rl)Cl4RMn4+p7/4^mBdncgH6][\13f7/_5D*f\/+egTEOJDG20X=Tu[%*t[l:_@-*jPNi"g,9oqed1:_+aM5r8]Gp7*E;I[OXrlr>7=WTslcZ)PfM?9Ljp=8JHu?g3NQE()/eQs6M^W+lD>#FomNEV,n+q3PBncGHnhQ,cqdu+(1nYaRDe8XBprbOJ9?%Y"?TAC=22fY0KUtg8u-2@bu\q+g1!o_9O&8qDrE7^H,$b,n@k;JJ]\2#Ld7mbAV#>ILo)[V0:'*qZ?JT0WSKY+t"?FY>CLU)bGI,]R'P5_O7r:KEMa/M&NHpgKE4kp$LW`RoH'g=r_o;Rob6X[:O&HC&F/GEKWGN46n@fkW3.M-LqJ8j,,eI2-BGKS0CHA7Rm%G-%nkE`fQ'erV4k'MgC+@:=BZAJi0JDEpddEQCa."HV?YK2m.;OV.ec"2Yo$XEeqGWp3]:(gSRB'[Pb@`%;lHD];RrMWe`WP2>%gWu6Gp(n0`*9aH^(HNWT^fh+dJi_FT3YZ.,Grc`Au3B5CQ,4X%tkmc\-b1\_M?")jc-GUg2U>E5#U4iY25SC,`;MjWmU,;pk-f_rVDR9[5ki*;.QU?[Wc*Qqj)SSk)]@l7b!+d*V:R$]sN!_gcaP\`Qp@?I"^RNmQIZ@59G2@It$d`]j,-_E*90kkWVWkME$]cJ[213sL3\tH'O3>]6h:E:i@\EJ\kBc?9Z]qJda%+ap3!_J=JT)3h#JuHl>_VL4)DYU.S3[iVD$;_V/h]BVbIu8j7=BL@JGn>MF'Te`VRoUfW-"sLF5O[^=Is*iI*Z&AR_CGFgmmnnA=^<%:PdbFeGZo5n%61MiMtG(j06i-ptGZ+CXd7LQ7J1\j;ZLH%kKkI55jbQ*&/8E\+J@#VX#>80>&>gB>dgA5OWZ?W&3a#.On\,O1P+64VdKr]5;^ZWIFg!L!5N-%`1qh+C%=sJT,*3mmG6_NfbmXT[1,S)c_r"q7=rAUWL4K@@<9^l#OkC1@!T(T':;(s"aM6E_PG`fh(t6[B!PM=b#=sSLS')CL&e]B-*%CODRt,r'H[kf7tthWXkW.j='qa0:eD7a5S5s,R;1TA0)"8-A`FSi1OlL>tdtGpcWbAlHJ6YfnIW7SQT^(6E/fW&7X\2Kf^"DR@btC>^t[^[eashR^nUs%#\Pu#(0r5&%X%`1q\+C%=sJT,+^8E&!GANh7nO5HFpqG>8Mm"a)L1Xn\qlLNJ9oV4A$T=&=FgDFbZFU32u>U@TFZdsp\OH;_EWC9J!kGQ1YAq]R'_c$9ViW$<`L5dG!X0`FA`)+Ho%417@),d;-hu@Y$:Ju??+q)48Q<0rRnjcD>@bLRMLC%K8YA$P8jiEOa/))Qm>S>e2:C,/8Co`P\9^H4(!F7]P2#EJ!N0Yg;+4Qb-I;u7NIi?(X<\*H58C)MTZo&UW1e@(2pP:47BmR[6(`,d$?\_4EI%\IGC5fr#R#=BYkKe/rcD`^q3gHs18d"EqdN)q51imeo3S;o,G+?.fN1GlWtQaS)ciELs,t[`[$\`o`m*/Xh8OKVIq@baks)'f+eSCgRbs"QYKR'<7D`M>b>e2*8-TSsF^r_A0\m1#4W(/;[B`gehFKhHcWK+ggePOJh1Dp#YmD`&]nXUBe4X$F2b,C+ssj)HR>hJYRR_P)&fIAG,rD:`)\'^;^YgsMY^.2tKC&8iTg<.72'k45;%C%e(`*$7;[s4f[$,cmuGd1EE/mc+NkcK6R/j0&;MCa\mtd[nH_$Lab!*E:Eg^A[bDoo`luRUXHK+m,FNT2Jmi9?Dt*eY\MM;X0e#Km::UQQ'P9pUJn#4FMN<^GHmHAe%q_AibfW6mC$D_X*\L7:>#l[gcW@&Sak:/%#D9-AK<C&B7@PJ!A1,u)o\:@7=h(!$R@Kj!gfg(/)PR,?6C']n8mS)Ng01h@IcRY&;_K+C,'#$VcB\bOH+L#Dt,WURrE7TEWuV%o>tg]>KG//Y)5p4Kkicb_bU`Fs;8Kq.@]F4p=a9Y?8scYh'FH`MYUAW+&M2_Q;<@Xqq2.I6T;oE3pn16a]s-rp:1/iada`"BDi./1gX04qFIZlo5LM5O9t.TVQ`B6/HG7-0SippX_,AjV[=qT4;QLEn)`YhVHF)0BqXLKV,*R91G-)VT"8Yo>V!WE\C,TcoiC;Q3,3pF:.9biPh'8Ge5@/LfcJ`YH+C&%Q_MoYZ,@%f!%hW[qm7cWnB="DAmEc(_Sbf,+Jj)L*:$(0ob@)(o,7WCp]sP7;Rl[%:..4NTOu-JY,#-H))0Da>o^TabJO@duJls^S3jL@;&/@f+IbOSG>N%F])K[H"H=,F`nR_1\B9Ve==#_8bqIL>g2-A?#l!5H\'6N@KO\([hHZYgq("j'@lQS)UV"0U7";("P"i?O)+PcaS4MhQri>-q0gd]]r]1q8\#gq>9VbRDZUYhn4P"C"b[^-XmF=(5"b9.d#(26BSXlX6M[\HoV#>gEO_gXe\:Dh!GQ*ZdmiVfTc8B&]fbeo_1N(Q(>)D5:k=$\lQ_8-E?Jjh#'Y&HhS9iQ-TWkA\IocJd27FuFb]@X32PmC*;SJa2S7GJKN.+Fd@Y&Ak']ji8FkQbr9'Of%p#Sm"0J'Pohf6?!.>escDEcJ`?dN/V:ZmO^PgF7s.di5gf\_hD=dWKRl\@$&gB\;+^,:YLVDW=b__#@Kof9RYo6T_:T-MuS,I;ARWDK%.jY,D+5W>o7_\jQ?q/LU;`*Ra9npUQbU4Dj"@C\h_#)f5FdA^%$))$n@0VY40'g?$DKZS9kTE8sLZNFp$smbtUu3n%6\V(77d3h'>7Rm6,N3^1123t<&ZX]^/OQAR)*%N@$C2AA).jQNoF`JI8$&alKn:6j,SE\oqJ_CA$b9j2NjXeE)[K2*oL&WuH'Z7[>b6n7Zc^8#9T+Z2crl(l0c\i;j+]+om9AJGJ0IO'tnH'Nc]1)uY,U!EOmmG.3&,7!mY,?MA9=13&Tj*FBN:S%?77g`Dqo'1I-\89@I(Dj$YbrTVM*XV7uMDQV1rER''cp>RjLd&S,0PT8Y;GjM;J(bfI1[SkR+05to2,q)V.[uWN`*7:Z#FQKK.CL2Z#I8KPL6I>.A['Q/M$UTLWKV-O'F"u$B:-,Q_kpfN.YaHTR*P_C&oB^dXGb.FnWgE)3jXl*&2p'pE9Nsdlmd[-[j"Bi>l3kYn#87!BDTts4RU\\'I\gTIX#)<;e8BQaurD]NL?&E#ph,qcUXQi^gr&QtI=Y@_#AiPm-gKKJdQ,\u:a993DhM0mNCqLQWggID(d077q[ohA"(>Z9g6ZVhD5gg5KgEV&=`"iB#Z#Y-.#q+3ZdTm5f9d=F]a2A^-3\g>bpUMW%RjQ"!\/*R6fq[3mYQGiKB=(MQr,hLTWUP!$SjIk:Jb7jD/IRt'_e>+:[I\G9ucK-0-sLN\$PjjsQ0iuO;1,=B!2,H6>h;uBL"ld>(Lgq%I2dP0cVhd0D^S39!>2VZ[PbW:ZcZuU@_A5rII+FC]=DNqE:.;ZWRH9>iHNmNZbMmTN&mm+B;8J:"-59Ebj4$EH.MeDE9\68/Ub$05_P?l#RJBADfumCX$^[,nh&GU3Y^*m#kIDu'T!(g8Ia@,;Ki0R:W8AH*pL`"8pP]6uVeYl#!WJI0ftI8dU0;ZO_9Z`Y]UP`s/Nl:4rhrU@=A=V/EBmWfq-IEr3je&XiMII6-@mb)i&8k1)7(>/$#U-B)FCkjJ\>G!S(G9>3`DBdTbTlDq^.#3*Ga\E3p\Fo;s5f4!UU`u`9d^3JXX5'DFmd<%m#S@?4kq?dfD/j@;R-!F_?8]kN\Ga4rCdqSCqpSQ*G6$O?%mcC=.bLbde/MAgku2g@La)dor,2ERX4^]*Rd-@LB`1QlnGE]tXaa&2TkG/*LbRG>g.7[-2M/XPhEgng84$=%C[LS-dC^,$a)+YFE8]=iP53E-sY;^8<6gFAL_u>H`NIB?4/gW(07c]`FDQMb3C'!NdQXOrcJs7+gfJjF;QZf3]>b5&Zs4>^;Q@g>f2QLjD'@',grR@o7Q5>1asU`^nU!&j*su/T)"CJ5E9t3R:3T8[%OO[^k"Q=5Y+C%=sJT,+^,f3hu&!oo85C8iK8UIti__:\%6\J\DRUXZWd?\.BVXsR,>ZE$n>e7!F\u`pacM[M@j/KES?;i>1Q7*N#%YLO3.q]u07-9&>A!/+S/\B&o_tAqZ_rZXp/T`V;O<"[5V)uUeFss)(B3*g'ITaJHil+09YXBhA0-HNhp]B%k41\]-Pg:BD\_=t84m$6"O+iMIY-/gBmP\1pPfiPREYd7ke$?$JQ-52;O+-G>sgf_R7:&!Z2(mc8$9.9$o@IR9:LaSNe']Vk$Dpfo1PuX7>/k]^%/a'R@^B',_)`7?1qT.<+i4r`)`B\guGZf0pG=4,\VE;KU[9Q\;8?2iPm-7K^0/-S*JY(#e:OeC4raYm6FRN)MB%o+P][b`!7&KQ/WbWq`[W7]._/]&8k1)8%?7(Oo4j'n.VI!4gasSn_2Be7nN7K!XL`65e*;NU_<*l.H_aXU$t_t,[)>GQm@`3Br_(!O1q)0q,#qm:"`&2h0#nKa\"k/nH6Ya`$CUeLHWq"LKakAL<&['`<,#<,cQGi1I$"H)/f#[R;4Y6QR'$46b)Xh_MoF>UCDuYHd5qtYkmAHA:1h.O?7(/WR>?.La$'$C2GeeHhnpMF?Y(1rr"'Y2XYPb7$5bEc5k.9IPC2]``mONr*od4#N$>9.baeWHTHoh=iL/8ZfKjpR02Ef,h[j/`&/*Dr.&`rL=`A]-"i//*t5UO%(=U0A*-p`Sr3*?WM-Y,ccLLMUphArF#TBk&oP)0BU=q:1\59q`Sp0)2er&VI%S,+F@D,"7he@6p9=O4>=20UOn"KnLc6&gIQeJk:'K#UFr!]a%?id`DG20X=Tu[%*tW>6nA7>aUE/)nr&a'gSD0F$_rGkS.0Q`X^2$8sJD:[ZkR_h=5XH]**IH9SKm\O>.N`;046RWT7?Yi-]rjR\)7>Thgh5e+*,KH!,ugmAC41J<(]fn=GVeoZ=d=%M5eh2k"Hd:T.Wm.*,9q=WDlBl,s(_+:L'B_*8pgm+)*QTcGCQ@F]/[N[qQr95g'VBX=3Vo?O[pKTo8XG><'A0BZp5e+*,KH!,ugmABaDU+6UFP=>H4A?BgcOr7+)Npi_V#6nK#p3#=Pqh\FjJ_F_PHL3#Blo+:-(/o/Bfq-gc/2ZURA@04][]B,0nNda_SKV7ZQQa0UW%%`WX/DDheP"X2P[)Vb[3,,D@\>q5VMP1l"-\/%0LDVN)YG[uFYKQ=&=^/RkMaA43%s6C>,s%&kZ+O$@Ir?XgD-R7%d0!&Gf%_MnkT/#tqFnH6X&iTSVAcK-Qi?X*(nOuX(k9H[SC"i?6@&8nM&G0JDk.u-@/o*]"1_MnkT/#tqFnH6X&eJ,IbI;gqHj-*sW_MnkT/#tqFnH6X&eauND_7$BNKGtR1=&slkis16qa?1#O9H[SC"i?6@&2#0u5e&P"E+Kai2h"$%Ls,t[`WX/D4X%tkl8#Zk&XE8q1VMo\!lDG7!Js#u\?e)NfO*:j$a^I#GM!l@B:*XF\O5CYW_e)WBsARXpi/B:l7bE+"K^O@F#03r;oi?C#fKF8tZ1G`Mt)PsS5sui#Yj"E_Ls,t[Jqu\%@+0[G&X`m@"VH<)_57=n+u0[^$R,Z2JkZKe7:[GF(ISDC"e-!TMo\!l/r0dd$T9"2(Qitc>S*%Ng"Ba4qU\VH!E'71(Qitc>S%M>E5ACRi?C#fKF8tjHap8orjpTZJE_uo)ABt<8E`6L0m6V+<2ld?+Y8O>m3bJrd3nEs7;X'-.DbkJ,G3u`P\U+P#ns>A,YJtm'"s>?2pqXPCB1i@+0$Ih/i6[?I^Cbl\-4Urului@r?2P[F\`K\dAGG!8i8&D-C,sO$EUlFWi3NTgOT+J:IEnIo7[/^\m1Hp[@!hrVCZ9lN/28I/j0>-Bh$d.KE"_Sj%T!lDq*\>t%B5gY;VJ/$G$Wr[EBIFTE%,rq**QBsh-DWrO9A)&jOJ,O.`P>m14"6rd5eGB^OG@YLigRpV3'+$4t?uIe0%)5Q+RH.KJ*@4<>#f"Tg^Uo?TY%e`qjB"fVk1Oa7!*pI@_DV60lMc%5;"Ie_k,WN-"a!ri&J^]*4/^VK;fP&oj6Tl7^E6aFVOmmM#RDQb0!>UWrO8^r:,ht%)0OifIG6smc>,BX_$`1^615GYF`J@P*t:HpQB,BX`/1HBp^pr=J+/9M[-XG?*+lCORgWN-"A0)Wo-r6+!trcb?B!1QZ"DXJVHpd_'rM8R4biq"(-X/G3qgo[MICg2&[HWrQPP>eYTr[C'$".T.,i2o/0^:!M#193k!!J8fdkMMd^cQDCYbJ@4p&5Q!gNf1TC<.KeWVP-;UrC2Roal71d!KZhitfi_Zh06J!0XI3S=N]A'hWN/Qm+P_Y?p"*RNrqF0o\r-7aih>?s8Qb&'=-'a/[l1LL6qAIl"18Ha&2sk:PmkCX4Q97VrQJ44Y-#DgJNIc77F_l>a[E;=o6l6C3N2*Ajl^d0NU]4EG5,L'%#f@K:9RBKjGBtfNEHIcj3fhZV#btlI96gP&O.k,n?nb,W71-=diKj5^0naBm270a"(R3EoqePDb-.ZcT@D/fj@3,N!3EAdsl\$iK0VkVCe1p)><`sQunN*]64EFi4Z.?`(VQ&(tDJ_%FZIG=:hDn*Iii$aRjZU#JGns&:WMYA1Wi')h5Mbds/#_j0X`_%9\GEi$N35aUTrKW(&4]Nu_r:)[]2t:R7L`n-/Yu)peQ?JmrDa%_L"?mZP*Q`5_pRLfKK:N/L7#)?iUW>jMTcrTN?W7EO`nT#PbtgGDJErcBmWpJc;\RiaIK"`iehR5(E`hd2h\QF1u(Y&Cdfs_]Qibn/ZGdA2)Zl/&V1$[8[ApL6%XKV,Bc9n1ISYL8-:6Ng\SKBo1UqruG'4^MI\_US'BaqhHf_\>f=PRHpsRp77]T"-I[6WH2DF+;,>L!L=:2;=W#b$P8s18i23Kl>_r\'sF/1;rBkal?b%dnQsFl7/Jjmcg*S\e-(?&F/TIs78JT;sGh4=:b6'q7)rBF4m4*gSlT(;n8$5pKIc%df7d\pXeU1P,5d:9t@=H8DiTalO"Jp6G'Eh=4:MF4*4e-qm:qJG(XlS%G.,ZUpc33jfo63YaU)[32NcI\:N\a%!e6B.^_hUYG&*3-CXJBB8FshY>3o!lX+/I.C)G%gK(tX?j\GkF[6A\(da^64Bj.q),LgiB^CCf:8_2MMe(85i\D?mPNHR]K2eY3i^>Lk)A(t->q-O=h*6!<3E.=M.=,&Hs&'ONWMip97#OdGtXDdd7B*#TR^/iA6:sp;u)0q:/&FAs#)BegPq#MR4$p/Y1A_o(LR4opR,cYqqpH(Y:1?VSt>rDRr>+*+tAb*okS,Y1I`hBh0i:iRkRL@iQ];;Ucl&C'ji#cM.-Y"#pC.6>$S7nn6OlO^3iCC`W/4EtJ#3CVMT-[=A]=<9tJ-Nq"KWb/HH7;.?'H)ZRgKYh"u>)GgAdNY_Hl;Af$;d<7'\DG$*cgSXK?Ks!a,>[9E".!Ll_d9n[75AEcM;`HZ^!Ug4"\0OOYmL'[STb=OdBkW,/CCB^]8<\KYf'^29d]e'ZkU@?N.VC1N1O;JtaadM11Jknc)*[$il.#S:kZ*fgOhgirq[`gbZ7frr0i>3[R]+?/8fO3JOLapFij0Vl.qi1578N=#&P9*$8B-n6EGDr@:08Q-.p0bUKX%;RCOH)F"_$_gU'h2I(-?W:MjoT)k7eFFWhE8f6j?`@Uq@>ug*/1)Be=IYUSg=/ob_U-%%FKBGhmlH+@hHJZ\`D[Fur1pJeYJF1:_UA7l7$]@/7M3,3838!)k.CjtmG)9cKY*1eZG/h=75bMZ2Zt*u:&kjn-6eE-jR3LRAMSSf>fVVCEjm.&?cnJGN]^I+RrCg[RI`2&EoEso*5J^7@D\#iT+.:22rB!=4ZtB>'l,/M?Ip,5I@"bs>mPY\(n:-&Gtmp,oQ$.h[^N'?Wj^DjnkLfu^&5A1]8)U:X+tZ-J[*-n9jN^OUf9^oe"N+aVCG/$S1cT^\09'#OLg=W+hlQ^E5P8+E9HF[`Z=l`EgtUnTuNcL`8,u2&X/Vnp]qpR\I1!]WA!'LV'*hKH4.8??b"Ek#U[(t"T;=%BFXm]qj504Uq4d?-%s'/uYKBY%56V69eMYH.]gX89MO&L&S'q60e0n*\TZ?1@a=l,*PF_#n5e8%GJ&rq0Po_Cl31cJ"\Uk:4dFDlYb6-S"d3q[.hnW,4F)Lp:A:/rdl;]iHnjmV2WZAD3_ePaSR0(Y5W3Bhd/6eKI^;Z;*3oOM*ZAW);XZW/QgVHG?HtJnF*9KG"fF7lg!s0g-/4iPUUi8qQ\09#_,[=XE,]30?YNnKXV_0^pI\[dq&?Uii:MC`=Td^"T#\hAIcHC_,:>1^78h*Stae(nT9*423:Rgbf\k8ntRclRE=%!QArolk\XJ,Hf]DE9YYajH?n\6KO?1]R*S&Ban7i\]+]cJ;"gl=iJ,IXXIaSSPeWY/hlNlU`7)=b3hU+`*$T=*"o;e^(e']2abJ'm'&#pC-[IZ*V@>d=`HU.Jt@NXgQc?=m,(bXS(t'[ubR\FE^me=4b6Lg6rXaBs!D(Ktb;m44/k0E.e1k/20l\@/pnSqCfSX@f4u!,M'E&gYn#`JoCb:VN4%!l>3VB=2/t5XLhK]h9e9,AHK`?J\O!:[(WV5_-;#b.phE(^T@+qFgmHOf6VYoVQi.V_,OknBW3GQ*ddEM/(.0LWk.?(b)ITP4oZ)\^]=%j(RohhcKee#]+OG2s74>d00$ZQYB0BG_\JdHi;t[D[uo.^k:7o,Iqc7OEI@G?"?WfoMD,rWOC>N"T%:I4?f,\7oL;BBX1TH*?ae$$#T%a5]oBtm$T_boI*+h3G*SPd7(H=7c%T?;]ZN>KW8glUIpr9jd3Ip:=I!\DFXK?'bJEktIE$PM.<$icQp3JRnFtH!M*^PMUo^(.MflS$gh5"A[-b7DAV3FfskM\A;`HS+M3b45ZqoY'U]Z+h`*^hE1I;?T"a@<[L.3,jb+CG9LCTEumMK8C]OC/G.d6>&`-%CqL<9PD]?_kEBo\9/p^ToD_11tri@8;h%^L]q9J/$tp]4ti!WgAUHnm%^n6p+1k)d(N/smL"/,n]u9;Aues=e<]jf&jt42Q_'@I.NERi>>+Z1F]["jA9X*GR3:9Thre4lH1_C#Na:s3b$\L:@qfXkIX_:(/"\St'>i!f;Z9k/&,f7Qq9o2\8H<(BmonSs'cc1Y.dXE.H:mna`Y/FOZ(mGQA'\Wk0:T,9RAuFFW&f!XhqbpCSdnL,W844QRbjdG&=$ll]3c5A"Aa4O3Jnk+l(:Pa26XlW0L9Xm`bfr[rU$2fr$ZbAqdj@%h.:/7pT_LAufnF27IJZR[]e1#;b]e&8l)($b*I>cs#,BEMfKXmV5Nlic[b:XDkljN6fgB.]oRnEW&-7^C>[`>XIM0EJ<8MM)XI=)IA`!-#R@o*1/[IjEihg'lpjo/nr2Jg(\GE5+Yt'5e*6(o()AEldtn'+q''nRE37AdVPthG4kKpNkLesW[cm2;94lN2KqqNGhD8gE^]W]ebPKIqVY4;/rb*/?+M:W'_#ESC-V=@@DW10/$Fgr\q!HF/'bT]@?N,KQT!!/pjgTI.q+/&8l)($WjDo/;m<<]3db>gidgo,M&odl_?P[>:\cRI:D(+NMi$*J"E:FF/tDfp%&&VCV@5uR$\LFm)M63*=I1q\]6bcXB^-^,YaphiI:XfVgnQlT@C#1lThrtcCb.7kP=rL^$+`J\=&2j7'+G?*gjd8qDd(IN6d&?>GVr"gt\EHA49Y2Yn+9K-%nA&V9Y'mh.TK/puO/Yl#8UqLILSse3qd&NShYjH\MnCmZ!f+@oL(.GgK$>E95hm[j0\2H.n*=VD(GF4"XU"2^ltgnRiYpSRqb4^>.1diPZ>UZIfYNEm@')F#igfoDHk&P:MO-V+IRr?#$F68G;DZAd]:XlP$"WA!@Y&NF@%GV&[9_Jd:@U_[%ds^`%#AP%V5h7\T5OW\TCMR_#pu2[hCY;o7h!K1]qXqOnWGK>59u=Sjp[5"ZVd=iJA__D0!!C*sn<6X3RGDA?+l)H@4$0Kd$(4Q>#WE;#(^u/nhg]##63,@J(G8scIsSq=;!gUC":04@d(V(QJ@d+1+P]3\nW.>.S2kriXP/@.TMb.6^"_&dFS+eEl02oiCY<8Aghj@(["KlL[q*5]fB;`?(DkEAbc"eQ!*Y/$E*dq^7@21T2`IXX/\;4?]1o5@p\NS&=ht"Om`4BACUIpY!2STPpYUJ_R:dEW)aF5d1UV!!/>1n+k3(pXXodr:X/i;op%?@d+3-BP!&C1/Ocb6I!jC5Q\%hl9m97<^Eq&#'4*U+k>m8k.p\1^o#QS7fcnEUlg!c$Q^?7*"TYcro_%kt3crI/p#6S6fg-krEOf=hQlZCY,_g>mgX_"n0+q:17Siq=Ebc(DkW)"mh?0iF.&r!DKZ.0;,>A?!=8^O$EVGm90JiC*J_o-n-U];b6TuDnl7Zcf\6=$D>>ujQ$\%]MMU.Flga\[;,dCA-t+K1T+!=.OlqEm;IKTFtI*+]_0i[YJ0k5g/W[qI.YfVa,_=GXK9A),60u4DV_nsdRu564F"*>[hj5lAiO_Cq;s32]V9Qa+I1@%dA'3m2E*R)DFOWAQJB#l7hC=U#7d7cG7K7n1R8Cb0!r*sX'Gn=:FHo,/1dm+YK'a5!5QM#hqq3?+>l#6J,$o'e?/tNo(LgVe*f_?k+*k)qj]Qc.Y-\iu;^$gBqn+Wkg=#Miq3r7WQcad:59GI^2:`"ElEkC..X#51NN832nl@STtEYSu*9)eLeJ'hPm/6r#acTBu."pP:UAoiBKrUoL.eZK&U!7n]+oB+`4B8oAjB4iSTr]g,/A(1[C5Q3Y)qqZB!#6tbZ3$?tAmbp+^HrKEiZAl'&rq_U5hOn3oS"#o;YZ_#lB(FJR?dU+KGJF%27/r/ppc#t`NS8Md)p^Yd!7]Hg\TAhG_$%!!#R-PMYR(rlKp7o.?m8XV\p*HQeoB[#L1gkkn*;Du\-RCB#"M!&O]kmY*/uMGX[G1mii0?U;1%!&d*PLmA/%!W\Sgi?DG8KF7cf#)%nJ3=meCJ/JnNU?+YM!!$Ur\;6FQi;s"H!T>5+%YP2i?j;:BBK6VV!.Ypu/u%Gm\,ZM@5e)W9"5s:]QiZ.i=q62n!+6"aMeG*^/c^D>&2'^=5e$doAjEk^Q36(I!13fG,$GJ0$NOQ=KSsM(&2!s5)%\EpjZpfkg`5e$doAjEl<*a-#/%;,EIl[hMaGIN?2lB]l=)_t%_g>Zn,*361Hj4/*N-Ajr4fhW$l2!!$Ur\@Web\@ln"dKoIkhqVA(:OfeZX+]]YK3/ElVu#Mp(>g&FQ\K]l:#^_PR36$R*3Y6LVj%,(l"H0tJ\jp.Wm%E1+17043?H+l#3jKF7cf#)'VS;%Tn&FQ\k6+F94bL]MO&:L+M\A]P3qLVc)+\#oWE8,#=ZR0Ui;2d-HIm38)a*t00UQ-t,.a@_aK7`!Q3;JO"8g%@=!&GbQ?&sSVBa1>1M/Q:Y=0*Xb_Ag/tDK08H'U;A"POYnUlTJD)gXQmWYKoLaoE"OZ,_?Bon"2[L6*!d>\^^LJbd;g@7!!"et>XZbdDufs_J8c)P#JpWE0E]0\ZlB>f!5K!K(X[7G>Q=a[+C%=XJT(Vib^aXE/I0,r!&+Ml7C4$?(BD70$l#j',.5pl:-?=pDG2f'MMD7->CJ7?Q+BJP),K^nG,H3^(MZn9rjZ8:IfDW=Q(RINmnQBJs>B:_t*R!cj65e&"k$NOR*7L=8].d;ihmFCqG?kZQI+XTOod9(=l4Xuj.Vq_/EI(;MPI,:M4HuAc@ZeSG*LUI`Ca@dA-9$WI]*8[A6H4+Y-pX/`e`S)AqpsN3[)L0LZN:@1t@BKM)`OH&f8@eHf[6k1YoRkf(s%q<-T`M6@@m#S@-?_W\?dZR"kYm$X[oo6>#_rh-BeT5`rT.V:,rA0EDSpaL<=7B-8.%)N/JW(9AafA9".i;-8W:%Fbg_ifl;-O[Dq_7XZX"c73dDGQDmEoYhY:IHsYAOB%U43bK.4)M;8Fp93:1!3QaWDdi[_bL:GUZ2Ytrd+C"mH1GVS4e9X1gDY9mDV0sj%+haX;n&/ZZK98T;LPes_nMCa`Q"'YpUs:$_.\IDZ'K9:Pm%p/WpKJ'%?"akjVYTLRnliI90!2rZ2ej\,poUfE;XR70DpHA0bXa(5>N)+D`c4f^HQ]l(68R`JDja]`g7,$LX6fZAe>2Z0<r;J/K4Ng`?*-2]"+6>p^(g8ri6MSg.5EDR6Co`#05$5uY/P*0uO/J*>`;XH^,/Vh[nK,Y$>i'[[u)Y$A5e]=Dmi*5]Bd\-dR*\ZnIWjis.$W1n3eE5aF!oAg7:b.p9P!!$VAP]6$hfJQoRX)#57)(J'l@f6'O+iWt;53kRc6OWXT>W9*'/uZ.DQ8LRj*ZDY/O;)Qbr2UT:e\/rMDKrI,2Qem5k,L/iPqF!A.$K/23[9d"Rb$-.f,dPoZ1H)6+e`>no>qq%=5F%mn]!/co?XHEc'1.O;4F^F'`Sq'X1Zb7/J'N7J/K4Nh"\.cBM^*MIWPD'V.ubIY:@fkqLaCW09<@!CF=1Z^cHM"gaHE]4Wk7MUV5(+LR^0ajQp/0e1FK\Vn&P8s=$+j+EAn[DCMoW[)c&lJV/XDt0NSCD0`Enp9CH6.4%iZ.U1kBq:F^dUp+B[LXlFgMHJp@r&aU1u\"b*2tD@&uWaY>[sW7_?Bon,GToB`m7aF(@)jaLFgFl@pC5+%YP2i?j;:BBK6VV!.Ypu/u%Gm\,ZM@5e)W9"5s:]QiZ.i=q62n!+6"aMeG*^/c^D>&2'^=5e$doAjEkB1)-!EC!^?;@WYb34W.'O)2a1NBkEN%BrR1j<9bN1hYt1:cAna;50R=.5Tj;3!&Ga&2G);0j+Lt*bCIb/+pYsg!&+MlAWuLsFSdXAD+bh?"g8Kk,9TLu*;#TC?Et7W$!l+iHc>idnY0[A:cX[VC(21-'GRJXT"*cAq-/hE_rhiJm6=RUgEmr2Y"Y6Ze3l4qK=HJ/Jo9EiAcWT'75hYB(G*rB[?b^T+Y]BOTV"4^R5jGWGt3K:d,F6mki\JiqAAp9klJCt`,51(h3EmhpUu@7`u[:R7GRKRR](59]j.7YN;5jpRZ70d5>s>#K]b[d)]uM6@@m#S@-?_W\?dZZNDM=mCErVhWc@UPn-US[CnC/oB.+Ua&;qI^eUS3^Wu-!W\Sgi?kHW+q`,J=_h%tl"Xt#G32X@:5\e!gYH8'J(;+q5ORt5'ZGMiJ'P+bQ5\ipjreMT^OMuf@TYCJHs*u%/N6nAR-p3E-R'G=ZD#(u`&hSgU7J_q#g4m7;\C6bS[J9nn*1;fKF7cf#)&HcS$:&a0'ZPSb58j[P2-esi>jqK?>%??.kIPX=h).b_pSh_-/U9>bSaM=&n>U"h0g_RAs7qLgiB`$Ms5m65L6DY%q6hQSEcF[[)B]lGY?.b5Ak_\"MtaM=lYX.gT4MV8B7OFMamI>6sI6'm_5C',c`[-9CLqd?nm^1EoI:JT(Vib^aYrA*nNVI<(jqP*+f9h&DWDX>pICgAJ#Alac=_Bbc<%cr+<&)dgb\-]c7#)"_cG!oX1\QiZ.mVeSOBUaU[(pAQpS.RXXZ@`0q7j?9j(&T1lj;8kl>qP"[WX3aaQeRDdeZp1&TD.6B4JQ;G68hW<2J_h9uTX(oXW;<[BO?g;U!+nL+ae?!r"`(5Ae"(`\fG*Ju?X"u"4/c^D>&8pbF3%EU0j1;m463s2roMenL1Xd*<-!ahnf[@miU<^$JdGEUBU7K4["l[mO01_Do+>K7)3)WUW7#ne+$?qDoS#fePhZQp,0rm)Ednb6]c12j8<8T"98Qrlh&.5+%YP2i?j;:BBK6VV!.Ypu/u%Gm\,ZM@5e)W9"5s:]QiZ.i=q62n!+6"aMeG*^/c^D>&2'^=5e$doAjEk^Q36(I!13fG,$GJ0$NOQ=KSsM(&2!s5)%\EpjZpendstream +endobj +6 0 obj +<< +/Contents 17 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 16 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /XObject << +/FormXob.46ad3ff7221c13195234f7d073f6c500 5 0 R +>> +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +7 0 obj +<< +/BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter [ /ASCII85Decode /FlateDecode ] /Height 534 /Length 39093 /Subtype /Image + /Type /XObject /Width 875 +>> +stream +Gb"-6I?5,oSbG3gX&>t?XVu5\mPFd'RYS"LguVQg:[o,((n.^D1:EZGcl/[4ARsuW[c>DsCs^$g=W;-nU9'?k-HKVjnLfJS;2h8XN!MmE9G8Ci*(QF8QLREN6%1!JbDJ_LVM)ks0TsQ_'=]L2O!*TDI8qId39K7qZ!Ioo#V[zzzzzzzzzzzzzz!&.^8HKG'C&"WOX^=,VGjMbJbT/h&1lqqh`GiSSph`cb1fePSabkO91pWXa:7Z:q+Sj3,hdlRo)As,[`Er)nifqZQC1SYamI!XT?N^BV2h]3W1c=?RHBa69'GBr)\O2Sog(S8bKp?1le/WjE?FF%n6*=E:`_c2p@,',0DD*q*IK+%ZZ4GU$CPL4GinA,Di_iNrRQ[Zb@V9Wf&jG;SU"i)f[uRGZs9?_Gk9E('5!;u)T#eqf?A1TQ3LX'771$AU'o#Lt#apL0rV#_`dlReK+=E1VfKYTXHN^`7hq@YUB_Jar0.#%3kT9D0h`kiK#b!2+\?,Xamo@gu)/1Y:4*(&Z4`?fQLs#PPfAH@EqL[t&K/A\^mjF^Zrg)4^W19JDEq6sXn!`)n8-9_M\\-+8_X%lag-?cb2\8NuZ@P7bHinpfp]^fQ4:oTb%0R=5W0,UZ?68#6nB8_,f2JO8;(n(ONdlYCu%?!&^(@[M=:rW'&ac8AFi&/>;m*a`3OqZ,('KD7/-rfffTheedV`pZ"tPE#i@li&\`f]2@fqrFT[1_//nj?_D`#sKPqupbl`N5h*<(pb6A$)n-oL5i>W&5o0=F&2\8NuZ@P7bHinpfp]^fQ4:oTb%0RA:[_#[#Xrd4%aU;3nBCh!hqA^Mc-R./k@$L%/.W]]">I4,jfA%F&_pR<%OS]fP%I[_$FUntcl0K6+4)g1k&H^WJPlfW'[q!UIXb3+PGPB7?%`e!gH"1?Z1[ugmJXg?KL.;%[Nj07Eb3BO/R_:)UN\5TEhs>uBpDd*BEURGPffPpNGKV4XAbtkh@;Yc$NUmB!at@sQ6Y($"--khVka=$?gAGi.jP\$ncrp^N"`nMbq$[E.WTVp$[WtF"]Ql":);+6$(1dcAiCFDr0X$Rg''UXW]48N^_U,&BNG!;BU2V44mD#qO+(%o1PVpZ]5KsjSmld6m-1c*]og)EZr+>#\;3$#IXAf3Fh?O)icRdZYV=pong@'7`sT:nLmX+pVAGBV1JgFJaT0IH6=.PlRl93iQuiM"e%O&&(b>8IBmUf!#)au=2]%X)gg"Vh'b@)KoZcWh^R?b8i"fH[-u-EmTn-AFRh%NjjpcEVN/a&DSuT3<.HdO234S:NmUCNTc0]P)#/mb[_tp]dO)":`2E;b`ku592FI\@$Dt]=[.;]*INnDl#88mrBhG=0ku%DeQeY_nf)DcqeUjHe7L4Jj@W=HsAm[;]:3?)0E1#X&cWlGE$8Ga6KECO\J3`\YF?Rqs11A6>EWHo!%?s3-7ug_tKgHJc2(grk=ue5&MnHe3E?)-3rZVTqQYP(4n^16kmZE]hK:(@E4q&&H6%*!Rp=4UbTdLq*r<_ZSFX>Mog?a6AA5o8@LoZfOlC`f^_pT$>dXd&3'b(oLXnJsaAl_nr`*!4g)(^hT0(nCbaqAo4qklCZ@g&0:rc<6hMlZV[PZXuSCd5gZg4HE7MB(lGaAW9uDpF1Q]l#_k)M\sZ9-BN>bG7P[\lYu4EZ>O@MU$ho^o,Wi'V0MK_$07Pc%X%76KBi!@%=9(T3U13kV\;u]^T5hgA^(9F3HS4L[mu'.:1mlW+5/CkL-jYl2f.r%bUZur;=$-)>0$P8rS8Yb;r'4-A)Q74(aHl/7,A8Hq^"oG^qan#PW+6'Qrc\EP35$aFhAD]c1Wl3Hf=D2gg_TJ&VpYg#,l2g5R3>be1WhGSD_k\Q/G=9[2lE]@1-!l?2DRC:[.oJRfs"k))sV9W=WigNa'cAa0]$QXZ3GZ=Q3[W!C+9D8?u-85EjYU*]7'FBi`ib*/7emnH'l`>"F[q2dgA4E[^GRW._jh,/m]4#rWbJ=Yhd6HfsNnNbs&GEYn23g?^BJ"S/:^6*fqJP#ZSa4c7=!$?8[Qt,kC@eD=%:;+BB$eX(Y?KIO2AXB>&MfpMda)&#B6gutdB]?PK6+2*NrDTC;$o4L!:VG$DbMjkSkG4hr1NHXJKrFe=*[XN;"(c]-b,QU*d:G/.fnRAP.O?Q;r*<(H]u,)>^;qQDO2ZF#U`WGLJ^?\n,"0G4`!L,6kK=$"Vr?./a9*G4`]4jA`g'qYiIOQ3efUODJ`/\bsn'^ZpSH%+[E"]OR/n.I2*"lKjtAhtomt"AGO>3qNu.h:8+meo7bK[8)_cKb6$[XU^MXemjB.*_)3<3LY?KIOT(30Jj:Pk6hD+_<@a0IVK6*p)Iqs(\:+;:DXkn*2ULP'ZFH!.?3@ioNCWcd1Cd&'8Kdk&HeQ3LfaW1`rUqt\#3^u>sXBm]4f$T-)-gs)G#=bgE.l6;$U47AY+DVsh*.pMb1<'AuI+.G?aBcdZ/@,(rYJW)rC`OQ\Y34Hbj(rgS3N@3^HK_7JW_=Ao44r(s#.'O#,b;4tJ0U>3W_su(4(EKT/34oO^\l4kXDuC.O4$7\^'NugfK6H;ET\4`[lg@q8=l-#L1IJOTB?$qXAFXNRZ#Zeh;>*]l%CEPp&BO!DYZmK8]N'Ak+ctKaTKjEVNEsF8h7Xc,;f:fi4a*phq3P8`8Le#/FJ3Q=0f/EI7'cNl/r>KqD%BsXYbHg%;TQ;jpiHg,-mrZ/7n:#]cTDi_QLSRFTh:#dIjWj?[cPpei;d(K>mH3F7aMV=9&+@@jSVNm+X80ZX`Ub3\mpRY%.%Qlnr!/4b8QVblrY'lEu#R%GJWZ?Y\@UE*IST+%27qW?ZB/^YEPuC^qb'h73'@\4,&,"2IomM?%aO\Zt5!A'nnrGe'1?I6kiUYj7V.m3cIldA!?-mZ:(CIi0eeb'-s?2,6/Ms6b`cn*KX1HDG543^Mo3?ILQF)&tc4Ie]>VTXDc@8VO_A<$htUEi_Tk$p*):,1OKD1+0,!0TH/l]uf$:fV4$,J5%ed,H8;G%Z6++&:Z$FTG?+V[?e9iF[gXA^?<`<$2^CTOVfBFBBZl\+K,c0E(Y8L0Ijt#\,b;p)^!h:bI3ZGlN@)RlC!MD!Z,bd8^2Kft,]0.DtRKa$AO6UO,4G!A/^i>I-ccm-ZH7t%]['fS(;],*ZHPgSDb&@q]88Z]W5CbGNI)9$"Q8gh,X;PX5:CneY0h$=(t]@rcI"*CTVS;o?+[$S_[bA__KfQi1PCh]5MKL`q,&G0l:fXUn_Fcr[iNr>oibRJ6K'4(.e9>E+%n>UT90Y1XnWZs#)G7jB+961)P&>?F;OM4;$2@h.=Sm\g=tj/)r?&:WH!]'*rC,^L0H`"&BO!D]N_'lEu#R%GJWdYIhXaSTY3\eBfd*XkOX4+>aIt<&[A*(M)2.]pf^TT&7NL7ARZYKSWd]O&F`^[+YOV@r(FdXeBekG0_O=c\K_\3O#9)YJ\^4ANnQ43s0i>W%J_D`%Ik(,egNA@5NP>-)tK$]gc>=+JJr>Xo\Aki=5W0,UP&HA@B_%HVh=F]/*4+:Y5TS[mFb[%VJj:NG%0R=&)[I_+2\='mZ+`II[/tnI//nj?_D`#sKPqupbl`N5h*<(pb6A$)n-oL5i>W&5o0=F&2\8NuZ@P7bHinpfp]^fQ4:oTb%0R=5W0,UZ?68#6nB8_,f2JO8;(n(ONdlYCu%?!&^(@[M=:rW'&ac8AFi&/>;m*a`3OqZ,('KD7/-rfffTheedV`pZ"tPE#i@li&\`f]2@fqrFT[1_//nj?_D`#sKPqupbl`N5h*<(pb6A$)n-oL5i>W&5o0=F&2\8NuZ@P7bHinpfp]^fQ4:oTb%0RHlqT9lfVKWNu5lUE8`0%"[5*A&*j3oYEGL#j+5oRgKY?s?[T38Kj:i#[Gf]h95HH5ZE&nrKc+3qT?r4L]-BEgK0qc$JSV&b\?iOs?=$Ouu4b?k,GK/Kh4S7bhSesQZV[K[K.j-F+@kXAPl1[q9\YID64e3J(Y\2^[lM`ReNam%:9N&WPpY^6jrp5!,Ae1L`9Urlq`:gZhrhIrGUs/9UA=?*irk1[[]tNml7kS*F_!DY4K`h?0o$d'"3gP0>oSu88+6ktL5P4*k1[gerHs3-5B.kQlr8mG9;gZ7SAih=8Df:$t?iKu:qu:JY9=X0Sma:(@kcb6p5Qt>OLoSr?:^V`V1rFUb6$*kh`g$7hgCGUk=Q=PFC>@^7kG&jO8T=T>+q1fE'Rbm+B:NIsUdmi9Ou6"FtMf^K$qZF76Tp1qOp(9t5T8"$30"h"-uf%0>k6mObWk6$;nF7C*p7^pO@J#qQGe'(?&+$+L(g"L\I8#qQGe'(?&+$+L(g"L\I8#qQGe'(?&+$+L(g"L\I8#qQGe'(?&+$+L(g"L\I8#qQGe'(?&+$+L(g"L\I8#qQGe'(?&+$+L(g"L\I8#qQGe'(?&+$+L(g"L\I8#qQGe'(?&+$+L(g"L\I8#qQGe'(?&+$+L(g"L\I8#qQGe'(?&+$+L(g"L\I8#qQGe'(?&+$+L(g"L\I8#qQGe'(?&+$+L(g"L\I8#qQGe'(?&+$+L(g"L\I8#qQGe'(?&+$+L(g"L\I8#qQGe'(?&+$+L(g"L\I8#qQGe'(?&+$+L(g"L\I8#qQGe'(?&+$+L(g"L\I8#qQGe'(?&+$+L(g"L\I8#qQGe'(?&+$+L(g"L\I8#qQGe'(?&+$+L(g"L\I8#qQGe'(?&+$+L(g"L\I8#qQGe'(?&+$+L(g"L\I8BgJJm]]Abm7#61Y:!4GNS5/7ES;*3R1a3.P@2GO_cG21cQe&f7::##1,Y_M2$7Ga\eVCq$5Tg)O+HXCI5Tm1`Rb*AV%st*?6HQ&;`Y3^Z3NjQ=q=p24[@oi\^N5hH!nf%g+9?[/OMJ:i+K\*eWO[h\V8LcMfFuGR$%Y?BAbqtH,S8$t!i?+%9%ZR)188#p]YEhs?4c9MLDI5dC,[+!akk'RC2QVI@enVY`d[3;^1emNihAaP_QQDt)R4W+/O=EdR;'8'3PY4EsEg44+"E-1JZ\NWT,0/\LJZb\Ik8;+ji:fe/&d$eRACOsiYgL$)OKAQe&o\'W$#BtPdS_>HGr_Zk6r9Vl9L>Rr6>ape:/Q(iKmeiQpqea0\.SgTd9CX[4/g;T,h5^@RFLdFX^l?lHBAJqJ6Pn1_+6-DokK0p;^7-\BMa^>EQLlPP\@&CFB[511(B[h]JLssE\ueh`'5>iO:KQ+^\+Jb='Yl),/1Re3pBfN;CJZd8F!3tcBPOkpmaZ3&P].OSo@pW;EF0A)[(_."!E\U3tOqj>9K#._k5:\7+>"@a0M-ZGk-]A5(O]uH3L&)'s61mg1ZduNgpM=bDn212+e'!<\Na"kY$].FnW@sAK!D[G\L,"6`I^@\C(uboNPtmi;@WR9nBf1=3WKMG1]3)qCrK&tRlJKZZq9bLGa5j93Ec1oZ%;)Dp2nC#OT#3;l."BNgR)"*r'Sr8(.\bXD(P7=Tn`0[g(pnL4Xm=pSXX!.b:.JNs:k!eI]sAHM+VA>j]`;N]0KEnLj_HroQ'FF$_?CT9"6IW7DCC1*G6br/lHoh:]F'T&'4H^R.mht`bID0,t\IXqj%d8@`[SMMRW!_H`/M7stO+9\tZJ3X2(5TkVpJO!Cu14c5:jK*d7@\k5c(<5/i]6jRn$?A*1\=J`^3'CE!cd=2Sh$"i^*ckLdC&&ci[fPl!N!sa6QZYG7H[?9fbS-V:%6*"b%cX+_7DCu%9IpYem%hZ=9f*Wi!ol&fSU2'pgA>kG\CdSMdQDAhu<$.-&[Ig9:)hf]@Q0:73[jq?[^Jk#25M$JYWY4$7:]*/Gi_1&e@Ci*iH(]NXHY7bSBhDE@%2SBX'h#G6S[(+d#%[cKIM=k+gDgil2&!j>>9K=8YhePr3,0YY9[]:NL7<8ER@W_N4E/2s+>p-1kNq&EA&P0AV\i^$+4AIUO$g7g.%G!t?Ed:#9;:GqFj[3Df+HV+8&4g1B%NdmICtUQGHdm$rSXE0km.Q$HLF8[S\-6JI(8:Q]_QJd4QHmG;o`4:XJHXbZ5_?H-d\TUk[r7n!3pJ8'^0FZj7qV:2<_#c=eLVqKKpGo.0QriJNs;)5Ti@>o?9#:/6]EZ!J.'=p\1:@Fis&&!&I:Iau+h&@RcAC>&m9P[/g=8\-%9bmEPM#lPm0#7Pl#@HOG?ERA"C=JSfs'!q&;r5oZ$0A=Bbn;Z();SC%Ec!.b:GZ=M(?J,f7mYOs1S&4jSW#UF(n,*@\4*'+DJWd\#/AaGNCFP?*K!4Dt2$0l*\_M-J_QS)Qis8D],n\uMZcU&`TG9E!?N>WQMW252sQ^CK:$\cH^!Z;K'Vd:#:>_,.lHI6q>M\e$Q^3o_m^\GdC7uur]66H;Q+HW7UTc_:T3h])81*5ofj*"9\YOMKj@+@3]jg4N[Th0#@ir9)D?PD;C)^-Ef,)fsJ&2`37MJO%$;m/XQsVm&J#/6o]hCu9C6p"/)Df3R_J&TA'rE!HFNg)/j'JXiT&ii=3<[0Ha>l:'TA/R#Mp`JPC_K7fA;9+(e-\-%9bD2e"G(f"!P1RX3TgAu*q";95-d\TU93e$?mTDI!&^/XnaX:Rq<*=*p(A('VKYoHN\W`?+Dh?[LZ+HW7&W&f7`!2]aI"FPbc!q&;rJSfs'!m:Xr"FPbc!q&;rJSfs'!m:Xr"FPbc!q&;rJSfs'!m:Xr"FPbc!q&;rJSfs'!m:Xr"FPbc!q&;rJSfs'!m:Xr"FPbc!q&;rJSfs'!m:Xr"FPbc!q&;rJSfs'!m:Xr"FPbc!q&;rJSfs'!m:Xr"FPbc!q&;rJSfs'!m:Xr"FPbc!q&;rJSfs'!m:Xr"FPbc!q&;rJSf*-JP;t_R[.eu`e:3$0oumW\2T9AWhZQ+jRrmJLjR+\2V&3lr(9rm!X\W'JHXbZ5Q]\LI=_%1F'_/Zo'lqHD&%V$o,"Tf#*!eCL0JNs:k@XWh"`,]0Ng05\P8^0[L/KLGIKS69PM;r_6)Q*K)PDh5_0Ak"H"c@DA>tZiDKJfp<7N&`.636@q5Z0%2kG-u@NcJdoh%(D";:2-!XZ@=JHWEX8V*[$j:8(U,")KM7>V6oZ*;i\'iI_V7$0lcY#Hm59d\MWe5BaaT;!aJE/Y(*7)2AoKt<.'O9kaF==iG>7B+##IYjId3iBN@W_>r]%Af4Z/YCEl>'3\Rc!qOPObaVZ7cK:R#=LnaENaOc+=FYFTG_Q+/qKru?RhUeLD5RNKk/Q'#M:R?+jlr&=5oC0\foI!TuoPmB(BtVJP+FY8Z6`jOfmQlCBSH"(mlM^gfLS1\K,3ta(ccq@EJd%D7m3N8+(4f&qX6U+dkXWClV,_H`1.s_!EWWG2kD7%u6g6bQ%T1/B"MC,DNb>uP\;a5p$<=1Ku?:E16\P^@0/4VL67?WH1;sBMsW-SjUdU5p`c);=I^T';n:o/c//Mq-qJIU2qJa0R8>2<_h$=m<.Q$%[7R.:Va+B>!73GG7IHT7VGLu=8>W8ct3"[X>_`IU8UmQ_nG%@NTNGj2&kp-8'\cY"?ro'Hr03HF3Un`,rh?`n/fPt/h2PmTpWFOmr-0UU?8,3ei5cmaqXdU5p`/q),ikcXQ)\Yo5r/pSX&]c#'hELZ@kQoSZLH<:7OgT!^BTk)5T9B9+H[Is1TgEt^ZlQ5f%,5FRKNZup]?!Lgjq]lRkR#ime?T/]s3OQhVQ9oHgKb2WW+0p_'kG-8>(42E?Gnc3Fs[GPmTpWF9RlI]9W=IV)W&A6`2Jl%D*,sl?=NeW\:Fb_)_>\=1BY7Y-;!%b>0R/qLZPXb$^5T9-bPf7cTBL(X`h_cjE2ctMWBUB^+8q2e,T?NZllqKJ],26EtsL#TM,8QsOt6+!q";:2-!XZ@=JHTi6\T?q%;/A]EI6QQ[f`u\Ciira@b7bgA`"I2JHU@O5Q^@=+@-t,Ek/22U":U#]E.`pQq'tn=X*WU#paDb!Af9j^_SP--j[\Q,tij+i2KYQfWu,[^_[8%i!ol&ZnYKc!9k7i/fF6"15#q@VX\mn0*&eWb)s,Wn`"-'Q>PEenWd0^JNs:N5Tg)O+HW7%.23-/p?7X;4[t$g7g9)/n-&k"\-%9bD%(R%.1\*Ne'le;m^qqV]cEaT@Hr+#STgC!,6IuRp]?!Lgjq_B2Ps;!gjJ_'Y">UmTRb`@!;]q0P0+^[i*=*p(Hd80D[qaHnHL:7:qsH8PiPglOFTD(872\.g$GiMhE$(3]_C90hgbZSZWdn*$Nq+3"Tf"?"+^S5@:E[i(_$-1oGFXhMA7W_J,F;m)[l!B";:2-!XZ@=JHWDjFEI/KLE=%kVOK'cdHu*AqWO^C^%\,OD$0h?#ri$<"PePn!ZQ1Uo&Wh#[Ju)UGWu#OQZ%BKaH7^N^](gtN<8$*+HV+,&4jSW#UHW+B?)XQ_>dUKl3JpG";:2-!XZ@=JHWCb!XUCc";:2-!XZ@=JHWCb!XUCc";:2-!XZ@=JHWCb!XUCc";:2-!XZ@=JHWCb!XUCc";:2-!XZ@=JHWCb!XUCc";:2-!XZ@=JHWCb!XUCc";:2-!XZ@=JHWCb!XUCc";:2-!XZ@=JHWCb!XUCc";:2-!XZ@=JHWCb!XUCc";:2-!XZ@=JHWCb!XUCc";:2-!XZ@=JHWCb!biF4[,r(Yq*\&_Ush=ubF7'/Wr[bSI"=NamQ_nGD1Os@75UdMS=W&&`#a6b3NjQ=q7*u;Z4mj@^_[8%i!ol&fG4ag7I\69?:#crPCYt#^-EeAG9E!_[b+D!o9pGRV^8g=#bkN9i^'c6:XaWuTQro)+LsmkptSb"&Rj-91sIHR'IDu8K\.hjfGBJo7@-Le69phDR#dgQ,Be`-DiIiglOFTD(875Zg-BJC*F,*[<&L%7bU;V\H=P2ri$7T_TP$`><7#C]uWp952l+[TP];&P#_uP4QN!Ij3>4P.]k4tQ73Y@8se&:L/\-5UMe2:eeX*MR^PDDmTdlGYn<+SCZC+,?@CAHjGJODdH@ask(`T&"H=?kJU+!?Yq0+^[i*=*pp/TqfKBN?@0S.%GO0)6ZQN$]*[-7Z?WWIdU06,cKF0@.!Z'lpUX_J)'-X.]7?6TLV.>WqaBr@'23Uuip8'1f7Z.;VdBkG"5`GQtaQ21Rpn^-EeAG9E!_[b+:s^%&an#aJF[rQS&R/JHM^U-B6SLo)Jd(8eu%GQToaiEs<7$+d%9p=5nd%bib4u>WeouP#$(U7#;*,W[`9\DLiKoQV(R'JIE@>eeRmNZrJQOGgU"LV0QA7GUsPf.7BC8Y?:X9*ub63"FPbc!q&;rJK=O9YCf:2kS==7o1HAMnT;V/#n!CP#pek[i>P5eRKNZu\-%9bD,2XH>./8#o^.c\b:U2^O,oddG$n5kOFStq8AH5O,\V,QI.PT%DRcBHHXto\qsEd!>7Ief&4jSQ#UJ=<";8(#_-jK%HXsMR4Z1$t5Tg)7+HV+8&4k0fN/W]H?G*ccJ\:[,>8*&='[S%Ti8%A?.i\$u+oRr:KYmRa?UkUp3(sEUhlFko^j\;Z=M^uDglOFTD(8C5?nr+[BB,U=+eUR=4VA-aHjQ;el@$PtG^lg%c]AdnkUn-&k"\-%9bD+q'1fKQe.ncma]6V`dqUki"A+=']jK:.8$@\l,g>IX#Z^\NkD;qQUZ&4jSW#UF(neurFfeHlt_W9/-=l"J1hI)^`<\+BOe"<J#&qV)g@SOFStq8AH5O,\V*##7$_18=[F!1W4@\4_O78";:2-!XZ@=JHY@7-Bjkg?L1kNHL%]"/mU5Z$\07K5Q\Yb+9?[/OJ)!o[r5UUp:,MGni,EM_sFf6Rf\-DI"=NamQ_nG*S@f;>@$sTe'g*84D]2AJUN)7!kpoB!I#ZJ^a;2:e5O@O9V\q/eLK@"%EntW$2=RQ"PePn!rFZ43r8NQJ)*@7Dn+b\mskB7n%JIefe!AN#6G5,!eCL0JNs:K0g7cBMoE>8n'*fKd^+1dcu]0>[;5_is3jb.IGr$HZWdZ"&I9Z?$Nq)]#6G3JbLs.YFRVL1I,4.D!)O..'(?&+$+L(g"L\I8#qQGe'(?&+$+L(g"L\I8#qQGe'(?&+$+L(g"L\I8#qQGe'(?&+$+L(g"L\I8#qQGe'(?&+$+L(g"L\I8#qQGe'(?&+$+L(g"L\I8#qQGe'(?&+$+L(g"L\I8#qQGe'(?&+$+L(g"L\I8#qQGe'(?&+$+L(g"L\I8#qQGe'(?&+$+L(g"L\I8#qQGe'(?&+$+L(g"L\I8#qV"Z"YuXoBj0'p$Y^P&OFTD(875XEOMJ0S=WkEJS6$9/I,+@JZkF!A^`<\+YUpDW?s2hIOIfS"91Y97a(6F]"9]?V#6G3J$Nq)E(@)?=>189X*;>BJE'b+A!Jr58";/<"W6?U0d0\l9gad&A5+u[c0p#4`/mj8;P"QLP&Ke,V0%LufPH+u=!*)7adn'YHPj">8,03M6;4Kemf"r=J$H+SZo;QE*KiFVk5!U4kG9E!_[QksdASDm1'L`Z-\PfCp2ORD4RXm^:1#N\#)YKrT.9K$CZF#KS#+\.4,["\NJP:cflm]>-+8XGp=4JTuSpcW12+d;u'*5cj8$cNQ:8<'n3>\5G*M.9p[AL;;&4jSW#UHW+&4g23>"'Q6T27R6=Cb$Te;^^mY;;COLfKdHl$fI-dK94m17]a2NG%L=]mc<09gnZ?<*`%s.;]+h&o\'W$#BtP&m1H#&]fW4e1:1u,b9/5!pP_UW%M[[Oj#(kfaRI;,u]mf6#)c1=jh>I=pq;eV+lJ*!q&;rJN^Pcl-aA3m,fr`p!DO[q"VAPblQ`I[%or&AkF1[`CVSZRTD(=Nsm>?6uXY?OklL*lRqPH.;]+h&o\'W$#Bcf`M'!!gMaj?Vl+1ukqGsK]jC0fO$A*`,5r@.q6Zk]WnKtGCePS$kG]C4aEZ!)h(KGh/!5c[LcZ31FQG#PS:[UA_5DsVKW_lN6>B5/'-NBe3tOqj'0c3LK.!:=ZELHm(p\&8\mrd@RGCtQG?RidF.+G%'sC$RM5Zk841u4mKE_Q7>gu2DfIOq+GY0DkY=PeC'hjKQM"k85&e@Ci*iH)NMr2Dc8nhUu4!"b5@gWfZ`@I5m;Iq#ZVR-X@8AH5O,d7C>^]4:c%mF[.N]K"i--`+9>glOFTD(8C63%$k+t)O,Rr1[[Ff4^lCZ&!FHt2J3+<5d)Mm1l"9:EEoW-p]?!Los/u@nlp"Bjl\l.H*%AqOJ%R>#(spEQjC:_fc1Sd7aiXLFgi^%!Y@o<(C2:b(]*j7E8e\"YJ7fTY:gfR<_`XG"Ds+fc.'X[BG!Q=%VM`L!X[SMM2@)DDnit?HOP\IAiCga'F5uB$Nq)]#6G4cT(2@@rr2nCmIBVVn%O2FZIs("2?a-gp]?!Lgjq]l4-7^!DnYhpl.b73pYPfHqsU$1C1(BkOFStq8AH5O,d7Rg',/2iYc"D>=<1JE=Rl1HO.4s-@!<`TJ1hI)^`<\+YSEq.UCTN[cqQIT<2kmq\,4QC++1XQN'.X@j+8/)1N7fBJl4RV`n$cu5I,,bVG$+L(g"L\I8#qUuT">V!@Z%pg=-%Ecb'!7gm:$E(_8p*1Mk)&8+KP9W>j9_h%5p[(5^`<\+YUpDW?s.:lO;+"+^T`"Teu]MqnNaT?ni-C<9jadmS+J(.f\c9Vk[jT^'';O;'!>O?>fqKTIa!\V*6\PQ?=Xk4Sa)s-;aO6RBdr'dd"+F`mQ_nGD1OqRb@1^-oK#Q+)N)NLaV,?pai6I8WG#(CO+i0?Ko!%o'f@RE[:o!Z=VD&di53Hk(K7;41`G2]FmE5o5MUYHSR9)1Ja\'^]>MP(n%S\%frYA7)?GBlQGjU@l'=`(7j*E(.AgSUrR>mbaU1r9%[rL2PtY,iN$pk]dgGVe_;tt1U*L$jlufSV*NKrA,nNVo4Gok(P!j&hFQl\^Ji&i@Mikigs_?nHMkbUp-"5/)@9lKR%JA(e/!^]49$c#,TC1Bdmo=I/Xr89!sI5_93-R$`tH\R'Vngi1.?DnPUpfinHlN%dtWr6&IHEc'M4J.;\pn-&k")F.r)PmCtZ*Qho&7uZloVTajfjll`MJ/l[c6fgORP"5Q\Yb+@3]RnA5R@bYTE-YPJWq<[\PP('nn\ST)E2p:%eJQ"2Yl.f-WV%M')VargWP#?H-Dfk4ILjd0=dPp8eZYY$7+@?mJ`ltS%NJlA>jfb<\NTK$'UBfD?#+RNq;OENggd$KAbkR5[[T0'ckk3IYL\#i[9d\X2U>s>=926mR+"09dLYmP=qX3d0=$Jh"O*CtO-lhI[MVs0XnL^1s`9?Un.jY:Qa$f:#\hpPO'GYR2C,[5sD0['C0P%kIC3FS)koF?Hl:*T=(da#pEL^B.H0Ii#1Qs&)t\>/%-:ns@+%Puh:;KiO)hYmT;iZ-(Y">?QXu_NhmGE0sY(=0TjA^@sckq:<$h`@C_eqnWLZA/0M_]kPqB#s&.Tg&(9c`i<+IO'dpX6;W@p2J-:-1'UdoB09<;kNn#X.2A%RT5kQ-`bVm&$)d9[uOJP?AhhO]^nm!U&-lOfs"leX3a!TX8)XBc#muaE`K2q,c@21hV=G757`a=89Zn,[t4rql/jL\gZheE9tGjiWji6JmT%jg1TX/?@.,>um)!R8rI?/?=0_94)-CWnFIopYC&"b#;)!`@>6lg=KG\IY_AHrK^@X6%DsYm+B-(%mTtGX6e]VRoR2mNGl&Drr)^sjf;be.]XtT_CApgb#_\6(BaWV5'2k^r9$;j.f,Y6RPek_7K;GIs14a"3H<`XAZTq:dNu$fqo.o1c]VjU!]hX.d!8cJ/r`lpnl^[LO]?'6=G=2@p'0XB&F@]i!W:gK6k*&hKs$1UIUILOj_K2,fBg`$<2kFLbZQ:ON8j`]tYtAV!)J^-EeA(QKLt[VabWrRWhC]tM,RhL"^tcT[99f"`Ut+G"*T5Q\Yb+9>iha2^RIXD\$S;m3m)AO!^8J:2r5!m:Xr"FPbc!q,F3ni@djB?sg>]-./ZCES_SZ9TN5?QbG\3tOqj>9K$CZ9TN5?QbG\3tOqj>9K$CZ9TN5?QbG\3tOqj>9K$CZ9TN5?QbG\3tOqj>9K$CZ9TN5?QbG\3tOqj>9K$CZ9TN5?QbG\3tOqj>9K$CZ9TN5?QbG\3tOqj>9K$CZ9TN5?QbG\3tOqj>9K$CZ9TN5?QbG\3tOqj>9K$#):Ic>VIc6(:*cr%7<^p-S6RldaFpE&0oumWRU:ETR(-nX$kPtF*=*pp/J(J"0]%'".gT1XQYWhEBIWTB&_TG'nGPr;a$pu8==oS2VF$RIB8gYs_AT!gfL$-*2nV8I2^c;[j9KN0B3R6\&9LdZL_mWH7u*r3[D]>@l-SZ6GfGU0"OK9JqRlH'Y<\^[Qq[aT6n9P9;h:_k&ZJTq\56/=KO68OQ8DoCAb.BI@7N)[L$hW6Ae1l?&nb&2;Tm=OSbCJUA0"g0HVZCeF@,\cpJ!h/pY1KKXEI1.=V_.)sH0CgNr'dYaMpXtH+dq@c;sdup!J%Jl<@M`)e#eikRFZjj*Cmkp2KmDU<$l#>`2;_eO$(KNu&/.-tO8p\\(7?fuXL6;RWE_D?mbuU/ZblXsT";5YY!XWZN"ObFd?Qc(@iguL"d=`6tL8KnpDV,OOil7ijkX#?oc`-BgtWrpoU!XZ@=JHWCb!bl5C09F]FS2Dq:X):k-QqJR\OO*;)3s@@:#1uiYbGh<&&]i(L.gs<@OD:mBOIkJ%4]6P.;Ep+CY<[EoGrB0o-3m1VmIODkNilhP!a0e6[Hab8OKAQe&o\'W$#BtPd`P6j+R)gX\.\m7^Y>T(ooNT^]nrToDO8ug.8crHXAnIWgKAfsX_6'g/bL/`F[l'IO86CBL-5Y%o/$`FFksOH[h%WcF;OPPRo#%kZq@&4jJ\>+FYPg`fU)J[h^PSrd/!L!h\F[Okf5M+9q\\0?3M`LEa.WodiCUht&T'(jk4n,E3D[lkqm\][LtOK3gO=dJ7QK62Ys?UuA-Y&oFrjX.=g@A83P,,+kM$5&g)JQ;l(e680WP/$U`AaqQ[.0J8/63kO9$jcYbJgZ!?Klq8lm:,*askf5\2$RBM?09TF`_`HM[RsLDj"!0$qj_K6SB-8#t8T]O&mt$_G^'Csfk^lEmDNlOT+g3DaV?Ru:I)Xj=NUM[3/J06eD2Cmu=A'cu/IDUnE!HFNm)+Yn-gnM)%T8cbM\^0a[dDk\F(Vlq>U,u2!Yr<5eaM@_+WC.K(?90Q!N6e?,iB.8'%hlTLCZ%B[`lN.Fdu3>-Bg0r]jO<#'f=#Q$@6!_BK-W_\U5R`eZ[8i3?XF!F1NC&@VkdnrW+jia!kWbQ^p!IqBY/J(X\TB?jkig63=2)ZAYDZR'e&4jSQ#UJ=<";8(#ldr=YbT7YLB_?:`!FSBJ5Q\Yb+9?[/OJ%TTA2;E^,K8cEj17)JGQE?uos/,MP(3G^IiTOMXnjRO&o\'W$/1b;,Z=6\URa)9.TRfJ-e()2>&:g/N!X\.Gm]70W?@:ROf<&Dprf;R,A(e1"8AH5O,\UZl"pV(g@F.S$\V0%'$&#+kmSGB/LpNC4L;RH+[fb7m#UH>bI@%?\iPOoa^]*^$mdH`omQ(5K#UJ=<";8'r9:%95l@d9P'MMD=Pj#lQ!g2:+aZiKt#5pN"p3$Gj!J(CH;Ru8]mHp/aC&e22)?^\s!"_]JXqV4sW^96N0b]bGC,V93j`9%!.V!i5RspkdGSU8Z/.:9^$%gOQdrT9rD$VEF$Nq*L0ia9";M!'34NY5_b$gEoA6=k'o0i)tg&nrlY+5Pt>9@l,mc)3DQS2^[C"&r#q0+!DJ1hI)d)N.j[Ap5?VSfQ%U-K"W7hQM-ZB->0c%D+oi6;2G*<;A_'K2nVZ5m"B:CgIGJ,,F\@J=?n'K4kZ";8'r5+f$Y'1Ub&R7dpjO?c>\k_`tm7$)0jjM$'>bh`h;4!9WX?>?Ga!s/e="+^Sl%!B=b:.W&Q*cU5HWGFJnUpGYhF:IoDZ^`<\+BOgW/]I8XAE]>AT"WNg1";93W?XI/?F_!`[!I#ZJTY9$hF([91q=;]^S%T!@N^+^Q^#X2oK4c?hJ3+<5d,%Gi9WVO3[P<-a[V_Mebm--1!X\W'JHXbZ5_?H-[F\aNmHq%-*cJ[X[YkslG6,ng!X\W'JHXbZ5QX"YO2pRl7o9srSig_1X+>\M5Q\Yb+9?[/OME2R17?I:mW6j^a*[6bkM3UhB"&T/)@0lkS3ML$paMp5ep;G:+.\2$(4+^-^:Hg4&9GlT;"KDNS"?,>k='pqT,%&%`JX^SjF05$U[Vjpt`"PqZo+!s8!ilN<+S5[KQ^=/.2Td@3CY&]n&F,"p>Rk('l1i/.fmWJNtFP"p3Hp&4g25+HXCE5Th!M!f>DG#\7F1+G"B\5Q]+1JSZ//,Z8P'OGs9l"L\I8#qQGeZ=+l;8A0R>2?j9sfG4`9K$CZ9TNO"p0Y2)[Kta5TkVpJNs:[!eG/)#UE;d+HVQ`JHWCb!XUCc"L;GYO@['95W/fL'%ds*,d8g2aG,72,4u-Afbb8k?s=b8^p63J)[6A#e/J[(@mD/fD1OqRb6!62(g[:>ddSL8q&S(-`d4t6GlPFZs**Hoa\o70EkQTQHWmI0^YeQGDEDsp`uA=g"L9a)OMJ:i+G"*T5W0#eJR&#A7ohZ7VIdMic":c7gQ1c0nDF7Xim9/J[;*kW:;>K29Vk#*]*\gS@mD/fD1OqRb6!62(bPk=I_.o+C3[`99f&o?359t8:CSAV]JdH#.?O3,!neD%875XEOMJ.e+RA$KVTkM\+$)*c@.dQUj8]+.ric?3pjjaFq;"^T`m=+?^V+d@?iQ,'nZe\#rqN/lHJ(m?F[(+]:<+a%T3T2Z>PXg1$QPe+:fjdscL-^QO*-\Se^:'RfitEqUZ_BTIc+QR?%4`dnZd5gIr\f-UU5\(1K"8.pk-q`s09N$q"VM)O6sIEDm\k3[Y.dBH?WWo1&VNaH=jpeCW3OHP>rE*QIS2JY%o(aMcr6gG3Jl'3F+-F4YA=*hWAd)@R8VdoH's=3OQGp\?nKf?Z>$D\fBF3nT4_/SFtdH5C%?NMqn$reIUI(kk_+Qh`E11gg>3iC9=tHfef*QqcE[_RFUt3ZfoC]rbnQeDS+>Og08)=OONY9]bCCk:O^1>E:hADF_L)%:!8neS6H1',d8j3875RCOEEhmZ=C>U?rk=AmH^?m0)#>$Z=m"Ra!V?gbhm^f#VDG:nK#@#4cb)Si5?fh>#SDe';chr+WoUf)H``rKVPTcga6g?a0O$*ll=N-eAd-s/KYF>q%ArPC"8iT@eVI?g[X)QWJWR%6IctF[iAZ4a5btl*e@[na/D=qsNZeI.GX$T3q`,md]*rNfRsGYP@)7Tfques%OG=;g%&1)?07,Pn2Y+O3W2SP<-9U'RSaW]u.`lHiF'=c8V\a1>hh3[u0H#n#aMeL)3n/(FUrT_Qm1#X:m,MAh&"F%Mu8`Yk''NlPA0bPCer66a9^YUBOP:bUsCl*q$88Z.NV*'LX]hQfq;Q]!?=@@U*/kI9(\(B0e<&4:)hV'=ujnKcA+1b3bYcMT9k*!H6DN9AlMhW=K]K=+*VDXje?FH3u=>G2q-?/ab1ABWT^18Hn7t4$NJ]tlAP+D)lrcdVrfMFq^J2^P_]bR8d>3h&("qX=%Zp5abDLk&j$X"SsXlRh^S\kBZPaaV`*,Qo]1bndA7%*kZj=hfMomss5Xn/QF$#c>M]>a\UF77r',lM2$k?`?S)Qr'lM!Uu:53Ik>D7ptu=j^`BgE_LnO$7Qi/2Lju4PkF3M0RUDD;f4!:/=EtRA*98I5f;%9p-f@omgMP.,@3*>KU6dOa)_iWc[]>*Xa>SR&CpIqqfnnaH)DFI!=7i,IQ4*RdT^WEo@KB^fC(&%?h#G=Z2I]INP3d9l^OE&$(9#GE4S;,/h2jRDE66J%k+lDdOhlQNE27"k:ZEseIr06Yrq\m;UlB^P+t%p>s8>#qp7.I\j!WONh6$GQO)m0a6E&+>6:403QY#E.J[n0!flH?:5BBp?.$Xl!XX`"#UIbK&BJ]S&]j5b%bg`A`UMa'\V&#*IW.!?5a&8>G6As4(ACN%!_G..2d1D)*hFlr^]/WM=Oo49.$:5/IFT*NqTth/Ol!*.p89B@CNuS4^N!b0O*@%+gC6_k;d;:LJY[AqBp+mrEV7[A@cA*.g&5T2@U)l0e`cHSVa-DW,UW",?S1$agL)?0\c3QRA?ljQ#Od*0]tZ*F=H+qjieH#!D%%PKTP/mA!o3p/g_SBOaCd!4&i$J83`rrtmubZ7k)qLf]%+]bDjK'3+.qOta[eA3]^uVF^-t6OW]4LhF@Q%[jN6Dg#o;VW]glr_c02dO,k[:VR1!(JOI'0?l'A8iG>E:FRHr[1;n]ZCK"l]*;5UA@hjn48VDd1XjTm,WbN>9Kbl;%RB<3-94)5:qY#7SgpctDF.SCs*^@kJ2>Xp`m)CQYJW*.O5cu0>6[i`qAV.PY!Vr=Xquouan54C$E`>'FSk4+BOX%JKJ_\&fj*#rs4lE[(HCLumi>(>bcG5'#27p4i!k8#I$*T\1G;.4%8YL1Ie2d>4fnr2jXdke#732!m/);mdVXUIh)IR2^\3LSH1R#P-d5g:qA]?_b]6qQAXV3e?Ec\,[YiKbPG]`W/2a1-C*jJ[-](Oc(JbKP'1hu3;s_NRAkP)"5P/WsR@?>&$lj_to_uG_`MiS?Ui`4,U&AOb2q`A04G92:cQkTgF8u7W*q&dr"mctI1"rOJ3?&/.,Uch=O?g9?+L_MC+D"2[3:OHRVHXZD4M3k^miHJf^N"Fk@c-3hF%OMQFG>)?`hQ>b69L%9l8`sJ\(kHT9*X32AH!1V5\.7e5ppTbU"!>qlb5B)RA/]"hSY!.Rr0b<93NFM3?6^Zp>FfLLTXEFWH;qIX`]I*69[bDGejH\fIFjXOU(M.gcgb1Nn^;Z_T?;oMN@,$]K>63885N>\l09SpH?Z'DVTOJjJC+`^HbC)+.K3RYcbfi]m+;l[X(F2K`>pE-(Y3A)JH5f:ES,uS.,Q'&elo/8>'00O9NPeDdd"Z9V7b-ht02)1p5]`2`JnNG@[:OhatXAOG*^d"@W\$''L):AAK*R+;`@!Zl[k<^AT,!9dSeVnhB+3:ZU"ng"gdWpW\#UH_35TgF:!XX`"#UIbK&BKHS5U+ql"L9^(OJ$9<5Q]aCJLhW^OOJ^WTAQ/b%RKYZ0^+$P('"IM'J0keTN`P#"`rhMnKUPI*smB,8^$n]G=aW0L)tDHpZCTeXXi"J5TiA?!eCKc"Tf"_EoHpb;Gi)D5M!Ch@-7N@"@W\$''L):,[^u_&hjOl$&TK(,g\+S8AGuH,[_)b&elo/8>'00OFSno8AH2N,Uch=O?g9?+9>[hOFT>&85QZY+G"E]5Q\AZ+9?O+OJ$9<5Q]aCJHTe?5Q^(5+@4BVJHWOf!X[K\JHX2J5_>^6!XWrV";7pB!XY4rJHSCL";9o6#UEdc";3Bn!XX`"#UIbK&4jSP#UEdf";2D#&4iHu+HV+*&4jSV#UCg%+HSjt5Tg)3+HV+6&4fX)5TkVqJNs:F5Tg)K+HW70JNs:m!eCJjJNs;!5TiA?!eCKc"Tf"_!eCKuJO"g]"Tf!P$Nq*H"Tf!t"+^SD$Nq++('l0n$Nq(r#6G3h('l24/J(Ig('l0n%KmCY/J(IG>9K#X/J(Ig*!df<=s/nl[m2&:>9K#X3=n_XZp5abDLk%S[Qkr9F!-R;BRrDMh#`-1Ck4hQk!1%TdBWiWEa9Ar^>QLk&B-NLA4rXFeG%:2f^iA7dLo^:8ce=I+Y0jB/bR^30X")*>kQVI!X[K\JHX2J5_>^6!i^u/\E:-N`:[L=m=@O.!Wi\\!eCKuJO"g]"TkYooD"bM&0R(g!eCJjJNs;!5TiA?@ShX2'ZHY?eF%4_#rZ.S;fFZC"d8XkfD*#7m3+-.h"I.$RsZPD;]rD@kmOX%>M+a$L-+VJV]f8L=0pB/e7Q&?I.d2HaId/:V)AHuMU,[^u_&hjOl$&TLN$=m@S`?mSC5'JD3mctAjJm0!]U.S/Yo>J&VqqFH2:g3/B&.I5T?$8M9$2VRlJ[F0cOgb,^q3dN$))?83f1^[LB7)hgjrY`^)=DIdbES>lD\Ku4D=^El:&^5QY\h\Z,TC50Ck8ad:ajs0)"74p`6ERQ(8i:6oQYt]T[VM":BYq!J*f-&;]q0P/J(Ig*!df<>)Xkk1Rk,slj3ISaWX/_lP0'fMWhE)YKq;:-h`M#phYPl*_I):b*8XK.;\kQ=#BBgo>jRoU9,lkitTGV=h+u)DX%1YDp@[An$&!WB9LH+pUfOR_W5"W464A@XGDJQ1Y^qb)dS\@RI,":^CRH1+5<+Z7QmLUJHTe?5Q^(5+@4Ca7"O]nflRSpc.O`Fa4+lI'5*qS_NfA%$Ef>`#pa(S;+Vnpe#/@S+X1'X1_R=J0=N+[AkNlRkbd"`+1AdEG+6`gG:(q2/u%Ds[stj0/iTY6Y`T+;=+0VNG2G)a%(E@PgpWZ#UEdc";3Bn!XXaAM\e$9,*@G-JY2l$-i`g7[J/Hn]C4T^%mTu2>?b;S&GYIaO0ie4%XauCKTBEMZnGE%M>4Wf>kOFq;j8_"-%VjfT1YtGqL\%=nR`\Fc`H=ESEjDRl&`=6,EQHA-?.pZcrhTstr6e9*1O3o^k10N@1gs<+l1FLlEZp<=MA_&:3N#Y!c/R]MCXo?$2p$\ebAs2_,,)77"2[rOPd[7JYN6U$D[T'rh2U^,,Y0B#Mk7"9=^Kd^%Wp%Ys*=^]/`EWt7h;('l0n%KmF2?lBt'Ess`0_TH\U-a8j2VtuSKpS\&A493kU=4a!ehHbK/5Q\AZ+9?O+OC/;\GmL5'.El\T$;Q(GJ]+<+_:=&QUS9fl5Tg)3+HV+6&4j$XU&5M?@'_GpZ6IqK3<`jd^cjB@!/4>/(BJ1V*8:H[k[_+(]fA-j10e"Tf!t"+^S:)m@ko7Nc^M)I+TP&#b7K!k(?:!HTBF?tU.47WUa&1)o-NrqFa25Hj`A!6#3H'!MN@$((gG"?W1k??i.DHec#EfC@nA[;J&S;BV'O/J(Ig*!df<#+g/+WGU>(5o"3fXm^(5'qoq(WB\cQ_lp)Zo>9K#X3=n_XCn*\;H@1+qkO\ZD5Q@qP]C3(+huE2`%sN,;]_^oohgYI)eu]$>!Wi\\!eCKuJO"g]jfA/:;Z+;sq+n+3!^JdX8AGuH,[_)b&elo/8>'00OFSno8AH2N,Uch=O?g9?+9>[hOFT>&85QZY+G"E]5Q\AZ+9?O+OJ$9<5Q]aCJHTe?5Q^(5+@4BVJHWOf!X[K\JHX2J5_>^6!XWrV";7pB!XY4rJHS!DE'[`TGPt=tCK$!hG#DZEe]Q67Q_4601!Nq>4E!utSbU6.XUF;qE:1In0"h/5ld('XH(VFfpcscPBAd-kR^[rq89)X5f(HBG5C2eB)\Y;MG=OtLlIZ&[=n?5Z&(t(*rr0=VfbdTKKARWfJ;r8qY485YKoWTGd@Rm2m^^,3HNnUf>7@slS)T-+$`'1[Lmo)6=pSU^NP`"8=GJ+``UQ-f"lXionmZMqhRht8&j_fI4*r[s)W0R*k9OkJ"Y)I,?;MLK=EjdCuB;4S.E6B3tMF:LF%]MKi"a!`EJgE:S^8/$n2WbrZ9S1W4Hs4L7*Fe0j.D3NmT$(n8"3idVGe&W_j+iA1+bR*LJ5<:\c%cea-4/'[r/.3QCm4heA1WHAB@oA5sD^-(tsk+.,=OPmik"&bC$8OLQ"0iN[c=t!AOTP+!CL=e5[AJ'M>t)b^n]C'o(GtSnUk&ASqTF(hr^,oX9'6`2XtKZi6hASh$HW,5I/V3Dm`rB@q5(KC_stM>sVPMM\j<=[=+ir-R4?,YQ+.CX.u;$>t!rTm`FM0QG1n^F-$Gibl@LQ:UI9tFT26,:Z%Z;>4^$*$HQuK_GJ:YeeM_3+HXSP";9+!+HQl`5TgZIJO$4?!bpFT+;*E6!f=,j";5,^#c)bhON%_4'%(P=O9jT++;)&55cP%jC"trr&`!WmM6IEl&n)^bUj=/F`XN%`d;:"f#hqTe&[m6UWWrT>gcutoh$*q;YRL^J@2fKJH6Agcutoh$*q;YRL^J@2fKJH6Agcutoh$*q;YRL^J@2fKJH;Xo%*#H0.?7pfJ`7G;1iITR)r:JOlG%=m+Aa``r=n=*u7)Ip5GW_Gg9*h>`ma,[Kd(o88!EWuI0<+;K[Y_slX!^$\8D:U?IZ,O9"d.*1X0fIFT'6ZAjd,2aR.hN+(':J]>_=688qB66hMC5`?/EjUiS_9AEo>Xf7bYR#1NP:UY&i#h?Hr)Se\ZYQPX!]gf+o`X?Lr5dcQ&U@AOCt44&<@oE]WR3bl&LRbJNtQg&/RD5_O[72,XPuoc^?j6X5k@X\pNJBD=:'G(Im](+uA2FBW:5PELb'HdFm40k\[L:G/kC#nuE:jEOQ">))7=6`'G$XB[7SRYAO?1Un.IsMR#c(qNa5"Uu`Q(*p(.RT'+u>K97kG]&)5pOTT7fHJ(Q(J@KVY=4eo$&*#Ig$kSbOG,E]_V=6FhBCZ[r%GHlFiO7U+#,!CZ"Z"r9V`Zoc]ASSa\&P!I=36s%R-a\l^0q)Y3c@B*E.rE*;C88311=Xn4KKhQW9P(TM$jUX2:?(KHWV4uA[`FJ/M;q]`hF'bSphP$]FWBKBa$h&#@a-S$m=3'IA8k1thQ]d\Ml?:dHb2RJpo[]3"BXN*)L:rkT?8?#eKb&=Wb$2\:E15g3q=Fgc"rA@s8?N4"=kU?Q4Em!f^n[,hVJJ-/:*,:L4C:25\'*6^3p18_j\LY@Kk+D+C=u]-Vl)Xgnm7P3d+'"W3N=*b]9g!AO&_$Kp5EcXHB71Kh1_X:aL\'F.p';Ek1T$NBI."($am!KD/(2Tl9j5V;!L0tQDNq>$kWc@@MAu$>A_HR@bt!o+o@IlMWIZA4NlSWEQW)hgK12;ED/EFqePtCVoU$C`e?%,UbGK%dk743SgMSZL!HHY-F:I`@;'nmXsLlQ.],MPnpDu6%A(WB=]`n(a82[MMiO*#ShCIq&j+pj\U9f]XShQaYH)`/j3*2CbfLIQCoru[A#5#$lYZu^,D(-fb*cad`I`UVV'!N"Z!JP.-jU`OV/at2_.HJ-9<-[Z#HnAHSO#ZceS8p.FHA2#q^sn:9l^_r&H'Aa5RGNbP?B61,()(isW7oV7'gEX\B0+;LKt*"\QI>gTm&,M'2qO<(s/S;JMtHCkLnC],RgK6_f[QG55kg`PPHA12ERi\Z\P^2^Is!ftu=#1c#\6j$FPQP&bK:L'ZkWTRT_DRdA-L[Nn1`e1kG"POFq\@4D5U.*3HaAefgA_Q7LhO$+Ek[598=pksgRfj?d3;GqWK-*o;29rT!+^;;b7@3LP$BhqnTON&TE5[$fUm8#ZONm8KV)CnGT*&BK*N-IJkNgK%8>jI@HVW>.a,Dd<9";)^Ms/^&YDVQrU2$DdEl1hHVUs;e`9pF;5TXO?G7>;1/"'$Osq%J*69\29S"HZ7Or*u"e#D]1IG;Tc?\To8&c,P/DSlCCH*<5oLpT3`#BmBkDBH-C16?@Ui^`m*k_T*bbQqDUi\A'X!r44:4Z*@&Gi;WA9_7a=rL<#/SERtBP,T/PlsuG9^oY!*.6J(((+_l=s/pl6eO'PX>e*M$\;iK%L&#%)af_sCJ?=!b*JLEpd3R'0A35H9[8%iBd(ff/SDg5(BS;UkQ34#KhT,?ZY#5KeT14D,,@>u/_s%Z#di*Ho&\`=DS,g>at.6s^mZbY>NBQQZ].4fNNW$<^\l;PesLMbYB6AI/:!7`ldHZ+-f!/2(p#Q6S_aREZ+ZZ']p_*"C\&4\5h]HSaLK(mACaMQCc01,hNgFT594b./C/$KH"lh=Z[ALE6o00:Sfs3D23shJPDLYo`tjE5\>>pMetrTPWBSfD86W][l3`jToXHp5+t6GClKO#<5/^;VFb?:Z&KG*,C!\F`4E15l',il&F(Y=5!jl#Nugo7Ec.fNCB.m3cUp;9@1"#!IgD^F7:OH%`#q1$?3PiJl>3Hf^M;7GZo3TsD,PAaf>=Qc#0)dns:A(J#aoBr<`J5To))RRHCNqGtf+A8.g+/oQuV9+[?lP5a]J:7UE;?He^J3`VDXB$\CO"O])Kg;6oZL)R.QP:d68HnnK+X\B0+;LKt*"a[jngToN+,_cR-;DFR@RI`ri:REV!sj.c;kn]oG27W5K0I(+smVS(H"*Ki1VoS-'[hcX#<1_fG$#AVEKWQBB9R^4s:!h%[a<4+^.#)32QTtt:666P;+RRHCNb#VI-AGHQ8Q^%qSoaQ\:QFhH'NmB&6oM5_f%UO%QhGjdfP)"+3JJP;K%dORr(r1Ld3'tP:;TXg@0hb=(TpD^X_WljXg,d\70&YA=G>+H1!3&(.]HlU^)agW`hIYXUi5Rqdl^t\596f_etrWQWBTt1JmuF@[qrK9M'2qOMTYtGUjJj:6@<.WP319Z6c:q@kj4MNt';(10a+;*E6!f=,j";5,^#c)bhODGSfM,p>+j/VZopNHE9Q*/\YhOOUQ+5U$@OGIcVJOJ,p!f=,j"B%Ao8@FqEM4X-LCZTH*2p6[RC2U-I.U?fmJOFT!#UI8F&4hIk+HYm9^Ha!r!eEa])[I_+2@rE4D'4r*JNt,4&4f3uJNtDq"+`km"p1bF#c)GBJOFT!#UI8F&4hIk+HYl>5T2Qm849q<5U("HJOJ,p!i[4HUi?Kf7!'@R,f2GN8;(h&OQqB^)E/3u7(7_4,&@@47+_\FW?)>@E5T2Qm849q<5U("HJOJ,p!i[4HUi?Kf7!'@R,f2GN8;(h&OQqB^)E/3u7(7_4,&@@47+_\FW?)>@E5T2Qm849q<5U("HJOJ,p!i_d]rn*';k;;(\8-+#![BJGUMJHK`=-:Bb5I(&6^>0V]J!p<,SX7+<\q8B+pYW%b&(/%2O95"P4(nS'jJ:?APg5b^C[_8e/'U-\.3QYq554%i@p2rqYos>BkMR/FDb?gUN;Xq9qtM,4/*JJRlKDl!^Oi#_+nOG9O0>[%C0a-i]_CQT0E:H]brZ.Z+MhEgraYY\eeOFp-Qeq.roog4SV%W<2dZ>ik/^:=J[kuT>sJAdIm%f42^dM_le2$i7Z(rb=m7W-&+i0caAEiSY'r-YqR98A=ocfd"hEN]qUFRks68/g%uPiI\T3meWP^=I]/:.u5A>k)5k(pr?O>$g1]4m_:A,]`$CHA"RJlk=D1iF)k"<"61K:GNOkkm-Y:G2dT`Np@kbuXr83+QHkZ!f=[l?4@nc&XieVTX~>endstream +endobj +8 0 obj +<< +/Contents 18 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 16 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /XObject << +/FormXob.ae861d54278dd8d5fef0a4d3516a0636 7 0 R +>> +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +9 0 obj +<< +/BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter [ /ASCII85Decode /FlateDecode ] /Height 587 /Length 43237 /Subtype /Image + /Type /XObject /Width 963 +>> +stream +Gb"-VJ!F(u$gPpNH^l+.T_7XD-hQ0IkL,j[]_8O5]rnkMBJbMC6qXgcIYPk(Uo^.9?%ps\O\E1bg)j.TB^XZ:(j-^P^im,.[^O8nELX3[G"G&>P)iT1`=+!5)/o>oXp:AiXc5Pt=fmpD^ba\g4l%Ps",g%q&eTDR"#1C,c7j\R\G.<#$]`Je[INuZ:/4(7eR1p4Leo&/!3Gi/)5<>9+N0t*?j7e6V'"RLQH-/%O""7&CN-nKX>iSFA!,fc,^nlRZT[bo_:dE\+C6[dLjnZ4bPX:G6hnPmL[h,%jBcW6V'j?8@S4&dYus)U`$^18<5ugFA!,f/KH"jdR-P]Eef`gj:3=rrXdL04bU1aKQKit+jJ(K6CO#uK_5%,8@S4&daA`U/NnbD,BjE-7d^i9it!9+N0t*?j7e6V'"RLQH-/%O""7&CN-nKX>iSFA!,fc,^nlRZT[bo_:dE\+C6[dLjnZ4bPX:G6hnPmL[h,%jBcW6V'j?8@S4&dYus)U`$^18<5ugFA!,f/KH"jdR-P]Eef`gj:3=rrXdM5qt3qR8:Q-7ni[l0&CT!$[#f1io=oGSBk('>\mtRT7m3D<8,pEhfUjO#$WDJQm7XALpCGe[@F&A1n[b:YdlX'pkL@UK?g"NihD>$hF[bcYac?B"SR[.=&^h<b5qmVm>KI77sTfOeIQZQ;GZr#qjt2]_.)MD)b^QLDpDL6.^=U4m\^TDu;d8/nn=?XL8k[;Oe)1!7oR:.O'MV6c+>\#eK6IsCG7T-kh!g8D)5]\QZ`es*[ehYiWY%U\CXFmIU0?*S"HZCl\Se@:d*Y$ssnO7?^KDnk^>2JcME8m'TTSePTqIJ*<1e*9D@G`V9_]HFV"fo'QgYQ'XS/+L$d1bI18EP3/&,C5-r,WK=\C;8TMe/7R-n92aVrTL@@=g)#l^YOM&V960_B7Bt8rj>q7Aae-:Mo9AZgR[<">5uEFj/.8'qSIA(BD\cRVfVC@)$cB"QbO*sTDsnbN`+tgH8[?m>I^h+ChfsEGHF.I=Z(kSmF2U07\A]!T-nd5Cc(.qCgYo&]C^2SSZpdr=Eh.LRNr=c?"N@i]'_T*j8l1NC#,]5>UUZ!VML`(/RC,Lo!JBZS#\FtcD&Dg\#l)O5.P=_EJnMgabtJsGDQ:U,As']3BXK^e"6N%-SO*cesbsaG4CSkICiS)38?_TI9#aqp@C-@iiNYH1i`(QN#8i+YB7%6b7<`Y=aZ:R!!Z>R:hTDXj<8-i3WIOQtQ8q]p0t)4#[VmF?'.r)lhJg4o_"!*>p$fS*K3%S?i'se/^leG%sCUaesCYk=MF+l].o]hpa*7:7HrAL>'VD9`%aGKQIrU?J8h:^_(3bqq:.ZNLr]lD0OM.!LE7[J\-?ZqYQ'ALq]Fhg&)e@V5LCVUXMk;1,o)*c'Zq%e2,]9S^%u!cgr"8gFc73Ba;+Nn2"`EHMhKrO=lmkRGTGAJ(qT4r*Af[T08U!\)o[kQ!ZJ;[sl*0dAAlDLJ8):IYgIU0-@ff?*R)2>DHG*mc"+Yqe,Fi@mHU\T$QQ!(V._!,Oe[qS-lFc9R42q*AVU\bA^nRu0\oS2a+g\OQ-X=X=9DJsP_Dt!\Jm+\k]o&sA*jEE6/eEJf=$b3tAK0u[J+Y?tmLU?g]U:i@_Zob^7>+J:YcjGad+o8b*fl:uC:\=@\F&u;kmoLhtV_;B)r&5)0kL+X*[!7tgL_fJ'+j5?&-a4DD07m4@*TY[[Hnb&p^uWJ>eG-se2+id?[Mc2q)T^q8&9p'h>EseR-.&9265kIq7;U/(&i@=E;:#Z9Q`>gPb5`JAp`uCs.5JFhh6(dMdAobqAa2JJ?qEsUs*)NGbMQp`JT;Io/rEl^>!Zfg(oRlo%Bq3`E=pD7;q:Ek_8$.5A+3^8nl\jRl7)QpK!n!ZNl<>@$2dPbmb>?Vu9l,IbAahs9I5):qBDs%SohWcQmk/^`XFc"$PcN\5\bC$Ae^Ut>(_SPCcLGfKI53u>'Sk+"PD]#.r=nL4D4=?*Ws96e^=n2SMO0?YL"G4ldAN)Sa@G]S^)3;1eW;p@+7P79@qT8>roI(jsEmSg7?M(S[3L;[S?/EYbh7Jn=*%>U%JS[q&PDY,A!rcuq*c)M@%ZYFg@E.3b;4K*K#2G\4_AaIj22;THL@j!Cp.#:P^i(m#VWl]8H7>UOs_D9rj5p$1ZfjVV6aT$1W(;$RZT[b[$4_N461K9f[KK#SL;Jidc1i]h9nY]91MO^oFTH0g``I`2p&u6<+V&-iN2PF%I:pZR1!(lFga1(M`_Yf#jLl7ODa;+Uno<3>C$Qh7d^i9UROE%Fl3%eWA>>MSSc@gOl*KnK5FtFIOp89*e+I[Q6&@r3^UESLQH-/%O'*<*C>)M+f&=g#\iN/l'C$Qh7d^i9N8,SP`udXZV2(.uNf\/C+f$!d6V'"RLQER,#jIWr6C$Qhkm6O>*^ZofQ6&A]OZS4Q,BjFXnV<3Dkolk!,G\Oi#\ccr&CQNm+f*.#6Fs"KOHtogDWr=?)7`+*1NJ84*e+I[Q6&@r3^UESLQH-/%O'*<*C>)M+f&=g#\iN/l'4@g1%O/S9*gMYHRhFjTE;BO'6f]+86CjTh*$Asq&k;ph@i3E3B^,W`uNURreQ5%=>M@7E2haU_a,q?*coU2!IeEo^X%A'5Am1Q$J@cR0B1hR!%eJn,DKp#i)?:0W0j0r(+kef=U4k`jV1d'tk#QV[V4]l.-SR:SiBD]^BUm]8U)lM/?<6O3<"/O)GC-mnY?6gl,*f=,A/bK48?`qq>P36Wf5q;!-g'E(t(6',o$lGN!R4M9kQj6u,*MXQgt(79_%?iU)p*WMFTDMRV.jum?`/[V7Sf%BIqu;%&ou+,jJPRg]:s:WVm=V#n\*KFV`!mbLC%W>Hq>Ucq.IM;V%N_P9\5?;epS4hk#''GPAHQmkN>MdQ9pt&GfrJBEg^OFo6e?LAC*et8)if"L[q//`q-QbO8I^9"K!#:Joo(mD0S,W6!$bLZ;(+B"'c](A6]Ls"$pF;kI7,*rlR\i*:pljZoq9j5-`f^,6S:\DdLjp3gl!ibo<4b^]4[^Abl#'8VPeSj8j7B]ja1Hl8bTZdIX8!DV^JQ684,!r)U]5GYhY-iY0+NPIJq(oL,%#iOah`Sl*"6,Q-)lmqob3D9Y-oIW5u6;jMXC.o44l`HDrC6,RtNU(Bui_66TROPQJ;&d_Fr0,G\bM=W@&rc<>;"6U.iL<)=rcXEYlCG52rEc:K%C?IX&B4QC-O&T=]l%8Zl\>c71f)=d@fm>*W$5BLL5AmK^[FQHaj*u<%@-[%$JgspT4kM)MjQHZo#aKB*>7%DXgJ*3T0):pN"hIYk5F&tSPpQWk9,hDV4\R]B7^Ts`3ID51H98mXl3\J1GEWnmK82o8]\jrO;qWFDdq&PL(\NS+g2F#NX3juqGW@N;nUrii^@f($14#X2g00]8jkNC!%[oIP%rqqe:Q"rIOPBqF)mS.QFo:+&FdZ,t5S'pH/s5qZ%VUjm-CR]_,g8ARFmb,tL\7idcbG('o=5;94k5$aqa#8b0S$m/#%-OF')s9X3>jA7mJM@"_/(Sf%^Q;Xp\Z/K]YXa)NcgTb9RIOnXYoSkJDqO1fh7M4Yj5/4rP\s[R/%YBE6][d`U0-0[\[:OCTBe5q$u!tNT&d2g0+(#[OI5.HB5+Aq6XAp?K?3-[a;;LJIPs;I7LO*dB-'q0%0?8eS_D_;)7S:RafnHkN?3dqm*,lri4MH-`f^,6S:\DdLjp3>ZF<6QR+V^IiF/aOsXr2c!*eA"WZ:%jIWu\>^fhFo:i\eM\hU-c9LTUhKe^g8dmZY\E4B=c4X-fB3ELM7lnQuR+@n8Ci-0%:Y]6@a!)j!-s!L\=S1gcau`Y+C"ungE4q116Fut&f,fq1hne#LE[IT_YL](M$L.-L/`(tQC!WPmM*(L/Wb8PkH'C5BqDlTmo>QlD,HJ@EH@dB;+Vu:2km2!*Xt$5/mWh'=:>2=D[XZU*Pr\Et"/:$],.arOGI0GX*kGcumtOsqmjbg+-ptT2HK-=o[jhR#Rc][cAGNTt)j[jf7(hhP6JAnaa#(h*HB5+AT:>:gmEldM*NYg^WR@U`7iqMiH/X;+TBkrJ;7a-pmd`EnAiVL^.XrL\V*fZ(o_OJ\?QZKI;0'%iG<-_M^3EMEo9/I$rYm"D_%G+WMi`[8KJY5]o8N;d1E;VN<1Oiq=P^;nMW9lB`DGOf)&hR\#5k.g?R-#<[+=_(Ej7P#\dDD.\oLD3h2Q0/A%_+CdZ7g1t\PC[[A)9lFBV$S5n/LPbPNZ7-U*iPC#`r?,!gG82p@SAi8=>m*D;NQB5I\*\Cs8?>Yg[l#jh$nB*i8()4.MN7gB1)$f(C2ecVR_uOG7"n1o)@l@C`D"(54Y^jkXd68K2RHr3f,o.lR73bJ.FIrHnR6U;=RJq<$#ro\?k^o?;;1J&0?,ipm[(5X-FK&d=Y$6(H_DBuj*6q-86Ft:ZXdW-ThRZ`EjG%64Q.EUg^IYI%ef@7Um$Mhb*?B!WSI`6)O0+snp#9,N(LCEQS&`c@gH9CQ>F4GmF'0M06_g>`KaM=(:3#*c#&er@>]-SlK^[,l4ol#Ctm3I?3,!.`"(Zl%li;sCNE8)I/P@(?;9ji*T`W*^0&#>U2:k440NPsN-+ZP>;`67ml@`:X@k5#I-[,X=1$h6Cr_-mG8Pft]CZHP4`t'SGrQt\B[4Rqb-1N??%2>#LKp,-OH$lYV!VXifNlaG\F.aXZG$TY8,HOugYZ>\Y'):E,2DF%Li5j#[6+">rVDp4U:ZB-1X,12#_Y:0NnWC5*9L+E3qmQVVI$]Jd1fkN@eE;"CCnpUMi`[8KJY7Siesl.Dgd,&f,0JDWP(cIb\"[Y>E'H&)pZSVG!4i(IX[a7Z/kc)I*:[H52[?uhZRj]r+/5,dZBBKL3/)*/4W7#a/Y4R?21[@X`4flE-M!"D2VHO1@:!,E&oXIh0Q@(>p?'l4@0s,&^lc$OG;j&l#Z.>U6&^Pd,pp(^X20GBhO2B"sFGd#\ch"8AfJ$ZlNa$^I.k*)&KkWK_0pf84,!r)U]5GYT+h2e/^joKJ_a6U`ga%%Ef@39\gkf5tF?q65n8ad]a]7c.!b#)MBs.,,?A&+UuU,dS/I?Ud7O=/j^K)&^mm'+jJLW65kM6j((_68q]%^,,?A&+V!)Eld$#rYK%H&'s-7(^_R2ia@/We3^Oah%mh0g,GZJ!+V!ZABtun_Fr0,GYA;+J]#o65jkVdZBKN#4-u(#0[?ea@/We3^Oah%mh0g,GZJ!+V!ZABtunj6BNm%3h7g4dnSC5Bh8+7"i%)&K8Buh4Xh>L&rI\-b#SJK-hdMbmR(AK+f$8%+V!'/+cRh[1V-(rl.O.'f,SKqGJsr=7Cg3!Q*QN%pcOD6DakA`[YOUdr"g&e@1G%71u]&^l2X&CP59Ph&!TQk!,^pgSN`.b717,mk]uEm5=GkIp;XmQ3>;(ZN]omlUAWV:,_7OmZkWh7uEJ84,F))R'`=)GQ0%8=-NT:mH+t`&d]r,-NMc5Nku9kuda1iJ&;N;YM1b0Vk3)kO8s2-5JoddLjoXI1Xh?@Osn#)pO3Zc"3V0PmK3:GM\?Kf94l1=J[d9O&a,b!0s`L@@J.dp9:H&>ZS:]m\7QW!h@FZ.[(q&Ps[$b\Ho8%"sS"X+?>#\h((a,_>"\8gQqfs?s@6r"7$$s:3LY[1=#(N`pj,lK>ARuX@$=a)!g.&rE&K;G&8DFI-NrOST(HF%erpGsYTBhSYZOmr$gE92mL$"pk&[TF=A\NV.L@SBo(^*':",$Bg,H&HFZgSfWg[!fQ+5^OIL`t(a2(lMlLLp3icT$nmXRK'HKI5M/UFupWoe?$9#U1t>U*Nu,A)qlZ,s\X$L&/i-W#__L3/)*0_Sgujd"-:c='b\@G\YBWDq%**='S`eR(3;/eB08km2!2N"$1(/6]Do6ksRKm^h`@H063KG97Y`KJ_a6U`ga%%?.Pg-o?g=2Cr4Lh!3]#`XX.$\Hln?7n<_ll+hiPF6:[aF[unD^A=k[G6/U+KJ_a6U`ga%%?..Omd:I^BOU#FPuccK@#PZF(od?&kDKSe]mKM)]p4\6FG)J)Akns^m;fb+7'^#onu890P%h3s7n:TIT6t,@>lhqH+cVTs&!F83cgL/dr7]c:p?]-3)H\H0*hlF!Hgg`ufe)84,F))Ak90<2t3eX,8["$Cj&N`BOgV=#0]C:n7'FImu'jrR(dMSrU6=5*,[H<-#&CQZ#O9W_Q\%hn/$OgaAcY)pA!6,9fNKFh[X_HKRrR3u2-+&5bL3/)*0UDG#h:qk\k4;1lP?-QI@#PZF(b(Nd;`CBZKJ]JLUk(69#R!V&dC7nOMq,EMN#b5'EY6`]NfXIbfT@CKY.su4;,m2#H1Uauhf&2U"(R+JL0TBgUa)[dZ1lsfYK`Y%H__h@e'hh"NWWdKOG7"n1o)@l!DB4dWGAZIAs`n\dF#4?k>&(%)&R.B1uojV+WV^8=='_Fr0,GYA;+J]#o65jkVdZBKN#4-u(#0[?ea@/We3^Oah%mh0g,GZJ!+V!ZABtun^ARdQ=k>GnO2A&eK7A@)hTb30;_1oL>j)qm8FbMkLS(DJ?GLNmm]74Fks0Rd`HB&+KD@mnPT.Wrpo@I&^lc!OG7k11ghDY1b9ne=nP8^DC(R,pnLDLE@1jW;7T.eCRPkDGVY\/5*IVa\i5ce,ohsK'$3Na&m&%.3oh(B2n;M5[%`7:WfiAG1YI^?S9-2pYqOU?QO%$5!=[V4]+-CQ_>jE%'&S(pt-Uk;jG>p?'f(Ej7P#\h(<#\dBhYNo@ngnQ?]E53EO\5fYm$5keQL3-M0i)UOT'<^.dPFDhl=Gr8qFG)JY++uJP(!@B+*e1u_'b,p&ZcUA\g5q?WF@G_s6a"RIDA8#l^PS&,[0UJ;7nGO.1Vpd-jm)gtuF.g)SOeq)[eKXA=!7`&i5">,"*O%q_9f6qCgH%1E[#IJ;Pi@nW+=fs>=Pe[pYR7S!XT5tJmW@_&5-G3*4?$ho46`i,FlIb,T!Wh$d:*Aq^ci$<^l4Ap.(o3#9-##nUBkSmHf+^le[pkX6V%=Q5tD)iKJZ/,q=M_TTp):J:3qHUjr9rhqiVC@mG8dK.H5+7/38EcO\\uE$Bo85'$)#Gop()RXS#X*Oj'`dc$V9!XOWeG@Ks$diY;lFVY65tD+O;$lLErU+kRTs)#hR^s%#%mKdHl`\'@]ZZ3d^A)*hRr?#T/4l[9`f^E/%N%j1IembgakLaKD(KttWMb\$q>?Yq!PNR;:1MECn%WclH2R3QN?sj^ElMQCA'%4_I:OmSo[-0g-'c+3nA>cGK._87S';jESpTlcA'#hln-59*Fjs$GLfmUEk.,Tia6>.a\=_MA1S>mVAi0o/R)gA62ilr@s7F?-E0*_;L!#*.^j-O?J:08"q7C;sHHe>!(r).rp,`I\JrmuCq0[OH/1PD=;+Ob@:]\k"O9Y(3]RQ%)WMc=kZtRihmLinN65h'`NCM7kKQD3-QS,]B:8!j`dXZc8-c,m?65h(kr:ogJYJ:''6Mg5m+1M)ATTp):J:/!WJ/KMi;2E2#UTWgMDnc%r:Iuah!$Mg(#9aPD&^hMM;l_l0?rA5:J/Qf6M8OCak1FEkD*BA/YlCCAE,,>8:+J]#o65gYXBP8fV8??(,ZKeX3/mc28oB+BDjj=MhL.2JRn%j&K+$$7Qk1f'Ib9%Cs(3$>-F?JEH";t+h+C1,MP%LM$6#09KJe;M^>A^iccoPAAfQa.Z-;*d#80HZCOJ^QAu,)fo.SSF=Ct00@Y@oiqR9f7(6Br@p_@%X'/ROlk/]K/*Pi/b,6YUFlT'2Kmb!o[Tq\C$=rkVFFMN0/mWL0TBgUa)Z9qlk-4B>SQHbt(l:'i-P%0])H@nm.-I(J<"!M^W_I?%_BikUu7Yk/9"Ek$gO7c&C9aGB_K=2Ceac*6]n(E40e7\e5/Yl?]o88ak@R)pr<:L'VM777]d,65m'=4,7o9i\B:HU9Sb#J3R3/.B8uC>[=!PkOOJ:bK#QX9*Ngc24o.aYB\)me9KF]c'8@6Qu'L-k5/bD-7pCP-E/XV?XuEK@+f_?"R/i`aA38'1boG0V2^6Dg*D3B4i_n:CfdeTF$[>.pr*4IA8sRm04sSlh^@\8m)j0,IFIi:p`CC64o8;g-pbh)YJ\!p$r6L0.&^lc!OG7k11ghE-*n'$p7Id6BY0+/g`Nr>`f?La+[cmDZ"9,H:3&I$$g\&le[aTW]bTYei,GFb&VRWtSJ1I#XCSHC+`+N/GqBCo&[HeZr3Z$d]BD-(:='WSamnPdoi?edcE:.9YhIs'>q=H\$0CFo?0T&"lGK32L)6k,I)KHG3(^A]2)ATB[Dr:-:6+5cgB2&V425+/QLL17:_3o\u9?a_7uNk5/a#kp@>]?)G-Dj'?-%HmsBtTpSV5?7R6u.SijYmn+i=R7+-bK^5cc5%1TZd]4h===B;(\[oYS9#;_[t("F*.HID%W+IZ8/GNHBsE(1@_]SUmC4.]D.?c%/iL2VJ")rpC4BqPc!)KHG&eBJ6$mUPuhkY\<2l->_Fr0,G]lFe,1(tK;L&F&RRXbW2O!]elfCqeUtZI;"kBj5C`[l`J]6Gqqi(8OGf3TFG)J)B!U*+UG`U,237d]lV!"=8u@tQ>iA.&Vc"tEmg:1-e[^+aFk;J'Y+4I(1uojV+WV^8N1#_krqOVdYH6Kuaaf[,'GPaf;j9u*(X!7;9)[B9&Dhp:IB2fD+@i2[2A";uMi`[8KJYBKb.j5A4#\ch"8-\#3&%38Bui_66TROPYf+#borSg+FB;PqWDf^rhJ6Lm&^lc!OG7k11glT?SfUVTcC<1\WrD?t5I5ZK!=KIeOGf3TFG)JYTu"R]LE:c_j`8mGBT_!JqQKqQhqrAFD?AB3U`gNt%I".4^iH>JSU0OsQSr^7FSkVjDnPKWhu%fY7mHiI.[<&?ntagJ#$?_DL0TBgUa)Z9qfr(M!V,jX_QJL@3s+%9+UtsfBh1`b"85#O"(m3Cj\Hln?7nD5:=n>iQQR':m,c@_45FG)JY++uIY7S("GY'@dd."jE(+@7!N%mh0g)p=1Ga(WW[b<_+[NU2m?Ko-'R/&Iom;l\^XS(d%0CL4C+t]L4$.5mVh?W(L%0C<0p*TQ%7Id84SX#k)^?#`>(oJ>`)iYMDrKp$cOojgF'GlF)1#2T[D:%9f=Wt0V.S("JUd`=]>3lrpkfE%KF.uG7H"+0!@fUeZGh@OA?tB1c\2-`1V.:.WRQbXDFg&]uu98iebU+Wj/Or3#]d."b-<&M3*I6KJ['YKJ['pQ6@8@(KEn^"[2BDU+6d-p4`1G%I?rW^-jB7ah%C)d>@t6RSCi_I9FN0LjBe5B6lQV?,;b-1DpWI;CT(>i_bqLk&21n6J<7!GuSXbY?NYe=6toW7?YY8JOD7*Lr:%YP7G-=1\eU%(H81#_+ZcI$R]5;>3lXIhSBf[(N1]B%f52TBHS9.H^+rLN4l6Llj"iqk"85#O"(l$\dTq]]W)Ghu0eYBC1D=pNDaq%DWd'ECJFTKiQL>IT;M^82Non8ShH\9;gls8QMRtt7=%,&K69:VS<)l^Pl76ME*ma.)[;.H:WdHe26,0G`K?:-A47C0>H^GF)Bu.r]UUr0Z4Q1*Q47f7fh4pdt]crMc)n0a,X7Fh"+b8Wi@H::EfU6Q1&_0!.ZdIf\5,E\'XE.\2b9o2GhOrPI2dY0)UJ]J`XnE57s1ScLU)o,d1q-7Z9CDLp5*7U,eE(5$+5?kM:B*8-cQVHT1m"Or'h[O8Ca[*Uh9c1Z%P!Qg(9s*[SL+82n)'B0nYX%f8%,%3Z2F#\h(<#\h(nkg6$dT7?js4+HfqcbD[=UW7\-HU%Gt__Lqr,%8CR]V9]cISDJ.ip`S&2F!U7/3R^;1-]L.m84)ne#lM.,SgleNH]B#G:?nagt[06/iTTW0N;7n*S/&,@lCiH5g0K6.-$L,@:Q[*hN\ank2kIe0mq'bLhCT"3c5&#'+#\f5FKJ['YKJY$]kF[7\j`8mGBX:o]^%K0l"4BD[326^@hF'K]*D\/R02_RG^(EIPD7m$B=&Y9e:a20FFbRN/;TtAS.BdJ2^0&[YWd69EqU3jKV^Z@;kXd*7TkM=+p5.n=q_nA39*sib?<:*5/Ef[';h8U[;;IN#QKoS0E\bM@_;[clr_WLD#,.M9F.Ut80'j^6C#l;":H7od\bp"U?@Q<.q!oU6_jY]3NnpehXBqG`eW]SkCD-+X2D=)>#pb`,7%Bq[VV(ON!XC=r">b9gM#;<%uP\jo=F5=$P9[2C_faR:pWbkh=M=TF-%n+N,GYA;+J^a>*'\oM.pr+pkX&GY"9MW]"1/\-)U]5GJ:/!WQtSs/;+HoMqtF-(6TROPYRa&='1t0PD-kUeT/p)q,RVL;+aq6;2ctJm?mEZoEQpAmLn]o!UK+c9dZBKN#4-u(`e9LK-C[uA?W/`56p)/XjE"$^=st*[P//$$Zf6imY.3bsX(K\LIG]JIp%S2"[h@,NNfXJ3K94*+&rX^I[BWq5EiG.u4!!plk7-Z'T7$30TWIkZQofMp.-eG4]'I_:6\I:l,GYA;+J^`c6m@c)@B:qN?c3mSAei9"o-ri3kprpHU<0Nf0RNN[CTkF;OG7k11ghDY1a\H#1g7A6I&^)g`V:6Z+aqg62k<-\g?Q9O].hNfNfK.#YJ0kFhu2tMrpglsXb8O,,GYA;+J^a>GW_Sh[WHSQ8AsdT!?8T?at'[+k*gGYef?o"[.[Ne)U]5GJ:/!WQtROjr:(/okW*_H*&qoQl8o"cq<*8,k9EKW1qJs6L3/)*?lt%Y-CR^prUe)KD]EmjGB\78I1O[s#\ch"8-AQO87M^ImBtP,3]]`-d5Tj"_sud-XknK5&jdMb&^l2X&CQr5Rf$`_7cqsb[t"F,X*5O8L6..3KJ['YKJY$WD;2MDR58KC(#@QrRE9!@hIX&865n8adXZ`Wd[8,(l1C]=Mp>PSX&lKRml`uCUHqF<3^Oah%mh0JgrYa-J,.8pY#qs'm^4$Mf<3r=DkGSWL_`HN6TROPYRa&=0GFkJ='pCK_$s1ik8V%)LctLdCTi0an]+]!'NuP$%I".4^ci$<_!F!E5:XAkrm\tq!/DPI1o)@l!W+"8!Ad%\EY6`]NfXJ3K9-;]#\h@K84,F))R'`=)DED3+Vu:2km2"=4pYl_Fr0,GYA;+J]#o65jkVdZBKN#4-u(#0[?ea@/We3^Oah%mh0g,GZJ!+V!ZABtunOmg_b,^H8-u]9dlU\gce_8I;UVW$0_5Rn8<>H>1_S6.%T_u"JUe=&g*r'l7]>)rXmS?NfXJ3K9-;]-=BB&>#r3lW"I*]h9+V!ZABtunNZ845uNp-D4OAeQkoKikeIp%SXgY%TdOQq^VIf7nB(V^mW`*HG.dF/)i"s%S/'+Us86Btun9+3/j72nq!s_Sn5&KuLTsYK\J:/!WJCt&6l("ogrGhGt$2RqbT)7:.8=MtM04.3iN:j/&T6LUE>>'&CoYF5mRjM**%h&m%IJ;Pi@nW+=fs>=Pe[pYR7S!XT5tD)i'/65_`,\:8mE3J^H8l*boQ>0kNErpr-kjp\/^%Cb/:gVCUTeU*;,6V%=Q5tD)i'/66R76M>X]=`S]eML84qV:mGV"2CM(oA[QHueug?#fc/\">d.dcu6NM]nksq]M[8ZO%Js\8X+7oMS1La!a8XptkbZBD(\f`=UIJI1XhWfl0:S`/,.;[QeF3bEjk(>t#-BkKZ54k`F?h!3Lp9#4-u(#0`NkZq0D?)`NZF)<8D^SYag";-1-`gY`"=eTV(sKTHE)K9-;])MPOhkRAIhFHhXQZ"2a":Otd(DB>j917/Ca97N>+,huI#'R/@jB@!0oD]N<^#\h(<#\h)U2P`S6kbITrs8/O_kK]W&.3Arl&@QWUoP%%KlK5?IX[g(b^TPL?F0b3HTjQ9e%Dp-D4OB',0j$,(fdqCAb^d[\[;1s?;\6DHFK]9RauPKRJEKm^NdYBkdp696$E>('K!1'hU04pYlCY'It%NdlN/.pb@(eY>[4D6:Vn%S[X-2[E'1R;k2[)lFUB?qW/ahnWRCb4i'2Zc80K++N'JdaQZT/4h*"`fclSG8a,'rTdf09=A]lAh86,q<*_`O$MUE:@Hm!k,9r\SBMLegb;V,_HTXX^l++IX8>Ruh3sKYp*lS(UD58N*T4R9BtunCA`_1'hU04pYlWJO9^?1l"hKe9)X*5PcLQD`,K9-;]#\f7Ol-lOPH/t)r>5`Vd@s(AGOPP';_eWR6q@FR5tD)iKJ]JaI/%Y;)I:()q;3d6@F"5"X63dSom55n?iS8!YFIXrb3HZ-CEoVUq]M[81I<"#jo5%;32<)Aaa7(W#f[BA)R'`=)DED3+Vu:2km2"=4pYl_Fr0,GYA;+J]#o65jkVdZBKN#4-u(#0[?ea@/We3^Oah%mh0g,GZJ!+V!ZABtunO5l>9O@+m55tD+O5tD)iKQO9YMAQ2J1Am"Kl2##:6b<)ZRtl)_f*hCTI7Ert%Oj"5+V!'/+UseNd\A-!=ZDOdGstr:DG?+GI/76j\1+QGDCq)JG'a9f7GaENnD7iLaR9(,)f^DQ^idPm2ii3sGkM;@%*fMSTD[\;0cIf5^8_"dM]9Q>Nif>E$`LRENFW7j4h/@>\W`7R998$32XNM\!h&C=6flT@5QW;glW)qcR>k=^,8f(JrMZl967%u1C0(q1#'JqhG7S%<`&drq>R<1V[7?8K5%G1n/%@@aUZ?X7>TQ]I#7jI1P@CL5TW[Q^4)K.OE.@S^c`LDe]N12T^-?j[^Y8VP-hWkNm4&C/"G[>Tn?%_B`ATluA>!sm]>U9Wl9$/+5'gLkJnTBl)`d@-DfSC.OR@:MD>)LC:`)A_)R'`=)DED301;tA#9kVAmF,$7eQeB^13+udnJJ;E9pH3&c#45cjqV+A74[+/g"Ga*2;>#faO`mC:j;m/`\W`6*7`-LH"%'_TPYqu2Xo:qYnMiILa*]9RMQ1McL*H,shNL``H<:^kZ3e[/*hqn1L[W*=4IeEbM!951?3.q>cOCd>al]4$'>fMea1h)rOCn*7S)c_dKF/5n<0L*K($0`k'UPOpDcb8:.1sI*eMLNss:u;et#\%g6oB+;ed:XNX49D/q+OU7c"-G2SU6p8=f:qG[?J!Cpf^&rIV+%so0E%1ZR5]G\d1u'pg;sTp>S\\aJ=OfHob5B(KKYGS@aPH94fe#UM-[;UVjHJR^\l!_pHA2oeHO`:U9_e+cd!oY*g>.JR^hF-B-OVX&s\bKi?BjZHi?RQ@!*&QG$>B&/8loN7$Xp2FJgb'OC5aeU]F:%&8;-mJOgT:.lh9OEE1GCA_j.QP;S/eRGqGmJIhj=*bgH4jBS:h@O/-&7ic5MpFdGA@BR>P?BIu98`]o"H=,uR.?PBne`o$V\6cY^gt?Jml!ja,cMEdXrNAP`V/&jXJ3+V0FQVY?Qe6Vb'I$6`Lbo+S!?qt<3Y:PMESNNK_!Hn'a57Xcdc,f6R+Eh%'jMHm/Z0Z7bNLdK/jR_DM,eSd3Tr;qT(P`%DKm\u2MpH*eduQ;OqH&]B%h;J!_s=F&LbqOCdJt[#Lbo)\QBmg@O8nakrQh$]IerZ^5F8uA.Ut0TF#qKPV^WGk3';XbB2!GC(+7PkWap)Dc$IZ"kk##[#-6L[itC=98)AOqB/B57%6hN[lm)A9-rGMbb7iD^\L-s=cI6LuqgD5#cXO9NOhoPEoc3.7>0'p=*Zq:9jV)@mP'm:bA)+6eG0anp!X[_^n+7,Or-j.2mgfX*Hm8;IdLs1l7$nioZl[mB"a5rg(!$]DYXX$Dg?B^lPuE;+!Kr/)tcC],;jbP\7n]V,g3gd-I1BqnIsjo-2FJ=dIN@Uqml^pHGu&/pPa96q@e-t"33oPcQf!!pV.&tQDct(9Yt=_lLY:5NpF*B;IcNS-s+5BUkZcQFl'?ARpU=1r26YK>K9]lh'0iDFXfBQs(B/$]$V>aoN[q2B`ki?MsZO^V2=Y(27W&]mTX]gr0M56@*;M!(?mM#!b16Uqp['M_Dde5$Wb0M`gk"UN5f(:_OCS5TPY;!6P??:%0OlK+qQ`R6g]6a.Mgq*X;!CRj-QdhkoY.O*G3k]b+hC"n>ieoImHS\&.!9F3C#+GsV!R_W6K56([Z[r%h;9'Quk4G:j;N-J(Y;j+p3H/j2.UR,ABuT/X[sGb@;UZidCrCk!eAhgR1'N5R\]mYUKQ)]Ptd]-d9T!-J:(#4!RXWS+t3GD8GB5bnEW%M3?YW?;8teC9^]O,6*uS>KCF*#5BdZfLM6Ful17mfuYu&8A@Tp?^HW.eKKs5+4Z<7gb&/!6PYJ4P=cZ>\X7HjVG,OTn'25bu5.@rZKcYLaS-d>&2PP'[^iRXdq]oo_%k,9)Fq!6Pq=AVC*2j:%1nY=H)?Ak!OTq;@TqS19]6>')d1$NoiG_oe+p7K=OTsM)+OXXR'+>)7S"&$:kk=`DpYU`3JRX.#"6r.I!Dj7;Bs>^iHM-QEcTPpIfs:Re^:sTfOWtYp>`cRV5fH!a!HfO5!%8).1]S`)=R=hRF8u.K:OLL\UQ[o+oBNB[?Fb)FmQps)"-Ef;JOfm9*$EZ0V";He+-8;%HmkU#1S2p"/$VVdK$'FOTooY8-A-BU]F:%&8;-mJOfmS5bnF'+OU6<#Db2:ks2$F>p.RG3Y6!*PQO;lJ92p^J1_CI5TPY;!6P=s*&lVU]FaDdXX@iB`OC89o=%SkDaechsW>Sh4.5Y1?\eQ%[V*#DmJXfS^V%=7'8$U;%oidX>a>(>8Ettf]s*("O-?tBBo/5lKl2MZAqZ^a!ZJT(iQ_S$L?4-X:D:2Db,")k$(X/AKr^Iqdp7KU4bS&?KZH7pr+!0,P<7H9!@89/]Pd!+>7iS/on#VLdhS0MqGl[@<]H&A3fEVBCuJ"H;SIaX&N3:mMiOs;TCMZi&QEGlo)"L@$c,rFF(8ZkB#>P`>S1tLHgpf.ei*WOou>15So55TFO@.!9J1k,0fAC-65&(EsBK;#5]N_.Ygk['D-SuAiQR'A*/q]ljF/3m[YLFjR%*br'!WSQd_@S:*ZB1+6&]74ZDRYKu:`?3(RB'R="5"ViRkd$=HR[l`gVo@up38B-sKn3!O\3ag^U#YctSL1PdB6C]tae9N5(iOR&/0#H9p4gInIPJFj*R#pH36']9!@"QnOVUS2*:+*[KIq)VJ^YnlSG>';$>Sc5OQHE^LG'2mg3ZO67mpG5nYDI*EX"_o?E:kM4f@mnRRr($]jA1uasU6XJ9iHQN\`9`*-CJZFnTH\*NV@>i].rFN"UdXKr+Wc$J\`Y?AmnB(?Z`S'HOlcAB>/c0)1V@'V%6]u85u#%isd!M5pG..CW/ppjtQQ/`pCi*58&c9S01cUjdi&4d^f643%[6Q&@m2t-Nj,qg`;W?mob:]?W%`>0CXI2hYA7_sCj#u`Bl`Eu,Rd]iECdRX^rKJFARl20\oocs[7.Z*0,(*dq$cb?)Q;kX`p@%Lbtb46lJl,+q9'CfJ&F7`aoi*VTU]52qp+lZaG*R3j.*%0R*4/Fo#4U.D@+5StaEj8rb/g4\S@(O^Vok-/HBcV_e5:H;Po.Fpf,#KA#%=8<[-']8i)-@05cYO\W&^\mgLs)P'0bN\bXc=PCRN,'p%`L!6LDLfd;FK>AEr%:>GSE(3'>3WU9bdQeC0U]GT\dJt\N%23IH(<;i,1Qnjg8n,193N$L"c6UU\]>JOZ\=JO6f>g*KXJb9f3Goi!Z-q/?]0QqK7W]-f:5-aAXM.Ad>ON&6YRZf@g9`j;46ErRm._dN)*1]WB1gZFqO462eeq`BF2f*4_pB:*l\W"GneEJj;S>+dQPq*>,,7d+UiIFI3h>+EnX'\8E:U+N/O1:#SJi#;3"Tdh(Pjo@%R_38jfi/;9t\F*RRk`/@.O2C:63_1[."[dX_c;l,^?)udm*'cqu$Q159(+$M3TaX-.Z":fu1q^#!5Pq@)1akF#mg2Dq5rk*@A,=lZRRPSDN83Y7,72'eIY[CH)%d^9E["A8tm:QqcN`S\8`8+G7RMeoUgVV_8T8=P^hbk&??s_\-aN-pNhdcKOh&a^S,`dZ)Q5<-==nKur2MBY5e?cW?qn#D0:XpT@.*f]Wb/3R6Zl,R`s]Qn55k+&>kkW(!H+1O/ZMGL)gApWrm/`:lqi3r.elThss::Hg6*irJ-C+q:IQOTn'2Cm[cb8R(I"SBr-)3heT'^!GdOVeaTObQr26]/T]A2nOY$,@9X-ge?C+r[:pC?Dhl!9bT=3K@M4?kk\m(-EC(C2]-XAYMGE]d$l.hnBU7iB"a5rg'scV(;>FS'J@fo2]YKZZ>B*@gl8[ftY?C5!c7VcpU^B)V47$.=Gp?[]VTL]^2R%JO!]rM1S\\!'Lrl;/FB\LmlGP>A5(,UX#qfT!r7GM?h/gn*>V"5SqQ=`@;t!C'>20JG1fUH_-W2SCN?qE_U!22f)?pk,_8D@@dM=1U+f#hk?X[0hW,5sp2Mg+PFJ'#H)%oon]&TgZ[),`-[5%9]r"5V1c.&%rqbq>=YR&dJOfn.5bnEW%a#LMBS(F<#0!3`(4Sk9)X*HRKGc0[B5fT`[,d]D_md]+%?=bM3=u_Ur3eZbYmIm>HG5E'-VkMVcme\TflR/jq3s#YfMk,3!HfO5!%8(`MDQ_QU64*Jg^Q]IMp`C>MdQBk]bW2?cTV$8o?KE:YR@+7J4Ke-5bnEW%M3?YfslG*o"FeS>F\4t*0/6gquDfY+q:IQOTn'2X=;T\c_!FHnDHbO$%T4D+pN1#0KhQNpJ(_=!0IK8JOfm9*$dq@.($s&q>/^XIb.kLD1'/"paWdsm94"0@no/spR2_qn9cFM&8(=Q\YR^=P^>WFC4JhWl9M-G:_#KS3ZJWZk<%Q5'jj5fp6B$_QZ@\L&(PDN18M$jM?"T3VF^Uqp+46lH'eO?U&3jd0?Rp:%fMDr897]67b!KA=EKJ.@3a;I.OZNa&%DkafOIKfg!)aLs)h*C-D$FWf*4.#7/E%51trd,*Vc?XF>+#,R+4n!DC2[t+o7-Lsm^Oj;s\e.97nO9-U8Vur.d5WRnprpGCL5'Zk]LNb,^oQQs=GitWA,kT`%ebNZO:1op%BTpO`pO3+m!0IK8JOfm9*2J(Gjm(Bs5P`Dsp?^J=_5.4kX2ADOXP)P`c,l.sjk^<:)BdIY3Y6!*PQQ@Y*,IO/7sD&VhS"8#rqL!6G64]ILbtb76lH'e!0IJTOSeL]^M&c'GW^!_+/fL%1nY=H)?Ak!OTq;:80jq]l\i"2msb#C=0Gqq]D+Wc5bnF'+OU6<#Db4hS@ndjbLt?,9(S$\Hio!^^j:Q&"6r.IJMaXae;#.F!SNin??iaT#GWr4r`]#YCo["&27_$h^q]mFlO=:4"^8:P@Tcf8OLrS!I6aS/FWf*t)P:qti5KWJ'JLaNOPde!p?UnVp#2H?U=YTM?T'[HG!r1[8PM%<9s."[IA+%n.a:G?[([%pXXkUCJ1_CI5TPY;&6[reG0a,fD)9@MC9'1_p1Ab^MS/peh`ZJ@ITWpn]7qnQh0mKEfn6#JN%^/iC%mUZ1"77(aKf#c[:OoaGOnH0][2?o^bB=n&e2bJBC!Ztc)673X2mL-pITj^kgBa[hAnV*]==P[i_b')6cLnO?(t?-j)3,%gKCtdDVLKIU\-YGWqPXrAsJAs%):::n_%ItX/FcRGMLHK>ACNVI0X]RUHRU_EpeiR$)blEhf7"a?q^+=,HQ(#79dc=3g+EnjFb]I+!unGOLj7plU'P/6?XX;-6cu#Ne_WrVAej9dF3i=r@MRKC:A$t4aM>Ll%^d4ge!g=m(R%Vd[jAjZcbgEdHn@:V$X9N)=Jr=fXdhoC>@N%mUioX+59MII6;kg3Qp!"AtY1?_G@J4Kdb5bnF'+OYee(Z?64+)%iL3q[WAVYRO'J,d+G5De50\hq:j\8THuL"M4F0VLkCXsd#MF)oF.o$]?d^j#DBR@dT7_l/`br&D99gJ:\!GkNr=,-Oj:FAM8N'EAMn[l3cGdXWq]Bg<\p1uO(#X;5OgQCmTeH@:64ftUa_qX5jPWAo,j:q3?WM8LU8AUDSffK39"*P$l]FMBr(Fc6PV\#e$*%5g9$@qor,Q;OWHY^QL[M%m<[V5*dG0UN\-B5CPHK).FL.mi`$pI@9Ou<4%r&Q2=,L+J-mrOr!m:c0U8/>99\N[nI\;hW[3\fMNCVGhCM2sMe.:7K%VVs/G#$7UntONh,O$-*+tWjFY*.6UQlZ@X]Q^oJ1_CI5TPY;i.Z.kdn,&YAA#IiKA8?[DG6&'#RBnNjmi4aj$U[.O@_g*31AN3>I.Lh!t1r/*C-o*OhSP8l)#Z[.Bn#Bp6U'$Ubo["X4DS"-Ee8dN@b15>30BI/V&+l/e`RNDts\[Rf;K:H'rTNK9^3@ES@161\/gogn9ED#8/iJ&i7:cUOOX+:f#t5So55TFO@.nB%r^/6b3d;4BR8H:f#!*Vmet/)CmZ@CGPB3j:C7<^NT`3YcQiZiW["GY<++\92J!K\=`sC+Aa=L:qI%i%:q+$^WL].aes%D*E#n:M+^CB((XG$*u4mO>7JVAIgoQ^27G)OnFTR:Il^UFB]\[mjCgAP4";EVt"NXW+u3OJirbXjH@;lJb38]%V#]!u:1)e#2N4%R,!tf"_$$p6=4f)a+SG*G$MfNY9D:6lODU+q:IQOTp2Rm^jClGQl"Y=R(Wo=Z\aj20s_#BV+Crm_/SeEb=sR_/na0`SQnaQG#UX7joX)Q'V!_"OJNG2"6brJoX=HTQpd[cL+t[j*TTI)g(ka'78Y5KIMVpZsQ=7p;:7ikU1hR^EZ)i?BjN2Y$UZo^TrL8$h?/,8Fb`&)JZ"r_\"ug&8B$Pc0o/mQ=Ib0]XIRBC)`jm>PZSH:;"HrIO/<]>K`cUHW_I;>)*>O6JMa5KtSE-lKJ%UTqrtj9Z:g--luB-P0uW(Pjo@%R_4k&8,nJ$#$@(=I-(kde)32q1TB*rEm53ghZeZXS151$&Zb6Y3@WL2l>^,j/hr4nu9A%[tk+d$5@45h7#k:o,_i#Dqd&>a?Fcc955M^@Tfgo4KR4ZRkQklNif9PM:_Aql-J)/oP(bi?GVr8n)#/l4]o,li6[%?)=V\79>2$N>HYnfM6#1p2mA`TaEBY(gP[*t9eq-2V")faCEB?q4D^D"CfAFsq"+lhV2qLXqaX_2^NS@t^'F'?Vs0L,*+X9c&(nuENGq:EgY(EUlP8Z3lR,3/k0V"lc1TI2pHH6JAS\/hl?Ic'RHH/nBssa2_m4]MMjM[[cKG?`1hO5['G6R"1gan!HfO55T5G8;VH[m.iF."TF4.+:^80RUk)&]V&bB!P(?.+\j3%lFWf*t)Mg4Jg4;dF)2L,B$Ubn0#9jVQJOh#^*Jh(cJOfmS5bnF'+OWLnLbr#`JOh:/Lbtb46lJl,+q:?!80arOLpW=r8-?FgU]GT\dQe_,1fE%Y81PR61nY4E)GgY_%A\PG,GcE:[$#u2"1gan!HfO55T5G8;VH[m.iF."TF4.+:^80RU`gr\a&a>We#V@r2B]3:@f+(3DM6lODU+q:IQOTn'2]`-=\3?MTl)j@lV!%7o)1nY4E)GgY_%=iJL8-=q`6lODU+q:IQOTn'25bnEO#9jW@!g*]:JOfm9*$EZ0U]Z_`FFcsbl9M-G:_"%N!7HEh"1gan!HfO5!%8).1]Zc*U]FaDdXX@iB`OA"6lLSt+OYcm&8=BMLbo+S!?qt<3Y6!j(Pjo@%R_38jT(DI+M)+OU7c"-Ee0JOfn.5bnEW%M3=SdXapk\j3%lFWf*4-jPPb!9lbE!F6hrJ3"6U!0dRR)LuoPdXWq]Bg<\p1]YZ!+q6du&8=BGLbtb76lH'e!0II.*JcPF$Ubn0#9jV-Ee$[_O:FYscikU&Vur.dC?1"kQAKJXUAt1ShRQP,@*^oqGKp\?^Fae(kiUP3F+IsfR_/?_g^U/lH"VHf`A8UYI\<\'k==DVB>i.An&erL\p<-g+8TP2rr*YC)bs]T55bNQaG=d_`r890[90tf&$4sc;WS@q104.ttp;X._rQS7eGaTa-MF@/I:_,QgIh)JNo./GRDEEA41TrA?\DI&[EsloX:J=Q4L8Z;i?[_LpU[Pqj_LgRfVZchO8F5R_cb9&,7G3_W;IKJU]_p429;dibrSG:uH\!G/'r9p5jKPRZHnu%g,5BAs`igGkgDE^(jZM`h5a521BoS:nZnlHN'GfBtP*<&1kI5IBR0]&'AiH#A[Sc)[a,E!8&Z,`V3)rU8<9:nHGJ"s=$$rU>^cS%u+W44M[Iegq[`=#aXY8j?o]_1FM^\B7L.4?YEErPW3s80)\/YooSC@J"ik7i-&=#I0FJ*D0PQXi=d89&q;a)fX2AW?,6bpAs-jB^GS"t;/mUgG0CguIZ%h/d]*dFRQ;!o<1J0p,BO$M7d(%#?$\c36%"!Xl45bt@]O]HTIdKnYoU_11h8=(A/BiPB^9c]%sWWSAQkQW5jcj`CSoRKK53Y6#j5bqC#LbqFW&8?f8+O[(k6sA,l85fa;Xm/0I&\1J0p;[4MKl9M-W\q*BsF9@XX4Wr1Q%RcaH&8>,L,)sqY6lMaMeLrYj'/hf<+[rdUEX6WlRXXn*:%CP`Q8i\D=TpB^G*Zs55('ThtfETolVZ(k$Xb_aY;QmG:03#8XF(=ST9?r\9dPfr_ai7u6;_O0UnSG%=TS9b^L")%:+eE-.1V$BE"iP^*G92<8Gfh542+O\cmCa-"Hp7E@][$V5@^?\1[X/h#/C[5CH9ikQ$ps8s-T(q*j`jZU*2VLdXgor*f])hJ?rNUBtYr'sPF`k(E3a0&5p]Z`R/jq`&=[[RgY8*`jcZ22I9uM^A^%6[s`msIoD,iTmf0.6^jc+hog=.WXpN/PImGtPE`Vd&i=1:[^&P+Ajg++%QDToPOeHh9i4Wr2GDAA'47%-0+9r(eFrj)]hcAlIp05%GKFCH)pZa]=MPZf/h(_m&.p466ka+)[?l#M0]H1j'K\d\P,hCFoYe[d&SWQIY?'e-pFVg\M$+lGdk1D<%YY[#:7tK`nSeE]EVQOpEW]'El/WU^i'o6sTEf+tQ6X4jtagkrrOHuk_)]oa)'6AuSn/Tbf/J:YXOj7@p765'#OLX3SL\1_`Z\_qm.`bie/WKGb>92>Pn;QRL](sjYapkE_j83c;neGa&Yq6mY=O_^B=$KXsKG,cn*Mr`]9@X%sRgIU%iFlp)RC>+O\b:VFZV^IdD`!fKWBhFH$,LCT1nJ@t!dM.AjDYRj/+m*DbB$B,NqhVK]Y52'"m#YVjNGWPWLag[HuA<-5V"\kdS9Rl\K-L,n#'`-EVe]\V89/SDY!CAn/%8\_P^3Y%:tQ#)SK35gN[PFP;.D8UE]#=uStcu"6'AZ@BDf-H/o"rf5D3ST)&"\65iDQ74PqKn[BL)@@6TI'>/jHb@.,.)@i9)B2)O9clMT%19SXCZ1SeMUXL8bMLB4f`R`*@$'n72=.\42SLiA#V!A7Kt&BHDjf=P@)ugs#J-+>"deXn5&d(?WjO-FZYMZZeR*/\UoC+kO\W=[_Z=3e[;uF#]uTg%&YT6/rnU.Ap#2lLVfBV2Kq/Vk&+jB`PMQ3ac6H2^/X9"W/g,MKj:"F;44tf0EJP!@-i'(P).MEfb)1SkVQ#&J93.q11Jm5\Nq<\hBm&.[ra,-lLc-iKo*[,>WPC5])Wh?C*1pQQ0`=$=a&*]L%dSn8fKa"h^M(Oq5t84T'lS_iM@6@:dtRi7#I,_Sg;VC"1n5rktpf2e]EBK1!_fQ_Jl:5RT(snke1.UpH7:dLq>Fn90t5am99SeM8VC;U,GL#*L1$s-YNrF9]l"l$O;;Q0Zl`S/XQ%VM.+>\_M[IM1Jk\ah*+AEf7uhV13PP1n1JOPr"Bk\;jOWqA37'F5]N^`%n'iGO:Wg4$!k6/k&B!UjIjN1i_Kt9&V5TOM<.WRSMt]jE0\P/R8,)`Y/f_p_7[0s2@8UJOi^0eKR`e5\M*!S$]AViTX3J"A!ge:f:P>O3JgHXC^^0LFpHR&)Xl6f0.BDZdgY0dSCdY\"tr(XgO.N)n29hIX)ukJk24LV'OIu-g%HI2X^%Tq*AGh8]u@(3Eo'm=4>HfeVf&Mp0B0m&8CF.>,6#Pf;Vba&(P:#D;jHHiH_<5/ie(>I*VF=E?7EAMa2h;/UaTLYasiZ1-7&i$b#>XeC.s]l(@(*o&^SpH.N%Yc9PEm^>9&>/i^^hJdm,ibF'te/(`?LbuUVN--D$'IcGB?"^>i5m+/'n$utitiRqeNdZSP:]C`0RdOX(pDtRI[+O[)V.>`.JEj#*-F)>eIrVTjGZ8J?Tf#kGK#'+WDl%uU6q[;ZGN2nH?C$MX#UmhR+)!8YW9kVW[0d!i8e5j-NR!a)SQT1$KdRBfoOd<^\(>)CQ/X_aSjLC6"#lgE_9E(SR-,WD'4#"V^LR-ta!V-15dM^+_O*"tQOM9Xp#F;okbq2ZdDOYK$YXW7\\_CR19bTP0X52'sWK-0hEqdUh;Br#p&"bfnQj[I`M2^#W^"?aX\UL]'Q-0erFQlXp,#,5m4)KOhL@&`TmI0dO\io`:qKPOja2c8\D7(tKit3/(rdT.*7N11f2OPbf^VN3Ho15llZ[R*gd@$$TBcBuDZ:@4&Oa29'I_BBLUchsP&JI$o[!*Yjisbb)=f]V$c6IXpd(4Cg;@2:okj)s;a:V`9d%k%a6b@%8c3(nn[XHT!t`I=>LJ#r1-%RL51Htqq1^lT7V[s"I5Noc5NT!=YBaCH[AF<,6nr@H-2GL&`R,n5th4\A;Aj2p'%QL7"`V=5_9>]n!l>B>18.X>MCW%Vf&^D+e2D1Q86!l>hd9\sVJ1!OJ!b$!)9/^)idC<$BCPmonTa[b8b"I=6if\#aEo%)csg=1r0SF&Q(H'E`g.52=tm,\)M45V26]Ue+f1*a_J%TdEQq&8'Rb;WQ"b-eWdOnoTt`ogC*`XqACjSF`<]&($P)^`l6[%(f^$:HY@UU="QrI2/X3j*&qBRYHic%1JBbi6cIReI*HmXiTN49nWQjZ(b%U/[M\5R,reYT&3g'3Wc/]1n/j3/]dR\[,daV-e80`fn,)sqY7%-`Z6d%%83%6kso-Oc3](CMDX#^f+l9M.F*JcO=2\>65ih,6]\IM82Xh23Cg[3\Ie6^73o)0cYV@#`&oRKK53Y6#j5bqC#LbqFW&F&103QG@8a")?lZE-On&c'Q-*lZDh^QF(1J0p;[4MKl9M-W\q*BsF9@XX4Wr1Q%RcaH&8>,L,)sqY6lMa,L,#')6[&O4j7d(%#NR/,&](CMDX#^f+l9M.F*JcO=2\9\VDBRB(#=MbGJOi]E,-C,qU_11h80`3YOY/d>d]*dFRQ;!o<2qXK>BjDI@EnEIe+:I"QElnsD0QZHXY^](i@jDIAR4Ep)h2oEhEY**W3pkbXpOo@r>H.X1J56!ej)dZZnC2u(Q"fafo;@/g(ZV-cG%,BlBp]Y,k?o?"g=mj3GFN"GS(jcmH]O9-*dJ+D*MhL54$il6*PY$S[4oWe/9St(9n."=Z/"XY5cFKBukN;MGLB4&g;JcL3_M1,BW$QoE6?U+>):Z"[,T3qTarE#W+'TXU%DE&rc#Oa2KI>a;q[jCN&qMt?*qq9@9AZI]gh@)s'j5,-!mZ4qdKJ,,pRA$T/M;IId5)o"@T=mf;mzzzzzzzzzzzzzzzzzzzzzzzzzz:al>c&GXn/~>endstream +endobj +10 0 obj +<< +/Contents 19 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 16 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /XObject << +/FormXob.86051cee0f41ed59958ff7513d50fef3 9 0 R +>> +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +11 0 obj +<< +/BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter [ /ASCII85Decode /FlateDecode ] /Height 1038 /Length 45124 /Subtype /Image + /Type /XObject /Width 552 +>> +stream +Gb"-VO+1*iTuZ]D5%Nr'@Ac"r0"!'apGI!f^(Z@WYlq[M*Gq!&Ld@XfKkb8h7;pVj^?#8NU#BHn&OW:.MnPHB0'4Yf@[;3[)pEL>)4Yuo#"(u3&)ZX8Lk@3>+Y4:@i@[m85Et=ep[;!;NdE*2srohE5'lb@WU@ejls,&*pW[4-ee$+'C?NXCmiMN`O+2TUc-FnFX\C0dD&aXBq.qSt-cu0_f-f0"+T4YcHS[-Tj`!#DX&c""I^j3fmNM^T\Fouh":5P]]]K^?;\!#D&Bj5,,Xr-@`Kl!*_tR-r!Yr-e1(m(3f/(6`T0-c_9t.t%N6GdI:p%t,D;A`&IIYW-H)HfF,`?VB9u0D>&9ro;9/:W^=,!Pmoj>rU?h4X5BMD3!uZmC<2de$AF?!&1PlT:F]a3[&omD5MRH3B7fM9_KJ7!(M'RqVp)6-_t[Z9pS.0kFTBeV!Rso!/tT(le%+ko0&Z(VfVg9hWLZ>mp5uJQ@F>\m5F]1l'l?bk3X9i*WSa=n&a%m[O]"s'9:$H7u&kCW[b1*Wj'6$(-A/Ok-m-ghWAp\MT,%aN5arXd=nM95Y1h'Pceei=%:.<;BPP_.p'@qSm?R*]f/-?I4#,IJNS;Z==ADHTAFQJPg7R7<_o'a[RG#hK?_sBCu0dXEQ-MgWNY[Um2HKV=hmM@hD`o^>%/.n\unK"hV$pLrPE.V@K6Cp9M^,N[HYi+.+!8fi3L:1(W8Nc@WA;YaJr?3"7@]=D/4XVTiB#U>moN1f60nHW_2^9.=<^.ohO_dVqudReHQ#?]Wl\Wg&%rMk"\P;M"F3Vr*m"9hP*_i6k_G%%U&1A@NJKaYNYYfBW!pSj2tpSLY,4[jLDF;eZUDdbr8Uh)K,Ad,ZVn%ejO617*G\0[\KLd@"or/cpZ1S0)o`]@4(9G9\d$qj,o.MWc;&kZ;Q&d\-?497mQl>N^=([d>hW:p_Q'hcp*''UJL>Nm+DNaA;HH(4+$JRGN;i,uRSmuKG3#AOu"eCtQB%E0YL]ZZMQ(,6o9\Ha+S''O0%#ERLV4.N;`%leq-tY@-O4gnrXkP@c"6n$lCiikO<_EMl\h[g+J)KuI2P=r3XpT]ENDZ_&g\/Y5L<S!Q>!d&cegl,33FhM'2S?EuD+cK./@C?J$$AZ\j)Z(Y*nN$7dKhic/C$j%cpY,-h@YZ\r8FBgm&X@6Wa\K\f/r^"rn6/-pWq>9MJUU*HKRTA4&`HRC&fr@SZSgf:Fp$@RkM$BX?kT^,pjFOYt_t150+IO,2"SrBp*N4Op0-TP&"P#h5J'@Q5g3!(XbC)Jb+`mHG]%WkacASNH;/1EHX1nVt=#=\;jLDEAEE757PPY8R8r;WX4.^ENrLLK>8\@,pD<[U.a^CiJ>/HWL-1TQIIIe2#7iV0WHVa7uSSe+k#lj_%m(4/9%&)#AnaDrCjk2_TG/`c]Df4l;m1!)b$$kgCXmSS.DJqZ^:@Yo2!eFac2ct"%M[]nH2FOOL[_5_T1m:P%e_&Je;o64p!hg3Q@u$d\Y1Pgm&'2Hr]=^EuXj47s[^o7^qXM&#mqMhVKTgoc_L#(mhqugF"(8TARN$$sH[i9u(Ro!FG>P]tW/=JgYOK$3@hU())^4s0LLY=jpP:e%XN4hNn27ge'15W:H/FEmXg+m`hc5s3J2uk0&X0Nset?cKrVfQ/eO8Wuku-t`gg8m@WYLAuGA^6Im8rYF`/P=ff/'tg&`2UuB"[l04P7p170+O3D=/'e$[jXUF)?rMq"3'rLJGt*9*)iT55F^6D/MOF:kTfPE6`e@+"%&=.m*auB3WuJ9&FM>lFbqoDJR]-g%Q`l//m]sI.Oss:S)t6CZuf-`L,8)B=r+o3WLiu+!1I1HgcfX]iY2]"Ho:XN>'(=In]RL#69\4Xpq;#?$GkA5Q"1Np>#FgWFK]/g(X@TRZr5u!Pm^gp)dmqhgEk!c\]HgWT`U8Ui5+LQM9;8Eqc=NG,u]!"oZj$=0h9I!&08V+3nu25:*b@^VBg0o5,-oDk$%J4oNq^Z,;(foPj;,)=m(Ss#=ucLSpb=^MmlS_LK_9W$?daqqG2%n0aoo$bVq:U:CXWrpX0IF_OLlGh-\kp3ul#b@_>Js2i!Q52%G4KD1r7h7[=4:#f_NT?Fs,!5P,]Ic\efp(,+hpNQ?X-:-DAUKc?AaH38ls08[ToBCO+GkS4Uq40VEcdC7]VQP@>q`f18*D,D"B(NW]:Pu=.hD2O7Fo:?]a^b:Ab.^4C!2]2CK+ItWc[V6D$33?%=LW0RIt,6";#gU=`BEtNF6LsofqSNIP`+,Df"_.E0="(K!%8Y!euT15_m2c5!%8Wo5Q(#UA&i,@!WZ%LrpTmdmr*^QS*WuP!6R`GC[9'_M!Rt=!6W:'Pq,?pq>Ft,5`)RFZY"T4>kTQG!9Krd]))'`e$;IE!%8X6;1M:6Z!WZ%LY.su4ZY.V,*X)P:>V'6rr3O^5P]Ynk;#gU=`>;m/Z$Q(XfqSNIP`(%kqqp"3H`cX3!!(0\Vk8EQZe8lM!WZ%LcCI$u>?`V)'EEZ(EVAbPl`\'0p*]n@jWYIue^`3l*X)P:>g1F9f^3k8UAt:YM_f"kcoV5XOqGCVeC5aj'EEZ(naXXAhf-IBZ:=oq-l:9Eo_.$XQTYZU5e.H>ZXUl\fqSNIPRDdB!)Q90J,F;/Fg^R5!!(.Fo,Rfr.FC3WJ5R#nZY%H#fqSNIPRHV8!.Y^7Zt\!MJ,EeF;1AF1ZH!+K0IJU"EB"q1OrsYd8,r=5s!N.u!!(Joie]&^lbEF7Y'7%\m^fmaH;!t)!!&m=qXeL"dlH#A9QgC9H@+eBB=-+_g!>+*0JFVr2uirBS"-"uVE>:s%C4"U!%84Z[VVqAW8O3e!'k7Go#W7Ts7VKq*reS#5QCdqiU*5)_["Hj[XN>pT3o_^$NS!'[*jfMiZ_>4!'jW-V*jnU!-FK43`HUi5UY5WL["m?'OC.TTm?\=7?gU4:d"f/U<()kW#bq(J`^/t<"At:_%p'4<"At:!=C7rWWrMX085`&eH5fm;mArMl2^li;/o6al2^nGTL\6C4TL"koICr^#69iPn'[nU!!%(4;`[kg!$GV%d\1seTZi\8FJp5\-sNuLL["nj1*j>NW#bpe.n1p-WWrOHKQ0V>l2^n61Ks$>4TJl!`[i.1#67H>aJD8s!.`1Erb1rPTm?^S1dpRJH#4.X%b1X]-Et!PL["nj7;XcF%b1X]Mq$`<*NB>E(7iEN3`HUi/0a4)*NB>E('QLZ%b1X]#%tZuTm?^SYfp93<"AsGOL\#>l2^lP.>Q?FH2t`'b,9?[*WV;)ge*@e!<@u!ZZN,e!0EqF98Dd5J.eW!W#bpe)+o\L!J$?,FJp5\-lGX4l2cEuTld4S!%8^WL["njP+cur*WRT+8r)[4JHl2_HoF@^+5o`/Q`dNPFteH;$f>tZO`M`8'S`kib<-[(6igRN.]Z1qUiZ.Mai;\lU3E(KocPYP:**/c>-Na?p``!uC<(di_u?`u$I-Bb[qgnB%E18OY+=DUMiV6rPU:b#t;Y.;`OT2&hkp+^3`:'jBoF-OK[b?sJF>2b/dsEIs+;6!lO4]sT7BtLI(4UCX(ua6ZP&X#QY&?/%ZuN.[6(HKhXAnNqg"IV0/L+"4NlE$m##s@D8tAtWrEWK0EfTZd4TH7p1`n",*0*,2]$X'8g)00nY)L=PoLCO`HNrho-0T-$oFJlLkL33=gI%lOaD&'W4=u+LT?@mEe>iMVC@UK@=]WN$D6=6LK!!m[fB%lY7j=^J8*`FBU4dhS6D:+*7,hJnGOU3a<-1%Mq##R5Y4btr,CP5KRoldbVlMim3\h[9P&9UFfS/DCaY?>kdB7=Mib<<"q=_>Pp5%2*l^hra3>NpdD=gV\5Ol7`!eEV3-`AGY)1*ac/L-_0jrSK?8t`N0+$="Nlu8ssFS>+1CeN&:*i]I\!gN'#CJO?.f4g)\`p8%/DQ>'!9tY]1mYs;nMWDHc.Ar!1ZDhuoff@72Enj\M',_?o.;E-:dl&n.5FYcS6d0tA4%/\:@>NFUBAWOP@K\'X0B&B-)OPE_/)K]Ypf"1YCNZ?/"5/)@=aBNPO4\+7,k4E4ks2SFOf4hn^_AX7B>(*"^BDZ-N01^SRrZ!L[)k@H8Jam5OVE"Yt0V;97$(%`MV;QE]YhirHki`+DBp-EGm:AD3id!mXd(LnY\7CP+lug*F70:%\7K8r;9!Xj$^9tD&P_F&M]0ohP(i2VHZQZC`_h+N9VRed#rl9!<_c-p6R(m[NO5N'kamW-\J;D5&o]>d8LYh(n!^`ZLdiCE76".eWetCeN&.T$f`AW#i`28m+47Fg]a_ORejn2;8L?llGU/h(CUBU%\,t?@):9oXDAX7iP$(n!'Qt"D:s-MS53jm4"CG1!&MV\4rrmk\Z_,=E4b*j'pkT'(M7@#;#@"7Hi=RYY]d'OT1[90iZ$3jC\>%LF2HS/R6o95SP+KTpeR;7.pNKLnYfTIQC`E964tN%jo\R]up;lSH"./c'jVXdAMd!AW^H<-aB-af3@%D1V%jF+r7Ys*jI2Pf3K$q"Im*@H@&q63,n,`k1R)0lhlUG!\R!62THCK=L$iX1ffL_6\31f-Z,Q%USB0oCN&n=.Fu'qIe0+HCDWmQ>m"O[&8ZF,@T,8kff:$ReN0>7]!ll+nMr>3CA+t:M>`DOLQl:GM,0nWqR#Q=c>n3Ld],+s::=@RnPOI2T@9eC3]Hhc"4l3"=uA#db-C"Ij.Uc!jJ2@D1FtHH[>(+O8^>PsITNWj_WoA0OjSAdMNjT*^j,V-&QW7:8+SR!_"&l5%cDFe!)QS5&"1HpDTKD[@l>/i1Z)DUu?J?H!XB"7U=rXLWLHF8bGI$$[O_DDA244B>Tc?_N0cm>"5].S2P:ZE(4hr7.kn%ohl2_Y(8r&c_<"EAUPR]ETW#iaY-lldJ:d'=0;*)YNTm?_!q!PchO]Q&5hG4$,$6^b>_7_Z)*'>nO#mVU3X3\QJI.3BmblT'bAb7'Om"7Rm%^PD.EcN0!6IV?s($//D2\D"`+IiQt7L2HBCgg7")p2clmV,"'@[NTrR;HkoVE'f?5nXS+\DZ..MYL4bsgEt;/0^u@]ReGEhr4!'0BYM6`T^2+<=ic1r,UQ-Y_l9sfD^94#C1LJ*FQ/$YBghr>j3;KW(N_h`?.3ODsVGC8i5=s'oHJV+O99>C^GfNS?73r+!D*$V^t-GR/!_2s+Xop`7EQe2NMa2-/9U3p5UOZQ`o8?D0X%NZF9RbVn'Y,gZ*&'USq2+Qeu3`'+e0Ck\RElq>9G_mBKJs!0P[=UNN51;*qr:U!QVP@S1DFVe=(b[J2j9JO#jN'+i@OTDc`AXYQtYV:/Eb$69uo*Q`PkK+jt->@O;MDfDNH::;n'GBipja-\CA'W!RP\1Z[RNR\o\TN^YJSsoJR&oP<<0*k7i("F>pen"-<\VmkLi`;m*)SEEfa5InUWFF^=OM5IVgJD?O&kbnil?tIp5:>9PEgcRu9:`t?Rp$V&RMRrsj)/XA'j>/oIOR/'1hSGDi;(;d[NGL;C:Z]_`D6lHIXVFIH;luT*MBs`$e689GKTqC?_P27SkOo]"$;s`cW[:S4:(s-U+EAXq%Zt5je5sXZZVDpeJ85lG''b?B`of*<4?g6H/b_a:!fr3,,qHRHk4>%d#fUB+G4Fsj:n+7qV5]fA9#GPDi`4`rd_/>WH9/cZ5$g7iMgI1Qhp3@X7iesY`@Vk`o^ku%=Rs9_JdYmg41uI.]lssnu$b'.!\3V=F$OL(p=dOKZo,:s7f.fE;QcVB?Dtnq5iGpe6GhY,MKR[t4L*km\?XIUnC[E`*PR^M"MH)g7ZgW)tX\,7-K.f2lX_gj]UG1,]?7:O%:?QS$M""VPa3M!hLV*jI2Pf3K$q"Im*@H@&q6306r)pa>&2X"+t23Z5KX9s+LOB*l#W@^2mPA"N/Yo"U4LUIr'jkO=1AUC'I(T@OBl\c[Mt@%]/(AiJ-+59jfV*E3_ap-9(O%Y/gTPn-:'mlk+J)94act4.U&faVns2AOaQQ4($k4oL*?IpnXl'KLM.PY;:2[5F0gYfAoM:/6Th\DN`>H4,m^=L+;r]sF:G&K+9'KqZjJD@(E;T)Bm!:iGKOJ7EV!K]OGLD1Rt#Jb^a4_2C&F9!j#eO()`8d@U)W#d^t:c\R`8+hs+6g4S!(93-p0pE/uihC`iN_hb:oK`)2N1k=nk_JFH.A:h`k`+jNF.m[UPQoZ*@[%@Qd\;'14Hp>+d\D-22O"[O=f@oI%&F%k/l=dX4ZFd:@n93*8dBkYI.[Zn;\l'K!#PskA,9"_!/uZt0l\T^!6.G"Qnjm9!$e7b9GU5*JFQK"V?s($@'QAN9Fsf$^u@]R/F$%m!#?fZB9@qs!O-fG4c:qW%Y2NYl<-NKF9%[1e[$Yjkl5fW1F6m*i"D:!Dj7YI.86-@t[Z>!6PPs,<_8$J9"$M:c\SQ@T3l7!rsW:oh[[L:h!B7V#p]D7eKS=!)Q:_USI-Z2Gu]LQHh;\s&Jdk$il%On])a/E5N-)Aj(I+NgT')9MF5`dnR.:D#f[agMai,(E,ntV70RfDKK*h>nn;dEZl3B9,"]+G#YLUZ/ig[011pTH2s8bM:F3gsie\`Trr^7+Lt!J']gnA,@Er8fRJp:""^:8K2*5C`ZF5Ps-NmM>jWXI5Io]A6f7&uZj78k1Zq2Kn]:2]$N'!.`JpjQ1Rcg16>EIe*d@e\Z!c_3^]MS<2m7uu*G[(!O5gUFBMMZnVDGl7*P?[:`JSJGPoeYDGk\39>s")kpLVG7L(!1iK/Z"*\)mCKHpCoaH:^E!+9?iTukJ,d-`WrRYolKRQd]QnQ)<`Fh(;mN$rFuUI?;c=uE&HEO/nDV9#f<-^YlH6,Q8le!ATDnJ\hgG#ia]8WH$SX=kEpKj:Q?]6;;EZeaF%_iP/`dlO?s_-M4a[/#f1T8Sl)U`SV5$%jil'!).ndW`!6E3aIeBc1^AC[Vg.bg8Z:[XYm^qpOr:%V0ed_]5XB;_O)NDl[K.3ikDWth,p-B8jaOBOch]@VBA<.p#<6t7Ro2Lb_8k5*FYOqpHhMh/da^:NKemk5ud;7OD.2WK9*X.(7pWPG>FE_rP*^qOllu4aal"JYL=VD:#AWHmXq==F]:HeB8lqq<%W2mt+V5&#kS`AbjZ:=qg*51m^)pQXPZ:C&#,-;n2Q]?fm`Wf7c6UO5UqUMc[O5e:t?1f&LFG*FSrR>GcaW:V9132O$)7S?PHPH9Z7+JUl8k3snjN7)\f?53=J9%?`lF5Z".si!%YUHMa&XAC=Xgd/un%S[0Nrjk-kXn@OB@!0IT70u;-ifXflIDrmIJ7%#UKAYVH_YdiM:o?I=2c[TJd68)6:a/l,4l0n("lll6+(uL<3hY?&b+3GXY^.MWnjt7\!p?gUYm+UJ`HL&YnM!Rt==<.&&h>?8s:Wa_IWTdSLj]4D\5$8=;+/)N0WMrJ_.-/aSHHNR9ij0_]]]"SaA<-eBToG+os5Fj0O?Er=MI&GW><83l34rkJ)VLkc?r.Xm?F3fcZ:?'F&Z_hR91SU%9.tQQ*nd:g?plMGXSDSNO(FBh&;j@KPg5dHT6uf3bY4*F4s?EaC2F.55k+PfqVXhY#miO:B!.hh"[d3rCQ]2!0l4)\)/6`6tD?f1!*9UPg4YroJWAtCu2i#%tFA,lqo;t)68P@=dUL.Q@/G_GHs^>TG6%p?AOj2Tl_(:`/,-b2)V[0!C1kt]^sG&[;0?7@W@m<*_N=q]tM)i4nOj&;#ntjbfl%%DO3Kn1\g6nDg-%8IsKd=Z3R]!q0]oC?[c/O-iiIBfs50DnM2+=P(n\q52lX2dVjU+S"iK7arU_JJZ>a-If$86;#i!kYLhOZeKoPV5\BK"s*e6ZSa92R.%3*OGb_+37J8-[>k[R>fA>@:HP?I;i:Q9_e^`3U7fclJqXs1OqYF``!^NG/.Or1-iX=G7!:o,g32WRMA<-f-_DO/,n7uoD6o\4!Yc.*P_H;cRHL%^1m^l9g-ihKGl`\(;D;-u%UAu'=ldi2a5QAC_;#lu=aiR+<97TIuJHm55)B+c%$39m*^3ob#b`(mc!"8P_QX3n4!prI"&j1WMc>N4URiA*dd7Y5Th1r'EGGu?m@@ts8CjTSXc474UM1W?$4[t?[r$^lqmc%`.qk'_cja"ot0\,.shsqnHAspO2iJl'EEU?\`]RMm-Ks"$:$9=h07a\DnRHD'EBa'*#s@eO[irC!moOVf3Ipt='s&j"b6`6`H(M.7G4F9oJJH^FRQp;arU]dp-54/CtZ+j]=V;@."JVSe'kXKo4H[N!(t:L\">[%7eS6\1,UjDZ[DRhfqSO>.M@Rp1c38p"]2(Fq9*+d5CQl2."G3Br:.i%n)#dF'L:@)^4#m=*BRem!g$pVd\Z-PSWc2D_!&Kbf\E5#nW/1tl;t``G[4/.^AI?1_B7*X(`F;*ZQ?Ye."QKbsOZ.#^F`cI(n@<@]/\*o*@b&7*$Ld!G4)T0?BY>.K<*^+UmH?r-Z-bY.!M!&L(d'TgU)VjVJH]0to%^&^[l(P8-*g"c_FS4qLZEFLpT_4>te8J]n:/;DG4\AB)42Udfpm^=(k3/@9?,mo&2IUF:p.ou>Kb2R/nOgg+l-L?L14;:TT\=mC>-Y4jqNrMR#NY+4kg7\k9;:L_@Je"KLZ-`8>YD`ZC4f^1"\RpNT&OEL@k[g0kBXm6J`?gh+'W/BtYa_4).-,f.(o\DcP,ZG`C=>nMT/)es.f\`A0Wb`T_13+1E]MYlj=!Mll7_EiSEcdDm0:a-=cKMDBTf*PI(lbe4N;?I,]Nea3UMX6Q^YY#SpDjF$#EW`(GIj9F[WO`o3S!B9UN=+iI/9Mo?&_lD`Ik*GJMKPILlbN4k6UqYIfC*(LW7-M[M6dhIWVUINmA9X(Rf-_H($kM=V>$RMH6sZlT7a*F=P12_H7.IdZ9>V73MI"c%GdKnb4Obgm=U8OmmeI@MUMfk:HR/%XAkEO#9GsKkg8tS&A<]_bk97)n^>Uc8QF;6O1M$!S%JXNIQgDMNJQ1RNF[2*O2f0eku_^c:J&7nbWIN(p=qf,[K--76.WH#2uCW]5aA?eYO':d!lWl['8.OXkqNlnPaccLSHu7fMVKjk+6"fm*I)]G?/k"iY8SbL+_l"&mKgmWFs\#Z/n2l`SObJFZeF9C)cubbIbs9Z:%ECoj-i'a((if55OIfmB:?l%R)4Gg.`YP0KK#3BpGs]Ff"h-`f"DTC/5r?^/Qgk#K6jIWg@$udQ8kgjPF$`E8%2AV@P"[#`4m5@Tkp>B^9&hj$Vg[g#W.KalTQ]M2'_hGMVo]KCfY4,GfV(VPfca40[S8g=C*U^#RnZVa5-,a1CFTo=";sf85jje),Y3+<0j0aS*(\2Y,$M*DGah=4^X=^.,]ud.D?iq=LBRlOHUk<,H^Rg^7E?'mf'6`H")K[0q1!(R(Uoh$pCXV@U@mU>4X:`cr5$%`Z8El[ZmE91df8CI?g3dOE@NKN';kKFIXP#g"O#WTuELoid,I7:8'miFZk/<)ig=Jm';gR$JD!QCZ5O:O4XE>i4EO":pmBOTgm!u)c2FTdcdkl80]n7NOeiR(@V\R0r@,:CacbLfUpKB\9`[3(`LAfgI"*t1VOkr1:qL`:8kT65af[7Y743+s6Br<=B`bB9NOQZL&8#N]lD2sVRi9XkFY>M3p`rGk\Iqfc21QLQt7C=`il<7?/FX>4NZ.r.BFU,p&b4;>)f@ZOcBDuZ>_Uaubmppc[:LB\4FuP5Hm^VuHMQTr[D+5kP:_>X%K<9KMpS%Q?c^t);p0EYH/6hRV&,rH.#?@6l'i1"Sf'Z7JVT4^?+.^('2RdG7cDE'qf/S&*#DSDHGG]";'"2N)-Lq+gPLHS`GL([V://ELil$\a$ZrRM1DX4=lcQ,LZ9>TCBA5FDE0hq0@d^!@b6MZE<[Z10l8kqKSRO_;CR1SUHU@F3NC@Zta&.dbUN=$Tk0Q1DL]WVF\uP)km"^?p5M03lUSFS_;c@-TU"Yrqc[KhTO^^No$8LH$l,f,::S0hAE[&1!K.*O>`hoXS9g(jif"ob_Vq8?F6@*9=f?f*AX)dS(.U;`#o^tFaI!!WUae9dSekuSA%LOqokNVcCo[E%F(dp[]S]&R\FT9=MCepeEL#,*=k4LhW*?EE"lb2p#%)P!=qj,LI++Kf#Vnq@Zn":6f5>NXS-acb1Un`-A&B=10l.N8T/bYe\V0>alr1BlII^b[#JO(iEh@\)/Z*Crjak*c\*>I_L4C#C8iA\OI9t#+S?N]55q)k7FZeOkSI.;pW;%uFlr=&;po:Q'\i.DQ_*X,paRl>9Rl04s+='.:`!1>/E&9^(ENK.SZ,Z:=p4cI&CW++r$W?qt%32\689*X,q&HY1A@"^k(Y^%@K.j,lJ3^f^;c?W#7g,4+D7A>Er:k9bUB$84WMc=#1EFk)*??0+`r_WlR-tFo&'H!t?kd)H0;^j,Vt9QFe$@!qQr?p^e)13)GM/b,%t*llBU"d*\^bS*1lf&\[dRs(AT=S<,LbGjs0Dk'"ccG74rkarU_8JDMI2*.#ZtkT'c"G=X`LhD%0>a+3@o;U1t[bj%\_qGHhR&%2H:eZXEJHX'+7G=X`LhD)&gCY#:$!qFu[YC5T)G@ZaB$1n]VkKl;&opXIn@EXocm@\RPu8k3u"3#n5I,$[J'OE(iE@q)0GY.aO4X`s3Go1muV_>!.6;U1t[bY?THpLsn]C-*Se(oGEeIm.*3K:LdAjW"BrcKCg+gp-k.aUc*4`+XG^%qggkI%baT3QIN#ZYRIgoNR'3oG$We6LU"V%_Y5#rh4NA.6R54+o-oM+f+VS4+uZ:HA@U!6gkSLJ*7n>$4jg;8H(>lmt>1j`R1A"j2.fENR#[;YWWc6:kD^AMH*k>6p0!g\QF0PinB)u@^2nsdlTq[D,.R?=T#>E=DYtjNn^ZndGE.D0@n^%UqaH<]9U;DW&cs`hO88I:Ka7D]3A>"*CB5q?dJeMP_M(DHhPp7o1ocko6soMA_25[2C[onUp@e3>L6%-h3[8XB]cl+eT'rnYELX(!]8?IEGgP45F9hXE)uQ9m/2iZ3iUkZcBBU@&nkY\G:;CGg?G-T^G#EI<=t<7MC;"tl[WAHG,tkEb!^?UeN[Ma\eN+m[p&^S%C(a_YOFtBfW?*=".L=6/k)ma==p4AG:[oD4*O#-JUKmDLJ(Jr:7K5[jq<0B'hW+[[F<["Wg0tM9>nRgI2?8YM[`2:NGSctXkKd)DJ.L5J!Y>)U]:8IZ.Z7:''g9^&pJT?k>(Y/'JVbu/gdH?Z#F0disO#_P_t=N$c`l9VCAEXM2"+S"r!!8XmUc>egg'ZULH[K6!%Pj]u)_]hiT\bo[TeqUnYW0>m9UB%0STDle>FI6JQIl??`aULt1@TWg;5iWn;9*bo&G3%O(YG>^E;FoZm9kM0NmlO[`PDCcFCuQIW!W\uJ,k,K$3"U-<=]O*I*4I(hbH[QTLOeU.+/%]p`kWm]YT&df.0>PmcE,o0*hbf.$Eko$cV(2n8"+:rA^#.uQi/:+:>Cl6Zo>iuItD>!;A`:cED`7kW;<#/nLDHA7&"[fB>A8cZ`4ek=uj4Z95N6ZhLu9T'&-4LIA2&fH&%da6o%PKIde`YpAVG.Q?$63hD^Xcq[@[_B8MJ1l5jUP>P6ZU=BP#;rm3a0.$e',[n.Boc0d0j])"a[M]eX&m%*4,1riTe\`03bkah"kp\Or')T9nd2us8H('%h?bHE$(]qP`0N+*V4H/+GjTqD_@a'3XUiobQ!XLQ:jC(/gm>'c0"6J^4'nOn$X%`CLaAs8HYom;buV*s:4.(u_7ekJ'iV+:Iq.bMX?^5BRp4WmQtJ2J:@_,Jj!rD;\tXD)@8hooisK+sMWm]N9DV,`\Nat1.OTNqmHP9&p3_2LdS'F-=3@P$1>f'*9G[>8B-el4Y.iT2_FSL:]e_D?oc-t3Cl2frnkQ;[[nP_-S%U$GSS[Pk9>=&>>QoFD=7ctWCs&l(U9j=B3+h'X:Z"]$#0thX9"MZt]_iP_'mdn6M(;2@fTZ.0SO.WmCl25hHIUQ>SX&uUN4#MVo(tKtRrg5`m%*:qo/(Bh73r1HPDfMpn[/3]Hhc"4l3"j>UYgL0F5?Vm0.$1_eT;Pu6u+knT\9qrZS45GNYgdoTnM*V$p0&U.>_ah-U(aVB.Ma&SdVF@GX0_kp+R8,G!0W[LVh7DRrD7E8o+2Nf8dJLT,MB2^C!NRb`$!F'D2cs<(=i]O&*L1>4ipPTZ@pJI3UaR"],)ZAh^Nf*HR''.=QHRHj6TQbKHmh!CVoY!U_#uYZS,O;Rho0'TRM2tZ(^.,eSOJ4,W;'1]8HA@U!;kC[$qSOB"X*70`XMTp3>]e)4eAn;=hBA]aP\9HLrih1LlCAP0X0=!fPb*i+OtD"D*C:*/RJ2^_LHR3LR"qr0+0.*U)UiV^iJGD1*indfa,Op'*4";a<5haNYNYYfBY48L?2':JI5LNdL#+!7S20IPh%"d6i%YaP,sPF=`\jXK'Sf%GMLMYD.ipXtBsm^u/V-0Zb7bGrI/iQl]Wti;N(8:Qo(.Rl+m#6bllH$7HW]2\&%.Ys=G?!T9XuVE3*'JUj$qbP\nKN^`T\Ce>;%QUgN@-n)^1+cjk2`l*VQ_Q@ifA6nZ`GMf9gSWk]*]@*64&/h.^IuIOK2(YKL8fcZn:1*C:N7b-Q8DJs9H@&q630=$KB0>IS@@o4F%OpS*BCG&1fY^%9H)RRXa!sbi@tqJ(MLDSCgc(%&3k'<0gkOfPWjPq'gYB&jOkePOmAQ*/NVn0tGDqj9*+t+A.C\.WUl`qbAkd!"ZUD1I4+uZ:HH3*9c0%u\(4(atr'TpD9`>9.8fXl]b7UliLQ1jE8_IUDm5RblNn9ME+K90a2CBA0mgtY3kT,N%s.E%GNc=(i?;QoEcK6%;^TZME*Xa8X-C"$[90&$aP^Z:Xkr6oI$GAetrh4N]B#+^`8j:*l]l1oQko4g1qq6!0YN^qbe0;FjmgtY3kT,MJf7t`[*T>.*//I4XZ_ZRZ++2^)]m"K:Y:8Kd[7L:jG6l;ToT$lNh`EiYE$Z-Q>Y)LpUf]bPQ*J_0':/:Ia`4tjN8M/gq1mfM,lc4Q&sIh6j>b#AQ=qi+eiT_,2*k;tp/S!\i\6"EIG,2P`\JQI.ECtIka_cBmgtY3kT,N%^NX]$rh4NA.6R54+o-oM+f+VS4+uZ:HA@U!A'Eg*rV\,@]$HH^AU68_LLGr(hsqAm6V)b_@..@uqEP!>ngQ"g>1WW>^tp7!__=f^:4?@@K:LdAjW"Br%Z9S4473q**0`SnquFDtauT*Sl-VQs7.64X%_Z@uoSrt"4/AB6n!G00@mKYr.Hf&>VK_3oGLAQB6gp+W%_Z@ub]aJOhBCu#HH5[A*="6bX!!E/:>\T>fO*O809Qkm@;UgUn=k_eE]!%I+P5Zc0RJ/!Bk)UK54"/K>="6bX!!E.9+J?Br@nA4kUHVa>`!!@N*Kbp>1rd!1l!)/=H%Zl;<%\P=u#=q/L!4nnKJ/%VcTIYJ@#=q/L!4lXR"/PG^HsL#`Z:=q_(;0gG@(la,CAn#%I#]+97dg>g@_Mr?kjIkfiIr(YNrh!eH3[!WHjA"5]`Y('G5to3nA#/(%K_`.n(ta)p?[o)$Ga$9mf4f(mf9qnGCUD"%\P>$D\Pb4_CXB8!)/=H%Zl;<%\P=u#=p!b4$K94p*]piqX&3N9CDl&R-t$d@_Mr?TQ^BA\Qgb5#=ukt$34?dhZ6V/hZ7gfmf4dr?3-_"N>jhIr>d!uo,U(tb]eROb]a%mD;)@Rq$rLFq$s&JjuYhck@_mX"^kO"eudtVXoZ@Yg!=:/r9$9\s1Mm\$JFG@9Od87V;_e-SlXHJF3V"%bI%:m3hQ\arV?Ac,dssAS#HDPJUqIGU(q<:\)W]e=GB*Zej['XLBMME7!8G6-c'@Pb!&af24/$I#8$Xa5^I.4uPr6PCBAG_^A]d,AE2D3hql%NqCmdAfoHLTa8(3jPl=c7n!Fmmot;(bkTBC!\pG%)!l+]jnk)4/P=4(bkTBFS(Ro6gpBH]jnk)44;M<"q81T)YB$j6gmQ9mhdbNNbQj%"q80i*PGsuco\*jmhdbNNcaoR!CQ=C#/+N^co]\'3sH,,@iG!"!CQcoVF?]d"Q2A&-GQVEsYf0_CBIoSrr>n!Fmms?`mt>1j`R1CW:p$J1LA,r0EP&V*g:LLKogZp#6Sl""Pk9Y\3:r5Fkh8*\`>0587ln>1a5p.1h@?`u98h]^'q6'*N5V:\L1l(K*p]s&bquGdfL2A(Ke,4UNbO`NGBf"i2tW,PHM:1MAVnAYPk%+?gH!f_.Kr#-MmAEJLYabF'(cZ0Z2'.2Ofn>ie*'$".#M;-@c>7`0iqc&VGp7]DU?\2pJ!YJ9/PFdD6`*HrJb9SkHg^@\&6$3&@7SGAYkuBMZ'jAA"^5Tm'0t9(*Jb'[-IQ1<3=PhN:S%hXNHQUSHkEUGF+AM8\F.1`C<)%bR$Rm7B#PMd%-QD%7j-:$`ireV:<+-HGG]gs:o"B\^ur:oc"26q%W`%6t>iYGMe[sOFToNpsa`pCJ6LU:2$$rMZ:U)GDNX;:doT"$ir*2NAn\Qhs+dMT.;>f.<`\nQO06moT"$>pJ+qpdb?k1gNu>!1jgS/P9TN>oStG2HELk.eG1KOMX!f_MQ)IgiHODTUmR_&>>dZY;_K3NUI"p!>d:lq%a/hkT&`t'kmPUV8NfE/QpqC.V^P?Gr1@=CG`'m1dRj7>62He^2_#mB%C7^pAhkuU6Hm\!;j#.GX`qijDi$l:`.)ROo.*!R`(Ma`1P7bFEh%0=D!`DXgpW?+J&Yg=6J^@nODMq;UaB*2>:pE7Pd.[eAa\56d^(*V_9=M-1qPW@i>R9Sc#*h=+#I^p*ll^[n>m*l(n&KmmLEcDtZ+jM!9Ccr3rfI='nhGj385Q:P!7VA#2C$$j@8*MT(K:Hg;9EU3PKOJO$Hm)m$O#`J+KS_JPukUSB0oCN&n=.Fu)GjVMFk$d!Q`4[SV)L(S`E0gEXEn!KgD-[H"t>E,X2[IsrWRl`NjGgYU`?Z=M5:p$!@FWoHH1Q0GGM!X$lF<22!>q^L>J&QhD&F%*Rg[*$lF:\3dShsTm'1_hD&F%*U2c.",>Ye%=6'FTm*<-G75=7a#*!#",>ZpNnuKukT/-FG75=77lkt:J>%0\KAJ=jkT/pO*%1_UN[+`HH.l+**YG0js2cl0',iL>FWoHH1Q0GGM!X$lF<22!>q^L>J&QhD&F%*Rg[*$lF:\\ue[ShZ)o.`),,Zn!JgmSaONn97K?lj;`I4*5*RucgRaTOflsH,1;6DXN5iqTK$P\^6\b#.TV#-ri^[@4=P[q7EOLQcH(HJ^^N7c4.glf3SC/-9^@^#mMHo`PW]Ah5j04R=7cuaK&-NM7IL4*p?^J=HhVF2UB!u'j2R)!NZF5!Ko1p!Hc;.#>!hFq0)/Z-$p>VC#+.)^$iZ/T'T;S#/Y`mckZ-m+N<3NHhZm[,C:,TBsk@VnTd#8)=nk6=3Pl='K^L)TQ^D7XBDlah>rcohZ7ipNe0MD*f!7P[sBjj4FOGruFTI].d5RMfBckX4rUnDo3?-t`!$@2s('tj^FkjIm$Es7)C2Jh#2mf:Ismf9q.^&t1(G5tpr4$\\kmV\&K"6cYj[?]Wt"-PCr!Hc;.#>!6*9D0b6e(V$7"7mNU)=nk6=3Pl='YAPUg:;:&lqmb[Fna^9dlTfMju\*rR-t#(R-t$d@_Mr?@(la,MYRaDK&=*CFN*]R""BW+!4lXR")+3"kDs7)Q\kaVl)'q\NsdWJ]A9(V'GLN:UEBH5V56WS\,^4EJ\Y'2qGS\spua02]HV]-J4ZhL^HVI9SKOBbTE"helu<%]rSeX.8:FIlEm$&?7g,37W#/Aga\T1melLIV![JGcS%0u/pl@Z;i=E4a"IR>!%m;aN3ree9s)\,5ES2QXQ;RW9Ck(VY8`6gr5,]gIYlHA@`%kad!mG=\u*muXga]e_>6%OkHB*E'>>GNOV9+iOf%6cq=ZcFhLcUfa=78D/aSR2:1)'J&ec.GN32o0Vo-@YNY^AK,r.?K`D-XO'&)Cd[[8$b\ob'mbY"D[&0g@S/$dCE2aNJ?n.?N3cB\!1`D-lNT.q>*2#f;*?8NB\n=B3o]ISNWl'rqsd,#N+2tG=q`s0!8O3FRW73f!b+V;\u(pqrH\7e'b_RHApq\;\t]<[VWRV6HV0[G7)RfM6N`*+4tl!gaN]9*55:\3k:)>R9OjKI]L'@SPcT_Xh+$m7ISHYY._/QjJ&A,mJm,p\E.#MW?*6ELafDUdha3r5WTY#,(9QkT*snh)il:_hqoQU2J(7dFYd)rqjOf="?o,eV4-l/ER5A8*2s#\FJ8(DH.FHD;gI7.XG`6FR:)ms$]AUDS+/6nC/i>.2C+dWta['Qe)t^A2.53jdh+L'RmdhFH*:;Tm-,G$,*)a]mHZ+hdJrVP1Z_I^IA'AD`"OH^K49sSdpO!JN'@_e^*ZqHMNOnPU/7@^NrsOK@Wj"EQJqI>Lm,/lQa_-Z.eZ\:3gJ]p\%/1If$g9HF;S?jMo`ZghON'>AUa%Uu^)C#*d;!pV$1`)X[/!'B*.S5.BT6qph^pE7<7es1Bf@FkIK=0=@t9[dWX\Fn[LcY?l5)P$K+$X'aM%p$u=QW(ZPb\b)GKGOA)ZrBfGWDn8YJpSHFe>OK8fS^Dt2f'?c^O6dM2.']q?9Ab-gd;5SHa"7rf9^bNMC[^&eqf>32,dslEon\+c'O/OfO,F7eSgSI(/eC-fZ!hG/Wb&qMU0)lYXCBqJla2Dp[\&W:t%Et;GOIg9=u'drDk\QJIM)b[?7^.MDjDle9HeX[S]bI1=cD:c.4g\pWI4*E+=;DEos>FQ+oqH*(cgp[*D$Deq+]:sq73R6k=eacoDQAd%[:U[N>)bb;@]Q3;sP$dt-QN!_4:/!mU=nd;J28-=MHMmMnAtBNHT<-[WT:;W][T@^A#lX#N"7DG=%g?DuK5Qg\5Qr[DT$nf5=rBFmasZ%&W4dYl2E$DH)k6YINK8tem(34#D*/92*+#@ErQ+qt-XQ't%fR6Xm+k\[MILl5F6O*S!7KhVR/ap.hm;]]&D8Q94I4U(jV/'Ul8s4HP`#+^[ZA6g%k3)SUHWQs#;Sgc4tQ:YtS0O\#t'ohqPSHDlHVLd0gh=8%GKs>]STMFZ]IF,a)_c!s/CoXrOV/N2i-=LC^=GlsS*8YRdmoS8`Z/L32OKa)c>C2nQ+U2)Ic'>3`'6U,XrY3>%paNPCjq`+mX=0i-!.9fhmQ^1`5%AY^396n93+1'Id_<^M;Itt,lHQbNM4P!n3pB"r3='fVDcb7>M$KR-`/oX=fYmESTV>`@Bnmof06Z)nPXj\NeO8>.=I7Xo=Ns-MZ(>sQem:>6+#BhGAE2(Z$-6gQYQQ5pW`3Xb0nWe%]?(b0chg4N-W9p>8Y'YDrdF*C)q1kuWJ%#A%n^`s`EQ^Lq[W`@,ZfT;5QJAqG_&L?.Im;sadZ\0Wf`mYg45'g-)rtdk)t!"tD\P.a$$p5mFR:)cYM.im9C)<]e6B,*IIt&rF^&0snCiUu#B!DBIV8[o3"S40l#M`_Bb%&hZgR/_;=D116$?VA4B[!pBdP&C^=VNbCPm0p=u$CG.*(FFV5#U$HD?HuksqePm^//"Al]PVT75A`S]nE9*8P@9HKDu*GH'KE:O;])Y15ffG0DZ1W(*?u8,t_IcdE"Zl$?&B?]fTU:MdasEUt3^LoAfIUXdrnZtdUcaQa$YHtNNaeT[6YMh&njlc`C4/b)0,Z86DL,GjSmm)_@]2d\)0kO9@BoSqDnh7Dt&ouYD&d3L;JGHCF;jJX`7le1g>ldQqqPVmAXGI[";P-&/&hm;9so%>cr8H%[H>1"FGiY#in##bgSU[;$F[Hi&fm_n9d`KO.PMN(c;KhCj\lBaU-38&Q;#S!k(-4P2ZD8ZmaQu8Crs#b;ANaYBe\ZcK9G$4F_$Y$VBa9Z/]unQ&FumkGc(cIb+-3\ni/,mIspJPXo]6USZ-2NO=0^j^b^8GLd0fEJN*i\L7*i\R'D^ds(`.jsq:prV#[+;A)PA*]fa6l1n($3N+_?iB+4fl4h>cffW-O%ZBGL[jK,X-OS'UXk#rTGi$uJ%%=5\Bs&L-o3Bj&]5l"ubRjR^Bj,M1R#)pN0B*VYY>,/h*P-KM9,Y_"48EV]]jo^!n)RiN`k$#'Fj;%6WN5K,CFSQk+A@+QlL:Q]<.XKUpeEd[4Ps#'*#W\e,WdQ#?pKr)b"I[4T"3f>nNM'"EA'JI:SN-bEJ_V.T)"RN:Kt+XUbG2[\0Ua?15-;X0-0.@C"nfk]ps/3HEEgRX3o-QD#EH=[-7_'6sgrj:[l\Sg&f67;d*P/Kn7,TdFprYF-PN1Yh4H23Xc`$bX'RV8j$(gUuHg.LcY@d%OOXTYO`'p+$,s%J6.o"=rOf1lNS[60;ApjFb30h3=-h":;'12c@J92F()eB5=?H/8_5&:g,I@9XaOBI!iK5k%ul^GWE<4)c'"!EOncGb\pRg^"Uij@^`O?^M#@`WtS9KpCkYi[jh!m*^+k(jgq3&9+qq<;o,HiQM>[H1)TcOrp06Jg.@3QaZ*9Of(QT>WDsQXfeJhDSKh2oB%`B6Y0rOLC",P<_+hE.N69I9_0^:f=L_b<+OHRBh%hI)2lP-tej/&e1/#VgBT^^Kmf47Xt0%mu"'=pAe:=hT-SCV/K$)G;?8td?[,!"n2'daLLnIpG1RRPBH'Dq!J4CO3onW4r!`"a;1Oa&omYG4kb)Omp<*2Va&/\[I)$_4%f[@+12D^IQ8h>9BemfZ0XI>?n5X)\C!)*<1(9!Qf\?((-B*.">n5Hd@#85'g2P-H6XDh'?kVX5'5!U(ndj.HJ0Q6PgH1:B8YokiKE/Hdp@HXT#iAI]AS#25!+lB$[p;7mBn$3%FCDRVZdBi/IXXZJ6"'/]4R?ajaD^`a#u2@<9')7!lU/gp^1DZocji[(99k5XaL$$=dY\:/`J43m.T:%4^hM;79Gf%_1Aq:I\k#&Us046n(WT*nh:H:lNBSRYKX+43,BOEd_UE=5cC"lBV.p"1g"h_$G%(S>HBW6s*Bk8#?W6%IDjTFD1@ZS!H@G;M*KU5Y<3#BhO7Q'Gu8,jd\Y]PS>Q-!DSVT,nTW$G38>$C]]!e@62^juTsDr9\=$37pKp^R9i"hk(h)]]q>mHs:g7fbm),+$LAgpt=H'EEduW-84I.]@OkE20>/VlQkVmjJ0l=qh=_(LMR+G8(%1&ZBmR#V)cs!-"^f!T-`S&@L$;e=bY!^_P?\!!F%d3rldaeS6r[%Gt"_&@K;t!,r&5%KJekUne.bVu^i@^&pVs6+mAN)jj,)5Yrm[/&T"$!*hh'"$f]YhuEX^e2mZ?!oF#$W)2CIr:A81NWO_bU9h0>cY!>&GeEqA]=2\6i]@JI_?eXQ!!JR=Jc^kL_KQ[oKFu^XR[]fBNWOa0V6I2NCc:l*"TVs6l5]kVb/&]8iB%%L!oF#$W79DL@[ml-=7Eh?!!JR]U8",9Dt4nP!+?#q*<:[`EH1Ne`!"sp!"_W8G5qmu,pal,*<9>)mssjT!/Oh$bKJj+!4[W,#CrHkPK@^t\A;F";U2`J,]&3q2PN,0ESrj5Yrm_0-;,Pj#[SJ_MHL_cAmnp^7tZNC6?^$,9nF\7fbjlJU.QOTMeWa0g%SBG8(%1&Y0F,NWOa0jnSB+USFT37fbjlJU.QOTQ9hsiPE>r^7tZNN.C?s&6(jknA?bXY4*G8!+?#m'`\eEC2.LB7O-ef!"_Vmh>nat1c7.!S.,I"\fL8\"TVECZ"(g,jg33R>`fWeq6`s"`8n^0iKiMY`;TZkX(m+SkjeT?!&gc7GXbBI1k6lV,FN>TeBJ>9]e)T<0d_<1+;Zg\t83554NRlB5PP;Ac=hKm@[[IP=M!)X$pSTEu>nJqc5iPGgAI),R'iPUHHNWjssUnsoa[C):g-iaMhAnGZ3FF[g*J07.9S`]'H^7t\30L,6c1A!M]0@c;/;t1nu/8J\Z3T'iE5nN;IlpSN#D@C`=G@!GgHg*-c`LuG25MYiNhu='M&8>oq;leGr7fcqIqTb@APNG:A"N@%t_%5F[DE9g>)B0XkNWQipHj>O?_0;Up]j?3^lrh&t!3ZC[JRVdOSZ&HeX6WQ2q@ha`J6.9i5d;m8:=MYsS^XK4o,S!Z"o&QAbC]1N4Wf1OEEuijhbeo*JF>b./GMuie)0'?d*TRP']9_a4&@I9^(^0eo#W8(pgLZ5hgo6>n=?MuBJ_1Q$GN88Y5mI2@Ti2kW+TLG!59+a^iuGR(47LpTtXH*.JhDRSYDSrCLA]47Bra52U>\(AJ@RbC]1N1"k75Y.g*_Oto0`c$*!7"hk)XZJ[fAbjb+@6:-:QG=kM$q2P`^!8i?:=n&!Gk.grn^H'cr^4#mF?[g+@3+)pb%M[*"hXuP"3%QTc$+X4qnN1-ktdpXqI-o2qeMb[q9em,:V=D+gpR"Xq=Q='XE/18Dt.TqNJGi,$T3IBZiB=)X!t\dRbcZgd8t+$Re,"eo1uOTI!t:,^#rH8G\uJR6.^@aG).L%RH-A8q)W'+hoAY<#Am2bP_LfL*1%.[h1trsJMJh>Im?cr.RKZ^UD!M<6#1_`eDEPD_Q_@O.UBeuo]78=ZBVT2Y:$$F@h,!f0(geH=^2n_M;PVXi1t5?u'itZs5[Ku+]khSb0eZkq1$;(afCps#ZZQ`GM]1IZE-l(e;=$C-O$@;+[d%TLHtW=@hUQ/B=FBajQ144qR2X>;].[VH^aNLMrXg6hpXUR*:\q7`8"_h1*hj.CK`W)"DN\ojcOA]eNj#8/Jk>H0s0lS`(W=nWhL&L<7o)3X`;o(?cUc6/=)"^6>:35:2%gZTFG1eG5#4ZA/)<9]=(F34VZ4H2Y]+O0B)`p\up(dZP2alZ1fRX:*]R'6f1m/.8!F(\XfincJ,arG(3*nY"sH/.'g6&QZ^!]PVWZoP[JG+lW%$%hl'4[HoelQu=rZch>7%8\cT%b&DTsV'UNq3\_D;gnmC*k?L`)q%b#A"KPB/8&(h.NmjFX0LBq+[>-M2#;l=;(mO-TOp*4fNjB0l-V@;B`iFUEkr*hYh7r?LNPt`7LYo>Nk&g8e^e[lF=;la]lDJ",quf3r[XT;p=BhNJlmcK_BYfRiK>.]mR=gU:(iJ2]QN5b;EdBp8*h32A*4'C-+*\d-0IA7q#Xo'M4\@m2@f62%'cPHGFnd#?`8(>^su`jYd8M(YJZW4hs$o6^,bj(6DEiulC$"WbLOn^=l_Qg^TPm@43"H,3Qdf"M:_QAT"ZH:SR=sm-Hc8YmkkX)1NnUJuBZ?)O1b8+mM^J-r9H8Z92gC1?]`co]LRN"'8H-^)!"KArkrqOJ$Gr].*opu"roUTi/r@^tDrr?KUS+EV-N-jC;AD3N^b=l^JNh9lG(&56U@RZ(@(d<8qp7[K?49e6?XS70BQd5/B`:E4UHh?>9ZnQJAIT]7$2%pX;C"^p>8^3BLYmI&/J)(_p9lYc/NcUt"rqgoG$+&Xn%3]1JXdA?8JQN-L#QYNEf1"H=*gYT#Q)KkP!K2gRG>t:Nk$b1YGem>17]n/5(,.d;l6cB=dbV,gFZEl.J%,M@SN@aY:R9D+#DbCu)"6Qs%\;n'k*9"AHh7@^3AVAP]Fk0Zf?UiU#ZkAt()LR&=\^Wq>Rg^"Uij@^^Qsj+C"SHZf[Z9kC`'lE*'8nUt07bkBpYQdVkVaE+g>ou\==HQ?X5d?7b;V2NriB@&U/)sX86)-X(%5g-Z4cg(,PBgSP/.QGu5')t^0#.%2j"iGQ^CgG_]APZL@8lJcdTttB?*;,?dmB(JHDfN@Gh-Qpg7tu;phAh(7pfWnTWb8O73![q1J"(>8iB-A"kN%9hUF:;YNTg9.Q;o4nPWZV).k&gV#SJr%14lf:Z$)jQlT5j+`U%,C>.,^>f"58!Q6t%$FeAEsm!36uehm(1(J.fCTsMgCYk[M@m&1*Y1^8Lb4er+,3r1A'@+g7T0+VUID['B;lRB5=XG!%l+T\Bln.<4^pGj4-j^`HV5rST81+S5UOADVNl^>ij/WnL[CpdBtI;Tr-.rkD1:`pfOA6&V;;mejM*L?Y:W+dO/oN(D#$g$Vi:UiFbq9SCr[Fh>;pYHodN[+i?<2Xhf-nDkJ/lc;E%,/%D]-499DpeknXr8jeo6[[6Mb&]jaDUDDB%-J1fT0s-B^\iJK+]bE9cDR"X:m\:IaC_e2PGAP"&nt>fX/bL>T35j"lLLRe>:5an`HdB:oq>$/YHCaVro8GSc>FSA2W2c&4(l($1?L2-&.>lB?:Ir82/oh[*p!rb[BlOmY;J+"hZdY!'j,BRGq1iYG%b?/O]nNO5$o3SZ=YAIZp(G#RhBmNEKQSYOUDjf*G6_;DQ.igPY&>3A]bi&[p(C=[8trIcfdl"g:6Pt,M^6Ihq:\/DQBWD(o^B'8aQ-Sm[a<6]6;Xq;*t^G7OXa@c#Hr4pQ@m7h]/`k+0aLCM1sK4L1BJ%D1pT6/rVTob.),aD"_FclWp2DLYInV2;O?9*P:OU,U0NSe@B?a%YcE;f$b"?!J^JeV!G[S6sX^GLNrnFh+Vod^krT285OkdpRgMFOtF-epkK,I[\QD_:AsWj_e\\OMc.mDAV]`R<<^0KlQL&'aDQP@@_s'WM9f(5eWPj0+7Ln($X4'm^>kC1JFC:/rRI42%m+,,8?GiSpIrqW&Xk%M[*DB]"(tq]_,[4.PBODi$0+-LGu%Nno$9R@d!M;Rt<,D55re32t3_g/j7dMog-Dhf0-Fd?H&DNQW>Tp!WOUdqSBFD"Hh9hF!=,@Z9feU^qp@!-r#Mt`DH;6]iW3M'Id"UpRZ)icTSU3;E;O=QHJSZ+Vo)?3D_X,u.,`@sH2`EJ=Qf@khWpOTuNnlE"QK^qgh6`=X(=H)oC:)19WO667c-S)&Ze9gB((SI\MjPcX[CadVCEI!(<,7NW)ZBGkYCQR/90-[*1ij(o`OZ!K-/B-5EFl!3"km?Co1E$od!(G&ER$`*B18u;j$0-W`T=tJEM5?^aM]gMm=dBO75b@Rqg?X_o:o+2Mp:_:L%st;IR$kDUACCL4,uHkdY$]psd+)d&q"P>b,su=%R[pRhF:i0d\W#[aAULMOE&OEAHQJVIP]>ke=CWN0XIU$(3WX9hm<#AY!"DAoFh/leW`HH=\?ehf52:i+GK]NVt]'UrB"V5gKuG]8r@2GLPY@:>bTQce$r/5O*+^[cosM%KqJV&a_YYTDdPAZB6LL#j"#,8S$1sHc*QbI>"_H<\7h/^8r1LQ7uI]6BUjH^8kp2B:-@(bcJBtG5Orq\L_?uKUGuGo*n%E4#Cbsl@R.TjD^T:3D"[`@7V#fZPk?#a*7H_aL/:FB(F@2,dQ5a=Q,4TeTX.M\c5Cq013WdM`derVhXY*Z)icTSL:i^N@!.@&dur]p;N.UBo\+0/uaI?nZ''^@0F+7U1)"#-X>()%9!Fg*d^!fV]/E;E!7q=SI7_s,YrP[d?s)2rVS/Ou7[.c\g@X)27+X2DHZgD>%mr2/?bN3TRQjFq"qAn#nM[-Iji;TY]5DpTqlI&!*.a+"K(<%>$pB8GA\;MRek-CYtmqS6F4n?Vd'V$mGMs[p-G)d7grchq>\+.6W`#ihYf_7h:VOAX4.sdV;7]4c(?I_CT'GGO1@C@Rf%oqe/G8Qdpf1S:bXL^-b]YAaM:40MBKKmQu49KhIjeut5M6$_/cEcI"W$+X(;:GE8MldCP5(KgN3]>@A4LfL+u*;M53i1EU*]2_QB:kra-3mDMY`@oLq]`k;QHc5kHhqff%6#"qdr=),2IH\O$5_u?I42V)SQm(1:DY`F=C>:nKVC_j=E`F@CILO_RD<4hV*B$cj/bf7N!g9D]H#@Y*D[R`J!.F#[mI6\,[I4[pk7"#C.11Ic;WHfg&*A.5?Vi$5lS!]K;\nY-B,SGTgVW7k:o12D#W1Xm->_a$$>%IKtk=$"XV:H:?u-Q.A>:h!_NPi]GboQMaKF4@9LTJ4p=@V'tgRMHVq4c'N5G":kXGl.k7n:Xl*;nXX7dc>0JE*D\3NX@tN6Ibfsq?,MZ(V);M$rIHk1)3LG8s5ch&^;F*@J.QQX%mQ9oAVpuT\Z/qOGon=CZp%V^ILbmX$CnnU?=2\:LAXGK[cqOE=d"W/X*oT_4/PG>o>Gdn&S4)XAmjd:9^ob$,$31N4-\==q7bGKGY_mI"R4-WZZeY4M3l*p^@V2qG-dI0O7a$b-TC&oO4VEohMJ\Pbt`/+?K2"?t+CG.:=gV/?f2bgU?$c\D?GC4'Z^r@OVofrOAfMP+"u8DE-:i_S+HKU)9&*B$b2PioJU-LiCL8HIb*UB<0GPsA85sk7D/)?aAk(mcHf:8?e=>;TpSi,NNFG4&&rSk^9]8OlGj3fQO8T&Woi.u2/OLq`&Wl>YCG=f^$R:I'ngC%k/LmPp$4$KI#%:9huD5/1AaY,Q_26MT[rl#]2(WKq]LU]ClTK2'$rXO;fa_H/5#J&VFJ"QTkrWc7Y:j)MS+Q54,h.dkM#q7"[b5ERIG5uMdH]Ons&mE#P"YZT.K=.o_;,5S@3`pmmHXln/WpC'udo)EOgA"krlKKkr0YFiM5)/H^]f^EKS-(@&%5,YAd(i&5ZrdZZ[4&@IY7XW7Ahd?<=rMa/+GFhT7T"4)9LV1>#$iThc>JGRQm8LI0X^=3&ir8`,n^5tF54Z:fYA_,&Vt6b^ZF@K#n`h4arSMX&L"H!HmBJ7GC\7;!le_6<%g-"jf,e74i-TIDREqMMIJNf_KAZJg`7>.,"3%QTd!#KJ*V^*YbC]0_&:37r:b3!g"$l($mm+-/p^R:t#JL;ZZJ[eEKHBmu'[)*s!"aJ74&@I9^&pXaJaYk//GK\TTa/:6`NnD`!/)Eg%M[*$G38>$C]]!WW3cX8q,Y!!!R&cCI$%hZ3]W&2I)N!!!!)-0H<<*-7MR\T<-g!<<*B<^=>#!!".+FEM_7*]3otJ<5>.#64`h."Uge!!!9N(hWpN!"_b!mf3=f#USs\!!!"mUtl(/;#gRrL_WbT!!!!)-.I.-S"'56!WW3cXFPU%!!#84JaWR=!!jkk*?CMK!!!!AA>%c[!!!R&i&^o=!(%!`P61db+I&PU!<<*29&Mc2!!#>W='(_`VrKiG!!!#(!pUd+!!&]\X4:rA)SVsH!!!Q\T\]\L!"_c\3rf6\64)ch!!!!)-)c"f!!%\8St7!,o'dY'!!%OO!VHp&!.[mtH3XEM5U\q3!rrQB!!%Q5Uq!r0NAo]:0$or]V58R["TSNF3k9=pc6*&T#?TfV0>IGU9>9Ef!!!SN[_05m8FPo5WA-osP5bnM>JKdbV*<79(p^S!@K'r[Nl+hM9a:`k*J4KpZ"%AO63rhZ0n/Wp_"Q'5&dXgjPOX9c4!0Ib=#Dt(KG6!G@i&abG$,-L,U]]M*,"qDG!$WHY%MW&tmf3p`^iuHm&psq78-cj27@)jn!(8m;*@S2rhZ4kJJaYjd-27rMOUcaDMCcSf!/P`Kl8r;C904pd_e,J2Sbd\+q'dW-o+p33fB-gUI]6i@amf5Gc0A+`\s/F%)7XcFoW&IoS`!N;*<7:ST_a[hAr/2f(XMMl^*D/mhap5=:)"_k4SpC^M&X/fYZVuIS!HrNEX2G:L47\3ZP0tY^&pWr'3*k_-gcTR;ImfWcTgCF&]lV/#T:-okV[^aVq/Onrm1))g=c6TM]o_YIi_\99-j!I!$[u,qG+Ke3?`BY0"TM%?Y\_i8BOLj8CqP^f>'A\Ph.n*-"X91`9g51WD4Pp*3+Y"HqSbETI8!C5S$5cWT@[u_*8Y5(aQBYVT':1@D*B"FI^#a%,72Z7cpnWSQ';`7WpSPJBHKUX#'K9\r>8SQLU`,$@_C\FPPcR2WFnekb#.Df7:9MJ[g=>CYB@n]id?F_O_BdUTf//d%cTh*1lAIGk=bfKMM2i]7;LA9u?G@LFh>.FA>PCNR7)mbobWPbVQ&-Fs;bJ`$ohtXO@9),V'C_BZjgSmGk5hcV-tEW_s__XJo)-9oJ^ZBTeUo("^i_U%6Vg8M&dl1R`?.QJR^gjsn[AZ4H87DlV5rXuE?Z\U]L99-jqi5j!W]_a@&mB%NTM'`#gF68Y$nR\@j^HOp'FjgfMOEGFnmAXsl6+sNrRd'-FcU1ufd)4aHd%j[:IiLuHA=_FDumkY&?FE6@U4oT9=(Fo`_P5j/ZBK_-`^>g9RpNh7'=a:0*jM"AE]gJt>CnpUV$r3rf7VK',3PG7!sP<:>b"Eo9:_!U:7mG;_Y/:Q.qH>^/2]VYA2Io9+p_45b-gS9fK^RQqP?#a^tN;dL4@H'bIBM7CRT(Ub;'aeNF!@t'$%I_9:HNl.jObBJ`-[ZJu>r?8(3Ai!bZ8if)&^UgSlZVOK_ah5a/K('ah>1_>N._gH^M'T_0N\g%uHgF`gB?fYKC)Q[GZKku[au-S=lIUk_SK@02Dn'uVJ!VY/XPG:#9*EqZape,H:A``O_%:u!J4M&4^=20\^HINff_hng^&\*L,S>ZdM\dEP9c>WUut9#mmaUiMRd$RC5bnCF)E1;W$.br,TmB8JYUs*kPD'bYklYA4t)%/PMZW+ka+Q2P$EndiJj0M0-"0kF0LU;sq6*/eHo[L7-POQoU9gP[<8(pYj]s3mW9ldfm;hsJ>:thp:iOk]Cip3knbg!]cgd>LrAuO?VX=Kmf3=h+aC`mm\Qi,/e$l&JHg/RH<1E28DQE2rInm&fe-&\,=JaB*Clt60]*]4-n+[2q7?&k[k_X^Epa:-6VX:FVNVO'Rp2plLM0hZbgq3H,WCBBG&uG.A4-fZ\kjt&*.R?D,L`r#g,gP^;[/?&XSJEJA[P6d\JQ+64#JP>aj#`j5m[@;$PkV`EA@*uHnJ1s%lUM`AaB"3;>5JRrC6rH,S4=i2DP;[N!!"58\Y,4bVhFDZN[@&s,PV`KO\V_INb2lpP]8JY^b/'NZL[@9UjYb(2`X2Z-27rMO\V_IcGc3J]Z(oWZYLBi2gf`;P5!#35g_1Y%KMVdV"bE&EJ!WZ&F$uSTZ@an#Co>M^&pfii&^p,3q+.N[_05m8FPo5WA-osP5bnM>JKdbV*<79(p^S!@K'r[Nl+hM9a:`k*J4KpZ"%AO63rhZ0n/Wp_"Q'5&dXgjPOX9c4!0Ib=#Dt(KG6!G@i&abG$,-L,U]]M*,"qDG!$WHY%MW&tmf3p`d/UtTN;bs/f7-+`7#2nen/VKQRXWMU[`/Mg]$>b44o<&S]S@)aU'E:-s).l;+REcYD/F!$iB%AH!!'8*Hj9WO5U_3P!!!!),s=CS?!U``7f`Si+BCb@!rrci8g?i]#bB1F4@/^]*Q6;B9T2^7F`&!!!!e-Usjc+X)EL8k)8Shf/Ys!/OgaZa8P6ishpNd(f+D2?3^W_;j7WCPdn):>\W997-'EA+uYaLlGfX>W9opm*bG'ro+2ggA_!!"/<3H3olJ,I?:i7:a*!!!sJp92e,3V0cZaMM*UgmRp!<3k2si`T9S7)Bq@Y4LS(\VdrZTC+u5Q5uh=72nPcW?R;[TV#&?ToG*C$>I*qU:LphnMtcX6I=pL6""p!<<+/Pb(eaW#',3>VKIZ]A:1@!_lqq]Cs<.?"qp4#CLGQ!!%Pr@3535\nnP0W%BiLj0%j;gD)Vhl2Ar35NR5f!!!!)3eiC0:$$Fp[smGZFB3PY0>CERlYXSE)ZTk+1BZA"g5[`RlSu&q<6l(u4Q1Xj!!!!)$LN_)k)0&KH]=M`jnCitgA'M`!!!!WR>ZQ@f_-Ia(Ne5kp-[TT+$Jb5%flY1fJGe(C-V=H*:Nmd8#k!?b93Z"!!#9KcmYBSq;MSHk2JmHr/%E2B)4XE?N'Npe&c1`gm!!)L,csfLL]th7R"K8aR[[tqYq;,`a!!"p;8iD$Cr42iDDm:sZoEO_2FbC/Pgmr3EY.*/XL#.#k%6nVXTAt9j!<<,P+Fh)p;]sQA38Z/Y-`sK[/]1GiL<%0-APP1C03pSo%]lT8(@Mp!C1=M$DM.s\!-QhN#MRA=+TL<),KXeTb*bsD64=BI_"30mn'7[WT-_DkJpbW.^SbtHo>=")@fV:0=eBM_tH@.e&DGcWnfchF"5!!'58<2FZ2#5\UPB@4H;'TU@i`4e3K[4`oL`mYf7BW^JVhA#EsaCNAdV1JIQ&Q[BT#?r]PQFiPb6Xg[@2q;u-du#SQ(tW(q@5&*)eenaW3i^iom,*kY0Dp'l%$u2=!$EJ".(4S5>'kRGVsdG.uRjcY,.4W-5s8+TY=o5Uor2r[Um=s-Il8kn(+K",UR/DYhIc7VL!f7Yr.0ErT@gQ`OLI5!!"4+`Y,?FhJXA)*MNCC+n_DF+_gh7R=s4jg0U(3Z>kSc%,1/JhjLS#`P$2qZ[QGbg.q\)hu/Lq3:\Osg54@iAh[TLq+W/fmf3>Q7&$!lc@!/7hm(URFrRBjf^3lsWNr/#Ko^!u,SsA9\`rNDiqcN-n'FLH'/F9:S"*`&auZpAa>hr+[pQ(+iB%#>&qRG,O%fm$O7ahr3?_VS:;#AMJl)(5oa=1:qBM&Dq4#@"(AQaS28.!!'58^45W=,n'%2Hh3Io2J`?d?[V<&!!!!n%Al)!8qu;CAY0A1'1(>B)2D!Nplc">6"X'2M%ar\LZA]]K;#n?.&R8I>@:i"98F0dqC;;INS((RirOV%*ntY!.ZKXm_mH:Z7qhJXY.#1op9%\hEq8C!&g7K55SJg)Ks],QH`-.Ic>_3!!!!)$=A;^9O2iAlcHOV;B5g5J,Ts^K&-It3T#/e!!#7q\c:cp[-H'=nM.eUdrY?t24]HcJ+1-9!!!"PK!lm3BAT+6C;((hitu!m1mQCp/+E%(!!%g,mbRfO[;u7?fj*_1LD*a=$F\d;ZL\l:FmB1f/P0Gm!>FWdt1fXppit$H253t?#kkkb\hl]"q*&"p"Z@?uJ4mG6,f_)"W7sdaq7pW0im<,fIZl^nW*L^apSu&",G8BWFb4cYR!!!94IX(eFpr+<`+&U4+cuF0$[;t]jiH`JYpK.B^5Bh@4rh6$8<8Dcr5sJiYcrRL?=ae*"CiqRMqp9NcK^D[tj3`c\rjMS`hqJA9zzzzzzzzzzzzzzzzzzzzzz!.rDo"6uZOMu~>endstream +endobj +12 0 obj +<< +/Contents 20 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 16 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /XObject << +/FormXob.398ff7d81a5ce50ad4574107a7764572 11 0 R +>> +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +13 0 obj +<< +/Contents 21 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 16 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +14 0 obj +<< +/PageMode /UseNone /Pages 16 0 R /Type /Catalog +>> +endobj +15 0 obj +<< +/Author (\(anonymous\)) /CreationDate (D:20260523121223+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260523121223+02'00') /Producer (ReportLab PDF Library - \(opensource\)) + /Subject (\(unspecified\)) /Title (\(anonymous\)) /Trapped /False +>> +endobj +16 0 obj +<< +/Count 5 /Kids [ 6 0 R 8 0 R 10 0 R 12 0 R 13 0 R ] /Type /Pages +>> +endobj +17 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 1392 +>> +stream +GatU3?#uMo'RekGE?@+\>Dn/rTRQ)MG3s8s8K3$2-6:ES0F0<eTO?`6f"ZhOi8#Ab(DJ9MGm'?F%eKGagO/R?6B.gL7!QqN+<=%P-Tq#gQrkuI*?0h%#tqipUr,;i+hsXW9\Q>ZJ17@'5i!mn@oWRR#cF9[,!HNGqDJ_&*J\Ur(F@il-K-^4+\MA6DQ!6>;Al89WVlJ7)jl,/q%9-5L-WbNn?\05p%ka1$Qgd5IrDZj?:136f+b)k4Zul-.acF=AL.K*6)'6H\BFh%=?s%TVd(Oj0,41a#Rap-nIlUJm[*50fJH+'2lm2Yl/F/`->PdR^h^'gq'PR3BPHl<3Nq9>ZoU$=r"AFbFT$JD;mOb=iU#b$5S(+(MV4.^N8_I\i66pU:a3$rc8+Z,$lo#]0r($)PJ9W$MhAe;B%"1=n3!%"a9(^eZ;_==hrH=MZ(?on0Z;;+"<"%C^KG9Ckn/.`p5tej[60X8?17X-HagO8jo0cj\S.lGb/>6k-3'Pp^gF#+Ghm3P17!JRr0kWqk@5qc43lKJ72Xg=YJmb08"rsW(`PcnSMfHFp([F;j6Scb,W\)Eu%aJYL_QgUI"6ZF9FSI>Q)OX01(&p$&S"'=b$8%:Jeb2?9udp]eOc!8@KU$W&1>U/c1,cuSn<,`QJ+Ckpbtdc`B_1\`\=A-Cc>ZTnu#UQi]*LOW)U[@mdF^t==C/,K).q]i-:$OL6R4b1O8gUm,IUIEn?\m"W:b(^X7)$a;M07W]2l[C5:Jrh;@S`/TZRG2GV)1>C-$WJ#hHOr#=\2O@!!mYpY?LhUXa+_\nKbq.Ec%$MIjL5G5`9r[(=@ElX.Ths@R_RkTN@DhUVmQ)+**&b7K4+j58,J.AOleQXJh.r5e;EQ;Ji&fBTpd%)1i7+KGLq#lBPF+FV!TCIm>;>OXcKk5)l4%_g]?kj"=l0fDr6UHJaVYK6+6T$9,8j\5N^Vf5/^F#c+Xk(_E7ZjD(FK.a?!_#$~>endstream +endobj +18 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 670 +>> +stream +GatUp_2b!=&;KY!ME.fEQ/Z0j)q1D4h+"Eo*\)0n+Vt2ITEUi&ZVB>k2C*""VVOcT&d!EIs5T^h;[D/ILO7SPHq7YZTKjA?"ji?aOF2eDa^dK,qaehbN*/gt&eUhBN88\q3uGENHK$^,@oVr)FZmtX=FY^g8os_6#ZTR/7g,>5BLh;`LT0Lg@TN9!ug4'=E.aH6TT3uLIgZ@H)i/6@p/mPGeN>Bj!]KnIh7'K4.hmYdf0XGY#XbJ1i]S"psNqR=L>mIf+kW?86]1lRBPn,d_m>"/&h.)FYL]4>PgS3D]>sf)S"endstream +endobj +19 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 570 +>> +stream +GatUp9lHOU&;KZOMGXl2VUBcR2?o[URl40@p96-(*qhp.9XZC3)Q9*S?XqaTLJf_Paq@$ia6u,3Ns:0IL&RQC!$>*@h'8SCe,Y4SK_,Y"8qZ"%:6CZHOVSiY<\Zr^Bm7kEgrm,7S--Ko-BM9R:cPMl:l)r*&Mj,N^F3k(2N+%'G&RQJ:DYC>j#04mPB,X_(2`G&I!meDo@JtXh.4\^IWscH7%&G8MB4)!j&]RnX-,E0XNhZ6d3]TD>CBc$8(GUBBRO<^;:mIoLSMej\U9&'0maKuY\a?&2>K[HSE/%'%Z@],_^PuH!1T1pKTR$]P7+`aO^j!22WUg]KJ#*"Al+?KUY'oTS[?iBCW$D,Co%^^81E`HNHb8%`4b9<.lRfr*c"b;RK!A#RrH"*D<-[mM0Hm$Y#P%+B5gPUejc)dE8S*`s%pKfK`(+]>#@endstream +endobj +20 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 1165 +>> +stream +Gau0B968iG&AII3m#cHsQiK^.9FdV8@^jhN-&lNbK.[iE8k_[h-)&EZpK[b57HtK_Y/K0.HkA^GlJMNTo5[tGEr(hR)ci0K_hNKb41R:lLM'+Y8)9/@1FQRa(_[LWXR_l_RKFCf4KT+T+5sjLRD6!G8G-G@J5V!5u1fBUEK[-s8OfOffR"'hcXY'MYT5t!71]fA193kukd(AkB/\f=3_+.YigPpbQTV"o[(!sqE4'0gPn%8a)[^dm=Y]a.;DkUog"23;MB@,_1OmPa,DClTj[=mXb"aO+i_K=Gn7ck^L=m/`rpeYBE?uF%c#tB*8HadoTBOn`W3ne2V?B%5`4Z3GPd>nqo0NP[ne#`dH?gBAqe<7NFTR(X`\!:]`_Z"<=.`Y&Q_"e`I$B>g$He]hCm6Z*la`PT&ppD;9L%f(DrH]@s><"2h@6LXL%'DtYB#"Z&:&maG`ZP&tYf,;W]X05alur0+:53MFJPLh]thCh<0@Fg+kug+/S\D(E6mNfmSJHiPqNl`JSej9$9+[QD1YP`@D-*d<2t1OtM/N@t3UK78'`7O4M];e"BXeB'aoZM$ou8m0Z7Q%hGueOK![f$#nd.,tlfOMi\Y^1PbIIu^JiO?0OsLMp(MaW1-'-mD67PNuL='QuEpI)e%M-h0:KGb;iY2Z9%sTBl`$V03r*ralu^S6e]q_r4o]WIfn9N2p;AYCRGg^Ta)$s6+YBhHENX!QmJe*F/D,%A#QB.BOd(\^TlBr/f5EI.^hu->c/BYpY8d9'9G>>9kA]KAEk.8[SQOendstream +endobj +21 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 1034 +>> +stream +GatU2?#S1G'RfGR\;t-/?L/q\4J#qW(ufU9g'^fD,u,CMm,C"ZqX:]\e[2Eb0L]j>SE"[Omu=N'_6Xqqrf[uQeI9a$(bgMD"unjKbW`h3g#U`fG>(U?jb.,O+[_VqDWb0TCLFiC=9UgC7PH?p+L+g>O:Wd`64plYYtUIfd`RBaj@V`i;n0Jd#.#C*4*;^]g1q@f0uQGr.*rNd_BLWWIcpn)3V?JWLkUKefGTfhT'&DtF6#+f_\o]`"_=N3e6O(BHBa""]`<6Eh'@;K2u"J#noroe49Tn-*R`JMP]7$BF"'>aXpZu,jbSL;7beBhSls'u&c-LMn+he92Q\!$M?bqHNbe(>R_RLLXha%`?.#i:f-5oQOX[oT;Wu(CX53-MW"/Sb7&1C$N)'duY.d/9SKnD?FgX>>+ZS&i+X.*<11!SP9PeMlZm\=I#r(mYc_SA]3S$YiP\QhK(8!(ILpJ>WhpQA\DY#\"nj)jGCq$1sgY\%uM?jSV%(l9"[hBImrNLdpc&Qb\!kpP=(9mbi)\GT)4[RO3&o@W["jd\iC]V?V+Bnj1!??i2&fj(C2BE-:D;#sn%!qj;:+%#"0F]][/>TE^5#1V"5kqeubn+.2\l'Hl+^PFg+BaT_B9?8-DhfCNL=)^!2HJ2EFerc4RO7HHbZK?QA6P8V3Y'g:#Vm!]>)TC@-_uoK6AuGlcH!-J\ZBfd.$cb`2!6Nj.a--X$?mmVJh.487Q*LjAHVNsnhMU&Z'H*Llt%1kkoWF;a6j<3!AWW%K2m8Tk%+C,V]5pj@_:oQg=E^.Pa-D4ML-q'%chXAJZ_1liG60'B.2/5u==W-aBfhA0.A3.Of=]UiHFC2K8/qL<09s78P(!bf!uaVdd$".j+N3W~>endstream +endobj +xref +0 22 +0000000000 65535 f +0000000061 00000 n +0000000112 00000 n +0000000219 00000 n +0000000331 00000 n +0000000408 00000 n +0000036176 00000 n +0000036444 00000 n +0000075729 00000 n +0000075997 00000 n +0000119426 00000 n +0000119695 00000 n +0000165013 00000 n +0000165283 00000 n +0000165489 00000 n +0000165559 00000 n +0000165840 00000 n +0000165927 00000 n +0000167411 00000 n +0000168172 00000 n +0000168833 00000 n +0000170090 00000 n +trailer +<< +/ID +[<93c9370969b9413739eafac0fba5efc0><93c9370969b9413739eafac0fba5efc0>] +% ReportLab generated PDF document -- digest (opensource) + +/Info 15 0 R +/Root 14 0 R +/Size 22 +>> +startxref +171216 +%%EOF diff --git a/docs/OPEN_API.md b/docs/OPEN_API.md new file mode 100644 index 0000000..da1c4fc --- /dev/null +++ b/docs/OPEN_API.md @@ -0,0 +1,76 @@ +# Crash console — open ingest API (design) + +Triage **real device crashes** vs **synthetic / bulk test traffic** when exposing upload or query APIs beyond the Android app. Builds on RBAC ([`examples/crash_reporter/backend/README.md`](../examples/crash_reporter/backend/README.md)). + +## Problems + +- Load tests and CI may POST many similar JSON blobs → drown signal in the reports list. +- Third-party integrations need stable auth and filters without console login cookies. +- Similarity grouping already uses payload fingerprints; need **provenance** to exclude known harness traffic. + +## Payload extension (ingest) + +Add optional top-level fields on upload (backward compatible): + +| Field | Type | Meaning | +|-------|------|---------| +| `ingest.source` | string | `device` (default), `open_api`, `ci`, `manual` | +| `ingest.client_id` | string | Stable id per API key or CI job | +| `ingest.run_id` | string | Correlates a burst of reports from one test run | + +Android app omits these (defaults to `device`). Harness sets `open_api` + `run_id`. + +Store in DB: + +- Column `reports.ingest_source` (indexed) **or** JSON path in `payload_json` with generated column later. +- Prefer column for list filters and MariaDB permissions story. + +## Upload API (`POST …/api/upload.php`) + +Phases: + +1. **Phase A (now):** Accept extra JSON fields; persist inside `payload_json`; console search includes `ingest.source` in blob. +2. **Phase B:** API key header `X-Crash-Api-Key` → maps to `company_id` (RBAC); rate limit per key. +3. **Phase C:** Reject or quarantine when `ingest.source=open_api` and fingerprint matches org blocklist. + +## Console / query API (read) + +Thin JSON endpoints (session or API key): + +| Endpoint | Purpose | +|----------|---------| +| `GET /api/reports?ingest_source=device` | Default triage view | +| `GET /api/reports?ingest_source_ne=open_api` | Hide harness | +| `GET /api/reports?group=fingerprint&min_count=N` | Bulk duplicate detector | +| `GET /api/reports/{id}` | Detail (existing shape) | + +UI: filter chips on reports toolbar — **Devices only** / **Include API traffic** / tag `synthetic`. + +## Classifying synthetic traffic (heuristics) + +Mark report or tag `synthetic` when any: + +- `ingest.source` in (`open_api`, `ci`) **and** user has not promoted it. +- Same `ingest.run_id` + fingerprint count > threshold in 10 minutes. +- Identical `report_id` prefix pattern from known test fixture. + +Manual: console **Clear synthetic tag** / **Promote to real** on detail page. + +## Security + +- API keys scoped to `company_id`; no cross-tenant list. +- Separate write-only keys for CI upload vs read keys for dashboards. +- Log upload failures to existing crash event log; no stack traces in response body. + +## Android + +No change required for v1. Optional later: dev setting to set `ingest.source=manual` for dogfood builds. + +## Implementation order + +1. Document fields; parse and store in payload (Phase A). +2. List filter `ingest_source` in `ReportRepository` + UI chip. +3. API keys table + `X-Crash-Api-Key` on upload. +4. Grouped bulk endpoint for duplicate review. + +See also [CRASH_REPORTER.md](CRASH_REPORTER.md) and `examples/crash_reporter/ROADMAP.md`. diff --git a/docs/PRO_AAR.md b/docs/PRO_AAR.md new file mode 100644 index 0000000..2629043 --- /dev/null +++ b/docs/PRO_AAR.md @@ -0,0 +1,77 @@ +# Pro / OSS split (cast-core + cast-pro AAR) + +Design notes for a commercial build without forking the cast protocol. **Not implemented yet** — complements [COMMERCIAL.md](COMMERCIAL.md) (dev-gated Play Billing placeholders). + +## Goals + +- **OSS (`cast-core`)** — protocol, UDP/TCP transport, receiver, sender engine, crash reporter client, settings model. Publishable repo for trust and forks. +- **Closed (`cast-pro` AAR)** — entitlements, license check, optional premium codecs/UI, Play Billing glue. Distributed via private Maven or Play App Bundle module (not on public Maven). +- **Single APK** on Play: `app` depends on `cast-core` + `cast-pro` at compile time; F-Droid / OSS build uses `cast-core` only with stub entitlements. + +## Entitlements API (in core) + +Keep a thin interface in core so free code never imports Play Billing: + +```java +public interface CastEntitlements { + boolean isPro(Context ctx); + int maxReceivers(); + boolean allowsResolution(CastSettings.Resolution r); + boolean allowsStreamProtection(); +} +``` + +- **Default (OSS):** `FreeCastEntitlements` — e.g. max 1 receiver, cap outgoing long edge at 480 unless dev override, FEC/NACK off or dev-only. +- **Pro:** `ProCastEntitlements` in AAR — reads signed license / Play purchase cache, returns higher limits. + +Call sites (minimal first pass): + +| Area | Gate | +|------|------| +| `CastTuningEngine` / sender encode | `allowsResolution()` | +| Multi-receiver connect | `maxReceivers()` | +| Stream protection UI | `allowsStreamProtection()` | +| Developer resolution UI modes | Always allowed when `BuildConfig.DEBUG` or `AppPreferences` dev flags | + +`CommercialFeatures` stays **developer toggles** for ads/IAP/Play review; **pro entitlement** is runtime product state from Billing + AAR. + +## Module layout (Gradle) + +``` +cast-core/ # android library, published OSS +cast-pro/ # android library, proprietary, implementation project OR maven coords +app/ # application +``` + +`app/build.gradle`: + +- `implementation project(':cast-core')` +- `implementation 'com.foxx.androidcast:cast-pro:…'` (release) or `implementation project(':cast-pro')` (internal) +- Optional `ossRelease` flavor: `implementation project(':cast-core')` only + `FreeCastEntitlements` + +**ServiceLoader or manifest meta-data** to bind `CastEntitlements` implementation avoids `compileOnly` reflection hacks. + +## Play Billing flow + +1. User buys SKU (see `InAppPurchaseCoordinator.SKU_PREMIUM`). +2. Pro AAR verifies purchase token, caches entitlement locally (encrypted prefs or Play Library `BillingClient` + acknowledge). +3. `CastEntitlements` refreshes; UI shows unlocked resolutions / receivers. +4. Offline grace period (e.g. 7 days) documented in product terms. + +## Build & release + +- Version **cast-core** and **cast-pro** independently; app pins both in `gradle/libs.versions.toml`. +- CI: OSS job builds `cast-core` + F-Droid APK; private job signs `cast-pro` and release APK. +- Do not embed license secrets in OSS; pro AAR may contain obfuscated verification only. + +## Migration steps (suggested order) + +1. Extract `CastEntitlements` + `FreeCastEntitlements` in app (no module split yet). +2. Wire gates at encode + multi-receiver (behind dev “simulate free tier” toggle). +3. Create `:cast-core` library — move `network/`, `cast/`, shared settings (large refactor). +4. Add `:cast-pro` with `ProCastEntitlements` + Billing bridge. +5. Play Console product + privacy policy ([COMMERCIAL.md](COMMERCIAL.md)). + +## Relation to sender resolution test + +Developer **Sender resolution UI mode** ([`SenderResolutionUi`](../app/src/main/java/com/foxx/androidcast/sender/SenderResolutionUi.java)) is for UX experiments only. Production free tier should still enforce caps in `CastTuningEngine` via entitlements, not by hiding spinner entries alone. diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md index 74102cc..c12a216 100644 --- a/docs/ROADMAP.md +++ b/docs/ROADMAP.md @@ -66,7 +66,17 @@ All **off by default**. Enable only in **Developer settings** for internal testi | AdMob / unit IDs / banner layouts in main UI | TODO | | Play Console products + privacy policy | TODO | -See [COMMERCIAL.md](COMMERCIAL.md). +See [COMMERCIAL.md](COMMERCIAL.md). Pro/OSS module split: [PRO_AAR.md](PRO_AAR.md) (design). + +--- + +## Crash console open API + +| Item | Status | +|------|--------| +| `ingest.source` / run metadata in payload | Design — [OPEN_API.md](OPEN_API.md) | +| List filters + synthetic tagging | TODO | +| API key upload auth (per company) | TODO | --- @@ -126,6 +136,8 @@ See [ndk/README.md](../ndk/README.md). | Multi-receiver 1:N | Done (soak or gate for alpha) | | Legacy `ReceiverActivity` in manifest | Orphan — remove or wire | | Immersive A/V presets (dev) | Experimental | +| Sender resolution UI modes (dev: Separated / Legacy / Combined) | Done (test) | +| True dual-stream encode (480p + 720p simultaneous) | Deferred | --- @@ -142,8 +154,11 @@ See [ndk/README.md](../ndk/README.md). ## Related docs +- [GIT_FLOW.md](GIT_FLOW.md) — green `master` / `next` development cycle ([PDF](GIT_FLOW.pdf)) - [README.md](../README.md) — quick start - [USB_HDMI_CAST.md](USB_HDMI_CAST.md) — D & E - [COMMERCIAL.md](COMMERCIAL.md) — ads / IAP / Play +- [PRO_AAR.md](PRO_AAR.md) — cast-core / cast-pro entitlements +- [OPEN_API.md](OPEN_API.md) — crash ingest triage API - [OTA.md](OTA.md) — backend layout v0 - [CRASH_REPORTER.md](CRASH_REPORTER.md) — crash upload diff --git a/docs/_pdf_build/build_git_flow_pdf.py b/docs/_pdf_build/build_git_flow_pdf.py new file mode 100644 index 0000000..4d52601 --- /dev/null +++ b/docs/_pdf_build/build_git_flow_pdf.py @@ -0,0 +1,298 @@ +#!/usr/bin/env python3 +"""Build docs/GIT_FLOW.pdf from structured content and Mermaid diagrams. + +Source of truth for edits: docs/GIT_FLOW.md (narrative) + this script (PDF layout). +Regenerate: python3 docs/_pdf_build/build_git_flow_pdf.py +""" + +from __future__ import annotations + +import subprocess +import sys +from pathlib import Path + +from reportlab.lib import colors +from reportlab.lib.enums import TA_LEFT +from reportlab.lib.pagesizes import A4 +from reportlab.lib.styles import ParagraphStyle, getSampleStyleSheet +from reportlab.lib.units import cm +from reportlab.platypus import ( + Image, + PageBreak, + Paragraph, + SimpleDocTemplate, + Spacer, + Table, + TableStyle, +) + +ROOT = Path(__file__).resolve().parents[2] +BUILD = Path(__file__).resolve().parent +OUT_PDF = ROOT / "docs" / "GIT_FLOW.pdf" + +DIAGRAMS = [ + ("git_flow_diagram_branches.mmd", "git_flow_diagram_branches.png", "Branch model (green master)"), + ("git_flow_diagram_feature.mmd", "git_flow_diagram_feature.png", "Daily development"), + ("git_flow_diagram_release.mmd", "git_flow_diagram_release.png", "Release: next → master"), + ("git_flow_diagram_hotfix.mmd", "git_flow_diagram_hotfix.png", "Hotfix decision and flow"), +] + + +def render_mermaid() -> None: + for mmd, png, _ in DIAGRAMS: + src = BUILD / mmd + dst = BUILD / png + if not src.exists(): + raise FileNotFoundError(src) + subprocess.run( + [ + "npx", + "--yes", + "@mermaid-js/mermaid-cli@11.4.0", + "-i", + str(src), + "-o", + str(dst), + "-b", + "white", + "-w", + "1200", + "-H", + "800", + ], + cwd=str(ROOT), + check=True, + timeout=180, + ) + + +def p(text: str, style) -> Paragraph: + return Paragraph(text.replace("\n", "
"), style) + + +def add_table(story, headers: list[str], rows: list[list[str]], col_widths) -> None: + data = [headers] + rows + t = Table(data, colWidths=col_widths) + t.setStyle( + TableStyle( + [ + ("BACKGROUND", (0, 0), (-1, 0), colors.HexColor("#1565C0")), + ("TEXTCOLOR", (0, 0), (-1, 0), colors.white), + ("FONTNAME", (0, 0), (-1, 0), "Helvetica-Bold"), + ("FONTSIZE", (0, 0), (-1, -1), 9), + ("VALIGN", (0, 0), (-1, -1), "TOP"), + ("GRID", (0, 0), (-1, -1), 0.5, colors.lightgrey), + ("ROWBACKGROUNDS", (0, 1), (-1, -1), [colors.white, colors.HexColor("#F5F5F5")]), + ("LEFTPADDING", (0, 0), (-1, -1), 6), + ("RIGHTPADDING", (0, 0), (-1, -1), 6), + ("TOPPADDING", (0, 0), (-1, -1), 4), + ("BOTTOMPADDING", (0, 0), (-1, -1), 4), + ] + ) + ) + story.append(t) + + +def add_diagram(story, mmd_png: str, caption: str, h2, iw: float = 16 * cm) -> None: + path = BUILD / mmd_png + if path.exists(): + story.append(p(caption, h2)) + story.append(Image(str(path), width=iw, height=iw * 0.55)) + story.append(Spacer(1, 0.35 * cm)) + + +def build_pdf() -> None: + styles = getSampleStyleSheet() + title = ParagraphStyle( + "DocTitle", + parent=styles["Title"], + fontSize=18, + spaceAfter=10, + textColor=colors.HexColor("#1565C0"), + ) + h1 = ParagraphStyle("H1", parent=styles["Heading1"], fontSize=14, spaceBefore=12, spaceAfter=6) + h2 = ParagraphStyle("H2", parent=styles["Heading2"], fontSize=11, spaceBefore=8, spaceAfter=4) + body = ParagraphStyle("Body", parent=styles["Normal"], fontSize=10, leading=14, alignment=TA_LEFT) + small = ParagraphStyle("Small", parent=body, fontSize=9, textColor=colors.grey) + bullet = ParagraphStyle("Bullet", parent=body, leftIndent=14, bulletIndent=6) + + story: list = [] + story.append(p("Android Cast — Git flow (green master)", title)) + story.append( + p( + "Development cycles, branch roles, release and hotfix strategy. " + "Version 1.0 · 2026-05-21. Markdown source: docs/GIT_FLOW.md", + small, + ) + ) + story.append(Spacer(1, 0.3 * cm)) + + # 1 Goals + story.append(p("1. Goals", h1)) + add_table( + story, + ["Goal", "Mechanism"], + [ + ["Always shippable master", "Merge to master only when CI/tests pass"], + ["Safe integration", "Features land on next first"], + ["Clear production line", "Release tags only on master"], + ["Fast production patches", "hotfix/* from master, then sync to next"], + ], + [4.5 * cm, 12 * cm], + ) + story.append(Spacer(1, 0.4 * cm)) + + # 2 Branches + story.append(p("2. Branches", h1)) + add_table( + story, + ["Branch", "Role", "Direct commits?"], + [ + ["master", "Production; green; annotated tags vX.Y.Z", "No — merge only"], + ["next", "Integration / release candidate", "No — merge only"], + ["feature/*, fix/*", "Short-lived work", "Yes; merge → next"], + ["hotfix/*", "Urgent fix for released code", "Yes; merge → master first"], + ], + [3 * cm, 8.5 * cm, 4 * cm], + ) + story.append(Spacer(1, 0.3 * cm)) + add_diagram(story, DIAGRAMS[0][1], DIAGRAMS[0][2], h2) + story.append(PageBreak()) + + # 3 Daily dev + story.append(p("3. Daily development", h1)) + for line in [ + "1. git fetch && git checkout next && git pull", + "2. git checkout -b feature/short-description", + "3. Commit on topic branch; run tests before merge", + "4. Merge topic → next (after CI green)", + "5. Delete topic branch", + ]: + story.append(p(f"• {line}", bullet)) + story.append(Spacer(1, 0.2 * cm)) + story.append( + p( + "Agents: never push directly to master or next unless the user explicitly " + "requests a release or hotfix merge.", + body, + ) + ) + add_diagram(story, DIAGRAMS[1][1], DIAGRAMS[1][2], h2, iw=15 * cm) + story.append(PageBreak()) + + # 4 Release + story.append(p("4. Release (next → master)", h1)) + for line in [ + "Confirm next is QA-ready and CI green", + "Merge next → master", + "Smoke / CI on master", + "Tag on master: git tag -a v0.1.2 -m \"Release v0.1.2\"", + "Sync: git checkout next && git merge master && git push", + "Continue feature branches from updated next", + ]: + story.append(p(f"• {line}", bullet)) + add_diagram(story, DIAGRAMS[2][1], DIAGRAMS[2][2], h2, iw=15 * cm) + story.append(PageBreak()) + + # 5 Hotfix + story.append(p("5. Hotfixes — recommended strategy", h1)) + story.append( + p( + "Default (option 1): branch hotfix/* from master when the bug affects " + "released code. After fix and tests: merge → master, tag patch (e.g. v0.1.3), then " + "merge master → next so integration does not miss the fix.", + body, + ) + ) + story.append(Spacer(1, 0.15 * cm)) + story.append( + p( + "Exception (option 2): bug exists only on next — branch fix/* from next, " + "merge to next only; ships with the next normal release.", + body, + ) + ) + story.append(Spacer(1, 0.15 * cm)) + story.append( + p( + "Why not hotfix only on next? next often contains unreleased features; " + "merging next to master for a patch would ship extra code or block the fix.", + body, + ) + ) + add_diagram(story, DIAGRAMS[3][1], DIAGRAMS[3][2], h2, iw=14 * cm) + + story.append(p("5.1 Sync cheat sheet", h2)) + add_table( + story, + ["Event", "Action"], + [ + ["After release + tag", "merge master → next"], + ["After hotfix + tag", "merge master → next"], + ["Feature done", "merge topic → next only"], + ["Wrong base branch", "rebase topic onto latest next"], + ], + [4.5 * cm, 12 * cm], + ) + story.append(PageBreak()) + + # 6 Protection + agents + story.append(p("6. Branch protection and CI", h1)) + add_table( + story, + ["Rule", "master", "next"], + [ + ["CI required before merge", "yes", "yes"], + ["No WIP direct push", "yes", "yes"], + ["Annotated release tags", "yes", "no"], + ["Force-push", "forbidden", "forbidden"], + ], + [5.5 * cm, 5 * cm, 5 * cm], + ) + story.append(Spacer(1, 0.35 * cm)) + story.append(p("7. Cursor / agent checklist", h1)) + for line in [ + "Branch from next for features and non-production fixes", + "Run tests before recommending merge to next", + "Releases and tags only with explicit user approval", + "Hotfix released code from master; sync master into next after tag", + "Never force-push master or next", + ]: + story.append(p(f"• {line}", bullet)) + story.append(Spacer(1, 0.4 * cm)) + story.append( + p( + "Full narrative and Mermaid sources: docs/GIT_FLOW.md, " + "docs/_pdf_build/git_flow_diagram_*.mmd · " + "Regenerate PDF: python3 docs/_pdf_build/build_git_flow_pdf.py", + small, + ) + ) + + doc = SimpleDocTemplate( + str(OUT_PDF), + pagesize=A4, + leftMargin=2 * cm, + rightMargin=2 * cm, + topMargin=2 * cm, + bottomMargin=2 * cm, + ) + doc.build(story) + print(f"Wrote {OUT_PDF}") + + +def main() -> int: + try: + render_mermaid() + except subprocess.CalledProcessError as e: + print("Mermaid render failed:", e, file=sys.stderr) + return 1 + except FileNotFoundError as e: + print(e, file=sys.stderr) + return 1 + build_pdf() + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/docs/_pdf_build/git_flow_diagram_branches.mmd b/docs/_pdf_build/git_flow_diagram_branches.mmd new file mode 100644 index 0000000..ee7019d --- /dev/null +++ b/docs/_pdf_build/git_flow_diagram_branches.mmd @@ -0,0 +1,21 @@ +flowchart TB + subgraph legend[" "] + direction LR + L1[Long-lived] + L2[Short-lived] + end + + M["master\n(always green, tagged releases)"] + N["next\n(integration / release candidate)"] + F["feature/* fix/*\n(fork next)"] + H["hotfix/*\n(fork master)"] + + F -->|"merge + CI green"| N + N -->|"release: merge + CI green"| M + H -->|"urgent patch + CI green"| M + M -->|"sync after release or hotfix"| N + + style M fill:#c8e6c9,stroke:#2e7d32 + style N fill:#bbdefb,stroke:#1565c0 + style F fill:#fff9c4,stroke:#f9a825 + style H fill:#ffccbc,stroke:#e64a19 diff --git a/docs/_pdf_build/git_flow_diagram_branches.png b/docs/_pdf_build/git_flow_diagram_branches.png new file mode 100644 index 0000000..b1dfab7 Binary files /dev/null and b/docs/_pdf_build/git_flow_diagram_branches.png differ diff --git a/docs/_pdf_build/git_flow_diagram_feature.mmd b/docs/_pdf_build/git_flow_diagram_feature.mmd new file mode 100644 index 0000000..09d2c0f --- /dev/null +++ b/docs/_pdf_build/git_flow_diagram_feature.mmd @@ -0,0 +1,15 @@ +sequenceDiagram + autonumber + participant Dev as Developer or agent + participant Topic as feature/* or fix/* + participant Next as next + participant CI as Tests / CI + + Dev->>Next: fetch, checkout, pull + Dev->>Topic: create branch from next + Dev->>Topic: commits + Dev->>CI: run tests + CI-->>Dev: pass + Dev->>Next: merge topic branch + Note over Next: next stays integration line + Dev->>Topic: delete branch diff --git a/docs/_pdf_build/git_flow_diagram_feature.png b/docs/_pdf_build/git_flow_diagram_feature.png new file mode 100644 index 0000000..8e32732 Binary files /dev/null and b/docs/_pdf_build/git_flow_diagram_feature.png differ diff --git a/docs/_pdf_build/git_flow_diagram_hotfix.mmd b/docs/_pdf_build/git_flow_diagram_hotfix.mmd new file mode 100644 index 0000000..70df4a5 --- /dev/null +++ b/docs/_pdf_build/git_flow_diagram_hotfix.mmd @@ -0,0 +1,21 @@ +flowchart TD + Start([Defect found]) + Q{Affects released code\non master / latest tag?} + + Start --> Q + Q -->|Yes| A[Branch hotfix/* from master] + A --> B[Fix + tests] + B --> C[Merge to master] + C --> D[Tag patch on master e.g. v0.1.3] + D --> E[Merge master into next] + E --> End([Done]) + + Q -->|No, only on next| F[Branch fix/* from next] + F --> G[Fix + tests] + G --> H[Merge to next only] + H --> End2([Ships with next release]) + + style C fill:#c8e6c9 + style D fill:#c8e6c9 + style E fill:#bbdefb + style H fill:#bbdefb diff --git a/docs/_pdf_build/git_flow_diagram_hotfix.png b/docs/_pdf_build/git_flow_diagram_hotfix.png new file mode 100644 index 0000000..dad7ff2 Binary files /dev/null and b/docs/_pdf_build/git_flow_diagram_hotfix.png differ diff --git a/docs/_pdf_build/git_flow_diagram_release.mmd b/docs/_pdf_build/git_flow_diagram_release.mmd new file mode 100644 index 0000000..1a1bb47 --- /dev/null +++ b/docs/_pdf_build/git_flow_diagram_release.mmd @@ -0,0 +1,16 @@ +sequenceDiagram + autonumber + participant Next as next + participant Master as master + participant CI as Tests / CI + participant Tag as tag vX.Y.Z + + Note over Next: feature complete, QA ok + Next->>CI: full test suite + CI-->>Next: green + Next->>Master: merge next to master + Master->>CI: smoke on master + CI-->>Master: green + Master->>Tag: annotated tag on master + Master->>Next: merge master into next (sync) + Note over Next: continue features from synced next diff --git a/docs/_pdf_build/git_flow_diagram_release.png b/docs/_pdf_build/git_flow_diagram_release.png new file mode 100644 index 0000000..062858a Binary files /dev/null and b/docs/_pdf_build/git_flow_diagram_release.png differ