Compare commits

...

13 Commits

16 changed files with 1799 additions and 501 deletions

9
.gitignore vendored
View File

@@ -7,3 +7,12 @@ __pycache__/
.DS_Store
.vault_pass.txt
secrets/plaintext/
# Local plaintext vault password must never be committed
vault-pass.txt
secrets/vault-pass.txt
# Placeholder marker generated when password archive is absent
secrets/vault-pass.txt.zip.PLACEHOLDER
# Local installer env overrides with real secrets
install.local.env
*.secret.env

108
README.md
View File

@@ -1,19 +1,99 @@
# Agent Secret Vault
這個 repo 專門存放本地 AI agent 開發會用到的機密管理機制
repo 專門管理本地 AI agent / worker 需要的機密資料
核心設計
- 使用 `ansible-vault` 作為加密格式
- 加密檔可進 git
- vault password file 只放在本機
- 多個 agent 透過統一腳本存取 secrets
## 核心設計
## 內容
- `scripts/vault.sh`初始化、檢視、編輯、加密、解密、rekey
- `docs/secret-vault.md`:使用說明與設計原則
- `secrets/vault.yml`:加密後 secrets 檔
- 使用 `ansible-vault` 加密 `secrets/vault.yml`
- 加密後的 `secrets/vault.yml` 可以進 git
- vault password file 放在本機:`~/.config/vault-pass.txt`
- 新機器可透過 repo 內的密碼保護壓縮檔 `secrets/vault-pass.txt.zip` 安裝 password file
- 多個 agent 透過統一腳本讀取 secrets不各自發明 credential 管理方式
## 目標
- 讓 Hermes / OpenClaw / cron worker / 其他本地 agent 共用同一套 secret storage contract
- 不把明文 secret 留在 repo
- 不讓每個 agent 各自發明一套 credential 管理方式
## 主要文件
- 人類使用指南:[`docs/human-guide.md`](docs/human-guide.md)
- Agent 安裝 Runbook[`docs/agent-install-runbook.md`](docs/agent-install-runbook.md)
- Agent 整合補充:[`docs/agent-integration.md`](docs/agent-integration.md)
- Vault 基礎說明:[`docs/secret-vault.md`](docs/secret-vault.md)
## 安裝設定檔
Repo 內提供:
- `install.env.example`:給人類/agent 複製參考
- `install.env`:空值 placeholder安裝前先填入 vault-pass 來源設定
常用變數說明:
| 變數 | 用途 | 範例 |
|---|---|---|
| `VAULT_PASS_FILE` | 最後要產生/使用的 vault password file 路徑 | `$HOME/.config/vault-pass.txt` |
| `INSTALL_VAULT_PASS_METHOD` | 指定安裝方式;可填 `create``manual``url``archive` | `url` |
| `VAULT_PASS_URL` | 當 method=`url` 時,從這個 URL 下載 `vault-pass.txt` | `https://example.com/one-time/vault-pass.txt` |
| `VAULT_PASS_ZIP_PASSWORD_FILE` | 當 method=`archive` 時,讀取 zip 密碼的本機檔案路徑;比直接寫密碼安全 | `/secure/path/zip-password.txt` |
| `VAULT_PASS_ZIP_PASSWORD` | 當 method=`archive` 時,直接提供 zip 密碼;只適合安全 shell不建議寫進可提交檔案 | `...` |
| `VAULT_PASS_CONTENT` | 當 method=`manual` 時,直接提供 `vault-pass.txt` 內容;高風險,只適合受控環境 | `...` |
| `VAULT_PASS_ARCHIVE` | 覆寫密碼保護 zip 的路徑;預設是 `secrets/vault-pass.txt.zip` | `/path/to/vault-pass.txt.zip` |
安裝方式含義:
- `create`:產生新的 vault password只適合全新 vault既有 vault 無法解密時不會自動覆蓋。
- `manual`:由人類輸入或用 `VAULT_PASS_CONTENT` 提供 vault password 內容。
- `url`:從 `VAULT_PASS_URL` 下載 `vault-pass.txt`;適合一次性 URL / 內網安全下載。
- `archive`:從密碼保護 zip 解出 `vault-pass.txt`;密碼可放在 `VAULT_PASS_ZIP_PASSWORD_FILE``VAULT_PASS_ZIP_PASSWORD`
`install.env` 不應填入真實 secrets 後再 commit若要保存本機私密設定使用 `install.local.env` 並透過 `INSTALL_ENV_FILE=install.local.env` 指定。
## 安裝流程(先設定 env
安裝前請先設定 `install.env`,再檢查 env 是否足夠,最後才正式安裝:
```bash
cp -n install.env.example install.env
editor install.env
./scripts/install-vault-pass.sh --check-env
./scripts/install-vault-pass.sh
```
`install.env` 範例:
```bash
# 例:用一次性 URL 安裝 vault-pass.txt
INSTALL_VAULT_PASS_METHOD="url"
VAULT_PASS_URL="https://example.com/one-time/vault-pass.txt"
```
## 全自動 agent 安裝
Agent / CI 也應優先設定 `install.env``INSTALL_ENV_FILE`,不要直接進互動選單:
```bash
INSTALL_ENV_FILE=install.local.env ./scripts/install-vault-pass.sh --check-env
INSTALL_ENV_FILE=install.local.env ./scripts/install-vault-pass.sh
```
## 常用指令
```bash
# 安裝 vault password file會要求輸入壓縮檔密碼
./scripts/install-vault-pass.sh
# 維護者建立密碼保護壓縮檔
./scripts/create-vault-pass-archive.sh
# 檢視 vault
./scripts/vault.sh view
# 編輯 vault
./scripts/vault.sh edit
# 讀單一 secret
./scripts/get-secret.sh openclaw_alice.http_nodes.gitea.password
```
## 安全原則
- 不要把 `~/.config/vault-pass.txt` commit 到 git
- 不要把解密後完整 YAML 貼到 chat/log
- Agent 回報時只回報 key path、commit hash、驗證方式不回報 secret value

View File

@@ -0,0 +1,255 @@
# Agent 安裝 Runbookagent-secret-vault
這份文件給 AI agent / cron worker / automation 使用。目標:把 `agent-secret-vault` 安裝好、缺檔時建立 placeholder、並能安全讀取 secrets。
## 安全規則
- 不要把 secret value、vault password、token、private key 印到 chat / log / 工單 comment。
- 不要 dump 整份解密後的 `secrets/vault.yml`
- 只讀取任務所需的單一欄位。
- 所有暫存解密檔用完立即刪除。
## 目標路徑
- Repo`~/projects/agent-secret-vault`
- Vault 檔:`~/projects/agent-secret-vault/secrets/vault.yml`
- Vault password file`~/.config/vault-pass.txt`
- 可覆寫環境變數:`VAULT_PASS_FILE=/custom/path`
## 1. 安裝系統依賴
```bash
sudo apt update
sudo apt install -y git ansible unzip
```
驗證:
```bash
command -v git
command -v ansible-vault
command -v unzip
```
## 2. Clone repo
```bash
mkdir -p ~/projects
cd ~/projects
if [ ! -d agent-secret-vault/.git ]; then
git clone ssh://git@gitea.cowbay.org:2203/hermes/agent-secret-vault.git
fi
cd agent-secret-vault
```
若 clone 失敗,建立 placeholder 讓後續步驟可明確回報缺什麼:
```bash
mkdir -p ~/projects/agent-secret-vault/{scripts,secrets,docs}
cat > ~/projects/agent-secret-vault/README.PLACEHOLDER.md <<'PLACEHOLDER'
# Placeholder
agent-secret-vault repo 尚未成功 clone。
需要 Gitea SSH 權限ssh://git@gitea.cowbay.org:2203/hermes/agent-secret-vault.git
PLACEHOLDER
```
然後回報人類:需要把此 agent / 機器的 SSH public key 加到 Gitea 或 deploy key。
## 2.5 設定 installer env
Repo 內提供兩個 env 檔:
```text
install.env.example # 範本
install.env # 安裝用 placeholder
```
安裝前必須先設定 `install.env`(或指定 `INSTALL_ENV_FILE`),不要跳過這一步:
```bash
cd ~/projects/agent-secret-vault
cp -n install.env.example install.env
editor install.env
```
常用設定:
```bash
# 一次性 URL 下載 vault-pass.txt
INSTALL_VAULT_PASS_METHOD="url"
VAULT_PASS_URL="https://example.com/one-time/vault-pass.txt"
# 或zip 密碼放在本機安全檔案
INSTALL_VAULT_PASS_METHOD="archive"
VAULT_PASS_ZIP_PASSWORD_FILE="/secure/path/zip-password.txt"
```
注意:`VAULT_PASS_ZIP_PASSWORD_FILE` 必須指向「只包含 zip 密碼的一行純文字檔」。不要把它指到 `secrets/vault-pass.txt.zip`zip 壓縮檔本身)、`~/.config/vault-pass.txt`Ansible Vault password file、私鑰、或任何二進位檔。若 installer 報告檔案含 NUL bytes通常就是路徑指錯了請改成正確的 zip 密碼文字檔,或改用 `VAULT_PASS_ZIP_PASSWORD` / `url` / `manual` 方法。
若需要使用另一個 env 檔:
```bash
INSTALL_ENV_FILE=install.local.env ./scripts/install-vault-pass.sh
```
不要把含真實密碼/token 的 env 檔 commit。
執行安裝前可先檢查 env 是否足夠非互動安裝:
```bash
./scripts/install-vault-pass.sh --check-env
```
若輸出顯示 env 不足,先補齊 env只有人類在本機 terminal 操作時才允許進入互動提示。AI agent / CI 不應直接進互動流程。
## 3. 安裝 vault password file
標準位置:
```text
~/.config/vault-pass.txt
```
執行 installer 前再次確認 env然後安裝
```bash
cd ~/projects/agent-secret-vault
./scripts/install-vault-pass.sh --check-env
./scripts/install-vault-pass.sh
```
installer 會先判斷 `~/.config/vault-pass.txt` 是否已存在:
- 若已存在:保留現有檔案、修正權限為 `600`,並嘗試驗證能否解開 `secrets/vault.yml`
- 若不存在:提示使用者選擇 4 種建立方式。
### 缺檔時的 4 種方式
1. **建立新密碼並初始化 placeholder vault**
- 適合全新 repo / 全新環境。
- installer 會產生新的 `~/.config/vault-pass.txt`
-`secrets/vault.yml` 不存在,會建立加密 placeholder。
- 若既有 `secrets/vault.yml` 無法用新密碼解開installer 不會覆蓋它,避免破壞既有 secrets。
2. **使用者自行輸入 vault-pass.txt 內容**
- installer 會用 hidden input 讀取一行密碼內容。
- 寫入 `~/.config/vault-pass.txt`,權限設為 `600`
3. **使用者輸入 vault-pass.txt URL自動下載**
- installer 會提示輸入 `http://``https://` URL。
-`curl``wget` 下載到 `~/.config/vault-pass.txt`
- 只適合可信的一次性下載 URL。
4. **解壓 repo 內既有密碼保護 zip**
- 預設讀取:`secrets/vault-pass.txt.zip`
- zip 內必須包含檔名:`vault-pass.txt`
- installer 會要求使用者在自己的 terminal 手動輸入 zip 密碼。
### 若壓縮檔不存在
建立 placeholder不要自行編造密碼
```bash
mkdir -p ~/projects/agent-secret-vault/secrets
cat > ~/projects/agent-secret-vault/secrets/vault-pass.txt.zip.PLACEHOLDER <<'PLACEHOLDER'
Missing file: secrets/vault-pass.txt.zip
Purpose: password-protected archive containing vault-pass.txt
Action: ask human maintainer to provide this archive or use installer method 1/2/3.
PLACEHOLDER
```
然後回報人類:缺 `secrets/vault-pass.txt.zip`,或請人類選擇 installer 方法 1/2/3。
### 若要用非預設路徑
```bash
export VAULT_PASS_FILE=/path/to/vault-pass.txt
./scripts/install-vault-pass.sh
```
### Agent 全自動安裝(避免卡在互動密碼)
若安裝由 AI agent / CI 執行,不要走互動 prompt。優先把設定寫進 `install.env``install.local.env`,也可用以下任一非互動方式:
```bash
# 方式 A從安全 URL 下載 vault-pass.txt
INSTALL_VAULT_PASS_METHOD=url \
VAULT_PASS_URL="https://example.com/one-time/vault-pass.txt" \
./scripts/install-vault-pass.sh
# 方式 B從密碼保護 zip 解壓zip 密碼放在本機安全檔案
# /secure/path/zip-password.txt 必須是純文字,內容只有 zip 密碼本身;
# 不可指到 secrets/vault-pass.txt.zip 或 ~/.config/vault-pass.txt。
INSTALL_VAULT_PASS_METHOD=archive \
VAULT_PASS_ZIP_PASSWORD_FILE=/secure/path/zip-password.txt \
./scripts/install-vault-pass.sh
# 方式 C從密碼保護 zip 解壓zip 密碼用環境變數帶入(避免寫入 chat/log
INSTALL_VAULT_PASS_METHOD=archive \
VAULT_PASS_ZIP_PASSWORD="..." \
./scripts/install-vault-pass.sh
# 方式 D直接提供 vault-pass.txt 內容(只適合安全 runtime不可印 log
INSTALL_VAULT_PASS_METHOD=manual \
VAULT_PASS_CONTENT="..." \
./scripts/install-vault-pass.sh
```
推薦順序URL 一次性下載 > `VAULT_PASS_ZIP_PASSWORD_FILE` > `VAULT_PASS_ZIP_PASSWORD` > `VAULT_PASS_CONTENT`
## 4. 驗證安裝
```bash
cd ~/projects/agent-secret-vault
ansible-vault view secrets/vault.yml --vault-password-file ~/.config/vault-pass.txt >/dev/null
```
成功exit code 0。失敗時只回報錯誤摘要不要輸出密碼或 vault 內容。
## 5. 讀取單一 secret
```bash
cd ~/projects/agent-secret-vault
./scripts/get-secret.sh <dot.path>
```
範例:
```bash
./scripts/get-secret.sh gitea.api_token
./scripts/get-secret.sh openclaw_alice.http_nodes.gitea.password
```
把輸出直接交給需要 secret 的動作使用;不要貼到 chat / log。
## 6. Worker 需要 env 時
```bash
cd ~/projects/agent-secret-vault
umask 077
./scripts/render-env.sh gitea > /tmp/gitea.env
set -a
. /tmp/gitea.env
set +a
rm -f /tmp/gitea.env
```
使用完如果擔心環境被 dump執行 `unset` 清掉相關變數。
## 7. 更新 secret 的 agent 流程
只有在人類明確要求更新 secrets 時才做:
```bash
cd ~/projects/agent-secret-vault
git pull --ff-only
./scripts/vault.sh edit
ansible-vault view secrets/vault.yml --vault-password-file ~/.config/vault-pass.txt >/dev/null
git add secrets/vault.yml
git commit -m "Update secret <key-name>"
git push
```
回報只包含 key 名稱、commit hash、驗證方式不要包含 secret value。

