From 74289ce456f8de35d9792f955c85e81ee68309c7 Mon Sep 17 00:00:00 2001 From: chlins Date: Tue, 29 Sep 2026 14:25:09 +0800 Subject: [PATCH] feat(website): add bilingual Hugo website and GitHub Pages deployment Add localized homepage and getting-started content, shared Hugo layouts, accessible interactions, and self-hosted visual assets. Use native build-time internationalization with independent language URLs and strict translation, routing, and SVG escaping checks. Configure guarded GitHub Pages deployment and document the website maintenance workflow. Signed-off-by: chlins --- .github/workflows/website.yml | 78 + .gitignore | 3 + README.md | 14 + website/README.md | 109 ++ website/assets/artifact.svg | 49 + website/content/en/_index.md | 62 + website/content/en/getting-started.md | 138 ++ website/content/zh/_index.md | 62 + website/content/zh/getting-started.md | 138 ++ website/data/commands.json | 6 + website/hugo.toml | 38 + website/i18n/en.json | 59 + website/i18n/zh.json | 59 + website/layouts/_markup/render-codeblock.html | 10 + website/layouts/baseof.html | 34 + website/layouts/docs/single.html | 20 + website/layouts/home.html | 106 ++ website/layouts/partials/footer.html | 35 + website/layouts/partials/header.html | 35 + website/layouts/partials/icons/copy.html | 4 + website/layouts/partials/icons/github.html | 3 + website/layouts/partials/standards.html | 17 + website/layouts/partials/visuals/fetch.html | 8 + website/layouts/partials/visuals/package.html | 9 + .../layouts/partials/visuals/registry.html | 8 + website/layouts/partials/workflow.html | 44 + website/package.json | 13 + website/scripts/site.test.mjs | 283 +++ website/static/app.js | 108 ++ website/static/assets/manrope-LICENSE.txt | 93 + website/static/assets/manrope.ttf | Bin 0 -> 164700 bytes website/static/assets/mark.svg | 1 + website/static/assets/mono-LICENSE.txt | 93 + website/static/assets/mono.ttf | Bin 0 -> 128812 bytes website/static/styles.css | 1573 +++++++++++++++++ 35 files changed, 3312 insertions(+) create mode 100644 .github/workflows/website.yml create mode 100644 website/README.md create mode 100644 website/assets/artifact.svg create mode 100644 website/content/en/_index.md create mode 100644 website/content/en/getting-started.md create mode 100644 website/content/zh/_index.md create mode 100644 website/content/zh/getting-started.md create mode 100644 website/data/commands.json create mode 100644 website/hugo.toml create mode 100644 website/i18n/en.json create mode 100644 website/i18n/zh.json create mode 100644 website/layouts/_markup/render-codeblock.html create mode 100644 website/layouts/baseof.html create mode 100644 website/layouts/docs/single.html create mode 100644 website/layouts/home.html create mode 100644 website/layouts/partials/footer.html create mode 100644 website/layouts/partials/header.html create mode 100644 website/layouts/partials/icons/copy.html create mode 100644 website/layouts/partials/icons/github.html create mode 100644 website/layouts/partials/standards.html create mode 100644 website/layouts/partials/visuals/fetch.html create mode 100644 website/layouts/partials/visuals/package.html create mode 100644 website/layouts/partials/visuals/registry.html create mode 100644 website/layouts/partials/workflow.html create mode 100644 website/package.json create mode 100644 website/scripts/site.test.mjs create mode 100644 website/static/app.js create mode 100644 website/static/assets/manrope-LICENSE.txt create mode 100644 website/static/assets/manrope.ttf create mode 100644 website/static/assets/mark.svg create mode 100644 website/static/assets/mono-LICENSE.txt create mode 100644 website/static/assets/mono.ttf create mode 100644 website/static/styles.css diff --git a/.github/workflows/website.yml b/.github/workflows/website.yml new file mode 100644 index 00000000..f70d52cf --- /dev/null +++ b/.github/workflows/website.yml @@ -0,0 +1,78 @@ +name: Website + +on: + push: + branches: [main] + paths: + - 'website/**' + - '.github/workflows/website.yml' + pull_request: + paths: + - 'website/**' + - '.github/workflows/website.yml' + workflow_dispatch: + +permissions: + contents: read + +jobs: + test-and-build: + runs-on: ubuntu-latest + timeout-minutes: 5 + defaults: + run: + working-directory: website + steps: + - name: Checkout + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # Pinned to the existing repository workflows + - name: Set up Node.js + uses: actions/setup-node@249970729cb0ef3589644e2896645e5dc5ba9c38 # v6 + with: + node-version: '22' + package-manager-cache: false + - name: Install Hugo v0.167.0 + env: + HUGO_VERSION: '0.167.0' + HUGO_SHA256: '4d84519b9f619e6d4c3fb45a50157abeabeb724f859c60605f44c23def6e1169' + run: | + archive="hugo_${HUGO_VERSION}_linux-amd64.tar.gz" + directory="${RUNNER_TEMP}/hugo" + mkdir -p "$directory" + curl --fail --silent --show-error --location --retry 3 \ + "https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/${archive}" \ + --output "${directory}/${archive}" + printf '%s %s\n' "$HUGO_SHA256" "${directory}/${archive}" | sha256sum --check --strict + tar --extract --gzip --file "${directory}/${archive}" --directory "$directory" hugo + echo "$directory" >> "$GITHUB_PATH" + "${directory}/hugo" version + - name: Test + run: npm test + - name: Build + run: npm run build + - name: Upload GitHub Pages artifact + if: github.repository == 'modelpack/modctl' && github.ref == 'refs/heads/main' && github.event_name != 'pull_request' + uses: actions/upload-pages-artifact@7b1f4a764d45c48632c6b24a0339c27f5614fb0b # v4 + with: + path: website/dist + + deploy: + if: github.repository == 'modelpack/modctl' && github.ref == 'refs/heads/main' && github.event_name != 'pull_request' + needs: test-and-build + runs-on: ubuntu-latest + timeout-minutes: 10 + permissions: + pages: write + id-token: write + # Serialize deployments without interrupting a site that's being published. + concurrency: + group: github-pages + cancel-in-progress: false + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + steps: + - name: Configure GitHub Pages + uses: actions/configure-pages@983d7736d9b0ae728b81ab479565c72886d7745b # v5 + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@d6db90164ac5ed86f2b6aed7e0febac5b3c0c03e # v4 diff --git a/.gitignore b/.gitignore index 6210b861..0f9952da 100644 --- a/.gitignore +++ b/.gitignore @@ -60,3 +60,6 @@ Temporary Items # output bin output +website/dist/ +website/.hugo_build.lock +website/resources/ diff --git a/README.md b/README.md index 02e5aca3..d13a548a 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,20 @@ It offers commands such as `build`, `pull`, `push`, and more, making it easy for You can find the full documentation on the [getting started](./docs/getting-started.md). +## Website + +Project website: . + +The project website lives in [`website/`](./website/README.md), built with Hugo's native multilingual support and separate English/Chinese content. +Install Hugo 0.167.0 and Node.js 22 or newer, then run locally without npm package dependencies: + +```shell +cd website +npm run dev +``` + +Open . Use `npm test` to validate the site and `npm run build` to create the deployable `website/dist/` directory. + ## Copyright Copyright © contributors to ModelPack, established as ModelPack a Series of LF Projects, LLC. diff --git a/website/README.md b/website/README.md new file mode 100644 index 00000000..15e851fe --- /dev/null +++ b/website/README.md @@ -0,0 +1,109 @@ +# modctl website + +The website uses **Hugo 0.167.0's native multilingual support** to generate static pages. GitHub Pages hosts only the build output. There is no client-side translation engine, custom template engine, or custom HTTP server. + +## Getting started + +Install the standard edition of [Hugo 0.167.0](https://github.com/gohugoio/hugo/releases/tag/v0.167.0) and add `hugo` to your PATH. The Extended edition is not required. Node.js 22+ is used only for npm commands and tests. There are no npm package dependencies, so `npm install` is unnecessary. + +```sh +cd website +hugo version +npm run dev +``` + +Hugo's built-in development server watches files and reloads pages when they change: + +- English: +- Chinese: +- English documentation: +- Chinese documentation: + +You can also run Hugo directly without npm: + +```sh +hugo server --bind localhost --port 4173 --baseURL http://localhost:4173/ +``` + +The server listens on localhost by default. Website tooling does not change the Go application's dependencies. + +## Directory structure + +```text +website/ +├── hugo.toml # Base URL, languages, and Markdown rendering +├── content/ +│ ├── en/ +│ │ ├── _index.md # English homepage content in front matter +│ │ └── getting-started.md # English documentation in Markdown +│ └── zh/ # Corresponding Chinese content +├── i18n/ +│ ├── en.json # English UI, accessibility, and feedback messages +│ └── zh.json # Chinese translations with the same keys +├── data/commands.json # CLI examples shared across languages +├── layouts/ +│ ├── baseof.html # HTML shell, language, and SEO metadata +│ ├── home.html # Shared homepage layout, without language branches +│ ├── docs/single.html # Shared documentation layout and table of contents +│ ├── _markup/ # Markdown code-block render hook with copy controls +│ └── partials/ # Shared navigation, footer, workflows, and diagrams +├── assets/artifact.svg # SVG template localized at build time +├── static/ # CSS, interaction scripts, fonts, and shared assets +└── scripts/site.test.mjs # Tests using real Hugo builds and generated output +``` + +### Maintaining multilingual content + +- Keep page content in each language's `content` directory and short UI messages in `i18n`. Editing text should not require changes to JavaScript or the HTML layout. +- Use matching relative filenames and `translationKey` values for corresponding pages. Hugo associates the translations natively. Homepage front matter has the same structure in each language, with translated values. +- Hugo's `i18n` function renders UI messages into HTML at build time. Menu and copy controls use the labels already rendered for the current page. They do not detect a language or replace page content in the browser. +- Language navigation uses `.Translations` to generate ordinary links to the current page's translations. Content, code examples, and language links remain available with JavaScript disabled. +- The URL determines the language. English is served at the root and Chinese at `/zh/`. The site does not use browser-language redirects, cookies, or localStorage. The prototype's `?lang=zh` parameter no longer selects a language. Use `/zh/` instead. +- HTML `lang`, canonical URLs, `hreflang` links, and sitemaps are generated at build time. To add a language, update `hugo.toml`, add corresponding `content//` and `i18n/.json` files, and extend the current bilingual acceptance tests. +- Keep CLI examples consistent with the repository's `docs/getting-started.md`. Illustrations and fonts are served locally. Font licenses are included in `static/assets/*-LICENSE.txt`. + +### JavaScript responsibilities + +`static/app.js` handles only the mobile menu, terminal tabs, clipboard controls, and table-of-contents highlighting. All localized page and terminal content is generated at build time. With JavaScript disabled, all workflow examples remain visible and inactive copy buttons are hidden. + +## Testing and building + +```sh +npm test +npm run build +``` + +Build output is written to `dist/`, including separate language pages, shared assets, and sitemaps. Hosting the generated files requires neither Node.js nor Hugo nor a backend service. Use the same Hugo version as CI, which verifies the official release archive against a pinned SHA-256 checksum. + +Tests use Node's built-in test runner and invoke Hugo directly rather than maintaining a separate rendering or translation implementation. They check: + +- Matching translation keys, nonempty messages, corresponding content files, and front matter structure across languages. +- Build failures for missing translations and other warnings instead of silently hiding missing translations through fallback behavior. +- Generated files, resource links and anchors under `/modctl/`, canonical URLs, and reciprocal `hreflang` links. +- Copy buttons generated from Markdown code blocks and their corresponding code element IDs. +- The absence of legacy `data-zh` attributes, client-side language-switching functions, and language storage. + +If Hugo is not on your PATH, set `HUGO_BINARY=/absolute/path/to/hugo` when running tests. Development and build commands invoke `hugo` directly, without a custom installer or wrapper. + +Browser regression checks should cover both pages in both languages, viewport widths from 320px to 1920px, JavaScript-disabled access, language navigation, copying, keyboard tab controls, mobile navigation, and reduced motion. Automated accessibility checks do not replace visual and maintainability reviews. + +## GitHub Pages + +The configured site URL is . Chinese pages are served at . + +`.github/workflows/website.yml` tests and builds pull requests. It uploads `website/dist/` and deploys only when website or workflow changes reach `main` in the upstream `modelpack/modctl` repository, or when manually triggered on `main`. Forks do not deploy automatically. + +Initial setup: + +1. Select **GitHub Actions** in [Settings → Pages](https://github.com/modelpack/modctl/settings/pages). +2. Merge into `main` using the repository's existing review process. Do not bypass branch protection. +3. Check results in [Actions → Website](https://github.com/modelpack/modctl/actions/workflows/website.yml). To redeploy, select **Run workflow** on `main`. +4. The `github-pages` environment permits deployments only from `main`. If environment reviewers are configured, their approval is also required. + +The build job has read-only permissions. The deploy job's `pages: write` and `id-token: write` permissions are scoped to GitHub Pages deployment. No additional PAT, CNAME, or `gh-pages` branch is needed. Deployments are serialized without interrupting an in-progress deployment. + +Hugo's `baseURL` is `https://modelpack.github.io/modctl/`. Templates use `.RelPermalink` and `relURL` rather than hard-coding `/modctl/`. The development command overrides this with a local URL. To use another domain or subpath, update `baseURL` and the test target. + +## Design references + +The design uses a cool-white, ink-blue, and blue palette with layered model-artifact illustrations. Content organization draws on Cilium, Envoy, and Harbor. Multilingual project organization follows the [Kubernetes website](https://github.com/kubernetes/website/blob/main/hugo.toml) and [Hugo's multilingual documentation](https://gohugo.io/content-management/multilingual/). No external project's page code or endorsement is reused. diff --git a/website/assets/artifact.svg b/website/assets/artifact.svg new file mode 100644 index 00000000..864656a2 --- /dev/null +++ b/website/assets/artifact.svg @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +{{ i18n "artifactWeights" | htmlEscape }}{{ i18n "artifactConfig" | htmlEscape }}{{ i18n "artifactCode" | htmlEscape }}{{ i18n "artifactDocs" | htmlEscape }} + + diff --git a/website/content/en/_index.md b/website/content/en/_index.md new file mode 100644 index 00000000..2e928648 --- /dev/null +++ b/website/content/en/_index.md @@ -0,0 +1,62 @@ +--- +title: "Your models. Ready for anywhere." +description: "Build, push, and pull AI models as OCI artifacts. modctl brings a familiar, open-standard workflow to model distribution." +translationKey: home +hero: + eyebrow: "OPEN SOURCE. MODEL NATIVE." + lines: ["Your models.", "Ready for", "anywhere."] + description: "Ship AI models like you ship containers. Build, push, and pull OCI model artifacts with one simple, familiar command-line tool." +why: + eyebrow: "LESS FRICTION. MORE BUILDING." + title: "Model delivery." + subtitle: "Without the detours." + description: "Your models don't need a separate universe. Bring weights, configuration, and code together, then put your existing infrastructure to work." +features: + - visual: package + title: "Many files. One artifact." + description: "Package weights, config, code, and docs into a standard OCI model artifact with a declarative Modelfile." + link: "Meet the Modelfile" + anchor: modelfile + - visual: registry + title: "Your registry. Already ready." + description: "Push models to OCI-compatible registries. Keep the tags, authentication, and distribution workflows you already know." + link: "Explore distribution" + anchor: distribute + - visual: fetch + title: "Just what you need." + description: "Fetch files by pattern or extract models straight from a remote registry, without keeping an extra local artifact copy." + link: "Work a little lighter" + anchor: extract +workflow: + eyebrow: "FROM YOUR DIRECTORY TO YOUR REGISTRY" + title: "Same workflow." + subtitle: "New possibilities." + description: "Three familiar commands. One open path from local development to wherever your models go next." + note: "Not another platform. Just a better way to ship." + steps: + - id: build + title: "Build your model" + subtitle: "From model files to an OCI artifact" + comment: "Turn a model directory into an OCI artifact" + results: ["Weights, configuration, code & docs", "Model Spec artifact layout", "Ready for your OCI registry"] + - id: push + title: "Push to your registry" + subtitle: "Package once, distribute anywhere" + comment: "Authenticate, then publish your model" + results: ["Use your existing registry credentials", "Publish a versioned model artifact", "Share a reference, not a folder of files"] + - id: pull + title: "Pull it. Make it yours." + subtitle: "Get your model where it needs to be" + comment: "Bring the model to your workspace" + results: ["Retrieve a model by its registry reference", "Extract the model files to your directory", "Continue with your own inference tooling"] +ecosystem: + eyebrow: "PART OF YOUR STACK. NOT A NEW ONE." + title: "Built to fit." + subtitle: "Not to lock you in." + description: "Built on the ModelPack Model Spec, modctl packages models as OCI-compatible artifacts. Choose where your models live, without choosing a proprietary format." +community: + eyebrow: "OPEN SOURCE. SHARED FUTURE." + title: "Your next model." + subtitle: "A better way to ship it." + description: "Start with your first artifact. Or help shape what comes next." +--- diff --git a/website/content/en/getting-started.md b/website/content/en/getting-started.md new file mode 100644 index 00000000..5581e419 --- /dev/null +++ b/website/content/en/getting-started.md @@ -0,0 +1,138 @@ +--- +title: "Your first model artifact." +description: "Install modctl and build, push, and pull your first OCI model artifact." +type: docs +translationKey: getting-started +eyebrow: "DOCUMENTATION / QUICKSTART" +intro: "Go from a local model directory to an OCI artifact in your registry. This guide takes you through the complete workflow." +note: "You'll need a directory of model files and an OCI-compatible registry you can push to. The reference registry.com/models/llama3:v1.0.0 is a placeholder. Replace it with your own." +--- + +## 01. Install modctl {#installation} + +Installing from `main` requires Go 1.25.5 or newer, as declared in the current `go.mod`. Make sure your Go bin directory is on your `PATH`. This command tracks `main` rather than a pinned stable release. + +```bash +go install github.com/modelpack/modctl@main +modctl --help +``` + +You can also explore the project's [releases](https://github.com/modelpack/modctl/releases) for available versions. + +### Build from source + +```bash +git clone https://github.com/modelpack/modctl.git +cd modctl +make +./output/modctl -h +``` + +Building from source also requires Git and Make. Run `./output/modctl` directly, or place the resulting binary on your `PATH`. + +## 02. Define your model {#modelfile} + +Run the generator inside your model directory, then review and adjust the `Modelfile`. It describes model metadata and which weights, configuration, code, and documentation to include. + +```bash +modctl modelfile generate . +``` + +A minimal example for a Safetensors model. Adapt the metadata and file patterns to match your actual model and files. + +```text +NAME llama3 +ARCH transformer +FAMILY llama3 +FORMAT safetensors +PRECISION bf16 + +CONFIG config.json +MODEL *.safetensors +CODE *.py +DOC *.md +``` + +### Exclude files you don't need + +Use `--exclude` during generation to skip matching files. It supports basic glob patterns (`*`, `?`, `[]`) rather than recursive `**` patterns. + +```bash +modctl modelfile generate . --exclude 'checkpoint-*' +``` + +## 03. Build an OCI artifact {#build} + +Build the artifact from the same directory and give it a registry reference. By default, the artifact stays local. Building does not automatically upload your model. + +```bash +modctl build \ + -t registry.com/models/llama3:v1.0.0 \ + -f Modelfile . +``` + +### Build directly to a remote registry + +Log in to your target registry first, then use `--output-remote` to push directly as part of the build. This avoids keeping both the source model and a local built copy. + +```bash +modctl login -u YOUR_USERNAME registry.com +modctl build \ + -t registry.com/models/llama3:v1.0.0 \ + -f Modelfile . --output-remote +``` + +## 04. Push and pull {#distribute} + +Log in to your registry and enter your password or access token at the terminal prompt. Then push your locally built artifact. Avoid putting a real password directly in command-line arguments. + +```bash +modctl login -u YOUR_USERNAME registry.com +modctl push registry.com/models/llama3:v1.0.0 +``` + +Pull the artifact by the same reference on another machine or workspace. Authenticate first when using a private registry. + +```bash +modctl pull registry.com/models/llama3:v1.0.0 +``` + +## 05. Work with your model files {#extract} + +Extract the model files to a directory, then load them with your own inference tooling. modctl manages model artifacts. It does not provide an inference runtime. + +```bash +modctl extract registry.com/models/llama3:v1.0.0 \ + --output ./my-model +``` + +### Extract directly from a registry + +Extract a remote model directly to your target directory without keeping a full local artifact copy. + +```bash +modctl pull registry.com/models/llama3:v1.0.0 \ + --extract-dir ./my-model --extract-from-remote +``` + +### Fetch only matching files + +Only need configuration files? Use a file pattern to select what to fetch. + +```bash +modctl fetch registry.com/models/llama3:v1.0.0 \ + --output ./model-config --patterns '*.json' +``` + +## Keep building {#next} + +List local artifacts, inspect their metadata, or give an existing model a new tag. + +```bash +modctl ls +modctl inspect registry.com/models/llama3:v1.0.0 +modctl tag registry.com/models/llama3:v1.0.0 \ + registry.com/models/llama3:latest +``` + +Read the [full command guide](https://github.com/modelpack/modctl/blob/main/docs/getting-started.md) for more capabilities, including `attach` and `upload`. Issues and contributions are welcome on GitHub. diff --git a/website/content/zh/_index.md b/website/content/zh/_index.md new file mode 100644 index 00000000..9e22730d --- /dev/null +++ b/website/content/zh/_index.md @@ -0,0 +1,62 @@ +--- +title: "你的模型,自由交付。" +description: "使用 modctl 构建、推送和拉取 OCI 模型制品。开放标准,熟悉流程,让模型交付回归简单。" +translationKey: home +hero: + eyebrow: "开源开放 · 为 AI 模型而生" + lines: ["你的模型,", "随时就绪,", "自由交付。"] + description: "像管理容器一样管理 AI 模型。用 modctl 构建、推送和拉取 OCI 模型制品,让模型交付回归简单。" +why: + eyebrow: "少一点繁琐,多一点创造" + title: "交付模型," + subtitle: "无需绕路。" + description: "模型不必拥有一套孤立的交付系统。modctl 将模型权重、配置和代码打包,让它们融入你熟悉的基础设施。" +features: + - visual: package + title: "多个文件,一个制品。" + description: "通过声明式 Modelfile,将权重、配置、代码和文档构建为标准的 OCI 模型制品。" + link: "认识 Modelfile" + anchor: modelfile + - visual: registry + title: "现有仓库,即刻复用。" + description: "将模型推送到兼容 OCI 的仓库,沿用熟悉的版本标签、认证方式和分发流程。" + link: "探索模型分发" + anchor: distribute + - visual: fetch + title: "精准获取,轻装上阵。" + description: "按文件模式获取所需内容,或直接从远端提取模型,减少不必要的本地存储。" + link: "更灵活地使用模型" + anchor: extract +workflow: + eyebrow: "从本地目录到模型仓库" + title: "熟悉的流程," + subtitle: "全新的可能。" + description: "三个熟悉的命令。一条开放的交付路径。让模型从本地开发走向更多环境。" + note: "不是新平台,只是更简单的交付方式。" + steps: + - id: build + title: "构建模型" + subtitle: "从模型文件到 OCI 制品" + comment: "将模型目录打包为 OCI 制品" + results: ["权重、配置、代码与文档", "遵循 Model Spec 的制品结构", "准备好推送至你的仓库"] + - id: push + title: "推送至仓库" + subtitle: "一次打包,随处分发" + comment: "认证后,将模型发布至仓库" + results: ["沿用现有仓库凭据", "发布带有版本标签的模型制品", "分享一个引用,而非整个文件目录"] + - id: pull + title: "拉取并使用" + subtitle: "让模型在需要的地方就绪" + comment: "将模型拉取到你的工作区" + results: ["通过仓库引用获取模型", "将模型文件提取至指定目录", "接入你自己的推理工具"] +ecosystem: + eyebrow: "融入你的技术栈,而非取代它" + title: "为开放生态" + subtitle: "而构建。" + description: "modctl 基于 ModelPack Model Spec 构建,将模型打包成兼容 OCI 的制品。为你的模型选择仓库,而不是让仓库决定模型的未来。" +community: + eyebrow: "开放源码,共同构建" + title: "下一个模型," + subtitle: "换一种更好的交付方式。" + description: "从第一个制品开始,或者加入我们,共同改进模型交付。" +--- diff --git a/website/content/zh/getting-started.md b/website/content/zh/getting-started.md new file mode 100644 index 00000000..dd773d09 --- /dev/null +++ b/website/content/zh/getting-started.md @@ -0,0 +1,138 @@ +--- +title: "从你的第一个模型开始。" +description: "安装 modctl,构建、推送并拉取你的第一个 OCI 模型制品。" +type: docs +translationKey: getting-started +eyebrow: "文档 / 快速入门" +intro: "从本地模型目录出发,构建一个 OCI 制品,并将它推送至模型仓库。本指南带你走完完整流程。" +note: "准备好一个包含模型文件的目录,以及一个你有推送权限、兼容 OCI 的仓库。示例中的 registry.com/models/llama3:v1.0.0 是占位引用,请替换为你自己的地址。" +--- + +## 01. 安装 modctl {#installation} + +从 `main` 分支安装需要 Go 1.25.5 或更新版本(以当前 `go.mod` 为准)。请确保 Go 的 bin 目录位于 `PATH` 中。以下命令跟随 `main` 分支,并非固定的稳定发行版。 + +```bash +go install github.com/modelpack/modctl@main +modctl --help +``` + +也可以查看项目的[版本发布页面](https://github.com/modelpack/modctl/releases),了解可用版本。 + +### 从源码构建 + +```bash +git clone https://github.com/modelpack/modctl.git +cd modctl +make +./output/modctl -h +``` + +源码构建还需要 Git 和 Make。可直接使用 `./output/modctl`,或将生成的二进制文件加入 `PATH`。 + +## 02. 定义你的模型 {#modelfile} + +在模型所在目录运行生成命令,然后检查并按需调整 `Modelfile`。它描述模型元数据,以及应包含的权重、配置、代码和文档。 + +```bash +modctl modelfile generate . +``` + +一个 Safetensors 模型的精简示例。请根据实际文件和模型属性调整元数据及文件模式。 + +```text +NAME llama3 +ARCH transformer +FAMILY llama3 +FORMAT safetensors +PRECISION bf16 + +CONFIG config.json +MODEL *.safetensors +CODE *.py +DOC *.md +``` + +### 排除不需要的文件 + +生成时通过 `--exclude` 跳过匹配的文件。此选项支持基础通配符 `*`、`?`、`[]`,不支持递归匹配 `**`。 + +```bash +modctl modelfile generate . --exclude 'checkpoint-*' +``` + +## 03. 构建 OCI 制品 {#build} + +在同一目录构建制品,并为它指定仓库引用。默认构建将制品存放在本地,不会自动上传模型。 + +```bash +modctl build \ + -t registry.com/models/llama3:v1.0.0 \ + -f Modelfile . +``` + +### 直接构建至远端仓库 + +先登录目标仓库,再使用 `--output-remote`,在构建时将制品直接上传至远端。这样无需同时保留原始模型和本地构建副本。 + +```bash +modctl login -u YOUR_USERNAME registry.com +modctl build \ + -t registry.com/models/llama3:v1.0.0 \ + -f Modelfile . --output-remote +``` + +## 04. 推送与拉取 {#distribute} + +登录目标仓库,在终端提示时输入密码或访问令牌。然后推送本地构建的制品。请勿将真实密码直接写在命令行参数中。 + +```bash +modctl login -u YOUR_USERNAME registry.com +modctl push registry.com/models/llama3:v1.0.0 +``` + +在另一台机器或工作区,通过相同的引用拉取制品。私有仓库需要先完成认证。 + +```bash +modctl pull registry.com/models/llama3:v1.0.0 +``` + +## 05. 使用模型文件 {#extract} + +将制品中的模型文件提取到指定目录,再使用你自己的推理工具加载。modctl 负责模型制品管理,不提供推理运行时。 + +```bash +modctl extract registry.com/models/llama3:v1.0.0 \ + --output ./my-model +``` + +### 直接从远端提取 + +跳过完整本地制品副本,直接将远端模型提取至目标目录。 + +```bash +modctl pull registry.com/models/llama3:v1.0.0 \ + --extract-dir ./my-model --extract-from-remote +``` + +### 仅获取匹配的文件 + +只需要配置文件?使用文件模式选择需要获取的内容。 + +```bash +modctl fetch registry.com/models/llama3:v1.0.0 \ + --output ./model-config --patterns '*.json' +``` + +## 继续探索 {#next} + +查看本地制品及其元数据,或者为现有模型添加新的标签。 + +```bash +modctl ls +modctl inspect registry.com/models/llama3:v1.0.0 +modctl tag registry.com/models/llama3:v1.0.0 \ + registry.com/models/llama3:latest +``` + +查阅[完整命令指南](https://github.com/modelpack/modctl/blob/main/docs/getting-started.md),了解 `attach`、`upload` 等更多能力。也欢迎在 GitHub 提交问题或贡献代码。 diff --git a/website/data/commands.json b/website/data/commands.json new file mode 100644 index 00000000..82f27812 --- /dev/null +++ b/website/data/commands.json @@ -0,0 +1,6 @@ +{ + "install": "go install github.com/modelpack/modctl@main", + "build": "modctl modelfile generate .\n\nmodctl build \\\n -t registry.com/models/llama3:v1.0.0 \\\n -f Modelfile .", + "push": "modctl login -u YOUR_USERNAME registry.com\n\nmodctl push \\\n registry.com/models/llama3:v1.0.0", + "pull": "modctl pull \\\n registry.com/models/llama3:v1.0.0\n\nmodctl extract \\\n registry.com/models/llama3:v1.0.0 \\\n --output ./my-model" +} diff --git a/website/hugo.toml b/website/hugo.toml new file mode 100644 index 00000000..7c26d099 --- /dev/null +++ b/website/hugo.toml @@ -0,0 +1,38 @@ +baseURL = 'https://modelpack.github.io/modctl/' +title = 'modctl' +defaultContentLanguage = 'en' +defaultContentLanguageInSubdir = false +publishDir = 'dist' +disableKinds = ['taxonomy', 'term', 'RSS'] +enableRobotsTXT = true + +[languages.en] + locale = 'en' + label = 'English' + contentDir = 'content/en' + weight = 1 + +[languages.zh] + locale = 'zh-CN' + label = '中文' + contentDir = 'content/zh' + weight = 2 + +[params] + repository = 'https://github.com/modelpack/modctl' + specification = 'https://github.com/modelpack/model-spec' + organization = 'https://github.com/modelpack' + +[markup.goldmark.parser.attribute] + block = true + title = true + +[markup.goldmark.renderer] + unsafe = false + +[markup.highlight] + codeFences = true + +[markup.tableOfContents] + startLevel = 2 + endLevel = 2 diff --git a/website/i18n/en.json b/website/i18n/en.json new file mode 100644 index 00000000..ddfe763c --- /dev/null +++ b/website/i18n/en.json @@ -0,0 +1,59 @@ +{ + "skipContent": { "other": "Skip to content" }, + "home": { "other": "modctl home" }, + "mainNavigation": { "other": "Main navigation" }, + "openNavigation": { "other": "Open navigation" }, + "closeNavigation": { "other": "Close navigation" }, + "whyModctl": { "other": "Why modctl" }, + "workflow": { "other": "Workflow" }, + "ecosystem": { "other": "Ecosystem" }, + "documentation": { "other": "Documentation" }, + "getStarted": { "other": "Get started" }, + "startBuilding": { "other": "Start building" }, + "exploreGithub": { "other": "Explore on GitHub" }, + "githubLabel": { "other": "modctl on GitHub" }, + "languageNavigation": { "other": "Choose language" }, + "copyCommand": { "other": "Copy command" }, + "copyCommands": { "other": "Copy commands" }, + "copySuccess": { "other": "Command copied to clipboard" }, + "copyFailure": { "other": "Clipboard unavailable. Select the command and copy it manually." }, + "openSourceCLI": { "other": "Open-source CLI" }, + "builtOnModelpack": { "other": "Built on ModelPack" }, + "openStandards": { "other": "Open standards" }, + "standardsEyebrow": { "other": "BUILT ON COMMON GROUND" }, + "modelSpecAligned": { "other": "Model Spec aligned" }, + "ociArtifacts": { "other": "OCI-compatible artifacts" }, + "openCode": { "other": "Open code. Open possibilities." }, + "artifactEyebrow": { "other": "ANATOMY OF A MODEL ARTIFACT" }, + "artifactDescription": { "other": "Model weights, configuration, and code packaged into one portable OCI artifact" }, + "artifactWeights": { "other": "MODEL WEIGHTS" }, + "artifactConfig": { "other": "CONFIG" }, + "artifactCode": { "other": "CODE" }, + "artifactDocs": { "other": "DOCUMENTATION" }, + "oneArtifact": { "other": "One artifact." }, + "everyPossibility": { "other": "Every possibility." }, + "workflowNavigation": { "other": "Model workflow" }, + "workflowExample": { "other": "WORKFLOW EXAMPLE" }, + "modelFiles": { "other": "YOUR MODEL FILES" }, + "infrastructure": { "other": "YOUR INFRASTRUCTURE" }, + "configCode": { "other": "Config + code" }, + "registries": { "other": "OCI registries" }, + "registryCaption": { "other": "Open format. Familiar tooling." }, + "ecosystemDescription": { "other": "Model files flow through modctl to OCI-compatible registries" }, + "exploreSpec": { "other": "Explore the Model Spec" }, + "getStartedModctl": { "other": "Get started with modctl" }, + "contribute": { "other": "Contribute on GitHub" }, + "footerTagline": { "other": "Model delivery, made simple." }, + "project": { "other": "PROJECT" }, + "resources": { "other": "RESOURCES" }, + "releases": { "other": "Releases" }, + "gettingStarted": { "other": "Getting started" }, + "feedback": { "other": "Issues & feedback" }, + "copyright": { "other": "ModelPack contributors. Apache 2.0 licensed." }, + "modelpackProject": { "other": "A ModelPack project" }, + "onThisPage": { "other": "On this page" }, + "sourceDocs": { "other": "View source documentation" }, + "backHome": { "other": "Back to modctl" }, + "improveDocs": { "other": "Suggest an improvement" }, + "codeBlock": { "other": "Code example" } +} diff --git a/website/i18n/zh.json b/website/i18n/zh.json new file mode 100644 index 00000000..c619aa61 --- /dev/null +++ b/website/i18n/zh.json @@ -0,0 +1,59 @@ +{ + "skipContent": { "other": "跳转到主要内容" }, + "home": { "other": "modctl 首页" }, + "mainNavigation": { "other": "主导航" }, + "openNavigation": { "other": "打开导航" }, + "closeNavigation": { "other": "关闭导航" }, + "whyModctl": { "other": "为什么选择 modctl" }, + "workflow": { "other": "工作流程" }, + "ecosystem": { "other": "开放生态" }, + "documentation": { "other": "文档" }, + "getStarted": { "other": "快速开始" }, + "startBuilding": { "other": "开始构建" }, + "exploreGithub": { "other": "在 GitHub 上探索" }, + "githubLabel": { "other": "在 GitHub 上查看 modctl" }, + "languageNavigation": { "other": "选择语言" }, + "copyCommand": { "other": "复制命令" }, + "copyCommands": { "other": "复制命令" }, + "copySuccess": { "other": "命令已复制到剪贴板" }, + "copyFailure": { "other": "浏览器不允许复制,请选中命令手动复制。" }, + "openSourceCLI": { "other": "开源 CLI" }, + "builtOnModelpack": { "other": "基于 ModelPack" }, + "openStandards": { "other": "开放标准" }, + "standardsEyebrow": { "other": "基于开放标准构建" }, + "modelSpecAligned": { "other": "遵循 Model Spec" }, + "ociArtifacts": { "other": "兼容 OCI 制品" }, + "openCode": { "other": "开放的代码,开放的可能" }, + "artifactEyebrow": { "other": "模型制品的组成" }, + "artifactDescription": { "other": "模型权重、配置、代码和文档打包成一个可移植的 OCI 制品" }, + "artifactWeights": { "other": "模型权重" }, + "artifactConfig": { "other": "配置" }, + "artifactCode": { "other": "代码" }, + "artifactDocs": { "other": "文档" }, + "oneArtifact": { "other": "一个制品。" }, + "everyPossibility": { "other": "无限可能。" }, + "workflowNavigation": { "other": "模型工作流程" }, + "workflowExample": { "other": "命令示例" }, + "modelFiles": { "other": "你的模型文件" }, + "infrastructure": { "other": "你的基础设施" }, + "configCode": { "other": "配置 + 代码" }, + "registries": { "other": "OCI 仓库" }, + "registryCaption": { "other": "开放格式,熟悉的工具。" }, + "ecosystemDescription": { "other": "模型文件通过 modctl 打包并分发至兼容 OCI 的仓库" }, + "exploreSpec": { "other": "了解 Model Spec" }, + "getStartedModctl": { "other": "开始使用 modctl" }, + "contribute": { "other": "参与贡献" }, + "footerTagline": { "other": "模型交付,回归简单。" }, + "project": { "other": "项目" }, + "resources": { "other": "资源" }, + "releases": { "other": "版本发布" }, + "gettingStarted": { "other": "快速入门" }, + "feedback": { "other": "问题与反馈" }, + "copyright": { "other": "ModelPack 贡献者。基于 Apache 2.0 许可发布。" }, + "modelpackProject": { "other": "ModelPack 开源项目" }, + "onThisPage": { "other": "本页目录" }, + "sourceDocs": { "other": "查看源文档" }, + "backHome": { "other": "返回官网" }, + "improveDocs": { "other": "反馈文档问题" }, + "codeBlock": { "other": "代码示例" } +} diff --git a/website/layouts/_markup/render-codeblock.html b/website/layouts/_markup/render-codeblock.html new file mode 100644 index 00000000..f33ef327 --- /dev/null +++ b/website/layouts/_markup/render-codeblock.html @@ -0,0 +1,10 @@ +{{ $id := printf "code-%d" .Ordinal }} +
+
+ {{ .Type | default (i18n "codeBlock") }} + +
+
{{ .Inner }}
+
diff --git a/website/layouts/baseof.html b/website/layouts/baseof.html new file mode 100644 index 00000000..8cd8b956 --- /dev/null +++ b/website/layouts/baseof.html @@ -0,0 +1,34 @@ + + + + + + + {{ .Title }} · {{ .Site.Title }} + + + + + + + {{ range .AllTranslations }} + + {{ end }} + {{ range first 1 .AllTranslations }} + + {{ end }} + + + + + + + + {{ partial "header.html" . }} + {{ block "main" . }}{{ end }} + {{ partial "footer.html" . }} +
+ + diff --git a/website/layouts/docs/single.html b/website/layouts/docs/single.html new file mode 100644 index 00000000..6f07fc77 --- /dev/null +++ b/website/layouts/docs/single.html @@ -0,0 +1,20 @@ +{{ define "main" }} +
+ + +
+{{ end }} diff --git a/website/layouts/home.html b/website/layouts/home.html new file mode 100644 index 00000000..75836449 --- /dev/null +++ b/website/layouts/home.html @@ -0,0 +1,106 @@ +{{ define "main" }} +{{ $docs := (.Site.GetPage "getting-started").RelPermalink }} +
+
+
+ + {{ .Params.hero.eyebrow }} + +

