<修改> 1、webserver增加在数据中心选择信号直接add,在out界面省去一个个添加;2、增加配置直接远程调试rk3568

This commit is contained in:
ypc 2026-06-26 17:47:46 +08:00
parent 19a2f2a3c0
commit 392fadcdb0
9 changed files with 1089 additions and 438 deletions

View File

@ -1,7 +1,7 @@
{
"configurations": [
{
"name": "Linux",
"name": "Linux (x86)",
"includePath": [
"${workspaceFolder}/**",
"${workspaceFolder}/src/protocol/libicp67/inc",
@ -13,6 +13,22 @@
"cStandard": "c17",
"cppStandard": "gnu++17",
"intelliSenseMode": "linux-gcc-x64"
},
{
"name": "ARM (RK3568)",
"includePath": [
"${workspaceFolder}/**",
"${workspaceFolder}/src/protocol/libicp67/inc",
"${workspaceFolder}/src/system/libiec61850m/inc",
"${workspaceFolder}/src/protocol/libmms_m/inc",
"/opt/atk-dlrk356x-toolchain/aarch64-buildroot-linux-gnu/sysroot/usr/include",
"/opt/atk-dlrk356x-toolchain/include"
],
"defines": ["RK356x"],
"compilerPath": "/opt/atk-dlrk356x-toolchain/bin/aarch64-buildroot-linux-gnu-gcc",
"cStandard": "c17",
"cppStandard": "gnu++17",
"intelliSenseMode": "linux-gcc-arm64"
}
],
"version": 4

68
.vscode/launch.json vendored
View File

@ -6,7 +6,6 @@
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/test/RTU",
// "program": "${workspaceFolder}/release/x86/exe/FTU_cfg_parse",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
@ -22,7 +21,7 @@
},
{
"description": "Set default output to hex",
"text": "set output-radix 16", // 16 10
"text": "set output-radix 16",
"ignoreFailures": true
}
]
@ -50,6 +49,71 @@
"ignoreFailures": true
}
]
},
{
"name": "ARM 编译+部署+调试 (RK3568)",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/release/arm/exe/RTU",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerPath": "/opt/atk-dlrk356x-toolchain/bin/aarch64-buildroot-linux-gnu-gdb",
"miDebuggerServerAddress": "198.120.0.100:2345",
"preLaunchTask": "deploy-to-rk",
"sourceFileMap": {
"/home/ypc/RTU/RTU": "${workspaceFolder}"
},
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
},
{
"description": "Set default output to hex",
"text": "set output-radix 16",
"ignoreFailures": true
},
{
"description": "Set sysroot for ARM libs",
"text": "set sysroot /opt/atk-dlrk356x-toolchain/aarch64-buildroot-linux-gnu/sysroot",
"ignoreFailures": true
}
]
},
{
"name": "ARM 调试 (不编译, RK3568)",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/release/arm/exe/RTU",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerPath": "/opt/atk-dlrk356x-toolchain/bin/aarch64-buildroot-linux-gnu-gdb",
"miDebuggerServerAddress": "198.120.0.100:2345",
"preLaunchTask": "start-gdbserver",
"sourceFileMap": {
"/home/ypc/RTU/RTU": "${workspaceFolder}"
},
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
},
{
"description": "Set default output to hex",
"text": "set output-radix 16",
"ignoreFailures": true
}
]
}
]
}

40
.vscode/tasks.json vendored
View File

@ -13,6 +13,46 @@
"isDefault": true
}
},
{
"label": "build-arm",
"type": "shell",
"command": "${workspaceFolder}/release/build.sh arm",
"problemMatcher": [
"$gcc"
],
"group": "build"
},
{
"label": "deploy-to-rk",
"type": "shell",
"command": "sshpass -p 'root' scp -o StrictHostKeyChecking=no ${workspaceFolder}/release/arm/exe/RTU root@198.120.0.100:/mnt/RTU/ && echo 'Deploy OK' && sshpass -p 'root' ssh -o StrictHostKeyChecking=no root@198.120.0.100 'killall gdbserver 2>/dev/null; killall RTU 2>/dev/null; sleep 1; nohup gdbserver 0.0.0.0:2345 /mnt/RTU/RTU > /tmp/rtu_output.log 2>&1 &' && echo 'gdbserver started on :2345 | RTU output → /tmp/rtu_output.log'",
"problemMatcher": [],
"dependsOn": ["build-arm"],
"group": "build",
"detail": "Build ARM binary, deploy to RK3568, start gdbserver, RTU output→/tmp/rtu_output.log"
},
{
"label": "start-gdbserver",
"type": "shell",
"command": "sshpass -p 'root' ssh -o StrictHostKeyChecking=no root@198.120.0.100 'killall gdbserver 2>/dev/null; killall RTU 2>/dev/null; sleep 1; nohup gdbserver 0.0.0.0:2345 /mnt/RTU/RTU > /tmp/rtu_output.log 2>&1 &' && echo 'gdbserver started on :2345 | RTU output → /tmp/rtu_output.log'",
"problemMatcher": [],
"group": "build"
},
{
"label": "tail-rtu-output",
"type": "shell",
"command": "sshpass -p 'root' ssh -o StrictHostKeyChecking=no root@198.120.0.100 'tail -f /tmp/rtu_output.log'",
"problemMatcher": [],
"group": "build",
"isBackground": true
},
{
"label": "stop-gdbserver",
"type": "shell",
"command": "sshpass -p 'root' ssh -o StrictHostKeyChecking=no root@198.120.0.100 'killall gdbserver 2>/dev/null' && echo 'gdbserver stopped'",
"problemMatcher": [],
"group": "build"
},
{
"type": "cppbuild",
"label": "C/C++: aarch64-linux-gnu-g++ 生成活动文件",

View File

@ -43,9 +43,12 @@ src/
| 命令 | 说明 |
|------|------|
| `./release/build.sh` | 本地 x86 编译 |
| `./release/build.sh arm` | ARM 交叉编译 |
| `./release/build.sh arm` | ARM 交叉编译 `release/arm/exe/RTU` |
| `make -C release` | 在 release 目录执行 make |
| `./test/RTU` | 运行编译产物 |
| `./test/RTU` | 运行 x86 编译产物 |
| VS Code Task `build-arm` | Ctrl+Shift+B 中选择 ARM 交叉编译 |
| VS Code Task `deploy-to-rk` | 编译+部署到 RK3568 `/mnt/RTU/` |
| VS Code F5 "ARM 编译+部署+调试" | 一键编译→部署→gdbserver→远程调试 |
## 📐 代码规范
@ -87,15 +90,39 @@ src/
| 构建配置 | [release/linux.mk](release/linux.mk) |
| 公共头文件目录 | [release/inc/](release/inc/) |
| 模块分析文档生成技能 | [mimo/skills/模块分析文档生成/SKILL.md](mimo/skills/模块分析文档生成/SKILL.md) |
| RK3568 MCP 服务 | [../rk-mcp/src/index.ts](../rk-mcp/src/index.ts) |
| VS Code 调试配置 | [.vscode/launch.json](.vscode/launch.json) / [.vscode/tasks.json](.vscode/tasks.json) |
| Gitea Git 服务记忆 | [/memories/repo/gitea-config.md](/memories/repo/gitea-config.md) |
## ⚙️ 开发环境
- **环境类型**: WSL 2 (Ubuntu 24.04),与 Windows 共享固定 IP `198.120.10.240`
- **Gitea Git 服务**: `http://127.0.0.1:3000` | 局域网 `http://192.168.1.54:3000` | 管理员 `admin`/`admin123`
- **交叉编译器**: `/opt/atk-dlrk356x-toolchain/bin/aarch64-buildroot-linux-gnu-*` (GCC 10.3.0, Buildroot 2018.02)
- **RK3568 目标机**: `root@198.120.0.100` (密码 `root`),目标路径 `/mnt/RTU/`
### RK3568 远程调试 (MCP 服务)
| 项目 | 值 |
|---|---|
| MCP 服务路径 | `/home/ypc/RTU/rk-mcp/dist/index.js` (Node.js) |
| MCP 配置 | `.vscode/mcp.json``rk-mcp` 服务 |
| 可用工具 | `rk_check` `rk_deploy` `rk_gdbserver_start` `rk_gdbserver_stop` `rk_shell` |
| SSH 包装 | `~/.ssh/rk_ssh` `~/.ssh/rk_scp` (sshpass 封装) |
**调试流程**: `./release/build.sh arm` → F5 选 "ARM 编译+部署+调试 (RK3568)" → 自动 scp → gdbserver :2345 → GDB 连接
**launch.json 提供 4 个调试配置**: 本地 x86编译/不编译、ARM 远程(编译+部署/纯调试)
## ⚠️ 注意事项
1. **交叉编译依赖**: `release/linux.mk` 引用了本地交叉工具链路径(`GCCLIB_PATH`),不同主机可能需要调整
1. **交叉编译依赖**: `release/linux.mk` 引用 `/opt/atk-dlrk356x-toolchain/bin`,需保证工具链存在
2. **Web 资源打包**: 构建流程中的 `pack_web.sh` 会打包 web 资源到可执行文件中,不可跳过
3. **代码风格严格**: 修改代码时必须遵循上述规范Tab/Allman/Yoda否则可能导致审查问题
4. **多线程安全**: 大量使用多线程9 个应用线程),修改时需注意竞态条件
5. **C 风格内存管理**: 使用 `malloc`/`free`,需注意空指针检查和释放时机
6. **第三方依赖**: mongoose、cJSON、mosquitto、tinyxml2、libiec61850 是关键依赖
7. **RK3568 使用 dropbear SSH**,不支持 OpenSSH 密钥认证;使用 `sshpass -p 'root' ssh` 连接
## 🔄 工作流程规则

View File

@ -0,0 +1,96 @@
# RTU 远程调试 RK3568 环境迁移指南
> 将当前 WSL 环境中的 RTU 远程调试体系迁移到另一台电脑。
---
## 零、哪些是必须的?
| 组件 | 必要性 | F5 调试用到? |
|------|--------|---------------|
| ARM 交叉工具链 `/opt/atk-dlrk356x-toolchain/` | 🔴 必须 | ✅ 编译 + GDB 连接 |
| `sshpass` (`apt install sshpass`) | 🔴 必须 | ✅ tasks.json 的 sshpass 命令 |
| RTU 项目代码 | 🔴 必须 | ✅ 编译源码 + launch.json 指向 |
| `.vscode/launch.json` `.vscode/tasks.json` | 🔴 必须 | ✅ preLaunchTask + GDB 配置 |
| **rk-mcp** | 🟢 非必须 | ❌ 仅 Copilot AI 诊断用F5 调试完全不走它 |
| `mcp.json` | 🟢 非必须 | ❌ 无 rk-mcp 则删掉此文件即可 |
| Node.js | 🟢 非必须 | ❌ 仅 rk-mcp 依赖它 |
| `~/.ssh/rk_ssh` `~/.ssh/rk_scp` | 🟢 非必须 | ❌ tasks.json 直接用 sshpass不依赖这两个脚本 |
**结论:你只需要 工具链 + sshpass + 代码 + .vscode/ 就能在新电脑上 F5 远程调试。**
---
## 一、最小安装步骤(共 4 步)
### 1. 安装 sshpass
```bash
sudo apt update && sudo apt install sshpass
```
### 2. 安装 ARM 交叉工具链
```bash
# 旧电脑上打包
cd /opt
tar czf atk-dlrk356x-toolchain.tar.gz atk-dlrk356x-toolchain/
# 传到新电脑后解压
sudo tar xzf atk-dlrk356x-toolchain.tar.gz -C /opt/
# 验证
/opt/atk-dlrk356x-toolchain/bin/aarch64-buildroot-linux-gnu-gcc --version
/opt/atk-dlrk356x-toolchain/bin/aarch64-buildroot-linux-gnu-gdb --version
```
### 3. 克隆 RTU 项目
```bash
mkdir -p ~/RTU && cd ~/RTU
git clone <RTU_REPO_URL> RTU
cd RTU
```
### 4. 验证
```bash
# 测试编译
./release/build.sh arm
# 测试 RK 连接
sshpass -p 'root' ssh -o StrictHostKeyChecking=no root@198.120.0.100 'echo OK'
# VS Code 中 F5 → "ARM 编译+部署+调试 (RK3568)"
# Ctrl+Shift+P → Run Task → "tail-rtu-output" 查看实时打印
```
---
## 二、可选:安装 rk-mcp让 Copilot 帮诊断 RK
```bash
# 1. 安装 Node.js
nvm install 20 && nvm use 20
# 2. 克隆 rk-mcp和 RTU 平级目录)
cd ~/RTU
git clone <rk-mcp_REPO_URL> rk-mcp
cd rk-mcp
npm install && npm run build
# 3. 确保 ~/RTU/RTU/.vscode/mcp.json 存在即可
```
---
## 三、硬编码路径速查
| 文件 | 关键路径 | 何时需改 |
|------|----------|----------|
| `launch.json` → miDebuggerPath | `/opt/atk-dlrk356x-toolchain/bin/...` | 工具链路径变化时 |
| `launch.json` → miDebuggerServerAddress | `198.120.0.100:2345` | RK IP 变化时 |
| `launch.json` → sourceFileMap | `/home/ypc/RTU/RTU` | 用户名变化时 |
| `tasks.json` → sshpass 命令 | `root@198.120.0.100` | RK IP 变化时 |
| `mcp.json` | `/home/ypc/RTU/...` | 用户名变化时(无 rk-mcp 可删) |
| `tasks.json` 其他 | `${workspaceFolder}` | ✅ 无需改动 |

View File

