From 6b4adff64ffb4026cea7d8c8f4caf3c8d7222918 Mon Sep 17 00:00:00 2001 From: arch3rPro Date: Sun, 3 May 2026 01:09:28 +0800 Subject: [PATCH] =?UTF-8?q?feat(codex-universal):=20=E6=B7=BB=E5=8A=A0=20C?= =?UTF-8?q?odex=20Universal=20=E5=BA=94=E7=94=A8=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E5=8F=8A=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加 Codex Universal 应用的完整配置,包括 docker-compose.yml、README 文件、多语言文档和版本选择表单 --- apps/codex-universal/README.md | 55 +++++ apps/codex-universal/README_en.md | 55 +++++ apps/codex-universal/data.yml | 33 +++ apps/codex-universal/latest/data.yml | 216 ++++++++++++++++++ apps/codex-universal/latest/data/.gitkeep | 0 .../codex-universal/latest/docker-compose.yml | 27 +++ apps/codex-universal/logo.png | Bin 0 -> 7578 bytes 7 files changed, 386 insertions(+) create mode 100644 apps/codex-universal/README.md create mode 100644 apps/codex-universal/README_en.md create mode 100644 apps/codex-universal/data.yml create mode 100644 apps/codex-universal/latest/data.yml create mode 100644 apps/codex-universal/latest/data/.gitkeep create mode 100644 apps/codex-universal/latest/docker-compose.yml create mode 100644 apps/codex-universal/logo.png diff --git a/apps/codex-universal/README.md b/apps/codex-universal/README.md new file mode 100644 index 0000000..6a82b8e --- /dev/null +++ b/apps/codex-universal/README.md @@ -0,0 +1,55 @@ +# Codex Universal + +OpenAI Codex 的基础 Docker 镜像,提供完整的开发环境。 + +## 功能特点 + +- **多语言支持**:内置 Python、Node.js、Rust、Go、Swift、Ruby、PHP、Java 等多种编程语言运行时 +- **开发工具**:预配置 pyenv、poetry、uv、ruff、black、mypy、pyright、isort、corepack、yarn、pnpm、npm 等常用开发工具 +- **额外工具**:包含 bun、bazelisk/bazel、erlang、elixir 等工具 +- **灵活配置**:通过环境变量轻松配置各语言版本 +- **跨平台**:支持 linux/amd64 和 linux/arm64 架构 + +## 支持的语言版本 + +### Python +- 3.14.0, 3.13, 3.12, 3.11.12, 3.10 + +### Node.js +- 22, 20, 18 + +### Rust +- 1.93.0, 1.92.0, 1.91.1, 1.90, 1.89.0, 1.88.0, 1.87.0, 1.86.0, 1.85.1, 1.84.1, 1.83.0 + +### Go +- 1.25.1, 1.24.3, 1.23.8, 1.22.12 + +### Swift +- 6.2, 6.1, 5.10 + +### Ruby +- 3.4.4, 3.3.8, 3.2.3 + +### PHP +- 8.4, 8.3, 8.2 + +### Java +- 25, 24, 23, 22, 21, 17, 11 + +## 使用说明 + +### 数据目录 + +- 应用工作目录挂载在 `./data`,可以在这里存放项目代码 +- 容器默认工作目录为 `/workspace` + +### 如何使用 + +1. 部署容器后,可以通过 1Panel 的终端功能进入容器 +2. 或者使用命令 `docker exec -it <容器名> bash` 进入容器 +3. 在容器内进行开发工作 + +## 相关链接 + +- 官方网站: https://github.com/openai/codex-universal +- GitHub: https://github.com/openai/codex-universal diff --git a/apps/codex-universal/README_en.md b/apps/codex-universal/README_en.md new file mode 100644 index 0000000..806ed81 --- /dev/null +++ b/apps/codex-universal/README_en.md @@ -0,0 +1,55 @@ +# Codex Universal + +Base Docker image used in OpenAI Codex environments. + +## Features + +- **Multi-language support**: Built-in Python, Node.js, Rust, Go, Swift, Ruby, PHP, Java and more programming language runtimes +- **Development tools**: Pre-configured with pyenv, poetry, uv, ruff, black, mypy, pyright, isort, corepack, yarn, pnpm, npm and other common development tools +- **Additional tools**: Includes bun, bazelisk/bazel, erlang, elixir and more +- **Flexible configuration**: Easily configure language versions via environment variables +- **Cross-platform**: Supports linux/amd64 and linux/arm64 architectures + +## Supported Language Versions + +### Python +- 3.14.0, 3.13, 3.12, 3.11.12, 3.10 + +### Node.js +- 22, 20, 18 + +### Rust +- 1.93.0, 1.92.0, 1.91.1, 1.90, 1.89.0, 1.88.0, 1.87.0, 1.86.0, 1.85.1, 1.84.1, 1.83.0 + +### Go +- 1.25.1, 1.24.3, 1.23.8, 1.22.12 + +### Swift +- 6.2, 6.1, 5.10 + +### Ruby +- 3.4.4, 3.3.8, 3.2.3 + +### PHP +- 8.4, 8.3, 8.2 + +### Java +- 25, 24, 23, 22, 21, 17, 11 + +## Usage + +### Data Directory + +- Application workspace is mounted at `./data`, you can store project code here +- Container default working directory is `/workspace` + +### How to Use + +1. After deploying the container, you can access it via 1Panel's terminal feature +2. Or use the command `docker exec -it bash` to enter the container +3. Perform development work inside the container + +## Links + +- Website: https://github.com/openai/codex-universal +- GitHub: https://github.com/openai/codex-universal diff --git a/apps/codex-universal/data.yml b/apps/codex-universal/data.yml new file mode 100644 index 0000000..d9e0e3f --- /dev/null +++ b/apps/codex-universal/data.yml @@ -0,0 +1,33 @@ +name: Codex Universal +tags: + - 开发工具 + - 开发环境 +title: OpenAI Codex 的基础 Docker 镜像,提供完整的开发环境 +description: OpenAI Codex 的基础 Docker 镜像,提供完整的开发环境 +additionalProperties: + key: codex-universal + name: Codex Universal + tags: + - DevTool + - DevEnv + shortDescZh: OpenAI Codex 的基础 Docker 镜像,提供完整的开发环境 + shortDescEn: Base Docker image used in OpenAI Codex environments + description: + en: codex-universal is a reference implementation of the base Docker image available in OpenAI Codex. This repository is intended to help developers customize environments in Codex, by providing a similar image that can be pulled and run locally. + ja: OpenAI Codex 環境で使用されるベース Docker イメージ + ms: Imej Docker asas yang digunakan dalam persekitaran OpenAI Codex + pt-br: Imagem Docker base usada em ambientes OpenAI Codex + ru: Базовый Docker-образ, используемый в средах OpenAI Codex + ko: OpenAI Codex 환경에서 사용되는 기본 Docker 이미지 + zh-Hant: OpenAI Codex 的基礎 Docker 鏡像,提供完整的開發環境 + zh: codex-universal 是 OpenAI Codex 中可用的基础 Docker 镜像的参考实现。该仓库旨在帮助开发者自定义 Codex 中的环境,提供一个可以拉取并在本地运行的类似镜像。 + type: runtime + crossVersionUpdate: true + limit: 0 + recommend: 0 + website: https://github.com/openai/codex-universal + github: https://github.com/openai/codex-universal + document: https://github.com/openai/codex-universal + architectures: + - amd64 + - arm64 diff --git a/apps/codex-universal/latest/data.yml b/apps/codex-universal/latest/data.yml new file mode 100644 index 0000000..793328e --- /dev/null +++ b/apps/codex-universal/latest/data.yml @@ -0,0 +1,216 @@ +additionalProperties: + formFields: + - default: "3.12" + edit: true + envKey: CODEX_ENV_PYTHON_VERSION + labelEn: Python Version + labelZh: Python 版本 + required: false + type: select + values: + - label: "3.14.0" + value: "3.14.0" + - label: "3.13" + value: "3.13" + - label: "3.12" + value: "3.12" + - label: "3.11.12" + value: "3.11.12" + - label: "3.10" + value: "3.10" + label: + en: Python Version + ja: Python バージョン + ms: Versi Python + pt-br: Versão do Python + ru: Версия Python + ko: Python 버전 + zh-Hant: Python 版本 + zh: Python 版本 + - default: "20" + edit: true + envKey: CODEX_ENV_NODE_VERSION + labelEn: Node.js Version + labelZh: Node.js 版本 + required: false + type: select + values: + - label: "22" + value: "22" + - label: "20" + value: "20" + - label: "18" + value: "18" + label: + en: Node.js Version + ja: Node.js バージョン + ms: Versi Node.js + pt-br: Versão do Node.js + ru: Версия Node.js + ko: Node.js 버전 + zh-Hant: Node.js 版本 + zh: Node.js 版本 + - default: "1.87.0" + edit: true + envKey: CODEX_ENV_RUST_VERSION + labelEn: Rust Version + labelZh: Rust 版本 + required: false + type: select + values: + - label: "1.93.0" + value: "1.93.0" + - label: "1.92.0" + value: "1.92.0" + - label: "1.91.1" + value: "1.91.1" + - label: "1.90" + value: "1.90" + - label: "1.89.0" + value: "1.89.0" + - label: "1.88.0" + value: "1.88.0" + - label: "1.87.0" + value: "1.87.0" + - label: "1.86.0" + value: "1.86.0" + - label: "1.85.1" + value: "1.85.1" + - label: "1.84.1" + value: "1.84.1" + - label: "1.83.0" + value: "1.83.0" + label: + en: Rust Version + ja: Rust バージョン + ms: Versi Rust + pt-br: Versão do Rust + ru: Версия Rust + ko: Rust 버전 + zh-Hant: Rust 版本 + zh: Rust 版本 + - default: "1.23.8" + edit: true + envKey: CODEX_ENV_GO_VERSION + labelEn: Go Version + labelZh: Go 版本 + required: false + type: select + values: + - label: "1.25.1" + value: "1.25.1" + - label: "1.24.3" + value: "1.24.3" + - label: "1.23.8" + value: "1.23.8" + - label: "1.22.12" + value: "1.22.12" + label: + en: Go Version + ja: Go バージョン + ms: Versi Go + pt-br: Versão do Go + ru: Версия Go + ko: Go 버전 + zh-Hant: Go 版本 + zh: Go 版本 + - default: "6.2" + edit: true + envKey: CODEX_ENV_SWIFT_VERSION + labelEn: Swift Version + labelZh: Swift 版本 + required: false + type: select + values: + - label: "6.2" + value: "6.2" + - label: "6.1" + value: "6.1" + - label: "5.10" + value: "5.10" + label: + en: Swift Version + ja: Swift バージョン + ms: Versi Swift + pt-br: Versão do Swift + ru: Версия Swift + ko: Swift 버전 + zh-Hant: Swift 版本 + zh: Swift 版本 + - default: "3.4.4" + edit: true + envKey: CODEX_ENV_RUBY_VERSION + labelEn: Ruby Version + labelZh: Ruby 版本 + required: false + type: select + values: + - label: "3.4.4" + value: "3.4.4" + - label: "3.3.8" + value: "3.3.8" + - label: "3.2.3" + value: "3.2.3" + label: + en: Ruby Version + ja: Ruby バージョン + ms: Versi Ruby + pt-br: Versão do Ruby + ru: Версия Ruby + ko: Ruby 버전 + zh-Hant: Ruby 版本 + zh: Ruby 版本 + - default: "8.4" + edit: true + envKey: CODEX_ENV_PHP_VERSION + labelEn: PHP Version + labelZh: PHP 版本 + required: false + type: select + values: + - label: "8.4" + value: "8.4" + - label: "8.3" + value: "8.3" + - label: "8.2" + value: "8.2" + label: + en: PHP Version + ja: PHP バージョン + ms: Versi PHP + pt-br: Versão do PHP + ru: Версия PHP + ko: PHP 버전 + zh-Hant: PHP 版本 + zh: PHP 版本 + - default: "21" + edit: true + envKey: CODEX_ENV_JAVA_VERSION + labelEn: Java Version + labelZh: Java 版本 + required: false + type: select + values: + - label: "25" + value: "25" + - label: "24" + value: "24" + - label: "23" + value: "23" + - label: "22" + value: "22" + - label: "21" + value: "21" + - label: "17" + value: "17" + - label: "11" + value: "11" + label: + en: Java Version + ja: Java バージョン + ms: Versi Java + pt-br: Versão do Java + ru: Версия Java + ko: Java 버전 + zh-Hant: Java 版本 + zh: Java 版本 diff --git a/apps/codex-universal/latest/data/.gitkeep b/apps/codex-universal/latest/data/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/apps/codex-universal/latest/docker-compose.yml b/apps/codex-universal/latest/docker-compose.yml new file mode 100644 index 0000000..3d272b2 --- /dev/null +++ b/apps/codex-universal/latest/docker-compose.yml @@ -0,0 +1,27 @@ +services: + codex-universal: + container_name: ${CONTAINER_NAME} + restart: always + networks: + - 1panel-network + tty: true + stdin_open: true + volumes: + - ./data:/workspace + working_dir: /workspace + environment: + - TZ=Asia/Shanghai + - CODEX_ENV_PYTHON_VERSION=${CODEX_ENV_PYTHON_VERSION} + - CODEX_ENV_NODE_VERSION=${CODEX_ENV_NODE_VERSION} + - CODEX_ENV_RUST_VERSION=${CODEX_ENV_RUST_VERSION} + - CODEX_ENV_GO_VERSION=${CODEX_ENV_GO_VERSION} + - CODEX_ENV_SWIFT_VERSION=${CODEX_ENV_SWIFT_VERSION} + - CODEX_ENV_RUBY_VERSION=${CODEX_ENV_RUBY_VERSION} + - CODEX_ENV_PHP_VERSION=${CODEX_ENV_PHP_VERSION} + - CODEX_ENV_JAVA_VERSION=${CODEX_ENV_JAVA_VERSION} + image: ghcr.io/openai/codex-universal:latest + labels: + createdBy: "Apps" +networks: + 1panel-network: + external: true diff --git a/apps/codex-universal/logo.png b/apps/codex-universal/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..11155e4d8d043c5f0c64256501150001b1c659aa GIT binary patch literal 7578 zcmZWucQo8zu(xZM)pzx7)#z4zixoyZHkDZ=Ia}Kj{AgJG($b%YP8I5D3c$;);NvTp+R#C@uvazXH;VfoHFQ z1=s}wzFEMF62L1BNGJkKoPh^8z%dMPiw8WD z0UdKd(-?4$1dJSj@^Zi-1h{h#sILI@FaTN~s4fR8%K&99z`zz*-2mGAfQcDky!g++ z^^NEQObyM5gr4`*D#u>TBWyLjgC7`L>Xv+s$#0my-Y4_Xwelw-qM-YaKty@@%tS=& z)_R(1<{@*t1r+z_+8NP0cCV5e_9t%ew2M zk`Yt-E+fi7OxJ?Pm~iv#rd5xn*dg(R=7n|BA1&4K)DhEERaOa~sb`2yih2}*(8@~I z{WE@tqU26bW5MPOScCeX6%0eu&3l1!fZsnNjZq^&muU(qVnCmk1A{Jl{;m-eJ5}K> zRa$59Hd6$)NeO+!KJTh1wP$&Isf`!Ji}4N|YosstdR`7Nu92>qr*srw5UCO89MF`D zC0uh&s#;I~UZsmzE6NDV$I+Dhqk~F+BuWe84`}#A5N8so9GnD!CZOpO&-hQ(!H#(S zy~xm|eeO%G<8G{>pEu<>fTq}^iRc?vyV+4jlrWtqNsmWblbd0&_qm(Ka@DeHn~CD$ zp5sJ`UTwK7$z1tfaG8&R?-{E-%L#BmCfiYxG4nkoNby3C8ug)+6PCR@IFMMI#BXQ` z#JZ8=vx>ub%)dB$DQ%=xqA?E37?C*ap$*$wy9t5^)YdTvfnpecunZeGz&rUbQYJt> z@L4A|8Qlal7@3rSw!k8-U=5N|#ZaT$OM;@~F|8VH6qMF~GEnmlXbP_sH%Vc52BQjd z)+&Pv^SET7lb{;3RS_t0=+>2NPW1iZM{F0U?HK-6iutXDtx?oz*m+UYMR0-A? z##?T&1mF1COli>HSMBe!BHfr1_U~qYFS$R#x^HE{K{kPr$CO_oq^jq!H;QWpLAL&- zr~1_~RW%MRZ?@$Y#56anmc3M5=zM3C{7nNn>BoVv!IGxDKrW1eQYGmf=IQ1iG+vLx z$YQO1jAmHR5G4F;k`(D5J7bZ>#f5w0f9@V?sP$+$P+S@t`ypoI)_I^aG|(gZc2i5% z*NbbPRijn6R=)geHSeFRplh4X{qzqP)A}u+E3=`ST#8pCY z6Ml-Mwp%b7HHwVNwUFS7DCq|NqNl=NJy)(B+SkE+QMj;O@GI-z1%6zFq0a2DqCNoI z6CQ^iI?>yEU)nm(Tjy0{oHUJ;rJ}hP3IB#mhO&pAvII;XO?#)A^Tmb(t;;lO@M-70 z_|-7smn>8U|1@Tb>~C>wK6uX=xt-WT3pr|De_Qu}?Mk@GBQ20F$|C@(r*L7z@&ik- zq#tqxADb%`moH0?HG(6v!+&N!e4d$k#Fi#&r`WG_#WBMLc+y+l#G7Xx?_a;s_(%2d0T<_&^J6@VN0xR&y%BsipV#lpo-1*P zub*!%=dAm&Tiybfui8UN>=knR*i`R|gXa`VZs(P9k=_+(fAeEM!SBUcs15Xrf8SxU zN}dArdH;c#06U34eB9>B>jSP^!t5@J81!{Xj_+kM1uN<_>vatD%B8GW9X}5BAq&0` zH#0*8f~Y1{kZ=4-bvucA+I0BdZ7TYL#6GBGC((WC)A~h$*9Zt7^)Y4#HxbcK?Qh-Y zr(qH$`YTQN7iiZA8wMMTgQ-WB`C=T@z++P2h1zru@JudNg2s{dAg6DW+;w6kc4Nw? z3Cy~hr>}4^#O)wPIWCealV6Rce$&yngywcwW6({;m|axh|Qh32f)ujX1TXoB=$BPF7%u$M1r`W6y9(HrX~4qQn$= zScA0a0>c|mq5@38&p9d+Y7|S&Ve&2{U7U*b*lm&;kV&Ge!Iuq@Y>?EN5?bdWUH5TMj=ZcXek0{3k z9MgXcvxtLbYzQ|d)%+PqD6a$a(i*=iqGtqs?0Q`}NTGW|SEu1Q1(liZdhJ=G{hvK_ z(+X|YqL!-`3w^8Kt?X2gtA6XUr5gqOnN1*frG9ZPxKXK1zL6C5W{Fj>*y)sss=Xx? zTn+lmiKuo1H(l_O-XV9zT$zwkkZ zuM;Z|@=7b^Q3Cda>BjC)HC{-6cZdlU91i?iEBR=T9+GK>(bL0$*BRLF6s~ile$#=v zzrlGDqml(^1<>7(lsXwB)_4$|J_C;+l8PDfjD9>aZew#*q}WZmldRZ}!8lvri#*o` z`gZgYZJR#yJ}3$M1Y9kl|A=)~8OjH`(Q8r&{*b9N`iS+J0(oW73k)kR20X{B8~>9M z8ldl?UbzD?fAoL>1pUuB{-Xi9FQ2El6wB|Qf{g*2;*i&Rb>B0A0mBDiS|YPP7yjZo z7j1;GG1?jh6BI&%;2+n-#OUCG+F=dr!^i27K43ZPf^1Hn}u92p0KZ` z*zp=VJgpvXQWk z#dO{G(+*H-VyYXcO?fWu26J@^pUC5w{^KN_GK zMby7^8|b%!eB&uj^&NK|IMKu_7czM|?-Wd?Bsan8weV6qH7#j>Tpl}J%u@i3qlyr7 z-!4xw9AY73fhPSeyc6yWu#0^s_YGkq%`Ab9IhfR-~+1&1P@Mx)5-G zBipn{hXzf5b1&HuaPx0{>kZ9TP!u48{#2%|ERx!58N|oi+5Bi=~hGsHnp{GoZV$wcciFpA&JD~~OK7Hll4wkNjh!;N3l6leCw?A|wJ6YIv5}at1RiN}1$GLn%(z=EAKd?}|O7rVG>8h`A)Tmb`9cqtKo4l;jS|s%1Srp?X`_0o`ow zo5~{M^}Zzxbivg1%f59lh03ohq^{6*on)W)S6_m+$ZwT2j^Tp)khi|+`QEVpH)Ofy zkN`JocJ9VJ%cc&ja1(AD4i<5|!2mikv`J<9Vv%-+bzUKzEafRq-z}>d?zy{Uia@p8 z|NUL9QBd}Im?1^22EImXDbe*-eS+aB`3WxbVWO`GF9V489^{PC$DDiRudYgZt~Df0 z{6!!FHKVOB2F~Nl`2xe3Xxyfz5DQ7V77mlN-3p*!C*knOj&C@<#S_v*%O zZ+e_KK1Gas4M@9tRdcaS6@C`HcW?JTL}mhl|JM~e)0v)2*l~!`)kb&HeQpdD&*zA_ zE0>G7ev2$p+vk*lJAaaJ;w+%MeD6ntb-D)X$?eAwu*wm6?a|YPcD4FZNSd=j;Ogm= z*UEFI`ArzJjz|`HsdW%7?YMwBF2H2uX&l5HLI21cdADQ|L2$RG(Ue#uaxIM>52)W_ z!`&ozHMMGFr=6|d6V~J|-eVvBrGW7|nM`mWlA#8rdww89(tR8AvH4hEm}8)aj^sPF zKC+d#*E>gF%3u7n`Ac}^^f|F#O^UV@=DIB&ypgruT81*_yn zCTIx@F0Vx6i#q!u&&W|-RA$0iLf`fE(N+A+K-J0I&VeS+jT=|b$mUX^psuR^B9FOV-V(NYk4xN)#L&69sB@Cf%fth>k# zbEvn5R)s(4K-|5N{0?oR$1-bM(;_->}GG|G#vfp&OdbR)eiiE3x0CIkBCy zJbn+@bE?Rh1=p{mD`j|Ptw4cFc*3(T2AIH2BRo-a6dGzOCvFQ$d|AX38cJfF$>VSz zJk#}Ot`wZ?@|dFn8(48m2WqM$>;?+_UV~ViQj!ZtiR=f?fwz914gQ{O1*?^O|88K5 zerGm6d$ItzRqr38-XXD}X^fW&1SNVSs@z;77Gc4dm*Hj7jtS#!yUr|tq30hk^*rt< zEqz~h`ol%A@P^>rKOT|~hfsFTeCwg%5LJYD_AtsyE!o^t3U2(8ReP*e^{x@L$>lB4 zQOA=Z3F!c8@Qg8eQL+W{=#iIl(8BR!@Rv4VK4g@9yR!0-Et8L?!T-`oy5e6X)( zINfjfZ~wBN*n!DmZ6-%;y5iZlLqRker{By%VY5m~b%%-vwP?fbw%QJCY}nO<%=+e* zF?F=RwWLaea-cO0aVThH3f-m*38-M`mNCly#$|1UNkT%si%7_E!Ze^qYYqA|k~S^oxlwmLn={ zShnR7TKLgdD$&7!@G z&=pKm4R80v4k;P-=+Ot5xI;H}A&myt`8(cLk;Q@|V#g-L`0@5fgb`b1#@XfEUo-oy zbl-1R@x%B_gMz2nqkeqJjTzhnUj2wHq4-_5%9C%wF!>ic-t(5AhpxOKtgp-Xu>>^TfOY9)F!a+br(tW`{6^r6b#3FTnK2${_(@OT?aLDGy zC?sIi?RI|k4x|GcR~elH1^51igv|RB#7;-u6(jsl$trVa0_3N!<@uI#5(E@}0qw9@2k?~B%T&RzdbSDSFU@)iDM?`a7Gt;=_$U#%dU#4-? z=ZVR?RB+=W$%)5J3|Fsi(1Q1*rhNU7gmDfskek*@Q6+Y(D6;;fp6YR8h90c4HA!}w z>j`)+GAW(6?j>*W_Zur(K^$8GWR>B}%v0~U&aPgzVflq51g;PfTPC4H87Hc^R z^rcHQK$o-huG=x-DYTT5`{LT4<`$0Kw&bOFF+W9$?II6Z^lNZ6#jh;N^ZDDnOFlZi zUok$=E}ltw#gZgKURb41KFk4a1$kcX&u5x;MOlgetAg#W6nS3XnWqJQMq`4)ZZE5^WcZ&#fzM`dDzEf zm15w}BlX&N1^NDB1xc8^y-=FE|HKqbo{LS@k(wPmc8~mDqic}340!C(lALlLODdM( z2SXRSltr(el&%chkAER_6YPWpp+Z5DKC&dNAjvGE+*oX%*JwA2UylTjflgPanoPZE zfH#`n&d(#SK{Q&E=-z}zrei<+X-!_rmZJu3w+Y2yqVj`pf@e%pJeQs`*;9dM-oh`E zZ8<^X?vUv~mD{WA0@tU)*t6b}2XZ`ij;4?fo%?rr2Gh%?VHoe5KQx+@>3n#=c0U<= zn%7U<;aNz*q^~gM`~12J7kswqSlp*&*%p=G>f8=(g-b%cDocqIFlN&piv0G(DHwBz zP#eH;B{dFXju4VRIlDYp_(nKe_zDwzjWi+TO;co)AJNs$5+T z_jCt9*%#P_RBwLojxNwfAD}{f7R&+KZsOn@4!^cB(kCA!P4UtWkIQ+Ty~}hgTDq*)W#VoEKQR%~{SM ziKvCq=~<8AQ>|d1Z=Yui4;dcYu$;=#`bJ30%aXX|9 zD@6~N_|Pja256T`Adh9hRiv~Pb%4ogut+IwefT7x_4lBrU>(&!4YlcSsrXWnF@(3b zw=FN}kf+ZwJe2k{yWBcEAJ=-5;ePgh3YWO7bMW74YZWz?*(n>`nTv`hx&uO z9m@2L@vbXluMrv1s-80|N;|#ABu0XXUx257_rGO)3iD}5S>idTvhpwbEc`sO`^D%` z(55x|xKIC6-#M)sq1#CI{ITtOMgm95W^$$hCFkW8hm3=by&Z)v!!HvWu0qnU`yJ*6 z%ro1pal-e7q0!Kj^^Tvg%liFT`X3Yr7CuV)^cRa|?!!sq7lb-*F%dPhURKJV(k*WA9lv1F}uZA+WY25{J&?dyNAlYNX08sQXU>nNr z26t&zR~bF*teouHC$+fg4bK6{F@n$XmUY`Wk3Y9_0E}LwUvg7vqQ+i?NGR4T}t`FuiTc)O!-BE zx~0zf?cT$s*C8WV^FY@8=EU9Dg@Fn#;5>?fA(6)XsjaluJg z>SJ;EZO5cKB2J-rN%-%-`&yDrGS0{dViMw4JiznR_f~^w_+f+Kf@D_l_CkzeP^^q3 z{6TUw!>JA=I;R(k%Y|Crew z5yF0D$JpbFfGj(ncrb8V3BY)d9whrvqs1t?7`1DPtswcQ8N)JIj(LO26v$jUts^cf2{M?RFaw;q~R$;z%M)-Bb5hLl}xBHL4$3LI*i98z! ztvhG5V@#e1Ye$(Cd~5y6b&-F6twzUk?EHX)t)9pV2} xZ0^}xVXSRzZSSTC^LMdoRQ>Ph4=S?{9HCkc%5)B7uSbtWdRm5>_392W{{suC0eAoa literal 0 HcmV?d00001