+ {{ range $index, $line := .Params.hero.lines }} + {{ if $index }}
{{ end }}{{ $line }} + {{ end }} +

+

{{ .Params.hero.description }}

+ +
+ {{ hugo.Data.commands.install }} + +
+

{{ i18n "openSourceCLI" }}/{{ i18n "builtOnModelpack" }}

+
+ +
+ {{ partial "standards.html" . }} +
+
+
+

{{ .Params.why.eyebrow }}

+

{{ .Params.why.title }}
{{ .Params.why.subtitle }}

+
+

{{ .Params.why.description }}

+
+
+ {{ range .Params.features }} +
+ {{ partial (printf "visuals/%s.html" .visual) $ }} +

{{ .title }}

+

{{ .description }}

+ {{ .link }} +
+ {{ end }} +
+
+ {{ partial "workflow.html" . }} +
+
+

{{ .Params.ecosystem.eyebrow }}

+

{{ .Params.ecosystem.title }}
{{ .Params.ecosystem.subtitle }}

+

{{ .Params.ecosystem.description }}

+ {{ i18n "exploreSpec" }} +
+ +
+
+
+
+

{{ .Params.community.eyebrow }}

+

{{ .Params.community.title }}
{{ .Params.community.subtitle }}

+

{{ .Params.community.description }}

+ +
+ +
+
+
+{{ end }} diff --git a/website/layouts/partials/footer.html b/website/layouts/partials/footer.html new file mode 100644 index 00000000..e4f6a794 --- /dev/null +++ b/website/layouts/partials/footer.html @@ -0,0 +1,35 @@ + diff --git a/website/layouts/partials/header.html b/website/layouts/partials/header.html new file mode 100644 index 00000000..8b85cda4 --- /dev/null +++ b/website/layouts/partials/header.html @@ -0,0 +1,35 @@ +{{ $home := .Site.Home.RelPermalink }} +{{ $docs := .Site.GetPage "getting-started" }} + diff --git a/website/layouts/partials/icons/copy.html b/website/layouts/partials/icons/copy.html new file mode 100644 index 00000000..3fcad410 --- /dev/null +++ b/website/layouts/partials/icons/copy.html @@ -0,0 +1,4 @@ + diff --git a/website/layouts/partials/icons/github.html b/website/layouts/partials/icons/github.html new file mode 100644 index 00000000..b5bbcc11 --- /dev/null +++ b/website/layouts/partials/icons/github.html @@ -0,0 +1,3 @@ + diff --git a/website/layouts/partials/standards.html b/website/layouts/partials/standards.html new file mode 100644 index 00000000..984f2980 --- /dev/null +++ b/website/layouts/partials/standards.html @@ -0,0 +1,17 @@ +
+ +
diff --git a/website/layouts/partials/visuals/fetch.html b/website/layouts/partials/visuals/fetch.html new file mode 100644 index 00000000..e69ff126 --- /dev/null +++ b/website/layouts/partials/visuals/fetch.html @@ -0,0 +1,8 @@ + diff --git a/website/layouts/partials/visuals/package.html b/website/layouts/partials/visuals/package.html new file mode 100644 index 00000000..58a72c86 --- /dev/null +++ b/website/layouts/partials/visuals/package.html @@ -0,0 +1,9 @@ + diff --git a/website/layouts/partials/visuals/registry.html b/website/layouts/partials/visuals/registry.html new file mode 100644 index 00000000..971b6db3 --- /dev/null +++ b/website/layouts/partials/visuals/registry.html @@ -0,0 +1,8 @@ + diff --git a/website/layouts/partials/workflow.html b/website/layouts/partials/workflow.html new file mode 100644 index 00000000..7c95a74e --- /dev/null +++ b/website/layouts/partials/workflow.html @@ -0,0 +1,44 @@ +
+
+
+

{{ .Params.workflow.eyebrow }}

+

{{ .Params.workflow.title }}
{{ .Params.workflow.subtitle }}

+

{{ .Params.workflow.description }}

+
+ {{ range $index, $step := .Params.workflow.steps }} + + {{ end }} +
+
+
+ {{ range $index, $step := .Params.workflow.steps }} +
+
+ + ~/my-modelbash +
+
+

# {{ .comment }}

+
{{ index hugo.Data.commands .id }}
+
+
+ {{ range .results }}

{{ . }}

{{ end }} +
+ +
+
+ {{ i18n "workflowExample" }} + +
+
+ {{ end }} +

{{ .Params.workflow.note }}

