From 59b6ae76a23fb46dfbdf015009e589a75b185857 Mon Sep 17 00:00:00 2001 From: Royee <98244131+Xiiiing@users.noreply.github.com> Date: Tue, 22 Sep 2026 11:16:12 +0800 Subject: [PATCH 1/4] docs: redesign bilingual repository landing page --- README.md | 120 ++++++++---------- README.zh-CN.md | 120 ++++++++---------- docs/assets/brand/webcodex-mark-dark.svg | 10 ++ docs/assets/brand/webcodex-mark.svg | 10 ++ docs/assets/readme/webcodex-overview-dark.svg | 29 +++++ docs/assets/readme/webcodex-overview.svg | 29 +++++ 6 files changed, 188 insertions(+), 130 deletions(-) create mode 100644 docs/assets/brand/webcodex-mark-dark.svg create mode 100644 docs/assets/brand/webcodex-mark.svg create mode 100644 docs/assets/readme/webcodex-overview-dark.svg create mode 100644 docs/assets/readme/webcodex-overview.svg diff --git a/README.md b/README.md index 773af8aec..e8cf5c8b3 100644 --- a/README.md +++ b/README.md @@ -1,109 +1,99 @@ -# WebCodex +

English · 简体中文

-[English](README.md) | [简体中文](README.zh-CN.md) +

+ + + WebCodex mark + +

-**WebCodex lets ChatGPT, Claude, and other AI agents work directly with code and developer tools on your own machines.** +

WebCodex

-Ask your assistant to inspect a repository, modify code, run tests, use Git, or investigate a failure. Your repository stays on the machine where it already lives; you do not need to move the project into a hosted workspace just to use an AI coding agent. +

Give cloud AI agents a real development environment on your own machines.

+

Connect ChatGPT, Claude, and other MCP clients to the repositories, Git checkout, compilers, tests, and tools you already use.

+

Quick Trial · Full Setup · Documentation · Security

-## Start using WebCodex +

+ MCP protocol + Node.js 18 or newer + Apache 2.0 license +

-### Everyday development: full WebCodex (recommended) +

+ + + AI clients connect to the WebCodex Server over MCP. The Server routes authorized work to a Runner on your own machine, where repositories, Git, tests, and developer tools live. + +

-If you want ChatGPT to keep using your real development environment, start with a **regular Server + Runner**. This is the full development experience: durable access to multiple projects plus project exploration, editing, Git, commands, tests, long-running work, and code navigation. Public HTTPS, Cloudflare Tunnel, and OpenAI Secure MCP Tunnel are only ways for ChatGPT to reach the Server; they do not switch you into a different restricted experience. +## Try one repository -Follow the [Full Setup guide](docs/PERSONAL_SETUP.md) for installation, one-time login, project selection, Runner startup, and ChatGPT connection. You do not need to learn internal identity, registry, or token details before the first successful setup. - -### Just trying it for a few minutes: temporary share - -To quickly see whether WebCodex fits your workflow, run this inside one repository: +From a repository you want an AI client to inspect: ```bash cd /path/to/your/repository npx --yes @yyjeqhc/webcodex share ``` -`share` starts a temporary, single-project, restricted WebCodex environment and prints the ChatGPT connection values. The endpoint and temporary credential stop working when the command exits. It is intended for trials and short-lived sharing, not as the default full daily setup. See the [Quick Trial](docs/QUICK_START.md) for the exact steps. +This starts a **temporary, single-project, restricted trial**. Keep the command running, use the printed MCP connection values, and stop it to end the endpoint and credential. See the [Quick Trial](docs/QUICK_START.md) for prerequisites and ChatGPT connection steps. + +## Full setup -## What can it do? +For everyday development, run a regular **Server + Runner**. The Runner works where your repositories and toolchain already live; the Server gives your AI client an authenticated path to registered projects. This supports multiple projects and the full development workflow. -- **Understand and edit code** — read, search, inspect, and make guarded changes inside configured projects. -- **Use the real toolchain** — run commands, tests, formatters, compilers, and project-specific tooling on the machine that owns the repository. -- **Work with Git** — inspect status and diffs while keeping repository operations visible and reviewable. -- **Handle long-running work** — keep jobs observable instead of requiring one model turn to stay open indefinitely. -- **Support human review** — use the Runtime Console and task workflow to guide, cancel, accept, or reject work where those actions are available. +Install the CLI with `npm install -g @yyjeqhc/webcodex`, then follow the [Full Setup guide](docs/PERSONAL_SETUP.md). A public HTTPS endpoint or tunnel is a way to reach the Server, not a replacement for the regular setup. -## Why WebCodex? +## Why WebCodex -- **Your code stays on your machine.** The repository does not need to be copied into the chat service. -- **The agent gets a real development environment.** It can use the same files, Git checkout, compilers, tests, and tools you already use. -- **Work survives beyond a single request.** Long-running execution and evidence remain observable through WebCodex. -- **Start temporary or run it long-term.** Use one-command sharing for a quick session, or connect machines to a self-hosted Server for a durable setup. +- **Work on the real repository.** The Runner operates in registered project directories on your machine, using the Git checkout you already have. +- **Use the real toolchain.** Read and edit code, inspect Git, and run compilers, tests, formatters, and project commands within the configured boundaries. +- **Keep long work observable.** Commands and checks that outlive a quick response continue as Jobs with bounded status and output you can inspect or stop. +- **Keep work reviewable.** Project policy, guarded edits, Git diffs, validation results, and runtime evidence help you inspect what happened. ## How it works -```text -AI client - | - | MCP / HTTPS - v -WebCodex - | - v -your machine - | - +-- repository - +-- Git - +-- compilers / tests / developer tools -``` +WebCodex is a self-hosted execution bridge. The AI client calls its Server through MCP; the Server authenticates and routes the request, and a Runner on the repository machine performs the work. The Server does not scan your filesystem for projects. For the detailed model, see [Architecture](docs/ARCHITECTURE.md). -For the internal Server/Runner architecture, protocol surfaces, and authority boundaries, see [Architecture](docs/ARCHITECTURE.md), [MCP](docs/MCP.md), and [Authentication](docs/AUTH_MODEL.md). +## Security and control -## Platforms +Your repository stays on the machine that owns it. Tool results, including requested file excerpts, may be returned to the AI client. Register only projects you intend to expose, keep credentials private, and review changes before accepting them. WebCodex can read and modify files in registered projects and run powerful project commands; read the [security model](SECURITY.md) before connecting sensitive projects. -- **Linux x64/arm64** — local `share`, Server, and Runner workflows. -- **macOS x64/arm64** — local `share` and Runner workflows. -- **Windows x64/arm64** — CLI + Runner, local foreground Server, and explicit `webcodex share --tunnel cloudflare|openai|none`. Windows x64 can auto-manage the pinned Cloudflare Quick Tunnel binary; OpenAI `tunnel-client` is managed on both x64 and arm64. Cloudflare does not publish a Windows ARM64 artifact for the pinned release, so Windows ARM64 Cloudflare sharing requires a trusted explicit/PATH `cloudflared`. WebCodex-managed Windows Server services remain unsupported. +## Platforms -Windows and long-lived deployments are covered in [Deployment](docs/DEPLOYMENT.md) and [MCP](docs/MCP.md). +| Platform | Quick Trial | Everyday setup | +| --- | --- | --- | +| Linux x64 / arm64 | `share` | Server + Runner | +| macOS x64 / arm64 | `share` | Runner connected to a Server | +| Windows x64 | `share` | Foreground Server + Runner | +| Windows arm64 | `share` with an explicit supported tunnel option | Foreground Server + Runner | -## Existing Servers and advanced setup +The default managed Cloudflare trial is available on Linux, macOS, and Windows x64. Windows arm64 tunnel details and service limitations are in [Deployment](docs/DEPLOYMENT.md) and [MCP](docs/MCP.md). -If someone already provides the WebCodex Server and connection credential, use that existing Server. For a normal personal installation, follow the [Full Setup guide](docs/PERSONAL_SETUP.md). Use [Deployment](docs/DEPLOYMENT.md) later for production hosting, multiple users, systemd/Docker, OAuth, proxies, and private CAs. +## Documentation -Those are follow-up operating concerns, not concepts a first-time user should have to learn before WebCodex works. +**Get started:** [Quick Trial](docs/QUICK_START.md) · [Full Setup](docs/PERSONAL_SETUP.md) · [AI-assisted setup](docs/AI_ONBOARDING.md) -## Documentation +**Connect clients:** [MCP](docs/MCP.md) · [CLI](docs/CLI.md) -- [Full Setup](docs/PERSONAL_SETUP.md) — recommended daily use: a regular Server + Runner + your projects -- [Quick Trial](docs/QUICK_START.md) — temporarily try one repository with `share` -- [MCP](docs/MCP.md) — ChatGPT, Claude, authentication choices, and MCP reference -- [Deployment](docs/DEPLOYMENT.md) — production, self-hosting, and advanced operations -- [Troubleshooting](docs/TROUBLESHOOTING.md) — connection and runtime problems -- [CLI](docs/CLI.md) — command and credential reference -- [AI-assisted setup](docs/AI_ONBOARDING.md) — have an AI agent help configure WebCodex -- [Security](SECURITY.md) — security model and operational guidance -- [Documentation index](docs/INDEX.md) — all user and contributor documentation +**Operate safely:** [Security](SECURITY.md) · [Deployment](docs/DEPLOYMENT.md) · [Troubleshooting](docs/TROUBLESHOOTING.md) -## Security +**Understand the system:** [Architecture](docs/ARCHITECTURE.md) · [Authentication](docs/AUTH_MODEL.md) · [All documentation](docs/INDEX.md) -WebCodex can read and modify files and execute commands inside configured project boundaries. Use version control, keep credentials out of prompts/logs/Git, and register only project roots the assistant should access. Read [SECURITY.md](SECURITY.md) for the complete model. +## Build and contribute -## Build from source +The npm package is the normal installation path. To build the binaries from source: ```bash cargo build --release --workspace --bins export PATH="$PWD/target/release:$PATH" ``` -## Contributing - -Contributions are welcome, including contributions created with WebCodex itself or other coding agents. For bug reports, development workflow, and pull request guidance, see [CONTRIBUTING.md](CONTRIBUTING.md). +See [Contributing](CONTRIBUTING.md) for development and pull request guidance. ## Acknowledgements -Thanks to the [LINUX DO](https://linux.do/) community for its welcoming space for technical discussion and support for open-source sharing. +Thanks to the [LINUX DO](https://linux.do/) community for technical discussion and support for open-source sharing. ## License -Licensed under the Apache License, Version 2.0. See [LICENSE](LICENSE). +Apache License 2.0. See [LICENSE](LICENSE). diff --git a/README.zh-CN.md b/README.zh-CN.md index dca27d180..2d664a662 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -1,109 +1,99 @@ -# WebCodex +

English · 简体中文

-[English](README.md) | [简体中文](README.zh-CN.md) +

+ + + WebCodex 标志 + +

-**WebCodex 让 ChatGPT、Claude 和其他 AI Agent 直接使用你自己机器上的代码仓库和开发工具。** +

WebCodex

-你可以直接让 AI 理解项目、修改代码、运行测试、检查 Git 或排查问题。仓库仍然留在原来的机器上,不需要为了使用 WebCodex 把整个项目搬到托管环境里。 +

让云端 AI Agent 使用你自己机器上的真实开发环境。

+

把 ChatGPT、Claude 等 MCP 客户端连接到你已有的代码仓库、Git 工作区、编译器、测试和开发工具。

+

快速试用 · 完整配置 · 文档 · 安全说明

-## 开始使用 +

+ MCP 协议 + 需要 Node.js 18 或更新版本 + Apache 2.0 许可证 +

-### 日常使用:完整 WebCodex(推荐) +

+ + + AI 客户端通过 MCP 连接 WebCodex Server;Server 将获得授权的操作交给你自己机器上的 Runner,由 Runner 使用本机仓库、Git、测试和开发工具。 + +

