From 8de4e200466af0aa8204c244a881e42b6d210516 Mon Sep 17 00:00:00 2001 From: hikos on laptop <2314753575@qq.com> Date: Thu, 30 Jul 2026 19:34:49 +0800 Subject: [PATCH] feat: add mtran ROS2 translation service --- src/mtran/.gitignore | 19 + src/mtran/CMakeLists.txt | 83 + src/mtran/README.md | 324 + src/mtran/config/translator.yaml | 8 + src/mtran/dependencies/auto_install.sh | 264 + src/mtran/dependencies/dependencies.txt | 71 + src/mtran/dependencies/tools/.gitkeep | 1 + src/mtran/dependencies/verify_runtime_data.py | 112 + .../plans/2026-07-29-mtran-ros2-service.md | 595 + .../2026-07-30-portable-mtran-package.md | 754 + .../2026-07-29-mtran-ros2-service-design.md | 291 + ...026-07-30-mtran-portable-package-design.md | 345 + .../include/mtran/http_translation_client.hpp | 70 + src/mtran/include/mtran/translator_node.hpp | 54 + src/mtran/launch/translator.launch.py | 88 + src/mtran/models/.gitkeep | 0 src/mtran/package.xml | 27 + src/mtran/src/http_translation_client.cpp | 137 + src/mtran/src/main.cpp | 16 + src/mtran/src/translator_node.cpp | 190 + src/mtran/srv/TranslateEnglishToChinese.srv | 5 + src/mtran/test/test_auto_install.sh | 240 + src/mtran/test/test_cmake_preparation.sh | 53 + src/mtran/test/test_dependency_manifest.sh | 34 + .../test/test_http_translation_client.cpp | 129 + src/mtran/test/test_launch_paths.py | 16 + src/mtran/test/test_package_identity.sh | 25 + src/mtran/test/test_readme_commands.sh | 29 + src/mtran/test/test_translator_node.cpp | 301 + src/mtran/test/test_vendor_source.sh | 21 + src/mtran/test/test_verify_runtime_data.py | 82 + src/mtran/vendor/mtranserver/.dockerignore | 13 + .../mtranserver/.github/workflows/build.yml | 235 + .../mtranserver/.github/workflows/desktop.yml | 52 + .../mtranserver/.github/workflows/docker.yml | 84 + .../mtranserver/.github/workflows/npm.yml | 43 + src/mtran/vendor/mtranserver/.gitignore | 27 + src/mtran/vendor/mtranserver/API.md | 81 + src/mtran/vendor/mtranserver/CHANGELOG.md | 3 + src/mtran/vendor/mtranserver/DONATE.md | 2 + src/mtran/vendor/mtranserver/Dockerfile | 35 + src/mtran/vendor/mtranserver/HISTORY.md | 110 + src/mtran/vendor/mtranserver/LICENSE | 201 + src/mtran/vendor/mtranserver/PROVENANCE.md | 14 + src/mtran/vendor/mtranserver/README.md | 214 + src/mtran/vendor/mtranserver/bun.lock | 1149 + src/mtran/vendor/mtranserver/compose.yml | 21 + .../mtranserver/deprecated/cpp/README.md | 3 + .../mtranserver/deprecated/go/CHANGELOG.md | 7 + .../mtranserver/deprecated/go/Dockerfile | 76 + .../mtranserver/deprecated/go/HISTORY.md | 71 + .../vendor/mtranserver/deprecated/go/Makefile | 59 + .../mtranserver/deprecated/go/README.md | 3 + .../mtranserver/deprecated/go/bin/bin.go | 11 + .../mtranserver/deprecated/go/bin/bin_hash.go | 4 + .../mtranserver/deprecated/go/bin/gen_hash.go | 42 + .../deprecated/go/bin/gen_update.go | 113 + .../mtranserver/deprecated/go/bin/utils.go | 14 + .../deprecated/go/bin/worker.version | 1 + .../deprecated/go/cmd/mtranserver/main.go | 82 + .../mtranserver/deprecated/go/data/data.go | 8 + .../deprecated/go/data/data_hash.go | 4 + .../deprecated/go/data/gen_hash.go | 42 + .../deprecated/go/data/gen_update.go | 26 + .../deprecated/go/data/records.json | 1 + .../mtranserver/deprecated/go/data/utils.go | 14 + .../vendor/mtranserver/deprecated/go/go.mod | 116 + .../vendor/mtranserver/deprecated/go/go.sum | 362 + .../deprecated/go/internal/config/config.go | 57 + .../deprecated/go/internal/docs/docs.go | 1175 + .../deprecated/go/internal/docs/swagger.json | 1151 + .../deprecated/go/internal/docs/swagger.yaml | 773 + .../go/internal/downloader/downloader.go | 171 + .../go/internal/downloader/downloader_test.go | 231 + .../deprecated/go/internal/handlers/deepl.go | 141 + .../deprecated/go/internal/handlers/google.go | 211 + .../deprecated/go/internal/handlers/hcfy.go | 412 + .../deprecated/go/internal/handlers/imme.go | 92 + .../deprecated/go/internal/handlers/kiss.go | 153 + .../go/internal/handlers/language.go | 42 + .../go/internal/handlers/language_test.go | 53 + .../deprecated/go/internal/handlers/system.go | 57 + .../go/internal/handlers/system_test.go | 61 + .../go/internal/handlers/translate.go | 131 + .../deprecated/go/internal/logger/logger.go | 119 + .../deprecated/go/internal/manager/client.go | 247 + .../go/internal/manager/client_test.go | 359 + .../deprecated/go/internal/manager/daemon.go | 422 + .../go/internal/manager/daemon_panic_test.go | 180 + .../go/internal/manager/daemon_race_test.go | 394 + .../go/internal/manager/daemon_stress_test.go | 381 + .../go/internal/manager/daemon_test.go | 219 + .../deprecated/go/internal/manager/manager.go | 422 + .../go/internal/manager/manager_test.go | 247 + .../deprecated/go/internal/manager/monitor.go | 137 + .../deprecated/go/internal/middleware/auth.go | 37 + .../go/internal/middleware/auth_test.go | 80 + .../deprecated/go/internal/middleware/cors.go | 23 + .../go/internal/middleware/cors_test.go | 46 + .../go/internal/middleware/logger.go | 65 + .../deprecated/go/internal/models/records.go | 421 + .../go/internal/models/records_test.go | 360 + .../deprecated/go/internal/routes/routes.go | 56 + .../go/internal/server/integration_test.go | 223 + .../deprecated/go/internal/server/server.go | 93 + .../go/internal/server/server_test.go | 89 + .../go/internal/services/detector.go | 308 + .../deprecated/go/internal/services/engine.go | 537 + .../deprecated/go/internal/services/memory.go | 13 + .../deprecated/go/internal/utils/env.go | 33 + .../deprecated/go/internal/utils/file.go | 76 + .../deprecated/go/internal/utils/file_test.go | 33 + .../go/internal/utils/lang_alias.go | 102 + .../go/internal/utils/lang_alias_test.go | 43 + .../deprecated/go/internal/utils/port.go | 17 + .../deprecated/go/internal/utils/port_test.go | 15 + .../deprecated/go/internal/utils/version.go | 121 + .../go/internal/utils/version_test.go | 80 + .../deprecated/go/internal/version/version.go | 17 + .../vendor/mtranserver/deprecated/go/ui.go | 13 + .../mtranserver/deprecated/js/CHANGELOG.md | 35 + .../mtranserver/deprecated/js/CONFIG.md | 22 + .../mtranserver/deprecated/js/Dockerfile | 29 + .../deprecated/js/Dockerfile.model | 44 + .../vendor/mtranserver/deprecated/js/Makefile | 46 + .../mtranserver/deprecated/js/README.md | 3 + .../vendor/mtranserver/deprecated/js/build.sh | 34 + .../mtranserver/deprecated/js/js/mts.js | 165 + .../deprecated/js/js/routes/base.js | 94 + .../deprecated/js/js/routes/plugins.js | 21 + .../deprecated/js/js/routes/plugins/deepl.js | 305 + .../deprecated/js/js/routes/plugins/deeplx.js | 305 + .../deprecated/js/js/routes/plugins/google.js | 76 + .../deprecated/js/js/routes/plugins/imme.js | 131 + .../deprecated/js/js/routes/plugins/kiss.js | 122 + .../deprecated/js/js/routes/translate.js | 178 + .../deprecated/js/js/utils/config.js | 50 + .../deprecated/js/js/utils/middleware.js | 42 + .../deprecated/js/js/utils/preload.js | 26 + .../deprecated/js/js/utils/translator.js | 76 + .../mtranserver/deprecated/js/nodemon.json | 13 + .../mtranserver/deprecated/js/package.json | 31 + .../deprecated/js/packages/mtran-core.tgz | Bin 0 -> 3518406 bytes .../mtranserver/deprecated/js/pnpm-lock.yaml | 905 + .../vendor/mtranserver/deprecated/js/start.sh | 25 + .../vendor/mtranserver/deprecated/js/test.sh | 36 + .../mtranserver/deprecated/js/tests/base.js | 184 + .../deprecated/js/tests/plugins.js | 241 + .../deprecated/js/tests/translate.js | 160 + .../mtranserver/deprecated/rust/README.md | 7 + src/mtran/vendor/mtranserver/desktop/app.js | 361 + .../vendor/mtranserver/desktop/config.js | 159 + src/mtran/vendor/mtranserver/desktop/i18n.js | 100 + src/mtran/vendor/mtranserver/desktop/ipc.js | 11 + src/mtran/vendor/mtranserver/desktop/ports.js | 32 + .../vendor/mtranserver/desktop/preload.cjs | 12 + .../vendor/mtranserver/desktop/server.js | 106 + src/mtran/vendor/mtranserver/desktop/tray.js | 122 + .../vendor/mtranserver/desktop/windows.js | 107 + src/mtran/vendor/mtranserver/docs/API_de.md | 80 + src/mtran/vendor/mtranserver/docs/API_en.md | 80 + src/mtran/vendor/mtranserver/docs/API_fr.md | 80 + src/mtran/vendor/mtranserver/docs/API_ja.md | 80 + .../vendor/mtranserver/docs/README_de.md | 211 + .../vendor/mtranserver/docs/README_en.md | 211 + .../vendor/mtranserver/docs/README_fr.md | 211 + .../vendor/mtranserver/docs/README_ja.md | 211 + .../vendor/mtranserver/example/README.md | 52 + src/mtran/vendor/mtranserver/example/usage.ts | 52 + .../vendor/mtranserver/images/alipay.jpg | Bin 0 -> 169137 bytes .../vendor/mtranserver/images/community.png | Bin 0 -> 14958 bytes src/mtran/vendor/mtranserver/images/icon.icns | Bin 0 -> 43209 bytes src/mtran/vendor/mtranserver/images/icon.ico | Bin 0 -> 361102 bytes src/mtran/vendor/mtranserver/images/icon.png | Bin 0 -> 54261 bytes src/mtran/vendor/mtranserver/images/icon.svg | 50 + .../mtranserver/images/icons/icon@1024px.png | Bin 0 -> 33898 bytes .../mtranserver/images/icons/icon@128px.png | Bin 0 -> 3207 bytes .../mtranserver/images/icons/icon@16px.png | Bin 0 -> 413 bytes .../mtranserver/images/icons/icon@180px.png | Bin 0 -> 4556 bytes .../mtranserver/images/icons/icon@192px.png | Bin 0 -> 4906 bytes .../mtranserver/images/icons/icon@2048px.png | Bin 0 -> 77457 bytes .../mtranserver/images/icons/icon@24px.png | Bin 0 -> 596 bytes .../mtranserver/images/icons/icon@256px.png | Bin 0 -> 6775 bytes .../mtranserver/images/icons/icon@32px.png | Bin 0 -> 791 bytes .../mtranserver/images/icons/icon@48px.png | Bin 0 -> 1210 bytes .../mtranserver/images/icons/icon@512px.png | Bin 0 -> 15056 bytes .../mtranserver/images/icons/icon@64px.png | Bin 0 -> 1596 bytes .../vendor/mtranserver/images/preview.png | Bin 0 -> 131548 bytes .../vendor/mtranserver/images/swagger.png | Bin 0 -> 54567 bytes src/mtran/vendor/mtranserver/images/ui.png | Bin 0 -> 82110 bytes src/mtran/vendor/mtranserver/images/wxpay.jpg | Bin 0 -> 76657 bytes src/mtran/vendor/mtranserver/install.sh | 20 + .../vendor/mtranserver/mtranserver.service | 15 + src/mtran/vendor/mtranserver/package.json | 141 + src/mtran/vendor/mtranserver/scripts/build.ts | 84 + src/mtran/vendor/mtranserver/scripts/bump.ts | 88 + .../mtranserver/scripts/electron-build.ts | 75 + .../mtranserver/scripts/electron-dev.ts | 116 + .../mtranserver/scripts/electron-main.js | 16 + .../mtranserver/scripts/gen-swagger-assets.ts | 43 + .../mtranserver/scripts/gen-ui-assets.ts | 44 + .../vendor/mtranserver/src/assets/index.ts | 13 + .../vendor/mtranserver/src/config/index.ts | 182 + .../src/controllers/language.controller.ts | 58 + .../controllers/plugins/deepl.controller.ts | 82 + .../controllers/plugins/deeplx.controller.ts | 74 + .../controllers/plugins/google.controller.ts | 85 + .../controllers/plugins/hcfy.controller.ts | 144 + .../controllers/plugins/imme.controller.ts | 72 + .../controllers/plugins/kiss.controller.ts | 54 + .../src/controllers/system.controller.ts | 38 + .../src/controllers/translate.controller.ts | 74 + .../vendor/mtranserver/src/core/engine.ts | 423 + .../vendor/mtranserver/src/core/factory.ts | 91 + .../vendor/mtranserver/src/core/index.ts | 0 .../vendor/mtranserver/src/core/interfaces.ts | 20 + .../vendor/mtranserver/src/core/loader.ts | 74 + src/mtran/vendor/mtranserver/src/desktop.ts | 2 + src/mtran/vendor/mtranserver/src/globals.d.ts | 24 + src/mtran/vendor/mtranserver/src/index.ts | 5 + .../mtranserver/src/lib/bergamot/LICENSE | 373 + .../src/lib/bergamot/bergamot-translator.js | 3647 ++ .../src/lib/bergamot/bergamot-translator.wasm | Bin 0 -> 4960506 bytes .../vendor/mtranserver/src/lib/cld2/LICENSE | 204 + .../vendor/mtranserver/src/lib/cld2/Makefile | 75 + .../vendor/mtranserver/src/lib/cld2/cld.cpp | 95 + .../vendor/mtranserver/src/lib/cld2/cld.idl | 53 + .../vendor/mtranserver/src/lib/cld2/cld.js | 332 + .../vendor/mtranserver/src/lib/cld2/cld2.js | 48 + .../vendor/mtranserver/src/lib/cld2/cld2.wasm | Bin 0 -> 1121167 bytes .../vendor/mtranserver/src/lib/cld2/cldapp.cc | 144 + .../mtranserver/src/lib/cld2/internal/LICENSE | 202 + .../src/lib/cld2/internal/cld2_dynamic_data.h | 216 + .../cld2/internal/cld2_dynamic_data_loader.h | 52 + .../internal/cld2_generated_cjk_compatible.cc | 298 + .../cld2_generated_deltaoctachrome0122.cc | 4601 ++ .../cld2_generated_distinctoctachrome0122.cc | 2208 + .../cld2_generated_quadchrome0122_16.cc | 52746 ++++++++++++++++ .../src/lib/cld2/internal/cld2tablesummary.h | 55 + .../internal/cld_generated_cjk_delta_bi_4.cc | 1136 + .../internal/cld_generated_cjk_uni_prop_80.cc | 7133 +++ .../cld_generated_score_quad_octa_0122_2.cc | 639 + .../src/lib/cld2/internal/cldutil.cc | 620 + .../src/lib/cld2/internal/cldutil.h | 80 + .../src/lib/cld2/internal/cldutil_shared.cc | 437 + .../src/lib/cld2/internal/cldutil_shared.h | 509 + .../src/lib/cld2/internal/compact_lang_det.cc | 322 + .../internal/compact_lang_det_hint_code.cc | 1649 + .../internal/compact_lang_det_hint_code.h | 95 + .../cld2/internal/compact_lang_det_impl.cc | 2039 + .../lib/cld2/internal/compact_lang_det_impl.h | 183 + .../mtranserver/src/lib/cld2/internal/debug.h | 58 + .../src/lib/cld2/internal/debug_empty.cc | 64 + .../src/lib/cld2/internal/fixunicodevalue.cc | 54 + .../src/lib/cld2/internal/fixunicodevalue.h | 68 + .../cld2/internal/generated_distinct_bi_0.cc | 52 + .../lib/cld2/internal/generated_entities.cc | 294 + .../lib/cld2/internal/generated_language.cc | 4680 ++ .../lib/cld2/internal/generated_language.h | 651 + .../lib/cld2/internal/generated_ulscript.cc | 781 + .../lib/cld2/internal/generated_ulscript.h | 140 + .../src/lib/cld2/internal/getonescriptspan.cc | 1086 + .../src/lib/cld2/internal/getonescriptspan.h | 110 + .../src/lib/cld2/internal/integral_types.h | 31 + .../src/lib/cld2/internal/lang_script.cc | 560 + .../src/lib/cld2/internal/lang_script.h | 187 + .../src/lib/cld2/internal/langspan.h | 40 + .../src/lib/cld2/internal/offsetmap.cc | 569 + .../src/lib/cld2/internal/offsetmap.h | 175 + .../mtranserver/src/lib/cld2/internal/port.h | 128 + .../lib/cld2/internal/scoreonescriptspan.cc | 1334 + .../lib/cld2/internal/scoreonescriptspan.h | 297 + .../src/lib/cld2/internal/stringpiece.h | 78 + .../mtranserver/src/lib/cld2/internal/tote.cc | 265 + .../mtranserver/src/lib/cld2/internal/tote.h | 112 + .../internal/utf8prop_lettermarkscriptnum.h | 1629 + .../cld2/internal/utf8repl_lettermarklower.h | 756 + .../internal/utf8scannot_lettermarkspecial.h | 1453 + .../src/lib/cld2/internal/utf8statetable.cc | 1369 + .../src/lib/cld2/internal/utf8statetable.h | 283 + .../vendor/mtranserver/src/lib/cld2/moz.yaml | 37 + .../vendor/mtranserver/src/lib/cld2/post.js | 128 + .../src/lib/cld2/public/compact_lang_det.h | 320 + .../src/lib/cld2/public/encodings.h | 169 + .../vendor/mtranserver/src/logger/index.ts | 143 + src/mtran/vendor/mtranserver/src/main.ts | 85 + .../vendor/mtranserver/src/middleware/auth.ts | 53 + .../vendor/mtranserver/src/middleware/cors.ts | 17 + .../src/middleware/error-handler.ts | 30 + .../mtranserver/src/middleware/index.ts | 5 + .../mtranserver/src/middleware/request-id.ts | 19 + .../src/middleware/request-logger.ts | 16 + .../mtranserver/src/middleware/swagger.ts | 31 + .../vendor/mtranserver/src/middleware/ui.ts | 51 + .../vendor/mtranserver/src/models/index.ts | 1 + .../vendor/mtranserver/src/models/records.ts | 271 + src/mtran/vendor/mtranserver/src/mtran.ts | 68 + .../vendor/mtranserver/src/server/download.ts | 59 + .../vendor/mtranserver/src/server/index.ts | 218 + .../mtranserver/src/server/languages.ts | 24 + .../mtranserver/src/services/detector.ts | 541 + .../vendor/mtranserver/src/services/engine.ts | 352 + .../vendor/mtranserver/src/services/index.ts | 2 + .../vendor/mtranserver/src/utils/cache.ts | 44 + .../vendor/mtranserver/src/utils/index.ts | 4 + .../mtranserver/src/utils/lang-alias.ts | 70 + .../vendor/mtranserver/src/utils/memory.ts | 10 + .../vendor/mtranserver/src/utils/port.ts | 18 + .../mtranserver/src/utils/update-checker.ts | 42 + .../vendor/mtranserver/src/utils/version.ts | 25 + .../vendor/mtranserver/src/version/index.ts | 5 + .../tests/cld-fix-validation.test.ts | 53 + .../mtranserver/tests/engine-html.test.ts | 30 + .../vendor/mtranserver/tests/reproduce_cld.ts | 23 + .../vendor/mtranserver/tests/stress-test.ts | 193 + src/mtran/vendor/mtranserver/tsconfig.json | 45 + .../vendor/mtranserver/tsconfig.lib.json | 10 + src/mtran/vendor/mtranserver/tsoa.json | 40 + src/mtran/vendor/mtranserver/ui/.gitignore | 24 + src/mtran/vendor/mtranserver/ui/bun.lock | 842 + .../vendor/mtranserver/ui/components.json | 22 + .../vendor/mtranserver/ui/eslint.config.js | 23 + src/mtran/vendor/mtranserver/ui/index.html | 14 + src/mtran/vendor/mtranserver/ui/package.json | 80 + .../vendor/mtranserver/ui/public/icon.png | Bin 0 -> 54261 bytes src/mtran/vendor/mtranserver/ui/src/App.css | 42 + src/mtran/vendor/mtranserver/ui/src/App.tsx | 263 + .../ui/src/components/DesktopSettingsPage.tsx | 392 + .../ui/src/components/HistorySheet.tsx | 142 + .../ui/src/components/SettingsMenu.tsx | 314 + .../ui/src/components/TranslationPanel.tsx | 777 + .../ui/src/components/ui/accordion.tsx | 64 + .../ui/src/components/ui/alert-dialog.tsx | 155 + .../ui/src/components/ui/alert.tsx | 66 + .../ui/src/components/ui/aspect-ratio.tsx | 11 + .../ui/src/components/ui/avatar.tsx | 51 + .../ui/src/components/ui/badge.tsx | 46 + .../ui/src/components/ui/breadcrumb.tsx | 109 + .../ui/src/components/ui/button-group.tsx | 83 + .../ui/src/components/ui/button.tsx | 60 + .../ui/src/components/ui/calendar.tsx | 216 + .../mtranserver/ui/src/components/ui/card.tsx | 92 + .../ui/src/components/ui/carousel.tsx | 239 + .../ui/src/components/ui/chart.tsx | 357 + .../ui/src/components/ui/checkbox.tsx | 32 + .../ui/src/components/ui/collapsible.tsx | 31 + .../ui/src/components/ui/command.tsx | 182 + .../ui/src/components/ui/context-menu.tsx | 252 + .../ui/src/components/ui/dialog.tsx | 141 + .../ui/src/components/ui/drawer.tsx | 135 + .../ui/src/components/ui/dropdown-menu.tsx | 255 + .../ui/src/components/ui/empty.tsx | 104 + .../ui/src/components/ui/field.tsx | 246 + .../mtranserver/ui/src/components/ui/form.tsx | 167 + .../ui/src/components/ui/hover-card.tsx | 44 + .../ui/src/components/ui/input-group.tsx | 170 + .../ui/src/components/ui/input-otp.tsx | 75 + .../ui/src/components/ui/input.tsx | 21 + .../mtranserver/ui/src/components/ui/item.tsx | 193 + .../mtranserver/ui/src/components/ui/kbd.tsx | 28 + .../ui/src/components/ui/label.tsx | 24 + .../ui/src/components/ui/menubar.tsx | 274 + .../ui/src/components/ui/navigation-menu.tsx | 168 + .../ui/src/components/ui/pagination.tsx | 127 + .../ui/src/components/ui/popover.tsx | 48 + .../ui/src/components/ui/progress.tsx | 29 + .../ui/src/components/ui/radio-group.tsx | 45 + .../ui/src/components/ui/resizable.tsx | 54 + .../ui/src/components/ui/scroll-area.tsx | 58 + .../ui/src/components/ui/select.tsx | 185 + .../ui/src/components/ui/separator.tsx | 28 + .../ui/src/components/ui/sheet.tsx | 137 + .../ui/src/components/ui/sidebar.tsx | 726 + .../ui/src/components/ui/skeleton.tsx | 13 + .../ui/src/components/ui/slider.tsx | 63 + .../ui/src/components/ui/sonner.tsx | 38 + .../ui/src/components/ui/spinner.tsx | 16 + .../ui/src/components/ui/switch.tsx | 31 + .../ui/src/components/ui/table.tsx | 114 + .../mtranserver/ui/src/components/ui/tabs.tsx | 66 + .../ui/src/components/ui/textarea.tsx | 18 + .../ui/src/components/ui/toggle-group.tsx | 81 + .../ui/src/components/ui/toggle.tsx | 45 + .../ui/src/components/ui/tooltip.tsx | 61 + .../ui/src/contexts/ThemeContext.tsx | 61 + .../vendor/mtranserver/ui/src/desktop.d.ts | 11 + .../mtranserver/ui/src/hooks/use-history.ts | 131 + .../mtranserver/ui/src/hooks/use-mobile.ts | 19 + .../vendor/mtranserver/ui/src/i18n/index.ts | 368 + src/mtran/vendor/mtranserver/ui/src/index.css | 128 + src/mtran/vendor/mtranserver/ui/src/lib/db.ts | 119 + .../vendor/mtranserver/ui/src/lib/desktop.ts | 81 + .../mtranserver/ui/src/lib/languages.ts | 41 + .../vendor/mtranserver/ui/src/lib/utils.ts | 6 + src/mtran/vendor/mtranserver/ui/src/main.tsx | 16 + .../vendor/mtranserver/ui/tsconfig.app.json | 40 + src/mtran/vendor/mtranserver/ui/tsconfig.json | 19 + .../vendor/mtranserver/ui/tsconfig.node.json | 26 + .../vendor/mtranserver/ui/vite.config.ts | 34 + src/mtran/vendor/mtranserver/uninstall.sh | 29 + 400 files changed, 137442 insertions(+) create mode 100644 src/mtran/.gitignore create mode 100644 src/mtran/CMakeLists.txt create mode 100644 src/mtran/README.md create mode 100644 src/mtran/config/translator.yaml create mode 100755 src/mtran/dependencies/auto_install.sh create mode 100644 src/mtran/dependencies/dependencies.txt create mode 100644 src/mtran/dependencies/tools/.gitkeep create mode 100755 src/mtran/dependencies/verify_runtime_data.py create mode 100644 src/mtran/docs/superpowers/plans/2026-07-29-mtran-ros2-service.md create mode 100644 src/mtran/docs/superpowers/plans/2026-07-30-portable-mtran-package.md create mode 100644 src/mtran/docs/superpowers/specs/2026-07-29-mtran-ros2-service-design.md create mode 100644 src/mtran/docs/superpowers/specs/2026-07-30-mtran-portable-package-design.md create mode 100644 src/mtran/include/mtran/http_translation_client.hpp create mode 100644 src/mtran/include/mtran/translator_node.hpp create mode 100644 src/mtran/launch/translator.launch.py create mode 100644 src/mtran/models/.gitkeep create mode 100644 src/mtran/package.xml create mode 100644 src/mtran/src/http_translation_client.cpp create mode 100644 src/mtran/src/main.cpp create mode 100644 src/mtran/src/translator_node.cpp create mode 100644 src/mtran/srv/TranslateEnglishToChinese.srv create mode 100644 src/mtran/test/test_auto_install.sh create mode 100644 src/mtran/test/test_cmake_preparation.sh create mode 100644 src/mtran/test/test_dependency_manifest.sh create mode 100644 src/mtran/test/test_http_translation_client.cpp create mode 100644 src/mtran/test/test_launch_paths.py create mode 100644 src/mtran/test/test_package_identity.sh create mode 100644 src/mtran/test/test_readme_commands.sh create mode 100644 src/mtran/test/test_translator_node.cpp create mode 100644 src/mtran/test/test_vendor_source.sh create mode 100644 src/mtran/test/test_verify_runtime_data.py create mode 100644 src/mtran/vendor/mtranserver/.dockerignore create mode 100644 src/mtran/vendor/mtranserver/.github/workflows/build.yml create mode 100644 src/mtran/vendor/mtranserver/.github/workflows/desktop.yml create mode 100644 src/mtran/vendor/mtranserver/.github/workflows/docker.yml create mode 100644 src/mtran/vendor/mtranserver/.github/workflows/npm.yml create mode 100644 src/mtran/vendor/mtranserver/.gitignore create mode 100644 src/mtran/vendor/mtranserver/API.md create mode 100644 src/mtran/vendor/mtranserver/CHANGELOG.md create mode 100644 src/mtran/vendor/mtranserver/DONATE.md create mode 100644 src/mtran/vendor/mtranserver/Dockerfile create mode 100644 src/mtran/vendor/mtranserver/HISTORY.md create mode 100644 src/mtran/vendor/mtranserver/LICENSE create mode 100644 src/mtran/vendor/mtranserver/PROVENANCE.md create mode 100644 src/mtran/vendor/mtranserver/README.md create mode 100644 src/mtran/vendor/mtranserver/bun.lock create mode 100644 src/mtran/vendor/mtranserver/compose.yml create mode 100644 src/mtran/vendor/mtranserver/deprecated/cpp/README.md create mode 100644 src/mtran/vendor/mtranserver/deprecated/go/CHANGELOG.md create mode 100644 src/mtran/vendor/mtranserver/deprecated/go/Dockerfile create mode 100644 src/mtran/vendor/mtranserver/deprecated/go/HISTORY.md create mode 100644 src/mtran/vendor/mtranserver/deprecated/go/Makefile create mode 100644 src/mtran/vendor/mtranserver/deprecated/go/README.md create mode 100644 src/mtran/vendor/mtranserver/deprecated/go/bin/bin.go create mode 100644 src/mtran/vendor/mtranserver/deprecated/go/bin/bin_hash.go create mode 100644 src/mtran/vendor/mtranserver/deprecated/go/bin/gen_hash.go create mode 100644 src/mtran/vendor/mtranserver/deprecated/go/bin/gen_update.go create mode 100644 src/mtran/vendor/mtranserver/deprecated/go/bin/utils.go create mode 100644 src/mtran/vendor/mtranserver/deprecated/go/bin/worker.version create mode 100644 src/mtran/vendor/mtranserver/deprecated/go/cmd/mtranserver/main.go create mode 100644 src/mtran/vendor/mtranserver/deprecated/go/data/data.go create mode 100644 src/mtran/vendor/mtranserver/deprecated/go/data/data_hash.go create mode 100644 src/mtran/vendor/mtranserver/deprecated/go/data/gen_hash.go create mode 100644 src/mtran/vendor/mtranserver/deprecated/go/data/gen_update.go create mode 100644 src/mtran/vendor/mtranserver/deprecated/go/data/records.json create mode 100644 src/mtran/vendor/mtranserver/deprecated/go/data/utils.go create mode 100644 src/mtran/vendor/mtranserver/deprecated/go/go.mod create mode 100644 src/mtran/vendor/mtranserver/deprecated/go/go.sum create mode 100644 src/mtran/vendor/mtranserver/deprecated/go/internal/config/config.go create mode 100644 src/mtran/vendor/mtranserver/deprecated/go/internal/docs/docs.go create mode 100644 src/mtran/vendor/mtranserver/deprecated/go/internal/docs/swagger.json create mode 100644 src/mtran/vendor/mtranserver/deprecated/go/internal/docs/swagger.yaml create mode 100644 src/mtran/vendor/mtranserver/deprecated/go/internal/downloader/downloader.go create mode 100644 src/mtran/vendor/mtranserver/deprecated/go/internal/downloader/downloader_test.go create mode 100644 src/mtran/vendor/mtranserver/deprecated/go/internal/handlers/deepl.go create mode 100644 src/mtran/vendor/mtranserver/deprecated/go/internal/handlers/google.go create mode 100644 src/mtran/vendor/mtranserver/deprecated/go/internal/handlers/hcfy.go create mode 100644 src/mtran/vendor/mtranserver/deprecated/go/internal/handlers/imme.go create mode 100644 src/mtran/vendor/mtranserver/deprecated/go/internal/handlers/kiss.go create mode 100644 src/mtran/vendor/mtranserver/deprecated/go/internal/handlers/language.go create mode 100644 src/mtran/vendor/mtranserver/deprecated/go/internal/handlers/language_test.go create mode 100644 src/mtran/vendor/mtranserver/deprecated/go/internal/handlers/system.go create mode 100644 src/mtran/vendor/mtranserver/deprecated/go/internal/handlers/system_test.go create mode 100644 src/mtran/vendor/mtranserver/deprecated/go/internal/handlers/translate.go create mode 100644 src/mtran/vendor/mtranserver/deprecated/go/internal/logger/logger.go create mode 100644 src/mtran/vendor/mtranserver/deprecated/go/internal/manager/client.go create mode 100644 src/mtran/vendor/mtranserver/deprecated/go/internal/manager/client_test.go create mode 100644 src/mtran/vendor/mtranserver/deprecated/go/internal/manager/daemon.go create mode 100644 src/mtran/vendor/mtranserver/deprecated/go/internal/manager/daemon_panic_test.go create mode 100644 src/mtran/vendor/mtranserver/deprecated/go/internal/manager/daemon_race_test.go create mode 100644 src/mtran/vendor/mtranserver/deprecated/go/internal/manager/daemon_stress_test.go create mode 100644 src/mtran/vendor/mtranserver/deprecated/go/internal/manager/daemon_test.go create mode 100644 src/mtran/vendor/mtranserver/deprecated/go/internal/manager/manager.go create mode 100644 src/mtran/vendor/mtranserver/deprecated/go/internal/manager/manager_test.go create mode 100644 src/mtran/vendor/mtranserver/deprecated/go/internal/manager/monitor.go create mode 100644 src/mtran/vendor/mtranserver/deprecated/go/internal/middleware/auth.go create mode 100644 src/mtran/vendor/mtranserver/deprecated/go/internal/middleware/auth_test.go create mode 100644 src/mtran/vendor/mtranserver/deprecated/go/internal/middleware/cors.go create mode 100644 src/mtran/vendor/mtranserver/deprecated/go/internal/middleware/cors_test.go create mode 100644 src/mtran/vendor/mtranserver/deprecated/go/internal/middleware/logger.go create mode 100644 src/mtran/vendor/mtranserver/deprecated/go/internal/models/records.go create mode 100644 src/mtran/vendor/mtranserver/deprecated/go/internal/models/records_test.go create mode 100644 src/mtran/vendor/mtranserver/deprecated/go/internal/routes/routes.go create mode 100644 src/mtran/vendor/mtranserver/deprecated/go/internal/server/integration_test.go create mode 100644 src/mtran/vendor/mtranserver/deprecated/go/internal/server/server.go create mode 100644 src/mtran/vendor/mtranserver/deprecated/go/internal/server/server_test.go create mode 100644 src/mtran/vendor/mtranserver/deprecated/go/internal/services/detector.go create mode 100644 src/mtran/vendor/mtranserver/deprecated/go/internal/services/engine.go create mode 100644 src/mtran/vendor/mtranserver/deprecated/go/internal/services/memory.go create mode 100644 src/mtran/vendor/mtranserver/deprecated/go/internal/utils/env.go create mode 100644 src/mtran/vendor/mtranserver/deprecated/go/internal/utils/file.go create mode 100644 src/mtran/vendor/mtranserver/deprecated/go/internal/utils/file_test.go create mode 100644 src/mtran/vendor/mtranserver/deprecated/go/internal/utils/lang_alias.go create mode 100644 src/mtran/vendor/mtranserver/deprecated/go/internal/utils/lang_alias_test.go create mode 100644 src/mtran/vendor/mtranserver/deprecated/go/internal/utils/port.go create mode 100644 src/mtran/vendor/mtranserver/deprecated/go/internal/utils/port_test.go create mode 100644 src/mtran/vendor/mtranserver/deprecated/go/internal/utils/version.go create mode 100644 src/mtran/vendor/mtranserver/deprecated/go/internal/utils/version_test.go create mode 100644 src/mtran/vendor/mtranserver/deprecated/go/internal/version/version.go create mode 100644 src/mtran/vendor/mtranserver/deprecated/go/ui.go create mode 100644 src/mtran/vendor/mtranserver/deprecated/js/CHANGELOG.md create mode 100644 src/mtran/vendor/mtranserver/deprecated/js/CONFIG.md create mode 100644 src/mtran/vendor/mtranserver/deprecated/js/Dockerfile create mode 100644 src/mtran/vendor/mtranserver/deprecated/js/Dockerfile.model create mode 100644 src/mtran/vendor/mtranserver/deprecated/js/Makefile create mode 100644 src/mtran/vendor/mtranserver/deprecated/js/README.md create mode 100755 src/mtran/vendor/mtranserver/deprecated/js/build.sh create mode 100755 src/mtran/vendor/mtranserver/deprecated/js/js/mts.js create mode 100644 src/mtran/vendor/mtranserver/deprecated/js/js/routes/base.js create mode 100644 src/mtran/vendor/mtranserver/deprecated/js/js/routes/plugins.js create mode 100644 src/mtran/vendor/mtranserver/deprecated/js/js/routes/plugins/deepl.js create mode 100644 src/mtran/vendor/mtranserver/deprecated/js/js/routes/plugins/deeplx.js create mode 100644 src/mtran/vendor/mtranserver/deprecated/js/js/routes/plugins/google.js create mode 100644 src/mtran/vendor/mtranserver/deprecated/js/js/routes/plugins/imme.js create mode 100644 src/mtran/vendor/mtranserver/deprecated/js/js/routes/plugins/kiss.js create mode 100644 src/mtran/vendor/mtranserver/deprecated/js/js/routes/translate.js create mode 100644 src/mtran/vendor/mtranserver/deprecated/js/js/utils/config.js create mode 100644 src/mtran/vendor/mtranserver/deprecated/js/js/utils/middleware.js create mode 100644 src/mtran/vendor/mtranserver/deprecated/js/js/utils/preload.js create mode 100644 src/mtran/vendor/mtranserver/deprecated/js/js/utils/translator.js create mode 100644 src/mtran/vendor/mtranserver/deprecated/js/nodemon.json create mode 100644 src/mtran/vendor/mtranserver/deprecated/js/package.json create mode 100644 src/mtran/vendor/mtranserver/deprecated/js/packages/mtran-core.tgz create mode 100644 src/mtran/vendor/mtranserver/deprecated/js/pnpm-lock.yaml create mode 100755 src/mtran/vendor/mtranserver/deprecated/js/start.sh create mode 100755 src/mtran/vendor/mtranserver/deprecated/js/test.sh create mode 100755 src/mtran/vendor/mtranserver/deprecated/js/tests/base.js create mode 100755 src/mtran/vendor/mtranserver/deprecated/js/tests/plugins.js create mode 100755 src/mtran/vendor/mtranserver/deprecated/js/tests/translate.js create mode 100644 src/mtran/vendor/mtranserver/deprecated/rust/README.md create mode 100644 src/mtran/vendor/mtranserver/desktop/app.js create mode 100644 src/mtran/vendor/mtranserver/desktop/config.js create mode 100644 src/mtran/vendor/mtranserver/desktop/i18n.js create mode 100644 src/mtran/vendor/mtranserver/desktop/ipc.js create mode 100644 src/mtran/vendor/mtranserver/desktop/ports.js create mode 100644 src/mtran/vendor/mtranserver/desktop/preload.cjs create mode 100644 src/mtran/vendor/mtranserver/desktop/server.js create mode 100644 src/mtran/vendor/mtranserver/desktop/tray.js create mode 100644 src/mtran/vendor/mtranserver/desktop/windows.js create mode 100644 src/mtran/vendor/mtranserver/docs/API_de.md create mode 100644 src/mtran/vendor/mtranserver/docs/API_en.md create mode 100644 src/mtran/vendor/mtranserver/docs/API_fr.md create mode 100644 src/mtran/vendor/mtranserver/docs/API_ja.md create mode 100644 src/mtran/vendor/mtranserver/docs/README_de.md create mode 100644 src/mtran/vendor/mtranserver/docs/README_en.md create mode 100644 src/mtran/vendor/mtranserver/docs/README_fr.md create mode 100644 src/mtran/vendor/mtranserver/docs/README_ja.md create mode 100644 src/mtran/vendor/mtranserver/example/README.md create mode 100644 src/mtran/vendor/mtranserver/example/usage.ts create mode 100644 src/mtran/vendor/mtranserver/images/alipay.jpg create mode 100644 src/mtran/vendor/mtranserver/images/community.png create mode 100644 src/mtran/vendor/mtranserver/images/icon.icns create mode 100644 src/mtran/vendor/mtranserver/images/icon.ico create mode 100644 src/mtran/vendor/mtranserver/images/icon.png create mode 100644 src/mtran/vendor/mtranserver/images/icon.svg create mode 100644 src/mtran/vendor/mtranserver/images/icons/icon@1024px.png create mode 100644 src/mtran/vendor/mtranserver/images/icons/icon@128px.png create mode 100644 src/mtran/vendor/mtranserver/images/icons/icon@16px.png create mode 100644 src/mtran/vendor/mtranserver/images/icons/icon@180px.png create mode 100644 src/mtran/vendor/mtranserver/images/icons/icon@192px.png create mode 100644 src/mtran/vendor/mtranserver/images/icons/icon@2048px.png create mode 100644 src/mtran/vendor/mtranserver/images/icons/icon@24px.png create mode 100644 src/mtran/vendor/mtranserver/images/icons/icon@256px.png create mode 100644 src/mtran/vendor/mtranserver/images/icons/icon@32px.png create mode 100644 src/mtran/vendor/mtranserver/images/icons/icon@48px.png create mode 100644 src/mtran/vendor/mtranserver/images/icons/icon@512px.png create mode 100644 src/mtran/vendor/mtranserver/images/icons/icon@64px.png create mode 100644 src/mtran/vendor/mtranserver/images/preview.png create mode 100644 src/mtran/vendor/mtranserver/images/swagger.png create mode 100644 src/mtran/vendor/mtranserver/images/ui.png create mode 100644 src/mtran/vendor/mtranserver/images/wxpay.jpg create mode 100755 src/mtran/vendor/mtranserver/install.sh create mode 100644 src/mtran/vendor/mtranserver/mtranserver.service create mode 100644 src/mtran/vendor/mtranserver/package.json create mode 100644 src/mtran/vendor/mtranserver/scripts/build.ts create mode 100644 src/mtran/vendor/mtranserver/scripts/bump.ts create mode 100644 src/mtran/vendor/mtranserver/scripts/electron-build.ts create mode 100644 src/mtran/vendor/mtranserver/scripts/electron-dev.ts create mode 100644 src/mtran/vendor/mtranserver/scripts/electron-main.js create mode 100644 src/mtran/vendor/mtranserver/scripts/gen-swagger-assets.ts create mode 100644 src/mtran/vendor/mtranserver/scripts/gen-ui-assets.ts create mode 100644 src/mtran/vendor/mtranserver/src/assets/index.ts create mode 100644 src/mtran/vendor/mtranserver/src/config/index.ts create mode 100644 src/mtran/vendor/mtranserver/src/controllers/language.controller.ts create mode 100644 src/mtran/vendor/mtranserver/src/controllers/plugins/deepl.controller.ts create mode 100644 src/mtran/vendor/mtranserver/src/controllers/plugins/deeplx.controller.ts create mode 100644 src/mtran/vendor/mtranserver/src/controllers/plugins/google.controller.ts create mode 100644 src/mtran/vendor/mtranserver/src/controllers/plugins/hcfy.controller.ts create mode 100644 src/mtran/vendor/mtranserver/src/controllers/plugins/imme.controller.ts create mode 100644 src/mtran/vendor/mtranserver/src/controllers/plugins/kiss.controller.ts create mode 100644 src/mtran/vendor/mtranserver/src/controllers/system.controller.ts create mode 100644 src/mtran/vendor/mtranserver/src/controllers/translate.controller.ts create mode 100644 src/mtran/vendor/mtranserver/src/core/engine.ts create mode 100644 src/mtran/vendor/mtranserver/src/core/factory.ts create mode 100644 src/mtran/vendor/mtranserver/src/core/index.ts create mode 100644 src/mtran/vendor/mtranserver/src/core/interfaces.ts create mode 100644 src/mtran/vendor/mtranserver/src/core/loader.ts create mode 100644 src/mtran/vendor/mtranserver/src/desktop.ts create mode 100644 src/mtran/vendor/mtranserver/src/globals.d.ts create mode 100644 src/mtran/vendor/mtranserver/src/index.ts create mode 100644 src/mtran/vendor/mtranserver/src/lib/bergamot/LICENSE create mode 100644 src/mtran/vendor/mtranserver/src/lib/bergamot/bergamot-translator.js create mode 100755 src/mtran/vendor/mtranserver/src/lib/bergamot/bergamot-translator.wasm create mode 100644 src/mtran/vendor/mtranserver/src/lib/cld2/LICENSE create mode 100644 src/mtran/vendor/mtranserver/src/lib/cld2/Makefile create mode 100644 src/mtran/vendor/mtranserver/src/lib/cld2/cld.cpp create mode 100644 src/mtran/vendor/mtranserver/src/lib/cld2/cld.idl create mode 100644 src/mtran/vendor/mtranserver/src/lib/cld2/cld.js create mode 100644 src/mtran/vendor/mtranserver/src/lib/cld2/cld2.js create mode 100755 src/mtran/vendor/mtranserver/src/lib/cld2/cld2.wasm create mode 100644 src/mtran/vendor/mtranserver/src/lib/cld2/cldapp.cc create mode 100644 src/mtran/vendor/mtranserver/src/lib/cld2/internal/LICENSE create mode 100644 src/mtran/vendor/mtranserver/src/lib/cld2/internal/cld2_dynamic_data.h create mode 100644 src/mtran/vendor/mtranserver/src/lib/cld2/internal/cld2_dynamic_data_loader.h create mode 100644 src/mtran/vendor/mtranserver/src/lib/cld2/internal/cld2_generated_cjk_compatible.cc create mode 100644 src/mtran/vendor/mtranserver/src/lib/cld2/internal/cld2_generated_deltaoctachrome0122.cc create mode 100644 src/mtran/vendor/mtranserver/src/lib/cld2/internal/cld2_generated_distinctoctachrome0122.cc create mode 100644 src/mtran/vendor/mtranserver/src/lib/cld2/internal/cld2_generated_quadchrome0122_16.cc create mode 100644 src/mtran/vendor/mtranserver/src/lib/cld2/internal/cld2tablesummary.h create mode 100644 src/mtran/vendor/mtranserver/src/lib/cld2/internal/cld_generated_cjk_delta_bi_4.cc create mode 100644 src/mtran/vendor/mtranserver/src/lib/cld2/internal/cld_generated_cjk_uni_prop_80.cc create mode 100644 src/mtran/vendor/mtranserver/src/lib/cld2/internal/cld_generated_score_quad_octa_0122_2.cc create mode 100644 src/mtran/vendor/mtranserver/src/lib/cld2/internal/cldutil.cc create mode 100644 src/mtran/vendor/mtranserver/src/lib/cld2/internal/cldutil.h create mode 100644 src/mtran/vendor/mtranserver/src/lib/cld2/internal/cldutil_shared.cc create mode 100644 src/mtran/vendor/mtranserver/src/lib/cld2/internal/cldutil_shared.h create mode 100644 src/mtran/vendor/mtranserver/src/lib/cld2/internal/compact_lang_det.cc create mode 100644 src/mtran/vendor/mtranserver/src/lib/cld2/internal/compact_lang_det_hint_code.cc create mode 100644 src/mtran/vendor/mtranserver/src/lib/cld2/internal/compact_lang_det_hint_code.h create mode 100644 src/mtran/vendor/mtranserver/src/lib/cld2/internal/compact_lang_det_impl.cc create mode 100644 src/mtran/vendor/mtranserver/src/lib/cld2/internal/compact_lang_det_impl.h create mode 100644 src/mtran/vendor/mtranserver/src/lib/cld2/internal/debug.h create mode 100644 src/mtran/vendor/mtranserver/src/lib/cld2/internal/debug_empty.cc create mode 100644 src/mtran/vendor/mtranserver/src/lib/cld2/internal/fixunicodevalue.cc create mode 100644 src/mtran/vendor/mtranserver/src/lib/cld2/internal/fixunicodevalue.h create mode 100644 src/mtran/vendor/mtranserver/src/lib/cld2/internal/generated_distinct_bi_0.cc create mode 100644 src/mtran/vendor/mtranserver/src/lib/cld2/internal/generated_entities.cc create mode 100644 src/mtran/vendor/mtranserver/src/lib/cld2/internal/generated_language.cc create mode 100644 src/mtran/vendor/mtranserver/src/lib/cld2/internal/generated_language.h create mode 100644 src/mtran/vendor/mtranserver/src/lib/cld2/internal/generated_ulscript.cc create mode 100644 src/mtran/vendor/mtranserver/src/lib/cld2/internal/generated_ulscript.h create mode 100644 src/mtran/vendor/mtranserver/src/lib/cld2/internal/getonescriptspan.cc create mode 100644 src/mtran/vendor/mtranserver/src/lib/cld2/internal/getonescriptspan.h create mode 100644 src/mtran/vendor/mtranserver/src/lib/cld2/internal/integral_types.h create mode 100644 src/mtran/vendor/mtranserver/src/lib/cld2/internal/lang_script.cc create mode 100644 src/mtran/vendor/mtranserver/src/lib/cld2/internal/lang_script.h create mode 100644 src/mtran/vendor/mtranserver/src/lib/cld2/internal/langspan.h create mode 100644 src/mtran/vendor/mtranserver/src/lib/cld2/internal/offsetmap.cc create mode 100644 src/mtran/vendor/mtranserver/src/lib/cld2/internal/offsetmap.h create mode 100644 src/mtran/vendor/mtranserver/src/lib/cld2/internal/port.h create mode 100644 src/mtran/vendor/mtranserver/src/lib/cld2/internal/scoreonescriptspan.cc create mode 100644 src/mtran/vendor/mtranserver/src/lib/cld2/internal/scoreonescriptspan.h create mode 100644 src/mtran/vendor/mtranserver/src/lib/cld2/internal/stringpiece.h create mode 100644 src/mtran/vendor/mtranserver/src/lib/cld2/internal/tote.cc create mode 100644 src/mtran/vendor/mtranserver/src/lib/cld2/internal/tote.h create mode 100644 src/mtran/vendor/mtranserver/src/lib/cld2/internal/utf8prop_lettermarkscriptnum.h create mode 100644 src/mtran/vendor/mtranserver/src/lib/cld2/internal/utf8repl_lettermarklower.h create mode 100644 src/mtran/vendor/mtranserver/src/lib/cld2/internal/utf8scannot_lettermarkspecial.h create mode 100644 src/mtran/vendor/mtranserver/src/lib/cld2/internal/utf8statetable.cc create mode 100644 src/mtran/vendor/mtranserver/src/lib/cld2/internal/utf8statetable.h create mode 100644 src/mtran/vendor/mtranserver/src/lib/cld2/moz.yaml create mode 100644 src/mtran/vendor/mtranserver/src/lib/cld2/post.js create mode 100644 src/mtran/vendor/mtranserver/src/lib/cld2/public/compact_lang_det.h create mode 100644 src/mtran/vendor/mtranserver/src/lib/cld2/public/encodings.h create mode 100644 src/mtran/vendor/mtranserver/src/logger/index.ts create mode 100644 src/mtran/vendor/mtranserver/src/main.ts create mode 100644 src/mtran/vendor/mtranserver/src/middleware/auth.ts create mode 100644 src/mtran/vendor/mtranserver/src/middleware/cors.ts create mode 100644 src/mtran/vendor/mtranserver/src/middleware/error-handler.ts create mode 100644 src/mtran/vendor/mtranserver/src/middleware/index.ts create mode 100644 src/mtran/vendor/mtranserver/src/middleware/request-id.ts create mode 100644 src/mtran/vendor/mtranserver/src/middleware/request-logger.ts create mode 100644 src/mtran/vendor/mtranserver/src/middleware/swagger.ts create mode 100644 src/mtran/vendor/mtranserver/src/middleware/ui.ts create mode 100644 src/mtran/vendor/mtranserver/src/models/index.ts create mode 100644 src/mtran/vendor/mtranserver/src/models/records.ts create mode 100644 src/mtran/vendor/mtranserver/src/mtran.ts create mode 100644 src/mtran/vendor/mtranserver/src/server/download.ts create mode 100644 src/mtran/vendor/mtranserver/src/server/index.ts create mode 100644 src/mtran/vendor/mtranserver/src/server/languages.ts create mode 100644 src/mtran/vendor/mtranserver/src/services/detector.ts create mode 100644 src/mtran/vendor/mtranserver/src/services/engine.ts create mode 100644 src/mtran/vendor/mtranserver/src/services/index.ts create mode 100644 src/mtran/vendor/mtranserver/src/utils/cache.ts create mode 100644 src/mtran/vendor/mtranserver/src/utils/index.ts create mode 100644 src/mtran/vendor/mtranserver/src/utils/lang-alias.ts create mode 100644 src/mtran/vendor/mtranserver/src/utils/memory.ts create mode 100644 src/mtran/vendor/mtranserver/src/utils/port.ts create mode 100644 src/mtran/vendor/mtranserver/src/utils/update-checker.ts create mode 100644 src/mtran/vendor/mtranserver/src/utils/version.ts create mode 100644 src/mtran/vendor/mtranserver/src/version/index.ts create mode 100644 src/mtran/vendor/mtranserver/tests/cld-fix-validation.test.ts create mode 100644 src/mtran/vendor/mtranserver/tests/engine-html.test.ts create mode 100644 src/mtran/vendor/mtranserver/tests/reproduce_cld.ts create mode 100644 src/mtran/vendor/mtranserver/tests/stress-test.ts create mode 100644 src/mtran/vendor/mtranserver/tsconfig.json create mode 100644 src/mtran/vendor/mtranserver/tsconfig.lib.json create mode 100644 src/mtran/vendor/mtranserver/tsoa.json create mode 100644 src/mtran/vendor/mtranserver/ui/.gitignore create mode 100644 src/mtran/vendor/mtranserver/ui/bun.lock create mode 100644 src/mtran/vendor/mtranserver/ui/components.json create mode 100644 src/mtran/vendor/mtranserver/ui/eslint.config.js create mode 100644 src/mtran/vendor/mtranserver/ui/index.html create mode 100644 src/mtran/vendor/mtranserver/ui/package.json create mode 100644 src/mtran/vendor/mtranserver/ui/public/icon.png create mode 100644 src/mtran/vendor/mtranserver/ui/src/App.css create mode 100644 src/mtran/vendor/mtranserver/ui/src/App.tsx create mode 100644 src/mtran/vendor/mtranserver/ui/src/components/DesktopSettingsPage.tsx create mode 100644 src/mtran/vendor/mtranserver/ui/src/components/HistorySheet.tsx create mode 100644 src/mtran/vendor/mtranserver/ui/src/components/SettingsMenu.tsx create mode 100644 src/mtran/vendor/mtranserver/ui/src/components/TranslationPanel.tsx create mode 100644 src/mtran/vendor/mtranserver/ui/src/components/ui/accordion.tsx create mode 100644 src/mtran/vendor/mtranserver/ui/src/components/ui/alert-dialog.tsx create mode 100644 src/mtran/vendor/mtranserver/ui/src/components/ui/alert.tsx create mode 100644 src/mtran/vendor/mtranserver/ui/src/components/ui/aspect-ratio.tsx create mode 100644 src/mtran/vendor/mtranserver/ui/src/components/ui/avatar.tsx create mode 100644 src/mtran/vendor/mtranserver/ui/src/components/ui/badge.tsx create mode 100644 src/mtran/vendor/mtranserver/ui/src/components/ui/breadcrumb.tsx create mode 100644 src/mtran/vendor/mtranserver/ui/src/components/ui/button-group.tsx create mode 100644 src/mtran/vendor/mtranserver/ui/src/components/ui/button.tsx create mode 100644 src/mtran/vendor/mtranserver/ui/src/components/ui/calendar.tsx create mode 100644 src/mtran/vendor/mtranserver/ui/src/components/ui/card.tsx create mode 100644 src/mtran/vendor/mtranserver/ui/src/components/ui/carousel.tsx create mode 100644 src/mtran/vendor/mtranserver/ui/src/components/ui/chart.tsx create mode 100644 src/mtran/vendor/mtranserver/ui/src/components/ui/checkbox.tsx create mode 100644 src/mtran/vendor/mtranserver/ui/src/components/ui/collapsible.tsx create mode 100644 src/mtran/vendor/mtranserver/ui/src/components/ui/command.tsx create mode 100644 src/mtran/vendor/mtranserver/ui/src/components/ui/context-menu.tsx create mode 100644 src/mtran/vendor/mtranserver/ui/src/components/ui/dialog.tsx create mode 100644 src/mtran/vendor/mtranserver/ui/src/components/ui/drawer.tsx create mode 100644 src/mtran/vendor/mtranserver/ui/src/components/ui/dropdown-menu.tsx create mode 100644 src/mtran/vendor/mtranserver/ui/src/components/ui/empty.tsx create mode 100644 src/mtran/vendor/mtranserver/ui/src/components/ui/field.tsx create mode 100644 src/mtran/vendor/mtranserver/ui/src/components/ui/form.tsx create mode 100644 src/mtran/vendor/mtranserver/ui/src/components/ui/hover-card.tsx create mode 100644 src/mtran/vendor/mtranserver/ui/src/components/ui/input-group.tsx create mode 100644 src/mtran/vendor/mtranserver/ui/src/components/ui/input-otp.tsx create mode 100644 src/mtran/vendor/mtranserver/ui/src/components/ui/input.tsx create mode 100644 src/mtran/vendor/mtranserver/ui/src/components/ui/item.tsx create mode 100644 src/mtran/vendor/mtranserver/ui/src/components/ui/kbd.tsx create mode 100644 src/mtran/vendor/mtranserver/ui/src/components/ui/label.tsx create mode 100644 src/mtran/vendor/mtranserver/ui/src/components/ui/menubar.tsx create mode 100644 src/mtran/vendor/mtranserver/ui/src/components/ui/navigation-menu.tsx create mode 100644 src/mtran/vendor/mtranserver/ui/src/components/ui/pagination.tsx create mode 100644 src/mtran/vendor/mtranserver/ui/src/components/ui/popover.tsx create mode 100644 src/mtran/vendor/mtranserver/ui/src/components/ui/progress.tsx create mode 100644 src/mtran/vendor/mtranserver/ui/src/components/ui/radio-group.tsx create mode 100644 src/mtran/vendor/mtranserver/ui/src/components/ui/resizable.tsx create mode 100644 src/mtran/vendor/mtranserver/ui/src/components/ui/scroll-area.tsx create mode 100644 src/mtran/vendor/mtranserver/ui/src/components/ui/select.tsx create mode 100644 src/mtran/vendor/mtranserver/ui/src/components/ui/separator.tsx create mode 100644 src/mtran/vendor/mtranserver/ui/src/components/ui/sheet.tsx create mode 100644 src/mtran/vendor/mtranserver/ui/src/components/ui/sidebar.tsx create mode 100644 src/mtran/vendor/mtranserver/ui/src/components/ui/skeleton.tsx create mode 100644 src/mtran/vendor/mtranserver/ui/src/components/ui/slider.tsx create mode 100644 src/mtran/vendor/mtranserver/ui/src/components/ui/sonner.tsx create mode 100644 src/mtran/vendor/mtranserver/ui/src/components/ui/spinner.tsx create mode 100644 src/mtran/vendor/mtranserver/ui/src/components/ui/switch.tsx create mode 100644 src/mtran/vendor/mtranserver/ui/src/components/ui/table.tsx create mode 100644 src/mtran/vendor/mtranserver/ui/src/components/ui/tabs.tsx create mode 100644 src/mtran/vendor/mtranserver/ui/src/components/ui/textarea.tsx create mode 100644 src/mtran/vendor/mtranserver/ui/src/components/ui/toggle-group.tsx create mode 100644 src/mtran/vendor/mtranserver/ui/src/components/ui/toggle.tsx create mode 100644 src/mtran/vendor/mtranserver/ui/src/components/ui/tooltip.tsx create mode 100644 src/mtran/vendor/mtranserver/ui/src/contexts/ThemeContext.tsx create mode 100644 src/mtran/vendor/mtranserver/ui/src/desktop.d.ts create mode 100644 src/mtran/vendor/mtranserver/ui/src/hooks/use-history.ts create mode 100644 src/mtran/vendor/mtranserver/ui/src/hooks/use-mobile.ts create mode 100644 src/mtran/vendor/mtranserver/ui/src/i18n/index.ts create mode 100644 src/mtran/vendor/mtranserver/ui/src/index.css create mode 100644 src/mtran/vendor/mtranserver/ui/src/lib/db.ts create mode 100644 src/mtran/vendor/mtranserver/ui/src/lib/desktop.ts create mode 100644 src/mtran/vendor/mtranserver/ui/src/lib/languages.ts create mode 100644 src/mtran/vendor/mtranserver/ui/src/lib/utils.ts create mode 100644 src/mtran/vendor/mtranserver/ui/src/main.tsx create mode 100644 src/mtran/vendor/mtranserver/ui/tsconfig.app.json create mode 100644 src/mtran/vendor/mtranserver/ui/tsconfig.json create mode 100644 src/mtran/vendor/mtranserver/ui/tsconfig.node.json create mode 100644 src/mtran/vendor/mtranserver/ui/vite.config.ts create mode 100755 src/mtran/vendor/mtranserver/uninstall.sh diff --git a/src/mtran/.gitignore b/src/mtran/.gitignore new file mode 100644 index 0000000..fb3c701 --- /dev/null +++ b/src/mtran/.gitignore @@ -0,0 +1,19 @@ +build/ +install/ +log/ +.tools/ +.runtime-build/ +.build/ +dependencies/tools/* +!dependencies/tools/.gitkeep +vendor/mtranserver/**/node_modules/ +vendor/mtranserver/dist/ +vendor/mtranserver/release/ +__pycache__/ +*.pyc +runtime/bin/mtranserver +runtime/config/ +runtime/logs/ +models/** +!models/ +!models/.gitkeep diff --git a/src/mtran/CMakeLists.txt b/src/mtran/CMakeLists.txt new file mode 100644 index 0000000..69427ac --- /dev/null +++ b/src/mtran/CMakeLists.txt @@ -0,0 +1,83 @@ +cmake_minimum_required(VERSION 3.8) +project(mtran) + +set(prepared_runtime_files + runtime/bin/mtranserver + runtime/config/records.json + models/en_zh-Hans/model.enzh.intgemm.alphas.bin + models/en_zh-Hans/lex.50.50.enzh.s2t.bin + models/en_zh-Hans/srcvocab.enzh.spm + models/en_zh-Hans/trgvocab.enzh.spm +) +foreach(prepared_file IN LISTS prepared_runtime_files) + if(NOT EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${prepared_file}") + message(FATAL_ERROR + "Missing preparation artifact: ${prepared_file}\n" + "Run ./dependencies/auto_install.sh from the mtran package root." + ) + endif() +endforeach() + +find_package(ament_cmake REQUIRED) +find_package(CURL REQUIRED) +find_package(nlohmann_json REQUIRED) +find_package(rclcpp REQUIRED) +find_package(rosidl_default_generators REQUIRED) + +rosidl_generate_interfaces(${PROJECT_NAME} + "srv/TranslateEnglishToChinese.srv" +) +rosidl_get_typesupport_target(cpp_typesupport_target + ${PROJECT_NAME} rosidl_typesupport_cpp) + +add_library(mtran_core + src/http_translation_client.cpp + src/translator_node.cpp +) +target_compile_features(mtran_core PUBLIC cxx_std_17) +target_include_directories(mtran_core PUBLIC + $ + $ +) +target_link_libraries(mtran_core + CURL::libcurl + nlohmann_json::nlohmann_json + "${cpp_typesupport_target}" +) +ament_target_dependencies(mtran_core rclcpp) + +add_executable(mtran_bridge_node src/main.cpp) +target_compile_features(mtran_bridge_node PUBLIC cxx_std_17) +target_link_libraries(mtran_bridge_node mtran_core) +ament_target_dependencies(mtran_bridge_node rclcpp) + +install(TARGETS mtran_core mtran_bridge_node + ARCHIVE DESTINATION lib + LIBRARY DESTINATION lib + RUNTIME DESTINATION lib/${PROJECT_NAME} +) +install(DIRECTORY include/ DESTINATION include) +install(DIRECTORY launch config DESTINATION share/${PROJECT_NAME}) +install(PROGRAMS runtime/bin/mtranserver DESTINATION lib/${PROJECT_NAME}) +install(DIRECTORY models/en_zh-Hans DESTINATION share/${PROJECT_NAME}/models) +install(FILES runtime/config/records.json DESTINATION share/${PROJECT_NAME}/mtranserver_config) + +ament_export_dependencies(rosidl_default_runtime) + +if(BUILD_TESTING) + find_package(ament_cmake_gtest REQUIRED) + + ament_add_gtest(test_http_translation_client + test/test_http_translation_client.cpp + ) + target_link_libraries(test_http_translation_client mtran_core) + + ament_add_gtest(test_translator_node + test/test_translator_node.cpp + ) + ament_target_dependencies(test_translator_node rclcpp) + target_link_libraries(test_translator_node mtran_core) + target_link_libraries(test_translator_node "${cpp_typesupport_target}") +endif() + +ament_package() diff --git a/src/mtran/README.md b/src/mtran/README.md new file mode 100644 index 0000000..67716ad --- /dev/null +++ b/src/mtran/README.md @@ -0,0 +1,324 @@ +# mtran ROS2 英译中服务 + +`mtran` 是一个 ROS2 Humble C++ 功能包。它提供同步服务 +`/translate_en_to_zh`,请求中放入一句英语,响应中返回简体中文译文。 + +```text +ROS2 Service 请求 + | + v +mtran_bridge_node (C++ / libcurl) + | + v +常驻 MTranServer sidecar (Bergamot WASM / en_zh-Hans 模型) +``` + +MTranServer 随 `ros2 launch` 启动并保持常驻。模型只在启动阶段预热,不会在每次 +Service 调用时临时启动或重新加载。本包不提供话题接口、批量翻译、多语言选择、 +HTML 翻译或自动语言检测。 + +## 1. 环境前提 + +- Ubuntu 22.04 +- ROS2 Humble,且由使用者提前安装 +- CPU 架构为 `x86_64` 或 `aarch64` +- 首次准备阶段可访问 apt、npm registry 和 Mozilla 模型站点 +- 建议预留约 1.5 GB 临时构建空间 + +`dependencies/auto_install.sh` 只安装非 ROS 依赖、构建 MTranServer、下载并校验 +英译中模型。**脚本不会安装 ROS2,也不会运行 `colcon build`。** ROS2 和 colcon +构建由工作区使用者负责。 + +## 2. 放入 ROS2 工作区 + +目标目录必须是: + +```text +smart-healthcare-2026/src/mtran +``` + +在当前项目中,功能包已经位于以下目录: + +```bash +cd ~/smart-healthcare-2026/src/mtran +``` + +复制完成后,当前目录中应直接存在 `package.xml` 和 `CMakeLists.txt`,不能再套一层 +`src/mtran`。 + +## 3. 准备依赖、sidecar 和模型 + +从 `smart-healthcare-2026/src/mtran` 执行: + +```bash +./dependencies/auto_install.sh +``` + +脚本会请求 `sudo` 安装非 ROS apt 包,在 `dependencies/tools` 安装固定版本 Bun, +从 `vendor/mtranserver` 构建当前 CPU 可运行的 sidecar,并只准备 +`en -> zh-Hans` 模型。成功结尾类似: + +```text +Preparation complete. +Next: cd .../smart-healthcare-2026 && colcon build --packages-select mtran +Then: source install/setup.bash && ros2 launch mtran translator.launch.py +``` + +## 4. 检查准备结果 + +仍从 `smart-healthcare-2026/src/mtran` 执行: + +```bash +file runtime/bin/mtranserver +test -s runtime/config/records.json +ls -lh models/en_zh-Hans +python3 dependencies/verify_runtime_data.py \ + --records runtime/config/records.json \ + --model-dir models/en_zh-Hans +``` + +应存在以下生成物: + +```text +runtime/bin/mtranserver +runtime/config/records.json +models/en_zh-Hans/model.enzh.intgemm.alphas.bin +models/en_zh-Hans/lex.50.50.enzh.s2t.bin +models/en_zh-Hans/srcvocab.enzh.spm +models/en_zh-Hans/trgvocab.enzh.spm +``` + +校验器会根据 `records.json` 中的 `decompressedHash` 和 `decompressedSize` 验证四个 +模型文件。校验失败时不要继续构建,重新运行准备脚本。 + +## 5. 构建 ROS2 包 + +从工作区根目录 `smart-healthcare-2026` 执行,而不是从包目录执行: + +```bash +source /opt/ros/humble/setup.bash +PYTHONNOUSERSITE=1 colcon build --packages-select mtran +``` + +成功时应看到: + +```text +Finished <<< mtran +Summary: 1 package finished +``` + +CMake 不会联网、安装依赖或调用 Bun。它只检查第 4 节的准备产物,然后把 sidecar、 +模型和 `records.json` 复制到 ROS2 install space。 + +## 6. 启动 + +从 `smart-healthcare-2026` 执行: + +```bash +source /opt/ros/humble/setup.bash +source install/setup.bash +PYTHONNOUSERSITE=1 ros2 launch mtran translator.launch.py +``` + +launch 同时启动 MTranServer 和 `mtran_bridge_node`。节点会等待 sidecar 健康检查成功, +再执行一次内部英译中预热;只有预热完成后才发布 `/translate_en_to_zh`。日志中应出现: + +```text +MTranServer is healthy and the en-to-zh-Hans model is warm +``` + +## 7. 调用服务 + +保留启动终端,在第二个终端中从 `smart-healthcare-2026` 执行: + +```bash +source /opt/ros/humble/setup.bash +source install/setup.bash +ros2 service call /translate_en_to_zh \ + mtran/srv/TranslateEnglishToChinese \ + "{text: 'The robot has completed the inspection.'}" +``` + +成功响应类似: + +```text +mtran.srv.TranslateEnglishToChinese_Response( + success=True, + translation='机器人已完成检查。', + error='' +) +``` + +## 8. Service 字段和错误码 + +接口定义: + +```srv +string text +--- +bool success +string translation +string error +``` + +- `text`:非空英语普通文本,最多 512 个 UTF-8 字符。 +- `success`:翻译成功时为 `true`。 +- `translation`:成功时为简体中文;失败时始终为空。 +- `error`:成功时为空,失败时为下列稳定错误码之一。 + +| 错误码 | 含义 | +| --- | --- | +| `INVALID_INPUT` | 输入为空或仅含空白。 | +| `INPUT_TOO_LONG` | 输入超过 512 个字符。 | +| `NOT_READY` | sidecar 未就绪、连接中断或模型正在重新预热。 | +| `TIMEOUT` | 单次翻译超过 30 秒。 | +| `UPSTREAM_ERROR` | HTTP 传输或 MTranServer 状态异常。 | +| `INVALID_RESPONSE` | sidecar 返回的 JSON 缺少字符串 `result`。 | + +节点使用单线程 executor,同一时刻串行处理请求,不考虑多句批处理。 + +## 9. 常驻预热和离线运行 + +launch 固定向 sidecar 设置: + +```text +MT_HOST=127.0.0.1 +MT_PORT=8989 +MT_ENABLE_UI=false +MT_OFFLINE=true +MT_CHECK_UPDATE=false +MT_WORKER_IDLE_TIMEOUT=86400 +MT_CACHE_SIZE=100 +``` + +准备和 `colcon build` 完成后,运行阶段不需要网络。模型 worker 的空闲时间为 24 小时, +桥接节点每 12 小时发送一次内部保温翻译。sidecar 异常退出时 launch 会在 2 秒后重启; +恢复期间服务返回 `NOT_READY`,健康检查和重新预热成功后自动恢复。 + +## 10. x86_64 和 ARM64 + +C++ 源码和模型数据不区分 CPU 架构。`auto_install.sh` 在运行机器上本机构建 sidecar: + +- `uname -m` 为 `x86_64` 时生成 x86-64 ELF。 +- `uname -m` 为 `aarch64` 时生成 ARM64 ELF。 + +推荐把同一个包目录复制到 ARM64 Ubuntu 22.04 目标机后,在目标机执行准备脚本和 +`colcon build`。本包不提供 x86_64 主机到 aarch64 的交叉构建流程。已经下载的 +`records.json` 和模型可以跨架构复制,但 `runtime/bin/mtranserver` 必须与目标机架构 +匹配;脚本检测到不匹配时会重新构建。 + +## 11. 重复安装和清理 + +准备脚本可重复执行。它会复用以下有效产物: + +- 版本正确的工作区 Bun +- 架构正确的 sidecar +- 哈希和大小正确的四个模型文件 + +只重新构建 sidecar,从 `smart-healthcare-2026/src/mtran` 执行: + +```bash +rm -f runtime/bin/mtranserver +rm -rf .build/mtranserver +./dependencies/auto_install.sh +``` + +完全重新准备,从同一目录执行: + +```bash +rm -rf dependencies/tools .build runtime/config models/en_zh-Hans +rm -f runtime/bin/mtranserver +./dependencies/auto_install.sh +``` + +清理 ROS2 构建结果,从 `smart-healthcare-2026` 执行: + +```bash +rm -rf build/mtran install/mtran log +colcon build --packages-select mtran +``` + +## 12. 故障排查 + +### 提示缺少 ROS2 Humble + +脚本不会安装 ROS2。确认 `/opt/ros/humble` 存在,并安装错误信息列出的 +`ros-humble-*` 包。然后重新执行准备脚本。 + +### apt 安装失败 + +检查 Ubuntu 软件源、代理、DNS 和 `sudo` 权限。apt 成功后可直接重复运行脚本, +已完成的本地步骤会被复用。 + +### Bun 或 npm registry 失败 + +检查到 `https://registry.npmjs.org/` 的网络连接。工具安装位置是 +`dependencies/tools`;删除该目录后重跑脚本可强制重装 Bun 1.3.14。 + +### 模型缺失或哈希不匹配 + +从包根运行第 4 节的 `verify_runtime_data.py`。确认 Mozilla records 与附件 CDN 可访问, +然后删除 `runtime/config` 和 `models/en_zh-Hans` 并重跑准备脚本。脚本只会把完整校验 +后的临时下载移动到最终位置。 + +### 端口 8989 被占用 + +检查占用者: + +```bash +ss -ltnp | grep ':8989' +``` + +停止冲突进程,或为 launch 同时覆盖 `port`,并确保没有其他节点仍使用旧端口: + +```bash +ros2 launch mtran translator.launch.py port:=8990 +``` + +### sidecar 重启后暂时返回 `NOT_READY` + +这是恢复阶段的预期行为。等待日志再次出现模型已预热信息后重试;不要为每次请求 +手工启动新的 sidecar。 + +### 找不到 `/translate_en_to_zh` + +服务只在健康检查和首次预热成功后创建。先查看 launch 终端日志,再执行: + +```bash +ros2 service list | grep translate_en_to_zh +ros2 service type /translate_en_to_zh +``` + +还要确认调用终端已经 source `/opt/ros/humble/setup.bash` 和当前工作区 +`install/setup.bash`。 + +### Python 用户目录包冲突 + +若 colcon 或 launch 报告用户目录中的 `setuptools`、`packaging` 版本冲突,在命令前 +保留 `PYTHONNOUSERSITE=1`,使 ROS2 Humble 使用 Ubuntu 系统 Python 包。 + +## 13. 维护者目录参考 + +```text +mtran/ +├── CMakeLists.txt ROS2 构建、准备检查和安装映射 +├── package.xml 包元数据和 ROS 依赖 +├── dependencies/ +│ ├── auto_install.sh 唯一联网准备入口 +│ ├── dependencies.txt 完整依赖和下载来源清单 +│ ├── verify_runtime_data.py records/模型完整性校验 +│ └── tools/ 工作区 Bun 和缓存(生成) +├── vendor/mtranserver/ 固定提交 f5672a9 的上游源码 +├── .build/mtranserver/ sidecar 构建目录(生成) +├── runtime/bin/mtranserver 本机 sidecar(生成) +├── runtime/config/records.json Mozilla 模型索引(生成) +├── models/en_zh-Hans/ 四个英译中模型文件(生成) +├── include/mtran/ C++ 头文件 +├── src/ C++ 实现 +├── srv/ ROS2 Service 定义 +├── launch/ sidecar 与桥接节点启动文件 +├── config/ ROS2 参数 +└── test/ C++、shell 和 Python 测试 +``` + +依赖版本、来源和生成/提交边界以 `dependencies/dependencies.txt` 为准。 diff --git a/src/mtran/config/translator.yaml b/src/mtran/config/translator.yaml new file mode 100644 index 0000000..3dfe71f --- /dev/null +++ b/src/mtran/config/translator.yaml @@ -0,0 +1,8 @@ +mtran_bridge_node: + ros__parameters: + server_url: "http://127.0.0.1:8989" + request_timeout_ms: 30000 + startup_timeout_ms: 60000 + health_retry_ms: 500 + keep_warm_interval_s: 43200 + max_input_characters: 512 diff --git a/src/mtran/dependencies/auto_install.sh b/src/mtran/dependencies/auto_install.sh new file mode 100755 index 0000000..bc52b12 --- /dev/null +++ b/src/mtran/dependencies/auto_install.sh @@ -0,0 +1,264 @@ +#!/usr/bin/env bash +set -euo pipefail + +script_dir=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd -P) +package_root=$(cd "${script_dir}/.." && pwd -P) +vendor_source="${package_root}/vendor/mtranserver" +build_dir="${package_root}/.build/mtranserver" +runtime_data_build_dir="${package_root}/.build/runtime-data" +runtime_bin_dir="${package_root}/runtime/bin" +runtime_config_dir="${package_root}/runtime/config" +model_root="${package_root}/models" +model_dir="${model_root}/en_zh-Hans" +tools_dir="${script_dir}/tools" +verify_script="${script_dir}/verify_runtime_data.py" +bun_bin="" + +BUN_VERSION=1.3.14 +os_release_file=${MTRAN_OS_RELEASE_FILE:-/etc/os-release} +machine=${MTRAN_MACHINE:-$(uname -m)} +ros_prefix=${MTRAN_ROS_PREFIX:-/opt/ros/humble} + +die() +{ + echo "error: $*" >&2 + exit 1 +} + +validate_host() +{ + [[ -r "${os_release_file}" ]] || die "cannot read OS release file: ${os_release_file}" + # shellcheck disable=SC1090 + source "${os_release_file}" + [[ "${ID:-}" == "ubuntu" && "${VERSION_ID:-}" == "22.04" ]] || \ + die "Ubuntu 22.04 is required." + + case "${machine}" in + x86_64 | aarch64) ;; + *) die "supported CPU architecture must be x86_64 or aarch64; found ${machine}." ;; + esac + + if [[ "${ROS_DISTRO:-}" != "humble" && ! -d "${ros_prefix}" ]]; then + die "ROS2 Humble must already be installed by the user." + fi + + [[ -f "${vendor_source}/package.json" && -f "${vendor_source}/bun.lock" ]] || \ + die "vendored MTranServer source is missing under vendor/mtranserver." + [[ -f "${verify_script}" ]] || die "runtime verifier is missing: ${verify_script}" +} + +validate_ros_packages() +{ + local required_packages=( + ros-humble-ament-cmake + ros-humble-ament-cmake-gtest + ros-humble-rclcpp + ros-humble-rosidl-default-generators + ros-humble-rosidl-default-runtime + ros-humble-launch + ros-humble-launch-ros + ros-humble-ament-index-python + ) + local missing=() + local package + for package in "${required_packages[@]}"; do + if ! dpkg-query -W -f='${Status}' "${package}" 2>/dev/null | grep -Fq 'install ok installed'; then + missing+=("${package}") + fi + done + if ((${#missing[@]})); then + printf 'error: missing ROS2 Humble packages (install these separately):\n' >&2 + printf ' %s\n' "${missing[@]}" >&2 + exit 1 + fi +} + +install_system_dependencies() +{ + local apt_packages=( + build-essential + cmake + pkg-config + curl + ca-certificates + file + rsync + npm + libcurl4-openssl-dev + nlohmann-json3-dev + ) + local missing=() + local package + for package in "${apt_packages[@]}"; do + local available=false + case "${package}" in + build-essential) + command -v c++ >/dev/null 2>&1 && command -v make >/dev/null 2>&1 && available=true + ;; + ca-certificates) + [[ -r /etc/ssl/certs/ca-certificates.crt ]] && available=true + ;; + libcurl4-openssl-dev | nlohmann-json3-dev) + if dpkg-query -W -f='${Status}' "${package}" 2>/dev/null | grep -Fq 'install ok installed'; then + available=true + fi + ;; + *) + command -v "${package}" >/dev/null 2>&1 && available=true + ;; + esac + if [[ "${available}" != true ]]; then + missing+=("${package}") + fi + done + if ((${#missing[@]} == 0)); then + echo "Reusing installed non-ROS system dependencies." + return + fi + printf 'Installing missing non-ROS system dependencies: %s\n' "${missing[*]}" + sudo apt-get update + sudo apt-get install -y "${missing[@]}" +} + +prepare_bun() +{ + bun_bin="${tools_dir}/node_modules/.bin/bun" + export BUN_INSTALL_CACHE_DIR="${tools_dir}/bun-cache" + export npm_config_cache="${tools_dir}/npm-cache" + export ELECTRON_SKIP_BINARY_DOWNLOAD=1 + + if [[ ! -x "${bun_bin}" || "$("${bun_bin}" --version 2>/dev/null || true)" != "${BUN_VERSION}" ]]; then + mkdir -p "${tools_dir}" + npm install --prefix "${tools_dir}" --no-save --no-package-lock "bun@${BUN_VERSION}" + fi + [[ -x "${bun_bin}" ]] || die "workspace-local Bun installation failed." + [[ "$("${bun_bin}" --version)" == "${BUN_VERSION}" ]] || \ + die "workspace-local Bun version must be ${BUN_VERSION}." + export PATH="$(dirname "${bun_bin}"):${PATH}" +} + +sidecar_architecture_matches() +{ + local executable=$1 + local description + [[ -x "${executable}" ]] || return 1 + description=$(file -b "${executable}" 2>/dev/null) || return 1 + case "${machine}" in + x86_64) [[ "${description}" == *"x86-64"* || "${description}" == *"x86_64"* ]] ;; + aarch64) [[ "${description}" == *"aarch64"* || "${description}" == *"ARM64"* ]] ;; + esac +} + +build_sidecar_if_needed() +{ + local bun_bin=$1 + local sidecar="${runtime_bin_dir}/mtranserver" + local staged_sidecar="${runtime_bin_dir}/.mtranserver.tmp.$$" + + if sidecar_architecture_matches "${sidecar}"; then + echo "Reusing native MTranServer sidecar: ${sidecar}" + return + fi + + mkdir -p "${build_dir}" "${runtime_bin_dir}" + rsync -a --delete \ + --exclude '.git/' \ + --exclude 'node_modules/' \ + --exclude 'dist/' \ + --exclude 'release/' \ + --exclude '.cache/' \ + "${vendor_source}/" "${build_dir}/" + + ( + cd "${build_dir}" + "${bun_bin}" install --frozen-lockfile + "${bun_bin}" run build + ) + + [[ -x "${build_dir}/dist/mtranserver" ]] || die "MTranServer build did not produce dist/mtranserver." + install -m 0755 "${build_dir}/dist/mtranserver" "${staged_sidecar}" + if ! sidecar_architecture_matches "${staged_sidecar}"; then + rm -f "${staged_sidecar}" + die "built MTranServer architecture does not match ${machine}." + fi + mv -f "${staged_sidecar}" "${sidecar}" + echo "Staged native MTranServer sidecar: ${sidecar}" +} + +runtime_data_is_valid() +{ + python3 "${verify_script}" \ + --records "${runtime_config_dir}/records.json" \ + --model-dir "${model_dir}" >/dev/null 2>&1 +} + +install_verified_runtime_data() +{ + local staged_records="${runtime_data_build_dir}/config/records.json" + local staged_models="${runtime_data_build_dir}/models/en_zh-Hans" + local next_models="${model_root}/.en_zh-Hans.next.$$" + local old_models="${model_root}/.en_zh-Hans.old.$$" + local next_records="${runtime_config_dir}/.records.json.next.$$" + + python3 "${verify_script}" --records "${staged_records}" --model-dir "${staged_models}" + + mkdir -p "${model_root}" "${runtime_config_dir}" + rm -rf "${next_models}" "${old_models}" + mkdir -p "${next_models}" + cp -a "${staged_models}/." "${next_models}/" + + if [[ -e "${model_dir}" ]]; then + mv "${model_dir}" "${old_models}" + fi + if ! mv "${next_models}" "${model_dir}"; then + [[ -e "${old_models}" ]] && mv "${old_models}" "${model_dir}" + die "failed to install verified model directory." + fi + rm -rf "${old_models}" + + install -m 0644 "${staged_records}" "${next_records}" + mv -f "${next_records}" "${runtime_config_dir}/records.json" +} + +prepare_runtime_data_if_needed() +{ + local sidecar="${runtime_bin_dir}/mtranserver" + if runtime_data_is_valid; then + echo "Reusing verified en -> zh-Hans runtime data." + return + fi + + rm -rf "${runtime_data_build_dir}" + mkdir -p "${runtime_data_build_dir}/config" "${runtime_data_build_dir}/models" + MT_HOST=127.0.0.1 \ + MT_PORT=0 \ + MT_ENABLE_UI=false \ + MT_OFFLINE=false \ + MT_CHECK_UPDATE=false \ + MT_LOG_LEVEL=info \ + MT_CONFIG_DIR="${runtime_data_build_dir}/config" \ + MT_MODEL_DIR="${runtime_data_build_dir}/models" \ + "${sidecar}" --download en-zh + + install_verified_runtime_data + runtime_data_is_valid || die "installed runtime data failed final verification." + echo "Staged verified en -> zh-Hans runtime data." +} + +main() +{ + validate_host + validate_ros_packages + install_system_dependencies + prepare_bun + build_sidecar_if_needed "${bun_bin}" + prepare_runtime_data_if_needed + + local workspace_root + workspace_root=$(cd "${package_root}/../.." && pwd -P) + printf 'Preparation complete.\n' + printf 'Next: cd %q && colcon build --packages-select mtran\n' "${workspace_root}" + printf 'Then: source install/setup.bash && ros2 launch mtran translator.launch.py\n' +} + +main "$@" diff --git a/src/mtran/dependencies/dependencies.txt b/src/mtran/dependencies/dependencies.txt new file mode 100644 index 0000000..a4d3d7d --- /dev/null +++ b/src/mtran/dependencies/dependencies.txt @@ -0,0 +1,71 @@ +MTran ROS2 package dependency manifest +===================================== + +This file is documentation. It is not a package-manager lock file. + +User-provided prerequisites +--------------------------- +- Ubuntu 22.04 on x86_64 or aarch64. +- ROS2 Humble, installed and maintained by the user. +- Python 3 from Ubuntu/ROS2, used for runtime-data integrity checks. +- Required ROS packages: + - ament_cmake + - ament_cmake_gtest + - rclcpp + - rosidl_default_generators + - rosidl_default_runtime + - launch + - launch_ros + - ament_index_python +- auto_install.sh does not install ROS2. +- colcon build is run by the user from the smart-healthcare-2026 workspace. + +Installed by dependencies/auto_install.sh with apt +--------------------------------------------------- +- build-essential +- cmake +- pkg-config +- curl +- ca-certificates +- file +- rsync +- npm +- libcurl4-openssl-dev +- nlohmann-json3-dev + +Workspace-local build tool +-------------------------- +- Bun 1.3.14. +- Installed with npm from https://registry.npmjs.org/ below + dependencies/tools/node_modules. +- Bun package and Electron download caches remain below dependencies/tools. +- Bun is used only to build the native MTranServer sidecar during preparation. + +Included source +--------------- +- MTranServer 4.0.33. +- Source repository: https://github.com/xxnuo/MTranServer.git +- Source commit: f5672a9 +- License: Apache-2.0; see vendor/mtranserver/LICENSE. +- Committed source location: vendor/mtranserver. +- Generated build location: .build/mtranserver. + +Downloaded runtime data +----------------------- +- Mozilla translations-models-v2 records endpoint: + https://firefox.settings.services.mozilla.com/v1/buckets/main-preview/collections/translations-models-v2/records +- Mozilla attachment CDN base URL: + https://firefox-settings-attachments.cdn.mozilla.net +- Exact translation direction: en -> zh-Hans. +- Required latest-version file roles: model, lex, srcvocab, trgvocab. +- records.json is staged at runtime/config/records.json. +- Decompressed model files are staged below models/en_zh-Hans. +- Every model file is verified with the SHA-256 decompressedHash from + records.json; decompressedSize is also checked when present. + +Generated runtime artifacts +--------------------------- +- runtime/bin/mtranserver is built for the host architecture. +- runtime/config/records.json is architecture-independent. +- models/en_zh-Hans is architecture-independent. +- Generated artifacts are installed by CMake but are not committed to Git. diff --git a/src/mtran/dependencies/tools/.gitkeep b/src/mtran/dependencies/tools/.gitkeep new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/src/mtran/dependencies/tools/.gitkeep @@ -0,0 +1 @@ + diff --git a/src/mtran/dependencies/verify_runtime_data.py b/src/mtran/dependencies/verify_runtime_data.py new file mode 100755 index 0000000..45046ec --- /dev/null +++ b/src/mtran/dependencies/verify_runtime_data.py @@ -0,0 +1,112 @@ +#!/usr/bin/env python3 + +import argparse +import hashlib +import json +import re +import sys +from pathlib import Path +from typing import Dict, Iterable, Tuple + + +REQUIRED_ROLES = ("model", "lex", "srcvocab", "trgvocab") + + +class RuntimeDataError(RuntimeError): + pass + + +def _version_key(version: object) -> Tuple[Tuple[int, object], ...]: + parts = re.split(r"(\d+)", str(version)) + return tuple((0, int(part)) if part.isdigit() else (1, part) for part in parts) + + +def _sha256(path: Path) -> str: + digest = hashlib.sha256() + with path.open("rb") as source: + for chunk in iter(lambda: source.read(1024 * 1024), b""): + digest.update(chunk) + return digest.hexdigest() + + +def _load_records(records_path: Path) -> Iterable[dict]: + try: + document = json.loads(records_path.read_text(encoding="utf-8")) + except (OSError, UnicodeError, json.JSONDecodeError) as error: + raise RuntimeDataError(f"invalid records.json: {error}") from error + + records = document.get("data") if isinstance(document, dict) else None + if not isinstance(records, list): + raise RuntimeDataError("invalid records.json: data must be a list") + return records + + +def verify_runtime_data(records_path: Path, model_dir: Path) -> Dict[str, Path]: + candidates = [ + record + for record in _load_records(records_path) + if isinstance(record, dict) + and record.get("sourceLanguage") == "en" + and record.get("targetLanguage") == "zh-Hans" + ] + + selected = {} + for role in REQUIRED_ROLES: + role_records = [record for record in candidates if record.get("fileType") == role] + if not role_records: + raise RuntimeDataError(f"missing required record role: {role}") + selected[role] = max(role_records, key=lambda record: _version_key(record.get("version", ""))) + + verified = {} + for role, record in selected.items(): + attachment = record.get("attachment") + filename = attachment.get("filename") if isinstance(attachment, dict) else None + if not isinstance(filename, str) or not filename: + raise RuntimeDataError(f"invalid attachment filename for role: {role}") + decompressed_name = filename[:-4] if filename.endswith(".zst") else filename + if Path(decompressed_name).name != decompressed_name: + raise RuntimeDataError(f"unsafe attachment filename for role: {role}") + + model_path = model_dir / decompressed_name + if not model_path.is_file(): + raise RuntimeDataError(f"missing model file for role {role}: {decompressed_name}") + + expected_size = record.get("decompressedSize") + if expected_size is not None and model_path.stat().st_size != expected_size: + raise RuntimeDataError(f"size mismatch for role {role}: {decompressed_name}") + + expected_hash = record.get("decompressedHash") + if not isinstance(expected_hash, str) or not expected_hash: + raise RuntimeDataError(f"missing decompressedHash for role: {role}") + if _sha256(model_path) != expected_hash.lower(): + raise RuntimeDataError(f"hash mismatch for role {role}: {decompressed_name}") + verified[role] = model_path + + expected_names = {path.name for path in verified.values()} + actual_names = {entry.name for entry in model_dir.iterdir()} + extras = sorted(actual_names - expected_names) + if extras: + raise RuntimeDataError(f"unexpected model files: {', '.join(extras)}") + + return verified + + +def main() -> int: + parser = argparse.ArgumentParser(description="Verify the fixed en to zh-Hans runtime data") + parser.add_argument("--records", required=True, type=Path) + parser.add_argument("--model-dir", required=True, type=Path) + args = parser.parse_args() + + try: + verified = verify_runtime_data(args.records, args.model_dir) + except RuntimeDataError as error: + print(f"runtime data verification failed: {error}", file=sys.stderr) + return 1 + + for role in REQUIRED_ROLES: + print(f"verified {role}: {verified[role]}") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/src/mtran/docs/superpowers/plans/2026-07-29-mtran-ros2-service.md b/src/mtran/docs/superpowers/plans/2026-07-29-mtran-ros2-service.md new file mode 100644 index 0000000..d86aa51 --- /dev/null +++ b/src/mtran/docs/superpowers/plans/2026-07-29-mtran-ros2-service.md @@ -0,0 +1,595 @@ +# MTranServer ROS2 English-to-Chinese Service Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Build a ROS2 Humble C++ service under `migrate_ws` that accepts one English string, translates it through a launch-managed persistent MTranServer, and returns Simplified Chinese. + +**Architecture:** A C++ `mtran_bridge_node` exposes `/translate_en_to_zh` and sends fixed `en -> zh-Hans` JSON requests to a loopback MTranServer sidecar. ROS2 launch owns both processes; the bridge performs startup health checking, model warm-up, serialized request handling, and periodic keep-warm calls. + +**Tech Stack:** ROS2 Humble, Ubuntu 22.04, C++17, ament_cmake, rosidl, libcurl, nlohmann/json, GoogleTest, Python ROS2 launch, Bun-compiled MTranServer. + +## Global Constraints + +- Every new or generated migration file must remain under `/home/hikos/MTranServer/migrate_ws`. +- The service name is `/translate_en_to_zh`. +- The service request contains only `string text`. +- The response contains `bool success`, `string translation`, and `string error`. +- Translation direction is fixed to `en -> zh-Hans`; HTML, language detection, topics, batching, and retries are excluded. +- Input is limited to 512 UTF-8 code points. +- Translation execution is serialized with `rclcpp::executors::SingleThreadedExecutor`. +- The current machine uses a native MTranServer build; ARM64 is documented but not built in this iteration. +- MTranServer uses a 86,400-second idle timeout and the bridge sends a keep-warm translation every 43,200 seconds. +- Runtime translation must work offline after the executable and `en_zh-Hans` model are staged. + +--- + +## File Map + +- `migrate_ws/.gitignore`: excludes colcon output, local tools, runtime binary, temporary runtime build tree, and model data. +- `migrate_ws/src/mtran_ros2/package.xml`: ROS2 and system dependency metadata. +- `migrate_ws/src/mtran_ros2/CMakeLists.txt`: service generation, C++ targets, install rules, and tests. +- `migrate_ws/src/mtran_ros2/srv/TranslateEnglishToChinese.srv`: public ROS2 interface. +- `migrate_ws/src/mtran_ros2/include/mtran_ros2/http_translation_client.hpp`: transport-independent client contract and libcurl client declaration. +- `migrate_ws/src/mtran_ros2/src/http_translation_client.cpp`: fixed HTTP payload, libcurl transport, JSON parsing, and error mapping. +- `migrate_ws/src/mtran_ros2/include/mtran_ros2/translator_node.hpp`: node state and service declaration. +- `migrate_ws/src/mtran_ros2/src/translator_node.cpp`: readiness state machine, validation, service callback, recovery, and keep-warm. +- `migrate_ws/src/mtran_ros2/src/main.cpp`: ROS2 initialization and single-threaded spin. +- `migrate_ws/src/mtran_ros2/config/translator.yaml`: production parameter defaults. +- `migrate_ws/src/mtran_ros2/launch/translator.launch.py`: sidecar and bridge lifecycle. +- `migrate_ws/src/mtran_ros2/scripts/build_mtranserver.sh`: native sidecar staging entirely below `migrate_ws`. +- `migrate_ws/src/mtran_ros2/test/test_http_translation_client.cpp`: injected-transport unit tests. +- `migrate_ws/src/mtran_ros2/test/test_translator_node.cpp`: fake-client ROS2 service tests. +- `migrate_ws/README.md`: dependency, local build, launch, smoke-test, offline-model, and ARM64 instructions. + +--- + +### Task 1: Create the ROS2 Package and Service Contract + +**Files:** +- Create: `migrate_ws/.gitignore` +- Create: `migrate_ws/src/mtran_ros2/package.xml` +- Create: `migrate_ws/src/mtran_ros2/CMakeLists.txt` +- Create: `migrate_ws/src/mtran_ros2/srv/TranslateEnglishToChinese.srv` + +**Interfaces:** +- Consumes: ROS2 Humble `ament_cmake` and `rosidl_default_generators`. +- Produces: `mtran_ros2::srv::TranslateEnglishToChinese` with request field `text` and response fields `success`, `translation`, and `error`. + +- [ ] **Step 1: Record generated-file exclusions** + +```gitignore +build/ +install/ +log/ +.tools/ +.runtime-build/ +runtime/bin/mtranserver +models/** +!models/.gitkeep +``` + +- [ ] **Step 2: Write the service definition** + +```srv +string text +--- +bool success +string translation +string error +``` + +- [ ] **Step 3: Add the minimal package manifest** + +Declare `ament_cmake`, `rosidl_default_generators`, `rclcpp`, `rosidl_default_runtime`, `launch`, `launch_ros`, libcurl, nlohmann/json, and test dependencies. Add membership in `rosidl_interface_packages`. + +- [ ] **Step 4: Add interface generation to CMake** + +```cmake +cmake_minimum_required(VERSION 3.8) +project(mtran_ros2) + +find_package(ament_cmake REQUIRED) +find_package(rosidl_default_generators REQUIRED) + +rosidl_generate_interfaces(${PROJECT_NAME} + "srv/TranslateEnglishToChinese.srv" +) + +ament_export_dependencies(rosidl_default_runtime) +ament_package() +``` + +- [ ] **Step 5: Build to verify service generation** + +Run: + +```bash +source /opt/ros/humble/setup.bash +cd /home/hikos/MTranServer/migrate_ws +colcon build --packages-select mtran_ros2 +``` + +Expected: exit code 0 and generated service headers below `build/mtran_ros2/rosidl_generator_cpp`. + +- [ ] **Step 6: Inspect the generated interface** + +Run: + +```bash +source /home/hikos/MTranServer/migrate_ws/install/setup.bash +ros2 interface show mtran_ros2/srv/TranslateEnglishToChinese +``` + +Expected: the exact four fields from the `.srv` definition. + +- [ ] **Step 7: Commit the package contract** + +```bash +git add migrate_ws/.gitignore migrate_ws/src/mtran_ros2/package.xml \ + migrate_ws/src/mtran_ros2/CMakeLists.txt \ + migrate_ws/src/mtran_ros2/srv/TranslateEnglishToChinese.srv +git commit -m "feat: add ROS2 translation service contract" +``` + +--- + +### Task 2: Implement the Fixed-Direction HTTP Client + +**Files:** +- Create: `migrate_ws/src/mtran_ros2/include/mtran_ros2/http_translation_client.hpp` +- Create: `migrate_ws/src/mtran_ros2/src/http_translation_client.cpp` +- Create: `migrate_ws/src/mtran_ros2/test/test_http_translation_client.cpp` +- Modify: `migrate_ws/src/mtran_ros2/CMakeLists.txt` +- Modify: `migrate_ws/src/mtran_ros2/package.xml` + +**Interfaces:** +- Consumes: `server_url` and `request_timeout_ms` configuration. +- Produces: `TranslationClient::health()` and `TranslationClient::translate(const std::string&)`. + +Use these exact public types: + +```cpp +enum class ClientError { + kNone, + kUnavailable, + kTimeout, + kUpstream, + kInvalidResponse, +}; + +struct TranslationResult { + bool success; + std::string translation; + ClientError error; +}; + +struct HttpResponse { + int transport_code; + long status_code; + std::string body; +}; + +using HttpExecutor = std::function; + +class TranslationClient { +public: + virtual ~TranslationClient() = default; + virtual bool health() = 0; + virtual TranslationResult translate(const std::string & text) = 0; +}; + +class HttpTranslationClient final : public TranslationClient { +public: + HttpTranslationClient( + std::string server_url, + long timeout_ms, + HttpExecutor executor = {}); + bool health() override; + TranslationResult translate(const std::string & text) override; +}; +``` + +- [ ] **Step 1: Write failing payload and parsing tests** + +Inject an `HttpExecutor` lambda that captures method, URL, body, and timeout. Assert that `translate("Hello")` sends `POST`, targets `/translate`, uses the configured timeout, and emits: + +```json +{"from":"en","html":false,"text":"Hello","to":"zh-Hans"} +``` + +Also assert that HTTP 200 with `{"result":"你好"}` returns `success=true`, `translation="你好"`, and `ClientError::kNone`. + +- [ ] **Step 2: Write failing error-mapping tests** + +Add separate tests for: + +```cpp +HttpResponse{CURLE_COULDNT_CONNECT, 0, ""} // kUnavailable +HttpResponse{CURLE_OPERATION_TIMEDOUT, 0, ""} // kTimeout +HttpResponse{CURLE_OK, 500, "failure"} // kUpstream +HttpResponse{CURLE_OK, 200, "not-json"} // kInvalidResponse +HttpResponse{CURLE_OK, 200, R"({"result":7})"} // kInvalidResponse +``` + +For every failure, assert `success=false` and `translation.empty()`. + +- [ ] **Step 3: Run the client test to verify it fails** + +Run: + +```bash +source /opt/ros/humble/setup.bash +cd /home/hikos/MTranServer/migrate_ws +colcon test --packages-select mtran_ros2 --ctest-args -R test_http_translation_client --output-on-failure +``` + +Expected: test target or referenced client types are missing. + +- [ ] **Step 4: Implement `HttpTranslationClient`** + +Use nlohmann/json to serialize the fixed request and parse `result`. Normalize `server_url` by removing trailing slashes. The default executor initializes libcurl once with `std::call_once`, writes response bytes through a callback, sets `CURLOPT_CONNECTTIMEOUT_MS`, `CURLOPT_TIMEOUT_MS`, JSON content type, and `CURLOPT_NOSIGNAL=1L`. + +Map libcurl connection and name-resolution failures to `kUnavailable`, `CURLE_OPERATION_TIMEDOUT` to `kTimeout`, other transport/non-200 failures to `kUpstream`, and response-shape failures to `kInvalidResponse`. + +- [ ] **Step 5: Add the client library and test targets** + +```cmake +find_package(CURL REQUIRED) +find_package(nlohmann_json REQUIRED) +find_package(rclcpp REQUIRED) + +add_library(mtran_core + src/http_translation_client.cpp +) +target_compile_features(mtran_core PUBLIC cxx_std_17) +target_include_directories(mtran_core PUBLIC + $ + $) +target_link_libraries(mtran_core PUBLIC + CURL::libcurl + nlohmann_json::nlohmann_json) +``` + +Under `BUILD_TESTING`, add `ament_cmake_gtest`, create `test_http_translation_client`, and link it to `mtran_core`. + +- [ ] **Step 6: Run the client tests** + +Run: + +```bash +source /opt/ros/humble/setup.bash +cd /home/hikos/MTranServer/migrate_ws +colcon build --packages-select mtran_ros2 --cmake-args -DBUILD_TESTING=ON +colcon test --packages-select mtran_ros2 --ctest-args -R test_http_translation_client --output-on-failure +colcon test-result --verbose +``` + +Expected: all client tests pass. + +- [ ] **Step 7: Commit the HTTP client** + +```bash +git add migrate_ws/src/mtran_ros2 +git commit -m "feat: add fixed-direction MTran HTTP client" +``` + +--- + +### Task 3: Implement the ROS2 Service Node and Readiness State Machine + +**Files:** +- Create: `migrate_ws/src/mtran_ros2/include/mtran_ros2/translator_node.hpp` +- Create: `migrate_ws/src/mtran_ros2/src/translator_node.cpp` +- Create: `migrate_ws/src/mtran_ros2/src/main.cpp` +- Create: `migrate_ws/src/mtran_ros2/test/test_translator_node.cpp` +- Modify: `migrate_ws/src/mtran_ros2/CMakeLists.txt` + +**Interfaces:** +- Consumes: `std::shared_ptr` and generated `TranslateEnglishToChinese` service type. +- Produces: `/translate_en_to_zh`, startup/recovery health polling, warm-up, validation, and keep-warm behavior. + +Use this constructor boundary: + +```cpp +class TranslatorNode : public rclcpp::Node { +public: + explicit TranslatorNode( + const rclcpp::NodeOptions & options = rclcpp::NodeOptions(), + std::shared_ptr client = nullptr); +}; +``` + +- [ ] **Step 1: Write the fake client and failing validation tests** + +Create a thread-safe fake implementing `TranslationClient`. Configure node parameter overrides `health_retry_ms=1`, `keep_warm_interval_s=3600`, and `max_input_characters=512`. Spin the node until `/translate_en_to_zh` is available. + +Assert: + +```text +"" and " " -> INVALID_INPUT +512 ASCII characters -> client called and success returned +513 ASCII characters -> INPUT_TOO_LONG and client not called +``` + +- [ ] **Step 2: Write failing response-mapping tests** + +For each fake client result, assert these exact service responses: + +```text +kNone -> success=true, translation set, error empty +kUnavailable -> success=false, translation empty, NOT_READY +kTimeout -> success=false, translation empty, TIMEOUT +kUpstream -> success=false, translation empty, UPSTREAM_ERROR +kInvalidResponse -> success=false, translation empty, INVALID_RESPONSE +``` + +- [ ] **Step 3: Write failing readiness and recovery tests** + +Verify that the service is not created while `health()` is false. Then switch health to true and make the warm-up translation succeed; verify the service becomes available. Simulate `kUnavailable` during a service call, verify `NOT_READY`, restore the fake, and verify health polling plus warm-up return the node to successful service operation. + +- [ ] **Step 4: Run node tests to verify failure** + +Run: + +```bash +source /opt/ros/humble/setup.bash +cd /home/hikos/MTranServer/migrate_ws +colcon test --packages-select mtran_ros2 --ctest-args -R test_translator_node --output-on-failure +``` + +Expected: `TranslatorNode` and executable are missing. + +- [ ] **Step 5: Implement startup, service, and recovery** + +Declare the six parameters from the design. When no client is injected, construct `HttpTranslationClient`. Start a health timer immediately. A successful health call followed by `translate("Hello.")` sets `ready_=true`, creates the service on first startup, cancels health polling, and starts keep-warm scheduling. + +Count UTF-8 characters by counting bytes that are not continuation bytes (`(byte & 0xC0) != 0x80`). Validate before checking readiness. Serialize all callbacks through the single-threaded executor. + +If a service or keep-warm call returns `kUnavailable`, set `ready_=false` and restart health polling. Do not destroy the already-advertised service after initial startup; requests during recovery return `NOT_READY`. + +- [ ] **Step 6: Implement `main.cpp`** + +```cpp +int main(int argc, char ** argv) { + rclcpp::init(argc, argv); + auto node = std::make_shared(); + rclcpp::executors::SingleThreadedExecutor executor; + executor.add_node(node); + executor.spin(); + rclcpp::shutdown(); + return 0; +} +``` + +- [ ] **Step 7: Add node targets and generated typesupport linkage** + +Add `translator_node.cpp` to `mtran_core`, obtain the generated C++ typesupport target with `rosidl_get_typesupport_target`, and link it. Add `mtran_bridge_node` from `main.cpp`, link `mtran_core`, and install the library, executable, and headers. + +- [ ] **Step 8: Run node and client tests** + +Run: + +```bash +source /opt/ros/humble/setup.bash +cd /home/hikos/MTranServer/migrate_ws +colcon build --packages-select mtran_ros2 --cmake-args -DBUILD_TESTING=ON +colcon test --packages-select mtran_ros2 --event-handlers console_direct+ +colcon test-result --verbose +``` + +Expected: all tests pass with no failed test cases. + +- [ ] **Step 9: Commit the ROS2 node** + +```bash +git add migrate_ws/src/mtran_ros2 +git commit -m "feat: expose persistent English to Chinese ROS2 service" +``` + +--- + +### Task 4: Add Native Runtime Staging and ROS2 Launch + +**Files:** +- Create: `migrate_ws/src/mtran_ros2/config/translator.yaml` +- Create: `migrate_ws/src/mtran_ros2/launch/translator.launch.py` +- Create: `migrate_ws/src/mtran_ros2/scripts/build_mtranserver.sh` +- Create: `migrate_ws/models/.gitkeep` +- Modify: `migrate_ws/src/mtran_ros2/CMakeLists.txt` + +**Interfaces:** +- Consumes: repository MTranServer source, local npm/node, launch arguments, staged executable, and staged model directory. +- Produces: native `migrate_ws/runtime/bin/mtranserver` and one launch entry point that owns sidecar and bridge lifecycles. + +- [ ] **Step 1: Write the production parameter file** + +```yaml +mtran_bridge_node: + ros__parameters: + server_url: "http://127.0.0.1:8989" + request_timeout_ms: 30000 + startup_timeout_ms: 60000 + health_retry_ms: 500 + keep_warm_interval_s: 43200 + max_input_characters: 512 +``` + +- [ ] **Step 2: Write the runtime staging script** + +The script resolves the repository root from its own path, installs Bun locally with npm under `migrate_ws/.tools` when no usable local Bun exists, copies the MTranServer source into `migrate_ws/.runtime-build/mtranserver` while excluding `.git`, `migrate_ws`, `node_modules`, and generated outputs, runs `bun install --frozen-lockfile`, runs `bun run build --single`, and installs the executable at `migrate_ws/runtime/bin/mtranserver` with mode 0755. + +The script must use `set -euo pipefail`, must not write to `/usr/local`, and must not modify the repository's root `dist/` directory. + +- [ ] **Step 3: Run the staging script** + +Run: + +```bash +cd /home/hikos/MTranServer +./migrate_ws/src/mtran_ros2/scripts/build_mtranserver.sh +file migrate_ws/runtime/bin/mtranserver +``` + +Expected on the current machine: an executable x86-64 ELF MTranServer binary. + +- [ ] **Step 4: Write the launch file** + +Declare arguments `server_executable`, `model_dir`, `config_dir`, `params_file`, `host`, and `port`. Defaults resolve from the source workspace for local development and may be overridden for installed deployment. Start MTranServer with `ExecuteProcess` using: + +```text +MT_HOST= +MT_PORT= +MT_ENABLE_UI=false +MT_OFFLINE=true +MT_CHECK_UPDATE=false +MT_CONFIG_DIR= +MT_MODEL_DIR= +MT_WORKER_IDLE_TIMEOUT=86400 +MT_CACHE_SIZE=100 +``` + +Enable sidecar respawn with a 2-second delay. Start `mtran_bridge_node` with the parameter file and a `server_url` override derived from host and port. + +- [ ] **Step 5: Add launch syntax test and install rules** + +Run: + +```bash +python3 -m py_compile migrate_ws/src/mtran_ros2/launch/translator.launch.py +``` + +Expected: exit code 0. Install `launch/`, `config/`, and `scripts/` into the package share/lib destinations through CMake. + +- [ ] **Step 6: Verify launch description without starting translation** + +Run: + +```bash +source /opt/ros/humble/setup.bash +cd /home/hikos/MTranServer/migrate_ws +colcon build --packages-select mtran_ros2 +source install/setup.bash +ros2 launch mtran_ros2 translator.launch.py --show-args +``` + +Expected: all six launch arguments are listed with concrete defaults. + +- [ ] **Step 7: Commit runtime and launch support** + +```bash +git add migrate_ws/.gitignore migrate_ws/models/.gitkeep \ + migrate_ws/src/mtran_ros2/config \ + migrate_ws/src/mtran_ros2/launch \ + migrate_ws/src/mtran_ros2/scripts \ + migrate_ws/src/mtran_ros2/CMakeLists.txt +git commit -m "feat: launch persistent MTran sidecar" +``` + +--- + +### Task 5: Document, Stage the Model, and Verify End to End + +**Files:** +- Create: `migrate_ws/README.md` +- Modify only if verification finds a defect: files below `migrate_ws/src/mtran_ros2/` + +**Interfaces:** +- Consumes: built native sidecar, ROS2 package, and `en_zh-Hans` model files. +- Produces: reproducible local and ARM64 instructions plus evidence that automated and available runtime checks pass. + +- [ ] **Step 1: Write the README** + +Document: + +- Architecture and fixed service contract +- Ubuntu 22.04/ROS2 Humble dependencies +- Native runtime staging command +- How to pre-download/copy only `en_zh-Hans` model files +- `colcon build`, launch, and service-call commands +- Error-code table +- Offline operation and model residency behavior +- x64 native build behavior +- ARM64 native build and `bun-linux-arm64` cross-target commands +- How to override executable and model paths at launch + +- [ ] **Step 2: Run formatting and static build checks** + +Run: + +```bash +source /opt/ros/humble/setup.bash +cd /home/hikos/MTranServer/migrate_ws +colcon build --packages-select mtran_ros2 --cmake-args -DCMAKE_BUILD_TYPE=RelWithDebInfo -DBUILD_TESTING=ON +colcon test --packages-select mtran_ros2 --event-handlers console_direct+ +colcon test-result --verbose +python3 -m py_compile src/mtran_ros2/launch/translator.launch.py +``` + +Expected: build and tests exit 0; Python compilation produces no output. + +- [ ] **Step 3: Check the staged runtime and model prerequisites** + +Run: + +```bash +test -x /home/hikos/MTranServer/migrate_ws/runtime/bin/mtranserver +find /home/hikos/MTranServer/migrate_ws/models/en_zh-Hans -maxdepth 1 -type f -print +``` + +Expected: executable check passes and the model directory contains model, vocabulary, and lexical files required by MTranServer. + +- [ ] **Step 4: Start launch and execute the smoke test** + +Terminal 1: + +```bash +source /opt/ros/humble/setup.bash +source /home/hikos/MTranServer/migrate_ws/install/setup.bash +ros2 launch mtran_ros2 translator.launch.py +``` + +Terminal 2: + +```bash +source /opt/ros/humble/setup.bash +source /home/hikos/MTranServer/migrate_ws/install/setup.bash +ros2 service call /translate_en_to_zh \ + mtran_ros2/srv/TranslateEnglishToChinese \ + "{text: 'The robot has completed the inspection.'}" +``` + +Expected: `success: true`, non-empty Chinese `translation`, and empty `error`. + +- [ ] **Step 5: Verify offline restart** + +Restart the launch with `MT_OFFLINE=true` already enforced by the launch file and no network dependency. Repeat the same service request and expect the same response shape without model download attempts. + +- [ ] **Step 6: Inspect repository scope** + +Run: + +```bash +cd /home/hikos/MTranServer +git status --short +git diff --check +find migrate_ws -maxdepth 4 -type f -print | sort +``` + +Expected: authored migration changes are only under `migrate_ws`; generated runtime, models, tools, and colcon directories are ignored. + +- [ ] **Step 7: Commit documentation and final corrections** + +```bash +git add migrate_ws/README.md migrate_ws/src/mtran_ros2 migrate_ws/.gitignore migrate_ws/models/.gitkeep +git commit -m "docs: add ROS2 translation deployment guide" +``` + +- [ ] **Step 8: Run final verification from a clean build directory** + +Move the existing generated `build`, `install`, and `log` directories to a temporary directory under `/tmp`, then rerun the complete build and test commands from Step 2. Do not delete user data or model files. + +Expected: a clean configuration, build, and test pass. diff --git a/src/mtran/docs/superpowers/plans/2026-07-30-portable-mtran-package.md b/src/mtran/docs/superpowers/plans/2026-07-30-portable-mtran-package.md new file mode 100644 index 0000000..b06c862 --- /dev/null +++ b/src/mtran/docs/superpowers/plans/2026-07-30-portable-mtran-package.md @@ -0,0 +1,754 @@ +# Portable `mtran` ROS2 Package Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Turn `migrate_ws` into a self-contained ROS2 package named `mtran` that can be copied to `smart_healthcare_2026/src/mtran`, prepared online once, and built and run offline on native `x86_64` or `aarch64` Ubuntu 22.04 systems. + +**Architecture:** Keep the existing C++17 bridge and synchronous `/translate_en_to_zh` service, but move the package root from `migrate_ws/src/mtran_ros2` to `migrate_ws` and rename all ROS identities from `mtran_ros2` to `mtran`. A version-pinned MTranServer source tree is vendored under `vendor/mtranserver`; `dependencies/auto_install.sh` stages and builds it under `.build/mtranserver`, downloads only the `en -> zh-Hans` offline data, and places generated artifacts under `runtime/` and `models/`. CMake only validates and installs prepared artifacts, while launch resolves every runtime path from the installed package share/prefix. + +**Tech Stack:** ROS2 Humble, `ament_cmake`, C++17, `rclcpp`, `rosidl_default_generators`, libcurl, nlohmann-json, Python ROS2 launch, Bash, Bun 1.3.14, MTranServer 4.0.33 at commit `f5672a9`. + +## Global Constraints + +- Target OS is Ubuntu 22.04; ROS2 Humble is supplied by the user and is never installed by `auto_install.sh`. +- Native CPU architectures are `x86_64` and `aarch64`; the sidecar is built on the host where the script runs. +- The package and source-directory name are `mtran`; the generated service type is `mtran/srv/TranslateEnglishToChinese`. +- The only runtime service is `/translate_en_to_zh`; it translates one English string to Simplified Chinese. +- The service node and executable remain `mtran_bridge_node`; its existing readiness, validation, error mapping, and single-thread behavior remain intact. +- `auto_install.sh` may use the network during preparation, but runtime and CMake must not download files or require network access. +- `auto_install.sh` must not source a user workspace, install ROS2, or run `colcon build`; the user runs `colcon build --packages-select mtran` from `smart_healthcare_2026`. +- CMake must never invoke Bun, npm, curl, apt, or any other download/build preparation command. +- Vendored source is fixed at MTranServer commit `f5672a9` and build-generated files stay outside `vendor/mtranserver`. +- Generated Bun tools, build staging, sidecar, records, models, colcon outputs, and logs are ignored; vendored source, package source, manifests, scripts, and documentation are committed. +- Do not modify or commit the unrelated repository-root `.vscode/` directory. + +## File Map + +The implementation changes the current tree as follows: + +- Move `migrate_ws/src/mtran_ros2/CMakeLists.txt` to `migrate_ws/CMakeLists.txt`; define package `mtran`, build the existing C++ targets, validate prepared artifacts, and install them into the ROS install space. +- Move `migrate_ws/src/mtran_ros2/package.xml` to `migrate_ws/package.xml`; rename the package and keep only ROS package metadata and system library dependencies. +- Move `migrate_ws/src/mtran_ros2/include/mtran_ros2/*.hpp` to `migrate_ws/include/mtran/*.hpp`; rename namespaces and generated-service includes to `mtran`. +- Move `migrate_ws/src/mtran_ros2/src/*.cpp` to `migrate_ws/src/*.cpp`; update include paths and namespaces without changing service semantics. +- Move `migrate_ws/src/mtran_ros2/srv/TranslateEnglishToChinese.srv` to `migrate_ws/srv/TranslateEnglishToChinese.srv`; preserve its fields exactly. +- Move `migrate_ws/src/mtran_ros2/test/*.cpp` to `migrate_ws/test/*.cpp`; update includes/namespaces and preserve the existing 16 behavioral assertions. +- Move `migrate_ws/src/mtran_ros2/config/translator.yaml` to `migrate_ws/config/translator.yaml`; retain bridge parameters. +- Move `migrate_ws/src/mtran_ros2/launch/translator.launch.py` to `migrate_ws/launch/translator.launch.py`; resolve defaults from installed `mtran` resources only. +- Remove `migrate_ws/src/mtran_ros2/scripts/build_mtranserver.sh`; replace it with `migrate_ws/dependencies/auto_install.sh`, which owns all preparation. +- Create `migrate_ws/dependencies/dependencies.txt` as the human-readable dependency/download manifest. +- Create `migrate_ws/vendor/mtranserver/` from the fixed upstream commit and add provenance/license notes. +- Rewrite `migrate_ws/README.md` for a first-time teammate, with the copy, preparation, build, launch, and service-call path on the first screen. +- Extend `migrate_ws/.gitignore` for `dependencies/tools/`, `.build/`, generated runtime/model data, colcon output, and test caches while allowing required empty directories through `.gitkeep` files where needed. +- Add focused shell/Python tests under `migrate_ws/test/` for package layout, preparation-script validation/idempotence, CMake preparation checks, install mapping, and launch path resolution. + +--- + +### Task 1: Flatten the Package and Rename the ROS Identity + +**Files:** +- Move: `migrate_ws/src/mtran_ros2/CMakeLists.txt` -> `migrate_ws/CMakeLists.txt` +- Move: `migrate_ws/src/mtran_ros2/package.xml` -> `migrate_ws/package.xml` +- Move: `migrate_ws/src/mtran_ros2/include/mtran_ros2/http_translation_client.hpp` -> `migrate_ws/include/mtran/http_translation_client.hpp` +- Move: `migrate_ws/src/mtran_ros2/include/mtran_ros2/translator_node.hpp` -> `migrate_ws/include/mtran/translator_node.hpp` +- Move: `migrate_ws/src/mtran_ros2/src/*.cpp` -> `migrate_ws/src/*.cpp` +- Move: `migrate_ws/src/mtran_ros2/srv/TranslateEnglishToChinese.srv` -> `migrate_ws/srv/TranslateEnglishToChinese.srv` +- Move: `migrate_ws/src/mtran_ros2/test/*.cpp` -> `migrate_ws/test/*.cpp` +- Move: `migrate_ws/src/mtran_ros2/config/translator.yaml` -> `migrate_ws/config/translator.yaml` +- Move: `migrate_ws/src/mtran_ros2/launch/translator.launch.py` -> `migrate_ws/launch/translator.launch.py` +- Delete: `migrate_ws/src/mtran_ros2/scripts/build_mtranserver.sh` after its preparation responsibilities are covered by Task 4. +- Modify: `migrate_ws/.gitignore` +- Test: `migrate_ws/test/test_package_identity.sh` + +**Interfaces:** +- Consumes: the current `mtran_ros2` package files and the service contract `string text` / `bool success, string translation, string error`. +- Produces: a package rooted directly at `migrate_ws`, named `mtran`, with C++ namespaces/includes and generated service references under `mtran`. + +- [ ] **Step 1: Add a failing package-layout test before moving files.** + +Create `test/test_package_identity.sh` with these assertions: + +```bash +#!/usr/bin/env bash +set -euo pipefail +root=$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd -P) + +test -f "${root}/package.xml" +test -f "${root}/CMakeLists.txt" +test ! -e "${root}/src/mtran_ros2/package.xml" +grep -q 'mtran' "${root}/package.xml" +grep -q 'project(mtran)' "${root}/CMakeLists.txt" +grep -q 'mtran/srv/TranslateEnglishToChinese' "${root}/README.md" +! rg -n 'mtran_ros2' "${root}" -g '!docs/superpowers/**' -g '!vendor/**' +``` + +Run from the package root: + +```bash +bash test/test_package_identity.sh +``` + +Expected: FAIL because the package is still nested and named `mtran_ros2`. + +- [ ] **Step 2: Move the package files and remove the extra source nesting.** + +From the repository root, use `git mv` for the paths listed above, create the target directories, and leave `migrate_ws` itself as the ROS package root. Preserve the service definition byte-for-byte. Do not move `docs/` or the existing `.gitignore` outside `migrate_ws`. + +- [ ] **Step 3: Rename package symbols and generated-service references.** + +Replace only package identity references in the moved source and tests: + +```text +mtran_ros2:: -> mtran:: +"mtran_ros2/ -> "mtran/ +project(mtran_ros2) -> project(mtran) +mtran_ros2 -> mtran +package="mtran_ros2" -> package="mtran" +``` + +Keep `/translate_en_to_zh`, `mtran_bridge_node`, `TranslateEnglishToChinese`, parameter names, and error strings unchanged. Update the README service command to: + +```bash +ros2 service call /translate_en_to_zh \ + mtran/srv/TranslateEnglishToChinese \ + "{text: 'Hello.'}" +``` + +- [ ] **Step 4: Make the identity test pass and run the existing C++ test suite.** + +Run: + +```bash +bash test/test_package_identity.sh +source /opt/ros/humble/setup.bash +PYTHONNOUSERSITE=1 colcon build --packages-select mtran --cmake-args -DBUILD_TESTING=ON +PYTHONNOUSERSITE=1 colcon test --packages-select mtran --event-handlers console_direct+ +PYTHONNOUSERSITE=1 colcon test-result --verbose +``` + +Expected: the identity test passes, the package configures as `mtran`, and the existing HTTP/client-node tests pass before runtime-resource installation is added. If CMake currently requires generated runtime files, temporarily keep that check out until Task 5; the identity test remains the gate for this task. + +- [ ] **Step 5: Commit the package flattening and namespace rename.** + +```bash +git add migrate_ws +git commit -m "refactor: rename portable ROS package to mtran" +``` + +--- + +### Task 2: Vendor the Fixed MTranServer Source + +**Files:** +- Create: `migrate_ws/vendor/mtranserver/**` +- Create: `migrate_ws/vendor/mtranserver/PROVENANCE.md` +- Modify: `migrate_ws/.gitignore` +- Test: `migrate_ws/test/test_vendor_source.sh` + +**Interfaces:** +- Consumes: tracked files at repository commit `f5672a9`. +- Produces: a read-only source tree containing the MTranServer 4.0.33 single-binary build inputs, with no dependency on the parent repository during preparation. + +- [ ] **Step 1: Add the vendor provenance test.** + +Create `test/test_vendor_source.sh`: + +```bash +#!/usr/bin/env bash +set -euo pipefail +root=$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd -P) +vendor="${root}/vendor/mtranserver" +test -f "${vendor}/package.json" +test -f "${vendor}/bun.lock" +test -f "${vendor}/scripts/build.ts" +test ! -e "${vendor}/.git" +test ! -e "${vendor}/dist" +test ! -e "${vendor}/node_modules" +grep -q '"version": "4.0.33"' "${vendor}/package.json" +grep -q 'f5672a9' "${vendor}/PROVENANCE.md" +``` + +Run `bash test/test_vendor_source.sh`. Expected: FAIL because the vendor directory does not exist. + +- [ ] **Step 2: Extract exactly the fixed upstream commit.** + +From `/home/hikos/MTranServer`, create the directory and extract only tracked files: + +```bash +mkdir -p migrate_ws/vendor/mtranserver +git archive f5672a9 | tar -x -C migrate_ws/vendor/mtranserver +``` + +Remove any generated `dist/`, `release/`, `node_modules/`, local caches, logs, and repository metadata if present. Do not copy the current `migrate_ws` directory into the vendor tree. + +- [ ] **Step 3: Record provenance and make the vendor tree read-only by convention.** + +Write `vendor/mtranserver/PROVENANCE.md` containing: + +```text +Source repository: https://github.com/xxnuo/MTranServer.git +Source commit: f5672a9 +Release: MTranServer 4.0.33 +License: Apache-2.0 (see LICENSE) +Build entry point: package.json script "build" -> scripts/build.ts --single +Policy: this tree is vendored input; generated files belong in ../../.build/mtranserver. +``` + +The implementation must use `git archive` provenance rather than a live parent-repository path. Add `vendor/mtranserver/**/node_modules`, `vendor/mtranserver/dist`, and `vendor/mtranserver/release` to ignore rules only as defensive protection; do not ignore tracked source files. + +- [ ] **Step 4: Run the vendor test and verify the source tree is complete.** + +Run: + +```bash +bash test/test_vendor_source.sh +test ! -e migrate_ws/vendor/mtranserver/.git +grep -Fq '"version": "4.0.33"' migrate_ws/vendor/mtranserver/package.json +``` + +Expected: the test passes, the vendor tree contains the Bun lockfile, build script, UI/assets inputs, and no generated build output or nested Git metadata. + +- [ ] **Step 5: Commit the vendored source.** + +```bash +git add migrate_ws/vendor migrate_ws/.gitignore migrate_ws/test/test_vendor_source.sh +git commit -m "build: vendor MTranServer 4.0.33 source" +``` + +--- + +### Task 3: Add the Dependency Manifest + +**Files:** +- Create: `migrate_ws/dependencies/dependencies.txt` +- Modify: `migrate_ws/.gitignore` +- Test: `migrate_ws/test/test_dependency_manifest.sh` + +**Interfaces:** +- Consumes: the fixed environment and upstream dependencies defined in the design specification. +- Produces: a human-readable manifest that distinguishes user-provided prerequisites, script-installed apt packages, workspace tools, vendored source, and generated downloads. + +- [ ] **Step 1: Add a manifest coverage test.** + +Create `test/test_dependency_manifest.sh`: + +```bash +#!/usr/bin/env bash +set -euo pipefail +root=$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd -P) +manifest="${root}/dependencies/dependencies.txt" +test -f "${manifest}" +for required in \ + "Ubuntu 22.04" "ROS2 Humble" "ament_cmake" "rclcpp" \ + "build-essential" "libcurl4-openssl-dev" "nlohmann-json3-dev" \ + "Bun 1.3.14" "MTranServer 4.0.33" "f5672a9" \ + "records.json" "en -> zh-Hans" "decompressedHash"; do + grep -Fq "${required}" "${manifest}" +done +grep -Fq "auto_install.sh does not install ROS2" "${manifest}" +grep -Fq "colcon build is run by the user" "${manifest}" +``` + +Run `bash test/test_dependency_manifest.sh`. Expected: FAIL because the manifest does not exist. + +- [ ] **Step 2: Write the complete manifest.** + +Use these sections and values in `dependencies.txt`: + +```text +User-provided prerequisites +- Ubuntu 22.04 +- ROS2 Humble: ament_cmake, ament_cmake_gtest, rclcpp, + rosidl_default_generators, rosidl_default_runtime, launch, launch_ros +- auto_install.sh does not install ROS2 +- colcon build is run by the user + +Installed by dependencies/auto_install.sh (apt) +- build-essential, cmake, pkg-config, curl, ca-certificates, rsync, + npm, libcurl4-openssl-dev, nlohmann-json3-dev + +Workspace-local tool +- Bun 1.3.14, installed below dependencies/tools with its cache there + +Included source +- MTranServer 4.0.33, commit f5672a9, Apache-2.0 + +Downloaded runtime data +- Mozilla translations-models-v2 records endpoint +- Mozilla attachment CDN base URL +- exact direction en -> zh-Hans +- model, lex, srcvocab, trgvocab files +- decompressedHash SHA-256 verification +``` + +Include the upstream URL from `git remote get-url origin` and the exact endpoint strings from `src/models/records.ts`. + +- [ ] **Step 3: Run the manifest test.** + +Run `bash test/test_dependency_manifest.sh`. Expected: PASS, with every dependency category and the distinction between ROS prerequisites and script-installed packages visible to a new user. + +- [ ] **Step 4: Commit the manifest.** + +```bash +git add migrate_ws/dependencies/dependencies.txt migrate_ws/.gitignore migrate_ws/test/test_dependency_manifest.sh +git commit -m "docs: document portable mtran dependencies" +``` + +--- + +### Task 4: Implement and Test `dependencies/auto_install.sh` + +**Files:** +- Create: `migrate_ws/dependencies/auto_install.sh` +- Create: `migrate_ws/dependencies/tools/.gitkeep` +- Modify: `migrate_ws/.gitignore` +- Test: `migrate_ws/test/test_auto_install.sh` + +**Interfaces:** +- Consumes: `vendor/mtranserver`, the host's Ubuntu/ROS2/CPU state, apt/npm/network, and Mozilla records/model endpoints. +- Produces: executable `runtime/bin/mtranserver`, `runtime/config/records.json`, and exactly four decompressed files below `models/en_zh-Hans/`; it returns non-zero for invalid prerequisites or failed integrity checks. + +- [ ] **Step 1: Add shell-level tests with command stubs.** + +Create `test/test_auto_install.sh` as a Bash harness that invokes the script with a temporary `PATH`, temporary package root copy, and stub commands. The harness must cover these cases: + +```text +1. bash -n succeeds. +2. fake uname -m = ppc64le -> non-zero and message contains x86_64/aarch64. +3. fake /etc/os-release != Ubuntu 22.04 -> non-zero. +4. neither ROS_DISTRO=humble nor /opt/ros/humble -> non-zero and message says ROS2 Humble must be installed. +5. missing vendor/mtranserver -> non-zero before apt/npm/network work. +6. valid fixture artifacts plus fake apt/npm/bun/curl/file/sha256sum -> second run skips valid sidecar, records, and model files and does not run the build/download stubs. +``` + +The fixture must use a copied package root so tests never write to the real runtime directories. Permit only these explicit test seams in the script: `MTRAN_OS_RELEASE_FILE` defaults to `/etc/os-release`, `MTRAN_MACHINE` defaults to `uname -m`, and `MTRAN_ROS_PREFIX` defaults to `/opt/ros/humble`. Production behavior with no overrides must always inspect the real host. Run: + +```bash +bash -n dependencies/auto_install.sh +bash test/test_auto_install.sh +``` + +Expected: syntax passes; behavioral tests initially FAIL because the script does not exist. + +- [ ] **Step 2: Implement path resolution and prerequisite checks.** + +At the top of the script use exactly this path relationship: + +```bash +script_dir=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd -P) +package_root=$(cd "${script_dir}/.." && pwd -P) +vendor_source="${package_root}/vendor/mtranserver" +build_dir="${package_root}/.build/mtranserver" +runtime_bin_dir="${package_root}/runtime/bin" +``` + +Use `set -euo pipefail`, validate `${MTRAN_OS_RELEASE_FILE:-/etc/os-release}` for `ID=ubuntu` and `VERSION_ID=22.04`, accept only `${MTRAN_MACHINE:-$(uname -m)}` values `x86_64` and `aarch64`, and require `ROS_DISTRO=humble` or `${MTRAN_ROS_PREFIX:-/opt/ros/humble}`. Check these Debian packages with `dpkg-query -W` without installing them: `ros-humble-ament-cmake`, `ros-humble-ament-cmake-gtest`, `ros-humble-rclcpp`, `ros-humble-rosidl-default-generators`, `ros-humble-rosidl-default-runtime`, `ros-humble-launch`, and `ros-humble-launch-ros`. Print the complete missing-package list and exit non-zero before running apt/npm/network commands. + +- [ ] **Step 3: Implement non-ROS apt and workspace-local Bun preparation.** + +Install only the manifest's apt packages using `sudo apt-get update` and `sudo apt-get install -y`; never include `ros-humble-*`. Reuse or install Bun 1.3.14 below `dependencies/tools`, set `BUN_INSTALL_CACHE_DIR` below `dependencies/tools`, prepend the local Bun binary to `PATH`, and set `ELECTRON_SKIP_BINARY_DOWNLOAD=1`. Pin the Bun package/version in the command or an explicit local version check so a newer global Bun cannot silently change the build. + +- [ ] **Step 4: Implement sidecar staging without touching the vendor tree.** + +Require `vendor/mtranserver/package.json` and `vendor/mtranserver/bun.lock`. Copy with `rsync -a --delete` from vendor to `.build/mtranserver`, excluding `.git`, `node_modules`, `dist`, `release`, and local caches. Run in the staging directory: + +```bash +"${bun_bin}" install --frozen-lockfile +"${bun_bin}" run build +``` + +Then atomically install `dist/mtranserver` as mode `0755` at `runtime/bin/mtranserver`. Verify it is executable and its ELF architecture matches `uname -m` (`x86-64` for `x86_64`, `aarch64` for `aarch64`) using `file`; reject a mismatched existing artifact. + +- [ ] **Step 5: Implement records/model download and integrity verification.** + +Download the records endpoint to a temporary file under `runtime/config`, validate JSON shape before renaming to `records.json`, and use the attachment CDN base URL from the vendored implementation. Parse records structurally with an available JSON tool or a small Bun script under `dependencies/tools`; do not select files by uncontrolled filename globbing. Filter exact `sourceLanguage == en` and `targetLanguage == zh-Hans`, select the newest version per required `fileType`, and require all four roles: `model`, `lex`, `srcvocab`, `trgvocab`. + +For every selected attachment, download the `.zst` to a temporary path, decompress it, compute SHA-256 on the decompressed bytes, compare with `decompressedHash` and, when present, `decompressedSize`, then rename the verified decompressed output to its final filename. Remove compressed temporary files only after verification. A valid existing file is reused; a missing or mismatched file is replaced. Never leave a mismatched file at a final path. + +- [ ] **Step 6: Print the post-preparation commands and make the tests pass.** + +On success print at least: + +```bash +workspace_root=$(cd "${package_root}/../.." && pwd -P) +printf 'Preparation complete.\n' +printf 'Next: cd %q && colcon build --packages-select mtran\n' "${workspace_root}" +printf 'Then: source install/setup.bash && ros2 launch mtran translator.launch.py\n' +``` + +Run: + +```bash +bash -n dependencies/auto_install.sh +bash test/test_auto_install.sh +``` + +Expected: PASS for syntax, all invalid-environment failures, vendor isolation, architecture checks, and idempotent valid-artifact reuse. The real network preparation is deferred to the final integration task. + +- [ ] **Step 7: Commit the preparation script.** + +```bash +git add migrate_ws/dependencies/auto_install.sh migrate_ws/dependencies/tools/.gitkeep migrate_ws/.gitignore migrate_ws/test/test_auto_install.sh +git commit -m "build: add portable mtran dependency installer" +``` + +--- + +### Task 5: Make CMake Validate and Install Prepared Runtime Data + +**Files:** +- Modify: `migrate_ws/CMakeLists.txt` +- Modify: `migrate_ws/package.xml` +- Create: `migrate_ws/test/test_cmake_preparation.sh` +- Modify: `migrate_ws/.gitignore` + +**Interfaces:** +- Consumes: the renamed C++/service files from Task 1 and generated preparation outputs from Task 4. +- Produces: a package that configures only when preparation outputs exist and installs the sidecar, model, records, launch file, config, headers, executable, and service type under package `mtran`. + +- [ ] **Step 1: Add the missing-artifact CMake test.** + +Create `test/test_cmake_preparation.sh` that copies the source package to a temporary directory, sources `/opt/ros/humble/setup.bash`, removes `runtime/bin/mtranserver`, `runtime/config/records.json`, and `models/en_zh-Hans/*`, then runs: + +```bash +cmake -S "${fixture}" -B "${fixture}/build" +``` + +Expected: FAIL with output containing `dependencies/auto_install.sh` and naming the missing preparation artifact. The test must not invoke network commands or Bun. + +- [ ] **Step 2: Add explicit CMake preparation checks.** + +Before target definitions, require these paths and stop with `message(FATAL_ERROR ...)` if absent: + +```text +runtime/bin/mtranserver +runtime/config/records.json +models/en_zh-Hans/model.enzh.intgemm.alphas.bin +models/en_zh-Hans/lex.50.50.enzh.s2t.bin +models/en_zh-Hans/srcvocab.enzh.spm +models/en_zh-Hans/trgvocab.enzh.spm +``` + +The error must say `Run ./dependencies/auto_install.sh from the mtran package root.` Use `${CMAKE_CURRENT_SOURCE_DIR}` only for source inputs and never add a download/custom command. + +- [ ] **Step 3: Update the ROS target and install rules.** + +Keep the existing `mtran_core` and `mtran_bridge_node` targets and C++17/libcurl/nlohmann-json/rclcpp dependencies, but generate interfaces with `${PROJECT_NAME}` after `project(mtran)`. Install: + +```cmake +install(TARGETS mtran_core mtran_bridge_node + ARCHIVE DESTINATION lib + LIBRARY DESTINATION lib + RUNTIME DESTINATION lib/${PROJECT_NAME}) +install(DIRECTORY include/ DESTINATION include) +install(DIRECTORY launch config DESTINATION share/${PROJECT_NAME}) +install(PROGRAMS runtime/bin/mtranserver DESTINATION lib/${PROJECT_NAME}) +install(DIRECTORY models/en_zh-Hans DESTINATION share/${PROJECT_NAME}/models) +install(FILES runtime/config/records.json DESTINATION share/${PROJECT_NAME}/mtranserver_config) +``` + +Do not install source-side `runtime/config` or model parent directories wholesale, because the generated data is intentionally mapped into the package install space. + +- [ ] **Step 4: Update package metadata and build tests.** + +Set `mtran`. Keep `ament_cmake`, `rosidl_default_generators`, `rosidl_default_runtime`, `rclcpp`, `libcurl4-openssl-dev`, `nlohmann-json3-dev`, and `ament_cmake_gtest` declarations valid for the target ROS2 distribution. Add any missing build/runtime dependency needed by `launch/translator.launch.py` (`launch`, `launch_ros`, and `ament_index_python`) as package dependencies. + +Run the test fixture with all six prepared paths populated by small fixture files plus an executable sidecar fixture: + +```bash +bash test/test_cmake_preparation.sh +source /opt/ros/humble/setup.bash +PYTHONNOUSERSITE=1 colcon build --packages-select mtran --cmake-args -DBUILD_TESTING=ON +``` + +Expected: the missing-artifact case fails clearly; the prepared fixture configures; a real `colcon build` succeeds and places the sidecar at `install/mtran/lib/mtran/mtranserver`, models under `install/mtran/share/mtran/models/en_zh-Hans`, and records at `install/mtran/share/mtran/mtranserver_config/records.json`. + +- [ ] **Step 5: Run the C++ tests after install mapping.** + +```bash +PYTHONNOUSERSITE=1 colcon test --packages-select mtran --event-handlers console_direct+ +PYTHONNOUSERSITE=1 colcon test-result --verbose +``` + +Expected: all existing client/node tests pass, and no CMake step attempts to access the network or run Bun. + +- [ ] **Step 6: Commit the CMake/install-space implementation.** + +```bash +git add migrate_ws/CMakeLists.txt migrate_ws/package.xml migrate_ws/test/test_cmake_preparation.sh migrate_ws/.gitignore +git commit -m "build: install prepared mtran runtime assets" +``` + +--- + +### Task 6: Resolve Launch Defaults Exclusively from Install Space + +**Files:** +- Modify: `migrate_ws/launch/translator.launch.py` +- Modify: `migrate_ws/package.xml` +- Create: `migrate_ws/test/test_launch_paths.py` + +**Interfaces:** +- Consumes: installed package share directory and the install mapping from Task 5. +- Produces: launch defaults for `mtranserver`, `models`, `mtranserver_config`, and `translator.yaml` that remain valid after the source package is copied or moved. + +- [ ] **Step 1: Add a failing launch-path test.** + +Create `test/test_launch_paths.py` that reads the launch source and asserts: + +```python +from pathlib import Path + +root = Path(__file__).resolve().parents[1] +source = (root / "launch" / "translator.launch.py").read_text() +assert 'get_package_share_directory("mtran")' in source +assert 'get_package_prefix("mtran")' in source +assert 'get_package_share_directory("mtran_ros2")' not in source +assert "_find_workspace_root" not in source +assert '"mtran"' in source +assert '"mtranserver_config"' in source +assert 'Path.cwd()' not in source +assert "/home/hikos/" not in source +``` + +Run `python3 test/test_launch_paths.py`. Expected: FAIL because the current launch searches parent directories and names `mtran_ros2`. + +- [ ] **Step 2: Rewrite default paths from the installed share directory.** + +Use: + +```python +from ament_index_python.packages import get_package_prefix, get_package_share_directory + +package_prefix = Path(get_package_prefix("mtran")) +package_share = Path(get_package_share_directory("mtran")) +server_default = package_prefix / "lib" / "mtran" / "mtranserver" +model_default = package_share / "models" +config_default = package_share / "mtranserver_config" +params_default = package_share / "config" / "translator.yaml" +``` + +Declare those values as defaults for `server_executable`, `model_dir`, `config_dir`, and `params_file`. Keep `host` default `127.0.0.1`, `port` default `8989`, the exact offline environment variables, `respawn=True`, and the bridge package/executable names updated to `mtran`/`mtran_bridge_node`. Do not search upward, inspect `src/`, use `Path.cwd()`, or embed an absolute path. + +- [ ] **Step 3: Make launch static and functional tests pass.** + +Run: + +```bash +python3 test/test_launch_paths.py +python3 -m py_compile launch/translator.launch.py +source /opt/ros/humble/setup.bash +PYTHONNOUSERSITE=1 ros2 launch mtran translator.launch.py --show-args +``` + +Expected: the path test and syntax check pass; `--show-args` lists install-space defaults and no source-workspace path. Use a temporary fake installed share directory in a Python launch test if the local install has not yet been rebuilt. + +- [ ] **Step 4: Commit the install-space launch behavior.** + +```bash +git add migrate_ws/launch/translator.launch.py migrate_ws/package.xml migrate_ws/test/test_launch_paths.py +git commit -m "fix: resolve mtran launch assets from install space" +``` + +--- + +### Task 7: Rewrite the README for First-Time Onboarding + +**Files:** +- Modify: `migrate_ws/README.md` +- Modify: `migrate_ws/dependencies/dependencies.txt` only if a command or version clarification is needed +- Test: `migrate_ws/test/test_readme_commands.sh` + +**Interfaces:** +- Consumes: final package names, preparation outputs, install paths, launch defaults, service contract, and architecture behavior from Tasks 1-6. +- Produces: a self-contained quick-start document that lets a teammate reach the first successful service call without reading repository history. + +- [ ] **Step 1: Add documentation command checks.** + +Create `test/test_readme_commands.sh`: + +```bash +#!/usr/bin/env bash +set -euo pipefail +root=$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd -P) +readme="${root}/README.md" +for required in \ + "smart_healthcare_2026/src/mtran" \ + "./dependencies/auto_install.sh" \ + "colcon build --packages-select mtran" \ + "ros2 launch mtran translator.launch.py" \ + "mtran/srv/TranslateEnglishToChinese" \ + "/translate_en_to_zh" \ + "ROS2 is not installed by" "x86_64" "aarch64" \ + "records.json" "MT_OFFLINE=true" "port 8989"; do + grep -Fq "${required}" "${readme}" +done +! rg -n 'mtran_ros2|/home/hikos/MTranServer|Path.cwd|build_mtranserver.sh' "${readme}" +``` + +Run `bash test/test_readme_commands.sh`. Expected: FAIL because the current README uses the old nested package and repository-specific paths. + +- [ ] **Step 2: Rewrite the first screen as the shortest successful path.** + +Put these sections in this exact order: purpose/architecture, prerequisites, copy location, run `dependencies/auto_install.sh`, expected generated outputs, build from `smart_healthcare_2026`, source and launch, service call and successful response, service fields/error codes, warm-up/offline runtime, x86_64/aarch64 behavior, repeat/clean-up, troubleshooting, maintainer directory reference. + +The first command sequence must state its working directory at every transition: + +```bash +# From the parent directory containing smart_healthcare_2026: +cp -a migrate_ws smart_healthcare_2026/src/mtran + +# From smart_healthcare_2026/src/mtran: +./dependencies/auto_install.sh + +# From smart_healthcare_2026: +source /opt/ros/humble/setup.bash +PYTHONNOUSERSITE=1 colcon build --packages-select mtran +source install/setup.bash + +# From any shell with the two setup files sourced: +PYTHONNOUSERSITE=1 ros2 launch mtran translator.launch.py + +# From a second shell with both setup files sourced: +ros2 service call /translate_en_to_zh \ + mtran/srv/TranslateEnglishToChinese \ + "{text: 'Hello.'}" +``` + +Show the expected successful response with `success=True`, a Chinese translation, and `error=''`. State explicitly that the script installs non-ROS dependencies only, that `colcon build` is user-run, and that runtime needs no network after preparation/build. + +- [ ] **Step 3: Add operational details and troubleshooting.** + +Document the six service error codes from `translator_node.cpp`, the one-sentence/512-character scope, persistent sidecar and model warm-up, `MT_OFFLINE=true`, fixed port `8989`, launch respawn, and the exact generated output paths. Include troubleshooting entries for missing ROS Humble, apt failure, Bun/registry failure, missing or mismatched model, port conflict, sidecar restart, delayed service discovery, and `PYTHONNOUSERSITE=1` for Python user-site conflicts. + +Explain that CMake consumes prepared artifacts and never downloads them. Explain that native builds on `x86_64` and `aarch64` create the matching sidecar; the ROS2 C++ source itself is portable and no x64-to-ARM cross-build is provided by the package. + +- [ ] **Step 4: Validate all README commands and commit the documentation.** + +Run: + +```bash +bash test/test_readme_commands.sh +rg -n 'mtran_ros2|/home/hikos/MTranServer|build_mtranserver.sh' README.md +``` + +Expected: the first command passes; the second produces no output. Then commit: + +```bash +git add migrate_ws/README.md migrate_ws/test/test_readme_commands.sh +git commit -m "docs: add portable mtran onboarding guide" +``` + +--- + +### Task 8: Verify an Independent Copied Workspace End to End + +**Files:** +- Test: temporary directory outside the repository, for example `/tmp/mtran-portability-test-XXXX/smart_healthcare_2026/src/mtran` +- Modify: only the implementation files identified by a failing verification, never the user's `.vscode/` + +**Interfaces:** +- Consumes: the complete package root and all scripts/assets produced by Tasks 1-7. +- Produces: evidence that the package works after being copied to the requested `smart_healthcare_2026/src/mtran` location and does not depend on `/home/hikos/MTranServer`. + +- [ ] **Step 1: Copy the package to an unrelated workspace path.** + +From the repository root, create a temporary workspace and copy the package without `.git`, colcon outputs, Bun cache, or generated runtime data if testing preparation from scratch: + +```bash +tmp_root=$(mktemp -d) +mkdir -p "${tmp_root}/smart_healthcare_2026/src" +rsync -a --exclude '.git/' migrate_ws/ "${tmp_root}/smart_healthcare_2026/src/mtran/" +``` + +Assert the copied package has no source reference to `/home/hikos/MTranServer` and has `package.xml` at its root. + +- [ ] **Step 2: Run preparation in the copied package.** + +From the copied package root: + +```bash +cd "${tmp_root}/smart_healthcare_2026/src/mtran" +./dependencies/auto_install.sh +test -x runtime/bin/mtranserver +test -s runtime/config/records.json +test -s models/en_zh-Hans/model.enzh.intgemm.alphas.bin +test -s models/en_zh-Hans/lex.50.50.enzh.s2t.bin +test -s models/en_zh-Hans/srcvocab.enzh.spm +test -s models/en_zh-Hans/trgvocab.enzh.spm +``` + +Expected: the script builds a native sidecar, downloads only the fixed direction, verifies all four files, and prints the user-owned `colcon` next step. On a repeated run, valid artifacts are reused. + +- [ ] **Step 3: Build from the parent workspace, not the package root.** + +```bash +cd "${tmp_root}/smart_healthcare_2026" +source /opt/ros/humble/setup.bash +PYTHONNOUSERSITE=1 colcon build --packages-select mtran +source install/setup.bash +test -x install/mtran/lib/mtran/mtranserver +test -f install/mtran/share/mtran/mtranserver_config/records.json +test -f install/mtran/share/mtran/models/en_zh-Hans/model.enzh.intgemm.alphas.bin +``` + +Expected: clean build success from the parent workspace and correct install-space paths. + +- [ ] **Step 4: Run the real offline sidecar and first service call.** + +From the copied workspace with setup files sourced: + +```bash +PYTHONNOUSERSITE=1 ros2 launch mtran translator.launch.py +``` + +From a second shell with `/opt/ros/humble/setup.bash` and the copied `install/setup.bash` sourced: + +```bash +ros2 service call /translate_en_to_zh \ + mtran/srv/TranslateEnglishToChinese \ + "{text: 'The robot has completed the inspection.'}" +``` + +Expected: launch logs show the sidecar and bridge, the bridge advertises the service only after health/warm-up, and the response has `success=True`, a non-empty Simplified Chinese translation, and an empty error. No runtime network request is made; `MT_OFFLINE=true` is visible in the launch process environment. + +- [ ] **Step 5: Run the complete verification suite and record residual risk.** + +Run from the copied workspace: + +```bash +PYTHONNOUSERSITE=1 colcon test --packages-select mtran --event-handlers console_direct+ +PYTHONNOUSERSITE=1 colcon test-result --verbose +cd src/mtran +python3 test/test_launch_paths.py +bash test/test_package_identity.sh +bash test/test_vendor_source.sh +bash test/test_dependency_manifest.sh +``` + +Expected: all automated tests pass, the real offline translation succeeds, and `git status --short` in the original repository still reports only the pre-existing unrelated `.vscode/` directory plus the intended migration commits. + +- [ ] **Step 6: Commit any final verification-only corrections.** + +Only after a failing end-to-end check identifies a real implementation/documentation defect, make the smallest correction and rerun the affected test plus the complete suite. Use: + +```bash +git add migrate_ws +git commit -m "test: verify portable mtran workspace" +``` + +Do not commit copied generated outputs, temporary workspaces, `.tools`, `.build`, runtime model files, or colcon `build/`, `install/`, and `log/` directories. + +--- + +## Final Self-Review Checklist + +- [ ] `migrate_ws` itself contains `package.xml` and `CMakeLists.txt`; there is no `src/mtran_ros2` package nesting. +- [ ] All ROS identities are `mtran`; the service command uses `mtran/srv/TranslateEnglishToChinese`. +- [ ] The vendor tree is exactly commit `f5672a9`, and all generated sidecar build files are under `.build/mtranserver`. +- [ ] `auto_install.sh` is the only preparation entry point; it does not install ROS2 or run `colcon`. +- [ ] `dependencies.txt` lists every user prerequisite, apt package, Bun version/source, vendored source, endpoint, model role, and integrity method. +- [ ] CMake has no network or Bun invocation and installs all runtime data into the documented install-space paths. +- [ ] Launch has no parent-directory search, source-workspace fallback, `Path.cwd()`, or absolute local path. +- [ ] README commands use the copied `smart_healthcare_2026/src/mtran` layout and reach a first service call. +- [ ] Tests cover invalid prerequisites, unsupported architecture, missing vendor, idempotence, missing CMake artifacts, install mapping, launch paths, package identity, and the real offline call. +- [ ] A placeholder-marker scan finds no deferred or vague implementation-only steps in this plan. diff --git a/src/mtran/docs/superpowers/specs/2026-07-29-mtran-ros2-service-design.md b/src/mtran/docs/superpowers/specs/2026-07-29-mtran-ros2-service-design.md new file mode 100644 index 0000000..d47251c --- /dev/null +++ b/src/mtran/docs/superpowers/specs/2026-07-29-mtran-ros2-service-design.md @@ -0,0 +1,291 @@ +# MTranServer ROS2 English-to-Chinese Service Design + +## 1. Goal + +Build a ROS2 Humble C++ package that exposes one synchronous service for translating a single English sentence into Simplified Chinese. The package runs on Ubuntu 22.04, is built with the current machine's native toolchain, and starts a persistent MTranServer sidecar through ROS2 launch. + +All new source, documentation, runtime staging files, and build outputs for this migration live under `./migrate_ws`. + +## 2. Scope + +The package provides exactly one operation: + +```text +English string in a ROS2 service request + -> MTranServer en-to-zh-Hans translation + -> Chinese string in the ROS2 service response +``` + +The following features are deliberately excluded: + +- Topic subscription or publication +- Batch translation +- Runtime language selection +- Automatic language detection +- HTML translation +- Long-text splitting +- Web UI integration +- Native C++ Bergamot integration + +## 3. Target Environment + +- ROS2 Humble +- Ubuntu 22.04 +- C++17 +- `ament_cmake` and `colcon` +- libcurl for HTTP +- nlohmann/json for JSON +- Bun only for producing the MTranServer sidecar executable + +The same ROS2 source is compiled natively on x64 or ARM64. The current implementation and smoke test use the current machine's native MTranServer artifact. ARM64 MTranServer build and target-device deployment commands are documentation-only in this iteration. + +## 4. Workspace Layout + +```text +migrate_ws/ +├── docs/ +│ └── superpowers/ +│ ├── specs/ +│ └── plans/ +├── models/ +│ └── en_zh-Hans/ +├── runtime/ +│ └── bin/ +│ └── mtranserver +├── src/ +│ └── mtran_ros2/ +│ ├── CMakeLists.txt +│ ├── package.xml +│ ├── config/ +│ │ └── translator.yaml +│ ├── include/mtran_ros2/ +│ │ ├── http_translation_client.hpp +│ │ └── translator_node.hpp +│ ├── launch/ +│ │ └── translator.launch.py +│ ├── scripts/ +│ │ └── build_mtranserver.sh +│ ├── src/ +│ │ ├── http_translation_client.cpp +│ │ ├── main.cpp +│ │ └── translator_node.cpp +│ ├── srv/ +│ │ └── TranslateEnglishToChinese.srv +│ └── test/ +│ ├── test_http_translation_client.cpp +│ └── test_translator_node.cpp +└── README.md +``` + +Generated `build/`, `install/`, `log/`, the local MTranServer executable, and translation model files are not committed. + +## 5. Architecture + +`translator.launch.py` starts two long-lived processes: + +1. `migrate_ws/runtime/bin/mtranserver`, which owns Bergamot WASM and the `en_zh-Hans` model. +2. `mtran_bridge_node`, which exposes the ROS2 service and converts service requests into local HTTP requests. + +The C++ bridge communicates only with `http://127.0.0.1:8989`. It does not expose MTranServer's language, HTML, batch, or authentication features through ROS2. + +The MTranServer executable remains a separate Bun build product. CMake builds only the ROS2 C++ package. The build script stages a native MTranServer binary at `migrate_ws/runtime/bin/mtranserver`; it does not create an architecture-specific ROS2 source tree. + +## 6. ROS2 Interface + +The service type is `mtran_ros2/srv/TranslateEnglishToChinese`: + +```srv +string text +--- +bool success +string translation +string error +``` + +The service name is fixed: + +```text +/translate_en_to_zh +``` + +Successful response: + +```yaml +success: true +translation: "..." +error: "" +``` + +Failed response: + +```yaml +success: false +translation: "" +error: "ERROR_CODE" +``` + +## 7. Request Processing + +The node uses `rclcpp::executors::SingleThreadedExecutor`. It performs at most one translation at a time and does not create an application-level request queue or worker pool. + +For every valid request, the bridge sends: + +```json +{ + "from": "en", + "to": "zh-Hans", + "text": "request text", + "html": false +} +``` + +to `POST /translate`. A successful upstream response must be HTTP 200 with this shape: + +```json +{ + "result": "translated text" +} +``` + +The bridge returns the result only after the HTTP request completes. It does not retry a translation request. + +## 8. Input Constraints + +Input validation occurs before HTTP communication: + +- Empty or whitespace-only input returns `INVALID_INPUT`. +- Input longer than 512 characters returns `INPUT_TOO_LONG`. +- Valid input is treated as plain English text. + +The 512-character limit keeps the existing MTranServer call on its direct fixed-language path and avoids its long-text language-detection and segmentation path. + +## 9. Startup and Model Residency + +Launch supplies these MTranServer settings: + +```text +MT_HOST=127.0.0.1 +MT_PORT=8989 +MT_ENABLE_UI=false +MT_OFFLINE=true +MT_CHECK_UPDATE=false +MT_MODEL_DIR= +MT_WORKER_IDLE_TIMEOUT=86400 +MT_CACHE_SIZE=100 +``` + +The bridge does not advertise `/translate_en_to_zh` until it has: + +1. Received a successful response from `GET /health`. +2. Completed one internal `en -> zh-Hans` warm-up translation. + +The existing MTranServer treats an idle timeout of zero as an immediate timeout, so this migration does not set it to zero and does not modify code outside `migrate_ws`. Instead, the bridge sends one internal warm-up translation every 43,200 seconds. Normal client requests also reset MTranServer's idle timer. The 86,400-second timeout and 43,200-second keep-warm interval keep the model resident without repeatedly starting the process. + +Launch terminates both processes together. If MTranServer exits unexpectedly, launch respawns it. During the outage, service calls fail with `NOT_READY`. After health recovers, the bridge warms the model before returning to ready state. + +## 10. Configuration + +`translator.yaml` defines: + +```yaml +mtran_bridge_node: + ros__parameters: + server_url: "http://127.0.0.1:8989" + request_timeout_ms: 30000 + startup_timeout_ms: 60000 + health_retry_ms: 500 + keep_warm_interval_s: 43200 + max_input_characters: 512 +``` + +Language direction and HTML mode are compile-time behavior, not ROS parameters. + +Launch arguments allow overriding the MTranServer executable path, model directory, offline records/configuration directory, parameter file, host, and port. Defaults point to the corresponding paths under `migrate_ws` for local development. + +## 11. Error Semantics + +The service returns these exact error codes: + +| Code | Meaning | +| --- | --- | +| `INVALID_INPUT` | Input is empty or only whitespace. | +| `INPUT_TOO_LONG` | Input exceeds 512 characters. | +| `NOT_READY` | MTranServer is starting, unavailable, or being rewarmed. | +| `TIMEOUT` | The translation request exceeded 30 seconds. | +| `UPSTREAM_ERROR` | MTranServer returned a non-200 HTTP response or transport error. | +| `INVALID_RESPONSE` | The upstream body is not JSON containing a string `result`. | + +Errors are logged without logging complete request text. Failed requests always return an empty `translation`. The original English input is never substituted as a successful result. + +## 12. Component Boundaries + +### `HttpTranslationClient` + +Owns libcurl setup, HTTP calls, timeout handling, request JSON serialization, and response JSON parsing. It exposes health checking and fixed-direction translation methods without any ROS2 dependency. + +### `TranslatorNode` + +Owns ROS parameters, readiness state, input validation, service creation, startup warm-up, periodic keep-warm, and mapping client failures to service responses. It depends on the translation client through an interface so tests can inject deterministic results. + +### `main.cpp` + +Initializes ROS2, creates `TranslatorNode`, and spins it in a `SingleThreadedExecutor`. + +### `translator.launch.py` + +Resolves launch arguments, starts the MTranServer sidecar with the fixed environment, enables respawn, and starts the bridge node. + +## 13. Testing + +Automated tests cover: + +- Empty and whitespace-only request rejection +- 513-character request rejection +- Boundary acceptance at 512 characters +- Correct fixed HTTP request payload +- Successful HTTP response parsing +- Non-200 response mapping +- Timeout mapping +- Invalid JSON and missing/non-string `result` mapping +- Service success and failure response fields +- Startup readiness transition after health and warm-up +- Recovery transition after a simulated sidecar outage +- Keep-warm scheduling using short test-only intervals + +HTTP client tests use a local mock HTTP endpoint and require no model or network. Node tests inject a fake translation client. + +A manual smoke test uses the native staged MTranServer binary and the local `en_zh-Hans` model: + +```bash +ros2 service call /translate_en_to_zh \ + mtran_ros2/srv/TranslateEnglishToChinese \ + "{text: 'The robot has completed the inspection.'}" +``` + +The expected response has `success: true`, a non-empty Chinese `translation`, and an empty `error`. + +## 14. Build and Deployment + +The local workflow is: + +1. Build the current machine's MTranServer executable into `migrate_ws/runtime/bin/mtranserver`. +2. Place the `en_zh-Hans` model in `migrate_ws/models/en_zh-Hans`. +3. Run `colcon build` from `migrate_ws`. +4. Source `migrate_ws/install/setup.bash`. +5. Start `translator.launch.py`. +6. Run the service smoke test. + +The README also documents ARM64 deployment. On ARM64, the same C++ source is built with the target's native `colcon`; the sidecar is built with Bun's `bun-linux-arm64` target or built natively on the ARM64 device. + +## 15. Acceptance Criteria + +- Every new migration file is under `migrate_ws`. +- `colcon build --packages-select mtran_ros2` succeeds on ROS2 Humble and Ubuntu 22.04 when declared dependencies are installed. +- Launch starts both the native MTranServer sidecar and the C++ bridge. +- The ROS2 service appears only after health checking and model warm-up succeed. +- A valid English sentence of at most 512 characters returns Simplified Chinese in the service response. +- Empty, oversized, unavailable, timeout, upstream, and malformed-response cases return the specified error code and an empty translation. +- Translation work is serialized on one executor thread. +- The model remains warm during idle operation through the keep-warm mechanism. +- Runtime translation works without network access after the executable and model are staged. +- README includes local native build instructions and separate ARM64 build/deployment instructions. diff --git a/src/mtran/docs/superpowers/specs/2026-07-30-mtran-portable-package-design.md b/src/mtran/docs/superpowers/specs/2026-07-30-mtran-portable-package-design.md new file mode 100644 index 0000000..1f6bdf0 --- /dev/null +++ b/src/mtran/docs/superpowers/specs/2026-07-30-mtran-portable-package-design.md @@ -0,0 +1,345 @@ +# Portable `mtran` ROS2 Package Design + +## 1. Goal + +Turn the current `migrate_ws` directory into one self-contained ROS2 source package that can be copied directly to: + +```text +smart_healthcare_2026/src/mtran +``` + +After copying, the target machine must not need any file from the original MTranServer repository. A first-time online preparation script installs non-ROS dependencies, builds a native MTranServer sidecar, and downloads the fixed English-to-Simplified-Chinese runtime data. The user remains responsible for installing ROS2 Humble and running `colcon build` from `smart_healthcare_2026`. + +## 2. Fixed Product Scope + +The package provides one synchronous ROS2 service: + +```text +/translate_en_to_zh +``` + +The request contains one English string. The response contains success status, the Simplified Chinese translation, and an error code. + +The migration does not add topics, multiple languages, batch translation, HTML support, automatic language detection, or native C++ Bergamot integration. + +## 3. Target Environment + +- Ubuntu 22.04 +- ROS2 Humble already installed by the user +- Supported CPU architectures: `x86_64` and `aarch64` +- C++17 +- Initial preparation may access apt, npm, Mozilla translation-model endpoints, and package registries +- Runtime must work without network access after preparation and `colcon build` + +The preparation script must not configure ROS apt repositories, install `ros-humble-ros-base`, or execute `colcon build`. + +## 4. Package Identity and Interface + +The ROS2 package and source-directory name are both `mtran`. + +The service type becomes: + +```text +mtran/srv/TranslateEnglishToChinese +``` + +The service definition remains: + +```srv +string text +--- +bool success +string translation +string error +``` + +The executable and node names remain `mtran_bridge_node`. Existing source namespaces change from `mtran_ros2` to `mtran`. + +The resulting commands are: + +```bash +colcon build --packages-select mtran +ros2 launch mtran translator.launch.py +ros2 service call /translate_en_to_zh \ + mtran/srv/TranslateEnglishToChinese \ + "{text: 'Hello.'}" +``` + +## 5. Final Directory Layout + +The source package contains: + +```text +mtran/ +├── CMakeLists.txt +├── package.xml +├── README.md +├── .gitignore +├── config/ +│ └── translator.yaml +├── dependencies/ +│ ├── auto_install.sh +│ ├── dependencies.txt +│ └── tools/ +├── docs/ +│ └── superpowers/ +├── include/ +│ └── mtran/ +│ ├── http_translation_client.hpp +│ └── translator_node.hpp +├── launch/ +│ └── translator.launch.py +├── models/ +│ └── en_zh-Hans/ +├── runtime/ +│ ├── bin/ +│ │ └── mtranserver +│ └── config/ +│ └── records.json +├── src/ +│ ├── http_translation_client.cpp +│ ├── main.cpp +│ └── translator_node.cpp +├── srv/ +│ └── TranslateEnglishToChinese.srv +├── test/ +│ ├── test_http_translation_client.cpp +│ └── test_translator_node.cpp +├── vendor/ +│ └── mtranserver/ +└── .build/ + └── mtranserver/ +``` + +`dependencies/tools`, `.build`, `runtime/bin/mtranserver`, `runtime/config`, model files, colcon outputs, Python bytecode, and logs are generated and ignored by Git. `vendor/mtranserver` is committed source. + +## 6. Vendored MTranServer Source + +`vendor/mtranserver` contains a fixed copy of MTranServer v4.0.33 at source commit `f5672a9`. It includes every source, lock, UI-resource, WASM, build-script, and metadata file required by the existing single-binary Bun build. + +The vendored copy excludes: + +- `.git` +- `migrate_ws` +- `node_modules` +- `dist` +- `release` +- local logs and caches + +The vendored directory is treated as read-only input. Build-generated files must never be written there. + +## 7. Build Staging Boundary + +`dependencies/auto_install.sh` resolves all paths relative to its own location: + +```bash +script_dir=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd -P) +package_root=$(cd "${script_dir}/.." && pwd -P) +vendor_source="${package_root}/vendor/mtranserver" +build_dir="${package_root}/.build/mtranserver" +runtime_bin_dir="${package_root}/runtime/bin" +``` + +The build sequence is: + +```text +vendor/mtranserver + -> rsync into .build/mtranserver + -> install Bun packages in .build/mtranserver + -> run the existing single-binary build in .build/mtranserver + -> copy dist/mtranserver to runtime/bin/mtranserver +``` + +The script installs workspace-local Bun under `dependencies/tools`. Bun caches must also remain below `dependencies/tools`. Electron binary downloads are disabled because the sidecar does not use Electron. + +Running on x86_64 produces an x86-64 sidecar. Running on aarch64 produces an ARM64 sidecar. The script rejects unsupported architectures before downloading build dependencies. + +## 8. `auto_install.sh` Responsibilities + +The script performs these operations in order: + +1. Validate Ubuntu 22.04. +2. Validate that `ROS_DISTRO=humble` or `/opt/ros/humble` exists. +3. Validate CPU architecture is `x86_64` or `aarch64`. +4. Verify required ROS2 Humble packages are present; report missing ROS packages without installing them. +5. Install required non-ROS apt packages with `sudo apt-get`. +6. Install pinned workspace-local Bun. +7. Copy the vendored source into `.build/mtranserver`. +8. Install locked Bun dependencies and build the native sidecar. +9. Stage the executable at `runtime/bin/mtranserver` and verify its architecture. +10. Download Mozilla `translations-models-v2` records into `runtime/config/records.json`. +11. Download only the `en -> zh-Hans` model into `models/en_zh-Hans`. +12. Verify the four required model files and their hashes from the Mozilla records. +13. Print the exact `colcon build` and launch commands the user should run next. + +The script does not source a user workspace, run `colcon`, modify parent directories, install ROS2, or start a persistent server. + +The script is idempotent. It reuses valid Bun tools, downloaded files, and native artifacts. It rebuilds or redownloads an artifact when that artifact is missing, has the wrong architecture, or fails integrity validation. + +Any failed command terminates the script with a non-zero status. Temporary downloads use a temporary filename and are renamed only after verification, so interrupted downloads cannot appear valid. + +## 9. Dependency Manifest + +`dependencies/dependencies.txt` is a human-readable manifest, not an executable package-manager lock file. It records: + +### User-Provided Prerequisites + +- Ubuntu 22.04 +- ROS2 Humble +- Required ROS packages: `ament_cmake`, `ament_cmake_gtest`, `rclcpp`, `rosidl_default_generators`, `rosidl_default_runtime`, `launch`, and `launch_ros` + +These are checked but not installed by `auto_install.sh`. + +### Installed Apt Packages + +- `build-essential` +- `cmake` +- `pkg-config` +- `curl` +- `ca-certificates` +- `rsync` +- `npm` +- `libcurl4-openssl-dev` +- `nlohmann-json3-dev` + +### Workspace Tools + +- Bun 1.3.14 +- Installation method and package-registry source + +### Included Source + +- MTranServer 4.0.33 +- Commit `f5672a9` +- Upstream repository URL +- Apache-2.0 license reference + +### Downloaded Runtime Data + +- Mozilla translations-models-v2 records endpoint +- Mozilla attachment CDN base URL +- Exact direction `en -> zh-Hans` +- Expected model file roles: model, lexicon, source vocabulary, target vocabulary +- Integrity checks based on `decompressedHash` from `records.json` + +The manifest must distinguish user-provided prerequisites, packages installed by the script, included source, and generated runtime artifacts. + +## 10. CMake and Install Space + +`CMakeLists.txt` never downloads from the network and never invokes Bun. It requires the preparation outputs before configuration: + +```text +runtime/bin/mtranserver +runtime/config/records.json +models/en_zh-Hans/ +``` + +If any required output is missing, CMake stops with a message instructing the user to run: + +```bash +./dependencies/auto_install.sh +``` + +CMake installs: + +```text +runtime/bin/mtranserver + -> install/mtran/lib/mtran/mtranserver + +models/en_zh-Hans + -> install/mtran/share/mtran/models/en_zh-Hans + +runtime/config/records.json + -> install/mtran/share/mtran/mtranserver_config/records.json +``` + +The launch file resolves all defaults from the installed package prefix and share directory. It must not search upward for the source workspace or contain an absolute local path. + +## 11. Runtime Behavior + +Launch starts the installed MTranServer and C++ bridge. MTranServer receives: + +```text +MT_HOST=127.0.0.1 +MT_PORT=8989 +MT_ENABLE_UI=false +MT_OFFLINE=true +MT_CHECK_UPDATE=false +MT_CONFIG_DIR= +MT_MODEL_DIR= +MT_WORKER_IDLE_TIMEOUT=86400 +MT_CACHE_SIZE=100 +``` + +The bridge waits for health and a successful warm-up translation before advertising `/translate_en_to_zh`. It continues checking sidecar health, serializes requests on one executor thread, and preserves the existing validation and error semantics. + +## 12. README Onboarding Requirements + +README.md is written for a teammate who knows basic shell and ROS2 commands but has never seen MTranServer or this package. + +The first screen of the README must answer: + +- What the package does +- Which operating system and ROS2 version it expects +- Where to copy the directory +- The shortest path from a copied directory to the first successful translation + +The README contains these sections in this order: + +1. Purpose and architecture in plain language +2. Prerequisites, including the explicit statement that ROS2 is not installed by the script +3. Copy/install directory example under `smart_healthcare_2026/src/mtran` +4. Run `dependencies/auto_install.sh` +5. Expected preparation outputs and how to verify them +6. Run `colcon build --packages-select mtran` from `smart_healthcare_2026` +7. Source the workspace and launch the package +8. Call `/translate_en_to_zh` and show a successful response +9. Explain service fields and error codes +10. Explain persistent model warm-up and offline runtime +11. x86_64 and ARM64 behavior +12. Repeat installation, clean rebuild, and generated-directory cleanup +13. Troubleshooting for missing ROS Humble, apt failure, Bun failure, missing model, port 8989 conflict, sidecar restart, service discovery delay, and Python user-site conflicts +14. Directory reference for maintainers + +Every command block states the directory from which it is run. Expected success output is shown after preparation, build, launch, and service-call commands. README commands use relative paths wherever possible so the copied workspace location can vary. + +## 13. Testing and Verification + +Automated verification covers: + +- Package name and generated service namespace are `mtran` +- Existing HTTP client and node tests pass after namespace changes +- `auto_install.sh` shell syntax +- Package-root resolution independent of absolute workspace path +- Rejection of unsupported OS, missing ROS Humble, and unsupported CPU architecture +- Idempotent detection of already-valid generated files +- Failure when vendored source is missing +- CMake failure with a clear instruction when preparation outputs are missing +- CMake success after fixture preparation outputs exist +- Launch defaults resolve only from install space +- Clean `colcon build --packages-select mtran` +- Full ROS2 test suite +- Real offline launch and `mtran/srv/TranslateEnglishToChinese` service call +- Copying the package to a temporary `smart_healthcare_2026/src/mtran` workspace and building it without access to the original repository tree + +The final real translation smoke test uses: + +```text +The robot has completed the inspection. +``` + +and requires a successful response with a non-empty Chinese translation. + +## 14. Acceptance Criteria + +- The entire package can be copied as one `mtran` directory. +- No script or launch file refers to `/home/hikos/MTranServer` or a parent source tree. +- The package is named `mtran` and exposes `mtran/srv/TranslateEnglishToChinese`. +- Vendored MTranServer source is sufficient to rebuild the sidecar without the original repository. +- `dependencies/auto_install.sh` installs non-ROS dependencies, builds the sidecar, and downloads/verifies runtime data. +- `auto_install.sh` does not install ROS2 and does not execute `colcon`. +- `dependencies/dependencies.txt` completely describes user-provided, installed, included, and downloaded dependencies. +- `colcon build --packages-select mtran` runs only after preparation and performs no network access. +- Launch uses only install-space resources. +- Runtime translation remains offline and keeps the model resident. +- README enables a new teammate to reach a successful service call without knowledge of the original repository. diff --git a/src/mtran/include/mtran/http_translation_client.hpp b/src/mtran/include/mtran/http_translation_client.hpp new file mode 100644 index 0000000..39ae0ca --- /dev/null +++ b/src/mtran/include/mtran/http_translation_client.hpp @@ -0,0 +1,70 @@ +#pragma once + +#include +#include + +namespace mtran +{ + +enum class ClientError +{ + kNone, + kUnavailable, + kTimeout, + kUpstream, + kInvalidResponse, +}; + +struct TranslationResult +{ + bool success; + std::string translation; + ClientError error; +}; + +struct HttpResponse +{ + int transport_code; + long status_code; + std::string body; +}; + +using HttpExecutor = std::function; + +class TranslationClient +{ +public: + virtual ~TranslationClient() = default; + + virtual bool health() = 0; + virtual TranslationResult translate(const std::string & text) = 0; +}; + +class HttpTranslationClient final : public TranslationClient +{ +public: + HttpTranslationClient( + std::string server_url, + long timeout_ms, + HttpExecutor executor = {}); + + bool health() override; + TranslationResult translate(const std::string & text) override; + +private: + static HttpResponse execute_with_curl( + const std::string & method, + const std::string & url, + const std::string & body, + long timeout_ms); + + std::string server_url_; + long timeout_ms_; + HttpExecutor executor_; +}; + +} // namespace mtran diff --git a/src/mtran/include/mtran/translator_node.hpp b/src/mtran/include/mtran/translator_node.hpp new file mode 100644 index 0000000..7a3cb09 --- /dev/null +++ b/src/mtran/include/mtran/translator_node.hpp @@ -0,0 +1,54 @@ +#pragma once + +#include + +#include +#include +#include + +#include "mtran/http_translation_client.hpp" +#include "mtran/srv/translate_english_to_chinese.hpp" + +namespace mtran +{ + +class TranslatorNode : public rclcpp::Node +{ +public: + explicit TranslatorNode( + const rclcpp::NodeOptions & options = rclcpp::NodeOptions(), + std::shared_ptr client = nullptr); + +private: + using TranslateService = mtran::srv::TranslateEnglishToChinese; + + void poll_readiness(); + void keep_warm(); + void mark_not_ready(); + void create_service_if_needed(); + void handle_request( + const TranslateService::Request::SharedPtr request, + TranslateService::Response::SharedPtr response); + + static std::size_t utf8_codepoint_count(const std::string & text); + static bool is_blank(const std::string & text); + static std::string error_code(ClientError error); + + std::shared_ptr client_; + rclcpp::Service::SharedPtr service_; + rclcpp::TimerBase::SharedPtr health_timer_; + rclcpp::TimerBase::SharedPtr keep_warm_timer_; + + bool ready_{false}; + bool ever_ready_{false}; + bool startup_timeout_logged_{false}; + std::chrono::steady_clock::time_point startup_started_; + + int request_timeout_ms_; + int startup_timeout_ms_; + int health_retry_ms_; + int keep_warm_interval_s_; + int max_input_characters_; +}; + +} // namespace mtran diff --git a/src/mtran/launch/translator.launch.py b/src/mtran/launch/translator.launch.py new file mode 100644 index 0000000..cc596aa --- /dev/null +++ b/src/mtran/launch/translator.launch.py @@ -0,0 +1,88 @@ +from pathlib import Path + +from ament_index_python.packages import get_package_prefix, get_package_share_directory +from launch import LaunchDescription +from launch.actions import DeclareLaunchArgument, ExecuteProcess, OpaqueFunction +from launch.substitutions import LaunchConfiguration +from launch_ros.actions import Node + +def _launch_processes(context): + server_executable = LaunchConfiguration("server_executable").perform(context) + model_dir = LaunchConfiguration("model_dir").perform(context) + config_dir = LaunchConfiguration("config_dir").perform(context) + params_file = LaunchConfiguration("params_file").perform(context) + host = LaunchConfiguration("host").perform(context) + port = LaunchConfiguration("port").perform(context) + + sidecar = ExecuteProcess( + cmd=[server_executable], + name="mtranserver", + output="screen", + additional_env={ + "MT_HOST": host, + "MT_PORT": port, + "MT_ENABLE_UI": "false", + "MT_OFFLINE": "true", + "MT_CHECK_UPDATE": "false", + "MT_CONFIG_DIR": config_dir, + "MT_MODEL_DIR": model_dir, + "MT_WORKER_IDLE_TIMEOUT": "86400", + "MT_CACHE_SIZE": "100", + }, + respawn=True, + respawn_delay=2.0, + ) + + bridge = Node( + package="mtran", + executable="mtran_bridge_node", + name="mtran_bridge_node", + output="screen", + parameters=[ + params_file, + {"server_url": f"http://{host}:{port}"}, + ], + ) + + return [sidecar, bridge] + + +def generate_launch_description() -> LaunchDescription: + package_prefix = Path(get_package_prefix("mtran")) + package_share = Path(get_package_share_directory("mtran")) + + return LaunchDescription( + [ + DeclareLaunchArgument( + "server_executable", + default_value=str(package_prefix / "lib" / "mtran" / "mtranserver"), + description="Path to the native MTranServer executable.", + ), + DeclareLaunchArgument( + "model_dir", + default_value=str(package_share / "models"), + description="Directory containing the en_zh-Hans model.", + ), + DeclareLaunchArgument( + "config_dir", + default_value=str(package_share / "mtranserver_config"), + description="Directory containing the offline model records file.", + ), + DeclareLaunchArgument( + "params_file", + default_value=str(package_share / "config" / "translator.yaml"), + description="ROS2 parameter file for mtran_bridge_node.", + ), + DeclareLaunchArgument( + "host", + default_value="127.0.0.1", + description="Loopback host used by MTranServer and the bridge.", + ), + DeclareLaunchArgument( + "port", + default_value="8989", + description="HTTP port used by MTranServer and the bridge.", + ), + OpaqueFunction(function=_launch_processes), + ] + ) diff --git a/src/mtran/models/.gitkeep b/src/mtran/models/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/mtran/package.xml b/src/mtran/package.xml new file mode 100644 index 0000000..3ebd349 --- /dev/null +++ b/src/mtran/package.xml @@ -0,0 +1,27 @@ + + + mtran + 0.1.0 + Persistent English-to-Chinese translation service backed by MTranServer. + MTranServer Maintainers + Apache-2.0 + + ament_cmake + rosidl_default_generators + rosidl_default_runtime + ament_index_python + launch + launch_ros + + rclcpp + libcurl4-openssl-dev + nlohmann-json3-dev + + ament_cmake_gtest + + rosidl_interface_packages + + + ament_cmake + + diff --git a/src/mtran/src/http_translation_client.cpp b/src/mtran/src/http_translation_client.cpp new file mode 100644 index 0000000..8a5cf57 --- /dev/null +++ b/src/mtran/src/http_translation_client.cpp @@ -0,0 +1,137 @@ +#include "mtran/http_translation_client.hpp" + +#include +#include + +#include +#include +#include + +namespace mtran +{ +namespace +{ + +size_t append_response(char * data, size_t size, size_t count, void * output) +{ + const auto byte_count = size * count; + static_cast(output)->append(data, byte_count); + return byte_count; +} + +bool is_unavailable(CURLcode code) +{ + return code == CURLE_COULDNT_CONNECT || + code == CURLE_COULDNT_RESOLVE_HOST || + code == CURLE_COULDNT_RESOLVE_PROXY; +} + +TranslationResult failure(ClientError error) +{ + return TranslationResult{false, "", error}; +} + +} // namespace + +HttpTranslationClient::HttpTranslationClient( + std::string server_url, + long timeout_ms, + HttpExecutor executor) +: server_url_(std::move(server_url)), + timeout_ms_(timeout_ms), + executor_(std::move(executor)) +{ + while (!server_url_.empty() && server_url_.back() == '/') { + server_url_.pop_back(); + } + if (!executor_) { + executor_ = &HttpTranslationClient::execute_with_curl; + } +} + +bool HttpTranslationClient::health() +{ + const auto response = executor_("GET", server_url_ + "/health", "", timeout_ms_); + return response.transport_code == CURLE_OK && + response.status_code >= 200 && response.status_code < 300; +} + +TranslationResult HttpTranslationClient::translate(const std::string & text) +{ + const nlohmann::json request = { + {"from", "en"}, + {"to", "zh-Hans"}, + {"text", text}, + {"html", false}, + }; + const auto response = executor_( + "POST", server_url_ + "/translate", request.dump(), timeout_ms_); + + const auto transport_code = static_cast(response.transport_code); + if (transport_code == CURLE_OPERATION_TIMEDOUT) { + return failure(ClientError::kTimeout); + } + if (is_unavailable(transport_code)) { + return failure(ClientError::kUnavailable); + } + if (transport_code != CURLE_OK || response.status_code < 200 || response.status_code >= 300) { + return failure(ClientError::kUpstream); + } + + try { + const auto parsed = nlohmann::json::parse(response.body); + if (!parsed.contains("result") || !parsed.at("result").is_string()) { + return failure(ClientError::kInvalidResponse); + } + return TranslationResult{true, parsed.at("result").get(), ClientError::kNone}; + } catch (const nlohmann::json::exception &) { + return failure(ClientError::kInvalidResponse); + } +} + +HttpResponse HttpTranslationClient::execute_with_curl( + const std::string & method, + const std::string & url, + const std::string & body, + long timeout_ms) +{ + static const auto global_init_code = curl_global_init(CURL_GLOBAL_DEFAULT); + if (global_init_code != CURLE_OK) { + return HttpResponse{global_init_code, 0, ""}; + } + + auto * handle = curl_easy_init(); + if (handle == nullptr) { + return HttpResponse{CURLE_FAILED_INIT, 0, ""}; + } + + std::string response_body; + curl_slist * headers = nullptr; + curl_easy_setopt(handle, CURLOPT_URL, url.c_str()); + curl_easy_setopt(handle, CURLOPT_NOSIGNAL, 1L); + curl_easy_setopt(handle, CURLOPT_CONNECTTIMEOUT_MS, std::min(timeout_ms, 5000L)); + curl_easy_setopt(handle, CURLOPT_TIMEOUT_MS, timeout_ms); + curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, append_response); + curl_easy_setopt(handle, CURLOPT_WRITEDATA, &response_body); + + if (method == "POST") { + headers = curl_slist_append(headers, "Content-Type: application/json"); + curl_easy_setopt(handle, CURLOPT_HTTPHEADER, headers); + curl_easy_setopt(handle, CURLOPT_POST, 1L); + curl_easy_setopt(handle, CURLOPT_POSTFIELDS, body.c_str()); + curl_easy_setopt(handle, CURLOPT_POSTFIELDSIZE, static_cast(body.size())); + } + + const auto transport_code = curl_easy_perform(handle); + long status_code = 0; + curl_easy_getinfo(handle, CURLINFO_RESPONSE_CODE, &status_code); + + if (headers != nullptr) { + curl_slist_free_all(headers); + } + curl_easy_cleanup(handle); + + return HttpResponse{transport_code, status_code, std::move(response_body)}; +} + +} // namespace mtran diff --git a/src/mtran/src/main.cpp b/src/mtran/src/main.cpp new file mode 100644 index 0000000..215df4e --- /dev/null +++ b/src/mtran/src/main.cpp @@ -0,0 +1,16 @@ +#include + +#include + +#include "mtran/translator_node.hpp" + +int main(int argc, char ** argv) +{ + rclcpp::init(argc, argv); + auto node = std::make_shared(); + rclcpp::executors::SingleThreadedExecutor executor; + executor.add_node(node); + executor.spin(); + rclcpp::shutdown(); + return 0; +} diff --git a/src/mtran/src/translator_node.cpp b/src/mtran/src/translator_node.cpp new file mode 100644 index 0000000..cb34924 --- /dev/null +++ b/src/mtran/src/translator_node.cpp @@ -0,0 +1,190 @@ +#include "mtran/translator_node.hpp" + +#include +#include +#include +#include +#include +#include +#include + +namespace mtran +{ + +TranslatorNode::TranslatorNode( + const rclcpp::NodeOptions & options, + std::shared_ptr client) +: Node("mtran_bridge_node", options), + client_(std::move(client)), + startup_started_(std::chrono::steady_clock::now()), + request_timeout_ms_(declare_parameter("request_timeout_ms", 30000)), + startup_timeout_ms_(declare_parameter("startup_timeout_ms", 60000)), + health_retry_ms_(declare_parameter("health_retry_ms", 500)), + keep_warm_interval_s_(declare_parameter("keep_warm_interval_s", 43200)), + max_input_characters_(declare_parameter("max_input_characters", 512)) +{ + const auto server_url = declare_parameter( + "server_url", "http://127.0.0.1:8989"); + if (!client_) { + client_ = std::make_shared(server_url, request_timeout_ms_); + } + + health_retry_ms_ = std::max(1, health_retry_ms_); + keep_warm_interval_s_ = std::max(1, keep_warm_interval_s_); + max_input_characters_ = std::max(1, max_input_characters_); + + health_timer_ = create_wall_timer( + std::chrono::milliseconds(health_retry_ms_), + std::bind(&TranslatorNode::poll_readiness, this)); +} + +void TranslatorNode::poll_readiness() +{ + if (ready_) { + if (!client_->health()) { + RCLCPP_WARN(get_logger(), "MTranServer health check failed; entering recovery"); + mark_not_ready(); + } + return; + } + + if (!ever_ready_ && !startup_timeout_logged_ && startup_timeout_ms_ > 0 && + std::chrono::steady_clock::now() - startup_started_ >= + std::chrono::milliseconds(startup_timeout_ms_)) + { + startup_timeout_logged_ = true; + RCLCPP_ERROR( + get_logger(), "MTranServer did not become ready within %d ms; continuing to retry", + startup_timeout_ms_); + } + + if (!client_->health()) { + return; + } + + const auto warmup = client_->translate("Hello."); + if (!warmup.success) { + return; + } + + ready_ = true; + ever_ready_ = true; + create_service_if_needed(); + + if (!keep_warm_timer_) { + keep_warm_timer_ = create_wall_timer( + std::chrono::seconds(keep_warm_interval_s_), + std::bind(&TranslatorNode::keep_warm, this)); + } else { + keep_warm_timer_->reset(); + } + + RCLCPP_INFO(get_logger(), "MTranServer is healthy and the en-to-zh-Hans model is warm"); +} + +void TranslatorNode::keep_warm() +{ + if (!ready_) { + return; + } + + const auto result = client_->translate("Hello."); + if (!result.success && result.error == ClientError::kUnavailable) { + RCLCPP_WARN(get_logger(), "MTranServer keep-warm connection failed; entering recovery"); + mark_not_ready(); + } else if (!result.success) { + RCLCPP_WARN(get_logger(), "MTranServer keep-warm request failed; keeping service ready"); + } +} + +void TranslatorNode::mark_not_ready() +{ + ready_ = false; + if (keep_warm_timer_) { + keep_warm_timer_->cancel(); + } + health_timer_->reset(); +} + +void TranslatorNode::create_service_if_needed() +{ + if (service_) { + return; + } + + service_ = create_service( + "/translate_en_to_zh", + std::bind( + &TranslatorNode::handle_request, this, + std::placeholders::_1, std::placeholders::_2)); +} + +void TranslatorNode::handle_request( + const TranslateService::Request::SharedPtr request, + TranslateService::Response::SharedPtr response) +{ + response->success = false; + response->translation.clear(); + response->error.clear(); + + if (is_blank(request->text)) { + response->error = "INVALID_INPUT"; + return; + } + if (utf8_codepoint_count(request->text) > + static_cast(max_input_characters_)) + { + response->error = "INPUT_TOO_LONG"; + return; + } + if (!ready_) { + response->error = "NOT_READY"; + return; + } + + const auto result = client_->translate(request->text); + if (result.success) { + response->success = true; + response->translation = result.translation; + return; + } + + response->error = error_code(result.error); + if (result.error == ClientError::kUnavailable) { + mark_not_ready(); + } +} + +std::size_t TranslatorNode::utf8_codepoint_count(const std::string & text) +{ + return static_cast(std::count_if( + text.begin(), text.end(), [](unsigned char byte) { + return (byte & 0xC0U) != 0x80U; + })); +} + +bool TranslatorNode::is_blank(const std::string & text) +{ + return text.empty() || std::all_of( + text.begin(), text.end(), [](unsigned char character) { + return std::isspace(character) != 0; + }); +} + +std::string TranslatorNode::error_code(ClientError error) +{ + switch (error) { + case ClientError::kUnavailable: + return "NOT_READY"; + case ClientError::kTimeout: + return "TIMEOUT"; + case ClientError::kInvalidResponse: + return "INVALID_RESPONSE"; + case ClientError::kNone: + case ClientError::kUpstream: + default: + return "UPSTREAM_ERROR"; + } +} + +} // namespace mtran diff --git a/src/mtran/srv/TranslateEnglishToChinese.srv b/src/mtran/srv/TranslateEnglishToChinese.srv new file mode 100644 index 0000000..4afbc58 --- /dev/null +++ b/src/mtran/srv/TranslateEnglishToChinese.srv @@ -0,0 +1,5 @@ +string text +--- +bool success +string translation +string error diff --git a/src/mtran/test/test_auto_install.sh b/src/mtran/test/test_auto_install.sh new file mode 100644 index 0000000..ac11c47 --- /dev/null +++ b/src/mtran/test/test_auto_install.sh @@ -0,0 +1,240 @@ +#!/usr/bin/env bash +set -euo pipefail + +root=$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd -P) +installer="${root}/dependencies/auto_install.sh" +tmp_root=$(mktemp -d) +trap 'rm -rf "${tmp_root}"' EXIT + +fail() +{ + echo "FAIL: $*" >&2 + exit 1 +} + +expect_failure() +{ + local expected=$1 + shift + local output + if output=$("$@" 2>&1); then + fail "command unexpectedly succeeded: $*" + fi + if [[ "${output}" != *"${expected}"* ]]; then + echo "${output}" >&2 + fail "failure did not contain: ${expected}" + fi +} + +make_os_release() +{ + local path=$1 + local id=$2 + local version=$3 + printf 'ID=%s\nVERSION_ID="%s"\n' "${id}" "${version}" > "${path}" +} + +make_fixture() +{ + local fixture=$1 + mkdir -p "${fixture}/dependencies" "${fixture}/vendor/mtranserver" + cp "${installer}" "${fixture}/dependencies/auto_install.sh" + cp "${root}/dependencies/verify_runtime_data.py" "${fixture}/dependencies/verify_runtime_data.py" + printf '{"version":"4.0.33"}\n' > "${fixture}/vendor/mtranserver/package.json" + printf 'lockfileVersion = 1\n' > "${fixture}/vendor/mtranserver/bun.lock" +} + +make_fake_path() +{ + local fake_bin=$1 + local actions=$2 + mkdir -p "${fake_bin}" + + cat > "${fake_bin}/dpkg-query" <<'EOF' +#!/usr/bin/env bash +case "${@: -1}" in + pkg-config | npm) exit 1 ;; +esac +printf 'install ok installed\n' +EOF + cat > "${fake_bin}/sudo" <> "${actions}" +exit 0 +EOF + cat > "${fake_bin}/file" <<'EOF' +#!/usr/bin/env bash +printf 'ELF 64-bit LSB executable, x86-64\n' +EOF + for command in npm rsync; do + cat > "${fake_bin}/${command}" <> "${actions}" +exit 97 +EOF + done + chmod +x "${fake_bin}"/* +} + +make_valid_runtime() +{ + local fixture=$1 + local actions=$2 + local model_dir="${fixture}/models/en_zh-Hans" + local records_dir="${fixture}/runtime/config" + local runtime_bin="${fixture}/runtime/bin" + local tools_bin="${fixture}/dependencies/tools/node_modules/.bin" + mkdir -p "${model_dir}" "${records_dir}" "${runtime_bin}" "${tools_bin}" + + local model='model-data' + local lex='lex-data' + local src='source-vocab' + local trg='target-vocab' + printf '%s' "${model}" > "${model_dir}/model.enzh.intgemm.alphas.bin" + printf '%s' "${lex}" > "${model_dir}/lex.50.50.enzh.s2t.bin" + printf '%s' "${src}" > "${model_dir}/srcvocab.enzh.spm" + printf '%s' "${trg}" > "${model_dir}/trgvocab.enzh.spm" + + local model_hash lex_hash src_hash trg_hash + model_hash=$(sha256sum "${model_dir}/model.enzh.intgemm.alphas.bin" | cut -d' ' -f1) + lex_hash=$(sha256sum "${model_dir}/lex.50.50.enzh.s2t.bin" | cut -d' ' -f1) + src_hash=$(sha256sum "${model_dir}/srcvocab.enzh.spm" | cut -d' ' -f1) + trg_hash=$(sha256sum "${model_dir}/trgvocab.enzh.spm" | cut -d' ' -f1) + + cat > "${records_dir}/records.json" < "${runtime_bin}/mtranserver" <> "${actions}" +exit 96 +EOF + cat > "${tools_bin}/bun" <> "${actions}" +exit 95 +EOF + chmod +x "${runtime_bin}/mtranserver" "${tools_bin}/bun" +} + +bash -n "${installer}" + +ubuntu_release="${tmp_root}/ubuntu-release" +other_release="${tmp_root}/other-release" +make_os_release "${ubuntu_release}" ubuntu 22.04 +make_os_release "${other_release}" debian 12 + +expect_failure "Ubuntu 22.04" env \ + MTRAN_OS_RELEASE_FILE="${other_release}" \ + MTRAN_MACHINE=x86_64 \ + ROS_DISTRO=humble \ + bash "${installer}" + +expect_failure "x86_64 or aarch64" env \ + MTRAN_OS_RELEASE_FILE="${ubuntu_release}" \ + MTRAN_MACHINE=ppc64le \ + ROS_DISTRO=humble \ + bash "${installer}" + +expect_failure "ROS2 Humble" env -u ROS_DISTRO \ + MTRAN_OS_RELEASE_FILE="${ubuntu_release}" \ + MTRAN_MACHINE=x86_64 \ + MTRAN_ROS_PREFIX="${tmp_root}/missing-ros" \ + bash "${installer}" + +missing_vendor="${tmp_root}/missing-vendor" +mkdir -p "${missing_vendor}/dependencies" +cp "${installer}" "${missing_vendor}/dependencies/auto_install.sh" +expect_failure "vendor/mtranserver" env \ + MTRAN_OS_RELEASE_FILE="${ubuntu_release}" \ + MTRAN_MACHINE=x86_64 \ + ROS_DISTRO=humble \ + bash "${missing_vendor}/dependencies/auto_install.sh" + +fixture="${tmp_root}/copied-workspace/src/mtran" +actions="${tmp_root}/actions.log" +fake_bin="${tmp_root}/fake-bin" +: > "${actions}" +make_fixture "${fixture}" +make_fake_path "${fake_bin}" "${actions}" +make_valid_runtime "${fixture}" "${actions}" + +PATH="${fake_bin}:/usr/bin:/bin" \ +MTRAN_OS_RELEASE_FILE="${ubuntu_release}" \ +MTRAN_MACHINE=x86_64 \ +ROS_DISTRO=humble \ +bash "${fixture}/dependencies/auto_install.sh" + +if grep -Eq '^(npm|rsync|bun|sidecar) ' "${actions}"; then + cat "${actions}" >&2 + fail "valid generated artifacts were rebuilt or downloaded" +fi +if grep -Eq '^sudo ' "${actions}"; then + cat "${actions}" >&2 + fail "already-installed apt dependencies still invoked sudo" +fi + +build_fixture="${tmp_root}/build-workspace/src/mtran" +build_actions="${tmp_root}/build-actions.log" +build_fake_bin="${tmp_root}/build-fake-bin" +make_fixture "${build_fixture}" +make_fake_path "${build_fake_bin}" "${build_actions}" +make_valid_runtime "${build_fixture}" "${build_actions}" +rm "${build_fixture}/runtime/bin/mtranserver" + +cat > "${build_fake_bin}/rsync" <<'EOF' +#!/usr/bin/env bash +source_dir=${@: -2:1} +destination=${@: -1} +mkdir -p "${destination}" +cp -a "${source_dir}/." "${destination}/" +EOF +cat > "${build_fixture}/dependencies/tools/node_modules/.bin/bun" <&2 + exit 94 +fi +if [[ "\${ELECTRON_SKIP_BINARY_DOWNLOAD:-}" != '1' ]]; then + echo 'ELECTRON_SKIP_BINARY_DOWNLOAD was not propagated' >&2 + exit 93 +fi +if [[ "\$(command -v bun)" != "${build_fixture}/dependencies/tools/node_modules/.bin/bun" ]]; then + echo 'workspace-local Bun was not added to PATH' >&2 + exit 92 +fi +printf 'bun %s\n' "\$*" >> "${build_actions}" +if [[ "\${1:-}" == 'run' && "\${2:-}" == 'build' ]]; then + mkdir -p dist + printf '#!/usr/bin/env bash\nexit 0\n' > dist/mtranserver + chmod +x dist/mtranserver +fi +EOF +chmod +x "${build_fake_bin}/rsync" \ + "${build_fixture}/dependencies/tools/node_modules/.bin/bun" + +PATH="${build_fake_bin}:/usr/bin:/bin" \ +MTRAN_OS_RELEASE_FILE="${ubuntu_release}" \ +MTRAN_MACHINE=x86_64 \ +ROS_DISTRO=humble \ +bash "${build_fixture}/dependencies/auto_install.sh" + +test -x "${build_fixture}/runtime/bin/mtranserver" +grep -Fq 'bun install --frozen-lockfile' "${build_actions}" +grep -Fq 'bun run build' "${build_actions}" + +printf 'auto_install tests passed\n' diff --git a/src/mtran/test/test_cmake_preparation.sh b/src/mtran/test/test_cmake_preparation.sh new file mode 100644 index 0000000..2054d09 --- /dev/null +++ b/src/mtran/test/test_cmake_preparation.sh @@ -0,0 +1,53 @@ +#!/usr/bin/env bash +set -euo pipefail + +root=$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd -P) +fixture_root=$(mktemp -d) +trap 'rm -rf "${fixture_root}"' EXIT +fixture="${fixture_root}/mtran" + +rsync -a \ + --exclude '.build/' \ + --exclude 'build/' \ + --exclude 'install/' \ + --exclude 'log/' \ + --exclude 'vendor/' \ + --exclude 'dependencies/tools/' \ + --exclude 'runtime/' \ + --exclude 'models/en_zh-Hans/' \ + "${root}/" "${fixture}/" + +# shellcheck disable=SC1091 +set +u +source /opt/ros/humble/setup.bash +set -u + +if missing_output=$(cmake -S "${fixture}" -B "${fixture}/build-missing" 2>&1); then + echo "CMake unexpectedly configured without prepared runtime files" >&2 + exit 1 +fi +grep -Fq './dependencies/auto_install.sh' <<< "${missing_output}" +grep -Fq 'runtime/bin/mtranserver' <<< "${missing_output}" + +mkdir -p "${fixture}/runtime/bin" \ + "${fixture}/runtime/config" \ + "${fixture}/models/en_zh-Hans" +printf '#!/usr/bin/env bash\nexit 0\n' > "${fixture}/runtime/bin/mtranserver" +chmod +x "${fixture}/runtime/bin/mtranserver" +printf '{"data":[]}\n' > "${fixture}/runtime/config/records.json" +for model_file in \ + model.enzh.intgemm.alphas.bin \ + lex.50.50.enzh.s2t.bin \ + srcvocab.enzh.spm \ + trgvocab.enzh.spm; do + printf 'fixture\n' > "${fixture}/models/en_zh-Hans/${model_file}" +done + +cmake -S "${fixture}" -B "${fixture}/build-ready" -DBUILD_TESTING=OFF >/dev/null + +grep -Fq 'runtime/bin/mtranserver DESTINATION lib/${PROJECT_NAME}' "${fixture}/CMakeLists.txt" +grep -Fq 'models/en_zh-Hans DESTINATION share/${PROJECT_NAME}/models' "${fixture}/CMakeLists.txt" +grep -Fq 'runtime/config/records.json DESTINATION share/${PROJECT_NAME}/mtranserver_config' \ + "${fixture}/CMakeLists.txt" + +printf 'CMake preparation tests passed\n' diff --git a/src/mtran/test/test_dependency_manifest.sh b/src/mtran/test/test_dependency_manifest.sh new file mode 100644 index 0000000..cc7e68f --- /dev/null +++ b/src/mtran/test/test_dependency_manifest.sh @@ -0,0 +1,34 @@ +#!/usr/bin/env bash +set -euo pipefail + +root=$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd -P) +manifest="${root}/dependencies/dependencies.txt" + +test -f "${manifest}" + +required_entries=( + "Ubuntu 22.04" + "ROS2 Humble" + "ament_cmake" + "ament_cmake_gtest" + "rclcpp" + "rosidl_default_generators" + "rosidl_default_runtime" + "launch_ros" + "build-essential" + "file" + "libcurl4-openssl-dev" + "nlohmann-json3-dev" + "Bun 1.3.14" + "MTranServer 4.0.33" + "f5672a9" + "records.json" + "en -> zh-Hans" + "decompressedHash" + "auto_install.sh does not install ROS2" + "colcon build is run by the user" +) + +for required in "${required_entries[@]}"; do + grep -Fq "${required}" "${manifest}" +done diff --git a/src/mtran/test/test_http_translation_client.cpp b/src/mtran/test/test_http_translation_client.cpp new file mode 100644 index 0000000..9368434 --- /dev/null +++ b/src/mtran/test/test_http_translation_client.cpp @@ -0,0 +1,129 @@ +#include +#include + +#include +#include + +#include "mtran/http_translation_client.hpp" + +namespace mtran +{ +namespace +{ + +TEST(HttpTranslationClientTest, SendsFixedDirectionPayloadAndReturnsTranslation) +{ + std::string actual_method; + std::string actual_url; + std::string actual_body; + long actual_timeout = 0; + + HttpTranslationClient client( + "http://127.0.0.1:8989/", 1234, + [&](const std::string & method, const std::string & url, + const std::string & body, long timeout_ms) { + actual_method = method; + actual_url = url; + actual_body = body; + actual_timeout = timeout_ms; + return HttpResponse{CURLE_OK, 200, R"({"result":"你好"})"}; + }); + + const auto result = client.translate("Hello"); + + EXPECT_EQ(actual_method, "POST"); + EXPECT_EQ(actual_url, "http://127.0.0.1:8989/translate"); + EXPECT_EQ(actual_body, R"({"from":"en","html":false,"text":"Hello","to":"zh-Hans"})"); + EXPECT_EQ(actual_timeout, 1234); + EXPECT_TRUE(result.success); + EXPECT_EQ(result.translation, "你好"); + EXPECT_EQ(result.error, ClientError::kNone); +} + +TEST(HttpTranslationClientTest, ReportsUnavailableTransport) +{ + HttpTranslationClient client( + "http://127.0.0.1:8989", 100, + [](const auto &, const auto &, const auto &, long) { + return HttpResponse{CURLE_COULDNT_CONNECT, 0, ""}; + }); + + const auto result = client.translate("Hello"); + + EXPECT_FALSE(result.success); + EXPECT_TRUE(result.translation.empty()); + EXPECT_EQ(result.error, ClientError::kUnavailable); +} + +TEST(HttpTranslationClientTest, ReportsTimeout) +{ + HttpTranslationClient client( + "http://127.0.0.1:8989", 100, + [](const auto &, const auto &, const auto &, long) { + return HttpResponse{CURLE_OPERATION_TIMEDOUT, 0, ""}; + }); + + const auto result = client.translate("Hello"); + + EXPECT_FALSE(result.success); + EXPECT_TRUE(result.translation.empty()); + EXPECT_EQ(result.error, ClientError::kTimeout); +} + +TEST(HttpTranslationClientTest, ReportsNonSuccessHttpStatus) +{ + HttpTranslationClient client( + "http://127.0.0.1:8989", 100, + [](const auto &, const auto &, const auto &, long) { + return HttpResponse{CURLE_OK, 500, "failure"}; + }); + + const auto result = client.translate("Hello"); + + EXPECT_FALSE(result.success); + EXPECT_TRUE(result.translation.empty()); + EXPECT_EQ(result.error, ClientError::kUpstream); +} + +class InvalidResponseTest : public ::testing::TestWithParam +{ +}; + +TEST_P(InvalidResponseTest, RejectsMalformedOrWrongShapeResponse) +{ + const auto response_body = GetParam(); + HttpTranslationClient client( + "http://127.0.0.1:8989", 100, + [response_body](const auto &, const auto &, const auto &, long) { + return HttpResponse{CURLE_OK, 200, response_body}; + }); + + const auto result = client.translate("Hello"); + + EXPECT_FALSE(result.success); + EXPECT_TRUE(result.translation.empty()); + EXPECT_EQ(result.error, ClientError::kInvalidResponse); +} + +INSTANTIATE_TEST_SUITE_P( + InvalidBodies, InvalidResponseTest, + ::testing::Values("not-json", R"({"result":7})", R"({"other":"value"})")); + +TEST(HttpTranslationClientTest, HealthRequiresSuccessfulTransportAndHttpStatus) +{ + int call_count = 0; + HttpTranslationClient client( + "http://127.0.0.1:8989", 100, + [&](const std::string & method, const std::string & url, const std::string &, long) { + ++call_count; + EXPECT_EQ(method, "GET"); + EXPECT_EQ(url, "http://127.0.0.1:8989/health"); + return HttpResponse{CURLE_OK, call_count == 1 ? 503 : 200, ""}; + }); + + EXPECT_FALSE(client.health()); + EXPECT_TRUE(client.health()); +} + +} // namespace +} // namespace mtran diff --git a/src/mtran/test/test_launch_paths.py b/src/mtran/test/test_launch_paths.py new file mode 100644 index 0000000..f1c161d --- /dev/null +++ b/src/mtran/test/test_launch_paths.py @@ -0,0 +1,16 @@ +from pathlib import Path + + +root = Path(__file__).resolve().parents[1] +source = (root / "launch" / "translator.launch.py").read_text(encoding="utf-8") + +assert 'get_package_prefix("mtran")' in source +assert 'get_package_share_directory("mtran")' in source +assert 'get_package_share_directory("mtran_ros2")' not in source +assert "_find_workspace_root" not in source +assert 'package="mtran"' in source +assert 'package_prefix / "lib" / "mtran" / "mtranserver"' in source +assert 'package_share / "models"' in source +assert 'package_share / "mtranserver_config"' in source +assert 'Path.cwd()' not in source +assert "/home/hikos/" not in source diff --git a/src/mtran/test/test_package_identity.sh b/src/mtran/test/test_package_identity.sh new file mode 100644 index 0000000..f9c70b0 --- /dev/null +++ b/src/mtran/test/test_package_identity.sh @@ -0,0 +1,25 @@ +#!/usr/bin/env bash +set -euo pipefail + +root=$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd -P) + +test -f "${root}/package.xml" +test -f "${root}/CMakeLists.txt" +test ! -e "${root}/src/mtran_ros2/package.xml" +grep -q 'mtran' "${root}/package.xml" +grep -q 'project(mtran)' "${root}/CMakeLists.txt" +if grep -q 'build_mtranserver.sh' "${root}/CMakeLists.txt"; then + echo "CMakeLists.txt still installs the removed build_mtranserver.sh" >&2 + exit 1 +fi +grep -q 'mtran/srv/TranslateEnglishToChinese' "${root}/README.md" +if rg -n 'mtran_ros2' "${root}" \ + -g '!docs/superpowers/**' \ + -g '!vendor/**' \ + -g '!test/**' \ + -g '!build/**' \ + -g '!install/**' \ + -g '!log/**'; then + echo "implementation files still reference mtran_ros2" >&2 + exit 1 +fi diff --git a/src/mtran/test/test_readme_commands.sh b/src/mtran/test/test_readme_commands.sh new file mode 100644 index 0000000..b5d9f4b --- /dev/null +++ b/src/mtran/test/test_readme_commands.sh @@ -0,0 +1,29 @@ +#!/usr/bin/env bash +set -euo pipefail + +root=$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd -P) +readme="${root}/README.md" + +required_entries=( + "smart-healthcare-2026/src/mtran" + "./dependencies/auto_install.sh" + "colcon build --packages-select mtran" + "ros2 launch mtran translator.launch.py" + "mtran/srv/TranslateEnglishToChinese" + "/translate_en_to_zh" + "脚本不会安装 ROS2" + "x86_64" + "aarch64" + "records.json" + "MT_OFFLINE=true" + "8989" +) + +for required in "${required_entries[@]}"; do + grep -Fq "${required}" "${readme}" +done + +if rg -n 'mtran_ros2|/home/hikos/MTranServer|Path\.cwd|build_mtranserver\.sh' "${readme}"; then + echo "README still contains an obsolete package name or local path" >&2 + exit 1 +fi diff --git a/src/mtran/test/test_translator_node.cpp b/src/mtran/test/test_translator_node.cpp new file mode 100644 index 0000000..3ca57d3 --- /dev/null +++ b/src/mtran/test/test_translator_node.cpp @@ -0,0 +1,301 @@ +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "mtran/http_translation_client.hpp" +#include "mtran/srv/translate_english_to_chinese.hpp" +#include "mtran/translator_node.hpp" + +using namespace std::chrono_literals; + +namespace mtran +{ +namespace +{ + +class FakeTranslationClient final : public TranslationClient +{ +public: + bool health() override + { + std::lock_guard lock(mutex_); + ++health_calls_; + return healthy_; + } + + TranslationResult translate(const std::string & text) override + { + std::lock_guard lock(mutex_); + if (text == "Hello.") { + ++warmup_calls_; + return warmup_result_; + } + user_inputs_.push_back(text); + return user_result_; + } + + void set_healthy(bool healthy) + { + std::lock_guard lock(mutex_); + healthy_ = healthy; + } + + void set_warmup_result(TranslationResult result) + { + std::lock_guard lock(mutex_); + warmup_result_ = std::move(result); + } + + void set_user_result(TranslationResult result) + { + std::lock_guard lock(mutex_); + user_result_ = std::move(result); + } + + void set_all_translation_results(TranslationResult result) + { + std::lock_guard lock(mutex_); + warmup_result_ = result; + user_result_ = std::move(result); + } + + std::size_t user_call_count() const + { + std::lock_guard lock(mutex_); + return user_inputs_.size(); + } + + int warmup_call_count() const + { + std::lock_guard lock(mutex_); + return warmup_calls_; + } + +private: + mutable std::mutex mutex_; + bool healthy_{true}; + int health_calls_{0}; + int warmup_calls_{0}; + TranslationResult warmup_result_{true, "你好。", ClientError::kNone}; + TranslationResult user_result_{true, "机器人已完成检查。", ClientError::kNone}; + std::vector user_inputs_; +}; + +class TranslatorNodeTest : public ::testing::Test +{ +protected: + using Service = mtran::srv::TranslateEnglishToChinese; + + static void SetUpTestSuite() + { + if (!rclcpp::ok()) { + int argc = 0; + rclcpp::init(argc, nullptr); + } + } + + static void TearDownTestSuite() + { + rclcpp::shutdown(); + } + + void SetUp() override + { + fake_ = std::make_shared(); + rclcpp::NodeOptions options; + options.parameter_overrides( + { + rclcpp::Parameter("health_retry_ms", 1), + rclcpp::Parameter("startup_timeout_ms", 1000), + rclcpp::Parameter("keep_warm_interval_s", 1), + rclcpp::Parameter("max_input_characters", 512), + }); + server_ = std::make_shared(options, fake_); + client_node_ = std::make_shared("mtran_test_client"); + client_ = client_node_->create_client("/translate_en_to_zh"); + executor_.add_node(server_); + executor_.add_node(client_node_); + } + + void TearDown() override + { + executor_.remove_node(client_node_); + executor_.remove_node(server_); + client_.reset(); + client_node_.reset(); + server_.reset(); + fake_.reset(); + } + + bool spin_until_service(std::chrono::milliseconds timeout = 500ms) + { + const auto deadline = std::chrono::steady_clock::now() + timeout; + while (std::chrono::steady_clock::now() < deadline) { + executor_.spin_some(); + if (client_->service_is_ready()) { + return true; + } + std::this_thread::sleep_for(1ms); + } + return false; + } + + Service::Response::SharedPtr call(const std::string & text) + { + auto request = std::make_shared(); + request->text = text; + auto future = client_->async_send_request(request); + EXPECT_EQ(executor_.spin_until_future_complete(future, 1s), rclcpp::FutureReturnCode::SUCCESS); + return future.get(); + } + + rclcpp::executors::SingleThreadedExecutor executor_; + std::shared_ptr fake_; + std::shared_ptr server_; + rclcpp::Node::SharedPtr client_node_; + rclcpp::Client::SharedPtr client_; +}; + +TEST_F(TranslatorNodeTest, AdvertisesServiceOnlyAfterHealthAndWarmup) +{ + fake_->set_healthy(false); + executor_.spin_some(); + std::this_thread::sleep_for(10ms); + executor_.spin_some(); + EXPECT_FALSE(client_->service_is_ready()); + + fake_->set_healthy(true); + + EXPECT_TRUE(spin_until_service()); + EXPECT_GE(fake_->warmup_call_count(), 1); +} + +TEST_F(TranslatorNodeTest, ValidatesEmptyAndLengthBoundariesBeforeCallingClient) +{ + ASSERT_TRUE(spin_until_service()); + + const auto empty = call(" "); + EXPECT_FALSE(empty->success); + EXPECT_TRUE(empty->translation.empty()); + EXPECT_EQ(empty->error, "INVALID_INPUT"); + + const auto at_limit = call(std::string(512, 'a')); + EXPECT_TRUE(at_limit->success); + EXPECT_EQ(at_limit->translation, "机器人已完成检查。"); + EXPECT_TRUE(at_limit->error.empty()); + + const auto over_limit = call(std::string(513, 'a')); + EXPECT_FALSE(over_limit->success); + EXPECT_TRUE(over_limit->translation.empty()); + EXPECT_EQ(over_limit->error, "INPUT_TOO_LONG"); + EXPECT_EQ(fake_->user_call_count(), 1U); +} + +TEST_F(TranslatorNodeTest, MapsTranslationClientOutcomesToServiceErrors) +{ + ASSERT_TRUE(spin_until_service()); + + fake_->set_user_result({false, "", ClientError::kTimeout}); + EXPECT_EQ(call("timeout")->error, "TIMEOUT"); + + fake_->set_user_result({false, "", ClientError::kUpstream}); + EXPECT_EQ(call("upstream")->error, "UPSTREAM_ERROR"); + + fake_->set_user_result({false, "", ClientError::kInvalidResponse}); + EXPECT_EQ(call("invalid")->error, "INVALID_RESPONSE"); +} + +TEST_F(TranslatorNodeTest, RecoversAfterUnavailableSidecarIsHealthyAndWarmAgain) +{ + ASSERT_TRUE(spin_until_service()); + fake_->set_user_result({false, "", ClientError::kUnavailable}); + + const auto unavailable = call("first request"); + EXPECT_FALSE(unavailable->success); + EXPECT_EQ(unavailable->error, "NOT_READY"); + + fake_->set_healthy(false); + fake_->set_user_result({true, "恢复完成", ClientError::kNone}); + const auto while_down = call("second request"); + EXPECT_FALSE(while_down->success); + EXPECT_EQ(while_down->error, "NOT_READY"); + + const auto warmups_before_recovery = fake_->warmup_call_count(); + fake_->set_healthy(true); + const auto deadline = std::chrono::steady_clock::now() + 500ms; + while (fake_->warmup_call_count() == warmups_before_recovery && + std::chrono::steady_clock::now() < deadline) + { + executor_.spin_some(); + std::this_thread::sleep_for(1ms); + } + + const auto recovered = call("third request"); + EXPECT_TRUE(recovered->success); + EXPECT_EQ(recovered->translation, "恢复完成"); + EXPECT_TRUE(recovered->error.empty()); +} + +TEST_F(TranslatorNodeTest, HealthMonitorDetectsRestartBeforeNextUserRequest) +{ + ASSERT_TRUE(spin_until_service()); + const auto user_calls_before_outage = fake_->user_call_count(); + fake_->set_healthy(false); + + const auto detection_deadline = std::chrono::steady_clock::now() + 100ms; + while (std::chrono::steady_clock::now() < detection_deadline) { + executor_.spin_some(); + std::this_thread::sleep_for(1ms); + } + + const auto during_outage = call("request during restart"); + EXPECT_FALSE(during_outage->success); + EXPECT_EQ(during_outage->error, "NOT_READY"); + EXPECT_EQ(fake_->user_call_count(), user_calls_before_outage); + + fake_->set_healthy(true); + const auto warmups_before_recovery = fake_->warmup_call_count(); + const auto recovery_deadline = std::chrono::steady_clock::now() + 500ms; + while (fake_->warmup_call_count() == warmups_before_recovery && + std::chrono::steady_clock::now() < recovery_deadline) + { + executor_.spin_some(); + std::this_thread::sleep_for(1ms); + } + + const auto recovered = call("request after restart"); + EXPECT_TRUE(recovered->success); + EXPECT_EQ(recovered->translation, "机器人已完成检查。"); +} + +TEST_F(TranslatorNodeTest, TransientKeepWarmFailureDoesNotMarkServiceNotReady) +{ + ASSERT_TRUE(spin_until_service()); + fake_->set_all_translation_results({false, "", ClientError::kTimeout}); + + const auto warmups_before_timer = fake_->warmup_call_count(); + const auto deadline = std::chrono::steady_clock::now() + 1500ms; + while (fake_->warmup_call_count() == warmups_before_timer && + std::chrono::steady_clock::now() < deadline) + { + executor_.spin_some(); + std::this_thread::sleep_for(2ms); + } + ASSERT_GT(fake_->warmup_call_count(), warmups_before_timer); + + fake_->set_user_result({true, "服务仍然可用", ClientError::kNone}); + const auto response = call("request after transient failure"); + EXPECT_TRUE(response->success); + EXPECT_EQ(response->translation, "服务仍然可用"); + EXPECT_TRUE(response->error.empty()); +} + +} // namespace +} // namespace mtran diff --git a/src/mtran/test/test_vendor_source.sh b/src/mtran/test/test_vendor_source.sh new file mode 100644 index 0000000..f8d54f6 --- /dev/null +++ b/src/mtran/test/test_vendor_source.sh @@ -0,0 +1,21 @@ +#!/usr/bin/env bash +set -euo pipefail + +root=$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd -P) +vendor="${root}/vendor/mtranserver" + +test -f "${vendor}/package.json" +test -f "${vendor}/bun.lock" +test -f "${vendor}/scripts/build.ts" +test -f "${vendor}/src/main.ts" +test -f "${vendor}/ui/package.json" +test -f "${vendor}/PROVENANCE.md" +grep -Fq '"version": "4.0.33"' "${vendor}/package.json" +grep -Fq 'Source commit: f5672a9' "${vendor}/PROVENANCE.md" + +for generated in .git dist node_modules release migrate_ws; do + if test -e "${vendor}/${generated}"; then + echo "vendored source contains generated path: ${generated}" >&2 + exit 1 + fi +done diff --git a/src/mtran/test/test_verify_runtime_data.py b/src/mtran/test/test_verify_runtime_data.py new file mode 100644 index 0000000..fc52462 --- /dev/null +++ b/src/mtran/test/test_verify_runtime_data.py @@ -0,0 +1,82 @@ +import hashlib +import json +import sys +import tempfile +import unittest +from pathlib import Path + +PACKAGE_ROOT = Path(__file__).resolve().parents[1] +sys.path.insert(0, str(PACKAGE_ROOT / "dependencies")) + +from verify_runtime_data import RuntimeDataError, verify_runtime_data # noqa: E402 + + +class VerifyRuntimeDataTest(unittest.TestCase): + def setUp(self): + self.temp_dir = tempfile.TemporaryDirectory() + self.root = Path(self.temp_dir.name) + self.model_dir = self.root / "models" / "en_zh-Hans" + self.model_dir.mkdir(parents=True) + self.records_path = self.root / "records.json" + + def tearDown(self): + self.temp_dir.cleanup() + + def write_fixture(self): + records = [] + fixtures = { + "model": ("model.bin", b"model"), + "lex": ("lex.bin", b"lex"), + "srcvocab": ("src.spm", b"source"), + "trgvocab": ("trg.spm", b"target"), + } + for role, (filename, content) in fixtures.items(): + (self.model_dir / filename).write_bytes(content) + records.append( + { + "sourceLanguage": "en", + "targetLanguage": "zh-Hans", + "fileType": role, + "version": "1.0", + "decompressedHash": hashlib.sha256(content).hexdigest(), + "decompressedSize": len(content), + "attachment": {"filename": f"{filename}.zst"}, + } + ) + self.records_path.write_text(json.dumps({"data": records})) + return fixtures + + def test_accepts_exact_four_verified_files(self): + fixtures = self.write_fixture() + + selected = verify_runtime_data(self.records_path, self.model_dir) + + self.assertEqual(set(selected), set(fixtures)) + self.assertEqual(selected["model"].name, "model.bin") + + def test_rejects_hash_mismatch(self): + self.write_fixture() + (self.model_dir / "model.bin").write_bytes(b"other") + + with self.assertRaisesRegex(RuntimeDataError, "hash mismatch"): + verify_runtime_data(self.records_path, self.model_dir) + + def test_rejects_missing_required_role(self): + self.write_fixture() + records = json.loads(self.records_path.read_text()) + records["data"] = [item for item in records["data"] if item["fileType"] != "lex"] + self.records_path.write_text(json.dumps(records)) + + with self.assertRaisesRegex(RuntimeDataError, "missing required record role: lex"): + verify_runtime_data(self.records_path, self.model_dir) + + def test_rejects_unselected_model_file(self): + self.write_fixture() + (self.model_dir / "unexpected.bin").write_bytes(b"extra") + + with self.assertRaisesRegex(RuntimeDataError, "unexpected model files"): + verify_runtime_data(self.records_path, self.model_dir) + + +if __name__ == "__main__": + unittest.main() diff --git a/src/mtran/vendor/mtranserver/.dockerignore b/src/mtran/vendor/mtranserver/.dockerignore new file mode 100644 index 0000000..1d2934e --- /dev/null +++ b/src/mtran/vendor/mtranserver/.dockerignore @@ -0,0 +1,13 @@ +node_modules +dist +.git +.github +.vscode +.idea +.DS_Store +ui/node_modules +ui/dist +deprecated +tests +coverage +*.log diff --git a/src/mtran/vendor/mtranserver/.github/workflows/build.yml b/src/mtran/vendor/mtranserver/.github/workflows/build.yml new file mode 100644 index 0000000..8085b64 --- /dev/null +++ b/src/mtran/vendor/mtranserver/.github/workflows/build.yml @@ -0,0 +1,235 @@ +name: Build and Release + +on: + workflow_dispatch: + push: + tags: ["v*"] + +permissions: + contents: write + +jobs: + build-server: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup Bun + uses: oven-sh/setup-bun@v1 + with: + bun-version: latest + + - name: Install dependencies + run: bun install + + - name: Sync version from tag + run: | + if [[ "${{ github.ref }}" == refs/tags/v* ]]; then + VERSION=${GITHUB_REF#refs/tags/} + else + VERSION="v$(cat package.json | grep '"version"' | head -1 | sed 's/.*"version": "\(.*\)".*/\1/')" + fi + echo "Syncing version to ${VERSION}" + bun run bump ${VERSION} + + - name: Build Server + run: bun run build:all + + - name: Upload Server Artifacts + uses: actions/upload-artifact@v4 + with: + name: binaries + path: dist/mtranserver-* + + build-desktop: + strategy: + matrix: + os: [ubuntu-latest, windows-latest, macos-latest] + env: + GH_TOKEN: ${{ secrets.GH_TOKEN || github.token }} + GITHUB_TOKEN: ${{ secrets.GH_TOKEN || github.token }} + runs-on: ${{ matrix.os }} + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup Bun + uses: oven-sh/setup-bun@v1 + with: + bun-version: latest + + - name: Install dependencies + run: bun install + + - name: Sync version from tag + shell: bash + run: | + if [[ "${{ github.ref }}" == refs/tags/v* ]]; then + VERSION=${GITHUB_REF#refs/tags/} + else + VERSION="v$(grep '"version"' package.json | head -1 | sed 's/.*"version": "\(.*\)".*/\1/')" + fi + echo "Syncing version to ${VERSION}" + bun run bump ${VERSION} + + - name: Build Desktop (Linux) + if: matrix.os == 'ubuntu-latest' + run: bun run build:electron -- --linux + + - name: Build Desktop (Windows) + if: matrix.os == 'windows-latest' + run: bun run build:electron -- --win + + - name: Build Desktop (macOS) + if: matrix.os == 'macos-latest' + run: bun run build:electron -- --mac + + - name: Upload Desktop Artifacts + uses: actions/upload-artifact@v4 + with: + name: desktop-${{ matrix.os }} + path: release/mtranserver-desktop-* + + release: + needs: [build-server, build-desktop] + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Download Server Artifacts + uses: actions/download-artifact@v4 + with: + name: binaries + path: release-assets + + - name: Download Desktop Artifacts + uses: actions/download-artifact@v4 + with: + pattern: desktop-* + path: release-assets + merge-multiple: true + + - name: Determine Release Tag + id: tag + run: | + if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then + LATEST_TAG=$(git describe --tags --abbrev=0) + echo "tag_name=$LATEST_TAG" >> $GITHUB_OUTPUT + echo "Using latest tag: $LATEST_TAG" + else + echo "tag_name=${{ github.ref_name }}" >> $GITHUB_OUTPUT + echo "Using ref name: ${{ github.ref_name }}" + fi + + - name: Generate Checksums + run: | + cd release-assets + sha256sum * > SHA256SUMS + cat SHA256SUMS + + - name: Generate Release Body + id: generate_body + run: | + TAG="${{ steps.tag.outputs.tag_name }}" + REPO="${{ github.repository }}" + # Derive version from TAG to be consistent with artifacts + VERSION=${TAG#v} + + # Use VERSION derived from tag instead of package.json to ensure consistency with builds + echo "Using version: $VERSION" + + if [[ "${{ github.ref_name }}" == *"dev"* ]]; then + WARNING=$(printf "**This is a development release. DO NOT USE IT!**\n\n") + else + WARNING="" + fi + + cat > release_body.md << 'EOF' + ${WARNING}## Desktop Client + + | Platform | Architecture | Binary | + |----------|-------------|--------| + | Linux | x64 | [mtranserver-desktop-${VERSION}-linux-x64.AppImage](https://github.com/${REPO}/releases/download/${TAG}/mtranserver-desktop-${VERSION}-linux-x64.AppImage) | + | Linux | arm64 | [mtranserver-desktop-${VERSION}-linux-arm64.AppImage](https://github.com/${REPO}/releases/download/${TAG}/mtranserver-desktop-${VERSION}-linux-arm64.AppImage) | + | Linux | x64 (deb) | [mtranserver-desktop-${VERSION}-linux-x64.deb](https://github.com/${REPO}/releases/download/${TAG}/mtranserver-desktop-${VERSION}-linux-x64.deb) | + | Linux | arm64 (deb) | [mtranserver-desktop-${VERSION}-linux-arm64.deb](https://github.com/${REPO}/releases/download/${TAG}/mtranserver-desktop-${VERSION}-linux-arm64.deb) | + | Linux | x64 (rpm) | [mtranserver-desktop-${VERSION}-linux-x64.rpm](https://github.com/${REPO}/releases/download/${TAG}/mtranserver-desktop-${VERSION}-linux-x64.rpm) | + | Linux | arm64 (rpm) | [mtranserver-desktop-${VERSION}-linux-arm64.rpm](https://github.com/${REPO}/releases/download/${TAG}/mtranserver-desktop-${VERSION}-linux-arm64.rpm) | + | macOS | x64 | [mtranserver-desktop-${VERSION}-mac-x64.dmg](https://github.com/${REPO}/releases/download/${TAG}/mtranserver-desktop-${VERSION}-mac-x64.dmg) | + | macOS | arm64 | [mtranserver-desktop-${VERSION}-mac-arm64.dmg](https://github.com/${REPO}/releases/download/${TAG}/mtranserver-desktop-${VERSION}-mac-arm64.dmg) | + | Windows | x64 | [mtranserver-desktop-${VERSION}-win-x64.exe](https://github.com/${REPO}/releases/download/${TAG}/mtranserver-desktop-${VERSION}-win-x64.exe) | + + > 桌面端启动后会创建一个托盘菜单,通过菜单可以方便的管理服务。 + + **macOS**: 拖动安装后,如果打开 MTranServer App 提示有问题无法打开,需要运行以下命令修复: + + > **macOS**: If you see any error when opening MTranServer App after installing, run this command in Terminal App: + + ```bash + sudo xattr -d com.apple.quarantine "/Applications/MTranServer.app" + ``` + + ## Server Binary + + | Platform | Architecture | Binary | + |----------|-------------|--------| + | Linux | x64 | [mtranserver-${VERSION}-linux-amd64](https://github.com/${REPO}/releases/download/${TAG}/mtranserver-${VERSION}-linux-amd64) | + | Linux | x64 (legacy) | [mtranserver-${VERSION}-linux-amd64-legacy](https://github.com/${REPO}/releases/download/${TAG}/mtranserver-${VERSION}-linux-amd64-legacy) | + | Linux | ARM64 | [mtranserver-${VERSION}-linux-arm64](https://github.com/${REPO}/releases/download/${TAG}/mtranserver-${VERSION}-linux-arm64) | + | Linux (musl) | x64 | [mtranserver-${VERSION}-linux-amd64-musl](https://github.com/${REPO}/releases/download/${TAG}/mtranserver-${VERSION}-linux-amd64-musl) | + | Linux (musl) | x64 (legacy) | [mtranserver-${VERSION}-linux-amd64-musl-legacy](https://github.com/${REPO}/releases/download/${TAG}/mtranserver-${VERSION}-linux-amd64-musl-legacy) | + | Linux (musl) | ARM64 | [mtranserver-${VERSION}-linux-arm64-musl](https://github.com/${REPO}/releases/download/${TAG}/mtranserver-${VERSION}-linux-arm64-musl) | + | macOS | Intel | [mtranserver-${VERSION}-darwin-amd64](https://github.com/${REPO}/releases/download/${TAG}/mtranserver-${VERSION}-darwin-amd64) | + | macOS | Intel (legacy) | [mtranserver-${VERSION}-darwin-amd64-legacy](https://github.com/${REPO}/releases/download/${TAG}/mtranserver-${VERSION}-darwin-amd64-legacy) | + | macOS | Apple Silicon | [mtranserver-${VERSION}-darwin-arm64](https://github.com/${REPO}/releases/download/${TAG}/mtranserver-${VERSION}-darwin-arm64) | + | Windows | x64 | [mtranserver-${VERSION}-windows-amd64.exe](https://github.com/${REPO}/releases/download/${TAG}/mtranserver-${VERSION}-windows-amd64.exe) | + | Windows | x64 (legacy) | [mtranserver-${VERSION}-windows-amd64-legacy.exe](https://github.com/${REPO}/releases/download/${TAG}/mtranserver-${VERSION}-windows-amd64-legacy.exe) | + + ## Note + + **legacy**: 仅适用于使用普通版本会遇到如 'Illegal instruction' 这样问题的旧硬件(无 AVX2 指令集的 CPU),大多数人不需要这个,因为它更慢。 + + > **legacy**: Use only if you experience 'Illegal instruction' crashes on very old hardware (non-AVX2 CPUs). Most people don't need this because it's slower. + + **musl**: 仅适用于 Linux 使用 musl libc 的用户,大多数人不需要这个。 + + > **musl**: Use only if you are on Linux with musl libc. Most people don't need this. + + ## Docker + + Image: `xxnuo/mtranserver:latest` + + 可执行文件版本主要面向个人桌面端部署,如果需要更高性能和稳定性,推荐使用 Docker 版本。 + + > Executable version is mainly for personal desktop deployment. If you need higher performance and stability, it is recommended to use the Docker version. + + 如果你的 CPU 不支持 AVX 并且使用 legacy 版本也报错,推荐使用 Docker 版本而非可执行文件版本,因为 Docker 版本会自动选择合适的架构运行且速度更快。 + + > If your CPU does not support AVX and using legacy version also crashes, it is recommended to use the Docker version instead of the executable file version, because the Docker version will automatically select the appropriate architecture to run and is faster. + + ## Changelog + EOF + + sed -i "s|\${WARNING}|${WARNING}|g" release_body.md + sed -i "s|\${REPO}|${REPO}|g" release_body.md + sed -i "s|\${TAG}|${TAG}|g" release_body.md + sed -i "s|\${VERSION}|${VERSION}|g" release_body.md + + if [ -f CHANGELOG.md ]; then + echo "" >> release_body.md + cat CHANGELOG.md >> release_body.md + fi + + - name: Create Release + uses: softprops/action-gh-release@v2 + with: + tag_name: ${{ steps.tag.outputs.tag_name }} + name: ${{ steps.tag.outputs.tag_name }} + body_path: release_body.md + files: release-assets/* + draft: false + fail_on_unmatched_files: false diff --git a/src/mtran/vendor/mtranserver/.github/workflows/desktop.yml b/src/mtran/vendor/mtranserver/.github/workflows/desktop.yml new file mode 100644 index 0000000..e51e19e --- /dev/null +++ b/src/mtran/vendor/mtranserver/.github/workflows/desktop.yml @@ -0,0 +1,52 @@ +name: Desktop Build + +on: + workflow_dispatch: + +permissions: + contents: write + +jobs: + build_desktop: + runs-on: ${{ matrix.os }} + permissions: + contents: write + strategy: + matrix: + os: [ubuntu-latest, macos-latest, windows-latest] + env: + GH_TOKEN: ${{ secrets.GH_TOKEN || github.token }} + GITHUB_TOKEN: ${{ secrets.GH_TOKEN || github.token }} + defaults: + run: + shell: bash + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup Bun + uses: oven-sh/setup-bun@v1 + with: + bun-version: latest + + - name: Install dependencies + run: bun install + + - name: Sync version from tag + run: | + if [[ "${{ github.ref }}" == refs/tags/v* ]]; then + VERSION=${GITHUB_REF#refs/tags/} + else + VERSION="v$(cat package.json | grep '\"version\"' | head -1 | sed 's/.*\"version\": \"\(.*\)\".*/\1/')" + fi + echo "Syncing version to ${VERSION}" + bun run bump ${VERSION} + + - name: Build Desktop + run: bun run build:electron + + - name: Upload Desktop Artifacts + uses: actions/upload-artifact@v4 + with: + name: desktop-${{ matrix.os }} + path: release/mtranserver-desktop-* diff --git a/src/mtran/vendor/mtranserver/.github/workflows/docker.yml b/src/mtran/vendor/mtranserver/.github/workflows/docker.yml new file mode 100644 index 0000000..496ff88 --- /dev/null +++ b/src/mtran/vendor/mtranserver/.github/workflows/docker.yml @@ -0,0 +1,84 @@ +name: Build and Push Docker Image + +on: + push: + tags: ["v*"] + workflow_dispatch: + +permissions: + contents: read + packages: write + +jobs: + docker: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Get latest tag + id: latest_tag + run: | + LATEST_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "v0.0.0") + echo "tag=${LATEST_TAG}" >> $GITHUB_OUTPUT + echo "Latest tag: ${LATEST_TAG}" + + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Log in to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Log in to GitHub Container Registry + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Extract metadata + id: meta + uses: docker/metadata-action@v5 + with: + images: | + xxnuo/mtranserver + ghcr.io/xxnuo/mtranserver + flavor: | + latest=false + tags: | + type=semver,pattern={{version}},value=${{ steps.latest_tag.outputs.tag }} + type=semver,pattern={{major}}.{{minor}},value=${{ steps.latest_tag.outputs.tag }} + type=semver,pattern={{major}},value=${{ steps.latest_tag.outputs.tag }} + type=raw,value=latest + + - name: Get version + id: version + run: | + if [[ "${{ github.ref }}" == refs/tags/v* ]]; then + VERSION=${GITHUB_REF#refs/tags/} + else + VERSION=${{ steps.latest_tag.outputs.tag }} + fi + echo "version=${VERSION}" >> $GITHUB_OUTPUT + + - name: Build and push + uses: docker/build-push-action@v5 + with: + context: . + platforms: linux/amd64,linux/arm64 + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + build-args: | + VERSION=${{ steps.version.outputs.version }} + cache-from: type=gha + cache-to: type=gha,mode=max + provenance: false diff --git a/src/mtran/vendor/mtranserver/.github/workflows/npm.yml b/src/mtran/vendor/mtranserver/.github/workflows/npm.yml new file mode 100644 index 0000000..ff1948d --- /dev/null +++ b/src/mtran/vendor/mtranserver/.github/workflows/npm.yml @@ -0,0 +1,43 @@ +name: Publish to NPM + +on: + release: + types: [published] + workflow_dispatch: + +jobs: + publish: + runs-on: ubuntu-latest + environment: npm-publish # Requires manual approval in GitHub Settings + permissions: + contents: read + id-token: write # Required for Trusted Publishing (provenance) + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Bun + uses: oven-sh/setup-bun@v1 + with: + bun-version: latest + + - name: Setup Node + uses: actions/setup-node@v4 + with: + node-version: '20.x' + registry-url: 'https://registry.npmjs.org' + + - name: Install Dependencies + run: bun install + + # We run build:lib manually here to ensure it uses the CI environment correctly + # although prepublishOnly in package.json handles it too. + - name: Build Library + run: bun run build:lib + + - name: Publish to NPM + # --provenance flag is key for Trusted Publishing to verify the source + run: npm publish --provenance --access public + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} # Only if NOT using Trusted Publishing strictly, but with provenance usually automatic diff --git a/src/mtran/vendor/mtranserver/.gitignore b/src/mtran/vendor/mtranserver/.gitignore new file mode 100644 index 0000000..c610b76 --- /dev/null +++ b/src/mtran/vendor/mtranserver/.gitignore @@ -0,0 +1,27 @@ +*.log +*.tar + +*.psd +*.bin +*.spm +*.zip +.env +*node_modules* +/packages +/models +/.bin +/dist +/.claude +/tests/ff +/tests/MTranCore + +deprecated/go/bin/worker +deprecated/go/dist/mtranserver-darwin-arm64 +*.o +src/generated/ +src/assets/ui.ts +src/assets/swagger.ts +*.tgz +/release +/.electron-node-modules +/.electron-build-temp diff --git a/src/mtran/vendor/mtranserver/API.md b/src/mtran/vendor/mtranserver/API.md new file mode 100644 index 0000000..aec8033 --- /dev/null +++ b/src/mtran/vendor/mtranserver/API.md @@ -0,0 +1,81 @@ +# MTranServer 高级配置说明 + +[中文](API.md) | [English](docs/API_en.md) | [日本語](docs/API_ja.md) | [Français](docs/API_fr.md) | [Deutsch](docs/API_de.md) + +### 环境变量配置 + +| 环境变量 | 说明 | 默认值 | 可选值 | +| --------------------- | ---------------------------------------- | ------ | --------------------------- | +| MT_LOG_LEVEL | 日志级别 | warn | debug, info, warn, error | +| MT_CONFIG_DIR | 配置目录 | ~/.config/mtran/server | 任意路径 | +| MT_MODEL_DIR | 模型目录 | ~/.config/mtran/models | 任意路径 | +| MT_HOST | 服务器监听地址 | 0.0.0.0| 任意 IP 地址 | +| MT_PORT | 服务器端口 | 8989 | 1-65535 | +| MT_ENABLE_UI | 启用 Web UI | true | true, false | +| MT_OFFLINE | 离线模式,不自动下载新语言的模型,仅使用已下载的模型 | false | true, false | +| MT_WORKER_IDLE_TIMEOUT| Worker 空闲超时时间(秒) | 300 | 任意正整数 | +| MT_API_TOKEN | API 访问令牌 | 空 | 任意字符串 | +| MT_CACHE_SIZE | 缓存大小(缓存最近的多少次翻译) | 0 | 任意正整数 | + +示例: + +```bash +# 设置日志级别为 debug +export MT_LOG_LEVEL=debug + +# 设置端口为 9000 +export MT_PORT=9000 + +# 启动服务 +./mtranserver +``` + +### API 接口说明 + +#### 系统接口 + +| 接口 | 方法 | 说明 | 认证 | +| ---- | ---- | ---- | ---- | +| `/version` | GET | 获取服务版本 | 否 | +| `/health` | GET | 健康检查 | 否 | +| `/__heartbeat__` | GET | 心跳检查 | 否 | +| `/__lbheartbeat__` | GET | 负载均衡心跳检查 | 否 | +| `/docs/*` | GET | Swagger API 文档 | 否 | + +#### 翻译接口 + +| 接口 | 方法 | 说明 | 认证 | +| ---- | ---- | ---- | ---- | +| `/languages` | GET | 获取支持的语言列表 | 是 | +| `/translate` | POST | 单文本翻译 | 是 | +| `/translate/batch` | POST | 批量翻译 | 是 | + +**单文本翻译请求示例:** + +```json +{ + "from": "en", + "to": "zh-Hans", + "text": "Hello, world!", + "html": false +} +``` + +**批量翻译请求示例:** + +```json +{ + "from": "en", + "to": "zh-Hans", + "texts": ["Hello, world!", "Good morning!"], + "html": false +} +``` + +**认证方式:** + +- Header: `Authorization: Bearer ` +- Query: `?token=` + + +详细内容请参考服务器启动后的 API 文档内容。 diff --git a/src/mtran/vendor/mtranserver/CHANGELOG.md b/src/mtran/vendor/mtranserver/CHANGELOG.md new file mode 100644 index 0000000..3dc6671 --- /dev/null +++ b/src/mtran/vendor/mtranserver/CHANGELOG.md @@ -0,0 +1,3 @@ +## v4.0.31 + +- 添加中文输出标点全角化功能,默认开启 diff --git a/src/mtran/vendor/mtranserver/DONATE.md b/src/mtran/vendor/mtranserver/DONATE.md new file mode 100644 index 0000000..da24d14 --- /dev/null +++ b/src/mtran/vendor/mtranserver/DONATE.md @@ -0,0 +1,2 @@ +微信 +支付宝 diff --git a/src/mtran/vendor/mtranserver/Dockerfile b/src/mtran/vendor/mtranserver/Dockerfile new file mode 100644 index 0000000..e7e8022 --- /dev/null +++ b/src/mtran/vendor/mtranserver/Dockerfile @@ -0,0 +1,35 @@ +FROM oven/bun:1 AS builder +WORKDIR /app + +ARG VERSION +ENV VERSION=${VERSION} + +COPY package.json bun.lock ./ +RUN --mount=type=cache,target=/root/.bun/install/cache \ + bun install --frozen-lockfile + +COPY ui/package.json ui/bun.lock ./ui/ +RUN --mount=type=cache,target=/root/.bun/install/cache \ + cd ui && bun install --frozen-lockfile + +COPY . . + +RUN if [ -z "$VERSION" ]; then VERSION=$(bun -p "require('./package.json').version"); fi; \ + bun run bump "$VERSION" + +RUN --mount=type=cache,target=/root/.bun/install/cache \ + bun run build:node + +FROM node:22-alpine + +WORKDIR /app + +COPY --from=builder /app/dist ./ + +ENV MT_HOST=0.0.0.0 \ + MT_PORT=8989 \ + NODE_ENV=production + +EXPOSE 8989 + +CMD ["node", "main.js"] diff --git a/src/mtran/vendor/mtranserver/HISTORY.md b/src/mtran/vendor/mtranserver/HISTORY.md new file mode 100644 index 0000000..70f62e0 --- /dev/null +++ b/src/mtran/vendor/mtranserver/HISTORY.md @@ -0,0 +1,110 @@ +## v4.0.31 + +- 添加中文输出标点全角化功能,默认开启 + +## v4.0.30 + +- 默认沉浸式翻译接口输入语言为 auto(因为它经常输入错误的语言代码,只能这样适配它了) +- 改进 auto 的混合语言处理逻辑 + +## v4.0.29 + +- UI:新增跟随系统主题功能 +- UI:使用 IndexDB 存储历史记录,提升性能 + +## v4.0.28 + +- 桌面端:托盘菜单添加开机启动开关 +- 桌面端:检测更新功能 + +## v4.0.27 + +- 添加 DeepLX 兼容接口 +- 增大断句长度,提升了翻译质量,建议升级 +- 修复译文标点符号格式错误的问题 + +## v4.0.20 + +- 发布到 npm,现在可以通过 `npm i -g mtranserver` 安装或者 `npx mtranserver` 来运行服务器啦! +- 修复语言检测的内存安全问题 +- 修复混合语言检测的逻辑问题,现在能够正常翻译混合语言文本为目标语言了 +- 新增 `--download` 命令,支持通过命令行批量下载语言对模型 (例如 `mtranserver --download en_zh zh_en`) +- 新增 `--languages` 命令,列出所有可下载的语言对 +- UI:新增宽屏模式按钮 +- UI:新增多面板并排翻译的功能 +- UI:新增记忆语言、主题等功能开关的功能 +- UI:新增副标题文档地址按钮 +- UI:修复历史记录没有滚动条的问题 + +## v4.0.20 + +- 发布到 npm,现在可以通过 `npm i -g mtranserver` 安装或者 `npx mtranserver` 来运行服务器啦! +- 修复语言检测的内存安全问题 +- 修复混合语言检测的逻辑问题,现在能够正常翻译混合语言文本为目标语言了 +- 新增 `--download` 命令,支持通过命令行批量下载语言对模型 (例如 `mtranserver --download en_zh zh_en`) +- 新增 `--languages` 命令,列出所有可下载的语言对 +- UI:新增宽屏模式按钮 +- UI:新增多面板并排翻译的功能 +- UI:新增记忆语言、主题等功能开关的功能 +- UI:新增副标题文档地址按钮 +- UI:修复历史记录没有滚动条的问题 + +## v4.0.13 + +- 改进 Docker 镜像构建支持,现在任何旧设备都能运行 Docker 版本啦! +- 无论新旧设备,使用 Docker 版本性能更佳!推荐使用 Docker 版本! +- Release 构建的可执行文件暂未跟进该功能,敬请期待! + +## v4.0.12 + +- 改进日志功能 (感谢 @ApliNi) +- 新增 LRU 缓存功能 (感谢 @ApliNi) + +## v4.0.11 + +- 修复认证功能失效的问题 +- Fix authentication issue + +## v4.0.10 + +### 中文版本 + +#### 性能与引擎 + +- 引擎重构:完成 v4 引擎重构,显著提升运行速度与稳定性。 +- 内存优化:内存占用回归至 1GB 以内水平。在 Linux x64 环境下翻译《福尔摩斯探案集》时,btop 显示内存占用低于 600MB。 + +#### 部署与兼容性 + +- Docker 修复与支持:修复了 Docker 构建问题,新增标准版(xxnuo/mtranserver:latest)与兼容版(xxnuo/mtranserver:legacy)镜像。 +- 多环境支持:新增对旧款 CPU (non-AVX2) 以及 Linux musl 的构建支持。 + +#### 新功能 + +- 更新检查器:新增启动时自动检查更新功能。可通过 --check-update 参数或 MT_CHECK_UPDATE 环境变量启用或禁用。 + +#### 已知问题 + +- Android 兼容性:当前版本暂时无法在 Android 设备上运行。 + +--- + +### English Version + +#### Performance & Engine + +- Engine Rewrite: The v4 engine has been refactored for significantly faster performance and enhanced stability. +- Memory Efficiency: Memory usage has returned to sub-1GB levels. (Tested on Linux x64 during English-to-Chinese translation of "The Adventures of Sherlock Holmes", btop usage was under 600MB). + +#### Deployment & Compatibility + +- Docker Improvements: Fixed Docker build issues and added support for both standard (xxnuo/mtranserver:latest) and legacy-compatible (xxnuo/mtranserver:legacy) images. +- Platform Support: Added legacy build support for non-AVX2 CPUs and Linux musl build support. + +#### New Features + +- Update Checker: Added automatic update checks on startup. This can be toggled via the --check-update flag or the MT_CHECK_UPDATE environment variable. + +#### Known Issues + +- Android Support: Temporarily unavailable on Android devices. diff --git a/src/mtran/vendor/mtranserver/LICENSE b/src/mtran/vendor/mtranserver/LICENSE new file mode 100644 index 0000000..f49a4e1 --- /dev/null +++ b/src/mtran/vendor/mtranserver/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/src/mtran/vendor/mtranserver/PROVENANCE.md b/src/mtran/vendor/mtranserver/PROVENANCE.md new file mode 100644 index 0000000..ef1ec78 --- /dev/null +++ b/src/mtran/vendor/mtranserver/PROVENANCE.md @@ -0,0 +1,14 @@ +# MTranServer Source Provenance + +Source repository: https://github.com/xxnuo/MTranServer.git + +Source commit: f5672a9 + +Release: MTranServer 4.0.33 + +License: Apache-2.0 (see `LICENSE`) + +Build entry point: package.json script `build` -> `scripts/build.ts --single` + +This directory is vendored, read-only build input. Generated files belong in +`../../.build/mtranserver`, never in this source tree. diff --git a/src/mtran/vendor/mtranserver/README.md b/src/mtran/vendor/mtranserver/README.md new file mode 100644 index 0000000..8876c8c --- /dev/null +++ b/src/mtran/vendor/mtranserver/README.md @@ -0,0 +1,214 @@ +# MTranServer + +[中文](README.md) | [English](docs/README_en.md) | [日本語](docs/README_ja.md) | [Français](docs/README_fr.md) | [Deutsch](docs/README_de.md) + + + +一个超低资源消耗速度超快的离线翻译模型服务器,无需显卡。单个请求平均响应时间 50 毫秒。支持全世界主要语言的翻译。 + +注意本模型服务器专注于`离线翻译`、`响应速度`、`跨平台部署`、`本地运行` 达到 `无限免费翻译` 的设计目标,受限于模型大小和优化程度,所以翻译质量肯定是不如大模型翻译的效果。需要高质量的翻译建议使用在线大模型 API。 + +> v4 优化了内存占用,速度进一步提升,增强了稳定性,如果你在使用旧版建议立即升级! + + + +## 在线试用 Demo + +| 网站 | TOKEN | 其他接口 | 提供者 | +| ---------------------------------------------------------------------------- | ------------------------- | ------------------------------------------------------------------------------ | ------------------------------------ | +| [ipacel.cc](https://MTranServer.ipacel.cc/ui/?token=__IpacEL_MT_API_TOKEN__) | `__IpacEL_MT_API_TOKEN__` | 沉浸式翻译: `https://MTranServer.ipacel.cc/imme?token=__IpacEL_MT_API_TOKEN__` | [@ApliNi](https://github.com/ApliNi) | + +感谢社区贡献者为用户提供试用服务! + +## 使用说明 + +现在支持桌面端一键启动!支持 Windows、Mac、Linux。 + +### 桌面端 + +#### 手动下载 + +前往 [Releases](https://github.com/xxnuo/MTranServer/releases) 下载对应平台最新桌面端,直接安装启动,即可使用。 + +桌面端启动后会创建一个托盘菜单,通过菜单可以方便的管理服务。 + +程序自带的一个简单 UI 的地址和在线调试文档。 + +具体使用说明可以直接跳转到 [生态项目](#生态项目) + +预览(最新版有更新): + +![UI](./images/ui.png) + +![文档](./images/swagger.png) + +### 服务端 + +推荐使用桌面端或者 Docker 部署,性能更佳使用方便。服务端手动部署供专业用户使用。 + +#### 快速开始 + +程序员朋友可以通过命令行直接启动服务器端: + +```bash +npx mtranserver@latest +``` + +> `npx` 可以替换为你喜欢的任意一个包管理器,比如 `bunx`、`pnpx` 等。 + +> **重要提示:** +> +> 首次翻译某个语言对时,服务器会自动下载对应的翻译模型(除非启用了离线模式),这个过程可能需要等待一段时间(取决于网络速度和模型大小)。 +> 模型下载完成后,翻译请求将享受毫秒级的响应速度。建议在正式使用前先测试一次翻译,让服务器预先下载和加载模型。程序经常更新,如果遇到问题,可以尝试更新到最新版本。 + +#### 快速安装 + +```bash +npm i -g mtranserver@latest +``` + +> `npm` 可以替换为你喜欢的任意一个包管理器,比如 `bun`、`pnpm` 等。 + +然后启动 `mtranserver` 即可。 + +#### Docker Compose 部署 + +找一个空目录,编写 `compose.yml` 文件,内容如下: + +```yml +services: + mtranserver: + image: xxnuo/mtranserver:latest + container_name: mtranserver + restart: unless-stopped + ports: + - "8989:8989" + environment: + - MT_HOST=0.0.0.0 + - MT_PORT=8989 + - MT_OFFLINE=false + # - MT_API_TOKEN=your_secret_token_here + volumes: + - ./models:/app/models +``` + +```bash +docker pull xxnuo/mtranserver:latest +docker compose up -d +``` + +## 生态项目 + +### IDE 插件 + +#### [MTranCode](https://github.com/xxnuo/MTranCode) 代码注释翻译插件 + +支持 VS Code、Cursor、Augment 等 VS Code 系列 IDE + +在插件商店搜索 **`MTranCode`** 即可安装注释翻译插件 + +插件默认接口会调用 `http://localhost:8989` 接口的服务器进行注释、代码的翻译,可在设置中调整。 + +该插件由 [vscode-comment-translate](https://github.com/intellism/vscode-comment-translate) fork 而来。 + +### 浏览器插件 + +#### [MTranBrowser](https://github.com/xxnuo/MTranBrowser) + +TODO: 火热开发中 + +> 如果你开发了衍生项目,欢迎提交 PR,我会在生态项目中添加你的项目。 + +> 对了项目已经发布到 npm 包,可以直接在其他程序中调用简单的库接口实现翻译功能,具体信息查看 ts 类型说明。 + +## 兼容接口 + +服务器提供了多个翻译插件的兼容接口: + +| 接口 | 方法 | 说明 | 支持的插件 | +| ------------------------------- | ---- | ---------------------------------- | --------------------------------------------------------------------------- | +| `/imme` | POST | 沉浸式翻译插件接口 | [沉浸式翻译](https://immersivetranslate.com/) | +| `/kiss` | POST | 简约翻译插件接口 | [简约翻译](https://github.com/fishjar/kiss-translator) | +| `/deepl` | POST | DeepL API v2 兼容接口 | 支持 DeepL API 的客户端 | +| `/deeplx` | POST | DeepLX 兼容接口 | 支持 DeepLX 接口的客户端 | +| `/hcfy` | POST | 划词翻译兼容接口 | [划词翻译](https://github.com/Selection-Translator/crx-selection-translate) | +| `/hcfy` | POST | 划词翻译兼容接口 | [划词翻译](https://github.com/Selection-Translator/crx-selection-translate) | +| `/google/language/translate/v2` | POST | Google Translate API v2 兼容接口 | 支持 Google Translate API 的客户端 | +| `/google/translate_a/single` | GET | Google translate_a/single 兼容接口 | 支持 Google 网页翻译的客户端 | + +**插件配置说明:** + +> 注: +> +> - [沉浸式翻译](https://immersivetranslate.com/zh-Hans/docs/services/custom/) 在`设置`页面,开发者模式中启用`Beta`特性,即可在`翻译服务`中看到`自定义 API 设置`([官方图文教程](https://immersivetranslate.com/zh-Hans/docs/services/custom/))。然后将`自定义 API 设置`的`每秒最大请求数`拉高以充分发挥服务器性能准备体验飞一般的感觉。我设置的是`每秒最大请求数`为`512`,`每次请求最大段落数`为`1`。你可以根据自己服务器配置设置。 +> +> - [简约翻译](https://github.com/fishjar/kiss-translator) 在`设置`页面,接口设置中滚动到下面,即可看到自定义接口 `Custom`。同理,设置`最大请求并发数量`、`每次请求间隔时间`以充分发挥服务器性能。我设置的是`最大请求并发数量`为`100`,`每次请求间隔时间`为`1`。你可以根据自己服务器配置设置。 +> +> 接下来按下表的设置方法设置插件的自定义接口地址。 + +| 名称 | URL | 插件设置 | +| ---------------- | ---------------------------------------------------- | --------------------------------------------------------------- | +| 沉浸式翻译无密码 | `http://localhost:8989/imme` | `自定义API 设置` - `API URL` | +| 沉浸式翻译有密码 | `http://localhost:8989/imme?token=your_token` | 同上,需要更改 URL 尾部的 `your_token` 为你的 `MT_API_TOKEN` 值 | +| 简约翻译无密码 | `http://localhost:8989/kiss` | `接口设置` - `Custom` - `URL` | +| 简约翻译有密码 | `http://localhost:8989/kiss` | 同上,需要 `KEY` 填 `your_token` | +| DeepL 兼容 | `http://localhost:8989/deepl` | 使用 `DeepL-Auth-Key` 或 `Bearer` 认证 | +| DeepLX 兼容 | `http://localhost:8989/deeplx` | 支持 `token` 参数或 `Bearer` 认证 | +| Google 兼容 | `http://localhost:8989/google/language/translate/v2` | 使用 `key` 参数或 `Bearer` 认证 | +| 划词翻译 | `http://localhost:8989/hcfy` | 支持 `token` 参数或 `Bearer` 认证 | + +**普通用户参照表格内容设置好插件使用的接口地址就可以使用了。** + +### 命令行参数 + +```bash +./mtranserver [选项] + +选项: + -version, -v 显示版本信息 + -log-level string 日志级别 (debug, info, warn, error) (默认 "warn") + -config-dir string 配置目录 (默认 "~/.config/mtran/server") + -model-dir string 模型目录 (默认 "~/.config/mtran/models") + -host string 服务器监听地址 (默认 "0.0.0.0") + -port string 服务器端口 (默认 "8989") + -ui 启用 Web UI (默认 true) + -offline 启用离线模式,不自动下载新模型 (默认 false) + -worker-idle-timeout int Worker 空闲超时时间(秒) (默认 300) + --download pairs... 下载指定语言对的模型 (例如 --download en_zh zh_en) + --languages 列出所有支持下载的语言对 + +注意:`--download` 和 `--languages` 命令需要联网,无法在离线模式下工作。 + +示例: + ./mtranserver --host 127.0.0.1 --port 8080 + ./mtranserver --ui --offline + ./mtranserver -v +``` + +## 同类项目 + +列出一些同类功能的项目,如果有其他需求的用户可以尝试这些项目: + +| 项目名称 | 内存占用 | 并发性能 | 翻译效果 | 速度 | 其他信息 | +| ------------------------------------------------------------------ | -------- | -------- | -------- | ---- | --------------------------------------------------------------------------------------------------------------------------------- | +| [NLLB](https://github.com/facebookresearch/fairseq/tree/nllb) | 很高 | 差 | 一般 | 慢 | 大佬移植到了 Android 的 [RTranslator](https://github.com/niedev/RTranslator) 有很多优化,但占用仍然高,速度也不快 | +| [LibreTranslate](https://github.com/LibreTranslate/LibreTranslate) | 很高 | 一般 | 一般 | 中等 | 中端 CPU 每秒处理 3 句,高端 CPU 每秒处理 15-20 句,[详情](https://community.libretranslate.com/t/performance-benchmark-data/486) | +| [OPUS-MT](https://github.com/OpenNMT/CTranslate2#benchmarks) | 高 | 一般 | 略差 | 快 | [性能测试](https://github.com/OpenNMT/CTranslate2#benchmarks) | +| 其他大模型 | 超高 | 动态 | 非常好 | 很慢 | 对硬件要求很高,如果需要高并发翻译建议使用 vllm 框架 | +| 本项目 | 低 | 高 | 一般 | 极快 | 单个请求平均响应时间 50ms | + +> 表中为 CPU、英译中场景下的简单测试,非严格测试,非量化版本对比,仅供参考。 + +# 高级配置说明 + +请参考 [API.md](API.md) 文件和启动后的 API 文档。 + +## Star History + +[![Star History Chart](https://api.star-history.com/svg?repos=xxnuo/MTranServer&type=Timeline)](https://www.star-history.com/#xxnuo/MTranServer&Timeline) + +## Thanks + +[Bergamot Project](https://browser.mt/) for awesome idea of local translation. + +[Mozilla](https://github.com/mozilla) for the [models](https://github.com/mozilla/firefox-translations-models). diff --git a/src/mtran/vendor/mtranserver/bun.lock b/src/mtran/vendor/mtranserver/bun.lock new file mode 100644 index 0000000..771bf08 --- /dev/null +++ b/src/mtran/vendor/mtranserver/bun.lock @@ -0,0 +1,1149 @@ +{ + "lockfileVersion": 1, + "configVersion": 1, + "workspaces": { + "": { + "name": "mtran-engine", + "dependencies": { + "express": "^5.2.1", + "express-validator": "^7.3.1", + "fzstd": "^0.1.1", + "lru-cache": "^11.2.4", + "swagger-ui-express": "^5.0.1", + }, + "devDependencies": { + "@tsoa/runtime": "^7.0.0-alpha.0", + "@types/bun": "^1.3.5", + "@types/express": "^5.0.6", + "@types/node": "^25.0.3", + "@types/swagger-ui-express": "^4.1.8", + "electron": "^39.2.7", + "electron-builder": "^26.4.0", + "tsoa": "^7.0.0-alpha.0", + "tsx": "^4.21.0", + "typescript": "^5.9.3", + }, + }, + }, + "packages": { + "7zip-bin": ["7zip-bin@5.2.0", "https://registry.npmmirror.com/7zip-bin/-/7zip-bin-5.2.0.tgz", {}, "sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A=="], + + "@develar/schema-utils": ["@develar/schema-utils@2.6.5", "https://registry.npmmirror.com/@develar/schema-utils/-/schema-utils-2.6.5.tgz", { "dependencies": { "ajv": "^6.12.0", "ajv-keywords": "^3.4.1" } }, "sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig=="], + + "@electron/asar": ["@electron/asar@3.4.1", "https://registry.npmmirror.com/@electron/asar/-/asar-3.4.1.tgz", { "dependencies": { "commander": "^5.0.0", "glob": "^7.1.6", "minimatch": "^3.0.4" }, "bin": { "asar": "bin/asar.js" } }, "sha512-i4/rNPRS84t0vSRa2HorerGRXWyF4vThfHesw0dmcWHp+cspK743UanA0suA5Q5y8kzY2y6YKrvbIUn69BCAiA=="], + + "@electron/fuses": ["@electron/fuses@1.8.0", "https://registry.npmmirror.com/@electron/fuses/-/fuses-1.8.0.tgz", { "dependencies": { "chalk": "^4.1.1", "fs-extra": "^9.0.1", "minimist": "^1.2.5" }, "bin": { "electron-fuses": "dist/bin.js" } }, "sha512-zx0EIq78WlY/lBb1uXlziZmDZI4ubcCXIMJ4uGjXzZW0nS19TjSPeXPAjzzTmKQlJUZm0SbmZhPKP7tuQ1SsEw=="], + + "@electron/get": ["@electron/get@2.0.3", "https://registry.npmmirror.com/@electron/get/-/get-2.0.3.tgz", { "dependencies": { "debug": "^4.1.1", "env-paths": "^2.2.0", "fs-extra": "^8.1.0", "got": "^11.8.5", "progress": "^2.0.3", "semver": "^6.2.0", "sumchecker": "^3.0.1" }, "optionalDependencies": { "global-agent": "^3.0.0" } }, "sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ=="], + + "@electron/notarize": ["@electron/notarize@2.5.0", "https://registry.npmmirror.com/@electron/notarize/-/notarize-2.5.0.tgz", { "dependencies": { "debug": "^4.1.1", "fs-extra": "^9.0.1", "promise-retry": "^2.0.1" } }, "sha512-jNT8nwH1f9X5GEITXaQ8IF/KdskvIkOFfB2CvwumsveVidzpSc+mvhhTMdAGSYF3O+Nq49lJ7y+ssODRXu06+A=="], + + "@electron/osx-sign": ["@electron/osx-sign@1.3.3", "https://registry.npmmirror.com/@electron/osx-sign/-/osx-sign-1.3.3.tgz", { "dependencies": { "compare-version": "^0.1.2", "debug": "^4.3.4", "fs-extra": "^10.0.0", "isbinaryfile": "^4.0.8", "minimist": "^1.2.6", "plist": "^3.0.5" }, "bin": { "electron-osx-flat": "bin/electron-osx-flat.js", "electron-osx-sign": "bin/electron-osx-sign.js" } }, "sha512-KZ8mhXvWv2rIEgMbWZ4y33bDHyUKMXnx4M0sTyPNK/vcB81ImdeY9Ggdqy0SWbMDgmbqyQ+phgejh6V3R2QuSg=="], + + "@electron/rebuild": ["@electron/rebuild@4.0.1", "https://registry.npmmirror.com/@electron/rebuild/-/rebuild-4.0.1.tgz", { "dependencies": { "@malept/cross-spawn-promise": "^2.0.0", "chalk": "^4.0.0", "debug": "^4.1.1", "detect-libc": "^2.0.1", "got": "^11.7.0", "graceful-fs": "^4.2.11", "node-abi": "^4.2.0", "node-api-version": "^0.2.1", "node-gyp": "^11.2.0", "ora": "^5.1.0", "read-binary-file-arch": "^1.0.6", "semver": "^7.3.5", "tar": "^6.0.5", "yargs": "^17.0.1" }, "bin": { "electron-rebuild": "lib/cli.js" } }, "sha512-iMGXb6Ib7H/Q3v+BKZJoETgF9g6KMNZVbsO4b7Dmpgb5qTFqyFTzqW9F3TOSHdybv2vKYKzSS9OiZL+dcJb+1Q=="], + + "@electron/universal": ["@electron/universal@2.0.3", "https://registry.npmmirror.com/@electron/universal/-/universal-2.0.3.tgz", { "dependencies": { "@electron/asar": "^3.3.1", "@malept/cross-spawn-promise": "^2.0.0", "debug": "^4.3.1", "dir-compare": "^4.2.0", "fs-extra": "^11.1.1", "minimatch": "^9.0.3", "plist": "^3.1.0" } }, "sha512-Wn9sPYIVFRFl5HmwMJkARCCf7rqK/EurkfQ/rJZ14mHP3iYTjZSIOSVonEAnhWeAXwtw7zOekGRlc6yTtZ0t+g=="], + + "@electron/windows-sign": ["@electron/windows-sign@1.2.2", "https://registry.npmmirror.com/@electron/windows-sign/-/windows-sign-1.2.2.tgz", { "dependencies": { "cross-dirname": "^0.1.0", "debug": "^4.3.4", "fs-extra": "^11.1.1", "minimist": "^1.2.8", "postject": "^1.0.0-alpha.6" }, "bin": { "electron-windows-sign": "bin/electron-windows-sign.js" } }, "sha512-dfZeox66AvdPtb2lD8OsIIQh12Tp0GNCRUDfBHIKGpbmopZto2/A8nSpYYLoedPIHpqkeblZ/k8OV0Gy7PYuyQ=="], + + "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.2", "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz", { "os": "aix", "cpu": "ppc64" }, "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw=="], + + "@esbuild/android-arm": ["@esbuild/android-arm@0.27.2", "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.27.2.tgz", { "os": "android", "cpu": "arm" }, "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA=="], + + "@esbuild/android-arm64": ["@esbuild/android-arm64@0.27.2", "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz", { "os": "android", "cpu": "arm64" }, "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA=="], + + "@esbuild/android-x64": ["@esbuild/android-x64@0.27.2", "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.27.2.tgz", { "os": "android", "cpu": "x64" }, "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A=="], + + "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.27.2", "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz", { "os": "darwin", "cpu": "arm64" }, "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg=="], + + "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.27.2", "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz", { "os": "darwin", "cpu": "x64" }, "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA=="], + + "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.27.2", "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz", { "os": "freebsd", "cpu": "arm64" }, "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g=="], + + "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.27.2", "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz", { "os": "freebsd", "cpu": "x64" }, "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA=="], + + "@esbuild/linux-arm": ["@esbuild/linux-arm@0.27.2", "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz", { "os": "linux", "cpu": "arm" }, "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw=="], + + "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.27.2", "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz", { "os": "linux", "cpu": "arm64" }, "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw=="], + + "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.27.2", "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz", { "os": "linux", "cpu": "ia32" }, "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w=="], + + "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.27.2", "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz", { "os": "linux", "cpu": "none" }, "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg=="], + + "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.27.2", "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz", { "os": "linux", "cpu": "none" }, "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw=="], + + "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.27.2", "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz", { "os": "linux", "cpu": "ppc64" }, "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ=="], + + "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.27.2", "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz", { "os": "linux", "cpu": "none" }, "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA=="], + + "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.27.2", "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz", { "os": "linux", "cpu": "s390x" }, "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w=="], + + "@esbuild/linux-x64": ["@esbuild/linux-x64@0.27.2", "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz", { "os": "linux", "cpu": "x64" }, "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA=="], + + "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.27.2", "https://registry.npmmirror.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz", { "os": "none", "cpu": "arm64" }, "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw=="], + + "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.27.2", "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz", { "os": "none", "cpu": "x64" }, "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA=="], + + "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.27.2", "https://registry.npmmirror.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.2.tgz", { "os": "openbsd", "cpu": "arm64" }, "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA=="], + + "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.27.2", "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz", { "os": "openbsd", "cpu": "x64" }, "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg=="], + + "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.27.2", "https://registry.npmmirror.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.2.tgz", { "os": "none", "cpu": "arm64" }, "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag=="], + + "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.27.2", "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.27.2.tgz", { "os": "sunos", "cpu": "x64" }, "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg=="], + + "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.27.2", "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz", { "os": "win32", "cpu": "arm64" }, "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg=="], + + "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.27.2", "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz", { "os": "win32", "cpu": "ia32" }, "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ=="], + + "@esbuild/win32-x64": ["@esbuild/win32-x64@0.27.2", "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz", { "os": "win32", "cpu": "x64" }, "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ=="], + + "@hapi/accept": ["@hapi/accept@6.0.3", "https://registry.npmmirror.com/@hapi/accept/-/accept-6.0.3.tgz", { "dependencies": { "@hapi/boom": "^10.0.1", "@hapi/hoek": "^11.0.2" } }, "sha512-p72f9k56EuF0n3MwlBNThyVE5PXX40g+aQh+C/xbKrfzahM2Oispv3AXmOIU51t3j77zay1qrX7IIziZXspMlw=="], + + "@hapi/ammo": ["@hapi/ammo@6.0.1", "https://registry.npmmirror.com/@hapi/ammo/-/ammo-6.0.1.tgz", { "dependencies": { "@hapi/hoek": "^11.0.2" } }, "sha512-pmL+nPod4g58kXrMcsGLp05O2jF4P2Q3GiL8qYV7nKYEh3cGf+rV4P5Jyi2Uq0agGhVU63GtaSAfBEZOlrJn9w=="], + + "@hapi/b64": ["@hapi/b64@6.0.1", "https://registry.npmmirror.com/@hapi/b64/-/b64-6.0.1.tgz", { "dependencies": { "@hapi/hoek": "^11.0.2" } }, "sha512-ZvjX4JQReUmBheeCq+S9YavcnMMHWqx3S0jHNXWIM1kQDxB9cyfSycpVvjfrKcIS8Mh5N3hmu/YKo4Iag9g2Kw=="], + + "@hapi/boom": ["@hapi/boom@10.0.1", "https://registry.npmmirror.com/@hapi/boom/-/boom-10.0.1.tgz", { "dependencies": { "@hapi/hoek": "^11.0.2" } }, "sha512-ERcCZaEjdH3OgSJlyjVk8pHIFeus91CjKP3v+MpgBNp5IvGzP2l/bRiD78nqYcKPaZdbKkK5vDBVPd2ohHBlsA=="], + + "@hapi/bounce": ["@hapi/bounce@3.0.2", "https://registry.npmmirror.com/@hapi/bounce/-/bounce-3.0.2.tgz", { "dependencies": { "@hapi/boom": "^10.0.1", "@hapi/hoek": "^11.0.2" } }, "sha512-d0XmlTi3H9HFDHhQLjg4F4auL1EY3Wqj7j7/hGDhFFe6xAbnm3qiGrXeT93zZnPH8gH+SKAFYiRzu26xkXcH3g=="], + + "@hapi/bourne": ["@hapi/bourne@3.0.0", "https://registry.npmmirror.com/@hapi/bourne/-/bourne-3.0.0.tgz", {}, "sha512-Waj1cwPXJDucOib4a3bAISsKJVb15MKi9IvmTI/7ssVEm6sywXGjVJDhl6/umt1pK1ZS7PacXU3A1PmFKHEZ2w=="], + + "@hapi/call": ["@hapi/call@9.0.1", "https://registry.npmmirror.com/@hapi/call/-/call-9.0.1.tgz", { "dependencies": { "@hapi/boom": "^10.0.1", "@hapi/hoek": "^11.0.2" } }, "sha512-uPojQRqEL1GRZR4xXPqcLMujQGaEpyVPRyBlD8Pp5rqgIwLhtveF9PkixiKru2THXvuN8mUrLeet5fqxKAAMGg=="], + + "@hapi/catbox": ["@hapi/catbox@12.1.1", "https://registry.npmmirror.com/@hapi/catbox/-/catbox-12.1.1.tgz", { "dependencies": { "@hapi/boom": "^10.0.1", "@hapi/hoek": "^11.0.2", "@hapi/podium": "^5.0.0", "@hapi/validate": "^2.0.1" } }, "sha512-hDqYB1J+R0HtZg4iPH3LEnldoaBsar6bYp0EonBmNQ9t5CO+1CqgCul2ZtFveW1ReA5SQuze9GPSU7/aecERhw=="], + + "@hapi/catbox-memory": ["@hapi/catbox-memory@6.0.2", "https://registry.npmmirror.com/@hapi/catbox-memory/-/catbox-memory-6.0.2.tgz", { "dependencies": { "@hapi/boom": "^10.0.1", "@hapi/hoek": "^11.0.2" } }, "sha512-H1l4ugoFW/ZRkqeFrIo8p1rWN0PA4MDTfu4JmcoNDvnY975o29mqoZblqFTotxNHlEkMPpIiIBJTV+Mbi+aF0g=="], + + "@hapi/content": ["@hapi/content@6.0.0", "https://registry.npmmirror.com/@hapi/content/-/content-6.0.0.tgz", { "dependencies": { "@hapi/boom": "^10.0.0" } }, "sha512-CEhs7j+H0iQffKfe5Htdak5LBOz/Qc8TRh51cF+BFv0qnuph3Em4pjGVzJMkI2gfTDdlJKWJISGWS1rK34POGA=="], + + "@hapi/cryptiles": ["@hapi/cryptiles@6.0.3", "https://registry.npmmirror.com/@hapi/cryptiles/-/cryptiles-6.0.3.tgz", { "dependencies": { "@hapi/boom": "^10.0.1" } }, "sha512-r6VKalpbMHz4ci3gFjFysBmhwCg70RpYZy6OkjEpdXzAYnYFX5XsW7n4YMJvuIYpnMwLxGUjK/cBhA7X3JDvXw=="], + + "@hapi/file": ["@hapi/file@3.0.0", "https://registry.npmmirror.com/@hapi/file/-/file-3.0.0.tgz", {}, "sha512-w+lKW+yRrLhJu620jT3y+5g2mHqnKfepreykvdOcl9/6up8GrQQn+l3FRTsjHTKbkbfQFkuksHpdv2EcpKcJ4Q=="], + + "@hapi/hapi": ["@hapi/hapi@21.4.4", "https://registry.npmmirror.com/@hapi/hapi/-/hapi-21.4.4.tgz", { "dependencies": { "@hapi/accept": "^6.0.3", "@hapi/ammo": "^6.0.1", "@hapi/boom": "^10.0.1", "@hapi/bounce": "^3.0.2", "@hapi/call": "^9.0.1", "@hapi/catbox": "^12.1.1", "@hapi/catbox-memory": "^6.0.2", "@hapi/heavy": "^8.0.1", "@hapi/hoek": "^11.0.7", "@hapi/mimos": "^7.0.1", "@hapi/podium": "^5.0.2", "@hapi/shot": "^6.0.2", "@hapi/somever": "^4.1.1", "@hapi/statehood": "^8.2.1", "@hapi/subtext": "^8.1.1", "@hapi/teamwork": "^6.0.1", "@hapi/topo": "^6.0.2", "@hapi/validate": "^2.0.1" } }, "sha512-vI6JPLR99WZDKI1nriD0qXDPp8sKFkZfNVGrDDZafDQ8jU+3ERMwS0vPac5aGae6yyyoGZGOBiYExw4N8ScSTQ=="], + + "@hapi/heavy": ["@hapi/heavy@8.0.1", "https://registry.npmmirror.com/@hapi/heavy/-/heavy-8.0.1.tgz", { "dependencies": { "@hapi/boom": "^10.0.1", "@hapi/hoek": "^11.0.2", "@hapi/validate": "^2.0.1" } }, "sha512-gBD/NANosNCOp6RsYTsjo2vhr5eYA3BEuogk6cxY0QdhllkkTaJFYtTXv46xd6qhBVMbMMqcSdtqey+UQU3//w=="], + + "@hapi/hoek": ["@hapi/hoek@11.0.7", "https://registry.npmmirror.com/@hapi/hoek/-/hoek-11.0.7.tgz", {}, "sha512-HV5undWkKzcB4RZUusqOpcgxOaq6VOAH7zhhIr2g3G8NF/MlFO75SjOr2NfuSx0Mh40+1FqCkagKLJRykUWoFQ=="], + + "@hapi/iron": ["@hapi/iron@7.0.1", "https://registry.npmmirror.com/@hapi/iron/-/iron-7.0.1.tgz", { "dependencies": { "@hapi/b64": "^6.0.1", "@hapi/boom": "^10.0.1", "@hapi/bourne": "^3.0.0", "@hapi/cryptiles": "^6.0.1", "@hapi/hoek": "^11.0.2" } }, "sha512-tEZnrOujKpS6jLKliyWBl3A9PaE+ppuL/+gkbyPPDb/l2KSKQyH4lhMkVb+sBhwN+qaxxlig01JRqB8dk/mPxQ=="], + + "@hapi/mimos": ["@hapi/mimos@7.0.1", "https://registry.npmmirror.com/@hapi/mimos/-/mimos-7.0.1.tgz", { "dependencies": { "@hapi/hoek": "^11.0.2", "mime-db": "^1.52.0" } }, "sha512-b79V+BrG0gJ9zcRx1VGcCI6r6GEzzZUgiGEJVoq5gwzuB2Ig9Cax8dUuBauQCFKvl2YWSWyOc8mZ8HDaJOtkew=="], + + "@hapi/nigel": ["@hapi/nigel@5.0.1", "https://registry.npmmirror.com/@hapi/nigel/-/nigel-5.0.1.tgz", { "dependencies": { "@hapi/hoek": "^11.0.2", "@hapi/vise": "^5.0.1" } }, "sha512-uv3dtYuB4IsNaha+tigWmN8mQw/O9Qzl5U26Gm4ZcJVtDdB1AVJOwX3X5wOX+A07qzpEZnOMBAm8jjSqGsU6Nw=="], + + "@hapi/pez": ["@hapi/pez@6.1.0", "https://registry.npmmirror.com/@hapi/pez/-/pez-6.1.0.tgz", { "dependencies": { "@hapi/b64": "^6.0.1", "@hapi/boom": "^10.0.1", "@hapi/content": "^6.0.0", "@hapi/hoek": "^11.0.2", "@hapi/nigel": "^5.0.1" } }, "sha512-+FE3sFPYuXCpuVeHQ/Qag1b45clR2o54QoonE/gKHv9gukxQ8oJJZPR7o3/ydDTK6racnCJXxOyT1T93FCJMIg=="], + + "@hapi/podium": ["@hapi/podium@5.0.2", "https://registry.npmmirror.com/@hapi/podium/-/podium-5.0.2.tgz", { "dependencies": { "@hapi/hoek": "^11.0.2", "@hapi/teamwork": "^6.0.0", "@hapi/validate": "^2.0.1" } }, "sha512-T7gf2JYHQQfEfewTQFbsaXoZxSvuXO/QBIGljucUQ/lmPnTTNAepoIKOakWNVWvo2fMEDjycu77r8k6dhreqHA=="], + + "@hapi/shot": ["@hapi/shot@6.0.2", "https://registry.npmmirror.com/@hapi/shot/-/shot-6.0.2.tgz", { "dependencies": { "@hapi/hoek": "^11.0.2", "@hapi/validate": "^2.0.1" } }, "sha512-WKK1ShfJTrL1oXC0skoIZQYzvLsyMDEF8lfcWuQBjpjCN29qivr9U36ld1z0nt6edvzv28etNMOqUF4klnHryw=="], + + "@hapi/somever": ["@hapi/somever@4.1.1", "https://registry.npmmirror.com/@hapi/somever/-/somever-4.1.1.tgz", { "dependencies": { "@hapi/bounce": "^3.0.1", "@hapi/hoek": "^11.0.2" } }, "sha512-lt3QQiDDOVRatS0ionFDNrDIv4eXz58IibQaZQDOg4DqqdNme8oa0iPWcE0+hkq/KTeBCPtEOjDOBKBKwDumVg=="], + + "@hapi/statehood": ["@hapi/statehood@8.2.1", "https://registry.npmmirror.com/@hapi/statehood/-/statehood-8.2.1.tgz", { "dependencies": { "@hapi/boom": "^10.0.1", "@hapi/bounce": "^3.0.1", "@hapi/bourne": "^3.0.0", "@hapi/cryptiles": "^6.0.1", "@hapi/hoek": "^11.0.2", "@hapi/iron": "^7.0.1", "@hapi/validate": "^2.0.1" } }, "sha512-xf72TG/QINW26jUu+uL5H+crE1o8GplIgfPWwPZhnAGJzetIVAQEQYvzq+C0aEVHg5/lMMtQ+L9UryuSa5Yjkg=="], + + "@hapi/subtext": ["@hapi/subtext@8.1.1", "https://registry.npmmirror.com/@hapi/subtext/-/subtext-8.1.1.tgz", { "dependencies": { "@hapi/boom": "^10.0.1", "@hapi/bourne": "^3.0.0", "@hapi/content": "^6.0.0", "@hapi/file": "^3.0.0", "@hapi/hoek": "^11.0.2", "@hapi/pez": "^6.1.0", "@hapi/wreck": "^18.0.1" } }, "sha512-ex1Y2s/KuJktS8Ww0k6XJ5ysSKrzNym4i5pDVuCwlSgHHviHUsT1JNzE6FYhNU9TTHSNdyfue/t2m89bpkX9Jw=="], + + "@hapi/teamwork": ["@hapi/teamwork@6.0.1", "https://registry.npmmirror.com/@hapi/teamwork/-/teamwork-6.0.1.tgz", {}, "sha512-52OXRslUfYwXAOG8k58f2h2ngXYQGP0x5RPOo+eWA/FtyLgHjGMrE3+e9LSXP/0q2YfHAK5wj9aA9DTy1K+kyQ=="], + + "@hapi/topo": ["@hapi/topo@6.0.2", "https://registry.npmmirror.com/@hapi/topo/-/topo-6.0.2.tgz", { "dependencies": { "@hapi/hoek": "^11.0.2" } }, "sha512-KR3rD5inZbGMrHmgPxsJ9dbi6zEK+C3ZwUwTa+eMwWLz7oijWUTWD2pMSNNYJAU6Qq+65NkxXjqHr/7LM2Xkqg=="], + + "@hapi/validate": ["@hapi/validate@2.0.1", "https://registry.npmmirror.com/@hapi/validate/-/validate-2.0.1.tgz", { "dependencies": { "@hapi/hoek": "^11.0.2", "@hapi/topo": "^6.0.1" } }, "sha512-NZmXRnrSLK8MQ9y/CMqE9WSspgB9xA41/LlYR0k967aSZebWr4yNrpxIbov12ICwKy4APSlWXZga9jN5p6puPA=="], + + "@hapi/vise": ["@hapi/vise@5.0.1", "https://registry.npmmirror.com/@hapi/vise/-/vise-5.0.1.tgz", { "dependencies": { "@hapi/hoek": "^11.0.2" } }, "sha512-XZYWzzRtINQLedPYlIkSkUr7m5Ddwlu99V9elh8CSygXstfv3UnWIXT0QD+wmR0VAG34d2Vx3olqcEhRRoTu9A=="], + + "@hapi/wreck": ["@hapi/wreck@18.1.0", "https://registry.npmmirror.com/@hapi/wreck/-/wreck-18.1.0.tgz", { "dependencies": { "@hapi/boom": "^10.0.1", "@hapi/bourne": "^3.0.0", "@hapi/hoek": "^11.0.2" } }, "sha512-0z6ZRCmFEfV/MQqkQomJ7sl/hyxvcZM7LtuVqN3vdAO4vM9eBbowl0kaqQj9EJJQab+3Uuh1GxbGIBFy4NfJ4w=="], + + "@isaacs/balanced-match": ["@isaacs/balanced-match@4.0.1", "https://registry.npmmirror.com/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", {}, "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ=="], + + "@isaacs/brace-expansion": ["@isaacs/brace-expansion@5.0.0", "https://registry.npmmirror.com/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", { "dependencies": { "@isaacs/balanced-match": "^4.0.1" } }, "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA=="], + + "@isaacs/cliui": ["@isaacs/cliui@8.0.2", "https://registry.npmmirror.com/@isaacs/cliui/-/cliui-8.0.2.tgz", { "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", "strip-ansi": "^7.0.1", "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" } }, "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="], + + "@isaacs/fs-minipass": ["@isaacs/fs-minipass@4.0.1", "https://registry.npmmirror.com/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", { "dependencies": { "minipass": "^7.0.4" } }, "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w=="], + + "@malept/cross-spawn-promise": ["@malept/cross-spawn-promise@2.0.0", "https://registry.npmmirror.com/@malept/cross-spawn-promise/-/cross-spawn-promise-2.0.0.tgz", { "dependencies": { "cross-spawn": "^7.0.1" } }, "sha512-1DpKU0Z5ThltBwjNySMC14g0CkbyhCaz9FkhxqNsZI6uAPJXFS8cMXlBKo26FJ8ZuW6S9GCMcR9IO5k2X5/9Fg=="], + + "@malept/flatpak-bundler": ["@malept/flatpak-bundler@0.4.0", "https://registry.npmmirror.com/@malept/flatpak-bundler/-/flatpak-bundler-0.4.0.tgz", { "dependencies": { "debug": "^4.1.1", "fs-extra": "^9.0.0", "lodash": "^4.17.15", "tmp-promise": "^3.0.2" } }, "sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q=="], + + "@npmcli/agent": ["@npmcli/agent@3.0.0", "https://registry.npmmirror.com/@npmcli/agent/-/agent-3.0.0.tgz", { "dependencies": { "agent-base": "^7.1.0", "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.1", "lru-cache": "^10.0.1", "socks-proxy-agent": "^8.0.3" } }, "sha512-S79NdEgDQd/NGCay6TCoVzXSj74skRZIKJcpJjC5lOq34SZzyI6MqtiiWoiVWoVrTcGjNeC4ipbh1VIHlpfF5Q=="], + + "@npmcli/fs": ["@npmcli/fs@4.0.0", "https://registry.npmmirror.com/@npmcli/fs/-/fs-4.0.0.tgz", { "dependencies": { "semver": "^7.3.5" } }, "sha512-/xGlezI6xfGO9NwuJlnwz/K14qD1kCSAGtacBHnGzeAIuJGazcp45KP5NuyARXoKb7cwulAGWVsbeSxdG/cb0Q=="], + + "@pkgjs/parseargs": ["@pkgjs/parseargs@0.11.0", "https://registry.npmmirror.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", {}, "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg=="], + + "@scarf/scarf": ["@scarf/scarf@1.4.0", "https://registry.npmmirror.com/@scarf/scarf/-/scarf-1.4.0.tgz", {}, "sha512-xxeapPiUXdZAE3che6f3xogoJPeZgig6omHEy1rIY5WVsB3H2BHNnZH+gHG6x91SCWyQCzWGsuL2Hh3ClO5/qQ=="], + + "@sindresorhus/is": ["@sindresorhus/is@4.6.0", "https://registry.npmmirror.com/@sindresorhus/is/-/is-4.6.0.tgz", {}, "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw=="], + + "@szmarczak/http-timer": ["@szmarczak/http-timer@4.0.6", "https://registry.npmmirror.com/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", { "dependencies": { "defer-to-connect": "^2.0.0" } }, "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w=="], + + "@tsoa/cli": ["@tsoa/cli@7.0.0-alpha.0", "https://registry.npmmirror.com/@tsoa/cli/-/cli-7.0.0-alpha.0.tgz", { "dependencies": { "@tsoa/runtime": "^7.0.0-alpha.0", "@types/multer": "^1.4.12", "fs-extra": "^11.2.0", "glob": "^10.3.10", "handlebars": "^4.7.8", "merge-anything": "^5.1.7", "minimatch": "^9.0.1", "ts-deepmerge": "^7.0.2", "typescript": "^5.7.2", "validator": "^13.12.0", "yaml": "^2.6.1", "yargs": "^17.7.1" }, "bin": { "tsoa": "dist/cli.js" } }, "sha512-fCBWv6F20qrpwFh5X+vaZs38Bh/5cVwKPhvG/uArR+crZgEowyNl76unLCmYdvycES9Y6g/TKFLagG8qojSNuQ=="], + + "@tsoa/runtime": ["@tsoa/runtime@7.0.0-alpha.0", "https://registry.npmmirror.com/@tsoa/runtime/-/runtime-7.0.0-alpha.0.tgz", { "dependencies": { "@hapi/boom": "^10.0.1", "@hapi/hapi": "^21.3.12", "@types/koa": "^2.15.0", "@types/multer": "^1.4.12", "express": "^4.21.2", "reflect-metadata": "^0.2.2", "validator": "^13.12.0" } }, "sha512-zlWYz2bLfaN6WtFoIbLBEAyVhKG4IQKJ9QPzeRFFKeAsh5zYN4/ocnd14XyWs4ehY9TdtTnma2drW89aYNSRYw=="], + + "@types/accepts": ["@types/accepts@1.3.7", "https://registry.npmmirror.com/@types/accepts/-/accepts-1.3.7.tgz", { "dependencies": { "@types/node": "*" } }, "sha512-Pay9fq2lM2wXPWbteBsRAGiWH2hig4ZE2asK+mm7kUzlxRTfL961rj89I6zV/E3PcIkDqyuBEcMxFT7rccugeQ=="], + + "@types/body-parser": ["@types/body-parser@1.19.6", "https://registry.npmmirror.com/@types/body-parser/-/body-parser-1.19.6.tgz", { "dependencies": { "@types/connect": "*", "@types/node": "*" } }, "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g=="], + + "@types/bun": ["@types/bun@1.3.5", "", { "dependencies": { "bun-types": "1.3.5" } }, "sha512-RnygCqNrd3srIPEWBd5LFeUYG7plCoH2Yw9WaZGyNmdTEei+gWaHqydbaIRkIkcbXwhBT94q78QljxN0Sk838w=="], + + "@types/cacheable-request": ["@types/cacheable-request@6.0.3", "https://registry.npmmirror.com/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", { "dependencies": { "@types/http-cache-semantics": "*", "@types/keyv": "^3.1.4", "@types/node": "*", "@types/responselike": "^1.0.0" } }, "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw=="], + + "@types/connect": ["@types/connect@3.4.38", "https://registry.npmmirror.com/@types/connect/-/connect-3.4.38.tgz", { "dependencies": { "@types/node": "*" } }, "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug=="], + + "@types/content-disposition": ["@types/content-disposition@0.5.9", "https://registry.npmmirror.com/@types/content-disposition/-/content-disposition-0.5.9.tgz", {}, "sha512-8uYXI3Gw35MhiVYhG3s295oihrxRyytcRHjSjqnqZVDDy/xcGBRny7+Xj1Wgfhv5QzRtN2hB2dVRBUX9XW3UcQ=="], + + "@types/cookies": ["@types/cookies@0.9.2", "https://registry.npmmirror.com/@types/cookies/-/cookies-0.9.2.tgz", { "dependencies": { "@types/connect": "*", "@types/express": "*", "@types/keygrip": "*", "@types/node": "*" } }, "sha512-1AvkDdZM2dbyFybL4fxpuNCaWyv//0AwsuUk2DWeXyM1/5ZKm6W3z6mQi24RZ4l2ucY+bkSHzbDVpySqPGuV8A=="], + + "@types/debug": ["@types/debug@4.1.12", "https://registry.npmmirror.com/@types/debug/-/debug-4.1.12.tgz", { "dependencies": { "@types/ms": "*" } }, "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ=="], + + "@types/express": ["@types/express@5.0.6", "https://registry.npmmirror.com/@types/express/-/express-5.0.6.tgz", { "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^5.0.0", "@types/serve-static": "^2" } }, "sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA=="], + + "@types/express-serve-static-core": ["@types/express-serve-static-core@5.1.0", "https://registry.npmmirror.com/@types/express-serve-static-core/-/express-serve-static-core-5.1.0.tgz", { "dependencies": { "@types/node": "*", "@types/qs": "*", "@types/range-parser": "*", "@types/send": "*" } }, "sha512-jnHMsrd0Mwa9Cf4IdOzbz543y4XJepXrbia2T4b6+spXC2We3t1y6K44D3mR8XMFSXMCf3/l7rCgddfx7UNVBA=="], + + "@types/fs-extra": ["@types/fs-extra@9.0.13", "https://registry.npmmirror.com/@types/fs-extra/-/fs-extra-9.0.13.tgz", { "dependencies": { "@types/node": "*" } }, "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA=="], + + "@types/http-assert": ["@types/http-assert@1.5.6", "https://registry.npmmirror.com/@types/http-assert/-/http-assert-1.5.6.tgz", {}, "sha512-TTEwmtjgVbYAzZYWyeHPrrtWnfVkm8tQkP8P21uQifPgMRgjrow3XDEYqucuC8SKZJT7pUnhU/JymvjggxO9vw=="], + + "@types/http-cache-semantics": ["@types/http-cache-semantics@4.0.4", "https://registry.npmmirror.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", {}, "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA=="], + + "@types/http-errors": ["@types/http-errors@2.0.5", "https://registry.npmmirror.com/@types/http-errors/-/http-errors-2.0.5.tgz", {}, "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg=="], + + "@types/keygrip": ["@types/keygrip@1.0.6", "https://registry.npmmirror.com/@types/keygrip/-/keygrip-1.0.6.tgz", {}, "sha512-lZuNAY9xeJt7Bx4t4dx0rYCDqGPW8RXhQZK1td7d4H6E9zYbLoOtjBvfwdTKpsyxQI/2jv+armjX/RW+ZNpXOQ=="], + + "@types/keyv": ["@types/keyv@3.1.4", "https://registry.npmmirror.com/@types/keyv/-/keyv-3.1.4.tgz", { "dependencies": { "@types/node": "*" } }, "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg=="], + + "@types/koa": ["@types/koa@2.15.0", "https://registry.npmmirror.com/@types/koa/-/koa-2.15.0.tgz", { "dependencies": { "@types/accepts": "*", "@types/content-disposition": "*", "@types/cookies": "*", "@types/http-assert": "*", "@types/http-errors": "*", "@types/keygrip": "*", "@types/koa-compose": "*", "@types/node": "*" } }, "sha512-7QFsywoE5URbuVnG3loe03QXuGajrnotr3gQkXcEBShORai23MePfFYdhz90FEtBBpkyIYQbVD+evKtloCgX3g=="], + + "@types/koa-compose": ["@types/koa-compose@3.2.9", "https://registry.npmmirror.com/@types/koa-compose/-/koa-compose-3.2.9.tgz", { "dependencies": { "@types/koa": "*" } }, "sha512-BroAZ9FTvPiCy0Pi8tjD1OfJ7bgU1gQf0eR6e1Vm+JJATy9eKOG3hQMFtMciMawiSOVnLMdmUOC46s7HBhSTsA=="], + + "@types/ms": ["@types/ms@2.1.0", "https://registry.npmmirror.com/@types/ms/-/ms-2.1.0.tgz", {}, "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA=="], + + "@types/multer": ["@types/multer@1.4.13", "https://registry.npmmirror.com/@types/multer/-/multer-1.4.13.tgz", { "dependencies": { "@types/express": "*" } }, "sha512-bhhdtPw7JqCiEfC9Jimx5LqX9BDIPJEh2q/fQ4bqbBPtyEZYr3cvF22NwG0DmPZNYA0CAf2CnqDB4KIGGpJcaw=="], + + "@types/node": ["@types/node@25.0.3", "https://registry.npmmirror.com/@types/node/-/node-25.0.3.tgz", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-W609buLVRVmeW693xKfzHeIV6nJGGz98uCPfeXI1ELMLXVeKYZ9m15fAMSaUPBHYLGFsVRcMmSCksQOrZV9BYA=="], + + "@types/plist": ["@types/plist@3.0.5", "https://registry.npmmirror.com/@types/plist/-/plist-3.0.5.tgz", { "dependencies": { "@types/node": "*", "xmlbuilder": ">=11.0.1" } }, "sha512-E6OCaRmAe4WDmWNsL/9RMqdkkzDCY1etutkflWk4c+AcjDU07Pcz1fQwTX0TQz+Pxqn9i4L1TU3UFpjnrcDgxA=="], + + "@types/qs": ["@types/qs@6.14.0", "https://registry.npmmirror.com/@types/qs/-/qs-6.14.0.tgz", {}, "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ=="], + + "@types/range-parser": ["@types/range-parser@1.2.7", "https://registry.npmmirror.com/@types/range-parser/-/range-parser-1.2.7.tgz", {}, "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ=="], + + "@types/responselike": ["@types/responselike@1.0.3", "https://registry.npmmirror.com/@types/responselike/-/responselike-1.0.3.tgz", { "dependencies": { "@types/node": "*" } }, "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw=="], + + "@types/send": ["@types/send@1.2.1", "https://registry.npmmirror.com/@types/send/-/send-1.2.1.tgz", { "dependencies": { "@types/node": "*" } }, "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ=="], + + "@types/serve-static": ["@types/serve-static@2.2.0", "https://registry.npmmirror.com/@types/serve-static/-/serve-static-2.2.0.tgz", { "dependencies": { "@types/http-errors": "*", "@types/node": "*" } }, "sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ=="], + + "@types/swagger-ui-express": ["@types/swagger-ui-express@4.1.8", "https://registry.npmmirror.com/@types/swagger-ui-express/-/swagger-ui-express-4.1.8.tgz", { "dependencies": { "@types/express": "*", "@types/serve-static": "*" } }, "sha512-AhZV8/EIreHFmBV5wAs0gzJUNq9JbbSXgJLQubCC0jtIo6prnI9MIRRxnU4MZX9RB9yXxF1V4R7jtLl/Wcj31g=="], + + "@types/verror": ["@types/verror@1.10.11", "https://registry.npmmirror.com/@types/verror/-/verror-1.10.11.tgz", {}, "sha512-RlDm9K7+o5stv0Co8i8ZRGxDbrTxhJtgjqjFyVh/tXQyl/rYtTKlnTvZ88oSTeYREWurwx20Js4kTuKCsFkUtg=="], + + "@types/yauzl": ["@types/yauzl@2.10.3", "https://registry.npmmirror.com/@types/yauzl/-/yauzl-2.10.3.tgz", { "dependencies": { "@types/node": "*" } }, "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q=="], + + "@xmldom/xmldom": ["@xmldom/xmldom@0.8.11", "https://registry.npmmirror.com/@xmldom/xmldom/-/xmldom-0.8.11.tgz", {}, "sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw=="], + + "abbrev": ["abbrev@3.0.1", "https://registry.npmmirror.com/abbrev/-/abbrev-3.0.1.tgz", {}, "sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg=="], + + "accepts": ["accepts@2.0.0", "https://registry.npmmirror.com/accepts/-/accepts-2.0.0.tgz", { "dependencies": { "mime-types": "^3.0.0", "negotiator": "^1.0.0" } }, "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng=="], + + "agent-base": ["agent-base@7.1.4", "https://registry.npmmirror.com/agent-base/-/agent-base-7.1.4.tgz", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="], + + "ajv": ["ajv@6.12.6", "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], + + "ajv-keywords": ["ajv-keywords@3.5.2", "https://registry.npmmirror.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz", { "peerDependencies": { "ajv": "^6.9.1" } }, "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ=="], + + "ansi-regex": ["ansi-regex@5.0.1", "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "ansi-styles": ["ansi-styles@4.3.0", "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "app-builder-bin": ["app-builder-bin@5.0.0-alpha.12", "https://registry.npmmirror.com/app-builder-bin/-/app-builder-bin-5.0.0-alpha.12.tgz", {}, "sha512-j87o0j6LqPL3QRr8yid6c+Tt5gC7xNfYo6uQIQkorAC6MpeayVMZrEDzKmJJ/Hlv7EnOQpaRm53k6ktDYZyB6w=="], + + "app-builder-lib": ["app-builder-lib@26.4.0", "https://registry.npmmirror.com/app-builder-lib/-/app-builder-lib-26.4.0.tgz", { "dependencies": { "@develar/schema-utils": "~2.6.5", "@electron/asar": "3.4.1", "@electron/fuses": "^1.8.0", "@electron/notarize": "2.5.0", "@electron/osx-sign": "1.3.3", "@electron/rebuild": "4.0.1", "@electron/universal": "2.0.3", "@malept/flatpak-bundler": "^0.4.0", "@types/fs-extra": "9.0.13", "async-exit-hook": "^2.0.1", "builder-util": "26.3.4", "builder-util-runtime": "9.5.1", "chromium-pickle-js": "^0.2.0", "ci-info": "4.3.1", "debug": "^4.3.4", "dotenv": "^16.4.5", "dotenv-expand": "^11.0.6", "ejs": "^3.1.8", "electron-publish": "26.3.4", "fs-extra": "^10.1.0", "hosted-git-info": "^4.1.0", "isbinaryfile": "^5.0.0", "jiti": "^2.4.2", "js-yaml": "^4.1.0", "json5": "^2.2.3", "lazy-val": "^1.0.5", "minimatch": "^10.0.3", "plist": "3.1.0", "resedit": "^1.7.0", "semver": "~7.7.3", "tar": "^6.1.12", "temp-file": "^3.4.0", "tiny-async-pool": "1.3.0", "which": "^5.0.0" }, "peerDependencies": { "dmg-builder": "26.4.0", "electron-builder-squirrel-windows": "26.4.0" } }, "sha512-Uas6hNe99KzP3xPWxh5LGlH8kWIVjZixzmMJHNB9+6hPyDpjc7NQMkVgi16rQDdpCFy22ZU5sp8ow7tvjeMgYQ=="], + + "argparse": ["argparse@2.0.1", "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], + + "array-flatten": ["array-flatten@1.1.1", "https://registry.npmmirror.com/array-flatten/-/array-flatten-1.1.1.tgz", {}, "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="], + + "assert-plus": ["assert-plus@1.0.0", "https://registry.npmmirror.com/assert-plus/-/assert-plus-1.0.0.tgz", {}, "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw=="], + + "astral-regex": ["astral-regex@2.0.0", "https://registry.npmmirror.com/astral-regex/-/astral-regex-2.0.0.tgz", {}, "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ=="], + + "async": ["async@3.2.6", "https://registry.npmmirror.com/async/-/async-3.2.6.tgz", {}, "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA=="], + + "async-exit-hook": ["async-exit-hook@2.0.1", "https://registry.npmmirror.com/async-exit-hook/-/async-exit-hook-2.0.1.tgz", {}, "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw=="], + + "asynckit": ["asynckit@0.4.0", "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz", {}, "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="], + + "at-least-node": ["at-least-node@1.0.0", "https://registry.npmmirror.com/at-least-node/-/at-least-node-1.0.0.tgz", {}, "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg=="], + + "balanced-match": ["balanced-match@1.0.2", "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + + "base64-js": ["base64-js@1.5.1", "https://registry.npmmirror.com/base64-js/-/base64-js-1.5.1.tgz", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="], + + "bl": ["bl@4.1.0", "https://registry.npmmirror.com/bl/-/bl-4.1.0.tgz", { "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", "readable-stream": "^3.4.0" } }, "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w=="], + + "body-parser": ["body-parser@2.2.2", "https://registry.npmmirror.com/body-parser/-/body-parser-2.2.2.tgz", { "dependencies": { "bytes": "^3.1.2", "content-type": "^1.0.5", "debug": "^4.4.3", "http-errors": "^2.0.0", "iconv-lite": "^0.7.0", "on-finished": "^2.4.1", "qs": "^6.14.1", "raw-body": "^3.0.1", "type-is": "^2.0.1" } }, "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA=="], + + "boolean": ["boolean@3.2.0", "https://registry.npmmirror.com/boolean/-/boolean-3.2.0.tgz", {}, "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw=="], + + "brace-expansion": ["brace-expansion@2.0.2", "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.2.tgz", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], + + "buffer": ["buffer@5.7.1", "https://registry.npmmirror.com/buffer/-/buffer-5.7.1.tgz", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" } }, "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ=="], + + "buffer-crc32": ["buffer-crc32@0.2.13", "https://registry.npmmirror.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz", {}, "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ=="], + + "buffer-from": ["buffer-from@1.1.2", "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz", {}, "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="], + + "builder-util": ["builder-util@26.3.4", "https://registry.npmmirror.com/builder-util/-/builder-util-26.3.4.tgz", { "dependencies": { "7zip-bin": "~5.2.0", "@types/debug": "^4.1.6", "app-builder-bin": "5.0.0-alpha.12", "builder-util-runtime": "9.5.1", "chalk": "^4.1.2", "cross-spawn": "^7.0.6", "debug": "^4.3.4", "fs-extra": "^10.1.0", "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.0", "js-yaml": "^4.1.0", "sanitize-filename": "^1.6.3", "source-map-support": "^0.5.19", "stat-mode": "^1.0.0", "temp-file": "^3.4.0", "tiny-async-pool": "1.3.0" } }, "sha512-aRn88mYMktHxzdqDMF6Ayj0rKoX+ZogJ75Ck7RrIqbY/ad0HBvnS2xA4uHfzrGr5D2aLL3vU6OBEH4p0KMV2XQ=="], + + "builder-util-runtime": ["builder-util-runtime@9.5.1", "https://registry.npmmirror.com/builder-util-runtime/-/builder-util-runtime-9.5.1.tgz", { "dependencies": { "debug": "^4.3.4", "sax": "^1.2.4" } }, "sha512-qt41tMfgHTllhResqM5DcnHyDIWNgzHvuY2jDcYP9iaGpkWxTUzV6GQjDeLnlR1/DtdlcsWQbA7sByMpmJFTLQ=="], + + "bun-types": ["bun-types@1.3.5", "", { "dependencies": { "@types/node": "*" } }, "sha512-inmAYe2PFLs0SUbFOWSVD24sg1jFlMPxOjOSSCYqUgn4Hsc3rDc7dFvfVYjFPNHtov6kgUeulV4SxbuIV/stPw=="], + + "bytes": ["bytes@3.1.2", "https://registry.npmmirror.com/bytes/-/bytes-3.1.2.tgz", {}, "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="], + + "cacache": ["cacache@19.0.1", "https://registry.npmmirror.com/cacache/-/cacache-19.0.1.tgz", { "dependencies": { "@npmcli/fs": "^4.0.0", "fs-minipass": "^3.0.0", "glob": "^10.2.2", "lru-cache": "^10.0.1", "minipass": "^7.0.3", "minipass-collect": "^2.0.1", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "p-map": "^7.0.2", "ssri": "^12.0.0", "tar": "^7.4.3", "unique-filename": "^4.0.0" } }, "sha512-hdsUxulXCi5STId78vRVYEtDAjq99ICAUktLTeTYsLoTE6Z8dS0c8pWNCxwdrk9YfJeobDZc2Y186hD/5ZQgFQ=="], + + "cacheable-lookup": ["cacheable-lookup@5.0.4", "https://registry.npmmirror.com/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", {}, "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA=="], + + "cacheable-request": ["cacheable-request@7.0.4", "https://registry.npmmirror.com/cacheable-request/-/cacheable-request-7.0.4.tgz", { "dependencies": { "clone-response": "^1.0.2", "get-stream": "^5.1.0", "http-cache-semantics": "^4.0.0", "keyv": "^4.0.0", "lowercase-keys": "^2.0.0", "normalize-url": "^6.0.1", "responselike": "^2.0.0" } }, "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg=="], + + "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "https://registry.npmmirror.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="], + + "call-bound": ["call-bound@1.0.4", "https://registry.npmmirror.com/call-bound/-/call-bound-1.0.4.tgz", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], + + "chalk": ["chalk@4.1.2", "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "chownr": ["chownr@2.0.0", "https://registry.npmmirror.com/chownr/-/chownr-2.0.0.tgz", {}, "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ=="], + + "chromium-pickle-js": ["chromium-pickle-js@0.2.0", "https://registry.npmmirror.com/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz", {}, "sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw=="], + + "ci-info": ["ci-info@4.3.1", "https://registry.npmmirror.com/ci-info/-/ci-info-4.3.1.tgz", {}, "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA=="], + + "cli-cursor": ["cli-cursor@3.1.0", "https://registry.npmmirror.com/cli-cursor/-/cli-cursor-3.1.0.tgz", { "dependencies": { "restore-cursor": "^3.1.0" } }, "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw=="], + + "cli-spinners": ["cli-spinners@2.9.2", "https://registry.npmmirror.com/cli-spinners/-/cli-spinners-2.9.2.tgz", {}, "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg=="], + + "cli-truncate": ["cli-truncate@2.1.0", "https://registry.npmmirror.com/cli-truncate/-/cli-truncate-2.1.0.tgz", { "dependencies": { "slice-ansi": "^3.0.0", "string-width": "^4.2.0" } }, "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg=="], + + "cliui": ["cliui@8.0.1", "https://registry.npmmirror.com/cliui/-/cliui-8.0.1.tgz", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], + + "clone": ["clone@1.0.4", "https://registry.npmmirror.com/clone/-/clone-1.0.4.tgz", {}, "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg=="], + + "clone-response": ["clone-response@1.0.3", "https://registry.npmmirror.com/clone-response/-/clone-response-1.0.3.tgz", { "dependencies": { "mimic-response": "^1.0.0" } }, "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA=="], + + "color-convert": ["color-convert@2.0.1", "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "color-name": ["color-name@1.1.4", "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "combined-stream": ["combined-stream@1.0.8", "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz", { "dependencies": { "delayed-stream": "~1.0.0" } }, "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg=="], + + "commander": ["commander@5.1.0", "https://registry.npmmirror.com/commander/-/commander-5.1.0.tgz", {}, "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg=="], + + "compare-version": ["compare-version@0.1.2", "https://registry.npmmirror.com/compare-version/-/compare-version-0.1.2.tgz", {}, "sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A=="], + + "concat-map": ["concat-map@0.0.1", "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], + + "content-disposition": ["content-disposition@1.0.1", "https://registry.npmmirror.com/content-disposition/-/content-disposition-1.0.1.tgz", {}, "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q=="], + + "content-type": ["content-type@1.0.5", "https://registry.npmmirror.com/content-type/-/content-type-1.0.5.tgz", {}, "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA=="], + + "cookie": ["cookie@0.7.2", "https://registry.npmmirror.com/cookie/-/cookie-0.7.2.tgz", {}, "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w=="], + + "cookie-signature": ["cookie-signature@1.2.2", "https://registry.npmmirror.com/cookie-signature/-/cookie-signature-1.2.2.tgz", {}, "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg=="], + + "core-util-is": ["core-util-is@1.0.2", "https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.2.tgz", {}, "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ=="], + + "crc": ["crc@3.8.0", "https://registry.npmmirror.com/crc/-/crc-3.8.0.tgz", { "dependencies": { "buffer": "^5.1.0" } }, "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ=="], + + "cross-dirname": ["cross-dirname@0.1.0", "https://registry.npmmirror.com/cross-dirname/-/cross-dirname-0.1.0.tgz", {}, "sha512-+R08/oI0nl3vfPcqftZRpytksBXDzOUveBq/NBVx0sUp1axwzPQrKinNx5yd5sxPu8j1wIy8AfnVQ+5eFdha6Q=="], + + "cross-spawn": ["cross-spawn@7.0.6", "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.6.tgz", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], + + "debug": ["debug@4.4.3", "https://registry.npmmirror.com/debug/-/debug-4.4.3.tgz", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], + + "decompress-response": ["decompress-response@6.0.0", "https://registry.npmmirror.com/decompress-response/-/decompress-response-6.0.0.tgz", { "dependencies": { "mimic-response": "^3.1.0" } }, "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ=="], + + "defaults": ["defaults@1.0.4", "https://registry.npmmirror.com/defaults/-/defaults-1.0.4.tgz", { "dependencies": { "clone": "^1.0.2" } }, "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A=="], + + "defer-to-connect": ["defer-to-connect@2.0.1", "https://registry.npmmirror.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz", {}, "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg=="], + + "define-data-property": ["define-data-property@1.1.4", "https://registry.npmmirror.com/define-data-property/-/define-data-property-1.1.4.tgz", { "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", "gopd": "^1.0.1" } }, "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A=="], + + "define-properties": ["define-properties@1.2.1", "https://registry.npmmirror.com/define-properties/-/define-properties-1.2.1.tgz", { "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" } }, "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg=="], + + "delayed-stream": ["delayed-stream@1.0.0", "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz", {}, "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="], + + "depd": ["depd@2.0.0", "https://registry.npmmirror.com/depd/-/depd-2.0.0.tgz", {}, "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="], + + "destroy": ["destroy@1.2.0", "https://registry.npmmirror.com/destroy/-/destroy-1.2.0.tgz", {}, "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg=="], + + "detect-libc": ["detect-libc@2.1.2", "https://registry.npmmirror.com/detect-libc/-/detect-libc-2.1.2.tgz", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="], + + "detect-node": ["detect-node@2.1.0", "https://registry.npmmirror.com/detect-node/-/detect-node-2.1.0.tgz", {}, "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g=="], + + "dir-compare": ["dir-compare@4.2.0", "https://registry.npmmirror.com/dir-compare/-/dir-compare-4.2.0.tgz", { "dependencies": { "minimatch": "^3.0.5", "p-limit": "^3.1.0 " } }, "sha512-2xMCmOoMrdQIPHdsTawECdNPwlVFB9zGcz3kuhmBO6U3oU+UQjsue0i8ayLKpgBcm+hcXPMVSGUN9d+pvJ6+VQ=="], + + "dmg-builder": ["dmg-builder@26.4.0", "https://registry.npmmirror.com/dmg-builder/-/dmg-builder-26.4.0.tgz", { "dependencies": { "app-builder-lib": "26.4.0", "builder-util": "26.3.4", "fs-extra": "^10.1.0", "iconv-lite": "^0.6.2", "js-yaml": "^4.1.0" }, "optionalDependencies": { "dmg-license": "^1.0.11" } }, "sha512-ce4Ogns4VMeisIuCSK0C62umG0lFy012jd8LMZ6w/veHUeX4fqfDrGe+HTWALAEwK6JwKP+dhPvizhArSOsFbg=="], + + "dmg-license": ["dmg-license@1.0.11", "https://registry.npmmirror.com/dmg-license/-/dmg-license-1.0.11.tgz", { "dependencies": { "@types/plist": "^3.0.1", "@types/verror": "^1.10.3", "ajv": "^6.10.0", "crc": "^3.8.0", "iconv-corefoundation": "^1.1.7", "plist": "^3.0.4", "smart-buffer": "^4.0.2", "verror": "^1.10.0" }, "os": "darwin", "bin": { "dmg-license": "bin/dmg-license.js" } }, "sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q=="], + + "dotenv": ["dotenv@16.6.1", "https://registry.npmmirror.com/dotenv/-/dotenv-16.6.1.tgz", {}, "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow=="], + + "dotenv-expand": ["dotenv-expand@11.0.7", "https://registry.npmmirror.com/dotenv-expand/-/dotenv-expand-11.0.7.tgz", { "dependencies": { "dotenv": "^16.4.5" } }, "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA=="], + + "dunder-proto": ["dunder-proto@1.0.1", "https://registry.npmmirror.com/dunder-proto/-/dunder-proto-1.0.1.tgz", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="], + + "eastasianwidth": ["eastasianwidth@0.2.0", "https://registry.npmmirror.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz", {}, "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="], + + "ee-first": ["ee-first@1.1.1", "https://registry.npmmirror.com/ee-first/-/ee-first-1.1.1.tgz", {}, "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="], + + "ejs": ["ejs@3.1.10", "https://registry.npmmirror.com/ejs/-/ejs-3.1.10.tgz", { "dependencies": { "jake": "^10.8.5" }, "bin": { "ejs": "bin/cli.js" } }, "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA=="], + + "electron": ["electron@39.2.7", "https://registry.npmmirror.com/electron/-/electron-39.2.7.tgz", { "dependencies": { "@electron/get": "^2.0.0", "@types/node": "^22.7.7", "extract-zip": "^2.0.1" }, "bin": { "electron": "cli.js" } }, "sha512-KU0uFS6LSTh4aOIC3miolcbizOFP7N1M46VTYVfqIgFiuA2ilfNaOHLDS9tCMvwwHRowAsvqBrh9NgMXcTOHCQ=="], + + "electron-builder": ["electron-builder@26.4.0", "https://registry.npmmirror.com/electron-builder/-/electron-builder-26.4.0.tgz", { "dependencies": { "app-builder-lib": "26.4.0", "builder-util": "26.3.4", "builder-util-runtime": "9.5.1", "chalk": "^4.1.2", "ci-info": "^4.2.0", "dmg-builder": "26.4.0", "fs-extra": "^10.1.0", "lazy-val": "^1.0.5", "simple-update-notifier": "2.0.0", "yargs": "^17.6.2" }, "bin": { "electron-builder": "cli.js", "install-app-deps": "install-app-deps.js" } }, "sha512-FCUqvdq2AULL+Db2SUGgjOYTbrgkPxZtCjqIZGnjH9p29pTWyesQqBIfvQBKa6ewqde87aWl49n/WyI/NyUBog=="], + + "electron-builder-squirrel-windows": ["electron-builder-squirrel-windows@26.4.0", "https://registry.npmmirror.com/electron-builder-squirrel-windows/-/electron-builder-squirrel-windows-26.4.0.tgz", { "dependencies": { "app-builder-lib": "26.4.0", "builder-util": "26.3.4", "electron-winstaller": "5.4.0" } }, "sha512-7dvalY38xBzWNaoOJ4sqy2aGIEpl2S1gLPkkB0MHu1Hu5xKQ82il1mKSFlXs6fLpXUso/NmyjdHGlSHDRoG8/w=="], + + "electron-publish": ["electron-publish@26.3.4", "https://registry.npmmirror.com/electron-publish/-/electron-publish-26.3.4.tgz", { "dependencies": { "@types/fs-extra": "^9.0.11", "builder-util": "26.3.4", "builder-util-runtime": "9.5.1", "chalk": "^4.1.2", "form-data": "^4.0.0", "fs-extra": "^10.1.0", "lazy-val": "^1.0.5", "mime": "^2.5.2" } }, "sha512-5/ouDPb73SkKuay2EXisPG60LTFTMNHWo2WLrK5GDphnWK9UC+yzYrzVeydj078Yk4WUXi0+TaaZsNd6Zt5k/A=="], + + "electron-winstaller": ["electron-winstaller@5.4.0", "https://registry.npmmirror.com/electron-winstaller/-/electron-winstaller-5.4.0.tgz", { "dependencies": { "@electron/asar": "^3.2.1", "debug": "^4.1.1", "fs-extra": "^7.0.1", "lodash": "^4.17.21", "temp": "^0.9.0" }, "optionalDependencies": { "@electron/windows-sign": "^1.1.2" } }, "sha512-bO3y10YikuUwUuDUQRM4KfwNkKhnpVO7IPdbsrejwN9/AABJzzTQ4GeHwyzNSrVO+tEH3/Np255a3sVZpZDjvg=="], + + "emoji-regex": ["emoji-regex@8.0.0", "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + + "encodeurl": ["encodeurl@2.0.0", "https://registry.npmmirror.com/encodeurl/-/encodeurl-2.0.0.tgz", {}, "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg=="], + + "encoding": ["encoding@0.1.13", "https://registry.npmmirror.com/encoding/-/encoding-0.1.13.tgz", { "dependencies": { "iconv-lite": "^0.6.2" } }, "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A=="], + + "end-of-stream": ["end-of-stream@1.4.5", "https://registry.npmmirror.com/end-of-stream/-/end-of-stream-1.4.5.tgz", { "dependencies": { "once": "^1.4.0" } }, "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg=="], + + "env-paths": ["env-paths@2.2.1", "https://registry.npmmirror.com/env-paths/-/env-paths-2.2.1.tgz", {}, "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A=="], + + "err-code": ["err-code@2.0.3", "https://registry.npmmirror.com/err-code/-/err-code-2.0.3.tgz", {}, "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA=="], + + "es-define-property": ["es-define-property@1.0.1", "https://registry.npmmirror.com/es-define-property/-/es-define-property-1.0.1.tgz", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="], + + "es-errors": ["es-errors@1.3.0", "https://registry.npmmirror.com/es-errors/-/es-errors-1.3.0.tgz", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="], + + "es-object-atoms": ["es-object-atoms@1.1.1", "https://registry.npmmirror.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA=="], + + "es-set-tostringtag": ["es-set-tostringtag@2.1.0", "https://registry.npmmirror.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", { "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA=="], + + "es6-error": ["es6-error@4.1.1", "https://registry.npmmirror.com/es6-error/-/es6-error-4.1.1.tgz", {}, "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg=="], + + "esbuild": ["esbuild@0.27.2", "https://registry.npmmirror.com/esbuild/-/esbuild-0.27.2.tgz", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.27.2", "@esbuild/android-arm": "0.27.2", "@esbuild/android-arm64": "0.27.2", "@esbuild/android-x64": "0.27.2", "@esbuild/darwin-arm64": "0.27.2", "@esbuild/darwin-x64": "0.27.2", "@esbuild/freebsd-arm64": "0.27.2", "@esbuild/freebsd-x64": "0.27.2", "@esbuild/linux-arm": "0.27.2", "@esbuild/linux-arm64": "0.27.2", "@esbuild/linux-ia32": "0.27.2", "@esbuild/linux-loong64": "0.27.2", "@esbuild/linux-mips64el": "0.27.2", "@esbuild/linux-ppc64": "0.27.2", "@esbuild/linux-riscv64": "0.27.2", "@esbuild/linux-s390x": "0.27.2", "@esbuild/linux-x64": "0.27.2", "@esbuild/netbsd-arm64": "0.27.2", "@esbuild/netbsd-x64": "0.27.2", "@esbuild/openbsd-arm64": "0.27.2", "@esbuild/openbsd-x64": "0.27.2", "@esbuild/openharmony-arm64": "0.27.2", "@esbuild/sunos-x64": "0.27.2", "@esbuild/win32-arm64": "0.27.2", "@esbuild/win32-ia32": "0.27.2", "@esbuild/win32-x64": "0.27.2" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw=="], + + "escalade": ["escalade@3.2.0", "https://registry.npmmirror.com/escalade/-/escalade-3.2.0.tgz", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], + + "escape-html": ["escape-html@1.0.3", "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz", {}, "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="], + + "escape-string-regexp": ["escape-string-regexp@4.0.0", "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], + + "etag": ["etag@1.8.1", "https://registry.npmmirror.com/etag/-/etag-1.8.1.tgz", {}, "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="], + + "exponential-backoff": ["exponential-backoff@3.1.3", "https://registry.npmmirror.com/exponential-backoff/-/exponential-backoff-3.1.3.tgz", {}, "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA=="], + + "express": ["express@5.2.1", "https://registry.npmmirror.com/express/-/express-5.2.1.tgz", { "dependencies": { "accepts": "^2.0.0", "body-parser": "^2.2.1", "content-disposition": "^1.0.0", "content-type": "^1.0.5", "cookie": "^0.7.1", "cookie-signature": "^1.2.1", "debug": "^4.4.0", "depd": "^2.0.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "finalhandler": "^2.1.0", "fresh": "^2.0.0", "http-errors": "^2.0.0", "merge-descriptors": "^2.0.0", "mime-types": "^3.0.0", "on-finished": "^2.4.1", "once": "^1.4.0", "parseurl": "^1.3.3", "proxy-addr": "^2.0.7", "qs": "^6.14.0", "range-parser": "^1.2.1", "router": "^2.2.0", "send": "^1.1.0", "serve-static": "^2.2.0", "statuses": "^2.0.1", "type-is": "^2.0.1", "vary": "^1.1.2" } }, "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw=="], + + "express-validator": ["express-validator@7.3.1", "https://registry.npmmirror.com/express-validator/-/express-validator-7.3.1.tgz", { "dependencies": { "lodash": "^4.17.21", "validator": "~13.15.23" } }, "sha512-IGenaSf+DnWc69lKuqlRE9/i/2t5/16VpH5bXoqdxWz1aCpRvEdrBuu1y95i/iL5QP8ZYVATiwLFhwk3EDl5vg=="], + + "extract-zip": ["extract-zip@2.0.1", "https://registry.npmmirror.com/extract-zip/-/extract-zip-2.0.1.tgz", { "dependencies": { "debug": "^4.1.1", "get-stream": "^5.1.0", "yauzl": "^2.10.0" }, "optionalDependencies": { "@types/yauzl": "^2.9.1" }, "bin": { "extract-zip": "cli.js" } }, "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg=="], + + "extsprintf": ["extsprintf@1.4.1", "https://registry.npmmirror.com/extsprintf/-/extsprintf-1.4.1.tgz", {}, "sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA=="], + + "fast-deep-equal": ["fast-deep-equal@3.1.3", "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], + + "fast-json-stable-stringify": ["fast-json-stable-stringify@2.1.0", "https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", {}, "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="], + + "fd-slicer": ["fd-slicer@1.1.0", "https://registry.npmmirror.com/fd-slicer/-/fd-slicer-1.1.0.tgz", { "dependencies": { "pend": "~1.2.0" } }, "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g=="], + + "fdir": ["fdir@6.5.0", "https://registry.npmmirror.com/fdir/-/fdir-6.5.0.tgz", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="], + + "filelist": ["filelist@1.0.4", "https://registry.npmmirror.com/filelist/-/filelist-1.0.4.tgz", { "dependencies": { "minimatch": "^5.0.1" } }, "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q=="], + + "finalhandler": ["finalhandler@2.1.1", "https://registry.npmmirror.com/finalhandler/-/finalhandler-2.1.1.tgz", { "dependencies": { "debug": "^4.4.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "on-finished": "^2.4.1", "parseurl": "^1.3.3", "statuses": "^2.0.1" } }, "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA=="], + + "foreground-child": ["foreground-child@3.3.1", "https://registry.npmmirror.com/foreground-child/-/foreground-child-3.3.1.tgz", { "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" } }, "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw=="], + + "form-data": ["form-data@4.0.5", "https://registry.npmmirror.com/form-data/-/form-data-4.0.5.tgz", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", "mime-types": "^2.1.12" } }, "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w=="], + + "forwarded": ["forwarded@0.2.0", "https://registry.npmmirror.com/forwarded/-/forwarded-0.2.0.tgz", {}, "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="], + + "fresh": ["fresh@2.0.0", "https://registry.npmmirror.com/fresh/-/fresh-2.0.0.tgz", {}, "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A=="], + + "fs-extra": ["fs-extra@10.1.0", "https://registry.npmmirror.com/fs-extra/-/fs-extra-10.1.0.tgz", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ=="], + + "fs-minipass": ["fs-minipass@2.1.0", "https://registry.npmmirror.com/fs-minipass/-/fs-minipass-2.1.0.tgz", { "dependencies": { "minipass": "^3.0.0" } }, "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg=="], + + "fs.realpath": ["fs.realpath@1.0.0", "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz", {}, "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="], + + "fsevents": ["fsevents@2.3.3", "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], + + "function-bind": ["function-bind@1.1.2", "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], + + "fzstd": ["fzstd@0.1.1", "https://registry.npmmirror.com/fzstd/-/fzstd-0.1.1.tgz", {}, "sha512-dkuVSOKKwh3eas5VkJy1AW1vFpet8TA/fGmVA5krThl8YcOVE/8ZIoEA1+U1vEn5ckxxhLirSdY837azmbaNHA=="], + + "get-caller-file": ["get-caller-file@2.0.5", "https://registry.npmmirror.com/get-caller-file/-/get-caller-file-2.0.5.tgz", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="], + + "get-intrinsic": ["get-intrinsic@1.3.0", "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="], + + "get-proto": ["get-proto@1.0.1", "https://registry.npmmirror.com/get-proto/-/get-proto-1.0.1.tgz", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="], + + "get-stream": ["get-stream@5.2.0", "https://registry.npmmirror.com/get-stream/-/get-stream-5.2.0.tgz", { "dependencies": { "pump": "^3.0.0" } }, "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA=="], + + "get-tsconfig": ["get-tsconfig@4.13.0", "https://registry.npmmirror.com/get-tsconfig/-/get-tsconfig-4.13.0.tgz", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ=="], + + "glob": ["glob@10.5.0", "https://registry.npmmirror.com/glob/-/glob-10.5.0.tgz", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg=="], + + "global-agent": ["global-agent@3.0.0", "https://registry.npmmirror.com/global-agent/-/global-agent-3.0.0.tgz", { "dependencies": { "boolean": "^3.0.1", "es6-error": "^4.1.1", "matcher": "^3.0.0", "roarr": "^2.15.3", "semver": "^7.3.2", "serialize-error": "^7.0.1" } }, "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q=="], + + "globalthis": ["globalthis@1.0.4", "https://registry.npmmirror.com/globalthis/-/globalthis-1.0.4.tgz", { "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" } }, "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ=="], + + "gopd": ["gopd@1.2.0", "https://registry.npmmirror.com/gopd/-/gopd-1.2.0.tgz", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="], + + "got": ["got@11.8.6", "https://registry.npmmirror.com/got/-/got-11.8.6.tgz", { "dependencies": { "@sindresorhus/is": "^4.0.0", "@szmarczak/http-timer": "^4.0.5", "@types/cacheable-request": "^6.0.1", "@types/responselike": "^1.0.0", "cacheable-lookup": "^5.0.3", "cacheable-request": "^7.0.2", "decompress-response": "^6.0.0", "http2-wrapper": "^1.0.0-beta.5.2", "lowercase-keys": "^2.0.0", "p-cancelable": "^2.0.0", "responselike": "^2.0.0" } }, "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g=="], + + "graceful-fs": ["graceful-fs@4.2.11", "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], + + "handlebars": ["handlebars@4.7.8", "https://registry.npmmirror.com/handlebars/-/handlebars-4.7.8.tgz", { "dependencies": { "minimist": "^1.2.5", "neo-async": "^2.6.2", "source-map": "^0.6.1", "wordwrap": "^1.0.0" }, "optionalDependencies": { "uglify-js": "^3.1.4" }, "bin": { "handlebars": "bin/handlebars" } }, "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ=="], + + "has-flag": ["has-flag@4.0.0", "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "has-property-descriptors": ["has-property-descriptors@1.0.2", "https://registry.npmmirror.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", { "dependencies": { "es-define-property": "^1.0.0" } }, "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="], + + "has-symbols": ["has-symbols@1.1.0", "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.1.0.tgz", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="], + + "has-tostringtag": ["has-tostringtag@1.0.2", "https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz", { "dependencies": { "has-symbols": "^1.0.3" } }, "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw=="], + + "hasown": ["hasown@2.0.2", "https://registry.npmmirror.com/hasown/-/hasown-2.0.2.tgz", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="], + + "hosted-git-info": ["hosted-git-info@4.1.0", "https://registry.npmmirror.com/hosted-git-info/-/hosted-git-info-4.1.0.tgz", { "dependencies": { "lru-cache": "^6.0.0" } }, "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA=="], + + "http-cache-semantics": ["http-cache-semantics@4.2.0", "https://registry.npmmirror.com/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", {}, "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ=="], + + "http-errors": ["http-errors@2.0.1", "https://registry.npmmirror.com/http-errors/-/http-errors-2.0.1.tgz", { "dependencies": { "depd": "~2.0.0", "inherits": "~2.0.4", "setprototypeof": "~1.2.0", "statuses": "~2.0.2", "toidentifier": "~1.0.1" } }, "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ=="], + + "http-proxy-agent": ["http-proxy-agent@7.0.2", "https://registry.npmmirror.com/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", { "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" } }, "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig=="], + + "http2-wrapper": ["http2-wrapper@1.0.3", "https://registry.npmmirror.com/http2-wrapper/-/http2-wrapper-1.0.3.tgz", { "dependencies": { "quick-lru": "^5.1.1", "resolve-alpn": "^1.0.0" } }, "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg=="], + + "https-proxy-agent": ["https-proxy-agent@7.0.6", "https://registry.npmmirror.com/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="], + + "iconv-corefoundation": ["iconv-corefoundation@1.1.7", "https://registry.npmmirror.com/iconv-corefoundation/-/iconv-corefoundation-1.1.7.tgz", { "dependencies": { "cli-truncate": "^2.1.0", "node-addon-api": "^1.6.3" }, "os": "darwin" }, "sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ=="], + + "iconv-lite": ["iconv-lite@0.6.3", "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.6.3.tgz", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="], + + "ieee754": ["ieee754@1.2.1", "https://registry.npmmirror.com/ieee754/-/ieee754-1.2.1.tgz", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="], + + "imurmurhash": ["imurmurhash@0.1.4", "https://registry.npmmirror.com/imurmurhash/-/imurmurhash-0.1.4.tgz", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], + + "inflight": ["inflight@1.0.6", "https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz", { "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA=="], + + "inherits": ["inherits@2.0.4", "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], + + "ip-address": ["ip-address@10.1.0", "https://registry.npmmirror.com/ip-address/-/ip-address-10.1.0.tgz", {}, "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q=="], + + "ipaddr.js": ["ipaddr.js@1.9.1", "https://registry.npmmirror.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz", {}, "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="], + + "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], + + "is-interactive": ["is-interactive@1.0.0", "https://registry.npmmirror.com/is-interactive/-/is-interactive-1.0.0.tgz", {}, "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w=="], + + "is-promise": ["is-promise@4.0.0", "https://registry.npmmirror.com/is-promise/-/is-promise-4.0.0.tgz", {}, "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ=="], + + "is-unicode-supported": ["is-unicode-supported@0.1.0", "https://registry.npmmirror.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", {}, "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw=="], + + "is-what": ["is-what@4.1.16", "https://registry.npmmirror.com/is-what/-/is-what-4.1.16.tgz", {}, "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A=="], + + "isbinaryfile": ["isbinaryfile@5.0.7", "https://registry.npmmirror.com/isbinaryfile/-/isbinaryfile-5.0.7.tgz", {}, "sha512-gnWD14Jh3FzS3CPhF0AxNOJ8CxqeblPTADzI38r0wt8ZyQl5edpy75myt08EG2oKvpyiqSqsx+Wkz9vtkbTqYQ=="], + + "isexe": ["isexe@3.1.1", "https://registry.npmmirror.com/isexe/-/isexe-3.1.1.tgz", {}, "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ=="], + + "jackspeak": ["jackspeak@3.4.3", "https://registry.npmmirror.com/jackspeak/-/jackspeak-3.4.3.tgz", { "dependencies": { "@isaacs/cliui": "^8.0.2" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw=="], + + "jake": ["jake@10.9.4", "https://registry.npmmirror.com/jake/-/jake-10.9.4.tgz", { "dependencies": { "async": "^3.2.6", "filelist": "^1.0.4", "picocolors": "^1.1.1" }, "bin": { "jake": "bin/cli.js" } }, "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA=="], + + "jiti": ["jiti@2.6.1", "https://registry.npmmirror.com/jiti/-/jiti-2.6.1.tgz", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ=="], + + "js-yaml": ["js-yaml@4.1.1", "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.1.tgz", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA=="], + + "json-buffer": ["json-buffer@3.0.1", "https://registry.npmmirror.com/json-buffer/-/json-buffer-3.0.1.tgz", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="], + + "json-schema-traverse": ["json-schema-traverse@0.4.1", "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + + "json-stringify-safe": ["json-stringify-safe@5.0.1", "https://registry.npmmirror.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", {}, "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA=="], + + "json5": ["json5@2.2.3", "https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="], + + "jsonfile": ["jsonfile@6.2.0", "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.2.0.tgz", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg=="], + + "keyv": ["keyv@4.5.4", "https://registry.npmmirror.com/keyv/-/keyv-4.5.4.tgz", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="], + + "lazy-val": ["lazy-val@1.0.5", "https://registry.npmmirror.com/lazy-val/-/lazy-val-1.0.5.tgz", {}, "sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q=="], + + "lodash": ["lodash@4.17.21", "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz", {}, "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="], + + "log-symbols": ["log-symbols@4.1.0", "https://registry.npmmirror.com/log-symbols/-/log-symbols-4.1.0.tgz", { "dependencies": { "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" } }, "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg=="], + + "lowercase-keys": ["lowercase-keys@2.0.0", "https://registry.npmmirror.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz", {}, "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA=="], + + "lru-cache": ["lru-cache@11.2.4", "", {}, "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg=="], + + "make-fetch-happen": ["make-fetch-happen@14.0.3", "https://registry.npmmirror.com/make-fetch-happen/-/make-fetch-happen-14.0.3.tgz", { "dependencies": { "@npmcli/agent": "^3.0.0", "cacache": "^19.0.1", "http-cache-semantics": "^4.1.1", "minipass": "^7.0.2", "minipass-fetch": "^4.0.0", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "negotiator": "^1.0.0", "proc-log": "^5.0.0", "promise-retry": "^2.0.1", "ssri": "^12.0.0" } }, "sha512-QMjGbFTP0blj97EeidG5hk/QhKQ3T4ICckQGLgz38QF7Vgbk6e6FTARN8KhKxyBbWn8R0HU+bnw8aSoFPD4qtQ=="], + + "matcher": ["matcher@3.0.0", "https://registry.npmmirror.com/matcher/-/matcher-3.0.0.tgz", { "dependencies": { "escape-string-regexp": "^4.0.0" } }, "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng=="], + + "math-intrinsics": ["math-intrinsics@1.1.0", "https://registry.npmmirror.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="], + + "media-typer": ["media-typer@1.1.0", "https://registry.npmmirror.com/media-typer/-/media-typer-1.1.0.tgz", {}, "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw=="], + + "merge-anything": ["merge-anything@5.1.7", "https://registry.npmmirror.com/merge-anything/-/merge-anything-5.1.7.tgz", { "dependencies": { "is-what": "^4.1.8" } }, "sha512-eRtbOb1N5iyH0tkQDAoQ4Ipsp/5qSR79Dzrz8hEPxRX10RWWR/iQXdoKmBSRCThY1Fh5EhISDtpSc93fpxUniQ=="], + + "merge-descriptors": ["merge-descriptors@2.0.0", "https://registry.npmmirror.com/merge-descriptors/-/merge-descriptors-2.0.0.tgz", {}, "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g=="], + + "methods": ["methods@1.1.2", "https://registry.npmmirror.com/methods/-/methods-1.1.2.tgz", {}, "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w=="], + + "mime": ["mime@1.6.0", "https://registry.npmmirror.com/mime/-/mime-1.6.0.tgz", { "bin": { "mime": "cli.js" } }, "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="], + + "mime-db": ["mime-db@1.54.0", "https://registry.npmmirror.com/mime-db/-/mime-db-1.54.0.tgz", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], + + "mime-types": ["mime-types@3.0.2", "https://registry.npmmirror.com/mime-types/-/mime-types-3.0.2.tgz", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A=="], + + "mimic-fn": ["mimic-fn@2.1.0", "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-2.1.0.tgz", {}, "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="], + + "mimic-response": ["mimic-response@3.1.0", "https://registry.npmmirror.com/mimic-response/-/mimic-response-3.1.0.tgz", {}, "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ=="], + + "minimatch": ["minimatch@10.1.1", "https://registry.npmmirror.com/minimatch/-/minimatch-10.1.1.tgz", { "dependencies": { "@isaacs/brace-expansion": "^5.0.0" } }, "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ=="], + + "minimist": ["minimist@1.2.8", "https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="], + + "minipass": ["minipass@5.0.0", "https://registry.npmmirror.com/minipass/-/minipass-5.0.0.tgz", {}, "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ=="], + + "minipass-collect": ["minipass-collect@2.0.1", "https://registry.npmmirror.com/minipass-collect/-/minipass-collect-2.0.1.tgz", { "dependencies": { "minipass": "^7.0.3" } }, "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw=="], + + "minipass-fetch": ["minipass-fetch@4.0.1", "https://registry.npmmirror.com/minipass-fetch/-/minipass-fetch-4.0.1.tgz", { "dependencies": { "minipass": "^7.0.3", "minipass-sized": "^1.0.3", "minizlib": "^3.0.1" }, "optionalDependencies": { "encoding": "^0.1.13" } }, "sha512-j7U11C5HXigVuutxebFadoYBbd7VSdZWggSe64NVdvWNBqGAiXPL2QVCehjmw7lY1oF9gOllYbORh+hiNgfPgQ=="], + + "minipass-flush": ["minipass-flush@1.0.5", "https://registry.npmmirror.com/minipass-flush/-/minipass-flush-1.0.5.tgz", { "dependencies": { "minipass": "^3.0.0" } }, "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw=="], + + "minipass-pipeline": ["minipass-pipeline@1.2.4", "https://registry.npmmirror.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", { "dependencies": { "minipass": "^3.0.0" } }, "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A=="], + + "minipass-sized": ["minipass-sized@1.0.3", "https://registry.npmmirror.com/minipass-sized/-/minipass-sized-1.0.3.tgz", { "dependencies": { "minipass": "^3.0.0" } }, "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g=="], + + "minizlib": ["minizlib@2.1.2", "https://registry.npmmirror.com/minizlib/-/minizlib-2.1.2.tgz", { "dependencies": { "minipass": "^3.0.0", "yallist": "^4.0.0" } }, "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg=="], + + "mkdirp": ["mkdirp@1.0.4", "https://registry.npmmirror.com/mkdirp/-/mkdirp-1.0.4.tgz", { "bin": { "mkdirp": "bin/cmd.js" } }, "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="], + + "ms": ["ms@2.1.3", "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + + "negotiator": ["negotiator@1.0.0", "https://registry.npmmirror.com/negotiator/-/negotiator-1.0.0.tgz", {}, "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg=="], + + "neo-async": ["neo-async@2.6.2", "https://registry.npmmirror.com/neo-async/-/neo-async-2.6.2.tgz", {}, "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="], + + "node-abi": ["node-abi@4.24.0", "https://registry.npmmirror.com/node-abi/-/node-abi-4.24.0.tgz", { "dependencies": { "semver": "^7.6.3" } }, "sha512-u2EC1CeNe25uVtX3EZbdQ275c74zdZmmpzrHEQh2aIYqoVjlglfUpOX9YY85x1nlBydEKDVaSmMNhR7N82Qj8A=="], + + "node-addon-api": ["node-addon-api@1.7.2", "https://registry.npmmirror.com/node-addon-api/-/node-addon-api-1.7.2.tgz", {}, "sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg=="], + + "node-api-version": ["node-api-version@0.2.1", "https://registry.npmmirror.com/node-api-version/-/node-api-version-0.2.1.tgz", { "dependencies": { "semver": "^7.3.5" } }, "sha512-2xP/IGGMmmSQpI1+O/k72jF/ykvZ89JeuKX3TLJAYPDVLUalrshrLHkeVcCCZqG/eEa635cr8IBYzgnDvM2O8Q=="], + + "node-gyp": ["node-gyp@11.5.0", "https://registry.npmmirror.com/node-gyp/-/node-gyp-11.5.0.tgz", { "dependencies": { "env-paths": "^2.2.0", "exponential-backoff": "^3.1.1", "graceful-fs": "^4.2.6", "make-fetch-happen": "^14.0.3", "nopt": "^8.0.0", "proc-log": "^5.0.0", "semver": "^7.3.5", "tar": "^7.4.3", "tinyglobby": "^0.2.12", "which": "^5.0.0" }, "bin": { "node-gyp": "bin/node-gyp.js" } }, "sha512-ra7Kvlhxn5V9Slyus0ygMa2h+UqExPqUIkfk7Pc8QTLT956JLSy51uWFwHtIYy0vI8cB4BDhc/S03+880My/LQ=="], + + "nopt": ["nopt@8.1.0", "https://registry.npmmirror.com/nopt/-/nopt-8.1.0.tgz", { "dependencies": { "abbrev": "^3.0.0" }, "bin": { "nopt": "bin/nopt.js" } }, "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A=="], + + "normalize-url": ["normalize-url@6.1.0", "https://registry.npmmirror.com/normalize-url/-/normalize-url-6.1.0.tgz", {}, "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A=="], + + "object-inspect": ["object-inspect@1.13.4", "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.13.4.tgz", {}, "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="], + + "object-keys": ["object-keys@1.1.1", "https://registry.npmmirror.com/object-keys/-/object-keys-1.1.1.tgz", {}, "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="], + + "on-finished": ["on-finished@2.4.1", "https://registry.npmmirror.com/on-finished/-/on-finished-2.4.1.tgz", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg=="], + + "once": ["once@1.4.0", "https://registry.npmmirror.com/once/-/once-1.4.0.tgz", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="], + + "onetime": ["onetime@5.1.2", "https://registry.npmmirror.com/onetime/-/onetime-5.1.2.tgz", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="], + + "ora": ["ora@5.4.1", "https://registry.npmmirror.com/ora/-/ora-5.4.1.tgz", { "dependencies": { "bl": "^4.1.0", "chalk": "^4.1.0", "cli-cursor": "^3.1.0", "cli-spinners": "^2.5.0", "is-interactive": "^1.0.0", "is-unicode-supported": "^0.1.0", "log-symbols": "^4.1.0", "strip-ansi": "^6.0.0", "wcwidth": "^1.0.1" } }, "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ=="], + + "p-cancelable": ["p-cancelable@2.1.1", "https://registry.npmmirror.com/p-cancelable/-/p-cancelable-2.1.1.tgz", {}, "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg=="], + + "p-limit": ["p-limit@3.1.0", "https://registry.npmmirror.com/p-limit/-/p-limit-3.1.0.tgz", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], + + "p-map": ["p-map@7.0.4", "https://registry.npmmirror.com/p-map/-/p-map-7.0.4.tgz", {}, "sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ=="], + + "package-json-from-dist": ["package-json-from-dist@1.0.1", "https://registry.npmmirror.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", {}, "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="], + + "parseurl": ["parseurl@1.3.3", "https://registry.npmmirror.com/parseurl/-/parseurl-1.3.3.tgz", {}, "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="], + + "path-is-absolute": ["path-is-absolute@1.0.1", "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz", {}, "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg=="], + + "path-key": ["path-key@3.1.1", "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], + + "path-scurry": ["path-scurry@1.11.1", "https://registry.npmmirror.com/path-scurry/-/path-scurry-1.11.1.tgz", { "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="], + + "path-to-regexp": ["path-to-regexp@0.1.12", "https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-0.1.12.tgz", {}, "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ=="], + + "pe-library": ["pe-library@0.4.1", "https://registry.npmmirror.com/pe-library/-/pe-library-0.4.1.tgz", {}, "sha512-eRWB5LBz7PpDu4PUlwT0PhnQfTQJlDDdPa35urV4Osrm0t0AqQFGn+UIkU3klZvwJ8KPO3VbBFsXquA6p6kqZw=="], + + "pend": ["pend@1.2.0", "https://registry.npmmirror.com/pend/-/pend-1.2.0.tgz", {}, "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg=="], + + "picocolors": ["picocolors@1.1.1", "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], + + "picomatch": ["picomatch@4.0.3", "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.3.tgz", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], + + "plist": ["plist@3.1.0", "https://registry.npmmirror.com/plist/-/plist-3.1.0.tgz", { "dependencies": { "@xmldom/xmldom": "^0.8.8", "base64-js": "^1.5.1", "xmlbuilder": "^15.1.1" } }, "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ=="], + + "postject": ["postject@1.0.0-alpha.6", "https://registry.npmmirror.com/postject/-/postject-1.0.0-alpha.6.tgz", { "dependencies": { "commander": "^9.4.0" }, "bin": { "postject": "dist/cli.js" } }, "sha512-b9Eb8h2eVqNE8edvKdwqkrY6O7kAwmI8kcnBv1NScolYJbo59XUF0noFq+lxbC1yN20bmC0WBEbDC5H/7ASb0A=="], + + "proc-log": ["proc-log@5.0.0", "https://registry.npmmirror.com/proc-log/-/proc-log-5.0.0.tgz", {}, "sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ=="], + + "progress": ["progress@2.0.3", "https://registry.npmmirror.com/progress/-/progress-2.0.3.tgz", {}, "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA=="], + + "promise-retry": ["promise-retry@2.0.1", "https://registry.npmmirror.com/promise-retry/-/promise-retry-2.0.1.tgz", { "dependencies": { "err-code": "^2.0.2", "retry": "^0.12.0" } }, "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g=="], + + "proxy-addr": ["proxy-addr@2.0.7", "https://registry.npmmirror.com/proxy-addr/-/proxy-addr-2.0.7.tgz", { "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" } }, "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg=="], + + "pump": ["pump@3.0.3", "https://registry.npmmirror.com/pump/-/pump-3.0.3.tgz", { "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA=="], + + "punycode": ["punycode@2.3.1", "https://registry.npmmirror.com/punycode/-/punycode-2.3.1.tgz", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], + + "qs": ["qs@6.14.1", "https://registry.npmmirror.com/qs/-/qs-6.14.1.tgz", { "dependencies": { "side-channel": "^1.1.0" } }, "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ=="], + + "quick-lru": ["quick-lru@5.1.1", "https://registry.npmmirror.com/quick-lru/-/quick-lru-5.1.1.tgz", {}, "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA=="], + + "range-parser": ["range-parser@1.2.1", "https://registry.npmmirror.com/range-parser/-/range-parser-1.2.1.tgz", {}, "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="], + + "raw-body": ["raw-body@3.0.2", "https://registry.npmmirror.com/raw-body/-/raw-body-3.0.2.tgz", { "dependencies": { "bytes": "~3.1.2", "http-errors": "~2.0.1", "iconv-lite": "~0.7.0", "unpipe": "~1.0.0" } }, "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA=="], + + "read-binary-file-arch": ["read-binary-file-arch@1.0.6", "https://registry.npmmirror.com/read-binary-file-arch/-/read-binary-file-arch-1.0.6.tgz", { "dependencies": { "debug": "^4.3.4" }, "bin": { "read-binary-file-arch": "cli.js" } }, "sha512-BNg9EN3DD3GsDXX7Aa8O4p92sryjkmzYYgmgTAc6CA4uGLEDzFfxOxugu21akOxpcXHiEgsYkC6nPsQvLLLmEg=="], + + "readable-stream": ["readable-stream@3.6.2", "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.2.tgz", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], + + "reflect-metadata": ["reflect-metadata@0.2.2", "https://registry.npmmirror.com/reflect-metadata/-/reflect-metadata-0.2.2.tgz", {}, "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q=="], + + "require-directory": ["require-directory@2.1.1", "https://registry.npmmirror.com/require-directory/-/require-directory-2.1.1.tgz", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="], + + "resedit": ["resedit@1.7.2", "https://registry.npmmirror.com/resedit/-/resedit-1.7.2.tgz", { "dependencies": { "pe-library": "^0.4.1" } }, "sha512-vHjcY2MlAITJhC0eRD/Vv8Vlgmu9Sd3LX9zZvtGzU5ZImdTN3+d6e/4mnTyV8vEbyf1sgNIrWxhWlrys52OkEA=="], + + "resolve-alpn": ["resolve-alpn@1.2.1", "https://registry.npmmirror.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz", {}, "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g=="], + + "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "https://registry.npmmirror.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], + + "responselike": ["responselike@2.0.1", "https://registry.npmmirror.com/responselike/-/responselike-2.0.1.tgz", { "dependencies": { "lowercase-keys": "^2.0.0" } }, "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw=="], + + "restore-cursor": ["restore-cursor@3.1.0", "https://registry.npmmirror.com/restore-cursor/-/restore-cursor-3.1.0.tgz", { "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" } }, "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA=="], + + "retry": ["retry@0.12.0", "https://registry.npmmirror.com/retry/-/retry-0.12.0.tgz", {}, "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow=="], + + "rimraf": ["rimraf@2.6.3", "https://registry.npmmirror.com/rimraf/-/rimraf-2.6.3.tgz", { "dependencies": { "glob": "^7.1.3" }, "bin": { "rimraf": "./bin.js" } }, "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA=="], + + "roarr": ["roarr@2.15.4", "https://registry.npmmirror.com/roarr/-/roarr-2.15.4.tgz", { "dependencies": { "boolean": "^3.0.1", "detect-node": "^2.0.4", "globalthis": "^1.0.1", "json-stringify-safe": "^5.0.1", "semver-compare": "^1.0.0", "sprintf-js": "^1.1.2" } }, "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A=="], + + "router": ["router@2.2.0", "https://registry.npmmirror.com/router/-/router-2.2.0.tgz", { "dependencies": { "debug": "^4.4.0", "depd": "^2.0.0", "is-promise": "^4.0.0", "parseurl": "^1.3.3", "path-to-regexp": "^8.0.0" } }, "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ=="], + + "safe-buffer": ["safe-buffer@5.2.1", "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + + "safer-buffer": ["safer-buffer@2.1.2", "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="], + + "sanitize-filename": ["sanitize-filename@1.6.3", "https://registry.npmmirror.com/sanitize-filename/-/sanitize-filename-1.6.3.tgz", { "dependencies": { "truncate-utf8-bytes": "^1.0.0" } }, "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg=="], + + "sax": ["sax@1.4.3", "https://registry.npmmirror.com/sax/-/sax-1.4.3.tgz", {}, "sha512-yqYn1JhPczigF94DMS+shiDMjDowYO6y9+wB/4WgO0Y19jWYk0lQ4tuG5KI7kj4FTp1wxPj5IFfcrz/s1c3jjQ=="], + + "semver": ["semver@6.3.1", "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "semver-compare": ["semver-compare@1.0.0", "https://registry.npmmirror.com/semver-compare/-/semver-compare-1.0.0.tgz", {}, "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow=="], + + "send": ["send@1.2.1", "https://registry.npmmirror.com/send/-/send-1.2.1.tgz", { "dependencies": { "debug": "^4.4.3", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "fresh": "^2.0.0", "http-errors": "^2.0.1", "mime-types": "^3.0.2", "ms": "^2.1.3", "on-finished": "^2.4.1", "range-parser": "^1.2.1", "statuses": "^2.0.2" } }, "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ=="], + + "serialize-error": ["serialize-error@7.0.1", "https://registry.npmmirror.com/serialize-error/-/serialize-error-7.0.1.tgz", { "dependencies": { "type-fest": "^0.13.1" } }, "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw=="], + + "serve-static": ["serve-static@2.2.1", "https://registry.npmmirror.com/serve-static/-/serve-static-2.2.1.tgz", { "dependencies": { "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "parseurl": "^1.3.3", "send": "^1.2.0" } }, "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw=="], + + "setprototypeof": ["setprototypeof@1.2.0", "https://registry.npmmirror.com/setprototypeof/-/setprototypeof-1.2.0.tgz", {}, "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="], + + "shebang-command": ["shebang-command@2.0.0", "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], + + "shebang-regex": ["shebang-regex@3.0.0", "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], + + "side-channel": ["side-channel@1.1.0", "https://registry.npmmirror.com/side-channel/-/side-channel-1.1.0.tgz", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", "side-channel-list": "^1.0.0", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" } }, "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw=="], + + "side-channel-list": ["side-channel-list@1.0.0", "https://registry.npmmirror.com/side-channel-list/-/side-channel-list-1.0.0.tgz", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" } }, "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA=="], + + "side-channel-map": ["side-channel-map@1.0.1", "https://registry.npmmirror.com/side-channel-map/-/side-channel-map-1.0.1.tgz", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3" } }, "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA=="], + + "side-channel-weakmap": ["side-channel-weakmap@1.0.2", "https://registry.npmmirror.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3", "side-channel-map": "^1.0.1" } }, "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A=="], + + "signal-exit": ["signal-exit@4.1.0", "https://registry.npmmirror.com/signal-exit/-/signal-exit-4.1.0.tgz", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], + + "simple-update-notifier": ["simple-update-notifier@2.0.0", "https://registry.npmmirror.com/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", { "dependencies": { "semver": "^7.5.3" } }, "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w=="], + + "slice-ansi": ["slice-ansi@3.0.0", "https://registry.npmmirror.com/slice-ansi/-/slice-ansi-3.0.0.tgz", { "dependencies": { "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", "is-fullwidth-code-point": "^3.0.0" } }, "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ=="], + + "smart-buffer": ["smart-buffer@4.2.0", "https://registry.npmmirror.com/smart-buffer/-/smart-buffer-4.2.0.tgz", {}, "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg=="], + + "socks": ["socks@2.8.7", "https://registry.npmmirror.com/socks/-/socks-2.8.7.tgz", { "dependencies": { "ip-address": "^10.0.1", "smart-buffer": "^4.2.0" } }, "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A=="], + + "socks-proxy-agent": ["socks-proxy-agent@8.0.5", "https://registry.npmmirror.com/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", { "dependencies": { "agent-base": "^7.1.2", "debug": "^4.3.4", "socks": "^2.8.3" } }, "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw=="], + + "source-map": ["source-map@0.6.1", "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "source-map-support": ["source-map-support@0.5.21", "https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.21.tgz", { "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w=="], + + "sprintf-js": ["sprintf-js@1.1.3", "https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.1.3.tgz", {}, "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA=="], + + "ssri": ["ssri@12.0.0", "https://registry.npmmirror.com/ssri/-/ssri-12.0.0.tgz", { "dependencies": { "minipass": "^7.0.3" } }, "sha512-S7iGNosepx9RadX82oimUkvr0Ct7IjJbEbs4mJcTxst8um95J3sDYU1RBEOvdu6oL1Wek2ODI5i4MAw+dZ6cAQ=="], + + "stat-mode": ["stat-mode@1.0.0", "https://registry.npmmirror.com/stat-mode/-/stat-mode-1.0.0.tgz", {}, "sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg=="], + + "statuses": ["statuses@2.0.2", "https://registry.npmmirror.com/statuses/-/statuses-2.0.2.tgz", {}, "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw=="], + + "string-width": ["string-width@4.2.3", "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "string-width-cjs": ["string-width@4.2.3", "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "string_decoder": ["string_decoder@1.3.0", "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.3.0.tgz", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="], + + "strip-ansi": ["strip-ansi@6.0.1", "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "strip-ansi-cjs": ["strip-ansi@6.0.1", "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "sumchecker": ["sumchecker@3.0.1", "https://registry.npmmirror.com/sumchecker/-/sumchecker-3.0.1.tgz", { "dependencies": { "debug": "^4.1.0" } }, "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg=="], + + "supports-color": ["supports-color@7.2.0", "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "swagger-ui-dist": ["swagger-ui-dist@5.31.0", "https://registry.npmmirror.com/swagger-ui-dist/-/swagger-ui-dist-5.31.0.tgz", { "dependencies": { "@scarf/scarf": "=1.4.0" } }, "sha512-zSUTIck02fSga6rc0RZP3b7J7wgHXwLea8ZjgLA3Vgnb8QeOl3Wou2/j5QkzSGeoz6HusP/coYuJl33aQxQZpg=="], + + "swagger-ui-express": ["swagger-ui-express@5.0.1", "https://registry.npmmirror.com/swagger-ui-express/-/swagger-ui-express-5.0.1.tgz", { "dependencies": { "swagger-ui-dist": ">=5.0.0" }, "peerDependencies": { "express": ">=4.0.0 || >=5.0.0-beta" } }, "sha512-SrNU3RiBGTLLmFU8GIJdOdanJTl4TOmT27tt3bWWHppqYmAZ6IDuEuBvMU6nZq0zLEe6b/1rACXCgLZqO6ZfrA=="], + + "tar": ["tar@6.2.1", "https://registry.npmmirror.com/tar/-/tar-6.2.1.tgz", { "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", "minipass": "^5.0.0", "minizlib": "^2.1.1", "mkdirp": "^1.0.3", "yallist": "^4.0.0" } }, "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A=="], + + "temp": ["temp@0.9.4", "https://registry.npmmirror.com/temp/-/temp-0.9.4.tgz", { "dependencies": { "mkdirp": "^0.5.1", "rimraf": "~2.6.2" } }, "sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA=="], + + "temp-file": ["temp-file@3.4.0", "https://registry.npmmirror.com/temp-file/-/temp-file-3.4.0.tgz", { "dependencies": { "async-exit-hook": "^2.0.1", "fs-extra": "^10.0.0" } }, "sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg=="], + + "tiny-async-pool": ["tiny-async-pool@1.3.0", "https://registry.npmmirror.com/tiny-async-pool/-/tiny-async-pool-1.3.0.tgz", { "dependencies": { "semver": "^5.5.0" } }, "sha512-01EAw5EDrcVrdgyCLgoSPvqznC0sVxDSVeiOz09FUpjh71G79VCqneOr+xvt7T1r76CF6ZZfPjHorN2+d+3mqA=="], + + "tinyglobby": ["tinyglobby@0.2.15", "https://registry.npmmirror.com/tinyglobby/-/tinyglobby-0.2.15.tgz", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.3" } }, "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ=="], + + "tmp": ["tmp@0.2.5", "https://registry.npmmirror.com/tmp/-/tmp-0.2.5.tgz", {}, "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow=="], + + "tmp-promise": ["tmp-promise@3.0.3", "https://registry.npmmirror.com/tmp-promise/-/tmp-promise-3.0.3.tgz", { "dependencies": { "tmp": "^0.2.0" } }, "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ=="], + + "toidentifier": ["toidentifier@1.0.1", "https://registry.npmmirror.com/toidentifier/-/toidentifier-1.0.1.tgz", {}, "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="], + + "truncate-utf8-bytes": ["truncate-utf8-bytes@1.0.2", "https://registry.npmmirror.com/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", { "dependencies": { "utf8-byte-length": "^1.0.1" } }, "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ=="], + + "ts-deepmerge": ["ts-deepmerge@7.0.3", "https://registry.npmmirror.com/ts-deepmerge/-/ts-deepmerge-7.0.3.tgz", {}, "sha512-Du/ZW2RfwV/D4cmA5rXafYjBQVuvu4qGiEEla4EmEHVHgRdx68Gftx7i66jn2bzHPwSVZY36Ae6OuDn9el4ZKA=="], + + "tsoa": ["tsoa@7.0.0-alpha.0", "https://registry.npmmirror.com/tsoa/-/tsoa-7.0.0-alpha.0.tgz", { "dependencies": { "@tsoa/cli": "^7.0.0-alpha.0", "@tsoa/runtime": "^7.0.0-alpha.0" }, "bin": { "tsoa": "dist/cli.js" } }, "sha512-o5h2DD1IKa2GF728BHYDL2uSX57a44sX8BLFScR4KbD0xlOmgsSDECneJmouDxf9MJdjHHWc+I1S3sGK82B6kQ=="], + + "tsx": ["tsx@4.21.0", "https://registry.npmmirror.com/tsx/-/tsx-4.21.0.tgz", { "dependencies": { "esbuild": "~0.27.0", "get-tsconfig": "^4.7.5" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "bin": { "tsx": "dist/cli.mjs" } }, "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw=="], + + "type-fest": ["type-fest@0.13.1", "https://registry.npmmirror.com/type-fest/-/type-fest-0.13.1.tgz", {}, "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg=="], + + "type-is": ["type-is@2.0.1", "https://registry.npmmirror.com/type-is/-/type-is-2.0.1.tgz", { "dependencies": { "content-type": "^1.0.5", "media-typer": "^1.1.0", "mime-types": "^3.0.0" } }, "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw=="], + + "typescript": ["typescript@5.9.3", "https://registry.npmmirror.com/typescript/-/typescript-5.9.3.tgz", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], + + "uglify-js": ["uglify-js@3.19.3", "https://registry.npmmirror.com/uglify-js/-/uglify-js-3.19.3.tgz", { "bin": { "uglifyjs": "bin/uglifyjs" } }, "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ=="], + + "undici-types": ["undici-types@7.16.0", "https://registry.npmmirror.com/undici-types/-/undici-types-7.16.0.tgz", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="], + + "unique-filename": ["unique-filename@4.0.0", "https://registry.npmmirror.com/unique-filename/-/unique-filename-4.0.0.tgz", { "dependencies": { "unique-slug": "^5.0.0" } }, "sha512-XSnEewXmQ+veP7xX2dS5Q4yZAvO40cBN2MWkJ7D/6sW4Dg6wYBNwM1Vrnz1FhH5AdeLIlUXRI9e28z1YZi71NQ=="], + + "unique-slug": ["unique-slug@5.0.0", "https://registry.npmmirror.com/unique-slug/-/unique-slug-5.0.0.tgz", { "dependencies": { "imurmurhash": "^0.1.4" } }, "sha512-9OdaqO5kwqR+1kVgHAhsp5vPNU0hnxRa26rBFNfNgM7M6pNtgzeBn3s/xbyCQL3dcjzOatcef6UUHpB/6MaETg=="], + + "universalify": ["universalify@2.0.1", "https://registry.npmmirror.com/universalify/-/universalify-2.0.1.tgz", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="], + + "unpipe": ["unpipe@1.0.0", "https://registry.npmmirror.com/unpipe/-/unpipe-1.0.0.tgz", {}, "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="], + + "uri-js": ["uri-js@4.4.1", "https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="], + + "utf8-byte-length": ["utf8-byte-length@1.0.5", "https://registry.npmmirror.com/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz", {}, "sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA=="], + + "util-deprecate": ["util-deprecate@1.0.2", "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], + + "utils-merge": ["utils-merge@1.0.1", "https://registry.npmmirror.com/utils-merge/-/utils-merge-1.0.1.tgz", {}, "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA=="], + + "validator": ["validator@13.15.26", "https://registry.npmmirror.com/validator/-/validator-13.15.26.tgz", {}, "sha512-spH26xU080ydGggxRyR1Yhcbgx+j3y5jbNXk/8L+iRvdIEQ4uTRH2Sgf2dokud6Q4oAtsbNvJ1Ft+9xmm6IZcA=="], + + "vary": ["vary@1.1.2", "https://registry.npmmirror.com/vary/-/vary-1.1.2.tgz", {}, "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="], + + "verror": ["verror@1.10.1", "https://registry.npmmirror.com/verror/-/verror-1.10.1.tgz", { "dependencies": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", "extsprintf": "^1.2.0" } }, "sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg=="], + + "wcwidth": ["wcwidth@1.0.1", "https://registry.npmmirror.com/wcwidth/-/wcwidth-1.0.1.tgz", { "dependencies": { "defaults": "^1.0.3" } }, "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg=="], + + "which": ["which@5.0.0", "https://registry.npmmirror.com/which/-/which-5.0.0.tgz", { "dependencies": { "isexe": "^3.1.1" }, "bin": { "node-which": "bin/which.js" } }, "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ=="], + + "wordwrap": ["wordwrap@1.0.0", "https://registry.npmmirror.com/wordwrap/-/wordwrap-1.0.0.tgz", {}, "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q=="], + + "wrap-ansi": ["wrap-ansi@7.0.0", "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], + + "wrap-ansi-cjs": ["wrap-ansi@7.0.0", "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], + + "wrappy": ["wrappy@1.0.2", "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], + + "xmlbuilder": ["xmlbuilder@15.1.1", "https://registry.npmmirror.com/xmlbuilder/-/xmlbuilder-15.1.1.tgz", {}, "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg=="], + + "y18n": ["y18n@5.0.8", "https://registry.npmmirror.com/y18n/-/y18n-5.0.8.tgz", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="], + + "yallist": ["yallist@4.0.0", "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], + + "yaml": ["yaml@2.8.2", "https://registry.npmmirror.com/yaml/-/yaml-2.8.2.tgz", { "bin": { "yaml": "bin.mjs" } }, "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A=="], + + "yargs": ["yargs@17.7.2", "https://registry.npmmirror.com/yargs/-/yargs-17.7.2.tgz", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], + + "yargs-parser": ["yargs-parser@21.1.1", "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-21.1.1.tgz", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], + + "yauzl": ["yauzl@2.10.0", "https://registry.npmmirror.com/yauzl/-/yauzl-2.10.0.tgz", { "dependencies": { "buffer-crc32": "~0.2.3", "fd-slicer": "~1.1.0" } }, "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g=="], + + "yocto-queue": ["yocto-queue@0.1.0", "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], + + "@electron/asar/glob": ["glob@7.2.3", "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], + + "@electron/asar/minimatch": ["minimatch@3.1.2", "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], + + "@electron/fuses/fs-extra": ["fs-extra@9.1.0", "https://registry.npmmirror.com/fs-extra/-/fs-extra-9.1.0.tgz", { "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ=="], + + "@electron/get/fs-extra": ["fs-extra@8.1.0", "https://registry.npmmirror.com/fs-extra/-/fs-extra-8.1.0.tgz", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g=="], + + "@electron/notarize/fs-extra": ["fs-extra@9.1.0", "https://registry.npmmirror.com/fs-extra/-/fs-extra-9.1.0.tgz", { "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ=="], + + "@electron/osx-sign/isbinaryfile": ["isbinaryfile@4.0.10", "https://registry.npmmirror.com/isbinaryfile/-/isbinaryfile-4.0.10.tgz", {}, "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw=="], + + "@electron/rebuild/semver": ["semver@7.7.3", "https://registry.npmmirror.com/semver/-/semver-7.7.3.tgz", { "bin": { "semver": "bin/semver.js" } }, "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q=="], + + "@electron/universal/fs-extra": ["fs-extra@11.3.3", "https://registry.npmmirror.com/fs-extra/-/fs-extra-11.3.3.tgz", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg=="], + + "@electron/universal/minimatch": ["minimatch@9.0.5", "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.5.tgz", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + + "@electron/windows-sign/fs-extra": ["fs-extra@11.3.3", "https://registry.npmmirror.com/fs-extra/-/fs-extra-11.3.3.tgz", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg=="], + + "@hapi/mimos/mime-db": ["mime-db@1.52.0", "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], + + "@isaacs/cliui/string-width": ["string-width@5.1.2", "https://registry.npmmirror.com/string-width/-/string-width-5.1.2.tgz", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], + + "@isaacs/cliui/strip-ansi": ["strip-ansi@7.1.2", "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-7.1.2.tgz", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], + + "@isaacs/cliui/wrap-ansi": ["wrap-ansi@8.1.0", "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="], + + "@isaacs/fs-minipass/minipass": ["minipass@7.1.2", "https://registry.npmmirror.com/minipass/-/minipass-7.1.2.tgz", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="], + + "@malept/flatpak-bundler/fs-extra": ["fs-extra@9.1.0", "https://registry.npmmirror.com/fs-extra/-/fs-extra-9.1.0.tgz", { "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ=="], + + "@npmcli/agent/lru-cache": ["lru-cache@10.4.3", "https://registry.npmmirror.com/lru-cache/-/lru-cache-10.4.3.tgz", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], + + "@npmcli/fs/semver": ["semver@7.7.3", "https://registry.npmmirror.com/semver/-/semver-7.7.3.tgz", { "bin": { "semver": "bin/semver.js" } }, "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q=="], + + "@tsoa/cli/fs-extra": ["fs-extra@11.3.3", "https://registry.npmmirror.com/fs-extra/-/fs-extra-11.3.3.tgz", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg=="], + + "@tsoa/cli/minimatch": ["minimatch@9.0.5", "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.5.tgz", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + + "@tsoa/runtime/express": ["express@4.22.1", "https://registry.npmmirror.com/express/-/express-4.22.1.tgz", { "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", "body-parser": "~1.20.3", "content-disposition": "~0.5.4", "content-type": "~1.0.4", "cookie": "~0.7.1", "cookie-signature": "~1.0.6", "debug": "2.6.9", "depd": "2.0.0", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", "finalhandler": "~1.3.1", "fresh": "~0.5.2", "http-errors": "~2.0.0", "merge-descriptors": "1.0.3", "methods": "~1.1.2", "on-finished": "~2.4.1", "parseurl": "~1.3.3", "path-to-regexp": "~0.1.12", "proxy-addr": "~2.0.7", "qs": "~6.14.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", "send": "~0.19.0", "serve-static": "~1.16.2", "setprototypeof": "1.2.0", "statuses": "~2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" } }, "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g=="], + + "@types/accepts/@types/node": ["@types/node@22.19.3", "https://registry.npmmirror.com/@types/node/-/node-22.19.3.tgz", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA=="], + + "@types/body-parser/@types/node": ["@types/node@22.19.3", "https://registry.npmmirror.com/@types/node/-/node-22.19.3.tgz", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA=="], + + "@types/connect/@types/node": ["@types/node@22.19.3", "https://registry.npmmirror.com/@types/node/-/node-22.19.3.tgz", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA=="], + + "@types/cookies/@types/node": ["@types/node@22.19.3", "https://registry.npmmirror.com/@types/node/-/node-22.19.3.tgz", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA=="], + + "@types/express-serve-static-core/@types/node": ["@types/node@22.19.3", "https://registry.npmmirror.com/@types/node/-/node-22.19.3.tgz", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA=="], + + "@types/koa/@types/node": ["@types/node@22.19.3", "https://registry.npmmirror.com/@types/node/-/node-22.19.3.tgz", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA=="], + + "@types/send/@types/node": ["@types/node@22.19.3", "https://registry.npmmirror.com/@types/node/-/node-22.19.3.tgz", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA=="], + + "@types/serve-static/@types/node": ["@types/node@22.19.3", "https://registry.npmmirror.com/@types/node/-/node-22.19.3.tgz", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA=="], + + "app-builder-lib/semver": ["semver@7.7.3", "https://registry.npmmirror.com/semver/-/semver-7.7.3.tgz", { "bin": { "semver": "bin/semver.js" } }, "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q=="], + + "body-parser/iconv-lite": ["iconv-lite@0.7.2", "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.7.2.tgz", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw=="], + + "bun-types/@types/node": ["@types/node@22.19.3", "https://registry.npmmirror.com/@types/node/-/node-22.19.3.tgz", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA=="], + + "cacache/fs-minipass": ["fs-minipass@3.0.3", "https://registry.npmmirror.com/fs-minipass/-/fs-minipass-3.0.3.tgz", { "dependencies": { "minipass": "^7.0.3" } }, "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw=="], + + "cacache/lru-cache": ["lru-cache@10.4.3", "https://registry.npmmirror.com/lru-cache/-/lru-cache-10.4.3.tgz", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], + + "cacache/minipass": ["minipass@7.1.2", "https://registry.npmmirror.com/minipass/-/minipass-7.1.2.tgz", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="], + + "cacache/tar": ["tar@7.5.2", "https://registry.npmmirror.com/tar/-/tar-7.5.2.tgz", { "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", "minipass": "^7.1.2", "minizlib": "^3.1.0", "yallist": "^5.0.0" } }, "sha512-7NyxrTE4Anh8km8iEy7o0QYPs+0JKBTj5ZaqHg6B39erLg0qYXN3BijtShwbsNSvQ+LN75+KV+C4QR/f6Gwnpg=="], + + "clone-response/mimic-response": ["mimic-response@1.0.1", "https://registry.npmmirror.com/mimic-response/-/mimic-response-1.0.1.tgz", {}, "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ=="], + + "cross-spawn/which": ["which@2.0.2", "https://registry.npmmirror.com/which/-/which-2.0.2.tgz", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], + + "dir-compare/minimatch": ["minimatch@3.1.2", "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], + + "electron/@types/node": ["@types/node@22.19.3", "https://registry.npmmirror.com/@types/node/-/node-22.19.3.tgz", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA=="], + + "electron-publish/mime": ["mime@2.6.0", "https://registry.npmmirror.com/mime/-/mime-2.6.0.tgz", { "bin": { "mime": "cli.js" } }, "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg=="], + + "electron-winstaller/fs-extra": ["fs-extra@7.0.1", "https://registry.npmmirror.com/fs-extra/-/fs-extra-7.0.1.tgz", { "dependencies": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw=="], + + "filelist/minimatch": ["minimatch@5.1.6", "https://registry.npmmirror.com/minimatch/-/minimatch-5.1.6.tgz", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g=="], + + "form-data/mime-types": ["mime-types@2.1.35", "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], + + "fs-minipass/minipass": ["minipass@3.3.6", "https://registry.npmmirror.com/minipass/-/minipass-3.3.6.tgz", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], + + "glob/minimatch": ["minimatch@9.0.5", "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.5.tgz", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + + "glob/minipass": ["minipass@7.1.2", "https://registry.npmmirror.com/minipass/-/minipass-7.1.2.tgz", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="], + + "global-agent/semver": ["semver@7.7.3", "https://registry.npmmirror.com/semver/-/semver-7.7.3.tgz", { "bin": { "semver": "bin/semver.js" } }, "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q=="], + + "hosted-git-info/lru-cache": ["lru-cache@6.0.0", "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="], + + "make-fetch-happen/minipass": ["minipass@7.1.2", "https://registry.npmmirror.com/minipass/-/minipass-7.1.2.tgz", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="], + + "minipass-collect/minipass": ["minipass@7.1.2", "https://registry.npmmirror.com/minipass/-/minipass-7.1.2.tgz", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="], + + "minipass-fetch/minipass": ["minipass@7.1.2", "https://registry.npmmirror.com/minipass/-/minipass-7.1.2.tgz", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="], + + "minipass-fetch/minizlib": ["minizlib@3.1.0", "https://registry.npmmirror.com/minizlib/-/minizlib-3.1.0.tgz", { "dependencies": { "minipass": "^7.1.2" } }, "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw=="], + + "minipass-flush/minipass": ["minipass@3.3.6", "https://registry.npmmirror.com/minipass/-/minipass-3.3.6.tgz", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], + + "minipass-pipeline/minipass": ["minipass@3.3.6", "https://registry.npmmirror.com/minipass/-/minipass-3.3.6.tgz", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], + + "minipass-sized/minipass": ["minipass@3.3.6", "https://registry.npmmirror.com/minipass/-/minipass-3.3.6.tgz", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], + + "minizlib/minipass": ["minipass@3.3.6", "https://registry.npmmirror.com/minipass/-/minipass-3.3.6.tgz", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], + + "node-abi/semver": ["semver@7.7.3", "https://registry.npmmirror.com/semver/-/semver-7.7.3.tgz", { "bin": { "semver": "bin/semver.js" } }, "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q=="], + + "node-api-version/semver": ["semver@7.7.3", "https://registry.npmmirror.com/semver/-/semver-7.7.3.tgz", { "bin": { "semver": "bin/semver.js" } }, "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q=="], + + "node-gyp/semver": ["semver@7.7.3", "https://registry.npmmirror.com/semver/-/semver-7.7.3.tgz", { "bin": { "semver": "bin/semver.js" } }, "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q=="], + + "node-gyp/tar": ["tar@7.5.2", "https://registry.npmmirror.com/tar/-/tar-7.5.2.tgz", { "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", "minipass": "^7.1.2", "minizlib": "^3.1.0", "yallist": "^5.0.0" } }, "sha512-7NyxrTE4Anh8km8iEy7o0QYPs+0JKBTj5ZaqHg6B39erLg0qYXN3BijtShwbsNSvQ+LN75+KV+C4QR/f6Gwnpg=="], + + "path-scurry/lru-cache": ["lru-cache@10.4.3", "https://registry.npmmirror.com/lru-cache/-/lru-cache-10.4.3.tgz", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], + + "path-scurry/minipass": ["minipass@7.1.2", "https://registry.npmmirror.com/minipass/-/minipass-7.1.2.tgz", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="], + + "postject/commander": ["commander@9.5.0", "https://registry.npmmirror.com/commander/-/commander-9.5.0.tgz", {}, "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ=="], + + "raw-body/iconv-lite": ["iconv-lite@0.7.2", "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.7.2.tgz", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw=="], + + "restore-cursor/signal-exit": ["signal-exit@3.0.7", "https://registry.npmmirror.com/signal-exit/-/signal-exit-3.0.7.tgz", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], + + "rimraf/glob": ["glob@7.2.3", "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], + + "router/path-to-regexp": ["path-to-regexp@8.3.0", "https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-8.3.0.tgz", {}, "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA=="], + + "simple-update-notifier/semver": ["semver@7.7.3", "https://registry.npmmirror.com/semver/-/semver-7.7.3.tgz", { "bin": { "semver": "bin/semver.js" } }, "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q=="], + + "ssri/minipass": ["minipass@7.1.2", "https://registry.npmmirror.com/minipass/-/minipass-7.1.2.tgz", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="], + + "temp/mkdirp": ["mkdirp@0.5.6", "https://registry.npmmirror.com/mkdirp/-/mkdirp-0.5.6.tgz", { "dependencies": { "minimist": "^1.2.6" }, "bin": { "mkdirp": "bin/cmd.js" } }, "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw=="], + + "tiny-async-pool/semver": ["semver@5.7.2", "https://registry.npmmirror.com/semver/-/semver-5.7.2.tgz", { "bin": { "semver": "bin/semver" } }, "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g=="], + + "@electron/asar/minimatch/brace-expansion": ["brace-expansion@1.1.12", "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.12.tgz", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], + + "@electron/get/fs-extra/jsonfile": ["jsonfile@4.0.0", "https://registry.npmmirror.com/jsonfile/-/jsonfile-4.0.0.tgz", { "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg=="], + + "@electron/get/fs-extra/universalify": ["universalify@0.1.2", "https://registry.npmmirror.com/universalify/-/universalify-0.1.2.tgz", {}, "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="], + + "@isaacs/cliui/string-width/emoji-regex": ["emoji-regex@9.2.2", "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-9.2.2.tgz", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], + + "@isaacs/cliui/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-6.2.2.tgz", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], + + "@isaacs/cliui/wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-6.2.3.tgz", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + + "@tsoa/runtime/express/accepts": ["accepts@1.3.8", "https://registry.npmmirror.com/accepts/-/accepts-1.3.8.tgz", { "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" } }, "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw=="], + + "@tsoa/runtime/express/body-parser": ["body-parser@1.20.4", "https://registry.npmmirror.com/body-parser/-/body-parser-1.20.4.tgz", { "dependencies": { "bytes": "~3.1.2", "content-type": "~1.0.5", "debug": "2.6.9", "depd": "2.0.0", "destroy": "~1.2.0", "http-errors": "~2.0.1", "iconv-lite": "~0.4.24", "on-finished": "~2.4.1", "qs": "~6.14.0", "raw-body": "~2.5.3", "type-is": "~1.6.18", "unpipe": "~1.0.0" } }, "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA=="], + + "@tsoa/runtime/express/content-disposition": ["content-disposition@0.5.4", "https://registry.npmmirror.com/content-disposition/-/content-disposition-0.5.4.tgz", { "dependencies": { "safe-buffer": "5.2.1" } }, "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ=="], + + "@tsoa/runtime/express/cookie-signature": ["cookie-signature@1.0.7", "https://registry.npmmirror.com/cookie-signature/-/cookie-signature-1.0.7.tgz", {}, "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA=="], + + "@tsoa/runtime/express/debug": ["debug@2.6.9", "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], + + "@tsoa/runtime/express/finalhandler": ["finalhandler@1.3.2", "https://registry.npmmirror.com/finalhandler/-/finalhandler-1.3.2.tgz", { "dependencies": { "debug": "2.6.9", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "on-finished": "~2.4.1", "parseurl": "~1.3.3", "statuses": "~2.0.2", "unpipe": "~1.0.0" } }, "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg=="], + + "@tsoa/runtime/express/fresh": ["fresh@0.5.2", "https://registry.npmmirror.com/fresh/-/fresh-0.5.2.tgz", {}, "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q=="], + + "@tsoa/runtime/express/merge-descriptors": ["merge-descriptors@1.0.3", "https://registry.npmmirror.com/merge-descriptors/-/merge-descriptors-1.0.3.tgz", {}, "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ=="], + + "@tsoa/runtime/express/send": ["send@0.19.2", "https://registry.npmmirror.com/send/-/send-0.19.2.tgz", { "dependencies": { "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "~0.5.2", "http-errors": "~2.0.1", "mime": "1.6.0", "ms": "2.1.3", "on-finished": "~2.4.1", "range-parser": "~1.2.1", "statuses": "~2.0.2" } }, "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg=="], + + "@tsoa/runtime/express/serve-static": ["serve-static@1.16.3", "https://registry.npmmirror.com/serve-static/-/serve-static-1.16.3.tgz", { "dependencies": { "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", "send": "~0.19.1" } }, "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA=="], + + "@tsoa/runtime/express/type-is": ["type-is@1.6.18", "https://registry.npmmirror.com/type-is/-/type-is-1.6.18.tgz", { "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" } }, "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g=="], + + "@types/accepts/@types/node/undici-types": ["undici-types@6.21.0", "https://registry.npmmirror.com/undici-types/-/undici-types-6.21.0.tgz", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="], + + "@types/body-parser/@types/node/undici-types": ["undici-types@6.21.0", "https://registry.npmmirror.com/undici-types/-/undici-types-6.21.0.tgz", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="], + + "@types/connect/@types/node/undici-types": ["undici-types@6.21.0", "https://registry.npmmirror.com/undici-types/-/undici-types-6.21.0.tgz", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="], + + "@types/cookies/@types/node/undici-types": ["undici-types@6.21.0", "https://registry.npmmirror.com/undici-types/-/undici-types-6.21.0.tgz", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="], + + "@types/express-serve-static-core/@types/node/undici-types": ["undici-types@6.21.0", "https://registry.npmmirror.com/undici-types/-/undici-types-6.21.0.tgz", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="], + + "@types/koa/@types/node/undici-types": ["undici-types@6.21.0", "https://registry.npmmirror.com/undici-types/-/undici-types-6.21.0.tgz", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="], + + "@types/send/@types/node/undici-types": ["undici-types@6.21.0", "https://registry.npmmirror.com/undici-types/-/undici-types-6.21.0.tgz", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="], + + "@types/serve-static/@types/node/undici-types": ["undici-types@6.21.0", "https://registry.npmmirror.com/undici-types/-/undici-types-6.21.0.tgz", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="], + + "bun-types/@types/node/undici-types": ["undici-types@6.21.0", "https://registry.npmmirror.com/undici-types/-/undici-types-6.21.0.tgz", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="], + + "cacache/tar/chownr": ["chownr@3.0.0", "https://registry.npmmirror.com/chownr/-/chownr-3.0.0.tgz", {}, "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g=="], + + "cacache/tar/minizlib": ["minizlib@3.1.0", "https://registry.npmmirror.com/minizlib/-/minizlib-3.1.0.tgz", { "dependencies": { "minipass": "^7.1.2" } }, "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw=="], + + "cacache/tar/yallist": ["yallist@5.0.0", "https://registry.npmmirror.com/yallist/-/yallist-5.0.0.tgz", {}, "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw=="], + + "cross-spawn/which/isexe": ["isexe@2.0.0", "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + + "dir-compare/minimatch/brace-expansion": ["brace-expansion@1.1.12", "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.12.tgz", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], + + "electron-winstaller/fs-extra/jsonfile": ["jsonfile@4.0.0", "https://registry.npmmirror.com/jsonfile/-/jsonfile-4.0.0.tgz", { "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg=="], + + "electron-winstaller/fs-extra/universalify": ["universalify@0.1.2", "https://registry.npmmirror.com/universalify/-/universalify-0.1.2.tgz", {}, "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="], + + "electron/@types/node/undici-types": ["undici-types@6.21.0", "https://registry.npmmirror.com/undici-types/-/undici-types-6.21.0.tgz", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="], + + "form-data/mime-types/mime-db": ["mime-db@1.52.0", "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], + + "node-gyp/tar/chownr": ["chownr@3.0.0", "https://registry.npmmirror.com/chownr/-/chownr-3.0.0.tgz", {}, "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g=="], + + "node-gyp/tar/minipass": ["minipass@7.1.2", "https://registry.npmmirror.com/minipass/-/minipass-7.1.2.tgz", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="], + + "node-gyp/tar/minizlib": ["minizlib@3.1.0", "https://registry.npmmirror.com/minizlib/-/minizlib-3.1.0.tgz", { "dependencies": { "minipass": "^7.1.2" } }, "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw=="], + + "node-gyp/tar/yallist": ["yallist@5.0.0", "https://registry.npmmirror.com/yallist/-/yallist-5.0.0.tgz", {}, "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw=="], + + "rimraf/glob/minimatch": ["minimatch@3.1.2", "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], + + "@tsoa/runtime/express/accepts/mime-types": ["mime-types@2.1.35", "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], + + "@tsoa/runtime/express/accepts/negotiator": ["negotiator@0.6.3", "https://registry.npmmirror.com/negotiator/-/negotiator-0.6.3.tgz", {}, "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="], + + "@tsoa/runtime/express/body-parser/iconv-lite": ["iconv-lite@0.4.24", "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.4.24.tgz", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3" } }, "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA=="], + + "@tsoa/runtime/express/body-parser/raw-body": ["raw-body@2.5.3", "https://registry.npmmirror.com/raw-body/-/raw-body-2.5.3.tgz", { "dependencies": { "bytes": "~3.1.2", "http-errors": "~2.0.1", "iconv-lite": "~0.4.24", "unpipe": "~1.0.0" } }, "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA=="], + + "@tsoa/runtime/express/debug/ms": ["ms@2.0.0", "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], + + "@tsoa/runtime/express/type-is/media-typer": ["media-typer@0.3.0", "https://registry.npmmirror.com/media-typer/-/media-typer-0.3.0.tgz", {}, "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ=="], + + "@tsoa/runtime/express/type-is/mime-types": ["mime-types@2.1.35", "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], + + "rimraf/glob/minimatch/brace-expansion": ["brace-expansion@1.1.12", "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.12.tgz", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], + + "@tsoa/runtime/express/accepts/mime-types/mime-db": ["mime-db@1.52.0", "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], + + "@tsoa/runtime/express/type-is/mime-types/mime-db": ["mime-db@1.52.0", "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], + } +} diff --git a/src/mtran/vendor/mtranserver/compose.yml b/src/mtran/vendor/mtranserver/compose.yml new file mode 100644 index 0000000..15ba06e --- /dev/null +++ b/src/mtran/vendor/mtranserver/compose.yml @@ -0,0 +1,21 @@ +services: + mtranserver: + image: xxnuo/mtranserver:latest + container_name: mtranserver + restart: unless-stopped + ports: + - "8989:8989" + environment: + - MT_HOST=0.0.0.0 + - MT_PORT=8989 + - MT_ENABLE_UI=true + - MT_OFFLINE=false + # - MT_API_TOKEN=your_secret_token_here # 取消注释以启用 API 认证 + volumes: + - ./models:/app/models # 翻译模型目录 + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:8989/health"] + interval: 30s + timeout: 3s + retries: 3 + start_period: 5s diff --git a/src/mtran/vendor/mtranserver/deprecated/cpp/README.md b/src/mtran/vendor/mtranserver/deprecated/cpp/README.md new file mode 100644 index 0000000..ab5835a --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/cpp/README.md @@ -0,0 +1,3 @@ +# C++ version (deprecated) + +Origianl version ( ~ v2.1.1 ) is deprecated, continue to develop in [golang version](https://github.com/xxnuo/MTranServer) diff --git a/src/mtran/vendor/mtranserver/deprecated/go/CHANGELOG.md b/src/mtran/vendor/mtranserver/deprecated/go/CHANGELOG.md new file mode 100644 index 0000000..ad1da90 --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/go/CHANGELOG.md @@ -0,0 +1,7 @@ +v3.2.1 +- 重构进程守护,解决进程残留问题 +- 添加 workers-per-language 参数,支持每个语言启动多个 worker 进程,默认 1 +- 降低 worker 空闲超时时间,默认 60 秒 + +历史更新内容请参考 [HISTORY.md](HISTORY.md) +For historical update content, please refer to [HISTORY.md](HISTORY.md) diff --git a/src/mtran/vendor/mtranserver/deprecated/go/Dockerfile b/src/mtran/vendor/mtranserver/deprecated/go/Dockerfile new file mode 100644 index 0000000..bd92c88 --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/go/Dockerfile @@ -0,0 +1,76 @@ +# Build stage +FROM golang:1.25.3-bookworm AS builder + +# Install build dependencies +RUN apt-get update && \ + apt-get install -y --no-install-recommends git make curl && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* + +WORKDIR /build + +# Copy go mod files +COPY go.mod go.sum ./ +RUN go mod download + +# Copy source code (UI dist should be pre-built and copied) +COPY . . + +# Download resources +RUN make download + +# Verify required files exist (should be prepared before docker build) +RUN echo "Verifying build prerequisites..." && \ + if [ ! -f "ui/dist/index.html" ]; then \ + echo "ERROR: ui/dist/index.html not found!"; \ + exit 1; \ + fi && \ + if [ ! -f "bin/worker" ]; then \ + echo "ERROR: bin/worker not found!"; \ + exit 1; \ + fi && \ + if [ ! -f "internal/docs/swagger.json" ]; then \ + echo "ERROR: internal/docs/swagger.json not found!"; \ + exit 1; \ + fi && \ + echo "✓ All prerequisites verified" + +# Build binary +ARG VERSION=dev +RUN CGO_ENABLED=0 GOOS=linux go build \ + -ldflags "-X github.com/xxnuo/MTranServer/internal/version.Version=${VERSION} -s -w" \ + -o mtranserver \ + ./cmd/mtranserver + +# Runtime stage +FROM alpine:latest + +# Install runtime dependencies +RUN apk add --no-cache ca-certificates tzdata curl + +WORKDIR /app + +# Copy binary from builder +COPY --from=builder /build/mtranserver /app/mtranserver + +# Create directories for data and models +RUN mkdir -p /app/data /app/models + +# Expose port +EXPOSE 8989 + +# Health check +HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \ + CMD curl -f http://localhost:8989/health || exit 1 + +# Set default environment variables +ENV MT_HOST=0.0.0.0 \ + MT_PORT=8989 \ + MT_LOG_LEVEL=warn \ + MT_CONFIG_DIR=/app/data \ + MT_MODEL_DIR=/app/models \ + MT_ENABLE_UI=true \ + MT_OFFLINE=false + +# Run the application +CMD ["/app/mtranserver"] diff --git a/src/mtran/vendor/mtranserver/deprecated/go/HISTORY.md b/src/mtran/vendor/mtranserver/deprecated/go/HISTORY.md new file mode 100644 index 0000000..ea7e71f --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/go/HISTORY.md @@ -0,0 +1,71 @@ +v3.2.1 +- 重构进程守护,解决进程残留问题 +- 添加 workers-per-language 参数,支持每个语言启动多个 worker 进程,默认 1 +- 降低 worker 空闲超时时间,默认 60 秒 + +v3.1.23 +- 发布稳定版 +- Release stable version + +v3.1.22 +- 增强语言检测:支持混合脚本检测、置信度评分、动态语言支持 +- 优化相邻语言段合并逻辑,提升检测准确性 +- 添加内存监控功能 +- 改进 worker 停止和清理逻辑 +- /imme 接口默认启用 isHTML +- 日志支持彩色输出 +- Enhance language detection: support mixed script detection, confidence scoring, dynamic language support +- Optimize merging of adjacent language segments for improved detection accuracy +- Add memory monitoring +- Improve worker stop and cleanup logic +- Default enable isHTML for /imme endpoint +- Add color support for logger + +v3.1.21 +- 修复格式对齐问题 +- Fix format alignment issue + +v3.1.20 +- 添加 worker 版本信息 +- Add worker version info + +v3.1.19 +- 支持检测和翻译文本中的多语言段落 +- 实现分段翻译以改进错误处理 +- 增强 Compute 方法的连接错误检查 +- 移除 emoji 处理(已移至 MTranCore) +- 添加服务脚本 +- Support detecting and translating multiple language segments in text +- Implement segmented translation for improved error handling +- Enhance connection error checks in Compute method +- Remove emoji handling (moved to MTranCore) +- Add service script + +v3.1.18 +- 修复网页界面类型问题 +- Fix web interface type issue + +v3.1.17 +- 改进网页界面,添加语言名称国际化 +- Improve web interface with language name i18n + +v3.1.16 +- 改进网页界面:添加语言名称、历史记录、工具按钮等 +- Improve the web interface: add language names, history records, tool buttons, etc. + +v3.1.15 +- 修复下载模型提示校验失败的问题 +- Fix the issue of model download verification failure + +v3.1.14 +- 工作时自动下载使用最新版本的模型,无需手动下载(离线模式则不会更新) +- Auto download the latest version of the model when working, no need to manually download (offline mode will not update) + +v3.1.13 +- 添加详细日志,方便调试 +- Add detailed logs for debugging + +v3.1.12 + +- 修复高并发情况下翻译结果错乱的 Bug +- Fix: High concurrency translation result confusion bug \ No newline at end of file diff --git a/src/mtran/vendor/mtranserver/deprecated/go/Makefile b/src/mtran/vendor/mtranserver/deprecated/go/Makefile new file mode 100644 index 0000000..c60f4aa --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/go/Makefile @@ -0,0 +1,59 @@ +.PHONY: build-ui download download-core download-records generate-docs + +# Detect OS and architecture +GOOS ?= $(shell go env GOOS) +GOARCH ?= $(shell go env GOARCH) + +# Set binary suffix for Windows, js +ifeq ($(GOOS),windows) + SUFFIX := .exe +else ifeq ($(GOOS),js) + SUFFIX := .wasm +else + SUFFIX := +endif + +# GitHub release URL +GITHUB_REPO := xxnuo/MTranCore +RELEASE_TAG := latest +WORKER_BINARY := worker-$(GOOS)-$(GOARCH)$(SUFFIX) +DOWNLOAD_URL := https://github.com/$(GITHUB_REPO)/releases/latest/download/$(WORKER_BINARY) + +# Download core binary from https://github.com/xxnuo/MTranCore/releases/latest +# Support: linux-amd64, linux-arm64, linux-386, windows-amd64, darwin-amd64, darwin-arm64 +# Extra: js-wasm +download-core: + touch ./bin/worker + @TARGET_GOOS=$(GOOS) TARGET_GOARCH=$(GOARCH) GOOS= GOARCH= go generate ./bin + @echo "Downloaded core binary from repository successfully" + +download-records: + touch ./data/records.json + @GOOS= GOARCH= go generate ./data + @echo "Generated records hash successfully" + +download: download-core download-records + @echo "Downloaded successfully" + +generate-docs: + @echo "Generating docs..." + @GOOS= GOARCH= go run github.com/swaggo/swag/cmd/swag@latest init -d ./cmd/mtranserver,./internal/handlers,./internal/models -g main.go -o ./internal/docs + @echo "Docs generated successfully" + +build-ui: + @echo "Building UI..." + @cd ui && pnpm install && pnpm build + @echo "UI built successfully" + +# Get version from git tag +VERSION ?= $(shell git describe --tags --always --dirty 2>/dev/null || echo "v0.0.0-dev") +LDFLAGS := -X github.com/xxnuo/MTranServer/internal/version.Version=$(VERSION) + +build: generate-docs + @echo "Building version $(VERSION)..." + @go build -ldflags "$(LDFLAGS)" -o ./dist/mtranserver-$(GOOS)-$(GOARCH)$(SUFFIX) ./cmd/mtranserver + @echo "Built successfully" + +dev: generate-docs + @echo "Building version $(VERSION)..." + MT_LOG_LEVEL=debug MT_ENABLE_UI=true go run -ldflags "$(LDFLAGS)" ./cmd/mtranserver/main.go diff --git a/src/mtran/vendor/mtranserver/deprecated/go/README.md b/src/mtran/vendor/mtranserver/deprecated/go/README.md new file mode 100644 index 0000000..0f7d6da --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/go/README.md @@ -0,0 +1,3 @@ +# Golang version + +The WASM runtime and glue code will panic in high concurrency, so it is temporarily abandoned, and the Node.js version is used. \ No newline at end of file diff --git a/src/mtran/vendor/mtranserver/deprecated/go/bin/bin.go b/src/mtran/vendor/mtranserver/deprecated/go/bin/bin.go new file mode 100644 index 0000000..f5c89e3 --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/go/bin/bin.go @@ -0,0 +1,11 @@ +package bin + +import ( + _ "embed" +) + +//go:embed worker +var WorkerBinary []byte + +//go:embed worker.version +var WorkerVersion string diff --git a/src/mtran/vendor/mtranserver/deprecated/go/bin/bin_hash.go b/src/mtran/vendor/mtranserver/deprecated/go/bin/bin_hash.go new file mode 100644 index 0000000..f4f7579 --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/go/bin/bin_hash.go @@ -0,0 +1,4 @@ +// Code generated by go generate; DO NOT EDIT. +package bin + +const WorkerHash = "51d403e9477bad177fb74eaa4a936b40fb16697eb702e8a8c3b7157e896f829a" diff --git a/src/mtran/vendor/mtranserver/deprecated/go/bin/gen_hash.go b/src/mtran/vendor/mtranserver/deprecated/go/bin/gen_hash.go new file mode 100644 index 0000000..c3ff99b --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/go/bin/gen_hash.go @@ -0,0 +1,42 @@ +//go:build ignore + +package main + +import ( + "crypto/sha256" + "encoding/hex" + "log" + "os" + "text/template" +) + +const OutputPath = "bin_hash.go" +const Template = `// Code generated by go generate; DO NOT EDIT. +package bin + +const WorkerHash = "{{.Hash}}" +` + +func main() { + data, err := os.ReadFile("worker") + if err != nil { + log.Fatalf("Failed to read worker file: %v", err) + } + + hashBytes := sha256.Sum256(data) + hashString := hex.EncodeToString(hashBytes[:]) + + f, err := os.Create(OutputPath) + if err != nil { + log.Fatalf("Failed to create output file: %v", err) + } + defer f.Close() + + t := template.Must(template.New("hash").Parse(Template)) + err = t.Execute(f, struct{ Hash string }{Hash: hashString}) + if err != nil { + log.Fatalf("Failed to execute template: %v", err) + } + + log.Printf("Successfully generated %s, WorkerHash: %s", OutputPath, hashString) +} diff --git a/src/mtran/vendor/mtranserver/deprecated/go/bin/gen_update.go b/src/mtran/vendor/mtranserver/deprecated/go/bin/gen_update.go new file mode 100644 index 0000000..f98fe6b --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/go/bin/gen_update.go @@ -0,0 +1,113 @@ +//go:build ignore + +package main + +import ( + "context" + "fmt" + "log" + "net/http" + "os" + "runtime" + "strings" + + "github.com/xxnuo/MTranServer/internal/downloader" +) + +const ( + GithubRepo = "xxnuo/MTranCore" + ReleaseTag = "latest" +) + +func getLatestVersion() (string, error) { + url := fmt.Sprintf("https://github.com/%s/releases/%s", GithubRepo, ReleaseTag) + + client := &http.Client{ + CheckRedirect: func(req *http.Request, via []*http.Request) error { + return http.ErrUseLastResponse + }, + } + + resp, err := client.Get(url) + if err != nil { + return "", err + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusFound && resp.StatusCode != http.StatusMovedPermanently { + return "", fmt.Errorf("unexpected status code: %d", resp.StatusCode) + } + + location := resp.Header.Get("Location") + if location == "" { + return "", fmt.Errorf("no location header found") + } + + parts := strings.Split(location, "/") + if len(parts) < 2 { + return "", fmt.Errorf("invalid location format: %s", location) + } + + version := parts[len(parts)-1] + return version, nil +} + +func main() { + goos := os.Getenv("TARGET_GOOS") + goarch := os.Getenv("TARGET_GOARCH") + if goos == "" { + goos = runtime.GOOS + } + if goarch == "" { + goarch = runtime.GOARCH + } + + var suffix string + switch goos { + case "windows": + suffix = ".exe" + case "js": + suffix = ".wasm" + default: + suffix = "" + } + + version, err := getLatestVersion() + if err != nil { + log.Fatalf("Failed to get latest version: %v", err) + } + log.Printf("Latest MTranCore version: %s", version) + + workerBinary := fmt.Sprintf("worker-%s-%s%s", goos, goarch, suffix) + downloadURL := fmt.Sprintf("https://github.com/%s/releases/download/%s/%s", GithubRepo, version, workerBinary) + + log.Printf("Detecting platform: %s-%s", goos, goarch) + log.Printf("Downloading %s from %s...", workerBinary, downloadURL) + + if err := os.MkdirAll(".", 0755); err != nil { + log.Fatalf("Failed to create bin directory: %v", err) + } + + targetFile := "worker" + os.Remove(targetFile) + + d := downloader.New(".") + if err := d.Download(downloadURL, targetFile, &downloader.DownloadOptions{ + Context: context.Background(), + Overwrite: true, + }); err != nil { + log.Fatalf("Failed to download worker binary: %v", err) + } + + if err := os.Chmod(targetFile, 0755); err != nil { + log.Printf("Warning: Failed to set executable permission: %v", err) + } + + log.Printf("Downloaded successfully to %s", targetFile) + + versionFile := "worker.version" + if err := os.WriteFile(versionFile, []byte(version), 0644); err != nil { + log.Fatalf("Failed to write version file: %v", err) + } + log.Printf("Version %s written to %s", version, versionFile) +} diff --git a/src/mtran/vendor/mtranserver/deprecated/go/bin/utils.go b/src/mtran/vendor/mtranserver/deprecated/go/bin/utils.go new file mode 100644 index 0000000..c72f0aa --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/go/bin/utils.go @@ -0,0 +1,14 @@ +package bin + +import "crypto/sha256" + +//go:generate go run gen_update.go +//go:generate go run gen_hash.go + +func GetWorkerInfo() (hash string, size int) { + return WorkerHash, len(WorkerBinary) +} + +func ComputeHash(data []byte) [32]byte { + return sha256.Sum256(data) +} diff --git a/src/mtran/vendor/mtranserver/deprecated/go/bin/worker.version b/src/mtran/vendor/mtranserver/deprecated/go/bin/worker.version new file mode 100644 index 0000000..edd4c8c --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/go/bin/worker.version @@ -0,0 +1 @@ +v3.2.1 \ No newline at end of file diff --git a/src/mtran/vendor/mtranserver/deprecated/go/cmd/mtranserver/main.go b/src/mtran/vendor/mtranserver/deprecated/go/cmd/mtranserver/main.go new file mode 100644 index 0000000..ceaa1db --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/go/cmd/mtranserver/main.go @@ -0,0 +1,82 @@ +package main + +import ( + "flag" + "fmt" + "os" + + "github.com/xxnuo/MTranServer/internal/config" + "github.com/xxnuo/MTranServer/internal/logger" + "github.com/xxnuo/MTranServer/internal/server" + "github.com/xxnuo/MTranServer/internal/services" + "github.com/xxnuo/MTranServer/internal/version" +) + +// @title MTranServer API +// @version 3.0.0 +// @description 超低资源消耗超快的离线翻译服务器 API +// @termsOfService https://github.com/xxnuo/MTranServer + +// @contact.name API Support +// @contact.url https://github.com/xxnuo/MTranServer/issues + +// @license.name Apache 2.0 +// @license.url https://github.com/xxnuo/MTranServer/blob/main/LICENSE + +// @host localhost:8989 +// @BasePath / + +// @securityDefinitions.apikey ApiKeyAuth +// @in header +// @name Authorization + +// @securityDefinitions.apikey ApiKeyQuery +// @in query +// @name token + +func main() { + + versionFlag := flag.Bool("version", false, "Show version information") + versionShortFlag := flag.Bool("v", false, "Show version information (shorthand)") + + flag.Usage = func() { + fmt.Fprintf(os.Stderr, "MTranServer %s - Ultra-low resource consumption, ultra-fast offline translation server\n\n", version.GetVersion()) + fmt.Fprintf(os.Stderr, "Usage:\n") + fmt.Fprintf(os.Stderr, " %s [options]\n\n", os.Args[0]) + fmt.Fprintf(os.Stderr, "Options:\n") + flag.PrintDefaults() + fmt.Fprintf(os.Stderr, "\nEnvironment Variables:\n") + fmt.Fprintf(os.Stderr, " MT_LOG_LEVEL Log level (debug, info, warn, error)\n") + fmt.Fprintf(os.Stderr, " MT_CONFIG_DIR Configuration directory\n") + fmt.Fprintf(os.Stderr, " MT_MODEL_DIR Model directory\n") + fmt.Fprintf(os.Stderr, " MT_HOST Server host address\n") + fmt.Fprintf(os.Stderr, " MT_PORT Server port\n") + fmt.Fprintf(os.Stderr, " MT_ENABLE_UI Enable Web UI (true/false)\n") + fmt.Fprintf(os.Stderr, " MT_OFFLINE Enable offline mode (true/false)\n") + fmt.Fprintf(os.Stderr, " MT_WORKER_IDLE_TIMEOUT Worker idle timeout in seconds\n") + fmt.Fprintf(os.Stderr, " MT_API_TOKEN API access token\n") + fmt.Fprintf(os.Stderr, "\nExamples:\n") + fmt.Fprintf(os.Stderr, " %s --host 127.0.0.1 --port 8080\n", os.Args[0]) + fmt.Fprintf(os.Stderr, " %s --ui --offline\n", os.Args[0]) + fmt.Fprintf(os.Stderr, " MT_PORT=9000 %s\n", os.Args[0]) + fmt.Fprintf(os.Stderr, "\nMore information: https://github.com/xxnuo/MTranServer\n") + } + + cfg := config.GetConfig() + + flag.Parse() + + logger.SetLevel(cfg.LogLevel) + + if *versionFlag || *versionShortFlag { + fmt.Printf("MTranServer %s\n", version.GetVersion()) + fmt.Printf("MTranCore v%s\n", version.GetWorkerVersion()) + os.Exit(0) + } + + if err := server.Run(); err != nil { + logger.Fatal("Server error: %v", err) + } + + services.CleanupAllEngines() +} diff --git a/src/mtran/vendor/mtranserver/deprecated/go/data/data.go b/src/mtran/vendor/mtranserver/deprecated/go/data/data.go new file mode 100644 index 0000000..5788f7b --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/go/data/data.go @@ -0,0 +1,8 @@ +package data + +import ( + _ "embed" +) + +//go:embed records.json +var RecordsJson []byte diff --git a/src/mtran/vendor/mtranserver/deprecated/go/data/data_hash.go b/src/mtran/vendor/mtranserver/deprecated/go/data/data_hash.go new file mode 100644 index 0000000..2f5809d --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/go/data/data_hash.go @@ -0,0 +1,4 @@ +// Code generated by go generate; DO NOT EDIT. +package data + +const RecordsHash = "3b6ec5c8035fadd7feffe109319a8d5a874f56035bbde884ccfdb5e8b00237f5" diff --git a/src/mtran/vendor/mtranserver/deprecated/go/data/gen_hash.go b/src/mtran/vendor/mtranserver/deprecated/go/data/gen_hash.go new file mode 100644 index 0000000..d1f9d90 --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/go/data/gen_hash.go @@ -0,0 +1,42 @@ +//go:build ignore + +package main + +import ( + "crypto/sha256" + "encoding/hex" + "log" + "os" + "text/template" +) + +const OutputPath = "data_hash.go" +const Template = `// Code generated by go generate; DO NOT EDIT. +package data + +const RecordsHash = "{{.Hash}}" +` + +func main() { + data, err := os.ReadFile("records.json") + if err != nil { + log.Fatalf("Failed to read records.json file: %v", err) + } + + hashBytes := sha256.Sum256(data) + hashString := hex.EncodeToString(hashBytes[:]) + + f, err := os.Create(OutputPath) + if err != nil { + log.Fatalf("Failed to create output file: %v", err) + } + defer f.Close() + + t := template.Must(template.New("hash").Parse(Template)) + err = t.Execute(f, struct{ Hash string }{Hash: hashString}) + if err != nil { + log.Fatalf("Failed to execute template: %v", err) + } + + log.Printf("Successfully generated %s, RecordsHash: %s", OutputPath, hashString) +} diff --git a/src/mtran/vendor/mtranserver/deprecated/go/data/gen_update.go b/src/mtran/vendor/mtranserver/deprecated/go/data/gen_update.go new file mode 100644 index 0000000..5355be4 --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/go/data/gen_update.go @@ -0,0 +1,26 @@ +//go:build ignore + +package main + +import ( + "context" + "log" + + "github.com/xxnuo/MTranServer/internal/downloader" + "github.com/xxnuo/MTranServer/internal/models" +) + +func main() { + log.Printf("Downloading records.json from %s...", models.RecordsUrl) + + d := downloader.New(".") + err := d.Download(models.RecordsUrl, models.RecordsFileName, &downloader.DownloadOptions{ + Context: context.Background(), + Overwrite: true, + }) + if err != nil { + log.Fatalf("Failed to download records.json: %v", err) + } + + log.Printf("Successfully downloaded to %s", models.RecordsFileName) +} diff --git a/src/mtran/vendor/mtranserver/deprecated/go/data/records.json b/src/mtran/vendor/mtranserver/deprecated/go/data/records.json new file mode 100644 index 0000000..2cfca8b --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/go/data/records.json @@ -0,0 +1 @@ +{"data":[{"name":"model.enpl.intgemm.alphas.bin","schema":1760721896061,"version":"3.0","fileType":"model","attachment":{"hash":"4c3e2a71b7f801eeb81394b3b4a66189b4ee850cf7202855157776c7fa55bf0b","size":21869196,"filename":"model.enpl.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/251fa2ec-4d4e-4c44-8520-8c5c35d967a0.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"en","targetLanguage":"pl","decompressedHash":"b0b59716bcc8f46b8dc6ab5c32a2732acaad42a5a6d9ae9b472526a1bb0d71d4","decompressedSize":31561787,"filter_expression":"","id":"6cead394-25c2-40aa-a693-c1644cb72705","last_modified":1760722036608},{"name":"vocab.enpt.spm","schema":1760721876294,"version":"3.0","fileType":"vocab","attachment":{"hash":"5b2ef32ade5c06aa3503186dc8c73e0ff21374e097a071f04d73f8bb1ab0e052","size":348792,"filename":"vocab.enpt.spm.zst","location":"main-workspace/translations-models-v2/1ae15c1a-90b6-4c32-8dfa-50dbb710904c.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"en","targetLanguage":"pt","decompressedHash":"d9f46182823d5bbc84201252b2dfcac28f63e561f0ec827ed858f241864c9def","decompressedSize":816726,"filter_expression":"","id":"7ada09e0-cb3a-42a0-8a3a-3d24338298d5","last_modified":1760722036603},{"name":"lex.50.50.ennl.s2t.bin","schema":1760721851653,"version":"3.0","fileType":"lex","attachment":{"hash":"6ed3bcd2e369a873452c0948597d5bc1c2e08878277635afab3385bb425798d2","size":1614605,"filename":"lex.50.50.ennl.s2t.bin.zst","location":"main-workspace/translations-models-v2/7fb33be6-a706-4178-a8c5-39a36bf99d4e.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"en","targetLanguage":"nl","decompressedHash":"bb4922718f8ca6d746ad090c0a88110a664dc050ee3f311bce33698b4e1679e9","decompressedSize":4030624,"filter_expression":"","id":"6e04b91c-ec38-4476-85a1-bbbf65ee77e3","last_modified":1760722036599},{"name":"model.enpt.intgemm.alphas.bin","schema":1760721869370,"version":"3.0","fileType":"model","attachment":{"hash":"b6ae4dfe27a5fd5bfaaeb4d84c4297e69c83a329e7eb26ae6ceefafe5ab541c9","size":22901341,"filename":"model.enpt.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/90cb3b8f-d3bd-4584-9b49-f3072a952582.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"en","targetLanguage":"pt","decompressedHash":"07892fd2544ee79dcb643615d8f2debb9793fae16842e87c328e27a3dd26a770","decompressedSize":31561787,"filter_expression":"","id":"4928d3bc-2d2d-4b6c-b06c-c5d3df104739","last_modified":1760722036594},{"name":"lex.50.50.enpt.s2t.bin","schema":1760721874418,"version":"3.0","fileType":"lex","attachment":{"hash":"c51d8fa1524a4fd70ac32dc6ef8df2a7683ec8da1b7888ef0b82dc1fcbafd14b","size":1588521,"filename":"lex.50.50.enpt.s2t.bin.zst","location":"main-workspace/translations-models-v2/94532a3d-b009-4b56-9ffb-213a052c22fe.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"en","targetLanguage":"pt","decompressedHash":"ccb4c31c9e1899d77a200e71a86958e6ef6c8649627d0bbf3f873b57d9f236bd","decompressedSize":3970340,"filter_expression":"","id":"acfeb4b0-8e8a-4dbb-9979-2fa91501612c","last_modified":1760722036590},{"name":"vocab.ennl.spm","schema":1760721850066,"version":"3.0","fileType":"vocab","attachment":{"hash":"4e9d279e681372a4dd9b81a737a5a06692d08ed1ecad3b58067e0576e838e5cc","size":349477,"filename":"vocab.ennl.spm.zst","location":"main-workspace/translations-models-v2/86f8efc7-7ee3-4b86-861a-999ab313d492.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"en","targetLanguage":"nl","decompressedHash":"c09588ca5662b230ed65bd39a07f58d9f7dd21c3a19e4aeb1bff39bf3b297c56","decompressedSize":807708,"filter_expression":"","id":"9b7636a6-e0e1-49eb-9ee1-2af11818d41b","last_modified":1760722036586},{"name":"model.enit.intgemm.alphas.bin","schema":1760721816228,"version":"3.0","fileType":"model","attachment":{"hash":"ed0580da44b91afd665956959d893c02e16e27240542799a524a3041c523ca17","size":23600729,"filename":"model.enit.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/3869680e-cedc-4af2-9167-bee368caa4be.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"en","targetLanguage":"it","decompressedHash":"248f47568788ecc351da7e5e07064d4153b4f71e011364ae2c931ffeec4d1cc2","decompressedSize":31561787,"filter_expression":"","id":"04bfa2c3-f1c1-4a6b-9019-2291c2342f3c","last_modified":1760722036581},{"name":"vocab.enit.spm","schema":1760721823253,"version":"3.0","fileType":"vocab","attachment":{"hash":"ad75fd13305e6dc6ec6cc95e43fbb3cb2fe8b7ea60332f195785541325555db8","size":346942,"filename":"vocab.enit.spm.zst","location":"main-workspace/translations-models-v2/6779446e-354e-44ec-a0d1-f3435c340b86.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"en","targetLanguage":"it","decompressedHash":"3ef0211d4ae6db21440892f180f2019fe2bfc110a330ffa9d2eca9665e4f2bc5","decompressedSize":812724,"filter_expression":"","id":"d1cbab2d-eaf5-4594-8545-501b84d009ad","last_modified":1760722036577},{"name":"model.enes.intgemm.alphas.bin","schema":1760721797068,"version":"3.0","fileType":"model","attachment":{"hash":"ce7ba731d3352d7e595d96ed4fac513744568eaf9a271daf90b5fa8fa33b195d","size":22085725,"filename":"model.enes.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/1d705201-9be0-40c4-a0b4-18d1e3973777.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"en","targetLanguage":"es","decompressedHash":"3b1c399511c01c84c36fae5c0524df44096288efdc8236e182b5c97d7ad2244c","decompressedSize":31561787,"filter_expression":"","id":"4e0e076d-8784-4978-9d68-b3d8d8d4848c","last_modified":1760722036572},{"name":"vocab.enes.spm","schema":1760721793816,"version":"3.0","fileType":"vocab","attachment":{"hash":"76b9ef220b22cec379f097852ca6312cabf065d5ddfb05149d5af31aa050ec22","size":348996,"filename":"vocab.enes.spm.zst","location":"main-workspace/translations-models-v2/b2b5907b-8759-4cc8-a721-89c283e6e45b.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"en","targetLanguage":"es","decompressedHash":"5ae254fa9b15aa182e70fd2a6186b1333c63a29a48043a9224c6aa4fcac058ad","decompressedSize":816054,"filter_expression":"","id":"478bd95a-e9f5-4b98-9c41-e2140bfb2beb","last_modified":1760722036568},{"name":"lex.50.50.enes.s2t.bin","schema":1760721795261,"version":"3.0","fileType":"lex","attachment":{"hash":"0dd2945dc8a5bbccad6fb1e1dfce137d363de839f4492cab717f60f1f38c09e6","size":1687731,"filename":"lex.50.50.enes.s2t.bin.zst","location":"main-workspace/translations-models-v2/51318160-1249-451f-80fb-12e61f8c1def.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"en","targetLanguage":"es","decompressedHash":"7d51237c0a07027dcd61643cfbbb0f8c48597d19907ef53d2cae9d6bec2cf25c","decompressedSize":4198436,"filter_expression":"","id":"fb49bf6d-4532-4717-a577-b1d1da2cff4b","last_modified":1760722036562},{"name":"vocab.enpl.spm","schema":1760721900854,"version":"3.0","fileType":"vocab","attachment":{"hash":"7926a0be1849310fe58241d9b9539fe65f796dffcc7a8c52daa4a78234ebb2c0","size":351738,"filename":"vocab.enpl.spm.zst","location":"main-workspace/translations-models-v2/900a6ffd-7ef3-4e05-8a2b-236d4ef616d3.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"en","targetLanguage":"pl","decompressedHash":"2000f182efa8ce5f69bc3f9e574666b5bc2c0af684eedd32f69d15aa9021ea85","decompressedSize":821612,"filter_expression":"","id":"ba363962-40c7-4eb2-978d-14061030218a","last_modified":1760722036558},{"name":"vocab.ende.spm","schema":1760721769087,"version":"3.0","fileType":"vocab","attachment":{"hash":"688bd61fce9ff1a1f93b81f0f039f9a850a3f345b0a82e044a743ff48b71ffbc","size":352776,"filename":"vocab.ende.spm.zst","location":"main-workspace/translations-models-v2/a850d21e-c220-45ea-b978-a826a9248e64.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"en","targetLanguage":"de","decompressedHash":"69f730becafa48e3bb2c244eab66456877c08959a02f2bd5519b5a3088b62f9c","decompressedSize":810073,"filter_expression":"","id":"11d3da0e-d16c-455d-b2d2-3fad8c66b07f","last_modified":1760722036554},{"name":"lex.50.50.enpl.s2t.bin","schema":1760721894386,"version":"3.0","fileType":"lex","attachment":{"hash":"9934637772a0408e97b767b87580bd56678bbde6a1b9f73afd503aad174cba60","size":1379394,"filename":"lex.50.50.enpl.s2t.bin.zst","location":"main-workspace/translations-models-v2/0c4c3c04-92c0-495d-9216-5ee715575bc1.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"en","targetLanguage":"pl","decompressedHash":"d7d7b364673f633763c9f8f2e8ee9c7a184e92f4086e8b84abe870a2a8dbe5d5","decompressedSize":3540052,"filter_expression":"","id":"42301882-8aef-43e5-be55-071f67a16282","last_modified":1760722036550},{"name":"model.ennl.intgemm.alphas.bin","schema":1760721840321,"version":"3.0","fileType":"model","attachment":{"hash":"bccfa93a22ec77e86dfa839dc49c1a11602b1918bb08dbdc8636b0fb8f5dcee1","size":22991428,"filename":"model.ennl.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/08e82901-8409-4eb0-b3ca-5299f4225ba3.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"en","targetLanguage":"nl","decompressedHash":"7e8402da61972dc2fdcf7147c7f1e12f7916a6d9349514ee7a731288357575a9","decompressedSize":31561787,"filter_expression":"","id":"33ca59ce-c536-44d9-b549-63865220b0f8","last_modified":1760722036545},{"name":"model.ende.intgemm.alphas.bin","schema":1760721770600,"version":"3.0","fileType":"model","attachment":{"hash":"db0fa25f3767efdf913ad7d213adf51702a87fb9b07f5e6c64fc4dc13c2eb2cf","size":22461496,"filename":"model.ende.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/210d5dea-12cc-4960-9f6a-aa21740c6735.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"en","targetLanguage":"de","decompressedHash":"8df29d9494d19f47fd5d97c6a73474c6f657e9f81c1a607c431d02befdf3810f","decompressedSize":31561787,"filter_expression":"","id":"1c50e0b4-2b75-45ce-aa9a-034943f1dcdb","last_modified":1760722036542},{"name":"lex.50.50.ende.s2t.bin","schema":1760721775510,"version":"3.0","fileType":"lex","attachment":{"hash":"a483b34d541dc8d4097cbfafbb188d68ee54d68368b96ed2e3d1e16bcfad40aa","size":1696246,"filename":"lex.50.50.ende.s2t.bin.zst","location":"main-workspace/translations-models-v2/7b8929f7-c5c2-4869-9193-12821a86354d.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"en","targetLanguage":"de","decompressedHash":"7ed39f1cffbd68a27ddf05bbfe068de2060f1d7e69f1a20e27ae923551dd7393","decompressedSize":4347672,"filter_expression":"","id":"68632714-2d2c-4f5e-82aa-ac11ec4077a7","last_modified":1760722036538},{"name":"lex.50.50.enit.s2t.bin","schema":1760721821321,"version":"3.0","fileType":"lex","attachment":{"hash":"a97b81e39392c07084f3e8340f119e31ae10529634dd0ad6bad1f945d94bb4c7","size":1646871,"filename":"lex.50.50.enit.s2t.bin.zst","location":"main-workspace/translations-models-v2/598d567f-4a7e-4ae8-b9b2-0c4edbc01aa6.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"en","targetLanguage":"it","decompressedHash":"8b21914804625b2777dae7fdb636eb78f02a3eb8b7bceaa50f29ac740961da93","decompressedSize":4133192,"filter_expression":"","id":"2f21e4d2-001f-4beb-a5ae-4cbf2547a747","last_modified":1760722036533},{"name":"model.enfr.intgemm.alphas.bin","schema":1759521553853,"version":"3.0","fileType":"model","attachment":{"hash":"98c229b4f356565fec4cd9ba9374b1fa0216965addeef7ca250d4a3ed4a396eb","size":22542574,"filename":"model.enfr.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/570d07a3-d360-430f-bbb4-37d89715bcfb.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"en","targetLanguage":"fr","decompressedHash":"6322e296d4fecfe395a8d5723da4ec37ecbe6d7613bb1dfcf4b28e2a47498b68","decompressedSize":31561787,"filter_expression":"","id":"72097f14-48e2-4031-b5a9-a2b7e325ff98","last_modified":1759521749880},{"name":"lex.50.50.enfr.s2t.bin","schema":1759521550536,"version":"3.0","fileType":"lex","attachment":{"hash":"371c84ca05d528013638c4c19c24fb12a15cbe9208239e599498539467a0436e","size":1703263,"filename":"lex.50.50.enfr.s2t.bin.zst","location":"main-workspace/translations-models-v2/bff0d10a-d07a-4873-a5a7-a6b7af42bf86.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"en","targetLanguage":"fr","decompressedHash":"2585ed98d3af0bc949865aedeb390493d591f56870814376e73e4144c41ed059","decompressedSize":4372936,"filter_expression":"","id":"fbff4a38-2eb5-4c72-a422-a53bb82a4ab8","last_modified":1759521749873},{"name":"lex.50.50.enfi.s2t.bin","schema":1759521524198,"version":"3.0","fileType":"lex","attachment":{"hash":"70b2a204c787ffa496e88458347cb3d2bb4438e12541a1cbf9fc78ef972a9077","size":1374448,"filename":"lex.50.50.enfi.s2t.bin.zst","location":"main-workspace/translations-models-v2/bcfb49bb-3cfc-4fb8-8811-0c4ef54b720c.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"en","targetLanguage":"fi","decompressedHash":"26e95a87f87e4b0fa9a35524cf9fea691204504453877ba4ac81ccc66af1488c","decompressedSize":3490092,"filter_expression":"","id":"16cd5b0e-d500-421e-b51e-b3a0a24afb36","last_modified":1759521749866},{"name":"model.enfi.intgemm.alphas.bin","schema":1759521527456,"version":"3.0","fileType":"model","attachment":{"hash":"8c772d71e6ac5eda7beaf484702a856c90bf826e5e20bfe3b447018d2173f5a4","size":21904925,"filename":"model.enfi.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/67993263-7c4b-4ffe-a618-957f1b49ac6b.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"en","targetLanguage":"fi","decompressedHash":"88b0caa4cc6980d632801cb2b1950748f1dc43ad2ac83678917ad86c720b5cdd","decompressedSize":31561787,"filter_expression":"","id":"31a1c8fc-21d9-4606-bbcf-42cb210576b8","last_modified":1759521749862},{"name":"vocab.enet.spm","schema":1759521495571,"version":"3.0","fileType":"vocab","attachment":{"hash":"41ad1d1b1b37a99d379251d3194a06a33bb5160761156275c849c05c3c32770b","size":351938,"filename":"vocab.enet.spm.zst","location":"main-workspace/translations-models-v2/13ef5e54-0255-4847-846f-0ed2208097b5.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"en","targetLanguage":"et","decompressedHash":"89a3deea4ae7d674fb46a4dae39135dd4dfaac9786f2868d0b5bc5c0aca2ef83","decompressedSize":817574,"filter_expression":"","id":"b33e066e-4d21-4acb-9ca5-7415f68d180b","last_modified":1759521749858},{"name":"lex.50.50.enet.s2t.bin","schema":1759521504453,"version":"3.0","fileType":"lex","attachment":{"hash":"5e5da5e1aaa48148a11df2155a67c5a1d49e673e47ff6ebd3d2dd554478cd137","size":1368909,"filename":"lex.50.50.enet.s2t.bin.zst","location":"main-workspace/translations-models-v2/d3bab544-243b-44f4-a407-135dd21c7974.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"en","targetLanguage":"et","decompressedHash":"259c60582f49449c226a6e5a369481c68322013f367e459e54c595686c05d4d8","decompressedSize":3488368,"filter_expression":"","id":"d4ddba6e-0127-4757-b142-098f243787d3","last_modified":1759521749851},{"name":"vocab.enfr.spm","schema":1759521552408,"version":"3.0","fileType":"vocab","attachment":{"hash":"61c982758a3e7dc880a8dbc11aaf0fb04a1e4f5d2d7a36ee11bc419323f2ca80","size":348946,"filename":"vocab.enfr.spm.zst","location":"main-workspace/translations-models-v2/faa168f7-1b8d-4d29-9267-cc5e1bac3c73.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"en","targetLanguage":"fr","decompressedHash":"783abf3abe075afdf8d85d233994bef2c3a064e935ab1bed946820aff6ac002a","decompressedSize":814404,"filter_expression":"","id":"a7aea13d-32ac-4f27-96b9-7c101f4eb302","last_modified":1759521749847},{"name":"vocab.enfi.spm","schema":1759521526022,"version":"3.0","fileType":"vocab","attachment":{"hash":"18158b030337d5774e251174227999737fcafa5b277ed1b56bc35e2b2d984e3f","size":352840,"filename":"vocab.enfi.spm.zst","location":"main-workspace/translations-models-v2/077a390a-75cd-49f7-8bc0-249934d29212.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"en","targetLanguage":"fi","decompressedHash":"6a866911427f2916609ae89c7f2f04a78de3fdd8aa183039ecba986635d4f246","decompressedSize":818770,"filter_expression":"","id":"5f285123-1119-4ca0-bbb3-851b143a3457","last_modified":1759521749839},{"name":"model.enet.intgemm.alphas.bin","schema":1759521497022,"version":"3.0","fileType":"model","attachment":{"hash":"dfd5fe02fec145b2352056ce128eb4b1e515b2c8704e3130b4ca9280dec2c199","size":22407140,"filename":"model.enet.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/4be2c694-cfc9-48f9-8c92-fa26e911f6cc.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"en","targetLanguage":"et","decompressedHash":"36bdc87f8d500861a5d286ebd3ea58df530da87e31b8a233f5e9c46c300c281d","decompressedSize":31561787,"filter_expression":"","id":"8f76d837-aa0c-4bf4-809e-cfc9f905f3dd","last_modified":1759521749835},{"name":"model.encs.intgemm.alphas.bin","schema":1759521416107,"version":"3.0","fileType":"model","attachment":{"hash":"7a83ea3580b2d4f8fc490b38b74d7638e8eb488f2860f1ae66e0d5e7f75ba38d","size":22714358,"filename":"model.encs.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/1b7dfd02-c40e-4ca7-8a34-fc50daa42fbf.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"en","targetLanguage":"cs","decompressedHash":"1d7855f91c3e2b8ef79fbea62707d46ceb8a1ad01834ef6dd500f32a7006cc2c","decompressedSize":31561787,"filter_expression":"","id":"489d6daf-1a96-48dc-a73c-d42f43235710","last_modified":1759521749824},{"name":"lex.50.50.encs.s2t.bin","schema":1759521414331,"version":"3.0","fileType":"lex","attachment":{"hash":"d08adc371880efb2685ba5f36d466027993b9788272ad8a37ccac63ee940ef54","size":1399382,"filename":"lex.50.50.encs.s2t.bin.zst","location":"main-workspace/translations-models-v2/093fce8e-5584-433a-b278-baad59426a2a.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"en","targetLanguage":"cs","decompressedHash":"699b9b59fe3acbcddf831380024b2e139f2cbe225dce96d59ade2b159318f58b","decompressedSize":3572436,"filter_expression":"","id":"63b3f8cc-62eb-4e2d-afd7-41ae3c42a2e7","last_modified":1759521749820},{"name":"model.enbg.intgemm.alphas.bin","schema":1759521388267,"version":"3.0","fileType":"model","attachment":{"hash":"53612f6fccd4be0c62a9a325a91094ac130301c976202425d8c8184967ebcb0a","size":23004373,"filename":"model.enbg.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/8e69c3ee-573f-4382-8eaa-45926a54e016.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"en","targetLanguage":"bg","decompressedHash":"e2b30db98ac6706efc893067a74e51f36f015a8f820fe8a4f0f5052fa6a22f30","decompressedSize":31561787,"filter_expression":"","id":"0832afc2-65c7-48e6-8d94-4b8a3db11362","last_modified":1759521749816},{"name":"lex.50.50.enbg.s2t.bin","schema":1759521386547,"version":"3.0","fileType":"lex","attachment":{"hash":"e49b8c60c3f3ad94a76d97d94d46a7278cc27023e2299dba8d4826c2adda4748","size":1150376,"filename":"lex.50.50.enbg.s2t.bin.zst","location":"main-workspace/translations-models-v2/89d43f4b-ab82-4a14-824b-f2080f97dd08.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"en","targetLanguage":"bg","decompressedHash":"93d4ca4412db269cc4164cbfa04c08edd0f65690c8264d6215a0522d4a13ec1a","decompressedSize":3075948,"filter_expression":"","id":"657330ee-c23d-4812-9b0e-872d6fdd65ec","last_modified":1759521749813},{"name":"vocab.enbg.spm","schema":1759521395717,"version":"3.0","fileType":"vocab","attachment":{"hash":"9bb4902078de81ad820b8254950685f89be9d1510e6de90220bb994450742c6b","size":362233,"filename":"vocab.enbg.spm.zst","location":"main-workspace/translations-models-v2/be4b55af-bea2-42fc-a9bd-1683688511d3.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"en","targetLanguage":"bg","decompressedHash":"4bafad5fcc0e771ed82233d1e99d69dcb96487b430702f7e688615c8a61f3df4","decompressedSize":922482,"filter_expression":"","id":"50e584cf-cdef-4da5-90b8-e00ea038b2bf","last_modified":1759521749805},{"name":"lex.50.50.plen.s2t.bin","schema":1759521369524,"version":"3.0","fileType":"lex","attachment":{"hash":"9ba237b1684337cd937e20205d2947fec2db65c08fa17b555e52236e87a41b09","size":1809189,"filename":"lex.50.50.plen.s2t.bin.zst","location":"main-workspace/translations-models-v2/bf697ced-51fc-43c9-8600-51d7e2109505.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"pl","targetLanguage":"en","decompressedHash":"b295dfefa7022a62e105276e8c39fdfd67bffe588f4fd78583edd4e04ee0cb3b","decompressedSize":4964208,"filter_expression":"","id":"795a2203-80bf-4d2a-828d-fe456dae2e6f","last_modified":1759521749798},{"name":"vocab.plen.spm","schema":1759521368049,"version":"3.0","fileType":"vocab","attachment":{"hash":"7926a0be1849310fe58241d9b9539fe65f796dffcc7a8c52daa4a78234ebb2c0","size":351738,"filename":"vocab.plen.spm.zst","location":"main-workspace/translations-models-v2/a28acc03-8d4b-468e-a781-67f395ce66c6.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"pl","targetLanguage":"en","decompressedHash":"2000f182efa8ce5f69bc3f9e574666b5bc2c0af684eedd32f69d15aa9021ea85","decompressedSize":821612,"filter_expression":"","id":"f9d49f3e-c87c-4b90-a209-a46c027f01f6","last_modified":1759521749794},{"name":"vocab.encs.spm","schema":1759521412851,"version":"3.0","fileType":"vocab","attachment":{"hash":"f9955569c41ac41578c5f9923bb7d7dbe62ed343f6475cf31078608bd9f753d4","size":350374,"filename":"vocab.encs.spm.zst","location":"main-workspace/translations-models-v2/3cc5bdb9-d6a4-4d3b-a394-ed1141d650df.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"en","targetLanguage":"cs","decompressedHash":"ee4b8ce15c8e1237c5f7a2d04741341beb0a5d5c09820f7ec08f13ee2b212755","decompressedSize":815154,"filter_expression":"","id":"d20cd6d9-80a4-447d-9d08-02dfb9a6ce19","last_modified":1759521749786},{"name":"model.plen.intgemm.alphas.bin","schema":1759521358965,"version":"3.0","fileType":"model","attachment":{"hash":"bac2aaa11d0dd40aae999929702b3e97dd4c6e8780920a55edb58b40705593e5","size":21997629,"filename":"model.plen.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/5e139d66-ff65-435b-8b43-3602b0b492cf.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"pl","targetLanguage":"en","decompressedHash":"06dbab3baa3bbceab746bc6a3bba807878f38536382c03acddf59d3edf3b5d94","decompressedSize":31561787,"filter_expression":"","id":"34e87966-7bf8-49d3-bd01-030e199823f8","last_modified":1759521749782},{"name":"lex.50.50.enzh.s2t.bin","schema":1758911459908,"version":"3.0","fileType":"lex","attachment":{"hash":"c7e4b2ee202e6cf526d07f9c5a47b759ba32b0b42a5353d3db4ee1ff3bfb5217","size":2499275,"filename":"lex.50.50.enzh.s2t.bin.zst","location":"main-workspace/translations-models-v2/900beaed-2dba-4a88-ad7c-852ec9e73f6a.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"en","targetLanguage":"zh-Hans","decompressedHash":"4a5e5827788060f1d718a8132b69440929387514a045796e9b77f935db68c055","decompressedSize":6506248,"filter_expression":"","id":"af94c64d-02fe-48bd-8f02-d32d6db6d8be","last_modified":1758911497169},{"name":"srcvocab.enzh.spm","schema":1758911434397,"version":"3.0","fileType":"srcvocab","attachment":{"hash":"ec495ad8f0c80ba4eae5ac3b9a8e2ccb4a3a7becb1992efcfea5f4653ffdece1","size":348078,"filename":"srcvocab.enzh.spm.zst","location":"main-workspace/translations-models-v2/83278466-fec4-4944-a99d-c2372fa9de88.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"en","targetLanguage":"zh-Hans","decompressedHash":"bd9b65504acc6d9726dd281f7defc2adb7c2c22d0688fe2f84697de25197c8c5","decompressedSize":806952,"filter_expression":"","id":"f0488cec-fe6d-483e-bdf1-ce02f8b614ed","last_modified":1758911497165},{"name":"vocab.zhen.spm","schema":1758911397431,"version":"3.1","fileType":"vocab","attachment":{"hash":"4f9c18c3665d995845a4e3ff71476a881a2c4257a5caf88a042237f4d1f14e58","size":611595,"filename":"vocab.zhen.spm.zst","location":"main-workspace/translations-models-v2/369efa59-d98e-4aa9-8a91-363ba16c3ba7.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"zh-Hans","targetLanguage":"en","decompressedHash":"dff594318ab7d8b7b60b844ab98ebe6b932ae8045fab15235404c787715965b3","decompressedSize":1359697,"filter_expression":"env.appinfo.OS == 'Android'","id":"6e8dfb15-d62a-4e47-9881-52f2d8c6e757","last_modified":1758911497161},{"name":"trgvocab.enzh.spm","schema":1758911406262,"version":"3.0","fileType":"trgvocab","attachment":{"hash":"25c6c984a7556cb6478b9f1748ff68d8fd433c0e7d472bfdbd4d64a2dffa21f1","size":354994,"filename":"trgvocab.enzh.spm.zst","location":"main-workspace/translations-models-v2/84236654-1b66-42fc-9ba2-74c37f27e5eb.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"en","targetLanguage":"zh-Hans","decompressedHash":"aded6993c36e440284d11cec3f6b8aef9c0e43188a772d80be342a713adf223d","decompressedSize":772004,"filter_expression":"","id":"0ac6dec8-b8cd-49c7-bbe4-c68e8b7cd85d","last_modified":1758911497157},{"name":"lex.50.50.zhen.s2t.bin","schema":1758911380254,"version":"3.1","fileType":"lex","attachment":{"hash":"59d9e4341d8cd4403ea1d12fc54c6100c4f25a7529df1f21f3d35952808e7d45","size":3427789,"filename":"lex.50.50.zhen.s2t.bin.zst","location":"main-workspace/translations-models-v2/a2261cbe-7fe7-498d-a128-c08d918b42fc.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"zh-Hans","targetLanguage":"en","decompressedHash":"8524dd4c93ffd7f0ae7be32f77a7c14fea7cdbbebe34ea6ad0ec368d5ddd8b13","decompressedSize":9219192,"filter_expression":"env.appinfo.OS == 'Android'","id":"5e139673-82d6-4119-ad77-dcc18417fac0","last_modified":1758911497154},{"name":"model.zhen.intgemm.alphas.bin","schema":1758911388735,"version":"3.1","fileType":"model","attachment":{"hash":"37af47d465cd0bfdf5cf3c6452e860c6682519a7109f86c33cf5f332a3f4cfa4","size":32186434,"filename":"model.zhen.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/8bb74789-fad9-40e0-8f49-d3e017106138.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"zh-Hans","targetLanguage":"en","decompressedHash":"5cd149601802fc8a18124a1c1306144dbbedc058630c4ddb2d53aa76fa9c7c06","decompressedSize":43977787,"filter_expression":"env.appinfo.OS == 'Android'","id":"3dcd25bc-763b-42fe-8979-b96ced36ab33","last_modified":1758911497150},{"name":"model.zhen.intgemm.alphas.bin","schema":1758911353998,"version":"3.0","fileType":"model","attachment":{"hash":"3a53dee52f7fe10991438dbff166f2c805a176e4e891e2712fcee5a55e46beaf","size":43556159,"filename":"model.zhen.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/ef9e8f1a-b8c5-4626-a134-ff74bd8628ae.zst","mimetype":"application/zstd"},"architecture":"base","sourceLanguage":"zh-Hans","targetLanguage":"en","decompressedHash":"3535442962ec8f4a553cc19b206befcac689ee9cddaea44fa91e21527fc30ac2","decompressedSize":59504955,"filter_expression":"env.appinfo.OS != 'Android'","id":"9c85757e-3e2c-4baf-9bc3-7f09202dcf40","last_modified":1758911497147},{"name":"model.enzh.intgemm.alphas.bin","schema":1758911446598,"version":"3.0","fileType":"model","attachment":{"hash":"f0c96e546b0af7c1fe84647d450b1eba0b0591c167e1ead135b334e4b54f6e08","size":32923790,"filename":"model.enzh.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/321191b6-2c42-4bca-84ec-b7b074b67bd6.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"en","targetLanguage":"zh-Hans","decompressedHash":"4e5accc141373565ddc8fa1565bceaa8d0c3482a82cab8131c719ebcc6c2157c","decompressedSize":43849787,"filter_expression":"","id":"00ad7997-d4ca-4cae-a1d5-45c529a09fbd","last_modified":1758911497143},{"name":"lex.50.50.zhen.s2t.bin","schema":1758911307967,"version":"3.0","fileType":"lex","attachment":{"hash":"a25d94a146d5d7ffbe3b8a39e05c80b4dc683fc572c7b746cae983d86c2e3b24","size":3429363,"filename":"lex.50.50.zhen.s2t.bin.zst","location":"main-workspace/translations-models-v2/570592b5-224e-4ad9-96cd-7a4905f0f044.zst","mimetype":"application/zstd"},"architecture":"base","sourceLanguage":"zh-Hans","targetLanguage":"en","decompressedHash":"cdcad3592dc2bc4676c34c4d37203f7649ee989195cf083cbb60f1ea011f976b","decompressedSize":9220016,"filter_expression":"env.appinfo.OS != 'Android'","id":"3f6fb79b-f36d-4b49-b208-cfe12ff28286","last_modified":1758911497139},{"name":"vocab.nnen.spm","schema":1758911306884,"version":"3.0a1","fileType":"vocab","attachment":{"hash":"38af31a9b9bf55810fc9eba6181dbef91195c309085e2c728c3cc5facfb3d8bf","size":225949,"filename":"vocab.nnen.spm.zst","location":"main-workspace/translations-models-v2/63da8b5c-3453-4e1e-bfdf-7985a1f1f315.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"nn","targetLanguage":"en","decompressedHash":"14625622062046b7c44eb79652efb113518bf4b52fa1b98a949934b7a94b0273","decompressedSize":510942,"filter_expression":"env.channel == 'default' || env.channel == 'nightly'","id":"4a73bba8-3108-45d2-b4cc-e2a2440e3b14","last_modified":1758911497135},{"name":"lex.50.50.nnen.s2t.bin","schema":1758911305300,"version":"3.0a1","fileType":"lex","attachment":{"hash":"bdf2998b050f1ee63285857932d890ca13c17b0e62d4d984b7d5c10034d7d6bc","size":564863,"filename":"lex.50.50.nnen.s2t.bin.zst","location":"main-workspace/translations-models-v2/3f47086f-f02c-4c41-acf5-c939a955ff2b.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"nn","targetLanguage":"en","decompressedHash":"b19abe7154430c1ee321e29391b14b2752c3350c3fbfcd1caf1ef7a0f9a30a97","decompressedSize":1506236,"filter_expression":"env.channel == 'default' || env.channel == 'nightly'","id":"38537b86-2861-4f4d-8b4b-72f1e469d581","last_modified":1758911497132},{"name":"vocab.nben.spm","schema":1758911292099,"version":"3.0a1","fileType":"vocab","attachment":{"hash":"790e6f0806842d246444204c048529b07f29a223edf0fcc4257133a45fb2f985","size":225430,"filename":"vocab.nben.spm.zst","location":"main-workspace/translations-models-v2/56bf7193-49a8-4cf9-ad94-0b44771c95f3.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"nb","targetLanguage":"en","decompressedHash":"3cb4f4efc382d6e7242304e8649050da297469b69a604dd7480d8704fe4877b6","decompressedSize":511372,"filter_expression":"env.channel == 'default' || env.channel == 'nightly'","id":"1102bb19-3651-4f54-8060-84b2cad3763f","last_modified":1758911497128},{"name":"vocab.zhen.spm","schema":1758911366718,"version":"3.0","fileType":"vocab","attachment":{"hash":"4f9c18c3665d995845a4e3ff71476a881a2c4257a5caf88a042237f4d1f14e58","size":611595,"filename":"vocab.zhen.spm.zst","location":"main-workspace/translations-models-v2/4c5d89d3-9412-4a61-a843-dfc1ed70565d.zst","mimetype":"application/zstd"},"architecture":"base","sourceLanguage":"zh-Hans","targetLanguage":"en","decompressedHash":"dff594318ab7d8b7b60b844ab98ebe6b932ae8045fab15235404c787715965b3","decompressedSize":1359697,"filter_expression":"env.appinfo.OS != 'Android'","id":"4f6d32de-69b9-414b-ae0b-b8a4a0d9d8f7","last_modified":1758911497124},{"name":"lex.50.50.nben.s2t.bin","schema":1758911290518,"version":"3.0a1","fileType":"lex","attachment":{"hash":"e226862be0080a0c71881cb2e1e1d3c9742acaf9dd0ad4d2c16f088a415a59c2","size":558245,"filename":"lex.50.50.nben.s2t.bin.zst","location":"main-workspace/translations-models-v2/4024537b-c874-4d0a-bf2b-74aeaea02a36.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"nb","targetLanguage":"en","decompressedHash":"5ec9a1eb849cf8fde0908904808e65a0c5a3027f85b1b5b9944c6b15d424598d","decompressedSize":1487760,"filter_expression":"env.channel == 'default' || env.channel == 'nightly'","id":"4b87dcc6-926d-4c4f-b931-fbf337bcdce8","last_modified":1758911497121},{"name":"model.nnen.intgemm.alphas.bin","schema":1758911299098,"version":"3.0a1","fileType":"model","attachment":{"hash":"1fb6735e5adf11272ade8e6315cd486ec94d3158d1d73ebf69b76dd25e5a7864","size":10465316,"filename":"model.nnen.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/45ce39a1-9d67-4ae9-ab45-28d7a7e6a049.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"nn","targetLanguage":"en","decompressedHash":"17550943381bdfae30b1d8ee29b33b2da2c9ae4d4b9749e2e66b2946e27dce7d","decompressedSize":12980780,"filter_expression":"env.channel == 'default' || env.channel == 'nightly'","id":"6181e492-8b19-40cd-9e92-703325e18f09","last_modified":1758911497117},{"name":"model.nben.intgemm.alphas.bin","schema":1758911286932,"version":"3.0a1","fileType":"model","attachment":{"hash":"3f8c3491713e60113c154887947796f16a9f7a58f71dad40d92041c3c6bca910","size":10246974,"filename":"model.nben.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/71698a5c-9c30-4cf5-b9b0-e5a19073f011.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"nb","targetLanguage":"en","decompressedHash":"03cef6aa909d2397420201551354c21010324fe155753d62b4eb190adca071be","decompressedSize":12980780,"filter_expression":"env.channel == 'default' || env.channel == 'nightly'","id":"e8a67a4d-2958-4073-b01f-f730b9222881","last_modified":1758911497113},{"name":"model.bsen.intgemm.alphas.bin","schema":1758911274989,"version":"3.0a1","fileType":"model","attachment":{"hash":"24cb601dbbb8f9941eed5219855b8db3ab0842071d4c8a462c3683d1c0e46da2","size":13364117,"filename":"model.bsen.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/eeb5ce9b-c6f1-4345-b6d3-d01d428c7744.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"bs","targetLanguage":"en","decompressedHash":"47cf33ca3ebadf7e541e19b7cb5ff82d5be8c793fbdcd6133f68cb53333ac0cb","decompressedSize":17141051,"filter_expression":"env.channel == 'default' || env.channel == 'nightly'","id":"ee58aa23-56b3-4235-a551-077a5cdf8a97","last_modified":1758911497110},{"name":"lex.50.50.bsen.s2t.bin","schema":1758911273372,"version":"3.0a1","fileType":"lex","attachment":{"hash":"dbc7d60198f9b65bf330f916a970783c527aaa56273cefff99868d2e0d6fa0d7","size":1090389,"filename":"lex.50.50.bsen.s2t.bin.zst","location":"main-workspace/translations-models-v2/e8c46a1b-c246-48f0-a89c-9dc90531dfed.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"bs","targetLanguage":"en","decompressedHash":"f19947ad4c95c8f2ded27052af2007dc9facbaba5dfac6e84c5ea2c0a0899c09","decompressedSize":2830904,"filter_expression":"env.channel == 'default' || env.channel == 'nightly'","id":"d1d9d031-529f-4ddc-86a5-f0382a92a79a","last_modified":1758911497106},{"name":"vocab.been.spm","schema":1758911262818,"version":"3.0a1","fileType":"vocab","attachment":{"hash":"ff3f3cf489aba9a10a364cd65fc3066119dc942e8a0afce1b343d03b58534585","size":360818,"filename":"vocab.been.spm.zst","location":"main-workspace/translations-models-v2/90a1abf2-59e0-4311-bd23-17668b4d85f8.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"be","targetLanguage":"en","decompressedHash":"dc235e4bfc4cdc25e0e1b36e07e29435b140861b4b94b8197bc715ddc7be912f","decompressedSize":931896,"filter_expression":"env.channel == 'default' || env.channel == 'nightly'","id":"bae88371-49e6-41d4-ae90-6f1813146f03","last_modified":1758911497102},{"name":"model.been.intgemm.alphas.bin","schema":1758911258607,"version":"3.0a1","fileType":"model","attachment":{"hash":"9009ab1c436229e42059d9eb66e64b4733c01a041614836f09a02425693206f9","size":12125293,"filename":"model.been.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/dbf66664-fe2e-4c03-8fe9-b74b74f884ee.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"be","targetLanguage":"en","decompressedHash":"3fcff7ef3102b082aeb165a6fc3e332ead2affcf7a6c91c43bb36da5add2dbb7","decompressedSize":17141051,"filter_expression":"env.channel == 'default' || env.channel == 'nightly'","id":"aefaa198-963b-4ded-a930-630571edc5ec","last_modified":1758911497099},{"name":"lex.50.50.been.s2t.bin","schema":1758911256885,"version":"3.0a1","fileType":"lex","attachment":{"hash":"b5208e1fbe342644ca6c0b866413d42972323b87843fe7d9728018a24cae856c","size":1585153,"filename":"lex.50.50.been.s2t.bin.zst","location":"main-workspace/translations-models-v2/f6e4d005-3c34-4982-b69f-969dfc38f271.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"be","targetLanguage":"en","decompressedHash":"eec822f871f570f99ac70b13fe480fc6f612d37c69c047834676f1c9919d4aca","decompressedSize":4565784,"filter_expression":"env.channel == 'default' || env.channel == 'nightly'","id":"3c84e5ec-38a0-4377-960f-4d3bb590ce2e","last_modified":1758911497095},{"name":"vocab.bnen.spm","schema":1758911245473,"version":"3.0","fileType":"vocab","attachment":{"hash":"89c47a8c9698ab49e7fd0a2b2addc739ff2b59690b3a06cc8c0a300ba08ad6b9","size":363959,"filename":"vocab.bnen.spm.zst","location":"main-workspace/translations-models-v2/fc8792c9-86f9-4cbd-b5d8-d88d27fa3373.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"bn","targetLanguage":"en","decompressedHash":"8a6a4de992ccd47bae4227ec6420866374137d6cc88ed6e8b2f16b36322a9d37","decompressedSize":981300,"filter_expression":"","id":"130f307a-30f5-46b0-a8c3-d7abb336bdc4","last_modified":1758911497091},{"name":"model.bnen.intgemm.alphas.bin","schema":1758911240338,"version":"3.0","fileType":"model","attachment":{"hash":"1857c67d2afd5f60afbab144dca9d6fd85eaed70e69f334c370438534db84b5c","size":12434508,"filename":"model.bnen.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/db113524-7197-4323-b573-6224b883fa07.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"bn","targetLanguage":"en","decompressedHash":"14c1d9e92918e8d04cb0ed351ae386c3b5d5c62a6dc601d9515f4c7e6c2a3a56","decompressedSize":17141051,"filter_expression":"","id":"7b933396-64c1-45a3-8973-06a9b7d8201b","last_modified":1758911497088},{"name":"lex.50.50.bnen.s2t.bin","schema":1758911238605,"version":"3.0","fileType":"lex","attachment":{"hash":"876da62d66503fcffbe5ec88f7f94278b859acec40daa677d4a63ca4c8b87439","size":1641621,"filename":"lex.50.50.bnen.s2t.bin.zst","location":"main-workspace/translations-models-v2/2ac1c880-2bb6-47c7-8842-516d21f93f19.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"bn","targetLanguage":"en","decompressedHash":"aea901a6bd8722962551c0349b8570af684444028b62bbff465be9931e6e9800","decompressedSize":4793596,"filter_expression":"","id":"6365214e-aa9c-4eaa-80a5-b4f0af65e10b","last_modified":1758911497084},{"name":"lex.50.50.enaz.s2t.bin","schema":1758911227233,"version":"3.0","fileType":"lex","attachment":{"hash":"aed12058b8df65887e7aed37427f1d5b326e8cffb6be49a9bfbf317175610f55","size":1237985,"filename":"lex.50.50.enaz.s2t.bin.zst","location":"main-workspace/translations-models-v2/4e7c18e2-f79b-4802-82f5-1cb283d6b5c3.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"en","targetLanguage":"az","decompressedHash":"f87f5de2674cf48562df60843a658e0000bedfd75aa8ffa5e251e2cb1321f255","decompressedSize":3332384,"filter_expression":"","id":"0158c3a4-fd5d-48a5-8164-15e32e05e531","last_modified":1758911497081},{"name":"vocab.enaz.spm","schema":1758911222741,"version":"3.0","fileType":"vocab","attachment":{"hash":"bfec71a3da13a6b72775bc3162fe6d908b5b14c51dfd47fdfaf56753c4f8e539","size":355945,"filename":"vocab.enaz.spm.zst","location":"main-workspace/translations-models-v2/a19d111d-8490-41c4-861f-564e701cc87e.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"en","targetLanguage":"az","decompressedHash":"afc1f4d7d20cd04addd3bc605acfdb83afbf62fb76d1a6bbc94cf42bf0286108","decompressedSize":835729,"filter_expression":"","id":"934ebe12-3a69-47e3-bf08-14f5bc7d0763","last_modified":1758911497077},{"name":"lex.50.50.azen.s2t.bin","schema":1758911212773,"version":"3.0a1","fileType":"lex","attachment":{"hash":"fad58bcdb71a8383bcb4d110ec1f612c4b4315e5ad7850f7906762f8de1bc7ee","size":1617609,"filename":"lex.50.50.azen.s2t.bin.zst","location":"main-workspace/translations-models-v2/36d15fab-47cb-40de-851d-a01d699eec5c.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"az","targetLanguage":"en","decompressedHash":"d534a8a29537e2539cac09d23360f27291765a030d424e108b9b0cabaa593672","decompressedSize":4820648,"filter_expression":"env.channel == 'default' || env.channel == 'nightly'","id":"f038f5aa-1812-43ba-bb95-57aab1d41783","last_modified":1758911497073},{"name":"vocab.bsen.spm","schema":1758911271940,"version":"3.0a1","fileType":"vocab","attachment":{"hash":"f64a9682dc221511d54a59974b6ff204d5982096ce44ece8ca101b964c931438","size":335872,"filename":"vocab.bsen.spm.zst","location":"main-workspace/translations-models-v2/b588f563-f030-419f-a7e5-f9f9b70ffb6f.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"bs","targetLanguage":"en","decompressedHash":"712cf46266895164bf58903654b5d5f9d02c927c34a3b9f2784f082f356f3434","decompressedSize":796425,"filter_expression":"env.channel == 'default' || env.channel == 'nightly'","id":"226386e2-3353-4c0d-9705-8fb49f3875b3","last_modified":1758911497069},{"name":"vocab.azen.spm","schema":1758911211348,"version":"3.0a1","fileType":"vocab","attachment":{"hash":"dc3f8a572ae43906b0e33287a3f586913048d667caea4839ec5f6ba571e616f4","size":355866,"filename":"vocab.azen.spm.zst","location":"main-workspace/translations-models-v2/96a30661-365e-4624-abe7-8922cd1b9ae3.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"az","targetLanguage":"en","decompressedHash":"9ae0beed517ad39a95b4e1ae95be4ddfdeba8b004139886d40a3a50874e16aa6","decompressedSize":835773,"filter_expression":"env.channel == 'default' || env.channel == 'nightly'","id":"cdf07ea2-921a-4e34-9ef9-8c26483525a0","last_modified":1758911497065},{"name":"model.enaz.intgemm.alphas.bin","schema":1758911224216,"version":"3.0","fileType":"model","attachment":{"hash":"5a7d65f4386ee9d03dc9f3b990449628746fba474b88304e82d7bba21ad43fa9","size":13140610,"filename":"model.enaz.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/98f0c5d7-b9a5-4adb-916c-b3656397627e.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"en","targetLanguage":"az","decompressedHash":"9c87aa09ff4f81c320993fe412624ca3584fe9ccf5371247d64f1117dffcf168","decompressedSize":17141051,"filter_expression":"","id":"ab03abde-7ff0-4a97-8c9b-09e233cec8c2","last_modified":1758911497062},{"name":"model.azen.intgemm.alphas.bin","schema":1758911206961,"version":"3.0a1","fileType":"model","attachment":{"hash":"e5d6b2ccd3c62cb979b490cad7393ab44e12ae23c3cf0318f5652da477078f60","size":12548876,"filename":"model.azen.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/c74723ee-8509-4dac-8296-caf7c34a4c13.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"az","targetLanguage":"en","decompressedHash":"fff0b00229e42e3df56be33ec903013aea80dbdd8fc0c3673f6249ab6102490f","decompressedSize":17141051,"filter_expression":"env.channel == 'default' || env.channel == 'nightly'","id":"a00510c5-6be3-4825-bb62-6190b39a95a7","last_modified":1758911497058},{"name":"lex.50.50.enuk.s2t.bin","schema":1758911178075,"version":"3.0","fileType":"lex","attachment":{"hash":"0996c9dab7edb0ea89acd854dcc5346647945a220436b454c5cd477068ae7048","size":1140141,"filename":"lex.50.50.enuk.s2t.bin.zst","location":"main-workspace/translations-models-v2/dc8eb360-c8ce-48e0-adfa-76c3d202fe2b.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"en","targetLanguage":"uk","decompressedHash":"dbfd4f8dc95da9c575164f7fc95ef00a2fb5f7d9f51b656559f99eeebdb57c87","decompressedSize":3054364,"filter_expression":"","id":"4afc90cd-b016-42de-a813-6d2a0f365ce9","last_modified":1758911497054},{"name":"lex.50.50.vien.s2t.bin","schema":1758911188507,"version":"3.0","fileType":"lex","attachment":{"hash":"58e1e76d4c74e19ada9e24a571104090b09df3cc785cfabbbb20f878bfe4bd56","size":1420635,"filename":"lex.50.50.vien.s2t.bin.zst","location":"main-workspace/translations-models-v2/21949f07-8131-4ccb-8b47-3c8ad47371cf.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"vi","targetLanguage":"en","decompressedHash":"3a071ed3d982f6eb6ee116b84067bf70041e4229e43ea65ecb6d7c2796e8851b","decompressedSize":3910184,"filter_expression":"","id":"c5229bcc-27b3-4fea-ae63-6a7f1a99870b","last_modified":1758911497050},{"name":"vocab.enuk.spm","schema":1758911176639,"version":"3.0","fileType":"vocab","attachment":{"hash":"888881477ce96954928a993c7df7d942a712b668a701dea01a0b5e76a46773f8","size":363469,"filename":"vocab.enuk.spm.zst","location":"main-workspace/translations-models-v2/3220a17f-a05d-4a90-8b31-6be582725582.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"en","targetLanguage":"uk","decompressedHash":"4dd6a91feff71e745395dcc0d52f885848ca0d843d5f70628ca51b3be1b70b45","decompressedSize":922077,"filter_expression":"","id":"207f88f7-962a-47a8-9d50-dc232590aced","last_modified":1758911497046},{"name":"model.vien.intgemm.alphas.bin","schema":1758911190332,"version":"3.0","fileType":"model","attachment":{"hash":"eb86a2f722748313dc709baf74f8fdbcf75c1cd772d2d463d0f63d370addd495","size":12760071,"filename":"model.vien.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/39fe7f77-a90a-4954-b9d3-801e9a7e2049.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"vi","targetLanguage":"en","decompressedHash":"de4bf2b9ffb4d910e32720ec3a43655fb6f4062ce5219332f824fc1bdca7a5f4","decompressedSize":17141051,"filter_expression":"","id":"8b2dd5db-dfd6-4a4a-beda-a836af787399","last_modified":1758911497042},{"name":"vocab.vien.spm","schema":1758911196082,"version":"3.0","fileType":"vocab","attachment":{"hash":"5d23256e5834fa7dbab6ad4c6a33f7482a4c3431b08e4ba10c3d9b79368cd9cb","size":318635,"filename":"vocab.vien.spm.zst","location":"main-workspace/translations-models-v2/58727ad3-0e4c-4eec-ad0e-26a0f6e3c6f0.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"vi","targetLanguage":"en","decompressedHash":"cb152765d1e71ea3cf96fdb339c764b7201be7b9ab32e20cfebcf16a20fc0939","decompressedSize":757250,"filter_expression":"","id":"5d3a9025-2c54-40b5-abf0-acd7dcc62478","last_modified":1758911497039},{"name":"lex.50.50.uken.s2t.bin","schema":1758911149979,"version":"3.0","fileType":"lex","attachment":{"hash":"3e4c7f4c847aba15f6bf190eea994a02faabef63ff5bc46a860045d6bfebaa30","size":1326961,"filename":"lex.50.50.uken.s2t.bin.zst","location":"main-workspace/translations-models-v2/f2f178de-95be-447e-8c1c-18a8c52b7972.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"uk","targetLanguage":"en","decompressedHash":"32b5e0df493671a223cb5cb32430181cbb7fe6b5562c91dbc3d35410d37e5ff6","decompressedSize":3914120,"filter_expression":"","id":"2901be3e-7b60-4ea2-b217-2b5fe262a3e6","last_modified":1758911497035},{"name":"model.uken.intgemm.alphas.bin","schema":1758911143744,"version":"3.0","fileType":"model","attachment":{"hash":"e396481ae9e04d359a46772ec222a164738dc2f5eac7cdb7df380940a2194df4","size":12465964,"filename":"model.uken.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/9d2ac72f-05c7-4054-b960-ee1835831e6c.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"uk","targetLanguage":"en","decompressedHash":"2e7b8bc9d2569d8b4ae244e964cdc343a0aa3735cc83ecb664be84a37cb45f48","decompressedSize":17141051,"filter_expression":"","id":"084a4b41-85cc-4af1-b644-d59190211066","last_modified":1758911497031},{"name":"lex.50.50.entr.s2t.bin","schema":1758911131794,"version":"3.0","fileType":"lex","attachment":{"hash":"788b3ef3a65fc604354942cccd9492ffb80472d0680bb9f2a47fd707a02e5801","size":1142021,"filename":"lex.50.50.entr.s2t.bin.zst","location":"main-workspace/translations-models-v2/4eeb0e3d-4c49-443c-9c14-910e73c8327c.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"en","targetLanguage":"tr","decompressedHash":"3aba0be842bd4c192659c781e6fdce8eb9b2b1fff29a40d22f75da369d59f46f","decompressedSize":3261300,"filter_expression":"","id":"6a14d178-d71f-46c2-911d-94c811665832","last_modified":1758911497028},{"name":"model.entr.intgemm.alphas.bin","schema":1758911127670,"version":"3.0","fileType":"model","attachment":{"hash":"c76db256457a62adfcc138e0e506901ad5e2c7000fd3c7e2cfa6a19f022eb1af","size":13065518,"filename":"model.entr.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/b62e0867-6109-42e0-8712-d776a41a8773.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"en","targetLanguage":"tr","decompressedHash":"ea3cd4ee09de190df265c78d84260e277a9a8a3ddff05eb55d72afe7fc0fdbf4","decompressedSize":17141051,"filter_expression":"","id":"27f58c4e-08b2-4dfa-87b8-6d68a994e94c","last_modified":1758911497024},{"name":"lex.50.50.tren.s2t.bin","schema":1758911115905,"version":"3.0","fileType":"lex","attachment":{"hash":"e86a893872b19a02286b260b189c1c98c602b09eea2e05e8eb0af8d389bb7844","size":1817316,"filename":"lex.50.50.tren.s2t.bin.zst","location":"main-workspace/translations-models-v2/f3f6dfe9-476d-4d7b-a66e-37180d0164c1.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"tr","targetLanguage":"en","decompressedHash":"d3374ab5267a73ee1aa1d926a298bd349426835f40856991ee959bc5cd4f9fce","decompressedSize":4662492,"filter_expression":"","id":"ccbe5449-f379-4847-8da7-336da6c9bdec","last_modified":1758911497020},{"name":"vocab.entr.spm","schema":1758911133475,"version":"3.0","fileType":"vocab","attachment":{"hash":"263c27a85922e52099a0c6e12ff3599d72ce870d2255b0af1a693a1213802497","size":335980,"filename":"vocab.entr.spm.zst","location":"main-workspace/translations-models-v2/a7764c47-aaa1-4642-a9b9-c7f9dadb1bde.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"en","targetLanguage":"tr","decompressedHash":"a220363d60391f7ce3df8ec9785424dbc00c24d5786d1a4308cf8ca3ed3385c2","decompressedSize":798793,"filter_expression":"","id":"fa5aafee-080b-419d-9727-c6fe3bbac59d","last_modified":1758911497017},{"name":"model.tren.intgemm.alphas.bin","schema":1758911111235,"version":"3.0","fileType":"model","attachment":{"hash":"7797f95b4b44a62de8ff4233530e7b752e62d90aa17622a63631e7e706891be1","size":11959737,"filename":"model.tren.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/89d75d11-df6a-4974-ae4a-0e3fb549ff80.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"tr","targetLanguage":"en","decompressedHash":"bd18594ac5a7f1d9997e7ea5bd80272082219cf8b1ce604766e4f207eb86abbf","decompressedSize":17140836,"filter_expression":"","id":"914576e9-3170-48fa-a0a1-5e079c77b227","last_modified":1758911497013},{"name":"vocab.ente.spm","schema":1758911099447,"version":"3.0","fileType":"vocab","attachment":{"hash":"7b49c4c9c0fa165367ffaa472fb8cf5bf4e4fda2957e9cd6596f26a01cfe9337","size":370401,"filename":"vocab.ente.spm.zst","location":"main-workspace/translations-models-v2/61d86b41-2de0-4a04-a02f-c9e0cb6c1794.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"en","targetLanguage":"te","decompressedHash":"41d0828d103a07e0608c604102ba4418fcb06e82b3742c1abc6d3ec343673e93","decompressedSize":1056424,"filter_expression":"","id":"e2f74ae5-43c4-418b-8b7b-71bb192e4e54","last_modified":1758911497010},{"name":"model.ente.intgemm.alphas.bin","schema":1758911095045,"version":"3.0","fileType":"model","attachment":{"hash":"d0e60810d1c3a94edc8ba65d85a2b6e228f5fc30efe07c1a05d7bc232f5c8cae","size":12340904,"filename":"model.ente.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/f31029a0-1894-4613-a320-d82a7f1088f1.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"en","targetLanguage":"te","decompressedHash":"a3fee2fcd39df975da28666c536adff60147dce59062fca6097bb42fb2a52500","decompressedSize":17141051,"filter_expression":"","id":"a556f0c7-d444-46b5-b242-bf09559e8f2e","last_modified":1758911497006},{"name":"lex.50.50.ente.s2t.bin","schema":1758911093385,"version":"3.0","fileType":"lex","attachment":{"hash":"aa3ecfebf2db7d0c1df550e181e6d428730021a43e0184d4d3474a9f62cf2a28","size":1046424,"filename":"lex.50.50.ente.s2t.bin.zst","location":"main-workspace/translations-models-v2/366312e5-af5a-4c85-940b-a69acfafa490.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"en","targetLanguage":"te","decompressedHash":"ea44d146f6b4614586654d91d7b677ee617e2367be2eccd72e81aa0fa359b92c","decompressedSize":2832156,"filter_expression":"","id":"bac9845a-4352-4824-ac2a-68ae8a75c1af","last_modified":1758911497002},{"name":"vocab.teen.spm","schema":1758911082928,"version":"3.0","fileType":"vocab","attachment":{"hash":"50975a013fb16c2c9c027b18f894066da6a4a5df5d81b6ee78074d4b4b3fb004","size":370694,"filename":"vocab.teen.spm.zst","location":"main-workspace/translations-models-v2/e90880fb-e971-4735-a2cc-34d0d3374d3f.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"te","targetLanguage":"en","decompressedHash":"dd57e1d68316ae32f9ba3f77223f317ce39cd1ef72e69e6b06b7c1d1ba954052","decompressedSize":1056197,"filter_expression":"","id":"cfa0f69e-1377-40e4-8b20-19434ab55afb","last_modified":1758911496998},{"name":"lex.50.50.teen.s2t.bin","schema":1758911081171,"version":"3.0","fileType":"lex","attachment":{"hash":"1dfb9c2bbb45bc6847b1dadb639e586fcdfe8136f6ec3e7feefd6feafa24b6b2","size":1577578,"filename":"lex.50.50.teen.s2t.bin.zst","location":"main-workspace/translations-models-v2/b2da035e-d401-4d4e-a142-0a3b71634404.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"te","targetLanguage":"en","decompressedHash":"5df84ca17e4cc76a73ef7d93f94f53a89f37a11a456f2b6373ff19c4ce4ef964","decompressedSize":4815756,"filter_expression":"","id":"d4327776-0a6d-42ba-ac5d-dec10e717d25","last_modified":1758911496994},{"name":"vocab.uken.spm","schema":1758911148560,"version":"3.0","fileType":"vocab","attachment":{"hash":"4e901bd72e6b8ea9cb4d772bf599bb961cbb950458bd8db915f9a367c58db85b","size":344405,"filename":"vocab.uken.spm.zst","location":"main-workspace/translations-models-v2/38730585-56ad-4a6a-a1a0-f3bc638ab0a6.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"uk","targetLanguage":"en","decompressedHash":"8b51480dfc4ca2d7a08d2bfdaa9e57353ca97e6cf3d5f9aba4c0179d3665bfc0","decompressedSize":886410,"filter_expression":"","id":"4d113e1f-9400-4aa4-a5ba-a1e6f730dfed","last_modified":1758911496991},{"name":"model.teen.intgemm.alphas.bin","schema":1758911075283,"version":"3.0","fileType":"model","attachment":{"hash":"87fa473b00978edcd2c55a1a88593897343d31073d68b7b98553bab68904ad9a","size":13103685,"filename":"model.teen.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/e73820eb-61d8-4cf6-9322-40754365e584.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"te","targetLanguage":"en","decompressedHash":"e2ec7b13ba6148eba309244ee17dc935f1b71e95bbf57154216f6247877abb7e","decompressedSize":17141051,"filter_expression":"","id":"0c9650e6-a092-4597-ab4a-a7cf05c3a018","last_modified":1758911496987},{"name":"model.enta.intgemm.alphas.bin","schema":1758911062676,"version":"3.0","fileType":"model","attachment":{"hash":"15b79885b46570be4b26c97cd9ea1f663eb88207e4c6138a6ead35cafbfb004d","size":12429590,"filename":"model.enta.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/e54a2411-46b4-4af2-b9cb-4a470f944ad7.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"en","targetLanguage":"ta","decompressedHash":"8c7d9ba830c15e2ba89a70307f301a62b7b2a51ae1e9f9a3938843eaa875af3d","decompressedSize":17141051,"filter_expression":"","id":"5d3a8e68-bdd8-426d-94f9-663b70d5de9d","last_modified":1758911496984},{"name":"model.ensv.intgemm.alphas.bin","schema":1758911044380,"version":"3.0","fileType":"model","attachment":{"hash":"423cd4672db902728c5c493db36397d1ae3d4a534998bc457ad31dcd63fe7e99","size":12574883,"filename":"model.ensv.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/33e8502a-fe20-4dc6-bd8e-dc69f57b5e6f.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"en","targetLanguage":"sv","decompressedHash":"65ea0db8e658435846f297384face62dbf1804cfc92de8388b0e368e6ecc25a7","decompressedSize":17141051,"filter_expression":"","id":"6a964bfe-e42b-47e0-90bb-7279a098be90","last_modified":1758911496980},{"name":"vocab.enta.spm","schema":1758911059536,"version":"3.0","fileType":"vocab","attachment":{"hash":"26f615b46deab5feb66825e4a00ff8656f9f40ddeab33b456ecce2fc37743767","size":370368,"filename":"vocab.enta.spm.zst","location":"main-workspace/translations-models-v2/b53efb05-5e6e-4431-9725-1a93fc25edfb.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"en","targetLanguage":"ta","decompressedHash":"52a02652818903c82d4f2dd680aa89ee8993eaad40c04d3496ef119cb75fb710","decompressedSize":1090089,"filter_expression":"","id":"1f476e12-dfb9-46df-ae00-46cb1c67bab8","last_modified":1758911496976},{"name":"vocab.ensv.spm","schema":1758911042925,"version":"3.0","fileType":"vocab","attachment":{"hash":"bd66b6acac72ae771dd96445fc799f611880b1e695ea444da0535437710b8082","size":337453,"filename":"vocab.ensv.spm.zst","location":"main-workspace/translations-models-v2/29a749da-1118-47f3-b3ef-cbb4d5ee6c80.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"en","targetLanguage":"sv","decompressedHash":"ff7e366ff4228107e58d76ca348e7dea2eb325452363d68e0047e97fb483e40e","decompressedSize":793868,"filter_expression":"","id":"f7229f5d-c0c5-400b-8fd1-7964e96de414","last_modified":1758911496973},{"name":"lex.50.50.ensv.s2t.bin","schema":1758911041188,"version":"3.0","fileType":"lex","attachment":{"hash":"afd09be8c4d3ef162b45423f2608d23672a6bb55222b99f0f6ff14ec0ab37851","size":1427048,"filename":"lex.50.50.ensv.s2t.bin.zst","location":"main-workspace/translations-models-v2/e202f095-a223-4753-bf70-8844409a702a.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"en","targetLanguage":"sv","decompressedHash":"5761c39887a0e0cd3dd38d22cadc31cecd2a43b0514c4bba96b426736e7fd72d","decompressedSize":3948180,"filter_expression":"","id":"2d7a4fcd-93a4-4bb6-a849-280e6bff8648","last_modified":1758911496969},{"name":"model.enuk.intgemm.alphas.bin","schema":1758911167337,"version":"3.0","fileType":"model","attachment":{"hash":"ff694d02907bdb7036b291d24e32600ee3c415aca70ffde5346bd6e130ba110b","size":22275099,"filename":"model.enuk.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/ef729bdb-748a-4a9a-9587-7d4209abf966.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"en","targetLanguage":"uk","decompressedHash":"ed8bb4a811e1c45a259e91052080d25e5c8b4e2df0e59cb1521c04a57855ef97","decompressedSize":31561787,"filter_expression":"","id":"bb8d1c35-2803-4a29-bb23-2d679e83a86a","last_modified":1758911496966},{"name":"vocab.tren.spm","schema":1758911118124,"version":"3.0","fileType":"vocab","attachment":{"hash":"e3b7133eb69572fc04634c0d0ec5926657fa5eb36d31d715781fe3413abed368","size":349554,"filename":"vocab.tren.spm.zst","location":"main-workspace/translations-models-v2/7179995b-36d8-4a3d-bf3c-4cf8afb554cc.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"tr","targetLanguage":"en","decompressedHash":"ed328e589a3ccd70fd3ce7773fc3c01d8b7b18c687464cacf17fd40a8c0daadd","decompressedSize":811353,"filter_expression":"","id":"df1e2b2b-0785-4c74-8454-e20a9556b339","last_modified":1758911496962},{"name":"lex.50.50.enta.s2t.bin","schema":1758911060976,"version":"3.0","fileType":"lex","attachment":{"hash":"134eaa011cbdc2f09e6e49491e0e6acd5bb15e93d6d4e5d500b3ed09cd6bfc71","size":1055580,"filename":"lex.50.50.enta.s2t.bin.zst","location":"main-workspace/translations-models-v2/0568e643-f9a6-45cc-821e-b70ef292549c.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"en","targetLanguage":"ta","decompressedHash":"1c8a503dd72f1c59e0ee0a231bda8acfba510e38f767039c1daedf21d2e84fc4","decompressedSize":2862696,"filter_expression":"","id":"e0f3d583-4fbf-404d-8117-ea4ac2ef705a","last_modified":1758911496959},{"name":"vocab.sven.spm","schema":1758911030699,"version":"3.0","fileType":"vocab","attachment":{"hash":"1ba884da79738377c300bd84d7c7b06ce9c7ade7eb1447a4fb22f9e3b2fb8510","size":337469,"filename":"vocab.sven.spm.zst","location":"main-workspace/translations-models-v2/703e4a10-1fa6-427b-b167-30a9ca897b2e.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"sv","targetLanguage":"en","decompressedHash":"93427195fac4125722ed778707478ef78cb77b3fdf1ed5b93bee9fd36e30a8ec","decompressedSize":793049,"filter_expression":"","id":"aa043391-3fbc-4b9d-ba70-96b58b198f75","last_modified":1758911496955},{"name":"lex.50.50.esen.s2t.bin","schema":1758910993271,"version":"3.0","fileType":"lex","attachment":{"hash":"5c3aae52d8fddeb2e09098171cdecf059ea453474633edcebc77375b04cbcaee","size":1880457,"filename":"lex.50.50.esen.s2t.bin.zst","location":"main-workspace/translations-models-v2/64f16997-3cf3-4cc8-a069-b143760b1173.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"es","targetLanguage":"en","decompressedHash":"e2610211d3b9577d012638fe7e7e74ed7b4b708ce96b9e792e67c282a6492daa","decompressedSize":4636248,"filter_expression":"","id":"9e21e8a2-d54a-4b60-a10a-8d8f32f4e879","last_modified":1758911496940},{"name":"vocab.esen.spm","schema":1758910991838,"version":"3.0","fileType":"vocab","attachment":{"hash":"76b9ef220b22cec379f097852ca6312cabf065d5ddfb05149d5af31aa050ec22","size":348996,"filename":"vocab.esen.spm.zst","location":"main-workspace/translations-models-v2/2239f64b-dfc4-41c1-9e06-d532dce7b246.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"es","targetLanguage":"en","decompressedHash":"5ae254fa9b15aa182e70fd2a6186b1333c63a29a48043a9224c6aa4fcac058ad","decompressedSize":816054,"filter_expression":"","id":"7ce8d431-c8d8-4d9d-b3af-6e3aa48f8c1b","last_modified":1758911496937},{"name":"model.esen.intgemm.alphas.bin","schema":1758910982413,"version":"3.0","fileType":"model","attachment":{"hash":"7d1a512f3d3c420a0d87e52dccf6c83bf7eba7f4c54608824d3f86b757993a3e","size":22849210,"filename":"model.esen.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/fccccf6a-6d29-407d-82a5-0cf73b23d892.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"es","targetLanguage":"en","decompressedHash":"4aed7734152ae0045d1a69ae49c86cfda18f53c61f90e95e1d1de1c7c7c3b033","decompressedSize":31561787,"filter_expression":"","id":"88fb2619-114d-4d20-9166-8c5378c72518","last_modified":1758911496933},{"name":"model.ensl.intgemm.alphas.bin","schema":1758910961206,"version":"3.0","fileType":"model","attachment":{"hash":"c7aa9d806a9a6971ed00ba7565f88f9eea7f82a4afccb8eef9f5ad2d7e319718","size":22036195,"filename":"model.ensl.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/c1302918-496a-4088-a303-3648d7b1afb4.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"en","targetLanguage":"sl","decompressedHash":"a34fc5cc2f52733f64e37f8512cf1ddc4723c08a7a1a59d01fc2b6e641fc2280","decompressedSize":31561787,"filter_expression":"","id":"c44b0763-8b55-463a-b7d6-4d2d56e3c9af","last_modified":1758911496930},{"name":"lex.50.50.ensl.s2t.bin","schema":1758910959442,"version":"3.0","fileType":"lex","attachment":{"hash":"78794bb2fbc2b11c656e03c21608d4b85c1a2a58a0981e17054b16d101aae350","size":1266300,"filename":"lex.50.50.ensl.s2t.bin.zst","location":"main-workspace/translations-models-v2/bf434266-a13c-436e-8ce6-a7aa181fe394.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"en","targetLanguage":"sl","decompressedHash":"2190798297bc12505f917189defcf451ab5bd2e815bc05df244dc291dc2ae63b","decompressedSize":3428300,"filter_expression":"","id":"ea08fd21-6792-4a6b-a5cb-1eb9f323fa4f","last_modified":1758911496926},{"name":"vocab.ensl.spm","schema":1758910957997,"version":"3.0","fileType":"vocab","attachment":{"hash":"4fcec69e165d39b061acdb861652e3601e26ea0bdff2bc8723555828496f395d","size":337127,"filename":"vocab.ensl.spm.zst","location":"main-workspace/translations-models-v2/ba6a290f-f9f6-4bee-8047-20c8ad6e435e.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"en","targetLanguage":"sl","decompressedHash":"7cd295383c46824c05a05db76b543d3595f2516537dd22b77190a45c8919224d","decompressedSize":803212,"filter_expression":"","id":"f8fb0e0c-50ff-4fef-b371-1b0f91160acb","last_modified":1758911496922},{"name":"vocab.slen.spm","schema":1758910940345,"version":"3.0","fileType":"vocab","attachment":{"hash":"2e265dd39128d39044459f2942067527f32d696c082e2e6d0ad4c9ccd64f911b","size":336950,"filename":"vocab.slen.spm.zst","location":"main-workspace/translations-models-v2/b7741d7d-f9c8-440b-b38c-748ad81549ce.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"sl","targetLanguage":"en","decompressedHash":"54ed331d3435e2bdc5b02462180197b77631f466fc0e61897b5469449857dd2b","decompressedSize":803078,"filter_expression":"","id":"9291feb2-82eb-40e0-89c2-ed53f72621c1","last_modified":1758911496918},{"name":"lex.50.50.slen.s2t.bin","schema":1758910938560,"version":"3.0","fileType":"lex","attachment":{"hash":"73d8b5d54ca7fca81bbe1624a1566e79b2b7a768788a7ec77c0cc17cedee77d7","size":1545228,"filename":"lex.50.50.slen.s2t.bin.zst","location":"main-workspace/translations-models-v2/63d726cb-53f3-4ffc-b84e-29f4a931f671.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"sl","targetLanguage":"en","decompressedHash":"f456a49e437ccb4a547e4b51480e29c8b83f11e26a3713af35b078cd4dd255cc","decompressedSize":4320484,"filter_expression":"","id":"d1902995-2beb-4704-98ef-8864dfb50a55","last_modified":1758911496914},{"name":"model.ensk.intgemm.alphas.bin","schema":1758910902582,"version":"3.0","fileType":"model","attachment":{"hash":"9765cf79693796e6031f42892d50697898dd82044ff48f9a2319572597c3ffe9","size":22359789,"filename":"model.ensk.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/289dec6a-cbd3-42a8-8f2e-98feb5d363aa.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"en","targetLanguage":"sk","decompressedHash":"e33af359fd58c8958104b1b74b3ea302800ccba2f125c1629e09d7f9dd9a3804","decompressedSize":31561787,"filter_expression":"","id":"6b3d6423-0107-44b4-80d0-a20e64e2f27e","last_modified":1758911496907},{"name":"model.sven.intgemm.alphas.bin","schema":1758911023069,"version":"3.0","fileType":"model","attachment":{"hash":"729fe5d1804d099655244ccb36c4c141f85ab5915bfc565f65ac9ba9cf577eb1","size":12667710,"filename":"model.sven.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/ddf23afb-4563-40ee-82b8-ae3b393c5540.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"sv","targetLanguage":"en","decompressedHash":"92d79e2725718b84aed486473bdfcbe6bba3e7094922d4bead8a121cfa346372","decompressedSize":17141051,"filter_expression":"","id":"d8633db3-6792-4bd5-9401-2e2725faa2b6","last_modified":1758911496903},{"name":"vocab.sken.spm","schema":1758910884056,"version":"3.0","fileType":"vocab","attachment":{"hash":"73812cd813bd2e503a1cd5811c06e1f1f9284b873586ce2cf5ccc7f694340530","size":341427,"filename":"vocab.sken.spm.zst","location":"main-workspace/translations-models-v2/238df453-7af9-427f-88a4-3fe5bec03748.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"sk","targetLanguage":"en","decompressedHash":"7d25655bd15f34d77db5d2cb96a51c7943c5528f37f83b677a09bb0ea4e4f59b","decompressedSize":808082,"filter_expression":"","id":"fa65acb1-8981-4068-97a3-47f91d3d6dcc","last_modified":1758911496900},{"name":"lex.50.50.sken.s2t.bin","schema":1758910882205,"version":"3.0","fileType":"lex","attachment":{"hash":"235a55203e3a84e0f39a5b0e8606857f2944f8aff0ad20d41af46ce4b3b8e33b","size":1699601,"filename":"lex.50.50.sken.s2t.bin.zst","location":"main-workspace/translations-models-v2/43a87259-7bc8-4c67-84d2-1a4e3732cd49.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"sk","targetLanguage":"en","decompressedHash":"18577a7ded6b9957c948f2a384683f7ce09def42336c8141eee7ba86b79e2c8e","decompressedSize":4913324,"filter_expression":"","id":"e58ee84e-8619-459b-a559-2404bf818889","last_modified":1758911496896},{"name":"model.slen.intgemm.alphas.bin","schema":1758910928072,"version":"3.0","fileType":"model","attachment":{"hash":"e6799be2554f24b67c5fafce2ca105ee52dd76c1c83f75113f580d01c1b03378","size":23428321,"filename":"model.slen.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/136f4425-db72-46c4-9604-9158d1f9af0d.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"sl","targetLanguage":"en","decompressedHash":"9d15df58b60048366de4f7b6e727157ffdaea3a0fd1c1759ce232b057e2f991c","decompressedSize":31561787,"filter_expression":"","id":"510f3ad3-8a01-4821-8c88-67b47400f193","last_modified":1758911496892},{"name":"model.sken.intgemm.alphas.bin","schema":1758910875735,"version":"3.0","fileType":"model","attachment":{"hash":"3ff0a7572b1b2c319b8de7825c263e502dbe9fadb44e5dc3d029774a1e20de72","size":12641384,"filename":"model.sken.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/72fddf49-57e8-493b-9de4-6bfe3d05590b.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"sk","targetLanguage":"en","decompressedHash":"1686f94838ace314719e945606a09a66dafd40847dd3fd352ad3f7a969aac62f","decompressedSize":17141051,"filter_expression":"","id":"e8b49077-d338-4ea8-b616-35f673a796f8","last_modified":1758911496888},{"name":"lex.50.50.ensk.s2t.bin","schema":1758910911913,"version":"3.0","fileType":"lex","attachment":{"hash":"66dcee968a7466846e0e9924b9b9814e429ccd134177c4a4366055c4efd07c81","size":1247884,"filename":"lex.50.50.ensk.s2t.bin.zst","location":"main-workspace/translations-models-v2/09ad7811-f925-423a-9602-4d7e6950c46a.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"en","targetLanguage":"sk","decompressedHash":"f3d1aec4ee5246d6a6ee5dc7ed4c6b18f6071c7baca69bf1344aef675b95515d","decompressedSize":3356348,"filter_expression":"","id":"0d81d379-c30c-4b09-82b9-881dfbd0e7c3","last_modified":1758911496885},{"name":"lex.50.50.sren.s2t.bin","schema":1758910858543,"version":"3.0","fileType":"lex","attachment":{"hash":"62f9479ab7f016b8bb1da685b56115165e4362a1ea1703f4f6e81d3e4f5d3d9a","size":1489437,"filename":"lex.50.50.sren.s2t.bin.zst","location":"main-workspace/translations-models-v2/14786133-2300-4496-9ed0-201e36a50eab.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"sr","targetLanguage":"en","decompressedHash":"476d9731a1fd44811466abf2292523f11eaad57f0fb7a5cd30391e7720c7071a","decompressedSize":4628048,"filter_expression":"","id":"fa751d40-0232-4abc-b82d-3ce7e9c200c3","last_modified":1758911496881},{"name":"vocab.sren.spm","schema":1758910857088,"version":"3.0","fileType":"vocab","attachment":{"hash":"9b74d81b47b429bf80890bc7c1f1b7553dd94af68b8a8e98b4b03ff62c623117","size":339285,"filename":"vocab.sren.spm.zst","location":"main-workspace/translations-models-v2/655b140f-8987-4eb7-9d37-818bdf24c830.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"sr","targetLanguage":"en","decompressedHash":"5cdbad076c8f5b11e3342f5011e9f56f22558523ca82aec9bab621ddc7614bdc","decompressedSize":822509,"filter_expression":"","id":"8a87cdf5-37d7-4049-bfb0-ffe4a63edc04","last_modified":1758911496877},{"name":"vocab.enru.spm","schema":1758910846329,"version":"3.1","fileType":"vocab","attachment":{"hash":"088a38d8b5faf6315b284e3088714f70a8c79438496b15826b6c62496503c447","size":345737,"filename":"vocab.enru.spm.zst","location":"main-workspace/translations-models-v2/e88102cf-1664-482e-a1f2-a5e1390e2584.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"en","targetLanguage":"ru","decompressedHash":"56ee63e14e8cb926c394242adc3ed7cc602644c3d33058cff2ce2959d52a6258","decompressedSize":904455,"filter_expression":"env.appinfo.OS == 'Android'","id":"1e03ec86-69cf-48bd-8013-28079d7c893e","last_modified":1758911496874},{"name":"vocab.ensk.spm","schema":1758910901160,"version":"3.0","fileType":"vocab","attachment":{"hash":"49f63165c0c04a461a83b148caa2364b47ca3aa513d1411be473b01b4d558319","size":341557,"filename":"vocab.ensk.spm.zst","location":"main-workspace/translations-models-v2/30e326e9-18d1-44fa-9e08-ba8917fddd54.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"en","targetLanguage":"sk","decompressedHash":"cfa6a9e601d74686b117f041eb1ad9de94c34219110b67367d570a9e27026a46","decompressedSize":808888,"filter_expression":"","id":"f82be7ab-4595-4d16-a24b-f34827cd6bb2","last_modified":1758911496870},{"name":"model.enru.intgemm.alphas.bin","schema":1758910837311,"version":"3.1","fileType":"model","attachment":{"hash":"a55b2af86653d6e5f4501c674f3806535734f93540e83db19bffdafe456d0887","size":21044601,"filename":"model.enru.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/bcb1b4a7-3a6a-4974-86f6-76f39b1adf28.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"en","targetLanguage":"ru","decompressedHash":"184cb5cda528eeefc0f75f5d0035d787b71d74af135e3c5608d01ae02ecfb920","decompressedSize":31561787,"filter_expression":"env.appinfo.OS == 'Android'","id":"99df8892-481f-4dae-8908-7700d17302cb","last_modified":1758911496866},{"name":"lex.50.50.enru.s2t.bin","schema":1758910835651,"version":"3.1","fileType":"lex","attachment":{"hash":"d7998ec23c850255c2436bab1a248944877f63bf1842e02f67e50807d172b1bf","size":1013057,"filename":"lex.50.50.enru.s2t.bin.zst","location":"main-workspace/translations-models-v2/c846c29f-b9e0-465d-b74f-de3e022de8c7.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"en","targetLanguage":"ru","decompressedHash":"4d91839726b960e70b6d05c53d0cffd16262832b1c0e1ea99d66f412dcc6a239","decompressedSize":2774540,"filter_expression":"env.appinfo.OS == 'Android'","id":"a250a8cf-20e6-4b5e-9d1d-eb3667904dc9","last_modified":1758911496862},{"name":"model.sren.intgemm.alphas.bin","schema":1758910860335,"version":"3.0","fileType":"model","attachment":{"hash":"b7f805d4eb481d317b067504dfbd1a2e979ad9a80dc6fbab4ac3586bc5b57e07","size":12548273,"filename":"model.sren.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/ca30ca1e-4f1c-4d31-ae67-78045acceb10.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"sr","targetLanguage":"en","decompressedHash":"99c44e9690a7ed2c1f13468765c3b1db2b8a8ae739980e4056d45dca613a1966","decompressedSize":17141051,"filter_expression":"","id":"a6ee036e-8320-4bca-98a7-1b4a0a21a2d5","last_modified":1758911496858},{"name":"vocab.enru.spm","schema":1758910816447,"version":"3.0","fileType":"vocab","attachment":{"hash":"088a38d8b5faf6315b284e3088714f70a8c79438496b15826b6c62496503c447","size":345737,"filename":"vocab.enru.spm.zst","location":"main-workspace/translations-models-v2/13e4cd3b-1643-4fff-ac27-72c8732d1479.zst","mimetype":"application/zstd"},"architecture":"base","sourceLanguage":"en","targetLanguage":"ru","decompressedHash":"56ee63e14e8cb926c394242adc3ed7cc602644c3d33058cff2ce2959d52a6258","decompressedSize":904455,"filter_expression":"env.appinfo.OS != 'Android'","id":"bfe3eac9-8250-44bb-935e-7cf1c19a8d46","last_modified":1758911496855},{"name":"lex.50.50.enru.s2t.bin","schema":1758910807150,"version":"3.0","fileType":"lex","attachment":{"hash":"d5a33e067e7a7b2a1168f70d403424c4e68c539c333837bde05b150f83c39e8b","size":990112,"filename":"lex.50.50.enru.s2t.bin.zst","location":"main-workspace/translations-models-v2/001d4c2d-b97f-454c-95c5-f02a436e4640.zst","mimetype":"application/zstd"},"architecture":"base","sourceLanguage":"en","targetLanguage":"ru","decompressedHash":"3587f93c10c1d457f874c2ba7ff4d5e2686fdaf7f3fd179cfefeacab3c6990b9","decompressedSize":2768468,"filter_expression":"env.appinfo.OS != 'Android'","id":"87b0a45e-7eb1-4782-b116-56409e76fb8f","last_modified":1758911496851},{"name":"model.ruen.intgemm.alphas.bin","schema":1758910780899,"version":"3.0","fileType":"model","attachment":{"hash":"888042ddfb6978d8ba1fcfc7592e0a2d5219aece6d140da16399dbc5e01ca221","size":12392942,"filename":"model.ruen.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/0926f015-f94c-47c7-a49c-988e3607396e.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"ru","targetLanguage":"en","decompressedHash":"b1d85c13cfbb05e1d326dd6f0fb5ef270a2011b547450260f96567a93f446c94","decompressedSize":17141051,"filter_expression":"","id":"5cab71d8-ed8a-4f4e-b305-9c9c8069fec1","last_modified":1758911496847},{"name":"model.enru.intgemm.alphas.bin","schema":1758910808832,"version":"3.0","fileType":"model","attachment":{"hash":"8a9ee496752361b7d7dd449dab046929880d21ab3ebcd2a261f076441d52dc30","size":29744901,"filename":"model.enru.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/935dd36c-6429-4686-a3c3-074aa1873cf2.zst","mimetype":"application/zstd"},"architecture":"base","sourceLanguage":"en","targetLanguage":"ru","decompressedHash":"0ef9a209c5edc46692750e7505b3695655b1c7c3ec73058b641201ef18c481ce","decompressedSize":42992955,"filter_expression":"env.appinfo.OS != 'Android'","id":"5e98f2ef-948f-4de6-a5e7-79728ec686fb","last_modified":1758911496844},{"name":"vocab.ruen.spm","schema":1758910779449,"version":"3.0","fileType":"vocab","attachment":{"hash":"53904c7899dcd256bbc5b519261bf8ccf9bbac8945274f1329db763bd6dd48ae","size":346044,"filename":"vocab.ruen.spm.zst","location":"main-workspace/translations-models-v2/b2e74dc9-493d-45c2-9b1b-0c197eb7f745.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"ru","targetLanguage":"en","decompressedHash":"93bdc941b16e523695c319f74778bca9fd8b75a25ad75020cdc98aef74cdc0fc","decompressedSize":905257,"filter_expression":"","id":"74eda701-31ad-4427-83c0-e3600dfd5c21","last_modified":1758911496840},{"name":"lex.50.50.ruen.s2t.bin","schema":1758910777563,"version":"3.0","fileType":"lex","attachment":{"hash":"deb087bd1b18418784b70dbe7d20d996b2e7ed5b21b922c949f5a1973592e1d4","size":1439746,"filename":"lex.50.50.ruen.s2t.bin.zst","location":"main-workspace/translations-models-v2/2783a640-05ed-4eb9-8586-d46e67d30049.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"ru","targetLanguage":"en","decompressedHash":"f654693577505fd38b1f3d220cdd4ffffbb45afb900a60cf751f0724eadc74e0","decompressedSize":4483844,"filter_expression":"","id":"258a9234-07cf-4126-aba8-e24a3d61c959","last_modified":1758911496836},{"name":"model.enro.intgemm.alphas.bin","schema":1758910761876,"version":"3.0","fileType":"model","attachment":{"hash":"acacf72be3a0860c45ba8e37e36356aa264418f43fe08492cad4e34800da472e","size":11836949,"filename":"model.enro.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/8da98363-934f-49cd-ae8e-c6c531a5d563.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"en","targetLanguage":"ro","decompressedHash":"aa98c415e5beb1c5ee2f7d2508a3bbba949be223d7d9e5e1788ad0ae8598dda5","decompressedSize":17141051,"filter_expression":"","id":"761bc790-808a-4269-87fa-450350d19faa","last_modified":1758911496832},{"name":"lex.50.50.enro.s2t.bin","schema":1758910758251,"version":"3.0","fileType":"lex","attachment":{"hash":"83dd2508a9eff3ae0b401e08cb17073678c2ad1977b5d09e8efeab0ad7648a05","size":1357161,"filename":"lex.50.50.enro.s2t.bin.zst","location":"main-workspace/translations-models-v2/9973d8be-2dbe-412a-87b3-06268b16c333.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"en","targetLanguage":"ro","decompressedHash":"508bce64a8bc906a99043ad2f4855b4662e06f8827c1c6a75ab83181b4f17f81","decompressedSize":3739880,"filter_expression":"","id":"70ce7867-bf8b-4fbb-accc-71bbbce4c86c","last_modified":1758911496829},{"name":"vocab.roen.spm","schema":1758910746323,"version":"3.0","fileType":"vocab","attachment":{"hash":"73c670866bbc24a46d1afe3f27514d4699e6714741659a642b22a498f0df1734","size":336276,"filename":"vocab.roen.spm.zst","location":"main-workspace/translations-models-v2/45addfe7-9c60-4124-abb9-f493c412b09c.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"ro","targetLanguage":"en","decompressedHash":"2a690fbcd1b79bc9b99c43d582252720e0900245c82ecc813c8eb05cf063fd0c","decompressedSize":800832,"filter_expression":"","id":"06bd20ad-b26e-4477-9a4c-338423127aa6","last_modified":1758911496825},{"name":"lex.50.50.roen.s2t.bin","schema":1758910744579,"version":"3.0","fileType":"lex","attachment":{"hash":"650cbc194a71ea4bc5e7f90980802d226cf17137f8aa6d22249221a4c29550f2","size":1559590,"filename":"lex.50.50.roen.s2t.bin.zst","location":"main-workspace/translations-models-v2/60cfe659-d12a-42b4-9749-d2b0493e1239.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"ro","targetLanguage":"en","decompressedHash":"d242745eadff6f345784fccf1d58046061501b28c8190ba5912a9da5f056cd2f","decompressedSize":4691708,"filter_expression":"","id":"5e3e6a2a-85b8-452a-9f02-a2828d44cc52","last_modified":1758911496821},{"name":"model.roen.intgemm.alphas.bin","schema":1758910741720,"version":"3.0","fileType":"model","attachment":{"hash":"65b9ab7471535d8a542e8bd059fa442caa3a2fba548026dd7bc06a989cb9b34a","size":12526822,"filename":"model.roen.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/81d8e67d-e982-47c3-bf18-678070003fb6.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"ro","targetLanguage":"en","decompressedHash":"e7542557fc6dbafacddae7b48e67fcdb07bd67b3fb55a76139edf366eca5dbdb","decompressedSize":17141051,"filter_expression":"","id":"5f8514f6-d67c-4183-9548-bb5c92088513","last_modified":1758911496817},{"name":"vocab.enro.spm","schema":1758910760450,"version":"3.0","fileType":"vocab","attachment":{"hash":"05354daf8fb0ba776492b531d4a10f616c27df9e6ba9d0d16d995fc477614458","size":336827,"filename":"vocab.enro.spm.zst","location":"main-workspace/translations-models-v2/c7c06805-a9f2-44d9-b906-c9e48a136c55.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"en","targetLanguage":"ro","decompressedHash":"d89eedf6cbbcb30d7ed4b0b092189196ac2b010ec0c3ede33a6676b17ea1c95e","decompressedSize":801522,"filter_expression":"","id":"62b1383b-12e2-4edf-a0ed-e5764a1eeaf4","last_modified":1758911496806},{"name":"lex.50.50.pten.s2t.bin","schema":1758910704377,"version":"3.0","fileType":"lex","attachment":{"hash":"30d224e25a2e1bdc3aa31af7398f4e317d96d71d463efe3284d4aef230f951c7","size":1850036,"filename":"lex.50.50.pten.s2t.bin.zst","location":"main-workspace/translations-models-v2/35d7b065-8aca-4f7e-82dd-9b2cc287a7f6.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"pt","targetLanguage":"en","decompressedHash":"2685d8b6530be92a4db4cc61f15a097eb114552be15cb6c1699e9d2d99d24470","decompressedSize":4634492,"filter_expression":"","id":"2ebeab14-3b11-4ca6-8286-68d193e5d156","last_modified":1758911496798},{"name":"model.pten.intgemm.alphas.bin","schema":1758910706338,"version":"3.0","fileType":"model","attachment":{"hash":"f2543035eb4e0cf7814d373e7ae69a10d6b48bdcb47121b372ae7b796bbdf9e6","size":22030075,"filename":"model.pten.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/193c17c2-1c17-4fd3-b810-7de7d376a4ea.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"pt","targetLanguage":"en","decompressedHash":"7b854f1ec5a485dd33efd7c1bc01dd7d5a57f566957c5e47722af333f0ce9157","decompressedSize":31561787,"filter_expression":"","id":"ae6198a7-6e0a-4499-ac65-477240fe6071","last_modified":1758911496779},{"name":"model.enfa.intgemm.alphas.bin","schema":1758910644270,"version":"3.0","fileType":"model","attachment":{"hash":"aff2d085ca57d30c76b83ec3426fec2669a96b43189c9b7856616e3a4691adb0","size":12958002,"filename":"model.enfa.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/bbe5d3b3-dfce-4b51-beb0-af4f8cac6fc9.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"en","targetLanguage":"fa","decompressedHash":"456ad3952bcc59d208c76baba4dcef340ee4239416bd760d6fec27f9a16228f8","decompressedSize":17141051,"filter_expression":"","id":"fb774f70-559e-43be-8577-68673345336c","last_modified":1758911496772},{"name":"lex.50.50.enfa.s2t.bin","schema":1758910650657,"version":"3.0","fileType":"lex","attachment":{"hash":"ba2d2ed4a40f2d9d41362326b5b105194acabee346e4e758adcd420130e580b5","size":1281822,"filename":"lex.50.50.enfa.s2t.bin.zst","location":"main-workspace/translations-models-v2/cfddd606-3826-4e61-bdea-261e3311b691.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"en","targetLanguage":"fa","decompressedHash":"8542e7fb2bfa3a11b89f8392b8adb0dbbf863cd34569488b7c4535a91c3ae6b4","decompressedSize":3631332,"filter_expression":"","id":"a5cbd989-e9bb-4d2b-9dc3-4336f1ab309d","last_modified":1758911496765},{"name":"vocab.enfa.spm","schema":1758910642837,"version":"3.0","fileType":"vocab","attachment":{"hash":"fc10d2180a1308667f711ebc959c3fc37805d5a91c5f5e321fd24834e6cea6f3","size":351852,"filename":"vocab.enfa.spm.zst","location":"main-workspace/translations-models-v2/fb0077d0-c6ea-426d-8345-3299252fe687.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"en","targetLanguage":"fa","decompressedHash":"6435d3d9d766159fe192ab90892540b438ad7adb7ab4ea4049f68d0b4cdea3bd","decompressedSize":843133,"filter_expression":"","id":"28a74add-b296-452e-90b2-7b652cd7766e","last_modified":1758911496762},{"name":"vocab.faen.spm","schema":1758910626642,"version":"3.0","fileType":"vocab","attachment":{"hash":"0f8abe5391e52a1a0ae1184bad81e450db32580087f2e0e0f6f770b50197f8af","size":351802,"filename":"vocab.faen.spm.zst","location":"main-workspace/translations-models-v2/9bb40a66-b98e-438f-b485-e96501cb485c.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"fa","targetLanguage":"en","decompressedHash":"bf36943053883d6c0fc98c2985f676a0a37042e796bad0e3df0a813d9d5393f4","decompressedSize":843153,"filter_expression":"","id":"67697ca2-74a4-4c45-ba1d-a571d750e095","last_modified":1758911496758},{"name":"lex.50.50.enml.s2t.bin","schema":1758910614540,"version":"3.0","fileType":"lex","attachment":{"hash":"88f9a97bc34b974579f7c72d782ca27290df53c69965ffd4818b375fd0733c44","size":920892,"filename":"lex.50.50.enml.s2t.bin.zst","location":"main-workspace/translations-models-v2/14c0df49-95d0-4b40-9f5a-d6594a3e35b5.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"en","targetLanguage":"ml","decompressedHash":"4a37286742244a130548b79823c9707bc0e56f373361e2cb56402f82e862c2b0","decompressedSize":2532960,"filter_expression":"","id":"467c37bb-ca47-4e8a-aff0-d88babf2d311","last_modified":1758911496754},{"name":"model.enml.intgemm.alphas.bin","schema":1758910610517,"version":"3.0","fileType":"model","attachment":{"hash":"6d6f0cd1f0b6db78c2210f53e89611504beaabb32b4c3ddb92804ba81988618e","size":12313061,"filename":"model.enml.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/7b125d3f-04cc-499a-b771-1ab295e86fb2.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"en","targetLanguage":"ml","decompressedHash":"c461749c8315f6417104cf4df32e5063e86cb101203f9629512294c1c8ab5337","decompressedSize":17141051,"filter_expression":"","id":"a918ccbc-8a17-4180-bf5c-0a35fe0f7180","last_modified":1758911496751},{"name":"vocab.enml.spm","schema":1758910609062,"version":"3.0","fileType":"vocab","attachment":{"hash":"40129d4f0ef430b88c9ed9e5fed311279886bb419f40615620e72168e3468fab","size":373531,"filename":"vocab.enml.spm.zst","location":"main-workspace/translations-models-v2/c5e0df34-80a4-4447-a6e1-74fe605e2012.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"en","targetLanguage":"ml","decompressedHash":"8282614894087e4ffab325cbdb3aeeba35677f770ef8f253c189b392fe1f4d52","decompressedSize":1109000,"filter_expression":"","id":"d7e257d3-7eed-4629-971b-93b567f324bb","last_modified":1758911496748},{"name":"lex.50.50.mlen.s2t.bin","schema":1758910598247,"version":"3.0","fileType":"lex","attachment":{"hash":"11074a8d06430332055c022c4e2856b068df58c1884623ea6000a7b48ce0d836","size":1613229,"filename":"lex.50.50.mlen.s2t.bin.zst","location":"main-workspace/translations-models-v2/4206161f-035f-49a4-9779-03c98815199c.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"ml","targetLanguage":"en","decompressedHash":"afb882ad10c9540c12fa105e1e5418a54ec8117f11c4f17d998adf1d445e308c","decompressedSize":5017972,"filter_expression":"","id":"337fb37c-1aa7-45a6-a423-1b56ab6b754e","last_modified":1758911496744},{"name":"model.faen.intgemm.alphas.bin","schema":1758910628064,"version":"3.0","fileType":"model","attachment":{"hash":"1706534d8ffa2c40b9c65180dd18a162ecccc0542afbc6aab64deff04210afff","size":12962638,"filename":"model.faen.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/a1a29db2-5a65-41e2-9435-5940f53baf95.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"fa","targetLanguage":"en","decompressedHash":"aa326306c177e11129de5bfeba518abc499c0b6005492766748a9c9ea6f4c712","decompressedSize":17141051,"filter_expression":"","id":"78a03dd6-6280-4cb9-92ca-a926833bd9d5","last_modified":1758911496741},{"name":"model.mlen.intgemm.alphas.bin","schema":1758910593732,"version":"3.0","fileType":"model","attachment":{"hash":"b4fac0211c90c753adcad7ce63b6fe4fc009e8db12498c09d411b8d34b2345fa","size":12614713,"filename":"model.mlen.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/0389a3ec-850e-441d-8717-270b154fe876.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"ml","targetLanguage":"en","decompressedHash":"5480719a5a8ac43acdf28db1c89a4d60837a475e1120ea0c4e021c4d5b7e6fd6","decompressedSize":17141051,"filter_expression":"","id":"a1024003-d642-4645-b063-fb49f9da417e","last_modified":1758911496737},{"name":"lex.50.50.faen.s2t.bin","schema":1758910624835,"version":"3.0","fileType":"lex","attachment":{"hash":"d166fc08650b5f322bb6b8a742820525cd0d6ec7f9804395bfa81e99e8cac45d","size":1427008,"filename":"lex.50.50.faen.s2t.bin.zst","location":"main-workspace/translations-models-v2/33d3faa4-20f8-4733-975b-1db925cd737d.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"fa","targetLanguage":"en","decompressedHash":"4828cb060bd4375f8aabb85fed39c18aca52b738838394546f2ddbf707a6f28e","decompressedSize":3896420,"filter_expression":"","id":"3fa04f14-c549-43d9-bfb9-2baf261519af","last_modified":1758911496734},{"name":"lex.50.50.enms.s2t.bin","schema":1758910574643,"version":"3.0","fileType":"lex","attachment":{"hash":"5e5d8bbefc24785eff0dfca450354eae2e5334e98a00e599a9b42014803fd799","size":1529099,"filename":"lex.50.50.enms.s2t.bin.zst","location":"main-workspace/translations-models-v2/0b98b05b-8cca-45f6-a41d-1605fee99013.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"en","targetLanguage":"ms","decompressedHash":"be8fec4866c9ed2cf669adaea2e259c4c22f34838032eb0ee117c10fcb968c4c","decompressedSize":3936428,"filter_expression":"","id":"e8108ee8-e13d-4b3a-9cfe-c75de793f427","last_modified":1758911496730},{"name":"model.enms.intgemm.alphas.bin","schema":1758910577048,"version":"3.0","fileType":"model","attachment":{"hash":"00ff98a5146cadcec474fcda5b8363e10d9b378c89e2fe3324767429b7791b61","size":12929281,"filename":"model.enms.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/f7c9534b-ffbf-4878-86ee-fde1e5d8510d.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"en","targetLanguage":"ms","decompressedHash":"3d6961462ffa711413d513624d7e6399b3560c2b0994daa73b0a45699e657af8","decompressedSize":17141051,"filter_expression":"","id":"086bc791-aa7e-496e-ad08-7805f86c4b7d","last_modified":1758911496727},{"name":"vocab.mlen.spm","schema":1758910592270,"version":"3.0","fileType":"vocab","attachment":{"hash":"1477407d425d51569541cc327e8b65075fa473e5812938ff2bc1ef972bf60421","size":373671,"filename":"vocab.mlen.spm.zst","location":"main-workspace/translations-models-v2/a9e4c01c-203e-42e6-8006-08be56602354.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"ml","targetLanguage":"en","decompressedHash":"c6b2150c85a18cae437d4e7245ef29d4b3629b2c611fce812d115a59c3b80efe","decompressedSize":1109047,"filter_expression":"","id":"ef9f63c1-9dda-4413-b197-5f43bc25d0c5","last_modified":1758911496723},{"name":"vocab.enms.spm","schema":1758910573191,"version":"3.0","fileType":"vocab","attachment":{"hash":"582af11b84aea26cc4690ff717a2822ad8aed790efaa13e4a1df9d96b4edd015","size":345201,"filename":"vocab.enms.spm.zst","location":"main-workspace/translations-models-v2/1fcf4335-b983-4f7e-b82e-f9deedc6ba9f.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"en","targetLanguage":"ms","decompressedHash":"c1f182330fb8c80778da36dd6e5bde59464db2390f623ea62817081cc759695a","decompressedSize":802440,"filter_expression":"","id":"14647668-de80-417a-9804-15bf77f30e00","last_modified":1758911496719},{"name":"vocab.pten.spm","schema":1758910702880,"version":"3.0","fileType":"vocab","attachment":{"hash":"5b2ef32ade5c06aa3503186dc8c73e0ff21374e097a071f04d73f8bb1ab0e052","size":348792,"filename":"vocab.pten.spm.zst","location":"main-workspace/translations-models-v2/ae51a6b3-800f-4198-8b27-c805216f1979.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"pt","targetLanguage":"en","decompressedHash":"d9f46182823d5bbc84201252b2dfcac28f63e561f0ec827ed858f241864c9def","decompressedSize":816726,"filter_expression":"","id":"618d8e2f-ce4d-4496-af02-0708e3d59e43","last_modified":1758911496716},{"name":"lex.50.50.msen.s2t.bin","schema":1758910562785,"version":"3.0","fileType":"lex","attachment":{"hash":"e83e700bc30494790a785d7bde08e0476a03f0782c89c4f2325c9f756ccf53ef","size":1584758,"filename":"lex.50.50.msen.s2t.bin.zst","location":"main-workspace/translations-models-v2/0c84a1cf-f052-41b5-a707-5fc390b2dae6.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"ms","targetLanguage":"en","decompressedHash":"1ef575be54a310eeace84c52e609f2a8c292f3c4b170376ee6ee3524c0c30316","decompressedSize":4371896,"filter_expression":"","id":"88885408-b4bc-4aca-af17-8cd53be2d027","last_modified":1758911496712},{"name":"vocab.msen.spm","schema":1758910561370,"version":"3.0","fileType":"vocab","attachment":{"hash":"69216b1db1fce92ee6094fd852222d19e42e97d0b8402440eacfaa0de79a81c7","size":344899,"filename":"vocab.msen.spm.zst","location":"main-workspace/translations-models-v2/c830ed7e-91be-4455-b998-ef0f2e3fd576.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"ms","targetLanguage":"en","decompressedHash":"6db8c20803d5f9c9fff2b6c3950f5bda4a9fa14aaef1d92818f8a3d53fd850f9","decompressedSize":802191,"filter_expression":"","id":"721da8f9-9e5e-4bc7-a8ae-09508d5fe597","last_modified":1758911496708},{"name":"model.msen.intgemm.alphas.bin","schema":1758910555399,"version":"3.0","fileType":"model","attachment":{"hash":"01b8ddcc883bbbc0b84a22fc12018c083b6b875346c22d0ae147f0ccda02707d","size":12280411,"filename":"model.msen.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/2057d9dd-393e-4755-bdc8-45963be6ccce.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"ms","targetLanguage":"en","decompressedHash":"db5c9415591f8a35c5c72046227b9c9398acade5df8afb5e6ac9f11f7d6650d5","decompressedSize":17141051,"filter_expression":"","id":"10d69910-f6c1-48ff-a567-134e82da1bd5","last_modified":1758911496704},{"name":"lex.50.50.enlt.s2t.bin","schema":1758910544003,"version":"3.0","fileType":"lex","attachment":{"hash":"2c5c4bf6430208d41982f6af77b04652ffa9e66750d6068d55c22731b0f9f79f","size":1293319,"filename":"lex.50.50.enlt.s2t.bin.zst","location":"main-workspace/translations-models-v2/3706a1a9-e629-45e7-8506-780af4d1231f.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"en","targetLanguage":"lt","decompressedHash":"5972c834218c7beea241dc8fe77c2e577a8d8b4eb3d3dc286d10ad890c64d374","decompressedSize":3421640,"filter_expression":"","id":"803db929-492d-4518-9838-e09590288c5f","last_modified":1758911496701},{"name":"model.enlt.intgemm.alphas.bin","schema":1758910534075,"version":"3.0","fileType":"model","attachment":{"hash":"86aa3577cbcb5743900f01fd062e03c9480007d9e5824ae5a0741fc18389efb0","size":22311787,"filename":"model.enlt.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/1d30200d-a399-4603-8d8b-b9046ad781ab.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"en","targetLanguage":"lt","decompressedHash":"d27c676d9d761c2abfffec83956e32b2923f3f745b56acdbd84c49d888cdc94e","decompressedSize":31561787,"filter_expression":"","id":"3ca14faf-1736-49ee-8d9c-31433849b5da","last_modified":1758911496697},{"name":"vocab.lten.spm","schema":1758910515717,"version":"3.0","fileType":"vocab","attachment":{"hash":"133507a5c1d35a280580430598653a7901b62679230c176e29e968ea57640d3f","size":341090,"filename":"vocab.lten.spm.zst","location":"main-workspace/translations-models-v2/32a927ee-caaa-4bcf-a074-541af9d38622.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"lt","targetLanguage":"en","decompressedHash":"df3c6b7e9aa74ab4cce9f4ec73a44aac80be05fcd41ae55198a92c07c5ee3109","decompressedSize":807623,"filter_expression":"","id":"83a44934-9671-45fe-b324-3f453d4e00c5","last_modified":1758911496694},{"name":"lex.50.50.lten.s2t.bin","schema":1758910513861,"version":"3.0","fileType":"lex","attachment":{"hash":"8eb0012dfda9fc69170be85c3c5c99ffc742b1b4f39e2c05c693244d3f1adeb5","size":1669645,"filename":"lex.50.50.lten.s2t.bin.zst","location":"main-workspace/translations-models-v2/fce2b215-adc9-4dd1-a2a0-1a5484bffee3.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"lt","targetLanguage":"en","decompressedHash":"f687821f4074063031b7857bd61232b4ef520f3cbac5a80d59993b27bf10a032","decompressedSize":4724124,"filter_expression":"","id":"12d4ad63-6ce9-4fe1-a0fb-cd3d960fb0f7","last_modified":1758911496690},{"name":"model.lten.intgemm.alphas.bin","schema":1758910511015,"version":"3.0","fileType":"model","attachment":{"hash":"46b8bd76f10c46e1ffc4ec294a270b44899d49f111018a7110061de550026250","size":12344957,"filename":"model.lten.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/26a8d82e-8711-4cf2-a597-ee9be83bb00c.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"lt","targetLanguage":"en","decompressedHash":"0aa4571ede6f68db2f14d2662875b4d2e6323aeccd75e3b4377ab9072a22db70","decompressedSize":17141051,"filter_expression":"","id":"c4662077-1993-449e-b9e4-a3c61d58fca1","last_modified":1758911496686},{"name":"vocab.enlv.spm","schema":1758910493271,"version":"3.0","fileType":"vocab","attachment":{"hash":"d6fd97c19cb9e8f6215445d53e5850cc1f626501278fd0a85e0d7b3885920e8c","size":343181,"filename":"vocab.enlv.spm.zst","location":"main-workspace/translations-models-v2/ba99fa09-4c28-4a50-9624-28d8bf3015bd.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"en","targetLanguage":"lv","decompressedHash":"63146b49ce46ba1283b6956e38efdd4899d1a409cad9d2b6a06cbd4e32ca0808","decompressedSize":816287,"filter_expression":"","id":"0b9d295a-3629-44b1-ac68-f7e757889420","last_modified":1758911496683},{"name":"lex.50.50.enlv.s2t.bin","schema":1758910491510,"version":"3.0","fileType":"lex","attachment":{"hash":"fc8e637965da42be3a606585df3cc56df35b7e27046d20a0ccf665bcd818841a","size":1268276,"filename":"lex.50.50.enlv.s2t.bin.zst","location":"main-workspace/translations-models-v2/6d4b6947-a999-4d90-8c5c-a54329c2163e.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"en","targetLanguage":"lv","decompressedHash":"d54b9bc278558444c5c25df5ae7339b73eee55cf79705f19fec672b6d55d959c","decompressedSize":3359096,"filter_expression":"","id":"29ee089f-bbb2-458f-8d7c-d93921e107ab","last_modified":1758911496679},{"name":"model.lven.intgemm.alphas.bin","schema":1758910472111,"version":"3.0","fileType":"model","attachment":{"hash":"0f22b0bdfde1d48da68379ca5e949ff2808005e9e1be515bbfe84944c142ecd6","size":12482619,"filename":"model.lven.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/2c29b798-844c-4fe0-b789-ce082f57066a.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"lv","targetLanguage":"en","decompressedHash":"7a96dd363ae9b4485aa254ddbff042223a565a20bfe5ba0ba29b94d8ded0406a","decompressedSize":17141051,"filter_expression":"","id":"d752765b-05b3-45e6-813d-ddb385cb237b","last_modified":1758911496675},{"name":"model.enlv.intgemm.alphas.bin","schema":1758910494694,"version":"3.0","fileType":"model","attachment":{"hash":"67bd9e660b505c36245a6887fd63ceebdc56b1ef12d419616ff05909b85cb1a2","size":23399525,"filename":"model.enlv.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/5d523b02-e5f8-44b6-8fbf-958a8ec823f6.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"en","targetLanguage":"lv","decompressedHash":"715f9f444dffa0b39e71955c28bffd30afa4cc8300a192ec8fabb766cc5ba11d","decompressedSize":31561787,"filter_expression":"","id":"fdbf4dde-b2bd-4426-a9b9-82ea9db96b1a","last_modified":1758911496671},{"name":"srcvocab.enko.spm","schema":1758910460402,"version":"3.1","fileType":"srcvocab","attachment":{"hash":"5d8d6196ece8c45747b78dfeea1364dc4097271ff04aea81364aa6133c080d50","size":345003,"filename":"srcvocab.enko.spm.zst","location":"main-workspace/translations-models-v2/16b94e20-f11a-49fe-81fd-762d86b5ad69.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"en","targetLanguage":"ko","decompressedHash":"8d4e3141868efd410eb86c2b60d41aa6bc6b46e4c4b2c0b85e3792493c69d802","decompressedSize":791280,"filter_expression":"env.appinfo.OS == 'Android'","id":"c3c58473-ee59-45d7-b17b-541375ff7540","last_modified":1758911496668},{"name":"lex.50.50.enko.s2t.bin","schema":1758910458197,"version":"3.1","fileType":"lex","attachment":{"hash":"d98258e56fd35c59555836286aeb4278df8275ee8b5eed314003d0895e93cc40","size":2451078,"filename":"lex.50.50.enko.s2t.bin.zst","location":"main-workspace/translations-models-v2/81fc59a3-084c-4885-86d3-6636ab74ae79.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"en","targetLanguage":"ko","decompressedHash":"96efba97d4bb93ab362e5569bea0f115184d2f68d63b67305ee663c18e32fbeb","decompressedSize":6449612,"filter_expression":"env.appinfo.OS == 'Android'","id":"9a540824-33be-4a81-8b71-33517bcf2da9","last_modified":1758911496664},{"name":"trgvocab.enko.spm","schema":1758910456716,"version":"3.1","fileType":"trgvocab","attachment":{"hash":"0e9e37fe978a94ffa908180719517121d95b751012306976edf4e64f246ba78c","size":348381,"filename":"trgvocab.enko.spm.zst","location":"main-workspace/translations-models-v2/727c6d70-15ca-4e86-8310-d6303efbb893.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"en","targetLanguage":"ko","decompressedHash":"2ece21b28dd7022d36127d17423a74dabf544787dfc1cf614f7b565f93a4a1d3","decompressedSize":815353,"filter_expression":"env.appinfo.OS == 'Android'","id":"288658f5-f356-49f8-b6f8-2f912bcf601d","last_modified":1758911496661},{"name":"vocab.enlt.spm","schema":1758910532584,"version":"3.0","fileType":"vocab","attachment":{"hash":"77bd9e1fe272e80e18032d609b387b39e75cffea72a15d961dc006bd2310060e","size":340144,"filename":"vocab.enlt.spm.zst","location":"main-workspace/translations-models-v2/e79b6651-7e15-4d48-8088-bd2b3f34ac1c.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"en","targetLanguage":"lt","decompressedHash":"5d38fe70ff4a50368af756b715b69519c9ee064c27cbceeabc90d4e1a10f25a8","decompressedSize":806827,"filter_expression":"","id":"e45a4bf7-c081-4e01-8221-7bf90d1cb51c","last_modified":1758911496657},{"name":"model.enko.intgemm.alphas.bin","schema":1758910442877,"version":"3.1","fileType":"model","attachment":{"hash":"27a1ff5306d9325192e19bec69ad7ca870208937701602cdd259f49d53353fe6","size":33362245,"filename":"model.enko.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/bcc59468-c032-43c4-9539-6e14fc2707f3.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"en","targetLanguage":"ko","decompressedHash":"ffe5ef2ce3f2e944055e35310bab186f6a70d533a0ee4394adf716a0e383afbb","decompressedSize":43849787,"filter_expression":"env.appinfo.OS == 'Android'","id":"2c8fabf8-7724-45d3-a590-f58ca8b0cb14","last_modified":1758911496654},{"name":"vocab.lven.spm","schema":1758910470695,"version":"3.0","fileType":"vocab","attachment":{"hash":"4adff5ab4f94a0425fad8dae73689cb077fcc6e21330034a1f6fbe7ab1abf235","size":343290,"filename":"vocab.lven.spm.zst","location":"main-workspace/translations-models-v2/d083a321-1e07-4e85-8c1b-096274dca109.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"lv","targetLanguage":"en","decompressedHash":"585a265757c071f5694d1bb7e65b73f38b1d065a62cda61510fa6c54fb87d2c9","decompressedSize":815278,"filter_expression":"","id":"83c78b6c-cbf3-4fa6-82b6-de02a1a5d0d9","last_modified":1758911496651},{"name":"lex.50.50.enko.s2t.bin","schema":1758910421840,"version":"3.0","fileType":"lex","attachment":{"hash":"7216367b7f524c0ae1f39353e5c4622b230d1c2e47924182a5853418c1e69f64","size":2675843,"filename":"lex.50.50.enko.s2t.bin.zst","location":"main-workspace/translations-models-v2/493336e3-8e7b-4223-86c5-e88846a85d46.zst","mimetype":"application/zstd"},"architecture":"base","sourceLanguage":"en","targetLanguage":"ko","decompressedHash":"7734265822ce315c72334ad538e698ab3900ab8e8f04bd43768d0aecad6b6df7","decompressedSize":6676356,"filter_expression":"env.appinfo.OS != 'Android'","id":"b127860a-33ff-48f4-8873-e08457ea8de7","last_modified":1758911496647},{"name":"model.koen.intgemm.alphas.bin","schema":1758910377372,"version":"3.1","fileType":"model","attachment":{"hash":"439031098a88a1975b0d3bfaccf99ea5a6c8448345a54e64ac9e1f032af07e7f","size":31458175,"filename":"model.koen.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/f4de8251-2ac0-4a4d-b0d4-d229ef050314.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"ko","targetLanguage":"en","decompressedHash":"7cb30cbc0a86e242084756445268a2346136771c92b884d9b4ebb077f67d5507","decompressedSize":43977787,"filter_expression":"env.appinfo.OS == 'Android'","id":"137171e0-6e21-4ab6-a35a-6906b587fca3","last_modified":1758911496643},{"name":"model.enko.intgemm.alphas.bin","schema":1758910415728,"version":"3.0","fileType":"model","attachment":{"hash":"ebe3a360c2a007e31df8595bc01a856376c195718ed3c0a27b336eb9b349d313","size":44942689,"filename":"model.enko.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/e4e7e781-bd8e-4dae-9f8e-d0c8a8a5b07b.zst","mimetype":"application/zstd"},"architecture":"base","sourceLanguage":"en","targetLanguage":"ko","decompressedHash":"1c310a79b61b8824b2eb26b045db043d92722f3e66ea06998f7c89f48da9f6bc","decompressedSize":59504955,"filter_expression":"env.appinfo.OS != 'Android'","id":"4639f5bd-9dae-4e29-91e9-952225255efe","last_modified":1758911496640},{"name":"lex.50.50.koen.s2t.bin","schema":1758910375143,"version":"3.1","fileType":"lex","attachment":{"hash":"e09289af785ede03003a4ba0671095711211e203a0c10b966be0bb61d7c62010","size":3119058,"filename":"lex.50.50.koen.s2t.bin.zst","location":"main-workspace/translations-models-v2/fbd16dc3-f550-4754-9b0b-ba88120ff8cc.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"ko","targetLanguage":"en","decompressedHash":"b26291f063ce216a74239275f0485534a38111203e59d42a2a56ba62d6eeb196","decompressedSize":8617516,"filter_expression":"env.appinfo.OS == 'Android'","id":"c21d1181-bbde-4a8e-a85b-ebcaa63c1489","last_modified":1758911496636},{"name":"model.koen.intgemm.alphas.bin","schema":1758910334927,"version":"3.0","fileType":"model","attachment":{"hash":"a2c67f552fb6fdb7a673f2745edd875c484d58c006912708b183c145f0f6c970","size":42015393,"filename":"model.koen.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/1c6279db-79f9-40cc-a5b8-419e1a3ff9d8.zst","mimetype":"application/zstd"},"architecture":"base","sourceLanguage":"ko","targetLanguage":"en","decompressedHash":"1c902d6f7a8d7e3efe6ff4f7d4960a369957bca4ce2ce4a6e8572c231d525090","decompressedSize":59504955,"filter_expression":"env.appinfo.OS != 'Android'","id":"41ca0274-2389-407e-8e34-30d119251f96","last_modified":1758911496633},{"name":"vocab.enko.spm","schema":1758910414146,"version":"3.0","fileType":"vocab","attachment":{"hash":"dc5b8d46f6dff08950bf36db741f52431a41466cf33f5a105d1c5154586559d2","size":595440,"filename":"vocab.enko.spm.zst","location":"main-workspace/translations-models-v2/ac6a46cf-1cf0-4ea0-b1ad-9fa40d6f6513.zst","mimetype":"application/zstd"},"architecture":"base","sourceLanguage":"en","targetLanguage":"ko","decompressedHash":"709bf0e425345e0e92ce41ed84348a1296a2107c92bdb6624404450ffecbd1f9","decompressedSize":1406926,"filter_expression":"env.appinfo.OS != 'Android'","id":"e8ddb2c7-6a88-4c56-aba8-de3f67bb976f","last_modified":1758911496629},{"name":"lex.50.50.koen.s2t.bin","schema":1758910332863,"version":"3.0","fileType":"lex","attachment":{"hash":"1f9b85b576dc8c18aecda1a9fade332d198176e503f14767d8fc03c8868586f0","size":3118173,"filename":"lex.50.50.koen.s2t.bin.zst","location":"main-workspace/translations-models-v2/074637f4-565e-4d6a-a0e7-e771851e0a80.zst","mimetype":"application/zstd"},"architecture":"base","sourceLanguage":"ko","targetLanguage":"en","decompressedHash":"471cd980c4ba08c240246f9361f64eb5d627848a135b5731d665f9efaa1e26ae","decompressedSize":8617080,"filter_expression":"env.appinfo.OS != 'Android'","id":"8e59940a-01c6-423a-bd34-02a36f29a1f9","last_modified":1758911496626},{"name":"vocab.koen.spm","schema":1758910331255,"version":"3.0","fileType":"vocab","attachment":{"hash":"0ada2b1c9fde85c727ee88d702d1444f9ae427fa85a5bc269035b936ba4a6673","size":595536,"filename":"vocab.koen.spm.zst","location":"main-workspace/translations-models-v2/eb596ffb-63d3-4519-870e-6d5bb5328be9.zst","mimetype":"application/zstd"},"architecture":"base","sourceLanguage":"ko","targetLanguage":"en","decompressedHash":"1c72b740ab793cdc3a8f16913dd6b4e806c77421077dd2d85edeb7be38418598","decompressedSize":1410063,"filter_expression":"env.appinfo.OS != 'Android'","id":"be2fda64-ecfa-46b2-9a40-20d9433101d4","last_modified":1758911496621},{"name":"vocab.koen.spm","schema":1758910373572,"version":"3.1","fileType":"vocab","attachment":{"hash":"0ada2b1c9fde85c727ee88d702d1444f9ae427fa85a5bc269035b936ba4a6673","size":595536,"filename":"vocab.koen.spm.zst","location":"main-workspace/translations-models-v2/38107fa5-ef4b-4eb8-b6a7-8ef468b61121.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"ko","targetLanguage":"en","decompressedHash":"1c72b740ab793cdc3a8f16913dd6b4e806c77421077dd2d85edeb7be38418598","decompressedSize":1410063,"filter_expression":"env.appinfo.OS == 'Android'","id":"baad84dd-1ad9-4abe-a436-7446fa9bd8e8","last_modified":1758911496618},{"name":"vocab.enkn.spm","schema":1758910300312,"version":"3.0","fileType":"vocab","attachment":{"hash":"001beeac3001f64ee1c5b0e0bc49d6c4c001f62d0081f7bebc468745c11a43e4","size":372208,"filename":"vocab.enkn.spm.zst","location":"main-workspace/translations-models-v2/e2f05c89-a5b3-46b4-a787-1cb643fcd505.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"en","targetLanguage":"kn","decompressedHash":"1d41f1f6b67a8c29fa3aabbc7758b766bdd9acdbeec7d1277ab60c8e492c8b7a","decompressedSize":1065180,"filter_expression":"","id":"1cb87fba-ad38-44de-9bce-39ed1429ef45","last_modified":1758911496614},{"name":"model.enkn.intgemm.alphas.bin","schema":1758910294722,"version":"3.0","fileType":"model","attachment":{"hash":"8de6dd7464e2b309ce0a066aedfbfc112100f76287abb318c46666f568b9eea2","size":12891088,"filename":"model.enkn.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/6287e708-1aa6-48f5-9841-90277e9d69bb.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"en","targetLanguage":"kn","decompressedHash":"17a5ddc86e24f62c04aa15272930275812b5c1674bec50a877528680d5834d2d","decompressedSize":17141051,"filter_expression":"","id":"c29940ee-6fa0-4648-bd6d-b87a41765309","last_modified":1758911496610},{"name":"lex.50.50.enkn.s2t.bin","schema":1758910293059,"version":"3.0","fileType":"lex","attachment":{"hash":"f8eb793b9a2549a1e90db69f3e16958de61a3261903c1b4e0ff49bea0c568a09","size":1043956,"filename":"lex.50.50.enkn.s2t.bin.zst","location":"main-workspace/translations-models-v2/9bd8525a-6017-4c6f-a8b5-693d390572b4.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"en","targetLanguage":"kn","decompressedHash":"94b660f37c9c29a904b48498a7202846faaeef16f30668f356336c29cefc0f63","decompressedSize":2808304,"filter_expression":"","id":"49011e4a-8e82-4fb4-9ee7-3a4e1f1e2e99","last_modified":1758911496607},{"name":"lex.50.50.knen.s2t.bin","schema":1758910283054,"version":"3.0","fileType":"lex","attachment":{"hash":"0c09047e71d1067fc1ae9f1466d8612837fd3d5a6c9413e3487b4be1a71e2cd6","size":1525360,"filename":"lex.50.50.knen.s2t.bin.zst","location":"main-workspace/translations-models-v2/bc07668b-3d77-401c-a2b2-589947bb0ffd.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"kn","targetLanguage":"en","decompressedHash":"aa50a74f15e9ef8cf27a5b905c17037bd9d67883afde71b34c4138f9507fedfc","decompressedSize":4655776,"filter_expression":"","id":"4cca4118-f0d3-4111-aaf7-af593d5f8cd0","last_modified":1758911496603},{"name":"vocab.knen.spm","schema":1758910276611,"version":"3.0","fileType":"vocab","attachment":{"hash":"3de7f62da9cb9566a6a29082da8c06ad30d29c546f32d7247b69b7b2596a67e4","size":372652,"filename":"vocab.knen.spm.zst","location":"main-workspace/translations-models-v2/27b42037-2558-4720-8fa0-34f243b2e606.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"kn","targetLanguage":"en","decompressedHash":"d729397a42dba5801f330927a9956527161d6e0711b59fcea7cd2e862e6f36cc","decompressedSize":1065636,"filter_expression":"","id":"bbfd4d3e-f681-474d-88ec-5b65dd150263","last_modified":1758911496600},{"name":"lex.50.50.lven.s2t.bin","schema":1758910475774,"version":"3.0","fileType":"lex","attachment":{"hash":"155a24e8ffb4b0bf17616bfc7f14f52e929d3141abe5c32f8779da5ae4b1ccd6","size":1569767,"filename":"lex.50.50.lven.s2t.bin.zst","location":"main-workspace/translations-models-v2/e63aaa92-f7f0-4957-90b4-c208b351a640.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"lv","targetLanguage":"en","decompressedHash":"dff852d317f80169899e2e1132277cf922fa7a117b060e09a14dd19c0e1a02b8","decompressedSize":4214476,"filter_expression":"","id":"862c6d58-10e5-4d7b-a2e7-78282b65699d","last_modified":1758911496597},{"name":"lex.50.50.enja.s2t.bin","schema":1758910266014,"version":"3.0","fileType":"lex","attachment":{"hash":"8954d5b63432366992b22ad2aaa11895e2643014835049fe677655540a705915","size":1751977,"filename":"lex.50.50.enja.s2t.bin.zst","location":"main-workspace/translations-models-v2/83e22dc9-40c4-4ac1-8c25-5d3877b5f628.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"en","targetLanguage":"ja","decompressedHash":"edfb7eb47b98a2689b804ab3614c31b24f1257aa54b1154da3d85e1ae8152d9f","decompressedSize":4128360,"filter_expression":"","id":"84a3db4a-db12-4d1a-9b6e-40ec28c3c43a","last_modified":1758911496594},{"name":"trgvocab.enja.spm","schema":1758910264591,"version":"3.0","fileType":"trgvocab","attachment":{"hash":"5384abf34f0e1298f795bd14909a577272059041e60f91a5eb10500e35d0ee98","size":361180,"filename":"trgvocab.enja.spm.zst","location":"main-workspace/translations-models-v2/e54d177c-1131-4fbf-90ea-6741a98d6675.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"en","targetLanguage":"ja","decompressedHash":"3b3d9f8f3a034d98d0a476f1794fa79c01e4e98a967ceb6777a66ba2d03ec1e1","decompressedSize":827144,"filter_expression":"","id":"807942e6-6bd0-4121-9099-cc7d0ec53ab2","last_modified":1758911496590},{"name":"model.knen.intgemm.alphas.bin","schema":1758910278036,"version":"3.0","fileType":"model","attachment":{"hash":"bc0e05f2022fbc3d8bde97bc3e21eaa5d3bff0e3813b4249e34698d9707a2e00","size":12964143,"filename":"model.knen.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/958f7dd0-f453-4d3a-a45b-1c931f9a63da.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"kn","targetLanguage":"en","decompressedHash":"49e8d3bd794b098047f7b177d9d0e6d3e49ac798c2b75bc132149cb46c5bfbfd","decompressedSize":17141051,"filter_expression":"","id":"107fd668-1bd1-4824-b06a-c7607d1f6226","last_modified":1758911496587},{"name":"srcvocab.enja.spm","schema":1758910263115,"version":"3.0","fileType":"srcvocab","attachment":{"hash":"dd1e93d625d9a8d8a42f75255343f302ea37527933eda1a490652b66a7408a64","size":345747,"filename":"srcvocab.enja.spm.zst","location":"main-workspace/translations-models-v2/d10e4482-b9ba-4565-ab44-5ba3cebcf94b.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"en","targetLanguage":"ja","decompressedHash":"970c98d174fc01e0339fbabbf45af36a4be3f26f819ec1a5ea1189f71e091889","decompressedSize":796275,"filter_expression":"","id":"38968319-f51d-4b4c-8c7e-80a4a6bd3abb","last_modified":1758911496583},{"name":"model.enja.intgemm.alphas.bin","schema":1758910251828,"version":"3.0","fileType":"model","attachment":{"hash":"f92259b9904812350b71f440c3328f3e2e856f31c1a3ab6002756380dd908e00","size":32431590,"filename":"model.enja.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/a01a5318-41c7-4266-8fe1-66c105d6d711.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"en","targetLanguage":"ja","decompressedHash":"59ae659f9bb63e4f81f474fe3c03d3f4499434b5f9e779fab7c12a45f31fd562","decompressedSize":43849787,"filter_expression":"","id":"cf8e6d41-9247-482a-be8a-a5ff6c45d4dd","last_modified":1758911496580},{"name":"model.jaen.intgemm.alphas.bin","schema":1758910216835,"version":"3.1","fileType":"model","attachment":{"hash":"dadb385632174c77ab57c130c9e3cab1cd1a6874fe85b799a8b0af439fe78c91","size":31973916,"filename":"model.jaen.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/74c6f502-909a-4683-a5f3-e1283ad086a9.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"ja","targetLanguage":"en","decompressedHash":"3a603e20bfe1be86071913f9e23ab5129075bc0a8490151020ac4821e4f17302","decompressedSize":43977787,"filter_expression":"env.appinfo.OS == 'Android'","id":"cfa3fd50-8bd4-4770-bae4-8e7e640aa9e3","last_modified":1758911496577},{"name":"vocab.jaen.spm","schema":1758910215162,"version":"3.1","fileType":"vocab","attachment":{"hash":"f41f32e36f879643a47fedbd0616fa12f416da62e23af8620ee4fc7705217acc","size":617539,"filename":"vocab.jaen.spm.zst","location":"main-workspace/translations-models-v2/9c331ae2-c079-425a-908b-c1a3192dcfaa.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"ja","targetLanguage":"en","decompressedHash":"5cb217758bae05877bb3f0c2f612e4e7c1e4cb03c10db11f4a47098d7ae62919","decompressedSize":1443222,"filter_expression":"env.appinfo.OS == 'Android'","id":"f921a605-3891-4f85-abad-0fda6863ced9","last_modified":1758911496573},{"name":"lex.50.50.jaen.s2t.bin","schema":1758910212981,"version":"3.1","fileType":"lex","attachment":{"hash":"571403c44adfa4d545e9e4d537e0e7e56ab6bc3858669db7545c70b0bf39f31e","size":3359102,"filename":"lex.50.50.jaen.s2t.bin.zst","location":"main-workspace/translations-models-v2/55f9a9f0-891f-448b-85b7-d62488b45b1e.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"ja","targetLanguage":"en","decompressedHash":"525f412f0d210536c2933c78ae395fa0bf2b5ee6cc5dda61ebc2e79410ebaee4","decompressedSize":9348172,"filter_expression":"env.appinfo.OS == 'Android'","id":"bc580bcb-264f-42cb-940e-4ace66b320c7","last_modified":1758911496570},{"name":"model.jaen.intgemm.alphas.bin","schema":1758910177831,"version":"3.0","fileType":"model","attachment":{"hash":"c0c9f2e48979f022e16271049d96dbef9aa28f8fddc2d1db8fa0c399dec903f7","size":41929252,"filename":"model.jaen.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/53a52e41-5abb-4705-9ba8-8dbc07614bdc.zst","mimetype":"application/zstd"},"architecture":"base","sourceLanguage":"ja","targetLanguage":"en","decompressedHash":"a9bf800679bba570520e1161d7b4fbfcb957add32ca35812134add85689752ad","decompressedSize":59504955,"filter_expression":"env.appinfo.OS != 'Android'","id":"52665517-29d7-49db-a6e8-6f2229802a9c","last_modified":1758911496566},{"name":"vocab.jaen.spm","schema":1758910176241,"version":"3.0","fileType":"vocab","attachment":{"hash":"f41f32e36f879643a47fedbd0616fa12f416da62e23af8620ee4fc7705217acc","size":617539,"filename":"vocab.jaen.spm.zst","location":"main-workspace/translations-models-v2/2566c4c6-4b9f-4d94-8898-38dbda231813.zst","mimetype":"application/zstd"},"architecture":"base","sourceLanguage":"ja","targetLanguage":"en","decompressedHash":"5cb217758bae05877bb3f0c2f612e4e7c1e4cb03c10db11f4a47098d7ae62919","decompressedSize":1443222,"filter_expression":"env.appinfo.OS != 'Android'","id":"0c260b40-456f-4af1-9155-1f1854d20dc8","last_modified":1758911496562},{"name":"lex.50.50.jaen.s2t.bin","schema":1758910174244,"version":"3.0","fileType":"lex","attachment":{"hash":"e6715f3e8a9d2ff08004b8185305de73906d7c31352f99a7f0424b4bf96a9422","size":3358329,"filename":"lex.50.50.jaen.s2t.bin.zst","location":"main-workspace/translations-models-v2/3fe6eec6-c9fa-4262-85d1-a773ece70b6c.zst","mimetype":"application/zstd"},"architecture":"base","sourceLanguage":"ja","targetLanguage":"en","decompressedHash":"8f858a72fcbaa476c582577b04d6f5f89d645d2335b0b4a794c2706d4b1f75ff","decompressedSize":9346816,"filter_expression":"env.appinfo.OS != 'Android'","id":"380243ef-c378-4af2-a8ec-75bda5ff0afd","last_modified":1758911496559},{"name":"model.enis.intgemm.alphas.bin","schema":1758910137543,"version":"3.0","fileType":"model","attachment":{"hash":"8402e6c013b5ecb857208e591ba74b0fc18d148045bd6fbcde5f6f40b4d4fc1f","size":21926606,"filename":"model.enis.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/b5e24255-f5dc-492f-be70-98d0f0e14a93.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"en","targetLanguage":"is","decompressedHash":"459626236a49158aa555facd23e5f594e2f8416f4ebad32e0548af94c5b1ae0c","decompressedSize":31561787,"filter_expression":"","id":"b9ba5db9-c6f3-4ea0-8c90-8524179beddc","last_modified":1758911496555},{"name":"lex.50.50.enis.s2t.bin","schema":1758910134275,"version":"3.0","fileType":"lex","attachment":{"hash":"fd764cbcca28a4a46cd709d11966cc35a8f0f68c2c0043f57848295396b7c206","size":1438927,"filename":"lex.50.50.enis.s2t.bin.zst","location":"main-workspace/translations-models-v2/294b1f10-c5b1-43b0-a739-703358b4325b.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"en","targetLanguage":"is","decompressedHash":"4927d2bed702141b4ddd8a5e7034b27fb17312fdb7e3cc5f455ccf2e2f6670e0","decompressedSize":3837564,"filter_expression":"","id":"b0a96ac9-8ab0-4940-a199-cf655e68caeb","last_modified":1758911496552},{"name":"lex.50.50.isen.s2t.bin","schema":1758910116065,"version":"3.0","fileType":"lex","attachment":{"hash":"ab8ea8f40724ff3d001da26f67dfe16c0ab7ac0f36ee1e2ebfe0def0035bfcf1","size":1520156,"filename":"lex.50.50.isen.s2t.bin.zst","location":"main-workspace/translations-models-v2/11ecf779-6cf8-474e-b5fb-aeace6a6157a.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"is","targetLanguage":"en","decompressedHash":"0655d05ccaf3cd2a01f910ef542455b7b14e66d96f6c95889079b9ca1ee168cf","decompressedSize":3951884,"filter_expression":"","id":"08bc17f2-89ed-4645-8219-89126f63e87e","last_modified":1758911496548},{"name":"vocab.isen.spm","schema":1758910114648,"version":"3.0","fileType":"vocab","attachment":{"hash":"0fbe02de86825fce8c0b38d3ce924e0e167a9baa63006c1cd9196abfa6d8103b","size":351172,"filename":"vocab.isen.spm.zst","location":"main-workspace/translations-models-v2/22f9389f-cf73-451f-bc89-2de0bb21911c.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"is","targetLanguage":"en","decompressedHash":"5c69f0c81f6198f5615ac5aad9d89eb81a46ae8ea396a9e8e274a76409d35e13","decompressedSize":808315,"filter_expression":"","id":"2ff6eace-87f2-4cb5-9f4a-c6c0c6923592","last_modified":1758911496544},{"name":"vocab.enis.spm","schema":1758910136083,"version":"3.0","fileType":"vocab","attachment":{"hash":"1bc4b6654739253e1957f9799879361cbabaa0984a38fdec6d48335eb5d581c0","size":351867,"filename":"vocab.enis.spm.zst","location":"main-workspace/translations-models-v2/871e46d5-3cb8-4dc7-8b2f-3f11b24efbc5.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"en","targetLanguage":"is","decompressedHash":"61b2ea10edbe4cc61e36c833cacc2f55778ed9ca860cd382729060634d4b0adb","decompressedSize":809991,"filter_expression":"","id":"682ed9cb-d0a3-4a5c-9c57-cede0937a4ba","last_modified":1758911496537},{"name":"model.isen.intgemm.alphas.bin","schema":1758910107905,"version":"3.0","fileType":"model","attachment":{"hash":"3dd0dcdeb25157ba631c43574b979877ff350b8a93296715be651eb6943e2b73","size":22784368,"filename":"model.isen.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/d8d6ea43-2cd4-4801-ac11-fdea4e61eeb5.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"is","targetLanguage":"en","decompressedHash":"d2c285755d37f710458f1a49db5391a123e4e41ca7bd9829dd87cc61e4907ee6","decompressedSize":31561787,"filter_expression":"","id":"1d3bf2dc-380e-4d56-8d89-00e33251ef9c","last_modified":1758911496534},{"name":"model.iten.intgemm.alphas.bin","schema":1758910074938,"version":"3.0","fileType":"model","attachment":{"hash":"5d3d5a8c463cd9f3a35d99d72165281f66c4637d5297c15418fe1e7cda49856a","size":22858815,"filename":"model.iten.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/24527d9a-7ab8-40e3-a240-f894e0244371.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"it","targetLanguage":"en","decompressedHash":"21b70978ce2f3b4da7a06b5de86a09abe3acd30b9eee1b2ebb3582b9bad790bf","decompressedSize":31561787,"filter_expression":"","id":"2d7147d7-a327-4eef-bc10-a7a95029e761","last_modified":1758911496523},{"name":"vocab.iten.spm","schema":1758910073533,"version":"3.0","fileType":"vocab","attachment":{"hash":"ad75fd13305e6dc6ec6cc95e43fbb3cb2fe8b7ea60332f195785541325555db8","size":346942,"filename":"vocab.iten.spm.zst","location":"main-workspace/translations-models-v2/352a4445-9c4b-43df-a292-c76cb040f428.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"it","targetLanguage":"en","decompressedHash":"3ef0211d4ae6db21440892f180f2019fe2bfc110a330ffa9d2eca9665e4f2bc5","decompressedSize":812724,"filter_expression":"","id":"444d827c-8c8e-4398-8fc3-019a1f70411d","last_modified":1758911496520},{"name":"lex.50.50.iten.s2t.bin","schema":1758910071705,"version":"3.0","fileType":"lex","attachment":{"hash":"b5855a724527cb0a41dbe0b83de9682a389dab2300904ab84c2a12f4e9056c2e","size":1878098,"filename":"lex.50.50.iten.s2t.bin.zst","location":"main-workspace/translations-models-v2/6a146710-1ffc-415e-995e-18588e56f40d.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"it","targetLanguage":"en","decompressedHash":"0700d6d70b30490e68ff9deca0b45b80310745b491855bde3a13e1692d0cbce1","decompressedSize":4713616,"filter_expression":"","id":"aaa234f1-2863-445f-9711-3b4032ba51b6","last_modified":1758911496516},{"name":"model.enid.intgemm.alphas.bin","schema":1758910052769,"version":"3.0","fileType":"model","attachment":{"hash":"97e2b207f9df9c52c20839acbe46b5506b4e7092653a608c0d0c20835efe2f9e","size":12242465,"filename":"model.enid.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/0bc8fdea-7823-4d69-aaae-da0b34fd7085.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"en","targetLanguage":"id","decompressedHash":"f81f13eef703a4e0650ffc3138a0f4bab7b6c8bfd173ef1b7bda68d16b8bc7e8","decompressedSize":17141051,"filter_expression":"","id":"519a57f7-6ec9-4245-bf9b-f033e3a34b56","last_modified":1758911496513},{"name":"vocab.enid.spm","schema":1758910051358,"version":"3.0","fileType":"vocab","attachment":{"hash":"21b455ee1042533ad8fa9b48802102aff531fbd48d44652876311a0becd37eef","size":320862,"filename":"vocab.enid.spm.zst","location":"main-workspace/translations-models-v2/44ddec87-6ddf-49d9-b1ae-572085b3eeb9.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"en","targetLanguage":"id","decompressedHash":"61bc7db24d3b6de638a02a280580a273fe0c942ecbe8a8204b2f81978211db22","decompressedSize":773211,"filter_expression":"","id":"cbd32cf8-785b-41c8-8628-313f68aa8dc7","last_modified":1758911496509},{"name":"lex.50.50.enid.s2t.bin","schema":1758910049580,"version":"3.0","fileType":"lex","attachment":{"hash":"85cef72156015dd99347a415d393b1e7cc3d9914b2f71a888bc7f538fd987837","size":1308163,"filename":"lex.50.50.enid.s2t.bin.zst","location":"main-workspace/translations-models-v2/eed6989c-3f66-4a29-a402-6fa0b499c599.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"en","targetLanguage":"id","decompressedHash":"d37f72bcab6e7bc52fd223350f95521b5810bb2486a97275f86077988fced3f4","decompressedSize":3515428,"filter_expression":"","id":"dd8037e3-7f35-4c54-aaa9-6b11b366f60d","last_modified":1758911496505},{"name":"vocab.iden.spm","schema":1758910039177,"version":"3.0","fileType":"vocab","attachment":{"hash":"2d4efe0a4791974e9377de5d63e9f5ac5f35c559cc8600481ec0dc9555b4cfd6","size":320841,"filename":"vocab.iden.spm.zst","location":"main-workspace/translations-models-v2/f07e5bf9-0061-451f-b28e-35e12a5ddbde.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"id","targetLanguage":"en","decompressedHash":"a2dd1462abd17cccbbf3fefc562131f06b293f8ff6a5efad73ebb0176810d835","decompressedSize":772941,"filter_expression":"","id":"a7bb5d49-012d-4ff2-b1dd-0b6a910789bb","last_modified":1758911496502},{"name":"lex.50.50.iden.s2t.bin","schema":1758910030470,"version":"3.0","fileType":"lex","attachment":{"hash":"6df9cd1e2d5708666002c6b310e853a769772741e516b2b47839ea0dced6ae03","size":1348373,"filename":"lex.50.50.iden.s2t.bin.zst","location":"main-workspace/translations-models-v2/368f948b-0144-48a6-a0e5-996d2ec6ded1.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"id","targetLanguage":"en","decompressedHash":"7a543087d4e9c1fe2f6b6f735b5e31aeadab80235e734c0388278722042ee3a2","decompressedSize":4050348,"filter_expression":"","id":"852c5562-4341-4273-a4bb-fad4d8b7ed3b","last_modified":1758911496498},{"name":"lex.50.50.huen.s2t.bin","schema":1758910020309,"version":"3.0","fileType":"lex","attachment":{"hash":"2a13e748cbabf14212d8a0eca4c42d9f2ea78ac00dcb16dec6fcae3c46e6f7d3","size":2038849,"filename":"lex.50.50.huen.s2t.bin.zst","location":"main-workspace/translations-models-v2/a391c6c8-52e4-452f-b714-c74945f1a5a8.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"hu","targetLanguage":"en","decompressedHash":"fff56b2501258ec4c46a8fc715caee7aeb15d853f859cdfacd3ef9903ed2fff1","decompressedSize":5162428,"filter_expression":"","id":"c8d5c8c8-14a2-492b-85d6-eb5a3d9c5b6a","last_modified":1758911496495},{"name":"vocab.huen.spm","schema":1758910015222,"version":"3.0","fileType":"vocab","attachment":{"hash":"73b38b429d179540fb66767c1b64aacfc6c3cf029119762374729d460feb7b6e","size":356994,"filename":"vocab.huen.spm.zst","location":"main-workspace/translations-models-v2/a11bdd74-2ade-4db9-8274-229c2e8abea4.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"hu","targetLanguage":"en","decompressedHash":"0db772702235b02d1f29abafb7a49ed77e54c60245b3a46e90716e74263aedd6","decompressedSize":820746,"filter_expression":"","id":"c8e0b186-949e-4d2a-a772-fdf72143076d","last_modified":1758911496491},{"name":"model.enhi.intgemm.alphas.bin","schema":1758910000631,"version":"3.0","fileType":"model","attachment":{"hash":"4d2cdcbd26a976bd9b1aa9173651544a075700d3f55e638fa88ae4d0f9d53b01","size":12548777,"filename":"model.enhi.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/76be957c-5fc4-4fc1-8fd3-08e5eb1d69b7.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"en","targetLanguage":"hi","decompressedHash":"18682fa6aa1c1b2f78a6fcbcb354755094d623e65436ef7821720c5213e11a49","decompressedSize":17141051,"filter_expression":"","id":"f52214cc-dbd9-4849-aa32-1bff6a131558","last_modified":1758911496488},{"name":"model.huen.intgemm.alphas.bin","schema":1758910016648,"version":"3.0","fileType":"model","attachment":{"hash":"491f6eeea25afb8c5662eb58312159fb9f0ec463e7435b5484d5b035cd0d7f29","size":13080870,"filename":"model.huen.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/d038b773-1341-48c0-879c-02406c246267.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"hu","targetLanguage":"en","decompressedHash":"518356dbb0c071739318601963a87580fb41732652f52bd3635246330c186d9e","decompressedSize":17140899,"filter_expression":"","id":"5e7bff42-641d-474f-a0ef-5ec43f9e879c","last_modified":1758911496485},{"name":"lex.50.50.enhi.s2t.bin","schema":1758909998933,"version":"3.0","fileType":"lex","attachment":{"hash":"b617f6ab1f16cd730f413e0ceba4f67717db552e6b9d85b38fa132a9e6ed64d2","size":1264527,"filename":"lex.50.50.enhi.s2t.bin.zst","location":"main-workspace/translations-models-v2/f8ac474a-201d-4bb5-873f-2afe2e166c15.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"en","targetLanguage":"hi","decompressedHash":"b473f6fe41cdb7c1dbeeb714fc50314feab77b0af2b2da6f7830ee14492dd847","decompressedSize":3504820,"filter_expression":"","id":"48d3ddcb-28e8-40d7-816f-c6d64db2a337","last_modified":1758911496481},{"name":"model.iden.intgemm.alphas.bin","schema":1758910032344,"version":"3.0","fileType":"model","attachment":{"hash":"d194f9019a65a121ff31d8ace97162a453afa646f233b54700564af9635edafc","size":12864875,"filename":"model.iden.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/a3f88fe4-3c98-4f73-bc79-91840786da56.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"id","targetLanguage":"en","decompressedHash":"eeed3d8c2c78ec7011b31b2419e1d2dfdf2a7cc0ee0dbb1fcd164c934cb5d328","decompressedSize":17141051,"filter_expression":"","id":"b64a37ed-60fe-441f-b2ef-733e0678baa4","last_modified":1758911496478},{"name":"vocab.hien.spm","schema":1758909980247,"version":"3.0","fileType":"vocab","attachment":{"hash":"11197b63e7063d17b01f2199c6c402a203b2a950551e72cde590774aa2f37dbf","size":361002,"filename":"vocab.hien.spm.zst","location":"main-workspace/translations-models-v2/56bd41a2-bb65-4751-89ec-47c88c144034.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"hi","targetLanguage":"en","decompressedHash":"9cbc02094ac2ebd75211b3bb6789a9d6fa112ce3c08e897f1645f18b21fbab00","decompressedSize":925436,"filter_expression":"","id":"56c58b6c-fad7-4892-b75d-502f30ebadd9","last_modified":1758911496475},{"name":"lex.50.50.hien.s2t.bin","schema":1758909978414,"version":"3.0","fileType":"lex","attachment":{"hash":"631ad58faa9674014dc386afe60c4a9ab9cda9fc706f1a86d92bd31195898c12","size":1716252,"filename":"lex.50.50.hien.s2t.bin.zst","location":"main-workspace/translations-models-v2/c42c6e9f-bc79-404b-acf7-6a38b66fb436.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"hi","targetLanguage":"en","decompressedHash":"e789be33dfdb639e98f5cf9eb01aa945ec3c882f68f3c8860389cf846f0112d8","decompressedSize":4605984,"filter_expression":"","id":"a4eb0adb-7e19-4cfb-9152-55153e4e6452","last_modified":1758911496471},{"name":"vocab.enhe.spm","schema":1758909967542,"version":"3.0","fileType":"vocab","attachment":{"hash":"2cec83359118511ac7c4f7aa071bc356feaecfa3f76d49bd3bf5263b08266b46","size":345511,"filename":"vocab.enhe.spm.zst","location":"main-workspace/translations-models-v2/89bed6a0-0bf2-403f-8051-5d6922026de2.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"en","targetLanguage":"he","decompressedHash":"672b334afa84011200fdaee02c2fc7810910c35ae9ea7619be073c851703ce9e","decompressedSize":845017,"filter_expression":"","id":"0af75490-2440-467f-b612-255e522bc334","last_modified":1758911496468},{"name":"model.enhe.intgemm.alphas.bin","schema":1758909962901,"version":"3.0","fileType":"model","attachment":{"hash":"70496c922992741917ce4c72961e7466331eab6fe0826adb18d55f1a2e729636","size":12858768,"filename":"model.enhe.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/04adcf34-584a-4b8f-8395-f719cc2a9a20.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"en","targetLanguage":"he","decompressedHash":"e37ac6e6f131704c85deb94a657aa20afbb44db2879f44aec9c33a34f4467587","decompressedSize":17141051,"filter_expression":"","id":"e3386b85-1a95-4f2b-a743-b084639b232f","last_modified":1758911496465},{"name":"lex.50.50.enhe.s2t.bin","schema":1758909960805,"version":"3.0","fileType":"lex","attachment":{"hash":"fe93f068a50b8721a972e50e633a0c6017f8b25c961ec19b854a31498131c812","size":1150241,"filename":"lex.50.50.enhe.s2t.bin.zst","location":"main-workspace/translations-models-v2/ad03f0bb-fe66-4f5e-86b9-9b540ff56825.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"en","targetLanguage":"he","decompressedHash":"8795f4c5e19b4a196c9ed394c275a28a09e5ddbbf47ae16faa4446bf2b8bc7d9","decompressedSize":3066048,"filter_expression":"","id":"4e4c14c6-d9ce-41fd-be26-cbaccd4721f7","last_modified":1758911496461},{"name":"vocab.enhi.spm","schema":1758909997486,"version":"3.0","fileType":"vocab","attachment":{"hash":"927b885d1e2fc2cc1d5fee6cafd024511a04d5cb0b7da80e45989b5f17ded22e","size":360925,"filename":"vocab.enhi.spm.zst","location":"main-workspace/translations-models-v2/e025c1a4-22a0-47e9-83bd-a765425cc569.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"en","targetLanguage":"hi","decompressedHash":"8017cbf812bae400794c424699b89de90db06ac7a4ca67a420013a9f68b270c1","decompressedSize":925360,"filter_expression":"","id":"44c7e51c-06a9-4e2c-88b3-7998603f415b","last_modified":1758911496458},{"name":"vocab.heen.spm","schema":1758909951118,"version":"3.0","fileType":"vocab","attachment":{"hash":"ac6008951d0a19504e3c2e7c13934d125879e855609d9cee0064bf36211de7eb","size":345626,"filename":"vocab.heen.spm.zst","location":"main-workspace/translations-models-v2/d24e9e55-3797-4da5-83ad-c12588261c43.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"he","targetLanguage":"en","decompressedHash":"45f5d413b9208c5f24340ab0e20a63604a572784d289baa2d788deea946f79a2","decompressedSize":845177,"filter_expression":"","id":"d31fc224-9b25-4a5e-854d-df909d78c3c6","last_modified":1758911496455},{"name":"model.hien.intgemm.alphas.bin","schema":1758909981691,"version":"3.0","fileType":"model","attachment":{"hash":"7a5d9ba3fb726e7b06c091598b7862c7c961108fc17a340bd88b897c031351c3","size":12553326,"filename":"model.hien.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/4d5cef3e-98c8-449b-817b-01c4352e1708.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"hi","targetLanguage":"en","decompressedHash":"c82fd6ed3794b79fb9dde0718a22324502a408a9eca73497b5d0a4b8024ec6de","decompressedSize":17141051,"filter_expression":"","id":"f719943e-2ad2-425c-b188-59e572bb83cd","last_modified":1758911496451},{"name":"lex.50.50.heen.s2t.bin","schema":1758909949338,"version":"3.0","fileType":"lex","attachment":{"hash":"4c598bb60f68a22313c246b714e89c8ede5eb7789078f66b985fa38444588f57","size":1611935,"filename":"lex.50.50.heen.s2t.bin.zst","location":"main-workspace/translations-models-v2/982a2c37-ca81-4610-bdea-96eff0f21165.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"he","targetLanguage":"en","decompressedHash":"427c88732cb93b28d2a947cace79f62aabceb7d6f4438516e85994b14a73b68e","decompressedSize":4636028,"filter_expression":"","id":"71320c0b-4145-40b0-9da8-d3a961ecaa20","last_modified":1758911496448},{"name":"model.heen.intgemm.alphas.bin","schema":1758909943301,"version":"3.0","fileType":"model","attachment":{"hash":"673f5c4954c452775c90f087ffbbe603ffe1daca8b13009a64331b59bea7111e","size":12874532,"filename":"model.heen.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/806b0184-868b-48ee-b58c-42d4ae9ba67d.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"he","targetLanguage":"en","decompressedHash":"7291cab3ec483b8cf524da96201fe947dca8c550132be21a06badeb946b5c079","decompressedSize":17141051,"filter_expression":"","id":"284b647b-9533-4fc2-bf8f-d87419b0bb94","last_modified":1758911496444},{"name":"vocab.engu.spm","schema":1758909933093,"version":"3.0","fileType":"vocab","attachment":{"hash":"9d875622845b625bfab45ef94b804fd8489f86dc7ee72e801607bf832cc7b5cd","size":363604,"filename":"vocab.engu.spm.zst","location":"main-workspace/translations-models-v2/55bab1e7-b810-4c2c-a9bd-334b21733ade.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"en","targetLanguage":"gu","decompressedHash":"74ce11b041bfc527eedded78594498419c781c81a3fcb3384a3485af70cc2325","decompressedSize":965095,"filter_expression":"","id":"24b85ddd-7608-44b2-9250-2b41b8035dc0","last_modified":1758911496441},{"name":"vocab.guen.spm","schema":1758909915484,"version":"3.0","fileType":"vocab","attachment":{"hash":"cc3a608559facff08c704d0809782df7a6971b58f626c029ee5cb0c63eda3db2","size":363740,"filename":"vocab.guen.spm.zst","location":"main-workspace/translations-models-v2/9530ff01-d1ae-45f4-bf8a-fce836c16514.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"gu","targetLanguage":"en","decompressedHash":"6ad2aa442cc04398bd06b4f03a1027939bbfbaac5f87b3d21f667406f4f62704","decompressedSize":965143,"filter_expression":"","id":"4812730e-0b87-41a7-a902-d609556080b2","last_modified":1758911496437},{"name":"lex.50.50.guen.s2t.bin","schema":1758909913611,"version":"3.0","fileType":"lex","attachment":{"hash":"de59be8f4b6dddab064a6944bb75732ec9703edd2e6901432a67ce36788e65ea","size":1484004,"filename":"lex.50.50.guen.s2t.bin.zst","location":"main-workspace/translations-models-v2/943151b1-6a9c-4fc3-b03b-f733078be8f3.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"gu","targetLanguage":"en","decompressedHash":"af01dbec5a1555ddad7c4b19878ecda00e6f9d179ca76a40ab2413de6b081cb0","decompressedSize":4197836,"filter_expression":"","id":"bff140db-c9af-499d-801d-09e96ce7f0ba","last_modified":1758911496434},{"name":"model.guen.intgemm.alphas.bin","schema":1758909909579,"version":"3.0","fileType":"model","attachment":{"hash":"a0f2407adafd36067dfe046e3d4dc6ce487ce899e9c2afedecddd3a03683758a","size":12765502,"filename":"model.guen.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/1e587495-ee23-4214-b183-761b7bf732c1.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"gu","targetLanguage":"en","decompressedHash":"7b16e4e64f2776c73d87db01922c091738566b6a6092a42488cbaee1385cb4ab","decompressedSize":17141051,"filter_expression":"","id":"5671816a-1d68-44fa-9985-880dccd9ce91","last_modified":1758911496431},{"name":"lex.50.50.enel.s2t.bin","schema":1758909899030,"version":"3.0","fileType":"lex","attachment":{"hash":"eee99925c6d67c17c8af08918984fefb998d2a925bd7d0868fc2646e55799ad7","size":1006196,"filename":"lex.50.50.enel.s2t.bin.zst","location":"main-workspace/translations-models-v2/03485485-e37a-4b2c-88bb-53e37e828508.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"en","targetLanguage":"el","decompressedHash":"c2acd9241eb8a1e5b13a43efa5723628839d6e3b3dc7b93e2f20990a6ab81e24","decompressedSize":2856724,"filter_expression":"","id":"0ba916a2-b0ff-45fb-b181-ad01c97b4781","last_modified":1758911496427},{"name":"model.enel.intgemm.alphas.bin","schema":1758909893171,"version":"3.0","fileType":"model","attachment":{"hash":"dee8f401002be92abb9948033a0dc07dbe1ed6ce854d9f0d9871cf3fcde533e7","size":12631381,"filename":"model.enel.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/05e6a0fa-c403-43e1-b012-bd58971d930f.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"en","targetLanguage":"el","decompressedHash":"724b358d399c6b23444de36d76e9e2630c7024c29d9e617323b820a11631535a","decompressedSize":17141051,"filter_expression":"","id":"b9d178f6-cf94-491a-bb43-d5ded907c5f7","last_modified":1758911496424},{"name":"vocab.elen.spm","schema":1758909881744,"version":"3.0","fileType":"vocab","attachment":{"hash":"73d30af1a6337f143bb42bc524b0b7edab17fdfc5934854caf26e4a44179ac3b","size":347452,"filename":"vocab.elen.spm.zst","location":"main-workspace/translations-models-v2/53623f92-6485-4edd-ae6f-bb05dc2d002c.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"el","targetLanguage":"en","decompressedHash":"e1a1298cc2cf3968f3d7cc3b36bc463a4e1bf154272e8fb2f15142b54edc4349","decompressedSize":894960,"filter_expression":"","id":"d7dd1f37-3665-4bf3-a3cf-a8d5db8fe882","last_modified":1758911496420},{"name":"model.elen.intgemm.alphas.bin","schema":1758909877641,"version":"3.0","fileType":"model","attachment":{"hash":"4681858a46f90c22fc02d89fc97c26a9301ac68f2ba21363c265fd0e846e9a4f","size":12486138,"filename":"model.elen.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/17323a6c-24c0-41de-84ab-58643b4fb635.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"el","targetLanguage":"en","decompressedHash":"0a43c3716156061494d995d0c88113e789f8d919e0c88a15bc1ad360e0482a8c","decompressedSize":17141051,"filter_expression":"","id":"66d5556e-816a-47a4-b622-838c43bf9b77","last_modified":1758911496417},{"name":"lex.50.50.elen.s2t.bin","schema":1758909876030,"version":"3.0","fileType":"lex","attachment":{"hash":"82779368ff54c53cdaee7fedd47f6afd28cfb156ae34bf413f53c1731c789b07","size":1361262,"filename":"lex.50.50.elen.s2t.bin.zst","location":"main-workspace/translations-models-v2/41fb8a5c-6652-4c09-a3a4-8a2b81d73bde.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"el","targetLanguage":"en","decompressedHash":"2c969b069b3d230feddd17db2d74eb658a9b33b960d2d40adbca5496c9784e85","decompressedSize":4295860,"filter_expression":"","id":"2df970fc-40ba-481d-ae2b-104a2fb185fd","last_modified":1758911496413},{"name":"vocab.enel.spm","schema":1758909891716,"version":"3.0","fileType":"vocab","attachment":{"hash":"594e53fdcb585fab1f03472180239da32a30b40c0783dc59ee1de84f3d02ab4e","size":347210,"filename":"vocab.enel.spm.zst","location":"main-workspace/translations-models-v2/c8c3bd90-f1c7-472f-beb6-53b32e1db1a4.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"en","targetLanguage":"el","decompressedHash":"0ffc5569d7f400f03539c5fc3e28ff35f1d0381eba0ec866c44aef0c26f3ce5e","decompressedSize":896168,"filter_expression":"","id":"cafa65c1-b4a4-47e9-a45b-693979dafde0","last_modified":1758911496403},{"name":"lex.50.50.engu.s2t.bin","schema":1758909931460,"version":"3.0","fileType":"lex","attachment":{"hash":"d99a542abca3bb78d7e6572f45aa881e6a7c0a0519b2f93a62da9fc40619a2ca","size":1128071,"filename":"lex.50.50.engu.s2t.bin.zst","location":"main-workspace/translations-models-v2/fc75be71-4284-4cb9-8fbc-7abea9167410.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"en","targetLanguage":"gu","decompressedHash":"5699d5f0f6265766c57e8e860596091d16a7ea68e9e181a3310b8b52d79f8b5e","decompressedSize":3179500,"filter_expression":"","id":"ac58a94c-08ab-4e3a-a9d6-b77373265a5d","last_modified":1758911496399},{"name":"vocab.deen.spm","schema":1758909841904,"version":"3.0","fileType":"vocab","attachment":{"hash":"688bd61fce9ff1a1f93b81f0f039f9a850a3f345b0a82e044a743ff48b71ffbc","size":352776,"filename":"vocab.deen.spm.zst","location":"main-workspace/translations-models-v2/3187809f-ec68-4da1-8149-f9c4b0f36644.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"de","targetLanguage":"en","decompressedHash":"69f730becafa48e3bb2c244eab66456877c08959a02f2bd5519b5a3088b62f9c","decompressedSize":810073,"filter_expression":"","id":"d0addba1-1ea8-4b94-a0af-36b27f895e5a","last_modified":1758911496396},{"name":"model.engu.intgemm.alphas.bin","schema":1758909925861,"version":"3.0","fileType":"model","attachment":{"hash":"2023687a904cd4b891f26ea921c589de082968a5e9a7111b000fddde321433bd","size":12444018,"filename":"model.engu.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/d07feaec-8bed-4002-9cc7-2ef124aa94ec.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"en","targetLanguage":"gu","decompressedHash":"0f2c8bc7f13ecb9b89459e8fd9af6d8736e0f6b1c8f8a80f747fcdc030d0a588","decompressedSize":17141051,"filter_expression":"","id":"68ce55c8-9030-4bdd-81df-5ffb497f9b72","last_modified":1758911496392},{"name":"lex.50.50.fren.s2t.bin","schema":1758909803409,"version":"3.0","fileType":"lex","attachment":{"hash":"97d54df5179b2c7909eb075367765829f6a17ac2304ba3dba28accff09fe26e2","size":1959170,"filename":"lex.50.50.fren.s2t.bin.zst","location":"main-workspace/translations-models-v2/7238348a-b118-40f8-9e17-327fb54b2dc8.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"fr","targetLanguage":"en","decompressedHash":"87c6752ea908f5f0347c10ac0cf7d80d9c2f4f20c81c90168f3e8230b56d4440","decompressedSize":4824120,"filter_expression":"","id":"c6522411-8269-4a81-8a04-05fccdfa1da3","last_modified":1758911496379},{"name":"model.fren.intgemm.alphas.bin","schema":1758909794388,"version":"3.0","fileType":"model","attachment":{"hash":"aba908645fa802706cf9ab0bcbf95a6b1ff1281e65402c9225893c923bd73f9a","size":22712124,"filename":"model.fren.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/3a84a714-bfc7-4e52-81a1-b08d5d9421d2.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"fr","targetLanguage":"en","decompressedHash":"15f997bc0d13808b0b0fbd0786e684a3c8a52adcd8071844b76123fdacbf2b90","decompressedSize":31561787,"filter_expression":"","id":"1497f513-2b73-4c61-b38f-0e452d4a2a56","last_modified":1758911496376},{"name":"lex.50.50.deen.s2t.bin","schema":1758909848250,"version":"3.0","fileType":"lex","attachment":{"hash":"a308bd1cae2bf372a352d2e37b9ba286616d2cf386d14bdf848b54f8eb1d7408","size":1953706,"filename":"lex.50.50.deen.s2t.bin.zst","location":"main-workspace/translations-models-v2/87ba9213-f69e-4e31-9251-aa2e297d1f26.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"de","targetLanguage":"en","decompressedHash":"113b98460468360cca68c042e1cddf49c4e1931cbb975ed04349c9a3bd607010","decompressedSize":4945796,"filter_expression":"","id":"c2498b4a-9cc8-4844-9874-e3cc0287854f","last_modified":1758911496372},{"name":"vocab.fren.spm","schema":1758909792946,"version":"3.0","fileType":"vocab","attachment":{"hash":"61c982758a3e7dc880a8dbc11aaf0fb04a1e4f5d2d7a36ee11bc419323f2ca80","size":348946,"filename":"vocab.fren.spm.zst","location":"main-workspace/translations-models-v2/671f09a0-12a2-436e-94d8-2575a4594c2a.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"fr","targetLanguage":"en","decompressedHash":"783abf3abe075afdf8d85d233994bef2c3a064e935ab1bed946820aff6ac002a","decompressedSize":814404,"filter_expression":"","id":"604f287f-cdd7-4160-b18a-0d1c290dddca","last_modified":1758911496366},{"name":"lex.50.50.fien.s2t.bin","schema":1758909759133,"version":"3.0","fileType":"lex","attachment":{"hash":"e942f0004bb2f4bc32a551097c6d26a3ce78fb5acaca76a899096dc47b5e4ad3","size":1858085,"filename":"lex.50.50.fien.s2t.bin.zst","location":"main-workspace/translations-models-v2/272b125f-2638-40e7-b69a-ed0eba5fd04d.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"fi","targetLanguage":"en","decompressedHash":"8bad431e07b062ba47f363b76e4656cc743fd608316d8a4830a4315e44ac9abb","decompressedSize":5195132,"filter_expression":"","id":"73934212-682d-47c8-a35a-b8678cf5d706","last_modified":1758911496363},{"name":"model.fien.intgemm.alphas.bin","schema":1758909755052,"version":"3.0","fileType":"model","attachment":{"hash":"2b80cd9797707ae096e7c167b827ed37b973aa41f1ac104351b5f4a2c454638d","size":22410920,"filename":"model.fien.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/6effeb07-6e36-486c-ac11-8cc162366001.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"fi","targetLanguage":"en","decompressedHash":"e3887341f18bcc7787d9b59eb1229b56eefce18d49b7ebf1e62c55d65a377321","decompressedSize":31561787,"filter_expression":"","id":"10fb447d-078f-4ce3-8946-7133daaa7c23","last_modified":1758911496359},{"name":"vocab.fien.spm","schema":1758909753661,"version":"3.0","fileType":"vocab","attachment":{"hash":"18158b030337d5774e251174227999737fcafa5b277ed1b56bc35e2b2d984e3f","size":352840,"filename":"vocab.fien.spm.zst","location":"main-workspace/translations-models-v2/41aa5107-53e3-44b5-b701-8bd3ae65debd.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"fi","targetLanguage":"en","decompressedHash":"6a866911427f2916609ae89c7f2f04a78de3fdd8aa183039ecba986635d4f246","decompressedSize":818770,"filter_expression":"","id":"107a1f0a-2bcc-4f5e-85d3-a3def5fbb7a6","last_modified":1758911496356},{"name":"model.deen.intgemm.alphas.bin","schema":1758909843322,"version":"3.0","fileType":"model","attachment":{"hash":"1a1d3db174f2e555a2d5d11abc303cc839a84dace2de1dcc46d65e3a217d3a7c","size":21611407,"filename":"model.deen.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/172680a0-ffd1-4c00-8b35-216898c4f462.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"de","targetLanguage":"en","decompressedHash":"3e6f7c2c2425d10824797270b382bee718ff34af2cab9308841c82ca46dc6f20","decompressedSize":31561787,"filter_expression":"","id":"24f4bfaf-07c3-4682-a2b6-27fefbd16f06","last_modified":1758911496353},{"name":"lex.50.50.sven.s2t.bin","schema":1758911028902,"version":"3.0","fileType":"lex","attachment":{"hash":"1642fe7f66f47337ad7d9915022be622f761e73a1c4eadc55c1a2c8633ab99da","size":1602459,"filename":"lex.50.50.sven.s2t.bin.zst","location":"main-workspace/translations-models-v2/d88dadc1-efb7-4523-9c3b-6007a4a1bca7.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"sv","targetLanguage":"en","decompressedHash":"1c4640765e806d905cdc4f51158f6f869c78709b9e8a43070877965fa13c160e","decompressedSize":4645680,"filter_expression":"","id":"29631961-cd92-47c3-9e5b-f17262b59613","last_modified":1758911496343},{"name":"lex.50.50.eten.s2t.bin","schema":1758909718763,"version":"3.0","fileType":"lex","attachment":{"hash":"109854ff9fb13acc068fbb5b0cadd9f11f2ebe092e3302a0dab80eacc28a9562","size":1683808,"filename":"lex.50.50.eten.s2t.bin.zst","location":"main-workspace/translations-models-v2/cbce5b8e-9b64-4592-971c-1baf0f7d454c.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"et","targetLanguage":"en","decompressedHash":"ad9750f3b41cb5686e561608271a0dc935fc827bf43226e579a6f48a3f6b5f11","decompressedSize":4625968,"filter_expression":"","id":"3b9e8d4f-e367-4c4b-881a-ce20013aea4e","last_modified":1758911496333},{"name":"vocab.eten.spm","schema":1758909717326,"version":"3.0","fileType":"vocab","attachment":{"hash":"41ad1d1b1b37a99d379251d3194a06a33bb5160761156275c849c05c3c32770b","size":351938,"filename":"vocab.eten.spm.zst","location":"main-workspace/translations-models-v2/d16aa408-557b-4dd5-afbd-14fef8c23732.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"et","targetLanguage":"en","decompressedHash":"89a3deea4ae7d674fb46a4dae39135dd4dfaac9786f2868d0b5bc5c0aca2ef83","decompressedSize":817574,"filter_expression":"","id":"87a834cf-68c5-4f65-8bf8-cdbec2a34dcb","last_modified":1758911496329},{"name":"model.nlen.intgemm.alphas.bin","schema":1758909672331,"version":"3.0","fileType":"model","attachment":{"hash":"4337cb340c250f93360af3449e32cbfe059d9ba655ac1f2226d16180b93e8bac","size":22001741,"filename":"model.nlen.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/930af1f1-d3de-4e83-852c-81ffe530b8f1.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"nl","targetLanguage":"en","decompressedHash":"ff987741ff15a5d94fff16cbef28f2b0a85a6e9547d982fad60ac09d16d11270","decompressedSize":31561787,"filter_expression":"","id":"305c6f36-5fa7-4f75-83e3-422b5ba93995","last_modified":1758911496322},{"name":"lex.50.50.nlen.s2t.bin","schema":1758909670631,"version":"3.0","fileType":"lex","attachment":{"hash":"1d739818fbc6bc2afeea12ecd382bfd22c5ec9847e26910080ef759ef5e047ce","size":1974176,"filename":"lex.50.50.nlen.s2t.bin.zst","location":"main-workspace/translations-models-v2/a74e89d6-f632-4f28-8218-450968b2e35c.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"nl","targetLanguage":"en","decompressedHash":"811ac8f9dcbd12706e2d73a7057a7bbe6b9f0607d15170ffe9439977e8229b41","decompressedSize":4862412,"filter_expression":"","id":"7b796f6d-0dc6-415c-be42-12b65a370187","last_modified":1758911496319},{"name":"vocab.nlen.spm","schema":1758909669173,"version":"3.0","fileType":"vocab","attachment":{"hash":"4e9d279e681372a4dd9b81a737a5a06692d08ed1ecad3b58067e0576e838e5cc","size":349477,"filename":"vocab.nlen.spm.zst","location":"main-workspace/translations-models-v2/42020f06-3938-4cc4-952d-94acc032e5f0.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"nl","targetLanguage":"en","decompressedHash":"c09588ca5662b230ed65bd39a07f58d9f7dd21c3a19e4aeb1bff39bf3b297c56","decompressedSize":807708,"filter_expression":"","id":"5e52fc92-a6ce-4140-96c9-64a46293b3d9","last_modified":1758911496315},{"name":"lex.50.50.enda.s2t.bin","schema":1758909650771,"version":"3.0","fileType":"lex","attachment":{"hash":"281fc7a8ab661f6b072c272480197ecc12c17ef6154d3bc08fa981c7ba21177f","size":1174610,"filename":"lex.50.50.enda.s2t.bin.zst","location":"main-workspace/translations-models-v2/a8044261-fab7-4d80-8e46-c1bdb2440e8d.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"en","targetLanguage":"da","decompressedHash":"d183786cae59a5df06d5b00c58e3ec2a5791d302240a65540fc6a1da2b66eada","decompressedSize":3864788,"filter_expression":"","id":"c4cf0e70-24a6-4d31-a0c1-538390f146bf","last_modified":1758911496312},{"name":"vocab.enda.spm","schema":1758909649287,"version":"3.0","fileType":"vocab","attachment":{"hash":"73acd70be9ea03b68104b3fa79d5bdb5b99ea2f649e6966416dbc3553252e85d","size":338250,"filename":"vocab.enda.spm.zst","location":"main-workspace/translations-models-v2/4429389a-f14b-46b7-8251-7be239711ac7.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"en","targetLanguage":"da","decompressedHash":"b06349522bf053e4a6f01efc4d1450e4fe35717a938a82831988c087229c9619","decompressedSize":795349,"filter_expression":"","id":"18c4ec3c-2352-4beb-86f4-cbd397b5de42","last_modified":1758911496308},{"name":"model.enda.intgemm.alphas.bin","schema":1758909645110,"version":"3.0","fileType":"model","attachment":{"hash":"ac94192579925728aa5d07466d82687ec98c1a1830c23f504cdf8602b1bbc28d","size":12527620,"filename":"model.enda.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/74828a13-b519-45f8-a0c7-335768e761ff.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"en","targetLanguage":"da","decompressedHash":"0157ed1162dd5a7a0fc6a3cc86014ec21cb47a8febf77164df24d8921270bb29","decompressedSize":17141051,"filter_expression":"","id":"822a0d00-b0ac-4c18-adde-ca11e96a248a","last_modified":1758911496305},{"name":"model.daen.intgemm.alphas.bin","schema":1758909629995,"version":"3.0","fileType":"model","attachment":{"hash":"27614baedc0ad5c58476b7c650fe9d5731a6dbb637e8579ee452a75d46208ef4","size":12260276,"filename":"model.daen.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/bd167d56-57e8-44b7-9385-11a273000643.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"da","targetLanguage":"en","decompressedHash":"2c1ace24220c905404bbb1de14bfeda8a391ef8d6c56f3b193a9d3e340d99b12","decompressedSize":17141051,"filter_expression":"","id":"51364a0e-5d5d-4660-b343-54178487e479","last_modified":1758911496301},{"name":"vocab.daen.spm","schema":1758909628545,"version":"3.0","fileType":"vocab","attachment":{"hash":"592588858bb4984163231f781f7952c1ad47e536800548e8e879cc0a534f3409","size":338888,"filename":"vocab.daen.spm.zst","location":"main-workspace/translations-models-v2/1d47ef65-20ad-4ab2-9905-ca1faa7e09dd.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"da","targetLanguage":"en","decompressedHash":"b9392fcd9c53b802628d33a160f6eb52ca3d25a07ec9e015ab93b6bd5c7e8033","decompressedSize":796018,"filter_expression":"","id":"dad4ce03-48db-4644-9ae6-ae0b90a4cf3c","last_modified":1758911496298},{"name":"lex.50.50.daen.s2t.bin","schema":1758909626706,"version":"3.0","fileType":"lex","attachment":{"hash":"717a476410a74001ab7cc9b55c659ddf50dcdd5c12c1f8310e3be1bede80e2fb","size":1608890,"filename":"lex.50.50.daen.s2t.bin.zst","location":"main-workspace/translations-models-v2/c8f1ec7a-2451-40d9-abfd-950dfdb81bf1.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"da","targetLanguage":"en","decompressedHash":"e5f50fba646e0d3cedf2957575aa84c3bdca6798ce32ccd63c956fc043d774a3","decompressedSize":4489412,"filter_expression":"","id":"e6241b5d-b0ed-47b0-ba85-214651e0018c","last_modified":1758911496295},{"name":"lex.50.50.csen.s2t.bin","schema":1758909579837,"version":"3.0","fileType":"lex","attachment":{"hash":"589ccd8040ee6072e72d82f3ace02062491c26a61afd41ddd94089bc54fed3ce","size":1817446,"filename":"lex.50.50.csen.s2t.bin.zst","location":"main-workspace/translations-models-v2/279d0bdb-1a73-4fb9-a0f8-3b8287159336.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"cs","targetLanguage":"en","decompressedHash":"eba6bd9575251525f1941640ea0b6527a06e72a46421579eafea04d635ee20a8","decompressedSize":4990588,"filter_expression":"","id":"efcc3840-5f72-46c7-bc76-62da4971b530","last_modified":1758911496278},{"name":"model.csen.intgemm.alphas.bin","schema":1758909569874,"version":"3.0","fileType":"model","attachment":{"hash":"68317506ddfb9c6b0ca38aaa47da82837a20764de83de54e9fe14f5a6c215f46","size":22287863,"filename":"model.csen.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/859d2cbf-a174-4747-84cf-73740298ac9f.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"cs","targetLanguage":"en","decompressedHash":"c815273b31074492eaab0ccd78d33d7ac16f94088707ab2492abaedcb9ee0b75","decompressedSize":31561787,"filter_expression":"","id":"f72a06a3-1d95-4eb7-a1ea-72dc2845205b","last_modified":1758911496273},{"name":"vocab.csen.spm","schema":1758909568318,"version":"3.0","fileType":"vocab","attachment":{"hash":"f9955569c41ac41578c5f9923bb7d7dbe62ed343f6475cf31078608bd9f753d4","size":350374,"filename":"vocab.csen.spm.zst","location":"main-workspace/translations-models-v2/64090225-9ac6-458f-95a4-96ffdd7e6ba8.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"cs","targetLanguage":"en","decompressedHash":"ee4b8ce15c8e1237c5f7a2d04741341beb0a5d5c09820f7ec08f13ee2b212755","decompressedSize":815154,"filter_expression":"","id":"16b027a5-6282-488f-a92b-145483bcc14c","last_modified":1758911496269},{"name":"lex.50.50.enhu.s2t.bin","schema":1758909550472,"version":"3.0","fileType":"lex","attachment":{"hash":"a18f76a09432a8ccda4902f00bbacd9cdd22b4f9167bb0c526eae455b07e6bd5","size":1308627,"filename":"lex.50.50.enhu.s2t.bin.zst","location":"main-workspace/translations-models-v2/038b0cfe-e770-4d79-81ce-0c8a22fba462.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"en","targetLanguage":"hu","decompressedHash":"f3d1e61003597d1cc9d87e05d2b398a7ae2b3941e3f96947764aac239df1a808","decompressedSize":3490288,"filter_expression":"","id":"ae47daa5-50d9-49f5-aed5-80ef33ae0718","last_modified":1758911496265},{"name":"vocab.enhu.spm","schema":1758909549036,"version":"3.0","fileType":"vocab","attachment":{"hash":"58b0feee37156776628569accc5fdfa3c71bd080d59cb50d84da94031ff5782a","size":342459,"filename":"vocab.enhu.spm.zst","location":"main-workspace/translations-models-v2/1d57af8b-b76e-45a0-9bae-7e1c5fa92004.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"en","targetLanguage":"hu","decompressedHash":"2eee837cfdcc45c091d025f585d3fcdb293db7794e316b38a0aeff8c47a659e0","decompressedSize":806121,"filter_expression":"","id":"3dc1dc52-5a16-408b-ab1d-57461272c349","last_modified":1758911496261},{"name":"model.enhu.intgemm.alphas.bin","schema":1758909542201,"version":"3.0","fileType":"model","attachment":{"hash":"7804d3e5130ed5dd57c191295d0285da66c7b801c6c6ed154bc81a900f7b4aa4","size":23372483,"filename":"model.enhu.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/31bacb38-def1-47d0-83e8-92bf7098bc39.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"en","targetLanguage":"hu","decompressedHash":"ec0c210d09cd5d8a5edf7a50462db0a8fb5dd78d03bbc6d4d72d91074f0490e4","decompressedSize":31561787,"filter_expression":"","id":"e2ce2421-aa75-4327-908e-031a255e1886","last_modified":1758911496257},{"name":"lex.50.50.enhr.s2t.bin","schema":1758909526659,"version":"3.0","fileType":"lex","attachment":{"hash":"60e4d5a462bd949a55780a4648bb04b874e8eea7fd574d14f9f0a4e764c12e79","size":1067071,"filename":"lex.50.50.enhr.s2t.bin.zst","location":"main-workspace/translations-models-v2/0adaa89b-7640-4557-9864-3939ca164f18.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"en","targetLanguage":"hr","decompressedHash":"b811d67aca11e12e6bd956c1b4a1e74c6162d71e9ac259bfff415fbb90c3f666","decompressedSize":3319896,"filter_expression":"","id":"5c4f309d-6975-471f-8c76-a442e082b903","last_modified":1758911496253},{"name":"model.enhr.intgemm.alphas.bin","schema":1758909520967,"version":"3.0","fileType":"model","attachment":{"hash":"aeb175fdadd4a247745ff9d14e54e2de4e69824c5e072ffad290208abe3fbd89","size":12606969,"filename":"model.enhr.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/0b3ad24c-9273-44c9-ab60-bfb875e60f52.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"en","targetLanguage":"hr","decompressedHash":"29ba32235778da3e38cfeb0d7f36eaf8dc37c961ff8651d86f7cae7e29e97d88","decompressedSize":17141051,"filter_expression":"","id":"4d45befc-c859-4f34-bdf1-7fe57bf31f50","last_modified":1758911496247},{"name":"vocab.enhr.spm","schema":1758909519516,"version":"3.0","fileType":"vocab","attachment":{"hash":"2866f5e210b419f7b050d63b2f9b871fc1c0c9ff4741a29f7dd9cef39c872e5e","size":334129,"filename":"vocab.enhr.spm.zst","location":"main-workspace/translations-models-v2/afc76f61-f22f-41fa-a6b8-4c3611b1ff38.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"en","targetLanguage":"hr","decompressedHash":"7b75fe5ee12743c787a393489d8810adc3ca6cefe0142e8993227dd125d224b3","decompressedSize":796935,"filter_expression":"","id":"0461d606-bbdf-47c8-a447-c068583557ce","last_modified":1758911496244},{"name":"vocab.hren.spm","schema":1758909509159,"version":"3.0","fileType":"vocab","attachment":{"hash":"ddee911e73ffec9325742ea7b56b40896d5227a502a3fdd72f1f76ceb016bb2e","size":334092,"filename":"vocab.hren.spm.zst","location":"main-workspace/translations-models-v2/244de7f4-ca6d-4084-b80f-0e3c72cc2ac1.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"hr","targetLanguage":"en","decompressedHash":"4e9cc10e8ff4a4ed64fc90b45835385690e55f49b40e8efe471597d2e3a9cd24","decompressedSize":796159,"filter_expression":"","id":"50b1a732-05dc-4555-8c76-1b2a08281258","last_modified":1758911496241},{"name":"lex.50.50.hren.s2t.bin","schema":1758909507386,"version":"3.0","fileType":"lex","attachment":{"hash":"a27b48e0bd7ea187d38b3d7d1010f5ef88a0be4e5b2b28646d337cf31482d7b6","size":1391848,"filename":"lex.50.50.hren.s2t.bin.zst","location":"main-workspace/translations-models-v2/c51fc32a-df76-4b43-8fb3-91e30da5048d.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"hr","targetLanguage":"en","decompressedHash":"c9ef83603e41f78d41fa601ba9c7196be58518bd964bfe364f325665bc8bc7d0","decompressedSize":3860080,"filter_expression":"","id":"2e7d2b32-3dda-4f9c-8d72-571f5cffac21","last_modified":1758911496237},{"name":"model.hren.intgemm.alphas.bin","schema":1758909502566,"version":"3.0","fileType":"model","attachment":{"hash":"30ac9758ea892fe6e1c09152b222649fdd826184a454c85d01b3967e124ab25c","size":12937996,"filename":"model.hren.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/c09410fb-a980-40b0-a942-61c495944012.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"hr","targetLanguage":"en","decompressedHash":"fa6c8220d3f1c41eb75b720859971dbe3acb6bf63691656c58faa4cdc28d918d","decompressedSize":17141051,"filter_expression":"","id":"0dcb92e3-5172-421f-b40e-d5f3c2e508cc","last_modified":1758911496234},{"name":"model.enca.intgemm.alphas.bin","schema":1758909374666,"version":"3.0","fileType":"model","attachment":{"hash":"e226f70dc0f72727d56107dc871ab0074f47eda1ba2c88fee013e60d2cf81f22","size":22714103,"filename":"model.enca.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/0824541f-1569-41c1-9cef-89e15ae1ae23.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"en","targetLanguage":"ca","decompressedHash":"735881c99ff303e55eb2e92a3b86762523d5dd1a4797b2574b851062051426ee","decompressedSize":31561787,"filter_expression":"","id":"f81e0611-f0f4-42ab-a8f0-1e7536bb47de","last_modified":1758911496231},{"name":"lex.50.50.enca.s2t.bin","schema":1758909372775,"version":"3.0","fileType":"lex","attachment":{"hash":"21af04d762eb5e1c0eef53953f95230974d068442178dbb4ca9eb8951f9e071e","size":1538773,"filename":"lex.50.50.enca.s2t.bin.zst","location":"main-workspace/translations-models-v2/6c1acc5c-0e63-4d59-85f1-7750e111d587.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"en","targetLanguage":"ca","decompressedHash":"8f2151a7fb75454f5167a8df8758ec02ab02c0302893851bad7caa6b729822fb","decompressedSize":4344092,"filter_expression":"","id":"c2177d0d-13fe-4e52-8a5c-36af929c0a3f","last_modified":1758911496227},{"name":"vocab.enca.spm","schema":1758909371245,"version":"3.0","fileType":"vocab","attachment":{"hash":"4d5e882e7278133539e6b899e3c6a2d501ee09ac1af7f2c955e4855b74fb3132","size":349175,"filename":"vocab.enca.spm.zst","location":"main-workspace/translations-models-v2/528ab11c-7a99-453b-94e5-297354f5e254.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"en","targetLanguage":"ca","decompressedHash":"64ebcb5f6cb5a954ced615e48a44a85e77a644e4910544014b299b8ee0fa1b1f","decompressedSize":810653,"filter_expression":"","id":"f56ec637-5c78-447b-906b-8a81d3e68d26","last_modified":1758911496223},{"name":"lex.50.50.caen.s2t.bin","schema":1758909354149,"version":"3.0","fileType":"lex","attachment":{"hash":"470b9f9951a51f1ab1e4267a9d41bcfc436ada9f10578a8a7a29f5f2bf84d10e","size":1667664,"filename":"lex.50.50.caen.s2t.bin.zst","location":"main-workspace/translations-models-v2/946cc7eb-d2fe-4170-ab8f-ccce07663a7a.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"ca","targetLanguage":"en","decompressedHash":"74880047539925630601d61aa6c29a0672046236ca6cf33eeaf6f6f6690e914e","decompressedSize":4359552,"filter_expression":"","id":"2390de21-3784-4359-b3f1-237377623fd4","last_modified":1758911496220},{"name":"vocab.caen.spm","schema":1758909352684,"version":"3.0","fileType":"vocab","attachment":{"hash":"e4b7830b44a4188599d10a2726c309dc5ed4d5658e4fde5f672f47829bc64cba","size":349163,"filename":"vocab.caen.spm.zst","location":"main-workspace/translations-models-v2/25d8affa-0c00-43d0-a507-2751e3275e51.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"ca","targetLanguage":"en","decompressedHash":"6d22da90905873c2793d0805e34e5c27901b16e7e7a7a427696696f67dfe1f0e","decompressedSize":810273,"filter_expression":"","id":"c60153ad-30a4-49f0-ac9e-995eeb0be093","last_modified":1758911496217},{"name":"model.caen.intgemm.alphas.bin","schema":1758909347797,"version":"3.0","fileType":"model","attachment":{"hash":"c02a864c4cb792b563a02067e6a2e6f220ac450ed3de60d849998df7007064e0","size":22168642,"filename":"model.caen.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/908bd013-ac93-4a2d-9dbf-639d42d4a6b6.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"ca","targetLanguage":"en","decompressedHash":"b7f9c70823052f60c257eb1c4eff893abea3648aa9d1c23c8774e1e5ef061434","decompressedSize":31561787,"filter_expression":"","id":"2b8f6225-f27c-41ce-bb21-1f10a1cf3e68","last_modified":1758911496213},{"name":"model.bgen.intgemm.alphas.bin","schema":1758909310934,"version":"3.0","fileType":"model","attachment":{"hash":"aab74c61e1f7daa7520a9810e337749a51abb3a45512f7cd9263c0eec6a7f501","size":21619339,"filename":"model.bgen.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/df1d4066-190a-476c-96bd-a420ca43be49.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"bg","targetLanguage":"en","decompressedHash":"78f7e6e1435cc2d4a29cf597f493187fe29ddb9ce9d3766c287e2e6d37052d01","decompressedSize":31561787,"filter_expression":"","id":"36f4096f-f760-4b22-bd28-2e6ea06ff9ae","last_modified":1758911496200},{"name":"vocab.bgen.spm","schema":1758909309479,"version":"3.0","fileType":"vocab","attachment":{"hash":"9bb4902078de81ad820b8254950685f89be9d1510e6de90220bb994450742c6b","size":362233,"filename":"vocab.bgen.spm.zst","location":"main-workspace/translations-models-v2/e019e5dd-8275-4362-b12d-09643941ec3a.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"bg","targetLanguage":"en","decompressedHash":"4bafad5fcc0e771ed82233d1e99d69dcb96487b430702f7e688615c8a61f3df4","decompressedSize":922482,"filter_expression":"","id":"b6d6a241-fdd9-4791-be8e-19cc04df134d","last_modified":1758911496197},{"name":"lex.50.50.bgen.s2t.bin","schema":1758909307613,"version":"3.0","fileType":"lex","attachment":{"hash":"ac39857f2d64c0b22058b9dddeb51a7d10f3bcda4dce25e29d35606239526a1f","size":1612063,"filename":"lex.50.50.bgen.s2t.bin.zst","location":"main-workspace/translations-models-v2/39d79707-99b4-4f8e-9f60-580cf32daa87.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"bg","targetLanguage":"en","decompressedHash":"e661dfdd88aa9ff9606f237a60c910d97c2e710960199589579f628c5d8aa899","decompressedSize":4355920,"filter_expression":"","id":"7d64bd5e-01c9-4952-aba8-3770cecdefb2","last_modified":1758911496194},{"name":"model.enbn.intgemm.alphas.bin","schema":1758909286200,"version":"3.0","fileType":"model","attachment":{"hash":"ba19afbbfb38a4c61e73cb0b8ab85de38addfba4d8f331a4ca916b2efb732206","size":12655073,"filename":"model.enbn.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/792fd106-c380-4f42-98f0-37bb13c71d24.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"en","targetLanguage":"bn","decompressedHash":"b63c8d5f8fdc1fcb8bbb2d20c751faab94af67ee1822427665119c93a11f6596","decompressedSize":17141051,"filter_expression":"","id":"6e83a5c5-604a-4ed2-94d3-8204a07c9a40","last_modified":1758911496191},{"name":"vocab.enbn.spm","schema":1758909284712,"version":"3.0","fileType":"vocab","attachment":{"hash":"a172f408877c11dfc19117d88e263ee4e556a7eb6a232128ae12b862ee004886","size":363901,"filename":"vocab.enbn.spm.zst","location":"main-workspace/translations-models-v2/d76fcdf8-383b-4b5c-ac5d-d0d7fa8956a8.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"en","targetLanguage":"bn","decompressedHash":"8895bebb290adc2a5ef46710d81be13d341883a8c6c233e0c060f968df0deef4","decompressedSize":981226,"filter_expression":"","id":"78e66308-7a89-4515-afc3-90e8a35d702b","last_modified":1758911496187},{"name":"lex.50.50.enbn.s2t.bin","schema":1758909282949,"version":"3.0","fileType":"lex","attachment":{"hash":"b5f9c50602f303ae4896c9aa5b02d0659fe919ba11ca987366f78fc62dcc6466","size":1169028,"filename":"lex.50.50.enbn.s2t.bin.zst","location":"main-workspace/translations-models-v2/d0b05eeb-92f3-46e8-8c32-93225dcf09d1.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"en","targetLanguage":"bn","decompressedHash":"74ad4234a0a9cf57b21d99b34fefc14f7c731d7e76da7940eb0155c13a234b5e","decompressedSize":3207488,"filter_expression":"","id":"3734baaf-92cf-4d55-902c-4140fb6241cb","last_modified":1758911496184},{"name":"vocab.enar.spm","schema":1758909273128,"version":"3.0","fileType":"vocab","attachment":{"hash":"9f68a65a64d4c64ea41d94024160e1443ff51b6c7ba0a2f93e7702beaa0b1d25","size":351089,"filename":"vocab.enar.spm.zst","location":"main-workspace/translations-models-v2/371728a2-8c02-4528-bd76-4cd1c4e8f05e.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"en","targetLanguage":"ar","decompressedHash":"8d93c54aa5e2044c416ec680b5ff9af0227bd698521666e8b1a1ea1b041fbae8","decompressedSize":863591,"filter_expression":"","id":"0c63abfc-fd6a-4a4a-905b-2eb3d2b311d0","last_modified":1758911496181},{"name":"model.enar.intgemm.alphas.bin","schema":1758909266381,"version":"3.0","fileType":"model","attachment":{"hash":"41dc919c1110508ad7f03ee53bbb28a54abd61d1b15bbc3fe51c5df5c9331016","size":22272394,"filename":"model.enar.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/0d56ac93-c0ac-4854-b48e-09e38d51dace.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"en","targetLanguage":"ar","decompressedHash":"ae659d7045fc2e5d6ba50583586a5d94ee4358d92c019847e37b57a0e627faa8","decompressedSize":31561787,"filter_expression":"","id":"9a551253-9f27-4291-8a88-625e780aaf45","last_modified":1758911496170},{"name":"vocab.aren.spm","schema":1758909249730,"version":"3.0","fileType":"vocab","attachment":{"hash":"4e7256a9b84ae2773a5b32a234418d1c111a018b9e1bf2580ad83972d5166687","size":349058,"filename":"vocab.aren.spm.zst","location":"main-workspace/translations-models-v2/324af319-7174-4574-a0e5-dc047a78aa33.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"ar","targetLanguage":"en","decompressedHash":"51b4ee3f828d10015464523d0b4f5a6c086b0b2a9bde716a581001cf6c260366","decompressedSize":860035,"filter_expression":"","id":"607c9e3a-3e9e-42f8-b9c2-d4e8e80ea36a","last_modified":1758911496164},{"name":"model.aren.intgemm.alphas.bin","schema":1758909244749,"version":"3.0","fileType":"model","attachment":{"hash":"beed6b0da7378dfe256a9c0604a0d07dcb2b9ad4ce5295ac1ea6f1c5815eed65","size":22770191,"filename":"model.aren.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/c1fc44d3-7b80-415e-9b74-57c4ee027559.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"ar","targetLanguage":"en","decompressedHash":"7b7af0282dc5f4d8805b9a298c2fa828967e3f09ca10f1942ebeea0b2cfc12fa","decompressedSize":31561787,"filter_expression":"","id":"7c107433-ad43-45af-a333-7fd70334a323","last_modified":1758911496160},{"name":"lex.50.50.aren.s2t.bin","schema":1758909242798,"version":"3.0","fileType":"lex","attachment":{"hash":"0dc3d51a8e41da0ee6f53784e04b2cd044e20e15f15b09aa9c1d96047de803b4","size":1623998,"filename":"lex.50.50.aren.s2t.bin.zst","location":"main-workspace/translations-models-v2/5fef8e32-9215-4eda-b63d-b4105b9820f6.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"ar","targetLanguage":"en","decompressedHash":"4b45f14dbea40d368093a13563fc1ca48457ee70c1291c82b206f3baff210081","decompressedSize":4627200,"filter_expression":"","id":"fc8a9213-51df-480d-bc5c-7b77b4731a78","last_modified":1758911496157},{"name":"model.eten.intgemm.alphas.bin","schema":1758909712362,"version":"3.0","fileType":"model","attachment":{"hash":"fff9da74420cee845d6f163f9516244b768ee50d92e39378343b9fee85646b76","size":22209211,"filename":"model.eten.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/6d30da5f-b47f-45be-9ac6-aa77f7991442.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"et","targetLanguage":"en","decompressedHash":"df844b3a6df906b2e0682fb7765694f35b351854db00f964896d9c8c365fbff3","decompressedSize":31561787,"filter_expression":"","id":"20860e06-9e40-495f-87d8-a065af6f6059","last_modified":1758911496154},{"name":"model.sqen.intgemm.alphas.bin","schema":1758909221915,"version":"3.0","fileType":"model","attachment":{"hash":"c5f0bc8ccae93f6b3123401af91f54fe59ea69d048eb05e02367afb2863acbb6","size":12379503,"filename":"model.sqen.intgemm.alphas.bin.zst","location":"main-workspace/translations-models-v2/84d98091-03d2-460a-a11b-b7fb28d22a44.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"sq","targetLanguage":"en","decompressedHash":"4b0ce319e7c8f7e1836ce18cb6522c83268e8cff54f2a7f5dcef270250a44475","decompressedSize":17141051,"filter_expression":"","id":"50a7e67a-5509-4487-82fc-144ad0b33a0c","last_modified":1758911496150},{"name":"lex.50.50.enar.s2t.bin","schema":1758909271383,"version":"3.0","fileType":"lex","attachment":{"hash":"f5fe1d8d145e38b4c6fd9f7a35d0d5779388fa135743561e1d25e982d7191222","size":1204697,"filename":"lex.50.50.enar.s2t.bin.zst","location":"main-workspace/translations-models-v2/6b7c1061-729a-44e3-858d-409a7061a704.zst","mimetype":"application/zstd"},"architecture":"base-memory","sourceLanguage":"en","targetLanguage":"ar","decompressedHash":"2b7194817c5dd9225ca90c0d908cc92e1d6d1f45625781a5feb037ac568d6a61","decompressedSize":3139692,"filter_expression":"","id":"b0ced79d-42b5-41f8-89ae-00f04e74c397","last_modified":1758911496140},{"name":"lex.50.50.sqen.s2t.bin","schema":1758909225644,"version":"3.0","fileType":"lex","attachment":{"hash":"4e0044881aa56676d77c78ecd7624501e55be17b46b3d83f631d644676cebdd8","size":1568494,"filename":"lex.50.50.sqen.s2t.bin.zst","location":"main-workspace/translations-models-v2/b273af7e-c040-44df-82f3-efa7cf66b05a.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"sq","targetLanguage":"en","decompressedHash":"b2f51df0bc14b9f89a29d39652a80167ef413eb1579957ecea825cb0a7575c60","decompressedSize":4256516,"filter_expression":"","id":"956a8c98-3406-4529-ae52-abb3db9c1155","last_modified":1758911496137},{"name":"vocab.sqen.spm","schema":1758909220215,"version":"3.0","fileType":"vocab","attachment":{"hash":"3c9879df2f152e5be0156d5d3418f801ba3d3dc5da62eb03c4549f005384a870","size":349916,"filename":"vocab.sqen.spm.zst","location":"main-workspace/translations-models-v2/7c707ec5-8e28-48ac-8cc4-e73572d67739.zst","mimetype":"application/zstd"},"architecture":"tiny","sourceLanguage":"sq","targetLanguage":"en","decompressedHash":"6b7ce057b54ed983eb47087254ea8673e20a857739fc5b57874c80c3301bb91d","decompressedSize":820200,"filter_expression":"","id":"b11ac647-eba6-47a1-9213-af6984811da5","last_modified":1758911496133}]} \ No newline at end of file diff --git a/src/mtran/vendor/mtranserver/deprecated/go/data/utils.go b/src/mtran/vendor/mtranserver/deprecated/go/data/utils.go new file mode 100644 index 0000000..618baa9 --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/go/data/utils.go @@ -0,0 +1,14 @@ +package data + +import "crypto/sha256" + +//go:generate go run gen_update.go +//go:generate go run gen_hash.go + +func GetRecordsInfo() (hash string, size int) { + return RecordsHash, len(RecordsJson) +} + +func ComputeHash(data []byte) [32]byte { + return sha256.Sum256(data) +} diff --git a/src/mtran/vendor/mtranserver/deprecated/go/go.mod b/src/mtran/vendor/mtranserver/deprecated/go/go.mod new file mode 100644 index 0000000..c9b61e1 --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/go/go.mod @@ -0,0 +1,116 @@ +module github.com/xxnuo/MTranServer + +go 1.25.3 + +require ( + github.com/gin-gonic/gin v1.11.0 + github.com/gorilla/websocket v1.5.3 + github.com/hashicorp/go-getter v1.8.2 + github.com/klauspost/compress v1.18.2 + github.com/pemistahl/lingua-go v1.4.0 + github.com/shirou/gopsutil/v4 v4.25.11 + github.com/stretchr/testify v1.11.1 + github.com/swaggo/files v1.0.1 + github.com/swaggo/gin-swagger v1.6.1 + github.com/swaggo/swag v1.16.6 +) + +require ( + cloud.google.com/go v0.110.0 // indirect + cloud.google.com/go/compute/metadata v0.3.0 // indirect + cloud.google.com/go/iam v0.13.0 // indirect + cloud.google.com/go/storage v1.29.0 // indirect + github.com/KyleBanks/depth v1.2.1 // indirect + github.com/aws/aws-sdk-go-v2 v1.36.3 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.10 // indirect + github.com/aws/aws-sdk-go-v2/config v1.29.15 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.17.68 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.30 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.34 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.34 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.34 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.3 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.7.2 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.15 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.15 // indirect + github.com/aws/aws-sdk-go-v2/service/s3 v1.80.1 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.25.3 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.1 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.33.20 // indirect + github.com/aws/smithy-go v1.22.3 // indirect + github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect + github.com/bytedance/gopkg v0.1.3 // indirect + github.com/bytedance/sonic v1.14.2 // indirect + github.com/bytedance/sonic/loader v0.4.0 // indirect + github.com/cloudwego/base64x v0.1.6 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/ebitengine/purego v0.9.1 // indirect + github.com/gabriel-vasile/mimetype v1.4.11 // indirect + github.com/gin-contrib/sse v1.1.0 // indirect + github.com/go-ole/go-ole v1.2.6 // indirect + github.com/go-openapi/jsonpointer v0.22.1 // indirect + github.com/go-openapi/jsonreference v0.21.3 // indirect + github.com/go-openapi/spec v0.22.1 // indirect + github.com/go-openapi/swag/conv v0.25.1 // indirect + github.com/go-openapi/swag/jsonname v0.25.1 // indirect + github.com/go-openapi/swag/jsonutils v0.25.1 // indirect + github.com/go-openapi/swag/loading v0.25.1 // indirect + github.com/go-openapi/swag/stringutils v0.25.1 // indirect + github.com/go-openapi/swag/typeutils v0.25.1 // indirect + github.com/go-openapi/swag/yamlutils v0.25.1 // indirect + github.com/go-playground/locales v0.14.1 // indirect + github.com/go-playground/universal-translator v0.18.1 // indirect + github.com/go-playground/validator/v10 v10.28.0 // indirect + github.com/goccy/go-json v0.10.5 // indirect + github.com/goccy/go-yaml v1.18.0 // indirect + github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect + github.com/golang/protobuf v1.5.3 // indirect + github.com/google/go-cmp v0.7.0 // indirect + github.com/google/uuid v1.3.0 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.2.3 // indirect + github.com/googleapis/gax-go/v2 v2.7.1 // indirect + github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.65 // indirect + github.com/hashicorp/go-cleanhttp v0.5.2 // indirect + github.com/hashicorp/go-version v1.6.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/cpuid/v2 v2.3.0 // indirect + github.com/leodido/go-urn v1.4.0 // indirect + github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/mitchellh/go-homedir v1.1.0 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/pelletier/go-toml/v2 v2.2.4 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect + github.com/quic-go/qpack v0.5.1 // indirect + github.com/quic-go/quic-go v0.56.0 // indirect + github.com/shopspring/decimal v1.3.1 // indirect + github.com/tklauser/go-sysconf v0.3.16 // indirect + github.com/tklauser/numcpus v0.11.0 // indirect + github.com/twitchyliquid64/golang-asm v0.15.1 // indirect + github.com/ugorji/go/codec v1.3.1 // indirect + github.com/ulikunitz/xz v0.5.15 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.opencensus.io v0.24.0 // indirect + go.uber.org/mock v0.6.0 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/arch v0.23.0 // indirect + golang.org/x/crypto v0.43.0 // indirect + golang.org/x/exp v0.0.0-20221106115401-f9659909a136 // indirect + golang.org/x/mod v0.29.0 // indirect + golang.org/x/net v0.46.0 // indirect + golang.org/x/oauth2 v0.27.0 // indirect + golang.org/x/sync v0.18.0 // indirect + golang.org/x/sys v0.38.0 // indirect + golang.org/x/text v0.30.0 // indirect + golang.org/x/tools v0.38.0 // indirect + golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect + google.golang.org/api v0.114.0 // indirect + google.golang.org/appengine v1.6.7 // indirect + google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 // indirect + google.golang.org/grpc v1.56.3 // indirect + google.golang.org/protobuf v1.36.10 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) diff --git a/src/mtran/vendor/mtranserver/deprecated/go/go.sum b/src/mtran/vendor/mtranserver/deprecated/go/go.sum new file mode 100644 index 0000000..4ab7562 --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/go/go.sum @@ -0,0 +1,362 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.110.0 h1:Zc8gqp3+a9/Eyph2KDmcGaPtbKRIoqq4YTlL4NMD0Ys= +cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= +cloud.google.com/go/compute/metadata v0.3.0 h1:Tz+eQXMEqDIKRsmY3cHTL6FVaynIjX2QxYC4trgAKZc= +cloud.google.com/go/compute/metadata v0.3.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= +cloud.google.com/go/iam v0.13.0 h1:+CmB+K0J/33d0zSQ9SlFWUeCCEn5XJA0ZMZ3pHE9u8k= +cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0= +cloud.google.com/go/longrunning v0.4.1 h1:v+yFJOfKC3yZdY6ZUI933pIYdhyhV8S3NpWrXWmg7jM= +cloud.google.com/go/longrunning v0.4.1/go.mod h1:4iWDqhBZ70CvZ6BfETbvam3T8FMvLK+eFj0E6AaRQTo= +cloud.google.com/go/storage v1.29.0 h1:6weCgzRvMg7lzuUurI4697AqIRPU1SvzHhynwpW31jI= +cloud.google.com/go/storage v1.29.0/go.mod h1:4puEjyTKnku6gfKoTfNOU/W+a9JyuVNxjpS5GBrB8h4= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc= +github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE= +github.com/aws/aws-sdk-go-v2 v1.36.3 h1:mJoei2CxPutQVxaATCzDUjcZEjVRdpsiiXi2o38yqWM= +github.com/aws/aws-sdk-go-v2 v1.36.3/go.mod h1:LLXuLpgzEbD766Z5ECcRmi8AzSwfZItDtmABVkRLGzg= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.10 h1:zAybnyUQXIZ5mok5Jqwlf58/TFE7uvd3IAsa1aF9cXs= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.10/go.mod h1:qqvMj6gHLR/EXWZw4ZbqlPbQUyenf4h82UQUlKc+l14= +github.com/aws/aws-sdk-go-v2/config v1.29.15 h1:I5XjesVMpDZXZEZonVfjI12VNMrYa38LtLnw4NtY5Ss= +github.com/aws/aws-sdk-go-v2/config v1.29.15/go.mod h1:tNIp4JIPonlsgaO5hxO372a6gjhN63aSWl2GVl5QoBQ= +github.com/aws/aws-sdk-go-v2/credentials v1.17.68 h1:cFb9yjI02/sWHBSYXAtkamjzCuRymvmeFmt0TC0MbYY= +github.com/aws/aws-sdk-go-v2/credentials v1.17.68/go.mod h1:H6E+jBzyqUu8u0vGaU6POkK3P0NylYEeRZ6ynBpMqIk= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.30 h1:x793wxmUWVDhshP8WW2mlnXuFrO4cOd3HLBroh1paFw= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.30/go.mod h1:Jpne2tDnYiFascUEs2AWHJL9Yp7A5ZVy3TNyxaAjD6M= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.34 h1:ZK5jHhnrioRkUNOc+hOgQKlUL5JeC3S6JgLxtQ+Rm0Q= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.34/go.mod h1:p4VfIceZokChbA9FzMbRGz5OV+lekcVtHlPKEO0gSZY= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.34 h1:SZwFm17ZUNNg5Np0ioo/gq8Mn6u9w19Mri8DnJ15Jf0= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.34/go.mod h1:dFZsC0BLo346mvKQLWmoJxT+Sjp+qcVR1tRVHQGOH9Q= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 h1:bIqFDwgGXXN1Kpp99pDOdKMTTb5d2KyU5X/BZxjOkRo= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3/go.mod h1:H5O/EsxDWyU+LP/V8i5sm8cxoZgc2fdNR9bxlOFrQTo= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.34 h1:ZNTqv4nIdE/DiBfUUfXcLZ/Spcuz+RjeziUtNJackkM= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.34/go.mod h1:zf7Vcd1ViW7cPqYWEHLHJkS50X0JS2IKz9Cgaj6ugrs= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.3 h1:eAh2A4b5IzM/lum78bZ590jy36+d/aFLgKF/4Vd1xPE= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.3/go.mod h1:0yKJC/kb8sAnmlYa6Zs3QVYqaC8ug2AbnNChv5Ox3uA= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.7.2 h1:BCG7DCXEXpNCcpwCxg1oi9pkJWH2+eZzTn9MY56MbVw= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.7.2/go.mod h1:iu6FSzgt+M2/x3Dk8zhycdIcHjEFb36IS8HVUVFoMg0= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.15 h1:dM9/92u2F1JbDaGooxTq18wmmFzbJRfXfVfy96/1CXM= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.15/go.mod h1:SwFBy2vjtA0vZbjjaFtfN045boopadnoVPhu4Fv66vY= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.15 h1:moLQUoVq91LiqT1nbvzDukyqAlCv89ZmwaHw/ZFlFZg= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.15/go.mod h1:ZH34PJUc8ApjBIfgQCFvkWcUDBtl/WTD+uiYHjd8igA= +github.com/aws/aws-sdk-go-v2/service/s3 v1.80.1 h1:xYEAf/6QHiTZDccKnPMbsMwlau13GsDsTgdue3wmHGw= +github.com/aws/aws-sdk-go-v2/service/s3 v1.80.1/go.mod h1:qbn305Je/IofWBJ4bJz/Q7pDEtnnoInw/dGt71v6rHE= +github.com/aws/aws-sdk-go-v2/service/sso v1.25.3 h1:1Gw+9ajCV1jogloEv1RRnvfRFia2cL6c9cuKV2Ps+G8= +github.com/aws/aws-sdk-go-v2/service/sso v1.25.3/go.mod h1:qs4a9T5EMLl/Cajiw2TcbNt2UNo/Hqlyp+GiuG4CFDI= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.1 h1:hXmVKytPfTy5axZ+fYbR5d0cFmC3JvwLm5kM83luako= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.1/go.mod h1:MlYRNmYu/fGPoxBQVvBYr9nyr948aY/WLUvwBMBJubs= +github.com/aws/aws-sdk-go-v2/service/sts v1.33.20 h1:oIaQ1e17CSKaWmUTu62MtraRWVIosn/iONMuZt0gbqc= +github.com/aws/aws-sdk-go-v2/service/sts v1.33.20/go.mod h1:cQnB8CUnxbMU82JvlqjKR2HBOm3fe9pWorWBza6MBJ4= +github.com/aws/smithy-go v1.22.3 h1:Z//5NuZCSW6R4PhQ93hShNbyBbn8BWCmCVCt+Q8Io5k= +github.com/aws/smithy-go v1.22.3/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI= +github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d h1:xDfNPAt8lFiC1UJrqV3uuy861HCTo708pDMbjHHdCas= +github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d/go.mod h1:6QX/PXZ00z/TKoufEY6K/a0k6AhaJrQKdFe6OfVXsa4= +github.com/bytedance/gopkg v0.1.3 h1:TPBSwH8RsouGCBcMBktLt1AymVo2TVsBVCY4b6TnZ/M= +github.com/bytedance/gopkg v0.1.3/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM= +github.com/bytedance/sonic v1.14.2 h1:k1twIoe97C1DtYUo+fZQy865IuHia4PR5RPiuGPPIIE= +github.com/bytedance/sonic v1.14.2/go.mod h1:T80iDELeHiHKSc0C9tubFygiuXoGzrkjKzX2quAx980= +github.com/bytedance/sonic/loader v0.4.0 h1:olZ7lEqcxtZygCK9EKYKADnpQoYkRQxaeY2NYzevs+o= +github.com/bytedance/sonic/loader v0.4.0/go.mod h1:AR4NYCk5DdzZizZ5djGqQ92eEhCCcdf5x77udYiSJRo= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cloudwego/base64x v0.1.6 h1:t11wG9AECkCDk5fMSoxmufanudBtJ+/HemLstXDLI2M= +github.com/cloudwego/base64x v0.1.6/go.mod h1:OFcloc187FXDaYHvrNIjxSe8ncn0OOM8gEHfghB2IPU= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/ebitengine/purego v0.9.1 h1:a/k2f2HQU3Pi399RPW1MOaZyhKJL9w/xFpKAg4q1s0A= +github.com/ebitengine/purego v0.9.1/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/gabriel-vasile/mimetype v1.4.11 h1:AQvxbp830wPhHTqc1u7nzoLT+ZFxGY7emj5DR5DYFik= +github.com/gabriel-vasile/mimetype v1.4.11/go.mod h1:d+9Oxyo1wTzWdyVUPMmXFvp4F9tea18J8ufA774AB3s= +github.com/gin-contrib/gzip v0.0.6 h1:NjcunTcGAj5CO1gn4N8jHOSIeRFHIbn51z6K+xaN4d4= +github.com/gin-contrib/gzip v0.0.6/go.mod h1:QOJlmV2xmayAjkNS2Y8NQsMneuRShOU/kjovCXNuzzk= +github.com/gin-contrib/sse v1.1.0 h1:n0w2GMuUpWDVp7qSpvze6fAu9iRxJY4Hmj6AmBOU05w= +github.com/gin-contrib/sse v1.1.0/go.mod h1:hxRZ5gVpWMT7Z0B0gSNYqqsSCNIJMjzvm6fqCz9vjwM= +github.com/gin-gonic/gin v1.11.0 h1:OW/6PLjyusp2PPXtyxKHU0RbX6I/l28FTdDlae5ueWk= +github.com/gin-gonic/gin v1.11.0/go.mod h1:+iq/FyxlGzII0KHiBGjuNn4UNENUlKbGlNmc+W50Dls= +github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-openapi/jsonpointer v0.22.1 h1:sHYI1He3b9NqJ4wXLoJDKmUmHkWy/L7rtEo92JUxBNk= +github.com/go-openapi/jsonpointer v0.22.1/go.mod h1:pQT9OsLkfz1yWoMgYFy4x3U5GY5nUlsOn1qSBH5MkCM= +github.com/go-openapi/jsonreference v0.21.3 h1:96Dn+MRPa0nYAR8DR1E03SblB5FJvh7W6krPI0Z7qMc= +github.com/go-openapi/jsonreference v0.21.3/go.mod h1:RqkUP0MrLf37HqxZxrIAtTWW4ZJIK1VzduhXYBEeGc4= +github.com/go-openapi/spec v0.22.1 h1:beZMa5AVQzRspNjvhe5aG1/XyBSMeX1eEOs7dMoXh/k= +github.com/go-openapi/spec v0.22.1/go.mod h1:c7aeIQT175dVowfp7FeCvXXnjN/MrpaONStibD2WtDA= +github.com/go-openapi/swag v0.19.15 h1:D2NRCBzS9/pEY3gP9Nl8aDqGUcPFrwG2p+CNFrLyrCM= +github.com/go-openapi/swag/conv v0.25.1 h1:+9o8YUg6QuqqBM5X6rYL/p1dpWeZRhoIt9x7CCP+he0= +github.com/go-openapi/swag/conv v0.25.1/go.mod h1:Z1mFEGPfyIKPu0806khI3zF+/EUXde+fdeksUl2NiDs= +github.com/go-openapi/swag/jsonname v0.25.1 h1:Sgx+qbwa4ej6AomWC6pEfXrA6uP2RkaNjA9BR8a1RJU= +github.com/go-openapi/swag/jsonname v0.25.1/go.mod h1:71Tekow6UOLBD3wS7XhdT98g5J5GR13NOTQ9/6Q11Zo= +github.com/go-openapi/swag/jsonutils v0.25.1 h1:AihLHaD0brrkJoMqEZOBNzTLnk81Kg9cWr+SPtxtgl8= +github.com/go-openapi/swag/jsonutils v0.25.1/go.mod h1:JpEkAjxQXpiaHmRO04N1zE4qbUEg3b7Udll7AMGTNOo= +github.com/go-openapi/swag/jsonutils/fixtures_test v0.25.1 h1:DSQGcdB6G0N9c/KhtpYc71PzzGEIc/fZ1no35x4/XBY= +github.com/go-openapi/swag/jsonutils/fixtures_test v0.25.1/go.mod h1:kjmweouyPwRUEYMSrbAidoLMGeJ5p6zdHi9BgZiqmsg= +github.com/go-openapi/swag/loading v0.25.1 h1:6OruqzjWoJyanZOim58iG2vj934TysYVptyaoXS24kw= +github.com/go-openapi/swag/loading v0.25.1/go.mod h1:xoIe2EG32NOYYbqxvXgPzne989bWvSNoWoyQVWEZicc= +github.com/go-openapi/swag/stringutils v0.25.1 h1:Xasqgjvk30eUe8VKdmyzKtjkVjeiXx1Iz0zDfMNpPbw= +github.com/go-openapi/swag/stringutils v0.25.1/go.mod h1:JLdSAq5169HaiDUbTvArA2yQxmgn4D6h4A+4HqVvAYg= +github.com/go-openapi/swag/typeutils v0.25.1 h1:rD/9HsEQieewNt6/k+JBwkxuAHktFtH3I3ysiFZqukA= +github.com/go-openapi/swag/typeutils v0.25.1/go.mod h1:9McMC/oCdS4BKwk2shEB7x17P6HmMmA6dQRtAkSnNb8= +github.com/go-openapi/swag/yamlutils v0.25.1 h1:mry5ez8joJwzvMbaTGLhw8pXUnhDK91oSJLDPF1bmGk= +github.com/go-openapi/swag/yamlutils v0.25.1/go.mod h1:cm9ywbzncy3y6uPm/97ysW8+wZ09qsks+9RS8fLWKqg= +github.com/go-openapi/testify/v2 v2.0.2 h1:X999g3jeLcoY8qctY/c/Z8iBHTbwLz7R2WXd6Ub6wls= +github.com/go-openapi/testify/v2 v2.0.2/go.mod h1:HCPmvFFnheKK2BuwSA0TbbdxJ3I16pjwMkYkP4Ywn54= +github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= +github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= +github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= +github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= +github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= +github.com/go-playground/validator/v10 v10.28.0 h1:Q7ibns33JjyW48gHkuFT91qX48KG0ktULL6FgHdG688= +github.com/go-playground/validator/v10 v10.28.0/go.mod h1:GoI6I1SjPBh9p7ykNE/yj3fFYbyDOpwMn5KXd+m2hUU= +github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4= +github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= +github.com/goccy/go-yaml v1.18.0 h1:8W7wMFS12Pcas7KU+VVkaiCng+kG8QiFeFwzFb+rwuw= +github.com/goccy/go-yaml v1.18.0/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian/v3 v3.3.2 h1:IqNFLAmvJOgVlpdEBiQbDc2EwKW77amAycfTuWKdfvw= +github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/enterprise-certificate-proxy v0.2.3 h1:yk9/cqRKtT9wXZSsRH9aurXEpJX+U6FLtpYTdC3R06k= +github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= +github.com/googleapis/gax-go/v2 v2.7.1 h1:gF4c0zjUP2H/s/hEGyLA3I0fA2ZWjzYiONAD6cvPr8A= +github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= +github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= +github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.65 h1:81+kWbE1yErFBMjME0I5k3x3kojjKsWtPYHEAutoPow= +github.com/hashicorp/aws-sdk-go-base/v2 v2.0.0-beta.65/go.mod h1:WtMzv9T++tfWVea+qB2MXoaqxw33S8bpJslzUike2mQ= +github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= +github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= +github.com/hashicorp/go-getter v1.8.2 h1:CGCK+bZQLl44PYiwJweVzfpjg7bBwtuXu3AGcLiod2o= +github.com/hashicorp/go-getter v1.8.2/go.mod h1:CUTt9x2bCtJ/sV8ihgrITL3IUE+0BE1j/e4n5P/GIM4= +github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek= +github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/klauspost/compress v1.18.2 h1:iiPHWW0YrcFgpBYhsA6D1+fqHssJscY/Tm/y2Uqnapk= +github.com/klauspost/compress v1.18.2/go.mod h1:R0h/fSBs8DE4ENlcrlib3PsXS61voFxhIs2DeRhCvJ4= +github.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzhA9Y= +github.com/klauspost/cpuid/v2 v2.3.0/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= +github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4= +github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY= +github.com/pemistahl/lingua-go v1.4.0 h1:ifYhthrlW7iO4icdubwlduYnmwU37V1sbNrwhKBR4rM= +github.com/pemistahl/lingua-go v1.4.0/go.mod h1:ECuM1Hp/3hvyh7k8aWSqNCPlTxLemFZsRjocUf3KgME= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/quic-go/qpack v0.5.1 h1:giqksBPnT/HDtZ6VhtFKgoLOWmlyo9Ei6u9PqzIMbhI= +github.com/quic-go/qpack v0.5.1/go.mod h1:+PC4XFrEskIVkcLzpEkbLqq1uCoxPhQuvK5rH1ZgaEg= +github.com/quic-go/quic-go v0.56.0 h1:q/TW+OLismmXAehgFLczhCDTYB3bFmua4D9lsNBWxvY= +github.com/quic-go/quic-go v0.56.0/go.mod h1:9gx5KsFQtw2oZ6GZTyh+7YEvOxWCL9WZAepnHxgAo6c= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/shirou/gopsutil/v4 v4.25.11 h1:X53gB7muL9Gnwwo2evPSE+SfOrltMoR6V3xJAXZILTY= +github.com/shirou/gopsutil/v4 v4.25.11/go.mod h1:EivAfP5x2EhLp2ovdpKSozecVXn1TmuG7SMzs/Wh4PU= +github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8= +github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/swaggo/files v1.0.1 h1:J1bVJ4XHZNq0I46UU90611i9/YzdrF7x92oX1ig5IdE= +github.com/swaggo/files v1.0.1/go.mod h1:0qXmMNH6sXNf+73t65aKeB+ApmgxdnkQzVTAj2uaMUg= +github.com/swaggo/gin-swagger v1.6.1 h1:Ri06G4gc9N4t4k8hekMigJ9zKTFSlqj/9paAQCQs7cY= +github.com/swaggo/gin-swagger v1.6.1/go.mod h1:LQ+hJStHakCWRiK/YNYtJOu4mR2FP+pxLnILT/qNiTw= +github.com/swaggo/swag v1.16.6 h1:qBNcx53ZaX+M5dxVyTrgQ0PJ/ACK+NzhwcbieTt+9yI= +github.com/swaggo/swag v1.16.6/go.mod h1:ngP2etMK5a0P3QBizic5MEwpRmluJZPHjXcMoj4Xesg= +github.com/tklauser/go-sysconf v0.3.16 h1:frioLaCQSsF5Cy1jgRBrzr6t502KIIwQ0MArYICU0nA= +github.com/tklauser/go-sysconf v0.3.16/go.mod h1:/qNL9xxDhc7tx3HSRsLWNnuzbVfh3e7gh/BmM179nYI= +github.com/tklauser/numcpus v0.11.0 h1:nSTwhKH5e1dMNsCdVBukSZrURJRoHbSEQjdEbY+9RXw= +github.com/tklauser/numcpus v0.11.0/go.mod h1:z+LwcLq54uWZTX0u/bGobaV34u6V7KNlTZejzM6/3MQ= +github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= +github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= +github.com/ugorji/go/codec v1.3.1 h1:waO7eEiFDwidsBN6agj1vJQ4AG7lh2yqXyOXqhgQuyY= +github.com/ugorji/go/codec v1.3.1/go.mod h1:pRBVtBSKl77K30Bv8R2P+cLSGaTtex6fsA2Wjqmfxj4= +github.com/ulikunitz/xz v0.5.15 h1:9DNdB5s+SgV3bQ2ApL10xRc35ck0DuIX/isZvIk+ubY= +github.com/ulikunitz/xz v0.5.15/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= +go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +go.uber.org/mock v0.6.0 h1:hyF9dfmbgIX5EfOdasqLsWD6xqpNZlXblLB/Dbnwv3Y= +go.uber.org/mock v0.6.0/go.mod h1:KiVJ4BqZJaMj4svdfmHM0AUx4NJYO8ZNpPnZn1Z+BBU= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/arch v0.23.0 h1:lKF64A2jF6Zd8L0knGltUnegD62JMFBiCPBmQpToHhg= +golang.org/x/arch v0.23.0/go.mod h1:dNHoOeKiyja7GTvF9NJS1l3Z2yntpQNzgrjh1cU103A= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20221106115401-f9659909a136 h1:Fq7F/w7MAa1KJ5bt2aJ62ihqp9HDcRuyILskkpIAurw= +golang.org/x/exp v0.0.0-20221106115401-f9659909a136/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.27.0 h1:da9Vo7/tDv5RH/7nZDz1eMGS/q1Vv1N/7FCrBhI9I3M= +golang.org/x/oauth2 v0.27.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I= +golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc= +golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.38.0 h1:Hx2Xv8hISq8Lm16jvBZ2VQf+RLmbd7wVUsALibYI/IQ= +golang.org/x/tools v0.38.0/go.mod h1:yEsQ/d/YK8cjh0L6rZlY8tgtlKiBNTL14pGDJPJpYQs= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= +golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +google.golang.org/api v0.114.0 h1:1xQPji6cO2E2vLiI+C/XiFAnsn1WV3mjaEwGLhi3grE= +google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 h1:KpwkzHKEF7B9Zxg18WzOa7djJ+Ha5DzthMyZYQfEn2A= +google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.56.3 h1:8I4C0Yq1EjstUzUJzpcRVbuYA2mODtEmpWiQoN/b2nc= +google.golang.org/grpc v1.56.3/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.36.10 h1:AYd7cD/uASjIL6Q9LiTjz8JLcrh/88q5UObnmY3aOOE= +google.golang.org/protobuf v1.36.10/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/src/mtran/vendor/mtranserver/deprecated/go/internal/config/config.go b/src/mtran/vendor/mtranserver/deprecated/go/internal/config/config.go new file mode 100644 index 0000000..db146e0 --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/go/internal/config/config.go @@ -0,0 +1,57 @@ +package config + +import ( + "flag" + "os" + "path/filepath" + + "github.com/xxnuo/MTranServer/internal/utils" +) + +type Config struct { + LogLevel string + HomeDir string + ConfigDir string + ModelDir string + + Host string + Port string + EnableWebUI bool + EnableOfflineMode bool + WorkerIdleTimeout int + WorkersPerLanguage int + APIToken string +} + +var ( + GlobalConfig *Config = nil +) + +// GetConfig 加载配置,优先级:命令行参数 > 环境变量 > 默认值 +func GetConfig() *Config { + if GlobalConfig != nil { + return GlobalConfig + } + cfg := &Config{} + homeDir, err := os.UserHomeDir() + if err != nil { + panic(err) + } + cfg.HomeDir = filepath.Join(homeDir, ".config", "mtran") + cfg.ConfigDir = filepath.Join(cfg.HomeDir, "server") + cfg.ModelDir = filepath.Join(cfg.HomeDir, "models") + + flag.StringVar(&cfg.LogLevel, "log-level", utils.GetEnv("MT_LOG_LEVEL", "warn"), "Log level (debug, info, warn, error)") + flag.StringVar(&cfg.ConfigDir, "config-dir", utils.GetEnv("MT_CONFIG_DIR", cfg.ConfigDir), "Config directory") + flag.StringVar(&cfg.ModelDir, "model-dir", utils.GetEnv("MT_MODEL_DIR", cfg.ModelDir), "Model directory") + flag.StringVar(&cfg.Host, "host", utils.GetEnv("MT_HOST", "0.0.0.0"), "Server host address") + flag.StringVar(&cfg.Port, "port", utils.GetEnv("MT_PORT", "8989"), "Server port") + flag.BoolVar(&cfg.EnableWebUI, "ui", utils.GetBoolEnv("MT_ENABLE_UI", true), "Enable web UI") + flag.BoolVar(&cfg.EnableOfflineMode, "offline", utils.GetBoolEnv("MT_OFFLINE", false), "Enable offline mode") + flag.IntVar(&cfg.WorkerIdleTimeout, "worker-idle-timeout", utils.GetIntEnv("MT_WORKER_IDLE_TIMEOUT", 60), "Worker idle timeout in seconds") + flag.IntVar(&cfg.WorkersPerLanguage, "workers-per-language", utils.GetIntEnv("MT_WORKERS_PER_LANGUAGE", 1), "Number of workers per language pair") + flag.StringVar(&cfg.APIToken, "api-token", utils.GetEnv("MT_API_TOKEN", ""), "API access token") + + GlobalConfig = cfg + return cfg +} diff --git a/src/mtran/vendor/mtranserver/deprecated/go/internal/docs/docs.go b/src/mtran/vendor/mtranserver/deprecated/go/internal/docs/docs.go new file mode 100644 index 0000000..69e2953 --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/go/internal/docs/docs.go @@ -0,0 +1,1175 @@ +// Package docs Code generated by swaggo/swag. DO NOT EDIT +package docs + +import "github.com/swaggo/swag" + +const docTemplate = `{ + "schemes": {{ marshal .Schemes }}, + "swagger": "2.0", + "info": { + "description": "{{escape .Description}}", + "title": "{{.Title}}", + "termsOfService": "https://github.com/xxnuo/MTranServer", + "contact": { + "name": "API Support", + "url": "https://github.com/xxnuo/MTranServer/issues" + }, + "license": { + "name": "Apache 2.0", + "url": "https://github.com/xxnuo/MTranServer/blob/main/LICENSE" + }, + "version": "{{.Version}}" + }, + "host": "{{.Host}}", + "basePath": "{{.BasePath}}", + "paths": { + "/__heartbeat__": { + "get": { + "description": "返回服务状态", + "produces": [ + "text/plain" + ], + "tags": [ + "系统" + ], + "summary": "心跳检查", + "responses": { + "200": { + "description": "Ready", + "schema": { + "type": "string" + } + } + } + } + }, + "/__lbheartbeat__": { + "get": { + "description": "返回负载均衡器心跳状态", + "produces": [ + "text/plain" + ], + "tags": [ + "系统" + ], + "summary": "负载均衡心跳检查", + "responses": { + "200": { + "description": "Ready", + "schema": { + "type": "string" + } + } + } + } + }, + "/deepl": { + "post": { + "description": "兼容 DeepL API v2 的翻译接口", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "插件" + ], + "summary": "DeepL 翻译兼容接口", + "parameters": [ + { + "type": "string", + "description": "API Token", + "name": "token", + "in": "query" + }, + { + "description": "DeepL 翻译请求", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/handlers.DeeplTranslateRequest" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/handlers.DeeplTranslateResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + } + } + }, + "/google/language/translate/v2": { + "post": { + "description": "兼容 Google Translate API v2 的翻译接口", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "插件" + ], + "summary": "Google 翻译兼容接口", + "parameters": [ + { + "type": "string", + "description": "API Key", + "name": "key", + "in": "query" + }, + { + "description": "Google 翻译请求", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/handlers.GoogleTranslateRequest" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/handlers.GoogleTranslateResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + } + } + }, + "/google/translate_a/single": { + "get": { + "description": "兼容 Google translate_a/single 的翻译接口", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "插件" + ], + "summary": "Google translate_a/single 兼容接口", + "parameters": [ + { + "type": "string", + "default": "gtx", + "description": "客户端类型", + "name": "client", + "in": "query" + }, + { + "type": "string", + "example": "en", + "description": "源语言代码", + "name": "sl", + "in": "query", + "required": true + }, + { + "type": "string", + "example": "zh-CN", + "description": "目标语言代码", + "name": "tl", + "in": "query", + "required": true + }, + { + "type": "string", + "default": "t", + "description": "数据类型", + "name": "dt", + "in": "query" + }, + { + "type": "string", + "example": "Hello, world!", + "description": "待翻译文本", + "name": "q", + "in": "query", + "required": true + }, + { + "type": "string", + "description": "API Key", + "name": "key", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": {} + } + }, + "400": { + "description": "Bad Request", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + } + } + }, + "/hcfy": { + "post": { + "description": "兼容划词翻译自定义翻译源接口", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "插件" + ], + "summary": "划词翻译兼容接口", + "parameters": [ + { + "type": "string", + "description": "API Token", + "name": "token", + "in": "query" + }, + { + "description": "划词翻译请求", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/handlers.HcfyTranslateRequest" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/handlers.HcfyTranslateResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + } + } + }, + "/health": { + "get": { + "description": "检查服务是否正常运行", + "produces": [ + "application/json" + ], + "tags": [ + "系统" + ], + "summary": "健康检查", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + } + } + }, + "/imme": { + "post": { + "description": "为沉浸式翻译插件提供的翻译接口", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "插件" + ], + "summary": "沉浸式翻译插件接口", + "parameters": [ + { + "type": "string", + "description": "API Token", + "name": "token", + "in": "query" + }, + { + "description": "沉浸式翻译请求", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/handlers.ImmeTranslateRequest" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/handlers.ImmeTranslateResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + } + } + }, + "/kiss": { + "post": { + "description": "为简约翻译插件提供的单文本翻译接口", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "插件" + ], + "summary": "简约翻译插件接口(非聚合)", + "parameters": [ + { + "type": "string", + "description": "API Token", + "name": "KEY", + "in": "header" + }, + { + "description": "简约翻译请求", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/handlers.KissTranslateRequest" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/handlers.KissTranslateResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + } + } + }, + "/languages": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyQuery": [] + } + ], + "description": "返回所有支持的翻译语言代码", + "produces": [ + "application/json" + ], + "tags": [ + "翻译" + ], + "summary": "获取支持的语言列表", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + } + } + }, + "/translate": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyQuery": [] + } + ], + "description": "翻译单个文本", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "翻译" + ], + "summary": "单文本翻译", + "parameters": [ + { + "description": "翻译请求", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/handlers.TranslateRequest" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/handlers.TranslateResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + } + } + }, + "/translate/batch": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyQuery": [] + } + ], + "description": "批量翻译多个文本", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "翻译" + ], + "summary": "批量翻译", + "parameters": [ + { + "description": "批量翻译请求", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/handlers.TranslateBatchRequest" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/handlers.TranslateBatchResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + } + } + }, + "/version": { + "get": { + "description": "返回当前服务的版本号", + "produces": [ + "application/json" + ], + "tags": [ + "系统" + ], + "summary": "获取服务版本", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + } + } + } + }, + "definitions": { + "handlers.DeeplTranslateRequest": { + "type": "object", + "required": [ + "target_lang", + "text" + ], + "properties": { + "context": { + "type": "string" + }, + "enable_beta_languages": { + "type": "boolean" + }, + "formality": { + "type": "string", + "example": "default" + }, + "glossary_id": { + "type": "string" + }, + "ignore_tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "model_type": { + "type": "string", + "example": "quality_optimized" + }, + "non_splitting_tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "outline_detection": { + "type": "string", + "example": "1" + }, + "preserve_formatting": { + "type": "string", + "example": "0" + }, + "source_lang": { + "type": "string", + "example": "EN" + }, + "split_sentences": { + "type": "string", + "example": "1" + }, + "splitting_tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "tag_handling": { + "type": "string", + "example": "xml" + }, + "target_lang": { + "type": "string", + "example": "DE" + }, + "text": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "Hello", + " world!" + ] + } + } + }, + "handlers.DeeplTranslateResponse": { + "type": "object", + "properties": { + "translations": { + "type": "array", + "items": { + "$ref": "#/definitions/handlers.DeeplTranslation" + } + } + } + }, + "handlers.DeeplTranslation": { + "type": "object", + "properties": { + "detected_source_language": { + "type": "string", + "example": "EN" + }, + "text": { + "type": "string", + "example": "Hallo, Welt!" + } + } + }, + "handlers.GoogleTranslateRequest": { + "type": "object", + "required": [ + "q", + "source", + "target" + ], + "properties": { + "format": { + "type": "string", + "example": "text" + }, + "q": { + "type": "string", + "example": "The Great Pyramid of Giza" + }, + "source": { + "type": "string", + "example": "en" + }, + "target": { + "type": "string", + "example": "zh-Hans" + } + } + }, + "handlers.GoogleTranslateResponse": { + "type": "object", + "properties": { + "data": { + "type": "object", + "properties": { + "translations": { + "type": "array", + "items": { + "type": "object", + "properties": { + "translatedText": { + "type": "string", + "example": "吉萨大金字塔" + } + } + } + } + } + } + } + }, + "handlers.HcfyDict": { + "type": "object", + "properties": { + "pos": { + "type": "string", + "example": "n." + }, + "terms": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "你好", + "问候" + ] + } + } + }, + "handlers.HcfyPhonetic": { + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "美" + }, + "ttsURI": { + "type": "string", + "example": "https://..." + }, + "value": { + "type": "string", + "example": "həˈloʊ" + } + } + }, + "handlers.HcfyTranslateRequest": { + "type": "object", + "required": [ + "destination", + "name", + "text" + ], + "properties": { + "destination": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "中文(简体)", + "英语" + ] + }, + "name": { + "type": "string", + "example": "翻译一" + }, + "source": { + "type": "string", + "example": "英语" + }, + "text": { + "type": "string", + "example": "Hello, word translation." + } + } + }, + "handlers.HcfyTranslateResponse": { + "type": "object", + "properties": { + "dict": { + "type": "array", + "items": { + "$ref": "#/definitions/handlers.HcfyDict" + } + }, + "from": { + "type": "string", + "example": "英语" + }, + "link": { + "type": "string", + "example": "https://..." + }, + "phonetic": { + "type": "array", + "items": { + "$ref": "#/definitions/handlers.HcfyPhonetic" + } + }, + "result": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "你好,划词翻译。" + ] + }, + "text": { + "type": "string", + "example": "Hello, word translation." + }, + "to": { + "type": "string", + "example": "中文(简体)" + }, + "ttsURI": { + "type": "string", + "example": "https://..." + } + } + }, + "handlers.ImmeTranslateRequest": { + "type": "object", + "required": [ + "source_lang", + "target_lang", + "text_list" + ], + "properties": { + "source_lang": { + "type": "string", + "example": "en" + }, + "target_lang": { + "type": "string", + "example": "zh-CN" + }, + "text_list": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "Hello", + " world!", + "Good morning!" + ] + } + } + }, + "handlers.ImmeTranslateResponse": { + "type": "object", + "properties": { + "translations": { + "type": "array", + "items": { + "$ref": "#/definitions/handlers.ImmeTranslation" + } + } + } + }, + "handlers.ImmeTranslation": { + "type": "object", + "properties": { + "detected_source_lang": { + "type": "string", + "example": "en" + }, + "text": { + "type": "string", + "example": "你好,世界!" + } + } + }, + "handlers.KissTranslateRequest": { + "type": "object", + "required": [ + "from", + "text", + "to" + ], + "properties": { + "from": { + "type": "string", + "example": "en" + }, + "text": { + "type": "string", + "example": "Hello, world!" + }, + "to": { + "type": "string", + "example": "zh-CN" + } + } + }, + "handlers.KissTranslateResponse": { + "type": "object", + "properties": { + "src": { + "type": "string", + "example": "en" + }, + "text": { + "type": "string", + "example": "你好,世界!" + } + } + }, + "handlers.TranslateBatchRequest": { + "type": "object", + "required": [ + "from", + "texts", + "to" + ], + "properties": { + "from": { + "type": "string", + "example": "en" + }, + "html": { + "type": "boolean", + "example": false + }, + "texts": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "Hello", + " world!", + "Good morning!" + ] + }, + "to": { + "type": "string", + "example": "zh-Hans" + } + } + }, + "handlers.TranslateBatchResponse": { + "type": "object", + "properties": { + "results": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "你好,世界!", + "早上好!" + ] + } + } + }, + "handlers.TranslateRequest": { + "type": "object", + "required": [ + "from", + "text", + "to" + ], + "properties": { + "from": { + "type": "string", + "example": "en" + }, + "html": { + "type": "boolean", + "example": false + }, + "text": { + "type": "string", + "example": "Hello, world!" + }, + "to": { + "type": "string", + "example": "zh-Hans" + } + } + }, + "handlers.TranslateResponse": { + "type": "object", + "properties": { + "result": { + "type": "string", + "example": "你好,世界!" + } + } + } + }, + "securityDefinitions": { + "ApiKeyAuth": { + "type": "apiKey", + "name": "Authorization", + "in": "header" + }, + "ApiKeyQuery": { + "type": "apiKey", + "name": "token", + "in": "query" + } + } +}` + +// SwaggerInfo holds exported Swagger Info so clients can modify it +var SwaggerInfo = &swag.Spec{ + Version: "3.0.0", + Host: "localhost:8989", + BasePath: "/", + Schemes: []string{}, + Title: "MTranServer API", + Description: "超低资源消耗超快的离线翻译服务器 API", + InfoInstanceName: "swagger", + SwaggerTemplate: docTemplate, + LeftDelim: "{{", + RightDelim: "}}", +} + +func init() { + swag.Register(SwaggerInfo.InstanceName(), SwaggerInfo) +} diff --git a/src/mtran/vendor/mtranserver/deprecated/go/internal/docs/swagger.json b/src/mtran/vendor/mtranserver/deprecated/go/internal/docs/swagger.json new file mode 100644 index 0000000..73c80c9 --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/go/internal/docs/swagger.json @@ -0,0 +1,1151 @@ +{ + "swagger": "2.0", + "info": { + "description": "超低资源消耗超快的离线翻译服务器 API", + "title": "MTranServer API", + "termsOfService": "https://github.com/xxnuo/MTranServer", + "contact": { + "name": "API Support", + "url": "https://github.com/xxnuo/MTranServer/issues" + }, + "license": { + "name": "Apache 2.0", + "url": "https://github.com/xxnuo/MTranServer/blob/main/LICENSE" + }, + "version": "3.0.0" + }, + "host": "localhost:8989", + "basePath": "/", + "paths": { + "/__heartbeat__": { + "get": { + "description": "返回服务状态", + "produces": [ + "text/plain" + ], + "tags": [ + "系统" + ], + "summary": "心跳检查", + "responses": { + "200": { + "description": "Ready", + "schema": { + "type": "string" + } + } + } + } + }, + "/__lbheartbeat__": { + "get": { + "description": "返回负载均衡器心跳状态", + "produces": [ + "text/plain" + ], + "tags": [ + "系统" + ], + "summary": "负载均衡心跳检查", + "responses": { + "200": { + "description": "Ready", + "schema": { + "type": "string" + } + } + } + } + }, + "/deepl": { + "post": { + "description": "兼容 DeepL API v2 的翻译接口", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "插件" + ], + "summary": "DeepL 翻译兼容接口", + "parameters": [ + { + "type": "string", + "description": "API Token", + "name": "token", + "in": "query" + }, + { + "description": "DeepL 翻译请求", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/handlers.DeeplTranslateRequest" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/handlers.DeeplTranslateResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + } + } + }, + "/google/language/translate/v2": { + "post": { + "description": "兼容 Google Translate API v2 的翻译接口", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "插件" + ], + "summary": "Google 翻译兼容接口", + "parameters": [ + { + "type": "string", + "description": "API Key", + "name": "key", + "in": "query" + }, + { + "description": "Google 翻译请求", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/handlers.GoogleTranslateRequest" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/handlers.GoogleTranslateResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + } + } + }, + "/google/translate_a/single": { + "get": { + "description": "兼容 Google translate_a/single 的翻译接口", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "插件" + ], + "summary": "Google translate_a/single 兼容接口", + "parameters": [ + { + "type": "string", + "default": "gtx", + "description": "客户端类型", + "name": "client", + "in": "query" + }, + { + "type": "string", + "example": "en", + "description": "源语言代码", + "name": "sl", + "in": "query", + "required": true + }, + { + "type": "string", + "example": "zh-CN", + "description": "目标语言代码", + "name": "tl", + "in": "query", + "required": true + }, + { + "type": "string", + "default": "t", + "description": "数据类型", + "name": "dt", + "in": "query" + }, + { + "type": "string", + "example": "Hello, world!", + "description": "待翻译文本", + "name": "q", + "in": "query", + "required": true + }, + { + "type": "string", + "description": "API Key", + "name": "key", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": {} + } + }, + "400": { + "description": "Bad Request", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + } + } + }, + "/hcfy": { + "post": { + "description": "兼容划词翻译自定义翻译源接口", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "插件" + ], + "summary": "划词翻译兼容接口", + "parameters": [ + { + "type": "string", + "description": "API Token", + "name": "token", + "in": "query" + }, + { + "description": "划词翻译请求", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/handlers.HcfyTranslateRequest" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/handlers.HcfyTranslateResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + } + } + }, + "/health": { + "get": { + "description": "检查服务是否正常运行", + "produces": [ + "application/json" + ], + "tags": [ + "系统" + ], + "summary": "健康检查", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + } + } + }, + "/imme": { + "post": { + "description": "为沉浸式翻译插件提供的翻译接口", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "插件" + ], + "summary": "沉浸式翻译插件接口", + "parameters": [ + { + "type": "string", + "description": "API Token", + "name": "token", + "in": "query" + }, + { + "description": "沉浸式翻译请求", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/handlers.ImmeTranslateRequest" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/handlers.ImmeTranslateResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + } + } + }, + "/kiss": { + "post": { + "description": "为简约翻译插件提供的单文本翻译接口", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "插件" + ], + "summary": "简约翻译插件接口(非聚合)", + "parameters": [ + { + "type": "string", + "description": "API Token", + "name": "KEY", + "in": "header" + }, + { + "description": "简约翻译请求", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/handlers.KissTranslateRequest" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/handlers.KissTranslateResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + } + } + }, + "/languages": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyQuery": [] + } + ], + "description": "返回所有支持的翻译语言代码", + "produces": [ + "application/json" + ], + "tags": [ + "翻译" + ], + "summary": "获取支持的语言列表", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + } + } + }, + "/translate": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyQuery": [] + } + ], + "description": "翻译单个文本", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "翻译" + ], + "summary": "单文本翻译", + "parameters": [ + { + "description": "翻译请求", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/handlers.TranslateRequest" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/handlers.TranslateResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + } + } + }, + "/translate/batch": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + }, + { + "ApiKeyQuery": [] + } + ], + "description": "批量翻译多个文本", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "翻译" + ], + "summary": "批量翻译", + "parameters": [ + { + "description": "批量翻译请求", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/handlers.TranslateBatchRequest" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/handlers.TranslateBatchResponse" + } + }, + "400": { + "description": "Bad Request", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + } + } + }, + "/version": { + "get": { + "description": "返回当前服务的版本号", + "produces": [ + "application/json" + ], + "tags": [ + "系统" + ], + "summary": "获取服务版本", + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + } + } + } + }, + "definitions": { + "handlers.DeeplTranslateRequest": { + "type": "object", + "required": [ + "target_lang", + "text" + ], + "properties": { + "context": { + "type": "string" + }, + "enable_beta_languages": { + "type": "boolean" + }, + "formality": { + "type": "string", + "example": "default" + }, + "glossary_id": { + "type": "string" + }, + "ignore_tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "model_type": { + "type": "string", + "example": "quality_optimized" + }, + "non_splitting_tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "outline_detection": { + "type": "string", + "example": "1" + }, + "preserve_formatting": { + "type": "string", + "example": "0" + }, + "source_lang": { + "type": "string", + "example": "EN" + }, + "split_sentences": { + "type": "string", + "example": "1" + }, + "splitting_tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "tag_handling": { + "type": "string", + "example": "xml" + }, + "target_lang": { + "type": "string", + "example": "DE" + }, + "text": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "Hello", + " world!" + ] + } + } + }, + "handlers.DeeplTranslateResponse": { + "type": "object", + "properties": { + "translations": { + "type": "array", + "items": { + "$ref": "#/definitions/handlers.DeeplTranslation" + } + } + } + }, + "handlers.DeeplTranslation": { + "type": "object", + "properties": { + "detected_source_language": { + "type": "string", + "example": "EN" + }, + "text": { + "type": "string", + "example": "Hallo, Welt!" + } + } + }, + "handlers.GoogleTranslateRequest": { + "type": "object", + "required": [ + "q", + "source", + "target" + ], + "properties": { + "format": { + "type": "string", + "example": "text" + }, + "q": { + "type": "string", + "example": "The Great Pyramid of Giza" + }, + "source": { + "type": "string", + "example": "en" + }, + "target": { + "type": "string", + "example": "zh-Hans" + } + } + }, + "handlers.GoogleTranslateResponse": { + "type": "object", + "properties": { + "data": { + "type": "object", + "properties": { + "translations": { + "type": "array", + "items": { + "type": "object", + "properties": { + "translatedText": { + "type": "string", + "example": "吉萨大金字塔" + } + } + } + } + } + } + } + }, + "handlers.HcfyDict": { + "type": "object", + "properties": { + "pos": { + "type": "string", + "example": "n." + }, + "terms": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "你好", + "问候" + ] + } + } + }, + "handlers.HcfyPhonetic": { + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "美" + }, + "ttsURI": { + "type": "string", + "example": "https://..." + }, + "value": { + "type": "string", + "example": "həˈloʊ" + } + } + }, + "handlers.HcfyTranslateRequest": { + "type": "object", + "required": [ + "destination", + "name", + "text" + ], + "properties": { + "destination": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "中文(简体)", + "英语" + ] + }, + "name": { + "type": "string", + "example": "翻译一" + }, + "source": { + "type": "string", + "example": "英语" + }, + "text": { + "type": "string", + "example": "Hello, word translation." + } + } + }, + "handlers.HcfyTranslateResponse": { + "type": "object", + "properties": { + "dict": { + "type": "array", + "items": { + "$ref": "#/definitions/handlers.HcfyDict" + } + }, + "from": { + "type": "string", + "example": "英语" + }, + "link": { + "type": "string", + "example": "https://..." + }, + "phonetic": { + "type": "array", + "items": { + "$ref": "#/definitions/handlers.HcfyPhonetic" + } + }, + "result": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "你好,划词翻译。" + ] + }, + "text": { + "type": "string", + "example": "Hello, word translation." + }, + "to": { + "type": "string", + "example": "中文(简体)" + }, + "ttsURI": { + "type": "string", + "example": "https://..." + } + } + }, + "handlers.ImmeTranslateRequest": { + "type": "object", + "required": [ + "source_lang", + "target_lang", + "text_list" + ], + "properties": { + "source_lang": { + "type": "string", + "example": "en" + }, + "target_lang": { + "type": "string", + "example": "zh-CN" + }, + "text_list": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "Hello", + " world!", + "Good morning!" + ] + } + } + }, + "handlers.ImmeTranslateResponse": { + "type": "object", + "properties": { + "translations": { + "type": "array", + "items": { + "$ref": "#/definitions/handlers.ImmeTranslation" + } + } + } + }, + "handlers.ImmeTranslation": { + "type": "object", + "properties": { + "detected_source_lang": { + "type": "string", + "example": "en" + }, + "text": { + "type": "string", + "example": "你好,世界!" + } + } + }, + "handlers.KissTranslateRequest": { + "type": "object", + "required": [ + "from", + "text", + "to" + ], + "properties": { + "from": { + "type": "string", + "example": "en" + }, + "text": { + "type": "string", + "example": "Hello, world!" + }, + "to": { + "type": "string", + "example": "zh-CN" + } + } + }, + "handlers.KissTranslateResponse": { + "type": "object", + "properties": { + "src": { + "type": "string", + "example": "en" + }, + "text": { + "type": "string", + "example": "你好,世界!" + } + } + }, + "handlers.TranslateBatchRequest": { + "type": "object", + "required": [ + "from", + "texts", + "to" + ], + "properties": { + "from": { + "type": "string", + "example": "en" + }, + "html": { + "type": "boolean", + "example": false + }, + "texts": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "Hello", + " world!", + "Good morning!" + ] + }, + "to": { + "type": "string", + "example": "zh-Hans" + } + } + }, + "handlers.TranslateBatchResponse": { + "type": "object", + "properties": { + "results": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "你好,世界!", + "早上好!" + ] + } + } + }, + "handlers.TranslateRequest": { + "type": "object", + "required": [ + "from", + "text", + "to" + ], + "properties": { + "from": { + "type": "string", + "example": "en" + }, + "html": { + "type": "boolean", + "example": false + }, + "text": { + "type": "string", + "example": "Hello, world!" + }, + "to": { + "type": "string", + "example": "zh-Hans" + } + } + }, + "handlers.TranslateResponse": { + "type": "object", + "properties": { + "result": { + "type": "string", + "example": "你好,世界!" + } + } + } + }, + "securityDefinitions": { + "ApiKeyAuth": { + "type": "apiKey", + "name": "Authorization", + "in": "header" + }, + "ApiKeyQuery": { + "type": "apiKey", + "name": "token", + "in": "query" + } + } +} \ No newline at end of file diff --git a/src/mtran/vendor/mtranserver/deprecated/go/internal/docs/swagger.yaml b/src/mtran/vendor/mtranserver/deprecated/go/internal/docs/swagger.yaml new file mode 100644 index 0000000..afb7120 --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/go/internal/docs/swagger.yaml @@ -0,0 +1,773 @@ +basePath: / +definitions: + handlers.DeeplTranslateRequest: + properties: + context: + type: string + enable_beta_languages: + type: boolean + formality: + example: default + type: string + glossary_id: + type: string + ignore_tags: + items: + type: string + type: array + model_type: + example: quality_optimized + type: string + non_splitting_tags: + items: + type: string + type: array + outline_detection: + example: "1" + type: string + preserve_formatting: + example: "0" + type: string + source_lang: + example: EN + type: string + split_sentences: + example: "1" + type: string + splitting_tags: + items: + type: string + type: array + tag_handling: + example: xml + type: string + target_lang: + example: DE + type: string + text: + example: + - Hello + - ' world!' + items: + type: string + type: array + required: + - target_lang + - text + type: object + handlers.DeeplTranslateResponse: + properties: + translations: + items: + $ref: '#/definitions/handlers.DeeplTranslation' + type: array + type: object + handlers.DeeplTranslation: + properties: + detected_source_language: + example: EN + type: string + text: + example: Hallo, Welt! + type: string + type: object + handlers.GoogleTranslateRequest: + properties: + format: + example: text + type: string + q: + example: The Great Pyramid of Giza + type: string + source: + example: en + type: string + target: + example: zh-Hans + type: string + required: + - q + - source + - target + type: object + handlers.GoogleTranslateResponse: + properties: + data: + properties: + translations: + items: + properties: + translatedText: + example: 吉萨大金字塔 + type: string + type: object + type: array + type: object + type: object + handlers.HcfyDict: + properties: + pos: + example: n. + type: string + terms: + example: + - 你好 + - 问候 + items: + type: string + type: array + type: object + handlers.HcfyPhonetic: + properties: + name: + example: 美 + type: string + ttsURI: + example: https://... + type: string + value: + example: həˈloʊ + type: string + type: object + handlers.HcfyTranslateRequest: + properties: + destination: + example: + - 中文(简体) + - 英语 + items: + type: string + type: array + name: + example: 翻译一 + type: string + source: + example: 英语 + type: string + text: + example: Hello, word translation. + type: string + required: + - destination + - name + - text + type: object + handlers.HcfyTranslateResponse: + properties: + dict: + items: + $ref: '#/definitions/handlers.HcfyDict' + type: array + from: + example: 英语 + type: string + link: + example: https://... + type: string + phonetic: + items: + $ref: '#/definitions/handlers.HcfyPhonetic' + type: array + result: + example: + - 你好,划词翻译。 + items: + type: string + type: array + text: + example: Hello, word translation. + type: string + to: + example: 中文(简体) + type: string + ttsURI: + example: https://... + type: string + type: object + handlers.ImmeTranslateRequest: + properties: + source_lang: + example: en + type: string + target_lang: + example: zh-CN + type: string + text_list: + example: + - Hello + - ' world!' + - Good morning! + items: + type: string + type: array + required: + - source_lang + - target_lang + - text_list + type: object + handlers.ImmeTranslateResponse: + properties: + translations: + items: + $ref: '#/definitions/handlers.ImmeTranslation' + type: array + type: object + handlers.ImmeTranslation: + properties: + detected_source_lang: + example: en + type: string + text: + example: 你好,世界! + type: string + type: object + handlers.KissTranslateRequest: + properties: + from: + example: en + type: string + text: + example: Hello, world! + type: string + to: + example: zh-CN + type: string + required: + - from + - text + - to + type: object + handlers.KissTranslateResponse: + properties: + src: + example: en + type: string + text: + example: 你好,世界! + type: string + type: object + handlers.TranslateBatchRequest: + properties: + from: + example: en + type: string + html: + example: false + type: boolean + texts: + example: + - Hello + - ' world!' + - Good morning! + items: + type: string + type: array + to: + example: zh-Hans + type: string + required: + - from + - texts + - to + type: object + handlers.TranslateBatchResponse: + properties: + results: + example: + - 你好,世界! + - 早上好! + items: + type: string + type: array + type: object + handlers.TranslateRequest: + properties: + from: + example: en + type: string + html: + example: false + type: boolean + text: + example: Hello, world! + type: string + to: + example: zh-Hans + type: string + required: + - from + - text + - to + type: object + handlers.TranslateResponse: + properties: + result: + example: 你好,世界! + type: string + type: object +host: localhost:8989 +info: + contact: + name: API Support + url: https://github.com/xxnuo/MTranServer/issues + description: 超低资源消耗超快的离线翻译服务器 API + license: + name: Apache 2.0 + url: https://github.com/xxnuo/MTranServer/blob/main/LICENSE + termsOfService: https://github.com/xxnuo/MTranServer + title: MTranServer API + version: 3.0.0 +paths: + /__heartbeat__: + get: + description: 返回服务状态 + produces: + - text/plain + responses: + "200": + description: Ready + schema: + type: string + summary: 心跳检查 + tags: + - 系统 + /__lbheartbeat__: + get: + description: 返回负载均衡器心跳状态 + produces: + - text/plain + responses: + "200": + description: Ready + schema: + type: string + summary: 负载均衡心跳检查 + tags: + - 系统 + /deepl: + post: + consumes: + - application/json + description: 兼容 DeepL API v2 的翻译接口 + parameters: + - description: API Token + in: query + name: token + type: string + - description: DeepL 翻译请求 + in: body + name: request + required: true + schema: + $ref: '#/definitions/handlers.DeeplTranslateRequest' + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/handlers.DeeplTranslateResponse' + "400": + description: Bad Request + schema: + additionalProperties: + type: string + type: object + "401": + description: Unauthorized + schema: + additionalProperties: + type: string + type: object + "500": + description: Internal Server Error + schema: + additionalProperties: + type: string + type: object + summary: DeepL 翻译兼容接口 + tags: + - 插件 + /google/language/translate/v2: + post: + consumes: + - application/json + description: 兼容 Google Translate API v2 的翻译接口 + parameters: + - description: API Key + in: query + name: key + type: string + - description: Google 翻译请求 + in: body + name: request + required: true + schema: + $ref: '#/definitions/handlers.GoogleTranslateRequest' + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/handlers.GoogleTranslateResponse' + "400": + description: Bad Request + schema: + additionalProperties: + type: string + type: object + "401": + description: Unauthorized + schema: + additionalProperties: + type: string + type: object + "500": + description: Internal Server Error + schema: + additionalProperties: + type: string + type: object + summary: Google 翻译兼容接口 + tags: + - 插件 + /google/translate_a/single: + get: + consumes: + - application/json + description: 兼容 Google translate_a/single 的翻译接口 + parameters: + - default: gtx + description: 客户端类型 + in: query + name: client + type: string + - description: 源语言代码 + example: en + in: query + name: sl + required: true + type: string + - description: 目标语言代码 + example: zh-CN + in: query + name: tl + required: true + type: string + - default: t + description: 数据类型 + in: query + name: dt + type: string + - description: 待翻译文本 + example: Hello, world! + in: query + name: q + required: true + type: string + - description: API Key + in: query + name: key + type: string + produces: + - application/json + responses: + "200": + description: OK + schema: + items: {} + type: array + "400": + description: Bad Request + schema: + additionalProperties: + type: string + type: object + "401": + description: Unauthorized + schema: + additionalProperties: + type: string + type: object + "500": + description: Internal Server Error + schema: + additionalProperties: + type: string + type: object + summary: Google translate_a/single 兼容接口 + tags: + - 插件 + /hcfy: + post: + consumes: + - application/json + description: 兼容划词翻译自定义翻译源接口 + parameters: + - description: API Token + in: query + name: token + type: string + - description: 划词翻译请求 + in: body + name: request + required: true + schema: + $ref: '#/definitions/handlers.HcfyTranslateRequest' + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/handlers.HcfyTranslateResponse' + "400": + description: Bad Request + schema: + additionalProperties: + type: string + type: object + "401": + description: Unauthorized + schema: + additionalProperties: + type: string + type: object + "500": + description: Internal Server Error + schema: + additionalProperties: + type: string + type: object + summary: 划词翻译兼容接口 + tags: + - 插件 + /health: + get: + description: 检查服务是否正常运行 + produces: + - application/json + responses: + "200": + description: OK + schema: + additionalProperties: + type: string + type: object + summary: 健康检查 + tags: + - 系统 + /imme: + post: + consumes: + - application/json + description: 为沉浸式翻译插件提供的翻译接口 + parameters: + - description: API Token + in: query + name: token + type: string + - description: 沉浸式翻译请求 + in: body + name: request + required: true + schema: + $ref: '#/definitions/handlers.ImmeTranslateRequest' + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/handlers.ImmeTranslateResponse' + "400": + description: Bad Request + schema: + additionalProperties: + type: string + type: object + "401": + description: Unauthorized + schema: + additionalProperties: + type: string + type: object + "500": + description: Internal Server Error + schema: + additionalProperties: + type: string + type: object + summary: 沉浸式翻译插件接口 + tags: + - 插件 + /kiss: + post: + consumes: + - application/json + description: 为简约翻译插件提供的单文本翻译接口 + parameters: + - description: API Token + in: header + name: KEY + type: string + - description: 简约翻译请求 + in: body + name: request + required: true + schema: + $ref: '#/definitions/handlers.KissTranslateRequest' + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/handlers.KissTranslateResponse' + "400": + description: Bad Request + schema: + additionalProperties: + type: string + type: object + "401": + description: Unauthorized + schema: + additionalProperties: + type: string + type: object + "500": + description: Internal Server Error + schema: + additionalProperties: + type: string + type: object + summary: 简约翻译插件接口(非聚合) + tags: + - 插件 + /languages: + get: + description: 返回所有支持的翻译语言代码 + produces: + - application/json + responses: + "200": + description: OK + schema: + additionalProperties: + items: + type: string + type: array + type: object + "500": + description: Internal Server Error + schema: + additionalProperties: + type: string + type: object + security: + - ApiKeyAuth: [] + - ApiKeyQuery: [] + summary: 获取支持的语言列表 + tags: + - 翻译 + /translate: + post: + consumes: + - application/json + description: 翻译单个文本 + parameters: + - description: 翻译请求 + in: body + name: request + required: true + schema: + $ref: '#/definitions/handlers.TranslateRequest' + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/handlers.TranslateResponse' + "400": + description: Bad Request + schema: + additionalProperties: + type: string + type: object + "500": + description: Internal Server Error + schema: + additionalProperties: + type: string + type: object + security: + - ApiKeyAuth: [] + - ApiKeyQuery: [] + summary: 单文本翻译 + tags: + - 翻译 + /translate/batch: + post: + consumes: + - application/json + description: 批量翻译多个文本 + parameters: + - description: 批量翻译请求 + in: body + name: request + required: true + schema: + $ref: '#/definitions/handlers.TranslateBatchRequest' + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/handlers.TranslateBatchResponse' + "400": + description: Bad Request + schema: + additionalProperties: + type: string + type: object + "500": + description: Internal Server Error + schema: + additionalProperties: + type: string + type: object + security: + - ApiKeyAuth: [] + - ApiKeyQuery: [] + summary: 批量翻译 + tags: + - 翻译 + /version: + get: + description: 返回当前服务的版本号 + produces: + - application/json + responses: + "200": + description: OK + schema: + additionalProperties: + type: string + type: object + summary: 获取服务版本 + tags: + - 系统 +securityDefinitions: + ApiKeyAuth: + in: header + name: Authorization + type: apiKey + ApiKeyQuery: + in: query + name: token + type: apiKey +swagger: "2.0" diff --git a/src/mtran/vendor/mtranserver/deprecated/go/internal/downloader/downloader.go b/src/mtran/vendor/mtranserver/deprecated/go/internal/downloader/downloader.go new file mode 100644 index 0000000..2704e16 --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/go/internal/downloader/downloader.go @@ -0,0 +1,171 @@ +package downloader + +import ( + "context" + "crypto/tls" + "fmt" + "net/http" + "net/url" + "os" + "path/filepath" + "time" + + "github.com/hashicorp/go-getter" + "github.com/xxnuo/MTranServer/internal/logger" + "github.com/xxnuo/MTranServer/internal/utils" +) + +type Downloader struct { + DestDir string + + ProgressFunc getter.ProgressTracker +} + +type DownloadOptions struct { + SHA256 string + + Overwrite bool + + Context context.Context +} + +func New(destDir string) *Downloader { + return &Downloader{ + DestDir: destDir, + } +} + +func (d *Downloader) SetProgressFunc(fn getter.ProgressTracker) { + d.ProgressFunc = fn +} + +func (d *Downloader) Download(urlStr, filename string, opts *DownloadOptions) error { + if opts == nil { + opts = &DownloadOptions{ + Context: context.Background(), + } + } + if opts.Context == nil { + opts.Context = context.Background() + } + + if err := os.MkdirAll(d.DestDir, 0755); err != nil { + return fmt.Errorf("Failed to create directory: %w", err) + } + + dst := filepath.Join(d.DestDir, filename) + + if !opts.Overwrite { + if _, err := os.Stat(dst); err == nil { + + if opts.SHA256 != "" { + if err := utils.VerifySHA256(dst, opts.SHA256); err == nil { + + logger.Debug("File %s already exists and verified, skipping download", filename) + return nil + } + } + } + } + + logger.Info("Downloading %s from %s", filename, urlStr) + + tmpFile := dst + ".tmp" + defer os.Remove(tmpFile) + + httpClient := &http.Client{ + Timeout: 30 * time.Minute, + CheckRedirect: func(req *http.Request, via []*http.Request) error { + + if len(via) >= 10 { + return fmt.Errorf("stopped after 10 redirects") + } + return nil + }, + } + + transport := &http.Transport{ + TLSClientConfig: &tls.Config{InsecureSkipVerify: false}, + } + + if proxyURL := os.Getenv("HTTP_PROXY"); proxyURL != "" { + if parsedURL, err := url.Parse(proxyURL); err == nil { + transport.Proxy = http.ProxyURL(parsedURL) + } + } else if proxyURL := os.Getenv("http_proxy"); proxyURL != "" { + if parsedURL, err := url.Parse(proxyURL); err == nil { + transport.Proxy = http.ProxyURL(parsedURL) + } + } + + if proxyURL := os.Getenv("HTTPS_PROXY"); proxyURL != "" { + if parsedURL, err := url.Parse(proxyURL); err == nil { + transport.Proxy = http.ProxyURL(parsedURL) + } + } else if proxyURL := os.Getenv("https_proxy"); proxyURL != "" { + if parsedURL, err := url.Parse(proxyURL); err == nil { + transport.Proxy = http.ProxyURL(parsedURL) + } + } + + httpClient.Transport = transport + + httpGetter := &getter.HttpGetter{ + Client: httpClient, + } + + clientOpts := []getter.ClientOption{ + getter.WithContext(opts.Context), + getter.WithGetters(map[string]getter.Getter{ + "http": httpGetter, + "https": httpGetter, + }), + getter.WithDecompressors(map[string]getter.Decompressor{}), + } + + if d.ProgressFunc != nil { + clientOpts = append(clientOpts, getter.WithProgress(d.ProgressFunc)) + } + + client := &getter.Client{ + Src: urlStr, + Dst: tmpFile, + Mode: getter.ClientModeFile, + } + + if err := client.Configure(clientOpts...); err != nil { + return fmt.Errorf("Failed to configure downloader: %w", err) + } + + if err := client.Get(); err != nil { + return fmt.Errorf("Failed to download: %w", err) + } + + logger.Debug("Download completed: %s", filename) + + if opts.SHA256 != "" { + logger.Debug("Verifying SHA256 for %s", filename) + if err := utils.VerifySHA256(tmpFile, opts.SHA256); err != nil { + return fmt.Errorf("Failed to verify SHA256: %w", err) + } + logger.Debug("SHA256 verification passed for %s", filename) + } + + if err := os.Rename(tmpFile, dst); err != nil { + return fmt.Errorf("Failed to move file: %w", err) + } + + logger.Info("Successfully downloaded: %s", filename) + return nil +} + +func DownloadFile(url, destPath, sha256sum string) error { + dir := filepath.Dir(destPath) + filename := filepath.Base(destPath) + + d := New(dir) + return d.Download(url, filename, &DownloadOptions{ + SHA256: sha256sum, + Context: context.Background(), + }) +} diff --git a/src/mtran/vendor/mtranserver/deprecated/go/internal/downloader/downloader_test.go b/src/mtran/vendor/mtranserver/deprecated/go/internal/downloader/downloader_test.go new file mode 100644 index 0000000..11aa8a0 --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/go/internal/downloader/downloader_test.go @@ -0,0 +1,231 @@ +package downloader + +import ( + "context" + "net/http" + "net/http/httptest" + "os" + "path/filepath" + "testing" + "time" +) + +func TestDownload(t *testing.T) { + + testContent := []byte("Hello, World!") + expectedSHA256 := "dffd6021bb2bd5b0af676290809ec3a53191dd81c7f70a4b28688a362182986f" + + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Write(testContent) + })) + defer server.Close() + + tempDir, err := os.MkdirTemp("", "downloader-test-*") + if err != nil { + t.Fatal(err) + } + defer os.RemoveAll(tempDir) + + d := New(tempDir) + err = d.Download(server.URL, "test.txt", &DownloadOptions{ + SHA256: expectedSHA256, + Context: context.Background(), + }) + + if err != nil { + t.Fatalf("下载失败: %v", err) + } + + filePath := filepath.Join(tempDir, "test.txt") + if _, err := os.Stat(filePath); os.IsNotExist(err) { + t.Fatal("文件不存在") + } + + content, err := os.ReadFile(filePath) + if err != nil { + t.Fatal(err) + } + + if string(content) != string(testContent) { + t.Fatalf("文件内容不匹配: 期望 %s, 实际 %s", testContent, content) + } +} + +func TestDownloadWithWrongSHA256(t *testing.T) { + + testContent := []byte("Hello, World!") + + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Write(testContent) + })) + defer server.Close() + + tempDir, err := os.MkdirTemp("", "downloader-test-*") + if err != nil { + t.Fatal(err) + } + defer os.RemoveAll(tempDir) + + d := New(tempDir) + err = d.Download(server.URL, "test.txt", &DownloadOptions{ + SHA256: "0000000000000000000000000000000000000000000000000000000000000000", + Context: context.Background(), + }) + + if err == nil { + t.Fatal("应该返回 SHA256 校验失败错误") + } +} + +func TestDownloadSkipExisting(t *testing.T) { + + testContent := []byte("Hello, World!") + expectedSHA256 := "dffd6021bb2bd5b0af676290809ec3a53191dd81c7f70a4b28688a362182986f" + requestCount := 0 + + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + requestCount++ + w.Write(testContent) + })) + defer server.Close() + + tempDir, err := os.MkdirTemp("", "downloader-test-*") + if err != nil { + t.Fatal(err) + } + defer os.RemoveAll(tempDir) + + d := New(tempDir) + err = d.Download(server.URL, "test.txt", &DownloadOptions{ + SHA256: expectedSHA256, + Context: context.Background(), + }) + + if err != nil { + t.Fatalf("第一次下载失败: %v", err) + } + + firstRequestCount := requestCount + + err = d.Download(server.URL, "test.txt", &DownloadOptions{ + SHA256: expectedSHA256, + Context: context.Background(), + }) + + if err != nil { + t.Fatalf("第二次下载失败: %v", err) + } + + if requestCount != firstRequestCount { + t.Fatalf("期望 %d 次请求(第二次应跳过), 实际 %d 次", firstRequestCount, requestCount) + } +} + +func TestDownloadWithOverwrite(t *testing.T) { + + testContent := []byte("Hello, World!") + expectedSHA256 := "dffd6021bb2bd5b0af676290809ec3a53191dd81c7f70a4b28688a362182986f" + requestCount := 0 + + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + requestCount++ + w.Write(testContent) + })) + defer server.Close() + + tempDir, err := os.MkdirTemp("", "downloader-test-*") + if err != nil { + t.Fatal(err) + } + defer os.RemoveAll(tempDir) + + d := New(tempDir) + err = d.Download(server.URL, "test.txt", &DownloadOptions{ + SHA256: expectedSHA256, + Context: context.Background(), + }) + + if err != nil { + t.Fatalf("第一次下载失败: %v", err) + } + + firstRequestCount := requestCount + + err = d.Download(server.URL, "test.txt", &DownloadOptions{ + SHA256: expectedSHA256, + Overwrite: true, + Context: context.Background(), + }) + + if err != nil { + t.Fatalf("第二次下载失败: %v", err) + } + + if requestCount <= firstRequestCount { + t.Fatalf("期望至少 %d 次请求, 实际 %d 次", firstRequestCount+1, requestCount) + } +} + +func TestDownloadWithContext(t *testing.T) { + + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + time.Sleep(2 * time.Second) + w.Write([]byte("Hello, World!")) + })) + defer server.Close() + + tempDir, err := os.MkdirTemp("", "downloader-test-*") + if err != nil { + t.Fatal(err) + } + defer os.RemoveAll(tempDir) + + ctx, cancel := context.WithTimeout(context.Background(), 500*time.Millisecond) + defer cancel() + + d := New(tempDir) + err = d.Download(server.URL, "test.txt", &DownloadOptions{ + Context: ctx, + }) + + if err == nil { + t.Fatal("应该返回超时错误") + } +} + +func TestDownloadFile(t *testing.T) { + + testContent := []byte("Hello, World!") + expectedSHA256 := "dffd6021bb2bd5b0af676290809ec3a53191dd81c7f70a4b28688a362182986f" + + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Write(testContent) + })) + defer server.Close() + + tempDir, err := os.MkdirTemp("", "downloader-test-*") + if err != nil { + t.Fatal(err) + } + defer os.RemoveAll(tempDir) + + destPath := filepath.Join(tempDir, "test.txt") + err = DownloadFile(server.URL, destPath, expectedSHA256) + + if err != nil { + t.Fatalf("下载失败: %v", err) + } + + if _, err := os.Stat(destPath); os.IsNotExist(err) { + t.Fatal("文件不存在") + } + + content, err := os.ReadFile(destPath) + if err != nil { + t.Fatal(err) + } + + if string(content) != string(testContent) { + t.Fatalf("文件内容不匹配: 期望 %s, 实际 %s", testContent, content) + } +} diff --git a/src/mtran/vendor/mtranserver/deprecated/go/internal/handlers/deepl.go b/src/mtran/vendor/mtranserver/deprecated/go/internal/handlers/deepl.go new file mode 100644 index 0000000..3db5594 --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/go/internal/handlers/deepl.go @@ -0,0 +1,141 @@ +package handlers + +import ( + "context" + "fmt" + "net/http" + "strings" + "time" + + "github.com/gin-gonic/gin" + "github.com/xxnuo/MTranServer/internal/services" + "github.com/xxnuo/MTranServer/internal/utils" +) + +var bcp47ToDeeplLang = map[string]string{ + "no": "NB", + "zh-Hans": "ZH", + "zh-CN": "ZH-CN", + "zh-Hant": "ZH-TW", + "zh-TW": "ZH-TW", +} + +func convertBCP47ToDeeplLang(bcp47Lang string) string { + if deeplLang, ok := bcp47ToDeeplLang[bcp47Lang]; ok { + return deeplLang + } + + return strings.ToUpper(bcp47Lang) +} + +type DeeplTranslateRequest struct { + Text []string `json:"text" binding:"required" example:"Hello, world!"` + SourceLang string `json:"source_lang,omitempty" example:"EN"` + TargetLang string `json:"target_lang" binding:"required" example:"DE"` + SplitSentences string `json:"split_sentences,omitempty" example:"1"` + PreserveFormatting string `json:"preserve_formatting,omitempty" example:"0"` + Formality string `json:"formality,omitempty" example:"default"` + GlossaryID string `json:"glossary_id,omitempty"` + TagHandling string `json:"tag_handling,omitempty" example:"xml"` + OutlineDetection string `json:"outline_detection,omitempty" example:"1"` + NonSplittingTags []string `json:"non_splitting_tags,omitempty"` + SplittingTags []string `json:"splitting_tags,omitempty"` + IgnoreTags []string `json:"ignore_tags,omitempty"` + ModelType string `json:"model_type,omitempty" example:"quality_optimized"` + Context string `json:"context,omitempty"` + EnableBetaLanguages bool `json:"enable_beta_languages,omitempty"` +} + +type DeeplTranslation struct { + DetectedSourceLanguage string `json:"detected_source_language" example:"EN"` + Text string `json:"text" example:"Hallo, Welt!"` +} + +type DeeplTranslateResponse struct { + Translations []DeeplTranslation `json:"translations"` +} + +// HandleDeeplTranslate DeepL 翻译兼容接口 +// @Summary DeepL 翻译兼容接口 +// @Description 兼容 DeepL API v2 的翻译接口 +// @Tags 插件 +// @Accept json +// @Produce json +// @Param token query string false "API Token" +// @Param request body DeeplTranslateRequest true "DeepL 翻译请求" +// @Success 200 {object} DeeplTranslateResponse +// @Failure 400 {object} map[string]string +// @Failure 401 {object} map[string]string +// @Failure 500 {object} map[string]string +// @Router /deepl [post] +func HandleDeeplTranslate(apiToken string) gin.HandlerFunc { + return func(c *gin.Context) { + + if apiToken != "" { + + authHeader := c.GetHeader("Authorization") + token := "" + + if strings.HasPrefix(authHeader, "DeepL-Auth-Key ") { + token = strings.TrimPrefix(authHeader, "DeepL-Auth-Key ") + } else if authHeader != "" { + + token = strings.TrimPrefix(authHeader, "Bearer ") + } else { + + token = c.Query("token") + } + + if token != apiToken { + c.JSON(http.StatusUnauthorized, gin.H{ + "error": "Unauthorized", + }) + return + } + } + var req DeeplTranslateRequest + + if err := c.ShouldBindJSON(&req); err != nil { + c.JSON(http.StatusBadRequest, gin.H{ + "error": err.Error(), + }) + return + } + + sourceLang := "auto" + if req.SourceLang != "" { + sourceLang = utils.NormalizeLanguageCode(req.SourceLang) + } + targetLang := utils.NormalizeLanguageCode(req.TargetLang) + + translations := make([]DeeplTranslation, len(req.Text)) + ctx, cancel := context.WithTimeout(c.Request.Context(), 120*time.Second) + defer cancel() + + isHTML := req.TagHandling == "html" || req.TagHandling == "xml" + + for i, text := range req.Text { + result, err := services.TranslateWithPivot(ctx, sourceLang, targetLang, text, isHTML) + if err != nil { + c.JSON(http.StatusInternalServerError, gin.H{ + "error": fmt.Sprintf("Translation failed at index %d: %v", i, err), + }) + return + } + + detectedLang := req.SourceLang + if detectedLang == "" { + detectedLang = convertBCP47ToDeeplLang(sourceLang) + } + + translations[i] = DeeplTranslation{ + DetectedSourceLanguage: detectedLang, + Text: result, + } + } + + c.JSON(http.StatusOK, DeeplTranslateResponse{ + Translations: translations, + }) + } +} diff --git a/src/mtran/vendor/mtranserver/deprecated/go/internal/handlers/google.go b/src/mtran/vendor/mtranserver/deprecated/go/internal/handlers/google.go new file mode 100644 index 0000000..5bbede1 --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/go/internal/handlers/google.go @@ -0,0 +1,211 @@ +package handlers + +import ( + "context" + "fmt" + "net/http" + "strings" + "time" + + "github.com/gin-gonic/gin" + "github.com/xxnuo/MTranServer/internal/services" + "github.com/xxnuo/MTranServer/internal/utils" +) + +var bcp47ToGoogleLang = map[string]string{ + "zh-Hans": "zh-CN", + "zh-Hant": "zh-TW", +} + +func convertBCP47ToGoogleLang(bcp47Lang string) string { + if googleLang, ok := bcp47ToGoogleLang[bcp47Lang]; ok { + return googleLang + } + + return bcp47Lang +} + +type GoogleTranslateRequest struct { + Q string `json:"q" binding:"required" example:"The Great Pyramid of Giza"` + Source string `json:"source" binding:"required" example:"en"` + Target string `json:"target" binding:"required" example:"zh-Hans"` + Format string `json:"format" example:"text"` +} + +type GoogleTranslateResponse struct { + Data struct { + Translations []struct { + TranslatedText string `json:"translatedText" example:"吉萨大金字塔"` + } `json:"translations"` + } `json:"data"` +} + +// HandleGoogleCompatTranslate Google 翻译兼容接口 +// @Summary Google 翻译兼容接口 +// @Description 兼容 Google Translate API v2 的翻译接口 +// @Tags 插件 +// @Accept json +// @Produce json +// @Param key query string false "API Key" +// @Param request body GoogleTranslateRequest true "Google 翻译请求" +// @Success 200 {object} GoogleTranslateResponse +// @Failure 400 {object} map[string]string +// @Failure 401 {object} map[string]string +// @Failure 500 {object} map[string]string +// @Router /google/language/translate/v2 [post] +func HandleGoogleCompatTranslate(apiToken string) gin.HandlerFunc { + return func(c *gin.Context) { + + if apiToken != "" { + + token := c.Query("key") + + if token == "" { + authHeader := c.GetHeader("Authorization") + if strings.HasPrefix(authHeader, "Bearer ") { + token = strings.TrimPrefix(authHeader, "Bearer ") + } else if authHeader != "" { + token = authHeader + } + } + + if token == "" { + token = c.Query("token") + } + + if token != apiToken { + c.JSON(http.StatusUnauthorized, gin.H{ + "error": "Unauthorized", + }) + return + } + } + + var req GoogleTranslateRequest + + if err := c.ShouldBindJSON(&req); err != nil { + c.JSON(http.StatusBadRequest, gin.H{ + "error": err.Error(), + }) + return + } + + sourceBCP47 := utils.NormalizeLanguageCode(req.Source) + targetBCP47 := utils.NormalizeLanguageCode(req.Target) + + ctx, cancel := context.WithTimeout(c.Request.Context(), 60*time.Second) + defer cancel() + + isHTML := req.Format == "html" + result, err := services.TranslateWithPivot(ctx, sourceBCP47, targetBCP47, req.Q, isHTML) + if err != nil { + c.JSON(http.StatusInternalServerError, gin.H{ + "error": fmt.Sprintf("Translation failed: %v", err), + }) + return + } + + c.JSON(http.StatusOK, gin.H{ + "data": gin.H{ + "translations": []gin.H{ + { + "translatedText": result, + }, + }, + }, + }) + } +} + +// HandleGoogleTranslateSingle Google translate_a/single 兼容接口 +// @Summary Google translate_a/single 兼容接口 +// @Description 兼容 Google translate_a/single 的翻译接口 +// @Tags 插件 +// @Accept json +// @Produce json +// @Param client query string false "客户端类型" default(gtx) +// @Param sl query string true "源语言代码" example(en) +// @Param tl query string true "目标语言代码" example(zh-CN) +// @Param dt query string false "数据类型" default(t) +// @Param q query string true "待翻译文本" example(Hello, world!) +// @Param key query string false "API Key" +// @Success 200 {array} interface{} +// @Failure 400 {object} map[string]string +// @Failure 401 {object} map[string]string +// @Failure 500 {object} map[string]string +// @Router /google/translate_a/single [get] +func HandleGoogleTranslateSingle(apiToken string) gin.HandlerFunc { + return func(c *gin.Context) { + + if apiToken != "" { + token := c.Query("key") + + if token == "" { + authHeader := c.GetHeader("Authorization") + if strings.HasPrefix(authHeader, "Bearer ") { + token = strings.TrimPrefix(authHeader, "Bearer ") + } else if authHeader != "" { + token = authHeader + } + } + + if token == "" { + token = c.Query("token") + } + + if token != apiToken { + c.JSON(http.StatusUnauthorized, gin.H{ + "error": "Unauthorized", + }) + return + } + } + + sl := c.Query("sl") + tl := c.Query("tl") + q := c.Query("q") + + if tl == "" || q == "" { + c.JSON(http.StatusBadRequest, gin.H{ + "error": "Missing required parameters: tl, q", + }) + return + } + + if sl == "" { + sl = "auto" + } + + text := q + + sourceBCP47 := utils.NormalizeLanguageCode(sl) + targetBCP47 := utils.NormalizeLanguageCode(tl) + + ctx, cancel := context.WithTimeout(c.Request.Context(), 60*time.Second) + defer cancel() + + result, err := services.TranslateWithPivot(ctx, sourceBCP47, targetBCP47, text, false) + if err != nil { + c.JSON(http.StatusInternalServerError, gin.H{ + "error": fmt.Sprintf("Translation failed: %v", err), + }) + return + } + + detectedLang := convertBCP47ToGoogleLang(sourceBCP47) + response := []interface{}{ + []interface{}{ + []interface{}{result, text, nil, nil, 1}, + }, + nil, + detectedLang, + nil, + nil, + nil, + nil, + []interface{}{}, + } + + c.JSON(http.StatusOK, response) + } +} diff --git a/src/mtran/vendor/mtranserver/deprecated/go/internal/handlers/hcfy.go b/src/mtran/vendor/mtranserver/deprecated/go/internal/handlers/hcfy.go new file mode 100644 index 0000000..cf3fd28 --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/go/internal/handlers/hcfy.go @@ -0,0 +1,412 @@ +package handlers + +import ( + "context" + "fmt" + "net/http" + "strings" + "time" + + "github.com/gin-gonic/gin" + "github.com/xxnuo/MTranServer/internal/services" +) + +var hcfyLangToBCP47 = map[string]string{ + "中文(简体)": "zh-Hans", + "中文(繁体)": "zh-Hant", + "英语": "en", + "日语": "ja", + "韩语": "ko", + "法语": "fr", + "德语": "de", + "西班牙语": "es", + "俄语": "ru", + "意大利语": "it", + "葡萄牙语": "pt", + "阿拉伯语": "ar", + "荷兰语": "nl", + "波兰语": "pl", + "土耳其语": "tr", + "泰语": "th", + "越南语": "vi", + "印尼语": "id", + "马来语": "ms", + "希腊语": "el", + "捷克语": "cs", + "丹麦语": "da", + "芬兰语": "fi", + "匈牙利语": "hu", + "挪威语": "no", + "罗马尼亚语": "ro", + "瑞典语": "sv", + "乌克兰语": "uk", + "保加利亚语": "bg", + "爱沙尼亚语": "et", + "拉脱维亚语": "lv", + "立陶宛语": "lt", + "斯洛伐克语": "sk", + "斯洛文尼亚语": "sl", + "印地语": "hi", + "孟加拉语": "bn", + "旁遮普语": "pa", + "泰米尔语": "ta", + "泰卢固语": "te", + "马拉地语": "mr", + "古吉拉特语": "gu", + "卡纳达语": "kn", + "马拉雅拉姆语": "ml", + "僧伽罗语": "si", + "尼泊尔语": "ne", + "缅甸语": "my", + "高棉语": "km", + "老挝语": "lo", + "波斯语": "fa", + "希伯来语": "he", + "乌尔都语": "ur", + "斯瓦希里语": "sw", + "南非荷兰语": "af", + "冰岛语": "is", + "塞尔维亚语": "sr", + "克罗地亚语": "hr", + "波斯尼亚语": "bs", + "马其顿语": "mk", + "阿尔巴尼亚语": "sq", + "亚美尼亚语": "hy", + "格鲁吉亚语": "ka", + "阿塞拜疆语": "az", + "哈萨克语": "kk", + "乌兹别克语": "uz", + "蒙古语": "mn", + "藏语": "bo", + "维吾尔语": "ug", + "菲律宾语": "fil", + "世界语": "eo", + "拉丁语": "la", + "加泰罗尼亚语": "ca", + "巴斯克语": "eu", + "加利西亚语": "gl", + "威尔士语": "cy", + "爱尔兰语": "ga", + "苏格兰盖尔语": "gd", + "马耳他语": "mt", + "卢森堡语": "lb", + "弗里西语": "fy", + "白俄罗斯语": "be", + "塔吉克语": "tg", + "吉尔吉斯语": "ky", + "土库曼语": "tk", + "普什图语": "ps", + "库尔德语": "ku", + "信德语": "sd", + "宿务语": "ceb", + "伊博语": "ig", + "约鲁巴语": "yo", + "祖鲁语": "zu", + "科萨语": "xh", + "索马里语": "so", + "豪萨语": "ha", + "阿姆哈拉语": "am", + "奥里亚语": "or", + "阿萨姆语": "as", + "迈蒂利语": "mai", + "桑塔利语": "sat", + "梵语": "sa", + "克什米尔语": "ks", + "多格拉语": "doi", + "孔卡尼语": "kok", + "曼尼普尔语": "mni", + "博多语": "brx", +} + +var bcp47ToHcfyLang = map[string]string{ + "zh-Hans": "中文(简体)", + "zh-CN": "中文(简体)", + "zh-Hant": "中文(繁体)", + "zh-TW": "中文(繁体)", + "en": "英语", + "ja": "日语", + "ko": "韩语", + "fr": "法语", + "de": "德语", + "es": "西班牙语", + "ru": "俄语", + "it": "意大利语", + "pt": "葡萄牙语", + "ar": "阿拉伯语", + "nl": "荷兰语", + "pl": "波兰语", + "tr": "土耳其语", + "th": "泰语", + "vi": "越南语", + "id": "印尼语", + "ms": "马来语", + "el": "希腊语", + "cs": "捷克语", + "da": "丹麦语", + "fi": "芬兰语", + "hu": "匈牙利语", + "no": "挪威语", + "ro": "罗马尼亚语", + "sv": "瑞典语", + "uk": "乌克兰语", + "bg": "保加利亚语", + "et": "爱沙尼亚语", + "lv": "拉脱维亚语", + "lt": "立陶宛语", + "sk": "斯洛伐克语", + "sl": "斯洛文尼亚语", + "hi": "印地语", + "bn": "孟加拉语", + "pa": "旁遮普语", + "ta": "泰米尔语", + "te": "泰卢固语", + "mr": "马拉地语", + "gu": "古吉拉特语", + "kn": "卡纳达语", + "ml": "马拉雅拉姆语", + "si": "僧伽罗语", + "ne": "尼泊尔语", + "my": "缅甸语", + "km": "高棉语", + "lo": "老挝语", + "fa": "波斯语", + "he": "希伯来语", + "ur": "乌尔都语", + "sw": "斯瓦希里语", + "af": "南非荷兰语", + "is": "冰岛语", + "sr": "塞尔维亚语", + "hr": "克罗地亚语", + "bs": "波斯尼亚语", + "mk": "马其顿语", + "sq": "阿尔巴尼亚语", + "hy": "亚美尼亚语", + "ka": "格鲁吉亚语", + "az": "阿塞拜疆语", + "kk": "哈萨克语", + "uz": "乌兹别克语", + "mn": "蒙古语", + "bo": "藏语", + "ug": "维吾尔语", + "fil": "菲律宾语", + "eo": "世界语", + "la": "拉丁语", + "ca": "加泰罗尼亚语", + "eu": "巴斯克语", + "gl": "加利西亚语", + "cy": "威尔士语", + "ga": "爱尔兰语", + "gd": "苏格兰盖尔语", + "mt": "马耳他语", + "lb": "卢森堡语", + "fy": "弗里西语", + "be": "白俄罗斯语", + "tg": "塔吉克语", + "ky": "吉尔吉斯语", + "tk": "土库曼语", + "ps": "普什图语", + "ku": "库尔德语", + "sd": "信德语", + "ceb": "宿务语", + "ig": "伊博语", + "yo": "约鲁巴语", + "zu": "祖鲁语", + "xh": "科萨语", + "so": "索马里语", + "ha": "豪萨语", + "am": "阿姆哈拉语", + "or": "奥里亚语", + "as": "阿萨姆语", + "mai": "迈蒂利语", + "sat": "桑塔利语", + "sa": "梵语", + "ks": "克什米尔语", + "doi": "多格拉语", + "kok": "孔卡尼语", + "mni": "曼尼普尔语", + "brx": "博多语", +} + +func convertHcfyLangToBCP47(hcfyLang string) string { + if bcp47, ok := hcfyLangToBCP47[hcfyLang]; ok { + return bcp47 + } + + return hcfyLang +} + +func convertBCP47ToHcfyLang(bcp47Lang string) string { + if hcfyLang, ok := bcp47ToHcfyLang[bcp47Lang]; ok { + return hcfyLang + } + + return bcp47Lang +} + +type HcfyTranslateRequest struct { + Name string `json:"name" binding:"required" example:"翻译一"` + Text string `json:"text" binding:"required" example:"Hello, word translation."` + Destination []string `json:"destination" binding:"required" example:"中文(简体),英语"` + Source string `json:"source" example:"英语"` +} + +type HcfyPhonetic struct { + Name string `json:"name,omitempty" example:"美"` + TtsURI string `json:"ttsURI,omitempty" example:"https://..."` + Value string `json:"value,omitempty" example:"həˈloʊ"` +} + +type HcfyDict struct { + Pos string `json:"pos,omitempty" example:"n."` + Terms []string `json:"terms" example:"你好,问候"` +} + +type HcfyTranslateResponse struct { + Text string `json:"text" example:"Hello, word translation."` + From string `json:"from" example:"英语"` + To string `json:"to" example:"中文(简体)"` + TtsURI string `json:"ttsURI,omitempty" example:"https://..."` + Link string `json:"link,omitempty" example:"https://..."` + Phonetic []HcfyPhonetic `json:"phonetic,omitempty"` + Dict []HcfyDict `json:"dict,omitempty"` + Result []string `json:"result,omitempty" example:"你好,划词翻译。"` +} + +// HandleHcfyTranslate 划词翻译兼容接口 +// @Summary 划词翻译兼容接口 +// @Description 兼容划词翻译自定义翻译源接口 +// @Tags 插件 +// @Accept json +// @Produce json +// @Param token query string false "API Token" +// @Param request body HcfyTranslateRequest true "划词翻译请求" +// @Success 200 {object} HcfyTranslateResponse +// @Failure 400 {object} map[string]string +// @Failure 401 {object} map[string]string +// @Failure 500 {object} map[string]string +// @Router /hcfy [post] +func HandleHcfyTranslate(apiToken string) gin.HandlerFunc { + return func(c *gin.Context) { + + if apiToken != "" { + token := c.Query("token") + if token == "" { + authHeader := c.GetHeader("Authorization") + if strings.HasPrefix(authHeader, "Bearer ") { + token = strings.TrimPrefix(authHeader, "Bearer ") + } else if authHeader != "" { + token = authHeader + } + } + + if token != apiToken { + c.JSON(http.StatusUnauthorized, gin.H{ + "error": "Unauthorized", + }) + return + } + } + + var req HcfyTranslateRequest + + if err := c.ShouldBindJSON(&req); err != nil { + c.JSON(http.StatusBadRequest, gin.H{ + "error": err.Error(), + }) + return + } + + sourceLang := "auto" + if req.Source != "" { + sourceLang = convertHcfyLangToBCP47(req.Source) + } + + if len(req.Destination) == 0 { + c.JSON(http.StatusBadRequest, gin.H{ + "error": "destination is required", + }) + return + } + + targetLangName := req.Destination[0] + targetLang := convertHcfyLangToBCP47(targetLangName) + + detectedSourceLang := sourceLang + if sourceLang == "auto" { + + if containsChinese(req.Text) { + detectedSourceLang = "zh-Hans" + } else if containsJapanese(req.Text) { + detectedSourceLang = "ja" + } else if containsKorean(req.Text) { + detectedSourceLang = "ko" + } else { + detectedSourceLang = "en" + } + } + + if detectedSourceLang == targetLang && len(req.Destination) > 1 { + targetLangName = req.Destination[1] + targetLang = convertHcfyLangToBCP47(targetLangName) + } + + ctx, cancel := context.WithTimeout(c.Request.Context(), 60*time.Second) + defer cancel() + + paragraphs := strings.Split(req.Text, "\n") + results := make([]string, len(paragraphs)) + + for i, paragraph := range paragraphs { + if paragraph == "" { + results[i] = "" + continue + } + + result, err := services.TranslateWithPivot(ctx, detectedSourceLang, targetLang, paragraph, false) + if err != nil { + c.JSON(http.StatusInternalServerError, gin.H{ + "error": fmt.Sprintf("Translation failed at paragraph %d: %v", i, err), + }) + return + } + results[i] = result + } + + response := HcfyTranslateResponse{ + Text: req.Text, + From: convertBCP47ToHcfyLang(detectedSourceLang), + To: targetLangName, + Result: results, + } + + c.JSON(http.StatusOK, response) + } +} + +func containsChinese(text string) bool { + for _, r := range text { + if r >= 0x4E00 && r <= 0x9FFF { + return true + } + } + return false +} + +func containsJapanese(text string) bool { + for _, r := range text { + if (r >= 0x3040 && r <= 0x309F) || + (r >= 0x30A0 && r <= 0x30FF) { + return true + } + } + return false +} + +func containsKorean(text string) bool { + for _, r := range text { + if r >= 0xAC00 && r <= 0xD7AF { + return true + } + } + return false +} diff --git a/src/mtran/vendor/mtranserver/deprecated/go/internal/handlers/imme.go b/src/mtran/vendor/mtranserver/deprecated/go/internal/handlers/imme.go new file mode 100644 index 0000000..d677be4 --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/go/internal/handlers/imme.go @@ -0,0 +1,92 @@ +package handlers + +import ( + "context" + "net/http" + "time" + + "github.com/gin-gonic/gin" + "github.com/xxnuo/MTranServer/internal/logger" + "github.com/xxnuo/MTranServer/internal/services" + "github.com/xxnuo/MTranServer/internal/utils" +) + +type ImmeTranslateRequest struct { + SourceLang string `json:"source_lang" binding:"required" example:"en"` + TargetLang string `json:"target_lang" binding:"required" example:"zh-CN"` + TextList []string `json:"text_list" binding:"required" example:"Hello, world!,Good morning!"` +} + +type ImmeTranslation struct { + DetectedSourceLang string `json:"detected_source_lang" example:"en"` + Text string `json:"text" example:"你好,世界!"` +} + +type ImmeTranslateResponse struct { + Translations []ImmeTranslation `json:"translations"` +} + +// HandleImmeTranslate 沉浸式翻译插件接口 +// @Summary 沉浸式翻译插件接口 +// @Description 为沉浸式翻译插件提供的翻译接口 +// @Tags 插件 +// @Accept json +// @Produce json +// @Param token query string false "API Token" +// @Param request body ImmeTranslateRequest true "沉浸式翻译请求" +// @Success 200 {object} ImmeTranslateResponse +// @Failure 400 {object} map[string]string +// @Failure 401 {object} map[string]string +// @Failure 500 {object} map[string]string +// @Router /imme [post] +func HandleImmeTranslate(apiToken string) gin.HandlerFunc { + return func(c *gin.Context) { + + if apiToken != "" { + token := c.Query("token") + if token != apiToken { + c.JSON(http.StatusUnauthorized, gin.H{ + "error": "Unauthorized", + }) + return + } + } + + var req ImmeTranslateRequest + + if err := c.ShouldBindJSON(&req); err != nil { + c.JSON(http.StatusBadRequest, gin.H{ + "error": err.Error(), + }) + return + } + + sourceLang := utils.NormalizeLanguageCode(req.SourceLang) + targetLang := utils.NormalizeLanguageCode(req.TargetLang) + + translations := make([]ImmeTranslation, len(req.TextList)) + ctx, cancel := context.WithTimeout(c.Request.Context(), 120*time.Second) + defer cancel() + + logger.Debug("Imme request: %s -> %s, count: %d", sourceLang, targetLang, len(req.TextList)) + for i, text := range req.TextList { + logger.Debug("Imme translating [%d/%d]: %s -> %s, text length: %d, text: %q", i+1, len(req.TextList), sourceLang, targetLang, len(text), text) + result, err := services.TranslateWithPivot(ctx, sourceLang, targetLang, text, true) + if err != nil { + logger.Error("Imme translation failed at index %d (%s -> %s): %v", i, sourceLang, targetLang, err) + result = text // Fallback to original text + } else { + logger.Debug("Imme translated [%d/%d] success", i+1, len(req.TextList)) + } + + translations[i] = ImmeTranslation{ + DetectedSourceLang: req.SourceLang, + Text: result, + } + } + + c.JSON(http.StatusOK, ImmeTranslateResponse{ + Translations: translations, + }) + } +} diff --git a/src/mtran/vendor/mtranserver/deprecated/go/internal/handlers/kiss.go b/src/mtran/vendor/mtranserver/deprecated/go/internal/handlers/kiss.go new file mode 100644 index 0000000..592a4e3 --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/go/internal/handlers/kiss.go @@ -0,0 +1,153 @@ +package handlers + +import ( + "context" + "fmt" + "net/http" + "time" + + "github.com/gin-gonic/gin" + "github.com/xxnuo/MTranServer/internal/services" + "github.com/xxnuo/MTranServer/internal/utils" +) + +type KissTranslateRequest struct { + From string `json:"from" binding:"required" example:"en"` + To string `json:"to" binding:"required" example:"zh-CN"` + Text string `json:"text" binding:"required" example:"Hello, world!"` +} + +type KissTranslateResponse struct { + Text string `json:"text" example:"你好,世界!"` + Src string `json:"src" example:"en"` +} + +type KissBatchTranslateRequest struct { + From string `json:"from" binding:"required" example:"auto"` + To string `json:"to" binding:"required" example:"zh-CN"` + Texts []string `json:"texts" binding:"required" example:"Hello,World"` +} + +type KissBatchTranslateItem struct { + Text string `json:"text" example:"你好"` + Src string `json:"src" example:"en"` +} + +type KissBatchTranslateResponse struct { + Translations []KissBatchTranslateItem `json:"translations"` +} + +// HandleKissTranslate 简约翻译插件接口(非聚合) +// @Summary 简约翻译插件接口(非聚合) +// @Description 为简约翻译插件提供的单文本翻译接口 +// @Tags 插件 +// @Accept json +// @Produce json +// @Param KEY header string false "API Token" +// @Param request body KissTranslateRequest true "简约翻译请求" +// @Success 200 {object} KissTranslateResponse +// @Failure 400 {object} map[string]string +// @Failure 401 {object} map[string]string +// @Failure 500 {object} map[string]string +// @Router /kiss [post] +func HandleKissTranslate(apiToken string) gin.HandlerFunc { + return func(c *gin.Context) { + + if apiToken != "" { + token := c.GetHeader("KEY") + if token != apiToken { + c.JSON(http.StatusUnauthorized, gin.H{ + "error": "Unauthorized", + }) + return + } + } + + var rawReq map[string]interface{} + if err := c.ShouldBindJSON(&rawReq); err != nil { + c.JSON(http.StatusBadRequest, gin.H{ + "error": err.Error(), + }) + return + } + + if texts, ok := rawReq["texts"].([]interface{}); ok && len(texts) > 0 { + + var batchReq KissBatchTranslateRequest + batchReq.From, _ = rawReq["from"].(string) + batchReq.To, _ = rawReq["to"].(string) + for _, t := range texts { + if str, ok := t.(string); ok { + batchReq.Texts = append(batchReq.Texts, str) + } + } + if batchReq.From == "" || batchReq.To == "" || len(batchReq.Texts) == 0 { + c.JSON(http.StatusBadRequest, gin.H{ + "error": "Invalid batch request", + }) + return + } + handleBatchTranslate(c, batchReq) + return + } + + var req KissTranslateRequest + req.From, _ = rawReq["from"].(string) + req.To, _ = rawReq["to"].(string) + req.Text, _ = rawReq["text"].(string) + + if req.From == "" || req.To == "" || req.Text == "" { + c.JSON(http.StatusBadRequest, gin.H{ + "error": "Missing required fields: from, to, text", + }) + return + } + + fromLang := utils.NormalizeLanguageCode(req.From) + toLang := utils.NormalizeLanguageCode(req.To) + + ctx, cancel := context.WithTimeout(c.Request.Context(), 60*time.Second) + defer cancel() + + result, err := services.TranslateWithPivot(ctx, fromLang, toLang, req.Text, false) + if err != nil { + c.JSON(http.StatusInternalServerError, gin.H{ + "error": fmt.Sprintf("Translation failed: %v", err), + }) + return + } + + c.JSON(http.StatusOK, gin.H{ + "text": result, + "src": req.From, + }) + } +} + +func handleBatchTranslate(c *gin.Context, req KissBatchTranslateRequest) { + + fromLang := utils.NormalizeLanguageCode(req.From) + toLang := utils.NormalizeLanguageCode(req.To) + + ctx, cancel := context.WithTimeout(c.Request.Context(), 120*time.Second) + defer cancel() + + translations := make([]KissBatchTranslateItem, 0, len(req.Texts)) + for _, text := range req.Texts { + result, err := services.TranslateWithPivot(ctx, fromLang, toLang, text, false) + if err != nil { + c.JSON(http.StatusInternalServerError, gin.H{ + "error": fmt.Sprintf("Translation failed: %v", err), + }) + return + } + translations = append(translations, KissBatchTranslateItem{ + Text: result, + Src: req.From, + }) + } + + c.JSON(http.StatusOK, KissBatchTranslateResponse{ + Translations: translations, + }) +} diff --git a/src/mtran/vendor/mtranserver/deprecated/go/internal/handlers/language.go b/src/mtran/vendor/mtranserver/deprecated/go/internal/handlers/language.go new file mode 100644 index 0000000..2492f0c --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/go/internal/handlers/language.go @@ -0,0 +1,42 @@ +package handlers + +import ( + "net/http" + + "github.com/gin-gonic/gin" + "github.com/xxnuo/MTranServer/internal/models" +) + +// handleLanguages 获取支持的语言列表 +// @Summary 获取支持的语言列表 +// @Description 返回所有支持的翻译语言代码 +// @Tags 翻译 +// @Produce json +// @Success 200 {object} map[string][]string +// @Failure 500 {object} map[string]string +// @Security ApiKeyAuth +// @Security ApiKeyQuery +// @Router /languages [get] +func HandleLanguages(c *gin.Context) { + if models.GlobalRecords == nil { + c.JSON(http.StatusInternalServerError, gin.H{ + "error": "Records not initialized", + }) + return + } + + langMap := make(map[string]bool) + for _, record := range models.GlobalRecords.Data { + langMap[record.SourceLanguage] = true + langMap[record.TargetLanguage] = true + } + + languages := make([]string, 0, len(langMap)) + for lang := range langMap { + languages = append(languages, lang) + } + + c.JSON(http.StatusOK, gin.H{ + "languages": languages, + }) +} diff --git a/src/mtran/vendor/mtranserver/deprecated/go/internal/handlers/language_test.go b/src/mtran/vendor/mtranserver/deprecated/go/internal/handlers/language_test.go new file mode 100644 index 0000000..8827552 --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/go/internal/handlers/language_test.go @@ -0,0 +1,53 @@ +package handlers + +import ( + "net/http" + "net/http/httptest" + "testing" + + "github.com/gin-gonic/gin" + "github.com/stretchr/testify/assert" + "github.com/xxnuo/MTranServer/internal/models" +) + +func TestHandleLanguages(t *testing.T) { + gin.SetMode(gin.TestMode) + + models.GlobalRecords = &models.RecordsData{ + Data: []models.RecordItem{ + {SourceLanguage: "en", TargetLanguage: "zh-Hans"}, + {SourceLanguage: "zh-Hans", TargetLanguage: "en"}, + {SourceLanguage: "en", TargetLanguage: "ja"}, + }, + } + + w := httptest.NewRecorder() + c, _ := gin.CreateTestContext(w) + + HandleLanguages(c) + + assert.Equal(t, http.StatusOK, w.Code) + assert.Contains(t, w.Body.String(), "languages") + assert.Contains(t, w.Body.String(), "en") + assert.Contains(t, w.Body.String(), "zh-Hans") + assert.Contains(t, w.Body.String(), "ja") +} + +func TestHandleLanguagesNotInitialized(t *testing.T) { + gin.SetMode(gin.TestMode) + + originalRecords := models.GlobalRecords + models.GlobalRecords = nil + defer func() { + models.GlobalRecords = originalRecords + }() + + w := httptest.NewRecorder() + c, _ := gin.CreateTestContext(w) + + HandleLanguages(c) + + assert.Equal(t, http.StatusInternalServerError, w.Code) + assert.Contains(t, w.Body.String(), "error") + assert.Contains(t, w.Body.String(), "Records not initialized") +} diff --git a/src/mtran/vendor/mtranserver/deprecated/go/internal/handlers/system.go b/src/mtran/vendor/mtranserver/deprecated/go/internal/handlers/system.go new file mode 100644 index 0000000..fad1e34 --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/go/internal/handlers/system.go @@ -0,0 +1,57 @@ +package handlers + +import ( + "net/http" + + "github.com/gin-gonic/gin" + "github.com/xxnuo/MTranServer/internal/version" +) + +// handleVersion 获取服务版本 +// @Summary 获取服务版本 +// @Description 返回当前服务的版本号 +// @Tags 系统 +// @Produce json +// @Success 200 {object} map[string]string +// @Router /version [get] +func HandleVersion(c *gin.Context) { + c.JSON(http.StatusOK, gin.H{ + "server": version.GetVersion(), + "worker": version.GetWorkerVersion(), + }) +} + +// handleHealth 健康检查 +// @Summary 健康检查 +// @Description 检查服务是否正常运行 +// @Tags 系统 +// @Produce json +// @Success 200 {object} map[string]string +// @Router /health [get] +func HandleHealth(c *gin.Context) { + c.JSON(http.StatusOK, gin.H{ + "status": "ok", + }) +} + +// handleHeartbeat 心跳检查 +// @Summary 心跳检查 +// @Description 返回服务状态 +// @Tags 系统 +// @Produce plain +// @Success 200 {string} string "Ready" +// @Router /__heartbeat__ [get] +func HandleHeartbeat(c *gin.Context) { + c.String(http.StatusOK, "Ready") +} + +// handleLBHeartbeat 负载均衡心跳检查 +// @Summary 负载均衡心跳检查 +// @Description 返回负载均衡器心跳状态 +// @Tags 系统 +// @Produce plain +// @Success 200 {string} string "Ready" +// @Router /__lbheartbeat__ [get] +func HandleLBHeartbeat(c *gin.Context) { + c.String(http.StatusOK, "Ready") +} diff --git a/src/mtran/vendor/mtranserver/deprecated/go/internal/handlers/system_test.go b/src/mtran/vendor/mtranserver/deprecated/go/internal/handlers/system_test.go new file mode 100644 index 0000000..46e28c4 --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/go/internal/handlers/system_test.go @@ -0,0 +1,61 @@ +package handlers + +import ( + "net/http" + "net/http/httptest" + "testing" + + "github.com/gin-gonic/gin" + "github.com/stretchr/testify/assert" + "github.com/xxnuo/MTranServer/internal/version" +) + +func TestHandleVersion(t *testing.T) { + gin.SetMode(gin.TestMode) + + w := httptest.NewRecorder() + c, _ := gin.CreateTestContext(w) + + HandleVersion(c) + + assert.Equal(t, http.StatusOK, w.Code) + assert.Contains(t, w.Body.String(), "version") + assert.Contains(t, w.Body.String(), version.GetVersion()) +} + +func TestHandleHealth(t *testing.T) { + gin.SetMode(gin.TestMode) + + w := httptest.NewRecorder() + c, _ := gin.CreateTestContext(w) + + HandleHealth(c) + + assert.Equal(t, http.StatusOK, w.Code) + assert.Contains(t, w.Body.String(), "status") + assert.Contains(t, w.Body.String(), "ok") +} + +func TestHandleHeartbeat(t *testing.T) { + gin.SetMode(gin.TestMode) + + w := httptest.NewRecorder() + c, _ := gin.CreateTestContext(w) + + HandleHeartbeat(c) + + assert.Equal(t, http.StatusOK, w.Code) + assert.Equal(t, "Ready", w.Body.String()) +} + +func TestHandleLBHeartbeat(t *testing.T) { + gin.SetMode(gin.TestMode) + + w := httptest.NewRecorder() + c, _ := gin.CreateTestContext(w) + + HandleLBHeartbeat(c) + + assert.Equal(t, http.StatusOK, w.Code) + assert.Equal(t, "Ready", w.Body.String()) +} diff --git a/src/mtran/vendor/mtranserver/deprecated/go/internal/handlers/translate.go b/src/mtran/vendor/mtranserver/deprecated/go/internal/handlers/translate.go new file mode 100644 index 0000000..28405ed --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/go/internal/handlers/translate.go @@ -0,0 +1,131 @@ +package handlers + +import ( + "context" + "fmt" + "net/http" + "time" + + "github.com/gin-gonic/gin" + "github.com/xxnuo/MTranServer/internal/logger" + "github.com/xxnuo/MTranServer/internal/services" + "github.com/xxnuo/MTranServer/internal/utils" +) + +// TranslateRequest 翻译请求 +type TranslateRequest struct { + From string `json:"from" binding:"required" example:"en"` + To string `json:"to" binding:"required" example:"zh-Hans"` + Text string `json:"text" binding:"required" example:"Hello, world!"` + HTML bool `json:"html" example:"false"` +} + +// TranslateResponse 翻译响应 +type TranslateResponse struct { + Result string `json:"result" example:"你好,世界!"` +} + +// handleTranslate 单文本翻译 +// @Summary 单文本翻译 +// @Description 翻译单个文本 +// @Tags 翻译 +// @Accept json +// @Produce json +// @Param request body TranslateRequest true "翻译请求" +// @Success 200 {object} TranslateResponse +// @Failure 400 {object} map[string]string +// @Failure 500 {object} map[string]string +// @Security ApiKeyAuth +// @Security ApiKeyQuery +// @Router /translate [post] +func HandleTranslate(c *gin.Context) { + var req TranslateRequest + + if err := c.ShouldBindJSON(&req); err != nil { + c.JSON(http.StatusBadRequest, gin.H{ + "error": err.Error(), + }) + return + } + + req.From = utils.NormalizeLanguageCode(req.From) + req.To = utils.NormalizeLanguageCode(req.To) + + logger.Debug("Translation request: %s -> %s, text length: %d", req.From, req.To, len(req.Text)) + ctx, cancel := context.WithTimeout(c.Request.Context(), 60*time.Second) + defer cancel() + + result, err := services.TranslateWithPivot(ctx, req.From, req.To, req.Text, req.HTML) + if err != nil { + logger.Error("Translation failed (%s -> %s): %v", req.From, req.To, err) + c.JSON(http.StatusInternalServerError, gin.H{ + "error": fmt.Sprintf("Translation failed: %v", err), + }) + return + } + + logger.Debug("Translation completed: %s -> %s", req.From, req.To) + c.JSON(http.StatusOK, gin.H{ + "result": result, + }) +} + +type TranslateBatchRequest struct { + From string `json:"from" binding:"required" example:"en"` + To string `json:"to" binding:"required" example:"zh-Hans"` + Texts []string `json:"texts" binding:"required" example:"Hello, world!,Good morning!"` + HTML bool `json:"html" example:"false"` +} + +type TranslateBatchResponse struct { + Results []string `json:"results" example:"你好,世界!,早上好!"` +} + +// handleTranslateBatch 批量翻译 +// @Summary 批量翻译 +// @Description 批量翻译多个文本 +// @Tags 翻译 +// @Accept json +// @Produce json +// @Param request body TranslateBatchRequest true "批量翻译请求" +// @Success 200 {object} TranslateBatchResponse +// @Failure 400 {object} map[string]string +// @Failure 500 {object} map[string]string +// @Security ApiKeyAuth +// @Security ApiKeyQuery +// @Router /translate/batch [post] +func HandleTranslateBatch(c *gin.Context) { + var req TranslateBatchRequest + + if err := c.ShouldBindJSON(&req); err != nil { + c.JSON(http.StatusBadRequest, gin.H{ + "error": err.Error(), + }) + return + } + + req.From = utils.NormalizeLanguageCode(req.From) + req.To = utils.NormalizeLanguageCode(req.To) + + logger.Debug("Batch translation request: %s -> %s, count: %d", req.From, req.To, len(req.Texts)) + results := make([]string, len(req.Texts)) + ctx, cancel := context.WithTimeout(c.Request.Context(), 120*time.Second) + defer cancel() + + for i, text := range req.Texts { + result, err := services.TranslateWithPivot(ctx, req.From, req.To, text, req.HTML) + if err != nil { + logger.Error("Batch translation failed at index %d (%s -> %s): %v", i, req.From, req.To, err) + c.JSON(http.StatusInternalServerError, gin.H{ + "error": fmt.Sprintf("Translation failed at index %d: %v", i, err), + }) + return + } + results[i] = result + } + + logger.Debug("Batch translation completed: %s -> %s, count: %d", req.From, req.To, len(req.Texts)) + c.JSON(http.StatusOK, gin.H{ + "results": results, + }) +} diff --git a/src/mtran/vendor/mtranserver/deprecated/go/internal/logger/logger.go b/src/mtran/vendor/mtranserver/deprecated/go/internal/logger/logger.go new file mode 100644 index 0000000..f55d7f7 --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/go/internal/logger/logger.go @@ -0,0 +1,119 @@ +package logger + +import ( + "fmt" + "log" + "os" + "strings" +) + +type LogLevel int + +const ( + DEBUG LogLevel = iota + INFO + WARN + ERROR +) + +const ( + colorReset = "\033[0m" + colorCyan = "\033[36m" + colorGreen = "\033[32m" + colorYellow = "\033[33m" + colorRed = "\033[31m" +) + +var ( + currentLevel LogLevel = INFO + debugLogger *log.Logger + infoLogger *log.Logger + warnLogger *log.Logger + errorLogger *log.Logger +) + +func init() { + debugLogger = log.New(os.Stdout, colorCyan+"[DEBUG]"+colorReset+" ", log.Ldate|log.Ltime|log.Lshortfile) + infoLogger = log.New(os.Stdout, colorGreen+"[INFO]"+colorReset+" ", log.Ldate|log.Ltime) + warnLogger = log.New(os.Stdout, colorYellow+"[WARN]"+colorReset+" ", log.Ldate|log.Ltime) + errorLogger = log.New(os.Stderr, colorRed+"[ERROR]"+colorReset+" ", log.Ldate|log.Ltime|log.Lshortfile) +} + +func SetLevel(level string) { + switch strings.ToLower(level) { + case "debug": + currentLevel = DEBUG + case "info": + currentLevel = INFO + case "warn", "warning": + currentLevel = WARN + case "error": + currentLevel = ERROR + default: + currentLevel = INFO + } +} + +func GetLevel() string { + switch currentLevel { + case DEBUG: + return "debug" + case INFO: + return "info" + case WARN: + return "warn" + case ERROR: + return "error" + default: + return "info" + } +} + +func Debug(format string, v ...interface{}) { + if currentLevel <= DEBUG { + debugLogger.Output(2, fmt.Sprintf(format, v...)) + } +} + +func Info(format string, v ...interface{}) { + if currentLevel <= INFO { + infoLogger.Output(2, fmt.Sprintf(format, v...)) + } +} + +func Warn(format string, v ...interface{}) { + if currentLevel <= WARN { + warnLogger.Output(2, fmt.Sprintf(format, v...)) + } +} + +func Error(format string, v ...interface{}) { + if currentLevel <= ERROR { + errorLogger.Output(2, fmt.Sprintf(format, v...)) + } +} + +func Fatal(format string, v ...interface{}) { + errorLogger.Output(2, fmt.Sprintf(format, v...)) + os.Exit(1) +} + +func Debugf(format string, v ...interface{}) { + Debug(format, v...) +} + +func Infof(format string, v ...interface{}) { + Info(format, v...) +} + +func Warnf(format string, v ...interface{}) { + Warn(format, v...) +} + +func Errorf(format string, v ...interface{}) { + Error(format, v...) +} + +func Fatalf(format string, v ...interface{}) { + Fatal(format, v...) +} diff --git a/src/mtran/vendor/mtranserver/deprecated/go/internal/manager/client.go b/src/mtran/vendor/mtranserver/deprecated/go/internal/manager/client.go new file mode 100644 index 0000000..2714eba --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/go/internal/manager/client.go @@ -0,0 +1,247 @@ +package manager + +import ( + "context" + "encoding/json" + "fmt" + "sync" + "time" + + "github.com/gorilla/websocket" + "github.com/xxnuo/MTranServer/internal/logger" +) + +type WSMessage struct { + Type string `json:"type"` + Data json.RawMessage `json:"data"` +} + +type WSResponse struct { + Type string `json:"type"` + Code int `json:"code"` + Msg string `json:"msg"` + Data json.RawMessage `json:"data,omitempty"` +} + +type TransRequest struct { + Text string `json:"text"` + HTML bool `json:"html"` +} + +type ExitRequest struct { + Time int `json:"time"` + Force bool `json:"force"` +} + +type HealthResponse struct { + Ready bool `json:"ready"` +} + +type TransResponse struct { + TranslatedText string `json:"translated_text"` +} + +type ExitResponse struct { + Message string `json:"message"` +} + +type Client struct { + url string + conn *websocket.Conn + mu sync.RWMutex + timeout time.Duration + connected bool + reconnect bool + closeChan chan struct{} + closeOnce sync.Once +} + +type ClientOption func(*Client) + +func WithTimeout(timeout time.Duration) ClientOption { + return func(c *Client) { + c.timeout = timeout + } +} + +func WithReconnect(reconnect bool) ClientOption { + return func(c *Client) { + c.reconnect = reconnect + } +} + +func NewClient(url string, opts ...ClientOption) *Client { + c := &Client{ + url: url, + timeout: 30 * time.Second, + reconnect: false, + closeChan: make(chan struct{}), + } + + for _, opt := range opts { + opt(c) + } + + return c +} + +func (c *Client) Connect() error { + c.mu.Lock() + defer c.mu.Unlock() + + if c.connected { + return nil + } + + dialer := websocket.Dialer{ + HandshakeTimeout: c.timeout, + } + + conn, _, err := dialer.Dial(c.url, nil) + if err != nil { + return fmt.Errorf("failed to connect: %w", err) + } + + c.conn = conn + c.connected = true + + return nil +} + +func (c *Client) Close() error { + var err error + c.closeOnce.Do(func() { + close(c.closeChan) + c.mu.Lock() + defer c.mu.Unlock() + + if c.conn != nil { + err = c.conn.Close() + c.connected = false + } + }) + return err +} + +func (c *Client) IsConnected() bool { + c.mu.RLock() + defer c.mu.RUnlock() + return c.connected +} + +func (c *Client) sendRequest(ctx context.Context, msgType string, data interface{}) (*WSResponse, error) { + dataBytes, err := json.Marshal(data) + if err != nil { + return nil, fmt.Errorf("failed to marshal data: %w", err) + } + + msg := WSMessage{ + Type: msgType, + Data: dataBytes, + } + + reqCtx, cancel := context.WithTimeout(ctx, c.timeout) + defer cancel() + + c.mu.Lock() + defer c.mu.Unlock() + + if !c.connected { + return nil, fmt.Errorf("not connected") + } + + if err := c.conn.WriteJSON(msg); err != nil { + c.connected = false + return nil, fmt.Errorf("failed to send message: %w", err) + } + + responseChan := make(chan *WSResponse, 1) + errChan := make(chan error, 1) + + go func() { + var resp WSResponse + if err := c.conn.ReadJSON(&resp); err != nil { + errChan <- fmt.Errorf("failed to read response: %w", err) + return + } + responseChan <- &resp + }() + + select { + case <-reqCtx.Done(): + c.connected = false + return nil, fmt.Errorf("request timeout") + case err := <-errChan: + c.connected = false + return nil, err + case resp := <-responseChan: + return resp, nil + } +} + +func (c *Client) Health(ctx context.Context) (bool, error) { + resp, err := c.sendRequest(ctx, "health", struct{}{}) + if err != nil { + return false, err + } + + if resp.Code != 200 { + return false, fmt.Errorf("health check failed (code %d): %s", resp.Code, resp.Msg) + } + + var result HealthResponse + if resp.Data != nil { + if err := json.Unmarshal(resp.Data, &result); err != nil { + return false, fmt.Errorf("failed to unmarshal response: %w", err) + } + } + + return result.Ready, nil +} + +func (c *Client) Trans(ctx context.Context, req TransRequest) (string, error) { + logger.Debug("Client.Trans: sending request, text length: %d, isHTML: %v, text: %q", len(req.Text), req.HTML, req.Text) + resp, err := c.sendRequest(ctx, "trans", req) + if err != nil { + logger.Debug("Client.Trans: sendRequest error: %v", err) + return "", err + } + + if resp.Code != 200 { + logger.Debug("Client.Trans: response code %d: %s", resp.Code, resp.Msg) + return "", fmt.Errorf("trans failed (code %d): %s", resp.Code, resp.Msg) + } + + var result TransResponse + if resp.Data != nil { + if err := json.Unmarshal(resp.Data, &result); err != nil { + logger.Debug("Client.Trans: unmarshal error: %v", err) + return "", fmt.Errorf("failed to unmarshal response: %w", err) + } + } + + logger.Debug("Client.Trans: success, result length: %d", len(result.TranslatedText)) + return result.TranslatedText, nil +} + +func (c *Client) Exit(ctx context.Context, req ExitRequest) (*ExitResponse, error) { + resp, err := c.sendRequest(ctx, "exit", req) + if err != nil { + return nil, err + } + + if resp.Code != 200 { + return nil, fmt.Errorf("exit failed (code %d): %s", resp.Code, resp.Msg) + } + + var result ExitResponse + if resp.Data != nil { + if err := json.Unmarshal(resp.Data, &result); err != nil { + return nil, fmt.Errorf("failed to unmarshal response: %w", err) + } + } else { + result.Message = resp.Msg + } + + return &result, nil +} diff --git a/src/mtran/vendor/mtranserver/deprecated/go/internal/manager/client_test.go b/src/mtran/vendor/mtranserver/deprecated/go/internal/manager/client_test.go new file mode 100644 index 0000000..8c579e3 --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/go/internal/manager/client_test.go @@ -0,0 +1,359 @@ +package manager_test + +import ( + "context" + "encoding/json" + "net/http" + "net/http/httptest" + "testing" + "time" + + "github.com/gorilla/websocket" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "github.com/xxnuo/MTranServer/internal/manager" +) + +var upgrader = websocket.Upgrader{ + CheckOrigin: func(r *http.Request) bool { + return true + }, +} + +func mockWSServer(t *testing.T, handler func(*websocket.Conn)) *httptest.Server { + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + conn, err := upgrader.Upgrade(w, r, nil) + require.NoError(t, err) + defer conn.Close() + handler(conn) + })) + return server +} + +func handleEcho(conn *websocket.Conn) { + for { + var msg manager.WSMessage + if err := conn.ReadJSON(&msg); err != nil { + break + } + + resp := manager.WSResponse{ + Type: msg.Type, + Code: 200, + Msg: "success", + Data: msg.Data, + } + + if err := conn.WriteJSON(resp); err != nil { + break + } + } +} + +func handleHealth(conn *websocket.Conn, ready bool) { + var msg manager.WSMessage + if err := conn.ReadJSON(&msg); err != nil { + return + } + + resp := manager.WSResponse{ + Type: "health", + Code: 200, + Msg: "success", + } + + data := map[string]bool{"ready": ready} + resp.Data, _ = json.Marshal(data) + + conn.WriteJSON(resp) +} + +func handleTrans(conn *websocket.Conn) { + var msg manager.WSMessage + if err := conn.ReadJSON(&msg); err != nil { + return + } + + var req manager.TransRequest + json.Unmarshal(msg.Data, &req) + + resp := manager.WSResponse{ + Type: "trans", + Code: 200, + Msg: "success", + } + + if req.Text == "" { + resp.Code = 400 + resp.Msg = "text is required" + } else { + data := map[string]string{"translated_text": "translated: " + req.Text} + resp.Data, _ = json.Marshal(data) + } + + conn.WriteJSON(resp) +} + +func handleCompute(conn *websocket.Conn) { + var msg manager.WSMessage + if err := conn.ReadJSON(&msg); err != nil { + return + } + + var req struct { + Text string `json:"text"` + HTML bool `json:"html"` + } + json.Unmarshal(msg.Data, &req) + + resp := manager.WSResponse{ + Type: "trans", + Code: 200, + Msg: "success", + } + + if req.Text == "" { + resp.Code = 400 + resp.Msg = "text is required" + } else { + data := map[string]string{"translated_text": "翻译结果: " + req.Text} + resp.Data, _ = json.Marshal(data) + } + + conn.WriteJSON(resp) +} + +func TestClient_Connect(t *testing.T) { + server := mockWSServer(t, handleEcho) + defer server.Close() + + wsURL := "ws" + server.URL[4:] + + client := manager.NewClient(wsURL) + defer client.Close() + + err := client.Connect() + assert.NoError(t, err) + assert.True(t, client.IsConnected()) +} + +func TestClient_ConnectTwice(t *testing.T) { + server := mockWSServer(t, handleEcho) + defer server.Close() + + wsURL := "ws" + server.URL[4:] + + client := manager.NewClient(wsURL) + defer client.Close() + + err := client.Connect() + require.NoError(t, err) + + err = client.Connect() + assert.NoError(t, err) + assert.True(t, client.IsConnected()) +} + +func TestClient_Health(t *testing.T) { + server := mockWSServer(t, func(conn *websocket.Conn) { + handleHealth(conn, true) + }) + defer server.Close() + + wsURL := "ws" + server.URL[4:] + + client := manager.NewClient(wsURL) + defer client.Close() + + err := client.Connect() + require.NoError(t, err) + + ctx := context.Background() + ready, err := client.Health(ctx) + + assert.NoError(t, err) + assert.True(t, ready) +} + +func TestClient_Health_NotReady(t *testing.T) { + server := mockWSServer(t, func(conn *websocket.Conn) { + handleHealth(conn, false) + }) + defer server.Close() + + wsURL := "ws" + server.URL[4:] + + client := manager.NewClient(wsURL) + defer client.Close() + + err := client.Connect() + require.NoError(t, err) + + ctx := context.Background() + ready, err := client.Health(ctx) + + assert.NoError(t, err) + assert.False(t, ready) +} + +func TestClient_Trans(t *testing.T) { + server := mockWSServer(t, handleTrans) + defer server.Close() + + wsURL := "ws" + server.URL[4:] + + client := manager.NewClient(wsURL) + defer client.Close() + + err := client.Connect() + require.NoError(t, err) + + ctx := context.Background() + result, err := client.Trans(ctx, manager.TransRequest{ + Text: "Hello", + HTML: false, + }) + + assert.NoError(t, err) + assert.Equal(t, "translated: Hello", result) +} + +func TestClient_Trans_EmptyText(t *testing.T) { + server := mockWSServer(t, handleTrans) + defer server.Close() + + wsURL := "ws" + server.URL[4:] + + client := manager.NewClient(wsURL) + defer client.Close() + + err := client.Connect() + require.NoError(t, err) + + ctx := context.Background() + _, err = client.Trans(ctx, manager.TransRequest{ + Text: "", + }) + + assert.Error(t, err) + assert.Contains(t, err.Error(), "text is required") +} + +func TestClient_Timeout(t *testing.T) { + server := mockWSServer(t, func(conn *websocket.Conn) { + time.Sleep(5 * time.Second) + }) + defer server.Close() + + wsURL := "ws" + server.URL[4:] + + client := manager.NewClient(wsURL, manager.WithTimeout(100*time.Millisecond)) + defer client.Close() + + err := client.Connect() + require.NoError(t, err) + + ctx := context.Background() + _, err = client.Health(ctx) + + assert.Error(t, err) + assert.Contains(t, err.Error(), "timeout") +} + +func TestClient_NotConnected(t *testing.T) { + client := manager.NewClient("ws://localhost:9999") + defer client.Close() + + ctx := context.Background() + _, err := client.Health(ctx) + + assert.Error(t, err) + assert.Contains(t, err.Error(), "not connected") +} + +func TestClient_Exit(t *testing.T) { + server := mockWSServer(t, func(conn *websocket.Conn) { + var msg manager.WSMessage + if err := conn.ReadJSON(&msg); err != nil { + return + } + + data := map[string]string{"message": "Shutdown initiated"} + dataBytes, _ := json.Marshal(data) + + resp := manager.WSResponse{ + Type: "exit", + Code: 200, + Msg: "success", + Data: dataBytes, + } + + conn.WriteJSON(resp) + }) + defer server.Close() + + wsURL := "ws" + server.URL[4:] + + client := manager.NewClient(wsURL) + defer client.Close() + + err := client.Connect() + require.NoError(t, err) + + ctx := context.Background() + resp, err := client.Exit(ctx, manager.ExitRequest{ + Time: 0, + Force: true, + }) + + assert.NoError(t, err) + assert.NotNil(t, resp) + assert.Equal(t, "Shutdown initiated", resp.Message) +} + +func TestClient_MultipleRequests(t *testing.T) { + server := mockWSServer(t, func(conn *websocket.Conn) { + for i := 0; i < 3; i++ { + var msg manager.WSMessage + if err := conn.ReadJSON(&msg); err != nil { + break + } + + var req manager.TransRequest + json.Unmarshal(msg.Data, &req) + + data := map[string]string{"translated_text": "translated: " + req.Text} + dataBytes, _ := json.Marshal(data) + + resp := manager.WSResponse{ + Type: "trans", + Code: 200, + Msg: "success", + Data: dataBytes, + } + + if err := conn.WriteJSON(resp); err != nil { + break + } + } + }) + defer server.Close() + + wsURL := "ws" + server.URL[4:] + + client := manager.NewClient(wsURL) + defer client.Close() + + err := client.Connect() + require.NoError(t, err) + + ctx := context.Background() + + for i := 1; i <= 3; i++ { + result, err := client.Trans(ctx, manager.TransRequest{ + Text: "Test " + string(rune('0'+i)), + }) + assert.NoError(t, err) + assert.Contains(t, result, "translated:") + } +} diff --git a/src/mtran/vendor/mtranserver/deprecated/go/internal/manager/daemon.go b/src/mtran/vendor/mtranserver/deprecated/go/internal/manager/daemon.go new file mode 100644 index 0000000..75caf2e --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/go/internal/manager/daemon.go @@ -0,0 +1,422 @@ +package manager + +import ( + "bufio" + "fmt" + "io" + "os" + "os/exec" + "path/filepath" + "runtime" + "strconv" + "sync" + "syscall" + "time" + + "github.com/xxnuo/MTranServer/bin" + "github.com/xxnuo/MTranServer/internal/config" + "github.com/xxnuo/MTranServer/internal/logger" +) + +const ( + maxLogLines = 1000 +) + +var ( + workerBinaryInitialized bool + workerBinaryMu sync.Mutex +) + +type WorkerArgs struct { + Host string + Port int + WorkDir string + ModelDir string + ModelPath string + LexicalPath string + VocabPaths []string + EnableGRPC bool + EnableHTTP bool + EnableWebSocket bool + GRPCUnixSocket string + LogLevel string + BinaryPath string +} + +func NewWorkerArgs() *WorkerArgs { + return &WorkerArgs{ + Host: "127.0.0.1", + Port: 8988, + WorkDir: ".", + EnableGRPC: false, + EnableHTTP: false, + EnableWebSocket: true, + GRPCUnixSocket: "", + LogLevel: "warning", + } +} + +type Worker struct { + args *WorkerArgs + cmd *exec.Cmd + id string + binaryPath string + mu sync.RWMutex + logMu sync.RWMutex + logs []string + maxLogs int + done chan struct{} + wg sync.WaitGroup + running bool + pid int +} + +func NewWorker(args *WorkerArgs) *Worker { + binaryPath := args.BinaryPath + if binaryPath == "" { + cfg := config.GetConfig() + binaryName := "mtrancore" + if runtime.GOOS == "windows" { + binaryName += ".exe" + } + binaryPath = filepath.Join(cfg.ConfigDir, "bin", binaryName) + } + + workerID := fmt.Sprintf("mtran-worker-%d", args.Port) + + w := &Worker{ + args: args, + id: workerID, + binaryPath: binaryPath, + logs: make([]string, 0, maxLogLines), + maxLogs: maxLogLines, + done: make(chan struct{}), + running: false, + pid: 0, + } + + return w +} + +func EnsureWorkerBinary(cfg *config.Config) error { + workerBinaryMu.Lock() + defer workerBinaryMu.Unlock() + + if workerBinaryInitialized { + return nil + } + + binaryName := "mtrancore" + if runtime.GOOS == "windows" { + binaryName += ".exe" + } + binaryPath := filepath.Join(cfg.ConfigDir, "bin", binaryName) + + if data, err := os.ReadFile(binaryPath); err == nil { + + existingHash := fmt.Sprintf("%x", bin.ComputeHash(data)) + if existingHash == bin.WorkerHash { + + logger.Debug("Worker binary already exists and is up to date") + workerBinaryInitialized = true + return nil + } + logger.Info("Worker binary hash mismatch, updating...") + } + + if err := os.MkdirAll(filepath.Dir(binaryPath), 0755); err != nil { + return fmt.Errorf("failed to create directory for worker binary: %w", err) + } + + logger.Info("Extracting worker binary to %s", binaryPath) + + if err := os.WriteFile(binaryPath, bin.WorkerBinary, 0755); err != nil { + return fmt.Errorf("failed to write worker binary: %w", err) + } + + logger.Info("Worker binary extracted successfully") + workerBinaryInitialized = true + return nil +} + +func (w *Worker) buildArgs() []string { + args := []string{ + "--host", w.args.Host, + "--port", strconv.Itoa(w.args.Port), + "--log-level", w.args.LogLevel, + } + + if w.args.ModelDir != "" { + args = append(args, "--model-dir", w.args.ModelDir) + } else if w.args.ModelPath != "" { + args = append(args, "--model-path", w.args.ModelPath) + if w.args.LexicalPath != "" { + args = append(args, "--lexical-shortlist-path", w.args.LexicalPath) + } + for _, vocabPath := range w.args.VocabPaths { + args = append(args, "--vocabulary-path", vocabPath) + } + } + + if w.args.EnableGRPC { + args = append(args, "--enable-grpc", "true") + } else { + args = append(args, "--enable-grpc", "false") + } + + if w.args.EnableHTTP { + args = append(args, "--enable-http", "true") + } else { + args = append(args, "--enable-http", "false") + } + + if w.args.EnableWebSocket { + args = append(args, "--enable-websocket", "true") + } else { + args = append(args, "--enable-websocket", "false") + } + + if w.args.GRPCUnixSocket != "" { + args = append(args, "--grpc-unix-socket", w.args.GRPCUnixSocket) + } + + return args +} + +func (w *Worker) Start() error { + w.mu.Lock() + defer w.mu.Unlock() + + if w.running && w.cmd != nil && w.cmd.Process != nil { + return fmt.Errorf("worker already running") + } + + if _, err := os.Stat(w.binaryPath); err != nil { + return fmt.Errorf("worker binary not found at %s: %w", w.binaryPath, err) + } + + args := w.buildArgs() + + logger.Debug("Starting worker %s on port %d", w.id, w.args.Port) + + cmd := exec.Command(w.binaryPath, args...) + cmd.Dir = w.args.WorkDir + + stdoutPipe, err := cmd.StdoutPipe() + if err != nil { + return fmt.Errorf("failed to create stdout pipe: %w", err) + } + stderrPipe, err := cmd.StderrPipe() + if err != nil { + return fmt.Errorf("failed to create stderr pipe: %w", err) + } + + if err := cmd.Start(); err != nil { + return fmt.Errorf("failed to start worker: %w", err) + } + + w.cmd = cmd + w.running = true + w.pid = cmd.Process.Pid + + w.wg.Add(3) + go w.collectLogs(stdoutPipe, "INFO") + go w.collectLogs(stderrPipe, "ERROR") + go w.monitorProcess() + + logger.Debug("Worker %s started with PID %d", w.id, w.pid) + return nil +} + +func (w *Worker) monitorProcess() { + defer w.wg.Done() + + err := w.cmd.Wait() + + w.mu.Lock() + defer w.mu.Unlock() + + if w.running { + w.running = false + w.pid = 0 + if err != nil { + logger.Warn("Worker %s process exited unexpectedly: %v", w.id, err) + } else { + logger.Info("Worker %s process exited normally", w.id) + } + } +} + +func (w *Worker) Stop() error { + w.mu.Lock() + + if !w.running || w.cmd == nil || w.cmd.Process == nil { + w.mu.Unlock() + return fmt.Errorf("worker not running") + } + + logger.Debug("Stopping worker %s", w.id) + + if err := w.cmd.Process.Signal(syscall.SIGTERM); err != nil { + logger.Warn("Failed to send SIGTERM to worker: %v", err) + } + w.mu.Unlock() + + timeout := time.After(10 * time.Second) + ticker := time.NewTicker(100 * time.Millisecond) + defer ticker.Stop() + + for { + select { + case <-timeout: + w.mu.Lock() + if w.running && w.cmd != nil && w.cmd.Process != nil { + logger.Warn("Worker %s stop timeout, forcing kill", w.id) + if err := w.cmd.Process.Kill(); err != nil { + logger.Warn("Failed to kill worker: %v", err) + } + } + w.mu.Unlock() + time.Sleep(500 * time.Millisecond) + return fmt.Errorf("worker stop timeout, forced kill") + case <-ticker.C: + w.mu.RLock() + stillRunning := w.running + w.mu.RUnlock() + + if !stillRunning { + logger.Debug("Worker %s stopped", w.id) + return nil + } + } + } +} + +func (w *Worker) Restart() error { + if err := w.Stop(); err != nil { + logger.Warn("Failed to stop worker during restart: %v", err) + } + + time.Sleep(500 * time.Millisecond) + + return w.Start() +} + +func (w *Worker) Status() string { + w.mu.RLock() + defer w.mu.RUnlock() + + if !w.running || w.cmd == nil || w.cmd.Process == nil { + return "not_started" + } + + return "running" +} + +func (w *Worker) Logs() []string { + w.logMu.RLock() + defer w.logMu.RUnlock() + + logsCopy := make([]string, len(w.logs)) + copy(logsCopy, w.logs) + return logsCopy +} + +func (w *Worker) collectLogs(pipe io.ReadCloser, logType string) { + defer w.wg.Done() + defer pipe.Close() + + scanner := bufio.NewScanner(pipe) + for scanner.Scan() { + select { + case <-w.done: + return + default: + w.logMu.Lock() + logLine := fmt.Sprintf("[%s] [%s] %s", + time.Now().Format("2006-01-02 15:04:05"), logType, scanner.Text()) + w.logs = append(w.logs, logLine) + if len(w.logs) > w.maxLogs { + w.logs = w.logs[len(w.logs)-w.maxLogs:] + } + w.logMu.Unlock() + } + } +} + +func (w *Worker) IsRunning() bool { + return w.Status() == "running" +} + +func (w *Worker) Signal(sig syscall.Signal) error { + w.mu.Lock() + defer w.mu.Unlock() + + if !w.running || w.cmd == nil || w.cmd.Process == nil { + return fmt.Errorf("worker not found") + } + + return w.cmd.Process.Signal(sig) +} + +func (w *Worker) Cleanup() error { + var errs []error + + w.mu.Lock() + if w.running && w.cmd != nil && w.cmd.Process != nil { + logger.Debug("Stopping worker %s during cleanup", w.id) + if err := w.cmd.Process.Signal(syscall.SIGTERM); err != nil { + logger.Warn("Failed to send SIGTERM during cleanup: %v", err) + } + w.mu.Unlock() + + timeout := time.After(5 * time.Second) + ticker := time.NewTicker(100 * time.Millisecond) + defer ticker.Stop() + + waitLoop: + for { + select { + case <-timeout: + w.mu.Lock() + if w.running && w.cmd != nil && w.cmd.Process != nil { + logger.Warn("Worker %s cleanup timeout, forcing kill", w.id) + if err := w.cmd.Process.Kill(); err != nil { + logger.Warn("Failed to kill worker during cleanup: %v", err) + errs = append(errs, fmt.Errorf("failed to kill worker: %w", err)) + } + } + w.mu.Unlock() + time.Sleep(500 * time.Millisecond) + break waitLoop + case <-ticker.C: + w.mu.RLock() + stillRunning := w.running + w.mu.RUnlock() + + if !stillRunning { + break waitLoop + } + } + } + + w.mu.Lock() + } else { + logger.Debug("Worker %s not running during cleanup", w.id) + } + + select { + case <-w.done: + default: + close(w.done) + } + w.mu.Unlock() + + w.wg.Wait() + + if len(errs) > 0 { + return fmt.Errorf("cleanup errors: %v", errs) + } + + return nil +} diff --git a/src/mtran/vendor/mtranserver/deprecated/go/internal/manager/daemon_panic_test.go b/src/mtran/vendor/mtranserver/deprecated/go/internal/manager/daemon_panic_test.go new file mode 100644 index 0000000..8185c94 --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/go/internal/manager/daemon_panic_test.go @@ -0,0 +1,180 @@ +package manager_test + +import ( + "testing" + "time" + + "github.com/xxnuo/MTranServer/internal/manager" + "github.com/xxnuo/MTranServer/internal/utils" +) + +func TestWorkerPanicRecovery(t *testing.T) { + if testing.Short() { + t.Skip("Skipping integration test in short mode") + } + + port, err := utils.GetFreePort() + if err != nil { + t.Fatalf("Failed to get free port: %v", err) + } + + args := manager.NewWorkerArgs() + args.Port = port + args.Host = "127.0.0.1" + args.EnableWebSocket = true + + worker := manager.NewWorker(args) + defer worker.Cleanup() + + if err := worker.Start(); err != nil { + t.Fatalf("Failed to start worker: %v", err) + } + time.Sleep(1 * time.Second) + + if !worker.IsRunning() { + t.Fatal("Worker should be running") + } + + if err := worker.Stop(); err != nil { + t.Logf("Stop returned error (may be expected): %v", err) + } + time.Sleep(500 * time.Millisecond) + + if err := worker.Start(); err != nil { + t.Fatalf("Failed to restart worker after stop: %v", err) + } + time.Sleep(1 * time.Second) + + if !worker.IsRunning() { + t.Fatal("Worker should be running after restart") + } + + t.Log("Worker successfully recovered from panic scenario") +} + +func TestMultipleStopStartCycles(t *testing.T) { + if testing.Short() { + t.Skip("Skipping integration test in short mode") + } + + port, err := utils.GetFreePort() + if err != nil { + t.Fatalf("Failed to get free port: %v", err) + } + + args := manager.NewWorkerArgs() + args.Port = port + args.Host = "127.0.0.1" + args.EnableWebSocket = true + + worker := manager.NewWorker(args) + defer worker.Cleanup() + + cycles := 5 + for i := 0; i < cycles; i++ { + t.Logf("Cycle %d: Starting worker", i+1) + if err := worker.Start(); err != nil { + t.Fatalf("Cycle %d: Failed to start worker: %v", i+1, err) + } + time.Sleep(500 * time.Millisecond) + + if !worker.IsRunning() { + t.Fatalf("Cycle %d: Worker should be running", i+1) + } + + t.Logf("Cycle %d: Stopping worker", i+1) + if err := worker.Stop(); err != nil { + t.Logf("Cycle %d: Stop returned error: %v", i+1, err) + } + time.Sleep(500 * time.Millisecond) + + status := worker.Status() + if status == "running" { + t.Fatalf("Cycle %d: Worker should not be running after stop, status: %s", i+1, status) + } + } + + t.Logf("Successfully completed %d stop/start cycles", cycles) +} + +func TestRestartUnderLoad(t *testing.T) { + if testing.Short() { + t.Skip("Skipping integration test in short mode") + } + + port, err := utils.GetFreePort() + if err != nil { + t.Fatalf("Failed to get free port: %v", err) + } + + args := manager.NewWorkerArgs() + args.Port = port + args.Host = "127.0.0.1" + args.EnableWebSocket = true + + worker := manager.NewWorker(args) + defer worker.Cleanup() + + if err := worker.Start(); err != nil { + t.Fatalf("Failed to start worker: %v", err) + } + time.Sleep(1 * time.Second) + + restarts := 3 + for i := 0; i < restarts; i++ { + t.Logf("Restart attempt %d", i+1) + if err := worker.Restart(); err != nil { + t.Fatalf("Restart %d failed: %v", i+1, err) + } + time.Sleep(1 * time.Second) + + if !worker.IsRunning() { + t.Fatalf("Worker should be running after restart %d", i+1) + } + } + + t.Logf("Successfully completed %d restarts", restarts) +} + +func TestCleanupAfterPanic(t *testing.T) { + if testing.Short() { + t.Skip("Skipping integration test in short mode") + } + + port, err := utils.GetFreePort() + if err != nil { + t.Fatalf("Failed to get free port: %v", err) + } + + args := manager.NewWorkerArgs() + args.Port = port + args.Host = "127.0.0.1" + args.EnableWebSocket = true + + worker := manager.NewWorker(args) + + if err := worker.Start(); err != nil { + t.Fatalf("Failed to start worker: %v", err) + } + time.Sleep(1 * time.Second) + + if err := worker.Cleanup(); err != nil { + t.Logf("Cleanup returned error (may be expected on Windows): %v", err) + } + + time.Sleep(500 * time.Millisecond) + + worker2 := manager.NewWorker(args) + defer worker2.Cleanup() + + if err := worker2.Start(); err != nil { + t.Fatalf("Failed to start new worker with same ID after cleanup: %v", err) + } + time.Sleep(1 * time.Second) + + if !worker2.IsRunning() { + t.Fatal("Second worker should be running") + } + + t.Log("Successfully cleaned up and restarted worker with same ID") +} diff --git a/src/mtran/vendor/mtranserver/deprecated/go/internal/manager/daemon_race_test.go b/src/mtran/vendor/mtranserver/deprecated/go/internal/manager/daemon_race_test.go new file mode 100644 index 0000000..7e6ecb6 --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/go/internal/manager/daemon_race_test.go @@ -0,0 +1,394 @@ +package manager_test + +import ( + "context" + "sync" + "testing" + "time" + + "github.com/stretchr/testify/assert" + "github.com/xxnuo/MTranServer/internal/manager" + "github.com/xxnuo/MTranServer/internal/utils" +) + +func TestWorker_ConcurrentStartStop(t *testing.T) { + if testing.Short() { + t.Skip("Skipping race condition test in short mode") + } + + args := manager.NewWorkerArgs() + port, err := utils.GetFreePort() + if err != nil { + t.Fatalf("Failed to get free port: %v", err) + } + args.Port = port + args.Host = "127.0.0.1" + args.EnableWebSocket = true + args.LogLevel = "error" + + worker := manager.NewWorker(args) + defer worker.Cleanup() + + var wg sync.WaitGroup + for range 10 { + wg.Add(1) + go func() { + defer wg.Done() + worker.Start() + time.Sleep(50 * time.Millisecond) + }() + } + + wg.Wait() + time.Sleep(500 * time.Millisecond) + + worker.Stop() +} + +func TestWorker_ConcurrentStatusCheck(t *testing.T) { + if testing.Short() { + t.Skip("Skipping race condition test in short mode") + } + + args := manager.NewWorkerArgs() + port, err := utils.GetFreePort() + if err != nil { + t.Fatalf("Failed to get free port: %v", err) + } + args.Port = port + args.Host = "127.0.0.1" + args.EnableWebSocket = true + args.LogLevel = "error" + + worker := manager.NewWorker(args) + defer worker.Cleanup() + + err = worker.Start() + if err != nil { + t.Fatalf("Failed to start worker: %v", err) + } + + var wg sync.WaitGroup + for range 20 { + wg.Add(1) + go func() { + defer wg.Done() + for range 10 { + _ = worker.Status() + _ = worker.IsRunning() + _ = worker.Status() + _ = worker.Logs() + time.Sleep(10 * time.Millisecond) + } + }() + } + + wg.Wait() + worker.Stop() +} + +func TestWorker_ConcurrentRestart(t *testing.T) { + if testing.Short() { + t.Skip("Skipping race condition test in short mode") + } + + args := manager.NewWorkerArgs() + port, err := utils.GetFreePort() + if err != nil { + t.Fatalf("Failed to get free port: %v", err) + } + args.Port = port + args.Host = "127.0.0.1" + args.EnableWebSocket = true + args.LogLevel = "error" + + worker := manager.NewWorker(args) + defer worker.Cleanup() + + err = worker.Start() + if err != nil { + t.Fatalf("Failed to start worker: %v", err) + } + time.Sleep(500 * time.Millisecond) + + for range 3 { + err = worker.Restart() + if err != nil { + t.Logf("Restart error (may be expected): %v", err) + } + time.Sleep(500 * time.Millisecond) + } + + if worker.IsRunning() { + worker.Stop() + } +} + +func TestWorker_StartStopCycle(t *testing.T) { + if testing.Short() { + t.Skip("Skipping race condition test in short mode") + } + + args := manager.NewWorkerArgs() + port, err := utils.GetFreePort() + if err != nil { + t.Fatalf("Failed to get free port: %v", err) + } + args.Port = port + args.Host = "127.0.0.1" + args.EnableWebSocket = true + args.LogLevel = "error" + + worker := manager.NewWorker(args) + defer worker.Cleanup() + + for range 5 { + err := worker.Start() + if err != nil { + t.Logf("Start error (expected on concurrent calls): %v", err) + } + time.Sleep(300 * time.Millisecond) + + if worker.IsRunning() { + err = worker.Stop() + if err != nil { + t.Logf("Stop error: %v", err) + } + } + time.Sleep(200 * time.Millisecond) + } +} + +func TestWorker_CleanupWhileRunning(t *testing.T) { + if testing.Short() { + t.Skip("Skipping race condition test in short mode") + } + + args := manager.NewWorkerArgs() + port, err := utils.GetFreePort() + if err != nil { + t.Fatalf("Failed to get free port: %v", err) + } + args.Port = port + args.Host = "127.0.0.1" + args.EnableWebSocket = true + args.LogLevel = "error" + + worker := manager.NewWorker(args) + + err = worker.Start() + if err != nil { + t.Fatalf("Failed to start worker: %v", err) + } + + time.Sleep(300 * time.Millisecond) + + err = worker.Cleanup() + assert.NoError(t, err) +} + +func TestWorker_MultipleCleanup(t *testing.T) { + if testing.Short() { + t.Skip("Skipping race condition test in short mode") + } + + args := manager.NewWorkerArgs() + port, err := utils.GetFreePort() + if err != nil { + t.Fatalf("Failed to get free port: %v", err) + } + args.Port = port + args.Host = "127.0.0.1" + args.EnableWebSocket = true + args.LogLevel = "error" + + worker := manager.NewWorker(args) + + err = worker.Start() + if err != nil { + t.Fatalf("Failed to start worker: %v", err) + } + time.Sleep(300 * time.Millisecond) + + var wg sync.WaitGroup + for range 3 { + wg.Add(1) + go func() { + defer wg.Done() + worker.Cleanup() + }() + } + + wg.Wait() +} + +func TestWorker_LogCollectionDuringCleanup(t *testing.T) { + if testing.Short() { + t.Skip("Skipping race condition test in short mode") + } + + args := manager.NewWorkerArgs() + port, err := utils.GetFreePort() + if err != nil { + t.Fatalf("Failed to get free port: %v", err) + } + args.Port = port + args.Host = "127.0.0.1" + args.EnableWebSocket = true + args.LogLevel = "debug" + + worker := manager.NewWorker(args) + + err = worker.Start() + if err != nil { + t.Fatalf("Failed to start worker: %v", err) + } + + var wg sync.WaitGroup + done := make(chan struct{}) + + wg.Add(1) + go func() { + defer wg.Done() + for { + select { + case <-done: + return + default: + _ = worker.Logs() + time.Sleep(10 * time.Millisecond) + } + } + }() + + time.Sleep(500 * time.Millisecond) + + err = worker.Cleanup() + assert.NoError(t, err) + + close(done) + wg.Wait() +} + +func TestManager_ConcurrentCompute(t *testing.T) { + if testing.Short() { + t.Skip("Skipping race condition test in short mode") + } + + args := manager.NewWorkerArgs() + port, err := utils.GetFreePort() + if err != nil { + t.Fatalf("Failed to get free port: %v", err) + } + args.Port = port + args.Host = "127.0.0.1" + args.EnableWebSocket = true + args.LogLevel = "error" + + mgr := manager.NewManager(args) + defer mgr.Cleanup() + + err = mgr.Start() + if err != nil { + t.Fatalf("Failed to start manager: %v", err) + } + + var wg sync.WaitGroup + for range 10 { + wg.Add(1) + go func() { + defer wg.Done() + ctx := context.Background() + _, _ = mgr.Translate(ctx, "test") + }() + } + + wg.Wait() + mgr.Stop() +} + +func TestManager_ConcurrentStartStop(t *testing.T) { + if testing.Short() { + t.Skip("Skipping race condition test in short mode") + } + + args := manager.NewWorkerArgs() + port, err := utils.GetFreePort() + if err != nil { + t.Fatalf("Failed to get free port: %v", err) + } + args.Port = port + args.Host = "127.0.0.1" + args.EnableWebSocket = true + args.LogLevel = "error" + + mgr := manager.NewManager(args) + defer mgr.Cleanup() + + var wg sync.WaitGroup + for range 5 { + wg.Add(1) + go func() { + defer wg.Done() + mgr.Start() + time.Sleep(100 * time.Millisecond) + }() + } + + wg.Wait() + time.Sleep(500 * time.Millisecond) + + mgr.Stop() +} + +func TestManager_StatusChecksDuringRestart(t *testing.T) { + if testing.Short() { + t.Skip("Skipping race condition test in short mode") + } + + args := manager.NewWorkerArgs() + port, err := utils.GetFreePort() + if err != nil { + t.Fatalf("Failed to get free port: %v", err) + } + args.Port = port + args.Host = "127.0.0.1" + args.EnableWebSocket = true + args.LogLevel = "error" + + mgr := manager.NewManager(args) + defer mgr.Cleanup() + + err = mgr.Start() + if err != nil { + t.Fatalf("Failed to start manager: %v", err) + } + + var wg sync.WaitGroup + done := make(chan struct{}) + + wg.Add(1) + go func() { + defer wg.Done() + for { + select { + case <-done: + return + default: + _ = mgr.IsRunning() + _ = mgr.Status() + _ = mgr.Logs() + time.Sleep(10 * time.Millisecond) + } + } + }() + + time.Sleep(200 * time.Millisecond) + mgr.Restart() + time.Sleep(200 * time.Millisecond) + + close(done) + wg.Wait() + + mgr.Stop() +} diff --git a/src/mtran/vendor/mtranserver/deprecated/go/internal/manager/daemon_stress_test.go b/src/mtran/vendor/mtranserver/deprecated/go/internal/manager/daemon_stress_test.go new file mode 100644 index 0000000..a1c46d1 --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/go/internal/manager/daemon_stress_test.go @@ -0,0 +1,381 @@ +package manager_test + +import ( + "sync" + "testing" + "time" + + "github.com/xxnuo/MTranServer/internal/manager" + "github.com/xxnuo/MTranServer/internal/utils" +) + +func TestWorker_StressStartStop(t *testing.T) { + if testing.Short() { + t.Skip("Skipping stress test in short mode") + } + + args := manager.NewWorkerArgs() + port, err := utils.GetFreePort() + if err != nil { + t.Fatalf("Failed to get free port: %v", err) + } + args.Port = port + args.Host = "127.0.0.1" + args.EnableWebSocket = true + args.LogLevel = "error" + + worker := manager.NewWorker(args) + defer worker.Cleanup() + + iterations := 20 + for i := range iterations { + t.Logf("Iteration %d/%d", i+1, iterations) + + err := worker.Start() + if err != nil { + t.Logf("Start error: %v", err) + } + + time.Sleep(200 * time.Millisecond) + + if worker.IsRunning() { + err = worker.Stop() + if err != nil { + t.Errorf("Stop error at iteration %d: %v", i+1, err) + } + } + + time.Sleep(100 * time.Millisecond) + } +} + +func TestWorker_StressRestart(t *testing.T) { + if testing.Short() { + t.Skip("Skipping stress test in short mode") + } + + args := manager.NewWorkerArgs() + port, err := utils.GetFreePort() + if err != nil { + t.Fatalf("Failed to get free port: %v", err) + } + args.Port = port + args.Host = "127.0.0.1" + args.EnableWebSocket = true + args.LogLevel = "error" + + worker := manager.NewWorker(args) + defer worker.Cleanup() + + err = worker.Start() + if err != nil { + t.Fatalf("Failed initial start: %v", err) + } + time.Sleep(500 * time.Millisecond) + + iterations := 15 + for i := range iterations { + t.Logf("Restart %d/%d", i+1, iterations) + + err := worker.Restart() + if err != nil { + t.Errorf("Restart error at iteration %d: %v", i+1, err) + } + + time.Sleep(300 * time.Millisecond) + } + + if worker.IsRunning() { + worker.Stop() + } +} + +func TestWorker_StressMultipleWorkers(t *testing.T) { + if testing.Short() { + t.Skip("Skipping stress test in short mode") + } + + workerCount := 5 + workers := make([]*manager.Worker, 0, workerCount) + + for i := range workerCount { + port, err := utils.GetFreePort() + if err != nil { + t.Fatalf("Failed to get free port: %v", err) + } + + args := manager.NewWorkerArgs() + args.Port = port + args.Host = "127.0.0.1" + args.EnableWebSocket = true + args.LogLevel = "error" + + worker := manager.NewWorker(args) + workers = append(workers, worker) + + err = worker.Start() + if err != nil { + t.Errorf("Failed to start worker %d: %v", i, err) + } + t.Logf("Worker %d started on port %d", i, port) + } + + time.Sleep(1 * time.Second) + + var wg sync.WaitGroup + for i, w := range workers { + wg.Add(1) + go func(idx int, worker *manager.Worker) { + defer wg.Done() + + for range 5 { + _ = worker.Status() + _ = worker.Logs() + time.Sleep(50 * time.Millisecond) + } + + if worker.IsRunning() { + err := worker.Stop() + if err != nil { + t.Logf("Worker %d stop error: %v", idx, err) + } + } + + err := worker.Cleanup() + if err != nil { + t.Logf("Worker %d cleanup error: %v", idx, err) + } + }(i, w) + } + + wg.Wait() +} + +func TestManager_StressStartStopCycle(t *testing.T) { + if testing.Short() { + t.Skip("Skipping stress test in short mode") + } + + args := manager.NewWorkerArgs() + port, err := utils.GetFreePort() + if err != nil { + t.Fatalf("Failed to get free port: %v", err) + } + args.Port = port + args.Host = "127.0.0.1" + args.EnableWebSocket = true + args.LogLevel = "error" + + mgr := manager.NewManager(args) + defer mgr.Cleanup() + + iterations := 10 + for i := range iterations { + t.Logf("Manager cycle %d/%d", i+1, iterations) + + err := mgr.Start() + if err != nil { + t.Errorf("Start error at iteration %d: %v", i+1, err) + } + + time.Sleep(300 * time.Millisecond) + + if mgr.IsRunning() { + err = mgr.Stop() + if err != nil { + t.Errorf("Stop error at iteration %d: %v", i+1, err) + } + } + + time.Sleep(200 * time.Millisecond) + } +} + +func TestManager_StressRestart(t *testing.T) { + if testing.Short() { + t.Skip("Skipping stress test in short mode") + } + + args := manager.NewWorkerArgs() + port, err := utils.GetFreePort() + if err != nil { + t.Fatalf("Failed to get free port: %v", err) + } + args.Port = port + args.Host = "127.0.0.1" + args.EnableWebSocket = true + args.LogLevel = "error" + + mgr := manager.NewManager(args) + defer mgr.Cleanup() + + err = mgr.Start() + if err != nil { + t.Fatalf("Failed initial start: %v", err) + } + time.Sleep(500 * time.Millisecond) + + iterations := 10 + for i := range iterations { + t.Logf("Manager restart %d/%d", i+1, iterations) + + err := mgr.Restart() + if err != nil { + t.Errorf("Restart error at iteration %d: %v", i+1, err) + } + + time.Sleep(400 * time.Millisecond) + } + + if mgr.IsRunning() { + mgr.Stop() + } +} + +func TestWorker_StressConcurrentOperations(t *testing.T) { + if testing.Short() { + t.Skip("Skipping stress test in short mode") + } + + args := manager.NewWorkerArgs() + port, err := utils.GetFreePort() + if err != nil { + t.Fatalf("Failed to get free port: %v", err) + } + args.Port = port + args.Host = "127.0.0.1" + args.EnableWebSocket = true + args.LogLevel = "error" + + worker := manager.NewWorker(args) + defer worker.Cleanup() + + err = worker.Start() + if err != nil { + t.Fatalf("Failed to start worker: %v", err) + } + time.Sleep(500 * time.Millisecond) + + var wg sync.WaitGroup + done := make(chan struct{}) + + for range 5 { + wg.Add(1) + go func() { + defer wg.Done() + for { + select { + case <-done: + return + default: + _ = worker.Status() + time.Sleep(10 * time.Millisecond) + } + } + }() + } + + for range 3 { + wg.Add(1) + go func() { + defer wg.Done() + for { + select { + case <-done: + return + default: + _ = worker.Logs() + time.Sleep(20 * time.Millisecond) + } + } + }() + } + + for range 2 { + wg.Add(1) + go func() { + defer wg.Done() + for { + select { + case <-done: + return + default: + _ = worker.Status() + time.Sleep(30 * time.Millisecond) + } + } + }() + } + + time.Sleep(3 * time.Second) + close(done) + wg.Wait() + + if worker.IsRunning() { + worker.Stop() + } +} + +func TestManager_StressMultipleInstances(t *testing.T) { + if testing.Short() { + t.Skip("Skipping stress test in short mode") + } + + managerCount := 3 + managers := make([]*manager.Manager, 0, managerCount) + + for i := range managerCount { + port, err := utils.GetFreePort() + if err != nil { + t.Fatalf("Failed to get free port: %v", err) + } + + args := manager.NewWorkerArgs() + args.Port = port + args.Host = "127.0.0.1" + args.EnableWebSocket = true + args.LogLevel = "error" + + mgr := manager.NewManager(args) + managers = append(managers, mgr) + + err = mgr.Start() + if err != nil { + t.Errorf("Failed to start manager %d: %v", i, err) + } + t.Logf("Manager %d started on port %d", i, port) + + time.Sleep(500 * time.Millisecond) + } + + time.Sleep(1 * time.Second) + + var wg sync.WaitGroup + for i, m := range managers { + wg.Add(1) + go func(idx int, mgr *manager.Manager) { + defer wg.Done() + + for range 3 { + _ = mgr.IsRunning() + _ = mgr.Status() + _ = mgr.Logs() + time.Sleep(100 * time.Millisecond) + } + + if mgr.IsRunning() { + err := mgr.Stop() + if err != nil { + t.Logf("Manager %d stop error: %v", idx, err) + } + } + + err := mgr.Cleanup() + if err != nil { + t.Logf("Manager %d cleanup error: %v", idx, err) + } + }(i, m) + } + + wg.Wait() +} diff --git a/src/mtran/vendor/mtranserver/deprecated/go/internal/manager/daemon_test.go b/src/mtran/vendor/mtranserver/deprecated/go/internal/manager/daemon_test.go new file mode 100644 index 0000000..03f8f73 --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/go/internal/manager/daemon_test.go @@ -0,0 +1,219 @@ +package manager_test + +import ( + "os" + "path/filepath" + "runtime" + "testing" + "time" + + "github.com/xxnuo/MTranServer/bin" + "github.com/xxnuo/MTranServer/internal/manager" + "github.com/xxnuo/MTranServer/internal/utils" +) + +func TestBasicUsage(t *testing.T) { + if testing.Short() { + t.Skip("Skipping integration test in short mode") + } + + args := manager.NewWorkerArgs() + args.Host = "127.0.0.1" + port, err := utils.GetFreePort() + if err != nil { + t.Fatalf("Failed to get free port: %v", err) + } + args.Port = port + args.EnableWebSocket = true + args.EnableHTTP = true + args.LogLevel = "debug" + args.WorkDir = "." + + worker := manager.NewWorker(args) + defer worker.Cleanup() + + if err := worker.Start(); err != nil { + t.Logf("Failed to start worker: %v\n", err) + t.Fatalf("Failed to start worker: %v", err) + } + + time.Sleep(2 * time.Second) + + status := worker.Status() + t.Logf("Worker status: %s\n", status) + + if worker.IsRunning() { + t.Log("Worker is running") + } + + logs := worker.Logs() + t.Logf("Collected %d log lines\n", len(logs)) + for _, log := range logs { + t.Log(log) + } + + if err := worker.Restart(); err != nil { + t.Logf("Failed to restart worker: %v\n", err) + t.Fatalf("Failed to restart worker: %v", err) + } + + time.Sleep(2 * time.Second) + + if err := worker.Stop(); err != nil { + t.Logf("Failed to stop worker: %v\n", err) + t.Fatalf("Failed to stop worker: %v", err) + } + + t.Log("Worker stopped successfully") +} + +func TestLifecycle(t *testing.T) { + if testing.Short() { + t.Skip("Skipping integration test in short mode") + } + + args := manager.NewWorkerArgs() + port, err := utils.GetFreePort() + if err != nil { + t.Fatalf("Failed to get free port: %v", err) + } + args.Port = port + + worker := manager.NewWorker(args) + defer worker.Cleanup() + + worker.Start() + time.Sleep(1 * time.Second) + + t.Log("Status:", worker.Status()) + + worker.Stop() + time.Sleep(500 * time.Millisecond) + + t.Log("Status after stop:", worker.Status()) +} + +func TestWorkerHash(t *testing.T) { + + if bin.WorkerHash == "" { + t.Fatal("WorkerHash should not be empty") + } + + if len(bin.WorkerHash) != 64 { + t.Fatalf("WorkerHash should be 64 characters (SHA256), got %d", len(bin.WorkerHash)) + } + + t.Logf("Worker binary hash: %s", bin.WorkerHash) + t.Logf("Worker binary size: %d bytes", len(bin.WorkerBinary)) + + args := manager.NewWorkerArgs() + port, err := utils.GetFreePort() + if err != nil { + t.Fatalf("Failed to get free port: %v", err) + } + args.Port = port + worker := manager.NewWorker(args) + defer worker.Cleanup() + + if err := worker.Start(); err != nil { + t.Fatalf("Failed to start worker on first attempt: %v", err) + } + time.Sleep(1 * time.Second) + worker.Stop() + time.Sleep(500 * time.Millisecond) + + if err := worker.Start(); err != nil { + t.Fatalf("Failed to start worker on second attempt: %v", err) + } + time.Sleep(1 * time.Second) + worker.Stop() + time.Sleep(500 * time.Millisecond) + + t.Log("Worker hash verification successful") +} + +func TestCustomBinaryPath(t *testing.T) { + if testing.Short() { + t.Skip("Skipping integration test in short mode") + } + + customPath := filepath.Join(os.TempDir(), "custom-mtran-worker") + if runtime.GOOS == "windows" { + customPath += ".exe" + } + if err := os.WriteFile(customPath, bin.WorkerBinary, 0755); err != nil { + t.Fatalf("Failed to create custom binary: %v", err) + } + defer os.Remove(customPath) + + args := manager.NewWorkerArgs() + port, err := utils.GetFreePort() + if err != nil { + t.Fatalf("Failed to get free port: %v", err) + } + args.Port = port + args.BinaryPath = customPath + worker := manager.NewWorker(args) + defer worker.Cleanup() + + if err := worker.Start(); err != nil { + t.Fatalf("Failed to start worker with custom binary path: %v", err) + } + time.Sleep(1 * time.Second) + + if !worker.IsRunning() { + t.Fatal("Worker should be running") + } + + worker.Stop() + time.Sleep(500 * time.Millisecond) + t.Log("Worker with custom binary path stopped successfully") +} + +func TestMultipleWorkers(t *testing.T) { + if testing.Short() { + t.Skip("Skipping integration test in short mode") + } + + workers := make([]*manager.Worker, 0, 3) + + for i := 0; i < 3; i++ { + port, err := utils.GetFreePort() + if err != nil { + t.Fatalf("Failed to get free port: %v", err) + } + + args := manager.NewWorkerArgs() + args.Port = port + args.Host = "127.0.0.1" + args.EnableWebSocket = true + + worker := manager.NewWorker(args) + workers = append(workers, worker) + + if err := worker.Start(); err != nil { + t.Fatalf("Failed to start worker %d: %v", i, err) + } + t.Logf("Worker %d started on port %d", i, port) + } + + time.Sleep(2 * time.Second) + + for i, worker := range workers { + if !worker.IsRunning() { + t.Errorf("Worker %d should be running", i) + } + t.Logf("Worker %d: Status=%s", i, worker.Status()) + } + + for i, worker := range workers { + if err := worker.Stop(); err != nil { + t.Errorf("Failed to stop worker %d: %v", i, err) + } + worker.Cleanup() + t.Logf("Worker %d stopped", i) + } + + time.Sleep(500 * time.Millisecond) + t.Log("All workers stopped successfully") +} diff --git a/src/mtran/vendor/mtranserver/deprecated/go/internal/manager/manager.go b/src/mtran/vendor/mtranserver/deprecated/go/internal/manager/manager.go new file mode 100644 index 0000000..9f4bbcc --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/go/internal/manager/manager.go @@ -0,0 +1,422 @@ +package manager + +import ( + "context" + "fmt" + "strings" + "sync" + "time" + + "github.com/xxnuo/MTranServer/internal/logger" +) + +const ( + StateStopped = 0 + StateStarting = 1 + StateRunning = 2 + StateRestarting = 3 +) + +type Manager struct { + worker *Worker + client *Client + mu sync.RWMutex + url string + taskQueue chan struct{} // Token bucket for serializing tasks + closed bool + state int +} + +type ManagerOption func(*Manager) + +func NewManager(args *WorkerArgs, opts ...ManagerOption) *Manager { + + url := fmt.Sprintf("ws://%s:%d/ws", args.Host, args.Port) + + m := &Manager{ + worker: NewWorker(args), + url: url, + taskQueue: make(chan struct{}, 1), + state: StateStopped, + } + + for _, opt := range opts { + opt(m) + } + + return m +} + +func (m *Manager) Start() error { + m.mu.Lock() + if m.state != StateStopped { + m.mu.Unlock() + return fmt.Errorf("manager is not in stopped state") + } + m.state = StateStarting + + if err := m.worker.Start(); err != nil { + m.state = StateStopped + m.mu.Unlock() + return fmt.Errorf("failed to start worker: %w", err) + } + m.mu.Unlock() + + timeout := time.After(10 * time.Second) + ticker := time.NewTicker(100 * time.Millisecond) + defer ticker.Stop() + + var connected bool + var client *Client + + for { + select { + case <-timeout: + m.Stop() + return fmt.Errorf("worker start timeout") + case <-ticker.C: + if m.worker.IsRunning() { + if !connected { + client = NewClient(m.url) + if err := client.Connect(); err != nil { + // Keep retrying connection + continue + } + connected = true + } + + // Wait for worker to be stable and really ready + healthCtx, healthCancel := context.WithTimeout(context.Background(), 1*time.Second) + isHealthy, _ := client.Health(healthCtx) + healthCancel() + + if !isHealthy { + continue + } + + m.mu.Lock() + m.client = client + m.state = StateRunning + m.mu.Unlock() + return nil + } + } + } +} + +func (m *Manager) Stop() error { + m.mu.Lock() + defer m.mu.Unlock() + + m.state = StateStopped + var errs []error + + if m.client != nil { + if err := m.client.Close(); err != nil { + errs = append(errs, fmt.Errorf("failed to close client: %w", err)) + } + m.client = nil + } + + if m.worker != nil { + if err := m.worker.Stop(); err != nil { + errs = append(errs, fmt.Errorf("failed to stop worker: %w", err)) + } + } + + if len(errs) > 0 { + return fmt.Errorf("stop errors: %v", errs) + } + + return nil +} + +func (m *Manager) Restart() error { + if err := m.Stop(); err != nil { + return fmt.Errorf("failed to stop: %w", err) + } + + time.Sleep(500 * time.Millisecond) + + return m.Start() +} + +func (m *Manager) Cleanup() error { + m.mu.Lock() + m.state = StateStopped + defer m.mu.Unlock() + + var errs []error + + if m.client != nil { + if err := m.client.Close(); err != nil { + errs = append(errs, fmt.Errorf("failed to close client: %w", err)) + } + m.client = nil + } + + if m.worker != nil { + if err := m.worker.Cleanup(); err != nil { + errs = append(errs, fmt.Errorf("failed to cleanup worker: %w", err)) + } + + } + + if len(errs) > 0 { + return fmt.Errorf("cleanup errors: %v", errs) + } + + return nil +} + +func (m *Manager) IsRunning() bool { + m.mu.RLock() + defer m.mu.RUnlock() + return m.state == StateRunning && m.worker != nil && m.worker.IsRunning() && m.client != nil && m.client.IsConnected() +} + +func (m *Manager) IsHealthy(ctx context.Context) bool { + m.mu.RLock() + defer m.mu.RUnlock() + + if m.state != StateRunning || m.client == nil { + return false + } + + healthy, err := m.client.Health(ctx) + return err == nil && healthy +} + +func (m *Manager) Status() string { + m.mu.RLock() + defer m.mu.RUnlock() + + switch m.state { + case StateStopped: + return "stopped" + case StateStarting: + return "starting" + case StateRunning: + return "running" + case StateRestarting: + return "restarting" + default: + return "unknown" + } +} + +func (m *Manager) Logs() []string { + m.mu.RLock() + defer m.mu.RUnlock() + + if m.worker == nil { + return nil + } + + return m.worker.Logs() +} + +func (m *Manager) Health(ctx context.Context) (bool, error) { + m.mu.RLock() + defer m.mu.RUnlock() + + if m.client == nil { + return false, fmt.Errorf("client not initialized") + } + + return m.client.Health(ctx) +} + +func (m *Manager) Trans(ctx context.Context, req TransRequest) (string, error) { + // 1. Check state immediately + m.mu.RLock() + if m.state != StateRunning { + state := m.state + m.mu.RUnlock() + return "", fmt.Errorf("manager not running (state: %d)", state) + } + m.mu.RUnlock() + + // 2. Wait for task slot (concurrency control) + select { + case m.taskQueue <- struct{}{}: + defer func() { <-m.taskQueue }() + case <-ctx.Done(): + return "", ctx.Err() + } + + logger.Debug("Manager.Trans: text length: %d, isHTML: %v", len(req.Text), req.HTML) + m.mu.RLock() + if m.closed { + m.mu.RUnlock() + return "", fmt.Errorf("manager is closed") + } + + // Double check state after acquiring lock + if m.state != StateRunning { + m.mu.RUnlock() + return "", fmt.Errorf("manager not running (state: %d)", m.state) + } + + client := m.client + // worker := m.worker + m.mu.RUnlock() + + if client == nil { + logger.Error("Manager.Trans: client not initialized") + m.TriggerRestartAsync() + return "", fmt.Errorf("client not initialized") + } + + logger.Debug("Manager.Trans: calling client.Trans") + result, err := client.Trans(ctx, req) + if err == nil { + logger.Debug("Manager.Trans: success, result length: %d", len(result)) + return result, nil + } + logger.Debug("Manager.Trans: client.Trans error: %v", err) + + errMsg := err.Error() + isConnectionError := !client.IsConnected() || + strings.Contains(errMsg, "not connected") || + strings.Contains(errMsg, "failed to send message") || + strings.Contains(errMsg, "failed to read response") || + strings.Contains(errMsg, "module closed") || + strings.Contains(errMsg, "exit_code") || + strings.Contains(errMsg, "wasm error") || + strings.Contains(errMsg, "invalid table access") || + strings.Contains(errMsg, "Translation engine not ready") || + strings.Contains(errMsg, "code 503") + + if !isConnectionError { + return "", err + } + + // Trigger async restart and fail this request + m.TriggerRestartAsync() + return "", fmt.Errorf("worker connection failed, restarting: %w", err) +} + +func (m *Manager) TriggerRestartAsync() { + m.mu.Lock() + if m.state == StateRestarting || m.state == StateStopped { + m.mu.Unlock() + return + } + m.state = StateRestarting + m.mu.Unlock() + + go func() { + logger.Info("Async restart triggered for worker on port %d", m.worker.args.Port) + if err := m.RestartWorker(); err != nil { + logger.Error("Async restart failed: %v", err) + // Ensure we mark as stopped so it can be picked up or retried later if needed? + // or maybe we should try again? For now, leave it as stopped/failed. + m.mu.Lock() + m.state = StateStopped + m.mu.Unlock() + } else { + logger.Info("Async restart completed successfully") + } + }() +} + +// RestartWorker performs the kill-and-restart logic on the SAME port +func (m *Manager) RestartWorker() error { + // 1. Kill old worker and cleanup resources + m.mu.Lock() + oldWorker := m.worker + oldClient := m.client + + if oldClient != nil { + m.client = nil + go oldClient.Close() // Close async + } + m.mu.Unlock() + + logger.Info("Stopping old worker...") + // Force kill if necessary, make sure port is freed + if oldWorker != nil { + if err := oldWorker.Cleanup(); err != nil { + logger.Warn("Failed to cleanup old worker: %v", err) + } + } + + // Wait a bit to ensure OS releases port + time.Sleep(1 * time.Second) + + // 2. Start new worker on the SAME port (args are reused) + // We need to create a NEW worker instance because the old one holds the old cmd/process + m.mu.Lock() + newWorker := NewWorker(m.worker.args) + m.worker = newWorker + m.mu.Unlock() + + logger.Info("Starting new worker on port %d...", newWorker.args.Port) + if err := newWorker.Start(); err != nil { + return fmt.Errorf("failed to start new worker: %w", err) + } + + // 3. Wait for readiness + timeout := time.After(30 * time.Second) + ticker := time.NewTicker(200 * time.Millisecond) + defer ticker.Stop() + + var client *Client + var connected bool + + for { + select { + case <-timeout: + newWorker.Stop() + return fmt.Errorf("restart timeout waiting for worker readiness") + case <-ticker.C: + if newWorker.IsRunning() { + if !connected { + client = NewClient(m.url) // URL is unchanged + if err := client.Connect(); err != nil { + continue + } + connected = true + } + + healthCtx, healthCancel := context.WithTimeout(context.Background(), 1*time.Second) + isHealthy, _ := client.Health(healthCtx) + healthCancel() + + if isHealthy { + m.mu.Lock() + m.client = client + m.state = StateRunning + m.mu.Unlock() + return nil + } + } + } + } +} + +func (m *Manager) Exit(ctx context.Context, req ExitRequest) (*ExitResponse, error) { + m.mu.RLock() + defer m.mu.RUnlock() + + if m.client == nil { + return nil, fmt.Errorf("client not initialized") + } + + return m.client.Exit(ctx, req) +} + +func (m *Manager) Translate(ctx context.Context, text string) (string, error) { + return m.Trans(ctx, TransRequest{ + Text: text, + HTML: false, + }) +} + +func (m *Manager) TranslateHTML(ctx context.Context, html string) (string, error) { + return m.Trans(ctx, TransRequest{ + Text: html, + HTML: true, + }) +} diff --git a/src/mtran/vendor/mtranserver/deprecated/go/internal/manager/manager_test.go b/src/mtran/vendor/mtranserver/deprecated/go/internal/manager/manager_test.go new file mode 100644 index 0000000..64c562c --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/go/internal/manager/manager_test.go @@ -0,0 +1,247 @@ +package manager_test + +import ( + "context" + "testing" + "time" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "github.com/xxnuo/MTranServer/internal/manager" + "github.com/xxnuo/MTranServer/internal/utils" +) + +func TestManager_StartStop(t *testing.T) { + if testing.Short() { + t.Skip("Skipping integration test in short mode") + } + + args := manager.NewWorkerArgs() + port, err := utils.GetFreePort() + require.NoError(t, err) + args.Port = port + args.Host = "127.0.0.1" + args.EnableWebSocket = true + args.LogLevel = "debug" + + mgr := manager.NewManager(args) + defer mgr.Cleanup() + + err = mgr.Start() + require.NoError(t, err) + + assert.True(t, mgr.IsRunning()) + assert.Equal(t, "running", mgr.Status()) + + err = mgr.Stop() + require.NoError(t, err) + + assert.False(t, mgr.IsRunning()) +} + +func TestManager_Restart(t *testing.T) { + if testing.Short() { + t.Skip("Skipping integration test in short mode") + } + + args := manager.NewWorkerArgs() + port, err := utils.GetFreePort() + require.NoError(t, err) + args.Port = port + args.Host = "127.0.0.1" + args.EnableWebSocket = true + + mgr := manager.NewManager(args) + defer mgr.Cleanup() + + err = mgr.Start() + require.NoError(t, err) + assert.True(t, mgr.IsRunning()) + + err = mgr.Restart() + require.NoError(t, err) + assert.True(t, mgr.IsRunning()) + + err = mgr.Stop() + require.NoError(t, err) +} + +func TestManager_Logs(t *testing.T) { + if testing.Short() { + t.Skip("Skipping integration test in short mode") + } + + args := manager.NewWorkerArgs() + port, err := utils.GetFreePort() + require.NoError(t, err) + args.Port = port + args.Host = "127.0.0.1" + args.EnableWebSocket = true + + mgr := manager.NewManager(args) + defer mgr.Cleanup() + + err = mgr.Start() + require.NoError(t, err) + defer mgr.Stop() + + time.Sleep(1 * time.Second) + + logs := mgr.Logs() + assert.NotEmpty(t, logs) + t.Logf("Collected %d log lines", len(logs)) +} + +func TestManager_Translate(t *testing.T) { + if testing.Short() { + t.Skip("Skipping integration test in short mode") + } + + args := manager.NewWorkerArgs() + port, err := utils.GetFreePort() + require.NoError(t, err) + args.Port = port + args.Host = "127.0.0.1" + args.EnableWebSocket = true + + mgr := manager.NewManager(args) + defer mgr.Cleanup() + + err = mgr.Start() + require.NoError(t, err) + defer mgr.Stop() + + time.Sleep(1 * time.Second) + + ctx := context.Background() + + _, err = mgr.Translate(ctx, "Hello") + assert.Error(t, err) +} + +func TestManager_TranslateHTML(t *testing.T) { + if testing.Short() { + t.Skip("Skipping integration test in short mode") + } + + args := manager.NewWorkerArgs() + port, err := utils.GetFreePort() + require.NoError(t, err) + args.Port = port + args.Host = "127.0.0.1" + args.EnableWebSocket = true + + mgr := manager.NewManager(args) + defer mgr.Cleanup() + + err = mgr.Start() + require.NoError(t, err) + defer mgr.Stop() + + time.Sleep(1 * time.Second) + + ctx := context.Background() + + _, err = mgr.TranslateHTML(ctx, "

Hello

") + assert.Error(t, err) +} + +func TestManager_MultipleManagers(t *testing.T) { + if testing.Short() { + t.Skip("Skipping integration test in short mode") + } + + managers := make([]*manager.Manager, 0, 3) + + for i := 0; i < 3; i++ { + port, err := utils.GetFreePort() + require.NoError(t, err) + + args := manager.NewWorkerArgs() + args.Port = port + args.Host = "127.0.0.1" + args.EnableWebSocket = true + + mgr := manager.NewManager(args) + managers = append(managers, mgr) + + err = mgr.Start() + require.NoError(t, err) + t.Logf("Manager %d started on port %d", i, port) + } + + time.Sleep(2 * time.Second) + + for i, mgr := range managers { + assert.True(t, mgr.IsRunning(), "Manager %d should be running", i) + } + + for i, mgr := range managers { + err := mgr.Stop() + assert.NoError(t, err) + mgr.Cleanup() + t.Logf("Manager %d stopped", i) + } +} + +func TestManager_NotStarted(t *testing.T) { + args := manager.NewWorkerArgs() + mgr := manager.NewManager(args) + defer mgr.Cleanup() + + ctx := context.Background() + + _, err := mgr.Health(ctx) + assert.Error(t, err) + + _, err = mgr.Translate(ctx, "Hello") + assert.Error(t, err) + + assert.False(t, mgr.IsRunning()) +} + +func TestManager_FullWorkflow(t *testing.T) { + if testing.Short() { + t.Skip("Skipping integration test in short mode") + } + + t.Skip("Requires real model files") + + args := manager.NewWorkerArgs() + port, err := utils.GetFreePort() + require.NoError(t, err) + args.Port = port + args.Host = "127.0.0.1" + args.EnableWebSocket = true + + mgr := manager.NewManager(args) + defer mgr.Cleanup() + + err = mgr.Start() + require.NoError(t, err) + defer mgr.Stop() + + time.Sleep(1 * time.Second) + + ctx := context.Background() + + ready, err := mgr.Health(ctx) + require.NoError(t, err) + assert.True(t, ready) + + result, err := mgr.Translate(ctx, "Hello, world!") + require.NoError(t, err) + assert.NotEmpty(t, result) + t.Logf("Translation result: %s", result) + + htmlResult, err := mgr.TranslateHTML(ctx, "

Hello, world!

") + require.NoError(t, err) + assert.NotEmpty(t, htmlResult) + t.Logf("HTML translation result: %s", htmlResult) + + exitResp, err := mgr.Exit(ctx, manager.ExitRequest{ + Force: true, + }) + require.NoError(t, err) + assert.NotNil(t, exitResp) +} diff --git a/src/mtran/vendor/mtranserver/deprecated/go/internal/manager/monitor.go b/src/mtran/vendor/mtranserver/deprecated/go/internal/manager/monitor.go new file mode 100644 index 0000000..b2575f6 --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/go/internal/manager/monitor.go @@ -0,0 +1,137 @@ +package manager + +import ( + "context" + "sync" + "time" + + "github.com/xxnuo/MTranServer/internal/logger" +) + +type WorkerMonitor struct { + worker *Worker + client *Client + url string + stopChan chan struct{} + restartChan chan struct{} + wg sync.WaitGroup + mu sync.Mutex + running bool +} + +func NewWorkerMonitor(worker *Worker, client *Client, url string) *WorkerMonitor { + return &WorkerMonitor{ + worker: worker, + client: client, + url: url, + stopChan: make(chan struct{}), + restartChan: make(chan struct{}, 1), + running: false, + } +} + +func (wm *WorkerMonitor) Start() { + wm.mu.Lock() + if wm.running { + wm.mu.Unlock() + return + } + wm.running = true + wm.mu.Unlock() + + wm.wg.Add(1) + go wm.monitor() +} + +func (wm *WorkerMonitor) Stop() { + wm.mu.Lock() + if !wm.running { + wm.mu.Unlock() + return + } + wm.running = false + wm.mu.Unlock() + + close(wm.stopChan) + wm.wg.Wait() +} + +func (wm *WorkerMonitor) monitor() { + defer wm.wg.Done() + + ticker := time.NewTicker(5 * time.Second) + defer ticker.Stop() + + for { + select { + case <-wm.stopChan: + return + + case <-wm.restartChan: + wm.handleRestart() + + case <-ticker.C: + wm.checkWorkerHealth() + } + } +} + +func (wm *WorkerMonitor) checkWorkerHealth() { + if !wm.worker.IsRunning() { + logger.Warn("Worker process exited unexpectedly, attempting restart...") + select { + case wm.restartChan <- struct{}{}: + default: + } + return + } + + if wm.client != nil && wm.client.IsConnected() { + ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second) + defer cancel() + + _, err := wm.client.Health(ctx) + if err != nil { + logger.Warn("Worker health check failed: %v, attempting restart...", err) + select { + case wm.restartChan <- struct{}{}: + default: + } + } + } +} + +func (wm *WorkerMonitor) handleRestart() { + logger.Info("Restarting worker...") + + if wm.client != nil { + wm.client.Close() + } + + if err := wm.worker.Stop(); err != nil { + logger.Warn("Failed to stop worker cleanly: %v", err) + } + + time.Sleep(1 * time.Second) + + if err := wm.worker.Start(); err != nil { + logger.Error("Failed to restart worker: %v", err) + return + } + + newClient := NewClient(wm.url) + if err := newClient.Connect(); err != nil { + logger.Error("Failed to reconnect client after restart: %v", err) + return + } + + wm.client = newClient + logger.Info("Worker restarted successfully") +} + +func (wm *WorkerMonitor) TriggerRestart() { + select { + case wm.restartChan <- struct{}{}: + default: + } +} diff --git a/src/mtran/vendor/mtranserver/deprecated/go/internal/middleware/auth.go b/src/mtran/vendor/mtranserver/deprecated/go/internal/middleware/auth.go new file mode 100644 index 0000000..e770513 --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/go/internal/middleware/auth.go @@ -0,0 +1,37 @@ +package middleware + +import ( + "net/http" + "strings" + + "github.com/gin-gonic/gin" + "github.com/xxnuo/MTranServer/internal/logger" +) + +func Auth(apiToken string) gin.HandlerFunc { + return func(c *gin.Context) { + + if apiToken == "" { + c.Next() + return + } + + token := c.GetHeader("Authorization") + if token != "" { + token = strings.TrimPrefix(token, "Bearer ") + } else { + token = c.Query("token") + } + + if token != apiToken { + logger.Warn("Unauthorized access attempt from %s to %s", c.ClientIP(), c.Request.URL.Path) + c.JSON(http.StatusUnauthorized, gin.H{ + "error": "Unauthorized", + }) + c.Abort() + return + } + + c.Next() + } +} diff --git a/src/mtran/vendor/mtranserver/deprecated/go/internal/middleware/auth_test.go b/src/mtran/vendor/mtranserver/deprecated/go/internal/middleware/auth_test.go new file mode 100644 index 0000000..98eeaf9 --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/go/internal/middleware/auth_test.go @@ -0,0 +1,80 @@ +package middleware + +import ( + "net/http" + "net/http/httptest" + "testing" + + "github.com/gin-gonic/gin" + "github.com/stretchr/testify/assert" +) + +func TestAuthWithValidToken(t *testing.T) { + gin.SetMode(gin.TestMode) + + r := gin.New() + r.Use(Auth("test-token")) + r.GET("/test", func(c *gin.Context) { + c.String(http.StatusOK, "success") + }) + + w := httptest.NewRecorder() + req, _ := http.NewRequest("GET", "/test", nil) + req.Header.Set("Authorization", "test-token") + r.ServeHTTP(w, req) + + assert.Equal(t, http.StatusOK, w.Code) + assert.Equal(t, "success", w.Body.String()) +} + +func TestAuthWithValidTokenInQuery(t *testing.T) { + gin.SetMode(gin.TestMode) + + r := gin.New() + r.Use(Auth("test-token")) + r.GET("/test", func(c *gin.Context) { + c.String(http.StatusOK, "success") + }) + + w := httptest.NewRecorder() + req, _ := http.NewRequest("GET", "/test?token=test-token", nil) + r.ServeHTTP(w, req) + + assert.Equal(t, http.StatusOK, w.Code) + assert.Equal(t, "success", w.Body.String()) +} + +func TestAuthWithInvalidToken(t *testing.T) { + gin.SetMode(gin.TestMode) + + r := gin.New() + r.Use(Auth("test-token")) + r.GET("/test", func(c *gin.Context) { + c.String(http.StatusOK, "success") + }) + + w := httptest.NewRecorder() + req, _ := http.NewRequest("GET", "/test", nil) + req.Header.Set("Authorization", "wrong-token") + r.ServeHTTP(w, req) + + assert.Equal(t, http.StatusUnauthorized, w.Code) + assert.Contains(t, w.Body.String(), "Unauthorized") +} + +func TestAuthWithNoToken(t *testing.T) { + gin.SetMode(gin.TestMode) + + r := gin.New() + r.Use(Auth("test-token")) + r.GET("/test", func(c *gin.Context) { + c.String(http.StatusOK, "success") + }) + + w := httptest.NewRecorder() + req, _ := http.NewRequest("GET", "/test", nil) + r.ServeHTTP(w, req) + + assert.Equal(t, http.StatusUnauthorized, w.Code) + assert.Contains(t, w.Body.String(), "Unauthorized") +} diff --git a/src/mtran/vendor/mtranserver/deprecated/go/internal/middleware/cors.go b/src/mtran/vendor/mtranserver/deprecated/go/internal/middleware/cors.go new file mode 100644 index 0000000..b3f366f --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/go/internal/middleware/cors.go @@ -0,0 +1,23 @@ +package middleware + +import ( + "net/http" + + "github.com/gin-gonic/gin" +) + +func CORS() gin.HandlerFunc { + return func(c *gin.Context) { + c.Writer.Header().Set("Access-Control-Allow-Origin", "*") + c.Writer.Header().Set("Access-Control-Allow-Credentials", "true") + c.Writer.Header().Set("Access-Control-Allow-Headers", "Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization, accept, origin, Cache-Control, X-Requested-With, KEY") + c.Writer.Header().Set("Access-Control-Allow-Methods", "POST, OPTIONS, GET, PUT, DELETE") + + if c.Request.Method == "OPTIONS" { + c.AbortWithStatus(http.StatusNoContent) + return + } + + c.Next() + } +} diff --git a/src/mtran/vendor/mtranserver/deprecated/go/internal/middleware/cors_test.go b/src/mtran/vendor/mtranserver/deprecated/go/internal/middleware/cors_test.go new file mode 100644 index 0000000..18b134d --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/go/internal/middleware/cors_test.go @@ -0,0 +1,46 @@ +package middleware + +import ( + "net/http" + "net/http/httptest" + "testing" + + "github.com/gin-gonic/gin" + "github.com/stretchr/testify/assert" +) + +func TestCORS(t *testing.T) { + gin.SetMode(gin.TestMode) + + r := gin.New() + r.Use(CORS()) + r.GET("/test", func(c *gin.Context) { + c.String(http.StatusOK, "test") + }) + + w := httptest.NewRecorder() + req, _ := http.NewRequest("GET", "/test", nil) + r.ServeHTTP(w, req) + + assert.Equal(t, http.StatusOK, w.Code) + assert.Equal(t, "*", w.Header().Get("Access-Control-Allow-Origin")) + assert.Equal(t, "true", w.Header().Get("Access-Control-Allow-Credentials")) + assert.NotEmpty(t, w.Header().Get("Access-Control-Allow-Headers")) + assert.NotEmpty(t, w.Header().Get("Access-Control-Allow-Methods")) +} + +func TestCORSOptions(t *testing.T) { + gin.SetMode(gin.TestMode) + + r := gin.New() + r.Use(CORS()) + r.GET("/test", func(c *gin.Context) { + c.String(http.StatusOK, "test") + }) + + w := httptest.NewRecorder() + req, _ := http.NewRequest("OPTIONS", "/test", nil) + r.ServeHTTP(w, req) + + assert.Equal(t, http.StatusNoContent, w.Code) +} diff --git a/src/mtran/vendor/mtranserver/deprecated/go/internal/middleware/logger.go b/src/mtran/vendor/mtranserver/deprecated/go/internal/middleware/logger.go new file mode 100644 index 0000000..0070861 --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/go/internal/middleware/logger.go @@ -0,0 +1,65 @@ +package middleware + +import ( + "fmt" + "time" + + "github.com/gin-gonic/gin" + "github.com/xxnuo/MTranServer/internal/logger" +) + +func Logger() gin.HandlerFunc { + return func(c *gin.Context) { + + start := time.Now() + path := c.Request.URL.Path + raw := c.Request.URL.RawQuery + + c.Next() + + end := time.Now() + latency := end.Sub(start) + + clientIP := c.ClientIP() + method := c.Request.Method + statusCode := c.Writer.Status() + errorMessage := c.Errors.ByType(gin.ErrorTypePrivate).String() + + if raw != "" { + path = path + "?" + raw + } + + logFunc := logger.Info + if statusCode >= 500 { + logFunc = logger.Error + } else if statusCode >= 400 { + logFunc = logger.Warn + } + + msg := fmt.Sprintf("%s %s %d %v %s", + method, + path, + statusCode, + latency, + clientIP, + ) + + if errorMessage != "" { + msg = fmt.Sprintf("%s | Error: %s", msg, errorMessage) + } + + logFunc(msg) + } +} + +func Recovery() gin.HandlerFunc { + return func(c *gin.Context) { + defer func() { + if err := recover(); err != nil { + logger.Error("Panic recovered: %v", err) + c.AbortWithStatus(500) + } + }() + c.Next() + } +} diff --git a/src/mtran/vendor/mtranserver/deprecated/go/internal/models/records.go b/src/mtran/vendor/mtranserver/deprecated/go/internal/models/records.go new file mode 100644 index 0000000..fa411e9 --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/go/internal/models/records.go @@ -0,0 +1,421 @@ +package models + +import ( + "crypto/sha256" + "encoding/hex" + "encoding/json" + "fmt" + "os" + "path/filepath" + "strings" + + "github.com/xxnuo/MTranServer/data" + "github.com/xxnuo/MTranServer/internal/config" + "github.com/xxnuo/MTranServer/internal/downloader" + "github.com/xxnuo/MTranServer/internal/logger" + "github.com/xxnuo/MTranServer/internal/utils" +) + +const ( + RecordsUrl = "https://firefox.settings.services.mozilla.com/v1/buckets/main-preview/collections/translations-models-v2/records" + RecordsFileName = "records.json" + AttachmentsBaseUrl = "https://firefox-settings-attachments.cdn.mozilla.net" +) + +type RecordsData struct { + Data []RecordItem `json:"data"` +} + +type RecordItem struct { + Name string `json:"name"` + Schema int64 `json:"schema"` + Version string `json:"version"` + FileType string `json:"fileType"` + Attachment Attachment `json:"attachment"` + Architecture string `json:"architecture"` + SourceLanguage string `json:"sourceLanguage"` + TargetLanguage string `json:"targetLanguage"` + DecompressedHash string `json:"decompressedHash"` + DecompressedSize int64 `json:"decompressedSize"` + FilterExpression string `json:"filter_expression"` + ID string `json:"id"` + LastModified int64 `json:"last_modified"` +} + +type Attachment struct { + Hash string `json:"hash"` + Size int64 `json:"size"` + Filename string `json:"filename"` + Location string `json:"location"` + MimeType string `json:"mimetype"` +} + +var ( + GlobalRecords *RecordsData +) + +func (r *RecordsData) GetLanguagePairs() []string { + pairMap := make(map[string]bool) + for _, record := range r.Data { + pair := fmt.Sprintf("%s-%s", record.SourceLanguage, record.TargetLanguage) + pairMap[pair] = true + } + + pairs := make([]string, 0, len(pairMap)) + for pair := range pairMap { + pairs = append(pairs, pair) + } + return pairs +} + +func (r *RecordsData) HasLanguagePair(fromLang, toLang string) bool { + for _, record := range r.Data { + if record.SourceLanguage == fromLang && record.TargetLanguage == toLang { + return true + } + } + return false +} + +func (r *RecordsData) GetVersions(fromLang, toLang string) []string { + versionMap := make(map[string]bool) + for _, record := range r.Data { + if record.SourceLanguage == fromLang && record.TargetLanguage == toLang { + versionMap[record.Version] = true + } + } + + versions := make([]string, 0, len(versionMap)) + for version := range versionMap { + versions = append(versions, version) + } + return versions +} + +func InitRecords() error { + cfg := config.GetConfig() + recordsPath := filepath.Join(cfg.ConfigDir, "records.json") + + if err := os.MkdirAll(cfg.ConfigDir, 0755); err != nil { + return fmt.Errorf("failed to create config directory: %w", err) + } + if err := os.MkdirAll(cfg.ModelDir, 0755); err != nil { + return fmt.Errorf("failed to create model directory: %w", err) + } + + if cfg.EnableOfflineMode { + return initRecordsOffline(recordsPath) + } + return initRecordsOnline(recordsPath) +} + +func computeHash(data []byte) string { + h := sha256.Sum256(data) + return hex.EncodeToString(h[:]) +} + +func isValidRecordsFormat(jsonData []byte) bool { + return strings.Contains(string(jsonData), `"sourceLanguage"`) +} + +func loadRecordsFromBytes(jsonData []byte) error { + var records RecordsData + if err := json.Unmarshal(jsonData, &records); err != nil { + return fmt.Errorf("failed to parse records.json: %w", err) + } + GlobalRecords = &records + logger.Debug("Loaded %d model records", len(records.Data)) + return nil +} + +func initRecordsOffline(recordsPath string) error { + fileData, err := os.ReadFile(recordsPath) + if err == nil { + fileHash := computeHash(fileData) + if fileHash == data.RecordsHash { + logger.Debug("Loading records.json from %s (hash matched)", recordsPath) + return loadRecordsFromBytes(fileData) + } + logger.Info("Records hash mismatch, updating from embedded data...") + } + + logger.Info("Initializing records.json from embedded data") + if err := os.WriteFile(recordsPath, data.RecordsJson, 0644); err != nil { + logger.Warn("Failed to write records.json to %s, using embedded data: %v", recordsPath, err) + return loadRecordsFromBytes(data.RecordsJson) + } + + logger.Debug("Loading records.json from %s", recordsPath) + return loadRecordsFromBytes(data.RecordsJson) +} + +func initRecordsOnline(recordsPath string) error { + cfg := config.GetConfig() + d := downloader.New(cfg.ConfigDir) + + logger.Info("Downloading latest records.json from remote...") + if err := d.Download(RecordsUrl, RecordsFileName, &downloader.DownloadOptions{ + Overwrite: true, + }); err != nil { + logger.Warn("Failed to download records.json: %v, falling back to embedded data", err) + if err := os.WriteFile(recordsPath, data.RecordsJson, 0644); err != nil { + logger.Warn("Failed to write embedded records.json: %v", err) + } + return loadRecordsFromBytes(data.RecordsJson) + } + + fileData, err := os.ReadFile(recordsPath) + if err != nil { + logger.Warn("Failed to read downloaded records.json: %v, using embedded data", err) + return loadRecordsFromBytes(data.RecordsJson) + } + + if !isValidRecordsFormat(fileData) { + logger.Warn("Downloaded records.json has invalid format, using embedded data") + if err := os.WriteFile(recordsPath, data.RecordsJson, 0644); err != nil { + logger.Warn("Failed to write embedded records.json: %v", err) + } + return loadRecordsFromBytes(data.RecordsJson) + } + + logger.Debug("Loading records.json from %s", recordsPath) + return loadRecordsFromBytes(fileData) +} + +func DownloadRecords() error { + cfg := config.GetConfig() + + logger.Info("Updating records.json from remote") + + d := downloader.New(cfg.ConfigDir) + if err := d.Download(RecordsUrl, RecordsFileName, &downloader.DownloadOptions{ + Overwrite: true, + }); err != nil { + return fmt.Errorf("Failed to download records.json: %w", err) + } + + return InitRecords() +} + +func computeFileHash(filePath string) (string, error) { + fileData, err := os.ReadFile(filePath) + if err != nil { + return "", err + } + h := sha256.Sum256(fileData) + return hex.EncodeToString(h[:]), nil +} + +func DownloadModel(toLang string, fromLang string, version string) error { + + if GlobalRecords == nil { + if err := InitRecords(); err != nil { + return err + } + } + + var matchedRecords []RecordItem + for _, record := range GlobalRecords.Data { + if record.TargetLanguage == toLang && record.SourceLanguage == fromLang { + if version == "" || record.Version == version { + matchedRecords = append(matchedRecords, record) + } + } + } + + if len(matchedRecords) == 0 { + return fmt.Errorf("No model found for %s -> %s (version: %s)", fromLang, toLang, version) + } + + targetRecords := matchedRecords + if version == "" { + + fileTypeMap := make(map[string][]RecordItem) + for _, record := range matchedRecords { + fileTypeMap[record.FileType] = append(fileTypeMap[record.FileType], record) + } + + targetRecords = []RecordItem{} + for _, records := range fileTypeMap { + versions := make([]string, len(records)) + recordMap := make(map[string]RecordItem) + for i, r := range records { + versions[i] = r.Version + recordMap[r.Version] = r + } + latestVersion := utils.GetLargestVersion(versions) + targetRecords = append(targetRecords, recordMap[latestVersion]) + } + } + + cfg := config.GetConfig() + langPairDir := filepath.Join(cfg.ModelDir, fmt.Sprintf("%s_%s", fromLang, toLang)) + + if err := os.MkdirAll(cfg.ModelDir, 0755); err != nil { + return fmt.Errorf("Failed to create model directory: %w", err) + } + if err := os.MkdirAll(langPairDir, 0755); err != nil { + return fmt.Errorf("Failed to create language pair directory: %w", err) + } + + logger.Info("Downloading model files for %s -> %s", fromLang, toLang) + + d := downloader.New(langPairDir) + + for _, record := range targetRecords { + filename := record.Attachment.Filename + fileUrl := AttachmentsBaseUrl + "/" + record.Attachment.Location + compressedHash := record.Attachment.Hash + + decompressedFilename := strings.TrimSuffix(filename, ".zst") + decompressedPath := filepath.Join(langPairDir, decompressedFilename) + + needDownload := false + if _, err := os.Stat(decompressedPath); os.IsNotExist(err) { + needDownload = true + } else if !cfg.EnableOfflineMode && record.DecompressedHash != "" { + localHash, err := computeFileHash(decompressedPath) + if err != nil { + logger.Warn("Failed to compute hash for %s: %v, will re-download", decompressedFilename, err) + needDownload = true + } else if localHash != record.DecompressedHash { + logger.Info("Model file %s hash mismatch (local: %s, expected: %s), updating...", + decompressedFilename, localHash[:8], record.DecompressedHash[:8]) + needDownload = true + } + } + + if !needDownload { + logger.Debug("Model file up to date: %s", decompressedFilename) + continue + } + + logger.Debug("Downloading model file: %s (type: %s)", filename, record.FileType) + if err := d.Download(fileUrl, filename, &downloader.DownloadOptions{ + SHA256: compressedHash, + Overwrite: true, + }); err != nil { + return fmt.Errorf("Failed to download %s: %w", filename, err) + } + + compressedPath := filepath.Join(langPairDir, filename) + logger.Debug("Decompressing: %s -> %s", filename, decompressedFilename) + if err := utils.DecompressZstd(compressedPath, decompressedPath); err != nil { + return fmt.Errorf("Failed to decompress %s: %w", filename, err) + } + + os.Remove(compressedPath) + } + + logger.Info("Model files downloaded successfully for %s -> %s", fromLang, toLang) + return nil +} + +func GetModelFiles(modelDir, fromLang, toLang string) (map[string]string, error) { + + if GlobalRecords == nil { + if err := InitRecords(); err != nil { + return nil, fmt.Errorf("failed to init records: %w", err) + } + } + + langPairDir := filepath.Join(modelDir, fmt.Sprintf("%s_%s", fromLang, toLang)) + + files := make(map[string]string) + fileTypeMap := make(map[string]string) + + for _, record := range GlobalRecords.Data { + if record.SourceLanguage == fromLang && record.TargetLanguage == toLang { + filename := strings.TrimSuffix(record.Attachment.Filename, ".zst") + fullPath := filepath.Join(langPairDir, filename) + + if _, err := os.Stat(fullPath); err == nil { + fileTypeMap[record.FileType] = fullPath + } + } + } + + if modelPath, ok := fileTypeMap["model"]; ok { + files["model"] = modelPath + } else { + return nil, fmt.Errorf("model file not found for %s -> %s", fromLang, toLang) + } + + if lexPath, ok := fileTypeMap["lex"]; ok { + files["lex"] = lexPath + } else { + return nil, fmt.Errorf("lex file not found for %s -> %s", fromLang, toLang) + } + + if vocabPath, ok := fileTypeMap["vocab"]; ok { + + files["vocab_src"] = vocabPath + files["vocab_trg"] = vocabPath + } else { + + if srcvocabPath, ok := fileTypeMap["srcvocab"]; ok { + files["vocab_src"] = srcvocabPath + } else { + return nil, fmt.Errorf("source vocab file not found for %s -> %s", fromLang, toLang) + } + + if trgvocabPath, ok := fileTypeMap["trgvocab"]; ok { + files["vocab_trg"] = trgvocabPath + } else { + return nil, fmt.Errorf("target vocab file not found for %s -> %s", fromLang, toLang) + } + } + + return files, nil +} + +func IsModelDownloaded(modelDir, fromLang, toLang string) bool { + _, err := GetModelFiles(modelDir, fromLang, toLang) + return err == nil +} + +func GetSupportedLanguages() ([]string, error) { + if GlobalRecords == nil { + if err := InitRecords(); err != nil { + return nil, err + } + } + + langMap := make(map[string]bool) + for _, record := range GlobalRecords.Data { + langMap[record.SourceLanguage] = true + langMap[record.TargetLanguage] = true + } + + langs := make([]string, 0, len(langMap)) + for lang := range langMap { + langs = append(langs, lang) + } + return langs, nil +} + +func ValidateLanguagePair(fromLang, toLang string) error { + if GlobalRecords == nil { + if err := InitRecords(); err != nil { + return fmt.Errorf("failed to init records: %w", err) + } + } + + if fromLang == "" { + return fmt.Errorf("source language cannot be empty") + } + + if toLang == "" { + return fmt.Errorf("target language cannot be empty") + } + + if fromLang == toLang { + return fmt.Errorf("source and target languages cannot be the same") + } + + if !GlobalRecords.HasLanguagePair(fromLang, toLang) { + return fmt.Errorf("language pair %s -> %s is not supported", fromLang, toLang) + } + + return nil +} diff --git a/src/mtran/vendor/mtranserver/deprecated/go/internal/models/records_test.go b/src/mtran/vendor/mtranserver/deprecated/go/internal/models/records_test.go new file mode 100644 index 0000000..856d6b9 --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/go/internal/models/records_test.go @@ -0,0 +1,360 @@ +package models_test + +import ( + "encoding/json" + "os" + "path/filepath" + "testing" + + "github.com/xxnuo/MTranServer/data" + "github.com/xxnuo/MTranServer/internal/config" + "github.com/xxnuo/MTranServer/internal/models" +) + +func TestInitRecords(t *testing.T) { + + oldConfig := config.GlobalConfig + defer func() { config.GlobalConfig = oldConfig }() + + tmpDir := t.TempDir() + + config.GlobalConfig = &config.Config{ + ConfigDir: tmpDir, + ModelDir: filepath.Join(tmpDir, "models"), + } + + models.GlobalRecords = nil + + err := models.InitRecords() + if err != nil { + t.Fatalf("initRecords() error = %v", err) + } + + recordsPath := filepath.Join(tmpDir, "records.json") + if _, err := os.Stat(recordsPath); os.IsNotExist(err) { + t.Fatal("records.json was not created") + } + + if models.GlobalRecords == nil { + t.Fatal("GlobalRecords was not set") + } + + if len(models.GlobalRecords.Data) == 0 { + t.Fatal("GlobalRecords.Data is empty") + } + + models.GlobalRecords = nil + err = models.InitRecords() + if err != nil { + t.Fatalf("initRecords() second call error = %v", err) + } + + if models.GlobalRecords == nil || len(models.GlobalRecords.Data) == 0 { + t.Fatal("Failed to load from existing records.json") + } +} + +func TestRecordsDataStructure(t *testing.T) { + + var records models.RecordsData + err := json.Unmarshal(data.RecordsJson, &records) + if err != nil { + t.Fatalf("Failed to unmarshal embedded records.json: %v", err) + } + + if len(records.Data) == 0 { + t.Fatal("No records found in embedded data") + } + + firstRecord := records.Data[0] + if firstRecord.Name == "" { + t.Error("Record name is empty") + } + if firstRecord.TargetLanguage == "" { + t.Error("Record target language is empty") + } + if firstRecord.SourceLanguage == "" { + t.Error("Record source language is empty") + } + if firstRecord.Version == "" { + t.Error("Record version is empty") + } + if firstRecord.FileType == "" { + t.Error("Record fileType is empty") + } + if firstRecord.Attachment.Filename == "" { + t.Error("Attachment filename is empty") + } + if firstRecord.Attachment.Location == "" { + t.Error("Attachment location is empty") + } + if firstRecord.Attachment.Hash == "" { + t.Error("Attachment hash is empty") + } +} + +func TestFindModelRecords(t *testing.T) { + + var records models.RecordsData + err := json.Unmarshal(data.RecordsJson, &records) + if err != nil { + t.Fatalf("Failed to unmarshal records: %v", err) + } + + tests := []struct { + name string + toLang string + fromLang string + version string + wantErr bool + minCount int + }{ + { + name: "find en to pl models", + toLang: "pl", + fromLang: "en", + version: "", + wantErr: false, + minCount: 1, + }, + { + name: "find en to de models", + toLang: "de", + fromLang: "en", + version: "", + wantErr: false, + minCount: 1, + }, + { + name: "find specific version", + toLang: "pl", + fromLang: "en", + version: "2.1", + wantErr: false, + minCount: 1, + }, + { + name: "non-existent language pair", + toLang: "zz", + fromLang: "en", + version: "", + wantErr: true, + minCount: 0, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + var matchedRecords []models.RecordItem + for _, record := range records.Data { + if record.TargetLanguage == tt.toLang && record.SourceLanguage == tt.fromLang { + if tt.version == "" || record.Version == tt.version { + matchedRecords = append(matchedRecords, record) + } + } + } + + hasError := len(matchedRecords) == 0 + if hasError != tt.wantErr { + t.Errorf("Expected error: %v, got: %v (found %d records)", tt.wantErr, hasError, len(matchedRecords)) + } + + if !tt.wantErr && len(matchedRecords) < tt.minCount { + t.Errorf("Expected at least %d records, got %d", tt.minCount, len(matchedRecords)) + } + }) + } +} + +func TestVersionGrouping(t *testing.T) { + + var records models.RecordsData + err := json.Unmarshal(data.RecordsJson, &records) + if err != nil { + t.Fatalf("Failed to unmarshal records: %v", err) + } + + var matchedRecords []models.RecordItem + for _, record := range records.Data { + if record.TargetLanguage == "pl" && record.SourceLanguage == "en" { + matchedRecords = append(matchedRecords, record) + } + } + + if len(matchedRecords) == 0 { + t.Skip("No en->pl records found for testing") + } + + fileTypeMap := make(map[string][]models.RecordItem) + for _, record := range matchedRecords { + fileTypeMap[record.FileType] = append(fileTypeMap[record.FileType], record) + } + + expectedTypes := []string{"model", "vocab", "lex"} + for _, fileType := range expectedTypes { + if records, exists := fileTypeMap[fileType]; !exists || len(records) == 0 { + t.Logf("Warning: No %s files found for en->pl", fileType) + } + } + + for fileType, fileRecords := range fileTypeMap { + if len(fileRecords) > 1 { + t.Logf("FileType %s has %d versions", fileType, len(fileRecords)) + } + } +} + +func TestDownloadRecords(t *testing.T) { + if testing.Short() { + t.Skip("Skipping download test in short mode") + } + + oldConfig := config.GlobalConfig + defer func() { config.GlobalConfig = oldConfig }() + + tmpDir := t.TempDir() + + config.GlobalConfig = &config.Config{ + ConfigDir: tmpDir, + ModelDir: filepath.Join(tmpDir, "models"), + } + + models.GlobalRecords = nil + + err := models.DownloadRecords() + if err != nil { + t.Fatalf("downloadRecords() error = %v", err) + } + + recordsPath := filepath.Join(tmpDir, "records.json") + if _, err := os.Stat(recordsPath); os.IsNotExist(err) { + t.Fatal("records.json was not downloaded") + } + + if models.GlobalRecords == nil { + t.Fatal("GlobalRecords was not set after download") + } + + if len(models.GlobalRecords.Data) == 0 { + t.Fatal("GlobalRecords.Data is empty after download") + } +} + +func TestRealDownloadModel(t *testing.T) { + if testing.Short() { + t.Skip("Skipping model download test in short mode") + } + + t.Log("This test is real world test.") + + err := models.InitRecords() + if err != nil { + t.Fatalf("initRecords() error = %v", err) + } + + err = models.DownloadModel("ja", "en", "") + if err != nil { + t.Fatalf("downloadModel() error = %v", err) + } + + modelDir := config.GetConfig().ModelDir + files, err := os.ReadDir(modelDir) + if err != nil { + t.Fatalf("Failed to read model directory: %v", err) + } + + if len(files) == 0 { + t.Fatal("No model files were downloaded") + } + + downloadedFiles := make(map[string]bool) + for _, file := range files { + downloadedFiles[file.Name()] = true + } + + expectedFileTypes := []string{"model", "vocab", "lex", "trgvocab", "srcvocab"} + for _, record := range models.GlobalRecords.Data { + if record.TargetLanguage == "ja" && record.SourceLanguage == "en" { + if !downloadedFiles[record.Attachment.Filename] { + t.Errorf("Expected file %s was not downloaded", record.Attachment.Filename) + } + + found := false + for _, ft := range expectedFileTypes { + if record.FileType == ft { + found = true + break + } + } + if !found { + t.Logf("Unexpected fileType: %s", record.FileType) + } + } + } +} + +func TestDownloadModelLatestVersion(t *testing.T) { + if testing.Short() { + t.Skip("Skipping model download test in short mode") + } + + oldConfig := config.GlobalConfig + defer func() { config.GlobalConfig = oldConfig }() + + tmpDir := t.TempDir() + + config.GlobalConfig = &config.Config{ + ConfigDir: tmpDir, + ModelDir: filepath.Join(tmpDir, "models"), + } + + models.GlobalRecords = nil + + err := models.InitRecords() + if err != nil { + t.Fatalf("initRecords() error = %v", err) + } + + err = models.DownloadModel("de", "en", "") + if err != nil { + t.Fatalf("downloadModel() error = %v", err) + } + + modelDir := filepath.Join(tmpDir, "models") + files, err := os.ReadDir(modelDir) + if err != nil { + t.Fatalf("Failed to read model directory: %v", err) + } + + if len(files) == 0 { + t.Fatal("No model files were downloaded") + } +} + +func TestDownloadModelNonExistent(t *testing.T) { + if testing.Short() { + t.Skip("Skipping test in short mode") + } + + oldConfig := config.GlobalConfig + defer func() { config.GlobalConfig = oldConfig }() + + tmpDir := t.TempDir() + + config.GlobalConfig = &config.Config{ + ConfigDir: tmpDir, + ModelDir: filepath.Join(tmpDir, "models"), + } + + models.GlobalRecords = nil + + err := models.InitRecords() + if err != nil { + t.Fatalf("initRecords() error = %v", err) + } + + err = models.DownloadModel("zz", "yy", "") + if err == nil { + t.Fatal("Expected error for non-existent language pair, got nil") + } +} diff --git a/src/mtran/vendor/mtranserver/deprecated/go/internal/routes/routes.go b/src/mtran/vendor/mtranserver/deprecated/go/internal/routes/routes.go new file mode 100644 index 0000000..bb47c63 --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/go/internal/routes/routes.go @@ -0,0 +1,56 @@ +package routes + +import ( + "net/http" + + "github.com/gin-gonic/gin" + swaggerFiles "github.com/swaggo/files" + ginSwagger "github.com/swaggo/gin-swagger" + + "github.com/xxnuo/MTranServer/internal/config" + "github.com/xxnuo/MTranServer/internal/docs" + "github.com/xxnuo/MTranServer/internal/handlers" + "github.com/xxnuo/MTranServer/internal/middleware" + "github.com/xxnuo/MTranServer/ui" +) + +func Setup(r *gin.Engine, apiToken string) { + + r.Use(middleware.CORS()) + + docs.SwaggerInfo.BasePath = "/" + r.GET("/docs/*any", ginSwagger.WrapHandler(swaggerFiles.Handler)) + + r.GET("/version", handlers.HandleVersion) + r.GET("/health", handlers.HandleHealth) + r.GET("/__heartbeat__", handlers.HandleHeartbeat) + r.GET("/__lbheartbeat__", handlers.HandleLBHeartbeat) + + auth := r.Group("/") + if apiToken != "" { + auth.Use(middleware.Auth(apiToken)) + } + + auth.GET("/languages", handlers.HandleLanguages) + auth.POST("/translate", handlers.HandleTranslate) + auth.POST("/translate/batch", handlers.HandleTranslateBatch) + + r.POST("/imme", handlers.HandleImmeTranslate(apiToken)) + r.POST("/kiss", handlers.HandleKissTranslate(apiToken)) + r.POST("/deepl", handlers.HandleDeeplTranslate(apiToken)) + r.POST("/google/language/translate/v2", handlers.HandleGoogleCompatTranslate(apiToken)) + r.GET("/google/translate_a/single", handlers.HandleGoogleTranslateSingle(apiToken)) + r.POST("/hcfy", handlers.HandleHcfyTranslate(apiToken)) + + cfg := config.GetConfig() + if cfg.EnableWebUI { + distFS, err := ui.GetDistFS() + if err == nil { + r.StaticFS("/ui", http.FS(distFS)) + + r.GET("/", func(c *gin.Context) { + c.Redirect(http.StatusMovedPermanently, "/ui/") + }) + } + } +} diff --git a/src/mtran/vendor/mtranserver/deprecated/go/internal/server/integration_test.go b/src/mtran/vendor/mtranserver/deprecated/go/internal/server/integration_test.go new file mode 100644 index 0000000..26d4083 --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/go/internal/server/integration_test.go @@ -0,0 +1,223 @@ +package server + +import ( + "bytes" + "encoding/json" + "net/http" + "net/http/httptest" + "testing" + + "github.com/gin-gonic/gin" + "github.com/stretchr/testify/assert" + "github.com/xxnuo/MTranServer/internal/models" + "github.com/xxnuo/MTranServer/internal/routes" +) + +func TestIntegrationServerSetup(t *testing.T) { + gin.SetMode(gin.TestMode) + + models.GlobalRecords = &models.RecordsData{ + Data: []models.RecordItem{ + {SourceLanguage: "en", TargetLanguage: "zh-Hans"}, + {SourceLanguage: "zh-Hans", TargetLanguage: "en"}, + }, + } + + r := gin.New() + routes.Setup(r, "test-token") + + t.Run("PublicEndpoints", func(t *testing.T) { + endpoints := []string{"/version", "/health", "/__heartbeat__", "/__lbheartbeat__"} + for _, endpoint := range endpoints { + w := httptest.NewRecorder() + req, _ := http.NewRequest("GET", endpoint, nil) + r.ServeHTTP(w, req) + assert.Equal(t, http.StatusOK, w.Code, "Endpoint %s should return 200", endpoint) + } + }) + + t.Run("AuthenticatedEndpoints", func(t *testing.T) { + w := httptest.NewRecorder() + req, _ := http.NewRequest("GET", "/languages", nil) + req.Header.Set("Authorization", "test-token") + r.ServeHTTP(w, req) + assert.Equal(t, http.StatusOK, w.Code) + + var response map[string]interface{} + err := json.Unmarshal(w.Body.Bytes(), &response) + assert.NoError(t, err) + assert.Contains(t, response, "languages") + }) + + t.Run("AuthenticationFailure", func(t *testing.T) { + w := httptest.NewRecorder() + req, _ := http.NewRequest("GET", "/languages", nil) + r.ServeHTTP(w, req) + assert.Equal(t, http.StatusUnauthorized, w.Code) + }) +} + +func TestIntegrationCORS(t *testing.T) { + gin.SetMode(gin.TestMode) + + r := gin.New() + routes.Setup(r, "") + + w := httptest.NewRecorder() + req, _ := http.NewRequest("OPTIONS", "/version", nil) + req.Header.Set("Origin", "http://example.com") + r.ServeHTTP(w, req) + + assert.Equal(t, http.StatusNoContent, w.Code) + assert.Equal(t, "*", w.Header().Get("Access-Control-Allow-Origin")) +} + +func TestIntegrationPluginEndpoints(t *testing.T) { + gin.SetMode(gin.TestMode) + + models.GlobalRecords = &models.RecordsData{ + Data: []models.RecordItem{ + {SourceLanguage: "en", TargetLanguage: "zh-Hans"}, + }, + } + + r := gin.New() + routes.Setup(r, "test-token") + + t.Run("ImmeEndpoint", func(t *testing.T) { + reqBody := map[string]interface{}{ + "source_lang": "en", + "target_lang": "zh-Hans", + "text_list": []string{"Hello"}, + } + body, _ := json.Marshal(reqBody) + + w := httptest.NewRecorder() + req, _ := http.NewRequest("POST", "/imme?token=test-token", bytes.NewBuffer(body)) + req.Header.Set("Content-Type", "application/json") + r.ServeHTTP(w, req) + + assert.NotEqual(t, http.StatusUnauthorized, w.Code) + assert.NotEqual(t, http.StatusBadRequest, w.Code) + }) + + t.Run("KissEndpoint", func(t *testing.T) { + reqBody := map[string]interface{}{ + "from": "en", + "to": "zh-Hans", + "text": "Hello", + } + body, _ := json.Marshal(reqBody) + + w := httptest.NewRecorder() + req, _ := http.NewRequest("POST", "/kiss", bytes.NewBuffer(body)) + req.Header.Set("Content-Type", "application/json") + req.Header.Set("KEY", "test-token") + r.ServeHTTP(w, req) + + assert.NotEqual(t, http.StatusUnauthorized, w.Code) + assert.NotEqual(t, http.StatusBadRequest, w.Code) + }) +} + +func TestIntegrationAPIEndpoints(t *testing.T) { + gin.SetMode(gin.TestMode) + + models.GlobalRecords = &models.RecordsData{ + Data: []models.RecordItem{ + {SourceLanguage: "en", TargetLanguage: "zh-Hans"}, + }, + } + + r := gin.New() + routes.Setup(r, "test-token") + + t.Run("TranslateEndpoint", func(t *testing.T) { + reqBody := map[string]interface{}{ + "from": "en", + "to": "zh-Hans", + "text": "Hello", + "html": false, + } + body, _ := json.Marshal(reqBody) + + w := httptest.NewRecorder() + req, _ := http.NewRequest("POST", "/translate", bytes.NewBuffer(body)) + req.Header.Set("Content-Type", "application/json") + req.Header.Set("Authorization", "test-token") + r.ServeHTTP(w, req) + + assert.NotEqual(t, http.StatusUnauthorized, w.Code) + assert.NotEqual(t, http.StatusBadRequest, w.Code) + }) + + t.Run("TranslateBatchEndpoint", func(t *testing.T) { + reqBody := map[string]interface{}{ + "from": "en", + "to": "zh-Hans", + "texts": []string{"Hello", "World"}, + "html": false, + } + body, _ := json.Marshal(reqBody) + + w := httptest.NewRecorder() + req, _ := http.NewRequest("POST", "/translate/batch", bytes.NewBuffer(body)) + req.Header.Set("Content-Type", "application/json") + req.Header.Set("Authorization", "test-token") + r.ServeHTTP(w, req) + + assert.NotEqual(t, http.StatusUnauthorized, w.Code) + assert.NotEqual(t, http.StatusBadRequest, w.Code) + }) + + t.Run("GoogleCompatEndpoint", func(t *testing.T) { + reqBody := map[string]interface{}{ + "q": "Hello", + "source": "en", + "target": "zh-Hans", + "format": "text", + } + body, _ := json.Marshal(reqBody) + + w := httptest.NewRecorder() + req, _ := http.NewRequest("POST", "/language/translate/v2", bytes.NewBuffer(body)) + req.Header.Set("Content-Type", "application/json") + req.Header.Set("Authorization", "test-token") + r.ServeHTTP(w, req) + + assert.NotEqual(t, http.StatusUnauthorized, w.Code) + assert.NotEqual(t, http.StatusBadRequest, w.Code) + }) +} + +func TestIntegrationInvalidRequests(t *testing.T) { + gin.SetMode(gin.TestMode) + + r := gin.New() + routes.Setup(r, "test-token") + + t.Run("InvalidJSON", func(t *testing.T) { + w := httptest.NewRecorder() + req, _ := http.NewRequest("POST", "/translate", bytes.NewBufferString("invalid json")) + req.Header.Set("Content-Type", "application/json") + req.Header.Set("Authorization", "test-token") + r.ServeHTTP(w, req) + + assert.Equal(t, http.StatusBadRequest, w.Code) + }) + + t.Run("MissingRequiredFields", func(t *testing.T) { + reqBody := map[string]interface{}{ + "from": "en", + } + body, _ := json.Marshal(reqBody) + + w := httptest.NewRecorder() + req, _ := http.NewRequest("POST", "/translate", bytes.NewBuffer(body)) + req.Header.Set("Content-Type", "application/json") + req.Header.Set("Authorization", "test-token") + r.ServeHTTP(w, req) + + assert.Equal(t, http.StatusBadRequest, w.Code) + }) +} diff --git a/src/mtran/vendor/mtranserver/deprecated/go/internal/server/server.go b/src/mtran/vendor/mtranserver/deprecated/go/internal/server/server.go new file mode 100644 index 0000000..3b2a710 --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/go/internal/server/server.go @@ -0,0 +1,93 @@ +package server + +import ( + "context" + "fmt" + "net/http" + "os" + "os/signal" + "syscall" + "time" + + "github.com/gin-gonic/gin" + + "github.com/xxnuo/MTranServer/internal/config" + "github.com/xxnuo/MTranServer/internal/logger" + "github.com/xxnuo/MTranServer/internal/manager" + "github.com/xxnuo/MTranServer/internal/middleware" + "github.com/xxnuo/MTranServer/internal/models" + "github.com/xxnuo/MTranServer/internal/routes" + "github.com/xxnuo/MTranServer/internal/services" +) + +func Run() error { + + cfg := config.GetConfig() + + if err := models.InitRecords(); err != nil { + return fmt.Errorf("failed to initialize records: %w", err) + } + + if err := os.MkdirAll(cfg.ModelDir, 0755); err != nil { + return fmt.Errorf("failed to create model directory: %w", err) + } + + if err := manager.EnsureWorkerBinary(cfg); err != nil { + return fmt.Errorf("failed to initialize worker binary: %w", err) + } + + gin.SetMode(gin.ReleaseMode) + + r := gin.New() + + r.Use(middleware.Recovery()) + r.Use(middleware.Logger()) + + routes.Setup(r, cfg.APIToken) + + addr := fmt.Sprintf("%s:%s", cfg.Host, cfg.Port) + srv := &http.Server{ + Addr: addr, + Handler: r, + } + + shutdownDone := make(chan struct{}) + + go func() { + sigChan := make(chan os.Signal, 1) + signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM) + <-sigChan + + logger.Info("Shutting down server...") + + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + + services.CleanupAllEngines() + + if err := srv.Shutdown(ctx); err != nil { + logger.Error("Server forced to shutdown: %v", err) + } + + close(shutdownDone) + }() + + fmt.Fprintf(os.Stderr, "[INFO] %s HTTP Service URL: http://%s\n", + time.Now().Format("2006/01/02 15:04:05"), addr) + fmt.Fprintf(os.Stderr, "[INFO] %s Swagger UI: http://%s/docs/index.html\n", + time.Now().Format("2006/01/02 15:04:05"), addr) + + fmt.Fprintf(os.Stderr, "[INFO] %s Log level set to: %s\n", + time.Now().Format("2006/01/02 15:04:05"), cfg.LogLevel) + + if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed { + + services.CleanupAllEngines() + return fmt.Errorf("failed to start server: %w", err) + } + + <-shutdownDone + logger.Info("Server shutdown complete") + + return nil +} diff --git a/src/mtran/vendor/mtranserver/deprecated/go/internal/server/server_test.go b/src/mtran/vendor/mtranserver/deprecated/go/internal/server/server_test.go new file mode 100644 index 0000000..f2731a2 --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/go/internal/server/server_test.go @@ -0,0 +1,89 @@ +package server + +import ( + "net/http" + "net/http/httptest" + "os" + "testing" + + "github.com/gin-gonic/gin" + "github.com/stretchr/testify/assert" + "github.com/xxnuo/MTranServer/internal/models" + "github.com/xxnuo/MTranServer/internal/routes" + "github.com/xxnuo/MTranServer/internal/version" +) + +func TestMain(m *testing.M) { + gin.SetMode(gin.TestMode) + + models.GlobalRecords = &models.RecordsData{ + Data: []models.RecordItem{ + {SourceLanguage: "en", TargetLanguage: "zh-Hans"}, + }, + } + + os.Exit(m.Run()) +} + +func TestGetVersion(t *testing.T) { + v := version.GetVersion() + assert.NotEmpty(t, v) +} + +func TestServerRoutes(t *testing.T) { + r := gin.New() + routes.Setup(r, "") + + tests := []struct { + name string + method string + path string + expectedStatus int + }{ + {"Version", "GET", "/version", http.StatusOK}, + {"Health", "GET", "/health", http.StatusOK}, + {"Heartbeat", "GET", "/__heartbeat__", http.StatusOK}, + {"LBHeartbeat", "GET", "/__lbheartbeat__", http.StatusOK}, + {"Languages", "GET", "/languages", http.StatusOK}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + w := httptest.NewRecorder() + req, _ := http.NewRequest(tt.method, tt.path, nil) + r.ServeHTTP(w, req) + + assert.Equal(t, tt.expectedStatus, w.Code) + }) + } +} + +func TestServerRoutesWithAuth(t *testing.T) { + r := gin.New() + routes.Setup(r, "test-token") + + tests := []struct { + name string + method string + path string + token string + expectedStatus int + }{ + {"LanguagesWithToken", "GET", "/languages", "test-token", http.StatusOK}, + {"LanguagesWithoutToken", "GET", "/languages", "", http.StatusUnauthorized}, + {"LanguagesWithWrongToken", "GET", "/languages", "wrong-token", http.StatusUnauthorized}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + w := httptest.NewRecorder() + req, _ := http.NewRequest(tt.method, tt.path, nil) + if tt.token != "" { + req.Header.Set("Authorization", tt.token) + } + r.ServeHTTP(w, req) + + assert.Equal(t, tt.expectedStatus, w.Code) + }) + } +} diff --git a/src/mtran/vendor/mtranserver/deprecated/go/internal/services/detector.go b/src/mtran/vendor/mtranserver/deprecated/go/internal/services/detector.go new file mode 100644 index 0000000..5a16a15 --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/go/internal/services/detector.go @@ -0,0 +1,308 @@ +package services + +import ( + "strings" + "sync" + "unicode" + + "github.com/pemistahl/lingua-go" + "github.com/xxnuo/MTranServer/internal/logger" + "github.com/xxnuo/MTranServer/internal/models" +) + +const ( + defaultConfidenceThreshold = 0.5 + minimumRelativeDistance = 0.99 + maximumLanguagesInOneText = 2 +) + +var ( + detector lingua.LanguageDetector + detectorOnce sync.Once + supportedLanguages map[string]bool +) + +func initDetector() { + detectorOnce.Do(func() { + logger.Debug("Initializing language detector") + + supportedLanguages = make(map[string]bool) + langs, err := models.GetSupportedLanguages() + if err != nil { + logger.Warn("Failed to get supported languages: %v, using all languages", err) + detector = lingua.NewLanguageDetectorBuilder(). + FromAllLanguages(). + WithMinimumRelativeDistance(minimumRelativeDistance). + WithLowAccuracyMode(). + WithPreloadedLanguageModels(). + Build() + return + } + + for _, lang := range langs { + supportedLanguages[lang] = true + } + + linguaLangs := make([]lingua.Language, 0, len(langs)) + for _, lang := range langs { + linguaLang := bcp47ToLingua(lang) + if linguaLang != lingua.Unknown { + linguaLangs = append(linguaLangs, linguaLang) + } + } + + if len(linguaLangs) < 2 { + logger.Warn("Not enough supported languages (%d), using all languages", len(linguaLangs)) + detector = lingua.NewLanguageDetectorBuilder(). + FromAllLanguages(). + WithLowAccuracyMode(). + WithPreloadedLanguageModels(). + Build() + } else { + detector = lingua.NewLanguageDetectorBuilder(). + FromLanguages(linguaLangs...). + WithLowAccuracyMode(). + WithPreloadedLanguageModels(). + Build() + } + + logger.Debug("Language detector initialized, %d supported languages", len(supportedLanguages)) + }) +} + +func bcp47ToLingua(code string) lingua.Language { + switch code { + case "zh-Hans", "zh": + return lingua.Chinese + default: + isoCode := lingua.GetIsoCode639_1FromValue(strings.ToUpper(code)) + return lingua.GetLanguageFromIsoCode639_1(isoCode) + } +} + +func isSupportedLanguage(lang string) bool { + if len(supportedLanguages) == 0 { + return true + } + return supportedLanguages[lang] +} + +func linguaToBCP47(lang lingua.Language) string { + + switch lang { + case lingua.Chinese: + + return "zh-Hans" + default: + + code := lang.IsoCode639_1() + return strings.ToLower(code.String()) + } +} + +func DetectLanguage(text string) string { + if text == "" { + return "" + } + + initDetector() + + lang, exists := detector.DetectLanguageOf(text) + if !exists { + return "" + } + + return linguaToBCP47(lang) +} + +func DetectLanguageWithConfidence(text string, minConfidence float64) (string, float64) { + if text == "" { + return "", 0.0 + } + + initDetector() + + confidenceValues := detector.ComputeLanguageConfidenceValues(text) + if len(confidenceValues) == 0 { + return "", 0.0 + } + + topResult := confidenceValues[0] + confidence := topResult.Value() + + if confidence < minConfidence { + return "", confidence + } + + return linguaToBCP47(topResult.Language()), confidence +} + +type TextSegment struct { + Text string + Language string + Start int + End int + Confidence float64 +} + +func DetectMultipleLanguages(text string) []TextSegment { + return DetectMultipleLanguagesWithThreshold(text, defaultConfidenceThreshold) +} + +func hasMixedScripts(text string) bool { + var hasCJK, hasLatin bool + for _, r := range text { + if unicode.Is(unicode.Han, r) || unicode.Is(unicode.Hiragana, r) || unicode.Is(unicode.Katakana, r) || unicode.Is(unicode.Hangul, r) { + hasCJK = true + } else if unicode.Is(unicode.Latin, r) { + hasLatin = true + } + if hasCJK && hasLatin { + return true + } + } + return false +} + +func DetectMultipleLanguagesWithThreshold(text string, threshold float64) []TextSegment { + if text == "" { + return nil + } + + initDetector() + + fallbackLang, _ := detector.DetectLanguageOf(text) + fallbackBCP47 := linguaToBCP47(fallbackLang) + if !isSupportedLanguage(fallbackBCP47) { + fallbackBCP47 = "en" + } + + if !hasMixedScripts(text) { + logger.Debug("DetectMultipleLanguages: no mixed scripts, using single language: %s", fallbackBCP47) + return []TextSegment{{ + Text: text, + Language: fallbackBCP47, + Start: 0, + End: len(text), + Confidence: 1.0, + }} + } + + logger.Debug("DetectMultipleLanguages: mixed scripts detected, fallback=%s, threshold=%.2f", fallbackBCP47, threshold) + + results := detector.DetectMultipleLanguagesOf(text) + if len(results) == 0 { + logger.Debug("DetectMultipleLanguages: no segments detected") + return nil + } + + rawSegments := make([]TextSegment, 0, len(results)) + for i, r := range results { + start := r.StartIndex() + end := r.EndIndex() + segmentText := text[start:end] + detectedLang := linguaToBCP47(r.Language()) + + var lang string + var usedFallback bool + if isSupportedLanguage(detectedLang) { + lang = detectedLang + } else { + lang = fallbackBCP47 + usedFallback = true + } + + logger.Debug("DetectMultipleLanguages: segment[%d] lang=%s, fallback=%v, text=%q", + i, lang, usedFallback, segmentText) + + rawSegments = append(rawSegments, TextSegment{ + Text: segmentText, + Language: lang, + Start: start, + End: end, + Confidence: 1.0, + }) + } + + segments := mergeAdjacentSegments(rawSegments, text) + logger.Debug("DetectMultipleLanguages: merged %d -> %d segments", len(rawSegments), len(segments)) + + segments = limitLanguages(segments, text, maximumLanguagesInOneText) + + return segments +} + +func mergeAdjacentSegments(segments []TextSegment, originalText string) []TextSegment { + if len(segments) <= 1 { + return segments + } + + merged := make([]TextSegment, 0, len(segments)) + current := segments[0] + + for i := 1; i < len(segments); i++ { + next := segments[i] + if current.Language == next.Language { + current.Text = originalText[current.Start:next.End] + current.End = next.End + if next.Confidence > current.Confidence { + current.Confidence = next.Confidence + } + } else { + merged = append(merged, current) + current = next + } + } + merged = append(merged, current) + + return merged +} + +func limitLanguages(segments []TextSegment, originalText string, maxLangs int) []TextSegment { + if len(segments) <= 1 { + return segments + } + + langBytes := make(map[string]int) + for _, seg := range segments { + langBytes[seg.Language] += seg.End - seg.Start + } + + if len(langBytes) <= maxLangs { + return segments + } + + type langSize struct { + lang string + size int + } + sorted := make([]langSize, 0, len(langBytes)) + for lang, size := range langBytes { + sorted = append(sorted, langSize{lang, size}) + } + for i := 0; i < len(sorted)-1; i++ { + for j := i + 1; j < len(sorted); j++ { + if sorted[j].size > sorted[i].size { + sorted[i], sorted[j] = sorted[j], sorted[i] + } + } + } + + keepLangs := make(map[string]bool) + for i := 0; i < maxLangs && i < len(sorted); i++ { + keepLangs[sorted[i].lang] = true + } + + primaryLang := sorted[0].lang + + for i := range segments { + if !keepLangs[segments[i].Language] { + segments[i].Language = primaryLang + } + } + + result := mergeAdjacentSegments(segments, originalText) + logger.Debug("limitLanguages: reduced to %d languages, %d segments", maxLangs, len(result)) + + return result +} diff --git a/src/mtran/vendor/mtranserver/deprecated/go/internal/services/engine.go b/src/mtran/vendor/mtranserver/deprecated/go/internal/services/engine.go new file mode 100644 index 0000000..c4c7d9d --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/go/internal/services/engine.go @@ -0,0 +1,537 @@ +package services + +import ( + "context" + "errors" + "fmt" + "os" + "path/filepath" + "strings" + "sync" + "time" + + "github.com/xxnuo/MTranServer/internal/config" + "github.com/xxnuo/MTranServer/internal/logger" + "github.com/xxnuo/MTranServer/internal/manager" + "github.com/xxnuo/MTranServer/internal/models" + "github.com/xxnuo/MTranServer/internal/utils" +) + +type EngineInfo struct { + Managers []*manager.Manager + LastUsed time.Time + FromLang string + ToLang string + stopTimer *time.Timer + mu sync.Mutex + nextIdx int +} + +var ( + engines = make(map[string]*EngineInfo) + engMu sync.RWMutex +) + +const ( + workerMemoryMB = 2048 + reservedMemoryMB = 4096 +) + +var ErrInsufficientMemory = errors.New("insufficient memory to create new worker") + +func canCreateNewWorker() bool { + availableMB := getAvailableMemoryMB() + if availableMB == 0 { + logger.Debug("Cannot determine available memory, allowing worker creation") + return true + } + + requiredMB := uint64(workerMemoryMB + reservedMemoryMB) + canCreate := availableMB >= requiredMB + + logger.Debug("Memory check: available=%dMB, required=%dMB, canCreate=%v", + availableMB, requiredMB, canCreate) + + return canCreate +} + +func (ei *EngineInfo) resetIdleTimer() { + ei.mu.Lock() + defer ei.mu.Unlock() + + ei.LastUsed = time.Now() + + if ei.stopTimer != nil { + ei.stopTimer.Stop() + } + + cfg := config.GetConfig() + timeout := time.Duration(cfg.WorkerIdleTimeout) * time.Second + + ei.stopTimer = time.AfterFunc(timeout, func() { + defer func() { + if r := recover(); r != nil { + logger.Error("Panic during engine cleanup: %v", r) + } + }() + + key := fmt.Sprintf("%s-%s", ei.FromLang, ei.ToLang) + logger.Info("Engine %s idle timeout, stopping...", key) + + engMu.Lock() + defer engMu.Unlock() + + if info, ok := engines[key]; ok { + for _, m := range info.Managers { + if m != nil { + if err := m.Cleanup(); err != nil { + logger.Error("Failed to cleanup manager: %v", err) + } + } + } + delete(engines, key) + logger.Info("Engine %s stopped due to idle timeout", key) + } + }) +} + +func (ei *EngineInfo) getNextManager() *manager.Manager { + ei.mu.Lock() + defer ei.mu.Unlock() + + if len(ei.Managers) == 0 { + return nil + } + + // Try to find a running manager first + startIdx := ei.nextIdx + for i := 0; i < len(ei.Managers); i++ { + idx := (startIdx + i) % len(ei.Managers) + m := ei.Managers[idx] + if m != nil && m.IsRunning() { + ei.nextIdx = idx + 1 // Start from next one next time + return m + } + } + + // If no running manager found, just return the next one in round-robin fashion + // (it will likely fail, but that's expected if all are restarting) + idx := ei.nextIdx % len(ei.Managers) + ei.nextIdx++ + return ei.Managers[idx] +} + +// Helper to get engine info without creating one if not exists +func getEngineInfo(fromLang, toLang string) *EngineInfo { + key := fmt.Sprintf("%s-%s", fromLang, toLang) + engMu.RLock() + defer engMu.RUnlock() + return engines[key] +} + +func getOrCreateSingleEngine(fromLang, toLang string) (*manager.Manager, error) { + key := fmt.Sprintf("%s-%s", fromLang, toLang) + + engMu.RLock() + if info, ok := engines[key]; ok && info != nil { + m := info.getNextManager() + if m != nil { + engMu.RUnlock() + info.resetIdleTimer() + return m, nil + } + } + engMu.RUnlock() + + engMu.Lock() + defer engMu.Unlock() + + if info, ok := engines[key]; ok && info != nil { + m := info.getNextManager() + if m != nil { + info.resetIdleTimer() + return m, nil + } + } + + if !canCreateNewWorker() { + availableMB := getAvailableMemoryMB() + return nil, fmt.Errorf("%w: available memory %dMB, need at least %dMB", + ErrInsufficientMemory, availableMB, workerMemoryMB+reservedMemoryMB) + } + + logger.Info("Creating new engine pool for %s -> %s", fromLang, toLang) + + cfg := config.GetConfig() + if cfg.EnableOfflineMode { + logger.Info("Offline mode enabled, skipping model download") + } else { + logger.Info("Downloading model for %s -> %s", fromLang, toLang) + if err := models.DownloadModel(toLang, fromLang, ""); err != nil { + return nil, fmt.Errorf("failed to download model: %w", err) + } + } + + langPairDir := filepath.Join(cfg.ModelDir, fmt.Sprintf("%s_%s", fromLang, toLang)) + if err := os.MkdirAll(langPairDir, 0755); err != nil { + return nil, fmt.Errorf("failed to create work directory: %w", err) + } + + numWorkers := cfg.WorkersPerLanguage + if numWorkers <= 0 { + numWorkers = 1 + } + + managers := make([]*manager.Manager, 0, numWorkers) + for i := 0; i < numWorkers; i++ { + port, err := utils.GetFreePort() + if err != nil { + for _, m := range managers { + m.Cleanup() + } + return nil, fmt.Errorf("failed to allocate port: %w", err) + } + + args := manager.NewWorkerArgs() + args.Port = port + args.LogLevel = cfg.LogLevel + args.WorkDir = langPairDir + args.ModelDir = langPairDir + + m := manager.NewManager(args) + + if err := m.Start(); err != nil { + for _, m := range managers { + m.Cleanup() + } + return nil, fmt.Errorf("failed to start manager: %w", err) + } + + ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) + ready := false + for j := 0; j < 30; j++ { + var err error + ready, err = m.Health(ctx) + logger.Debug("Worker %d health check %d: ready=%v, err=%v", i+1, j+1, ready, err) + if err == nil && ready { + break + } + time.Sleep(100 * time.Millisecond) + } + cancel() + + if !ready { + m.Cleanup() + for _, m := range managers { + m.Cleanup() + } + return nil, fmt.Errorf("worker %d failed to become ready", i+1) + } + + managers = append(managers, m) + logger.Info("Worker %d/%d created for %s -> %s on port %d", i+1, numWorkers, fromLang, toLang, port) + } + + info := &EngineInfo{ + Managers: managers, + LastUsed: time.Now(), + FromLang: fromLang, + ToLang: toLang, + nextIdx: 0, + } + info.resetIdleTimer() + + engines[key] = info + logger.Info("Engine pool created successfully for %s -> %s with %d workers", fromLang, toLang, numWorkers) + + return managers[0], nil +} + +func needsPivotTranslation(fromLang, toLang string) bool { + + if fromLang == "en" || toLang == "en" { + return false + } + + if models.GlobalRecords != nil && models.GlobalRecords.HasLanguagePair(fromLang, toLang) { + return false + } + + return true +} + +func GetOrCreateEngine(fromLang, toLang string) (*manager.Manager, error) { + + if !needsPivotTranslation(fromLang, toLang) { + return getOrCreateSingleEngine(fromLang, toLang) + } + + logger.Debug("Translation %s -> %s requires pivot through English", fromLang, toLang) + return getOrCreateSingleEngine(fromLang, "en") +} + +func translateSegment(ctx context.Context, fromLang, toLang, text string, isHTML bool) (string, error) { + if fromLang == toLang { + return text, nil + } + + if !needsPivotTranslation(fromLang, toLang) { + return translateSingleLanguageText(ctx, fromLang, toLang, text, isHTML) + } + + // Pivot Translation + + // Step 1: from -> en + intermediateText, err := translateSingleLanguageText(ctx, fromLang, "en", text, isHTML) + if err != nil { + return "", err + } + + // Step 2: en -> to + return translateSingleLanguageText(ctx, "en", toLang, intermediateText, isHTML) +} + +func TranslateWithPivot(ctx context.Context, fromLang, toLang, text string, isHTML bool) (string, error) { + logger.Debug("TranslateWithPivot: %s -> %s, text length: %d, isHTML: %v", fromLang, toLang, len(text), isHTML) + + if fromLang != "auto" && len(text) <= 128 { + if fromLang == toLang { + return text, nil + } + return translateSegment(ctx, fromLang, toLang, text, isHTML) + } + + segments := DetectMultipleLanguages(text) + if len(segments) <= 1 { + var effectiveFromLang string + if len(segments) == 1 { + effectiveFromLang = segments[0].Language + } else if fromLang == "auto" { + detected := DetectLanguage(text) + if detected == "" { + return "", fmt.Errorf("failed to detect source language") + } + effectiveFromLang = detected + } else { + effectiveFromLang = fromLang + } + if effectiveFromLang == toLang { + return text, nil + } + return translateSegment(ctx, effectiveFromLang, toLang, text, isHTML) + } + + logger.Debug("Detected %d language segments", len(segments)) + var result strings.Builder + lastEnd := 0 + + for _, seg := range segments { + if seg.Start > lastEnd { + result.WriteString(text[lastEnd:seg.Start]) + } + + if seg.Language == toLang { + result.WriteString(seg.Text) + } else { + translated, err := translateSegment(ctx, seg.Language, toLang, seg.Text, isHTML) + if err != nil { + logger.Error("Failed to translate segment: %v", err) + result.WriteString(seg.Text) + } else { + result.WriteString(translated) + } + } + lastEnd = seg.End + } + + if lastEnd < len(text) { + result.WriteString(text[lastEnd:]) + } + + return result.String(), nil +} + +func translateSingleLanguageText(ctx context.Context, fromLang, toLang, text string, isHTML bool) (string, error) { + // 1. Get initial manager (will ensure pool is created) + m, err := getOrCreateSingleEngine(fromLang, toLang) + if err != nil { + logger.Error("translateSingleLanguageText: failed to get engine: %v", err) + return "", err + } + + // Get engine info to check concurrency/count + info := getEngineInfo(fromLang, toLang) + var maxRetries int = 1 + if info != nil { + maxRetries = len(info.Managers) * 2 // Try twice per manager on average + if maxRetries < 3 { + maxRetries = 3 + } + } + + var lastErr error + + for i := 0; i < maxRetries; i++ { + // If retrying, get a potentially new manager (load balanced) + if i > 0 && info != nil { + m = info.getNextManager() + if m == nil { + // Should not happen if pool is alive + return "", fmt.Errorf("no managers available") + } + } + + logger.Debug("translateSingleLanguageText: attempting translation (try %d/%d)", i+1, maxRetries) + var result string + if isHTML { + result, err = m.TranslateHTML(ctx, text) + } else { + result, err = m.Translate(ctx, text) + } + + if err == nil { + return result, nil + } + + // Check if error is retryable (worker failure) + if isConnectionError(err) { + logger.Debug("Translation attempt %d failed (connection error): %v. Retrying with next manager...", i+1, err) + lastErr = err + // Backoff: 500ms, 1000ms, 2000ms... + backoff := time.Duration(500*(1< 3*time.Second { + backoff = 3 * time.Second + } + time.Sleep(backoff) + continue + } + + // If it's not a connection error (e.g. invalid request), return immediately + return "", err + } + + // If all retries failed, fallback to segmented translation if applicable? + // The original code did that. Let's preserve it if appropriate. + if lastErr != nil { + logger.Warn("All translation attempts failed. Last error: %v. Trying segmented translation.", lastErr) + segResult, segErr := translateWithSegments(ctx, fromLang, toLang, text, isHTML) + if segErr != nil { + return "", lastErr // Return the main error + } + return segResult, nil + } + + return "", lastErr +} + +func CleanupAllEngines() { + engMu.Lock() + defer engMu.Unlock() + + if len(engines) == 0 { + logger.Debug("No engines to cleanup") + return + } + + logger.Info("Cleaning up %d engine(s)...", len(engines)) + + var wg sync.WaitGroup + for key, info := range engines { + wg.Add(1) + go func(k string, ei *EngineInfo) { + defer wg.Done() + defer func() { + if r := recover(); r != nil { + logger.Error("Panic while cleaning up engine %s: %v", k, r) + } + }() + + logger.Debug("Stopping engine: %s", k) + + ei.mu.Lock() + if ei.stopTimer != nil { + ei.stopTimer.Stop() + } + ei.mu.Unlock() + + for _, m := range ei.Managers { + if m != nil { + if err := m.Cleanup(); err != nil { + logger.Error("Failed to cleanup manager: %v", err) + } else { + logger.Debug("Manager cleaned up successfully") + } + } + } + }(key, info) + } + + done := make(chan struct{}) + go func() { + wg.Wait() + close(done) + }() + + select { + case <-done: + logger.Info("All engines cleaned up successfully") + case <-time.After(15 * time.Second): + logger.Warn("Engine cleanup timeout after 15 seconds") + } + + engines = make(map[string]*EngineInfo) +} + +func isConnectionError(err error) bool { + if err == nil { + return false + } + errMsg := err.Error() + return strings.Contains(errMsg, "module closed") || + strings.Contains(errMsg, "exit_code") || + strings.Contains(errMsg, "not connected") || + strings.Contains(errMsg, "failed to send message") || + strings.Contains(errMsg, "failed to read response") || + strings.Contains(errMsg, "wasm error") || + strings.Contains(errMsg, "invalid table access") || + strings.Contains(errMsg, "manager not running") || + strings.Contains(errMsg, "worker connection failed") +} + +func translateWithSegments(ctx context.Context, fromLang, toLang, text string, isHTML bool) (string, error) { + segments := DetectMultipleLanguages(text) + if len(segments) <= 1 { + return "", fmt.Errorf("segmented translation not applicable") + } + + logger.Debug("Attempting segmented translation with %d segments", len(segments)) + var result strings.Builder + lastEnd := 0 + + for _, seg := range segments { + if seg.Start > lastEnd { + result.WriteString(text[lastEnd:seg.Start]) + } + + if seg.Language == toLang { + result.WriteString(seg.Text) + } else { + segFromLang := seg.Language + if fromLang != "auto" && fromLang != "" { + segFromLang = fromLang + } + translated, err := translateSegment(ctx, segFromLang, toLang, seg.Text, isHTML) + if err != nil { + return "", fmt.Errorf("segmented translation failed: %w", err) + } + result.WriteString(translated) + } + lastEnd = seg.End + } + + if lastEnd < len(text) { + result.WriteString(text[lastEnd:]) + } + + return result.String(), nil +} diff --git a/src/mtran/vendor/mtranserver/deprecated/go/internal/services/memory.go b/src/mtran/vendor/mtranserver/deprecated/go/internal/services/memory.go new file mode 100644 index 0000000..6a68bea --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/go/internal/services/memory.go @@ -0,0 +1,13 @@ +package services + +import ( + "github.com/shirou/gopsutil/v4/mem" +) + +func getAvailableMemoryMB() uint64 { + v, err := mem.VirtualMemory() + if err != nil { + return 0 + } + return v.Available / 1024 / 1024 +} diff --git a/src/mtran/vendor/mtranserver/deprecated/go/internal/utils/env.go b/src/mtran/vendor/mtranserver/deprecated/go/internal/utils/env.go new file mode 100644 index 0000000..798fa8d --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/go/internal/utils/env.go @@ -0,0 +1,33 @@ +package utils + +import ( + "os" + "strconv" +) + +func GetEnv(key string, defaultValue string) string { + if value := os.Getenv(key); value != "" { + return value + } + return defaultValue +} + +func GetBoolEnv(key string, defaultValue bool) bool { + if value := os.Getenv(key); value != "" { + result, err := strconv.ParseBool(value) + if err == nil && result { + return result + } + } + return defaultValue +} + +func GetIntEnv(key string, defaultValue int) int { + if value := os.Getenv(key); value != "" { + result, err := strconv.Atoi(value) + if err == nil { + return result + } + } + return defaultValue +} diff --git a/src/mtran/vendor/mtranserver/deprecated/go/internal/utils/file.go b/src/mtran/vendor/mtranserver/deprecated/go/internal/utils/file.go new file mode 100644 index 0000000..667fbed --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/go/internal/utils/file.go @@ -0,0 +1,76 @@ +package utils + +import ( + "crypto/sha256" + "encoding/hex" + "fmt" + "io" + "os" + + "github.com/klauspost/compress/zstd" +) + +func VerifySHA256(filepath, expectedHash string) error { + file, err := os.Open(filepath) + if err != nil { + return fmt.Errorf("Failed to open file: %w", err) + } + defer file.Close() + + hash := sha256.New() + if _, err := io.Copy(hash, file); err != nil { + return fmt.Errorf("Failed to calculate SHA256: %w", err) + } + + actualHash := hex.EncodeToString(hash.Sum(nil)) + if actualHash != expectedHash { + return fmt.Errorf("SHA256 mismatch: expected %s, actual %s", expectedHash, actualHash) + } + + return nil +} + +func ComputeSHA256(filepath string) (string, error) { + file, err := os.Open(filepath) + if err != nil { + return "", fmt.Errorf("Failed to open file: %w", err) + } + defer file.Close() + + hash := sha256.New() + if _, err := io.Copy(hash, file); err != nil { + return "", fmt.Errorf("Failed to calculate SHA256: %w", err) + } + + return hex.EncodeToString(hash.Sum(nil)), nil +} + +func DecompressZstd(src, dst string) error { + // Open the source file + inputFile, err := os.Open(src) + if err != nil { + return fmt.Errorf("failed to open source file: %w", err) + } + defer inputFile.Close() + + // Create the decoder + decoder, err := zstd.NewReader(inputFile) + if err != nil { + return fmt.Errorf("failed to create zstd reader: %w", err) + } + defer decoder.Close() + + // Create the destination file + outputFile, err := os.Create(dst) + if err != nil { + return fmt.Errorf("failed to create destination file: %w", err) + } + defer outputFile.Close() + + // Copy the decompressed data + if _, err := io.Copy(outputFile, decoder); err != nil { + return fmt.Errorf("failed to decompress data: %w", err) + } + + return nil +} diff --git a/src/mtran/vendor/mtranserver/deprecated/go/internal/utils/file_test.go b/src/mtran/vendor/mtranserver/deprecated/go/internal/utils/file_test.go new file mode 100644 index 0000000..e426478 --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/go/internal/utils/file_test.go @@ -0,0 +1,33 @@ +package utils + +import ( + "os" + "path/filepath" + "testing" +) + +func TestCalculateSHA256(t *testing.T) { + + tempDir, err := os.MkdirTemp("", "file-test-*") + if err != nil { + t.Fatal(err) + } + defer os.RemoveAll(tempDir) + + testContent := []byte("Hello, World!") + expectedSHA256 := "dffd6021bb2bd5b0af676290809ec3a53191dd81c7f70a4b28688a362182986f" + + filePath := filepath.Join(tempDir, "test.txt") + if err := os.WriteFile(filePath, testContent, 0644); err != nil { + t.Fatal(err) + } + + hash, err := ComputeSHA256(filePath) + if err != nil { + t.Fatalf("计算 SHA256 失败: %v", err) + } + + if hash != expectedSHA256 { + t.Fatalf("SHA256 不匹配: 期望 %s, 实际 %s", expectedSHA256, hash) + } +} diff --git a/src/mtran/vendor/mtranserver/deprecated/go/internal/utils/lang_alias.go b/src/mtran/vendor/mtranserver/deprecated/go/internal/utils/lang_alias.go new file mode 100644 index 0000000..07aa6ac --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/go/internal/utils/lang_alias.go @@ -0,0 +1,102 @@ +package utils + +import ( + "strings" +) + +// languageAliases maps common language code aliases to the internal BCP 47 representation +var languageAliases = map[string]string{ + // Chinese + "zh": "zh-Hans", + "zh-cn": "zh-Hans", + "zh-sg": "zh-Hans", + "zh-hans": "zh-Hans", + "cmn": "zh-Hans", + "chinese": "zh-Hans", + + "zh-tw": "zh-Hant", + "zh-hk": "zh-Hant", + "zh-mo": "zh-Hant", + "zh-hant": "zh-Hant", + "cht": "zh-Hant", + + // English + "en-us": "en", + "en-gb": "en", + "en-au": "en", + "en-ca": "en", + "en-nz": "en", + "en-ie": "en", + "en-za": "en", + "en-jm": "en", + "en-bz": "en", + "en-tt": "en", + + // French + "fr-fr": "fr", + "fr-ca": "fr", + "fr-be": "fr", + "fr-ch": "fr", + + // Spanish + "es-es": "es", + "es-mx": "es", + "es-ar": "es", + "es-co": "es", + "es-cl": "es", + "es-pe": "es", + "es-ve": "es", + + // Portuguese + "pt-pt": "pt", + "pt-br": "pt", + + // German + "de-de": "de", + "de-at": "de", + "de-ch": "de", + + // Italian + "it-it": "it", + "it-ch": "it", + + // Japanese + "ja-jp": "ja", + "jp": "ja", + + // Korean + "ko-kr": "ko", + "kr": "ko", + + // Russian + "ru-ru": "ru", + + // Norwegian + "nb": "no", +} + +// NormalizeLanguageCode normalizes a language code to the internal BCP 47 format +func NormalizeLanguageCode(code string) string { + if code == "" { + return "" + } + + // Normalize format: lowercase and replace underscore with dash + code = strings.ToLower(strings.ReplaceAll(code, "_", "-")) + + // Check direct aliases first + if normalized, ok := languageAliases[code]; ok { + return normalized + } + + // Handle standard BCP 47 fallback (e.g., en-US -> en) if not explicitly in map + parts := strings.Split(code, "-") + mainCode := parts[0] + + // Check if the main code itself is an alias or needs normalization (unlikely for simple ones but good for safety) + if normalized, ok := languageAliases[mainCode]; ok { + return normalized + } + + return mainCode +} diff --git a/src/mtran/vendor/mtranserver/deprecated/go/internal/utils/lang_alias_test.go b/src/mtran/vendor/mtranserver/deprecated/go/internal/utils/lang_alias_test.go new file mode 100644 index 0000000..f5c9461 --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/go/internal/utils/lang_alias_test.go @@ -0,0 +1,43 @@ +package utils + +import ( + "testing" +) + +func TestNormalizeLanguageCode(t *testing.T) { + tests := []struct { + input string + expected string + }{ + {"", ""}, + {"en", "en"}, + {"EN", "en"}, + {"en-US", "en"}, + {"en_US", "en"}, + {"zh", "zh-Hans"}, + {"zh-CN", "zh-Hans"}, + {"zh_CN", "zh-Hans"}, + {"zh-Hans", "zh-Hans"}, + {"zh-SG", "zh-Hans"}, + {"zh-TW", "zh-Hant"}, + {"zh-HK", "zh-Hant"}, + {"zh-Hant", "zh-Hant"}, + {"fr-CA", "fr"}, + {"es-MX", "es"}, + {"pt-BR", "pt"}, + {"ja", "ja"}, + {"jp", "ja"}, + {"ko", "ko"}, + {"kr", "ko"}, + {"unknown-Code", "unknown"}, + } + + for _, tt := range tests { + t.Run(tt.input, func(t *testing.T) { + got := NormalizeLanguageCode(tt.input) + if got != tt.expected { + t.Errorf("NormalizeLanguageCode(%q) = %q, want %q", tt.input, got, tt.expected) + } + }) + } +} diff --git a/src/mtran/vendor/mtranserver/deprecated/go/internal/utils/port.go b/src/mtran/vendor/mtranserver/deprecated/go/internal/utils/port.go new file mode 100644 index 0000000..52027cc --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/go/internal/utils/port.go @@ -0,0 +1,17 @@ +package utils + +import "net" + +func GetFreePort() (int, error) { + addr, err := net.ResolveTCPAddr("tcp", "localhost:0") + if err != nil { + return 0, err + } + + l, err := net.ListenTCP("tcp", addr) + if err != nil { + return 0, err + } + defer l.Close() + return l.Addr().(*net.TCPAddr).Port, nil +} diff --git a/src/mtran/vendor/mtranserver/deprecated/go/internal/utils/port_test.go b/src/mtran/vendor/mtranserver/deprecated/go/internal/utils/port_test.go new file mode 100644 index 0000000..e742a8e --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/go/internal/utils/port_test.go @@ -0,0 +1,15 @@ +package utils_test + +import ( + "testing" + + "github.com/xxnuo/MTranServer/internal/utils" +) + +func TestGetFreePort(t *testing.T) { + port, err := utils.GetFreePort() + if err != nil { + t.Fatalf("Failed to get free port: %v", err) + } + t.Logf("Free port: %d", port) +} diff --git a/src/mtran/vendor/mtranserver/deprecated/go/internal/utils/version.go b/src/mtran/vendor/mtranserver/deprecated/go/internal/utils/version.go new file mode 100644 index 0000000..53f6560 --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/go/internal/utils/version.go @@ -0,0 +1,121 @@ +package utils + +import ( + "strconv" + "strings" +) + +func GetLargestVersion(versions []string) string { + if len(versions) == 0 { + return "" + } + + largest := versions[0] + for _, v := range versions[1:] { + if compareVersions(v, largest) > 0 { + largest = v + } + } + return largest +} + +func compareVersions(v1, v2 string) int { + + parts1 := strings.Split(v1, "-") + parts2 := strings.Split(v2, "-") + + version1 := parts1[0] + version2 := parts2[0] + + cmp := compareNumericVersions(version1, version2) + if cmp != 0 { + return cmp + } + + if len(parts1) == 1 && len(parts2) > 1 { + return 1 + } + if len(parts1) > 1 && len(parts2) == 1 { + return -1 + } + if len(parts1) == 1 && len(parts2) == 1 { + return 0 + } + + return comparePrerelease(parts1[1], parts2[1]) +} + +func compareNumericVersions(v1, v2 string) int { + segments1 := strings.Split(v1, ".") + segments2 := strings.Split(v2, ".") + + maxLen := len(segments1) + if len(segments2) > maxLen { + maxLen = len(segments2) + } + + for i := 0; i < maxLen; i++ { + var num1, num2 int + + if i < len(segments1) { + num1, _ = strconv.Atoi(segments1[i]) + } + if i < len(segments2) { + num2, _ = strconv.Atoi(segments2[i]) + } + + if num1 > num2 { + return 1 + } + if num1 < num2 { + return -1 + } + } + + return 0 +} + +func comparePrerelease(p1, p2 string) int { + + parts1 := strings.Split(p1, ".") + parts2 := strings.Split(p2, ".") + + maxLen := len(parts1) + if len(parts2) > maxLen { + maxLen = len(parts2) + } + + for i := 0; i < maxLen; i++ { + if i >= len(parts1) { + return -1 + } + if i >= len(parts2) { + return 1 + } + + part1 := parts1[i] + part2 := parts2[i] + + num1, err1 := strconv.Atoi(part1) + num2, err2 := strconv.Atoi(part2) + + if err1 == nil && err2 == nil { + if num1 > num2 { + return 1 + } + if num1 < num2 { + return -1 + } + } else { + + if part1 > part2 { + return 1 + } + if part1 < part2 { + return -1 + } + } + } + + return 0 +} diff --git a/src/mtran/vendor/mtranserver/deprecated/go/internal/utils/version_test.go b/src/mtran/vendor/mtranserver/deprecated/go/internal/utils/version_test.go new file mode 100644 index 0000000..c6c2151 --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/go/internal/utils/version_test.go @@ -0,0 +1,80 @@ +package utils + +import "testing" + +func TestGetLargestVersion(t *testing.T) { + tests := []struct { + name string + versions []string + want string + }{ + { + name: "empty versions", + versions: []string{}, + want: "", + }, + { + name: "single version", + versions: []string{"1.0.0"}, + want: "1.0.0", + }, + { + name: "short versions", + versions: []string{"1.0", "1.1", "1.2"}, + want: "1.2", + }, + { + name: "mixed short versions", + versions: []string{"1", "1.1.0", "1.2", "2"}, + want: "2", + }, + { + name: "basic versions", + versions: []string{"1.0.0", "1.0.1", "1.1.0"}, + want: "1.1.0", + }, + { + name: "prerelease versions", + versions: []string{"1.0.0-alpha.1", "1.0.0-alpha.2", "1.0.0-alpha.3"}, + want: "1.0.0-alpha.3", + }, + { + name: "mixed versions", + versions: []string{"1.0.0-alpha.1", "1.0.0", "1.0.1"}, + want: "1.0.1", + }, + { + name: "release vs prerelease", + versions: []string{"1.0.0-beta.1", "1.0.0"}, + want: "1.0.0", + }, + { + name: "complex versions", + versions: []string{"2.0.0", "1.9.9", "1.10.0", "1.9.10"}, + want: "2.0.0", + }, + { + name: "single version", + versions: []string{"1.0.0"}, + want: "1.0.0", + }, + { + name: "empty versions", + versions: []string{}, + want: "", + }, + { + name: "different prerelease identifiers", + versions: []string{"1.0.0-alpha.1", "1.0.0-beta.1", "1.0.0-rc.1"}, + want: "1.0.0-rc.1", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := GetLargestVersion(tt.versions); got != tt.want { + t.Errorf("GetLargestVersion() = %v, want %v", got, tt.want) + } + }) + } +} diff --git a/src/mtran/vendor/mtranserver/deprecated/go/internal/version/version.go b/src/mtran/vendor/mtranserver/deprecated/go/internal/version/version.go new file mode 100644 index 0000000..062d2f5 --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/go/internal/version/version.go @@ -0,0 +1,17 @@ +package version + +import ( + "strings" + + "github.com/xxnuo/MTranServer/bin" +) + +var Version = "v0.0.0-dev" + +func GetVersion() string { + return Version +} + +func GetWorkerVersion() string { + return strings.TrimSpace(bin.WorkerVersion) +} diff --git a/src/mtran/vendor/mtranserver/deprecated/go/ui.go b/src/mtran/vendor/mtranserver/deprecated/go/ui.go new file mode 100644 index 0000000..33e9449 --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/go/ui.go @@ -0,0 +1,13 @@ +package ui + +import ( + "embed" + "io/fs" +) + +//go:embed all:dist +var distFS embed.FS + +func GetDistFS() (fs.FS, error) { + return fs.Sub(distFS, "dist") +} diff --git a/src/mtran/vendor/mtranserver/deprecated/js/CHANGELOG.md b/src/mtran/vendor/mtranserver/deprecated/js/CHANGELOG.md new file mode 100644 index 0000000..3e07fdc --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/js/CHANGELOG.md @@ -0,0 +1,35 @@ +v3.0.4 + +- 修复模型自动更新逻辑 +- 性能大幅提升,无论原文长短,单个请求平均响应时间 50ms +- 更新模型,提升翻译质量 +- 性能大幅提升的代价是内存占用大幅上涨(英译中占用 2G 内存左右),请注意服务器配置。视用户需求是否推出更轻量级的模式。 + +v3.0.1 - v3.0.3 + +- 完全重写服务架构,提高稳定性和性能 +- 添加 Swagger UI 接口文档 +- 支持 HTTPS 安全连接 +- 添加模型自动下载机制,使用更流畅 +- 支持更多语言对的翻译 +- 更新模型 + +v2.0.0 + +- 适配 ARM 架构 + +v1.1.1 + +- 添加流畅翻译插件支持 +- 添加 OpenAI 接口支持 + +v1.1.0 + +- 修复部分标点符号会翻译成Unicode字符的问题 +- 添加划词翻译插件支持 +- 添加谷歌翻译兼容接口 +- 修复内存溢出问题 + +v1.0.4 + +- 添加波兰语(pt)、波斯语(pl) 模型 \ No newline at end of file diff --git a/src/mtran/vendor/mtranserver/deprecated/js/CONFIG.md b/src/mtran/vendor/mtranserver/deprecated/js/CONFIG.md new file mode 100644 index 0000000..fcce040 --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/js/CONFIG.md @@ -0,0 +1,22 @@ +# Advanced Settings + +In the same directory as the `compose.yml` file, create a `config.ini` file and write the following content to modify as needed: + +```ini +; API token, default empty +CORE_API_TOKEN=your_token +; Internal port, default 8989 +CORE_PORT=8989 +; Log level, default WARNING +CORE_LOG_LEVEL=WARNING +; Number of worker threads, default automatically set +CORE_NUM_WORKERS= +; Request timeout, default 30000ms +CORE_REQUEST_TIMEOUT= +; Maximum number of parallel translations, default automatically set +CORE_MAX_PARALLEL_TRANSLATIONS= +``` + +> You can also set the configuration using the same name in the environment variable. +> +> The entries in the `config.ini` file will override the environment variable settings. diff --git a/src/mtran/vendor/mtranserver/deprecated/js/Dockerfile b/src/mtran/vendor/mtranserver/deprecated/js/Dockerfile new file mode 100644 index 0000000..11dd091 --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/js/Dockerfile @@ -0,0 +1,29 @@ +FROM node:lts-alpine AS builder + +WORKDIR /app +COPY package.json package.json +COPY packages/ ./packages/ +RUN npm install + +FROM alpine:latest + +RUN apk update && \ + apk add --no-cache nodejs curl + +WORKDIR /app + +COPY --from=builder /app/node_modules ./node_modules + +COPY js ./js +COPY package.json ./package.json +COPY start.sh ./start.sh +RUN chmod +x ./start.sh + +EXPOSE 8989 + +ENV NODE_ENV=production +ENV HOST=0.0.0.0 +ENV PORT=8989 + + +CMD ["./start.sh"] diff --git a/src/mtran/vendor/mtranserver/deprecated/js/Dockerfile.model b/src/mtran/vendor/mtranserver/deprecated/js/Dockerfile.model new file mode 100644 index 0000000..531b0fc --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/js/Dockerfile.model @@ -0,0 +1,44 @@ +FROM node:lts-alpine AS builder + +WORKDIR /app +COPY package.json package.json +COPY packages/ ./packages/ +RUN npm install + +COPY js/utils/preload.js ./js/utils/preload.js +COPY js/utils/translator.js ./js/utils/translator.js + +ARG PRELOAD_SRC_LANG="" +ARG PRELOAD_TARGET_LANG="" + +RUN if [ -n "$PRELOAD_SRC_LANG" ] ; then \ + node js/utils/preload.js $PRELOAD_SRC_LANG en; \ + fi + +RUN if [ -n "$PRELOAD_TARGET_LANG" ]; then \ + node js/utils/preload.js en $PRELOAD_TARGET_LANG; \ + fi + +FROM alpine:latest + +RUN apk update && \ + apk add --no-cache nodejs curl + +WORKDIR /app + +COPY --from=builder /app/node_modules ./node_modules +COPY --from=builder /root/.cache/mtran /root/.cache/mtran + +COPY js ./js +COPY package.json ./package.json +COPY start.sh ./start.sh +RUN chmod +x ./start.sh + +EXPOSE 8989 + +ENV NODE_ENV=production +ENV HOST=0.0.0.0 +ENV PORT=8989 + + +CMD ["./start.sh"] diff --git a/src/mtran/vendor/mtranserver/deprecated/js/Makefile b/src/mtran/vendor/mtranserver/deprecated/js/Makefile new file mode 100644 index 0000000..224ad70 --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/js/Makefile @@ -0,0 +1,46 @@ +.PHONY: env prepare build test + +env: + if pnpm -v > /dev/null 2>&1; then \ + echo "pnpm is already installed"; \ + else \ + echo "pnpm is not installed, please install pnpm first!"; \ + exit 1; \ + fi + git pull + pnpm i -g nodemon + $(MAKE) update + +update: + mkdir -p packages + LATEST_VERSION=$$(curl -s https://api.github.com/repos/xxnuo/MTranCore/releases/latest | grep -o '"tag_name": "v[^"]*"' | cut -d'"' -f4); \ + echo "Downloading latest version: $$LATEST_VERSION"; \ + curl -L "https://github.com/xxnuo/MTranCore/releases/download/$$LATEST_VERSION/mtran-core-$${LATEST_VERSION#v}.tgz" -o packages/mtran-core.tgz + +build: + docker build -t xxnuo/mtranserver:test \ + -f Dockerfile . + +build-zh: + docker build -t xxnuo/mtranserver:test-zh \ + --build-arg PRELOAD_SRC_LANG=zh-Hans \ + --build-arg PRELOAD_TARGET_LANG=zh-Hans \ + -f Dockerfile.model . + +test: build + docker run -it --rm --name mtranserver-test -p 8989:8989 xxnuo/mtranserver:test + +test-zh: build-zh + docker run -it --rm --name mtranserver-test-zh -p 8989:8989 xxnuo/mtranserver:test-zh + +dev: + pnpm i + LOG_LEVEL=debug node --expose-gc js/mts.js + +watch: + pnpm i + LOG_LEVEL=debug nodemon --watch js --ext js --exec "node --expose-gc js/mts.js" + +trace: + pnpm i + LOG_LEVEL=debug node --expose-gc --inspect-brk js/mts.js \ No newline at end of file diff --git a/src/mtran/vendor/mtranserver/deprecated/js/README.md b/src/mtran/vendor/mtranserver/deprecated/js/README.md new file mode 100644 index 0000000..65911f9 --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/js/README.md @@ -0,0 +1,3 @@ +# Node.js v1 version + +Node.js v1 version is deprecated \ No newline at end of file diff --git a/src/mtran/vendor/mtranserver/deprecated/js/build.sh b/src/mtran/vendor/mtranserver/deprecated/js/build.sh new file mode 100755 index 0000000..dc5fdac --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/js/build.sh @@ -0,0 +1,34 @@ +#!/bin/sh + +if [ $# -eq 0 ]; then + echo "错误: 请提供版本号" + echo "用法: $0 <版本号>" + exit 1 +fi + +VERSION=$1 +echo "开始构建版本: $VERSION" + +# 构建标准版镜像(不预加载模型) +echo "构建标准版镜像 mtranserver:$VERSION..." +docker build -t xxnuo/mtranserver:$VERSION \ + -t xxnuo/mtranserver:latest \ + -f Dockerfile . + +# 构建中文预加载版镜像 +echo "构建中文预加载版镜像 mtranserver:${VERSION}-zh..." +docker build -t xxnuo/mtranserver:${VERSION}-zh \ + -t xxnuo/mtranserver:latest-zh \ + --build-arg PRELOAD_SRC_LANG=zh-Hans \ + --build-arg PRELOAD_TARGET_LANG=en \ + -f Dockerfile.model . + +# 构建日语预加载版镜像 +echo "构建日语预加载版镜像 mtranserver:${VERSION}-ja..." +docker build -t xxnuo/mtranserver:${VERSION}-ja \ + -t xxnuo/mtranserver:latest-ja \ + --build-arg PRELOAD_SRC_LANG=ja \ + --build-arg PRELOAD_TARGET_LANG=en \ + -f Dockerfile.model . + +echo "构建完成!" \ No newline at end of file diff --git a/src/mtran/vendor/mtranserver/deprecated/js/js/mts.js b/src/mtran/vendor/mtranserver/deprecated/js/js/mts.js new file mode 100755 index 0000000..85c6d56 --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/js/js/mts.js @@ -0,0 +1,165 @@ +#!/usr/bin/env node + +const fastify = require("fastify"); +const cors = require("@fastify/cors"); +const swagger = require("@fastify/swagger"); +const swaggerUi = require("@fastify/swagger-ui"); +const { getConfig, validateToken } = require("./utils/config"); +const { authenticate, errorHandler } = require("./utils/middleware"); +const { shutdown } = require("./utils/translator"); +const registerTranslateRoutes = require("./routes/translate"); +const registerPluginRoutes = require("./routes/plugins"); +const registerBaseRoutes = require("./routes/base"); + +// 获取配置 +const config = getConfig(); + +// 创建Fastify实例 +const server = fastify({ + logger: { + level: config.logLevel, + transport: { + target: "pino-pretty", + options: { + translateTime: "HH:MM:ss Z", + ignore: "pid,hostname", + }, + }, + }, + trustProxy: true, // 信任代理,允许获取正确的客户端 IP 和协议 +}); + +// 注册CORS中间件 +server.register(cors, { + origin: true, + methods: ["GET", "POST", "OPTIONS"], + allowedHeaders: ["Content-Type", "Authorization", "Key"], +}); + +// 注册Swagger生成器 +server.register(swagger, { + openapi: { + info: { + title: "MTranServer API", + description: "MTranServer API documentation", + version: config.version || "3.0.0", + }, + components: { + securitySchemes: { + Authorization: { + type: "apiKey", + name: "Authorization", + in: "header", + }, + }, + }, + }, +}); + +// 注册Swagger UI +server.register(swaggerUi, { + routePrefix: "/docs", + uiConfig: { + tryItOutEnabled: false, + persistAuthorization: true, + displayRequestDuration: true, + }, + transformSpecification: (swaggerObject, request, reply) => { + // 动态调整 URL 协议,确保与请求协议一致 + const protocol = request.protocol || "http"; + swaggerObject.servers = [ + { + url: `${protocol}://${config.host}:${config.port}`, + description: `MTranServer API (${protocol.toUpperCase()})`, + }, + ]; + return swaggerObject; + }, + uiHooks: { + onRequest: function (request, reply, next) { + next(); + }, + preHandler: function (request, reply, next) { + next(); + }, + }, + staticCSP: false, // 禁用静态CSP以避免混合内容问题 + transformStaticCSP: (header) => header, +}); + +// 设置错误处理器 +server.setErrorHandler(errorHandler); + +// 路由选项 +const routeOptions = { + authenticate: authenticate, + validateToken: validateToken, +}; + +// 注册路由 +server.register(registerBaseRoutes, routeOptions); +server.register(registerTranslateRoutes, routeOptions); +server.register(registerPluginRoutes, routeOptions); + +// 启动服务器 +async function start() { + try { + // 配置 HTTPS 选项 + const listenOptions = { + port: config.port, + host: config.host, + }; + + // 如果配置了 HTTPS,则添加 HTTPS 选项 + if (config.https && config.httpsKey && config.httpsCert) { + const fs = require("fs"); + listenOptions.https = { + key: fs.readFileSync(config.httpsKey), + cert: fs.readFileSync(config.httpsCert), + }; + console.log(`HTTPS Service URL: https://${config.host}:${config.port}`); + console.log(`Swagger UI: https://${config.host}:${config.port}/docs`); + } else { + // 输出服务信息 + console.log(`HTTP Service URL: http://${config.host}:${config.port}`); + console.log(`Swagger UI: http://${config.host}:${config.port}/docs`); + } + + + // 监听端口 + await server.listen(listenOptions); + } catch (err) { + server.log.error(err); + process.exit(1); + } +} + +// 处理进程退出 +process.on("SIGINT", async () => { + console.log("Shutting down server..."); + try { + await shutdown(); + await server.close(); + console.log("Server shutdown complete"); + process.exit(0); + } catch (err) { + console.error("Error during shutdown:", err); + process.exit(1); + } +}); + +process.on("SIGTERM", async () => { + console.log("Shutting down server..."); + try { + await shutdown(); + await server.close(); + console.log("Server shutdown complete"); + process.exit(0); + } catch (err) { + console.error("Error during shutdown:", err); + process.exit(1); + } +}); + +// 启动服务器 +start(); diff --git a/src/mtran/vendor/mtranserver/deprecated/js/js/routes/base.js b/src/mtran/vendor/mtranserver/deprecated/js/js/routes/base.js new file mode 100644 index 0000000..2e1d492 --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/js/js/routes/base.js @@ -0,0 +1,94 @@ +const { getVersion } = require("../utils/config"); + +/** + * 注册核心路由 + * @param {Object} fastify Fastify实例 + * @param {Object} options 选项 + */ +function registerBaseRoutes(fastify, options) { + // 版本信息 + fastify.get( + "/version", + { + schema: { + description: "Get the version of the server", + response: { + 200: { + type: "object", + properties: { + version: { type: "string" }, + }, + }, + }, + }, + }, + async (request, reply) => { + return { version: getVersion() }; + } + ); + + // 健康检查 + fastify.get( + "/health", + { + schema: { + description: "Get the health of the server", + response: { + 200: { + type: "object", + properties: { + status: { type: "string" }, + }, + }, + }, + }, + }, + async (request, reply) => { + return { status: "ok" }; + } + ); + + // 心跳检查 + fastify.get( + "/__heartbeat__", + { + schema: { + description: "Get the heartbeat of the server", + response: { + 200: { + type: "object", + properties: { + status: { type: "string" }, + }, + }, + }, + }, + }, + async (request, reply) => { + return { status: "ok" }; + } + ); + + // 负载均衡心跳检查 + fastify.get( + "/__lbheartbeat__", + { + schema: { + description: "Get the heartbeat of the server", + response: { + 200: { + type: "object", + properties: { + status: { type: "string" }, + }, + }, + }, + }, + }, + async (request, reply) => { + return { status: "ok" }; + } + ); +} + +module.exports = registerBaseRoutes; diff --git a/src/mtran/vendor/mtranserver/deprecated/js/js/routes/plugins.js b/src/mtran/vendor/mtranserver/deprecated/js/js/routes/plugins.js new file mode 100644 index 0000000..d0c92db --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/js/js/routes/plugins.js @@ -0,0 +1,21 @@ +const immePlugin = require("./plugins/imme"); +const kissPlugin = require("./plugins/kiss"); +const googlePlugin = require("./plugins/google"); +const deeplPlugin = require("./plugins/deepl"); +const deeplxPlugin = require("./plugins/deeplx"); + +/** + * 注册翻译插件兼容路由 + * @param {Object} fastify Fastify实例 + * @param {Object} options 选项 + */ +function registerPluginRoutes(fastify, options) { + // 加载各个插件 + immePlugin(fastify, options); + kissPlugin(fastify, options); + googlePlugin(fastify, options); + deeplPlugin(fastify, options); + deeplxPlugin(fastify, options); +} + +module.exports = registerPluginRoutes; diff --git a/src/mtran/vendor/mtranserver/deprecated/js/js/routes/plugins/deepl.js b/src/mtran/vendor/mtranserver/deprecated/js/js/routes/plugins/deepl.js new file mode 100644 index 0000000..d20bbb3 --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/js/js/routes/plugins/deepl.js @@ -0,0 +1,305 @@ +const { translate, batchTranslate } = require("../../utils/translator"); +const { validateToken } = require("../../utils/config"); + +/** + * DeepLX 翻译兼容API路由处理 + * @param {Object} fastify Fastify实例 + * @param {Object} options 选项 + */ +function deeplPlugin(fastify, options) { + fastify.post( + "/deepl/v2/translate", + { + schema: { + description: "DeepLX v2 API", + tags: ["plugins"], + headers: { + type: "object", + properties: { + authorization: { + type: "string", + description: "token", + }, + }, + }, + body: { + type: "object", + required: ["text", "target_lang"], + properties: { + text: { + oneOf: [ + { type: "string" }, + { type: "array", items: { type: "string" } }, + ], + description: "需要翻译的文本,可以是字符串或字符串数组", + }, + source_lang: { type: "string", description: "源语言代码" }, + target_lang: { type: "string", description: "目标语言代码" }, + }, + }, + response: { + 200: { + type: "object", + properties: { + translations: { + type: "array", + items: { + type: "object", + properties: { + detected_source_language: { + type: "string", + description: "检测到的源语言", + }, + text: { type: "string", description: "翻译结果" }, + }, + }, + }, + }, + }, + }, + }, + }, + async (request, reply) => { + try { + // 验证Authorization头部 + const authHeader = request.headers.authorization; + if (!validateToken(authHeader)) { + return reply.code(401).send({ + error: "Unauthorized", + message: "Invalid or missing token", + }); + } + + const { text, source_lang, target_lang } = request.body; + const from = source_lang || "auto"; + const to = target_lang; + + // 处理单个文本或文本数组 + if (Array.isArray(text)) { + const translatedTexts = await batchTranslate(text, from, to); + + return { + translations: translatedTexts.map((translatedText) => ({ + detected_source_language: + from === "auto" ? "AUTO" : from.toUpperCase(), + text: translatedText, + })), + }; + } else { + const translatedText = await translate(text, from, to); + + return { + translations: [ + { + detected_source_language: + from === "auto" ? "AUTO" : from.toUpperCase(), + text: translatedText, + }, + ], + }; + } + } catch (error) { + reply.code(500).send({ + message: error.message, + }); + } + } + ); + + fastify.post( + "/deepl/translate", + { + schema: { + description: "DeepLX API", + tags: ["plugins"], + headers: { + type: "object", + properties: { + authorization: { + type: "string", + description: "Bearer token", + }, + }, + }, + querystring: { + type: "object", + properties: { + token: { type: "string", description: "访问令牌" }, + }, + }, + body: { + type: "object", + required: ["text", "source_lang", "target_lang"], + properties: { + text: { type: "string", description: "需要翻译的文本" }, + source_lang: { type: "string", description: "源语言代码" }, + target_lang: { type: "string", description: "目标语言代码" }, + }, + }, + response: { + 200: { + type: "object", + properties: { + alternatives: { + type: "array", + items: { type: "string" }, + description: "备选翻译结果", + }, + code: { type: "integer", description: "状态码" }, + data: { type: "string", description: "翻译结果" }, + id: { type: "integer", description: "请求ID" }, + method: { type: "string", description: "翻译方法" }, + source_lang: { type: "string", description: "源语言代码" }, + target_lang: { type: "string", description: "目标语言代码" }, + }, + }, + }, + }, + }, + async (request, reply) => { + try { + // 验证Authorization头部或URL参数中的token + const authHeader = request.headers.authorization; + const urlToken = request.query.token; + + // 从Bearer token中提取token值 + let tokenFromHeader = null; + if (authHeader && authHeader.startsWith("Bearer ")) { + tokenFromHeader = authHeader.substring(7); + } + + // 检查token是否有效 + if (!(validateToken(tokenFromHeader) || validateToken(urlToken))) { + return reply.code(401).send({ + error: "Unauthorized", + message: "Invalid or missing token", + }); + } + + const { text, source_lang, target_lang } = request.body; + + // 执行翻译 + const translatedText = await translate(text, source_lang, target_lang); + + // 构建符合DeepLX格式的响应 + return { + alternatives: [], + code: 200, + data: translatedText, + id: 1, // Math.floor(Math.random() * 10000000000), // 生成随机ID + method: "Free", + source_lang: source_lang.toUpperCase(), + target_lang: target_lang.toUpperCase(), + }; + } catch (error) { + reply.code(500).send({ + code: 500, + message: error.message, + }); + } + } + ); + + fastify.post( + "/deepl/v1/translate", + { + schema: { + description: "DeepLX v1 API", + tags: ["plugins"], + headers: { + type: "object", + properties: { + authorization: { + type: "string", + description: "Bearer token", + }, + "content-type": { + type: "string", + description: "内容类型", + }, + }, + }, + querystring: { + type: "object", + properties: { + token: { type: "string", description: "访问令牌" }, + }, + }, + body: { + type: "object", + required: ["text", "source_lang", "target_lang"], + properties: { + text: { type: "string", description: "需要翻译的文本" }, + source_lang: { type: "string", description: "源语言代码" }, + target_lang: { type: "string", description: "目标语言代码" }, + }, + }, + response: { + 200: { + type: "object", + properties: { + alternatives: { + type: "array", + items: { type: "string" }, + description: "备选翻译结果", + }, + code: { type: "integer", description: "状态码" }, + data: { type: "string", description: "翻译结果" }, + id: { type: "integer", description: "请求ID" }, + method: { type: "string", description: "翻译方法" }, + source_lang: { type: "string", description: "源语言代码" }, + target_lang: { type: "string", description: "目标语言代码" }, + }, + }, + }, + }, + }, + async (request, reply) => { + try { + // 验证Authorization头部或URL参数中的token + const authHeader = request.headers.authorization; + const urlToken = request.query.token; + + // 从Bearer token中提取token值 + let tokenFromHeader = null; + if (authHeader && authHeader.startsWith("Bearer ")) { + tokenFromHeader = authHeader.substring(7); + } + + // 检查token是否有效 + if (!(validateToken(tokenFromHeader) || validateToken(urlToken))) { + return reply.code(401).send({ + error: "Unauthorized", + message: "Invalid or missing token", + }); + } + + const { text, source_lang, target_lang } = request.body; + + // 执行翻译 + const translatedText = await translate(text, source_lang, target_lang); + + // 生成随机ID + // const id = Math.floor(Math.random() * 10000000000); + + // 构建响应 + return { + alternatives: [], // 实际应用中可能需要提供备选翻译 + code: 200, + data: translatedText, + id: 2, // id, + method: "Pro", + source_lang: source_lang.toUpperCase(), + target_lang: target_lang.toUpperCase(), + }; + } catch (error) { + reply.code(500).send({ + code: 500, + message: error.message, + }); + } + } + ); +} + +module.exports = deeplPlugin; diff --git a/src/mtran/vendor/mtranserver/deprecated/js/js/routes/plugins/deeplx.js b/src/mtran/vendor/mtranserver/deprecated/js/js/routes/plugins/deeplx.js new file mode 100644 index 0000000..210d5a3 --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/js/js/routes/plugins/deeplx.js @@ -0,0 +1,305 @@ +const { translate, batchTranslate } = require("../../utils/translator"); +const { validateToken } = require("../../utils/config"); + +/** + * DeepLX 翻译兼容API路由处理 + * @param {Object} fastify Fastify实例 + * @param {Object} options 选项 + */ +function deeplPlugin(fastify, options) { + fastify.post( + "/deeplx/v2/translate", + { + schema: { + description: "DeepLX v2 API", + tags: ["plugins"], + headers: { + type: "object", + properties: { + authorization: { + type: "string", + description: "token", + }, + }, + }, + body: { + type: "object", + required: ["text", "target_lang"], + properties: { + text: { + oneOf: [ + { type: "string" }, + { type: "array", items: { type: "string" } }, + ], + description: "需要翻译的文本,可以是字符串或字符串数组", + }, + source_lang: { type: "string", description: "源语言代码" }, + target_lang: { type: "string", description: "目标语言代码" }, + }, + }, + response: { + 200: { + type: "object", + properties: { + translations: { + type: "array", + items: { + type: "object", + properties: { + detected_source_language: { + type: "string", + description: "检测到的源语言", + }, + text: { type: "string", description: "翻译结果" }, + }, + }, + }, + }, + }, + }, + }, + }, + async (request, reply) => { + try { + // 验证Authorization头部 + const authHeader = request.headers.authorization; + if (!validateToken(authHeader)) { + return reply.code(401).send({ + error: "Unauthorized", + message: "Invalid or missing token", + }); + } + + const { text, source_lang, target_lang } = request.body; + const from = source_lang || "auto"; + const to = target_lang; + + // 处理单个文本或文本数组 + if (Array.isArray(text)) { + const translatedTexts = await batchTranslate(text, from, to); + + return { + translations: translatedTexts.map((translatedText) => ({ + detected_source_language: + from === "auto" ? "AUTO" : from.toUpperCase(), + text: translatedText, + })), + }; + } else { + const translatedText = await translate(text, from, to); + + return { + translations: [ + { + detected_source_language: + from === "auto" ? "AUTO" : from.toUpperCase(), + text: translatedText, + }, + ], + }; + } + } catch (error) { + reply.code(500).send({ + message: error.message, + }); + } + } + ); + + fastify.post( + "/deeplx/translate", + { + schema: { + description: "DeepLX API", + tags: ["plugins"], + headers: { + type: "object", + properties: { + authorization: { + type: "string", + description: "Bearer token", + }, + }, + }, + querystring: { + type: "object", + properties: { + token: { type: "string", description: "访问令牌" }, + }, + }, + body: { + type: "object", + required: ["text", "source_lang", "target_lang"], + properties: { + text: { type: "string", description: "需要翻译的文本" }, + source_lang: { type: "string", description: "源语言代码" }, + target_lang: { type: "string", description: "目标语言代码" }, + }, + }, + response: { + 200: { + type: "object", + properties: { + alternatives: { + type: "array", + items: { type: "string" }, + description: "备选翻译结果", + }, + code: { type: "integer", description: "状态码" }, + data: { type: "string", description: "翻译结果" }, + id: { type: "integer", description: "请求ID" }, + method: { type: "string", description: "翻译方法" }, + source_lang: { type: "string", description: "源语言代码" }, + target_lang: { type: "string", description: "目标语言代码" }, + }, + }, + }, + }, + }, + async (request, reply) => { + try { + // 验证Authorization头部或URL参数中的token + const authHeader = request.headers.authorization; + const urlToken = request.query.token; + + // 从Bearer token中提取token值 + let tokenFromHeader = null; + if (authHeader && authHeader.startsWith("Bearer ")) { + tokenFromHeader = authHeader.substring(7); + } + + // 检查token是否有效 + if (!(validateToken(tokenFromHeader) || validateToken(urlToken))) { + return reply.code(401).send({ + error: "Unauthorized", + message: "Invalid or missing token", + }); + } + + const { text, source_lang, target_lang } = request.body; + + // 执行翻译 + const translatedText = await translate(text, source_lang, target_lang); + + // 构建符合DeepLX格式的响应 + return { + alternatives: [], + code: 200, + data: translatedText, + id: 1, // Math.floor(Math.random() * 10000000000), // 生成随机ID + method: "Free", + source_lang: source_lang.toUpperCase(), + target_lang: target_lang.toUpperCase(), + }; + } catch (error) { + reply.code(500).send({ + code: 500, + message: error.message, + }); + } + } + ); + + fastify.post( + "/deeplx/v1/translate", + { + schema: { + description: "DeepLX v1 API", + tags: ["plugins"], + headers: { + type: "object", + properties: { + authorization: { + type: "string", + description: "Bearer token", + }, + "content-type": { + type: "string", + description: "内容类型", + }, + }, + }, + querystring: { + type: "object", + properties: { + token: { type: "string", description: "访问令牌" }, + }, + }, + body: { + type: "object", + required: ["text", "source_lang", "target_lang"], + properties: { + text: { type: "string", description: "需要翻译的文本" }, + source_lang: { type: "string", description: "源语言代码" }, + target_lang: { type: "string", description: "目标语言代码" }, + }, + }, + response: { + 200: { + type: "object", + properties: { + alternatives: { + type: "array", + items: { type: "string" }, + description: "备选翻译结果", + }, + code: { type: "integer", description: "状态码" }, + data: { type: "string", description: "翻译结果" }, + id: { type: "integer", description: "请求ID" }, + method: { type: "string", description: "翻译方法" }, + source_lang: { type: "string", description: "源语言代码" }, + target_lang: { type: "string", description: "目标语言代码" }, + }, + }, + }, + }, + }, + async (request, reply) => { + try { + // 验证Authorization头部或URL参数中的token + const authHeader = request.headers.authorization; + const urlToken = request.query.token; + + // 从Bearer token中提取token值 + let tokenFromHeader = null; + if (authHeader && authHeader.startsWith("Bearer ")) { + tokenFromHeader = authHeader.substring(7); + } + + // 检查token是否有效 + if (!(validateToken(tokenFromHeader) || validateToken(urlToken))) { + return reply.code(401).send({ + error: "Unauthorized", + message: "Invalid or missing token", + }); + } + + const { text, source_lang, target_lang } = request.body; + + // 执行翻译 + const translatedText = await translate(text, source_lang, target_lang); + + // 生成随机ID + // const id = Math.floor(Math.random() * 10000000000); + + // 构建响应 + return { + alternatives: [], // 实际应用中可能需要提供备选翻译 + code: 200, + data: translatedText, + id: 2, // id, + method: "Pro", + source_lang: source_lang.toUpperCase(), + target_lang: target_lang.toUpperCase(), + }; + } catch (error) { + reply.code(500).send({ + code: 500, + message: error.message, + }); + } + } + ); +} + +module.exports = deeplPlugin; diff --git a/src/mtran/vendor/mtranserver/deprecated/js/js/routes/plugins/google.js b/src/mtran/vendor/mtranserver/deprecated/js/js/routes/plugins/google.js new file mode 100644 index 0000000..5e72650 --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/js/js/routes/plugins/google.js @@ -0,0 +1,76 @@ +const { translate } = require("../../utils/translator"); + +/** + * Google翻译兼容API路由处理 + * @param {Object} fastify Fastify实例 + * @param {Object} options 选项 + */ +function googlePlugin(fastify, options) { + fastify.post( + "/google/language/translate/v2", + { + preHandler: options.authenticate, + schema: { + description: "Google翻译兼容API", + tags: ["plugins"], + body: { + type: "object", + required: ["q", "source", "target"], + properties: { + q: { type: "string", description: "需要翻译的文本" }, + source: { type: "string", description: "源语言代码" }, + target: { type: "string", description: "目标语言代码" }, + format: { type: "string", default: "text", description: "文本格式,默认为text" }, + }, + }, + response: { + 200: { + type: "object", + properties: { + data: { + type: "object", + properties: { + translations: { + type: "array", + items: { + type: "object", + properties: { + translatedText: { type: "string", description: "翻译结果" } + } + } + } + } + } + } + }, + 500: { + type: "object", + properties: { + error: { type: "string" }, + message: { type: "string" } + } + } + } + }, + }, + async (request, reply) => { + const { q, source, target } = request.body; + + try { + const translatedText = await translate(q, source, target); + return { + data: { + translations: [{ translatedText }], + }, + }; + } catch (error) { + reply.code(500).send({ + error: "TranslationError", + message: error.message, + }); + } + } + ); +} + +module.exports = googlePlugin; \ No newline at end of file diff --git a/src/mtran/vendor/mtranserver/deprecated/js/js/routes/plugins/imme.js b/src/mtran/vendor/mtranserver/deprecated/js/js/routes/plugins/imme.js new file mode 100644 index 0000000..b05cc9f --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/js/js/routes/plugins/imme.js @@ -0,0 +1,131 @@ +const { batchTranslate } = require("../../utils/translator"); +const { validateToken } = require("../../utils/config"); + +/** + * 沉浸式翻译插件API路由处理 + * @param {Object} fastify Fastify实例 + * @param {Object} options 选项 + */ +function immePlugin(fastify, options) { + fastify.post( + "/imme", + { + schema: { + description: "沉浸式翻译插件API", + tags: ["plugins"], + querystring: { + type: "object", + // 移除必需的token要求 + properties: { + token: { type: "string", description: "token" }, + }, + }, + body: { + type: "object", + properties: { + source_lang: { + type: "string", + description: "源语言代码,默认为auto", + }, + target_lang: { + type: "string", + description: "目标语言代码,默认为zh-Hans", + }, + text_list: { + type: "array", + description: "需要翻译的文本数组", + items: { type: "string" }, + }, + }, + required: ["text_list"], + }, + response: { + 200: { + type: "object", + properties: { + translations: { + type: "array", + items: { + type: "object", + properties: { + detected_source_lang: { + type: "string", + description: "检测到的源语言代码", + }, + text: { type: "string", description: "已翻译的文本" }, + }, + }, + }, + }, + }, + 400: { + type: "object", + properties: { + error: { type: "string" }, + message: { type: "string" }, + }, + }, + 401: { + type: "object", + properties: { + error: { type: "string" }, + message: { type: "string" }, + }, + }, + 500: { + type: "object", + properties: { + error: { type: "string" }, + message: { type: "string" }, + }, + }, + }, + }, + }, + async (request, reply) => { + // 验证token,直接使用validateToken函数 + const token = request.query.token; + if (!validateToken(token)) { + return reply.code(401).send({ + error: "Unauthorized", + message: "Invalid or missing token", + }); + } + + try { + const { source_lang, target_lang, text_list } = request.body; + + // 检查text_list是否为有效数组 + if (!Array.isArray(text_list) || text_list.length === 0) { + return reply.code(400).send({ + error: "BadRequest", + message: "text_list must be a non-empty array", + }); + } + + // 批量翻译 + const translatedTexts = await batchTranslate( + text_list, + source_lang || "auto", + target_lang || "zh-Hans" + ); + + // 构建符合要求的响应格式 + const translations = translatedTexts.map((text, index) => { + return { + detected_source_lang: source_lang || "auto", // 实际应该从翻译服务获取检测到的语言 + text: text, + }; + }); + + return { translations }; + } catch (error) { + return reply + .code(500) + .send({ error: "TranslationError", message: error.message }); + } + } + ); +} + +module.exports = immePlugin; diff --git a/src/mtran/vendor/mtranserver/deprecated/js/js/routes/plugins/kiss.js b/src/mtran/vendor/mtranserver/deprecated/js/js/routes/plugins/kiss.js new file mode 100644 index 0000000..2b37f23 --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/js/js/routes/plugins/kiss.js @@ -0,0 +1,122 @@ +const { translate, batchTranslate } = require("../../utils/translator"); +const { validateToken } = require("../../utils/config"); + +/** + * 简约翻译插件API路由处理 + * @param {Object} fastify Fastify实例 + * @param {Object} options 选项 + */ +function kissPlugin(fastify, options) { + fastify.post( + "/kiss", + { + schema: { + description: "简约翻译插件API", + tags: ["plugins"], + headers: { + type: "object", + properties: { + authorization: { type: "string", description: "Bearer token认证" }, + }, + }, + body: { + type: "object", + properties: { + text: { type: "string", description: "待翻译文字" }, + from: { type: "string", description: "源语言代码,默认为auto" }, + to: { type: "string", description: "目标语言代码,默认为zh-CN" }, + texts: { + type: "array", + description: "需要批量翻译的文本数组", + items: { type: "string" }, + }, + }, + anyOf: [{ required: ["text"] }, { required: ["texts"] }], + }, + response: { + 200: { + type: "object", + properties: { + text: { type: "string", description: "翻译后的文字" }, + from: { type: "string", description: "识别的源语言" }, + to: { type: "string", description: "目标语言" }, + }, + }, + 400: { + type: "object", + properties: { + error: { type: "string" }, + message: { type: "string" }, + }, + }, + 401: { + type: "object", + properties: { + error: { type: "string" }, + message: { type: "string" }, + }, + }, + 500: { + type: "object", + properties: { + error: { type: "string" }, + message: { type: "string" }, + }, + }, + }, + }, + }, + async (request, reply) => { + // 从Authorization头部提取token + const authHeader = request.headers.authorization || ""; + const token = authHeader.startsWith("Bearer ") + ? authHeader.substring(7) + : null; + + if (!validateToken(token)) { + return reply.code(401).send({ + error: "Unauthorized", + message: "Invalid or missing API token", + }); + } + + try { + const { from, to, text, texts } = request.body; + const targetLang = to || "zh-CN"; + const sourceLang = from || "auto"; + + // 处理批量翻译 + if (Array.isArray(texts) && texts.length > 0) { + const results = await batchTranslate(texts, sourceLang, targetLang); + return { + text: results.join("\n"), + from: sourceLang, + to: targetLang, + }; + } + + // 处理单个文本翻译 + if (text) { + const result = await translate(text, sourceLang, targetLang); + return { + text: result, + from: sourceLang, + to: targetLang, + }; + } + + return reply.code(400).send({ + error: "BadRequest", + message: "Missing text or texts parameter", + }); + } catch (error) { + return reply.code(500).send({ + error: "TranslationError", + message: error.message, + }); + } + } + ); +} + +module.exports = kissPlugin; diff --git a/src/mtran/vendor/mtranserver/deprecated/js/js/routes/translate.js b/src/mtran/vendor/mtranserver/deprecated/js/js/routes/translate.js new file mode 100644 index 0000000..6201af5 --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/js/js/routes/translate.js @@ -0,0 +1,178 @@ +const { + translate, + batchTranslate, + supportedLanguages, +} = require("../utils/translator"); + +/** + * 注册翻译路由 + * @param {Object} fastify Fastify实例 + * @param {Object} options 选项 + */ +function registerTranslateRoutes(fastify, options) { + // 获取已加载的模型列表 + fastify.get( + "/languages", + { + preHandler: options.authenticate, + schema: { + description: + "Get the supported languages. Use this endpoint to get the language codes for translation.", + security: [{ Authorization: [] }], + headers: { + type: "object", + properties: { + Authorization: { + type: "string", + description: + "API token for authentication (format: 'your_token')", + }, + }, + }, + response: { + 200: { + type: "object", + properties: { + languages: { + type: "array", + items: { type: "string" }, + description: "The supported languages", + }, + }, + }, + }, + }, + }, + async (request, reply) => { + return { languages: supportedLanguages }; + } + ); + + // 普通翻译API + fastify.post( + "/translate", + { + preHandler: options.authenticate, + schema: { + description: + "Translate a text. Use this endpoint to translate a single text; from: The source language. Recommend using language code from /languages endpoint. Use 'auto' for automatic detection (adds ~0.04s delay). For Chinese translation, 'zh-Hans' is more efficient than 'zh-CN'; to: The target language. Using language code from /languages endpoint. For Chinese translation, 'zh-Hans' is more efficient than 'zh-CN'; text: The text to translate", + security: [{ Authorization: [] }], + headers: { + type: "object", + properties: { + Authorization: { + type: "string", + description: + "API token for authentication (format: 'your_token')", + }, + }, + }, + body: { + type: "object", + required: ["from", "to", "text"], + properties: { + from: { + type: "string", + description: + "The source language. Recommend using language code from /languages endpoint. Use 'auto' for automatic detection (adds ~0.04s delay). For Chinese translation, 'zh-Hans' is more efficient than 'zh-CN'", + default: "auto", + enum: ["auto", ...supportedLanguages], + }, + to: { + type: "string", + description: + "The target language. Using language code from /languages endpoint. For Chinese translation, 'zh-Hans' is more efficient than 'zh-CN'", + default: "zh-Hans", + enum: supportedLanguages, + }, + text: { + type: "string", + description: "The text to translate", + default: "Do as you would be done by", + }, + }, + }, + }, + }, + async (request, reply) => { + const { from, to, text } = request.body; + + try { + const result = await translate(text, from, to); + return { result }; + } catch (error) { + reply.code(500).send({ + error: "TranslationError", + message: error.message, + }); + } + } + ); + + // 批量翻译API + fastify.post( + "/translate/batch", + { + preHandler: options.authenticate, + schema: { + description: + "Translate a batch of texts. Use this endpoint to translate a batch of texts. from: The source language. Recommend using language code from /languages endpoint. Use 'auto' for automatic detection (adds ~0.04s delay). For Chinese translation, 'zh-Hans' is more efficient than 'zh-CN'; to: The target language. Using language code from /languages endpoint. For Chinese translation, 'zh-Hans' is more efficient than 'zh-CN'; texts: The texts to translate", + security: [{ Authorization: [] }], + headers: { + type: "object", + properties: { + Authorization: { + type: "string", + description: + "API token for authentication (format: 'your_token')", + }, + }, + }, + body: { + type: "object", + required: ["from", "to", "texts"], + properties: { + from: { + type: "string", + description: + "The source language. Recommend using language code from /languages endpoint. Use 'auto' for automatic detection (adds ~0.04s delay). For Chinese translation, 'zh-Hans' is more efficient than 'zh-CN'", + default: "auto", + enum: ["auto", ...supportedLanguages], + }, + to: { + type: "string", + description: + "The target language. Using language code from /languages endpoint. For Chinese translation, 'zh-Hans' is more efficient than 'zh-CN'", + default: "zh-Hans", + enum: supportedLanguages, + }, + texts: { + type: "array", + items: { + type: "string", + default: "Do as you would be done by", + }, + default: ["Do as you would be done by", "Do unto others"], + description: "The texts to translate", + }, + }, + }, + }, + }, + async (request, reply) => { + const { from, to, texts } = request.body; + + try { + const results = await batchTranslate(texts, from, to); + return { results }; + } catch (error) { + reply.code(500).send({ + error: "BatchTranslationError", + message: error.message, + }); + } + } + ); +} + +module.exports = registerTranslateRoutes; diff --git a/src/mtran/vendor/mtranserver/deprecated/js/js/utils/config.js b/src/mtran/vendor/mtranserver/deprecated/js/js/utils/config.js new file mode 100644 index 0000000..98cb1b1 --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/js/js/utils/config.js @@ -0,0 +1,50 @@ +/** + * 配置管理模块 + */ + +// 默认配置 +const defaultConfig = { + port: process.env.PORT || 8989, + host: process.env.HOST || "0.0.0.0", + apiToken: process.env.API_TOKEN || process.env.CORE_API_TOKEN || "", // 兼容旧版本 + logLevel: process.env.LOG_LEVEL || "warn", + https: process.env.HTTPS === "true" || false, + httpsKey: process.env.HTTPS_KEY || "", + httpsCert: process.env.HTTPS_CERT || "", +}; + +/** + * 获取配置 + * @returns {Object} 配置对象 + */ +function getConfig() { + return { ...defaultConfig }; +} + +/** + * 验证API令牌 + * @param {string} token 待验证的令牌 + * @returns {boolean} 是否有效 + */ +function validateToken(token) { + // 如果未设置API令牌,则不需要验证 + if (defaultConfig.apiToken === "") { + return true; + } + return token === defaultConfig.apiToken; +} + +/** + * 获取服务器版本 + * @returns {string} 版本号 + */ +function getVersion() { + const packageJson = require("../../package.json"); + return packageJson.version || "unknown"; +} + +module.exports = { + getConfig, + validateToken, + getVersion, +}; diff --git a/src/mtran/vendor/mtranserver/deprecated/js/js/utils/middleware.js b/src/mtran/vendor/mtranserver/deprecated/js/js/utils/middleware.js new file mode 100644 index 0000000..ca6bd48 --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/js/js/utils/middleware.js @@ -0,0 +1,42 @@ +const { validateToken } = require("./config"); + +/** + * 认证中间件 + * @param {Object} request Fastify请求对象 + * @param {Object} reply Fastify响应对象 + * @param {Function} done 完成回调 + */ +function authenticate(request, reply, done) { + const authHeader = request.headers.authorization; + const token = request.query.token; + + // 检查Authorization头或URL中的token参数 + if (validateToken(authHeader) || validateToken(token)) { + done(); + } else { + reply + .code(401) + .send({ error: "Unauthorized", message: "Invalid or missing API token" }); + } +} + +/** + * 错误处理中间件 + * @param {Error} error 错误对象 + * @param {Object} request Fastify请求对象 + * @param {Object} reply Fastify响应对象 + */ +function errorHandler(error, request, reply) { + console.error(`Error processing request: ${error.message}`); + + // 返回适当的错误响应 + reply.code(error.statusCode || 500).send({ + error: error.name || "InternalServerError", + message: error.message || "An unknown error occurred", + }); +} + +module.exports = { + authenticate, + errorHandler, +}; diff --git a/src/mtran/vendor/mtranserver/deprecated/js/js/utils/preload.js b/src/mtran/vendor/mtranserver/deprecated/js/js/utils/preload.js new file mode 100644 index 0000000..19298df --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/js/js/utils/preload.js @@ -0,0 +1,26 @@ +const { preloadModel, supportedLanguages, shutdown } = require("./translator"); + +// 如果直接执行此脚本,则从命令行参数获取语言对并预加载 +async function main() { + if (require.main === module) { + const args = process.argv.slice(2); + if (args.length !== 2) { + console.log("Usage: node preload.js "); + console.log("Available languages:", supportedLanguages.join(", ")); + process.exit(1); + } + + const [from, to] = args; + try { + console.log(`Preloading model for ${from} to ${to}...`); + await preloadModel(from, to); + console.log("Preload completed successfully."); + await shutdown(); + } catch (error) { + console.error("Error during preload:", error.message); + process.exit(1); + } + } +} + +main(); diff --git a/src/mtran/vendor/mtranserver/deprecated/js/js/utils/translator.js b/src/mtran/vendor/mtranserver/deprecated/js/js/utils/translator.js new file mode 100644 index 0000000..be48e31 --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/js/js/utils/translator.js @@ -0,0 +1,76 @@ +const Translator = require("@mtran/core"); + +const loadedLangs = new Set(); +let supportedLanguages = Translator.GetSupportLanguages(); + +function checkSupportLanguage(from, to) { + return ( + (supportedLanguages.includes(from) || from === "auto") && + supportedLanguages.includes(to) + ); +} + +/** + * 预加载翻译模型 + * @param {string} from 源语言 + * @param {string} to 目标语言 + * @returns {Promise} + */ +async function preloadModel(from, to) { + if (!checkSupportLanguage(from, to)) { + throw new Error("Unsupported language pair"); + } + const modelKey = `${from}_${to}`; + if (!loadedLangs.has(modelKey)) { + await Translator.Preload(from, to); + loadedLangs.add(modelKey); + console.log(`Successfully loaded model for language pair: ${modelKey}`); + } +} + +/** + * 翻译文本 + * @param {string} text 要翻译的文本 + * @param {string} from 源语言 + * @param {string} to 目标语言 + * @returns {Promise} 翻译结果 + */ +async function translate(text, from, to) { + if (!checkSupportLanguage(from, to)) { + throw new Error("Unsupported language pair"); + } + return Translator.Translate(text, from, to); +} + +/** + * 批量翻译文本 + * @param {string[]} texts 要翻译的文本数组 + * @param {string} from 源语言 + * @param {string} to 目标语言 + * @returns {Promise} 翻译结果数组 + */ +async function batchTranslate(texts, from, to) { + if (!checkSupportLanguage(from, to)) { + throw new Error("Unsupported language pair"); + } + // 并行处理翻译请求 + const promises = texts.map((text) => Translator.Translate(text, from, to)); + return Promise.all(promises); +} + +/** + * 关闭翻译引擎 + * @returns {Promise} + */ +async function shutdown() { + await Translator.Shutdown(); + console.log("Translation engine shutdown complete"); +} + +module.exports = { + supportedLanguages, + preloadModel, + translate, + batchTranslate, + shutdown, +}; diff --git a/src/mtran/vendor/mtranserver/deprecated/js/nodemon.json b/src/mtran/vendor/mtranserver/deprecated/js/nodemon.json new file mode 100644 index 0000000..feb4601 --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/js/nodemon.json @@ -0,0 +1,13 @@ +{ + "restartable": "rs", + "ignore": [ + ".git", + "node_modules/**/node_modules", + "packages" + ], + "verbose": true, + "watch": [ + "js/" + ], + "ext": "js,json" +} \ No newline at end of file diff --git a/src/mtran/vendor/mtranserver/deprecated/js/package.json b/src/mtran/vendor/mtranserver/deprecated/js/package.json new file mode 100644 index 0000000..a6c66a7 --- /dev/null +++ b/src/mtran/vendor/mtranserver/deprecated/js/package.json @@ -0,0 +1,31 @@ +{ + "name": "@mtran/server", + "homepage": "https://github.com/xxnuo", + "version": "3.0.4", + "type": "commonjs", + "main": "js/mts.js", + "bin": { + "mt": "js/mts.js" + }, + "keywords": [ + "translation", + "offline", + "bergamot", + "machine-translation", + "nlp", + "node" + ], + "author": "xxnuo", + "license": "Apache-2.0", + "engines": { + "node": ">=18.0.0" + }, + "dependencies": { + "@fastify/cors": "^11.0.1", + "@fastify/swagger": "^9.5.1", + "@fastify/swagger-ui": "^5.2.3", + "@mtran/core": "file:packages/mtran-core.tgz", + "fastify": "^5.4.0", + "pino-pretty": "^13.0.0" + } +} diff --git a/src/mtran/vendor/mtranserver/deprecated/js/packages/mtran-core.tgz b/src/mtran/vendor/mtranserver/deprecated/js/packages/mtran-core.tgz new file mode 100644 index 0000000000000000000000000000000000000000..0f5adf596d9241e42a3ebcbd18354d264053b4e7 GIT binary patch literal 3518406 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%0DmpSOd}I#thpkvKi?4&g2{UxsoHSU@pHqS3 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

K$4xlvNu{myWdpy>;3C{DwhgrOMKt=FI^ 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%0AA4UhIREI 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≦npwNU z?V7`uDcMUc``W%}r`oo5WeajIME$&a-N&e==wdyO(LVvcKg%US^wBmmvB9?2>blOS`$yElojkBPMlZs@)x|7ROkV24|y0VMI_EZcvKr@>Lt3?E64O_pZn&2 zrki7_oR%d|xJwMLeolV>ByC>(%ve$g_qmIv+5Z{IzWy(UhvhW)wbQ8w$Fo>qv*CPm z_|9OKyvLWr9eIowGiRJ*a>DzEopc$Vh4ayb2t%l;yFhJU*6nez_Z78W{E{Kv6jT)| zmcL9K>q2Nu4^ap?!8*Xd#nRpV6MKv3y54s)%*Wf*t&|VLy zmxbu~a~0tKnEcGt5w4Yio=Ca$mwD>}Z}<7=>mOxrHJJ!QG}{X%yAQo9?wS54d*04y zbbT$Fk}(uu{cy|_@*%N&h=uR=nc&YnyeUK`GxmsQ^B4%wE*+1OW5x#Tc+kLp-Kdn&#b{`;8rVYbk2 z?W1+^@pB+`Sel(d*+7Hc`SJd(0p)wnNq@1d23^^&wZp>uzPyc0GT|uK0L^kj4fM;J zC)8mTyph=B8UyI1beBlQ%2RkhIVHI8LbJDwRNH@T0vo_VLQWV`>+MP6CE4q2XrbUP zg#*k-b$pWBZi>bUf0Eb%R+-s&H8jfHx00idc?nk>SlL~4SW+9%NGiXzx@k3iOE||I z#(%IcCFKuJV88nsDhzp!7T+VG2d>juAu`C^!rFZ%v~_vRaLMVMI-@H&Qr{2$5oDDe zZ4*xp0}{qWBiyaLAE8Duv?ErHi)Ko&x4+IIrMtCdD2<0j`A*$`+T`F3yCe#ov+lK> zFRQ%b#p4`g#<*Dzl$ZoWjW*<|u8ryJwb3*ys$Y|)?TX-LV4C%0iQCH2oEnWzMaFaX)}3&jz2bqb#O3hVNN*vc(;X{7Z#JG~ zL9NI6-&|p6rE4D}q;>8?=;Q^Q*d8&e;9jU$O191WO%Smqq)gwjyccBLtT5vra`!2V z-RjIcH!xfvT-zpyy2z`&x50lzMe3Zcl0!nmIJ{+g^Hja8B=KIYoz-{n^_FH^)QX1fRBN**=OzhYdbZ#ZWs5K0y3f13Tq&m-$V5U6udj~CSy*eujoG& zqp6%~f~mF{c<0pN0RIeG6`D~ORVO4kiN7+QRu(C2Wa1hL+Hto$T)>lEb*DX*miS(b z>h0Avbrr%EK&wtL#^KLMt(V^za!BOtLAf{-nu(tPFFBXm!jqTQ1Mp%KtjCZz5u0{aVhR(hiw{<1|7UH6v+RyMUO(A}T2m4^yE z#^)?hQ|V{gqOV_o-`!=lJ*@YRg*J}YhOLE{=z^=_5dDm6Cr{A6Hh*2QgSnh*Hp*Y& z985hFTVsGzt{2H3t{X}62!5SQtCm=!*3q9!msDdnub?kQFwkDtHJ`PbLaAhqqa!hW z_Dz`TL_GY1vqw~x2f)y!*`|UR9SkXzL<3SbH_XG=D(r7M1NuhiU= zy;{S`1)AdE>Vd^W&QcAS`qxIk>{)v1azcd zL)Fn4PNFH%VS^)z#Gn7T$8Yyk#U+DGv_r{iv(KnHfydn7WA_NlQ2XT~AF%YT^FV7( zZ$8k-hb2)^$_`=VzWzn~-lX-PU;krRt)EvM(MZ_L2i&U2TnD>*$2Vd_Q;qNH)B*ve zSDr<8-%B~~x-K%cVYNT+0rl7v1p^)Ai-i`7D{f}1UIcM*U4Mv#ePb_|R`dEhUk2{M zYR=uIvVnKG&Jc**W79h6vC0h4K*i_A`Qm`50r#I9LoKV4bpIy49jJ4@V0g&SsVQE+{(5 zRXS5VmR)nMl!DWHho^{B8#VkRDKzt*3bBuN9sDD%A()LrX>XgUkAq)&X9L#bfPX6x&5aWR>XOVGmY166fMX4@@p19; zrbEn|zc z+%E=7j~aF$(feOxWVIfY$1NZ}tCwTidz1D*Or=q1(iQU$FsBiLxL>0)S7-Y_371F6 z*lE#AOC$RKfEQX}?e2_Ru^h!_oRreB*t;5iMF1Ay6L{>L)3hm_v|}`SpR%{Xx1W}*r}_zxfcC#`?+5+uz&8JvErtBqBOwDCZcfP zhjZv1c2DVo_q`+LNl|O6giJtYRI9DHUCAB6Zb6gHK*6sYtNSVn)|$S_-*u2B3H~Y0 zz6!gEJ)U?+tvyF?Ij?O~aNd6m zh21dM3wd@-=42^Pz#BB%#GV|A=!g*s@i!vmj_*TBCuHs0sFBYOODPXeBb$~H$7FO} z4=wq~=!tLy*=6oGdpj&n0p`%zhX)!>*e8q7HS2t3f*ggpOCB-8p0}F0_ye=yB?~`? z9KoR_jPT#t@K58&!{M1XFUKnfgvqf?_Mr>78^0s}xJ{g<)cs>gkt7~1C~=FGi72zH z?u#$Kaq?1Q3rJTDu=vycZ-k%y0_vnKcv*! zc?4>39M6ip*HA|KsJ-#pQFTQASj*VzoKU#3r_DKV**<5>(C;E}JO+8UgGIGYeyDd)9uG~lKSJ{7(Wb+k^c2^7y_(92tU9q(BoMk zZ81yAJ8o=FOovH(cb*TcQ2T8xlU$|^mim6nct&CjSO{yXNwyHH_aHO)_ilj_sLRTpy-iS1GV!Kgf13_jV)bP+1by!|Urs~vzG zzrb`Zdx>T~#UAuO=kPOy95&e`l<}HIiHAZp2JN}D7Jti`qU-9}XeL;wnFvz@#Qnf@ zrqY(>y(7cIA9O)m1MWNFIXSiQ(+ZY(sGI&-yih=jj>j;vD2r9UY3|T3oi6FOW%51) zSckw0=i0$S<)5X1+W63jY)0`}N-pF9yiTr2ulB3q>@g#! z;9@ECp5VyKV7hS3VO=BF&dl#UD^|(T?`ZeC1O9e4djWfG#Z8~r!;ecVG|BG&%I`U^ zQe;FMvR`1*^t3>K+3eG|yklE!lpZO3-#xV6_xcYSK#?i5UGO!gD@?rQb@)ic8Q|Rh zqzaqLV|1KMCX`E2Wqc!AUFi7A#MweG=l;B#J0iAK?_F3WKt$n;6b>%VQ_Bl7H86Gs-5*gRPCJobS4Z06s*SPC`qK6R*^5@hAKMY{e(vgtW^Y$?`+dHuiBglzJMg{&>TS?l z!ueJ=O!-d4Bs*Ri8o5P1P9(pkUZsb_3-oh-kXp;Vyg8YZINs6V6*S5$f#H^mJo}nC zc<9=F2-w?9-_^2Fhzyh~4c|=wKS4jEP|OjRKHWyG&6B*oHWK!AACeX_AVpc(C>3?6 zgU!WOB;*-9`QfA5wlneW+6W!FiFLw{CYkMyloN2^Sm0XlU?47bipeZ=v=7{|L%_;d z!$efqM%|K|e-2jJwQqA7f1zUbFM>LCr*WKMRb^Je>7R<9k`{&W~7JIIJ@o|Q~?!Krq@rYJrn*&vqp zU3sTnR2Mg=;;wz_7TLVzggXy)!YeLGqBa$aM;3Lp*_l~k&_*cF7-tk_o)?kn6lIX=j_PR^mUf)@3bkq5C z8-Tapyx5<;o^iCF8p&yIWRkP%n&)nzx)3MPdN2Ef5RXjnNH{`om)l+GEZr`8zA35|T?c zE{2?dsBDE;eu@bGs`%0P(4*1-co{=hf9*Y>CS_YJt1Iy?N+rbeR9Igj>cc=ZXqMgF zCuuAL$ak76=7L>&ifgrm;x&5f&KHA}QRHN+PUuPCbc>_>{ZzuUaQJMC%eR@T?;CwS zb@Ka{o4In0;IocnDH*0HlX+7^w9X!F`B#~3*1Bco!JQ&C74@`&J7IMC?dlkzVxX0! zjl__Xw#UTqyZw&%u2*Tw$JwxcKn(xCv}r+Q%;7YPJ{(nHAC(ogr^E4!a!c zKXG?ys0DdmFWdcqH+J1StpVdsnMjS%&PA8vVs>OjFn0pe!|iod)idcHOH5?nfk5;e z^*ss@%JtVYS4jDmDe`AtR_|5#z^-g@&-mFu>Un0#OnSlPnco6oXeA?gR z_KjUp5+WX(ro@nSr-!C}y&Qqd(zu@3lbrZ66D2H8mI}&k?1wjP+yIKEWXCo~yUk|5 zn~Uz9vbmI7?_O^z@&a36ATyzi5u#@oey4ayfx60+N9e#Q>+^YKao_wt$x3`rkzDt! z1=zjwwvgSctxoccZy<)d;y}SmjVyT%6Jq&u`>+odF0Jl6=%*W#J|9Wp^?Dp5qtNsZ zo459?0QKlzwd z9Tszc@|t;^;OAt-zy2x{*cJIGbHq1mknxhe*19hITV6f_5+P+JV)2;^>0>3c_Y9*h z7y1Bed|br;+N}B;Zi1cSYFK2_YTDxe61JH-wSGJNkx-eBymI8%iyAg;|H!Nn0zr53 z5B`xD-|soU)=Qq(LAJc3@Ax{GLi`s?0u&AhRyn-6k0>3g6}b3A0$k!(8VziD|E|En zukXC0!bDoQQT@&{)H_8Tn|r!0e(})0gjAOAQE8Fqk-lkfL(Se{0bNNIu4aqE(z_CF zFxd(#boH%Z{#V{$WbJYqH^D zv{G{Pm&>54UFFjQktsiKsa*`P=IA90_u6USxaRig?Iz4_XA z{?>*C@=<2>%1;B;$1opr<0YGM4XK1E3(eA|l>w;4NGvg`!htPa2a#S(_|3s7A`{kU ztcg-rDLCOi+M#{*ckxGJazouINuJ-fx}QVx-hW#LM29u;TgtM^B>J!(g!V8eGP+o~ zGr)po+G;Y+qE>*4V!RBw(cvy^FE*|EN3jw&W_Vz9bfYBq8T@Uezr+1XE4|Ec2g^_8 z0Xy2YD{pu!6j37yYfU?64e6Xvk;<=Ca+Sd&b}pk-A9vCl@GT(p-oQhAA;~i;!4)+h zYz9K94LF-kOzUpEITrqec%GNAZY@s9k3l)SP_pq z64J55W6y(gSMWiax1f8;;weAyDK8J0giX6kql#hayH-tY2>_(zmlEzlMynd0dKw$T*OQ=ta$&s=qjM=7H^FnqDk&0ZnLYh#Mk;$yyYwJEHIghDl+ zJCHE*JokBv0M`|MuLEqcFw166SbeZ08PsP#UsV1bs+=dTef00&7r0raPZ&P7Crj)0 z3A1#uxxQ{`>Hb88z-ahFfLU(w+FsA?JzoL*u|)W{Fn*!;E_aM${Kxypuk1h4h8alR zfK3(DOs7GTxTeTAzGFqh^oBs!QB!1PvY&08^~6n=v&m6p(dAOR`U)=9y4IL)*E?Lf zHhSHQme(7CHdKR|=Wc?udKC+?jW2fqxXh7Ww%U~UdLE0LcZWvU22{;iC7&kcdBey()RLZ6@GlUH_#iw>Tqs6wq@R5xb&1rXu!s#XE1Y`JLwg7 zLrl_wL=WWOWHshT!|JTbCm3NnZTou7XqB8H=&_Rs$DnOSS%E~v(+7RIf37y)oM2p;uB z-1_Ua@T{_>1qB}~OQ?AQI2$)++%inRQ_Zu2Emq@eIv4jf=Z3lK)?n*!IpbrR&7I;8 z3wI#9muxzd6+vgF-?uWHP6B_``@I|ML!mI$T7?f()wMq%itixJd9TVYEYC}QHNT=2 z^D8+j4hyu;tsdK7hx!>=2~S$A;xk{YMRj^8(amPhSEopw;kvHHV-r2ee5_c(-esZc zm;B`2u*qG=Xa0Z%M`Pi*MaT-Pe;pDFWz(q?oDtzi_0EEIepgH z_h%y#@?cs*+8!1s)dA|0(i{s=UER_8`muu;4QK33-_5zk6OT;U;lfu=JqdDt1Pq>M zRgQN!UoD#!;@CGc1*9mJ$b>;Z`e@OE{t8d9ZZHy$K=An1`T6H_0DetDJHAQvnxA&x z1Q%X?1ZJGpZJ4rEycv-ED||yVOknsJZ9eq!EM+99?d}LzNWW-l25hP6 zwC&Gtj?QeHQhs*RI?Ca0sRYHXQ~96!j-Gvhg)z;l(q9*upJN3f`^Yr~1lu;1T4Bvh zf-4kbY6CtPb2W|mAoT1~0l^)f@owWM02haLwP;%A{gn433tjfOQ_T9K6ECZ~HgwVg z6yNF-(UBb93d8S5kJYmH?t4Nk6u z!MkG$xhlTpFEGG`RpBPE0%&CMvmP{PzNO37TRMuR%CBpFG>r~_tz9j4i<(PwL8dd} z4?%Sc20e8p|9)jKmdS)Gi9JK)M?s)r6=2KNaX(7^#MbXMOB6NPxJ*r>X6uKkY%0u0 zPe~|Sk1qLQLTO3!x-*EAvVB7jc=IMGpmZ(zNNC(|Epo-k&Ld_m)Zweh ztTh7-pI$pc7wJ+j3u+zOyz3uD5OAp@sPP2FXsgv6pPgPZUYLH+i72A72)&AOvP>Id zptLduzkTnT@$k75L0vL`G*f1rw23;XNp6tny12a&z8MxY?d6Jgbf*mOlW2Jbb=!X5%>lnI5*EkwUkqFa9G3J$i(UZ4g=v z;dx0fQtA#(+qG5O>OV~wl3lmrN{$xzF_TEzMmF(u5MyfX-4)Ots<<&ZI=%4I+uEbb9ioE(-*16PJM&VGd!sq07Lwk%KyelcrB=~N>kTj<#SksJ);A|z zDRJR%-b5ikJIep2hg2+bFDncFShKRRuRM|>!F-nDo=JZ&z_Nc+Bk)`d_$`?E%IV=< z3hWP3COzL}JhW-0BQGsOTG!hfOVDv{N3D}26eh=E*}^B>jA}tY%!$x@6Ixh7@wlo3 zfgW{g_u8D+-~egqiPR=v*N>qJGH08<%7~~$oq)6HIT#J7Tyfz)X5e?@I{OTywPng8 zNy;Fen!8K2KTCn9Fi910qOP_(#AGN#*HvW@Azx8w-+tG;tp(ugbIX+iR)MV|dbcMeqgrsGF z)N5s|-Uex^FpFCaARiyC=k<@+Q5w)GU=H^=rvLD``bL|WX$#Iw3#nJD9mgnik8Hj< zUJeW^yjl}%4QzmSS_ORL@T`rjCjR;?Uf=<&TE--79H&cMb?|QE;`lR;IJ@ql8ge6- zlKiJ6m)MusX*gHGiSX?kYuHGfmya*BnJBig&^&2=4_%w?twsOqGBZsGhhqSVpQYBd zgFeMK&^A)0IEF}EPSp3y@K!;L$r@r*!?>J~zYN?f>wigVjezf@L4&F4)?-ctU|$jD zFQK=wmV7lPPioEPDlPQ8`|*I;22RU9+cn~Mo1N-=yOk~z9(fEKNO=6oJYt*6M}-{n z#QPEUbieO;g_K?v z3OKp>;a=xO2TI7Ws`!MVt5R+R46-3y&Lrq#B7Xg)nURCd{c4uuIr#YX8OmM)qdb#e zYySO$l4OepUWJ`!3R#gesoc@>rWx(}i?tRLqQYmjKllho;GKI4IyXiRFW$cPI3WhQ zXye=?YYNOd&#(m8hm6dM*lU+zHl_9=Zt=e}qpRGKOqxOvLlR3Z0KGA8HZBnzhbrZo z#IY&%AR#^87M*RcH* zWzpbx$m*@?LoC-olE?}FHe`AW9WJiVM%#~?D}J0qk4{L~rx~vunx@!(;XODJy~|_m z0sv*dj^^r;ZIJCV@%{QX?|)Zn@{agLw0=`ICGTRpr1nz-L+0UzJTGZ=4OO~PUWKv+ z8Cu;Um@ibmIh@b6(Ys4z$6H8A@j)_Lrb<`DBnxK_!5zL{WLvHDC$3wXMl3PXGg~S> zTnvy+nfRYl??TcrS{uDFqptooJeRuspDp_#M+z^+d3jvz0SdqQXl z8&GK%kOpf=YTlR92+7osG1HiK-t*FkoIwPY&fiWx3VW=OrIkhG(xb+fcj#PUt;cF=!ivsv7#PP06{(GLmCR zO^X|!$Z<)!7dk|8vidc+l|#t|EH7kvL|$tU1l8R?mQVi# zmn1>$vTPeinZeBDtI;GN?XPZw5aK;bg~4gzTFTff*F~c7xPg>LPvarf#Xy z+=I|q8sZdzc8U}EcYBNj2W(YHz&&VV9@YFDK`Fyudftls8EpCJZMmy*a3^{^6{lPj z6(0(=QgNQUfzWeAx@Qt}&{fkHT`o!={Owu~;5Zd9Uc|H&t9z?v7Y4V3J+#P3(8W>B~LbP3@p_3!s+o(>ns?+O7;=gT9LOGW;=d(}{t;}-5F4ntI zf#;)}?cwI-b(kVMUS^q|(6-e{%Sd3I(3l`L>nDuLdC0!>DmZd}BPjg_THB6RAx;Jd z=vIxKMq%Gz$|1@gme`}{px-tIzH8u~H%i>t2CyMqGv?RJa;ramXsqx%^4DdVzS8UG z3DSi)faZ6)**i6x7ef2I?qa z2CocbZ}j{VBqC7JHS`NO6pn!Z9q8R;|SvZH!aC?bup_F(23KXKk&b1C%+e_Q+D9N8N#)XCcK_!zfy`*9u=9(LX17C z_?-Ew#NJKrko8_lnPkLWy4^!X`*7^TdZ!f-wjfNA74yxMFRHcvs8yxXhjO?S9w@dh z0?jFq_-9jEZ%`3cP{a<~=)SW5PXQ5?wSH6Lf*S94m2P&ghRl{?7ZG8+ zmiu<1wX(Vo=|l7;0J_dsGDa0uKCD^JH6`qKbNG)L495V{D*oM4 z4(%vvbVt(qI8ATp(?&rYi^w6Ct!$kFK37@7GV5_j-xk-DTE67R@YJ>&PX<7f1ybE~h*C~o9HB=fsxCXKF+T-p zIy8Ss>Xb~R%L6Z#$$=KvTsen|w1mp|Ew57>ul=_Z=W<6JT0GUH@5dxwC7P)*^H^~z%$AMD%EgXwAUq$$+h z3 zOIGyqw7Ixf#^6RI-_Ynp4Gofu<(HzK9pq9a^XbIWs(66$=pw?GjN`_8TlBzg$HDF5qQ)cmG4%rb($See=16`q3(@w^tP zPWx(l>tqF0tjB)|D9qH-=lS7dH|J}=>snE2NOq-d`FMul@HFW5t0LuQEh8J5t?$7j z70-$2Uk==@MxfTux2%kTZ$#=FL#}AH?P^6O2Gy^<@;t}LahfT8`>z!rnN<2&B=SYj zP&;ba!$0y{=J91eNxE9(p6ff?FU*7#`%qzU)#RxwT~GtAlJZND&L`KCZtX|fs`BYM zG@r<%rp}0@+zs7H)s3@zAJrU!^euTiOgAr8c>b~R`)DVzDIlV?S9U2NM6hi_h$y)bc(4X&q)TDQ zBX3xt1KGj#_LZBYq4P{#j>8j?-{G-VIlG5nV0_Gg<7IWFx^9Bks%sQaYfGkk%_UH0 zwE}YObqbakmqN8rkEa~!h*%zz)J^Fu_yzALCp&{qd02`{onK|hM)RA4AJre@z@j?V zxOdJ28xraw;ocW_x0rRtvh9eg8vZ;F4t1RN%WX;_pUHgsDr?^7uZ^itG5+mkl_zsF!-VZ@>~j?2aqi zK2Rt(tw79Or0kae+Y!B^1yV~X7QZ}li8?@$;LH9K!8HU*r`+-!nAF~wDsn-9b-6-^ z>o+$Zd3|BYlS7FhQ>*>fR0T=xr%85|JJx3@jd)zh(a<5sjqNxtgjs&?9}%ocv2bj! zjJ@dOJ20sjXD$^oa1dg8ABmCqJK~F5m}`{dc-|@iOQ^dz8z!|rZb#Epk<@c-*LmCG zvetJJm7KSeEx8V85f=pZ2XlA-Z}+km9tAyv!hzR zQ@eB@TU+XL;c1OXP1${w*`O3PLt$$fp2?iHS4R@B3osA7FZ@7tlo*Lr&Yqv$*wq3-_x{z#F8 zN(kZ6AcXAgLXur(<|WyC?>i+sPDwVI=gvy@JRW2_>uk>6y2BZ_e}4bO_w)UH-mmxT zRR--t_SJtpHQ@O=Mx5&YeitDoLA4?5_Ij;WtMf-Nk|CgQnTH_slMhBa!ckKGh%!KQ zeU1nnIrmpxdcQcbkYoAm3eSs*pVyZzo)nJslmrCDdbYnKY<(6hvI_fFlsc4k8Hk@( z%jGtCRxGztGmk^|bpfk}%qkry$h@AZm=JeSjlpNc=I>|wP9)q?eB@qn2J!m?rlycVjZ_Fc_U)bQmWcJVWh>pmPS@U6_Cx0 z#~*kE(>9eR8jFrjY5U`UOR={{@wpYp`ZMJQI(xk6?i){^#_jM@mQj*b9vka^Ip_pR zhqGPz;Knng&u<}SP&O_=cqAMN&ISE*e`Yv&*BpB~t`RFx)GBMDasJxrQ0kyXE!nY@ z?zI2Fs$NAuzq7TnLBWI(5g4I^f$+(;WtEnWU{4-H;f2KTa*g@+yNmwudv{J7FPtuY zMh#cU76ILBDEix&fljm4ypD0PmO5?XF0V=PLnlWHe??EvJ-6O_YP}m*$ zuH4IhWx=Q@Tw;ou)2F0v&Ysv&XFzIt4oX9Tu6{bYGXwE>`u;yiXuR?_jJ%cpuw z0#@vgdi<~LDuH%xq3#}Uavzkb^P;^rrVK9{t;F@^W7aLLCM^HNEm?A z$#4JH-^f(2{FteK@^(9VOA+xv=p9fRy&(8U)H(4hTqeggT5Kd9q^ALS$`b4#fyf8n zH3LjXw12Z&H_O@{9oOo#k`oN6r^)s4&C@zLa;u&x6jry%tcecQQXy=(=uNKVQluHn zFOj6==p2{ZU$0{e|Ax3ZLjatk zYg0w*74tM(BJsN&PIu@jIRQ*<$u1e)Azz6sgNM*PC;O+-$w?W`vqe+iFOXaQ!GPKp z_|u!cN`3TBSEI{Wl#jm!Wdalfm~(!VIFdh+O#>gxa9DrmJ$U`_kDG6ofTfbfiIq&0 zj~sa0sG*s;RP&Yb2-!V*N!`~i?C4jDYN+ME#zm{uOG%XpZ#b5EjZUvznr*%pFiyo6 z>{|F^FyGU~JGEIKmuWrv4k>J;>2+IO+GGSH$d zaYVIl7vP7OKlX1QQ4Yup4M+$D)cdyh+Vvr2o(j|E3HUSaY8_Y{Tb9~NAZyE5XD&}N zd>?3}&k)Sa;v%d3$k>kPp6(B{3H5;84+KE`0@c@@h9}bapQ8le?~1e+6a8)V%D0EctWRJ8ib_a z%Dd*-k>7l$2&xV_^d6GsC3Makoh|!h6HqtGDW5ai75rEhT z+T}|d=bEj#Dh=7ogY00cQOYx;Jz zDEh-*U31lriC(W~MGeq_+LKZ~=Vyh>cgaBS}1dWp^VZ5RVflUuo-m)Mr$-aA;O ziw^Dfx!LT8{CLl~+v9p9FfppBbOI1C%xZFyj-7NsJXm>`F-OlBzF~Q5{PJ4v=?3xa z@`DI*IgOm^^l5Ohpl6hydq~cNndt8Qf+aqbWGgj@FzJGpugDT2tn;PNBcq^ean!%x zP13qL&Nxb{$3+G}44Zx8EFQKI&%rX-=g)ao$pg5D(W||wTJ6q(B!gUcZIIKga{s;V z&k1&?G{_|u2baeIbtJ6bwXw}2Rjr3z+1bC_xUOQR71=L`7R3K#CDKZ#z1+UTsH@Ov zCH482%0$yfI0s4I>7#zYm{$66vGd(PmID{##|NY}7i-{0Dza)0M}MMBoQFBBl=e53 zfkt($zj;P<@9TQ*sh&inbJ)04Z5NB(jB*-m{d9aedI4*57(K6*YFCV09yS**sB8lr zdsvsOtSe6Cd*Z5*Nwva!`z@)HMc1(7^eo-SokM+oy_-eMl!FuJQ*|ua$olZYYU5mb zgehYi*^Bxt&m2dGx=9HQP-ydNXaO(7TY5H=*xwwM+JYBUtdv5)__yg?H68pPGX!1- zB?5FOuMki$aY5;rb;hdeJEF(_e+XsFMH+v>Yh&+8rVF`+S8xv>n|*-OQFc@YU>sP? z+@0M)F}l1z3sY0!RI=_1&Mm^SxsiWv#-{sPD%su^oHEtA(t;don(j*7eLRVaR5bSL z(9d-%lsmhM`oKw2NB_D)nH~RAweE;m`w){H*-E|4CZ#Jczgo^@@&IRX|OCTc#Rpy#EpXd+r0QpN#TSqiR!92YI{{4!FWQ@zl#hVj?lz~#g=ZxY6}mY?yB1*zfsG$h;k|EIvT|S zJ0qE~wBA9-_&bFIwNLkGA<8{}1*R%P{T^CsgU!wzvaL6I(OynFUZkubH6ziobPSW; zr04VzY9m7|t1TL#S_1L9F8K6C{$JhroiK0nU&b-E*V4<6|Dc!pnYrJv(YaWJ{Du5`HC8Z%v0Xv7cwb|d4w>%cK5B0?-^O$;7gT2Iv=QF z5hd^l_H=#RbYqpv&!>5n@8TlJea=TrpQ#^m@KVe-*@v-spP%GPlq+PvP*_jV+(EHyIA90*CggIKW|hxeF!>{bYszDKeRg~5 zA<4!w$!Z&mane+`>P?R>OnSK(;)e-@Z zy)0+#)fJte|1F!h17cDBX>v2LT<@Jn^2DlY^M)?0TKrGTuPilNyrNx*<X^Q5YEe$_W?dwWo#VVwULxGL1Uys+^E960MdK=^bZz8bt~el0G6~ zQm*8)hav-pNoCXMv8|Tn>r3EubB-M)b>8I}=OP;{9F(FOgnq%z6NnJHL8@YMO8SL5_o zx$F}M*Q@Jj(!T}Jja|mZjO_Ie>kQa=oLf|akYW;oM=ksK_PM66XsB~lc10G<-5WDM zvUs6X-lS#x)@hYfw*JLA^`g)m*{PQ7B9Y`sQooi%_)1dJV9NBYDzdpV9deS>A|M1G zX^Z8R$Bq1Ra?>AD_+=q9Tc7W%TLm^%iGu4*1HBWJ=7xl%d1TU0s?YWI*G9C zFG0tcC{<)0Y`5u852aF?;THUpKOWDapH>8^uw3E7JH z3VRyW+~NInMFpHFX}a0-2PiT<26*nqjybpBdIR!z{@UW1*1hZ(Bqg1p9O@CM&awl1 zkVX=|#>{s=Az@mb77d|Ld3W}8m1NRqh?qVZ27o}|!guH39aWrD z?J!5apC%E1_8T6G4l*zUi>R57XMKm8rYslu@yeSvTW$OX=?0OF?>rI(3blYw@1ua& zmGMQIcCAG@2o@&c#&sXE!*uL+@ee}Bah%HXoolih2RxifY8;`IYFA!Gi_AYZsk|aV zkow8AMf^4MO*o2IK2jf(wI8X<40l!V18Thxe0xq2@N`IZ0*uom;(1WA#ZT0L-w4fy z$ww>WS9m|#o%}S;pC1kYX3j^7C2Z=TQo&Oo{riTwR<#(^wRrbl{#_5jC)MpI0$hmAo_@z7g2VXnaiIzIuFNCeDyW4e z9l~b7fA7Hwa`tc%xw0-1fDIdUYwLoVD`o7LmWj+ZH#z>`8tJXZ{J}{?sG+Fgii183 z2&=Dmw!&qBzF+GupE~~RGz-z> zI^-})6%n%56Vv?5Wl82jUJW`E@9u`~y-B&CeD5ndxzEuh4kCQ<(6GtsMmOw~Q@(&p z-nT4Y393p`Ws^lOsOULASr7MCh4Bra5C>n@u@J=oMoD4eIr>(92HVJRV&LkA>a%o0z{m8BSco8yU0sT9gLc#YGIikjVMl@Os zs9$3|LAO}p+B0k{)7Ln9^!>BhUWBDinO!{$1bQY(g z7s%-_-NZ%J>+GvWRK|H~QKtHYE7zk4Bnf1|YdL&gk9646Ja(9#HBotaZlG@|9TTeR zs1LV=jw-ipp=guOWzKdV;1_4MUkhP5D}~7XC@cf zg>X7ahPLsa&9yTe_Wu3KtHO&clw84|k6N}M4w(s@5tnU3$tKr%Ih)%g)JpZ!+{a*D4!@zk z5Fq$)tW*L^ti74EaZy?QyXwu9;qk-7nTLTrG9Sb7rwyi@C2_jSHqF7*W5&5b`!mt| z2dM0wVrhTqTv7X#(W?#f6>+Lnc4u?QX~c^69z){~dvMW?b#cXo;esG2Cw|^K zYijbVw2RlTj%(eLCS1ySm~U{AOYHM`g8P@o61}%4IgV6jh*=6$V~kDqBz)?8snA-) z)o)+M+o~985nS(3EWC~PGVy0|m(BjeViY$gUqW8xAu!n8UU63H3ClV_)dLmbPxuX9n|C`qY`SBXLdvS=$<^Ws zdK=*ym48;HKkhsICe%>Re7sj|nG{9AS+`hOje)@_txMzew3CvX>KsA%tL>4@E&fAZ zyak0!BJC~RgooU)*o_n0Iwql?prHG%AF74|99@g>d8gkDudP=1(Ig5-Va}QV+jl#`A9M>J)f(kRF-#jdUoR=FA(C`0o0+6wV?3 z$yMy}4qTURpX%IUO`i{Z>E(G7wm`)Cdo~g{UTkj|Iy2+t!{CNXtJ_W-<4e^)LDkkyiBg~&4%B? zGv9kZdr+q0*qs=v8Zv&~IBMY#ZOEnS#ag1rcH`0MwUcDzvoPi{0O_`=KB@NNtLe3^ zjBWeNN}~5`4KzCricdC4=Zy%dWBl3=Ubbro#uio4l`RGs8hV1Q7!TNZ_%={nREu}!u!3l;v^U4m@h(E-mQ#*xw z-EWpF{ZHCmhnjpdh)wIZY1bfKvJ#aq!ECPIVL_|;oh`qN*wl2>977o{82>ou~5pL@Zr4HV(C6%r!4O zUiKxev=PdGPsOa~srte0UsR%n^}{mHt^VZNgBop|P?z=M?0DJwkAiosMad6HyEYLjh!Akpx7LEruke0{j zdYuq7-0|7=&!|oGf0lzs$-6%FU3~O;CBjULd0gxhZ)>Z~hD_RXJkRvwVNALVGKo9a z_m?Fe{WQ&)IsbfF-icDRf~#%?B<;ak^z*iV0*Ie3PVZ&B)((dE#7pD5G>rEa6_eds z#!I+$$Aj$KZ*a(+Lt>}0TFh{QO_4~!aD(?%w%&UjIPLu=EpmT)RWL{Kz5d2w*2^0xiSU zOzJ{gsNhGr0XZfpDivs~)NHJzRNE?5>n|7guMmI1=QwFTHA@<8m#epF)YMzJuU=#L zdds9mqvVa+o7YBH)w0kh;b1VfX)(;OWBnA=9yF=~tv3u?3E2hA;%Jn;{m{iZ*w5qZ zHo}o@RrOdHFCM$hJO@uk@Cb?n+9LyhD4^In-fSgBCPz)`FZ9$iqg~ERb$OgJF||d6 zj1ZMvR}R>BP{cr$`O#1#=5bxth4I%97{iUQ6MM+9Jzq@=jR(~F<{~u(U$MMBV^E7& zy3+VZiW+1o@1KlEak-7_8V@(y*r6W&rC1NZj#tM26azh0)ga3w-#q&?eqOmpw<*1Svr0QPH{<|t%ZLa2xo z{q{6BE|7e7?f;CLYL7e*ywE_#x&DhZFMok5&BliX=<%&#v^W+5CUYRP5T$GA<;)@Y zo#ArNu<}vKWcF&osi6BLs?YPvU#WZi`7a;zMOR7%TvJh6sqnI+7k7^@Qy~W|Zkl}# ztgR}2k`yfYJ4drNzOSAuCat?d=@T{WKjtC&!+G7Dd7!9%`Upmi%IKy*aQz3P%Wv4K z8KHCrj0kx#)J4W9I^MWFaF%Y>y`orc-Uw4s##crNDY8_h5l5;L+xQ6aRvxSSMFvec zrSn9{)qv|X= z+H)!$;yB4Wh4GfSWlz9ua$d{ExCM5jo%E(86Om}mL_seP+5G);$}yvAi%=c#>VSON zebCf_f3Hp+;Nu|i%&;xb5ar?J)?TD+esySGE9aY4wXN1_|8}FE11&xGKl#~w$vXm@ zfjMy^3kUn$jb*fFW1{A7L&i_gUZrrAv$qBBU&kJu2(|uqc(^!@ z`&st|Fzm3AIiVu%+<1>y?$geIl=ZWv$?}l-y+n#E4lpWh|M~vEeeUWoAuAP$((Kjq-UZd|Q z(5{!-A5|nwC2eoNjH%nAT^okjrbR+!I&{Tel5EclflRCXHiFFo)dh22(pHIGmE4%( zCrbxN@N&V{3iaEN>e7p42$k7Y(#OfF!BlKM;M$_AdY-p~?9oT!%wRL_K_I&Rmz8X- zCkgrM4$k~$t9769B3q@f?9zrIZ#yKv(u;Na*@bhRvq{k~`qb@@rt^4dDoy=!@!p3U zZ#Edi+9XWhs}f^BJV^u5A@WM^Zv{0~GDmzQBP@pt*m~0IKmP1c@0js?e3yovG51t> zj8`d#bEBFux?278<{xHC35aJxJDlHX{PQPAbeyeSNu`YExVj+7Ewn)(QatD+xb8lg4SVtZBhTHTVKes4z%KMh<=##^!QjweiMkRe zHc1Px`inmK<1MRz0ecOfL*e&lKKe87*Bqi1cXb4Tko;G0?n}gZ1e$eW*EqntS-fON zYt5CAV+l$rF|!UjJA<(+<5Cq}_9B%9Iyn&hfn?=@a^>$VotX5mUiaOdjjy-O(IubJ ziEE+#_XUHGc6(uiZXmwys@&P`?@DHD8=yNM4vcZ9e_tmCcAr2n=lcvzjqO5BuA?Zw zFq1F7x(EiC{7fFBr1brEa)3<1C*0)rPjiQ1im=Su9<9NBVII`uJWTMU*w8;hA&)h| zYq3k)AtrggLTSn^e@bqc$hy(F zPHEkF?Sqq1{8k0*%!k^1ntzdpv(e5MxZOuoVSrhQUIa_R;JEc9dQ;kvY3sEK-NhMD z4h*_e@HVwSVf&tpn<%Jt?LXm4 zBjH|aV|_7@C?ZpEN5@<1?4$G!Cn<;OcW2tn`$=10f^15&3ZaZZB2IYIH|X@Tl;wgi z(vKRm8WC}sPhR@#{&nms0m$(JGkf0W@Rabm>6l=b&iik^QG~HHcZj?T%o`liVQO-1Y@zp1t-enjnC<*VcDDH}2RJh#7jP=M*$J|ozUjs( zAHs9fqpL}{`8}MeV_0}?^2uJBJfG1}*g}l_MDn@EP;4Eq zLcsi*$?fB6`}(Mj@6Y`mpVxN5YBunGpKsZx5%>kr?!lovCn9dW)bs zlk!;OVN-+st&lOREfzJI|ESAPzE8clSoI}s@@(LSLJ*}#Z5SbF^Sb6C#(PB<-wV29o}aBhN^CUHmBCZ1H{4NUC|c+ve~T6pOr39 zx$Vnj`x8gEItwt%fKX3PGH7Euu^&VGZK2o#Xf;u7>_iHL!~z0hU#&yoRFSj+R#^wUu8iP^KC5v zm}~mM;F3~q)za*FWd5P$wdD4TD#KI#j*P6zww3VoSMcM`D4nWgXSsD(lz2tm+=|}A z^3k8wxMg0IvJYo&17ofI#s48_M1SVzH#oS61xmEl8ndj3?(etObGBJTQ`nC?g54mB zUBsFi&nDe-MLGEV|3UNXNCmGjxCZ!*ga zn5I7D%{sl_gNVki%7nyWl=*pa~fvyQVba*v8pk(u?*mj$T!wO8>zy0rne>t{H(KjPPFWGrV zKpn>r5Y3%0ae|$G86P@Wd`>Nu0(ji?4 zZQ1%>B;*btb_}Dna%8ZqMZFHc7q}Y@Fzm7Aq8^&_k(`1aJUQ7N{>{dz_&l7U&L^I~ zTq#2NPaae`&RK-umLpj4A0`_e@?bt@2|b)YCUb0dPJjEbkX&8cJ)caCXc>fE*&?R9 z?ZS1eEzi`94CA@cfL}WfTiKK>;C2nQO-GnD9Bt5+{Q}V|`*MR$3nTl=neVXjlVHiZ zmvM*w4BM8^iZSH)S>BbP_j`%J+@j&v8;-K3<#G2PXx*{2JL_)BE3x z!77vB>r#!EF1Eh&3Ic5_JYy2B(dMPsL81+8T6<#@+YIapE|*9qAo_5$B#%AuOhVqa z`2fTkJC(rwAnQwBqg2P&I`c+|?$A+`npOL}cAI-MBWLm>&#Jl`!a`0p?jF(R4psI2 z@!*__wATR#_4u6(gQE^2`huzLXkpvf^bV1+ePjA+FlnbqOkazohK~KP6A%?0KCecq z;KlAgJ$)&A5o}^=Z4htt#B%^+<{#DwW-)WJ$}0Rk)LgrVlw~JFzYm$KY61#4h`*llbG54uLD@Bj6*`6X zCTLYkN?;1d6i3q^s+(jl3yZ;jw8AJzc=`@t@r&{u#Hp=!Ia{#u>CDejNsJ=#VDF3a z=%QgN2X*%Rw?@#e*SqGF`Eg1EL!c=rI{YFr#d?_9eNg865OS7e6mS#4UDGG#r1dB5 z)g*Yz%|uEgwx-WZ{O$Ko5jXeJ$G)Y^HA+~;cFycC@nmU(wRnr+SA2pDvJ7p0r8h1| zBTKUaplYX3;KK4RI7*uM@GCGoU|_Sh*Cfr}`vuDmbn0!ZZLw`v5ogx>X_z_lzT^p) zs;Vj5>SM%4qnn~~Dbk{`^ea$y{ySVtz*F{S|NFDucWoz3)#7)j?ek`ydYKCNRvgoX zGa^WLE2y-~zOA|XsVnL#zO7T&Y-K7cjSVv}eUUos;oB#L229VrJo4rJ?|j*rq+RX} z2lx_Y^6_}D?$#B*Fz9EQ=4J~tW)i$pGvcIrEf{>+v@lyUB_eoq?0IGQGl6z9^!?{% zolXl8-%4`p79QXKrs6#6msHMnMhZnnj%NF%-XPRL&Z?)rxZbDKcqZsa4RjlxBVXUx zL<||EChmVnTxscUV*f9CkU6%ftCn)LQA1P`Cr6Q~g%qC_ybNN7w63Ev|tHw!L{E>rHjR z+3|k&h@_5Dw(C2xzE22NF%1u>l1eJV&%+Y4d(s#XV31bJo!Rr=EZcTw=IQK%vHhO$ zjyH`5vjHVCYHS7J0k{)7{KbWOCj66i2V)QFwyL}xP!F}jGdZA?@TSVEvRKDg)MyU2 zXId;5?gFSIv``!&KeF83SYW-cecTr~L=k26IcjRN z+l@^GoIBhMoNtESpC2uNrwiuP&1K@9c%IG)Yb@Hfp-XSPH1x1ndI<+S`+s4KD7m~jk9_?6*Vv>i3{Kqo(D36cmev48-F zirTTG3*3iWtP%AVE3Y3P$7>n>(*J9}T}ik~&E3Pf37?xz<8d8xGwsn@fGkX2-t1I% zu=Eup*?X6y;VhJO1wO}G#73xU8-zAoTtvlx;ZqW8;J3-m#6%u(y55rBK74fT(SRce z+Lhes@x6r~ZG*4fxY0}%K1knUmEyW00YUf$`N2tws_xt088CVcS0ADxShLKl(MWW0olFF zq(jTYMvER|QysLddGCg+QJ7c;&m5(R^;0!p^PV45q z?B$J!jV1R0I_g%$!3^&oV6}gXDvhCPghExOk6)e+JS*z*;I|+BK@Xu5tV;;yXpWm0 z0d4iFxEd;rc-W%UnZ@<=ChgZO7w*O~r$EA%JkunJKboYbXvl0Hyi6}0~G_Q-S0w(a2SFGsR|oeu|QIP`p7?}DsXnoU$9^Un>K z_T+u%nuROWS0Z5V5;}TWlBa%M67`4Cy<#dK!)8EPu=*WDlbrE(#!L~oa?bJpfy1Hf8FxART!hB5&`;AX~;~5t^41|-FT^9}C+_aTirEfHfXAE1>p^s+` z2`s*$Q}q`mb@ysMn4v}HUaQBmnM%`(fVniWdO0GIXLL%E)PT92-68sZx)*x=)zs-4 zf08UZjPL(795Il;k^N28&V9udqQzu5AyK{o4}z<%;s5>8A#_37Af`;L7M=2|*#>WR z(%7B4*^id%qoQqxi+<>{Z&>|ueYHLU;^8Y6Vp(rrxY2G@)kE88`Oe&YPu^s)Vqf(h zM}cjt5G580D;joIPmnUG5d zl(0~mwPIV3e3+$AW_(0sJyL4zIYxY<*Sxh6N;Xyy}8SGXTqvysN8{+MaRb-p`z(Gg4f=B zut$%sJc&q{Z;xFB`|Q|YOa1X>o>`}Z(Yd|=r!$`@ua$Hv@mtq3>T1#_;gc*2pr>gV z$zyS`$@e{wB_A)tye!fF#hi7ZTBKSZ#j;|vDlE%WL>?0{Q;2t)>^F4Bj-751CrK;n z%NcaTFO<`*EhS%P(Kx$5BMGifn+B`Lq8LmcB1Crmb}OqKBQiAcI$2~l6)rt6>vH1G zvp@>Y(u5<9%H($Kl)dQ|SK5@}7HR*~)}yrj7O6g2LCc{+-)wDfnaMyUAX{0XI2{{> z)V9>BlfBrVlDW7jnuHB%liINP<|5}dO<(=kcXOhr@K|LkZf_S zP0@E3KY&_N`gth@ITz!2)qacE+0eRc)k4b>^VcW`>^*qCpE?mTSL~5)s?F(_G zkyBWEnV2K4j~@;?Fho6cCOCMc^g%zkeyOr#1@C57uG-6tz#NYI zt}Qkm*4FX0BeIa`V7fmXaK9h$n*Sbppl8kCqxOgch3am zDxI=M#|^8jG6_lLLwl2$7}gJD5`DlL5o3 zTUV;tKhjz)$$G@*Q}D^a-kNkaWSD;f-h(g&)5nQJ^=Ebjp>t@CWlP2GLdz9n*vL-W zw%7gPF?;O!VK=jyi!?4?O9uU-TB6amCz;*-c>gM)?1eHZ{k%PhPR1!y!L74^xG2c} zLgucLqKOnN_D@w-%nM;ShNMl#IHYPRe2)j@?X8+;P=H4Qr%cB_>5uaznmF`#0=87@ zeM_HI#iV!o1iy|YfRc8+MzzjeC5{l<(J5lt5tayVp^+TF)(5((IF7s@m+?X0wSC*P zLUaK(i)ps6pa}>WMrWI8n(&1knyT1XVQX{1y{JsQn9#k+@(c1@w^(KWNA$8!hJB6+ zZ3^#)X{mD>^BN5JsHlD`2hqLDWe}#j<1a#y|MxMR9eZ^M1U0y0j`=$<;p%7Ws)hYZ zB9Dq_v;7n6XL_?t09l*;VgD{@*5ArxI}_P9*>iPm9|?RBkaLzG^JOpWpnm-&;_ofw zjRx$#@j)vqUPt@lQ^1F}F2g|sh76|_&ZF7}aCzSr8pOQU+JQMg)7pHomkBuHMaKlP zl(~PsPtvEv*sISp-LkMR$FRTe$@zbx*)Ov&YKCEVH_546X1O2xOfDXL@*Ly%v(#51 zHI!O~as;%u*x9Ig)>h7CB?GqZCE5Ht12Jg&u1(I_U(@l{zt6BY_2ERtOwVaAD^N=2 za_6^MK|ggkl8b0vC{hfoXZ3+|Oy#esUQE*lYt(UI}M|^Dr^i%l-hQo~{Y#6rb1|3kRgyYm=Y*#1-V(H($xLqUJ(_a)b?(|o% z%BKl&A3doN*Ecx8URv^(v=9_Kkc=QO{<`f@TVDH?aY+ik{ecGZIQw*$y}pS2gJUw_ z9~H`}?+d25R`G1e%{cKygzgg#iseQGBJy6Pp02q*7Mpa#j(j5-seE_xS}kPbZ7?5c z-rc}7*EdR>u%fr}D)IBnPy57<-|%t^4q0y1=Xl~@f1c0CNB6ewIOhYx5X zuj$FrbGX!bQa{I5Qrg6g4}0<_nD%&lCjc-c;3cEW!hLm$DcpmQXJ|UMpDO@jdPynq z?ZYMGTgeB-q25Vs$GiUqS_d1L)DKf$K5{btRb9_Q-Wwq%nWdL@G6Ku&Ce<&3$8yJ> zlYEC~%$gJLR410Yrr?*~XWR6~i(Cs-LeYlhE=ri@--*59Sj>?Ah<A@}Rl>!NcDHMUMwbQE76|1xA)$JA;~t#V?{ z5@j@x9fl8Ia;<%ls?xrLUn>E-Q1OtzmnlUE{yRi|<({MQjmu)_+qXekYu(8IEI%%_ ze+QHed@t9q1#`Cw*YuXd7BQqpHroS53zpchwa}}1Q_LXz+LvFlYctS2$4fNRZzTmN z^#o9_p{|M*`N3wo%2E>a>pW&-y?hnJJ+?5hHTV198Ftq2EKNLrIysc1^{K|k%aFkTNYC;(+MWrp(rdDc%vMLeMA4Ij{qI+1gji2Qp)J@$iV>oY4ciOE{ zXuN3t34cI^=N4`x8&Mz5ij%Jm-2Rc=^Y^KRrK9}UHsJ(P$MWsh*_Yz_wx+5sdtywR zV(-Ztb|~FDj_N)h-z>kdhiXi6#2a6HTm|t?^Y3Hl1Eh&npV=`T&w z47nB32&r#~ye{!%bL12?qp!Zb$7s#QqSKy5c_ns<=5otwrh9g|D_Pfo`4X%53#6K$ zWQaF&f}CXzl}!>#3#zwHCvaDSLrz>`3|50o-AV?d?mM9d#vZS2AQ{_)la|o^>4pD< zwgP0}<~5Vsv5F?V5r>Z{SG!8AFTatuBlzCFGk1p1t&f*DtaQl{i!AND*M91AH!GqC zrUk108kp5ffoCiZP^^B;Bic~cOuyAEy1Ma$*rWH)k*S!|mYk}Qe!_chtiJ*Ur+w+# z%0J(3`tgol<51gI^G~f3oJUzaQwfIeZ(sF425tDSs<$M!GXuhUtOwR_cn!Sf#LcSg zOcGas$yRoUf`}&Ckd>ow<)MgpYbJ{5fe(9Cn80`Or$^sUxm>dR33LjEO zhZSCr7nZJQeC;;ivAbXXQsGn)iG1p_m%G|?es(DWKv=Toz&(R$Jt$WJWJiyW8GiiKYX2iz?0vmYuax><`b5$Qk3W zYUEfz-BfB06F1&upFnck@vMeK-G%yoa@!u#44AqYfYRu{tWuDBQO~3z2ce(J^YP-` z8aG)RpPbxa#YzPgJtaFIR64~N_&)$^i01jB38!4u}ATkU>t}1U@4}4dvM*a6V{)(tv9~>ar3kkKn zI}q8sRq&d&D(qC`yo$!#dxM(zxL|zcImD-jGcQOaw~)JkbrtHFS=p_#IWY0?AkY9A z_val8GXJ=|94}V*`p5l?Lxp1tx#Q-Od@Z>V#VIx#6<4Qe4x;~1g<;j^czVyA5o7zF zzLNIA&lC5{Q7QXrCt7{O4;>}Q17>uQZd$14!Qa9!NPa0+@abxwsSK+#E(9AHcC`-X z)&|fn`|z*6p*vBiovKX3{`z*Rth3_9@#>0Wcdhto;GWC|)r~jyPsgX_2Uwop%;?7)N;);yd#6P-?$xZx$uAa8S)YtwDN% zHqQ1eiuFSLhOw^)drNDO0UXvwlgyq%&hJpZAYH z-AV}&TVt9Vdj#Rqd*qzI?BgT?w*JEljho{4*e69v;L+6-f;V8#Og(nnt}o4gkVUoQ zZ@ilXIZKL{>%aZ%GdKKzwj2s5{oQX@B2~yTtneRz-Xz7B>BqIS zp^EZ|Z)1RAhj*#|sJ`T6AY|wEVU;X;Dw8ZVfMI+C!arzSexW%Xrj2?&Ewl^U8zE7- zzm?QufB5*6(?!uo1J24MH*JZ1ux;n{nM>sWloCs3o$ri@zvG!CxqsWU)RpIC!Qwh4 zu0sG7=O%haFb!#B{~Ak{94yf|9VV-;N%()^lJ6ke%)1MQ2^hg6$mafnHCUyT?i0!o% zuXOHD9E*JO_h#OZ*0C0`2@epEm!AU)TJK`+qg=eh9Vtz=CD!>zYWmUUxt_Pj-Co){ zMP%8~cZBv8*7k2_M@dv_qVu1X9%4Uc?tcr-^<{nNQ~wb|exq0>ut@Z9X?aCmLat5r zNV zSnqI<;dCv8jv{?S!Q}7OrAx8>Ul4&VxXs_o2oVL<59;|Irs#8F1F3p&UXr*(_|}9Y zHk*h>n)6)dfC2L^0mE=gOy5(($$zUN7<<^F%-LO23hc2vYAKx!QzA9eKmW(jdH+-W z$5FiTMF^D;LI_bv_O2wAy|XLXdtd9`N_Je5J#Lb9?Y&)_tZQHUUVFRuTK8V}y7%i( z`26&Kd|v0A=Mz_1bL^MLaYtsWV!_XeJAE?! zbtpixbZ5Y8T?;1iHA%JZQs9LBykK*?>{CdRil+mYfc9V>b^5Ib2)(vG#TktVNKj(3+I$}yJhSy z7kDNRIr!1^1>oQjpleD*M_c437(Z1}T)R*d@~SDZf1HAXVX!pSj#tlYTfWAnN^U*- z?EGC`oUEl~v5gyv$6p0VHNSjrlZjlJp+0e&-M84DF_qSC-!)Lf8`prUr)YwkTLd*# z!#KeipPl5+d}`EU{J(1hcgDoZ`9qurdzNL4`NTYV?(I%4SIQ$;s$XVt14hbZexR2f zfXZUeX*O;fCqBDl%a^$}*xpaHNVfOgT(vHHX{VU7!KLSIxe0SK- zW*QpRGy)G@9g8@47-xrEa+f-Bv7V{g>B-|2G}z zb@A_*ypZkuf_t{a`HcmpqWSIW)w3YZoCFk*EY?u4^=xY~zevIhS9W=j5JHlJqD=`= zNi|qpN$oKzOSL zhI5g?^Gc@{}81=vKLR_lO=x z={-)1MK1g(Lh1q9N^NQ7mbHkF)utY| zWY5ZLoo^i>8)c0t;UfX7GIhh(*~s#_&(=>5|FEC8rLS8hOfBXAs$iK2-GAsmQ5-+( z6)B{Wd{x(9*}*sgSn<7+g;eNA)ey59iDw8 zF7zwjp9o&$xMe~~>-;u0x(Mm{$Et{eL(DKKL7PX;)Ia!n-pWT8-NMU>1MayiAsXAw zw3eY0VjU<}-Z`tb2J3>x0nKmQa1Cs9LVXzu+Eko`GX@&{O_>HE_A@@_$(d({^nrEB zUW&+fTLh z?;w>nN=2N>`YOpa-UQDTwBWvra##tyx% z$~n$&v4J6`!U@yVu*RRV7Al8ZusaCBO&6Z*DX~EfWmeJG?P~G)#eWHk0~eLAGegU4 zFnd>l7swo~rElPPZ?lcQ3LaLSBB>2AZN}nug7t4BEn;MPX!^x7;ZM%!%4&9-Hbcyl zqv%o#uMGiJPa9vCC^Lk@qrZ?SakOvkW6oB*Yoi8)new<4K6PBX;9~K{Zv@Fjc{32H zY<0OVc>yrn3+HvSyN~|qL3w+h2x!yx-N*{!9Vn>1sq z(4+Zk-|h&HcU2?}2U}{NtBXV2>UaD+3;LW&UJDKfD$`C2w2O!CPk#Vdul0V6E2gL1 zaBz_g92<-g8I zJGd^nC%n|GvAkR->OYZiM&kfwJgu=Ro*yAj%`KcRY@KC-nnLZqa zwBIqc@^rPnC^EoqwW#c$an&%vwEcDpSMQeqvm%x?1*EgEZ7Q7wuWKnQ#dk&b?ay@I zu?WYJoi?WIY9JSn#f*8mbIgB1sZZpuEQDqso$fh27N>xS78M2#YYw*8-$6bB)wGQ5 zR;Q(cEkz%hrdhhvlM}T=#Bb!3hdsRetw#EAP470~rOZp7n>rAJV)1o*3QNFC=8kIk zS+f-QER(^jm@P<{r>+Fji^|b;bHsV#q;k0r9&;L(PuSc1_$$V&+MiY@`m1Gut+f** zc=|RfA&*CAcBt9F=e!QSpDL$p+}2334L5FUO2IEyEX^+62Hm>(OHAwp${m;_uv7qCq@-}qu zQgIZvN%{4&m4Umbl1kn+#(9&&?We8RH6H)cai;NhH0&th=|m)LmrAX*zE}EF^{d39 zzl?Qw4d38i_Mug|ePklax5j!b*Q*r?8z~+|Eo$()aWHT<@Uwy#D2>{{qi07?92mBB z@srqU>$pOa6@Fc+T+RQrGz*LvWRRlMIk|99xAV3uqQXmxVali?zJCC<@ypRP*WioxO$)TtR0?bgCTx2B<+4~=O2LNQ~mNl-*kC! z=7ux(y`$DF#RYr|lp=c`)JiiQD|$8!(!Re5D=>Or`dA;(@R?^Zxz{u(Sr z_A{W_Q;9V=5?+zNT_$oswjFJQWEG1F^6>JAo6@vB$b5`gF$ z=#q>bToEcvu}E(E;?Ed(M2)P7@pdi5zSqa@KBsDUX-Nxn`6D91*B{2Py_V0 zf1^5~Qzzs#BB(o`bXoBKAzRNvepCa>v$E+zE~~6eiSonUShWMgfiVTU3PAUto$$`d zgN=dUVdMo`&?sKckbLm_(4d{N8nt+0>MHG(94I4tXG&|;dAm_tJ<%hz+pHO19&HS4 z>mpg`ZMRp!S@r8)g1P7v{CcwB7{3hb3_2!DE`6@P)RIaoNWEGGsLP=dGPaZli^^m( zY;C54LvhV&OqHGDWQ?;gcE`rE(q5Bf7ZQ=9Us0{7y-|rh@VjufAH8G-O(aRxFqx!0 znWfMHK=J^iCIo! zRj^+VF%Qq73t>fw%nP%;ab^tM9GY=Wj<6yBuzuTS>|bC?$p~?AN+F%pY4`!f*Qph*)zXqh#x!E)~b;Avf_@vydHepd%)*Bg@avD|B$;anFF4B#T@$dV%%z z4K|2Ou!RK+&yNCHW^Ot?00N$*mHVK2M-o-+3@H#B)Y`05Ws=49mEg5wf^l4{XW;AS z@&L-5jelH(ke`+2Fg26?w*{(BVh5OZgBpU4qusgUFI7`*r9Oh>(Z%EhX=L_Eo!PDi zzCF6WsSk8|1N+^NS}W37>4(oO7}MXs_-OiGH#%0^bI_)vzwpHCUd!D0oFJQj%W1W4 z-F#OjK$Mc42XYJC*m(JmK!k~ z;L1~RltrkMJPa$lw>M#hca5GCz8s10?sEO4%DUIGTv$E3W4c`VMW4Yc zqxf{nVlIWiM>$kANWpubGDixoGHIh9O4C_tr9_n|`x8B)Z=QDMZ28wZ3Ip^RfTx0l zwQG2jc-Bo)lJC;B3hqn#|EtXfunzKdygJ>y->vpzm+P@H5;=pK`_6RM?HSx-C8&cr z!yf8&%c>et}Vb`u|yFE-$%=%Lh`=%XNTt zy;Z0tCfXlA|7k58+hTFt9TbM$S4qlc!F>12CY_Iz(l5NRj^LxbrF9Y|6)DO{CWJU$ z=tE{6K!&fsmCju%Yals0d*;;}7j}$?7EYeX%5BfOPZLp_@qV|LXwdTk-n$aV8PkKg zvX4}&Lt+jmmcPFJm>gbsaA~R%4r^{@pJ|!Z-r;>4`l2-r&{uFdGicGF_8lbwgOv(m zP<<<$J3;)DrIEU(SV4PqVU!8V;qlSj)RmT9)9F8FeLNs-#DQ$ShGLSlW;+1;{$*%7 zqRs8?>1%Now2(0?G48#s$ahLBjo3*)h*eeFm}VEPnqm~s(L+ov9qbdg5&jP9zCMva zaa{e^oyW~Z<l79admnyqfXzFdh6%&#HJogi)a(+Zf$|$A8{(~=g6vstsofM zoX+pJE9Sn|g5~MrZp6C(j?}^YNSe$KJ5`Fwyg;paB}*Wq>tmcb&sriw&O_(tlq7x& zF=K0**0BP^fkHaj1+ZtS%=2OQQ(fOoKdlj4%e!kQ+L;p}cUmPcy8^Z0uM*#CjZ%34 zZfoexBTp$R39BCntDXiFa_f=1WWWkqg5rm_r+QU-@>*rMzS)Q>T&1j=ukphoZd1hK z-%LN>g?pe7AIb?D)W4i%K^~sFO2E3$Z(^2X(?ZX`nbRQwQjZFtNn?naN)B+ZjdQh9q3PsM?tuw>xgI|I;7Jt`gE+rZS5rojYap*DXFO++Euu%BY_Ldr+VP zcZu@o^$p0=itAS!USpJMpjK>^NfY^1HYa<|4#sAy+d&;Alh5&v`3cpPk=LTNHm<^7 z64%b}%Zs1Pp58vixySue1GODB`!Wn4Hb4CPalrOwJ@7lIpHk(lv@sa(xhLx*hSBBS zcurmmZmC0*dO+;PL-7%^-6e6+D?5JniRJ}r=pwV_lsjn0Pob3Z zRgq|-Xw;EKB-%DV4IIJG=CRsm6S)gbym=@b=^y$NcQ=0sV0cq?`#Z87Hr#fpDN%=X zP^vSfsDJg`8kU+tzjT_CLZj4BJ-v)(3ei9f`+|(Tt46=gW3CMli1GUQ%pQIDLA8ln zaeIZ^_XF#FUcJ$Ka`0qbFPiOdAiTFW8duoRBE?J)goGR4ZEcp~*CbSSf3y9^1Aqj? zSo9Wt@sJ-->mU?dZwrb$YG2v8w7nFMbqfoHkdE|YfxjWglcMJepU#-+oSvL#dT5T{ z1xyJ7BG|~)`|zSW7({&d#8mK2!m(g#y*{wCKWmx+=m$3m+=TrAnCB3 zQZRVi_9S25#qV&9mL_mY43ra}@*oHP0-kc@#U%g}Q5Mk@N-MNAc@->-8{&hUWujxn z=X}##Cdn#RuT`b*n=DbI+nqQN_c5@;j0BDqSv2kq0)qZhDDH5}XXQ428+W@#Wu`)Q z8}uo(rQAzZVyNKqgj-T5A=(cwX%;r4cTjWVvr@_sMWG*R%3K8KwQC3 z?9=FNxCynK1@W8BLQ1;N+`h;VfJZR|`aI;|SW4U9Cnu1-WqHu)XjH4Nmx+3+w&bpl z^WsxzYT~gflKR(ornY*;%fSV>Fz|^tM~;D{wsuG4KTMp|(M6y40IfJ6OE!B}jri}c z^9m>l($R1at|_D@GH@)^n+JW%?cs=5AxOk|sSj!vet9Pln-k3to6OeH+V?Z*ea=)8-f11Gu*!#_Q4nWxr7F*(nVW*jj|2w6z zd^^pJ4~h-Q3%ai22;3{8(q&q|xyyMHfJRpq+!D8U)!C&c^uHYF2A&Yrr88S=8(cvK z?2GVAJS1C)C%(8+rH~xe{GxYtyZ5Ei(>;30Nh50RWRtG^r>7iXI>#Gw*3PT|s^yK$ z#HoeNMVjY3K6qR@PSWTurD*CwZo{Kgvqx5`10Fex?-0a@g$jD7C83^iCEB{atKJVN zOasT9ZP`;>sKaRZvneWWDNpbBZNn2@vvDMDe&GHR#Dd}3kQV~JtB@K zmv0;;O%89lM}D#91yTjb^^PS=%Nwd;lG;U;tGg!)zl1q$?+})~xSnl2=`@Scb3c7u zlJTi9net7y`#M-HWovSD%8K<^ID1B1yGW+BeqR939rzg+^kRB7)L;0B+c&^o?i}iL zM)hOwo|oLlPYnS_+&DMj34*wkH9xE*2x2ziJaPKUrosPh4ZVyduU!&7d6#Yc#m2Fj_|38x8ockJY){g9i{aR(s?093f>8%u3% zlre29u6Cu1utU2-F=m#Jt@#Qr?oBk31Y!Qd9VDc}DvR(J>Q)X@hCznlUw_c!#Eus) zvO9q)*(fOs{~h$ux^7S6GS$R%f_DSN$At~M@@BeGPnzNsS&)VtdHuOW@N@|MR^N8eh95oHi4P!ePx$U0An#8Ht~J;!82$7jP+!)H zvL3ZRDleFIJ1C|-K(&X8d(MA4a|>{ZmDi~JYdSq(t6@xEOiwnu6t${^rH0(Cc9dwG z+m>Y0xe5yvH*Q;zu(~n&5j+QyH)O2=;?yF6vczFM_n(Ad_{d*#iT1~ZFPpVhB_ls? zgX~-3i%_YXKr2D@i$|)z8`NyR;*h5A9HkK&kol<;Z=3Qnr)O);=z%F)(qe#+q3Q!w z9L$V^2CSUs`N-*vfizKo97c+!E=(0u?!oClggmo z`N$RQ(1Ft+AB@uNx=Ky{A)pF~Jy+GnxrnWa-voi)C=pu{j4!Gd#u|-6V{b6F?;Dv8 zwvEw~BXe3J^PF#38@FrSr|*_jx_ux)Bxcu@cr?p5gonh+)hIy>OAK5L z391tS;Ex(xBC>@us^8w~Pz!d>D2W{`x#0!V1GYRH>#rN!;cz7F7?*I|TW(BJ`Vm4r zvKgRO(US;x6E-o@bf32IyF7gM4{rE8zVz?zR5)@fW>7n;)j&!uE^#RGVL;n3@Y}(s zUGR;1((csIy4P8SviT4mCZCY6jk%8a`8Q%*CwpJZ>OY%ztQee)M)^hPcTzLA(BU(c zt;4_6lJQ&C+S^p+Yccp*n#GF?k$dLdrQiqPP8;(LAIBU*=z|O~n7q(#ineN!hs>8f zX6IU=l?mK{(G?sTUfkV2B~mVD3rV*ZYMYH+NGAEq11v?N2XAudOvzFH+@L zO8S&`)urx%M4t&4*w1d^v*r|@-xs^=zL9^l%$$CSN2x9}+c|R)o>vI#CwK5zKguZM z34}C@mwxTJ2!j9Fz208O`+g49D;aSMHbTCtd7sbDNVLyvE^Es`usCEGt*NkJzj_pF zBG55O$z~|3nrnErJqE#h^r|8lD{qVa_qU~T4$*vHhITvp?PHZ!=85x5a(>!yY74pwo57*UY`pESUmi4<%1 ztUrO0`A$qByRN_h$Pdui@?gWk(H~?v|HNqlL8>I=C5#uAEPG*o6HVB8rMD3E*eQ8& zUW34bI)u%xRWKWz@*fZTm}M+5FV}Lb{>dg@KbXIkLliXkWz7Nj2EHd22S8uM0G~EK zuWoLD&h;s{uf+U>By)gC^}RKkIs}mw%<#c zgEKF;T(<WFi6FG?8A6WkAj<>jc9a1-OFlrqPB^*c*0}xrf(pM{>W|juSH9_cN%E{0 zUoSS;xu-9WL+dTpej(rxr*OkP6puw;kQn{rgMt`ybWb3&U%sBjoR*-pc{WOcsVJwx53{5XmWqKz;J_=R1s<0;e8KO6O-L% zVcGn``Xf-&%JnQ3+w+S_MSuOZrOZC`gFvPrTspA8kX`@Sy53lMnCQHY&4xThxBchG z7z}Hd$@O1s*lwxKI%#1Unvq!N{I@q&vYw4_p8usz3j0a)kTFV97pZQF?Q8V9N?zMK@$9Ec0-N7Xq;ZS3T&zBqO@+`G+v=U7d>1%u)Z@bL+X3kYJCl?bQ!QyhMMwDCQe~H}m|$FY@EO7)(}UhzOgsT#mtl6v2e11geLt90j9B9hNZs_~6Wn zf2K|p*4Ayf4^ok3TDNCwVp471V|k4Z!>Icb*R%>X9bLR$Oe{U( zrwj^&IzPW4!QXQIXPUCau=BXa=Hvrd@FyhXipKU(V~gxlF|UcFdOB!1C~8R`KVk?o zJE7TobY%Km^-n6j7cAn7CVi_u1HXG6khdsub}1qJqxM5F71w))Y<(Vt?}iYs3xmC) zOLy($VKk?r@FJX3=6z z{K2mUjOl9Vfs}uT&jkJcdE%CqV`d(r(c=YE#nB(cbk5&)^AF1oxFYcb29(Q4Wevuz zf%~T_FlZEty%lrWhn4=aH?5-OD7Vp}Epc^cJ_3pOj%=P}jQdS?b}v6nmDn1WH=@qE ze;j0l9s`mbGG*8m-x7?xi|+2FULqK$UBc290Y?=tb(X$sOv$-SvL3066MB3wL;aBB zom+(Ma(Df@YfQ1Je$X3%!;AVDb%6aJ6KZ%w1@gwXB|L($L=e*&|7GE`B%EzkgpLtG zV`Og_u!(b4*=Q@2th-LKKGk|hU(}F&dt4BJ@(}Npx+l-}9VRM`er!sO#8R$*m<~W4 zX1p=tLG`myqKg&Id{MbpT54N}!n>zw$4tu2AKHhCG6c38&Y1e!t7_OCtj@0j{rvvu zTHI98W+>jVn2>vO#5RjQ3w!G(E0>XIAmI9WNmb11Ko|B>L&P7G(aEv<#R9mlMV-Sz$`>R`ts|W`8 z(s7^g|64E=1V75kd)*TTcw|c4G40MA6E8a3nFF4Fv6)fHDGRGbB6G^zhJBp2zMF@M zLgE;Ut`NFYD`@Iin{aSW1aA$T?OZWRwUjVl#@3mnGCg3r`~cLIO8JWO_nY@i1F9Ow zl{{!|Uq7#X_7CThT(f=epoL63XuGV2%qm`+vO4}L64QR9ts@+5)rRwUKZ#k(V7NB_ z-zEFYp}yTtdBnX}YBUQWD{DxjkcJE<1w|>TJWd|tz?;V&n%s8w4JkJyT$%=sa!P3w`^exRQ@W5CCovmzOx6H_w0RKMl?h~0U*!L4LcxJfgEwET%wsXh%eEE<* zt!LHA$HF5Y%24Q^d5zFcCs@4SH&7xN=yrA+c3{XDQer0zh$83&R;oYG%L)7mcujJ} zr5pE-5dK^yUNY{Z@<)T<9FS9ro==Os?tHEsY0pv|Hh6h1Au}5X_ff<$ral~X@vQ08 zy=L<8uij-|Z)%RWV)%DmQ^p4>No}?M=J^IHmgmfWSIJwxM!F2KVz#H-V)UQNspi_v z&=*QOG`iN`d4^p$5U*zxYhOR-xupxt-XDi=+ahCWrz0HTp(sO#8qm&@lKL9%J`rDVN8!0dsKwJ7yg zgonS#E2Yt9)@g}-vUgyncQGP+b?O*1PHXz|JUsBGmE-t^pi)4&290*kG&~oHz1|=F zYgq_+XtW5Wj$o4=nz*-qE{WYx#q0#mTcI3~i&5pzbhh|DN)OXizz3!S@q7C_>>Ok8 zR?{6s*lz+cS6y~MNX&H9*wFLC+>n@+Bnam2Jnjc@TGp*O6}X5@875GWPp4E1u1f#? z*K@Hu5G)(G^43QO^#bgiAins(W}d2@J5b`cWgfapW$ANk)#S5FU3uw|eWrUll7Z>{ z^nWdK{twGQiF=YYhVxQ$+x>Z)J#96}`BP?c@Ooxi*R0>6QAtqzrb?tP_%~8Idu`BV zR3KE@B6b{EMCZ@&p_LnKzvs~h=SIyuT*n5r|COm6y|blu4nF&rSu-7jy@P3|-rlGs zSX^nun$pLL*rvj4zWvJdAF{1+Ly8CxWGEKD+fCmHSVI9sC3!=>Hu2bAp$h|2q0 zdV)MQGH^+#Sd0Aa{~!|3eg9%?F{J;7cwBmDLH9ZPV$iWr=DR--kp)qO$ZYl9g6a7X zP&`&)JGCK2Q@Rp8dW_<_EDl0z$%491W(9t)^o%r=rh8|EY}p%#S1$WeDaH6G>+-ai zpIo5<(d}M4wlL!_}JoG}%9wyAE z;b?a^MTYUlD;gKWDy4CG&W>lP&bKCIQ6N;c+T8ZX6Wfo{LgmU>+X(X&7@=ciV>a}j zVp%*4Xq--p^D-A_a2Am}aTd{_^^`nri*oKL41#5jjS6qJ^#6ThmJH3vEo=f!k7#KN zwGR)j&Cp^t_dB9uR*^LKF?N0Q_py#-*Zo!RcjC+y8Z>t}z?L%0I=f7slZL{Y3r!%D zamCR%EPE)Ir?XHz{;$zsD@*({s(J)Nn3+ z<&jYF18qm1z*0g)JJY$F=~8|_JHl`n`d=$R+XpX6Dk+yN7aAtBwOD0DF1|z!%B>D; zh5HzP3)TQ8ms!tR_42Vh|MOY1TT{^CZaDw=oJ;T>JOxwyMIK%NEKj+^bRKeVTy`6` zm&?c^BiA&3PKvQ-8p$R`OlKVSlNrs#bPUc zmfq!23bhO~nA_rT+^+_1ko23IH~#+V=RNjw*%uXMBe)RV_rK^X=6|4NC6V1_K98eY zO=L%>ubwMkj?9?fqvxCblcUpdlqW&Gq-Cs+9<1RRTK5(w;PA29fk^*pbHbEvM*}SL zy%a04#q&{_#AX1ahdE0l(C(Av9A?J~VFguW4SByZxz-b>0pV>AkRawXN<|VvaK?JZ z+cqg70G1|S>Z;!gr*C+`KomovE`1~3+f*~-Fndez*Ck^mT4NcB&}38Qj-7a}vgXJvaZ+-g z%{^ROzvRiSw(_HbU&xPScZdOVpRm$G!Li*i(f)<@Lm2G=)`bcIa&s^Q_U)X1dIS1o zddw5;^!R)mqe!?$ID*QvL$BC~0K0i*$)#E?)S1V;uvn)u`CvLLrML^mjKq9N{Krze z^35<#Q4zw4n3pHExpI?PmXdaBQj3Jf2d7u_M<(hzxTMY5tktT~V+$2c-JE~GYUkeE zzXmz_?tP+k+}^HQ4sWFFibckEM6x9~dzU)-v*mKn=XO}|L0hPEe<)K&zAzpcZ-VE?;XsoG z_XuV%A@8ZLdk!nwYtdWaTU)Vd$KHs}$S8i!G82X##+laS;=CWYpF{cgJspr$T7K*8 zUOm5de)x2-PFwogFC^*RX^Fk>_jpjD-z=(Ovz2M}wZl0G7i|H%O)*Ixo^b;Vo_?Zj zQ?_wFw~4pUM6)t=Hf=jBaF0DXysXVZ-KTtnsC{n(t1$~&ZC6xyhEIxa0k(E)Tfh@Li;<1)c3hXE+0;eZe3k z#sGYh8_-e62Y>B1o+TTqoDb>&VLQuB9FFT=YSwWas=KI(I>leexE_9ZyD zX0Ge8)xgzdQ^h2ZW@hN+Jx0~*GEJrG{^Jf{R}}G=&KD5mIhXp4{udUHc>72k7a)?EYgY?z z->b_^FxePA3c_HGQBlD0BUyE#|dYyswNfD<+9zLGt9!koc8 z;CpHz&qp6ug!|nJDRQiF@x6WQ9-(>Js~*gK64=?4A}(hH0T@;IS*D(+`xHsmc4b}1 zK-AT-LpEgkZSj+K0kE-!HpwNUcm|WPzW&|hi;cE8-k3I6jvS>CK1^Lq&IN&>V}s`w(W!~dFGl`L^=}xMklAc0c76|jfMiSHGi)?;qsvx-f=enSV#^W_j+H3#=lNQ*zClj4EL zw;{?`4|2>L)bY$T2wslufk;!eX4sMs@h|oAP*z;faHF3gqd;*D@lOr9mbjw(7fYao zhHq@i=C5lL0^Q>uo-zhG$F#*i5Yq{nFM$9KecG%zrusubX$hfe@`W8`KD9y~L3LbN zoY&=-|2q_QP2gwpuWI+!GQHf^J#pva8_jvYhEPOpj-IQCc5^Sg9Uuhuo2VNBU%jZ4 zhA(>L>^$bCsX{miafYdmNX+|`=BMt{L#1)&yV)Ovf=FOMQ>M}Z?P_?S?6yuH0>ZgePp*Z9jG6-qp~ zGl%>z9F$n${}85aOH;yx0TXo?XotRXvtDqFZDHc87L_<)k58e7v_7M1ObzEXN8WZf>GX*tI#pTu?;4Vw1S)1ExO6`FlIx)c?-X4 z=wq)B78if*Z>cIF=T4OUgRsOX|3q~Bmtd=>UYHlJTsrggVLelKK%?fXCQD~M;Mlju z)HY1qD}fra(kMT4wjs40b>%F8;hzz5Il{?@cz1< ziEa&3kY!6pEHv-_?!Qp9^zkEVu;S_Kl+oKv-Emz(cPNm3-J+bit-T)>h$>2CLS6o_ z->Bgw_8@0Zvwu34m}*L2avNZJfc|dc0}(}(-^FbNiWSw(F8C}g1}&0Q@NW!ko>6j3 zs--ghq%*c>keEsSb!>&i=peU=vhH$qzMB#IKt5&jJ4d4GJkR?n_&}A00o4lUV}!YM z4Bj7DZ^iS4#^?2?yhYg$e56F|A+j%ZhtfHuANPCzNYaZlYaYh;w*pmTcXn%UO!rTf z1=?F#G7=vfG7-KA?ZMwJQ8SDJp}SXh!)$H4u3o%>#kn0Qyzj_z**6vRZq@4~f~-<0 zY@ET-TRO+i0zmR2E%^OU=P{EoiSv!)?U*@_gBsV3F`23=&A4I0ioCU-fVFlnt<8Tz zgR<3*F;$RnWPR!;Y5q}NiT$4$2JjEQgqIOh3WPYA0>8E&-iYH?Bipi+x&Pn_}H z$8C+?ZgZIN8!l=4#lsfe5#DiHA?XWlv_4iydm9`Lxi;8gJ=%IW)x4Fs)fe@f8tRFF z!p<{cl=F2O+48CS-2?*n&dAN|%Sn6Ojh(v$t!`63bL*Q;R>yl!5j;)%2w=`64)-KZ z1L-gb_(e~dyPUP$3Y^U>zE2oNL$$-48Nfu6ONsd%9x`DpH*XVN5O=*fTYFKaFIK6f zPJ4U!{qeHko`86hB%jD*+z1s8*~?QnT(`U8x`TZ!#kx_v@9Wvg!of>!?BofMyt*C zFl7D-mDjShU};||8u#jT6!exqu_|0Twl_zwF@aA;rj3tktHLgh(qR=1xLy7I5rSDnpOzr{Af;rX z)MZl9UDS4&Dt`V%LC&KLJ#cqa0E=h7){PKp@6gVCNR#zNqE=JURX9k` zV+z7M0+yTwEfrV5r?E7j&RZY^J*Py2VrWsSl()hX=WQmf~kd zdIG{*b=7;~tIm6YDhJQDZ0ws(z;lJEt&*yHrOR^#Gd;*W$!fo(K;RT#c@VzyR9xxZ z7h4F=yW%@*q+06zOTFv%j!`InlP!!H`Z9QVp3!cNBF&2vf2OngOBWHhC?jONG_dCW z{%_2AyT1{OSp%q0S5H7%DO-xyeZ~Aw>0X{)4=T2h%TOAC3)b@ z^}4rlBvd8qoeFU3TSuu=_L`T_2p;a>A*jTZ#WZ8oFH>8j*6!OGufkX6xJn{|S2lT| zW^oToMdI^$We$H@@m1R}LrX~n$V1{~5?fID`){CEUham&l?t{_L?=ucJ@3mTe=52= z&I)k*r^v{nHVR_#cW%aBUp4kRS?^4{#x=f_aR1^3IT#I3u>X^KtS;&talbGmvn*`g ztb3tZDvUUI+eY!5tuc2voEK)O+#!Bahilgj#vZ$SG@d+srVNu1(R#gxGQGq>)H~f~ z=z=d(EENzbjaRsn?l_HpP6fVFWjnGfdK?l8pfAbzI%K6_W^~PZx>@Z#niE8%Sp(h- zHN`lU&lR4-i#82)RPX6qiE#-)MzwE8BD!Q9L9M^lmB%QV^|eR03UzW$cO6a?H!jj* zR+xmqeN#Dr>a(~gYE#L;MhzY>WY?}(a=$ok7~|~hmc-Lv_v7q5I}57bD!lwSEG^RN zN6gNDAwDQ&u*$}{1k6exy8EDh%TfL`9|asr+{FF(wcHDO4Cb?mKwFk2l^lT6(NEQ& z8WhOpR*}+0PGEP*%q)RZAbXG~rWBz4yc`HyRbK!Wi(M8GLCF?hhRp4gje7zXK&{1xkR5Cl^# zCLmjH%PUYbDxKzA*>JWB)wjhi#Rc(0-zxpNv8Ti)jm-Sdk5)BPs-r}y6tvd%7usnE zw$yf#P^uXUmYI&&B8~CpUi_#b2*WbQKpkGO%bWUPvEPj%h}979ox2EGG8?O2K6ii3 zi8Hg$sAfFycS!3;qq@#DO(czPyxfd;vAV+!!uN^X7g)LT2Sh_DjE_`&M1k|372WeU z`~Bv9^v_M=VB<_!UT>R>v;e4evabY!fsZMqp8f2%Y0a8o-RC>AGG}^^>s)wi^?{Td zc)9TKJWZ-x{*+bX(c<^5Rpyv6t02AB8C2U6=&3yT!&5%wfCx$O*^Qc~2 zBc&Gmpq@O*bF#29Y;n;H8# zRb#TF;xzT=Zs$dq$*a>356&7T%QTNySWL5m20}ehhLKHZk`s7;djp~EWv9pJA85=$ zTGY*vkKWR{(y#GFQ_il>|7W&@A&}JyCBEecQ z?U~3>_wZ9?vJ5&i&AYR0nYqmQ8abroZ+$|8xKrYc?IHyU^J2-f44#B4%ywfL<`i7d zIHl2CX+9hQ=5;iR?`H&yCh@21sndIovkEnM1jD3d}3UwcwP zvH8Z?a<{s+*5 zJ6!u1_lw5zB!|*4U6xlpaq)x`l@QR#x8Kd*x^sA0sUWgM)~{?PuK(qn-o4=NP(*hG zfGB+xe^4_qLW#KdKIKqD#m@AX>kE1R1Aah(ztDF!xk@YMvk)FQ2Yaht-=-&s%~MG> zpCaz8T%OVj7u?OZ05?I6bL+W`Bs8PAve}UmNO{8$a2< zET(Q;zwU_WMe`kec3309hj-cqG$~;Ag$$^N`FrlEOkHH&HD3y=J>~nmqk7HgcS=;f z&A!fC;%deGPy8Iw4B|(vRT(;mpY(}lD~w-!eZ!(>SZD9zKGg%)50NX+Gw)3|waJOS zgtie&lI9%VkcLv$C2zh+UjBP&n}$;#_`X-`sxYrHKAprLu1^Z9EAhPM-GCZ5Hs{*g z)sppuS10re@zlA~p@Pg~>)lNK3ODO9FI(ln(~oP~G>LU?TJO^zHH(tq@xr}9ZT|oFXK8gef4>_VQW5g>Dd6}t`nTTi*BSh$!x5WSVIODU z1Es)|zBT-+X3m+e6;&_%dPk3t_Ej|dPCNA2TkwW`K`n)Mz1T6KUc|2*)ic$*t@-;F z`8w+?0eCh?PNm^_vv|&e>%=YaZ1XOc79yAPOVYYQ9?)$?L}QTuyJsz$L%*d_tIon> zZ?W!4=KKq1R6m0E%m2-g^8@U3OXmOgcq-?}Rq-0M?+$CO*_YLw&V-;HU7`TaQoFDH&(Y2p*mtYUTIDoC8#==SId?6dX= zi~jXXz4k{{4gDTIlcQqXznCC43t4S!AJy!J@b|@G?E{Y;FC}!AaZYt6e?wlQGkyAn z`i#zD&4wSnG(1~f%x+4|l1L7tSJGy6e=-8zgM{w4p)lh?f07*-1WyfQnf zYxFBRI;xL|*S7rVtGd|_IikBWh&wfNv<;yeH{#Z^psnFq2f>C4&CB@ z^Db_F<~9BAn0}|c`khmcpug^i!EWNuZ<8E?GN@10T-`JH(fcPX1q9`i=F4O%O&NcArQ4!G*h?w62={70(Bi11~SO zFC+`sA0>}$VfJr!S~Lwg?g+x4Sx@Q4Sy}>qT>3krd#r2V4?bDx|H|)P%?EEvjwIf_ zWd074A)rK~=8(Uj_bDHE)U&U7zt*Y@+Dm7KbP!y)|3gX(i5qh#`8DQovyUcuEBamX zcb1l8pQGQ3D~#XnADL1n_w@{?RRKI&0#EOUK7M)8t{M%D9|n{pe%x_K)e`$Z0Qr2A z=N^8PeBInPCnYa_yy`E%4!ueoS?!dM_8OiHRR))uKz4li+hGfN!EEz8YliAz2l-!c zC_ul}|2ee{f0)zCtxwE;0gw9h8TkGBV4HSgr+3P@bl03411~s)-Zs^9%MM=Vzn#!J z^FC!4r_yE|zk_So|Fx*{Qja!psS$DF>@Qg=&>H?a*R88OzjO*aebRg<7t)H6<~uoy z+{ERk12feh-knu7s3*CGMx?JC9fm(DX!^j7-}d2puDqgCtR zWqsiN4e+OrO2w2U?;qa8s)f}5^e0u-oGS}|t;qd*7FtvtJbv!=Ozo^>_T3K4gM5xY zo7O3F-p~fCs?l#|w;T-vzZ=(qA7dAZ?{n0PIDQEJw19lc$Ma`_OCwW3P3FEbbt1B( z=Nk2_`WU^qx@YMVp8rjUv}!Y6U_(G>$gfHuzX1JeK55e{$g}!yerl`&=+ybj3dKPYbw}D4VaA06P zry8fs`87^8HTx~@PwHv>U|2qn{$w2%cex->gQ%Wk+~8ENo~P8K4lThiI#0<~F7}_dT!vnxy~vYJ%>&1Z zjLX(6aPLfwTy1P+_6>6?pE+NvkXzT`&>sf8>P-J1k9hSeJljltO+@s#~d+)iVeBgP#??TGUx;M?U>kxiALOhB(RF(XA-(zWggC8CP^E$)dyM5u%eD2$y$DuUxy*)CZCFo^%EvwED zf48OMD(*75luZK}@3Afx4W=xSbm(Dw?BtS5?=bEg7qDB#Dc;bn;^@EK>aZq)NA+fh z|G&5G3i7?7+~+--r8mtuJws}mg}pqNq0uQLKdU~qoBg@Wp^C`ueoE7k@3jY+nwT0CLc-0eo=yDz|%=24pk7%9Y z+n2KSKF|4UXr`7-B`*9MRtSF>Q!J=O2a=a?PFI-cv72pgW5_S&~He#7IVF5fedwmk8J~T(;tbs)9=!aVSEKQh;E){E!A`4J zjHotxez~|!TbN(XuG!i_nKLP+-;m$Q(plO`{bBbU-Gg_$@LxzN_{sa$pw=V*+YNK| z3Vic!n=BomU-xlgS@E-_{cIxTRh|b{l?Gqt{gF_9^Y{E6aFHDI{bov!vyS|~`*fQ7 zj#Z2+$K;U@ygE!C)@GJPXK3Gh51(NEo~AzCLq7HQhV&Edp_W!vXWXqLty;!>ye|j! z3GF*4_;rqQ-!=3``Qg`Ly$OGLdRd0@QGX+^OH<(;UzAO2J^8+Ku3ulXu7(XlYR5V@ z^>u42@&C|pr?!ya41LtE)@J{2M?hV`lg$H?y23cEFUNJ&;E4Ga4W9kic9%vG2Uflu z(JXMiUbV39b8XICpWcBQ6snY=>>=j-G`k)m|7$H`x@O{J{gl2n-{X{tt2sE3egk@n z-&_p2^at0|$1)YbzAscy=>oV{B%Q0X_{Bfu4GoY>h0iTo|E}S;4vi;nepx@E7U0B! zu6F%t&6pjQo;=YVbzl|%0j3pq8@ zocsAzhVC%VlGd3ThF$-@I;MO0#ao@z`iJ&Gc9(4Etza;uDh18HOewjk*BF&ntgG4Q zI;r-^aqM$3Wzs(Kl3h{Cm%xkXOuj$NrWp0FM#MB7`HWd^(MIrLi_fhBw4c8p(l;Z` zxewSk_%xVg>J$92!@mw)Wxi7@`Sjyt^PaauPtm_>D6Bg0yvPcdwllx{^K-NZyD1op z=@Nc-d<*;>|7tfZOApY01pfCl_br;7(#S>NbDp5~kk|ZL&8u(C{vIXcY6i~>SB>cz zvtMP8s46@y&4&zB1YdiO^=hEUoUa+yC2;JEp-z>fU->Qp9p<^cp7SdXzgxR9sR}vf zTubwSG}rYds%@9UY|0}mV*()yG+X9C}Wj}^#>{~*92|kr2PiV>Y(p_zu1-`E> z=+bTC-%}gN6In;CPczhp>m^G?H3U03aoMHz)Xz-G(#;Q%^L?lOVcdpr$g z%ft6ZhDvq7Hug5in=a+Apt@>sUkeYTK2M=eDcd9Hr z`StHDI)J_H7@MKX`03Jn5dqP9|GT*S=x2V7q-tTG+cpH%6`Q!7$D@<@=eBl9Jw%@` zw~J~%^Bz#ap&))ZdQVdCaDUa{Rv;_Y=dN)c8BiN>@A5^p3;C|P<N4E$)GT?;->tW&mBNpX=FQOn^f;|9&!d0P zovC{GTd|>5^}Y&yce=C@)m%!r&R=>K#2dpKM$`3DX z@mvTQ@!VBjO(#B{n(5begA?CnYaMpgbO3hAe6KH!Xb0_^$@6P~|C9S+*H1_XN4Zs> zbyeRB&J$l=s~=TYq+ME%b!WTXZG!f#~m{JTwe<5TXX)#6t`-l=S{J+ zY~;ChTRXHJ9G+;gs7TTrAO^;n{TzRB>KON}ZD!F!?CyL+cqH>XUO%qi%=efF{n~>a z_|^n8fH?Y<)vKj7%y(S5>I+_vsUNmV{mBv@UQ|=vu`OJB4p0HPwNchd@(zuJm__1!5rPh z-Yea3!m*jZoBYr4@U5BJ1>UXv6dy+J&wm%t&)hfYTZ?julesJW`X$GlW0a$dl=n7d z>JItDxxF4WU_JQ--g961n?e0y_9?5!`oW9+JtF##yv)_YE>xx#L*06lys!2?zovkv zD^G;9fOQp~5!WpC0!_2WMD!2!sf+C@v;_N|>ChZ-ZAQhI z#-R6o@YM4`bN-1<59rtIL{#O#!RGd)GLYXZ-h{3$CLSC}tK2a1q_tixGCT|t=HmMF zy5#!ApKIoQ5A4JHdP+XpLw}|84F1w{pG&*VzG6*cieT5z-3=+t^(X(#(Nn~o^UDIt zr9Km-wE)jgznoM>)^)L)Qzy`Ch4mS#0q-fcE};(iQ}xXubtE3wt>DoeaH)qmgKdcU zZaznC`kC)k-5SIE?zns^2=6b)GjH(kt>Hf9QQm(HQVRvN%Ft@VXuCJX9k=hl{Mds zlP`pxGkn3K6#h1}h+BU6@yqCE)QjX@$8&@lm5e)-!TLIOkLVh5tKG}0lf>H##lTJE z)^J!@RT%F?p{T08jeeXNs!F~5oeX{dJpS>rMRlluSRke^kfVKFTE)TBUiiQH3_kOd zpo-%^e}hw`o#SJ zOoy6q--J^Z)ii&9E#_Bq>d{s+XK&Ksy=qo>`R|o znf2_nYxQg3{&u(KFrWRgsM^qeVP1wFNB^JiaOwr>74ik;2X{(e^l3SEdo=FRAo%N? zm0{I_w~wjlQ9Jq_J{496%IkfjddbM8v`232zHd9Hx>7%~C#aVx_02qgv?yMNdFIX>V_JYvxe8Q(UDAzZ(sz3|!;dL<$rQUXPK*P+uFFN%IxyH!i;4%5uuZP1L zPW$oM5$y#R?@zSp&GP1ZzNp?RZ}w-(&=Ka}$OBJCzQqnZ^*MH7c{)=gxn65^LIviT z-y(u~hx%7v#54e$%u7-^n)>H&C3Ux*Ip5l=|GhA_ z9{xR{J>=KT9?6vtJ}|3BT0`(t+mx6la{ZmmEP2d#-IX&n2i#tNBcMsf-n*qVh4SC& zVReV^H0y2G3Fh1VLQ+%9n{&`z`WAUMm>c#8DHN(goY@bOvb$di%?DvVyPR*tM z+v=$Df*&QuC6tZ7+?XBJ2ef}U-=cYxAKlH?Rm1l~@HgroFZ1X_$~t``+65nLF&w<7 z{$3r22AI7B76i4pym?eu3n|x%~ zX4)fP26YP@KJ#-@Tc|%?HdEUuC;Z0TSjV&%pq>YkKJCks}(%t$r4e0W5(M=enlC5C8P*>h3$?@G2&HzIM`@-=B%aU<>vdGw}W~K zKYw>ulP#VMtsg{?$>(!?A7@xeGi^}I@+VJ!HdmnbMzDUbzTjhH-Aqlk)Z@Q^^Ey$ zn)d9UtSSkPtb030=c#XPlB)}p`QLZw0=(eO3)#A8?7d__Bf<661u`{`7R50PcGVr@^2aTICEJ{9{ykDjzgK0B_L1#?aUIE!5_?HQB# zY4->CZJ73}r?T`4_WjLEarH9$UheTJN_)A%9wjJ8FU(Q}`0nj`0VSz7x|mc8^Si=! zhw@OjJR4J9^LP2J9_6E4RKcd%@cj>$+4TtZ`dMBT!f%(hCcacK=cu{#1ZDmO4z<-HY9Hle7eXlNfm?_Y%OTh z)3i4@m)0Qo&EomldI@_jVb4@?+S`*{eve&k$+W4nId2sHoR|4mE$388uD@R*SJml% z>2jtVT(40oq0+Rs`OPC2aee$DugXxLI3THB&zSS{BI@4Byf5fidD{1u%Tzb~erj{K z&LZC%^P{R?mAG+=yl0g3!9(&V{H@no!r>c~L3j|b+a?~Z4YEpibCr2f~sq4E^szd!#SB}n-e+wPcMTzUG{}lpZYIl()tpPdAm-I1{0_9ZAXT*Kl@u)uYhOe z2BtM*0r+suqQ}VTsvx(Uw66zmkAo9??xyrO{xC1>R739T(mzwr8aaKOrFQeBo#TUg zwyNQoK{cX1JtZPPemJXuRgJ0V>yo1}*vUWddensafdN6SCJt?|JJpnW?oGQIn%_gV zrqqmjYDz#yk#mo$ZcXcj-m$OI$ZhE`w^~*(-zC{}gZMe^O^=?ZK8<*IoA`gQieKaE z7<}_+6Z0x@FsKvA$=NkSZRpp!k5?~H?#iE1S@b=0zhD0m#|CVVs}1?-^b!HJ<@)AD zQFWmFBkb2AaIQ}aw>nb4e=?~b!1qLhY`sW*XYYi@fDZ%Shlf&MS1O?EtmFRp9CfB% z@gngPf2zqr@A`TlhWQet-jd7-a$_FHhMgfqm9_psEQHwp+5PTUEPuQor)p#HS+03 zd?e31S~aD91_#zel|mBNE^h@i8SHG%r3Ppq2A z`f~e|Kh(fZTZdG4A-wBvr_Nz_A7mxwW5-(0@iA_(6qS)d$xfIcUC#$M3I_i&QY@g2yzM@?^-ZWyHPP z#PYWdf9~zq2edzSnQ^d-e!;Nzz6vfa&DK`%=7XmKns59g;ne%sK_~Eh0rhj|Q`!l? ztI;-~Qe#I=yRF-s zRD0~R?LRi1!wyC_vT9ESvu~eWdyU+0WP>&E;Wc(ufEQfql7xuknwM{dh zChl$}&ocWahlASB^(p<}7nJ{!Zn%K1!%! zNArCrd>bBctW&POrT?YHE`4X>&u2j$qip$OQoVUzrY)}H)Jrb6t1x=s-_D~G)GPdw zBhPrLYio;sq2H3HV>)T%{D@m?h`Uezm#Njn$uEn!WFudFDiqKugJacvn$yRezvR&O z)SsK@&<~V{M!2*Dx#T%(0sM)#)#GYCocQuYQqV7TS)ZjJjh!sOuZ%r3B!4EZ6kY9C ziv03$7mI$Ty>cn1ela*wE23)TU-x2O^#(UTtdOINv~SDFRqZO^^LV$uo?(vL%GSx+ z=KMdK%7g2J$YU>8Fz*j!>TnToZC6s~;98APJIK!epsTZ!yq*=-rf5g=YTsgSeqEqBiJ2r-OgX=pQ+EoNQI$gz~SMc}cBO)5v z4SQH0)L&e8o%hRI!tCcA&|b6e=8m*(8UL&7)VPY+{WnSN$Rb~c8|2{E=PXhEg`5lh z5Z7&k=jEfiOL?ojro&uuXcMP?nwyA-6~`27}z%zG54 zv-K=?yneP_rOAVTTmes>3!l4|tq9k5pJuJ#Z^N+(MXCQ0x9SJ*YuJ$-^)r9hWL~j~ z=Do<2ZXw^2Kj&yA&rSW2QiArxM!Rw=nsZ&8s)axN_(EKHs7J@aBPq-Ng41*}`@V%# zi@fNWv`vqi@iJU0NSQBU*Bj{dJL1h_)R%vk)FWn}5#mQ7>NUD#%h$?$e+xexhQ1>f z)j;nB{;;Vq*Ec*LQc=pP9Ws?4ygXJWq7U)UnZJiLk>^eBmR2#Y`-?kt#hkaZ{kv`2 zhCIhS6IM;?N6L6r%h*dept_Vl{To;D4%pXEafR`>vGdYuNc-RxnR**NZ7q;iOXSg@ zt3z*OgA09PdY0>Nk4-DVxZWXYHKE=t;87)bMs0suO{q5;>QsB;YI>$a<%ST?KewqF z?JExl^fUfq2XC5FPgnP<73IlZRt*QA%U8%yYwEqo%jTe$87Ze;px&;HO^uM#@P;AX zCcl0kIkYu?b}Cy{%y&GQ8EQ{`I5|uw%4M&4bgZj%;&?qIHuO`+ zsh4Qiv4px%HeKaVSITFnM0J*UY^|BCSEzS?Gf8fY|IBqL19{{Yw&+W9zR5Eob?5q| z1rhy=j~^Oimk+*t(j8P^_($`vBkDyy_vgPsy=vZ@e95kVnSWLwr5WUdB^_>^9|>NO zSA7qzHP{qYo_xf8^kN|%Ra=)*TX5QT)}db9-(+}Pb-{rdoh%y6^Vy8M2n@$;dZBN~YP&4u3&;QB95WN5Il3-b0?-UfHpJ2Vf!+ z+vp9Rx2C;KZ_qDBJiY`z{GP|D&&+$+0|Po?_MPk&)X<7%Um}+p!3W~&t?CGm8ek3R z8n~1mo~^;ezZ>wD--sip+Idxt0I~cYKF@vQe)VYC1nEpwyZR#Mvxl=aoc0dC`t)yM z2= zuFyL23G!y&>9EGo-r!8OsuQO_DDBl)<41Wjb$Wt%PbsMJ=Du>|2jJ&`48Q*7zMnQF z)VL&eOdc}P$p2TXCQ**IM|A{ycxG9SCR6{O7(0dX@F2gY8o$M#-unpL8tc~#>U%G{ zwBO*`qiG!>@0o}HjD@e}ei^13j6y} zYR{70r7l5qXf;u5CWmfzQln zWz`DW`@nmaEj0T@2ep!V@iB3|0N(%Q_i2d3oI7vP=d>5-9?*99o8wMg%b3rYyczOi z*Siin6*cG84EN~^6K`s}wVZiOEu5`3_{H)(A>Czu_wt8z0{a>AVwU>*z!B!Kh5mKA z$JJ>GavT)X71~~JlGHY1pMxwq!F`WB5AHFaTlh_y_;Fx-wsvxT$B>|Q8GEj4)ov5l z70@1IXAfNZkT`nnX@~yKfp5i~T10-`?4eD2xjz59gh&;%VRuqrQvY*AuI|$RVTMB= z!N1!!&DH^fOQkK^WPXpW7E%{@;qg2fIz)Rpcdi;?hYjL>6#*|^IhxjYw0GJc(-F$Z zhuQiCe!lWtK+ls`|4=hW$7rve=~7MN-QzRiiPZlqm!s1rzJ4203w)r}GhY2*;?Ka8 znzPPD>!WI9_F)_4)CRMk4)N|MuE)V4ALG`T5L74Z>66wGou~c5#!O|9KL!g&wHLnF z|87F};G4Hw2X(>VTls8#j4dqKl+rKMw++qGIpmPPUPv8@CkON7YCHU-QHO*sa(%!_ zkAmP^(TYC(QNVnE5Y%Pbua9=h%6(tt&C(UK4qr%DDSxzwGuT}c7__j8&@O( z`itusr|sH_UH9JVBiF`%Pp6d!9G+0krdrG=w_mpI(|+P@+yBqt{I8;U$>e_=U2}L| zUlW|ywv`%bo7!&Ernc>-O3l=EQ``R4wr$%+YP&=9Y*S3@i7BuBfTBc5nxz&MWQo+e@FX@7}mVImsSQa{Rb-;5hG?L!L`un^ah zBOa1}ZdTU8N_*U7Ct|3ByDe~_RvqTwSPyJ$Pm$4pc=AG*Lm?cZ&OR5Vgp=)`j%qQR zyj^sG0b|MU8>2jM$$C##D?G${d4f2_JTf*EhL`p~gBq`?10GB>BbL0;@1!1nwjVEP zMUZHj?!|j<|KCa0SF(RY#tAXW)2{0#L!NT)*~x1@js3= z>#15D&6p#<_bt*RfqDILbptv^7&ogu$j0qnrB>oI=ex&c>Kp1k75)3%6!|}f5yjN< ze~d74aJx%A?Z`>|9p}PJ&P!RB3Mmrl$M>}u8KnMhZ$obO>xXLbg*?-lF_WjLd^c8s z)6|D&etVEt)*qSaMt-8Ji3f+tUwC6g0otvbg`r{G48Q8azlMzeCq5Km`}Z~)6eX@M zE^7;skJkARE8lTU2&1_Co}Jr(Y0O8nK3h?Oc7qx0CpsSZkw1y!|HF$?w5Q(F<38i$ ze!L24$xl71`w(J&KNF)vdG;^vY=D*gRLyJ0Kk~%f41Uz1zm8_TUV;5}yDD&mIwtO2 z1QlryDilOz;*nJkcd3Pmv!jjZA^!)hszU?XMRWR*hkVp8sKXWJk!SG=G!%b6 zZ$cySgCbFAO4J-@-5~My$$>@WnU4ECXhnNwk{?^d-`9KLW!x`4p(ginzNYEXTKr%b z^(JwL#)~$@X=`1WAnW>{^WitIKd?1`wh|9n)o4%jwsRvL>y}xoY}8_1tJ zwMyV|Cy-bMxr~UUa9Od4m=i($I~L`_NPJb>$Fx5&IWcLYFAV z@}Ljx)blM!BwpOfx1I%nlMPlr>_}9h|3=7F;wQU0>_Q<-&W;CG5TqV zuLg8sKB`_Nfb*>Li`}(ixcFyn6-E$;E_5Qhne$y%i&3;!Zt!5V9IuWVR{DR>6b_7$ z_?B3tUf4D%h?CUyYie-5*cRw(z%Baku2?r#lka<;H>1yFd2iEzk)ksy2C<>O)Zum{ zar+TpIWN>@CFYwkiFTtWW+bqLHIH#&D(wY@U5H}dFY!Tx9NaHw1L{b&x7(z~42hdJ z)P>@o@eZ6F%etbw9VrKLUcP8Ch<T|qL;{CoJY!d$Y z#1uf@!ah~(~{H_Dr<^T2V%*e_7nQE938OxF1|0%GK?IkLz zaG3fj^$im?Q0JV>r^PPn&ra2%aESe#s&Ibk4^dy7I9^oNH_~A->(oBm12{>0>vS^? z%DVB>Z3xh>S9k(AC4PBZi%HZabH|%8JAvb7RpAWV)4f*X98sxP;vVa-$-Li-v~!l$ z{Quj^F6wI+uVcO1h)YG~J3<~@BhIzbChsmL$6c3sqkrBcR{LVYNAg&O?jCgIbsufx z$8EMxZly#@))P%RH#XL%?k0NNWqXTkA>`$8o^|r#tmGlL0{7UiTIj{<#f-NRe)!AC zIu2$GWNiLW>(G_D>xwOa&hownbMGT=e|t0a4AHPeg$Q|OZeI%uwW4k)ogJz5aR)F0sC8y^TH~`E!IG?IYd@ z-b=hdkE!hMYtbP${qpQ@4Q4Pe_^;{lLGJgt4WDGZ?(4Cnt-Sx|!Y1^2mrQK9nV|zX=8LRjzZl8qes* z)yq&n(XPJBiiPCct3M6+PWwIc@J(5-gT;L{=G{ui!}!Ve>~~FQOkLJ@n-#68YoGjz zKtXzL88^^KzG!-kTSV=-A@--Zi}-)_^@Xvgy!${As1d&ua(4!wNOM1e~5*WfNUW;0IQ z1)`9ds5tI|mD@Et6G1`Ve|#l3Y_y+l(V#o?SoR5eIB1XA=Yf-$$U1w5pXXz(x0-d) ztWO3!BxYM~!z12jqiG5(;CT$=)fiDh-tY6EJLhlKJ{NZAs0&)_;No$9xSW{EdDt~g zhiLM0+Q$kc)Bkc@@nD&(Behw9ztr7zibODkI_cmTA3WTz0q0^x9$;{94{lR0&2I0- zT;`#j_bu2>9x@hWUB&GNA2lKGe2!N&H+=G&>r~dU%qNS>+Tf>MCc6Ox$S<`Rd$X8- zry9HnusvrV8|u;53ucR87WGl9WeNn@USzfh3wS?jPY7Y!iXmYnbNsih3?M>#_#-D$ z$a7`AjYvuCvr&n(#L2sj*vIRgS(rM{EAQEvkxu5bJnK#3_qrC`;yiSk5kip1tGzUc z3~Uc%QD7~%|F4l98EH@VG9Pif6TgGVOndxe4SKMi>fc!R|KF5v^t9kqF#^yYz>nkVCGwoC*Ij&_90LF`9ManI$$PFm5()up%$}56uXm z1pVfO-;TA^i@#I3k&o?ur5BaRYjr*v(Ta7%-10sYVEe*~Ius;UOk=`Kp0~*~4+_yP zKShNiGA=F?iW5)Q*Psn`^^{L$jAFcw?yN?MVzT~>1tn#j6{7~H+sN-M29%W?x@7#HNFLGumhL4O;;eJim) z|1}LN6U%0_;t_Rl$rU~fDhu@PtwI&H&oAso<)O?&AGD}JJ5PNdit&7dy&)WB{(9BI zgIa7Kcq)K8GCrv+aB^HmZ)d$K=VzVQfT*n$Mt;`4Z^s&tMBZ8R&4b2lPgCB4sq#IB zQ6V&;eeju-&Ha zBc{F_Mt|m+_pgJ9FDC0%>d=N5^s11TJlSJ~7wwA4a|JGJrQfv9ra%YTj{0E!B6+_- zgT>Un!`rw~rzv$uAdJtP7taebigWyzAN3-E+na|3(2;29WI;KOL$^ITbfSHwh8~?I zuI{R^t3C7WOC`F<`JOw`m8fbPg>J;o9FLCF3+wWj&_n!z#m2Y%)TimRm@Df%V>IOS{xK5BiDjT1`$R zHY6YRV7$fVa$q3s&71v*(7#t!)?g6r(wF}K?_%Vt62WlV6Q<~~p7-Blp$;Qx@6Bm} zoqX_;B$uDOa%Z_3Bjx>6=8;B>w@I_*-5=)hx_%s?PCGMJfl=&V{nmlY@;!r2dbE;t z1FyKym-?^r4JXp_{=Hp-_{jVI(?5XG+&O10~6B;~by)q$36vm2wzR@GVdd#cS zVI1vp%;DpS1^PxXnfUUD7P(pfE}QSh6uF;fYNVXWJf@DqG}`xe>9CX6(d?HJ(`gr7 z5n=U?lCBJGP+L5U|`L00#jTry;bB8gT{p())p{L))Ez@D1@DF*~LS0jr{F|5C zmsMJ^fbD0Kz34~(?!)6O7Cz4E#S-F2ixaKo`@VB@ST5HI14hl|IDIytDE*y(rM4h0dzdSwc0%9ZRt{?U!YjIUFf)Tmof-dk2+mH0O~ zXEiZ%HtJ^b`I|T&*3uq#g1RRo@4I>wx>L86Z4$w2^3<)>W~`I^dM=33^8KfbZmgF$ z2)b~8Dg9_x7%3Tt&-1Bqm1Es}vl|U?_Bo1M2^Ds}PDrvCAPQL*r29AH;4~nkK|Ef6ym7^Pq*}8 zvgn>OHtdt*zO>^I@zGx;s*;a}FAl>?y*8qo7pa%Ap3i8&VfJ@rad<@LDZL$y$)gYV z`EZi<)XZ9(CeA)#Lhn&h_iJ!g=4pu;`B|5=Yahlr+UE}iuz-10m&u9qDvr-fFOrx~ z$F#GcI`g-tZUCvce~Ua7^TJE<|ua{H>E4qvSgx_6RQ0uJulV zv8-#d|8(Ip?Mb`rxFUL@ksD`OJ1*4daZPyRj2S1$dx8BHT$g-&!jGH8j7b_qSkHu~ zMc|Y5ny&hBOL(ZD5qF4p?`v>R{Hrc?M=@C!&xFUs=A#sNN!(O8fUV@Iadp)&Q|~`a zsY9~F)gUci6GyZQ;0>`b^U_D6ZJ-xlST~hyzFt6ktBnFuwF`FMCIWKdf7)oS+^ePkx)~z+mRFHl_3!Z3QCjH85~H^%FO4 zkk1Nx)G*Ob$`=JI(U>BPf#kjDDK6M(=gaAXgP8lK2I;BGZ*^h4#X6-<4n4HY6Xkr}ZHV$1CA_7#?{aJF6NG%gFbCEC|uAlGBB-+(+>UYgo=- zLp>t2M;Fi|irBZD4m()yp17*PJDsf48A1xSPiSkz&LWJfgI=Vf?LOc@YGS7bN{r>a zKkx^UmUih4TBIZHIORclV!`?rq~JKL_+ZAEtn_P>2^rX)qND{&s1t9!#pFJjo9f0hZ`SQqTRsl_Aa zg*W^4$j>J zmGhslqX4nye+t|sf9>d@L1EhK=Q>c7xVWtbXXN?4FBX)bU23lZ7392`TsY0T_rPic zO45FFC4w`ouj^&EAy&pKE`Zal%ZfDhAs6q%*H4L3Y(K=hqBOBD&4(Z4|2aR5&{me;_r0jf z_J{Q>xGmqyJE*}@#{a$5%*)g#JGc2zll_594y>kr?7UWi{_;KQW(Le<9WZ)C0QK4L z@25fo;^B!wG%qgSaSkJjy6>CQg*3d*Y>6g};eCIY6h;g7f7xKdJLch5&0J_nyAL^` zHF1W|i#N!l5y*uHj%4p({KqsFstrakO|8Cm7K*E%D*$b5fS;fDO*KjOwf z=DkJpjVMk2efHIh9_(*2SBIX(WqkoH_VZfD9Sy<2{9E%=1Zx@B%PRTMi~ap}Mvy_C zYhpdon|2&^c^1akHO~7UEqQ8N2<;f39Xe^ypZ)dbc`<;v=(++M>3?SnThNGkdCL3% z2C}^}{o)1vXctbbay@M4(6*H0UK^4*%noR7A$ zE@1?zdA;rOsF9X+b(TsVj3e*$sz{wL_f^${PCV~`BW9f8dF}0W=+}?uU#-L#_P5-i z$5>*0=Fd^AFSDMc?xEdcvkgHCwjZrLm_U1V(13}=!3zwSMBM(yh^uzS$@eg(6qoPr zaE^LWhn;mJIEK7swIc`fXbsNGRQ7Ky6T)=jpNtC3BvxAGgPYgseiy`S;kis<%$0FU z@4`Id`+iZFPJcY&b73*9(U?s5pW3n~%DuhP-o6oj|@B z@m7thLF&1bZuHbJpFPyzKkgT57KYhKKJnNvg>_#l){m>$KKF+K+3PT`Rnhx;{J`5qja z&irQ4VL$yS@pS;TY}D6@Hgw~B78uLCP5j4tdyRuSu$~?px!=}{ddz2BJ=KM=N&J?4 z^o2Y#YP%CXqgl5OS79^T9}QGt^kN{x4I8>TIgYJ0SkCMFH^#`?kh*B24%@k1WS13> zsqOafH6t%|+Kmks>|lGlqpUZ{k42lR(3kN(&uhg6`fsk2E>xy&4@@+mFnOw2_b4=D zoHc&o!Jl-po{<-Oxc_I)&0gY|sv+zy&3SgXuut+>Gd;r8B_&VLm*jWcRbfn}o>;ub zfP*ssY4zwij=HF`2Zw22Y7>E(Jazg#>niHtas|97#&PS&ymf^ACY>2ai5C|K(Us@S z`j0t)`E|$o0FJZ0*)}C+alA^a)i_DJX+1Lraa?TwoY+YID)H2foSdH(CL>Op9Ep4r0!T}t}z zTq7>gPIKLdtCDA*dvKp|d3JLE*Jx)r;Xrm-k7fgNGVQdxEx1Yio=c0{5^s#hM!b$` znN7&fIwD=8AQmw`N8Sn}6Sa0(l@52f-N-^F_{oPgGP^OCIwHd{J?=}MS>wk8V%Cmc zgy=^~g9#6X=jVsXcFtp7+h@Vw)bx)u0X&hs_s4*z#G*yC_{uz6 zI3a+$@*So`KMpXCN5+M5NY;JG62c3K_c8mRjJD=iK9zNJHM6`dSY+?GD%dh$G+5 z-y1|`=84ojjkw1;*2Zi8L!DJ}M-UIlV}X@Wq<}l$iE*>QszH4ooC3?0RLx zD%KG_sKZmUJ!!WSHJQ)OE>R#2?U|*uNK1V9+yX!Ao}ag@h^GG^VjUFC_KaU$$Smu` z+&3bIcr~I$wi2>_iVN9^i&qA)i2mF&){5M;7p~SL53yR+0P+#bJ+#74-4ol?4;^{u zE9(q3$LCaM3-YtS)J|$f;@K5JTxERv2S@OcI`rdQJqokE(pD>8vtG4d(4YwIWA7Cx zD(xGMC{8pq4WN^r`DU6DYnb;EvP4jl?K4j3QIq46>$e)!$@?*Vt;jD+B>(iG9Q()n zte8hVRCd1tB%kNxp2Rp?JF(8B>e<2i}Jae?~wL4F6a1Y~@} zsKx#*mo*q5@fq#HAmTXc_EfA_=caLC8FkYwlM+MNzIBWaBbLeUwGNCVk4-+H$56H} z%N0ac)@@C1TQE${Tf>T(5@#Hf5w!P>HA2PuD$glDUdVGxIk-RDGb`K}P0Za;i{U94 z9~q4(MZZXsDTw~8U&i-xV+{Kr%~0Yn^U}$stix%4J?p`Ws`7ibAMY85?`nB)mb~<> zj0NM_Kb`tu0x>Q&fF$CRP2@@H@*J&oy~%5YGfPm@fX)*o&Fs=M_}w zLO)saHjE9di~d}(!QPa75);O3Ic~)$%pssK?-hriZT#jqmSo!WcV}W*m1LV8<$%pB^4K zBAg3F6jsw7nLU6C)C1rC8n90Mydd`zzPYKu24a<0Zv3LoemXCRjkJrZt=J^v`qGRW z8K_Tk2a%h3r*N()Y-fA+eP%>u<2ZiMV;61z#Rv}ZzK2Blv72_E9V+x-zE0TY#rd9` z@1Pqkxc$bPe(YiYsiwRSp09fhbsBl;Qg06ma65GqANI3<+XoZ+F+a5T8*o5)^^z4w ziN`-Xv5U|I3W45--oKxJEpb-VAdJSvO3Ff{g3bv3@k1LO-kO!x&kwDT?Ek zN#5TM;X1ePx!r>@tmB-o9B3RXI)?g&?WSfP+>$u$7J`lY52+VHF4lRvL>+FkefUH- zGE$%EFWPV`2k$@Gf;-~ZBRzN^`^Q`Hkhtew2-OBrhZa&Yw~!S&D6|Bl0 z#A+Vb@X(FNZ0~wBh-bv*6Ld(H{IpAteZ1bAaSptqeWxOI6#dl8bcmDpIv@G*k^4XR z=Eo6I5hi5DtcafSE2y@3V4g`d}3@rRfq zsK8(1f2}#$)NS(~&}SGAceZ<>pxtDm3kA)b?|DwB<^QJzHP8^Z4RgXstbIO+(bQd= zGb<2HzJ6TFkLt`H^*SrzV1Mg>7C4EyqOEY1l)6)m!PF_u7F*$=J(#?_koCZQrw_lV z6WlHB@UngOX)TV+Iw4&w@X;R5u_@0upI*rYKkd2+It*j}n0M5LQ`GVAM(Ge_d%0CA zjHRE|p5sF{`g?4&1%1d*NU6dL=Cg^_oY>0vvCm+gO&zqUf)yd|*ErdQFtNcT)~BpP zuAK=WLc2VZU=(p>RRgB?A>ZdUp@gh=AnVPt{ZUAb`>aQQSv5#0_czvrR7B@e6E1PQ z*Im~k9qnl=tmw}G_|eUY=#uh%FphZ_>f)?cWTD+$8$=ATcWxyZwus|BZK7^m6;vY| z+jE;d$X-%@uQFl$0?w~OiyXAWM{USS%r{hvTqWf>VmG$P`c3c6$W429WyTBZ{Eq4E zSVCTE-!h2xjN8(KG|0>Tf~TmDh~v`8n(x#hyMp-0?Y`&MA%97EpGA)qoY(f*B6z?& zI%bI*1=!vq5QWRrm>;|O@SXba`vM;dvip9+Q9o`QPv8tbo~ zr_?A$`+83;zRvWILx}UV^K4@aeOIQ>NZW)E%7`BhGvbQ; zzmj@AC&wY~s~ct6{_(RKk-=^HI#;EqpZw*bT&;Dw@02&Zq z4)LNh=dEO>2(*mHC--cKV||o3$%7r#8?)0o(3IQ#neIeO;=Y?9v?88-O8qD8)J|K; zPua>U(T4V8hYoFJy~s3n?4cj;&2B?G+M`Z}k(KlMKx=}Dyz?(niS}&Yd)x!3JV(A> zjgGXBu~z6r+yh>Cbm%Vr8X_Mt&$*uY z5Jx?IZoCOS*?w-94vE4GwH)X#@z1*cI(1v{NDzZ*zq>-tC-$AM!BFC%@<9wI&Yh)& zhUa|~v0xPK`lVGEO@1xaiu_Ohy)r$F4%BN?)Lxw7Jbb$lz-Vq)J=u>j#DS0KbBx12 z&5Vdprxh9E!+q+Ljj60S%P||d%7}5?PCYM-335MI95_k7F7lrj6NOjK`>~XDg!tS$ z#=lmh#1ytyY9GW@;g9WlWTxLQJs&_z)@G9$*)Uy>GgE^K1v$=jjF>@tzg~@IEMKifl1l$a&)aNdZ3tXpx&irKP%q6u@D9}96F@^JpX9SmYlN%_vO4JUX% zg9f-!nB$v#+KRa{ZY9*%CF@Dgq94k28;q#W``Gv1jrp`Q`^jtc-@MHnsO)FH%cev| z>OX@qf?w3ZssBV!cL-}qvk?op{gi%Aw4k5f(Ax1Rn(@pea+YIYeB(ez>Y3e2C%!O` zKaY=KQAyGLDhy}cyW@fjr9~H4Gh(s$MjRG<#;56>f5%63d};v(V@%>@isHF7TalGy5z?W;^>n~e4xHLdD4nqv^NwEW4G}A5~twKNAMEl;_KXXfvAg^~8ch!cTp}I7a-@APRlR&tIX&aoSz|Zk!-)j8WmV z%ww?-&Jgb;>yTzS+9CfhF>?$h9yO@bm-n+Wi0i^j>r_xv#}t2} zN4-Y!{(l5F*`8253eP$2p$=Buk^HmIfCrK%X1I_2D-KmVFL(21qsoaq)k z;dMOjsz9<_$1pu!6`=pF)*u_>rSU)7Y+ta}j*QGtr=4NEp?&#V7_C#WzHFw%JKD)- zRCrJ9(o>0EbLIQ;MjT?3d+fIpi&BEOp_x z%yTgn1}-H()M{699l z+-}cLKYYZ5Q`F(aRvH}wvGQGxAi~7i+#Ib+q?Fh;cvla3qk@>RR7$3^X^{sT^Cwb)KMAnkbBg5`1ke~JX zs>5F7ri;B`{0(Wx``PA0d2Zi*vkDcc7kzaim`D9y{jLrz80VeZsIZvv+^?Pw)y1Fc zN1-P1@(u&ia2%^VjNmzW`+BaJti=}*4p7hZytYt)(Bd1yFXedS`(|S@G-`yU)%W+PrJkI0NN9m&WT_( z=V`{a06Nk(C~fF0*RfoUtek&8$E6GH{&Pd{Gw+pIY(!Vu*T=gMU>qF@8L*ytX5VZl zj+W!`m$}h8E%SO8Ke}_f2GoRWdEN_GE$Bsi!?iFv$@a%0C{KTw_Ed@9Y>)qHM;`ip z-3l%w(r%R1gnK;x=qX-I<5=eTWJfF3qk|^-@q}@|Y=jmAxZS{}E)0y7@1na=mwb7@ zt`&o5hw6thnE1wI#t`D)7Z!x67uHU2qe@oJ^BpS+@cgf8_%M|HS)z^5$@lH5=+KFJ z>%Sxw-cfH|+F-@tM8=O_hZodUh5za?QqFfpg;6rDnW8XG;_tH-PsE({2e6QNvdD7-ZgrwR{V`)6_xqN^ zj`_qTZ`^n*-%Gvh#bVm0Gup6(`X{=381p$FAC_COjO{t&omffi*U%0Z>!gEQm=u{G zZ>@;nwyeK<*o=SV<=5LR$i?{R(;$NXxP3k5=QYHUr!;6T&qHU9!VmgYss0gcWP6u$ zb`0Y6E!pCPin)KnU^6z$euG`uPHeN^i5%&1WEBpv{oG714ojTb^sw`~ zcRjXYD(_>|9}AAL{YTaSz76N`-bV0*aous36DQcdf4dL+Igjyg7~3+x%_2BM%s`&H zC_Mj^qL6%7=wASrXz%Q<#bx4cl>-0Cdk8~V|H=GQ|6V2LO|QZ=;?sLpG-jO6&uhbV z+OHbBF`4|e;JFhS$ai7JYg*>3Y6#&x^~I+x7LXcn@SF)ZxP5XiBd&YtcXflfN&Cpc z29~cKnm|D?fN}PsT0Tjvw+q zVq-n-)1G@wg-68t-K-cz4jpkLfF~07@m@TWaTw)ejFQLeFb^6fu_tl#CjDu(crc=((Szhgy*y6}fMy@4D5i0^j!p`^aacGrLb)WLZ; z7h2ls-l?D`dU^+tFNQqx!-lP*Z&rI?WcyLO1t#JTrw?;yb9_8%Y)Hde@roW+*?+GY zHsZ7U1~`Z(*BJ491n29!5AIU(JrWB%M0L&x{GzW4co85LWgQNomR zy?86WHk0*W6-dMWRn(K!+~nz!TI`bN1T*T9PTrg0b;Px%zcar@(_WD`gl){HA8k=M zM*i4NJ)DW{o#%#eeLnNYQ7y934mZ-^53l!iFF$h7eif@kMULCwt!4}(pB^|HL2kAy zsGIW;Gwuo_FR?%GB|otc@3R2$oXd)W#K&t)C`5d)--u&_sT5#nwa-;1Rc0t z+1d)k(SAvNoPzty|Hi<2JyR+#%CkNCB5OVR^Q#vQ9An%SWWK7%_MJRvWukl>vn_Mq z=kZ}2rryr~O@XR1|5G$LPyIf+i2>DUD+g(iO4hmBtUz_zU)K0BlKSIqZa+NawF+_6 z6>RVG(~Yt@sh2vMagKQ_?;ItLrIdLiH$~{*@mkboox8cd4t2PF<;5Y?W!;$Ib)hc( zvt}A6bd0-kk3A?zy^!?UhI*xBT`LXh6PK;Eq5<(mBMbiVzV>`qz@lV4AJyPKkGtfp z8;xWhZidj9Xu57hGh*OB1DeZtCR#Ct^}|uU8oSAtz2u|7Ciy-x>kH=7l0Wt6!1G?c z||buZj7pXp#bs1>}H?25ca2Ra2Oe zR^BJC7(fqh|23Z(y@)>YN^e;w>4XnOn7@yoQlkU)%kc9-B$kr*n3U*Cyc-k1Y8B`6 zsu|8{n&0#GN8Z2(FX;dFuvM#HerD9$|wicbGu_#6qt~W@%_VrZPYsx5)2r~ z{^}FFc+5Dfy;g(PJYR|F8Vr&+Nn^%f;(#R%3?*hR>&N{W%p*S|7)E=?xd_^&pssUh zF`Tybm>yZFuisU3pa=D8&zCNY5dMj_qdM#Ur%UOdv=i!ZJgHAp4^U#1_-7##7R&ni zi>Zsuys!02jA8rlIzYE5d0)tl5qaf3q5zEK*FHWC#<4$7p(sp{xXs5poLFI<2E*jN z?6=&Heo*(e2NT)uK5xV%;+j!L-0lUWIqt_~+M|0~@q+c&W%A23+CzE1>BPaES^p5v zu4a8obT!msOLd?$>kb94qktudgUlD24jRnpK^=KXk2%7R_4W8rOTI&|#6-sYfLg3? z*uQ$P0(QpVGCK8qZa46P6{!@|(T&wuMEmm40RFMA@3h?m3+sv%N!U-zs~OnV;$|Rl{8o{d7!@%M{3FQWDaZ; zp1dDGOAGbXS|c{mHhv9Yb1C_bi5{J(A8ghTw$uJt&w-u9d@Rn2w2|j$UDzYf-!*fg zIsIr|xd8Uj-oUupPds%ugagE;%u9!492SOgf%Ry)b4DDY-EF=FUxh!8d+~vJ*`{~m z7~8X})Hp72yDNm_%p0oaHk^|D*wBR2#A%g%NJuB|k!p}ko-RJwgtIaqh{8F^Bj5cv zPdt1hi1*~Xk%xo0K>On82rd!hYG^TR5%c4HD;x%H=QQCm+Y`&%aaGQL(}Nqt-0w}e zMZ9-XjoZW?cbvFOJkvISIF8Fx*1>k_!4@mXx2*pTestmy`yYN#VKw6==R?*N5+7~- z=t|yMTFQwF%#+s1W;`L!>K$GrG9I#KvtbbR&CGrVJmdENIysP+`lxmV1zruMKYh^Q zjpWe}8oVWroTY+=`LWM!19Hpv17GOziS1K)e}Ac)Mjuq5GIjB}fE7)c7l#%%p%(qS z^#c_?b309f10NZmulv|>m-F7XfCsP0pTA!E5ugqVHn!s{w_CkSg>S@5%9cc4&AV-XZ}Q=;w=NO%CSoH`J*Hwij6$ zz?Lc;-`rtjoX+hhDq&&!v7Sa$7F|bP=u(+{dPV^o+c$p=<0t+2RU;4Vv|I6dT*N#z zeaOvv;%h$zJhTn}%rB-x1=g^xn__an$M!SrqYxn4mzxnHX0(S8CXUHv zK!jMKk_+jG=F=7oTh4khoeuIT@E>(m$jJ6rZIp;6rss7rH1Mc-7+Gi=HwBQBIO%~6 zMP!}d(jnxc-Gw?dH!<7qjM`79%TdPovc(uI~ z#pOOb=n!O{3Qkd@q+IVO3u1{*rvqh(k^h);8OKH6DlnA1@Z9M{IXO>_AjWdOK4vwd z0`0V`wP;NLTJcJOO0*B3Rv|s}Rk(}+m1$2YMjqgC617Gol5dRp1E}0delK&OCwVrp zrUuox9r`%2h4t?4lv>oFee;1GwTK1#`%#DZm2o+Qc_36ugOlXh#38Jo+1~Vn4GoD` z(iza0*sin-O^7YX@6F`-$G-|RCqBEza+Z|PXCOzVTj!Kj4*~0Tki;9 z6mdy9BSsT_M;V*)yUudz4$jkrb`h-3M4dQ4fK1dt7mjIhoby{oqjty zd8VpA3V!;rql6xRsP_)=e*UBGUGzHutxNQX0@HZBLN*0!3XY4#jRHJwZEqNz5_z2) z?U*j{GE|Gf^8RTr9cIujdd7^I#ML=+yU}(Ps*qpWt@L4u>}NCME%S(RmT03hSYz<9w(}Ufny;k4@~KUyymn%J$uMY^FW= zuoZ9W%kNQv)LE=Mx6v+fJAfS$kKfcNu9bD2&Eyi^AM@01`thJe@~sLU zcY+36$a@2WR_v!;n%eppvHIR1P7r%ta3j5}%hTA1leAwZ2T_6fAapT|JDqudHJQVy zt0tvX;}rXEq>O@(JnS`C;OBg2f8c~=xO_K7fw{7NUPObc92f1EAj~}O50wt5x!;1e zD(q%Hi&vVElJ!kVO9WjQw^uVcuw)r^zS<2Z{Vec~^QxEie@!^Y{bC||Tp&L9tb~tx z=|YkpmuW9e6~IvHDEE5Z!5= zjkrqw8}v+xn(`fy&QZAERG!=RDzEH|z0`?Q6ShaFzAwu2umY zCI8v`TkuH!&rw*3HH@>&1_vI~R-{#+EB*A{!U&!UzrJyz>`caJ88d2tsPApaLVtU)t*k6@?~U)cU)j1s3A*E1ThzNYO@7skXIK(h`J{FMF1vVNtW zaJHvA!m8>lH_m_N>Vq3=t7DQ<;=w)Kby#TW-)IR6gv z?@*NrT}1cZ(LgEdyLpT-QP-|$<%UV>{ikL$pg)e0IG#*h$~aas4#&?RZ*lv$EKx8J zyOh);6~}2wMk7`+4s+F~-e&vDfhwG0T$CsuL?#|**E|PIY}a0j;4}5jtqx9@Y3JI{ zu_3jmDjb20_Ro4IjHNFx84$w$j6ktXKG@kFbI1b+vDbAQ#>w+nMfKPszr)N@;2`x> zOT7+G_E(ywKoiD8hsz#hq^?ko2*J(vnyU@iI|g`vPXiC_d(BukldrzjjKCi!zi*mQ zjC$#I_Yh`qzE@l(KhZy1pZ1^t{ca=ckguHg{RhivaiQHq(w@@*G&F zNjA(RkDO#2q@-Qwq5&Uy|9PsqkTy=9gViG)v35Bt(i8XfH6sIYY;z+Hu%7&~UX4t& zCyZ4iGjY-r56UnmhgGy7R9K#a3?KvZ$=~lbO1~g0tNEOeRc7p=y>YR z)>`D3{`(Q+V*Pa^!G%J!N1XxYjw1io4r4Xr?5DzwhRkOtLQec*9Q8WrM`4+-vu4E4 z0}d^x{-J&FtqU=nugrz5C`!9vJ{6LwE1QP=C`Nl^ju0NRE-qVN13T}#O>_{&*&bwm zFDZVy%!$&(+01jdvNKNeI}k^EPOKi~WS)O`k%Ah*lUjia@_hU^J1Wcbic2-9LX5(!Ze=mK3 zeyVz8M{Dt~?8;>(G|isErdfCXp`=nb1!BPvwKRBI}kv9wf+oAF!e$ zao$WDIuTb^3Zfz7!yJr4CRt}qX+amZ->IWOck*35pB7zdcO0mLn!bPev;j%X8~xq~ z(2ebTzIidTD|sos11EEHp5x8v#rE+A4SEw#?KUE#tnb>@h{3d{?bTukG4*{1CQJRh zP=y1GYi09jN^X!63uwXIQV$pj?_xt zSAziJL)5c(Y?vU|{~<`N$ym>=!Wv%Rfa})(e;aC5;UF6HW}P(Mg?-c?ah<)$$9azF z@4;H~cFyZTBys;@=lqx$C+qDi@jOV~KGciJwELwAqbcWOm%)U>9LE+}Lm0t%UF0=l ziunIWJEls!r1W4KF+&w6YEuVU8#*w9_TJqN*r=z5*9_np^V^I|b`&Fj>J}+5ll_lb zFU%so8R9^#DU8F27PDy|dT7No&d>TzYBb~hzKsiF6344`JuBwQ`BcnL8F<_~W>jT9 z>KmuWe2G(w10~Ij!+{}`p-!y+Pzg2j`hYkqijW_zy(1_|eHwS4bs5LWSyX|^jH8d! zd|1H!PoxTBG=e#7p^J1;=?p-U^ z5fi4fPG|m~mRp1Mv_EI^V*|0qeI+&ue}^L2OiWQIgku7jNhi~NBBDL)}!R>AFQFtW3H}%lrl;q830h}RLpQgfjnGYuO^)09qpLlUm z;?^3(72@A1CR``pSMk1ur_3JQrhk8KZ^H}n$3E)6+rpC@IHu&UELZJ#>jfVEvLG+# z=fYPD?!?J+lzOD6j+-?>i8`!X?>)1kN;Udf)+qdD+`J$U-W6WDuETxe@);&9;r?AC zW>jOm)XQYT6zbGehn;x9{@w%4ctW(k(BK(yQ`;b(%k@%Zr=gBMQ(uiY%mYRIVZ0FD zPvM4w`)3ZQ@RD}(!U`l4|JBvvmH2f{J;rjru!kCu_Qa7|ydiGBug4_vRr%dvyc2({ z6T}C}XEr@P5fhUPsKfc$^i_e(jGNFuJvNeuwmP)<%>E@;E%-{j(9DI+oEK$T557qr z>m9&%$@?l73NlXW_A=rx<8fcI8_${F6DEf6gZ*)feaJ`L)>)4xqCc;?@Q1c;OBjEN z!^okpsav;|QKAt0t-W zspHl?2tv#L%s%x_mBk|=-IxaL>NY5qF;}A>hw&J08)@&`u1|-WNqMj z>Htzr5KX8@b^2Y+M-f=K{X3Hh<(5;YZ*<@(^}}B3oTAh{Uy{k|Wn{e@4{ouJSi08) zC+)Mt4YAW=D4TQUwVq@+FRp#eiVPhAt7NK3nOa|O~9%Z*iH8TT_SaUlck;%80BNZc?cfN0`_ zl@UB=eEaQQWThQHUWcQU`uC_$v&*{vV~uD=UHH2@>qq+0(p6gIVtcjSYBXmZb}rF? zP2{KM_0-72_9Tl6AIMvy$C;6rcK;iC%;G!-%o_BqMBeBhMl|c*W(}+uL){tu*@JxC z?xmUaJn?<31qF%ASbvn^{atJvKq1;0YHCr8*gJg?CCbQqsf=Id1J!aBVrjoh@S`m8 z%W)qnljjwu)F@B;Q7(=*@mG2?suO4OI%*UDF7=`g@kNpv^@t^=I?z!3L8C?!nfIAK zTw(nhcaAj@?VHpCrCV~|c>Fh}Bd5qZj<-hi$$A78`hMoih-hVI0eObR@rPHSRUp@)pe z0Ud_Od%-QdSi^DK)K!TX>Zg)R9k{`KSNyUIEE$lhNf>>(eVIEPdty^7H4X7!i28IX z=X-@2G4g+tTpkQ%`=Cu;lqav0tq_Ib;xF@bm`h#Kcc=j)XlJzOP@DNbIjtX~#p)Z=4l-x)+bLY(+TkBM>}#r^22q3$w=F^P7ED?Y?fkBqyl z#|-+xSEB)&<@e~W%;Pf7rYP*8z8yElgi)-2>Mu25W*PYoj0dxbs#iW_p)Rt$QDcty zd2R>h3V)n&p)CEb<0m_+Qopw88bo%^&*lmd%x8bia~doX%;3Nn&eymJ1{{>{jcxIw zFy}cYY{O#q_j;v7akl>sIMI{5GyJv+4>+G$cet@c;^(*;J*mHL>@i{~?Vf23SVo+B z#*J;f-X3)$SWbI;B_~!AA4WXLOuc$_V+8-nybkl>@oafNB?{lkOK;X_5yiZdVhZ^^ z!no>V#3#nn?qh1K=JrS4TCs+h!^?Vsx-x~%gP+v5)fl8T70i>>ELh9_y-w;58Q;?Z zv|%0@dfAAhoX5`O-wkZ{?{i@*aj064?Zo!v=YRAgSF#2NXdhbaz!IMK_i!x^3GXNz zI7*EDrxy_2h zjIW_lxXbo!)6ICF5m)9&kG&b>Ji7wSgLZ=XDhI zy0MlzJ^!=_9t)4$GvGPVbtr@>rdfj9CyWy&Ci&|e!<4`ogS zrth-hE!*9!k5AHnr*`t-o#X`sU}T-&Bd-#_c-?>VIANof>iflul;k~w-G>j{&Qy-` zD?HmYf_2Orw&_}Yp}n${2J89(rFtvSnQ;tT7~dq{<~8FU{io1ZJ7O3o*P|_HKtH>< z(u-e`Z>$k$dA?Qj-;S)43s#PTj`q7lY7D0To;u5VNxsw2%?Lf)XZ;H!A9Y=~kRDy= z=Z&KoobrFHs!ABx|EhowMq*4wA4W2cX3TP+Z#jAH+yx8U+sq2WMl3PI2M4jsCoK|K z&kt+mfRlD?ttgCTy;=Avb1m&^%+r42_p~~sAZk5&G^O7kR%tMqe01ll2C2%*I=~(r zr(W#y+JMxwPZaecjjT7d!;G{rwsiS(;G$UHB%k08jC;em# zbq(h$)dm9+$Wx(gE@Wo^f~`(uAr7VflmD&uknefP?{&`&c*X0mmsDXed7wc^ix_UV z`mP?k*`DwvfIZ~P5if$s!S*tZEXYaBS=om+9J+Q}Z5Tiv&yvoLKZ_Xe6)Y&g{x|W| zV?!B#D}AV)p7-4#f! zaE}4iWF5cyX4E3yGbr(v@t&z}6zY_f-%~w^q0ZgW(2BZpzH&Cy7k^>gG$h{I6-KMF z^7?=lZRNPstL=!l>uIo@y1W?kSbN&(lRY@be01CHLKoU6ztRU8U#SlIFo`;-N3#h2 zF>aQ(aG@Lf-CsQDK^#wK{mS#-yG?$j{XdSbGOVhuiLTq-orXf#DUx5-KI`lej_35)F@oEV{G!09DDgZpDJF>h<xGVW zReR8aPt-XF*l#@I{B&R7MOo(ipi>rj*}tjA$uO0lS5PY;ptgIE>nk(Zrw{74YbVe4eTX~7e1^*B#m z-gl4|XJ{{~ZNP7ySMv>O+~LQ5K9=Jg{TIoRM|j@SMp9f7_w%>aA~)-;>wpYl&|@!kr}rJNw=3goniM+r zPo=J!ag*CmPM6`9s0XWg9%4RaUJPLUbo?N{FJl?&XTn|jdldHLo`};FEglKJ`yxfS zsNZrGDl=}Xer3HDJoM0o+tkMqzomFaJ1tRx+1yW5vJ4qqfAv^3p3~pHTmWyx`A=2h z198%5D?Soi@VLuZ_pX<+;|pyCeE3Qny2OAft*Ra>asTU4DP-b#*wz4Uhf_ygHKGseZfK+jo5>r8X6Yg4xbuM=N@A{g z>_>?&a(bX42FB^|AM<@xT|2Bi{@D9|C|NgZsZ`K%+*U(|1LU0#dkiqp9?@HkqO3b1 zE95ZJ*5+`-R8!0=YZNhbfC-PeF0nPGu+VoDa6Kw6p zeU&=+7?;M0CIsnEeeTEkFzUvYl+{bS&)nV za_2mVA&>n2DnouTPwa0mPGViTZbBW_|BkP;C@jvecmM?%XTM{OD9_yR9abPa`PHBd z;^c7F?KB5s$S+^GzDKC9BG~U16ZaFJHllb<(eIj2Qmkt`J4z8B=cOiLt=+N7hdtE8 zWj{Glj{bsCe!L+sZPOT0lh=oJ8kDC$_eLu+s4FJ@(c>@m{rV(1Dv0^tsz*g)y?1J~ zVLvhAsuq37v+p<$mFeI3+72D-*5gY~M9@BMmg8n)abL6(`NuIIS1RGMuuddvQHA3- z=Q~l9>(IRp^#twomU?_@#`BqCMJLXy@~sXv=x@8g2s86{Lq7{@iu+mXsnC&qbbNLl zqG@{)+?Y#Uu6%Al4DDH;+*rut_Vtjp|M@>P(cCD-$PE-&iSf9Qn=&&7R9;dUg@ zem&X)cM_04NsS2V=wnOeXiEQ$OFooJWk0q~hi?3Q-ja-4uG`g-GMr*R{Ijzguc#N= z?zEygx8K`W1ygJ4mwQsQp#7&L`#{d)+x6rC@q3VmCbXpgWP}~Z%ZlGoNzjV+sfRwa z5qaNAiMGOyP@)z0KQ6(AcC_6lH7+~Eeftiyr>!39!yr+A4m)v@Je9mvid5!tgUXzD z=EH#r3UuUlZRYw>m*>Crn*(N^|KUs*j*(X;uXA8-G3x0uL39?|y|f^SSRmeo7t|>a z`q`=Mo{W#}WmcReRV zUt-b#H~JCRHPN9c^I_>!8`4A^q^dEnridpy28riw87&x0>{-u&o-MfFR4?*yzcY6^ zFoOQt%N-aa;&QDTJ=l*#ymn$N?X;dIj1zI+O^eBbe;$x?GkHD7q!`S;?dni3GU)GP zk>M42tQWOwChd!#T$sc>9lFbgskD19XI%1nmW|h78tu5=a)j_WS-G{CK|A7y2Y(os zK8FIcX!}RVv6MRV{#*wdP4jwKgE0eZ%I(YRnTnqLAPU z<3CJh$9%D$ri>54cZ}DQjK{>1Dy$dpUnjRLrGIwcARaSL%qLi9XiqL6!9)_K8j|3o>gI`n4kH~8!_K+S?@RxorVW+gL(4baRs{Y`V~7pSkL&4S)s%lZZ|bT z3Z@)-kdziOj}-qr*g*f5jy7x}ZVS_63(?AcVk@!g8tOgrnB|xoI`*HgNE5cxf2Xz< z&1*CMZ(FgGc9AptL-BL_6xz z_%H+ZaJ;+CfW5?Q-vih$@+e%6BgE_7TsS!z`1;6*qqHB+Rig^~xQZ{>2hi@c&5e_y zewnE=i!u)nt8kijzfDe5=)n1E>qiypx96WdI4}P1f6kBH;=Lbvoj4+GaYzFEW~kJo01(`1x)X6j)20 zR8VcldofRTCq5F#WV!G`{9lW87yKXE|MKK{;LH?*`j%(Eey`PTNR86&%Jeu^k?W&ki+qlSUwZ!^>|6KgJV z-QwCp3sj#Ohe$G^xW=tzD{I?6oe@l<_vuyebV ze0Dg92fnM2H=gm+)DIW!h0D!&NIfxXiwXYDtV7*`*sc=qA2Y$t@vy2Yd}BQIiwWR6 z*W+ZI7o(>F=P#P!i5Bm1Ga@(RyF>>YytJ?XF`zx`=@Ir>KHBE3Y7`KB+eLvI;`_c_ z7F6fFhWzp3Hwo!nQwL^q9o%mW$i?jo?3ZIB^S5D6GxE@OJuo4Z82+1UOB~qGgCfK- zp%xS+-nzp+t_tHV&WK{Pogrr2pssqgM~)rjq4e%r6sJFx{QZGg@(y(&xkuASiqEXS zxf{w+xUSG2GL+)@qnnE*82U_n`N{SF-t783U#P?toD_qsYTh}a^R73GP$G+aAk zgQy^`+8Dq6z3Ap){6_28YcTIlDR7MItkg`3A|7WuFp~AB^#dR3 z(C&G`kFSa3qpLEU=Q+-ZG@>=<{b$Jl>Tx`#q6&?PRr5-2*`qes-qpVM? z8*f-wQ%AUv$n7qiHJ~YRt=EC4%)15oC740I(kgHdv2~n4xsd8;L>gt%2UtD7HQC){@&CD9f;?exzUmM z>>YJiwD>)=3SEi&M|jX(TxWYN#xOrRXW6iv>)G#-4*Kcr4?|Sw$#Ll>J(7sc6P!pU zPOqXyCB|Fz7e=Ir;}6&47W=To`wH|C-y82Y;|0&BWF8Hc@qF{=@}r@+?zS%UB`PI$ z6ldKW6JbKXXz_ms3-(Rp=WaO>$GERu!i+Tf-z?FfGI^xxY%TiJjw|KIKykcL)H{st zX0sTZv?Bsa^yIqjuV}#t5f9&4$JsA@Tj7U_arwS=0K1Aa&j+b-nte^Kr2(9n3!J^B z#6)iYHE2dU`{V1Y-Ka|*$Q9$jBynDPGn~{1Q8V4h5YN%SEx~Ti_2sc%Or_n5{oFL- z-EAgJC$`;dMRvy1$Cqj^8R}99Hv+UbgV1m#`&P7e!rV#$A8>^iDeq7#Q&M@8IY5DUsWrJ4T5Lu zI$_{^7F#00M!^%smDnWm?wAn|+26G6XUAXi?T&hKY!&Oe*N&PzuSbgv|Nm{aLFK_V z`maSgkifXO_rZ$;)TwK<9_*k$zC;jDxqa2DTI{5qJ&m0 z@AWcbGx-(IOgKjW1G@|pM*&x?PMi?y<9Fi}vG@-sP7^;B_2L|HViPYGlBWanrI1n| zJ=kW$?ZSY3jRbb_{Q43BT;O(#RW6Jc>oeMbtHkd%_CwXGg$j(rw_#q~ z{eQgpagUhr$A*!NNA(gf?$h4J*n2>19}>iR#$Cn?DYlDe%{(^Yk=XxzHO7^qekd)) zW7>1Js_=yPQl&tah=ZpF{Gwj3aoU6#QNWWwIy|S}x8H=<9o4A?jgC6Qtt%J@QdO=Fm@GV)$dNo=(onpAt&aOnh?%DrG5u5)U@k1 z58@T$crtazF7i`ew-Q?V8+&Dls?7LmY=NKrEqP&sf&Oa4WT-@*P|mTVDEroCedI9G zFB@ovgIK?f6K_XyUdJ;R8CRvI$Y7#wAMlEGo#TrlRY)Tr45;Hl2KnsMLiVck-#@9s zV$t{hbiz;jdz=*6hy(u0k)61Ik{7uc4}QH0lpCn>!G~P*-#Vs1ZsL+*3dD;0t784g zOItOQ*GhayoxW#+c(0@pYe!IiE@Z!uN7Q`>3UGXk(t^W`>t>4-2&Fx%lL1`^^Ej*3 z_{MoWaEG;z=bLrFfx;ZG5%0$Y=GmU2dW6xw*ei&l#7A-$iW5tha3h?!IZBCA#5ETc z_|ADS?+(B#-qSowf=cw4HEXemeEdFKg$OaP4GkzsJz-_CR-s+;qyZBXML*|9RoWvn zT&P2xpSqCq$-cMD02kg+Pi!ye$MS*HcSW>lFP_^jv7(wdkMjy7PXX#2QermqsUR1t zHqT@1fFP=i^Ion%Bym@EHHtd{ZGQ=B(0)46hkg@9ebOMB_S65r+*^AmmiIU}Yq5Bud+BaJ+1Zz4xM`Xlq%aESUSVRirwYKiwf z1kjQC*fYtD#ev0e^%!Ov9`_bsxY z=XSZ(HXLSte-5#rGwouD4ov3!?@e-{EA5zQAF>!X!#CM*pFAJ7K#e3ZKYlajlh@Xn zEQq3xH9t_G7yZ98+-S)DZ+@f>otdBNsay~GqpJ9kLfkXUfxhCoa-4&4)H{)Nt>{Pl zPj@BOG4HFKup*6d>1@qDi|gHFw+&|*|J6EiUb$V*WIuMvs8cRVF^G1D5Ci&A7hMaw zkxskHIW2|~U$b_N5dUxM&iciEV)q^+M$ry-aHA0W0G&W$zoB)jfGO0gohths%$@<5BbRzAFeirQBb2X$F5^FfU@ z#9}Ya=tQn5-C2d@+-~C*>Hv}di@Cmw7)R6G$S-9aT(@Bj{jO(LwC>CPWu6RcX(x0g zPmkg8tS;md&#SY`u}(a9YPJ%2SZ@+LXtBPQ=r1*Bw?KR!DnUk5@!S;l74+w?57ZLRDGVa_GUo4u05Vt~rr&1& zEBI}K0mqp4WqO+s#=7-xmL3Jg{|Q$ru#4m6*ta($pC4VN!d}{y3Yjpj9FV815yM$C zGm|yYG9RjV&1lEEbmE{A`$YVm(%=B`h}4gVT*rAq6|!?3TZFrDjQ+(V?P$mAuejTc z3#_Xr`b%+w{>1uv6d+$Vsqe>0k$+3INM%2_L;Np{eOOty4X4Ea38!kHpswt7O^&nT z|64ibh@y_W_0xlTJinB}PMqX*yeqHADAthe*KD{@OT711fs4cmi7rT}C(>T%QKq5z zy^Bc#$Qx8)-#No`+fC$1}m3HYXl(otGT*;kn?)BUFO^OBH6rk3c0A6tWRT&<5PSccK${ zu%)8cTVHVFBk@X#9G_~5?@xib)H{nB+3=lq;IkiN znA4X%Ui>GvtDwXW!2^@r_({Bp06gUR4pkNSM|*)x0~dLE&l4?vir@cz)8iTAq+>}R zB#fWm^;NL4Khi|{@PhSaipqfd=HZyU?EA?3 zKcBjxr$5^*HL5HW?|aq3K-Ydw~7zE><(A&KkX zlsZN)eixZd3wMmTAJ~cq`MG|(rSQ?v~q#qT>Al_q4c2 z9kK7a6D4VHYp6lE*ne&VUS(3d{58SK{A#q{j#Bh*m`wg>f8RXZ0XyS-UpFlbT=%Hq zK};2WLaH96x!t*!UX&+RAE`kF@jTP|MpPv3&rqTgaoS)nDif3SdPESHYpke3ytmPV zs>1$ZKy~8%oCb6o&hzZyMHKD#>~A7?+!yEV$idjmn=V7m7;)dF1+|DnH!3iT<0sTs z{8NxWr+Q&yU0t`@hA7ti75M{bPkt}Z*^MFO>yC9*h!NNI#e#?Q7b|H%EbZ=@4ou+n z$Qf^;?5Dd$TJVbdo3+M|IB_1yUVJC--IY>*@OZmc8!(^sKle#14v}v|Yie+i&| zXvpmyC-nG5zBoU^fJ8CBu^NOyQq~6(D(S@em zer9v>LkDp`F1dwv!3ZDP6N|LeqB85u%xEt<(th&Div;#%^)~9zmA2)n6(eY84N{>S z?YQs&o+!od74_&&yVD*$dWiTq;>BP;&~9!3Ey#-{Behs;r!MO2K@!K$UejU^uWQI} z6?)TltCSc|{;Ag0f;a3#POQ~q1lQwZZ6*B7h1tEG=p)vzzX919M@`CEVP{_JW-8E^ z{@0~!=trCvs=*`bvdDN3+Vi-B;?zi`|8J@RwWwnjlB?HnK02OIVF3Lr8z?cE$K4j` z#XzwRJGJaVxlSQ^?4sU!DYxM{b(y1c5Mex@MGY(%F7jri6nDv|Pg7->OVhS+b^oG!8mb$;~N#8vVOhYDZ_Z$qY{Id5F?%k<3xstgKSE?j3j$Htj1jyqH7Gcx%9N&SAUJQY;jCH^GS|#Kv{?SVqjJmSKhHFB)0UbOzU{h#jkF z59s8^1~cR1y8)|dpEzp48sg~j21u!&yVUigwUK-{RgSgv|9t4hjSTW+P8p_AR}?(K zJYigW8d$N8<72LQ(3Lv0%~3tp)82YefeplOb$sZ{yeV8&jjgmlw(%l_{h_vz58G(> zr}j=^-iRRCPW#eyIqp+;+-D!VQ(WgKCk9eyG%RjK2llhYEPh0AJ@#DYdQw-Fo?^v* z@ws^t93Xl|$Z&{w=$H}N+1Kcg8E{zar-2_w1m7O_;Hb!xyKWp8aZxFNeVmu{_Fj1O zT+fawoTY#D2Pe+aU#O@ROBhG(YEB}&-8r!wF7YPFcvh4VeZi)Zv7ZtO&3_Vsykv#xU9@6>W32lI6LXDyzK^IAe3 z%IisW*syK6`2VXGFX*rDw_>pP|MyBSUW)ZurNgTj@jbQ#uZed8>|=@P3JVG_E~jo% z;-iSG2m>Ohmu4q;kz0IknC`+SQMbqWu$g^w#eY`(q&?VR#&O2i#SR*TX6NT>1@VXe zV|C;>$@6G1%!Zb?^0a}{)+XQ z&3Y^9etsj$6{4Q(qlP4w{WWYzVSNsMW2|s~_J38ND39Zhupx~)GHgo#{r%#792UsA z{oqD+sEBR)S|Oo6>XvE880Oif7H;&3vE(8#dF^*(9v#Q%Lg;@-WN42 z#HCRIEGi=IGcsYQxKA;ZdW!yEk7Y1$T~8>aunT*+6W_$M9>;p%qCKU&6K>*epA7%8 z4*p*2Mm^@=*WWI5E6F;nlf%dHp-qj5XT7U-Uk*R*jP7~_i46<6v6#G@s|MGfI%C5! z3zAt^4!isa;rPZ2ehjmV=b@=lkox4)cQ?9I-~augKu(S~>*hivb?mdk8Wahzzs?pw z0s7q*_FwG(+Pu6)+%*Cy%<+-zYfjQX>zNJZI1iVWyKsehx1@m+VH~g1#)W47mADXFQG#_YU9t(%| zu^@%{8>tK;g6BK7hYS_ypIX@g1?x(m-3n9^_mk}P;{xMn$rBHHa^4QL_M-~@TYCA> zmHBx7jRcw0)j#VPFqXQ=R^5nd98bAs$2Z2u>Ge`nr)`}h$E3=<-t(OMSn>NjDXufV za~1KS2JOU+)M>=72ef#^drWO0xNvtnp#QQc(3e*$lQOS*Vqo{M- zKE@3Ge{V~D`g^f2O`|?dOmVPxA#adR5{Szw{w|8=8-CU!k#V_cofJoD*RSJ86OP|9 zTQNZNc>xPr&^{CkErkP`h1G9TKiFZN9;j=AkY8Sbx3 z6Eh}@_}t{c%_Zbl=KX5+PyLJOkwO2MY^>w#w?22ZA(M7L*7uLBFP|T)FrD_ZDt;)b z_qR6n;&@Z>y`>JJjH`{~>^Q6x%ga(9psN<_0?EI|B~-Ubl^Np9wEm% z+A%K!$jR~T;ckSJM>;-a?$GaC9>5{;(}E5rY@)roy9ejR|HGC_v6;4IoCR+7b1N#i zu$A_#f;LQL9Hp1BVu#4%Og+j`PmCC8z;4=)GTdl1mvOO9hMClNC+D-Sl4tr>3t|t) zbywWj7b~7)qr*Ys*<1$X^D=*D%5g-@XFoZ{Fb4BdR~{945}`vsuG{7DZX6Ta3#m6% z{Jz$LaO#-?F$P32zOI10%yFMvjnl+<>cdtOSVxmQm`#3Km)nhG@`>e>4`;;sQoo-g zCahMY9r>wjxCLAy%p4L#PM&X`|Gdb{`QKJnhB-WD+lLxVHJM`CHrNDhLKc|)G!}@sNCBZ}5 zZw9&Xh*)Zr9#6!&pI0D@SWv0L^H}ja00$DNN0h1{Uef-YPlih3S)X$Z7{d6^HqnT( z)E$Fcsqu#6m)n?dUwpq7ZNXmhRgQ@=yo(k6x(^j*aXr*Vyccm>S%&9{;`d6_)8f5Y zbNsj{z7Ni4!$*z}WS=@L8&In;^MdQSf%WPW{l&E=DB6hUm>BStcIBoP)MK3f%k9BW zvEIF<_(l9Nm;F!z>vNI{M%JNq8yxsef2G4-{2?}ds=+lKG4D``mjgrk%>DJ%@`-1M`Kqb8|}D0)G5Sa-KA(mUDrI- zj$E`i98{wW^}yIW666u@*ZJl~zS`pca}Np9U58=puN6~(D&*_a~X=zo<@CM zl=$-tL~U^&kQ?(yi~EB7C?%eQ zR);)FzFIy?ifFFSsIq#vLzvG>GjeggyVua69JhNOB|&-O#APb1q~0lY+J&psBf~%W zVdwhvcwt5bj%S5Apv+Bv>S@M5j%S^5qU<>FyB#Yka(wt38)j2qE^hBZB{9DP-H^={ z+k3Etaq+RJ4wdQe!MfLxx_$NxAF9!Arq-c6&+Ba&FRIgSA0(ObhlU)bIHjw@Q zoj{XcX^=+VC>T_t2JPy7T!s#3A4g62=>ATJL1edoc~VaJxb}_D77L zP01#7qb<{WAY&g8@kNC;K`#*6;jHA7Jgpd0Wzhm`-r52~Z zYLP+Pc9M0v4|D&qAJb{4O)z1$IIf1dz&xFl8o(T}|J6>+71zI2g-`5LE}diDr@i8j z6b9<<)eY@PWWEk)sla?Ozd;QW$%CKS{45mf_d<#Gysq#&DqJEzjr?H1RbJ16Cr13^ zbzdE(#S(FzyWLnyluods5cT7xVq9;|zn1;fGWvT?4q!R)&tCZ6R%Eh|7xy0Srv5qq(2G>o|0%8Y zIM3}(1te~-&ewhThy7o zOfuY{{h_EAqbVrr{|(?4?al?f*uwK#oMFXA>e$b(b+{|y`K%uYnb$eEU4H5)he3;M z%>YmOIt?Ztb+1MFQs5KEOe;v+HV9u3ZO zyHTSI_$>OQ^)lpUA9l2r6gSB;-)hM5AN|@*?AwNO-4DnSC;IGLT6{HAFHq0@5b^Uu zhe^ENVOveu!#=P{HwS*v|1#2p?c^a}AqFw?>tjZ}?<~izpo8C+H;;+p(lQ@2F2?J@S8=*Mtl8K z1Kx@Ie9KFajd6b_w+%;fk~b#k(3scvu!IKVi0;95IK}UB!`QF0uKYe|gPXQgVStC| z*=t5Db>r1GawG`-I?aaF%px+% z5&_zS-UeW(4_v6>LJo1All90eo>!CGi~PiiHJHoP8;jUq<{rkn_u7L3^ry^LpbhQa zpDd`$xb+522&MnhEj#iK7tc{LBXtn3KUR+iTv?3-B^_Z6}tg7$-c)LE>1J9_zXmU=33n;g~YFWo?b>jQv0 z>jycH)TdLFdc?)y z|Ju9}uRCtJ0(EHXTf6X)G4^brlp2b>M14M!`Bcs1#5%5Tk2o97G5<=v@S-laubZmJ zS?Zmnw=$@x&o7j=pg#Q@c54wsJ?2p>@RSQ*kfN^v{R6ux@QS+pQ5g*y(muiZ*_ha# zb;LrxS`+2PN%mpCshbk$Z@0#a-@MLgdn`z#Etzk}1?ssjuZ=j#^(-u&n=1A@%Z%pY z|3-cvHd9}Dx=PW4_Kdq)3}#%#t(T%1`>G*~vsUz<`YFdQ>YI%!IYv|^4;}NNjmXai zCbT22E$Bi=VwLAQbSA2II?cu!spW4(xAymz?3dN1CqRw97j z+-|4Tj@~21`x1TVLwi&!1?1F=u1wZB*3D*BJt!;ssAwt9)4%hE8fhY561^Bg%-c$a zEb6autvnb?+dIaLVZ^5y3XC8=r|!7Jam`^3X0uM8x#h)3`hVR~VhnNDOC81%E8b?z zQE=ISqFR)6DHCwW%OcloOqtT1{uUUUI(TUjkg_` zMjXAsgIUD#-Glf>O;zQ+9qHVEp3ZjcoyqmAF2_8P*Atys#r4}2v|=Ic1515)z+C@0 zHh@L6FNVvoRK$tQhbX6bud5ao#+#vx9Lofc@qB7=UfQ2_z{1ZJZbSV^f3-UvtR-f# zE^Z{AJ;C}%Z2i)L9mK8TQi-f8s|O@uC)5QD_*G8amuJFV`WLPB;hu}??4#lt>V&%TNA zuyv~p!3frgLsC2yd~(Kw`K$vTZ4ghb}T6?h~3CpGv+y?VuNz#b3#%1A%n(Z9T!9Pg;h!u!~;q9U*7hykQX zbib#=XV%?Ab9IoCe|uK3q6&{!?Vb|v`MJ;26!=Iim)(Mr7Uows9X<(uIitWA;>w^A z5v&jE7s&Bc!SmQ9#Si+Ea@gP!@9n5%#&6m+=c|y5b$wCCAT>Aj0{ex(#A7KgJmq?% z&9y^AzC8I$iGPBRJ87_;{4wSTbp!T2+`}#sl4A7Hb9-q>3QmEq~hfMt6F3k@O zF|v&cM&k0ntO>+QId#a(zTZ$m0}t(}u4c3&kF{!HK{nctmUEL3?JMrhxXlHM${tzXXMbM1h4b) z00r{VUoy#yLd45I4A@?o^HAE4!nBKe-3W^p&u=$kBjar4KQD@Ky?!Lv@r3KQih6e+ zrOnuUK@{P3YX+&2!u47(fc>sRJXg+xRh7j1C9Nnb#%F0!jCdfs6lH~-WJGS}WpAw$ z<>JM2w)}`7zRc933h`YX9Zsj`<6m7p(i<-pF6W#bmeN}p;6S1^Ew3Z@{7}CUr zb&R(oCN1jHjvp<umd7idU4oqe}f0E0A791~h z(Sp{*w)gl)EZ$I!7p#?c)2IV!f0byEow{n!cROygPwz59i;nbPh$p{`|C3e?qBHG@ z0VTQ+53>*G8ZVv~W%3fz3*vVXZW~6?&f4t66k_kS zZe$Xl*D|3Z^Qy^f1*((hyT3Ex82j>-*<_f(an}z!3iG^PXKFA-+~+b%i<$J#XkkYm zo`2_dR?MY+YOV^0$q$$MvY(~hBt?p=qEAh?<0j*)`*S@OiSsEe!5Hx#ESVBZXunAg zpn>>*`z^Oa1^f)UC!;Ig;4#sQ)vd4tcwS$%S)Md7K?uG$5bm zquyU7K6g@u-K@tyQaxBryXiL>*2RnGCYy19>)2yw|w444XvUZ}36WRs0^!h%K~z0S&eh|K`^qjJm@W&|*978duEN zLA2@|I86OE=d2P7^DuvIDX@$F{=3b{7*BmV(vBGMy+I5F~_+FCnwn__12gv8? zuuZ(T>bo38#dDg1Qe5Zf27YHhNxtv>S%uBi?Xzz9v5D)ZsLB0^yk`G>lbF{d!6nAC zk#pFM*E2ku53RB@Hw&xqf$?+skq!kopF>7jagW=ZEOxwPo%%grgM-xnj#DN~U>)>D zD{-IW#TNRIkGysJnjD+R-xU|DF@<>(v)_s_Lq(r$#ue7tx|K9|!tFDtH=Yuk&yXOC zxHi8Yv7Coi@fy4q^Brx(I$qzhoEE$lb*ZBta>nV{OA@@N-6Bnk8;swODL#A@b*ZTV zUx>NtsZeY>up(0m1?$hYVKU5PKX_4V!Z(fwPbnc|uiYmzfbX=k%~oQ0J;uisE&ijO z=Uf1Ph-Wsc@K3CRTRcpR@n^O{BKmLE`BCgE3cpf7N_$8pDP+X{A7qddM=w+1Ci63T zpBoC=HSgQ-gLwav!gnkd1a*}8?RF;e zGx3-sh)TqkXAG!JtfiHpot<@a3H57V@qcC3XXbHVtr4rpJFD(Eaeh8^%|t(rv;H<7 z62LdkW8bfKR1rtEj2$dgIsrO1a)rhCPpTS#)`1pkeb27-wpIP4-zpIC^|EK?b(2IJ+ zryDeQ$GCS+*Wn!NY~$}X)TjT%cM0~8msbwcqA}06+72Zei07*I^1w*`?AO?bj?DY^ z)HMz1&%aQQM#Np!sS}B=4DuP*t$nx^iL^)AoX}4a&kgs$%sP|2h}X^faruoKO*mel zNB|!g=UYCqpN(c*Ew!U5{d4kpVCB3O=pw-d9#_9shb->r&}B6;hfr^JG2;i%FEqOh z&&eyMt$Dgf>!+ej^kF`VH~%3;X`ZMk^_2dVqH7c$d0zO?Nb!!HGsTiF`*ar zh6oad+79mHWGY7&u5B(14`cmD_2GxsgPCk}ijj^KU<;LLnZ1 zd$Iw^^ep(abp_dcd|AT!(9DnFB3>Vwk-~obIp=p(Zo$7&wB_e*1%o(Ap8i=nfDzp8#zN*T z^C1108+PVXjx-%c(to_H7nXYBeAO5&;=`dsC-FSUUwVw8{g%fcN4%D#Ln8OvnEm7g z+EuB`eAH@NPV3Q>@$fKRicI?R+z4Q*;E%#u++rR7`PPW(v{gr}m?_5RvCk&1ayu|v z9RC7ii+FXV0|z5n=QG%6(+>Yd?gl1=v0v%4kbTi)>R#53&a6+RJ1DS*{Hh!x!*=re`k@YN;`URm8Z0EgKX|Rf z7TU|KW>lZTzVDa=+iAyEQesCPale=iYZ-T4Hpx+6%6_1~4?F3Jsu05Z zTOq}bZQ?$x{5o7FPv2T;$8K)dTkpUD;)IqeToB)<@3i3%ZRZXj4igs_c0j`Zt{VH^ zQR2eDs`_+3rtHaCuS5zpB$;;fj@ z`)ZtJ-?gH&6cE&;Ni_k85JxZj+yF-2S-&H$h zC)ux+C7*AB7q@9=&u7Lf@ngboO`cEK;O% zUHc8w$$|GGE>2J%iS29Z z@twHbqDB(qKF@k3e$dXb(uCiFpR${w=R6*GE5{#^H%cwSsK@3lu;4f~SKZ@AJYybC zdgp_rF8QOC7gFNLh6Yq*{Y(5PfsA&uXdBwGkNVY93q@V=96&eDi@y7%2cMa*>!YYc z7{8lJD)E&0dODv9F2-ryKTfnE&t!KwpyuZq3{v4C_f!3i0b1JSzj)A>Jl&+D1v=W@ zTHByc1*SBTpg(!2+yD#o^l$K~@sImkn#~C#?emMQaIi0ZWDCGTJ3Z3`hwz`V!%6(} zNQOlAdH1{NQJ?kGT;B*U{Z${S;3F>U=|>d#{zk(fLTGQhra*3@Y=8;*i9e`^Qh8p% z8(JKr-dN;PqB^fPy1Wy^c%3f`sF6YaYcjDf62HgmW5OBs$JNGru$+Ct`dc>4q2BA$ z%ZH*IFLzju5#;4o%RM+s{rusD1jXq8waAHZaXg<9&E?{~#txLGtsAaEN%4EzEIG!F z1rpew^d;Z^YGXthj)(nZ^0U7gb<~Bj%$wdy1ykvQgn9k*D2 zhgA$>b_eSA{W2J)u}^8EMHI)S(^;3rb5X9FFvudlCkY~s`^($Oi5QOOucCyPJlB1; z6*tJ+P4cNxmbz>q`_EYMf6{c;Fk)UcbCiAa8}^@d$al>S1rSI7+Mg=K6OH4HIKh0W zQC)`mw6~}<$ms@ah7%2FM`k$Dn0R}*36vUWc1(*VwEsq$QMLl>%2fqU$BBMIhvp() zHkc7YJ(8j|AVNW&neIT(qQHOAYP96|@HG~A8u5H<1ksB2_2v%r;&n`a6o89-2G&&v z>+;UcDzvUEzEf8qoOzYr&VvrLKONVi6LI_l1M0DEF1u_*XWAvnuM>y|8(Pps#K9jq zx)Ph03!+dh#&v%Wy3;QB(}%7+@98z1i0AsvJ*h`e`k%2TgfhO)zp&#M>+0uwQY6!_ zDP+J_*59L7nQQFxmbKJihk^0OIOrqhIj;?UiM1YSVWf^T{P3X&`>E59=9s)ifGpvEFsw=|CF&bG%lR;JQU0bfZ7*HT&$?zmPh!Cv}a8rz$q&CtrO( z3&}yv~-#RG7jZC2NQkQ3YAY z$g3;3{kM8{v|_&2SZ}~eah;RBSSxt5iw0+$>;s2+u|eeZLnBnwrT1FGDwR|>ca3bejF6%*~*ETjO&mP z)@$;5Rf80VMIKDhU?11XcG-cWB97Qc949V{QA5q^ZT~m`>oDqFa{WpASMB%Wyx{fX zDqIx#JzT)#qL?hD=+Z^Kf~yLpxsj|8vh@nHn(dVQ%5F2?ufST~-Cc-bjOmf-RB zay%m*+ZVtV=7`hn!gJaS@>uYKn9xU$M6PFjm168w2ah7>@E59GF#JZ;$@tSC#Wyc%h%`XaMvR>~>H{u6Bf32+sqyoISZo^xS zSDvnhp7X!b7{Dp^wI_z!aglW=G|r9p98a7sMW}e5%{wFVl4lzKwBd7I@q8Z}+{}x- z`@Hxf*6{;RhB__U5kNWC+h6SOzSBSVq6GgD^>sARlE-THGvO!gfvZ%w#$2hyAp1po z^#u#$oW~a5jQC6Y@G&p`)fLY{AUSY<<1RaKZ#n1ZjU7_jqgzPOVH8kwxCJuWmt*`G z*IxYITL%NL_v(2wpENU1&kQxTu*PLE7={0|+6O`|HDh%(3GioXA1@ zLz)&ji7%yE+-03qv^Ag$&o9`>h+Onv{ij7<;(y&8C_r4an;MKu@sM?<5bfi|Y$!r} zY;~Y0KR-Z2eiY{cGpwv-%brNoPEX85pI;BfBQof_6YtjZAV$! zj}H0JTRbQ)+=dA9(6**#RG`0QIVCC)b60lbG56bSg&Ae2KL$`2J!d{9=QW{nJ@K3| zIUT>lL4o=-O8R;v==sHnB-zyewLwwh|4KnbRs^}$4es|{bp^B#71Fpa!Ca=#fpIbL9q3rWNgu?DPS-p{XW zM71QY^F$M-dH~Ni6?%!^r84G{iTl|9jikPM_sN4V)IkFev2N4fxwsWl_KiKas?mj7 z$#ct%zGA+f2aucR6F$p>xYF#)m%A~T{?cdt2xtDj<$lt|bGjc$QIFTXb-Now#Qz!d z=`ob}sTlh;^7Yi`2Ha(Qu1IjhMXX#whrxxpevLGkO+IU}Ns3&g3N`!L;r!f2nFqhg zuVb^xahm)nX>R2~xP3v^eU6`QJ@H&(HO4Iv?^E`mKd-Y;OB)7|7d~HdVgkqW_O)V?h=|d|?F-IJ)jScgNk(-$_#JgcebP@MujrL-R$ggB2Do!Uq_VQo_?K$Fm z4PruB7yh!3Jf&9Se-G^J&$cGwQc5GD|MSTZED+2Z6kGR+qRL~wr%@8^Lziu z=X~bwW^wP#nKRGs-dlnF>waj&Dz5sGWhOvQm%125hbG)Zg-)^EE zztDy2`KhmdnV}-@51g)mN!DpdZNz47Z(iGrG`!z8K0UV3ZW_>IyYLak$873~sZZS4 zDdSw*fam1T?laUfg)Mfzvtt+A*B$0E1NM`%|BPyh#KK?c#h*7cBFZH4@gL$#* zITP;j{>}#jIK}<;U(ljEc{s7W4QFb~dd>zsrQOM3!CBgdcpsLNPj{d5!^HS(FwBI! z)Mwh2AzbA4WPKDa%YB@6BD>5l-cyUkrKt1i*Vov-V}%jd#h-eFaYuMDg&CKqXa6f? z#68+IOOV4Qf9-Z+D)aJ#3VJ-I9lOMY6|7hHeb6ADJp5*N2tL*W=A14(le}}>fwuDA zYziNm%KR$4=2y~xH6!Rt-H`620;?tePW9t8+yB6f2aBnz>uHdK?Wcl9yb)e#WX8sH z9IwfGyr=#9svQGaKeb<~z(?Bs-@1^O$6k~iz$NC}<9l^zL4DA#Ie9_G=arEfl>OPu zjMVI>B~Aspvp!yw(TQ);zssChR)l_bz>ZI>Px91r;h&7-J0(1f!%7cTn9O{hy(CG9 z<5ZgUg@U-_sTl)!-($W7F{KylkGwjl*gm$k1zKX0V_{f{PwVMmlQm$O-@dTkYjfHK zC++72z3>owW%Ix@hk0*j1RcoB^U3-37-vc6%i}mv$-p55* zKevw_`Pn{yC-YgXe6OLxBaYJsr3VFRpI2ycpZ7m9cNm*Q{{~HnW_w~*CH|BD3#;&z z`Sa3y161VgE&ZIx!MfsOa|McV`>9#dwA6sI#5>DF_{o0USkjL2v}<%A-^skRZUri4mvs|7s3PlnRaD@=6taG!34>)` z#k6V+mFIm!9ndtOKZcpVDbwZ!aHdLqGe7zpU za?AYOO6COS-wYwdvi;c=8;aWG`MepmeFsJ-GEBe%dSyo ztQaEm?-{X-<8dgP3yrz`66=Acu`*vM>s$8I_byg6r`>6o7cGc0+fpwOqvq)_jP>_y z>daQO^Y3$^E%Em@8#)kcy;fie{bW{YE9T02adsyL}}+a{S5LzU4OTOG*EtFHV)`w2z*&V>fkklfP!Xka;T>`>~zv&T%?eHOwc|1K1(`Ta)8Szxp*I z2s7_rF<6P6Y(MhQja|e+6+PHZ%#+3rZBsy<-Hkfrty%X2*u(Z=4>i~;{!q|{vJ04} zcWSVKe*8Cz`ANYsqF&l3emua5L&R%y75LCbzV~OmF)zF=Y{6l+m$_<1e%Ae6iUe_l zc9Gvcl%&pY%>0)uaW>J2MI(Tf&%F4|`}tYIj?&CGCAS-KlG}4q2lr;2He6%FsaRPD zTZ6&WAD8NAaa!V~t^xztpFdd7FRv%-PlWM^_w(jIFM4KUzFbEC=6;LL8Jm$q0+F$jumNd`5MU5ZCyhY6TCHZHo5knbgiKS$YB*uGXH~tbYccaz(cVZsEvjqFmU? zxZl#-j4zD40y}j`&-Tq_qcDZ>Ry83AgM6Rc-;G>_fchKl$i(d_FGjGBTsAR}3bm=T z4+b>I%=Rhd$4uls()6_z^2sHd$JyUNP(R4esg;rI;7?G-E|;$Em?0jfTOH)`oAZ~%I^_Byil|5 zYi2Q{p!Ap3h>X-fm&UtLfae*?^A~1&w|!d7rp_F+K8T{UPaM=>0pq?=cjkNAwsuDR zrKBrz-h)zN?@*u`<3zR1jl6x>9M!?U-~boS>gH^Q-ZbdDve}fl6%ezLEN$ z^=Q7EYE+T=Qcr4-iM)HUy$MxmN3T(#rrdWf1-6nemhUwnj`qRtX1vNJdPjvia=+AR zb%|q#a+|#8l{WyNe5aI2hj_WpXcy|scn9@pBG;2vi)P|4k1c3UY*ShfCw1qeF)Cc* z|9|~$L2I^e`^~zZh#qRRC8i#)M^oN!{Aa0AsQ+32JmdZ3UF}APTC(1{3x7FYz295W zk@oYJCUhdUO=&|H;-!pUj3)LU=tg;!yw|J3aOyX^+JLTXPw~oy^5m~i!}YjAJ&>-w z5yj=X-v}o*uui-b#rR@PGU1p7-MD{3OFw!LZw|4eFY)97FZvPZ{S0F-{cG$fCrZ;V ziZ)l{82PSNoCf`6|7}4$WL%e4doV!mGuD7*smS|%wTNT>IMK*}^c=s$?{;jXPOY2h z#}Mw;wrV!rTVPBj(?PtEh83F9K;W!_75 z`t4CS7P5VOGIcR=`%EoVjFWEEk&BogvnN{NX1pG|Mm@m#U_xgHmJ3hL^x_+NrSx$t zx{jlkxNN~H;ejW1tR|*erNL&2qasn*O02mhggY`{?F%*1vR{TRvSAzB-yhNAJazh? ztzo#xt3~FS{`c@gC$LPduov z!~x;cM=orkJ#VZIMLCX9_Y}BJ`)Mx&hEw+sS*?MZ{5JO)$CUn2*6cvSFqv18d?(Lq zm)H?Knf=&8iQ~dwf6O>ZR2i77`PU@Yf>X3pEj8jaal-xp&JaD*^f*ggQ$2!C)H|ox zuNUdJU$2_5kK?`ij~*9xe)7O-TAr=FPWZJazg}uM4k)SDt9`hSybLCi6c1E%MZkx8gr3?WoD|pH$e2 zkJ2A`yzuvsd6^XWLi;Yq`78Zmd^Iz^(SDXYfNRWO1;;z_L;Pum13!tubOHP!PMX0% zCLc5(>%}ngOmbWhU#NF?m-OT6Bj#WRuT=wEDaUBQpC@*R3AH!|^f_xoBK_`^j#?o-F_NVFhM@@*X#&N45_yD9Osk8e?;9>8!iRt;HAz z$EqmNUg9vT8eOT6KHm-_6UQNN(TI+0k2$EtU3s2!+K+Lv-tH4Gy0CpjE;aVZchP@z z=tesadAkR(@$CqD634v^p%<}w5j%QIJ^hn$PJRksj$l9a#!YfrAGW^=`jJ4)rSqUD z^}w!VE&9^Fx66e75?A@v7(g^$v*8-^z=F{pT#@fvI{C1Vby|f&Q5eMSryJQYq_)(< zL3Eh|oU7u%P})oWgfVao`L4MKBWUl=EptFqZ*B5nfXvUyaT!nhVoE(Wu)bQGC5U%H z`JPRQMDhO}PK?RI_{tnXF6P_41;SWFzWJWXfe7_q^pFUqalfe5R!k?h%cR6inLmbk zW;QYX6(#1#^>wyjJ~2&n6c!QRr%+?D_)XggeB`Nu7d%)h@yobhMqHUcf@akBA4`y5 z7`Ks7rv4+^}kq>+6XEE=+*eHHqB7)7tOnM`N zylxwLurTw+WV-`pnP*Pd)?kaoQB5=Ihsjqd>`*X2xJ-8BUdHQ7(qOCb-hBsl5U;P- z;0oh!!8-+7k!LG*iNa19@3CR*CfTy&0y`ddLMvxzde=VX&+r`MqcU=`#>A? z9_oipCbVT8UErM$Pq_WVSmsp8Yj!VQ66b7m;1%)wZW~^UpTD%@4Y6=y04q9!3G-0|ZlG2?$a{3hnuro(5}0Sn(yD^MTj;yC`P zE%T>q@K^fnO9;u#Gk;!EM~#yAdN@vu1@B!W;>Z_kCfT7PeU>obabZPX+L3@%{iB;sCxjHZM(Ed?BgiF*1)e4%B zm-Zc{5jlCkwihN;p#JE6wkA1=z!Fan$?N*fbubNRPMsyF* zqcrjR+yMS#yks60LSV9(M~dzSp==f%{dzY=E6{7v0l`jWTb{95+rg zzt1j7Kb=^c zg17YB7O$MB!uIArU8o+1|2>xO;VzX_=Vqxro?4E!e~y+ z@?M9Q#DQ~FD9!zQ`|SwJ`v-LxU*eA`ba+g9dRs<~c9M5zn{k+R>7W}y%%?xTOz%N< z_S2x6dUW9Swf(}l#D1zoE%KT?bAokqN4D?0%{r0T|Bnx`9ms2$0!Wbg32z24fVh3I z1~aI`Y?Z%c1VRor|(y7GL-I~XvQ z`#YeOtnwn;e(PG9I@W?;OLOC6$;$+mnwv zi#WQA8`IBYr%u!3)-9{;eDj`g|1i$V&3<5bBc^(hpr+SV?T! z$%>WKK{wWhv6}Ym6dL^GdGGgfU=shYbZHOPO8=cvVZGeXBIY&mldn2#BL0_FiOmxC zLl}F0dH(Cf2bo{vtp~TL(+{o)C_AX70IBsT4ymjIz?FyC$6D>2VdH=iILE2l;#`eG@a0jFuFoN2-t;lpwc9HSoi zn$nFM{Qt%stx!|PXCGyTmG<|wYMkYMjn3F{j#%oA6}M$RhqGp!r+&ON%Z^0>^4cvE z&U3p32G~l;_cnT@rho5QYQqJ#uS(;@HDZt10X(PPX`0D~8?=o(RG2?qbYT=84hLqv zaH0lz;lU>}`cYTUA;;Wg9xZdgj_vv7dv*_Q^Z(9uG+_~QUCI+`+@byV1nXeppr|N( z56Jv49;9M?q^#w|eesV&UOb4C`Io5E z;~DM6_w{%#+pqXRNsgn*0lcLBx|j)1S+B3YVZaLNrPO{u-o(lGabYZLN?o*ukyGD&*|`k?Kd9yu&kEMpQXYt+T$ks@tAzPaikW1X)m;E@sD|++BP#3 zG7fXRP!p@J)*+@6^VusUO0o`~U&#hD+slm)q6c-%CUXcD+G(DKQGtHly|@>4+9|wd zxQG*eIgwdS?({g|rhSZl<{@fM8nBCc?O%Bpe6)Lw^Wigf$fSYH`{dDNnctP|#qRmB zoc^vO|7S=^{vhw~mES=!D-q=OJWm5iWIj;9j}YyXtcUM0U#9w}M|OGMw#|)HY%kte zjgh>+_D5|>4}e0xS>fS>xnCnhk9fCE~m~n#W`{hDbwx`>y!;|vB(7$eEqkU_y0rhyi zQm<{uO?%B}FLF?i7Fy>*etBqk6{XgV~urj9(vGGR0G=Gqz| zB+8UOIxEVuea0^>7Lmt(9XFyp?Q@+&u(y(UP+}0{YvnjCV&r$~*W^5of4(<1cz8cw zoIX?(ze#doK@s{{UOi68e1d0es4Q`wN`*$$pD!;uHc;2J+~~(XURRd=D%6qZD&0a@ zL%y#yQHwMD|D0`uXeRIXYWM$>x1j-X z*g_@x+o>bgQ8&{Mak>1CXgSKCV5P4%GzG3N#~ zw)6VFmp7wR9jOm}@RMhXuT-EodEjK-Ai0?Qm7qlzZh!K~hHk{ThSa~TLkqq%q6clm zS_OI%!-oyX&b*vyO9Z3o$0O`&R4pKW=tnPZui`NxL4LnV@5LMW-tv|neZ|js{$M}) z@g5cW(cU%Of&RqQ*Tbk%oP6HZfdRCyI;d%gqtZkW=KU{c9{(Wk86SzDeKVO?m-<4+ zFP{~so$~ua6h_c)_{@z_5-&YX7)@N&(2ZQY&;0-V$e2Lho@K#Unb(nZL@LI>zat)G zq+fPA??NKmRYiPwPdz;7C-Xn;(WCX4A^i8AT9Njlz6!L6;yASTUOTw;)Nr^E$w>puMN5ACt<+dR_+f z@$|RJVMNH2TeCT^kK2c?&|$y47h2Yit8CAqS7Ism3*6@z zNPOJ2VswA{#|8GMfjX~{9*5YDt|t6seHmzBMjF;F&juI~pO?p-smBp+@6+Fj-Hf|O zC(THvy}p_sr-*~o1#nTWQ{%v8IsRxnPEa4*{-eVc+Gd9l^ZW4lwg|4$-Y}lL#_`z{ zO%A4=wzv(q<@f_!_*t0wjJ*DW{ocE;4!I;x^aq&zt#ruTKM;#27cygcNx~dwEx|9 zM?>hwIH-_d#do&1-mAn9xu04=jN^H;r8S`p{cFGgHB!?DenlHtBk+7(wfIeR&vxRE z_}hLL{>gavRG=aKWn6g!f(3zYwe(Oj&n{c0!vOMO>wSJKXe{d)8}W;}=i9SCg1hdw!uj}+LhN#+(upICH8Vhu!H_nfFRauTz#&dW#qwA_fP@;>5V3!anj&u$7s#r#ku;Kp|H$vA}y z`MF<>i_Ae2=wCwuxXOD--`9--Z1)61C`i2UNRPJc?+!i&k~+RVYt86?NAR^2X!THuRJEFPR4_ zuzjw@j>^O$lS8ONyq(jCs>HY$6RH#Y3^GD%qdur>L5|uoKS&UrLe?H#*Z#&wqBJG23_4FrvB4i;*^hR>b}`Gd54=cu(*kpY&heFpg8# z_j%3y#qAYVsL+;JGOq!fm>2Ws4x=>d+)O3(=*0G8M*=v z*HdJk-T=mMd(9+0Qni)&E!CJnd+8rL?(=|c=-=PTi`B;JFj0Q5t?$5O;+)$GoXN_1 zv0E5g^3}>S%y(>m)lGvPC4i1w$icLS94GIP3+q49;xxxiqxT_+?E`cg%q7-auS9pA zXU1GTN^-v?6T+Cs_Ud_z=s+akG^BRi2{7GKt$lGFK^&dqIa4w1a7M*g}1FyRaYU zXpiwmkfjlI=sr7E(!RMnfFIQT>uOsujr?#h*^gChZ<5D~b#>)Ai-I*5eZ8U{JEY&% zo3WQTqK6v8nFnGgQXkRoz1o5;tizYs18B*99$j67IZ?7cbN~mry=#RKj!D0={_e%| zOd8~(<|0od8Bwkp+x7)tct=}tPlfly(M?oH$i@EJX~PHF@!wteNPLnQ#wX(O!yb&JUWuBo!8h6+Q-+bi zcq;c$h5poUFNa6)o$W7w+mM5Ktx1t6{G=V$1o4Ns{ge%VC4Rj={F8BE{n(rLH*tj$ zTIvsXq6sjj)ysf||2N=Z2z#f?cQ0maB+n?6J~-H3E{_&33y2<2qDK$mN11$u z*L~5AV$?aCvRdJi@26V^&}JFOwY3&*+PQu?;3Y0x7(#%!c$f}fdHf`fj(;JgCgQu98R`;dy; z-}a5*+)VmIoCPhLb9^^xkUC!GWmBL#D#}9yw?6VKnRfxfwht*GYblGvg_BX<|@|yu6+-PYuYz|7(6z zhe^y^0fh!fsb|Zyw4)G@)A*Ghg^9h6QI9W_@6y$9GCy5$_>hBjR_df4gVJ!XRBCn*lMjcOK&Li*bC;1yNP(fhtrZ zz9PSUV?2B)ro#d1v>Q#-sLu9MKSHQMy!qaZx%8_M5i-wr!juf)rHp?1_JYO~oe zjP=p89X`a-RwV^+g4phY1$Bsrmg!NKSpBFT_2XroF*lYF=SKl7nE?G6cHG?94*t}4+YUU)}~2GswLbXpu>eHCBU zjh1Zpj!*LCHB7VV^;hguP0UH@*S3GZ9Vd=-AQXM5(kUOc6)I+V(R4zz#t^r12HP=QAD zpUTX0eblH+eu+C8Ku3v}O#yT!p1H2UuxuR1r3Q4Ny?eb42{JG2uP}PZIImP;Bky}p zc|Yz>q@Ls$^bMRnaA0U@w8k0 z)FDygIXlJ;lgM&J&5j8|3@_g3~Mr>#MSJuJ1 z<7Ix;2z>O%o^x#2PJN%NvtbU5LOSGSTn=^`ag27|7%NUwr)Fr*I$7d5s|hvBGtO)3aZ3Dm z1nW5RXtz{$jO+(wEN?+~seAXR@qqo~ppi)aO7>anFBM@ zeCynJ&->Pv3&YO#8-1N{5REPT$VA>PS}_PxJ01^G!O8ZKeivNCa#y@~CF@F%pWU?Y zMmyml28+7kCH4+EV5b(&bC~rG{avxvh(?SbcM1=}^<>?6H*T;$&34xFwCnz-#LRRY z$I&)K(XKaEj}*jI?~T}&h5ZtvMoRexgt|O6ad>?{@-5);c#Ub~ybnxBPn~$-}){=UkG(vE#=z;^Or$z~Dcqn)-3{UM3*Fvg7L%xI4ekb?T+w+@Bs$@;-cT%?~){Ysr8 z{eIVoBE<80Jq9rzZTBOHrfoigtjNZ%=ULmqijw5JCzrLT&h{AU_Bi6G{fu*B zsa96hC05L!#TxoW`rLjb&ynXkPGpkryKb1!hUc>s^ZoDJpS;`jSkCMH<5Z!Ee6QNq z0=g1Lt_`Cp?N&3X8zf$eInbK8^N1a7h*_9NVyM4w`Yl*U|I!Zdqb=Jd>F|j1}Z0=4pLPKL*P8HG>RD%lmb9H{w0{MB6ojL2OS! zUc66UMaY05wA+_aVkB{x)&o~lS>M)%vC>}0iwVT<%p;SCyG+c#a-FLqm`WTsL64=> zL9LR4$XA==IxviB;@^`(m@eZ{Gl&^PWh*ac)|2_l{YaAgnP9+v=IvKs6gbN3-x1?L z35oypVa($8=iGn3#GBrUkM!F{jiWG>{4rn6dY5^|c1Z;l`zPOaKNfPo``fHAP)GmE z%zQ4_`^jZ?o zSS!bgwWB8MtZ0sZUgnn+x3pN#_H_eY*i3xbko6MB>hMb|?owxcId8`{x$eOMT(FXt zx(Bgc_;Y;#JL<`NQ3~uNX87d7V~+ExJT@Gr-RG4FuZWkD9e6|D_NR)%5!$v=Zp5(8 z*!WG0JMw#bCNGY&-7-pnj=Y{vUm{2rKOF7BQ`U=_>S%FNc%XU+rzLJTSy7+YfAG2q zA#PuCR*N%iFP=Auv&1-^A13Om2BWOFEdI6Ejbz3{q;?pks544dG~$X}|8Etp6LbBu zp|5<06&;1q)Kddl#NVhV&wawk;G{h$fSYpO>3%G(A>Sn%a7TWRxv9ZK);qmU1#p*k zrzgL>|y*6o`34cPl=0n3V6wn8_QYoi}wDz z0hK7a`CV{mH&{&4$|Bn2L|ljk>HtfxN~a6~YZao;zA`m(&$|9*_5-FY{o(!ERLVO`fA)7vc7{#nsqM%vy)%VLt?(8c~$? zn$Z`+lL}?%H%%R86sJA3NC+i}Iy>{4+|N7@O4pZpbc~4QxH&J<_vARQ zL#RNk9j!(TvC0%PD$4quM|@by@h>_ojIuI6A9YEktI?G9DC((Z#EsJ z0k&`)>%kQ+v|{_IP9_w{#W?6^!~({Bj-ocSmG_A^2hmRYaaR!S<@##*5u|@VDdmJ& z<}JUVLr1n78XD0_`iu3|g^|FZ+D>e3ChMx{kd=J&;iwZ`xcyJSgI!w2sZE7$w8uJh z=t2CF>_ksu-8x~^q~9neXwZxHfs*J|{WIC`K* ze`2QPLB#X=x(|wAfLu>j)ycSetp3Gb;gkfx-#c?g$hxuYg1S4o~+i$^W;n!qK1`A8+pk9w z@yG-hhEa!Qziq)R+9@k5Fo$@rsSk6B9U2-iW16f72r%WsJ2ZfK;)ex2SVXLlMTJD_ zlD-ZN7SsNgQjaCX0yU#x=Jai{`u*;PL9Zke_;c z=`ss;vwb9Wz#iiH0Tz5_-Z}Zli@mg`JXPY5#6v3PU1DR46|Z>_9HQ`RvRVZ}+dzrW;%k@>#yA_Gp-?$k1Z^Ta~aZMa12MtyLV zsQPEZO#c7*LP1=nmd{3wc%AK=3%PMu?)Q-w{TTn9)(62`#IZ3(+?V^^$U24fex^qb zOe+p_EE0tw%tQ9~c0A(t*K4&fvc1`BH=fWwK9l;3{TM}^cZd9)r9~9x(x28X4d5BK zU!JAI3!=V%1a+vBQgx0(M)G113cO`|`g1|NCuU}yp=5p?MBV>Ecz;<0D*8c<9#(v$ z-D{c$G3jMq7&|`6eH`cc*uObP+VEM%{jwV$d5>2*8gPsHEb+PzG4v1X%rL%iySu9o z--wR}Gfqd-f9pB%UHW-C^_g5pW*_3Irw%o6;dgy`e@}}JjMJxg=r7D~&Qc!yDn-2# z_Tvw?d$Q5FId0=O1mLVB?@c(csy+2XVgx-Ir-27*MAOg9l(j>}{oY(R;8=wDExj7| z)Ew6?4(QnaYpVuzI6m%`T0H0Yw@gyQAn(PqKa5hhF7m)id{{zY?#*ZnS0nQ|o;Q(e%$X zr%cEqew^0~5Bt}nu%r4gQe125G#&7DoFADsT?>;4r z7fY#k9;z^({*vG(UpZyIPB%(%zfylANa8q;Y^6du+C9G*k&k(?fzpTywA0$7P?7kD z^=xJ0x#>atWq+)#Wk(g-hk682ReqP7??82_3tAdbi`b=?4<|eD{6~$bO*{5j0Qc$7 zoyS=4lK$BHsS~^A@^}Z87|(og2oW^ke(e|P(MaaaUgg9x@?FQfRt%^AbZ?|VbGA2o z??4M;1GOD`_S3=h%#XAme6b?MB$@xqj~HIxq}d+yXMQbKB8=WV-;Y-zwB>#+T~1u2 zAIz$)L`T}yYABGA{^xA#L?_x43z~4SEb!l52c|O5^*hF#-ayuq^r1fa?S59)fwc1& zs0*2wD*g5&D|th=#Ef)|ufZNC{!ot|>kx%r-0!26{W_faXA`f3cHvpfm-0N{9Yi16 zRy*?|ap7_mwvrE=EkYPT`*5BhB8)Rd*nkX-qpb^k7{vCNMFH%k9~H=H!$JDpRp!Go ztW$zFR2aEG7=Gp}}(EEQ*+C z^sBrFZP?8H=2?wcCH|XiKz$xR@qQ5NX%`x7$J-&~sk26;uOQ!7o3KUvuf7s#qdAW8 z9&DBSUGK$36Ob_{^)K_o`(!tENIbqa;L|+vghr2J)V+0UDzTaITDiIh3i?6I(q5F2 z=Y5d?c5;8sS|5fn-W==I*d_g+ti*2OmiIa&(=T+x{U}P^)~#w*$mI#q`KUoi!sSh*4RA4bdT-l>6JK$EgPLdxr&QiG!be(P1Wa|MEN1_`q<$U?H$k2s4i~RDMcE^S;WM+I9 z?d`w^+D|jEABh)oyYZP==AsdA=x?9LcyW;ZS0YA>dqwFlx+r{+xV^4H&fJXG^^9xs z{fnh;d}I5#0eVy<|88m;!7%10!+#d+VElA2I*^upP-3YDf4E<->Jj{v8gj8xTb2D8k&4*_an?YYQl>kjI?j})51iY9IL|s@>~2H z*7@YUBX7-6P6mG0(!k8^nR8Gd6W#lbuoG7$7~m$xj5Fg$CRxuy4NpVSaW;4x$~v1G z_=q(Vyx>qlztDvs?MsDx2orCW&?2wQXW!C`DB5+|-zkV@e-N4Ir?cagNGZqJsK!_N zXVI}bq>}G1$U8-sQTMZ6N<%vv<1`&{-aH@D6VDH^qv8-*M_Y#swAbZzL&A&tzYp1n7aD6(fqA-0N)xivUNRz#4fLlL>$S+yP}Wn^;Gg_HQYZ>XST3EZ zWk5mNL5_VPqNk!BJ;=8+$Er}6c9=0!M2^do7A0nUslfRX)XlA;5KY_kPl@8hIUO}9 zA>+17he^!;rB;VfQqI3uh0?@(SN-TE^N|dS!fx_F*Et4MY$)sDIFXp0aZ%rgO0-+f zFkxaq=JoNTs`TSR1^%)A?K)M7r}4nR;a=2W`=gs`)RgBMQzIzCyjuQ)3bklEZ&*+- z2mSns8Cf;t`G5g8=m*aX%puIjD^od8oBMqnqNaAC-)v*;ID_?IJ|p7TuA1XQU1A?| z7>$UR%Lj0ay6s1_4ow=$dWs4(mh}!NXwj7RukB7WC;pwNKzsWAYjYH9X8J`Sf==bx zKZ8AJA%0w%^&xqE{#Q4(9P5F*Dhy4n}Ck9hz*9wQwncLTfjp#}|G|YrvK_pa8VOgWCvMK#tlpFAmVMq0*s{>2)6VqHAApB@vr-;;Df_M+Ju>?KAYR$yO4S@+9}{lu%; zbU4Jg$a=($;xc}#yg1DEquqQcN!?Q=p8-eYeYT|v3{IjBY@x-m#*BvoCL}kM@2vt@ zEp?98iF4Ey3(Hz?M#f!b#kSJie%p?-v`gsSxX1h*n-GPIv~OOs;}Y>%HajwtA4fk_ z;xF@IZk-F4g`bA&kd8WT=v+Srk+(Z%vEqvO>vjuraDT;jJ+2CmCR0ZfhwTpICUGq5 z77OdF?Y|tjOWT&fx`|yPARl7#vnT(4y3NMH`*e71*N&9O(x-oCpJ8D8{ z_UDh>8VrhKJPdH+CHE`)(1V$bzZpesxI=$!cTI&?4P}lqC*BfM@9`r)^W3ES3M^X) z)ak=~DE^*Fjoe z_{QxGzN_#<@>WYdyfMJ{aT=^9Ki^|r^|PVO$E(F3@r$}FMtI!=o*3~%=5-zGfRgst zOG;>nmnZ13whuY&wgP(EcXpa#BIZfbA&EL^Lme~b@wmM|xKM`oJ+@gC%-lZgRRk~T zXW6Y@*lEvgsD+bQIENE1qOXt^ZsNl|A!KB~C~~>rp>3@jhL@N=LkI=gAM2l+alR(~ zbbZ#^@=>oUMzk4B-8CqHv}~Upr9f)(cZC@$B-8?KBs-Cj?StcVSSru=vq!M>KUu5U zi~2IZ#5E;~$@A=cMs%cpwPn*FEBCM1oAnoUVs85LMqW=v=C!%xt>hnSVu>fBwWvir zcEgXa^4;O)5NgZ%jh9VWBi|<#QDZTsQZc^LQ2?H9ly=oa7sxV(&9BxGJ5c!Y#%gph3V{xMj`KS6# zAIfkXu3Xil3HQIZ(2AzSzg{Pr$#F-i(408-gAq$v*S_0pMJw9>@&wR^*eaV92YDa) z%9+uDcG`1#bRrhG=R+4_!5Y(4~EKkjrZXr`Qgzr4~Efh z(btRNGVZxqM-f}9Bk0WYzB_8gINF0M$=Xlk=VeArChlJq!4$dfHYyzKBK;J=RNC_o z`jL|S6#LwRBstz92f3Jf(O|@E+OKD75bxskj?*HXP3H5oVlLY!f6!o~%=c_kV*%|j zee*Z}Z+u=qvh)7Fq*S9W>;DWoEf#ZosSyEm;r*)Dt1ydvT&b=LOW7WsRf%o%_jNA< z$WH&iUB`k|Y@cD*VKwo{de)$flhnT~SS#a_(}DHGCI@}!#&ND+-HuJPpFVYA3vpF? zEw&OH+;1$9~#N znfqR{4%;!yh(i)*Nj@AF{At1w;<^rIWZ?Ziy{yJj+GiVkaGZF*lLl7inViNm3fq7{NbHXEe ze(_y{kK`%kJTsoqetXG=wYhk_>;^og{iur{FNg;MUbO2h>z-;*H9z%TUNvsW`l9Ll zc*X5U8;9|ln1!*|g7=l8tPAgi&&xP*g*x`ykq|!rk4Jp?LVT9w#$MJL(~E`hjrL*o z-yZo6zOe=0Y3E#Gfsr-o=Er*U_t8K5+wqRN^xJ$Vesg>IA}(l{Bli__Kuaup*8vsz ztoIQY^o`}Yk{?FmKfcq+y&i z{t`ke?)UAr8?mw;$F(q8P``)%29Sa6EoQlqv9YXk5Q1w2`CzgGxoA)6qDNk$?w1Pr z8_Rppc06GW4{7B_A=>djDf57BUBn>>os7w)ZG)LJ{J}8fNU2=NHuB|23BR zfS5PP2VJQbiqW1EV?#dquIq^k#cBI{`A|ywk^Iw_*O9o&gKNyo=O(L>nL29KTrWz? ze73BQs?MUmB~M-;2Oqm+M>)1%WZYIDI(sSLY0Y@6rbdi>pZc8rFW;r~H=?4 zEd6}XgsQ{}BMne6{^wTKBZ2jVB4|b|+tatup)T?6E+>BR{QJv>5Knt;Y!rOdT#X@=c%Pu zPI&jPm&VdiH;so=t&&6TZvX#nJ?@% z^d&DkAdEr8TUWvuMx3?5iQ&X;{EX?$|1A_cj3AFs>%d6jnurtQi3MsKv1>4O!4(%K zldC6q@kgHfnMuwiXVVDdga3elhQrHJ4*?RBH9Sju&KyIYH-H0&?>nwX=hTiclN zNX~DVAL|+e(Ip~y++5yErb4#W^phqgte}qTd`XEXw7(vyLo%_-SU28F{I^o!EB`O! zuLyE;{x9a#;Un#5>-#aB{&4xG6<^5v95&;-d~OjR{z!gmslhAusnZJU@q*)NR!57! zGGD3gQff5)F9%Q*MT!BJW<5eMSrUy-tP3tS_f`n_(kgJ=z90 z@xeOAJW+1)Q8Et>svSli=Juv*l_((JU(fgA2z6xAb36RLJtrbj_;f7nTn7~)^{HARVa@9R;V7}r~kl#Ksx@h-Gw9qBaM zfW6dZ<)?*Eg4;XJHzOD4Pg%u@lH?~Hc9fF&hC3w zf&BsdokDADs6rmttwL2|t3O^8UM|nY^&zc1SAhN6;WpF{H|#jmp2tx|AqO?uwM9-; z=l-sG4&+Rg=GF;?IRI1Brl&Sf>&J6s_R^6!1@%o z$c?77cQER(i1qWuDHEEJ7fG6;d}S*J2qcOj1UAwR8HmzVukfd~o|2j;%9p#$xQ zbL!ERILhil528U~hCV0#XQCUu$QKTAqBpTzLmm1OU!-IW5G5?Pw ze>75$aWXHz!*eTCz|Dwe-^2L8Om?7)7gMAKl@xqV=Gs&~Xs4<)9 zZ)d_B;+GgF<`Sp-9hgt7Wl~{*+^4@@k7?BF6$YBHko*Ak)eQP+ik|HE$*ZmoqjoCR z-8d_jh=0XL5I#BzSdU-952 z{r7W9J66+Pk{B=R6!Kvs(SA6DO~iXYz1T+VF(-oU5|$iHUu;V$z_ zD2)aQfW3q;|lZz@ncYj zi^R2Cow!UKaK?g;tS|971Gqw-{4s)ND>&XB>;uTVjZ)(|^Hs_$Cfp@&-b(=^<1TDw zonxQUAtsD-)bC~L>+neC_k9GlVIZIIz=lE0 zKU>a+VI=>rWEkd_@?0MS+{BUxb=X~p<9?z>aq7rMTlF~1y1D$Z8J$>{dJm=!=6=_j z1>hrYeq%&{n6a!CgI2Ome0L!z?~~nOL5LVmZ9_ype?b_fqnUpk3Ph3DJElR3mQw#* zNJVV0(~fLJgE@p2ZqcOys5n1Aj;NqzKc?O8L-v;P{?;&7Gf&KA9n3}ky)N^myjQeA z5Yh4;_Z|@xBrb2MMj>Lg%pnvb_CFKBAm;hh)R~#-565g46sLX9dk4DHk79Dszc}tp zhm`PB7bnaJVj%P3`0O@pqn|4}MNoqK*Bq)~t>$^Kwr}COsdC!!i2X|K@dlKq-I2$O zi#+dV%qJDd+dK(l9SgrTs6}P+CFiZENi5O9f{TlQ-%bT;k$-hMP+#V?rVWMW^8ZFg zp#k~rXayP)J16+jWis>BdM%1XQKx-%p^*TXKxeykN$ zJ`vU%u77LtZ6yt8L)^O2%3h3le1;wEbRq9v z#sro!G^lAre)jQIsz*><-XA#BhOTnFDE6&GfW%{d^dukm$%cN!Q8EwWZuDnd&Qz=Lp7rWxV;iP& zd!?O5Oc#G`qQ_J2cejHFeOOyB_E+GQJjac-e-^hlX>P|HV#3)lex;IoqnPi-k2e_b zk^ZuAlo_{*u+Dw+VlnMc57;n;_U}1@NZEjXRbP!tT&KTV>{!C>8<_8wiC>lsV)G#C znQvzLsC@Sl!3yGoQfiE3-8ZkbVTkD8_6n?`eOM(A4sg9q5Bt_!wF5XN{_TjM0@r`%bQiKwmzq1PkVt!`ds=vy zAJa6k<2d=?US8DXer2C4aDx2RB0o+O?Yk8?CvkXHhx0`1XbmnB$F{cMGBGKm14+cX zZS^q8b-Y!LxYkmhuj@oE&hx8}HK$hS~8-6c-l%v{dC zrG9xm?nykC^5H4bG|GnO#75L8FJxVtIq_QNbDt8?tTPK*81R>UYek(Mmw5hTXDRWP z+m+rB-VrSujkqGu4WQ1lQ>UCS7r+OJi*g=(lyT`hhCmnv?2r}acTA_n27gcJg^ftln%i` zytUqibhG7pAtRjRtA=Qi%+KEa!44OBoh=r4W925S;7>${a>al;A z&wO#W8}%sX+LzsOBPI2FU4;|5WqcPks6afz zyi}v0yg$f@JhAfou@?D>p))oVmiriwXb?l39j!&nS)9KiE)*fZqcx(K{QoZ-N(eRz zqm0<|22qx{BAX32hs*V20hA+8oTx`7VgdHEx0uK3P1m3rdB)#fstXU<&t4cEKm+pg4~>|%ih8Dw5^LC3_tA#Xi1zjDLz)tY<~6}Tjrrw; z9WBU5ZLy&u>(PW` zdCrGHE~R{=Ko9aA#ZAcKq#y54q7QkkuS)EpUnFj4Jtr@!HsCOIs5wf9L2|!htQLcb zcc~ACi9h!Vq8sb7wjlK_>(|bEPK=f0Xu?5ff=o)60&j z#NcTsR6~J02V9s&u2VY^&wgO!F)wDx`lU5sAp86zqX}K8*OJz#F`4sNmicr(x94hV zfQoVWk2-o0`QGO~ESLFz7{D~fVUPD3tRx>>+KyGkDRu?oiA!p0v4;5XXAoY-?_uis z_2l7;5oAgUjE?xRf&AG=6AH;S3T7j!(Vr*H@}nH%N59dAdDN}v`dP4%`wj4Dke&Uk zuYv+qrQbZ{#wOagvtPK*Jo3~Pz!vhp%#&?vQzyg+v7KC=*^|P~zWiDk`^fFov-{=y zr}G*dBz}AAL~^XW*OA9&9=fvMjbr2uuA30mLf%ttgo*i1_tuLw0~i+r%t+++(*2z{ zPW+YEkDRP$!F4v|qE1`;!;MAceOxY_h?VDypYxNjN zU09;G84qIR`FV^f`se9EYJ_-R-7lGNk@H@wi5pKPj)pT{7`N|lh45VRWNsa-?Bg;& zHRGkkC;Q6Gj4$1q0F2c0Nk@EmO?&r(TKq`M_#Z9r4&`z32QZL&er_a$w=$o#?XWX` zGTu_-9eMOtFUAsA4$1;S=rE4rwrmdf@(hH$F>TZcyVZ zafZf=Z!(W_%=k`RU@+h(@mlIAY-Jx%r-2$Jng4ztRG|pCxz^o|F`VZELu~NSKAU~Z z!tU}tj1gY)QhDtN662|};uued7updaUmCXJ1@oTzr2|pqMF&M8E%8D<73#BZX>Bwh zp)vh9E%QI^S=TF3o9AD1iVqpdRT-UF9sEpn}8nKh#Pzg)gC6sBlAV_SOpriuUQCLO2reuHclk>3ag$oYmi=-0@ z)Zq5IUMFf36Xy6(hnP7jh~3oE_ka2Dj{b5&??WTGudPi0FWE1g8|p(F>eIT_ZE!O0 zYrc9gpZm8v8bA}7&kA}pC2qdtM6*_MeXtv^sE@}rSKzX|@8rG_v9!OcZ$v9%v8Sx} z>@zlR*P}K0S+f=GiJ$8_(NXI5jQ~0m?*=1yxLls|BHD^|vWW(FnTHma(xJPo*B%vK zupf%_3E@4*H!YSgMlyf1vkgLlKNmd>rokx4wr^8pZ?Ng3Aa~f&%9Lp!K6S} z{>?DQ3i91syh!HXRb#_gDRK3OwT9!Fd`*Q_7rZ_ZfsOSuZFVnv zKhAq9A0{%6a^_TFFZaJqA8p9<>M+8F1G4Tb0yw~V%6Zz0=KNgaGX)gY*-xES;V`#P z92LS5@$>x}oRGZoUWNQwnO7LM-{@}*R~SG^h48*0PI3Ew=DgFyE3Y;9NPQB;I6Ncq zkxqpUJ>>abK0M*^*V(K%E5A48aU;O}=G+WoMk@LJEP!(|uAQupocjzaA1;vZ_^yPJ zy@3C?7MIA)Q~fB-btu|9h|8jHZ+dX0mHdwDLpA36mv4QzO1^QV4>szVv)`?_A>$t$ z#7*L{IX2uS4u7e@2gdoDb6%w5@$2=7;J)PH)d57aFE0BPcu3x}uL5P~vcLTj!Bbfu zO$4hs?>~FEad-~>Iin8AwEry3zM((!7?0mZepkDu#Va|lj3zW5Dc6rX@x3th+I$b* z(EfI&4{wPL=6djsXy=&U6JI)1n9DlX<`U}^`T3WA^dY7w?Zii!&kahr>2HZy%t$BK zwQLMv6#LMlg>CpGbzp-EpNXUTXz-laMrFkp;?wm;wy+OpQxPFh-I7IxnpY@COtt~?^5I@g%!APukUI&w0|2UNMQw=z- zFu+WH?tuyQrcl2+L$Ht^f1!qh*yEKK&en4McLZ+Y8>b4!4Ai3>pO<_Z>&rXVrDOjL z2#_nTm~fiwG)*1C3C7{z>8x||c|D^Lk@Fa;MG9i;g>IxG*8Uwt8sdY2E@U9iuWv#| z;$goU(F(cFK!=RX^X-bbk%@L!IvcWxKg6n#ojB`51hI9wAN!XroYyaYE#@z!e*36L z9_GyzGZnbS&&hMbj=$6m&9a11ocSef6CI-Y|2v*@4OwrUd927szFuiZEcIsU5>Y5X z-tMpxg{M7 zjQ4hVG+0Fay57#Z$Nk2J{3t_wovg=1>Y=@A9m_k7tOa60u z)R*VwcekMm?Xjmrs7mx?vVyHMN=y!*8hO@{9@Hf2-y2bvIP$s@jfkt}P}gvsY)=(< z7-oKd=R#xJ2d`1#>}t^~LF8mDs(e&|Wz54{CTnn9^2Gu*T5-S4t88dbe7nhyC(KJp z`+Vp?Zp*^DK%C1u--X!zofdl5nV%`W$j$svI+qt+Y43K}fPU;_M&@>-2YEy8H;?u2 z{W3Fd1^GE%HTuwAGlvHQh}Q;iJ?TfO>KHJDyjc|omb0I+e)55(7GM5(v4c9{g;j;2 z+}`q|4#S9F!ww9Wb?a`y2zgJ)&>%)+r@mOI!ANps3t}ws%L*695pTGZ$Vh)S{#0Qi zd6}(Fl%{^FpC*Fo@_f0uTFfLi>Sx0&;;V%Q%q6C4VZ}URSAPT==7j=(JXk;;t<++X z*sF(eE*&tirU8q|+Z+sI1##PJpfK}Q%%T8RO5C0FVU^s^enpG5GN08$*i1dye4QIy za;zWWLrLc2Dg}(#D)XBwka za6sm30msHTxR$|yL*&0~e)N$07%s7omHpq_afFy}iU&uD-3vt_k+|oI75@=$w=v_K ztj{4c&J$0u7G5R}m=Hk{v0M)`hO(|!`K-h`_H9GhM_i*_S5b}iJdgcd6}T?*vp|Op z%!?T(>v4k$k6wllGi1RhZ6so*eB!cJ@K>8JzIS@$2hgWSq`k;YNsj;&3a%#9(bV zqKKEeS&*8zEv+B%%*zvttB{7g$wLRy68l{QdNE%Zn0KqOUZnnFM+VwUckm#>IC!ww zflTBJta@Z2mQd@Fm6&mm4@K#}cdZs=Cm*#m3>D|G>?tjBk@qU@LGCtk-&_C}7s`Ee z2IQ0TIHtij=GzGk-jGVDWwXX!l zBr_Uil=)Gi9{KcCO4KKIU=X#C>t)u5(Ud%~p8|UN?9V?stYE+2^t1_UdQ*=lYtWqA zcUVJcN$j>?i&)~D3K8^VoQ)e4z#q9jYpDvY}^e1@_V%tX>$}yiMH_)SR8@X=NkNz@$rwkY%>)l9!f7Ii3pEEzR&fUzQ z!4TU2rqE-k9QTI;4cXVNNeEyh`IsA4j3VB;<-vaD9rF<%o^zbpa(FSC_W%B)ztb;| zma`x)^;DnEM!YM<^?k?x<#t1L#-Ch2UL^!A&o7aBb2-O7q@5PcgOZ=T7|;Fcp0(jT z>uBaUHD;0juJ6FZ+RWDzEvR0O|M$UAgSJ*-BoB6gm}985ekoa;)g(OQ8O!{j|ME^HugU&Dlc^jXa0ej$WMSeM40!%>Uc@&y2gY?;CH#Ao|qu zIR-o-Pu?BDbMX(g9m&K$+k<#btae9-H$+#&j*rBsHcA{Q!uq_`hM(kP>od>F@6kuX z_(NdG&pzPBO6G;1(0<(TPL~C-3VQrd~d-%k~m>g2(Jgq?~V~F>0126fC!fF(g=i;Vwz)#+`ya)ZM<2s)*VObUSQ5BU4$$M14 zDRG*|Pq^))24{Z1?LdU~WG8i3QTp*16;hM0K4U{VVz%=hEKAKiSki)Q}eII= zHKZ(HnqB)-j?TFbIh0uXm^@alX8UHbLsBh&x5RbLU#QtI1G8MX#Z?;%*L7tN` zOoOb9SL+iOo^ia{*uQk+_J^7Dh|VF`bBBp1m-6+LP953%A8|AdjMck7VK&km|45B?pelG?SPp?*@6XP>69d(oV-T4rP z6R)=oVlj1EmE8)AkoTVFG-4#N9rNQD;;6zZYAx!Zg*J?p`>^jQk;K05dt7xxZ)rKEg<-Sxe;)UM|VM|^h_g5`;lF#g+$8^@q zr{@$X$@%?PHjK4${pLj#HW71;abl|+@1g}WmH`JDo0G-?^QJhlL!Jlo#*GBIPkMzF zG0e9!2Rg8ayxI&m_7N|!o*ZSoRo&*se)230oj64Ob+CjTUFg?|N3}RC>vdm?BXRPc zDIfGR<@r?1d*s~;STRuUL+fb7f8?pF2QhdE^G+E(VyK^btaIU1oIIz%fkBMZX@A`q z!hEkdr@q1@X?8o?>brdkoMPVSGu?;B;&7q`CUERix;$aenY)YJaff>Wa7nxa#J18|Dzox zsoOHlSK|%s6JyPIC;6+U&(mkPuISpgqil?RrJWg^`BBSjIr#$ z*5r!7Lc2!efrfq__1yz2dG!@xv}L?4W54JmpSnYZOI+vV&uSRC{v{8E;HLe^87=Z~ zyzSq6;gk0>4D^65f#>hd@RM5?`!I%na%YzZ0rKyMHONdoKlY;=*|Tum0VjgAFKeJc znAl)u7!hLnLwa;)zdO~eLJIP`$zG%)-q^%Gm^!ZQ0|(NR_l#y-vhI0b>am4=&b?uF z9A^ISztfCN+@7hkAIIRm2ldELd%6F7C`f!)!HgT!$6rn>QIz~%3L{Fk zmFFj#QJQ$j6mE%}xK*zSyd+X7J<6qoJiG_oi$J;9KOWw~O(xDT#Cx<=g zN*wachwjA2IapVSRR&lQ#kff2RiOYegGY%zwD)V`#sFgAuLio3^ow@^3?lFFHi)r| zr?=U?7)iez^}>RoGS2gAtQ|nVu(&XytvpNFffm!{K2`%plaKBiz?Z442dqnLS+ADF z2EkN=+T(r5$o%*IfD2=|-`eifdqj5=FJ@C0kIbUOc=DuoCQKqGlv3aa^_3!`#$@ug zOP!cPEKtV;Baff8RupECZ(=-U;cyX&AE>cN z{AarzO9cBWkh%=(Vj1db@}*NuSRr=itJTD}9upeLa}wEm#*>#=@56fH$$vbiJt zNuFaf*MlVTlt8dH+ruY79u(#LO&Y0zt+MFJC}iaJ zbW_~OB+o1CrNe&a$F_OR$V}cX$U4UTSHOs@6{5-S(4S^9?_}ih^OH}wZpBfK^S}W+3XsPSvZ5fd zfia92xgUc%s0eXHo&bsx{~H@Y38Mb90j)XiTIb9tN#0?(2N@YF-O@0Rlh1NEv5>mH z^e#Wjk&o}@LwVx%G3@7<7lthhq7wPC4pvNKTozeE|0vA*T)>ISa@-|eR3o<0s8F4l z@QlYI-l%RvD+hJslnCmO|BW`G9x+u~GkUV#6!KZ{Nyqb_phkV#@Bee60kKvz`&;7q zN-ivx>l9A9(Sm$QbN(N7OYJcR%w+xSMSp5Zdq#^2t%)}``w>U%vBH6^?02X83@A!{ zV!LiZJKCE}b)db>hrxypGT%$gxJ;dv`Gf(T$-g;u=q~G4WK{ys5(vzAa3{`LVPQ^?jnT26I0eiSvq?FpZd+ z`nDxoM@Xi;GXuyGOVki@s!3?=hqj_xLGCT~vNuvOwIqY+{H`=4SV>?D7Z z$%(qGTbFj}&?F3$|LVcPcG3sxQIPuI*hP!Er5IQ2HxJ2tf_-aIxy~hsB;vK!VH}a? zIJng~M*OWe;54y%8ZXWeXEambEKyt5k8`qqmDpD(7=H~_I8R=tf(pf`CvN}JBb`!y zzp~>3?bSXT;b6Whxn6-w>b zr5`<_y|TuQC&V9JeRwX%qu-9^`R1tXfVBwy$mGRK+P{2NqX6sC9hDm0(ex1!C&UdR*O~mPW#u}LHs1Pw7Bsp4d-it0ZN|#lywfMh-L<{mRS6j0Xkxq?s|-5 zUV1d$0X_NRTP{3i9B-{0g%ImU@hMsuY1gv8v>Us-79Y!wl2H*UMt}D;eHzSXXtE2$~*l(0xt3Y&ndCr;# zMcChYKSz+4yl@)1vcH6lN8fiA!ppdK&d#zVPo?Hl_>>Tn!W;p=ef!2~r5alab9 z_2}JIu1{jl5xrDAgiTgp$9y*m%kP-UZp09?^*7^gdwF+C00ZSd8SYnvd|x#a9&>#M zTbRGdclQsYBr$DeKT65C>bfwC@xRdHN2oN9|0smgv}eC$LHZ7IeY+WyMwmIB^UxYF zT?(Ttw>K>pLIvWpDOOY>)~TUECg#(Pp)j;ur|k=w&uQ;J--F+*hu<2ou9Bax=Erg` z^T0(bs*}%2tpi(0G}~uIZSplE-KaxUm2#jn_bb03g1Y1dM|)9^*r=ouHCQiJv(DBh zpX>=?Gxh7MZVJ3+DS7(dh>rPqzOx-@&|cn;9YiDI!C^i$qCOn5PJtNtzNESyjcHe( zvOrqk0lF}n$TjPy)M!fFyx4(e#J1No_|87@l~;k~^oPhFC7RP-$ZSU}aevbY+7gQm zRG@=AN2pQ+9f=)2xzI_@d!!3piPdu|&`s9sWCXp4zpYN3<+>g)Y0+DbGfRsE_Gzz@ z6zE6Zk0RnS$FcrH2!qJyvEMArzVcrA09LY}FF)IbEPbit{+KYB+n=i=7((=YwPJ+K zb4NEWuy3ox`Z9|AL@7HG=x58y`7wq(v?qYcQvW-dv55WuD6Jb~Y2UIZg8lM)b!{ic zk)QeG#0~oC62|>_@{s`*)XnJ6J};WkKk6K}qAK&ic6%5Tx&3K+C#Dm>2p5;Mv=EE0{Y_OW?w}r!4ApTZKhZL;CtHyb-RQ$OJ>mYH_KrISRWd5oZ z##-`QdNb}ZU(_fU#5(dn310Nz@#iHwvA(_Z-2rSMdN+8mQN~HVw6q5Mt@nCtYA?^j zQ)8B$e(~OhZRAH6TJVJaRP%foJIE{1cXtyrO*LQ-@kQ4#TqQ&Yt8q})DWeLX7}rmq z>u`uXXGn!rl|+vyu$uL?)FcZI%Xr_oaFp2nl?TV#%X6K5NR;blFGp~Kc($w-by)x7 zYfvZAZx5Fa;3Vzea;tHk`1Vl*hDkiXK~Ch6N9=92;xg@4uNf)m2YSxq70FwrEci`- zDB0eK1P$}}It`K}&&67xq`vL8JcJwMz^prf$5XeUm)z zg>`RD>JUDPKh@FT9rINxR|GzJ|NJi#zR>Qz;KUD^Z-W=LnU8;N3gf55b5SM6QSaaM zY4C=hvuukQe`#0dbK##Hzli}G<$6eu4|T`U|Njfa#6Dt)eA!2TOm)_T`rJM~CF>3O z^iDS1U>&OBQK3c)dA^VvdfE-8n0FZ0qm^bD$PZ^yLPdSKfO_99_lF#DVFUY`zVRL` zq`i3Y2%NMp-)e?S-WT%N4W0r{Zq>j|J|lwI3;|vZ|iSE zFCH&PAvb<=9HTvIwBvjvKhz<_?LTHYFl;pEZ@(3@=x^zMh0%?1H=cDN%}3f7A4G87+IYATp5GXc)pg{(rsO4%DWfHfgL!M%w4I-re-DADE&+ zX7U3s*;f!fxva=dtk~0lyu`#aUKAEP^XL)gpRWU4C__7UT3Xh9qnGNUDN)ov$R5o4&U?#cbk z?4?_i%e#Er5aagxVP?KKJ=BNx zB^QQ}|JO8#p~MW?^cY4g*hGuOW%8aA7iRPGfA#cX1nu9>+fkPJxFqfWO<-R-*@Nxn zsD~SC(T;I;D31AC=8b*MU*;WGSL!#pABcJ6+X}|dW$XW+(K6zu3KNOFd`hffyys$k z{b1fc_t1|iGC#$_m`dDJ$%${Q|Mm<@n7B@d&gwCT_Wg{j*d^3Eb1djrjq7;8h_T#$ zn{hT*@;>{(1;oZ3jY#Brw=ZmFPshBP$Ap!{9798B%=+z}#5_%2v%3cyhy%|mQGxSU zfc^Ov@}RuymZ-{ZLTlyjw zQy%o1&iYd)3Jd8kOCP(?lYLsx!FufC_J!;(_sH|pUYe08<8Bhda4z_T?>3wu|GUi+yaGg4@Aam0-+V4iRFwlQf z_jcmCoVPCuH^m>Wg>Xy!HD?I7iAA>=agO=%O+ES->uCD|Q7|z99C2B3m)qNiqi~Pd zriT&-c%0M4w0J;X-fu-3^6+*g9!dUs!Tv$wll}h&j=z%0gr^dhg?xA>>#?6c&io!X zmidhQZ6^)7vwy8w$bgsRiVP<7S=8n5j(4TijW*^%h94T@zeZkv#Po15CtIiZE=%VdX=3)sX(2(}>cn2ZP_b;G})~1tWaK zab`D`vVPQ96@s5U?u{MY<+>s^H4*Yz)uOOTu4C`3M@sV9Wi3c0zdJs&BaOVrx{M2y zT5u2&kFU2`fklPC-S`Z`SxogAqQS5t{D6qCU=Ow=Z%~?O%CR|8|%1 zU=8hM9%_)0bvnuE!8URab=ywj{99g(P0MvHVMBtvM_`#5*-J8R-vqErKCf03`cQ9I z=|Y_=@jyM-ggS8H6%*FSFfU~BVoWE{yRs! zD9^afvq*~r9pxS9MtBMW(+(?fO#FSE8;L~UAU{qJYprDdlIO8Mu&_sAJ$~;;(bd#Z z6D-g%PM`f#;~MS#9_w*~STBtix1@fbQ)40Hz1$=NZj;~8sNrWnmh)l|Zz}@%YB+F* z_CFH>ctD)I*@krN`!#PPctl>Qs})|>%l~q?@PvG*GK>MtzXrzFD~U6+1HU-VlbO7D zLq4IU9@olJ&pmYDt<2AAGsaP;KmQQGd-D8)bSTE-?uap?75y@5ycQp5k1yuKFzToEHptVuuCgz_v zKD1?ii`uV;jdpnl&I;z8sw=$sT8jDRu>(%pGuwQq!~Ao(G<}I&G18B&taEQ2oIm;f zoFcg{>)+sMTCAu4+{@}k=l(qRr52c4vfj_M!q5GN6$l~FNv>zMVFc^_D8Cm$^7LPo z=)pb64*WE}f z`ahKtnTW5SD3F<$HJt}piN?-RD9Q8nb~Rxb^Khm|9%QGz^$|Vv{M?@t6`0P?Tf};r zgZBJNJKA&pmsK<3JjZjhn;E$~$$L_)h?eik8mQ2Zee^lM9{I_)Y}26tvD{%j3K5H@ z_8~^*)9S%^*5f*PohU*+wIcgX`j=~h3OP8g^nWZUPWz5K%u75@#VJmdApiGDiSoqe zCD=!DUZ+zJSC;F7OGQwvlYIZLLUm%b9cJ8*VqOku@XtyAV7{+GyH9OIE#jo>cGMwu z26gaq&O@{kjmXcrLuf{9#d^1w=l6gbr@4$HmkRIuv0kQCqb2#pHCCi#zM5OYi#x1~ zZ5p|eE~UJ?L4jCq-%8E#ls<8Hy9uqyM^Ch14g2WShYjdRK4hR16X<8zQwPwQeC!?@ z{;*H&a>9zO^bgZdBT}*dcs(1+V~Z5;T`d0H{gg8rT4z0Q8j=XfXeV822Ac=?PE18G0s$BA*QD*@KM z!QvOJ*A3E2|D`}6DAyN+afW{Xp@tJfxP3t80EWvrLLR)YBG1S);}`Yv%eFR*qPv+wg6%*KAOWx zhV^@0Iy>gkKBuM%3q_w;)hIWV_8vA2&%yk#ErLa~w>=ufNY3+(sV3y)x@UT&Mjd(1 zTNe799A~%zZx+dO=51I`z9(e_n}{0=`msgUX&3twxlZ!C3fslsi>tAN_~o+;-Dk6} zJ@3U%@~eZb7{N8Z#r&H<-mI|#owydEPazcV%kkfgpj|Ke*Af@@$n~p9D(oW~ZmMyB zSg3Ib4)zIOR5tWwoLRrwkSO!B$%E$1bG^s-agzL-f_)&zb19<6DLGE609=g6zV0B- zkh?l4aF%%Ti3KMo(_gP!ac>aE_rZ*F5|0n9SSHV@aGP*J;)CBBT$Bz2PKN0`u#{7gF)ZjfJ!4q_DJ^!iRa#&CRzrL?$7`|p4c zdFB4b1s2?q?-R~A@mTz1x0zZP=vvl;+XZ-@sWkt;2ED1(iI2o_NqYFGdp7Th;4As+ ztWo$T;~e9{FIkVYUSwgPa_NsB2G&p2lOTT6{O`(*fvQGSXFOIq>_%hG zljDgIqp9Zy@mz8z(E$!U zs<1BAPBx+hw@1Zza6!J`z8c1V@}8}029)hA{TSz7Dc6MuP>J09T7$LB6Khf^QJGv7 zt41>YW@u^yCi48N#^_K*K99OP=PLZar|HDcb2f1!Nv`KwWkXeYA3_}uwld#(ySPw| zyw_?yo^zgu#klaNE!U~81Jz}}yM9ENhc~PZ<8onOMnVWRI?MOidL|9-Kh}aenGpH@N?s;VLwd`}_a+pdCoRyrDxg@+ZwyXhB@fcto^q@= zzd~q9`}y$-oTTmzv{IuLxg&iLZRB(38PSdy`_hOGjE5u9esm-s(IkS0MLEu;8gwS# z7iU5bj(^-R16HxWzuM4@F0?OQs6Y>5p*JQx=6uYLn33Kr-zQtpi+W<_LJxX!`}Z9> z^d{D^vJMcB%JZ>v^7tAp`jLOx=Rtp>-R{5#>ew^8)G+dV?q#y!N;LDP%83Eoe&)Uv zgNdd3P)|!doKa&a(c+B4XyW@594r0RyWWGs)Z0V9+b~xArj{DBUCb{(j2KV8@^b)_ zh*LLcF-`uzqYcMcH`gvPVLEw*vldifz1}$2f!X96Px~>N^R4E(&L!8GY*;9tbJB># z#9@9Pg3RypO@1sT&-UGj<-|{q!dNZ-I?RN4x$kqE8EYl}b2+h&SZk{l8#>GPe5^~% zAOGwIT=V&@AeY6F;083pUkmdhl6q+78?$U9~^MO+@1Z;4Ihq?Cw&Yd zLQU5v-iqVoo1Z(8sxI?K$c9ton+AlT;PEPM_T#GD|8!7^B;wfRYW7+{i!3hGVLr)c zcHtIzKZ6kssiW4vGvSV$$5!^*a{la}k|*H*&-&{*hU-z;iieUHhAHrbxX5kAYvSqV zKD;IV+F`*t>grSHP54Nj9C2ehbxGmA79>+wTwia1QJ%|}?87H+Z_v?#@f>gWW>$P9 z&z>QSZ!&+(tIb&7>&NNwgS=xfgrCIHb#?eH>o+!lKg8CJl=w%C@6MC&!hFQ|o5_5& zW4jXy@?K?}*prU=MeW02*2NR_pEr#AQqAm8a{Ge~%qj9b)2A-Hp#8uvJ9Ok7E?S}H zI9BA>VJ!1W&AS#DXrDOK05ef_*8~gk#*QF5ccVVK?Sqv(?rQ`#;*$m%IEWc`*_m^I zgA07{5f{~A-k0MQav~G+X1lRw1j%3dwTKY26>_0Db8YKoCZr@!_u7k8#4f)~u=9UQ zQB$NQSBEV~NBodZjT6-WG5@qkPo7XDge1nNZmt{od0zK7s9@vz4X++S25w)%et*b9 zenw9xvdj01chyK5&HP@H^T8TZhWg7Szr%j<;A(E_1*Hc$<@oH|ny?T4o~%PI@>WfK z$U_`z@u2ny_CuNYzw8TgY!4xt_5s@?I7~h)+Kqhj+^FGbzxhQ2{E*f z-(bUM>W`GoJSZabn_xmw;`$vv>}AT`m7qqL_2A_~EsD{8<|=C~an?LL>a$-x2Lp!4 zb9?@VP(s%8tPv$;T*bWD-&wAsaG;FL|6o1J6YYs1{FC4D3%F2${CI*LRoNf6NH*g% z^;plwK2)ULHATbTopHL)hib$a>gddj<7%o9dhq=7dfcck>u7MIrmQpdRxP5YmkPI8 z*JiDDqBePr%}Ugfc{;2^M*5$(hXpqompR&4v4Znk^_B*8xqaCl3)rG#>Jh43cLy50kZVaSeza3EFraWi2k`t3;KI%JhgX7&)$%V<})t{;{mAJgG z3)6^m)@w1HcsV(Qxx}WA)R;%?Uen&I>c|j3{*G=h%cP!W-^K5Y;LLGT{UI<&r{TuAqO00a} zizvpEZj2H8$hRH|!tbDeIg~gke3u0}=C>-Z45-X`?8kYF2j`W#=McC5J>kMpVhQ^D zaboNq>MMz>A$H`TUcX-7g{7<`*H2k-hIW0N5q}teLst3!e@$ld9)4UR4!_~TIQr+| z!%Bo%uV+<^!e!cbF<)OLE-YolHR4N^3Ae>x+8S}T2r&lzXV`@YX|KQm|EBMz3wurIFX!h5uz#N(e(zs&b! z!CqWPR;nQMpnX(@3%!U}3&r3gVms>3eDsO$eO&lV%&Uql^dmB#@xck}*HNY@97o-> z6`SQ!tjifB5opJJAzed*A$;94PZ7Y@76e+cry=|U`@wIBxnW{3fyg^af+@sOZ7$3Z zde)g0Uh$GH}CTK`+t=UB;X*gJ5Pc0IPRS-Lg0XTS9TJB zkM^c=37CU;H%|seah`-Czg3#k~K!LlovCe{aQwQ0(7@j6|Ue`?rN^^6(9H zcE%qDDB*-&suK!XWCJ zeXE2)8|`L(99T=7k4yzU;{J{|EFcr#*Sc{*ANlk=88ATX=E%ZAMO;5UDQLj>n51Dp zf%cHsBoM&f-uicf@~qMCe{n{$6Ym?mz#XBLH?vc z9JV92)X2dw&X?_R8iZmW^3YNow9x~ z{fOV~(I5%qIKmqjC7RgR6LtP>tb47Pukkorg9*F+i03G9U@q}I#W@1tiQLAY3es5D z-)xeEy~q>K%0hr2p@V54iFuj&nFGJEZY1YYAsFoo@3Ua~GU^0NIlz<$wIdA3!uoY2 zjSS&60h&`1uiI{UXOiAf)YI5SS$qpFn^rXmxo)#b!kaK3dZMR3J1yv zom%YX(yi2Q&6Pe8E0x_gZw&QBrM46JKLTq;bW zJ?4faOd+o7#T*}kc}7?QhHQ!Fl8M1Dv~!M0z;DFNPttG?^UiYA2eX79jZ#1W{ruk| zSvZezVNDi+Z`;wYcCbMZ?TTJJC|1XMWl04I)TIW_Vjzt6{3tR|5V;SyFpcwLlFbJy zatT=u&=H4O3}7G{{gH(~rWjBEgn@}X)kO}Pu+H?~mjt#yu`i)8$RkEOio#q(^H&sL zrs2F}UZ7&#J$RP~ifD(=qM(TViY&gb8 z9abm;DtNs1GYe$!Jb$-RVG;7?CGzkl1E6au6;zQA`pUp!#M_%G(6|os%^DF1!#wcu z8Vi=7-S0LR#Ib*u9VUSqa<65=U@e6G85{E{F>e;qFh>|Q0nWKP@)~zGEJvJc&jW45 ztL0K~N1NE+f(bgv`7b13EirBjHuPX$p0imH)**lI%>`}r%d<(cpod%;b>n(};(jLy z*o?R^nhOSqXVayi80+DdN*1JH-*h)l2o4bYQt9$w3m*UZL;{QuTUJrQ7*YR?9H^mA zgToBa2}J)85&%=Qi;oEc1=q6{W55h~D}@1;hzF`9z#j386zW}Kzi+-YxFJsU(O@UB zzqywXEW-61oS=dM=C2h3WN^hgBfuqrJ07Q`u|Ny!OyO2x*oAz0fdKr$eCRk%0uN%` ztz=k&eUpDP2fUDv_)3BwV&M%6M5EqbjMtS#+yYfE3xR0YofLrsi2Hs>!a>9td1<(f z`Kef663*eAI}M@!MSD^?AHooOEwN7_uCrPgjv{V2B?6yuU8imc!%5_IG!fW<{=oVo z2KqSm92q%?MSH<29+Y4n{KBU~9P(rL1Yyla%ok2PNI?E%hX^DR=RZb*vxpBc*A<~o zPPJe`3C2ggCL5B`F6F|337qGHI&zRgJl|jgA2`J4Ylq0-;z3MP#^2__?YiTqD*gfC7q`cMYOtp%gi*PY8CP zKXipt;VyEX8x!;l&|j>@;U03)4-{C0{r&SPS!l=l`_)?<9-;l?QZZ1K#_On;fGXr> zZZc4fIE48~7vr*Ws|YMOgnpkU1?8(yhka&34Iby%a-o)3cSkNfCHC9fEeUl*AH7Ke z3W)n(Ybj8V{8XDXG$2-NkbrVLUsAU)_;OGuoae&}wEM0WgI9=unt70Ag!LNx<~PVq zACaIFanUwuc#oLz0(}qr+)L}_K@RnKh?6MvqP@$X4IdGUc*1ZM^Pw2(j{NIp*$BS?sK1;v^uB(!*D11fxJvq$hnmFF`0x5cfyu2H52#Q7660LSgnx)9zfoZpQEO5Xn=7;j2thH{ z@jQ1KpddeqeY6O%&yc(bh#|gj!a9U#{gDMs#KRL}Ada{c^Zt4C^)31|kV1YtTpDB$ z9Si8d+fO{76m>Md#WNQn;3LmnCIQ<~hpcy}gFJF}7a0@~Z6ris-hSeHXknO7=$^ea zsM>&e4U@GpabK>L31wkF_@Z8m8&_P~^bwCeM8TIEz#QicHSdRJs%3nF~!}H#& zr@|(*Z?(hxfq8ZLZXOsR-?NJbH?eP$rAmS+@`qWnV2-HpR}w6U>-CccAJqRsYvsTS zxsfRiTrgjpFTnbM{A)W2ba5RWQh0Cy{k~{a3Ifq@pYNo@7YBgIQ(|C?uY2J}h1J;i zW&CEr4&I3V!G}w-M>#(Ra>?A&?6q5kCZK$(u z$bbj2Un7+XU$E|%8Dd@BgLN4F)f4S6u@BjU2qk>ji#W4T4DMiEh;iV6FEMXlM8G`` z=Nl+ML!J7mfe-u8{wYcn{17)Tk$}2b)LRe8u%Fm>RFedAwQzpVh(iG3Hw_eU;bHuY zk-!ppqlh#dAoekMD~4JD*PX+GWUQkLnyC^?YpE46tkuM(LKn9|lsuWyAY@R}2L5%&v zg>1y}?*NyHc@dO@EBlG(FiJr_;?HamC_tQZLJY1ViWsusC;Igg^uZG3z5%kpz`UXp zCk?MKPsjB$;Rf0d@ui?_KcS<9zy@{3Wd~Wfk6b4}0(zfY8a zhscYw#GrzRV}BNy;riHo=Rz{-n$SK`c!G8=TM!bk&Pts{osGxshh(4z?Z;hM@D%ZT z1s|U8C+>HXgeJtG8`!^NZZg*5Lo@Naq7CxUvY*%oR2-o|MeO9y(Pjh%tXI@ z&xbzbtxxE%{4()eKLMCPu2ji~NknrYA^1zo&tfe0SZm9pr9lAWUNwXRM(BS{YBaFW z!#w;9dr{&!M%Xt9A)fju2~@=F5Y$)m08$P~108i|-40oxp}mB-e+AJzhz^r}m&0xGZ$>mHQ`Rpf@sg0K|vs4o|m zA)Z~ug5`+)7F4LhbzOW_1~iaA9ukF%7{^L?>7YrB6SdrG#Qj|q&_ew9NF1~gUo|n| z5$2gMN5o+*@=JfIpo{pfg9duUb&iX}7Q|LdDfnf9aTUx0BjSF)olM9;eZOj%B$yz7 zxk(DtvA@}ONCHfeD~@9xK)v&cM*<7v;>2%Ni2H*zFmE8YekTSqSm&bFOT#u|ey~@y zBKqhYKCHx?{{#C4TjU9iT&P-&<9$m32juFn#lR8K$bkWO$#~uIV&H^)nLYMZy8uWS z|8B^ae-Z|F#QF2c;DLCPEf1cEW+$*OBhLGs0>PNKFZ6O@Kk`uELm;AO76*2tj&3!w5bfW7U|)*%hcp@lA)iBLz$^4afh1`NMZPFc7F;oJAHX~mM!eqw5$KP{ ze7BARji__%jb$Mm?LHU9K>+h(EK3BUi2FqbMBz5(!2277;0SV$9};lL96&pc49Ad< zsfa@?qD>PCUdaJ;q7TkhCZ5~Khc)OY=anQNj@Y;LIThw$Uv$w(3I>Va4`7_f6XP^s zf;q15iNomMxITudY)B-|TSJ2+#Dk0Zkb-zuPY_ZOg_qIc9AXOQl#7TpNp!eEtZ%S5 z`tK`IDwDrlQ2%~F?64Jregd2LU?ogE_e&H`qfT0=A_G5(yl{~O?U;UCG-)tStPfuXCK0Xl zC@_sUdY=n3gr8Q*K_&(B9}VM<@cS@9;Ng51Yg6Diaye552w|SnuEBbW`L%sY913t8 zHPK`cMY~iB83NNWzhE5@LvFA~4*GJ?PinCyAs28Fg!;YM?*vH#6M5V@0eFjgd2F{Z z=%T+!dU9dC39h3C4J7cm-)C7UME&|$mj!I(a7zND5&Qi3khK#)<2mX@Zp5zs`nHT-(8a0&o!HDrp`IPGX*A&5?(rs7qdM5rN~|alW_7 zfd#()@&Fku5u2Mhunn>94Iiu#xm_%XCB9ExiFyrruc9PuLVa6Z%mqi}PC{&OMjX=P zf*a!eS5)voRNu;jJ^$^i#RqT1>ndX4i^!HG!wOMcqckS;q27D)hz9;d@0cJ1`w`R8 zc_I*F(C;D<6TUKFa~9^iECI|(0P7N@pb6Kb-U8Ihl z9mJ#w|B?b-)IBKgu;;~b-Dbm8%=`6xI$S`0*O3OlP$y|$pg0xqeMlVY>`odF8jw%E5rM{w#P=jjc#eE-mjE;(zCXf%0Gyu;?Bi@vuWm_ZK@-|D z@VGk_`_fw^XhGgZJb#(^z1nX9c!At#2Olbs&-g-zB&;8HRC(wkuKyGd7GTV6G-kkCV%+kW=ZLsmO9FHmNJ7!l zjeKbY19}39=WPnZXX5?M>F`Yubyb20^byzFF97|Bim3Z6uzp$fkzfEhS&0dMa2#G^ zEci;~2h=C+KInf592iDERW1W=#J=_K*zleB`!sPV!8)rVOMx-uVG&aB8}arDJ_zFc zYnaQz_Vt)|S5rU;c|aW-I|I70hot4*&_$@5xZ7OfK@L3-8lnZpM7j6_B($f0-KSiZKT1L1H|(L zQCkq7GX+o}VGh>UNHRRdeye6V4NTB}Ax9ic5zXXTV2^mLnG6nye*<{1197V{4V;Pf zF(;mVi2t7n!d0xl*K&kmH!*KpOCV0cpwjrB7qO$jS*4sCC+2W0e?i*w=76F zjB&zcz<%U~4#FUZd0-ub3W3D;+cCm$2=VhAHk?T#_7UJgFmm;9fDpv@W3nKUN9<2P zf-vOU`=ucgu{W0wAJA_zO(ftM=7U#dqHq-LbAM65%^3R;1MDBM@8507hG=3wb;aR0 z@qF7p5jcr>K8p)Z>coD{GH?p{St${SwL-r;!GhBVh&U5~9oY9Ue+xq_aeO%!_M!jz zU_OpRZX`>BP^?oQ8bsj?^3t7LNJLz7kp^q9P8|zk!db%q>SZCFSZ5sP2-dNUA0^-) z@!U5XQ8-8V{YNRtLL5~PfXj$pDcFZ2KEUfXKz(r#$8!z&PmJp##B4taxQ>|E$cBsO zuzm)LfIi~ppAwLZI_O=l3>4#W!%{XZXQMym3qlEU;|vifCFZZ51!ag~*w?$^^{~ds zpy`77UWX0qi0?C&Nun62iPVB9Am$<+6v;g?xykto6;UV(4YBG3Z z+&W-IR};dwNeApAyN0;c4MepUwb zFiuR4@}LUG&nP0pBpzQJ$$($Pdj6Gyqr~r0a14Ku$LmOd5Y~$s3lR`Tbec~B3gUNF zS&+s$pYAFE&rol={1O2%Vt=?dOkg0sJkJGj#5JqPK;8qeWCaJvxE_bFK1rhe-9r-W z;9=f>B?WBcRDDt4ASS;S0J($2{U%gckM%NAMh29TFLINHMF)xf_T=Fd=Ch&098g6r zGl+T&k$V>N4=XY)3^owwdnN^25PkGyzzFd` z2phH{uFc2%fpsokfDFdSj|nm$9d-MK2?p%KlEz-i2NSe=FBF067*BJ|g~1H@q#EkB zgT(g)#Iw6l-)KsK4RV)hIyh%w-c%KXJk%Fb3RGBuI$MoJ16w?P?|?jv5YH38%>h^B zj#!UeF@K)?!-ZYQyO@Ho9rGuQOT%vDxB58XfmrP-173(9V&uRNQOFL9BaYoei46OZ z7q#Jd5tVgGZ~!qSnh)nO-+t+l20K^myQ~-xf_5FQID{d--YX4LSckqj%Ro5t^XU?B z7%_Ay1(ebMH`X&C61l)F8kC@}kjtaP5#-Nya9|_YV^Lmr1}wV!SxW$Alm5!oC>Ccf>{-s)@MJ;=mI`lVudBA^dZ>B-9f7 zs4WnO+vkbrFUrGH09_DBebVrQ$S?k6sKxwH8Y2S}$i)n4kc#KutVo6_qFckaCa2qHdNgE|FK z|FSp;Bl0lVY1lt1evt$+@~m%iKtmvL68a} z_Suqz1-Slf40csp{5#a<(rEW*3qU&dpDoS|kO?9-s+9&=;(fnMK+r-Qj}a9($RD_~ zp&t9t9DhmRBA=5%0)33TXOGx$b|YS|jy&+tzK$jXe8j0vF32Nl91#XZV!y5cNtncZ zf3lAc^MZ))7pb6xxE}SrGU6AWIH(|gnq@(v1yT37umpLTpA0NTl+$B_I&odtw}fLY zNYIo83q{m7i#V_*TNd*L9Ayh1w0XVw@_gZF@MD(uqGbkrJf9rFwed&;(`~k ze%LenpdY_=!g)l0S-wUP4iJBjeR?qBXq_Cy6Tc_gA^{=D4VXL#L;QeoC4>6;{I+y$Rn<2OcDwZ!``r=81aZU9qu4* zix+~sh$}BiLM7rv7xs6%k(bKBW8~kD^WhZcB|+3tFHz?XV(zF$`@Kp&JVBgMkc4rZ zA6gP0YLJ)ckf0V(J(mkl5fioOP)EFf7atA=V||k2z%%488oAJj>taQhfd=G)*ms}7 zIPR8^hv&$Zd->2pd_KO938`2YXfc>akq6|Hp%bw$P72;3F0iA)d&Gn1SkQym7AOTF zn1}eLvhW#s;4c~Y8bs(iL0FD?Ze~9Vavcd>hdCDQi_S{|75%|1K>$XOXJf7%Mf7CT z;5*`L%;Wi3M?S{0;V1EaQJ6;}Fdh;F!5#I>lQI@eqMf>k2hFHEB(AaGH}Y4SO!$lV z1FuIIuU|mG{0aQ`PyBxXk#b~Ui8oyrIXoq?w&L*$KGP_I`9fqz@NsF?H{Pz_S`_-l zZ6ZbtmQgPCep|@#@-s@DU$iSnq+c>CTE$B7OLJP4D%UipMU|4SBOT>+=~uZ&N2c-n zeJ%yjqtbu9O4hDfGW)fQoO;8V`fEmQ(|Y=a*L!4mb6&Kp>2DL|6c&FtE>@kpnCosY zP}TO%+^1e|`OdMuRVoo%o>^^qpaol1N`3}i*}T0^bbI2SHz^GR8cf!vFu`=Ts>Xg{ z{g?uyW|@FZoh8LJk`B~88@Gkk>wA9|7L?o4cwVGYqRL^EW?8aM_vm-Kj59y#`_H@| ztK6n_M4&unK)FRcplE&w<4~5@sX~9*+c{>nnMXZK3bKCOGYlJECv4=Ee)pJ6t(Wkr z0gl74;J^j|cdp==qM_*i z{#@gMFB;{{Vt!ZQQnTPiaaVE{MILLbjo7fyXZT{_@}Zfui~qJml&w#jA~O< zjo#Pv>akO_7hbkgcjQ}blVK-V#x0HzXs*2{b$N+du-L-@sWQ{uoEFDNG&)~smD_dG zK7q<(5ij(W{mHYN!zkB64f6sQoOPIgb5b@(?_W%qQz~)7iOiK zU$A?!ZJNDap>KAdsE638?{D+$nq-qS1hZ8u99fadUe)Q+z0-!GnQ!y=X0U?Q?1r2_ zM0KpH`vRVSkx3Vb1!~rb^s}^}S+uFBcjozAAe+uAvtFR_Iv$uQN|1|6Ov* zbH3&Z)^~8Qa44EqY8^zen@ymX_L|K2Nv(9z4qH zd@KAi`;Qs;HuTno-!8JETJYF)QIYJmLF97T5@WNSyr3Y5{B){l~1sWiAzyW zH$9(xSUHeu%&ZGa?)iRR%$i+x@?x1{x(0vF*YYijQNcHK=G`a=tf;-(_N&WPuwUOEjOM`3usrmQWmp+Y}_iyS^+f^O%O?5n|Nq6Z= zLr*VP%B-nn?lD_4H5Jb)_ht(@HreA*!$zSKRdWS-6{ey)&3s?1Z%&o;UpA1>YgqOD%u7X4L){>Gtar%| zqwqVCFLMmTzU^XfaT<(LUwwG9TYlt>XNIPDyN0?`MMa#LL*J_#o{sYMTewHO>ZJ5r zi@!BpoAE62fA`(%ZL#ryyUTa$1fPl;gWD@*wl?L2mZz1AxETMO|NGCUt)E+sUcbG0 zEPEbFBuvrYt-jZ{blE9j_v3ufV!sOZv#{ zM4^|$S^>pbYeToDkDD!aP3fsbg_Oy@ux=K!s~1R65!2Tfx@9+|dS})1;&~d{l&RJO zFAk6Io4ZDdoz^}mGOBHKPCasRy}%7EzTthV(QQ606$ZYQ_Dw5Jg)f~pkl!3+=%EvE za!h@@cFE??FOP@%8LPc*mJ2Y>9T{}qW4TMrT8H)LKFZ}+Lk=T}#uCe>Q)3;6?pSY7()2VAWr;~@9Y=~S@gDj&;NM3`vN_+eM+r5 z3D?#tetNY`hs%#6pQunRi!FB3`c^I3u3aY=slQ&v)YMn=!>1o-N>VN?ZvFNypQ$>O zPgO`uGdFHDSSLDuTCj1yL`d5;m^_Fs>k~G1-JXH`1CGIVBynq=lesFYgL#&kD;}Ed zWrV-_oJ?V@99y|Y;=T|s>f*8R!~N!xn%@V$&X=v&awB?bzjp0e%_0-^{WnBjSUnqV zZEX}O{U_|)?i7*e#dPi;kJ)%tlhL`O;@^f?SD`%*hv#K)+y#ESP~mBZPuzg z`Q0NeP29ET{-(!`9{zNlz~Fr$d;U1w9K0z{OQPITE{|#a5)9cl`+d!g1YU*}>iSu) ztnb>cx-EwCZL@iFF_<)1nflePF7gHq>wV}yf^vg*ebL?YW4i5UdgjOC;K`w;4I7u`OLlAw zRJ7m>IMTL;r$CbGp@;qrVTl7@NquxqaYC*>$cxCbKm9Z!J)!08!EP^S@CtUMn;;3 z=)rG1TpA)&_sH#++|7^g5!M>n6R>o?v(MWKgK%4!rdP&hwz{D~#nij(XQ68{uC9|$ zr&+F^TRK>Meuw=JW-+y3eBHTdRl$9A&h~La8;{0i3VV)b9^3t9=y5PhDpXg}&x@(SO+u-L+Q7U;9RRP0F%zJc3^-ijG`9U9mKg6d6a0t&P-In`=6& z5jBV0cQMxQm!kTv_hK_!{nMxC-QeX8bH ztHUqtB>Q<@wR%@jx9MAL`WOg&cTVi?V)RN|Sw0Q>JDk~}9B69ruC@NE%e8l1RvPr^7k-QN?*Gqa+BRMp5^Z~lA<$9r41aZKXTbR zFaK1Vr~Ew8V?Sp2F@LeTS|Ll{+~jS?>1l_l1syBv^j+%RsnS976cQ$yhrY@jZsyj0 z>?mz=59ilvbFMW#uA6kz8L`){q>pHlLwe`c@4II(zV4&{W%=0ak@H`yn}lNi%b+U; z3zHVV`&KdBm(V2_HpkahIUrV_nz7cTPyP1aYue&#J@4POe{8bjQNxjq!HNR*7poFH z|9ZynaCYhpf5;BdonFYU5O^W;&$1vf^D9Heg)Cx`7NT$SH@>E@<8I%bP0>5LC!@$s zLk~x8zl+_euyos+&CtKmC8f)MUybm+BEJKt zTx$}p9AV49jtg$vlQ5U!F?Gad+ODDJLG=0HRQA7-CoxLzb;~2BOJnVob@Th$G8+Ck zUK{K7@h&5e2Cpib8eClRH$-8^*Xc{#AIs|=(k}|1kKXH}|h?kRLR8 z*!jq+X1{NU=7moeANc(7S$4nK**5*idCwK!T>x6umL*VFxBa!DiVL3rQ7Sifc$#tm+kg8PF|nK1TP zFei6I_1orL=}nn2){`0**=@h}rZxusbkrHs=C@K#&$!KWr*Yp0{SbMPKdYL{sTz)` z3elKxbN_JZa;EZJ8b^8eSe~-tjb5GIoNJ84IQkhTX-)u@DYsjF_Tt#T58BKo`90rO zRv#KXcKc41%PSGqULk>;o6@ril!v@mdOvR;>v}%@$6Wki;!MMPZ;kf4Hc|3mScLhU z=xq;=-esty6m64Q9V>V6MejR7O9Sq`o%eRyM+@70ems9cfmiyuR~s|u-dXJGt*5Zz znbH-7D!cC$4zGPOi$_K#?5_^L8&d9=3}DH-e*1f6#p55Je|;k*oyjyVJgR%fY(b`s znqK{;k@bDX+vjyUScrES_)DXP`NNY%IWA3)gT<#>HS{u*ys^I< zwoX`(BRg2VqVd!!$=uH~S(^SyzYQ2JKeFvq^77s;Wo8%W3~b=Gs42FUFx@wsy<2nk zM%;y?6Z;FQIK4f?8T%)P5Txf0*7= z?ixP=r#}f<*h{^(JkQCsup-pm@?+M2E(^(Bu77HL?Ve-lZ4*tPq7ztrWf zr1Tp>b?@f7Rv%2BZZW=RTR`etFKGc3I8(*S_|?PR0GBEnRc!{R(QQxfxQ&Ug*zW$>nGb zi^HmL4b9d~4=Tw39ga%bLOw&`@ORkYS7T}}II`6CrIeZ>1<9F!Arz;5b2-nIVc z?-4t_6$1Km<3-Zb6hEseePK$!anvp6uq@L8f~+;J-6&5eX<>Y_Ok+Nz81%`H2<}o> z`$px`Us&co$X?ZtLi8D+xQ}^q0m8Uem2s%Z&>2wTkI6gKjQPuB?I$bE;jO zidVXv-kTNhisf#*YRLw(c=@%l`H?}QCg!`M%n#ODA38M2)WbSdQLy{1&Au8a+A+5@ zSV@3d&S9U-z`oFA$l1SS`qf%9lZaC3dPa*+e6hr118a@;k!FG4+$Yt;ylGBWZ2;9N zNSk_6rs9)BlmFQCgn`Y|#KSo5|K@k^cWSWk&)A373)UUFS6jBl*y)wClfm8OC--h8 zwtw|^_nrOIIK61XO#9={lQ|lE2jMmEVW(^Nx-Iie|5Sa{TXn2QeN~iA#*R6kt3-#>;2?*@dkb?&E)UgrKj?*KDTs%=r(!Z^f;1@lM6>+ zFyyIepWaFHLt$M8Y960*#!^(f$x8gOk&jyWOg)CxIyV-3dD~E#hVRk+DayW2wmwbW zIb2w2I2#t2U2nj?FA8^-7|-6M93G50s@!5OolsR$<4}CM_THU&hxLzj-??5I z9IHg7%kAzTDjJXb^r&m>I)4Y&Q@3vgq9fOqSjA^>nDHgqFGAK>?)kDj(knL7CCsVg zC3}UXT-Mf%j;ZR>-%9ROw`i7~bGbl$nM=SFOYEmq?zepZSh3gd(hjVDCHvQ*`EXbB z1NwgU9Z@!n82m3zI_54pX|u&vaBKm;jM6aUwjlq(V8!ajQyG3Y{eP*4rDFXdmu5Gf z`slHPOkx^jCC|WOS=+(y>B-Fa#wY7TI3!DkZaa^~)SKg|>z2#0*3YO%-XF~rZ64v~*d(oJ9X8CoMD8;{j{+ADBwvLVGIV7+)klab{s#|2f1SADK z@EBb8zVBS>7q`EUkFOrnZb84ADN|M7b7$#gx9J|O{Wiy1Izuzp*WOz^EH9*cf*ENU z+o~VVwSUBsXd2i5%5~RR8@)9+EPk|lf%4PH)3vCN72JKj{=hZY_Ei)5kqWbRL%ZHQ zc9-9ywNcEDG>4&EUa6WO!>~B?Ty9NroGAJ zzUbhOetKd9E)#+564^M_a(CYSH$&jxY#uoMKmVU`>nPB;ur_i{G$|kZQIo!`Pgh$v z{pjdc@}!?s7*I{FnJ#afU-M0H=k8CbuT`0MXS^aJgVsli$Yzw(YtlbPk=7aTSL{~V z{Bzsl;=N0(cFqg>OaA2lx!X~V(%W?LqvB33f8{#i8@Uq#=aP3+j7}W;d1Udzfk+ zAatfPFR2%n89Zzm{kdA$Y*ClR|NOHkWNd6gi5ZcnBh{X$r{j3S)k8|=r|4r7^;+JH z{GPnut$XKZq}gVBuu2<@l&Qn#RsTxO{d@08uWzAOuF5*at-dGqz1XMhhUSXJ)6TpM zrM-5Tr0R>Bq*f$7eB`0q&HJ3BXP`u_c)*HS)OEj3sA8F!@tqE{FU_AzSL_<0Iz?!I z%uElPT~j3aB)G$!IuqTN$?oA4Gv4VsKP6G za>%2qZKr2wYfMG_+}s$Ifp=HD5;|)C>Q6@wrB9SZDs&Z0Id8h(`bOoww;jbJS}~Gs z^G3_H_}nu=@#%|(4&bo7nFsxyB&2}S7{p8lvvtXw5rG3S|dh5uF^q~eCxjT zfk^hR8uN~k53m1=yS;)}6wE))4?S-yGut3)bJ@3#8S5vJrF}5b=&){kRo3-Y#@jCP zgG!__PlWuWo;t>fedEFEj}R*qPhPNUU(dY0dpmwt<{q91<>b8$%gVcdsV>i2IK-ZG z%StNUotFK%$0MzBUf%i?vDt?)ecIpr+Qwfb<}cK|pd+Za&#s{|{n?nSy8YR^yj=o$ zG2PDbPe0B3qhQW9TR7%qZeTvSj8v8xcrx)xTtm~I_!Gxoe`a4AUtX=no%CK~mE582 z@!h#R=G~+Rc|}gz$HLstC$}oR@xF6UV?gk0sr0S@>aYpx_|Ljmv-Zm(e#!TGK5?#l z{mZ81%f%h#q^{oAgME7(8Lf4d&-a-8O)$K<>Q$9V&%-y5PxF?V+3ZgHr_xiH;pJ_+ zwOuU7?&Uo{vQP@&Ut`6~!r6^E=7Fm?x4(U{k0YyQjZHY_OCLWor4EH5;mvOYl15D$ z-zqqzect%cT8LWbN!hQM)BSIQ9t`d6@4+4 zJ^fc+^;>K{F_tzl>GL%2Owgx4`l8Jil9753zf^R7XIDQo>{_fkr*Phic%^sx>*^;{ zFS{I89y?<&l>NxYL2FB5!GnLvNBSmZvhI`zx7=!Wkx>eh`1-dbX7!?zgYAt?^ys_o)TJ2b;widgwS-S^+#v5)jW*x&|axxP8!`vIZ*(;|@P6rv1 z=Ek3SuOxic@zVq;&}oJg?$oawa!;Z1!}W-#`-%!vP=ck`~! zH&iSz{VB4PS-VehG&B<-SX}4xQ~j2-w=#;Q3hVP;B;?XbY5I{BX>4udlzYRkJj9!x zly4X>8|)4(>RmP3Vvdz%@4)Y|Q*$GK`H`A;9f~|ueChQ>Rp2_2=;~Dyd;8Ub=(Ty0 zN6!drDC##9ShsZL@2@82*{PMb+cht0Xw$8@!NXOW1{&Mjdg$xL8@hKke0)?b-}oh4 zxa;23uY(~kTaR(>zq!u2nnv#kGmu}I9h7vUgF&_6z3sU2i{TvecAiMSon|{-J?zb5 zpDOz`3qOAPFE5!nugqSW#<%KrYnhNA?ub7%{chg=-~sl_^xYDdCl6mesk2h`g4zP} z51gktk!-b~+=cPpKCP}o8y8gDUsIY6rO=O_>0&n&+)1Y`MK7m5j`(u8(zC>Cjv_k8L-o1BPb`nb*Mt;Q17hEvrGvT;e+xCpfaLEW|Q(aWB zIWS(&_w!Szh)_0M+0%aUC`KUz5Ro-YpGCcymVxpjYV z1N&vC7HRv1ok{UxLOJr}>V09SN@Ptw4R)+g8yqsw3b`UJZany)bv%1Z*yTdyjNYY7 z9>y*jk2bHN@1*c_lMdZ(UJ(8yXVIRg?}{xC#1?<(;f^&qro%E?ULogq@jl(qf+^n@ zCEskG9~{((co1H{FznQ2UQueyuI8?zKT|_@zR&fS*)niv-HtIaYewg9f$>I1Z6;@F zkWPLktv;~1>KJbq)>-0n75DZ6#oF+XKDisa!}m2m$o{;9>QGEx3LiI}l{C2cHf9au zrIP31&~9-@>S%vgEr*`hXlZ%uOJ!f9jnVEIZ?ucTa`c5G`kt3Wj zeb13ydm4D+3a)`}*AA~ENo=rgX=zPypiAb=fn3?2jUz2w> zZ~Q<@%2b|luGY?$nWZdXx{BjntE|CyYkN~yut|dx|8DH?#8k@hMQ5bSPNddY*Y+JO zro6oEaqzp9e&noL8Y^$;bGAO+tgB}@Xe!eC-t*yeuGxLtB(28cl9||c}jS+ag)cVm|diD9Kko5bpXO=9DRtQR+DmFY^UF!NlqJC}1$vY0s5w2?}4jUF^ zuM|yD@^87x6MUb1B7Mbadi!Kl__~_2mp^cC7bzdQBe-d-ej+`EPd_uhtjwUPt}Mz! z>%*(EXR6MA51A?&{ETUV6H|`5`5bN6KZ&&BO8;sO$-tdD9HD)Bue!d_XEzSXg(o@L&quJ2FIxAk}bnHlx)SK7&kj9QVr((}( zD`HmDUe9=+y%u*hKOut?Naz!%Lr1IC{0)z-j4e768NYhz@J1c3x4nAE6sNe;)-A1b zm!!pzou(AYYVR!dGw~({EURMqF9}-hNfkAV8>uX zk^3N1r?_kFu5WciQH+*)!8C$6W%gbG+fM4`3aXE9osz4X8+`P>FA&M@QO|fNsgYM@k;dNNcvXqw$OBy zcQRXksZa-`S2`K_w(hBpzhX0*WXo+$es;^{QjodO&c;E#A{C7z(d<8wXQw0<>J&vx zpZWLgx^n*sldzc&RXnkrpLI`9HQR@KQa&gsvR{rIy!3QZJYm$)`yX6iXd|ndbbE^7 zl6QW3S!3zs!)5e{BL|lXi#zStd9%&Rq0VHPfv?u4*_@9rUB<7`bwBtNjx%qExofyZ zPwRUZJ$|Pa&}LU?zi5B|+e%j*d-8ts^;4eu^A7uOUYpX~mK@mQE%wks^W7lhaKJcLqi&rvsDdrHeNf2Df#nbkB)e<@2=uc|LWWrhw@j|FU04nrChmNZBq@ z8=u$pqH6!4l{?DU^EPZz*kP>xWb&KRz?flY*!a11QBO>l?Aa5(c&>>?dzE_lO@|nZ z!#cCm-oxhm!*3n^VY2Un#{E4G&B+E^RW|e_e_%B*@-#10g&XTeWHfIy)%WfjWmv3e zyMH}>`Rc`IOQh58`+Ing6b(0w)^CU9Mk~zKj?5%V9k`g&L+*3z_DkAXt4ouh&cEat zy-}$BOl(2x&Hk1HV{P9)Hze_X%QE-vtUi=6cm9`Np+MJDXVf&$HHQ9GyB%w3rkN~R z(;KmHf9F#b%iY2*UC(woS3ecIrur&+C`n~O?CqYu&LW#ejqIk)*`>RdkU7ByR=P|c z8+B8FO^B^d)86p$lFlE71C?T14$U!4Gf5D4C|FtdE21|zdf9Yzn!pL&dERU{(bmvb zII?D|e{M2om+M(dOq0{{3!=<``=>s1Z|)g=IyBcgR4MItp3{bwmlC{-nts0$&AhkT zo&9px>rHF(qW25eN_w00Uu$q z*#3&AlI0}psBb1d21i4i0{P?PvX8?eUI~o7bJl&3t1V;P71N>`ztH;fuf88!E?K;J zF!;<|IKMO0;M(i1PLr3SE(~M4%D%xjOP5^LcUH^4r6=$aFD5Rh54j~tZ#io=@LruJy5j%Q@YQiq{m<7d4GX(~ zE8Wtdq>IwsEgjMgl8SVRba#g|g0hsP)WU+Wgyhm7NW&s2_2B3CeE+`pbzghu&U?6K=BCS8`Dt4r!6b74L_oX0tPgeDPB*kvjKD{`NhkGVY?ELU-B4>+Js zcI9k51nv5LNfkZQYMe(e<&f!^yxeJ-r}=PLLm;iN*z}RpPhF*^5>`Rhi0NEeA?9c>ya1Az~3c3}uiD znfGSKG`XFxQs&~dm3LANtV=fntm^QLlm~~IN5kXSfjY~A4{Z*p)_fl<#F0w@^j&xEE|wHbSniOI)IE|F5jVmP z02S}!UmkVsMyXke3IWJDwxL=5Md|@sjH5_CDh5Pw_Zbap)+O5>>ykL5&~<1!w&6QP z&$BG?T#wio$}vnxBZ6}YWVY`#_PyWfroWu0O6`i9pWU~r=6PGvMT!(P2wLuKH?RBF z4;0Xg=k*IH5WW#IAaFKr8WHL1G44)i#Tt-~a4+$j-{hzB7T_Y~Ja!y^X33=xohL5I za!5?(bFZ1vw6$ymlveMbGj7g!ng4`VW4HveC*(e8zR&GYMoJm|E~G=n+;6vzTb_%y znsW?Yx%K0YLR#ID|3E=u_uq5Ge|Kdy*z>_cw5#9weWwmaq*yH6X{Xk7w6P!p3jUpC*TGWJk*O1Pp7O9cN{-WgeSHar_uvH*R-v?;yA+ zMouCru#7$=Dz*bsd}q9X<-rgW3cTG#KvL#-w91w*sv8L@W65a84S3vq9wiK3Z^=8C9pzE_43#&bb@vsVisQLEuNWWEG>|NG;=MnA#jb1@i*j&-2U3{Pj%Sz&F zLr`y&^-H&C((!4?2oGFbl*UXX;iDp{fFxjM=#lmjSryPfC9FG{=Blx&ebj+>4*B_m zfzGwLa}nuPp`V@waWRKGMUw{129pnkEZRcCut; zc@3Ow(wrh?Yb>V1HokyXfFW{dG$L>F0Q;Hlem1L0d|whmOWZGCR+Z1?`? zxbV6BIjVm~%aO-_H{31N#`ZvqYv4vk(bO*r>8Y&p*E~l)BHp-tE!=w{T6W_R_TDq& zvntGpT;`Tigp6RMcf%o$iOR#d0Spqv=g`mq^?$zHOzJ5U zfsKDr-qH?-qjo3vyEl!BdcUB_9$<`Z6d?DPlf6^fWJ3Gz5Fu5D2A((x}Mw9Wh8v!6UQH{pu?QYw8s&NKE@#Qn39zfPwg; zfa`D@iC79zcVBH5Xi9Ms7J;7>tbon^bhkc(Z|H~-&3|ONNB%MKP#);>?>i-!p*{%B z{}jd32a^3}pDjQ1k?rpCi=h^l;W&o)vE;cuutx zCO9S@bL3vL=gXd^@8S7kBp?V9sCmbQXS>!bQc=3Ex zrDl||&K(x{RKr37az*J=Jq7aRpYX!CCvjDSz6S)jU*D8S=wm*2+42zL`5`k#Dy#~Z zgSKaM-#}c;=t0hub)J8YlDClMoa)9-cv{VYjA+YpZ13TQM%*p|zrmgYuugD$6QVi5 zowDhY)MmTGWbiq09Khn!`XMz9>0oMN+f(G>ET|MUx$e}0lWdh1#^_9 zAI#WStQFyiv8d?u1MMVx#&fXQpIB$;A^6VXst@F6P{FyxIkLE&A%sPMXhMv{fu0C< zC75qHqo)dIH;ql0MffZWdjUsx7^{)Lg0V{cpouv~igNg)w_@jOAt6f&!;#XeU}iBe z0U(EPQzF*86fC7^13dv>Ze-Buvl+XrWWSQQ)2Wc!8t&tAR-LqZlCR6Go+x~>aQpNl z^2omg@B9{Nh!COk+Q3zikQC@Bo*{tYU=VAlG?3q#q3DfnQx+>1koClq&+u;K4>Vag zPlxM=?wbQ>ALZ2OiquB;AL5nzXhF0&9azJra+exqWSz@;jcN2I$%$_uHJW>z3Doq{ zk880w2qoI`H;EM>U&EzMr7`0SVV(9NV#erI?lX`KSAwwwv4aLf zVi7Dp!vt{JFQ7I49I;po+pb95Itd$-5DPee#7~B>muQS-1)~1dl9)L)fz(>)|MaaL z4HCVd*S|@?54Z;{rzNvFT}){HFhVLHUCrhf=A7hP?>7h-s%9ymR$(jli{YpXMdU9E zvVpG547d=JQ%Th&<1hSCv=({kcw5FKR+HQ3Fv#MPzm1VED@fu*oeZ(9f-9u5|3b{n zLAaSR=LCB3Q{GQGtStcQ`=K_26`xJ$#YKi|diPK91se%(s;V&Q!&IoZj^*vBsj*q}e=n zg=hAm-6>*c-Z!K7OnaOuBpY79QffP+NJ=kYS0#jALN0=Ng>h{B<&KGkSwcCbM&&}P zWasW7u@i&1(dHc12IWET5t}gh{(>vy|>(30QfRrKpE(ZmSi5?->kt^ zf2R)5@64w!tap;o;|&+L^f?E(`GE(?>d)Q{pB(BJshg1;j0hF~MLk}rqIur~iM{+1 zFPfu#6hEpw))gvajrYWOo2)JuNv5CGhih3~nAgX&xn=9jY3HeymGpKzDB&8==*#ac zV!gY5=xaq@?p0T9Y2k5koEcZn?x$nmTFeiF{40E^mp|1N2ok?vpOU zQX(%SDX)h^&zQpbSG$#g7q+EtcZ+Igq0uD*g8~MZ1F<33L&^1Q-xuH-P&u=*`BpgB zT@*|AsQ~k-wpg!gdtZLyzBmby7xxi;x;IxH`}*B=$7pEcP9Gx~Up_@!mX(tjb(FW0 z58G9|Eu4c`ab1<`ompG#yv5lCQeGbr?DGwY)U7EwS)=CrSkcZKNk3R#t2` z*ArbH!ygRH1o|_xHZ$k={=%uhMqgJYq9yts;%rqZL_UR9KwB13QSNygSzetZ_aBm#E-Wj+fMOVUkX@XQ@7xF010sVSW@&JZr#a<|44x zM$f>tEu=p(@jCOUr^#WqNn&KSo9mvtmei?LER>zBuDkhtqUjA8m13P($*b()8=Hr^ zt;6%!2DJKX_7s@RMN<5zXGfk+TYxmRVbwh|3d?Z~Dk7cdx^=<B)j%g%J&LOyd$r&- zYUXMlGvaZXV5(&^;-aX;z2B6TsBFkT)IW92Caz#r0(|YRdNIO!ycy=cef8k1VUhB9 z*Jx^>&Qds(MXM`PG7>uA!+}m{0ku9Fh5q;$Z4*J{yr({(L_;V(xA*_+3JM+o&KG2J zFL~cID=}y~0#<^10DD(1Cs%xXDYKyy`FqcXmq1#10qSuXqWaL)AEjYymct>@mNFH{ z>Ag`m2Q9Up*l&qWeQlKCKxn0%{5vJW<{>Pymrq-lCF7{g14}(O3rb^ExzrM9ZoCLa z0da6si6-@u#imuC9PT^Xc(uL8{+)IpFHhBkWTi97(6RbzK2KbY@NVhkZR}LMkgk7> zCVj_ua~gik=vtc+%K zw{32Q{dd{P;2t!|?wFK>Dl(TJ#fT!FM2%+5db(&xwEsmkA9=BwlbNhb9&s8)%9nz; zO*`J5OGlKslkcmiWFb-MP5sE02o&;!r8h=n-Joj~i7rqE6(e56xxXFMFptcl^OJ9G z(uJb*el4K2Ny#bhW8UcB^c4)nz=le!j3N=qVewg#8zat{7VK-3#hcAEF*?hC(tXj? zC4>wg1yf&AutDJ%N;>;GgLWy_LnCx6iRaaSxf)p525_&O7}k-MUljnCgfXkM%3EZ^ z7v`gjNH{hM)C6MWqpbujt^y?Ej zp8`ld<0Tv$y&+4!U-@OQ@b4OaAnQ^Gn02+-+ULjqbwVvPRJIY7V*y^V!zQh1r3n$L zY>&8xlr8<#%|A7sve~eG)T-r2TmI-U=8{R$&uD0bo4te){7>h|cUTtSDeoT_^PVNt zyTsOn0v0aC>iFo|@m76>2!`jcWafIt)`Ry-lrI{BX@2BrtI*IYv?WMv_Rx9o`uU6( zD6gm?Oat6e^j@3fjh6EAx;$RS1XR!k5vymQRz-deM*@9$lNl!3Pd1F6?1XMKLW|%< zEh|hNVU54>0)pl89e7)dD60kA9ul}O&Q)KA_FBewb220>G>aE|M>__oN!{`d_^<#6F#GKr4Ov&MvWt+iN=F-q1{NCyDA`z$8Y? zGaLOpxOpQ}5 z0&PVeL3XGFhM3WxFgLMU~@c?T*UbyuZuJykD?#8yft)p>=*&Ci!)M_3dMg*T2M|6o9Pa zGaq>E8VOf|c}BH-H2pGkpDgL#`0P@UCifU!OK1LX9?O+Wis(c>D~;I6QN{gr16^V? zHIti>%CwQMpBK<-Tomj(X$nN4ASO>&d&EaZ%!vIzOA!5JNCUa%gHjh#egyI~u|k`u zFEw^IcKv2M^M06G_h^yF>FjamQ5MT;`NWkcEI4WFH-IVreb?McsvZ(H<9*a*S@C`1 zwz6dY@XE93z?y6C=$^U}Nrhq||I@967o#_cD@G%KpP&zENl$44Re=E@+G#6uf)Ss` z)fW&+jZ1(odkJOJrsGnKLs8!?U1R=-gyPI8u4SJb{fZ%(4Wt*By0n!;W^iEC(_mn> zbO>!ZMir=_93#%XGG%6A(}%~i%`f6=uA&iO3ltKfF$Nk!uv^rW!gQF2FWH$A$V32v8;9GcKJ^7DQo67#J`1Dv{Td{c?|5%v0wpLUh_Ws(bJqs19!+Q*9$Vgn__F zyNTF}`Q^^}yJYrIN)d!(9B5snoHkbkljVQEi*b3vZH8JV;!kK&3SE>);eeS5?P};` z_2e3JP@?Q|)jmtE;0KGM)3Tluw#9OLX;WZN_x?D_dFl@}YO}}-z3!BSp)*0Z29ccf z{26{ar$qCVs0zfnQibk{tWu44Hl^nKnO?RjEFAMhM*IcEpzAhKACbj=&#hd(0g2Wco~97KnF$RDGVn^bGY@0=|ZaJ)-ZJzFfDlXv>G} zqpPS$RmJ=5_UE-*G|kU=zdeyM9ywj()_(S3$&EA{3&#o?YmV`?SX)xgjjUYPPQ3^m zs9RBl;rN?=q^myrqaU_uPio~$2<~dD$T)OiBIkDyJW|Lo!JUj!@DgLVjq$A%Gft(t zrSvwUabycgC9l0aYR0i-YSL(jEWcD+GZC96d*P*0J$ZyPSs|7fJ0F4V$JC;_fV1kp z=2rtN#EL1CVP*xH0?Hb7qEJ_1#I;{V)Tx>YRA6di(`%H0za+dgjI4?;%Pe!qHFTwq z*mTq@pL*l%J4x=EsQ$Xo*qg#XUey;N)}9whSWwjD44hW#kZUmYqQ}$HulMR^?$EuR z>`;43HO(=W`4XJ!LU>ORsb4<9dj< zw_HT#!cRAhl(r)U$_=TYhOe1H_8aS6Oq5KNz69l(9TQ>^Xl4xpxXhOF&FCm`2B*<= z_yaF|DQXlKU@B43PWC&F=J1MAUwE#V(({AjpF){(vp-U=t_0cHTK@WNh@kW$E{@8% zR=wU}STu2f>3d~)ym6*A*a(xa3Wp6w$j#YAvfq=gS3 zxyAc0&uot__hN_^_FH%u&5^%JB)-)DhOLVAkhP3|Qyi;VK_SGzw zH(8fBM2oVI|ETBrcMoX$1D_hcgk#{n91Q5FtHc9i`>{&wtBb~EhxmvaWi-i0mfQlN zR1o3RTk_w^iCqHR>VJLYJ8RoFj%Ye7FEAK#@xQ^xz2Eh<=x{HlJZ7agU3T2iZY5ne zzWKKw$3vSL-N^Gx0>&%NX&S3-jvZFRr-THdE|%}v_U1PQ*htiIbJ z)gdI;B36Wx{Y6W}wT}kDov!+h<+qV>ufMxJ=B=_(pFh(o@=>QpsBf938WW>+_4o4b zbG!VIE$n>inPvQE1xWvdc3C%wz7uH`c(&s_$lg`0Xm77p7EhLJWCVbku zS{0_H!q#vR%AxsJWbB|vHWScO8;-P^M#0EgTY)Ju35;jvAr9o+!u{5_&qM=sD9cN1{MIn*SZ94#r^ho{Cw3o;zy6rY4|cW9G7k18 z6S^H!%wzs^@mhqYnFA^!8M3P8&QiuecwusGqqWTRct+~>7TWdlGw#b89zHL|&$|o%vI{cQ# z*+`|!z8u5xgSs&geh^Xpe8nhBan#P8rbsck8$N!u{Mo!-P~0)FHjYb13nngtU@-e+ zlb+AiNIHG<{#UP*%ayLLha^cc3B$knL^wV+j0ZJh5w0a+vy>cl#o+y#1ycuN0+Dh+ zH-H-*7#f0Lg{&YlFqLTCqqJgk#iJNGw=cwBg`!4O~D^8)2B7NAm3{< zp!||F{QaG2xVY6{K3S{Ub&UZbOnSuwkf{AoWtGvRNWx z1~on(W=Dq)*!#nK$&!_S;zP0Gps)5FVyxicNI@yHwL?3R-vbLq#lVy^$p3I1nsdx>HL4)W zaFtLx+vMKYeWZ39-CMfxK$~a*Zk$s zuhbh{RW%og&|3ll+Cx8*$75Drk>F%W8p+NfWt!ZgnFW+;%Xa7UYWH2(eeOchfjan_B;5jC#z#V52miN(229$`SJILiFh}RCq>>;L5eC5FH1Pwmb_Y85F|X+ z);>qt+Fh!tc(+Fm87!S;5ecM}?ZGcBY?<}VeM(}mJ+RixX?y@9g!m zg9Iwpl2O(pLCdM+d`cGxc6=kB2VO8g5_{E%R@^*oqdCcESPkyRCqlggo86^LLN<}e zxQls=L|Se_1Lld|x){;kigG2jz`Coq3$|+F+0^<0*E_e?%(FV^0XeqH@wFX% zc@4>oD{DhsZ1W-eqvg!x4-@Qs8)w-0(d_|_k?GdK;w(Mjo<8d`a*=Z&ab@0TQS~H#Wx04-@T?}uTz zg(kC7q;jlueH23#1P7=iI0M`p*XPfE4!o~id;XVI_wxz)wm&n+cSZfJeJ@Db+M`eV z)+z5C-dvzbSNefO4}GjIz`D+4Q#dpl96ivpQ`T?iINE)X$`NC|=*Rv*{N{qxRK&uX@w^yHpuT$M=hyWUil z4cCMIHpgXHwl+0NG|6*&_0bv5pmjHQ)GSYTT7Tye!cmn7e_s$UA@S4SxxnDX2v0&? z0v9ej^e5KS>TTj%75_`c89Z2aQ=>AswGb8Nm5$48f0C3iep{ zROvz)%2ekot$c!a)10bj1m zOFRKE96}0CdLuOZnx@G{SZ%fsm7nT=`ak4Y*S=Q|nQvtkUKn|Vr(c&M)*nDm5#GAM ze_TzmZWkcM=xHB>BZ_l;FpkDO5el;{2avyK8Tv?8M?m5GEFWBPKUK;lAwyJ-R9c@W zV6(in=`O2RxMy!_@IgNsjr4b7W;f6g*_>l@FIr8U$G4|ui}8v0!cU+gDMu=8ACtAJ zQ*D&hBQ&RU6xbZc3Z3<;3vOtHXJXF!jh?Fpcvq*LC)e&DJ#mKylKtO4TY7POg_m>n z;Qd$iZSZA_%@JMaQzys|KJ3v?n?q;z!7SjonFoGRW;ec1*bAi43s)DlN@SZLUSokR zMXmw}U1Tb}Sd4B8IbJb4NAB8RSb=@RA8?vV^eY20utM49+=D)%;1=b7~v6Y;RHFZI>)hHu1hft=8xB?d7On*Jz+S#0?0Y z`!!}TfAWGYeGj#{I1kgcsF`YLryY`GbH|Glk@c1Sjl>u5wKoVkyZ%7I1K+8QP0WZgWYtpe`2iR3IwL_*I97CF?D$-j(CdE=)c74b4oa zCOm@;RH3Yi3>Mhp^H=I=ZFyi_ai6vX7`Xus?KtkNmkCfK;%>do$!*{?oZGFSb3A#j zjCQPo#%$t>+U`C5N(ZC^dt!C?#kj!R#^08X&WJb&09w(WL?Sh^{qu#@-oAu!NW^;2 z@uDi}1Fpbz3kCC9rshnoo`F7->|n$xJwG%etn2FQvXN+4N0=_TgMC$UpxU?#o9ne% zJCaRG#iMEe&A&dsM1v#GO#M8G!yR#$G929cEPn^pFaPUHyT7E3Cst=^@Fww%z7CY> zWkse-%i&8)lHB8#6=Qp>hw)`sE9a@SL`}yEPCluR^s<=~s3sn_p^6oasC<=f!{KMN zbtxfevnrsBELdR&5@{8`9^;kL4ufi)8Nuqf6n#k&jx;uK3SiB;O4&8}qIt27ZJ+mf zE{t@QaO^nvOhY%y#S{|Bt~9jeh>dw8(_EP?sL~Ij=k}jfFVD5g1pA2E;b3%<5%R6G zJKBk!Iu~xO@M*3QD5>6kS||+yZ#-+x>R%K=C;YzJp#S36qaOWH(9+4_uXB96>@Qex zN!>jQ9a^5s$-1K*#sJ=}Fwf@?JftDVKYCip%&ib_na5f#R!xsZ+b5gqi^`M~Oyio7 zYodZT(d50+?=&Ej@cVP_PS|{2FX>Rqk|D_aWUeLoeNt~``MLgpkXZbH9&y3EE>)k? z3a!NaV|S!ro64e|CG@x?zBGiYo2vk-nEvLR&^s5^at|scV4tzTxUh<-p9%Dx%P4-f z#xah~X?r+OQ2_RxWc|kr*4o#qyBCf<^3W|485WZAIa(cAFAu6Lw??ieGjo+~!jv+Y}oEunDG%)w`iv@!z&s>0NoBC2Gz2=kgg8Podp<A zfKksDSpy2N3~IctWkYGXU~)wraTMUL@~FamtSqV2Kx2$hH%sg0o1oknbMEZ(Y%|YOQompcD#fH z^;xiqMrZz5&Ij9YiVb)qj9G{5W+oduRqh2Y`>h9u=f~-C?O6SW*npjjmO6%#M5y6x zPpdjae@xY|iaQ0E5h!)`4T39$ll|$mv1V@XIl6|LY2&V*@qbLm80?a?rhQj!IKsoI zOqEHWBT*V$;!IdpYTL6+h+;B+-7K8XaKA@v@5^1BWK@l%XBE72FYd_`g=*9&mZe~D zuu?ql)Ldfs2?=9Qrn zbZteQC*qT7Rm?*6)hJ|=UHN2wlRSW1%WU+c@*loc1rpP{y)ObllXwO3 zdFC8WfWNlWG#c6AVt5ew^h^DgDgzuNb4#{vSSKo+tOCTLIiQZ`UU1DsJYbV{#hD1ox}Ka1;Nwm|K`>3$G~tcw^J^?{q3KuHn!lY zDB~O|@lcXphTzZ^#&6UA_GfxW6Kj@hHO%{HR^o+t(3UkztNR!^gsoltzMvw-Pp?gB zP<&F0Ykj!PN{=|fyez(@`jaCev>C2LePf+iEKyP8ZDN}P;+8J$$xmU-qCZIVva zWD`O!AZ8j#g)nkBoTAU?}l&|zW zAI;=z2z&bX5QtU>7|eGytIV^v4qQnrEM^ve)^9OB#*Z3SJG0R$X?flvy!iFeIzIsg zbm^>eS#K!C{)Q932LJ(F(i()`_>b)c>nw{`_NEYCL{)f0Geulr@0{9rvR;4RnvgC? zq1MVwRY# zNdzehX3ZJ%-=~%#ZpHg_Nb@`zuLZ4y01WmdCbJ95Wz8ZU#wf8&@IOD|pI%b7fEO)l z#5UrYo}RpAdbP8t13+6oZZ0DkF+TzuAkXvz3asZ8KS0uj{dho@^@lfqL7O+Tpn~9s zIK2pPKh^inaC57!rFfa!RD8vO@ao;b+tGZyRJ2jv>P5Yx-`XG*35((@seWF$BwVZB z_R!zt0K-s_H(bEk^gfHBokjN-iWSOhx3%@{Q9`jO~{6Oy=2 z2QsyuQ#++S)MMizSodj-$WtOkOUFRK%i53t#i#iszK~XvaK6rCyN3Ekhm?k(w`>}w zF+l--h2ebX4EcuNtQ&*$>qs_4iB1B?ghiK z=Qgg+Ys%d;wJFDHgU5|S?D7wJZ5roZRn?9QdqLxF7JS9{0eF;(LB_$7*CFhF=_iLEqs>YTQ`kuPNqw4!ZX9*se3E_UV}y(NA1#CQJW zCa$b)@qF@)onSc!H)l%YUhh?g3qM7tLQENsrn4ZWgkAi-Kvb|H-c^(&Lyw?CTO+d$ zI$!MVjsT!9+S<_+KT@5|l2akQq2*0a&w)f!rA9pM<0oW=w*<#d{cH@eNU_<8 zE8@Wrv9-A>AQS$_9C6_R8(W;>q4bfGAp^>Hd8$j%4vAqQ+?u-?yghgTUz>F8r&hzR zdTe~poXtWThsN9`b_bV3IEuS}I^YT12Q0m#75^|D*-_>cRaLE{_HS-Ot*zmeGtV2_ ztM~(f9j{3{-w$!%H|I3009OVD^SzEYI)b2E=!YzBT47Yyh>#UU9+0^ECdj#qYLs42 z;_aMh2nS_8tkoq|^E||dz$k-X6WJPbtGnVfvLb;^f~B~GxqIU$wlLdpK%bVhX=Yzk zomD#fyN1YI!^AiT;b-A)S9r#H%KlMoG{{L&D}D{b==$IPX|#*3#{eJl(UZf5+Y0H*o8}E83k~~VK$&EY@u{1rVqitM>uJmAbXJpBu+L*G zEjY+rBRafeGXOGi8Y28}FYak`Kn-Tc%JF+UXF_%+l_MH&1mR6<%d%Qu#_O0bfS~6| z3#uv27ytBKjtxvQW-W-edBXZg$CR?_8u`gu`9T}A8=(q=Vts6G2i5iPmP8;QSsS6W zX{V439eyz<-r0~l5o;|S3>P}mc@`0Zr;suPCutuqC_ z`aT+!yWZl%b#C+gw!)+_ruAQ0enNd6P3&VByqj2W2158(7yA2A>@O&QA7e{#$1!f( z)rMZqy3;yY^`xUc)?n-#3BA(sSouL7ERHY4p47=aFZT7yQ){`K;z zKKqjW*U6~%C3fBTA1BJ@>_#8#P+Oi+Cz^Wq$*THH0tgJ+W zg^gN{Ms3pT0$HJ=u1{+mxM5n< z+E7USQQyeMADsaVXeZw)lg}qI}tCY>L%ARy{ zO^`R=j1O9k$N&a;5xcBtj4cjr)?3slXmH*3yMaz^`#~70B}JGgrunuN(0ySZ4toqA z47udGL;{WG2sYBTW|3$adC@2#<9*`PWcB;ac-$0A%J+F4kLM62%s7MvYtwdj)-iZwpL5N z^{?@}O_j4WE9!U>6-XQLKi|nRp?zQlh686k>vhG{d<`FI35THf35W(ZfZ3TLm9{;+ z(QKW!p@wfVzyW9LF>O}Z)7XUE3=|^KyhR(rYEWb(To-CaJ4vfe>G5T}7>!;H_Q)8= z&kx5_&tB$kbTyL^zRl`c%DQyNmrqk5EdIdNskf+~)=Vy3s>(om`^I{YdOYzWJrA>O z*hBeCr?ZYhG9^vl$okD;sW?-2B89zUdk^njOu_W4S)@;{`v({B)3A6U5xdg2^@6{j zZ5ZP5k1$4CIEhd|R-G4*jik3jp4sPL3H~C6a0l<8z^F}+X*Ou0k0>nG){L4I2zNu= z^l>H4@-xXx3v-nZ`>{W={fiL9s%ctMN@u-#AYT!_@&SKvUtQ2Y^CH=^xDY(*=8gHYHXPfp7ts_Jp8!xflRd3y%&TjD2x!QoC zm>BVxa2de`Z87ik-)1r++@)-wm{y30|7{r&5lAu%U`gK=j$jB}ul_ix)yli8oH^!+ zp$aS#boiuD>^$tc zEQJ(3bGi0M(Z6elVq;_*d&EWK0^WUpOY<}Dd-i??CE*44q=d*{%5QIU|8$!;mh@OU z({!M=jXeGP#Bn2aH*iCC({rH*EM#hNzZ?%Jx&)PWcsqI;Dl1HcXk0b|uK1Epqlf!f}A zDN@w8(28Kl!BiSA;@MM7Y!zJlJwAu)?S(##D0HZqW7cbzwPq`JAIuZ#m3*^Wsr7w) zzP|H&;y66F#UO8#xCFJ-mui4eAkVW4<1(wsC}UeL(d;9m%}9i~q*i~)x7csxZjz5R z7Kq6hv><6+8%)mt`LZNlu{A+A{8fn)fzCQM&2_Z)Hk#vyBZzun{_WvW}aRqIv;idG#@lgG;vu&UdWdIjU$XA^m{WhsXpZs;=1 zV*(V_4*n|8=IxaLoi+S>JlsHm%V|6|op13P-6`}d6H{Mz*0uRVyK(d-u?X66n~P~` zny2X$Ge=_5;l{?EqRJ`xt0%Sv`MYR)2fSP>c?Iy*#b8> zmD-x6Lk8id#Ts$HqbFIBmClpTWtb)=86x908~)6qW1rv}`K~uTXRtyEoZGh61}A-D zc_Nodz%=}on~C`;`RU{yEy1`5z~|6et6jzwHu|a z;w#aT024ju`^JDmQ-5r9j_$U&-}VS_J!v!6r4HkH#IrpI`Gq#Plzh(7M)@EL`Vg3= znDHKaaXz^vn-J&uxmty6!5Y^TCrPnmWK5dBLR+uq+7zF0GIEm-<_lumQ*?O?jwK9A zlu4M&?<3dOE^h^UmH$^akzKmjWtn`&ulxbG(CMcQQHMJq@Npe9hyN(0(0Ex#bTflA zc=YSjpGO2mIYhyS=lJDtAB*R0?IO^i7R%R0J7UPEQuF)~*o88LPC3xPj3RsnEKf%aYq z;3wd5Ba9ihJI2O?FAV20BfoB8k1mA7{tC{=caweb@eFCq7wcSG=2Hg^qTu*3J*zgd zu6WB!KY%ahbPF-gSp#w*^~G-13JnMQ9rh%UeQuTLOU!yo@)${g*EN zuszLkTwJU2p+lE{YF)R-zq-jt6b-vaG zb?%o9j(GX*EF-=y+L^X}N8Bm)U>&$?4LU&k_LrNE9&MU|hSbUV>BN*O|Gc5r_%_rx zt#u2Rq2nau=As-Osi`*rRLWS4!O2CiW{^|nEZSsB>{M$$C+vvKQ-NZ(Y+d)Jm2|8`0PICU&sU~w1@2!~ zAvJZON%DSUIhxaFX0F)-qkiJe8X|A$^rxCmc{ z)oq?vVHsn`HymNlHaxKNw=t@{!TVZ_u#IqDZ$tl2%=Kn)LB9>(=HVQ+iDoXx6=~n| z&{aT*#?szv5@7!~Tc4-*978#)?}BD7_rf>)jgSk{73H67Xy3%*+yl|%nEwhMt=B^Z zwA1xSyy(b<`0i1dcFKCO!&nYHj;Nsc_UzINj2HiZdL0 z{K%Nexx&!%O=mHr+GG!pXGkH^$E=dfHOm(!cH0z(J>^!Kd)Ggg z#&m4`#LmMaymyNSf5J|3M_2nNrZka?K4zP;n(mfrZcxR<;23jL*SVp3@ndN_kUu}# z)AY^VgN{h!Ncd=PKP|~(kczPS=!U0Wq{SiSRRBz}^a{tNXQA6TO{AP`ehaZ$^pbKM zo-xV0NM7BWC)`l6L^)tal~8KWP(|JFvTkBjdFKXxF>nL~NOe7Ib;fTm0b{!9JC9X) zDLnB>vz=@lnt9trXmb$vCzLAfa~8*#RkxHifr@|GVd+cn-G`2-DW7Ibig^=kC48u9G6V!Jk`Xjhw`9-#d)Z`&dsdro}ZRn89ot0^- zjUxaFrjTC?y@#?8+Yjvi%qGkE5}}U1-uGp4=lBv(IDs+=u_SQIJjOe?;`HF-ckTzd zu1bF%tn4NDS$}&sv_PpZD|OT^$Q)zo+pT=(-%b3t-0S=@2P1BByD8Lw{Q7?95zEs6 z*n$B>qSu90P1~*qEw7!rHLpn1;xefLR^H}Fi=%#rK%fVzJ3EI?IXzq<2;@70y@rhW z+6I!kG$krc2-(>_W2?Rjpi$fq)E-SzvBVw&#^etD&QpqLq4_1Y zf1^fSajREwqSVyF6INDM^DpP2v!sp@a$Yh}>TcwLgPXa0A$U=H z_L@r*&~FaiUg976x|kLm`+5@x@JeQQ^lx<+@76%i)ZS*^ zB?^9;|3&zH>oS4Nzdz6u!QSWi_y3idE&1a44Rc=}1 zDZ^C_oy3E%|JaeZ3pENX&`ptdJq0QdgZ1QaO}_|klkeIyO#%r^ieBSq-juM)>u8kt z{m73D5PafCxkjP-zE@!np3a`T=2K4m07JbBdGzTUKf7Kkx)|> zS(-hRF^G5qo*NV8pyv``=WkPm{L1?d#vJ3)U~tlt&dxw!gHA_NxZR+a_4`y}=#73^ZJ7?`_1q4-0N=k3{!(VySR+^XvVbN19Iq zw$%z+9o%2-Qa-_*FPbIi3+l<=^h<UgpRUh-$-dQ_V(%v-3XD1=bMnPwH=!Uz;`UV z#&V+)=%TeJt!t;9x+ozAqWf(^jD^G#FMKv5SlS{>8;fLIf&0Xrp-W7$EYOod_n%Ue zJ(-b2$_g3QLR(BhY?51B5B+tZ0R8>}Y7e)K>V#w{Ik^Yfdp6k#33G(YA5J?oU%M`a`?s)Cu47^lLU zP+?wnNob%G?ox_r-p&^ja2Dj{yk>>Dv;p6W`)k@j`}Wvg1p{9>TK2t3O1DX?AT7R+ zgpy5<%23mk4S+rHU!y-f{!o!z$B)_=+{Z9NU`QT%@!qk|2Svy9qiKSb!(As81bWg_ zR0)t?l}BIL{;@+^Xpz^YOI9RXSrL#aZ62iVx)YcRJ-XVjqq)9GiOW@Z*C-Y{0_vCw zomG+0W1~K*>Pye{GNewf_2z_`*r@0)8xJyKRgpwuT}}vLOr1M{`>r0(>PirT>@COh zs1dTYaWn8@W5!%49+xLsHu$O1BXAUt0Dj2L-33R7g}HHGLQE&;FNk>%?DgKp-T%*b zB!=vJAOYq*>%Sw7-m;naWCuhdTMbY80AkLkj+mwKPA%G(`$V4a%bhyfFo%BHYjq8} zCez@Joh$Hr$mn`tiEY+p`{j`V7GUY2(T{NQzCZlXcIsQ>p{N6B{&`N;O0T|667|^^lUa9y5lbe!Hj$lGWz)}no z2YZx$uZL#!omL;G^*v0WU~!Ov9yq{iDkl!vH8Mdrci-2-#E@($Jp|gTLR$M~zwq!6 zs_Ih9w~x>KwJCY+x|U@=`bJdRt3*Uuw^51Mf)Z3dDCAXDLcP7mBLhUK_@EK+vajAS z{pRGh7oN{a0+@TSzqFxaC$8DS)V|kvvSb)6sdxn1&y9<@k%eHN@x9z%d0JB+sg+-y<8O1 z$BpQzKID>!_qCXuwnEBnEvtEv2jqR9f*nJD%da}K3{|tcPeRBB&8RT_8+`)#FrB|w|M(iJxGI(5*y|6SoyO-}jYfr994B zeHjr%F^(cLl^QBdVVaakc+!JqkEp~sF}{y_oxP#U8*QEI-)yn_AFj0R zwD0&O;~J@55+bxB&sIw{)?1bC#P z&zgU-Nie2aD}Hw4ipT^|rhBFt>%`Avx!#z!1SR5yzae$Wo^jWRd-30l+Wz$$Ekw-Y zEujt6B{MZszQr9AfxB5ll=%$)d2UTw?37Kf$AW{I%yzSMhO@W=lu|iW) z77<>Z4zH-kWwbW)25Cim*>t;-{tjJ=L&8JZ=K=&9BS)`FA5JoZa_k9mhsIn83UEly zq7ZeM4S^ggjf9o;VcU7bmMDc$NrW!AP9iZr2NvUIQ5jbjvVqqMk6jyHo-0LX+So~U zfQo)BdOhq-IMwmP=VY||T%piDbAK-7Gxkz~3T)Y^uF|9m*}+X%j+O4-Asg|7KiX4N zL}4Hed!SmL@^1G6y7WM^tZ*qH9fe|Tx{+Y2aL0j^b$uBtONCez?Dbm{a9Uy&(+8-# z)y*=mpl=gZG}YVyhySJ*1uxwRP*J0lS~T zLTxL05&W=?I^nI=7;7qGUnna&t<$4@v!O5@= z#Np;0w(LV(b`IOFZwXuKH!dL(vsr?T6}Ql*+hfX<^@n2)fV!j#lX>uNJ#?^!!@IVBo> z&F%qeW+14p-I)KX@Iz(7{)PAA0<-t zjP9Cu0PDqfuv;@Ogc8%t8M69st9_1xCdbV)D87zSR$M8^HW&T3T)IV=_v;k!k?#>; z9AAc!^`~7vYoU0r*W_9swo!=Xvy`m?>+~(f}*Q^{L!J*a-CGB;aZR z8X?>*Ti84oKG6}9GV!h32 z_Khz4zRQdD2aP-~v-nH;R-zBHXcsptQCN{O~6>=Uv0Bq){hb>h+MWJ}&;$4i7V z4(ex<#9}U>BgM{yb7m}5n1Sx6G-PkxDUS2o@O0k9tR3&Ja%Q*D;}rzeT{8co5%b8e zbZFyM-6+~q%T5FRm(*9(#xhh9rh=b@RG0@3sTQ_=t>U4YSCfshtQ5u>@6vv%VZ&27 zaEdUm@{p9tV8**LBCh64M)%2%eRAgu_jN37kz3QX{^1)%()0>sQce<*cU=TpsMZml z1AnwEXrttFlE2r&WcEsviMs;O&{B~K-h!Yos4;Y);&x&1ZA|}*Z?)*YAS0tNHa6MO z$=r({=U}yw%Vb}|Q0TTG3-W{M&WoQJS zed{wFKKZwXRA=7A{-{T(-!;UJAcN5BVA<2P2@~COD-QbDnJ*}95NlPq&vkaFuxAm{ zUe(P-1d6=-v3X{{YTmZ>lMw89=;?uj+IAo=__Ug`ZqV}y*dQpCV$|u=PFW(ptSP$1 z1{unU^XW(&3ZIDXf~xXo7yf-HnPs{We1zXwDvyPtFCuw^dnj4XX!8ft4*Dj@;tp>A z=i^ELR(fP?oCar%Y3lj?Cm_D<-+2%_xP4_+L?xwz<`NkTDPrLBF(AK49(q9W4QsDw zd(y?&!kP~Zcj;nbqQP%s2rh*18Ap(@-FQ%|9cu28`Pxu({g!99+gU>M$X81Ix3vj4 z%xc^I(IJE{;ZtJ9)fK&f)DmT9fO8t}#B60jb&kgE6$ytdVY+B zZ4-mfIx9PU$6&lnxEhP1?AJ0*pbJJb6SVx7neDdhK551K$i4U<4b;4aUq+I|U(r9~ z1;mPT9acVpVaC*M`qP_4c#R~yPg7K#3~%h~neX)Jw_r2s;vS4k-OJyu=%8i3fa^roXZUTy4PV4 zRHddw2>?Z*GVYnicIN`@^;wKcMGv5#)|M-=9D0*!6|ZGBIP!F} zP~alV@w!>1YqAU$OWsDq;)DF!xSSNDfm#>^D_rlN&z+9F%v^x9N`{Ye=Juequ1m}y z9Kf1VO!=pXVRC|G^{J@WT%i4DdvqqO!xwm9ljW_P{b|y5SaItoA3x1$h2RKwD2Eh1@k5a`$Yp_L=2!MRy-}hPPvCFD5Hv>_g zXsDYtZNmO|4qcm*!3b{9KF8X+=N7bglU{BjVd>9avAtDv$-nN`l=t`Ymt1ING-@2} z@yj+b{wgBznc%acq}7np@82A~mQK@H1O3UbnUFbc>i_S1L_gzZ;qifuoL}Rtb@_t1 zAK~+Q-6De&l*+~#TUx8w)^!SVsCixi#c@D-h|M@7BWFQDUZql&R|;fj&%da7HSn zz7dchBKWcC{``EPD%T>~Z!P$}2`DCkv7&W{B>)4c@}v(*NkgEhY2Y(fS^Bt%`#W5s zgov}F=Ed&-mC=7P+`RW<6pYtN@%VIKv(d7tSYtL+RgT53=^x9=XIu88ox)HkS8*eMMo){t%+fjvAW9n zhq#8lpu1|T&6hO$R{lgP`%xuzJs!bZ0|a+H$E9WQp~diFvG-}&o?yDpJiJYz)1;n| zyg?o-|o&m9!xSO%n_%DA>5 zQsqn>Sl*GZ-GA?UpOK;M+6ChKh>+66c4)}2|2cC{8TI58fLO>LwoUZaF@P*{%)B75 zSJ1dQwu`902XTC{U<#bq2NE^o#M7t0r)2k3Z?PbopuZzM%vOOv|LI1rFTz-idcF!HNfIqAPXII`*r>cz2o z2|fd2$nuJwbQtSL>bZ>2wR5)+S{s@YOvr)o?08?g*qkBik!bT_`v{FxI2B0rnTOu~ z3*W;uZf00#BaJz&^HKKO z>ik<$8Op0E;}(g}dEO_ZR;#>(6B{F?*xR`-$~Z}GKtInzKrY^E zWmfrn26jS$9|?*M#7?5P*bh4nASdFJ2>;nKO^09z7q!|eqG#nPjo;8|{@j2l2-)v2uatl&2_L;2ISxn{Oj4%A`o;1K`z0d%b zSlPrhgRtvffGf#^#?+i|_XF(zvg@;eEq)Xfs-J0||4}}&Lw6Uzu5(yq3#D;D^BtnTm_(IWm5o1xEmxia%*Z7yX3_E$_gAH z=fK?b(4oPKOJkV7ggNYc2oCmV!aIoZkMG%Oiw}Gc8aT}tGcb!QNq1#&zV7QTWkQMw z;l%|Von5*@3(7&ygTm;WoSfFeH5BoKNhD))Yj*FWRDS69`pELdF+262?BxjXwY|6Xv zf1vN^*%l9?dn)?vut7$}D(uG$boT;ml2EC=2$M-_Bt)g$WYgiaiu1N&@87V(HC3gl z3_WFS#{HlMVr-%&&+a4>ulGAbDeO}a--p}?3hXzf9H>L(JZ)hQPg>U~WW(;5nKLbY zzFQsn(<(w&GM$;V3aa9CC8+}8#&;H{ahH{wKL>L)qc)=O5Dw-G$Jqxx5`L{(lWRH> z&v}=-l|zKru^|=6WLS*t4TAxSP)CAU5=3+&PK`2DznA_yRp60=+x8<8Rstp*UXodk z{LnUR97bBjX^8W)M!Gtv?p!pS4r*o&E~FFLJ`x@HO%5fm4V}_Qha+ZsXnxzeA@l|n zG(yYs+Jc%(s!Ch^OooJBRZ*hR@oM?0Hhp#beIkS@Rbw2vf=QoR;-P)>5zV zWskMxZD!Ahy$T?4KT2k4L&v2YT0zXX&%ncaBJ0oRDu3eqgy4rM*@sG`sw`f%|Ga(! zpL)+pVt|@_r2|U~zmz)ej`fD3(EZey+++idOei5M|U4utq$~iqnadfm`9B3_F=s`Pn%|6oECb{fR$5 z*^lV5r!1Ns=>8DRAFQPz2}gSIR_>!PGwG7EsO;^9!YAuj|4CA}VSr@$>htE4A1p7i1*s||%0IEN2JAM#|9G~=y&UKBCQE6eT$ zU@E9K`;(HQHkWYgPG;Q2s*U~UHwG?;geYQqYF#5{%v|?YiRRWVy?2pnslYaal+Fi5 z7XC7xD(kbOVMxz{iMIV!7LrTC%PB689^Z0vR=It~CvPLD6Jev20`)l30W5{X$*AHy zlgwQ1(176*|1Q%yXTnW-Y{*_ZHgvMdp8A5<*>-a}MR>fAUF*p3qb}=F#4%aJ`P$Bk zjdoUr4LThq&C0Rlv)pU=@yomqn;GXLiToR{3wOjD)PO5Ym^7v1J`=MREe z{}F&K55Wli+x5nBv2aE5PDq0G$fUq={KCD!$1rZJAk4?Vct=Q^(PCRb3@oviatnlr=0dzhP{JDuX8&081&~K za2!+q3b{h@RKc9aPqJ5e93)}ZO?S|IC;skJ_gbym9NN;+B|6US&NwvpC*jS9Wg{XSDl^;%-Yp*&Up3m{?>2Gs&O^DH*eY+>1NFHg_uw+3_wss<0 zO}KBy1QyH^*4^J;wUNmksCna&`i{5pJhM)e*-xBUlg|tflDRc^IPPauj+=)lCHcMV zXbsud9{io5_0~R&y*NXR@>gr8|J`cOJrj=REnkLqG1m9xmw2qopDu;E)y`}0atKpW zZo0VePw9q0gieiHc^`gplW_Xme2EJn*MDEW;?=K> z=DUH!EazBx^@tcVfuYJ)m8;<%fQ!CXRsrPi#}C`yQ!{51?qsRJ$Q<{i!Av2G*~iV` ze9LMQ+&Ob{+@IpSOsi}4QmLjZ6il%0e2Ms4;9lzWu~nG92xK!eyT_@4Xm2 zRatUkK19$%%GUDl&Lc!tJ_q;=W;+N>-1yHh9=5<~WZY2h5jIzBQb%c1dVQ6eJZqJW zGa@kq-clK4f$b`DkoFV^TwHf-FWrf0b8r?{rGNYr`rDtNLvc9j(KpP#}M zXd5B(*t@^Ng;dhFKD2?)HFCYri($qA`_T-0F%+8`1Mp|14RX^7kRar;+%>jQcK!C) z`k__%?HIEG0MlV`>Y;)+=l-bB-rkYhc4%yQs7>Wz<X0UGYqzN3|qs zxtI0Tm8dFC2n^7g2Dw!*JyA}`{5Sem3BU@Wm2d9pQog)K&(u%ZBx@vdA3+LA4?)x( zu&a?}-@vl+?rO`(kXg{uUo0miH~sgF_|{%kdMfHRE=;mkcl%`#Wp?}$p6ZqXgKtI= zP{BuyE3wwmJ?~U{8U*Z3t+zi`8!q+^^(-}s08O}dZr}(3UlpU>zw<`}Qx6jz%EIad zrP^U)K7~*P(q7&ld6ZO`d9CfH>fcrpU$29Hzy1S1v{t=$@khx8`swN%Dw7yD7`EaPNGNUWP15^~CH?U_xZ1%nZ0{5H z!jgsFbz5bZ8cUSyf9siqW;|snHWS!uXMw(_sVPcK&8C8nJ*FBO7>DACJ5wP(WaG6M z6v>x`@+w2tdv;5E%Ap$5cevgl=J8#|4Kr(jvNImygk^dO1kE2H&WeN;*@9F|&UWcrVDd`b^%$8#S z$#a?b1he8sw5~B0SGt=j?sHj$jaHDd&<<;hVN}6v=hG|S)9r^5HI*}46a)YEw+EFE zY~Egwtk)`sTl*i()yjB@UWzV;Wjp+LE}`mE`ZP`km5?}d$gKTup7?~}pdURS#RD?t z?67eGX_b|`0$D?AC(XP5X0=}pn)WYsj_JB;d8=*Rh?dEe7m{dB0g=CHL~rjtq@gtV z_=Ck?e6D&S53|_Vs_f_~#1>m&pLecBW#4DuIdo^fwWfYRSza0|w~Quf;B)YaA=nJq~^XLMK1 zfuD>(wP3(LW9NKanfCc$JwviF(=`ojBYl0pD9`ll`0?R_v8F`>@5SEYr7Z*kACb+q z^Fpkp%F>^~3(q{{nFsn1WK8EVf3Q=^c{>oN)NehPU!+!^NP5zW!08KPJ3DttgtDnV z`s+Ccy$wq9x(2W9uznZ0E8Ui(C}!1!U%L-%%DmFMOZ@{HBdq2?oD`SNVQYAjf+PU` z>xb=B#@mQRb*HTzpKQ^SOjOMOf$P?7m!@)P+FW^u zQ9)05+3(w!yNMzZ8b6~6GvW|dqI1NqLp8qlePy%jfnMr%__ZDIj^N>^BQQ;_WZk@{ zqCbC~^%Q-{a>5B+p&M=eA^Ot=p~$_jP%`1Of$x;taj%2bLnGKah|@;Poh zho1BPax^=g-QT36Qr)-#TT$V4Fjks?i80Xy3$<0p3(stnJpB##DVeKKk~sF(0;Ofg&D|ljiQOTS2ny$c=@P|*3k2nCt?jF58M#Ny<&0&-cy5(P28R! zkHgTVG0d=+(ntcpd8n$#c+>~PS3eF0sF~{gzJ)9l7UK+Cgl*~G`GQ2t+JunkZJn35 zKjXvmu;Z;QOX4~-`;7TUripcziR>e5JU6I>4dPKk++fvZ8pH6gm?%l1*+4^TaaSwH z3;Hr4o%p2;OIAG!UwP-&Dfc&2qNZRk&;;M9n^4JKk~YXEaEEld;^0J?=c9@ln2hF* z-?97BiZkt}UPaLHh=UOjclphDf5O(E&dwesmOlDU_rD~DzAmx5I!NbSwO1ldN2<9? zAXtGnmJ1(j$Q6DTU-j4W?qqXq#)q-6ceg3*<(xwT68OwdE-pxD1pw~b0g4ZqyqME1 zjD=U=0^1c37=_9}^pphe|LW-9NqWTCvq@(Q3S*CfLS+~#(fMcQSW#4CP?*Q+0Y-XZ zB#3B{uWTN%zuV2_3M4i&OHa@8YE$uNj;wpUFH7J3Umv+Lp4OMfqa&;jPbDfnX?`+x z?=&z&{ET`2;99JHk-M1`v&Rx`{Xn|i2R;u0Kd@^Vq#EE}Uqdg@l2qOy?5-(H)PBOO zmAsxiclB$!wdN~!ug3oPtQUp+>W=mrPc4hfKW(@1ijCMUy-ym1pZ%f_N@|PihY>N%7wzYiB#B zB$5VV1HgVOp3%0as~ZKo!ZR<>660=%a;;T2o&ILIHZaP=W;rQ1mERIRCA>Eeqio5mYAL1ESp?^F~hP-G7P^v#r z2*L|ULG|i3ot+yrJ-G_R6N6g5AU?{Fg985}H<`S4vtLhBi#9+y{>^8-HZjrZ7hSp9 z^;Y}rE$c`JmlFpVVf#F&p0<8)O!WAewk{NP7A`PCS%{6rwMLQ!MWCt%e%Hj&b$uW713BEe(L^utR91FwHZBX-_%}Ar9do?=u(QIE#Hs z%R%Gn$n7-a46N-zk@Je-oXa+i*5j;MKrkUWD?v=?X5hTkJ}ZqE{QAtBj@qHtn-Npo>ttx^^4SXxV)>l@-&}$*?5W3EX**v*eF)_d=KtveAMwnf$!ZT0G zJ96RE2VJpwV?ir?7Xx1Uv)@Ce@=L{mNyHmBOw(K)>6l5dIQcDf!nI!Wz5G3&(yaRkxo%+M6^DnVp-sWgy|EoOdwzS+765@a>E? zcL=`^W*^xv)}@zmH`L>;KLrm)aAG8rn274_c+gumUs>`Ml8^Bj6 z;>XR4FmDUCO+{#P*za0F-~w1b5Feh)DQyHCD!hWTC)}${4V@2G`a)65L2s$&%0CFmeZ4Sv z#JrsaIG61Vd$%F`%!W1cpw3Fiy4iMXqRfGnZl(8Om~n6>O}9EF*>bNF@oc)BHzz<$ zaG6C6h{5|*xe%9yEwo$ab~3LG<8ZV2w};iLxy?x9O*|AG*FSXbQD+WtPMEA?pes{g zi$RI7D6R2d{hcqU!GO=%Z8Uv`Z+%v&P9Ua=;`XhcYh9=P}OYZRS%Aj%@oXO1^0Io|IxvuZlD=yNd_p-2%qJ<8PE7p%SLf$e5x2tEGFJ z#~=`|O;IR(s;0YVs{I*H@M{XJ^QfKD;6^|y5NplhiBquQ!V%9Yv z4PeK*|5F-4nhsWcn{qkAeyY5_0W>#N+3=8LD-8>>WOIH4M)Cfyk3F{#^`-v`WFb4! zDE2m)as<3iUlm4*P@5j?8lJJ@)l^^gaLePXA^%tcCKGt?vP;fXOOiLbBKRD?9I@B{ zJ&2*dVB0T)?mjEEw4dlivAZaqqqJttM5V$7D(6Z~O(Xy7H(zCG!k|Q_Fg{T5&VeT_ zSxLnVT0HC8gbmINIk(hH_#n>Q&#~gEY}(?}OD^8+0j*;^ul$?dAF+dIIRv^Vj1Ldp zMxA8sc%-8OTghPU!I!xnjtE9Q3xm5@SLRp>6$WyC&+p%lKm*#%wkM^O3TH9^sNqe? zwQBk_@i0RV7X7}UaVI#}wJ_1&)rqHfPg!Mrzay$JsKv-gZN6Vcwd%n?_IGUV@#++1 zo-ISFz?@ouSCWF}!rG|qi^oY`{2iYRV#qMV~tSi=HxrDknZIC6&&>2V&Plo zRAS}d&z{L8(1SM7{oSB8#g}nUBZTGJN!8z2ij83Pp83_02kB~lsN4~AJrcJPFO{1a z)wyXyf1r8hc?&?o$^bGtGA+@Z$TRgSq5aUxDRFpi4CuNvfxK}%vHG-!1tET4)RZV_ z`tP|L4e{@oQxKq~w_3`66A@7M>N>zdS~F_Y*O2m0k~F<)6p1)I>9LR$kJ* zvB^jaFItM%!|)IZGC&jUrlAVUfiZo*U&?tMa7Ak=!M$GcgHbdP@))QrQc?hkPkLQB zjdT&`RfC)yCj9O@Lf!ij&yQ(sGKG+XS0!9HkCK3p_7?s2MtF4&)ZR1!C&_q^KmrRk zp|Ef>x8!0%sX3OImA7}nl**iB_N<#GI*)KDyCD8y%*Ce{uNqA0$NgU~3+vU+W)G;+iwgG!Xo6f2Iw9r>k~9^?!*rgbQk9PMECXZY)yZ^hX)*5 z-6;A$>oQHDH5fR>-ylN$V}`0_{I4%#Qy(R)Eq>bko=2{lC;Ov8oIhT~fWb@RK_=}J zF$)IEJS4AG4gO2)TMonZB){%Ez?-WQlh*C>mJar=5u87D!2WKA{$%Tl`ijcqnDBSt zHpA0moJLms?I@>vU&6n}q`H`we%L~E2FA7f*L6N_DMe5J;qYA;FS-2}?ZFp5%3ATD-1t{-PyapygW`{Zn15l?bIlnN#5u+XWr?^PMhrJK;X?RnRPKjbZE8;T)5cEumVh>~-7F&u zQa=tK_1$f89_Xpl8UTT$C%orerXV4ZxX)fGuU+6h4LTOZNJD`dHm(`v&QSbREroLe zUWC~jt%RG^K+14LviZn<0ieC*5zjc&Xpb1O7=rwm`0H$iJRS^XY3$4IwlltaXdJmL zktI2b6&^!mZP0fg&{j}-D`=2`bHo@ zlJ(zp!mW0dIvzNz6B_e7Z5c3rEi#m%e++!#A-Vs5j%)z)OFn;fgoL$@t$!X_Fc`a& zgnR9#zqgTlAZ{A?e#9Q%dKbkZis0Po@~aK4^IKA?(%h~4vZqK#wOCrUv`ai^?PDS+7UA;3vK^Ox}2?a!AL?&Z`SA^98ioJnKzR_g>E` zYF=Hykoo=$QP~$e_3|xO5jv|a1I{4LKAn1x8>h=GJETwToO>A{OaZTm(Wj%!>rm`1 ztdF3E0)Iu9l1b;R*s07vxe9B_a3CCpas*sI@mn{((lDzuvULk*160*U6e2G~7L=?C_eQ$T z)O;(BbZT|ceGsjWf01VN7oFI-)t<*Harjbqvb%+kW|Xj3tw4*> z?Kf9Sv}ovLMfqw@>x70w7KN-6r#Vo_lz%O<-%%OY2fDK7p=Y>K2eO*OXrNDKo_s^F)qy=5O_1FZ7U0##Tqr+_=&C z94}X#`|s>osG|N*tUrlGO{n86zl3WZJ?=#|ba5EQ{XK1w=HOHlB@h-ihqDKG88*hQ z952B7m6L4hr||U#sOgaxQOJ-Ju)h{ezhaS?$h8T>eU3v!)!A()^H~i)fSvsI*k{#M z%t6Vrh!Y((Wg~C{;z8I*YEMD+w$X!v=fay3{{~SHFghJQwp@pg`!||!Oxh$R5^-?q zHQdd=yC?--4sqVU$S_+EH3i^Ac zjV&4ZrTU4D#hOqJm{|_oi@P4lkh9t*Uiw)r@<0uuE%hOk#urd%>>4&W zoXQ!{=^m2upKiEGBnQJ<*a}dUL~RD^l%d%UD4i*Db&RstkMRY-W8t2+)2X zF5iQWZN(Fd8k?3EnHk^n3k|i5OQQ@m4t}!Y0%d+6O)|9gOP^J0K={Eo#EWGJ7xiC| zZf#OSSCvg_=!9ndQ&KIb?$X%k5>8T^|IKjTRSQ+ptNd@j9Z@nM=Oy2Q6WiJpyBdER zgUJlv#gq$oSZd~yBAR)1^@Y-1fnMs&ZrZvJK@$7b|D7Y1l0h1?%Qb^nTZyPcBepJ7St$H*5h;|ts*L?$~tyfyJ=WHRgUqsaCEk1V6 zoO(1%T;sRGiuUV!XyV#(^?ls;03$FX^cNnt{ykujLeL zx%)6zX<6KU&CZg}|D)+DquOesEn1uar4$M74yDE2-HH>mxI4w6xD~ge!65~TTX1(T z?#1059(?b;Uw5sntb1=}PR{H-v(MS7^dwui(&Y5^98k6KppQ5ivEMvizEZeJSqn+d z>$P93MCS!6IR+YwOEjd=ZwwWzwv>XAkepxQDD1a)3?I-t16STvqHhkztwt08uvF5{n)GP;<}JG~f_;B_{$k&5P- z1^SQ;J@(?gc#pUt7LCCeGp0#d)KZsjuFdy#mni&(Lvcb0;2}G}S?D~80qDL~tkTQ; znH6Q=dgN4vU|JVv_GkGwf$(ow&%2 zCB$3Rkj>{L+igCK_W$^QC+ZA=so4@`8#$_d-B31Ym9i##P}@yOv!wK^fk|dLC)$kg z7I+v^$*U+dC2Rw>@i#<2xHMsHLrEwH1+Rc?6rsw1X;4RK6=xcIFQQxVgK}zcB?sZ zpfuCL)ksQ8zmJ)F1&HJzUT!u_CfUfi0CuzdFdA6Vb`n+For#A^PtC(tO`~V{N`f z*4?{&V2_s%mqPgtotP*Y!2SL2M?=x#@9ev=k)^FE=GqkT06fyDJqV?A3AL)*z}bm2 zW7Yw6sg=+N(E62^b8}Phy3K|q*DP{2{-@?t`YNRFo7qM3zDok70|^KgMGf|!^i;nf zsh%|-!Uc=qdZV1G-Ll`O^2c_1SbfkQlkbW(wC_8Vi@9xGR&>xOXbpCg+W`5aE5DQ+ zB1Uu&eQ1*yAlJr5g=w7Doo?!G!|^7UY7HxO^b#ovF1PV7Pd2MYpX5 z;z}E8PTM1lJo~jzwE2ygkamOnPfpt108DCZFo;UJm)H3jH*(kSHk$8LS^g9)3Z6S1 zZ_*gDxtFR2c+X5}_etKiGLeI5h}!RcaME+|{6mide%j?0*+A)ZWzO-?Xa|Dtfysrt zMC#kwaREw3yNT$3Bt-2N-g)0_^=3MF1ZsI@EKy}}#t#Gf@e-bK@rVH|W*~jITHKdJ z6z$~I*@f)$S=Jr1__3Pe$km#0#`+0kl*xZg??$-3@HutHNoQy>j1uLY7QIBLpYo3V zr;DIl#(qd?ZK=i9gf;(eUCQ@NiKk3#)s@S1hTpP8LQR^lsg!PPAyq}ccH@;ecGDtW zU4xql>kDlVBl=}v7)ru!F$GgrKo(6X4iPsf$O>Zv3RSCi`)OFSgAO)*i*(S#Z;YH~ zuKQi%!hw2pyA=mbr_Ss+=Ep+bTF5Tn+zXU$faqh&k_$fF?vjz=zgnKsl+KLuAZmK9 zHDP}?u?xX!&Y!yRES*$c}mFC*~ANR8HP1OMsHUU5leMUBt`Jw;bhgiKZQ z?r+YBioQ)0|1%lM7G=LjlmmU&;zR!o=V^JvOyEpu$71X4mS5!Y4BfhsbbClY&fEt2 zi%aBA*GyHwh}x&`;Ff*#bM=R~A~Fs`6*hD1_4PeU(p{US!PJ%{Ho4B?*1H-E)-O+I z^ID}#MU0HY+I(d{Yv}Mjg~V_cb#=3p2rYJxCGv4maFt#VcKnB%Kl<1j8?NBmP743b zA5M*Y$s$+t{S`(T>+U$i`hA?<-*^rkW`DIqNkAO>-}##-R{M|@aD1mM{2VAQICSAlTHu-#QmwLB1K*Pvlf;e-(0X@?&f6>-zk%Ut*uMcdC2VVzpI&aZ{Yk9Rx-Q< z$-Aw&WlY#^XswV}!ZS9s+{AlOs3eb5cLrq()D5B za|JT=(|hb0lbuxya1b%(H60Pd=mP)3(|$KY|3qr|pZhbIb?eZ$dku(I_8A88e|2?? zJwRk}*#Sg}QH34&T&K@4rNPRcg0m9OBSuS<7;k==qB1h6$n6)D@&r3%24MbD%$zSE z-kw9?%F$S2xSf8Si4T@@h%p*vOGyBkPZc)}Mt?Gi9xOXLvdhq{tk;(rKu&;4J!A(5aOiLR|al5TsrN1XKbm!R+3@6P&AaLu#6!w zX`KEuLk@V&DmQ{G=-5BqY}L@3j#5CjUDmuz+kWV+kEILz{@M92sYp97$6jjZLhdP} zHm6zSL!HIq<9BEMTkXk2cX;sd{G%nYxJcndpGWryR}4%{XTabSkONT1sw*p4h@5L` z?1?4oM348Eq)#X4y7YdklW>_oml$>P;^r>N@#=P9<$IdW!A?3f{K<2HZ{ansn;d}= zl^&C@bUhl&7h)t$Y}-^nrCf%cM@lmcL`ca(RWkYLtLF2f-hUz&CJL0pmY7C49ScC| z%Fo&hF$wX)Ay5)2_^ZdMMtA|TGEuyj#q58-iTzK^XY%=0uzvmqv0_uZa*2RLfW=yW z-;$*@VaSru0%Gmt>8lCA{|Y98KG@A`XW16txClumsJJ)&{4rlPJtD>aLIa>*F z10usQTRIGYt1AF08oUJHhiki2gU0}*{GKtET@_lT88R|f>WkFh02Qfr!+00USKjj9 zzDt4pxvpjWO21IWZ>h#$7ZvKd@*~3@`oM2AlCewi)=-qM#a5S_tNf~%#qPaeCtHfi{4qJ&0uqd%V{Jtu@fmv9O{Q>C2g=ej3IS#6T>+N<)cB9<3S zZlpsPn`>0c%Vp;#Y&&^f;kX?C@%a1lRMRA4Ji0gH-ZTfP>eR zb#4qu9!NL*M8306st8ee%9~rGU6`5dXM-Q+(%M-_405T}FCf|vWYmI(1h?qHfXzXb zQ#G8KM@oxLH!%W7St-E2$vgB#2x}7QmTf-7dh4`Apafz4Qa>7=P)Dg zOb;@IuI^e2k9kX8-5K+I@Y@Ro0J z;2uHAT})YS&eD=0A37yp4g9<{$*(3OO<_VVx(fU_g0@999QjUxG|}4Xs2zumfWMm> zCspD$vyN-~VPWSVZAn~GU2s(UK(G=&qqcCrwSPd2ptm`1eyvkm)2v&Phe-CV2;Mfa z!ZX_JQ!rFsRbjWb+>KqOl(NifB_BbHaP%5X8D<-rrCD#>Uv9{U7(D+P-zZB(Ipo#iP#OW}O5P9_DqV-o|)G+c`9jo+~GCZnBz>aV7@c7-GaQse@ zS6gyZKQz}(CGDgI4^#OT)ZeCWv0dC*cBY~bgRgl#6p`PrDpMk8Hzn@*d_ivrK=1~E zBhUCaa8(b0k_E2Dd8mw-E>^^w*Zva93R~>B7cI$xoVfkvjR{`r6*~a;^0r~4_Vi2| zqQoH|obeoS$k0f6{6Eu2%~==1yTcaQVo+ns1-B3o%@_i)Y@S+|4Rcq$Jw+_cR$gh; zk8sVQIijg>J(uyhr59STRvfzXQ~eg+!{NK~?27C=5AL^Vf&O-_bsHFTX{MkW3HAdF zI?+*IZ7*=TW(Q(&KstzYrS4n*!=0?hHM4=*TsH3)>Y-6vJ z1WDXF{taIYGCqs`o*IL(KRZ4gn(=xTP&@IC_mu$Y!~o3xH-0OZYFmG&I*S1iv}Q$j zb~Ec+SvP)B`s4k!J_}@1=Wf@Ef&H&;_L}sCRf_P}XG;DTYux9hR-F7{)Ch9|6&X2Bhjtgi11AKFxBEZ^A&|QMjg%(tsy-44~ixO#t zcD=Z`=&lB>8={8t;-R;?w<6pj?riyiDo|dZZMJ3hirBs49To;WmMORuT^&PoG;mE^I=9hBy|=71Iotz5*!SJ5^M!)iykw@f9A$dT7}FeK5=-6Et34~ zN0ht+^jwL_Gk%AR@x#9W#Z9Tj5V<~(E{sZX6Z52Mj;K9l_vJmza-_}0=BZIHP z%Yh6_%(M-1@)}~`Sj`py0pG&25V=>H67A7t*@hmGqCKDU<2@(&AziWHNeGz}4ta-E zoOr$}p3;QnB_-a)YCOX(7MOllyF2jb#Gyv@Clcic;P~v$uh*;{NPbC)mzx#k%m}<9JqFCFx!422^Z&&)`t!-`5x?U)zk+-+03K0b zg3C2J$eZ`j61C}Zy~}Z?J{fn~I-ut0Ux9M4z!1q}kme-sRu&QFh7%fxfF*jj*)3?) z{(`~x>J;boxhm`!bOTy+LX` z0zM6AA)y(p|7Q+t^m|Z00;U0&6v$_^iinPnwBD3%n7A#3E&T$oi9b~J%FCwjKEB&B zqQO410nuExd-4D6_pS>_TXZ)kofIjoFo@VB9nS%2cBy>*thWj%cb!Aq!8511KUYd3%`t0SH!&QdI=1 za{$N$|J|2Z6pC@^$E009DQa@WTuHkhv9?;OH`ym7ci6Vtq-d~HUF%gKKtnpJI{vai zm@sF00ar=>ox_rbtJ@En>?wY=J7(Z73zfYnl~@?LH%6aWyz;WAVzcpw!)!o2bfTv9 zjPkBeBWba4x6yxEV;*}lV_)8AQQ2u{AKf0h)pOhk0ZFPBHAi*UEl0Q=4~U6z!d3pJ z`q49@#rDUzwQp<0T!)HwckmSl9z!a!qzS%z5QwhUmienUI)zziAr)WtU;N|BbV*yO zEF$y?MGV*@L3uPv4l+dA@Uq!9@C5_~tMPPjCX0R#OVb6I0)gE0a`+ z!i$KfsdJ#C#(#JO{yNF_-Av@FIYSoH@iV)oN*ke@CcKA#uegnZUa4+{E8aF6s>^jO z+qK#%(%MVv?S9x`>XXq;KD8uYFYb2s(@3(0#Fw>AjH5#nZ5^6Au74XtdN9ApRIE?j zWm6a+6O4|(Pg2oQ_;Uxwo+wMU@RnV2rL5dH2mlJ%%|7)75Uo87ek@sVk$OgzzgYFT zJ|+GKEi#YPABhM8W$IYl2@JJNg1ngQvVtv_hcsLG{5@B+nsI&xFhmft=uZNwH6Mfk zZr;?Kg~gN4f(4D$n-ismSl3(bD7FHyeV8{mfZCfeU6|PSHiV`A@S=vlRXfq-Pn+Gd z6mFJ`esvGD20=;Jt>rO~@!$~-(k9$l+*QbH_Q};zVl?#}>P%h~=|1uAj@9RD(uGk| zN5FsJCOWoc-uS@J{j&IDAA0Cyx}#3m8IZT|65|ytMsIns{ax{TDcQI6&n<$Qm9i+R za3%Ji-34m9&&|f_AA)TE%jYt6?<{^1DM%no(!|!*W)R685zfY@@fhpQq;#ODpJ3#6 zNIG}xe(J0FduRA;jaP_)L+G=(~4-_WBuhDt|*F-k#x$DU%j{8=Y!eKl$e z6b0cvg5Iy10^1%lhu5WWM%`daM~UiAES$zD_js$4*67%G>tr@6li6nZMc(>BdnSId z>s9Oc7>oXe`&W=wZ8#jIp$9Pvf*QK>&zmmuU>^bxGHSFUKb${uC=!Y&gJZp>P&?7T z4leQ%h@A6bKb`n1$0B3@8l-(znG|quRLx?${W;jq8YxY4lqmnFvni)R`l{n1ka*8* zzmRS@E50Ug)pU)-K8}(15`SK(4$}cpIk~-erUelbzM;9opKMT~~*Bk{n``RqJ;*wtC2hv7);_2EKs ztt^rTz-(`#dTKSj_|WB;d8%(|JerxZL7y)hRIg?{=d%+>|dss}u$mq1+8fS+M) zUg3H&fge&)MOSg&q02@;{UaKwNUlZwdAbtX`-C?f7BgR}zTi}-zi6IIR_8i90WJ#? zVr8m6wp!9^NlRUZ9e6SbiEJx~LwoZzv4hEj7`MV!xv3?ejrwbNoBfzMvp{n4@W!2* z=j~fHYUMn=MNa$1Re&Oy+$CFGeI`JuIQT%d8<862q5W}>jGn5&Vu=`4 zC%tR?LEa8W-803lo!9N?@qoai0Zant!Ee+@!9*~l31r(R(OS=|sG5PX&)P?AlJ()~ zeZ|{q(iHLVazC?%_T^-70U->;SR}i{+2E$4+N?vw5R{PYl!+~ki})BRE1Tg%hT=Ld zdK_}~n`SM5?;ss#WC7#O^<~>1Hhx>~zfW*VTpnXA5>_543dvR`f~ywH?8FW!vo+(H z;j_ZhlyUq3T;Y_Bj7oHfbwVmi^K5P+os(Qwff@Jbux$to63-SUMx*6Z^k(NRh{d6qOhNDDu0 zl5bZnW^Lr_k`H4J?s(HmLY;qFN@*Xz)kRs7ic$f`awm}5)J?#$i9mz;v*A@Mj*cD8 z>TCzVXM^uA;Y=?Fu0GKi>1Oz`u!8gbF~6(XDV!yPmnzdf{*~F67%Nke?1&Zz~L)ys!s7^dOT)Nak<0YIeMJL9%FiSV=Qf6@$hoa`v=>f}k|T`Nh4 z%-6%330@zt3UD^a3t?i>Ydef=paY%kAZK_ZI{hWWE^0`2!jJD%?ukAggCM~opqbG1 zv$$8YikkD#`zjIEEqfUF0^#UrX$YiAZ46$b^1$flE6yl@Vmm8`dFUO&w<{n1y+NwS zV_8FK{!`aA>wvSZsX{>!5tTJY2I@DF!(`hh?qNC0b$o#hWbfW7a!R9p^!$uXV=AE( z8mEj^_;O=fo8OCi?)tbG*SvEe#-V}?G1 z)Y|+?^86p})zEf|Z%4ERg}ub{}=+~)xZkoR^BclnBLEpiJ=#HW}5;y)9{t3hP`y* zEZ>}~*u+Q-dg=5m!G$KVR(27K120n<7W~+}5t#)4!5Qd-yu@JJXbLgz7XYl#vp@Qa z9@f+32lZ7o+8+2Of<<#?(bZEha7fl2e@b@Kd3AUiYwfT&tyyoY(zFU(ETT;Ka z-Wy^jrZca>9ZMYMzr zAA5SM556K>$Kr*Hh>_@ZbYAcNnPFmkG4KGw0zHQAH<9wKD4NGzMVj!-EZBJQM%2H2 zJWw**1jBaaLDp-{PT$5gyFV!8j-35+;rGZL=9 zItuK(?TfIKK|T4UYEScczn3>=o6|iTm@ghX9cvt9#8k$s{UG%kZ|;1uJr8F=4tN$n zo0eFe>NsBpeYu`m^RvR&S_vM^`J|tZbfKfw^>K1LoBxF8jWq0e_a#|dgEm|6r1?+& z>I#cbW6W>XL1?h;=?AY%k*oI15m9IQHs)BEoyUTq7^!kCN_1WHtqXQM2gf9D${)}av~?sM>SVgsHqZqB0^7^bTPT z@^(0LX6pssP{)_B$>*TO z2i=V9-cYBBDiZ2&a(dZT&(XSNP92vamOX6pqr#{S|kJKCOg|-gzaU z>1^1s3Iy9RKiUltcNySJe`3Hv+7s*ghWzDy>x;G()q6=aN~)OcM6fB+Bk+OP-*_uFz5ox4s9n^nO${DW}pKPTKoaR=VEY?#LzgQ|_M@5V6REV(7qk%!Qnp8avfY(v8&oSr-`nF&L^F%(}-+2jFC{ zV$SZ_mZJ8|TR)L@NP59%V=jgk2+HfVouOsziOi+HhS;HytrAJu+K^%7&RE!f7!AK; z$e(y(O>NzeZ9v&EBxq6IZvm~6XNMg=olIftg$R>Gyy<>NR>LH(71iMtXS&o;P;MYC zN(8qXGiXvcV=ZNgpvQ#M`((c6m$0g!88{pX-e|674P7OWQwH%KM1f=T;9~gmldCvd zY#NltTK8)3ngEmLK0nvHOq!q(U(UbqJ6*=ab!kJoB_x%sFCF0FNi7Iy#@TnQy16lM zZyLEQRN##S`fw0FvLjGb&cj#^f;xd|8=0WvTA>2GN$acHmqgsE_W$-ZcsxA5Neg$J zWCG0!G1gvk8E=xe&YCtmaVT#T(a>Y&>2ot1&zx;yKq5%cb9^51tHg_}9&4jco-j-> zq1T?xD$B+vEf)Abe)!!VJkua{S^h)~j7^<(-o=6`-uGYSteVJAi@ppt!fr9-*dkkx zgl_vJa4wbEK!sz~{*vHlSm%*mE7u>}spUSG$9z<@Gg{jyFs!!UV#1Vb`=E1E*q#Zw zmauxuD^XcQbeJW*RhUcEz7*<>2ryZ>WR61b>lC^YoD==3PG?qgOQ}7 zxijKM9x3PAb%P7aI-t(?0qx(dniy4$1cg{Ud&ac`rAyfyqwIO7$o9ky(+PqdQemk! zN*Oc+*1BwIg{2DH+)d_p+KX=V61BWJ&rN(#5px&0%r%Zsx?kY1$DC6_JUq+%yXp(D z3-@d}B!N|*jqJi8L#=XrQFK^MNA`p)!8dds#iMA9>Shl9rrVr{Rkz-96MHjb=KIYe ziZCcVv&r1vH`rC{3b|{#1o!5A;?HKjd1`>+!Wy{uBG=74hDqP``Xl5Jx8i6UFO2$( z)n4@Zephk?(luVzRL-+}@=hMBXdcQm@{Zt<4g384ZpV{q^hox3f6cJ%NJoJw_Ft_; z9E+^nfH5V>fvLiSkJy-DC<;x?q%}Nam}ZQknf=B@k4^NTx6449^Lx~kWD3(l5Hp;& zevyo<=)TtFz|W7wk{sK`NX;W>v=D>g$UEZ?LAnV>BU;d%ZA<5r7nw$K5$!kK82hjU z6$OdA& z!%|2R98=F&^9uA!?quiGZUMq443Mi zRbPeJ_UiglYV1gsv=`L0BHt*R1`ftNQz`xte4<4ae=gMVy!SWId75ov=Wi=LOp#@U z^_F?~*wN~pT`kd%iE)+~Bu^2m*ZBjsCiiBwk-_G_M=OO9FN{*njg#Lx^KREZTe=a9 zM7q&_2y_-KYQ_og6VE;up4#9fMUN!46v}LP&$LvQ_Z9&tP0y8->I3aM+jcqB()I%)Dc=Sj5qc}4jj&OUVe z>}d$daWne5&W6>F{_eVeh8Mu6?th==KmxBq<3V+3hEs3UQ2YZ-ZWa&u73Z^Bg9~56 z#nJ^dUWvEpY}sDmXG=`&+8Ox3tw!i1@`;9*Jj(!mm>!gnDQQ;c3o3I^r7dYzc=I7$ zVJC-(6deV7(XVq1r=ro+NE0p6$x43gs#O5K_3wg-Pk3k9X#$BC?zt8M5Sp0-;v7e} zSO0FbTADodr5dSj3}DK^H^c(4q~wLxti&w>$Z>Hqlm_HB6loa$nuPM@p{~x>Gf@+i zXnm4`cL1QiVE)&iZea^LV9<{0K(XDF1d9XIwV*ciRwoO8;Hvlr5;#!{L)C?v%5(L7;m~Y7)mLhvg>bgmA;QZ`#>N>I|*+7ZS^{r9d9_-!VIaT>=G{I?#8Pr z|1fho=j{%JMT zPAA!g{cM^W1ec#J_IC`iOE)ZlZC705nKOSmanUyz?{+%{l}3jA$Vg>Gouw+)BwZum zOp^&qaVi(XIu9h(=%@D8k+!9KQhPo|HTOS%Wy~MV>wy*aX-asy2`ACM(h&m2o@G-_ zl`wC59+VWms)Y}xzp8psA^r}0!!h~fy2*A5bH6Co5?OM{ZtPSq+gCAyjr#IYj>?fR z0L%r;nEdIZ(@5ORGVe2JS;b5H_Bq#A-+XH!u&aoYt`Z+vHhL&WQUPwN{{$nq-|95o zVa>TB+z(Yo*iE z=l?`K?`x3^;mb+xB5&Pvg_PcZ{>- zGP3XAH_Sb^ZQLg9jU(2-c+cN{dvt9Qy*?V<=wimd?bYu;H~e=amZgDry!_sA9QAm+ z8~qXX0UE;D3dH3GN;kec|9m@?6`EY|5N>MRafmrKq;9}FwKM?kId*nXw2nzl;9^Su zP?f-aWys*`P#Y~BpPP&58miW$>7>e6rH`L`W2et?eXUS z5?<$%xt+O|>1h@+4hX$5M=LDGk(v5y7CwRHGumA49G%b<=BUs`r=M zJgojgd6!n8QCgHW<9KI6KODOZp`X}E zysKd|czJ&y2|N4(&~`GOMOMt)mlMjc<7Dh0#L50Ti!)8I)16Tr3c@Ck6{zlG3a|%0 zLL!CDYkI8DOP@N0Ztlkyi3-=y%A>MaMcA3Y=w3pWQlxeucBsHtvI z&ogbEIdq-Q|J<5b#uodpZ^bL0eAmuv_b2n&e(#>ubM^@3go%p!0dS-X|J|Fn8Xgg{ z2A&yZ540>@*XS}PK3kgg=s`pM3cF>=-L2*IKC}RJ)rPr6*mW$NkE}F@q$^C0S1hsk ztq!qwEG?f@V+iXDt}n%1z-e_G`I3GHmnEr9R!Xu^`;0gUZHt6wyKhDfT6gh?-<)+w zwfT5+Fk5lXdP&_vm#e|$d3jizIqX^momA7w@1{Mset*>8XgC>xd-Jz!d9v(@IYbJ( zlbi}B#}l&X_qOE;XG-Bh4JCj7HG--5#O{4?(FULfkLqYdCnO zY}66)@p0Zm=K#3x=hGbxGdlu#L~|NaXg2(N)RPrHqwxx;smVJhx#S;{pcjx2%o-g; z;RY>n0ZOYLjg*Q(o&haTLZcA_YYZEy>&m2Li9&_cR3v3k34x4&tz+M+vL)}yQceFm zD7IgFH16uh2>CZ&FXVOIzK&sra1)4}IEuGY!b!jn_@)OVU-_=+pY?ekmVg4G-~Z{i z&GKouzF_d|$Pfs}qwE>kn3#X0!^sMBDH>W$@oFi1@>%-UO9K;odGb0x7DBH$z^$Wdc4roR`JHn!PGFuR!4!i zk|H@G$t9cLfySt?=u(#I=vS{en|CXV26O2~L1>n-?Whrjz~&;*(!}{r@Iqm>-U7Z9 z(a!)((|(g0FOig#RyPPtpQrW9t4@jiTU`qVKjrB9sa@%(a_m7#EiTYzm?VUEJ9LT` zaL(R%d#M(`$@f5TUCpcmZBMg&CmoT4Pu=}%ybv<#^%QE`mYAjz41T}PGzyp2k*aft zVNL32bU02w;UtWGozEe2uNTOF{W2@%9EJo9(UcW<*{!aZ-cPQd(Zi5?|5x9*6g-rY zj%#xy=21+|S({7;5GJ8R0}$NaG(pvHIFl(|!D&d=3A3^rAb+U^%j+`UshJxvpFUq- z>1Nc{oEj$Qtt*}8MW1fOWrej0fMFP!(qK64T z5*2AKikm32Y$lB$x-02e3`$ZJotm>fYmpOu&0Y?zTYT6an$guBYaD>jDDFFL0GaR> zn8+b3yC`f=>gp;i&EH)>DY+Kbs>rXz(%{+7)yOTLwXKuEXCUx9iqIlkE8A0Qi;szw z9cbUf-P>%H*P~75hsrNjS4XV-R6Zw?BX3K#R_Z?Z+@AYZ%czLg^$~=2?uR4C3FASL z1}-TGiZM$Aq2Jq#{I4#3ZM2~A;i&`3Z}FGE6*;(rH=)(MHTY87i*B}21AQ`G$YoQ5 z(VGew^+iufi@cH>{;Ao|0EPxaK4~$M;?HZk;b$SilEODY3kor055UyG(wMAw@jG5u9ZXGL8+vn^^-CH z`+D@I6);I`bSInswC3<@`#Krv=k0fd?Gc3|93kD9110syJ|ia^U}zit1KE+tSV+Sc z732h=6w5^^@S!0c)d^L7L1aXQo!wlfQ`z@YvRav_O4{8vB*?uDF_jNS0iM$zm=4Oud;~_3_8Z|)bo!NI~1X0wPRIYT z6dbuwxTB{4k2c$AO<7eZ3XwU6FY1q0(u%@P`46U7CiV+ z29HYQn|xCf;T~_dKXjPXMC!g%myz2ug%;uT-9xTJ@mGv@kKX)J$%t7WJ>>@q?JIyB z3J2SQhSEAl&#EL581i3y#4c>5Wb$Xw2$Z8s1{_BIItmh1W5e#e;wg3zW|y7wIBXK` z)ewCw;v{)eM}6?qo4+7)2&(1e(N5I+j=inU$}Q`p>`zU@X3|zuMD#05ock|KrKc3|D9uA#!Nct>**M`S`GhdS7z+3(v=G*Vl{Id)5vR>B?W`3( zj1Mmnxeo_VV$O$-%asOyiD_)h2)_>9@p{&n?Nn^P$VSOTztG_ ziK0BA_U8EKaf-u*f}xUqeQ4gwaz|k*hR{!krkp-W`@S2dAH=$U{Y&eDJjlQv&W~?vud`1gAuKm zW+d!4|H~shBTP}NMv~(xglU&@4nrC5_Z%G&m9yT~{s%ps)@n#sIkGoC?WoUYHdo=0 zUIz57&^>2C6+awIgV59pmDQnz4@>$6?U$qyOpjsj3R%zv4H?zEDxi2C*OPpA+&L~u z#sTII`h=1p1t(}M2zT^I1i#+Tzo)1S41OY2M43uuGL8AzK14{!^95j3lLilqeu7r2 zd{!b)ZmNgbTpH&MutKzd5QuPSBOf%Vdd<5>dEHV5T8@`$a9@5}x*pI2u_*4k=WBn|E{ z3B@5nYzBVrpTtRxw1qj!C3M)p%`@X$I5Tz&13JI@%TXOnL;~l*8Bk|S5hU(Af8^s+ z!F%`hxuU3aWD&`|?GHFcoUJi`B*<4-;1gmiqb(qLG?Ok&Y=X{W=cWq%KF*LL3}E13 zd6vL0FKLGq)|(0lX#rbZ31ulFL?Op+_Q6Vls#hwz!hHlN70^+JT{%B+FiPv%~+TkhS6IPj=A;G83P40O=nOq#@gyf61j63?#XhZ}DPt_B+b%7cY6ceX75HyTEDu5ZI(B?IJ44>eK8ExT`*8DB- z_Lb+t366!NoF03ipw7;0 z-)8*tSN?Gi8kuKL5-a>;PUZo->xAEH%+mLckIbi>P{+$o3i}ydkn2({`U=Kb&?2ST z-7_9%rs2PRJs5a`dseTD=PXUs|9B)lQf?Jw{aL=99J2M4glO+4^PY1vs$~qr!`B;7 zaHAX?jEH8oA)JCNqlikAa_|N4@TSLVzHP1@B7NIeD0|NqtbzC z7Po4VHar~T2mhtHv#x8{flF8q|KEYPTBn~G+sy;gdJ(yJk2G_RokGMb?&U7sT1^g} zu1CQoQwC{Eu%sW@<24LApAB_Fk8~5mt4&Mf?s##*RorXsBbk2l6X?Z1pPWLZj6apY z!dx|v*Qw1yB(e@!%%NNYaF6%C6>`3oCbm#aun=mv;#j+WCoL*Oq6q~*`c5+sYu;QzwiO3<{sneJA&+hH5xZf$eCppx&yq*QMR%{#6(K7*Z z&ROK-c*Z+f8LxP4ajtw`y4~`4*@heGjD_(ttqY05R@O4+n;!F(KjIv627Ev50T2YF zN{6|M-IEMVb3H$+5qZ;=H2Z9EM>*_qB=EW?C5ZP5H4h z!I1gEOM=Im58Iu#MD;(N_Q|bMv^VDt=#@99w{|8-e?i>A&6w@{CTTXAI2d~?8b#EH-*g`oG|f9ngs4- zM-0gE(=u+yiG@#Y85RO2GpvcM3;B1%Y3Yi>O3)Hv3946rf(PbE@wUp<*}+fGX-SX2 zAaqf-T9|Tev$Tfy`y(&oJUCZFuRQcc{kEr@A(O)4?BEl1)`;`!Z)?76zhumuo_x(Y z_!4~Hw|*m;pHw}rF2u=e2IU9pRC^hjPnT-@xL>j@N@ zxQxZa(6IQdqmAryRO=N@`UQ^rHzKXXBrmg96s9z|Gr8pA5?fnVtXhs~LWLStkZvg% zOn473f+`xwW&adSc`*{kd0@E43G#i#~2n^qJ1lwKU;r8>ivw2YND~5#{q>q1G5S zx0|W57i}7&smz@1rrG`W6%9fzCcF=GbsmuOpbM976ZC^zs-7Y zfoaab?mj=}br=D>StYT-@)+>;-Q$|~+L=5q6+mVxtlq}(_aQGfx|De$8*I5bqIL$% z8mQc^bsPb*$LsiSl%IuzzKKkXsv+zU$Tpb<58sHZeoF@d{zcwrcu619uQYG~PR`N(**gW)CX&XrZB^9v03R!8A0 zB)eQ+_5r-2UO2Q#S^@t)ljDG|f~s9Hhx_(`FlMj&bY@qIwmEq1HJ-k~FhLaIeLO#n zs}>>3ztvBRiDT0a8kEasar`fScLj;<+rTWe9lC#}>0&gTf$c>9+ z-H|N1Sj*uK&rUx)Mes#=!wNOe|9;e~H;2IFt~gJmY`~*=avRAR;O`cTW4kdA%>?Nt zOsO*Td@j+Nyd>bTL}qj0;HC~>NGCqJX}M2RD+e2m!L7$G15IK8S!+B92^*zT5QT8} zj)>ou1?P>}KVIJYHZR)y{&Z)xv9jXkK_65m-<@+U5c*~K^im)|^>Pe1o$HI@)Y|*L z7C}9LFd%@2?Wo*sr|`43T9(B3jnqe&qu_|D@QA;bx#t_X@|&s^HXo&&n8E$Zen+CW z!H5N9>gk*R@Q9m{55b9so4dVA-5xGNED^Bx348gITmD^A zYh%d;eVHSHf$&z`wdn;)BEvX^)sJgwDxOVY38qalMjQupq7@D^b_fqNV8g@*rum68 z62Y^xTnEp?;BBbHAhL4S5nI!~oxt4XBkR3AXRW$a1E1oG#b0eL`%gosz=u{#hEJjP zjUp#Nv?QSV-wC2donL#=YV@o;Ui?Q@#39zSqM+f0XiJa9&p)RN?WxY<&QF+r+!&^% zRTpYsC78Xu_!#yq6F^9p1q-yT)1Pbfp@%be_vspa=T0JT<2b*;fL7{{MmZ3W%~ybF zDCx?;t0ZkvI}Hl!p~CNnUY zQJSvKJ-@aZ&@h(IIXhDdLzc@68*(3?(o{B)Z9CZ{mio-9bgc`NE_s-1SS3ZCcO9Ph zBd_4oq`!AsI2ht4*F2Xk8HKGsrakK@5&Z9S-t}bn>&6%8mwlAjM$IQ&3}7;clxsRV zlYWkw!|E(wNt6C4`8S^R-slN%MDmKmePk8{$f`+}KAz5!h&WjoGUOdAfE8GiJ7c>M4R}*_*&2{)(0G;R+lHm9`t7$SRhG za$!p=Gquj5yHR4pt}0}(Odb*C_k7w71xR$XHPUx4H`!KB|CsvMGk(|kJXK9KM^-=Pl+L?a1bKKfTfA)jJpvV|QAh4r%8%##W zx$=gGj(yGzK>2Fr$i2c_NO;U38f}G~Op~a<5`y1Cs155Qv(9en+qN^pra zwyRzd&#NkrH4@=tbX=){CV+s0T)ewL{1G*z2kEkwhrdBgyv5+m`pS?tR8%c9{n=e8 zwQOnq1_@?jrw`?T``Bfgv4Qq~Xu9gCD7&u`(GG!jzM&G60m{=UCvF^ly)ckVrRpS@4q3xwka6ScHh9^tg8WKW_$ zOYm{~xX8=oag-mqAKMo&N6{4GcRv2>GZ!>eVCZ8HN8mAxCsx=`pQJ;2s>>5H&CuW5 z&Y)k9o5a7BY0Cq>Q&!vOu`oIPkY+J))G?;bmCp@P#aQ2J*J+ijA#8-AE2$x$W{2bl zzE({|cN@o*mSZ7VSpjr)mb8r)64WKNhC8w}ivBOcW=4NjU8|18e%(q$jb9V0_fQ_|)mP-J;E`=|G8 zu-%)_KOCcy3@h6Sa=tg~z2wqklTb{Tg3TABuL)Zkm+g>kl%Ds#XSqJ3g3O)vk^~0n zEEoCn0O-X#zY1-ei@qCRR#wzYBS;)~pda^*anhYslgQIPA0W~oKju`BbHvnO9r@PQ zrV)68<)ctNM}DrS|7{OOPR7+Z^M<;F^tBjy-b|(KVGFCwaE285zj1f4rVz*wkA7An z_30DvpVLncG7m&ONn${(Q!SF=E-e^`u6=;fSKOLYxuRE+0*Ju9i{(05CcavyP3Ck| zEZr0<*ftp9XTss*@diLlC+4t>>@(B?)EILG;O{x=1c9{_e*8(t{b)MAv7>i*M=t^% z-O#NmhiQQ!sePI|$WD>MppB+GV7%r+Oqs6HqMp2m>5iPKVL66hbImDGo&VcCo@{nC z!#k;F>$2V3`7;2ooylrK^v*S?X#a8>Vot(U=3^Wj=)}*1nReppqs*OH> zh^*z(gM%UD6C(8+4;%U057i`VdEKd-2Rj|V^RwLyDXiAy0w1jn!#8Ge{)4-*L&vh0+zT}Pplj6A#m4Bv`s;LL`V)6?#9{*PhclB$ zB};H2D|9%c%SO{D803T8ja zeIM0*)l4+Q;4Os1#>e-Q{BYdAF9)NX{z4f!eZ1}IE)z`s=WqA~l5&~YTl|{N(K0X#TKGOl zsl)BWM@zo(zE?(+RVOS??^^KDMHWSyE`!iAjTOMW?ABp9*`fIG$5;D_!x_%6{`qym zcT~4D!}}hY!&V&p+{}q>bIJ{KqE<_f?MO=IZ`alXz(O-?K^-f$nNyyo?BCtgu zCdL1AQ_U0$Do#`^A!XQ+Iea~QZY54= zpf`u}W!*`Ud~@`IvJa6o&Rqja-&@Epg2#RLiFGF#T3BO_zvdU;iLyhb!_}_qNxura z8~T45BuqciP#!WITI5;py&E4l{qMea^p!x!`v&oP&#DjS>Xn_pe1Pl{&_GVr*?J=Y zq}sj>!q?+R8w|{oVD=hWdoV1~CrGm{m^dgqxSq=gVU??D%){;HAMXsF{qNKD=Ll`E z%#$s~`k(d%xLFoEE&N`A$5d#1CQdGRD85prot$`qK*d7>)4D_YKh;Fq&4ZA>z zxIuB)A&m$-5TWxD5f6{V^Hsh<{^18~J#oEvebuLAEUznBJvWbKoYF*V&@og$OY+%UP-@Wk`>q<2c86ZfHS!HAG)i9QzPiWFp;!7i(voC`b%KD+tG- zUUF(aEAP-)j21oVo(0qT#vpK-$kF)cxNU&XPS)DD^SAmg?b&)&5~xInttP+^*C{SY zs9XQ=IR<3A>)sEw*7DPc)M~!yvMdUFSDVyKR1bg7xLmlS$PE}deaDMN5C3HR46pMArMG)WZe8K8fS@BOUoD@))!4z6E6eBxA^c}Y1= zIFjW?PyOks=PQT9b$_=gvOkY@2#fq93&RQ4y%<@&=nbU>j`P~w=dZA|9fkuV=AgxP zh3wlzN`tiKuYrc$U2xv7hv5ArzSX`%STJfQ{#p6@S8q0RuovdvVe>o&)5gUKTuquQ zI7)Z^DnuQ(deEX&`#C=g+qkW9qBT&}6n4A#lo;*QzWZ3? zabkm4*yi#X?zdXLKo$7DgY$=fd`~ggTO!Quu&#F(6{pZ`&i+;+KSW8@M|cBjHxi~Z zNNO?_s8?K-25!~&HoteKOscDd>Jyb=ET&_t8`0Oo{ zdQv^2Qlw-!k!71Uw~N~K-n&`Ak-T;66dBCl_ffgoDxDQM)%Gnz4e|6Z5&p5HEJ#`}{agQbnDO&&N5`t0~@N!nALqv`~bv+E3%bmfsx4lywq2t*; z{?kprv$-QE+7_xQD$?QW&KG_)$uL{q?r%e0`7Ct8%oG^dyr^i$tfL)u8;u(F-+QO> zoZYKQG0_{`_Ep(ye&YO8({m44bo@=1yA2U_rksCQiG&it`Yzpe{36JoqL8-#a4+)p zx_3JMJo@S-|HQfcdL;SDk~4=5LxyD;`@5@5#>uy|l6bHskM8xG=+kaobDxV8Jph{e z`st$JAzLK;dG|D|^S?b6Blg9gXwyz-QO%;AZ~yq)JCnMX2io)*>5b}RKCidOSbrMD zvetak&?$*9(Buu{Q`DJ-MwaHE6zlpqY5%Ly~_7n4Mj&`z)L$yfWkCbL>Cnr>kq_nA3y9D^{VDzV|3g4XY_jC*K#z zBF@QQv-?T!HadeNEop(H!?pAK-e6tooS){amLq1E7Vh2zoznKTs4)fWcQHsI+<)-_ zFzz$uZ+r%7FNAVlUp@cQc=1Q{*iJ{j^RGQ2P>9Is+6 z23<8(0#7TlxPh!4r$s-Q0|b>8dCZ0*56SOFMi)Zc^urfQSo%Eu@ z+=w7rFh2RM`RD<%;O7m)l_pewUX}XqdLJQ)37qdh$5)CeZ>lrNBZrLlc5y`iy3z7gjteqQe*tG>56FlTaa1rpc13WZ z%Gw(R;<+kWG^1@hIR=M**=+JQ+{1(-Yr%0$T26HzogJlYm+y{e>~X?KzAxf4I?=<# zp=P|76-wCJ7$VQ_`upc~Kla2Il1Q{pv>b?$-K0R2ukef8j9ZvH80rK3j#Bs*>4V+o z@wZU_bY!SN;J|wladAhscGxaO@0mEjPM|gEnOL=YNNryAbuc9AAKqWgdH=&BU69%i z8auiwp9@>8Ddy?Q=C9>?Cco-yxZWYH@4&7jZCB0Lz6_5Uxw#63ZOZP5hgGR`jmYZ?9J9dJ$aa$ozy@}msb(P>GPF5|r6 zU^Q%x+{%RigfE2nV_IxfP|(E|a;5^kQ~B@mLZZ2~HcHQ}y6FqiBr3`<(~-)f8lRSn z@!O?LU+)MM;N{Vmku%;0q*m2hL9@C)A5m zb)Vyt<|+Xpyb$s7=_Fn_DRC#aUO8+l{`9|t$h z0e&a;Cx{7$R1_oq5LqcKG*0KcI^{(}ZJ6`0Mw6e8MVQ+C)8`Sn+do3KLdxeSBgLpe zJ?4~QVOa>iUAA3Hc^p}e3VRdOT*rMTZZU5G618A6JFNyn%BW$TZ7jzoO``{koHV)S9An3ilD6l_LA~WB1!S;;kP8 zaIO8g#NxAGVCK`q`MYik=OIfy>Vdi_#_B9uHnFw0h6b2WFfdF`)TsWECfrG2#PWB| zy1?g)OF!#pGU)A0)lZ8zsJc4uFlM=r&$!9Hg0Ee494b3y>}?oe`&-}UfR8d!E2bWV zk_lBi73O>tj~f!-nIr`DDJ=b35=@p-#QSW`28SB6;Ck`57I)0XI_pg0m)_Ih?ngT| z@+L094&lGb+ZR<5+MM;20ETyWy1c8fg*?hFj;!M&GM}=MJDQ!S@PwY1&y#?^Bvd(M z+Am&b?i;y64JGvamtTC%O;hiGQHE1A{}BfQ*I|in6u(=RnerOp`b45tj%}v&9EC4V zhMPScIwr0LJ1wR~X2wqdIO&YgQRBXCMz8bhsW#eod+BG^M zi5?LL6eHcET9<58VJ5zRj1`SHwb4o*-)~@gHKJYxR=R(T`2YI=0~?Pfve>MaC;@iN zg}oT%R)({20$xaA9(A??dv6kk(Sq&4Y;0(nXEIo>(y(j3?yUK52@`BF{$39xPnwz> za6I)2SM}j3oXIW?S_=p~@j?@j->v`A3RSCtOc&1j*AAsiPKw(~+odeTI8yp}d=mvQ z`346zdPh&7ddvlKDN%VRU3fdyZXK~6C)TjOG?Kk5{j_ou$3k0Wm)FCQ`1DL7Gs?LM z!Q1;mKEO^DCR)9nnrz!~=)ICE3A%s}ez$9t2w7g(FmR+t)`W~<*qobo(F>Ol`NB7F zZUY~|8)1DPwJ#P$EA4ci<;xe{Tx9$ThB-BgI6YW)51)3`3ITqtYNy01xb}n+8pHXz z0FRanqHp%V@9f~ko2q8Ix6jq56a$oTO2!FMMCq&uEz=U+&$18X+=kRn*)Om312`oP zShF!?$kwBY9!stHX?7w%fbUOVyR|lO!q+!0NYFtP$Jozz)%}&S)!j>9CM!z^Z>5?_ zFK6yI#E7`WH9FH~hw`bsjC$FOaB0wLK)%ac46N7lU^1U85Oc+^QBf{C)XYqqC8XWK zk*0B^>BVw|=Xs5m>znL~!@KW%E+5g)Rld*IMC1C9P9i_=$2zVF!8z;=x>j8cZ!(Ym zB(O>rR;)@fWa z8v|5hCdekjpOck|)^F^@_J8M;oy9ahyZ9I#HYksp(qSgj_LHl&L|w1^Lo9lHKzP!( zmKV2<4~fKafvaB#8`_GC(0qcwuYwW#qcv=qe%g#lcF_Q6YTuF}FvGMqVJRaJ@Mg zJ?!H*XE#7N%PRD4h{c+Ri|)QuX?17$j;dPD-8K4b! zJQG&xOGRVf#A}Y#I6~z2KJCJr{3Ym&=yEmuUWC0zYfbNb^8e&SU-&mlNGvwjqI^BrSF8lfbIP`vwg%5L@ZpgOYJ2&ta*bseJ`i<@j}B0#0DO zqd91o+?WA`3|xU_`Eu~pV6b=%)AT|8J%<#>$1I4V0HZ*e6N!79fdSY)iJusMi|*ig zV~xS7ZONmJ>Jov|FUpy`j@;Yr%0K{y8; zlT-8QZJ@$tl1bSXincP(ISmlo`$;jzp~hh-(V(qga63}i=|VEvBZynzWGn_Ux(vqB z3tG(_m3{S88Eg*MgD8`Mh&&QV&F8d^Q9;P4{0=)Xb}B15Zmr4aE%s&NM}hKs5 z|3k!?-ul7>p!+uVCAvR3?DX&D*MD*W{fOS*+~$V}xNayHU-P(>7q$GT z)R4ymbf&w#o}N{Ckxg?s^FX}kk6nA_X|q0f9%j|DvH~~{F=sih5kX3|jb)!GPuIt2 zCYdW8J^VG(grgfzpYdPcW}IgJV=3Uc857l!-+h2uOg%43!vnmO(vgWX9AUwk8n8>; z$$=FkN8V~6_Nz9{x5ZqTOch@yB7Oi@T#VT_Wcki%Ly+9`x%4Y)^qsYQcFY(=oRLwo zn!Hgh_52)zZycYP@LE*gN7VkVM|Syh3^@UT8NEaB^!L8d+IxhKjy)Mz!sM9Mo2Cos z()|0DoXA*yQ>M6>XI*w*R*sDOAbLRCrylYWe^9oy=i>fNb+@Od;fXHoACqhmx4job zm+U`B!W^6Ihe*;N9vAYcw%zH{+n$71pViXs+DPkL-#1fXoU<)3tG#uici^ZUA`IbN zY8yi7S|z?)p+@l!&?m!+5t)r29Q=WmJM-RuZga%Hq9n7H)N~P$_m98E(AX%+RI9mv z^-I&kY$-$jmIgUQyqbDvXjE_V-1|aJ6 zD<5M!n1{Xb0VTvxdicKR&9Q!ddCM$5hWENp9Jg{`__<44r46Yba#mNQCf?MGRFzh~CkCeS% zvodad#u5Tktv@r`fb*H)A6t|(nOa7p6o(uhg}1X(Q_koEamW}(efE)pU3y%|29bWo zRT)aJ@}7_5!u8zj3XwDRWEnRgaSJwj3gpv>9&wgkkn15GuKQYOawex7ddMTwczPaEQ0_;t29)%f96B$?E0Op&FFgDufUOq}JEXJ_h}E)|#>;4u$TU zU4aC$tssRVV;1WFR>SVi0Y-j!APg%r6}KNJRpAkII;!&)XW zPI@BqJhTzNV+bsMZ27^Qt1C)px3Tyfr~1@=yT);g51Yv#1$f~cEd0rUKSesW@J5dRQE zo%;p1s`)}{5t6!>l^LuakI@J~ZfZY=#dl#}N$))Pr$n}BmM}Q)w_9$}=I;|nbmuau@I zzg#}H4IGj@B{9O+tM}zI&%M75TFgUGg)K||n|XgZ-NKhWe@)goYvL_{D_<+ii0EJ^ z+qQCqaR0($Em>gEgKqv)VFkA3oMLlD-U-WgGx&oV`8tXY=FY%xt<@qz&%ecY-)0*Q zy$7*eqw{BA{|H+a0rmgn`;qeG%2UUWI@QSWe1eQ1xPicAGA29mO|@(p?cSAyV?2k5vLl-&?1wjDFR2VW?Fkps!2lYMoK2$Q8#+yt|A|$ge*HeP+=^n zt7zDOymzhO`cjLJ#v_HSHl@jTz{BI|*I!e_d71z6d(E`|JtW%IyXE~_$BDGuKKkzd z7hh%;UW$5JeQG%9vof48v%M}RmB$;%9?fVea$&Jae^vzT{dw8K&9+6sMB7Ln)>(iI zeD}LzsJ?Fc)!SR;(v>#KX%vQIMJi_0*NsXTU03?_xf$MEaGXE|ez@H|>gPm`i;;pE zFvy_tp^s2rT7;l&vS&QKg4%@9G?wl3NHUAu|8b;Z&oxNZE;z66!Zt1iCOSQc1x+?oHZ8gEwI+qJq&9jizq$#=g2Q&;FHW*N?uVViO8T3lQF8W=4v^3mw6RSwiPFX41qGlV) z{sfGZ+;rrNQmS<^;ojWGsx*(Kglb=03e%2QG@RTtzV_J4OrELDco}c|E$-u823q6Z zgc^Q7Qqym#CLG4Kn!~EXYDM>%CdOAnuc?8Yj_AIm<2`kE?CS3Ypgl%ss9rI$!2y4{jBK{T=hR%4Oo<=PT=B-3L@0i(*!!D)3~u6L z7o4=@VTUk}IEHot+9Vk_1I{w(`9ltfp0-wfCsu&n(7*e0<1nq>`K=PG`Cdl57(E~z zjl>E?9xXdH=Ae`c5y}Ey&%|;D&+bs$qJS7`IE|Do9D)ox{1mv1%H6Ol-}LmjACRGs z*oscQDp<+qo)4(!7M~Ui(wJv2?1fSJ)+xy^g-?7AkGz3@b^e#9?4TLs1eTcX^}U#l$Q593Re?nMeceLFT5#N<_zjt*M)wVs z?!3E>`okd;?S2K_*Lt@vM4`qR6ZL9%KE$VKw_f-Jq72p>}L-R7uiPeLR$Ww_; zFORRVke&V(1^#QH7u>-tnnQw_YI1Uz;$L3>c5*da+2IA#3tfOFRXh2#>!rIyC#upc zML+8j!u)$BRb(F2WQWhIOP&BAWUoMymqH3BKN<+&b}^mL zPZAf@+_hfPR$l~^eH>Qdu_2d^5UZ~GNWQ0>iK%_A5nmo4MSvwi7Scbl*wb89v%G0-wa*1)8@Y$+imJuyY3m#@ z_CB5KEYHA=pQOF7z4k3!hYz{bGFaaDCS^+a{rdKx6KQKJ-$LLTxTwYSRez0qa3b0{xemxcak4 z#)iuSP4mBmE2OU;8JW)`E%Kby^4F0e~_HdKMAiK$RaV= zW|`Ogj-3h0v~#BBbS!h)Ah1c?e4nsucmb{kYYniB%LOtR_RBYxC_g0AfcqvhqR|KZ zBnWAt(jYbKak#Gd!Q#M=am3JrWv0OJK4;}^4B0bQ`h3Q}PDeESv%aP1edrgijlW)7 zvo3K`ArT!N^|ld``+h+F$BW}q@~WppIK*7bOO0dF3dKYeHv*lL{o5S4(#4G&T%o=7 z%NhmF_cn6lm$}aGI=FercaL6u)fOlF+!X%d51=P~kApe0b&EPWHD#xuIi)eO%5sy_ z7d&@Y!=j$l5XtHmM)hJMFQ|uWy2EM8=@NtL4K38`lx6=z*;u^nQLBzeGtT71%tJU{ z_t$Vwmk9?txr2E{zN2e$xc~GTg7f1#JX<+{`ZRG>(M*|XL~__yTR@0RMn?GQmKS| zL&<%GAEHhI^0I3Qp7o6(t^+aX3fK}wJR?ts^VENM`TIHJkH1`cjz6(UyU_{~{CGJP zvz_YHcR3WIS<=@Ic_f}kXZ2rKz^4liB+wN;U_a~Hi8 zfj|`G_TU``wP8$_sBB255K|#`dbIRZccCLT)=AX?x20cC|AHd${pP4RWy1uz3qMZ4 z7fbA}3~#KAD}HOf@SbX6xng7;lN(D_Lez}}H)7m-M165zyIvqduO=x8{M6K^W#;{j zhvX|*722plNLzpZRCjczxQ{IPD)EniU$j@h8kq_99I#|MUA?G?vFwcbFnBNYtG=$T z%w-uLDan_nzRUL(qwAFUbS~VP>S%)#L;B~)NvLvX+4(5X=&Y;=wS2B*hpPyJBCKPI zw26HJd>qtvKUbdw5b^(iKE#T1qQ};64%LqR=W<;EQO(%FhCLp)E~goy&Vm!H_1%5c zT~wu$RcF^xVF|FLEhoF*QD@U|3VA*=r=OXzOE?ad9#Xqrc^GBXowWM$q7hl-c&UR| zg_()VO*aRkH>TgtUimg16h^IK20NglUKMP`r~g3Nw=vW?C8*uADm~p6B0B4ps#%yZ zA!A77@WNZuxF5*}NH>*ZBkGN@nqy5rPndl9cyCladN$w z<nu+qI@e zCWts1ImF0Hiky`J1Z#g;-Y5B;_O=Iqo&@<2c5<)uHq0H752|+5eDzgW>yNP~ko{v$ zeA+oU>GRw(@k6nZHmn*+hKXBR=pBd!yt4dKvzV+vf-rqcH^qu)JLZ=sgc&S2+FoFh z`p4y`%xV6xu{?s`J7IuU(w@~Xyl_&VPDTO)B}imlF@Nrs@5yEf^XFc7EMruM>T#j! z_WIiWU43*;&8OOaJ&nY<`@R&u&nhR-&7{^N3*G3aXubX15%Zo+bA~^?%JeauJV;jz zz8)M?w|+hVm}`^a3SYQffC?SdAq!xv4l*DQ(4D9qtW+ykd8+!&)X5bi&>MSi-(+9K-el1F4Rp|~v=Cb87P_fu= zm%89NvrNT%43Z#xlzhc%>N#4Ug(Sc_5TX_H(=8D^azHFOz5Y$uQc*xbm{57(V#cQC zZBP8RWlJJU;m&o`SN3q}glF6kv&k=O%%$B&bpU3rHPi2M+`fJ?656S`>Eeo0{?vzx>TI;R?V9QD6Gl8zn}YlJgX(>p)JLWu}gB>8p1`;h@;> zy7VStrSisSXIA#iShuDqhaH;~58xxqSfMh~h@AINZEYb?!bl{nwg>%+g?bJ-udtks z+T(y9Rs>|9o(tquuU`kf-Y8hGlRr}(YnDZ7ef~_u2!D210DseVQDmp28#<;&2&yu=*DXvRBRyD}l(qBhYUdHSMvi%o;H z;2h>=^Pvo4d{r>Z=RK8x!*tZ}%30rJ5&nMwO6dh|tQ_aO)yCxC46OkVuXLL>dI76{EebAcPqvPUYdwUCs4}OYJS6|lAPgM;HGH#NnYFG2RMAfhB|$w(;L;b|H67J z*!;hG>FCE*0c9K%x?yN%Qnc=qC*Z|fMd4Fini zV;Gi0@?1X^O<%p9avt1oFR-4JhqHhsr)QEb3+KEJpNB(fmDE~>Xypt>>osV))9L&! ziY*iPVrc}I7H6OLMLjV4YEQ`O97hNAtli-letgre_Pj3=yhEXT;xF#cZXbF7L~~<} zbkx(#b2!mZn^ABB&DL&r4!#Oi5w9h1Ys^UV`{4V_G+4o{TMkcCo`7>|D z_lSCi(Gzh_v2De;91PjMh;`i!dG`^tG2^8TOTj@OPh(ylt(G2SvN5{5-yFX##0)zG zf4#++$oF6cg++wCm&ec)zs`XewY~gw7T3IiTOn4RpTXrJE3kX-X3{Yb2bIaB26oz; z983M+5sdekR*hqc?fe=#&ziTe2iUe4iZv7zP^b*AlcXQ}=e^l0 z_9Ds!zj4IRUBB>PB&`0(;8&tmVj*LJt}#wVeFQUM9T=}L4_pZnj9+BZtk%86GMX9g zSHN2cxU%4TAq>{jV)Z@J`{w6r9O+lq-{!)Su8mV2v4s-YN;(E}deUL=1a~tSLCnvw zD@_jhE9~R~|5%cCjMo^D3;u9HD$p3hNS&QYN~mflqR(lW1r7C=jvE*2eag;EVJu`9 zzjXjX^QNUnF6ZEWMLR8AW+tu7p}X;0^T)uSw}`qd1P*Mn)Cw$`&+=~m**hwGQ7{+x z7OVD~js7qpAug>P%L#hL+d?V|2b;Td3k!Lg4;%!K%pF)Y+~n$}7J+AUkp{Sbbe@fO z{!H-TBk9f3fr_~Hk3-RkS=j1pC1>qFjTNg1%w~j$jo_Nj-_O71(CD!GSI5bN4ju}` zq|4;?*)2uy{ZsK?K^dpQT>0Q6sbwbdT&}7MXAKe0B~}I37bo6oSw;jN`9&}P5@%gJYU%ULQu=rTLRT;Sulk9Un50cXWZ&vQ8>0^IlDl{5JZCj}Hn@Nqv$D#fcs+xtMO= zvI(2h;DVWmGd;Bfp&hk?~EmU0z=Q___p|{fW*pBMm zs;;$zU||`DZR-vgy1!LWni}~2Cp6WF!-=sYyYmB~1k?+pMzV6kLb>2nK;(E_5$cPT zp7ta``d-^^`Y(6g3gKeA^WpaE zGv2vskBkXp`}jT%jNqjcnTq!U)<5>v^M^iN&0cSerFnK~F+`H+8JM%b+@Nk;5PkT` z5%w1cZwc%ub=Quiv38QpyZBPT6#swEnU;F`JQ^)7q~VA^TM&W2`N9?whRNU59(AOb z)!DnHxwJ9==Q{@t{tIJm(~6Iy%AdrSfv2ehD8J6hjjse-fUy z{iise2Q~#=-Xe6pnWvOo5kxs3R0$sUokYZ2^C)MkU+tF<_C0zz@oVwpEh$Q(bMMEZ zpOv&Ci}JH={g&d!3EU1i#FvS-X@fPz1vVZvh)3-%Nm3NzddX}lSwzi!W`Z?-PD9qr zNJK(yUkr*f?!F$sj>rxdGlx>qO?!U73~KM``hOfD62w+2v#nunK!Om+H;hE5(P>)s z_sg_{q|{qG3t&LAD`p(s_=4)Y&1Q`8K(i3fnYAN9q?5*Mz_82=U$!lE`wM?+-$L$} zceYvEgQ}Hh7FmNy;*_1Dxz9}d)*51U3OjPXH&AVsuv&C~?Njta#Fs#-Br9-xY?uqM zTDoUhczHhXmH;yHM5pg!b@3e(Saxy{|7AICv1^gbV<0Dd^=m_OqO@I>adHd&fFO{v zSOjwn;4p%bTw53zb?rS7EJIuFmQc=#K|7rrS z2|02P3PiYKlEgp({iaTHLVSi=Wy;G&F@WY87F$;p4qurVir+B z=uY29nsC1{SMm%u0D<01{2Wc5v3ZqH2-P7O`gd)G-qs~Jp45>j0H2+7i}+`TGD>P{ zH22y^kDv<_X$CPtzJ~5$EudL{B8m%-w1xZo1Wr66p$}VjL5=q&$snTgHzyClv$Zn` zHq#gTq88@xeaF8qXMZN}Wy+6Cq#awC;!!`Jczm?}`tCaw^@;5hR}e*y{jSod9%<$B zPsz2ALVL2&b|mIIliZD5H^g~2CuwCHIqSb_eZ(Jl;eJ*e4bGE6oMGkpN5emi01!fZ zz-SaNn;UiWsQo5wTHc`w08+HhfIni6DjW;f-AQmB+k2%&OTBKdHlez#z5g5ZdIw|p z527!zrkWs@A=`2KMv_DT8$vZow7rI#>WUMo(`&uP6cb8HQ z2y465zFD~|Up4i@GaRHX_!GQp5)-ZqYU$usO=9a~eKHcudpj*E$%iii-$$^0v+p|! zVVJVC7h6}aMf-!WcWqSv~2D(#V-&lYc* zH1nV}O~VhQbTwVr$iw~@7+h^G*pPT8wtZSGWOg3#JsLoP(fIj6*G_t&FGkQr46bop z7Fb~5WJxmhW7R2eF@I-K*r~@6`a2~3lwg(DJb`rOh8numlWN@fPoSZd*YgJf>#lJvW{v&0L^vAXsjY)=DDwFl99+R(^bd%W3WG36}_}3UCbDP z8Nd(M3&BWtjmiy5QC3xNCihC2#M&rfIf_flxXJSW`ul%txqMPNQ65q?oo+O?`NVxJ zg8NRGO1xytA>*ya>4i;z{7(Jp42zHB!brK)0}LMFzl{%=obx_)89K`Li_!IXF1kP$~RSM;5aNX8Q2|<4KJZ)K=@>e{x2Rar^y2#Hn_r{9G2L;cXe6qa)1(Jouh-}33 zvg3Q8eo*1T$qd?K7naR#!&^p2Ljj6RUd}XhVC9!Ot`YswhKSK_p^~nJ|1?Ma?N;QH z?&VzQO6GaS)q3@-1=#s<=iTi!aIq>ooj;LYqxalfXmo`_EbxbZ_{s3!&wy3MDcw$Q z<3GXx@-?yYdOmhpxn%eJ<2f?VZ%n@dqBP49wy~PjMq&TzuUKHG?g804+TqmnK|UUj z*7dBWz(4N{Vv0Tf*3Q5Tm@Y=|GjA*9>TQe3d|!V~3I(0|ZSo(O%6t$RVnK$!Csrk? zr$t7y>W7j5BU_j1!aWP!oE8-{?CnJQ;^v%EG%`Ge2G4QGmweR&Gj?~4ufD*5K{)Td zeS)pxzuk7tG9ZyeeF}Bn`VAd@W&ADlnQ$4D0%p`GcLvTaz4HlSxn*m(t>1;~Pfl2S zpOW!Bqhz&HH!%i*fzMo>#1(_Y^XDYnMDTUl%D3f5BNVHarF^PL0 zec{1ag~Q8?4;~B?lG6Y!K+?Y>oy$j+s5=2yk85fiDQ)#5>K<6-1Kw)_Ln4Jt`2*$& zeKa2B3+PEH#*OO9e!EPOO{#@#yL}_L?+dQ@r-z>PG}tqFJafOXrmm(t)fMIMlLN_y z=WrZXJjVRXlUf$2INrALnNoJ5nU2 zpvXO&b<*U=4I*MJiX&ybDw)6h;~UqfbHVG-_@+=dF}Xw5-IHq&(N8vgTQIfwSuC)h z8mU9t9p7dJN{B=p8P~7+C$HL z?C<6-u&d`%<4a*aLLX>dTx~q-q=KQaAF4IIcRXc9Vk4@#`0n?q$8{2GkQ|#@e)H&{rZeoLJECqSFc_7!xGDsBM=5^esXYwsUmwYpL?EKC3V$I%cmcb04G$;(J2o-y zc#}lv{HVH~=e}1TH!rPR!t%nW6XIl^OO6sJVoGX#y%pOX-N8_a4@3)Zl8^__ z#uY}5cb4@$<$KYEB6Ua_i-(*x(uI8?ofdPbt|~BVQ4SJz%@bz%XUnfsqx=OIfL0HLxt;x`i@FCzrW`ulF0-5 zruE%H59`v9cQ5)us9F{zX<0D-IR~6fLPlm{O41hr$g6Cq(_D5Li2GtNn|?oFI@hB( zGxG{})A!KUIB?8F?p;B_aavw>O{<($fGF=gD~1JB(f%FDF}XMs9{BGGc@O_R$jj1< z0~wac06FKAfn*fpW-M$?k^pfI($AhH&nr*Uu~%_FX^!KP3Fe#E^P5I}250W*I$sxu z)WUh}rA3pRMLDNCnSBAXaR?&+lfB+pw&NX519Qg`Qj*RBlE;%!T_mL|a$#?spD>Qw1aIO5y>dt~V zCqiw%{-51Y^aLu#IO`=y$o)P}MVyPFiQLWHe4U$ZfsZS**(0krcL$VdEuTJmC+aJE zZ>)LWwH5>biDy5n*P~V{gkZk&%vJtA{wNXe)L|6G*u1fZ+eEoHJ1!tMcqim1FEp!? zNSyDrGo9A^GgZK2{r_nC#<j>AksW>9P5+AUPmTZL1w_zZi>2?&-2pr6+|iUZQoPYQ?^jASKVf z3rKpdDt|NvG1ptAh}~)DYzR4arJZ6EIe-t=(__P}v#@YCi;IG~seI++zNbXTCNb+nuW>6aM|Q zo1XuT16f=JLMA+YEBl8YtNI4AuGbCs=FS021=(n)C#7`$5nZiN2}<;FFq%(!CovB} z*BQNWRK}=zu|V_cLr3kvE6mp7-xG+u0INs;o%`%ntFi-eJ1-uM`%eCiSD7vH@OBF; z3zAS-<2%#q#>)#XXMdB^+vU2LjT8;c2akMz>N|_rs7%$T3Fs={R~G7^F_?CB*583g zF>*V|)g%*_-RbQV$YB6~;{AUXHUb5U=&P0Q=R^q{f=v953t=&&v|=mTuudygNwmSz z$L^`fv+xdXh8Pu0V?B4qz3lW?$};_QtsN2HmP{nJp&x2=c5gTeYKc&WNM*z3M8^eZ z4WeQwl>;p>S6%=6-c{PRum3)O*QoZ(lQ_}0d9LDg)8*8nExWwKZF=VpCjx5($}|={ z`TL@YKX-9&B_E+9gF5Dz+EW;+&H5wli7^UbX#5I#;*ovd{*t_pWV z&Cy@PK!^bwY5k{f!gBvw6GHGWAM6yt+^eA?{hz;V)u~pWQuPV0?wj2k1j}ST1lgxg zE&mLw%eWRcZD<6duvYB%tA5x1u}t3(5X7xNDQB>#PR?IpkjtjYX+peP{=a=;DE8o| zy&=R`o5fLK9lS)yr%T{UU2sDGRfo>>IQylf%5YLPqcZBlM65Q}6>U9CF(U2RB?W#$ zDtr8vNksjzFXg{E@#;Of4Oslc_r`tQNoRVX`Azgl#G>ayj=b*&2HPPr2gn<#$s*tM4#JFO*jPjy z9fKr(dFoh;qf_uyzGRG2pv_@#3r{jmSe;1bkR+C>IG#DU7h5$dS9~q33okhMFcEF< z>0qs8qZz44?o^Aq!gD6w^kRZ@^yX@iaEq~kI*>oVexdWCmE7RR6%!V~hiUa`2Ad0- zNXI9%BaE9Q^x<^?(#;G))HFQuTIbbgV}))Rn2Q<1VG1VFIH3=7Oc#50S~-hERS>2G z6MyJ%29-83f)pj6>gym$-mqX@Cf%-zBOK07i>NaXU=I8H@7bldgR<>UYXL6T{%!sA z?kdcMpW1Ub&vr5o#!l~=05ST36vg?n;ts~im{B6uYrf^@^)Coj)W*64ZyAQMJk4D` zJmx+xVs}^kqQSSuS?WbfsYkh>TW$s9M;5T^>LYIv&`SlS?0B1by*c#Trl2v_Uel|? znp+s)85$G4oC{0J{a&T+ocZ@jID!E8g5=_*X2M~Kvjfpff}I0$TT|@f7dcu(+SSxiuWu;O=6_c`4xh9JgpqPi7Eoe%RB#te5MaG z8iTyPR3@dGK6!@~HT?|zytSBNiB(9Mm%?>e>9W%ecBUEN<9^1+>V%MYRAQma7og989FZ608^&;%+DK;le?kx!2kP(&Z>XI zU6xSn%pq3Yrj`NBl-K95pC%&o?2nC~RiT_}H7)3XR<_e3V;;2Y?O$gQMK6=yApL@L zq3ENpQP1oA*ovy6l+?U3x1X?(Szg>S4*<0iOhBc_;M#VPTxwB+ z1rsdquSaIQc;hl?I9o99Ac8J=YH6uSgWl&HtKg8?)F17iJkswTS0Syhl1QXZX~o9> zmK){3QfMA`#MJ@{EQ*vcZ9Z}wgVH;Cj{Nsd4D1s#`*T>0DILCIe&{0xnJ|l%6&Njp z&zIm}*3}~s7LQzLDHry`p&s-?nJcTpb}+b2RP(Cr$@Y-<(Aucup`xq8_|vV|qiGZl5j)1PlaV z39RTdx@T7ozw;6wZPmEeC>S2(2f^F6c7*%jk%Qi5rGEt&I{@G3(|mzd4u85p$rbF> z2)ASHql~xU2ql@f{&&2XT_LgAR2Ed%Zh~7IJA^U4_gNF>JBJircfFPrW0rSKb@BmU z7v}+JrXOOiBNL1}b4UNm?tb8D8b9(cTz0{;nazyy&kwB7M96$$!QzZ}TAdgO5K7w&NkqN zcY$i6;xq?i=zt9-*`i-eR<>4)B;p}(%ZQ1}%9tVdURfasuT%4mjY&>UxZEqNJvX`B zMnhHx|87K(T?B1i4jlSz2US2}%7vwP2#ZKAFzxXDuPpII*~WTLG=g{iZZ~2zZ*J)p z4BEi{!SHKEw^^lRI)}lqzV5JL>{!`R%nM&;KlOJJ`6#k>R9@&IANHo~=)zhDG7^+;$+#JuA6T@^ z)SA9*_W{Mga|iPGG`8-tQ)RoGZ5C=H;(P|4U5k5>i{gUv$SmHB00mdQd(hV9P4${BIXqfZCXwUt`a~eM4 zUHrCz7Puz86LvYl-B+(M%7ZQbhg%3HXvVfF91gNP4(KPMyUGIOU!crAk5XZlcH8h& z^CR%yK}OH&Q+pXb?5n+T!JKcoWYul{ZP=JkS@A@(SaO))QgH6hhHn>%{8jJ`#cBQYhF=HI0-YQY-a9Xf+QA?lY`icDTsK+fK3PcHe#a=qL zLBWJ&xH1GJ(Bj8~GejCDlHbeV$I)8+ool;=Vc<6Erczh**(z*{y!By_kmhu!-HiT@ z$7{}T@j+GWloiTnN3?{82}g`1$&FXc+;$AM0p#cnBZFdC*os!a=wndj+llEUP_@NX ze`*A2a(S*4@arn9shPE}ngx;RWlb5KP-2Tc#P{jQ5{o=f4LLqb@4Y@g{`sH(l)Eja z*A3r|d!SUq3(18z2?zK0xXldLKNo*biSRAPj|hzytX_SLbsD?TM;@rYf0i?)XWq() zDfzAsig+;4EdvAklbby?kk+3(7G`BLKy=cgPb2-t|8}kN1{|YW1iFgJuO<;kFyt|! z%~-h8bhKL+iH90tB^=v1#AB{4+5}Y&zgqdfiN#rsqsF?_{k_gEwz^Cc?=ph7l<0AY z*+Bwoe(-%dg9hTE(^>Ti#4Ko6^Pv=Im_$lFgUI@OS(=+t;;b<~Cm#6>FiWz*6H%eB z!d_Bg!ID)Pkvb%lw;n+ZoG8x(YSz&`@mk8B)~qAYgPc)Gje5cT%v z>mViA$%2dw>{SH{d?Xa+#`)s#f<1tmHqzc%s;hWPf^7=EbK%+_gM_)!8n`(K-!)f`4O4;b- zd3K#Eb_IkAbb)czJ3a9MslZS-y`Y8PA^Ek}C$M0@8zu# zVsW~Jrj=X;Ex+!Ezsvi)dg>tzDQtV7<1|QbrgDuKCh<9@^!JPu7wJYuEt_vh1Y;KM z)qo+_`dAdj+C1spe|2@_2hLQ9HY=kh7=013jE0uB>~SF0pk^|E+a-rGa_N|P*I$aE znEYb5FFpVw!FxXeh{xV~xY&8uC#^@UF8B@iLTH3R!`w8J?wiV2k`p6eqQiZSl=pK* z>s6j+_bukDFP!qa>}|bnnwjyl%LS>-Cn4xV-q%6HXGE3Bl44ck4_%Lix(%7jRG4JM z1Nhjmiy5gu{Y+>`kIj=SMza?x8{>3jxd-@jG;{ltyWb0o zr|JMi9ULMvppj?EqjOCzSk{C685hORIHU`?`ro)6R4bjzuK%C(3grX+v{v1%!VsfI zFY9UxZ?!K=aek5+r$hHio-}D<$&F?vVe+-#fVVN4(6|Buq&dDx=;IzEzsmU?Qz;iM z>@HBR6$X_)WzsW>ohgAaIG!zE^?f0J#S}%r!nU^1htVrzd5Z=4%=MhFi5ts-$);3^oR)UVJq@|@(GGRld^LAL3(RXVGslRd6Pn-&?zSl{kEKS_gIdkxXhxw{v zHyFn}ibT*Ap0A-lf#|QTQ65N=p?h0LH*~>PeyxJEZ61?g5gC%u7=xYh@{Q)EnN&8z zV7@~eRJBZwONIir!*@o(j463|FR6`Y+T(188D-)NQOeb>+8 z%|m(#O@fH8OaBZp{uIh3!k4``>1DV)7`F{y*<#f}aNS$JxAi}SEEIUg z3A^$Q7jiLNz1uQ!;yKCMoKPpQL+w-Mi0KDsR3w(F-;B&QY@kOtOmU9NoAXPpctPQN zqvemk4JMHCoWxXWS(Kn>jU;LAGWwJ`9ZL?Y1-2rMY%9=~NchOtns>>2u#``AAMIck zGrIbodw;dFz$AA2$^KJQOH;{RiegM`hWw#j`YefN2CVNnxwi_GX_v#>mmStz8;)T@ z+JiO`{cX=aS>ngHOr=HOu%rP7iD}&um1?ccxl^}}z#WWZkPLM*KoHBobKB_kFKMCO z(dFJpw)H!Za2p44ubq*t3rLTw=(S_QGhKti@)GVUH@G!t(P$uC(8-g;4WsY<`Hk69 z4KjJc{;S$%QI!-o8{APuM~Z)BQhH6d%@X6p^q)z3Z598>F(j{?Jz-v^ZOZksCRyRD z$8x|Tr!b}e$e(!~$UT%qAT|Ws>cV~aA0n{Ol{(`}Z!l*reemi0LE-TnQrze=>A^GQ zEG6@in%%q6j`RbjUwS0`2@c+0y27R_+?#%=S6=E>wMeuGU_#%~Z4p>XIL_K}pN$>O z%+GUFou{}2lY%M*+kmskpv7cwV0>BIiTgiY{+$gOMn}Zd&71{L!3Zk3SlNb7byI?S zpZn_IEGv*)MLFHZ5d3;`S7gS{c*TbcBd&|z(QM_BiO`$=r&5APb8}7S^LIpJEaTGU z?#sFX<&Hp((obl}U>c63QDz89hygo`KG6P|>>@75Dv-p?aD}1~Nd#3%bbP&08mYQa z#}#rIDy&b|(ksKoFJ_P*uX>_an2B&t!B%n#$xTg#x5$}2&jb@o=G6Q7tQdoYSy9<& zDK$~b-K!R^nW>ghuQ%+Vn415)r$d~_keObDDb^dc8UXt<6xC~e^hG}U42@v;@qPCe z^a1Ec7n2o$*Z3*o{*aGOZ5b&HD6U3=63f^}!|S4LYO?2U-=1o6X*lgcmOgE)^B}9a zWi~$B2_MHHgtg(REshL>h0!@4n=roKBy?a3PY=z`y=#04J6wbt&%1yocMl;zd|BeP zb9ME7>ja?Ecb!%BSDZ$xK8ffzoFqCT?llnE-Pfo%CXyo-BeWNaf^!oJ7fk`nVgus2 zuQK5Tro;y5sX_x|&W>?xkc^H`Xec@s<)X7MOF!7rcTyJRa9!qKz!kxH=C&CpoY1v% zTdrIOlj=*x9t>jb>nQg5;N211I~98*h3m|NE&@X2TLu4aS}D6%{RsB)aM57JQZrjwR#lL=AS{9aA+te`iLQ)3X-Al+yRHD_oZJ0Iq- zwfo_dQETWk6=yBYj;tvmY3f)B;NcbC+9%scA@!xOT`zr~A1?;tkyTcWILB>MrDox? z*1O%hs|!Z%I|wU|;AsAelU{m_m&J}Y4;m@NQD@Ohl$seq3?h@K z$2!`pFt$y$(E=evpX49m>4Iwfu@CnR@S*7qd{yzU%s%uUjzaeV!#AAMHM^%yXQxH( z^P`3|&A+*=d zkRBVE+yhgNE!B&!Twp=;p0Z9{T`^A@^Z_^j4Sg0n8{3h8fr&PEH1If51bQTLQj7Q% z0D(itMCZmzL>T`~s(-ed&VR-QrrTKOP+Ay5b@;7o=RS!bm3ldnZhYhs2>8@-MV3TW zOJ{AbT|MQ)iyxmQ*GlM)kGpI%o=!;cx~y2XRl$8$R{*S0p<`tuxVQI*Wd!8XGsx&8 zooAk=qChwLL1&(|UE2|)^;wvVP9}oqS06E{pkZ?~OBZhwa+9Jgh$-P;-BtXF|I>jK z9IdI*%1cLgdYDD$rRYvF?HA@{GmgnrSE`^n0X7Tx=^=AuX*D7k;P>GxE4KOq!Yx45 z@T`L!xRbosAqBA%x?EhBiwuO%mE{i<%z)Bm#+YIaj-;Rn%ZtWaC&euMCIGY%Sz1$I z$qfpP&n)RYVxCkZtr*JoPV*MU&yuFJ!Mda!BQx8Gi&_VyR#E zUGA&mhS$nLWDu_%2BerCT>qw(ml8_Rk3Hh8dR2q5JX}}eOz*gi2Gg+EgZ6Xr=bH@F z48^R*3%~Vc(hV_kxFljlo?Y0;x@634`ZW6e=hGXs0Mb5Lgl6Bt%k+Mst$M3T-vcbA z_yt@e>8QjEN}f}nrYh9+g>CsYbaoK2sG6_;fF1Bp*XqqW=ujzucxBlH`ZLELI_JgK zfQiL;-g*p+89(x!8qU7Y^Qw6%Xf9EJ{?i}VvW1KP?vSN!yIVI6RYKwT-~lnd!gday zc0!u=6;z^3RLCOFJ$YaqI?Li1m25p>^nlvmjK4A^DL%wCa425sU$&+vCbYu=wtota zwK;?BF3vHj1_e7PUIJwvpvBzk!(LI&b)kQrHiC$=UOz7VDY(bQ;tiWpsQYCRsv^B$}pQE5L8OE)Uv}NL?l&Bodrx1 zg#}o|^QCVtgJ+nsP8p;*%&OntH{^5GQ^L6UZ4DtCl4!-A=F8-aF}N7Iqfh8<8?vms zhP@XIhg~<&x|Cxn)=4vSH(S=UE|ua&J$^B|TX@yIz2J9zhpFJc{#%4(j(=wQcDuf! zSQA@ZFlPrXtGoBjINZ4q`X+EXF{;rs`ToAY|8HL}^fy;U zxEAiNnS(d6-9y(AY!|@P_mBd(Z!WA&LD!85zL?H0kC3qjL9Q!8e?2uWnh;wix&28c z3s9h#>DGkbD|zs`dj<)Of(=I)-whh_;kScHkG~NWk*;--vF(jh$w!|p(g+Nku;ht z@m9ajfh!ogO-7VAJ;qq+h7hZ3pCeAC9RIMd6fVu(o25x|cqnFmH%&R8pLf-F;QG0L zK&N-zOcjj?vP8kK z(;kVSE4jbKLE6v^9mD+#Xqw_?&B|Fh6G*s<%>NY|4dzWWzI%&nBHt0xI?wF$f~BX* z*lr=b61|eNkXLI>^AS&7G5CqWgk$`|Gn<_yo@`pas)`$4hw6-u%Meyolxs*uwdG($ z?dm}m+iyosb9wHOsa8);1&L+}-Q8p}6CT1@W1kKTKOv zu-NE^{2s?_uw4WQrKZK0-$Guy9HTrMS9LMP-tX}OU`u{SY7)aMm~NAw#_2I#8=aL7 zQw?p_d7C+EG}gO;TI4{?>H620EjtcrcmO&rD1uheKiY!@Ig&NeX`0FH8at*HXYdzW zJFKqbNAMqc+Q$89Xm6CK?J16DE(R`!N_C>4#Dvt~{puSRt=XSsgDNr+G8;gX^bGGB zd^5DsOG>zU*jO(WYKmwSObW$qQLslRVgEr`+?$rUNYin&H6VM`3}W3$(x@F z66_&0BW&_jB0MeR401xpLMZ-Kb0cFFI@&G7yVp*odm|UnJ@II@ zxWRNHE?J&9q@%KGfZL{1vC@c4*4@#qFiegg|J^ULKj|@> zGmdm4h)}4;!1J%m2$Ob(bwZpqdyGMll==Gyp8WJe^xJ1%rH^RLGwyk}dh^#9&xBM+ zM9QqdGuZ$99fzpfD){s3e|)d!2_E4=ZE}S~z9IV-f|ko$6@xI9+$5_-Z*lsak;G7P zy*T8*{Y*ZW%FlFhCi5@<@l}mgI-Lnp@I&4Z>#-}qEAkUMw@ZJrSZq+{ z`ou)o4r1#T1m}>W2rn@@#(OPrP2(MUJD8hli8KweH+_uE0JpXi+D_krl-qNYJM-rS z&6h~fp)_lHMHlE##>aY(%3RdS!t6{4bGL1Rx|GGJlGGXG-Ny4)A*8c-=6t%+^hNsG zong_4@m`TtmVms4h-IxZ^X-udMJRD^>}IK(!n55IM_%U~u`^;dG*4X0EG74Et#GrH z$DErdn^f`db2U}(y7rzL8@p{6oDeCr@xHgNy>oJZG!HRpUACtRzJXg{Q=5Kp@U3wW zVbF6^RvQf=gjZZr(j^K8Jjjs|D#C#J1V6~2r~0&ZBa%L`;WVQsSL555W@9I2Xxsn% z7(i?HURd)8ucTs%Kh4>45~_bNm4uxzi3?|VfUBo(``Tf=0Idzr)N6<(!1(g0L10i@wUX8nM(vos6JZJ8xik=fR!7|Q zB|%3_U(C#UIeHbOFPg%Nf%&@~pWG=@_nD!ulrX$79%)X5hrJn8gu59C~gIWN}|TX1>n{A3D}) zR>e3I*V8fc4#8rX+&e49gzk3w@@k*>mc`YnpPCj|OpJhgV-j)s22iJt&R&Ix1xzNq z19Z5pTe7RH!e}zZ-w;T)W>MCe%D3cVDc8)gj%~lwZw}%icX*KZij_WJf>3~_uB0xQ zUh$!QATo~eyCfB08bAZBH9cx^)!T!We}*)Ancf(SH9C++S0n!i%iHDKfa~wCjjMd( z3hqj=gAa(zlY7k~HK7Pc`E9WwwwOk0=P=6Edr9Gq6B75jaNVPakRV+d=_WTGR_9PNIR|h5j@_K$NzMaq0sM@>AAsEBo=a80G=nPL0w*>ms=#IhP*`DuT z+1B?oMl2q{iw}TrG-k0C2E+;73gKz4CD6j0Y1`D*w6V${)!M#DuOY#{dZzz$%D(7= zPg?C~n?H!?^}Ce5LuAVvf^T6FN+`?6S~j?rR>TXkyOMntYBUp(LDyut50%*d81^dGrg%>Bx+#y3N#S>L{Tp4ZJa|7 zO6D$UG3i`zP4!n_pL}*zHsZ?~{KnISn_g4T#h`5PTv(F*_M+|}|K zF78zTEu7vXnluBeXi>LJP=!pUBM$*&*l}bNE+Qo~G7=QZ>*R+Bi}!%!hNuBMj8SWj z{>;BGWo_|F8}|-b+I@dw<6)r~$JEWFv}$6(w#>q{n)}>!%aiVg- zd};_O5LrO_*QqAcnDlcP;%DBJNDP<_>`hB2Ix+{lzbxobvMPrtRJueJTeZ_0pxHw1Y=L3yQ;9i^l|9n8{ z0AZ$guY)mld01NDIiXXf@@L62UGmQ(oAYP}`IggTkohO~KoARSK&*eS2P_wci7`@i zV9(og3?dIQdf$4ttN;8ErUo|3nw(JB+`oJXAycGkbH#H%BJcm^zMWLMK0ek`E>tg4 zDx_{atUn(*0@jCxdb1p2$rr&a&KURvh-DUIuQyNC*^%&#;%`q_S+zg|LkkAIep_hv zjNx?zd5cC(-xLS6%>o;7Vrf)+Kn@$mSa0^==OT3ziOru{blz}Rk#)gUWh52LsA6uUvH(}7yCbK zcrvL?c`coIXF+5 zI#q-d!hxubz+an3sxig-1@3ns7OdWoMOMf%fflmEhyrwiuP@BDeG}vSO$P^u@T<`5 z-!!N0)%6&cyq$Fz3{CBlTbDFamc3l}|I;z>no6`@;1SR^M0t3Wn1y$0P^%k{M+QS0 z_hqF<{<1`)OL^@CWx+&AuuKF9y(uRwW7#re;7%qu1|5E)xeVrgpHI5)jJO;qP90Rn zA;&qb?NJU%VD~8&&2|IkMgQA_xYHVUpLklVBbUzi)YHuG`x8kGR@<45jO z+|T*16ibA%)k7`>fL3imyd%D5lC~YcjRrd3&U9hZGkVEnc6cQ~ux;l4Stzv=Ww#wU z3Yp6dh0^AOCa zC3IC?%fWu`4}B~$9k93 zv{>N^jsmg#|zS&T9Mr=WT|5_zWHjuFVI=$nD@Y6ihh!BcFd< zS2{~q|7DgJYOWZ_a>;lEfRE6B!}?O|PD?ALZ5bha_{h4Y-aontmOAs0&{9INKKC!y z?2|ez7%odq%hgs%T|glC`i(o1F&%|oIYQm%PFr%L{(;P7z?q=*N;>UEwS)-??~P74 za~qHtxPibDz$EC1kK-h@KgfIAK1&}^032S_>&q;Y#m-pCUT{Z&U{xZ>oFv`)y}X;w>xIN=s~%b z7%K>%Qy|_wSX2IG*s2W+iSPC@og`|v`?j-rZcd|>kTfQN`x>}ET(p)7YXthaz7;hY z#abw4%BZTR%k#1h_l4f^=o9&~-^)nqI6$zHGFHHy^gz3$Yab;E$qtJWZRdb+{y>!` zn|Q0Ig-a9&{AnseZ#P|CwpWuFB#mEBTbv5^gUKEd`bx29)l<@VfVU4fL z!-s(q#J{j?TJRU^8hf|b`0>lr+fL^5-hpi%X``4StG%I9j*`A^LA9W(_2!f!5}fV8Xr`cp zMaAxVujW$vWWX&g$_%}Yd3|tKgsm0&oY8o7w*)5Do=P=7@fvf zUNv7je4Pl_N*ed$&_cf!|6F1;>=S!yX>#4bJfiFPR6p;4o@$0;Baq&8866OZwC-42 zxAqdIOLCkDnp&0o=oi$?D9@6o%F1;0yAUaCe~%$OjOF`$`=esS>wT?}3!pD=N{ufC z71M2$AKB=(YdW!q>i@abVP>vl>Sf3-8XbmIe$Z?Jpt2R~*Rz}`x+YjZW_OsL-h&mPG5+^0E+#p|?2DOe(v31JVB zLia6%^=^AeTOj)Qas*{&3*rX4q!Pg=I-99~txt%kD7O^!U;be)^m1`;N=iShRhTn* zCId8~8*Hh~et`zHi}^LnD35C&edz#w)#BjOuB*UKD+%bwfl>!;&WH*1S^ls4m_n0> zh?ALlhy&5jKVWzMUB-T6)~^v#cZ3tWH4;YG`C~w6jVwCflM*ohC_ObIgu-oeo7No% z;9s8@i03MjzI=6<$(Z^VyZcy-@%Pbn#BLR^b0I8 zRd-;q;}om~0{YFv!fUjTr@byEu*uO=k_P%%o_|QdX7I`K4Atvi9|^SrtHXwI7*xDO z=ldt;#jJkadubVl3#6>=Sf{^0W)l2+W5E|rY*A4%e+A#=H%blOMx6O=!h-o~TvP>% zHgFZ1h3H`hj$flJPL0(C4d}yA9wlt;-ErFn(!p4*yx|3Nl{4#RZ zyrWG~3r#tRCyfwfWN%gL&UwHv17GyYo&_!Zb&(k@%@*j$%-4fRy?l*8 zIzHa2qD;-Fbv@HP#31omnLXBxP58|dk|LPY12whrd4oEcV8CHokvFD-UyY+NNrSJ7 zQXpGFBJqw}JbH8buZ=jUEiWwFKqX11*oij zs-g~fNBE?pNX=ShE<9zR)Ipg5!u@_mykaXr$FsQV$5^62{oN8(gm8EM=hUmhGBN`Q z@?Y4h9hA62Hgw{YA3Ai8Ma$HOrExME?{uLp?@xw)+%hECM_+^FG3_>Blz&1D&LI2E zhUUp0ItdvWzJ@l+pYM}auL9eRdJr8ui~V`(s7=?D?mp#pH&BN_Y?0HTeLH$2!z1js zCzqMp1-6+#8Qn~7M`3a}M1yVgMu0i~Edo)W|DrumLJbnwy$rzMs{1HH&)6GEW}B#L zyyH!a1;0cK$NKul!vEc; zYaj@L+s)`vRG!i+q$mhb3+{f>+xuxx=@yG+y%TakUmP8MVJktl{2C6=_d?S6(|lX3 z$X6qT;zs7Zl1Kq8v{egk$R)_NYv!%Oa)u-xWFcm;aj#u^FOAwQ3KBl@l{}acvuL(d zW4S4Xj6!(|huSu#Hf9!s2>UuTWb!}w_JibOJThx!tf|laFC+3k)(>p|I+4n%*m+id zbL|VneiFTO7}We{_$}FBzl#Wkh?JJYvR^HrX|A~FmcE0(d4)}cIS!q_lfgNjhP6%Y zZ@ra#Pjx6kCN~`y*2M!*t_s$F)21j5iL1Egmk8{a4a6FYwqb+h`$jYO=}!>PV8BH8 zePx4n)sD{|@?d|Qb(}Rlf9FpgrmGFCU?7tYrqbR5L4Z~`$MpFc<7*wE_EH$AD?JzV z!*c(hN&WExoR(l-)$LQ>W0frWo9)Bz0RhDW5)va6ijKII`x;67oUg=PW%wAfWtFPA z=o#w*%ZP%VzMtis=KnUBm=q;wcB^d!YBGOQ?Boa%y|t8$Z;|9fY3`T4d{ed{7>y(?vr*GXcEx$d2N#pfD_&+`Dn$V z?joXt>)n_z;^Y#GDNuAcGsy*+oy@P!)2(o#z?`YIj)Fw)qNCbCR6oQS$ay#c+E*kr zM+bG>RA~4PY@Nlm2R6Fq893==oAtDjiEVa%rthmpcb9yD)dSPPazDz>YOm#3kExQ= z+z>1vW67f0&U>Bq(+{iYyO*)RV(R+;C20b#P>K(KOO7*n@W9w8pK3v(DIq)`XB1Vh z){j*_RB0ts7LVi+MtIQ?_-C2cvM`m-JbvyAk%fV%qLcb2lu}+q+)j1TfucrXxH7C= z1^4paCtKD1=VJba*w`pcV9y_IOkcVeo1SXp#JiZ^puimPVpKn!Ze5WBsS)Z%1#y&S z$y~<&&rdBCmW9AB>@##JOQFX}$mQ>6sfszv_v_i;s`x2gyj>V&(RQeRgB6q8I*Q5e z1Ru-5wg&T|vxh|S65^Y$e_}CUH<|*|I(xy6GApw_xTj-+^vGD7*n{07Z}jO0WB7C} znwZ>@&@o#g3*r+LX%bw`ZNx8oo495!Peyf{w+tL67FH4{J)mM<}l$)={^GfV=juJj7- zm+$yz*V18Z!IX1G35NyQ{p^QJ(8ftR0#G-{GX96gQdvzV3qr(Q_cpD5IFuTrz<)Tl z;q1gM-Sb2i2-1BaTkti6)60)ufG?z;+F$+&0`S#mt|cp|^Z_{4&CmVye{dw!*)|i^ z!v`JcJ#%+483Pz zJ!H#Kt`4lJ>XCy+Z`R{+eYQQT2@*B-n!tqdxAa+F^T)fRF!NiTGl$R!k1wR6QK zKe}~)T(1S~hp)(M{SICx#6f>&1FOIkn(GpI_I{+C5x{G=XR7$YK$OVR?*Dwg;i;P5 zHr9KUvw$0Cy@ojRFj`b!ro>bJtT8Kk5iJe3TaGz(B$!k&u^L!F7#38z&$na8^4~b< zO96Cl^jD#IKlFDN>NY%ww^mtMknm|2Rpo5gQj|RQIKK1j*KrJQi@RnJYVRN^H40Fx{*(u5Ka^b*^ZAy#x`~(vG`S|o6x1A4Pbn6?g z>e_uxcP7HCdVOtUfK&H{wg0(Cl%36_f<-T|a-(yY@*s3B5T~+85k*NFj2}UgkFQ1d zpI=_(l*R73!&1<+7q2HneH6a!xuF%9h0!tm$ z#EGGX=vSPBdfYP#RFjRyN~}NX8mr2c7+4SoD#P>$2bUXXhp76Kw+PkdWYB7CR5#vk zwzXLK=~ae;Ndb>T*+T-`%NPMi%Qq{({(x!pL;mA;j2`I&P8ZwAe~Kzpt3(x`y1&;@vGa82C?B|DWWd>$<^VxI0@=b?{bxE}PzI{xNdP?vXJ0#O9{9Y3 zjPyoa>w*tH7xHb#(lpol0a+O*D+qu@In>xw?P!~0ME?S8=LI=gzX3HeNe?eMAkeNe z!RYDKvky%!G#%7xO4L$pv%I=_ask3@g(?6>SEgcbs7NNi?% zZ#)DLSn*0PkNnhXwN;Xk_LSN<-`>m&yYTlDX6tI9=)YPzHu$(3LaK10EHd+&E)1!txi&4<^j}YJ9W@sjwFmvy^xnvyMuiAz&cvvtbc?b8u-AQ;5?#09f*g5TI&* zue+!zgD1GOH?;$|oj%*f9Gm-IGm(7R!-SU(u|>&)2#5osc^I4cApulzYRTZ{)I7?M z{)06QLk zbl^d)sI^xXCaA05j2EV!ty7+yIKii$@>3V57?BMW_h_es+A6~-woQMg(wX{qy>0vJ zi7@O(d#mF=nfZgb?7tMKDmAR93s)9 zkPn;s;HH&yv?5wc$TcWIQnMXI?QmM_{?%2H5WT3bTDzA!kzKIU;0h`yST7}LPmykp zjX!sFNmJ~g*zmxnAfd#^06{>$zlw$p1~2{=IxFkn3L$HElh;u2zFncoIciTPF|r9g zNu-Y8a^L-I7?QO3+U9-z=#epOtcwngl;M%EUzMbroX~K>tP4Iukdyssk$YcCp4P`4 zRYHuF0vz@BLu3PnQ#F_NbOjk0v7UBOQx*-&5Q`#=--sGdFb^CrpS^)yt%W6`Va%*C zZbInDEY1t+LS^D$?RscGYxJwjP*(c?k_3J^O2B5L#Y21y){SB;dY#!4TY~I1NY5Qx z{LKE!eP@FO7ckdk9&sM-8*Y*@VevRWEH)q8?|-)?R8xFAW_D_zP41uzZm6%tuWUlx1#-eN* zxL`)5yC{Fl+4Y@m*tyCe_-r?kjBEtHF%h0mj+y0b*2;q}63~|*X)~poKSM#n`rv=^ zLO!0Pu2Oe0pZV8q3dCac83cvnKohkM4O(_nPp%d;o8ix~xCg#KwR9VUQ!c2}z)w_e zMKdu_A}&Nr7n?PaX2}BEM&L4>y7Mp4G`Lat+jQ^uopiw#Dh%4H|EYsxK=5L8J{Nb$ zn+~Q8(oHc=3dg6K?ch6_ z`9Bz0`1Vx=z^I*tF325DHrjqkO3ygDpOhHApsm>IZ6oLk=I?Q?$!-)KTOYc$R!AlC znkh2~%-5?=B9cE3QP;$c|46VpgutzkBw|rw-b3|zS1MWkX%b3*b3ZGE{;DVC%ZlUQ zW<`Uvq$a&QwU0M`;YAl+d}qmNQlO$LZFm3^)DQ8>J~Ejq=C-0^$Ziq&kzdHG;7Pm= zJrq9-9Q4{aVO{+wrA5&Z=nC;1Yh>tu_ZaO|z2TCyPeNmNXRxqtk7IH0AP#hKqFrXd z9y2#;A)i5q0+;qi_{%qxeA#GztWalo_QdbMe{CZap;i zcM96sM&>j5H>IgePpz@6s=6M`G$~C^K-+fCsNVl71+vy7_6R~ElZLqq0gl&$7<5N& zBxxSpIYe~CiZ7Va?F;1LSyk01v0#J2$YW-0&#DUlomM~>lI9b2ppTKfgnq7^F z;!nwIX3lF6b%G}#mUnBGT;ZkKIhmtPNu#(6p*lh=CKI#@c0-s+a(I2(jAV}ax!(ji z15TWUUOKjitnzQDW%-FG9VMx6-|Obr3dX*ky1TlSv|)WB+5m(a0ou|p8%+DWj3Jh#y$Q*mw2W2yMI0fp=ktqn zQnfA;b9_B|e1Hq|A9-gI&NsW_qlwt}^^j_j?~8ae>FU3DZ`gHGLng+*1=&!)6lXF9WH|Bt4tV2Z14 zmMre>?ktY?uGvHPy*C(j?J5#OW<*hUM^+>wDZE{ne;Z>ZZFuFR*X(BM$NJzaR9jZ-Vw9wg z<~gTLVWy|BxKWN&#AD8Dz^ZSf5@ctaOWF8v=`2ib7C8A}*ZB!BRJ;((Oh@L9((PuY zck##}xERBx6)}M!Wu0l}Q77xn$3*y8K#b3Qjz%2E3NQpRe3Or+A!b=^oh1%pvJ|qx z@0~K@&4fph;L|F-FG|~^a4-tVVOCK(XB#tUq&bbTg2&c3I2*(EStGJ?gL(>2xkAXHf1R9(nhe=}VHBlSG+?qabsD&~h?c)#lGe)0WY~J#kcXONH#n7@8P#7`{R({! z_jEi~8@?rs@oQVQy;$sl#Q>4JsqOj_=_G-vi359rzpEFOO5S#sYyR*fNvZdDv+-UjAHDi~0*r#>?@g@@ zspp24!AT;-@7V&h1 zlfW|WcI6ls01-%`S|FllIaLW8-RnJNt=+r%5dM7?2oZE&IGqnym9d+f3DGQ0(1M2E`p}JfDTw+db(TWI?wATGdhWGk6aIX5g}-xW}I8)Ys70$4jI}4p7x_MAzYjt zBxCE@I^Q_g5^fTVhs-9Oezc7w?ma_;2(PohuLVmiYtZw!9H`T?ElJ_CqF>iY(nBys zY8y^CdvT$9c10)iQ=NjDs@cy6^%tG$ zv?*>%1}^xAKd>1xD1#03PQtuO|BY$Z+qDs@6xXjv^jx;JHN zv8_+D^e{EMqz{F1@0|jBcX4NvCNn)n4;8ypWQ&6gQfSzJ_dR;$SCe&*J+BLC^&c~w z2-&t%x~7Wni4*5_Fg1bIeZT8YallX-P}Yxq!h(X9G!N}0FWLtV%v-4O^m1!yK=tX0 zW#Tr5C07)Ll4}77!l3%T+D!Z3PS;6A~|ig%NaRbYo{E-9jOQ2 zIr)1%6Bf(S)MC}D`%{8V;nDX7cMMEiLk?jm(rUOWCbE}*fVayIMQIj1VK1dexU*no zJ(Do{a-IiO1H`<6w&z#UYKDJxa`;|)7OZO6R3VGzK(x_g?r-@`x{&2PUW2~0(u3wVaQ~3Em0A&% zU*rO_tK&yE%J8M^1Npw5wk3%DR_c!>t$#Qm++l2jFX|Wkc)l~#F;1NtlA`4Ac&UQs zBqHyAK}9!vPwvLraJv6=@GaP|ul&^vna-b(=TPG#1ySt-IYx|#%6lzQt!9^!7@$Rs z`}uv7UdTe!&EojyKWkvBZEo3opTalci3uO`LN0XiV&Sy#yCtIidG1PkSKwzRrx#wGQIOE9?`D-YOm(%0sC=H4bh80io(t7qN=nu;8`lJo6>Pa6h96+GY6EAn z5m2a7c@isW#_v~OlRAmfDwDT`y-=s$10>oIUO=Ju0L`#(@_KstZLz*~HWS?DmkXw_ zTh;vPy2Ow^M~FSO8gYW3iSKFzH=nc6@?(f1?&_$RMV>{@SSr+n45`KK#RB5Pqejhs zmtVR^+clNx02lAyNh-m~uHEx8*J8ons#7&cP1RWId$p)U=?g%t(z+30-kP|V(H4bb zJI-oY{5mh{1+Y3p*zJ}one0th1?cnNf{@RfoBlIF$`nBY+G#DDy-uvnQm$%Dq48I@ z>!sG%0AitR@NCFcigUNPVZdey=mZfM^2m4CI&IRFK4w;M*?COAWHmnUTUnYinVo>W zq>jPmcT*j*!5{-LAY$hp^QYSL`Y&$g6DX3N^shrNQpHQ_?DtFVe+5d#YYrDL37T(H z09@HRy~4Y^65Wv-K|)r$X^fGtXGyDZ%R~v6ER=@$BW(hW$R@q0VH0qByVw}F54KwI zA%ir@MSEvD8c$< zq`2!+SDC=M@zKC^zm>sX78D^HGBNxqT4HByqs?I@6$@Dltx3b~qI3H}kruxi(45iQ z;2N0Qx$7j~MMNJv2M_j*fl4n%8ASm~ro@C3BY+8@RiAO{IO8BL{tp~GLC+PV2PUMR zH*5C(%;rMAPEPRhRlwnokG+K7b8ooaUF}$bFlE}=PhFVjM8STO_?Y-^dDo6XPxU;1 zqK$HiZ!px@>)Cl|XEhho0?LEO%MH8xOi~()CR5q*&oo-?;PVPEe+%)#KSt3VLKK3h z34(6z&-ovkl)SQ29Tq~M@8oTi)p6K_v;~HXfyjdsJQ;C7n(&3C$a+r=)@I`e(6t*m zyF6X;!52dLh9TqwMz^{NW4E}>{PEAO?1_KAG>wwcl?PDHfk5V_n}q4e-aohx=5Zl_;fE7f+D|SAJLsfAUe-7Yfs2EYympd(}82?zNCcsDq?}_|?ob*lH)XXHQL+F!Kz>3K( zsWGHW@Uhk~t50j700W3U2OSZ8wuh#vhp_o26}+%h?i z;=t-d$UDDz=AzZEIfOg<;la>=iH_eYeGWp_u6dn%NT`M47Oh(+oyD?(mj~w*h`(f2 z<^ig)2mMBAVr6(*Ka*V{vlcMjj#zBUrse0H3HQ~$3)Y!qqK66c%j<=TaqG|zwuk#3 zL>jk6Wqs_7BH@r9*qMfwY!$ix`i^V4BCzV`(=YXlZqDyvghy~eYL7knj9n)H)LC$g zDm>rbM?HP|U*pKma89^At8Cs15|z$`?H}JlqfTHu+dIM|?-=pEXEt%b>l?gP!xwITcJdW6m za$}avmGSD=jz5dNsTfpc^i~;{7l~!L`4qZ+*7IIQh_!|1C;+mrbLJ1*iiH|_gvVC>);1i`9mOjg{3fF)NI`j_|M`0Ih9#~v;l5q6 zaC}LQ+Z5n|szsyTFB6NIsxHrDtO++NfX zXR|gn-}~(~6+`a@R~W;8&M*=t#GWraaXcO0Z1yI6;3+Iq5?Z8jljlMO)^6y1j}W41 z*A#&aI86HTwq-B!FP=^o{N$f;z4kOEh|aAJh>Wr2EW^r2iiYSJCfdu|Dy%ZGJKHM8 zzb|fUjXl*#EVW{HbRDC7U@^;)t^aFrM{7+hIQrr|W^R2D`gJcQYl$ui*?3bL(5%U0TS$m5!*2t;SEY$M2M*U15;!X0v zO3u)&u(Fzsq_^Z`!P?!mmI?4v^@ z+p;8{hVl9hRd(BXMP?UIU-9UBsBr?J73Mexse=}|IK8}PH5<1xDNc(9D8m9xZDvI% z!6-;=kchkq0!)KQ7h3mf&DKmB}b`p#^_!J~x64-46Stc0S`A0&SJUF}6L zvpKSnltR>KYsBA-Wv8ni;NJag0p;`UxGQSTv%<%lFz)_a@$9@fA|1^oDGu8j%-Dx? zsY<>qZ_~vP(YhCV;j-3Ob-uf3H+%=JbF~lH6D6hG(LydU_u+6fj7Xg-e!oWlZqA9l z^DX_1KbMAPA^UFdhQe(Zi zStb@&433A@C?Ef1g4yx{`{jD4axo&1r41C4Z>P5MQ@@7(s!-p~;IFST&i{JaHscVu z$J_qzJ){cr$E5zNGcNCS#(~_?6C~>Ns!CMM;FBoTm1Ae2St69);P{wuia$JiJzrSS z!0zF02tikfMW0L!(e;{prU+Pr|M0KKw6o+9|K~qJ@Ez_s5u$GC;N0UFZLvTRg}Rtz zdg7lw1sCckshPNktUI9Y%VF2bEAJKNMWQcYdHG4`5Ap%`NS+5!v6{lgq`{1N7MbkM zIShY1cjdnFYwO=lAUkcUffqh)$)q05H4B0mjlB*Pd-?p8$Oo1nP$rSFMb9t@%S)Oe zzYX%s*3bD*y(C}F;cZ%mV)ptJ|5DMPDB&kZ$o7!0KAC00657MeIZvSj=!jS)^dPB@ z{I{V)Si(xQo_5;89@^Tg)2cSz*!kZO6br`y<*(LPPjFqtNI};pC-|N{J1ZYEe*W0W zh{1sf$+8R&Y`~7g?5^Z2=cfw^r|nv3YH_evGGOPzf+yjq8VVFqu?r^dY)keCVdto@ zc8=O5DBDW_DR^aRwpJVNl;rI)_kzcu`Q>b!lv>Mj#+Way48g(j^I%d8njspy{&Zg7 z$*^JWKMxCk4B8D%wy&Mb&Uv3l3hz=bKm7cpJ@PvqbxhsKe-Vm$Fn_2killeQE)Y*% zNnD0v-^6>liR}@mH}l3}-{?2$7SS`*K9nN!|Mr->1MreH2|4h*V*y?pg-mAO>;K1J z3&1ULrZmdc9#UqOcYPbYYu!(sCg|>S!c`Od7gr1-?!;>GW?e+n!|mQ$w)`)Ml1>4V ztlNK59=U?^uD2LKdj>iAqFFcH)9D@W_c%!=EuVyz|Ju`?*UHH$bV62M$qKlY=j`(} zs+a-EYRAJeT5@_O-SaW^>>RYFyn6xlyE&OR=kEW$m$jqFU}Td^=D?%*B%$(^EA~sz z$1l6si5o-B|_7MkJlD{a;9E9{Puda!ayL%-tHEmnw1Ue>vpo~ zpa&19rQv?`8T(JC9kW&+Sd0?=O_2N?0<56y@-!RO%pCA1`24(A1=D?KJ3l(7@70D4 z$+_u`@+sC)G9+Zp!SAx+^tce`;04d+tc567TSYhxXj@#7P47*?X(wz3FApUF`Ag9z zOwnsdau_VxseVm3lFFfDk35?^GLH3!*TsU8mQ=_CqX#;Oa~OhcXpuaP7A04`k;g{f z??W%NcTcIUSl3v8L0V6nC8Z*FOJz%6_}GCQG@kH?DaC;#1BJwOuYc?8BD;wbs+vo?*t9NskaQ?g&P=S~Q%!VGS5oo|#v zcC;0(o#cVDwHzwfsL`8D`B_qZndtE1Qu?2wB~7dRH-m2q*jV?{#5VakHAB2PCqDm( zfw)ez?fwyS#|k94dXS%`FCHwFRka5~0w$dke$OWVNkg>~Z-1end2X4%g2+cLG=nQ1 zqQj8!vAAs|A<+d*F@vbXF}caFVCv>Z`&qKdaRFFKAG{w0B&y=Tutd+?yLj@~-0_&p z#4TucB>g>?GnGMxQmPg!R6C##g#JUNjdmK%V5zjNTuAV@0QsAZ#rX+XmqCt^ar9Dc zV&$fXj+F|`kFD%)3J}y37Z|M=$E*9Vhh3p2j>eGRmVzG8*+%cW{7?NKga9MU83@HC zIACWYCD`Zb=XEbl3fF!*__TN|zsk&XVRyc{)Y??l^#cMVt#IcI`BRs>PX*Jad&k$D z{72w-9kEoCEUys7eu&Tx50wZUgpfLHrHP!PqEM{m`J*csJV>1SeAo`Q-ofr@^v9PM z-%wK-Zpu&Hg7Kz?Zfmf!poF0c&v$ak={w~2JJKxcCY$h(HM!Wc0Uk=0+s(oHpz3d} zf{hWiE5bCN6Y(5XT-*kst`-;Ot?0i+ZKiYoG09nw zU}_`#4~HvRjK#^d^Zwo0ZBIYwE$&b0M;OkCX?in&fx|;SW%zNFzp=icjCrZ9upeOX z2Ab~gurxPkI>3K%y9uRRa#rjcbB5;Cqh(H9 zjPwSF&kK=|HX&?#cdM#aUVdV+l*anHb~K`r{eH(+PaM}eAEJSY=oB$gd6UlQhXwl* zH8$qc<1sm|x$eWP207@g)<0*4?9stuB>-Pw!S+V-{NeR4W(%JtYhBbnqVUIYpQh};4{sh(&F0eW`g^^ixeSbh@(lc;C#U2Giw z+>QciQ_G~qv~}z&kC*ytzLo8SGg>ISxCB@dhNsq3++)gl9+rz-1ok4s+2?f{a>iG? zZ^*IiT8n$Y2Zn1D0~`Tl*Z|VAJFYO&y)v~Fgh5tp?xw?%CTRK&92>xZeeY$*+JCrg z>1h4h!H?sYrJ)hfc%Gk`o%4ms#OVaTcMJ(*UQKeZ*inC92g%r~$&`xo#(4VogNy#D zaQHXHY~B`9OV`S&nTRKR|)*p(4Q?`)b6zZBzKjyv1GyQ0?Di^OZqAu7M}` zYl)`onH$2M%84X&|MF%|d%K5klmgk2aPD%SOP@i&HSO(p-tTTFgwfL5X|ng_B(>OF zPn6z&M3%Ry_>|Utuw&v0vl}ZnLO1f1CrEI%DRMf^Tgs= zUJFu87mKVu4i8umyU#q{j0*q4bFk{HqG5f_MLD%h?)cA7!)}6#2e5DOeht!OygR-D;nx38Cnx9M|8BnEbFT7z5WYZ-Lku)xM}u8|2-#qSn|M(E zP_WZ|OSTa*<{l(b01pf_0=b!gJ42BCOP*e4jYzx#u*D1JcPAD{<1ka2OIxFV3&~KD zq~tJV99TK$AIy7W8TBesGWtHr6xc0H_lfbI;i=)c73XW6AhdafW1CzMiw5DrTEyKOavXnijlzCSz8UxXJ|gXjmf3niyTEDY91m9Sr@Bcb^4Po*5^Hw# zoq4rG##?STOjDV_)P($>2^2r+HXEs+$G z!HDDm|4Ga9A4d-xWCr@~#p}|BoGr`#h<6@U2+RcEYIQP|0TS)x6H;X^{-(yy*nK@0 zn`K!32mLBVDv9+x_!ZM`&{OAgQpDd3&QudOg69WTs8fD*ja>U*i(kL=q`PUDBR0IY z`TpqrSV1}1E@{WjHZbh}w>P$Q!IIqjp&!Wc+>rIXs?y*SWYwD;P3prQnOzoR@-!7f zPg4w7?kSGfKI+UH4H7;@vy|GlFiN{u28Z%>YJnzOZ@`bj=caL zf=6mI$}eL2DXwo?z84{~|1~{$&oeznf>>$-E_|=jtQ?RoZvTSVaj z_Kkf^N-K0{03L;Bx9S5UhfG)bhud~`BaUs0XYxZwtAZNhh06g>p3u9ycfxRfKm}EW9P=gAb+-C~c_r1peIS=Ks`3g8s69fP0{- zI|@4Ag#LVfr=p(>zXD~evc;2@K*K@^H#@?y{t>MdjgK%Gx44EJ;=nv>=*1a6CXIT% zu>5v$!XilcgJXWC%PaLIU2!5Cxgx_iI~TH5 zZ=y3~=~egHv>(ep)3ldAK=YfDe_i-Uw$7UHa0uF#>XXTwge|YT+?`i$2B2JaUEpap zv;{V0?qY*x@~iv=C$kZJM^6_ev%9XZ<@tAyyr1m?CQTJ%21uG!=4`3(S-ZC~cD&Sj zETv}s`{Y#)=_TvkeNQt_9dWFHDd70k2uK{fmi>{nF_c!)GDqY@e-h^c?cO8d%Xo5L zFLp(!UW0Kfd4Jm@OHZ&0NnQ zd}Niz?;|M%@OY*(u*<$|PhcZtOFstFffz3n3{m95UZrAMzt$t{#xqb)b^V;zn^E{Y>XTu2gWUDewNcJNC z-f`Yc+sm75@2~M~IareDI@mI|zu>v0W;b!b{DLXsSOreT&dEV{eAPD)_h;&#bMBpp zXn3Duvc3vwo2m_SQt7_Q#MsdIQ;!q^mTGO^%%)u?6o(O1t69*HR-knNGQ}%TH)S9{ zxQjihy{;?mY%B}_VP6vpG`{L|O!TdjWd6;G&1NzcW3?4CS(`MgyFdJAc>4fCLn@#J z7pdn(G<_HTx~GG^K~A4%+tk3Y&CbWeBd+p-2Oo$pVP-X@_DqUw|@Wm(oCPUP!hloYqpfYt2Y!5&iP7 zSo(v-LC>f_S*`5c$W$6V=p8l9heg%nA0OapvFDz3|@ zk=glK_u`wsDCE2?Tv1N?x!}94rbXaKL+WZ+bp0+tviH$c3dQ#2R8Z$_jK8eAqB_+~ zVgn)!5>j3RmGTpEgJe!Hdk;A2nxxb1nTuIb0wwcW*t?LCB)A{W^4YRaZ<2aAPV0zd z=bT=97Xwv7cwfQa#0>b!hCE>QK8eR9C|A^KKdE3PDk;F3rPaiVR?X*b#jRrQt^n{E z-f=cjIYaQf4|6HoZs`3sM!WWjZzpH|lUjoPxpDOxEC7*>;mWUI_!;dJw7S`h)e>7# z5|*D+iV2y)REP+A&$??sWY=DvUNCkbRHU7Mp8SYXoX z_taMvZEPS#pXa3S&$#WB;&FtGy2JQ_)jzdLNJzJcsFmDsMW{*ou7s+m>>Z|2?z9-TATQY*g z_vvxuU}5;YV3u zkqI5VvV{f`BQd!EPx3qk$%c>bLtX6K?p~!a)PW<=qylu0QrlmT+N_6M;kMGZ%n6 zw(+a$Y54KSw3D0=keT1bMdYlgMeLbQ^7pr&HEA zj%Qry<3x#)Rn&{S()(rHBT}@yAI zCc9s8cKIeYQ=v8dZpCU-MQ60Iuu$FYmCoTe4Fa^*Bmx?HiZcmR);%giN?nC8F>TfW zzRC9$3ctTf#K4)FUo6G)q->fzGRCOFNRtyb8m>Asa7YXHj$y$s()}ndKbR$GqwOAr za7qsNp)KXgx7F&SbX<$%FBU*+P{_dT-2U-Y&=!zwW>X6K5%cR#WZE4&p_|R?)n6Y9 zZn@9n!$r5PDl$(eeo%K+9J)O9-c3ONCjma|{Ffh~VlB3IJ=t{(iMwY}H9d#UbO|!_ zKPhLVlgs)M)=u|x(K}y#LOhg0ZV2dDxCpyjxG0e9op&rMBfx>)NVut1g#xbrS|58g zF4rDajSbzF`-FsLe-=A;>FS|tWZ16SZ##C$NPJ`kHGP~PD8o}3xBzsyVPqLJGz^cE zT6q`ZRRF-0Ak39bmexBeNmuCN78(rceGv6ekN*Goaz^EW6x5Z$%(hbOyIiQe54;ET zg6pdD$roOmfzs>;sf(->%;QYXRaehC5UPE&lX>``Zi?j3CA|B)lb?%7zRoOJ3}UZ_ zgi(Dtbh9Zv3%b^8C^mjd4(hPCtPvpJM&*s^ptGrw!^8J>Hs+N=4EcCD$GSE!uLlmv z#}#5EvjO^{%wFMUTlWHV%u!)Cks`TuGdCo$!tYpaY^c?Vhgxi@0S-*Jb*rCj5YWMU z)SI~noH41=MOh8sKZzxP5kU2;IJfv#1(nX^@B7$8MSjNfmKi$rTFNsJhpeVO-;$)Z z^UG*i43G4L=Wz!{;~z{JU@2BA?aQzXlCf|;NHQQO`t|X+RAMqo*ohB1)Y?P)rs7Y~ zuYY*7_x(Q0iu)YHK}iYp@>7g5>)Y=hs4EgH3fKkuhw0lHc1hWPH_qkS-i~|)^ z|3va~F0(5-j9jG50>{dQ_p^erI2QpD8WhH*;Zv}@>G;y+0eCfFCbh@lIu{(I+@0-z z7Ck1ZDbyK(4JL+fK+$fPa229Kz67%tFH#JWyK8ri+Kc|g#mf($VZf?Y3GXWShi}gR z;hV5aIB7o)v7(uCo)4jZC!LuhbXCvY@aAJ@8cKOx_& zLw?Y!n_8vwhWAa9%@H1rN2j%|R;$Nxi*aEMQTrk!Ky&++8J0bFz{CW{ww!Km+5JMX zr}j6}7glj-cc$1M-*MkIY4sLpmj2V%!y_+fb?SgWmjy)Z-2ic;yR%+7q`%Fi;pQrH zYA_e~?vxC%zv%;8=Slhl#1!1v3tW$LAD^p2Rv;a#HfRnw3{>kR0pG&E)~E%&&LkNA z^p69PhG?d2>f6OF2`!>c+?7~0i&MLpmKH=XRe$w1J#yHWWC5^P@hP);x+Cf zfM)b7G*kKEoc>cWxo3y~XkA3Wzj{_<+qcY%2l53W{d8CVx)-v6S}x8@nDzxP&~E5s zk+bEIY-N&g?8E-a05gCK2)K}r3RKPc8?CU4T5d5$jn%zi#_5$j9JVBMtta*?5)h_4 za1G$^r&N*qQBA#Wm}T3GXia=$DcNt57n@H}@;+zztbzH7n;|WfNdH%J5>xO}V)tTsnCdZB$VqzMG5MqSc_6j0o(crH?JAoy-f#+eg<_)CyuY2; zV4Ooz(#M5`*(3|TXMg?Qf8>C6UHM^`V zt8}>fK>k0ybS*;@Y*IV@fwn(?_gZ!GLT@gMw`kaF=aI*at3$qAUNlQ?1j{F(R9*vO z$JzB&tq=!Vaev}i+p>Jit7|``)!V>yJD4%;r_WG+y)Ls$eLbRj$g>)YbSDmqKRG$U zU+a5GCM|s>le;`){Z}6-Bm)M?ep&9|X*z@{gS@5E8XL@;DlGfZe) z3~}>qw=M)rW>fP&6=?lQHQ|1voI06RcL6zz1Q~s82RR(SQ$}GFEaBze>Hb{8lZkX>A zMGd0x#RemeDfxSf;e{%QbKir1cf(0d))nH}^~JkrKgN#aTP8=5okdh1m22Npjf zfjWK-Jd%{<$0^|##(TL`yZ(QDDu;cIJzwO3vv)JA1pIM*aNlbHNhp!r zPfZX1p)T$A4S~4w5>9%iHi+oC+*ZEwv&SaTCMBhK+TtGFUe=p#Jss z_m22jLmQL^=uw+%2mku{BmKjAb*U>jpMWOLc;5r z)*k)%S%Ngk>P$i$YUJ`I4&SrB_kw$x6Yc||6eVTCmk9?t`!eCl2x!;$d<*w4--d>S zhkHV2wkk{qhov}Eb^=Tvy3qLy45u$e$+`hY5S|j%{oA*uwqo8*q16_Jpb#( zS?NBzD!N>gusQFgofw%OOy36Fuci@LEA7Qg>&s<|S2dpIQ?RIdM*Q{Vj1-6d)frfO zM;3OmFXezRmBsmtVe3NsO z7qBRUQ;NF@LfxT1_m`5gJvaqH`pzOSTJuJh0~~_c@;actrd{V7!yQH}86@ zRok~IpSn!mPo%w-M{59SG;VT$9Y4mXkQ~tB6)-!iT5Mj;J|WoIx+dNPH}4oxy<~xs zO5^j0au=hjvMTSw5P)imRz^ft_BR1;#DKE*zq$3Tebdd_j-15om9xr9GE9}3>W``0 zH}WFCOj7Ojlj+E6Y9eUf;qwtpF^((853~!J0ZwHdezCk9v>xU~To-rl&@lmro3Tq> zYrRcn$eCrqud^OmY+!X;w@0pMJVO4wz(#G6Mz!sY{mJPvxY}Q%57<}td6NK)qQroE4tgg zupDQ~%dg;B7ix=o=?kFYSvuymBqNy(JV5?lR((CBlny}^yGEZ#;qYoGJhK#P*K9CcFJZfqbR|*esX^)4N$F{NT z@8@vG#I2+L#c?Gy>%QirydTz2VYAi!GKK63xTRh4a7NN?AbEDQ2kK%fXiu~G%t6Un zq|AdGOL0uPW;)uBJ2CC2O}Epllf-J4-UZaX2ZmqIxRYMAz?N$C?|9HRE5%8lHaKI} z>xVzt(GAqIuLuek#Og}nc-po@SGG;b4o5Q74ZO|JS`i1b)T{$Nvu1cu?Y{}Xl9%Np z<79J#@)|>@q4?xTcVy#kM?A*Kt8CM|IX|Q#tNijAIM|wD7|JoeeZd?YbT^$y7WTX9 zoC>~i83&3Z*Ilr1cJp@a>?*$dD6RTO2yHZ-t-ANarkPrK1LR*1jk_isCx7@*G^%Q4 zliXp^T$c~Zh|1w*uHx6^&sVe(F#g%hu|sR1T62A2A*dzdXE>LCn+sLL9xi)2lKM97 z;n+y4N2LgRT+@LRFbs2 zMcx8tY|WjL+qM~9=3Vbo!S1Rkmk@88g@Ajd^CfGgi-vK**RNO@MOrI7LR~^%e#n07 z6V-^@`(mo`y}z$=&NY}{yF#MgDjn|PgeOgzS3%`G)eIOMVv54fA#ijt>1xt?ENqx^ z=;2n@NeJ!B1RXC27}`S?}cv2kY3~DFRO(WqtsTM8~hRupl8^du*cA({^0p zLcGK}K_)<(ytqpJ2p399X|mE1QK5EdeeASp*)BiDZ@H?}NmW0ziE3r}VapH4Tq#C| z`-s-#$Sxu%e`V?1alTgIs566zp{XvjbdvBn6NHvG1*TR8&jz~;Xhm{0vck6T2&91v zdv@v+X|3h78kp#7uxtED<6z|4Ro z)#~(p*8Z)%(EQx5qm`^nRh?BPmam9**3Iyx;LppycTNh_`TN*e$a}wU=N-jTYl{Sf zP+l-FRVxhB^DEj|tNpQw_};VE3z)O<<(x&hGMPoU18yJpM7D_ez`g5H`h|Sd+0-*- zV3-kuL~8|A2svzN>Yg1^9(S3pvUX#Nd2+EqEu|^U_jsJg4JGIGB8*k^?%N1pGc|!- zhGy%n_jJ^PFY8(AH$IN6t3^_8R^8(ui>Xs^2&1n0htE64x>^M3}isk`XxzuXsU)T*$OSbsU4AK%k7&v9} zo>1m)Vsw=U1i_D}mgADBLkO3`ZBpo#fZ&l6l^2q!y1}TsQJ2$rn=kv-v~Hdk=Abip5rfR7UDUD7MV<^eEJv*=N8dK za71Gj&aEzTaReLV;ff%UVcPz==e`X3f4&k~a$a6G&!h-WozrdY%_+;^iD)j(6Jsh! zGKVl?=(3j_@`B+d4P1u_3PGb?A~gnO+<&-2DJ)U_dzZIOR2~_+lw&j)lyPvNvBS&> z!OCWC#P1`5ZE$5lSwo)Z49jDWuZNBAupC1rrC_GASL*gE7o_J8^4lBG*gIBlU0!}P zG?9FHy+yLFc|DdP80~EAMAOf+ti4O9JUB<1H=>Rm-?I$F;gT@6%i$uP(-Ba3j!!bj zsQi|u1y`swIun^fE7^uda+fPW%-8V9Zmd(rywDYK;BNv#!U@T%;mFYQrFhUlvq~Am zla@(H=Cad?>7Z6Onq}?Pij7|*ruWauu4qbHOPfqWA~k=BO0WPmK+3--HF-RXA;s-< zpoY@7?-6Wb1nZ6hzwQwqg0&jLYr|v#VxV-Vs3h`-z}l&)SE8R{y%&AF9Zmcu*_ixn zWtw=-#IwGSw_)|*X#5W`rMh>E+g}T#Nf4R|#I#&9H{8&Jy|^w_zSPdq_OO?o8U6lt z#I{J3508CIR`Ur7^|>3O)wMpYMB)squq)E3EVd9xYh!S2x&6TpGOrp_H*GreKG)fn z_%obr(yNK$EX)4M60-rQA|uqaev-ki9o@lm!&5rFzU7mjQlSb)eHLak#RV%DS8VGb zT0)dM`{s*^z9M(4Q{{)Dyy*)tRV3qD_)>mJ>}oSgHD1H}d4bZ?O%;6sP~%{`aYsGK zo*MWLE7c}g_jl|Yb$kl;W^+f20Owo#xmz!&C2pWSe@6HdUEJC z0c&x(ORxryr=RwQimf}@L1v4WGpvmA^C%J-BWX6CT$=SP!sVZXsN2~mgjcc-L%*5> zbLiqbte{a!mcql;LeF7XgW`&VcsUhf>|HjgY*pUSzU+1NgF>WkWrR&q3&g`-SF6;w z($jtT!tku3@^MqDv^AYGCmBpb&eV>&zDVw39kH{Sk#y(PS)p&i`|GmCF+H&zDNN&? zU_FvZ{Lmz%6Y41|+QYdMyg13sm0*=z} zK~zy1RH-q?{>AtDfID$j86H<$53SH`)&u30L$Fw}jO)w3B>tJ@f;Gmp#|4v{0X5+M z)gUbQ1L6`iwtHhV@rwks+i%_XJ$bvc!#r+pcWeRT^^h8{6mC8Xdtg|J zyZx18V1p=!!Sb(I#jgH?UDccd$Ftx{@-V?u$BT$bY`zDys=mBdmlm^^D58{NH-qkp{BneL~|j-K6j$am;HR$&5I?sd(9!iJ5FMzCOUKbz1C`f z+HNVZISw9t#qaYuVxRD8d}>Mr0@}+=O~ju zq9R+Jk$9Xj0;@3CODW|iR6iU{?<{=xChQcxUtn=#SXz=KmE|PG$Z!htQ@uGaPFqu3 zn(zNb+xGXHHc=Mm{7Zk=-(?49E1o^&JJIyuCoeG6*CyhzjlK8%WNiL=a}Jaz2d9jV zKt~UNGU*58^Ho_M=5<3Y{j1fg%jI0N{S=Vls^ocRGaB;}*e{;R>S=h{lqi;^iSm;a zS61CnqAu?o^L-CG#|Gby$WiO3MqSY#CYU7WB`Q^p0@35NNi5HsLjo+Cc{6Y5LKDDg z-8X1XlLVAK2l)GbPMkC@iC!m*$BXZA~w7I=*@n&gO<_qO*z z+ZuTwni22WW9t66l7@OTKHzJd2KjADdog+YjbV&5rQ``WAE&U7kJ2w<9l;RZWG9PA znzyJE=-OT1>r^Io<30w~x$%Z|txN9gE$ zJcJIB110^n(jzu)?q0kzSOERVj@x9%{qmd0e;H{JZtEQ~0R%Xb;#)@%NJ&YU6DY)1 zBQL^&oX|RiS=i58s>FL& z_I+<>+qTWgw%uggb+c`|X{yPZe4A{0vL@?hd#ZQ(e1GphaPB$x?6cRi)_xH2NPPOP z*vEkW;^NRfZs7`h_%%4Nd|A|dyx410HkmlSA=CT$Gv9IhM=h|C#EA4p;QDiZpMy|S z5U0Y6q(Mknbify|lknFAkg7#3fH<*s@lXOg!u+xTNYst&K}pWvf+8SzIH|zJhNLd+0l4cS$(Kg_e?kjhF-(p+X7u2dn6irB}*RDTAu3 z^x;-UL)nUU1_(R8W|n~3VBvgC*!JF4QS=KU-auhJ`qXgO<1*2sI>K*@?Cj}2ms~AK zi-O1YwNB8Og&FFgWst)l!b=$4iS}n{iJPz+(_h_}nvy|2g!Olgrc1Zo6*pe=4cLd{ilXuk@nQUbnI~s9Xl|mGSv0~otI_q*A2L8bNhzkpd zogk?PIN(6?0YK=Dr~UWjdKSi1w$pl2{#WQo_(;s+S%-7K2WfFX%ZD*Aq(1BhX^~~@TxKm9I80=InfSXMCaG8=e)bsf zBb|qJC_eVao$tw%q~NpEW2vZWxew{*m0k(AER`#_t5hk4^BkT-uh+6JBsO&GZYpZ` z^n<4x+|Pn$;S7d^xk#Y}zghn3wfs02nA6+hBJhG_B~_0k{p3?_asjXsd7Pfy@U!!$ zCZ{LG+ppovAj;34S)9HWHLeA!Fi=32x}?c8#i!ytQX`gEFrG<`mA;(x8g?fLfs&b? zEokrj`5Wzj^r9F~fV(ii-jWT5U@cNu zrvv}w#It*Bn@!${-46XPhj?EyL^EyiRrv=y$SRVw5IG^|`MR?1<7$tUp>x+DWz2%= zr(0Gc{To|B#em7jl-K+g^)^L$#i(l!cIR*KTbK9iuFJ$7R#(A&4@S0o6LvkIM+E3$ z{hd#ti?{iD+x2b7Dhq|3+5~^~W%dbD4-<_%Z#;5- z4~YxA*QjMZP691vA6RMt12Y+2rbkzh`j!Tfhi-#MQj^Q6wq zl@Du?6nq8dZ#(#E@dBH7g$*ElfBap+HK*6e!`VL5)U!kF%pcR7C>Q$X(&oSKE_CU# zD8|^At*wdG|8cch%cn}=`}cfzDK$fJ%R?!Q1N7sO9mt_sPyYOEa|>X`Kd}Y9c-HSeIssjHb!D*f z0-KrK5jD5sU)4;E*QF(RFneb6Z(>7RKuc(3)5p@}Ui{Zi2qZ|;D!&32m05-IG2;vx z9A|5~;r{)eSgL1?nHB1_530u){i_B6+t}+5v1JyaSz<%f zmMRz9wlC>$D>@9ee)zypxU_(S{v0dSOl2>xE^HJ2&{QdnJC_E4(64wf+HA{KVcW{y zN*$-K+HZ*6v*Ivok{zxCk?Xng(>t2z=EOY|a&v)tw+1GWV6Lf8Hnc!wbjC}U zF4izFG+P%oh+U-<_FWXTIbyK}uwgay@wC?fFz!ftws@-?Q>gteLXS_L2J^wtC`=2! z@t-Q()4&TX&-8O86!U9$9z;VH@kmUUJ(&Pl9({)ovF+)6zUmrc!jlJkJAGP{TRIr! zu$S23W-KBnBJRvQJ|u#Bm8%pqTy+mKtE}P&iwAu{sQ-M7ayxl<0hBj7zppn_m4RJx z&%iBA44HR31qShlHCz-W(Up`3Mn5<$A&wgW6d)7W7d+Xw&hM3RqJNm&&$3IhXkT?r zUoSn6veK@{(UO~H^gtb)W<(vg-}{>sHieAth5`|5+v~qofpGmI@v40S<=?F9uB)8>^Fw*)jk1$VeN1H-~E%Zk~#U%93D{5AsZPTlI6`&Jxd zau@o{vo+RcgWH-g4l+7db@?KY5W*VpcD5|F35rto{t9hh#yZp4?Omcm37h?T(yJ}K z`G#D0^#ADa`AwQILpis<55);c69=Dd`p&dmhGw#?TxJGqS8O1i_HAep3peY~A4k`u z!L^{UF&z3oE~{L_0~?BRV?TDbd2g?hcH`_5dZE{^~fvcvruW?Fr_vyiX^Uq`oBfNH=JY}x-gYom$X^?c%=)&1$3OQ}?}8Al`XrQuHkMRWrTiL#oICc>xYeGqJ_8daWmMwadv}eXMh>` zd;qZz3lwz>wb{%K0HdVpJ5le680PkY(@nTmL5ounDAnSpT|$hdH;CNcljCs?lJ4st zM^jf)n`?g;U*nBtZvjv?yk7KXU!T32`&SRPX?6TXTYSA7WD2U2XA!TOc0T2cw}2zv zg??GUSr8Q4;jW##ZSSt7XKzEp0`$#1)g}eA^lIPJR)}aJc;wes^zV0SCEH3OYOI1t zO*;`@v%>#+8^z4Kgee$_GvmsjvK&CBn)BUBr@xNe9#a*|o^bB-Xj^>(Gn|}UM4~i@ z!}pgyL@z&Ek9q!amBcsOz3sC>po3hniV4J}s)n@E!nf;Q7Noy3g81$Ka9pp!B|c6D zrO`nJv~uNB0;xW_8(l1pzck6Ym}|;~^m*Ng#e4gC5zD3+&m*Osqm*dT4why-P8*M) z!gs)4UmTizP}M2tK>a&G@DB=KwvyaG-$?Tr_PVfl)YxMMcw1m-=t;wSX_gSmT>n&m5g|b0(F8FJPCkSCn#fJ?SOU_Mwz9kz!(gN#!-o!m573ry8B1Mhx!AtMGWb z3F_hA+BnXXaudvcVd?I3(kS#|a7-wo6F|3J5}Pb~{m*YV-)zh9hSd53YH#$mT&|*X zWn2$+D3+Re&N(0UJ!#!!D8)ZbuN*vi46AU(0`oPV>07h+S3ZK(NYO*I1DzVy2-9q^ zFpd9thX}h{O?h? z`G_A1K37k}*Rcjd56$&lM-%jk5jtpHwg}SDd)W?La=Y#QZFMbOEistUI`?S-63Dj<_SKZB`{_;X(43yt6kbx1VA9M=Fslya~@oAaWo$ zA3kK580j|t5nCg*>jM%%DMx5v{Jd;;+p|;!be7g1Sv^JSMfuy6+`bb}C69BS@OYPi z9jT!2ls&7fk%LwGUU{;^2SIkvqpi`ZR>EQ1EX_Jq`_nMLcui~V4-0r0nBp{zLj=|t%{rO=W{&);@HDm z{VHuuwaPYyD%vgdMU3S?d~DLkw*kSps|i}wBibAR>aY08F~Fq3r=h;ZniyakQ^J)l zAFrK;HLcgxE1wlmqWGbJD=cTGyn?+hH~ai_yHO}ukfenE5e$M~YPBP70Z}M87F(I{ zct#Tt{RR)kf;eEI$J-tB!Wu#wL5b9uYq^6pr5^krk73nc9#@6(W&|?nsV09~8ZT@K zDq&tInXDNBw1}R<{B{#d^$)LwXbNI0F8d|#g)y}qHT~cNrSDMOr{$BvB59z)`|FEw z8vsjnXNT_0RV$_*rrCPPGolrJoN<0{mL$_*M{@^=K|^#irF&sle(@8?wTp&T4)_** z0PC?3_-;#WU*}Mv?M73{HvHJnbBYjm>nZUMe+?$B{k+={#gnyVn7{sEbWt5A9R<#% zBjl<6@q*J5Pe3jBUk(qm?$j1acZ3nC=r&O!GCW*41FHqV)5Prsy|m!+y8`VH0OP~! zmJ(;d%2<)(+)@t;}e`wC~!5W_pG zmB5a1*BQMT*Yi=E4FfpG$aX2LhxiyCJ00Fqk~aE}*GZ*)yDBsBK<2nY%m+b50VvWY zcr!QXt-u}QaG`CJY~cv~f7ek3A{+vNE8Y_@9NfUbyKdu9p!wa0L3{>hR;gseq4REY zF6>~iz=B=s6zOfz?5W6~*53z40#myoL1O>vS#3N)$k)52b6;@1e|r=QXRM)&F%|gz zeooW20AY}=!I*oK4VPY8`ZlixZ2=N}1QHHsd6@EY4tin`tP=63U)WP=H10Rb+P@q! z+{qQcSG=*wQH+?N5ULUPLvR?2I&lwVjf{Ny17IQc#0KL;;%wJNTSE~)|-#Kvh5P!f2r{iT_yyokcaX(BjRDR7CvP_JuuyQ?5VR>kx z5jsPmNSG1}Ku5BmJr&B7c91sAq}LG2Pe9kayq=}_{%5YInqdX~IKR-*ZAY7D#->i} ziRI+`N|n&fh4kYMe&|13mUOUv0HR^uPDA-xR9E$Z|Ko+@*2ERM9-M=LL6=;1vt%C< z4Pf>hkx4T_@JotIqN`cS*t5482Ld|(770IumvXTmWMLpL<)x7+eUPgL$t2Q zC9=$o#7EXbj#G1PH|2?LMC5X3!DQj8?Yr6`48r3tcN2&}<6>4w$RmcI0zM89zsYbD z{*{0VhWGJO>7z1>P=0x7eQ27jv3OEwc8kAvbXnFHhbO7G7272f3b|8OSo2^B#@_@L zGm+@n=3!}}=NjWjhb3x^Zqni^}B|Sp}Y67*xrHd zryW(390*c%{Pi{cT5)XVob+87S|eedO*?x4W~{0JJU0-s$!0daco0*k<{cQ!K4y#D zb!u$+t#m4G-KzQTeaC&-=JvDlD}LWkt6^VLVzta9MITo|ui9~=lG7ulWn0bxuYt+% zL*)PFjBXq<6CiSJ^VgXPI1wSD^1uH7msgl~Qz-_sLLgFppfH8}^U|uIj~4nt7kmSoMujrX?@sw|S~mB}5@iVayA60D z3@%A5d%)YDZ;y#MrHO|%v;FMm*RPb%4QLUFZBPtq$!F#;fZ7R1Zz z^8&KwV7!*=!o?Nj6?H?$w3ms#u*LDs1WShp-cY-%v4) z*HV#wM4!5wE#fY@Z&qW-W~2}ju*{%j;z$5GvpF-=Ew*ajv-QRO`k^l31Mi6TQ>O!F zhd9weq}^@d)z2*G0@=MzbzA#ysbGPqgaTIR9T2hb1!E(`Eu@w&_(WQw-5@mdami^A zV-5ce&ErO&EyNJ5qjJ!7APCw!LASIT!}1`-%H0*%x;h+H@OlBD8^G?dh>+V=p7RAU z+il4LP}In2&F!O^GoC7*v-4%PhQ*qRfrwOJ_y8a?)6B$Led;UWDxcl1 z(H%DE4C!$S1Tb0aY8_Kvr(TjuLv*K|oh0K=JuahaomRjP;0BlT@jweC6f;|H()foY z8B&4g0gF16ejxi>h%4K9t>+Zk!o1&=6!}kq8V3l%T3nw9JQ$|+ZFC1YqZ-jmhsgP7 zR&HW^itg`Bn*){14)V=xON%{kQg7m7x3u-D1?JgA%7+)%@kI2(5ukxPbG{#WaWFQ7 z5s95#D5~vO;C?iv>+mXmAPG;K!So>t0v z%W^&U%6~Q06)sxdb1@yTx(=TOKXo9U%oiOCboC=1YP0*%bM$21+b>h^zf&$da`^!3 zmja4clY{2{u`yy^@dTDOhY#x~5_|8@$!Xyq?`Mz4qyo_3V9`lN+L=l4dTqv}cigwQ z_68lpbeglNNPdE{jgngSYd^LJW>W~6ry4TN4S71$3g2yCw2UW=T_7tZNX}bz`Z0Da z5-KFMhhpMAqR5#LC+7XhK33yIFYC3Kom+ac6|(a5JyZ(MTmJJ&3X6#6dWO$_s2So= z>dx9`QCnCjk7m}%*7J0c_E>d3V|(mq4cVTho5RuQw>;)AGYu=AQ;-rVqDddUIx2+1 zOVT1g%?YM}*Uj`3_X;7V$ikR@wC9=AzGW=`3Aw`c)0zx-C1Z!?CBi?mLh3x5&btQx z)8B6o9Dd0``3Hhlm02^?jbHcUfTo7mzV>ijHb;Hy1k>jId%-p%w5Gc*k(WCfoUr6rpVIM$o9CSU;W zxrZT#TF_xp5glmYHSJJu-;#HDk3YxBlt_?p`bh0qTbh0J-ul4s&cVH!k~daDdeZ=5 z@ASB^sx^{n*PT^f%AT{F7+t&Dqp~H5g{2FBAGGm*|7#A~lKjvqpg)7zW*x$$U=^-Q z=}F;BoM!uX?Cv3O0cKk8*(iTnO;W-#)Gz*11YapV=HcD2srWf*WJ z?7Fd7;YOs@G}iV!(RAmFxN^hQ&W*Q`QR~h@+Qv!*4HJeD-r837$rFCadtFnBIj(6O z5If34mfAtO4QLXJSMCysC-Trx3-j9-<`&$bh&^2JXbQR(uxN#cZ&UoN<#Ip7dxs0_X6$&-;UmeLK!N6bDZ1_Kmv=mdWfn!b zeMklO<3{x@9A1uGRf53Z%*c3*!l-)7BQo`N6Wz~6y;5U{MOBotkrW8p5|_78H(twE zDbJcBLRx)*d=T6Kc*i7%pN0O%BvH5lX?{=?5kUsiQ8mQ6Q7&%-X`a)mp1dei!|J== zhDy#HdaKPl&}iI6JtponS{|rxaO9;@ygd2I3^aq~EQHH>L>JilkEW&&M z>dn%UCh_LdW>b!>f7LQrzSwXy(=t7$Yr*w-CWFDSP5+#2SZ-?stLF!5ZpQY+2CJ!! zE6o{+%@7M;yx}&DzARlVs&W&1LPn9r3=R>Z77rCsz?FHRNQk9xo=m~Gy8+I|dEu$Q zKV$$~JoMQ1cVF+KVBy+8MFet`NPGM*ReoFvMejv9m^p; zY;*xn8yf^9d18~uVek0M8bj(IOOc4{{tZ?7S&eg?od_KspjT~)xvMturOXbP4q;Bs zAY53!WoV{3nj?SG-_!SxpxHl=h=vP^zr<{TI~3 z5+%Yc_iTXxF%}JBb1^V49_D5ZqEXjo~KV_|hmoV6QrH@`>}@&KCsai6?ThX?zy zoNn^0t25sFl&xKhppz94b?Lh22(|e}+{|~dRSFi|$m|5ftLO74hr&i7)?ZPN+m=_uGPd{keczkY$@X7pzX(T@x^lHYGs^1$oWODP7#?tdr zG6IEch6?$BGgP7i%pMs_l1AVa#X!$2?eGh>q=qPX6`SX&1#-hReKAJj02p=)xrpg( zk;j~z1;2Ps<6@G0u|kjE4OQ=>#6-1Wdl6m00-2_0TKRo%8pWi~brw-D zwJ{MJ`X**e?2m;>^~S>I@9*8}pDzmfTUd`W-tm5w%&#(&-u zSx-`44U<_4FyttplmK%gyFKu{*PP|2}c>xX9|WEY%NRfg8V3#(#^l34%R{+4{* zNLa?7w=IjR`z^hKP69S?9ChFF`g(7R#Sc-~?PCIyz}3o*$iBd@)N?h{ezz1KzPLGs z(7hW5uX%NGJ2T2IUgh>cS2UMA$ke0hqmI6*tGuT0TS0yU(d5i)f%KJK5Kuq!Xz3`+ zLFPvMJD7F8P9E{Loxxd);->x(eDJVltDM~*ipUb(6Ro}OAZ4$yWneVX6(+b zFW$(@c&bUH?Cu_7K<((>hJeo3QnW45&=vM7nvk9Qf)E4`x>pe+l#YcXQc?^%UmnDD zL(+u*itB5|fj_CqhOXV~80Clpg*{bL++EK_{EwW<^PsO$rjUCnmGO>`m?q#amRE$z zIblJg+=yULsFyg`rOEY*{7z9q{)%Q2CSBa&A(5-;QMC`GB4-|N)z#C zZ9ngBPt3D8e{ha7VMy&+S@s@GTl`>?u_IIk>1hJgev{j`)p;1_F1ViEC$f;MJF(;hE2HCj zH3Oo<<|jXQfg;E4t%EfF7gP3jS&sMcNE^^~Hb0_m1c1Mjr8w6&XNzgf&TmDP+lT8F zKk9S2k__qMs4JROe|pg`3rrtBYVi?gE@0}2tsx_%%KMo5d|o|>)iWE2RaRr;Wc2K2 zcZ!mQ=XzV5vjt6I6(OY_PxuCJt--lUciYXA2_nu8a;dJp0U8(^h)qp|$<$^zWpFQX zOwpy*WAS6+|NJN>VLM#;JYc9#Y5dYBYB30Oh2N>T$##6hdDGg7jM2q~#_n?nLV&&} zqD)LQ)w493&-%Bi>{9%l1R0*ScMOM!D;W(mV3#zGA{A8P8$@<;lGrCs##_P8&0wPk zcIcx7sws=8T|#6|;=~uJrfAek(K^U}PV`Za52{9o#DdCV!GuFyTh;wjOTQjbOxB33 z{(Kqca5+L`@*& zeUa8`2|6B0a`p`njB`&OAFt>gQ`~8SnTL@0phjO0kWj>8?&t2I0>co8a!jNKr3WJF zLycwRATu_7k)+K3Pd8C8{8JVNPJ)@cuA~b9P~Hh-_L{^T7PM@L)b zc%U!-OYd>uk5+rUq)f^kZ6RDeC3N@o)3}YGB}QIH_Pyo`>dv>1h#A9sKccG6niN?tC$hE*3 zt0S%okY5RY)nc>0=+ew9h}a1uY>hfES!HI?ADn(&mHhv6;X3Zyg`3lln1Ii#cS9NT zsz3P4to;isPKkvMwdm>nq}~(TxqnF(F$x|}bO(F^s(ZjP{^uV?SJy`ANsenp@1d&$ zw+_x{P;gI;nqiOxRZXRhR0Z9WGTX!el`h+f$g~5brHjuLMHhRc$&WR>NCcDoqUpao zJT_$8`AYvg`rwyzSgezb{c{e_p#*vQ)-bn1rfDTZ2lX;(IQ)=!I0hb@Z(V?rRtG+B z&Gg0=rm)X!3d2=gkOF~}Y#Wv%tpHMzU18BON;)>){fer$ak-$JLtFX>|7GnMbG8WJ z9KSQZ|F@Jb$s(6E3qK|dZO)n!vlcO+8=bEN1;K!k3K?Dsugz1Pr^>1R)IT{yHP>AS z{=xh3FMy`*WBBKjWb^6u85VRp@_nPMWHgUg4Ygjg|`Mb^b0Wr(SVw8gVb1YUBS(UxUT zc!|Dl?~%b|EO_}t+*P;V`&VyVd-)>^CbEdvgD|CJU)cM^CLJb>)aJ{dFV_qQn>DAn z%bH~In%4u6?^m#IXIed1$lKl=;Gtq*1P*dt!{R)f%%$27D-uAK&j#f=aW30cwRO5PAqs_3KjCr+95 z!`%w9Ou&QeO3hQd4LHI~--r&ngPX#K>1aF~Y7M$>u)Wx0V%jVP^MEOLvA@gqpvMIa z-fS6>;@&+B^l{XYgvYQdKVRj)A>56gn9#wjtI;p`7Sy@HZrR>}&+{7;dwr9$u7Gv# z?#R6rGGzQek$3k^}vbr8_O7A;_j$BV>eFD2utk zT8(|tgS{46$BeT8l17fGdLJ}c-m+q<$#5}l2&YVw^V0xgquen-U^@{SHk3ZN) zDEO4#?W=Nwm5@v}IV}7Z{{nnz(>=JxYPc2K)nbN2F2ULZR1ygqR{YjcCsr?;%l&u( z7C*GRfyn4<4)Aa9d-#T9DQlLfoG?~4tKZjbj+JPjhNwN!C1N$rwy{vxaXS{X=%6P_Q!l)f_kDo~i)m?q5ULjAGU8 zq8iMfLXX3!|MR;P7(z63dRM-gdd3$-f=NQea-u8wxYI0%H`dU$H{mL*TmI{L6=|o zj+BNI!X_=qn4QT6jBLV>-sqd_w>TwjxMqu4#Ptl?j@WQ#sev2HHRS=FstC3v;EJb-%81$aOVCe-*jX!Ve* zQ!A*uxLE0ZrJ2NVJf7k{_zmZnn^;-Cm^fPKkCJfD52_7726Y*{+LJRE40Ww*aWt0-Si!nr2o+-&K*aFbs! z@+77-@OgiFz$!PKecqiWW9H^$_+|c?RiYeZX8gi7VP7KIxQL7<*SDB`jV9zCSm4Uo za`3M{L$$ZUDk+&p3r6uv9l}Vx5TnF%iT=WdHoO8#gfH3L0RG$v?w7q$CpBBjU*{irHy>Z?%1RS67?-^1W^O6CiF|7tBKkIr+WK}Usblflo!C7P z+dKTVVk9R)G;!bZ^%MUo(thWImcOP97ZqM5N#T6wIEqK6GL^vNQa+K0vutS{q1BmW z*E;IG`1E6wv9nj~=cz=~aXr-DAW-w*KEue;7jhq3&XHBCPP>qkH$&fH%XPnM_yDCR zl~T;;Vp`{tU3#5BYECQu;aN#|0*F?g8?Q~WkIQjwO?l&L?_mpF4RI&rcBr%o z`cs^14N+GHj6qtzu1b)EkIuF|H?2>MP(O9De31-o;lr9?*{Sh{MGg?xX zj8NGIf#8dYEt#8B$S5vc8VXD;@^wM2Y%`&c?+=a!@IhD3gjvV>&E5iSxbS*~!O|1P zmg^hsO)-s;P8KBo?B^bY99F} zwu!(pC?>OdDgmp!VwKOtb${ebbns8<5A?lrIPaaSrlC!~GXh;DTfE@;0ayos3dYu< z3~-LiL&bs~yJyp$B+iZS(ZV@u!S#u2YAEJPn71zt!;zv=s6z&S4l_y)!;YxWUuon% zao#^1p`IW6s!qgAHx20__3M^ zLEQhVrp995!H{A&NSFV1w1lh_ZeXXr_Cfr7+kmwD>`V|gl;_)1pGt07mz(H?h>g>U zyC2|TPbYlm7?XpBf8{1Sv?bTXcFh z);f$(e;h+Q);l%0tLc^R3oUbreqms85~Wyp1DEt#M+QYr$KVQkEQs%(nZLeYW6%MY9c=lx zA3+dF2IVpUTpEx+OTPZzF;+C|(}Al@|EUKAQCv{e7{S0Jhu$l-2pLL?mbsAzm?N0b z4&acF^V_3Cz)VE?S*ZEj?}$J_6KxK!?uVH@j|m$g3BNj1zaQ0orQ|Jx5d2%kaf)3U z&q3PO%o)GHX)8Kzk*b-%x{eN;@eX%}vPhEfOK=8|73t%P!s@n3nT#mRq>M(W zx}W>-5sQ!i3Zo_Y6j*JbUQn!FdG>_GCf!?ZI<9t*{5|LgK?uF^g-xMS2ke{nw~g^t zI`g!-=Qp-zY(4xr-~7t(?({H&n~b)l`MSb2;)+wk@5YHV2QAd^-V~S!+M{@K&TDE1 zp~GuoCXEaDK=)KLKt`zZyOHKWzq$F)ea+%+HIK7k+_Na9RT1$$4hH%$y5Rb&tfD9L zXt4IA!(p=*m>(>``QF&E7Y57YNnan6#k^&6VM7{eUR+cf>E3M}f*4YqsjUcj?Cwhx zXKks@Z#wQFu>?BO2~u+7P|- zpi#hp{fvvcTEkUJlN8BBrO9?RInXBV#WHeyRxFE>X?+!!Iu!{KrP41Ee52 zKbl!% z^wNbN%CMjAHWRg>B^`a*Mj1g$MoEWDF|FUIC*w$<@`dho?AgC#Y z+Js9JYdT^r+%3RKxc|&2|I7uJ&rUmQXqB*oHqFY6wS~?M9qBWe>AQjMrzmr9Jj1W+ z;fizzdb}hCOsn8yEejvK0+j?HvCzzE1X%@Bq-~K)ltAA5+mNIdU+2PgdjO#s~ zzw-~r3y3T$DfwlB3RalI&)7K*4PaAN6XPP)<1B7V57=a2IlQd#%& z?RArGBSJQ)g3Ls9E?rsDVbMjh+k|wkZilvBGd#9D4k9AdOFU-VV?WP5(FUs`wkb+? z=i62lshYCHP&WM^J9hQ&hl;mx+f`N2Gw**<8y9i;C$|{PBx#=YWYb`+iE9-EWc2lS zFuyv=NqA({O4Lwf|4nh-#Fq#yV=}L*=s;80je{0tcF0l3%y{{hK{RyX_X8iJv~}tO ztHG`k%E;f6S{Zn=DBGwUX}>nO{+6PmX&Eqi^vSDz=OB3JGqF<}U=9-6L>GOd8}oor zDSiCck6BmOmTUqNvLXqT4ih2e_*5s{9p+Z_1i#z{*T63~lm|W4B^>74V8dbs(Kqc82| zm$S0jx&u;W9->YBtA*$mbinAxfP%*Dj6Sb%GLWW|dG~HPWH-?_=P&m)bm-@eK_VMkC*`a#t;@p!G`k zHtrg3x<1XYko zqiF;{_Ux@zcw^VRd}js=(A zns`BECa*ns2k|URn<@D%h;C|(?j*DV+}0BQR$@n`ha*S|AAlRw4#1HCFbQtdobD|oZ}Sc?;lR}tXNW2K?! z>-+^@U_bGsljm|@fT_xfqZ=%$DOqC@i9v$;QGt4M-49bix&eDw^phVbq!f&KmUYHq zSuZUwki-8yM%n2Y(@O~hk7(~pn{&T@d()xkjY{P`MaxS$s$pYc3_jE!nlI_70zQD} zrXXsQ(E81GXf{=w0Pvjg@nh8Ich&FJ*1hXIZ8($SYkEL~@MWxXF7Y}zIz`-oP`1lE z=-xbkWezO~D(kXuh67p-sig>XWS0nh6NeP~weycULzPGs;5YN)xMl#1=JMTMmGjGP zva#Br-Ez`>Y5HzwjZePOwW2w*njZ|bXT|q94#Tg(SA>Gt;rzh`=U5cxhvdF=BTzgp zq_m30b^YQjYm74#OV2&CKOoCO^9f+nXG?*?R<1`f7qO15dN@8P9Y~w0Oa-fQZxy12Mubrz1^FwNWIo*`pn@opWMF5hcqAH z3b2-{Vcc4o{LPa=)Q`+gbFQW*CbhF=B?N0Zak}7AOP_fC$q!u5KczO>ZC8a~Y7`y) z@B3&K#ylKaPq-y)bM43T+jO?hX$%D5XV$kOK!tH4tv#2Fig~Kv;%$5Mps@inAD6uh zh}omH(GopL#ioL{z1Bp}VWKe_+@qhPA?^3r&d1)ZX4PA_B{x&Gme*I16 z-R#TCAp4Tq*D^M+i6qL7*ssuR^Yc*ed8Af5=Z3@wv~0z}&Ls>s-T2Fjts4A6aL4T5 zKKh@(D|cQfqh+-)14kC)8h6~o1Z`Dd@-LEj05_jWA#QDWdGHq65E>W0w1D9^ z7wukJ9nm*%doP0pT)|c1peN0OI8oJr0j;|?ChN8-{u|S`c98l2T)Cv?Lo>apl^;yV zeA#(42XPMJ$63uyfa;@On58m(X=LZ5tj0pIo2j1*X_M^kz zy4#j=oHyy8J|fs6aWkc))F5V4A6Jz7eH2N0*#xgUd5N7E6 zwNW{TvnCGZ#&%%uTi&o?V0rqk^k3hMMl|-)VSQ<=bpo5N%(KjF-npeC)-y(ZvC=8iKw1Bbsv&IkA1_}9OZG5?2`8*fOMHXqrhqAsxlnqa0apaYHLP8=Yo74-;ovuQYF zRaT1X_2U*edB3QU=8iP}jlZi?pL@U=XEimKKEadHOaGq^?_g*VYs&bJ^Lq$5D@D=e zYtdqvw!5CYQP+a+&`)jCDtbj~XO0Y1i4c?mUEWn~39_S4-yY3>`=ZI^t38OhKMDlo zB$qL?93#8=&bhi1_Ppj#dP0;9yZB#z%=L!jn}o5x#BZh1yWDy6C0faK&i zMiRj43a&V(>Ire;Zc;I^-1yqYZ&D^=`FN^$yG{CS-Ww2V~Rca;=GLXb?$!VnDTrxostC#{W`9Uce{nxRvsM>CZX|w~y*RFfnlxsIYC8xj3 zkJW)6uxzCtyeo5&)Er|dF?Y`O{n^Ctn&_P&zlwXbcct;ueO`=3Q7+j*at$}d+m^U@ zSY=iliFv^OX*sF%W`^Mom187q{Ml>?T!0 zk2)Yvg%V7lIw_;y6e#N8EXw$#Bo^EPWs(>70drl{UhyOpgvL>%K{kBcA6(}L11B-k zpH=pty~ia8F;+_uxW_|b;|(oqCm>-kcCgtmI~G;N2tkNxxLrj5qc{^ZBm_rwfWv;* zV4J}h%b)M}sI?mD?^{!VZ}QNqMk*|dhWKr^-1cWEU6CGy6pMTg?UY{2tnkOoIQ}5{ z%z!junk^lKPq2jp%!D&C_Yx&Hu~0>O(^pBh(J@`|y1=6~HMB*}1nuCxh6T?~>!bH-7@3WjX+({6 z?GnCQuQxs{vtw=m6sjl{Px1D8xCI}Y8$Mi_SKGcMI_{2GqBbau@++A8N@-Q{oYUIH zGw)0?LS;j9pAdnZbXXFJ$$(dAeyLay)_!nAXK7@@vZ zGiuTnoDr;1q?dr0Q&?-HhgZu|M>A5sL^QQ0IQ!C{k4cWi0g}h2WsnwDy`$#=`>Tc| zGBE*>*~0;%rX|gy(@D(Nf7vRfA?(cn7liwP$mF;BA>>blYcd`zMsezw zameI`CK8yaTiRQVodjMM&u0scnc#oZY9QGHS_%XkZ%bZ~r(O<-#h?zZ8TQ1!K+`&mH%aC1YcZYVtzp|CqQ_|KHq{N2LW7l7-Ss}uO#>)n)YcjeB{ z-n*R+E!$`Yd)Hd(K%@x?MTe19cl%usa&@u);$+&hz2wiF2l#6K$$1VtAcDmoTG6ka z&NZTVYY`1Uw&_<>xYpQoy7>KTz1Yp3rs?rpMv5smnzrd;Bjf$`DeVP7|N7f?y^CO5 zp~tEk?|ZK1Lp>IoWJ0_G_l>hed06%wEMV0+q+SyEGz^THWi*Y=ojD&FB$IvO5Xo^~ z*>>A`U4h20(6AnI&)?9pq!XM(E=%LTj=|g~4*`VTm`3_%rhOe!@|<6kuFZFdV~iJK znw2+A?b0JhG17DaM8vM|>@=<$&E9hQ)73IMgjw@ICUq}N?p;?>N|t|hNX78;{&oyk zgCRB-Mj9j>Z7q|(mgqs?8ctQN>d_y$*9Gr%(H8jCI7w|K-Br2yH@oLIW8V1zzF&1n1Kzt+9u(a{h4vzk=DBKfGMkVyN1y{ zJwoL7flQ8uXQiTC-T17V!BaAZ=}axkSYbdq_{sQ;H8sFpk7=d_XR^zhQ-+wQ<)fVd zARyt8j%m0~`Q(M46Mx_>Q0#Bv{5e#f{rE^?Gvtz_^~?Q)iZ3jI1w#mOVtRk8nN8`N z|KR|}M%V~BnCj5ufh(E|*c_6L*Dom?<|eGCbqJ)*CHqR(FRMX6)k+!f9@ySF8er{< zGPPEB_#|bV+v7oaGri@;k!Hrdgundd|~9ET{;Gvdd)x%1h@l<GldH*hpCd} z<#mC0qO#LNMTi}zoA{o2jcE;)lXVR$8kDwI&gU*4{V`%%+AghZ6nFzCyb6;vkH{j@ zM0d4w5FN-cIPhYL8_n;=8??me{E1%j=Gz2XZLiW1@V##iPdGKpX9L%z32dQ@-9B8s ztsGN?^Q%*M=R0onKId=7gU~=IoME#iNKrv*?#}({eVX^{fDAE zM1&X*F+3Jgaf+dx;LgRw8k4E!AisS#4ygbX1Oz@gM)LK7xp9_|wD9}I!>f5Iv_+@< z9o7Wi(yt*+-_;1(tULL}eM7&q8-v%Ddy_!ThGzTH`@mJL_Yl3`Oqe`tdSi+N`H%=I zS1m^kGBRm?`Lgzem58U{cqV%CAwz$PG~Q)&n+zCxEv2mG;HS;-N@)Lbt~m#u^|_@n zr`{llFrD+aKUREq1A?2l+WbG3&cUIw?tS~6?8(Mt+qP}noou@%H%*@0G(owuoc>#4h@mYlE=Hl z|E#Em3BD9SlACp(C6bzvz@hK+n%sc3-xjo#7fsNUD~%5Z?kO7-X5S^mYfu1*q6DeN z!C%>^EUt;}P7fY!aHQlRy?s%V@mXq}j7Y>+A27aOjQ5lU_>t6Oeh+`xIIEpZ~`vsu8uqp5P;Lr&pHm%U<4G zWlxGycD#zCRU$mTcU7#-<3BqgH8M+jaq~!|!WJ`p3l*!fqZ)8Xn!J7rX}#v3uW*%P z^D|}vUA+H2SKoU4psQlUKy}Q7PFZAp+thQF%6+7rxt|tgK3#(j^%#tXAFo5wM)h&N zCI;e{t{wC_@;XbXD4FNwWQ}zSpB-{s1bwDQ=Hiy^5oySqrOzC-=7UcDoT95V_O!Ud zu_jfGvK;uLI}++ zGvhH{$F}fcwszYozw4b&$SfnIPobiJpM#)}#j;(PcNZfe^Gl=2N&+$xzC5u@18^_C z4QKu1u>-#XazGix9C7KlXIkXmiCCmUR*x2=VPzlus2U8?iPv?Umwd|Y*uk*xnY#;s zFk5b#&c;_ksTAm5SQ^YLSOtHvzv^Pveejgpw&xOz9mux#2T&kMjJyA?svTl;KC+l$ zTW5WgQBU?79d12E!MdT4V5B%oC@GT+rfe71<-j5Bo&7lK2SckuRi7+wl$PQ@HmC00 zKqOzq>d;|fjWyuAj8)EK?5IL&Nbv#`5t+^0L$<@8Sdnzg1?S#vB#OzLPy*#dhoxQJ zhDcp!EM@cr+ugKLW^+n&ujdIbcsAbHHzGfNe-|^Jll}JQQv-dlm4)H0`mAi>bWCeb z_N&d){*V-#eBz!sECH=!Za)yHW|oF|=&Hq)ky6LvNc-!x9L)r5-YkJ@;U8x8S#97z zQa2Ejmol8Y$&v4M3Ik$po#-R(GMGNcOFeC0#8AL1(Rc^rHkPUSUD z$5y*dB6ENM7hx0%f9{><=pacdLjc7h%A~Qnh8}R@il+==Ec$; zOQ_R67ir#8Ldzit{)$%bvF`9~@|$Jy6Zf8wnx(xo$ceZ}S zXtO|%Pk4CikB<{{DF&r> zA&kG>*sljtSEKss+P3+L|!+9kufi(#|yTQD7)M2M%0PHTf zs_%LuKRJI&t)ajOkuHs5I+--9(o!a1=E1ExMwgX@FH)wSOZB6--1&~o6#6v*gz#Su zj4GRHWu~UoQQs@fZxv%3f!K`?a=RI;y z-KleagmYd4z!ADNX?{y#^z9tc@lP7l8o!*ny`D8nldjzf-B#EX45&5F`l~1XM&=5M zJ`_N)7n!^%H1uuQtZ+>_kkQJf*Byue{;pFRsFDOTk2}#8ssI1`>Q)Z+F}^^x*|iA< zPR#EDXyh{;KkML%XGlEI%ANp&&ydg-O0r`&sc|bQXWH(>T;XY z<*4hT1sz;ggMun9TNPSwyHQBcg;%a|vLgFnHdfU<)E-ik$d$UhB z)l*<(=%C5-zbx>$w#&Q~FLPno?pNGxlXNlft|6UMSthLA( zKOhnQ-#H?PsdT`jGOzF=a|10n9O^c_al4D1fjxm4Cz_%qOPBo`+Y>Uc1O{>?Dj5U* zL8k^s?Cz5h3#;58ZDCN(>p9NO2ME&fc`ctS}xxYba3<9;zz{7(hEr+BV; zQ&>G3d9I_7$)9ZKVwHTES0gm75&fwiG$ru2n-ovqHYs}{>A0nfb&=cOXDR{*4@P-K zw3V96*n<{2esoNd+!yZoa`K*{YxZtLf~@iWMIA?~evWgpo|~8^mn=A)@yuxq^e1bp zpCq0Pq5WV`d;W0_0?rtHP$YIW&LX&AUY2cAjRgZtTS<{kzO>$$e%t})OjYJn9?w_9 zn%wcGmKNl7W-_2ElMU?Km@L+!*+us%96+{pC;M3(s$NgH|1`7%tPy78p<9_fU5LP=*gq8Q77r6inj zNjmI`{&MU{q%#@+R)W_(qDGDW8T7km3LBHE0)%0W2X_!QYI5$k^vVYwIMlIdKpT@{ zmU_T%_7NWa7##tkL}%)nT#_3WgEMDPRHW{S>YwdB3QsB|kb?^GO% z!w*JZzu>iUxS<9#jX$v^K`P(6E8{8_u_l&MErRB}$1xv(WX)5mWEO4s(P81d$@;}u zg!L{$$xFFXL)^vRn>u(qhKDE0zOZP`+#kEvk-xZ;vo^iyi3BI-JTkC3cF%e^qbWLX zcy0IVKe-T|?9DM=8)RA`7$iGeu$RYB+F_3rA=Z#p4mrLm$X)RGjZLkWQw4JmjFS~F zWDh0{PW@=Thr?%K+Bh&gh!{5&-79O81}XCEajzfobEBF-10GGKZ!uY|n_`yz6Wl7T zc6A!;lemJQXh9*R9)CVmUJ;e_4gskD zpKl_({wW72^(*alP0@;wlVA-zUo=9_&!6zFfJkA}CXZnc)*(;a&mg$*OP6zrOy6TY z-Z(ggehxB#^D)w#N6^Y}#BUD9KsjYa`D?SV+^gLBj|+EAL(kit{ompe8gdHP#!2d7 z7uIDJl^xN*f*y4hwFjV9l_v>Y9xl=d}Zk^^7NRZ&z=Rc_V@4Q&D2HEEh z=g!)E3`J)|ktRwEFBOeznKz-OXQ7c8Tp)$Z+kccQ*R(V7=Z4D=N}-1ZFTrO1V0fIU z9Z^lHRQYP2$SNaw>18&iJXI#=FiODB>u=!FjU08QJpAmYo zK^c|7!W^<$H%!++GS-tU+m_SMoF}=%oWBgxL;!V85Zsa2ReHN;85gFMy#%Bj+rEYp zorkBX(h+^<;@4uPQmWJ@f$1^)FfT`jl0pWy>~EG~XdjKC)Y_zDCT!witCfW2^>4=3 z_PxwMCvOOJm?1HULvAi4U+B>_^O3!uXPzl|wwHB&{L{tB@IRA^3?ZW}r9x<4H5JQB z^@fD81yVMm^U(Qt%u8yj$i@l^56%2G+@Kong&@Iibsy3T`L3lV)??9v=)|&W&{8)| zi=y-I-6o)mheFu0Wroqel7@1W_%KbF1|-FrOAt)i&# zzCPCFs}5iZ=Nr7pK7^eyW^Df-HzRLkLVQM`@)pT<@Sw|o*#kl##I>Yebnou2_!+yvaE*LYr-gDPj>ay-JfBu?$+1YHKqNCl;(PA%Mvz*eX zKZq!kkN;1uaE8y*TJ0d23_Sc<-UB10G0Xfjm_>9jfQu4d?<8S8rXXs{KCL_0 z(F|WdYB(?%y`}>(lRFof(|27Qqt1Ac1ll@o6Kqwd`Lh^I*pWWdAA>~Kbdgv?jg7Ac z4Dzdy!sNI9nr*9(dyG@^FnI;Z%?Us_?+3f_)uPa*;F)P>_TJ&Lr!N{s_0>`M^Zr|p zVwt>A3-tDEjDwTAt@Lt^N76C=mB~T_ArOg0GCJ+r>;L$zzUOKVbDCjQy?sC<|FI88cOvSgW(TmvkB4Z zwZ0VDZj4c9M)ljCP!2g+jrBGF2sQ1K3YXO}l619|rep2+2=n78-}HpfaQFV|(C8VO z*s<5pN32!u8U0_~tl)L$W;Vhtgjezf{m@iOwqSnK{eeN2U#pH~{0jH0Ax=wsg%nBP zK3)8vcrO|xL`BX92>>^Aq8g++@{bSVc<8Kx77SUSc*Y>TySu#5#oV>Mf3NYhaq<2jRR2T5doSaO)^%MJrZ@%}X$l z>%;Sy4o6{ADi09~)ub??a_6a1SH}{c!=aUpCD+U2q=Usmmh!~d(?GQTDaVc zS=Wq-w@6?i`az|0w>R>MB|*gGkZrowTpD(pt&^Xz!P*NCk0;Qj1ykC1Vn7RbUlmbUpLO4 zxBb1p3HvYTA|W!&V;9guAt6@zW<2KY%l~cg;X#Lcre$3|#r6>AIhm5E_!tJ7rlG}J zH^n#KsB1TfzIt(wA#>c(b>!yNK7I1CWGY8))$h`vpVmC@RffU{^P7=A=ltd6^h?UO zm!M?~zBU68(;hdBgj#l3*8HuO7P3+#*o_pgo6U~`xSjrVna{Up|7;QjA3JjEkk9nh zm=-O4-xu$oBuQAEP0`KmC<6V7RXAoR*=kWYhdbDJ#TM9(D^|_pO+tP^iX)@J(VqCv zr$;WuWI$s9?D5~cB6uq0Sln}@Dx7Kzt!7G2v(Yp9&X67uC)m0C*$_JSfc;?oc@^+z z7Rnw*omU$_fS{;HVxC<@*8|ovII}rda4rhrVMf7FhF%DM!iJtxRCviE&}@BSw$Klv zRbC0lIUO#{GMZ|WZzPc&BBO+-@StwZ_74D*7Uy~_9X?#_+k~G!;Kc$5uLe-8T@quN&s47%E6A0~LBpBq+V#rYi$?{q(qd^*7StY^0) zEJpm)wD1N05X$+1gFx>o3cNm!dz`=34~p`y-N`6kCubC9zb@JI>-x%M7y}LE&MQd8Zd!xIHjq~_EI-0C9h2CpjOjG{LJlL#Lm$NP zZ8(&@(K4@*`Y(^>IQXcgVLi${2Pxvkugl1OK$Ujp5$Zu@!8WE|U=@)BIgT#EdubLC z2o3n%Ryibd_26v1y%eUmZu^fn$ekc1KP6SV)0-8@J|#je_Gy$q+U@OTj+whs&{6#* zKg5>PF7R20CX1g5d)heX9`r3{y! z3+qNKPQ(X84_~iS!by2_nK!d+v360eqOC1FC|+uA5%}`Z=CNS_W0=*`yuaTK+7A}n-PaZm6GEHO&@`FKI+ID!JGYs@eWw!l9VWy6rYC*S<05jsh7t%sk|1e5Oc z0P!2VA-s_?M+(gBnyp-L$?w@4Y;=~itWW7>xbd5>cqI^H?S?ti%OS>Z6VKTlyT3B{ zdzOYxBOwrOzBJU)7Vr~dE|+usSBI(I&2a@~%$9nR?Gc{$%YH}d>YY*>7$EF;!KO|Z zAIG1wh&*$&iBYC*8<@em6X`V1q8X#&98M1<`iF`HT*`pfzQ+`^@^Zz-BgfO#+?q zVyvHswYb4NZfmuLHUAVC;QM8OLxeT*SO=1YK^cX--^dykhW)5S7jHX#f(FZB9q%8P zydvJeJLaI4Go>~`Hcg$|ZwV9QMR~5YPH3yO$NFg1t5v!aLg!q1W5wy(=CEq9w?LIr z6u;?fX!nCv!m4A8e`;%n^>`r z?35%3_>yA$_6Yq@B^foK8ST6S;HP$zNsHO~Ib{bz%?fT`L*BI7_WOextxL(_^4OxB z`rR+my*Iu-0!Zt*>{gU_CX-R%&oAhU+y{&CI$~5&~ zBm!t8>Ma2iJ)Arn-&uc)HBuIuON^EMIjf%u5dm6+l-%ib>Xi*mA8y&_0^)L$A#1nN zR;xC!2h{w%*By2n>T$2E=N*g;RTHFd6kkeTgaGj&+Gb@3c<9Jqp@tm1ks6C1h3M8H zrt6L`m3p4=;j}dX+WY&2XFem|ANuAF4%iN+R~h!oSp~mXo(k{rm&7R3GiYK1B<8@E z5>zzn8WPjM;P)TG`rma52x4CC?5*iDSJgCa#MvURSZg51 ziz3M2stQ*}gNE|-&SE))bx=A28B4IpOPG%C#`cds%pCU!wM2pJw3ATUh&ksjkChj< z2Qw` zQ~4-DFCYiWoyb#o(B@Vtkak)8t=T4ZeH zuOl;Rwr?vo@Tr)9PV;f#<1WTvJoKrK73;Di^WNTVh&LX<%Ck+gMh$s0?~}OMz5-d! zJPH8~f4{mkk0*3Ypi`Zj|HsfIS9MyZud}UbUqkk5WLm3pw4CvO^APlac87fJqF~2Z zT$M#xAEK$*5plFMNjh{DDR$q$bbk-z*5><;JnwvoM74sEiCG56QhS~Dt{d`rQY%dG z3s3>1+_`WKxW9Yc6?**8(P?rZPd?jRfG=!esWZ&jh4dI9p(ajMUJ}%DT7pzDg26@5 zZ;PY+aM8uxF!%g$hF=8nW!*5eKI8#d+}Vf>KC~{=I{zALpx@}UNk zw`?A$Z6yhidl{ATCBB?=)L@ECTva4IlV1r8JnTOCs)h)#sq2s*4G&@qbhO1S=Gh(K zx;Gd?Bg7SNa36>l`dJZgExz{k>aX%kx*L4@s-B!JF!gkz*DHL$Qh9|p1=>-0gbrub z`O8#zglc>+cDzk%JI;0d9TAZRDZ6~YC?KU$n-18vWG`l&pLB~JUACJku>8;})mc{i zo_?E0`CtD5??-qC2`#Ri6B}_;EaPRmcWJ@{EUWWv?NMzCL=;cb#=Pu=K$Q6^YDBLB zG>}lhLYxrCCNRqcUlr7+Bvi3MfW0nl|A+1vzOi@`g;SIF(8Adp(&sESyV<~mDnO8P z=9z*_g-&PN1V<)cHs{o}$w}?@MeLEVJO;ZwjE2UG`SaN$LF>Irb$F(Wx=qR6XEMHP zQ~K#P8LT{E@z>KL3wBP)+5-Z+_-njkOR>CCr@Gsa6e_tx zaYdp_L5AwzXFE1zEeXHqzQH2@JUNM>T=b*>S^Lt~aDX&QN-oy(uFMcGuSs@A7OVM^ zWB-WU{R@E35%L1t0Zs)=z`F&(abxZ0eu+~7qUmiOFs@W+$Po}cML=49cZHtq?FrG0 z4JfOXe7X|8ld%_4yvq$m-?@@1`@Dy3*Vwkm&O225%P3f+C+>|qb0rA2n<9RY_V!hkNGejAb2YxSfdW;G3H<^1ld{QKy(1g=Ri33&Rqfc1&>1*knVsCiP zE1_Bvs=peh94k%PDrw{X7E>dMDS_OE-qozBU{VFurjBhK?V(i@oU9uvK)6Ppx>vt5 z(~KJ}up;Ie$jxF^CthFln2I$3J@pJ8{?#x2uF{4Hg=nNN?5l9&QTyvRIh0}PDQE*H zt~1Ain<+~*AWCkb+coZCqOKwvyATad{i*N*aQ-MU{ec!K$9BTq%P$B;a=QoUsp)|O z7PCX~f(^3>7Xn$JWYNHKU|>>T#!Pr<4!t1y3iwg;=s&*$IWVwTfw)!iM0XJ^dnZ$s z_x?H%Ve8LU^*#S^JetU=N{#|)C`L45Edhe+z{t!1@CKTF0{FcR0Z@oU)jRKqg8E3(un z@a6a=VRE_tXx3MuyT-?6)bYQ?~_{OgVy#sjDUSqk3IHh5+;Fd4|x&iz$bV$KR zRcrFJ8MFVt|M0(lEPfK?@!Mvpg?=Ud_!FTbVs>vfb*o~w=v_T0SfYeaQhE`80#e{I z3SqZsXm|~n113t{${$m0%c{wMY>$@=W?klfP#3br=rDmT*7{P3#{5~`zz{sgvVwoc zwk~njNf3XuKrMm3z1F5FL-M13e5tEq;K0yR&CQoh@>9J^Fpr%jt;WR zJypikD<&9|C0bkYG2Wa6iL2u;EVnY~W|@7b2vz*4y<}D0CpWoha+9moHNXYZi+g#Z zmtWyMU&X@SgQFT%c=f3p1O-aE`^9>vW!T#FN?LzX$ zn*8@3SPAUy?X6C*4Y}QVIF)u=n-vnuGLEwFyQb zZF2>t9Hp(|Zgjr%W>sDii>YB8&|nN-5?l<=(2+5R884bJ;sn=`VHGNEiOlZEqCyUe zOn^f{ce+t^N$D`AMlc?chFH@lz{!wWu%BA^emY`=D}Bt1nXt(-E~(I!D;cGOBJ_m> zF$eyV8&VBTNL|)X2t>u4u)z<=L^)NSd3`*zs}<-Vz`8U{iaa0=^#^VW^DlsxcUS>> zb={b!R?c+2voGPs>zZZVAMbuIcfcrtZY=_zi;>DLH~?=!FE7?+2486<0!g6DdvX>; zp!3m8y|WoF+d`-3^yIhSHw)&>z%rX#3tw`{LqK#Mu89>`%HGUvxefbu03$Qi3@uOyU}0|4cbivH@xG z-@Q}BUywNVU5JRgKY6!W%gjrgJK{4S#eIw|a<}r>RcY~L&cceYhGjLaCf8P2ilsvd zDaCowaJ{B12o`-mq=$bWV*$ju913zZ+r3{KIo>aaYUGSpbz6CF(9T<&1JnQe?&Be* zAU1+I(y;0A4>?2rJsip6qVe55ROV$ksM-EjvQ**4|LdQ}*;Zy4;-F5s>Ez`cO|CEK zGrEsiA)*fwL>lD&prj;(L7$im>eeWbgj3o1TYo!3tuZiGW7SsB z_hCof=6HjHahtmW$C-BJ@L(+9LQtorsx8NYwdmc2Kjr0bRs`{ays~2~P6J8E5YIQm zmLeS(U06$<>(r+wQr;T$dzIYrVnw8pa$P*wAks&Gd>&yD=VPdrh>!AZ8A!x0W*Dzd zlp-u-V7!>Bm-!=pfj8+QqLTjpdc$w0P+mGwp+)(60E#X2x3(hhgpQ6D^%Z<*gdiAM zkPdkXXoYap2?nW-;7+S~R1w2e4Z1%8TDFswto#|+>)(PW2lY1zs%T)N^8zyQemBU9 zPZSm?E~%tn$$kEitLw?UPg^KJbAO8uB-HQ3ukQ<+q1xpI5{k}X@>s+ApNAv9rsz~Q z-t8LOW?_Af7Q3k=nb?r44$S4#PWs&qaMU`uqz=~Fb`^818JprP#{u|p+EAX=>?Z;(_0D0&CY(q{J*Gj5o^_g_=IO`hhJ6xD-EOO3iKnk8S2n>qVO z;DFp;0Ch5PK&*RlY&$lGTWd3!?P!^&v%UdyZpy#(7?e^UPo8ed$48O{m~VIvzBM30 zau{Tky&lkYwRTm=QgK*wPHbpqI*_>5 z*VLhwA>ifHf6vp9)OQ?w&JG!Hp`RsdG!n}7OlZebIl4S0F+R(EtJ}kKqA>2xk$)r3 z==_P!w7Q`MNzXjGoaQs|Irw|MSKyKCoEE7BMc9-gV5No#8NN@Pg!#9R!q)+&5 zMGy_R3ZL7=!$Y>MS;KyIB9knkqGM9cu)cnK-o}{sIGo+2e4KnmU_roVl#vt*@t8L$ zdb{??@)L(BOQx02T>v2>_91xoVatVGF_nzFzZ>akXpx_?%Gb+u~^;=ua3{6!2Kf2aKQ zqx4>B8_DK-FtR2+h!_bpRyY+1+@%s$Ee9(qHzIf%0oQ+)8>lpT^;wdTk?OD1<1zXU z01&6nGr4x;4hd|SnELGv+X35M6r^g zlX*%6a>mWZ=kG0FbY)ngFTSLm z_$dhi1Cza$B`bKDgB_F7(Ztk6uac!9FdtW>u6I2rtazHMhYCL;&BP4z1~rGC-sng?OXd9(w!ug%a$^PYJiJqd8yqVDGM|m zGwm3BYuOdB7+$0<$_6nf>gzhqBg3i13XQ_tI}+C@0^(K9p_%aIRxryI&W-&+3tF-%UTQ!g!P)dqt%STsl!H0{X43wTw7+0qUF$i+UtWQXs--DY+{LE@3hT@;YK|2W^Za&r z`Q4TruR`fj=myfhYuG9MB%8%2ubE1quu6b7FY16Bkc{bZMH_CjdB}Tzd#gZyM8W5d zv~-i+mhW;@Uh7DH)fDF)@-L}q_iWUKlq=(|;>Gax7&q>1&a6$vhS5>YEi=$ukxfX$ zHt5f0BW90vf-4DWo?)H&5@!)|pj|H}9Q$}I_7Vk*fTrb&ehAi=)g0!sFPsW_rOlP1GCdSjymY1JuGxABXEM3H^@L`_s=$yq~K zs4T+IO%Dvm4dWD350Y*+#Qw`ATOs@|&LLxPjA!LTp-iyBwO(%hnx&RY;P_u(ddbzw zVo;)YbhxJA*`2gf=n1ivlBp}`Mc8|Gc+{zmti2iK2WOdgZR|vY6(R?auvA72fP3xE z>+l`Cbw|5oP%DV%-D{kKu$cR)r?UYTBtC8-9j(%~&%)j!#7f*~jiRJQrPa6pI{eNOPrtJjKwoy@tf{Xbum z|K_yR9Idi!vIHy>=Fu-6oKNCl?>i98O;>V%N%q31M56{#g@gJ3=>ii2ivc6e<)fm! zQ=vQR&FN8O5Z@QAA{D>sE1i<5SVXDKcGX;7mIj(?xVoa&(TLaooG$Wic z=5oxxy6D)cyNB-`lrtuiI)qN}E#BFEiggQIcjlQNJ!XHGZ9fCWJQi+UfP%a^jgcyDy1R3HK@s?XlSSZMlQ+-v92 zj_A;SO{5jyAMzw6Gwggxj`)l8*w&a*#wdQKSBR9o^rgRcVjchM8;JbD+&V9NE%}e{ zy}szde_Xz29aT``j&Ay$eJ$}$6W{^<__t1W0`L(Q4JY@})S>ko(>BDy(pgExfBX4s z9x)o%?Yf!@Z-yf;b;T% zk$LY(Fi4x!D9$W-M@+3Lk>kJnO4U15=@@4zn>BMDI9#KNc?1@Qzxc*1);ez*^T?M# z1*|$m`^|?^4#}G6aH)3xzpVOo?FFXRm2q{@P(t4gd?Js-jwZ@E;}1;B1awDa(yyRu z1|$GZ%X=?t<*VOJp4%{_0z_c-H_v+{R4rcakxopd~rhMDb5qK zV(Irx8As_Be+Y5&9WMPo`F@=`@OC~6zKnKR=*>49}$~CVPKvy z{_@Td+YFG85z+Z#O4*i==@g2Kv{t&|iFOAgLBR=Svi~E`(37r|>WOUk%KGo4@? z+{`_a*7o;`tNWM)H(A{a<*~`NFK4m9jew#OB(E>4e;B^P!emL8s~94|k7WN|)hGf` zUKhE{ckQ#4O|K;c$%@Zl3ANO%s~9uhQjoz{PnF=>0ka-M&D|4-PPd2D)*UHIV^H+Hfp5iFTIoXEhP&yYEt9)`oii^4sI^~l8qv5 zy!PA(;YIHq);#70f?q+m7S~C4PC|1d>x#uk%8WhAq)<~>_>DoCse<5_&={-8qX%a! z)jCb(C?ehUZ}h~YPJ9KJ3`Bj%&u3KuvbJ?&>%6UYzi|qrGx8uZFv|~V{?#b$k1MS;;`-1KY1N$ zab>J@t*J6+(A81^JwU?04CO)0%ZR87@u8&3Uj*T73N0ygkXWvkSgMAl(YTDvc8A~Z zVBybcf2mdiOAwAa|LyZ9k`?MG>Dw*5gsJg?lBO%4G5jxA zWmmHTw5i=(xlX(Djj@uq_T4H1T^j$OlqSh=Ax5hzQn3Gy%6v7F+{r)>?6j_mIRU^v5u;Ca1dl=*5S0R1kR9uNXs@s3pFGC0+~xhC6m zTCF9t3Cz*As(wA0R>x)Rskor$iPkDwAdeuRzWesITC4FPs zb$teRmbbj^q{=x$-fHOp6+kzGCBwsPN(14`*PV6;_#xs?3J_CT5_TfySFm3 zwCV^4iJ@RxyqndpS6{q!t0#uSp&&~PkaiBM7crjjOET!}b$;cEO9$N`M}^u;zc8RB zk7bVX0kDTuiM2Ih9lspkCLLM-;CLwSR>~E<$@7268)YvH=_xefydGck%=P6Dp={Wd zkCa&#vy3W!o89khIq4m92Zl-&f?gFxlH+xzBfF*IsEG0NN!Kf>tKgWgFNE`FExwEw z*94OYjrr<^z4ZjQpl98{K*OY`3^2~Qr*ZflGB~&VPb7hgASM9L6><{}ZsHh)Ql~-1oK{mXYnLISzlpsprA%>w4a6+*Ft9hZu4@P~a_)$&BUcg2@xfDbyNlAd%Ob;! znQ-0;UBO?u2Mq}w`~4@~#M;o)bhdApgxs>7i*+k>uj#;)Z{3;O>BY!iB*D6B-erz? zj^477Dz$NXRWkqh%L9|j0v4OZWyM_E6)1rC)=y49ejG?F0~J}H1>*79B<_IRh#3Ft z-%4W!l`bR|&oi{tNF+_9Y^k0fpH2seK7t2B$5nmYOKT9MtEF%9gCQ<{=cs&QBigvT zLk9M1tqeCN3p{b@MWSF4eIcl%yK}U~@uG2cCT)Iw^*+fBQ<8$TW)vk-c&wr&9Dsdc z@;RV}#mlGXsANdNnj|sx`Wxh%M){>o~Kt5fu zyb@NAj$}9`Ozkhl*R03()kgSiI(#cqu|PG1p8{x~_6c#)+gzIU9@0|krW;vezg2Js z>y6cvS2EMK!XhoVbv?S_*M*8@cZ}m2-ddKnO%1_DNF?~gbJ!d=sgd$V#&CTtBfMQ} zJ(t~!lD9(OP=7ISn7p0^6p#xZ)f!nC>lF)%SFZ{oCH;L?x*glgKCvB7gLCk1CKpbw z8MBuC2}TR!AM%|s(~N__bfrYnJ8PU1zU@f&Tj$FdeWP3VmF^(S{n=$-sLbzYsX>E; z94DBU@+?5txlJRm9Mq{F)}on$_*FDb;atprT&3ASRaVOcqGya$-R`1hL!df8?)$)Y zB)<-#AF4@uuA%jO+`~3OX6y3DcTuc(_iftZK*OO6G8HTS-Ww}+m&v~G_kDM+27OYAk2egKbYmlTKDJkPbny2WT`5e z4TC+r+=+*f&7Vz=3=2W*T*)=AKQcy3led0iK}g%>`P0d|4xgbQUZgqW@ri>Jrx?9TlfW080G+ST_Q$4vy)xcf^uJ&W+SR-hugVnL z?#koX^Yn{RD$d?y1=Xg~Xm_v2B~t-u77?csa>HxldoOm+3loqJX3jK^N9?z{?Ts=; z=bWuS1i6Y^pLL`%HQG29%SOl*Yv|qJCFLkcd}Wy`da_>Wy3O7BB!{S3^l3%3j^ky% z!Lf||VLXKIlaBrG{|iDE_P`BabVGnN3UuIVodAjBnHu^oAV4WQ9dB2 zS5w50PwUlDN%-lr!5v=s{bmW}3hHo>u{TsJ`9_~#k1CA8g_J>=fWc4IV3}qLjU?YT z*DVD#d1AcD5*2Jy%8Y~U*C`WPFydj%FR>XeGLsaDHr29~H+nz40OJz)DB33CPImE1 z-G|AU@^6d3yU474uejuSIVaC|jKZ~#E{t#pY*IIy#nfoE;R$O{wo zXvX(?ZMN)q1V!}Sd3`5s?i(iGYig2KEjpb|*E$5vXvy;_R}c`141I(OFMuS%xhw!J zM~4#gfa!B{olJ)aUMJzAq!rZ3C=5QhNF3T5H?D|$=S3>)8>%;XsBT-W^mhk+E*|J@ zek%cyu5;LHN;L7Y<%tK_e0ilT5{p=8XY{ClUB9MbRF5enpk9C5rRqo8*9_`UD!o1fTI~ zQs)Z=d}>LnXEh*kRW{p!fN+86Mk`38VQe9 z)wj{82&ggmY0Q23EB!~u6R-5T-&_A`G_;z-otpzcXQA{nC+snUC9Veg7zG?syeqN`$o0?{T;U4w@Kl?csy zhdn^cfZ<%~J5@^(Mz_-->PfF!n$9J^-u7llWhc9<5hV(0$$?BqD;=l7)o{17#;W%s zufQdt3PaEH*lO+!`ILSU7B(>7ypLqpiNtcr%eo#dSR8=~9C&67X)piX>VYs_u$WYp zb_NU!__DRwF)?WoMnJ-(7ZwenZKx*~S@|*u?|=0(+Jj1!AG;J#UQ}*>Acx#vj6$sD zt1b8B|IITQF&+$RV;o87D1?EFjxL%RpyAIhfrs^8j1zdLinNYoGma46@m00kaa`%k!*b?FR}8+uaz4sm*LO>Ae(z_zTXCTl#4uO0N<0ktWTW6Cdcq#Rk`(+^y

HKrDoMk}&3?T!SC_@nP=PUz38aFJPEeV(cK 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 USp;6$d1-;Fy%`a+NKfM4sN}-MxEoC1 zn==v_%D$_{Q=VnoiMaWlj34W!L?kZ1v{p-UXoVkECN99V?|9IZsX;TQY#yXrP5}&y z(`mJKl8eP%8mpg6nMPvpTb1s7O{yVzqOmcp>E@e9e*J`m$ecy#$-die{?4C`oD4f7 zUkZ%b1#0Eb$>rLgvB(YRa6H>U@g>2rPF^V4)19v7#F^gKdu|dTK2Fp=G4uv5u>IQ9 z-&bhGwZ>mvvG;4IoDXdqDQ%~mhYr|J>`m%f=^{Jl`doli6as^SV5ersX-MzbsE z_HV_Dp@6zNwu{x>mRGPKiy1R%s*&3CceJEq{G#4OHd(0XU8g9hu5!_}Ps8o1rq_cg z@mA2Ho=KH=O+0ocLKf5oq6z(ln{?Ekf|g4OlGpN2JBPdas#qo0dt9q10&kg?77i%m zlrIl%^6xBf2>vIB5+o2TS*>n~67bp{(f=eeKmW8`BJ@w+6vaQ3)7nd98oP3pI$xyq z#^MIC(+mRJjw_txI%v zH549dl6Y$GhL@0;^?7y+k`Hyp!>vj5#=bH*)^Kgm2BGw8M`!xdZtNvZ8=oqgLl&Hl zU0PRMZvM2-bi&*&)cLaBDhzL?q@`DM_envk84q3E;pQ1qW-dn;AgX1J<0oTd8Ldq-K89UR8@fExp>*@(2?Or7Toi zq4k9^I(47r`CMEkM{+>{^(`kt=7osOv@evGnSVOWzCNgF?j0O}-*r66z5jxOIsW9t z0wr>nbk4D*!N%1_D6=VXq6E|S79M88M!py6R8FuYH%WyH|4r>NOZ=+gtdydBP0X2C zu_@I0FCP!DOcWL$>@SW{D&#ls$}ABh2|?+VIYJQSK6TEVx>_=~=+^da>bp!B#>K`? zSxD6@IO8^78J;63l=b z+FzyTm{FYgspT^1c6AaT;!iCx0<|-orq4<-a(q3f0uZrPl$L??{=Cd>%sv;>_G`s5`>Mo3DA395 zJ@6<-u9pD?F=(*mdumO*Hej=T$Jql>Gm-QiNH6d|M)-%<&WvW4r0)UePaiJ&Lspb1 z?;@SWTMCJLSeMR!RQ?qMX2(R~bN$r)l^- z!Rg=KlnG*>=qp6gxC53F6@EY@L4-1wpmuaK#dIesEXBR+gx+<&`fyD>Zmv<6eY27E zjEK5_=z&fP^^C3?1A{0kEb0j|>@{iR=Dr>=pMk;Cx^)6;WFOntcaIGwvW)t3VAmXG zuuwE_*$-Fry>jv9I{qJrv+BGz5#(XLt8D>eUO$n~z?+`nA33Kz*%pj%8A>rO&;cTH z^k{(1Q*;iObD44Qd(ER%1fixpI9Io;$f>+Lv$`TlSd3{Wn)b%sLUhhxo1on};ig(~ z{Z=1;ZasHfWdxLD5)z7Tf1aa9D(-&uj*L0zkCf+GUsmCX)fZ>NA(-!L*>C;jO{w)T zIDY100z-}fSdaseWa-(n^RLTk{EHNCA!yB19Foq}RA(+Gx>_=V=#yUd$oOHZKaXIb ze*zdE%}-IG+GASwEuN`d-<-tf&%g^bbA<+Z$2N(?I|KX;eS?_Tk@gq+k)G2sPKLBe zgQT**rM8U0HZ(vApx{@)kqm#j(<%S^^27;|XbSvCQ1pJ8;SfFnVHc8(R;qpTv1P{^ z;wPln4`E2`1hx&ujUWRF0p zxnWBHLdf~=4voHC+aRw2o%e1Lk9jf~gdS}k(U;I!kBh^W_V}MjNMp1Zt&Z{D(bid+ zxc<0UqAJKQA1ZPs1w4DS?GwDHEiQc#HPe}ULJe=g2;LLSm-g$S2qi%UNu&XmX}%9h zc7m2nI{|g(mSAHq_oJhD8sGqLq=fBRC|^%70phH+!dy0w>`z0hA`xIv~Q=z?R^bbIT5eOuL zkHX2SFS)EZ2#sy|d;o0IM$5emJ>Zv#kDmD%8HA=^=!?(k%0^P>h2K8CDz zA2kgl1i))n(VPj~?iFp}u*R&X=jJGTwEd@$ShYu1_#ySJVdd3{uH4^__Ea_KCca$i zyJKBbwOkhr2qgQsSSWq|F0jDA6DEyB1xt9~n-|KXUG@%6eRrqEQ9>1oP#l!1i%l*4 z=ymm6?#NsDZ){VmBk`ymJi;8K&SKwh@so#Rb+z8?a1*n5K*Cp!SPKuN!P zDhrL*aG#r;C@}3Qo(f+K&M90Boq^#uLQn(V$nss!EPVIVB30YB;VEY6O_|7~>J&C9 zFpUB2$HOeLEBSq_mcZtXd?gs6{F8>cYa15d2-Qun> z#kA_peS}fkptO)o9iO&=dilkvJZt!SmtN(U!{1a55bqccZd*FbA*ZNz9!~l5%C3^J z(N;X6J>Fcv>;UYxNMR@aqr}Aqd_;o_T5h$tBYWornu-{d&>d~(w_g_sIVxQw=in_u z+`3*)S*yUKHRIQ)F>p4vs&G9yudG*i?A`TOq@|co#3CR zp3S)Mz6A>zGI5B~67mY*-XRBj*V*?^pnMGp*4^PSk^Bwc=`c4&<6m=OpwIJac{jvS zrh+oi#SVfws+p32B_ES`x{`pv7KEIP>zf$NNJqbP*w~AE!QD%WDR8kx+}aJMY{|It zR4OC|ZlTSTjIw1du>cykxX8N064|wDJNKLkRZMflwrgz%KK&KIh^|Er&D~*05`-jm zYD0ihGlO@! zVr75@>3WUBaH)`57liqjG=~3KJfHW*h;O-)U56TJ0a?mgR6mQT;%BSq`IvJ-5VFO~ zKhUS?rbtU~uV&7tZ{f-Eq)=Zt>S_jM>S2)h-o5vK3G@mVepZAXA4GaqL`d#PxgJAs zKT)4<198ioVs6iypw_uK!7WZT$%)qgUtEL`h#}C0s)L069RtxQvvaSbyCXyL%so8~ z#b=XX5*S?~3V!^0gy03b? zzEhe@Pu6pPOC5)!j!gWBjnCIno4H|=Q-a4bL||zT5*k-~=m700Fp@yEB?}K6(f~yn z-)uB8UTKitUO9>?Rwa-sSr`i9J_l~E{$-h+;tI*9Mi@$3<~gomGo)MsNy|T@0Q9y- zJ57H~=_X{mmL=Z0{TPXPj5;c9VSbRaA+7OVGq~U>sh*G@hWj|RaFLy2ANWneW;1i2jQR=CB(@gei#?6ZnwL5=m04ecDaX!4ngb*=jSw&KQ7Y!D zZ0EwbzpzF7uC(VNi$N@p^5gJpHl-QMrBgFo*m!CfBYk7i;2N^}WOKJmH+z@$$~aow z9zTSt;)V9;&8gxINFlsq96|Aqv;RP^XA1_QauHSvYR`7;BTx#73BiRQ0PE41gE(6Q zgT;^(rR`RdxTQ0<_$^F*fq)yx-3;-;o-dOJ9`V1Scolk5 z?C`B^@igZvTg5W~H$ce0x4RfNeqkFSPsZmSh->Iz>RxlcF9!%RI?FoD4CPN;OLoR% z(UrtW*3_f?W5x54?2v&{G`!bP7LvWW6gjuV9ok1?;fCO}zPGM^-hmj7lUCAUDjVUB zvbp@J(BwTj=RW`HoyAWrc}UQ=kKU%8-P=QiK4qOb@8C{Zz}cqb3LkQ+ZV*>-p%0aQ zqrq%`d46v!-fPZL&St9oWsEh`$Mi~F8a@9-t-<3DRa}J#@nstij~I_`nFNUuIg&#C z6$&G!MzoxVXLsY`ng~*^<>rCeZ_(_-_cC_q`Vp$Z%ejFxIHcdJyciwX(ZdEaevW?L z=IW0FYH2diDMfw>3sJuZY9BC9Q19YBe%$_1<``hP+GT8Y=gyZ4pkTz}YTdX|^wf~| zJ0kK;zwXP3+Ze&AembQ9%}LndE$?Z#R16E^IQhnD5EhO z!_lnIQX5wP^>IE4&P%JmoK}>%dvBgF{j(#@ywG1X@eAP7@>hC~1t@;rcP~4t&P?LC z30~_7A23j4+I+Oj^Bok{rBH*G!<>8Qe17(fLf)X`?;!Y?9EHDE*fH_L%>KJNE1%c+ z#ZRLFu2zfWW#ROhjud1zzfzJhWP^`!o#-Q+cR?G<3b1UE(UIoSr{_9d%f6na$a|Xg*1}zu;MI1;o z+z|rA^y*a1$$)4~YpD1;12MDe#5eEc5-h2UgM;k%V2i|>Rf~=tJoWBZ1bHZopB*VF42l&Xmb<1AzK-Ii9n{J?Rkn!AxVcXQ~ce3_X}aukvjc z$xl>iMSFd8)1I`==k$N+Y9yCUTve{v8-f*Kwza?W{Y2)>OVmdT>y2QaTp1hJ>fZ=x zV9tJZ8xs*>+ejTt!7V~!MLr%L5Pu|R(FpU(*YR5mLNGrfQ3eI~PoOK82}eai3sQ$9 zyV&FUx*srs*c#?g8jI!xMkFo39^CFC#?-XzD>Aw&0lV_kEP_d3U+v%3v#X+UmGCAB zrbr0kA`c7K1rZ1z*;@RhG%Ev5u0JR?X^X|l!|qv{TAJKM5UWLPvlWE*EhdMsK_56# zA$Nfi{2LVc#?4v+o}~o>*@kj0%FEJ(Q*$u&A~bE61JMt8(j^NIe-wQ2_|B<6ymLc~ z%03wpa7&AGn$NcobU4=Or&BqKe+rK_fkyQ4jj zw7%FBX>pQywOk9P9IgoVV6&}aFWD>Rjnq2!Ylx^bJEaa`_o)LQNf0hj2lirKo5{yB zi%R$hYrgHS300uJ!(5+U83Bb!n|r(McLg-^E35XE{=4-$Pn&>MR$39$l3qJZ!k*K` zA?1SxL`J}(e1OLdFF%4&m)gw@!1KXi-0Hsuu|aGCYu$VS3D)uKro!3bk_>&kT7~MPg^w|-0q_v zrD9E#Z#xd87hgu|<ljryor0JRME~!ycKGkYBf^-yOg~QL zy~8Nz!Tsuah;gwejECHCq!l4zZ{SP;kf&gZ;M;Iune(qXqIG!SXq0TeZt0VM|Ep5$ zfYcTRJ0tPj9u&VeradOiPhc|3BEsqV!&8nfc%n%L%8TQD%-T?mt90(yVwy814QTRs zEAc9m6Tt@lXzX{Ut5OVeDN&ZeZI2K9u8pqtcjCYVZI{}L#qAOq4m&`_anOrGMd?B zZU=C~_6xinhk9m3yP*qFoJP(g4vrmwtkO6YLvJJns$)am=Ie+F(v{fv;0~plr}5!r z@Z!)c8d!R%bK2x!&s%){>6$PKmuvr_}@+NeQ?af`a$fZo~na z9+vy|iCjEly%et}5R{|Uj!A#sr1rN1b8IM-NhHa6U&$rPwD$!Bzy)@nBu(7jx4c(1 z!KpO=^s)S%5nT1n)!Zneh%x2|3#D}V)87%9SYTbzKXE;(+OcLuK+LUKoUT??)kdH6 zx78v=t*QK#^5!;C$I^u?eyvjtdq1glliOm!?v$|MLPD%h%@akk9X@nTBKOfLANBUx>elxV^{Ma9!i zRZ0^V!r)U?%T3KF1K|Y{;YpXIcy3K8fo~ya@s8n6eI!&8)`b!M<>a`rQ04}$ZJc-p z>2&jsp{ulF=j$*Z;UX^1bjch>;!x-k#&(D%k|#yejTecomrLIP^7SF0G5+4A_6KXz z;`ftEki(~BaD9%1(cIwakqpy}a6!f9m{rk{=wG!g##`wPket?Nyv+NbF0sudIJk=` zmcqmWD%g4aof!9g6S_*}deJ5D6!!eYC_YGM9x-la-E)mmj-yIaaO;(}S{j$XmxEzdE#LTf>RiC)g z1z1CAcmPe%vV}1urIOwXv46=Npib~7!*|6O>>JUtYzKHc*+nF=`Bv8@9{422RU&RL z4@avla2uj*vo5o=mr^S2kfM`}y+5Oo&My18FMGTq7&vThYwH%Rq7ytOkpW4NF$UMw z?f0t^8cv+$A)x2Y4uZdnBoei2alDCFmP%^Ar}`>O0RdnHL&hF$*kvkFOi`Pwc2-`w z)?ZrkC^XVh8aP6EyNz=X;n{Qlib8~XgI{03^Q-tQUWb#Tk_>&e^8G$h8l0_Smhdp` z8W$IwjxqyEXxmghR|rTxywT_1ne7Bv>>9S*T3-xq@gqVx4Gc$o#oqETK%Q1w4ZkI}cHet1y(^j)V4_P}EoZ9kyUx1h=A- z3+waeg0+x@4&e%2t3*0 zJ+uLxi(`&VlN^I!uF};4nFO=Vp8?!81fq!%t6uDfwdBZsav^chl|RZGa%3{DRgtw# zziP8i6(cagUGHn3kj5rva%^n;+tgCypWdtqp6FI7{?7!SH-oCu1iib~EZu?zTz9W! z7i&N;>ibKxKVWy00^%LI{R|tao=yn8)h@F(wB@>*lJ~YMd5+y)y9_LkOd0=LObH+~ zmhji$h=mOa^6Jarp&||9V!@AZ2sHnGxV*gcp(h3x=V+M6|C#z(39!HPR*YNk4Hg`3 zcVBdED#H02NJkLRdpmD9M_LcDgaQex^pf zgl|Mrc;2rl>eciMlR7T=7P&N3f*@3FYYD$g@b&bjGnh2f-01)t>H{dHh7(2N%HSEY zC*9-fjTr{5WG~os9Oh75aeRyuUTyt@h=~(K@)^{wddt_f+2UxN*)NrgoBl~G+SS%L zp1pDLXO_P(hF(m|J>9>~T0*W_EyizIkKs8Uyn!`8?bemlbeEeuOWfAWxN|_YD|Tpp z%7&MCBeH5J=M&xfy)o?l%b3VQbBGf~>!}hJ>tbP2e0~dV*pKSK?(V!K-l|BnG@?RJ zs7-8eUq~CKT~W7Y73S$*s2@+hSLn))?Ghb$Ag1_5fCIbvn+3sCg(hGw)tr`LOWfk! z-p%>N%DjGH1YRotE-kL4x;S<5c3Xt2vX{4T0awV(8jtrftbUYvs5qhJB?u zKnqwEpZmjpfDrM>a)joVov}DjccPF;oEG< z!-b|ubdQO$CL=dJ1PS6>eqxPVQ?=u8#$ep}auE1BCo)AF);kPG`hw~wch@^+BYZ2e zmh=EH0)Nk#dir24!*i7xf`XQlZsoJlDnpWlI4LN|3K}^4V0n*8zerHINm*5Eo&IN2 z6ws+w5QnM=B1ygv8!S64oRLga_ebV`4J!p13Q;j96DgqSfzC*m)vu%H{_fFl#W@a+ z5#G9xLGzu_-SD?J@sfNB;Ce`4q7F+{>x-ZFM)(Kp%u2RJ8cR0eB_^S+OLGy26^Da~ z>#obx;3eWY?_e^|s(MV?%0SoZe+|_i7siYpnha48@{Yx=ijG`gO#!gk0(z%74Pn%t zw8_-%ax>D{sI;be<7NXXWr)AS%WKI?Pdqf2u}6HhPf6&A%2n&(fOnTo2A`}%#L!e% z@pmJDKx#u?I;l@LkwZ!k%cYt6?`&H$yheF}rkU_fQEE%d7jP%6-I<)TnT?%@_XwhA ztXey2u%}Fa4GTg!=P^Ac9&UjhK=bts4uMKVvOnZNO=E@s0^d1qd{t+IGRq-fxrg2O zSb-eyfp*MLRTUN~V&xRWvtgSTtSq*zqfQjUn+XC|d4=%{qoRO|t}af=!1v{PUlDFS z{MTr*KN*kVrv|N#C3QFol5m`d#qWT$oyGh0mD0lO4)7jd&`bF;#K@Sm%ueB1EreH; z;U-8W5?MXOl;1HH4>bN|RQf@7@s@SUn=sc2e#R)WhlJ=VtX$_w=6LyXeEq-NC#!@V z7eZ>y^;*3StQ_n3Rs?9?9U8TBt_1IDqE*fpCGyW0!uB(9?Eoo6ktAUQY-o%=ODjt zen4Kgc$m4f+ZnYd_1BjWpu^tT)oXL3Zc7nfDC&`UNe1H6d7plzi|R*IJSyqD#q?TH z#KUJG#C>t!Nt`5p!*XxJol?7yU=T$i)6alX%$(CR$Lo~vRTS9bOy~c!cGM8l^t!X# zQ4l+jSFXK|Xx`Ca&6)Y8#o0dWt`AO>RQz|4LKt^+mid&zM{kRjy4qcWi=@HY&9jcz1ezD5@%NO z$wJ-e=g;gk=}Ea5I$u`#bz`UKJkNzSi5ba_kE_dW4Kdpcq6(C4KO9)CiC(&Z1_kys zGDw12vV%877c&MjS@s4kZ@K9T{lb58d!|j(66ODdsQ}PuVQ+W_L*!6)qiQ_-GWlHc z#xCzh>aUfuZB8iex-dC6iEf)~*4XV<{48yAFf*edwJa z1DvrJwZtSvcSCojo=WKAWT6zEOl_?(OfVIVEzVN!M$Gz@foHv8F z4m}|!wK^q&I?|a?Z@_M%<^`}I21z#J_|OwM0}}`q998-<*V!b8yEz6lJ|s)}+NW)1 zmD}=_SHp|;UJbSNE*fQJp^fWj%2E~>B;G6L4h4)}G(S8lhx-Q7xhxMBASDZ3Mbg4A zY5t>GaW_Rf zUv``vy(#+O{0dSt58kpYUQ3tf0WWi^C7+H;h23!;gU0lcm=p=u}Rh9UsQ ze=vhf@*kEVPslrvwuj$A&9>|VkBaS57P4J;;MBTO`O|YMbbN13OhojOE*o;nH?;*uG19y+Z_qx_8yVT3 zDh=c6x36`71MIrlDzZodblR4BWCRWQ4-En$jz97Cuv~2LUcL8zt5xOudU0C1468++ zq705@A}(^ZkpiReLd`wRhX)LpV@~8;CyyWCn?9wlW(UJ0Khci<95(;UxI4*A+(6td zmSH7!{A?^*52y%l)`loVY0cuTrnEfPfkNRGmJg2ol=it+8Fuoos69kjHzz~iuE%-9 z7pekmQG(q062Q%MBBV}0w3=_COqH|&9Gu#eIdnN$w zYBS+hNR#VD?7A`e+0n&s{$7rZ{&zfpJ)ITvU+_y(S@qK~%c5*lc2h1#Li9h;UOU0v z2+%)MQ1J`fqQ8s~imOuWXD${6<)mt82{i;8Ci52*`D52j94^~eiL$)iJ!3(Thr+5K z=1F389mpx%C@jTXpV9+NmV)hVb1$8g@dhZO*gD9x5sK7h`|aGV;E+{A(14<{u;dc> zVlx=S*o`GjMIOVAK$A5yRUANQ`GU-+x0U0@$-EOGqO{c6FhDi=u`Lmtb zM_YmTS@Uujd!M=)g17gR5ak96`L!QbL+h5Q4S6I|bPbAZwrxuwKM)Np#iX*5qS3Yv)T z^09x24;zq?2PrqZ&t8!GH{%3x+kD+WS~GX=0tdn<`fRR?A7rx8orFE(uL99|3Mo0$ z_8V)PV=wRn|6;ws_GLMr6X3L<6FwZeEo5B30!^vb^1fNaeA`T_i}hWtxTfn%*`R;{ z3D%pJnnkO5LA`|yYdqBXKs1jNCmbk0kz-u6DE`OOvw}ocH)%{jZJ@=aSu4TkjEUKu zIz$e!M0Be;AO>NV}x2Nn)8jM3)Vu=uw(B0DXN9Bl_W-095>Dk^Ft@qL`Dn&PNOO=O8+& zu`*<65D*^m1m1Ag zpW`!Z%vl9ZyIa=~f|s5GY$py@Jvd=pASQ>J*#vK@{KK0AF=0VAH?( zX(+Q`S15_*(vyv0ZNF0e}5JeSdH+-Z$g`$(jl|+CSPZ&-IM+>;<2{` zEc`;@M(NIt3EFBih5#j|VrfJq)aCjllob|Ny{C^u@+gd+M1m0=p>l4X3dM>0EpCv# zQ1zDRdTA8HG7LcehPqALG0^O1rS-=`3FZ;bJSU1fQOpP76B&cQd6gJ|kwlmVcA0je z&7NF)sQnMDuPuQS1<}33V~g)7eBUnW zMv2DrTndNdmf>$Nq$hxGPn04ylqq* zZL52vdBb)gOGUi-Ecp1Bd##qS*e9_ae$zNh|+Dx=ye_RWxmJ zSJ^VrBk8Pht#SY=am$lDH@(T)1rxmc2tUFG%;Uhf<}7R@YdjAPtCzo);lBL|v19Aa zx(A&+Z-jO5E6U9|%7#pXpPR7xPkZ>)9YwsBt!1D_@BOW}A@O)RzfnpZtnUh%lpM)C zE7QYo0Ww2QEhe_D?pY_-w>z#yR)eDoLjF5`-qBU6dz*aU>{)Dl z2=K?)-HHRdsS;04x_2$))-sA#z!w7lz39eJgvYW%kz5lZNW6KR%zIi=5er6HIPwM( z_OF(neNjX$X{PKrNA`QN#~mAt)VEKBYO%RULy3>sAWDLV=+K+m)l%^7}p zmu*#}rPA8L=g~Ih>W5kJ3cU5v?|v%XzgrsB`)g>!&GRze5$5b*OkU6{FPNN#Pz0Ms zfyB}##6Okz$0ucnpJAKU!P{>9*N~Nw9xX5ux{%t=3uI^c{@X(BV~juzSHcAg`?|qV zrQbT-z8ublnG64#E;?C&`+jS?WaU^YivUS*5krGfRa1s^2yWi#n~u^sWGIB~eU2-6 z_Ci4Hu9T}mg8}7gL=gLflDe>WI(yrR6m{k|68d<^%SAKhY&2@~Ul~#|-fa2`G5t_D za3V2fn3?@>7JqqOVehCB&?7@m~t z6ib&48&5Kl($uO4c_Q8`0UUnscj|+{&bM{A5PFzU8xky7#Ye`L^qAZ=7R#CoaGDwK3fHK76r6{Q1NASxa=|GeaW6^ zy(ZLv5fPGgoX%oitga~M8WU3rV?YZxc6+Z{!{&5Iyh$jO8%U{6cgyCeZV#RIC$`7K zAv^idj;K@v?#eOPMdv)!%sPd85ZzLOLXF-U!tdNaY}scZo;iYPS+dxI8A# zIeR`)=p(+zDp{q$0QCciKK$k}NWpTh^><5z`>74H9X7!nEXD4!CL%jjrdTyA>)0Cr z|EXI)*u7sKF3R11Phg(s+?@-4?k9knO<^$6>zf^|8>zX6;%TMEMn{hkW;3dIV#u`r zot#f1^I+`eTUMqfy+%l;Q|WT68c75ujn4lSOngPzD&9OI8UEbQvjWH_Wjy9u|Shv57}FlbJ#W%}k+WW%fwBwK9GY6T)D z3y)d*P5$lO!e8+XnF^>fM@c;dcyCb$HMO?Qs|<0m}(7$?^tM0c4~bTyIr*{k;0 z{<{-O?=H-Pc#@<>nAdcLyk8a>C>N#cGA@y{DlYx8i_1+g@57?2smHKEWmI8o1O~r< z@641zVB15B#o`&OpJambXCV{wAM~dLb$1*fi?@V+EETLl?2HxiPf4jpT7YK7fD@|J)} z2xfHx*D(61sxe!I45J{&$ADJKzqLPj|i| zHcu9QsI>)!*{|ab3Ebu-8Loloak2ZR%eY9sK4Hpg6&!IEy&Q31k1djdnU8o6VjUkgzb1Hu(fzZZvqQz947uejFw4z z7{)~h^6`SGO}O@+(=s?;R%r7$fP#+~3tS(hHh;tMt~QprvMhN^dv}{7@@O0u4-Wsb zrsXinB;7$##;|%CQVC(PE!lau)P3oXV20u0(YS|H2f7_>F2-~5=uP<(+jK`u{_&4K zEv8VG+LxEoY8UODR-a{-WZuW^KQ{wqpI{BD2-l1G$&-t*S7T2JaD3*r(S3ML_ix@U z{f-BL+@0h@7KJ?Z2dV)nWWdfnb&DP#+I_fO;erL$Zp1wl!Z$~Yjs+q1PM7OV{>tkm zT^I-2>s^`yeo|89?38CF2)3(?p%>(D;Pb8^Ti<(<^d`ORx{t={|EgxV&15n{2@IYQCyRd$dqqshyVkb1%Jptd~mkMh{gsc;8QLx zkoZWGDSz%)=YLnz8^$h1aUf}aL?2NKosl3;#{`+T0Y>OY;U8S7WIP;0) z(xXYos_u!-I5c}!t5n4-2eblN9L{?pprqhj%++~miYQGx56-~bLGAKGXx{hMXqxu+P{wsBDD9`Iyk`LXiMXgMbd<*eFY1jiwgYDfmaGuiiU7 zmup<){++0*^-Ydp*Ey?Z-VirCnXK++l-QA7QGXsH2^u#9O&>&x6H0O=4&pg4zu&HM z6$2_vW6b#ldb0ExI}rbXsH7Uv%Ezg<>^O8p(s!xF_#+ADPK*x>iD2?9QMI^Qg17h9 zUgaZedQP^Dc4TmNb>7L7_NP?9m$84Gh|snc947vRj6!WkVu)QCIb3#%lTVn_j&}$u zb$k)J7-VsUGfW$W;G$sYkT;XdVm3L#*^{OpW9oEniBe&-D)-Xh{55yO=Nxe4Bqx91b^*t zl?6Bxb6zDslLwh;c|PZDq{T!f9?RIghwu0#B!yCQxX}$;v&&4hH0gogHo=XkMz#U1hyJ7L-Ti~h2r_{b3!4lU* z8pIR1>F|rE|236lJ3f2|PoRM438l}ulw>VMPRy9daClg0#gca;Yd+}pJyq%&KlqiD9CI1hHYoS`G zjyu9yOb)MpLJWL!Z;GB6cSMCZLLkSv{5y%2W##k#Lp!xd=u7ZHEV&9>yqYbsUcl1& z$|QlVD{9$=*{`Qr3EWa20c%Umyv80;(~e#&KPBOqS011Jc8Ip_9s{7-VUQVfk#-Dj zk%SXtg$IJ{l;TWF7rkXBtj^2eeiyY`{QqOo(MM;*8K)_D(T(uucLc3#bi@7DXSZcS zZ$={Vw1+};9N!5IJ&`_UU^jMT98Y~SMN6#6SO$bvLj_{cIV`kwg+_8B2_%dsxG)OV?ZgG*~7g?~rHr}j76x-JwZzMP-nN;?_} zkLWP%7T#;2^wl4CR9VXJ;)4^(kf>z?Y~lA!bv@_mzDUn;MdJ zMAZ*Ht=^6bSgCt>MV6%SB%f5*6qQP3VKC@LJb$M)P$6T6x*0IjFpQAq+g(OeadZ~V zS6}W*vm%KHB4n*7?F)Q4bJ~SxTHs~i60h+#dd(D_S;7fTg(>M*$8L4wiNf!WUVmP=9d7Y6)?H_9kAa{=mg5w7WMC6N4$| zQ&Z|%yJdZ~B+!@-9az>eCL(x4ikGJXzXDo(lk5)xGfY)AsOLVq%nlZn{LQR{$KddM zy{9`wPd&i5Le;I0#TS+~;wd|ij|BOb+mI?ucHt?ag}`W`{xVDP%Jb@sE-F2>Z;d0l z>oqN|uk2~*+TXkXtwZ;(iP*~mo6;-`513>faw6jC6F_KCGh&h`6Qd5@nKI505KEHJ4SNX$+? zv!$`o%VzP+dB{_W&MENftRWNPGT!|Wc)IX+(6v$<3u=SZi~-^*h!su*KIZL^gYks+ zKpTf1b;24Un8ES5qAXz3*Mf2O6`Rh@!enYzD)-A)96IL%aPm6C&-M@cgn+kWvQnBpnX~^X+s&iOOMAsS(ON5CQBbE~2P86oetYk$DrE60KuTs9Hjp>XO@ngm zh{U-A9^YjdlHElA9|QNm=pyp1RG__%XaU7wpF^X@>zZN6QrI6s^&q)j@{d@)dVpP2 z7>Tpqa2%ErJaBAm^Yd#?A=8rBitGADKL>`o)dsU~gzDCo&B}UdBX4 z?N(aVL?|wQ-9~E1CRrBn;;=OGp14V&0fq*aNXwJ}R4D770WXdS)o-|%9fDNW_HoNG zvG@MAqq%o{d%9HL?52A$SBBrxS*Yk{!gzW58U7J7`hB?@l5i-u>uzMbRvtTqT>l9}H|g2oGS(K1 z=Fq7``x#)K1}3t)EvDh(;p7fop1_-}w}ut$#}plR#mk&7i;yOU_5He{2(I2?EXVXxlmf&p-C7Tz+)aV0N^-P|eYNbjUh zJ(wRm@ASEK3=DwA#aEP{A1w5uD(rdX5yw=!?j4v9nv5KT@2yZ#9Os5puO^>%Zp0{_ z%GmLHGO9jXIu*b{O^h7Vv1*4=#y7Q!LY!&4-k+xi>hygaeg0KF)Yeq3Co8GXh8Y9Q z<0jHWZD$IPwReRf%7tS2At}i^@7$N@#IVsOg<+>WR-rT2m^V~f4mY%Qh4hgs#Zc1~ zj(n*i4}DbU^mreEK+%v1rSuGQH4mKiY{uNldwz8#hSw+TGf9D36>lEG3N#B=dU zUC5a_PaafNC|;@W_OVIGloX@7n)83DU`e>yiLwN#YuX{>5ND3;A?UwmI+$P0n8p-F zD$+w(QVhJ~1WB~ft6n3|eKJeiom)f_D#2^?1>gu_^mjqP?>_}du>~^tvWZsDm~LWR zj*>`s%>fevU_`*`l>65Q+2U0230epqbo;4oafDN($*?_tjxe@%>vN zllQKcwf-04i`21I8IyNAp_!`+df06CUf@Xv30hJK(JXDMQIU?OE12_7y{K$vw;eJ4 zTD(h0X}WC)EaVsK2UK}3xF=9=Z!%THqVE8jk7q3^Y3*qv?@M~aWF z`5LSbaA30(!?I&9XXb0pT58g>1p`v$r zya^=>PpYP6PMs9&=o=y7st>)HlId*ulC2|zv089ycpAi^i6)_@Mi}vB@ONO=HTYdQ zmQdXXYf0$!30mR{L>aP1s8dl8?38}W?;7V_OJV*YdSJaR6W;e=nVG9Ipb3@0B{*%B ze9YAldncJ|KU~=;?^qXGD1q;GMVmhwSDt+Wi8OM7xIP>yKA3Rvpa41WarGeg~2?;9IaE}25i@p6VB(`iHm%pU3&YE=Pht$W%2otEJk|BXY+4YQSO?(-LBGWqkvk3nuY0Ry&U9xKL)K-%$32-9HmhiY z9Py2lsK#O#xze6D6*aQqP#C=ws+s{4zH)Ycaawo%Tnd`|bj<>lm8YC?CSYhzr{L}M$11MP>BJ>K$(w#K=-&ADR7|Y51p-tbYG?Fd45H3 zJUrKCwW^1@7ZkB^q987ezPlRP*z8?h9*4BTu$sOBY|Y^ybBS!a#B76*Jj}ZQ?z7^dT~iH-cG(D$CpC@=~UTJJi0BxA|f0P0;0q@5bWK?Sa6n zYGpm)I0=3DS)QCR3TtQVt~x4e`F7MnK9~);*)$ICUlv|I=a}{W#X06;+7pwK=W;u{ z>x2VKT|rwb@oqd zMA*Tm;fYiL$>RXDFD%~E95DDt35sPHs5%ei_l0p`+rc&m@gE-rR?$7Z?(mj5u_06k zHg13?*lxenxK?yPsJ_ze#;j~X8tdFS%jr*8kZrAL#anSQB{2QczI)|-PZ zGD3mnE}&=l#ed<72^U60^5fakf_6e-jsnthO9oS=+mJ&g#m58{6&F108l(qTEgMTo z1CxbkTXwK7qO1>qu!!rd8#$s~Mkmobk02{kk)HzSXmq#L(fDNvR9g)f8;g@pI@W#DVJkE2^3Dc$ z!yz)^^*SLIv0g!Sd{1^Yhpem$u1vZ4RH@wdsfp-j&Kiqe$B)ccup|V2r$4<5EHNO` z54x@IB<^U|tcUj0X}!{hpB} zFwoPw4X)cQXGMzWAQ2NJx&nx5|71O_z}9%b`{Ybv47T#L2N+2*foP z`aRmq_(@O@c9FeAKC?0$h_n~Qv!_USLQV4CEZ+Ap&4<4sgUPnQovT+C{#>_;bOt~y zX~>P{X{;Pw)P|IQo2@lO;_qDi=yj73$WzGKUeXd>ovn#khr9@-M0pcHsSE@KzR#F5 z{+GY=wXIB?$ZasU z@82DdohWO7;?SG!VIH~dl>721>xnU|E>i;HVQEoE5$n=?0Hk=c{uJf0xO`ca6}5QS zpCrNt!DQ%Hy9-hY=x@lKohTS2sCZB=mFxj?r$>RbnEAh13#-h(e`=~wYBNZ07lQz$ zY6{Gztl&Vw(`dp?Pa_t&Gsso?pA(uaOJDj#REXZ$eX<0GV%o20IJFfl>HTMBYt6}n>LC1hh{aAJ z#N!Z$4&FUEF1QYGFfKQMd(go9a6|ZM5&Wj-xoC>Go&D6J9l?Xzz*RZu7@iY;zr$xJ zOOQ)b0}*&Tbz66qwIYm>^X5zGhda3R3mjXPYo($Nay59x={rpYtflE{fz4*ze6 z>{_fcOAyI{i1F^?baKU$IcRPxDcnnX&=oaR0BM~Mg_BR!Pm;V1AT~%@Y#^5@nks@# z{skd%P4n1W%~s1bxREn@U4J`95O;Ru>)~X%K&MA6dM)4FV^{udco!}v?4OtXZs}Tb z&{jb#DIRZsurP687tZMOFYW@N0sC&Ozg8T(vvmdak9hF)dl|LcN>@;j0KDGbnx0SV zigKUc&)(72BiYQsq|%D6fgBBBAg~PUF_i9K?ux8GTtsWtKeJf{RyACc7mp;d+c17X ziyVW%JUHRcIFbh80wM&Pa)sI7c-$584xFao-)DRWYu%;rvDUUbOB6g7SA_>Y%g~X- z)4Rspr^B=-tQIu4;)w-nf!F|LYAogD8EA7Lf6f)X@gK*U%-E)4#i-|)6Ya#M?Y34Bg zE{wb#;<>)@k!&=AxiAPDs%i9t$M^;t?-O$3l=og0wZ4MI9v(9()BDlw@($l!F_e*R z8XSOPc@D;2dOM4EVhNlO3_{?BZ+q7qwl+DhT3{pE13PEVopXU%3NX5}%*bI%MYo z-B;M*QEJaG2Crs$t+1AE|5*t`05b`U4aGvkx@9mkq*0i{oHJO$b{ zTO5to`VP(nzGz|~e|TwJlr~8@re#mIk%+X4FE~&}!T1i0G-9*IJ6(8hl*|+JPenNC zyus|7mF{I+k*G2HTvguvHcIZ}EQS5o?KW_{7mT>UOM3?S+saiU)9X8)A!i>goS=q^ zClPl}9b4#tJJ}+&VY6d!rw}N2 zoZ{#EaEeDccnX>!sA;uP=)mE;dUi&acl`Gk1&U_RDq$fvv^9`s3FpCsJEeHmL3hu4 zJJn)MTc@q&D(-JrlCNy&24>;EAcPI*(;QcXIue@s_yi3r#8yny{EY?n9TV$jI%U=O zofI^x`y-@w)?_jNdnkQ@G5?rN%`Uue`RUY=Ftvo;R)6j=`A80bX#UQ-yy>#$rK%mK zmdNO#4V1WQL?(#PLg^Ke(GLPHdt3!jIvj;lMi+@6hDWi;wCR+kw3b1Ce0;euu8)QX zkxgTNw**;V`L>x~QkNuuCw$A+dzFP0pES>^g8rebD>184~}~mB854; z_CqvSNBfd@ua50G#AN-AzE42{C7rJ-_&v{b4JEOI0>vu?wQJq=1_@e)>K-GFN-?V( zD*WgEI1Pn$Inc%oUWvk_0}n>cJ5D}=?DnejP~1(t6uOgf5Xxbb0}i$m2PCodNOTTC zI9vc!b%xATL$m46#rVEKmzJ;<<9{*#W|xEpn$k!XgtE98%8luWFB&WY#?C(-f!jQndua;ImOe)v9v-ryFVD;H7okcThiWxKM^v`*1om?DCnn4=hs?+q^@4bI@G0eSav8-AO2}5#nng9RG#j5> z>Ii}T4CpgY`A{Kqo&YIPRIf`&2_bWU7e<^hr&sBW7A#Jyi6UG= zW`X}T?#;tgKIV6pAlL1_1g^#;7o6#|0bp@ltz(NjMaX-P=G=Gy+UYs~gW|q92VsQ` zao-y&=x}@itlKAN4k%?Rz{BfNQ3d{DO2w;Y_&IT$vZd?BkKgA@_J>QO1SR9kIW%H9 zp8e`|kRQ(b*MT457k4sEgH%VU)pi*?ozvgzJWtodJPdRbB@_lTOi0mnAY%AWwYH{< zi?Y3$7aWzqHU;qDsT)a17{$n_>204hiVmFuOLBm)xyZyO{wuXLbZ0lrY!gL?;6O3| z+Rrn;@#z&BE$8Ms!|L<0m2ZO%Y2)Y$R+3~a$>hPJ>^^!EL9ahgx)AkU2LE%Y>dPsAQc`YkfjOQj{4AQo8 z)&=>gaBI}sB|rnR23{y-9yIukgBrLVT((hrkbN2msKJ#b?(!L(l>kut>QB<9HtQSd zgiomW1)h~&2BVJpr9!y^*U6m95l|Ah9u}qrN{?3@POi|N$N%bQC1+C;HlxZG@=boY zyd~y*xvP-jR_#RXEa+>~^1$W!4?!aQDi0VZ_x!-c)Zm+mH#h^Ek)#S?)|f^(!b#wfPukZ@2d0{)a@5+`g&zR z_v@g2-!ScoJcVS#!vu?~*>I7T2Gs8*exDB$06jp$zf9`EE<;iPLOs5hlIBOf8ms#T zjXh+LR~98tu3*%Y5kq0;vD%KV8tP;|pv(2`TYa-GrfPsj|0q8`csP8kz%S6AUi9Ho z|1*w=ONG({3}6Eho-M?4p%CsnniHE8MCJTKGNIG@D;xml>XXJ>e|EG!QnOSj=`=9z zHO{dZ-_W4I;lU~%m@F;JqHdNN*({2WXY7AVkn%<7Ys76?fI6IKs3ly7c6>#^cZiGN zwOToSry9=^=i%DqId299D^l#K;O-SndoSxVn@nIv)nPL?urQ#c82Oe1zW8<*X~J5?vClsXX**DG?GmugpJ zOSGDDcpa$({R{Sdz(M0Y`C1v$;j~i`@m&RKv=5NYYrh)jA8m===!Xqr>Fky~9`mzN z?j@uX-JD%BYA|wAcbl+H=8eMOte?5&1qh7!{sAQ4QWjP*1cDOmXHR+d^o64Cz1YTI zq?GnBQf*0U+HrA3toC3{lc}4!m#Xqg3hU5WbE+M_*rnH{K0xi~jX+`A*}48=iaP^f zGi-?EtHuR~H6@XxMC!!}^vJo7CA|D^9Z4`ym5;czIU_rR(mIE*I=Kn(-th;XP6<^HSjeClsWHHGtFI9S{qc4Yo z9WCh-JVh(NIYvF9NjqJoM>lJYN`FM~(z*_SPput^Pr4(f%ig0;6a=C%LmRzD@vD z!t?R8Xz3-``7;IU%oi5#w(hDsv7~~1ko50-RHrrrMC?{s=xEd~cUwe|hb-rh zrlDz`u`IE44WI6nywS5Ne06&y5OS9)D4g;8mQOVRbe3}xR+D!)!5G0EKzX3H+; z=wbg5mUcL?g*S0r`TDFEvrE05oJ)vs#6lt{mRJ&7yLOG+tiIZoD;gswFauKLUquN0 zAFzg;_&pH|YWU{T(e{wqqI?o60_ML9am~zhBan z>}%v<{VEbHy1f4TWx>5MxUXibqQOOPKpW@* z5yRHp&#IUUs~40$SbQGhkjQ_sX)#s_Oagx8ke>?%iR+RnODgxl2}e1Pe$#gxN5E@) zOH=l~r}AgQdy0a$=pvK$3!zF>0wlwB_NIflHKgSUjyao+>G?WAWivfEPgx;%aFW*Z zr%FE5d?k3G;|;M##kAUT;FCX$3nctK_+f!}&HCV*J-)_l0xKS~vt}*2XM+UA*5ja9 zw#2c_w)oFA^t7>G`hOM2Q(RCB*#PWtfn_Loxwg|6DLy6W-Ym4N5EILc$Op+ihxnKIDxSPyn-U+ zkpbE;TmVcm>2L-=}?H z@v;uVVF?V9ds=9;2hbXi8h;P?7%8~fu-ls2rvY@1bDxvo_X>iNQF;44_QD*h#Jn0;Y;2$90c=5uJ%Prs~tw3 z7}2^*Zl|Osz36`@`>4AKv&nW-%C$VL(SO-m-+##9>);PY-t~`vlT(F(*DeL1A_1}7 zQwGYYU+5upMPSO{8L}rW5@N!+y}ms*oqe0Nkp6)!;G+2Xzz;?#LCzbz-jd-ozQ2?i zA0DQdf$GGWXGo}I@$f54^Z&FB2e?VvQ^K2d2u;-O^S^-+_~49BU0Ohho8wm(13@LE z>q~E!H1IvvQp#FnS}vR7$1_;(H~}HM4Y?|o+~!Xdt$>y2=|kkE@$vQd-8opa{2cdC z`vI=3sr&b5M!WGus8Cs)!}`Hkr>%Rz`i4{$JWCP$ae@Svnq~m}$FAoeo6M<4AR8NQ zHpvcNvTBd3xXVs!_b^%W(cvKD`5#sfDkeSoPc7Rm=54A;`P4FJD^qi}Y(6L#hm4s-r->}$w5 zi1*(-D&kfT;3qBiu1+tZP5JzPz}FIi*(is5uvjx+;|PP(M>DBFnPTrUs~VCG?w(Zr zOhbWAmTlT8GKCrhD(Z@`b?RkorbA5|8`r;0y)BAfwe0Kp3lHsndmRj7v>EUtxdx|ptNifyK_K&>QlP1!^jI&nXq@KJX%(h4B z0oOC+>lN1c3gafaM%B!u5ohcNWSXKxt<5j9HP-#I%_?krvx7NW#3WpUjT%@;q`up3 zB#kl9O920!c;H%Dw0sYn1(`9I9j&sNU~gCk{i)L-Mh zMd90q>?{EgUB+wPRvNO4^dKRZXg(1Nk04oj@Oc!|Tz4kX;hQ4Xn&t*kCnF6S@` zz)knJCSCdq|I`e9KGp*xHIjG47&Q=IK&G!5xWr=FekET4XqD}=8`ojpPGuij7O)p< zH}la}H#$*2ts_5hZus@(T{LnKj`z^7{gfXdSsM;-Otqn)JK`cK_r51L(_HK8nLTzT z7Co0F(k}rg&YlhrC3k`H8}4SN^9>msjYrUGm!Ng0NNc}ackRlRpNsgv4ChtTl9%u0{28W1o#A)7;&Tg zAi0y|Dwy?COrHQ&^XdPRWk#ryqUyvq5lCV5P-;y|*@rGBcHUt-nFu@AvDrFnjgLG; zHEji)3Z%f|(6ZFnjkQ8VLXf+t2my){V51Aq(Ze?T_d@ks{qE z5Trq6xIrvb_At$vOwtV(vDD`=ONKb8*kySuMp@JL!M7$bd4k8r4O&syh49>I_bfwNdn?lA@^ z`U1lZ(>^pg5Af38pVWu4G=EjvTI)YAyyjFsVmoE~r<17z-dr+*RMz%w^+E(&@i*R} zp0;{DsY!Hhc^O5e@!mQ`no#tYho%-$8@V-XF+oY-+3ZWNQ=LF9*9w|TOf}?9*%)B& zSUk+WZ?uq9QSu&6P;_iyZm^dlDk?RgQZ=)#7%#jQKWTJmPdc zH0kE}wP0Riv=pgNCwYx^)YG4R@k}S(b%@UQt~YQS^RuW?;Y`-TwFCoh3cSkGZcT!=Rj zH6`QJt8+4soiDpkVP;Q_2bbw1df$V}&OR_E-nkX!ly4 zTZUnJt>#z$0$`6na6jqR6WLDJPkNy|Wc7$UDX7`-0x3N*foioGOUKY+UuSE&v~DXB-~2UzQ1DTP008%OaXL~^dCw2qBp!}JthL=+C7 zKfK2`G8S;SLXsG+uic`2`xx-Pf$~fW0^W6*3JSWRU!MkCo1l1wPu)V04NiKk*j^M( zGbepa_O@PUT;WjXbhYx285-Y18cxxiM4qg2M7T@f(Zs5IVx!7^e9pZ(nWH+gc6#s_!OR|+{*!>!0J4T85o=GBI3J(oX99i)He_ND+63en{g>~bJQOM2 z6o#z1sPK2f4mHi5@%LtZw_Qs019&|9c*7_h0v1DSn-8qNDj2=5KMQ=%i?Mcm2qjRk z9=d4Yd|?w(1@m1m$6cFX7a}9N(QY-uOn`ckwHu*Y{`h#m*!dSE%qspl)YBM6@k>o> zh1ex;$9bJdr(bwQ80o;ZUx_X2ds6LYiw*&DVtejpdl zd(=LE1j}kyh|(9$LIqVsSr(^F`(1sib9MgFXsrZ>d!wUlFdg3nQ8Dh&o&G~_8%n$Q z93+E96fcs>_%Af4e6_ydG@Q4ipA&vm!!wOJ2zRK{&6|xPGyAt6>iqPvkMi54L&?Zd z)SMZ#$Pro#1KYb?Ev^c4O2ODh$QZH7J|fO39jB;|E+@rVFjq4d)iJCcr0guD;_ng( z|9X3^dNz8qgI_!|cC~m&2+YccpWGD~a2b*Hvmdo5ZG%#Bo_05p01FpL zYzJ%IPP?(A;klS(=KvMNcedpWum`VJT=>{DmcxI_eGmu*&m?M}%IZePF}W9~hnYVG zI05mW;XX^FJ+ynZ%xio84s5FSp9H!HDB$WL{mn*(vOLiW6`T2!wD%1x@`~|mIba`H zy3dbeN$h`qsv*I_*TaF1ew0nr>pBN`=M0|BQx9iz=UM!*zdFAo?Ch}YyCDK-(9ZECz#<=K;jRqH?+1l5T47SlO+aT-~JQDNyh z)@I&B8g})IMCyh-1PSVsVl7a`W;-2U%tYE^M1`K0m3#?W0x9O!PMw8FCgd9LUhC`N z9XIU5tG5kJYDOnu^MnRY#j!-JUg567a)sHiE6zaH3LgxEXKC1L!m3xo7VPWY;9JUJ26B5KNX>Fa|rNWf~Br+g%3Nb3%P+8!lM{2K0R02I!27NMKyk#9=-H!XgtEwAPK-Bl3HG;1i zGA;Xr17MHrf46Zmq~l?!6gS}u|4)s#fVLn2#Gc(Y2D$V7FMmA$ClNqRxY6q-wQynR zCFtG|goolXnYk38IDXYHwopvY*$L`BG34=XjtUP^`@)p?%49?M{a$%DxLPu|=#yUd zK6_)g0{|O>STUF{6uNnLE(YQtkV#O`ML!QDJ4Ga`S^P710=*; zEFStFh=s@FqUSQC;Vq9v|Q*?StM&LzMx}&X`sT0uY)0Asua$o~h`VEjQ3y zn(WZtd%2v>r1N$_v91EQsbMAUKJ|(YjAmyaJmJm!_~@q)yHF~$l`u@z_&Evss9@TR_KvYB({-9Pt(-b#^N_^n zWYWY1PGt=E7CQ&kzP}G&G6fQhiEy)8*nIr@njqzKXBB8pS*cnoa_8H>$6WH)l5zGP z7abzGwjlB}RK(kQVevo3ukcJYZg1EyU|H+{ajPi5_OkXhw}jv6Tx%iH}I)(Iey_o`AcRaTmi z>f$tZx#od(mP7c?=Vt{!5MMF=lmBpmy+LSe2-YWF3#_BUf%pa3Vh2x?l-s`|nl5mQQt_%^+CKTbSs7yi~9~m6ht(@=&s;k&>R6 z?pMgpknG7m4kG0}-y%$<_zi(=Y8@+*#1a26wm`9{ij;gD9qGX{1ry9L3R)lgoUa<| zPqmmIP)$H(MY#%=&ZQdK6!6(@XnNT%i4-)Y=rO^D^yRE`FhvWSg&ex=BLOU5NYjYr zv;)4Qow~m!eI4SMeqTj}49Ui^hv}|MFS@Q1e}@lJ8idm!Cvuia+mp6Sor`FHKE+ zFUDR49WlV}Hq;gNHS&yZye*lN(}%Iee>S&aT|>A?>nn1h(gEPbY=MPEr}w=>+J_8q zJ9s$;{aV24fIh|CFT$Og9O9sX*eaU)P6hwcJ8>% zJ>&Yuy2U5sB+ogG@7h9`RAP>&kBs?1?9)$ybE+Vy__ZnMJ2a{vfx)N_)CFuzc^mL5OWHxy2u)>XRr zPKRk1+eifP9;2ZTev1jgJ1ic5_9IysdlkLa&$vZ8eE@LcqFR`{EM%|YNC!`^4-G&^ z;v&>;q}q+ad(Sm<0$t{~6FwvZB*w&D`_T_YS9=_UM_cwa0N1nKsSEgbkO^m}tkrws zty^O7O5!@^fuQm5dvdGQP}!){^g-21&I**@D4`9rO%g(JD9WS^TDg135qP~))pGKe zgVAAwARP#`9r@<5MBTb}P1_fbJd=f`gZXgy)z7I@i%^MH+JlsBk-jvJ`0ZFqZ1$M4 z?R@2s*MobOm!%yIo!df;vy?^dTw`hFIlkt0U$1rVBRBG5_CjpNL`pi@D#dLrftpUt zu!Ez;8xls)?%Tk|XDaw4Y8)|;$2AodwtCcOu4}@<#n|G97}T!1gen_tO7;%l633|R z2Uwx01ekHvzTny&=4&=t@TC`w#P}j3SJLTJbV#Rrv3($cEPMWznFm1vl&A4-7Pd!T zwj(P}2r|WnfwL7-j)LPRnYov9b4u37DPx%Bk=S3BR(K!$Pn2}U%mY{(7BNGnu2c7q z)8y&Th+DWjXp7SQ*l0@s$pYI2Xoda%nD_)jYNFniHW5@PXY&9%vqPp|vZW+q<|n`0ox3Rqk>LKXoh9|0!n#j=51G0#d5HVWkU zPUl$MMgs%Of02kv+5Prs0=|nk=^fH};ICt*Ia39EuGK93_Fs7_S9blgJp8e*y}K9i zF6%S+XgpT7FU<1w85j5~kH0NI{G^{5l@E;g9mr3ecWKz>peHoKWGxt)KAs)G$pHw# zYe*H0>8`lakl>R6z1_p^lQyX}g%c+<0niS&NIkBzq)CDAZlg(IJq^w?f7l|zC~Apj zwW`xVGqf$;_Eh?D&Zm|-IaG41SUe^hXtRLqCl8Y5Ib;zcVWi4k*&+A3I`p63pW%V1 z?ft!W@+bRi^H!L&a!2Y`tZhl6}J5j~$_KP&1zvJdgqWe}ZgF zT*!{R)A==$8ItoEzwwjaH{MQJ`1Z8&R3xgn5+=K3_a8Q$5JY|_Ji1ax8ba#p5%PwA zLP792K)rZ$&DhFX-rj;#IldnGDpW8a$%ut-Vi3%HA*IxWUg!QKTq*%MyPdz4CLfd4 zGwA=r)J2y3Ij`skGHC7)Im#?#VN-=UF#c`aG&lLa3FEdN5+Y4Ul1?TDH4(2 z44r$D$KHt1<#10<&mZb6a30%z$0Zc&L%~3z^TqX>Zn_8{b0?>LrJsZTKAb_KIZO}N zGGSCH<_gyEdVVVYhDqS~zo7Ah66wfG-^QC$9M5X)bj=qcwu#RwLD1a*(mGm)$u?P% zytf9@X5#I`c80(Z0C{sJRE~ar^x*ha?W5LK7)lJ(B<{ufaZ$J23)k9oIu@%h5gvjP z=dK=Otd=_ORALgc>hRKLv=3G(@?3J;RAA%TdnPcPTVNZJ&ksF;eHPN35 zG4^0_#g%qB+_$fU?Y2#A6q!%GIu=%1;(mWhY4lqn=rVo|`CmK}>YVcTuistg4SUWg zFWVJ~fx6keI=wn3#7P?;i3zW43}xcL998TEvd-{!L$3kRh_wrOb4`|CG#ue??lBu2 zc|PG`E3PYw7L>Z8Y6#mT7k|tfSV_}vsm1s=K^X??UFOi3cicSN??Y3D*`a%aKmHhe zgICCJiUvRgo~2M`($<&(aK? zR;^nd9*;;;#^?xTBzg469HJMHyaaeHWqYBi@#9=dDy4WPnj?6n=(^cjpB^MA2w-PI z)6<%z*B$NVV%NF|^Vv7o|39c_;Xx|A$sOLRtvUb+SnPG`?&3v z^38z;_@Y#k)nI>#YU1YvHC+8-v0ZY@&4HTh=j)*qEVO|p&&=>ZYfDDVlC%)*c&^^0 zS!~?dp?fW>ahSpxOD$@2#gF_%DsTc4@Ml$<-ePR;*!$9Nuhlp=JQ4Vabi`>^Fm@z; z+AhHI8kHQWtEzFzfT%M!ym=4SXk*X`kD7A)(#h0ILu~nyUvM5nZ2NOCF^EBycqeS6 z9xYCs>cRt)I>(K+Eh!<-c~G;#@_{ z!hxdjI^mMEv0~WQMWi9a4?z`jTy13ZLfasPlNPbYZ}8o1XXPW4?QpnCVeCaS&QO#P z)Bp{YfA|mVy=`n6`VHB_OueRyXBy8bjuw=>!&;Hog=!%ASP13b-M{O9X*OYVogK~0 zCx-Vp$*)fofvG4oODLoTh98kE7r~R|VRhVNKqJ90>~?rjhOf};lNgqJJnh5C_1wJb z6nasSyzyc&;WgP04-s$qw*=&$)`eBUJL`u=uK4^By&eWsX#PQm{`sGL*&a{AWx4O9 ztKifN;OUV%)Kx3U)``~J+`gzNW$=d!N8X{&N0DL7q9fG05+UvxiL_$YlKZFGOHB234KZ#EW;{s10CTDB z17ni0yNC$>tWe`zejcOF1omqg&dtQhzLX5T7ib{%J{oh^j_xnFj2^U=*tR3y|PFjYG1_0F^Aw}bO zDhV+Ft$?f`RtQp2sMU)^lt;SI-Zm;GpRWdtWnC{w9m)80*~rpqnTb?s)vQ|i zo-!|b`SGltb^O%ze<-yd;o%BIfJLqP&K#0^?|*K+|3c|lUpu?2)a4!wi2!Ks)ksE8 zYIqgw9s7Tb7R`u_$q61(bR^fpMX_Jo=HP>&}@nT z((HC`!DWT*T&)36#b_-cz93cFb(ezFf1(2rP+dAWnS?*-<1%lZLT)l>aF^Rnk0sMi zp=!XWw%IKPlSunEuzlc+tYu@&4JqOFYD&C>S>}JiSa&7W!-&cuB#+^Mr})8{-E%p1 zZ#<_qb(he#V|qhd^VTu8gSS^GSgXttu6Yk1=u6S$7cP!=H~8U zuoajFi;$tBtiDZDx&uqKsA3>u;*$Ksp2LsHrsI;*`G%pQ8uJzyYzqBjw3<_6)-Cze z2nQev)KSP%_4Z?|m6jH+jnd0+I%^a;gUOj^am(rSS6JzJqGVQb*!j{}swx3q*!KP^ zT>rN+d7}E>S!pXDeE*rSceX_6Vw6JedcfhFh$O_Ptk<;+8V%;!tt~2)OoYmJ7SXsE zI~Eg*@<~>Hx$LDxvg4UZ8>P!Ktn~i-hIM#YA=XSU6#-uaG4>F)%oEaoBqy*x=Q+Mv zE6e2l{9w*}Cu@oAlkjtW^p;OG7XULQYsviu=qNj)X)tHZ5})*R{$+|?lP(ZrDZcM0 zNTR-=y2T_~Hnl~Tsj`v+m~q*;%$~)IH&d*r#daJ8$!fMwXSV8=Aj~P5%7#@Za?T-% zHe+`eJIy?fnn{KIU=)_Z{;k|$#shZmiL5pbh<1)Uu?34uX&ucoZVyJ}F*?lhO=o@55LEGsycRLAN!N!Vq8}sBdVkvD9 z->)GMP^PS!RC&Us2SeuGAL(+*VIA3}2gqaUlXB;FmHZruU7iP(AN2L-+Ku0ZHaT-| z@5z?UZ*H~ZnN_{a<~bwI9VD&hg^CJx4ul1CKyi@xIz!V)FGfLSygl}`(k_fA1J2_* z?hoVs033MHkpe5FT+|6KN6DO2s1gnVEtmO)ai}!d7cfez=_CgImHb;+9UamiR;M&t zfZgTK*&|-!rSJ)(e6i8TEQDK1Suwt$+!}qWH`TOf;yGY?1a~hnm8r|4Yyw`O-kncc z%Op7=ZaL}~K41QVN=W)R)QWr$3&M)V2F9G0=wO`DgD5tLVfcK}p_7!*vJ&x2l^oCv z5g06y7&2wmV`17NQ{3P*eJ_Iv>O9L)F>}Uc7Z9R13Kfy-r43c_V>+c}oB$(CO)&e6 z^?Hsd-;DbA=HX7sVZ3Mw*x)n;w#esBy*Ep}K(cGDVWLZZipGU*WYH_F)7nJcbT^Ys z`)2B}PrZ1*@a;e>mnC4Ef3*|9yG#B5RS5*`*Dx0JF9cUhOm~!`w+*oxkUFWGLN||c z(r>MLi#HA|P;x$O7CbCGg+31y6a-G61T_B-b$9dCG+&)kW_h_dn^@yd?Exa(qvw8c z_3is!&zd0pBj0ZgLZ@mQ;f&c)n@h-r4d51KbNCSu+n5hhK2_^fjzQJs(=@(Y*;=tm zWk?bJ*4T^YNdRt&j^KY_)5z ze0&MkypjiYT8GyVw{B~x7BN!1Hn;0=DK%||PEs{8>p!yP$+fE=nf-2G_mfwCwQrYhhW z?Z+dZY-^+(Qo|jyAw*gK`3B%ScBMw^eA9OrT^X{M{{(szGtxr3VX@<=-3jV!F)fzG zF_K~>H}8^h+CirCV|0b%R#`(xZKKG8(|X@41Njsg(x0@mmZ1;S5+X zo3`c^F?(l)t|CgD8zv(D2guJxf)cb9NQK|8-B}4V_?CkcQp*Nq9j{l28yNRB=gpl| zrf}?xjF4b9mFR+?;%6<_cz+5k(M6Rt54FH*xQ_8_(bmn`^)}>RRVVao8syoDFfc36LFEO8w>>g#yKD#lS{PxB8p z5oZ5U1KD3|?~$U-)}QLULi1l@aqcJ+9GiXAJdYuHeEHKtn5{a06lyWq4@a2a`Y?0~ zDwuE(n6iS%K)0@llAkW5_4!`i>@q-F6E9N9f7lD3CTpF7|Ek;_*aVtE=k_oJc5YDfS6t>T5NKj8p-`Iyw7)wBIiYKFg%zss^4kpcJdachxcC2H;i zjAfcXx4t+pE&NiC{qg_Jf~^2 zy!fENuJyzs4tv4o4FESH%^zaWbA}mlD8P*)ZiEp#zKsapB{i9;+iYMH;3*c4zA}8g z8Bi==z3(np?BdUjV^>bEvh|XezXZNhT?!?Ti*M zb`n(oo|(HdC*B%bUq=y&q+(&h>r?udY>DBVIsuV%WJe4~A2>f94Y}H4KV9V#eX=8l zc3-L2!8+&Z7*kX1P>g?-O#FzATL=(It6J5_bmK=`eIC{=2y{+2n-up?3jC`6rb4y< zO&)M@4xTvh2h)ve5rky|zPoq;A9T<7{F4r^gzcr*vOwHxrU#LU3nLBUTt=~_2Trzz zTmD@DuK#Z(Lu~%u#6;z(*X=3-C+{WMK7Wc1*8!_z2Ua&-#l9O`I_ zlV4h!IMvJlQ2%NGC+l1PDnwxLDXW@M{WKaNE0H;u0sUymw_l~Y-*;F=7Cf@KNq z%xh!g87?3N`vip=HbI|dXs4SY^S6r?(oZdTZ8Z5QMv;;S4#`LHy8&pt zoXS(a*UUjttA86^ImuElNj_AVqP#CzVJ>U~tK{4#{cmw0*uzQ;dDJKd(Fz?PZrA2x z$w}d}X`4j|;*TAGtsM)N6O^&$P{Z_=%p%YK%u$6xCYQ(_@=ZP$h0JR9myANm^Yj1D zSzXd$S#yRN4yrKp3$L|@72fWF(Rz%Fv{uB?yXi`ab*c2z@mhLFO!`H-nID>{qweQiMGvIc!yhR>rVw&aG z4YFy|@$}`ji_+DKb==qZ;1wop<^jmI0TeN^0KVR)(~;2FGbXZQzrTTL zqkAz2if@6$9J@YHkTmF?$$-j>*#AeizdhBO#2kq-{Fs-WFYBFZ_Ys!N96)Or&;;|+@nB5%Nd_u zry{Q`^2M5o=(lL&}~@HyAZUY~7!B|y_n<8HJchQMW&6fK`B@^5FLnXy6BqBHf>@0x?f;UO1=P73% z2>Tr4LC_t!Cj@1hKENBL48iKy zzUQ_f<5SMqYV1?7mz51R8BV}dgF0*f94f_!auD&KgZ%3(nY!@>(a1GyX6*HUzWF2< zeB~g%)6Q&D-MV6BA$0~6ids5f|KrZ1uFSi_^^!u$ya@gzV9tV#1O>TYR`ZcJZoIp> zz25O_(O@U@pRZFSIl)?Y%-Q|cR1;<2^aT8x`jmW@?yWzMwAR~=?l>^2JAjRzXY7IfXVob!rnwblZuG-ye|ir&^opk39JmTZelB9ChGf_%{{|9x)01 zgjN=KWRvhNU4&xX$`Vy}?|?i?LPYT&tbVDWv?ful2QntWeZ^n5dEV!D~A!ns!K2@iW9C;}^PjnS{95B(p$M!DTZ(b zwVt9$&>iTK>t3jS)cMCFXgc+bLV{9;u0x;T+n6*Xve2*Zh2x!~`+)D0SN8uqZ3$w& z)m^@w^oy`+Ufm*^(ONCo~XDg4r!8gu9OYkQ`)G}Gf&isVv) za9S_FOrSHv#}~;h>CRV4&7f^;6#mA;DAol^frd$GgFQ5!;1^wZv`0bLGY6|RELY(M ztj`ZKkhN#wJKkE`zZLuxV0M2Gu<2}~#Lq}lxHwwA3s3=8L)t6{sp1)D*?r8s^)W!c zGA!8#=W1=`^MpJ>!;afPLnZ3nG7!drM(Zg8kG7auJ_I2q`E2VdIpFEL?zlrI#WoIn;M&Xg3K@or z`CLCHpOj4gB4G}N)ApV@PEk6aPTN^GLBxZ7zn1Ly-dp6Hf!Z#bh;cBwrdEZEPqPEM z(oTii>g;=*7mQy0d4-c74NY$lQiUQ*gz&OE37EV0H9p)a;EP{A;Q zt`!F)t<65z-94Pa2qDj}?eYLyu)w{qdrcx5_f9paiQE4vy+wq}VtIACb9}?SQW@MP z?1YF~iP1;1XOG38A|?`-+gkQTR-3Zx$_;o)1-c2=ueTn&{zStKq5Ey!i5Spz9dYHA zJp5RVY#2z0T@1raNScwh0$#*z+&%|ig>^M8nG8bofxGpR`()oTDJMJ^X6mcLks8oE zy}naeY>bx`fysEjjez_`I5YE$`NEg6tIvAC$iPT&N=$!mG8=CYFA$tuZt779iMQSp z@XI;+@~7pNvU7gHNc0!bkT?G+x^v%g~h9MW_zhbJmvnuA3Fe`SP;0J@_%^3+G+OzDYIP`ft= z2QxmAT5b-7uoQLES>4jZ@R7xQSL}dyZt5da6{M-m>FumZ42MCKHZw!lWmo{ro3}@H za{24pjpu%t2-^fNScO_)bQ$eFwwWMF_)l!vY@#DCoWU#i#u}*;xUNaJk%Uy z$((RVGJIr-9kfa^^3J0e&&gUY`TqEJ3$9`XLvtRC>fQT`!lwb81i^IFZq>&88ca#m zu&%M9Z$cMYC#>DitY7_&z}l|**&}$b<9rF$-m`lKh#3fy@XM8wIJ$Eg&^Iu(Do%>D zQvjb#6I#almpRU78a-TKXJfYxT}rGcN^DM+mrxEyq2#>pZj_&4?vUyyGP_W}u8F(yAB?ocGkRDOa|c9#A^ zTytr+v^0Bd>pzU>tbnMibDuv~3}p_)Lr%LyW0YbyqB0L(t2o^p-3O84fC33s%J~Pu zIveRQNI4Yg3?pBc@Ij#`rH@eMh?nsu>8g6YC{b-%e0lRY}MaTdFzpCA*LPdyYDU8XDoL7IsH z=!AMOZ4tZtXQq3D4>PhNZ}2QOa{&qFT*II8ls4MkGA9^>?(^r`@@&bh&C^CW!ub%XVxfo-{~kSGem0U z?9vAIihdCCurx|A&BV7j0c;n!Hus9^|5T#?@#DrIV*t=^7_HI1a@xvEuD6`WeH%*R zg{#eEx^_RsXjr;dT?D-{eQv#P-dd{x_0Y3o$GPv400j%pozU9B6O-gO=1~&Po-awo zqn=ci0+GPS^-*Vg#E)Wf9Ho|I9AI$^P-Z|W-79(IN`&NE(2?kf8h zi$!jGDtJZ6JfI-xD4*NzFpAGAsuOmWe4XVdy5|dev5imIE`BzcAB6_mP7-{y>C_EX8TlLiNkt>pjr zpkzzB=xs?nke!Yy_mHW^u956o>Nl0lYs;18JJez$zYY)%nFt($J z_@cqld3Je7X~^E0Pkg|I2z=J`^N1-Mm+q3j^J2NBkfhQL5UR zbPZNVhz16m`Gu#?C>6#jY|bu!g!|bPpU`Jrr(exAw30;#mrpK>ZB9w}D`t)VH5Y$W z1=PEHkC2A`!mTW{2g(O7Ce=or4IkR+cyNw!!t7F@3l)5kV&29->H6RetQ8dipg>>0 zR;@uSR0waM^004-2YFGSsX*ANXs-GCCG?=+mt92s_XB3albs%M5nXG{3kKI68YCs2 z-RRB<)>3u7@gY(m4={i4jjNBSuLL=t399x4N}Ed3(ZrWhD~1Z{+dmSS>u-aJsPKsp zWo^5ZgQh&ygbK02FlzawN7MxF7D@bAjJ+8of=OVH#KQW`z@;8~_VGU2{ysI;$~%sVmvY&%V)AC`u+kzT#wpw*iu!y2l=xM z`tc=EOYL|{zYxn&chs%hsvlvZ)q8WMMe+EF$Mh1e*TPg46lKk|olrKgYLyDK{>qc~ z8yYZ8O5VRRQ^JyiJ*1>y;E!WU^6>Z7?Al^B~+Ju;r22xMS&$-lRzcEQvar=`kDJvFdHoSZpVh8#<# z^>wwLUCp`)FD+<9UXwkrQ54o_z8@|Vt3xMqhbp3UoiWHzp$V8t%8Z{7ToR_c(E67+ z&J$C7g6XvX;2-uZz!?f8s(-(|aj9pQ1Xs!03;x|8rkeTR(VxTW;|9g} z{Fi)TOd#KZWUa#Wj+75$RWPs2Anptah=041vBD?>49LLp7G0ZFBLU#vn8r}VBg$uj z*oX}a&2yJdDJfn2`xjk&d;1~x3a*hf7>Xcp3Ou=S@%b0-N%e^mA*~d4E?$GtfxM~@ zEBF>&Gf=n*q)ayaZ~1>}Jo*{+#DgjMB$jJ_W_Z>rL>9&7Xj`*hH9C)@~MrYeD%97RTxlS%U1= z!f2W8qxH3GMAX{?M*JdAQN#Rq0XJAXwS~sqUVtmrzU!xL=h<$EFo)$))mBN zi(`BQiLu|t84%OXd@yx_Gll^8RjxnDBM7XIZ+CLF7`@)$%h?f&uE{)gr>vJom3bUC z9sUCIHw%>Al5AZ5(hQrQpcMfY!b*ASDdf||p*zRdBFR%O@tvkA;1OWP1|_}KwRSL8 z`~X|SOMBhl9rJyk5#%oLn9TYH-bzmLA2F#7QG;MHTMYv;Tx;D+p6e>W>yhyfg~;=y zEN`aE1W*6)I<+;Ia0rkrZgz_;C^^%~MtgeBK_Z-OE$~mOk<=voAi8L^@zkv=w3_Zs zcaybHO<*c@bQg0R8XEMoflQq>SKTkMnym=hM(MwT*hkoy@4u)o7kIq+3He^kc_jmr zRA=6NPA)?|=*;K!Nb;*4Aq1=0kwjB;KQ+Fq+MkpR?+V-v*IoE`Er+7H^fIYK2t=e` zm>JqXsWrL^U4r)_sXqm04NS#4%huHa=_S;e6Ll&17wE$(#k>I9?~V zOmQa}mDmG)>(;zYm&1cW{n5ij#6%gW$dRhCQhL_o;K%fv5t+MWPz5oDm6ovVqA9Iv zN%x3cUl(+_s2OfVPXx1a1LZ@mpR(HMS|u7#kZocG1Ie>2w!an20QzD+=hYRCmu$>{&H58D$ENpA2^~AqNu4t2KB6pzpPP{)1-1AG$1v z>)FM|`U$^SN)NJ@U)xYNqkh==9_4vVz9a?GBMtC;PIgy{mKXdBQ^8hvF8biGKO)iRMkxe;)Ky`Qd4lxsORp~BPPyD8}=kHLjZNCPrYR7rtg9adv? zq@>p)+1ez&lC{I*)ZM@A`P0IxOb5rPr15n1>+zF& zkvcdPdACP_oL}x}p>~@>Wc|{tj&28i!{t`U&1yWV;1n3rxAvh*K&ZmdEn8zM_XICe zJNfCcIF+9b*SK9A}1_grxcPUAg9Y-mPzF|w0oi#$cl1^YvD54P1fAiU#kWjQ&oKt_I>g>&ek!x1&zr7E>HkN`60WyxcQ?Kp*$m`teRA2#*O0Px%-RN^_Eizl2E2aUgqbEQb4Vf?C)HOeu9x3h5s zko)$PFWeOM>TYIM0Bq<){^qK*yV?oP4v|?gBA%~9Lm| zd$k0j>4vaNqxb*HPvg7rbd(W5L?sg4P~60$mHUZ$Wg?!FJh?yP+4P`MIA2+9rDHd> z=cUaPK>G_XY%x2%hJ)F)Yde;@*;R;4OBRzBiELMy|2RbXVtaBMwTq?rNz>|J=QHZW zoIS~Y)sWi<4#E3v7=mSNyp#mmyUyQ?QzH6mK{D>YlRT}k4dwF;)CU-%rW6zR{4{nF z!)tE78CPPeqz5WWuIVPd8>=iHlf9pt^{xh82Lw^+I(%_g3}+{n$!bdx?(QIRcN}c? zYJpq|(4uWgLvJvwT<+nzSd`TA5wlUPcqTQ#Aa|X-dFt|xXo5*#f!Qt9q@Pm)n<$bB z4zU@lW8KBH);)J-Qeiw4^;h@}@JzvB*_fZ(1UdVeG&RcTRvIK{dWXNgKuC_ZWQpW4 z9msiAeAIC3b&T}hV55~r`S61C;u+>EUq5bu^+;_QmkCa}b7}$Hn>{axEnrW^T@=vJ zw-r@!*nKK>o?9Wq#WGya;|-w}3BQJSNsHzqP`(mSVXD;q132Qjsh`ffw%` zhcCPl)v3~+iNk?*3TZ1!ika=5O)NS>lvzuM4b6Lsv|J&*-yNwmD*W0(!AR$kK2~Hm zN4&FRewf(3vd(17438HtVU-{GGq z6J>jhxR^=4*2lHQ`}aDE?f z3)`%dd%17_UbKUMFBoO7N9=zO;0V~-gFxv*^0%gIBRz!G0R>j2Q695w@Q!Ru>cJCQ z&;WG{*GaAG=bKi`wDl@`Gxxpjyh9Z9o7dt1d0@dl5j|8Y#fDM7JPRit!0TIWrS+MW zr(v~S$Kw%zO}aAaGfqJjgIJ%P)30fW%ugi6Izt5_FdscMk&fH3j_S5sVbQDm4ssw;-;?02_Rhl#Xflpf{Z*T~@ z35GDcOoR9UflqFBM`YR&oXu{OBIuPR-`)t2Mv=Ct!hgx#{fm~FhJQ}#J^F67ycp4< zkc}%D!0gm7J9P8xhDu?%rv|2n#LSwx3fB@0^=fFZAO`ly|CT$^2Ud zA>npwpucZ^8)!;gMn2vJgx{I)W>C4ok;h1dkvue6u}A3~6xDh&KfuziyV%~pp)Dwo zKF8!1-|%8O1db3@FUqsc!dzOU&JcnIQRI55l)*1+KbUFUbiPCfcwI@D*;+q=L;{3| zVK*Os6kq*92B(YuA~yMh^2vDHugx->Rw5vA!Ex8YPSJDajyw(Bq;8d6BJ;d?Tz?vp zGFZ)%`q>h?=xg-{uEIRz(+GSYyK-i53CKUytfpy3+=+53A7%Fsj~V;dX2nuql=ZXG zF=?f7b7v(u9gZzM_laL{U$%KMsrU*-eFW}Z@jpqfM^~GG3Nv@@oE4OAf|drE6%QPo zPxGeF^l5!x0qRi9#)?gJn2(y`9}V3E2FS!`G|k1bl#h@Lb2IIJzA?6qX9{%EDvRAm zHchvc5s~RyWOa)r`m7J9BGHYw$f8Q;b+p!Lkw#Z+4c?M)PhslzYGWg1!R`bpvfH6T zMxiV$^}(i(-*!&y3Av97C0Ag59l%Eihj`by!j+g_IL@4E!S-Rs+=KD)@gJgpa)mo^ z0!*zP>`H`ub`P|#?R^z_0oAek8qQ`0o+UKCu1j&r$?nUn!C`9Jb8^ngG<10JaR-ys z&f34>hPH5~pN>Oe##BGe9y;WdmtHdp>Oo&d@3ewd^+4J z!LGf#d$$iFiuzB%d}`t8HPn(dks=CzdTC+-%kGhH>N(q#0M%MMigP!~;5_=I)X{F1 zo1c1wd=gr&>wFbPk4%GkpL+ESUDIwGyxNFo%1EX-bsz*wU* zO>8E9LxHq2n1b7T@fi~pj-bvbKugXjdDT?3O2YeBZzm-y?z|s;g#@xK1&Cm#+H-N_ zG$MykgBr0!qd*N{0^v2MHUEbNVUgYTcRLfsu*dT0GSt%dZBn=PiEanzN_&^4sYZ>G zX5R_r8!b>PQtO1EoKF;!1GPj$P3L6z|Lh0$D9b6Ld z6QNTlmYEIdeb4@4O_gJqZ?IeSPyOTco7M@#w{8sJDIT<^5h5^txvEv9R@hIeq|Mq5 zB))T0v@tR1AIP)61T?(jVyQH27~rJWv6XHG!dl?wXS@ziSMP8BLpEY0>wn<~<-$ZZ?7|lCfFe*?Q85u;;sJQ= zQQNpJLEiP&(b;$*xkly@_iU?4bfhNE@M?{Eed5QN0iKH9{6&|fp>@IbGx2-i=px2Y zBf*^e%%DrOI0v`0H|)r8r|)ObS*qb$(A(O#{Cygl)6>8*g=>Y_sB>-{kHCPo7y&^#@S$9^X~6x;*1~ZlLovz< z9O(j$3P#>GtF3aU7$24)tFxS5$M_bFKQn2PwwG}fAR1}&c5w5-=Jb#=+niU8gV7TF zwjTfO7hgmN+1z%Ymse( zLE3#U-rt5X`#qK-&L=!r`O^;BbsK*7FLd}ic%}Ec*@pF08^samj;?8Z$ae7@UO}a9 zd6@5rvpr5*e1b;HsdeC-)C^N|>Oab(@Nt_K2`7tk{C)|WvTju#j}2rS{f zm-ncbJ6&m^QSniv%ZFMcsHR71dZ~uofx$(L)m*b%Q0`igLjN@@nPBYOyzmlbUrjGg zL6yCejUqsq?Po^I^0F?s{h8ot19sx!go&QU5+V1zDEql}-qLBAzOCheXVSC2nvW;T zdP#z`;q(c%ij_qyd9)?k#;Af<%P!Ag>OOQP zCeR#Zlb$g{0lR4iIHr_7e0_F8Is%|($I?~-7Z-+eX6R5(E`jH~T&UC2CQX{kv{e3U zCScN}w*U}NA$66MSyYZ^clqm>&76eXdH#5Mr4GLQIsWE*q9!Sh?%q1@zy#&;Nu=iG z@1M!SiMJ)*p9T{pOoZW+Thmlq)Pj@VZGYnDcL$XIkYUnI&W?-9o5Bz%>y`4Kt#%7K zLO8~s#R+}mLyfagF&amY;{-!fvoG}@70D2~@=LDcC+UdvG=&@qbaEt$H0o;66DOd# z9D$fe)p9UV3Nl-!yXv5&`kUq&WD zb2Gl!TAucG3*G(t?EesP2fXxy?z8_}P(~E=tRiJXpflN4F<~ZcGzekvI?0~Wp8)$^ zyv2W~gDa5@jYFy)oEg{Om_;3Ti*(JreddRX_ZTImP4~`w%me{YUFJ*2Lnmn{A~9?t z)FDFNsMJ04n|V6K#1jJWtx~Mrw0wnxIw$jkvJTUwvy$eDLf~h8s?Zy3UJXv> z3I;$E!BIW9*u(qk->1xEA>Tli;Z)Wr8&uQ@@5FvjP8r%)v7qA4cM4~8klJ1uju$6$ zfE3#DPil?lh3H%=#W{)5NaR>9T(<*xYN01&VZfPn{pieV6kcyZYPME!K$cu9PR0P* zBulWNE*67omiPvbyDrA=vwzz%k<`BeN|1OTVB)B~vC;GAo*f3)PyEPA1!vW7H-fZv z%kIT*!7}&ZbyJRq7+bmYa|vPF8B>gWL+X(?fbe$?wA!XyL~aN$E*9UNzwr{rqub$< zKpCAN^e#1irJB6mm&V;zap!`&OpVR<`^wP2tnJ^ap$45F%IEVFGiYgTMA8=d($3%Ia-tbTsG@lUw?OvWQyln-Z!4^CEjFVqR>9h zOAdp)a)1-(qvA1s`xm04GJ|6&9W6*POZEUN$>|_P@{$sM-Uz5Xy-NhXtukiERVRk* z`Abr`MVnmyI`~WB>A=o@)#-XCwf=<#!bHd7AuiWhca=|*s-4)^*<1Ij%7&syc3w~D z(Fk_uerXPjGlgXZ<4vl$}vZ++qI)R?)`oSx0h zc5#yy)aDh{R-{YX(WEFGn3j#7TKCT}rDS}5i}UX$n_`vch3LbI+dA}uRYjNytRnB1?E6)SU;nO<)lbs?4`~_4=i=8$=6xM7 z2n6<{E%n5OjS2(_Q7R0_5bjB5b$#;DtHK}g1qAo8Yo<&@ve8$g6diQx(lj;(T3)i_ zV5`{NG0H7?{-#7a+2A6mtJc^oNq!N}istoqZc>#hMoYol;wgL`;{?>XD^tH_vL8=s z>XAip^ThzVb}c39`LPF6FUV{ay#HBn#9Y2Is$66Nr(Kw;Abyk{DO|wzl3gZy?)w2e z8G{eQS{swi!2FvmC}Mhzrz7C{_ju2jb8ksba^7`VFiqpg<^8mp=~>kihu3B*nzf(W zbk5=7aXdUeqOanx#3GQ4K2~OyF?QOFb8##Y2F(k-9&rd5=Mj%30Ccu5(X9J;HzG*M zp!Y=SPI_#izCV1I_%1ivqT!B>8&hkNGZ;4I4z#kyV5?SE77;|guIBc)GSlhtbqL}5 zQ@}L$F6GPWOGk8TH{;Enme~krsE&>K=OkQ}0XZymb~2cZvRzr`-}aoZX&x0*5 zRZ9@sEs?dQy!;4>^r4E6sw&RfNR@PXy@@V%ga|`#5U}PBIxs2x2-UoX0oU}|k8Jw_ zM+;DmO?X*fR`FOEY$H{t?#qB>hv%tu3bVIjnFx;aWv+m`Bq02+3VGVc~pG>@#~b{32!dbZklM z9SwdcpCR=F8-r>@Z*)?iQHv_Z1v_d=DPWWVEC7r9HLI3Aq)PXsBMhAsZF3}osP>72 zk6fmWpq-A&)r|R#GX4Abh0Zw~^tWMMk4KNjjsPlZTU64@V4JDHV3gwd| zUOMCZ0gFQY)c@#A9o;a1zr9>{sp3jSP$Ea{kcg;Q?a$e=jB2)FC5g_;M7|!G_IP83sRpzN=zlc8KET@>yNmt|qv= zbPTlMl8tJPPG*>#s zL%&O=PfdNn-KRUzdw zMzp?lFseClaR*3q{4khNwokJJ9t9c+oY8M+DKMAN13rFHMS{&=!|jp3eW{!ZzWa}^ zR=DoAj(mqZ4vJ0b8xC-SYGG31pf304kvNfS^uTJdqq7dOTXr9L8h(Y6%+HM}*C+`y zwLaMEzda$dG>##Pdis~}$b6w+Ns*39F7;u{FVKA!0QNo|YwFvSq5xRrbJ1Xm9ox$L zMj)cY(hVuEeJj0$T_n6t)CcT0&5Nc*fEvomyOd^mkKnP7P=6==S~S-#I4UL8wdHbE z1S%X2+S+c#qcCEdsb;6}Yar}Zw}!KIL>H~zdcJ#BSGS_csy{8QCx8A~qOH}jv-;Pk z^m0@Qz!6`Cj1Fv@6$;W6y{Gbvh_#VzdlnmZ4(`Yg2PihF$nMD=2f#}F`FR`u21;2L zUeI~Mtg6V8IUDa1eOr0tbX>4iS9~m#r6kY(&MCNDGPhKdyyb0bBoDq8O9E%_O)YPs zu4W_Z;tBZ`k<{giv;XVb*!(45+jK)qW6X3$*K?B;rv4;Ra@XWpl2UX-6dU*c%;(w^ z1vZ@Tsa&nEsUZ#FxVm}5+_@#%B&5e4E`eOrzpNf5I54W+873Ro313L~dC0)!iV5wjD2vcvf^qzYS>8txLA3AJ2R%7(I^xwr}Tb*UdB zjFTdUIHQ=l#lQZQk}HTQ`W=(1SLIn;O)z+X=>MK2^)FK?80*S*%w2Fk_YyOhDUzmFn-WVEtsFd)c{S3m`F@wy;ivrT0l## z)bS0ov@?Vp(~5>|HdZvB*(Oy++}nF4bT)8+M=a$5UbfS>_0D!HZf#QNgLV z4mA1CrKg+ucxWx&ae@)kUB68ojP^K7Um}Islo`?>9JD9idbK{KiVnM+_{AmctRoH| zNVtQj+?$W=AtR~?*FUZm;FsHR8jgL@k}$_8!aqE~&wy3k!c+{k#%QE{eh)_z@$Ov1 z>f_k-XdgL@IBi=8E0=)q30nNwME2PCKJZK7r=FVD;9MQfHo~Xs7X+yJy8S5Ea?g`7 zRQ>>U3_o2FqvN<@2S-kvvpcX=lCVWgm+z@V<j5;G4-!Uiv0kHTF&i`VbY)NC${c58$V@URMGdJz9!&xmaHkRX{j^Z&jg`A%x>- zI$xB7QF0t(L^=S{E-Zi>9uL(Um$uYYEwtk5gFRd?T~w<*rss()7wSQpG9u>hTY>5J zlIZ=P;UR;lV$aecxTQ|8ez+ zBvyc%&n$y-myF5XWCn^UkOdZ-Wx;>{s{*McbwhHeO(@!W3VH!;#I!%93?JD%07TCU zT#16up)B{RNKNTOFkTIlxP-8{GbP@*k1eYYFrI<+L`!$UL~_!H5m?JAvg(x`5^CF!>?#S!s zit31g06m@irHS=|GmdHF=&DZKM$Q|zTg6IXYXgd8gl%r>{9oq)*Hj(=+RxR#xU8)j zwd+++#}7G_EY#qTrnH{&r&m?ZzelQ`c79YR8L-RcL1A{eoP_Sx%?1%@A%Z-wee;u> zNgabZVbB8TWn4?Fc{U;u4!<_#TG_HxV5=6GU*73QBaEYCF$WX?3sn3=x8>>U#zBtl zQdEde(YiucK9!A@*OSqm4c~k>R^PpxB;Ey+<3c$)DWo5>e!&F?Yu%;r3D($ER1E7m zz@!gIR=kAH*r|`$PXLpvleWRx{%_GRV=`Mb%10S)B6U`^8vpUR{vsdnL65u-g?8}T zO`BGIik5u$Pdn&j+17kr#ohPb(x1abh+7ggn{I=YjEQzl4ax=GV;~Kx8zJD-qz{r0 zWS5lHL1&jad3yO1+xlxI{_9BCtaD2w1xQO|tWNy+G)(c}oG|C_LJVV>vBLqZLi#)c zZAbG{nNMLgyp3N0mIA`fsY-n7{KChyI0%WaE`I<=m$R5>#JHLXBg6E!w~L_cKSGS5!NrijCGmX zn8og{_Abkk)6P~y0QN$89f0x?x_%v(_4ns$MSf`%JeW%p#gctkfJlGw>e#VD8>+++ z>IxyUAp`)7(h6K(?+*jE}-%$gP}4*44l6Vf~wWF89=+ky1|4H9I}x+8T(LAu~J8^CVc zd>>4I4HtJ7=e4sR4VDb8-Ri8#bGhg<2XS22b^f~OH46p^Ry404bI;QnE{;#aa?ZXa- z0f;Kd;yrfoo=C%<(}rRmh0(+Qa$c1xuNjCE88D(-V$9c9he`>7d#LDuMR>!NeA{U> z?nL?2+XhEW{&lAEYDO@%)z4^Sbj8}Ok18cR+XjP76u}N)G!S!~b0+!QQ$~MP8!^Xh zzKItKbs)71Fnus^IBs2FYtC_PJFmHAR3@Fl_KqpClr#V;UGT8j;KLJ@{n1A-#;5{C zxOi|a+xo{P!QDtV5NO6JLPlNDs0abD+-YE?Xee-y)+Rvng*_mN}K+wKoMIZ5_J~>WXnYzhY zO)SLpxaP$cIw*NRrw|MCEFyDxxUFpPYdcAP*;N5tu2nxo4m(QHAx0TX8^NB<{s{4f z7~$^cr-|@Yy7^v(lx|hxj!T)HKIU44=3SQ^s-^?}$9HN|=h`(W!?c{*!%5f{F9M(5 zLH=mgZd9@;F=X&VJqk>RIaID2E175b=vjKJK4gL57Bce zybbI2UR}Cr%2h>Ek~k7t+#PaC?&{>55SE{QP5$5SU1U zNChd#En+qX4#~3PV5`5Jc!k~U779?Q5)bWg(RayLd>2q5Esz~Xbl1gS+jY=>ayDc- zGri*r>vCoUL?!p}K1+ zhI1bPk=_f1)v1VAs5ASu-nK&lMI520HTd`~;AX`nah6m3&lEM+8 z*Q%~Y`2-tcYDeuJLRl;yyPS&f*<}nj(sEcbyXt@Qh#Lq?`=5I&b{x#fXgm~Av&fnh zy*`u!1NV~cdhD~ItZNj%N!NEcWQ=^S#yoE33rzVqswEsN#P}W;_+16s^0(J}0357B zGMpDIJOv)y&|zgOqy-Zu$&_$P{l7qLEWU}s0R}0ZT+>{tfAIZL`MPN;M*IOvMe9Wz zpwaEnUDV!qT-Z1UsV?nll(Yf9lTrAQcI6T02}d1rOUnnRO$3;3dh_PX+6}MXm$wKl z5V@)v@&y4QNh11(mzmcB=i8Y36I3|I#{~Yyb4CH#h)N1y49?+P44sl>#pOO7_nv}O ze2aNdj^Bh9G~aX2rcL9Y{*U9ZHM`WPVQVv^1gBP_$wKT6R=yO;D2`!bzS}YFwrE32 z7bkwDcZiS1JnUj00qc_kFlD&r@&4>sTOHw=IoH)UgOs3MGX1nWiVZ>okJVU&SHvUS zl3(18s$Gcm?q=DW0ICk0|#= zyE7yB)lZM;6g}mdMz!3HeMntB5Nr;S#6?|}Hv3M1ly^5dF0hzW8}}8rH;gAWyZ21` zL}auhTdJpx)llq;b1jf%5mNM$OhD;8r_8N}GBUm)GFkT|RMGk`r9 z!sPkKubGR7YSV9NRYcVzz(+Y7_okla{HNr90GZ?{vKh17$vl(lN85krY#>rsXa#$Q5l}{F=2oIPii;={8 z^Vi}YZcvSC7EDp75D+n3n!Xj~+_12aB5lH z+vb!fWHO0vGTTg6I_adm+hn7t<%sMm1s@#5kA}<=-$rQnw0Tuu1Z|y|orImA6)i6+ zf9&AMCpE&$EVmG~L25RBi;}T;tM}U`*%dtZ>9TqDfE0>P<+bqgS)1eMI<3rR@7*Gn z9l8dmYQIxiRb|E%b|>pi6%E!v0BDcFj%ckEW|K~N<7_)8-e5O&84a#*M9G{-WI(L> zoA`hlJ77Nl4bo?HtGH~cV?39a<=Bng5_3F#9mGfWG-V^UPTacH)~U+Sy8Y5Clmzpk z)t!-D;LU8a>8V?&YgeUdJyo+26$Rf*jO%z8Vp&k{EBeB*RY+|JLv`V8ISETQy7nBq z!Nqt0lm<(pxZ_!%d$ru~4vo2d*=USqcF&Ff-jJF@ZiblSf@To9kY^CFz_9CC!T|GZ z$#;$3U<-=j5=u!XdZoawze`@=(m5|SxfD+3BrcMt7Y$q*mM)(6&Kbvxpq~JqH0I;6 zx&{q>6V!I^?P;0iH!Gg_9=*xy5rqE7=*cYpoGUNNU6f(Nol5z$@cTnY1WMc6ljChj zOT|M!LhAJp6*$dpX=_Qpc)~fsZT|ksV!{Ap%%r?YmLzWTD+jh5(!J?(O)_`}cX(no zX)=*!7c`hXNWUL#;=JTdQ(Fy0Fqja*+JV^`X)Hh?LSM zZ*~T-F@^o@hekVkn$u8uLkf<)dd5Yw;hhe`%7&dg2u7*$IXovYif=3hIa#^JR!??L?=P9o_u)}~%4Nt9Pz{sba(E*HH}rQ`!x zP1v1@jEy8XMX+HY$?mrPL@3ujFvLQ=WmXX z!l7ZxbI@)Q`=+$H*#b{eI{s|I+(@Bqd2XXaagBIprp251N-Q+?ua{OTHaAI*%` zE>mn~)kZzn)g-X;+0U`XYpans>M~DsV$H?i_epIpTF{i)yjyiTYkNr=%7!hmtDscP zWuLN>Ly_0&KV-^H55st@M%_Cn*cEM=(j!hNURK-?+jAzgWh=j-=G57*!Tx@9R6i5R z-40{~)IS;)yyW38m?I2Qu81LbQF0daW6+ z`@v7>`Fu{~8U$>2G(W(M=j%&=5t=ksZ>7(dR+X;Mas_knb&!#d3Hzi1;Ktr7W0qo5 zDn~p!FHfpziTwkz$s@-qZnoKV1`Xhl_#)`}^%&aAeiJoXI{({%KJ&5>(zlpm?=q`< zTn$~ywSqnrO_0kzD=X16%ljB>2esUlR}lSjx@xjSIotI;3r^X$pwbmkbNK0>#A-2- zG&mFX1KlKRL3t;&`cpDMK$Ke+MMU*OMp=zVK;jB;Mb$rIm|1n{#nf&mu!K9^3$$;( zR2dAT;v5Lj2F)?MEB*p&oP&Jo|1oi`;v3o5rrZg4+rgiJX@c}UEW&pPr#nij+n1RC zvDb5EUdlOAdXZTg7fM>Os{-?b)Rs+;YdTI3N41*@k=UBMA?$9h*nf?56H zleLeb%x0@17mZ<(g z0&MwN3V6~0Y&5GOywI}a^l*KSEtwYWuKX;nBcj=XtIrkHUob55Bkr0-OcyTv2QkVW z7Sh)Np>CWVD7_i0Bf;qk6ZkWfQEgb7>_3xDya%-AA#c6?(Umt>`gtT$LO%iThKLS@ z3?%8cG5w7gto-Yzk%z|f7KNjvO~no?L%)CHR5TGSPl-@p0*Tpg2XS#OW_yF~%}J}f z#j|H4(MwQCx%#~W@su}lne|Ze&jv%(@b5z<1Wp-j%(+jZl0Z$<5}Xq~Bvt_$uD?IK z)o_EUKXzub^z`eQFXEdT300XqUvp$iHhP;lUxJTK2AXLR7W9#w2V^`H$+4#*uZPV+V;rXz2~z zEk@;wu53rUF}d<$D5whxbEK^DjQnGH9s*+G?9|B1_WI&U7T_hPD4f=0Ga5b+L? z?MPw4r=BYH;1p3ODTwPDv1CI?RB4vn2uEX7FT_xU&UBH=zcy#u{LWwLtoV*$Pf95J zaxXJ!>$+J7QR1vN=LyBle3G}D{X*fZR)lfU zBtI&-1jL)|D3(I+(x_c|8|B;_z4$Pn9A~SccMTHLzbZgaqDP;vQ|*@hA$JG!@J1LI zW98$_u97H&_$%6L^Cv`xsVWpGG}l_Hj@C zyp){-1Cr$FTC9!5{DgkqcZqDU&Nvk>ZN+cBY0U0X7>5m|6w3wwaqnsS16x^eK(&o~ z};s@iGe{I8gVTx@b-{i1{S5`4k?}XQ=7z2PAtA^=F z?RW$V)_u~^#p-|BYmkQuJdj6vQT#E=Z;oJ_qB9CRhO}Ytwe`zo1LbPQd!&9P%8ba^c@D9<7?_Og%Le$w0|{amL^#5V% z?;H_$)KtWf(Skez&#zSl@EINB^AxNMHEr)@h5{hvKhRy@m(T_5DxkOC<#K|6ZI*^L+9N#~0$M z4mZ);l$L>0D$=S`mhxNzWpzML@0NX9{p z>~~$l-r2tSInHcQREwR-5pPoL3nP;SJLD5EvU=`+;c~yp9|%k)QPjQAY%?O+T)~dk zHy#1x-KrKP8R?xm3TCaNkIx)!`M9ccW5^VZsT0az_>AA$ak65(#G0zLz2aaLmcstq z+-YHxMvTH`ImI`RmwD*Nlu`h#-oz4hy zsgRk>H57{BB0ZjQMjKMgeQTEvlc)jlwX4jEzY*$WeMenmZ7){jq>Cjcd5;4)PLm@dk=iyW&%PwzTNQ;3DP(jvpB~BqESaL%r{Rp z(eK$UI8pKYk1#8z?_wX3r_%Lyy2yT^?fDKAi&g$A+^|OxwA)1>*hS8!#N%$a>w-eo zYab68kZJ~V^9)+?>xm_e=2=160pxZh0mm_Gkx7)iIUIvG=Z+Ul1iJCuaLE|Zedb1s zg(K>2-1x3*Z58qsOn6AE18;Hd&kiRDTpRjdMBBQ_Er@5>S^=;mX}lis(p%Mu=&G*+ z@KR)q9yYYp3GVhV>RzSB8ODRts>soT*g zczwR1Bdj@IG)iyI=D@3XIDx9X+T!9hZ7VPyx|ce3^k#9eV#OGlP0i?eP!~|Z)=sc&`>sd=E*<5qXv-Oc!N%Dt7;z|`N zw<9f(P4MRRb!$lIuiJ+8wi3Tx-HvLv63RxB(}=0wSwCL(9jv)>S(2o%h@|>64Ur0O zO-H9?@7uXYOTpa)1HqVV(iZ3h@a-45mYZm!FoLO6ue2Ule3~mqM!?vmYg=!5x|Q#a zsgZT1h-x&}JK7Tg+6HFdUBf++49$VNlpN6Kv~cp}LzG^~b%2S`C=t|;->u|R;HcA~ zY8?)*9N=jze2CH@6`e&fkwtfoW&Ng)j5285BX~O^)Ctxf$fHoX#X^rQ-dpo5=8F@| z(t8Wy&cwd#3bBmF{Gx&Oqg4K>6})7l*@f=K{$nq_UlZnN{wJA0!a&R_`4J&TD|Lbd zWnZD0d*J=k3lz?%hjoNXKLw}Y3U-WL&g3XU&2r}q+_<^j_N>sxgNDTaFj&{&A0N^5 z@KQ*{C)qEbk5hD40|$2zpY9I}IS8cAlCD?D%9Kk*V7d%LsBhkS_Q<7)RPxC*8W-;e zGZat-V!*7|#6l|@ds}+fMY{2|zaw6Gy9NzvRTzJ276+o-`i*u-n`L1DP-EG^kDk1H4 z1S8*S$4H3rWj!S`9z9ssFUIDo0k z5l^wM%YJ3&(&uFU0E4?_KiLiBx;3owOwh?L?l&pZ-~OC~%)9D~J31HuVNA0L4;C;t zMdZC1f@jAt2(JLS0o7tZg6DxGb`gSm6 zWWbUuh1@aIN?zGul3u-ZtxEU{oQO-d|m0z#^79h<(dwGEnJa_Ha5l3$jz#X zn-z8`-LYR*yx?yX@T3}%GHc=G;OsHlzfR1?OS18W=BBk#H4Wi%Zw?lU?_ znNV-QjV5t7estBY;q8w)4cOp!xJn4#DiL{NE}CEr50U9wbMhA|_MZMSKra3mPJX{H zwN3?Ksv^Rvv&tY?Kc`zkX3I>0xkMSS=~LsFF-jR$Opgb}P}c|nuZGQEe^l-Z?xavs z-SAdP2&H44Hz(1Dt<&+|(bidqg_}6polbEdau-O$F{3YAl(T8ee+UESiq?IR$T|7X zfOZXnKSZ_L*CPeWqMf%@cTl`Y9|)lb&F6H`38~uWNaUq^3zDh-1qV-{=otytH41OO zs6$UoLG^ysIoBA>b;YT9p{fB1eCRxCq0i~s&E~$or4yr2k z#r)y)`vXLy0FldJHS<_UWI)IV&(ekJc`C4TLcG9#w{}FH0IQE4qbp_nVbgNmZdSGk zgr8_C-6Ou@Nz@6}@)up`FZ}OCd6EHkchqS9BSsh~oP?^eBn0MEl{mPaQxx5Z9uOUB zkF^WUFd^$>=R5%_TCSDSQ~`Rr%0+^$-=EL4J(Lxh5P+W0b$i&GSf!26w>oRtXc7*( z(jL)jQIfB?zjp4M95o8japH?HjXnubXvwkrOY!OkT0t0*KzBeOT#Z)4R11`^7Dm9R z1Q7#Ri>~LCf<^Hx^3O3M>gFK?6I)Gb-Uq)bghZwkLzDc znCvRr-Lphd@YIr6@>(RfmXlu~IRNq{A>MwuoydR?_#7G=W$=E($+>fVL_p11(#iIy z_>B=zO~}+UiV?C6np~e-l>;Owfc_tq7zP<5OAYIETDdMOSWc-EZousKtYlj4W!cWC(_lZ;7|lT0hjz7Rod|Wn0wg+x$Km zUET>Wu?WhHzgtV|Gn&9wYKO54Na9>ZR zx*x|@!lx2D!8kXNJ>)9&>Jl8Wi8w9 zYfQq-fr+)KF9j$^NZ@d_4moIwl=A+Uk8M*+#+Gg>)b>)x>`3hDT?U+3Mq&+MyRmEK z9+wX=AzSGnu5tKI6go}fY9k^cuoT2erF>WXOJY;MD5E-&rte$$#JR-0 zw5<))JmO_Y7LQ^gPRl}+{gQQv#rY;rtlFho}ai``N3 zcnab3l<_ySgFmAxM1%9@oGc1{g*?;dj%Eh`nMQvA>8EM`L;4*MVjDl#-W6YjDw9=S z@F=#Hlo_t zgDS;u?QF(Qa0KwG#Ovi`I-l1xFHO+e>d17K9;nbbaVSx2KLlzt-w`^b96}!6p=*)j zrqc+NiB8W^9&4s-MqC+R5t&hm*YJ1|2o}nQ^1jWCF^r@*HRRaNO=ecI5R_@gEB`d2 zl+U)G07IdkBuXTx{q$t}{`h|`@`ezNNtZ^yhZE6m(f!LpP+EYPtD{ z7DA)zxy#WRNTHk;8RHe5L;D-Nmu?UiI!BQY2DK#u@*&bRds>{g)Yg$AMghb4I`R*= zAi526dx8dQ7#Ry6{>#Ro$!ft4-}+r7sFr3u-jUktSjFgIoYFC0C8-cpEdtjlj=8kn zJcXleyl}JgS*H(u&Aq2OG0n015~hg$1BFyAK1u~!XDb$?`MtsBZY8p{TmyWMTr`y| z7Pa^>blux(H;_q7)qyc7+hpcjRhAtiU)mG`M;=Y^ufJh-Ld5)KI#Cpf&Vm#(6bE<_LCQ&i6z-_n%) zNF|Zni+8KYj~Jea0f2vx5$JXXVG*S1inVxJ_6Dogi0*XPlVC=ah+>8cN9;gb8VXan zDRjmn>Eb2I8mrOWN2PL9kznfC-61l);e``(Fo$h(>8pC|^s=3x0$g$?@}%w?cjK-t z!eq{UICMpi^5;`mF|o$Bv(XyH=-<5r{%}Q&um^en`OMo_J4_VupVPFh&4S1IeD~Q3 zG!5C-gstMW)4m1h4)tU5ZHxJ0_FoK=aSOp=_^}Qy!=fUH$#&AQ#BgCe?WMrKvk(+3 z@x3Mo22C*3s2YigPwd>AA*U=qbBIr~4$}mJNnqpIM%u$p@j#(W(Z!6q$G@BRT%+Xy z_AD@tZgptOua8DgO_WR-pt1J$MHeauY50RzgDh7-{G?ZrfjAy})e$l$6g!$TZTM@w zLh>cn#Rdtap9wJM=N-6WlZsO=&at}G4slK&+kcU%A$R_${d=pU9yzYA`C(5)gCtcM zD3i>BDgBE_XOS*0^$N)#u|Vd?3UdiyL2!6kT5B>oT~`H9b0aQ<5ndlGIf=rshQgN( z%y$$;0Xvg;;Ah2qoO2)BS4QHzkQC;ovNbj$p6_XF0_V0{G+^8pm<)1!f3pSPUm0=%l%iAFf7cb=Ea2ElFZ)dx_lb|wmel(eT1 zPN0*h^OW5{`h?eqqkjip z6%o#wvT815uwmQ~$2MBy5it066tyc|%>vo`AxiJq#|N_p z&AxYQG$^c|sZhmS!mtVvW_k5T;d+BS1;hp;p0Hgqo5=F!(&auWpDG4w2f~HvHj#$8 z$0;JziA3^meU`9wQ0)5jG#DhygkIFbohe)*^gvE;353i~*V=(Uqie3%n`tU*hpSaBJ5e&`3pa4EKdxv}8cz;fW6}7OA2%@?lisPBA^s6Eq+_;qq#Z zRsj4p_Kat{1O}GTl%lQROgO7Kcg8^g5Bq4PjzrW$J(qF;3+uQHJ5r!3r%f)m*FU_f zE$^crt8lW&G0)~ep%Yo&jx)SBzeweRpbIfTs5Fg^(1jF&8(n0+41|_O@?VX2FU_z_ z@AS2DAW7vtxetGZ*I~pA$;rbM$*4ms7y%~`*uG?(-o!)GP!z3rvX}ZIg4cGcu|wE) zG0t3UKvdAHg;!bsp(cP|6KtFbC|X@Z2U+BCDG%E^lV@JtS-ML$wPs|pWg;C4x0!q^ zkqwPQK&h^DApK`O+v~pRC+gPl4SC!SdNMlT6S__C-E{VPja}DC!T*;)540mLD3c!Rzg@Hs`=KZuxB0 zXG2ydl`M&*#>dh11f)cHXj{X9n)^ikGNM(Eu}n>a|ZXF)llq_AD-2J%WDN^wVx}d zWVt-|zbeVmRL9+V9m0S%_riW0d`8nB)}d4`qWo6;FI3B)GSb?Gvus|OWJuf1z@d#x zYb;(DxDa%Uw8WCQzWIi49RCRbt269-UBUvw5S=lL@r$}}c++H42}J@+c2h=T?*4lQ z*UY&rgBuPE)1`IKNHl{ucZ8U%t>(^Q3&VAlKi5_Fi|xK7@y2%&U1kt?>!@o-C%3MW zDbH7FXrL&t%0!&^3=8jBQ1!$O-2t&7(>69DC(e3aJ{c{O)E0&?sjHiE*@1}h08dqF zP!?nNJr><@2KjB40I(Lef-gf~of-gjPhC3yM)eltrQFzp>%$X*85>@F4etBYeJfqb z(;+-NX_KfF*fcT^kI{@^BY4#K&pFWLzNBleZy{0PkEU5-t;8&X2y1~t{fABZjW%2q z*dNcacpAa|eMF2{S1Q8*8dVBQc}*Kf6KN-OZR(VU z!VmX?}WB6nMri}$r*83mG zS&M}q_gg0gWhhWiNnOGygZ+|LIDgdxvc$zFz^|j-58^GCyZ>i{)f|gO6JH>vvCwUm8kt@|Zz_mSE#lXZIHjvli)>d1Rl)>BZL<4yB0Z2ry$_8mejOC;i9i z77BTGdZ8*oC=vUz%HPz!b6e2tB!YGIV(b36&KDM_O1<2~{o|L%4ho}{uXY#gly@z_ zD8KLtxLhQH#nvMnj`Wv4C~`O{jdEE8_;r+qY=s4RNvNx(#HtC2`L8pu-flkUIC>g> zXBfBAtEhSKw|eq$V!p#HSTDeFg%U7JUbJpY1XJzzxxDU` z_7`@`u>k8qRj1?Wro-T?Y&u?-PP@xTOUnp#?+oeos^bV#ZM=~J#!aHk1U~4b8`-GM z)jw5N=qDpX>eZdrt^Io@)@T+@Y=(A>F<&ry-IE51TieNtU8U!1?E4fl9fyC87W`O^ zj7y|8{=^(xtA1)sW2x|i=KL4i9aqH?<;_MfvbXWYEIT>y2Y#j)XGaxdI2gdesW#l4 z`C!@AL&~TJHhq84GN#X#MUtyOM1B1kolTc+jZiMkF^M}LnCB~j_1m{HV=QTKEaOXl zmmRAI8KTfIJp}HluA!7E*CuD#I;4q_;l8|lVOH!ZA@DORiOK>No(6n<>EMwij_OXc z2Sr8I=-Sr8V2I9H`#1qFa5T^(9Lz=>5We>AZ%%I*9iy8KIR?Thfu3Is+QnsGp=sg3 zWt4PGh`fQY7EgTkF?l!Q23tg3h>3qm@`|+H2rVPTbMsPA%(T-lD&8(~wij2$(#M0_ z)0)Bt*1{-XTJqog#1!$7pXSw(_j!mS*5N(w>(ANTynaJmpq-D|A!n#2G}n+|5V`f1 zyCs_+kXa-PHQ7#Zn?@)9v?=9Il%t@( zN_!YkzBRp8!mYfU&6Hg`X!a!8`0jI^ROWVAP1-mTLj?(22K9CHYrl zTle3ffPAamI3_|OYp4mF9Q5_6P%>={Wuy_<{~-3l1@)$b*t8~t!UXpMDF*;k!M_?Z z47mr4RAa!ujfBGvsxQ9w{G2e9T~5H`=DV`wW+zVfpKZ{zF*J7uG5m-wNk6;~WnSj@ zF2hi~MUpT}MVwui=r8EkWI1b({5WA88vR$rQD$8SpL${xP%Qtw9IjPgTPIY?b zE%wkz`MYSnWKt|8T!Ev~TTm&F9(UOIu7xXGONV!x>Hvs;G_iY(2`%cH*Tb>VJ+6uX z0h*_OzBpVTY_NSvC3A5rbod6bWh!_P7Ov5Nr>PJ021_o0`Jk@UzW8p5++8I)NKxuP z5JsWJs*;Xh>R)n$l0bTMHtclL4SBbN9Kk!K;U9dAZ$F~MO8&pp&A8^Obk@FWipR@tHXqF`Z z9SLJtRFZ8THdTra(G~Zz5m~gJ)=VWEuB`x8P*KhX&e%hc$LfaX?pW^O9E2v%ft;qo z9vJ=!Xo+_u2md-C-0X&Q4p;5;FzxJ)HK}OeZ)r#SHSlXY2$CdKgT3M`kED4?g_Sz} zZRm(y-MO>W?;B5OT|Fc0k|aGUiq{WG-?9}BQF;a>=8VlG-G!drBIpU$c#=CZ7|Nna zN}NK9L%u1#Xb15hPNcyA@Jaq`tsgod3|%fWR5q6JI>(=jskaa$GUggviFWPzPawq~ z-un{yZi^WxSBnijlS7fLLe1HC6dplmE+@=-UFbX%$Lpf}SwzAj@lcT8J zJ=%^eoX~mk+~XB0kz95eCS4T_yo-gpa7a8nRlKzay1ND*sM#0Qj9E%TdO6Gjt!Old z1n7Qir;q1Zbmm8;jwkds{{#Z}5#jh9*4L%sC@fI{HnmkNmvD}8jO!7Mw5NRMAUKU) zWHoXn8j`~bcOs)Rm3hWRJIY|rsJ&kF*&bX86-kjP#c5sG7V#xX=Pz<4pKbE_iYC>7 z*NTR4*CW~DRPfnaY^hs=6~v+_eSm{SUWG9;JAGG{NB%`jF>V|iif0-MLT1TDL`@cu zj@4-w+RMiLvB^ozV=Er&T>6~->{q-q=Xo{TklVDr>nXOfQY#kG#8xsE@i2->GABp{ zBvg9o_d;(OSb|&~ztK?lIxOzd+3;)PIR>#>M%|B}kEiNa$V1g%$&Gfg;xG$({Q$ha zly^5taywaUy^2;Z(yC7+8r;K1!L3C#b@mi^C8V?!&-NqkKh2CNh=pESIXT%!kGz{; zz_XLRpZi^E^ZeG04S8htdB$o-n`t6X{EH9S$ zqKl#^A^nd+-Gytt%Bi=b9Ipu!SA1g?TD2FYXsOvR`R$$Vwe-Je{g`uxseK{!u<3|M zqx>vUQhQsT6Gb!;;dmXiA&D&uUE;!mDEEWxGb(SqZy@tDFmo3p(2SxBd#xHYCdo~Mo$1t?enB|h%#NBAm;9Fh zm^6f`Rm_huB;2bm#arON7vdcMCsDd%D)|is;`8fL9Q4%NgpHW>D{yv(1~+Ec)N}XH z!fPgQC1<>bZb$1&>1)=(&SE>RPjeL%v~SGfc|Qo&asPU6e3SV#s^diSAL1uc zxL-kQXm3GSip>dW`?;KITJ6_r4BUpF9WYaU()@kZ53#|h5F)*DJbEPw?!R;$ew>3*O_>@gE^VKsMDPj1ock7w(Y~d<(HEGhHsJB&2NLhl}cI?)2d9A$|JRoSj z%o?dAiBoTGQraak*9`?-Xnxs-cME8R4Fz)#c=_fivuEE&fuj?5_an#I*CU=Wq8U9} zlXGf_WNQ=PHloU6!uDx9)<~=0pvN$V{jPhD$=#%k z?wzBI21K$V)@?dv{WC^tou{?p223-<)gj*w<(gjVc^Z8m==LkxuLH`VHOlm%(uJVU z=^ZG&8LL@>#w64!rxrg}1OiXuREXJC^gw=KvvGuKYT!Fy5fM#F`Rgy8nEQ>kLL}_) z9llT7UDg^>|9m>u+Fh5j0CRwl)#cGmpw{#`J0vo|igh**Ni44i&)hM4}{7 zo7?ln@h0{5{jn;K_S42I`J9dqyT=l<`fksC(4RF5^j=f%9A;47W)b3x6wtmH@X<-3f7K)R$rUWI@eW8puI+ zu*}*Wz|vI^XS8%iL{~}^SakgW{rhkYU0xC2DSN*79Lr*3qp?vtavyG%e{^6aXI7Bh15N?*91?{4Q{cuvfMJoZ>HNXO-m#OZof} zSN7lB6L*`JPb=+%+M9QCqZq-+u!fo5B^GE( z;T}Y}VUv_-<#m0${pMQt9mm=iK*=fg;>6Z+kZX9B*j8D53$(Gc z`tR@AhA2C34sZ7tGVLFUG@lliRM%qPJj5S5p-w>ROFcn#;@ar+(?X^3wEwt$yBKg` ziQ!BFxXa-&+1C}GN;pTI8*mB^TAdsx+4`0LW2C8LPNylLeont?UHFf;u(+LKJA|Ze zw6=P-$**ezqI$no&H_)J>7wm1n-+)49?vY~Pz#tu2|s{*t?P2?eSxx$g)bY@iMIbp z;|F-4H1M&b?DGG*miT%po=*l>@oi&+5E~_%ux$k4FSh`9SW+r|uC^kf;7V3eE8t5~ zXf9_1ABkZzesI+$9bYI*kGa_*3O!H2euLCvfl3nJsiIZBzX`MIHQ{XmM+#xW?{X}+ zi_(w+n}}k`wB8W`2w?kOJiVkXF%0xkW4X5^M5IMJQ;f)lKYzq$s8PpOo{#GzMB`MG z?=YK*i^ZWUBa$M|EZuT3*e@ik;f)JUQs*3p#k=}*W4z229y3J&sMAU6jkq%NJST&k z3!lO&{8eVfpIMy!R|}>yy%|B?1=i!)g3`;lktzW>d<$8HQWS+FY5UVODS!DpMZ8TY zV6{*-ZJfNd$&Dv&j*9b$e$_j+F3y?fw(}?Mh5cK4DZCNSG6NxIAD-mX|Di}2&oiH2 zsEL&_4-Mo;Gx=jHPghq|Mq=^*T%=Ys0;gRw)o(Tv&p`4pC3)wpGQLdz-})S`0~2xS zWkzJGh;Z&McB}Ax-6;2yIlX53j+Z?VCCO3UXGOwkyrF2~UBNB-Uo=u*PoL)H&qO@f zp67sSz5)i1rn?h?~u&)?D zuT{S4PUq%v3rVDcYaRS;yfZSP%Mfm#79nP{H9VBR%yYwBjOi>&4NZ z+Zofay!mzYW%z3o@Zkoe=UE&~IwlOx4l*zc2l;=+Dn2*`H{>%bl_1=1#RlScaH1M6 z-Qnt!soU#>u{xd+XnF~T817qhu#;rR4vPDNIg?qLZ?Q+xX?D^5bMO&pyY2wOj>q$S z?y?F8JT>4K`rQ`)*G|eEdEf0P#>oz5L@;VB%b|P!)kb+u2x18#%IP3o*6`0!pt2z%32B9dkM>7TQv7ffZ@X~L%`598N2 zf*l{;=I^}4eNw|Tnff`<;PUYmJg8M6(SS)4*38@b@kq=k_#OTS&|1*BH zc+QmxxQc>;_h6Yq+Rhice9{uyJi*S`*`*syBgB%$rnZ)*(=OS@oo~UOJudr)Sy3TY zY$a<0N$kr5`cWNE*u8C1#O;f%bet#Vn$h`#05sS+4y8AV|Z4U=k*Sfx$8 z$%URpD|ZP;0?ok{v$t6nkfMzpt@m9?gm-;apIMkohbT{d6 zchy-@IcTDDKLMd99hUqLOe_MjzR2i$Kqm?obt6ZAqF?Ud&OCc0eqq1|k*DXOBYr3Dj zKz=#IPGJ&vz~&+ESR!IFG|eA0oLy0nEk>tl3rLFOG0I-e zwrYZEDh~Ql0|CXUKg_b|-ywS<`lR24j=_wCUs+b~e@nzdvwTsXNJ`%VODa)uc&D=H zRl_cFN_cdz=X0?i!(zAITI7o?)wzEdKpdf~kCt4h3#$3-r+hP#>p7VW*tpaeo|stU zo&Oib*CU=?1=QJESYXM2$AZtln!a~pnwi6OOB)ryhw!35z*xQ%es|)Kv;(f3bZG z1dE3Hm2)KKFXGrpf-T=~9U0-3!OZm)_3{OXp|ZBJhs=`EuoP@ehW@1^sn*^py?A40 z))Ej5Tsvdgh>Z=pnl!J}$^1YUxQc?eN!DM)H2QcKY6W_c{*b;d!hS|4NKgvS8|1uX zXlY}^>o{pK03jt`w)XTNTLNqB(E^P* zq`lYF8H7^vS0WK3H?=F@z^Mr@gdl?nOM?XhAVG_UgZ5&%0(-(yPdJJ!gh)E-7{}*5 zAo&CK?y%Ki0sA!1SePJ*mFh$c<|GKL1C_i7L+go?R;_Ie^B{}gC`Q62>2~g$*5WT^DoT{=uwh^$i9>Un;|cMvU}>Q# zR}I;(YuZ2~xSB|YHHR23`FXmGJWKn{+YcfZWRn$lbMgh!ku$OT^~J;L3nB~&o&nW5 z$SB=#76ef%G9UmuH=+!>OV^Ae=qQiaaXRyxy9Nv z5ihponv-u6*?BFk=J#5SaiQs1;nt`1cid@eRE0EEgj%{QJjayX06I~a8BCua9#py;V6qTVbYr0>G4#-7UL*zro$5v zsQm6Pvu3MYIcO?bO`;=%OEE5%@DUR&3e^lvDLD3PG%Vp{)`TXAA#(Yw7GnA{K4cKf zvUpUIYGXZWa8Uzg@>=n?=#!6aWY@Eo14GzquRMifIgkYN-)^dwZh58^LYaT6;R7#% z$}y^I{s1sWjTuz#wnI5H2lA0cm3uy1Sf0z}R|Ps-WBxNKkIZA~Lp*ehx!yR@E!Q!x zS?(OAm`zKU6m_y&B^w75M7Q#fT|SwbvPTeF2UCc1k`;4GNOWsF)Tq-(|EKrZd%X7z zCy^gm6JeH3xX4RX#VX|4z!m#?NXjRPgwE6Q#A(FgJ~hL8C9Q1;ThXmCEey#8$3!Np zWX9IyydN=bXj0{A$>ZYq=4U*E8smX)o|$#kH84MNUSh15bFZfUd)a=*Fvvc$zL9Qb z2x`Hd`ZqlyJJ{K?Y*sXpq$Og3ZK@$ZS3ZzK9jH7$M|<+yK)+g33vetB`q3Kzn#v?3 zJwGOTja?|5GgPhAhLx}+O=k%Xd*k}ZyC$dy=!?NN>lj){xqi2uI4`}SgD%>Ev{R?Swbuv}{lzdL7b`%@G zUs&+tIFRB0%zrS*wh9M^A1s=+F%&VF=%hS zxYbSp^)UBC|^e=W#|a?g$D6@>YdPt9A!Cusl< zv$W)ii&$wU-6$&D>!Ad9kBTZx=dMx0u`g-`6g{ybW4>E7qh2uy@E*;5BF4auec7nL z4C!E@=fC{NlaH=KILqs#`+23jx6q__!Y^stG|_`F@b4TnnBZX=R*PBw0o$9Wo>Rcd zu7|tbM1>a$fB^}m$|f5iMtG8m%dr!4?J$Yi=AcUVUj*d9o?$2^ExM}4vSimQH6agZ zu0{!Di3{k?K0sSQq4S|%wktuUrZvr{$%Rj^q7AX!{}!QEIS}W%LySV2U@pYq3l)g3 z`cVS0MktEpPp=t7VG1N^VjimGQg}$j@BbDVyCQPRW$QjFdnZJK(bjzcSUY{7H!<$K zT(K&mo=HP*m_B|$I<3l!U_k!V5q^+jVru-}-IE1v7R}aZ&mR~Xh*z-Ivr|jGi4?+5Sj##3(x`fvP?nB zx|zurb$$;1a+GLc``Pocgf4a}v;1qXk=PYtPKw;AKQgKg{2PzvK>8oVTnejX%w>1F z$`J-n>!1Kk7f#9iRH||Z7urYET5+>_*(FaC99qD&o&+B=)57sZsndL+U?0qLYzlw; z|21Im>0rXG8Lwl<;tirMaEZl%-Ifk?lxd7`2i)#J$|jnUZ+olt7FYDIeg=<9OI=uf z635Q9*+A_o4)38mkQX`@f46d(gQkMz6}@Xrm-8|vFIi;YbC|&9%|Aul545{Y$I!+;{gdr zu%YY2W6L-C(YZjSg?h6thLGJsi$f`pd9tl z_kQ!oPi1a_VD23vO8FgqViN=b(c~wGO(5S$4#9=-^dB{{F2ql;CU_AqES3-sA)pX| z9^*2iLS!GfD%-cQAI^V3RDEp(^=8Bn@|7mQU362_-cXL9x9|K7AFIsK;s!cL!kEMC zZ0T?ZVf_baoWYeu*Oq9^P16D9PlVK|5~?a96sW2`n+}nV{>Z6)`#DAj5Idn4*FFE- zR3@rnNJwq92_?K0jxj|yzvRR$Ak$obJN9chIh;AIx_pTICe8DUk6yFu<4@8$O?2eE zOQbA7b~pnnE%rwI;5ON46#kI^ye4XbJgTgRw`mpqm`Whzf%R(yC#^Ok@XN2!QFFhD{Ifl0Zi&HtgE?La1!u*TT{O zl3BxFKibGFk;;4K?R$qJ=}Zus#LMlUlTessMF{(B~e;hr$+vGE0EopEY; zaX%f-jpv11T(red*+?xfjL~1Z120PELzdpu%f&jj{dN+9@;12!U5oc(lmbBt0{P1A zFrI(Kj(WAJt|3Y&={HNjNEX9OuKKe9r>JipXgkw};o~WBZD$PjW0)Giwykk`;300sMcS4acw8~|n zG1-V%XxkJ}F7%m36IN}Lyg+_-g|5vwh^zk~?|0 zHG|;WT-&iTpJBomuhoU-2r$83g{vs%@|#&i%{7nN?7tks?D~~<9@%R6h=7IV>n+K< z23@K+*ZOPX8)TezU2l&f(bc8ke(_G9cIbUfahm+Pc5=kp1;UqCNz-yB*OPE)QDO4C zFlIwU7C5w699oS&#w3t;c$<~6GtX?LPYKi`%kXQB%@)d4Dd=5q5WK&c_Sw-2j>3y| z#+86}{|ue2&Pd)>vg(=A- zsWT*FNZ(#X^t7>atMQBgggJB|TK*!bi}1;@PJHb?K2?{FNZ<6Hzc(!9yZDi?*TpWq zSP_7HrHTqJ89`FfWZKUVw+r&Rzflzh>F?R8?cTf`zAn{S9X<(5vIG)q;T}!_#cQ8f z6~TMd1G$Z?024s!#D95sf}F*Tak_%q6S+ltHBqvRiy@VL0@L^5OXXy?o;l=?yHOC$ zu=qq6ysdRdHx1n(#bmmJ$!ASbk*e$e;v5fP6uTU#=dEPpXoda0t=<0F_WuiN+dAuP z$LyVRw(aEkCj>BOEB(}zm(XZZWrA;)-pz$BuEE1mWxYlrkHNq{Lbp#rYGgW2?zSI% zDZH*Q?%`yCoq4PtL@HKoL~uWhVdCNBz`-N|FNM= z)RRxPPib)Zk7-@Jx@UOEn4D3?hz4zc70AAk9A&XEJX&1iiH4gbzaGhFa z4?@`+O@t(c!==x(`uiH9l&n2>Z)^DXpW=>BvJl&4eQ+R0^Krm^&^y~g%Pj}P>| zHa_=#ou7;jz4~l7Ov}BdHFr`U_xV;D>r^cp!don#H-MPN((0z;+e&O_wj*;_avw3_^eI~Zg>TPB1iaHJ=JWaWU-Kge3ib;>CS-l;3s&y4 zmY$q{$35->UIr0vcg~}l^kWXqmKt3X(u<#OeO9~-F-wvLP_g08pxb?MQ7KVVm8f0Q z03VdHv2-46e6rvHRGW_CqPZCr0X^yy_rX4qAKK`yX-N;i zX7hZuPoX~bm`y}r>Eb258lTbKVv;QAI`sQP(A&4Gjzc@E4N_|+WD-Gra7|ZyY0*iS zUOqwbn{Xg1D(wpLJ0|tAIXPg>qK1TOdxMK)fy{%AlRm)KPZ>L;!E8HP4k{v)>+o4Y zI4^YU;gElniNy9|LZ)3@lIxOh7(Y4yDPK=p1|j72^J;-2b@fDG>}a#^Gx^JN`%85& zuS3h;IgpRDMC*KHir3(b2yJu^2_EwknWs~Sou?NrD>vQl$HAXX*~wUBWNUW1UVY=XUR8xvqQ(-|Dl&l zh=@hS{x09%40V|*lZFEN3e|?`A2{}FcAUpEvj6V0pJYU&ECfviQ4#`uG_I_9JZ)fP zy_0bpgi;zF@o{_HDFfZ_M|9LKJ}RQps<=HILGj^e*|$|hiEXn!cfm4|#C6vZkW$IJ z3e|?`A2@vhT^H(r%Fngt#|y40R~d2_Pa+i1eZ!-`a0#OSAjL*~SC9shk92d-uG>Y3 z`@<*!i&x3YH1bz_yCwW$fPp`P}to zK#vX7#?2{l>6%Cztzo|&pfL2RoTi4%Qv9JH?ij8H8t8!g*}W`%&B*21#SDLr87zVC z@fhcvYAQAg1M$dF?{O{z@>a3f72%1xY;-OXcj&;*--Z~S+eLI~H6U@jHo6zQbt{*1n8+XIPNA9w34t9bvh=dmnv7o zFiY?7po-;l^dd{5bxSJJ8dd}GPhOaIbKOzzd=64BpPvQsz}L`NgQfysnfUQm!5hv6 zyW|a73Ek+DDDaCb9-k7<=|Wyk-O*MAx?`orG4{Q>;Tq=Sz$8#4pWn?G^3Jn`G<2GHJwAxqI@DL}?SpgBsVG0ZCewHC_%>*Jxq0sT;5FgfPY?D#?e4;E8DAWHC)}Dcy<6c`|f-OWU_|GCPTjq!P!ZQ8FA;SGW zeCe@OwyA5bv#z7FoTI#coQ&I-R8{lT+dE_@LGT0j`RgjZT(QCt8RhtUgYvV2R9rA$ zd`uMqoqk2y0LGqC!;CXsa!!;5#5Lem(HSb_sAd3q@zg^`md>)6WS36ZE{%aE z*qm{!Z(u7aJHgvHWl*e`3pg`Fi;rHoJzt+iO${qBI2zY?FjPUQ!s(2DosHL5Cnd%3 zCA7DB^*WM#ABn)y)uJ{_v(iMlH;2c8ALysjclqhp1@k4aH;Co0LF1@Zp;tkRIWauL z)aA`aXtFG4v394}#>O|g3~^l+*$&jr3KX4TK|`+;j}6r z)RxV3!n*K8Hm2YbS3@KCJL;x5-=fCvJxbcdB z5~gxb{c)fCx_7!MKg=S4@&KAS#Wsf8e|M4G)2feO{ma!t|( zbK9@k313w7vAdxD@5%U-Fi8ja#ej!5n0W;&4u+C_z3++IUjMOvnla@t4)z;i4V)mH zL5~StdoG~K2<9VOnDm8$EmC%;b+WP(+o=;JM%{G>7fH?Nu`iLdvG=Qcj2s9{6Jc(oqpU#1W6&95!9E8&;@jk=GJ{z;>PA@RK zJTGZppcoG@H5pBxx`i8;X{CKb!;l6Y4=x#}07QGt@A$E9xZ#aN=;p&`mDt7gze}q_ zxOenwME?l`lP^&JOM-pLBL*BB{;H|ceef`1E+Zk;_cKYxX&@@9(z@^)2#+2D-1@0zQdi$H#e7ehok*s^75DOe3&; zWQ)$*vR7Vdy7ci)B>KW?cC+|OUHgZ zTnF*SYOtE7hnu3JHS6vP z93$!?N!OT%fki5^Bi40O3w4zlf`oh`?tzx{uJe9q9xmQm!fsi=f?Ki+yK%B%CaTum z&ViX~j#LTc_on!i15%@)Z z?AJUMm0J42N#YsF2Y^)T)G*%5fxn4CT<+-xGb zF<)3wMF(Z3JY$&@N_5aW!Puf`NH;4})%h;)UnXMxd1T)yrArYgt|^=VQi+le4TJ|A z=-FxdAf?Qxt6**gNJ6$}=f;Q584WevXneCF4aMLM3m;G+mTH~0{&{4jKA54BJsWJw zKP?S@SBT`>h8PyLRJ+)*Bm8)Pf5j~5GKwRne82K6mX7c-8NWjS56#zP4`S5Potzr1 z@80x+2X}EYHH~eB>eCWuuT4Wy?5YmyItT{W;RJ{)tud6Kg%}fwP`K7V0}MZUj+pD? zK-A$0U0>Giq25*|Y?A%d+d}_yZ1`)|b2#v47+OmcMSEI*szJ5q$RX7hANsD@8FJy) za*Wx5fo>z+gg&tnZ*Uq_EB74AbO$$Swfn9;l)bw)CGcMla*-1_+(WLWL#-2F$fO355!qh8c-z*e1`^ z?(Wk_s_BdHG@BhOz~89j`**xRy{6#I%q+taC%@R)Pq-nW{xU;MH^5-mMVI+KB{PzT zgV)a~W#hlrC?<|wcpKsR;`)_}Ne;am(6lM}=h5~m{y7fT)mqqQ=U*#gn^I7yI;BJF z4JCToTCRW{_gxw5Ou@FrOnJLv7C(1d8G(6(s{U`D>lH9kTHa>}L7q=PHdXij5zn`}Mz|(^QYn#fkBwub6Gp>aO z4igWn8Go__deLA|tl_tR+%~`~n;B2Y zCO@hZyI=QG5jbZ!Asr`;bZ77bcsCaA3D!25+eP8A(##WovmP2urMXOCxs$Li}1QX^3)tb0e1=?Z|F?gT^{tEFtGvY*900k@0@U8EiK0&_C|t zVQ*ak$j<~Nz6;)Pp-fz=T&Zm?#$t>km>+cbJCsfX9UtT0dShl1e}lS3 z_kHRhNr1J6m{=qVP5^yo{o()*LiGVg`Wm~}xc}=LZeIeHZJsf)p8}^ z08q$Hu@bdw6Gz#8ur*VVuiLbW*8-H=av!~I-7$;K`8XD`mbEaqOHxDd_mBJYOCywY z#aoi*++7)~S@Z~OOYfCLL>|fKbn>P*hAVeqBqRp=>En~^pNQdT;VBwMIN6C7ZOhR} zP#I~`3^t))!0)C!ticaRL`$)xSI9NF)zkzW9bV$0sB>O~UAodRtCr*_-61>IVNY1g zXW;_2Kb#GV1MFhKWW&B5TI8|=M%Pg@KQPWR#FZ*n4}aMm!2nJXG{}*xU1MF)m+2qj zqpKpP`Hv7X+D>a&_31zYtioP7;KoZoKiWs!!qg=LC8j z%mmzNc__J!oSphwY;x=L0r@p(SX} zP!2M_gtcXs{D0`bkw)*}jG4?K9v$S+OMk{ud2KYX_LfwNz}wh6q+APf3IM zK(aexNbvH6s{NcG6P18kZ|U+U5rVqp&AHQ&uZzO?E$j3)cEF1?UUWmUVfKCi7=M51 z?%1pvcD@qX{x>v+F$3}AqtpFFb&tkoaWOe&!N2>aPf@XI2P+av>G%@Lg|{<}yM>8T z7u|0@sR>9+QZ)|3emV`z-Os~~i}8f) zbd}i05s?(d0NTt{w-mBP6;|i2K)k(Q1m*QQEBYRLE?lDeA_Xk@FE_ah}4)kI`*y{3Py3H^i|$#v-+zfzw&Wt0%flRWHQ& z_qtS9s=n`}V1r99qZuO<5PDBShro$NLkGF$#9@?&e(U@! zh4Wr)d4X(2p-b1a)(gCiw9Rcz;ni8<4I|((&uk&85(VGueb2|lnW09UL9B|}ZZ4$- za4@DH6O|_zccgf@2Lh*-a4yyA)!YM9@$iV2JRxFv4-}7;p@+r5C$_Xc=Yf&f(>We} z=BO-lvh+d-s%UFRTvCe5 z`Anz3#z)-XfV67(41X%3tN$xAj_wljb*`U)<$^1pGTu6SJh+1bNvcXe;7j16>wEcS z0Fqj};r<#4DRI{AAl^{t2WU z!+GWlZkXx&s4JujPOA4jow7V8+Fa})t9%62OB0jdxG}|3l)$DuK?EAX1)9P(bCBFo z*F1eDv(d4OI$Vu{3;m$S~R!y%Dd$Q01n}yPTv*#=PI!pT`Suq*y$j zqk-cGUZ6A?2}f+_^QTVIEjD}yc-w{#e$TG=P2#GyYwm>mt@h9?u zNG9&>y(R&}-Z~9mx0Ljzil1uiANa-#kKy6awbPQBZv}bHgW|+H*z>cwNzA?Rx5Gq% zV)zIu{4*GYF$s}xe1`A`CzPi>*tBQXQ(Va-Pp>pt2}j7Eswh9%TT4Ybtkf#9RD6AY zTWY_Yigco1++*cuGF)nxh19rG9DF zXO~R-_eP9mBCuFBaw0lTV1G&e!=k*4@{KTurS6esv#CQ$W!^6>_jStq9{y!)WW@`E z)X-i@rDx&ekLYdv7T34^r7?+;-gjFX^b03Xg%2qKij1z~EGo4EGqM!?2ODUToWVG- z^E4DTvB9-Hq}r$kw5lPUe=yJJ%gB) zQg(d_)C|mq)~M%0lwvOi4}2Q7*SaMH4qhzdiY1=z3{!0i*Mrbydve`ks08l8GriCk^DrvGC=|7 z?jv4$kkOf{Utes^FGLE>)sp46SOzw_R%$9uPN#13MUs)G!Zipn548UAici&MbU-)n zpYL27kIB(j4U|9xx3xZBvEL=a>)v>=<}?+PnXzf8(%6eycrcZL@FN{aE^L);X7QS$ zrK^JMU~y8F!(`7LbkhGsecwv%Yhw;tq6^2Cj9hpQGOwN`ei&@xvAO>!%p8IN=Wmh26gj}YCAf)u1bQ*1HKp!$kG*8d5U74x z_@oQ{#;H-)aOhQG;7l4APU5lP->yApzTju|>U%qA z`n-SIBd=aA^s4)XpY;SFx{x)|=ZTH`KT5np3~A$73<)V} zyKBb%wDhocqY&yx#Sig|+;}zLo5(;{lT0@MdUK&UiVlp&(}#~%LE-5Gr6stpa5n$RzKNTiDmZ{Veu?LMN;m3Go>q6aphjy*BU?$C?R1aJ9hA;^&+Etv_f zbawKkE0G}y3rj2UJ6CCMjh>rpQw2C_RAM2NbR}wqRr?`iX~3W-mK(nz7mhk|yT3jw zm09E?es>Rg;yz(DN(J!C^v5E3ds#fuRs8nH2mwu3fHb@}ATyugO{E-B&&B!GU&Di< zG(%e&Bro+>Kp>Kbt7Fm!8;C={pyDt=biz0PlUOtQS`@AoKR0o#NYpkK*Uj)6b@JoI z#~WOt-u_MuxCbE1cSiGr&IR9r&CCHG59Ekn!irA>=4Z3xE*z>RJ*onHUv>}9SIIF6 zDakPHp?0V;PQ&ZN-M3$i`YzmWs4d#fJ5}>MdSQ4OYscRhA}t%9QILcMO-Y;{`vr*X ze_~JnfX!pB2x^7)z6)k6I&%G1x=gm~A%s(mtUad1-YMO+Yu~z<*@pP(we=u}c=ZRH zE66aB(*$#D+f{g44(z@Fvq+b@^(W@(G z)9&yJ(1~KzJxL+YHi)#0cd=ambmcCDKVZ6wGPgPv}#SoqROA01PffK{hm|c zVJ_lvDocIUFOTQnvWsEd5CkWAUxaC7q_j?zbq*%y`7ZAz=& z#Lv(%sY>{Xuy$vHName4S$HUXRSjv<3@Y(;^{JZh#3IsB6n<&!RV-&VRon?bB?c;9 z#4fL9w!U46rC9QmGPk87qJh$|(snAF>N<=(Sbyw)kqJ#DKU$iYV!~zh4on#nj&Q}7 zmuoCCut?u0pS>StGMCZ|oaDScA|kK;^)1;v?hNEZJHKiBl*hbseL835L~t^LRPQ#g zb9eOVAx*{~8kH!EcqQX@p8$oPyqH0ph-$0zu{Lx8md7$YQh}ty{$4EdQ1O+Pp}qks z#BLh##jyeoUA^HO0`Sd_P-r^P+VB7=QQ=m&w3K-ZscbDCd~?m-zU>vwelc!vV_g2L z6^J`S-G-^0mBGtHf@g{|%w6ZLBue8g>BE7tHTnMs46hiJqzW(`0QcLZbh%6v;EVuA zMy}w(VRA(SJ+qbYEzF|Gc1E1TE)5;a9S4xA`LAgDiV1Hob2lGa2pMswO24XkCUr-;6SMEKK$lN^~Zi5T+V}3&P?fA%SBA1QERmGYESDK!?96a2G)lFrcUht z-aYHNW=pgIh3NKgV>z%oYvP{u%GQW8FGN!MLP!W%xC%k2ZQm~|`XkvCJB^jp{v^4* z2(%XVYL^Ljz}VA1n)QTtRkf1ok_2(BM{IqPO-?l%x!Yj&K_YbCb=(I8mwa)3&t9@t zU#Y*OZotaV^v&=I@(Q*?05^BpSJyj4vcj*Fp)HwE^%;+5>19HCgUL(okHEqgqi9U` zrabZBrhlJh<^kr;*zPAo?v}BIy?2~}FE~DAf~7>PWy~)s_ugu3EU*gsG%Em3RTtxiwzM1(*mLx=JH=aQ4u_~Oop-0m(SK9Vy4er(1-eG28kAds?Ao&-S z!h;K)65IJ|PCR$vIIftv5@g+6Hi&(RW5ytpOF8&_+%Qm(+8D1fZk?*-h$Vb-!Z_z)1@yMEl7CA z?b|B^t=Y#4-k0({|FN`3T^eo^vBe1|Dtrxn5#NtA0kN;NvBndIW)w^Kk%Y9zP?5yx zG=7bIe4P1y+t3qCcAg}38@=7=KCPH4(@V&)Ut?dJG}@TNme@;SXVz~8>uFvl2{%Hs z81V(;9TQ_@20pPmk;*x$%7*UxY?*-edcPb!P{jgRA?A)R&sfh8(%M04^uo=ko9R;1 zhWH<4Fx3kGUsrcw=CU!ODh0b5bO46Bz|p9`0(KeS1QvhHLhu_glzaL**@KyOfrfW% z>7<=3@aO%%lj1F+a(jKlE8sikd%>`xhRjttj!|xqPIV_RA*EsSG$ozeqGm^)&9r<% zgTIN~^Ey>UbB7JEn6!VH1s@ZpzfyUdZVVmmYuNINL4x;_U&PZUy9fQl^w%gtG?ar9 zA!)RE=^M#`v}IGrQ2*y?xyW096ZW1kWL|{_PYY&GK$kL|s~15W#9yki!bU6xOpn*j zSx82&+uH*G`}WFe7`GE&3$WTZQCJHPbnjUKOryoQcw|^!P5Ghjuku^tpRa_$y!7d3&IL@UPDR)AG-TNzM#j7%R0U%ly=sDe8K&A%bHM3^ z<@B{+)m%hKa82;4m)&HBcT^6hVC}6-`h~66_}o2B?Cc7B@I zjdVH9w=WAfe6MJxOHaMbXx{bK&4;s7EV*{5oTp8cNPAEW;!bNQD3@>J(z_+uAeXT( zWod6osao&Yu)wbzPL91Rv-MqWH?#WfcGySG0suQRH*Vzx$gE4ahk0lRa@U(~5ly>bQ_&nwT9oZlfa{N?&-%*0+FV3{~_ zm6E2J*uTfsZ!nI~q8X+P{2;>Grdm9Epl<}P+1>YK%Ub+qXg8S`sO3NK#T3)T+W-DD z^ZZEhe>QKS*$1PvscfU%N&QEfa|X~+y;WU&|Jsdi9J4{J8u;wKaqK#GFo+{EK#uV} zQSh|7B*M`6I_8sRbs~cn(p<`g7kTIutD|A@r}lcnwZ#dt*6h_|~okXxrK$=&1!4wllT|lT#{z4l$2h$}1 zR<3ReV|p+mUb63O-iX3tl~KdJ*+Sq2463c6F>KkflSXy1;Z>e6iHF>X4JC2*v}9wH zP3JFz<;y^X)MZG}M5*v})&kzU%|58Z;lX?wNJ@-zcO)d=84R7r*HQDjVZ*brDf2eUEw`noMD)<|Fw!*d3A z_zLSh!T8`S_sNIsBB_W35{V|=m?Ut27hiqmDA2rJEk%I z=vjq1%UsTR*eE_?rI0-7NcbwbL|9QpNja%<+wq%-MaKQ@r8ipwo|huJ%hpv1@#4(S zVKkXOPOk-w7VRLDjf<@ed`))CIYLiPiZ&A9?$wJn)JQerhsbBq0Q{N;qT6K(OF+`A zC`3q`K{VmlQ@E|c;hxIBBL=Kq(#Og0U^nvx1fdQczSVW&S>Aj?-sIkG6Vx5XYW>~u z4h8I8;xVi>F@N<#i427i8h)bo(IVo2>ueN=#r;&|2kUR~Jz8m2yjlAR7*=U731F>% zxaeqWcH=59GYAk#)1BQSD*Mh<8

%X^~NSP<2|z9D`8I{y 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