+
+
+
diff --git a/website/package.json b/website/package.json new file mode 100644 index 00000000..148d3db2 --- /dev/null +++ b/website/package.json @@ -0,0 +1,13 @@ +{ + "name": "modctl-website", + "private": true, + "type": "module", + "engines": { + "node": ">=22" + }, + "scripts": { + "dev": "hugo server --bind localhost --port 4173 --baseURL http://localhost:4173/", + "build": "hugo --gc --cleanDestinationDir --destination dist --printI18nWarnings --panicOnWarning", + "test": "node --test scripts/*.test.mjs" + } +} diff --git a/website/scripts/site.test.mjs b/website/scripts/site.test.mjs new file mode 100644 index 00000000..24c364aa --- /dev/null +++ b/website/scripts/site.test.mjs @@ -0,0 +1,283 @@ +import assert from 'node:assert/strict'; +import { spawnSync } from 'node:child_process'; +import { cp, mkdtemp, readFile, readdir, rm, stat, writeFile } from 'node:fs/promises'; +import { tmpdir } from 'node:os'; +import { basename, join } from 'node:path'; +import test from 'node:test'; +import { fileURLToPath } from 'node:url'; + +const siteRoot = fileURLToPath(new URL('../', import.meta.url)); +const baseURL = new URL('https://modelpack.github.io/modctl/'); + +async function files(directory, prefix = '') { + const result = []; + for (const entry of await readdir(directory, { withFileTypes: true })) { + const name = `${prefix}${entry.name}`; + if (entry.isDirectory()) result.push(...await files(join(directory, entry.name), `${name}/`)); + else result.push(name); + } + return result.sort(); +} + +function attributes(tag) { + return Object.fromEntries([...tag.matchAll(/\s([\w:-]+)\s*=\s*(['"])(.*?)\2/gs)] + .map(([, name, , value]) => [name.toLowerCase(), value.replaceAll('&', '&')])); +} + +function decodeHTML(text) { + const named = { amp: '&', lt: '<', gt: '>', quot: '"', apos: "'" }; + return text.replace(/&(amp|lt|gt|quot|apos|#\d+|#x[\da-f]+);/gi, (_, entity) => + entity.startsWith('#') + ? String.fromCodePoint(entity[1].toLowerCase() === 'x' ? parseInt(entity.slice(2), 16) : Number(entity.slice(1))) + : named[entity.toLowerCase()]); +} + +function pageURL(file) { + return new URL(file.replace(/index\.html$/, ''), baseURL).href; +} + +function hugo(args) { + const result = spawnSync(process.env.HUGO_BINARY || 'hugo', args, + { cwd: siteRoot, encoding: 'utf8', timeout: 30000 }); + assert.ifError(result.error); + assert.equal(result.status, 0, `Hugo failed:\n${result.stdout}\n${result.stderr}`); +} + +function contentShape(value, path) { + if (Array.isArray(value)) { + assert.ok(value.length > 0, `${path}: empty content list`); + return value.map((entry, index) => contentShape(entry, `${path}[${index}]`)); + } + if (value && typeof value === 'object') { + return Object.fromEntries(Object.entries(value).sort(([a], [b]) => a.localeCompare(b)) + .map(([key, entry]) => [key, contentShape(entry, `${path}.${key}`)])); + } + assert.notEqual(value, null, `${path}: null content`); + if (typeof value === 'string') assert.ok(value.trim(), `${path}: empty content`); + return typeof value; +} + +test('every language has matching, nonempty UI translations and content files', async () => { + const languages = (await readdir(join(siteRoot, 'i18n'))) + .filter((name) => name.endsWith('.json')).map((name) => name.slice(0, -5)).sort(); + assert.ok(languages.includes('en') && languages.includes('zh')); + const contentLanguages = (await readdir(join(siteRoot, 'content'), { withFileTypes: true })) + .filter((entry) => entry.isDirectory()).map((entry) => entry.name).sort(); + assert.deepEqual(contentLanguages, languages, 'each language needs both i18n and content'); + + const english = JSON.parse(await readFile(join(siteRoot, 'i18n/en.json'), 'utf8')); + const keys = Object.keys(english).sort(); + const contentFiles = await files(join(siteRoot, 'content/en')); + assert.ok(keys.length > 0, 'UI translations must not be empty'); + assert.ok(contentFiles.length > 0, 'English content must not be empty'); + for (const language of languages) { + const messages = JSON.parse(await readFile(join(siteRoot, 'i18n', `${language}.json`), 'utf8')); + assert.deepEqual(Object.keys(messages).sort(), keys, `${language}: UI translation keys differ`); + for (const [key, message] of Object.entries(messages)) { + assert.ok(key.trim(), `${language}: empty translation key`); + assert.deepEqual(Object.keys(message ?? {}), ['other'], `${language}.${key}: expected { other: string }`); + assert.equal(typeof message.other, 'string', `${language}.${key}: translation must be text`); + assert.ok(message.other.trim(), `${language}.${key}: translation must not be empty`); + } + const directory = join(siteRoot, 'content', language); + assert.deepEqual(await files(directory), contentFiles, `${language}: missing corresponding content files`); + for (const file of contentFiles.filter((name) => name.endsWith('.md'))) { + assert.ok((await readFile(join(directory, file), 'utf8')).trim(), `${language}/${file}: empty content`); + } + } +}); + +test('translated frontmatter has the same structure and complete homepage sections', async (t) => { + const temporary = await mkdtemp(join(process.env.JCODE_SCRATCH_DIR || tmpdir(), 'modctl-content-')); + t.after(() => rm(temporary, { recursive: true, force: true })); + hugo(['convert', 'toJSON', '--output', temporary]); + const languages = (await readdir(join(siteRoot, 'content'), { withFileTypes: true })) + .filter((entry) => entry.isDirectory()).map((entry) => entry.name); + for (const file of (await files(join(siteRoot, 'content/en'))).filter((name) => name.endsWith('.md'))) { + let english; + for (const language of ['en', ...languages.filter((name) => name !== 'en')]) { + const name = `${language}/${file}`; + const source = await readFile(join(temporary, name), 'utf8'); + // Hugo's JSON conversion emits an indented object before the Markdown body. + const frontmatter = source.match(/^\{[\s\S]*?^\}/m)?.[0]; + assert.ok(frontmatter, `${name}: missing frontmatter`); + const content = JSON.parse(frontmatter); + const shape = contentShape(content, name); + if (language === 'en') english = content; + assert.deepEqual(shape, contentShape(english, `en/${file}`), `${name}: frontmatter structure differs`); + assert.equal(content.translationKey, english.translationKey, `${name}: translationKey differs`); + if (file === '_index.md') { + assert.deepEqual(Object.keys(content.hero ?? {}).sort(), ['description', 'eyebrow', 'lines'], `${name}: hero`); + assert.equal(content.hero.lines.length, 3, `${name}: hero lines`); + assert.equal(content.features?.length, 3, `${name}: feature cards`); + assert.deepEqual(content.workflow?.steps?.map((step) => step.id), ['build', 'push', 'pull'], `${name}: workflow steps`); + } else { + assert.ok(source.slice(frontmatter.length).trim(), `${name}: missing Markdown body`); + } + } + } +}); + +test('Hugo builds a complete multilingual site without warnings', async (t) => { + const temporary = await mkdtemp(join(process.env.JCODE_SCRATCH_DIR || tmpdir(), 'modctl-hugo-')); + t.after(() => rm(temporary, { recursive: true, force: true })); + const output = join(temporary, 'dist'); + hugo([ + '--gc', '--cleanDestinationDir', '--destination', output, + '--printI18nWarnings', '--panicOnWarning', + ]); + const outputFiles = await files(output); + const htmlFiles = outputFiles.filter((file) => file.endsWith('.html')); + + await t.test('publishes both languages and the shared static assets', () => { + for (const file of [ + 'index.html', 'getting-started/index.html', + 'zh/index.html', 'zh/getting-started/index.html', 'styles.css', 'app.js', + ]) assert.ok(outputFiles.includes(file), `missing output: ${file}`); + assert.ok(outputFiles.some((file) => file.startsWith('assets/')), 'missing shared assets'); + for (const file of outputFiles) { + assert.doesNotMatch(file, /^(?:content\/|i18n\/|layouts\/|scripts\/|package\.json$|README\.md$)/, + `published source file: ${file}`); + } + }); + + await t.test('local href, src, CSS URLs, and fragment anchors resolve under /modctl/', async () => { + for (const file of outputFiles.filter((name) => /\.(?:html|css)$/.test(name))) { + const source = await readFile(join(output, file), 'utf8'); + const references = file.endsWith('.css') + ? [...source.matchAll(/url\(\s*['"]?([^'"\s)]+)['"]?\s*\)/g)].map((match) => match[1]) + : [...source.matchAll(/\s(?:href|src)\s*=\s*(['"])(.*?)\1/gs)].map((match) => match[2]); + for (const reference of references) { + const target = new URL(reference.replaceAll('&', '&'), pageURL(file)); + if (target.origin !== baseURL.origin) continue; + assert.ok(target.pathname.startsWith(baseURL.pathname), `${file}: ${reference} escapes /modctl/`); + let targetPath = decodeURIComponent(target.pathname.slice(baseURL.pathname.length)); + if (!targetPath || targetPath.endsWith('/')) targetPath += 'index.html'; + assert.ok(outputFiles.includes(targetPath), `${file}: missing local link ${reference}`); + assert.ok((await stat(join(output, targetPath))).isFile(), `${file}: not a file: ${reference}`); + if (target.hash && targetPath.endsWith('.html')) { + const targetHTML = await readFile(join(output, targetPath), 'utf8'); + const ids = [...targetHTML.matchAll(/\sid\s*=\s*(['"])(.*?)\1/gs)].map((match) => match[2]); + assert.ok(ids.includes(decodeURIComponent(target.hash.slice(1))), `${file}: missing anchor ${reference}`); + } + } + } + }); + + await t.test('pages declare their language, canonical URL, and reciprocal translations', async () => { + for (const file of htmlFiles) { + const html = await readFile(join(output, file), 'utf8'); + const links = [...html.matchAll(/]*>/gi)].map((match) => attributes(match[0])); + const canonicals = links.filter((link) => link.rel === 'canonical'); + assert.equal(canonicals.length, 1, `${file}: expected one canonical URL`); + assert.doesNotMatch(html, /\bdata-zh\b/i, `${file}: legacy inline translation`); + const redirect = [...html.matchAll(/]*>/gi)].map((match) => attributes(match[0])) + .find((meta) => meta['http-equiv']?.toLowerCase() === 'refresh'); + if (redirect) { + const target = redirect.content?.match(/^0;\s*url=(.+)$/i)?.[1]; + assert.ok(target, `${file}: missing alias redirect target`); + assert.equal(new URL(target, pageURL(file)).href, canonicals[0].href, `${file}: alias canonical`); + assert.notEqual(canonicals[0].href, pageURL(file), `${file}: alias redirects to itself`); + continue; + } + const language = file.startsWith('zh/') ? 'zh-CN' : 'en'; + assert.equal(attributes(html.match(/]*>/i)?.[0] ?? '').lang, language, `${file}: html lang`); + assert.equal(canonicals[0].href, pageURL(file), `${file}: canonical URL`); + const englishFile = file.replace(/^zh\//, ''); + const translations = { en: englishFile, 'zh-CN': `zh/${englishFile}` }; + for (const [code, translatedFile] of Object.entries(translations)) { + assert.ok(outputFiles.includes(translatedFile), `${file}: missing ${code} page`); + const alternate = links.filter((link) => link.rel === 'alternate' && link.hreflang === code); + assert.equal(alternate.length, 1, `${file}: expected one ${code} alternate`); + assert.equal(alternate[0].href, pageURL(translatedFile), `${file}: ${code} alternate URL`); + } + } + }); + + await t.test('each Markdown code fence renders an accessible copy button targeting its exact code', async () => { + for (const language of ['en', 'zh']) { + const markdown = await readFile(join(siteRoot, 'content', language, 'getting-started.md'), 'utf8'); + const expected = [...markdown.matchAll(/^(`{3,}|~{3,})[^\n]*\n([\s\S]*?)^\1\s*$/gm)].map((match) => match[2].trim()); + assert.ok(expected.length > 0, `${language}: missing documentation examples`); + const html = await readFile(join(output, language === 'en' ? '' : language, 'getting-started/index.html'), 'utf8'); + const blocks = [...html.matchAll(/
[\s\S]*?<\/code><\/pre>\s*<\/div>/g)].map((match) => match[0]); + assert.equal(blocks.length, expected.length, `${language}: code render hook must wrap every fence`); + assert.equal([...html.matchAll(/\sdata-copy-target=/g)].length, blocks.length, `${language}: copy button count`); + const ids = new Set(); + blocks.forEach((block, index) => { + const buttons = [...block.matchAll(/]*>/g)].map((match) => attributes(match[0])); + assert.equal(buttons.length, 1, `${language}: code block ${index} needs one copy button`); + const code = block.match(/]*)>([\s\S]*?)<\/code>/); + const id = attributes(code?.[1] ?? '').id; + assert.ok(id && !ids.has(id), `${language}: duplicate or missing code ID`); + ids.add(id); + assert.equal(buttons[0]['data-copy-target'], id, `${language}: copy button targets the wrong code`); + assert.ok(buttons[0]['aria-label']?.trim(), `${language}: copy button needs an accessible label`); + assert.equal(decodeHTML(code[2]).trim(), expected[index], `${language}: copied code differs from Markdown fence ${index}`); + assert.doesNotMatch(block, /\shidden(?:\s|=|>)/, `${language}: examples must be readable without JavaScript`); + }); + } + }); + + await t.test('homepages ship all workflow commands and native language links without JavaScript', async () => { + const commands = JSON.parse(await readFile(join(siteRoot, 'data/commands.json'), 'utf8')); + for (const file of ['index.html', 'zh/index.html']) { + const html = await readFile(join(output, file), 'utf8'); + assert.match(attributes(html.match(/]*>/)[0]).class, /\bno-js\b/); + const panels = [...html.matchAll(/]*\bdata-workflow-panel[^>]*>/g)].map((match) => match[0]); + assert.equal(panels.length, 3, `${file}: all three workflow panels must be server-rendered`); + for (const step of ['build', 'push', 'pull']) { + const panel = panels.find((tag) => attributes(tag).id === `panel-${step}`); + assert.ok(panel, `${file}: missing ${step} panel`); + assert.doesNotMatch(panel, /\shidden(?:\s|=|>)|aria-hidden=['"]true/, `${file}: no-JS panel is hidden`); + const code = html.match(new RegExp(`([\\s\\S]*?)<\\/code>`)); + assert.ok(code, `${file}: missing rendered ${step} command`); + assert.equal(decodeHTML(code[1]).trim(), commands[step].trim(), `${file}: workflow code differs`); + const tab = [...html.matchAll(/]*>/g)].map((match) => attributes(match[0])) + .find((button) => button.id === `tab-${step}`); + assert.equal(tab?.['aria-controls'], `panel-${step}`, `${file}: tab must target its panel`); + } + const languageLinks = [...html.matchAll(/]*>/g)].map((match) => attributes(match[0])) + .filter((link) => link.hreflang); + assert.ok(languageLinks.some((link) => link.href === (file.startsWith('zh/') ? '/modctl/' : '/modctl/zh/')), + `${file}: language switching requires a native link`); + } + }); + + await t.test('JavaScript has no client-side language switching or translation table', async () => { + for (const file of outputFiles.filter((name) => name.endsWith('.js'))) { + const script = await readFile(join(output, file), 'utf8'); + assert.doesNotMatch(script, + /\b(?:setLanguage|localeIndex)\b|modctl-language|\bdata-zh\b|document\.documentElement\.lang|\b(?:language|locale)\s*={2,3}\s*['"]/, + `${file}: translations belong in Hugo content and i18n files`); + } + }); +}); + +test('localized SVG labels escape special characters and markup as text', async (t) => { + const temporary = await mkdtemp(join(process.env.JCODE_SCRATCH_DIR || tmpdir(), 'modctl-svg-')); + t.after(() => rm(temporary, { recursive: true, force: true })); + const source = join(temporary, 'site'); + const output = join(temporary, 'dist'); + await cp(siteRoot, source, { + recursive: true, + filter: (path) => !['dist', 'resources', '.hugo_build.lock'].includes(basename(path)), + }); + const keys = ['artifactWeights', 'artifactConfig', 'artifactCode', 'artifactDocs']; + const payload = 'Weights & '; + for (const language of ['en', 'zh']) { + const path = join(source, 'i18n', `${language}.json`); + const messages = JSON.parse(await readFile(path, 'utf8')); + for (const key of keys) messages[key].other = `${key}: ${payload}`; + await writeFile(path, JSON.stringify(messages)); + } + hugo(['--source', source, '--destination', output, '--ignoreCache', '--printI18nWarnings', '--panicOnWarning']); + for (const language of ['en', 'zh']) { + const svg = await readFile(join(output, 'assets', `artifact.${language}.svg`), 'utf8'); + for (const key of keys) { + const escaped = `${key}: ${payload}`.replaceAll('&', '&').replaceAll('<', '<').replaceAll('>', '>'); + assert.ok(svg.includes(escaped), `${language}.${key}: SVG label must preserve and escape text`); + } + assert.doesNotMatch(svg, /| { + 'use strict'; + + const menuButton = document.querySelector('.menu-toggle'); + const navigation = document.querySelector('.navigation'); + const toast = document.querySelector('.toast'); + const tabs = [...document.querySelectorAll('[data-step]')]; + let toastTimeout; + + // All content and localized labels are rendered by Hugo. This file only + // enhances native HTML controls, never selects or replaces a language. + function selectTab(selected) { + tabs.forEach(tab => { + const active = tab === selected; + tab.classList.toggle('active', active); + tab.setAttribute('aria-selected', String(active)); + tab.tabIndex = active ? 0 : -1; + document.getElementById(tab.getAttribute('aria-controls')).hidden = !active; + }); + } + + function setMenu(open, returnFocus = false) { + if (!menuButton || !navigation) return; + navigation.classList.toggle('open', open); + menuButton.setAttribute('aria-expanded', String(open)); + menuButton.setAttribute('aria-label', open ? menuButton.dataset.closeLabel : menuButton.dataset.openLabel); + if (returnFocus) menuButton.focus(); + } + + async function copyText(text) { + try { + if (!navigator.clipboard?.writeText) throw new Error('Clipboard API unavailable'); + await navigator.clipboard.writeText(text); + return true; + } catch { + const previousFocus = document.activeElement; + const textarea = document.createElement('textarea'); + textarea.value = text; + textarea.setAttribute('readonly', ''); + textarea.style.cssText = 'position:fixed;left:-9999px;top:0;opacity:0'; + document.body.append(textarea); + textarea.select(); + let copied = false; + try { copied = document.execCommand('copy'); } catch { /* Show the rendered fallback message. */ } + textarea.remove(); + previousFocus?.focus({ preventScroll: true }); + return copied; + } + } + + document.addEventListener('click', async event => { + const button = event.target.closest('[data-copy-target]'); + if (!button) return; + const text = document.getElementById(button.dataset.copyTarget)?.textContent; + if (!text) return; + button.disabled = true; + const success = await copyText(text.trim()); + button.disabled = false; + if (!toast) return; + clearTimeout(toastTimeout); + toast.textContent = success ? toast.dataset.copySuccess : toast.dataset.copyFailure; + toast.classList.add('visible'); + toastTimeout = setTimeout(() => toast.classList.remove('visible'), 2800); + }); + + tabs.forEach((tab, index) => { + tab.addEventListener('click', () => selectTab(tab)); + tab.addEventListener('keydown', event => { + let next; + if (event.key === 'ArrowDown' || event.key === 'ArrowRight') next = (index + 1) % tabs.length; + if (event.key === 'ArrowUp' || event.key === 'ArrowLeft') next = (index + tabs.length - 1) % tabs.length; + if (event.key === 'Home') next = 0; + if (event.key === 'End') next = tabs.length - 1; + if (next === undefined) return; + event.preventDefault(); + tabs[next].focus(); + selectTab(tabs[next]); + }); + }); + if (tabs.length) selectTab(tabs[0]); + + menuButton?.addEventListener('click', () => setMenu(menuButton.getAttribute('aria-expanded') !== 'true')); + navigation?.querySelectorAll('a').forEach(link => link.addEventListener('click', () => setMenu(false))); + document.addEventListener('keydown', event => { + if (event.key === 'Escape' && navigation?.classList.contains('open')) setMenu(false, true); + }); + document.addEventListener('click', event => { + if (!event.target.closest('.site-header')) setMenu(false); + }); + window.matchMedia('(max-width: 940px)').addEventListener('change', () => setMenu(false)); + + const docLinks = [...document.querySelectorAll('.docs-sidebar nav a')]; + if (docLinks.length && 'IntersectionObserver' in window) { + const observer = new IntersectionObserver(entries => { + const entry = entries.find(item => item.isIntersecting); + if (!entry) return; + docLinks.forEach(link => { + const current = link.hash === `#${entry.target.id}`; + link.classList.toggle('current', current); + if (current) link.setAttribute('aria-current', 'location'); + else link.removeAttribute('aria-current'); + }); + }, { rootMargin: '-15% 0px -60% 0px', threshold: 0 }); + document.querySelectorAll('.docs-prose h2[id]').forEach(heading => observer.observe(heading)); + } + + document.documentElement.classList.remove('no-js'); +})(); diff --git a/website/static/assets/manrope-LICENSE.txt b/website/static/assets/manrope-LICENSE.txt new file mode 100644 index 00000000..793d053a --- /dev/null +++ b/website/static/assets/manrope-LICENSE.txt @@ -0,0 +1,93 @@ +Copyright 2018 The Manrope Project Authors (https://github.com/googlefonts/manrope) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/website/static/assets/manrope.ttf b/website/static/assets/manrope.ttf new file mode 100644 index 0000000000000000000000000000000000000000..75274da58537d6123b14f2cd0c355ad4681fc2b3 GIT binary patch literal 164700 zcmce<3t&vw_Bg!vK4)ekBJxfUk(VUi zNQ*lu8U51(r%ipA&^>PvBK$FObhpT@+lyTYq41gHjF$RKEA}sWp3sUD@OjnL*^}p8 zjr(Z{JPV)ock&iZE-Xt}2*2--hTmsSpS)lmyt)BA30|G17c9w(82YjoA+3uDdDwG0 z+<%yTnhp0?5OVXK{ArVOJN)e50^lXU{jvG*h1(16!SEUGC!zVXi;Dj?uCtyH=0`~L zodt8JPCoQ7-YAco0d04-bFBef{o`>c1`ne42V8ZTO7#YWaL1{$`Llon@TQKrh=%%G7Huyq1U}{BG-l z@x=ZhUP1uz!dLAA{EPormvEXy=q}g4gld3$pF}vi!~oE1=GTuTL4OhYH50B4Fy4y* z=ea=d%RnFMRvf3G2Sqpa3Wc$Td^6K``l~QDrogjidPLJXx=a$mbqwk-)Flbf4z!6n zm5<|#00S;vK77V8_5=J@K+5!0aMi&3GPoajFYc|qqkD&xIV~byPR{Td^n51_BdBE|uI$p8OV{kvf=eVLg!8qq*6UPP6CTyy^#1$MD(|FPO17B~! zcZu+vdTH_se2d^T6~S*PNBFxsHifGsQtJ!gYZ~^C=mYm01bjY#>z>*kf!7G&1JYaw z{0fB6C|kBl~?0>EA@qG?F2l@@?A><|E#rqj}sb2x#VgEz_TJ$sA z%ljGhrq;(?SEJsCHep_i(1X5ZIklD4+9>+Q%)!F7y2O$_=F&@30S%zV7fI?ghgmLM(>+kdNi?+zk>5_!jH-D18CA7VGXSZLsXx z>ugQ!Rs7v_VH@zf2sj{I4s#8R?~8CxI_UY%@ZBnSEr#nF!2SR}PlVs#JzVdI*JuH} z9#XFgc-;;c{`L!8Z{T|YWRc}U-?))n_5k2SkX*qZu4VB3N%-6ueuMXoy^qe3=jm^e zVnYgCc_a<2+zMJnikUyDWZg-nxSmw7XmS@X;V!^|iPJr5{T^@-;1YX+Z22kgL3W7wcO17;z)8JmJ}JfvKMQyG zRVE&%esGnuWAIx6v}5%>wr@BG_nd&|fJS`<&|D5CEL>=J;)Q?B!dN($XOxFZkiR^* za4x$Iy5TUqZw(jNUi`Z$BvRKA`f4}G^UpxTBKRI`4?_~Xf-EDCfR~&$;SJ?gS4r;T zg}5Tlrq6&E!1yOzKOl}UPQHX|5WLTXYpak0zw6=3CVnWxAZKX?7gFpj!FO6)%g9}% zQK!D@qp2T$#!G-PX<(!R%cD@tEb5+ypUJy4k>m5Ip)v6 zeb@%Q47`O)I193o39_-3PK9eR$o)Tri}3jrT!-N*Aol^++jyTK!qpk*JwflmmE=@I zDx8i3qk%ne32=GAzvvfu5mA2)UJsB`q9?)NF?1un$O`I7JJB9AjwaF+I-IVcTj_p! zg0*4e*vITUVWF@>*dUY%<-&g9W#NSIH{p`lS_~26#R1|Zaf|q>_^$ZxfF}d?20RRO z5A+Ib9T*%K7T7&7J}@~jCvaZilE9||UkE%Fcs%g6z*B+m1ilyeevnU4aL~4(*MnKG zF1Tf|N3eHr>)?RkPQfX`IlHG9NrYXR35;A3MZ102t@YeEs=xCU_CBy1605RM4137?2WY$Jw>y~Sh^aT)>f586MHvTDA;i{Qm$`t3Qeyhd+50@SW67 zsx`p-e7FY7gW%s3{LMH5t~`9F{oTAl$gT0W#^UE&;kVY`>VJ#g>U8r{`0urwzk)CO z%grBd-h|h0Z(h3j_RW{zopaTxs-sme5K^_FYIoI^slvp3l}wwz_N34mz@ zOJ(_N2+LqY*)aAJJID^PH1;7-NNhg_PE}2gX$s)3x ztRl~l9ppK(ha3c&$Fj-nIGfGBA&0?}KTFP&Pe>*Cj@%;uB)^j1$nT_@JfajvVQbok zwxeM%DiUd5noI}M;cO!NlucsC*m^dSZDP-{&1^5b2(tGT`hJ0v*eiu)%B)OJSpkJB-R^#D}yb-o%&q!w3u|VWcw|KoUt`(hsD4 zESUnHd={Baa@YYo zBl$P^m=fBYGAh7$X~tfl-Y~K|!^r7I2hmnEg?N&8KpPwZnS7VDCVwSu$vF~0J|b<% z2PBAG0Il#h(t}(hT?p7smjxLH;CZ*nnNek^)#E7(v@@-T}{`}<)9y*r1>N#8H;D&%n>dr#hzt1(Xwg%| zmAp=xlamm?I||zW6^Ke5Cr;#5q9eyhSMn8T*>6Y`xlY2#CDMUhCLPHaq!YP9BFN_? znfxC~B0rPK)R|1BE@V6v$poq=6RCkrqD~~6>c}+eN~Tjcl26^q4C+DhXiKt=b|+8K zNV1Velc#Acc%N}(Gwlf;W(?U+Q$ec_AqVJC@&X;k7P3WbK3l+wSRq@?K4X{IX!bnY z&9<p4AQ8b;7d5hLQc|v>|RY?|%{O8Ce>ICz| zGWsbCfRVQt^u{-Wzc3Bvhm*oLqPrL)E)d@k@9Wy>#_P7|KG(bHbM=Sx-y8f56Ab$e zFB{Gps+^cpnA0eyWlo2k{@tu=v)E>1niVyBrrD>>es&IZp5R>Q{91Ee^O4Q>HvhhP zwTquif=h}^wo8%A(=HV*e{s3sa<7HHMO2H)E!MYqx5Zbk)YZ*3+%?KoaxHLO@4DCZ zJ=Ys8^)0)%%x}5ByWpPcYE(? z-hc6a-}_S^(I?TT)aQL)gKwJee&1jHhWH(9<P+UK|bJgjHf z>*2BC&xYTN7#Z=`4sAPZ>*(5XO(&sK|4xOSj&}N2=h)5*Iv?%)W0!7SdUq-9@BF;zPZ?e`eA)0d!^?)hF#Pfe z-x2Lb3?4CY#KIBJjCf_l47Imk9%WWbykn8URlGl#$-*%nwB*?>xHb_ zlAJRtXI##_oTEAanjAQJ_~gZtS596x`TP{uDSf8QpR#<)t5bfM^6Qj`Q-@65 zIQ6Tk-{pGehUaGHZq0o)_s+DKX@jRdGwnv6PhPvc@Vst$ae0072Ir;aW#;YAJCgU8 zywiCf8uz3=pS(_fl?Zn`nQU;gO)efhWY@6I4I+-3yM=rp7M zj1e=kX3U(iY{sS;*Jrk$*?VT@%;K4^&-`%am6`vT`RlBNS;@0z%-S^Tqgjs%S`@S^ z2ruYX5LeK*U~s{>g1mw`1xpLo7nB$5D%fA}a=~i_Zx?)2aHrtmY`591X7`&tb@rOs zWwR@0ADjL5>GKcI|Ftl-Ft>1B;j4vT6@FLvN1?nRa6zvH!xzk4uwucs1+Ogl+k$@=#TVrk zEiBql^!>u1g`*ZuUASi9?u7>y{%g_jMgLgzuSNe^?6f#&ar|Ow@w~;wi%SI3zm)vBwAoVcrJ+kBm-bznwsi8+ z-Q@hU7VPfIIGO)VTWs3<9^C?TP+XU|35yBBuuT-dSWqR`O7z`&x` zt-+Xu8Iy>+0cXURMA0Z30+%OX7{Oe!;D4DV$l@GUrK_mU(UnxMrHj(iz^qoDGfaVZ zNGYKqo>A27X|_ExC({^h*@j-Ct`GLwZpjH+L2eNm92OQ6<>eC<84E9Zy+x~2`sVi; zF|JSFu_OBA8`oL29-274Z=Z4S>-5Bjm6lLM1z)FV-YeKA_23BB6ihaQ)e5QUZyz2Q zv95n!tOrwGBkndh0gpVn91t24aBv2rH|7`@daG{n7Y(9j`$yt;=>Y~RM&=Yfj_dTP%begf$V zSH>U>?#e=f^}Zotu~Cr$3v%>?`x$ zvf`W}zHM0B-fad>hL@hf1E$MA+3z`RJSBs*>k8H|p>a{ZA>jt|uA&7OvM=Or-705V z@k6?M_sEfl$1KPO%bAaCka#^<)*j%+X>GQ*5_CFCX_uY{A+L$D)%X?r(wz*_t+fx* zZ3A!CzF7X;HtJlUFWW%h0rpk`Y{EVVgtunD9qjE&tzjeZ#}7Q&&^rD&6jrSl=3`u+^EbK)@`*fHg2?R2!(?#vuMV~ zyo2I^Qx;x9F+r>=hynA;lEnlWqDL-SG}#!)s&M9!@4*;>8BAC4=<767OB*4|(F!69 zggWeYM(TC9>}H9t!Ly;BR!6!1Hb7Uo5M;qo@YAbmzP4;uUoJ^Dxalt*0&e<%!~_HG zIHyF%#>V-&GH*V0#`#*#oT5v&v>t&o= z6p=r-N0+#uRy{jL(A$?kDT#uw`9^ zc{R7$L1VVyud9$cR&PK%N`_%48IR-t&}tdXqQ%gvJ4D*TpjG!Eg`b9Sg{>j&gCb** zvtc11=*ruWpfVPme`4mE0&(*z^WI-5yU>gIFHIizOcuPmG-_Si(dBZau3}upjKcTB zyLbI`*V0$Ar9o>ZPTVy=ZRXm}H4;GNt6 zJKhRPXyYFl+NFmSIZTR=8knEhAaCSgHaQ{!+z+ZiQ=+szJTb9ZrC!?0m$dYIl2WE_VVU>v$3WIhVPa`o`` zVtRvK&j(>#Y^+C2Gz$Ym76u?a)VeTw-xqm#U+jxo=qI0|!@5rn+VslEk*{nD%IzYb z(p4}g-}Cb4Z@n#l{*kXiko0=LqqNz?ICdyyf2EQ-yvKt zmMJ?o1e+a_Bx6>?7;u^m$(&}e8ylwDQyC!*5}&OMj|MQH4{(6M8k)ulJy>MW?Whxl z8sH52re>wv8b_sRoLO}PQWW42bQ)OzQUaPmUhkWbr9@Y*&0Z#Z$+?e?OV2H z5ZUK;EL%$ixg&3SPJWW%(*M9Jf*ZE0TX_*VFQsucFj*=-`*Ogtc^H9Vx^JP9yO77~+Fk3^BPe zxarLUi)R{vsD>xb0-XU*C6?paDD>#tispE+QJAU5RO4`x8SlB~ux1V#100C(5YQW5 z`o#%Ph&8HuyM=aw#CK65@}WAutT}x5r+_bB%e__s_F@+GNer>?@7#ST^HutUZykVvptbP4=!&@NGMuXeux zR$PVpOcj{@W{(NCB}vuc;+}f8LR}MduObWb2DKg4c!mLKh65!Pgpm7y1Ejzp1{D%I ztbiMQPcylmhI}4R^tRyF2Ve%h1&e1|D4wv|t8m|0j)yboWmQ_?*3Js}e7IXPP@r9* z_B!1Ejv5^TE@5v4!Q}~$&?JlrjgXMvS`-K{*#vj#)hEEdh2DjGHx=jc`;_Pg-X*W0 zdQJ!8Yj&451#zkpkXjQ}F#BLzdtlO$I8{8%qtG7@P=|s2;12mK#Is&}2l36RH@QSe zcBT{n4!q*D^VtMG6bN*Jw@e*jvvNDbWghU`xX(BcD`D+EVa{rC*R&#OOKxJ!1Y z2&BLEC{Xop$XHfaOKinGkRx=Ay;%X+RDUi&>L}!X-DVd#)~MaVKSc)>+?^O`5F$I^ z0MWcv=L0f)x6kOmD!ffIiFvl_{-XcR6<*_)CJc(4GeUS!;}kb3v$K=|{RyoJJGorp zEU(BFC~2F`9#drPNd4AT;VZWZMDY>CY`__07o{KKfDjCX;mR%)850FoRPz9aOBy?2 zOf$N%yGA!Y@?^%JX|7nob-ECHQ*D8{s0vTcHfzgFvB}o$@{uT<1zdEhE&vUH{H#93 z$9n}x%vmnEFwbh^G00mPk?f*rOv2q@@$tKLryv$Ij6jMyOiZ0dnfvPg_fh#y~aOWE?QMhYQuxseKNs{uMiA(jLP6kNOy&wfDEX_+* zAFb4UwmQg)+lKH#A`sW+s4J|vsU9jvM+OE7@ zzWL4De=b}0=i92aX9|#=m5*0e%E!-2M``B|KcrobXhA{{N^ak!a4GQQwy#Bm&^BB_ z1nD@S#eQtU<|1Q?586jSgO7Hb55{0kmYWuOvW)`0s3@?GzzM?y$F;DSeY9XrF+pCVOHnNabG-Ou-4I?XmokbI z8iCV;?y&kZv0qj-@cN>AVjX=kn4U?epR*8Rfg{)tV0^7=`E_!W8GCx+Suoo5ivJs@z zi<1;IOo*v3FkWH+{TU9FXjW?jA|k}2MO*9`GsW69g_a$RAJR~LAU9&PXc`Xlb`xkBgTvsU*j7dLDqb2+;B2s zyAhSHcLsqTR$nH5kpUtZBZS01FflQNLFl5P*#*V z9+5QJjsa~+U?YaAKETq@M(<9s4W@vVnMnu-ewzgo|Du#eMBo6YYPoVWnr{oTzfn0K36Hhe!kGs8cTBtZ>voLd1OFsNz|U z0ME_?XIt=)VO=!0 z==t&S^GEx2bC;8J6@t!f@#_TzuP=5JMdMkvT@>ANH;)>%IoC}GAvgtMJV5kPARi~ z(6VdWgcrw-+R-~{m|R7R2K4Gy)MxOj9$jLznX1mJ(7_hThI&e@mbWI+0^@pzUF1&- zlH~2l4R?*QUbhJ7#>{6}uQTJd!2nq?fD*OG?8D`5#_K|)d^?5qteI(#<-30jbOnZ| z#u`hlxi0bu!Xnjo^u_E)C5m9`Z+kefGz>3PYTfP_6D|6nh(IIoNmjW5qo@)5&;k~X zLnd8|XEcC~vb+u)f*1$(502_~u!qVj&e1TZJhaeKM&l5)jE^*cC7^>^QJe@;9ILD@ zsgXiRdg{u;+jkW(hKgBcz6Kuk!~`=RUtNIU?d8hY%&q_4)mjRdUte)LKX!Chh`e*e z{FIQzS2sRgwb?^*Ek3ho{?VKXYx~fSVRL2;9<=7IfJw&}yKO&~wq^2=DSbkn3w)EL z++K5zPR@UCrQ3{snUEiqF};^ZR`X72tEW!bF|!wpY>pq7v3NzkaLuVnSeAmYEov&J zN&us&=$i0N27dNwI!CoEs3tR3-k}I)QyFZQC&i_}3wCHioC_I@y8$fnq?*X~ce+S=8S?d%+M@T-EHLr->=f13DK$!`JfEu@ysM?O1y;+C$D!UF{~rOJe!Ur);$dSs;YL1uki1rM`=nSxvz|^ufmQ?_9l{$6s zr+5$?EGRG8i$e>8{ph&jP(}9E-oqB5?-7gUFt1zmJ*2xTcxw}bhk}w>SIH_ZN)KFv zR-jTHW)AQrCER@hwim1nfIY@eRy^1wWo#_p``UW!nv7ZI7GB^Y~JX=(pVAZq|#j?||sb?^Dg)MV0+!o&KdGNLeShcN1 zs2XY=<5HM`U?VDJ6INzD?>NZ{vd!p|9W=OP>(=Wf@O#?>7Mdp?8_DBMwlL6jkeYkM zw4WI7)1y_Qt8tYTbiLHCIKto1Y!KDAoc{15J8-#V=+?uC!dMd0Zvk0}BsBv1vo^<@ z83u6}FtURL^ee~?ryiq3h=qBK$N>)^GQ>JLWCM={T{c6+E-MfV@P6&{!miv|^~7wO zQfP((@B)K84!FVbP$D~V_4=fd5^9B2M1%5bAu)g02;bO2SmPVUY}#|{#zKa;CPhVW zq4Ncs`!=j_ww7scdx4q8$hyAJG8hB%o;I6=kySA7VJzk~c!gNZXztCU&g8KeuFo(M zV{0TpWs9o2)`O2nTx|0T;mT9Erc~e>*iCvB>XUFj!tAE(uz@|poO7z@W4*tIXO`6C zDm!V~K~uNWri(Rlc6QnCD z_6Bc(&-}2`&pmtvqSB6V7Jd1Hwi?qscdI6~7IEH1>qeP(kp|^|K#uKHrd#=f?RHJM zQI^Q^Jxcm}YSt52a@uTb(YUDRo9K?)Y`QLq%ChNtd;pzf(W;OI%18FF*{HS^&YHQ3 zMVbfw2)3q1K6Z{5t(HAU{CV zJoX!8-f8xd)&%uX`YhkP6{Vvr+kt=`;;r@)%9LgkX-%PwkZfvjszGB1>?mvbejU*I327D(DanOC3IpC^CQ%GUrvvuf zL^N{?l3}k?Bd*e=-AU zRJXQh51TTH6!>UkBYd=AOs%lQV&ic$=paZB=V=Wf?rF8RgmYpB#EoIT=Ux)->P%#D zhFDCm#@+ManqnjwJXK#kCgH$JWONMd`!w*apFZ^bibLt6*AAcf%^O_;bkCe#|6)*f z=s%9`xDe{U*@)S>Kya#WvNI0;OM0RndQ=?>oUQ%4CezT}tPH@*O{L{@U0HxfVUIx*)O|&% z(O=||<~TKGW=WOiAvc+_Zf2BW5sd%*7t~>qjE6ptM{|`N=c^yse!8oMOtiZ<$|78!#_o_o5uMfGD-T^5MA_JjnVEwUI zZ_eU9++>RTnDuA#WD;`2W+wOlLdMy1cIII7 z@+Iq<$QRueOFzoIyvbwfF-ml`zL^^q@6k7MX17&;(^G z-+R1{;fgl@u{*~!;%xK|I!}*dy3nBtDN6F_q{r=@$5f~aMWTm31mw*R>YS#54pHT; zo+5ob`XW^NY$Tnoe=KV2r=eE2d+d>RPJad{4}fu&VWQl&5`8@C6IAN$C9BG(ABzXp z`Ku4FK0XJyMPz^s9nAWIu^9x{W2sAa0)1S46A98q;3lu?cOHWP^dL~XfUl!@5Sm5z z7)qtIiHLI-eBxuEt<6z&e$QjuWg>X>JDP|$`aPg79%pt^F$Zno4tr;ZfV|XG5|3qV z(U0my6MUOUmF{T0AoF9X1(YeYF`?qUNv0rB@K~xn8+P<z+HZ9s29h+U)BR{f~Q zl1bLZM)*6vi8PBRY!;%bzVSFzYm&JK?ET(QZ`_WxuW_PD5g&HOj&(1eZ7RukEKT~y zQZz~r8@xc8F~=+&XJ?3H;Z|;pU3qwi#Drn_MM&QAz|Ex~;_a0TOy8hj9>ekthA>j1 z5ETSLFD2^56EZOBCAcyQ!9QK{&M#)o{&MH;i+LIPw@#NH9rMANlE3y!>agl?O`A2J zb!p>8MfpIt~4L%CTA=M&r|Mhu-F#meR zj-Pv^b$PdB{mD!weDd+)w|b-xs0=8l^yOD5d3y8m;QT^hMy346oSC7k)~XT8yFBg} z2mqD160;Ad6k(0VweUZzI96!0t+4(y}s*==&|!Tqvvrv&5Z>2H^<{B{G3qgWxG zjezA!gj^+d)ceDF3a`qk(?gnGBJ+h(wvdh*=Oe0lC69!Y0-2_G^`ebZKF%m;ePP*1Xo{E#T*?hi{STa zju`G0;8_#g>Z#MXpmpqU=`d8k+3SE);t5H56xk?tDKaT`gb~vg_a|HEJ<$26$<1n0 zf);0qyS^)4{N3*7Di>zyKY#D+)vIUMev&XK>7Mb3FfU*OB`02^e5U z^J$LiUSs7lS!xg;9>#Kr5|3ALu3)@M!3eZdqj|%qsZQ}$2k4jwq8h>nWz-gjl!#M9 z92%^0i0@7Q)&WXNkMW(!)uD~Rsh=7%iUn^&lb!n8#K0JB2*V5&LmL62D-GgnD;VSu zc~#eSRO3Dgq@M|U+i@Ro9vY%xluCiUAkWPP$*3RCaYTfo$3aRVTZZleJ+6&qoKF=^ zrp~C22Qp*D2@X(GW>rUsaLACcfcm;=kZEym2auJ}N`sKCw6_vPX`r)M1cXeI9KhDX zBaMR2BO&}uhWe2Zh@mxri;b#u0~}yxGsNK#O-(K^mZ8dp)vRt?txkc!MU5j&c#y&& zXp~90HJ6NbkjK{_MwuS>#z6`yI;L^10;I|t^pJ)C-WyZ|YLHoi6gxd6)V-xk*8s2V z$!#U?AtU;^wCdX2z`Q$53XS&YB7g1xW4XJJPjKkO*v_NF+e}@Sr0+U=`bhWoY2p4c z-Vs4T@g9NnkVA4bPNMG}1LuO-@x2>X7VLr@N87Qkv-YVSB5Q3$QS_K0H$DWJ9ObPQ zkWq6%C`5c&!mb;OEv=|0KLso5H#VlGT+G-|3uaX9hBE4W+W*IDw4#W@0%od0qzVjV+_l3?M`3zDU%>Jf=da)mC#2(pQRv#Hns~j4u++IdpLH}ZYf1JG> zkjKG3+icx=LE|YA%@RN!4*Kt?!nM-?SbMCi)Pc(Zk3kGoYrpMm0v&wm^r6pxMS;E} zWFLk=Zq5LZB5!c%d_fo?sR%^pamZk6)y+onji*E3Q7K(Gyw9K4{wrEQ#&D-XC!Qar z%<7LtLvV3ns)zj^70*>H;^gR$Ya}zvoZWOzzF%)9A~>uS#7w zG-|5#%6&?uM({i_!$6}8%LuBYHD6L(fk$3=e{HQ&tq`!%(|7qEc@7^x!#SeRfJMbc zzQYW%s!&p)NvzH&N!;7nW1@i17(geke<7x5x52$i^+m<}QeeZ}f>lNba4XAh^~JIE z){c5ewoIiyoP4eNB46JD=$6$Nb!gaJ<2MQx)fZtmm1#}XVm(ExFln;}Bam+EI1GbW z#|xzrqYmu~+!(RY2bA8C18Fey6h9{f`ULjBLQ_yj4zc!1?mJ1E zzq&$_12YCs&;?ZA*-&C2rKRd~zkr1B8s_HDsiQ!BR23Mr=k*scxdLPqbbxRfAlIv> z=)b~vk!>h9R=|)hXHLf3#@q1k0|I>wJInbqj_N7Wv)bb zFS;|;NdT_``0co|DclFX7Tm{t;Q25(F_*{8XqXQ1-6S)pG>W@fA$Q!)mfU#*>pl@l*Z%m?cx*1W@UgmnOj4BZBs$Q|SZqH;l={7e+RHyk^K z3nAV@kb9Ij)C5qz_YUVe7S}j*o7mo>eyhi&>Lwg6*!3~1J_4$>D|>F~ian_lUz|0* zVk%=lu6r(iL-FDhlg}PDdWbzMYYwvOWe1Oy2j;&pVfcZSMnB#ws0YO~huR!4Xo@!H zpipxtGX?4auFY{Jz|*!i2MFvb2=aVnQ@bka&8BX(f>p`s0DW#}UII93`2;%z%~1mX z_F?HNmFODQNkG1#CBoyWV8*JolI=_)NTXIRl&-KzsJSfJM*%r2@8r;3L25gLoP+Nb z;{%&yaop<#yF3e2<#DchIE4=Bspf@*)b_}ykji*Y>m3Dn^J4r zR(7I;9=GQ!?X`(peLd&^IT*hf{p}26tEINmWr~(?w*m`ODl2OqEU}`pu;{zz_gBs@ z{BGaH3xE6cslQ}?7O<7F!$&CDw5683bX2Y_muSnse@6|=u5YT8@1uNk2z;LNAw~o=k$R5O^I>Wq$v0DWXkat_LTWdTZ5++|#P}yn=3G;Yu z!&snP+2V$E#MT-MI$7lg57z$G79ti=+D2j0Lygl$@Db=Bx6eT@X+dNgA=;bvv9uMN zb&RqmNlH#$SMKvD7~3(7%%ev2xS6VQ(_UEix_#8^$73BMu11wR>ncF@ur?&jFlM=Q z_F2o`P`1b0P%m0yTmz6XZUR!zBe05=LEGCAV=(M%i*zOG>KL4+V{pz^pjk&frF*?fV=??RaQp*u}Wr2^n1K++hTH&XqXlhb*Gjd9)-H5oMZnnVBA-`Z{jb=8?GDTCHqt_7I)UoS`Zw<+~72l%l zOT0N^eCvKg;;&)H>8=~Ux{gCwv>XE{cNc}^&=c- zOBsJ+=Y{l#KZ3YmOn?=LgK;eh`5n$zlYG6yaP7z2y=+8l_vlugmy~oHu%mykZq8y) zSq|PB4k|glr**6Df4;rUfYZ|AD3@?CHmQIyN?dcJGE%> z`wN?8c>c9~-O>2+(gUv#sr28q&MmiiMM3YOi4h$~PEE;JlREP0Y`6KVSz&h6kc7Yv z(!9~zUcx@&IPgA#ifU>eXk#&nfv#KG2yD3L{8Qsl(lDw7u0%G4FIsL^W7s37DT2^A zHtG1OmdGo}B*p&nBK?3@b}~sD$vpapby{geBRFXzyYz#m@>S1ItyO$FFxwl8Z=mX% zHv&sF^Xx&RF@vZx^0hf%b2f|OHUYhh>PQT01b$|t^H$?<#Hx3G6oLb=^TM5)4aiUV1jD%Y@F|M@Q}Z_+Rf0Su=X)+6g<_xHx6EZ0SGgsjR{y z6K759QdBVbpZ?AslAH7EFKj&_O3nH&nXvBJG2_C=c7F7W7}0ZT`++$>XXMy6TTvt!hCdtSk|S%l_=0QG1uQ^MjLOJVW=az{AEonhi*f znLS95YuKQSuoSR~w)1Rvtt~ve7PK{^Qny6wS1Dw}x}>1A&9%8Hnh%w^>_Nb(catqBTw(v>2$Ttyl7G>K z_n&303j1)Q%n~e;ZNfK8rFhi2QFtgB6BzT+G@CuLsk$N54&^-DTH_F=sPb8fH1TZq zx=52fusR)H|Llr@ubFKBm3AN z?`9ZbEXncM2dp68S;4u3^&RVBrR*lLi&cLM9=%;Wv_URC{2We^awxV9bIPFSDb`QewlD8iSUz7b?ZT$?TgY4eLXeI}g2vZ9fIn7) z98gaJZAOsn&pMVg$gAuG8g4Zx6LD4vnGX8_><~Wh!bl3EFrIn5sHYk)y3XT8%I_F2 zQsz#ufb3I2lW5g_TPX7Ml?FArzfcXD+y`RmJU*kA6tT!^fykVld0WV_u@(45Tgcc< zeW4c{)HuQ~dSzd4l#*ww;Ad-JuYFl%(Ka^khTFo@-VWW{4)8Sf=N`2`v5I91^drUC zo3I_YtA`8&wfy4=xj2(fq}f?=vDmXFNjL+>l5(f+Fx=@R&UVsBx?&DDZgg%IO6^w%)ALx8`yiu3B?i>OwCX)#fMI{Y6$!6 zVYGQu&|4fErMLL`uu4^sy2e-uc2%}TQ%WB_cwpX?h81wbRLM|hLWxxr%RUxupoN%g z-hee{uzyX@(<%uxpIpzsg1!$9tJ-XJ=YcDSTSMqLHU2*Je|DlDqG&ng3i4>E&mk}}oNEnKpY zh`I`pm?mPJT=yIjU9GSGbftQht?5ZMPGtttxLw`Jtb$eok;pO7WS97etyh7PUMn_U ztAmamUwzF49q5NOD)B1Mn5#tkNhO2T9_4#|XZSvxO85;(D*Uc|FT7=T|3BF|_!Z9Y z0vvvV@0GZKKlGfE?^}O|0s5>nX+L9z)lLH{O1QnC#=riSgBpL#u>l6XzARtg>#3n;1~_BaXexLryxM&0`S6AKrci=i3TBfY01V- zi%K?@Es@ekj~}vTFPb^oDx{_os^V6;*QS|$8Ny!I( zIsq_%c)wW8F@VSqU;&?n8u$z;mXOy7@XLgGHMeyY%2^itS6-JDwJXkf{2ux_>c|Or zr&gjF@8_+FZV>;0JWFT|yjE!!;AcpjLo?&}UGNyNo^c*H?o zrF#fSng9YVvD8MmEH0n0l^_Lk(xlL`-vdO zA5TUz@RQ2)tY`V9C)#HC&3~nE*{LbH$LFN>^=hW;H`M3AiH~+|Io&_A{~xc7+qYz3 zN!H?xMc)NTPmc*5zG%RxT?O-&$B2R;QR;MXRr%h{PXw2rjGSCP>50FD1-!C(<(V0( ztnl-(K^B7WG;vO;SOEuv^Mk(eRB+{la8Rnylw-#AW+!oIBc=lSu^IR%=Iz2vWoqjH%u^O^@bcNH`B3_^p|A8Lm1wPHLu<}> z?h0RTRC*3Y-TX9q`Wy(n<yE5t!wtJZvD%Gq3CP35Gr&P*O)9A@uQyUSy z4Zs|J2Px(i3H1CN8E#o~O$BWRd8#()fpX&?S+tVg$};BDSaIf~`=U#A4)T%fHR$b@ z5a}e=eJrTYvk_*oz@N?9GVkMumF6wO$+IvHIs@LVAjbXd@yE zK7%d|g4)iw<*)9j8JN3Zgoyf%LqA^o{twfo=vfD5mtTzzl-TKhJ^HWzWhY%P?^$$m zaqrPRiiEDfNL+cy(Se+yC9I1}vOe z;O61~+O2SV4vxs$9Q}`Qw+=OxE+zyRh;?nWr}W#)svaIxAFZg6?wdgI=MgtI9Z{gw z;ReeNdyID_;i6=`d-tviG3Tx}wou~KGaLbu#VL+_X5;HA>eMFLoYyQ4aWtN_n%FGP zaIC!pGCTz!;wl4-W|&VJfLU>hIyDG&nB)MgI$FB|)G%5?(E92lDx=h^_Mc8+@O?Nf z5w5{6dO8CTcK(U{`mcQGo(`}>v zSMJc1*vyXdPgh?1?Fj?(H{KRvh7GNJ;w<%xmV%E~2V9`im78?bY5CFrxt_l%uzm6m zZ%Tz<=jCQI;j6QLn?Ik2@bP@r9vXbUcThwN5dIH}2?}Fj2E7O#1c{0iJ$!v2-T%<8 z>Z8F@4D~(xMCH)o(E{vk@i#p2+iO?kpE_p7(jh-zq5j)+x-D{Lz`V~l`fNQ{yKByCwomimN^tc8LzmwYA>>~d? z1@2^U5fMkffEn$$H?BSAPw>zQC}F-4Pj85Wx6EHY*Kz2DClxKQe@^+AF@X{uvIR3j zzsP=|3glv%yZE)mz0)I$YOX+&C?~bI^cQreK~CDB=F{W^tpd<-9tt4XXw1+UMl(v; z_-D`uFvw83Dt8v%DgSc)fC1~jEZ1I(jxS80toNeVir`&uM&lQ~211f08M6Xbd_`Mq z+Dw~&wS4(k^6#5>$oH-kO9k)VUA_80?-Ufg^PknL@4j0ASfv5Y@qnOuUMScBL133) z1_Sg{R1lawzU|$EpzJ*=WG*gIV!UL$?pA(SIh>Vw)Rg4Xo+;qRC%JXk4r%S~#`?Ji z{rhigf>RCJ?a_qmD7pB}g^Sq{a1 z1~{$&M^E;^TV;O5eg-Y?X{U#)>UVF2gTCb_34^3#z8Z`+T!C%qbmUdy9^*lWr@rz- zCBrEbSrzy1S5)ZxfhiGI zeOg*D8oNd0EHt!w;I&p1uLiK-WQ8}=GsE{Hm<%o1A6Z}w!e={%&wPr$Bmufl6Zan zwr`3S-+Jc!rLWJPy?iNPC3X37%!fz14`0_Yyi04(7HQ4A0=kAof46Je{3m}saNs|y zr9Uoy@$0W&eEu7bKp2KsA%4&b>>Jo2ugqZF&PG%~4{C=4TX|_QR!$q;>piXe)ERBt zwg`1^6W%*&)~Jr-L*#k1+)mH1Wz2IHsAOp7J+n{pH1C$+x^Wp5vH{mRKaO2Ct`U2J zFOG9RP?F7~8@Bv7ey19w#QU|@u7P|Y)#w|!m$79MHdt|=x0q1tCME$qH_XZcKMse# zr5ndPEMbz=#?#NE8QYXA)f^~dYh{12g?lS^k5KT~78Q>^N4-9+@mCx;p?vIx3&;EP zoq{sPWdXcyJ^6&om?9h1@cCv{Is#xv($vZm#SFjyc3QV0P55x_7{H&QfV@uMLXOk6W3Tvt^Xp?|TJ!elJ*WSNcK!eex&7pCS6}HnXl#JeBjO2Y%>_py#uqqKse4%lJxxz% zNbC!=43qYL-6 zD7m=`_fQVZJxU==GOpqxaJ$AIp3(Am^%UksRh!@CBlaweP>Pvn!U3fXux?>~ffJ_A z%7wx_xOj{Zp5c*OxJS<;w_5bsjy%;xqM7;OE%N&o0b`5O92UWCkfk&^Q5UM)3spV? z`AWaLJ``=KP+wqCtcb>x818Pvn=IceSMS+F^?RkgRKI7BT)kHsb!6+faa)hPsJ@Pp z6X~&5#nk1akEm-&E67hj(W*qg_t8i4{o+=##E5X(HEjMzTeqH@8``2p=-hK#w|+D~ zO!X=G>W7{tbH0IvC2Rnmv__wjyOiPJ@`7gb!WjoNK^!0}#74h7^}yvoXD23!dhf%} zX1v%-qQ}~F*}SgfgrTlCZbV37PdwEroGCR7!1oi&p-n5lQcS2xlh_LBMnwgPkiP&O ztNN9?Smka_cF;QktMZyezm~LHh1^7w_-GJ5?{e@-SCL14;`)pp@2ad zt#uPn$}F$~kJ3$EhFHlb@7`5lJ-TpL(>6F3+@beKlwjsj!hCEUD&52~XlVCg!6_xF zPfzGLx|@7~26o7A-+StW(d{!j$WYxuP8Ibo$)$PgcS49v5}n;A%`3=ta}r^`jDS9X z)i1Elf)NrZ;5tvz2CO$&*)4~_K;Z2{<93D!T;+6yDwKha_f_J0Kv_6;I=5~y2n>Nm zsPw=xel#Pl=5`%vw}k*`48gTXURjSg;}x|o1L`S#FhC8(b!l@=WdS=#;DIdG9&zCA zI>#ZRPanu(Z0+O1N`7pc(P_Za5u38R=C+nkFga4wX@cABZj&O~59vN(beA08+iA^1 z(|d6hC#N!}=1HZ~H*NEF7VEU#RMFYFTlUBqQ{9>gip`?C4EXWvd`%9madWrA3t}Hm z8CDp9nxANa337+NVSxqfYP

V1m!}nUb-sr|pz+3G*}RH>gda*rw)ndKKpwc?3}) zmH_233;+JyUZqa&U(YvZvBpnaE}T(I^+MeGRa2?n`xm57?kSaeDH#MXelWpMZ2<25 zVqr{m^5;Gut=?XloF4hsqW3>`F@C~gozH);rLWx%A zLQj6>njf0sRbuqydw7eHrdzsAK!p#E9`skkLtxf|F61?#Ir`y|>V9viC@oa%`evcw zsw7=86o0ehz<2WtD-VADw@*JkbM<1t+F$m_t~gok`(-um`#vJeu^zTvF*-umPdds?}OFjrQ=GO{zhF1j|49-lm6mY1`L z^Blpw|GEma+f4iZO*{U9ZcrX*nySt!WC=q>5MgJVp{;S_zn1YSm6eSElByHV74o!+ zc)4!pKRcq8=rNvzQaXF~Nb>dki9BJV=8yDYh(mV>*R zs+(szNbPZ+Fsnc4wZ6%(yy z48NLAgU4l&I36VC?jo+%S*39EDV3$1tPC(TYuVCo!p4b^qy5x6zsOZfM&^C|^z?mM zH$NPx&P9fC!UqEAf?;5wo_`G2@8PZmODUr#Dwcp0}gCHGSHn=g;dof^p~@hLtZ}s zh02evD?jU%(QM)Six-{B8+dg0wr8VX*;f8>n+*To{9oEOdY;rFFkwhkb|G6m-!1#; zk*RAkQl^gV7?C)%cfpF{T(@<*P@_TaJyv|vlkZ@hQnXNYdXQY3{)>;|zg(B-b=80I zkz^n4zx*Jqs#(EW^I|fsjX%Jbaip35 zFu-PBk(n>i$SmT<=DZF7Z)3JinB4PloD&FKK;Qc^a9K}&<6KAEVmpi$$XQaOBlJWz zU7sZ%ln-Qb`}#}`u9M?)Xu<303#KRwRyfgOJ}c@ffLmCboO@*r z&y8TuoV7bUVkoV_84@s2VkZ#ir(3wBfCScMAt;#En)KGKX#!8IBBGdiBET91I%gQ~ z=bl+)EE)|sIWdFY!-rmhO}zh;h$!G!0hB6M5s&@j=zFY~COlVf?Y4r`oemHbTmJ-n zR;?`_`9+Sx1#7mCD#g&6eh{jI5Op;;>KM{R?rGfNE51q(iP(ys&Ngv#1cx#gpm6`4 zbJqp?i(=zJ)Ekc9En|y}8$>tI-g(B|LUtM}g{Yon+#YD$&f$0g)$4gX%Xz!dSY0F> z@c`;NbF%J_5)70}ReMHgFfW8e)hEoyLQ>zBM;8tU&X z=~{+d*(dG$GPtEqYSuP%)!U2VjE{^hSt)Y@n1`Ivep%o0GfcQ%6Lz+|@3Qvvi1C+z zIVt0}WH5OHP>Wclz)DF+E}d4ZBWRg}A?Ts4kKi(~uXh5C-*hbF(B0j;?;grHx|#Nb z>)x;23^?2RITA;{cpk{6&6E`$e~j{}NB`S^q*m z=fCtJ-&*{V43>2@tQ&;G%0FrqZ0$4NS{m>mlRvYErmDaEo&S=|CGs?^L;i;xse4AV z{MA#m?O6VG885JgEWp$Mn{&5OBl&}^z%6zQZwiD1Pf5n`zQqv{e7p0kE6=_0b1SbA zBfMJu=akt25wP8v?XQ4C-@kq*mO{!dJr?`kHx>s(psffyzD3}jKk13iwd|2P-CG@$uGTRL<6EU?Gkg zU_8S7?3;-wF{&-Er+)=@qfLDqsw`o>Uw>SMz&QhrN8gx8CFRF_A%sF6xwaJNjUEr? z#(})^idu`ldrqmS_37XK_UUIIe@4gjdGWdFVX3j9{aes-c~zT8@93o7^Iw?m|Ku;v zSKM3WXNR|-wjqQS#S0aipDJ-_?y;%ea!0w0oiToY{!>?nCiQx=V8M%9 zSM05r^F-YL$KAI8R8^(>ueJ7h@KEHTfM|q>pr&}_Eh5U(N2rKLMMMPw0YxB0#b@}; ziqy=^>P(TDI%?*aW9F2ZnK@QwFJpQ-Ow;W)PQ!GYu9Y1Azi;im4+jLbxpimmpToEI zUhi+M^?l#^)?=@=@1AvM64F!t5;*Dpyu>@FoBH?JP(1VQaWiMfjmfU4$e*7Tkw1Fj z+7&hZH_A~Bc9$u~jrDW}n^CTZsvlQl;(`XzJvo1gjQ#>oR# zt?sq{=-lRPC1_x2W$Bcj%T^D`IkM3_Z0xNg3x|3%P0kzQ(QVXytCAl$eQ)o&6D3yb zpal!dvIA<5+?!Imcqlg*-A1jRugPYIo+jI`(Qp9LNx|M2=)vk*-;LLBYn31D27TdH ze|E5dtFHRp-105jslMeKF$P)*>Hcj$BBi6jdzehY{GRmETkshv@8OqX89cjxQ1VDO z*W?lSkW{?W9G-3+c-sJzL2=DAo2h521Bucsjfp=FY6Ts@{sO2Kd+H)NR-|d|f~wjN zE5kgKZw!l>VvR`X5#cj>dSZ~K^%~-e>qciN#%@)+rehKt>aXm>z^?)+V`YKnB0$EG zSmve=DEmfB^)U=Hl8*871dN=QJ{L!P=k&eggdfiyES_C3v$=+Fg)CMzZ=R^)iZ!fZ zz;zf=3lXR~Ye1$PkF`=Q`mcz{9>Mw)0+d^gei~fk9^Uxg_w(x(&svBIGYw~sWsb{{#e;_1TbKmXc1YEn?b+{kWCRYg7L|E^~Hp}>JpFU`F>XYk=I z!K*jlyLsJq7tXDUVvJl>y>!QDkdy1kHD!dgKBm^^=BY=axk*TD(yFm`3yF!jb^j*A zp(ZPK3d_lLnq-x8F{s7fFYgK9BDd)74hx{lOLfqi+u!RcP^OTA1%=G)`P{ zS8e#q-2I+=SL2$iJ3qd6xNTcL@m|vEd64l`SD5I){Ju8xrO1>)PBQ*3fbD@6M8AH-1_FU^u2?-$Ield?fFQRnx+0 zwuop+TmLZe{ks0vX6>QIo@h9YJj2k4ZS*%VFc^<^nP_L)LXbj#tFAu2PSxN17VpWk z=IvSRCpEa>)xSehe3vrq{^?^Xdy7Q-z~I`%yoa*6!Sv$~Jo}-%#M)qfvH4W*$}!ga za}|58N;Q{^yFjZLy{UbOH)d1iHWE3QBq5-kPaj2hIe~^%IS`2p4KA*K+IsZdpx^!~ zX+v?z{C?Ju`K6`nM?L=Rp!0{P9$2&ZK=&Y@13`B-K6r@_E1odZ{$D4TzFaw{K9>jD z8>iP7EqrouXZ{~S&hm>5=z(nK}WPkCH(Q5PU#ILqZy#jwK8HH=qO`bd9LTQTkf|$ z)lpVzDX*UHJTp+Ynj4k0D@te*e|p~`KT%E-7qZ;AASdpC z69gwo;ESI`b?O{yZ;78j^;pz0O6$pXezd2wV-2|!Xg!Im7dq3DB{pB)SXEZ#sIpt) zFw}v8)H-iYrxOCGY`Yn~PQ~fQ${ku4ng-_CX$Qzv*^Zb`QLdo(_M#aEDKF?Q4C+*9 zhFu*%ctuIQ6WhTcIYe^JYfF~AR->BvPvqr2kuS|aIEqTuxp@noR``fYHAM3kJW&a( z2FAxmn!!N7YmDxP<&ll{Chlo9ChnZG6T>5f!7PXJHE;qyN5*oe5lmklHDG4uVSRcO z3b8XcX3nm{;$5??OV2G|b#8Ir@rliO{tE5go&0c4;jTG_PvtLvy$1hT8>-`)Z3$M= zuTbhEz(VWaXo*N&mZK?qTx3U`4?egu$hl;0pLbwc;DkZPYwoa3dijaliUvlAIRVW= z32eS7c5?n;`Ky8H>u2^}x=c}K?WsC=&cA!A7?)_B+T0Won)|0G>n>Djr7{E}Pwa}I zm3+)vs>{25y^v5kZ_2fMidohJ2Y7_l5b)y{{FFV>YCkVyqCf7An4|~LI#4Y2`i^Qb zhxyRpTxs3YViHkRC)V}O^s9bs+8xi9lpmQ_bueb?AaSKRFmX^&(&>e3KU}-!!@!wO zmiW$CKW4#^`IXO>mgPi<&#m#zapBg&H6N~9^U->34a$&#mXKc)Ia7zOf%I_fS^eSqb)SqF6ZzY6pb|8)@m{zg10Xf;NVzlvVHLgMysm8E^aXITZwp=Y zAROUj)dNvbsteMLXQ3`YKd3-zrjJGc<_yK7xxqMY>eL^ON_mO(KVW?ezO>iA0D%S* z+ru%Ck~_}At{wRK=o^Hf!in%TuU2e+XwACP=N2!1uJq2eE<3hWo>^l%_0r>yzjVrW z-!sqL2MC<|!kR7b4-N12TFv4;)2HuQT=QzLK||l)vgU=k)`L5r+Q0v)od?CY_uqHl z=FRurcRyqT_^q`@amS6yW~4)c2GtJQPn*`I;i;xh>doz_(T@|yL>^rrYxIwG*VL%- z1ZuDObG1sdsp@!HCsiugabQH>%G|sJ(3t$6kpL|%ybOeO0WD}2f$UqUKkbH0vH$~< zxHXyjn%%(2joMfQO(lCh{BxwePXgJu!9P{ngDqs&>(nIFS<370h)yIfH63oL?UIc0Yt-#G8_UK6@68#DXP z5k(23@^8rq!18=@sBchc&6unWnUn7kE_W7mzkT|eoW!Ex!-s_McP0ecGs5E%GVhw4 zb@yaR141-`27=^?{Z2IC=plMIbxdt$*-lKkH!G_yJ9ERpX`r`Cf7~lqjEN7jY*8M#AEsL>(JY0AaCnES($5R=GNBc&Rk37rmtQnpxmGm zAGKH5jlE+z+-^S%N{PzMy!r<93qpt^z_k}fW~8-BjaBa#pz_F-?(6poe7kk^*xC70 zraZW?dfSxgVou)J)z;|?%5rkbE3-4_%*mWEXO0jlOS5L)9T?@eGNY=twkl(lcSN6! zGqaYaWERYrou5B@Mgc!RX<{b+CQbt5fsdT)u%kYKzR=YsR;W*)89>=pajgy~-sPyn ze)qPmL*wDB`=;4Xq7KK7=%5Z~tX@4s)}g%;sMt}53iK1GK=$L~4C!MMjD_*4EHbTv zUnt2UoCK04AZJJpDevgA%9P!K|43zg$hz+?c~rqTleKBTdPpfZ@mN2qu2k zA?>kP$v6Vs@Km~xPfIe#b_?J>4oIu+C*h7fl`oNJC_)lWV|j_hX{@+_r=WEPo@%7} zp#7W3nQlmF!q+A^SO>Es*tLf+*bUqjJ^~G8P_Laxrt;;vV2dR4RZrA2YW50s8v%QG96U)Zu0J3}1ehF=D>?RB=tdYgwej=8MDaVk z7M^lBxt{od4+0-ls~o}yX`FDiJ*BsyVq?97iZNoUL%zQ#wHSPV3bmk2HKLaLD?!i{ zvsex&!r#7ETr}0vUK}1OXx&>*NMQEM+uKj#<}mXUk~HSL{fv+?A8Pt13|@Xx|%C z%j3Cq?|w|p$5Kki?K_Sgv+uAU2O7XBRlI8YoOacLN}&;jg@s1N#$pB##4XoxFs?S6 z{b(dW3p--^wB^3IttQKN`LwdKsBxjAMum=xDzm39pCS(S>s#gC%dM(!KXG8%a_iXW zW@}1xPEK@6b5`V7D>4Ayslr9g&4*SED4W>WFv?f`1cI{h^YcZHG@dt|DJzQ}OIeJK zE-RyqU0jf{J=HokQXEv%76+ooT9;32wjy)4Uhc@eIg4~NS+YXp1^LMF#XmMD_Tc_J zYnT~$qxTo@v50xd6wo6B}&?7JNyf!JrA;<@~jmMcEYQDp0$)G!qkWiaY4x5j@FWD zM7F?g0UAx{J|;o^fefjfbPB1Aks(zdW4)7)v44kYAWhaX%GkeU8+dMh%f_qU%3O9M zf6T)mmmJlOT*y98wOiP+xPLQiBOm=_U(?>N`89 z^{xhL1uv1i0_%B*l4n?ju;>w(JevS68Pa8`>H=QG9F^fQi4ACsZ-ITgv@h3aEJIQ@ z(VT|8>43!k1xaIiUrf@KupbzJ7*n1N`jC$%Aj1v1P`(4T&3)XKu;u6`pKQ_Up$_jPg%d zHFe~Mq)jWPt%&cL7#P4Wj(&RorfKDIG1*)8?@zZ648Ru^sRte}P9L+Wq<()2IKQqX z!BAr=k(wFZb=L>ulNew_dK`f65|sKCeUaci9V9=1Q1?t=c1fLO>)VItL8UtZXg(u? zOAgIjS7zA!bmdEn>|OX9C42IxKbV8J^ONq%+`rNuar)CwO&OOieSbuK{!nAApI%>D z^-`E6{Pl;IKb>n$UpH&k!!xobtjns|O0AsPa#|r?3MTxp-v??I(8IExy55hEB)uWX zX-~Ylhw$BYwpdY0&OTth>+SH&!M|I!@o=_K&b>yv;zyodn{d>1+xI(nf4{}`=ux-2 zYAo+9|7gp{_V2JazGl7aQH+ohz|fk*cI{mkH+p4y zR2``--8pmhy*%)#2Nqq_8t#Xj*$0<+ZaeUs2P)QDW=;QF<^KGV7w_~eeLVa2^;2in z4$6+)w|V(*LFq>M9rs4)_FkZ`Fzidfnp3o3R^ zpSrWU>Z$25VvZ>LF#@9w!)5efvfdi;g*WZd2_mhd^%Me0QDHcR0QwNd8bnc;V36D9 zlnI+ILTFeL%hNFvGh$YB$n@-VuVtR&3QBTsNvTQ^1LI~7?~`9N(Q}#a>_wGX%7=ly zZ{Zm|d-^5UmWr?P?#$@drB|Rb#^2v7wqka(@A_X&@E50nh`hB``9?}mtY*nwBaX9) z5`@2fl@in(C9KT{_yBy){sB&Gq9ciN&`D7V48bTtD0ak!vnf=Mp<(JcC?+O0QXQi? zjh14ufQr$QUZH&w6^!Yehk53{i03@aGnqwb&Qrr;N2JFaJ(QgRmfL&=Mhpsx*_J$c zt);KU)#^HIP{N+(re0!SgKmq(xg}$U#nfd@dLSll zRJg@6AaGb@#64M)S6W0j-nDn2SIEqyg#5mdwXo^ptk<9(%~uTGSLa&aFnEhmIKRuQVDqF&n+tI=f>kkkEqbvK+{vRtSR_U_ksUImpLR36v$( zNt-(Iip6+O}zfi{f+ggiJE82 zHh(h2-3_RD7HpX`X-i=@qjL4znC5$wGa!}?l8>Ne7#9Mg9<=+)@f{yz873EHGkIYM z00u!fg2sU=h^dUoK3+Bal!{Cas)bHg+iKWjPjqs!c=B=`i{^(#v6?$h=RtcI4Bktg zEfdAf4^P@s;E8RA8B(&KZsNh0{*Z4pFC&LIdIunt3S8DLWm>|HVUuR=ES^?Z7M3}5 zbII}tML9mtbhAzxrj(cOnVIqEqJZsnkFLGyViiZ#mhXj@pF^_>I(_S3-ny$~ zZGWJ-$xz+g#0NQO`D&KB+gQWUY?7&XYBC2yb@dOor;alu}056h+rV6 zZ>`pEMWK?=93noxdb-&rHBBIx1>8(xDw2gB&(Z1z8|lqxK=sR0?7I;G_E~(VmG8vE zpuJe_vt$Zlck4(+rckCN8X_nKSD`AoP`?$$-e7MS&ihM)_aAO=;Qe_S*%Npe+5f=9 z;AsB?^;k80r*cxU%X&vTB&Yjn8d{Aq#vX+EK&qWfH8u9$m>Ps!ZxSws%UBChXWlf@ zZ&I#aH7Hk!kL@J>;oF3{y35)O9hDI?n|j~NPbG-$3Fu;FBwmsrw#6UUW8S3hPNQH= z=O-Osjyc2^G-VTKFX21(^7H(BjJ?EOB5_7LUWQ&Q?=Z&=%0ymN=S|AItJ^g!Cgh@; z`sdnrWj0Tx{;SD3j*Q_dP+G%fDkx&jqbDxn%FX1txm4x$sT#lHs|l1_-t+9-vLq%% zIDNWlrLQ-ezf(@~W8BxueeGXa?O)liP`wHEXTC*gL5l>C)~wxmh7}cggR@+I4x_J9 zaNM)JZr0f&M)ipszMyc%fZM_hZgai*&l(wDUYr{i5#F6FN%0E`bDg{v%$?akbbyOH z`H3r0sZnubdnQ$+;w3MBWJS7thqF_}=ss`*-F?BYD0b1Lo|z!gaK=JKA|`fT(ahUM z1a>R(3Y(b}R|ZSe0Iwpi&{_P-fan2}LzCu>91t^LqGjZQ6qOsc8sfwkG+tBd3>yHq zp@Oz@X0;!n5br9-4Hd?hDTEK_X3pQ`Z}PWd?8Wv{ z;k38DpSs#WimG2<8V;%IA7%PRBRI#;z2MvyJBq6UZTR$T0uEOOTW25>_ zzGHIXhSbyzg?Q;l*6|bWjEuZ}`FVTkxi_!$>A7>CE}i#uaq-i^3ChXDtCh~a6xv$+^gKr>)azFJ zN$ifGHG8b#(P+m9nj)$x(oA)rK-=;VeYd)-$t~%!PIL(l3CT+Lu5(#4qm-0ozyA%>_A1xAM@yCx0uPVvD z)f{}ws6RdEc8H5HVPRdCe6r)r8}Gh!`oi0RV%;}8cl~{>;C`0TLsHkouf5wX%k8NL zZr}aqy-)tvx~czo>+Nq8<-gCr`!{5bdT2D!_(45aDUwdGkCe0^wO={Z((q_Q3+?CN z+tW%@g0UpQ{$9bZ{K8#%1y9bI^JKy8t8SlZA73&4F3? zWWF_HrHm$HieqiOv=n8!m`S0sxPIKGER$Km&r_aXsJy1nI;o+5z9O#Hx2YrN>Z5s| zcJo4Q=Z!$s)CbiWw@Iq@LJtbD=Own;x5lWw+g8I>`&P_ok?bq~5yUL}L^+cLK0tqi zc{GaU?;H*@rMw)oU-pO?UQT(m)FO}Wlm|{{p$WWLF19&^F?Rpaz{}&*u61j>Jo=C% z_Tzm_2b=>Lu8NFSEH%80FF*>oX?-;fY5H)z!``YKv;O!kFV}kQtqQw(0NXriUXKfu zhi1}VpqVo#`w6T&sB3(o#su&Vo$4xey)ak7x7y#~;d6Po{hbK%e`=3R(c-x6+`Z**g+G?##py87J}eXZx~O{zXrYNxed>O9PtMOQxzb^aJjn;=r8 zY=FpwY*02nYX9bqg{80Zp3l6%{hpoZ-fj2tg4Nwa12>MFRFjgnY+};gA)ym83uANQ zjINXReEnekmHpF;f7`UN==F?{{14Vy=ax>&nN$4E9j|lm`W?L6g(WNBu{Uoxb|^Q? zC3#fZ@=WXUl-SXs8||Ntou62p_24(p%&I)`w>$6t`*X#^B2!0>5WaJAX3w6JJ8Krn zw*ri(X;)SvoyV$>n%(s zgUIRTej@&W@6>@K?w>Gjan#7DuFc;>&Fm8bYQX&>&jhB9iK)vNy>-~2IPa-u;7DPD+~**K25iJ+RNPz^_i_6$Twj+}VGuUmriK&#hsJJ@}<= zF=4mek&v)pz=&Z~`Xlx)l#8G|Z~A5gr$VViB}`mVxpAlie&YC4bzr0(@wczqia0qK zw=OwSR(52Gmr?mX-E{o>bflJRKc<{924ZZOh1BHiid4#^Jf<-i?HyAqP#-%hv0B%y zd6NR-G-0L(6M;FuS?4#^_l~-eTu=qO%Sd)}_-we;0^9D!ej&Ov!D;&L0Ld$nX8|IgNz$Mv4J8g9mMV*&X zs}c-CVCkii{wF0V~19OkcprgC*7TZpGzIKfE}9{)<0s+Wb8|zrT0NmguNp z(RXO{{n^oZg9oL1W_61Ux-}zgRC#E>Tl(|~DIb-U8Wiqn?U@!hxNzi(hNouEe5zr^ z%8%&zk(*OWn<-`Pk(iwP=-AtLj7(1S>(whOvUi`v9zA@bES6OXX|;ogM)vO>9}+lh zZ1>*1k0Sm`=ky?Yu|Fis5N`Yy__DIYg$_KQZe% zdRp8Y!)FW`ke!uTvnJ3I6|hERb*Qo(C@wxgik*$Wk)04W-uv*bU0)9A6EcWsyha>0 z%>j*f!54|3aT@db(BWlJrL_UHQZtSZoy%=8zn)W;=x^jH%8jT zhexb(8U{Su;-a}jYozrT+5vLJiVuqA$>Uf3>FjY@yMyw467j>t>zwwtm}xzQ)6FXI z5!LX)*C#mH7(+d?X5x-m+O(^gJR^sCiX7Fn=1`A;EgfWv^c>i~gCRniKgPrE2BY~n zjl}C1a|uG-gpw3M?&r{dQtl=6gnvEsxcTrmi&x-IYeWg`fYD~^0+-j|a+G>9wpaGl zCUHVt^D%7Y79;dze0$5~m#;PUI&NusM0L3mhc;<4Z4no=FJ95Vt0xAEZ2Im%{nC~C zbJG@HBEw)bAK9Zx`k>b?Fj++}^Bk&cdGE<9I2Qt6$>H!hIPfL#9isWt$#HZ-KKW8< zK7-#s;1?zu*cn;QhL#dMDKD$|*o;*-Id<^t8)j}&uMII->7tN!A=Ha*o75X5%&GhK zLA{|gLc}rPOS3*SQj1i#SYZc@iNEJ`Zie$I+eGu;3VLKD*=>Xvq7%ng4>Y>jc#fE3_X1q#@=F6C-*>^tZlD( zQcH&x!zw&#o#s}WumHS;#`!2W?v(V$PD4-(u*WEa=F_mM5*w+Wh0jacUma-=_Utka z0xR-1&-1n(6OzUhs_FC=@wgwIdN*yPOUE0d2iG(cUf;nTOuZwrED5Vu#U}SJsTevq zwolKvf&EF}`o^$T>{F?bEw?8!g(qXSrxM>S(0mWg<7iap2PzR)YMS4vsRya3-?t=y zUJ$O{{*6nn=^)z3mqt{s!l$ivMQ8pR%n>1s_I9w4zQH)M4C^AyU@*`c>#7&+&t0jj zyTZr5c$}wyS6BC){rHJDc`^5VTdpt+loW{&pm!g?!nwRczMsjSi7 z-B^&K;mqBci*i_V@520*P=y?d}=<#UW^D_A94%Bol?D`q9E8nZMJxG`lY zzG4kxR=5=5IiBUSa)hCLN7#14Z*J%=~IYB zYz}6D3J`LEbgjT!F)Kq#bMaP=FbmenT|}n^YJW0O-z>WglReU zKju5?MX!}2S>|w*xCs8G2tjpTDr+%as}V}20`*hPmcYLXA%nCKWq20AUXJh-KM3Wg ze5eFLvc4(oWRyJv&xx}2%JJ5kGSy#e3WMO+zWhT`lLRU?sF=0QSH~tF=f11u&POX# zn+5@6wcUf@L-{6Q%tP#@-)--j6mv<`< z!pi4Bc7^wW{O!wb;~~5sR?XjFZ?g032Oi4aq6HH^fDdGY`E4v5@^lCv%)|K*)<`mo zTli2O!6QLG5$pncn@3?`AqMj&ajcjRWA9>b;&7h8NAN^Gl8@p^Jel3ko?(Zu2mY_% z^Jt#JQ+XPT;pyyi_9Gw7$MCT%mXG7N^9(+o#j*GJ1ol2F;S~NgKv-o6gbgcs`%Q3wR+L!HY0oKNsV-QuLrDyp+%5 z^YJCne7=B}^9o+c?_g!Tip}E-c{L|)Ucl-hr_!07GgiSD^CfIF`wF+%aY(gF4#~}z z@#TC4U&&Xoh5Sxl%kJQ-`5L~KujA{%`QzC4d;`CWZ)CUgyZJq!-w(iji`f!>FRx>Z z_@t6q9p`8GYy2$#J)6nTvH#$&^EddL>?C`cpJ%^fkMXzo1^zZR{=UoK!N&Nc6$&gMG2hqn`*BVWPhnAO?!t#2_(P zgo`1zpof#0<>0%@ni5Y>_AOv0tV@6pA7-R}_m9Q7Yz% z`JzlL5apsmREj%9l~^dM#Uim-ED<$gsaPhKixpxeZdiL%+$n0sYOzMF73;)$u|eD= zHj2B&J>p(bC+-uQ#AdNY+%L9btlk}K<-XA0{jow7fYCv3@qpMS9u(WfLt=+`SUe&g z6*loJObI?N>ctacr+8BA5>JWUVvpD>el7Ni{o;UlS{xM5h(qiJd@J`4_8oQ_b;BA- zAlr|5fhVzJY$tn#-G$S=O_*64DSm^I^s~_0+%X29#qu!MHcI?f92L)rW8!&noOz1h zvBT_H%wi^s7sUzj5gqVodlJzLwa{{#(2)-VyJL_r&|+B3my$z!+`2_yhF1zhUG%YDjeJ00fPmA`9(4JB1Gf97@Xm%}p zQk-T_(wN>&6H7Z(3D=$`2Ow~%6sud+wD{ZRQ0;zg!Xf2VFW}H}3QB|(R z)(}n8V`-sMwYp5Rbe&kTsJuA8YSDtS{6*E~iE437St?dpPFO|9m?leC_sQ)F7co>r zZdjVZiV8DXoub9atSu2klT1^bC@oFHKP|>Mr4`>aEunO+)M+~Y8s2GXU8l6ccZyd1 zQ`G7=PN^y_FE&k)jbNIlqC2e>UDs)arA1Xm3riQ8rWIG^FD`PQ-s-7VS$dRdy7bbl zTK%TSnQ~-uZaEI>Fy%WHC@EcykQ}Q$hicDA?HR2;lk{h*X4k?e4b$w&+Ea_46lu=a z3Yo95PC+ZqZUwE_6v|pR6*($@Xj-y{REm~Kik4`KhEz(lTahCHHQ!_nkK|-?k(O^! z8=jGPTOy)|xfi$ML2rD!Eh8D=ikaw^rh zs8r>md99Jv3?gGqWh!NsIZ6pGN->qIuH{ayQ87x9gNw9sr)q^u)yki$HAbplKU$-t zq#G+*sWMeVG)<4Cg-X?GH*ILwiZ)bPp%%wfrD9d(gjIB`X`ys=U)Zj25krR=s)>85 zor1^6EWtg=rbSM~mZssI7HeG8if5Wux^%6yX*%8-zG>-Q7q!82kyh=CH11g>xo45e zJxf$Hm$ahky2QafOH}Sz+UlvcX?nD2sWbOz^_o7+v`i-Fw#-2v%G}v=jeyx@F4eQE z!^=vG^JODP4VBDqi5e=4fu|}#qK2w<5oOVy!}M@clpvg}6bqIQ)O0L*e96M_m&o8L zg$$mux)5Ha=%}Gm*uXA@4g6*G;i=p8a8h`}T{gcZDniRILd!2g!#6_5R|_AZ;TfUf z8KL15q2U*y;T56drKhjuAEDtFq2XoG!|8bI<=6Ak@U>{^TeSQvT0Rynod_L2EkBEf zzp4yaqR@L1cSohgb(7DbQIe07M`vmFn0EH0cJ^f5uBH>I)mNleUy)jV*wZ4@kJj5) z_t(l3sg*BUiyy7~Yvqg7$``4XFH)e51AW zqqY2^wS1zrbfR?pwEUv=_SNi=^lJMKQ`<8#LT@k49@);`uKgq1wSQ!6yYO-C?8DmH zqf^`3BiqqWq=SAmeA|Ej`GEoGF1Jw^i_+NrnIQI4~0CdWl>A1sPkn}%Vbeiq?1!b`65wMYOYYrt5lU#s6HtX#)Y!b z)hP5LtkFK3JDttBBX-873Hyn8#l8bd=#THIuA>Z>fc z8bm9sw78(K^2NNYsH!5odaelr9ePwRA)8BeNmUWq&2uXjRmo@RV(GuIw1)f_Vi;CV zFGZ!rCDjz5yi_JY^$}r-lVS)@DTeTrY>cNALwHKDfTt7_cuKK=rxXi#O0j^a6e|&y zSXHc9RE5uCNmj*zC0R=^R!c8dOD|SSFIG!0R!c8-m|H;wXgjI#qM8CUZ(+p} z)$Vo2qN0V>r4{847oWb>k`$N`mZ3x4OO{rapt31-_oDK`{Dmdj`vS+iTI)m8 zy^9x>mX#GPsA$c=$KlkPg$%Y3qYs4D${~YEC#PU)&a*WHNbB*@oQkW8@=+&J6LQTj zuc$_mOEnP^o7T%wN3#oNJ5`WFZ?Ys=L`s&5b&RFg!b;TH?6RVT3ujBhn=Kt2YF30L zIo(iLQC@6FTT~@E4lY`Ys~tY<8l@#`^`=rvge6IKNO;PQ1y7ZtB8Eo06fLN%Ub?WT zTCMQp=q`GpsHR;B8(Gih{Hm&oC5tNE$t7gNZrbm@dtGgWQ@7?gk`mxiWH(VILNT7N206-LlWNZ|En2n-%Y@==Wq0{FZ z8ZUq6);+L)LS`YI>mft2v*eH2F;DEq6PU-wm)rA;s>(5^Wk^lWu(J4qrB!7t5fwY1 z#h2w*m$L~7FJvr%xgv!JvlGU6xX}IcE7(-gh}8s!IWGZ~Er=zeqk@Sw9CK1m8g^l) zWLaU}o|FS~{KO2HSrf;@v?h@|hHEh89tgsV4^PExHDey}dGQUFO1(3Um0KH z_|?YmLa2Jo!!hO?e=2@!{Ep$3@sGv75x)z+L-G3n-^O2zzchSJ{L$fJ_^jcc@n6Ni z5dQ*VU6yGN9$^~($f$M0_r?$Ud4CDmi<}-MG5h0)uWtT#`@j(g@oP|j$u)^Ae({Jk z@r&s?{xf4|3=J940jGaV&08@@fSzbjacmXy)c4)EATrv;v8!Drhg;m zA*Fh!U*(9lzq%1$$+Dsr@XSQnGi8l@1$-}RSgt^Rrzsvi;rfCG^&=MJ4LHF>Dya2? zGBu=vC)F451jdLzqE4nkAt^RWp_XIBxx~W6#*ulWcc+{lKW5^*v6&;br+&jkqJ`*X z)ZC;snAyd5jGh0rY)teAcoTFUO7o#zLZ|gmiP$3nyQgkfpDl-4?JW)P2Xyq;vJrj& z`qQ8C-6ox`G4!C>Y_vY&l*zPZ4_&e=f7^O#ldYd`ksm&erH-2Z!cjI@;fb9%t z8q&S=cG2yfJ==$qWup3N9KW}{pG*VzJLmUP+R-^)XZZX(yLW_tM|ITNX04^c8o1iN zj`mdTtsz?9oO!j?_2%9vpP%yA9)Gescu%yKXUz;8csxW9nkI1)viBVIvv*CwI$T^)1TLd_`l`S(un>M z@XugPdVrLrBu}OM9DhdF4P<)IFJu_fM*#FE=_x^bw`u;=f9C-x9jE?A4b|4vbsI-| zh(mu4Jo3mk{v_!>lxAmt&iTo>n*4XfNkB}}kMP%)2gaY2ZccdWxJdW!$W;HF>0VDm ze>%cYnQxNz^f=B>2fogZ*L~OUN1jyIQrFSJ|b2%Ns@Iv+1{;%b7YyaEc zkG^b^fBN&90M|NPubdszjEcXWl5AtGoVr_Q&yLcQb*0r=XYqax_m1-ZDd|#sb(Ds5 z*ZPT{lHR{dSZ6wHkCRRty3R`eZN^F9WwJ|J*Z5qfQKP0L<553FVe$Yr)%|*=&f8Lt zqj*{zz3wR;`g8c_Nvp$<^aQsyc*0jNryifa7}CdfEgiO>%4g)K<3yS0>Bx5~o0GgE zw~qcg;^U6Ob>!xpANiAAh4F866u!NiY#WE3a2?q}X*;!{bH2{yZ=b%i-8qi4`#GXWV@LGNy;d4D)ox@W& zvODX%ly65kILEsoZd!mF#krn;XMVan;piwQ=%D5F_;)(%CuNy5K5U_{dph`Yq^pO! z4&Sz%(i717YN!59O{ZNS=;W`*)Sra2#9ijs8n2_Wv~MR$qvibgEsnI%maTssj}si_ zY!g&5T8z!(Z>cJr36kOMVhZ zO+HAOL}ftR>#|j+PaSu%>vY~eZ5fZ^5@>X-$7>%}x9j-oJno#f^pkXm^r-LZgjXmn ziI-OYGM*+|uNOzhq5V_GA>0Tdha)j z!9wY__1_G|F{3FGC?()`8U zop6-8@y6k8^#4xViM8q+&N#LoleBE?m@nGIxrs2&;q~!V8@Em@?eXa(SclF(XMf*e z2EVXl%f{9=($|F@G_8#TZiIrapE=^O;h)|pj_%(YM|WxaY~$Y@egxWItDlP7eONv1_U_L1&hqTc-8ruFJB9DG44vTE5q=%zd)>4hNQ~c3uh;ZP4*wg! z{M>p%N9EJ8aO{3**xoc{H0|2+O!8*<`GlqBKjDov|?^7EwFae6xb*YI&7 z+FGBZzs@*7>JQf=E;T>CcYhIq5mN_cgphb^KH6xkgW^?em&4xAp#Cw_Q`t8({Er z;op(Wx%HE*!oQ*p{vGqYo*e5~?}2>E zQ%fSp-st=3PhZ!T7W5Hhm%1XJjz4Y8Bjb@CNn!E;Hb;m~Uv!<50?2sn;!ryJpPsI6 zrzg>$a~Nko>7Uo$MU5l2Op+km>wj;bv0g*YGEw3IoM@jhnb&JK z^6%*Hnm8Oc0XO)k;xx5eTTc7?<5}IZ(Ugv72+Q;j!m|%c@DIc@6d%dD;q0{#gzqlK zww(6+PK+ZHZh?3D zq<08!&>0b%-ZrQ^SFdS>&0UUOS+wEWC%8xHaHh}Qq%-3=1Ae}j=o)tJ1 zrvjE}r~EC($$pz~4&P()G(3URC7JJDoF7T1J5OtA@ZHGMr8!!fW28A&n&YH-yEHST z`D?6*d&k}7tNtAb0PZ8xfHIz;a#hpXGI4SggoG-Z_ z=R%&q8IWgjmLtw!#EFZpIA_sIo~t+yC+guY`yO?(h z(rlDw6PXM&&N6$%0CzHR+ayebG;yyg-c8apOVdS~uF`aqrn@w|NVBUnJ*3%9nx4}1 zlBTybeWcl4nmwfHD@{K#fjgPAq**G>&C+a;=10wk_W}Nj93f3emawio zwWWbS0(cZ~0Pq^}>;`DZfnp`x-UYk|%s_oG1>p!V0E_?=zzlE!xB}b&?tm_Ut^f}J zQf8h2FMv0|2hbhR1Kko z`CDlomF9EOJSNTOrFmSMzmw(*(tJ^xC!~22_?%-eOY@X8Uy&ws9=N|M%`?(GCrx}u z4fnUCc|n?QOA}u>!To({ejv>crHM9#`}btxEMYQ1K`=o>FhNByK}Rq_Niac6FhNZ) zK~FG2Q7}PMFhNx?@kKsNP!>$k7EDkVOwbohZ)t+Y@D3`22|9xbN`vVq%`H@Rj#XE< zJR!|p(%d7>{nC71nlH(avQGF}=_1R^)e>EmE_O17#9T;hg~V1!428rBcRo;{MkYOuv7dZFd|?A$ASA#I;11{l=nC)vbOU$-ya3(+A3%3N z4}dSg51`33ob`%xr~z33DMHBfUDjn6cKa_WU)dPQeaL^d5?b6U z)a{*k)&f=o9z?&k9qA9%ll9*_Ey zOm-5bc^PmD@Cx8G;8nmGz-xfBfZqeo0nP*70$c#R4R{CeKHvkuhk%a&p8!4udJ;b#q3c|=fHzXcs0&4znkC99>+QD_p^GO#*QTw!6dy!5+XD{Id^uOXH^(OT1r*QiDKiDfc{rn0;9r9-ODsSN} z>@}QyF4$RU;co2rbmBRClTJKmZ{f7_p6qR$a^9O=q*Kn>2N-RHus`4o@~P}Yj5bQx zM;LKbvyY`j_za_t73>n5M?Ej~y9~W9LwhpxxD5R*LvPE_*E009>^A`PvJ8DJZgD!z z(7)pDrqc|4D?|G;v_C_y%Fw4W^r#H|DMN1xez1WbY~TkQ_`wE#uz??J;0GIczy=<$ zfd_2h0ULP01|G112W;R08+gD59F2Ozq=AS@c{1osR;1b}E0Fn&Z@?8^GTU z;O_?TcLVsl0sP$n{%!z&H-Ntzz~2qvZ^$aZalr2YF92QyoB*7}?9R)8Q-D_hrva}5 z&H&By4 z_`VT*-w3{M1m8D;?;FAQjo|x6@O>lrz7c%i2)=Iw-#3Eq8^QOD;QL1KeIxk35q#eW zzHbEIH-hgQ!S{{m?`WiV8B~B-1Hfj$7PxJP-$Qur06YwM0`^^iJ%IfH)C+jM5xm|2 zUT*|NG=jeyp)FhnMO+3&Tn0s421PW2-y6a2jpzd#!0(NqhDPvvBlx`$ePAPay%D_L z2wulrTFYfIwuNS+0x*NrfO`k1XY2(aDG&&V2E+hj0oj1*fE>UKKrUb=U>0CDAPa{;MjEDw5F9`v$2=w*4(%krR?zBuZGR{%(V#7uOW$quZHg0r^AblM-OqJn>OTYOYe3-nsX@tC$X(ZjsgnOoHaUW9(Uypm3()mW* zyEKNhdE6=W0DhDBgSb^G3%4pgj?|yP9Z9*kAL$v~40RayAg}{-Q_a z{Y8)QA4P9oPa}AK3iDz`{1wu|`I|H@=jSmN-@@Ob@i%`5^BNEHcWD&P-=|SHzeu;* z@DEVGugbBJf)SA)W*YtR>w=qo0x^qtE6yzKi{DVVQ|%jN?FY!(r~9hL;&!ib7|r|O z7ODvtGf_)~pd}U{)pGodXpc(V7Dl5hftIPljbYWeL9IWu&c(PnsD>?vxdOkg7<;Y6 ztvajl3ubp>9Oi+WaJFH_^FiFBx zQ_r9zui@7fEq@l+pTkW#CiXFY18{H7A5p$WjOYAucU2SSQE5~c1iJVK-ib191!a7X z^Id72=ZPE5{Fn)Mn)PIZcmQrTi^9!jfvme6`Ssxact6Z7hl2b1;0Ck)xbKo~G3&!` z;}N*+HIm1%o}e6zI&n8y3Uk9fWU0(sju+kec%I2Z<*0Fh95pJqX>2+R!);?Ztcx5$ zddLx^2PiV18Ra^4wsEkds5tKqwbuK{lBaidrlP~8T&Y{ZRXUFF!+mEVJV#kzp5?}a<=6GM)h zF;}ecEx1?AKva%;co27rb;o^T+mQ~9Vojj>M^Hu^?h@m2L>mO^e-iIc@uy(!=DSgo zG`j7^_u^i$?sS(JR-z8zE-`O#$0Y5+js}>!F->;kGwAOi+IPZJj(kA{s*M_A^#9{`w>Rf3UMau4bJ=wHFJqy zLdZYzKcapbG1^v$SKCx`aG?>o zD|q@lywkYc6*rT8kCcDpKLT4jx1$s^M)$-WWsrxsr;M|Ha=add`^pp+i95>-n2|FI zy4}hoOl%l#FLPl7aDSN_>xMhb+*vH{G3&zmU}WDF>2wp_m^a4vp3EP2nsrBNJ%k_J z14IDQ=_Pu>mqz?F+unyoK(gerTjYFTAl5l&;hkm$1F_xuYO?0{xc%!KejGT0ws5cEJ9vMWy@&Vr z@#E|wer~v;ObAM;UOQceX+ITa)2R1Ybqydj|mvRfdPMu6r>61huBN>Sc&Aw`4=H^FFT`z!UD1=3!d;a?Bz=UGKHa4B@oaQbM`o#=}!^rx`ph<&?LSQ{APU@{zN79MTGRBIEYM*AbFt_IgX1o>a}h2i zt-__WQm`w)11==9e5A}$uuH%TF5Zw?3ib==GHaleSzc0RVef?)$NJ0lj37bl89`Et z`3qXr=qX5w`AaF*Q%W&^DaCq9DdsPwSWhX%{G}A@*+z=dYDb7%?Ff+)%_1e*P$|(O zq(qB!l48T86dMHn)f3t*7*{nR2dt1?iaZhif;J$nGV07-EPzb_rXCfuUx zf*%rq=?Sh6g5F_)jyj5u5gyPeeDm|ms`=RhGBfG0em=FZykY^*or}vA_#8U$o|n+| zUA$bH)zVxh&01-0kY=4Uw@Pz|G#@Kpw4jRbs;DX~=NBqr;rnnW!d!l6;i5SU`O$^A zdV{}EP3}bD4Ad{rsTYFIsmEL~$_%9GzH2;1t!fu>>JywK{i(Mne`SYer`zpeho*qF zOFZq6y?CNmlJ4l`RQFG{a2vGeI`yfngTIT6r>5)4Lzz4;Uj)#3`67YN%NMigynInh z=jDr?bY8wVP3Psy8*(``MdXP7f=sM`!o>O~Oss9f#M&uLtV6;yOH*Q`mJ>Y=xnpG& zCe~eHO8lYM(mSonbGdfUocYnhm z!zhE*P-0kN*kagaI3~U_ydka{E-4;{Z;dX--b#?sqC^-|l~iN4GSyh7lo)G`+l+ga zWyTkb7ffH8g=wQH*Hmx(+<3)QW$I!IGDVq=nZ}r~(u^As=p=TI{1w!p5hceQFZ5#d z=1*?+hZ~vcFk?W&+-yO4xH+KZJD4FEd=Hw*#otWDisn~VDmLv+1i2#8IoggO{aDfq2XvlWtMK0@@0Nto^NW;-s z2{#wxH*LbrK`nf1`nHYR1h`!?l8)#opK%o2-Y~t<#%&PXju}xdr*H{y+hy9-#;rfx zwivfM+=OX`3FR_4mtB}jj8$;cd4q5kCacK`xA&Y%D@>z|S#Ueq#%&O&g=!cj2dHuV zjS+Brtc{z&WPsZiXE$S$(Hm|noZOI#A(aWmWH{qUkKC|ZPJClH-o_1O6Q3FmwsDJt z+c{%>8@CX+9W|hRk&nbr>@;9>t9;{>uMnFIi{bWp8@FYKd2qYf#%-=)7TmA{#gQI2 z_6LTj8G6E<^57y7p$@B0-3?-%8&EU!)ZGl15pEUS@zmWE;Hn$|Y;(9F26{fBlqhu$ zH?HKs75$l#=j2AEs009WJw528Tseil4o}_9Pz^UoPkK7skd6`zH|O*O+=7tvCIx(^ zg+yB@Xidcp<+D4veyvo&1!GoamH67p{UTv1Ag7gaxFxwYm19a1QW=Bxk#COF>lNC` z`v~0So93=4A<96-0-tS2DG>We^pq6EP4QHG;j;{JYBe3ACqfC9BIQ5z3R7{9`ZVer z9J1qa62vTTn`&?0^s1Z=qeZ z2!p-JSX1Z9763RKlp&Pe%0Za-kQ@5DrL2|*V|JI`ImWX8kGAUpi23~g&*$^GyRN#f z|EVOYkR&0gBzM=9BuSDaNs=Vi%%3!CcUS(*znQOLn6F`GW@ct)W;F9P^EET`H8Znj zgw`6NwdC&idOn{kMR8~SJ`Z=@-RJYX-_QGbp7-I?B2e3-E7v4iz z6&r~6FgA+qjrVX?4V)p7K!zT{pFQ6Eq;W(!<7{zyhWJbTx!#8mW&9=X?f|VZ3s$PB z(9r$`ovi76dFWxV2Ei7z1De!sSbFwAmpV+JcuM{BjB_h3`uVB?|VhF*~OX-uW@qTeCr0S;rNWdk6o&`QB~bQM0QT@ z-oAeR0YM?5;Sqx(6)JU1Y+QUoVp4KSYTCH;jLfX;oZP(p83i+E&6!(RG`|>>;%jSQ zF(Pz0%YGrKLQj`p0m`f*tH~OiN539+txaSz*#g?^An%f0@Q~~wd&xesA7|PhB!@^D zIZ6;;1}pm4ux_1#MtTl*tPA8aZ>y?+Uit^QMQ)Qi%$o*A1fA5Hks;RK2{xzzXr(Rr11ui%KTCAg&aDR)} z^^54$TWh>5alLc=(Ej~a)=L+9fKpEQ-*X2D0^&F=?WJAVUGCt}XG?JDYik!RSoNiR z-M_5eHf>rO+%Gufz2IJpd%nB0i;EwgSp@7qb$s>JS68nN)`bPW+QYY}R$J0LY?0Rf z)ded*>omZvYgaTS?8DHo^*({Gxb--?CM@jD)$7B;wudd>zI(w3E=xU}mpX4*+H2Fh zOPxx!fK24?_1Ut#*M`-*4y^dkE1TZyykvc#qfc1BZL8OZuJ;Y}UhW&VXi@jx%YC-( zJ%Kg_`gC>-`}e;C`g+QwVOpt0)78D3y_1cl*r|i~;a}^^KH9u>`P$`&H*E?Ier;w6nS7M}PGcUf4xyVJt%4GW8}dUpcJ!1Vv)#CH>3mv<~J-E6dGeiBg82z z%y-xcXgxGSoNoosdBj(E>j@E4SsPotV4KeZ*ZB{r1y6Vt>;47CfE8y7yOTY|R&o|x z2$#ey;*M~4MQ)-Iq8CNGMc2gL#p&YZ;v?c(Ngqj=BtbGwvRtxT@`L2QMOTX~i?=Oy zSsb(Y$)Z-;T{>7=Al)Y2FRiv5U|DE+#InK4*2>Q+)+)&=+iITGGOG<%JFPymx@=Wt z-NAaWb*}Y#>pj*Ntgl(u%Q%^*EJT(d%aXk$+bBCCtFUpk8DcZvW}nR+c^`R!{7c(T zwqtCU*_PQ^*bT8;W_QNk$$pys3H$FHL=I|)c!y+%B@Ra&{&Ea(%yr!ESm`v#X|2;; z=Sj|GF5WKFUFN&2aM|hdk;@sEdmX$wq;x3lu&=`}u9mJbuJc_FxYoD@xXp9>#_hbD z!CmSe@1E>F*U%`=Sk>dt9<}~~{*(PT`2W_^t>^5X z$9mQVbO@LnaH5x2FI}%60xbgv2Nngs68Nvcw*wCb9t}Jh_;X-&Z-?Gqy%T#E_Fmij z)840gSNE<9vI=qv3Jg*OEe$#xRNJR-pP7C3^%eE)-8ZxE>b~FhllF`1x2E48!QR2i z!KJ}p^=JAk`oG-&^ALH+8#s61j)4^s?h%O*+K3M$?hXnX^!%W`gK8q9BR5696Zym7 zPJ{CX&m629ym9d7gMU>>6kQbq6^V*`#S+E4ivK7sE3K4{%I->~a-wpcQm0(1T&?_E zd0hEG<)ZRbjZtN&@>M$3D%F2fr&QmoZbdmnO^PavdNb;is3TFA)DpFg+F9+P?y2sl z4p%GHBh|CiU#kDBu8L-&oum6iM@7FFeIWXa=&xgJVw_{*V{|b~VphehkNM9Kt09p? z<_swwvUSLXA@_zf#EN2_VmroW$G#i;N$jcEOG9Nt9f!IPO&L0S=)R#}5B)RFI?gjL zG%h2qFm7qws<J@MgTpH0J>wJN*T#Pne{Q&F zc*yX`;UkBS9iBP--^0I6a7^$`h)XC+I5Wa#gwu$ABO*pbjnIzRJL2GolOw(xabZOH zi0g@+62~XLllVd6?Zmo~WTeGN`ADCU{v-R23?DgTfl+|0Gj^~@cVJ2E#l zcWv(1Q)N>fr@BuKm^ygs$f=X3zBsjH>e8v(@+5il^43k0PTM%`^0Wu}&iS45gYrZ3 zN9Rw-&&hu-e@?z8e@XuO{O$Ss^1sYKm47+^)^yA1LDNT1pD=y?^bOOuPXA>3Z_|HQ zKoP}?M)g(=*`Z7o>t%2k#Zv{>yw%s{nWrY(A`Ud|B z4UPYk=oMs*B+l{{n&qXWO?m_*qeulst#WGb%4lOU5@bdIZ1#SEvSXXIB0Vmwi8hi+ z;v;?LnoJ)wfTB;91XzI(5Y0Ue3-c@&<|qa!VV7h0V^MrG|pEjxQ^j!oqm6 zA0iG46q^d(d4C>(Lp3NL*=0X*Xz>&a1AfddkrH*5i{fHbZ2^{CiHNvzrRqwHCh|25 zX;uS^8lsqi!m=>pJxm4le-GJV zGiR7jU1hB#DzH<($f)QR#1_WWOBDVG7D}>|{MKRk(CFu&3O!fvVIZ1z902N>v3~t8f`1Ht~GgGN=5k zqZb=^=MAEfdQ3EV&A{}S%er3C{ z7E$TZJmZJXt}Gn+kvzYRrL>{S@pi8nIUx64{E%Y6U6f z0(O|v6l>ZP5)sjtE;~latO(FLbnE137wF@}R##WwtEmc!PX<-{n@B*X`g$Tt$;il1 z1$OS>;^Y!DC?LST-oyqAV}p)o_VquWSCFs8{d)H_5pd(`X(A}T2VuJ)l1rCn%`y=N zS6*0HZXy7oEop$Dl?V8AbnPCSnVA{e-POHofPx&92Xt_7so1lA{rcU%xj4AfuQX(q zw$u{wPzLPJYS0_BF~W$0Ep{gsn^JBNIiZa2?MrS6{I3UYwWywnV+#=?j;6e6k_`O`WmbX+{U zq#W}?x`ONzdAcK^%tOQ*<&1Cij`?S~OOPX46LV z?_5L#iO@C|{B%46=4Q=0c~Xfnw9`mCte|$bJQHt*mFR3<>v&lD~W}ZgY(Bb_WpjCv69<}8N-C>6Wajs zWZCL5Ks;@oupEhn{?m{|+INZczeZtDGZ|Y1`cI+s_Z~RFL&tR=^- zq=KNhi|n)-cYW6`fB!I_05^#+1{VXKqmR|EUw=J(ct0QezyE&erR<1jfd810YHh#Qy8|=M>~CNuORlo&lF8S>YLJvH%!Zh(uO_Ba=lUIuB4pNzZ_Y_2R>a4}E?4 za!$_WuNFT8LHJQad8WmM3k3zwfPf&;m`?_wCy?9c;VK->Z`WRpZN!JjY7I%zl3l`x z?c8EMYt#?#(3qSV6YH5zn{C@9|Z$(SX8H14;`}QlqBb3?e*K9JR2aek_nW zzD{>gNr4O;-KQ(aFIxTw4Kx-lFOV-1;CkU6rp#3dSNL5vBQ2%bZH+_5cqe9RQ_G18 z(i@8~Bw-o$+TpcBC)9`dV6ljw&%^<`kAMzSST11H`mZ^)!mp5U2(>b?)pOIdEVfpJvar#eNs@bdfdT$VL_mO(64)+5ok* zTFjq18uI_R*$J>;ftpBHMK{$Qr-~(bkB$^Ww0MUsYX-0_?rOxFTC<#9o;@WaZCq~7 zRLcg*;Mma_Srf-n)%qh;|8cXbp3Fss77V3yNcOh}^83jS=^S+redSN*&!3Osb?Y@S zLafCwTg2p||5t0pdc8|vT5%MD9B5g?6;B-zs+ENL`*?dw^@7GorFNstC4tOka@{iH zP<%27VQlyShBlU`s4KaJEjH&3HS`k(<$0}+xN1qImTVSya13o>WTZNm+N4%6k&#ix zK3LXf4J|m!!|DXs=yMTA$0eNsOnN%rb_#P9G6AU6VwP~}>Ch(mX`&OvNPgTvBBusy z#w8tYVg8$5c-FeI@|M$p@XE@WGiQbh{U|)&5}#)EK*o_;G|K19`Sa1d+0~C+MVv}0 zqfsi5=cWocHChh3QMxI}HVcpS;o&P+dV276X-K$Mr(lY;Fl#FG3$^%fly(u9Zy^Dy zFt>A>Xe19fP8Q;S8Np3V9B$mF;js@uz3dCj5XgV1zKl73T#Yyx;np$`XrYk=c&G#q z8EX#~uzBQmZc}h*go2!9iy(C2Nnpl5q-j!W1d7oatmP#B!xObC%r06I+5p~?evL@* zn5$6>Ij*AEl7;f{nxFS<+xF>ahrh3{ufM#Tx1tDj@~CL-AAAj@c+IQgK$dJB4Dntuyf(q6;b)Gy^8z~@+XKEqj z4JMAT$n+nPo0~hLf3WCF*l)fRwUA>FDVN)1lM#zV1lAcPl~Y9XdXevSDnk-9;S|wA zD#0koZejNF_Jaw3^izwqTm8pP7F-6`OtZrwb9CFD&5~i%N2$K=0rRgk63Oc$%>vFjo7%G!Xfk3=ZVxj+3LGvIFtIejzh^obcqfV3 zkTL*C^22M~P?K9FxKvCZo&4#aS9lp6Mf_+OgsEN=FRQQ$oWniLJ^8$^- zGn2!f^2?UEn2Sg8LyFip>k+d?=A-1Gu0M0f>9&V>$eZEuPe-o2C3V`c`-7t8&zj|2lL~7E}%d*ktX|x?A`f6A3ske1je1Fb6Jf=K|*qE zoy96xyo#9%m(1ug9zOJb2qf3g>;=s}?<5t*&sq3g%OxaC&5OYvfmdO^q-6#CzIjuJ zCs5NWid+>lG{*nl*|TTw`QtAYR3wdpEYU7-X}JCCxvxIiwS!(H30Lx{5dFEGF@~A2 zq$Ts#G&nqsax|3gBIKpNm04+*a(cej#EG^8s{>Hg; z=W47vMx{Z%2EY|soqa$+KyWWergw?NQhEm}Em2XCi)gH;rN_CE@^@D+)@U>jrCv$h zQNIk6dzjG&D-iadZ7!8Fo2aOMNJX|dp+c~KY~Ma-4rtaI8Oa>&0x6~9r<=Fz*imZv zG#btTBn1f71Gc_jg^qg$ki2Mb7F;UnJ`*@@mntSsNy^D$R%CKxo0P()HN!$Ca|jum zE|aOKeGDb-nXu6Sg%*0FiA3P>pfayW73^W>q{5z+@5yT}$!H?7z@CIR<-fj$l6sEgzFbTw!e5tSIQD5belHZuaO%^yN0KmU9@8 zl&>bG)FXvbDvkE~W8a3g>o>lpG`wh-XT9;{AFM&&z=|3!exf!M3M!uACHW`kAM}V+ zr==tgjSTK2F$kI@m3bB9HKy}q1^MCs16@HcY*(E3v@c~PpzOZ5gd`e$xe^sW}KTkj~3XRjbv*VpTCPe{Vrg(jZL4EdGD=LK{&9?bR*98cF+w z`P5#CCHfDGF{4KOKMa0}(LmU4lR&`yGhqIxKSG@J|A2oBZqjaz;Q7sRv_Va_LtvOo zS2+3Xmx{)8x(^#x_uLS%c+e26oJX)>dT;;@J9Q{-B@jJU%} z1k}CDmpvKmt!b3GxP6V>>>;*Yl5$UZx(Gf4~$e0WNQ0_QZT)-2TO;A?&5 zFVau%Z(uGBeF@CvQz?3D~r@QkYF` zwR=cc69&$s4W*`or!|zHPp>tHY4Z@~vkfeH%VxJ_CNK%JP0cZDYm|AnWU`aS4pT)A zj*lDuM|q`BK$t2fdQjK^8YBHSd4tBbnlS|BV94Z&!MjE+RImh`Uxw<9mH_H4m54-Y z^;0GUum77wi^i4eP;8_Bp4z=U13KI-FE78_AwW3^`)(#F1A0Q8rT=j~1-7JC2zxfh zB-`_$&$X&%mucfium@a6;{|&F^{Mlb28Ws0^ECG0284vwaL)=F4pNYkr?!kn_O(Wz zo~T2^RI&;k*ESuk83qV55M9TEqybjmo~~fgq6!d*UQLitHKkf z$!Xku8FyFU?!#JAA>2uOEsA`JtPg7$oEX^JBVsG0Ba;*v8t}oYAnTHBNy`5aIE64)J7pG@uPDBzxTUHjGFfKcH%7k%aRglWRYO8Urm@%y% zZasJe3g#`MZKw+$Aq&xl9K`w_XEGtqA15Lzjl=b8l*qd_#WV_cM}fRUF)x{xkMRM& zO^@>ZNk=)xUJfEi)u>mfe=oPOZ%DX;oM8*^qMdY{ig=M-r$qeA?uR0~Kxa>5q>~X- zY;kM}79pEWK!qn>r9D&A!05Q24jtd7FuWjnwS42+GhX>hm?zh`B8`TJb58}elkMHR zYw>qMl7ov&Ut72Ckit;Ny=ku+rbYmcpxJC?^GT9cD`OMO0KSx~X^)iaNr}*b%$6{jx zJ!Nv@f+ChKbOUgJ_AMk^F!5gd^pIk8ZSVw>Er^Hn_Mm zKbDoL)dBAOw&HR9{`V>~lRvJ-Pi5*g$wEFs=i)S3q@3__=REm zUm3VI7Qj@$z-Dqk_RfPl9&T>7%>QTOOxnrY4h`qWAcKYzr^(}ns};(G_z{0zsp=Xy zP#rsD@W3#-*Y_Q=!CKXWxp5;uKS>qj>Z(F;=SEV(jcZ2&{KGB7?L`Ul7AV0kyPB&Y zWn%ws-tE}JMp?5RP~}JK2Ncs46?qDBlnwCnjbb{H_sDH#QhTz$#&{!MvHs_*o5!2_ z8;lm1{}(zp-)Y@mw5EP+g<&4^-Dm}QpY7mi8$~`r>igfA9{(@YrrLcwQTs9-B@g#L zjfAsyI_$s~adfyXV~f>@I8c6Uy>DM zS0@(-d3cbwo3o2g7vE!_d{NKYxpnezvXjr4U(k*-+T6gd_G;^9wAD%^nm_;8v51Iv zY)_L4+YW)doKh1M1NsFk2dl39?-$oDfddAH z_YDl7+sD?E745lfwPIUome!%&dg=n&B)j(Wk?q^JAN=<0FEuq+Rfd5mO3SV1>%+6M zvO1pMsx*u=^q1eQ`{PQG;p1&@tlhZ2Zf21h0U>V-W(zj2?p}!%C+`-1Zq0^m=iNt8 z@B2EZ25Y&aZ_tqVQAtTx&Ru&D9Q?)`lD^Zcn(PG76AhY^Kac80{M z_*jyi;<=HoPEuGm;6b(-A7K0K=T|FFpFHyARjW7!(P*u$^>z0x+_)xGudqA zdgmav@PB+mK46}TenB>KMG+(unCc(s8y@IHoJg-Xl(4H-0Vm`d5zPtIpI)poWYHp8 z_PxG)fr4x@LZenXJAWUW2jqc$kH9g{Wo`N7zJGcYYNc6MzqFj=Z~Munthu8|D(aV5 zkiY)cF{igh8;T8iG|>i1F?*7Xh!RLaR zfD)4%EJz5n#YXwm5&OhU1Kp%bnGB3?aRy*9b#;8Cys4ciq^mG>s0eMEK-=WuWv_E| z4hkQnP^narfw8_7Wo2d8dn6UA;ZP8^|818}FDu)&Een~KF&qtgy@=C^A2eXx8;5#9 zcm4NB#3Bs!#i#Xwhzi`KVOFhL$hYTt!14C*l3<0;&pGn_U7@5Zx5fi*)cRU zG|0!}zesm`)?@v1i4czOJr8-w-jY$4{Rh42gI_i8=Bwak{4n z=6Je!b0e$Lf1<($=Pbhn_6Utu*vM_HV)r&h$I{3O;-o;1GvnU1Two)yvWkl{v*p}{ zs+2F`%-T z)YR1J#8v0O{>~WL9}-(cG36QK&+m3Kn@Pq8LXQU#>G_ zO>Mo(4DHw!c587aVT zCos1cw$fgBJL;`qmtUKzAYXLo+1+PE^ngJBo}nROKb|^o>)JK2Z=W7reN-^gzD5?9M?!NI zc{30fIF%TfYcWFwSz-!4F_o3P1Iau@joFh-?_{2ClPPpzx0YG`XWX%6CN#RDOMZLP zcC>l0c#YW%!tyO!1Xyip#wLPiYHCW_)O^jwCyTb7?h!E&xWL1NeIlllSr}8){%c=6 zBRsHY_mIe8stDQTi$Q@2g|SeD)?vERV+gk6|9VowA=8Rp zR3Zdj`6}Mm)-kBE|=)UP65He zRfs3!)1I;_@}WvlDx}Mg-nc`84<8N|q^D2{qoShXm-1?%1NTr!nG{){l8FysIRYwZ-5dp9Y-A}1ed?NWBc~9GN@PM z(-H$cO_9Oa=~T_)Y;EgRQQ%H|ZayaW3f(ufZ5#afMWT{*TaH%gOqNWA)=^)eC}ogy zLj$ivigHra0Z`FtEbLnGbM1okV_w_+M2KJvJKW!P=C_)-RYU-df8$WAE zu~tKlMjKu*3^Eu)=jE>)y?WmJW(5*Slz+748;25R#tdUT99>JSeSNdDp9PMXDpjV# zq8dPB)SMNf=AH#)Q;?U*EtEIy4A9UWg8be$#&fq$7!8O#eD(}P=fD{EFj98rj66s_ zLQa@N+Q#{3%%USftF?gKm=W>O&(6*ECJ5Pwn$YBOYJn)fp1GoyCubRoq;~{4_EW>A z_6hb;d_vY*P7dzcyKBO*Vak5Z@M}vBG2$z0qSxbjhG^Wpd3lDK!F6vVG4F0q&)r7Y zLr{NvW*iDeeOghK)va5%8q>ngpL6RLA8m=zuuiK{!y!q_$7H*faqXhzC^p9RZ(wUr z8}m(b$Tv+|t)a2|g>}jUbsz{e7BjUBA%|C)Rb+?ZJpBatJG3i=Q5cT9Ed2ZelV%tC z`3bAo9(GRKkG0s|W31y@M=~Ohsg*@Z_TsQ?qm_k5fm*n`d#R`7xx1@)*0KegbsvuL z76=I0ojhqvPo3iVDs%d@l5W}6U_&I#AEXDQm2<{Eeg*f59qjCeW=|Uix$zjvM(E`4 z^X8-TIIijxIgR8%)SSAR&MA>pB8kX|hhRyKxpb2y&6T_t>D_4RZ{0w9K{=qnu>5yzExZU-<3k|6VTT=TSMqS_-tv~Y zlB5aGLR_2XDfgbX$TVwr5#YNx-P^Zuqi*3A0LJnd_bl-3RxVh!N-wIfyi&=s@;^41 zhJrAk*8qnno^p*c{e0xEbc z&39vF8=G4Q&4I|bQ?PZhuysXYbLIl_7ch@>z_ zwgF3Kzg&q>{K^i=iSdOqGRKTco;V?ky=MqjCX5-EmXr`rrHX@Ow`ue;(*S4|w$V6_ z(hcG4EVAeE8y&Ew!@x@a;e{ja$jR+^F{w`nVw~|K2VlN8o9=lW-TR zAls6m&B7uNSlHF(7sN++5_@|oX{i0vB;a)a*?apwyzpO{gQb|TX2G2OI84(yc8Hel z5NrmTiX;YDsSs$JpZyH=X4Pu-5^0^AXpv zS#(uPluQ}|P2;a)%P6Xr-D4JYD8GB6#q?RatQC=^!^7P}{{UNPEy$d7ZV5z`g#v{~ z;~R;KOG=7K1fCaIAL?*QD_Cc(14l9pe5QSZ5B^~#`X zv-)H)?UR)F$o_r$4j!Z^|Ndu}&H??yLW2VQRZy?ik!7YK&`K{fi!(9{BWRg~ZvVSs z+^Lz3kF7@D7_~Q(BX4HRfOPq^$Q!EDfPcWu^-M6a?+X7O3Hf;nV4iQ85o@t+TUl9_ zxv>^AW(ctsF|>V2MtyrbM%Y;#skR3ly&h!``IeL;jpcdTei-_Y6H2R-*4Im1JS_kE zi_jdaBMsw3ntzwuIT>}%WYqUCORzZ=3!?dxYp0Tcsn~LRV&W2%SoX@8>yy#(7xK$e1#+-zhur8WL}8 zJa(lH2}ng!XK(-B{X*%EzS7?V^P(a6(ee%i#FZ9Pha$&L5K+;z)t-v9nZ|@r)+1c* z|8Qjg?vMU+=E`3>5u>j=|CY*-jX<#J*6&}u?d0dzC#Z*?v)*WN(gHp^@|Ug(WGek< zXjsyv`Poq6DY4{PDIpdp0V=U_2N#6NbIE7SA&WzEvNQ&e2xDP0aB}r@ww8A5D65BO z>yOH-f$Dhp(0ctdTDiA+6wk{VNX0H#I9P6 z_tfv%r5@a){>)mVJ|kMR=g5f@T5&_=mxnIZ>0~#)zhLMtufI}W?=CjxmLCAz?9v9Z z|2uKu;K74)_^U8Y%hCgg;3d^a9{l}4+G%LEmYelr{wx|1vL2j(cc1b!r#S+!R?+Rd zZP#LbJ~{b3c}h)23oR)ET&Axu!X~2juBx!!0da$aJguy(?B&v=+yZLIX&abFtK z(5Y323k{9TQo=T{m%lDayt;Tip^wInhc;n>t4hEo^GcIn*6PX3oWxYvPk!|ZI72zh(d za}S~vF^GpKSq}e&O)a=Z{Vg_1CdMI&_>Q>vL=SIol_|?~0dYgoR6ST5s36{)) zOHceU!nJ7z*PJ=%+7i6EGm^)kyAo&4zGYQ7eWXkxku=m=c$qV(9>KtjA;$9rDnlA+ z;Mj}?CXYGS2l^8q9oVyfAMEb;|Nh(T5lF48M)>k(@SE-IGJ8xul8~u!2iHFtp*tR8 z*|`~(PdXjdG?ws4?>(M-$?l>3!K|?@SRC%Xhh@mPzVN)n%PTX}q{_qi5L3XNIkv}!TB*2~8@VlFZ%Ss-X9+H}x8cC1HQ3!wM zb22;39u+w#GLrv~Hml)V%d03R%`VrXg&V^N@^qEDl4m{r@isChB>KM;DnQq)%gmtnay7lf=?P8VON5{ zh*E_i*Jy?4LLuF#xKRa{0vj2Lh`qgJA-Y8aVoRl9%@w3Vuzv*NP6hcF(`AZ+{Mh;< z0*RX*6R6u4&l%5Kkw6w|6;=~jA9=Pvo^7P41*K@KPd}t()8qWepcqFX;zq-`GOlf4 zOji)n^q7D#vQi;cQd!@^R-p-WZ+e7>Gy+dFw;;=#NfxbE(j-aPwUi_tqQci}iF!56 zZO~m~oIxEZYVaEIS)3FG2_v&pFft~v*YStP8OH+Es+!-<1OzAy*=)U@#hBp~hw!Y1rfzC_?vdyMj~1Dm z*fY7vnD7umA#am_qCjV%bu-brGsf0YK2Bz0ej~?u^LsKd?cI&{z}H3Wii#p5+m4@& zja4!tMx;?NB1Ft;rO@+Q52h8OVv@CVxv!L;=L5}5crWpE*SligR%j<7; z?$gIzLkv0#1M#o=-yik@Re&+&ldBu!)^h1*dZg=W8i*rG7(O+xSS_pqcwH)bId5u0 z0z%hhG%ddevhsU0Ps%TxqiGX_t8f2aon7s@`#3o{+PDRh?uyzb9pn1rvW4_A;w+{R zkrPnh!8WAvEHuKOqZ`pIzppp$RFJor-m?|tdeb?dI0RTL*fIH3V8#(>*A(BTVKl~? zNaDj>!E_I%ysGL<*?&%-I)3cL$)KR{@EGjfEEXcg46_WgLmWsvjO^qHBhYsKmjMLzZG)(O{tuTgrV;a*FlyN7eC;!4B=CA2+If?&`Gs)rpgzj9J zMi(VKN>7@zyemt{C@joKKr|#jTY0Gg4+@Wxg*bLjLCQqZqrpXJ-9oL-c+#7OcSZ|+ zECD4kgU&b3pdk8rD4ji|#YuwX6{f>@1^HG(?=>C)DBet{EMc4par8->n(GzUul|0w zwx&8gee>pMY|dT{YOaJ#SSp@BN#%yq|1?n;lB=*W;}tGFFl?Rz8sIcUz=5RFH^2X- zg50Y9ThwB9g=+Un@f3lR8J}I!*iPZubmOza zCqLsStSy9Ha~h(+adFV*+*A^x)nF@vg7Fk2fC&6az$%><;vBYHT8_VgNFw! zjfW9vtuhQXetaO2DZv2YPGYghE zi2-?tIaEmZ(=5b!g&T3w>qcgeKpA0e7w**1<5_FSZo^fwnQX@B+e!Zm@y0$-JuC^! za>hz)YLL6J#RI!hCHCt!Jtoxe*c_7^pv@t}8CdGJfx)0|q5U~%FCsjZl;~XiuqnAQ z;H1k0)ds}Va=BCD;}JwASEz@m{qCGObLNg8{!-v8KwGTUS*Ow~d1zQbXIoK84CS(X z*@fIxD=bq2*pu(?dVlxs#yH*rz(ZDdCnxHEy2{L%9f!?(tMJ5rBfI(p&#l7Y6!bil ztMa@V&(BEe1cuis34i6`D?p`(I_q>=Ga+MU2&?`wCRUg$R9iuATHY*N5-@lI zlbtTXH3qoqh2A(eg1^=Su9}oHa{9uE=xqpUY3|i0v006Y*Cr zz5yf7M-(To{A9DrFb~IH&tlfCqtTtyxYBRsW2x$JKx<{` z)j4>GYEVy4c$T!HJJogG&qX09nAW>STBQDU*RGTln>U1|B$eA*g)Q%lLEj{a(U!Iu zkN+qqq_L7Xy_KG2K>e;q(fGYs$6vL687=`ZiE{V2#OI?hg39RcI!sjvwDiA58XFT6 z9vC)2;bJeY97jpfV zYAk4!7>h(BoXPKd)i|$(UsVk+iuV3aoRPd^5!q#22Y5U3oP!4u-C*rkhjsn>9huzE z4^!a`$aF?>@L+K7UP1AcNeTytXeIGMy?O_up<3yV9a}bkdhXZT4U0)qj1h)##L`UZ z&U5;ZQOU@ND$M#RXffmD1euSLlI9Bdoczmv<{adlel8^F*$K9^IQwP3Ag^Ts$G3rsE4zUJF_@Ng{L=CcEfCG^?5Ov2>pm74+%jf(=D@ zI?4F-E4bOEi@Up%_`yBBy?bZpPOdHi!^e(JpEmC$HCWVEu%&m2&T{1Ns6m4U_3Y&H z9i6%;?D?*6g#VWob}kvDwbK*n@B85-@5U|rcIl^EWc-ChkK~(QR4V_gTaIS z^^sd!$jZ{2|dhs(;!VBU(1>`$(KxpvtCWV|rWo+oJ~ zUKGoD7Q+?f$UoFc#-JvxkUOUoAd-LVq{z9B=vQIlyjl@~2t5 zjvr=w6PdpCn3uSzT}Hz!w!&@%I2~ijIh07q@})RBDTIE)x76MQn}fCliZMaZOO=*X z2_t?so|e{1YpUkY3n5?8eu57ipC8_ zQWH-D@|S42YbW~_7&CUrrU!SeI&|m|wQ-)^5QRmJmYK{-hY}fEUukV!=_-xozjgHppBtTHi>uHPV=(Wdt?0Jn29 z{i$qA^PR7PxcV~AW1Bl8O3+v=-m!|BR4}07wlGF1e0pd&DP=N2%OdtRXlXXqO<93FAFaEA*XRldeOs32CFD z9Jg=em7V6CHPd*v@NBB_lYP^(>^YK674B>*2vC85AJfJ)Nz;5yax`W%_IH=wx;1Oo zxPGk~^Bf-2cUoEpSAaU)-Me?|bzD8(;sBbKCEy6OED=77@Kf)XqtGH+v`lav#c`P= zkvnV^jVVPHfei1S`;v^lEYt-L#SNL@Z=fi)qq#j5CqfVu(H( z%1#AY1C>NWH1sz5-?(DJN^L2nYb}4pz|Mmi+jut<6oi`j+nd+kLfa{C!UL0!;vtM% z%Db5cXgk>8AaD~N{h^{P?Z(Qt{Q0s`T!kYx|IXK$ZAefp-IS9~_U02pXGR#?w6 z(nk&S5Ad}qkz*@UanbDDfWIrQV4W-%>d&C{J2*j@#HkBR>gXX@_ZPzd`8JKFL|Mb- zOjW7DMP)^ky1QB+?VzDsNLCTP0EkT(mr!e-3`Q9D&D&wqxA(Zrxi3R>D^NsvcvAe6 z2Qf9jVxQHI#4aM4x?fULm5dYP1pe&Q*pB3gR@))S<%`h{t%aVENF`zh6CC~}Tai!i zzA+=>;^M*`tQu~eKJy6oU}pN`P(zz;mgkRswq@nYmG7Rd^y-FhG$gK(r(n~ez*G1( zj!#b+)HBdeT*{k7Iy5pEp00(nM*G)ST=|6(R%r1gN?D_x3i4vg*anZ9kTvIJNCtVT z@BlA8#B6>l*`$O??*4ujBlbtuJu!tUs-#G(V=^*Yf^{e_CyxQ+IfF1yRK|HiY0U<7 zw$@oX287TAbNm1HR)OXH4?TSTyb3*io-B|yrkP8F4rDFU*YauR)G$>}7bJ1z7SXVva|@PHQ%9+2S?Pt)OeF@-0a;xo=NlNCmX
iCigEChmFks6z3b+9>i*r`a4%>qLLo>SflY0`(-cKbz@UPR)6-it=K% z2x2tVe7vyp#5fC$Ppxa@kOEzbjdY=_dJIVZ11ZPZ7zZfv(Lo79CqT?Bhgf`+l;QVV zd^wLz@`psv`}_OPq-w=oCY~=WM*b}<@V|VtWlITEsQAu0vHk&R+Tb=qzt?DnWVe%t z``c)*I37J38sqJ7AAV5Azu&O<;`wA}8iu=t%h97QUYT=X5?{xwUc1P0QSQjDWWH8o z4H^oQI5Q*02I3a7g~`s2SkXLRtj(hM-qQij_Oj?7ASJw7{Ui+XPkh8`;yeiy5)5NYJ>mBB2<&IBF z9Ru_2nl)?Iu6q4iK!ggD4nG16R#}ZzLZU*U7!cSyI3!4G8Pu_(R|Rr0Zr-&}7$+&H zOA?67q*!_m!|teA5$jt~zimjEJ$y{K?%cZP6{8*-Pf7?BIF!o}jA~)7{=G4X&|yY& zWS2XLM6^#x7;H-;5o2E(irw@F(GOH}rG=URb~CdHgfy+z>USsqh{%SYK0Q?4pp)M? zeag`3mY2<+*O_is_dz8ZptitjL?GF_OC9NV?^t69qUGW}d-k00kBN=RQIPGz2%x$4 zY`ZxE&%b}%yJrJ}k1sf-QqAS0jg_sVt5>gZ2%v-FG9lN$BMf@W45!P>b*iX=u!P9; zdS|~LL49EAx_$9|71%(YAzSp;`8qwLv;OPKng4vWd;gIi?z@aI1}BSVrYSs)(T-w3 z)*@4jAOlg^o7FFrVrO-e>$8}Tnp1Q)R8-{UB`N}4TvV{9tS4HrX+c^4C~7VhxJhlk3VZpHPz8rp;tj#0wB|>E z89CUF#Vf+h}Z{%<-KN;&f)mT@{U-|Xv(j|V!sN~Wm zlUjt72Ye)-WmT1_!6^LtGzYDqawBzKlvw3X>?f55_3Z58@)u5m;w2CGeeLX`c>C0G z@|t``jGbL*XfIFq+B;II1Y_ZpRzvdC5PgKj=xxg)#oY!@BocM@E8!P=EtCF|QQNY5 zL18Di#BV=2DFTkL6jBnk%Myh> zHfAhQ%}3K9tuPaf7(U|Fi8cNzjHX5(B;;QrDlGK!ddx0_5ra-EeZ)G{_?!_&lQ-j0 zm{dMB??ij}uWv zxh;F3N#iqO)#NLqIy;oh3@vl)n1URIffTO@>>4(`}_>YXKvfnT^GQM7u`FWESvK6}caW&c(hMjOJl7K?T7o!R}~ zp#w&oUjkgt$!YZ$I!k$%KEVTqq`{l4#7cG!&H;BIplUU0WX(BY>1hHr*46<|kORm4GhPyy8ch3@SFV}mg ztDtQGb74-%fd%na7@k8j_G>j*dIgHY(@WU=uL(`d^2oOdAK}|8kA6D>-!j&Ze%p5g z?p@#PTM7?43G){2Mk89nOMD-{t!(zKX;N~Je|V-{Hf^i7x1Fv7b|77TvuxL{goItY z%HF(~(5(VW3=#-OLmJp;?1H!1=STu{41&Y_3V!H;66@VN)S ztz%-M(!R2?QXcp6Q2cNRxAIwr@%ka~+r!KS{Z;|DtDjTpO9ttyp}V}H;u;I#OUE8r zVY&d;f{W~HocI5xlnU&POc^rYU}LI`{vp3CTej>{2u+V(&X?u#h^}@Pkfd#bbJB*- z@$`&C>o#CyQeT%aj=zE1W*an~JXpc?cduRk=HOckFJJ!kM)ke>nAp_TJ-8Acs}Ne) zx2kcr-40mB#~G#?UY2a!wf7gPl+{HGY5L%4n`xLWS+?n|T?f8AAxMsMDW0k@H=RS> z&xcQ3lF4Mg5fOnA@pbpyBVSZg(*Vj|m;?R&qoG=t!MVa4UM!yvWse++j|rj{PnkjH z)kP+9rS{BvwuEt583jnZty8w)>@CQiFo9Ne4W4dXr@4Z@C$9;!N(cDTbKmUSdF}5_mtV8SM3MJC1wwS4FzURly}Ky)Vi1%YSV%@ zHcC{5z>Ino_lwV*c?K7ouo(R#4;%F$TKEKYbwpYPCLV4tT8`lVL7??ELNqqP8vhnq z%T5Z!X#QF&VMTwjPJ`&qqQd++(a`%}g?02_i1k>dVei))gdR7pBs&^MYB->1rFJqa z4|n$fzbyLLYVgF5slp;io*F87YMJkl*FJ+5BzmZ;xu@4b7Bx~X4s}4GrkVI?S!*|0 zsTO_xDa<d>2`G=deSS@CJppj-6NZDIJya^M11r*T+-VWhE!vnMm(El)N6nt z*|%@Ur&kS@I=hnxFC#0wSJ=puh^VAn((Wm0Sn;T-{~XzERX8&}5sv;bV>4!}K`7&b zV4dx*9y1~-YifD|^3pG~vT&%ZuDAZ{a`gj7M}|=Q@a4uRB8N9FSPW037joOYy?w{0 zl^!ueF#Pvm*t`$o(8Q&Sm|^z97#33sVuA{vIyAFah%WdA%rB#nA<0I2?n9d{^^Z{Q zW{`I1pOBob#z+>{%tg#BBsE6fASw}BCiQ-B<;s=6{gY&}t@08%)uN;gH5Y#s4a$i3(OJP# zGp6{UGz9z9g`0{OQL zo6yEY2Hyt7{|ufOg@u>zH+DAc5?TujDXA{Me)j?50pZk@tXy=Q#&Yp82b)aZk1~wG z(mmSn5_^)2q$X5>D~|>|i(0O(;=6O_&S_!%h!Iu{OpBG^8?Q(UXFfk`R$hMwMUGJPab&8s|X?X`-_yr;yW0?P*yax3Rv2rYSpvB^+ zrX6UQEnnhuq}H14rS9*9Dd5y!-Am{xVO+J0hibHlQ|=_Wd-vY;M`f{%Twdq9ca>xt z*=8|6MD&<6wjX@&P5LWlHI>G$R-8Ro_x-+okj8Qh^SCcA)x*mV7XSn!ymDi#s!l1< zzd2fqeY<{WID5L{s&RfU0tT$VkFAdVbyFZcrc{__dmLX(@S|oBn3N_5Nq>3=_SJKK z&|l@VVCost*MIOJzd*MRVAmEb>)t2G(uUBT(b~$sqiF<`z?whA&_BsEG{j(N?8l%K zzFp3Z?pp<}Q>c;2EdqPfu!Y|)UHXj`s6}m)h<9Xs^AzNgIc$^Pz4tWMDU7FyfWfF# zyiL~{cE}==x$|vp)6TZ1f#PSWH6ST*NUb+)B`dUocRhGs z#9)}4D<1Q1&u5pBODN>H3vi{Z{HJ1^fXP3QNbvYlVr%CuTBp4xokwoY>U#Aeh2d7LtVRovwG{coxv z&nEMwfO~U){A8MIYq!7!u=-L-gtsn%F@wpK!D<6VGeqzfQ7)me)F0Rk+xls{zR4=c zNQf$u)zsW~3muXUU*T|HnUd+o_;EQoBnKQDTA3)mzvSWp8Vw~tohSO_(xrQB3C=0{ zeE&zA1=Mz9=e{s^=qe}b8|2Dh1|K9_t+IoeQwUP34~?D)f3qZf%SOFEJ39)e%=_#?E06l+OX3E#nc2$x21UfU!fPAaz`@=-eV>YGZEEIZ+68UF{LZ4QPndclJ@O z14kF}$&h(pA0@be`AUkpBFI4}zp!QF|0LKP7pO?ehf9x2O_!mKzE7<>7+f5S({q#*~ZNWsV z)9*zart$H`bm$~mzk00fzgU&aE2}-H8I!w>Zyoq!A27|+ED!+guV0MbxfuQwpY8x5YD&z-FIpR1x01=+^U^{+pngeyNm zpz2s)=F@Nvo~ex+-#gdfI~);L>BD^+e%lXE&iehoH8`uNqgv%$@~rb+1PIt0VU$Vu zPp4XZI?>|O`4*pUwfI!o;?uzvpAI*EqN6}#ZSCZO%ke?^eRnB_8ux-n`RCDwmy9DY z%aCpT*7>tP!~RgyK!O^r)1vt}8w@jp=OK*lOo>+3aQ$?ww-{6Q^YwjmqKy8(MQp6s z66CqJ+=oG?uWKL-a`Ysk6mzE<0&or)pSpmX7tnB0X_#+FG>(GSq{VSsVeAUO1-1Cp zXt5N2^KJ2)U5iiEEk3n;F0#dMjdv{epgBX9ui@IKgb z0P)YNd(5E=wK}J|pANs!o1 zo|C9(Pq^wYpM_{oT>aFeQ|jw+(v){kY!&M2AffKgU0hHQ3DRn8V!d72>hp-~{^D|V zb$zL{uB!afPiJ!y6OH4BYTAr@2d!;tLXdkcJo$PL@BRvpLwmJM-@YnXS#}~-PdZ|9 zdv?UG9Vfls#x-E@$i##I>2F7m9zAwkwtCktt>tcar<#jZQcKS08*^^Smn|=os^r|u zp}wKM%te1K=l_4rU3**;SH3?pnS=o0X~c*jDk4o0kw!$ts3C?(k)lP5FGMayE^AqQ zu}ZDFnc!MK)_PlS-L-0WS?W^D^}5uxYL&IfBDI!vks{?X@%*4mG zxBKs9$RzVR&)@vszu$32T#|5dGVMzk$C9*^QOZ_02mifCsWB!glxnqQQAXyHDVkw4 zn%7%~FgM;GPG{pFnvNvjpTS_A>+IouU=g$$ha)*LBO{LUJA%yV&Zi)cubU>zwJ;f~6YVEiMO?3CItM!*}x9c>w z>;F~?PwIDe96n!r0Z)E=rB!Y)804*$ID1;?yUWoT>d)FoUakv@#sE(r>3iVN1+*GA zewHPN4#8PEB_(AfX?8~l1fm|QcVB(SjPD}=&sg6EXHHRv`nt~& z7(q$jvuESz`e`W6eHJo+kYk=`kS?B_734LBC`lMCne!Sl<>e%}GYd)sW)bS&&2#%( zue9Fbx%6~n_nxQP!FF`w`XLw#_Dg5MX;arh(t*biacg_hI;LY1T!_%-N$z&|JoZjQ z>!eKhWTiOL(lx{dQkMPkeCj&j6+~joslU81u>?-kpIq zuh!Ff0sqZ0D^@-(GAvx+NY9N9HRwe^gm@YXGDaK0(qu@fO;Y zf+~ukjoyZEjtZzc&Oya039mT6HE?#Us`kVu2g}wjHv|oxV2$!{a&~1*%8LPwwg0$u zNl>sL{)aY-3zDe@kDU-678RMYk!F@Dkwn#Z1J^E_78M2SYA@g?Fg$Eb=&beB;JQ=s z#zNEdK^%E1^E91LCUu;h9hbVwEVQkdS%vv3=Do|yzayal#ZdBHxioX&R6LdNIbk_g z#>lvwq+tZ4;}BR4e3bk49V6LEZO6p<9E*|_+3igvdY}{0W^93JC2hoZneQaTCdqgA zR20WV@$#sc;)))CL7_OOsd&n(;sA+iD0N2FpUQ`thLye|ooP7oz*l}nX&SC<;p$7% z5Duth4<1~wfW}Yo3_kueYJ(oLIM31_PeG$iP^&^Aa+H5lY^NygLf2{+P73&)z9~P3 z+n8{$%6L2pUPI|1?PqGvv^gD=Pq%TeugqJCcs(19pATp-Bt(0X-V2}C zMn(()CFpDvpIwD#J(fm#<8O!`@8LIu{)$|h3biFq)_{#aCT$-=yZqtfqyNA)++ic@ z_&|+ja=y}WrJI|WlAaV($A*Q4nMLnt*MyksV_D1ubjnQ6p? z2Nib?A341Lz4y$nN!S)BOCLUaf+>9{jV<0d0=!=WiV(*$@4O?nnqn5jLCCVhY1kQ* z{!9U^J4JwF>h#qQZDOKp8ng2XFWa4($Sc6ymzo)PiTQ#<6?#YS zk8;-eJH@?pzX&yMZ7tXv|60;B~>Gc2+KUzyhn)P#T zyz$S+&(`)+M-lwv`hJ4ai{&xN?(*p@XnLym`EpKf@K|F=PuG`+DjM2uwl~kw_aHQU z6*T;XKEFHk`L&+m#?+OY3YXLMn&tZPlNZ|W+Zki1U2*?L{mF7Y#?$7f_~Gmaa8!J+ z6uW&j_Y~qRY)2iQUwrZM%k=X+(oFq@{DqOec|YBpjO66xS63F~Av5Frd9l#kD9r(t zP#=Hp3XUgG=6D3(KMr2)W-u<<5Z~`N;Ojfk?R0j#zl*$Es?UGX-qWk_i;frs9Vv}v zJ4kl<NA`1Zrv?fNY~Izz_3Y+KqqCY_Z-mm1Y1(CS<$LTR zxm%pZN)f~CL64YzpdAoY_cv!6r}0N*em(qOH~Y`=f#1G&b`mtVt~U;GWh@mq@$hW6aKuh%gcaM7L#Twu#WV94+uNO&_cF@)|YO zH2)3wT5x*96w?X|nC&`Pz3a$dWNS=DJ-A_}FqLOgQ+bG}7>2D7Odi|^3ub4!TP#3y zFS{1P+MUJ~)sgWVXFyz}P7|Rn?wae$@hWbPnv)z(p3t6QFa>%DbQ3@b z%vQzd@@HTi^XZ2T+6~i;g+chC2v_}RJ&Tmolna?V0trLBJc$1+riyu+F_A~G;awsK zCdBp~ex3E$kTzYdy!Azu1z`o-VW&P!K4w?YU}|LCWP;Sxe80olk6ve}j^1}(tFErT zF`$f1TS~bIYVE&HI+WTFw&ULTwCqiZWHaCp7Ab6d0dpm!80{_L`N17^U;9Pq!lR@0 zadCrX{cT;EXiHw96?SjYYD9(icZbf_>!+rqhLMW6xC%NUwcp(JA8&m@-u!7IqCj&1 zF`_gv6DqANMOjl*&7lJq?Vf!--3^z%Z*6a=m9WKJi~)1;Vmw5Lca@uBJHD#;$AgfN zc)X$KxL>(ytJ`@dDT!wRrIb$C6VQ(uNII3kb$gIc^!oYpS1;CeyW}R1b-Bo*Tl1G-n@Bp7tD8_|Hz8UpRU>uRp0rp@$<^6%Brejovv8a%TrB(%?DvD zoiab9CB0K~vc7@ms%pNhDWhS!;^h2_E5nH@)YnGrUfYyPtF^3b+B9P2H>)4ryV`K* zx5Xs~4je$}aO%8y6P*oZR?sbq>t7Mn(P_+qa-MtN&+q+hJlQ6W`6k-GL~1j~Or0QK zlgofzY#emm3F~RhI$d3OCpE<*U+gXA?Aa5>2m1{gG>EQwLbn4RYv#{OTl~TcnDATt zZ#-x_80JS+Z}E`%43BiVBGas3x9Mvu;LXQ=d6b8vPJFIS-bLH+_rYg1-*$C(Q8p^m zyW}jFoSd|0k6K+{Ut|-q!{G5xK`Xku@7rZJFLxcC;aVrY=*+$=f>qom+heu5bpYc~ zy65fNlPA;9(W9W-`qitEOTgqZGdEgHu2^oz_y{{>QUHhOHYoBAlj-QhQ!O^*h5nso zvRQFY&z)ktmeEjHoZ)4sr%yj^H^HFc1Y;9{aJm|?gfTz%I5SW$AOj+geSJ}83zHB1 zd<*bx3oPWEuk|cxhrooGg?16^h@1*wTB01_uMrdoe1$&+VxwZaV!ISoCWooY3m`=K zVI5lSb1!@$6zz+{@6P&lGD+sWn?G)zAUpru;^)rGCP=UisX-wpLaGXMApUeb1I$R? zXM(>sxt0qhQMvRjkM`{B_I<&@`$UL=L_uUR)#r_GnO(`Qt>lPu?c*E7`u}gt6q5 zdfKc>aa5JGm;9%EV_s&)FP^^5N4#zQiX~}D)2F!aV>V*;8hMpc>8}Oxo;V44)>qJA zBW&9B`LLwrod=ADz#j^GPF$u393#gtLse~UD#y*5ikiloj-fFT zj;@xbrj{;8P>_#Jqt}zh#=E*0OG=7Gao1oN6B0Pk+Zz}%Mi`M9=yAxE?vAg@O7?tE z{L!JR+nVqZftr~489A?JE=rvi&~d3qwN<0hFsJMvp84j=ea^kuuh*7yiuN;y54`)E zty@K?g{P`p`kujT0IjQFHt-mJacn1`CSG1#OkBT&1l5mVs(gI+l73lU9z<@^55Cef zs(+`!uyyN}AR&1a6!V3m>Oir?cR)^SfpeL7 zRDdHtZHSMPIDK{6;G3Vkz5D(5sIjC#U0Ty#`RUm{J;JreKc~F_qIOZ6Wu~k$Im%|k zo6$CyRdCLJ#F;+wjapQ&a9sF}zn+LSZlXlaCXe`mQz%$LEy=#_31%6@Q4a-5&agl##cj@7^vXfapV3Xk%0MJf$ zxxm>oyTE_$WM2~wWV`gQNjMI4IYj$Yb+A&M+`p)cUEYD0U?VX8Mwx%=`i_5H@smcO zx#HZ4qwbb@pFIL^NxYhxl1NZwYZ_G%!u2hkJFkvVpEtP{iSwkTvxX!0>2w>3;FZ9_ zwLzparb-%5v81%L*2o}|)P#}%4W*o+tFg;qf*L`9XNvPl1cFn!bl}%?fCd{OlvNc2 z1Y2t|No9rNHkovX?9?fvk=~h(gl`lN<2IhHtc;QF1ttMZMeyz@tA9S$<2u_*dd;L6 z!a_5fqr;3I2AZnlhX?lO{f4Q!?+&PjM@&u$8WW_7 z2oCV?`MkKexXKY2sL^UPdAYeSs+5g?D*jzOW@!_5j2-b3G%R*dj<>kgNm|u+^n4a) zFTSqzv@3OCqYw%=95kI*Jh*+WB_JZ$KFB+0i0TnygHMznKLET_)31v!m?<&QJAu`H zPk-z6qaYW*7^5Bi;234`>bg7bg)M~l*8G_A{~>z4zjhEjE&a96>&21&4t?OXAu1)q zYZ;}g|IC3eko;w+(KylY(y9%=E?j-MviYV@XmWuSL`tvSNTH|r>+*L)`*r=!(0$=era@=S2>d<*} zQ#0EtkJZ%QLO>D~4gNqjd%tRo-BVoA@coEMFT#es1!Ph3BcWK!zqPgL##a@kdtklZ z{b9vd?M(>+qu7Z&b)`%x6j5f_7Qt|q9{Bjk7Y&ztT!eW`fW}5TMuCp&--9JSNdBmP z%@Epm7*Tm;4Xu~DU_kc{@QqqR15)YsCt*h3_RIwhm@;~x=i**7O%~`X@cnJ&`I;uI zLE9(y^$HvwM*R|h$$iTBPuyUE%9w7u2=BR}a4t-qF(VMk2OHc=uWhhm5D!BlsS~#H zkiyh)UVS}1tViENN58W4<1TGXT26M>`~|s-tZ@j9vXO1!8|OrLwAP(F*L1z@fe+LI z+F`2BlRIoSTk*wS@5rgfxagR~jrdTREI@DE6oPI2HAF2*3V_F**SyV+Ew*MAF@^AIC zKEpyCa1>Au^bNq(rnlDt_;LTmFITZD{97S+G*Ed&*f)3q zgSTaotgJTUDNz?rId+>YJDX(l2t*M}6X}vW=1GY=coQ_A#3@0uc-^fpg%m-U3n0PA zDdHD<_4K)|(m8P5Qm=>!HzVT|_F{TXp-*_mt<{Cz9T{dN%1wEEX+>_3ifUd={3zC= z#(rV%|tR{|2ZM;It11+_a-Xm*Rp1(RCD=3vS zk+^4oS3J8y4rW=%+J|>l81F?xao1*c`J!kV$i0^wc`A2|*iu-d0{q2ST1XCy7f{A1 z&NiNm`pT=p2~yKC><=ZjOYe&JuNLQ*IS#zjTXF5qk%HjKe@PxGR>4S}k!m$WEt+pcZi65=fju8%er2wic!o?$%G$7D!}3h+V1@KFg=&*)O_7^_ zfD|IiX>{C3B0N;U5FIsCDhfSxrMgn;mMXM24udg>@^(Oz6um;u6<$CE*J diff --git a/website/static/assets/mono-LICENSE.txt b/website/static/assets/mono-LICENSE.txt new file mode 100644 index 00000000..670c6c04 --- /dev/null +++ b/website/static/assets/mono-LICENSE.txt @@ -0,0 +1,93 @@ +Copyright © 2017 IBM Corp. with Reserved Font Name "Plex" + +This Font Software is licensed under the SIL Open Font License, Version 1.1. + +This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/website/static/assets/mono.ttf b/website/static/assets/mono.ttf new file mode 100644 index 0000000000000000000000000000000000000000..02d682ca03457f91c604678b76aa42724c9f9489 GIT binary patch literal 128812 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%0A*>-nw;}`l_;!OuIWSL^<&bxoXr!)#}4d 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:color .2s} +.navigation>a:hover{color:var(--blue)} +.nav-actions{display:flex; +align-items:center; +gap:21px; +margin-left:21px} +.language-toggle{display:flex; +align-items:center; +gap:6px; +font-size:11px; +background:none; +padding:9px 0; +min-height:36px} +.globe{font-size:20px; +font-weight:400} +.github-nav svg{width:19px; +height:19px} +.button{display:inline-flex; +justify-content:center; +align-items:center; +gap:28px; +min-height:49px; +padding:0 23px; +border-radius:5px; +font-size:12px; +font-weight:700; +line-height:1.5; +transition:background .2s,transform .2s,box-shadow .2s} +.button>span:last-child[aria-hidden]{font-size:19px; +font-weight:400} +.button:hover{transform:translateY(-2px)} +.button-blue{background:var(--blue); +color:white; +box-shadow:0 3px 5px #365cf514} +.button-blue:hover{background:var(--blue-deep); +box-shadow:0 6px 18px #365cf52b} +.button-dark{background:var(--ink); +color:var(--white)} +.button-dark:hover{background:#28374f} +.button-small{min-height:38px; +padding:0 15px; +gap:16px; +font-size:11px} +.menu-toggle{display:none} +.hero{display:grid; +grid-template-columns:1fr 1.04fr; +min-height:742px; +align-items:center; +position:relative; +padding-block:68px 73px; +gap:10px} +.hero-content{position:relative; +z-index:2} +.hero-eyebrow{display:inline-flex; +align-items:center; +gap:9px; +padding:5px 10px; +border:1px solid #dce3ef; +border-radius:4px; +font-size:9px; +letter-spacing:1.1px; +margin-bottom:26px} +.eyebrow-arrow{margin-left:14px; +color:var(--muted); +font-size:15px} +.hero h1{font-size:clamp(56px,5.65vw,81px); +line-height:1.065; +letter-spacing:-4.8px; +font-weight:600} +.hero-description{font-size:15px; +line-height:1.9; +max-width:425px; +color:var(--muted); +margin-top:27px} +.hero-actions{display:flex; +align-items:center; +gap:26px; +margin-top:28px} +.text-link{display:inline-flex; +align-items:center; +gap:15px; +font-size:12px; +font-weight:600; +transition:color .2s} +.text-link:hover{color:var(--blue)} +.text-link>span:last-child[aria-hidden]{font-size:18px} +.install-command{display:flex; +align-items:center; +gap:12px; +width:fit-content; +max-width:100%; +margin-top:32px; +background:#f0f3f8; +border:1px solid #e3e8f0; +border-radius:5px; +padding:5px 7px 5px 15px; +min-height:42px} +.install-command code{font-family:var(--mono); +font-size:10px; +white-space:nowrap; +overflow-x:auto} +.prompt{font-family:var(--mono); +font-size:12px; +color:#7a8ba5} +.copy-button{width:30px; +height:30px; +flex-shrink:0; +display:flex; +align-items:center; +justify-content:center; +background:transparent; +border-radius:4px; +color:var(--muted)} +.copy-button svg{width:16px; +height:16px; +fill:none; +stroke:currentColor; +stroke-width:1.2} +.copy-button:hover{background:#e0e7f4; +color:var(--blue)} +.hero-footnote{display:flex; +align-items:center; +gap:7px; +color:#657185; +font-size:10px; +margin-top:13px} +.tiny-check{color:#577960} +.footnote-separator{margin-inline:5px; +color:#c0c7d1} +.hero-art{position:relative; +min-width:0; +height:590px; +margin-right:-25px; +isolation:isolate} +.art-grid{position:absolute; +inset:25px -10px 24px -20px; +z-index:-2; +background-image:linear-gradient(#dae2f24d 1px,transparent 1px),linear-gradient(90deg,#dae2f24d 1px,transparent 1px); +background-size:42px 42px; +mask-image:radial-gradient(ellipse at center,#000 20%,transparent 71%)} +.art-halo{position:absolute; +inset:30px 25px; +z-index:-1; +background:radial-gradient(ellipse,#e4ebff8c,transparent 65%)} +.artifact-image{width:105%; +max-width:none; +height:auto; +position:absolute; +top:14px; +left:-5%; +animation:artifact-arrive 1.1s cubic-bezier(.2,.7,.1,1) both} +.art-kicker{position:absolute; +top:14px; +left:36px; +display:flex; +gap:10px; +align-items:center; +font-family:var(--mono); +color:#7e8ba1; +font-size:8px; +letter-spacing:1.6px} +.crosshair{font-size:18px; +color:#94a3bb} +.artifact-badge{position:absolute; +right:34px; +bottom:79px; +display:flex; +align-items:center; +gap:12px; +padding:15px 18px; +background:rgba(255,255,255,.91); +border:1px solid #dde5f6; +border-radius:7px; +box-shadow:0 8px 32px #2e4c8f09; +transform:rotate(-5deg)} +.badge-cube{display:flex; +align-items:center; +justify-content:center; +background:#eef2ff; +color:var(--blue); +width:36px; +height:36px; +border-radius:5px; +font-size:29px} +.artifact-badge strong{font-size:12px; +font-weight:700; +display:block} +.artifact-badge div>span{font-size:10px; +color:#72809b; +display:block; +margin-top:4px} +.badge-check{background:#eef6f2; +border:1px solid #dcece4; +color:#4f8f79; +font-size:10px; +display:grid; +place-items:center; +width:18px; +height:18px; +border-radius:50%; +margin-left:15px} +.art-caption{position:absolute; +bottom:27px; +left:70px; +right:35px; +display:flex; +align-items:center; +gap:12px; +font-family:var(--mono); +font-size:8px; +letter-spacing:1.2px; +color:#6e7e95} +.caption-line{flex:1; +height:1px; +background:#dbe3f1; +max-width:150px} +.standards-bar{border-block:1px solid var(--line); +background:#f3f6fa} +.standards-inner{min-height:126px; +display:flex; +align-items:center; +justify-content:space-between; +gap:28px} +.standards-inner>.eyebrow{font-size:9px; +letter-spacing:1px; +max-width:150px; +color:var(--muted)} +.standard-brand{display:flex; +align-items:center; +gap:14px; +font-size:20px; +font-weight:700; +letter-spacing:-.6px; +color:#49546a; +transition:color .2s} +.standard-brand:hover{color:var(--blue)} +.standard-brand svg{width:33px; +height:33px; +fill:none; +stroke:currentColor; +stroke-width:1.4} +.standard-brand small{font-size:9px; +letter-spacing:0; +font-weight:400; +color:#657185; +display:block; +margin-top:6px} +.oci-wordmark{font-size:35px; +letter-spacing:-2px; +font-weight:800; +display:flex; +align-items:center; +gap:5px} +.oci-wordmark>span{font-size:24px; +transform:rotate(-90deg); +letter-spacing:0} +.standard-label{font-size:10px; +letter-spacing:0; +font-weight:600} +.section{padding-block:107px} +.section-heading{display:flex; +align-items:flex-end; +justify-content:space-between; +gap:45px; +margin-bottom:45px} +.section .eyebrow{color:var(--muted); +margin-bottom:18px} +h2{font-size:43px; +line-height:1.22; +letter-spacing:-1.9px; +font-weight:600} +.section-heading>p{max-width:378px; +font-size:13px; +line-height:1.9; +color:var(--muted); +margin-bottom:4px} +.feature-grid{display:grid; +grid-template-columns:repeat(3,1fr); +gap:22px} +.feature-card{background:white; +border:1px solid var(--line); +border-radius:8px; +padding:25px 26px 26px; +display:flex; +flex-direction:column; +transition:box-shadow .25s,border-color .25s} +.feature-card:hover{box-shadow:0 9px 28px #1f397008; +border-color:#c4d1ec} +.feature-card h3{font-size:17px; +font-weight:700; +letter-spacing:-.5px; +line-height:1.4} +.feature-card>p{font-size:12px; +line-height:1.95; +color:var(--muted); +margin-top:13px; +flex:1} +.inline-link{display:inline-flex; +align-items:center; +gap:16px; +font-size:11px; +font-weight:700; +line-height:1.7} +.inline-link:hover{color:var(--blue)} +.inline-link>span:last-child[aria-hidden]{font-size:17px} +.feature-card .inline-link{margin-top:25px} +.feature-visual{height:159px; +display:flex; +align-items:center; +justify-content:center; +position:relative; +margin-bottom:28px; +border-bottom:1px solid #f0f3f8; +padding-bottom:20px; +font-family:var(--mono); +font-size:9px} +.file-stack{display:flex; +flex-direction:column; +gap:6px; +transform:rotate(-4deg)} +.file-stack>span{display:flex; +align-items:center; +gap:8px; +padding:9px 10px; +background:#f7f9fc; +border:1px solid #e4e9f2; +border-radius:4px; +box-shadow:2px 3px 4px #142e6504} +.file-dot{width:6px; +height:7px; +border-radius:1px} +.blue-dot{background:#7f9af9} +.mint-dot{background:#7ea897} +.gray-dot{background:#a6b0c0} +.visual-arrow{font-family:var(--sans); +font-size:19px; +color:#a4b4d4; +margin-inline:18px} +.mini-artifact{display:grid; +place-items:center; +gap:6px; +background:#f0f4ff; +border:1px solid #dce5ff; +border-radius:7px; +padding:17px 18px; +transform:rotate(5deg); +color:#53698f; +font-size:8px} +.registry-node{width:48px; +height:52px; +border:1px solid #dce3ef; +background:#f7f9fc; +border-radius:5px; +display:grid; +place-items:center; +margin-top:-18px} +.registry-node svg{width:26px; +height:26px; +fill:none; +stroke:#8999b5; +stroke-width:1.2} +.registry-center{display:grid; +place-items:center; +width:62px; +height:67px; +background:#edf2ff; +border:1px solid #d4dfff; +border-radius:6px; +margin-top:-18px} +.dashed-connector{width:26px; +border-top:1px dashed #bbc9e5; +margin-top:-18px} +.registry-tag{position:absolute; +bottom:26px; +left:0; +right:0; +text-align:center; +font-size:8px; +color:#66758b} +.fetch-list{display:flex; +flex-direction:column; +gap:5px; +width:100%; +max-width:250px; +transform:rotate(-3deg); +margin-bottom:15px} +.fetch-list>span{padding:9px 12px; +display:flex; +align-items:center; +font-size:9px} +.fetch-list i{font-size:7px; +font-style:normal; +margin-left:auto} +.dim-file{background:#f7f9fc; +color:#606e83} +.selected-file{border:1px solid #c9d6ff; +background:#eff3ff; +color:#4161ba; +border-radius:4px; +box-shadow:0 3px 9px #365cf50a} +.selected-file b{margin-left:auto} +.fetch-chip{position:absolute; +bottom:13px; +left:50%; +transform:translateX(-50%); +font-size:8px; +color:#607397; +background:white; +border:1px solid #e1e7f2; +padding:5px 8px; +white-space:nowrap; +border-radius:3px} +.workflow-section{background:var(--night); +color:#f1f4fa; +padding-block:100px; +position:relative; +overflow:hidden} +.workflow-section::after{content:''; +position:absolute; +width:430px; +height:430px; +border:1px solid #27334b; +border-radius:50%; +right:-240px; +top:-280px; +pointer-events:none} +.workflow-inner{display:grid; +grid-template-columns:.9fr 1.1fr; +gap:85px; +align-items:center} +.workflow-copy>.eyebrow{font-size:9px; +color:#9caac3; +letter-spacing:1.1px; +margin-bottom:21px} +.workflow-description{color:#9ba8be; +line-height:1.95; +font-size:12px; +margin-top:23px; +max-width:365px} +.workflow-tabs{margin-top:30px} +.workflow-tab{display:flex; +align-items:center; +gap:17px; +width:100%; +padding:17px 16px; +text-align:left; +background:transparent; +color:#8591a7; +border-left:2px solid #344156; +transition:background .2s,color .2s; +border-radius:0 4px 4px 0} +.step-index{font-family:var(--mono); +font-size:10px; +color:#96a4bd; +align-self:flex-start; +margin-top:4px} +.workflow-tab strong{display:block; +font-size:13px; +font-weight:600} +.workflow-tab small{display:block; +font-size:10px; +margin-top:7px} +.tab-arrow{margin-left:auto; +align-self:flex-start; +font-size:18px; +opacity:0} +.workflow-tab.active{background:#1b2942; +color:#fff; +border-color:#6c8fff} +.workflow-tab.active .step-index{color:#a8beff} +.workflow-tab.active small{color:#a5b6d3} +.workflow-tab.active .tab-arrow{opacity:1; +color:#9cb5ff} +.workflow-tab:hover{background:#1a253a} +.terminal-wrap{min-width:0; +padding-top:28px} +.terminal{background:#0b1321; +border:1px solid #35415a; +border-radius:8px; +box-shadow:0 26px 80px #03080f47; +overflow:hidden; +font-family:var(--mono); +font-size:10px} +.terminal-top{display:flex; +align-items:center; +gap:20px; +color:#9aa8bd; +height:45px; +padding-inline:20px; +background:#182236; +border-bottom:1px solid #2b374c} +.window-dots{display:flex; +gap:5px; +margin-right:auto} +.window-dots i{display:block; +width:7px; +height:7px; +border-radius:50%; +background:#65738a} +.window-dots i:first-child{background:#bd7b7b} +.window-dots i:nth-child(2){background:#c5ac75} +.window-dots i:nth-child(3){background:#6d9a90} +.terminal-shell{margin-left:auto; +color:#8594aa} +.terminal-body{padding:31px 26px 20px; +min-height:333px} +.terminal-comment{color:#8291aa; +font-size:9px; +line-height:1.8; +margin-bottom:22px} +pre{margin:0; +font-family:var(--mono); +line-height:2; +overflow-x:auto; +tab-size:2} +code{font-family:var(--mono)} +.terminal pre{font-size:11px; +min-height:112px; +color:#d6dfef} +.terminal-prompt{color:#8192af; +margin-right:7px} +.code-blue{color:#91aeff} +.terminal-divider{height:1px; +background:#223046; +margin-block:21px} +.terminal-result{font-size:9px; +color:#a2b0c7; +line-height:2.4} +.terminal-result p>span:first-child{color:#8bbda5; +margin-right:9px} +.terminal-cursor{display:block; +width:6px; +height:12px; +background:#8ba7e8; +margin-top:15px; +animation:cursor-blink 2s step-end 3} +.terminal-bottom{display:flex; +align-items:center; +justify-content:space-between; +gap:12px; +padding:12px 16px; +background:#121d30; +border-top:1px solid #263247; +font-size:8px; +color:#a8b6cd; +letter-spacing:.3px} +.terminal-bottom>span{display:flex; +align-items:center; +gap:7px} +.terminal-bottom .status-dot{background:#84b69f; +width:4px; +height:4px} +.terminal-copy{color:#afbdd4; +background:none; +display:flex; +gap:12px; +align-items:center; +font-family:var(--mono); +font-size:8px; +padding:4px} +.terminal-copy:hover{color:white} +.terminal-note{font-size:9px; +color:#a0adc2; +text-align:center; +margin-top:21px; +display:flex; +justify-content:center; +gap:9px} +.terminal-note>span:first-child{color:#6c7a95} +.ecosystem-section{display:grid; +grid-template-columns:.95fr 1.05fr; +gap:80px; +align-items:center; +padding-block:119px} +.ecosystem-copy>p:not(.eyebrow){font-size:13px; +color:var(--muted); +line-height:1.95; +margin-top:22px; +max-width:380px} +.ecosystem-copy>.inline-link{margin-top:25px} +.ecosystem-map{display:flex; +align-items:center; +justify-content:space-between; +gap:0; +min-width:0; +position:relative} +.map-column{position:relative; +z-index:1} +.map-label{position:absolute; +top:-32px; +font-family:var(--mono); +font-size:8px; +letter-spacing:.8px; +color:#65748b; +white-space:nowrap} +.map-node{display:flex; +align-items:center; +gap:10px; +background:white; +border:1px solid #dfe6f0; +border-radius:4px; +padding:12px 13px; +font-size:10px; +min-width:139px} +.map-node+.map-node{margin-top:10px} +.format-icon{display:grid; +place-items:center; +width:19px; +height:19px; +border-radius:4px; +background:#edf1f9; +color:#566781; +font-family:var(--mono); +font-size:9px} +.map-bridge{flex:1; +min-width:110px; +position:relative; +text-align:center} +.map-bridge::before{content:''; +position:absolute; +left:0; +right:0; +top:50%; +border-top:1px dashed #adbfe3; +z-index:-1} +.map-bridge::after{content:''; +position:absolute; +left:0; +top:calc(50% - 83px); +height:166px; +width:28px; +border:1px solid #d8e2f5; +border-left:none; +border-radius:0 16px 16px 0; +z-index:-1} +.map-hub{width:82px; +height:89px; +background:#edf2ff; +border:1px solid #d1ddff; +border-radius:8px; +display:inline-flex; +align-items:center; +justify-content:center; +flex-direction:column; +gap:7px; +box-shadow:0 0 0 7px var(--paper)} +.map-hub strong{font-size:13px; +letter-spacing:-.4px} +.map-hub-caption{position:absolute; +top:calc(100% + 14px); +left:0; +right:0; +color:#5b6b84; +font-family:var(--mono); +font-size:7px; +letter-spacing:1.3px} +.registry-card{display:flex; +align-items:center; +justify-content:center; +flex-direction:column; +text-align:center; +width:146px; +height:156px; +border:1px solid #dce3ee; +background:white; +border-radius:6px} +.registry-card>svg{width:32px; +height:32px; +stroke:#7185ab; +stroke-width:1.3; +fill:none; +margin-bottom:16px} +.registry-card strong{font-size:12px; +font-weight:600} +.registry-card small{font-size:9px; +color:#67758c; +line-height:1.8; +margin-top:8px} +.community-section{padding-bottom:95px} +.community-card{position:relative; +background:#edf2fc; +border:1px solid #dce5f4; +border-radius:9px; +padding:57px 58px; +overflow:hidden; +display:flex; +justify-content:space-between; +gap:15px} +.community-card .eyebrow{color:#596d8c; +font-size:9px; +margin-bottom:20px} +.community-card h2{font-size:38px; +line-height:1.3; +letter-spacing:-1.4px} +.community-card p:not(.eyebrow){font-size:12px; +color:#5d6e88; +margin-top:18px} +.community-actions{display:flex; +align-items:center; +gap:25px; +margin-top:28px} +.community-art{width:285px; +flex-shrink:0; +position:relative; +display:grid; +place-items:center} +.community-mark{width:115px; +height:126px; +display:grid; +place-items:center; +background:#f8faff; +border:1px solid #d7e1f6; +border-radius:18px; +transform:rotate(-10deg); +box-shadow:10px 14px 30px #466cac0c} +.orbit{position:absolute; +left:50%; +top:50%; +border:1px solid #d2ddf1; +border-radius:50%; +transform:translate(-50%,-50%)} +.orbit-one{width:200px; +height:200px} +.orbit-two{width:295px; +height:295px} +.orbit-three{width:390px; +height:390px} +.orbit-node{display:grid; +place-items:center; +position:absolute; +background:#f8faff; +border:1px solid #d9e3f5; +color:#516b9a; +border-radius:6px; +width:29px; +height:29px; +font-family:var(--mono); +font-size:14px} +.node-one{left:12px; +top:40px; +transform:rotate(-10deg)} +.node-two{right:12px; +top:55px; +transform:rotate(12deg)} +.node-three{right:60px; +bottom:4px; +font-size:9px; +transform:rotate(5deg)} +.site-footer{border-top:1px solid var(--line); +padding-top:52px} +.footer-top{display:flex; +justify-content:space-between; +gap:40px; +padding-bottom:51px} +.footer-top .brand{font-size:25px} +.footer-top p{font-size:11px; +color:var(--muted); +margin-top:16px} +.footer-links{display:flex; +gap:87px; +margin-right:40px} +.footer-links>div{display:flex; +flex-direction:column; +gap:13px; +font-size:11px; +color:#66748a} +.footer-links strong{font-family:var(--mono); +font-weight:400; +font-size:9px; +letter-spacing:.9px; +color:#39465d; +margin-bottom:6px} +.footer-links a:hover{color:var(--blue)} +.footer-bottom{padding-block:22px; +border-top:1px solid var(--line); +display:flex; +justify-content:space-between; +align-items:center; +gap:20px; +font-size:9px; +color:#64738a} +.footer-bottom>a{display:flex; +align-items:center; +gap:9px} +.footer-bottom .status-dot{width:4px; +height:4px; +background:#7e9f8f} +.toast{position:fixed; +bottom:25px; +left:50%; +transform:translate(-50%,15px); +max-width:calc(100% - 32px); +width:max-content; +background:var(--ink); +color:white; +padding:13px 20px; +border-radius:6px; +box-shadow:0 5px 25px #15213725; +font-size:12px; +z-index:100; +opacity:0; +visibility:hidden; +transition:opacity .2s,transform .2s} +.toast.visible{opacity:1; +visibility:visible; +transform:translate(-50%,0)} + +.no-js .copy-button,.no-js .terminal-copy,.no-js .workflow-tabs,.no-js .menu-toggle{display:none} +.no-js .navigation{display:flex; +position:static; +box-shadow:none; +flex-wrap:wrap} +.no-js .header-inner{height:auto; +min-height:85px; +padding-block:15px} +.no-js .workflow-description{margin-bottom:15px} + +/* Hugo renders all localized content before JavaScript runs. */ +[hidden] { display: none !important; } +.no-js .terminal + .terminal { margin-top: 20px; } +.docs-sidebar nav ul { margin: 0; padding: 0; list-style: none; } +.docs-sidebar nav li { margin: 0 0 5px; } +.docs-sidebar nav a { display: block; } +.docs-prose h2 { margin: 48px 0 17px; font-size: 27px; letter-spacing: -.8px; scroll-margin-top: 110px; } +.docs-prose h3 { margin: 28px 0 12px; font-size: 16px; font-weight: 600; } +.docs-prose p, .docs-prose li { color: var(--muted); font-size: 13px; line-height: 1.95; } +.docs-prose p + p { margin-top: 12px; } +.docs-prose a { color: var(--blue); text-decoration: underline; text-underline-offset: 3px; } +.docs-prose :not(pre) > code { background: #eaf0fb; color: #435c8e; padding: 2px 5px; border-radius: 3px; font-size: .85em; } +@media (max-width: 700px) { + .docs-sidebar nav ul { display: flex; flex-wrap: wrap; gap: 7px; } + .docs-sidebar nav li { margin: 0; } + .docs-prose h2 { margin-top: 36px; font-size: 25px; } + .docs-prose p, .docs-prose li { font-size: 12px; } +} +/* Documentation shares the site's typography, controls and spacing. */ +.docs-layout{display:grid; +grid-template-columns:210px minmax(0,1fr); +gap:75px; +padding-block:62px 100px; +max-width:1130px} +.docs-sidebar{position:sticky; +top:125px; +align-self:start} +.docs-sidebar .eyebrow{color:#64738a; +margin-bottom:15px} +.docs-sidebar nav{display:flex; +flex-direction:column; +gap:5px} +.docs-sidebar a{font-size:12px; +color:var(--muted); +padding:10px 12px; +border-left:2px solid var(--line)} +.docs-sidebar a:hover,.docs-sidebar a.current{background:#edf2ff; +border-color:var(--blue); +color:var(--blue)} +.docs-sidebar .sidebar-source{margin-top:25px; +display:block; +border:none; +font-size:10px} +.docs-content{min-width:0} +.docs-content>.eyebrow{color:var(--blue); +margin-bottom:15px} +.docs-content h1{font-size:47px; +letter-spacing:-2.3px; +font-weight:600; +line-height:1.15} +.docs-intro{font-size:15px; +color:var(--muted); +line-height:1.9; +margin-top:20px} +.docs-section{padding-top:48px; +scroll-margin-top:100px} +.docs-section h2{font-size:27px; +letter-spacing:-.8px; +margin-bottom:17px} +.docs-section h3{font-size:16px; +font-weight:600; +margin-block:25px 12px} +.docs-section p,.docs-section li{font-size:13px; +line-height:1.95; +color:var(--muted)} +.docs-section p+p{margin-top:12px} +.docs-section p a{color:var(--blue); +text-decoration:underline; +text-underline-offset:3px} +.docs-section :not(pre)>code,.docs-note code{font-size:.85em; +background:#eaf0fb; +border-radius:3px; +padding:2px 5px; +color:#435c8e} +.docs-note{display:flex; +gap:14px; +align-items:flex-start; +background:#edf3ff; +border:1px solid #d8e3fa; +border-radius:5px; +padding:17px 19px; +margin-block:23px; +color:#516d9d; +font-size:12px; +line-height:1.9} +.docs-note>span:first-child{color:var(--blue); +font-family:var(--mono)} +.code-block{position:relative; +margin-block:17px; +background:#101b2d; +color:#d6e0f2; +border:1px solid #283950; +border-radius:6px; +overflow:hidden} +.code-block-top{display:flex; +align-items:center; +justify-content:space-between; +gap:15px; +padding:7px 13px; +border-bottom:1px solid #2d3a50; +background:#19263b; +color:#aab8cf; +font-family:var(--mono); +font-size:10px; +min-height:38px} +.code-block pre{padding:20px; +font-size:11px; +line-height:2; +max-width:100%; +scrollbar-width:thin} +.code-block .copy-button{color:#aab8cf; +font-size:14px} +.code-block .copy-button:hover{background:#314363; +color:white} +.docs-section details{border:1px solid var(--line); +border-radius:5px; +margin-top:22px; +padding:16px 20px} +.docs-section summary{cursor:pointer; +font-size:12px; +font-weight:600; +line-height:1.8} +.docs-section details[open]>summary{margin-bottom:16px} +.docs-end{border-top:1px solid var(--line); +margin-top:48px; +padding-top:26px; +display:flex; +justify-content:space-between; +gap:20px; +font-size:11px; +color:var(--muted)} +.docs-end a:hover{color:var(--blue)} + +html[lang='zh-CN'] .hero h1{font-size:clamp(50px,5.1vw,72px); +line-height:1.2; +letter-spacing:-2.4px} +html[lang='zh-CN'] h2{line-height:1.35; +letter-spacing:-1px} +html[lang='zh-CN'] .hero-description{max-width:410px} +html[lang='zh-CN'] .navigation{gap:25px} +html[lang='zh-CN'] .community-card h2{font-size:33px} +html[lang='zh-CN'] .eyebrow{letter-spacing:1px} + +@keyframes artifact-arrive{from{opacity:0; +transform:translateY(18px)} +to{opacity:1; +transform:translateY(0)} +} +@keyframes cursor-blink{50%{opacity:0} +} + +@media(min-width:1450px){.hero{min-height:785px} +.hero-art{height:610px} +.artifact-image{top:0} +.hero h1{font-size:85px} +.hero-description{font-size:16px} +} + +@media(max-width:1150px){.container{width:calc(100% - 72px)} +.header-inner{gap:25px} +.navigation{gap:21px; +font-size:11px} +.nav-actions{gap:16px; +margin-left:8px} +.hero{min-height:678px; +padding-block:57px} +.hero h1{letter-spacing:-3.6px} +.hero-art{height:510px; +margin-right:-10px} +.artifact-image{top:42px} +.art-kicker{left:20px; +top:24px; +font-size:7px} +.artifact-badge{right:4px; +bottom:71px} +.art-caption{left:30px; +right:15px; +bottom:35px; +font-size:7px} +.hero-description{font-size:13px; +max-width:355px} +.install-command{gap:8px; +padding-left:10px} +.install-command code{font-size:9px} +.hero-actions{gap:18px} +.text-link{font-size:11px; +gap:9px} +.standards-inner{gap:20px} +.standards-inner>.eyebrow{max-width:112px; +font-size:8px} +.standard-brand{font-size:17px; +gap:10px} +.standard-label{font-size:9px} +.standard-brand small{font-size:8px} +.oci-wordmark{font-size:28px} +.section{padding-block:85px} +h2{font-size:37px} +.section-heading>p{max-width:330px; +font-size:12px} +.feature-grid{gap:16px} +.feature-card{padding:21px 20px} +.feature-card h3{font-size:15px} +.feature-card>p{font-size:11px} +.file-stack>span{font-size:8px; +padding:8px} +.visual-arrow{margin-inline:10px} +.mini-artifact{padding:12px} +.workflow-inner{gap:40px; +grid-template-columns:.95fr 1.05fr} +.workflow-section{padding-block:80px} +.terminal-body{padding:26px 20px} +.terminal pre{font-size:10px} +.ecosystem-section{gap:40px} +.map-node{min-width:119px; +padding:11px 9px; +font-size:9px} +.map-label{font-size:7px} +.registry-card{width:125px} +.map-bridge{min-width:100px} +.community-card{padding:46px 42px} +.community-card h2{font-size:33px} +.community-art{width:225px} +html[lang='zh-CN'] .navigation{gap:18px} +html[lang='zh-CN'] .community-card h2{font-size:30px} +} + +@media(max-width:940px){.container{width:calc(100% - 56px)} +.header-inner{height:74px} +.menu-toggle{display:flex; +flex-direction:column; +justify-content:center; +gap:6px; +background:transparent; +width:40px; +height:40px; +padding:8px} +.menu-toggle>span{width:24px; +height:1.5px; +background:var(--ink); +transition:transform .2s} +.menu-toggle[aria-expanded='true']>span:first-child{transform:translateY(3.75px) rotate(45deg)} +.menu-toggle[aria-expanded='true']>span:last-child{transform:translateY(-3.75px) rotate(-45deg)} +.navigation{display:none; +position:absolute; +top:74px; +left:0; +right:0; +background:var(--paper); +padding:22px 28px; +box-shadow:0 16px 24px #122a4410; +border-bottom:1px solid var(--line); +align-items:stretch; +font-size:14px} +.navigation.open{display:flex; +flex-direction:column; +gap:6px} +.navigation>a{padding:12px 0} +.nav-actions{margin:10px 0 0; +border-top:1px solid var(--line); +padding-top:17px; +gap:25px} +.nav-actions .button{margin-left:auto} +.hero{min-height:640px; +grid-template-columns:1fr .9fr} +.hero h1{font-size:59px; +letter-spacing:-3.4px} +.hero-art{height:465px; +margin-left:-28px} +.artifact-image{top:35px; +width:103%; +left:-3%} +.art-kicker{font-size:6px; +letter-spacing:1px; +left:10px} +.artifact-badge{bottom:64px; +right:0; +padding:11px 13px; +gap:8px} +.badge-cube{width:29px; +height:29px; +font-size:24px} +.artifact-badge strong{font-size:10px} +.artifact-badge div>span{font-size:8px} +.badge-check{margin-left:3px} +.art-caption{left:10px; +font-size:6px; +gap:8px; +bottom:25px} +.hero-description{font-size:12px; +max-width:315px} +.hero-actions{gap:16px} +.button{padding-inline:18px; +font-size:11px; +gap:20px} +.hero-actions .text-link{font-size:10px} +.install-command{width:100%} +.install-command code{font-size:8px} +.hero-footnote{font-size:9px} +.standards-inner{display:grid; +grid-template-columns:repeat(3,1fr); +padding-block:25px; +gap:20px} +.standards-inner>.eyebrow{grid-column:1/-1; +max-width:none; +text-align:center} +.standard-brand{justify-content:center; +font-size:15px} +.standard-brand svg{width:28px; +height:28px} +.standard-label{font-size:8px} +.standard-brand small{font-size:7px} +.section-heading>p{max-width:300px} +.section-heading{gap:30px} +h2{font-size:32px} +.feature-card{padding:18px 15px} +.feature-visual{height:138px; +margin-bottom:20px} +.feature-card h3{font-size:13px} +.feature-card>p{font-size:10px} +.feature-card .inline-link{font-size:9px} +.file-stack>span{font-size:6px; +padding:7px; +gap:5px} +.mini-artifact{padding:10px} +.mini-artifact img{width:29px} +.visual-arrow{margin-inline:8px} +.registry-node{width:35px; +height:42px} +.registry-center{width:45px; +height:54px} +.registry-tag{font-size:6px} +.dashed-connector{width:17px} +.fetch-list>span{font-size:7px; +padding:8px} +.fetch-list i{display:none} +.fetch-chip{font-size:6px} +.workflow-inner{gap:30px} +.workflow-copy>.eyebrow{font-size:7px} +.workflow-description{font-size:11px} +.workflow-tab{padding:14px 10px; +gap:12px} +.workflow-tab strong{font-size:11px} +.workflow-tab small{font-size:9px} +.terminal-body{padding:25px 16px; +min-height:330px} +.terminal-comment{font-size:8px} +.terminal pre{font-size:9px} +.terminal-result{font-size:8px} +.terminal-bottom{padding:11px 12px; +font-size:6px} +.terminal-copy{font-size:7px; +gap:5px} +.ecosystem-section{grid-template-columns:1fr; +gap:65px} +.ecosystem-copy{max-width:570px} +.ecosystem-copy>p:not(.eyebrow){max-width:510px} +.ecosystem-map{width:100%; +max-width:590px; +margin-inline:auto} +.map-node{min-width:165px; +font-size:12px} +.map-label{font-size:8px} +.registry-card{width:175px; +height:170px} +.community-art{width:180px} +.community-card{padding:38px 30px} +.community-card h2{font-size:28px} +.community-card p:not(.eyebrow){font-size:10px} +.community-actions{gap:18px} +.community-actions .text-link{font-size:10px} +.community-mark{width:90px; +height:100px} +.community-mark img{width:51px} +.orbit-one{width:155px; +height:155px} +.orbit-two{width:235px; +height:235px} +.orbit-three{width:315px; +height:315px} +.node-one{left:-5px; +top:36px} +.node-two{right:-5px; +top:55px} +.node-three{right:25px; +bottom:15px} +.footer-links{margin-right:0; +gap:55px} +.docs-layout{gap:35px; +grid-template-columns:160px minmax(0,1fr)} +.docs-sidebar a{font-size:11px; +padding:10px 7px} +.docs-content h1{font-size:40px} +.docs-intro{font-size:13px} +.docs-section h2{font-size:25px} +html[lang='zh-CN'] .hero h1{font-size:54px} +html[lang='zh-CN'] .community-card h2{font-size:24px} +} + +@media(max-width:700px){html{scroll-padding-top:94px} +.container{width:calc(100% - 40px)} +.brand{font-size:25px} +.brand img{width:27px} +.header-inner{height:69px} +.navigation{top:69px; +padding:18px 20px} +.hero{grid-template-columns:1fr; +padding-top:44px; +padding-bottom:24px; +gap:0; +min-height:auto} +.hero-eyebrow{font-size:8px; +margin-bottom:22px} +.hero h1{font-size:clamp(55px,11vw,74px); +line-height:1.08; +letter-spacing:-3.8px} +.hero-description{font-size:13px; +line-height:1.9; +max-width:440px; +margin-top:24px} +.hero-actions{gap:23px; +margin-top:24px} +.button{min-height:46px; +font-size:11px} +.hero-actions .text-link{font-size:11px} +.install-command{margin-top:27px; +width:fit-content; +max-width:100%; +padding:5px 6px 5px 12px} +.install-command code{font-size:9px} +.hero-footnote{font-size:9px} +.hero-art{height:auto; +aspect-ratio:1.08; +margin:19px 0 0; +max-width:510px; +width:100%; +justify-self:center} +.artifact-image{width:102%; +left:-1%; +top:0} +.art-kicker{top:11px; +left:18px; +font-size:6px} +.artifact-badge{bottom:32px; +right:17px} +.art-caption{bottom:0; +left:30px; +right:30px; +font-size:6px} +.art-grid{inset:0} +.standards-inner{gap:22px 12px; +padding-block:24px} +.standard-brand{gap:6px; +font-size:13px} +.standard-brand svg{width:21px} +.standard-brand small{font-size:7px; +line-height:1.7; +max-width:99px} +.standard-label{font-size:7px; +max-width:75px; +line-height:1.5} +.oci-wordmark{font-size:23px} +.oci-wordmark>span{display:none} +.section{padding-block:66px} +.section-heading{display:block; +margin-bottom:30px} +.section .eyebrow{font-size:8px; +margin-bottom:15px} +h2{font-size:33px; +letter-spacing:-1.4px} +.section-heading>p{max-width:470px; +font-size:12px; +margin-top:21px} +.feature-grid{grid-template-columns:1fr; +gap:17px} +.feature-card{padding:20px 25px 26px} +.feature-visual{height:164px; +max-width:320px; +width:100%; +align-self:center; +margin-bottom:22px} +.feature-card h3{font-size:18px} +.feature-card>p{font-size:12px} +.feature-card .inline-link{font-size:11px; +margin-top:19px} +.file-stack>span{font-size:9px; +gap:9px; +padding:9px 12px} +.visual-arrow{margin-inline:24px} +.mini-artifact{padding:17px} +.mini-artifact img{width:36px} +.registry-node{width:52px; +height:54px} +.registry-center{width:65px; +height:67px} +.dashed-connector{width:31px} +.registry-tag{font-size:9px} +.fetch-list>span{font-size:10px} +.fetch-list i{display:block} +.fetch-chip{font-size:8px} +.workflow-section{padding-block:62px} +.workflow-inner{grid-template-columns:1fr; +gap:24px} +.workflow-copy>.eyebrow{font-size:8px} +.workflow-description{font-size:12px; +max-width:400px; +margin-top:20px} +.workflow-tabs{margin-top:25px} +.workflow-tab{padding:15px; +gap:18px} +.workflow-tab strong{font-size:12px} +.workflow-tab small{font-size:10px} +.terminal-wrap{padding-top:0} +.terminal-body{padding:25px 19px; +min-height:327px} +.terminal pre{font-size:10px; +min-height:110px} +.terminal-comment{font-size:8px} +.terminal-result{font-size:9px} +.terminal-bottom{font-size:7px; +padding:11px 14px} +.terminal-copy{font-size:8px} +.terminal-note{font-size:8px} +.ecosystem-section{gap:55px} +.ecosystem-copy>p:not(.eyebrow){font-size:12px} +.ecosystem-map{max-width:440px} +.map-node{min-width:120px; +padding:10px 8px; +font-size:9px} +.map-label{font-size:6px; +top:-25px; +letter-spacing:.6px} +.map-bridge{min-width:82px} +.map-bridge::after{width:18px; +height:140px; +top:calc(50% - 70px)} +.map-hub{width:61px; +height:70px; +gap:4px} +.map-hub img{width:29px; +height:32px} +.map-hub strong{font-size:11px} +.map-hub-caption{font-size:6px; +letter-spacing:.5px; +top:calc(100% + 11px)} +.registry-card{width:117px; +height:142px} +.registry-card strong{font-size:10px} +.registry-card small{font-size:8px} +.community-section{padding-bottom:64px} +.community-card{padding:32px 26px; +display:block} +.community-card .eyebrow{font-size:7px; +margin-bottom:16px} +.community-card h2{font-size:29px; +letter-spacing:-1.2px} +.community-card p:not(.eyebrow){font-size:11px; +line-height:1.9; +max-width:300px; +margin-top:15px} +.community-art{display:none} +.community-actions{align-items:flex-start; +flex-direction:column; +gap:21px; +margin-top:23px} +.community-actions .text-link{font-size:11px} +.site-footer{padding-top:38px} +.footer-top{flex-direction:column; +gap:35px; +padding-bottom:32px} +.footer-links{gap:70px} +.footer-links>div{font-size:10px; +gap:12px} +.footer-bottom{flex-direction:column; +align-items:flex-start; +gap:15px; +padding-block:20px; +font-size:8px} +.docs-layout{display:block; +padding-block:28px 60px} +.docs-sidebar{position:static; +margin-bottom:35px} +.docs-sidebar .eyebrow,.docs-sidebar .sidebar-source{display:none} +.docs-sidebar nav{flex-direction:row; +flex-wrap:wrap; +gap:7px} +.docs-sidebar a{border:1px solid var(--line); +border-radius:4px; +padding:7px 10px; +font-size:10px} +.docs-content h1{font-size:37px} +.docs-content>.eyebrow{font-size:9px} +.docs-intro{font-size:13px} +.docs-section{padding-top:36px} +.docs-section h2{font-size:25px} +.docs-section p,.docs-section li{font-size:12px} +.docs-note{font-size:11px; +padding:13px 15px; +gap:10px} +.code-block pre{padding:15px; +font-size:10px} +.docs-end{font-size:9px} +html[lang='zh-CN'] .hero h1{font-size:clamp(51px,10vw,65px); +letter-spacing:-2px} +html[lang='zh-CN'] .community-card h2{font-size:26px} +} + +@media(max-width:370px){.container{width:calc(100% - 32px)} +.hero h1{font-size:51px; +letter-spacing:-3px} +.install-command{gap:6px; +padding-left:8px} +.install-command code{font-size:8px} +.hero-actions{gap:15px} +.hero-actions .text-link{font-size:10px} +.map-node{min-width:107px; +font-size:8px} +.map-bridge{min-width:71px} +.registry-card{width:103px} +.registry-tag{font-size:8px} +.standards-inner{gap:16px 8px} +.standard-brand{font-size:11px} +.standard-brand svg{width:18px} +.standard-label{font-size:6px} +.standard-brand small{font-size:6px} +.community-card{padding:27px 21px} +.community-card h2{font-size:26px} +.terminal pre{font-size:9px} +.terminal-result{font-size:8px} +.terminal-comment{font-size:7px} +html[lang='zh-CN'] .hero h1{font-size:47px} +} + +@media(prefers-reduced-motion:reduce){html{scroll-behavior:auto} +*,*::before,*::after{animation:none!important; +transition:none!important} +} + +@media(max-width:940px){.no-js .header-inner{flex-direction:column; +align-items:flex-start; +gap:16px} +.no-js .navigation{padding:0; +border:0; +gap:16px; +font-size:11px} +.no-js .navigation>a{padding:0} +.no-js .nav-actions{margin:0; +padding:0; +border:0} +.no-js .site-header{position:static} +} + +@media print{.site-header,.site-footer,.docs-sidebar,.toast,.copy-button,.menu-toggle,.language-toggle{display:none} +.docs-layout{display:block; +width:100%; +padding:0} +.code-block{break-inside:avoid} +.docs-section{break-inside:avoid} +.button{box-shadow:none} +body{background:white} +}