-如果你准备让 ChatGPT 长期使用自己的开发环境,推荐从 **普通 Server + Runner** 开始。这是 WebCodex 的完整开发体验:可以长期连接多个项目,并使用项目探索、编辑、Git、命令、测试、长任务和代码导航能力。公网 HTTPS、Cloudflare Tunnel 或 OpenAI Secure MCP Tunnel 只是 ChatGPT 到 Server 的连接方式,不会把你切换到另一套受限体验。 +## 先试一个仓库 -按照[完整使用指南](docs/PERSONAL_SETUP.zh-CN.md)完成安装、一次性登录、项目选择、Runner 启动和 ChatGPT 连接即可。第一次成功使用前,不需要理解内部身份、注册表或令牌细节。 - -### 只想先试几分钟:临时分享 - -如果你只是想快速看看 WebCodex 是否适合自己,可以在一个仓库里运行: +进入愿意让 AI 查看和操作的仓库,运行: ```bash cd /path/to/your/repository npx --yes @yyjeqhc/webcodex share ``` -`share` 会临时启动单项目、受限的 WebCodex 环境并给出 ChatGPT 连接信息;关闭命令后连接和临时凭据都会失效。它适合试用和临时分享,不是日常完整体验的默认部署方式。详细步骤见[快速试用](docs/QUICK_START.zh-CN.md)。 +这会启动一个**临时、单项目、能力受限的试用环境**。保持命令运行,按输出的 MCP 连接信息接入;退出命令后,连接地址和临时凭据便会失效。准备条件与 ChatGPT 接入步骤见[快速试用指南](docs/QUICK_START.zh-CN.md)。 + +## 完整配置 -## 能做什么? +日常开发建议运行普通 **Server + Runner**。Runner 在代码和工具链所在的机器上工作,Server 为 AI 客户端提供通往已注册项目的认证入口。完整配置支持多个项目和完整开发流程。 -- **理解和修改代码** —— 读取、搜索、分析项目,并在配置好的项目范围内进行受保护的修改。 -- **使用真实开发环境** —— 在仓库所在机器上运行命令、测试、格式化、编译器和项目自己的工具。 -- **检查 Git** —— 查看状态和差异,让代码变化保持可见、可审查。 -- **处理长时间任务** —— 任务可以持续运行并保持可观察,不需要一次模型回复一直等待到底。 -- **保留人工审查** —— 可以通过运行时控制台和任务流程进行指导、取消、接受或拒绝。 +先运行 `npm install -g @yyjeqhc/webcodex`,再按[完整使用指南](docs/PERSONAL_SETUP.zh-CN.md)配置。公网 HTTPS 或 Tunnel 只是连接 Server 的方式,不会替代普通完整配置。 -## 为什么用 WebCodex? +## 为什么用 WebCodex -- **代码留在自己的机器上。** 不需要把整个仓库上传到聊天服务。 -- **AI 使用的是真实开发环境。** 文件、Git、编译器、测试和已有工具链都可以直接复用。 -- **工作不局限于一次请求。** 长时间执行、测试结果和相关证据可以继续观察。 -- **既能临时使用,也能长期部署。** 可以一条命令快速分享,也可以连接到自托管服务长期使用。 +- **使用真实仓库。** Runner 在你机器上已注册的项目目录中工作,直接使用现有 Git 工作区。 +- **使用真实工具链。** 在配置的边界内读取、修改代码,检查 Git,并运行编译器、测试、格式化工具和项目命令。 +- **看得见长时间任务。** 超过快速响应时间的命令和检查会作为 Job 继续运行,可以查看有界的状态与输出,也可以停止。 +- **方便审查工作。** 项目策略、受保护的编辑、Git 差异、验证结果和运行记录帮助你核对实际变化。 ## 工作方式 -```text -AI 客户端 - | - | MCP / HTTPS - v -WebCodex - | - v -你的机器 - | - +-- 代码仓库 - +-- Git - +-- 编译器 / 测试 / 开发工具 -``` +WebCodex 是自行托管的开发执行桥梁。AI 客户端通过 MCP 调用 Server;Server 负责认证和路由请求,仓库所在机器上的 Runner 执行具体操作。Server 不会扫描你的文件系统来寻找项目。详细说明见[架构文档](docs/ARCHITECTURE.md)。 -如果需要了解内部的 Server/Runner 架构、协议接口和权限边界,再阅读[架构说明](docs/ARCHITECTURE.md)、[MCP](docs/MCP.zh-CN.md)和[认证模型](docs/AUTH_MODEL.zh-CN.md)。 +## 安全与控制 -## 平台支持 +仓库留在拥有它的机器上;工具返回的结果(包括按请求读取的文件片段)可能传给 AI 客户端。只注册打算开放的项目,妥善保管凭据,并在接受结果前审查改动。WebCodex 能读取和修改已注册项目中的文件,也能运行有较大权限的项目命令;连接敏感项目之前请阅读[安全说明](SECURITY.md)。 -- **Linux x64/arm64** —— 支持本机 `share`、Server 和 Runner 工作流。 -- **macOS x64/arm64** —— 支持本机 `share` 和 Runner 工作流。 -- **Windows x64/arm64** —— 支持 CLI、Runner、本地前台 Server,以及显式 `webcodex share --tunnel cloudflare|openai|none`。Windows x64 可自动管理固定版本的 Cloudflare Quick Tunnel;OpenAI `tunnel-client` 在 x64/arm64 都支持 managed 获取。固定版本 Cloudflare 没有官方 Windows ARM64 artifact,因此 Windows ARM64 使用 Cloudflare 时需要提供受信任的显式/`PATH` `cloudflared`。WebCodex 托管的 Windows Server service 仍不支持。 +## 平台支持 -Windows 接入和长期部署见[部署指南](docs/DEPLOYMENT.zh-CN.md)与 [MCP](docs/MCP.zh-CN.md)。 +| 平台 | 快速试用 | 日常配置 | +| --- | --- | --- | +| Linux x64 / arm64 | `share` | Server + Runner | +| macOS x64 / arm64 | `share` | Runner 连接 Server | +| Windows x64 | `share` | 前台 Server + Runner | +| Windows arm64 | 显式选择受支持的 Tunnel 选项使用 `share` | 前台 Server + Runner | -## 已有 Server 与高级配置 +默认自动管理的 Cloudflare 试用流程适用于 Linux、macOS 和 Windows x64。Windows arm64 的 Tunnel 细节及服务限制见[部署指南](docs/DEPLOYMENT.zh-CN.md)和 [MCP](docs/MCP.zh-CN.md)。 -如果已经有人为你提供 WebCodex Server 和接入凭据,可以直接使用已有 Server;普通个人完整安装见[完整使用指南](docs/PERSONAL_SETUP.zh-CN.md)。生产环境、多用户、systemd/Docker、OAuth、代理/私有 CA 等运维内容再查看[部署指南](docs/DEPLOYMENT.zh-CN.md)。 +## 文档 -这些是后续配置,不应该成为第一次使用 WebCodex 的概念负担。 +**开始使用:**[快速试用](docs/QUICK_START.zh-CN.md) · [完整配置](docs/PERSONAL_SETUP.zh-CN.md) · [AI 辅助接入](docs/AI_ONBOARDING.zh-CN.md) -## 文档 +**连接客户端:**[MCP](docs/MCP.zh-CN.md) · [CLI](docs/CLI.zh-CN.md) -- [完整使用指南](docs/PERSONAL_SETUP.zh-CN.md) —— 日常使用推荐:普通 Server + Runner + 你的项目 -- [快速试用](docs/QUICK_START.zh-CN.md) —— 用 `share` 临时体验一个仓库 -- [MCP](docs/MCP.zh-CN.md) —— ChatGPT、Claude、认证方式和 MCP 参考 -- [部署指南](docs/DEPLOYMENT.zh-CN.md) —— 生产、自托管和高级运维 -- [故障排查](docs/TROUBLESHOOTING.zh-CN.md) —— 连接和运行问题 -- [CLI](docs/CLI.zh-CN.md) —— 命令与凭据参考 -- [AI 辅助接入](docs/AI_ONBOARDING.zh-CN.md) —— 让 AI 帮你配置 WebCodex -- [安全说明](SECURITY.md) —— 安全模型与使用建议 -- [文档索引](docs/INDEX.zh-CN.md) —— 全部用户和贡献者文档 +**安全运维:**[安全说明](SECURITY.md) · [部署指南](docs/DEPLOYMENT.zh-CN.md) · [故障排查](docs/TROUBLESHOOTING.zh-CN.md) -## 安全 +**了解架构:**[架构说明](docs/ARCHITECTURE.md) · [认证模型](docs/AUTH_MODEL.zh-CN.md) · [全部文档](docs/INDEX.zh-CN.md) -WebCodex 能在配置的项目范围内读取和修改文件、执行命令。建议使用版本控制,不要把凭据写进提示词、日志或 Git,只注册确实希望 AI 访问的项目目录。完整安全模型见 [SECURITY.md](SECURITY.md)。 +## 构建与贡献 -## 从源码构建 +普通用户可直接通过 npm 安装。如果需要从源码构建二进制文件: ```bash cargo build --release --workspace --bins export PATH="$PWD/target/release:$PATH" ``` -## 参与贡献 - -欢迎提交贡献,也欢迎使用 WebCodex 或其他 coding agent 辅助开发。Bug 报告、开发流程与 PR 说明见 [CONTRIBUTING.zh-CN.md](CONTRIBUTING.zh-CN.md)。 +开发流程和 Pull Request 要求见[贡献指南](CONTRIBUTING.zh-CN.md)。 ## 致谢 -感谢 [LINUX DO](https://linux.do/) 社区提供友好的技术交流与开源分享环境。 +感谢 [LINUX DO](https://linux.do/) 社区提供技术交流与开源分享的空间。 ## 许可证 -使用 Apache License 2.0,见 [LICENSE](LICENSE)。 +采用 Apache License 2.0,见 [LICENSE](LICENSE)。 diff --git a/docs/assets/brand/webcodex-mark-dark.svg b/docs/assets/brand/webcodex-mark-dark.svg new file mode 100644 index 000000000..b34630dcd --- /dev/null +++ b/docs/assets/brand/webcodex-mark-dark.svg @@ -0,0 +1,10 @@ + + WebCodex mark + + + + + + + + diff --git a/docs/assets/brand/webcodex-mark.svg b/docs/assets/brand/webcodex-mark.svg new file mode 100644 index 000000000..e46af0f22 --- /dev/null +++ b/docs/assets/brand/webcodex-mark.svg @@ -0,0 +1,10 @@ + + WebCodex mark + + + + + + + + diff --git a/docs/assets/readme/webcodex-overview-dark.svg b/docs/assets/readme/webcodex-overview-dark.svg new file mode 100644 index 000000000..9dfcc84cd --- /dev/null +++ b/docs/assets/readme/webcodex-overview-dark.svg @@ -0,0 +1,29 @@ + + How WebCodex connects AI clients to your development environment + AI clients connect over MCP to a WebCodex Server. The Server routes authorized work to a Runner on your machine, where repositories, Git, tests, and tools are available. + + + + + + + + + AI clients + WebCodex Server + Runner on your machine + + + ChatGPT · Claude · other MCP clients + Authentication · policy · routing + Repositories · Git · tests · developer tools + + + MCP / HTTPS + + + + + + + diff --git a/docs/assets/readme/webcodex-overview.svg b/docs/assets/readme/webcodex-overview.svg new file mode 100644 index 000000000..3be3c64b9 --- /dev/null +++ b/docs/assets/readme/webcodex-overview.svg @@ -0,0 +1,29 @@ + + How WebCodex connects AI clients to your development environment + AI clients connect over MCP to a WebCodex Server. The Server routes authorized work to a Runner on your machine, where repositories, Git, tests, and tools are available. + + + + + + + + + AI clients + WebCodex Server + Runner on your machine + + + ChatGPT · Claude · other MCP clients + Authentication · policy · routing + Repositories · Git · tests · developer tools + + + MCP / HTTPS + + + + + + + From dc4593b82734a878e70f5b8d676845aecb61922f Mon Sep 17 00:00:00 2001 From: Royee <98244131+Xiiiing@users.noreply.github.com> Date: Tue, 22 Sep 2026 11:28:43 +0800 Subject: [PATCH 2/4] docs: align landing page with upstream README and releases --- README.md | 125 ++++++++++++------ README.zh-CN.md | 125 ++++++++++++------ docs/assets/readme/webcodex-overview-dark.svg | 29 ---- docs/assets/readme/webcodex-overview.svg | 29 ---- 4 files changed, 170 insertions(+), 138 deletions(-) delete mode 100644 docs/assets/readme/webcodex-overview-dark.svg delete mode 100644 docs/assets/readme/webcodex-overview.svg diff --git a/README.md b/README.md index e8cf5c8b3..2aa24c788 100644 --- a/README.md +++ b/README.md @@ -10,8 +10,8 @@

WebCodex

Give cloud AI agents a real development environment on your own machines.

-

Connect ChatGPT, Claude, and other MCP clients to the repositories, Git checkout, compilers, tests, and tools you already use.

-

Quick Trial · Full Setup · Documentation · Security

+

Connect ChatGPT, Claude, and other MCP clients to the repositories, Git checkout, and tools you already use.

+

Quick Trial · Downloads · Full Setup · Documentation · Security

MCP protocol @@ -19,81 +19,126 @@ Apache 2.0 license

-

- - - AI clients connect to the WebCodex Server over MCP. The Server routes authorized work to a Runner on your own machine, where repositories, Git, tests, and developer tools live. - -

+Ask your assistant to inspect a repository, modify code, run tests, use Git, or investigate a failure. Your repository stays on the machine where it already lives; you do not need to move the project into a hosted workspace just to use an AI coding agent. + +## Start using WebCodex -## Try one repository +### Just trying it for a few minutes: temporary share -From a repository you want an AI client to inspect: +To quickly see whether WebCodex fits your workflow, run this inside one repository: ```bash cd /path/to/your/repository npx --yes @yyjeqhc/webcodex share ``` -This starts a **temporary, single-project, restricted trial**. Keep the command running, use the printed MCP connection values, and stop it to end the endpoint and credential. See the [Quick Trial](docs/QUICK_START.md) for prerequisites and ChatGPT connection steps. +`share` starts a temporary, single-project WebCodex environment and prints the ChatGPT connection values. The endpoint and credential stop working when the command exits. It is intended for trials and short-lived sharing, not as the default full daily setup. See the [Quick Trial](docs/QUICK_START.md) for the exact steps. -## Full setup +### Everyday development: full WebCodex (recommended) -For everyday development, run a regular **Server + Runner**. The Runner works where your repositories and toolchain already live; the Server gives your AI client an authenticated path to registered projects. This supports multiple projects and the full development workflow. +If you want ChatGPT to keep using your real development environment, start with a **regular Server + Runner**. This is the full development experience: durable access to multiple projects plus project exploration, editing, Git, commands, tests, long-running work, and code navigation. Public HTTPS, Cloudflare Tunnel, and OpenAI Secure MCP Tunnel are only ways for ChatGPT to reach the Server; they do not switch you into a different restricted experience. -Install the CLI with `npm install -g @yyjeqhc/webcodex`, then follow the [Full Setup guide](docs/PERSONAL_SETUP.md). A public HTTPS endpoint or tunnel is a way to reach the Server, not a replacement for the regular setup. +For Windows or macOS, the recommended first path is **WebCodex Desktop + the official OpenAI Secure Tunnel**. Follow the [upstream Desktop installation guide](https://github.com/yyjeqhc/webcodex/blob/main/docs/desktop-install.md). For CLI, an existing Server, self-hosting, or advanced setup, use the [Full Setup guide](docs/PERSONAL_SETUP.md). -## Why WebCodex +### Download a release -- **Work on the real repository.** The Runner operates in registered project directories on your machine, using the Git checkout you already have. -- **Use the real toolchain.** Read and edit code, inspect Git, and run compilers, tests, formatters, and project commands within the configured boundaries. -- **Keep long work observable.** Commands and checks that outlive a quick response continue as Jobs with bounded status and output you can inspect or stop. -- **Keep work reviewable.** Project policy, guarded edits, Git diffs, validation results, and runtime evidence help you inspect what happened. +The links below are **official upstream v0.4.1 releases**. They are newer than the source currently on this fork's `main` branch. Choose a Desktop installer for ordinary Windows/macOS use, or a native CLI archive for Server/Runner workflows. [View the release and checksums](https://github.com/yyjeqhc/webcodex/releases/tag/v0.4.1). -## How it works +| Platform | Desktop | CLI / Server / Runner | +| --- | --- | --- | +| Windows x64 | [Installer](https://github.com/yyjeqhc/webcodex/releases/download/v0.4.1/webcodex-desktop-v0.4.1-win32-x64-setup.exe) | [Archive](https://github.com/yyjeqhc/webcodex/releases/download/v0.4.1/webcodex-v0.4.1-win32-x64.tar.gz) | +| Windows arm64 | — | [Archive](https://github.com/yyjeqhc/webcodex/releases/download/v0.4.1/webcodex-v0.4.1-win32-arm64.tar.gz) | +| macOS Apple Silicon | [DMG](https://github.com/yyjeqhc/webcodex/releases/download/v0.4.1/webcodex-desktop-v0.4.1-darwin-arm64.dmg) | [Archive](https://github.com/yyjeqhc/webcodex/releases/download/v0.4.1/webcodex-v0.4.1-darwin-arm64.tar.gz) | +| macOS Intel | [DMG](https://github.com/yyjeqhc/webcodex/releases/download/v0.4.1/webcodex-desktop-v0.4.1-darwin-x64.dmg) | [Archive](https://github.com/yyjeqhc/webcodex/releases/download/v0.4.1/webcodex-v0.4.1-darwin-x64.tar.gz) | +| Linux x64 | — | [Archive](https://github.com/yyjeqhc/webcodex/releases/download/v0.4.1/webcodex-v0.4.1-linux-x64.tar.gz) | +| Linux arm64 | — | [Archive](https://github.com/yyjeqhc/webcodex/releases/download/v0.4.1/webcodex-v0.4.1-linux-arm64.tar.gz) | + +The npm installation path remains `npm install -g @yyjeqhc/webcodex` (Node.js 18+). + +## What can it do? + +- **Understand and edit code** — read, search, inspect, and make guarded changes inside configured projects. +- **Use the real toolchain** — run commands, tests, formatters, compilers, and project-specific tooling on the machine that owns the repository. +- **Work with Git** — inspect status and diffs while keeping repository operations visible and reviewable. +- **Handle long-running work** — keep jobs observable instead of requiring one model turn to stay open indefinitely. +- **Support human review** — use the Runtime Console, Workflow Session evidence, Jobs, and Git/diff review without a separate task/result acceptance subsystem. -WebCodex is a self-hosted execution bridge. The AI client calls its Server through MCP; the Server authenticates and routes the request, and a Runner on the repository machine performs the work. The Server does not scan your filesystem for projects. For the detailed model, see [Architecture](docs/ARCHITECTURE.md). +## Why WebCodex? -## Security and control +- **Your code stays on your machine.** The repository does not need to be copied into the chat service. +- **The agent gets a real development environment.** It can use the same files, Git checkout, compilers, tests, and tools you already use. +- **Work survives beyond a single request.** Long-running execution and evidence remain observable through WebCodex. +- **Start temporary or run it long-term.** Use one-command sharing for a quick session, or connect machines to a self-hosted Server for a durable setup. -Your repository stays on the machine that owns it. Tool results, including requested file excerpts, may be returned to the AI client. Register only projects you intend to expose, keep credentials private, and review changes before accepting them. WebCodex can read and modify files in registered projects and run powerful project commands; read the [security model](SECURITY.md) before connecting sensitive projects. +## How it works + +```text +AI client + | + | MCP / HTTPS + v +WebCodex + | + v +your machine + | + +-- repository + +-- Git + +-- compilers / tests / developer tools +``` + +For the internal Server/Runner architecture, protocol surfaces, and authority boundaries, see [Architecture](docs/ARCHITECTURE.md), [MCP](docs/MCP.md), and [Authentication](docs/AUTH_MODEL.md). ## Platforms -| Platform | Quick Trial | Everyday setup | -| --- | --- | --- | -| Linux x64 / arm64 | `share` | Server + Runner | -| macOS x64 / arm64 | `share` | Runner connected to a Server | -| Windows x64 | `share` | Foreground Server + Runner | -| Windows arm64 | `share` with an explicit supported tunnel option | Foreground Server + Runner | +The platform capabilities below describe the official upstream release linked above. -The default managed Cloudflare trial is available on Linux, macOS, and Windows x64. Windows arm64 tunnel details and service limitations are in [Deployment](docs/DEPLOYMENT.md) and [MCP](docs/MCP.md). +- **Linux x64/arm64** — local `share`, Server, and Runner workflows. +- **macOS x64/arm64** — Desktop local Server + Runner, OpenAI Secure Tunnel, local `share`, and standalone Runner workflows. +- **Windows x64** — Desktop local Server + Runner with the official OpenAI Secure Tunnel, plus CLI + Runner, local foreground Server, and explicit `webcodex share --tunnel cloudflare|openai|none`. +- **Windows arm64** — CLI + Runner, local foreground Server, and `share`; managed OpenAI `tunnel-client` is supported. The pinned Cloudflare release has no official Windows ARM64 artifact, so Cloudflare requires a trusted explicit/PATH `cloudflared`. The Desktop installer is currently Windows x64 only. WebCodex-managed Windows Server services remain unsupported outside Desktop's owned foreground runtime. -## Documentation +Windows and long-lived deployments are covered in [Deployment](docs/DEPLOYMENT.md) and [MCP](docs/MCP.md). + +## Existing Servers and advanced setup -**Get started:** [Quick Trial](docs/QUICK_START.md) · [Full Setup](docs/PERSONAL_SETUP.md) · [AI-assisted setup](docs/AI_ONBOARDING.md) +If someone already provides the WebCodex Server and connection credential, use that existing Server and follow the [Full Setup guide](docs/PERSONAL_SETUP.md). For a normal Windows/macOS personal installation, use the [upstream Desktop guide](https://github.com/yyjeqhc/webcodex/blob/main/docs/desktop-install.md). Use [Deployment](docs/DEPLOYMENT.md) only for production hosting, multiple users, systemd/Docker, OAuth, proxies, and private CAs. -**Connect clients:** [MCP](docs/MCP.md) · [CLI](docs/CLI.md) +Those are follow-up operating concerns, not concepts a first-time user should have to learn before WebCodex works. -**Operate safely:** [Security](SECURITY.md) · [Deployment](docs/DEPLOYMENT.md) · [Troubleshooting](docs/TROUBLESHOOTING.md) +## Documentation -**Understand the system:** [Architecture](docs/ARCHITECTURE.md) · [Authentication](docs/AUTH_MODEL.md) · [All documentation](docs/INDEX.md) +- [Upstream Desktop installation](https://github.com/yyjeqhc/webcodex/blob/main/docs/desktop-install.md) — recommended Windows/macOS path: Desktop + official OpenAI Secure Tunnel +- [Using upstream Desktop](https://github.com/yyjeqhc/webcodex/blob/main/docs/desktop-guide.md) — projects, connections, activity, and background operation +- [Full Setup](docs/PERSONAL_SETUP.md) — CLI, existing Server, Linux, and advanced regular Server + Runner setup +- [Quick Trial](docs/QUICK_START.md) — temporarily try one repository with `share` +- [MCP](docs/MCP.md) — ChatGPT, Claude, authentication choices, and MCP reference +- [Deployment](docs/DEPLOYMENT.md) — production, self-hosting, and advanced operations +- [Troubleshooting](docs/TROUBLESHOOTING.md) — connection and runtime problems +- [CLI](docs/CLI.md) — command and credential reference +- [AI-assisted setup](docs/AI_ONBOARDING.md) — have an AI agent help configure WebCodex +- [Security](SECURITY.md) — security model and operational guidance +- [Documentation index](docs/INDEX.md) — all user and contributor documentation -## Build and contribute +## Security -The npm package is the normal installation path. To build the binaries from source: +WebCodex can read and modify files and execute commands inside configured project boundaries. Use version control, keep credentials out of prompts/logs/Git, and register only project roots the assistant should access. Tool results, including requested file excerpts, may be returned to the AI client. Read [SECURITY.md](SECURITY.md) for the complete model. + +## Build from source ```bash cargo build --release --workspace --bins export PATH="$PWD/target/release:$PATH" ``` -See [Contributing](CONTRIBUTING.md) for development and pull request guidance. +## Contributing + +Contributions are welcome, including contributions created with WebCodex itself or other coding agents. For bug reports, development workflow, and pull request guidance, see [CONTRIBUTING.md](CONTRIBUTING.md). ## Acknowledgements -Thanks to the [LINUX DO](https://linux.do/) community for technical discussion and support for open-source sharing. +Thanks to the [LINUX DO](https://linux.do/) community for its welcoming space for technical discussion and support for open-source sharing. ## License -Apache License 2.0. See [LICENSE](LICENSE). +Licensed under the Apache License, Version 2.0. See [LICENSE](LICENSE). diff --git a/README.zh-CN.md b/README.zh-CN.md index 2d664a662..4f3e709cf 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -10,8 +10,8 @@