View File

@@ -5,7 +5,7 @@
## 基本資訊
- vault 位置:`~/projects/agent-secret-vault/secrets/vault.yml`
- vault password 位置:`~/.config/continuous-ai-workflow-spec/vault-pass.txt`
- vault password 位置:`~/.config/vault-pass.txt`
- 加密格式ansible-vaultAES256
## Agent 讀取 secrets 的方法
@@ -64,7 +64,7 @@ cd ~/projects/agent-secret-vault
確認:
```bash
chmod 600 ~/.config/continuous-ai-workflow-spec/vault-pass.txt
chmod 600 ~/.config/vault-pass.txt
```
### 3. ansible-vault not found

227
docs/human-guide.md Normal file
View File

@@ -0,0 +1,227 @@
# 人類使用指南agent-secret-vault
這份文件給人類維護者看:如何安裝、操作,以及如何用自然語言指示 agent 管理 secrets。
## 這是什麼
`agent-secret-vault` 是本地 AI agent 共用的機密資料 repo。
- 加密資料:`secrets/vault.yml`
- 加密格式Ansible Vault
- 解密鑰匙:`~/.config/vault-pass.txt`
- Repo`ssh://git@gitea.cowbay.org:2203/hermes/agent-secret-vault.git`
`secrets/vault.yml` 可以進 git`~/.config/vault-pass.txt` 不可以進 git。
## 安裝
```bash
sudo apt update
sudo apt install -y git ansible unzip
mkdir -p ~/projects
cd ~/projects
git clone ssh://git@gitea.cowbay.org:2203/hermes/agent-secret-vault.git
cd agent-secret-vault
```
接著先設定 installer env再安裝 vault password file
```bash
cp -n install.env.example install.env
editor install.env
./scripts/install-vault-pass.sh --check-env
./scripts/install-vault-pass.sh
```
重點:先填 `install.env`。若 `--check-env` 顯示資訊不足,先補齊 `INSTALL_VAULT_PASS_METHOD` 與對應欄位,不要直接進互動流程。
installer 會先檢查:
```text
~/.config/vault-pass.txt
```
如果已存在,會保留並驗證。若不存在,會讓你選 4 種方式:
1. 建立新 vault password並在需要時建立加密 placeholder vault。
2. 手動輸入 vault-pass.txt 的內容。
3. 輸入 vault-pass.txt 的 URL讓 installer 自動下載。
4. 解壓 repo 內既有的密碼保護檔 `secrets/vault-pass.txt.zip`
若選第 4 種,請在你自己的 terminal 輸入 zip 密碼Telegram / chat 不能輸入到 agent 的工具互動提示。
驗證:
```bash
./scripts/vault.sh view
```
## 建立安裝用密碼保護壓縮檔
維護者若要讓其他 agent / 機器安裝,先在已可解密的機器上執行:
```bash
cd ~/projects/agent-secret-vault
./scripts/create-vault-pass-archive.sh
git add secrets/vault-pass.txt.zip
git commit -m "Add vault password archive"
git push
```
腳本會要求互動輸入 zip 密碼。這個 zip 密碼不要寫進 repo、chat 或 log交給安裝者時用另外的安全渠道。
## 安裝時設定 vault-pass
安裝流程要求先填 repo 內的 env 檔:
```bash
cd ~/projects/agent-secret-vault
cp -n install.env.example install.env
editor install.env
./scripts/install-vault-pass.sh --check-env
./scripts/install-vault-pass.sh
```
`install.env` 可設定:
- `INSTALL_VAULT_PASS_METHOD=url` + `VAULT_PASS_URL=...`
- `INSTALL_VAULT_PASS_METHOD=archive` + `VAULT_PASS_ZIP_PASSWORD_FILE=...`
- `INSTALL_VAULT_PASS_METHOD=manual` + `VAULT_PASS_CONTENT=...`
- `INSTALL_VAULT_PASS_METHOD=create`
若 env 內含真實 secrets不要 commit。可改用 `install.local.env`,再執行:
```bash
INSTALL_ENV_FILE=install.local.env ./scripts/install-vault-pass.sh --check-env
./scripts/install-vault-pass.sh
```
## 給 agent 的全自動安裝方式
如果目標是「AI agent 直接安裝,不要卡在互動輸入密碼」,請不要讓 agent 選互動 zip 解壓。改用環境變數指定方法:
```bash
# 一次性 URL 下載
INSTALL_VAULT_PASS_METHOD=url \
VAULT_PASS_URL="https://example.com/one-time/vault-pass.txt" \
./scripts/install-vault-pass.sh
# 或zip 密碼放在本機安全檔案
INSTALL_VAULT_PASS_METHOD=archive \
VAULT_PASS_ZIP_PASSWORD_FILE=/secure/path/zip-password.txt \
./scripts/install-vault-pass.sh --check-env
./scripts/install-vault-pass.sh
```
不要把 zip 密碼或 vault-pass 內容貼在聊天裡;應由目標機器的 secret manager、一次性 URL 或本機安全檔提供。
## 常用人工操作
### 查看 vault
```bash
cd ~/projects/agent-secret-vault
./scripts/vault.sh view
```
### 編輯 vault
```bash
cd ~/projects/agent-secret-vault
git pull --ff-only
./scripts/vault.sh edit
git add secrets/vault.yml
git commit -m "Update secrets"
git push
```
### 讀單一 secret
```bash
./scripts/get-secret.sh gitea.api_token
./scripts/get-secret.sh openclaw_alice.http_nodes.gitea.password
```
## 用自然語言請 agent 操作 secrets
你可以直接對 agent 下這類命令:
### 查詢但不要顯示 secret
```text
幫我確認 agent-secret-vault 裡有沒有 gitea.api_token不要把 token 印出來。
```
Agent 應該只回報「有 / 沒有」與使用的 key path不應顯示 token。
### 使用 secret 去登入或呼叫 API
```text
用 agent-secret-vault 裡的 openclaw_alice.http_nodes.gitea 帳密登入 Gitea登入成功後回報狀態不要把帳密貼出來。
```
Agent 可以讀取 secret 並用於 browser/API但不能把 secret value 回傳聊天。
### 新增 secret
```text
幫我把新的 API token 加到 agent-secret-vaultkey 放在 openclaw_alice.http_nodes.example_service.api_token先 git pull更新後驗證可讀再 commit/push。不要在回報中顯示 token。
```
如果 token 需要由你提供,請用安全渠道或互動輸入;不要把高敏感 token 直接貼到公開群組。
### 修改 secret
```text
把 agent-secret-vault 裡 openclaw_alice.http_nodes.gitea.password 更新成我等一下提供的新密碼;完成後只回報 commit hash 和驗證方式。
```
### 列出 key 結構
```text
列出 agent-secret-vault 目前有哪些 top-level sections 和 key 名稱,不要顯示任何 password/token/secret/private_key 的值。
```
## Agent 應遵守的回報格式
完成更新後agent 回報應包含:
- 更新的 key path
- repo path
- commit hash
- 驗證方式,例如 `./scripts/get-secret.sh <key>` 成功
不應包含:
- secret value
- vault password
- 解密後完整 YAML
## 故障排除
### `Decryption failed`
通常是 `~/.config/vault-pass.txt` 不存在、權限不對、或內容不是正確密碼。
檢查:
```bash
ls -l ~/.config/vault-pass.txt
```
權限應為 `600`
### `secrets/vault-pass.txt.zip` 不存在
代表 repo 裡沒有安裝用的密碼保護壓縮檔。請由維護者建立並提交到私有 repo或用其他安全方式提供 vault password file。
### Gitea clone/push 失敗
檢查:
```bash
ssh -T -p 2203 git@gitea.cowbay.org
```
通常需要把該機器的 SSH public key 加到 Gitea。

View File

@@ -4,7 +4,7 @@
## 設計
- 加密檔:`secrets/vault.yml`
- 本機 vault password file`~/.config/continuous-ai-workflow-spec/vault-pass.txt`
- 本機 vault password file`~/.config/vault-pass.txt`
- 管理腳本:`scripts/vault.sh`
## 原則

10
install.env Normal file
View File

@@ -0,0 +1,10 @@
# Local installer config for agent-secret-vault.
# Fill this file before running ./scripts/install-vault-pass.sh.
# WARNING: this file may contain secrets. Do not commit real values.
VAULT_PASS_FILE="$HOME/.config/vault-pass.txt"
INSTALL_VAULT_PASS_METHOD=""
VAULT_PASS_CONTENT=""
VAULT_PASS_URL=""
VAULT_PASS_ZIP_PASSWORD_FILE=""
VAULT_PASS_ZIP_PASSWORD=""

35
install.env.example Normal file
View File

@@ -0,0 +1,35 @@
# agent-secret-vault installer env template
#
# Usage:
# cp install.env.example install.env
# editor install.env
# ./scripts/install-vault-pass.sh
#
# Keep real install.env private. It may contain secrets.
# Where to install/read the Ansible Vault password file.
VAULT_PASS_FILE="$HOME/.config/vault-pass.txt"
# Choose one method: create | manual | url | archive
# Leave empty for interactive menu.
INSTALL_VAULT_PASS_METHOD=""
# Method: manual
# Direct vault-pass.txt content. Avoid this unless running in a secure local shell.
VAULT_PASS_CONTENT=""
# Method: url
# One-time HTTPS URL containing vault-pass.txt.
VAULT_PASS_URL=""
# Method: archive
# Password-protected zip path defaults to secrets/vault-pass.txt.zip.
# Put the ZIP ARCHIVE PASSWORD in a local plaintext file when possible.
# This must be a small text file containing only the zip password.
# Do NOT point this to secrets/vault-pass.txt.zip, ~/.config/vault-pass.txt,
# a private key, or any binary/archive file.
VAULT_PASS_ZIP_PASSWORD_FILE=""
# Method: archive fallback
# Inline zip password. Avoid in shared shells/logging environments.
VAULT_PASS_ZIP_PASSWORD=""

View File

@@ -0,0 +1,50 @@
#!/usr/bin/env bash
set -euo pipefail
REPO_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
SRC="${VAULT_PASS_FILE:-$HOME/.config/vault-pass.txt}"
OUT="${1:-$REPO_DIR/secrets/vault-pass.txt.zip}"
usage() {
cat <<USAGE
Usage: scripts/create-vault-pass-archive.sh [output.zip]
Creates a password-protected archive containing vault-pass.txt.
Default source:
${VAULT_PASS_FILE:-$HOME/.config/vault-pass.txt}
Default output:
$REPO_DIR/secrets/vault-pass.txt.zip
The zip password is entered interactively. Do not print it in logs/chat.
USAGE
}
if [ "${1:-}" = "-h" ] || [ "${1:-}" = "--help" ]; then
usage
exit 0
fi
if [ ! -f "$SRC" ]; then
echo "Missing source vault password file: $SRC" >&2
exit 2
fi
if ! command -v zip >/dev/null 2>&1; then
echo "Missing dependency: zip" >&2
echo "Install it with: sudo apt install -y zip" >&2
exit 3
fi
mkdir -p "$(dirname "$OUT")"
tmpdir="$(mktemp -d)"
cleanup() { rm -rf "$tmpdir"; }
trap cleanup EXIT
install -m 600 "$SRC" "$tmpdir/vault-pass.txt"
(
cd "$tmpdir"
# zip prompts for archive password interactively.
zip -e -q "$OUT" vault-pass.txt
)
chmod 600 "$OUT"
echo "Created password-protected archive: $OUT"

View File