@ -2,6 +2,44 @@
---
## 2026-06-26: 远程调试 gdbserver 未自动启动 & RTU 打印信息查看问题
**问题**F5 选择 "ARM 编译+部署+调试 (RK3568)" 后无法断点调试。
**根因**`deploy-to-rk` 任务只做了编译+scp 传输,没有自动启动 gdbserver。VS Code GDB 尝试连接 `198.120.0.100:2345` 时端口无监听。
**修复**
1. 修改 `deploy-to-rk` 任务scp 传输后自动 `killall gdbserver` + 启动新 gdbserver
2. 修改 `start-gdbserver` 任务:统一用 `>/tmp/rtu_output.log 2>&1` 重定向 gdbserver+RTU 输出
3. 新增 `tail-rtu-output` 任务:一键 `tail -f /tmp/rtu_output.log` 实时查看 RTU printf 输出
**原理**RTU 作为 gdbserver 的子进程,继承 gdbserver 重定向后的 fd 1/2所以 printf/LOG_I/LOG_E 全部进入 `/tmp/rtu_output.log`
**涉及文件**`.vscode/tasks.json`
**注意事项**RTU 的 stdin 被 gdbserver 接管,无法在 tail 窗口输入 CLI 命令。交互式命令测试需单独 `ssh root@198.120.0.100 /mnt/RTU/RTU`
**验证**GDB 连接→continue→tail 文件成功看到所有 LOG_I/LOG_E 输出。
### 补充修复 (2026-06-26): "ARM 调试 (不编译)" preLaunchTask 卡住
**问题**F5 选 "ARM 调试 (不编译, RK3568)" 不工作,且后续引入复合任务后 "ARM 编译+部署+调试" 也失效。
**根因**:尝试用 `dependsOrder: "sequence"/"parallel"` + `isBackground: true` 复合任务作为 preLaunchTask。VS Code preLaunchTask 需要子任务明确完成信号,复合任务+后台子任务组合行为不可靠exit code 异常、卡住)。
**最终修复**
1. 删除所有复合任务 (`deploy-with-tail`, `start-gdbserver-with-tail`)
2. `deploy-to-rk` = scp + gdbserver同步preLaunchTask 可靠)
3. `start-gdbserver` = gdbserver同步preLaunchTask 可靠)
4. `tail-rtu-output` = 手动 `tail -f`(独立任务,不参与 preLaunchTask
5. `stopAtEntry` 改为 `false`RTU 直接运行不需手动按继续
**涉及文件**`.vscode/tasks.json`、`.vscode/launch.json`
**tail 使用方式**F5 启动调试后,`Ctrl+Shift+P` → Run Task → `tail-rtu-output` 查看实时打印。
---
## 2026-06-18: X-Macro 应用模块注册表 — 名称大小写匹配修复
**问题**X-Macro 生成 g_vec_app 名称时使用 `"app_" #name`(如 `app_SYS`),但配置文件 `app_config.json` 使用小写 `app_sys`,导致名称不匹配,所有线程被 "skipped (disabled by config)"。

View File

@ -969,7 +969,66 @@ static const unsigned char v3[] = {
59, 10, 32, 32, 32, 32, 99, 111, 108, 111, 114, 58, 32, 118, 97, 114, // ;. color: var
40, 45, 45, 116, 101, 120, 116, 45, 109, 117, 116, 101, 100, 41, 59, 10, // (--text-muted);.
32, 32, 32, 32, 109, 97, 114, 103, 105, 110, 45, 108, 101, 102, 116, 58, // margin-left:
32, 97, 117, 116, 111, 59, 10, 125, 10, 0 // auto;.}.
32, 97, 117, 116, 111, 59, 10, 125, 10, 10, 47, 42, 32, 61, 61, 61, // auto;.}../* ===
32, 230, 149, 176, 230, 141, 174, 228, 184, 173, 229, 191, 131, 32, 233, 128, // ............ ..
137, 230, 139, 169, 230, 183, 187, 229, 138, 160, 230, 160, 143, 32, 61, 61, // ............. ==
61, 32, 42, 47, 10, 46, 100, 99, 45, 115, 101, 108, 45, 98, 97, 114, // = */..dc-sel-bar
32, 123, 10, 32, 32, 32, 32, 98, 97, 99, 107, 103, 114, 111, 117, 110, // {. backgroun
100, 58, 32, 35, 101, 56, 102, 53, 101, 57, 59, 10, 32, 32, 32, 32, // d: #e8f5e9;.
98, 111, 114, 100, 101, 114, 58, 32, 49, 112, 120, 32, 115, 111, 108, 105, // border: 1px soli
100, 32, 35, 97, 53, 100, 54, 97, 55, 59, 10, 32, 32, 32, 32, 98, // d #a5d6a7;. b
111, 114, 100, 101, 114, 45, 114, 97, 100, 105, 117, 115, 58, 32, 118, 97, // order-radius: va
114, 40, 45, 45, 114, 97, 100, 105, 117, 115, 41, 59, 10, 32, 32, 32, // r(--radius);.
32, 112, 97, 100, 100, 105, 110, 103, 58, 32, 49, 48, 112, 120, 32, 50, // padding: 10px 2
48, 112, 120, 59, 10, 32, 32, 32, 32, 109, 97, 114, 103, 105, 110, 45, // 0px;. margin-
98, 111, 116, 116, 111, 109, 58, 32, 49, 54, 112, 120, 59, 10, 32, 32, // bottom: 16px;.
32, 32, 100, 105, 115, 112, 108, 97, 121, 58, 32, 102, 108, 101, 120, 59, // display: flex;
10, 32, 32, 32, 32, 97, 108, 105, 103, 110, 45, 105, 116, 101, 109, 115, // . align-items
58, 32, 99, 101, 110, 116, 101, 114, 59, 10, 32, 32, 32, 32, 103, 97, // : center;. ga
112, 58, 32, 52, 112, 120, 59, 10, 32, 32, 32, 32, 102, 108, 101, 120, // p: 4px;. flex
45, 119, 114, 97, 112, 58, 32, 119, 114, 97, 112, 59, 10, 32, 32, 32, // -wrap: wrap;.
32, 97, 110, 105, 109, 97, 116, 105, 111, 110, 58, 32, 100, 99, 83, 108, // animation: dcSl
105, 100, 101, 68, 111, 119, 110, 32, 48, 46, 50, 115, 32, 101, 97, 115, // ideDown 0.2s eas
101, 45, 111, 117, 116, 59, 10, 125, 10, 64, 107, 101, 121, 102, 114, 97, // e-out;.}.@keyfra
109, 101, 115, 32, 100, 99, 83, 108, 105, 100, 101, 68, 111, 119, 110, 32, // mes dcSlideDown
123, 10, 32, 32, 32, 32, 102, 114, 111, 109, 32, 123, 32, 111, 112, 97, // {. from { opa
99, 105, 116, 121, 58, 32, 48, 59, 32, 116, 114, 97, 110, 115, 102, 111, // city: 0; transfo
114, 109, 58, 32, 116, 114, 97, 110, 115, 108, 97, 116, 101, 89, 40, 45, // rm: translateY(-
54, 112, 120, 41, 59, 32, 125, 10, 32, 32, 32, 32, 116, 111, 32, 123, // 6px); }. to {
32, 111, 112, 97, 99, 105, 116, 121, 58, 32, 49, 59, 32, 116, 114, 97, // opacity: 1; tra
110, 115, 102, 111, 114, 109, 58, 32, 116, 114, 97, 110, 115, 108, 97, 116, // nsform: translat
101, 89, 40, 48, 41, 59, 32, 125, 10, 125, 10, 46, 100, 99, 45, 115, // eY(0); }.}..dc-s
101, 108, 45, 108, 97, 98, 101, 108, 32, 123, 10, 32, 32, 32, 32, 102, // el-label {. f
111, 110, 116, 45, 115, 105, 122, 101, 58, 32, 49, 52, 112, 120, 59, 10, // ont-size: 14px;.
32, 32, 32, 32, 102, 111, 110, 116, 45, 119, 101, 105, 103, 104, 116, 58, // font-weight:
32, 54, 48, 48, 59, 10, 32, 32, 32, 32, 99, 111, 108, 111, 114, 58, // 600;. color:
32, 35, 50, 101, 55, 100, 51, 50, 59, 10, 125, 10, 46, 100, 99, 45, // #2e7d32;.}..dc-
115, 101, 108, 45, 98, 97, 114, 32, 108, 97, 98, 101, 108, 32, 123, 10, // sel-bar label {.
32, 32, 32, 32, 102, 111, 110, 116, 45, 115, 105, 122, 101, 58, 32, 49, // font-size: 1
51, 112, 120, 59, 10, 32, 32, 32, 32, 99, 111, 108, 111, 114, 58, 32, // 3px;. color:
118, 97, 114, 40, 45, 45, 116, 101, 120, 116, 45, 115, 101, 99, 111, 110, // var(--text-secon
100, 97, 114, 121, 41, 59, 10, 125, 10, 46, 100, 99, 45, 115, 101, 108, // dary);.}..dc-sel
45, 98, 97, 114, 32, 115, 101, 108, 101, 99, 116, 32, 123, 10, 32, 32, // -bar select {.
32, 32, 112, 97, 100, 100, 105, 110, 103, 58, 32, 52, 112, 120, 32, 56, // padding: 4px 8
112, 120, 59, 10, 32, 32, 32, 32, 98, 111, 114, 100, 101, 114, 58, 32, // px;. border:
49, 112, 120, 32, 115, 111, 108, 105, 100, 32, 118, 97, 114, 40, 45, 45, // 1px solid var(--
98, 111, 114, 100, 101, 114, 41, 59, 10, 32, 32, 32, 32, 98, 111, 114, // border);. bor
100, 101, 114, 45, 114, 97, 100, 105, 117, 115, 58, 32, 52, 112, 120, 59, // der-radius: 4px;
10, 32, 32, 32, 32, 102, 111, 110, 116, 45, 115, 105, 122, 101, 58, 32, // . font-size:
49, 51, 112, 120, 59, 10, 32, 32, 32, 32, 98, 97, 99, 107, 103, 114, // 13px;. backgr
111, 117, 110, 100, 58, 32, 35, 102, 102, 102, 59, 10, 125, 10, 46, 100, // ound: #fff;.}..d
99, 45, 115, 101, 108, 45, 98, 97, 114, 32, 46, 98, 116, 110, 32, 123, // c-sel-bar .btn {
10, 32, 32, 32, 32, 112, 97, 100, 100, 105, 110, 103, 58, 32, 54, 112, // . padding: 6p
120, 32, 49, 54, 112, 120, 59, 10, 32, 32, 32, 32, 102, 111, 110, 116, // x 16px;. font
45, 115, 105, 122, 101, 58, 32, 49, 51, 112, 120, 59, 10, 125, 10, 35, // -size: 13px;.}.#
100, 99, 45, 99, 98, 45, 97, 108, 108, 44, 32, 46, 100, 99, 45, 99, // dc-cb-all, .dc-c
98, 45, 114, 111, 119, 32, 123, 10, 32, 32, 32, 32, 119, 105, 100, 116, // b-row {. widt
104, 58, 32, 49, 54, 112, 120, 59, 10, 32, 32, 32, 32, 104, 101, 105, // h: 16px;. hei
103, 104, 116, 58, 32, 49, 54, 112, 120, 59, 10, 32, 32, 32, 32, 99, // ght: 16px;. c
117, 114, 115, 111, 114, 58, 32, 112, 111, 105, 110, 116, 101, 114, 59, 10, // ursor: pointer;.
32, 32, 32, 32, 97, 99, 99, 101, 110, 116, 45, 99, 111, 108, 111, 114, // accent-color
58, 32, 118, 97, 114, 40, 45, 45, 112, 114, 105, 109, 97, 114, 121, 41, // : var(--primary)
59, 10, 125, 10, 0 // ;.}.
};
static const unsigned char v4[] = {
60, 33, 68, 79, 67, 84, 89, 80, 69, 32, 104, 116, 109, 108, 62, 10, // <!DOCTYPE html>.
@ -4265,318 +4324,471 @@ static const unsigned char v7[] = {
61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 32, 42, // ============== *
47, 10, 118, 97, 114, 32, 68, 97, 116, 97, 99, 101, 110, 116, 101, 114, // /.var Datacenter
80, 97, 103, 101, 32, 61, 32, 40, 102, 117, 110, 99, 116, 105, 111, 110, // Page = (function
40, 41, 32, 123, 10, 32, 32, 32, 32, 118, 97, 114, 32, 97, 108, 108, // () {. var all
68, 97, 116, 97, 32, 61, 32, 123, 125, 59, 10, 32, 32, 32, 32, 118, // Data = {};. v
97, 114, 32, 97, 99, 116, 105, 118, 101, 84, 97, 98, 32, 61, 32, 39, // ar activeTab = '
111, 117, 116, 39, 59, 10, 32, 32, 32, 32, 118, 97, 114, 32, 115, 101, // out';. var se
97, 114, 99, 104, 84, 101, 120, 116, 32, 61, 32, 39, 39, 59, 10, 10, // archText = '';..
32, 32, 32, 32, 118, 97, 114, 32, 67, 79, 76, 85, 77, 78, 83, 32, // var COLUMNS
61, 32, 91, 39, 105, 100, 39, 44, 32, 39, 115, 97, 100, 100, 114, 39, // = ['id', 'saddr'
44, 32, 39, 100, 101, 115, 99, 39, 44, 32, 39, 230, 149, 176, 230, 141, // , 'desc', '.....
174, 231, 177, 187, 229, 158, 139, 39, 44, 32, 39, 99, 116, 114, 108, 95, // .......', 'ctrl_
116, 121, 112, 101, 39, 44, 32, 39, 108, 105, 110, 107, 95, 115, 97, 100, // type', 'link_sad
100, 114, 115, 39, 93, 59, 10, 10, 32, 32, 32, 32, 102, 117, 110, 99, // drs'];.. func
116, 105, 111, 110, 32, 114, 101, 110, 100, 101, 114, 84, 97, 98, 108, 101, // tion renderTable
40, 41, 32, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 118, 97, 114, // () {. var
32, 100, 97, 116, 97, 32, 61, 32, 97, 108, 108, 68, 97, 116, 97, 91, // data = allData[
97, 99, 116, 105, 118, 101, 84, 97, 98, 93, 32, 124, 124, 32, 91, 93, // activeTab] || []
59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 118, 97, 114, 32, 116, 98, // ;. var tb
111, 100, 121, 32, 61, 32, 100, 111, 99, 117, 109, 101, 110, 116, 46, 103, // ody = document.g
101, 116, 69, 108, 101, 109, 101, 110, 116, 66, 121, 73, 100, 40, 39, 100, // etElementById('d
99, 45, 116, 98, 111, 100, 121, 39, 41, 59, 10, 32, 32, 32, 32, 32, // c-tbody');.
32, 32, 32, 105, 102, 32, 40, 33, 116, 98, 111, 100, 121, 41, 32, 114, // if (!tbody) r
101, 116, 117, 114, 110, 59, 10, 10, 32, 32, 32, 32, 32, 32, 32, 32, // eturn;..
105, 102, 32, 40, 100, 97, 116, 97, 46, 108, 101, 110, 103, 116, 104, 32, // if (data.length
61, 61, 61, 32, 48, 41, 32, 123, 10, 32, 32, 32, 32, 32, 32, 32, // === 0) {.
32, 32, 32, 32, 32, 116, 98, 111, 100, 121, 46, 105, 110, 110, 101, 114, // tbody.inner
72, 84, 77, 76, 32, 61, 32, 39, 60, 116, 114, 32, 99, 108, 97, 115, // HTML = '<tr clas
115, 61, 34, 101, 109, 112, 116, 121, 45, 114, 111, 119, 34, 62, 60, 116, // s="empty-row"><t
100, 32, 99, 111, 108, 115, 112, 97, 110, 61, 34, 54, 34, 62, 230, 154, // d colspan="6">..
130, 230, 151, 160, 230, 149, 176, 230, 141, 174, 60, 47, 116, 100, 62, 60, // ..........</td><
47, 116, 114, 62, 39, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, // /tr>';.
32, 32, 32, 100, 111, 99, 117, 109, 101, 110, 116, 46, 103, 101, 116, 69, // document.getE
108, 101, 109, 101, 110, 116, 66, 121, 73, 100, 40, 39, 100, 99, 45, 99, // lementById('dc-c
111, 117, 110, 116, 39, 41, 46, 116, 101, 120, 116, 67, 111, 110, 116, 101, // ount').textConte
110, 116, 32, 61, 32, 39, 48, 39, 59, 10, 32, 32, 32, 32, 32, 32, // nt = '0';.
32, 32, 32, 32, 32, 32, 114, 101, 116, 117, 114, 110, 59, 10, 32, 32, // return;.
32, 32, 32, 32, 32, 32, 125, 10, 10, 32, 32, 32, 32, 32, 32, 32, // }..
32, 118, 97, 114, 32, 114, 111, 119, 115, 32, 61, 32, 100, 97, 116, 97, // var rows = data
59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 105, 102, 32, 40, 115, 101, // ;. if (se
97, 114, 99, 104, 84, 101, 120, 116, 41, 32, 123, 10, 32, 32, 32, 32, // archText) {.
32, 32, 32, 32, 32, 32, 32, 32, 118, 97, 114, 32, 115, 116, 32, 61, // var st =
32, 115, 101, 97, 114, 99, 104, 84, 101, 120, 116, 46, 116, 111, 76, 111, // searchText.toLo
119, 101, 114, 67, 97, 115, 101, 40, 41, 59, 10, 32, 32, 32, 32, 32, // werCase();.
32, 32, 32, 32, 32, 32, 32, 114, 111, 119, 115, 32, 61, 32, 100, 97, // rows = da
116, 97, 46, 102, 105, 108, 116, 101, 114, 40, 102, 117, 110, 99, 116, 105, // ta.filter(functi
111, 110, 40, 105, 116, 101, 109, 41, 32, 123, 10, 32, 32, 32, 32, 32, // on(item) {.
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 114, 101, 116, 117, 114, // retur
110, 32, 40, 105, 116, 101, 109, 46, 115, 97, 100, 100, 114, 32, 38, 38, // n (item.saddr &&
32, 105, 116, 101, 109, 46, 115, 97, 100, 100, 114, 46, 116, 111, 76, 111, // item.saddr.toLo
119, 101, 114, 67, 97, 115, 101, 40, 41, 46, 105, 110, 100, 101, 120, 79, // werCase().indexO
102, 40, 115, 116, 41, 32, 33, 61, 61, 32, 45, 49, 41, 10, 32, 32, // f(st) !== -1).
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, //
32, 32, 124, 124, 32, 40, 105, 116, 101, 109, 46, 100, 101, 115, 99, 32, // || (item.desc
38, 38, 32, 105, 116, 101, 109, 46, 100, 101, 115, 99, 46, 116, 111, 76, // && item.desc.toL
111, 119, 101, 114, 67, 97, 115, 101, 40, 41, 46, 105, 110, 100, 101, 120, // owerCase().index
79, 102, 40, 115, 116, 41, 32, 33, 61, 61, 32, 45, 49, 41, 59, 10, // Of(st) !== -1);.
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 125, 41, 59, 10, // });.
32, 32, 32, 32, 32, 32, 32, 32, 125, 10, 32, 32, 32, 32, 32, 32, // }.
32, 32, 100, 111, 99, 117, 109, 101, 110, 116, 46, 103, 101, 116, 69, 108, // document.getEl
101, 109, 101, 110, 116, 66, 121, 73, 100, 40, 39, 100, 99, 45, 99, 111, // ementById('dc-co
117, 110, 116, 39, 41, 46, 116, 101, 120, 116, 67, 111, 110, 116, 101, 110, // unt').textConten
116, 32, 61, 32, 114, 111, 119, 115, 46, 108, 101, 110, 103, 116, 104, 32, // t = rows.length
43, 32, 39, 32, 47, 32, 39, 32, 43, 32, 100, 97, 116, 97, 46, 108, // + ' / ' + data.l
101, 110, 103, 116, 104, 59, 10, 10, 32, 32, 32, 32, 32, 32, 32, 32, // ength;..
105, 102, 32, 40, 114, 111, 119, 115, 46, 108, 101, 110, 103, 116, 104, 32, // if (rows.length
61, 61, 61, 32, 48, 41, 32, 123, 10, 32, 32, 32, 32, 32, 32, 32, // === 0) {.
32, 32, 32, 32, 32, 116, 98, 111, 100, 121, 46, 105, 110, 110, 101, 114, // tbody.inner
72, 84, 77, 76, 32, 61, 32, 39, 60, 116, 114, 32, 99, 108, 97, 115, // HTML = '<tr clas
115, 61, 34, 101, 109, 112, 116, 121, 45, 114, 111, 119, 34, 62, 60, 116, // s="empty-row"><t
100, 32, 99, 111, 108, 115, 112, 97, 110, 61, 34, 54, 34, 62, 230, 151, // d colspan="6">..
160, 229, 140, 185, 233, 133, 141, 231, 187, 147, 230, 158, 156, 60, 47, 116, // .............</t
100, 62, 60, 47, 116, 114, 62, 39, 59, 10, 32, 32, 32, 32, 32, 32, // d></tr>';.
32, 32, 32, 32, 32, 32, 114, 101, 116, 117, 114, 110, 59, 10, 32, 32, // return;.
32, 32, 32, 32, 32, 32, 125, 10, 10, 32, 32, 32, 32, 32, 32, 32, // }..
32, 118, 97, 114, 32, 104, 116, 109, 108, 32, 61, 32, 39, 39, 59, 10, // var html = '';.
32, 32, 32, 32, 32, 32, 32, 32, 102, 111, 114, 32, 40, 118, 97, 114, // for (var
32, 105, 32, 61, 32, 48, 59, 32, 105, 32, 60, 32, 114, 111, 119, 115, // i = 0; i < rows
46, 108, 101, 110, 103, 116, 104, 59, 32, 105, 43, 43, 41, 32, 123, 10, // .length; i++) {.
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 118, 97, 114, 32, // var
105, 116, 101, 109, 32, 61, 32, 114, 111, 119, 115, 91, 105, 93, 59, 10, // item = rows[i];.
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 104, 116, 109, 108, // html
32, 43, 61, 32, 39, 60, 116, 114, 62, 39, 10, 32, 32, 32, 32, 32, // += '<tr>'.
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 43, 32, 39, 60, 116, // + '<t
100, 62, 39, 32, 43, 32, 102, 109, 116, 86, 97, 108, 40, 105, 116, 101, // d>' + fmtVal(ite
109, 46, 105, 100, 41, 32, 43, 32, 39, 60, 47, 116, 100, 62, 39, 10, // m.id) + '</td>'.
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, //
43, 32, 39, 60, 116, 100, 62, 39, 32, 43, 32, 102, 109, 116, 86, 97, // + '<td>' + fmtVa
108, 40, 105, 116, 101, 109, 46, 115, 97, 100, 100, 114, 41, 32, 43, 32, // l(item.saddr) +
39, 60, 47, 116, 100, 62, 39, 10, 32, 32, 32, 32, 32, 32, 32, 32, // '</td>'.
32, 32, 32, 32, 32, 32, 32, 32, 43, 32, 39, 60, 116, 100, 62, 39, // + '<td>'
32, 43, 32, 102, 109, 116, 86, 97, 108, 40, 105, 116, 101, 109, 46, 100, // + fmtVal(item.d
101, 115, 99, 41, 32, 43, 32, 39, 60, 47, 116, 100, 62, 39, 10, 32, // esc) + '</td>'.
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 43, // +
32, 39, 60, 116, 100, 62, 39, 32, 43, 32, 102, 109, 116, 86, 97, 108, // '<td>' + fmtVal
40, 105, 116, 101, 109, 46, 116, 121, 112, 101, 41, 32, 43, 32, 39, 60, // (item.type) + '<
47, 116, 100, 62, 39, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // /td>'.
32, 32, 32, 32, 32, 32, 43, 32, 39, 60, 116, 100, 62, 39, 32, 43, // + '<td>' +
32, 102, 109, 116, 86, 97, 108, 40, 67, 84, 82, 76, 95, 84, 89, 80, // fmtVal(CTRL_TYP
69, 95, 77, 65, 80, 91, 105, 116, 101, 109, 46, 99, 116, 114, 108, 95, // E_MAP[item.ctrl_
116, 121, 112, 101, 93, 32, 124, 124, 32, 105, 116, 101, 109, 46, 99, 116, // type] || item.ct
114, 108, 95, 116, 121, 112, 101, 41, 32, 43, 32, 39, 60, 47, 116, 100, // rl_type) + '</td
62, 39, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // >'.
32, 32, 32, 43, 32, 39, 60, 116, 100, 32, 115, 116, 121, 108, 101, 61, // + '<td style=
34, 109, 97, 120, 45, 119, 105, 100, 116, 104, 58, 50, 48, 48, 112, 120, // "max-width:200px
59, 111, 118, 101, 114, 102, 108, 111, 119, 58, 104, 105, 100, 100, 101, 110, // ;overflow:hidden
59, 116, 101, 120, 116, 45, 111, 118, 101, 114, 102, 108, 111, 119, 58, 101, // ;text-overflow:e
108, 108, 105, 112, 115, 105, 115, 59, 119, 104, 105, 116, 101, 45, 115, 112, // llipsis;white-sp
97, 99, 101, 58, 110, 111, 119, 114, 97, 112, 34, 32, 116, 105, 116, 108, // ace:nowrap" titl
101, 61, 34, 39, 32, 43, 32, 102, 109, 116, 86, 97, 108, 40, 105, 116, // e="' + fmtVal(it
101, 109, 46, 108, 105, 110, 107, 95, 115, 97, 100, 100, 114, 115, 41, 32, // em.link_saddrs)
43, 32, 39, 34, 62, 39, 32, 43, 32, 102, 109, 116, 86, 97, 108, 40, // + '">' + fmtVal(
105, 116, 101, 109, 46, 108, 105, 110, 107, 95, 115, 97, 100, 100, 114, 115, // item.link_saddrs
41, 32, 43, 32, 39, 60, 47, 116, 100, 62, 39, 10, 32, 32, 32, 32, // ) + '</td>'.
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 43, 32, 39, 60, // + '<
47, 116, 114, 62, 39, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 125, // /tr>';. }
10, 32, 32, 32, 32, 32, 32, 32, 32, 116, 98, 111, 100, 121, 46, 105, // . tbody.i
110, 110, 101, 114, 72, 84, 77, 76, 32, 61, 32, 104, 116, 109, 108, 59, // nnerHTML = html;
10, 32, 32, 32, 32, 125, 10, 10, 32, 32, 32, 32, 102, 117, 110, 99, // . }.. func
40, 41, 32, 123, 10, 9, 118, 97, 114, 32, 97, 108, 108, 68, 97, 116, // () {..var allDat
97, 32, 61, 32, 123, 125, 59, 10, 9, 118, 97, 114, 32, 97, 99, 116, // a = {};..var act
105, 118, 101, 84, 97, 98, 32, 61, 32, 39, 111, 117, 116, 39, 59, 10, // iveTab = 'out';.
9, 118, 97, 114, 32, 115, 101, 97, 114, 99, 104, 84, 101, 120, 116, 32, // .var searchText
61, 32, 39, 39, 59, 10, 9, 118, 97, 114, 32, 115, 101, 108, 101, 99, // = '';..var selec
116, 101, 100, 83, 101, 116, 32, 61, 32, 123, 125, 59, 32, 32, 32, 32, // tedSet = {};
32, 32, 32, 32, 47, 47, 32, 123, 115, 97, 100, 100, 114, 58, 32, 116, // // {saddr: t
114, 117, 101, 125, 10, 10, 9, 118, 97, 114, 32, 67, 79, 76, 85, 77, // rue}...var COLUM
78, 83, 32, 61, 32, 91, 39, 39, 44, 32, 39, 105, 100, 39, 44, 32, // NS = ['', 'id',
39, 115, 97, 100, 100, 114, 39, 44, 32, 39, 100, 101, 115, 99, 39, 44, // 'saddr', 'desc',
32, 39, 230, 149, 176, 230, 141, 174, 231, 177, 187, 229, 158, 139, 39, 44, // '............',
32, 39, 99, 116, 114, 108, 95, 116, 121, 112, 101, 39, 44, 32, 39, 108, // 'ctrl_type', 'l
105, 110, 107, 95, 115, 97, 100, 100, 114, 115, 39, 93, 59, 10, 10, 9, // ink_saddrs'];...
102, 117, 110, 99, 116, 105, 111, 110, 32, 103, 101, 116, 86, 105, 115, 105, // function getVisi
98, 108, 101, 68, 97, 116, 97, 40, 41, 32, 123, 10, 9, 9, 118, 97, // bleData() {...va
114, 32, 100, 97, 116, 97, 32, 61, 32, 97, 108, 108, 68, 97, 116, 97, // r data = allData
91, 97, 99, 116, 105, 118, 101, 84, 97, 98, 93, 32, 124, 124, 32, 91, // [activeTab] || [
93, 59, 10, 9, 9, 105, 102, 32, 40, 33, 115, 101, 97, 114, 99, 104, // ];...if (!search
84, 101, 120, 116, 41, 32, 114, 101, 116, 117, 114, 110, 32, 100, 97, 116, // Text) return dat
97, 59, 10, 9, 9, 118, 97, 114, 32, 115, 116, 32, 61, 32, 115, 101, // a;...var st = se
97, 114, 99, 104, 84, 101, 120, 116, 46, 116, 111, 76, 111, 119, 101, 114, // archText.toLower
67, 97, 115, 101, 40, 41, 59, 10, 9, 9, 114, 101, 116, 117, 114, 110, // Case();...return
32, 100, 97, 116, 97, 46, 102, 105, 108, 116, 101, 114, 40, 102, 117, 110, // data.filter(fun
99, 116, 105, 111, 110, 40, 105, 116, 101, 109, 41, 32, 123, 10, 9, 9, // ction(item) {...
9, 114, 101, 116, 117, 114, 110, 32, 40, 105, 116, 101, 109, 46, 115, 97, // .return (item.sa
100, 100, 114, 32, 38, 38, 32, 105, 116, 101, 109, 46, 115, 97, 100, 100, // ddr && item.sadd
114, 46, 116, 111, 76, 111, 119, 101, 114, 67, 97, 115, 101, 40, 41, 46, // r.toLowerCase().
105, 110, 100, 101, 120, 79, 102, 40, 115, 116, 41, 32, 33, 61, 61, 32, // indexOf(st) !==
45, 49, 41, 10, 9, 9, 9, 9, 124, 124, 32, 40, 105, 116, 101, 109, // -1).....|| (item
46, 100, 101, 115, 99, 32, 38, 38, 32, 105, 116, 101, 109, 46, 100, 101, // .desc && item.de
115, 99, 46, 116, 111, 76, 111, 119, 101, 114, 67, 97, 115, 101, 40, 41, // sc.toLowerCase()
46, 105, 110, 100, 101, 120, 79, 102, 40, 115, 116, 41, 32, 33, 61, 61, // .indexOf(st) !==
32, 45, 49, 41, 59, 10, 9, 9, 125, 41, 59, 10, 9, 125, 10, 10, // -1);...});..}..
9, 102, 117, 110, 99, 116, 105, 111, 110, 32, 111, 110, 83, 101, 108, 101, // .function onSele
99, 116, 65, 108, 108, 40, 41, 32, 123, 10, 9, 9, 118, 97, 114, 32, // ctAll() {...var
118, 105, 115, 105, 98, 108, 101, 32, 61, 32, 103, 101, 116, 86, 105, 115, // visible = getVis
105, 98, 108, 101, 68, 97, 116, 97, 40, 41, 59, 10, 9, 9, 118, 97, // ibleData();...va
114, 32, 99, 98, 32, 61, 32, 100, 111, 99, 117, 109, 101, 110, 116, 46, // r cb = document.
103, 101, 116, 69, 108, 101, 109, 101, 110, 116, 66, 121, 73, 100, 40, 39, // getElementById('
100, 99, 45, 99, 98, 45, 97, 108, 108, 39, 41, 59, 10, 9, 9, 105, // dc-cb-all');...i
102, 32, 40, 99, 98, 32, 38, 38, 32, 99, 98, 46, 99, 104, 101, 99, // f (cb && cb.chec
107, 101, 100, 32, 38, 38, 32, 118, 105, 115, 105, 98, 108, 101, 46, 108, // ked && visible.l
101, 110, 103, 116, 104, 32, 62, 32, 48, 41, 32, 123, 10, 9, 9, 9, // ength > 0) {....
102, 111, 114, 32, 40, 118, 97, 114, 32, 105, 32, 61, 32, 48, 59, 32, // for (var i = 0;
105, 32, 60, 32, 118, 105, 115, 105, 98, 108, 101, 46, 108, 101, 110, 103, // i < visible.leng
116, 104, 59, 32, 105, 43, 43, 41, 32, 123, 10, 9, 9, 9, 9, 115, // th; i++) {.....s
101, 108, 101, 99, 116, 101, 100, 83, 101, 116, 91, 118, 105, 115, 105, 98, // electedSet[visib
108, 101, 91, 105, 93, 46, 115, 97, 100, 100, 114, 93, 32, 61, 32, 116, // le[i].saddr] = t
114, 117, 101, 59, 10, 9, 9, 9, 125, 10, 9, 9, 125, 32, 101, 108, // rue;....}...} el
115, 101, 32, 123, 10, 9, 9, 9, 102, 111, 114, 32, 40, 118, 97, 114, // se {....for (var
32, 105, 32, 61, 32, 48, 59, 32, 105, 32, 60, 32, 118, 105, 115, 105, // i = 0; i < visi
98, 108, 101, 46, 108, 101, 110, 103, 116, 104, 59, 32, 105, 43, 43, 41, // ble.length; i++)
32, 123, 10, 9, 9, 9, 9, 100, 101, 108, 101, 116, 101, 32, 115, 101, // {.....delete se
108, 101, 99, 116, 101, 100, 83, 101, 116, 91, 118, 105, 115, 105, 98, 108, // lectedSet[visibl
101, 91, 105, 93, 46, 115, 97, 100, 100, 114, 93, 59, 10, 9, 9, 9, // e[i].saddr];....
125, 10, 9, 9, 125, 10, 9, 9, 114, 101, 110, 100, 101, 114, 84, 97, // }...}...renderTa
98, 108, 101, 40, 41, 59, 10, 9, 9, 117, 112, 100, 97, 116, 101, 83, // ble();...updateS
101, 108, 101, 99, 116, 105, 111, 110, 66, 97, 114, 40, 41, 59, 10, 9, // electionBar();..
125, 10, 10, 9, 102, 117, 110, 99, 116, 105, 111, 110, 32, 111, 110, 84, // }...function onT
111, 103, 103, 108, 101, 82, 111, 119, 40, 115, 97, 100, 100, 114, 41, 32, // oggleRow(saddr)
123, 10, 9, 9, 105, 102, 32, 40, 115, 101, 108, 101, 99, 116, 101, 100, // {...if (selected
83, 101, 116, 91, 115, 97, 100, 100, 114, 93, 41, 32, 123, 10, 9, 9, // Set[saddr]) {...
9, 100, 101, 108, 101, 116, 101, 32, 115, 101, 108, 101, 99, 116, 101, 100, // .delete selected
83, 101, 116, 91, 115, 97, 100, 100, 114, 93, 59, 10, 9, 9, 125, 32, // Set[saddr];...}
101, 108, 115, 101, 32, 123, 10, 9, 9, 9, 115, 101, 108, 101, 99, 116, // else {....select
101, 100, 83, 101, 116, 91, 115, 97, 100, 100, 114, 93, 32, 61, 32, 116, // edSet[saddr] = t
114, 117, 101, 59, 10, 9, 9, 125, 10, 9, 9, 114, 101, 110, 100, 101, // rue;...}...rende
114, 84, 97, 98, 108, 101, 40, 41, 59, 10, 9, 9, 117, 112, 100, 97, // rTable();...upda
116, 101, 83, 101, 108, 101, 99, 116, 105, 111, 110, 66, 97, 114, 40, 41, // teSelectionBar()
59, 10, 9, 125, 10, 10, 9, 102, 117, 110, 99, 116, 105, 111, 110, 32, // ;..}...function
103, 101, 116, 83, 101, 108, 101, 99, 116, 101, 100, 67, 111, 117, 110, 116, // getSelectedCount
40, 41, 32, 123, 10, 9, 9, 118, 97, 114, 32, 99, 111, 117, 110, 116, // () {...var count
32, 61, 32, 48, 59, 10, 9, 9, 102, 111, 114, 32, 40, 118, 97, 114, // = 0;...for (var
32, 107, 32, 105, 110, 32, 115, 101, 108, 101, 99, 116, 101, 100, 83, 101, // k in selectedSe
116, 41, 32, 123, 10, 9, 9, 9, 105, 102, 32, 40, 115, 101, 108, 101, // t) {....if (sele
99, 116, 101, 100, 83, 101, 116, 46, 104, 97, 115, 79, 119, 110, 80, 114, // ctedSet.hasOwnPr
111, 112, 101, 114, 116, 121, 40, 107, 41, 41, 32, 99, 111, 117, 110, 116, // operty(k)) count
43, 43, 59, 10, 9, 9, 125, 10, 9, 9, 114, 101, 116, 117, 114, 110, // ++;...}...return
32, 99, 111, 117, 110, 116, 59, 10, 9, 125, 10, 10, 9, 102, 117, 110, // count;..}...fun
99, 116, 105, 111, 110, 32, 103, 101, 116, 83, 101, 108, 101, 99, 116, 101, // ction getSelecte
100, 73, 116, 101, 109, 115, 40, 41, 32, 123, 10, 9, 9, 118, 97, 114, // dItems() {...var
32, 114, 101, 115, 117, 108, 116, 32, 61, 32, 91, 93, 59, 10, 9, 9, // result = [];...
118, 97, 114, 32, 102, 117, 108, 108, 68, 97, 116, 97, 32, 61, 32, 97, // var fullData = a
108, 108, 68, 97, 116, 97, 91, 97, 99, 116, 105, 118, 101, 84, 97, 98, // llData[activeTab
93, 32, 124, 124, 32, 91, 93, 59, 10, 9, 9, 102, 111, 114, 32, 40, // ] || [];...for (
118, 97, 114, 32, 105, 32, 61, 32, 48, 59, 32, 105, 32, 60, 32, 102, // var i = 0; i < f
117, 108, 108, 68, 97, 116, 97, 46, 108, 101, 110, 103, 116, 104, 59, 32, // ullData.length;
105, 43, 43, 41, 32, 123, 10, 9, 9, 9, 105, 102, 32, 40, 115, 101, // i++) {....if (se
108, 101, 99, 116, 101, 100, 83, 101, 116, 91, 102, 117, 108, 108, 68, 97, // lectedSet[fullDa
116, 97, 91, 105, 93, 46, 115, 97, 100, 100, 114, 93, 41, 32, 123, 10, // ta[i].saddr]) {.
9, 9, 9, 9, 114, 101, 115, 117, 108, 116, 46, 112, 117, 115, 104, 40, // ....result.push(
102, 117, 108, 108, 68, 97, 116, 97, 91, 105, 93, 41, 59, 10, 9, 9, // fullData[i]);...
9, 125, 10, 9, 9, 125, 10, 9, 9, 114, 101, 116, 117, 114, 110, 32, // .}...}...return
114, 101, 115, 117, 108, 116, 59, 10, 9, 125, 10, 10, 9, 102, 117, 110, // result;..}...fun
99, 116, 105, 111, 110, 32, 117, 112, 100, 97, 116, 101, 83, 101, 108, 101, // ction updateSele
99, 116, 105, 111, 110, 66, 97, 114, 40, 41, 32, 123, 10, 9, 9, 118, // ctionBar() {...v
97, 114, 32, 98, 97, 114, 32, 61, 32, 100, 111, 99, 117, 109, 101, 110, // ar bar = documen
116, 46, 103, 101, 116, 69, 108, 101, 109, 101, 110, 116, 66, 121, 73, 100, // t.getElementById
40, 39, 100, 99, 45, 115, 101, 108, 45, 98, 97, 114, 39, 41, 59, 10, // ('dc-sel-bar');.
9, 9, 105, 102, 32, 40, 33, 98, 97, 114, 41, 32, 114, 101, 116, 117, // ..if (!bar) retu
114, 110, 59, 10, 9, 9, 118, 97, 114, 32, 99, 111, 117, 110, 116, 32, // rn;...var count
61, 32, 103, 101, 116, 83, 101, 108, 101, 99, 116, 101, 100, 67, 111, 117, // = getSelectedCou
110, 116, 40, 41, 59, 10, 9, 9, 105, 102, 32, 40, 99, 111, 117, 110, // nt();...if (coun
116, 32, 61, 61, 61, 32, 48, 41, 32, 123, 10, 9, 9, 9, 98, 97, // t === 0) {....ba
114, 46, 115, 116, 121, 108, 101, 46, 100, 105, 115, 112, 108, 97, 121, 32, // r.style.display
61, 32, 39, 110, 111, 110, 101, 39, 59, 10, 9, 9, 125, 32, 101, 108, // = 'none';...} el
115, 101, 32, 123, 10, 9, 9, 9, 98, 97, 114, 46, 115, 116, 121, 108, // se {....bar.styl
101, 46, 100, 105, 115, 112, 108, 97, 121, 32, 61, 32, 39, 102, 108, 101, // e.display = 'fle
120, 39, 59, 10, 9, 9, 9, 98, 97, 114, 46, 113, 117, 101, 114, 121, // x';....bar.query
83, 101, 108, 101, 99, 116, 111, 114, 40, 39, 46, 100, 99, 45, 115, 101, // Selector('.dc-se
108, 45, 108, 97, 98, 101, 108, 39, 41, 46, 116, 101, 120, 116, 67, 111, // l-label').textCo
110, 116, 101, 110, 116, 32, 61, 32, 39, 229, 183, 178, 233, 128, 137, 32, // ntent = '......
39, 32, 43, 32, 99, 111, 117, 110, 116, 32, 43, 32, 39, 32, 228, 184, // ' + count + ' ..
170, 228, 191, 161, 229, 143, 183, 39, 59, 10, 9, 9, 125, 10, 9, 125, // .......';...}..}
10, 10, 9, 102, 117, 110, 99, 116, 105, 111, 110, 32, 100, 111, 65, 100, // ...function doAd
100, 83, 101, 108, 101, 99, 116, 101, 100, 40, 41, 32, 123, 10, 9, 9, // dSelected() {...
118, 97, 114, 32, 105, 116, 101, 109, 115, 32, 61, 32, 103, 101, 116, 83, // var items = getS
101, 108, 101, 99, 116, 101, 100, 73, 116, 101, 109, 115, 40, 41, 59, 10, // electedItems();.
9, 9, 105, 102, 32, 40, 105, 116, 101, 109, 115, 46, 108, 101, 110, 103, // ..if (items.leng
116, 104, 32, 61, 61, 61, 32, 48, 41, 32, 123, 10, 9, 9, 9, 97, // th === 0) {....a
108, 101, 114, 116, 40, 39, 232, 175, 183, 229, 133, 136, 229, 139, 190, 233, // lert('..........
128, 137, 232, 166, 129, 230, 183, 187, 229, 138, 160, 231, 154, 132, 228, 191, // ................
161, 229, 143, 183, 39, 41, 59, 10, 9, 9, 9, 114, 101, 116, 117, 114, // ....');....retur
110, 59, 10, 9, 9, 125, 10, 10, 9, 9, 118, 97, 114, 32, 116, 121, // n;...}....var ty
112, 101, 76, 97, 98, 101, 108, 115, 32, 61, 32, 123, 32, 111, 117, 116, // peLabels = { out
58, 39, 230, 179, 168, 229, 134, 140, 39, 44, 32, 105, 110, 58, 39, 233, // :'......', in:'.
147, 190, 230, 142, 165, 230, 179, 168, 229, 134, 140, 39, 44, 32, 121, 107, // ...........', yk
58, 39, 233, 129, 165, 230, 142, 167, 39, 44, 32, 97, 111, 58, 39, 229, // :'......', ao:'.
143, 130, 230, 149, 176, 39, 44, 32, 112, 97, 114, 97, 109, 58, 39, 229, // .....', param:'.
174, 154, 229, 128, 188, 39, 32, 125, 59, 10, 9, 9, 118, 97, 114, 32, // .....' };...var
108, 97, 98, 101, 108, 32, 61, 32, 116, 121, 112, 101, 76, 97, 98, 101, // label = typeLabe
108, 115, 91, 97, 99, 116, 105, 118, 101, 84, 97, 98, 93, 32, 124, 124, // ls[activeTab] ||
32, 97, 99, 116, 105, 118, 101, 84, 97, 98, 59, 10, 10, 9, 9, 105, // activeTab;....i
102, 32, 40, 33, 99, 111, 110, 102, 105, 114, 109, 40, 39, 231, 161, 174, // f (!confirm('...
229, 174, 154, 229, 176, 134, 32, 39, 32, 43, 32, 105, 116, 101, 109, 115, // ...... ' + items
46, 108, 101, 110, 103, 116, 104, 32, 43, 32, 39, 32, 228, 184, 170, 228, // .length + ' ....
191, 161, 229, 143, 183, 230, 183, 187, 229, 138, 160, 229, 136, 176, 32, 39, // .............. '
32, 43, 32, 108, 97, 98, 101, 108, 32, 43, 32, 39, 239, 188, 159, 39, // + label + '...'
41, 41, 32, 114, 101, 116, 117, 114, 110, 59, 10, 10, 9, 9, 118, 97, // )) return;....va
114, 32, 115, 117, 99, 99, 32, 61, 32, 48, 59, 10, 9, 9, 102, 111, // r succ = 0;...fo
114, 32, 40, 118, 97, 114, 32, 105, 32, 61, 32, 48, 59, 32, 105, 32, // r (var i = 0; i
60, 32, 105, 116, 101, 109, 115, 46, 108, 101, 110, 103, 116, 104, 59, 32, // < items.length;
105, 43, 43, 41, 32, 123, 10, 9, 9, 9, 118, 97, 114, 32, 111, 107, // i++) {....var ok
32, 61, 32, 87, 115, 67, 108, 105, 101, 110, 116, 46, 115, 101, 110, 100, // = WsClient.send
40, 123, 10, 9, 9, 9, 9, 115, 97, 100, 100, 114, 58, 32, 105, 116, // ({.....saddr: it
101, 109, 115, 91, 105, 93, 46, 115, 97, 100, 100, 114, 44, 10, 9, 9, // ems[i].saddr,...
9, 9, 115, 105, 103, 110, 97, 108, 95, 116, 121, 112, 101, 58, 32, 97, // ..signal_type: a
99, 116, 105, 118, 101, 84, 97, 98, 44, 10, 9, 9, 9, 9, 99, 117, // ctiveTab,.....cu
114, 100, 58, 32, 39, 97, 100, 100, 39, 44, 10, 9, 9, 9, 9, 115, // rd: 'add',.....s
101, 116, 116, 105, 110, 103, 95, 122, 111, 110, 101, 58, 32, 39, 48, 39, // etting_zone: '0'
44, 10, 9, 9, 9, 9, 115, 105, 103, 110, 97, 108, 95, 100, 97, 116, // ,.....signal_dat
97, 58, 32, 39, 39, 10, 9, 9, 9, 125, 41, 59, 10, 9, 9, 9, // a: ''....});....
105, 102, 32, 40, 111, 107, 41, 32, 115, 117, 99, 99, 43, 43, 59, 10, // if (ok) succ++;.
9, 9, 125, 10, 9, 9, 97, 108, 101, 114, 116, 40, 39, 229, 183, 178, // ..}...alert('...
229, 143, 145, 233, 128, 129, 32, 39, 32, 43, 32, 115, 117, 99, 99, 32, // ...... ' + succ
43, 32, 39, 47, 39, 32, 43, 32, 105, 116, 101, 109, 115, 46, 108, 101, // + '/' + items.le
110, 103, 116, 104, 32, 43, 32, 39, 32, 228, 184, 170, 32, 97, 100, 100, // ngth + ' ... add
32, 232, 175, 183, 230, 177, 130, 229, 136, 176, 32, 39, 32, 43, 32, 108, // ......... ' + l
97, 98, 101, 108, 41, 59, 10, 9, 125, 10, 10, 9, 102, 117, 110, 99, // abel);..}...func
116, 105, 111, 110, 32, 114, 101, 110, 100, 101, 114, 72, 101, 97, 100, 101, // tion renderHeade
114, 115, 40, 41, 32, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 118, // rs() {. v
97, 114, 32, 116, 104, 101, 97, 100, 32, 61, 32, 100, 111, 99, 117, 109, // ar thead = docum
101, 110, 116, 46, 103, 101, 116, 69, 108, 101, 109, 101, 110, 116, 66, 121, // ent.getElementBy
73, 100, 40, 39, 100, 99, 45, 116, 104, 101, 97, 100, 39, 41, 59, 10, // Id('dc-thead');.
32, 32, 32, 32, 32, 32, 32, 32, 105, 102, 32, 40, 33, 116, 104, 101, // if (!the
97, 100, 41, 32, 114, 101, 116, 117, 114, 110, 59, 10, 32, 32, 32, 32, // ad) return;.
32, 32, 32, 32, 118, 97, 114, 32, 104, 116, 109, 108, 32, 61, 32, 39, // var html = '
39, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 102, 111, 114, 32, 40, // ';. for (
118, 97, 114, 32, 105, 32, 61, 32, 48, 59, 32, 105, 32, 60, 32, 67, // var i = 0; i < C
79, 76, 85, 77, 78, 83, 46, 108, 101, 110, 103, 116, 104, 59, 32, 105, // OLUMNS.length; i
43, 43, 41, 32, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // ++) {.
32, 32, 104, 116, 109, 108, 32, 43, 61, 32, 39, 60, 116, 104, 62, 39, // html += '<th>'
32, 43, 32, 67, 79, 76, 85, 77, 78, 83, 91, 105, 93, 32, 43, 32, // + COLUMNS[i] +
39, 60, 47, 116, 104, 62, 39, 59, 10, 32, 32, 32, 32, 32, 32, 32, // '</th>';.
32, 125, 10, 32, 32, 32, 32, 32, 32, 32, 32, 116, 104, 101, 97, 100, // }. thead
46, 105, 110, 110, 101, 114, 72, 84, 77, 76, 32, 61, 32, 104, 116, 109, // .innerHTML = htm
108, 59, 10, 32, 32, 32, 32, 125, 10, 10, 32, 32, 32, 32, 102, 117, // l;. }.. fu
110, 99, 116, 105, 111, 110, 32, 114, 101, 110, 100, 101, 114, 84, 97, 98, // nction renderTab
115, 40, 41, 32, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 118, 97, // s() {. va
114, 32, 116, 121, 112, 101, 115, 32, 61, 32, 91, 39, 111, 117, 116, 39, // r types = ['out'
44, 32, 39, 105, 110, 39, 44, 32, 39, 121, 107, 39, 44, 32, 39, 97, // , 'in', 'yk', 'a
111, 39, 44, 32, 39, 112, 97, 114, 97, 109, 39, 93, 59, 10, 32, 32, // o', 'param'];.
32, 32, 32, 32, 32, 32, 118, 97, 114, 32, 108, 97, 98, 101, 108, 115, // var labels
32, 61, 32, 123, 32, 111, 117, 116, 58, 32, 39, 230, 179, 168, 229, 134, // = { out: '.....
140, 32, 40, 111, 117, 116, 41, 39, 44, 32, 105, 110, 58, 32, 39, 233, // . (out)', in: '.
147, 190, 230, 142, 165, 230, 179, 168, 229, 134, 140, 32, 40, 105, 110, 41, // ........... (in)
39, 44, 32, 121, 107, 58, 32, 39, 233, 129, 165, 230, 142, 167, 32, 40, // ', yk: '...... (
121, 107, 41, 39, 44, 32, 97, 111, 58, 32, 39, 229, 143, 130, 230, 149, // yk)', ao: '.....
176, 32, 40, 97, 111, 41, 39, 44, 32, 112, 97, 114, 97, 109, 58, 32, // . (ao)', param:
39, 229, 174, 154, 229, 128, 188, 32, 40, 112, 97, 114, 97, 109, 41, 39, // '...... (param)'
32, 125, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 118, 97, 114, 32, // };. var
101, 108, 32, 61, 32, 100, 111, 99, 117, 109, 101, 110, 116, 46, 103, 101, // el = document.ge
114, 115, 40, 41, 32, 123, 10, 9, 9, 118, 97, 114, 32, 116, 104, 101, // rs() {...var the
97, 100, 32, 61, 32, 100, 111, 99, 117, 109, 101, 110, 116, 46, 103, 101, // ad = document.ge
116, 69, 108, 101, 109, 101, 110, 116, 66, 121, 73, 100, 40, 39, 100, 99, // tElementById('dc
45, 116, 97, 98, 45, 98, 97, 114, 39, 41, 59, 10, 32, 32, 32, 32, // -tab-bar');.
32, 32, 32, 32, 105, 102, 32, 40, 33, 101, 108, 41, 32, 114, 101, 116, // if (!el) ret
117, 114, 110, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 118, 97, 114, // urn;. var
32, 104, 116, 109, 108, 32, 61, 32, 39, 39, 59, 10, 32, 32, 32, 32, // html = '';.
32, 32, 32, 32, 102, 111, 114, 32, 40, 118, 97, 114, 32, 105, 32, 61, // for (var i =
32, 48, 59, 32, 105, 32, 60, 32, 116, 121, 112, 101, 115, 46, 108, 101, // 0; i < types.le
110, 103, 116, 104, 59, 32, 105, 43, 43, 41, 32, 123, 10, 32, 32, 32, // ngth; i++) {.
32, 32, 32, 32, 32, 32, 32, 32, 32, 118, 97, 114, 32, 116, 32, 61, // var t =
32, 116, 121, 112, 101, 115, 91, 105, 93, 59, 10, 32, 32, 32, 32, 32, // types[i];.
32, 32, 32, 32, 32, 32, 32, 118, 97, 114, 32, 99, 108, 115, 32, 61, // var cls =
32, 116, 32, 61, 61, 61, 32, 97, 99, 116, 105, 118, 101, 84, 97, 98, // t === activeTab
32, 63, 32, 39, 100, 99, 45, 116, 97, 98, 32, 97, 99, 116, 105, 118, // ? 'dc-tab activ
101, 39, 32, 58, 32, 39, 100, 99, 45, 116, 97, 98, 39, 59, 10, 32, // e' : 'dc-tab';.
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 104, 116, 109, 108, 32, // html
43, 61, 32, 39, 60, 115, 112, 97, 110, 32, 99, 108, 97, 115, 115, 61, // += '<span class=
34, 39, 32, 43, 32, 99, 108, 115, 32, 43, 32, 39, 34, 32, 100, 97, // "' + cls + '" da
116, 97, 45, 116, 97, 98, 61, 34, 39, 32, 43, 32, 116, 32, 43, 32, // ta-tab="' + t +
39, 34, 62, 39, 32, 43, 32, 108, 97, 98, 101, 108, 115, 91, 116, 93, // '">' + labels[t]
32, 43, 32, 39, 60, 47, 115, 112, 97, 110, 62, 39, 59, 10, 32, 32, // + '</span>';.
32, 32, 32, 32, 32, 32, 125, 10, 32, 32, 32, 32, 32, 32, 32, 32, // }.
101, 108, 46, 105, 110, 110, 101, 114, 72, 84, 77, 76, 32, 61, 32, 104, // el.innerHTML = h
116, 109, 108, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 118, 97, 114, // tml;. var
32, 116, 97, 98, 115, 32, 61, 32, 101, 108, 46, 113, 117, 101, 114, 121, // tabs = el.query
83, 101, 108, 101, 99, 116, 111, 114, 65, 108, 108, 40, 39, 46, 100, 99, // SelectorAll('.dc
45, 116, 97, 98, 39, 41, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, // -tab');.
102, 111, 114, 32, 40, 118, 97, 114, 32, 107, 32, 61, 32, 48, 59, 32, // for (var k = 0;
107, 32, 60, 32, 116, 97, 98, 115, 46, 108, 101, 110, 103, 116, 104, 59, // k < tabs.length;
32, 107, 43, 43, 41, 32, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, // k++) {.
32, 32, 32, 32, 116, 97, 98, 115, 91, 107, 93, 46, 111, 110, 99, 108, // tabs[k].oncl
105, 99, 107, 32, 61, 32, 102, 117, 110, 99, 116, 105, 111, 110, 40, 41, // ick = function()
32, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // {.
32, 32, 32, 97, 99, 116, 105, 118, 101, 84, 97, 98, 32, 61, 32, 116, // activeTab = t
104, 105, 115, 46, 103, 101, 116, 65, 116, 116, 114, 105, 98, 117, 116, 101, // his.getAttribute
40, 39, 100, 97, 116, 97, 45, 116, 97, 98, 39, 41, 59, 10, 32, 32, // ('data-tab');.
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 115, 101, // se
97, 114, 99, 104, 84, 101, 120, 116, 32, 61, 32, 39, 39, 59, 10, 32, // archText = '';.
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 100, // d
111, 99, 117, 109, 101, 110, 116, 46, 103, 101, 116, 69, 108, 101, 109, 101, // ocument.getEleme
110, 116, 66, 121, 73, 100, 40, 39, 100, 99, 45, 115, 101, 97, 114, 99, // ntById('dc-searc
104, 39, 41, 46, 118, 97, 108, 117, 101, 32, 61, 32, 39, 39, 59, 10, // h').value = '';.
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, //
114, 101, 110, 100, 101, 114, 84, 97, 98, 115, 40, 41, 59, 10, 32, 32, // renderTabs();.
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 114, 101, // re
110, 100, 101, 114, 72, 101, 97, 100, 101, 114, 115, 40, 41, 59, 10, 32, // nderHeaders();.
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 114, // r
101, 110, 100, 101, 114, 84, 97, 98, 108, 101, 40, 41, 59, 10, 32, 32, // enderTable();.
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 125, 59, 10, 32, 32, 32, // };.
32, 32, 32, 32, 32, 125, 10, 32, 32, 32, 32, 125, 10, 10, 32, 32, // }. }..
32, 32, 114, 101, 116, 117, 114, 110, 32, 123, 10, 32, 32, 32, 32, 32, // return {.
32, 32, 32, 114, 101, 110, 100, 101, 114, 58, 32, 102, 117, 110, 99, 116, // render: funct
105, 111, 110, 40, 99, 111, 110, 116, 97, 105, 110, 101, 114, 41, 32, 123, // ion(container) {
10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 97, 108, 108, // . all
68, 97, 116, 97, 32, 61, 32, 123, 125, 59, 10, 32, 32, 32, 32, 32, // Data = {};.
32, 32, 32, 32, 32, 32, 32, 97, 99, 116, 105, 118, 101, 84, 97, 98, // activeTab
32, 61, 32, 39, 111, 117, 116, 39, 59, 10, 32, 32, 32, 32, 32, 32, // = 'out';.
32, 32, 32, 32, 32, 32, 115, 101, 97, 114, 99, 104, 84, 101, 120, 116, // searchText
32, 61, 32, 39, 39, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, // = '';.
32, 32, 32, 99, 111, 110, 116, 97, 105, 110, 101, 114, 46, 105, 110, 110, // container.inn
101, 114, 72, 84, 77, 76, 32, 61, 32, 39, 39, 10, 32, 32, 32, 32, // erHTML = ''.
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 43, 32, 39, 60, // + '<
100, 105, 118, 32, 99, 108, 97, 115, 115, 61, 34, 112, 97, 103, 101, 45, // div class="page-
104, 101, 97, 100, 101, 114, 34, 62, 60, 104, 50, 62, 230, 149, 176, 230, // header"><h2>....
141, 174, 228, 184, 173, 229, 191, 131, 60, 47, 104, 50, 62, 60, 112, 62, // ........</h2><p>
230, 159, 165, 231, 156, 139, 230, 137, 128, 230, 156, 137, 228, 191, 161, 229, // ................
143, 183, 230, 149, 176, 230, 141, 174, 239, 188, 140, 230, 140, 137, 231, 177, // ................
187, 229, 158, 139, 229, 136, 134, 232, 161, 168, 239, 188, 140, 230, 148, 175, // ................
230, 140, 129, 230, 144, 156, 231, 180, 162, 60, 47, 112, 62, 60, 47, 100, // .........</p></d
105, 118, 62, 39, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // iv>'.
32, 32, 32, 32, 32, 43, 32, 39, 60, 100, 105, 118, 32, 99, 108, 97, // + '<div cla
115, 115, 61, 34, 100, 97, 116, 97, 99, 101, 110, 116, 101, 114, 45, 116, // ss="datacenter-t
111, 111, 108, 98, 97, 114, 34, 62, 39, 10, 32, 32, 32, 32, 32, 32, // oolbar">'.
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 43, 32, 32, 32, 39, 60, // + '<
100, 105, 118, 32, 99, 108, 97, 115, 115, 61, 34, 100, 99, 45, 116, 97, // div class="dc-ta
98, 45, 98, 97, 114, 34, 32, 105, 100, 61, 34, 100, 99, 45, 116, 97, // b-bar" id="dc-ta
98, 45, 98, 97, 114, 34, 62, 60, 47, 100, 105, 118, 62, 39, 10, 32, // b-bar"></div>'.
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 43, // +
32, 32, 32, 39, 60, 105, 110, 112, 117, 116, 32, 116, 121, 112, 101, 61, // '<input type=
34, 116, 101, 120, 116, 34, 32, 99, 108, 97, 115, 115, 61, 34, 100, 99, // "text" class="dc
45, 115, 101, 97, 114, 99, 104, 34, 32, 105, 100, 61, 34, 100, 99, 45, // -search" id="dc-
115, 101, 97, 114, 99, 104, 34, 32, 112, 108, 97, 99, 101, 104, 111, 108, // search" placehol
100, 101, 114, 61, 34, 230, 144, 156, 231, 180, 162, 32, 115, 97, 100, 100, // der="...... sadd
114, 32, 230, 136, 150, 32, 100, 101, 115, 99, 46, 46, 46, 34, 62, 39, // r ... desc...">'
10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // .
32, 43, 32, 32, 32, 39, 60, 115, 112, 97, 110, 32, 99, 108, 97, 115, // + '<span clas
115, 61, 34, 100, 99, 45, 99, 111, 117, 110, 116, 34, 32, 105, 100, 61, // s="dc-count" id=
34, 100, 99, 45, 99, 111, 117, 110, 116, 34, 62, 48, 60, 47, 115, 112, // "dc-count">0</sp
97, 110, 62, 39, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // an>'.
32, 32, 32, 32, 32, 43, 32, 39, 60, 47, 100, 105, 118, 62, 39, 10, // + '</div>'.
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, //
43, 32, 39, 60, 100, 105, 118, 32, 99, 108, 97, 115, 115, 61, 34, 116, // + '<div class="t
97, 98, 108, 101, 45, 99, 97, 114, 100, 34, 62, 60, 100, 105, 118, 32, // able-card"><div
99, 108, 97, 115, 115, 61, 34, 116, 97, 98, 108, 101, 45, 119, 114, 97, // class="table-wra
112, 112, 101, 114, 34, 62, 39, 10, 32, 32, 32, 32, 32, 32, 32, 32, // pper">'.
32, 32, 32, 32, 32, 32, 32, 32, 43, 32, 39, 60, 116, 97, 98, 108, // + '<tabl
101, 32, 99, 108, 97, 115, 115, 61, 34, 115, 105, 103, 110, 97, 108, 45, // e class="signal-
116, 97, 98, 108, 101, 34, 62, 60, 116, 104, 101, 97, 100, 62, 60, 116, // table"><thead><t
114, 32, 105, 100, 61, 34, 100, 99, 45, 116, 104, 101, 97, 100, 34, 62, // r id="dc-thead">
60, 47, 116, 114, 62, 60, 47, 116, 104, 101, 97, 100, 62, 60, 116, 98, // </tr></thead><tb
111, 100, 121, 32, 105, 100, 61, 34, 100, 99, 45, 116, 98, 111, 100, 121, // ody id="dc-tbody
34, 62, 60, 47, 116, 98, 111, 100, 121, 62, 60, 47, 116, 97, 98, 108, // "></tbody></tabl
101, 62, 39, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // e>'.
32, 32, 32, 32, 43, 32, 39, 60, 47, 100, 105, 118, 62, 60, 47, 100, // + '</div></d
105, 118, 62, 39, 59, 10, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, // iv>';..
32, 32, 32, 114, 101, 110, 100, 101, 114, 84, 97, 98, 115, 40, 41, 59, // renderTabs();
10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 114, 101, 110, // . ren
100, 101, 114, 72, 101, 97, 100, 101, 114, 115, 40, 41, 59, 10, 32, 32, // derHeaders();.
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 114, 101, 110, 100, 101, 114, // render
84, 97, 98, 108, 101, 40, 41, 59, 10, 10, 32, 32, 32, 32, 32, 32, // Table();..
32, 32, 32, 32, 32, 32, 118, 97, 114, 32, 115, 101, 97, 114, 99, 104, // var search
73, 110, 112, 117, 116, 32, 61, 32, 100, 111, 99, 117, 109, 101, 110, 116, // Input = document
46, 103, 101, 116, 69, 108, 101, 109, 101, 110, 116, 66, 121, 73, 100, 40, // .getElementById(
39, 100, 99, 45, 115, 101, 97, 114, 99, 104, 39, 41, 59, 10, 32, 32, // 'dc-search');.
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 105, 102, 32, 40, 115, 101, // if (se
97, 114, 99, 104, 73, 110, 112, 117, 116, 41, 32, 123, 10, 32, 32, 32, // archInput) {.
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 115, 101, 97, // sea
114, 99, 104, 73, 110, 112, 117, 116, 46, 111, 110, 105, 110, 112, 117, 116, // rchInput.oninput
32, 61, 32, 102, 117, 110, 99, 116, 105, 111, 110, 40, 41, 32, 123, 10, // = function() {.
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, //
32, 32, 32, 32, 115, 101, 97, 114, 99, 104, 84, 101, 120, 116, 32, 61, // searchText =
32, 116, 104, 105, 115, 46, 118, 97, 108, 117, 101, 59, 10, 32, 32, 32, // this.value;.
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, //
32, 114, 101, 110, 100, 101, 114, 84, 97, 98, 108, 101, 40, 41, 59, 10, // renderTable();.
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, //
125, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 125, // };. }
10, 32, 32, 32, 32, 32, 32, 32, 32, 125, 44, 10, 10, 32, 32, 32, // . },..
32, 32, 32, 32, 32, 111, 110, 69, 110, 116, 101, 114, 58, 32, 102, 117, // onEnter: fu
110, 99, 116, 105, 111, 110, 40, 41, 32, 123, 10, 32, 32, 32, 32, 32, // nction() {.
32, 32, 32, 125, 44, 10, 10, 32, 32, 32, 32, 32, 32, 32, 32, 111, // },.. o
110, 76, 101, 97, 118, 101, 58, 32, 102, 117, 110, 99, 116, 105, 111, 110, // nLeave: function
40, 41, 32, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // () {.
32, 97, 108, 108, 68, 97, 116, 97, 32, 61, 32, 123, 125, 59, 10, 32, // allData = {};.
32, 32, 32, 32, 32, 32, 32, 125, 44, 10, 10, 32, 32, 32, 32, 32, // },..
32, 32, 32, 111, 110, 68, 97, 116, 97, 58, 32, 102, 117, 110, 99, 116, // onData: funct
105, 111, 110, 40, 100, 97, 116, 97, 41, 32, 123, 10, 32, 32, 32, 32, // ion(data) {.
32, 32, 32, 32, 32, 32, 32, 32, 105, 102, 32, 40, 33, 100, 97, 116, // if (!dat
97, 32, 124, 124, 32, 116, 121, 112, 101, 111, 102, 32, 100, 97, 116, 97, // a || typeof data
32, 33, 61, 61, 32, 39, 111, 98, 106, 101, 99, 116, 39, 41, 32, 114, // !== 'object') r
101, 116, 117, 114, 110, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, // eturn;.
32, 32, 32, 105, 102, 32, 40, 100, 97, 116, 97, 46, 111, 117, 116, 41, // if (data.out)
32, 97, 108, 108, 68, 97, 116, 97, 46, 111, 117, 116, 32, 61, 32, 100, // allData.out = d
97, 116, 97, 46, 111, 117, 116, 59, 10, 32, 32, 32, 32, 32, 32, 32, // ata.out;.
32, 32, 32, 32, 32, 105, 102, 32, 40, 100, 97, 116, 97, 46, 105, 110, // if (data.in
41, 32, 97, 108, 108, 68, 97, 116, 97, 46, 105, 110, 32, 61, 32, 100, // ) allData.in = d
97, 116, 97, 46, 105, 110, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, // ata.in;.
32, 32, 32, 32, 105, 102, 32, 40, 100, 97, 116, 97, 46, 121, 107, 41, // if (data.yk)
45, 116, 104, 101, 97, 100, 39, 41, 59, 10, 9, 9, 105, 102, 32, 40, // -thead');...if (
33, 116, 104, 101, 97, 100, 41, 32, 114, 101, 116, 117, 114, 110, 59, 10, // !thead) return;.
9, 9, 118, 97, 114, 32, 118, 105, 115, 105, 98, 108, 101, 32, 61, 32, // ..var visible =
103, 101, 116, 86, 105, 115, 105, 98, 108, 101, 68, 97, 116, 97, 40, 41, // getVisibleData()
59, 10, 9, 9, 118, 97, 114, 32, 97, 108, 108, 67, 104, 101, 99, 107, // ;...var allCheck
101, 100, 32, 61, 32, 118, 105, 115, 105, 98, 108, 101, 46, 108, 101, 110, // ed = visible.len
103, 116, 104, 32, 62, 32, 48, 59, 10, 9, 9, 102, 111, 114, 32, 40, // gth > 0;...for (
118, 97, 114, 32, 105, 32, 61, 32, 48, 59, 32, 105, 32, 60, 32, 118, // var i = 0; i < v
105, 115, 105, 98, 108, 101, 46, 108, 101, 110, 103, 116, 104, 32, 38, 38, // isible.length &&
32, 97, 108, 108, 67, 104, 101, 99, 107, 101, 100, 59, 32, 105, 43, 43, // allChecked; i++
41, 32, 123, 10, 9, 9, 9, 105, 102, 32, 40, 33, 115, 101, 108, 101, // ) {....if (!sele
99, 116, 101, 100, 83, 101, 116, 91, 118, 105, 115, 105, 98, 108, 101, 91, // ctedSet[visible[
105, 93, 46, 115, 97, 100, 100, 114, 93, 41, 32, 97, 108, 108, 67, 104, // i].saddr]) allCh
101, 99, 107, 101, 100, 32, 61, 32, 102, 97, 108, 115, 101, 59, 10, 9, // ecked = false;..
9, 125, 10, 9, 9, 118, 97, 114, 32, 104, 116, 109, 108, 32, 61, 32, // .}...var html =
39, 60, 116, 104, 32, 115, 116, 121, 108, 101, 61, 34, 119, 105, 100, 116, // '<th style="widt
104, 58, 51, 54, 112, 120, 34, 62, 60, 105, 110, 112, 117, 116, 32, 116, // h:36px"><input t
121, 112, 101, 61, 34, 99, 104, 101, 99, 107, 98, 111, 120, 34, 32, 105, // ype="checkbox" i
100, 61, 34, 100, 99, 45, 99, 98, 45, 97, 108, 108, 34, 39, 32, 43, // d="dc-cb-all"' +
32, 40, 97, 108, 108, 67, 104, 101, 99, 107, 101, 100, 32, 63, 32, 39, // (allChecked ? '
32, 99, 104, 101, 99, 107, 101, 100, 39, 32, 58, 32, 39, 39, 41, 32, // checked' : '')
43, 32, 39, 62, 60, 47, 116, 104, 62, 39, 59, 10, 9, 9, 102, 111, // + '></th>';...fo
114, 32, 40, 118, 97, 114, 32, 106, 32, 61, 32, 49, 59, 32, 106, 32, // r (var j = 1; j
60, 32, 67, 79, 76, 85, 77, 78, 83, 46, 108, 101, 110, 103, 116, 104, // < COLUMNS.length
59, 32, 106, 43, 43, 41, 32, 123, 10, 9, 9, 9, 104, 116, 109, 108, // ; j++) {....html
32, 43, 61, 32, 39, 60, 116, 104, 62, 39, 32, 43, 32, 67, 79, 76, // += '<th>' + COL
85, 77, 78, 83, 91, 106, 93, 32, 43, 32, 39, 60, 47, 116, 104, 62, // UMNS[j] + '</th>
39, 59, 10, 9, 9, 125, 10, 9, 9, 116, 104, 101, 97, 100, 46, 105, // ';...}...thead.i
110, 110, 101, 114, 72, 84, 77, 76, 32, 61, 32, 104, 116, 109, 108, 59, // nnerHTML = html;
10, 10, 9, 9, 118, 97, 114, 32, 99, 98, 65, 108, 108, 32, 61, 32, // ....var cbAll =
100, 111, 99, 117, 109, 101, 110, 116, 46, 103, 101, 116, 69, 108, 101, 109, // document.getElem
101, 110, 116, 66, 121, 73, 100, 40, 39, 100, 99, 45, 99, 98, 45, 97, // entById('dc-cb-a
108, 108, 39, 41, 59, 10, 9, 9, 105, 102, 32, 40, 99, 98, 65, 108, // ll');...if (cbAl
108, 41, 32, 99, 98, 65, 108, 108, 46, 111, 110, 99, 104, 97, 110, 103, // l) cbAll.onchang
101, 32, 61, 32, 111, 110, 83, 101, 108, 101, 99, 116, 65, 108, 108, 59, // e = onSelectAll;
10, 9, 125, 10, 10, 9, 102, 117, 110, 99, 116, 105, 111, 110, 32, 114, // ..}...function r
101, 110, 100, 101, 114, 84, 97, 98, 108, 101, 40, 41, 32, 123, 10, 9, // enderTable() {..
9, 118, 97, 114, 32, 100, 97, 116, 97, 32, 61, 32, 103, 101, 116, 86, // .var data = getV
105, 115, 105, 98, 108, 101, 68, 97, 116, 97, 40, 41, 59, 10, 9, 9, // isibleData();...
118, 97, 114, 32, 116, 98, 111, 100, 121, 32, 61, 32, 100, 111, 99, 117, // var tbody = docu
109, 101, 110, 116, 46, 103, 101, 116, 69, 108, 101, 109, 101, 110, 116, 66, // ment.getElementB
121, 73, 100, 40, 39, 100, 99, 45, 116, 98, 111, 100, 121, 39, 41, 59, // yId('dc-tbody');
10, 9, 9, 105, 102, 32, 40, 33, 116, 98, 111, 100, 121, 41, 32, 114, // ...if (!tbody) r
101, 116, 117, 114, 110, 59, 10, 10, 9, 9, 118, 97, 114, 32, 102, 117, // eturn;....var fu
108, 108, 68, 97, 116, 97, 32, 61, 32, 97, 108, 108, 68, 97, 116, 97, // llData = allData
91, 97, 99, 116, 105, 118, 101, 84, 97, 98, 93, 32, 124, 124, 32, 91, // [activeTab] || [
93, 59, 10, 9, 9, 100, 111, 99, 117, 109, 101, 110, 116, 46, 103, 101, // ];...document.ge
116, 69, 108, 101, 109, 101, 110, 116, 66, 121, 73, 100, 40, 39, 100, 99, // tElementById('dc
45, 99, 111, 117, 110, 116, 39, 41, 46, 116, 101, 120, 116, 67, 111, 110, // -count').textCon
116, 101, 110, 116, 32, 61, 32, 100, 97, 116, 97, 46, 108, 101, 110, 103, // tent = data.leng
116, 104, 32, 43, 32, 39, 32, 47, 32, 39, 32, 43, 32, 102, 117, 108, // th + ' / ' + ful
108, 68, 97, 116, 97, 46, 108, 101, 110, 103, 116, 104, 59, 10, 10, 9, // lData.length;...
9, 105, 102, 32, 40, 100, 97, 116, 97, 46, 108, 101, 110, 103, 116, 104, // .if (data.length
32, 61, 61, 61, 32, 48, 41, 32, 123, 10, 9, 9, 9, 116, 98, 111, // === 0) {....tbo
100, 121, 46, 105, 110, 110, 101, 114, 72, 84, 77, 76, 32, 61, 32, 39, // dy.innerHTML = '
60, 116, 114, 32, 99, 108, 97, 115, 115, 61, 34, 101, 109, 112, 116, 121, // <tr class="empty
45, 114, 111, 119, 34, 62, 60, 116, 100, 32, 99, 111, 108, 115, 112, 97, // -row"><td colspa
110, 61, 34, 39, 32, 43, 32, 67, 79, 76, 85, 77, 78, 83, 46, 108, // n="' + COLUMNS.l
101, 110, 103, 116, 104, 32, 43, 32, 39, 34, 62, 230, 154, 130, 230, 151, // ength + '">.....
160, 230, 149, 176, 230, 141, 174, 60, 47, 116, 100, 62, 60, 47, 116, 114, // .......</td></tr
62, 39, 59, 10, 9, 9, 9, 114, 101, 116, 117, 114, 110, 59, 10, 9, // >';....return;..
9, 125, 10, 10, 9, 9, 118, 97, 114, 32, 104, 116, 109, 108, 32, 61, // .}....var html =
32, 39, 39, 59, 10, 9, 9, 102, 111, 114, 32, 40, 118, 97, 114, 32, // '';...for (var
105, 32, 61, 32, 48, 59, 32, 105, 32, 60, 32, 100, 97, 116, 97, 46, // i = 0; i < data.
108, 101, 110, 103, 116, 104, 59, 32, 105, 43, 43, 41, 32, 123, 10, 9, // length; i++) {..
9, 9, 118, 97, 114, 32, 105, 116, 101, 109, 32, 61, 32, 100, 97, 116, // ..var item = dat
97, 91, 105, 93, 59, 10, 9, 9, 9, 118, 97, 114, 32, 99, 104, 101, // a[i];....var che
99, 107, 101, 100, 32, 61, 32, 33, 33, 115, 101, 108, 101, 99, 116, 101, // cked = !!selecte
100, 83, 101, 116, 91, 105, 116, 101, 109, 46, 115, 97, 100, 100, 114, 93, // dSet[item.saddr]
59, 10, 9, 9, 9, 104, 116, 109, 108, 32, 43, 61, 32, 39, 60, 116, // ;....html += '<t
114, 62, 39, 10, 9, 9, 9, 9, 43, 32, 39, 60, 116, 100, 62, 60, // r>'.....+ '<td><
105, 110, 112, 117, 116, 32, 116, 121, 112, 101, 61, 34, 99, 104, 101, 99, // input type="chec
107, 98, 111, 120, 34, 32, 99, 108, 97, 115, 115, 61, 34, 100, 99, 45, // kbox" class="dc-
99, 98, 45, 114, 111, 119, 34, 39, 32, 43, 32, 40, 99, 104, 101, 99, // cb-row"' + (chec
107, 101, 100, 32, 63, 32, 39, 32, 99, 104, 101, 99, 107, 101, 100, 39, // ked ? ' checked'
32, 58, 32, 39, 39, 41, 32, 43, 32, 39, 32, 100, 97, 116, 97, 45, // : '') + ' data-
115, 97, 100, 100, 114, 61, 34, 39, 32, 43, 32, 102, 109, 116, 86, 97, // saddr="' + fmtVa
108, 40, 105, 116, 101, 109, 46, 115, 97, 100, 100, 114, 41, 32, 43, 32, // l(item.saddr) +
39, 34, 62, 60, 47, 116, 100, 62, 39, 10, 9, 9, 9, 9, 43, 32, // '"></td>'.....+
39, 60, 116, 100, 62, 39, 32, 43, 32, 102, 109, 116, 86, 97, 108, 40, // '<td>' + fmtVal(
105, 116, 101, 109, 46, 105, 100, 41, 32, 43, 32, 39, 60, 47, 116, 100, // item.id) + '</td
62, 39, 10, 9, 9, 9, 9, 43, 32, 39, 60, 116, 100, 62, 39, 32, // >'.....+ '<td>'
43, 32, 102, 109, 116, 86, 97, 108, 40, 105, 116, 101, 109, 46, 115, 97, // + fmtVal(item.sa
100, 100, 114, 41, 32, 43, 32, 39, 60, 47, 116, 100, 62, 39, 10, 9, // ddr) + '</td>'..
9, 9, 9, 43, 32, 39, 60, 116, 100, 62, 39, 32, 43, 32, 102, 109, // ...+ '<td>' + fm
116, 86, 97, 108, 40, 105, 116, 101, 109, 46, 100, 101, 115, 99, 41, 32, // tVal(item.desc)
43, 32, 39, 60, 47, 116, 100, 62, 39, 10, 9, 9, 9, 9, 43, 32, // + '</td>'.....+
39, 60, 116, 100, 62, 39, 32, 43, 32, 102, 109, 116, 86, 97, 108, 40, // '<td>' + fmtVal(
105, 116, 101, 109, 46, 116, 121, 112, 101, 41, 32, 43, 32, 39, 60, 47, // item.type) + '</
116, 100, 62, 39, 10, 9, 9, 9, 9, 43, 32, 39, 60, 116, 100, 62, // td>'.....+ '<td>
39, 32, 43, 32, 102, 109, 116, 86, 97, 108, 40, 67, 84, 82, 76, 95, // ' + fmtVal(CTRL_
84, 89, 80, 69, 95, 77, 65, 80, 91, 105, 116, 101, 109, 46, 99, 116, // TYPE_MAP[item.ct
114, 108, 95, 116, 121, 112, 101, 93, 32, 124, 124, 32, 105, 116, 101, 109, // rl_type] || item
46, 99, 116, 114, 108, 95, 116, 121, 112, 101, 41, 32, 43, 32, 39, 60, // .ctrl_type) + '<
47, 116, 100, 62, 39, 10, 9, 9, 9, 9, 43, 32, 39, 60, 116, 100, // /td>'.....+ '<td
32, 115, 116, 121, 108, 101, 61, 34, 109, 97, 120, 45, 119, 105, 100, 116, // style="max-widt
104, 58, 50, 48, 48, 112, 120, 59, 111, 118, 101, 114, 102, 108, 111, 119, // h:200px;overflow
58, 104, 105, 100, 100, 101, 110, 59, 116, 101, 120, 116, 45, 111, 118, 101, // :hidden;text-ove
114, 102, 108, 111, 119, 58, 101, 108, 108, 105, 112, 115, 105, 115, 59, 119, // rflow:ellipsis;w
104, 105, 116, 101, 45, 115, 112, 97, 99, 101, 58, 110, 111, 119, 114, 97, // hite-space:nowra
112, 34, 32, 116, 105, 116, 108, 101, 61, 34, 39, 32, 43, 32, 102, 109, // p" title="' + fm
116, 86, 97, 108, 40, 105, 116, 101, 109, 46, 108, 105, 110, 107, 95, 115, // tVal(item.link_s
97, 100, 100, 114, 115, 41, 32, 43, 32, 39, 34, 62, 39, 32, 43, 32, // addrs) + '">' +
102, 109, 116, 86, 97, 108, 40, 105, 116, 101, 109, 46, 108, 105, 110, 107, // fmtVal(item.link
95, 115, 97, 100, 100, 114, 115, 41, 32, 43, 32, 39, 60, 47, 116, 100, // _saddrs) + '</td
62, 39, 10, 9, 9, 9, 9, 43, 32, 39, 60, 47, 116, 114, 62, 39, // >'.....+ '</tr>'
59, 10, 9, 9, 125, 10, 9, 9, 116, 98, 111, 100, 121, 46, 105, 110, // ;...}...tbody.in
110, 101, 114, 72, 84, 77, 76, 32, 61, 32, 104, 116, 109, 108, 59, 10, // nerHTML = html;.
10, 9, 9, 47, 47, 32, 231, 187, 145, 229, 174, 154, 232, 161, 140, 229, // ...// ..........
164, 141, 233, 128, 137, 230, 161, 134, 228, 186, 139, 228, 187, 182, 10, 9, // ................
9, 118, 97, 114, 32, 99, 98, 115, 32, 61, 32, 116, 98, 111, 100, 121, // .var cbs = tbody
46, 113, 117, 101, 114, 121, 83, 101, 108, 101, 99, 116, 111, 114, 65, 108, // .querySelectorAl
108, 40, 39, 46, 100, 99, 45, 99, 98, 45, 114, 111, 119, 39, 41, 59, // l('.dc-cb-row');
10, 9, 9, 102, 111, 114, 32, 40, 118, 97, 114, 32, 107, 32, 61, 32, // ...for (var k =
48, 59, 32, 107, 32, 60, 32, 99, 98, 115, 46, 108, 101, 110, 103, 116, // 0; k < cbs.lengt
104, 59, 32, 107, 43, 43, 41, 32, 123, 10, 9, 9, 9, 99, 98, 115, // h; k++) {....cbs
91, 107, 93, 46, 111, 110, 99, 108, 105, 99, 107, 32, 61, 32, 102, 117, // [k].onclick = fu
110, 99, 116, 105, 111, 110, 40, 101, 41, 32, 123, 10, 9, 9, 9, 9, // nction(e) {.....
101, 46, 115, 116, 111, 112, 80, 114, 111, 112, 97, 103, 97, 116, 105, 111, // e.stopPropagatio
110, 40, 41, 59, 10, 9, 9, 9, 9, 111, 110, 84, 111, 103, 103, 108, // n();.....onToggl
101, 82, 111, 119, 40, 116, 104, 105, 115, 46, 103, 101, 116, 65, 116, 116, // eRow(this.getAtt
114, 105, 98, 117, 116, 101, 40, 39, 100, 97, 116, 97, 45, 115, 97, 100, // ribute('data-sad
100, 114, 39, 41, 41, 59, 10, 9, 9, 9, 125, 59, 10, 9, 9, 125, // dr'));....};...}
10, 9, 125, 10, 10, 9, 102, 117, 110, 99, 116, 105, 111, 110, 32, 114, // ..}...function r
101, 110, 100, 101, 114, 84, 97, 98, 115, 40, 41, 32, 123, 10, 9, 9, // enderTabs() {...
118, 97, 114, 32, 116, 121, 112, 101, 115, 32, 61, 32, 91, 39, 111, 117, // var types = ['ou
116, 39, 44, 32, 39, 105, 110, 39, 44, 32, 39, 121, 107, 39, 44, 32, // t', 'in', 'yk',
39, 97, 111, 39, 44, 32, 39, 112, 97, 114, 97, 109, 39, 93, 59, 10, // 'ao', 'param'];.
9, 9, 118, 97, 114, 32, 108, 97, 98, 101, 108, 115, 32, 61, 32, 123, // ..var labels = {
32, 111, 117, 116, 58, 32, 39, 230, 179, 168, 229, 134, 140, 32, 40, 111, // out: '...... (o
117, 116, 41, 39, 44, 32, 105, 110, 58, 32, 39, 233, 147, 190, 230, 142, // ut)', in: '.....
165, 230, 179, 168, 229, 134, 140, 32, 40, 105, 110, 41, 39, 44, 32, 121, // ....... (in)', y
107, 58, 32, 39, 233, 129, 165, 230, 142, 167, 32, 40, 121, 107, 41, 39, // k: '...... (yk)'
44, 32, 97, 111, 58, 32, 39, 229, 143, 130, 230, 149, 176, 32, 40, 97, // , ao: '...... (a
111, 41, 39, 44, 32, 112, 97, 114, 97, 109, 58, 32, 39, 229, 174, 154, // o)', param: '...
229, 128, 188, 32, 40, 112, 97, 114, 97, 109, 41, 39, 32, 125, 59, 10, // ... (param)' };.
9, 9, 118, 97, 114, 32, 101, 108, 32, 61, 32, 100, 111, 99, 117, 109, // ..var el = docum
101, 110, 116, 46, 103, 101, 116, 69, 108, 101, 109, 101, 110, 116, 66, 121, // ent.getElementBy
73, 100, 40, 39, 100, 99, 45, 116, 97, 98, 45, 98, 97, 114, 39, 41, // Id('dc-tab-bar')
59, 10, 9, 9, 105, 102, 32, 40, 33, 101, 108, 41, 32, 114, 101, 116, // ;...if (!el) ret
117, 114, 110, 59, 10, 9, 9, 118, 97, 114, 32, 104, 116, 109, 108, 32, // urn;...var html
61, 32, 39, 39, 59, 10, 9, 9, 102, 111, 114, 32, 40, 118, 97, 114, // = '';...for (var
32, 105, 32, 61, 32, 48, 59, 32, 105, 32, 60, 32, 116, 121, 112, 101, // i = 0; i < type
115, 46, 108, 101, 110, 103, 116, 104, 59, 32, 105, 43, 43, 41, 32, 123, // s.length; i++) {
10, 9, 9, 9, 118, 97, 114, 32, 116, 32, 61, 32, 116, 121, 112, 101, // ....var t = type
115, 91, 105, 93, 59, 10, 9, 9, 9, 118, 97, 114, 32, 99, 108, 115, // s[i];....var cls
32, 61, 32, 116, 32, 61, 61, 61, 32, 97, 99, 116, 105, 118, 101, 84, // = t === activeT
97, 98, 32, 63, 32, 39, 100, 99, 45, 116, 97, 98, 32, 97, 99, 116, // ab ? 'dc-tab act
105, 118, 101, 39, 32, 58, 32, 39, 100, 99, 45, 116, 97, 98, 39, 59, // ive' : 'dc-tab';
10, 9, 9, 9, 104, 116, 109, 108, 32, 43, 61, 32, 39, 60, 115, 112, // ....html += '<sp
97, 110, 32, 99, 108, 97, 115, 115, 61, 34, 39, 32, 43, 32, 99, 108, // an class="' + cl
115, 32, 43, 32, 39, 34, 32, 100, 97, 116, 97, 45, 116, 97, 98, 61, // s + '" data-tab=
34, 39, 32, 43, 32, 116, 32, 43, 32, 39, 34, 62, 39, 32, 43, 32, // "' + t + '">' +
108, 97, 98, 101, 108, 115, 91, 116, 93, 32, 43, 32, 39, 60, 47, 115, // labels[t] + '</s
112, 97, 110, 62, 39, 59, 10, 9, 9, 125, 10, 9, 9, 101, 108, 46, // pan>';...}...el.
105, 110, 110, 101, 114, 72, 84, 77, 76, 32, 61, 32, 104, 116, 109, 108, // innerHTML = html
59, 10, 9, 9, 118, 97, 114, 32, 116, 97, 98, 115, 32, 61, 32, 101, // ;...var tabs = e
108, 46, 113, 117, 101, 114, 121, 83, 101, 108, 101, 99, 116, 111, 114, 65, // l.querySelectorA
108, 108, 40, 39, 46, 100, 99, 45, 116, 97, 98, 39, 41, 59, 10, 9, // ll('.dc-tab');..
9, 102, 111, 114, 32, 40, 118, 97, 114, 32, 107, 32, 61, 32, 48, 59, // .for (var k = 0;
32, 107, 32, 60, 32, 116, 97, 98, 115, 46, 108, 101, 110, 103, 116, 104, // k < tabs.length
59, 32, 107, 43, 43, 41, 32, 123, 10, 9, 9, 9, 116, 97, 98, 115, // ; k++) {....tabs
91, 107, 93, 46, 111, 110, 99, 108, 105, 99, 107, 32, 61, 32, 102, 117, // [k].onclick = fu
110, 99, 116, 105, 111, 110, 40, 41, 32, 123, 10, 9, 9, 9, 9, 97, // nction() {.....a
99, 116, 105, 118, 101, 84, 97, 98, 32, 61, 32, 116, 104, 105, 115, 46, // ctiveTab = this.
103, 101, 116, 65, 116, 116, 114, 105, 98, 117, 116, 101, 40, 39, 100, 97, // getAttribute('da
116, 97, 45, 116, 97, 98, 39, 41, 59, 10, 9, 9, 9, 9, 115, 101, // ta-tab');.....se
97, 114, 99, 104, 84, 101, 120, 116, 32, 61, 32, 39, 39, 59, 10, 9, // archText = '';..
9, 9, 9, 115, 101, 108, 101, 99, 116, 101, 100, 83, 101, 116, 32, 61, // ...selectedSet =
32, 123, 125, 59, 10, 9, 9, 9, 9, 100, 111, 99, 117, 109, 101, 110, // {};.....documen
116, 46, 103, 101, 116, 69, 108, 101, 109, 101, 110, 116, 66, 121, 73, 100, // t.getElementById
40, 39, 100, 99, 45, 115, 101, 97, 114, 99, 104, 39, 41, 46, 118, 97, // ('dc-search').va
108, 117, 101, 32, 61, 32, 39, 39, 59, 10, 9, 9, 9, 9, 114, 101, // lue = '';.....re
110, 100, 101, 114, 84, 97, 98, 115, 40, 41, 59, 10, 9, 9, 9, 9, // nderTabs();.....
114, 101, 110, 100, 101, 114, 72, 101, 97, 100, 101, 114, 115, 40, 41, 59, // renderHeaders();
10, 9, 9, 9, 9, 114, 101, 110, 100, 101, 114, 84, 97, 98, 108, 101, // .....renderTable
40, 41, 59, 10, 9, 9, 9, 9, 117, 112, 100, 97, 116, 101, 83, 101, // ();.....updateSe
108, 101, 99, 116, 105, 111, 110, 66, 97, 114, 40, 41, 59, 10, 9, 9, // lectionBar();...
9, 125, 59, 10, 9, 9, 125, 10, 9, 125, 10, 10, 9, 114, 101, 116, // .};...}..}...ret
117, 114, 110, 32, 123, 10, 9, 9, 114, 101, 110, 100, 101, 114, 58, 32, // urn {...render:
102, 117, 110, 99, 116, 105, 111, 110, 40, 99, 111, 110, 116, 97, 105, 110, // function(contain
101, 114, 41, 32, 123, 10, 9, 9, 9, 97, 108, 108, 68, 97, 116, 97, // er) {....allData
32, 61, 32, 123, 125, 59, 10, 9, 9, 9, 97, 99, 116, 105, 118, 101, // = {};....active
84, 97, 98, 32, 61, 32, 39, 111, 117, 116, 39, 59, 10, 9, 9, 9, // Tab = 'out';....
115, 101, 97, 114, 99, 104, 84, 101, 120, 116, 32, 61, 32, 39, 39, 59, // searchText = '';
10, 9, 9, 9, 115, 101, 108, 101, 99, 116, 101, 100, 83, 101, 116, 32, // ....selectedSet
61, 32, 123, 125, 59, 10, 9, 9, 9, 99, 111, 110, 116, 97, 105, 110, // = {};....contain
101, 114, 46, 105, 110, 110, 101, 114, 72, 84, 77, 76, 32, 61, 32, 39, // er.innerHTML = '
39, 10, 9, 9, 9, 9, 43, 32, 39, 60, 100, 105, 118, 32, 99, 108, // '.....+ '<div cl
97, 115, 115, 61, 34, 112, 97, 103, 101, 45, 104, 101, 97, 100, 101, 114, // ass="page-header
34, 62, 60, 104, 50, 62, 230, 149, 176, 230, 141, 174, 228, 184, 173, 229, // "><h2>..........
191, 131, 60, 47, 104, 50, 62, 60, 112, 62, 229, 139, 190, 233, 128, 137, // ..</h2><p>......
228, 191, 161, 229, 143, 183, 229, 144, 142, 231, 130, 185, 229, 135, 187, 34, // ..............."
230, 183, 187, 229, 138, 160, 229, 136, 176, 34, 229, 141, 179, 229, 143, 175, // ........."......
230, 183, 187, 229, 138, 160, 232, 135, 179, 229, 175, 185, 229, 186, 148, 233, // ................
133, 141, 231, 189, 174, 233, 161, 181, 32, 124, 32, 230, 159, 165, 231, 156, // ........ | .....
139, 230, 137, 128, 230, 156, 137, 228, 191, 161, 229, 143, 183, 230, 149, 176, // ................
230, 141, 174, 239, 188, 140, 230, 140, 137, 231, 177, 187, 229, 158, 139, 229, // ................
136, 134, 232, 161, 168, 239, 188, 140, 230, 148, 175, 230, 140, 129, 230, 144, // ................
156, 231, 180, 162, 60, 47, 112, 62, 60, 47, 100, 105, 118, 62, 39, 10, // ....</p></div>'.
9, 9, 9, 9, 43, 32, 39, 60, 100, 105, 118, 32, 99, 108, 97, 115, // ....+ '<div clas
115, 61, 34, 100, 97, 116, 97, 99, 101, 110, 116, 101, 114, 45, 116, 111, // s="datacenter-to
111, 108, 98, 97, 114, 34, 62, 39, 10, 9, 9, 9, 9, 43, 32, 32, // olbar">'.....+
32, 39, 60, 100, 105, 118, 32, 99, 108, 97, 115, 115, 61, 34, 100, 99, // '<div class="dc
45, 116, 97, 98, 45, 98, 97, 114, 34, 32, 105, 100, 61, 34, 100, 99, // -tab-bar" id="dc
45, 116, 97, 98, 45, 98, 97, 114, 34, 62, 60, 47, 100, 105, 118, 62, // -tab-bar"></div>
39, 10, 9, 9, 9, 9, 43, 32, 32, 32, 39, 60, 105, 110, 112, 117, // '.....+ '<inpu
116, 32, 116, 121, 112, 101, 61, 34, 116, 101, 120, 116, 34, 32, 99, 108, // t type="text" cl
97, 115, 115, 61, 34, 100, 99, 45, 115, 101, 97, 114, 99, 104, 34, 32, // ass="dc-search"
105, 100, 61, 34, 100, 99, 45, 115, 101, 97, 114, 99, 104, 34, 32, 112, // id="dc-search" p
108, 97, 99, 101, 104, 111, 108, 100, 101, 114, 61, 34, 230, 144, 156, 231, // laceholder="....
180, 162, 32, 115, 97, 100, 100, 114, 32, 230, 136, 150, 32, 100, 101, 115, // .. saddr ... des
99, 46, 46, 46, 34, 62, 39, 10, 9, 9, 9, 9, 43, 32, 32, 32, // c...">'.....+
39, 60, 115, 112, 97, 110, 32, 99, 108, 97, 115, 115, 61, 34, 100, 99, // '<span class="dc
45, 99, 111, 117, 110, 116, 34, 32, 105, 100, 61, 34, 100, 99, 45, 99, // -count" id="dc-c
111, 117, 110, 116, 34, 62, 48, 60, 47, 115, 112, 97, 110, 62, 39, 10, // ount">0</span>'.
9, 9, 9, 9, 43, 32, 39, 60, 47, 100, 105, 118, 62, 39, 10, 9, // ....+ '</div>'..
9, 9, 9, 43, 32, 39, 60, 100, 105, 118, 32, 99, 108, 97, 115, 115, // ...+ '<div class
61, 34, 100, 99, 45, 115, 101, 108, 45, 98, 97, 114, 34, 32, 105, 100, // ="dc-sel-bar" id
61, 34, 100, 99, 45, 115, 101, 108, 45, 98, 97, 114, 34, 32, 115, 116, // ="dc-sel-bar" st
121, 108, 101, 61, 34, 100, 105, 115, 112, 108, 97, 121, 58, 110, 111, 110, // yle="display:non
101, 34, 62, 39, 10, 9, 9, 9, 9, 43, 32, 32, 32, 39, 60, 115, // e">'.....+ '<s
112, 97, 110, 32, 99, 108, 97, 115, 115, 61, 34, 100, 99, 45, 115, 101, // pan class="dc-se
108, 45, 108, 97, 98, 101, 108, 34, 62, 229, 183, 178, 233, 128, 137, 32, // l-label">......
48, 32, 228, 184, 170, 228, 191, 161, 229, 143, 183, 60, 47, 115, 112, 97, // 0 .........</spa
110, 62, 39, 10, 9, 9, 9, 9, 43, 32, 32, 32, 39, 60, 98, 117, // n>'.....+ '<bu
116, 116, 111, 110, 32, 99, 108, 97, 115, 115, 61, 34, 98, 116, 110, 32, // tton class="btn
98, 116, 110, 45, 112, 114, 105, 109, 97, 114, 121, 34, 32, 105, 100, 61, // btn-primary" id=
34, 100, 99, 45, 98, 116, 110, 45, 97, 100, 100, 34, 32, 115, 116, 121, // "dc-btn-add" sty
108, 101, 61, 34, 109, 97, 114, 103, 105, 110, 45, 108, 101, 102, 116, 58, // le="margin-left:
49, 54, 112, 120, 34, 62, 230, 183, 187, 229, 138, 160, 229, 136, 176, 233, // 16px">..........
133, 141, 231, 189, 174, 233, 161, 181, 60, 47, 98, 117, 116, 116, 111, 110, // ........</button
62, 39, 10, 9, 9, 9, 9, 43, 32, 39, 60, 47, 100, 105, 118, 62, // >'.....+ '</div>
39, 10, 9, 9, 9, 9, 43, 32, 39, 60, 100, 105, 118, 32, 99, 108, // '.....+ '<div cl
97, 115, 115, 61, 34, 116, 97, 98, 108, 101, 45, 99, 97, 114, 100, 34, // ass="table-card"
62, 60, 100, 105, 118, 32, 99, 108, 97, 115, 115, 61, 34, 116, 97, 98, // ><div class="tab
108, 101, 45, 119, 114, 97, 112, 112, 101, 114, 34, 62, 39, 10, 9, 9, // le-wrapper">'...
9, 9, 43, 32, 39, 60, 116, 97, 98, 108, 101, 32, 99, 108, 97, 115, // ..+ '<table clas
115, 61, 34, 115, 105, 103, 110, 97, 108, 45, 116, 97, 98, 108, 101, 34, // s="signal-table"
62, 60, 116, 104, 101, 97, 100, 62, 60, 116, 114, 32, 105, 100, 61, 34, // ><thead><tr id="
100, 99, 45, 116, 104, 101, 97, 100, 34, 62, 60, 47, 116, 114, 62, 60, // dc-thead"></tr><
47, 116, 104, 101, 97, 100, 62, 60, 116, 98, 111, 100, 121, 32, 105, 100, // /thead><tbody id
61, 34, 100, 99, 45, 116, 98, 111, 100, 121, 34, 62, 60, 47, 116, 98, // ="dc-tbody"></tb
111, 100, 121, 62, 60, 47, 116, 97, 98, 108, 101, 62, 39, 10, 9, 9, // ody></table>'...
9, 9, 43, 32, 39, 60, 47, 100, 105, 118, 62, 60, 47, 100, 105, 118, // ..+ '</div></div
62, 39, 59, 10, 10, 9, 9, 9, 114, 101, 110, 100, 101, 114, 84, 97, // >';.....renderTa
98, 115, 40, 41, 59, 10, 9, 9, 9, 114, 101, 110, 100, 101, 114, 72, // bs();....renderH
101, 97, 100, 101, 114, 115, 40, 41, 59, 10, 9, 9, 9, 114, 101, 110, // eaders();....ren
100, 101, 114, 84, 97, 98, 108, 101, 40, 41, 59, 10, 10, 9, 9, 9, // derTable();.....
118, 97, 114, 32, 115, 101, 97, 114, 99, 104, 73, 110, 112, 117, 116, 32, // var searchInput
61, 32, 100, 111, 99, 117, 109, 101, 110, 116, 46, 103, 101, 116, 69, 108, // = document.getEl
101, 109, 101, 110, 116, 66, 121, 73, 100, 40, 39, 100, 99, 45, 115, 101, // ementById('dc-se
97, 114, 99, 104, 39, 41, 59, 10, 9, 9, 9, 105, 102, 32, 40, 115, // arch');....if (s
101, 97, 114, 99, 104, 73, 110, 112, 117, 116, 41, 32, 123, 10, 9, 9, // earchInput) {...
9, 9, 115, 101, 97, 114, 99, 104, 73, 110, 112, 117, 116, 46, 111, 110, // ..searchInput.on
105, 110, 112, 117, 116, 32, 61, 32, 102, 117, 110, 99, 116, 105, 111, 110, // input = function
40, 41, 32, 123, 10, 9, 9, 9, 9, 9, 115, 101, 97, 114, 99, 104, // () {......search
84, 101, 120, 116, 32, 61, 32, 116, 104, 105, 115, 46, 118, 97, 108, 117, // Text = this.valu
101, 59, 10, 9, 9, 9, 9, 9, 114, 101, 110, 100, 101, 114, 72, 101, // e;......renderHe
97, 100, 101, 114, 115, 40, 41, 59, 10, 9, 9, 9, 9, 9, 114, 101, // aders();......re
110, 100, 101, 114, 84, 97, 98, 108, 101, 40, 41, 59, 10, 9, 9, 9, // nderTable();....
9, 125, 59, 10, 9, 9, 9, 125, 10, 10, 9, 9, 9, 118, 97, 114, // .};....}.....var
32, 97, 100, 100, 66, 116, 110, 32, 61, 32, 100, 111, 99, 117, 109, 101, // addBtn = docume
110, 116, 46, 103, 101, 116, 69, 108, 101, 109, 101, 110, 116, 66, 121, 73, // nt.getElementByI
100, 40, 39, 100, 99, 45, 98, 116, 110, 45, 97, 100, 100, 39, 41, 59, // d('dc-btn-add');
10, 9, 9, 9, 105, 102, 32, 40, 97, 100, 100, 66, 116, 110, 41, 32, // ....if (addBtn)
97, 100, 100, 66, 116, 110, 46, 111, 110, 99, 108, 105, 99, 107, 32, 61, // addBtn.onclick =
32, 100, 111, 65, 100, 100, 83, 101, 108, 101, 99, 116, 101, 100, 59, 10, // doAddSelected;.
9, 9, 125, 44, 10, 10, 9, 9, 111, 110, 69, 110, 116, 101, 114, 58, // ..},....onEnter:
32, 102, 117, 110, 99, 116, 105, 111, 110, 40, 41, 32, 123, 125, 44, 10, // function() {},.
10, 9, 9, 111, 110, 76, 101, 97, 118, 101, 58, 32, 102, 117, 110, 99, // ...onLeave: func
116, 105, 111, 110, 40, 41, 32, 123, 10, 9, 9, 9, 97, 108, 108, 68, // tion() {....allD
97, 116, 97, 32, 61, 32, 123, 125, 59, 10, 9, 9, 9, 115, 101, 108, // ata = {};....sel
101, 99, 116, 101, 100, 83, 101, 116, 32, 61, 32, 123, 125, 59, 10, 9, // ectedSet = {};..
9, 125, 44, 10, 10, 9, 9, 111, 110, 68, 97, 116, 97, 58, 32, 102, // .},....onData: f
117, 110, 99, 116, 105, 111, 110, 40, 100, 97, 116, 97, 41, 32, 123, 10, // unction(data) {.
9, 9, 9, 105, 102, 32, 40, 33, 100, 97, 116, 97, 32, 124, 124, 32, // ...if (!data ||
116, 121, 112, 101, 111, 102, 32, 100, 97, 116, 97, 32, 33, 61, 61, 32, // typeof data !==
39, 111, 98, 106, 101, 99, 116, 39, 41, 32, 114, 101, 116, 117, 114, 110, // 'object') return
59, 10, 9, 9, 9, 105, 102, 32, 40, 100, 97, 116, 97, 46, 111, 117, // ;....if (data.ou
116, 41, 32, 97, 108, 108, 68, 97, 116, 97, 46, 111, 117, 116, 32, 61, // t) allData.out =
32, 100, 97, 116, 97, 46, 111, 117, 116, 59, 10, 9, 9, 9, 105, 102, // data.out;....if
32, 40, 100, 97, 116, 97, 46, 105, 110, 41, 32, 97, 108, 108, 68, 97, // (data.in) allDa
116, 97, 46, 105, 110, 32, 61, 32, 100, 97, 116, 97, 46, 105, 110, 59, // ta.in = data.in;
10, 9, 9, 9, 105, 102, 32, 40, 100, 97, 116, 97, 46, 121, 107, 41, // ....if (data.yk)
32, 97, 108, 108, 68, 97, 116, 97, 46, 121, 107, 32, 61, 32, 100, 97, // allData.yk = da
116, 97, 46, 121, 107, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, // ta.yk;.
32, 32, 32, 105, 102, 32, 40, 100, 97, 116, 97, 46, 97, 111, 41, 32, // if (data.ao)
97, 108, 108, 68, 97, 116, 97, 46, 97, 111, 32, 61, 32, 100, 97, 116, // allData.ao = dat
97, 46, 97, 111, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // a.ao;.
32, 32, 105, 102, 32, 40, 100, 97, 116, 97, 46, 112, 97, 114, 97, 109, // if (data.param
41, 32, 97, 108, 108, 68, 97, 116, 97, 46, 112, 97, 114, 97, 109, 32, // ) allData.param
61, 32, 100, 97, 116, 97, 46, 112, 97, 114, 97, 109, 59, 10, 32, 32, // = data.param;.
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 105, 102, 32, 40, 100, 97, // if (da
116, 97, 46, 111, 117, 116, 32, 124, 124, 32, 100, 97, 116, 97, 46, 105, // ta.out || data.i
110, 32, 124, 124, 32, 100, 97, 116, 97, 46, 121, 107, 32, 124, 124, 32, // n || data.yk ||
100, 97, 116, 97, 46, 97, 111, 32, 124, 124, 32, 100, 97, 116, 97, 46, // data.ao || data.
112, 97, 114, 97, 109, 41, 32, 123, 10, 32, 32, 32, 32, 32, 32, 32, // param) {.
32, 32, 32, 32, 32, 32, 32, 32, 32, 114, 101, 110, 100, 101, 114, 84, // renderT
97, 98, 108, 101, 40, 41, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, // able();.
32, 32, 32, 32, 125, 10, 32, 32, 32, 32, 32, 32, 32, 32, 125, 10, // }. }.
32, 32, 32, 32, 125, 59, 10, 125, 41, 40, 41, 59, 10, 0 // };.})();.
116, 97, 46, 121, 107, 59, 10, 9, 9, 9, 105, 102, 32, 40, 100, 97, // ta.yk;....if (da
116, 97, 46, 97, 111, 41, 32, 97, 108, 108, 68, 97, 116, 97, 46, 97, // ta.ao) allData.a
111, 32, 61, 32, 100, 97, 116, 97, 46, 97, 111, 59, 10, 9, 9, 9, // o = data.ao;....
105, 102, 32, 40, 100, 97, 116, 97, 46, 112, 97, 114, 97, 109, 41, 32, // if (data.param)
97, 108, 108, 68, 97, 116, 97, 46, 112, 97, 114, 97, 109, 32, 61, 32, // allData.param =
100, 97, 116, 97, 46, 112, 97, 114, 97, 109, 59, 10, 9, 9, 9, 105, // data.param;....i
102, 32, 40, 100, 97, 116, 97, 46, 111, 117, 116, 32, 124, 124, 32, 100, // f (data.out || d
97, 116, 97, 46, 105, 110, 32, 124, 124, 32, 100, 97, 116, 97, 46, 121, // ata.in || data.y
107, 32, 124, 124, 32, 100, 97, 116, 97, 46, 97, 111, 32, 124, 124, 32, // k || data.ao ||
100, 97, 116, 97, 46, 112, 97, 114, 97, 109, 41, 32, 123, 10, 9, 9, // data.param) {...
9, 9, 114, 101, 110, 100, 101, 114, 72, 101, 97, 100, 101, 114, 115, 40, // ..renderHeaders(
41, 59, 10, 9, 9, 9, 9, 114, 101, 110, 100, 101, 114, 84, 97, 98, // );.....renderTab
108, 101, 40, 41, 59, 10, 9, 9, 9, 9, 117, 112, 100, 97, 116, 101, // le();.....update
83, 101, 108, 101, 99, 116, 105, 111, 110, 66, 97, 114, 40, 41, 59, 10, // SelectionBar();.
9, 9, 9, 125, 10, 9, 9, 125, 10, 9, 125, 59, 10, 125, 41, 40, // ...}...}..};.})(
41, 59, 10, 10, 0 // );..
};
static const unsigned char v8[] = {
47, 42, 42, 10, 32, 42, 32, 119, 115, 45, 99, 108, 105, 101, 110, 116, // /**. * ws-client
@ -4860,11 +5072,11 @@ static const unsigned char v8[] = {
};
const struct mg_mem_file mg_packed_files[] = {
{"/css/style.css", v3, sizeof(v3) - 1, 1782283693},
{"/index.html", v4, sizeof(v4) - 1, 1781250466},
{"/js/app.js", v5, sizeof(v5) - 1, 1782283151},
{"/js/monitor.js", v6, sizeof(v6) - 1, 1781250466},
{"/js/pages.js", v7, sizeof(v7) - 1, 1782284424},
{"/js/ws-client.js", v8, sizeof(v8) - 1, 1781746272},
{"/css/style.css", v3, sizeof(v3) - 1, 1782465409},
{"/index.html", v4, sizeof(v4) - 1, 1782440107},
{"/js/app.js", v5, sizeof(v5) - 1, 1782440107},
{"/js/monitor.js", v6, sizeof(v6) - 1, 1782440107},
{"/js/pages.js", v7, sizeof(v7) - 1, 1782466738},
{"/js/ws-client.js", v8, sizeof(v8) - 1, 1782440107},
{NULL, NULL, 0, 0}
};

View File

@ -694,3 +694,47 @@ body.login-page #main-content { margin-left: 0; display: flex; align-items: cent
color: var(--text-muted);
margin-left: auto;
}
/* === 数据中心 选择添加栏 === */
.dc-sel-bar {
background: #e8f5e9;
border: 1px solid #a5d6a7;
border-radius: var(--radius);
padding: 10px 20px;
margin-bottom: 16px;
display: flex;
align-items: center;
gap: 4px;
flex-wrap: wrap;
animation: dcSlideDown 0.2s ease-out;
}
@keyframes dcSlideDown {
from { opacity: 0; transform: translateY(-6px); }
to { opacity: 1; transform: translateY(0); }
}
.dc-sel-label {
font-size: 14px;
font-weight: 600;
color: #2e7d32;
}
.dc-sel-bar label {
font-size: 13px;
color: var(--text-secondary);
}
.dc-sel-bar select {
padding: 4px 8px;
border: 1px solid var(--border);
border-radius: 4px;
font-size: 13px;
background: #fff;
}
.dc-sel-bar .btn {
padding: 6px 16px;
font-size: 13px;
}
#dc-cb-all, .dc-cb-row {
width: 16px;
height: 16px;
cursor: pointer;
accent-color: var(--primary);
}

View File

@ -981,134 +981,248 @@ var TerminalPage = (function() {
* 数据中心页面
* ======================================================================== */
var DatacenterPage = (function() {
var allData = {};
var activeTab = 'out';
var searchText = '';
var allData = {};
var activeTab = 'out';
var searchText = '';
var selectedSet = {}; // {saddr: true}
var COLUMNS = ['id', 'saddr', 'desc', '数据类型', 'ctrl_type', 'link_saddrs'];
var COLUMNS = ['', 'id', 'saddr', 'desc', '数据类型', 'ctrl_type', 'link_saddrs'];
function renderTable() {
var data = allData[activeTab] || [];
var tbody = document.getElementById('dc-tbody');
if (!tbody) return;
function getVisibleData() {
var data = allData[activeTab] || [];
if (!searchText) return data;
var st = searchText.toLowerCase();
return data.filter(function(item) {
return (item.saddr && item.saddr.toLowerCase().indexOf(st) !== -1)
|| (item.desc && item.desc.toLowerCase().indexOf(st) !== -1);
});
}
if (data.length === 0) {
tbody.innerHTML = '<tr class="empty-row"><td colspan="6">暂无数据</td></tr>';
document.getElementById('dc-count').textContent = '0';
return;
}
function onSelectAll() {
var visible = getVisibleData();
var cb = document.getElementById('dc-cb-all');
if (cb && cb.checked && visible.length > 0) {
for (var i = 0; i < visible.length; i++) {
selectedSet[visible[i].saddr] = true;
}
} else {
for (var i = 0; i < visible.length; i++) {
delete selectedSet[visible[i].saddr];
}
}
renderTable();
updateSelectionBar();
}
var rows = data;
if (searchText) {
var st = searchText.toLowerCase();
rows = data.filter(function(item) {
return (item.saddr && item.saddr.toLowerCase().indexOf(st) !== -1)
|| (item.desc && item.desc.toLowerCase().indexOf(st) !== -1);
});
}
document.getElementById('dc-count').textContent = rows.length + ' / ' + data.length;
function onToggleRow(saddr) {
if (selectedSet[saddr]) {
delete selectedSet[saddr];
} else {
selectedSet[saddr] = true;
}
renderTable();
updateSelectionBar();
}
if (rows.length === 0) {
tbody.innerHTML = '<tr class="empty-row"><td colspan="6">无匹配结果</td></tr>';
return;
}
function getSelectedCount() {
var count = 0;
for (var k in selectedSet) {
if (selectedSet.hasOwnProperty(k)) count++;
}
return count;
}
var html = '';
for (var i = 0; i < rows.length; i++) {
var item = rows[i];
html += '<tr>'
+ '<td>' + fmtVal(item.id) + '</td>'
+ '<td>' + fmtVal(item.saddr) + '</td>'
+ '<td>' + fmtVal(item.desc) + '</td>'
+ '<td>' + fmtVal(item.type) + '</td>'
+ '<td>' + fmtVal(CTRL_TYPE_MAP[item.ctrl_type] || item.ctrl_type) + '</td>'
+ '<td style="max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap" title="' + fmtVal(item.link_saddrs) + '">' + fmtVal(item.link_saddrs) + '</td>'
+ '</tr>';
}
tbody.innerHTML = html;
}
function getSelectedItems() {
var result = [];
var fullData = allData[activeTab] || [];
for (var i = 0; i < fullData.length; i++) {
if (selectedSet[fullData[i].saddr]) {
result.push(fullData[i]);
}
}
return result;
}
function renderHeaders() {
var thead = document.getElementById('dc-thead');
if (!thead) return;
var html = '';
for (var i = 0; i < COLUMNS.length; i++) {
html += '<th>' + COLUMNS[i] + '</th>';
}
thead.innerHTML = html;
}
function updateSelectionBar() {
var bar = document.getElementById('dc-sel-bar');
if (!bar) return;
var count = getSelectedCount();
if (count === 0) {
bar.style.display = 'none';
} else {
bar.style.display = 'flex';
bar.querySelector('.dc-sel-label').textContent = '已选 ' + count + ' 个信号';
}
}
function renderTabs() {
var types = ['out', 'in', 'yk', 'ao', 'param'];
var labels = { out: '注册 (out)', in: '链接注册 (in)', yk: '遥控 (yk)', ao: '参数 (ao)', param: '定值 (param)' };
var el = document.getElementById('dc-tab-bar');
if (!el) return;
var html = '';
for (var i = 0; i < types.length; i++) {
var t = types[i];
var cls = t === activeTab ? 'dc-tab active' : 'dc-tab';
html += '<span class="' + cls + '" data-tab="' + t + '">' + labels[t] + '</span>';
}
el.innerHTML = html;
var tabs = el.querySelectorAll('.dc-tab');
for (var k = 0; k < tabs.length; k++) {
tabs[k].onclick = function() {
activeTab = this.getAttribute('data-tab');
searchText = '';
document.getElementById('dc-search').value = '';
renderTabs();
renderHeaders();
renderTable();
};
}
}
function doAddSelected() {
var items = getSelectedItems();
if (items.length === 0) {
alert('请先勾选要添加的信号');
return;
}
return {
render: function(container) {
allData = {};
activeTab = 'out';
searchText = '';
container.innerHTML = ''
+ '<div class="page-header"><h2>数据中心</h2><p>查看所有信号数据,按类型分表,支持搜索</p></div>'
+ '<div class="datacenter-toolbar">'
+ '<div class="dc-tab-bar" id="dc-tab-bar"></div>'
+ '<input type="text" class="dc-search" id="dc-search" placeholder="搜索 saddr 或 desc...">'
+ '<span class="dc-count" id="dc-count">0</span>'
+ '</div>'
+ '<div class="table-card"><div class="table-wrapper">'
+ '<table class="signal-table"><thead><tr id="dc-thead"></tr></thead><tbody id="dc-tbody"></tbody></table>'
+ '</div></div>';
var typeLabels = { out:'注册', in:'链接注册', yk:'遥控', ao:'参数', param:'定值' };
var label = typeLabels[activeTab] || activeTab;
renderTabs();
renderHeaders();
renderTable();
if (!confirm('确定将 ' + items.length + ' 个信号添加到 ' + label + '')) return;
var searchInput = document.getElementById('dc-search');
if (searchInput) {
searchInput.oninput = function() {
searchText = this.value;
renderTable();
};
}
},
var succ = 0;
for (var i = 0; i < items.length; i++) {
var ok = WsClient.send({
saddr: items[i].saddr,
signal_type: activeTab,
curd: 'add',
setting_zone: '0',
signal_data: ''
});
if (ok) succ++;
}
alert('已发送 ' + succ + '/' + items.length + ' 个 add 请求到 ' + label);
}
onEnter: function() {
},
function renderHeaders() {
var thead = document.getElementById('dc-thead');
if (!thead) return;
var visible = getVisibleData();
var allChecked = visible.length > 0;
for (var i = 0; i < visible.length && allChecked; i++) {
if (!selectedSet[visible[i].saddr]) allChecked = false;
}
var html = '<th style="width:36px"><input type="checkbox" id="dc-cb-all"' + (allChecked ? ' checked' : '') + '></th>';
for (var j = 1; j < COLUMNS.length; j++) {
html += '<th>' + COLUMNS[j] + '</th>';
}
thead.innerHTML = html;
onLeave: function() {
allData = {};
},
var cbAll = document.getElementById('dc-cb-all');
if (cbAll) cbAll.onchange = onSelectAll;
}
onData: function(data) {
if (!data || typeof data !== 'object') return;
if (data.out) allData.out = data.out;
if (data.in) allData.in = data.in;
if (data.yk) allData.yk = data.yk;
if (data.ao) allData.ao = data.ao;
if (data.param) allData.param = data.param;
if (data.out || data.in || data.yk || data.ao || data.param) {
renderTable();
}
}
};
function renderTable() {
var data = getVisibleData();
var tbody = document.getElementById('dc-tbody');
if (!tbody) return;
var fullData = allData[activeTab] || [];
document.getElementById('dc-count').textContent = data.length + ' / ' + fullData.length;
if (data.length === 0) {
tbody.innerHTML = '<tr class="empty-row"><td colspan="' + COLUMNS.length + '">暂无数据</td></tr>';
return;
}
var html = '';
for (var i = 0; i < data.length; i++) {
var item = data[i];
var checked = !!selectedSet[item.saddr];
html += '<tr>'
+ '<td><input type="checkbox" class="dc-cb-row"' + (checked ? ' checked' : '') + ' data-saddr="' + fmtVal(item.saddr) + '"></td>'
+ '<td>' + fmtVal(item.id) + '</td>'
+ '<td>' + fmtVal(item.saddr) + '</td>'
+ '<td>' + fmtVal(item.desc) + '</td>'
+ '<td>' + fmtVal(item.type) + '</td>'
+ '<td>' + fmtVal(CTRL_TYPE_MAP[item.ctrl_type] || item.ctrl_type) + '</td>'
+ '<td style="max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap" title="' + fmtVal(item.link_saddrs) + '">' + fmtVal(item.link_saddrs) + '</td>'
+ '</tr>';
}
tbody.innerHTML = html;
// 绑定行复选框事件
var cbs = tbody.querySelectorAll('.dc-cb-row');
for (var k = 0; k < cbs.length; k++) {
cbs[k].onclick = function(e) {
e.stopPropagation();
onToggleRow(this.getAttribute('data-saddr'));
};
}
}
function renderTabs() {
var types = ['out', 'in', 'yk', 'ao', 'param'];
var labels = { out: '注册 (out)', in: '链接注册 (in)', yk: '遥控 (yk)', ao: '参数 (ao)', param: '定值 (param)' };
var el = document.getElementById('dc-tab-bar');
if (!el) return;
var html = '';
for (var i = 0; i < types.length; i++) {
var t = types[i];
var cls = t === activeTab ? 'dc-tab active' : 'dc-tab';
html += '<span class="' + cls + '" data-tab="' + t + '">' + labels[t] + '</span>';
}
el.innerHTML = html;
var tabs = el.querySelectorAll('.dc-tab');
for (var k = 0; k < tabs.length; k++) {
tabs[k].onclick = function() {
activeTab = this.getAttribute('data-tab');
searchText = '';
selectedSet = {};
document.getElementById('dc-search').value = '';
renderTabs();
renderHeaders();
renderTable();
updateSelectionBar();
};
}
}
return {
render: function(container) {
allData = {};
activeTab = 'out';
searchText = '';
selectedSet = {};
container.innerHTML = ''
+ '<div class="page-header"><h2>数据中心</h2><p>勾选信号后点击"添加到"即可添加至对应配置页 | 查看所有信号数据,按类型分表,支持搜索</p></div>'
+ '<div class="datacenter-toolbar">'
+ '<div class="dc-tab-bar" id="dc-tab-bar"></div>'
+ '<input type="text" class="dc-search" id="dc-search" placeholder="搜索 saddr 或 desc...">'
+ '<span class="dc-count" id="dc-count">0</span>'
+ '</div>'
+ '<div class="dc-sel-bar" id="dc-sel-bar" style="display:none">'
+ '<span class="dc-sel-label">已选 0 个信号</span>'
+ '<button class="btn btn-primary" id="dc-btn-add" style="margin-left:16px">添加到配置页</button>'
+ '</div>'
+ '<div class="table-card"><div class="table-wrapper">'
+ '<table class="signal-table"><thead><tr id="dc-thead"></tr></thead><tbody id="dc-tbody"></tbody></table>'
+ '</div></div>';
renderTabs();
renderHeaders();
renderTable();
var searchInput = document.getElementById('dc-search');
if (searchInput) {
searchInput.oninput = function() {
searchText = this.value;
renderHeaders();
renderTable();
};
}
var addBtn = document.getElementById('dc-btn-add');
if (addBtn) addBtn.onclick = doAddSelected;
},
onEnter: function() {},
onLeave: function() {
allData = {};
selectedSet = {};
},
onData: function(data) {
if (!data || typeof data !== 'object') return;
if (data.out) allData.out = data.out;
if (data.in) allData.in = data.in;
if (data.yk) allData.yk = data.yk;
if (data.ao) allData.ao = data.ao;
if (data.param) allData.param = data.param;
if (data.out || data.in || data.yk || data.ao || data.param) {
renderHeaders();
renderTable();
updateSelectionBar();
}
}
};
})();