WebCodex

让云端 AI Agent 使用你自己机器上的真实开发环境。

-

把 ChatGPT、Claude 等 MCP 客户端连接到你已有的代码仓库、Git 工作区、编译器、测试和开发工具。

-

快速试用 · 完整配置 · 文档 · 安全说明

+

把 ChatGPT、Claude 等 MCP 客户端连接到你已有的仓库、Git 工作区和开发工具。

+

快速试用 · 下载 · 完整配置 · 文档 · 安全说明

MCP 协议 @@ -19,81 +19,126 @@ Apache 2.0 许可证

-

- - - AI 客户端通过 MCP 连接 WebCodex Server;Server 将获得授权的操作交给你自己机器上的 Runner,由 Runner 使用本机仓库、Git、测试和开发工具。 - -

+你可以直接让 AI 理解项目、修改代码、运行测试、检查 Git 或排查问题。仓库仍然留在原来的机器上,不需要为了使用 WebCodex 把整个项目搬到托管环境里。 + +## 开始使用 -## 先试一个仓库 +### 只想先试几分钟:临时分享 -进入愿意让 AI 查看和操作的仓库,运行: +如果你只是想快速看看 WebCodex 是否适合自己,可以在一个仓库里运行: ```bash cd /path/to/your/repository npx --yes @yyjeqhc/webcodex share ``` -这会启动一个**临时、单项目、能力受限的试用环境**。保持命令运行,按输出的 MCP 连接信息接入;退出命令后,连接地址和临时凭据便会失效。准备条件与 ChatGPT 接入步骤见[快速试用指南](docs/QUICK_START.zh-CN.md)。 +`share` 会临时启动单项目、受限的 WebCodex 环境并给出 ChatGPT 连接信息;关闭命令后连接和临时凭据都会失效。它适合试用和临时分享,不是日常完整体验的默认部署方式。详细步骤见[快速试用](docs/QUICK_START.zh-CN.md)。 -## 完整配置 +### 日常使用:完整 WebCodex(推荐) -日常开发建议运行普通 **Server + Runner**。Runner 在代码和工具链所在的机器上工作,Server 为 AI 客户端提供通往已注册项目的认证入口。完整配置支持多个项目和完整开发流程。 +如果你准备让 ChatGPT 长期使用自己的开发环境,推荐从 **普通 Server + Runner** 开始。这是 WebCodex 的完整开发体验:可以长期连接多个项目,并使用项目探索、编辑、Git、命令、测试、长任务和代码导航能力。公网 HTTPS、Cloudflare Tunnel 或 OpenAI Secure MCP Tunnel 只是 ChatGPT 到 Server 的连接方式,不会把你切换到另一套受限体验。 -先运行 `npm install -g @yyjeqhc/webcodex`,再按[完整使用指南](docs/PERSONAL_SETUP.zh-CN.md)配置。公网 HTTPS 或 Tunnel 只是连接 Server 的方式,不会替代普通完整配置。 +Windows / macOS 普通用户最推荐 **WebCodex Desktop + 官方 OpenAI Secure Tunnel**,直接按 [上游 Desktop 安装与连接指南](https://github.com/yyjeqhc/webcodex/blob/main/docs/desktop-install.zh-CN.md)操作即可;CLI、已有 Server、自托管或高级配置再看[完整使用指南](docs/PERSONAL_SETUP.zh-CN.md)。 -## 为什么用 WebCodex +### 下载发行版 -- **使用真实仓库。** Runner 在你机器上已注册的项目目录中工作,直接使用现有 Git 工作区。 -- **使用真实工具链。** 在配置的边界内读取、修改代码,检查 Git,并运行编译器、测试、格式化工具和项目命令。 -- **看得见长时间任务。** 超过快速响应时间的命令和检查会作为 Job 继续运行,可以查看有界的状态与输出,也可以停止。 -- **方便审查工作。** 项目策略、受保护的编辑、Git 差异、验证结果和运行记录帮助你核对实际变化。 +下表链接到**上游官方 v0.4.1 Release**,版本比当前 fork 的 `main` 源码更新。Windows/macOS 普通使用可选择 Desktop 安装包;Server/Runner 工作流可选择对应平台的 CLI 压缩包。[查看发行说明与校验值](https://github.com/yyjeqhc/webcodex/releases/tag/v0.4.1)。 -## 工作方式 +| 平台 | Desktop | CLI / Server / Runner | +| --- | --- | --- | +| Windows x64 | [安装包](https://github.com/yyjeqhc/webcodex/releases/download/v0.4.1/webcodex-desktop-v0.4.1-win32-x64-setup.exe) | [压缩包](https://github.com/yyjeqhc/webcodex/releases/download/v0.4.1/webcodex-v0.4.1-win32-x64.tar.gz) | +| Windows arm64 | — | [压缩包](https://github.com/yyjeqhc/webcodex/releases/download/v0.4.1/webcodex-v0.4.1-win32-arm64.tar.gz) | +| macOS Apple Silicon | [DMG](https://github.com/yyjeqhc/webcodex/releases/download/v0.4.1/webcodex-desktop-v0.4.1-darwin-arm64.dmg) | [压缩包](https://github.com/yyjeqhc/webcodex/releases/download/v0.4.1/webcodex-v0.4.1-darwin-arm64.tar.gz) | +| macOS Intel | [DMG](https://github.com/yyjeqhc/webcodex/releases/download/v0.4.1/webcodex-desktop-v0.4.1-darwin-x64.dmg) | [压缩包](https://github.com/yyjeqhc/webcodex/releases/download/v0.4.1/webcodex-v0.4.1-darwin-x64.tar.gz) | +| Linux x64 | — | [压缩包](https://github.com/yyjeqhc/webcodex/releases/download/v0.4.1/webcodex-v0.4.1-linux-x64.tar.gz) | +| Linux arm64 | — | [压缩包](https://github.com/yyjeqhc/webcodex/releases/download/v0.4.1/webcodex-v0.4.1-linux-arm64.tar.gz) | + +也可以通过 npm 安装:`npm install -g @yyjeqhc/webcodex`(需要 Node.js 18+)。 + +## 能做什么? + +- **理解和修改代码** —— 读取、搜索、分析项目,并在配置好的项目范围内进行受保护的修改。 +- **使用真实开发环境** —— 在仓库所在机器上运行命令、测试、格式化、编译器和项目自己的工具。 +- **检查 Git** —— 查看状态和差异,让代码变化保持可见、可审查。 +- **处理长时间任务** —— 任务可以持续运行并保持可观察,不需要一次模型回复一直等待到底。 +- **保留人工审查** —— 可以通过运行时控制台、任务状态和 Git 差异查看工作结果。 -WebCodex 是自行托管的开发执行桥梁。AI 客户端通过 MCP 调用 Server;Server 负责认证和路由请求,仓库所在机器上的 Runner 执行具体操作。Server 不会扫描你的文件系统来寻找项目。详细说明见[架构文档](docs/ARCHITECTURE.md)。 +## 为什么用 WebCodex? -## 安全与控制 +- **代码留在自己的机器上。** 不需要把整个仓库上传到聊天服务。 +- **AI 使用的是真实开发环境。** 文件、Git、编译器、测试和已有工具链都可以直接复用。 +- **工作不局限于一次请求。** 长时间执行、测试结果和相关证据可以继续观察。 +- **既能临时使用,也能长期部署。** 可以一条命令快速分享,也可以连接到自托管服务长期使用。 -仓库留在拥有它的机器上;工具返回的结果(包括按请求读取的文件片段)可能传给 AI 客户端。只注册打算开放的项目,妥善保管凭据,并在接受结果前审查改动。WebCodex 能读取和修改已注册项目中的文件,也能运行有较大权限的项目命令;连接敏感项目之前请阅读[安全说明](SECURITY.md)。 +## 工作方式 + +```text +AI 客户端 + | + | MCP / HTTPS + v +WebCodex + | + v +你的机器 + | + +-- 代码仓库 + +-- Git + +-- 编译器 / 测试 / 开发工具 +``` + +如果需要了解内部的 Server/Runner 架构、协议接口和权限边界,再阅读[架构说明](docs/ARCHITECTURE.md)、[MCP](docs/MCP.zh-CN.md)和[认证模型](docs/AUTH_MODEL.zh-CN.md)。 ## 平台支持 -| 平台 | 快速试用 | 日常配置 | -| --- | --- | --- | -| Linux x64 / arm64 | `share` | Server + Runner | -| macOS x64 / arm64 | `share` | Runner 连接 Server | -| Windows x64 | `share` | 前台 Server + Runner | -| Windows arm64 | 显式选择受支持的 Tunnel 选项使用 `share` | 前台 Server + Runner | +以下平台能力以链接的上游官方版本为准。 -默认自动管理的 Cloudflare 试用流程适用于 Linux、macOS 和 Windows x64。Windows arm64 的 Tunnel 细节及服务限制见[部署指南](docs/DEPLOYMENT.zh-CN.md)和 [MCP](docs/MCP.zh-CN.md)。 +- **Linux x64/arm64** —— 支持本机 `share`、Server 和 Runner 工作流。 +- **macOS x64/arm64** —— 支持 Desktop 本机 Server + Runner、OpenAI Secure Tunnel、本机 `share` 和独立 Runner 工作流。 +- **Windows x64** —— 推荐 Desktop 本机 Server + Runner + 官方 OpenAI Secure Tunnel;同时支持 CLI + Runner、本地前台 Server,以及显式 `webcodex share --tunnel cloudflare|openai|none`。 +- **Windows arm64** —— 支持 CLI + Runner、本地前台 Server 与 `share`,managed OpenAI `tunnel-client` 可用。固定版本 Cloudflare 没有官方 Windows ARM64 artifact,因此使用 Cloudflare 时需要受信任的显式/`PATH` `cloudflared`。当前 Desktop installer 仅提供 Windows x64。除 Desktop 自己托管的前台 runtime 外,WebCodex-managed Windows Server service 仍不支持。 -## 文档 +Windows 接入和长期部署见[部署指南](docs/DEPLOYMENT.zh-CN.md)与 [MCP](docs/MCP.zh-CN.md)。 + +## 已有 Server 与高级配置 -**开始使用:**[快速试用](docs/QUICK_START.zh-CN.md) · [完整配置](docs/PERSONAL_SETUP.zh-CN.md) · [AI 辅助接入](docs/AI_ONBOARDING.zh-CN.md) +如果已经有人为你提供 WebCodex Server 和接入凭据,直接使用已有 Server 并看[完整使用指南](docs/PERSONAL_SETUP.zh-CN.md)。普通 Windows / macOS 个人安装使用 [上游 Desktop 指南](https://github.com/yyjeqhc/webcodex/blob/main/docs/desktop-install.zh-CN.md)。生产环境、多用户、systemd/Docker、OAuth、代理/私有 CA 等运维内容再查看[部署指南](docs/DEPLOYMENT.zh-CN.md)。 -**连接客户端:**[MCP](docs/MCP.zh-CN.md) · [CLI](docs/CLI.zh-CN.md) +这些是后续配置,不应该成为第一次使用 WebCodex 的概念负担。 -**安全运维:**[安全说明](SECURITY.md) · [部署指南](docs/DEPLOYMENT.zh-CN.md) · [故障排查](docs/TROUBLESHOOTING.zh-CN.md) +## 文档 -**了解架构:**[架构说明](docs/ARCHITECTURE.md) · [认证模型](docs/AUTH_MODEL.zh-CN.md) · [全部文档](docs/INDEX.zh-CN.md) +- [上游 Desktop 安装与连接](https://github.com/yyjeqhc/webcodex/blob/main/docs/desktop-install.zh-CN.md) —— Windows / macOS 推荐路径:Desktop + 官方 OpenAI Secure Tunnel +- [上游 Desktop 日常使用](https://github.com/yyjeqhc/webcodex/blob/main/docs/desktop-guide.zh-CN.md) —— 项目、连接、活动与后台运行 +- [完整使用指南](docs/PERSONAL_SETUP.zh-CN.md) —— CLI、已有 Server、Linux 与高级普通 Server + Runner 配置 +- [快速试用](docs/QUICK_START.zh-CN.md) —— 用 `share` 临时体验一个仓库 +- [MCP](docs/MCP.zh-CN.md) —— ChatGPT、Claude、认证方式和 MCP 参考 +- [部署指南](docs/DEPLOYMENT.zh-CN.md) —— 生产、自托管和高级运维 +- [故障排查](docs/TROUBLESHOOTING.zh-CN.md) —— 连接和运行问题 +- [CLI](docs/CLI.zh-CN.md) —— 命令与凭据参考 +- [AI 辅助接入](docs/AI_ONBOARDING.zh-CN.md) —— 让 AI 帮你配置 WebCodex +- [安全说明](SECURITY.md) —— 安全模型与使用建议 +- [文档索引](docs/INDEX.zh-CN.md) —— 全部用户和贡献者文档 -## 构建与贡献 +## 安全 -普通用户可直接通过 npm 安装。如果需要从源码构建二进制文件: +WebCodex 能在配置的项目范围内读取和修改文件、执行命令。建议使用版本控制,不要把凭据写进提示词、日志或 Git,只注册确实希望 AI 访问的项目目录。工具返回的结果(包括按请求读取的文件片段)可能传给 AI 客户端。完整安全模型见 [SECURITY.md](SECURITY.md)。 + +## 从源码构建 ```bash cargo build --release --workspace --bins export PATH="$PWD/target/release:$PATH" ``` -开发流程和 Pull Request 要求见[贡献指南](CONTRIBUTING.zh-CN.md)。 +## 参与贡献 + +欢迎提交贡献,也欢迎使用 WebCodex 或其他 coding agent 辅助开发。Bug 报告、开发流程与 PR 说明见 [CONTRIBUTING.zh-CN.md](CONTRIBUTING.zh-CN.md)。 ## 致谢 -感谢 [LINUX DO](https://linux.do/) 社区提供技术交流与开源分享的空间。 +感谢 [LINUX DO](https://linux.do/) 社区提供友好的技术交流与开源分享环境。 ## 许可证 -采用 Apache License 2.0,见 [LICENSE](LICENSE)。 +使用 Apache License 2.0,见 [LICENSE](LICENSE)。 diff --git a/docs/assets/readme/webcodex-overview-dark.svg b/docs/assets/readme/webcodex-overview-dark.svg deleted file mode 100644 index 9dfcc84cd..000000000 --- a/docs/assets/readme/webcodex-overview-dark.svg +++ /dev/null @@ -1,29 +0,0 @@ - - How WebCodex connects AI clients to your development environment - AI clients connect over MCP to a WebCodex Server. The Server routes authorized work to a Runner on your machine, where repositories, Git, tests, and tools are available. - - - - - - - - - AI clients - WebCodex Server - Runner on your machine - - - ChatGPT · Claude · other MCP clients - Authentication · policy · routing - Repositories · Git · tests · developer tools - - - MCP / HTTPS - - - - - - - diff --git a/docs/assets/readme/webcodex-overview.svg b/docs/assets/readme/webcodex-overview.svg deleted file mode 100644 index 3be3c64b9..000000000 --- a/docs/assets/readme/webcodex-overview.svg +++ /dev/null @@ -1,29 +0,0 @@ - - How WebCodex connects AI clients to your development environment - AI clients connect over MCP to a WebCodex Server. The Server routes authorized work to a Runner on your machine, where repositories, Git, tests, and tools are available. - - - - - - - - - AI clients - WebCodex Server - Runner on your machine - - - ChatGPT · Claude · other MCP clients - Authentication · policy · routing - Repositories · Git · tests · developer tools - - - MCP / HTTPS - - - - - - - From f4c839eec9a947e37b0feb5c0275b2cc4181345f Mon Sep 17 00:00:00 2001 From: Royee <98244131+Xiiiing@users.noreply.github.com> Date: Tue, 22 Sep 2026 11:35:49 +0800 Subject: [PATCH 3/4] docs: give README branding a clearer color accent --- README.md | 6 +++--- README.zh-CN.md | 6 +++--- docs/assets/brand/webcodex-mark-dark.svg | 8 ++++---- docs/assets/brand/webcodex-mark.svg | 8 ++++---- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 2aa24c788..2d2939f23 100644 --- a/README.md +++ b/README.md @@ -14,9 +14,9 @@