@@ -3,7 +3,7 @@ set -euo pipefail
REPO_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
VAULT_FILE="${VAULT_FILE:-$REPO_DIR/secrets/vault.yml}"
VAULT_PASS_FILE="${VAULT_PASS_FILE:-$HOME/.config/continuous-ai-workflow-spec/vault-pass.txt}"
VAULT_PASS_FILE="${VAULT_PASS_FILE:-$HOME/.config/vault-pass.txt}"
usage() {
cat <<EOF

406
scripts/install-vault-pass.sh Executable file
View File

@@ -0,0 +1,406 @@
#!/usr/bin/env bash
set -euo pipefail
REPO_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
DEST="${VAULT_PASS_FILE:-$HOME/.config/vault-pass.txt}"
ARCHIVE="${1:-$REPO_DIR/secrets/vault-pass.txt.zip}"
VAULT_FILE="${VAULT_FILE:-$REPO_DIR/secrets/vault.yml}"
ENV_FILE="${INSTALL_ENV_FILE:-$REPO_DIR/install.env}"
load_env_file() {
if [ -f "$ENV_FILE" ]; then
set -a
# shellcheck disable=SC1090
. "$ENV_FILE"
set +a
fi
}
load_env_file
# Re-apply env-configurable paths after loading install.env.
DEST="${VAULT_PASS_FILE:-$HOME/.config/vault-pass.txt}"
ARCHIVE="${VAULT_PASS_ARCHIVE:-${1:-$REPO_DIR/secrets/vault-pass.txt.zip}}"
VAULT_FILE="${VAULT_FILE:-$REPO_DIR/secrets/vault.yml}"
# Optional non-interactive controls:
# INSTALL_VAULT_PASS_METHOD=create|manual|url|archive
# VAULT_PASS_CONTENT=<content> (for method=manual)
# VAULT_PASS_URL=<https-url> (for method=url)
# VAULT_PASS_ZIP_PASSWORD=<password> (for method=archive; avoid chat/log)
# VAULT_PASS_ZIP_PASSWORD_FILE=<path> (for method=archive; safer than env)
usage() {
cat <<USAGE
Usage: scripts/install-vault-pass.sh [archive.zip]
Loads installer env from:
${INSTALL_ENV_FILE:-$REPO_DIR/install.env}
Override with:
INSTALL_ENV_FILE=/path/to/install.env ./scripts/install-vault-pass.sh
Installs the Ansible Vault password file to:
${VAULT_PASS_FILE:-$HOME/.config/vault-pass.txt}
Interactive behavior:
1. If the password file already exists, keep it and verify permissions.
2. If missing, prompt the user to choose one of four setup methods:
[1] Create a new vault password and initialize/re-encrypt vault.yml
[2] Paste/type vault-pass.txt content manually
[3] Download vault-pass.txt from a user-provided URL
[4] Extract vault-pass.txt from a password-protected zip archive
Non-interactive agent mode (via install.env or environment variables):
INSTALL_VAULT_PASS_METHOD=create ./scripts/install-vault-pass.sh
VAULT_PASS_CONTENT='...' INSTALL_VAULT_PASS_METHOD=manual ./scripts/install-vault-pass.sh
VAULT_PASS_URL='https://...' INSTALL_VAULT_PASS_METHOD=url ./scripts/install-vault-pass.sh
VAULT_PASS_ZIP_PASSWORD_FILE=/secure/pass INSTALL_VAULT_PASS_METHOD=archive ./scripts/install-vault-pass.sh
VAULT_PASS_ZIP_PASSWORD='...' INSTALL_VAULT_PASS_METHOD=archive ./scripts/install-vault-pass.sh
Check env sufficiency without installing:
./scripts/install-vault-pass.sh --check-env
Default archive path for method [4]:
$REPO_DIR/secrets/vault-pass.txt.zip
USAGE
}
ensure_dest_dir() {
umask 077
mkdir -p "$(dirname "$DEST")"
chmod 700 "$(dirname "$DEST")" || true
}
secure_dest() { chmod 600 "$DEST"; }
verify_existing() {
if [ -f "$DEST" ]; then
secure_dest
echo "Vault password file already exists: $DEST"
return 0
fi
return 1
}
require_cmd() {
if ! command -v "$1" >/dev/null 2>&1; then
echo "Missing dependency: $1" >&2
echo "Please install it first." >&2
exit 3
fi
}
create_new_password() {
require_cmd ansible-vault
require_cmd python3
ensure_dest_dir
umask 077
python3 - <<'PY' > "$DEST"
import secrets
print(secrets.token_urlsafe(48))
PY
secure_dest
echo "Created new vault password file: $DEST"
if [ -f "$VAULT_FILE" ]; then
if ansible-vault view "$VAULT_FILE" --vault-password-file "$DEST" >/dev/null 2>&1; then
echo "Existing vault is already readable with the new password. No re-encryption needed."
else
cat <<WARN
WARNING: $VAULT_FILE exists but is not readable with the new password.
To avoid destroying existing encrypted secrets, this script will NOT overwrite it automatically.
If this is a brand-new install, create a plaintext YAML file and run:
./scripts/vault.sh encrypt /path/to/plaintext.yml
If this is an existing vault, choose method [2], [3], or [4] with the correct password instead.
WARN
fi
else
mkdir -p "$(dirname "$VAULT_FILE")"
tmp="$(mktemp)"
chmod 600 "$tmp"
cat > "$tmp" <<'YAML'
# Initial placeholder vault. Replace with real secrets using ./scripts/vault.sh edit.
gitea: {}
openclaw_alice:
http_nodes: {}
ssh_nodes: {}
YAML
cp "$tmp" "$VAULT_FILE"
ansible-vault encrypt "$VAULT_FILE" --vault-password-file "$DEST"
rm -f "$tmp"
echo "Created encrypted placeholder vault: $VAULT_FILE"
fi
}
manual_create() {
ensure_dest_dir
if [ -n "${VAULT_PASS_CONTENT:-}" ]; then
umask 077
printf '%s\n' "$VAULT_PASS_CONTENT" > "$DEST"
else
cat <<MSG
Paste/type the vault password content now, then press Enter.
Input is hidden. The content will be written to:
$DEST
MSG
read -r -s pass
printf '\n'
if [ -z "$pass" ]; then
echo "Empty password is not allowed." >&2
exit 4
fi
umask 077
printf '%s\n' "$pass" > "$DEST"
fi
secure_dest
echo "Installed manually provided vault password file: $DEST"
}
download_from_url() {
ensure_dest_dir
url="${VAULT_PASS_URL:-}"
if [ -z "$url" ]; then
printf 'Enter vault-pass.txt URL: '
read -r url
fi
if [ -z "$url" ]; then
echo "URL is required." >&2
exit 4
fi
case "$url" in
http://*|https://*) ;;
*) echo "Only http:// or https:// URLs are supported." >&2; exit 4 ;;
esac
if command -v curl >/dev/null 2>&1; then
umask 077
curl -fsSL "$url" -o "$DEST"
elif command -v wget >/dev/null 2>&1; then
umask 077
wget -qO "$DEST" "$url"
else
echo "Missing dependency: curl or wget" >&2
exit 3
fi
if [ ! -s "$DEST" ]; then
echo "Downloaded file is empty or missing." >&2
exit 4
fi
secure_dest
echo "Downloaded vault password file to: $DEST"
}
read_zip_password_file() {
# Bash strings cannot contain NUL bytes. Detect likely binary/invalid password
# files before command substitution so agents do not hit:
# warning: command substitution: ignored null byte in input
original_size="$(wc -c < "$VAULT_PASS_ZIP_PASSWORD_FILE" | tr -d '[:space:]')"
without_nul_size="$(LC_ALL=C tr -d '\000' < "$VAULT_PASS_ZIP_PASSWORD_FILE" | wc -c | tr -d '[:space:]')"
if [ "$original_size" != "$without_nul_size" ]; then
file_desc="$(file -b "$VAULT_PASS_ZIP_PASSWORD_FILE" 2>/dev/null || echo "unknown file type")"
cat >&2 <<ERR
VAULT_PASS_ZIP_PASSWORD_FILE appears to contain NUL bytes; provide a text password file instead.
Configured password-file path:
$VAULT_PASS_ZIP_PASSWORD_FILE
Detected file type:
$file_desc
This variable must point to a small plaintext file containing ONLY the zip archive password.
It must NOT point to:
- secrets/vault-pass.txt.zip (the archive itself)
- ~/.config/vault-pass.txt (the Ansible Vault password file)
- any binary/key/archive file
Fix one of these ways:
1. Create a plaintext zip-password file and set VAULT_PASS_ZIP_PASSWORD_FILE to that path.
2. Or set VAULT_PASS_ZIP_PASSWORD directly in a private local shell/env.
3. Or use INSTALL_VAULT_PASS_METHOD=url/manual/create instead of archive.
ERR
exit 4
fi
# Accept the first line and strip a trailing CR for files copied from Windows.
IFS= read -r zip_pass < "$VAULT_PASS_ZIP_PASSWORD_FILE" || true
zip_pass="${zip_pass%$'\r'}"
if [ -z "$zip_pass" ]; then
echo "VAULT_PASS_ZIP_PASSWORD_FILE is empty: $VAULT_PASS_ZIP_PASSWORD_FILE" >&2
exit 4
fi
}
extract_from_archive() {
require_cmd unzip
ensure_dest_dir
if [ ! -f "$ARCHIVE" ]; then
cat >&2 <<ERR
Missing archive: $ARCHIVE
Create/provide a password-protected archive that contains one file named:
vault-pass.txt
ERR
exit 2
fi
tmpdir="$(mktemp -d)"
cleanup() { rm -rf "$tmpdir"; }
trap cleanup EXIT
if [ -n "${VAULT_PASS_ZIP_PASSWORD_FILE:-}" ]; then
if [ ! -f "$VAULT_PASS_ZIP_PASSWORD_FILE" ]; then
echo "Missing VAULT_PASS_ZIP_PASSWORD_FILE: $VAULT_PASS_ZIP_PASSWORD_FILE" >&2
exit 4
fi
read_zip_password_file
unzip -P "$zip_pass" -q "$ARCHIVE" -d "$tmpdir"
elif [ -n "${VAULT_PASS_ZIP_PASSWORD:-}" ]; then
unzip -P "$VAULT_PASS_ZIP_PASSWORD" -q "$ARCHIVE" -d "$tmpdir"
else
# unzip will prompt for the archive password interactively.
unzip -q "$ARCHIVE" -d "$tmpdir"
fi
src="$tmpdir/vault-pass.txt"
if [ ! -f "$src" ]; then
echo "Archive extracted, but vault-pass.txt was not found inside." >&2
exit 4
fi
install -m 600 "$src" "$DEST"
echo "Installed vault password file from archive: $DEST"
}
verify_vault_readable_if_possible() {
if [ -f "$VAULT_FILE" ] && command -v ansible-vault >/dev/null 2>&1; then
if ansible-vault view "$VAULT_FILE" --vault-password-file "$DEST" >/dev/null 2>&1; then
echo "Verified: vault.yml is readable with $DEST"
else
echo "Warning: vault.yml is not readable with $DEST" >&2
return 5
fi
fi
}
preflight_env_config() {
if [ ! -f "$ENV_FILE" ]; then
echo "Installer env file not found: $ENV_FILE"
echo "Copy template first: cp install.env.example install.env"
return 0
fi
echo "Loaded installer env: $ENV_FILE"
if [ -f "$DEST" ]; then
echo "Preflight: vault password file already exists: $DEST"
return 0
fi
method="${INSTALL_VAULT_PASS_METHOD:-}"
if [ -z "$method" ]; then
echo "Preflight: install.env does not set INSTALL_VAULT_PASS_METHOD; interactive menu will be used."
return 0
fi
case "$method" in
create|1)
echo "Preflight: install.env is sufficient for method=create."
;;
manual|2)
if [ -n "${VAULT_PASS_CONTENT:-}" ]; then
echo "Preflight: install.env is sufficient for method=manual (VAULT_PASS_CONTENT set)."
else
echo "Preflight: method=manual but VAULT_PASS_CONTENT is empty; hidden input will be required."
fi
;;
url|3)
if [ -n "${VAULT_PASS_URL:-}" ]; then
echo "Preflight: install.env is sufficient for method=url."
else
echo "Preflight: method=url but VAULT_PASS_URL is empty; URL input will be required."
fi
;;
archive|4)
if [ -n "${VAULT_PASS_ZIP_PASSWORD_FILE:-}" ] && [ -f "$VAULT_PASS_ZIP_PASSWORD_FILE" ]; then
echo "Preflight: install.env is sufficient for method=archive (password file exists)."
elif [ -n "${VAULT_PASS_ZIP_PASSWORD_FILE:-}" ]; then
echo "Preflight: method=archive but VAULT_PASS_ZIP_PASSWORD_FILE does not exist: $VAULT_PASS_ZIP_PASSWORD_FILE"
elif [ -n "${VAULT_PASS_ZIP_PASSWORD:-}" ]; then
echo "Preflight: install.env is sufficient for method=archive (inline zip password set)."
else
echo "Preflight: method=archive but no zip password is configured; unzip will prompt interactively."
fi
if [ ! -f "$ARCHIVE" ]; then
echo "Preflight: archive file is missing: $ARCHIVE"
fi
;;
*)
echo "Preflight: invalid INSTALL_VAULT_PASS_METHOD: $method"
;;
esac
}
env_has_noninteractive_config() {
method="${INSTALL_VAULT_PASS_METHOD:-}"
case "$method" in
create|1) return 0 ;;
manual|2) [ -n "${VAULT_PASS_CONTENT:-}" ] ;;
url|3) [ -n "${VAULT_PASS_URL:-}" ] ;;
archive|4)
{ [ -n "${VAULT_PASS_ZIP_PASSWORD:-}" ] || { [ -n "${VAULT_PASS_ZIP_PASSWORD_FILE:-}" ] && [ -f "$VAULT_PASS_ZIP_PASSWORD_FILE" ]; }; } && [ -f "$ARCHIVE" ]
;;
*) return 1 ;;
esac
}
run_method() {
case "$1" in
create|1) create_new_password ;;
manual|2) manual_create ;;
url|3) download_from_url ;;
archive|4) extract_from_archive ;;
*) echo "Invalid setup method: $1" >&2; exit 4 ;;
esac
}
if [ "${1:-}" = "-h" ] || [ "${1:-}" = "--help" ]; then
usage
exit 0
fi
if [ "${1:-}" = "--check-env" ]; then
preflight_env_config
exit 0
fi
if verify_existing; then
verify_vault_readable_if_possible || true
exit 0
fi
preflight_env_config
if [ -n "${INSTALL_VAULT_PASS_METHOD:-}" ]; then
if env_has_noninteractive_config; then
echo "Using non-interactive configuration from env."
else
echo "Env is not sufficient for a fully non-interactive install; installer may prompt."
fi
run_method "$INSTALL_VAULT_PASS_METHOD"
verify_vault_readable_if_possible || true
exit 0
fi
cat <<MENU
Vault password file does not exist:
$DEST
Choose setup method:
1) Create a new vault password and initialize/re-encrypt vault.yml if needed
2) Paste/type vault-pass.txt content manually
3) Download vault-pass.txt from a URL
4) Extract vault-pass.txt from password-protected zip archive
MENU
printf 'Enter choice [1-4]: '
read -r choice
run_method "$choice"
verify_vault_readable_if_possible || true

View File

@@ -3,7 +3,7 @@ set -euo pipefail
REPO_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
VAULT_FILE="${VAULT_FILE:-$REPO_DIR/secrets/vault.yml}"
VAULT_PASS_FILE="${VAULT_PASS_FILE:-$HOME/.config/continuous-ai-workflow-spec/vault-pass.txt}"
VAULT_PASS_FILE="${VAULT_PASS_FILE:-$HOME/.config/vault-pass.txt}"
SECTION="${1:-}"
[ -n "$SECTION" ] || { echo "用法: $0 <section>"; exit 1; }

View File

