From 6a3b43efcb44264ed20509edb88cfd63b025c2f5 Mon Sep 17 00:00:00 2001 From: zizifn <1803942+zizifn@users.noreply.github.com> Date: Sun, 4 Dec 2022 03:40:14 +0800 Subject: [PATCH] delete v2ray-heroku --- .github/workflows/main.yml | 113 ------------- .gitignore | 105 ------------ Caddyfile | 18 -- Dockerfile | 20 --- LICENSE | 21 --- README.md | 263 ----------------------------- app.json | 20 --- cloudflared-tunnel.md | 50 ------ config.json.tp | 69 -------- heroku.yml | 3 - html/50x.html | 12 -- html/cat.html | 17 -- html/img/cat.webp | Bin 187346 -> 0 bytes html/manage-utils.js | 23 --- html/manage.html | 34 ---- html/manage.js | 81 --------- html/style/manage.css | 24 --- html/style/style.css | 4 - html/test.js | 1 - nginx.template.conf | 53 ------ readme-data/Environments.png | Bin 29514 -> 0 bytes readme-data/EnvironmentsDeploy.png | Bin 67849 -> 0 bytes readme-data/EnvironmentsSercet.png | Bin 56736 -> 0 bytes readme-data/GithubSecrets.gif | Bin 259775 -> 0 bytes readme-data/V2rayN.jpg | Bin 78168 -> 0 bytes readme-data/V2rayN1.jpg | Bin 71020 -> 0 bytes readme-data/delete-app.png | Bin 115597 -> 0 bytes readme-data/deploy.png | Bin 172203 -> 0 bytes readme-data/githubactions.gif | Bin 153450 -> 0 bytes readme-data/herokuapikey.gif | Bin 200488 -> 0 bytes readme-data/start.jpg | Bin 111645 -> 0 bytes readme-data/stop.jpg | Bin 117035 -> 0 bytes readme-data/tunnel-host-name.png | Bin 107605 -> 0 bytes readme-data/tunnel-tokens.png | Bin 55534 -> 0 bytes readme-data/tunnels.png | Bin 5040 -> 0 bytes startup.sh | 30 ---- 36 files changed, 961 deletions(-) delete mode 100644 .github/workflows/main.yml delete mode 100644 .gitignore delete mode 100644 Caddyfile delete mode 100644 Dockerfile delete mode 100644 LICENSE delete mode 100644 README.md delete mode 100644 app.json delete mode 100644 cloudflared-tunnel.md delete mode 100644 config.json.tp delete mode 100644 heroku.yml delete mode 100644 html/50x.html delete mode 100644 html/cat.html delete mode 100644 html/img/cat.webp delete mode 100644 html/manage-utils.js delete mode 100644 html/manage.html delete mode 100644 html/manage.js delete mode 100644 html/style/manage.css delete mode 100644 html/style/style.css delete mode 100644 html/test.js delete mode 100644 nginx.template.conf delete mode 100644 readme-data/Environments.png delete mode 100644 readme-data/EnvironmentsDeploy.png delete mode 100644 readme-data/EnvironmentsSercet.png delete mode 100644 readme-data/GithubSecrets.gif delete mode 100644 readme-data/V2rayN.jpg delete mode 100644 readme-data/V2rayN1.jpg delete mode 100644 readme-data/delete-app.png delete mode 100644 readme-data/deploy.png delete mode 100644 readme-data/githubactions.gif delete mode 100644 readme-data/herokuapikey.gif delete mode 100644 readme-data/start.jpg delete mode 100644 readme-data/stop.jpg delete mode 100644 readme-data/tunnel-host-name.png delete mode 100644 readme-data/tunnel-tokens.png delete mode 100644 readme-data/tunnels.png delete mode 100755 startup.sh diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml deleted file mode 100644 index b25ce4a..0000000 --- a/.github/workflows/main.yml +++ /dev/null @@ -1,113 +0,0 @@ -name: heroku-deploy-stop-start-destroy - -on: - workflow_dispatch: - inputs: - actions: - description: "action: deploy/stop/start/destroy" - default: "deploy" - required: true - heroku-region: - description: "us 或者 eu. 如果你的app已经创建,切换到不同的region,需要先输入 actions 为 destroy 删除app" - default: "us" - required: false - heroku-app-name: - description: "可选,如果输入,则会覆盖 Secrets 里面配置的 APP_NAME。" - default: "" - required: false - env: - description: "environment: Input the name of Environment. If left blank, the main secrets setting will be used by default." - default: "" - required: false - -jobs: - jobenv: - runs-on: ubuntu-latest - environment: ${{ github.event.inputs.env }} - env: # Or as an environment variable - APP_NAME: ${{ secrets.APP_NAME }} - outputs: - actions: ${{ github.event.inputs.actions || 'deploy'}} - test111: ${{ github.event.inputs.env }} # todo - steps: - - id: isDeployHeroku # TODO check atcion doc for usage - # if: ${{ github.event.inputs.actions == 'start'}} - run: echo "test output" - - output-jobenv: - runs-on: ubuntu-latest - needs: jobenv - env: - APP_NAME: ${{ secrets.APP_NAME }} - HEROKU_API_KEY: ${{ secrets.HEROKU_API_KEY }} - EMAIL: ${{ secrets.EMAIL }} - HEROKU_V2RAY_UUID: ${{ secrets.HEROKU_V2RAY_UUID }} - HEROKU_TUNNEL_TOKEN: ${{ secrets.HEROKU_TUNNEL_TOKEN }} - steps: - - run: | - echo "actions: ${{ github.event.inputs.actions }}" - echo "heroku-region: ${{ github.event.inputs.heroku-region }}" - echo "heroku-app-name: ${{ github.event.inputs.heroku-app-name }}" - echo "env: ${{ github.event.inputs.env }}" - - id: APP_NAME_is_empty - if: ${{ env.APP_NAME == ''}} - run: echo APP_NAME is empty - - id: HEROKU_API_KEY_is_empty - if: ${{ env.HEROKU_API_KEY == ''}} - run: echo HEROKU_API_KEY is empty - - id: EMAIL_is_empty - if: ${{ env.EMAIL == ''}} - run: echo EMAIL is empty - - id: HEROKU_V2RAY_UUID_is_empty - if: ${{ env.HEROKU_V2RAY_UUID == ''}} - run: echo HEROKU_V2RAY_UUID is empty - - id: HEROKU_TUNNEL_TOKEN_is_empty - if: ${{ env.HEROKU_TUNNEL_TOKEN == ''}} - run: echo HEROKU_TUNNEL_TOKEN is empty - # - run: echo ${{needs.jobenv.outputs.herokuAppName}} | sed 's/./& /g' - - - heroku-deploy: - needs: jobenv - if: ${{ needs.jobenv.outputs.actions == 'deploy' || needs.jobenv.outputs.actions == ''}} - runs-on: ubuntu-latest - environment: ${{ github.event.inputs.env }} - env: # Or as an environment variable - APP_NAME: ${{ github.event.inputs.heroku-app-name || secrets.APP_NAME }} - steps: - - uses: actions/checkout@v2 - - uses: akhileshns/heroku-deploy@v3.12.12 # This is the action - with: - heroku_api_key: ${{secrets.HEROKU_API_KEY}} - heroku_app_name: ${{ env.APP_NAME }} #Must be unique in Heroku - heroku_email: ${{secrets.EMAIL}} - usedocker: true - region: ${{github.event.inputs.heroku-region || 'us'}} - # docker_build_args: | - # HD_UUID - env: - # 这是为了heroku,注意前缀有个HD,这是为了告诉heroku-deploy,这些变量需要传入到 container 中。 - HD_UUID: ${{ secrets.HEROKU_V2RAY_UUID }} # UUID for v2ray user, 为了安全,一定要放入 github action token 中 - HD_TUNNEL_TOKEN: ${{ secrets.HEROKU_TUNNEL_TOKEN }} # token for cloudflared tunnel - NODE_ENV: production - SECRET_KEY: ${{ secrets.MY_SECRET_KEY }} - stop-start-destroy: - needs: jobenv - if: ${{ needs.jobenv.outputs.actions == 'start' || needs.jobenv.outputs.actions == 'stop' || needs.jobenv.outputs.actions == 'destroy' }} - runs-on: ubuntu-latest - environment: ${{ github.event.inputs.env }} - env: # Or as an environment variable - APP_NAME: ${{ github.event.inputs.heroku-app-name || secrets.APP_NAME }} - steps: - - uses: actions/checkout@v2 - - uses: akhileshns/heroku-deploy@v3.7.8 # This is the action - with: - heroku_api_key: ${{secrets.HEROKU_API_KEY}} - heroku_email: ${{secrets.EMAIL}} - justlogin: true - - run: | - echo action is ${{ needs.jobenv.outputs.actions }} - if [[ ${{ needs.jobenv.outputs.actions }} == 'stop' ]]; then heroku ps:scale web=0 -a ${{env.APP_NAME}} && echo "stop"; fi - if [[ ${{ needs.jobenv.outputs.actions }} == 'start' ]]; then heroku ps:scale web=1 -a ${{env.APP_NAME}} && echo "start"; fi - heroku ps -a ${{env.APP_NAME}} - if [[ ${{ needs.jobenv.outputs.actions }} == 'destroy' ]]; then heroku apps:destroy -a ${{env.APP_NAME}} --confirm ${{env.APP_NAME}} && echo "destroy app"; fi diff --git a/.gitignore b/.gitignore deleted file mode 100644 index d891e84..0000000 --- a/.gitignore +++ /dev/null @@ -1,105 +0,0 @@ -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -lerna-debug.log* - -# Diagnostic reports (https://nodejs.org/api/report.html) -report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json - -# Runtime data -pids -*.pid -*.seed -*.pid.lock - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage -*.lcov - -# nyc test coverage -.nyc_output - -# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# Bower dependency directory (https://bower.io/) -bower_components - -# node-waf configuration -.lock-wscript - -# Compiled binary addons (https://nodejs.org/api/addons.html) -build/Release - -# Dependency directories -node_modules/ -jspm_packages/ - -# TypeScript v1 declaration files -typings/ - -# TypeScript cache -*.tsbuildinfo - -# Optional npm cache directory -.npm - -# Optional eslint cache -.eslintcache - -# Microbundle cache -.rpt2_cache/ -.rts2_cache_cjs/ -.rts2_cache_es/ -.rts2_cache_umd/ - -# Optional REPL history -.node_repl_history - -# Output of 'npm pack' -*.tgz - -# Yarn Integrity file -.yarn-integrity - -# dotenv environment variables file -.env -.env.test - -# parcel-bundler cache (https://parceljs.org/) -.cache - -# Next.js build output -.next - -# Nuxt.js build / generate output -.nuxt -dist - -# Gatsby files -.cache/ -# Comment in the public line in if your project uses Gatsby and *not* Next.js -# https://nextjs.org/blog/next-9-1#public-directory-support -# public - -# vuepress build output -.vuepress/dist - -# Serverless directories -.serverless/ - -# FuseBox cache -.fusebox/ - -# DynamoDB Local files -.dynamodb/ - -# TernJS port file -.tern-port -.local/ diff --git a/Caddyfile b/Caddyfile deleted file mode 100644 index 09ddb70..0000000 --- a/Caddyfile +++ /dev/null @@ -1,18 +0,0 @@ -http://:{$PORT} { - root * /root/html - file_server - # http2 not support by heroku yet - reverse_proxy /h2 127.0.0.1:8082 { - transport http { - versions h2c - } - } - - @websockets { - header Connection *Upgrade* - header Upgrade websocket - } - reverse_proxy @websockets localhost:8080 - - -} \ No newline at end of file diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index 4ffee0d..0000000 --- a/Dockerfile +++ /dev/null @@ -1,20 +0,0 @@ -FROM v2fly/v2fly-core:latest - -RUN apk add caddy -RUN apk add gettext -RUN apk add curl -RUN apk add jq - -COPY html /root/html/ - -COPY config.json.tp /root/ -# COPY caddy.template.conf /root/ -COPY Caddyfile /root/ - -ADD startup.sh /startup.sh -RUN chmod +x /startup.sh - -ENTRYPOINT [ "/bin/sh" ] -CMD ["/startup.sh"] - - diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 36b8bce..0000000 --- a/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2020 zizifn - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. \ No newline at end of file diff --git a/README.md b/README.md deleted file mode 100644 index be8230e..0000000 --- a/README.md +++ /dev/null @@ -1,263 +0,0 @@ -# 本项目已死, 如有需求请访问 https://github.com/zizifn/edgetunnel - - -**Starting October 26, 2022, we will begin deleting inactive accounts and associated storage for accounts that have been inactive for over a year. -Starting November 28, 2022, we plan to stop offering free product plans and plan to start shutting down free dynos and data services. -We will be sending out a series of email communications to affected users.** - - - - - - - - - - -# v2ray-heroku - -> ~~貌似新建的app有些需要科学访问~~,如果需要,请使用cloudflare worker CDN 或者 cloudflare tunnel 套一层。 - -> 切换到最新的 VLESS 协议。具体客户端配置请看 config 章节。 - -> v2ray-heroku 是我为了体验 github action 的产物,也是我的主力 backup,我会日常维护它。加入或者修改一些我认为好的配置。但这一般会导致客户端配置需要些许修改。 不过具体配置都会体现在 [详细 VLESS websocket 客户端配置](#vless-websocket-客户端配置) - -> 有问题请开 issue 或者 discussions。 - -> 很多人反馈 heroku 封号,我自己的还好用,请大家反馈,如果大部分人都被封号,那么就没有办法了,其他的免费的我试了 Okteto Cloud, 秒封。 - -## **请大家不要跑速度测试,或者长时间大流量。** - - -## Change log - -应需求,加上首页伪装,每次部署都会随机生成首页,如果你有想法,请自己把想要的html放入到 项目html 文件,然后后续 action 部署会自动拿到。 - -## !!!!!!! **对于一些老用户是 breaking change, 对 ws 的 path 做了修改, 请注意查看客户端配置** - - -首先查看别人的 [youtube 教程](https://www.youtube.com/watch?v=xHZyDsFYdvA),了解怎么配置 v2ray-heroku。**本项目使用最新 VLESS 协议,请在客户端配置选择 VLESS**。 -[详细 VLESS websocket 客户端配置](#vless-websocket-客户端配置) 。 - -如果你还想自动化你的 heroku,请查看下面的教程。 - -本项目是包含, - -- 一键部署 V2ray 到 heroku。 -- 利用 Github action 实现 [重新部署](#重新部署)/[停止](#停止)/[启动](#启动)/[删除](#删除)。 -- 支持 heroku 的区域(us 和 eu) -- **支持[多app和多账户](#使用-environments-实现-多账户多app-secrets-管理) [重新部署](#重新部署)/[停止](#停止)/[启动](#启动)/[删除](#删除)。** - -- 利用 cloudflare CDN 进行加速。 -- **利用 [cloudflare tunnel](https://www.cloudflare.com/products/tunnel/) 进行加速。** -- **随机生成首页。每次部署都会产生随机首页。** - 1. 如想自定义主页,请自行在仓库中生成 index.html 放入 `html` 中 - -```text -项目Dockerfile是基于V2fly 官方镜像制作。仅仅增加生产配置文件的脚本。重新部署就可以更新到最新的v2ray。 -基于官方镜像,这也是v2fly 推荐的做法。 -``` - -> 保持安全最简单的方式就是,保持软件更新。 - -## 一键部署 - -[](https://heroku.com/deploy) - -> 貌似在这个 repo 下 点击 一键部署貌似 heroku 提示违反某些原则,但是action 正常工作!!建议 fork 时候,项目名字,尽量不要带有 v2ray 关键字。 - -> 如果被heroku 提示错误,请用 github action 来部署。 - -> 部署成功后,可以先用浏览器访问 ***.herokuapp.com, 查看页面是否能正常访问。会显示一个随机的维基百科页面。 - -## Github Actions 管理 - -请 Fork 本项目到自己的账户下。 Actions 需要以下 Secrets 才能正常工作,这些 Secrets 会被 workflow 中的 [akhileshns/heroku-deploy](https://github.com/AkhileshNS/heroku-deploy) 使用。 - -具体实现细节,请查看 [workflow 配置文件](./.github/workflows/main.yml). 如何配置, 请查看,[Github Secrets](#github-secrets) - -| Name | Description | -| ----------------- | ------------------------------------------ | -| APP_NAME | 就是你 heroku 项目的名字. 如果你是第一次创建APP,**请确保名字是唯一的**| -| EMAIL | heroku 账户的 email | -| HEROKU_API_KEY | heroku API key,在 account 设置下可以找到 | -| HEROKU_V2RAY_UUID | V2rayUUID | -| HEROKU_TUNNEL_TOKEN | **可选** cloudflare tunnel 的 token | - -> 这样Token一定必须是大写。。请在 heroku 网站创建app,来确保项目的名字的唯一性。 - -HEROKU_TUNNEL_TOKEN 是可选项,可以忽略. 详细说明,请查看章节 《建立-cloudflare-tunnel-(可选)》 - -> 请务必生成新的 UUID。使用已有的 UUID 会使自己 V2ray 暴露在危险之下。 - - -PowerShell: - -```powershell -PS C:\Users\> New-Guid -``` - -Shell: - -```bash -xxx@xxx:/mnt/c/Users/$ uuidgen -``` - -### Github Secrets - -路径 - -```text -项目Setting-->Secrets -``` - - - -### Heroku API key - -路径 - -```text -heroku Account settings-->API key -``` - - - -### Github Actions 界面 - -```text -Actions -``` - - - -### 重新部署 - -点击 `Run workflow`, 输入 deploy。 然后就会重新 deploy。 - -这里可以**选择区域**,但是请确保app没有被创建过。如果要切换区域,请先使用 destroy 删除应用。 - - - -### 停止 - -点击 `Run workflow`, 输入 stop。 然后就会 stop,不在计入小时数。 - - -### 启动 - -点击 `Run workflow`, 输入 start。 然后就会启动。 - - - -### 删除 - -点击 `Run workflow`, 输入 destroy 然后就会删除。 - - - - -## 建立 cloudflare worker (可选) - -如果遇到创建的app在正常网络下不能访问,请尝试这个。 - -可以参考 开头的视频。代码如下。 - -```javascript -const targetHost = "xxx.herokuapp.com"; //你的heroku的hostname -addEventListener("fetch", (event) => { - let url = new URL(event.request.url); - url.hostname = targetHost; - let request = new Request(url, event.request); - event.respondWith(fetch(request)); -}); - -// herokuapp 如果长时间不访问就会休眠。增加cron事件监听器以支持定时job访问herokuapp url。 -addEventListener('scheduled', event => { - event.waitUntil( - handleSchedule(event) - ) -}) - -async function handleSchedule(event) { - let url = new URL("https://" + targetHost); - url.hostname = targetHost; - let request = new Request(url); - const resp = await fetch(request); - //console.log(await resp.text()); -} -``` -然后添加Worker的触发器以定时访问herokuapp url: - - - -如果 worker 不好用,请用自己域名代理 worker -https://owo.misaka.rest/cf-workers-ban-solution/ - -为 worker 选择速度更快的 IP。 -https://github.com/badafans/better-cloudflare-ip - -## 建立 cloudflare tunnel (可选) - -项目集成 cloudflare tunnel, 在配置 Secrets `HEROKU_TUNNEL_TOKEN` 之后生效。具体怎么配置,请查看 [cloudflare tunnel](./cloudflared-tunnel.md)。 - -## 使用 Environments 实现 多账户/多app Secrets 管理 - -文档介绍: https://docs.github.com/en/actions/deployment/using-environments-for-deployment - -### 建立 Environments, 并添加 Secrets - -1. 创建 Environments - -2. 添加 Secrets - - -### 输入环境名字 -**一定要确保环境名字是对的,要不然就会用主的Secrets。** - - -## VLESS websocket 客户端配置 - -### JSON - -```json -"outbounds": [ - { - "protocol": "vless", - "settings": { - "vnext": [ - { - "address": "***.herokuapp.com", // heroku app URL 或者 cloudflare worker url/ip - "port": 443, - "users": [ - { - "id": "", // 填写你的 UUID - "encryption": "none" - } - ] - } - ] - }, - "streamSettings": { - "network": "ws", - "security": "tls", - "tlsSettings": { - "serverName": "***.herokuapp.com" // heroku app host 或者 cloudflare worker host - } - } - } - ] -``` - -### v2rayN - - -换成 [V2rayN](https://github.com/2dust/v2rayN) - -别人的配置教程参考,https://v2raytech.com/v2rayn-config-tutorial/. - - - -cloudflare worker ip 配置 - - diff --git a/app.json b/app.json deleted file mode 100644 index f4179c4..0000000 --- a/app.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "name": "V2Ray", - "description": "Deploy V2ray on Heroku.", - "keywords": [ - "V2Ray" - ], - "env": { - "UUID": { - "description": "V2Ray UUID", - "value": "ce7ea10b-5b27-49ab-a93d-6b184df9cce9" - }, - "TUNNEL_TOKEN": { - "description": "Cloudflare Tunnel Token", - "required": false - } - }, - "website": "", - "repository": "", - "stack": "container" -} diff --git a/cloudflared-tunnel.md b/cloudflared-tunnel.md deleted file mode 100644 index b60fdb6..0000000 --- a/cloudflared-tunnel.md +++ /dev/null @@ -1,50 +0,0 @@ -# Cloudflare Tunnel - -## 申请 Cloudflare, 并且开通 https://dash.teams.cloudflare.com/ - -虽然免费,但是申请 zero trust 需要绑定信用卡。 - -> 用人反馈不需要绑定信用卡,但是我是需要的。 - -需要一个**域名**,并且绑定到 Cloudflare。 - -## Cloudflare tunnels - - - -## 保存 Token - -在创建时候,可以在 Tunnels 的页面中找到 Token。 - -> Token 是 `--token` 后面的字符串。就是图片中,用**红色涂抹**的部分。 - - - -## 添加域名 - - - -**注意事项**, - -1. 定义一个自己的二级域名,不要和其他的二级域名冲突。 - -> 这个域名就是你 tunnel 的地址,需要最后配置在 V2ray 客户端中。 - -2. Service 配成自己 heroku 的名字, \*\*\*.herokuapp.com - -3. HTTP Host Header - 把自己 heroku 的名字, \*\*\*.herokuapp.com,添加进入,**很重要**。 - -然后把 Token 配置到 Github Action `HEROKU_TUNNEL_TOKEN`。然后重新部署 herokuapp。 - -Cloudflare Tunnel 的配置,运行在 herokuapp 的 Cloudflared 会动态获取。 也就是说,如果成功后,你在 Cloudflare Tunnel 的改动会动态同步到 herokuapp 中。 - -重新部署 herokuapp 成功后, 记得在浏览器输入你 tunnel 地址和 自己 herokuapp 的地址,如果返回 Bad Request 字样,代表一切通顺。tunnel 地址可能会有 1 分钟左右延迟。 - -> herokuapp 如果长时间不访问就会休眠。。所以你如果用tunnel,就需要一个定时job 访问herokuapp url. - -## v2rayN - -其他配置和直接连接 herokuapp 是**一样的**,只需要把 v2rayN 的配置**地址改成你自己 tunnel 的地址**就可以。也就是你在设置 tunnel,添加的自己的域名。 - - diff --git a/config.json.tp b/config.json.tp deleted file mode 100644 index dfa30fd..0000000 --- a/config.json.tp +++ /dev/null @@ -1,69 +0,0 @@ -{ - "policy": { - "levels": { - "0": { - "handshake": 5, - "connIdle": 300, - "uplinkOnly": 2, - "downlinkOnly": 5, - "statsUserUplink": false, - "statsUserDownlink": false, - "bufferSize": 10240 - } - }, - "system": { - "statsInboundUplink": false, - "statsInboundDownlink": false, - "statsOutboundUplink": false, - "statsOutboundDownlink": false - } - }, - "inbounds": [ - { - "port": 8080, - "protocol": "vless", - "settings": { - "clients": [ - { - "id": "$UUID", - "level": 0 - } - ], - "decryption": "none" - }, - "streamSettings": { - "network": "ws", - "security": "none" - } - } - // { - // "port": 8082, - // "listen": "127.0.0.1", - // "protocol": "vless", - // "settings": { - // "clients": [ - // { - // "id": "$UUID", - // "level": 0 - // } - // ], - // "decryption": "none" - // }, - // "streamSettings": { - // "security": "none", - // "network": "h2", - // "httpSettings": { - // "path": "/h2", - // "host": [ - // "**.herokuapp.com" - // ] - // } - // } - // } - ], - "outbounds": [ - { - "protocol": "freedom" - } - ] -} \ No newline at end of file diff --git a/heroku.yml b/heroku.yml deleted file mode 100644 index 8eec25b..0000000 --- a/heroku.yml +++ /dev/null @@ -1,3 +0,0 @@ -build: - docker: - web: Dockerfile diff --git a/html/50x.html b/html/50x.html deleted file mode 100644 index 3dde65b..0000000 --- a/html/50x.html +++ /dev/null @@ -1,12 +0,0 @@ - - -
- - - -
-
-
-
-
\ No newline at end of file
diff --git a/html/img/cat.webp b/html/img/cat.webp
deleted file mode 100644
index 861f9fa891a290b7b39c6946a60b48ed6e038f2e..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 187346
zcmbTd1z1#T*eE&--3`(q-QC?OAs`*n-Q5z>ph$zXw1g7U-7V6sNH@|jcLvnG_kZp=
z_daKyhv8joeQT}vd%H$mUPfkc0SI^@EupHV%BPJ40079rfAz?KNqB&~q@=1G3iuF!
zBBx~S;0VM30PG#yT-0SH$hCEJ$>B!3-di?EnqSXCflyI1Rg<3^k49%kbwa`0t zT7}D>t6hja8@P98 V Dv?As!5YX zNxeY>os`Qb@4xUvxoMMvVgqvq_ob?v%kCIEte`LSHp|{-1ZM*&Y`jm+x1tzG*I(cm zUrcR|ZH4`ekMUwp(|CKM=8R*N$|=9iDNa71w^uRYodeXd*N=E*rwS)v`&qgao~6E6 zsrc1TN&e5u^1jDiJeHPPX)Y6JR-ZJ+lG={WJs2f_Mqa{=nYpVzgWAYH5*dRXhHgd- z#iZJl$@y%-vT<01RKr9S7G6$iRQkSHHg2o*DK3s;ab|N_O+BdxYcM;Az +9Y3q3vE*OL{*hS!%kjq7p^1=+l8hjJ-V^#wcG!S%6){TaR}t1`b*gaIkc= A<^KA8 UOMXRl_c na`MDmC4*N^$Zk(Q`v#j4IygfnEJy zp%WDyI>+!_I%e5FE!p}Q_4gU->;)?L)x4iHgH9U>PgIcf(QOXURK!QDsN`>oV3Iqi zV=h|BlPeXQMth1AwYNw#*c}zrCf0uheh?@589QWT`Ux &RHc1@J FDW;sb7Z) zDf}5y;5x_Q3H1*ieZ6VVro*h^Z7s#p{MgAoqpoMrB_(Sdy#robsu$k4`eMOcQJm0B z2j|5>d(d4`o#WnYWdo9ZHfKT5r)9YVm7y@stAhzdvJCR{A;_g)2?KPPG7ae>UIfK) zTw_VrYXE9ycXcunrmQA!4Q8Yz#=U#*N-vPF+Y7aD&GfKF8D4OXHk{PpY^_9|q{$5w zH)bA0#|fs!Stz1ae#4q0dDg@JyAx$PO=~c@f3cs# zdNhbF-z#_o_H;V<&NNtcyyxA|Ibcs@1&NLmfEUHT=0!3P?$?4?r^~F>vn<|ItWEd3 z%YD(eeK8UIcBsB}ME4rlN#7ZgpA&TDw>c9Snk?JhUNkE4ftm5U{Pj=6AgKseS%%F# z1k(Dg%jA-S6h*VoB|(FEf0EVkGDL;o20Fs_8nh2@xGBq1G)#k~F-d#$Mysy` m{J)7d#kDn %% zT@lg2q}sB^htPNLLt>sc0}TzGBb+5|C)8_x7OW4){unkpe!Z(r88n}pZT$vGdMt~E zQq{?Do|N75j0%}8)C x}KuG_qRdxulPve>#Llz-)2T#16*kaSE#e;B!OTL5Fqi8=>EKN z$NF}Q85bs3HNT3nr||1(9hxmD8AqC#(FR|1YHu-R+NfQLg+*;~hQZmS zd$1riClo!^Gwr>M0VSBawq+MU$i*<0Cj6I}3XhEf;?2(=@g%<-`EN-bIwj7J(^pOO zz3boM-*UAl5;xmWP%4unRZV$`jL~lF@68qblF4v3;YUqQCq-7-h|X$g9sB9>`&3@j z!^F{$3g_K&MY>NrLkQ1uq9V-^BE2gUzT?g8634}sgkd!iU%PtClXF)~^+b@)VWD~G zvaedpDfzqyZJ@Vs@*x}8&qp$mh;zh88P#Y^jF5?Docz4`B>WuuxGxKir+CE@oxj)q zj8mfx3Hqzd=U~PXWwX{<=CdB}ckFdlv+wUYO*&0VHJE_H$a&K|tzS+zat;m{IiE7` zrR&=l@qO${iGbu?|8sU@@G|Oq409u-y~S}522R3=wuDt7lNi@;RUoy7$zq mOyo=#soe3Yq@EStkko!fnjpL@Wp@yzbQ z4U;X;{@OtG5EKZ6-{Q%pFq2_q=#Y=CTJIPUzoVfbm^({944#Cp+$|kcx#siX^PxUc zuK>!iQ6sBp>k_iPLs$ekcD1?ky{x2v1I-h+VYM9En*TNVS-nOCj&z^%8O8k>Mb~AH zqk-|L`M7c`HmIL4w8y>|ccSQMs@o2Bj6r#M``Mt5TI+B`!vbNxrD~qHS87+pbHY|O zG?_x}CvRKkW>mshUTS6s_Dkq!jRvFz5n@D^?^M$h>MYQ~sjhVF+#1%zSt8}+h(S-r zJ<(Qvtx-y^g6q3iv!;KqOmv+ZB0Q?6k!1KxNq%WGuYoharzKCxdm@GT^S2-7wc3lI zDSOJoS!1<=m%zIGWgVE1^wwjkNU%-6_;2eZsm)^cv_0CP8XO9ZeDDX-ki390d+hr> zv<^S=q88yEwPyrSzm6^V_QM60Zk8n@*(ru|UqDMU#S^NuB3VKBWoUm0I>-{&*J7nx zOL}eS^0Y9(!#gSESX^o^H8zsQ04t#4ywXS;K(Ra@))UF=^I>kfJ-9L}A)IA!t6UXv z&hW)gbf;zR1LsxZx5csAe(_4|I!YI(Q9Tv;c|SEqTin!)z7#9h9|rWVIjBYzdk3$r zq?KyV`(RC2hh?Gw?j~eg$v}FYqJ^QH32jIyDJX)+;T4~T<5i(+4q;03T39oO%g!j@ z^-|guDbor@Byd(i5tTz};Iwz} cM#p3?5l~PN}aJ?3E#HIBDE15Bp5H2SeO%{ROWn8 z?q@x}?(YBe--dV9=rf3$4cN~Hj|K!TeY5yiOUVEFuuZx$C|7Q*yLa>>WihP`i61p* z{Lxg9{6@b&`d8A;I>*MMotEWygF0$AtU9^zYF5_a3>`fLk#W!5dMc9PecbTL0OqRj3C1@RK=tGle ztoz5CNM;`#Dce=0k?UH4d?n##ruSb^>nf|&)zQMn=Z-dahbZ#vnqR=PztvKf(nsUg zn3RQ }t6j3CrGfR$_{mRO}q&GgxaTY1yL_Xc7Z z)y`}Kkxx!nE1&3fWaS9y)bmlIAwA!)W*pC8XTx!g$9Tdt&8jt-+2?`AF+*Abm)Nus zX&eo1fTLDD)*&A{+z&0S==)p#PxnbJpegX24n8=%tVXCt2!Io&dk8Z<8kg(!o$rJx z7o_I$CiOq=>K(J^FRi>T*q|k66LM>;-YI+kTwn5V7>yt>LvuZ4%nizw-K+md!o;~= zrVZd~f7|@6RI+a_vEbLe-POh*;^mJtRU_33%Xhxo_li_SX1l5&-2^9-Te2Hau3mfd zphSg#8|DFBj%rq$3S%DC%&8%IcYk%-h!$;-osFu^W|Ta;MZ@NG*43cp8P7+REvFB# z&4K0dPlRp+SPD2PVy#h)eYf}A>dih6Se29 ~5o0_6Av9mQucql&yeFJktTAok3qAXL@BBu8~8w(d!*YT>WUj3`~SD zi!wuX`^2m&Ov-2&`FhJ;#c>LiXn|_~hbN;@-4*h6FTb@KXfR}w)+J|AQ^|5Z75Nf4 z@%?#^rnrViBtV)#WF=P8H!_N#PvA9c$G8{@H@KOa{U@0JGm-{wp%tNnCu*vS`pp}O zP?WTN9_q_)hXkhDS|wkk)3;SR3P|3!t7zKHdxA)e n2 Sr8p=oj|3?{uc=h^cu?52~)Gmr2x1WPKjqV@W8lIu6 f z(SFnCxTZsowJZNnnBkfW_#- bhdPXokFB`*HJH`>vzlJY_o)r5t`mr5N8DeO zd0)+rTZfDuXs>6GO8)rfT0b<TMd-sN^Jq4ELL;4>UF85WbNPHs?<<(*SuFdggp@t)tAwT4tWF{#R!R%Lpf zH@#@Qo#EsMgkT(xloQ&ddSvx;C<*6o%k>?qd_@WTURss^E5b;yJx)1}5H2UnmPJ0T zPVZUqQ9*TF?(P*3d!ER5ir%VC+eF0nmfv-Iqs8jjY^X1HKvlogP&u)iQoDj|$0Gzo zni3JY%@7s@LsOn%F4M6$Q-X6qI`-|1v%u$gzafE;--IxTOUV7jx84c?hx)#9QCf~w z%v*tP225z&Z&`aZ0_}EOBh%eUO3sPwREwM`kiWNKeU$0FJTw>;H+JzI29=j%lD=f@ zbK(hKg<_S~&4D>XU;SlX;@ewC(|azl>CLQ|QRDPjq8xG)EV~qzwekE0LtuseZ+f5M z+C`+sTkeE(Cg{2G5F`mEx&7;OYyG}ZNScI$o4-oKE%U4$H-^I4$Q+a26XBUQD$ zgUk4am=T>oSq>E{fmYr6^6ST=cEA9E!pmND<;DXk9ee?n>DP(l0c8yeg}X1*c;?o& zxX;`z3NB0>5H#|*yP16Jj@RY{xv$y1EfH^Xo^`_7Ev68_uX! d+-wZh z8tunlzFyeqbe!{X=DY-4y=!`#zfNwFN`5f3$tJBcn5`Cpg6!)oJk0f`?6}&n$TXl; zM2~dk`6Wp_xgZ00LLd2)mug%|F*gSvj4*qS@Q}2#gAsN!{QJ<^VJ8;y?*NWvCen}h zd@VghekTifuBX+X-N;GaNPPwIPDwI0zZrRm!T-#dJh3H~8dA0U8@YcecO?Rs@8hi@ zgI!6Yf#0$rQ@JD#0H-snrFi278tjPzY|}Pv!k-qo%W{NhBb9@tEwnk8vmydE>e=y( zoCcx(B2ox36| @L5 zGjtB&Goh0N39=QuR}U$hps2T&p00z|&^4^|_E8u4q00gw1KLqxe$ln2rNtBXo0c4d zaXux#<``NUQPL}UH>+qaIaJ^uP6hY9A^+`(1YPyvQDpwpf09bbDBb0qgv&qU3syTz zc&+d&d%RGr5 (5Ejm!)gKO{h z3(nJ&Tv;VmXl5yDQC-4emdNsVqMLIIvg3ZtI|MX@UHkOQj#=J(M8%njNvgGQNfpu! zreu%y20hccp)sp^k}<*4K~Gjg*pNMwtZs-q6a76P;P54L)B1BsqSl6w%E(ToG3Ci@ z-|p!eYXL5bpW>6B$u>qRZF-p2xtZ&ue kB*@>PX#hicjv1EPQjqmxM})G#Ra8Qz5WPfaH_f z-P>R>q^*~`)VTXTAD2<6>R$s%k9|IRm?v63{(q_~jb0~9DE*F^pA8?Y!O0&0WH=)O z$LGa`be=`<7>hC=u6Ms;kqe<94Qoa>s*CS;*o(B<3YxY23@byd|4z=Xc3^(59{xmy z3A1B0BFMT!E&wC2+yZG;;2m*Qf8elm)f+YYcV?=)rIoDS&CjFKYdZ~Buugl)$>sI@ zr*i9&sD9k%MjqoIhm-3O6%ht~yrikc!vth&RO#7z+W3D^85VcRD|WWc{v7FZDK_40 ztd8I0m&m>M#>90*O$$CoOimpuxbXR1ERNoyfn_nTh4JgWB_peMLFN6?y%Ga8lIp%9 zE3^{1hYIX8-7!)ppA|%nY51J53v7A-YO!-fIa;hS2)oJnqD{@F^9#83sKNcw@a}d_ z%z5z?w_{#o3vZE(z9kXrw_A~NMi_E|dV=^ZDBe l6HccVgHw4WXSY%8;yCA)|v_s{Ij;|wt^|LouS zMQ-!9; )^*r=xa z`Q^Sny^6yGN=%HEWD>%bZBzWO*Ik|aB*ia_>2yU4NS|XPtPAiQ+G{MrjdtKok=dsU zuXY9Grp?jRm2Khp+Idjs$9VmO{ $L@a z8i}8(HS)$AzQyO_dc0-i&) Hb%j+yc|F zv11%j49*|O_IRNw{?!5hGf$g&w4^c_!2+HK+d=~u >nAhGk%;l9XdS+oUDxM7bER z9CNDx?HhyEz1-X=%4)VLlNy2g4sg%s6I%1#_70RcB};w|!1xg&KF8xj`U+xxcHYd| zz)V?HdB)RH9T0i|sRfo?)Vs3I|*6_}oD@g@_*jyEAQ_5mPZDo2!gEj`$-XnYv^& zbt`!IxdLbRv lV*_P!1$PI4N65lt_`dhgS sj z+icP+_qCE_X*mNbeV(%Q)1d(jxx=8JE?CcSFb{O!YJ@nIc`upT%&Rcp7s$W9A9HA+ z9cCQ*?w%;=Czb5&UIQQh`r71Odb%N+f7lM`qL|c1-JKB=(v~p|Yu jHIc9Tq1P8&>gzYAK%q>nk2_tLefeh2CAh~c%(|TOj96?$tynrQo%91= zhP%Tju|#A(Gs!miPQkgYpW}fPN}NBwN05qr3%y#}d{b%rgePl~)K9@8dN9RvK+FFJ z02Qc=Xgs|nk=)$e*e^|t+K^m~lb(E2CqMYNGYXl6{b!oy_~$OAjw*em%v(Njv}J@k zP5kv)OUiu;M!(3^Z*b+XG4Bl;f0_jbg-YxODlRa;knqA9lV*U@lqPvASf`yRyr-2~ zpo@M5#mgVFFQo5GX$yDJde&TrC<2}=?{m#mye~@0Z_3ZdO%h19P9<-BKKZNCOnH^&Hpx {R7@El^c6N (rQL^*=iDccx9Fs(iI=%)m4-7PPPZ=j g4U9e>2{zXtkYl!ES=5p`7!` xWdwBg|z37P7sYA)qcYlvYJ7z?IMYkyVf;-hjC>dzk7`|H?MLa53 zP}Pia@g`774?Qaej_%dTWFr2M4{T9i$H(N &)P^}BQ zoqF=cjbqzPPX6px81=s6VLIz^{1RL;{nu~b7B+g0z&{k(d-x@c!|K=meaL8iB|SoS z_{8w5Q=vqX94Gy`FoGbe&KS>^s~4 m8d%us7LsN%hW5Xy8gKe&x8Uh<1BfMkd^yC@j9;Z$&9~ z-VoLli~A9}yN=g>r7I-e8ow@5vTt@qU7{BMy|6ai#Th{i) gPfCVlUq) zUk4$Naz(<6Z$e&%A1&5=(YQN`6FUW;Ugy|Df0xvrvm+5VLOTl(yGgxzt@32eR9-4M z3q0b*f>Dd5tGSDrTaKReE8DYsxp%J4k(dD(f@RYpBbG-1NW^rCP(UOgZc*u_keKN! zX#NaMg(IwmC#-)o`eyvaaWCb8ukJ`SL4hK&wg(V7HG$;?RBfp?eG7=Q_?0|*9Tnx{ zZ_fh9u44a{41N= _y}{m|(BC3%&hgt{9V zj3f4nuKeSHF&Pxn8UQ6x&mZS1{hQ3ZDu=4EO>AVMPi5WP4=Vaa$Q3uVUz+m!tG-dK zYN1>4G*JuS7!qpW>Km)sAIPgA0G;Mgj+n(pxseqedDUKto<+0;Gn}U>=Ib%L_+r0! zt?- 0<)N+Pn~*;@SqfzZn|4**ktkII=MnlPo+n<(5RU~ zmZm0tm+A&`5mi=~F{UKHCFvK@LE71}!ifSO4ws&0G{zbX!H;^}ZVKEo7o@p%f!f(` z@B<4xH4neL6lr{LUQNhX{5EEJra3u4caNt0`Mq5O;TNZ8Q?NSSRhIe+@1v7{I;9J0 z${6`KlCeQ22!7sp_l@}l>XS7S&9FLh NjsB&vq!wg}yK2r_Tmyh^bF9 zT6*?5!rD9B>bYaiH%i0 7aJSh&)acJ zBq7)E=6WQ@d975%Z=1 wsw2{I*iNmMp<(Ff7Kht!v>;Hq zRks_er1Neb%k4$~%xQG3V0fY5JJgPNp%+L04@=(wC0Wlj++*z6wr$(CZQHhu9ox3; z+2M}8W82n0&-?v#PWP=!CArmgb92&3p%%QhkjI4`@;KjcW0KVyFYs&FL=QBZlixdc zN1+t6iplPU+4V({x?ud$LRCmIpeEziWS*i6zqjEYC`WpX{Ll^OnNI-Po5yQWD)G@5 z)EgTjKWkfUbrzT=P4Ty8D{~-S1nX6ux@pePtb%Y)kXz8{bDjcMZuy`-q6*tde9u@w zpHc212q7J s%RUi~Blc0L4$iRZ42Zc?*Xq1| z;r}_y{cjgk q1BL4gx+}aWY`i0#fzrhAr?ud}oi+-YYdEVcKo6vpM zO6g4IJl~Ut5$Qk9K>Ou-;U+;1?&%idhW|ANCOj|HV>K0ivd&A_UC}I}y)t=jQLy+2 zo6 FmeY1EYA_uhU zZGGmCxcp;2We}$s&(-dkU%Mf9Gh(rwsCMkFHhjW>t&^Vn9-&Q&79+eHUXMWVguS`g zykfLg{%N6iKs!yBQ{tyHlW!-QeFQc%OUN4DI7Fc 2*S`JRHF{B`4!vbegqF z8m8f!R%6k>Zw28`TKEpncDyJ%a)ioc%9!fNK9Ad 8uz{iRp80u9bR@f67y6Fzc(1Obn>HQf0Z46XhN;x(zX2)6_6dj9}!%zkbA38 z+1AZi9DR#e5t5+Vab~j4N`z-@+b^?6Hc+oH^TZ?|I`CiGzi@x2l$Ybz@n4#pWY@-? zO|J;WM{EUTGm+Kin@Q`=OMRI>rwHd9K!si|Njjdd9}7rTObyM*ZMo(CDu1aw_yx3( zoLl@*&yNABUe^=d4Azd42;tC(H015%gdl)C5zV}PPfQbO`N0x2onkPeebSI~xl!OX z&vmK3VLb*z2@NFNku=aQ3jrdSdfok{EtMBHZqPc<#U&Ge|LCr1T<8N`kuiB~bB^cX z|4Q0AsC!4LxSmd#nIg25fOH(SosNS?DvQez XafALjaETG)#aU%zybs~Re>h|q{G)3mTq+37+e*Xq+d&57LJ}7* zaqKM zMz@7KDu{oN4g^wOZL?~(304)3=_b}Ncpr0ChDmH5*+{<3&!)69u%*859m(4|KfP6w zFimG;RW7?hx*&YM6e4pRhY2VLUru2~`5 uZxZX)*J_$T*M^B8DU0fbA zuWG)spD?{4S33j&;n~ABbDv2DXN0sI{3)Jqo6MQ-SB5yZP-NmVM+IGffV|$qvu{Bq z28R$^4l#AZ-Uf&T%wsLkNAkbvfA $qQ|2j zLo~zM(xhu`6P)j1GG--?JD1F47-3-wgmL-X*GuqetU-bi<1FSe&!hJ d*Y==?r~t7DmG{c1&0-16}lu20}Lvdg_XO7IPRk% zW@&DVriFeP@(Tq?MNskIAl@M@RKMIt96mP;qQBOFdB8-y9?;BPu^uwaCrPI7TN(ar zaBNX^;zS5N6pK~5A-i0^2juRAfrk5B{(1d25xUK+TIT!SP|8>rCzy}v2gkkksP4cc zK7m)8*J^Q1%LyGJEiEX_V 3E!XKM!lX_Im%AdKz-Sz%MWVslw4({IN>$3fp2v zr0x4z$j3L+#yO-wA#t<{s}TLudJYo16kk|dW}-i5&Q5{Xprean9~9rXArd 8l(^-1ptyHJ{669YLdUt)k-Ng*n$(X!H1U9{uX%aUD=a=(|DR+4eX_&ULQ z$a#ACn{`N(VkGPw0OUF5uY1^I!0G zmm+MlW#{h5hH4Or`<*l=mX2I%8j#4V#npr954p*fudQ=S-xHc8K-ugLx-U7VJ4OH7 zAzIZe;I}f9Nrg;Dz)jnHq;~RE#KAjF`t~7p&o$nt#Ki& DmUG``+>W7C;LUR3e&KGQ3h@9q0f5eus09z=udax0%+6a2iN@mz|DsRlW+2 zBp8IjrBVx2MnwKl(>(gai;*Bs>V_}C?lC(eqBHX8a;Z0N3*V1H4;(fDjtllYOH5hL zc(0yWmeEa2;oT+h$0qpiDD1ZMuMXl$=|;J^87u{J{e!0)E(*SQCLL;}F2pYF`^6;F z1=bY<&-LHZ{Vt=54Ggs|47d9K`gTl~wq>lkqSd6h&AX)d_#h6cKx9saN{}u1+KPsP z`e>j?eL8upULB6_i~)<8v#KKP3kwrc0aZHCZPm?lTr1!8b6I-i@VB)RH}6d>=;mh` zpB%{hst0a@$-fORx%l!~f2^dlLt*k;%B{62hh7sC{^v}*S&&t+u!>^0F<_ ;iqkIwqx( zjE71NY5u!tQpJ&-1W<%NE V_z=Zlr>IvZl<3+&XGrEBI0r `^lb17< z3m06*P8lDj;Z519R)5+F%+OxBKX>My=~jg#uBqRgB00rK1%{%)-{=UN6I6{+~E9 zQL-pF;1|oh6ljOmI&rE?l6eKm mXn^hO wQ$4DWFV6nk3B!y%(s$YCY8 zFNSfcbD1cD`}}b5g(BBXy36Hg!Tuq<*QNccUuSD`jarSUUgFHn&n*aI!`I%7 Q)s)}mGsp`Pq;}5;sy7{2VR`cUfeQ= zh;thOM3BdW5FS*9s}{5h>(4u!`4~GL9Gt`j(P9&$me9HGS7qm&t=ebAF+v~A*aH#0 zWf{bt76)0cJxLcSd^35h1fr(~UHx_eFQVC9_LRH-b7_%W8o?sm`3&y2qAIamG?8)4 z0VJ8(I!v#0$55}yX52aABiTfTJ48PH6gjEi#42Vd1(?QpI(h~5{LT~wh^n43WtG|G zR!3MZk&gwf;u!LWS&JnZT?R#7MJfS{`B%s&-xFqv{RgOgyx9uNGUm0>tmt`%*=d(V zUapOGw*5S&CZw4PW>53UoE2(tm2xjPle-DlYu6vwv^3%+x>stqeePdmv+mC)+0sm{ zwZER@%8k&q^^@luLniM)ONkcSl`m2YNi@6m?ChclOw&71Y(3Q24}kHL3Mfp$4 !Di4t; zX~(T5sPj8T4NeEy7rUL5J@l3w_!uIi7V{w?XeGmtoLaKf^h 0&N5D*9tMD zVnF$VX<8Fn%DYMd2$&M P+p&+`@5lwWuEj-^|oX{(^Z^( zE||RYfy-oO^Ap|y=)IxUrdYHoya+|sKOG83yWAkhwLqWh&mk3A!Rzt7u C&YJTV#iIvojvyMh3WM0!=E?9&{8&0j#R^B?A_R;%89! z4C>W| ri23+gw8ZYn$K3C$WDDGuZUAUh>1?qxjvJGJ Wl|$ zl=7_WlMgl?Tnz1RGA#s*VQwMI_?t+Gjb#D 00NJAsiRB@P62gvPU}kqLJ>55WE`&sgELfE>Xm@}7y%;l! zr=Zl0Y0{4t^EL7$%5Q9MuO5-;lc}Plds>Z7#vf^=@6CGInM^)5ID0vSw0&ZXMim84 znz@7-XK#!drv4i>=UOorH4zGn8hf6Zh~&-5XFC0XMU6v@f%KdADwe_YV*j_M%DHgA zTBg)ZMbB;qD1z~U{YwjFc| _i?zhlvIlbRtY% z&W~~pxo{(SP%D^cGA0_$d5;_^M|YkVoSMkBiAL{{;S%X9f;U(SZ15Uz2|U0Fsir+} zAD^lI5>T5a`BC(SHPY|!aEavY|B+hz)8d?kRf>>m$WL%!6SQfsh$?PGv$ozsOsRKJ z!zhBF{yT#t^_a?p)?NhCYZaWTS=D(+U|Nr^TbHm&pzJkxk@PP5FCCgoBpAvOqHEWX zksBeW`*#& 7%gW~)8*HISjW15Vr2&S<6dkh#Dh=F$j(V&koNexeJ=c4cJ>lsM6BuKr4 z(GTpOa3gh%;Y_&7Sc}xV((?0?AT83snnSbl%*O?LL|Lre(~hewX25qQWS)$`x^7kB zFL!I|$3sK$scK(i;`c?Cu!Q3z@e?p>JZu_&JybqRPzvfpHCyqP`E3*EM|nc;nOxhX zlozR}M==mO?HYn`y9@@!#`jOwJ!KKU65f+}%QP(1!E+9~=dYv&^cN HO#V z{={oxCo^BUV1rXKO}bvZZP(SIB4OkEan7Pt3T(0`W$?PDvz~Ot+D%F&b85SFo9DP9 z%RSS3MSPU{gSjEZ5D+~ObXVlUlhL-qnqXDqXY=_bg%5G0Udpzt7Q34HOb}gdG*ViU z8rOS#mqV?a?R>n3-Jk Sq-?_gY6-e~5D_S6Esgapg2`qZ=5`yh9gLxh9wAz(yKf@Rs*0wP za7=@GveAk;0S~hX-xf4`ZOvejuQr?Ui%f*N`Ay=m#VMZYf`Sh^&3g5~1S+3`6zs3Z zsjp?P60jA>x7LHbPz3Xnqj7RlmH&xE;y)V+>HZ)|uaZ#(B<2NVb738CuiaZ1irW?H zPTlc+N%?U=U0WQhlYx|ebwT5tUON*BH0Bf)=r#d9j!Zuu#7IX6calh>Dv4$9y>j-R z9W%qy)miXxrRhjnYx|$SRROhlm-gF;l`coFrMmV>xZk^S2!qD-BfW}V(Yew64`EEG z)^ry%%0X%z2)9#m@HT=0FHi#>lf1r{8 z#*viWD_E)+uJL{GeDe>A{X6Q;PT~|f<9wdn>9m^ =SWi zvbXaP04 zvjUN&c^s`6WL?cV!h!$Q<^qQ=pWnl^&&ak -&LBOgMDt6~zY2RdkIiZ#vr(BfR0zv~Vdi@hVW-Uj>+DyF}Uq zT6l7GE4|BT_BHKkj<-)@OOSng$Go`7K}=w*QOx4vebNEZ3)JIsQpcMtOBAOL0}G`P zs)=5T+0bGZnKV{rfBc@ATFPrl^YAqM;3gcp?fo6!gO(4Eil sfN;)q=oZr-vGiNG1-DGL>TiN`anp~29xD1Q) zkS(v4MM0Mgk$>4y$K|dsc*YO1kOzyE{GI^w4fJxj( S$ya)16y!)vepT0}=)d-9kY8$ZE~S^I?y z!v&2kUPyM&!WyNp%4Aet;gmc42 2`JN-+ z=faC2M2WP$Z-v9Cej>w=NM|4~%@7n3dfXVcRGm^ObxyGp_PvG64`uy2XzguN;ve_4 zgLid2xiZ1)2zf{TY`h7bHn_*zk&N#iskDm-UrNAHs~d-~Lz4=_lDD%Yauo7VK(FP> zfu7AG nZn;DrGy^k|={7hkas+3>{-LmQn=hT2o3) I8`I7#WW1ERLO#mH^`{60XLc%+;(5 z-1eyO%ZY(Q^@45}Cj;r;R&aw|xniE^jbrVV@s&^r=*XQg=kZy1Lk L~J9z?SMSn#ye5VLqfXVOa?d|vDhRWPX`fWs*Rf|t!FH2ojPwj7Hf>saAES! zZ^Q&FylGio728pW1*h!X>)_|(!b3E|vD~)Fi{7c#h37&(KlXEj73BFSep|!_eZEUb zMJ6g73*OhK;k^8z;aEyVKC4#=;utFCVIg2gxlVt-Yt3y_ #r^8K7R6R(NVTL(O$%0qlVoJsraFMR3ndS zY8hJGG?Fx=e`zq>b4FH3KM8LMn%;@UA*r$LjzPQ{JRLm2Iq;@$I#wo0oXat-5;GiA zNxn&9GsCM)U&mn%Cx6fjS>s-(R7+Sw6emP^hW39#s`ZY-USi^kV$V9Hq;HOGviF1d zVfNq^pGUNH8`r=f5<+YZpHcezL*`yF6N2+bTw2V#ZX7Jw I@Ex zthj#Z9%Cm?ffJ_0Up>b6RX~|-j2BjI q7zwR5?p!~@W!i8_-Dk%B<1{Y`NVh24JnOOiW>Z?b?Is9sh@`idP@{Tx7 zUG_k}{ pFwynv5OMZ?P>*;izal12U3|lSO6;R= ztHPq{Kq4_HXJ2GR!mgW9p!EUlu{RX$)*?AGy{Grj=el{1Z+UHJfwm7mQMZJ=S`1nV z3gazR=95}AU5-sItpps&E2HFLj8?~BmLct!YMx68C{tE@A%Ok0)RG(XCS=^eLg&K? zCDnAXoJrZ?Gc~>UPhRRKcn)h$Y+`suGHUY4zHWJ~Zh7=(2<(`Z3@60`2bIxho{X3& z_Imtoo4xHa3=a0$WRd61ZH^whbd~E7PGS!|rv*CuZAFRcdbW``LmvKDh(9 zOGYvbXn=@BShL6%eKXS{!sXUgwBSq4tuVnSupTTOPA zO+dwQqET+ydsHi1;5g&bAgVYQ*R>5E$=+ljke&nKpf#^2&ML14ZiC1oDdyfjbP9lO z)FW5hC~Os;Z^&vh%#|wRnCQar<`@d9<`LoEVhNv9J pdbw%bUbmbio5yDKvJ$IbJ`=6kD%!q?JU!GS=e7DIPs>%3-@z8BTz@b zMz-_EvN!kdo&yAXbf0-F#@|DxwXwCRe5br#C>l(Ami?n^j+#I)Mill9O&GbA#N`m8 zWqQk_Ya7kJSBAHjX|}X&c=)>o?eoD!C{@1+o3p&04t7PuX;dlfwq&g)+&(x{Cb__c zQ7IW-!Z+gMskb}iOPe8P=>)ZHB91$GhQPvZn$Hl*DVmkK68;-XddnZjGWhp$Y~@5h_6>Q@ zC-Y*g%U%H0mmTN(pO2o;G*=4C6^1;#q6T6^{ab{^(~Z-4#$r&K8tp({!oaSkU;G4R z7Ron#G68+O4Z%ZM_=a^jP);Utu{1}lCREE=9nugG?Rhiw-XWKKpkMr_$XuQIV@hye zN0NorGd|h)r7xniWhv3oHz8dv^exFUwoay+yAO#H !M1%>frU39nQ`RVyK3`x zT^QcYoOHxMrqywjWaW7`gF`@i1v0h}s`SOR4oC}Pt?i)!%Fa#Vc{OvJ^XxmUB!-CN z_d>q!e0MPW3UO%dE((;{#`(K4Jos^{CMc~r@R3NRdpNT*)rhBmn|0e^AjS!kGuj15lU%^Qp!K3x-l3$^g{c+YWQ-CH5U zbV_DET=LC|JQ(96QVyZ`EE?R*+d`=D+puq~L1jI4CQsj_SBhq*#`!;_2bqAx48W@S z@8kqcEL1!MWqIx5d z!~)qULW?SIVd*@a)2MX19B1f-(I>D#!Q8J$e)#>8d=>!mYQ(Py#Vnphl3S~$sriOo z)fLn8;d6hgdR#ew?VE3?6#52gWbqy=3+OU(i4|lRxrxfe=Vi^N7GPb~v{EzrB`&ts z&19>2P4S5Q>U8@%;%tLb%xMc{R|-=e_d`W|n+V*wtj>`~P4>&`h~4wGTIv1l7U!QB zo`;7nQLnv!7yi@GAvTwspASz&^}gz#SK-K@`g4Er8$3NRj$ZC1XzaS8-z1@&JtFN= zdT0W1x?iY`0gGsx-Y^wD}t6PYs2o#kJw+^BYML{|ZCs=qCu4i|!Y8M8B!w zF06lrv52xjP{>n@grf_G#SN|Z{QE$gM`4%`NX?@DzAi4B9*p~i9QUA&wm(1s*|4cf zu;Ic@J3!|;v7SdYr`O#1&s(zK&vA7Hd^zo}17(`&m+%oc)99ApU)XUebY~?g>R0G~ zQzBOp7=>lZMLy!hjkDrbU85+TlW=~%P!+T6mw215s*~>z2y_i*vP;jAa>s1TKNiJ* zshlDTTyXJ2yy(IbZ%%N^hH`OdKkicWE;q$P0aqP!F4hM%A78VlG}6;#w+9EVq-@2c zh2v~JTt|KGC@vB>Hm6C}UWf{AU2_bz*$ugJn@I?Z{_WkRS=1DgRF{WxO3_onuA!-- z^kH$fE(0G-Wo%4_1vBQ!r+Zlq-8vGa88qos!es~{B|_a^b$$Xh{B$gXvj+voNulg# z$Y O{+Am FMwKn95SCrH6$9%ikOYkX7lXbDwT|Gx*PM5<46a%3nh2}NFbG`&+p`|y)TIe> zWw%GCFsi%~^Zu&ADL)d&eOiTCTOK5w6;C*lVQ|U0k>PKuDt;M~Csqx#kbF48R0q}r z#mz&MD323kpTCXwYi36O$Z5RHcvHe)$JY_bo6T 4+g*FCMC+Ztz2G4C#^-7cj>kW zrkci9MXW~BENFbqt{0R@>f}z)6O;-{^8=H$Geb-a=M$%JXjCZ*VEWFfOB+<++D+n` z>|cJ*Mg+b}>bdL>64Z_vh3~KjP4y7NC&lXycQw|}fA3^ b2?^B{!R3My7_Vtwen=ZHM8=-1Ev<-F4VrrrjG @kZ ZGI?J9-MF1ja(TzM z7^ C6Sw1Q+r2Vs%7#2t9i-MzX-#fkT#Yl>4qt^UN%t=*A^~+wUW}1An`|#>mMTsH) z#}1jF1BNh6WV+g>QSqMy91s#GGm(!3PR-n9B7{0;;uf+v&j)?Th~VVBm9=E0^=Kq2 zpl3rh5j7$*ZI9@mj0NXeZd4S)`ccN^k{JqKW+)~?-T{A+PGayFI?er8-F;s3gdC+h zw}+HsHU^4NDdC8N7$1uwqLS3c|v58fhr sZ ?^PtowfL`tk*D#=z~MwtjV7#|Tt3ihuixb~)PAg4O^JgUfVTVl zS5}zEf%IZcW}$CcBkbJ2-snHVLbPsUP_oo5C)zM|ExDBLbq-#Lgp*V#Dq8rsp)D&1 zLSzo#f~I_Ime9utdGSojtdcJvXG81y*2CG2y7X8_F(_>0iv4p;Q40kgTqKroxiWr) z&g@A8d>bI}kS--g+xmQBvRE@QQwEJymtR nig^%15Ojs|{3&`O>Vw+)dBpDYWcoWAfRWEh N;7jU!-UbF(`f}mrv2mqE1Rm+rwOj+Hc%FByO`#I{~BbW{SClK5u{yP3C z`NS=sS^*lE9Ppn0K`Hw{vsscWQ3#SHTmUACC^<2P*3B{d#vk@iQdnORruvnZ=Txh? z7g3&?;q;V8qWQ)TQ|V!XQjRgBtF$<8_mok{Fe1noCLm1@X+MH-aXU_K`& %>B;N}#HiNqExKv~BBR;si4>Ic;GTO;Ey6j}p3yh0fH@7i7P z;=zr?h8ZnP`8;Mc?C5)QnF$K~_d{1VQ95N1)aiV`wEs~x?PNf?9_t8lP >V&lrl0JL;TTedEWO=)Kge zJofPQ;c!9jP#|I-%bWS&^7h2i|93aic{rFt1k>f8fO2a0)P~}AxEg)PaHtR1MW;G_ zA^R*1{>5ry7O0GsLC%{ssUK=`0_h_TO6%XGg}ta(gqXHuD2-4|y&I}DNuhZKEE+m( z%Fg&WTz~aBj=FB?W*9rTqOmdmg0v4<^pq4LQwj$*Dn*1BHl^PfN;I0NxX?t}6+{kt zSNy_K7;HaIWRpIQ@QN|^quc9k1;<$)d$-(YBK|?dNx?ha=RW#RA?NbPRH?=*P+SeO zN3UwC{^JPPQ2p)}_|E#fBm@Scrc4R1yg@e$OM=^OF4f$EJ6d^wO@U|G>S6)Y}9! zBnD=)ZNtEQ$8;q+9IxIZhk{**!hP>P2n1+^nw&?wlXbe@j)C>J4EJTS=1-h)ON6iZ z4J+h)v@qJ6LhYrAqY3$t7$8h=wkU`s7tflh{$R*mqw+@WC}g%~BKYR@f6j1z;F-!} z9j@9-C&+dNo;qoa_OGC;GgS^xSh)f*Hy^nI!|6~xlM#ceK DKd?uv^%hZ>I! zL@%b{?{`kWcmUOk^sa-e=;TA!eid+M>P9iKa=HXQB!-_482qbvpV1oPNGi~#_q5|$ z^^(Zq-svRq1-0kwK@_$hR|1f*f>(kKHXUrrkTW}Kj$Xh}r3L}%P3n1kZmqxqW|n-} zc)wxMHV(QjDqS2K_}0`?MMlmaN`Q3%Q%0;Qax}A?Haow=sVc_cIS^Gtw2Fu7&!uCz zeNSiFCVbH9g1CR`$uEhcSAJQ*s3Qsf4jO9mtbqJ$UVp?idSB}mT5GX54HY$$Sb|w- z|EbctF9M!X=wYa)+WbM9>mi`*)3%%7N!w|(v1~Vz{B^!EuUPkfJ?#DSXQ|VX$;4b5 zBbz-_==2}}AJ46)mNAHB@Cr~uuu)*eQJsK)s+s2D?I1pf 56f4-CA?HzY?Ibbg{fE_@l>;M`oMbM&?os_{^ruu&?(R^ z^pi2mlccu!XxyDoJTAyj=ajft>I>EwcYOCRND+<`ouZzWD7BLGt?vE?s4;inm^@5* z=)8Ujk(%+JLWqrKC=>U*zu?)^M%~*gTT0_1;*E?6;ZCUUu&iOQy~-ElHo~$zW^w+O z?XI8)iap&_9Pk(U5TR {xc47dsY~_y3T}-X+vyHg3GHxbEuz;j{^Fq@Bc4E_v$7_@Kb{v_mP+ zwoRmD91^i=R)urI-Ks%%EaFrw3FsZ&Z$K*Jt`G~+p0$EMGD8WnH ` zfR&rh*olNVPO%F6ecNir{YP4X_8aG&Bg=zoXOzFyEE)ZGDtU!_z1tccrqe0kdOj6t z^{wJjmXR{j8ydDx^!PI??@Q~JU(*;z!fs>p5&^iMU=Rb0lVP~X{UV@)=$n%_O!tH` zAR%tq%>~{YQd%GA^Ti5+ =#D0wL?wO4^zy}&K z5hA6?a5{sop?t=YqhVKQyudxaJQUNxnLp|&0tm_m%l;>QFY#u$VH@7fI+aTHgIFfa z9wjwlBiWtDYyh4P)$II9(v{}ivXq5VxnOO |GXXcAjrj$nYNu;F;rS-GFDfE25 zRCg}Wp2*nD2tLAsmP|XlNGq9wse=rf <-(@R6XbEk?`7jR@yiRcuzwa) zRTCk79%hx2zunHt9i;2A{yJxq?-_(#MfHV$Gnw!3h$Sg-oL8Y88cwTzWX)BFMOuY* zp-e|vRdF6$tuA|jS~V#57CRGvm>{}$hwywaw4!pSJxG<}ro}H5(abfXYxUrFoRF?> zL+s*g0|EX51@P8yu7ENzN%4H)!ko)E5O*$x+(&$%Z6-1k(Jy9sPfg4Tfyn(?f e37BR<;Kvq*jfV4yOTSI98P;Js(cern(x6CXpavD z?C-w8=3cHo#d)%ti84h9$2qFT%xU xZA?KKo4;o^pv!*F|^ zfrgVObrG~6F3%y)g0!l;;OaSJ3a*aNPJUnSn rAxoV!0n;atw#6v8@5tnV&F7WZ_a_5^S*f?@($ML09Ex7kpXT#Fk&bLTttsvj>yq zIP0ZWDWxt@k92i 2?tI|U?9R2*gO-y^2cJbj`y~2y@>~KaAd_dCS3Wla3cv}H-4_+R z^%#%sNb(z@6aSQ1_!Dm3A%mztxQ4-&zQjrDRvDQ9=7p>OH-U`uRJIAx7YG$VHq-;J z*zMn_aF>eKRDVhHQ9!%4zf-IT_V0JrAPMeqP_X1PM_vKKFT`ospOi^Yk|za%*yaXY z6k%i1u%E%C+!KX0iOLI%&jEn1PffvjG9b}_U(o J8Xa^9w`a$6Y zpNj0*=x#W_3rw#hM3@USU^+ro1D^8;&`bva09bqlOpQNRWJCa VT1pol13IN^{0A`(b zFapsceUI2rBfx|J0IwP7S^xmRQ~`if5diR)S$ujQiQJce8vF+!O7SqOqk;hdV!{9b z2vq=(>J_rQAXi?G3IPDvs?}(q{-+X9r4SC^2>>W4001oiL!$#H)}}>c1pE?IER&rF zD8OI?0rIIYb^t$;Le!8e0Dw5IOgM(}0{{T<95nX;WN-k&1W Nk*No})p)e 03sFu0D$WKPwjwmg#VQR za|zJVKs5tZ2!J}|0RRLj0ODITSr7ySrIC>TRe&@FWC{Ef|BRyleORM+A#{HF0RRl{ z$B->Rwtnz11pq(| 5P}%5SV`0)EgRpmG4} z7O+VGSpEq5A0Q(Fb^1d7{tqQR_6xvt`O%Z@f7Fkf1l`3&08Nl2h5u3PSq{Kc{k#_c z;UIni00?F_frMg2n6k+KO8x^128bE}NMQf~5c(q*re3x3(lk;i5Qc-#Ptgw`wrksH z0EljW U~m5! zwEqKiw4V#mM*u}s>w$BWz<*`@C;$Cs><0j#ydUfQhbu&76eL69N9=2}^&kHSOch`% z0RUJjK-OFM* EH ze|m$-H&p=M>j%I(0g%`N$e&7NGH%d>B ?%ciNpavcL7}o z6!!mo0e*DM^33=`A)4y0E#K+2x+PmkTRiX!Uj~CjIOfY)P$<#BI9R5UKnNJnF!g7i zY&Kd4v|CuU!>LM)Du #rSD(b+i?Wc1t1=#tl+EkijhC!M-%`6|KVpUfQ$MM1;$-A-mf^v(+c{q zixZeP+zcOD8>nuTX{Y^aEQ{hyhZah?wb1Ui*>_ Rr%8fCmQ 90j~H^J^6OgGhvf z2}3+~{A99YNowU*3p8Y8NO+iiZI32^6|&Id{f*cANyOtj;Xm1arnsLshyv6A04xpw zoE6(8i3deU3bIKk4gmOtP=~iG%HJZ2O-am>XX) JFn~ic*=aR&XP6! zVdFK(@)_y`_Bt3g6(-hvksll)iFKys|Mw@Fwaw+U%zV^4sxTIY6c(i_t6~HAG*0vr z+P(%_`iUo#g?a+alMMIt$IOd}Hhu7l&0OejG-dxwqt33N1(6s((*HDJN&pk`Gy4Gm zbTk0)z# 0o6?eC6*X**-`w;`ljd!n{BDJWe4q^S)tnl*?*&N zgB>?1TwVns7#T~d!cy>AQ^@s>l6PY;G`yiSAUd#12(a7ZxCzN~pgwdSgyaf07n;*Y zQsG!3OsdYPyWn}n4y8=im;k?S%O>0#09#q2*AEyb#vGAZlbnUPQNC>ci`${sg2|`Q zD%n)#sJhSx+?1h5 u&iqT1< z=qJyf|F{1Wld#${@E0y(Y)tf`IwBqwxU*~T=fG}V+*Q3wKpR>wJ>;q~&9$=lWt%-{ zw!dFu4@f|vEnQdOOW&Q_oLR-#XMFpb_$)#rb&F?6`z#X)iz)jcWm-dh89cnskRp`d z?02}L64c7LiEt`>5!jRb+o)E&j%S>qZ5zG6cnF5J%b2IhW@CKqE@;6H{-LAG8rWPo z!;|pNIf_XqTc(616oU8JyB~$TvH|#&isd>*NW+?yw5f?i;ipGB_AxO^IT~XQV(NvZ znD!i9%RUPWq6D=x1-#SPCt?#&lj51hHDx%bHTwj2hSGxyh#^|z<2BXDi6VYb%bQ`! z)f8PdGGt bJ`hGd_8;J2ojtU5rlP!RYLvg3SOdt|5?)reH2x9sH%h|W)~c^9PXor z2LRj0usECJXr)?u^ynG?8I`PdWUHyKlfVkV4Dst-UpBNeT;I7IGc$dC5fdb=FZ=0N z;N2M9bq_P))xnQ<8Q`>H`=Y-iA;z%R6F#ZGuV&Y`*y()qFxnLmG`d;ER5cymdh$BE z&Ez$PA@sWTk=4r9lkF~(4Rg|@btELY7}K_SLqQjz7 FB09oAW}P(k=i> }KWhG?KjM31It^aZ4INWb)l;>Ul5w&YEL630 zn}QNm#lAq}>aNe`K{2S3cax=zHJIq59%T_jhK|&jg3D217K`=p@Mt71XJM}QY>g2= zJxP4z{&BTrq@Y8HZh^#tdcC{N4n7)vcNe>moW@q1=dmaYB( igo-R!lhl4LjA)Wq~ zxWS)z(ET?G>)H _$dVJiZT@ES#ya1 zTbeCqG#yj3{J)ft%qMWQ$j%C^fO8va>Hn1@gh$2~GPYcGdrE*P5EkMKHunzgNVt`d z{r5r7x8gKBWW|)wDVb}##%F&usPa&!f$=lP0si@yvIlbB71RZZ|38nt86jNUMW~-1 zDNeIEnbVEq)1Jb@Z{atyMoym3# E zQy{^h>y(^GY|9q0CeISzMY)RI*en8NpeFTAeRn4o^C!*y(+FN~QZPDlKOxK(bGPlX z8(9ncdFme&>pMy+^yrlFVCdGhPEn`<1C_U