Quick Trial · Downloads · Full Setup · Documentation · Security

- MCP protocol - Node.js 18 or newer - Apache 2.0 license + MCP protocol + Node.js 18 or newer + Apache 2.0 license

Ask your assistant to inspect a repository, modify code, run tests, use Git, or investigate a failure. Your repository stays on the machine where it already lives; you do not need to move the project into a hosted workspace just to use an AI coding agent. diff --git a/README.zh-CN.md b/README.zh-CN.md index 4f3e709cf..9d4a3def3 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -14,9 +14,9 @@

快速试用 · 下载 · 完整配置 · 文档 · 安全说明

- MCP 协议 - 需要 Node.js 18 或更新版本 - Apache 2.0 许可证 + MCP 协议 + 需要 Node.js 18 或更新版本 + Apache 2.0 许可证

你可以直接让 AI 理解项目、修改代码、运行测试、检查 Git 或排查问题。仓库仍然留在原来的机器上,不需要为了使用 WebCodex 把整个项目搬到托管环境里。 diff --git a/docs/assets/brand/webcodex-mark-dark.svg b/docs/assets/brand/webcodex-mark-dark.svg index b34630dcd..17bb77609 100644 --- a/docs/assets/brand/webcodex-mark-dark.svg +++ b/docs/assets/brand/webcodex-mark-dark.svg @@ -1,10 +1,10 @@ WebCodex mark - - + + - - + + diff --git a/docs/assets/brand/webcodex-mark.svg b/docs/assets/brand/webcodex-mark.svg index e46af0f22..3a0b23131 100644 --- a/docs/assets/brand/webcodex-mark.svg +++ b/docs/assets/brand/webcodex-mark.svg @@ -1,10 +1,10 @@ WebCodex mark - - + + - - + + From e74ff0feae2c609b07e917a2b59802595dcb8385 Mon Sep 17 00:00:00 2001 From: Royee <98244131+Xiiiing@users.noreply.github.com> Date: Tue, 22 Sep 2026 11:44:33 +0800 Subject: [PATCH 4/4] docs: use the existing WebCodex desktop icon --- README.md | 7 +------ README.zh-CN.md | 7 +------ docs/assets/brand/webcodex-app-icon.png | Bin 0 -> 44647 bytes docs/assets/brand/webcodex-mark-dark.svg | 10 ---------- docs/assets/brand/webcodex-mark.svg | 10 ---------- 5 files changed, 2 insertions(+), 32 deletions(-) create mode 100644 docs/assets/brand/webcodex-app-icon.png delete mode 100644 docs/assets/brand/webcodex-mark-dark.svg delete mode 100644 docs/assets/brand/webcodex-mark.svg diff --git a/README.md b/README.md index 2d2939f23..f0f8fc13c 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,6 @@

English · 简体中文

-

- - - WebCodex mark - -

+

WebCodex

WebCodex

diff --git a/README.zh-CN.md b/README.zh-CN.md index 9d4a3def3..6c531f446 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -1,11 +1,6 @@

English · 简体中文

-

- - - WebCodex 标志 - -

+

WebCodex 标志

WebCodex