@@ -3,7 +3,7 @@ set -euo pipefail
REPO_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
VAULT_FILE="${VAULT_FILE:-$REPO_DIR/secrets/vault.yml}"
VAULT_PASS_FILE="${VAULT_PASS_FILE:-$HOME/.config/continuous-ai-workflow-spec/vault-pass.txt}"
VAULT_PASS_FILE="${VAULT_PASS_FILE:-$HOME/.config/vault-pass.txt}"
usage() {
cat <<EOF

BIN
secrets/vault-pass.txt.zip Normal file

Binary file not shown.

View File

@@ -1,482 +1,455 @@
$ANSIBLE_VAULT;1.1;AES256
31366236643936303931383737336136393131613164623737383065323861316137353364373939
3563653832326338353630386566643062343466303164650a383931626237393034363436393739
30373766383136623539643232393437613230373062306432306335383937653965626430316336
3437376366386266350a313131666131343966333666393535343432653131623632663231643934
30343063333432353336633962666361336364383538336139396431316463613330303264303934
63343366626336623733333865663138643333356231366162363530393566386533333862353065
37636666633631656166326461616465326639616130306331643730643631323932613663643762
66353130323935643432323335656633326435633739323565316163333166616130616432383031
32363734626566643533326565313063363733346530393237623738306366343038646134626337
36643434633063623539613664623730376564303265323039373531356461376165316232323861
36636132353366316666663266323131316439626664353431306130613436643666396130356636
61343239636665373630306235333938393435616132323963326637666163623532306661336464
35333432386330313733656532396534633966376336323130343666373065386363623066626231
61373336353934656638326164363835613037383735366363633838336439653533653035353432
62626539323634666262373933313163666531386635633939623333666638306134393063656565
63363364376165663433333630353937343665353262643030663766386434316463653830323233
35343566626231336433643966656464316331666531383165653936333830363263633034613365
32616361626661376539353165646432323733613830386666643864613764366264303562386565
32303733393133636264373038366336636666343837323462313565353334663038656661666563
62363834303863346338393335666663656235336262343264383133353963656237653664643437
66313137313639353462323932366536393163366466653565616137626330633964396238323366
38346263346664313664383862373733643161393338626530396666396434333437616561346235
65363361303036663261326563646163326166663836343265373235623265396538653365643866
62376133333635373465303639366164366666356361653339336234653330623239343839363636
30363661396233363661663335326364613638313465366432363636633432356331383735393963
32623463393266356532643030373632663466313531623565323930343565623261386561646636
37666461616461643366346263376130356439326165353833386664303932393738393230356264
35616139666661313133653133633833323437663361353235393436393465666634366538613164
31306539643232626363303938666630623336653338643265333935396332626235383566353463
61333634636437616535333034323537323066613539666130353437353532333331663530336536
38643937353732316536646333313431323038303566383031386437636333333266616335643465
32343936356361373661646631633636326439666661316632613764393162623639356332343861
30633162613961313036303166623531623661356563643033653032613765326136323764316364
38383337616639656563323632303761373966363564353338353165623035396537356633653562
61313839633366306239613137363637333635363531653330623533656265613062383961616662
61376536353965303663666538326562623136393066636464333636393165323834346336396263
62636366363837373166613164303864623530353266303237356230333563323435336530373265
63383165663632623638343461333965626635333939306661363033336337333130323462383662
30323762616136643261303635363436643234323466343133613232626437386132343865386564
37386637633730663863356232313133666135386366653238353336653566656335663038666537
39313233393632636637656538383835366361356435653333373335636637636331353534333334
62306337336330303039316266616139333437656161353566356232373736616335643432373761
66626531666432306164366536396238356537616136386466666133663130303264616437346366
64353531373761313937386435623436633035666161386238343338396462636362623133356433
31356536656461343961383061316133616232303765346134383838613539346134316366386261
30383561343039336535346563343833393834633039373137303163356562633463646130373330
30306664616639633835333561643064383763616531626335663530396262623937663666666436
35313731633539396366333161336637343566653766623064386661323439633638366366306666
64393063333061616433306135323933313965356336363266336461393837633364393834306437
38646231316236333838303139613563653661346637316463306630393665383135323461343034
33646232353930643535613135643232613665356137636130313663636563366466326461303533
36333831313832636664373730663965346634646537383335346463666666663532353439666664
65366336616138643063656664653331363365653530623239393262663731643335653132313437
37376639326338613438333830613662656165623839643832303930363535303139653031663133
37613265386164636361366662353432633032616263653864356539366133613739303936626332
61626333346639396362313239363066386364323531383765316130383535393436373461613935
36613834636663626563363236356539393864353066313464303532666532356530346632396130
33613266326237613730633933613866326335353437386131383431356332653630356537626264
38626663353961626465353765306661636664646232613438396262333766383131383065643030
61356337373132633331373834613865306462616636313037326562343565353265366330393563
64666332386436633133623262373962646365333633373564363238623335313363616338306432
35653434363932333234313564316434646236663363636438353962373961396563666165353434
62386665326136393966633333373235646530633830643238633433616635636634303335356137
39353064643762623331313839393139303762623466373164333232353538383735656131316637
31383932316130316639363231333032656432303037373938656531663862386133326336666330
66656265613537643766353665663934373338333962363830373738376331303830653632316331
61393037383566363030383364643863623766366639393639303365666431646437363131353535
34616232396233323037376430663439393335326430373038356465313439636265343332333137
30383932353164656462333433653331653963336530623164653834363637336263383534366530
36346634343765326334663962653930663638653333326435393034663330323733643933633035
36336331643266336266393264393735393332316334326634313935363866383566633865393733
34333933326232643932393234333030303762393236373838333233306536626639333664623331
36633165393836633362623037636339363836653435393162356561623539356435643437666530
36383461306432643861646535363932383565343631376263303063383264313430316363613465
34626638623334633666363161626461356230383839366264383839346239386162623463363634
33336534323536663065386133323361613166616636386534393831363834323763356166613763
62666363613933353930383064636433316534613238323137393530326437363139396165376639
38373262663135386331383839333236326465613838323231663738393536643962303136366236
66323532643366646638323466363263643734646132386261373338633763623362396664633137
36343965333237366462626665366132346666326162366330363039363937663535303566313961
31646137623832333166386438326565323235363738613161666532383039326464346535383063
62366339653630346331383330313966313233633162306535393338353738316638613062393233
34356464643236353939643030656366363438633066336566383134616338666536396132323764
31303563396665316235356330393863333333636365616430653835636566363536633632616335
31353732663735343333366331353061613965646461326234663231653832306435313163383630
38656430633861376232663461376138643633666666373865623431346234313630376236666331
65663735653538613934633232336534343233653963646635383732633039623635646364643333
32336432393438626162356662363330396236633831393536663561376532643735616661326230
35383235623731633165303262356561643133613739343239353239306162396665636662383839
35623532396238623763356533363730613839623134623937643065343638613039393637663232
38373964383861393865613137633734636466353030386630353066323531333931343665643666
62303839663039333237336664383833333535303063346536393766396238633934306264316334
39313934356232646631643562333365343165323337363666343636316232346134323162373339
36333637303366636537396237366132353130346631653965663331353232383164633566366164
63393164633833356239343261353663383539363330653039643631643063363330363431346235
31653431393065376366613239323238373062653736303930326336353734386434313730623766
66666161306534386230333938623131626633363438336634656363636665333566626637383666
66613938613638643761666432363133326533643663643337313039643162386438383432643166
65346266366439396432616235653462613631303932326634333935333431646665346437383562
63343665326434623431343739323737306563366131383038633939336264303765613531376363
30396530373562666335666538313365326532666335346663393666636365613265366430386135
64336235363166306130373130336539333363323161653738373739643561613162366366393937
37626133643733633938326432353766656461636265323933636531343630393231366231323434
62663337373433653435663030633236373462303132303130653230313530306236333766326338
39363766613437313165653561323638323361346265336437393935396262626335376333346339
35666635386266353034313865663033383762366132616135653839373037316631636133383466
32666434303363343866313461646663353265666230393530396531393437626636323537623062
33353139613035666138313837626363663465666563303739366132333763363132626466306336
37663730393932313962363031636139643735653830616337333766363939343165646266613663
33633563316562396166316138383133343936633764666236333330653337623861626235623766
63313734393234323238343335636564616133343664323334336464376161346561326461326662
37313061363731393666376238666661386666373432323830336139316133616362663733316237
33353332343033323332613061353163393032653437323332306434653866326531373630343266
37346232363863636537643330313664333338393132396631613133386562373562356539393735
37313034313962313431396333616639653536383335363663613262303334343761363363303664
61366664303136373566373761326239633530666430373865363961616336326339643333393134
39653462316165303436323562633339626432623937303539396538373466383063303663333362
34633735366138396265326333356162636337313666303562653335396532643366326430343964
34303839653433353866316235356266633863343737313936356165663638343836303263306639
39353936646538323933393234383932316362353733303361653064393832356131376461653132
38623733313066613638636364633361326339616331373036666162633262656139623632616162
35303761363230363130663235613065303039653138623438343438383737613431336637333461
63393836393535646237323664633336613233663430653262343137666636663034613035623661
33336633393761613662333765646633386261626530363931613664623134326661653332633232
39656137393266623761623364383933643466323362393332346130343564633964643836663330
62336666396466343035373663353964646331613939336139613530363864663333376163626365
63326634333739616132383462363339616336643261343638616432353237346462656239666337
36386535333164633237303430643266386537613536363432363031303539316333373931666439
64393137616633656537363264636663313134653237366434386134643939376434656436323437
63303266386666363266333836376665613432666535613737363930306635323934373131376235
64303564663666336638346638633731353034613236633465616139653561396264356238373235
35373231393337366663396264376266346134363766323637373130333464336362623566353231
32636263353436626562626633366266303161656464333030616663363566326265636633616238
38666337386265393162663236613433336130323630323836376135643530393438633861656532
61373037343433383635386366333166313563613631353466623837316634366665633161666361
37363532313861626435633165346165323861653563616531303061346332653834386637663030
38316539623162323862373232653339306537306563366231373163666637326637333237376564
33323165383430643164316330653436303566393566653134626638643161386363313263306331
62363061343130383830346234623432646637653334313862373363653966613532303433363735
63373662326464333961386565343363663938363361336133633030316438343266643162333236
32646335613933323839376266663137383234396332636131323736366332616636643830353165
65653939336564373537383733383931353362366537356266623964376333343135356162613636
66363430666166336563373364636636306439633039643066376561653461663936363461663737
33393866616335383930383438303731396430376231363833623564613139626462636233373662
38666363383632333266343636613063313234663131613936313262313662616430333633343261
37353634316530613934363566643666366337323932346632323063306133633739343934303964
30353430383763363863336538623665626139316238393662633030363934313366376639626633
63386335323933663166646535306665643334653765376133353938613336373362633961633138
61316236623564356130663062663166623937653464643230666236343265646237326564303339
32623134353665353764323939643165386363396537393937663231616164643365303062393935
39396562333333663933613439306664643834326531326334663463616436616363636264666534
62346236336465303032396133643461643834353966343766363662643930626433353366343862
61363039653865313036313964383863333035663835356365333261303039653734306236346238
39633231353565623134633031663363343861326164616230306463323430643131333461316230
32316536623130636436653730303436363861303033666634316463616239636634373361316236
31306634346361333765313133333337366134313831333961343764343330633932346130636436
34663635333764303833383234363939363438396230643633663934353933633135666238626236
64633132646234646534623362633235353130343264393962326131626337386362636564393835
66333032653564336534386362353562326337623533323534316361373730373865343662333764
32306662306439623363303564356232343862633731376266326134323561663864353236373738
33383437396639306339313338636639386162313966326534343563663937343265643031383235
62343861393531376363363337356563656538616333306465316133323364636231613962626262
66626538613461623262616638643934643436323163623932373333613136306339663631363966
61383032623537353561383638336364623936656166666339393366393938666563643161623634
63316565353063303435633536393030313561363237656135636334343839396630616534613834
62326264386263306130336636323162353834313438613035663431303764636561633961333338
62303138373533396538663031366134336362663239663430616666383734626433343430306232
34613062393532663636303833346231633438333665653536373362343161666237373235633563
38613939646437653465616538333735666463333135623066386435363366376164623338303566
65306338636363306566363736303038313634613463313562376233303438386631353965396466
33396131643566323162666339316238356534353034333035366334643934383333643233333338
31626230303966343461616530646531646166373332303438326165633231646463636639613835
36363436363232336134663330333263353036306161393238633264363438626661333738316639
61353434633237633964646132643265323531393362373638366133616237663662376462393433
30613939643366666334643266343131333930626533656365383132393931643338333638626336
31313235373836383861646436356164643034643531636637636537663262653563333465323161
36353064303566326164643761383339666634383761633230646130326537393939633038646430
37333863383637633264343366323561303461306532636665303733346362656465393739626265
32343735626631633464643566613931353133343664323138383563646633326133326164666234
32626261613932373036376535353636636132366464316631646161656635393161343162333234
65323532303134643837323837643865306666393062626330313139363835303965613962393361
30613034656433376533386635666436373231373539306634326538653731643437373334666639
35366566303964643536613332393331656338313166643565343335323366336639386337323765
61633463373764373833373865386634336261653939333939396630326335613566313439373334
61316263383333656639383735386462333031316430383331366331336365633435633730666636
37626363626166653638383933633832323937346234643665636531663339323036633431376437
63326330386661303539313830313862366663336164663136373763363330646234386265383138
65353936306139393532353963633033343761303462386464326162336435346637333462633639
38323432656561383838356530636639376334366331626431613533366331346261363038336430
61336635666632633138393536646466633234366334333935363364333065323164303232356136
64313939613165373337623830646237313239306438663232613166393262386661376539363262
39656664623431633639363538323765616363623533383664373936303435356237393164316137
63646236303534643064326366313731643530636164356431343738653332326437643331323634
33663837613139323935653332643438333965346539316630356132653162373538646137363632
30613138366231313836643464646566363939613930333237613264656265336131343462353362
30616233376464303634376237323364376239626533633963343934313864616364353037636138
61306564626331373765623465663762653066303734636235616532663236396662373039353865
31303261323537333133353239343065633661313035653139636334666362356662633966346430
30323235383339646138623639353261663738643633323531313638616336366362373165623765
65326437323666343833343339356564636135383936323131396238303761326130653064313762
66353435663663656438386263633632383031663337303237303465323530333432366636376337
30643661636137386464393164386262643133303662393863643232363265373365353735656338
32376361626230376262336536646235376439643133343430633135643831656164333431366534
32313466323065373363353239393639333539613130643361366639373962383561656263626436
35363934386662376164393034386233633931666161323161373636393136646265323231626666
64656165643838366236376265373535653837633538333865393663633630306364336562666233
39613736313762316130643531656464343339633038393831313964376637356638346331333863
31376665653239313238666134333830303538636666343861316439363965666662313461656530
62353762366264363365313330393961386663356136616232623137326561373265396265363530
31353766366661303435626162653063646632336337323431656239333864326139383165383132
33393865316437333463323463616463663935383933626239333836646234383961393039623561
63366434613336366463346661366235663038393062623535613837613466313664326464323031
64323266633331326366366562323634373030326466343538323935663230663064633562343462
34623635666463323638623966623737306433613030353830303966326333333330343234316535
31643532613936356465666536613536373562343634653134393561663832643736376461346133
38383462373165356663666332643263343232623139613537616232616363326262646363343739
62326566326138363131393063623931323561356236613464383836656338656137616335613262
36616639643839396331666131306563613937623133373339643361376163613861363633643538
34343532303239323434376135313063313563613762356666363230626537656564663836343666
36343630326665303334656235666162386233333966663139633334613134356562626232316434
65623065326131383866393139326130636365623264613763373962306361393462643839363337
39323039356530373762363761643739373632366165333237323136343964353165386133656333
64636461396530396237336232346536663837393665346231336431633866343032303130393435
39656437633131613538376138636461356139336637353864663035643530396338373266613139
34393534646364666461663737326664373438613862376266366334613664333365313737653034
63383665363665303436653765633061386261393963663431336132366166363535323939656237
34656237636164323439616639653066323636663638386637363136323335653437313637386434
38363963313033633439366263333337396132623962663764393562366638633239633035343061
34623662376166376539636630383931343962373236376535373562383633333263316437373065
35383534393731666431666133653331373733336634346238396161623234333130633432643764
63373430366666323035663731616166353762376130623564303136393732346633373230353861
63303933623262313234643339376537646531336232363637353236373565646236363931303430
62343632386232336364643961386461613935333033646635376130626635336131653637396632
36333230326433623938383662326661356464333235633161613331333130323433616439353132
66346661366630626632636462356435363430323861353131326561666562336562353965353936
36383139643566323661623761333966623964613838343264643065626632613530353636366536
65323838316164373936633663323161613033646139623631303464323563633766383661616331
39333563343031313231393030643964303863666162393438663534346631666361396466376164
31623835616638643664613661656438663635303063626230626662306563393336656538393338
31333138323332313430363235663139613139656639313437373263316133386334616135646239
39386535613365323535373362356361356666326335373137363761626334343266346564666462
61633061323235346263663935633835393866393135616265336338383162633761376134316366
34613433396430313365323033343839393139623363313230663035313437363066326338646432
65353438663866313436623837343466323163663138616436326135356337386138613565323466
39383032383463643736333335653234326331633835386338353662656230313530653965646236
66316238643435343735616435393733663635373638623135313831663431353537333137633038
35636464646661343465626265616530613835333062623866333235396661326437643065626239
65376636633765396365313664643934623232346136376462623563356161656464656432336264
39323039663332303564623465643737373763366663363238303830636435626436623938633665
64666565653965666366366434373163333661386237333139313333343539616335373630343832
38643638623339623237393438373737333133653661323630643635386131303133656434626464
61346265653564313330333939353034663934393033383266643261356364316365333533386135
38333266613864626335613066636130373437666337623936343838666266663766643035346330
35363337323333316439623761393835373564356137343630333665383631626335663362653439
65653133353862326632633436363061386433306561323431373834393161343761373065383732
36666439663632396365633065333864383662616137373162393132666434396234346162613639
32663862646662623637323638626661376261373330393132643132363237656164303165653864
30373864326230376430663038326433663532323435616534323936633764333934623065303463
63653832616562326165626639623831656130613965653530353762393832333431646163356366
66333666383833363566393063303338346165383034396363353164613765323765333632623937
63356237623432313564386136323133313161646436383832346338323564643865306432336331
38313635373936376466623939333032623363633035303163396262666230616339333761333464
62373332333563373066636366646136363937303530366234393863613733353063356531613138
35633135336539313761663631643034393136656331313639633561336665396636316335353863
31376533663235316332353433656237373638613935376639383639666130623862386463666532
66333366306461636634326461363738333838386336316239643736636635613439666664643431
61326237616132343931383864313434646230373966633437316264386330386161356434323166
36633939643862386633623132373838613437313332396436626330656335636263623463346264
32633730356432353734353765653564306563313266653633306439383861346337373763626163
38366635663234343536613239643464323336656333333566396361343966396632633037343637
61323833616437346531366534313161376663396634656433386635376436643633383165636463
65616564326537653861393137373932303664303833326361316437643535313235333138346639
37396535643636646365313038643964663465383062313735623763383037613530393039663563
32623533386235613338336638663362383230656436623431383833386234613139383831376662
38626364343966616562643064626330643866356362316239656339653465323666666464313766
31366364393331363638653034643636343066613537333335346566383938323664643065383231
62306532646639323830326261303662333562353731316231623535313137653761643936326339
38323635653164326637633965313033313638613135353464363764633131303563373236376237
33303934623464653030343735643165336134616438386133363065636264653934653333396638
39396364636134333036316463343532633532326432313166653536646433356536653232363731
62323536363665643933623936316233613339633132633064396438343530366130316261663835
38663364653264626630326532623134646237396666373865633536376238383866316265373765
35366438653364343634346136393931316565336130636165666136356431363834633437613164
39633137623536626534386332626266303563393261343731343065366533393664626636646263
39356131333462613931636363336164346130373137363935633236343730373132316466373663
30656435323134616632663334633736633661313166323263613863373430663738356635313332
62396233336230343336326363663239636139303437323836636263356166616537316235346133
62613437316430646333626338353430383162363030306630616363623131666630623336333939
39336263373961666663383331306463323136323663323230616263633933386536353737626438
32306239333663653034643639653233303763363738326430623462616336663366316330613937
30333665353463363830663835633865323836613237313739336331316136303534653861306330
61343064333138373265616463386435653932646261663833376436643730376632623037333031
33613032326234373038663535306330306630656263336561613936323931623834333561633235
63366234666563626364376336326633353138663661323433343235643035633538326436343361
35633966646130376339343036393765323930346233383862653939616365343539323561623038
35396464326563613938336565313639616266313164386665633836653635323339343733326531
30353235626635623130666635626265346432386561386164333330303833646263323861633835
36633262633137363762643639373637633963626131386364326238633738313338343432636532
35636134346666323364323537613336643033346438366232613063316365666561346562396633
62353166666562393034613134393539643233633362373762396433363137373464353634313462
65666433626166313730303962613535356237613135653732356533633664663661343765333632
33666632663636386564376432633363313737643265656266393337643462663932633534636561
36656163366336313632313730643237373031663536386332366435363963616139376362323965
36663636356562326566303761333933316238376331326233376163633762383437393839363165
63653163373236353931386665303133316634656266616133663763343238383762373134326464
39323039383936633361393266353235356335653037386536313661306236333331653233366562
31313166323665626530356534356634323939663830396265333064356135616537666136396432
66366236363833323864636339346632646263313630313732383533373238356331636662643164
64623931393539376161613533346131656266336134366330613530383631376435623231386432
63366566646238363864356338366331616235316436623134333065636636613365316563323734
31363361323730363163343835343138333030373363386637643162303864386237386164336436
39653061643136396162396233666431386638643739616537396438616261303364393266616230
39613361646366333130386333303031646165306265633834666537393263383466643236656265
38383165643239393361303237396439393365303738633038373134376334303662653432666330
65363534323965313837653166653065336362613334636638363065326461636364336233633764
33343965383933643830336662336333613132343565636563663230393964333837633236313862
35386438333931623039353263386532376233656538626661653836316233393932336362323636
36366330363265626630623236356162336463373765336438366562643763333461636561323566
63313336333435346261636332376339336533383435623438326634373561393566666336396437
65363963613965303936363466363565636136393233623263333237343039663934383932636639
37323631633835313635306361303266373066623562653739363665633435333835626261396364
39373765633739613865373836646264633433303630373539313836313361356231623634316138
65393038663832343761343064363766626266373934663461663630346363613631316431346263
30653039323466636237376366626431353032373633333632366632373635613261396233626434
31373038613766643734376164303430353536383866356231326461313563373038306531383163
34356235653134613264383631646365373165653162643763633463393436393437396432313133
35386537396336643432663966653565383062306263303562613664333332383164346531306631
39613038656331643138396130353236646132623034343835323336623336336233366637613531
36646161383962323865623332653961663865303432666465306132363630313833313364613536
65626430303030666635346534653666313862666438653662636564626437313439333432656239
35316336353664326562326536336462663432323034656265393134633763306464346261346531
34306463653163353739623964613662336638616463653165383830303732323037323565363631
66616361646231393063393761366134383639323864333565383939643561343630616535343235
36623362323533393437313361643533616134373765393762343966646338313061623262646636
30646639666636663833636135633431336336303434383361393333643463393531343837613438
66313534336637663637633737306363626335366662343463363936343734363639323265353938
65393964656562353130373735393061353932396631646530303437653333393833306562333137
35316330313433383439653638396535613764393264643738636538626630656266393233313633
35663636383338336264656139663331636537336631363339616663346232326562656531346130
65383732306537343837636431373361343063653933633764613839333034653662366536636338
63653366363562303363396231366231326230653730626261366230653265613263303163323061
33653063653834333061663361343230346465333463333165333431383538666432656337343362
39353732353938313462613937636633386138383661306237356232353161323165346139633366
33343137623236653764323234323537663233313937623136336663663632626364383332663232
66386261623661376139386263353134643965306530643537353235336237343131356235356332
39336464333261386438333665323037643061666138353266633431336537323362393763393431
32396230643339353539613165623563383732393562633463376532356630393238353732336661
34393739633731643833623830346261633931386239323361343464303334613839306330373264
62366565363031343462373730656438616530366363333766343563333066623533623437623761
61306566316433636233623236343335363432663234363363336239616231646536303936623634
64306132383332396262326432613137353265373765373038653832383264626261316434353136
34383763616439323237646665353637353266326262636565396165383765623066326634333865
39373835653962383065666133613366396137373865616437303965636236643939346439656166
32623837393833333932366431323637333532663134613539376332653961356265633433306164
65386531393430626532373834393135343863393261343162623132323938633766336633353837
61623365353838316235646236613434313833353533643566653565333036346235326232353335
36363538643865663636666637303737633338666136396162623436616636356561306337623366
32626261303338373730626461643431323565653332323032363664646563633430636662666665
61616465346532333239643161313739303636613030663534386162333734373633383234636663
32623739663166633931663461323464326161333461376265393730633231613330333936306437
66383661343435343431616137316231386366356235303434666234323231616236326239383266
38306137333138336666323564663038653063313665373035383235666538333530383134613430
65663038663238653664376365666462303261353263373964653538613263303537643061316261
61353834363262613934633831356436623636393762633439666330396265306638653664633065
34626565636266323466336536623761333563363764346638636233633066623530353530376537
34656538383666616231393366646362353634633835316338336339343634383438343830643235
39363966323861326638616136353039376338353362613166363031626133336535353165313634
39373332303531383531346464656530373936316161633966386237343337653832623964613264
38636136393561663334396263313365623964313962666137396465383839366337313938363133
61343338643035323530343835613237383035343534333439633832303939616538643663373365
63333565656439323838393038366166383231373866303561626433346238306237353334633738
64306232643433653633636361306663663462326431363336306663323035363931643663306539
32346365346333346632643039653138373938343661386462636361633065303763393131656131
38656166633234393431313536383031336431393434663366366262316461373237633636303139
33316262393030666166363864313164353435343332643532643663633463306633316330326430
30346161663932666134653761303962396161343435303130353435333664313135643731626431
36613333666130666435326161613834336535346438646262653063316535356162663538666662
31656636313864333061663638656433333030346436633866646534313436333530616463316338
34643933613430633762633962333264393065343832663136303537316665643062356636303631
30316166626134373465343363653361316239383335343864636434313434623337666663316432
61663833333930323664633131656637313562383039643830326666636231323236393833386134
31393639396530396437356532343033343364396333653636373731623261373361383330366430
38313038393064346366346133336431643364393061333631303137636566333539383839373766
30343261636566386432656638636563386434666361303239316232663235656565623538306164
32346435343334396662653837633732353735653364353462306236353662313832356631643930
64333564643963623764643031616431656261626633633966376337306364333566373765633434
63643736373138613732643432303661306433616435313430393231333939333631626338303366
62363432326338633632363433383566326365373962393136323266326539393935616461356461
37316435366236663431613039653432656633303861303863303362373835353931663633363638
62303466623762333035356139666136306539656235353636373265326662343766613338306462
32353861633162363231333433663236616136346162323662366335323063333638356137323863
31323061303730303063626437346362363832316561363937326539396539393038326534323337
39643261653936313338353933356637333931373430663139323663383533343733323231323266
64313461663461666663336365656561383666656266316530653830316631383439373939613463
30343034326261326531303433633432623762303930643935396465353563616461386566353739
31376463656634613030646564373537643166363739373833303862366133336261393934646662
31616363373865656163333538343239343834313264333336376638343965393737383436646531
66643664326536313136663733356339363065356662656530303133393261393864383238656630
62376163636431363464633963336639313434306239353833303036333335313466393231396633
33326464383537383236303531316431623730313861383031343237386631313939643039636364
64623463613330303737306432363364303831306265656134313232666638666366383732653665
39386337373431323830666462313832343836343939373966656361643138336635633465373664
33346365623632303436343130333761656634333930656364333734336231323132306135303633
36356162633265626632383961623235356532636135653837383330626138323064613039343962
36333330306137643861643631653061366132393966306265373833613638643035663963336137
61333965336331613535373131373933353764643563306237333961363138363562666434616530
66393031386536616139386432316466363335323664393462353437656131356138656366373131
61643765383239326132376266663565346331613136373139666365303533626463666431326231
31326430353131306135366634386231333963303030343761326433363961393166303131653430
31353163323961653631306462393535623335316661646166396635623064393033313332333837
38663234386463303234663632383936623733336338346561643563613262326166313631323339
38393239656166626233306536326535363166643734333331623739653236643139326530656166
34633333383862343336633234613963336562353337323566386265356536643931346564383737
65616161623361323361353865643965366464363331653866386637366631333963663762363463
30333531326164383564616639343333663537656438303639616532326662336465666639343132
64643936376261303738616131353765663733623730306463393031643535616366333139383062
63636239663464386139343039333434396436346164643531373531353035396637316331656238
39663334383262316131363637376634336138373964643532343166626465636461356330633331
38666437663464363764623831366531393332376538653335393730623935666466346666386665
62383833313165336434333262316163323337653733623237326263386364616332346330646135
35643263356633643364346564383566626239346561303763316662376166316439656130326462
64646137636530303764323736323332623934636166366336656433383961316532306161396138
34373066663563353533343033613061313763333930666433316333346138396161646236353037
32633663376638663036306230623435366165666533636137373331616363393034633639366564
62633466306263356331623332343635313730366539643665323866303738643834653561393339
63306261643930613866326435346232353335376362316231343836623637343961626666656237
65653236393262626137346262396636356663356234613432346430643736343030373138656166
35353137373830316666396266333566303063663730616136393837616435623433336332363039
34386231633666613232646130653963323835383837366263393039343361663262356637643364
66326633653965663738666562636530633562393536613565653962383832616164636635643437
63653137313265653332396131643537343632306665353631653031346162356431656465663536
66663531633633336562666130366631393831633332313131666134653738316562393536303061
65613638336461343963353138643837306339313363613966613238666334373933663561653434
36666363366266356637363565666236396630373335376130633139383435356435653339383230
31373466373063396433646439396130633330313838363737663339376635303939346533333135
65373034343762626162303665666163626336656139653732653461353034656635623632636264
34363363353564393136666632363338636239393037666534636662623831343461316139393335
63616366653664333037646161613430623538306666656439326462643830626666336630343730
30363933616332306165666338383834386163343238303265393131393437376235666662333336
64333831396132303337643537323531353163626266316330313865386435323937393265643233
30373936356636646231313666346534303738663162626230623835663634383666363666373230
33313931333230343966636631363561633231333966653535663338383832326562326234633636
61613462616336643966313834633830396561386361653535656161633265376236383539333361
61396361313137646561333032373766616438326464353737373134633037346630633232396135
37316538303932363561393363343763333938363333616566306137333666333634303133383338
61363962306439343163653036386536353765643861623431643732303534643532613930353932
38616566636363343761383730383236626262613963643564373164323434636562306433643133
64646464336539623336616436396234643238663339643365623430366231333637633332643536
36353861326331646332613961633634326565346664356634636134623434393835653965373531
31346238363238613039306534333063373439636435393061313565623034313065663163626638
66313630366261373261373339633963363530396538343431373363366437626539393339656534
62616131643130393839633935373965373239366535363731363436326339626364613539326235
35363066626139376465386530383662396663326364356339366435363164346163356662396163
62636661613933303531353134303333613030663231613338623865366339313330666437633764
33363533323830653733666338656531393533646630643162303837656661313065373963623761
61616132383034396235386231646630343531306434616534323963623765333963343036626436
33616337313533663763326234383361333665343163363233343933306664666462343038376630
63633461633439303366376330313236613338313664326234323961353030343634326262636366
62663934306535396433363038346134643662616665373063393739353932393732613865353765
30653235623931623531383537636638366434336237343939373231323165613235623039353130
63346635303762303761643239313465613636383138313630356261393163313330346665626532
35633932323831626235623362616638616436343938623533356565386237373238616432663837
31363164653761313763303263383466323066323236343066323138333337643834393866653538
63346337303735613036633234633035333165353564376364393039303765336265666537343630
38323136303761393331386537666164663337643839383563613835333738306661656561643961
33333135393432303934353564313966393265636565643039613532623037666266623736623639
32343363316533376264353036353439386361666531666433666237623938383262316530396233
30626536643732656665376338663463303430373866303234316533626436303063303539633931
64653538386631663366333035313730663732646637646339386637363438386533363439393562
33633837613362623237623934633333343465643964643163346464353139616233633739363336
64386331633739386361363764376635626130363232396132356537393462633665303833636330
63343132336338323636333632666230653066353035366632653730353730336565313935643739
66393937653066306664393735383366646436346536653831326466336631323435313537353766
38383138316636393939316237633437353532363739306263616464666564346663613938396533
34633139656463386638363931383438613661656238356265353666356135656632656437363236
39363162653332623435663463626466333664353731313936653263646231663134336430656330
37626639313635653235663837393034636164616531613335613434386534343534633134666361
33666435333665343063386635646330366134383663626335613335353738396135306261376466
30626535336131613735313733373965376234643139353736336563653930616161353565376138
30313532653835646661373362376137393934383337376262633063363830303363656432383537
30366335316265666637323364353537653238373239383530663133303530303838
38643636393930613934353734343561383831633862666534323662396133633635656466346663
3436613662353265313930363361646365373836666665640a643238356261376261393965646333
63386232323538313564303834363061356561363532646266653562633230646435386539306135
3937616533643837380a396231643864653837663033386265653034383932313538656664616336
39373535326130336563386431663436643138346162666534313362663564356661396131336532
38613735626664613766366636663563366365646632393936333038633537393139383839383632
37653666363730666465653038633632636463666131396361376633366436376535343031616235
36646531323531383233363736323533306239656338633139626237396366653035396262343365
65363531313264643935623233656163333530643865643730643363396561316539303333303037
37333238643633396432316231353530366664303162393064626364356337326464636236366133
62626164303762623161313833626130393136616261356236383165343435626563613634343464
34306232626336353066323066346163616263306131356461633539666333376636386431333266
63313464613739656334343163393762336564313835313264346631316438653964346666363631
31616238303737626238316330323937343837323164346433653935333661653266313139356233
30623265313335383838346230343239343934663030393263636336633633313430626338396262
62356630616534323263653464303237303332613835303830306264353465363533353336373431
63373764363639366364633136343237373836356536643633303331646363306335623233326266
34383231626437646137383339333965323065373931646562393864333437373265656561303530
38323835396263633165323565343363623264653133656563356662373063383632623761323437
37616665643136393437343434636534613465306663353130656262353234323838356634613734
66316338316363323830666532323237363465373335653666313163653530303331633139393561
31616236653262643934363265373930346634346563303964663464656532303563623631626535
61373137356639643130633866356435393430366366653638626532353363356336306532333030
30303537356330643432343161373864653736666661373539656539613331666339366134386136
35663862323031626165393936363335356562396635346566366261613863323363643862373963
37323630376365633766336334643731636635376164373938336233643064653461656664666533
30373633623863666530353563393034376632356266306161653738643861303130386261366631
38636561356334323538333932326233383530653430616465643762396163316562633465353432
62663761663666613330303266623364343130333463633563666537393039623235383339646131
39316631303738306430373864326339396237646637356234303038633762366365356262313334
39303237643631353064383231323333396439643061613164313830656233646233613935646666
31613061363333363737666533663133373836383532643030323539616634323462373866636534
34346562303266613566633430663735613533613031636538626231376437353137316632306261
30313363373139373631333364326563303164313532346631646331613866626333326139323065
63383331376431386438313734616536653331346136386461333165313036613032663338356537
66393539336263643831623136623032323566353339636561633636663937633630306666386662
62303539653966646361353235316439396333316435376236396336643230393663363562303933
32373230323039663434653032306564353439326334306231613034376338313262303736323663
35343638393336303763616664386436323337626661306633323832633232333734613662333665
32356438333963643636396166366130653131336638316636666636366531643333336639366134
61616630373431316638366530343934636162396661383266333333383964663031356562323961
38373535646234623334373864633635663061653665316564623461373034663664643531343464
37663362343665646530666261343432386539396232613363656238623762656133303339346466
30313637326233633335316362613731343831623464663666666561303331363766313862356430
39326263653265363131633935326266636266343735306332663033393537393335343863376561
30343039656234336662613563313264323161306339303163373730346533653830356134653337
38396437313939663766323266616437636236656435366439643234326536333061663431626435
66383139306336303265623065353237333437383733343761323738326638333638336333633934
31343238343136653461343731393366303833636564326566616538636132613161326539363535
37313761326334333862306539633331636439326338353038656639616363303663303963313461
61323330336363336237633064353331323564376335323766653130363261386336366239353163
37343234333466356461643361326265653438633831323834313130333766303661393339396165
63376431363734313939616136633261386337663234626131313161323266313437336535633565
63313137366333373562333361633063636633396230633363356363363530306339343738633562
66396264376235343631353931333236363165303730326162326361353662333837326332666430
31336562643366343065376536343764613633646437636262643666636464623733626632636437
37373065646430383239393065386231643661313630613934303665393336383835613963343436
30393731316337373566386138663138613037356363616530666536303137656562376564633138
34643739373461386464393866323165633037643063303138353033653637373739653430373665
31663434663866363063313537393237633937333236623362383961356139316633333932303363
32383232393530613432616438613232356333623164326332633030623634313536646233663266
64613336313737623037353434656238393336326362396439386232366537653563306662646364
38623763663537643065356133313330636562306432366636656436626132616138386332316636
34393065313165643663383636373032633561656433343034356135623331303339306536623330
34356531343630363839343866646234633062316139646138386665623232333530633365636536
35653631396361333936633064656566313336613138326466636430353165356161356365313536
61623032323537303065333234393365333136346337313138313238356330663737616439313561
31383761616361633561393138636238353261376638663231363835316330313330363133303732
31623062646262393133313565363465303266663039343131393430373935613838366638633030
38363635346265623365343537323362376630363538396438663534653738306661633238343137
39666438333733656339663233646132636530373036323362346138663335386530343431333465
39613664633662633062653863636363336633386233323834316432646536626238653862643866
31646464326638633435313639656531333632363331346664616530363337313864353439346635
61343237343931303364316533356636633633336532313735366561616365663963346134393764
37653333383831383134626463636664366636326433336633663537326266666264383962646166
34303833353063333962356234363431356635343734643539303134633236666461313633353764
64646133366230656463616230363564643766313965343764366564643637663566323130343464
31323434336239303036326533666463306335636561383362306232396332636434323366333333
64376363376266666437353438336463613131666366363336633764343535383636356262636535
37343065623865326337356663653233623938643362396465636232386634636463346330653636
30663662653034643665313762353235356137343064343535353065323464663938303061616436
35653239356266376663353238616531623765363261636636616461666161343131653962616339
61643635373934326134643732663234643239386234336236383966373065383133326333376137
63306264643830303637653063363265346632646165343262653866373636363737326666626632
65356131353663653365343538383038316664393731373466313864366533393936383636636130
34623762616233633834663561376566366130393137633663626634396462396566393062313536
33643634383566633432326233323937386235636330643766616333353139303233393938653038
37643032653937323430623037383039373234323637333039373139373762373339356337323064
63333832343963326633663564363131303530333830306238306430316130643537623466356666
64653430363564366333353738303464396434653061623336356133326365376365653433656332
62373639393530373237653339336335396438393636623538363137626132343330343331326239
30306364323065363566643030366634376436663566356433616235326266396464303234393031
30313534303931333737396563326463613263336132326630333134623738376132616635323665
35343831626537656231643638613532353934626533326266666639373533396134396335643034
65613234616238353432313033643133623633656361376336323935336439376532353736393530
64386464636265636330613734333865613566386437643264343262366534653834313663663138
64366139646436613230383638343331653565333330383135353662333331633331313961616535
61396361343739383838313932396664343961373935333139323735633463376231613138633433
65623431623837356263643461343062333234333462336436646263356663653338333463353261
33636336303939386633366334636661383035336162633565313839656431323563393130316338
37633262326136366339623162316639663233656165346334396131346463393865323665643135
62613464313938356536663931373661356661636665336136633639346138383232393334346537
30303937656139343932393262353665636564633731656234326233653630326566366462353866
64396636386331303639303537616562343738316134366638653833353061353831373733616339
63653466313363393362386664313461636531396635613564633461353938396661623364373838
62366330653162343432343736633532623963316665323566303331656464663732643666353032
64343038396133396638313065373834326163323164333831356565303263323763633234326230
36656237386264386166303437393337306265633362663239643634393162343165383238323430
37383236346238663438343235376662343338623431343762383936333238626535656135366437
33303262343131656137653066393034663534303432383365633462626637316135373732626465
61303936363464366335646662616664363939663763656431623637636566666631386565393438
65316230613136383135323362376433376635393036336163616231343831356137323030313064
30616366343636636463633063383232386637643536346431643833386235323632313733623537
32343134343061383531306633613864656131393037616366666130323936393837663636636332
31623233313835326666383961663838363964653162393761313435316338633566383165376263
33646431623235323063303966326334373965653963613639353732613436656561396234353631
32373962623030333331363037396466646134383736663661643861306238623837646530613839
35663833356161366361326466323933353530376235666537316564623964343831623363396464
32343466353861616666303663363762343462393835616232346435323733353664376434623765
32366134323365323462643164663034323761366236636637383134646139636332373964333936
61333030636434383038376465336336326330363131613336353164656630626265653538306234
32313736393865613634326238316335613661643836303465636265646533646638323436343633
63623433373238343538393036343435623836346531383539323433356131386361663439653639
36643331663838316431643339623365646639346662306638376162376365343134366234633532
35653936306333343431663561323762323835303131656438653631313433656663373964326561
37366637376330383664616336303365303764326637326132326163333938633630356135373663
31313362386233666164646539656534636536373334333238643364386361656631343533346438
35353135323538616465663037613238613862373138333864386330306130343334396138623237
30633937343430353038363263346231633837363666636338623666333739636163643963316433
63363664396262636664653563633765613937303533323231393365666534666233613235663232
37376566666361623333633834663966613238663433363735363132373862373863316464303138
30323936613366363763623234303730326130303631356665393233303335636533656532643264
38613930313532626338656565326137306537353031376433363261343536313830346562363131
65643666646261383133383933336263633361386539616235353035396463653737623938303035
64393565316439633330616436316338343438383961306633323330366432323735393737356663
33343730653731303831323739333337626232356238613835616365663533386131376336636539
30393438313963363535346631353162633063326562643965396139666334666334366639383039
31363135373036653932633863623832663234313236616463323435373036646464663961326332
31616338373361623262356336333137663664656166656666613031356264363531663339626565
37616330653337643839333231363432306438636333393337393265343231333735633933396162
38313538393836353131303165313064396130663433366239633837623935616533313461646362
63646639386634393563653261663666633963306265343936653666653462393532363932383437
38633539613232303261316264663731653733353362366138306132666635316333653066626464
63636261663663346135343231323863356637616161643032316438353134633432616166643631
31346430326164666532643137366230313130643566353664356563373666343637666133666337
62393334613432656566383562643062653865613732666533666236623535646230646337343136
38633632626239383739306231343038383030666363333965653939616631356534323164313563
63643966313331303466363539653862316433333736376166626365353834376134643936616539
33326265643634646333353431373632306165636466646337386139643165643366356530643534
31333166393334646233656434316461343937326632613964346662386530646137663336626335
33353738613833646633663564346339643566653561613363663765333433653631626233656432
39386265316562643139313561376530393737363334393362353262646338303333363534666366
64376563623335643231373136366339646362623530393832376366653664376138396631343665
64316162393364363631656362343462316333656330663531353863383132656364323966336439
33396661343637353430396234303630323036386661383565306130356439643566643232646232
36383331666130366135336163656161393130383836343865616563386261373138323135353364
37376634396239373237313834303963376132633264333261313833636662373833353433346664
39306164643963636330306162396665656635356563346130633735343232333736313634376631
34366666343561393132643466623639656237353536333438663934663032663562626465323734
38353133626139636337333731363139666363396135303737383731613335326364653533613436
31656265353737343234623833326538333635343935303863316362316563663637643361666264
63383937333863613939326631343730303632363064636431636561613664376134386433303165
38663033643665613364353530666461653863646236373432383730333366656338633365633365
30326630313135656462323733346139353838363466366361643838623333666363383333306430
30653337666430666166616434303566346336666566353736643037343033663737343433623666
34323839643133363066313262353266353563386663383166323736643339633837313537623633
31666236336335663032613966663033343337666134633065303533666562663765613565386534
65303737633333343834613564633437623633633230613039313961623266383232343535336562
61343033313738636537366535623637343166636438323666303036326563666633646539653831
62383439323439343661333634656338383334356437613432313130373431656633326137343034
34636138663030613939306431636662623337626239326338623130386239373466383535363534
34353064626165343931643633313364353861313063643365346534366536323537643131663965
62303334373531633836356264356631303366326561383865383431663565656439343863393931
36316533663136313964643835323265323533666364623833313265346233643965336630633939
35633036656237663237333030643461353330396634313331396434326564613964333734366364
66363636643761656132306433646663663636363632616636313063626337623137353561643565
61303436393336343535323933303762333335363364363764333464396366376561653863623638
39393335343365363162313361316265323265336161343033333836313330326362373930643838
32636532333366646136303264366335383538303237663931653963366666636365336563653636
37306466323936623764643065373062646466356566303839623239356663353761313231656538
64333761663732326530613634303438653539306166633634666461333966646165376437373362
38616262383336383334343666613964393365306131323138663061333031653863663239363632
38663636306139336534663065316634666230366431313634633162386532383534343833323530
35643832343138393130383066623163633832386565646161653736323165383836333164636566
30353161643332656338636538383436316337623134346561316563343037653363653265623431
66383532633837646438636138386637336134663763336165376134383638646464633236333935
31333964393934366661393039333533303034393339663639353430303634613463313862656566
62363537656563636163663230386430336262326162616564373966336665356463663462323362
66306637393734383839343266343664316264633064623538363166393132656231333135363333
61663533313664333537653135643763643239323437623337616638666234623261396631633230
64316432626466313435386235613366393638613965373032343963663331643032313037336534
34313233613035373532656466656131633662333066336231626430323734313732316166393030
35336330623339656538613534383336643837393462633836356237623862633762646536633232
62656638396336663066303139373262623333323732373935306564383839333962303663366262
39393062376134363262393461346262356436313166386138353232376234383232346337343666
39353336376365376532386666376366633962623862636436316635333933353566303338613065
35343761663239656536373931376238323133383966363431313561373066303332313837383865
33656662623937373935373935336663376633613238383933643934336662613534333638663434
65656465633036383465376562386661653236313265313963623333366533636230656638363636
39323435643034663863303561386130303166633965643762616434316332646564646462396438
62393237376462316337346361623331353339356533376236383166663864646162323538313835
32326665353064343530376162363332626366623762333137633139393963323139333734323238
62666131626135316164326631383332616136396564646637313635386234356433663661323565
33316163373165333335346337353062306339343236356231366538646266346364626630336137
61633430663963326132386130356138626564393763386630326239656263376234633731333338
39633735666638303638613664366134396631653966303236616337333639663531343431633063
32646433333439366261363233643032326639656439323133653262383963303061353061373631
66396162653632396664376237393465356362333561326630616561383536373831636239323234
32343663383836623666663465323234386462336463366237626561316539343631626436336636
39653630353037323333366163393865323462643366613162336235633566303235363037623536
36383561656331383166613261396235613363616166373966383861626361353635663361643531
38643135306365346436633036396664383165653131633538346230396233376234383235393536
63376161656336663135386534643963626239643136643462636466313132303635383864313163
37316338623763656664366465663465323233623965393438326331633831643231383564616539
38306161343034383831646633323465323464336133653962616235323462393638663531616638
65376134663732316663313630393261643965353438643336366262643738656630623366656566
33303036663230653465393239616539386164386138393061636462386461643638653630646538
33356335393064653731623966616534633437666136316236386530316632386138613238386234
61393130626135633632336266666233303062393866653636623631373763643964396162663231
35383935356264346131643232346365393336356638366536616135333834313939306534633766
62383938306235663132343162633034313035646265363735666235666535333339376361393961
61356438646633663265643665386362626633653933316131643733636264336137333361393936
34316530346366316366373633366634393937363536613832663564653762643933653361666632
35643035636465303633363336313963346134333464303133626332363939306135326266313164
34383165623138653865356532636234663638373064333263663032376431663837633133653634
61383735633030623236383432636333346335383265623233393833376665633337663561383939
34306562613033373961333662643837376463396134343235386533343530326536303937306332
38343733373963333635353662326264313139663064383639376334656338623132333461316166
32613438393431303362623432363561393130666265666663323436633231626565373165336562
33376132323333313138333437633739333430646263323230643536313538393930363763636563
37363935333533326666323263336166613963366436303339646164646634356661393539646363
36633963646362393661303332346661333665323535653564616661303336613132303864376662
64383063383538656332396132363336393063623862653834636630636530643638303665336464
37366263363230333466313839386161616334646161356563386232393063353935356563393530
32353536333262653665666630326534656536653331353736343166393239643962343565323034
36386565666366653036616665613837303665623666383138336130376561303265643365613562
39313666316661636362636461313561363964643864363164633763646237653036653536633839
65346433353837633730666434323336396533633538653937363966653763303932356366373364
65663337333639623238343033313830326434613438353535313337663138323637363061353536
31366234363065393461616334393163353539613263383230653938376362653263616161623538
39373034343263633238626536306562393539303165383033366339613766653039646533386332
32313166313039396530653132613038343439623936353365393238626536393362383562353934
66316361653531306134643234613533356163396139303638616133633034373735396433373264
37636336316237346362643431383130356435313566306533393433323939303464383365663265
37653966626632303165653738343264373236316234326439663965376631306533656539326337
35383133616637326361393634633732356131353761663261626236653534323563313835353935
34393163653931666239383066383033353561343633393735336235616137623064396661613764
65363532643165363430636263643831393363653730663136613863356630653466383566393638
32323131373831326130663531383966636662373963666666636532386533323061373366643432
34326334316166623165353066633830303130376537346137653330386233653163636564363133
32653138316535396635373830653463343435663666396437313531306530333734376235343430
38366336363236643432623136343163336434623262613132353162323438373362366362306538
38313233633933663839613934306263373265363738333566373732646634356338373936613730
37653161646565323836393432323664383665346439616266323032323361306264316266653438
64376130373531383862363933393834363532646161643861373766396363396138313265653435
34643561663666636366613764666131363339363538383866326434666562323363343237643865
32663132653862333733373532373436643263356432353933303637306562626462393165343966
39393038393064306464613865343761386663343236376232653935393537316463613262623532
34343539363830666433393630353662316331326231346630616235663834323934636538316632
37386137343163383232336461386230313266356439323263306235663431333338333035653439
32386461353034386637653238333765376162393039313166653261633135353366306131326131
37663636326131623438353934343830373538323838336438623430653635343533353064346538
62316334343836306539626330666464623332323964613365356139383738636164343865646139
33636136343263373764643139356236626331333232616132323464356464333631343136336161
63316633313038356662336632306566653634393130303833303865303865306332343235643864
62666239343463306637353633356639336538343131306264636430363334396532626438623562
35303763333432633165646435356330336632333063663935396330363862666433383861343630
34626238643634636638316435663437363736303933313835656564656338636639626537656664
63353334643035663032396464396532613337636566306232336436346135326234366530643534
62636138346466303838353136353939366663336133616161646661393131346538346565663861
63306439323062343531393766616234343433623634613061393937646163303538373932623731
38366162653331373839343538353764613138333536613937623235643831323364303938653665
64653264383731396563303135636535333366323666643364343438343364626634646530613937
65656238373038663364356365306332396162383165333866623136616131613636623033336634
33663763633838653433616461656565653632313132376166376261663239326361346635616363
64306462336632353862643566316266316237633934656236323833623134623632656233613038
34343933613564666639333635376133303366303433366339356636663735366131656435333237
30666639363935333965643734373635653036373966613963333561353663626637616538393464
32663465323837363336396434623562626661666237646537643561316561303861343336636161
30306261616137373937616339666239303061313931646662653832383964643438653634333539
37633063363061613237363235396635636233313738636361353839353064666538363834643635
35363534333762623431653234383539336461326165353937316237346262343263373237366263
32393931316133303061353036643664333163653566663062363232366434363238386435663861
32643266613435373632306537646362633234346264366334336663613535626439343530633466
35353961323634363931386333336562386135373734303236373931316535323139343137373961
62383461646662656136336431326438663166613138333639663936363234626166666330646663
34626434643933323665386135363666646163343164613565333862396263306135393262383239
61646163653032633366353632303031393633613065376235643763323164336139336633656437
39666339656266633837653335633938626635666339373364333336653265366636363730343464
62356639373538646134343261363034393061343235666136363936383861623734363132353138
66633664303165613137356339613632363735666335343839626631353437633836646661393135
61623164333238336539346432303333393934363430333065356663656631636162346135633563
36343232386530666238666230346266663239316632326466336161393062613037306165313234
63356663373734653439356439313537356465643966336138633931643662383833363562656561
62333934663639666338306662316430346363643365623662306665353866616461306532363835
65336166303861323464366339623433313766363738623935346533363332393430313561626130
32656338383362386662383037653032643936323830623763306232646536366237616263626537
63396363366537663838336438326565626166393634346262393836386234363764363165336462
35643230343339323162663130353334303166623436666161343439316238636663346331326661
31636234616635303339393035376430343537623061616261326632323636623939353039363861
63643435386235326633643631373366656330613839333437313130323962613339656434643962
64616662363630653631323362626364653965653334336130333139613232646435663863393262
33343538613564323065613837636361306432323863356634376635616463653261376438396465
31666430623938373132643135633037393234343037623738383163316134363465356564356139
64333261353732383432346134396662303333623238613262356164643630653135323664353263
32666433663366363136313638343862613333613762636330316661613537633730383135343631
32373533363462303661666163363065373030356366636464363032646165393833396333316136
66636133623463383765656662633333323262353662356564326264393232333463336333663534
36393634343662336161643532346331303834306464313630333533356431323936386236643665
61356566663130663035383163303936633235383534343962333032373964656366383831353132
63343332356463613766383834383634313236326431663861643639366134633437393533303966
37383537636139386661366466373236633564333162376535333565373933323737356632633838
39336430653166333963373064366231623762346336386430306633633762383363353131386231
39656262643530306632653461393137336562383932323233376530646230633739663663623362
37623064396661363135353131363538326338633161343138383961343761623338613635613034
64653665346237653163366535383730323135333036363061313039386132666338303730636634
63383433353532343933333561663932613364616233336562313464396339386465303930313136
31313066363863663639623835336664353732653035376664326337353632616432366565393430
34373531316135316132333731623261366333383139623835643465323234313235363962633561
39393963653463663738303662333738623333343265313565636363393033636438333237663437
35633862316363616361326138633832643965383463633565313438313233356566613665373563
32356364333336653564623463303234646532613235636363356637323833343765653033613165
33613233633630323561623031396464316534313230646164653237643237343733393032383132
39353763313166643762326234313332613561656530643036656535343065616263373038313166
37326362356530326538386530663664656137636439353363383230636132373338343866663933
62323361653261623538623233613165303465383463303838366562646232656334303661633036
33366335616261353761363736343662373330386136343033363461396433663932393730333634
32333362333335346564393963376464303165303561613531666362313165383261633834363536
38646634353038313365396466656435306465653562306336316231376537303964323633386633
32313466323262633133373932633838313231393831633664386533363032353836323763366462
65373034303665396433646638633934633466323966313036636235363634363563646437306563
39653534663963616262626663383331373062613334643639316432393638633462316532383930
32663737353337643562373665643663346163313465393136333862373663643533643663613537
36366530373539616466336330373632353039383437633166613833323737663736643266633462
66313936383836663132616432623939393165623534303765393266306332366136343135613763
38396361323338633161306463383764333466393866616530333138383436363637313164643833
65643330343939626662663235323361366238393339366231346438346530356233343231326332
31613461633536393033633361373433643364333163346535303434383933633636353761316563
37383335643531393336646166336462613331623962353562663162386132643963313537613063
66343335646433356436313663383136363163303835633132653966353533393464363630323237
63666330386363653366316565306366643332646236623530626338323639653036313765623464
33613530396633633730633964323161663632343031643036656538643030383763643537333433
62386630633037333261616262373936343062613536333733393930623934373830636431653563
65356334343765393833613636326333656332636265636161316131616263666537336131343335
63616237666335313234626562636138626134666262636237376265666563346530656237303462
61643562633837656439363861326131323435656561643733303037613937636531363238376432
39656133363464383661323461303061313963343835653132376262383162613262616464323038
63663465313266623765643665306330306564663866623165346164623635613063323932336534
35393262626534633730366439343434653630396232626135626132386466306539383664313831
63633932333839303630393633396661653764636234653939323335643133373534363534323238
33646534633061646463333239363866313065366265316161663136343534353461316638326165
65353736303032316138373030383063356230326430383430623861636461366461313964336433
37306636313637363836393665646435383238383366633432343432663132323733623665643664
32646537373137666362326433336234316235643563643063663739663838333564343039303534
62316165373834316436616137306464633230653337643835346131613366373365666664396462
37383532646435303365623831333434653434366338383664636535313233396636643438336230
34626638376464313162376338613031313861633034396335613031333430613735396565323437
66613034356233386633643030616230306639616663333837626663306335303665613066343063
30643531356435366334353934343039303234663131396662656131653332643432393162303935
65313732633335656665343436616264343230363361343034643737626464326565386463323631
32396535643937376136343063333262326230326130653238643934303065666234643930356534
38313731663966376139343864633932363463333935333761613662386437306366353835313233
37633064366433303863396363643435376136626134646664633139646261393461366638383831
65303032333035356336656466623336616535353761346530376163346666376661306330663336
61613634383732303631616461356532313436383539323536316433363733636161386637346131
62663964306438663231336536393837336238383638363763663462386630333732383536383039
65646533363461616239393431643162313534643430623833303532373263623733316465353033
61313435653030333137626365336237346137393565626366353465373839313834653530613165
34396638623739616233383037316661666235653134353432393864386462613038616139633133
37386237313239323836373133623334373964616134383938666661323462653162616331386232
31353032363136336636366436336337656365396463393066326437383939303337383230346433
31653965303838393235326130363132626237333263303966363839616235636538333138623164
65346533386232643064323764303963323933323437363938626231343737623661383565386232
37633462643763643437313038643063646239663136303365326262363762626434326662313330
64646536623837383638636563653531376333663330363465383433323162643736393139633033
64373432383631323732663336393963636635613632343838313765323564396339653465326336
65363962613630343532326236623165656162376237323961316135346164323233646239383930
37323136396432326334353037313834633635326464313037393064383539646630353937343764
31343631383530653262333665633130666366343636303366316634306530633061646262373062
65373561373263386539656666333936376132373238366133396362383934626566653039306539
30633137613433333630373133346264386431336237646633633263326432363630323939643763
66623761336237616162636437393166646366323764633861393431333638376338306137376230
30396464343039353431666265333861303064356561366539666361316536623232313636383666
35353230373662303539636564616163666536633133616462633733656166346161363937316333
36333833643636383864623634656335313835383561363036323066636637383632623066343838
66346635393331303564383465393331616563303737613333373239313766313661393933666161
37623433366130343230356461613838353966363163643861333562646465623332356536326565
61376234623432373464393266316636376135333838616163323834383630653266663239343064
34653332393462346439623131643433396662613433623732313466663533383435313334366539
32643563643063663030383138376136626561613236666330633532616330356661666334646464
64363432666364336162643033346164346234663866333438393264633037313361363733663437
36613362373936303135373562393139316461363239363238653236323335323034303537323864
38643466333230386439626566363262303038616232643432323465363833323263626266653764
61653964393262613662306235666237653831313836326437306335376132636237353932616639
62313835353931646566303165396532353734353362613065313362613231633634383763613334
66616539303930326131376565663963623633633563313737393039643036383830386433306437
66663831326465373039306562333130366164346536323065613530623033326131623733316533
39346338333465616539376138383164663837613336343766613463313966326366653531346162
65343666636534636439373966323461333161346630376362343266356430316465316630363338
34303132656461366664363733326135393337353231313265313032623132613135383534346338
34343665663931653362613038623464326235396433623863633739396664323136316663356364
65323936633966306134363131613963613065383139303734333131316139623139663433623962
39373465366535656266373031396332306237616566376362626434623066653366346465383830
35646132386337656563386336616136646538343435626239653539623138336532343935336362
65373531353535303463653663653563346636643564336438346464636137663138313030373465
63353136353466383930303930623937643533366665303034333163376337613266643462613738
66646430363030353537336661336437303635376537636336363632343766343138626633386137
31666165653831333232376439326637613732656431303834626261613565653964303132336564
35643633663338613537346465623562656639323433343862353237363063646562353731306463
35333165386231393061623934323662343466626361393336656432656633326562663138373362
63373439393832646663646564356461313266663733303463613434663738333365636365363432
31313435343663396234323966616164383439353166616466623835636161363966643566626431
34363538616263316332376436393865636462366532303363633235353435383661353931363536
39333761616338333231373330633036616166646661633235633664616562636434623632376435
34326131363962366366353132396535343338333334623335376662653939666266383033393533
64663663306463346539343834313936633034333666383565613665326264616233383666393630
34663131356138663333383963633264393366326635633165653538326163643062313730326639
39633631373964636665363363363164353635383661636265326362333936666333306664626338
34623238343062613230366362363133386332636663653131353163323938643138633365663930
38633665336464346138656532353761323464623430323036306336653863386461663865396566
62363134633139333066346665633135306164393463393832373665346465306665373439663635
63376530643965343735303938623638376438393234396365646637356634393635636365313236
30653036396534303834343866623832363532356234666631366231383637333365366664326132
35656634373131303864393634343637316539343561646465393932336435326638303031633566
39323237623664386565623133396265313038316536626636306232623039356630303638633536
35643933393237646664396438383638316335366337633538313132393834376365343963353261
32656535393037353137316466336664316666323739643233373531643036363261316437303661
66623262373636653462306362333036623363313136333537363531333532666661316631343666
35343961623731306338656564366639303264336532363965643930613637666135333834306664
62643834373361663132303432373335646230636539393639363933613830303733323363316465
37346261333531376566666466323131666639643361343466613936343036313863336564336464
30643239303563356139633733613764386536326634393137653162303939613931656539353635
31663238656133663330343663656365613466343937646265643666383062623031343734616362
61633237663166363266393862393332623965383531323833316236633866316166623138616161
38633865626531653734396665376163316439326639356261356531633962666363633836376461
63326130326633306334636533336633303666353763366434653132653239366232326663636364
35306638373033326233356464313136353766313531383464626462366664356138623166643531
33303930663637393263383065376137656662316137316530616331613766616431393231633636
35366461623366353763653734366235313832343736393165366563643636303764386466303730
63653366666562663862643531646165366461316462643765363536353362373264346666653233
34616333373034306534633161303834313937646264653433386335343534343165326632323332
34306432613730356166363132663034323534313034353438336262643265363231643834386564
31626166663765363436333933373639396637663261616365623433396132663837646130346432
31636530353361643935396435343236326566653339643434613231376464366333663737316164
33613336376438643232653934383266313165346265366166376638663062616636616533363530
66616138653933373332323036656166373132656432653762396432356638356631323534313963
39316566646330313364313163346666643131643164633664373761623631333738303735646133
30393237326639623236363364326239613531376131343634353436376331663539376364353139
65336566626634333665383133323766633630353536323961646434326165303262306335663565
66373037633438333865616262636637383262316230626338326238633433353036653939316463
63366435316237333037393937626366643831353432646263333735356632633438616162393663
39653530326463393431633431666334303734356530383262643363663164303062333562343639
39313036393637373835373130323939656265353861346162633966623937323334353262376236
3132313233623863323430656665306565633438353263373837

253
secrets/vault.yml.text Normal file
View File

@@ -0,0 +1,253 @@
openclaw_alice:
http_nodes:
NPM:
account: openclaw
password: wnHgM62DeWCz
url: http://ai.cowbay.org:8181
ftp_excenone:
host: 66.45.244.235
note: FTP (SSL/TLS available) account provided by Eric
password: B3FWN8td
service: ftp
username: excenone
gitea:
url: https://gitea.cowbay.org
account: openclaw@cowbay.org
password: openclawOPENCLAW1!
token: 6175f48f82a2708f2882b8b170f08294ae8afab5
gmail_mc_ai_claw_agents:
account: mc.ai.claw.agents@gmail.com
password: qekyha5360QEKYHA5360
provider: gmail
google_ai_studio:
api_key: AIzaSyCfr19UPwFlEJ1hSnV1uOYDsAgBDgqY6bM
note: for Gemini / Google AI Studio testing
platform: google-ai-studio
librenms:
account: alice
api_key: aeb09cd2e66c385013be8b470fe4acd4
auth: mysql
email: alice@ntu.edu.rs
note: LibreNMS API + UI account provided by Eric for ERP-DB disk usage check
password: phow1aeV4ad)au6k
url: http://192.168.100.2:8000
linear:
account: alice@ntu.edu.rs
api_token: lin_api_m061e2U96xrd0rYLHsJDwKmIRQVyKKFEJ3vVZQYy
url: https://linear.app
maton:
api_key: 3gJcxhUWqpmDd94QEi8SIjQw_j6DQTTpi8nLSbylpTou_wm_ZFfAfWC_KUAlvEMMFCea82548A8v_VAklhVwl3xvP4bp7YnO3xo
service: maton-outlook-gateway
ntu_webmail:
url: http://mx.ntu.edu.rs:8025/webmail
account:
- name: hermes@ntu.edu.rs
password: uNi0lo7Vohz_aigh
- name: alice@ntu.edu.rs
password: qekyha5360QEKYHA%#^)
outlook_alice:
account: alice_mc_claw@outlook.com
password: phow1aeV4ad)au6k
url: https://outlook.live.com
tavily:
api_key: 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
service: Tavily
vertex_ai:
platform: google-vertex-ai
token: AQ.Ab8RN6L8qyV-5udTlUeLu-iMjGTmxUOscKwGWMWyUlKS7W_O_w
multica:
url: http://192.168.17.123:3004
workspace_id: c0b7cb73-8f49-4ae6-904a-44d462213cde
pat: mul_01d7722234218c999e2b573f11ffd4cf1016a930
note: Multica self-host; PAT for API/CLI (revoke+rotate if exposed)
image_host_excen_one:
url: https://i.excen.one
account: alice
password: Atie=W2Uovahngae
purpose: public image hosting for WordPress-visible assets
api_token: MTc3NzI1MTI2MzYxNw==.Y2YzYWY0Mzc1Y2M3ZDIyMmQ0YTJmZjI0Ljg0M2FmNGE5Njk5YWU4YWY1OGIzNzQwNTBlMDI5NDI0YTRiZTJlNWUxMDEzZTQ0NWNkMzk5NTQ1NTRhNDhhY2NjODA3MDg2NTFmNThhOTE4MGU1ZGU3M2VmNzk0ZDM1Y2M5NmQ0MjEwM2VhMmU2ZGUyMjdlOGFmNzEwMzI4NDU4M2QuNGI5YThhNjlmYzhmMDFiOGRlNzNhNDg4NjMzNTQyZWQ=
wordpress_cowbay:
url: https://wp.cowbay.org
account: alice
password: dfDhT3EPiE4Nik*W0j3q7hIU
purpose: WordPress site login / publishing target
application_password: zyml YP9N goCe fqvb lYjp boPW
HQS016_MSSQL_SERVER:
type: mssql
host: 192.168.100.16
port: 1433
database: application
account: observer
password: uy7pee5Thi)soo6e
connection_string: Server=192.168.100.16,1433;Database=application;User Id=observer;Password=uy7pee5Thi)soo6e;Encrypt=False;TrustServerCertificate=True;
readonly: true
note: Read-only MSSQL observer account for application DB; key renamed from
HQS014_MSSQL_SERVER to HQS016_MSSQL_SERVER after host was corrected to 192.168.100.16
per Eric on 2026-04-27.
ssh_nodes:
ai:
account: alice
hostname: ai.cowbay.org
public_key: /home/chchang/.ssh/openclaw_alice_ed25519.pub
gitea:
hostname: gitea.cowbay.org
account: git
public_key: ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPHGz8BuT9vfZ2Z+fvuxfxHKoQdLlTdpZSYn3zFvuIj2
openclaw-alice@A0411117
private_key_path: /home/chchang/.ssh/openclaw_alice_ed25519
public_key_path: /home/chchang/.ssh/openclaw_alice_ed25519.pub.pub
gitea_for_alice:
hostname: gitea.cowbay.org
account: git
public_key: ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPHGz8BuT9vfZ2Z+fvuxfxHKoQdLlTdpZSYn3zFvuIj2
openclaw-alice@A0411117
cowbay_provider:
base_url: http://ai.cowbay.org:8317/v1
models:
- gpt-5.4
- gpt-5.3-codex
api_keys:
- sk-MFvBcto52ZiUxlz1V
- sk-HPIwhEI0dXkc0y1oM
- sk-mWOVHJhS0da5gxXbx
infra:
hqs_virtualization:
summary: HQs virtualization/storage/backup environment provided by Eric on 2026-04-27.
Contains ESXi01/02, guest OS inventory, vCenter, IBM FlashSystem 5045, Synology
RS822+, and HP ProDesk auth host.
esxi_hosts:
esxi01:
sn: J900PBC5
ip: 192.168.100.41
account: root
password: root#DSC
xcc:
ip: 192.168.100.43
account: USERID
password: Dsc@52404664
guest_os:
hqs35:
purpose:
- ERPDB
- EFDB
os: Windows Server 2022
windows:
account: administrator
password: dsc@52404664
sql:
version: SQL Server 2022
account: sa
password: dsc@52404664
backup:
sql_schedule: daily 00:00 backup all DBs to D:\SQLBACKUP
sql_retention_days: 28
synology_drive_client: installed
nas_backup_schedule: daily 01:00 backup D:\SQLBACKUP and Conductor
directory to NAS ERPBACKUP folder
nas_retention_days: 30
resident_programs:
- socket system controller
- dispatch center
hqs36:
purpose:
- ERPAP
os: Windows Server 2022
windows:
account: administrator
password: dsc@52404664
resident_programs:
- socket
hqs37:
purpose:
- EFAP
os: Windows Server 2022
windows:
account: administrator
password: dsc@52404664
resident_programs:
- socket
- electronic dispatch center
esxi02:
sn: J9014TRN
ip: 192.168.100.42
account: root
password: root#DSC
xcc:
ip: 192.168.100.44
account: USERID
password: Dsc@52404664
guest_os:
hqs38:
purpose:
- B2B AP
os: Windows Server 2022
windows:
account: administrator
password: dsc@52404664
hqs39:
purpose:
- B2B DB
os: Windows Server 2022
windows:
account: administrator
password: dsc@52404664
hqs40:
purpose:
- Veeam virtual machine backup
os: Windows Server 2022
windows:
account: administrator
password: dsc@52404664
vcenter:
ip: 192.168.100.49
account: administrator@vsphere.local
password: Dsc@52404664
notes:
- vCenter created
- cluster created
storage:
ibm_flashsystem_5045:
sn: 7811DY9
left_controller_ip: 192.168.100.45
right_controller_ip: 192.168.100.46
account: superuser
password: Digiwin@123
hardware: 1.92TB PCS SSD x2 RAID1 cache; 2.4TB x8 RAID6 main storage
volumes:
- 12TB
- 500GB
nas:
synology_rs822_plus:
ip: 192.168.100.47
hardware: Synology 4TB x4
management_account:
account: nasadmin
password: Dsc@52404664
backup_account:
account: bakaccount
password: Dsc@52404664
folders:
- ERPBACKUP
auth_host:
hp_prodesk_400_g6_desktop_mini:
ip: 192.168.100.48
purpose: authentication host
os: Windows 11 Pro built-in
account: dsc
password: dsc@52404664
installed:
- Guard Manager
ports:
- external-to-internal 6666
- external-to-internal 6667
licensing:
csp: assigned to customer original account
gitea:
base_url: https://gitea.cowbay.org
ssh_url_template: ssh://git@gitea.cowbay.org:2203/{owner}/{repo}.git
account: openclaw
email: openclaw@cowbay.org
password: openclawOPENCLAW1!
api_token: 6175f48f82a2708f2882b8b170f08294ae8afab5
private_key_path: /home/chchang/.ssh/openclaw_alice_ed25519
public_key_path: /home/chchang/.ssh/openclaw_alice_ed25519.pub.pub