diff --git a/docs/assets/brand/webcodex-app-icon.png b/docs/assets/brand/webcodex-app-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..490b4e1ccdebba818378fbb9169cd405cb6a79e7 GIT binary patch literal 44647 zcmZ^}Q*_1ADoWCbaCmSaARvgcG7@SaAfW$kK|x@k{#*22Dl9-iYMEpuL^ZrNuKb}3|7vNT z=>E{Q^<^BDVxxgs!@!bkQ>cN(4bh~MAi-cspuqERxsga<(31f~OLUzmDtO3ZVkqEX z8A+Q(#AL|hkDh&Z8OyIYZEpiJTV8ffS!Y?g`vs{9Zv0=Hf4+Wpssk=R`J8^b|MV$4 z=3H|1ob2xDS^B`0wVm5P?sP7xv-BuBs)PTJOPk9e3jgtmixcF3>`_GQ{~!PV%mWxO z96bY6(x-|GzyDta4#=#X|4G|`{Et34ctQW;P8k&7f8@@>0xkdVe1kE|FzY|VXP{p3 z6Qa-d{+cgG{QvFo$Y+%Me|)6&{*R_QIm`b^hZF4o34*WS{Qu?meQlutxBWY!jN0sf z!DgDz|Ip2gVr2u;yJPrsX$%2$REzytbsO#l z{ae@5o#tklm`28L6!7V73ZyMWqBzj$=%+yy4ygtqx(!n;WVOo2> z;e2?{6#r`balXaWBFPO5xcA^kr8fMMtqZ1qcgJ2f^1Q_yu9N*S?0C_A^~cJbs}|br znL9psmcF+feE->3?{py#oE@SLoE_f81oF)0-}wtEU$=A~$gOoef^}{YUFj51w?C=b zAjWYJ?Yf~#BC>tCv%{!^?{V|rI(HMH-ck-?wqs!%XV(sYzEKF<3JA*YeyzTyyaHSw z`&62|80Kd$lbQN*r@50!v!p1E1Iqa-3<{2{4kmHu@jk^@|ksl9~k*6f-iHM zeJGZjI>B%pyxw|r1wrwf_7>xM@~ugl2JKdFCgDEfKMoO+;DK;`0bjDN22wcXzY4yi z!wAKI^<|D%p;u2yMzQnfYnq|M0rPS5L}jeS4SF&!oE8X#Ln=uY0#L7pJ4THKE${tn z?T~|WhoL8?JN35{iSAZ${wy!nht6Fr_`o@T@6Vkhp-^Jd0Ne*?w>N`IYpIuR&&nm7 zPXZuuAWvWDccY*Fcppj}-c`rkKK6^XRUdi*=%?pJJMy6;#|=jwDsh*n(4U!hTPq1u zcD#E};)mUtAm&qD;+)W#cAa(qA;qcH?swFojh3D#wIwH~1wVAWuu9OkzRjmIEU(^u z=HBnBj+XVm)N!9Z(079YB%FjmYbBO2=|?tUv`QTkyAv<)*}L2L{dlnmyd4RTr9y-4 zua`5W(=5I(zAoB#_zlv**)X`5j+s&x%g`%k$Ch*!IvPOHZV4t)P#c5qO#qwZKWj zQlF*xhnK9MP{i){=fol07`o7q5LKWjl%+r;bq*sj!n@F(t6x&xx?wL&*PE_iIO4jZ z-Bm5MZlCdSe%+4WKgYZdhSh=hOuSXht_LW zESR}Hh3>^HoZ)|nJIXP}-ILu>w(FUbyoQK>nI>i0RZ%l$hy6!y%M6?F9Z^;yezWA| z)(o3WxXBql>N;o_!Qp_-?u%hI38(>m`u>gtIwH@Y8GK5 z)G;wSL^VqC=g!9_ai*90y}pzaBx^?x$gyJg;Jh{#-&8d4)}DHS$h6AIYh%^_?UwjR z$AVu>+6Pn$*gowPAttIr7Fr}^H2UnFN-#P&O^vC~}iwtHVWc!UZM5Mw#uKv&Q z33k4Y&-EL}{cn`WBo;bvh#+2OueGcFu7sA?%u!M=ulKfj7?I+{hP$tarmsi;G?D$D zzxxil>W7G&eZM!V*OPjftOAcUs+Z2)Hs^>O?|kFOxF6wbMcChR!0}(dr_wV80o#9z zJ=G&GquqqrAX)_F)xk-)fX8M{>n|bxr#%G%b=>@~-~|4Gp6tS&CPQoG_W;6az!jHo zS27;{-^cu8%!OmbQTibVj~Jp6CKQkN+>K7F{*n=*9{0QUmG%3_IMTj_JXIC=O$cVk z;Xy8t!Pxg#4_j^rskjA@VU%Fq%q<69ag$~?AVxgShpAKMpk9jAmsoSKy~aO00=aV~79t_B2O{DPG?=kpIAn=; z`kw`V{Wxmn`rRRbEpyofj;;-ZdGvb>!4ZCtZ$;YZv9lFigj^@v2`zv18FB0p98E&+ zZWb;^H-YzUZT{~8Sg3oewvU1GxIyx~5p9}Zd-nz1r%SuRf?u>q;C4;ELr;70%lQjn+ z?3=`I3&L{9bFyGAcPIJ{M+kAM<5v&UHI^Zq-PSRT#?P?4FR7*iV{x=o*@k$Hfpop>3>$p*y48ToGiZsLYhQSZFxt~W8j(lKB^eLLXiD*}7K%ie!FCtx~r zRmwlgHTQ5+vXM1t|GEos?b_CVaoUG)Y1D}h^?GGN?u3Hi=+?yx`$&U7@{^gTgHg_I zx93*2c_(bA9p_vfNN7UWKLQ9g!9dw1-c$?*3NEp#eCa$vF@pUd#tB0`jDn816lJN0afBS0N*>@9WnF!ZSfY*0Mcs3K6yvcyiete}1*5t~;%bCtddkZ8Dl}_MYJ+g!yc*L#?COW!>M+ zN!flHegjvDJoREh_hlX*Cbo;M5%=&x78^9beb3>T?hJT*CJBj!8@l}WR{>?8xk}}h z+`#$pI{oxWLu5WzR}paVQ086GDdKkl2BT+Q?VfX_ojYj#2ITc4?k|DYB_EdIW}Y5w z7kKy)r1Hsg3S73-x-)hCziEuF1_{_X!;S=6+Hsqzjwo@gAj9+dRqLd|K!{{M2vZUU z@C@eXoO;HHq(+yW3ewSAw7xnYV!7S^f=z8G6l;ZNtf9=b5Se0m5=O8xSM&|yefdt; zWhuigWcRttr&HsA&*=KY635d|bO5k|T_4MeM=>b*@9zyMhL?|Tq=c2oZtdy1?pMyf z7hS2S>>&a~J27yQ!V=_2+v3&0i^GkP zdH4F$+q#Hn<{hZ!$+CQI-j`1M_&Mgdb_iK7cCrSqrQIVkE%{6lFNSk#TK?mTDmRDJ z)ZL`PBovXGT6#mYv^J$=Q1cu`9Q;XeS+qZ%FUcEd6`iKWvu4jIkFGLg8=}v+;oOl) zkKz~ZaOCL)iuU5>QR?}xFF1YzLlOOP?Nr0*{SJ=Fd%eH`Uy4KLc~^0A%ZSTlFe%MVBDu47H{o={1juRV#(fOeE>%ZKHwy<$7A2Umdgnk*{Nmdy?>U2 zX!A8Q3bQQm6$0<|NG$v{>suS}aD}=lyq2TqGwfxW-r#XHG*-6BFkOr|`Jx{{x%Dy? z2=*y-C)?|VKc8K2eAm0_K$9vUWFFqw&NUd4@wcnJaj3}dq7`Fd=;=XP?8Qj$y9g;L zOXs{^hLsTZT#>ZO?B80FMj!Jg%f)(!a=%kM&MW4`te=a+0*{ZjpF!TugwNJj|0CjF+q*mL-#go@+SM-W9AIxBneWW@Oy2*h z_0xZfj+FzAEX!V*m{wi*=di4zj5`R=W|;;rsCz*?zixa1$DPdLLp#0fOZM>ARLly& zYjJ#$nTE+S5)d}d$xdD_rp6hTq0Ae9kfL4NiAXRSz)Be@d%EGYA5?@Q=2b8#WHDI8 zA@kw1a{Yy1&s2!qj%Za-AylvoNHs!%+Mb1EHnLJ8fP9!RT+T}P6iumm3xP1m*i}g! z2X8g|F6XPoP*wu}i`2bk=`WgTW`d!SL1XwQlm5qP1-T48JeOkzTDd6=89SI2yiyw8}8Eo3D zhfv5P_Civ%kizYCEVJ6*Y0WxIbR$P3=WJ2dU#om%=zP&DKS|*dNZnDTBv*K-*21hL z&FhS$aR%5XhR2M^F>(y>pjFkArSPaZl+-MTOvpQH0WuaKV}ftlcm1w`xy;DmqgLaG ziu%}AeC$K}fH|x0Uh3~U?!3Fo6`1}r;H}KQ zSzKh-O`JqBIspRox>=A{FEq~P!>|m%j=N|1Af9XK+mj7 z^~ovcWR}jK7>kE-+FO|<7NVr@9z1^f`s6WPz{+3e1qtw>=brk*x3NL-{JSZZRigur zfl>&4>^(OC#~P>h_TzQnYlf-gyG0blU5@diu=y@0^OfWFi?oHQ{~1c&kn@s`e#rNa z3*y#CtYgEst`*MuzoJ`_wugu2-!||#|3+4GgnP8~vlQuuTl_zC-=gR|p=r9H7G2fO zjxF(Pw!A9;WzrHMAJtIZ!G#Tx#4Tt;D<%(+6`um>$R`ToZ|a`jUO7 z+pSSB$d6YMZf2r%&#A%CzdFe(`4(6-{Ms7|;6p73JFvf?re}y`ufDJCV5GseafuXr zjpufl1#dzFeO7KhK>=quP4FmOKj?iv&w+XTCYuF|0G3wlSz`~Z);(a~56;#DyraXI zyAL7!aa@l9;kwCrOBJJu0xr|JoB(E-m=6n|gk&caM%C-wpYd&aMxm5VbjT1ThcCHm zIOqVLEg9Z6?5i13kRWA^9}fpd=vxKegz24F28UKM@nAv3A1i`X%P$;!sCxR0Q@ z@ZG!+nkYGISC6;0UN8Jj$051X@_pjadba(zJ4h_a=GhD1*psikGTzPl`z&(c+rm{d z0`v6LO{TR7`0G?~zNhEaN#GSBv7eKt^ZuMQkBid>>**KPYT#ah5NKQP!QXkO@ZF*p zD?7D+G<+fk;AM8MQY^~XAybkJuKODd{ALZ+czshF?u!7GkPfw=&zQNGre_M`$Lpye zt5g-8BvaqQKD`;9Fi}5YVU!aXnE)ykhOG6uR97h07AJI1DS~oYRKyZ7!l>7b(C>40 z$!kf2F|(~F34oU%npqOu$M3=Z5+?cY%B(Wnf6M`evCcz;P)L6X+X-vm=jR3hro^dT zPmF{0!rH_RPnH&Q{IAx`UaqmI^`BS3399(lDbq%9nrSB2g%3+$Iy4_sSp0MReO4z= zUr;r17ijMny5rpyT730Wteuf}Dw!FCj_h2hxLkUU+5d*g2djWe=(WTurltxe(ZMUF~MFHVFb~HBM;J4a%cu%?ppb zs=@G;uh_FbmUUc}qssoZY#|ejye(>cZVst-#5Mn1xU}ILzuiwKlErjh?82a5oA8>p z_pDK`@wvh4s*i}PFv2%uEV%Q?&*IMXVz`CBzv(ataaP{Iv))ZaPT;;`E#Bn@yD7N< zaR@<}d_LrmU7tr7+B0-2vDOeH5ztmCh;3N|p=eEmYCAyY6?X`Neu-8*iG0ZOg&Z9~cTLr6T5fU9d>-nZ?={PicFLucxI%>+( zPwMDN!>`%#9exjQCov$7ZfrMJ7rP!{POI+EoZl5U51dscfB|})Q47~-6X&bP5Wm{u4WQ#tHu>q%nlqrvU zmLo}e>h|VPHbIP)q{(#JLY9G>w0%$%V--NUp>Pmu7)T*asucAYjv6U*`wn_rk#b0R zA>j|E8YA1~ySXW%J&vC;rR8R+=#(I`KeuOCgmOo!JWDA|_-SI2HNg^voS@3yGuM#) zXnNX@6=j?>o_^>G?LBdB4gTT66Df%AH{k9=c6dK9y1RAo=gMtD;!|`yUFk42vNdvf zoLN>-2jMZB+eLEADJST@iOGH+d7K&D=r{4*Oh!q)DidIpaw-hWzQ$cyRKF3_e0 zE|l~bTy&NKa6!PqxzV{h=3?%&3_k{VP;y=}yqj{_@ zLyPNR_QPXuA^?#@8DEKo`8f!0vu5j;CdU?QGf)Epg|izYr4sJ~YpaPKQS$iG9whsE zM7TYRGfID1f4yKibT9m1P=5`J9EzJz#GqWhKjS#MB@22Yk3(9s(}eBu{V2Uh@Aw1H z<2ChnezWlm@DJ~nIXMYW>F>GPU6KrG)hxKN|5_fE=7Vdq@X9{ix~04fx49RryT(~$ zI7<(=qTOl=a&zYv>KeGE;8Wj_H8N0W6rM#W$a>n_qOh+wU@wyS=kTwitv3X4NVR`8 z9`Y=}5=8elaQ|##YE{tJ!+FZ+PT?mgIbeJC;8*)=;x2UC&&yBPPJ*P?z4XFOv5h;U z<;{Y+UluQbvjdCShc~9$QwWQ^O9gQOvQ2qqkSw~NG_gZ`SwwtMQs$o{H0umbWLP(7 z{g-#{VIm_-%q_CddtfNK;a5Qiz94w9W&#A4opQR-R1VP?A+-QN@85VLx2qn&X*b~Q z;kFm{23YMWo=MK~gsOl8osdJ^P&28{WdQs9vQaWkrw9Qk)l&tk7cx#LozZ@v56anu zrJGhHlLYak^e-jNa$2;2Y1GG%p8l1;BUJX|pPnX~Q4Kbj7FL*la`#faa$*ZF{EiU%G3H1ej6?oTMQdPf|gAxA=5=3h*g42?MXwn#K zjk(~eL=*ZIM5W>Z%7$#9a1m|lluWN#7GYkXheS2<%1P!oZxA%^ehAAsw(ohP7l5S{ zFwunDJDD2^ouOxc7o>p-ui!-5)85`o?#rjnGnZX`RR`zE=$neyYvwJb| zC@j6l1FztKzB<*BaZ@^nIfsyxu+!e-!ee*P^5IBT%()kmmTR z1M`WzWe+NrV7R_vP(}o7P($@b#|N1@KUMOo`vm90=FEs_-3=Y66|BE>6q?@Y z+l_Hmq5Dd%d5MNppI%RO08QT58(fMCXcsG^RVL@g*Svsm3AXGaroySL=_&29qZpUJ z;DMN2a9O#0I3d0^3Qf)b;ox~mp=Q;0cf8yW?NmY8bb2jg)R0XlL#Juw*C)^qJq$dP zWC@)02CV!N^#6@6Y=s+t=*ju-fghF?R8IdCS2;+6w`w~*k2yu7@?R2(K@JbwImhqC z<`Cv)1HYK`U-@r6w2mNi%e%z zV2X9(ebV&xpi{MxNT1|BzvwFLnT=Q8vCKRZJVqsq_xf%Ai_}vRT)}~ZC@W;$)U&@* z_*;Q#@2|H%_>(V(Y%DA9@9XcD3n`M)vBG#129i|rU?Tj(|6Zm@hCe^oXl=SogEBe< zuIy|mRlyXagxlS%0_0^L0yAx6jcr2Fps}=B4x;2vdW4(i4(?2nV16?#nmk3K5^M2% zrhnV>i@fGSq6zsUX= z)A=7FOe9QN^ZjX{wIb5v2Lh#hL8_%`Zb+#E<2ZP1f5a38mAuzWSkfkvL^66i#+6{0 zQ z=N#DYBMJ!b;VsPDpwPnKl(jOioRZkqZ&rxORG5xwzh_7-#%-3lH0T>Axb%oxE#M8n z-Pt&FN0^gCsMSRq6d{XL+e!v28M^BRQ3U%GP)(Wv zMvj^Z7QQTjE8a|s(3_EZO%`0&eh(hQC?2eCPVYN0Sx7wdt^CyN-B01=jL0s#Usq5kVq< zGLBD!Zv%f2n5!JA%gjAux>jrgo}h4udCqio(!!%z1-PDVoOkX;lP7bJ=R!VZ96s_DQ z!WCO`2QA>dyYvu){duW%@o;A-(UB!*ra#&-_<*K^%l}=?Q7W5v!*I3XPH4vx2m&VG zmpE4JP%a$$T`Ik9Y3K}Trv&aa;k$Dv^f@d|>a4?-79a5U$?m`kw_d-I{4-`{~eEJ@#3ien6v9GkZ3f=3s7Bun1YIp zTab#a@PWgaa?<=O6Lu5wk3@H(hALFXx>+8OhSId)IQ=I>O$%3062>AAjJG}^BbL_%Fblo(fIEHYjktpr!euM?hc2 z540$ZYE}@k;L0}6q&r%-<%tHg<~KD&>9zdQJH|VrsX-!14y=5zK?&qcVd3bUaphWa z1%NvBE!J%2fb{^vMBI_A=4^aNuplCVnMB)(5*u>PwCeI?lHS;l2h=;V2daNb4cXP6 zx>|57C&2Bpho#ezcq})M;VZ)KLK96h>nJ#mmcdijEqEhUN?*9*oH>jktxl;PwkT%$ zZrKa8YCCvqiCl4yg!Eqq!e5?;pH{VYQ!KV^?QKB8qE}r(w+|bXs5f^dTH7iJ{Lp;W zgUkEJ9w?R;VbBWJ!V$H^@fUGavPE1(RqpuU*S8I$@MONCiZ83^_pA6GSd z!Fig1-Fty$>WX7$>~R)UCx*CtDg1=ol7nA`or4ZV2!axPI4Mcx6!ofz$AD&f7Yy>l zy>_Z%kNOtM$Xa!luQXYfjI;(Wl8HBmcAq0Rfmw#xkr2m6e(&XL4#^nj#34KuMX@@V zEy#*PUpObuuWzAA8+1BiE)xx|)9>OKPo&eOehLVbU;=lhdnho(T%k-Gc1XCsKWTC% zGtiX+yE2e&96FH8N9LkY6qDunk?s1tUi|7>MD+lM0B$AEoShXz%YBW{w9C3NMJ!M! z&^tD%AHk28YM#nrbsS3E%c@K6-D~rvBptR_9%Prs~Y6KxJg(zm%3|V2Q zgn@K4_6g2{`>y; zMhsyZ@OLk^@9bK<5AY~kP}&lVjbn}`y?Ulw!DO9sPKOl|a7m!yafOO=7(*Heq#}H< zjRe)bCH37|!{8O)l3BPl>J_cgu`yI|&twe~?RlNO4YARGJ?qky+a3gc5 z_gMVz%y0Z=pYE)B3ATP55kZg@`#-Kd`8o9X%MDT2#>*a5yn_iQV@({b5=%_Ls+vCs z$;hY0JQerDBNg@}%1K`hH58Dladn+MXoAemR~#pUS(TR(~GBC?IU?pP}D#*&Ck z=~ejd0Iu7I``!0nl9AG(W3OA_&_eE*%BHj4ng&65+ib~79g}WjQCQ_XyE4uaJd##Y z(iUkSZ)Axear5-F_mcKnA`y-OqAIh+Fl3Cfz8mhy5)HVr$C45@HT0-FaPuiR_^lO_ z`*Z{XUWuWt?Q{q~M##R@_HqRMlwPgOARY+^uKzWTUG0L^$VcmtZ?+HlKtR7e$5rdA z6f_mz)MOQsCpRinibIoT1_gdtM(SZT&sqQ`B_!)^l);wAOr(>%A~Z}p8qmhk9NdFl zIq&E%`rd?Y85ulw#BGwoD5SzLAW0JzU&Ns9A_N0Kv@65xuAUpa-828cLJo+~hN%bn=ywcqCOrrs<>t z)Y}Qwn+qFTkPz2%5+X-pJ$;A`Gt_>{>&RCpet4#?&L~1IR)$T%BcL!x7VV(1YD=V; z6I!hI58RUcfDIx0wcSvet}$h#roLMdb8acJT0|8A58Zh+$9Kj8`!KF8%ki9+mlb$H z&sBVVt0QI>X$ zDQpG<{A#6z(rl1Zi_~yL+9|>07e#czIM#|ET(F zq(i+qbe7DX5Y($}UnTX{q0GHPzQ<ro#Jd#bH0$dF~qqeBJ47P zz`%tlpCgi@`!JM0937@TdZ><8h)W#TfK(>`v!Q1$ub+)Ek*rQGoNS3iw}j?^0@KWy zDQRp*$mh*y8>amf`sQs1n%6~mXUN{pPV-Swa=)R+`p4J4M2`0>L9+drI8G5D-1Ndb z_{=Cj*lJ;(M>f~WaC$MBZwyjc+JwDw3F$||S(tzw@#GaiJS1b2Vv8pKg~e3`2wfVR zq?LNdH7ZG~<_l;5==jAD?GTV8g8#Ih0}`6C4<4o<^Byg1z#qPTxTfB%Ynl#=qDC5W zo)IM}Au-kD;*X}_;COQmC0u|VJwkHUcuDE&sez`I6ja4)rqZkN zR-Ltdis6=4m1WsA;=L-Ub;M6-0B=I?*0H}+$ThC*4%G!;I1y93`{E!rVuTN2T4x3y zuxlfkfnTlwx7)m}{5(h3Kpl;dML>~NvaBg3ia`3jVIi;{=MZ8%EeVE08~%7Yydotf zAxj0{S!6OIo@`jVgolQSqU;XDcrc6W1P254xuasTMsgNgxmDojEVl0V!ip6-E{Ie$ z<7h~`AgzM#{!vdo7tdqMKYbQ_%6~;fXyi%_YYM2JzY|x)l22D6WUJ#uO{5A{_GjP$ zBf8}^Dp1ET_G-+}&c10is5K&^xWSt{pU8K~mIA~t-;aIlS(atTi-?aB6r%3>GHxX# zmrkbzJ&;0==(~uvMjhc}4UCLyFb}MyI7d^ov`BWSrs$gemGNvDFlnj5wk)bb%J$IM zEYl!qeu(K7Ffkj%Xx35(X#diKinUAdVJfX8V){|2Rn-(>P9lqswKeSI^=G~ohDN*m33jz%IGBuR60?2%`3Pv8V;;k0+b|IYKr*G<0rG?Z7-B~<=WOeIy!LI zaW^TT_WX#Y7VVNO-6BmW`{O3w_K$<0G8Xmu&Q~)L-MNKvtx`Jdvao2mZKY_#apmeo zT2VFYe;OVbS-WCDrPbxLwf|+5Q0j1F$e)n@#lz^zB2abriZ`wc7F-Qnz+LkLnJoiM z0|scLS!vc?7r{Y*7pJ0zY_B@OD&ZjcCNrzx zR32usk_I^lhVzshG$}COn;|I;w@w*603=vKl2Y4B65%v(9?6Vr#&}dtA`+< z1-4Z7@;!l!7Csyr=?;(>lFQew=gActi}0LeGiarLhdV9ug~so<3DGpk~f-f2Lhbb7SIp&oA=o+ljv@S z@-r7KLEcV$Xt(EAiR~feIY~&u2$q@hA{KKDiRK_WI+82~39KMg7UO*p-Vmaa#bh|F z(7SyaV^FxFC>sv#3|vMpSJUF-;dVFnOR!-P2Qv{>(IlK*8Vnaw+gM4o3N%<6Hv$wY zr?(Die6?7n)2v{HdUBg_@${lB4hBq4W+6;(_fc$ywII1tz~-!26+JvQG?Q2e)y9_u zidZAiqT((8Hz#fyfu6htL9J#dfR-Q#4NT$R2a@W+jwT&M#rT{#J+v!BDZpZK8I5K7 zmKM^pf-EJNv;ZjT|u|W{HA|gFq)p{V& zR5se*k(SZeV)#TG}sa5LbiDt{iWpGA&dR6c0stt^u!(_cZrSS#y{9hX&d z+-j1WAcRs561CE(WvbMmaIl2puBuUl@7zzTAJi_2#*JE*hW&4^U{6t6w70hNMD9I` z21qFAC>rBtauSG)1o!-dU@CA7b2m@qN4>&AGdQX zNZflax<_~KNps$iVeFxe0LsUr1-}s0>$6#WMoZ$EKi^P&F)q<6pbE^+!lK^cA|)as zi{=v2odm*!qR^nD)zTtm(ui32S2Zr$KF+^6e#K$hM;sxu*q+c$;ZZ`$SOpl@>Zgcx zrOlBa9|5v>p-5WX@PJ85;LX;EB8M;+q^M%Q_WN+Q5oArE7`h%xdB^&Z)R%JZ3DBrA z{gwp4DjowuD3n4*A}!UOB&+32=PwbINgqH1UgRi$G9E{zT2tCR18zdfq-Km(+P`$|Y9=bkWqrBs?Tyyz~#C z>d8oJhoKh5)WR^bePC@|)o7PnZ3QROvuCXYHr${9#~Ze+)*U|ERaGXE zvQ&{4#zF`pG)b>;QxR&tIdJkJkh$C%*Q}SS7c!I)wH+8Z=1vQ`$Q|>aZs;tMOmqEPwqlB6?dEVLwxLoOUmXti=yx&UzszA7rKb^dWYJSWpT!r;=tQ*5}_2Lt( z!##iD!e}^PT@_f;FO-A?VI~sD4M14~?EkIj6t=reSX_b4%h;2~g42kQuuTps)XP>~ z1f8L4*$8OEeo*jG*bW#oD%8!ZW>OI1jg$|)$L;o?p-RQ1MwP(Qs?z9of@v0;Gj2P( zqck~)2xxhOA$b^$ng0qKF9i3cE&S7rZJ4X9c+ncEC{e))@($66E8IGWlA!@hnB zH|mvwXT1}j1c8Mc-;s&0Re|jrhgcSGccmXFZ-25;WKn||KNvEDW%L|9d%*ok49NVku=QQr5FH0AMa>mwP3cTHk5PBOcEyz14G_|#ASTWbGXa1W z9E3(Y6YJjrfT1*$|MZO5)cs&*$9dbQAsWuk4rWT+CzCJYbZrtyoSPPEGB}%lB3zHm zOLN1oSaPTtb)f6eF`eA7mK7U4;@Y-y$861ew|5xrD}_ZrPc6ncZ8POOG41>O)N6$k zrolM-t3ZKey<2y`I)vz=v%liZ&tMivjLel=QISWFQ&%?_^$vj;8-Nsy=#!8KV-J})M%uuv&b+)q9@`UY5Ng-S>OB$R7CG#v< zgG0QSh1w!8W`nq?&QC<@u){_2S;X?VYc@$2Ij>6t|AB6}2hT;Zu$jJI6#el?%TVfK zNN;zijn0v7C8^EUWqf@CSVZ@gKDoVgFbZR|%!T8h<-^3vo(jAPYC_qSf~5+H65#sjF=GQ&b3q`40_?n z+J~CH762vsn%vc75M@n5i94o&Y#jyihRCCn_m$--5HzB$0m$pYEQFU#w#SN?jd~zg zZaPu9ZaSiQ5ga4q!MpTm8T0v?q5g0}N&PcnX}zzP`DUX?G$e;gsbQ9#AYBeQqVq4Y zibw%{AVg+d(trh{RO%9i;|%KGjEeD;k^sqB1mVD&bfl64RthFkT2MKr(f<-=*tZBj zi=2cMtc-P?+b%i74U85$ zCbKCCzDy5&7fYa8phbd0{W3o6BFuNriX%IeZ3$X4*sBO{A^Ozw?geZ**LzL24J54K zHZIPCth{bPP8s!LA^Gj^8o$eH4QhU&)=Jh72La+vIlb~&Iq z0ZXECD`8Q7HA_0zQkf4e!G9-p|IN}6 zWOG)K5a9909@Ayb4odtb$ag8?KK;PtmoUaLSY;%t3$7v!d@B?QMY;W0iS=#%Ikg>t zENa<^hRkMc>?|>a1q@+R68{2o#ft+-_NTU!o-kCTcuqg@D1Ovy3$K8y@vMKkRUH6i zE$_ci^rk|1X&`%g*6Q~!c(dhk8q&;VV-Rz3MNNg*yuB=C>2^)O?`PfJ8l(gi=_ zPM^ZvNFIS7;7Sf%O9hV*l(1`IydzprP$7OSG+1EA7WTsng%CDT8RbnAQCZT_75p6Q zAbQJA!`)c%99PqeWs+bI69n?YTle_IC zp2^i$mq=qy56DIk$iR`?$n3naL8p3z;&gEPC=Mf->O#*mI5nT)wKcOiNL`(=tn2bmOGWuI4>!Blw?0+L1 zhB*D(ScD1o+h)VJyq;g;dso;!h%W&b;7&`sy?DQFfoxCMZSO18=Io`4T)#;!zoLi+ zVR)Hn5t%r%bCU326cK`T$wlzavSe42gS2g{G_sQ)ls7T=H+3ux6mo_@a4y+u5lQ=b zs<=2ew#m|(K2axi6Fyda2O9B|&C|j$=~!Wx)QkzO|K-S_4gUKY*fH1Mg9GCB-J9^d zoF_t8y9w~MXA%lx?{*TRs&Y~2M0HA33MN6e3U~MScz}QCcqR(QuLsnK6E(PI`x>l(J90ar?=ymEz zaUOO(a(z(+u9~F>7z6!jw;mTfUFGUakGbl3qDAOJ%C3WkRaF#%{&0*)a0>DAHla@s zl;EN*S~VzKQT)ysCy2;GOo4o2GfD~w9JM=O3hG56XJ^t0h^8|vXjbAk2Pa|^W>~hW zjKi$h%a=?OAzJi%T%f{&@JEi2WSZ>tfk7Ygr+`{Do)qgOF-m&X~ zZcz1j=Zq`_-$uP1>VOCCUbHR#Us6^ZRh*E$z|kRBGA(6|_WPfck$?NAZ6E|LrfKoj z#cj8gYt>(uGOTLrlYc}CN0RzTqx>UBIpH@=8-9zu;MgG?B(O#KssWrrD1UT++TVgfgBBD0-f0kEZpy8a3{PojjRb_S>cz!6=PSvqC3H$bvI9Dmugv4|zE?ks|8%2YZtgHfUdi zR3UHfVgIsHERR4?-zq*3Cl2IST3ZDhfe5Yz^WhJ=fP+ocIQ_C*m{CcFL#oHG-ECyc z@5R@lP{S`foSK_MKVoz)LyY}pmOQoWi2h)Lz=(J}UGn%1h3kl?#TKSWyR9qYH~y;K zL)W5UlKnpuxM@tne?rL?@9=lAto%O!3qPo@O8^Fm;XBTSn6fmIfzIM`<#ea}@8dED z3|p*!w4K8+_HVvJsqsUhmn?zP=T4)@J$X8brv%~N{3^ew_5O+TW!La$H#W-J^y0wZ z1PX)!O%rI7Q&Wqw)`;6w#-^Ay!#Y6-nbJ5-q&842*rs?>{YIhlmt0j>978gybPl>x zGhc2U6==uOVRd<`=fZmsZ|)18zRHI}18zF%2bSFP$}U}ZHC`qvhwxkS$;g)xYpu2$K1Oh^brE?tYp$gv|P<&xXG%NgM2y7=ApwORH5naJP+OFgVCPf3|lWiEq0~7sF$9e zcZD;Gb+-{SjbVtQD|%~12nacmK{!ktS`0eXD;$v$tMt`vWp+0%u45LJJ#ZZKV|{zE zaM^ z_>5E0+yS5*zkwec=FjPHp_eTxKQ_nbV*yyN3>*iE4N_PZV$A1)+_-QjC;ax4S*RHy zZB)YVIpprZNl$qx9Ju)-u8kDsVsb?SwKqzO-5(X8OMxzURt>NSy-|&Q>o%ri59tE>Uo&@tJJOq|b zITz-4p22Y6S>{Qw24SPc&tsUp3FCX1hzulKKtbs= z5g#ldznBdMP|hZk_5H)|w)!?aunb3DcrKjwqVM8Gxu5G6o#+`+YaC#-1b*Z8Sz?QL z5#ROCSHT^Z|0~>k)u&+Pw!3*sa6K|0IWO6yG(fOZNse78D85B)3UeARVHk?(DuVjo z#9kOj&{XzB%;qpKKf73>D8*c^`*oPA^Xq%>VHYy`@MHmIVu z0~tF{Q3NWBjfOYq8882Su;t3Jv*MjPDGBXz`uX*FTtLVU(fmI zEX?fK!i+b)cC%Zqzp-aP_DskqWyuL-)mjV)Wt{$UE+S%?jM5X7kCD-TlXntn5d}^{ zlN5I2IrbI2h@o;5g(mSBk`aYlc~1Zxuf-saZQK?R?78J>zwY7=9tK*5+duF+xbAgN zfnA^ZdnOd=x6BS>lP2yZhQyyEGa9j>onyoC630dq%{@V^KDuK8S>Y52La3n#p+E~} z)#|9xUVu{sNZpn+X0gJ1GJ;4s`CkmP_gsXm{)HE-&7)xzx+GA|M4$?+urj*nB`61 zTby-8Ez9&Hm4sZ4zz(t)lQyfO5YMI^D-vfIun_?#5o!UL;JL9wA5)C<-1xiW7Hm{U z!to7yQcrttJfUa%v*Vs02tFI^coIS6x{7Pzi39vt+?R%dN4dix?H zMaA-T2o?$f7OV=rNCHyQK&1K2%m@_Dgo(r!`ADTwqk(*?U(Ix+t(y(^Bz`C=u-ue} zKw4BHChxxt$3OM4u>E0YFd@akmY2^{Z0A7CO-QHmvQt3r>61??GqO zSo}n!6{k#U#2S$9!VK(u#IxYbfAeyVycXKe!GhJ(SBZ6Wi3$UNfSJSB1wX`kc^Zpu zursI)%46XZFf-n?1_0gsX4~RwVwG0PWJ^*7ghDR3paY^zr-8D0emRt3Qb!omj6fXM z0VgD`feLr0FgTKOstiGEDw5`1sm4>aS=i~0${C{@N zO|ZqnpHiceeEEXUJ{20>zZ*H-gz1YaLo7!Md zfLUAb&z|2{7%%_3$1KRR+{5oPQEE!D!9CtxIudq$?45AOKmQJ&_nxb{P*tN5-Sg*; zJ{h*2{y1*2uKM&+Mt+H^DCPb}q=%Hww=`vG0r*=r*eznqeq2 z@pC`&;$L&Ez0OS6^LQn*HM6*dH~tQ;M)zH@tR=7zsuGcxE)LWt?Eq2ERMLQ$XTSsZB={*wm>M`=}0EW3?}qxGtzH;bimiSV%CSNBo-B7;xy{<%nQrerpQ|3Xp6L z?R!f{z@7i}+pw2A1-9E_Yc*6W4*Te6>jS?taI2+L?av~$2u)YUmzy7o-ZUlFAqhW+ ztY{0O*Izk{h!Ql`hDf8Cd9!H^fSpcD^?EET+Z9R$E!H7CyEGP+xeStG9gtV3oe{uL zK{ve6j(Yq#AX!}UK7=b0_7~wZzy3DZ{qfIpm3pD2^TuT7XSZzQMZD-e^*DyT^?imD zwG9e+F3NT`l!a+M`$Q$lv0_!CY+`mo_get~D$mO#)RfWD;=9E?HwNR;hWi*B4Ork% zK+ic~5F-_Cec!7%Wf*w_L8ZmPHVxQv;<+rYvgGjqNe*3%pk@+q!TTFe04|~-K@YFV zSg5KHjcV3ZfU{6&EwWz1rZoV@hOY)9QI{NZeMf%B^-ZA+igTvikV(t z`+VC*veo}B-*yH+dz5l@(jul-y=Tu2UxY9I;a@Se^_I5Ek4YM9W@)<%{cZl=s_QhO zb%kj%4&*d>g}|n>j+i2kCkdQ9U8C&8PGKn5f&rb5`2`6@TqiU z(uYzK1U7C~Uca6*`p!kvyrWKyz!MY;97hkV7bF&19OD zs|{;~L7<7UOBKRKC}aYZVHV7bax4>|-aTvOS?s(B>k9PP2n6P3*D2sa>b)QRlNLVh z$v`srNZWqx&BNSLr?=W?o^dL)UY&98cCx-Qi4H}{3RQxMC<%;^q^&Wet08i>C{l$o z{qf@FH2`sv93v&H!=bCW|B7$}NNu>>GRF(3qk*`XoA$TS@TabmM(i(y8YZWsSGF;6%=hgX&U?`1P|D+D;GTaPgZ)Pz9hiq$a?XFM5%B@#%VYRE%h`@d5T8f-T9Pt1bi6!ec;zI8Vi>2;k z*5>85Mi7ihF6c@IY7}vjnMxbvT3)8pJc-?$8Nue&25cM!lpkqr>7a0;XB2b1(vy>- zTTO|wmVpXYTh0ra&;xo1JHF#Q$KbpDtWyBkJl}c!^HT#7#Bf zR2AV!YMRxQ>oIE)CKX^(%(jW@LktW>2GG!Ll!BY4L`Z{I+ag)mucsggS{xz@f^uQ7 z!4g-u;V46$%VH)`1^^bjJsM6U*oo6{lC}G`j=XuN z0b`KWfS+sCEWnr+11VHoQ5KB(oDQx{RN1g37KSVJM}F61;JBaoUfA;3hd>|fXfAJP zmS^fOEw)fijsW^Qw>o432@+UIB4h)|J3erg7O&;!^jPxCE}(YRG$}4PFr*~*uh79oO%`%VPN_&o)KJ5SU)y&7Z-YN_`fDLMScD{GHbKs~!JcaoDi4TF9 ztxK@&p^t+dPx*dWzVkM?@BMFqdp__^9w_2&&fKCG9|>JoQrC#Yq$7qAV+|0*a%w4D z&qfU!9fXz5hXh=KYZFn5lb&wrr;Hk8K_%m*L0qKSf`f*<@P@HRYuoacz=OTVgWmAd zaN={H4m^R+Tz&@`OS0xd#o0yA%j*z%yvVjJi9sz5`Lxns>#HlU=h_=M^z0{W0k+;B zD>*+zc{vlIy9ve%3C0^oX&XS%^VhWv%-b7~$K%m37Q%R%5*?*-jVPXpN?b(B5kfX^ zf$IM-PF)LEsg+!@mLe3&-dOVVhxK3$w50;Gk(@0MIx>(wcfiJ;JE6bhG%orX(M(9P z=AF5%E%?fjxUh%k$Zq}M0zZG~d_;fS$#BXGUJb`y@GSV!n|>CSZ@P|)yjxmc0-3xc z7H6_OkEmmNs?pSnf}lJk&~&-s2q7W+9CD(0fQ^FCO=>ppfs zy|_Ugy;-M|Rq*m2xI~1tn0WB`c>A-{?w8%DIlrvmpw1&nlK!0yrq-mH(M8^VKKp7B+D$pAVib}9( zq6wS4LcP#_UL6o4_%yZg0Hx1cNd}GPeoz$MviEM@l{G*vGEuL-`~xcKC~cA!v5 z8+KK&w?FmNlVOo_)BWok?!9~5O0?g@P1beV2%}}x@rFbIawzLm5Y-r!s4N^(-m|At zg^9EtVrgVZGVWIxd9xuIEXa3t^&qQ5kVNm>G@xlx&AdG89dxV)J_-StOCIaV-dfL?4d@^K`h2fX(3~ z1aV??m=0m=sjd)c!u&pzmF`My%H{ox=U+JE0dU;Qp5;V3?M4dPIEs5%NdQ(hfYKRk z?`vP(+k#qxc(iR_cDlk#QMDHzp{U-Q+c1BX3s?_5=S=vAKYufP=-qFJD=vQr{EwHu z$Qi3;PF4D|v+j4B8Z;szNMp7rc)2mL02Sz1)iN#gZ}QF}<LLuZoW zVw{`|pcd266OX=<*u=ctr2#9u6^fDa4ymA03v(8^dUVT}M$QNfnPhbF%yZ$03!lS< zrMv_qlj%K?m}_9>DY`&~zC z`&*f^?DYsGhgi$OKze;CvXqunfVcyE{L_8}dRvd;wJ}hL&A1jEgxo}#G0ZU88k`1- zF5ZU%W_Gw>HZc;gNjwU{HzTMPjtUhkxNCiKeb=8Mpfg8qgCn2zIQ}TXOQ{9D??-4X#3;`>=<=8K*t~HY_P9S@zu#taA$R z&@)blzkmDh!LR+oPci6a4h}NkU4LeV1u(ikE$Frwg$4!5Mw5;uj=5k3)2BU`(##U| z7YbCH=&{R1ghRRnNV$rGDJ0hkCPZ~P#2HKA6v-2e$p;(DAc~sm0E_E~l3!R!ohLMS zQZOD5EWhBXu;rY`bH`{|Oz}{`DIu|Fxe-6cj6DBf5}4qNP_76JtyvEQPlY=~2w~ z=Y=$k>^C{K-qs@)7v@`8dmp~r$e_<5|B#Ktn4^*(d+sIhcW?b&c=$sf0=t%%T`JI> zneiz>*B1z}J%&y@OA%`WSesqPngCDYBLJFE*sBw%QXqEMPEMg8=@4k*60j`;WvV_$ zOM5wLxfZ`qIc^gKV>A?F$&zZ#P(J9_wh$N2ctR*t2T>7a)F^v1$`yySM-W=WZ4-Pr z-0#2arL-A`fySZtOq4*Oh$WjPRaO6}+DEoraPw!L>{>r}Fr_qI2{D_{0w zu4=T#BqXjj;9G?ln1xVKaG}nJYh{fIG;J_(L`ZeP1@E8H6Mjm0nRIcGs+jtGc)-X) zoh(wKVvY*OXDAbn#3FsDQ~O~G|KmMk(ztfS9mEsPWEJB1FxOE`phPt%2!%ir! z2kQB|N%X+F7$!$bgV*B4Hp3hNH-716_>;f-TesmGCl~DqHZc&+cB~L4M;t5-4nOz8 z=fnHn`UY1t+|6xBTO4#GB(`PP?WCH3j|B7#GnLc3a(Y%aMstNVkOZx@Nxs%_sgPK7 z8YIs{rO8mzY3G|3^Q14U!UO4?U(Hn{in8!sjLJ+f3b3S1#}kaQd+KjFf&u$;7KNB$ zsVJT-QejqWz@n%MNUngUz*ls;fhBY^MF8hVoJL0xMuZ$3OWt{!Kw(X_K@D3N-!iYG zR=EbS%zzuod1p)_(#-Pq2;~eAWzy{`%*5bLVC0o`OV6NdL;U&qd3e?D{2^TWJAVKJ zmfz_!24NfsM7`aT(ZIQ9Js95q*4M*JU-&$3A96v`P9Iv_K)2@%LDOkF1F=I83WOo| zL=jODDTUlfj}N6rq6GO=r+HEL7O<4euJjm^47(8WRyvJ@74|L4sNaP+ubfJ5;!m-* zASoHeo;*oWl@_35CxclI9cLIsWO)e#d5FsYi=CgFc5-=ddDWDap*E6(fDZx~3 z9{?GMI;1Z=s32kxRu(c`yla_BL^;*hAXV6IsMa2fEksSqBm34^P-AIYY>6myMt}`~ z9cOL$_t*ZxTi~hB{ZaV%r$6U5bf=5XKtu*$Ud>$&_t^-rv+v-mxmEbrfAl+W+5=98 zy$4r$0&&jO2CzjWQe@%{EknN}NSSL)7d-dbu*M75PL}q#Hh|q8Vz;dgG+ucq%^wI3#iB5#seF-Y14iYJi+oOq z6R@(A^8Je9b1l3-l)wg-uS#4B7!E8Na4{Si4GdAr`=v5m3sgmMT}gL9sDA87k`+iG zB7wX?!Qhnm8ix~l>89iaBz0jTx4oj!&)R*8F0TUU2_81XsiSOWW9cdcxnwhGbTJ%f zr&5TNs?-7PMY;@!sWsN}c-ka$+=_$@7+E;a`MkwNzUK9BhNnLNC2;kpK1((lu;*m# zajV9OVK!U~?7+tQ0Jibq((8WlrSR6@cqMGzz6}mAl5K{u1(t!hadm-ii~7;4h- zI?O$59ID7EyEsI(_8^A%x-5@U#dsGidWR6@P<)69ohZ^f)iRW_X&!c5h{j|p#^6Y5 z8jlh+N)9}B0I05CQF2md-@09}rr+O`DM0viquFC+=%R~^Pm19Ty)_RV9$XT`PfpBr&b|IIr2IpUw@B` zZAn3`GpH`*?L&DXv*aq{5vv}FoFhnd@e^taL1_pTb-!8@NV3X-NoO+SjZK?BJrRooM7T2pw9E4R*|og>re%Hh6O9G^vAlsM_Mql zK|zf#vt%E}jmJ=smXlrt$>wB(IwT?#(|Uh5B{m+Dr6wD3O0coM26No!@9}E+)!+ML zc*YBV8a{X9%`jtW#w?rB*rcMQgCRGt#?ipZ#~lNg|Nd{num1eYxW6>xW(;h*P^1D} z8^}~Ii#Y&2SAn9Bj#!&}zHhGC0VI$YOdY58qyk zu}}pwL4Mu;Omf~;tuV@kCaE^AM(yW{jubl@jsV7+I0C4IeuX#5NHdDOwYDf+nm8^< z#dFnR6iq&h7L2ftv5}drDkP3QlNn03T_sK`LEwjs4lq)0IdW9vbOu~ukbk#`Kx=5W zFD}4GK7I{c^t>0r@4Vw(e4NZi$nC$8D-b4w(z7W6M*;(eJ^$1XejlR|1>kQb< z(Ll$I823B}Vv9y;H7x;5O~ewkxJQ-@BqV>B;}*y%nlLXr;c88ooIy!9BqArta*_j$ zu-3l?P3_l4TP6Z~?5VaQLk&q(udD;0@H{xdd4T3T!~$-DQpYj@g4+Kb37eS{P~iX& zu$(@DoQk^a71u@ta^AZdeVrt;NR2>@3q*Y!DL(U@<}Jgmff|R+!8M|F>52iNE$EGb zXTNEU!GMQ_<~Y>1LKm<2&EJJ*zWAr%rrYmeBhYvCfbrM_e`3XR+0&y-2_D9?1@C{` z8{zrS`W{$eWMsq7N84KP8h|9wk+DqdPI( zmCh!v0icQWa^(B9l;p7#BaZ-;Ox*ZUL6q9UR}{vCl8zZu2py%#142ur03=B_Vuu1j z%E>FH9a5Bb8k!n9mm~;0C9KqV9yvF#V%c!pBH@TPv|Xgzw`_rb|KzoB(FqJe>p9zvDh(hT@$z)F$7={5fYUh&^w0&A>O=txTfK0rlQn2+LAP&uR&*sCOE zgq1*^YQ;P%riv7`gQ?J;Q+3`y@)Kb4u8B^$GSb*$IY?;3C>hn(2$0Z_k!{|LZ$Saa zGJ_xlPsP-N7%p|k(+r1*n>Ye6rG$LJq>E)?s0wWrBdEnnCXIBH-Yx?erEycK9E?<3 zf|v_<(1dXpqHGjC6(uNF*@#l!AvGBLBHg90zJ@>(U zzo!aohFZ#Niz68D{pVlwgK!SRi4Sszz_APo9=lxQLt@n_8{z?kLx5gN^rlY8>q<`K zB@IdTYO47HRyq1L`hxVRlgP?c7s&SZC=*wbT*V~FrQ|dxRbiqP;YBLIK-Hv|YXA!i zTg?AacJ!@i03146@Bzdry-Yoa1ONy@=h^v$YB-f9R))zF*h;UA8O?|;V8!_W*&442 zIU-cTVVyhI3KV&g7$e;Fdm>70zf5Y&4hdNey`y$)hkw25 zlLG&;TrB9(NX>_M1ZO^JD)R>~5DkV9lop~GGejz3=QQaLpdPD=$9Ea|CQ z%6rnfFO3xrc|xr4%qO;68_I8RkO*^-FaNKIevqx2fogKv*02N75@0AJ`J<|z7u3t^j?@vRAykS(C>gI z@vvc~sG9KY+9KD+plfQv(x6o4s-l2Y;R^6jtWgsGBc2mxGlESZv1VlcXewd=#W%25 zu8HTaiB4Y>B!VG`|D@<}((N)l9BIH|jQ|4oK3Al@F*aHHC+Dj(`Dv=DuZWqywxX6% zizV&8y!6sEC@|-8c3xa62_7kQ{74ytvU`9*3WjaBAp`p4 z{Vk7VCX9DNFM-LC_L+FPXsGlvBL8J77{GI-EeFia&Q|eu13*WUnJ z7v^BdyaPcOk0uV!V9kZ1?*YUq0W8V?+qedGq$5>-VG^7MWq}q|_a(e7VN^p=;WkZ( zEfhOgX!QwZGH>AsCNM>~=kV?r4+jj=Tnmf9Cn>1(D@sZO$8lePN9EL_Uk%N{g9n`a~_<*Ju5@_zGprIUj4Ec!_MtnVK2A%Lc4Dy&V%Jw z*}|0Q$g2IAUmk&29Zu5JSZ#o$9c+u6HtU0ud#9GV`vFSHx9NSDis5uV)zl}E1i5bQZnj);EFssB@=h^zY`X(t zu`~?|sHpTUn0cH$aL*Wvw8_tZMM6+fPT2TyX20=XzuU!qOl-r_nf$eCnmDmCrZYeHOI+iWn~_Mk)?z&XgtP0I1D+O z9EN?Es|SZ){UVdfuCh|lHpdVm(@4z^LYlt#h8imC3e?cRWt!OQoo&SXdBI6Ei2R zKAG=`qA6A?t0dTVwC1ByfkjlbS(97h?dPO&9ifKs)W(bxn9JH$BS1f)$Jc7onRZhW z$w6qeWL*bu`mi^edWy2FBIlo5Y6-d(5x_ad5M?2KG#Nr5I08c`rg<97>6LvDQBt5|2I$Eq@M z^Wj*(3wOQw-LU;x=QEXd&zt`go?-6Q6>F~a->4R8n(Z?n{bH(BV391V!wg@h@!b9V z(-!$`@ovbK`{zCDzrruE*FTzpKEdnTLSN7!8Sx4l@pswIUVlGt@?UtLmZgdPnE%e#53b!X3Q~x~YWBlLkeF?Z_RdwcC=MHav zHCIv0gUo|MA;F+2(5PslNhel1`J##GB+#FUofzV$>1ZQrVvI(dk`Od$%Sr+WVZn_u9jK#H7VV8(uSR`n}XZ}7Z6}*NlampZr%T^4+2#e6b8bsR8SICh~BwFCrZTU zp*h-u?KfTp^Sd90*64EY`tj0#kD4xAghdo8`+;IJDaNL3zJg}&ON44fu&<>qe@UHB8?%2@MM$%OZH@$ zx?c53vVlSNe|!kGf9pfg7#yuUBm68-W{xCB#36^pYZ@2!)E_Lz0iFV=*jxm1Dt$VD zo(_CWTeT^zIY}G@noGyv;rD(5R-b<^j6L@Zn4jFmnL*2@Xc!27AcpF|XfseC%N>En z*l?grFXy|3z!6XyomO2&O4na8^GvHEw(k@G~xhhpl`5E|g$eB7ke(JHX_NC8*_UMpq zCXy8mEuXxw-oj+_9uVp~#$!CWfislC z>y=|1HM${Q99w_;EpYnhFNc8>kAdFwzS31km;$0`3L-cK7zBj4KgryCHt>urwoMQb zc_Bu<1lN31_5K{E>&F~(B>dfb-vL8R^4X)@fB3Z(=t^Y;OK$MOA6L8njW@wN-u(f% z=iY6wbYw&?#*SY6hC#?nFfULz9ajT<5>7hh&fis8$15*@b3gcI7N#4rmX*EW{S^AE z5dRh?42a(pRgfsG{iWF-Ils_}`QGb(2tRrK72KRCCm*JbC%X+8$uNsb0?F^jQYqY` z&U15UOfM)*U=AWwH3*eva#xMYnwq@x^Z#MnKVJ;{e*AT4jjT|%L(VD+gJdPcK0B3o z=~BY3+WJirNJxu21K{1Gk%fLv6psA@oqdm+ovQ1^-xU6xHT9++e*(7r;vc~2S6&J$ zSu$&`n9%lK8Hz;CN>8Cyfx(oz43*2I$sKkSWr!5|kaZ!YaVa(cs7Boj)}IFhYVq?z zZga1~5Rmf9NMtoH{zv!jgSUR*3fj2oOG>Q(m-FH;YyF;J4Hjn3Pe$QV+G*NPFDu!1 zjiCWJ{*PbHi@y!s>AjF=ST+gKxfYp6(M#SClhAyhV_|0sg<1O29YCD`RF9+j7GoEl z3rk-5udwg4Hv*2djnPKnH$st$QZSq+-+U8GgB7(6PT# zl0jW2-t&>y!|q!?uOE~9D1J@vtZU5g9oI;XnT421C}iUefOz6OIk|W70)ZM;9%o57 zUQ<72TX~&cNH|K!7BE#^cFwRGLws^~?S@-_^$l?J>wW_c{exeJZ0#ZZ{ColAbEScZ zq|k>kpK* z{+GV78Q%8p%h^HbAy_gtqBo@Z*_pDDRxWxfg+wY+iH75`WE~c3c&N|&L`n5 z@Bat*moHqaeFK(qjb85hfqGD(P3*`(e0_tvgnPGAy5%wH+^)TVdnaIE>7g*k`U0ho zLbdbTl-^YR28mhyo^q6bv$j|kqFLn)RgtZ<^;8)!x9yQ?99YC!36xSBh>Tz=D2RZB zVG{;d9xJ%}lIC0XH1f`@7F|{6x552_v0){tHVL~Qxf^yrd=u=u{TkSR-w(K#(AIz- zm03ATIwrLX-5-&p__vQ|LSLv9Fx(UJv9V>vB5nc}89J(UnUZ5b2_p$31rL(#;KERi zTB_RLYxGx{K=u3f@-gV_-UAQ){Z;VDNB;%dE0;ra)i`vX+yhN+sCD)+2xtE!NVzbZ z*s8_OUF_B&%XNdXyJwGf>jmxdqu6+D-yM)d7zmD9 ze&2q$`vaebbKd`FQ1Ff?(UgTv>OI`Ofg>Fbu8XC1v2Ql%b#^Geru@K}is8>RxY|k{~5FBq@r?$<87S0F^3m z;Fj(no0t-TB{5i`7+6EWvKI=&9&$~QWjN(+tXQUZqVD7bbkss-pisux0d=!kR@qTI zeJNH#9u}tH^trWaDGVOA8s>O`wm1M7Y44O~odbT7uWF-r$3kQD|NH-VGraVrFM=bE zJ{-RLotxl${53Q*3}YN1I^3*N!NM3|dW+whjX2;GTJ$UhJT~(NsC*9`Shih#9ZYY3 z5{~#UF9aMcGbA&FDJ7>;EN##3%Wr+3#8O2CB$=J zN*FMb6thGZ+XbseWojo;slQ^>RWwdxsMO4d*k03QjB|+uWHt?M}7+iZIWTPvfH`Ph_IgozY zy?u`ul8pNe4;2~*&bEU@};yzd%>NPRjV3{R}h3xdL~C? zrZyz%0|Y=yDNYBfzixzBo`|AUWH-B*SQHNW4t%pX5`X~wht3S9NqJx1?;=AstTNHv0;@_ zNGB!$N_LZ4O0j8DAltEp9(F zsnMz_+_GbI{@5vT%6HrJ|krSbifSi~bMtu;0LaoPM#YJpD zimq*IecS~!Sk?3$<`K+2z6*v|AE(o0zf9q7J*Sh)&OHO#TngkgcquGB>E}5U zfHD*F62lU)sbI)+yYJWazd_;=36`MLj6k31Cke%b-c>{-qJ-D5wol+PB@_*A*$FE8 z@EI46H=yb<5ky*fxInOo6rx3lMhI-iEs{^D0AW^r$&>EHT~uw@<=ubso(K7-mdi@S z)s^#C5`J5Ahrk47p`Vlz}1r%IZSzi0!O z3gQ5S_kZOR&rA{L`eO8j7i#=}cx z7IqOA?yIP>m7;K8dAX=j{9V=cnfhJf?pr;sO8cFBb3vYQHd3&jNTLHt5VJ_9{4T0y zu;%#}#bu6d&ht6qH9z&lk2#?4;4-1@BTO-r@A7=2eDTxR{2k-_C6t8%IkHMX$+J9| zpKmTkUx4+dM$24Ygt`{?7%M3s+0X;pnmhYQEu%B6n||mE&XQ>Epta3*U0cP@+xNpe zxnad*+=_osqBE9dO~_f8^RO443u`a@S?KUQ-89L1JXWfprs!Ni>;fj+AoF(YasdgS zYLtuKWDVkeNRdFc?{nmoj^j4FyL8LvK?--~YQc-whE)(S-<#Kq)$c43C@)F^f+8d3 zijbsn3U+GYOSy$Zp1>zch-p*=C!M`@XZFE3r~XUNxR6JDol;3DVs&$Y%?0lCgWu!K zY}Sjc*|?<(n!2ayxPivH*U(=I{XQzVlv~xc3naB`&vJvsXFs@0@p}liqqU zccF*1(4@Y|cz5j1PFBL0fPUWRgWBYlN1^G3A@WdZiYL<_k~X$sp9FpQN??QOnpIw} zfhs-xAnPbdj33GKBD5U;!l4kUsA`R(urA0_8y!gueu;uT-v>@x&b%)BdwNV)HXwVN z{Bz{X-wG8V(Pn@W^RJtPJYwJf;~O-=2a=|wZlOEL2{a+tt0zd74Up&=V89GSOnP7X z>T%RtwQ4+Hw8kKr5!MJ3ck1UIFWg+D$7eJxSO~l!#V{~&F(_~u+imUH4^MpUCQkJS zOT9qy?yPsB&crk{H{fpQbr0`q%{pArUUF!+@4^d)1h$4;Dcz^S| z%)1!SQ}8IkGKzt>{R`J?;0Sm5k*p$sV0p3QZa%ROPWhA9!f~(t6`0w*OJfRDCZJ~2 zy}2oyF?t4n9iTm+<}8 zrGF=qExr8-K|(F5!hTS=DSK|tnw!rxe}(Wt&gZ*K=U#K}Z^L0PeIsLZbnztkC-Q%AS9qSCN`h69gi!A)<(aUV*+@vB;+Y zsK{b{g`Fe$1v}2dxVsv|hcR%JK&cJ^=yiSl(oVDGMuuU}maW_ixQpqgqgGE}3VNDN zeST^d&ivq8;Lw+y53{@XYNVmc29zRiXJ(@0tgBgj=H=fISs?i}Mjx*m>t^TYP2R!` z8iGQe)`)qa+;Iae1cBJ$$-N+x1)yv^76O8t>REuaMkkMS1;S=Lg4n6WucirFG?kf? z%*|hM#xKINUh@z9xfV{qqw0p*)2nNL4$L!Cu>f3!S`MieQ}g>C53+zxgXnwArT@y~+l7ya&D6DP0zrl#;~4bB;zL zy$&)ON~cC{ZF(JZ+fzVKo!sf^V>Cw*0e~WFEAU>gv_2ENyf@v7PlS683{Qi_Ol4RJ zAn>j~uXlcBWU8_J)4O5qdA|e4|K3&HcWITAimLI4gkIB4L9*LJ8SJ_B8kpIB7ncGf zo zc+b2s=FukACCwviTSElE~9H11o_XYsAU&v431h zZB%|l6pKH^xbO!$G<4YF?Ew_ghFt{68BCf~K*B1_zbL`Sa)+rtrP4t+4m8agRm=C7 zjC1e1KElnw3?b+=+p1FQPIJSLfim+v9z6b%i{OImKF%e<&uMCLXa7{Wn<~)_zQ}Vn zn&{0=@Ykds8|IxkO;&LNA7txpqhl|dTLg(F|({MqDlld$ZxSHQ`ad>vN3@M12rx@8%L z4f5&Y;#~4$42(2j`?s%vsYh?q&A$rv2yTi4ejp?CEx^5?im@_O^rS(OzsW{3jANAkxuN3}U*_o%o`b}5Dj_YrNZU6XL*m1*mVSX?72b2Uj z^Zm6_F_hYU#Zy|@sDl=J3R8X z2)^!@iKjLb35?Ysqkkq_ny~94Z~Pbsee-Xxc*UZ|aMCJ7cp9(sk^xE%;CP}4y(c^o zM5shBFI@C@iKwkU%8|{dtPULhI{i7149~AS;G&9J^T2$5bO;RZkeS?O=H))*`yq|02cDiA zOfj}2>cu~*W7uJg`ZbN9MFQ6so`VfVKK4{2TJb z<=`Fv_pTn2dw4o>ALyUt{Cj6l*#!IAIJU!ruCpmHF^xrw+{Rt_ElDC6TH=CWq` z4vu1>$LrMal}^?5=Y)IStEj2#Hmfo=0UrCb6~K1nECuwQ`6y~DN8is1PVomrYLQ|V z)}2Qd+`|gT!;6{EcR|jL1 zm@rm7Q4u8(0;m6WE~a=4!h85SF_gfQkjug~G{zAIbpf=ZqcPx&`gi{vvgibNeb z0t>{Q$uDu4w)BUOjmUUjMtG&Q@x9IqJ1TOT`8}|Q;A^Vu8Xi1#koaxcMZxpWCE(R_ z)E}6Zhl(gec`GtDd>((d4b^#KAri4+1t9Y7^H@ph%0d-RP>v71p8k#cv@cJ7R08w| z@4e_%DmySwqRoq_y!v3}dDH4qpRw=EbfpjLorb1gO~!W%VQH|fL1{!qegSZ}b1QH# z<<45+IX0F)?jEV(vyt-Kn9s@8W;tteE^oag#a-z)@sQH=>X8?#dPIteVgPK|)Q? zeo5OxKxz(7cZ=|^#8Vd^Zy9ER&Jt=Oi%+E{vi()Ctj`JS1i{34J%t9 z1P2W7RY6H~kjB}X;4p$=2mw6pLql6o)oOjo6@bHY0Dzddf1dIE%+~P|U-8FK$%5oL zyWyiuk2pcW!gbO!+k3;;M$tdzrylv+*(0ytm4GW>U*ewo7TB>YtFO_3m#rL#G|m%B zbBo`j)4m*A((pCRd}I8{Qij(F&vi7QpZIfZyE+CIk*nZ`N^$o5C;S3~92PXrV#e|f zOEE^zA_D{s@gmhDOouf2;(C6ZWQc_3p_|nJEih#%h@nLBVdB^65)Re0)jQ_N+w{U# zC)nRjpjib6`nH!vXweKn2rF{ttSC<4#K_Q{Me{q-7ZMc^m1ApcLKhVC(NBKUO|pdI zkChaN{77g<_=Kl-SY-fNvYAT2rgn5XLo_yT2fd{p@T2l?v4(ML7u=`uwc|9t4Qv2? zmN?OnG*>-Ru(yc}@^l8YIe+j2qNKVG-gha55A;W4q_%$3v6;CaUz-~@5<$aQ_Dd8VC+|SZeY=F>#O`$nXm{z(Ef#g z^?BN0VMkH~K|>t~xsRs|WaHSAh~a09C`&XPEBXBZf5hxpa^lu{Y3;M0WEv_D{BDzZsLxuAOk4W&I;LjzxMqL5gwldDR9LkW<={#r;# z;OxnODR3Dq=`1UO#O^YD^CLlbhxx^7P3mlbTc`c^w0$=W#1F^zc~?qEPE7b~K)^{b z5QcJB=85Z#;xHJb4gYKpoW&VCca6qdD z=<62oJ~b__d|`ydixq_!iWnI$Trg~k$jYu&b{HeAPIA4Cvw5KrC$1v}+i1FYPpQW; zR{Ure(j!j!0*lGwonR?w0>dg7q9mobuAc|Y)|34r-W8hJ>}dMvhrRco3^K$%Pp~& zRb=Z=M9)J<;KeDZROgWIfP%B z*~49Eb!glB!iFXB$=&EDBEk$CDFYf9$OgA(!jFz^*nE zcGMn%3LwGxC@zf@)%^lzP)MG%!D^A5y5(*;4(+{31?B|2h9a%3{8u@6&;EseInRUW z^N=<+FqWdIV{+rk{B|CL(S%4F4l^Z)DVR6xV-vv_7evMtZPdBa2t1M(BS=ug5)rRM z<5hS;i*;VzFlWFhe!$nZJ8M#*`m|IZjO%6zQ6KOsKHc4K!=q3#wW*S&!jhn9IejR} zzf-De>@zcgbl=^}!sbcO9{{U0{xCu})5@uZsU(OXxzK&}5g+`#qKXYOybsUp%y$`#Bb9305REGc(a;6Gtf}6 z3}bks5cqEjr^VWwDJZ96^+tVx(EtQfpu$hC_ZJW5>mtYgHxDHMD}kX#(xW< ze`io3qV%sr=V~EK^$kFar+m!*6X2y_s?qG1em`pst=6~6*7?Wa6`&XPlguBrvHfh) z=%kN4xR19Td;V=(!SLq6ga;6|*B0Yqq1bjsrcS7g{s}|a1<&%Qou!xnJdUh}sL*K! zE1rOK9g=D(HtmZZi*3@Z5VH9y_RaRdO7H$C4($A@2)oWtZgrI~9vlN<`gEnJwmwa` ztTVyu;mVr*Mz-FnY`)%?IJ@PJ65-Z5Tn5Igkj-dG1@9eUShi=m7@!b5xwM&&?uLn} z5m6eFbAY-x1KyN0+-us`!E_$IyULBdyM7yie)qbQ3?nP~hCq!(=f~lXddH+a>DNdC!l`23lp9<8_yflv+1j`0OO)&f*72HAjsMfWOWaucj*ZI2mA^de& zSH)2lz~);zk)WJ&_rDgb*=Z&A^yNpTmLZvN)|BZRb{gtEs2%FXd>3jqrcK9E$e`ga zol-dwU!4U|R}$M{CgPeR|I*XM@`yo8wbKY76o4-(0o|5krj4}@@mjGDd8Y572uAMvycsKA_$MhlDxNiK_oI2`rtxm+e9wiqdjoLzY6p47F7J7`l#Hl$9its7jLA zY1zkm7fTMDglHxoIU{zag;tCw4tQ-%H)tTW!Zddh8dtD>MF=pvf;Jxpg)O8koXos- z+V06`?RBqH#>6oqc!2%8TLTXjdP-r!6Snsd_77<2Rnt&DJ?i99X+5JC?_|y6Dj86- zdhT$zR-!9D^7l96AS$8=Tua}yGXE+cs;u+s9PftBp>|G*vLI)*Kknt+26Oj@tHDvL z;EllRWcqD!)di@aIQYBNQ@X?_6UWRgXj&RW8hiCz@0$^oRIqV52W(%T4eC@`k^&2v zehw7HpIP2S;S@6$1@hH5cJ6HYESnOqexsm+I*LRd_;*QN@JTR5jHe54ea)1y738nmL-#olVgg>?LBL9;Fl;O#Za92lLb9q{a}ti z@c`PWiN8c}l{^h7bQCjkvOHlBcg2lC$8+w(-pcK+Yr_yp!^iiT*( z1=&PP?K!@*W>)A78V5pOuZ;6D-*^Y!*BZS>Hyqd3t&1EXp5g|bdvGH2bnDEmF zV;xvg)vnqNKOmI#YXt5aC3{>+T3k7$f; zMi6MX;g%7E!lCY`=od%RKsue>-=DjhKaF?rQ&p9HkXViiDLP|QLp>OMVY8Sa+4Yw+ zu5~y|LacYi0R@b9=dP)p#)p(q*T8Fl{<_z0L3rm)bL;zHY!*ygvoDmU!}5;}$D)H( zboq_ku4451Hce-Vn0mm0YmhkSQ!K53uXs#r0~sX1ltaNP@hfVhCT_ZM1-(H5Ts|Ja}Ze_f@<0#5VbF$_rnWkoZ@=y_1CP!_7>K&w3@E!thYO7z%qYDm=R)_WSqlK&e?`RafHN zMZbXTWOfsQxKWmK5}1GO$i})!Au)t-@bI|iPGWnXU1RW2VF^V0LFb*i?3svSg)Xea zN)bA!7DzCvQqI33lmY{!DQa1RGqyIrpMr=T9)tLL=2af_AbX=7w2Hld=3Bt9gle_iPNX<=Mo)_I!pI@(`FXo{i1PKiarQoyi0?x!q?CDgxDI1c)C zFHtt+SS^ah(tZN}*;;iKBGjXqt&=g7x)l3H>NPHsgn2-qO~UXRDUf@NO%<|9$&M~g zBO%qQd()H&qFZxg*S;5l>C*q?u& zoubc)$|SVR@n+(V`!bpal@^-DIZGk`2ToO}lS&-B$RCf*Z?l}Nl%@hioXB=Lws@dWTbEOISP_~7Wi*_HYCOaYXq%jRizIJ+ z>3uE(OE)G7;O23MPpLae;@myJt5K|8E6b-?{|-tJ1=jFhM&vcpdkcSsg#y&kh};nF zO_hX4^}x0oPS5nAdlkToaEJtrOn$WoxRWh*zU~RS(zRb|3>2aPviUSd+&#{+2X<)= zauU?u2d_S{`>uP5xm=sQE_6S5z@9|Cj($ccG(vEV5wUz08xD1lAFOS7Dk-Qa*PR7jK41?s=~- zk#r!MulN$b|1!B<_1^y0fai2L;fIBuw9^d_ID@HZd)%8(W3E2A;=gd=XaC`^gLfF z$eFK09#i*wau+*#;2DvdBm6;V7tp(?Bayy-j43%bDQVV}^vj0|pa>5t`3F_Ww?W67 z#A;6A^1_jX1^w#!)3=GQ8x^v(kK5<~Ut57=mRHJ};0cSX5hRV9rklYDCN}D7&*HsR zm?y5Sg!6NSup4S`5WDP!#Y~<<#{nB?_g`jR)1YB3J+2j$$+I)du>o@UFzg5}KD4)$ zY7b%^TplrVJJq)_@PSddQ2{fd(59~I>nTqj>>`l?wnw4yH(14f?Lk2&5xFm7w+4iso{l!(kUTt!?jj$8c)>ZNPoFd6XV^sVShKVvI(LyDTte4F>5hUy%h zrns-@7>-Y15G^a|qt1NQlL!%Cz=>3cj27koiW9EIQJdi5_iagRk82rwHMNou?G0<6Bocdut0m{dV0qx*YHD!UL?;2qtK3~$2uBnW{IA57 zL#6JcR8bfivb#UFuX7seoBHK*yPq~Xp6VgOH}(zBTu;>jQX4Sr`4pz*hu-y!N7%QxpZ{Tf!dQ`5LQAJRRx|e1K5+(UnzH!%o8y z3S*>pN|cs`=1s*vA~S7+0ylD!t!gB(;Jrg>ZlSm5-3xOW>1=BM>QQBd7?L3FrsQl{ z!*D@sJ`F9{-&t0BV2eZQ)~mlkW7 z>N$%^URU=PWElBq@@=^*QSvzVSv$i3r30{WY6!V$1I&NEV}C`+^wB{xAO76+aI2U} zq!tkPH;NegaYg%#mkFgZnnza0^M)73L{_|4qFXBysRh1v)bPL}Ol2P$$KN?^m{^(k zmvjb6{D>Yl45FQOFv_!iiWM)`jUTB$1% zRo9FJfz3=$Gr^$-bMhhS;rIUS`<)s3k&zFI%SC z?$gKGl7*wtz$DbiLv2ngMf0et#-<46>CHaR^WVzJ*rY|FyFaiB*M>QE8LT-TIR8>U zAPVz*?GLyM^8a!QV+o|sp%9BSr!)Q=$$b*(RricL45k`(uCPu~u`D|fZ=gmB#uX9$ z8Kl-#k2Q=dxQ2LjLr!wbkMvj!GXAVBt8vt2{OGc|RPwHD54}gr8eFrMd9L`eDd~;3 z>6x4)`aK^Ru#O-ia7&kyZM05P&yY1<*yMl_^R}=NRDc3Tit;<@?;Gv;8z=>iIe4~1R)d{YF$WL@6Qb}O<2XuzKelvsejtj~Yq`cAi zE2F5y^mVun33?m43bu2E0=PIxajqLGT}=?HB{5InWnvm-yKB5*89^z>pyxkaB$3QI z^CcI_^DOgx7j;wdU}7>gw#&R+SXA_Wt-Olp`63K$cCq;~<*cW1iOiL-JB>{*tuL&c zxGA@GPmjCy9G--X6x63?ngp_OWvuWVdZr|{z$bf4&={ZF$kdaEN*dN;41!xh?Y-#2 znKDMm?+H1?6gQ~GW-LQvEd6yTLy)16FMq5b*;kL*19VZApDoe9O9biQLAM$yNvvb0 zQe;WUe)aEK#VYmLnhxFi(Zemmc*$GHbBb~YA}`0m)zd^ZBy1ePM;E0+U+N_S6vLS$ z3%<5(#U#JO#tHAuv2&GIjAySt+WZzIK{6Ng@y9@ip5IXJ0F%~8=q#r(e-?dx^1&EN zwXrvnYS5_2Ss74T@1AzbXnFLh+4+iZ7TO*TIpf5V|Hl zNQI&86W>=-zW5|2Q}1MSyFQ^x%mNbvtEeBlg#$j48yZ=%$l_8Mkcw9>P4~P^KkT^u z(08uM*L>CIK;*A-LU%S3?)NW)b6S-TG1f13OVAy`#n<4edw_aRiF}|SEB}^C#(4)F zvmP#|ZQV0-JWTlHn~t{EQaE>Bi6J2e8xG=^hb>ld_X;JyG1!soCNPtWszB6_VH*r_ z^t6z4Ti^`F4)-U-CvhV@_kvTLCB|t|4m%&j;s#DxZZd2pp`>EM<9Z)8T*a-ceDWCL zNFlmvSj=ypSU1%6x9sspNkVZIf?pxKVQE%HhcF7LDB^zn!o!4qH;APXH8y@4k{tI+%75+!9twE-1rF5ls9Cdi+p`e4 z%v5H3yhhVSuw8Q2@vmWh3+96fU-}sGU1IF zbKH^xNtmoB^doXmLlKrx^xtn5m~J_r9L634wsfVx)NFnoTt}9v_7rmq#2z_C@afZ0}}2`(aQVU$l3vosRjQs%gc( zq;>X%#lAok4h{895D}hxeu>vaD!*16y`7w&`#3bZj?i|zx{$8XAK>Z)kMr%3c_F&L z{DX+?$B_d~4zI3&49<)W3U3L*ePUFLQR_*3O7g{zwFX8fbhtnBQ#6?sv>_!uFse`K zu&DxbJ%io7D1J#SaDsdz#`w<$lqpHZB|nVo?^}xuw*^gozRpgSQRi=GrAHoQd2$$$ zKYI?`KNI2~TsCJj6yePsI`F`6RdBrr5&L(I1m>%8G!wU9^T9Xoyr1f|Re?v`7CL-8 zPoC7A*w5dT(*c`6?&OfX*VotcZN~0wpX6%+W&}(=1TI?);Phc{ReU=NUFU`JvMDse zQY6ngZL#b0#Y$gtT$v`$ldDS5FbCpa;e&37qOEeTR|E}eYS08l7iFDpfCn%R>@USl0lu&L(7{FL#R6uya-_r2bl2gTLbCyf4qzB}znk1C zuLF@`PumQ}cCkF4?YrrpgqcRFb%bKT^{hPWed(?3f5No1ilXd@><2cv2!Ak`bGeVw zTM>F`B~!-uPk;)i1qa`&!q3Kd5h)+y6oDlisWHI;D@i0ehP|&m6X@+j=g}v)9nkX4 zRK-QW3#!pUE?2>1mVIHs5ahzgarqEDYECDSgEUqa=UPB924fdi?rtIa6se5*-r3sG z^}zLIF@1i98W7W0d|S&WqwV7N4tw%=5^nU~ z0D+cbwvUNP56mxRDN%i;Oj>@#-5UB}F{af}5qje^iI8L|naU7>LXF1n z&{Fn3cbuj0-sra7NjYAXIRt3fOa!4j@LM0Hh!+h(?BJEE4`j9|<~ z{#2s_-U%}SIdxVxHpkVu^8&BOK1vR#7zUw5FeQ7>1is^RZNAb(iy-t4l8&Y|lr~W? zts?mS7^HX-8uKYUp|VBZVzn3I6YcZ~E}DZgLQ&ikCj_UA*&*Gq-?0Cqw70QF?JKZ# zc6#car*5|w2Ek1>V80_guQ#8{o=jXc>M#tks@05PzuTpxDT-HF=EI6iXE6`%rTS_} znK(snCwmTjMI20q>p3E`hEm?UxNl{V|0D9Rd_e>w&+YH=WLQ+31{oqt zp5~d2rMc5n@af=W#oJY@TZMJQzlzn4mtgRgXeCSlDzuE=Qx`&dhh<+|DaX~&(Kj}8 z7Y*!Ece}7)y8*g@7KHQgLkBl{9n9QiUx4YPh%^BtvcX-hNOoDfbU}1*&_A2!uHd*XL-v~F%Vd{XdEUxq0jhBPcySeF!EdOo|%4UQKUw4$o{*laybCGi5 z6tPbIO1CZOwTery!^-%*QS|L9ebV=&7v+7j+il@B|G4#488YyGg94BjFLuNkyUnh4 zus`) zZr!GFH!F)F9V89*n|l@A;UU$6m)HGnwc1VAtc88yjS?X3M(x zEPW{J?c)pjo{g4)kpmNijl1Lv^NeQTE`A=-^?FxlHkA8#B<-?kOkkb+3))pA`C3{` z@88%Tl(rsW5_O%xBeY*OtdM_eM&=kWQFr1FQC)QRN1ae^sp%c9U-+|jL)G3Q2W8dA zqeBH`^S*}_{NytwAkO$?8Y?;HSFawdn96t%t(joBZlR;uz=O=jqw=+)B2fc*je$WJ zcw9}?SGH0{%D+D}oatF?P(2zEl@yj;o8PhBe(Z0gviPi1l2>>_WxgDoaP!PW+s&+D zH1kSNj$_%5KI_FuPCX<4C3BXBVy7~uxZYWOZZb6zSuV!N>%9(P2c0qiSGLC^<>pg%l|ETa_P|h zwccBKU+Ntd32+!=xF%z7W#95(n~Rp?d^mSH*zzIJBVB*{ZQ|Sj05eXRx<1|h?b1tG zJUZICe;8lTz{Xa2k)^taC0g8gM9zpDuZG2iI@(7b1MSCnDIXLHu5CV~7yU6lGzCDe z%225zTrJL$Z5od4jqpvm;Tt%VLOknh+mjx=Ncbxm5d z%kwkH{AsmvAL6rp?qwxa8N}%_R;GBG3IY#)I~vWX^KDJFOq6f|-3W8RFJxexA>2}5O@bR{&v>-PvAWlGhz zsQ=l}!biDr#nFO-M{c0DU?|`vP*Hh>qq1J0+M9qHbo4z6<{1hRcmF#V@dQkGk*9*n zyl=oR_iN9W)%gks!!13eL3qk0-{Vk&l2WnTocx0A(7^yfVVoid5lRKx8zqY}Hbl3z zg6ZeGq)n$*@iss!ur6%3vp zR6Lf@{!#t=PAT{@nKSS{h62z}2EhgW;m2$*tc7a?==#=TnRMfb_)kv5C}={&`5nY9y5-y*%NQg2IE4hE$OThCXfvkrP4wj)GGBJ@Qt7K{x|( zLjwMi)uuk+XlKeyUFCFhutve!D`Kcy>_o;Kpxw+ufy$jZg4u7!-Vgn0o@sWi%5l;r zC}rtZBVeINEFFE#>+Mx!ox%O$xJ$6;rEy|)?6jUs@a$oEND168H1PDn=au{%oFYFJ zzQ%j!Vh0Sr1$Y;+k7gY)Czow|yvWeu!R|7C09+`bP13N^G}FfQs@KiencjrR|6zskEuS@<9^Sbs zqEgOGwfJ$aPzWdud@%ayFu@f|CMvJu84HWh!AL71r}3h#`Jo`{B>8DJ^gM}~x8W$< zbWXz53{0`_QAm+yiGr=F(J-2VtXFa^B5%!GRZ->U(vVYF{yXbtD7pOkmx#EV;BB{8 z8uRu~|9>rKoBv9Q(9IO2S|lvtgvTFtpH-@b!bcUNgIyloQC{UyzP77Lb)o~9zA=^@ zGVzyoQQJ7)WfUjxC^j+td~8&UZ6A_NJezo&*sU7Z>U3kXQSte!Ydu}9-@&xf;$l+k zbzO`^P<T4gZ+ZRbtD#FL zh#hUA!_o=ZeEmq{MIfgY$!M-T;qxCO>l4v^7sA|_6|m^3OEK9_iC@kI2VVPm8n_Q8 zYo+3u@$A~cE7vA?q2;wilHdj7b5?kUJ=d@&oIpYfPYV#olJfHiBuoM-xpDUXf%$;AKc&zxxzpGd4t;>k)1LIq! zj`eb)!C3GCFodpn=Te&BJ2yaS{8MRs@P*|(xwzk~3@PBKNaUyp9dN5ceyf5I@PR#* z!iaq!ezQ>dABe~i0Q7;7|6ju|fd3%>qgg=7<{Id~{_yslrfRW?Zw1OeoGJY8J||C# zRQ|-w{eQ0lp)}3^$Ndh)_ZK%z{u&63h}xw1$0?BE`&HT)NO&IqCmvS)uDz$&4@;6# zH*p^H{|1`JA)^U~{RlOh&!o!dKM8>(0+0V+b_llwxcCw#Rjg1)CbcXlV2tjcdAf6i zVty|Oc;hpELlqvrr6nI$Y+3(303nIZ3b$|IfVg**KOCxD!1U}Yz{ever6gGeGz|Jb DuybZd literal 0 HcmV?d00001 diff --git a/docs/assets/brand/webcodex-mark-dark.svg b/docs/assets/brand/webcodex-mark-dark.svg deleted file mode 100644 index 17bb77609..000000000 --- a/docs/assets/brand/webcodex-mark-dark.svg +++ /dev/null @@ -1,10 +0,0 @@ - - WebCodex mark - - - - - - - - diff --git a/docs/assets/brand/webcodex-mark.svg b/docs/assets/brand/webcodex-mark.svg deleted file mode 100644 index 3a0b23131..000000000 --- a/docs/assets/brand/webcodex-mark.svg +++ /dev/null @@ -1,10 +0,0 @@ - - WebCodex mark - - - - - - - -