diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml
index dee11b36..4931dadc 100644
--- a/.github/workflows/docker.yml
+++ b/.github/workflows/docker.yml
@@ -57,9 +57,9 @@ jobs:
docker tag snltty/linker-musl-x64:latest snltty/linker-musl:amd64 && \
docker push snltty/linker-musl:amd64 && \
docker manifest create snltty/linker-musl:latest snltty/linker-musl:amd64 snltty/linker-musl:arm64 snltty/linker-musl:arm && \
- docker manifest create snltty/linker-musl:v1.7.9 snltty/linker-musl:amd64 snltty/linker-musl:arm64 snltty/linker-musl:arm && \
+ docker manifest create snltty/linker-musl:v1.8.0 snltty/linker-musl:amd64 snltty/linker-musl:arm64 snltty/linker-musl:arm && \
docker manifest push snltty/linker-musl:latest && \
- docker manifest push snltty/linker-musl:v1.7.9 && \
+ docker manifest push snltty/linker-musl:v1.8.0 && \
docker pull --platform linux/arm/v7 snltty/linker-debian-arm:latest && \
docker tag snltty/linker-debian-arm:latest snltty/linker-debian:arm && \
docker push snltty/linker-debian:arm && \
@@ -70,6 +70,6 @@ jobs:
docker tag snltty/linker-debian-x64:latest snltty/linker-debian:amd64 && \
docker push snltty/linker-debian:amd64 && \
docker manifest create snltty/linker-debian:latest snltty/linker-debian:amd64 snltty/linker-debian:arm64 snltty/linker-debian:arm && \
- docker manifest create snltty/linker-debian:v1.7.9 snltty/linker-debian:amd64 snltty/linker-debian:arm64 snltty/linker-debian:arm && \
+ docker manifest create snltty/linker-debian:v1.8.0 snltty/linker-debian:amd64 snltty/linker-debian:arm64 snltty/linker-debian:arm && \
docker manifest push snltty/linker-debian:latest && \
- docker manifest push snltty/linker-debian:v1.7.9
\ No newline at end of file
+ docker manifest push snltty/linker-debian:v1.8.0
\ No newline at end of file
diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml
index aba0241f..d20d6089 100644
--- a/.github/workflows/dotnet.yml
+++ b/.github/workflows/dotnet.yml
@@ -33,11 +33,11 @@ jobs:
env:
GITHUB_TOKEN: ${{ secrets.ACTIONS_TOKEN }}
with:
- tag_name: v1.7.9
- release_name: v1.7.9.${{ steps.date.outputs.today }}
+ tag_name: v1.8.0
+ release_name: v1.8.0.${{ steps.date.outputs.today }}
draft: false
prerelease: false
- body: "1. 一些累计更新\r\n2. 优化安卓APP,启动网卡时申请VPN权限,有新路由时重建VPN\r\n3. 新增防火墙,用于网卡、端口转发、和socks5\r\n4. 优化重启清理数据,优化了网卡自启动问题\r\n5. 检测密钥是否正确\r\n6. 如果你设备很多,请尝试升级其中一个成功重启后再升级其它"
+ body: "1. 一些累计更新\r\n2. 增加NAT类型检测\r\n3. 优化内网穿透,SNAT转换,防火墙"
- name: publish projects
run: ./publish.bat "C:\\Android\\android-sdk"
- name: upload-win-x86-oss
@@ -49,7 +49,7 @@ jobs:
key-secret: ${{ secrets.ALIYUN_OSS_SECRET }}
bucket: ide-qbcode
asset-path: ./public/publish-zip/linker-win-x86.zip
- target-path: /downloads/linker/v1.7.9/linker-win-x86.zip
+ target-path: /downloads/linker/v1.8.0/linker-win-x86.zip
- name: upload-win-x86
id: upload-win-x86
uses: actions/upload-release-asset@master
@@ -69,7 +69,7 @@ jobs:
key-secret: ${{ secrets.ALIYUN_OSS_SECRET }}
bucket: ide-qbcode
asset-path: ./public/publish-zip/linker-win-x64.zip
- target-path: /downloads/linker/v1.7.9/linker-win-x64.zip
+ target-path: /downloads/linker/v1.8.0/linker-win-x64.zip
- name: upload-win-x64
id: upload-win-x64
uses: actions/upload-release-asset@master
@@ -89,7 +89,7 @@ jobs:
key-secret: ${{ secrets.ALIYUN_OSS_SECRET }}
bucket: ide-qbcode
asset-path: ./public/publish-zip/linker-win-arm64.zip
- target-path: /downloads/linker/v1.7.9/linker-win-arm64.zip
+ target-path: /downloads/linker/v1.8.0/linker-win-arm64.zip
- name: upload-win-arm64
id: upload-win-arm64
uses: actions/upload-release-asset@master
@@ -109,7 +109,7 @@ jobs:
key-secret: ${{ secrets.ALIYUN_OSS_SECRET }}
bucket: ide-qbcode
asset-path: ./public/publish-zip/linker-linux-x64.zip
- target-path: /downloads/linker/v1.7.9/linker-linux-x64.zip
+ target-path: /downloads/linker/v1.8.0/linker-linux-x64.zip
- name: upload-linux-x64
id: upload-linux-x64
uses: actions/upload-release-asset@master
@@ -129,7 +129,7 @@ jobs:
key-secret: ${{ secrets.ALIYUN_OSS_SECRET }}
bucket: ide-qbcode
asset-path: ./public/publish-zip/linker-linux-arm.zip
- target-path: /downloads/linker/v1.7.9/linker-linux-arm.zip
+ target-path: /downloads/linker/v1.8.0/linker-linux-arm.zip
- name: upload-linux-arm
id: upload-linux-arm
uses: actions/upload-release-asset@master
@@ -149,7 +149,7 @@ jobs:
key-secret: ${{ secrets.ALIYUN_OSS_SECRET }}
bucket: ide-qbcode
asset-path: ./public/publish-zip/linker-linux-arm64.zip
- target-path: /downloads/linker/v1.7.9/linker-linux-arm64.zip
+ target-path: /downloads/linker/v1.8.0/linker-linux-arm64.zip
- name: upload-linux-arm64
id: upload-linux-arm64
uses: actions/upload-release-asset@master
@@ -169,7 +169,7 @@ jobs:
key-secret: ${{ secrets.ALIYUN_OSS_SECRET }}
bucket: ide-qbcode
asset-path: ./public/publish-zip/linker-linux-musl-x64.zip
- target-path: /downloads/linker/v1.7.9/linker-linux-musl-x64.zip
+ target-path: /downloads/linker/v1.8.0/linker-linux-musl-x64.zip
- name: upload-linux-musl-x64
id: upload-linux-musl-x64
uses: actions/upload-release-asset@master
@@ -189,7 +189,7 @@ jobs:
key-secret: ${{ secrets.ALIYUN_OSS_SECRET }}
bucket: ide-qbcode
asset-path: ./public/publish-zip/linker-linux-musl-arm.zip
- target-path: /downloads/linker/v1.7.9/linker-linux-musl-arm.zip
+ target-path: /downloads/linker/v1.8.0/linker-linux-musl-arm.zip
- name: upload-linux-musl-arm
id: upload-linux-musl-arm
uses: actions/upload-release-asset@master
@@ -209,7 +209,7 @@ jobs:
key-secret: ${{ secrets.ALIYUN_OSS_SECRET }}
bucket: ide-qbcode
asset-path: ./public/publish-zip/linker-linux-musl-arm64.zip
- target-path: /downloads/linker/v1.7.9/linker-linux-musl-arm64.zip
+ target-path: /downloads/linker/v1.8.0/linker-linux-musl-arm64.zip
- name: upload-linux-musl-arm64
id: upload-linux-musl-arm64
uses: actions/upload-release-asset@master
@@ -259,7 +259,7 @@ jobs:
key-secret: ${{ secrets.ALIYUN_OSS_SECRET }}
bucket: ide-qbcode
asset-path: ./public/publish-zip/linker.apk
- target-path: /downloads/linker/v1.7.9/linker.apk
+ target-path: /downloads/linker/v1.8.0/linker.apk
- name: upload-apk
id: upload-apk
uses: actions/upload-release-asset@master
diff --git a/.github/workflows/ipk.yml b/.github/workflows/ipk.yml
index ee685bbc..cd81b3f5 100644
--- a/.github/workflows/ipk.yml
+++ b/.github/workflows/ipk.yml
@@ -44,7 +44,7 @@ jobs:
key-secret: ${{ secrets.ALIYUN_OSS_SECRET }}
bucket: ide-qbcode
asset-path: ./public/publish-ipk/x64/linker-x64.ipk
- target-path: /downloads/linker/v1.7.9/linker-x64.ipk
+ target-path: /downloads/linker/v1.8.0/linker-x64.ipk
- name: upload-x64
id: upload-x64
uses: actions/upload-release-asset@master
@@ -64,7 +64,7 @@ jobs:
key-secret: ${{ secrets.ALIYUN_OSS_SECRET }}
bucket: ide-qbcode
asset-path: ./public/publish-ipk/arm/linker-arm.ipk
- target-path: /downloads/linker/v1.7.9/linker-arm.ipk
+ target-path: /downloads/linker/v1.8.0/linker-arm.ipk
- name: upload-arm
id: upload-arm
uses: actions/upload-release-asset@master
@@ -84,7 +84,7 @@ jobs:
key-secret: ${{ secrets.ALIYUN_OSS_SECRET }}
bucket: ide-qbcode
asset-path: ./public/publish-ipk/arm64/linker-arm64.ipk
- target-path: /downloads/linker/v1.7.9/linker-arm64.ipk
+ target-path: /downloads/linker/v1.8.0/linker-arm64.ipk
- name: upload-arm64
id: upload-arm64
uses: actions/upload-release-asset@master
diff --git a/.github/workflows/nuget.yml b/.github/workflows/nuget.yml
index 505cd50c..a3b6a45a 100644
--- a/.github/workflows/nuget.yml
+++ b/.github/workflows/nuget.yml
@@ -83,31 +83,31 @@ jobs:
- name: Push
run: |
- dotnet nuget push ./src/linker.libs/bin/release/linker.libs.1.7.9.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
- dotnet nuget push ./src/linker.messenger/bin/release/linker.messenger.1.7.9.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
- dotnet nuget push ./src/linker.messenger.access/bin/release/linker.messenger.access.1.7.9.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
- dotnet nuget push ./src/linker.messenger.action/bin/release/linker.messenger.action.1.7.9.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
- dotnet nuget push ./src/linker.messenger.api/bin/release/linker.messenger.api.1.7.9.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
- dotnet nuget push ./src/linker.messenger.channel/bin/release/linker.messenger.channel.1.7.9.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
- dotnet nuget push ./src/linker.messenger.decenter/bin/release/linker.messenger.decenter.1.7.9.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
- dotnet nuget push ./src/linker.messenger.entry/bin/release/linker.messenger.entry.1.7.9.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
- dotnet nuget push ./src/linker.messenger.exroute/bin/release/linker.messenger.exroute.1.7.9.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
- dotnet nuget push ./src/linker.messenger.flow/bin/release/linker.messenger.flow.1.7.9.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
- dotnet nuget push ./src/linker.messenger.forward/bin/release/linker.messenger.forward.1.7.9.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
- dotnet nuget push ./src/linker.messenger.listen/bin/release/linker.messenger.listen.1.7.9.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
- dotnet nuget push ./src/linker.messenger.logger/bin/release/linker.messenger.logger.1.7.9.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
- dotnet nuget push ./src/linker.messenger.pcp/bin/release/linker.messenger.pcp.1.7.9.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
- dotnet nuget push ./src/linker.messenger.plan/bin/release/linker.messenger.plan.1.7.9.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
- dotnet nuget push ./src/linker.messenger.relay/bin/release/linker.messenger.relay.1.7.9.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
- dotnet nuget push ./src/linker.messenger.serializer.memorypack/bin/release/linker.messenger.serializer.memorypack.1.7.9.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
- dotnet nuget push ./src/linker.messenger.sforward/bin/release/linker.messenger.sforward.1.7.9.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
- dotnet nuget push ./src/linker.messenger.signin/bin/release/linker.messenger.signin.1.7.9.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
- dotnet nuget push ./src/linker.messenger.socks5/bin/release/linker.messenger.socks5.1.7.9.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
- dotnet nuget push ./src/linker.messenger.store.file/bin/release/linker.messenger.store.file.1.7.9.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
- dotnet nuget push ./src/linker.messenger.sync/bin/release/linker.messenger.sync.1.7.9.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
- dotnet nuget push ./src/linker.messenger.tunnel/bin/release/linker.messenger.tunnel.1.7.9.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
- dotnet nuget push ./src/linker.messenger.tuntap/bin/release/linker.messenger.tuntap.1.7.9.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
- dotnet nuget push ./src/linker.messenger.updater/bin/release/linker.messenger.updater.1.7.9.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
- dotnet nuget push ./src/linker.tun/bin/release/linker.tun.1.7.9.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
- dotnet nuget push ./src/linker.snat/bin/release/linker.snat.1.7.9.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
- dotnet nuget push ./src/linker.tunnel/bin/release/linker.tunnel.1.7.9.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
+ dotnet nuget push ./src/linker.libs/bin/release/linker.libs.1.8.0.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
+ dotnet nuget push ./src/linker.messenger/bin/release/linker.messenger.1.8.0.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
+ dotnet nuget push ./src/linker.messenger.access/bin/release/linker.messenger.access.1.8.0.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
+ dotnet nuget push ./src/linker.messenger.action/bin/release/linker.messenger.action.1.8.0.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
+ dotnet nuget push ./src/linker.messenger.api/bin/release/linker.messenger.api.1.8.0.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
+ dotnet nuget push ./src/linker.messenger.channel/bin/release/linker.messenger.channel.1.8.0.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
+ dotnet nuget push ./src/linker.messenger.decenter/bin/release/linker.messenger.decenter.1.8.0.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
+ dotnet nuget push ./src/linker.messenger.entry/bin/release/linker.messenger.entry.1.8.0.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
+ dotnet nuget push ./src/linker.messenger.exroute/bin/release/linker.messenger.exroute.1.8.0.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
+ dotnet nuget push ./src/linker.messenger.flow/bin/release/linker.messenger.flow.1.8.0.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
+ dotnet nuget push ./src/linker.messenger.forward/bin/release/linker.messenger.forward.1.8.0.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
+ dotnet nuget push ./src/linker.messenger.listen/bin/release/linker.messenger.listen.1.8.0.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
+ dotnet nuget push ./src/linker.messenger.logger/bin/release/linker.messenger.logger.1.8.0.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
+ dotnet nuget push ./src/linker.messenger.pcp/bin/release/linker.messenger.pcp.1.8.0.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
+ dotnet nuget push ./src/linker.messenger.plan/bin/release/linker.messenger.plan.1.8.0.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
+ dotnet nuget push ./src/linker.messenger.relay/bin/release/linker.messenger.relay.1.8.0.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
+ dotnet nuget push ./src/linker.messenger.serializer.memorypack/bin/release/linker.messenger.serializer.memorypack.1.8.0.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
+ dotnet nuget push ./src/linker.messenger.sforward/bin/release/linker.messenger.sforward.1.8.0.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
+ dotnet nuget push ./src/linker.messenger.signin/bin/release/linker.messenger.signin.1.8.0.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
+ dotnet nuget push ./src/linker.messenger.socks5/bin/release/linker.messenger.socks5.1.8.0.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
+ dotnet nuget push ./src/linker.messenger.store.file/bin/release/linker.messenger.store.file.1.8.0.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
+ dotnet nuget push ./src/linker.messenger.sync/bin/release/linker.messenger.sync.1.8.0.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
+ dotnet nuget push ./src/linker.messenger.tunnel/bin/release/linker.messenger.tunnel.1.8.0.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
+ dotnet nuget push ./src/linker.messenger.tuntap/bin/release/linker.messenger.tuntap.1.8.0.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
+ dotnet nuget push ./src/linker.messenger.updater/bin/release/linker.messenger.updater.1.8.0.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
+ dotnet nuget push ./src/linker.tun/bin/release/linker.tun.1.8.0.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
+ dotnet nuget push ./src/linker.snat/bin/release/linker.snat.1.8.0.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
+ dotnet nuget push ./src/linker.tunnel/bin/release/linker.tunnel.1.8.0.nupkg --source https://api.nuget.org/v3/index.json --skip-duplicate --api-key ${{ secrets.NUGET_KEY }} --no-symbols
diff --git a/README.md b/README.md
index 05f4aa7f..4c478519 100644
--- a/README.md
+++ b/README.md
@@ -59,7 +59,7 @@
##### 特色功能
- **网段映射:** 当多个设备不同的局域网使用相同的内网网段(如`192.168.1.0/24`)存在冲突时,网段映射可以让你继续顺利的使用点对网和网对网,例如配置`192.168.188.0/24->192.168.1.0/24`,就可以使用`192.168.188.2`访问`192.168.1.2`。
- **应用层NAT:** 内置了使用`WinDivert`实现的应用层NAT,即使在`win7/8,win server2008/2012`这样的老系统无法使用系统NAT时也可以顺利使用点对网和网对网。
-- **应用层防火墙** 内置了防火墙功能,应用于虚拟网卡、端口转发、socks5,可以精细控制客户端的访问权限,例如只允许A访问B的3389,其它客户端无法访问
+- **应用层防火墙:** 内置了防火墙功能,应用于虚拟网卡、端口转发、socks5,可以精细控制客户端的访问权限,例如只允许A访问B的3389,其它客户端无法访问
##### 其它特性
- **UI管理:** 简洁明了的web管理页面
@@ -84,8 +84,9 @@
请作者喝一杯咖啡,让作者更有动力更新代码

-## 🚀特别声明
+## 🚀特别说明
+本项目已加入 [DotNetGuide](https://github.com/YSGStudyHards/DotNetGuide) 列表。
本项目已加入 [dotNET China](https://gitee.com/dotnetchina) 组织。

\ No newline at end of file
diff --git a/publish-docker.sh b/publish-docker.sh
index af6b2574..0954828e 100644
--- a/publish-docker.sh
+++ b/publish-docker.sh
@@ -33,16 +33,16 @@ do
fi
done
cd public/publish/docker/linux-${p}-x64/${f}
- docker buildx build -f ${target}/public/publish/docker/linux-${p}-x64/${f}/Dockerfile-${p} --platform="linux/x86_64" --force-rm -t "${image}-${p}-x64:latest" -t "${image}-${p}-x64:v1.7.9" . --push
+ docker buildx build -f ${target}/public/publish/docker/linux-${p}-x64/${f}/Dockerfile-${p} --platform="linux/x86_64" --force-rm -t "${image}-${p}-x64:latest" -t "${image}-${p}-x64:v1.8.0" . --push
cd ../../../../../
cd public/publish/docker/linux-${p}-arm64/${f}
- docker buildx build -f ${target}/public/publish/docker/linux-${p}-arm64/${f}/Dockerfile-${p} --platform="linux/arm64" --force-rm -t "${image}-${p}-arm64:latest" -t "${image}-${p}-arm64:v1.7.9" . --push
+ docker buildx build -f ${target}/public/publish/docker/linux-${p}-arm64/${f}/Dockerfile-${p} --platform="linux/arm64" --force-rm -t "${image}-${p}-arm64:latest" -t "${image}-${p}-arm64:v1.8.0" . --push
cd ../../../../../
cd public/publish/docker/linux-${p}-arm/${f}
- docker buildx build -f ${target}/public/publish/docker/linux-${p}-arm/${f}/Dockerfile-${p} --platform="linux/arm/v7" --force-rm -t "${image}-${p}-arm:latest" -t "${image}-${p}-arm:v1.7.9" . --push
+ docker buildx build -f ${target}/public/publish/docker/linux-${p}-arm/${f}/Dockerfile-${p} --platform="linux/arm/v7" --force-rm -t "${image}-${p}-arm:latest" -t "${image}-${p}-arm:v1.8.0" . --push
cd ../../../../../
done
done
\ No newline at end of file
diff --git a/publish-ipk.sh b/publish-ipk.sh
index 6bee5ccc..b1a0d0b5 100644
--- a/publish-ipk.sh
+++ b/publish-ipk.sh
@@ -22,7 +22,7 @@ do
mkdir -p public/publish-ipk/${r}/data/usr/bin/linker
cp -rf public/publish/${r}/* public/publish-ipk/${r}/data/usr/bin/linker/
- sed -i "s|{version}|1.7.9|g" public/publish-ipk/${r}/control/control
+ sed -i "s|{version}|1.8.0|g" public/publish-ipk/${r}/control/control
sed -i 's/\r$//' public/publish-ipk/${r}/data/etc/init.d/linker
sed -i 's/\r$//' public/publish-ipk/${r}/control/control
sed -i 's/\r$//' public/publish-ipk/${r}/control/postinst
diff --git a/src/linker.app/linker.app.csproj b/src/linker.app/linker.app.csproj
index 13ff1ee7..fc98f5da 100644
--- a/src/linker.app/linker.app.csproj
+++ b/src/linker.app/linker.app.csproj
@@ -28,7 +28,7 @@
com.snltty.linker.app
linker.app
- 1.7.9
+ 1.8.0
snltty
snltty
snltty
@@ -38,7 +38,7 @@
linker
- 1.7.9
+ 1.8.0
1
11.0
diff --git a/src/linker.doc.web/static/robots.txt b/src/linker.doc.web/static/robots.txt
new file mode 100644
index 00000000..c01129b6
--- /dev/null
+++ b/src/linker.doc.web/static/robots.txt
@@ -0,0 +1,8 @@
+# START YOAST BLOCK
+# ---------------------------
+User-agent: *
+Disallow:
+
+Sitemap: https://blog.snltty.com/sitemap.xml
+# ---------------------------
+# END YOAST BLOCK
\ No newline at end of file
diff --git a/src/linker.libs/linker.libs.csproj b/src/linker.libs/linker.libs.csproj
index 6477eccc..d1f7b847 100644
--- a/src/linker.libs/linker.libs.csproj
+++ b/src/linker.libs/linker.libs.csproj
@@ -14,9 +14,9 @@
snltty
https://github.com/snltty/linker
https://github.com/snltty/linker
- 1.7.9
- 1.7.9
- 1.7.9
+ 1.8.0
+ 1.8.0
+ 1.8.0
full
diff --git a/src/linker.messenger.access/linker.messenger.access.csproj b/src/linker.messenger.access/linker.messenger.access.csproj
index 7cf77435..14b7b41a 100644
--- a/src/linker.messenger.access/linker.messenger.access.csproj
+++ b/src/linker.messenger.access/linker.messenger.access.csproj
@@ -16,9 +16,9 @@
https://github.com/snltty/linker
https://github.com/snltty/linker
linker messenger api access
- 1.7.9
- 1.7.9
- 1.7.9
+ 1.8.0
+ 1.8.0
+ 1.8.0
diff --git a/src/linker.messenger.action/linker.messenger.action.csproj b/src/linker.messenger.action/linker.messenger.action.csproj
index 2d353962..8b3cc182 100644
--- a/src/linker.messenger.action/linker.messenger.action.csproj
+++ b/src/linker.messenger.action/linker.messenger.action.csproj
@@ -16,9 +16,9 @@
https://github.com/snltty/linker
https://github.com/snltty/linker
linker messenger api action
- 1.7.9
- 1.7.9
- 1.7.9
+ 1.8.0
+ 1.8.0
+ 1.8.0
diff --git a/src/linker.messenger.api/linker.messenger.api.csproj b/src/linker.messenger.api/linker.messenger.api.csproj
index ad123838..7fd4d932 100644
--- a/src/linker.messenger.api/linker.messenger.api.csproj
+++ b/src/linker.messenger.api/linker.messenger.api.csproj
@@ -17,9 +17,9 @@
https://github.com/snltty/linker
https://github.com/snltty/linker
linker messenger api
- 1.7.9
- 1.7.9
- 1.7.9
+ 1.8.0
+ 1.8.0
+ 1.8.0
diff --git a/src/linker.messenger.channel/linker.messenger.channel.csproj b/src/linker.messenger.channel/linker.messenger.channel.csproj
index 727b736c..15833c56 100644
--- a/src/linker.messenger.channel/linker.messenger.channel.csproj
+++ b/src/linker.messenger.channel/linker.messenger.channel.csproj
@@ -16,9 +16,9 @@
https://github.com/snltty/linker
https://github.com/snltty/linker
linker messenger channel
- 1.7.9
- 1.7.9
- 1.7.9
+ 1.8.0
+ 1.8.0
+ 1.8.0
diff --git a/src/linker.messenger.decenter/linker.messenger.decenter.csproj b/src/linker.messenger.decenter/linker.messenger.decenter.csproj
index eed83fcd..d74eea3e 100644
--- a/src/linker.messenger.decenter/linker.messenger.decenter.csproj
+++ b/src/linker.messenger.decenter/linker.messenger.decenter.csproj
@@ -16,9 +16,9 @@
https://github.com/snltty/linker
https://github.com/snltty/linker
linker messenger decenter
- 1.7.9
- 1.7.9
- 1.7.9
+ 1.8.0
+ 1.8.0
+ 1.8.0
diff --git a/src/linker.messenger.entry/linker.messenger.entry.csproj b/src/linker.messenger.entry/linker.messenger.entry.csproj
index b32ae050..987dbb57 100644
--- a/src/linker.messenger.entry/linker.messenger.entry.csproj
+++ b/src/linker.messenger.entry/linker.messenger.entry.csproj
@@ -16,9 +16,9 @@
https://github.com/snltty/linker
https://github.com/snltty/linker
linker messenger entry
- 1.7.9
- 1.7.9
- 1.7.9
+ 1.8.0
+ 1.8.0
+ 1.8.0
diff --git a/src/linker.messenger.exroute/linker.messenger.exroute.csproj b/src/linker.messenger.exroute/linker.messenger.exroute.csproj
index e07e7ca5..545a22d6 100644
--- a/src/linker.messenger.exroute/linker.messenger.exroute.csproj
+++ b/src/linker.messenger.exroute/linker.messenger.exroute.csproj
@@ -16,9 +16,9 @@
https://github.com/snltty/linker
https://github.com/snltty/linker
linker messenger exroute
- 1.7.9
- 1.7.9
- 1.7.9
+ 1.8.0
+ 1.8.0
+ 1.8.0
diff --git a/src/linker.messenger.firewall/linker.messenger.firewall.csproj b/src/linker.messenger.firewall/linker.messenger.firewall.csproj
index 91940fbe..38440f89 100644
--- a/src/linker.messenger.firewall/linker.messenger.firewall.csproj
+++ b/src/linker.messenger.firewall/linker.messenger.firewall.csproj
@@ -17,9 +17,9 @@
https://github.com/snltty/linker
https://github.com/snltty/linker
linker messenger firewall
- 1.7.9
- 1.7.9
- 1.7.9
+ 1.8.0
+ 1.8.0
+ 1.8.0
diff --git a/src/linker.messenger.flow/linker.messenger.flow.csproj b/src/linker.messenger.flow/linker.messenger.flow.csproj
index 633fc630..8e3cbf9c 100644
--- a/src/linker.messenger.flow/linker.messenger.flow.csproj
+++ b/src/linker.messenger.flow/linker.messenger.flow.csproj
@@ -17,9 +17,9 @@
https://github.com/snltty/linker
https://github.com/snltty/linker
linker messenger flow
- 1.7.9
- 1.7.9
- 1.7.9
+ 1.8.0
+ 1.8.0
+ 1.8.0
diff --git a/src/linker.messenger.forward/linker.messenger.forward.csproj b/src/linker.messenger.forward/linker.messenger.forward.csproj
index c2e088a1..8fc85c09 100644
--- a/src/linker.messenger.forward/linker.messenger.forward.csproj
+++ b/src/linker.messenger.forward/linker.messenger.forward.csproj
@@ -17,9 +17,9 @@
https://github.com/snltty/linker
https://github.com/snltty/linker
linker messenger forward
- 1.7.9
- 1.7.9
- 1.7.9
+ 1.8.0
+ 1.8.0
+ 1.8.0
diff --git a/src/linker.messenger.forward/proxy/ForwardProxyUdp.cs b/src/linker.messenger.forward/proxy/ForwardProxyUdp.cs
index 9a6acfe1..1fcce52c 100644
--- a/src/linker.messenger.forward/proxy/ForwardProxyUdp.cs
+++ b/src/linker.messenger.forward/proxy/ForwardProxyUdp.cs
@@ -43,7 +43,7 @@ namespace linker.messenger.forward.proxy
}
private async Task ReceiveUdp(AsyncUserUdpToken token, byte buffersize)
{
- byte[] bytes = new byte[(1 << buffersize) * 1024];
+ byte[] bytes = new byte[65535];
IPEndPoint tempRemoteEP = new IPEndPoint(IPAddress.Any, IPEndPoint.MinPort);
while (true)
{
@@ -217,7 +217,7 @@ namespace linker.messenger.forward.proxy
TargetSocket = socket,
ConnectId = connectId,
Connection = tunnelToken.Connection,
- Buffer = new byte[(1 << tunnelToken.Proxy.BufferSize) * 1024]
+ Buffer = new byte[65535]
};
udpToken.Proxy.Direction = ProxyDirection.Reverse;
udpConnections.AddOrUpdate(connectId, udpToken, (a, b) => udpToken);
diff --git a/src/linker.messenger.listen/linker.messenger.listen.csproj b/src/linker.messenger.listen/linker.messenger.listen.csproj
index 84e0b5ec..336a7afa 100644
--- a/src/linker.messenger.listen/linker.messenger.listen.csproj
+++ b/src/linker.messenger.listen/linker.messenger.listen.csproj
@@ -17,9 +17,9 @@
https://github.com/snltty/linker
https://github.com/snltty/linker
linker messenger listen
- 1.7.9
- 1.7.9
- 1.7.9
+ 1.8.0
+ 1.8.0
+ 1.8.0
diff --git a/src/linker.messenger.logger/linker.messenger.logger.csproj b/src/linker.messenger.logger/linker.messenger.logger.csproj
index ff38ec6e..4f6e2245 100644
--- a/src/linker.messenger.logger/linker.messenger.logger.csproj
+++ b/src/linker.messenger.logger/linker.messenger.logger.csproj
@@ -16,9 +16,9 @@
https://github.com/snltty/linker
https://github.com/snltty/linker
linker messenger logger
- 1.7.9
- 1.7.9
- 1.7.9
+ 1.8.0
+ 1.8.0
+ 1.8.0
diff --git a/src/linker.messenger.pcp/linker.messenger.pcp.csproj b/src/linker.messenger.pcp/linker.messenger.pcp.csproj
index 9952b254..49986491 100644
--- a/src/linker.messenger.pcp/linker.messenger.pcp.csproj
+++ b/src/linker.messenger.pcp/linker.messenger.pcp.csproj
@@ -17,9 +17,9 @@
https://github.com/snltty/linker
https://github.com/snltty/linker
linker messenger pcp
- 1.7.9
- 1.7.9
- 1.7.9
+ 1.8.0
+ 1.8.0
+ 1.8.0
diff --git a/src/linker.messenger.plan/linker.messenger.plan.csproj b/src/linker.messenger.plan/linker.messenger.plan.csproj
index a422ff4f..60040b56 100644
--- a/src/linker.messenger.plan/linker.messenger.plan.csproj
+++ b/src/linker.messenger.plan/linker.messenger.plan.csproj
@@ -16,9 +16,9 @@
https://github.com/snltty/linker
https://github.com/snltty/linker
linker messenger plan
- 1.7.9
- 1.7.9
- 1.7.9
+ 1.8.0
+ 1.8.0
+ 1.8.0
diff --git a/src/linker.messenger.relay/linker.messenger.relay.csproj b/src/linker.messenger.relay/linker.messenger.relay.csproj
index 4215379e..382e314b 100644
--- a/src/linker.messenger.relay/linker.messenger.relay.csproj
+++ b/src/linker.messenger.relay/linker.messenger.relay.csproj
@@ -18,9 +18,9 @@
https://github.com/snltty/linker
https://github.com/snltty/linker
linker messenger relay
- 1.7.9
- 1.7.9
- 1.7.9
+ 1.8.0
+ 1.8.0
+ 1.8.0
diff --git a/src/linker.messenger.relay/server/RelayServerResolver.cs b/src/linker.messenger.relay/server/RelayServerResolver.cs
index 97ea949a..eb62f4cd 100644
--- a/src/linker.messenger.relay/server/RelayServerResolver.cs
+++ b/src/linker.messenger.relay/server/RelayServerResolver.cs
@@ -193,7 +193,7 @@ namespace linker.messenger.relay.server
{
if (relayDic.TryRemove(relayCache.FlowId, out TaskCompletionSource tcsAsk))
{
- tcsAsk.SetResult(socket);
+ tcsAsk.TrySetResult(socket);
}
else
{
@@ -202,11 +202,12 @@ namespace linker.messenger.relay.server
return;
}
+ TaskCompletionSource tcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
try
{
await socket.SendAsync(new byte[] { 0 }).ConfigureAwait(false);
- TaskCompletionSource tcs = new TaskCompletionSource();
+
relayDic.TryAdd(relayCache.FlowId, tcs);
Socket answerSocket = await tcs.Task.WaitAsync(TimeSpan.FromMilliseconds(15000)).ConfigureAwait(false);
@@ -220,6 +221,7 @@ namespace linker.messenger.relay.server
}
catch (Exception ex)
{
+ tcs.TrySetResult(null);
if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
LoggerHelper.Instance.Error($"{ex},flowid:{relayMessage.FlowId}");
relayDic.TryRemove(relayCache.FlowId, out _);
diff --git a/src/linker.messenger.serializer.memorypack/TunnelSerializer.cs b/src/linker.messenger.serializer.memorypack/TunnelSerializer.cs
index 96f45682..a4d19c4e 100644
--- a/src/linker.messenger.serializer.memorypack/TunnelSerializer.cs
+++ b/src/linker.messenger.serializer.memorypack/TunnelSerializer.cs
@@ -509,9 +509,11 @@ namespace linker.messenger.serializer.memorypack
double Lon => info.Lon;
[MemoryPackInclude]
string Isp => info.Isp;
+ [MemoryPackInclude]
+ string Nat => info.Nat;
[MemoryPackConstructor]
- SerializableTunnelNetInfo(string countryCode, string city, double lat, double lon, string isp)
+ SerializableTunnelNetInfo(string countryCode, string city, double lat, double lon, string isp, string nat)
{
var info = new TunnelNetInfo
{
@@ -519,7 +521,8 @@ namespace linker.messenger.serializer.memorypack
CountryCode = countryCode,
Isp = isp,
Lat = lat,
- Lon = lon
+ Lon = lon,
+ Nat = nat
};
this.info = info;
}
diff --git a/src/linker.messenger.serializer.memorypack/linker.messenger.serializer.memorypack.csproj b/src/linker.messenger.serializer.memorypack/linker.messenger.serializer.memorypack.csproj
index 90884aa4..cedde7e7 100644
--- a/src/linker.messenger.serializer.memorypack/linker.messenger.serializer.memorypack.csproj
+++ b/src/linker.messenger.serializer.memorypack/linker.messenger.serializer.memorypack.csproj
@@ -16,9 +16,9 @@
https://github.com/snltty/linker
https://github.com/snltty/linker
linker messenger serializer memorypack
- 1.7.9
- 1.7.9
- 1.7.9
+ 1.8.0
+ 1.8.0
+ 1.8.0
diff --git a/src/linker.messenger.sforward/linker.messenger.sforward.csproj b/src/linker.messenger.sforward/linker.messenger.sforward.csproj
index 8e7dca9a..b529c5ef 100644
--- a/src/linker.messenger.sforward/linker.messenger.sforward.csproj
+++ b/src/linker.messenger.sforward/linker.messenger.sforward.csproj
@@ -16,9 +16,9 @@
https://github.com/snltty/linker
https://github.com/snltty/linker
linker messenger sforward
- 1.7.9
- 1.7.9
- 1.7.9
+ 1.8.0
+ 1.8.0
+ 1.8.0
diff --git a/src/linker.messenger.sforward/proxy/SForwardProxyTcp.cs b/src/linker.messenger.sforward/proxy/SForwardProxyTcp.cs
index 03da3dde..975f6b93 100644
--- a/src/linker.messenger.sforward/proxy/SForwardProxyTcp.cs
+++ b/src/linker.messenger.sforward/proxy/SForwardProxyTcp.cs
@@ -115,7 +115,7 @@ namespace linker.plugins.sforward.proxy
ulong _id = buffer1.AsSpan(flagBytes.Length).ToUInt64();
if (tcpConnections.TryRemove(_id, out TaskCompletionSource _tcs))
{
- _tcs.SetResult(token.SourceSocket);
+ _tcs.TrySetResult(token.SourceSocket);
}
return;
}
@@ -149,7 +149,15 @@ namespace linker.plugins.sforward.proxy
//等待回复
TaskCompletionSource tcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
tcpConnections.TryAdd(id, tcs);
- token.TargetSocket = await tcs.Task.WaitAsync(TimeSpan.FromMilliseconds(5000)).ConfigureAwait(false);
+ try
+ {
+ token.TargetSocket = await tcs.Task.WaitAsync(TimeSpan.FromMilliseconds(5000)).ConfigureAwait(false);
+ }
+ catch (Exception)
+ {
+ CloseClientSocket(token);
+ return;
+ }
//数据
await token.TargetSocket.SendAsync(buffer1.AsMemory(0, length)).ConfigureAwait(false);
diff --git a/src/linker.messenger.sforward/proxy/SForwardProxyUdp.cs b/src/linker.messenger.sforward/proxy/SForwardProxyUdp.cs
index f896d3bd..8de32b60 100644
--- a/src/linker.messenger.sforward/proxy/SForwardProxyUdp.cs
+++ b/src/linker.messenger.sforward/proxy/SForwardProxyUdp.cs
@@ -45,7 +45,7 @@ namespace linker.plugins.sforward.proxy
{
try
{
- byte[] buffer = new byte[(1 << bufferSize) * 1024];
+ byte[] buffer = new byte[65535];
IPEndPoint tempRemoteEP = new IPEndPoint(IPAddress.Any, IPEndPoint.MinPort);
string portStr = token.ListenPort.ToString();
@@ -78,7 +78,7 @@ namespace linker.plugins.sforward.proxy
ulong _id = memory.Slice(flagBytes.Length).ToUInt64();
if (udptcss.TryRemove(_id, out TaskCompletionSource _tcs))
{
- _tcs.SetResult(source);
+ _tcs.TrySetResult(source);
}
continue;
}
@@ -91,7 +91,7 @@ namespace linker.plugins.sforward.proxy
int length = memory.Length;
byte[] buf = ArrayPool.Shared.Rent(length);
- memory.CopyTo(buffer);
+ memory.CopyTo(buf);
TimerHelper.Async(async () =>
{
@@ -103,13 +103,20 @@ namespace linker.plugins.sforward.proxy
TaskCompletionSource tcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
udptcss.TryAdd(id, tcs);
- IPEndPoint remote = await tcs.Task.WaitAsync(TimeSpan.FromMilliseconds(5000)).ConfigureAwait(false);
+ try
+ {
+ IPEndPoint remote = await tcs.Task.WaitAsync(TimeSpan.FromMilliseconds(5000)).ConfigureAwait(false);
- udpConnections.TryRemove(source, out _);
- udpConnections.TryAdd(source, new UdpTargetCache { IPEndPoint = remote });
- udpConnections.TryAdd(remote, new UdpTargetCache { IPEndPoint = source });
+ udpConnections.TryRemove(source, out _);
+ udpConnections.TryAdd(source, new UdpTargetCache { IPEndPoint = remote });
+ udpConnections.TryAdd(remote, new UdpTargetCache { IPEndPoint = source });
- await token.SourceSocket.SendToAsync(buf.AsMemory(0, length), remote).ConfigureAwait(false);
+ await token.SourceSocket.SendToAsync(buf.AsMemory(0, length), remote).ConfigureAwait(false);
+ }
+ catch (Exception)
+ {
+ tcs.TrySetResult(null);
+ }
}
}
catch (Exception ex)
@@ -180,7 +187,7 @@ namespace linker.plugins.sforward.proxy
//连接本地服务
Socket serviceUdp = null;
- buffer = new byte[(1 << bufferSize) * 1024];
+ buffer = new byte[65535];
IPEndPoint tempEp = new IPEndPoint(IPAddress.Any, IPEndPoint.MinPort);
UdpConnectedCache cache = new UdpConnectedCache { SourceSocket = serverUdp, TargetSocket = serviceUdp };
@@ -227,7 +234,7 @@ namespace linker.plugins.sforward.proxy
await serviceUdp.SendToAsync(memory, service).ConfigureAwait(false);
TimerHelper.Async(async () =>
{
- byte[] buffer = new byte[(1 << bufferSize) * 1024];
+ byte[] buffer = new byte[65535];
IPEndPoint tempEp = new IPEndPoint(IPAddress.Any, IPEndPoint.MinPort);
while (true)
{
diff --git a/src/linker.messenger.signin/linker.messenger.signin.csproj b/src/linker.messenger.signin/linker.messenger.signin.csproj
index c253d0e6..23ef3ca7 100644
--- a/src/linker.messenger.signin/linker.messenger.signin.csproj
+++ b/src/linker.messenger.signin/linker.messenger.signin.csproj
@@ -17,9 +17,9 @@
https://github.com/snltty/linker
https://github.com/snltty/linker
linker messenger signin
- 1.7.9
- 1.7.9
- 1.7.9
+ 1.8.0
+ 1.8.0
+ 1.8.0
diff --git a/src/linker.messenger.socks5/TunnelProxyUdp.cs b/src/linker.messenger.socks5/TunnelProxyUdp.cs
index 7626a733..9c8df5de 100644
--- a/src/linker.messenger.socks5/TunnelProxyUdp.cs
+++ b/src/linker.messenger.socks5/TunnelProxyUdp.cs
@@ -39,7 +39,7 @@ namespace linker.messenger.socks5
}
private async Task ReceiveUdp(AsyncUserUdpToken token, byte buffersize)
{
- byte[] bytes = new byte[(1 << buffersize) * 1024];
+ byte[] bytes = new byte[65535];
IPEndPoint tempRemoteEP = new IPEndPoint(IPAddress.Any, IPEndPoint.MinPort);
while (true)
{
@@ -201,7 +201,7 @@ namespace linker.messenger.socks5
TargetRealEP = target,
ConnectId = connectId,
Connection = tunnelToken.Connection,
- Buffer = new byte[(1 << tunnelToken.Proxy.BufferSize) * 1024]
+ Buffer = new byte[65535]
};
udpToken.Proxy.Direction = ProxyDirection.Reverse;
udpConnections.AddOrUpdate(connectId, udpToken, (a, b) => udpToken);
diff --git a/src/linker.messenger.socks5/linker.messenger.socks5.csproj b/src/linker.messenger.socks5/linker.messenger.socks5.csproj
index 4fdac433..40b8e251 100644
--- a/src/linker.messenger.socks5/linker.messenger.socks5.csproj
+++ b/src/linker.messenger.socks5/linker.messenger.socks5.csproj
@@ -16,9 +16,9 @@
https://github.com/snltty/linker
https://github.com/snltty/linker
linker messenger socks5
- 1.7.9
- 1.7.9
- 1.7.9
+ 1.8.0
+ 1.8.0
+ 1.8.0
diff --git a/src/linker.messenger.store.file/linker.messenger.store.file.csproj b/src/linker.messenger.store.file/linker.messenger.store.file.csproj
index 104c736f..a017eb4b 100644
--- a/src/linker.messenger.store.file/linker.messenger.store.file.csproj
+++ b/src/linker.messenger.store.file/linker.messenger.store.file.csproj
@@ -16,9 +16,9 @@
https://github.com/snltty/linker
https://github.com/snltty/linker
linker messenger store file
- 1.7.9
- 1.7.9
- 1.7.9
+ 1.8.0
+ 1.8.0
+ 1.8.0
diff --git a/src/linker.messenger.sync/linker.messenger.sync.csproj b/src/linker.messenger.sync/linker.messenger.sync.csproj
index eeefb966..826084fa 100644
--- a/src/linker.messenger.sync/linker.messenger.sync.csproj
+++ b/src/linker.messenger.sync/linker.messenger.sync.csproj
@@ -18,9 +18,9 @@
https://github.com/snltty/linker
https://github.com/snltty/linker
linker messenger sync
- 1.7.9
- 1.7.9
- 1.7.9
+ 1.8.0
+ 1.8.0
+ 1.8.0
diff --git a/src/linker.messenger.tunnel/Config.cs b/src/linker.messenger.tunnel/Config.cs
index 23bfde69..3298cf40 100644
--- a/src/linker.messenger.tunnel/Config.cs
+++ b/src/linker.messenger.tunnel/Config.cs
@@ -44,6 +44,7 @@ namespace linker.messenger.tunnel
public double Lat { get; set; }
public double Lon { get; set; }
public string Isp { get; set; } = string.Empty;
+ public string Nat { get; set; } = string.Empty;
}
public sealed partial class TunnelSetRouteLevelInfo
diff --git a/src/linker.messenger.tunnel/TunnelDecenter.cs b/src/linker.messenger.tunnel/TunnelDecenter.cs
index 34c6019a..ee441639 100644
--- a/src/linker.messenger.tunnel/TunnelDecenter.cs
+++ b/src/linker.messenger.tunnel/TunnelDecenter.cs
@@ -12,18 +12,17 @@ namespace linker.messenger.tunnel
public ConcurrentDictionary Config { get; } = new ConcurrentDictionary();
private readonly ITunnelClientStore tunnelClientStore;
- private readonly TunnelNetworkTransfer tunnelNetworkTransfer;
private readonly ISerializer serializer;
private readonly SignInClientState signInClientState;
public TunnelDecenter(ITunnelClientStore tunnelClientStore, TunnelNetworkTransfer tunnelNetworkTransfer, ISerializer serializer, SignInClientState signInClientState)
{
this.tunnelClientStore = tunnelClientStore;
- tunnelClientStore.OnChanged += Refresh;
- this.tunnelNetworkTransfer = tunnelNetworkTransfer;
this.serializer = serializer;
this.signInClientState = signInClientState;
+ tunnelClientStore.OnChanged += Refresh;
+ tunnelNetworkTransfer.OnChange += Refresh;
}
public void Refresh()
{
@@ -31,12 +30,14 @@ namespace linker.messenger.tunnel
}
public Memory GetData()
{
+ TunnelRouteLevelInfo tunnelRouteLevelInfo = GetLocalRouteLevel();
+ Config.AddOrUpdate(tunnelRouteLevelInfo.MachineId, tunnelRouteLevelInfo, (a, b) => tunnelRouteLevelInfo);
return serializer.Serialize(GetLocalRouteLevel());
}
public void AddData(Memory data)
{
- TunnelRouteLevelInfo tunnelTransportRouteLevelInfo = serializer.Deserialize(data.Span);
- Config.AddOrUpdate(tunnelTransportRouteLevelInfo.MachineId, tunnelTransportRouteLevelInfo, (a, b) => tunnelTransportRouteLevelInfo);
+ TunnelRouteLevelInfo tunnelRouteLevelInfo = serializer.Deserialize(data.Span);
+ Config.AddOrUpdate(tunnelRouteLevelInfo.MachineId, tunnelRouteLevelInfo, (a, b) => tunnelRouteLevelInfo);
}
public void AddData(List> data)
{
@@ -65,7 +66,7 @@ namespace linker.messenger.tunnel
PortMapWan = tunnelClientStore.PortMapPublic,
RouteLevelPlus = tunnelClientStore.RouteLevelPlus,
Net = tunnelClientStore.Network.Net
- };
+ };
}
}
}
diff --git a/src/linker.messenger.tunnel/TunnelNetworkTransfer.cs b/src/linker.messenger.tunnel/TunnelNetworkTransfer.cs
index a6451362..db2a81cd 100644
--- a/src/linker.messenger.tunnel/TunnelNetworkTransfer.cs
+++ b/src/linker.messenger.tunnel/TunnelNetworkTransfer.cs
@@ -2,6 +2,8 @@
using linker.libs.extends;
using linker.libs.timer;
using linker.messenger.signin;
+using linker.messenger.tunnel.stun.client;
+using linker.messenger.tunnel.stun.result;
using linker.tunnel;
using System.Net;
using System.Net.NetworkInformation;
@@ -20,6 +22,8 @@ namespace linker.messenger.tunnel
private readonly IMessengerSender messengerSender;
private readonly ISerializer serializer;
+ public Action OnChange { get; set; } = () => { };
+
public TunnelNetworkTransfer(ISignInClientStore signInClientStore, SignInClientState signInClientState, ITunnelClientStore tunnelClientStore, IMessengerSender messengerSender, ISerializer serializer, TunnelTransfer tunnelTransfer)
{
this.signInClientStore = signInClientStore;
@@ -28,7 +32,7 @@ namespace linker.messenger.tunnel
this.messengerSender = messengerSender;
this.serializer = serializer;
-
+
signInClientState.OnSignInSuccessBefore += async () => { RefreshRouteLevel(); tunnelTransfer.Refresh(); await Task.CompletedTask; };
TestQuic();
@@ -68,6 +72,8 @@ namespace linker.messenger.tunnel
TunnelNetInfo net = str.DeJson();
tunnelClientStore.Network.Net.Isp = net.Isp;
tunnelClientStore.Network.Net.CountryCode = net.CountryCode;
+
+ OnChange?.Invoke();
return true;
}
}
@@ -90,6 +96,7 @@ namespace linker.messenger.tunnel
tunnelClientStore.Network.Net.City = json["location"]["city"].ToString();
tunnelClientStore.Network.Net.Lat = double.Parse(json["location"]["latitude"].ToString());
tunnelClientStore.Network.Net.Lon = double.Parse(json["location"]["longitude"].ToString());
+ OnChange?.Invoke();
return true;
}
}
@@ -99,16 +106,49 @@ namespace linker.messenger.tunnel
}
return false;
}
+ private async Task TestNatTypeAsync()
+ {
+ try
+ {
+ IPEndPoint serverEP = NetworkHelper.GetEndPoint("stun.miwifi.com", 3478);
+
+ using StunClient3489 client = new(serverEP, new IPEndPoint(IPAddress.Any, 0), null);
+ await client.ConnectProxyAsync();
+ try
+ {
+ await client.QueryAsync();
+ }
+ finally
+ {
+ await client.CloseProxyAsync();
+ }
+
+ tunnelClientStore.Network.Net.Nat = client.State.NatType.ToString();
+
+ OnChange?.Invoke();
+ return true;
+ }
+ catch (Exception ex)
+ {
+ if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
+ {
+ LoggerHelper.Instance.Error(ex);
+ }
+ }
+ return false;
+ }
+
private void GetNet()
{
TimerHelper.Async(async () =>
{
- bool isp = false, city = false;
+ bool isp = false, city = false,nat = false;
for (int i = 0; i < 10; i++)
{
if (isp == false) isp = await GetIsp();
if (city == false) city = await GetPosition();
- if (isp && city)
+ if (nat == false) nat = await TestNatTypeAsync();
+ if (isp && city && nat)
{
break;
}
@@ -128,6 +168,30 @@ namespace linker.messenger.tunnel
});
}
+
+ public TunnelLocalNetworkInfo GetLocalNetwork()
+ {
+ return new TunnelLocalNetworkInfo
+ {
+ MachineId = signInClientState.Connection?.Id ?? string.Empty,
+ HostName = Dns.GetHostName(),
+ Lans = GetInterfaces(),
+ Routes = tunnelClientStore.Network.RouteIPs,
+ };
+ }
+ private static byte[] ipv6LocalBytes = new byte[] { 254, 128, 0, 0, 0, 0, 0, 0 };
+ private TunnelInterfaceInfo[] GetInterfaces()
+ {
+ return NetworkInterface.GetAllNetworkInterfaces().Select(c => new TunnelInterfaceInfo
+ {
+ Name = c.Name,
+ Desc = c.Description,
+ Mac = Regex.Replace(c.GetPhysicalAddress().ToString(), @"(.{2})", $"$1-").Trim('-'),
+ Ips = c.GetIPProperties().UnicastAddresses.Select(c => c.Address).Where(c => c.AddressFamily == AddressFamily.InterNetwork || (c.AddressFamily == AddressFamily.InterNetworkV6 && c.GetAddressBytes().AsSpan(0, 8).SequenceEqual(ipv6LocalBytes) == false)).ToArray()
+ }).Where(c => c.Ips.Length > 0 && c.Ips.Any(d => d.Equals(IPAddress.Loopback)) == false).ToArray();
+ }
+
+
private void TestQuic()
{
if (OperatingSystem.IsWindows())
@@ -168,29 +232,5 @@ namespace linker.messenger.tunnel
}
}
}
-
-
- public TunnelLocalNetworkInfo GetLocalNetwork()
- {
- return new TunnelLocalNetworkInfo
- {
- MachineId = signInClientState.Connection?.Id ?? string.Empty,
- HostName = Dns.GetHostName(),
- Lans = GetInterfaces(),
- Routes = tunnelClientStore.Network.RouteIPs,
- };
- }
- private static byte[] ipv6LocalBytes = new byte[] { 254, 128, 0, 0, 0, 0, 0, 0 };
- private TunnelInterfaceInfo[] GetInterfaces()
- {
- return NetworkInterface.GetAllNetworkInterfaces().Select(c => new TunnelInterfaceInfo
- {
- Name = c.Name,
- Desc = c.Description,
- Mac = Regex.Replace(c.GetPhysicalAddress().ToString(), @"(.{2})", $"$1-").Trim('-'),
- Ips = c.GetIPProperties().UnicastAddresses.Select(c => c.Address).Where(c => c.AddressFamily == AddressFamily.InterNetwork || (c.AddressFamily == AddressFamily.InterNetworkV6 && c.GetAddressBytes().AsSpan(0, 8).SequenceEqual(ipv6LocalBytes) == false)).ToArray()
- }).Where(c => c.Ips.Length > 0 && c.Ips.Any(d => d.Equals(IPAddress.Loopback)) == false).ToArray();
- }
-
}
}
diff --git a/src/linker.messenger.tunnel/linker.messenger.tunnel.csproj b/src/linker.messenger.tunnel/linker.messenger.tunnel.csproj
index 5911917d..b8762b21 100644
--- a/src/linker.messenger.tunnel/linker.messenger.tunnel.csproj
+++ b/src/linker.messenger.tunnel/linker.messenger.tunnel.csproj
@@ -16,9 +16,9 @@
https://github.com/snltty/linker
https://github.com/snltty/linker
linker messenger tunnel
- 1.7.9
- 1.7.9
- 1.7.9
+ 1.8.0
+ 1.8.0
+ 1.8.0
diff --git a/src/linker.messenger.tunnel/stun/HostnameEndpoint.cs b/src/linker.messenger.tunnel/stun/HostnameEndpoint.cs
new file mode 100644
index 00000000..d2693d65
--- /dev/null
+++ b/src/linker.messenger.tunnel/stun/HostnameEndpoint.cs
@@ -0,0 +1,75 @@
+using System.Diagnostics.CodeAnalysis;
+using System.Net;
+using System.Net.Sockets;
+
+namespace linker.messenger.tunnel.stun;
+
+public class HostnameEndpoint
+{
+ public string Hostname { get; }
+ public ushort Port { get; }
+
+ private HostnameEndpoint(string host, ushort port)
+ {
+ Hostname = host;
+ Port = port;
+ }
+
+ public static bool TryParse(string s, [NotNullWhen(true)] out HostnameEndpoint? result, ushort defaultPort = 0)
+ {
+ result = null;
+ if (string.IsNullOrEmpty(s))
+ {
+ return false;
+ }
+
+ int hostLength = s.Length;
+ int pos = s.LastIndexOf(':');
+
+ if (pos > 0)
+ {
+ if (s[pos - 1] is ']')
+ {
+ hostLength = pos;
+ }
+ else if (s.AsSpan(0, pos).LastIndexOf(':') is -1)
+ {
+ hostLength = pos;
+ }
+ }
+
+ string host = s[..hostLength];
+ UriHostNameType type = Uri.CheckHostName(host);
+ switch (type)
+ {
+ case UriHostNameType.Dns:
+ case UriHostNameType.IPv4:
+ case UriHostNameType.IPv6:
+ {
+ break;
+ }
+ default:
+ {
+ return false;
+ }
+ }
+
+ if (hostLength == s.Length || ushort.TryParse(s.AsSpan(hostLength + 1), out defaultPort))
+ {
+ result = new HostnameEndpoint(host, defaultPort);
+ return true;
+ }
+
+ return false;
+ }
+
+ public override string ToString()
+ {
+ if (IPAddress.TryParse(Hostname, out IPAddress? ip) && ip.AddressFamily is AddressFamily.InterNetworkV6)
+ {
+ return $@"[{ip}]:{Port}";
+ }
+
+ return $@"{Hostname}:{Port}";
+ }
+}
diff --git a/src/linker.messenger.tunnel/stun/StunServer.cs b/src/linker.messenger.tunnel/stun/StunServer.cs
new file mode 100644
index 00000000..2fc04568
--- /dev/null
+++ b/src/linker.messenger.tunnel/stun/StunServer.cs
@@ -0,0 +1,51 @@
+using System.Diagnostics.CodeAnalysis;
+using System.Net;
+using System.Net.Sockets;
+
+namespace linker.messenger.tunnel.stun;
+
+public class StunServer
+{
+ public string Hostname { get; }
+ public ushort Port { get; }
+
+ public const ushort DefaultPort = 3478;
+ public const ushort DefaultTlsPort = 5349;
+
+ public StunServer()
+ {
+ Hostname = @"stun.miwifi.com";
+ Port = DefaultPort;
+ }
+
+ private StunServer(string hostname, ushort port)
+ {
+ Hostname = hostname;
+ Port = port;
+ }
+
+ public static bool TryParse(string s, [NotNullWhen(true)] out StunServer? result, ushort defaultPort = DefaultPort)
+ {
+ if (!HostnameEndpoint.TryParse(s, out HostnameEndpoint? host, defaultPort))
+ {
+ result = null;
+ return false;
+ }
+
+ result = new StunServer(host.Hostname, host.Port);
+ return true;
+ }
+
+ public override string ToString()
+ {
+ if (Port is DefaultPort)
+ {
+ return Hostname;
+ }
+ if (IPAddress.TryParse(Hostname, out IPAddress? ip) && ip.AddressFamily is AddressFamily.InterNetworkV6)
+ {
+ return $@"[{ip}]:{Port}";
+ }
+ return $@"{Hostname}:{Port}";
+ }
+}
diff --git a/src/linker.messenger.tunnel/stun/client/IStunClient.cs b/src/linker.messenger.tunnel/stun/client/IStunClient.cs
new file mode 100644
index 00000000..ce40a88a
--- /dev/null
+++ b/src/linker.messenger.tunnel/stun/client/IStunClient.cs
@@ -0,0 +1,6 @@
+namespace linker.messenger.tunnel.stun.client;
+
+public interface IStunClient : IDisposable
+{
+ ValueTask QueryAsync(CancellationToken cancellationToken = default);
+}
diff --git a/src/linker.messenger.tunnel/stun/client/IUdpStunClient.cs b/src/linker.messenger.tunnel/stun/client/IUdpStunClient.cs
new file mode 100644
index 00000000..712cee4e
--- /dev/null
+++ b/src/linker.messenger.tunnel/stun/client/IUdpStunClient.cs
@@ -0,0 +1,6 @@
+namespace linker.messenger.tunnel.stun.client;
+
+public interface IUdpStunClient : IStunClient
+{
+ TimeSpan ReceiveTimeout { get; set; }
+}
diff --git a/src/linker.messenger.tunnel/stun/client/StunClient3489.cs b/src/linker.messenger.tunnel/stun/client/StunClient3489.cs
new file mode 100644
index 00000000..7adbcb6d
--- /dev/null
+++ b/src/linker.messenger.tunnel/stun/client/StunClient3489.cs
@@ -0,0 +1,230 @@
+using linker.messenger.tunnel.stun.enums;
+using linker.messenger.tunnel.stun.messages;
+using linker.messenger.tunnel.stun.proxy;
+using linker.messenger.tunnel.stun.result;
+using linker.messenger.tunnel.stun.utils;
+using System.Buffers;
+using System.Diagnostics;
+using System.Net;
+using System.Net.Sockets;
+
+namespace linker.messenger.tunnel.stun.client;
+
+///
+/// https://tools.ietf.org/html/rfc3489#section-10.1
+///
+public class StunClient3489 : IUdpStunClient
+{
+ public virtual IPEndPoint LocalEndPoint => (IPEndPoint)_proxy.Client.LocalEndPoint!;
+
+ public TimeSpan ReceiveTimeout { get; set; } = TimeSpan.FromSeconds(3);
+
+ private readonly IPEndPoint _remoteEndPoint;
+
+ private readonly IUdpProxy _proxy;
+
+ public ClassicStunResult State { get; private set; } = new();
+
+ public StunClient3489(IPEndPoint server, IPEndPoint local, IUdpProxy proxy = null)
+ {
+ _proxy = proxy ?? new NoneUdpProxy(local);
+
+ _remoteEndPoint = server;
+
+ State.LocalEndPoint = local;
+ }
+
+ public async ValueTask ConnectProxyAsync(CancellationToken cancellationToken = default)
+ {
+ using CancellationTokenSource cts = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken);
+ cts.CancelAfter(ReceiveTimeout);
+
+ await _proxy.ConnectAsync(cts.Token);
+ }
+
+ public async ValueTask CloseProxyAsync(CancellationToken cancellationToken = default)
+ {
+ await _proxy.CloseAsync(cancellationToken);
+ }
+
+ public async ValueTask QueryAsync(CancellationToken cancellationToken = default)
+ {
+ State = new ClassicStunResult();
+
+ // test I
+ StunResponse response1 = await Test1Async(cancellationToken);
+ if (response1 is null)
+ {
+ State.NatType = NatType.UdpBlocked;
+ return;
+ }
+
+ State.LocalEndPoint = response1.Local;
+
+ IPEndPoint mappedAddress1 = response1.Message.GetMappedAddressAttribute();
+ IPEndPoint changedAddress = response1.Message.GetChangedAddressAttribute();
+
+ State.PublicEndPoint = mappedAddress1; // 显示 test I 得到的映射地址
+
+ // 某些单 IP 服务器的迷惑操作
+ if (mappedAddress1 is null || changedAddress is null
+ || Equals(changedAddress.Address, response1.Remote.Address)
+ || changedAddress.Port == response1.Remote.Port)
+ {
+ State.NatType = NatType.UnsupportedServer;
+ return;
+ }
+
+ // test II
+ StunResponse response2 = await Test2Async(changedAddress, cancellationToken);
+ IPEndPoint mappedAddress2 = response2?.Message.GetMappedAddressAttribute();
+
+ if (response2 is not null)
+ {
+ // 有些单 IP 服务器并不能测 NAT 类型
+ if (Equals(response1.Remote.Address, response2.Remote.Address) || response1.Remote.Port == response2.Remote.Port)
+ {
+ State.NatType = NatType.UnsupportedServer;
+ State.PublicEndPoint = mappedAddress2;
+ return;
+ }
+ }
+
+ // is Public IP == link's IP?
+ if (Equals(mappedAddress1, response1.Local))
+ {
+ // No NAT
+ if (response2 is null)
+ {
+
+ State.NatType = NatType.SymmetricUdpFirewall;
+ State.PublicEndPoint = mappedAddress1;
+ }
+ else
+ {
+ State.NatType = NatType.OpenInternet;
+ State.PublicEndPoint = mappedAddress2;
+ }
+ return;
+ }
+
+ // NAT
+ if (response2 is not null)
+ {
+ State.NatType = NatType.FullCone;
+ State.PublicEndPoint = mappedAddress2;
+ return;
+ }
+
+ // Test I(#2)
+ StunResponse response12 = await Test1_2Async(changedAddress, cancellationToken);
+ IPEndPoint mappedAddress12 = response12.Message.GetMappedAddressAttribute();
+
+ if (mappedAddress12 is null)
+ {
+ State.NatType = NatType.Unknown;
+ return;
+ }
+
+ if (!Equals(mappedAddress12, mappedAddress1))
+ {
+ State.NatType = NatType.Symmetric;
+ State.PublicEndPoint = mappedAddress12;
+ return;
+ }
+
+ // Test III
+ StunResponse response3 = await Test3Async(cancellationToken);
+ if (response3 is not null)
+ {
+ IPEndPoint mappedAddress3 = response3.Message.GetMappedAddressAttribute();
+ if (mappedAddress3 is not null
+ && Equals(response3.Remote.Address, response1.Remote.Address)
+ && response3.Remote.Port != response1.Remote.Port)
+ {
+ State.NatType = NatType.RestrictedCone;
+ State.PublicEndPoint = mappedAddress3;
+ return;
+ }
+ }
+
+ State.NatType = NatType.PortRestrictedCone;
+ State.PublicEndPoint = mappedAddress12;
+ }
+
+ private async ValueTask RequestAsync(StunMessage5389 sendMessage, IPEndPoint remote, IPEndPoint receive, CancellationToken cancellationToken)
+ {
+ try
+ {
+ using IMemoryOwner memoryOwner = MemoryPool.Shared.Rent(0x10000);
+ Memory buffer = memoryOwner.Memory;
+ int length = sendMessage.WriteTo(buffer.Span);
+
+ await _proxy.SendToAsync(buffer[..length], SocketFlags.None, remote, cancellationToken);
+
+ using CancellationTokenSource cts = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken);
+ cts.CancelAfter(ReceiveTimeout);
+ SocketReceiveMessageFromResult r = await _proxy.ReceiveMessageFromAsync(buffer, SocketFlags.None, receive, cts.Token);
+
+ StunMessage5389 message = new();
+ if (message.TryParse(buffer[..r.ReceivedBytes]) && message.IsSameTransaction(sendMessage))
+ {
+ return new StunResponse(message, (IPEndPoint)r.RemoteEndPoint, new IPEndPoint(r.PacketInformation.Address, ((IPEndPoint)_proxy.Client.LocalEndPoint!).Port));
+ }
+ }
+ catch (OperationCanceledException ex)
+ {
+ Debug.WriteLine(ex);
+ }
+ return default;
+ }
+
+ public virtual async ValueTask Test1Async(CancellationToken cancellationToken)
+ {
+ StunMessage5389 message = new()
+ {
+ StunMessageType = StunMessageType.BindingRequest,
+ MagicCookie = 0
+ };
+ return await RequestAsync(message, _remoteEndPoint, _remoteEndPoint, cancellationToken);
+ }
+
+ public virtual async ValueTask Test2Async(IPEndPoint other, CancellationToken cancellationToken)
+ {
+ StunMessage5389 message = new()
+ {
+ StunMessageType = StunMessageType.BindingRequest,
+ MagicCookie = 0,
+ Attributes = new[] { AttributeExtensions.BuildChangeRequest(true, true) }
+ };
+ return await RequestAsync(message, _remoteEndPoint, other, cancellationToken);
+ }
+
+ public virtual async ValueTask Test1_2Async(IPEndPoint other, CancellationToken cancellationToken)
+ {
+ StunMessage5389 message = new()
+ {
+ StunMessageType = StunMessageType.BindingRequest,
+ MagicCookie = 0
+ };
+ return await RequestAsync(message, other, other, cancellationToken);
+ }
+
+ public virtual async ValueTask Test3Async(CancellationToken cancellationToken)
+ {
+ StunMessage5389 message = new()
+ {
+ StunMessageType = StunMessageType.BindingRequest,
+ MagicCookie = 0,
+ Attributes = new[] { AttributeExtensions.BuildChangeRequest(false, true) }
+ };
+ return await RequestAsync(message, _remoteEndPoint, _remoteEndPoint, cancellationToken);
+ }
+
+ public void Dispose()
+ {
+ _proxy.Dispose();
+
+ GC.SuppressFinalize(this);
+ }
+}
diff --git a/src/linker.messenger.tunnel/stun/enums/AttributeType.cs b/src/linker.messenger.tunnel/stun/enums/AttributeType.cs
new file mode 100644
index 00000000..a6c3ea11
--- /dev/null
+++ b/src/linker.messenger.tunnel/stun/enums/AttributeType.cs
@@ -0,0 +1,42 @@
+namespace linker.messenger.tunnel.stun.enums;
+
+///
+/// STUN Attribute Registry
+///
+///
+/// https://tools.ietf.org/html/rfc3489#section-11.2
+/// https://tools.ietf.org/html/rfc5389#section-18.2
+/// https://tools.ietf.org/html/rfc5780#section-9.1
+/// https://tools.ietf.org/html/rfc8489#section-18.3
+///
+public enum AttributeType : ushort
+{
+ Useless = 0x0000,
+ MappedAddress = 0x0001,
+ ResponseAddress = 0x0002,
+ ChangeRequest = 0x0003,
+ SourceAddress = 0x0004,
+ ChangedAddress = 0x0005,
+ Username = 0x0006,
+ Password = 0x0007,
+ MessageIntegrity = 0x0008,
+ ErrorCode = 0x0009,
+ UnknownAttribute = 0x000A,
+ ReflectedFrom = 0x000B,
+ Realm = 0x0014,
+ Nonce = 0x0015,
+ MessageIntegritySha256 = 0x001C,
+ PasswordAlgorithm = 0x001D,
+ UserHash = 0x001E,
+ XorMappedAddress = 0x0020,
+ Padding = 0x0026,
+ ResponsePort = 0x0027,
+ PasswordAlgorithms = 0x8002,
+ AlternateDomain = 0x8003,
+ Software = 0x8022,
+ AlternateServer = 0x8023,
+ CacheTimeout = 0x8027,
+ Fingerprint = 0x8028,
+ ResponseOrigin = 0x802B,
+ OtherAddress = 0x802C,
+}
diff --git a/src/linker.messenger.tunnel/stun/enums/BindingTestResult.cs b/src/linker.messenger.tunnel/stun/enums/BindingTestResult.cs
new file mode 100644
index 00000000..649b3a1b
--- /dev/null
+++ b/src/linker.messenger.tunnel/stun/enums/BindingTestResult.cs
@@ -0,0 +1,9 @@
+namespace linker.messenger.tunnel.stun.enums;
+
+public enum BindingTestResult
+{
+ Unknown,
+ UnsupportedServer,
+ Success,
+ Fail
+}
diff --git a/src/linker.messenger.tunnel/stun/enums/Class.cs b/src/linker.messenger.tunnel/stun/enums/Class.cs
new file mode 100644
index 00000000..6ee7f345
--- /dev/null
+++ b/src/linker.messenger.tunnel/stun/enums/Class.cs
@@ -0,0 +1,9 @@
+namespace linker.messenger.tunnel.stun.enums;
+
+internal enum Class : ushort
+{
+ Request = 0b00000_0_000_0_0000,
+ Indication = 0b00000_0_000_1_0000,
+ SuccessResponse = 0b00000_1_000_0_0000,
+ ErrorResponse = 0b00000_1_000_1_0000,
+}
diff --git a/src/linker.messenger.tunnel/stun/enums/FilteringBehavior.cs b/src/linker.messenger.tunnel/stun/enums/FilteringBehavior.cs
new file mode 100644
index 00000000..91769883
--- /dev/null
+++ b/src/linker.messenger.tunnel/stun/enums/FilteringBehavior.cs
@@ -0,0 +1,15 @@
+namespace linker.messenger.tunnel.stun.enums;
+
+public enum FilteringBehavior
+{
+ Unknown,
+ UnsupportedServer,
+ EndpointIndependent,
+ AddressDependent,
+ AddressAndPortDependent,
+
+ ///
+ /// Filtering test applies only to UDP.
+ ///
+ None
+}
diff --git a/src/linker.messenger.tunnel/stun/enums/IpFamily.cs b/src/linker.messenger.tunnel/stun/enums/IpFamily.cs
new file mode 100644
index 00000000..58fbb0ac
--- /dev/null
+++ b/src/linker.messenger.tunnel/stun/enums/IpFamily.cs
@@ -0,0 +1,10 @@
+namespace linker.messenger.tunnel.stun.enums;
+
+///
+/// https://tools.ietf.org/html/rfc5389#section-15.1
+///
+public enum IpFamily : byte
+{
+ IPv4 = 0x01,
+ IPv6 = 0x02
+}
diff --git a/src/linker.messenger.tunnel/stun/enums/MappingBehavior.cs b/src/linker.messenger.tunnel/stun/enums/MappingBehavior.cs
new file mode 100644
index 00000000..19e3ec2a
--- /dev/null
+++ b/src/linker.messenger.tunnel/stun/enums/MappingBehavior.cs
@@ -0,0 +1,12 @@
+namespace linker.messenger.tunnel.stun.enums;
+
+public enum MappingBehavior
+{
+ Unknown,
+ UnsupportedServer,
+ Direct,
+ EndpointIndependent,
+ AddressDependent,
+ AddressAndPortDependent,
+ Fail
+}
diff --git a/src/linker.messenger.tunnel/stun/enums/Method.cs b/src/linker.messenger.tunnel/stun/enums/Method.cs
new file mode 100644
index 00000000..fd7c5166
--- /dev/null
+++ b/src/linker.messenger.tunnel/stun/enums/Method.cs
@@ -0,0 +1,7 @@
+namespace linker.messenger.tunnel.stun.enums;
+
+internal enum Method : ushort
+{
+ Binding = 0b00000_0_000_0_0001,
+ SharedSecret = 0b00000_0_000_0_0010,
+}
diff --git a/src/linker.messenger.tunnel/stun/enums/NatType.cs b/src/linker.messenger.tunnel/stun/enums/NatType.cs
new file mode 100644
index 00000000..d2272dc2
--- /dev/null
+++ b/src/linker.messenger.tunnel/stun/enums/NatType.cs
@@ -0,0 +1,65 @@
+namespace linker.messenger.tunnel.stun.enums;
+
+///
+/// https://tools.ietf.org/html/rfc3489#section-5
+/// https://tools.ietf.org/html/rfc3489#section-10.1
+///
+public enum NatType
+{
+ ///
+ /// Unknown
+ ///
+ Unknown,
+
+ ///
+ /// Server is not unsupported for testing NAT type
+ ///
+ UnsupportedServer,
+
+ ///
+ /// UDP is always blocked.
+ ///
+ UdpBlocked,
+
+ ///
+ /// No NAT, public IP, no firewall.
+ ///
+ OpenInternet,
+
+ ///
+ /// No NAT, public IP, but symmetric UDP firewall.
+ ///
+ SymmetricUdpFirewall,
+
+ ///
+ /// A full cone NAT is one where all requests from the same internal IP address and port are
+ /// mapped to the same external IP address and port. Furthermore, any external host can send
+ /// a packet to the internal host, by sending a packet to the mapped external address.
+ ///
+ FullCone,
+
+ ///
+ /// A restricted cone NAT is one where all requests from the same internal IP address and
+ /// port are mapped to the same external IP address and port. Unlike a full cone NAT, an external
+ /// host (with IP address X) can send a packet to the internal host only if the internal host
+ /// had previously sent a packet to IP address X.
+ ///
+ RestrictedCone,
+
+ ///
+ /// A port restricted cone NAT is like a restricted cone NAT, but the restriction
+ /// includes port numbers. Specifically, an external host can send a packet, with source IP
+ /// address X and source port P, to the internal host only if the internal host had previously
+ /// sent a packet to IP address X and port P.
+ ///
+ PortRestrictedCone,
+
+ ///
+ /// A symmetric NAT is one where all requests from the same internal IP address and port,
+ /// to a specific destination IP address and port, are mapped to the same external IP address and
+ /// port. If the same host sends a packet with the same source address and port, but to
+ /// a different destination, a different mapping is used. Furthermore, only the external host that
+ /// receives a packet can send a UDP packet back to the internal host.
+ ///
+ Symmetric
+}
diff --git a/src/linker.messenger.tunnel/stun/enums/ProxyType.cs b/src/linker.messenger.tunnel/stun/enums/ProxyType.cs
new file mode 100644
index 00000000..890fbcc2
--- /dev/null
+++ b/src/linker.messenger.tunnel/stun/enums/ProxyType.cs
@@ -0,0 +1,7 @@
+namespace linker.messenger.tunnel.stun.enums;
+
+public enum ProxyType
+{
+ Plain = 0,
+ Socks5 = 1
+}
diff --git a/src/linker.messenger.tunnel/stun/enums/StunMessageType.cs b/src/linker.messenger.tunnel/stun/enums/StunMessageType.cs
new file mode 100644
index 00000000..df658d9f
--- /dev/null
+++ b/src/linker.messenger.tunnel/stun/enums/StunMessageType.cs
@@ -0,0 +1,40 @@
+namespace linker.messenger.tunnel.stun.enums;
+
+///
+/// This enum specifies STUN message type.
+///
+///
+/// https://tools.ietf.org/html/rfc5389#section-6
+///
+public enum StunMessageType : ushort
+{
+ ///
+ /// STUN message is binding request.
+ ///
+ BindingRequest = Class.Request | Method.Binding,
+
+ ///
+ /// STUN message is binding request success response.
+ ///
+ BindingResponse = Class.SuccessResponse | Method.Binding,
+
+ ///
+ /// STUN message is binding request error response.
+ ///
+ BindingErrorResponse = Class.ErrorResponse | Method.Binding,
+
+ ///
+ /// STUN message is "shared secret" request.
+ ///
+ SharedSecretRequest = Class.Request | Method.SharedSecret,
+
+ ///
+ /// STUN message is "shared secret" request success response.
+ ///
+ SharedSecretResponse = Class.SuccessResponse | Method.SharedSecret,
+
+ ///
+ /// STUN message is "shared secret" request error response.
+ ///
+ SharedSecretErrorResponse = Class.ErrorResponse | Method.SharedSecret,
+}
diff --git a/src/linker.messenger.tunnel/stun/enums/TransportType.cs b/src/linker.messenger.tunnel/stun/enums/TransportType.cs
new file mode 100644
index 00000000..5181426f
--- /dev/null
+++ b/src/linker.messenger.tunnel/stun/enums/TransportType.cs
@@ -0,0 +1,9 @@
+namespace linker.messenger.tunnel.stun.enums;
+
+public enum TransportType
+{
+ Udp,
+ Tcp,
+ Tls,
+ Dtls,
+}
diff --git a/src/linker.messenger.tunnel/stun/messages/AddressStunAttributeValue.cs b/src/linker.messenger.tunnel/stun/messages/AddressStunAttributeValue.cs
new file mode 100644
index 00000000..9f0e5cdb
--- /dev/null
+++ b/src/linker.messenger.tunnel/stun/messages/AddressStunAttributeValue.cs
@@ -0,0 +1,74 @@
+using linker.messenger.tunnel.stun.enums;
+using System.Buffers.Binary;
+using System.Net;
+using System.Net.Sockets;
+
+namespace linker.messenger.tunnel.stun.messages;
+
+///
+/// https://tools.ietf.org/html/rfc5389#section-15.1
+///
+public abstract class AddressStunAttributeValue : IStunAttributeValue
+{
+ public IpFamily Family { get; set; }
+
+ public ushort Port { get; set; }
+
+ public IPAddress Address { get; set; }
+
+ public virtual int WriteTo(Span buffer)
+ {
+ buffer[0] = 0;
+ buffer[1] = (byte)Family;
+ BinaryPrimitives.WriteUInt16BigEndian(buffer[2..], Port);
+ Address.TryWriteBytes(buffer[4..], out int bytesWritten);
+
+
+ return 4 + bytesWritten;
+ }
+
+ public virtual bool TryParse(ReadOnlySpan buffer)
+ {
+ int length = 4;
+
+ if (buffer.Length < length)
+ {
+ return false;
+ }
+
+ Family = (IpFamily)buffer[1];
+
+ switch (Family)
+ {
+ case IpFamily.IPv4:
+ length += 4;
+ break;
+ case IpFamily.IPv6:
+ length += 16;
+ break;
+ default:
+ return false;
+ }
+
+ if (buffer.Length != length)
+ {
+ return false;
+ }
+
+ Port = BinaryPrimitives.ReadUInt16BigEndian(buffer[2..]);
+
+ Address = new IPAddress(buffer[4..]);
+
+ return true;
+ }
+
+ public override string? ToString()
+ {
+ return Address?.AddressFamily switch
+ {
+ AddressFamily.InterNetwork => $@"{Address}:{Port}",
+ AddressFamily.InterNetworkV6 => $@"[{Address}]:{Port}",
+ _ => base.ToString()
+ };
+ }
+}
diff --git a/src/linker.messenger.tunnel/stun/messages/ChangeRequestStunAttributeValue.cs b/src/linker.messenger.tunnel/stun/messages/ChangeRequestStunAttributeValue.cs
new file mode 100644
index 00000000..cf88f733
--- /dev/null
+++ b/src/linker.messenger.tunnel/stun/messages/ChangeRequestStunAttributeValue.cs
@@ -0,0 +1,35 @@
+using Microsoft;
+
+namespace linker.messenger.tunnel.stun.messages;
+
+///
+/// https://tools.ietf.org/html/rfc5780#section-7.2
+///
+public class ChangeRequestStunAttributeValue : IStunAttributeValue
+{
+ public bool ChangeIp { get; set; }
+
+ public bool ChangePort { get; set; }
+
+ public int WriteTo(Span buffer)
+ {
+ buffer[0] = buffer[1] = buffer[2] = 0;
+
+ buffer[3] = (byte)(Convert.ToInt32(ChangeIp) << 2 | Convert.ToInt32(ChangePort) << 1);
+
+ return 4;
+ }
+
+ public bool TryParse(ReadOnlySpan buffer)
+ {
+ if (buffer.Length != 4)
+ {
+ return false;
+ }
+
+ ChangeIp = Convert.ToBoolean(buffer[3] >> 2 & 1);
+ ChangePort = Convert.ToBoolean(buffer[3] >> 1 & 1);
+
+ return true;
+ }
+}
diff --git a/src/linker.messenger.tunnel/stun/messages/ChangedAddressStunAttributeValue.cs b/src/linker.messenger.tunnel/stun/messages/ChangedAddressStunAttributeValue.cs
new file mode 100644
index 00000000..cddd0a4b
--- /dev/null
+++ b/src/linker.messenger.tunnel/stun/messages/ChangedAddressStunAttributeValue.cs
@@ -0,0 +1,6 @@
+namespace linker.messenger.tunnel.stun.messages;
+
+///
+/// https://tools.ietf.org/html/rfc3489#section-11.2.3
+///
+public class ChangedAddressStunAttributeValue : AddressStunAttributeValue;
diff --git a/src/linker.messenger.tunnel/stun/messages/ErrorCodeStunAttributeValue.cs b/src/linker.messenger.tunnel/stun/messages/ErrorCodeStunAttributeValue.cs
new file mode 100644
index 00000000..02186e9c
--- /dev/null
+++ b/src/linker.messenger.tunnel/stun/messages/ErrorCodeStunAttributeValue.cs
@@ -0,0 +1,45 @@
+using System.Text;
+
+namespace linker.messenger.tunnel.stun.messages;
+
+///
+/// https://tools.ietf.org/html/rfc5389#section-15.6
+///
+public class ErrorCodeStunAttributeValue : IStunAttributeValue
+{
+ public ushort ErrorCode { get; set; }
+ public string ReasonPhrase { get; set; } = string.Empty;
+
+ public byte Class => (byte)(ErrorCode % 1000 / 100);
+ public byte Number => (byte)(ErrorCode % 100);
+
+ public const int MaxReasonPhraseBytesLength = 762;
+
+ public int WriteTo(Span buffer)
+ {
+ buffer[0] = buffer[1] = 0;
+ buffer[2] = Class;
+ buffer[3] = Number;
+
+ int length = Encoding.UTF8.GetBytes(ReasonPhrase, buffer[4..]);
+
+ return 4 + Math.Min(length, MaxReasonPhraseBytesLength);
+ }
+
+ public bool TryParse(ReadOnlySpan buffer)
+ {
+ if (buffer.Length is < 4 or > (4 + MaxReasonPhraseBytesLength))
+ {
+ return false;
+ }
+
+ byte @class = (byte)(buffer[2] & 0b111);
+ ushort number = Math.Min(buffer[3], (ushort)99);
+
+ ErrorCode = (ushort)(@class * 100 + number);
+
+ ReasonPhrase = Encoding.UTF8.GetString(buffer[4..]);
+
+ return true;
+ }
+}
diff --git a/src/linker.messenger.tunnel/stun/messages/IStunAttributeValue.cs b/src/linker.messenger.tunnel/stun/messages/IStunAttributeValue.cs
new file mode 100644
index 00000000..c73e38c6
--- /dev/null
+++ b/src/linker.messenger.tunnel/stun/messages/IStunAttributeValue.cs
@@ -0,0 +1,8 @@
+namespace linker.messenger.tunnel.stun.messages;
+
+public interface IStunAttributeValue
+{
+ int WriteTo(Span buffer);
+
+ bool TryParse(ReadOnlySpan buffer);
+}
diff --git a/src/linker.messenger.tunnel/stun/messages/MappedAddressStunAttributeValue.cs b/src/linker.messenger.tunnel/stun/messages/MappedAddressStunAttributeValue.cs
new file mode 100644
index 00000000..2b006fb5
--- /dev/null
+++ b/src/linker.messenger.tunnel/stun/messages/MappedAddressStunAttributeValue.cs
@@ -0,0 +1,6 @@
+namespace linker.messenger.tunnel.stun.messages;
+
+///
+/// https://tools.ietf.org/html/rfc5389#section-15.1
+///
+public class MappedAddressStunAttributeValue : AddressStunAttributeValue;
diff --git a/src/linker.messenger.tunnel/stun/messages/OtherAddressStunAttributeValue.cs b/src/linker.messenger.tunnel/stun/messages/OtherAddressStunAttributeValue.cs
new file mode 100644
index 00000000..c1fceaee
--- /dev/null
+++ b/src/linker.messenger.tunnel/stun/messages/OtherAddressStunAttributeValue.cs
@@ -0,0 +1,6 @@
+namespace linker.messenger.tunnel.stun.messages;
+
+///
+/// https://tools.ietf.org/html/rfc5780#section-7.4
+///
+public class OtherAddressStunAttributeValue : AddressStunAttributeValue;
diff --git a/src/linker.messenger.tunnel/stun/messages/ReflectedFromStunAttributeValue.cs b/src/linker.messenger.tunnel/stun/messages/ReflectedFromStunAttributeValue.cs
new file mode 100644
index 00000000..b49d43af
--- /dev/null
+++ b/src/linker.messenger.tunnel/stun/messages/ReflectedFromStunAttributeValue.cs
@@ -0,0 +1,6 @@
+namespace linker.messenger.tunnel.stun.messages;
+
+///
+/// https://tools.ietf.org/html/rfc3489#section-11.2.11
+///
+public class ReflectedFromStunAttributeValue : AddressStunAttributeValue;
diff --git a/src/linker.messenger.tunnel/stun/messages/ResponseAddressStunAttributeValue.cs b/src/linker.messenger.tunnel/stun/messages/ResponseAddressStunAttributeValue.cs
new file mode 100644
index 00000000..fa80abc7
--- /dev/null
+++ b/src/linker.messenger.tunnel/stun/messages/ResponseAddressStunAttributeValue.cs
@@ -0,0 +1,6 @@
+namespace linker.messenger.tunnel.stun.messages;
+
+///
+/// https://tools.ietf.org/html/rfc3489#section-11.2.2
+///
+public class ResponseAddressStunAttributeValue : AddressStunAttributeValue;
diff --git a/src/linker.messenger.tunnel/stun/messages/SourceAddressStunAttributeValue.cs b/src/linker.messenger.tunnel/stun/messages/SourceAddressStunAttributeValue.cs
new file mode 100644
index 00000000..62b5f1a7
--- /dev/null
+++ b/src/linker.messenger.tunnel/stun/messages/SourceAddressStunAttributeValue.cs
@@ -0,0 +1,6 @@
+namespace linker.messenger.tunnel.stun.messages;
+
+///
+/// https://tools.ietf.org/html/rfc3489#section-11.2.5
+///
+public class SourceAddressStunAttributeValue : AddressStunAttributeValue;
diff --git a/src/linker.messenger.tunnel/stun/messages/StunAttribute.cs b/src/linker.messenger.tunnel/stun/messages/StunAttribute.cs
new file mode 100644
index 00000000..2c6c9618
--- /dev/null
+++ b/src/linker.messenger.tunnel/stun/messages/StunAttribute.cs
@@ -0,0 +1,89 @@
+using linker.messenger.tunnel.stun.enums;
+using System.Buffers.Binary;
+using System.Security.Cryptography;
+
+namespace linker.messenger.tunnel.stun.messages;
+
+///
+/// https://tools.ietf.org/html/rfc5389#section-15
+///
+public class StunAttribute
+{
+ /*
+ Length 是大端
+ 必须4字节对齐
+ 对齐的字节可以是任意值
+ 0 1 2 3
+ 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Type | Length |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Value (variable) ....
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+
+ public AttributeType Type { get; set; } = AttributeType.Useless;
+
+ public ushort Length { get; set; }
+
+ public ushort RealLength => (ushort)(Type == AttributeType.Useless ? 0 : 4 + Length + (4 - Length % 4) % 4);
+
+ public IStunAttributeValue Value { get; set; } = new UselessStunAttributeValue();
+
+ public int WriteTo(Span buffer)
+ {
+ int length = 4 + Length;
+ int n = (4 - length % 4) % 4; // 填充的字节数
+ int totalLength = length + n;
+
+ BinaryPrimitives.WriteUInt16BigEndian(buffer, (ushort)Type);
+ BinaryPrimitives.WriteUInt16BigEndian(buffer[2..], Length);
+ int valueLength = Value.WriteTo(buffer[4..]);
+
+ RandomNumberGenerator.Fill(buffer.Slice(length, n));
+
+ return totalLength;
+ }
+
+ ///
+ /// Parse 成功字节,0 则表示 Parse 失败
+ ///
+ public int TryParse(ReadOnlySpan buffer, ReadOnlySpan magicCookieAndTransactionId)
+ {
+ if (buffer.Length < 4)
+ {
+ return default;
+ }
+
+ Type = (AttributeType)BinaryPrimitives.ReadUInt16BigEndian(buffer);
+
+ Length = BinaryPrimitives.ReadUInt16BigEndian(buffer[2..]);
+
+ if (buffer.Length < 4 + Length)
+ {
+ return default;
+ }
+
+ ReadOnlySpan value = buffer.Slice(4, Length);
+
+ IStunAttributeValue t = Type switch
+ {
+ AttributeType.MappedAddress => new MappedAddressStunAttributeValue(),
+ AttributeType.XorMappedAddress => new XorMappedAddressStunAttributeValue(magicCookieAndTransactionId),
+ AttributeType.ResponseAddress => new ResponseAddressStunAttributeValue(),
+ AttributeType.ChangeRequest => new ChangeRequestStunAttributeValue(),
+ AttributeType.SourceAddress => new SourceAddressStunAttributeValue(),
+ AttributeType.ChangedAddress => new ChangedAddressStunAttributeValue(),
+ AttributeType.OtherAddress => new OtherAddressStunAttributeValue(),
+ AttributeType.ReflectedFrom => new ReflectedFromStunAttributeValue(),
+ AttributeType.ErrorCode => new ErrorCodeStunAttributeValue(),
+ _ => new UselessStunAttributeValue()
+ };
+ if (t.TryParse(value))
+ {
+ Value = t;
+ }
+
+ return 4 + Length + (4 - Length % 4) % 4; // 对齐
+ }
+}
diff --git a/src/linker.messenger.tunnel/stun/messages/StunMessage5389.cs b/src/linker.messenger.tunnel/stun/messages/StunMessage5389.cs
new file mode 100644
index 00000000..247d6707
--- /dev/null
+++ b/src/linker.messenger.tunnel/stun/messages/StunMessage5389.cs
@@ -0,0 +1,156 @@
+using linker.messenger.tunnel.stun.enums;
+using System.Buffers;
+using System.Buffers.Binary;
+using System.Diagnostics;
+using System.Security.Cryptography;
+
+namespace linker.messenger.tunnel.stun.messages;
+
+///
+/// https://tools.ietf.org/html/rfc5389#section-6
+///
+public class StunMessage5389
+{
+ #region Header
+
+ private const int SizeOfMessageType = sizeof(StunMessageType);
+ private const int SizeOfLength = sizeof(ushort);
+ private const int SizeOfMagicCookie = sizeof(uint);
+ private const int SizeOfTransactionId = 12;
+ public const int HeaderLength = SizeOfMessageType + SizeOfLength + SizeOfMagicCookie + SizeOfTransactionId;
+
+ public StunMessageType StunMessageType { get; set; }
+
+ public uint MagicCookie { get; set; }
+
+ public byte[] TransactionId { get; }
+
+ #endregion
+
+ public IEnumerable Attributes { get; set; }
+
+ public ushort MessageLength => (ushort)Attributes.Sum(x => x.RealLength);
+ public int Length => HeaderLength + MessageLength;
+
+ public StunMessage5389()
+ {
+ Attributes = Array.Empty();
+ StunMessageType = StunMessageType.BindingRequest;
+ MagicCookie = 0x2112A442;
+ TransactionId = new byte[SizeOfTransactionId];
+ RandomNumberGenerator.Fill(TransactionId);
+ }
+
+ public int WriteTo(Span buffer)
+ {
+ ushort messageLength = MessageLength;
+ int length = Length;
+
+ BinaryPrimitives.WriteUInt16BigEndian(buffer, (ushort)StunMessageType);
+ BinaryPrimitives.WriteUInt16BigEndian(buffer[SizeOfMessageType..], messageLength);
+ BinaryPrimitives.WriteUInt32BigEndian(buffer[(SizeOfMessageType + SizeOfLength)..], MagicCookie);
+ TransactionId.CopyTo(buffer[(SizeOfMessageType + SizeOfLength + SizeOfMagicCookie)..]);
+
+ buffer = buffer[HeaderLength..];
+ foreach (StunAttribute attribute in Attributes)
+ {
+ int outLength = attribute.WriteTo(buffer);
+ buffer = buffer[outLength..];
+ }
+
+ return length;
+ }
+
+ public bool TryParse(ReadOnlyMemory buffer)
+ {
+ ReadOnlySequence sequence = new(buffer);
+ return TryParse(ref sequence);
+ }
+
+ public bool TryParse(ref ReadOnlySequence sequence)
+ {
+ if (sequence.Length < HeaderLength)
+ {
+ return false; // Check length
+ }
+
+ SequenceReader reader = new(sequence);
+
+ if (!reader.TryReadBigEndian(out short typeValue))
+ {
+ return false;
+ }
+
+ StunMessageType type = (StunMessageType)(ushort)(typeValue & 0b0011_1111_1111_1111);
+
+ if (!Enum.IsDefined(type))
+ {
+ return false;
+ }
+
+ StunMessageType = type;
+
+ if (!reader.TryReadBigEndian(out short lengthValue))
+ {
+ return false;
+ }
+
+ ushort length = (ushort)lengthValue;
+
+ if (sequence.Length - HeaderLength < length)
+ {
+ return false; // Check length
+ }
+
+ if (!reader.TryReadBigEndian(out int magicCookie))
+ {
+ return false;
+ }
+
+ MagicCookie = (uint)magicCookie;
+
+ reader.UnreadSequence.Slice(0, SizeOfTransactionId).CopyTo(TransactionId);
+ reader.Advance(SizeOfTransactionId);
+
+ byte[] tempBuffer = ArrayPool.Shared.Rent(length + SizeOfMagicCookie + SizeOfTransactionId);
+ try
+ {
+ reader.UnreadSequence.Slice(0, length).CopyTo(tempBuffer);
+ reader.Advance(length);
+ sequence.Slice(SizeOfMessageType + SizeOfLength, SizeOfMagicCookie + SizeOfTransactionId).CopyTo(tempBuffer.AsSpan(length));
+
+ List list = new();
+
+ Span attributeBuffer = tempBuffer.AsSpan(0, length);
+ ReadOnlySpan magicCookieAndTransactionId = tempBuffer.AsSpan(length, SizeOfMagicCookie + SizeOfTransactionId);
+
+ while (attributeBuffer.Length > default(int))
+ {
+ StunAttribute attribute = new();
+ int offset = attribute.TryParse(attributeBuffer, magicCookieAndTransactionId);
+ if (offset <= default(int))
+ {
+ Debug.WriteLine($@"[Warning] Ignore wrong attribute: {Convert.ToHexString(attributeBuffer)}");
+ break;
+ }
+
+ list.Add(attribute);
+ attributeBuffer = attributeBuffer[offset..];
+ }
+
+ Attributes = list;
+ }
+ finally
+ {
+ ArrayPool.Shared.Return(tempBuffer);
+ }
+
+ sequence = reader.UnreadSequence;
+ return true;
+ }
+
+ public bool IsSameTransaction(StunMessage5389 other)
+ {
+ return MagicCookie == other.MagicCookie && TransactionId.AsSpan().SequenceEqual(other.TransactionId);
+ }
+}
diff --git a/src/linker.messenger.tunnel/stun/messages/StunResponse.cs b/src/linker.messenger.tunnel/stun/messages/StunResponse.cs
new file mode 100644
index 00000000..5854f43c
--- /dev/null
+++ b/src/linker.messenger.tunnel/stun/messages/StunResponse.cs
@@ -0,0 +1,10 @@
+using System.Net;
+
+namespace linker.messenger.tunnel.stun.messages;
+
+public record StunResponse(StunMessage5389 Message, IPEndPoint Remote, IPEndPoint Local)
+{
+ public StunMessage5389 Message { get; set; } = Message;
+ public IPEndPoint Remote { get; set; } = Remote;
+ public IPEndPoint Local { get; set; } = Local;
+}
diff --git a/src/linker.messenger.tunnel/stun/messages/UnknownStunAttributeValue.cs b/src/linker.messenger.tunnel/stun/messages/UnknownStunAttributeValue.cs
new file mode 100644
index 00000000..b177e30f
--- /dev/null
+++ b/src/linker.messenger.tunnel/stun/messages/UnknownStunAttributeValue.cs
@@ -0,0 +1,43 @@
+using linker.messenger.tunnel.stun.enums;
+using System.Buffers.Binary;
+
+namespace linker.messenger.tunnel.stun.messages;
+
+///
+/// https://tools.ietf.org/html/rfc5389#section-15.9
+///
+public class UnknownStunAttributeValue : IStunAttributeValue
+{
+ public List Types { get; } = new();
+
+ public int WriteTo(Span buffer)
+ {
+ int size = Types.Count << 1;
+
+ foreach (AttributeType attributeType in Types)
+ {
+ BinaryPrimitives.WriteUInt16BigEndian(buffer, (ushort)attributeType);
+ buffer = buffer[sizeof(ushort)..];
+ }
+
+ return size;
+ }
+
+ public bool TryParse(ReadOnlySpan buffer)
+ {
+ if (buffer.Length < 2 || (buffer.Length & 1) == 1)
+ {
+ return false;
+ }
+
+ Types.Clear();
+ while (!buffer.IsEmpty)
+ {
+ ushort type = BinaryPrimitives.ReadUInt16BigEndian(buffer);
+ Types.Add((AttributeType)type);
+ buffer = buffer[sizeof(ushort)..];
+ }
+
+ return true;
+ }
+}
diff --git a/src/linker.messenger.tunnel/stun/messages/UselessStunAttributeValue.cs b/src/linker.messenger.tunnel/stun/messages/UselessStunAttributeValue.cs
new file mode 100644
index 00000000..e0a758c2
--- /dev/null
+++ b/src/linker.messenger.tunnel/stun/messages/UselessStunAttributeValue.cs
@@ -0,0 +1,17 @@
+namespace linker.messenger.tunnel.stun.messages;
+
+///
+/// 无法理解的属性
+///
+public class UselessStunAttributeValue : IStunAttributeValue
+{
+ public int WriteTo(Span buffer)
+ {
+ throw new NotSupportedException();
+ }
+
+ public bool TryParse(ReadOnlySpan buffer)
+ {
+ return true;
+ }
+}
diff --git a/src/linker.messenger.tunnel/stun/messages/XorMappedAddressStunAttributeValue.cs b/src/linker.messenger.tunnel/stun/messages/XorMappedAddressStunAttributeValue.cs
new file mode 100644
index 00000000..a60e422c
--- /dev/null
+++ b/src/linker.messenger.tunnel/stun/messages/XorMappedAddressStunAttributeValue.cs
@@ -0,0 +1,65 @@
+using Microsoft;
+using System.Buffers.Binary;
+using System.Net;
+
+namespace linker.messenger.tunnel.stun.messages;
+
+///
+/// https://tools.ietf.org/html/rfc5389#section-15.2
+///
+public class XorMappedAddressStunAttributeValue : AddressStunAttributeValue
+{
+ private readonly byte[] _magicCookieAndTransactionId;
+
+ public XorMappedAddressStunAttributeValue(ReadOnlySpan magicCookieAndTransactionId)
+ {
+ _magicCookieAndTransactionId = magicCookieAndTransactionId.ToArray();
+ }
+
+ public override int WriteTo(Span buffer)
+ {
+ buffer[0] = 0;
+ buffer[1] = (byte)Family;
+ BinaryPrimitives.WriteUInt16BigEndian(buffer[2..], Xor(Port));
+ Xor(Address).TryWriteBytes(buffer[4..], out int bytesWritten);
+
+ return 4 + bytesWritten;
+ }
+
+ public override bool TryParse(ReadOnlySpan buffer)
+ {
+ if (!base.TryParse(buffer))
+ {
+ return false;
+ }
+
+ Port = Xor(Port);
+
+ Address = Xor(Address);
+
+ return true;
+ }
+
+ private ushort Xor(ushort port)
+ {
+ Span span = stackalloc byte[2];
+ BinaryPrimitives.WriteUInt16BigEndian(span, port);
+ span[0] ^= _magicCookieAndTransactionId[0];
+ span[1] ^= _magicCookieAndTransactionId[1];
+ return BinaryPrimitives.ReadUInt16BigEndian(span);
+ }
+
+ private IPAddress Xor(IPAddress address)
+ {
+ Span b = stackalloc byte[16];
+ address.TryWriteBytes(b, out int bytesWritten);
+
+
+ for (int i = 0; i < bytesWritten; ++i)
+ {
+ b[i] ^= _magicCookieAndTransactionId[i];
+ }
+
+ return new IPAddress(b[..bytesWritten]);
+ }
+}
diff --git a/src/linker.messenger.tunnel/stun/proxy/IUdpProxy.cs b/src/linker.messenger.tunnel/stun/proxy/IUdpProxy.cs
new file mode 100644
index 00000000..564cb8bf
--- /dev/null
+++ b/src/linker.messenger.tunnel/stun/proxy/IUdpProxy.cs
@@ -0,0 +1,13 @@
+using System.Net;
+using System.Net.Sockets;
+
+namespace linker.messenger.tunnel.stun.proxy;
+
+public interface IUdpProxy : IDisposable
+{
+ Socket Client { get; }
+ ValueTask ConnectAsync(CancellationToken cancellationToken = default);
+ ValueTask CloseAsync(CancellationToken cancellationToken = default);
+ ValueTask ReceiveMessageFromAsync(Memory buffer, SocketFlags socketFlags, EndPoint remoteEndPoint, CancellationToken cancellationToken = default);
+ ValueTask SendToAsync(ReadOnlyMemory buffer, SocketFlags socketFlags, EndPoint remoteEP, CancellationToken cancellationToken = default);
+}
diff --git a/src/linker.messenger.tunnel/stun/proxy/NoneUdpProxy.cs b/src/linker.messenger.tunnel/stun/proxy/NoneUdpProxy.cs
new file mode 100644
index 00000000..dca45d92
--- /dev/null
+++ b/src/linker.messenger.tunnel/stun/proxy/NoneUdpProxy.cs
@@ -0,0 +1,41 @@
+using System.Net;
+using System.Net.Sockets;
+
+namespace linker.messenger.tunnel.stun.proxy;
+
+public class NoneUdpProxy : IUdpProxy
+{
+ public Socket Client { get; }
+
+ public NoneUdpProxy(IPEndPoint localEndPoint)
+ {
+ Client = new Socket(localEndPoint.AddressFamily, SocketType.Dgram, ProtocolType.Udp);
+ Client.Bind(localEndPoint);
+ }
+
+ public ValueTask ConnectAsync(CancellationToken cancellationToken = default)
+ {
+ return default;
+ }
+
+ public ValueTask CloseAsync(CancellationToken cancellationToken = default)
+ {
+ return default;
+ }
+
+ public ValueTask ReceiveMessageFromAsync(Memory buffer, SocketFlags socketFlags, EndPoint remoteEndPoint, CancellationToken cancellationToken = default)
+ {
+ return Client.ReceiveMessageFromAsync(buffer, socketFlags, remoteEndPoint, cancellationToken);
+ }
+
+ public ValueTask SendToAsync(ReadOnlyMemory buffer, SocketFlags socketFlags, EndPoint remoteEP, CancellationToken cancellationToken = default)
+ {
+ return Client.SendToAsync(buffer, socketFlags, remoteEP, cancellationToken);
+ }
+
+ public void Dispose()
+ {
+ Client.Dispose();
+ GC.SuppressFinalize(this);
+ }
+}
diff --git a/src/linker.messenger.tunnel/stun/result/ClassicStunResult.cs b/src/linker.messenger.tunnel/stun/result/ClassicStunResult.cs
new file mode 100644
index 00000000..82c9e239
--- /dev/null
+++ b/src/linker.messenger.tunnel/stun/result/ClassicStunResult.cs
@@ -0,0 +1,8 @@
+using linker.messenger.tunnel.stun.enums;
+
+namespace linker.messenger.tunnel.stun.result;
+
+public record ClassicStunResult : StunResult
+{
+ public NatType NatType { get; set; } = NatType.Unknown;
+}
diff --git a/src/linker.messenger.tunnel/stun/result/StunResult.cs b/src/linker.messenger.tunnel/stun/result/StunResult.cs
new file mode 100644
index 00000000..e8931b0f
--- /dev/null
+++ b/src/linker.messenger.tunnel/stun/result/StunResult.cs
@@ -0,0 +1,9 @@
+using System.Net;
+
+namespace linker.messenger.tunnel.stun.result;
+
+public abstract record StunResult
+{
+ public IPEndPoint PublicEndPoint { get; set; }
+ public IPEndPoint LocalEndPoint { get; set; }
+}
diff --git a/src/linker.messenger.tunnel/stun/result/StunResult5389.cs b/src/linker.messenger.tunnel/stun/result/StunResult5389.cs
new file mode 100644
index 00000000..fe64f5f8
--- /dev/null
+++ b/src/linker.messenger.tunnel/stun/result/StunResult5389.cs
@@ -0,0 +1,15 @@
+using linker.messenger.tunnel.stun.enums;
+using System.Net;
+
+namespace linker.messenger.tunnel.stun.result;
+
+public record StunResult5389 : StunResult
+{
+ public IPEndPoint?OtherEndPoint { get; set; }
+
+ public BindingTestResult BindingTestResult { get; set; } = BindingTestResult.Unknown;
+
+ public MappingBehavior MappingBehavior { get; set; } = MappingBehavior.Unknown;
+
+ public FilteringBehavior FilteringBehavior { get; set; } = FilteringBehavior.Unknown;
+}
diff --git a/src/linker.messenger.tunnel/stun/utils/AttributeExtensions.cs b/src/linker.messenger.tunnel/stun/utils/AttributeExtensions.cs
new file mode 100644
index 00000000..b6612b26
--- /dev/null
+++ b/src/linker.messenger.tunnel/stun/utils/AttributeExtensions.cs
@@ -0,0 +1,116 @@
+using linker.messenger.tunnel.stun.enums;
+using linker.messenger.tunnel.stun.messages;
+using System.Net;
+
+namespace linker.messenger.tunnel.stun.utils;
+
+public static class AttributeExtensions
+{
+ public static StunAttribute BuildChangeRequest(bool changeIp, bool changePort)
+ {
+ return new StunAttribute
+ {
+ Type = AttributeType.ChangeRequest,
+ Length = 4,
+ Value = new ChangeRequestStunAttributeValue { ChangeIp = changeIp, ChangePort = changePort }
+ };
+ }
+
+ public static StunAttribute BuildMapping(IpFamily family, IPAddress ip, ushort port)
+ {
+ int length = family switch
+ {
+ IpFamily.IPv4 => 4,
+ IpFamily.IPv6 => 16,
+ _ => throw new ArgumentOutOfRangeException(nameof(family), family, null)
+ };
+ return new StunAttribute
+ {
+ Type = AttributeType.MappedAddress,
+ Length = (ushort)(4 + length),
+ Value = new MappedAddressStunAttributeValue
+ {
+ Family = family,
+ Address = ip,
+ Port = port
+ }
+ };
+ }
+
+ public static StunAttribute BuildChangeAddress(IpFamily family, IPAddress ip, ushort port)
+ {
+ int length = family switch
+ {
+ IpFamily.IPv4 => 4,
+ IpFamily.IPv6 => 16,
+ _ => throw new ArgumentOutOfRangeException(nameof(family), family, null)
+ };
+ return new StunAttribute
+ {
+ Type = AttributeType.ChangedAddress,
+ Length = (ushort)(4 + length),
+ Value = new ChangedAddressStunAttributeValue
+ {
+ Family = family,
+ Address = ip,
+ Port = port
+ }
+ };
+ }
+
+ public static IPEndPoint GetMappedAddressAttribute(this StunMessage5389 response)
+ {
+ StunAttribute mappedAddressAttribute = response.Attributes.FirstOrDefault(t => t.Type == AttributeType.MappedAddress);
+
+ if (mappedAddressAttribute is null)
+ {
+ return null;
+ }
+
+ MappedAddressStunAttributeValue mapped = (MappedAddressStunAttributeValue)mappedAddressAttribute.Value;
+ return new IPEndPoint(mapped.Address!, mapped.Port);
+ }
+
+ public static IPEndPoint GetChangedAddressAttribute(this StunMessage5389 response)
+ {
+ StunAttribute changedAddressAttribute = response.Attributes.FirstOrDefault(t => t.Type == AttributeType.ChangedAddress);
+
+ if (changedAddressAttribute is null)
+ {
+ return null;
+ }
+
+ ChangedAddressStunAttributeValue address = (ChangedAddressStunAttributeValue)changedAddressAttribute.Value;
+ return new IPEndPoint(address.Address!, address.Port);
+ }
+
+ public static IPEndPoint GetXorMappedAddressAttribute(this StunMessage5389 response)
+ {
+ StunAttribute mappedAddressAttribute =
+ response.Attributes.FirstOrDefault(t => t.Type == AttributeType.XorMappedAddress) ??
+ response.Attributes.FirstOrDefault(t => t.Type == AttributeType.MappedAddress);
+
+ if (mappedAddressAttribute is null)
+ {
+ return null;
+ }
+
+ AddressStunAttributeValue mapped = (AddressStunAttributeValue)mappedAddressAttribute.Value;
+ return new IPEndPoint(mapped.Address!, mapped.Port);
+ }
+
+ public static IPEndPoint GetOtherAddressAttribute(this StunMessage5389 response)
+ {
+ StunAttribute? addressAttribute =
+ response.Attributes.FirstOrDefault(t => t.Type == AttributeType.OtherAddress) ??
+ response.Attributes.FirstOrDefault(t => t.Type == AttributeType.ChangedAddress);
+
+ if (addressAttribute is null)
+ {
+ return null;
+ }
+
+ AddressStunAttributeValue address = (AddressStunAttributeValue)addressAttribute.Value;
+ return new IPEndPoint(address.Address!, address.Port);
+ }
+}
diff --git a/src/linker.messenger.tuntap/linker.messenger.tuntap.csproj b/src/linker.messenger.tuntap/linker.messenger.tuntap.csproj
index f0475f45..0ff3a766 100644
--- a/src/linker.messenger.tuntap/linker.messenger.tuntap.csproj
+++ b/src/linker.messenger.tuntap/linker.messenger.tuntap.csproj
@@ -16,9 +16,9 @@
https://github.com/snltty/linker
https://github.com/snltty/linker
linker messenger tuntap
- 1.7.9
- 1.7.9
- 1.7.9
+ 1.8.0
+ 1.8.0
+ 1.8.0
diff --git a/src/linker.messenger.updater/linker.messenger.updater.csproj b/src/linker.messenger.updater/linker.messenger.updater.csproj
index ffe0da13..b1217591 100644
--- a/src/linker.messenger.updater/linker.messenger.updater.csproj
+++ b/src/linker.messenger.updater/linker.messenger.updater.csproj
@@ -16,9 +16,9 @@
https://github.com/snltty/linker
https://github.com/snltty/linker
linker messenger updater
- 1.7.9
- 1.7.9
- 1.7.9
+ 1.8.0
+ 1.8.0
+ 1.8.0
diff --git a/src/linker.messenger/MessengerSender.cs b/src/linker.messenger/MessengerSender.cs
index c699efff..0c072af7 100644
--- a/src/linker.messenger/MessengerSender.cs
+++ b/src/linker.messenger/MessengerSender.cs
@@ -75,7 +75,7 @@ namespace linker.messenger
if (res == false)
{
sends.TryRemove(msg.RequestId, out _);
- tcs.SetResult(new MessageResponeInfo { Code = MessageResponeCodes.NOT_CONNECT });
+ tcs.TrySetResult(new MessageResponeInfo { Code = MessageResponeCodes.NOT_CONNECT });
}
try
@@ -84,6 +84,7 @@ namespace linker.messenger
}
catch (Exception)
{
+ tcs.TrySetResult(new MessageResponeInfo { Code = MessageResponeCodes.NOT_CONNECT });
sends.TryRemove(msg.RequestId, out _);
return new MessageResponeInfo { Code = MessageResponeCodes.TIMEOUT };
}
@@ -153,7 +154,7 @@ namespace linker.messenger
wrap.Payload.CopyTo(bytes);
AddReceive(info.MessengerId, bytes.Length);
- info.Tcs.SetResult(new MessageResponeInfo { Code = wrap.Code, Data = bytes, Connection = wrap.Connection });
+ info.Tcs.TrySetResult(new MessageResponeInfo { Code = wrap.Code, Data = bytes, Connection = wrap.Connection });
return info.MessengerId;
}
return 0;
diff --git a/src/linker.messenger/linker.messenger.csproj b/src/linker.messenger/linker.messenger.csproj
index 925c5ad7..2ec92b8f 100644
--- a/src/linker.messenger/linker.messenger.csproj
+++ b/src/linker.messenger/linker.messenger.csproj
@@ -16,9 +16,9 @@
https://github.com/snltty/linker
https://github.com/snltty/linker
linker messenger
- 1.7.9
- 1.7.9
- 1.7.9
+ 1.8.0
+ 1.8.0
+ 1.8.0
diff --git a/src/linker.snat/linker.snat.csproj b/src/linker.snat/linker.snat.csproj
index 52328402..8cab6d9e 100644
--- a/src/linker.snat/linker.snat.csproj
+++ b/src/linker.snat/linker.snat.csproj
@@ -16,9 +16,9 @@
https://github.com/snltty/linker
https://github.com/snltty/linker
linker snat
- 1.7.9
- 1.7.9
- 1.7.9
+ 1.8.0
+ 1.8.0
+ 1.8.0
diff --git a/src/linker.tray.win/default.aproj b/src/linker.tray.win/default.aproj
index 4b3e3acf..d08fb84f 100644
--- a/src/linker.tray.win/default.aproj
+++ b/src/linker.tray.win/default.aproj
@@ -1,5 +1,5 @@
-
+
diff --git a/src/linker.tray.win/dist/linker.tray.win.exe b/src/linker.tray.win/dist/linker.tray.win.exe
index 4bb14ea2..e2f1d8fc 100644
Binary files a/src/linker.tray.win/dist/linker.tray.win.exe and b/src/linker.tray.win/dist/linker.tray.win.exe differ
diff --git a/src/linker.tray.win/web/css/373.e91546fd.css b/src/linker.tray.win/web/css/127.3f1d3153.css
similarity index 93%
rename from src/linker.tray.win/web/css/373.e91546fd.css
rename to src/linker.tray.win/web/css/127.3f1d3153.css
index e5316c20..138bfb50 100644
--- a/src/linker.tray.win/web/css/373.e91546fd.css
+++ b/src/linker.tray.win/web/css/127.3f1d3153.css
@@ -1 +1 @@
-#file-input[data-v-4892cd3c]{opacity:0;position:absolute;z-index:-1}.el-icon[data-v-4892cd3c]{font-size:1.6rem;vertical-align:middle;color:#555}body.sunny{background-image:url(../img/bg.a2158f12.jpg);background-repeat:no-repeat;background-size:cover;background-position:bottom;position:absolute;left:0;top:0;right:0;bottom:0}body.sunny .status-wrap{background-color:hsla(0,0%,100%,.5)}body.sunny .head-wrap{background-color:hsla(0,0%,100%,.7)}body.sunny .net-list-wrap ul li,body.sunny .net-wrap{background-color:hsla(0,0%,98%,.5)}.head-wrap[data-v-6bfe19a3]{background-color:#fafafa;padding:1rem;border-bottom:1px solid #ddd;box-shadow:1px 2px 3px rgba(0,0,0,.05);font-size:1.4rem}.head-wrap span.label[data-v-6bfe19a3]{line-height:2.4rem;margin-right:.6rem;color:#555}a[data-v-56c0e8be]{color:#666;text-decoration:underline}a.green[data-v-56c0e8be]{color:green;font-weight:700}a.download[data-v-56c0e8be]{margin-left:.6rem}a.download .el-icon[data-v-56c0e8be]{vertical-align:middle;font-weight:700;margin-left:.3rem}a.download .el-icon.loading[data-v-56c0e8be]{animation:loading-56c0e8be 1s linear infinite}a.download+a.download[data-v-56c0e8be]{margin-left:.2rem}@keyframes loading-56c0e8be{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}img.system[data-v-4931fbdc]{height:1.6rem;vertical-align:middle;margin-left:.4rem}.self[data-v-4931fbdc]{color:#d400ff}.self .el-icon[data-v-4931fbdc]{vertical-align:text-bottom}.connect-point .el-loading-mask{background-color:transparent}.connect-point .el-loading-spinner{width:100%;height:100%;margin:0;top:0}.connect-point .el-loading-spinner .circular{width:100%;height:100%;vertical-align:top}.connect-point .el-loading-spinner .path{stroke-width:6;stroke:green}div.connect-point[data-v-064c2370]{margin:-.2rem .3rem 0 -1.4rem;position:absolute}span.connect-point[data-v-064c2370]{width:.9rem;height:.9rem;border-radius:50%;display:inline-block;vertical-align:middle;background-color:#eee;border:1px solid #ddd;cursor:pointer;transition:.3s}span.connect-point[data-v-064c2370]:hover{transform:scale(2)}span.connect-point.p2p[data-v-064c2370]{background-color:#01c901;border:1px solid #049538}span.connect-point.relay[data-v-064c2370]{background-color:#e3e811;border:1px solid #b3c410}span.connect-point.node[data-v-064c2370]{background-color:#09dda9;border:1px solid #0cac90}.el-icon.loading[data-v-fc36e330],a.loading[data-v-fc36e330]{vertical-align:middle;font-weight:700;animation:loading-fc36e330 1s linear infinite}.el-switch.is-disabled[data-v-fc36e330]{opacity:1}.el-input[data-v-fc36e330]{width:8rem}.delay[data-v-fc36e330]{position:absolute;right:0;bottom:0;line-height:normal}.switch-btn[data-v-fc36e330]{font-size:1.5rem}.any[data-v-fc36e330]{position:absolute;left:-7px;top:-2px;line-height:normal}.any.green[data-v-fc36e330]{background:linear-gradient(270deg,#caff00,green,#0d6d23,#e38a00,green);background-clip:text;-webkit-background-clip:text;-webkit-text-fill-color:hsla(0,0%,100%,0)}@keyframes loading-fc36e330{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.net-list-wrap ul[data-v-68d1c30a]{padding:2rem 2rem 1rem 2rem}.net-list-wrap ul li[data-v-68d1c30a]{margin-bottom:1rem;border:1px solid #ddd;background-color:#fff;font-size:1.3rem;border-radius:.4rem}.net-list-wrap ul li dt[data-v-68d1c30a]{padding:.6rem;border-bottom:1px solid #ddd}.net-list-wrap ul li dd.tuntap[data-v-68d1c30a]{padding:1rem;position:relative}.net-list-wrap .page[data-v-68d1c30a]{padding:.6rem 0;border-top:1px solid #ddd;background-color:hsla(0,0%,98%,.5);box-shadow:-1px -2px 3px rgba(0,0,0,.05)}.net-list-wrap .page-wrap[data-v-68d1c30a]{display:inline-block}.status-api-wrap[data-v-52645186]{padding-right:1rem}.status-api-wrap.connected a[data-v-52645186]{color:green;font-weight:700}.status-api-wrap a[data-v-52645186]{color:#333}.status-api-wrap a .el-icon[data-v-52645186]{vertical-align:sub}.el-dropdown[data-v-33467232]{vertical-align:inherit;margin-right:1rem}.el-dropdown-link.connected[data-v-33467232]{color:green;font-weight:700}.el-dropdown-link .el-icon[data-v-33467232]{vertical-align:bottom}a[data-v-80718c08]{font-weight:700;position:absolute;right:1rem;bottom:90%;border:1px solid #ddd;background-color:#fff;z-index:9}a p[data-v-80718c08]{line-height:normal;white-space:nowrap}.head[data-v-f73b7458]{padding-bottom:1rem;text-align:center}.head .el-input[data-v-f73b7458]{width:20rem}.page[data-v-f73b7458]{padding-top:1rem}.page-wrap[data-v-f73b7458]{display:inline-block}.head[data-v-019c1d95]{padding-bottom:1rem;text-align:center}.head .el-input[data-v-019c1d95]{width:20rem}.page[data-v-019c1d95]{padding-top:1rem}.page-wrap[data-v-019c1d95]{display:inline-block}#map[data-v-3c0782be],#map[data-v-6f5477f6]{height:60rem}.flow-wrap[data-v-12cd5250]{padding:.4rem;font-weight:700;position:absolute;right:1rem;bottom:80%;border:1px solid #ddd;background-color:#fff;z-index:9}.flow-wrap>a[data-v-12cd5250],.flow-wrap>p[data-v-12cd5250]{line-height:normal;white-space:nowrap;display:block}a[data-v-6baf133f]{font-weight:700;line-height:3rem;display:inline-flex}a .el-icon[data-v-6baf133f]{margin-top:.8rem}a.download .el-icon[data-v-6baf133f]{font-weight:700;margin-left:.3rem}a.download .el-icon.loading[data-v-6baf133f]{animation:loading-6baf133f 1s linear infinite}@keyframes loading-6baf133f{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.status-server-wrap[data-v-2d85a782]{position:relative;padding-right:.5rem}.status-server-wrap a[data-v-2d85a782]{color:#333}.status-server-wrap a+a[data-v-2d85a782]{margin-left:.6rem}.status-server-wrap .el-icon[data-v-2d85a782]{vertical-align:text-bottom}.el-col[data-v-2e8ef3fe]{text-align:left}.access-wrap[data-v-2e8ef3fe]{height:40rem}.status-export-wrap[data-v-ec18026a]{padding-right:1rem}.status-export-wrap a[data-v-ec18026a]{color:#333}.status-export-wrap a .el-icon[data-v-ec18026a]{vertical-align:sub}.status-export-wrap .el-col[data-v-ec18026a]{text-align:left}.status-wrap[data-v-53629093]{border-top:1px solid #ddd;background-color:#f5f5f5;height:3rem;line-height:3rem;font-size:1.2rem;color:#555}.status-wrap .pay[data-v-53629093]{font-size:xxx-large}.status-wrap .pay img[data-v-53629093]{width:100%;margin:0}.status-wrap .copy[data-v-53629093]{padding-left:.5rem}.status-wrap .copy a[data-v-53629093]{color:#555;margin-right:1rem}.status-wrap a.memory[data-v-53629093]{margin-right:.6rem}.status-wrap a.memory img[data-v-53629093]{height:3rem;vertical-align:bottom;margin-right:.1rem}.net-wrap[data-v-6a3f3b43]{box-sizing:border-box;background-color:#fafafa;border:1px solid #d0d7de;width:calc(100% - 40px);height:calc(100% - 40px);position:absolute;left:20px;top:20px}
\ No newline at end of file
+#file-input[data-v-4892cd3c]{opacity:0;position:absolute;z-index:-1}.el-icon[data-v-4892cd3c]{font-size:1.6rem;vertical-align:middle;color:#555}body.sunny{background-image:url(../img/bg.a2158f12.jpg);background-repeat:no-repeat;background-size:cover;background-position:bottom;position:absolute;left:0;top:0;right:0;bottom:0}body.sunny .status-wrap{background-color:hsla(0,0%,100%,.5)}body.sunny .head-wrap{background-color:hsla(0,0%,100%,.7)}body.sunny .net-list-wrap ul li,body.sunny .net-wrap{background-color:hsla(0,0%,98%,.5)}.head-wrap[data-v-6bfe19a3]{background-color:#fafafa;padding:1rem;border-bottom:1px solid #ddd;box-shadow:1px 2px 3px rgba(0,0,0,.05);font-size:1.4rem}.head-wrap span.label[data-v-6bfe19a3]{line-height:2.4rem;margin-right:.6rem;color:#555}a[data-v-56c0e8be]{color:#666;text-decoration:underline}a.green[data-v-56c0e8be]{color:green;font-weight:700}a.download[data-v-56c0e8be]{margin-left:.6rem}a.download .el-icon[data-v-56c0e8be]{vertical-align:middle;font-weight:700;margin-left:.3rem}a.download .el-icon.loading[data-v-56c0e8be]{animation:loading-56c0e8be 1s linear infinite}a.download+a.download[data-v-56c0e8be]{margin-left:.2rem}@keyframes loading-56c0e8be{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}img.system[data-v-4931fbdc]{height:1.6rem;vertical-align:middle;margin-left:.4rem}.self[data-v-4931fbdc]{color:#d400ff}.self .el-icon[data-v-4931fbdc]{vertical-align:text-bottom}.connect-point .el-loading-mask{background-color:transparent}.connect-point .el-loading-spinner{width:100%;height:100%;margin:0;top:0}.connect-point .el-loading-spinner .circular{width:100%;height:100%;vertical-align:top}.connect-point .el-loading-spinner .path{stroke-width:6;stroke:green}div.connect-point[data-v-064c2370]{margin:-.2rem .3rem 0 -1.4rem;position:absolute}span.connect-point[data-v-064c2370]{width:.9rem;height:.9rem;border-radius:50%;display:inline-block;vertical-align:middle;background-color:#eee;border:1px solid #ddd;cursor:pointer;transition:.3s}span.connect-point[data-v-064c2370]:hover{transform:scale(2)}span.connect-point.p2p[data-v-064c2370]{background-color:#01c901;border:1px solid #049538}span.connect-point.relay[data-v-064c2370]{background-color:#e3e811;border:1px solid #b3c410}span.connect-point.node[data-v-064c2370]{background-color:#09dda9;border:1px solid #0cac90}.el-icon.loading[data-v-fc36e330],a.loading[data-v-fc36e330]{vertical-align:middle;font-weight:700;animation:loading-fc36e330 1s linear infinite}.el-switch.is-disabled[data-v-fc36e330]{opacity:1}.el-input[data-v-fc36e330]{width:8rem}.delay[data-v-fc36e330]{position:absolute;right:0;bottom:0;line-height:normal}.switch-btn[data-v-fc36e330]{font-size:1.5rem}.any[data-v-fc36e330]{position:absolute;left:-7px;top:-2px;line-height:normal}.any.green[data-v-fc36e330]{background:linear-gradient(270deg,#caff00,green,#0d6d23,#e38a00,green);background-clip:text;-webkit-background-clip:text;-webkit-text-fill-color:hsla(0,0%,100%,0)}@keyframes loading-fc36e330{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.net-list-wrap ul[data-v-68d1c30a]{padding:2rem 2rem 1rem 2rem}.net-list-wrap ul li[data-v-68d1c30a]{margin-bottom:1rem;border:1px solid #ddd;background-color:#fff;font-size:1.3rem;border-radius:.4rem}.net-list-wrap ul li dt[data-v-68d1c30a]{padding:.6rem;border-bottom:1px solid #ddd}.net-list-wrap ul li dd.tuntap[data-v-68d1c30a]{padding:1rem;position:relative}.net-list-wrap .page[data-v-68d1c30a]{padding:.6rem 0;border-top:1px solid #ddd;background-color:hsla(0,0%,98%,.5);box-shadow:-1px -2px 3px rgba(0,0,0,.05)}.net-list-wrap .page-wrap[data-v-68d1c30a]{display:inline-block}.status-api-wrap[data-v-52645186]{padding-right:1rem}.status-api-wrap.connected a[data-v-52645186]{color:green;font-weight:700}.status-api-wrap a[data-v-52645186]{color:#333}.status-api-wrap a .el-icon[data-v-52645186]{vertical-align:sub}.el-dropdown[data-v-33467232]{vertical-align:inherit;margin-right:1rem}.el-dropdown-link.connected[data-v-33467232]{color:green;font-weight:700}.el-dropdown-link .el-icon[data-v-33467232]{vertical-align:bottom}a[data-v-80718c08]{font-weight:700;position:absolute;right:1rem;bottom:90%;border:1px solid #ddd;background-color:#fff;z-index:9}a p[data-v-80718c08]{line-height:normal;white-space:nowrap}.head[data-v-f73b7458]{padding-bottom:1rem;text-align:center}.head .el-input[data-v-f73b7458]{width:20rem}.page[data-v-f73b7458]{padding-top:1rem}.page-wrap[data-v-f73b7458]{display:inline-block}.head[data-v-019c1d95]{padding-bottom:1rem;text-align:center}.head .el-input[data-v-019c1d95]{width:20rem}.page[data-v-019c1d95]{padding-top:1rem}.page-wrap[data-v-019c1d95]{display:inline-block}#map[data-v-3c0782be],#map[data-v-6f5477f6]{height:60rem}.flow-wrap[data-v-12cd5250]{padding:.4rem;font-weight:700;position:absolute;right:1rem;bottom:80%;border:1px solid #ddd;background-color:#fff;z-index:9}.flow-wrap>a[data-v-12cd5250],.flow-wrap>p[data-v-12cd5250]{line-height:normal;white-space:nowrap;display:block}a[data-v-6baf133f]{font-weight:700;line-height:3rem;display:inline-flex}a .el-icon[data-v-6baf133f]{margin-top:.8rem}a.download .el-icon[data-v-6baf133f]{font-weight:700;margin-left:.3rem}a.download .el-icon.loading[data-v-6baf133f]{animation:loading-6baf133f 1s linear infinite}@keyframes loading-6baf133f{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.status-server-wrap[data-v-2d85a782]{position:relative;padding-right:.5rem}.status-server-wrap a[data-v-2d85a782]{color:#333}.status-server-wrap a+a[data-v-2d85a782]{margin-left:.6rem}.status-server-wrap .el-icon[data-v-2d85a782]{vertical-align:text-bottom}.el-col[data-v-2e8ef3fe]{text-align:left}.access-wrap[data-v-2e8ef3fe]{height:40rem}.status-export-wrap[data-v-ec18026a]{padding-right:1rem}.status-export-wrap a[data-v-ec18026a]{color:#333}.status-export-wrap a .el-icon[data-v-ec18026a]{vertical-align:sub}.status-export-wrap .el-col[data-v-ec18026a]{text-align:left}.status-wrap[data-v-d7fd0c64]{border-top:1px solid #ddd;background-color:#f5f5f5;height:3rem;line-height:3rem;font-size:1.2rem;color:#555}.status-wrap .pay[data-v-d7fd0c64]{font-size:xxx-large}.status-wrap .pay img[data-v-d7fd0c64]{width:100%;margin:0}.status-wrap .copy[data-v-d7fd0c64]{padding-left:.5rem}.status-wrap .copy a[data-v-d7fd0c64]{color:#555;margin-right:1rem}.status-wrap a.memory[data-v-d7fd0c64]{margin-right:.6rem}.status-wrap a.memory img[data-v-d7fd0c64]{height:3rem;vertical-align:bottom;margin-right:.1rem}.net-wrap[data-v-6a3f3b43]{box-sizing:border-box;background-color:#fafafa;border:1px solid #d0d7de;width:calc(100% - 40px);height:calc(100% - 40px);position:absolute;left:20px;top:20px}
\ No newline at end of file
diff --git a/src/linker.tray.win/web/css/991.e4499fe6.css b/src/linker.tray.win/web/css/372.e4499fe6.css
similarity index 100%
rename from src/linker.tray.win/web/css/991.e4499fe6.css
rename to src/linker.tray.win/web/css/372.e4499fe6.css
diff --git a/src/linker.tray.win/web/css/372.f0648f3d.css b/src/linker.tray.win/web/css/537.dbf0921b.css
similarity index 92%
rename from src/linker.tray.win/web/css/372.f0648f3d.css
rename to src/linker.tray.win/web/css/537.dbf0921b.css
index 642b85d1..1b41c742 100644
--- a/src/linker.tray.win/web/css/372.f0648f3d.css
+++ b/src/linker.tray.win/web/css/537.dbf0921b.css
@@ -1 +1 @@
-#file-input[data-v-4892cd3c]{opacity:0;position:absolute;z-index:-1}.el-icon[data-v-4892cd3c]{font-size:1.6rem;vertical-align:middle;color:#555}#file-input[data-v-f2838cec]{opacity:0;position:absolute;z-index:-1}.head[data-v-f2838cec]{background-color:#f6f8fa;border-bottom:1px solid #d0d7de;box-shadow:1px 1px 4px rgba(0,0,0,.05);height:5rem;line-height:5rem}.head .logo[data-v-f2838cec]{padding:.5rem 0 0 1rem;height:4.5rem}.head .logo img[data-v-f2838cec]{vertical-align:top;height:4rem}.head .menu[data-v-f2838cec]{padding-left:1rem;font-size:1.4rem}.head .menu li[data-v-f2838cec]{box-sizing:border-box;padding:.5rem 0;margin-right:.5rem}.head .menu a[data-v-f2838cec]{display:block;color:#333;padding:0 1rem;line-height:4rem;height:4rem}.head .menu a.router-link-active[data-v-f2838cec],.head .menu a[data-v-f2838cec]:hover{background-color:rgba(0,0,0,.1);font-weight:700;border-radius:4px}.head .menu a img[data-v-f2838cec]{height:2rem;margin-right:.2rem;margin-top:1rem}.head .menu a span[data-v-f2838cec]{vertical-align:top}.head .select[data-v-f2838cec]{padding-right:1rem}.head .select .el-dropdown[data-v-f2838cec]{vertical-align:middle}.head .select .el-dropdown .el-icon[data-v-f2838cec]{vertical-align:bottom;font-size:2rem}.head .locale[data-v-f2838cec]{padding-right:1rem}.head .locale .el-dropdown[data-v-f2838cec]{vertical-align:middle}.head .locale .el-dropdown .el-icon[data-v-f2838cec]{vertical-align:bottom}.head .image[data-v-f2838cec]{padding-right:1rem}body.sunny{background-image:url(../img/bg.a2158f12.jpg);background-repeat:no-repeat;background-size:cover;background-position:bottom;position:absolute;left:0;top:0;right:0;bottom:0}body.sunny .app-wrap{background-color:hsla(0,0%,100%,.5)}body.sunny .status-wrap{background-color:hsla(0,0%,96%,.3)}body.sunny .status-wrap .copy a{color:#333}body.sunny .el-table{background-color:hsla(0,0%,100%,.5)}body.sunny .head{background-color:rgba(246,248,250,.5)}body.sunny .el-table tr,body.sunny .el-table--striped .el-table__body tr.el-table__row--striped td.el-table__cell{background-color:rgba(246,248,250,.2)}.el-pagination__total,body.sunny .el-pagination__sizes,body.sunny .status-wrap .copy a{color:#000}.status-api-wrap[data-v-52645186]{padding-right:1rem}.status-api-wrap.connected a[data-v-52645186]{color:green;font-weight:700}.status-api-wrap a[data-v-52645186]{color:#333}.status-api-wrap a .el-icon[data-v-52645186]{vertical-align:sub}.el-dropdown[data-v-33467232]{vertical-align:inherit;margin-right:1rem}.el-dropdown-link.connected[data-v-33467232]{color:green;font-weight:700}.el-dropdown-link .el-icon[data-v-33467232]{vertical-align:bottom}a[data-v-80718c08]{font-weight:700;position:absolute;right:1rem;bottom:90%;border:1px solid #ddd;background-color:#fff;z-index:9}a p[data-v-80718c08]{line-height:normal;white-space:nowrap}.head[data-v-f73b7458]{padding-bottom:1rem;text-align:center}.head .el-input[data-v-f73b7458]{width:20rem}.page[data-v-f73b7458]{padding-top:1rem}.page-wrap[data-v-f73b7458]{display:inline-block}.head[data-v-019c1d95]{padding-bottom:1rem;text-align:center}.head .el-input[data-v-019c1d95]{width:20rem}.page[data-v-019c1d95]{padding-top:1rem}.page-wrap[data-v-019c1d95]{display:inline-block}#map[data-v-3c0782be],#map[data-v-6f5477f6]{height:60rem}.flow-wrap[data-v-12cd5250]{padding:.4rem;font-weight:700;position:absolute;right:1rem;bottom:80%;border:1px solid #ddd;background-color:#fff;z-index:9}.flow-wrap>a[data-v-12cd5250],.flow-wrap>p[data-v-12cd5250]{line-height:normal;white-space:nowrap;display:block}a[data-v-6baf133f]{font-weight:700;line-height:3rem;display:inline-flex}a .el-icon[data-v-6baf133f]{margin-top:.8rem}a.download .el-icon[data-v-6baf133f]{font-weight:700;margin-left:.3rem}a.download .el-icon.loading[data-v-6baf133f]{animation:loading-6baf133f 1s linear infinite}@keyframes loading-6baf133f{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.status-server-wrap[data-v-2d85a782]{position:relative;padding-right:.5rem}.status-server-wrap a[data-v-2d85a782]{color:#333}.status-server-wrap a+a[data-v-2d85a782]{margin-left:.6rem}.status-server-wrap .el-icon[data-v-2d85a782]{vertical-align:text-bottom}.el-col[data-v-2e8ef3fe]{text-align:left}.access-wrap[data-v-2e8ef3fe]{height:40rem}.status-export-wrap[data-v-ec18026a]{padding-right:1rem}.status-export-wrap a[data-v-ec18026a]{color:#333}.status-export-wrap a .el-icon[data-v-ec18026a]{vertical-align:sub}.status-export-wrap .el-col[data-v-ec18026a]{text-align:left}a[data-v-56c0e8be]{color:#666;text-decoration:underline}a.green[data-v-56c0e8be]{color:green;font-weight:700}a.download[data-v-56c0e8be]{margin-left:.6rem}a.download .el-icon[data-v-56c0e8be]{vertical-align:middle;font-weight:700;margin-left:.3rem}a.download .el-icon.loading[data-v-56c0e8be]{animation:loading-56c0e8be 1s linear infinite}a.download+a.download[data-v-56c0e8be]{margin-left:.2rem}@keyframes loading-56c0e8be{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.status-wrap[data-v-53629093]{border-top:1px solid #ddd;background-color:#f5f5f5;height:3rem;line-height:3rem;font-size:1.2rem;color:#555}.status-wrap .pay[data-v-53629093]{font-size:xxx-large}.status-wrap .pay img[data-v-53629093]{width:100%;margin:0}.status-wrap .copy[data-v-53629093]{padding-left:.5rem}.status-wrap .copy a[data-v-53629093]{color:#555;margin-right:1rem}.status-wrap a.memory[data-v-53629093]{margin-right:.6rem}.status-wrap a.memory img[data-v-53629093]{height:3rem;vertical-align:bottom;margin-right:.1rem}.body[data-v-646b1688]{padding:1rem 0 0 0}.footer[data-v-646b1688]{padding:1rem 0}.phone .el-dialog__body .el-col .el-form-item[data-v-646b1688]:last-child{margin-bottom:.6rem}.body[data-v-8d4253a6]{padding:1rem 0 0 0}.footer[data-v-8d4253a6]{padding:1rem 0}.body[data-v-ce07310a],.el-card+.el-card[data-v-8d4253a6]{margin-top:1rem}.footer[data-v-ce07310a]{margin-top:2rem}@media screen and (max-width:1000px){body .app-wrap[data-v-59076a44]{position:absolute;left:0;top:0;right:auto;bottom:auto;height:100%;width:100%;transform:none;max-width:100%;border:0}}.app-wrap[data-v-59076a44]{box-sizing:border-box;background-color:#fff;border:1px solid #d0d7de;width:81rem;max-width:80%;height:90%;position:absolute;left:50%;top:50%;transform:translateX(-50%) translateY(-50%)}
\ No newline at end of file
+#file-input[data-v-4892cd3c]{opacity:0;position:absolute;z-index:-1}.el-icon[data-v-4892cd3c]{font-size:1.6rem;vertical-align:middle;color:#555}#file-input[data-v-f2838cec]{opacity:0;position:absolute;z-index:-1}.head[data-v-f2838cec]{background-color:#f6f8fa;border-bottom:1px solid #d0d7de;box-shadow:1px 1px 4px rgba(0,0,0,.05);height:5rem;line-height:5rem}.head .logo[data-v-f2838cec]{padding:.5rem 0 0 1rem;height:4.5rem}.head .logo img[data-v-f2838cec]{vertical-align:top;height:4rem}.head .menu[data-v-f2838cec]{padding-left:1rem;font-size:1.4rem}.head .menu li[data-v-f2838cec]{box-sizing:border-box;padding:.5rem 0;margin-right:.5rem}.head .menu a[data-v-f2838cec]{display:block;color:#333;padding:0 1rem;line-height:4rem;height:4rem}.head .menu a.router-link-active[data-v-f2838cec],.head .menu a[data-v-f2838cec]:hover{background-color:rgba(0,0,0,.1);font-weight:700;border-radius:4px}.head .menu a img[data-v-f2838cec]{height:2rem;margin-right:.2rem;margin-top:1rem}.head .menu a span[data-v-f2838cec]{vertical-align:top}.head .select[data-v-f2838cec]{padding-right:1rem}.head .select .el-dropdown[data-v-f2838cec]{vertical-align:middle}.head .select .el-dropdown .el-icon[data-v-f2838cec]{vertical-align:bottom;font-size:2rem}.head .locale[data-v-f2838cec]{padding-right:1rem}.head .locale .el-dropdown[data-v-f2838cec]{vertical-align:middle}.head .locale .el-dropdown .el-icon[data-v-f2838cec]{vertical-align:bottom}.head .image[data-v-f2838cec]{padding-right:1rem}body.sunny{background-image:url(../img/bg.a2158f12.jpg);background-repeat:no-repeat;background-size:cover;background-position:bottom;position:absolute;left:0;top:0;right:0;bottom:0}body.sunny .app-wrap{background-color:hsla(0,0%,100%,.5)}body.sunny .status-wrap{background-color:hsla(0,0%,96%,.3)}body.sunny .status-wrap .copy a{color:#333}body.sunny .el-table{background-color:hsla(0,0%,100%,.5)}body.sunny .head{background-color:rgba(246,248,250,.5)}body.sunny .el-table tr,body.sunny .el-table--striped .el-table__body tr.el-table__row--striped td.el-table__cell{background-color:rgba(246,248,250,.2)}.el-pagination__total,body.sunny .el-pagination__sizes,body.sunny .status-wrap .copy a{color:#000}.status-api-wrap[data-v-52645186]{padding-right:1rem}.status-api-wrap.connected a[data-v-52645186]{color:green;font-weight:700}.status-api-wrap a[data-v-52645186]{color:#333}.status-api-wrap a .el-icon[data-v-52645186]{vertical-align:sub}.el-dropdown[data-v-33467232]{vertical-align:inherit;margin-right:1rem}.el-dropdown-link.connected[data-v-33467232]{color:green;font-weight:700}.el-dropdown-link .el-icon[data-v-33467232]{vertical-align:bottom}a[data-v-80718c08]{font-weight:700;position:absolute;right:1rem;bottom:90%;border:1px solid #ddd;background-color:#fff;z-index:9}a p[data-v-80718c08]{line-height:normal;white-space:nowrap}.head[data-v-f73b7458]{padding-bottom:1rem;text-align:center}.head .el-input[data-v-f73b7458]{width:20rem}.page[data-v-f73b7458]{padding-top:1rem}.page-wrap[data-v-f73b7458]{display:inline-block}.head[data-v-019c1d95]{padding-bottom:1rem;text-align:center}.head .el-input[data-v-019c1d95]{width:20rem}.page[data-v-019c1d95]{padding-top:1rem}.page-wrap[data-v-019c1d95]{display:inline-block}#map[data-v-3c0782be],#map[data-v-6f5477f6]{height:60rem}.flow-wrap[data-v-12cd5250]{padding:.4rem;font-weight:700;position:absolute;right:1rem;bottom:80%;border:1px solid #ddd;background-color:#fff;z-index:9}.flow-wrap>a[data-v-12cd5250],.flow-wrap>p[data-v-12cd5250]{line-height:normal;white-space:nowrap;display:block}a[data-v-6baf133f]{font-weight:700;line-height:3rem;display:inline-flex}a .el-icon[data-v-6baf133f]{margin-top:.8rem}a.download .el-icon[data-v-6baf133f]{font-weight:700;margin-left:.3rem}a.download .el-icon.loading[data-v-6baf133f]{animation:loading-6baf133f 1s linear infinite}@keyframes loading-6baf133f{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.status-server-wrap[data-v-2d85a782]{position:relative;padding-right:.5rem}.status-server-wrap a[data-v-2d85a782]{color:#333}.status-server-wrap a+a[data-v-2d85a782]{margin-left:.6rem}.status-server-wrap .el-icon[data-v-2d85a782]{vertical-align:text-bottom}.el-col[data-v-2e8ef3fe]{text-align:left}.access-wrap[data-v-2e8ef3fe]{height:40rem}.status-export-wrap[data-v-ec18026a]{padding-right:1rem}.status-export-wrap a[data-v-ec18026a]{color:#333}.status-export-wrap a .el-icon[data-v-ec18026a]{vertical-align:sub}.status-export-wrap .el-col[data-v-ec18026a]{text-align:left}a[data-v-56c0e8be]{color:#666;text-decoration:underline}a.green[data-v-56c0e8be]{color:green;font-weight:700}a.download[data-v-56c0e8be]{margin-left:.6rem}a.download .el-icon[data-v-56c0e8be]{vertical-align:middle;font-weight:700;margin-left:.3rem}a.download .el-icon.loading[data-v-56c0e8be]{animation:loading-56c0e8be 1s linear infinite}a.download+a.download[data-v-56c0e8be]{margin-left:.2rem}@keyframes loading-56c0e8be{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.status-wrap[data-v-d7fd0c64]{border-top:1px solid #ddd;background-color:#f5f5f5;height:3rem;line-height:3rem;font-size:1.2rem;color:#555}.status-wrap .pay[data-v-d7fd0c64]{font-size:xxx-large}.status-wrap .pay img[data-v-d7fd0c64]{width:100%;margin:0}.status-wrap .copy[data-v-d7fd0c64]{padding-left:.5rem}.status-wrap .copy a[data-v-d7fd0c64]{color:#555;margin-right:1rem}.status-wrap a.memory[data-v-d7fd0c64]{margin-right:.6rem}.status-wrap a.memory img[data-v-d7fd0c64]{height:3rem;vertical-align:bottom;margin-right:.1rem}.body[data-v-646b1688]{padding:1rem 0 0 0}.footer[data-v-646b1688]{padding:1rem 0}.phone .el-dialog__body .el-col .el-form-item[data-v-646b1688]:last-child{margin-bottom:.6rem}.body[data-v-8d4253a6]{padding:1rem 0 0 0}.footer[data-v-8d4253a6]{padding:1rem 0}.body[data-v-ce07310a],.el-card+.el-card[data-v-8d4253a6]{margin-top:1rem}.footer[data-v-ce07310a]{margin-top:2rem}@media screen and (max-width:1000px){body .app-wrap[data-v-59076a44]{position:absolute;left:0;top:0;right:auto;bottom:auto;height:100%;width:100%;transform:none;max-width:100%;border:0}}.app-wrap[data-v-59076a44]{box-sizing:border-box;background-color:#fff;border:1px solid #d0d7de;width:81rem;max-width:80%;height:90%;position:absolute;left:50%;top:50%;transform:translateX(-50%) translateY(-50%)}
\ No newline at end of file
diff --git a/src/linker.tray.win/web/css/201.0ac88f6e.css b/src/linker.tray.win/web/css/620.0ab65a4a.css
similarity index 68%
rename from src/linker.tray.win/web/css/201.0ac88f6e.css
rename to src/linker.tray.win/web/css/620.0ab65a4a.css
index 220ab756..061e85b7 100644
--- a/src/linker.tray.win/web/css/201.0ac88f6e.css
+++ b/src/linker.tray.win/web/css/620.0ab65a4a.css
@@ -1 +1 @@
-.table-sort th[data-v-107f04ae]{border-bottom:0}.show-columns[data-v-107f04ae]{vertical-align:middle;font-size:1.2rem}.show-columns .el-icon[data-v-107f04ae]{vertical-align:bottom;font-size:1.2rem}.dropdown[data-v-0338b206]{border:1px solid #ddd;padding:.4rem;font-size:1.3rem;border-radius:.4rem;position:relative}.dropdown .el-icon[data-v-0338b206]{vertical-align:middle}.dropdown .badge[data-v-0338b206]{position:absolute;right:-1rem;top:-50%;border-radius:10px;background-color:#f1ae05;color:#fff;padding:.2rem .6rem;font-size:1.2rem}a[data-v-56c0e8be]{color:#666;text-decoration:underline}a.green[data-v-56c0e8be]{color:green;font-weight:700}a.download[data-v-56c0e8be]{margin-left:.6rem}a.download .el-icon[data-v-56c0e8be]{vertical-align:middle;font-weight:700;margin-left:.3rem}a.download .el-icon.loading[data-v-56c0e8be]{animation:loading-56c0e8be 1s linear infinite}a.download+a.download[data-v-56c0e8be]{margin-left:.2rem}@keyframes loading-56c0e8be{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}img.system[data-v-4931fbdc]{height:1.6rem;vertical-align:middle;margin-left:.4rem}.self[data-v-4931fbdc]{color:#d400ff}.self .el-icon[data-v-4931fbdc]{vertical-align:text-bottom}.ipaddress span[data-v-5db71b03]{vertical-align:middle}.el-input[data-v-5db71b03]{width:12rem;margin-right:.6rem}.el-col[data-v-2e8ef3fe]{text-align:left}.access-wrap[data-v-2e8ef3fe]{height:40rem}.connect-point .el-loading-mask{background-color:transparent}.connect-point .el-loading-spinner{width:100%;height:100%;margin:0;top:0}.connect-point .el-loading-spinner .circular{width:100%;height:100%;vertical-align:top}.connect-point .el-loading-spinner .path{stroke-width:6;stroke:green}div.connect-point[data-v-064c2370]{margin:-.2rem .3rem 0 -1.4rem;position:absolute}span.connect-point[data-v-064c2370]{width:.9rem;height:.9rem;border-radius:50%;display:inline-block;vertical-align:middle;background-color:#eee;border:1px solid #ddd;cursor:pointer;transition:.3s}span.connect-point[data-v-064c2370]:hover{transform:scale(2)}span.connect-point.p2p[data-v-064c2370]{background-color:#01c901;border:1px solid #049538}span.connect-point.relay[data-v-064c2370]{background-color:#e3e811;border:1px solid #b3c410}span.connect-point.node[data-v-064c2370]{background-color:#09dda9;border:1px solid #0cac90}.el-icon.loading[data-v-fc36e330],a.loading[data-v-fc36e330]{vertical-align:middle;font-weight:700;animation:loading-fc36e330 1s linear infinite}.el-switch.is-disabled[data-v-fc36e330]{opacity:1}.el-input[data-v-fc36e330]{width:8rem}.delay[data-v-fc36e330]{position:absolute;right:0;bottom:0;line-height:normal}.switch-btn[data-v-fc36e330]{font-size:1.5rem}.any[data-v-fc36e330]{position:absolute;left:-7px;top:-2px;line-height:normal}.any.green[data-v-fc36e330]{background:linear-gradient(270deg,#caff00,green,#0d6d23,#e38a00,green);background-clip:text;-webkit-background-clip:text;-webkit-text-fill-color:hsla(0,0%,100%,0)}@keyframes loading-fc36e330{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.remark[data-v-1f1a4aca]{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.el-switch.is-disabled[data-v-2eb35cd0]{opacity:1}.wrap[data-v-2eb35cd0]{min-height:40rem}.foot[data-v-87d2a32c]{padding-top:2rem}.el-switch.is-disabled[data-v-67ed3552]{opacity:1}.calc span[data-v-67ed3552]{display:inline-block}.calc span.label[data-v-67ed3552]{width:6rem}.el-transfer.src-tranfer .el-transfer__buttons .el-button{display:block}.el-transfer.src-tranfer .el-transfer__buttons .el-button:nth-child(2){margin:1rem 0 0 0}.el-form-item[data-v-6c157ed4]{margin-bottom:1rem}.head[data-v-0679a99a]{margin-bottom:1rem;color:#555;border:1px solid #eee;padding:0 1rem 1rem 1rem}.firewall.el-table .action-1{color:green}.firewall.el-table .action-2{color:#c83f08}.el-icon.loading[data-v-10c6aa99],a.loading[data-v-10c6aa99]{vertical-align:middle;font-weight:700;animation:loading-10c6aa99 1s linear infinite}.el-switch.is-disabled[data-v-10c6aa99]{opacity:1}.el-input[data-v-10c6aa99]{width:8rem}.switch-btn[data-v-10c6aa99]{font-size:1.5rem}@keyframes loading-10c6aa99{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.el-switch.is-disabled[data-v-2ea91b4b]{opacity:1}.upgrade-wrap[data-v-2ea91b4b]{border:1px solid #ddd;margin-bottom:2rem;padding:1rem}.el-switch.is-disabled[data-v-64b81c5b]{opacity:1}.green[data-v-64b81c5b]{font-weight:700}img.system[data-v-64b81c5b]{height:1.4rem;margin-right:.4rem;border:1px solid #eee}.el-switch.is-disabled[data-v-6941c158]{opacity:1}ul li[data-v-6941c158]{padding-left:2rem}a[data-v-2ed9a082]{text-decoration:underline}a+a[data-v-2ed9a082]{margin-left:1rem}a.green[data-v-2ed9a082]{font-weight:700}.head[data-v-aaafd500]{padding-bottom:1rem}.green[data-v-aaafd500]{color:green;font-weight:700}.error[data-v-aaafd500]{font-weight:700}.error .el-icon[data-v-aaafd500]{vertical-align:text-bottom}.head[data-v-010bdab6]{padding-bottom:1rem}.error[data-v-010bdab6]{font-weight:700}.error .el-icon[data-v-010bdab6]{vertical-align:text-bottom}.plan .el-icon[data-v-010bdab6]{vertical-align:middle;margin-right:.4rem}.head[data-v-ac6bb914]{padding-bottom:1rem}.blue[data-v-ac6bb914]{color:#409eff}.dropdown[data-v-ac6bb914]{border:1px solid #ddd;padding:.4rem;font-size:1.3rem;border-radius:.4rem;position:relative}.dropdown .el-icon[data-v-ac6bb914]{vertical-align:middle}.dropdown .badge[data-v-ac6bb914]{position:absolute;right:-1rem;top:-50%;border-radius:10px;background-color:#f1ae05;color:#fff;padding:.2rem .6rem;font-size:1.2rem}.el-icon.loading[data-v-ac6bb914]{margin-left:.3rem;vertical-align:middle;font-weight:700;animation:loading-ac6bb914 1s linear infinite}@keyframes loading-ac6bb914{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.table-sort.el-table th.el-table__cell.is-leaf{border-bottom:0}.table-sort.el-table .el-table__inner-wrapper:before{height:0}.home-list-wrap[data-v-b24cdae4]{padding:1rem}.home-list-wrap .page[data-v-b24cdae4]{padding-top:1rem}.home-list-wrap .page-wrap[data-v-b24cdae4]{display:inline-block}
\ No newline at end of file
+.table-sort th[data-v-107f04ae]{border-bottom:0}.show-columns[data-v-107f04ae]{vertical-align:middle;font-size:1.2rem}.show-columns .el-icon[data-v-107f04ae]{vertical-align:bottom;font-size:1.2rem}.dropdown[data-v-0338b206]{border:1px solid #ddd;padding:.4rem;font-size:1.3rem;border-radius:.4rem;position:relative}.dropdown .el-icon[data-v-0338b206]{vertical-align:middle}.dropdown .badge[data-v-0338b206]{position:absolute;right:-1rem;top:-50%;border-radius:10px;background-color:#f1ae05;color:#fff;padding:.2rem .6rem;font-size:1.2rem}a[data-v-56c0e8be]{color:#666;text-decoration:underline}a.green[data-v-56c0e8be]{color:green;font-weight:700}a.download[data-v-56c0e8be]{margin-left:.6rem}a.download .el-icon[data-v-56c0e8be]{vertical-align:middle;font-weight:700;margin-left:.3rem}a.download .el-icon.loading[data-v-56c0e8be]{animation:loading-56c0e8be 1s linear infinite}a.download+a.download[data-v-56c0e8be]{margin-left:.2rem}@keyframes loading-56c0e8be{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}img.system[data-v-4931fbdc]{height:1.6rem;vertical-align:middle;margin-left:.4rem}.self[data-v-4931fbdc]{color:#d400ff}.self .el-icon[data-v-4931fbdc]{vertical-align:text-bottom}.ipaddress span[data-v-5db71b03]{vertical-align:middle}.el-input[data-v-5db71b03]{width:12rem;margin-right:.6rem}.el-col[data-v-2e8ef3fe]{text-align:left}.access-wrap[data-v-2e8ef3fe]{height:40rem}.connect-point .el-loading-mask{background-color:transparent}.connect-point .el-loading-spinner{width:100%;height:100%;margin:0;top:0}.connect-point .el-loading-spinner .circular{width:100%;height:100%;vertical-align:top}.connect-point .el-loading-spinner .path{stroke-width:6;stroke:green}div.connect-point[data-v-064c2370]{margin:-.2rem .3rem 0 -1.4rem;position:absolute}span.connect-point[data-v-064c2370]{width:.9rem;height:.9rem;border-radius:50%;display:inline-block;vertical-align:middle;background-color:#eee;border:1px solid #ddd;cursor:pointer;transition:.3s}span.connect-point[data-v-064c2370]:hover{transform:scale(2)}span.connect-point.p2p[data-v-064c2370]{background-color:#01c901;border:1px solid #049538}span.connect-point.relay[data-v-064c2370]{background-color:#e3e811;border:1px solid #b3c410}span.connect-point.node[data-v-064c2370]{background-color:#09dda9;border:1px solid #0cac90}.el-icon.loading[data-v-fc36e330],a.loading[data-v-fc36e330]{vertical-align:middle;font-weight:700;animation:loading-fc36e330 1s linear infinite}.el-switch.is-disabled[data-v-fc36e330]{opacity:1}.el-input[data-v-fc36e330]{width:8rem}.delay[data-v-fc36e330]{position:absolute;right:0;bottom:0;line-height:normal}.switch-btn[data-v-fc36e330]{font-size:1.5rem}.any[data-v-fc36e330]{position:absolute;left:-7px;top:-2px;line-height:normal}.any.green[data-v-fc36e330]{background:linear-gradient(270deg,#caff00,green,#0d6d23,#e38a00,green);background-clip:text;-webkit-background-clip:text;-webkit-text-fill-color:hsla(0,0%,100%,0)}@keyframes loading-fc36e330{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.remark[data-v-1f1a4aca]{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.el-switch.is-disabled[data-v-2eb35cd0]{opacity:1}.wrap[data-v-2eb35cd0]{min-height:40rem}.foot[data-v-87d2a32c]{padding-top:2rem}.el-switch.is-disabled[data-v-67ed3552]{opacity:1}.calc span[data-v-67ed3552]{display:inline-block}.calc span.label[data-v-67ed3552]{width:6rem}.el-transfer.src-tranfer .el-transfer__buttons .el-button{display:block}.el-transfer.src-tranfer .el-transfer__buttons .el-button:nth-child(2){margin:1rem 0 0 0}.el-form-item[data-v-6c157ed4]{margin-bottom:1rem}.head[data-v-0679a99a]{margin-bottom:1rem;color:#555;border:1px solid #eee;padding:0 1rem 1rem 1rem}.firewall.el-table .action-1{color:green}.firewall.el-table .action-2{color:#c83f08}.el-icon.loading[data-v-10c6aa99],a.loading[data-v-10c6aa99]{vertical-align:middle;font-weight:700;animation:loading-10c6aa99 1s linear infinite}.el-switch.is-disabled[data-v-10c6aa99]{opacity:1}.el-input[data-v-10c6aa99]{width:8rem}.switch-btn[data-v-10c6aa99]{font-size:1.5rem}@keyframes loading-10c6aa99{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.el-switch.is-disabled[data-v-2ea91b4b]{opacity:1}.upgrade-wrap[data-v-2ea91b4b]{border:1px solid #ddd;margin-bottom:2rem;padding:1rem}.el-switch.is-disabled[data-v-75e1f126]{opacity:1}.green[data-v-75e1f126]{font-weight:700}img.system[data-v-75e1f126],span.nat[data-v-75e1f126]{height:1.4rem;margin-right:.4rem;border:1px solid #eee;line-height:1.4rem;vertical-align:middle}span.nat[data-v-75e1f126]{display:inline-block;padding:0 .2rem;margin-right:0;font-family:fantasy}.el-switch.is-disabled[data-v-6941c158]{opacity:1}ul li[data-v-6941c158]{padding-left:2rem}a[data-v-2ed9a082]{text-decoration:underline}a+a[data-v-2ed9a082]{margin-left:1rem}a.green[data-v-2ed9a082]{font-weight:700}.head[data-v-aaafd500]{padding-bottom:1rem}.green[data-v-aaafd500]{color:green;font-weight:700}.error[data-v-aaafd500]{font-weight:700}.error .el-icon[data-v-aaafd500]{vertical-align:text-bottom}.head[data-v-010bdab6]{padding-bottom:1rem}.error[data-v-010bdab6]{font-weight:700}.error .el-icon[data-v-010bdab6]{vertical-align:text-bottom}.plan .el-icon[data-v-010bdab6]{vertical-align:middle;margin-right:.4rem}.head[data-v-ac6bb914]{padding-bottom:1rem}.blue[data-v-ac6bb914]{color:#409eff}.dropdown[data-v-ac6bb914]{border:1px solid #ddd;padding:.4rem;font-size:1.3rem;border-radius:.4rem;position:relative}.dropdown .el-icon[data-v-ac6bb914]{vertical-align:middle}.dropdown .badge[data-v-ac6bb914]{position:absolute;right:-1rem;top:-50%;border-radius:10px;background-color:#f1ae05;color:#fff;padding:.2rem .6rem;font-size:1.2rem}.el-icon.loading[data-v-ac6bb914]{margin-left:.3rem;vertical-align:middle;font-weight:700;animation:loading-ac6bb914 1s linear infinite}@keyframes loading-ac6bb914{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.table-sort.el-table th.el-table__cell.is-leaf{border-bottom:0}.table-sort.el-table .el-table__inner-wrapper:before{height:0}.home-list-wrap[data-v-b24cdae4]{padding:1rem}.home-list-wrap .page[data-v-b24cdae4]{padding-top:1rem}.home-list-wrap .page-wrap[data-v-b24cdae4]{display:inline-block}
\ No newline at end of file
diff --git a/src/linker.tray.win/web/index.html b/src/linker.tray.win/web/index.html
index 992678e7..5860a301 100644
--- a/src/linker.tray.win/web/index.html
+++ b/src/linker.tray.win/web/index.html
@@ -1 +1 @@
-linker.web
\ No newline at end of file
+linker.web
\ No newline at end of file
diff --git a/src/linker.tray.win/web/js/373.830a9fb2.js b/src/linker.tray.win/web/js/127.a66584e8.js
similarity index 97%
rename from src/linker.tray.win/web/js/373.830a9fb2.js
rename to src/linker.tray.win/web/js/127.a66584e8.js
index 38020524..edac45be 100644
--- a/src/linker.tray.win/web/js/373.830a9fb2.js
+++ b/src/linker.tray.win/web/js/127.a66584e8.js
@@ -1 +1 @@
-"use strict";(self["webpackChunklinker_web"]=self["webpackChunklinker_web"]||[]).push([[373],{7332:function(e,n,a){a.r(n),a.d(n,{default:function(){return O}});var t=a(6768);const s={class:"net-wrap app-wrap"},l={class:"inner absolute flex flex-column flex-nowrap"},i={class:"head"},o={class:"body flex-1 relative"},c={class:"status"};function r(e,n,a,r,u,d){const g=(0,t.g2)("Head"),p=(0,t.g2)("List"),v=(0,t.g2)("Status");return(0,t.uX)(),(0,t.CE)("div",s,[(0,t.Lk)("div",l,[(0,t.Lk)("div",i,[(0,t.bF)(g)]),(0,t.Lk)("div",o,[(0,t.bF)(p)]),(0,t.Lk)("div",c,[(0,t.bF)(v,{config:!1})])])])}a(4114);var u=a(4232);const d=e=>((0,t.Qi)("data-v-6bfe19a3"),e=e(),(0,t.jt)(),e),g={class:"head-wrap"},p={class:"tools flex"},v={class:"label"},h=d((()=>(0,t.Lk)("span",{class:"flex-1"},null,-1))),f={style:{"margin-left":"1rem"}};function k(e,n,a,s,l,i){const o=(0,t.g2)("Refresh"),c=(0,t.g2)("el-icon"),r=(0,t.g2)("el-button"),d=(0,t.g2)("Background");return(0,t.uX)(),(0,t.CE)("div",g,[(0,t.Lk)("div",p,[(0,t.Lk)("span",v,"分组 : "+(0,u.v_)(s.state.group),1),h,(0,t.bF)(r,{size:"small",onClick:s.handleRefresh},{default:(0,t.k6)((()=>[(0,t.eW)(" 刷新(F5)"),(0,t.bF)(c,null,{default:(0,t.k6)((()=>[(0,t.bF)(o)])),_:1})])),_:1},8,["onClick"]),(0,t.Lk)("div",f,[(0,t.bF)(d,{name:"net"})])])])}var C=a(3830),m=a(144),b=a(7477),L=a(5096),_={components:{Edit:b.ffu,Refresh:b.C42,Background:L.A},setup(){const e=(0,C.B)(),n=(0,m.Kh)({server:(0,t.EW)((()=>e.value.config.Client.Server.Host)),group:(0,t.EW)((()=>e.value.config.Client.Group.Name))}),a=()=>{window.location.reload()};return{state:n,handleRefresh:a}}},w=a(1241);const S=(0,w.A)(_,[["render",k],["__scopeId","data-v-6bfe19a3"]]);var F=S;const x=e=>((0,t.Qi)("data-v-68d1c30a"),e=e(),(0,t.jt)(),e),T={class:"net-list-wrap flex flex-column absolute"},z={class:"flex-1 scrollbar"},E={class:"flex"},A=x((()=>(0,t.Lk)("div",{class:"flex-1"},null,-1))),I={class:"tuntap"},P={class:"page t-c"},B={class:"page-wrap t-c"};function R(e,n,a,s,l,i){const o=(0,t.g2)("DeviceName"),c=(0,t.g2)("UpdaterBtn"),r=(0,t.g2)("TuntapShow"),u=(0,t.g2)("el-pagination");return(0,t.uX)(),(0,t.CE)("div",T,[(0,t.Lk)("div",z,[(0,t.Lk)("ul",null,[((0,t.uX)(!0),(0,t.CE)(t.FK,null,(0,t.pI)(s.devices.page.List,((e,n)=>((0,t.uX)(),(0,t.CE)("li",{key:n},[(0,t.Lk)("dl",null,[(0,t.Lk)("dt",E,[(0,t.Lk)("div",null,[(0,t.bF)(o,{item:e},null,8,["item"])]),A,(0,t.Lk)("div",null,[(0,t.bF)(c,{config:!1,item:e},null,8,["item"])])]),(0,t.Lk)("dd",I,[s.tuntap.list[e.MachineId]?((0,t.uX)(),(0,t.Wv)(r,{key:0,item:e},null,8,["item"])):(0,t.Q3)("",!0)])])])))),128))])]),(0,t.Lk)("div",P,[(0,t.Lk)("div",B,[(0,t.bF)(u,{size:"small",background:"",layout:"prev,pager, next","pager-count":5,total:s.devices.page.Count,"page-size":s.devices.page.Request.Size,"current-page":s.devices.page.Request.Page,onCurrentChange:s.handlePageChange,onSizeChange:s.handlePageSizeChange,"page-sizes":[10,20,50,100,255]},null,8,["total","page-size","current-page","onCurrentChange","onSizeChange"])])])])}var D=a(8104),X=a(7985),y=a(9383),N=a(7115),U=a(263),Q=a(4877),W=a(9983),H={components:{StarFilled:b.BQ2,UpdaterBtn:N.A,DeviceName:U.A,TuntapShow:Q.A},setup(e){(0,C.B)();const n=(0,m.Kh)({}),{devices:a,machineId:s,_getSignList:l,_getSignList1:i,handleDeviceEdit:o,handlePageChange:c,handlePageSizeChange:r,handleDel:u,clearDevicesTimeout:d}=(0,X.r)(),{tuntap:g,_getTuntapInfo:p,handleTuntapRefresh:v,clearTuntapTimeout:h,handleTuntapEdit:f,sortTuntapIP:k}=(0,D.O)(),{_getUpdater:b,_subscribeUpdater:L,clearUpdaterTimeout:_}=(0,y.d)(),{connections:w,forwardConnections:S,_getForwardConnections:F,tuntapConnections:x,_getTuntapConnections:T,socks5Connections:z,_getSocks5Connections:E,handleTunnelConnections:A,clearConnectionsTimeout:I}=(0,W.L2)();return(0,t.sV)((()=>{c(),v(),l(),i(),p(),b(),L()})),(0,t.hi)((()=>{d(),h(),_()})),{state:n,devices:a,machineId:s,handlePageChange:c,handlePageSizeChange:r,tuntap:g}}};const K=(0,w.A)(H,[["render",R],["__scopeId","data-v-68d1c30a"]]);var j=K,q=a(5317),M=a(1387),V={components:{Head:F,List:j,Status:q.A},setup(){document.addEventListener("contextmenu",(function(e){e.preventDefault()}));const e=(0,C.B)(),n=(0,M.rd)();return(0,t.sV)((()=>{0==e.value.hasAccess("NetManager")&&n.push({name:"NoPermission"})})),{}}};const G=(0,w.A)(V,[["render",r],["__scopeId","data-v-6a3f3b43"]]);var O=G}}]);
\ No newline at end of file
+"use strict";(self["webpackChunklinker_web"]=self["webpackChunklinker_web"]||[]).push([[127],{7332:function(e,n,a){a.r(n),a.d(n,{default:function(){return O}});var t=a(6768);const s={class:"net-wrap app-wrap"},l={class:"inner absolute flex flex-column flex-nowrap"},i={class:"head"},o={class:"body flex-1 relative"},c={class:"status"};function r(e,n,a,r,u,d){const g=(0,t.g2)("Head"),p=(0,t.g2)("List"),v=(0,t.g2)("Status");return(0,t.uX)(),(0,t.CE)("div",s,[(0,t.Lk)("div",l,[(0,t.Lk)("div",i,[(0,t.bF)(g)]),(0,t.Lk)("div",o,[(0,t.bF)(p)]),(0,t.Lk)("div",c,[(0,t.bF)(v,{config:!1})])])])}a(4114);var u=a(4232);const d=e=>((0,t.Qi)("data-v-6bfe19a3"),e=e(),(0,t.jt)(),e),g={class:"head-wrap"},p={class:"tools flex"},v={class:"label"},h=d((()=>(0,t.Lk)("span",{class:"flex-1"},null,-1))),f={style:{"margin-left":"1rem"}};function k(e,n,a,s,l,i){const o=(0,t.g2)("Refresh"),c=(0,t.g2)("el-icon"),r=(0,t.g2)("el-button"),d=(0,t.g2)("Background");return(0,t.uX)(),(0,t.CE)("div",g,[(0,t.Lk)("div",p,[(0,t.Lk)("span",v,"分组 : "+(0,u.v_)(s.state.group),1),h,(0,t.bF)(r,{size:"small",onClick:s.handleRefresh},{default:(0,t.k6)((()=>[(0,t.eW)(" 刷新(F5)"),(0,t.bF)(c,null,{default:(0,t.k6)((()=>[(0,t.bF)(o)])),_:1})])),_:1},8,["onClick"]),(0,t.Lk)("div",f,[(0,t.bF)(d,{name:"net"})])])])}var C=a(3830),m=a(144),b=a(7477),L=a(5096),_={components:{Edit:b.ffu,Refresh:b.C42,Background:L.A},setup(){const e=(0,C.B)(),n=(0,m.Kh)({server:(0,t.EW)((()=>e.value.config.Client.Server.Host)),group:(0,t.EW)((()=>e.value.config.Client.Group.Name))}),a=()=>{window.location.reload()};return{state:n,handleRefresh:a}}},w=a(1241);const S=(0,w.A)(_,[["render",k],["__scopeId","data-v-6bfe19a3"]]);var F=S;const x=e=>((0,t.Qi)("data-v-68d1c30a"),e=e(),(0,t.jt)(),e),T={class:"net-list-wrap flex flex-column absolute"},z={class:"flex-1 scrollbar"},E={class:"flex"},A=x((()=>(0,t.Lk)("div",{class:"flex-1"},null,-1))),I={class:"tuntap"},P={class:"page t-c"},B={class:"page-wrap t-c"};function R(e,n,a,s,l,i){const o=(0,t.g2)("DeviceName"),c=(0,t.g2)("UpdaterBtn"),r=(0,t.g2)("TuntapShow"),u=(0,t.g2)("el-pagination");return(0,t.uX)(),(0,t.CE)("div",T,[(0,t.Lk)("div",z,[(0,t.Lk)("ul",null,[((0,t.uX)(!0),(0,t.CE)(t.FK,null,(0,t.pI)(s.devices.page.List,((e,n)=>((0,t.uX)(),(0,t.CE)("li",{key:n},[(0,t.Lk)("dl",null,[(0,t.Lk)("dt",E,[(0,t.Lk)("div",null,[(0,t.bF)(o,{item:e},null,8,["item"])]),A,(0,t.Lk)("div",null,[(0,t.bF)(c,{config:!1,item:e},null,8,["item"])])]),(0,t.Lk)("dd",I,[s.tuntap.list[e.MachineId]?((0,t.uX)(),(0,t.Wv)(r,{key:0,item:e},null,8,["item"])):(0,t.Q3)("",!0)])])])))),128))])]),(0,t.Lk)("div",P,[(0,t.Lk)("div",B,[(0,t.bF)(u,{size:"small",background:"",layout:"prev,pager, next","pager-count":5,total:s.devices.page.Count,"page-size":s.devices.page.Request.Size,"current-page":s.devices.page.Request.Page,onCurrentChange:s.handlePageChange,onSizeChange:s.handlePageSizeChange,"page-sizes":[10,20,50,100,255]},null,8,["total","page-size","current-page","onCurrentChange","onSizeChange"])])])])}var D=a(8104),X=a(7985),y=a(9383),N=a(7115),U=a(263),Q=a(4877),W=a(9983),H={components:{StarFilled:b.BQ2,UpdaterBtn:N.A,DeviceName:U.A,TuntapShow:Q.A},setup(e){(0,C.B)();const n=(0,m.Kh)({}),{devices:a,machineId:s,_getSignList:l,_getSignList1:i,handleDeviceEdit:o,handlePageChange:c,handlePageSizeChange:r,handleDel:u,clearDevicesTimeout:d}=(0,X.r)(),{tuntap:g,_getTuntapInfo:p,handleTuntapRefresh:v,clearTuntapTimeout:h,handleTuntapEdit:f,sortTuntapIP:k}=(0,D.O)(),{_getUpdater:b,_subscribeUpdater:L,clearUpdaterTimeout:_}=(0,y.d)(),{connections:w,forwardConnections:S,_getForwardConnections:F,tuntapConnections:x,_getTuntapConnections:T,socks5Connections:z,_getSocks5Connections:E,handleTunnelConnections:A,clearConnectionsTimeout:I}=(0,W.L2)();return(0,t.sV)((()=>{c(),v(),l(),i(),p(),b(),L()})),(0,t.hi)((()=>{d(),h(),_()})),{state:n,devices:a,machineId:s,handlePageChange:c,handlePageSizeChange:r,tuntap:g}}};const K=(0,w.A)(H,[["render",R],["__scopeId","data-v-68d1c30a"]]);var j=K,q=a(1337),M=a(1387),V={components:{Head:F,List:j,Status:q.A},setup(){document.addEventListener("contextmenu",(function(e){e.preventDefault()}));const e=(0,C.B)(),n=(0,M.rd)();return(0,t.sV)((()=>{0==e.value.hasAccess("NetManager")&&n.push({name:"NoPermission"})})),{}}};const G=(0,w.A)(V,[["render",r],["__scopeId","data-v-6a3f3b43"]]);var O=G}}]);
\ No newline at end of file
diff --git a/src/linker.tray.win/web/js/201.cc55b869.js b/src/linker.tray.win/web/js/201.cc55b869.js
deleted file mode 100644
index 7578acaa..00000000
--- a/src/linker.tray.win/web/js/201.cc55b869.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self["webpackChunklinker_web"]=self["webpackChunklinker_web"]||[]).push([[201],{743:function(e,l,a){a.d(l,{Ap:function(){return n},Co:function(){return o},DY:function(){return u},JT:function(){return m},Qs:function(){return i},Uh:function(){return p},a9:function(){return s},eX:function(){return c},gz:function(){return d},nP:function(){return h},pY:function(){return r}});var t=a(4);const n=()=>(0,t.zG)("sforward/GetSecretKey"),o=e=>(0,t.zG)("sforward/SetSecretKey",e),r=e=>(0,t.zG)("sforward/get",e),s=()=>(0,t.zG)("sforward/refresh"),d=(e="0")=>(0,t.zG)("sforward/getcount",e),u=e=>(0,t.zG)("sforward/remove",e),i=e=>(0,t.zG)("sforward/add",e),c=e=>(0,t.zG)("sforward/TestLocal",e),h=e=>(0,t.zG)("sforward/start",e),m=e=>(0,t.zG)("sforward/stop",e),p=e=>(0,t.zG)("sforward/checkkey",e)},5833:function(e,l,a){a.r(l),a.d(l,{default:function(){return Po}});var t=a(6768),n=a(4232);const o={class:"home-list-wrap absolute"},r={class:"page-wrap"};function s(e,l,a,s,d,u){const i=(0,t.g2)("Sort"),c=(0,t.g2)("Device"),h=(0,t.g2)("Tunnel"),m=(0,t.g2)("Tuntap"),p=(0,t.g2)("Socks5"),g=(0,t.g2)("Forward"),w=(0,t.g2)("Oper"),k=(0,t.g2)("el-table"),v=(0,t.g2)("el-pagination"),f=(0,t.g2)("DeviceEdit"),b=(0,t.g2)("AccessEdit"),C=(0,t.g2)("TunnelEdit"),F=(0,t.g2)("ConnectionsEdit"),y=(0,t.g2)("TuntapEdit"),E=(0,t.g2)("TuntapRoutes"),_=(0,t.g2)("TuntapFirewall"),V=(0,t.g2)("Socks5Edit"),L=(0,t.g2)("TuntapLease"),P=(0,t.g2)("ForwardEdit"),I=(0,t.g2)("SForwardEdit"),T=(0,t.g2)("UpdaterConfirm"),M=(0,t.g2)("Stopwatch");return(0,t.uX)(),(0,t.CE)("div",o,[(0,t.bF)(i,{onSort:s.handleSortChange},null,8,["onSort"]),(0,t.bF)(k,{data:s.devices.page.List,stripe:"",border:"",style:{width:"100%"},height:`${s.state.height}px`,size:"small"},{default:(0,t.k6)((()=>[(0,t.bF)(c,{onEdit:s.handleDeviceEdit,onRefresh:s.handlePageRefresh},null,8,["onEdit","onRefresh"]),(0,t.bF)(h,{onEdit:s.handleTunnelEdit,onRefresh:s.handleTunnelRefresh,onConnections:s.handleTunnelConnections},null,8,["onEdit","onRefresh","onConnections"]),(0,t.bF)(m,{onEdit:s.handleTuntapEdit,onRefresh:s.handleTuntapRefresh},null,8,["onEdit","onRefresh"]),(0,t.bF)(p,{onEdit:s.handleSocks5Edit,onRefresh:s.handleSocks5Refresh},null,8,["onEdit","onRefresh"]),(0,t.bF)(g,{onEdit:s.handleForwardEdit,onSedit:s.handleSForwardEdit},null,8,["onEdit","onSedit"]),(0,t.bF)(w,{onRefresh:s.handlePageRefresh,onAccess:s.handleAccessEdit},null,8,["onRefresh","onAccess"])])),_:1},8,["data","height"]),(0,t.Lk)("div",{class:(0,n.C4)(["page",{"t-c":s.globalData.isPc}])},[(0,t.Lk)("div",r,[(0,t.bF)(v,{small:"",background:"",total:s.devices.page.Count,"pager-count":s.globalData.isPc?7:3,layout:s.globalData.isPc?"total,sizes,prev,pager, next":"prev, pager, next","page-size":s.devices.page.Request.Size,"current-page":s.devices.page.Request.Page,onCurrentChange:s.handlePageChange,onSizeChange:s.handlePageSizeChange,"page-sizes":[10,20,50,100,255]},null,8,["total","pager-count","layout","page-size","current-page","onCurrentChange","onSizeChange"])])],2),s.devices.showDeviceEdit?((0,t.uX)(),(0,t.Wv)(f,{key:0,modelValue:s.devices.showDeviceEdit,"onUpdate:modelValue":l[0]||(l[0]=e=>s.devices.showDeviceEdit=e),onChange:s.handlePageChange,data:s.devices.deviceInfo},null,8,["modelValue","onChange","data"])):(0,t.Q3)("",!0),s.devices.showAccessEdit?((0,t.uX)(),(0,t.Wv)(b,{key:1,modelValue:s.devices.showAccessEdit,"onUpdate:modelValue":l[1]||(l[1]=e=>s.devices.showAccessEdit=e),onChange:s.handlePageChange,data:s.devices.deviceInfo},null,8,["modelValue","onChange","data"])):(0,t.Q3)("",!0),s.tunnel.showEdit?((0,t.uX)(),(0,t.Wv)(C,{key:2,modelValue:s.tunnel.showEdit,"onUpdate:modelValue":l[2]||(l[2]=e=>s.tunnel.showEdit=e),onChange:s.handleTunnelRefresh},null,8,["modelValue","onChange"])):(0,t.Q3)("",!0),s.connections.showEdit?((0,t.uX)(),(0,t.Wv)(F,{key:3,modelValue:s.connections.showEdit,"onUpdate:modelValue":l[3]||(l[3]=e=>s.connections.showEdit=e)},null,8,["modelValue"])):(0,t.Q3)("",!0),s.tuntap.showEdit?((0,t.uX)(),(0,t.Wv)(y,{key:4,modelValue:s.tuntap.showEdit,"onUpdate:modelValue":l[4]||(l[4]=e=>s.tuntap.showEdit=e),onChange:s.handleTuntapRefresh},null,8,["modelValue","onChange"])):(0,t.Q3)("",!0),s.tuntap.showRoutes?((0,t.uX)(),(0,t.Wv)(E,{key:5,modelValue:s.tuntap.showRoutes,"onUpdate:modelValue":l[5]||(l[5]=e=>s.tuntap.showRoutes=e)},null,8,["modelValue"])):(0,t.Q3)("",!0),s.tuntap.showFirewall?((0,t.uX)(),(0,t.Wv)(_,{key:6,modelValue:s.tuntap.showFirewall,"onUpdate:modelValue":l[6]||(l[6]=e=>s.tuntap.showFirewall=e)},null,8,["modelValue"])):(0,t.Q3)("",!0),s.socks5.showEdit?((0,t.uX)(),(0,t.Wv)(V,{key:7,modelValue:s.socks5.showEdit,"onUpdate:modelValue":l[7]||(l[7]=e=>s.socks5.showEdit=e),onChange:s.handleSocks5Refresh},null,8,["modelValue","onChange"])):(0,t.Q3)("",!0),s.tuntap.showLease?((0,t.uX)(),(0,t.Wv)(L,{key:8,modelValue:s.tuntap.showLease,"onUpdate:modelValue":l[8]||(l[8]=e=>s.tuntap.showLease=e),onChange:s.handleTuntapRefresh},null,8,["modelValue","onChange"])):(0,t.Q3)("",!0),s.forward.showEdit?((0,t.uX)(),(0,t.Wv)(P,{key:9,modelValue:s.forward.showEdit,"onUpdate:modelValue":l[9]||(l[9]=e=>s.forward.showEdit=e)},null,8,["modelValue"])):(0,t.Q3)("",!0),s.sforward.showEdit?((0,t.uX)(),(0,t.Wv)(I,{key:10,modelValue:s.sforward.showEdit,"onUpdate:modelValue":l[10]||(l[10]=e=>s.sforward.showEdit=e)},null,8,["modelValue"])):(0,t.Q3)("",!0),s.updater.show?((0,t.uX)(),(0,t.Wv)(T,{key:11,modelValue:s.updater.show,"onUpdate:modelValue":l[11]||(l[11]=e=>s.updater.show=e)},null,8,["modelValue"])):(0,t.Q3)("",!0),s.flow.show?((0,t.uX)(),(0,t.Wv)(M,{key:12,modelValue:s.flow.show,"onUpdate:modelValue":l[12]||(l[12]=e=>s.flow.show=e)},null,8,["modelValue"])):(0,t.Q3)("",!0)])}a(4114);var d=a(3830),u=a(144),i=a(1219);const c={class:"el-dropdown-link"};function h(e,l,a,n,o,r){const s=(0,t.g2)("el-table-column"),d=(0,t.g2)("ArrowDownBold"),u=(0,t.g2)("el-icon"),i=(0,t.g2)("el-checkbox"),h=(0,t.g2)("el-dropdown-item"),m=(0,t.g2)("el-dropdown-menu"),p=(0,t.g2)("el-dropdown"),g=(0,t.g2)("el-table");return(0,t.uX)(),(0,t.Wv)(g,{border:"",style:{width:"100%"},height:"32px",size:"small",onSortChange:n.handleSortChange,class:"table-sort"},{default:(0,t.k6)((()=>[(0,t.bF)(s,{prop:"MachineId",label:"设备名",width:"110",sortable:"custom"}),(0,t.bF)(s,{prop:"Version",label:"版本",width:"110",sortable:"custom"}),(0,t.bF)(s,{prop:"tunnel",label:"网络",width:"76",sortable:"custom"}),n.tuntap.show?((0,t.uX)(),(0,t.Wv)(s,{key:0,prop:"tuntap",label:"网卡IP",width:"160",sortable:"custom"})):(0,t.Q3)("",!0),n.socks5.show?((0,t.uX)(),(0,t.Wv)(s,{key:1,prop:"socks5",label:"代理转发",width:"160",sortable:"custom"})):(0,t.Q3)("",!0),(0,t.bF)(s,{label:"columns",fixed:"right"},{header:(0,t.k6)((()=>[(0,t.bF)(p,{class:"show-columns"},{dropdown:(0,t.k6)((()=>[(0,t.bF)(m,null,{default:(0,t.k6)((()=>[(0,t.bF)(h,null,{default:(0,t.k6)((()=>[(0,t.bF)(i,{modelValue:n.tuntap.show,"onUpdate:modelValue":l[0]||(l[0]=e=>n.tuntap.show=e),onChange:n.handleTuntapShow,size:"small",style:{"margin-right":"1rem"}},{default:(0,t.k6)((()=>[(0,t.eW)("网卡")])),_:1},8,["modelValue","onChange"])])),_:1}),(0,t.bF)(h,null,{default:(0,t.k6)((()=>[(0,t.bF)(i,{modelValue:n.socks5.show,"onUpdate:modelValue":l[1]||(l[1]=e=>n.socks5.show=e),onChange:n.handleSocks5Show,size:"small",style:{"margin-right":"1rem"}},{default:(0,t.k6)((()=>[(0,t.eW)("代理")])),_:1},8,["modelValue","onChange"])])),_:1}),(0,t.bF)(h,null,{default:(0,t.k6)((()=>[(0,t.bF)(i,{modelValue:n.forward.show,"onUpdate:modelValue":l[2]||(l[2]=e=>n.forward.show=e),onChange:n.handleForwardShow,size:"small",style:{"margin-right":"0rem"}},{default:(0,t.k6)((()=>[(0,t.eW)("转发")])),_:1},8,["modelValue","onChange"])])),_:1})])),_:1})])),default:(0,t.k6)((()=>[(0,t.Lk)("span",c,[(0,t.eW)("显示项"),(0,t.bF)(u,null,{default:(0,t.k6)((()=>[(0,t.bF)(d)])),_:1})])])),_:1})])),_:1})])),_:1},8,["onSortChange"])}var m=a(7716);const p=Symbol(),g=()=>{(0,d.B)();const e=(0,u.KR)({show:!0,timer:0,showEdit:!1,machineId:null,list:{},hashcode:0});(0,t.Gt)(p,e);const l=()=>{(0,m.dS)()},a=()=>{clearTimeout(e.value.timer),(0,m.V1)(e.value.hashcode.toString()).then((l=>{e.value.hashcode=l.HashCode,l.List&&(e.value.list=l.List),e.value.timer=setTimeout(a,1020)})).catch((()=>{e.value.timer=setTimeout(a,1020)}))},n=l=>{e.value.machineId=l[0],e.value.machineName=l[1],e.value.showEdit=!0},o=()=>{clearTimeout(e.value.timer)};return{forward:e,_getForwardCountInfo:a,handleForwardEdit:n,clearForwardTimeout:o,handleForwardRefresh:l}},w=()=>(0,t.WQ)(p);var k=a(2173);const v=Symbol(),f=()=>{const e=(0,u.KR)({show:!0,timer:0,showEdit:!1,current:null,list:{},hashcode:0});(0,t.Gt)(v,e);const l=()=>{clearTimeout(e.value.timer),(0,k.$y)(e.value.hashcode.toString()).then((a=>{if(e.value.hashcode=a.HashCode,a.List){for(let e in a.List)Object.assign(a.List[e],{running:2==a.List[e].Status,loading:1==a.List[e].Status});e.value.list=a.List}e.value.timer=setTimeout(l,1100)})).catch((a=>{e.value.timer=setTimeout(l,1100)}))},a=l=>{e.value.current=l,e.value.showEdit=!0},n=()=>{(0,k.QP)()},o=()=>{clearTimeout(e.value.timer),e.value.timer=0},r=l=>Object.values(e.value.list).filter((e=>e.Port.toString().indexOf(l)>=0||e.Lans.filter((e=>e.IP.indexOf(l)>=0)).length>0)).map((e=>e.MachineId)),s=l=>{const a=Object.values(e.value.list).sort(((e,l)=>e.Port-l.Port));return a.map((e=>e.MachineId))};return{socks5:e,_getSocks5Info:l,handleSocks5Edit:a,handleSocks5Refresh:n,clearSocks5Timeout:o,getSocks5Machines:r,sortSocks5:s}},b=()=>(0,t.WQ)(v);var C=a(8104),F=a(7477),y={emits:["sort"],components:{ArrowDownBold:F.$bU},setup(e,{emit:l}){const a=(0,C.W)();a.value.show="false"!=localStorage.getItem("tuntap.show");const t=b();t.value.show="false"!=localStorage.getItem("socks5.show");const n=w();n.value.show="false"!=localStorage.getItem("forward.show");const o=e=>{l("sort",e)},r=()=>{localStorage.setItem("tuntap.show",a.value.show)},s=()=>{localStorage.setItem("socks5.show",t.value.show)},d=()=>{localStorage.setItem("forward.show",n.value.show)};return{tuntap:a,socks5:t,forward:n,handleSortChange:o,handleTuntapShow:r,handleSocks5Show:s,handleForwardShow:d}}},E=a(1241);const _=(0,E.A)(y,[["render",h],["__scopeId","data-v-107f04ae"]]);var V=_;const L=e=>((0,t.Qi)("data-v-0338b206"),e=e(),(0,t.jt)(),e),P={class:"dropdown"},I=L((()=>(0,t.Lk)("span",null,"操作",-1)));function T(e,l,a,n,o,r){const s=(0,t.g2)("ArrowDown"),d=(0,t.g2)("el-icon"),u=(0,t.g2)("SwitchButton"),i=(0,t.g2)("el-dropdown-item"),c=(0,t.g2)("Delete"),h=(0,t.g2)("Flag"),m=(0,t.g2)("HelpFilled"),p=(0,t.g2)("Platform"),g=(0,t.g2)("Paperclip"),w=(0,t.g2)("CircleCheck"),k=(0,t.g2)("el-dropdown-menu"),v=(0,t.g2)("el-dropdown"),f=(0,t.g2)("el-table-column");return(0,t.uX)(),(0,t.Wv)(f,{label:"操作",fixed:"right",width:"75"},{default:(0,t.k6)((a=>[(0,t.bF)(v,{size:"small"},{dropdown:(0,t.k6)((()=>[(0,t.bF)(k,null,{default:(0,t.k6)((()=>[a.row.showReboot&&n.hasReboot?((0,t.uX)(),(0,t.Wv)(i,{key:0,onClick:e=>n.handleExit(a.row.MachineId,a.row.MachineName)},{default:(0,t.k6)((()=>[(0,t.bF)(d,null,{default:(0,t.k6)((()=>[(0,t.bF)(u)])),_:1}),(0,t.eW)(" 重启")])),_:2},1032,["onClick"])):(0,t.Q3)("",!0),a.row.showDel&&n.hasRemove?((0,t.uX)(),(0,t.Wv)(i,{key:1,onClick:e=>n.handleDel(a.row.MachineId,a.row.MachineName)},{default:(0,t.k6)((()=>[(0,t.bF)(d,null,{default:(0,t.k6)((()=>[(0,t.bF)(c)])),_:1}),(0,t.eW)(" 删除")])),_:2},1032,["onClick"])):(0,t.Q3)("",!0),n.handleShowAccess(a.row,n.accessList[a.row.MachineId]||0)?((0,t.uX)(),(0,t.Wv)(i,{key:2,onClick:e=>n.handleAccess(a.row)},{default:(0,t.k6)((()=>[(0,t.bF)(d,null,{default:(0,t.k6)((()=>[(0,t.bF)(h)])),_:1}),(0,t.eW)(" 权限")])),_:2},1032,["onClick"])):(0,t.Q3)("",!0),a.row.isSelf&&n.hasApiPassword?((0,t.uX)(),(0,t.Wv)(i,{key:3,onClick:e=>n.handleApiPassword(a.row)},{default:(0,t.k6)((()=>[(0,t.bF)(d,null,{default:(0,t.k6)((()=>[(0,t.bF)(m)])),_:1}),(0,t.eW)(" 管理接口")])),_:2},1032,["onClick"])):n.hasApiPasswordOther?((0,t.uX)(),(0,t.Wv)(i,{key:4,onClick:e=>n.handleApiPassword(a.row)},{default:(0,t.k6)((()=>[(0,t.bF)(d,null,{default:(0,t.k6)((()=>[(0,t.bF)(m)])),_:1}),(0,t.eW)(" 管理接口")])),_:2},1032,["onClick"])):(0,t.Q3)("",!0),(0,t.bF)(i,{onClick:e=>n.handleStopwatch(a.row.MachineId,a.row.MachineName)},{default:(0,t.k6)((()=>[(0,t.bF)(d,null,{default:(0,t.k6)((()=>[(0,t.bF)(p)])),_:1}),(0,t.eW)("它的信标")])),_:2},1032,["onClick"]),(0,t.bF)(i,{onClick:l[0]||(l[0]=l=>n.handleStopwatch("",e.$t("status.messenger")))},{default:(0,t.k6)((()=>[(0,t.bF)(d,null,{default:(0,t.k6)((()=>[(0,t.bF)(p)])),_:1}),(0,t.eW)("服务器信标")])),_:1}),(0,t.bF)(i,{onClick:e=>n.handleRoutes(a.row.MachineId,a.row.MachineName)},{default:(0,t.k6)((()=>[(0,t.bF)(d,null,{default:(0,t.k6)((()=>[(0,t.bF)(g)])),_:1}),(0,t.eW)("网卡路由")])),_:2},1032,["onClick"]),a.row.isSelf&&n.hasFirewallSelf?((0,t.uX)(),(0,t.Wv)(i,{key:5,onClick:e=>n.handleFirewall(a.row.MachineId,a.row.MachineName)},{default:(0,t.k6)((()=>[(0,t.bF)(d,null,{default:(0,t.k6)((()=>[(0,t.bF)(w)])),_:1}),(0,t.eW)("防火墙")])),_:2},1032,["onClick"])):n.hasFirewallOther?((0,t.uX)(),(0,t.Wv)(i,{key:6,onClick:e=>n.handleFirewall(a.row.MachineId,a.row.MachineName)},{default:(0,t.k6)((()=>[(0,t.bF)(d,null,{default:(0,t.k6)((()=>[(0,t.bF)(w)])),_:1}),(0,t.eW)("防火墙")])),_:2},1032,["onClick"])):(0,t.Q3)("",!0)])),_:2},1024)])),default:(0,t.k6)((()=>[(0,t.Lk)("div",P,[I,(0,t.bF)(d,{class:"el-icon--right"},{default:(0,t.k6)((()=>[(0,t.bF)(s)])),_:1})])])),_:2},1024)])),_:1})}var M=a(9299),S=a(920),W=a(2933),A=a(5962),X=a(3363);const R=Symbol(),x=()=>{const e=(0,u.KR)({device:{},show:!1});return(0,t.Gt)(R,e),{flow:e}},N=()=>(0,t.WQ)(R);var B={emits:["refresh","access"],components:{Delete:F.epd,SwitchButton:F.L$q,ArrowDown:F.yd$,Flag:F.lNU,HelpFilled:F.adD,Platform:F.ODD,Paperclip:F.xv8,CircleCheck:F.rW7},setup(e,{emit:l}){const a=(0,d.B)(),n=(0,A.q)(),o=(0,t.EW)((()=>a.value.config.Client.Access)),r=(0,t.EW)((()=>a.value.hasAccess("Access"))),s=(0,t.EW)((()=>n.value.list)),u=(0,t.EW)((()=>a.value.hasAccess("Reboot"))),c=(0,t.EW)((()=>a.value.hasAccess("Remove"))),h=(0,t.EW)((()=>a.value.hasAccess("SetApiPassword"))),m=(0,t.EW)((()=>a.value.hasAccess("SetApiPasswordOther"))),p=(0,t.EW)((()=>a.value.hasAccess("FirewallSelf"))),g=(0,t.EW)((()=>a.value.hasAccess("FirewallOther"))),w=N(),k=(0,C.W)(),v=(e,a)=>{W.s.confirm(`确认删除[${a}]?`,"提示",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}).then((()=>{(0,M.Se)(e).then((()=>{l("refresh")}))})).catch((()=>{}))},f=(e,a)=>{W.s.confirm(`确认关闭[${a}]?`,"提示",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}).then((()=>{(0,S.NS)(e).then((()=>{l("refresh")}))})).catch((()=>{}))},b=(e,l)=>e.showAccess&&r.value&&l>=0&&0==+(~BigInt(o.value)&BigInt(l)).toString(),F=e=>{l("access",e)},y=e=>{W.s.prompt("输入新的管理接口密码",`重置【${e.MachineName}】的接口密码`,{confirmButtonText:"确定",cancelButtonText:"取消",inputPattern:/^[0-9a-zA-Z]{1,32}$/,inputErrorMessage:"数字字母1-32位"}).then((({value:l})=>{(0,X.gv)({machineId:e.MachineId,password:l}).then((()=>{i.nk.success("操作成功,重启后生效~")})).catch((()=>{i.nk.error("操作失败~")}))})).catch((()=>{}))},E=(e,l)=>{w.value.device.id=e,w.value.device.name=l,w.value.show=!0},_=(e,l)=>{k.value.device.id=e,k.value.device.name=l,k.value.showRoutes=!0},V=(e,l)=>{k.value.device.id=e,k.value.device.name=l,k.value.showFirewall=!0};return{accessList:s,handleDel:v,handleExit:f,hasReboot:u,hasRemove:c,hasAccess:r,handleShowAccess:b,handleAccess:F,hasApiPassword:h,hasApiPasswordOther:m,handleApiPassword:y,handleStopwatch:E,handleRoutes:_,hasFirewallSelf:p,hasFirewallOther:g,handleFirewall:V}}};const U=(0,E.A)(B,[["render",T],["__scopeId","data-v-0338b206"]]);var $=U;const D=e=>((0,t.Qi)("data-v-5db71b03"),e=e(),(0,t.jt)(),e),z={class:"flex"},O=D((()=>(0,t.Lk)("span",{class:"flex-1"},"设备",-1))),Q={class:"flex"},j=["onClick"],K=["onClick"],G=D((()=>(0,t.Lk)("span",null,"😴㊙.㊙.㊙.㊙",-1))),q=[G],H=D((()=>(0,t.Lk)("span",{class:"flex-1"},null,-1)));function J(e,l,a,o,r,s){const d=(0,t.g2)("el-input"),u=(0,t.g2)("Search"),i=(0,t.g2)("el-icon"),c=(0,t.g2)("el-button"),h=(0,t.g2)("DeviceName"),m=(0,t.g2)("UpdaterBtn"),p=(0,t.g2)("el-table-column");return(0,t.uX)(),(0,t.Wv)(p,{prop:"MachineId",label:"设备",width:"220"},{header:(0,t.k6)((()=>[(0,t.Lk)("div",z,[O,(0,t.Lk)("span",null,[(0,t.bF)(d,{size:"small",modelValue:o.name,"onUpdate:modelValue":l[0]||(l[0]=e=>o.name=e),clearable:"",onInput:o.handleRefresh,placeholder:"设备/虚拟网卡/端口转发"},null,8,["modelValue","onInput"])]),(0,t.Lk)("span",null,[(0,t.bF)(c,{size:"small",onClick:o.handleRefresh},{default:(0,t.k6)((()=>[(0,t.bF)(i,null,{default:(0,t.k6)((()=>[(0,t.bF)(u)])),_:1})])),_:1},8,["onClick"])])])])),default:(0,t.k6)((e=>[(0,t.Lk)("div",null,[(0,t.Lk)("p",null,[(0,t.bF)(h,{onEdit:o.handleEdit,config:!0,item:e.row},null,8,["onEdit","item"])]),(0,t.Lk)("p",Q,[e.row.showip?((0,t.uX)(),(0,t.CE)("span",{key:0,title:"此设备的外网IP",class:"ipaddress",onClick:l=>o.handleExternal(e.row)},[(0,t.Lk)("span",null,"😀"+(0,n.v_)(e.row.IP),1)],8,j)):((0,t.uX)(),(0,t.CE)("span",{key:1,title:"此设备的外网IP",class:"ipaddress",onClick:l=>o.handleExternal(e.row)},q,8,K)),H,0==e.row.showip?((0,t.uX)(),(0,t.Wv)(m,{key:2,config:!0,item:e.row},null,8,["item"])):(0,t.Q3)("",!0)])])])),_:1})}var Z=a(7115),Y=a(263),ee={emits:["edit","refresh"],components:{Search:F.vji,UpdaterBtn:Z.A,DeviceName:Y.A},setup(e,{emit:l}){const a=(0,d.B)(),n=(0,t.EW)((()=>a.value.hasAccess("ExternalShow"))),o=(0,u.KR)(sessionStorage.getItem("search-name")||""),r=e=>{n.value&&(e.showip=!e.showip)},s=e=>{l("edit",e)},i=()=>{sessionStorage.setItem("search-name",o.value),l("refresh",o.value)};return{handleEdit:s,handleRefresh:i,name:o,handleExternal:r}}};const le=(0,E.A)(ee,[["render",J],["__scopeId","data-v-5db71b03"]]);var ae=le;const te=(0,t.Lk)("div",null,"修改后最好能重启一次客户端",-1),ne={class:"t-c w-100"};function oe(e,l,a,n,o,r){const s=(0,t.g2)("el-form-item"),d=(0,t.g2)("el-input"),u=(0,t.g2)("el-button"),i=(0,t.g2)("el-form"),c=(0,t.g2)("el-dialog");return(0,t.uX)(),(0,t.Wv)(c,{modelValue:n.state.show,"onUpdate:modelValue":l[2]||(l[2]=e=>n.state.show=e),"close-on-click-modal":!1,"append-to":".app-wrap",title:`设置[${n.state.ruleForm.MachineName}]设备`,width:"360"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",null,[(0,t.bF)(i,{ref:"ruleFormRef",model:n.state.ruleForm,rules:n.state.rules,"label-width":"auto"},{default:(0,t.k6)((()=>[(0,t.bF)(s,{label:""},{default:(0,t.k6)((()=>[te])),_:1}),(0,t.bF)(s,{label:"设备名",prop:"MachineName"},{default:(0,t.k6)((()=>[(0,t.bF)(d,{maxlength:"32","show-word-limit":"",modelValue:n.state.ruleForm.MachineName,"onUpdate:modelValue":l[0]||(l[0]=e=>n.state.ruleForm.MachineName=e)},null,8,["modelValue"])])),_:1}),(0,t.bF)(s,{label:"",prop:"Btns"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",ne,[(0,t.bF)(u,{onClick:l[1]||(l[1]=e=>n.state.show=!1)},{default:(0,t.k6)((()=>[(0,t.eW)("取消")])),_:1}),(0,t.bF)(u,{type:"primary",onClick:n.handleSave},{default:(0,t.k6)((()=>[(0,t.eW)("确认")])),_:1},8,["onClick"])])])),_:1})])),_:1},8,["model","rules"])])])),_:1},8,["modelValue","title"])}var re={props:["data","modelValue"],emits:["change","update:modelValue"],setup(e,{emit:l}){const a=(0,u.KR)(null),n=(0,u.Kh)({show:!0,ruleForm:{MachineName1:e.data.MachineName,MachineName:e.data.MachineName},rules:{}});(0,t.wB)((()=>n.show),(e=>{e||setTimeout((()=>{l("update:modelValue",e)}),300)}));const o=()=>{e.data.MachineName!=n.ruleForm.MachineName&&(0,M.gC)({Id:e.data.MachineId,newName:n.ruleForm.MachineName}).then((()=>{n.show=!1,i.nk.success("已操作!"),l("change")})).catch((e=>{console.log(e),i.nk.error("操作失败!")}))};return{state:n,ruleFormRef:a,handleSave:o}}};const se=(0,E.A)(re,[["render",oe]]);var de=se,ue=a(7985);function ie(e,l,a,n,o,r){const s=(0,t.g2)("Access"),d=(0,t.g2)("el-button"),u=(0,t.g2)("el-dialog");return(0,t.uX)(),(0,t.Wv)(u,{modelValue:n.state.show,"onUpdate:modelValue":l[1]||(l[1]=e=>n.state.show=e),"close-on-click-modal":!1,center:"","append-to":".app-wrap",title:`设置[${n.machineName}]的权限`,width:"580",top:"1vh"},{footer:(0,t.k6)((()=>[(0,t.bF)(d,{plain:"",onClick:l[0]||(l[0]=e=>n.state.show=!1),loading:n.state.loading},{default:(0,t.k6)((()=>[(0,t.eW)("取消")])),_:1},8,["loading"]),(0,t.bF)(d,{type:"success",plain:"",onClick:n.handleSave,loading:n.state.loading},{default:(0,t.k6)((()=>[(0,t.eW)("确定保存")])),_:1},8,["onClick","loading"])])),default:(0,t.k6)((()=>[(0,t.Lk)("div",null,[(0,t.bF)(s,{machineid:n.machineid,ref:"accessDom"},null,8,["machineid"])])])),_:1},8,["modelValue","title"])}var ce=a(6206),he={props:["data","modelValue"],emits:["change","update:modelValue"],components:{Access:ce.A},setup(e,{emit:l}){const a=(0,u.Kh)({show:!0,loading:!1});(0,t.wB)((()=>a.show),(e=>{e||setTimeout((()=>{l("update:modelValue",e)}),300)}));const n=(0,u.KR)(null),o=()=>{a.loading=!0,(0,X.ZK)({ToMachineId:e.data.MachineId,Access:n.value.getValue()}).then((()=>{a.loading=!1,a.show=!1,i.nk.success("已操作!"),l("change")})).catch((e=>{console.log(e),a.loading=!1,i.nk.error("操作失败!")}))};return{machineName:e.data.MachineName,machineid:e.data.MachineId,state:a,accessDom:n,handleSave:o}}};const me=(0,E.A)(he,[["render",ie]]);var pe=me;const ge={key:0};function we(e,l,a,n,o,r){const s=(0,t.g2)("TuntapShow"),d=(0,t.g2)("el-table-column");return(0,t.uX)(),(0,t.Wv)(d,{prop:"tuntap",label:n.tuntap.show?"虚拟网卡":"",width:"160"},{header:(0,t.k6)((()=>[n.tuntap.show?((0,t.uX)(),(0,t.CE)("a",{key:0,href:"javascript:;",class:"a-line",onClick:l[0]||(l[0]=(...e)=>n.handleShowLease&&n.handleShowLease(...e))},"虚拟网卡")):(0,t.Q3)("",!0)])),default:(0,t.k6)((e=>[n.tuntap.show&&n.tuntap.list[e.row.MachineId]?((0,t.uX)(),(0,t.CE)("div",ge,[(0,t.bF)(s,{config:!0,item:e.row,onEdit:n.handleTuntapIP,onRefresh:n.handleTuntapRefresh},null,8,["item","onEdit","onRefresh"])])):(0,t.Q3)("",!0)])),_:1},8,["label"])}var ke=a(4877),ve={emits:["edit","refresh"],components:{TuntapShow:ke.A},setup(e,{emit:l}){const a=(0,C.W)(),t=e=>{l("edit",e)},n=()=>{l("refresh")},o=()=>{a.value.showLease=!0};return{tuntap:a,handleTuntapIP:t,handleTuntapRefresh:n,handleShowLease:o}}};const fe=(0,E.A)(ve,[["render",we]]);var be=fe;const Ce={class:"foot t-c"};function Fe(e,l,a,n,o,r){const s=(0,t.g2)("TuntapIP"),d=(0,t.g2)("el-tab-pane"),u=(0,t.g2)("TuntapLan"),i=(0,t.g2)("TuntapForward"),c=(0,t.g2)("el-tabs"),h=(0,t.g2)("el-button"),m=(0,t.g2)("el-dialog");return(0,t.uX)(),(0,t.Wv)(m,{modelValue:n.state.show,"onUpdate:modelValue":l[1]||(l[1]=e=>n.state.show=e),"close-on-click-modal":!1,"append-to":".app-wrap",title:`设置[${n.state.machineName}]组网`,top:"1vh",width:"780"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",null,[(0,t.bF)(c,{type:"border-card"},{default:(0,t.k6)((()=>[(0,t.bF)(d,{label:"网卡"},{default:(0,t.k6)((()=>[(0,t.bF)(s,{ref:"ipDom"},null,512)])),_:1}),(0,t.bF)(d,{label:"点/网对网"},{default:(0,t.k6)((()=>[(0,t.bF)(u,{ref:"lanDom"},null,512)])),_:1}),(0,t.bF)(d,{label:"端口转发"},{default:(0,t.k6)((()=>[(0,t.bF)(i,{ref:"forwardDom"},null,512)])),_:1})])),_:1}),(0,t.Lk)("div",Ce,[(0,t.bF)(h,{onClick:l[0]||(l[0]=e=>n.state.show=!1),loading:n.state.loading},{default:(0,t.k6)((()=>[(0,t.eW)("取消")])),_:1},8,["loading"]),(0,t.bF)(h,{type:"primary",onClick:n.handleSave,loading:n.state.loading},{default:(0,t.k6)((()=>[(0,t.eW)("确定保存")])),_:1},8,["onClick","loading"])])])])),_:1},8,["modelValue","title"])}var ye=a(5241),Ee=a(5130);const _e=e=>((0,t.Qi)("data-v-1f1a4aca"),e=e(),(0,t.jt)(),e),Ve={class:"w-100"},Le=_e((()=>(0,t.Lk)("span",{class:"yellow"},"使用系统端口转发",-1))),Pe={key:0,class:"green"},Ie={class:"wrap"},Te=["onClick"],Me=["title"],Se={key:1},We=["onClick"],Ae=["onClick"],Xe=["title"],Re={key:1},xe=["onClick"],Ne=["onClick"],Be=["title"],Ue={key:1},$e=["onClick"],De={key:1,class:"remark"},ze=["onClick"];function Oe(e,l,a,o,r,s){const d=(0,t.g2)("el-input"),u=(0,t.g2)("Delete"),i=(0,t.g2)("el-icon"),c=(0,t.g2)("el-table-column"),h=(0,t.g2)("el-button"),m=(0,t.g2)("el-popconfirm"),p=(0,t.g2)("Plus"),g=(0,t.g2)("el-table");return(0,t.uX)(),(0,t.CE)("div",Ve,[(0,t.Lk)("div",null,[Le,o.state.testing?((0,t.uX)(),(0,t.CE)("span",Pe,"、testing")):(0,t.Q3)("",!0)]),(0,t.Lk)("div",Ie,[(0,t.bF)(g,{stripe:"",data:o.state.forwards,border:"",size:"small",width:"100%",height:"400px",onCellDblclick:o.handleCellClick},{default:(0,t.k6)((()=>[(0,t.bF)(c,{prop:"ListenPort",label:"源端口",width:"60"},{default:(0,t.k6)((e=>[e.row.ListenPortEditing?((0,t.uX)(),(0,t.Wv)(d,{key:0,autofocus:"",size:"small",modelValue:e.row.ListenPort,"onUpdate:modelValue":l=>e.row.ListenPort=l,onBlur:l=>o.handleEditBlur(e.row,"ListenPort")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,t.uX)(),(0,t.CE)("a",{key:1,href:"javascript:;",class:"a-line",onClick:l=>o.handleEdit(e.row,"ListenPort")},[e.row.Error?((0,t.uX)(),(0,t.CE)("strong",{key:0,title:e.row.Error,class:"red"},(0,n.v_)(e.row.ListenPort),9,Me)):((0,t.uX)(),(0,t.CE)("span",Se,[(0,t.eW)((0,n.v_)(e.row.ListenPort)+" ",1),(0,t.Lk)("a",{href:"javascript:;",onClick:(0,Ee.D$)((l=>e.row.ListenPort=0),["stop"])},[(0,t.bF)(i,null,{default:(0,t.k6)((()=>[(0,t.bF)(u)])),_:1})],8,We)]))],8,Te))])),_:1}),(0,t.bF)(c,{prop:"ConnectAddr",label:"目标IP",width:"120"},{default:(0,t.k6)((e=>[e.row.ConnectAddrEditing?((0,t.uX)(),(0,t.Wv)(d,{key:0,autofocus:"",size:"small",modelValue:e.row.ConnectAddr,"onUpdate:modelValue":l=>e.row.ConnectAddr=l,onBlur:l=>o.handleEditBlur(e.row,"ConnectAddr")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,t.uX)(),(0,t.CE)("a",{key:1,href:"javascript:;",class:"a-line",onClick:l=>o.handleEdit(e.row,"ConnectAddr")},[e.row.Error?((0,t.uX)(),(0,t.CE)("strong",{key:0,title:e.row.Error,class:"red"},(0,n.v_)(e.row.ConnectAddr),9,Xe)):((0,t.uX)(),(0,t.CE)("span",Re,[(0,t.eW)((0,n.v_)(e.row.ConnectAddr)+" ",1),(0,t.Lk)("a",{href:"javascript:;",onClick:(0,Ee.D$)((l=>e.row.ConnectAddr="0.0.0.0"),["stop"])},[(0,t.bF)(i,null,{default:(0,t.k6)((()=>[(0,t.bF)(u)])),_:1})],8,xe)]))],8,Ae))])),_:1}),(0,t.bF)(c,{prop:"ConnectPort",label:"目标端口",width:"80"},{default:(0,t.k6)((e=>[e.row.ConnectPortEditing?((0,t.uX)(),(0,t.Wv)(d,{key:0,autofocus:"",size:"small",modelValue:e.row.ConnectPort,"onUpdate:modelValue":l=>e.row.ConnectPort=l,onBlur:l=>o.handleEditBlur(e.row,"ConnectPort")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,t.uX)(),(0,t.CE)("a",{key:1,href:"javascript:;",class:"a-line",onClick:l=>o.handleEdit(e.row,"ConnectPort")},[e.row.Error?((0,t.uX)(),(0,t.CE)("strong",{key:0,title:e.row.Error,class:"red"},(0,n.v_)(e.row.ConnectPort),9,Be)):((0,t.uX)(),(0,t.CE)("span",Ue,[(0,t.eW)((0,n.v_)(e.row.ConnectPort)+" ",1),(0,t.Lk)("a",{href:"javascript:;",onClick:(0,Ee.D$)((l=>e.row.ConnectPort=0),["stop"])},[(0,t.bF)(i,null,{default:(0,t.k6)((()=>[(0,t.bF)(u)])),_:1})],8,$e)]))],8,Ne))])),_:1}),(0,t.bF)(c,{prop:"Remark",label:"备注"},{default:(0,t.k6)((e=>[e.row.RemarkEditing?((0,t.uX)(),(0,t.Wv)(d,{key:0,autofocus:"",size:"small",modelValue:e.row.Remark,"onUpdate:modelValue":l=>e.row.Remark=l,onBlur:l=>o.handleEditBlur(e.row,"Remark")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,t.uX)(),(0,t.CE)("div",De,[(0,t.Lk)("a",{href:"javascript:;",class:"a-line",onClick:l=>o.handleEdit(e.row,"Remark")},(0,n.v_)(e.row.Remark||"无"),9,ze)]))])),_:1}),(0,t.bF)(c,{prop:"Oper",label:"操作",width:"110"},{default:(0,t.k6)((e=>[(0,t.Lk)("div",null,[(0,t.bF)(m,{title:"删除不可逆,是否确认?",onConfirm:l=>o.handleDel(e.$index)},{reference:(0,t.k6)((()=>[(0,t.bF)(h,{type:"danger",size:"small"},{default:(0,t.k6)((()=>[(0,t.bF)(i,null,{default:(0,t.k6)((()=>[(0,t.bF)(u)])),_:1})])),_:1})])),_:2},1032,["onConfirm"]),(0,t.bF)(h,{type:"primary",size:"small",onClick:l=>o.handleAdd(e.$index)},{default:(0,t.k6)((()=>[(0,t.bF)(i,null,{default:(0,t.k6)((()=>[(0,t.bF)(p)])),_:1})])),_:2},1032,["onClick"])])])),_:1})])),_:1},8,["data","onCellDblclick"])])])}var Qe={props:["modelValue"],emits:["update:modelValue"],components:{Delete:F.epd,Plus:F.FWt,Warning:F.N5l,Refresh:F.C42},setup(e){const l=(0,C.W)(),a=(0,u.Kh)({machineName:l.value.current.device.MachineName,forwards:0==l.value.current.Forwards.length?[{ListenAddr:"0.0.0.0",ListenPort:0,ConnectAddr:"0.0.0.0",ConnectPort:0,Remark:""}]:l.value.current.Forwards.slice(0),timer:0,testing:!1}),n=(e,l)=>{o(e,l.property)},o=(e,l)=>{a.forwards.forEach((e=>{e["ListenAddrEditing"]=!1,e["ListenPortEditing"]=!1,e["ConnectAddrEditing"]=!1,e["ConnectPortEditing"]=!1,e["RemarkEditing"]=!1})),e[`${l}Editing`]=!0,e["__editing"]=!0},r=(e,l)=>{e[`${l}Editing`]=!1,e["__editing"]=!1},s=e=>{1==a.forwards.length?a.forwards[0]={ListenAddr:"0.0.0.0",ListenPort:0,ConnectAddr:"0.0.0.0",ConnectPort:0,Remark:""}:a.forwards.splice(e,1)},d=e=>{a.forwards.filter((e=>"0.0.0.0"==e.ConnectAddr||0==e.ConnectPort||0==e.ListenPort)).length>0||a.forwards.splice(e+1,0,{ListenAddr:"0.0.0.0",ListenPort:0,ConnectAddr:"0.0.0.0",ConnectPort:0,Remark:""})},i=()=>{clearTimeout(a.timer),a.testing=!0,(0,ye._)({MachineId:l.value.current.MachineId,List:a.forwards.map((e=>({ListenAddr:e.ListenAddr,ListenPort:+e.ListenPort,ConnectAddr:e.ConnectAddr,ConnectPort:+e.ConnectPort})))}).then((e=>{var l=e.List;for(let t=0;t${e.ConnectAddr}:${e.ConnectPort}`,o=a.forwards.filter((e=>`${e.ListenPort}->${e.ConnectAddr}:${e.ConnectPort}`==n));for(let l=0;l{a.testing=!1,a.timer=setTimeout(i,3e3)}))};(0,t.sV)((()=>{i()})),(0,t.hi)((()=>{clearTimeout(a.timer)}));const c=()=>a.forwards.map((e=>(e.ListenPort=+e.ListenPort,e.ConnectPort=+e.ConnectPort,e)));return{state:a,handleCellClick:n,handleEditBlur:r,handleEdit:o,handleDel:s,handleAdd:d,getData:c}}};const je=(0,E.A)(Qe,[["render",Oe],["__scopeId","data-v-1f1a4aca"]]);var Ke=je;const Ge={class:"w-100"},qe=(0,t.Lk)("div",null,[(0,t.Lk)("span",{class:"yellow"},"使用系统NAT或应用层SNAT")],-1),He={class:"wrap"},Je=["onClick"],Ze=["title"],Ye={key:1},el=["onClick"],ll=["onClick"],al=["title"],tl={key:1},nl=["onClick"],ol=["title"],rl={key:1},sl=["onClick"],dl=["onClick"],ul=["title"],il={key:1};function cl(e,l,a,o,r,s){const d=(0,t.g2)("el-input"),u=(0,t.g2)("Delete"),i=(0,t.g2)("el-icon"),c=(0,t.g2)("el-table-column"),h=(0,t.g2)("el-checkbox"),m=(0,t.g2)("el-button"),p=(0,t.g2)("el-popconfirm"),g=(0,t.g2)("Plus"),w=(0,t.g2)("el-table");return(0,t.uX)(),(0,t.CE)("div",Ge,[qe,(0,t.Lk)("div",He,[(0,t.bF)(w,{stripe:"",data:o.state.lans,border:"",size:"small",width:"100%",height:"400px",onCellDblclick:o.handleCellClick},{default:(0,t.k6)((()=>[(0,t.bF)(c,{prop:"IP",label:"路由IP",width:"120"},{default:(0,t.k6)((e=>[e.row.IPEditing?((0,t.uX)(),(0,t.Wv)(d,{key:0,autofocus:"",size:"small",modelValue:e.row.IP,"onUpdate:modelValue":l=>e.row.IP=l,onBlur:l=>o.handleEditBlur(e.row,"IP")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,t.uX)(),(0,t.CE)("a",{key:1,href:"javascript:;",class:"a-line",onClick:l=>o.handleEdit(e.row,"IP")},[e.row.Error?((0,t.uX)(),(0,t.CE)("strong",{key:0,title:e.row.Error,class:"red"},(0,n.v_)(e.row.IP),9,Ze)):((0,t.uX)(),(0,t.CE)("span",Ye,[(0,t.eW)((0,n.v_)(e.row.IP)+" ",1),(0,t.Lk)("a",{href:"javascript:;",onClick:(0,Ee.D$)((l=>e.row.IP="0.0.0.0"),["stop"])},[(0,t.bF)(i,null,{default:(0,t.k6)((()=>[(0,t.bF)(u)])),_:1})],8,el)]))],8,Je))])),_:1}),(0,t.bF)(c,{prop:"PrefixLength",label:"路由掩码",width:"80"},{default:(0,t.k6)((e=>[e.row.PrefixLengthEditing?((0,t.uX)(),(0,t.Wv)(d,{key:0,autofocus:"",size:"small",modelValue:e.row.PrefixLength,"onUpdate:modelValue":l=>e.row.PrefixLength=l,onBlur:l=>o.handleEditBlur(e.row,"PrefixLength")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,t.uX)(),(0,t.CE)("a",{key:1,href:"javascript:;",class:"a-line",onClick:l=>o.handleEdit(e.row,"PrefixLength")},[e.row.Error?((0,t.uX)(),(0,t.CE)("strong",{key:0,title:e.row.Error,class:"red"},(0,n.v_)(e.row.PrefixLength),9,al)):((0,t.uX)(),(0,t.CE)("span",tl,(0,n.v_)(e.row.PrefixLength),1))],8,ll))])),_:1}),(0,t.bF)(c,{prop:"MapIP",label:"目标IP",width:"120"},{default:(0,t.k6)((e=>[e.row.MapIPEditing?((0,t.uX)(),(0,t.Wv)(d,{key:0,autofocus:"",size:"small",modelValue:e.row.MapIP,"onUpdate:modelValue":l=>e.row.MapIP=l,onBlur:l=>o.handleEditBlur(e.row,"MapIP")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,t.uX)(),(0,t.CE)("a",{key:1,href:"javascript:;",class:"a-line",onClick:l=>o.handleEdit(e.row,"MapIP")},[e.row.Error?((0,t.uX)(),(0,t.CE)("strong",{key:0,title:e.row.Error,class:"red"},(0,n.v_)(e.row.MapIP),9,ol)):((0,t.uX)(),(0,t.CE)("span",rl,[(0,t.eW)((0,n.v_)(e.row.MapIP)+" ",1),(0,t.Lk)("a",{href:"javascript:;",onClick:(0,Ee.D$)((l=>e.row.MapIP="0.0.0.0"),["stop"])},[(0,t.bF)(i,null,{default:(0,t.k6)((()=>[(0,t.bF)(u)])),_:1})],8,sl)]))],8,nl))])),_:1}),(0,t.bF)(c,{prop:"MapPrefixLength",label:"目标掩码",width:"80"},{default:(0,t.k6)((e=>[e.row.MapPrefixLengthEditing?((0,t.uX)(),(0,t.Wv)(d,{key:0,autofocus:"",size:"small",modelValue:e.row.MapPrefixLength,"onUpdate:modelValue":l=>e.row.MapPrefixLength=l,onBlur:l=>o.handleEditBlur(e.row,"MapPrefixLength")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,t.uX)(),(0,t.CE)("a",{key:1,href:"javascript:;",class:"a-line",onClick:l=>o.handleEdit(e.row,"MapPrefixLength")},[e.row.Error?((0,t.uX)(),(0,t.CE)("strong",{key:0,title:e.row.Error,class:"red"},(0,n.v_)(e.row.MapPrefixLength),9,ul)):((0,t.uX)(),(0,t.CE)("span",il,(0,n.v_)(e.row.MapPrefixLength),1))],8,dl))])),_:1}),(0,t.bF)(c,{prop:"Disabled",label:"禁用"},{default:(0,t.k6)((e=>[(0,t.bF)(h,{modelValue:e.row.Disabled,"onUpdate:modelValue":l=>e.row.Disabled=l,label:"禁用"},null,8,["modelValue","onUpdate:modelValue"])])),_:1}),(0,t.bF)(c,{prop:"Oper",label:"操作",width:"110"},{default:(0,t.k6)((e=>[(0,t.Lk)("div",null,[(0,t.bF)(p,{title:"删除不可逆,是否确认?",onConfirm:l=>o.handleDel(e.$index)},{reference:(0,t.k6)((()=>[(0,t.bF)(m,{type:"danger",size:"small"},{default:(0,t.k6)((()=>[(0,t.bF)(i,null,{default:(0,t.k6)((()=>[(0,t.bF)(u)])),_:1})])),_:1})])),_:2},1032,["onConfirm"]),(0,t.bF)(m,{type:"primary",size:"small",onClick:l=>o.handleAdd(e.$index)},{default:(0,t.k6)((()=>[(0,t.bF)(i,null,{default:(0,t.k6)((()=>[(0,t.bF)(g)])),_:1})])),_:2},1032,["onClick"])])])),_:1})])),_:1},8,["data","onCellDblclick"])])])}var hl={props:["modelValue"],emits:["update:modelValue"],components:{Delete:F.epd,Plus:F.FWt,Warning:F.N5l,Refresh:F.C42},setup(e){const l=(0,C.W)(),a=(0,u.Kh)({lans:l.value.current.Lans.slice(0).map((e=>(e.MapIP=e.MapIP||"0.0.0.0",e.MapPrefixLength=e.MapPrefixLength||24,e)))});0==a.lans.length&&a.lans.push({IP:"0.0.0.0",PrefixLength:24,MapIP:"0.0.0.0",MapPrefixLength:24});const t=(e,l)=>{n(e,l.property)},n=(e,l)=>{a.lans.forEach((e=>{e["IPEditing"]=!1,e["PrefixLengthEditing"]=!1,e["MapIPEditing"]=!1,e["MapPrefixLengthEditing"]=!1})),e[`${l}Editing`]=!0,e["__editing"]=!0},o=(e,l)=>{if(e[`${l}Editing`]=!1,e["__editing"]=!1,"PrefixLength"==l||"MapPrefixLength"==l){var a=+e[l];(a>32||a<0||isNaN(a))&&(a=24),e[l]=a}},r=e=>{a.lans.splice(e,1),0==a.lans.length&&s(0)},s=e=>{a.lans.splice(e+1,0,{IP:"0.0.0.0",PrefixLength:24,MapIP:"0.0.0.0",MapPrefixLength:24})},d=()=>a.lans.map((e=>(e.PrefixLength=+e.PrefixLength,e)));return{state:a,handleDel:r,handleAdd:s,getData:d,handleCellClick:t,handleEditBlur:o,handleEdit:n}}};const ml=(0,E.A)(hl,[["render",cl]]);var pl=ml;const gl=e=>((0,t.Qi)("data-v-2eb35cd0"),e=e(),(0,t.jt)(),e),wl={class:"wrap"},kl=gl((()=>(0,t.Lk)("span",null,"留空则使用【本组网络】的设置",-1))),vl=gl((()=>(0,t.Lk)("span",null,"/",-1)));function fl(e,l,a,n,o,r){const s=(0,t.g2)("el-input"),d=(0,t.g2)("el-form-item"),u=(0,t.g2)("el-checkbox"),i=(0,t.g2)("el-form");return(0,t.uX)(),(0,t.CE)("div",wl,[(0,t.bF)(i,{ref:"ruleFormRef",model:n.state.ruleForm,rules:n.state.rules,"label-width":"8rem"},{default:(0,t.k6)((()=>[(0,t.bF)(d,{label:"网卡名",prop:"Name"},{default:(0,t.k6)((()=>[(0,t.bF)(s,{modelValue:n.state.ruleForm.Name,"onUpdate:modelValue":l[0]||(l[0]=e=>n.state.ruleForm.Name=e),style:{width:"14rem"}},null,8,["modelValue"]),(0,t.eW)(),kl])),_:1}),(0,t.bF)(d,{label:"网卡IP",prop:"IP",class:"mgb-0"},{default:(0,t.k6)((()=>[(0,t.bF)(s,{modelValue:n.state.ruleForm.IP,"onUpdate:modelValue":l[1]||(l[1]=e=>n.state.ruleForm.IP=e),style:{width:"14rem"}},null,8,["modelValue"]),vl,(0,t.bF)(s,{onChange:n.handlePrefixLengthChange,modelValue:n.state.ruleForm.PrefixLength,"onUpdate:modelValue":l[2]||(l[2]=e=>n.state.ruleForm.PrefixLength=e),style:{width:"4rem"}},null,8,["onChange","modelValue"])])),_:1}),(0,t.bF)(d,{label:"",class:"mgb-0"},{default:(0,t.k6)((()=>[(0,t.bF)(u,{class:"mgr-1",modelValue:n.state.ruleForm.ShowDelay,"onUpdate:modelValue":l[3]||(l[3]=e=>n.state.ruleForm.ShowDelay=e),label:"显示延迟",size:"large"},null,8,["modelValue"]),(0,t.bF)(u,{class:"mgr-1",modelValue:n.state.ruleForm.AutoConnect,"onUpdate:modelValue":l[4]||(l[4]=e=>n.state.ruleForm.AutoConnect=e),label:"自动连接",size:"large"},null,8,["modelValue"]),(0,t.bF)(u,{class:"mgr-1",modelValue:n.state.ruleForm.Multicast,"onUpdate:modelValue":l[5]||(l[5]=e=>n.state.ruleForm.Multicast=e),label:"禁用广播",size:"large"},null,8,["modelValue"]),(0,t.bF)(u,{class:"mgr-1",modelValue:n.state.ruleForm.Nat,"onUpdate:modelValue":l[6]||(l[6]=e=>n.state.ruleForm.Nat=e),label:"禁用NAT",size:"large"},null,8,["modelValue"]),(0,t.bF)(u,{class:"mgr-1",modelValue:n.state.ruleForm.TcpMerge,"onUpdate:modelValue":l[7]||(l[7]=e=>n.state.ruleForm.TcpMerge=e),label:"TCP包合并",size:"large"},null,8,["modelValue"]),(0,t.bF)(u,{modelValue:n.state.ruleForm.InterfaceOrder,"onUpdate:modelValue":l[8]||(l[8]=e=>n.state.ruleForm.InterfaceOrder=e),label:"调整网卡顺序",size:"large"},null,8,["modelValue"])])),_:1})])),_:1},8,["model","rules"])])}var bl={emits:["change"],components:{Delete:F.epd,Plus:F.FWt,Warning:F.N5l,Refresh:F.C42,TuntapForward:Ke,TuntapLan:pl},setup(e,{emit:l}){const a=(0,C.W)(),t=(0,u.KR)(null),n=(0,u.Kh)({ruleForm:{IP:a.value.current.IP,PrefixLength:a.value.current.PrefixLength||24,Gateway:a.value.current.Gateway,ShowDelay:a.value.current.ShowDelay,AutoConnect:a.value.current.AutoConnect,Upgrade:a.value.current.Upgrade,Multicast:a.value.current.Multicast,Nat:a.value.current.Nat,TcpMerge:a.value.current.TcpMerge,InterfaceOrder:a.value.current.InterfaceOrder,Forwards:a.value.current.Forwards,Name:a.value.current.Name},rules:{Name:{type:"string",pattern:/^$|^[A-Za-z][A-Za-z0-9]{0,31}$/,message:"请输入正确的网卡名",transform(e){return e.trim()}}}}),o=()=>{var e=+n.ruleForm.PrefixLength;(e>32||e<16||isNaN(e))&&(e=24),n.ruleForm.PrefixLength=e},r=()=>{const e=JSON.parse(JSON.stringify(a.value.current));return e.IP=n.ruleForm.IP.replace(/\s/g,"")||"0.0.0.0",e.PrefixLength=+n.ruleForm.PrefixLength,e.Gateway=n.ruleForm.Gateway,e.ShowDelay=n.ruleForm.ShowDelay,e.AutoConnect=n.ruleForm.AutoConnect,e.Upgrade=n.ruleForm.Upgrade,e.Multicast=n.ruleForm.Multicast,e.Nat=n.ruleForm.Nat,e.TcpMerge=n.ruleForm.TcpMerge,e.InterfaceOrder=n.ruleForm.InterfaceOrder,e.Name=n.ruleForm.Name,e};return{state:n,ruleFormRef:t,handlePrefixLengthChange:o,getData:r}}};const Cl=(0,E.A)(bl,[["render",fl],["__scopeId","data-v-2eb35cd0"]]);var Fl=Cl,yl={props:["modelValue"],emits:["change","update:modelValue"],components:{TuntapForward:Ke,TuntapLan:pl,TuntapIP:Fl},setup(e,{emit:l}){const a=(0,C.W)(),n=(0,u.Kh)({show:!0,machineName:a.value.current.device.MachineName,loading:!1});(0,t.wB)((()=>n.show),(e=>{e||setTimeout((()=>{l("update:modelValue",e)}),300)}));const o=(0,u.KR)(null),r=(0,u.KR)(null),s=(0,u.KR)(null),d=()=>{n.loading=!0;const e=o.value.getData();e.Lans=r.value?r.value.getData():a.value.current.Lans,e.Forwards=s.value?s.value.getData():a.value.current.Forwards,(0,ye.ac)(e).then((()=>{n.show=!1,n.loading=!1,i.nk.success("已操作!"),l("change")})).catch((e=>{n.loading=!1,console.log(e),i.nk.error("操作失败!")}))};return{state:n,handleSave:d,ipDom:o,lanDom:r,forwardDom:s}}};const El=(0,E.A)(yl,[["render",Fe],["__scopeId","data-v-87d2a32c"]]);var _l=El;const Vl=e=>((0,t.Qi)("data-v-67ed3552"),e=e(),(0,t.jt)(),e),Ll=Vl((()=>(0,t.Lk)("p",null,"网络租期30天、IP租期7天",-1))),Pl=Vl((()=>(0,t.Lk)("span",null,"/",-1))),Il=Vl((()=>(0,t.Lk)("span",{style:{width:"1rem"}},null,-1))),Tl={class:"calc"},Ml=Vl((()=>(0,t.Lk)("span",{class:"label"},"网络号",-1))),Sl={class:"value"},Wl=Vl((()=>(0,t.Lk)("span",{class:"label"},"网关",-1))),Al={class:"value"},Xl=Vl((()=>(0,t.Lk)("span",{class:"label"},"开始IP",-1))),Rl={class:"value"},xl=Vl((()=>(0,t.Lk)("span",{class:"label"},"结束IP",-1))),Nl={class:"value"},Bl=Vl((()=>(0,t.Lk)("span",{class:"label"},"广播号",-1))),Ul={class:"value"},$l=Vl((()=>(0,t.Lk)("span",{class:"label"},"IP数量",-1))),Dl={class:"value"};function zl(e,l,a,o,r,s){const d=(0,t.g2)("el-form-item"),u=(0,t.g2)("el-input"),i=(0,t.g2)("el-button"),c=(0,t.g2)("el-form"),h=(0,t.g2)("el-dialog");return(0,t.uX)(),(0,t.Wv)(h,{modelValue:o.state.show,"onUpdate:modelValue":l[4]||(l[4]=e=>o.state.show=e),"close-on-click-modal":!1,"append-to":".app-wrap",title:"配置本组的网络",top:"1vh",width:"400"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",null,[(0,t.bF)(c,{ref:"ruleFormRef",model:o.state.ruleForm,rules:o.state.rules,"label-width":"100"},{default:(0,t.k6)((()=>[(0,t.bF)(d,{prop:"gateway"},{default:(0,t.k6)((()=>[Ll])),_:1}),(0,t.bF)(d,{label:"网卡名",prop:"Name"},{default:(0,t.k6)((()=>[(0,t.bF)(u,{modelValue:o.state.ruleForm.Name,"onUpdate:modelValue":l[0]||(l[0]=e=>o.state.ruleForm.Name=e),style:{width:"14rem"}},null,8,["modelValue"])])),_:1}),(0,t.bF)(d,{label:"网络前缀",prop:"IP"},{default:(0,t.k6)((()=>[(0,t.bF)(u,{modelValue:o.state.ruleForm.IP,"onUpdate:modelValue":l[1]||(l[1]=e=>o.state.ruleForm.IP=e),style:{width:"14rem"},onChange:o.handlePrefixLengthChange},null,8,["modelValue","onChange"]),Pl,(0,t.bF)(u,{onChange:o.handlePrefixLengthChange,modelValue:o.state.ruleForm.PrefixLength,"onUpdate:modelValue":l[2]||(l[2]=e=>o.state.ruleForm.PrefixLength=e),style:{width:"4rem"}},null,8,["onChange","modelValue"]),Il,(0,t.bF)(i,{onClick:o.handleClear},{default:(0,t.k6)((()=>[(0,t.eW)("重置")])),_:1},8,["onClick"])])),_:1}),(0,t.bF)(d,{label:"",prop:"IP1"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",Tl,[(0,t.Lk)("p",null,[Ml,(0,t.Lk)("span",Sl,(0,n.v_)(o.state.values.Network),1)]),(0,t.Lk)("p",null,[Wl,(0,t.Lk)("span",Al,(0,n.v_)(o.state.values.Gateway),1)]),(0,t.Lk)("p",null,[Xl,(0,t.Lk)("span",Rl,(0,n.v_)(o.state.values.Start),1)]),(0,t.Lk)("p",null,[xl,(0,t.Lk)("span",Nl,(0,n.v_)(o.state.values.End),1)]),(0,t.Lk)("p",null,[Bl,(0,t.Lk)("span",Ul,(0,n.v_)(o.state.values.Broadcast),1)]),(0,t.Lk)("p",null,[$l,(0,t.Lk)("span",Dl,(0,n.v_)(o.state.values.Count),1)])])])),_:1}),o.hasLease?((0,t.uX)(),(0,t.Wv)(d,{key:0,label:"",prop:"Btns"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",null,[(0,t.bF)(i,{onClick:l[3]||(l[3]=e=>o.state.show=!1)},{default:(0,t.k6)((()=>[(0,t.eW)("取消")])),_:1}),(0,t.bF)(i,{type:"primary",onClick:o.handleSave},{default:(0,t.k6)((()=>[(0,t.eW)("确认")])),_:1},8,["onClick"])])])),_:1})):(0,t.Q3)("",!0)])),_:1},8,["model","rules"])])])),_:1},8,["modelValue"])}var Ol={props:["modelValue"],emits:["change","update:modelValue"],components:{Delete:F.epd,Plus:F.FWt},setup(e,{emit:l}){const a=(0,d.B)(),n=(0,t.EW)((()=>a.value.hasAccess("Lease"))),o=(0,u.KR)(null),r=(0,u.Kh)({show:!0,ruleForm:{Name:"",IP:"0.0.0.0",PrefixLength:24},rules:{Name:{type:"string",pattern:/^$|^[A-Za-z][A-Za-z0-9]{0,31}$/,message:"请输入正确的网卡名",transform(e){return e.trim()}}},values:{}});(0,t.wB)((()=>r.show),(e=>{e||setTimeout((()=>{l("update:modelValue",e)}),300)}));const s=()=>{(0,ye.w0)(r.ruleForm).then((e=>{r.values=e}))},c=()=>{(0,ye.Nj)().then((e=>{r.ruleForm.Name=e.Name,r.ruleForm.IP=e.IP,r.ruleForm.PrefixLength=e.PrefixLength,s()}))},h=()=>{var e=+r.ruleForm.PrefixLength;(e>32||e<16||isNaN(e))&&(e=24),r.ruleForm.PrefixLength=e,s()},m=()=>{(0,ye.AE)(r.ruleForm).then((()=>{i.nk.success("已操作"),r.show=!1})).catch((e=>{console.log(e),i.nk.error("操作失败")}))},p=()=>{(0,ye.AE)({Name:"",IP:"0.0.0.0",PrefixLength:24}).then((()=>{i.nk.success("已操作"),c()})).catch((e=>{console.log(e),i.nk.error("操作失败")}))};return(0,t.sV)((()=>{c()})),{state:r,hasLease:n,ruleFormRef:o,handleSave:m,handlePrefixLengthChange:h,handleClear:p}}};const Ql=(0,E.A)(Ol,[["render",zl],["__scopeId","data-v-67ed3552"]]);var jl=Ql;function Kl(e,l,a,o,r,s){const d=(0,t.g2)("el-table-column"),u=(0,t.g2)("el-table"),i=(0,t.g2)("el-dialog");return(0,t.uX)(),(0,t.Wv)(i,{modelValue:o.state.show,"onUpdate:modelValue":l[0]||(l[0]=e=>o.state.show=e),"append-to":".app-wrap",title:`[${o.state.machineName}]上的路由`,top:"1vh"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",null,[(0,t.bF)(u,{data:o.state.data,size:"small",border:"",height:"500"},{default:(0,t.k6)((()=>[(0,t.bF)(d,{property:"Ip",label:"IP"}),(0,t.bF)(d,{property:"Id",label:"目标"},{default:(0,t.k6)((e=>[(0,t.Lk)("span",null,(0,n.v_)(o.state.names[e.row.Id]),1)])),_:1})])),_:1},8,["data"])])])),_:1},8,["modelValue","title"])}var Gl={props:["modelValue"],emits:["update:modelValue"],setup(e,{emit:l}){const a=(0,C.W)(),n=(0,u.Kh)({show:!0,machineId:a.value.device.id,machineName:a.value.device.name,data:[],names:{},timer:0});return(0,t.wB)((()=>n.show),(e=>{e||setTimeout((()=>{l("update:modelValue",e),l("change")}),300)})),(0,t.sV)((()=>{(0,M.NT)().then((e=>{n.names=e.reduce(((e,l)=>(e[l.MachineId]=l.MachineName,e)),{})})).catch((()=>{})),(0,ye.bP)(n.machineId).then((e=>{n.data=Object.keys(e).map((l=>({Ip:l,Id:e[l]})))})).catch((()=>{}))})),(0,t.hi)((()=>{})),{state:n}}};const ql=(0,E.A)(Gl,[["render",Kl]]);var Hl=ql;function Jl(e,l,a,n,o,r){const s=(0,t.g2)("Firewall"),d=(0,t.g2)("el-dialog");return(0,t.uX)(),(0,t.Wv)(d,{modelValue:n.state.show,"onUpdate:modelValue":l[0]||(l[0]=e=>n.state.show=e),"append-to":".app-wrap",title:`[${n.state.machineName}]上的防火墙`,top:"1vh",width:"760"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",null,[(0,t.bF)(s,{machineId:n.state.machineId},null,8,["machineId"])])])),_:1},8,["modelValue","title"])}var Zl=a(8827),Yl={props:["modelValue"],emits:["update:modelValue"],components:{Firewall:Zl.A},setup(e,{emit:l}){const a=(0,C.W)(),n=(0,u.Kh)({show:!0,machineId:a.value.device.id,machineName:a.value.device.name});return(0,t.wB)((()=>n.show),(e=>{e||setTimeout((()=>{l("update:modelValue",e),l("change")}),300)})),{state:n}}};const ea=(0,E.A)(Yl,[["render",Jl]]);var la=ea;const aa={key:0};function ta(e,l,a,n,o,r){const s=(0,t.g2)("Socks5Show"),d=(0,t.g2)("el-table-column");return(0,t.uX)(),(0,t.Wv)(d,{prop:"socks5",label:n.socks5.show?"代理转发":"",width:"160"},{default:(0,t.k6)((e=>[n.socks5.show&&n.socks5.list[e.row.MachineId]?((0,t.uX)(),(0,t.CE)("div",aa,[(0,t.bF)(s,{config:!0,item:e.row,onEdit:n.handleSocks5,onRefresh:n.handleSocks5Refresh},null,8,["item","onEdit","onRefresh"])])):(0,t.Q3)("",!0)])),_:1},8,["label"])}const na={class:"flex"},oa={class:"flex-1"},ra=["title"],sa={key:0,class:"green gateway"},da={key:1},ua={key:0},ia={key:0,class:"flex disable",title:"已禁用"},ca={key:1,class:"flex yellow",title:"与其它设备填写IP、或本机局域网IP有冲突"};function ha(e,l,a,o,r,s){const d=(0,t.g2)("ConnectionShow"),u=(0,t.g2)("Loading"),i=(0,t.g2)("el-icon"),c=(0,t.g2)("el-switch");return(0,t.uX)(),(0,t.CE)("div",null,[(0,t.Lk)("div",na,[(0,t.Lk)("div",oa,[(0,t.bF)(d,{data:o.connections.list[o.item.MachineId],row:o.item,transitionId:"socks5"},null,8,["data","row"]),(0,t.Lk)("a",{href:"javascript:;",class:"a-line",onClick:l[0]||(l[0]=e=>o.handleSocks5Port(o.socks5.list[o.item.MachineId])),title:"此设备的socks5代理"},[o.socks5.list[o.item.MachineId].SetupError?((0,t.uX)(),(0,t.CE)("strong",{key:0,class:"red",title:o.socks5.list[o.item.MachineId].SetupError}," socks5://*:"+(0,n.v_)(o.socks5.list[o.item.MachineId].Port),9,ra)):((0,t.uX)(),(0,t.CE)(t.FK,{key:1},[o.item.Connected&&o.socks5.list[o.item.MachineId].running?((0,t.uX)(),(0,t.CE)("strong",sa,"socks5://*:"+(0,n.v_)(o.socks5.list[o.item.MachineId].Port),1)):((0,t.uX)(),(0,t.CE)("span",da,"socks5://*:"+(0,n.v_)(o.socks5.list[o.item.MachineId].Port),1))],64))])]),o.socks5.list[o.item.MachineId].loading?((0,t.uX)(),(0,t.CE)("div",ua,[(0,t.bF)(i,{size:"14",class:"loading"},{default:(0,t.k6)((()=>[(0,t.bF)(u)])),_:1})])):((0,t.uX)(),(0,t.Wv)(c,{key:1,"model-value":o.item.Connected&&o.socks5.list[o.item.MachineId].running,loading:o.socks5.list[o.item.MachineId].loading,disabled:"",onClick:l[1]||(l[1]=e=>o.handleSocks5(o.socks5.list[o.item.MachineId])),size:"small","inline-prompt":"","active-text":"😀","inactive-text":"😣"},null,8,["model-value","loading"]))]),(0,t.Lk)("div",null,[(0,t.Lk)("div",null,[((0,t.uX)(!0),(0,t.CE)(t.FK,null,(0,t.pI)(o.socks5.list[o.item.MachineId].Lans,((e,l)=>((0,t.uX)(),(0,t.CE)(t.FK,{key:l},[e.Disabled?((0,t.uX)(),(0,t.CE)("div",ia,(0,n.v_)(e.IP)+" / "+(0,n.v_)(e.PrefixLength),1)):e.Exists?((0,t.uX)(),(0,t.CE)("div",ca,(0,n.v_)(e.IP)+" / "+(0,n.v_)(e.PrefixLength),1)):((0,t.uX)(),(0,t.CE)("div",{key:2,class:(0,n.C4)(["flex green",{green:o.item.Connected&&o.socks5.list[o.item.MachineId].running}]),title:"正常使用"},(0,n.v_)(e.IP)+" / "+(0,n.v_)(e.PrefixLength),3))],64)))),128))])])])}var ma=a(9983),pa=a(6132),ga={props:["item","config"],emits:["edit","refresh"],components:{Loading:F.Rhj,ConnectionShow:pa.A},setup(e,{emit:l}){const a=b(),n=(0,d.B)(),o=(0,t.EW)((()=>n.value.config.Client.Id)),r=(0,t.EW)((()=>n.value.hasAccess("Socks5ChangeSelf"))),s=(0,t.EW)((()=>n.value.hasAccess("Socks5ChangeOther"))),u=(0,t.EW)((()=>n.value.hasAccess("Socks5StatusSelf"))),c=(0,t.EW)((()=>n.value.hasAccess("Socks5StatusOther"))),h=(0,ma.bB)(),m=l=>{if(!e.config)return;if(o.value===l.MachineId){if(!u.value)return}else if(!c.value)return;const a=e.item.Connected&&l.running?(0,k.R2)(l.MachineId):(0,k.qH)(l.MachineId);l.loading=!0,a.then((()=>{i.nk.success("操作成功!")})).catch((e=>{console.log(e),i.nk.error("操作失败!")}))},p=a=>{if(e.config||o.value==a.MachineId){if(o.value===a.MachineId){if(!r.value)return}else if(!s.value)return;a.device=e.item,l("edit",a)}},g=()=>{l("refresh")};return{item:(0,t.EW)((()=>e.item)),socks5:a,connections:h,handleSocks5:m,handleSocks5Port:p,handleSocks5Refresh:g}}};const wa=(0,E.A)(ga,[["render",ha],["__scopeId","data-v-10c6aa99"]]);var ka=wa,va={emits:["edit","refresh"],components:{Socks5Show:ka},setup(e,{emit:l}){const a=b(),t=e=>{l("edit",e)},n=()=>{l("refresh")};return{socks5:a,handleSocks5:t,handleSocks5Refresh:n}}};const fa=(0,E.A)(va,[["render",ta]]);var ba=fa;const Ca={class:"upgrade-wrap"},Fa={class:"t-c w-100"};function ya(e,l,a,n,o,r){const s=(0,t.g2)("el-form-item"),d=(0,t.g2)("el-input"),u=(0,t.g2)("Socks5Lan"),i=(0,t.g2)("el-button"),c=(0,t.g2)("el-form"),h=(0,t.g2)("el-dialog");return(0,t.uX)(),(0,t.Wv)(h,{modelValue:n.state.show,"onUpdate:modelValue":l[2]||(l[2]=e=>n.state.show=e),"close-on-click-modal":!1,"append-to":".app-wrap",title:`设置[${n.state.machineName}]代理`,top:"1vh",width:"700"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",null,[(0,t.bF)(c,{ref:"ruleFormRef",model:n.state.ruleForm,rules:n.state.rules,"label-width":"140"},{default:(0,t.k6)((()=>[(0,t.bF)(s,{prop:"gateway",style:{"margin-bottom":"0"}},{default:(0,t.k6)((()=>[(0,t.eW)(" 配置代理,通过代理访问其它设备 ")])),_:1}),(0,t.bF)(s,{label:"代理端口",prop:"Port"},{default:(0,t.k6)((()=>[(0,t.bF)(d,{modelValue:n.state.ruleForm.Port,"onUpdate:modelValue":l[0]||(l[0]=e=>n.state.ruleForm.Port=e),style:{width:"14rem"}},null,8,["modelValue"])])),_:1}),(0,t.Lk)("div",Ca,[(0,t.bF)(u,{ref:"socks5Dom"},null,512)]),(0,t.bF)(s,{label:"",prop:"Btns","label-width":"0"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",Fa,[(0,t.bF)(i,{onClick:l[1]||(l[1]=e=>n.state.show=!1)},{default:(0,t.k6)((()=>[(0,t.eW)("取消")])),_:1}),(0,t.bF)(i,{type:"primary",onClick:n.handleSave},{default:(0,t.k6)((()=>[(0,t.eW)("确认")])),_:1},8,["onClick"])])])),_:1})])),_:1},8,["model","rules"])])])),_:1},8,["modelValue","title"])}const Ea={class:"w-100"},_a={class:"wrap"},Va=["onClick"],La=["title"],Pa={key:1},Ia=["onClick"],Ta=["onClick"],Ma=["title"],Sa={key:1},Wa=["onClick"],Aa=["title"],Xa={key:1},Ra=["onClick"],xa=["onClick"],Na=["title"],Ba={key:1};function Ua(e,l,a,o,r,s){const d=(0,t.g2)("el-input"),u=(0,t.g2)("Delete"),i=(0,t.g2)("el-icon"),c=(0,t.g2)("el-table-column"),h=(0,t.g2)("el-checkbox"),m=(0,t.g2)("el-button"),p=(0,t.g2)("el-popconfirm"),g=(0,t.g2)("Plus"),w=(0,t.g2)("el-table");return(0,t.uX)(),(0,t.CE)("div",Ea,[(0,t.Lk)("div",_a,[(0,t.bF)(w,{stripe:"",data:o.state.lans,border:"",size:"small",width:"100%",height:"400px",onCellDblclick:o.handleCellClick},{default:(0,t.k6)((()=>[(0,t.bF)(c,{prop:"IP",label:"路由IP",width:"120"},{default:(0,t.k6)((e=>[e.row.IPEditing?((0,t.uX)(),(0,t.Wv)(d,{key:0,autofocus:"",size:"small",modelValue:e.row.IP,"onUpdate:modelValue":l=>e.row.IP=l,onBlur:l=>o.handleEditBlur(e.row,"IP")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,t.uX)(),(0,t.CE)("a",{key:1,href:"javascript:;",class:"a-line",onClick:l=>o.handleEdit(e.row,"IP")},[e.row.Error?((0,t.uX)(),(0,t.CE)("strong",{key:0,title:e.row.Error,class:"red"},(0,n.v_)(e.row.IP),9,La)):((0,t.uX)(),(0,t.CE)("span",Pa,[(0,t.eW)((0,n.v_)(e.row.IP)+" ",1),(0,t.Lk)("a",{href:"javascript:;",onClick:(0,Ee.D$)((l=>e.row.IP="0.0.0.0"),["stop"])},[(0,t.bF)(i,null,{default:(0,t.k6)((()=>[(0,t.bF)(u)])),_:1})],8,Ia)]))],8,Va))])),_:1}),(0,t.bF)(c,{prop:"PrefixLength",label:"路由掩码",width:"80"},{default:(0,t.k6)((e=>[e.row.PrefixLengthEditing?((0,t.uX)(),(0,t.Wv)(d,{key:0,autofocus:"",size:"small",modelValue:e.row.PrefixLength,"onUpdate:modelValue":l=>e.row.PrefixLength=l,onBlur:l=>o.handleEditBlur(e.row,"PrefixLength")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,t.uX)(),(0,t.CE)("a",{key:1,href:"javascript:;",class:"a-line",onClick:l=>o.handleEdit(e.row,"PrefixLength")},[e.row.Error?((0,t.uX)(),(0,t.CE)("strong",{key:0,title:e.row.Error,class:"red"},(0,n.v_)(e.row.PrefixLength),9,Ma)):((0,t.uX)(),(0,t.CE)("span",Sa,(0,n.v_)(e.row.PrefixLength),1))],8,Ta))])),_:1}),(0,t.bF)(c,{prop:"MapIP",label:"目标IP",width:"120"},{default:(0,t.k6)((e=>[e.row.MapIPEditing?((0,t.uX)(),(0,t.Wv)(d,{key:0,autofocus:"",size:"small",modelValue:e.row.MapIP,"onUpdate:modelValue":l=>e.row.MapIP=l,onBlur:l=>o.handleEditBlur(e.row,"MapIP")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,t.uX)(),(0,t.CE)("a",{key:1,href:"javascript:;",class:"a-line",onClick:l=>o.handleEdit(e.row,"MapIP")},[e.row.Error?((0,t.uX)(),(0,t.CE)("strong",{key:0,title:e.row.Error,class:"red"},(0,n.v_)(e.row.MapIP),9,Aa)):((0,t.uX)(),(0,t.CE)("span",Xa,[(0,t.eW)((0,n.v_)(e.row.MapIP)+" ",1),(0,t.Lk)("a",{href:"javascript:;",onClick:(0,Ee.D$)((l=>e.row.MapIP="0.0.0.0"),["stop"])},[(0,t.bF)(i,null,{default:(0,t.k6)((()=>[(0,t.bF)(u)])),_:1})],8,Ra)]))],8,Wa))])),_:1}),(0,t.bF)(c,{prop:"MapPrefixLength",label:"目标掩码",width:"80"},{default:(0,t.k6)((e=>[e.row.MapPrefixLengthEditing?((0,t.uX)(),(0,t.Wv)(d,{key:0,autofocus:"",size:"small",modelValue:e.row.MapPrefixLength,"onUpdate:modelValue":l=>e.row.MapPrefixLength=l,onBlur:l=>o.handleEditBlur(e.row,"MapPrefixLength")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,t.uX)(),(0,t.CE)("a",{key:1,href:"javascript:;",class:"a-line",onClick:l=>o.handleEdit(e.row,"MapPrefixLength")},[e.row.Error?((0,t.uX)(),(0,t.CE)("strong",{key:0,title:e.row.Error,class:"red"},(0,n.v_)(e.row.MapPrefixLength),9,Na)):((0,t.uX)(),(0,t.CE)("span",Ba,(0,n.v_)(e.row.MapPrefixLength),1))],8,xa))])),_:1}),(0,t.bF)(c,{prop:"Disabled",label:"禁用"},{default:(0,t.k6)((e=>[(0,t.bF)(h,{modelValue:e.row.Disabled,"onUpdate:modelValue":l=>e.row.Disabled=l,label:"禁用"},null,8,["modelValue","onUpdate:modelValue"])])),_:1}),(0,t.bF)(c,{prop:"Oper",label:"操作",width:"110"},{default:(0,t.k6)((e=>[(0,t.Lk)("div",null,[(0,t.bF)(p,{title:"删除不可逆,是否确认?",onConfirm:l=>o.handleDel(e.$index)},{reference:(0,t.k6)((()=>[(0,t.bF)(m,{type:"danger",size:"small"},{default:(0,t.k6)((()=>[(0,t.bF)(i,null,{default:(0,t.k6)((()=>[(0,t.bF)(u)])),_:1})])),_:1})])),_:2},1032,["onConfirm"]),(0,t.bF)(m,{type:"primary",size:"small",onClick:l=>o.handleAdd(e.$index)},{default:(0,t.k6)((()=>[(0,t.bF)(i,null,{default:(0,t.k6)((()=>[(0,t.bF)(g)])),_:1})])),_:2},1032,["onClick"])])])),_:1})])),_:1},8,["data","onCellDblclick"])])])}var $a={props:["modelValue"],emits:["update:modelValue"],components:{Delete:F.epd,Plus:F.FWt,Warning:F.N5l,Refresh:F.C42},setup(e){const l=b(),a=(0,u.Kh)({lans:l.value.current.Lans.slice(0).map((e=>(e.MapIP=e.MapIP||"0.0.0.0",e.MapPrefixLength=e.MapPrefixLength||24,e)))});0==a.lans.length&&a.lans.push({IP:"0.0.0.0",PrefixLength:24,MapIP:"0.0.0.0",MapPrefixLength:24});const t=(e,l)=>{n(e,l.property)},n=(e,l)=>{a.lans.forEach((e=>{e["IPEditing"]=!1,e["PrefixLengthEditing"]=!1,e["MapIPEditing"]=!1,e["MapPrefixLengthEditing"]=!1})),e[`${l}Editing`]=!0,e["__editing"]=!0},o=(e,l)=>{if(e[`${l}Editing`]=!1,e["__editing"]=!1,"PrefixLength"==l||"MapPrefixLength"==l){var a=+e[l];(a>32||a<0||isNaN(a))&&(a=24),e[l]=a}},r=e=>{a.lans.splice(e,1),0==a.lans.length&&s(0)},s=e=>{a.lans.splice(e+1,0,{IP:"0.0.0.0",PrefixLength:24,MapIP:"0.0.0.0",MapPrefixLength:24})},d=()=>a.lans.map((e=>(e.PrefixLength=+e.PrefixLength,e)));return{state:a,handleDel:r,handleAdd:s,getData:d,handleCellClick:t,handleEditBlur:o,handleEdit:n}}};const Da=(0,E.A)($a,[["render",Ua]]);var za=Da,Oa={props:["modelValue"],emits:["change","update:modelValue"],components:{Socks5Lan:za},setup(e,{emit:l}){const a=(0,d.B)(),n=b(),o=(0,u.KR)(null),r=(0,u.Kh)({show:!0,machineName:n.value.current.device.MachineName,bufferSize:a.value.bufferSize,ruleForm:{Port:n.value.current.Port,Lans:[]},rules:{}});0==r.ruleForm.Lans.length&&r.ruleForm.Lans.push({IP:"0.0.0.0",PrefixLength:24}),(0,t.wB)((()=>r.show),(e=>{e||setTimeout((()=>{l("update:modelValue",e)}),300)}));const s=(0,u.KR)(null),c=()=>{const e=JSON.parse(JSON.stringify(n.value.current));e.Port=+(r.ruleForm.Port||"1805"),e.Lans=s.value.getData(),(0,k._Q)(e).then((()=>{r.show=!1,i.nk.success("已操作!"),l("change")})).catch((e=>{console.log(e),i.nk.error("操作失败!")}))};return{state:r,ruleFormRef:o,socks5Dom:s,handleSave:c}}};const Qa=(0,E.A)(Oa,[["render",ya],["__scopeId","data-v-2ea91b4b"]]);var ja=Qa;const Ka=["title","src"],Ga={key:1,title:"?",class:"system",src:"/system.svg"},qa=["title","src"],Ha={key:3,title:"?",class:"system",src:"/system.svg"},Ja={class:"flex"},Za=["title","onClick"];function Ya(e,l,a,o,r,s){const d=(0,t.g2)("el-table-column");return(0,t.uX)(),(0,t.Wv)(d,{prop:"tunnel",label:"网络",width:"76"},{default:(0,t.k6)((e=>[o.tunnel.list[e.row.MachineId]?((0,t.uX)(),(0,t.CE)(t.FK,{key:0},[(0,t.Lk)("div",null,[o.tunnel.list[e.row.MachineId].Net.CountryCode?((0,t.uX)(),(0,t.CE)("img",{key:0,title:`${o.tunnel.list[e.row.MachineId].Net.CountryCode}、${o.tunnel.list[e.row.MachineId].Net.City}`,class:"system",src:`https://unpkg.com/flag-icons@7.2.3/flags/4x3/${o.tunnel.list[e.row.MachineId].Net.CountryCode.toLowerCase()}.svg`},null,8,Ka)):((0,t.uX)(),(0,t.CE)("img",Ga)),o.tunnel.list[e.row.MachineId].Net.Isp?((0,t.uX)(),(0,t.CE)("img",{key:2,title:`${o.tunnel.list[e.row.MachineId].Net.Isp}`,class:"system",src:o.netImg(o.tunnel.list[e.row.MachineId].Net)},null,8,qa)):((0,t.uX)(),(0,t.CE)("img",Ha))]),(0,t.Lk)("div",Ja,[(0,t.Lk)("a",{href:"javascript:;",class:(0,n.C4)(["a-line",{yellow:o.tunnel.list[e.row.MachineId].NeedReboot}]),title:o.title(o.tunnel.list[e.row.MachineId]),onClick:l=>o.handleTunnel(o.tunnel.list[e.row.MachineId],e.row)},[(0,t.Lk)("span",null,"跳点 : "+(0,n.v_)(o.tunnel.list[e.row.MachineId].RouteLevel)+"+"+(0,n.v_)(o.tunnel.list[e.row.MachineId].RouteLevelPlus),1)],10,Za)])],64)):(0,t.Q3)("",!0)])),_:1})}var et=a(8566),lt={emits:["edit","refresh"],setup(e,{emit:l}){const a=(0,d.B)(),n=(0,t.EW)((()=>a.value.config.Client.Id)),o=(0,t.EW)((()=>a.value.hasAccess("TunnelChangeSelf"))),r=(0,t.EW)((()=>a.value.hasAccess("TunnelChangeOther"))),s=(0,et.e)(),u=((0,ma.ZY)(),(0,ma.mx)()),i=(0,ma.FG)(),c=(0,ma.bB)(),h=e=>{let l=["调整网关层级有助于打洞成功"];return e.NeedReboot?"需要重启":l.join("\r\n")},m={chinanet:"chinanet.svg",china169:"chinanet.svg","china telecom":"chinanet.svg","china unicom":"chinaunicom.svg","china mobile":"chinamobile.svg",huawei:"huawei.svg",amazon:"amazon.svg",aliyun:"aliyun.svg",alibaba:"aliyun.svg"},p=new RegExp(Object.keys(m).map((e=>`\\b${e}\\b`)).join("|")),g=e=>{const l=e.Isp.toLowerCase();if(l){const e=l.match(p);if(e)return`./${m[e[0]]}`}return"./system.svg"},w=e=>{const l=[u.value.list[e],i.value.list[e],c.value.list[e]].filter((e=>!!e&&e.Connected)).length;return l},k=(e,a)=>{if(n.value===e.MachineId){if(!o.value)return}else if(!r.value)return;e.device=a,l("edit",e)},v=()=>{l("refresh")},f=e=>{l("connections",e)};return{tunnel:s,handleTunnel:k,handleTunnelRefresh:v,connectionCount:w,handleConnections:f,title:h,netImg:g}}};const at=(0,E.A)(lt,[["render",Ya],["__scopeId","data-v-64b81c5b"]]);var tt=at;const nt=e=>((0,t.Qi)("data-v-6941c158"),e=e(),(0,t.jt)(),e),ot=nt((()=>(0,t.Lk)("div",null,"网关层级为你的设备与外网的距离,你可以手动调整数值",-1))),rt={class:"pdl-20"},st=nt((()=>(0,t.Lk)("h3",null,"跳跃点",-1))),dt={class:"pdl-20"},ut={class:"t-c w-100"};function it(e,l,a,o,r,s){const d=(0,t.g2)("el-form-item"),u=(0,t.g2)("el-input"),i=(0,t.g2)("el-col"),c=(0,t.g2)("el-input-number"),h=(0,t.g2)("el-row"),m=(0,t.g2)("el-button"),p=(0,t.g2)("el-form"),g=(0,t.g2)("el-dialog");return(0,t.uX)(),(0,t.Wv)(g,{modelValue:o.state.show,"onUpdate:modelValue":l[5]||(l[5]=e=>o.state.show=e),"close-on-click-modal":!1,"append-to":".app-wrap",title:`设置[${o.state.machineName}]网关`,width:"560",top:"2vh"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",null,[(0,t.bF)(p,{ref:"ruleFormRef",model:o.state.ruleForm,rules:o.state.rules,"label-width":"auto"},{default:(0,t.k6)((()=>[(0,t.bF)(d,{label:"",prop:"alert"},{default:(0,t.k6)((()=>[ot])),_:1}),(0,t.bF)(d,{label:""},{default:(0,t.k6)((()=>[(0,t.bF)(h,null,{default:(0,t.k6)((()=>[(0,t.bF)(i,{span:12},{default:(0,t.k6)((()=>[(0,t.bF)(d,{label:"网关层级",prop:"RouteLevel"},{default:(0,t.k6)((()=>[(0,t.bF)(u,{readonly:"",modelValue:o.state.ruleForm.RouteLevel,"onUpdate:modelValue":l[0]||(l[0]=e=>o.state.ruleForm.RouteLevel=e),style:{width:"15rem"}},null,8,["modelValue"])])),_:1})])),_:1}),(0,t.bF)(i,{span:12},{default:(0,t.k6)((()=>[(0,t.bF)(d,{label:"加上",prop:"RouteLevelPlus"},{default:(0,t.k6)((()=>[(0,t.bF)(c,{modelValue:o.state.ruleForm.RouteLevelPlus,"onUpdate:modelValue":l[1]||(l[1]=e=>o.state.ruleForm.RouteLevelPlus=e)},null,8,["modelValue"])])),_:1})])),_:1})])),_:1})])),_:1}),(0,t.bF)(d,{label:""},{default:(0,t.k6)((()=>[(0,t.bF)(h,null,{default:(0,t.k6)((()=>[(0,t.bF)(i,{span:12},{default:(0,t.k6)((()=>[(0,t.bF)(d,{label:"外网端口",prop:"PortMapWan"},{default:(0,t.k6)((()=>[(0,t.bF)(c,{modelValue:o.state.ruleForm.PortMapWan,"onUpdate:modelValue":l[2]||(l[2]=e=>o.state.ruleForm.PortMapWan=e)},null,8,["modelValue"])])),_:1})])),_:1}),(0,t.bF)(i,{span:12},{default:(0,t.k6)((()=>[(0,t.bF)(d,{label:"内网端口",prop:"PortMapLan"},{default:(0,t.k6)((()=>[(0,t.bF)(c,{modelValue:o.state.ruleForm.PortMapLan,"onUpdate:modelValue":l[3]||(l[3]=e=>o.state.ruleForm.PortMapLan=e)},null,8,["modelValue"])])),_:1})])),_:1})])),_:1})])),_:1}),o.state.net.HostName?((0,t.uX)(),(0,t.Wv)(d,{key:0,label:"",prop:"alert"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",null,[(0,t.Lk)("h3",null,(0,n.v_)(o.state.net.HostName),1),(0,t.Lk)("ul",null,[((0,t.uX)(!0),(0,t.CE)(t.FK,null,(0,t.pI)(o.state.net.Lans.filter((e=>e.Ips.length>0)),((e,l)=>((0,t.uX)(),(0,t.CE)("li",null,[(0,t.Lk)("div",null,"【"+(0,n.v_)(e.Mac||"00-00-00-00-00-00")+"】"+(0,n.v_)(e.Desc),1),(0,t.Lk)("div",rt,(0,n.v_)(e.Ips.join("、")),1)])))),256))]),st,(0,t.Lk)("div",dt,(0,n.v_)(o.state.net.Routes.join("、")),1)])])),_:1})):(0,t.Q3)("",!0),(0,t.bF)(d,{label:"",prop:"Btns"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",ut,[(0,t.bF)(m,{onClick:l[4]||(l[4]=e=>o.state.show=!1)},{default:(0,t.k6)((()=>[(0,t.eW)("取消")])),_:1}),(0,t.bF)(m,{type:"primary",onClick:o.handleSave},{default:(0,t.k6)((()=>[(0,t.eW)("确认")])),_:1},8,["onClick"])])])),_:1})])),_:1},8,["model","rules"])])])),_:1},8,["modelValue","title"])}var ct=a(83),ht={props:["modelValue"],emits:["change","update:modelValue"],setup(e,{emit:l}){const a=(0,et.e)(),n=(0,u.KR)(null),o=(0,u.Kh)({show:!0,machineName:a.value.current.device.MachineName,ruleForm:{RouteLevel:a.value.current.RouteLevel,RouteLevelPlus:a.value.current.RouteLevelPlus,PortMapWan:a.value.current.PortMapWan,PortMapLan:a.value.current.PortMapLan},rules:{},net:{}});(0,t.wB)((()=>o.show),(e=>{e||setTimeout((()=>{l("update:modelValue",e)}),300)}));const r=()=>{const e=JSON.parse(JSON.stringify(a.value.current));e.RouteLevel=+o.ruleForm.RouteLevel,e.RouteLevelPlus=+o.ruleForm.RouteLevelPlus,e.PortMapWan=+o.ruleForm.PortMapWan,e.PortMapLan=+o.ruleForm.PortMapLan,(0,ct.KW)(e).then((()=>{o.show=!1,i.nk.success("已操作!"),l("change")})).catch((e=>{console.log(e),i.nk.error("操作失败!")}))};return(0,t.sV)((()=>{(0,ct.Zu)(a.value.current.MachineId).then((e=>{o.net=e})).catch((()=>{}))})),{state:o,ruleFormRef:n,handleSave:r,tunnel:a}}};const mt=(0,E.A)(ht,[["render",it],["__scopeId","data-v-6941c158"]]);var pt=mt;const gt={class:"nowrap"},wt=["onClick"],kt={class:"nowrap"},vt=["onClick"],ft={class:"nowrap"},bt=["onClick"],Ct={class:"nowrap"},Ft=["onClick"];function yt(e,l,a,o,r,s){const d=(0,t.g2)("ConnectionShow"),u=(0,t.g2)("el-table-column");return(0,t.uX)(),(0,t.Wv)(u,{prop:"forward",label:o.forward.show?"转发/穿透":""},{default:(0,t.k6)((l=>[o.forward.show&&l.row.Connected?((0,t.uX)(),(0,t.CE)(t.FK,{key:0},[l.row.isSelf&&(o.hasForwardShowSelf||e.hasForwardSelf)?((0,t.uX)(),(0,t.CE)(t.FK,{key:0},[(0,t.Lk)("div",gt,[(0,t.bF)(d,{data:o.connections.list[l.row.MachineId],row:l.row,transitionId:"forward"},null,8,["data","row"]),(0,t.Lk)("a",{href:"javascript:;",title:"管理自己的端口转发",class:(0,n.C4)({green:o.forward.list[l.row.MachineId]>0}),onClick:e=>o.handleEdit(l.row.MachineId,l.row.MachineName)},[(0,t.Lk)("span",{class:(0,n.C4)({gateway:o.forward.list[l.row.MachineId]>0})},"端口转发("+(0,n.v_)(o.forward.list[l.row.MachineId]>99?"99+":o.forward.list[l.row.MachineId])+")",3)],10,wt)]),(0,t.Lk)("div",kt,[(0,t.Lk)("a",{href:"javascript:;",title:"管理自己的内网穿透",class:(0,n.C4)({green:o.sforward.list[l.row.MachineId]>0}),onClick:e=>o.handleSEdit(l.row.MachineId,l.row.MachineName)},[(0,t.Lk)("span",{class:(0,n.C4)({gateway:o.sforward.list[l.row.MachineId]>0})},"内网穿透("+(0,n.v_)(o.sforward.list[l.row.MachineId]>99?"99+":o.sforward.list[l.row.MachineId])+")",3)],10,vt)])],64)):o.hasForwardShowOther||e.hasForwardOther?((0,t.uX)(),(0,t.CE)(t.FK,{key:1},[(0,t.Lk)("div",ft,[(0,t.bF)(d,{data:o.connections.list[l.row.MachineId],row:l.row,transitionId:"forward"},null,8,["data","row"]),(0,t.Lk)("a",{href:"javascript:;",title:"管理自己的端口转发",class:(0,n.C4)({green:o.forward.list[l.row.MachineId]>0}),onClick:e=>o.handleEdit(l.row.MachineId,l.row.MachineName)},[(0,t.Lk)("span",{class:(0,n.C4)({gateway:o.forward.list[l.row.MachineId]>0})},"端口转发("+(0,n.v_)(o.forward.list[l.row.MachineId]>99?"99+":o.forward.list[l.row.MachineId])+")",3)],10,bt)]),(0,t.Lk)("div",Ct,[(0,t.Lk)("a",{href:"javascript:;",title:"管理自己的内网穿透",class:(0,n.C4)({green:o.sforward.list[l.row.MachineId]>0}),onClick:e=>o.handleSEdit(l.row.MachineId,l.row.MachineName)},[(0,t.Lk)("span",{class:(0,n.C4)({gateway:o.sforward.list[l.row.MachineId]>0})},"内网穿透("+(0,n.v_)(o.sforward.list[l.row.MachineId]>99?"99+":o.sforward.list[l.row.MachineId])+")",3)],10,Ft)])],64)):(0,t.Q3)("",!0)],64)):(0,t.Q3)("",!0)])),_:1},8,["label"])}var Et=a(743);const _t=Symbol(),Vt=()=>{const e=(0,d.B)(),l=((0,t.EW)((()=>e.value.config.Client.Id)),(0,u.KR)({timer:0,showEdit:!1,showCopy:!1,list:{},testTimer:0,hashcode:0,machineid:"",machineName:""}));(0,t.Gt)(_t,l);const a=()=>{(0,Et.a9)()},n=()=>{clearTimeout(l.value.timer),(0,Et.gz)(l.value.hashcode.toString()).then((e=>{l.value.hashcode=e.HashCode,e.List&&(l.value.list=e.List),l.value.timer=setTimeout(n,1020)})).catch((()=>{l.value.timer=setTimeout(n,1020)}))},o=e=>{l.value.machineid=e[0],l.value.machineName=e[1],l.value.showEdit=!0},r=()=>{clearTimeout(l.value.timer),clearTimeout(l.value.testTimer)};return{sforward:l,_getSForwardCountInfo:n,handleSForwardEdit:o,clearSForwardTimeout:r,handleSForwardRefresh:a}},Lt=()=>(0,t.WQ)(_t);var Pt={emits:["edit","sedit"],components:{ConnectionShow:pa.A},setup(e,{emit:l}){const a=w(),n=Lt(),o=(0,d.B)(),r=(0,t.EW)((()=>o.value.config.Client.Id)),s=(0,t.EW)((()=>o.value.hasAccess("ForwardShowSelf"))),u=(0,t.EW)((()=>o.value.hasAccess("ForwardShowOther"))),i=(0,t.EW)((()=>o.value.hasAccess("ForwardSelf"))),c=(0,t.EW)((()=>o.value.hasAccess("ForwardOther"))),h=(0,ma.mx)(),m=(e,a)=>{if(r.value===e){if(!i.value)return}else if(!c.value)return;l("edit",[e,a])},p=(e,a)=>{if(r.value===e){if(!i.value)return}else if(!c.value)return;l("sedit",[e,a])},g=()=>{l("refresh")};return{forward:a,sforward:n,hasForwardShowSelf:s,hasForwardShowOther:u,connections:h,handleEdit:m,handleSEdit:p,handleForwardRefresh:g}}};const It=(0,E.A)(Pt,[["render",yt],["__scopeId","data-v-2ed9a082"]]);var Tt=It;const Mt={class:"t-c head"},St=["onClick"],Wt=["onClick"],At=["onClick"],Xt=["onClick"],Rt=["title"],xt={class:"t-c"},Nt={class:"page-wrap"},Bt=["onClick"],Ut={key:0},$t={key:1,class:"error red",title:"off line"},Dt=["onClick"],zt=["title"];function Ot(e,l,a,o,r,s){const d=(0,t.g2)("el-button"),u=(0,t.g2)("el-input"),i=(0,t.g2)("el-table-column"),c=(0,t.g2)("el-option"),h=(0,t.g2)("el-select"),m=(0,t.g2)("el-pagination"),p=(0,t.g2)("el-switch"),g=(0,t.g2)("Delete"),w=(0,t.g2)("el-icon"),k=(0,t.g2)("el-popconfirm"),v=(0,t.g2)("el-table"),f=(0,t.g2)("el-dialog");return(0,t.uX)(),(0,t.Wv)(f,{modelValue:o.state.show,"onUpdate:modelValue":l[0]||(l[0]=e=>o.state.show=e),onOpen:o.handleOnShowList,"append-to":".app-wrap",title:`【${o.state.machineName}】的端口转发`,top:"1vh",width:"780"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",null,[(0,t.Lk)("div",Mt,[(0,t.bF)(d,{type:"success",size:"small",onClick:o.handleAdd,loading:o.state.loading},{default:(0,t.k6)((()=>[(0,t.eW)("添加")])),_:1},8,["onClick","loading"]),(0,t.bF)(d,{size:"small",onClick:o.handleRefresh},{default:(0,t.k6)((()=>[(0,t.eW)("刷新")])),_:1},8,["onClick"])]),(0,t.bF)(v,{data:o.state.data,size:"small",border:"",height:"500",onCellDblclick:o.handleCellClick},{default:(0,t.k6)((()=>[(0,t.bF)(i,{property:"Name",label:"名称",width:"100"},{default:(0,t.k6)((e=>[e.row.NameEditing&&0==e.row.Started?((0,t.uX)(),(0,t.Wv)(u,{key:0,autofocus:"",size:"small",modelValue:e.row.Name,"onUpdate:modelValue":l=>e.row.Name=l,onBlur:l=>o.handleEditBlur(e.row,"Name")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,t.uX)(),(0,t.CE)("a",{key:1,href:"javascript:;",class:"a-line",onClick:l=>o.handleEdit(e.row,"Name")},(0,n.v_)(e.row.Name||"未知"),9,St))])),_:1}),(0,t.bF)(i,{prop:"BufferSize",label:"缓冲区",width:"80"},{default:(0,t.k6)((e=>[e.row.BufferSizeEditing&&0==e.row.Started?((0,t.uX)(),(0,t.Wv)(h,{key:0,modelValue:e.row.BufferSize,"onUpdate:modelValue":l=>e.row.BufferSize=l,placeholder:"Select",size:"small",disabled:e.row.Started,onChange:l=>o.handleEditBlur(e.row,"BufferSize")},{default:(0,t.k6)((()=>[((0,t.uX)(!0),(0,t.CE)(t.FK,null,(0,t.pI)(o.state.bufferSize,((e,l)=>((0,t.uX)(),(0,t.Wv)(c,{key:l,label:e,value:l},null,8,["label","value"])))),128))])),_:2},1032,["modelValue","onUpdate:modelValue","disabled","onChange"])):((0,t.uX)(),(0,t.CE)("a",{key:1,href:"javascript:;",class:"a-line",onClick:l=>o.handleEdit(e.row,"BufferSize")},(0,n.v_)(o.state.bufferSize[e.row.BufferSize]),9,Wt))])),_:1}),(0,t.bF)(i,{property:"BindIPAddress",label:"监听IP",width:"140"},{default:(0,t.k6)((e=>[e.row.BindIPAddressEditing&&0==e.row.Started?((0,t.uX)(),(0,t.Wv)(h,{key:0,modelValue:e.row.BindIPAddress,"onUpdate:modelValue":l=>e.row.BindIPAddress=l,size:"small",disabled:e.row.Started,onChange:l=>o.handleEditBlur(e.row,"BindIPAddress")},{default:(0,t.k6)((()=>[((0,t.uX)(!0),(0,t.CE)(t.FK,null,(0,t.pI)(o.state.ips,(e=>((0,t.uX)(),(0,t.Wv)(c,{key:e,label:e,value:e},null,8,["label","value"])))),128))])),_:2},1032,["modelValue","onUpdate:modelValue","disabled","onChange"])):((0,t.uX)(),(0,t.CE)("a",{key:1,href:"javascript:;",class:"a-line",onClick:l=>o.handleEdit(e.row,"BindIPAddress")},(0,n.v_)(e.row.BindIPAddress),9,At))])),_:1}),(0,t.bF)(i,{property:"Port",label:"监听端口",width:"80"},{default:(0,t.k6)((e=>[e.row.PortEditing&&0==e.row.Started?((0,t.uX)(),(0,t.Wv)(u,{key:0,type:"number",autofocus:"",size:"small",modelValue:e.row.Port,"onUpdate:modelValue":l=>e.row.Port=l,onBlur:l=>o.handleEditBlur(e.row,"Port")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,t.uX)(),(0,t.CE)("a",{key:1,href:"javascript:;",class:"a-line",onClick:l=>o.handleEdit(e.row,"Port")},[e.row.Msg?((0,t.uX)(),(0,t.CE)("div",{key:0,class:"error red",title:e.row.Msg},[(0,t.Lk)("span",null,(0,n.v_)(e.row.Port),1)],8,Rt)):((0,t.uX)(),(0,t.CE)("span",{key:1,class:(0,n.C4)({green:e.row.Started})},(0,n.v_)(e.row.Port),3))],8,Xt))])),_:1}),(0,t.bF)(i,{property:"MachineId",label:"目标"},{default:(0,t.k6)((e=>[e.row.MachineIdEditing&&0==e.row.Started?((0,t.uX)(),(0,t.Wv)(h,{key:0,modelValue:e.row.MachineId,"onUpdate:modelValue":l=>e.row.MachineId=l,onChange:l=>o.handleEditBlur(e.row,"MachineId"),filterable:"",remote:"",loading:o.state.loading,"remote-method":o.handleSearch},{header:(0,t.k6)((()=>[(0,t.Lk)("div",xt,[(0,t.Lk)("div",Nt,[(0,t.bF)(m,{small:"",background:"",layout:"prev, pager, next","page-size":o.state.machineIds.Request.Size,total:o.state.machineIds.Count,"pager-count":5,"current-page":o.state.machineIds.Request.Page,onCurrentChange:o.handlePageChange},null,8,["page-size","total","current-page","onCurrentChange"])])])])),default:(0,t.k6)((()=>[((0,t.uX)(!0),(0,t.CE)(t.FK,null,(0,t.pI)(o.state.machineIds.List,((e,l)=>((0,t.uX)(),(0,t.Wv)(c,{key:l,label:e.MachineName,value:e.MachineId},null,8,["label","value"])))),128))])),_:2},1032,["modelValue","onUpdate:modelValue","onChange","loading","remote-method"])):((0,t.uX)(),(0,t.CE)("a",{key:1,href:"javascript:;",class:"a-line",onClick:l=>o.handleEdit(e.row,"MachineId")},[o.state.names[e.row.MachineId]?((0,t.uX)(),(0,t.CE)("span",Ut,(0,n.v_)(e.row.MachineName||"未知"),1)):((0,t.uX)(),(0,t.CE)("span",$t,(0,n.v_)(e.row.MachineName||"未知"),1))],8,Bt))])),_:1}),(0,t.bF)(i,{property:"TargetEP",label:"目标服务",width:"140"},{default:(0,t.k6)((e=>[e.row.TargetEPEditing&&0==e.row.Started?((0,t.uX)(),(0,t.Wv)(u,{key:0,autofocus:"",size:"small",modelValue:e.row.TargetEP,"onUpdate:modelValue":l=>e.row.TargetEP=l,onBlur:l=>o.handleEditBlur(e.row,"TargetEP")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,t.uX)(),(0,t.CE)("a",{key:1,href:"javascript:;",class:"a-line",onClick:l=>o.handleEdit(e.row,"TargetEP")},[e.row.TargetMsg?((0,t.uX)(),(0,t.CE)("div",{key:0,class:"error red",title:e.row.TargetMsg},[(0,t.Lk)("span",null,(0,n.v_)(e.row.TargetEP),1)],8,zt)):((0,t.uX)(),(0,t.CE)("span",{key:1,class:(0,n.C4)({green:e.row.Started})},(0,n.v_)(e.row.TargetEP),3))],8,Dt))])),_:1}),(0,t.bF)(i,{property:"Started",label:"状态",width:"60"},{default:(0,t.k6)((e=>[(0,t.bF)(p,{modelValue:e.row.Started,"onUpdate:modelValue":l=>e.row.Started=l,onChange:l=>o.handleStartChange(e.row),"inline-prompt":"","active-text":"开","inactive-text":"关"},null,8,["modelValue","onUpdate:modelValue","onChange"])])),_:1}),(0,t.bF)(i,{label:"操作",width:"54"},{default:(0,t.k6)((e=>[(0,t.bF)(k,{"confirm-button-text":"确认","cancel-button-text":"取消",title:"删除不可逆,是否确认?",onConfirm:l=>o.handleDel(e.row.Id)},{reference:(0,t.k6)((()=>[(0,t.bF)(d,{type:"danger",size:"small"},{default:(0,t.k6)((()=>[(0,t.bF)(w,null,{default:(0,t.k6)((()=>[(0,t.bF)(g)])),_:1})])),_:1})])),_:2},1032,["onConfirm"])])),_:1})])),_:1},8,["data","onCellDblclick"])])])),_:1},8,["modelValue","onOpen","title"])}var Qt={props:["data","modelValue"],emits:["update:modelValue"],components:{Delete:F.epd},setup(e,{emit:l}){const a=(0,d.B)(),n=w(),o=(0,u.Kh)({show:!0,machineId:n.value.machineId,machineName:n.value.machineName,data:[],ips:[],bufferSize:a.value.bufferSize,loading:!1,machineIds:{Request:{Page:1,Size:10,Name:""},Count:0,List:[]},timer:0,timer1:0,editing:!1,names:{}});(0,t.wB)((()=>o.show),(e=>{e||setTimeout((()=>{l("update:modelValue",e)}),300)}));const r=()=>{clearTimeout(o.timer),(0,m.lE)(n.value.machineId).then((e=>{o.timer=setTimeout(r,1e3)})).catch((()=>{o.timer=setTimeout(r,1e3)}))},s=()=>{(0,m.xD)().then((e=>{e.splice(0,0,"127.0.0.1"),e.splice(0,0,"0.0.0.0"),o.ips=e})).catch((()=>{}))},c=()=>{clearTimeout(o.timer1),0==o.editing?(0,m.Oy)(o.machineId).then((e=>{o.data=e,o.timer1=setTimeout(c,1e3)})).catch((()=>{o.timer1=setTimeout(c,1e3)})):o.timer1=setTimeout(c,1e3)},h=()=>{c(),i.nk.success("已刷新")},p=()=>{(0,M.NT)().then((e=>{o.names=e.filter((e=>e.Online)).reduce(((e,l)=>(e[l.MachineId]=!0,e)),{})})).catch((()=>{}))},g=e=>{o.machineIds.Request.Name=e,k()},k=()=>{o.loading=!0,(0,M.BS)(o.machineIds.Request).then((e=>{o.loading=!1,o.machineIds.Request=e.Request,o.machineIds.Count=e.Count,o.machineIds.List=e.List})).catch((e=>{o.loading=!1}))},v=e=>{o.machineIds.Request.Page=e,k()},f=()=>{k()},b=(e,l)=>{F(e,l.property)},C=()=>{V({ID:0,Name:"",Port:0,TargetEP:"127.0.0.1:80",machineId:""})},F=(e,l)=>{e.Started?i.nk.error("请先停止"):(o.data.forEach((e=>{e["NameEditing"]=!1,e["PortEditing"]=!1,e["TargetEPEditing"]=!1,e["BindIPAddressEditing"]=!1,e["BufferSizeEditing"]=!1,e["MachineIdEditing"]=!1})),e[`${l}Editing`]=!0,o.editing=!0)},y=(e,l)=>{if(e.Started)return void i.nk.error("请先停止");e[`${l}Editing`]=!1,o.editing=!1;const a=o.machineIds.List.find((l=>l.MachineId==e.MachineId));a&&(e.MachineName=a.MachineName),V(e)},E=e=>{(0,m.we)({machineId:o.machineId,Id:e}).then((()=>{c()}))},_=e=>{V(e)},V=e=>{o.loading=!0,e.Port=parseInt(e.Port),(0,m.nH)({machineId:o.machineId,data:e}).then((()=>{o.loading=!1,c()})).catch((e=>{o.loading=!1,i.nk.error(e)}))};return(0,t.sV)((()=>{c(),s(),r(),p()})),(0,t.hi)((()=>{clearTimeout(o.timer),clearTimeout(o.timer1)})),{state:o,handleOnShowList:f,handleCellClick:b,handleRefresh:h,handleAdd:C,handleEdit:F,handleEditBlur:y,handleDel:E,handleStartChange:_,handleSearch:g,handlePageChange:v}}};const jt=(0,E.A)(Qt,[["render",Ot],["__scopeId","data-v-aaafd500"]]);var Kt=jt;const Gt={class:"t-c head"},qt=["onClick"],Ht={class:"plan"},Jt=["onClick"],Zt=["title"],Yt=["onClick"],en=["title"];function ln(e,l,a,o,r,s){const d=(0,t.g2)("el-button"),u=(0,t.g2)("el-input"),i=(0,t.g2)("el-table-column"),c=(0,t.g2)("Select"),h=(0,t.g2)("el-icon"),m=(0,t.g2)("PlanShow"),p=(0,t.g2)("CloseBold"),g=(0,t.g2)("WarnTriangleFilled"),w=(0,t.g2)("el-switch"),k=(0,t.g2)("Delete"),v=(0,t.g2)("el-popconfirm"),f=(0,t.g2)("el-table"),b=(0,t.g2)("el-dialog"),C=(0,t.g2)("PlanList");return(0,t.uX)(),(0,t.Wv)(C,{ref:"planDom",machineid:o.machineId,category:"sforward",handles:o.state.handles},{default:(0,t.k6)((()=>[(0,t.bF)(b,{modelValue:o.state.show,"onUpdate:modelValue":l[0]||(l[0]=e=>o.state.show=e),onOpen:o.handleOnShowList,"append-to":".app-wrap",title:`【${o.machineName}】的内网穿透`,top:"2vh",width:"760"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",null,[(0,t.Lk)("div",Gt,[(0,t.bF)(d,{type:"success",size:"small",onClick:o.handleAdd,loading:o.state.loading},{default:(0,t.k6)((()=>[(0,t.eW)("添加")])),_:1},8,["onClick","loading"]),(0,t.bF)(d,{size:"small",onClick:o.handleRefresh},{default:(0,t.k6)((()=>[(0,t.eW)("刷新")])),_:1},8,["onClick"])]),(0,t.bF)(f,{data:o.state.data,size:"small",border:"",height:"500",onCellDblclick:o.handleCellClick},{default:(0,t.k6)((()=>[(0,t.bF)(i,{property:"Name",label:"名称"},{default:(0,t.k6)((e=>[e.row.NameEditing&&0==e.row.Started?((0,t.uX)(),(0,t.Wv)(u,{key:0,autofocus:"",size:"small",modelValue:e.row.Name,"onUpdate:modelValue":l=>e.row.Name=l,onBlur:l=>o.handleEditBlur(e.row,"Name")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,t.uX)(),(0,t.CE)("a",{key:1,href:"javascript:;",class:"a-line",onClick:l=>o.handleEdit(e.row,"Name")},(0,n.v_)(e.row.Name||"未知"),9,qt))])),_:1}),(0,t.bF)(i,{prop:"Plan",label:"开启和关闭计划",width:"200"},{default:(0,t.k6)((e=>[(0,t.Lk)("div",Ht,[(0,t.Lk)("p",null,[(0,t.bF)(h,null,{default:(0,t.k6)((()=>[(0,t.bF)(c)])),_:1}),(0,t.bF)(m,{handle:"start",keyid:e.row.Id},null,8,["keyid"])]),(0,t.Lk)("p",null,[(0,t.bF)(h,null,{default:(0,t.k6)((()=>[(0,t.bF)(p)])),_:1}),(0,t.bF)(m,{handle:"stop",keyid:e.row.Id},null,8,["keyid"])])])])),_:1}),(0,t.bF)(i,{property:"Temp",label:"服务器端口/域名",width:"160"},{default:(0,t.k6)((e=>[e.row.TempEditing&&0==e.row.Started?((0,t.uX)(),(0,t.Wv)(u,{key:0,autofocus:"",size:"small",modelValue:e.row.Temp,"onUpdate:modelValue":l=>e.row.Temp=l,onBlur:l=>o.handleEditBlur(e.row,"Temp")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,t.uX)(),(0,t.CE)("a",{key:1,href:"javascript:;",class:"a-line",onClick:l=>o.handleEdit(e.row,"Temp")},[e.row.Msg?((0,t.uX)(),(0,t.CE)("div",{key:0,class:"error red",title:e.row.Msg},[(0,t.Lk)("span",null,(0,n.v_)(e.row.Temp),1),(0,t.bF)(h,{size:"20"},{default:(0,t.k6)((()=>[(0,t.bF)(g)])),_:1})],8,Zt)):((0,t.uX)(),(0,t.CE)("span",{key:1,class:(0,n.C4)({green:e.row.Started})},(0,n.v_)(e.row.Temp),3))],8,Jt))])),_:1}),(0,t.bF)(i,{property:"LocalEP",label:"本机服务",width:"140"},{default:(0,t.k6)((e=>[e.row.LocalEPEditing&&0==e.row.Started?((0,t.uX)(),(0,t.Wv)(u,{key:0,autofocus:"",size:"small",modelValue:e.row.LocalEP,"onUpdate:modelValue":l=>e.row.LocalEP=l,onBlur:l=>o.handleEditBlur(e.row,"LocalEP")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,t.uX)(),(0,t.CE)("a",{key:1,href:"javascript:;",class:"a-line",onClick:l=>o.handleEdit(e.row,"LocalEP")},[e.row.LocalMsg?((0,t.uX)(),(0,t.CE)("div",{key:0,class:"error red",title:e.row.LocalMsg},[(0,t.Lk)("span",null,(0,n.v_)(e.row.LocalEP),1),(0,t.bF)(h,{size:"20"},{default:(0,t.k6)((()=>[(0,t.bF)(g)])),_:1})],8,en)):((0,t.uX)(),(0,t.CE)("span",{key:1,class:(0,n.C4)({green:e.row.Started})},(0,n.v_)(e.row.LocalEP),3))],8,Yt))])),_:1}),(0,t.bF)(i,{property:"Started",label:"状态",width:"60"},{default:(0,t.k6)((e=>[(0,t.bF)(w,{disabled:"",modelValue:e.row.Started,"onUpdate:modelValue":l=>e.row.Started=l,"inline-prompt":"","active-text":"是","inactive-text":"否",onClick:l=>o.handleStartChange(e.row)},null,8,["modelValue","onUpdate:modelValue","onClick"])])),_:1}),(0,t.bF)(i,{label:"操作",width:"54"},{default:(0,t.k6)((e=>[(0,t.bF)(v,{"confirm-button-text":"确认","cancel-button-text":"取消",title:"删除不可逆,是否确认?",onConfirm:l=>o.handleDel(e.row.Id)},{reference:(0,t.k6)((()=>[(0,t.bF)(d,{type:"danger",size:"small"},{default:(0,t.k6)((()=>[(0,t.bF)(h,null,{default:(0,t.k6)((()=>[(0,t.bF)(k)])),_:1})])),_:1})])),_:2},1032,["onConfirm"])])),_:1})])),_:1},8,["data","onCellDblclick"])])])),_:1},8,["modelValue","onOpen","title"])])),_:1},8,["machineid","handles"])}function an(e,l,a,n,o,r){const s=(0,t.g2)("PlanEdit");return(0,t.uX)(),(0,t.CE)("div",null,[(0,t.RG)(e.$slots,"default"),n.plan.showEdit?((0,t.uX)(),(0,t.Wv)(s,{key:0,modelValue:n.plan.showEdit,"onUpdate:modelValue":l[0]||(l[0]=e=>n.plan.showEdit=e)},null,8,["modelValue"])):(0,t.Q3)("",!0)])}var tn=a(4);const nn=(e,l)=>(0,tn.zG)("plan/get",{machineId:e,category:l}),on=(e,l)=>(0,tn.zG)("plan/add",{machineId:e,plan:l}),rn=(e,l)=>(0,tn.zG)("plan/remove",{machineId:e,planId:l}),sn={key:0,class:"mgl-2"},dn={class:"w-100"},un=(0,t.Lk)("span",null,"的",-1),cn={class:"w-100 mgt-1"},hn={class:"w-100"},mn={class:"w-100 mgt-1"},pn={class:"w-100"},gn={class:"w-100 mgt-1"},wn={class:"w-100"},kn=(0,t.Lk)("span",null,"的",-1),vn={class:"mgt-1 w-100"},fn={class:"mgt-1 w-100"},bn=(0,t.Lk)("span",null,"后",-1),Cn={class:"t-c w-100"};function Fn(e,l,a,o,r,s){const d=(0,t.g2)("el-option"),u=(0,t.g2)("el-select"),i=(0,t.g2)("el-form-item"),c=(0,t.g2)("el-input"),h=(0,t.g2)("el-switch"),m=(0,t.g2)("el-button"),p=(0,t.g2)("el-form"),g=(0,t.g2)("el-dialog");return(0,t.uX)(),(0,t.Wv)(g,{modelValue:o.state.show,"onUpdate:modelValue":l[30]||(l[30]=e=>o.state.show=e),"close-on-click-modal":!1,"append-to":".app-wrap",title:"计划任务",top:"2vh",width:"450"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",null,[(0,t.bF)(p,{ref:"ruleFormRef",model:o.state.ruleForm,rules:o.state.rules,"label-width":"auto"},{default:(0,t.k6)((()=>[(0,t.bF)(i,{label:"执行操作",prop:"Handle"},{default:(0,t.k6)((()=>[(0,t.bF)(u,{modelValue:o.state.ruleForm.Handle,"onUpdate:modelValue":l[0]||(l[0]=e=>o.state.ruleForm.Handle=e),style:{width:"10rem"},disabled:""},{default:(0,t.k6)((()=>[((0,t.uX)(!0),(0,t.CE)(t.FK,null,(0,t.pI)(o.plan.handles,((e,l)=>((0,t.uX)(),(0,t.Wv)(d,{value:e.value,label:e.label},null,8,["value","label"])))),256))])),_:1},8,["modelValue"])])),_:1}),(0,t.bF)(i,{label:"执行方式",prop:"Method"},{default:(0,t.k6)((()=>[(0,t.bF)(u,{modelValue:o.state.ruleForm.Method,"onUpdate:modelValue":l[1]||(l[1]=e=>o.state.ruleForm.Method=e),style:{width:"10rem"},onChange:o.handleChange},{default:(0,t.k6)((()=>[((0,t.uX)(!0),(0,t.CE)(t.FK,null,(0,t.pI)(o.plan.methods,((e,l)=>((0,t.uX)(),(0,t.Wv)(d,{value:e.value,label:e.label},null,8,["value","label"])))),256))])),_:1},8,["modelValue","onChange"]),o.state.ruleForm.Method>=2?((0,t.uX)(),(0,t.CE)("strong",sn,(0,n.v_)(o.state.ruleForm.Rule),1)):(0,t.Q3)("",!0)])),_:1}),2==o.state.ruleForm.Method?((0,t.uX)(),(0,t.Wv)(i,{key:0,label:"在",prop:"Rule"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",dn,[(0,t.bF)(u,{modelValue:o.state.ruleAt.type,"onUpdate:modelValue":l[2]||(l[2]=e=>o.state.ruleAt.type=e),style:{width:"10rem"},onChange:o.handleChange},{default:(0,t.k6)((()=>[(0,t.bF)(d,{value:2,label:"每月"}),(0,t.bF)(d,{value:3,label:"每日"}),(0,t.bF)(d,{value:4,label:"每时"}),(0,t.bF)(d,{value:5,label:"每分"})])),_:1},8,["modelValue","onChange"]),(0,t.eW)(),un]),(0,t.Lk)("div",cn,[o.state.ruleAt.type<2?((0,t.uX)(),(0,t.Wv)(c,{key:0,onChange:o.handleChange,modelValue:o.state.ruleAt.month,"onUpdate:modelValue":l[3]||(l[3]=e=>o.state.ruleAt.month=e),style:{width:"8rem"}},{append:(0,t.k6)((()=>[(0,t.eW)("月")])),_:1},8,["onChange","modelValue"])):(0,t.Q3)("",!0),o.state.ruleAt.type<3?((0,t.uX)(),(0,t.Wv)(c,{key:1,onChange:o.handleChange,class:(0,n.C4)({"mgl-1":o.state.ruleAt.type<2}),modelValue:o.state.ruleAt.day,"onUpdate:modelValue":l[4]||(l[4]=e=>o.state.ruleAt.day=e),style:{width:"8rem"}},{append:(0,t.k6)((()=>[(0,t.eW)("日")])),_:1},8,["onChange","class","modelValue"])):(0,t.Q3)("",!0),o.state.ruleAt.type<4?((0,t.uX)(),(0,t.Wv)(c,{key:2,onChange:o.handleChange,class:(0,n.C4)({"mgl-1":o.state.ruleAt.type<3}),modelValue:o.state.ruleAt.hour,"onUpdate:modelValue":l[5]||(l[5]=e=>o.state.ruleAt.hour=e),style:{width:"8rem"}},{append:(0,t.k6)((()=>[(0,t.eW)("时")])),_:1},8,["onChange","class","modelValue"])):(0,t.Q3)("",!0),o.state.ruleAt.type<5?((0,t.uX)(),(0,t.Wv)(c,{key:3,onChange:o.handleChange,class:(0,n.C4)({"mgl-1":o.state.ruleAt.type<4}),modelValue:o.state.ruleAt.min,"onUpdate:modelValue":l[6]||(l[6]=e=>o.state.ruleAt.min=e),style:{width:"8rem"}},{append:(0,t.k6)((()=>[(0,t.eW)("分")])),_:1},8,["onChange","class","modelValue"])):(0,t.Q3)("",!0),(0,t.bF)(c,{onChange:o.handleChange,class:(0,n.C4)({"mgl-1":o.state.ruleAt.type<5}),modelValue:o.state.ruleAt.sec,"onUpdate:modelValue":l[7]||(l[7]=e=>o.state.ruleAt.sec=e),style:{width:"8rem"}},{append:(0,t.k6)((()=>[(0,t.eW)("秒")])),_:1},8,["onChange","class","modelValue"])])])),_:1})):(0,t.Q3)("",!0),4==o.state.ruleForm.Method?((0,t.uX)(),(0,t.Wv)(i,{key:1,label:"每",prop:"Rule"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",hn,[(0,t.bF)(c,{onChange:o.handleChange,modelValue:o.state.ruleTimer.year,"onUpdate:modelValue":l[8]||(l[8]=e=>o.state.ruleTimer.year=e),style:{width:"8rem"}},{append:(0,t.k6)((()=>[(0,t.eW)("年")])),_:1},8,["onChange","modelValue"]),(0,t.bF)(c,{onChange:o.handleChange,class:"mgl-1",modelValue:o.state.ruleTimer.month,"onUpdate:modelValue":l[9]||(l[9]=e=>o.state.ruleTimer.month=e),style:{width:"8rem"}},{append:(0,t.k6)((()=>[(0,t.eW)("月")])),_:1},8,["onChange","modelValue"]),(0,t.bF)(c,{onChange:o.handleChange,class:"mgl-1",modelValue:o.state.ruleTimer.day,"onUpdate:modelValue":l[10]||(l[10]=e=>o.state.ruleTimer.day=e),style:{width:"8rem"}},{append:(0,t.k6)((()=>[(0,t.eW)("日")])),_:1},8,["onChange","modelValue"])]),(0,t.Lk)("div",mn,[(0,t.bF)(c,{onChange:o.handleChange,modelValue:o.state.ruleTimer.hour,"onUpdate:modelValue":l[11]||(l[11]=e=>o.state.ruleTimer.hour=e),style:{width:"8rem"}},{append:(0,t.k6)((()=>[(0,t.eW)("时")])),_:1},8,["onChange","modelValue"]),(0,t.bF)(c,{onChange:o.handleChange,class:"mgl-1",modelValue:o.state.ruleTimer.min,"onUpdate:modelValue":l[12]||(l[12]=e=>o.state.ruleTimer.min=e),style:{width:"8rem"}},{append:(0,t.k6)((()=>[(0,t.eW)("分")])),_:1},8,["onChange","modelValue"]),(0,t.bF)(c,{onChange:o.handleChange,class:"mgl-1",modelValue:o.state.ruleTimer.sec,"onUpdate:modelValue":l[13]||(l[13]=e=>o.state.ruleTimer.sec=e),style:{width:"8rem"}},{append:(0,t.k6)((()=>[(0,t.eW)("秒")])),_:1},8,["onChange","modelValue"])])])),_:1})):(0,t.Q3)("",!0),8==o.state.ruleForm.Method?((0,t.uX)(),(0,t.Wv)(i,{key:2,label:"Cron",prop:"Rule"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",pn,[(0,t.bF)(c,{onChange:o.handleChange,modelValue:o.state.ruleCron.sec,"onUpdate:modelValue":l[14]||(l[14]=e=>o.state.ruleCron.sec=e),style:{width:"8rem"}},{append:(0,t.k6)((()=>[(0,t.eW)("秒")])),_:1},8,["onChange","modelValue"]),(0,t.bF)(c,{onChange:o.handleChange,class:"mgl-1",modelValue:o.state.ruleCron.min,"onUpdate:modelValue":l[15]||(l[15]=e=>o.state.ruleCron.min=e),style:{width:"8rem"}},{append:(0,t.k6)((()=>[(0,t.eW)("分")])),_:1},8,["onChange","modelValue"]),(0,t.bF)(c,{onChange:o.handleChange,class:"mgl-1",modelValue:o.state.ruleCron.hour,"onUpdate:modelValue":l[16]||(l[16]=e=>o.state.ruleCron.hour=e),style:{width:"8rem"}},{append:(0,t.k6)((()=>[(0,t.eW)("时")])),_:1},8,["onChange","modelValue"])]),(0,t.Lk)("div",gn,[(0,t.bF)(c,{onChange:o.handleChange,modelValue:o.state.ruleCron.day,"onUpdate:modelValue":l[17]||(l[17]=e=>o.state.ruleCron.day=e),style:{width:"8rem"}},{append:(0,t.k6)((()=>[(0,t.eW)("日")])),_:1},8,["onChange","modelValue"]),(0,t.bF)(c,{onChange:o.handleChange,class:"mgl-1",modelValue:o.state.ruleCron.month,"onUpdate:modelValue":l[18]||(l[18]=e=>o.state.ruleCron.month=e),style:{width:"8rem"}},{append:(0,t.k6)((()=>[(0,t.eW)("月")])),_:1},8,["onChange","modelValue"]),(0,t.bF)(c,{onChange:o.handleChange,class:"mgl-1",modelValue:o.state.ruleCron.week,"onUpdate:modelValue":l[19]||(l[19]=e=>o.state.ruleCron.week=e),style:{width:"8rem"}},{append:(0,t.k6)((()=>[(0,t.eW)("周")])),_:1},8,["onChange","modelValue"])])])),_:1})):(0,t.Q3)("",!0),16==o.state.ruleForm.Method?((0,t.uX)(),(0,t.Wv)(i,{key:3,label:"在",prop:"Rule"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",wn,[(0,t.bF)(u,{modelValue:o.state.ruleForm.TriggerHandle,"onUpdate:modelValue":l[20]||(l[20]=e=>o.state.ruleForm.TriggerHandle=e),style:{width:"10rem"},onChange:o.handleChange},{default:(0,t.k6)((()=>[((0,t.uX)(!0),(0,t.CE)(t.FK,null,(0,t.pI)(o.plan.triggers,((e,l)=>((0,t.uX)(),(0,t.Wv)(d,{value:e.value,label:e.label},null,8,["value","label"])))),256))])),_:1},8,["modelValue","onChange"]),(0,t.eW)(),kn]),(0,t.Lk)("div",vn,[(0,t.bF)(c,{onChange:o.handleChange,modelValue:o.state.ruleTrigger.year,"onUpdate:modelValue":l[21]||(l[21]=e=>o.state.ruleTrigger.year=e),style:{width:"8rem"}},{append:(0,t.k6)((()=>[(0,t.eW)("年")])),_:1},8,["onChange","modelValue"]),(0,t.bF)(c,{onChange:o.handleChange,class:"mgl-1",modelValue:o.state.ruleTrigger.month,"onUpdate:modelValue":l[22]||(l[22]=e=>o.state.ruleTrigger.month=e),style:{width:"8rem"}},{append:(0,t.k6)((()=>[(0,t.eW)("月")])),_:1},8,["onChange","modelValue"]),(0,t.bF)(c,{onChange:o.handleChange,class:"mgl-1",modelValue:o.state.ruleTrigger.day,"onUpdate:modelValue":l[23]||(l[23]=e=>o.state.ruleTrigger.day=e),style:{width:"8rem"}},{append:(0,t.k6)((()=>[(0,t.eW)("日")])),_:1},8,["onChange","modelValue"])]),(0,t.Lk)("div",fn,[(0,t.bF)(c,{onChange:o.handleChange,modelValue:o.state.ruleTrigger.hour,"onUpdate:modelValue":l[24]||(l[24]=e=>o.state.ruleTrigger.hour=e),style:{width:"8rem"}},{append:(0,t.k6)((()=>[(0,t.eW)("时")])),_:1},8,["onChange","modelValue"]),(0,t.bF)(c,{onChange:o.handleChange,class:"mgl-1",modelValue:o.state.ruleTrigger.min,"onUpdate:modelValue":l[25]||(l[25]=e=>o.state.ruleTrigger.min=e),style:{width:"8rem"}},{append:(0,t.k6)((()=>[(0,t.eW)("分")])),_:1},8,["onChange","modelValue"]),(0,t.bF)(c,{onChange:o.handleChange,class:"mgl-1",modelValue:o.state.ruleTrigger.sec,"onUpdate:modelValue":l[26]||(l[26]=e=>o.state.ruleTrigger.sec=e),style:{width:"8rem"}},{append:(0,t.k6)((()=>[(0,t.eW)("秒")])),_:1},8,["onChange","modelValue"]),bn])])),_:1})):(0,t.Q3)("",!0),(0,t.bF)(i,{label:"内容",prop:"Value"},{default:(0,t.k6)((()=>[(0,t.bF)(c,{type:"textarea",resize:"none",rows:"5",modelValue:o.state.ruleForm.Value,"onUpdate:modelValue":l[27]||(l[27]=e=>o.state.ruleForm.Value=e)},null,8,["modelValue"])])),_:1}),(0,t.bF)(i,{label:"禁用",prop:"Disabled"},{default:(0,t.k6)((()=>[(0,t.bF)(h,{modelValue:o.state.ruleForm.Disabled,"onUpdate:modelValue":l[28]||(l[28]=e=>o.state.ruleForm.Disabled=e)},null,8,["modelValue"])])),_:1}),(0,t.bF)(i,{label:"",prop:"Btns"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",Cn,[(0,t.bF)(m,{onClick:l[29]||(l[29]=e=>o.state.show=!1)},{default:(0,t.k6)((()=>[(0,t.eW)("取消")])),_:1}),(0,t.bF)(m,{type:"primary",onClick:o.handleSave,loading:o.state.loading},{default:(0,t.k6)((()=>[(0,t.eW)("确认")])),_:1},8,["onClick","loading"])])])),_:1})])),_:1},8,["model","rules"])])])),_:1},8,["modelValue"])}var yn={props:["data","modelValue"],emits:["change","update:modelValue"],setup(e,{emit:l}){const a=/(\d+|\*)-(\d+|\*)-(\d+|\*)\s+(\d+|\*):(\d+|\*):(\d+|\*)/,n=/(\d+)-(\d+)-(\d+)\s+(\d+):(\d+):(\d+)/,o=/(.+)\s+(.+)\s+(.+)\s+(.+)\s+(.+)\s+(.+)/,r=(0,u.KR)(null),s=(0,t.WQ)("plan");!s.value.current.TriggerHandle&&s.value.triggers.length>0&&(s.value.current.TriggerHandle=s.value.triggers[0].value);const d=(0,u.Kh)({show:!0,loading:!1,ruleCron:{week:"*",month:"*",day:"*",hour:"*",min:"*",sec:"30"},ruleAt:{type:3,month:"*",day:"*",hour:0,min:0,sec:0},ruleTimer:{year:0,month:0,day:0,hour:0,min:0,sec:30},ruleTrigger:{year:0,month:0,day:0,hour:0,min:0,sec:30},ruleForm:{Id:s.value.current.Id,Category:s.value.current.Category,Key:s.value.current.Key,Value:s.value.current.Value,Rule:s.value.current.Rule,Handle:s.value.current.Handle,Method:s.value.current.Method,Disabled:s.value.current.Disabled,TriggerHandle:s.value.current.TriggerHandle},rules:{}});(0,t.wB)((()=>d.show),(e=>{e||setTimeout((()=>{l("update:modelValue",e)}),300)}));const i={2:e=>{if(e=e||"*-*-* 0:0:0",0==a.test(e))return;const[,l,t,n,o,r,s]=e.match(a);"*"==r?d.ruleAt.type=5:"*"==o?d.ruleAt.type=4:"*"==n?d.ruleAt.type=3:"*"==t&&(d.ruleAt.type=2),d.ruleAt.year=l,d.ruleAt.month=t,d.ruleAt.day=n,d.ruleAt.hour=o,d.ruleAt.min=r,d.ruleAt.sec=s},4:e=>{if(e=e||"0-0-0 0:0:30",0==n.test(e))return;const[,l,a,t,o,r,s]=e.match(n);d.ruleTimer.year=l,d.ruleTimer.month=a,d.ruleTimer.day=t,d.ruleTimer.hour=o,d.ruleTimer.min=r,d.ruleTimer.sec=s},8:e=>{if(e=e||"30 * * * * ?",0==o.test(e))return;const[,l,a,t,n,r,s]=e.match(o);d.ruleCron.sec=l,d.ruleCron.min=a,d.ruleCron.hour=t,d.ruleCron.day=n,d.ruleCron.month=r,d.ruleCron.week=s},16:e=>{if(e=e||"0-0-0 0:0:30",0==n.test(e))return;const[,l,a,t,o,r,s]=e.match(n);d.ruleTrigger.year=l,d.ruleTrigger.month=a,d.ruleTrigger.day=t,d.ruleTrigger.hour=o,d.ruleTrigger.min=r,d.ruleTrigger.sec=s}},c=()=>{d.ruleForm.Method in i&&i[d.ruleForm.Method](d.ruleForm.Rule)},h={2:()=>{switch(d.ruleAt.type){case 2:return`*-*-${d.ruleAt.day} ${d.ruleAt.hour}:${d.ruleAt.min}:${d.ruleAt.sec}`;case 3:return`*-*-* ${d.ruleAt.hour}:${d.ruleAt.min}:${d.ruleAt.sec}`;case 4:return`*-*-* *:${d.ruleAt.min}:${d.ruleAt.sec}`;case 5:return`*-*-* *:*:${d.ruleAt.sec}`}return""},4:()=>`${d.ruleTimer.year}-${d.ruleTimer.month}-${d.ruleTimer.day} ${d.ruleTimer.hour}:${d.ruleTimer.min}:${d.ruleTimer.sec}`,8:()=>`${d.ruleCron.sec} ${d.ruleCron.min} ${d.ruleCron.hour} ${d.ruleCron.day} ${d.ruleCron.month} ${d.ruleCron.week}`,16:()=>`${d.ruleTrigger.year}-${d.ruleTrigger.month}-${d.ruleTrigger.day} ${d.ruleTrigger.hour}:${d.ruleTrigger.min}:${d.ruleTrigger.sec}`},m=()=>{d.ruleForm.Method in h&&(d.ruleForm.Rule=h[d.ruleForm.Method]())},p=()=>{m()},g=()=>{const e=JSON.parse(JSON.stringify(d.ruleForm));d.loading=!0,on(s.value.machineid,e).then((e=>{d.loading=!1,d.show=!1})).catch((()=>{d.loading=!1}))};return(0,t.sV)((()=>{c(),p()})),{state:d,ruleFormRef:r,plan:s,handleChange:p,handleSave:g}}};const En=(0,E.A)(yn,[["render",Fn]]);var _n=En,Vn={components:{PlanEdit:_n},props:["machineid","category","handles"],setup(e){const l=(0,u.KR)({machineid:e.machineid,timer:0,list:{},current:{},showEdit:!1,category:e.category||"",handles:e.handles||[],handleJson:(e.handles||[]).reduce(((e,l,a)=>(e[l.value]=l.label,e)),{}),triggers:[],methods:[{label:"手动",value:0},{label:"启动后",value:1},{label:"到点",value:2},{label:"定时",value:4},{label:"Cron",value:8},{label:"触发",value:16}]});(0,t.Gt)("plan",l);const a=()=>{clearTimeout(l.value.timer),nn(l.value.machineid,e.category).then((e=>{l.value.list=e.reduce(((e,l,a)=>(e[`${l.Key}-${l.Handle}`]=l,e)),{}),l.value.timer=setTimeout(a,1e3)})).catch((()=>{l.value.timer=setTimeout(a,1e3)}))},n=(e,t)=>{const n=l.value.list[`${e}-${t}`];n&&rn(l.value.machineid,n.Id).then((()=>{a()}))};return(0,t.sV)((()=>{a()})),(0,t.hi)((()=>{clearTimeout(l.value.timer)})),{plan:l,remove:n}}};const Ln=(0,E.A)(Vn,[["render",an]]);var Pn=Ln;const In={key:0},Tn={key:1};function Mn(e,l,a,o,r,s){return(0,t.uX)(),(0,t.CE)("a",{href:"javascript:;",class:"a-line",onClick:l[0]||(l[0]=(...e)=>o.handleEdit&&o.handleEdit(...e))},[o.item?((0,t.uX)(),(0,t.CE)("span",In,(0,n.v_)(o.rule),1)):((0,t.uX)(),(0,t.CE)("span",Tn,"未设置"))])}var Sn={props:["keyid","handle"],setup(e){const l=/(\d+|\*)-(\d+|\*)-(\d+|\*)\s+(\d+|\*):(\d+|\*):(\d+|\*)/,a=/(\d+)-(\d+)-(\d+)\s+(\d+):(\d+):(\d+)/,n={0:()=>"手动",1:()=>"网络启动后",2:(e,a)=>{if(0==l.test(a))return a;const[,t,n,o,r,s,d]=a.match(l);return"*"==s?`每分钟的${d}秒`:"*"==r?`每小时的${s}分${d}秒`:"*"==o?`每天的${r}时${s}分${d}秒`:"*"==n?`每月的${o}日${r}时${s}分${d}秒`:"*"==t?`每年的${n}月${o}日${r}时${s}分${d}秒`:void 0},4:(e,l)=>{if(0==a.test(l))return l;const[,t,n,o,r,s,d]=l.match(a),u=[];return"0"!=t&&u.push(`${t}年`),"0"!=n&&u.push(`${n}月`),"0"!=o&&u.push(`${o}日`),"0"!=r&&u.push(`${r}时`),"0"!=s&&u.push(`${s}分`),"0"!=d&&u.push(`${d}秒`),`每${u.join("")}`},8:(e,l)=>`Cron : ${l}`,16:(e,l)=>{if(0==a.test(l))return l;const[,t,n,r,s,d,u]=l.match(a),i=[];return"0"!=t&&i.push(`${t}年`),"0"!=n&&i.push(`${n}月`),"0"!=r&&i.push(`${r}日`),"0"!=s&&i.push(`${s}时`),"0"!=d&&i.push(`${d}分`),"0"!=u&&i.push(`${u}秒`),`在【${o.value.handleJson[e.TriggerHandle]}】的${i.join("")}后`}},o=(0,t.WQ)("plan"),r=(0,t.EW)((()=>o.value.list[`${e.keyid}-${e.handle}`])),s=(0,t.EW)((()=>{if(!r.value)return"";const e=r.value.Method;return n[e]?n[e](r.value,r.value.Rule):r.value.Rule})),d=()=>{o.value.current=r.value||{Id:0,Category:o.value.category,Key:`${e.keyid}`,Handle:e.handle,Value:"",Disabled:!1,TriggerHandle:"",Method:2,Rule:""},o.value.triggers=JSON.parse(JSON.stringify(o.value.handles.filter((l=>l.value!=e.handle)))),o.value.showEdit=!0};return{item:r,rule:s,handleEdit:d}}};const Wn=(0,E.A)(Sn,[["render",Mn]]);var An=Wn,Xn={props:["data","modelValue"],emits:["update:modelValue"],components:{WarnTriangleFilled:F.DtC,Delete:F.epd,Select:F.l6P,CloseBold:F.QBJ,PlanList:Pn,PlanShow:An},setup(e,{emit:l}){const a=(0,u.KR)(null),n=(0,d.B)(),o=Lt(),r=(0,u.Kh)({bufferSize:n.value.bufferSize,show:!0,data:[],timer:0,timer1:0,editing:!1,loading:!1,handles:[{label:"开启",value:"start"},{label:"关闭",value:"stop"}]});(0,t.wB)((()=>r.show),(e=>{e||setTimeout((()=>{l("update:modelValue",e)}),300)}));const s=()=>{clearTimeout(r.timer),(0,Et.eX)(o.value.machineid).then((e=>{r.timer=setTimeout(s,1e3)})).catch((()=>{r.timer=setTimeout(s,1e3)}))},c=()=>{clearTimeout(r.timer1),0==r.editing?(0,Et.pY)(o.value.machineid).then((e=>{e.forEach((e=>{e.Temp=(e.Domain||e.RemotePort).toString(),e.RemotePort=0,e.Domain=""})),r.data=e,r.timer1=setTimeout(c,1e3)})).catch((()=>{r.timer1=setTimeout(c,1e3)})):r.timer1=setTimeout(c,1e3)},h=()=>{c()},m=(e,l)=>{w(e,l.property)},p=()=>{c(),i.nk.success("已刷新")},g=()=>{r.loading=!0;const e={Id:0,Name:"",RemotePort:0,LocalEP:"127.0.0.1:80",Domain:"",Temp:""};(0,Et.Qs)({machineid:o.value.machineid,data:e}).then((()=>{r.loading=!1,setTimeout((()=>{c()}),100)})).catch((e=>{r.loading=!1,i.nk.error(e)}))},w=(e,l)=>{e.Started?i.nk.error("请先停止运行"):(r.data.forEach((e=>{e["NameEditing"]=!1,e["RemotePortEditing"]=!1,e["LocalEPEditing"]=!1,e["DomainEditing"]=!1,e["TempEditing"]=!1})),e[`${l}Editing`]=!0,r.editing=!0)},k=(e,l)=>{e.Started?i.nk.error("请先停止运行"):(e[`${l}Editing`]=!1,r.editing=!1,b(e))},v=e=>{a.value.remove(e,"start"),a.value.remove(e,"stop"),(0,Et.DY)({machineid:o.value.machineid,id:e}).then((()=>{r.loading=!1,c()})).catch((e=>{r.loading=!1,i.nk.error(e)}))},f=e=>{r.loading=!0;const l=e.Started?(0,Et.JT)({machineid:o.value.machineid,id:e.Id}):(0,Et.nP)({machineid:o.value.machineid,id:e.Id});l.then((()=>{r.loading=!1,c()})).catch((e=>{r.loading=!1,i.nk.error(e)}))},b=e=>{e.Temp&&(/^\d+$/.test(e.Temp)?e.RemotePort=parseInt(e.Temp):e.Domain=e.Temp,r.loading=!0,(0,Et.Qs)({machineid:o.value.machineid,data:e}).then((e=>{r.loading=!1,0==e&&i.nk.error("操作失败,可能存在相同值"),c()})).catch((e=>{r.loading=!1,i.nk.error(e)})))};return(0,t.sV)((()=>{c(),s()})),(0,t.hi)((()=>{clearTimeout(r.timer),clearTimeout(r.timer1)})),{state:r,planDom:a,machineName:o.value.machineName,machineId:o.value.machineid,handleOnShowList:h,handleCellClick:m,handleRefresh:p,handleAdd:g,handleEdit:w,handleEditBlur:k,handleDel:v,handleStartChange:f}}};const Rn=(0,E.A)(Xn,[["render",ln],["__scopeId","data-v-010bdab6"]]);var xn=Rn;const Nn=e=>((0,t.Qi)("data-v-ac6bb914"),e=e(),(0,t.jt)(),e),Bn=Nn((()=>(0,t.Lk)("span",null,"中继 : ",-1))),Un={key:0,href:"javascript:;",class:"a-line"},$n=Nn((()=>(0,t.Lk)("span",null,"操作中.",-1))),Dn=["onClick"],zn=Nn((()=>(0,t.Lk)("span",null,"打洞 : ",-1))),On={key:0,href:"javascript:;",class:"a-line"},Qn=Nn((()=>(0,t.Lk)("span",null,"操作中.",-1))),jn=["onClick"],Kn=["href"],Gn={href:"javascript:;",class:"a-line"},qn={key:0},Hn={key:1},Jn={key:0},Zn={key:1},Yn={key:0},eo={key:1},lo=Nn((()=>(0,t.Lk)("span",null,"/",-1))),ao={key:0},to={key:1},no={class:"dropdown"};function oo(e,l,a,o,r,s){const d=(0,t.g2)("el-table-column"),u=(0,t.g2)("Loading"),i=(0,t.g2)("el-icon"),c=(0,t.g2)("Delete"),h=(0,t.g2)("el-button"),m=(0,t.g2)("el-popconfirm"),p=(0,t.g2)("el-table"),g=(0,t.g2)("el-dialog"),w=(0,t.g2)("el-switch"),k=(0,t.g2)("ArrowDown"),v=(0,t.g2)("el-dropdown-item"),f=(0,t.g2)("el-dropdown-menu"),b=(0,t.g2)("el-dropdown");return(0,t.uX)(),(0,t.CE)(t.FK,null,[(0,t.bF)(g,{modelValue:o.state.show,"onUpdate:modelValue":l[0]||(l[0]=e=>o.state.show=e),"append-to":".app-wrap",title:`与[${o.state.machineName}]的链接`,top:"1vh",width:"780"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",null,[(0,t.bF)(p,{data:o.state.data,size:"small",border:"",height:"500"},{default:(0,t.k6)((()=>[(0,t.bF)(d,{property:"RemoteMachineId",label:"目标/服务器"},{default:(0,t.k6)((e=>[(0,t.Lk)("div",{class:(0,n.C4)({green:e.row.Connected})},[(0,t.Lk)("p",null,(0,n.v_)(e.row.IPEndPoint),1),(0,t.Lk)("p",null,"ssl : "+(0,n.v_)(e.row.SSL),1)],2)])),_:1}),(0,t.bF)(d,{property:"TransactionId",label:"事务",width:"80"},{default:(0,t.k6)((e=>[(0,t.Lk)("span",null,(0,n.v_)(o.state.transactions[e.row.TransactionId]),1)])),_:1}),(0,t.bF)(d,{property:"TransportName",label:"协议",width:"120"},{default:(0,t.k6)((e=>[(0,t.Lk)("div",null,[(0,t.Lk)("p",null,(0,n.v_)(e.row.TransportName)+"("+(0,n.v_)(o.state.protocolTypes[e.row.ProtocolType])+")",1),(0,t.Lk)("p",null,(0,n.v_)(o.state.types[e.row.Type])+" - "+(0,n.v_)(1<[(0,t.Lk)("span",null,(0,n.v_)(e.row.Delay)+"ms",1)])),_:1}),(0,t.bF)(d,{property:"Bytes",label:"通信"},{default:(0,t.k6)((e=>[(0,t.Lk)("div",null,[(0,t.Lk)("p",null,"up : "+(0,n.v_)(e.row.SendBytesText),1),(0,t.Lk)("p",null,"down : "+(0,n.v_)(e.row.ReceiveBytesText),1)])])),_:1}),(0,t.bF)(d,{property:"relay",label:"中继节点"},{default:(0,t.k6)((e=>[(0,t.Lk)("div",null,[(0,t.Lk)("p",null,[Bn,o.state.relayOperatings[e.row.RemoteMachineId]?((0,t.uX)(),(0,t.CE)("a",Un,[$n,(0,t.bF)(i,{size:"14",class:"loading"},{default:(0,t.k6)((()=>[(0,t.bF)(u)])),_:1})])):((0,t.uX)(),(0,t.CE)("a",{key:1,href:"javascript:;",class:"a-line",onClick:l=>o.handleNode(e.row)},(0,n.v_)(o.state.nodesDic[e.row.NodeId]||"选择节点"),9,Dn))]),(0,t.Lk)("p",null,[zn,o.state.p2pOperatings[e.row.RemoteMachineId]?((0,t.uX)(),(0,t.CE)("a",On,[Qn,(0,t.bF)(i,{size:"14",class:"loading"},{default:(0,t.k6)((()=>[(0,t.bF)(u)])),_:1})])):((0,t.uX)(),(0,t.CE)("a",{key:1,href:"javascript:;",class:"a-line",onClick:l=>o.handlep2p(e.row)},"尝试打洞",8,jn))])])])),_:1}),(0,t.bF)(d,{label:"操作",width:"54"},{default:(0,t.k6)((e=>[(0,t.Lk)("div",null,[o.hasTunnelRemove?((0,t.uX)(),(0,t.Wv)(m,{key:0,"confirm-button-text":"确认","cancel-button-text":"取消",title:"确定关闭此连接?",onConfirm:l=>o.handleDel(e.row)},{reference:(0,t.k6)((()=>[(0,t.bF)(h,{type:"danger",size:"small"},{default:(0,t.k6)((()=>[(0,t.bF)(i,null,{default:(0,t.k6)((()=>[(0,t.bF)(c)])),_:1})])),_:1})])),_:2},1032,["onConfirm"])):(0,t.Q3)("",!0)])])),_:1})])),_:1},8,["data"])])])),_:1},8,["modelValue","title"]),(0,t.bF)(g,{modelValue:o.state.showNodes,"onUpdate:modelValue":l[1]||(l[1]=e=>o.state.showNodes=e),title:e.$t("server.relayTitle"),width:"760",top:"2vh"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",null,[(0,t.bF)(p,{data:o.state.nodes,size:"small",border:"",height:"600"},{default:(0,t.k6)((()=>[(0,t.bF)(d,{property:"Name",label:e.$t("server.relayName")},{default:(0,t.k6)((e=>[(0,t.Lk)("div",null,[(0,t.Lk)("a",{href:e.row.Url,class:"a-line blue",target:"_blank"},(0,n.v_)(e.row.Name),9,Kn),(0,t.Lk)("a",Gn,[1==(1&e.row.AllowProtocol)?((0,t.uX)(),(0,t.CE)("span",qn,",tcp")):(0,t.Q3)("",!0),2==(2&e.row.AllowProtocol)?((0,t.uX)(),(0,t.CE)("span",Hn,",udp")):(0,t.Q3)("",!0)])])])),_:1},8,["label"]),(0,t.bF)(d,{property:"MaxGbTotal",label:e.$t("server.relayFlow"),width:"140"},{default:(0,t.k6)((e=>[0==e.row.MaxGbTotal?((0,t.uX)(),(0,t.CE)("span",Jn,"--")):((0,t.uX)(),(0,t.CE)("span",Zn,(0,n.v_)((e.row.MaxGbTotalLastBytes/1024/1024/1024).toFixed(2))+"GB / "+(0,n.v_)(e.row.MaxGbTotal)+"GB ",1))])),_:1},8,["label"]),(0,t.bF)(d,{property:"MaxBandwidth",label:e.$t("server.relaySpeed"),width:"80"},{default:(0,t.k6)((e=>[0==e.row.MaxBandwidth?((0,t.uX)(),(0,t.CE)("span",Yn,"--")):((0,t.uX)(),(0,t.CE)("span",eo,(0,n.v_)(e.row.MaxBandwidth)+"Mbps",1))])),_:1},8,["label"]),(0,t.bF)(d,{property:"MaxBandwidthTotal",label:`${e.$t("server.relaySpeed2")}/${e.$t("server.relaySpeed1")}`,width:"120"},{default:(0,t.k6)((e=>[(0,t.Lk)("span",null,[(0,t.Lk)("span",null,(0,n.v_)(e.row.BandwidthRatio)+"Mbps",1),lo,0==e.row.MaxBandwidthTotal?((0,t.uX)(),(0,t.CE)("span",ao,"--")):((0,t.uX)(),(0,t.CE)("span",to,(0,n.v_)(e.row.MaxBandwidthTotal)+"Mbps",1))])])),_:1},8,["label"]),(0,t.bF)(d,{property:"ConnectionRatio",label:e.$t("server.relayConnection"),width:"80"},{default:(0,t.k6)((e=>[(0,t.Lk)("span",null,[(0,t.Lk)("strong",null,(0,n.v_)(e.row.ConnectionRatio),1),(0,t.eW)("/"+(0,n.v_)(e.row.MaxConnection),1)])])),_:1},8,["label"]),(0,t.bF)(d,{property:"Delay",label:e.$t("server.relayDelay"),width:"60"},{default:(0,t.k6)((e=>[(0,t.Lk)("span",null,(0,n.v_)(e.row.Delay)+"ms",1)])),_:1},8,["label"]),(0,t.bF)(d,{property:"Public",label:e.$t("server.relayPublic"),width:"50"},{default:(0,t.k6)((e=>[(0,t.bF)(w,{disabled:"",modelValue:e.row.Public,"onUpdate:modelValue":l=>e.row.Public=l,size:"small"},null,8,["modelValue","onUpdate:modelValue"])])),_:1},8,["label"]),(0,t.bF)(d,{property:"Oper",label:e.$t("server.relayOper"),width:"75"},{default:(0,t.k6)((l=>[(0,t.bF)(b,{size:"small"},{dropdown:(0,t.k6)((()=>[(0,t.bF)(f,null,{default:(0,t.k6)((()=>[1==(1&l.row.AllowProtocol)?((0,t.uX)(),(0,t.Wv)(v,{key:0,onClick:e=>o.handleConnect(l.row.Id,1)},{default:(0,t.k6)((()=>[(0,t.eW)((0,n.v_)(e.$t("common.relay"))+"TCP",1)])),_:2},1032,["onClick"])):(0,t.Q3)("",!0),2==(2&l.row.AllowProtocol)?((0,t.uX)(),(0,t.Wv)(v,{key:1,onClick:e=>o.handleConnect(l.row.Id,2)},{default:(0,t.k6)((()=>[(0,t.eW)((0,n.v_)(e.$t("common.relay"))+"UDP",1)])),_:2},1032,["onClick"])):(0,t.Q3)("",!0)])),_:2},1024)])),default:(0,t.k6)((()=>[(0,t.Lk)("div",no,[(0,t.Lk)("span",null,(0,n.v_)(e.$t("server.relayUse")),1),(0,t.bF)(i,{class:"el-icon--right"},{default:(0,t.k6)((()=>[(0,t.bF)(k)])),_:1})])])),_:2},1024)])),_:1},8,["label"])])),_:1},8,["data"])])])),_:1},8,["modelValue","title"])],64)}var ro=a(9232),so=a(5931),uo={props:["modelValue"],emits:["change","update:modelValue"],components:{Delete:F.epd,Select:F.l6P,ArrowDown:F.yd$,Loading:F.Rhj},setup(e,{emit:l}){const{t:a}=(0,so.s9)(),n=(0,d.B)(),o=(0,t.EW)((()=>n.value.hasAccess("TunnelRemove"))),r=(0,ma.ZY)(),s=(0,ma.mx)(),c=(0,ma.FG)(),h=(0,ma.bB)(),m=(0,et.e)(),p=(0,u.Kh)({show:!0,protocolTypes:{1:"tcp",2:"udp",4:"msquic"},types:{0:"打洞",1:"中继",2:"节点"},transactions:{forward:"端口转发",tuntap:"虚拟网卡",socks5:"代理转发"},machineName:r.value.currentName,currentRow:{},data:(0,t.EW)((()=>[s.value.list[r.value.current],c.value.list[r.value.current],h.value.list[r.value.current]].filter((e=>!!e)))),showNodes:!1,nodes:[],nodesDic:{},timer:0,relayOperatings:m.value.relayOperatings,p2pOperatings:m.value.p2pOperatings});(0,t.wB)((()=>p.show),(e=>{e||setTimeout((()=>{l("update:modelValue",e),l("change")}),300)}));const g=e=>{o.value&&e.removeFunc(e.RemoteMachineId).then((()=>{i.nk.success(a("common.oper"))})).catch((()=>{}))},w=()=>{clearTimeout(p.timer),(0,ro.W4)().then((e=>{p.nodes=e,p.nodesDic=e.reduce(((e,l)=>(e[l.Id]=l.Name,e)),{}),p.timer=setTimeout(w,1e3)})).catch((()=>{p.timer=setTimeout(w,1e3)}))},k=e=>{(0,ct.xN)({ToMachineId:e.RemoteMachineId,TransactionId:e.TransactionId,DenyProtocols:"tuntap"==e.TransactionId?4:2}).then((()=>{i.nk.success(a("common.oper"))})).catch((()=>{i.nk.success(a("common.operFail"))}))},v=e=>{p.currentRow=e,p.showNodes=!0},f=(e,l)=>{const t={FromMachineId:n.value.config.Client.Id,TransactionId:p.currentRow.TransactionId,ToMachineId:p.currentRow.RemoteMachineId,NodeId:e,Protocol:l};(0,ro.uQ)(t).then((()=>{i.nk.success(a("common.oper"))})).catch((()=>{i.nk.success(a("common.operFail"))})),p.showNodes=!1};return(0,t.sV)((()=>{r.value.updateRealTime(!0),w()})),(0,t.hi)((()=>{r.value.updateRealTime(!1),clearTimeout(p.timer)})),{state:p,handleDel:g,hasTunnelRemove:o,handlep2p:k,handleNode:v,handleConnect:f}}};const io=(0,E.A)(uo,[["render",oo],["__scopeId","data-v-ac6bb914"]]);var co=io,ho=a(9383);const mo={class:"updater-wrap t-c"},po={class:"t-l"},go={class:"flex mgt-1"},wo={class:"mgt-1 t-c"};function ko(e,l,a,o,r,s){const d=(0,t.g2)("el-option"),u=(0,t.g2)("el-select"),i=(0,t.g2)("el-col"),c=(0,t.g2)("el-row"),h=(0,t.g2)("el-button"),m=(0,t.g2)("el-dialog");return(0,t.uX)(),(0,t.Wv)(m,{class:"options-center",title:"更新","destroy-on-close":"",modelValue:o.state.show,"onUpdate:modelValue":l[2]||(l[2]=e=>o.state.show=e),width:"40rem",top:"2vh"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",mo,[(0,t.Lk)("div",po,[(0,t.Lk)("ul",null,[((0,t.uX)(!0),(0,t.CE)(t.FK,null,(0,t.pI)(o.state.msg,(e=>((0,t.uX)(),(0,t.CE)("li",null,(0,n.v_)(e),1)))),256))])]),(0,t.Lk)("div",go,[(0,t.bF)(c,{class:"w-100"},{default:(0,t.k6)((()=>[(0,t.bF)(i,{span:10},{default:(0,t.k6)((()=>[(0,t.bF)(u,{modelValue:o.state.type,"onUpdate:modelValue":l[0]||(l[0]=e=>o.state.type=e),size:"large"},{default:(0,t.k6)((()=>[((0,t.uX)(!0),(0,t.CE)(t.FK,null,(0,t.pI)(o.state.types,(e=>((0,t.uX)(),(0,t.Wv)(d,{key:e.value,label:e.label,value:e.value},null,8,["label","value"])))),128))])),_:1},8,["modelValue"])])),_:1}),(0,t.bF)(i,{span:4},{default:(0,t.k6)((()=>[(0,t.eW)(" -> ")])),_:1}),(0,t.bF)(i,{span:10},{default:(0,t.k6)((()=>[(0,t.bF)(u,{modelValue:o.state.version,"onUpdate:modelValue":l[1]||(l[1]=e=>o.state.version=e),size:"large",filterable:"","allow-create":"","default-first-option":""},{default:(0,t.k6)((()=>[((0,t.uX)(!0),(0,t.CE)(t.FK,null,(0,t.pI)(o.state.versions,(e=>((0,t.uX)(),(0,t.Wv)(d,{key:e.value,label:e.label,value:e.value},null,8,["label","value"])))),128))])),_:1},8,["modelValue"])])),_:1})])),_:1})]),(0,t.Lk)("div",wo,[(0,t.bF)(h,{type:"success",onClick:o.handleUpdate,plain:""},{default:(0,t.k6)((()=>[(0,t.eW)("确 定")])),_:1},8,["onClick"])])])])),_:1},8,["modelValue"])}var vo={props:["modelValue"],emits:["update:modelValue"],setup(e,{emit:l}){const a=(0,d.B)(),n=((0,t.EW)((()=>a.value.hasAccess("UpdateSelf"))),(0,t.EW)((()=>a.value.hasAccess("UpdateOther")))),o=(0,ho.T)(),r=(0,t.EW)((()=>a.value.signin.Version)),s=(0,t.EW)((()=>o.value.current.Version)),i=[{label:`仅【${o.value.device.MachineName}】`,value:o.value.device.MachineId},n.value?{label:"本组所有",value:"g-all"}:{},n.value?{label:"本服务器所有",value:"s-all"}:{}].filter((e=>e.value)),c=[{label:`${s.value}【最新版本】`,value:s.value},{label:`${r.value}【服务器版本】`,value:r.value}].filter((e=>e.value)),h=(0,u.Kh)({show:!0,type:i[0]||"",version:c[0]||"",types:i,versions:c,msg:[]});(0,t.wB)((()=>h.show),(e=>{e||setTimeout((()=>{l("update:modelValue",e)}),300)}));const m=()=>{const e={MachineId:o.value.device.MachineId,Version:h.version.value||h.version,GroupAll:"g-all"==h.type,All:"s-all"==h.type};(e.All||e.GroupAll)&&(e.MachineId=""),(0,S.lJ)(e).then((()=>{})).catch((()=>{})),h.show=!1};return(0,t.sV)((()=>{(0,S.rL)().then((e=>{h.msg=e.Msg}))})),{state:h,updater:o,handleUpdate:m}}};const fo=(0,E.A)(vo,[["render",ko]]);var bo=fo;function Co(e,l,a,o,r,s){const d=(0,t.g2)("el-table-column"),u=(0,t.g2)("el-table"),i=(0,t.g2)("el-dialog");return(0,t.uX)(),(0,t.Wv)(i,{title:`${o.flow.device.name}->${e.$t("status.messengerName")}`,class:"options-center",top:"1vh","destroy-on-close":"",modelValue:o.state.show,"onUpdate:modelValue":l[0]||(l[0]=e=>o.state.show=e),width:"480"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",null,[(0,t.bF)(u,{data:o.state.list,stripe:"",border:"",size:"small",width:"100%",height:"60vh"},{default:(0,t.k6)((()=>[(0,t.bF)(d,{prop:"id",label:"id",width:"200"}),(0,t.bF)(d,{prop:"request",label:"request",sortable:""},{default:(0,t.k6)((e=>[(0,t.Lk)("span",null,(0,n.v_)(e.row.request)+"ms / "+(0,n.v_)(e.row.requestMax)+"ms",1)])),_:1}),(0,t.bF)(d,{prop:"response",label:"response",sortable:""},{default:(0,t.k6)((e=>[(0,t.Lk)("span",null,(0,n.v_)(e.row.response)+"ms / "+(0,n.v_)(e.row.responseMax)+"ms",1)])),_:1})])),_:1},8,["data"])])])),_:1},8,["title","modelValue"])}var Fo=a(4921),yo={props:["modelValue"],emits:["update:modelValue"],setup(e,{emit:l}){const{t:a}=(0,so.s9)(),n=N(),o=(0,u.Kh)({show:!0,timer:0,list:[]});(0,t.wB)((()=>o.show),(e=>{e||setTimeout((()=>{l("update:modelValue",e)}),300)}));const r=()=>{clearTimeout(o.timer),(0,Fo.iN)(n.value.device.id).then((e=>{o.list=Object.keys(e).map((l=>({id:`${a(`status.messenger${l}`)}(${l})`,request:(BigInt(e[l].SendtBytes)&BigInt(4294967295)).toString(),requestMax:(BigInt(e[l].SendtBytes)>>BigInt(32)).toString(),response:(BigInt(e[l].ReceiveBytes)&BigInt(4294967295)).toString(),responseMax:(BigInt(e[l].ReceiveBytes)>>BigInt(32)).toString()}))),o.timer=setTimeout(r,3e3)})).catch((e=>{o.timer=setTimeout(r,3e3)}))};return(0,t.sV)((()=>{r()})),(0,t.hi)((()=>{clearTimeout(o.timer)})),{state:o,flow:n}}};const Eo=(0,E.A)(yo,[["render",Co]]);var _o=Eo,Vo={components:{Sort:V,Oper:$,Device:ae,DeviceEdit:de,AccessEdit:pe,Tunnel:tt,TunnelEdit:pt,ConnectionsEdit:co,Tuntap:be,TuntapEdit:_l,TuntapLease:jl,TuntapRoutes:Hl,TuntapFirewall:la,Socks5:ba,Socks5Edit:ja,Forward:Tt,ForwardEdit:Kt,SForwardEdit:xn,UpdaterConfirm:bo,Stopwatch:_o},setup(e){const l=(0,d.B)(),a=(0,u.Kh)({height:(0,t.EW)((()=>l.value.height-90))}),{devices:n,machineId:o,_getSignList:r,_getSignList1:s,handleDeviceEdit:c,handleAccessEdit:h,handlePageChange:m,handlePageSizeChange:p,handleDel:w,clearDevicesTimeout:k,setSort:v}=(0,ue.r)(),{tuntap:b,_getTuntapInfo:F,handleTuntapEdit:y,handleTuntapRefresh:E,clearTuntapTimeout:_,getTuntapMachines:V,sortTuntapIP:L}=(0,C.O)(),{socks5:P,_getSocks5Info:I,handleSocks5Edit:T,handleSocks5Refresh:M,clearSocks5Timeout:S,getSocks5Machines:W,sortSocks5:X}=f(),{tunnel:R,_getTunnelInfo:N,getTunnelOperating:B,getRelayOperating:U,handleTunnelEdit:$,handleTunnelRefresh:D,clearTunnelTimeout:z,sortTunnel:O}=(0,et.y)(),{forward:Q,_getForwardCountInfo:j,handleForwardEdit:K,clearForwardTimeout:G,handleForwardRefresh:q}=g(),{sforward:H,_getSForwardCountInfo:J,handleSForwardEdit:Z,clearSForwardTimeout:Y,handleSForwardRefresh:ee}=Vt(),{connections:le,forwardConnections:ae,_getForwardConnections:te,tuntapConnections:ne,_getTuntapConnections:oe,socks5Connections:re,_getSocks5Connections:se,handleTunnelConnections:de,clearConnectionsTimeout:ie}=(0,ma.L2)(),{updater:ce,_getUpdater:he,_subscribeUpdater:me,clearUpdaterTimeout:pe}=(0,ho.d)(),{flow:ge}=x(),{_getAccessInfo:we,clearAccessTimeout:ke,handleAccesssRefresh:ve}=(0,A.Y)(),fe=e=>{n.page.Request.Prop=e.prop,n.page.Request.Asc="ascending"==e.order;let l=new Promise(((e,l)=>{e()}));if("tunnel"==e.prop){const e=O(n.page.Request.Asc);e.length>0&&(l=v(e))}else if("tuntap"==e.prop){const e=L(n.page.Request.Asc);e.length>0&&(l=v(e))}else if("socks5"==e.prop){const e=X(n.page.Request.Asc);e.length>0&&(l=v(e))}l.then((()=>{m()})).catch((()=>{}))},be=e=>{n.page.Request.Name=e||"",n.page.Request.Name?n.page.Request.Ids=V(n.page.Request.Name).concat(W(n.page.Request.Name)).reduce(((e,l)=>(-1==e.indexOf(l)&&e.push(l),e)),[]):n.page.Request.Ids=[],m(),D(),E(),M(),q(),ee(),ve(),i.nk.success({message:"刷新成功",grouping:!0})},Ce=()=>{m(),D(),E(),M(),ve(),i.nk.success({message:"刷新成功",grouping:!0})};return(0,t.sV)((()=>{m(),D(),E(),M(),q(),ee(),ve(),r(),s(),F(),I(),N(),B(),U(),te(),oe(),se(),j(),J(),he(),me(),we()})),(0,t.hi)((()=>{k(),ie(),_(),S(),z(),G(),Y(),pe(),ke()})),{state:a,globalData:l,devices:n,machineId:o,handleSortChange:fe,handleDeviceEdit:c,handleAccessEdit:h,handlePageRefresh:be,handlePageSearch:Ce,handlePageChange:m,handlePageSizeChange:p,handleDel:w,tuntap:b,handleTuntapEdit:y,handleTuntapRefresh:E,socks5:P,handleSocks5Edit:T,handleSocks5Refresh:M,tunnel:R,connections:le,handleTunnelEdit:$,handleTunnelRefresh:D,handleTunnelConnections:de,forward:Q,handleForwardEdit:K,sforward:H,handleSForwardEdit:Z,updater:ce,flow:ge}}};const Lo=(0,E.A)(Vo,[["render",s],["__scopeId","data-v-b24cdae4"]]);var Po=Lo}}]);
\ No newline at end of file
diff --git a/src/linker.tray.win/web/js/991.c247ee5e.js b/src/linker.tray.win/web/js/372.b76e2e4d.js
similarity index 99%
rename from src/linker.tray.win/web/js/991.c247ee5e.js
rename to src/linker.tray.win/web/js/372.b76e2e4d.js
index a49a5fd8..f721f8b2 100644
--- a/src/linker.tray.win/web/js/991.c247ee5e.js
+++ b/src/linker.tray.win/web/js/372.b76e2e4d.js
@@ -1 +1 @@
-"use strict";(self["webpackChunklinker_web"]=self["webpackChunklinker_web"]||[]).push([[991],{8372:function(e,l,a){a.r(l),a.d(l,{default:function(){return $}});var t=a(6768),o=a(4232);const n=e=>((0,t.Qi)("data-v-63810b88"),e=e(),(0,t.jt)(),e),r={class:"logger-setting-wrap flex flex-column h-100",ref:"wrap"},g={class:"inner"},s={class:"head flex"},i=n((()=>(0,t.Lk)("span",{class:"flex-1"},null,-1))),d={class:"body flex-1 relative"},u={class:"pages t-c"},b={class:"page-wrap"};function c(e,l,a,n,c,p){const m=(0,t.g2)("el-option"),f=(0,t.g2)("el-select"),h=(0,t.g2)("el-button"),k=(0,t.g2)("el-table-column"),v=(0,t.g2)("el-table"),w=(0,t.g2)("el-pagination"),y=(0,t.g2)("el-tab-pane"),F=(0,t.g2)("Setting"),L=(0,t.g2)("el-tabs");return(0,t.uX)(),(0,t.CE)("div",r,[(0,t.bF)(L,{type:"border-card",class:"w-100"},{default:(0,t.k6)((()=>[n.hasLogger?((0,t.uX)(),(0,t.Wv)(y,{key:0,label:e.$t("logger.list")},{default:(0,t.k6)((()=>[(0,t.Lk)("div",g,[(0,t.Lk)("div",s,[(0,t.Lk)("div",null,[(0,t.bF)(f,{modelValue:n.state.type,"onUpdate:modelValue":l[0]||(l[0]=e=>n.state.type=e),onChange:n.loadData,size:"small",class:"mgr-1",style:{width:"6rem"}},{default:(0,t.k6)((()=>[(0,t.bF)(m,{value:-1,label:"all"}),(0,t.bF)(m,{value:0,label:"debug"}),(0,t.bF)(m,{value:1,label:"info"}),(0,t.bF)(m,{value:2,label:"warning"}),(0,t.bF)(m,{value:3,label:"error"}),(0,t.bF)(m,{value:4,label:"fatal"})])),_:1},8,["modelValue","onChange"])]),(0,t.bF)(h,{type:"warning",size:"small",loading:n.state.loading,onClick:n.clearData},{default:(0,t.k6)((()=>[(0,t.eW)((0,o.v_)(e.$t("logger.clear")),1)])),_:1},8,["loading","onClick"]),(0,t.bF)(h,{size:"small",loading:n.state.loading,onClick:n.loadData},{default:(0,t.k6)((()=>[(0,t.eW)((0,o.v_)(e.$t("logger.refresh")),1)])),_:1},8,["loading","onClick"]),i]),(0,t.Lk)("div",d,[(0,t.bF)(v,{stripe:"",border:"",data:n.state.page.List,size:"small",height:`${n.state.height}px`,width:"100%",onRowClick:n.handleRowClick,"row-class-name":n.tableRowClassName},{default:(0,t.k6)((()=>[(0,t.bF)(k,{type:"index",width:"50"}),(0,t.bF)(k,{prop:"Type",label:e.$t("logger.level"),width:"80"},{default:(0,t.k6)((e=>[(0,t.Lk)("span",null,(0,o.v_)(n.state.types[e.row.Type]),1)])),_:1},8,["label"]),(0,t.bF)(k,{prop:"Time",label:e.$t("logger.time"),width:"160"},null,8,["label"]),(0,t.bF)(k,{prop:"content",label:e.$t("logger.content")},null,8,["label"])])),_:1},8,["data","height","onRowClick","row-class-name"])]),(0,t.Lk)("div",u,[(0,t.Lk)("div",b,[(0,t.bF)(w,{small:"",total:n.state.page.Count,currentPage:n.state.page.Page,"onUpdate:currentPage":l[1]||(l[1]=e=>n.state.page.Page=e),"page-size":n.state.page.Size,"pager-count":n.globalData.isPc?7:3,layout:n.globalData.isPc?"total,prev, pager, next":"prev, pager, next",onCurrentChange:n.handlePageChange,background:""},null,8,["total","currentPage","page-size","pager-count","layout","onCurrentChange"])])])])])),_:1},8,["label"])):(0,t.Q3)("",!0),n.hasLoggerLevel?((0,t.uX)(),(0,t.Wv)(y,{key:1,label:e.$t("common.setting")},{default:(0,t.k6)((()=>[(0,t.bF)(F)])),_:1},8,["label"])):(0,t.Q3)("",!0)])),_:1})],512)}var p=a(144),m=a(4);const f=e=>(0,m.zG)("logger/get",e),h=()=>(0,m.zG)("logger/clear"),k=()=>(0,m.zG)("logger/getconfig"),v=e=>(0,m.zG)("logger/setconfig",e),w={class:"t-c w-100"};function y(e,l,a,n,r,g){const s=(0,t.g2)("el-input"),i=(0,t.g2)("el-form-item"),d=(0,t.g2)("el-col"),u=(0,t.g2)("el-option"),b=(0,t.g2)("el-select"),c=(0,t.g2)("el-row"),p=(0,t.g2)("el-button"),m=(0,t.g2)("el-form");return(0,t.uX)(),(0,t.Wv)(m,{"label-width":"8rem",ref:"formDom",model:n.state.form,rules:n.state.rules},{default:(0,t.k6)((()=>[(0,t.bF)(i,{label:"","label-width":"0"},{default:(0,t.k6)((()=>[(0,t.bF)(c,null,{default:(0,t.k6)((()=>[(0,t.bF)(d,{xs:24,sm:8,md:8,lg:8,xl:8},{default:(0,t.k6)((()=>[(0,t.bF)(i,{label:e.$t("logger.count"),prop:"Size"},{default:(0,t.k6)((()=>[(0,t.bF)(s,{size:"default",modelValue:n.state.form.Size,"onUpdate:modelValue":l[0]||(l[0]=e=>n.state.form.Size=e)},null,8,["modelValue"])])),_:1},8,["label"])])),_:1}),(0,t.bF)(d,{xs:24,sm:8,md:8,lg:8,xl:8},{default:(0,t.k6)((()=>[(0,t.bF)(i,{label:e.$t("logger.level"),prop:"LoggerType"},{default:(0,t.k6)((()=>[(0,t.bF)(b,{modelValue:n.state.form.LoggerType,"onUpdate:modelValue":l[1]||(l[1]=e=>n.state.form.LoggerType=e)},{default:(0,t.k6)((()=>[(0,t.bF)(u,{value:0,label:"debug"}),(0,t.bF)(u,{value:1,label:"info"}),(0,t.bF)(u,{value:2,label:"warning"}),(0,t.bF)(u,{value:3,label:"error"}),(0,t.bF)(u,{value:4,label:"fatal"})])),_:1},8,["modelValue"])])),_:1},8,["label"])])),_:1})])),_:1})])),_:1}),(0,t.bF)(i,{"label-width":"0"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",w,[(0,t.bF)(p,{type:"primary",loading:n.state.loading,onClick:n.submit},{default:(0,t.k6)((()=>[(0,t.eW)((0,o.v_)(e.$t("common.confirm")),1)])),_:1},8,["loading","onClick"])])])),_:1})])),_:1},8,["model","rules"])}var F=a(1219),L={setup(){const e=(0,p.KR)(null),l=(0,p.Kh)({loading:!1,configInfo:{},form:{Size:0,LoggerType:-1},rules:{Size:[{required:!0,message:"必填",trigger:"blur"},{type:"number",min:1,max:1e4,message:"数字 1-10000",trigger:"blur",transform(e){return Number(e)}}]}}),a=()=>{k().then((e=>{l.configInfo=e,l.form.Size=e.Size,l.form.LoggerType=e.LoggerType})).catch((e=>{}))},o=()=>{let e=JSON.parse(JSON.stringify(l.configInfo));return e.Size=+l.form.Size,e.LoggerType=+l.form.LoggerType,e},n=()=>new Promise(((a,t)=>{e.value.validate((e=>{if(0==e)return t(),!1;l.loading=!0;const n=o();v(n).then((e=>{l.loading=!1,a(),e?F.nk.success("操作成功!"):F.nk.error("操作失败!")})).catch((e=>{console.log(e),l.loading=!1,a()}))}))}));return(0,t.sV)((()=>{a()})),{state:l,formDom:e,submit:n}}},_=a(1241);const C=(0,_.A)(L,[["render",y],["__scopeId","data-v-23dfe420"]]);var z=C,x=a(2933),S=a(3830),P={components:{Setting:z},setup(){const e=(0,S.B)(),l=(0,p.EW)((()=>e.value.hasAccess("LoggerShow"))),a=(0,p.EW)((()=>e.value.hasAccess("LoggerLevel"))),o=(0,p.KR)(null),n=(0,p.Kh)({loading:!0,type:-1,page:{Page:1,Size:20,Count:0,List:[]},types:["debug","info","warning","error","fatal"],height:(0,p.EW)((()=>e.value.height-180))}),r=()=>{n.loading=!0,f({Page:n.page.Page,Size:n.page.Size,Type:n.type}).then((e=>{n.loading=!1,e.List.map((e=>{e.content=e.Content.substring(0,50)})),n.page=e})).catch((e=>{console.log(e),n.loading=!1}))},g=e=>{e&&(n.page.Page=e,r())},s=()=>{n.loading=!0,h().then((()=>{n.loading=!1,r()})).catch((()=>{n.loading=!1}))},i=({row:e,rowIndex:l})=>`type-${e.Type}`,d=(e,l,a)=>{let t="padding:1rem;border:1px solid #ddd; resize:none;width:30rem;box-sizing: border-box;white-space: nowrap; height:30rem;";x.s.alert(``,"",{dangerouslyUseHTMLString:!0}).catch((()=>{}))};return(0,t.sV)((()=>{r()})),{globalData:e,hasLogger:l,hasLoggerLevel:a,wrap:o,state:n,loadData:r,clearData:s,tableRowClassName:i,handleRowClick:d,handlePageChange:g}}};const T=(0,_.A)(P,[["render",c],["__scopeId","data-v-63810b88"]]);var $=T}}]);
\ No newline at end of file
+"use strict";(self["webpackChunklinker_web"]=self["webpackChunklinker_web"]||[]).push([[372],{8372:function(e,l,a){a.r(l),a.d(l,{default:function(){return $}});var t=a(6768),o=a(4232);const n=e=>((0,t.Qi)("data-v-63810b88"),e=e(),(0,t.jt)(),e),r={class:"logger-setting-wrap flex flex-column h-100",ref:"wrap"},g={class:"inner"},s={class:"head flex"},i=n((()=>(0,t.Lk)("span",{class:"flex-1"},null,-1))),d={class:"body flex-1 relative"},u={class:"pages t-c"},b={class:"page-wrap"};function c(e,l,a,n,c,p){const m=(0,t.g2)("el-option"),f=(0,t.g2)("el-select"),h=(0,t.g2)("el-button"),k=(0,t.g2)("el-table-column"),v=(0,t.g2)("el-table"),w=(0,t.g2)("el-pagination"),y=(0,t.g2)("el-tab-pane"),F=(0,t.g2)("Setting"),L=(0,t.g2)("el-tabs");return(0,t.uX)(),(0,t.CE)("div",r,[(0,t.bF)(L,{type:"border-card",class:"w-100"},{default:(0,t.k6)((()=>[n.hasLogger?((0,t.uX)(),(0,t.Wv)(y,{key:0,label:e.$t("logger.list")},{default:(0,t.k6)((()=>[(0,t.Lk)("div",g,[(0,t.Lk)("div",s,[(0,t.Lk)("div",null,[(0,t.bF)(f,{modelValue:n.state.type,"onUpdate:modelValue":l[0]||(l[0]=e=>n.state.type=e),onChange:n.loadData,size:"small",class:"mgr-1",style:{width:"6rem"}},{default:(0,t.k6)((()=>[(0,t.bF)(m,{value:-1,label:"all"}),(0,t.bF)(m,{value:0,label:"debug"}),(0,t.bF)(m,{value:1,label:"info"}),(0,t.bF)(m,{value:2,label:"warning"}),(0,t.bF)(m,{value:3,label:"error"}),(0,t.bF)(m,{value:4,label:"fatal"})])),_:1},8,["modelValue","onChange"])]),(0,t.bF)(h,{type:"warning",size:"small",loading:n.state.loading,onClick:n.clearData},{default:(0,t.k6)((()=>[(0,t.eW)((0,o.v_)(e.$t("logger.clear")),1)])),_:1},8,["loading","onClick"]),(0,t.bF)(h,{size:"small",loading:n.state.loading,onClick:n.loadData},{default:(0,t.k6)((()=>[(0,t.eW)((0,o.v_)(e.$t("logger.refresh")),1)])),_:1},8,["loading","onClick"]),i]),(0,t.Lk)("div",d,[(0,t.bF)(v,{stripe:"",border:"",data:n.state.page.List,size:"small",height:`${n.state.height}px`,width:"100%",onRowClick:n.handleRowClick,"row-class-name":n.tableRowClassName},{default:(0,t.k6)((()=>[(0,t.bF)(k,{type:"index",width:"50"}),(0,t.bF)(k,{prop:"Type",label:e.$t("logger.level"),width:"80"},{default:(0,t.k6)((e=>[(0,t.Lk)("span",null,(0,o.v_)(n.state.types[e.row.Type]),1)])),_:1},8,["label"]),(0,t.bF)(k,{prop:"Time",label:e.$t("logger.time"),width:"160"},null,8,["label"]),(0,t.bF)(k,{prop:"content",label:e.$t("logger.content")},null,8,["label"])])),_:1},8,["data","height","onRowClick","row-class-name"])]),(0,t.Lk)("div",u,[(0,t.Lk)("div",b,[(0,t.bF)(w,{small:"",total:n.state.page.Count,currentPage:n.state.page.Page,"onUpdate:currentPage":l[1]||(l[1]=e=>n.state.page.Page=e),"page-size":n.state.page.Size,"pager-count":n.globalData.isPc?7:3,layout:n.globalData.isPc?"total,prev, pager, next":"prev, pager, next",onCurrentChange:n.handlePageChange,background:""},null,8,["total","currentPage","page-size","pager-count","layout","onCurrentChange"])])])])])),_:1},8,["label"])):(0,t.Q3)("",!0),n.hasLoggerLevel?((0,t.uX)(),(0,t.Wv)(y,{key:1,label:e.$t("common.setting")},{default:(0,t.k6)((()=>[(0,t.bF)(F)])),_:1},8,["label"])):(0,t.Q3)("",!0)])),_:1})],512)}var p=a(144),m=a(4);const f=e=>(0,m.zG)("logger/get",e),h=()=>(0,m.zG)("logger/clear"),k=()=>(0,m.zG)("logger/getconfig"),v=e=>(0,m.zG)("logger/setconfig",e),w={class:"t-c w-100"};function y(e,l,a,n,r,g){const s=(0,t.g2)("el-input"),i=(0,t.g2)("el-form-item"),d=(0,t.g2)("el-col"),u=(0,t.g2)("el-option"),b=(0,t.g2)("el-select"),c=(0,t.g2)("el-row"),p=(0,t.g2)("el-button"),m=(0,t.g2)("el-form");return(0,t.uX)(),(0,t.Wv)(m,{"label-width":"8rem",ref:"formDom",model:n.state.form,rules:n.state.rules},{default:(0,t.k6)((()=>[(0,t.bF)(i,{label:"","label-width":"0"},{default:(0,t.k6)((()=>[(0,t.bF)(c,null,{default:(0,t.k6)((()=>[(0,t.bF)(d,{xs:24,sm:8,md:8,lg:8,xl:8},{default:(0,t.k6)((()=>[(0,t.bF)(i,{label:e.$t("logger.count"),prop:"Size"},{default:(0,t.k6)((()=>[(0,t.bF)(s,{size:"default",modelValue:n.state.form.Size,"onUpdate:modelValue":l[0]||(l[0]=e=>n.state.form.Size=e)},null,8,["modelValue"])])),_:1},8,["label"])])),_:1}),(0,t.bF)(d,{xs:24,sm:8,md:8,lg:8,xl:8},{default:(0,t.k6)((()=>[(0,t.bF)(i,{label:e.$t("logger.level"),prop:"LoggerType"},{default:(0,t.k6)((()=>[(0,t.bF)(b,{modelValue:n.state.form.LoggerType,"onUpdate:modelValue":l[1]||(l[1]=e=>n.state.form.LoggerType=e)},{default:(0,t.k6)((()=>[(0,t.bF)(u,{value:0,label:"debug"}),(0,t.bF)(u,{value:1,label:"info"}),(0,t.bF)(u,{value:2,label:"warning"}),(0,t.bF)(u,{value:3,label:"error"}),(0,t.bF)(u,{value:4,label:"fatal"})])),_:1},8,["modelValue"])])),_:1},8,["label"])])),_:1})])),_:1})])),_:1}),(0,t.bF)(i,{"label-width":"0"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",w,[(0,t.bF)(p,{type:"primary",loading:n.state.loading,onClick:n.submit},{default:(0,t.k6)((()=>[(0,t.eW)((0,o.v_)(e.$t("common.confirm")),1)])),_:1},8,["loading","onClick"])])])),_:1})])),_:1},8,["model","rules"])}var F=a(1219),L={setup(){const e=(0,p.KR)(null),l=(0,p.Kh)({loading:!1,configInfo:{},form:{Size:0,LoggerType:-1},rules:{Size:[{required:!0,message:"必填",trigger:"blur"},{type:"number",min:1,max:1e4,message:"数字 1-10000",trigger:"blur",transform(e){return Number(e)}}]}}),a=()=>{k().then((e=>{l.configInfo=e,l.form.Size=e.Size,l.form.LoggerType=e.LoggerType})).catch((e=>{}))},o=()=>{let e=JSON.parse(JSON.stringify(l.configInfo));return e.Size=+l.form.Size,e.LoggerType=+l.form.LoggerType,e},n=()=>new Promise(((a,t)=>{e.value.validate((e=>{if(0==e)return t(),!1;l.loading=!0;const n=o();v(n).then((e=>{l.loading=!1,a(),e?F.nk.success("操作成功!"):F.nk.error("操作失败!")})).catch((e=>{console.log(e),l.loading=!1,a()}))}))}));return(0,t.sV)((()=>{a()})),{state:l,formDom:e,submit:n}}},_=a(1241);const C=(0,_.A)(L,[["render",y],["__scopeId","data-v-23dfe420"]]);var z=C,x=a(2933),S=a(3830),P={components:{Setting:z},setup(){const e=(0,S.B)(),l=(0,p.EW)((()=>e.value.hasAccess("LoggerShow"))),a=(0,p.EW)((()=>e.value.hasAccess("LoggerLevel"))),o=(0,p.KR)(null),n=(0,p.Kh)({loading:!0,type:-1,page:{Page:1,Size:20,Count:0,List:[]},types:["debug","info","warning","error","fatal"],height:(0,p.EW)((()=>e.value.height-180))}),r=()=>{n.loading=!0,f({Page:n.page.Page,Size:n.page.Size,Type:n.type}).then((e=>{n.loading=!1,e.List.map((e=>{e.content=e.Content.substring(0,50)})),n.page=e})).catch((e=>{console.log(e),n.loading=!1}))},g=e=>{e&&(n.page.Page=e,r())},s=()=>{n.loading=!0,h().then((()=>{n.loading=!1,r()})).catch((()=>{n.loading=!1}))},i=({row:e,rowIndex:l})=>`type-${e.Type}`,d=(e,l,a)=>{let t="padding:1rem;border:1px solid #ddd; resize:none;width:30rem;box-sizing: border-box;white-space: nowrap; height:30rem;";x.s.alert(``,"",{dangerouslyUseHTMLString:!0}).catch((()=>{}))};return(0,t.sV)((()=>{r()})),{globalData:e,hasLogger:l,hasLoggerLevel:a,wrap:o,state:n,loadData:r,clearData:s,tableRowClassName:i,handleRowClick:d,handlePageChange:g}}};const T=(0,_.A)(P,[["render",c],["__scopeId","data-v-63810b88"]]);var $=T}}]);
\ No newline at end of file
diff --git a/src/linker.tray.win/web/js/372.3147c8c0.js b/src/linker.tray.win/web/js/537.12fad626.js
similarity index 99%
rename from src/linker.tray.win/web/js/372.3147c8c0.js
rename to src/linker.tray.win/web/js/537.12fad626.js
index b34dcdb7..001c96af 100644
--- a/src/linker.tray.win/web/js/372.3147c8c0.js
+++ b/src/linker.tray.win/web/js/537.12fad626.js
@@ -1 +1 @@
-"use strict";(self["webpackChunklinker_web"]=self["webpackChunklinker_web"]||[]).push([[372],{146:function(e,l,r){r.r(l),r.d(l,{default:function(){return ml}});var a=r(6768);const t={class:"app-wrap flex flex-column flex-nowrap",id:"app-wrap"},o={class:"head"},u={class:"body flex-1 relative",ref:"wrap"},n={class:"home absolute"},s={class:"status"};function d(e,l,r,d,m,i){const c=(0,a.g2)("Head"),f=(0,a.g2)("router-view"),v=(0,a.g2)("Status"),p=(0,a.g2)("Install");return(0,a.uX)(),(0,a.CE)("div",t,[(0,a.Lk)("div",o,[(0,a.bF)(c)]),(0,a.Lk)("div",u,[(0,a.Lk)("div",n,[(0,a.bF)(f)])],512),(0,a.Lk)("div",s,[(0,a.bF)(v,{config:!0}),(0,a.bF)(p)])])}r(4114);var m=r(4232),i=r.p+"img/logo.c20f799b.png",c=r.p+"img/shouye.4c820c0e.svg",f=r.p+"img/fuwuqi.3b385506.svg",v=r.p+"img/dadong.e6fd78bf.svg",p=r.p+"img/login.0201d499.svg",b=r.p+"img/anquan.5f8d5e47.svg",g=r.p+"img/rizhi.c3ca751b.svg",k=r.p+"img/shuaxin2.b46145e2.svg";const F=e=>((0,a.Qi)("data-v-f2838cec"),e=e(),(0,a.jt)(),e),h={class:"head flex"},w={class:"logo"},y=F((()=>(0,a.Lk)("img",{src:i,alt:""},null,-1))),_={class:"menu flex-1"},S={key:0,class:"flex"},V=F((()=>(0,a.Lk)("img",{src:c},null,-1))),K={key:0},C=F((()=>(0,a.Lk)("img",{src:f},null,-1))),L={key:1},P=F((()=>(0,a.Lk)("img",{src:v},null,-1))),x={key:2},W=F((()=>(0,a.Lk)("img",{src:p},null,-1))),X={key:3},E=F((()=>(0,a.Lk)("img",{src:b},null,-1))),Q={key:4},A=F((()=>(0,a.Lk)("img",{src:g},null,-1))),U={key:1,class:"flex"},D={key:0},I=F((()=>(0,a.Lk)("img",{src:c},null,-1))),j={key:1},$=F((()=>(0,a.Lk)("img",{src:f},null,-1))),q={key:2},N=F((()=>(0,a.Lk)("img",{src:v},null,-1))),O={key:3},R=F((()=>(0,a.Lk)("img",{src:p},null,-1))),T={key:4},B=F((()=>(0,a.Lk)("img",{src:b},null,-1))),J={key:5},z=F((()=>(0,a.Lk)("img",{src:g},null,-1))),G=F((()=>(0,a.Lk)("img",{src:k},null,-1))),H={key:0,class:"select"},Y={class:"el-dropdown-link"},M=F((()=>(0,a.Lk)("img",{src:c,height:"20",style:{"vertical-align":"text-top"}},null,-1))),Z=F((()=>(0,a.Lk)("img",{src:f,height:"20",style:{"vertical-align":"text-top"}},null,-1))),ee=F((()=>(0,a.Lk)("img",{src:v,height:"20",style:{"vertical-align":"text-top"}},null,-1))),le=F((()=>(0,a.Lk)("img",{src:p,height:"20",style:{"vertical-align":"text-top"}},null,-1))),re=F((()=>(0,a.Lk)("img",{src:b,height:"20",style:{"vertical-align":"text-top"}},null,-1))),ae=F((()=>(0,a.Lk)("img",{src:g,height:"20",style:{"vertical-align":"text-top"}},null,-1))),te={key:1,class:"locale"},oe={class:"el-dropdown-link"},ue={key:2,class:"image"};function ne(e,l,r,t,o,u){const n=(0,a.g2)("router-link"),s=(0,a.g2)("Operation"),d=(0,a.g2)("el-icon"),i=(0,a.g2)("el-dropdown-item"),c=(0,a.g2)("el-dropdown-menu"),f=(0,a.g2)("el-dropdown"),v=(0,a.g2)("ArrowDown"),p=(0,a.g2)("Background");return(0,a.uX)(),(0,a.CE)("div",null,[(0,a.Lk)("div",h,[(0,a.Lk)("div",w,[(0,a.bF)(n,{to:{name:"FullIndex"}},{default:(0,a.k6)((()=>[y])),_:1})]),(0,a.Lk)("div",_,[t.globalData.isPc?((0,a.uX)(),(0,a.CE)("ul",S,[(0,a.Lk)("li",null,[(0,a.bF)(n,{to:{name:"FullIndex"}},{default:(0,a.k6)((()=>[V,(0,a.Lk)("span",null,(0,m.v_)(e.$t("head.home")),1)])),_:1})]),t.hasConfig?((0,a.uX)(),(0,a.CE)("li",K,[(0,a.bF)(n,{to:{name:"FullServers"}},{default:(0,a.k6)((()=>[C,(0,a.Lk)("span",null,(0,m.v_)(e.$t("head.server")),1)])),_:1})])):(0,a.Q3)("",!0),t.hasTransport?((0,a.uX)(),(0,a.CE)("li",L,[(0,a.bF)(n,{to:{name:"FullTransport"}},{default:(0,a.k6)((()=>[P,(0,a.Lk)("span",null,(0,m.v_)(e.$t("head.protocol")),1)])),_:1})])):(0,a.Q3)("",!0),t.hasAction?((0,a.uX)(),(0,a.CE)("li",x,[(0,a.bF)(n,{to:{name:"FullAction"}},{default:(0,a.k6)((()=>[W,(0,a.Lk)("span",null,(0,m.v_)(e.$t("head.action")),1)])),_:1})])):(0,a.Q3)("",!0),t.hasFirewall?((0,a.uX)(),(0,a.CE)("li",X,[(0,a.bF)(n,{to:{name:"FullFirewall"}},{default:(0,a.k6)((()=>[E,(0,a.Lk)("span",null,(0,m.v_)(e.$t("head.firewall")),1)])),_:1})])):(0,a.Q3)("",!0),t.hasLogger?((0,a.uX)(),(0,a.CE)("li",Q,[(0,a.bF)(n,{to:{name:"FullLogger"}},{default:(0,a.k6)((()=>[A,(0,a.Lk)("span",null,(0,m.v_)(e.$t("head.logger")),1)])),_:1})])):(0,a.Q3)("",!0)])):((0,a.uX)(),(0,a.CE)("ul",U,["FullIndex"==t.route.name?((0,a.uX)(),(0,a.CE)("li",D,[(0,a.bF)(n,{to:{name:"FullIndex"}},{default:(0,a.k6)((()=>[I,(0,a.Lk)("span",null,(0,m.v_)(e.$t("head.home")),1)])),_:1})])):(0,a.Q3)("",!0),t.hasConfig&&"FullServers"==t.route.name?((0,a.uX)(),(0,a.CE)("li",j,[(0,a.bF)(n,{to:{name:"FullServers"}},{default:(0,a.k6)((()=>[$,(0,a.Lk)("span",null,(0,m.v_)(e.$t("head.server")),1)])),_:1})])):(0,a.Q3)("",!0),t.hasTransport&&"FullTransport"==t.route.name?((0,a.uX)(),(0,a.CE)("li",q,[(0,a.bF)(n,{to:{name:"FullTransport"}},{default:(0,a.k6)((()=>[N,(0,a.Lk)("span",null,(0,m.v_)(e.$t("head.protocol")),1)])),_:1})])):(0,a.Q3)("",!0),t.hasAction&&"FullAction"==t.route.name?((0,a.uX)(),(0,a.CE)("li",O,[(0,a.bF)(n,{to:{name:"FullAction"}},{default:(0,a.k6)((()=>[R,(0,a.Lk)("span",null,(0,m.v_)(e.$t("head.action")),1)])),_:1})])):(0,a.Q3)("",!0),t.hasFirewall&&"FullFirewall"==t.route.name?((0,a.uX)(),(0,a.CE)("li",T,[(0,a.bF)(n,{to:{name:"FullFirewall"}},{default:(0,a.k6)((()=>[B,(0,a.Lk)("span",null,(0,m.v_)(e.$t("head.firewall")),1)])),_:1})])):(0,a.Q3)("",!0),t.hasLogger&&"FullLogger"==t.route.name?((0,a.uX)(),(0,a.CE)("li",J,[(0,a.bF)(n,{to:{name:"FullLogger"}},{default:(0,a.k6)((()=>[z,(0,a.eW)(),(0,a.Lk)("span",null,(0,m.v_)(e.$t("head.logger")),1)])),_:1})])):(0,a.Q3)("",!0),(0,a.Lk)("li",null,[(0,a.Lk)("a",{href:"javascript:void(0);",onClick:l[0]||(l[0]=(...e)=>t.refresh&&t.refresh(...e))},[G,(0,a.Lk)("span",null,(0,m.v_)(e.$t("head.refresh")),1)])])]))]),t.globalData.isPhone?((0,a.uX)(),(0,a.CE)("div",H,[(0,a.bF)(f,null,{dropdown:(0,a.k6)((()=>[(0,a.bF)(c,{class:"select-menu"},{default:(0,a.k6)((()=>[(0,a.bF)(i,null,{default:(0,a.k6)((()=>[(0,a.bF)(n,{to:{name:"FullIndex"}},{default:(0,a.k6)((()=>[M,(0,a.eW)(" "+(0,m.v_)(e.$t("head.home")),1)])),_:1})])),_:1}),t.hasConfig?((0,a.uX)(),(0,a.Wv)(i,{key:0},{default:(0,a.k6)((()=>[(0,a.bF)(n,{to:{name:"FullServers"}},{default:(0,a.k6)((()=>[Z,(0,a.eW)(" "+(0,m.v_)(e.$t("head.server")),1)])),_:1})])),_:1})):(0,a.Q3)("",!0),t.hasTransport?((0,a.uX)(),(0,a.Wv)(i,{key:1},{default:(0,a.k6)((()=>[(0,a.bF)(n,{to:{name:"FullTransport"}},{default:(0,a.k6)((()=>[ee,(0,a.eW)(" "+(0,m.v_)(e.$t("head.protocol")),1)])),_:1})])),_:1})):(0,a.Q3)("",!0),t.hasAction?((0,a.uX)(),(0,a.Wv)(i,{key:2},{default:(0,a.k6)((()=>[(0,a.bF)(n,{to:{name:"FullAction"}},{default:(0,a.k6)((()=>[le,(0,a.eW)(" "+(0,m.v_)(e.$t("head.action")),1)])),_:1})])),_:1})):(0,a.Q3)("",!0),t.hasFirewall?((0,a.uX)(),(0,a.Wv)(i,{key:3},{default:(0,a.k6)((()=>[(0,a.bF)(n,{to:{name:"FullFirewall"}},{default:(0,a.k6)((()=>[re,(0,a.eW)(" "+(0,m.v_)(e.$t("head.firewall")),1)])),_:1})])),_:1})):(0,a.Q3)("",!0),t.hasLogger?((0,a.uX)(),(0,a.Wv)(i,{key:4},{default:(0,a.k6)((()=>[(0,a.bF)(n,{to:{name:"FullLogger"}},{default:(0,a.k6)((()=>[ae,(0,a.eW)(" "+(0,m.v_)(e.$t("head.logger")),1)])),_:1})])),_:1})):(0,a.Q3)("",!0)])),_:1})])),default:(0,a.k6)((()=>[(0,a.Lk)("span",Y,[(0,a.bF)(d,null,{default:(0,a.k6)((()=>[(0,a.bF)(s)])),_:1})])])),_:1})])):(0,a.Q3)("",!0),t.globalData.isPc?((0,a.uX)(),(0,a.CE)("div",te,[(0,a.bF)(f,null,{dropdown:(0,a.k6)((()=>[(0,a.bF)(c,null,{default:(0,a.k6)((()=>[((0,a.uX)(!0),(0,a.CE)(a.FK,null,(0,a.pI)(t.localeOptions,((e,l)=>((0,a.uX)(),(0,a.Wv)(i,{onClick:e=>t.handleLocale(l)},{default:(0,a.k6)((()=>[(0,a.eW)((0,m.v_)(e),1)])),_:2},1032,["onClick"])))),256))])),_:1})])),default:(0,a.k6)((()=>[(0,a.Lk)("span",oe,[(0,a.eW)((0,m.v_)(t.localeOptions[t.locale])+" ",1),(0,a.bF)(d,null,{default:(0,a.k6)((()=>[(0,a.bF)(v)])),_:1})])])),_:1})])):(0,a.Q3)("",!0),t.globalData.isPc?((0,a.uX)(),(0,a.CE)("div",ue,[(0,a.bF)(p,{name:"full"})])):(0,a.Q3)("",!0)])])}var se=r(7477),de=r(3830),me=r(144),ie=r(5096),ce=r(9287),fe=r(2773),ve=r(1387),pe={components:{Background:ie.A,Operation:se.IaS,ArrowDown:se.yd$},setup(){const e=(0,ve.lq)(),l=(0,de.B)(),r=(0,a.EW)((()=>l.value.hasAccess("Config"))),t=(0,a.EW)((()=>l.value.hasAccess("LoggerShow"))),o=(0,a.EW)((()=>l.value.hasAccess("Transport"))),u=(0,a.EW)((()=>l.value.hasAccess("Action"))),n=(0,a.EW)((()=>l.value.hasAccess("Group"))),s=(0,a.EW)((()=>l.value.hasAccess("FirewallSelf"))),d=(0,me.KR)(ce.Y),{changeLocale:m,currentLocale:i}=(0,fe.A)(),c=(0,a.EW)({get(){return i.value},set(e){m(e)}}),f=e=>{c.value=e},v=()=>{window.location.reload()};return{route:e,globalData:l,hasConfig:r,hasGroup:n,hasLogger:t,hasTransport:o,hasAction:u,hasFirewall:s,localeOptions:d,locale:c,handleLocale:f,refresh:v}}},be=r(1241);const ge=(0,be.A)(pe,[["render",ne],["__scopeId","data-v-f2838cec"]]);var ke=ge,Fe=r(5317);function he(e,l,r,t,o,u){const n=(0,a.g2)("Input"),s=(0,a.g2)("el-tab-pane"),d=(0,a.g2)("Copy"),m=(0,a.g2)("Save"),i=(0,a.g2)("el-tabs"),c=(0,a.g2)("el-dialog");return(0,a.uX)(),(0,a.CE)("div",null,[(0,a.bF)(c,{modelValue:t.state.show,"onUpdate:modelValue":l[0]||(l[0]=e=>t.state.show=e),title:"初始化配置",width:"700",top:"2vh"},{default:(0,a.k6)((()=>[(0,a.Lk)("div",null,[(0,a.bF)(i,{type:"border-card"},{default:(0,a.k6)((()=>[(0,a.bF)(s,{label:"手动输入"},{default:(0,a.k6)((()=>[(0,a.bF)(n)])),_:1}),(0,a.bF)(s,{label:"粘贴配置"},{default:(0,a.k6)((()=>[(0,a.bF)(d)])),_:1}),(0,a.bF)(s,{label:"在线导入"},{default:(0,a.k6)((()=>[(0,a.bF)(m)])),_:1})])),_:1})])])),_:1},8,["modelValue"])])}const we=e=>((0,a.Qi)("data-v-ce07310a"),e=e(),(0,a.jt)(),e),ye={class:"head"},_e={class:"body"},Se=we((()=>(0,a.Lk)("div",{class:"t-c"},"完成保存后,请重启软件",-1))),Ve={class:"footer t-c"};function Ke(e,l,r,t,o,u){const n=(0,a.g2)("el-step"),s=(0,a.g2)("el-steps"),d=(0,a.g2)("Common"),m=(0,a.g2)("el-card"),i=(0,a.g2)("Server"),c=(0,a.g2)("Client"),f=(0,a.g2)("el-button");return(0,a.uX)(),(0,a.CE)("div",null,[(0,a.Lk)("div",ye,[(0,a.bF)(s,{active:t.step.step,"finish-status":"success"},{default:(0,a.k6)((()=>[((0,a.uX)(!0),(0,a.CE)(a.FK,null,(0,a.pI)(t.state.steps,((e,l)=>((0,a.uX)(),(0,a.Wv)(n,{title:e},null,8,["title"])))),256))])),_:1},8,["active"])]),(0,a.Lk)("div",_e,[1==t.step.step?((0,a.uX)(),(0,a.Wv)(m,{key:0,shadow:"never"},{default:(0,a.k6)((()=>[(0,a.bF)(d,{ref:"currentDom"},null,512)])),_:1})):(0,a.Q3)("",!0),2==t.step.step?((0,a.uX)(),(0,a.Wv)(m,{key:1,shadow:"never"},{default:(0,a.k6)((()=>[(0,a.bF)(i,{ref:"currentDom"},null,512)])),_:1})):(0,a.Q3)("",!0),3==t.step.step?((0,a.uX)(),(0,a.Wv)(m,{key:2,shadow:"never"},{default:(0,a.k6)((()=>[(0,a.bF)(c,{ref:"currentDom"},null,512)])),_:1})):(0,a.Q3)("",!0),4==t.step.step?((0,a.uX)(),(0,a.Wv)(m,{key:3,shadow:"never"},{default:(0,a.k6)((()=>[Se])),_:1})):(0,a.Q3)("",!0)]),(0,a.Lk)("div",Ve,[(0,a.bF)(f,{disabled:t.step.step<=1,onClick:t.handlePrev},{default:(0,a.k6)((()=>[(0,a.eW)("上一步")])),_:1},8,["disabled","onClick"]),t.step.step[(0,a.eW)("下一步")])),_:1},8,["onClick"])):((0,a.uX)(),(0,a.Wv)(f,{key:1,type:"primary",onClick:t.handleSave},{default:(0,a.k6)((()=>[(0,a.eW)("完成")])),_:1},8,["onClick"]))])])}var Ce=r(8835),Le=r(1219);const Pe={class:"t-c"};function xe(e,l,r,t,o,u){const n=(0,a.g2)("el-checkbox");return(0,a.uX)(),(0,a.CE)("div",Pe,[(0,a.bF)(n,{modelValue:t.state.form.client,"onUpdate:modelValue":l[0]||(l[0]=e=>t.state.form.client=e),label:"作为客户端"},null,8,["modelValue"]),t.globalData.isPc?((0,a.uX)(),(0,a.Wv)(n,{key:0,modelValue:t.state.form.server,"onUpdate:modelValue":l[1]||(l[1]=e=>t.state.form.server=e),label:"作为服务端"},null,8,["modelValue"])):(0,a.Q3)("",!0)])}var We={name:"Common",setup(){const e=(0,de.B)(),l=(0,a.WQ)("step"),r=(0,me.Kh)({form:{client:l.value.form.common.client||l.value.json.Common&&l.value.json.Common.client||!0,server:l.value.form.common.server||l.value.json.Common&&l.value.json.Common.server||!1}}),t=e=>new Promise(((e,l)=>{r.form.client||r.form.server?e({json:{Common:{client:r.form.client,server:r.form.server,modes:[r.form.client?"client":"",r.form.server?"server":""].filter((e=>!!e))}},form:{common:JSON.parse(JSON.stringify(r.form))}}):(Le.nk.error("请选择客户端或服务端"),l())}));return{state:r,globalData:e,handleValidate:t}}};const Xe=(0,be.A)(We,[["render",xe]]);var Ee=Xe;const Qe=e=>((0,a.Qi)("data-v-646b1688"),e=e(),(0,a.jt)(),e),Ae=Qe((()=>(0,a.Lk)("div",{class:"t-c w-100"},[(0,a.Lk)("p",null,"端口为0不监听,相同分组之间的客户端相互可见")],-1)));function Ue(e,l,r,t,o,u){const n=(0,a.g2)("el-form-item"),s=(0,a.g2)("el-input"),d=(0,a.g2)("el-col"),m=(0,a.g2)("el-row"),i=(0,a.g2)("el-checkbox"),c=(0,a.g2)("el-form");return(0,a.uX)(),(0,a.CE)("div",null,[(0,a.bF)(c,{ref:"formDom",model:t.state.form,rules:t.state.rules,"label-width":"8rem"},{default:(0,a.k6)((()=>[(0,a.bF)(n,{label:"","label-width":"0"},{default:(0,a.k6)((()=>[Ae])),_:1}),(0,a.bF)(n,{label:"","label-width":"0"},{default:(0,a.k6)((()=>[(0,a.bF)(m,null,{default:(0,a.k6)((()=>[(0,a.bF)(d,{sm:12,xs:24},{default:(0,a.k6)((()=>[(0,a.bF)(n,{label:"机器名",prop:"name"},{default:(0,a.k6)((()=>[(0,a.bF)(s,{modelValue:t.state.form.name,"onUpdate:modelValue":l[0]||(l[0]=e=>t.state.form.name=e),maxlength:"32","show-word-limit":""},null,8,["modelValue"])])),_:1})])),_:1}),t.globalData.isPc?((0,a.uX)(),(0,a.Wv)(d,{key:0,sm:12,xs:24},{default:(0,a.k6)((()=>[(0,a.bF)(n,{label:"网页端口",prop:"web"},{default:(0,a.k6)((()=>[(0,a.bF)(s,{modelValue:t.state.form.web,"onUpdate:modelValue":l[1]||(l[1]=e=>t.state.form.web=e)},null,8,["modelValue"])])),_:1})])),_:1})):(0,a.Q3)("",!0)])),_:1})])),_:1}),t.globalData.isPc?((0,a.uX)(),(0,a.Wv)(n,{key:0,label:"","label-width":"0"},{default:(0,a.k6)((()=>[(0,a.bF)(m,null,{default:(0,a.k6)((()=>[(0,a.bF)(d,{sm:12,xs:24},{default:(0,a.k6)((()=>[(0,a.bF)(n,{label:"接口端口",prop:"api"},{default:(0,a.k6)((()=>[(0,a.bF)(s,{modelValue:t.state.form.api,"onUpdate:modelValue":l[2]||(l[2]=e=>t.state.form.api=e)},null,8,["modelValue"])])),_:1})])),_:1}),(0,a.bF)(d,{sm:12,xs:24},{default:(0,a.k6)((()=>[(0,a.bF)(n,{label:"接口密码",prop:"password"},{default:(0,a.k6)((()=>[(0,a.bF)(s,{type:"password",modelValue:t.state.form.password,"onUpdate:modelValue":l[3]||(l[3]=e=>t.state.form.password=e),"show-password":"",maxlength:"36","show-word-limit":""},null,8,["modelValue"])])),_:1})])),_:1})])),_:1})])),_:1})):(0,a.Q3)("",!0),(0,a.bF)(n,{label:"","label-width":"0"},{default:(0,a.k6)((()=>[(0,a.bF)(m,null,{default:(0,a.k6)((()=>[(0,a.bF)(d,{sm:12,xs:24},{default:(0,a.k6)((()=>[(0,a.bF)(n,{label:"分组名",prop:"groupid"},{default:(0,a.k6)((()=>[(0,a.bF)(s,{modelValue:t.state.form.groupid,"onUpdate:modelValue":l[4]||(l[4]=e=>t.state.form.groupid=e),maxlength:"36","show-word-limit":""},null,8,["modelValue"])])),_:1})])),_:1}),(0,a.bF)(d,{sm:12,xs:24},{default:(0,a.k6)((()=>[(0,a.bF)(n,{label:"分组密码",prop:"groupPassword"},{default:(0,a.k6)((()=>[(0,a.bF)(s,{modelValue:t.state.form.groupPassword,"onUpdate:modelValue":l[5]||(l[5]=e=>t.state.form.groupPassword=e),type:"password","show-password":"",maxlength:"36","show-word-limit":""},null,8,["modelValue"])])),_:1})])),_:1})])),_:1})])),_:1}),(0,a.bF)(n,{label:"","label-width":"0"},{default:(0,a.k6)((()=>[(0,a.bF)(m,null,{default:(0,a.k6)((()=>[(0,a.bF)(d,{span:24},{default:(0,a.k6)((()=>[(0,a.bF)(n,{"label-width":"8rem",prop:"hasServer"},{default:(0,a.k6)((()=>[(0,a.bF)(i,{modelValue:t.state.form.hasServer,"onUpdate:modelValue":l[6]||(l[6]=e=>t.state.form.hasServer=e),label:"我有服务器(私有部署)",size:"large"},null,8,["modelValue"])])),_:1})])),_:1})])),_:1})])),_:1}),t.state.form.hasServer?((0,a.uX)(),(0,a.Wv)(n,{key:1,label:"","label-width":"0"},{default:(0,a.k6)((()=>[(0,a.bF)(m,null,{default:(0,a.k6)((()=>[(0,a.bF)(d,{sm:12,xs:24},{default:(0,a.k6)((()=>[(0,a.bF)(n,{label:"信标服务",prop:"server"},{default:(0,a.k6)((()=>[(0,a.bF)(s,{modelValue:t.state.form.server,"onUpdate:modelValue":l[7]||(l[7]=e=>t.state.form.server=e)},null,8,["modelValue"])])),_:1})])),_:1}),(0,a.bF)(d,{sm:12,xs:24},{default:(0,a.k6)((()=>[(0,a.bF)(n,{label:"信标密钥",prop:"serverSecretKey"},{default:(0,a.k6)((()=>[(0,a.bF)(s,{modelValue:t.state.form.serverSecretKey,"onUpdate:modelValue":l[8]||(l[8]=e=>t.state.form.serverSecretKey=e),maxlength:"36","show-word-limit":""},null,8,["modelValue"])])),_:1})])),_:1})])),_:1})])),_:1})):(0,a.Q3)("",!0),t.state.form.hasServer?((0,a.uX)(),(0,a.Wv)(n,{key:2,label:"","label-width":"0"},{default:(0,a.k6)((()=>[(0,a.bF)(m,null,{default:(0,a.k6)((()=>[(0,a.bF)(d,{sm:12,xs:24},{default:(0,a.k6)((()=>[(0,a.bF)(n,{label:"穿透密钥",prop:"sForwardSecretKey"},{default:(0,a.k6)((()=>[(0,a.bF)(s,{modelValue:t.state.form.sForwardSecretKey,"onUpdate:modelValue":l[9]||(l[9]=e=>t.state.form.sForwardSecretKey=e),maxlength:"36","show-word-limit":""},null,8,["modelValue"])])),_:1})])),_:1}),(0,a.bF)(d,{sm:12,xs:24},{default:(0,a.k6)((()=>[(0,a.bF)(n,{label:"中继密钥",prop:"relaySecretKey"},{default:(0,a.k6)((()=>[(0,a.bF)(s,{modelValue:t.state.form.relaySecretKey,"onUpdate:modelValue":l[10]||(l[10]=e=>t.state.form.relaySecretKey=e),maxlength:"36","show-word-limit":""},null,8,["modelValue"])])),_:1})])),_:1})])),_:1})])),_:1})):(0,a.Q3)("",!0),t.state.form.hasServer?((0,a.uX)(),(0,a.Wv)(n,{key:3,label:"","label-width":"0"},{default:(0,a.k6)((()=>[(0,a.bF)(m,null,{default:(0,a.k6)((()=>[(0,a.bF)(d,{sm:12,xs:24},{default:(0,a.k6)((()=>[(0,a.bF)(n,{label:"更新密钥",prop:"updaterSecretKey"},{default:(0,a.k6)((()=>[(0,a.bF)(s,{modelValue:t.state.form.updaterSecretKey,"onUpdate:modelValue":l[11]||(l[11]=e=>t.state.form.updaterSecretKey=e),maxlength:"36","show-word-limit":""},null,8,["modelValue"])])),_:1})])),_:1}),t.globalData.isPc?((0,a.uX)(),(0,a.Wv)(d,{key:0,sm:12,xs:24},{default:(0,a.k6)((()=>[(0,a.bF)(n,{label:"占位"},{default:(0,a.k6)((()=>[(0,a.bF)(s,{disabled:"",maxlength:"36","show-word-limit":""})])),_:1})])),_:1})):(0,a.Q3)("",!0)])),_:1})])),_:1})):(0,a.Q3)("",!0)])),_:1},8,["model","rules"])])}var De={setup(e){const l=(0,a.WQ)("step"),r=(0,de.B)(),t=(0,me.Kh)({form:{name:l.value.form.client.name||r.value.config.Client.Name,groupid:l.value.form.client.groupid||r.value.config.Client.Group.Id,groupPassword:l.value.form.client.groupPassword||r.value.config.Client.Group.Password,api:l.value.form.client.api||r.value.config.Client.CApi.ApiPort,web:l.value.form.client.web||r.value.config.Client.CApi.WebPort,password:l.value.form.client.password||r.value.config.Client.CApi.ApiPassword,hasServer:l.value.form.client.hasServer||!1,server:l.value.form.client.server||r.value.config.Client.Server.Host,serverSecretKey:l.value.form.client.serverSecretKey||r.value.config.Client.ServerSecretKey,sForwardSecretKey:l.value.form.client.sForwardSecretKey||r.value.config.Client.SForward.SecretKey,relaySecretKey:l.value.form.client.relaySecretKey||(r.value.config.Client.Relay.Servers[0]||{SecretKey:"snltty"}).SecretKey,updaterSecretKey:l.value.form.client.updaterSecretKey||r.value.config.Client.Updater.SecretKey},rules:{name:[{required:!0,message:"必填",trigger:"blur"}],groupid:[{required:!0,message:"必填",trigger:"blur"}],groupPassword:[{required:!0,message:"必填",trigger:"blur"}],password:[{required:!0,message:"必填",trigger:"blur"}],api:[{required:!0,message:"必填",trigger:"blur"},{type:"number",min:0,max:65535,message:"数字 0-65535",trigger:"blur",transform(e){return Number(e)}}],web:[{required:!0,message:"必填",trigger:"blur"},{type:"number",min:0,max:65535,message:"数字 0-65535",trigger:"blur",transform(e){return Number(e)}}]}}),o=(0,me.KR)(null),u=()=>new Promise(((e,l)=>{o.value.validate((r=>{r?e({json:{Client:{name:t.form.name,groupid:t.form.groupid,groupPassword:t.form.groupPassword,api:+t.form.api,web:+t.form.web,password:t.form.password,hasServer:t.form.hasServer,server:t.form.server,serverSecretKey:t.form.serverSecretKey,sForwardSecretKey:t.form.sForwardSecretKey,relaySecretKey:t.form.relaySecretKey,updaterSecretKey:t.form.updaterSecretKey}},form:{client:JSON.parse(JSON.stringify(t.form))}}):l()}))}));return(0,a.sV)((()=>{0==l.value.json.Common.client&&(l.value.step+=l.value.increment)})),{state:t,globalData:r,handleValidate:u,formDom:o}}};const Ie=(0,be.A)(De,[["render",Ue],["__scopeId","data-v-646b1688"]]);var je=Ie;const $e=e=>((0,a.Qi)("data-v-8d4253a6"),e=e(),(0,a.jt)(),e),qe=$e((()=>(0,a.Lk)("div",{class:"t-c w-100"},"端口为0则不监听",-1)));function Ne(e,l,r,t,o,u){const n=(0,a.g2)("el-form-item"),s=(0,a.g2)("el-input"),d=(0,a.g2)("el-col"),m=(0,a.g2)("el-row"),i=(0,a.g2)("el-form");return(0,a.uX)(),(0,a.CE)("div",null,[(0,a.bF)(i,{ref:"formDom",model:t.state.form,rules:t.state.rules,"label-width":"12rem"},{default:(0,a.k6)((()=>[(0,a.bF)(n,{label:"","label-width":"0"},{default:(0,a.k6)((()=>[qe])),_:1}),(0,a.bF)(n,{label:"","label-width":"0"},{default:(0,a.k6)((()=>[(0,a.bF)(m,null,{default:(0,a.k6)((()=>[(0,a.bF)(d,{span:12},{default:(0,a.k6)((()=>[(0,a.bF)(n,{label:"服务端口",prop:"servicePort"},{default:(0,a.k6)((()=>[(0,a.bF)(s,{modelValue:t.state.form.servicePort,"onUpdate:modelValue":l[0]||(l[0]=e=>t.state.form.servicePort=e)},null,8,["modelValue"])])),_:1})])),_:1}),(0,a.bF)(d,{span:12},{default:(0,a.k6)((()=>[(0,a.bF)(n,{label:"web穿透端口",prop:"webPort"},{default:(0,a.k6)((()=>[(0,a.bF)(s,{modelValue:t.state.form.webPort,"onUpdate:modelValue":l[1]||(l[1]=e=>t.state.form.webPort=e)},null,8,["modelValue"])])),_:1})])),_:1})])),_:1})])),_:1}),(0,a.bF)(n,{label:"","label-width":"0"},{default:(0,a.k6)((()=>[(0,a.bF)(m,null,{default:(0,a.k6)((()=>[(0,a.bF)(d,{span:12},{default:(0,a.k6)((()=>[(0,a.bF)(n,{label:"开放最小端口",prop:"tunnelPort1"},{default:(0,a.k6)((()=>[(0,a.bF)(s,{modelValue:t.state.form.tunnelPort1,"onUpdate:modelValue":l[2]||(l[2]=e=>t.state.form.tunnelPort1=e)},null,8,["modelValue"])])),_:1})])),_:1}),(0,a.bF)(d,{span:12},{default:(0,a.k6)((()=>[(0,a.bF)(n,{label:"开放最大端口",prop:"tunnelPort2"},{default:(0,a.k6)((()=>[(0,a.bF)(s,{modelValue:t.state.form.tunnelPort2,"onUpdate:modelValue":l[3]||(l[3]=e=>t.state.form.tunnelPort2=e)},null,8,["modelValue"])])),_:1})])),_:1})])),_:1})])),_:1}),(0,a.bF)(n,{label:"","label-width":"0"},{default:(0,a.k6)((()=>[(0,a.bF)(m,null,{default:(0,a.k6)((()=>[(0,a.bF)(d,{span:12},{default:(0,a.k6)((()=>[(0,a.bF)(n,{label:"穿透密钥",prop:"sForwardSecretKey"},{default:(0,a.k6)((()=>[(0,a.bF)(s,{modelValue:t.state.form.sForwardSecretKey,"onUpdate:modelValue":l[4]||(l[4]=e=>t.state.form.sForwardSecretKey=e),maxlength:"36","show-word-limit":""},null,8,["modelValue"])])),_:1})])),_:1}),(0,a.bF)(d,{span:12},{default:(0,a.k6)((()=>[(0,a.bF)(n,{label:"中继密钥",prop:"relaySecretKey"},{default:(0,a.k6)((()=>[(0,a.bF)(s,{modelValue:t.state.form.relaySecretKey,"onUpdate:modelValue":l[5]||(l[5]=e=>t.state.form.relaySecretKey=e),maxlength:"36","show-word-limit":""},null,8,["modelValue"])])),_:1})])),_:1})])),_:1})])),_:1}),(0,a.bF)(n,{label:"","label-width":"0"},{default:(0,a.k6)((()=>[(0,a.bF)(m,null,{default:(0,a.k6)((()=>[(0,a.bF)(d,{span:12},{default:(0,a.k6)((()=>[(0,a.bF)(n,{label:"信标密钥",prop:"signinSecretKey"},{default:(0,a.k6)((()=>[(0,a.bF)(s,{modelValue:t.state.form.signinSecretKey,"onUpdate:modelValue":l[6]||(l[6]=e=>t.state.form.signinSecretKey=e),maxlength:"36","show-word-limit":""},null,8,["modelValue"])])),_:1})])),_:1}),(0,a.bF)(d,{span:12},{default:(0,a.k6)((()=>[(0,a.bF)(n,{label:"更新密钥",prop:"updaterSecretKey"},{default:(0,a.k6)((()=>[(0,a.bF)(s,{modelValue:t.state.form.updaterSecretKey,"onUpdate:modelValue":l[7]||(l[7]=e=>t.state.form.updaterSecretKey=e),maxlength:"36","show-word-limit":""},null,8,["modelValue"])])),_:1})])),_:1})])),_:1})])),_:1})])),_:1},8,["model","rules"])])}var Oe={setup(e){const l=(0,a.WQ)("step"),r=(0,de.B)(),t=(0,me.Kh)({show:!1,form:{signinSecretKey:l.value.form.server.signinSecretKey||r.value.config.Server.SignIn.SecretKey,relaySecretKey:l.value.form.server.relaySecretKey||r.value.config.Server.Relay.SecretKey,sForwardSecretKey:l.value.form.server.sForwardSecretKey||r.value.config.Server.SForward.SecretKey,servicePort:l.value.form.server.servicePort||r.value.config.Server.ServicePort,webPort:l.value.form.server.webPort||r.value.config.Server.SForward.WebPort,tunnelPort1:l.value.form.server.tunnelPort1||r.value.config.Server.SForward.TunnelPortRange[0],tunnelPort2:l.value.form.server.tunnelPort2||r.value.config.Server.SForward.TunnelPortRange[1],updaterSecretKey:l.value.form.server.updaterSecretKey||r.value.config.Server.Updater.SecretKey},rules:{relaySecretKey:[{required:!0,message:"必填",trigger:"blur"}],sForwardSecretKey:[{required:!0,message:"必填",trigger:"blur"}],servicePort:[{required:!0,message:"必填",trigger:"blur"},{type:"number",min:0,max:65535,message:"数字 0-65535",trigger:"blur",transform(e){return Number(e)}}],webPort:[{required:!0,message:"必填",trigger:"blur"},{type:"number",min:0,max:65535,message:"数字 0-65535",trigger:"blur",transform(e){return Number(e)}}],tunnelPort1:[{required:!0,message:"必填",trigger:"blur"},{type:"number",min:0,max:65535,message:"数字 0-65535",trigger:"blur",transform(e){return Number(e)}}],tunnelPort2:[{required:!0,message:"必填",trigger:"blur"},{type:"number",min:0,max:65535,message:"数字 0-65535",trigger:"blur",transform(e){return Number(e)}}]}}),o=(0,me.KR)(null),u=()=>new Promise(((e,l)=>{o.value.validate((r=>{0==r?l():e({json:{Server:{ServicePort:+t.form.servicePort,Relay:{SecretKey:t.form.relaySecretKey},SForward:{SecretKey:t.form.sForwardSecretKey,WebPort:+t.form.webPort,TunnelPortRange:[+t.form.tunnelPort1,+t.form.tunnelPort2]},Updater:{SecretKey:t.form.updaterSecretKey},SignIn:{SecretKey:t.form.signinSecretKey}}},form:{server:JSON.parse(JSON.stringify(t.form))}})}))}));return(0,a.sV)((()=>{0!=l.value.json.Common.server&&0!=r.value.isPC||(l.value.step+=l.value.increment)})),{state:t,handleValidate:u,formDom:o}}};const Re=(0,be.A)(Oe,[["render",Ne],["__scopeId","data-v-8d4253a6"]]);var Te=Re,Be={components:{Common:Ee,Client:je,Server:Te},setup(e){const l=(0,de.B)(),r=(0,me.Kh)({steps:(0,a.EW)((()=>["选择模式",l.value.isPc?"服务端":"","客户端","完成"]))}),t=(0,me.KR)(null),o=(0,me.KR)({step:1,increment:1,json:{},form:{server:{},client:{},common:{}}});(0,a.Gt)("step",o);const u=()=>{o.value.step--,o.value.increment=-1},n=()=>{o.value.increment=1,t.value.handleValidate().then((e=>{o.value.json=Object.assign(o.value.json,e.json),o.value.form=Object.assign(o.value.form,e.form),o.value.step++})).catch((()=>{}))},s=()=>{(0,Ce.ai)(o.value.json).then((()=>{Le.nk.success("保存成功"),window.location.reload()})).catch((()=>{Le.nk.error("保存失败")}))};return{state:r,globalData:l,currentDom:t,step:o,handlePrev:u,handleNext:n,handleSave:s}}};const Je=(0,be.A)(Be,[["render",Ke],["__scopeId","data-v-ce07310a"]]);var ze=Je;const Ge={class:"t-c mgt-1"};function He(e,l,r,t,o,u){const n=(0,a.g2)("el-input"),s=(0,a.g2)("el-button");return(0,a.uX)(),(0,a.CE)("div",null,[(0,a.Lk)("div",null,[(0,a.bF)(n,{modelValue:t.state.content,"onUpdate:modelValue":l[0]||(l[0]=e=>t.state.content=e),type:"textarea",rows:10,resize:"none"},null,8,["modelValue"])]),(0,a.Lk)("div",Ge,[(0,a.bF)(s,{type:"primary",onClick:t.handleSave},{default:(0,a.k6)((()=>[(0,a.eW)("确定")])),_:1},8,["onClick"])])])}var Ye={setup(){const e=(0,me.Kh)({content:""}),l=()=>{e.content&&(0,Ce.vZ)(e.content).then((e=>{e?(Le.nk.success("保存成功"),window.location.reload()):Le.nk.error("保存失败,可能格式有误,无法解析")})).catch((()=>{Le.nk.error("保存失败")}))};return{state:e,handleSave:l}}};const Me=(0,be.A)(Ye,[["render",He]]);var Ze=Me;const el={class:"t-c w-100"};function ll(e,l,r,t,o,u){const n=(0,a.g2)("el-input"),s=(0,a.g2)("el-form-item"),d=(0,a.g2)("el-button"),m=(0,a.g2)("el-form");return(0,a.uX)(),(0,a.CE)("div",null,[(0,a.bF)(m,{ref:"formDom",model:t.state.ruleForm,rules:t.state.rules,"label-width":"auto"},{default:(0,a.k6)((()=>[(0,a.bF)(s,{label:"服务器",prop:"server"},{default:(0,a.k6)((()=>[(0,a.bF)(n,{modelValue:t.state.ruleForm.server,"onUpdate:modelValue":l[0]||(l[0]=e=>t.state.ruleForm.server=e)},null,8,["modelValue"])])),_:1}),(0,a.bF)(s,{label:"密钥",prop:"value"},{default:(0,a.k6)((()=>[(0,a.bF)(n,{modelValue:t.state.ruleForm.value,"onUpdate:modelValue":l[1]||(l[1]=e=>t.state.ruleForm.value=e)},null,8,["modelValue"])])),_:1}),(0,a.bF)(s,{label:"",prop:"Btns"},{default:(0,a.k6)((()=>[(0,a.Lk)("div",el,[(0,a.bF)(d,{type:"primary",onClick:t.handleSave},{default:(0,a.k6)((()=>[(0,a.eW)("确认")])),_:1},8,["onClick"])])])),_:1})])),_:1},8,["model","rules"])])}var rl={setup(){const e=(0,me.Kh)({ruleForm:{server:"",value:""},rules:{server:[{required:!0,message:"必填",trigger:"blur"}],value:[{required:!0,message:"必填",trigger:"blur"}]}}),l=(0,me.KR)(null),r=()=>{l.value.validate((l=>{l&&(0,Ce.D3)(e.ruleForm).then((e=>{e?(Le.nk.success("保存成功"),window.location.reload()):Le.nk.error("保存失败,可能服务器或者密钥不正确,或者密钥已被使用")})).catch((()=>{Le.nk.error("保存失败")}))}))};return{state:e,formDom:l,handleSave:r}}};const al=(0,be.A)(rl,[["render",ll]]);var tl=al,ol={components:{Input:ze,Copy:Ze,Save:tl},setup(e){const l=(0,de.B)(),r=(0,me.Kh)({show:0==l.value.config.Common.Install});return{state:r,globalData:l}}};const ul=(0,be.A)(ol,[["render",he]]);var nl=ul,sl={name:"Index",components:{Head:ke,Status:Fe.A,Install:nl},setup(e){const l=(0,de.B)(),r=(0,ve.rd)(),t=(0,me.KR)(null),o=()=>{(0,a.dY)((()=>{l.value.height=t.value.offsetHeight,l.value.width=window.innerWidth}))};return(0,a.sV)((()=>{0==l.value.hasAccess("FullManager")&&r.push({name:"NoPermission"}),window.addEventListener("resize",o),o()})),(0,a.hi)((()=>{window.removeEventListener("resize",o)})),{wrap:t}}};const dl=(0,be.A)(sl,[["render",d],["__scopeId","data-v-59076a44"]]);var ml=dl}}]);
\ No newline at end of file
+"use strict";(self["webpackChunklinker_web"]=self["webpackChunklinker_web"]||[]).push([[537],{146:function(e,l,r){r.r(l),r.d(l,{default:function(){return ml}});var a=r(6768);const t={class:"app-wrap flex flex-column flex-nowrap",id:"app-wrap"},o={class:"head"},u={class:"body flex-1 relative",ref:"wrap"},n={class:"home absolute"},s={class:"status"};function d(e,l,r,d,m,i){const c=(0,a.g2)("Head"),f=(0,a.g2)("router-view"),v=(0,a.g2)("Status"),p=(0,a.g2)("Install");return(0,a.uX)(),(0,a.CE)("div",t,[(0,a.Lk)("div",o,[(0,a.bF)(c)]),(0,a.Lk)("div",u,[(0,a.Lk)("div",n,[(0,a.bF)(f)])],512),(0,a.Lk)("div",s,[(0,a.bF)(v,{config:!0}),(0,a.bF)(p)])])}r(4114);var m=r(4232),i=r.p+"img/logo.c20f799b.png",c=r.p+"img/shouye.4c820c0e.svg",f=r.p+"img/fuwuqi.3b385506.svg",v=r.p+"img/dadong.e6fd78bf.svg",p=r.p+"img/login.0201d499.svg",b=r.p+"img/anquan.5f8d5e47.svg",g=r.p+"img/rizhi.c3ca751b.svg",k=r.p+"img/shuaxin2.b46145e2.svg";const F=e=>((0,a.Qi)("data-v-f2838cec"),e=e(),(0,a.jt)(),e),h={class:"head flex"},w={class:"logo"},y=F((()=>(0,a.Lk)("img",{src:i,alt:""},null,-1))),_={class:"menu flex-1"},S={key:0,class:"flex"},V=F((()=>(0,a.Lk)("img",{src:c},null,-1))),K={key:0},C=F((()=>(0,a.Lk)("img",{src:f},null,-1))),L={key:1},P=F((()=>(0,a.Lk)("img",{src:v},null,-1))),x={key:2},W=F((()=>(0,a.Lk)("img",{src:p},null,-1))),X={key:3},E=F((()=>(0,a.Lk)("img",{src:b},null,-1))),Q={key:4},A=F((()=>(0,a.Lk)("img",{src:g},null,-1))),U={key:1,class:"flex"},D={key:0},I=F((()=>(0,a.Lk)("img",{src:c},null,-1))),j={key:1},$=F((()=>(0,a.Lk)("img",{src:f},null,-1))),q={key:2},N=F((()=>(0,a.Lk)("img",{src:v},null,-1))),O={key:3},R=F((()=>(0,a.Lk)("img",{src:p},null,-1))),T={key:4},B=F((()=>(0,a.Lk)("img",{src:b},null,-1))),J={key:5},z=F((()=>(0,a.Lk)("img",{src:g},null,-1))),G=F((()=>(0,a.Lk)("img",{src:k},null,-1))),H={key:0,class:"select"},Y={class:"el-dropdown-link"},M=F((()=>(0,a.Lk)("img",{src:c,height:"20",style:{"vertical-align":"text-top"}},null,-1))),Z=F((()=>(0,a.Lk)("img",{src:f,height:"20",style:{"vertical-align":"text-top"}},null,-1))),ee=F((()=>(0,a.Lk)("img",{src:v,height:"20",style:{"vertical-align":"text-top"}},null,-1))),le=F((()=>(0,a.Lk)("img",{src:p,height:"20",style:{"vertical-align":"text-top"}},null,-1))),re=F((()=>(0,a.Lk)("img",{src:b,height:"20",style:{"vertical-align":"text-top"}},null,-1))),ae=F((()=>(0,a.Lk)("img",{src:g,height:"20",style:{"vertical-align":"text-top"}},null,-1))),te={key:1,class:"locale"},oe={class:"el-dropdown-link"},ue={key:2,class:"image"};function ne(e,l,r,t,o,u){const n=(0,a.g2)("router-link"),s=(0,a.g2)("Operation"),d=(0,a.g2)("el-icon"),i=(0,a.g2)("el-dropdown-item"),c=(0,a.g2)("el-dropdown-menu"),f=(0,a.g2)("el-dropdown"),v=(0,a.g2)("ArrowDown"),p=(0,a.g2)("Background");return(0,a.uX)(),(0,a.CE)("div",null,[(0,a.Lk)("div",h,[(0,a.Lk)("div",w,[(0,a.bF)(n,{to:{name:"FullIndex"}},{default:(0,a.k6)((()=>[y])),_:1})]),(0,a.Lk)("div",_,[t.globalData.isPc?((0,a.uX)(),(0,a.CE)("ul",S,[(0,a.Lk)("li",null,[(0,a.bF)(n,{to:{name:"FullIndex"}},{default:(0,a.k6)((()=>[V,(0,a.Lk)("span",null,(0,m.v_)(e.$t("head.home")),1)])),_:1})]),t.hasConfig?((0,a.uX)(),(0,a.CE)("li",K,[(0,a.bF)(n,{to:{name:"FullServers"}},{default:(0,a.k6)((()=>[C,(0,a.Lk)("span",null,(0,m.v_)(e.$t("head.server")),1)])),_:1})])):(0,a.Q3)("",!0),t.hasTransport?((0,a.uX)(),(0,a.CE)("li",L,[(0,a.bF)(n,{to:{name:"FullTransport"}},{default:(0,a.k6)((()=>[P,(0,a.Lk)("span",null,(0,m.v_)(e.$t("head.protocol")),1)])),_:1})])):(0,a.Q3)("",!0),t.hasAction?((0,a.uX)(),(0,a.CE)("li",x,[(0,a.bF)(n,{to:{name:"FullAction"}},{default:(0,a.k6)((()=>[W,(0,a.Lk)("span",null,(0,m.v_)(e.$t("head.action")),1)])),_:1})])):(0,a.Q3)("",!0),t.hasFirewall?((0,a.uX)(),(0,a.CE)("li",X,[(0,a.bF)(n,{to:{name:"FullFirewall"}},{default:(0,a.k6)((()=>[E,(0,a.Lk)("span",null,(0,m.v_)(e.$t("head.firewall")),1)])),_:1})])):(0,a.Q3)("",!0),t.hasLogger?((0,a.uX)(),(0,a.CE)("li",Q,[(0,a.bF)(n,{to:{name:"FullLogger"}},{default:(0,a.k6)((()=>[A,(0,a.Lk)("span",null,(0,m.v_)(e.$t("head.logger")),1)])),_:1})])):(0,a.Q3)("",!0)])):((0,a.uX)(),(0,a.CE)("ul",U,["FullIndex"==t.route.name?((0,a.uX)(),(0,a.CE)("li",D,[(0,a.bF)(n,{to:{name:"FullIndex"}},{default:(0,a.k6)((()=>[I,(0,a.Lk)("span",null,(0,m.v_)(e.$t("head.home")),1)])),_:1})])):(0,a.Q3)("",!0),t.hasConfig&&"FullServers"==t.route.name?((0,a.uX)(),(0,a.CE)("li",j,[(0,a.bF)(n,{to:{name:"FullServers"}},{default:(0,a.k6)((()=>[$,(0,a.Lk)("span",null,(0,m.v_)(e.$t("head.server")),1)])),_:1})])):(0,a.Q3)("",!0),t.hasTransport&&"FullTransport"==t.route.name?((0,a.uX)(),(0,a.CE)("li",q,[(0,a.bF)(n,{to:{name:"FullTransport"}},{default:(0,a.k6)((()=>[N,(0,a.Lk)("span",null,(0,m.v_)(e.$t("head.protocol")),1)])),_:1})])):(0,a.Q3)("",!0),t.hasAction&&"FullAction"==t.route.name?((0,a.uX)(),(0,a.CE)("li",O,[(0,a.bF)(n,{to:{name:"FullAction"}},{default:(0,a.k6)((()=>[R,(0,a.Lk)("span",null,(0,m.v_)(e.$t("head.action")),1)])),_:1})])):(0,a.Q3)("",!0),t.hasFirewall&&"FullFirewall"==t.route.name?((0,a.uX)(),(0,a.CE)("li",T,[(0,a.bF)(n,{to:{name:"FullFirewall"}},{default:(0,a.k6)((()=>[B,(0,a.Lk)("span",null,(0,m.v_)(e.$t("head.firewall")),1)])),_:1})])):(0,a.Q3)("",!0),t.hasLogger&&"FullLogger"==t.route.name?((0,a.uX)(),(0,a.CE)("li",J,[(0,a.bF)(n,{to:{name:"FullLogger"}},{default:(0,a.k6)((()=>[z,(0,a.eW)(),(0,a.Lk)("span",null,(0,m.v_)(e.$t("head.logger")),1)])),_:1})])):(0,a.Q3)("",!0),(0,a.Lk)("li",null,[(0,a.Lk)("a",{href:"javascript:void(0);",onClick:l[0]||(l[0]=(...e)=>t.refresh&&t.refresh(...e))},[G,(0,a.Lk)("span",null,(0,m.v_)(e.$t("head.refresh")),1)])])]))]),t.globalData.isPhone?((0,a.uX)(),(0,a.CE)("div",H,[(0,a.bF)(f,null,{dropdown:(0,a.k6)((()=>[(0,a.bF)(c,{class:"select-menu"},{default:(0,a.k6)((()=>[(0,a.bF)(i,null,{default:(0,a.k6)((()=>[(0,a.bF)(n,{to:{name:"FullIndex"}},{default:(0,a.k6)((()=>[M,(0,a.eW)(" "+(0,m.v_)(e.$t("head.home")),1)])),_:1})])),_:1}),t.hasConfig?((0,a.uX)(),(0,a.Wv)(i,{key:0},{default:(0,a.k6)((()=>[(0,a.bF)(n,{to:{name:"FullServers"}},{default:(0,a.k6)((()=>[Z,(0,a.eW)(" "+(0,m.v_)(e.$t("head.server")),1)])),_:1})])),_:1})):(0,a.Q3)("",!0),t.hasTransport?((0,a.uX)(),(0,a.Wv)(i,{key:1},{default:(0,a.k6)((()=>[(0,a.bF)(n,{to:{name:"FullTransport"}},{default:(0,a.k6)((()=>[ee,(0,a.eW)(" "+(0,m.v_)(e.$t("head.protocol")),1)])),_:1})])),_:1})):(0,a.Q3)("",!0),t.hasAction?((0,a.uX)(),(0,a.Wv)(i,{key:2},{default:(0,a.k6)((()=>[(0,a.bF)(n,{to:{name:"FullAction"}},{default:(0,a.k6)((()=>[le,(0,a.eW)(" "+(0,m.v_)(e.$t("head.action")),1)])),_:1})])),_:1})):(0,a.Q3)("",!0),t.hasFirewall?((0,a.uX)(),(0,a.Wv)(i,{key:3},{default:(0,a.k6)((()=>[(0,a.bF)(n,{to:{name:"FullFirewall"}},{default:(0,a.k6)((()=>[re,(0,a.eW)(" "+(0,m.v_)(e.$t("head.firewall")),1)])),_:1})])),_:1})):(0,a.Q3)("",!0),t.hasLogger?((0,a.uX)(),(0,a.Wv)(i,{key:4},{default:(0,a.k6)((()=>[(0,a.bF)(n,{to:{name:"FullLogger"}},{default:(0,a.k6)((()=>[ae,(0,a.eW)(" "+(0,m.v_)(e.$t("head.logger")),1)])),_:1})])),_:1})):(0,a.Q3)("",!0)])),_:1})])),default:(0,a.k6)((()=>[(0,a.Lk)("span",Y,[(0,a.bF)(d,null,{default:(0,a.k6)((()=>[(0,a.bF)(s)])),_:1})])])),_:1})])):(0,a.Q3)("",!0),t.globalData.isPc?((0,a.uX)(),(0,a.CE)("div",te,[(0,a.bF)(f,null,{dropdown:(0,a.k6)((()=>[(0,a.bF)(c,null,{default:(0,a.k6)((()=>[((0,a.uX)(!0),(0,a.CE)(a.FK,null,(0,a.pI)(t.localeOptions,((e,l)=>((0,a.uX)(),(0,a.Wv)(i,{onClick:e=>t.handleLocale(l)},{default:(0,a.k6)((()=>[(0,a.eW)((0,m.v_)(e),1)])),_:2},1032,["onClick"])))),256))])),_:1})])),default:(0,a.k6)((()=>[(0,a.Lk)("span",oe,[(0,a.eW)((0,m.v_)(t.localeOptions[t.locale])+" ",1),(0,a.bF)(d,null,{default:(0,a.k6)((()=>[(0,a.bF)(v)])),_:1})])])),_:1})])):(0,a.Q3)("",!0),t.globalData.isPc?((0,a.uX)(),(0,a.CE)("div",ue,[(0,a.bF)(p,{name:"full"})])):(0,a.Q3)("",!0)])])}var se=r(7477),de=r(3830),me=r(144),ie=r(5096),ce=r(9287),fe=r(2773),ve=r(1387),pe={components:{Background:ie.A,Operation:se.IaS,ArrowDown:se.yd$},setup(){const e=(0,ve.lq)(),l=(0,de.B)(),r=(0,a.EW)((()=>l.value.hasAccess("Config"))),t=(0,a.EW)((()=>l.value.hasAccess("LoggerShow"))),o=(0,a.EW)((()=>l.value.hasAccess("Transport"))),u=(0,a.EW)((()=>l.value.hasAccess("Action"))),n=(0,a.EW)((()=>l.value.hasAccess("Group"))),s=(0,a.EW)((()=>l.value.hasAccess("FirewallSelf"))),d=(0,me.KR)(ce.Y),{changeLocale:m,currentLocale:i}=(0,fe.A)(),c=(0,a.EW)({get(){return i.value},set(e){m(e)}}),f=e=>{c.value=e},v=()=>{window.location.reload()};return{route:e,globalData:l,hasConfig:r,hasGroup:n,hasLogger:t,hasTransport:o,hasAction:u,hasFirewall:s,localeOptions:d,locale:c,handleLocale:f,refresh:v}}},be=r(1241);const ge=(0,be.A)(pe,[["render",ne],["__scopeId","data-v-f2838cec"]]);var ke=ge,Fe=r(1337);function he(e,l,r,t,o,u){const n=(0,a.g2)("Input"),s=(0,a.g2)("el-tab-pane"),d=(0,a.g2)("Copy"),m=(0,a.g2)("Save"),i=(0,a.g2)("el-tabs"),c=(0,a.g2)("el-dialog");return(0,a.uX)(),(0,a.CE)("div",null,[(0,a.bF)(c,{modelValue:t.state.show,"onUpdate:modelValue":l[0]||(l[0]=e=>t.state.show=e),title:"初始化配置",width:"700",top:"2vh"},{default:(0,a.k6)((()=>[(0,a.Lk)("div",null,[(0,a.bF)(i,{type:"border-card"},{default:(0,a.k6)((()=>[(0,a.bF)(s,{label:"手动输入"},{default:(0,a.k6)((()=>[(0,a.bF)(n)])),_:1}),(0,a.bF)(s,{label:"粘贴配置"},{default:(0,a.k6)((()=>[(0,a.bF)(d)])),_:1}),(0,a.bF)(s,{label:"在线导入"},{default:(0,a.k6)((()=>[(0,a.bF)(m)])),_:1})])),_:1})])])),_:1},8,["modelValue"])])}const we=e=>((0,a.Qi)("data-v-ce07310a"),e=e(),(0,a.jt)(),e),ye={class:"head"},_e={class:"body"},Se=we((()=>(0,a.Lk)("div",{class:"t-c"},"完成保存后,请重启软件",-1))),Ve={class:"footer t-c"};function Ke(e,l,r,t,o,u){const n=(0,a.g2)("el-step"),s=(0,a.g2)("el-steps"),d=(0,a.g2)("Common"),m=(0,a.g2)("el-card"),i=(0,a.g2)("Server"),c=(0,a.g2)("Client"),f=(0,a.g2)("el-button");return(0,a.uX)(),(0,a.CE)("div",null,[(0,a.Lk)("div",ye,[(0,a.bF)(s,{active:t.step.step,"finish-status":"success"},{default:(0,a.k6)((()=>[((0,a.uX)(!0),(0,a.CE)(a.FK,null,(0,a.pI)(t.state.steps,((e,l)=>((0,a.uX)(),(0,a.Wv)(n,{title:e},null,8,["title"])))),256))])),_:1},8,["active"])]),(0,a.Lk)("div",_e,[1==t.step.step?((0,a.uX)(),(0,a.Wv)(m,{key:0,shadow:"never"},{default:(0,a.k6)((()=>[(0,a.bF)(d,{ref:"currentDom"},null,512)])),_:1})):(0,a.Q3)("",!0),2==t.step.step?((0,a.uX)(),(0,a.Wv)(m,{key:1,shadow:"never"},{default:(0,a.k6)((()=>[(0,a.bF)(i,{ref:"currentDom"},null,512)])),_:1})):(0,a.Q3)("",!0),3==t.step.step?((0,a.uX)(),(0,a.Wv)(m,{key:2,shadow:"never"},{default:(0,a.k6)((()=>[(0,a.bF)(c,{ref:"currentDom"},null,512)])),_:1})):(0,a.Q3)("",!0),4==t.step.step?((0,a.uX)(),(0,a.Wv)(m,{key:3,shadow:"never"},{default:(0,a.k6)((()=>[Se])),_:1})):(0,a.Q3)("",!0)]),(0,a.Lk)("div",Ve,[(0,a.bF)(f,{disabled:t.step.step<=1,onClick:t.handlePrev},{default:(0,a.k6)((()=>[(0,a.eW)("上一步")])),_:1},8,["disabled","onClick"]),t.step.step[(0,a.eW)("下一步")])),_:1},8,["onClick"])):((0,a.uX)(),(0,a.Wv)(f,{key:1,type:"primary",onClick:t.handleSave},{default:(0,a.k6)((()=>[(0,a.eW)("完成")])),_:1},8,["onClick"]))])])}var Ce=r(8835),Le=r(1219);const Pe={class:"t-c"};function xe(e,l,r,t,o,u){const n=(0,a.g2)("el-checkbox");return(0,a.uX)(),(0,a.CE)("div",Pe,[(0,a.bF)(n,{modelValue:t.state.form.client,"onUpdate:modelValue":l[0]||(l[0]=e=>t.state.form.client=e),label:"作为客户端"},null,8,["modelValue"]),t.globalData.isPc?((0,a.uX)(),(0,a.Wv)(n,{key:0,modelValue:t.state.form.server,"onUpdate:modelValue":l[1]||(l[1]=e=>t.state.form.server=e),label:"作为服务端"},null,8,["modelValue"])):(0,a.Q3)("",!0)])}var We={name:"Common",setup(){const e=(0,de.B)(),l=(0,a.WQ)("step"),r=(0,me.Kh)({form:{client:l.value.form.common.client||l.value.json.Common&&l.value.json.Common.client||!0,server:l.value.form.common.server||l.value.json.Common&&l.value.json.Common.server||!1}}),t=e=>new Promise(((e,l)=>{r.form.client||r.form.server?e({json:{Common:{client:r.form.client,server:r.form.server,modes:[r.form.client?"client":"",r.form.server?"server":""].filter((e=>!!e))}},form:{common:JSON.parse(JSON.stringify(r.form))}}):(Le.nk.error("请选择客户端或服务端"),l())}));return{state:r,globalData:e,handleValidate:t}}};const Xe=(0,be.A)(We,[["render",xe]]);var Ee=Xe;const Qe=e=>((0,a.Qi)("data-v-646b1688"),e=e(),(0,a.jt)(),e),Ae=Qe((()=>(0,a.Lk)("div",{class:"t-c w-100"},[(0,a.Lk)("p",null,"端口为0不监听,相同分组之间的客户端相互可见")],-1)));function Ue(e,l,r,t,o,u){const n=(0,a.g2)("el-form-item"),s=(0,a.g2)("el-input"),d=(0,a.g2)("el-col"),m=(0,a.g2)("el-row"),i=(0,a.g2)("el-checkbox"),c=(0,a.g2)("el-form");return(0,a.uX)(),(0,a.CE)("div",null,[(0,a.bF)(c,{ref:"formDom",model:t.state.form,rules:t.state.rules,"label-width":"8rem"},{default:(0,a.k6)((()=>[(0,a.bF)(n,{label:"","label-width":"0"},{default:(0,a.k6)((()=>[Ae])),_:1}),(0,a.bF)(n,{label:"","label-width":"0"},{default:(0,a.k6)((()=>[(0,a.bF)(m,null,{default:(0,a.k6)((()=>[(0,a.bF)(d,{sm:12,xs:24},{default:(0,a.k6)((()=>[(0,a.bF)(n,{label:"机器名",prop:"name"},{default:(0,a.k6)((()=>[(0,a.bF)(s,{modelValue:t.state.form.name,"onUpdate:modelValue":l[0]||(l[0]=e=>t.state.form.name=e),maxlength:"32","show-word-limit":""},null,8,["modelValue"])])),_:1})])),_:1}),t.globalData.isPc?((0,a.uX)(),(0,a.Wv)(d,{key:0,sm:12,xs:24},{default:(0,a.k6)((()=>[(0,a.bF)(n,{label:"网页端口",prop:"web"},{default:(0,a.k6)((()=>[(0,a.bF)(s,{modelValue:t.state.form.web,"onUpdate:modelValue":l[1]||(l[1]=e=>t.state.form.web=e)},null,8,["modelValue"])])),_:1})])),_:1})):(0,a.Q3)("",!0)])),_:1})])),_:1}),t.globalData.isPc?((0,a.uX)(),(0,a.Wv)(n,{key:0,label:"","label-width":"0"},{default:(0,a.k6)((()=>[(0,a.bF)(m,null,{default:(0,a.k6)((()=>[(0,a.bF)(d,{sm:12,xs:24},{default:(0,a.k6)((()=>[(0,a.bF)(n,{label:"接口端口",prop:"api"},{default:(0,a.k6)((()=>[(0,a.bF)(s,{modelValue:t.state.form.api,"onUpdate:modelValue":l[2]||(l[2]=e=>t.state.form.api=e)},null,8,["modelValue"])])),_:1})])),_:1}),(0,a.bF)(d,{sm:12,xs:24},{default:(0,a.k6)((()=>[(0,a.bF)(n,{label:"接口密码",prop:"password"},{default:(0,a.k6)((()=>[(0,a.bF)(s,{type:"password",modelValue:t.state.form.password,"onUpdate:modelValue":l[3]||(l[3]=e=>t.state.form.password=e),"show-password":"",maxlength:"36","show-word-limit":""},null,8,["modelValue"])])),_:1})])),_:1})])),_:1})])),_:1})):(0,a.Q3)("",!0),(0,a.bF)(n,{label:"","label-width":"0"},{default:(0,a.k6)((()=>[(0,a.bF)(m,null,{default:(0,a.k6)((()=>[(0,a.bF)(d,{sm:12,xs:24},{default:(0,a.k6)((()=>[(0,a.bF)(n,{label:"分组名",prop:"groupid"},{default:(0,a.k6)((()=>[(0,a.bF)(s,{modelValue:t.state.form.groupid,"onUpdate:modelValue":l[4]||(l[4]=e=>t.state.form.groupid=e),maxlength:"36","show-word-limit":""},null,8,["modelValue"])])),_:1})])),_:1}),(0,a.bF)(d,{sm:12,xs:24},{default:(0,a.k6)((()=>[(0,a.bF)(n,{label:"分组密码",prop:"groupPassword"},{default:(0,a.k6)((()=>[(0,a.bF)(s,{modelValue:t.state.form.groupPassword,"onUpdate:modelValue":l[5]||(l[5]=e=>t.state.form.groupPassword=e),type:"password","show-password":"",maxlength:"36","show-word-limit":""},null,8,["modelValue"])])),_:1})])),_:1})])),_:1})])),_:1}),(0,a.bF)(n,{label:"","label-width":"0"},{default:(0,a.k6)((()=>[(0,a.bF)(m,null,{default:(0,a.k6)((()=>[(0,a.bF)(d,{span:24},{default:(0,a.k6)((()=>[(0,a.bF)(n,{"label-width":"8rem",prop:"hasServer"},{default:(0,a.k6)((()=>[(0,a.bF)(i,{modelValue:t.state.form.hasServer,"onUpdate:modelValue":l[6]||(l[6]=e=>t.state.form.hasServer=e),label:"我有服务器(私有部署)",size:"large"},null,8,["modelValue"])])),_:1})])),_:1})])),_:1})])),_:1}),t.state.form.hasServer?((0,a.uX)(),(0,a.Wv)(n,{key:1,label:"","label-width":"0"},{default:(0,a.k6)((()=>[(0,a.bF)(m,null,{default:(0,a.k6)((()=>[(0,a.bF)(d,{sm:12,xs:24},{default:(0,a.k6)((()=>[(0,a.bF)(n,{label:"信标服务",prop:"server"},{default:(0,a.k6)((()=>[(0,a.bF)(s,{modelValue:t.state.form.server,"onUpdate:modelValue":l[7]||(l[7]=e=>t.state.form.server=e)},null,8,["modelValue"])])),_:1})])),_:1}),(0,a.bF)(d,{sm:12,xs:24},{default:(0,a.k6)((()=>[(0,a.bF)(n,{label:"信标密钥",prop:"serverSecretKey"},{default:(0,a.k6)((()=>[(0,a.bF)(s,{modelValue:t.state.form.serverSecretKey,"onUpdate:modelValue":l[8]||(l[8]=e=>t.state.form.serverSecretKey=e),maxlength:"36","show-word-limit":""},null,8,["modelValue"])])),_:1})])),_:1})])),_:1})])),_:1})):(0,a.Q3)("",!0),t.state.form.hasServer?((0,a.uX)(),(0,a.Wv)(n,{key:2,label:"","label-width":"0"},{default:(0,a.k6)((()=>[(0,a.bF)(m,null,{default:(0,a.k6)((()=>[(0,a.bF)(d,{sm:12,xs:24},{default:(0,a.k6)((()=>[(0,a.bF)(n,{label:"穿透密钥",prop:"sForwardSecretKey"},{default:(0,a.k6)((()=>[(0,a.bF)(s,{modelValue:t.state.form.sForwardSecretKey,"onUpdate:modelValue":l[9]||(l[9]=e=>t.state.form.sForwardSecretKey=e),maxlength:"36","show-word-limit":""},null,8,["modelValue"])])),_:1})])),_:1}),(0,a.bF)(d,{sm:12,xs:24},{default:(0,a.k6)((()=>[(0,a.bF)(n,{label:"中继密钥",prop:"relaySecretKey"},{default:(0,a.k6)((()=>[(0,a.bF)(s,{modelValue:t.state.form.relaySecretKey,"onUpdate:modelValue":l[10]||(l[10]=e=>t.state.form.relaySecretKey=e),maxlength:"36","show-word-limit":""},null,8,["modelValue"])])),_:1})])),_:1})])),_:1})])),_:1})):(0,a.Q3)("",!0),t.state.form.hasServer?((0,a.uX)(),(0,a.Wv)(n,{key:3,label:"","label-width":"0"},{default:(0,a.k6)((()=>[(0,a.bF)(m,null,{default:(0,a.k6)((()=>[(0,a.bF)(d,{sm:12,xs:24},{default:(0,a.k6)((()=>[(0,a.bF)(n,{label:"更新密钥",prop:"updaterSecretKey"},{default:(0,a.k6)((()=>[(0,a.bF)(s,{modelValue:t.state.form.updaterSecretKey,"onUpdate:modelValue":l[11]||(l[11]=e=>t.state.form.updaterSecretKey=e),maxlength:"36","show-word-limit":""},null,8,["modelValue"])])),_:1})])),_:1}),t.globalData.isPc?((0,a.uX)(),(0,a.Wv)(d,{key:0,sm:12,xs:24},{default:(0,a.k6)((()=>[(0,a.bF)(n,{label:"占位"},{default:(0,a.k6)((()=>[(0,a.bF)(s,{disabled:"",maxlength:"36","show-word-limit":""})])),_:1})])),_:1})):(0,a.Q3)("",!0)])),_:1})])),_:1})):(0,a.Q3)("",!0)])),_:1},8,["model","rules"])])}var De={setup(e){const l=(0,a.WQ)("step"),r=(0,de.B)(),t=(0,me.Kh)({form:{name:l.value.form.client.name||r.value.config.Client.Name,groupid:l.value.form.client.groupid||r.value.config.Client.Group.Id,groupPassword:l.value.form.client.groupPassword||r.value.config.Client.Group.Password,api:l.value.form.client.api||r.value.config.Client.CApi.ApiPort,web:l.value.form.client.web||r.value.config.Client.CApi.WebPort,password:l.value.form.client.password||r.value.config.Client.CApi.ApiPassword,hasServer:l.value.form.client.hasServer||!1,server:l.value.form.client.server||r.value.config.Client.Server.Host,serverSecretKey:l.value.form.client.serverSecretKey||r.value.config.Client.ServerSecretKey,sForwardSecretKey:l.value.form.client.sForwardSecretKey||r.value.config.Client.SForward.SecretKey,relaySecretKey:l.value.form.client.relaySecretKey||(r.value.config.Client.Relay.Servers[0]||{SecretKey:"snltty"}).SecretKey,updaterSecretKey:l.value.form.client.updaterSecretKey||r.value.config.Client.Updater.SecretKey},rules:{name:[{required:!0,message:"必填",trigger:"blur"}],groupid:[{required:!0,message:"必填",trigger:"blur"}],groupPassword:[{required:!0,message:"必填",trigger:"blur"}],password:[{required:!0,message:"必填",trigger:"blur"}],api:[{required:!0,message:"必填",trigger:"blur"},{type:"number",min:0,max:65535,message:"数字 0-65535",trigger:"blur",transform(e){return Number(e)}}],web:[{required:!0,message:"必填",trigger:"blur"},{type:"number",min:0,max:65535,message:"数字 0-65535",trigger:"blur",transform(e){return Number(e)}}]}}),o=(0,me.KR)(null),u=()=>new Promise(((e,l)=>{o.value.validate((r=>{r?e({json:{Client:{name:t.form.name,groupid:t.form.groupid,groupPassword:t.form.groupPassword,api:+t.form.api,web:+t.form.web,password:t.form.password,hasServer:t.form.hasServer,server:t.form.server,serverSecretKey:t.form.serverSecretKey,sForwardSecretKey:t.form.sForwardSecretKey,relaySecretKey:t.form.relaySecretKey,updaterSecretKey:t.form.updaterSecretKey}},form:{client:JSON.parse(JSON.stringify(t.form))}}):l()}))}));return(0,a.sV)((()=>{0==l.value.json.Common.client&&(l.value.step+=l.value.increment)})),{state:t,globalData:r,handleValidate:u,formDom:o}}};const Ie=(0,be.A)(De,[["render",Ue],["__scopeId","data-v-646b1688"]]);var je=Ie;const $e=e=>((0,a.Qi)("data-v-8d4253a6"),e=e(),(0,a.jt)(),e),qe=$e((()=>(0,a.Lk)("div",{class:"t-c w-100"},"端口为0则不监听",-1)));function Ne(e,l,r,t,o,u){const n=(0,a.g2)("el-form-item"),s=(0,a.g2)("el-input"),d=(0,a.g2)("el-col"),m=(0,a.g2)("el-row"),i=(0,a.g2)("el-form");return(0,a.uX)(),(0,a.CE)("div",null,[(0,a.bF)(i,{ref:"formDom",model:t.state.form,rules:t.state.rules,"label-width":"12rem"},{default:(0,a.k6)((()=>[(0,a.bF)(n,{label:"","label-width":"0"},{default:(0,a.k6)((()=>[qe])),_:1}),(0,a.bF)(n,{label:"","label-width":"0"},{default:(0,a.k6)((()=>[(0,a.bF)(m,null,{default:(0,a.k6)((()=>[(0,a.bF)(d,{span:12},{default:(0,a.k6)((()=>[(0,a.bF)(n,{label:"服务端口",prop:"servicePort"},{default:(0,a.k6)((()=>[(0,a.bF)(s,{modelValue:t.state.form.servicePort,"onUpdate:modelValue":l[0]||(l[0]=e=>t.state.form.servicePort=e)},null,8,["modelValue"])])),_:1})])),_:1}),(0,a.bF)(d,{span:12},{default:(0,a.k6)((()=>[(0,a.bF)(n,{label:"web穿透端口",prop:"webPort"},{default:(0,a.k6)((()=>[(0,a.bF)(s,{modelValue:t.state.form.webPort,"onUpdate:modelValue":l[1]||(l[1]=e=>t.state.form.webPort=e)},null,8,["modelValue"])])),_:1})])),_:1})])),_:1})])),_:1}),(0,a.bF)(n,{label:"","label-width":"0"},{default:(0,a.k6)((()=>[(0,a.bF)(m,null,{default:(0,a.k6)((()=>[(0,a.bF)(d,{span:12},{default:(0,a.k6)((()=>[(0,a.bF)(n,{label:"开放最小端口",prop:"tunnelPort1"},{default:(0,a.k6)((()=>[(0,a.bF)(s,{modelValue:t.state.form.tunnelPort1,"onUpdate:modelValue":l[2]||(l[2]=e=>t.state.form.tunnelPort1=e)},null,8,["modelValue"])])),_:1})])),_:1}),(0,a.bF)(d,{span:12},{default:(0,a.k6)((()=>[(0,a.bF)(n,{label:"开放最大端口",prop:"tunnelPort2"},{default:(0,a.k6)((()=>[(0,a.bF)(s,{modelValue:t.state.form.tunnelPort2,"onUpdate:modelValue":l[3]||(l[3]=e=>t.state.form.tunnelPort2=e)},null,8,["modelValue"])])),_:1})])),_:1})])),_:1})])),_:1}),(0,a.bF)(n,{label:"","label-width":"0"},{default:(0,a.k6)((()=>[(0,a.bF)(m,null,{default:(0,a.k6)((()=>[(0,a.bF)(d,{span:12},{default:(0,a.k6)((()=>[(0,a.bF)(n,{label:"穿透密钥",prop:"sForwardSecretKey"},{default:(0,a.k6)((()=>[(0,a.bF)(s,{modelValue:t.state.form.sForwardSecretKey,"onUpdate:modelValue":l[4]||(l[4]=e=>t.state.form.sForwardSecretKey=e),maxlength:"36","show-word-limit":""},null,8,["modelValue"])])),_:1})])),_:1}),(0,a.bF)(d,{span:12},{default:(0,a.k6)((()=>[(0,a.bF)(n,{label:"中继密钥",prop:"relaySecretKey"},{default:(0,a.k6)((()=>[(0,a.bF)(s,{modelValue:t.state.form.relaySecretKey,"onUpdate:modelValue":l[5]||(l[5]=e=>t.state.form.relaySecretKey=e),maxlength:"36","show-word-limit":""},null,8,["modelValue"])])),_:1})])),_:1})])),_:1})])),_:1}),(0,a.bF)(n,{label:"","label-width":"0"},{default:(0,a.k6)((()=>[(0,a.bF)(m,null,{default:(0,a.k6)((()=>[(0,a.bF)(d,{span:12},{default:(0,a.k6)((()=>[(0,a.bF)(n,{label:"信标密钥",prop:"signinSecretKey"},{default:(0,a.k6)((()=>[(0,a.bF)(s,{modelValue:t.state.form.signinSecretKey,"onUpdate:modelValue":l[6]||(l[6]=e=>t.state.form.signinSecretKey=e),maxlength:"36","show-word-limit":""},null,8,["modelValue"])])),_:1})])),_:1}),(0,a.bF)(d,{span:12},{default:(0,a.k6)((()=>[(0,a.bF)(n,{label:"更新密钥",prop:"updaterSecretKey"},{default:(0,a.k6)((()=>[(0,a.bF)(s,{modelValue:t.state.form.updaterSecretKey,"onUpdate:modelValue":l[7]||(l[7]=e=>t.state.form.updaterSecretKey=e),maxlength:"36","show-word-limit":""},null,8,["modelValue"])])),_:1})])),_:1})])),_:1})])),_:1})])),_:1},8,["model","rules"])])}var Oe={setup(e){const l=(0,a.WQ)("step"),r=(0,de.B)(),t=(0,me.Kh)({show:!1,form:{signinSecretKey:l.value.form.server.signinSecretKey||r.value.config.Server.SignIn.SecretKey,relaySecretKey:l.value.form.server.relaySecretKey||r.value.config.Server.Relay.SecretKey,sForwardSecretKey:l.value.form.server.sForwardSecretKey||r.value.config.Server.SForward.SecretKey,servicePort:l.value.form.server.servicePort||r.value.config.Server.ServicePort,webPort:l.value.form.server.webPort||r.value.config.Server.SForward.WebPort,tunnelPort1:l.value.form.server.tunnelPort1||r.value.config.Server.SForward.TunnelPortRange[0],tunnelPort2:l.value.form.server.tunnelPort2||r.value.config.Server.SForward.TunnelPortRange[1],updaterSecretKey:l.value.form.server.updaterSecretKey||r.value.config.Server.Updater.SecretKey},rules:{relaySecretKey:[{required:!0,message:"必填",trigger:"blur"}],sForwardSecretKey:[{required:!0,message:"必填",trigger:"blur"}],servicePort:[{required:!0,message:"必填",trigger:"blur"},{type:"number",min:0,max:65535,message:"数字 0-65535",trigger:"blur",transform(e){return Number(e)}}],webPort:[{required:!0,message:"必填",trigger:"blur"},{type:"number",min:0,max:65535,message:"数字 0-65535",trigger:"blur",transform(e){return Number(e)}}],tunnelPort1:[{required:!0,message:"必填",trigger:"blur"},{type:"number",min:0,max:65535,message:"数字 0-65535",trigger:"blur",transform(e){return Number(e)}}],tunnelPort2:[{required:!0,message:"必填",trigger:"blur"},{type:"number",min:0,max:65535,message:"数字 0-65535",trigger:"blur",transform(e){return Number(e)}}]}}),o=(0,me.KR)(null),u=()=>new Promise(((e,l)=>{o.value.validate((r=>{0==r?l():e({json:{Server:{ServicePort:+t.form.servicePort,Relay:{SecretKey:t.form.relaySecretKey},SForward:{SecretKey:t.form.sForwardSecretKey,WebPort:+t.form.webPort,TunnelPortRange:[+t.form.tunnelPort1,+t.form.tunnelPort2]},Updater:{SecretKey:t.form.updaterSecretKey},SignIn:{SecretKey:t.form.signinSecretKey}}},form:{server:JSON.parse(JSON.stringify(t.form))}})}))}));return(0,a.sV)((()=>{0!=l.value.json.Common.server&&0!=r.value.isPC||(l.value.step+=l.value.increment)})),{state:t,handleValidate:u,formDom:o}}};const Re=(0,be.A)(Oe,[["render",Ne],["__scopeId","data-v-8d4253a6"]]);var Te=Re,Be={components:{Common:Ee,Client:je,Server:Te},setup(e){const l=(0,de.B)(),r=(0,me.Kh)({steps:(0,a.EW)((()=>["选择模式",l.value.isPc?"服务端":"","客户端","完成"]))}),t=(0,me.KR)(null),o=(0,me.KR)({step:1,increment:1,json:{},form:{server:{},client:{},common:{}}});(0,a.Gt)("step",o);const u=()=>{o.value.step--,o.value.increment=-1},n=()=>{o.value.increment=1,t.value.handleValidate().then((e=>{o.value.json=Object.assign(o.value.json,e.json),o.value.form=Object.assign(o.value.form,e.form),o.value.step++})).catch((()=>{}))},s=()=>{(0,Ce.ai)(o.value.json).then((()=>{Le.nk.success("保存成功"),window.location.reload()})).catch((()=>{Le.nk.error("保存失败")}))};return{state:r,globalData:l,currentDom:t,step:o,handlePrev:u,handleNext:n,handleSave:s}}};const Je=(0,be.A)(Be,[["render",Ke],["__scopeId","data-v-ce07310a"]]);var ze=Je;const Ge={class:"t-c mgt-1"};function He(e,l,r,t,o,u){const n=(0,a.g2)("el-input"),s=(0,a.g2)("el-button");return(0,a.uX)(),(0,a.CE)("div",null,[(0,a.Lk)("div",null,[(0,a.bF)(n,{modelValue:t.state.content,"onUpdate:modelValue":l[0]||(l[0]=e=>t.state.content=e),type:"textarea",rows:10,resize:"none"},null,8,["modelValue"])]),(0,a.Lk)("div",Ge,[(0,a.bF)(s,{type:"primary",onClick:t.handleSave},{default:(0,a.k6)((()=>[(0,a.eW)("确定")])),_:1},8,["onClick"])])])}var Ye={setup(){const e=(0,me.Kh)({content:""}),l=()=>{e.content&&(0,Ce.vZ)(e.content).then((e=>{e?(Le.nk.success("保存成功"),window.location.reload()):Le.nk.error("保存失败,可能格式有误,无法解析")})).catch((()=>{Le.nk.error("保存失败")}))};return{state:e,handleSave:l}}};const Me=(0,be.A)(Ye,[["render",He]]);var Ze=Me;const el={class:"t-c w-100"};function ll(e,l,r,t,o,u){const n=(0,a.g2)("el-input"),s=(0,a.g2)("el-form-item"),d=(0,a.g2)("el-button"),m=(0,a.g2)("el-form");return(0,a.uX)(),(0,a.CE)("div",null,[(0,a.bF)(m,{ref:"formDom",model:t.state.ruleForm,rules:t.state.rules,"label-width":"auto"},{default:(0,a.k6)((()=>[(0,a.bF)(s,{label:"服务器",prop:"server"},{default:(0,a.k6)((()=>[(0,a.bF)(n,{modelValue:t.state.ruleForm.server,"onUpdate:modelValue":l[0]||(l[0]=e=>t.state.ruleForm.server=e)},null,8,["modelValue"])])),_:1}),(0,a.bF)(s,{label:"密钥",prop:"value"},{default:(0,a.k6)((()=>[(0,a.bF)(n,{modelValue:t.state.ruleForm.value,"onUpdate:modelValue":l[1]||(l[1]=e=>t.state.ruleForm.value=e)},null,8,["modelValue"])])),_:1}),(0,a.bF)(s,{label:"",prop:"Btns"},{default:(0,a.k6)((()=>[(0,a.Lk)("div",el,[(0,a.bF)(d,{type:"primary",onClick:t.handleSave},{default:(0,a.k6)((()=>[(0,a.eW)("确认")])),_:1},8,["onClick"])])])),_:1})])),_:1},8,["model","rules"])])}var rl={setup(){const e=(0,me.Kh)({ruleForm:{server:"",value:""},rules:{server:[{required:!0,message:"必填",trigger:"blur"}],value:[{required:!0,message:"必填",trigger:"blur"}]}}),l=(0,me.KR)(null),r=()=>{l.value.validate((l=>{l&&(0,Ce.D3)(e.ruleForm).then((e=>{e?(Le.nk.success("保存成功"),window.location.reload()):Le.nk.error("保存失败,可能服务器或者密钥不正确,或者密钥已被使用")})).catch((()=>{Le.nk.error("保存失败")}))}))};return{state:e,formDom:l,handleSave:r}}};const al=(0,be.A)(rl,[["render",ll]]);var tl=al,ol={components:{Input:ze,Copy:Ze,Save:tl},setup(e){const l=(0,de.B)(),r=(0,me.Kh)({show:0==l.value.config.Common.Install});return{state:r,globalData:l}}};const ul=(0,be.A)(ol,[["render",he]]);var nl=ul,sl={name:"Index",components:{Head:ke,Status:Fe.A,Install:nl},setup(e){const l=(0,de.B)(),r=(0,ve.rd)(),t=(0,me.KR)(null),o=()=>{(0,a.dY)((()=>{l.value.height=t.value.offsetHeight,l.value.width=window.innerWidth}))};return(0,a.sV)((()=>{0==l.value.hasAccess("FullManager")&&r.push({name:"NoPermission"}),window.addEventListener("resize",o),o()})),(0,a.hi)((()=>{window.removeEventListener("resize",o)})),{wrap:t}}};const dl=(0,be.A)(sl,[["render",d],["__scopeId","data-v-59076a44"]]);var ml=dl}}]);
\ No newline at end of file
diff --git a/src/linker.tray.win/web/js/620.066ac82f.js b/src/linker.tray.win/web/js/620.066ac82f.js
new file mode 100644
index 00000000..7faca095
--- /dev/null
+++ b/src/linker.tray.win/web/js/620.066ac82f.js
@@ -0,0 +1 @@
+"use strict";(self["webpackChunklinker_web"]=self["webpackChunklinker_web"]||[]).push([[620],{743:function(e,l,a){a.d(l,{Ap:function(){return n},Co:function(){return o},DY:function(){return u},JT:function(){return m},Qs:function(){return i},Uh:function(){return p},a9:function(){return s},eX:function(){return c},gz:function(){return d},nP:function(){return h},pY:function(){return r}});var t=a(4);const n=()=>(0,t.zG)("sforward/GetSecretKey"),o=e=>(0,t.zG)("sforward/SetSecretKey",e),r=e=>(0,t.zG)("sforward/get",e),s=()=>(0,t.zG)("sforward/refresh"),d=(e="0")=>(0,t.zG)("sforward/getcount",e),u=e=>(0,t.zG)("sforward/remove",e),i=e=>(0,t.zG)("sforward/add",e),c=e=>(0,t.zG)("sforward/TestLocal",e),h=e=>(0,t.zG)("sforward/start",e),m=e=>(0,t.zG)("sforward/stop",e),p=e=>(0,t.zG)("sforward/checkkey",e)},9924:function(e,l,a){a.r(l),a.d(l,{default:function(){return To}});var t=a(6768),n=a(4232);const o={class:"home-list-wrap absolute"},r={class:"page-wrap"};function s(e,l,a,s,d,u){const i=(0,t.g2)("Sort"),c=(0,t.g2)("Device"),h=(0,t.g2)("Tunnel"),m=(0,t.g2)("Tuntap"),p=(0,t.g2)("Socks5"),g=(0,t.g2)("Forward"),w=(0,t.g2)("Oper"),k=(0,t.g2)("el-table"),v=(0,t.g2)("el-pagination"),f=(0,t.g2)("DeviceEdit"),b=(0,t.g2)("AccessEdit"),C=(0,t.g2)("TunnelEdit"),F=(0,t.g2)("ConnectionsEdit"),y=(0,t.g2)("TuntapEdit"),E=(0,t.g2)("TuntapRoutes"),_=(0,t.g2)("TuntapFirewall"),V=(0,t.g2)("Socks5Edit"),L=(0,t.g2)("TuntapLease"),P=(0,t.g2)("ForwardEdit"),I=(0,t.g2)("SForwardEdit"),T=(0,t.g2)("UpdaterConfirm"),M=(0,t.g2)("Stopwatch");return(0,t.uX)(),(0,t.CE)("div",o,[(0,t.bF)(i,{onSort:s.handleSortChange},null,8,["onSort"]),(0,t.bF)(k,{data:s.devices.page.List,stripe:"",border:"",style:{width:"100%"},height:`${s.state.height}px`,size:"small"},{default:(0,t.k6)((()=>[(0,t.bF)(c,{onEdit:s.handleDeviceEdit,onRefresh:s.handlePageRefresh},null,8,["onEdit","onRefresh"]),(0,t.bF)(h,{onEdit:s.handleTunnelEdit,onRefresh:s.handleTunnelRefresh,onConnections:s.handleTunnelConnections},null,8,["onEdit","onRefresh","onConnections"]),(0,t.bF)(m,{onEdit:s.handleTuntapEdit,onRefresh:s.handleTuntapRefresh},null,8,["onEdit","onRefresh"]),(0,t.bF)(p,{onEdit:s.handleSocks5Edit,onRefresh:s.handleSocks5Refresh},null,8,["onEdit","onRefresh"]),(0,t.bF)(g,{onEdit:s.handleForwardEdit,onSedit:s.handleSForwardEdit},null,8,["onEdit","onSedit"]),(0,t.bF)(w,{onRefresh:s.handlePageRefresh,onAccess:s.handleAccessEdit},null,8,["onRefresh","onAccess"])])),_:1},8,["data","height"]),(0,t.Lk)("div",{class:(0,n.C4)(["page",{"t-c":s.globalData.isPc}])},[(0,t.Lk)("div",r,[(0,t.bF)(v,{small:"",background:"",total:s.devices.page.Count,"pager-count":s.globalData.isPc?7:3,layout:s.globalData.isPc?"total,sizes,prev,pager, next":"prev, pager, next","page-size":s.devices.page.Request.Size,"current-page":s.devices.page.Request.Page,onCurrentChange:s.handlePageChange,onSizeChange:s.handlePageSizeChange,"page-sizes":[10,20,50,100,255]},null,8,["total","pager-count","layout","page-size","current-page","onCurrentChange","onSizeChange"])])],2),s.devices.showDeviceEdit?((0,t.uX)(),(0,t.Wv)(f,{key:0,modelValue:s.devices.showDeviceEdit,"onUpdate:modelValue":l[0]||(l[0]=e=>s.devices.showDeviceEdit=e),onChange:s.handlePageChange,data:s.devices.deviceInfo},null,8,["modelValue","onChange","data"])):(0,t.Q3)("",!0),s.devices.showAccessEdit?((0,t.uX)(),(0,t.Wv)(b,{key:1,modelValue:s.devices.showAccessEdit,"onUpdate:modelValue":l[1]||(l[1]=e=>s.devices.showAccessEdit=e),onChange:s.handlePageChange,data:s.devices.deviceInfo},null,8,["modelValue","onChange","data"])):(0,t.Q3)("",!0),s.tunnel.showEdit?((0,t.uX)(),(0,t.Wv)(C,{key:2,modelValue:s.tunnel.showEdit,"onUpdate:modelValue":l[2]||(l[2]=e=>s.tunnel.showEdit=e),onChange:s.handleTunnelRefresh},null,8,["modelValue","onChange"])):(0,t.Q3)("",!0),s.connections.showEdit?((0,t.uX)(),(0,t.Wv)(F,{key:3,modelValue:s.connections.showEdit,"onUpdate:modelValue":l[3]||(l[3]=e=>s.connections.showEdit=e)},null,8,["modelValue"])):(0,t.Q3)("",!0),s.tuntap.showEdit?((0,t.uX)(),(0,t.Wv)(y,{key:4,modelValue:s.tuntap.showEdit,"onUpdate:modelValue":l[4]||(l[4]=e=>s.tuntap.showEdit=e),onChange:s.handleTuntapRefresh},null,8,["modelValue","onChange"])):(0,t.Q3)("",!0),s.tuntap.showRoutes?((0,t.uX)(),(0,t.Wv)(E,{key:5,modelValue:s.tuntap.showRoutes,"onUpdate:modelValue":l[5]||(l[5]=e=>s.tuntap.showRoutes=e)},null,8,["modelValue"])):(0,t.Q3)("",!0),s.tuntap.showFirewall?((0,t.uX)(),(0,t.Wv)(_,{key:6,modelValue:s.tuntap.showFirewall,"onUpdate:modelValue":l[6]||(l[6]=e=>s.tuntap.showFirewall=e)},null,8,["modelValue"])):(0,t.Q3)("",!0),s.socks5.showEdit?((0,t.uX)(),(0,t.Wv)(V,{key:7,modelValue:s.socks5.showEdit,"onUpdate:modelValue":l[7]||(l[7]=e=>s.socks5.showEdit=e),onChange:s.handleSocks5Refresh},null,8,["modelValue","onChange"])):(0,t.Q3)("",!0),s.tuntap.showLease?((0,t.uX)(),(0,t.Wv)(L,{key:8,modelValue:s.tuntap.showLease,"onUpdate:modelValue":l[8]||(l[8]=e=>s.tuntap.showLease=e),onChange:s.handleTuntapRefresh},null,8,["modelValue","onChange"])):(0,t.Q3)("",!0),s.forward.showEdit?((0,t.uX)(),(0,t.Wv)(P,{key:9,modelValue:s.forward.showEdit,"onUpdate:modelValue":l[9]||(l[9]=e=>s.forward.showEdit=e)},null,8,["modelValue"])):(0,t.Q3)("",!0),s.sforward.showEdit?((0,t.uX)(),(0,t.Wv)(I,{key:10,modelValue:s.sforward.showEdit,"onUpdate:modelValue":l[10]||(l[10]=e=>s.sforward.showEdit=e)},null,8,["modelValue"])):(0,t.Q3)("",!0),s.updater.show?((0,t.uX)(),(0,t.Wv)(T,{key:11,modelValue:s.updater.show,"onUpdate:modelValue":l[11]||(l[11]=e=>s.updater.show=e)},null,8,["modelValue"])):(0,t.Q3)("",!0),s.flow.show?((0,t.uX)(),(0,t.Wv)(M,{key:12,modelValue:s.flow.show,"onUpdate:modelValue":l[12]||(l[12]=e=>s.flow.show=e)},null,8,["modelValue"])):(0,t.Q3)("",!0)])}a(4114);var d=a(3830),u=a(144),i=a(1219);const c={class:"el-dropdown-link"};function h(e,l,a,n,o,r){const s=(0,t.g2)("el-table-column"),d=(0,t.g2)("ArrowDownBold"),u=(0,t.g2)("el-icon"),i=(0,t.g2)("el-checkbox"),h=(0,t.g2)("el-dropdown-item"),m=(0,t.g2)("el-dropdown-menu"),p=(0,t.g2)("el-dropdown"),g=(0,t.g2)("el-table");return(0,t.uX)(),(0,t.Wv)(g,{border:"",style:{width:"100%"},height:"32px",size:"small",onSortChange:n.handleSortChange,class:"table-sort"},{default:(0,t.k6)((()=>[(0,t.bF)(s,{prop:"MachineId",label:"设备名",width:"110",sortable:"custom"}),(0,t.bF)(s,{prop:"Version",label:"版本",width:"110",sortable:"custom"}),(0,t.bF)(s,{prop:"tunnel",label:"网络",width:"76",sortable:"custom"}),n.tuntap.show?((0,t.uX)(),(0,t.Wv)(s,{key:0,prop:"tuntap",label:"网卡IP",width:"160",sortable:"custom"})):(0,t.Q3)("",!0),n.socks5.show?((0,t.uX)(),(0,t.Wv)(s,{key:1,prop:"socks5",label:"代理转发",width:"160",sortable:"custom"})):(0,t.Q3)("",!0),(0,t.bF)(s,{label:"columns",fixed:"right"},{header:(0,t.k6)((()=>[(0,t.bF)(p,{class:"show-columns"},{dropdown:(0,t.k6)((()=>[(0,t.bF)(m,null,{default:(0,t.k6)((()=>[(0,t.bF)(h,null,{default:(0,t.k6)((()=>[(0,t.bF)(i,{modelValue:n.tuntap.show,"onUpdate:modelValue":l[0]||(l[0]=e=>n.tuntap.show=e),onChange:n.handleTuntapShow,size:"small",style:{"margin-right":"1rem"}},{default:(0,t.k6)((()=>[(0,t.eW)("网卡")])),_:1},8,["modelValue","onChange"])])),_:1}),(0,t.bF)(h,null,{default:(0,t.k6)((()=>[(0,t.bF)(i,{modelValue:n.socks5.show,"onUpdate:modelValue":l[1]||(l[1]=e=>n.socks5.show=e),onChange:n.handleSocks5Show,size:"small",style:{"margin-right":"1rem"}},{default:(0,t.k6)((()=>[(0,t.eW)("代理")])),_:1},8,["modelValue","onChange"])])),_:1}),(0,t.bF)(h,null,{default:(0,t.k6)((()=>[(0,t.bF)(i,{modelValue:n.forward.show,"onUpdate:modelValue":l[2]||(l[2]=e=>n.forward.show=e),onChange:n.handleForwardShow,size:"small",style:{"margin-right":"0rem"}},{default:(0,t.k6)((()=>[(0,t.eW)("转发")])),_:1},8,["modelValue","onChange"])])),_:1})])),_:1})])),default:(0,t.k6)((()=>[(0,t.Lk)("span",c,[(0,t.eW)("显示项"),(0,t.bF)(u,null,{default:(0,t.k6)((()=>[(0,t.bF)(d)])),_:1})])])),_:1})])),_:1})])),_:1},8,["onSortChange"])}var m=a(7716);const p=Symbol(),g=()=>{(0,d.B)();const e=(0,u.KR)({show:!0,timer:0,showEdit:!1,machineId:null,list:{},hashcode:0});(0,t.Gt)(p,e);const l=()=>{(0,m.dS)()},a=()=>{clearTimeout(e.value.timer),(0,m.V1)(e.value.hashcode.toString()).then((l=>{e.value.hashcode=l.HashCode,l.List&&(e.value.list=l.List),e.value.timer=setTimeout(a,1020)})).catch((()=>{e.value.timer=setTimeout(a,1020)}))},n=l=>{e.value.machineId=l[0],e.value.machineName=l[1],e.value.showEdit=!0},o=()=>{clearTimeout(e.value.timer)};return{forward:e,_getForwardCountInfo:a,handleForwardEdit:n,clearForwardTimeout:o,handleForwardRefresh:l}},w=()=>(0,t.WQ)(p);var k=a(2173);const v=Symbol(),f=()=>{const e=(0,u.KR)({show:!0,timer:0,showEdit:!1,current:null,list:{},hashcode:0});(0,t.Gt)(v,e);const l=()=>{clearTimeout(e.value.timer),(0,k.$y)(e.value.hashcode.toString()).then((a=>{if(e.value.hashcode=a.HashCode,a.List){for(let e in a.List)Object.assign(a.List[e],{running:2==a.List[e].Status,loading:1==a.List[e].Status});e.value.list=a.List}e.value.timer=setTimeout(l,1100)})).catch((a=>{e.value.timer=setTimeout(l,1100)}))},a=l=>{e.value.current=l,e.value.showEdit=!0},n=()=>{(0,k.QP)()},o=()=>{clearTimeout(e.value.timer),e.value.timer=0},r=l=>Object.values(e.value.list).filter((e=>e.Port.toString().indexOf(l)>=0||e.Lans.filter((e=>e.IP.indexOf(l)>=0)).length>0)).map((e=>e.MachineId)),s=l=>{const a=Object.values(e.value.list).sort(((e,l)=>e.Port-l.Port));return a.map((e=>e.MachineId))};return{socks5:e,_getSocks5Info:l,handleSocks5Edit:a,handleSocks5Refresh:n,clearSocks5Timeout:o,getSocks5Machines:r,sortSocks5:s}},b=()=>(0,t.WQ)(v);var C=a(8104),F=a(7477),y={emits:["sort"],components:{ArrowDownBold:F.$bU},setup(e,{emit:l}){const a=(0,C.W)();a.value.show="false"!=localStorage.getItem("tuntap.show");const t=b();t.value.show="false"!=localStorage.getItem("socks5.show");const n=w();n.value.show="false"!=localStorage.getItem("forward.show");const o=e=>{l("sort",e)},r=()=>{localStorage.setItem("tuntap.show",a.value.show)},s=()=>{localStorage.setItem("socks5.show",t.value.show)},d=()=>{localStorage.setItem("forward.show",n.value.show)};return{tuntap:a,socks5:t,forward:n,handleSortChange:o,handleTuntapShow:r,handleSocks5Show:s,handleForwardShow:d}}},E=a(1241);const _=(0,E.A)(y,[["render",h],["__scopeId","data-v-107f04ae"]]);var V=_;const L=e=>((0,t.Qi)("data-v-0338b206"),e=e(),(0,t.jt)(),e),P={class:"dropdown"},I=L((()=>(0,t.Lk)("span",null,"操作",-1)));function T(e,l,a,n,o,r){const s=(0,t.g2)("ArrowDown"),d=(0,t.g2)("el-icon"),u=(0,t.g2)("SwitchButton"),i=(0,t.g2)("el-dropdown-item"),c=(0,t.g2)("Delete"),h=(0,t.g2)("Flag"),m=(0,t.g2)("HelpFilled"),p=(0,t.g2)("Platform"),g=(0,t.g2)("Paperclip"),w=(0,t.g2)("CircleCheck"),k=(0,t.g2)("el-dropdown-menu"),v=(0,t.g2)("el-dropdown"),f=(0,t.g2)("el-table-column");return(0,t.uX)(),(0,t.Wv)(f,{label:"操作",fixed:"right",width:"75"},{default:(0,t.k6)((a=>[(0,t.bF)(v,{size:"small"},{dropdown:(0,t.k6)((()=>[(0,t.bF)(k,null,{default:(0,t.k6)((()=>[a.row.showReboot&&n.hasReboot?((0,t.uX)(),(0,t.Wv)(i,{key:0,onClick:e=>n.handleExit(a.row.MachineId,a.row.MachineName)},{default:(0,t.k6)((()=>[(0,t.bF)(d,null,{default:(0,t.k6)((()=>[(0,t.bF)(u)])),_:1}),(0,t.eW)(" 重启")])),_:2},1032,["onClick"])):(0,t.Q3)("",!0),a.row.showDel&&n.hasRemove?((0,t.uX)(),(0,t.Wv)(i,{key:1,onClick:e=>n.handleDel(a.row.MachineId,a.row.MachineName)},{default:(0,t.k6)((()=>[(0,t.bF)(d,null,{default:(0,t.k6)((()=>[(0,t.bF)(c)])),_:1}),(0,t.eW)(" 删除")])),_:2},1032,["onClick"])):(0,t.Q3)("",!0),n.handleShowAccess(a.row,n.accessList[a.row.MachineId]||0)?((0,t.uX)(),(0,t.Wv)(i,{key:2,onClick:e=>n.handleAccess(a.row)},{default:(0,t.k6)((()=>[(0,t.bF)(d,null,{default:(0,t.k6)((()=>[(0,t.bF)(h)])),_:1}),(0,t.eW)(" 权限")])),_:2},1032,["onClick"])):(0,t.Q3)("",!0),a.row.isSelf&&n.hasApiPassword?((0,t.uX)(),(0,t.Wv)(i,{key:3,onClick:e=>n.handleApiPassword(a.row)},{default:(0,t.k6)((()=>[(0,t.bF)(d,null,{default:(0,t.k6)((()=>[(0,t.bF)(m)])),_:1}),(0,t.eW)(" 管理接口")])),_:2},1032,["onClick"])):n.hasApiPasswordOther?((0,t.uX)(),(0,t.Wv)(i,{key:4,onClick:e=>n.handleApiPassword(a.row)},{default:(0,t.k6)((()=>[(0,t.bF)(d,null,{default:(0,t.k6)((()=>[(0,t.bF)(m)])),_:1}),(0,t.eW)(" 管理接口")])),_:2},1032,["onClick"])):(0,t.Q3)("",!0),(0,t.bF)(i,{onClick:e=>n.handleStopwatch(a.row.MachineId,a.row.MachineName)},{default:(0,t.k6)((()=>[(0,t.bF)(d,null,{default:(0,t.k6)((()=>[(0,t.bF)(p)])),_:1}),(0,t.eW)("它的信标")])),_:2},1032,["onClick"]),(0,t.bF)(i,{onClick:l[0]||(l[0]=l=>n.handleStopwatch("",e.$t("status.messenger")))},{default:(0,t.k6)((()=>[(0,t.bF)(d,null,{default:(0,t.k6)((()=>[(0,t.bF)(p)])),_:1}),(0,t.eW)("服务器信标")])),_:1}),(0,t.bF)(i,{onClick:e=>n.handleRoutes(a.row.MachineId,a.row.MachineName)},{default:(0,t.k6)((()=>[(0,t.bF)(d,null,{default:(0,t.k6)((()=>[(0,t.bF)(g)])),_:1}),(0,t.eW)("网卡路由")])),_:2},1032,["onClick"]),a.row.isSelf&&n.hasFirewallSelf?((0,t.uX)(),(0,t.Wv)(i,{key:5,onClick:e=>n.handleFirewall(a.row.MachineId,a.row.MachineName)},{default:(0,t.k6)((()=>[(0,t.bF)(d,null,{default:(0,t.k6)((()=>[(0,t.bF)(w)])),_:1}),(0,t.eW)("防火墙")])),_:2},1032,["onClick"])):n.hasFirewallOther?((0,t.uX)(),(0,t.Wv)(i,{key:6,onClick:e=>n.handleFirewall(a.row.MachineId,a.row.MachineName)},{default:(0,t.k6)((()=>[(0,t.bF)(d,null,{default:(0,t.k6)((()=>[(0,t.bF)(w)])),_:1}),(0,t.eW)("防火墙")])),_:2},1032,["onClick"])):(0,t.Q3)("",!0)])),_:2},1024)])),default:(0,t.k6)((()=>[(0,t.Lk)("div",P,[I,(0,t.bF)(d,{class:"el-icon--right"},{default:(0,t.k6)((()=>[(0,t.bF)(s)])),_:1})])])),_:2},1024)])),_:1})}var M=a(9299),S=a(920),W=a(2933),A=a(5962),X=a(3363);const R=Symbol(),N=()=>{const e=(0,u.KR)({device:{},show:!1});return(0,t.Gt)(R,e),{flow:e}},x=()=>(0,t.WQ)(R);var B={emits:["refresh","access"],components:{Delete:F.epd,SwitchButton:F.L$q,ArrowDown:F.yd$,Flag:F.lNU,HelpFilled:F.adD,Platform:F.ODD,Paperclip:F.xv8,CircleCheck:F.rW7},setup(e,{emit:l}){const a=(0,d.B)(),n=(0,A.q)(),o=(0,t.EW)((()=>a.value.config.Client.Access)),r=(0,t.EW)((()=>a.value.hasAccess("Access"))),s=(0,t.EW)((()=>n.value.list)),u=(0,t.EW)((()=>a.value.hasAccess("Reboot"))),c=(0,t.EW)((()=>a.value.hasAccess("Remove"))),h=(0,t.EW)((()=>a.value.hasAccess("SetApiPassword"))),m=(0,t.EW)((()=>a.value.hasAccess("SetApiPasswordOther"))),p=(0,t.EW)((()=>a.value.hasAccess("FirewallSelf"))),g=(0,t.EW)((()=>a.value.hasAccess("FirewallOther"))),w=x(),k=(0,C.W)(),v=(e,a)=>{W.s.confirm(`确认删除[${a}]?`,"提示",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}).then((()=>{(0,M.Se)(e).then((()=>{l("refresh")}))})).catch((()=>{}))},f=(e,a)=>{W.s.confirm(`确认关闭[${a}]?`,"提示",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}).then((()=>{(0,S.NS)(e).then((()=>{l("refresh")}))})).catch((()=>{}))},b=(e,l)=>e.showAccess&&r.value&&l>=0&&0==+(~BigInt(o.value)&BigInt(l)).toString(),F=e=>{l("access",e)},y=e=>{W.s.prompt("输入新的管理接口密码",`重置【${e.MachineName}】的接口密码`,{confirmButtonText:"确定",cancelButtonText:"取消",inputPattern:/^[0-9a-zA-Z]{1,32}$/,inputErrorMessage:"数字字母1-32位"}).then((({value:l})=>{(0,X.gv)({machineId:e.MachineId,password:l}).then((()=>{i.nk.success("操作成功,重启后生效~")})).catch((()=>{i.nk.error("操作失败~")}))})).catch((()=>{}))},E=(e,l)=>{w.value.device.id=e,w.value.device.name=l,w.value.show=!0},_=(e,l)=>{k.value.device.id=e,k.value.device.name=l,k.value.showRoutes=!0},V=(e,l)=>{k.value.device.id=e,k.value.device.name=l,k.value.showFirewall=!0};return{accessList:s,handleDel:v,handleExit:f,hasReboot:u,hasRemove:c,hasAccess:r,handleShowAccess:b,handleAccess:F,hasApiPassword:h,hasApiPasswordOther:m,handleApiPassword:y,handleStopwatch:E,handleRoutes:_,hasFirewallSelf:p,hasFirewallOther:g,handleFirewall:V}}};const U=(0,E.A)(B,[["render",T],["__scopeId","data-v-0338b206"]]);var $=U;const D=e=>((0,t.Qi)("data-v-5db71b03"),e=e(),(0,t.jt)(),e),z={class:"flex"},O=D((()=>(0,t.Lk)("span",{class:"flex-1"},"设备",-1))),Q={class:"flex"},j=["onClick"],K=["onClick"],G=D((()=>(0,t.Lk)("span",null,"😴㊙.㊙.㊙.㊙",-1))),q=[G],H=D((()=>(0,t.Lk)("span",{class:"flex-1"},null,-1)));function J(e,l,a,o,r,s){const d=(0,t.g2)("el-input"),u=(0,t.g2)("Search"),i=(0,t.g2)("el-icon"),c=(0,t.g2)("el-button"),h=(0,t.g2)("DeviceName"),m=(0,t.g2)("UpdaterBtn"),p=(0,t.g2)("el-table-column");return(0,t.uX)(),(0,t.Wv)(p,{prop:"MachineId",label:"设备",width:"220"},{header:(0,t.k6)((()=>[(0,t.Lk)("div",z,[O,(0,t.Lk)("span",null,[(0,t.bF)(d,{size:"small",modelValue:o.name,"onUpdate:modelValue":l[0]||(l[0]=e=>o.name=e),clearable:"",onInput:o.handleRefresh,placeholder:"设备/虚拟网卡/端口转发"},null,8,["modelValue","onInput"])]),(0,t.Lk)("span",null,[(0,t.bF)(c,{size:"small",onClick:o.handleRefresh},{default:(0,t.k6)((()=>[(0,t.bF)(i,null,{default:(0,t.k6)((()=>[(0,t.bF)(u)])),_:1})])),_:1},8,["onClick"])])])])),default:(0,t.k6)((e=>[(0,t.Lk)("div",null,[(0,t.Lk)("p",null,[(0,t.bF)(h,{onEdit:o.handleEdit,config:!0,item:e.row},null,8,["onEdit","item"])]),(0,t.Lk)("p",Q,[e.row.showip?((0,t.uX)(),(0,t.CE)("span",{key:0,title:"此设备的外网IP",class:"ipaddress",onClick:l=>o.handleExternal(e.row)},[(0,t.Lk)("span",null,"😀"+(0,n.v_)(e.row.IP),1)],8,j)):((0,t.uX)(),(0,t.CE)("span",{key:1,title:"此设备的外网IP",class:"ipaddress",onClick:l=>o.handleExternal(e.row)},q,8,K)),H,0==e.row.showip?((0,t.uX)(),(0,t.Wv)(m,{key:2,config:!0,item:e.row},null,8,["item"])):(0,t.Q3)("",!0)])])])),_:1})}var Z=a(7115),Y=a(263),ee={emits:["edit","refresh"],components:{Search:F.vji,UpdaterBtn:Z.A,DeviceName:Y.A},setup(e,{emit:l}){const a=(0,d.B)(),n=(0,t.EW)((()=>a.value.hasAccess("ExternalShow"))),o=(0,u.KR)(sessionStorage.getItem("search-name")||""),r=e=>{n.value&&(e.showip=!e.showip)},s=e=>{l("edit",e)},i=()=>{sessionStorage.setItem("search-name",o.value),l("refresh",o.value)};return{handleEdit:s,handleRefresh:i,name:o,handleExternal:r}}};const le=(0,E.A)(ee,[["render",J],["__scopeId","data-v-5db71b03"]]);var ae=le;const te=(0,t.Lk)("div",null,"修改后最好能重启一次客户端",-1),ne={class:"t-c w-100"};function oe(e,l,a,n,o,r){const s=(0,t.g2)("el-form-item"),d=(0,t.g2)("el-input"),u=(0,t.g2)("el-button"),i=(0,t.g2)("el-form"),c=(0,t.g2)("el-dialog");return(0,t.uX)(),(0,t.Wv)(c,{modelValue:n.state.show,"onUpdate:modelValue":l[2]||(l[2]=e=>n.state.show=e),"close-on-click-modal":!1,"append-to":".app-wrap",title:`设置[${n.state.ruleForm.MachineName}]设备`,width:"360"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",null,[(0,t.bF)(i,{ref:"ruleFormRef",model:n.state.ruleForm,rules:n.state.rules,"label-width":"auto"},{default:(0,t.k6)((()=>[(0,t.bF)(s,{label:""},{default:(0,t.k6)((()=>[te])),_:1}),(0,t.bF)(s,{label:"设备名",prop:"MachineName"},{default:(0,t.k6)((()=>[(0,t.bF)(d,{maxlength:"32","show-word-limit":"",modelValue:n.state.ruleForm.MachineName,"onUpdate:modelValue":l[0]||(l[0]=e=>n.state.ruleForm.MachineName=e)},null,8,["modelValue"])])),_:1}),(0,t.bF)(s,{label:"",prop:"Btns"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",ne,[(0,t.bF)(u,{onClick:l[1]||(l[1]=e=>n.state.show=!1)},{default:(0,t.k6)((()=>[(0,t.eW)("取消")])),_:1}),(0,t.bF)(u,{type:"primary",onClick:n.handleSave},{default:(0,t.k6)((()=>[(0,t.eW)("确认")])),_:1},8,["onClick"])])])),_:1})])),_:1},8,["model","rules"])])])),_:1},8,["modelValue","title"])}var re={props:["data","modelValue"],emits:["change","update:modelValue"],setup(e,{emit:l}){const a=(0,u.KR)(null),n=(0,u.Kh)({show:!0,ruleForm:{MachineName1:e.data.MachineName,MachineName:e.data.MachineName},rules:{}});(0,t.wB)((()=>n.show),(e=>{e||setTimeout((()=>{l("update:modelValue",e)}),300)}));const o=()=>{e.data.MachineName!=n.ruleForm.MachineName&&(0,M.gC)({Id:e.data.MachineId,newName:n.ruleForm.MachineName}).then((()=>{n.show=!1,i.nk.success("已操作!"),l("change")})).catch((e=>{console.log(e),i.nk.error("操作失败!")}))};return{state:n,ruleFormRef:a,handleSave:o}}};const se=(0,E.A)(re,[["render",oe]]);var de=se,ue=a(7985);function ie(e,l,a,n,o,r){const s=(0,t.g2)("Access"),d=(0,t.g2)("el-button"),u=(0,t.g2)("el-dialog");return(0,t.uX)(),(0,t.Wv)(u,{modelValue:n.state.show,"onUpdate:modelValue":l[1]||(l[1]=e=>n.state.show=e),"close-on-click-modal":!1,center:"","append-to":".app-wrap",title:`设置[${n.machineName}]的权限`,width:"580",top:"1vh"},{footer:(0,t.k6)((()=>[(0,t.bF)(d,{plain:"",onClick:l[0]||(l[0]=e=>n.state.show=!1),loading:n.state.loading},{default:(0,t.k6)((()=>[(0,t.eW)("取消")])),_:1},8,["loading"]),(0,t.bF)(d,{type:"success",plain:"",onClick:n.handleSave,loading:n.state.loading},{default:(0,t.k6)((()=>[(0,t.eW)("确定保存")])),_:1},8,["onClick","loading"])])),default:(0,t.k6)((()=>[(0,t.Lk)("div",null,[(0,t.bF)(s,{machineid:n.machineid,ref:"accessDom"},null,8,["machineid"])])])),_:1},8,["modelValue","title"])}var ce=a(6206),he={props:["data","modelValue"],emits:["change","update:modelValue"],components:{Access:ce.A},setup(e,{emit:l}){const a=(0,u.Kh)({show:!0,loading:!1});(0,t.wB)((()=>a.show),(e=>{e||setTimeout((()=>{l("update:modelValue",e)}),300)}));const n=(0,u.KR)(null),o=()=>{a.loading=!0,(0,X.ZK)({ToMachineId:e.data.MachineId,Access:n.value.getValue()}).then((()=>{a.loading=!1,a.show=!1,i.nk.success("已操作!"),l("change")})).catch((e=>{console.log(e),a.loading=!1,i.nk.error("操作失败!")}))};return{machineName:e.data.MachineName,machineid:e.data.MachineId,state:a,accessDom:n,handleSave:o}}};const me=(0,E.A)(he,[["render",ie]]);var pe=me;const ge={key:0};function we(e,l,a,n,o,r){const s=(0,t.g2)("TuntapShow"),d=(0,t.g2)("el-table-column");return(0,t.uX)(),(0,t.Wv)(d,{prop:"tuntap",label:n.tuntap.show?"虚拟网卡":"",width:"160"},{header:(0,t.k6)((()=>[n.tuntap.show?((0,t.uX)(),(0,t.CE)("a",{key:0,href:"javascript:;",class:"a-line",onClick:l[0]||(l[0]=(...e)=>n.handleShowLease&&n.handleShowLease(...e))},"虚拟网卡")):(0,t.Q3)("",!0)])),default:(0,t.k6)((e=>[n.tuntap.show&&n.tuntap.list[e.row.MachineId]?((0,t.uX)(),(0,t.CE)("div",ge,[(0,t.bF)(s,{config:!0,item:e.row,onEdit:n.handleTuntapIP,onRefresh:n.handleTuntapRefresh},null,8,["item","onEdit","onRefresh"])])):(0,t.Q3)("",!0)])),_:1},8,["label"])}var ke=a(4877),ve={emits:["edit","refresh"],components:{TuntapShow:ke.A},setup(e,{emit:l}){const a=(0,C.W)(),t=e=>{l("edit",e)},n=()=>{l("refresh")},o=()=>{a.value.showLease=!0};return{tuntap:a,handleTuntapIP:t,handleTuntapRefresh:n,handleShowLease:o}}};const fe=(0,E.A)(ve,[["render",we]]);var be=fe;const Ce={class:"foot t-c"};function Fe(e,l,a,n,o,r){const s=(0,t.g2)("TuntapIP"),d=(0,t.g2)("el-tab-pane"),u=(0,t.g2)("TuntapLan"),i=(0,t.g2)("TuntapForward"),c=(0,t.g2)("el-tabs"),h=(0,t.g2)("el-button"),m=(0,t.g2)("el-dialog");return(0,t.uX)(),(0,t.Wv)(m,{modelValue:n.state.show,"onUpdate:modelValue":l[1]||(l[1]=e=>n.state.show=e),"close-on-click-modal":!1,"append-to":".app-wrap",title:`设置[${n.state.machineName}]组网`,top:"1vh",width:"780"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",null,[(0,t.bF)(c,{type:"border-card"},{default:(0,t.k6)((()=>[(0,t.bF)(d,{label:"网卡"},{default:(0,t.k6)((()=>[(0,t.bF)(s,{ref:"ipDom"},null,512)])),_:1}),(0,t.bF)(d,{label:"点/网对网"},{default:(0,t.k6)((()=>[(0,t.bF)(u,{ref:"lanDom"},null,512)])),_:1}),(0,t.bF)(d,{label:"端口转发"},{default:(0,t.k6)((()=>[(0,t.bF)(i,{ref:"forwardDom"},null,512)])),_:1})])),_:1}),(0,t.Lk)("div",Ce,[(0,t.bF)(h,{onClick:l[0]||(l[0]=e=>n.state.show=!1),loading:n.state.loading},{default:(0,t.k6)((()=>[(0,t.eW)("取消")])),_:1},8,["loading"]),(0,t.bF)(h,{type:"primary",onClick:n.handleSave,loading:n.state.loading},{default:(0,t.k6)((()=>[(0,t.eW)("确定保存")])),_:1},8,["onClick","loading"])])])])),_:1},8,["modelValue","title"])}var ye=a(5241),Ee=a(5130);const _e=e=>((0,t.Qi)("data-v-1f1a4aca"),e=e(),(0,t.jt)(),e),Ve={class:"w-100"},Le=_e((()=>(0,t.Lk)("span",{class:"yellow"},"使用系统端口转发",-1))),Pe={key:0,class:"green"},Ie={class:"wrap"},Te=["onClick"],Me=["title"],Se={key:1},We=["onClick"],Ae=["onClick"],Xe=["title"],Re={key:1},Ne=["onClick"],xe=["onClick"],Be=["title"],Ue={key:1},$e=["onClick"],De={key:1,class:"remark"},ze=["onClick"];function Oe(e,l,a,o,r,s){const d=(0,t.g2)("el-input"),u=(0,t.g2)("Delete"),i=(0,t.g2)("el-icon"),c=(0,t.g2)("el-table-column"),h=(0,t.g2)("el-button"),m=(0,t.g2)("el-popconfirm"),p=(0,t.g2)("Plus"),g=(0,t.g2)("el-table");return(0,t.uX)(),(0,t.CE)("div",Ve,[(0,t.Lk)("div",null,[Le,o.state.testing?((0,t.uX)(),(0,t.CE)("span",Pe,"、testing")):(0,t.Q3)("",!0)]),(0,t.Lk)("div",Ie,[(0,t.bF)(g,{stripe:"",data:o.state.forwards,border:"",size:"small",width:"100%",height:"400px",onCellDblclick:o.handleCellClick},{default:(0,t.k6)((()=>[(0,t.bF)(c,{prop:"ListenPort",label:"源端口",width:"60"},{default:(0,t.k6)((e=>[e.row.ListenPortEditing?((0,t.uX)(),(0,t.Wv)(d,{key:0,autofocus:"",size:"small",modelValue:e.row.ListenPort,"onUpdate:modelValue":l=>e.row.ListenPort=l,onBlur:l=>o.handleEditBlur(e.row,"ListenPort")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,t.uX)(),(0,t.CE)("a",{key:1,href:"javascript:;",class:"a-line",onClick:l=>o.handleEdit(e.row,"ListenPort")},[e.row.Error?((0,t.uX)(),(0,t.CE)("strong",{key:0,title:e.row.Error,class:"red"},(0,n.v_)(e.row.ListenPort),9,Me)):((0,t.uX)(),(0,t.CE)("span",Se,[(0,t.eW)((0,n.v_)(e.row.ListenPort)+" ",1),(0,t.Lk)("a",{href:"javascript:;",onClick:(0,Ee.D$)((l=>e.row.ListenPort=0),["stop"])},[(0,t.bF)(i,null,{default:(0,t.k6)((()=>[(0,t.bF)(u)])),_:1})],8,We)]))],8,Te))])),_:1}),(0,t.bF)(c,{prop:"ConnectAddr",label:"目标IP",width:"120"},{default:(0,t.k6)((e=>[e.row.ConnectAddrEditing?((0,t.uX)(),(0,t.Wv)(d,{key:0,autofocus:"",size:"small",modelValue:e.row.ConnectAddr,"onUpdate:modelValue":l=>e.row.ConnectAddr=l,onBlur:l=>o.handleEditBlur(e.row,"ConnectAddr")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,t.uX)(),(0,t.CE)("a",{key:1,href:"javascript:;",class:"a-line",onClick:l=>o.handleEdit(e.row,"ConnectAddr")},[e.row.Error?((0,t.uX)(),(0,t.CE)("strong",{key:0,title:e.row.Error,class:"red"},(0,n.v_)(e.row.ConnectAddr),9,Xe)):((0,t.uX)(),(0,t.CE)("span",Re,[(0,t.eW)((0,n.v_)(e.row.ConnectAddr)+" ",1),(0,t.Lk)("a",{href:"javascript:;",onClick:(0,Ee.D$)((l=>e.row.ConnectAddr="0.0.0.0"),["stop"])},[(0,t.bF)(i,null,{default:(0,t.k6)((()=>[(0,t.bF)(u)])),_:1})],8,Ne)]))],8,Ae))])),_:1}),(0,t.bF)(c,{prop:"ConnectPort",label:"目标端口",width:"80"},{default:(0,t.k6)((e=>[e.row.ConnectPortEditing?((0,t.uX)(),(0,t.Wv)(d,{key:0,autofocus:"",size:"small",modelValue:e.row.ConnectPort,"onUpdate:modelValue":l=>e.row.ConnectPort=l,onBlur:l=>o.handleEditBlur(e.row,"ConnectPort")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,t.uX)(),(0,t.CE)("a",{key:1,href:"javascript:;",class:"a-line",onClick:l=>o.handleEdit(e.row,"ConnectPort")},[e.row.Error?((0,t.uX)(),(0,t.CE)("strong",{key:0,title:e.row.Error,class:"red"},(0,n.v_)(e.row.ConnectPort),9,Be)):((0,t.uX)(),(0,t.CE)("span",Ue,[(0,t.eW)((0,n.v_)(e.row.ConnectPort)+" ",1),(0,t.Lk)("a",{href:"javascript:;",onClick:(0,Ee.D$)((l=>e.row.ConnectPort=0),["stop"])},[(0,t.bF)(i,null,{default:(0,t.k6)((()=>[(0,t.bF)(u)])),_:1})],8,$e)]))],8,xe))])),_:1}),(0,t.bF)(c,{prop:"Remark",label:"备注"},{default:(0,t.k6)((e=>[e.row.RemarkEditing?((0,t.uX)(),(0,t.Wv)(d,{key:0,autofocus:"",size:"small",modelValue:e.row.Remark,"onUpdate:modelValue":l=>e.row.Remark=l,onBlur:l=>o.handleEditBlur(e.row,"Remark")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,t.uX)(),(0,t.CE)("div",De,[(0,t.Lk)("a",{href:"javascript:;",class:"a-line",onClick:l=>o.handleEdit(e.row,"Remark")},(0,n.v_)(e.row.Remark||"无"),9,ze)]))])),_:1}),(0,t.bF)(c,{prop:"Oper",label:"操作",width:"110"},{default:(0,t.k6)((e=>[(0,t.Lk)("div",null,[(0,t.bF)(m,{title:"删除不可逆,是否确认?",onConfirm:l=>o.handleDel(e.$index)},{reference:(0,t.k6)((()=>[(0,t.bF)(h,{type:"danger",size:"small"},{default:(0,t.k6)((()=>[(0,t.bF)(i,null,{default:(0,t.k6)((()=>[(0,t.bF)(u)])),_:1})])),_:1})])),_:2},1032,["onConfirm"]),(0,t.bF)(h,{type:"primary",size:"small",onClick:l=>o.handleAdd(e.$index)},{default:(0,t.k6)((()=>[(0,t.bF)(i,null,{default:(0,t.k6)((()=>[(0,t.bF)(p)])),_:1})])),_:2},1032,["onClick"])])])),_:1})])),_:1},8,["data","onCellDblclick"])])])}var Qe={props:["modelValue"],emits:["update:modelValue"],components:{Delete:F.epd,Plus:F.FWt,Warning:F.N5l,Refresh:F.C42},setup(e){const l=(0,C.W)(),a=(0,u.Kh)({machineName:l.value.current.device.MachineName,forwards:0==l.value.current.Forwards.length?[{ListenAddr:"0.0.0.0",ListenPort:0,ConnectAddr:"0.0.0.0",ConnectPort:0,Remark:""}]:l.value.current.Forwards.slice(0),timer:0,testing:!1}),n=(e,l)=>{o(e,l.property)},o=(e,l)=>{a.forwards.forEach((e=>{e["ListenAddrEditing"]=!1,e["ListenPortEditing"]=!1,e["ConnectAddrEditing"]=!1,e["ConnectPortEditing"]=!1,e["RemarkEditing"]=!1})),e[`${l}Editing`]=!0,e["__editing"]=!0},r=(e,l)=>{e[`${l}Editing`]=!1,e["__editing"]=!1},s=e=>{1==a.forwards.length?a.forwards[0]={ListenAddr:"0.0.0.0",ListenPort:0,ConnectAddr:"0.0.0.0",ConnectPort:0,Remark:""}:a.forwards.splice(e,1)},d=e=>{a.forwards.filter((e=>"0.0.0.0"==e.ConnectAddr||0==e.ConnectPort||0==e.ListenPort)).length>0||a.forwards.splice(e+1,0,{ListenAddr:"0.0.0.0",ListenPort:0,ConnectAddr:"0.0.0.0",ConnectPort:0,Remark:""})},i=()=>{clearTimeout(a.timer),a.testing=!0,(0,ye._)({MachineId:l.value.current.MachineId,List:a.forwards.map((e=>({ListenAddr:e.ListenAddr,ListenPort:+e.ListenPort,ConnectAddr:e.ConnectAddr,ConnectPort:+e.ConnectPort})))}).then((e=>{var l=e.List;for(let t=0;t${e.ConnectAddr}:${e.ConnectPort}`,o=a.forwards.filter((e=>`${e.ListenPort}->${e.ConnectAddr}:${e.ConnectPort}`==n));for(let l=0;l{a.testing=!1,a.timer=setTimeout(i,3e3)}))};(0,t.sV)((()=>{i()})),(0,t.hi)((()=>{clearTimeout(a.timer)}));const c=()=>a.forwards.map((e=>(e.ListenPort=+e.ListenPort,e.ConnectPort=+e.ConnectPort,e)));return{state:a,handleCellClick:n,handleEditBlur:r,handleEdit:o,handleDel:s,handleAdd:d,getData:c}}};const je=(0,E.A)(Qe,[["render",Oe],["__scopeId","data-v-1f1a4aca"]]);var Ke=je;const Ge={class:"w-100"},qe=(0,t.Lk)("div",null,[(0,t.Lk)("span",{class:"yellow"},"使用系统NAT或应用层SNAT")],-1),He={class:"wrap"},Je=["onClick"],Ze=["title"],Ye={key:1},el=["onClick"],ll=["onClick"],al=["title"],tl={key:1},nl=["onClick"],ol=["title"],rl={key:1},sl=["onClick"],dl=["onClick"],ul=["title"],il={key:1};function cl(e,l,a,o,r,s){const d=(0,t.g2)("el-input"),u=(0,t.g2)("Delete"),i=(0,t.g2)("el-icon"),c=(0,t.g2)("el-table-column"),h=(0,t.g2)("el-checkbox"),m=(0,t.g2)("el-button"),p=(0,t.g2)("el-popconfirm"),g=(0,t.g2)("Plus"),w=(0,t.g2)("el-table");return(0,t.uX)(),(0,t.CE)("div",Ge,[qe,(0,t.Lk)("div",He,[(0,t.bF)(w,{stripe:"",data:o.state.lans,border:"",size:"small",width:"100%",height:"400px",onCellDblclick:o.handleCellClick},{default:(0,t.k6)((()=>[(0,t.bF)(c,{prop:"IP",label:"路由IP",width:"120"},{default:(0,t.k6)((e=>[e.row.IPEditing?((0,t.uX)(),(0,t.Wv)(d,{key:0,autofocus:"",size:"small",modelValue:e.row.IP,"onUpdate:modelValue":l=>e.row.IP=l,onBlur:l=>o.handleEditBlur(e.row,"IP")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,t.uX)(),(0,t.CE)("a",{key:1,href:"javascript:;",class:"a-line",onClick:l=>o.handleEdit(e.row,"IP")},[e.row.Error?((0,t.uX)(),(0,t.CE)("strong",{key:0,title:e.row.Error,class:"red"},(0,n.v_)(e.row.IP),9,Ze)):((0,t.uX)(),(0,t.CE)("span",Ye,[(0,t.eW)((0,n.v_)(e.row.IP)+" ",1),(0,t.Lk)("a",{href:"javascript:;",onClick:(0,Ee.D$)((l=>e.row.IP="0.0.0.0"),["stop"])},[(0,t.bF)(i,null,{default:(0,t.k6)((()=>[(0,t.bF)(u)])),_:1})],8,el)]))],8,Je))])),_:1}),(0,t.bF)(c,{prop:"PrefixLength",label:"路由掩码",width:"80"},{default:(0,t.k6)((e=>[e.row.PrefixLengthEditing?((0,t.uX)(),(0,t.Wv)(d,{key:0,autofocus:"",size:"small",modelValue:e.row.PrefixLength,"onUpdate:modelValue":l=>e.row.PrefixLength=l,onBlur:l=>o.handleEditBlur(e.row,"PrefixLength")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,t.uX)(),(0,t.CE)("a",{key:1,href:"javascript:;",class:"a-line",onClick:l=>o.handleEdit(e.row,"PrefixLength")},[e.row.Error?((0,t.uX)(),(0,t.CE)("strong",{key:0,title:e.row.Error,class:"red"},(0,n.v_)(e.row.PrefixLength),9,al)):((0,t.uX)(),(0,t.CE)("span",tl,(0,n.v_)(e.row.PrefixLength),1))],8,ll))])),_:1}),(0,t.bF)(c,{prop:"MapIP",label:"目标IP",width:"120"},{default:(0,t.k6)((e=>[e.row.MapIPEditing?((0,t.uX)(),(0,t.Wv)(d,{key:0,autofocus:"",size:"small",modelValue:e.row.MapIP,"onUpdate:modelValue":l=>e.row.MapIP=l,onBlur:l=>o.handleEditBlur(e.row,"MapIP")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,t.uX)(),(0,t.CE)("a",{key:1,href:"javascript:;",class:"a-line",onClick:l=>o.handleEdit(e.row,"MapIP")},[e.row.Error?((0,t.uX)(),(0,t.CE)("strong",{key:0,title:e.row.Error,class:"red"},(0,n.v_)(e.row.MapIP),9,ol)):((0,t.uX)(),(0,t.CE)("span",rl,[(0,t.eW)((0,n.v_)(e.row.MapIP)+" ",1),(0,t.Lk)("a",{href:"javascript:;",onClick:(0,Ee.D$)((l=>e.row.MapIP="0.0.0.0"),["stop"])},[(0,t.bF)(i,null,{default:(0,t.k6)((()=>[(0,t.bF)(u)])),_:1})],8,sl)]))],8,nl))])),_:1}),(0,t.bF)(c,{prop:"MapPrefixLength",label:"目标掩码",width:"80"},{default:(0,t.k6)((e=>[e.row.MapPrefixLengthEditing?((0,t.uX)(),(0,t.Wv)(d,{key:0,autofocus:"",size:"small",modelValue:e.row.MapPrefixLength,"onUpdate:modelValue":l=>e.row.MapPrefixLength=l,onBlur:l=>o.handleEditBlur(e.row,"MapPrefixLength")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,t.uX)(),(0,t.CE)("a",{key:1,href:"javascript:;",class:"a-line",onClick:l=>o.handleEdit(e.row,"MapPrefixLength")},[e.row.Error?((0,t.uX)(),(0,t.CE)("strong",{key:0,title:e.row.Error,class:"red"},(0,n.v_)(e.row.MapPrefixLength),9,ul)):((0,t.uX)(),(0,t.CE)("span",il,(0,n.v_)(e.row.MapPrefixLength),1))],8,dl))])),_:1}),(0,t.bF)(c,{prop:"Disabled",label:"禁用"},{default:(0,t.k6)((e=>[(0,t.bF)(h,{modelValue:e.row.Disabled,"onUpdate:modelValue":l=>e.row.Disabled=l,label:"禁用"},null,8,["modelValue","onUpdate:modelValue"])])),_:1}),(0,t.bF)(c,{prop:"Oper",label:"操作",width:"110"},{default:(0,t.k6)((e=>[(0,t.Lk)("div",null,[(0,t.bF)(p,{title:"删除不可逆,是否确认?",onConfirm:l=>o.handleDel(e.$index)},{reference:(0,t.k6)((()=>[(0,t.bF)(m,{type:"danger",size:"small"},{default:(0,t.k6)((()=>[(0,t.bF)(i,null,{default:(0,t.k6)((()=>[(0,t.bF)(u)])),_:1})])),_:1})])),_:2},1032,["onConfirm"]),(0,t.bF)(m,{type:"primary",size:"small",onClick:l=>o.handleAdd(e.$index)},{default:(0,t.k6)((()=>[(0,t.bF)(i,null,{default:(0,t.k6)((()=>[(0,t.bF)(g)])),_:1})])),_:2},1032,["onClick"])])])),_:1})])),_:1},8,["data","onCellDblclick"])])])}var hl={props:["modelValue"],emits:["update:modelValue"],components:{Delete:F.epd,Plus:F.FWt,Warning:F.N5l,Refresh:F.C42},setup(e){const l=(0,C.W)(),a=(0,u.Kh)({lans:l.value.current.Lans.slice(0).map((e=>(e.MapIP=e.MapIP||"0.0.0.0",e.MapPrefixLength=e.MapPrefixLength||24,e)))});0==a.lans.length&&a.lans.push({IP:"0.0.0.0",PrefixLength:24,MapIP:"0.0.0.0",MapPrefixLength:24});const t=(e,l)=>{n(e,l.property)},n=(e,l)=>{a.lans.forEach((e=>{e["IPEditing"]=!1,e["PrefixLengthEditing"]=!1,e["MapIPEditing"]=!1,e["MapPrefixLengthEditing"]=!1})),e[`${l}Editing`]=!0,e["__editing"]=!0},o=(e,l)=>{if(e[`${l}Editing`]=!1,e["__editing"]=!1,"PrefixLength"==l||"MapPrefixLength"==l){var a=+e[l];(a>32||a<0||isNaN(a))&&(a=24),e[l]=a}},r=e=>{a.lans.splice(e,1),0==a.lans.length&&s(0)},s=e=>{a.lans.splice(e+1,0,{IP:"0.0.0.0",PrefixLength:24,MapIP:"0.0.0.0",MapPrefixLength:24})},d=()=>a.lans.map((e=>(e.PrefixLength=+e.PrefixLength,e)));return{state:a,handleDel:r,handleAdd:s,getData:d,handleCellClick:t,handleEditBlur:o,handleEdit:n}}};const ml=(0,E.A)(hl,[["render",cl]]);var pl=ml;const gl=e=>((0,t.Qi)("data-v-2eb35cd0"),e=e(),(0,t.jt)(),e),wl={class:"wrap"},kl=gl((()=>(0,t.Lk)("span",null,"留空则使用【本组网络】的设置",-1))),vl=gl((()=>(0,t.Lk)("span",null,"/",-1)));function fl(e,l,a,n,o,r){const s=(0,t.g2)("el-input"),d=(0,t.g2)("el-form-item"),u=(0,t.g2)("el-checkbox"),i=(0,t.g2)("el-form");return(0,t.uX)(),(0,t.CE)("div",wl,[(0,t.bF)(i,{ref:"ruleFormRef",model:n.state.ruleForm,rules:n.state.rules,"label-width":"8rem"},{default:(0,t.k6)((()=>[(0,t.bF)(d,{label:"网卡名",prop:"Name"},{default:(0,t.k6)((()=>[(0,t.bF)(s,{modelValue:n.state.ruleForm.Name,"onUpdate:modelValue":l[0]||(l[0]=e=>n.state.ruleForm.Name=e),style:{width:"14rem"}},null,8,["modelValue"]),(0,t.eW)(),kl])),_:1}),(0,t.bF)(d,{label:"网卡IP",prop:"IP",class:"mgb-0"},{default:(0,t.k6)((()=>[(0,t.bF)(s,{modelValue:n.state.ruleForm.IP,"onUpdate:modelValue":l[1]||(l[1]=e=>n.state.ruleForm.IP=e),style:{width:"14rem"}},null,8,["modelValue"]),vl,(0,t.bF)(s,{onChange:n.handlePrefixLengthChange,modelValue:n.state.ruleForm.PrefixLength,"onUpdate:modelValue":l[2]||(l[2]=e=>n.state.ruleForm.PrefixLength=e),style:{width:"4rem"}},null,8,["onChange","modelValue"])])),_:1}),(0,t.bF)(d,{label:"",class:"mgb-0"},{default:(0,t.k6)((()=>[(0,t.bF)(u,{class:"mgr-1",modelValue:n.state.ruleForm.ShowDelay,"onUpdate:modelValue":l[3]||(l[3]=e=>n.state.ruleForm.ShowDelay=e),label:"显示延迟",size:"large"},null,8,["modelValue"]),(0,t.bF)(u,{class:"mgr-1",modelValue:n.state.ruleForm.AutoConnect,"onUpdate:modelValue":l[4]||(l[4]=e=>n.state.ruleForm.AutoConnect=e),label:"自动连接",size:"large"},null,8,["modelValue"]),(0,t.bF)(u,{class:"mgr-1",modelValue:n.state.ruleForm.Multicast,"onUpdate:modelValue":l[5]||(l[5]=e=>n.state.ruleForm.Multicast=e),label:"禁用广播",size:"large"},null,8,["modelValue"]),(0,t.bF)(u,{class:"mgr-1",modelValue:n.state.ruleForm.Nat,"onUpdate:modelValue":l[6]||(l[6]=e=>n.state.ruleForm.Nat=e),label:"禁用NAT",size:"large"},null,8,["modelValue"]),(0,t.bF)(u,{class:"mgr-1",modelValue:n.state.ruleForm.TcpMerge,"onUpdate:modelValue":l[7]||(l[7]=e=>n.state.ruleForm.TcpMerge=e),label:"TCP包合并",size:"large"},null,8,["modelValue"]),(0,t.bF)(u,{modelValue:n.state.ruleForm.InterfaceOrder,"onUpdate:modelValue":l[8]||(l[8]=e=>n.state.ruleForm.InterfaceOrder=e),label:"调整网卡顺序",size:"large"},null,8,["modelValue"])])),_:1})])),_:1},8,["model","rules"])])}var bl={emits:["change"],components:{Delete:F.epd,Plus:F.FWt,Warning:F.N5l,Refresh:F.C42,TuntapForward:Ke,TuntapLan:pl},setup(e,{emit:l}){const a=(0,C.W)(),t=(0,u.KR)(null),n=(0,u.Kh)({ruleForm:{IP:a.value.current.IP,PrefixLength:a.value.current.PrefixLength||24,Gateway:a.value.current.Gateway,ShowDelay:a.value.current.ShowDelay,AutoConnect:a.value.current.AutoConnect,Upgrade:a.value.current.Upgrade,Multicast:a.value.current.Multicast,Nat:a.value.current.Nat,TcpMerge:a.value.current.TcpMerge,InterfaceOrder:a.value.current.InterfaceOrder,Forwards:a.value.current.Forwards,Name:a.value.current.Name},rules:{Name:{type:"string",pattern:/^$|^[A-Za-z][A-Za-z0-9]{0,31}$/,message:"请输入正确的网卡名",transform(e){return e.trim()}}}}),o=()=>{var e=+n.ruleForm.PrefixLength;(e>32||e<16||isNaN(e))&&(e=24),n.ruleForm.PrefixLength=e},r=()=>{const e=JSON.parse(JSON.stringify(a.value.current));return e.IP=n.ruleForm.IP.replace(/\s/g,"")||"0.0.0.0",e.PrefixLength=+n.ruleForm.PrefixLength,e.Gateway=n.ruleForm.Gateway,e.ShowDelay=n.ruleForm.ShowDelay,e.AutoConnect=n.ruleForm.AutoConnect,e.Upgrade=n.ruleForm.Upgrade,e.Multicast=n.ruleForm.Multicast,e.Nat=n.ruleForm.Nat,e.TcpMerge=n.ruleForm.TcpMerge,e.InterfaceOrder=n.ruleForm.InterfaceOrder,e.Name=n.ruleForm.Name,e};return{state:n,ruleFormRef:t,handlePrefixLengthChange:o,getData:r}}};const Cl=(0,E.A)(bl,[["render",fl],["__scopeId","data-v-2eb35cd0"]]);var Fl=Cl,yl={props:["modelValue"],emits:["change","update:modelValue"],components:{TuntapForward:Ke,TuntapLan:pl,TuntapIP:Fl},setup(e,{emit:l}){const a=(0,C.W)(),n=(0,u.Kh)({show:!0,machineName:a.value.current.device.MachineName,loading:!1});(0,t.wB)((()=>n.show),(e=>{e||setTimeout((()=>{l("update:modelValue",e)}),300)}));const o=(0,u.KR)(null),r=(0,u.KR)(null),s=(0,u.KR)(null),d=()=>{n.loading=!0;const e=o.value.getData();e.Lans=r.value?r.value.getData():a.value.current.Lans,e.Forwards=s.value?s.value.getData():a.value.current.Forwards,(0,ye.ac)(e).then((()=>{n.show=!1,n.loading=!1,i.nk.success("已操作!"),l("change")})).catch((e=>{n.loading=!1,console.log(e),i.nk.error("操作失败!")}))};return{state:n,handleSave:d,ipDom:o,lanDom:r,forwardDom:s}}};const El=(0,E.A)(yl,[["render",Fe],["__scopeId","data-v-87d2a32c"]]);var _l=El;const Vl=e=>((0,t.Qi)("data-v-67ed3552"),e=e(),(0,t.jt)(),e),Ll=Vl((()=>(0,t.Lk)("p",null,"网络租期30天、IP租期7天",-1))),Pl=Vl((()=>(0,t.Lk)("span",null,"/",-1))),Il=Vl((()=>(0,t.Lk)("span",{style:{width:"1rem"}},null,-1))),Tl={class:"calc"},Ml=Vl((()=>(0,t.Lk)("span",{class:"label"},"网络号",-1))),Sl={class:"value"},Wl=Vl((()=>(0,t.Lk)("span",{class:"label"},"网关",-1))),Al={class:"value"},Xl=Vl((()=>(0,t.Lk)("span",{class:"label"},"开始IP",-1))),Rl={class:"value"},Nl=Vl((()=>(0,t.Lk)("span",{class:"label"},"结束IP",-1))),xl={class:"value"},Bl=Vl((()=>(0,t.Lk)("span",{class:"label"},"广播号",-1))),Ul={class:"value"},$l=Vl((()=>(0,t.Lk)("span",{class:"label"},"IP数量",-1))),Dl={class:"value"};function zl(e,l,a,o,r,s){const d=(0,t.g2)("el-form-item"),u=(0,t.g2)("el-input"),i=(0,t.g2)("el-button"),c=(0,t.g2)("el-form"),h=(0,t.g2)("el-dialog");return(0,t.uX)(),(0,t.Wv)(h,{modelValue:o.state.show,"onUpdate:modelValue":l[4]||(l[4]=e=>o.state.show=e),"close-on-click-modal":!1,"append-to":".app-wrap",title:"配置本组的网络",top:"1vh",width:"400"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",null,[(0,t.bF)(c,{ref:"ruleFormRef",model:o.state.ruleForm,rules:o.state.rules,"label-width":"100"},{default:(0,t.k6)((()=>[(0,t.bF)(d,{prop:"gateway"},{default:(0,t.k6)((()=>[Ll])),_:1}),(0,t.bF)(d,{label:"网卡名",prop:"Name"},{default:(0,t.k6)((()=>[(0,t.bF)(u,{modelValue:o.state.ruleForm.Name,"onUpdate:modelValue":l[0]||(l[0]=e=>o.state.ruleForm.Name=e),style:{width:"14rem"}},null,8,["modelValue"])])),_:1}),(0,t.bF)(d,{label:"网络前缀",prop:"IP"},{default:(0,t.k6)((()=>[(0,t.bF)(u,{modelValue:o.state.ruleForm.IP,"onUpdate:modelValue":l[1]||(l[1]=e=>o.state.ruleForm.IP=e),style:{width:"14rem"},onChange:o.handlePrefixLengthChange},null,8,["modelValue","onChange"]),Pl,(0,t.bF)(u,{onChange:o.handlePrefixLengthChange,modelValue:o.state.ruleForm.PrefixLength,"onUpdate:modelValue":l[2]||(l[2]=e=>o.state.ruleForm.PrefixLength=e),style:{width:"4rem"}},null,8,["onChange","modelValue"]),Il,(0,t.bF)(i,{onClick:o.handleClear},{default:(0,t.k6)((()=>[(0,t.eW)("重置")])),_:1},8,["onClick"])])),_:1}),(0,t.bF)(d,{label:"",prop:"IP1"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",Tl,[(0,t.Lk)("p",null,[Ml,(0,t.Lk)("span",Sl,(0,n.v_)(o.state.values.Network),1)]),(0,t.Lk)("p",null,[Wl,(0,t.Lk)("span",Al,(0,n.v_)(o.state.values.Gateway),1)]),(0,t.Lk)("p",null,[Xl,(0,t.Lk)("span",Rl,(0,n.v_)(o.state.values.Start),1)]),(0,t.Lk)("p",null,[Nl,(0,t.Lk)("span",xl,(0,n.v_)(o.state.values.End),1)]),(0,t.Lk)("p",null,[Bl,(0,t.Lk)("span",Ul,(0,n.v_)(o.state.values.Broadcast),1)]),(0,t.Lk)("p",null,[$l,(0,t.Lk)("span",Dl,(0,n.v_)(o.state.values.Count),1)])])])),_:1}),o.hasLease?((0,t.uX)(),(0,t.Wv)(d,{key:0,label:"",prop:"Btns"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",null,[(0,t.bF)(i,{onClick:l[3]||(l[3]=e=>o.state.show=!1)},{default:(0,t.k6)((()=>[(0,t.eW)("取消")])),_:1}),(0,t.bF)(i,{type:"primary",onClick:o.handleSave},{default:(0,t.k6)((()=>[(0,t.eW)("确认")])),_:1},8,["onClick"])])])),_:1})):(0,t.Q3)("",!0)])),_:1},8,["model","rules"])])])),_:1},8,["modelValue"])}var Ol={props:["modelValue"],emits:["change","update:modelValue"],components:{Delete:F.epd,Plus:F.FWt},setup(e,{emit:l}){const a=(0,d.B)(),n=(0,t.EW)((()=>a.value.hasAccess("Lease"))),o=(0,u.KR)(null),r=(0,u.Kh)({show:!0,ruleForm:{Name:"",IP:"0.0.0.0",PrefixLength:24},rules:{Name:{type:"string",pattern:/^$|^[A-Za-z][A-Za-z0-9]{0,31}$/,message:"请输入正确的网卡名",transform(e){return e.trim()}}},values:{}});(0,t.wB)((()=>r.show),(e=>{e||setTimeout((()=>{l("update:modelValue",e)}),300)}));const s=()=>{(0,ye.w0)(r.ruleForm).then((e=>{r.values=e}))},c=()=>{(0,ye.Nj)().then((e=>{r.ruleForm.Name=e.Name,r.ruleForm.IP=e.IP,r.ruleForm.PrefixLength=e.PrefixLength,s()}))},h=()=>{var e=+r.ruleForm.PrefixLength;(e>32||e<16||isNaN(e))&&(e=24),r.ruleForm.PrefixLength=e,s()},m=()=>{(0,ye.AE)(r.ruleForm).then((()=>{i.nk.success("已操作"),r.show=!1})).catch((e=>{console.log(e),i.nk.error("操作失败")}))},p=()=>{(0,ye.AE)({Name:"",IP:"0.0.0.0",PrefixLength:24}).then((()=>{i.nk.success("已操作"),c()})).catch((e=>{console.log(e),i.nk.error("操作失败")}))};return(0,t.sV)((()=>{c()})),{state:r,hasLease:n,ruleFormRef:o,handleSave:m,handlePrefixLengthChange:h,handleClear:p}}};const Ql=(0,E.A)(Ol,[["render",zl],["__scopeId","data-v-67ed3552"]]);var jl=Ql;function Kl(e,l,a,o,r,s){const d=(0,t.g2)("el-table-column"),u=(0,t.g2)("el-table"),i=(0,t.g2)("el-dialog");return(0,t.uX)(),(0,t.Wv)(i,{modelValue:o.state.show,"onUpdate:modelValue":l[0]||(l[0]=e=>o.state.show=e),"append-to":".app-wrap",title:`[${o.state.machineName}]上的路由`,top:"1vh"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",null,[(0,t.bF)(u,{data:o.state.data,size:"small",border:"",height:"500"},{default:(0,t.k6)((()=>[(0,t.bF)(d,{property:"Ip",label:"IP"}),(0,t.bF)(d,{property:"Id",label:"目标"},{default:(0,t.k6)((e=>[(0,t.Lk)("span",null,(0,n.v_)(o.state.names[e.row.Id]),1)])),_:1})])),_:1},8,["data"])])])),_:1},8,["modelValue","title"])}var Gl={props:["modelValue"],emits:["update:modelValue"],setup(e,{emit:l}){const a=(0,C.W)(),n=(0,u.Kh)({show:!0,machineId:a.value.device.id,machineName:a.value.device.name,data:[],names:{},timer:0});return(0,t.wB)((()=>n.show),(e=>{e||setTimeout((()=>{l("update:modelValue",e),l("change")}),300)})),(0,t.sV)((()=>{(0,M.NT)().then((e=>{n.names=e.reduce(((e,l)=>(e[l.MachineId]=l.MachineName,e)),{})})).catch((()=>{})),(0,ye.bP)(n.machineId).then((e=>{n.data=Object.keys(e).map((l=>({Ip:l,Id:e[l]})))})).catch((()=>{}))})),(0,t.hi)((()=>{})),{state:n}}};const ql=(0,E.A)(Gl,[["render",Kl]]);var Hl=ql;function Jl(e,l,a,n,o,r){const s=(0,t.g2)("Firewall"),d=(0,t.g2)("el-dialog");return(0,t.uX)(),(0,t.Wv)(d,{modelValue:n.state.show,"onUpdate:modelValue":l[0]||(l[0]=e=>n.state.show=e),"append-to":".app-wrap",title:`[${n.state.machineName}]上的防火墙`,top:"1vh",width:"760"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",null,[(0,t.bF)(s,{machineId:n.state.machineId},null,8,["machineId"])])])),_:1},8,["modelValue","title"])}var Zl=a(8827),Yl={props:["modelValue"],emits:["update:modelValue"],components:{Firewall:Zl.A},setup(e,{emit:l}){const a=(0,C.W)(),n=(0,u.Kh)({show:!0,machineId:a.value.device.id,machineName:a.value.device.name});return(0,t.wB)((()=>n.show),(e=>{e||setTimeout((()=>{l("update:modelValue",e),l("change")}),300)})),{state:n}}};const ea=(0,E.A)(Yl,[["render",Jl]]);var la=ea;const aa={key:0};function ta(e,l,a,n,o,r){const s=(0,t.g2)("Socks5Show"),d=(0,t.g2)("el-table-column");return(0,t.uX)(),(0,t.Wv)(d,{prop:"socks5",label:n.socks5.show?"代理转发":"",width:"160"},{default:(0,t.k6)((e=>[n.socks5.show&&n.socks5.list[e.row.MachineId]?((0,t.uX)(),(0,t.CE)("div",aa,[(0,t.bF)(s,{config:!0,item:e.row,onEdit:n.handleSocks5,onRefresh:n.handleSocks5Refresh},null,8,["item","onEdit","onRefresh"])])):(0,t.Q3)("",!0)])),_:1},8,["label"])}const na={class:"flex"},oa={class:"flex-1"},ra=["title"],sa={key:0,class:"green gateway"},da={key:1},ua={key:0},ia={key:0,class:"flex disable",title:"已禁用"},ca={key:1,class:"flex yellow",title:"与其它设备填写IP、或本机局域网IP有冲突"};function ha(e,l,a,o,r,s){const d=(0,t.g2)("ConnectionShow"),u=(0,t.g2)("Loading"),i=(0,t.g2)("el-icon"),c=(0,t.g2)("el-switch");return(0,t.uX)(),(0,t.CE)("div",null,[(0,t.Lk)("div",na,[(0,t.Lk)("div",oa,[(0,t.bF)(d,{data:o.connections.list[o.item.MachineId],row:o.item,transitionId:"socks5"},null,8,["data","row"]),(0,t.Lk)("a",{href:"javascript:;",class:"a-line",onClick:l[0]||(l[0]=e=>o.handleSocks5Port(o.socks5.list[o.item.MachineId])),title:"此设备的socks5代理"},[o.socks5.list[o.item.MachineId].SetupError?((0,t.uX)(),(0,t.CE)("strong",{key:0,class:"red",title:o.socks5.list[o.item.MachineId].SetupError}," socks5://*:"+(0,n.v_)(o.socks5.list[o.item.MachineId].Port),9,ra)):((0,t.uX)(),(0,t.CE)(t.FK,{key:1},[o.item.Connected&&o.socks5.list[o.item.MachineId].running?((0,t.uX)(),(0,t.CE)("strong",sa,"socks5://*:"+(0,n.v_)(o.socks5.list[o.item.MachineId].Port),1)):((0,t.uX)(),(0,t.CE)("span",da,"socks5://*:"+(0,n.v_)(o.socks5.list[o.item.MachineId].Port),1))],64))])]),o.socks5.list[o.item.MachineId].loading?((0,t.uX)(),(0,t.CE)("div",ua,[(0,t.bF)(i,{size:"14",class:"loading"},{default:(0,t.k6)((()=>[(0,t.bF)(u)])),_:1})])):((0,t.uX)(),(0,t.Wv)(c,{key:1,"model-value":o.item.Connected&&o.socks5.list[o.item.MachineId].running,loading:o.socks5.list[o.item.MachineId].loading,disabled:"",onClick:l[1]||(l[1]=e=>o.handleSocks5(o.socks5.list[o.item.MachineId])),size:"small","inline-prompt":"","active-text":"😀","inactive-text":"😣"},null,8,["model-value","loading"]))]),(0,t.Lk)("div",null,[(0,t.Lk)("div",null,[((0,t.uX)(!0),(0,t.CE)(t.FK,null,(0,t.pI)(o.socks5.list[o.item.MachineId].Lans,((e,l)=>((0,t.uX)(),(0,t.CE)(t.FK,{key:l},[e.Disabled?((0,t.uX)(),(0,t.CE)("div",ia,(0,n.v_)(e.IP)+" / "+(0,n.v_)(e.PrefixLength),1)):e.Exists?((0,t.uX)(),(0,t.CE)("div",ca,(0,n.v_)(e.IP)+" / "+(0,n.v_)(e.PrefixLength),1)):((0,t.uX)(),(0,t.CE)("div",{key:2,class:(0,n.C4)(["flex green",{green:o.item.Connected&&o.socks5.list[o.item.MachineId].running}]),title:"正常使用"},(0,n.v_)(e.IP)+" / "+(0,n.v_)(e.PrefixLength),3))],64)))),128))])])])}var ma=a(9983),pa=a(6132),ga={props:["item","config"],emits:["edit","refresh"],components:{Loading:F.Rhj,ConnectionShow:pa.A},setup(e,{emit:l}){const a=b(),n=(0,d.B)(),o=(0,t.EW)((()=>n.value.config.Client.Id)),r=(0,t.EW)((()=>n.value.hasAccess("Socks5ChangeSelf"))),s=(0,t.EW)((()=>n.value.hasAccess("Socks5ChangeOther"))),u=(0,t.EW)((()=>n.value.hasAccess("Socks5StatusSelf"))),c=(0,t.EW)((()=>n.value.hasAccess("Socks5StatusOther"))),h=(0,ma.bB)(),m=l=>{if(!e.config)return;if(o.value===l.MachineId){if(!u.value)return}else if(!c.value)return;const a=e.item.Connected&&l.running?(0,k.R2)(l.MachineId):(0,k.qH)(l.MachineId);l.loading=!0,a.then((()=>{i.nk.success("操作成功!")})).catch((e=>{console.log(e),i.nk.error("操作失败!")}))},p=a=>{if(e.config||o.value==a.MachineId){if(o.value===a.MachineId){if(!r.value)return}else if(!s.value)return;a.device=e.item,l("edit",a)}},g=()=>{l("refresh")};return{item:(0,t.EW)((()=>e.item)),socks5:a,connections:h,handleSocks5:m,handleSocks5Port:p,handleSocks5Refresh:g}}};const wa=(0,E.A)(ga,[["render",ha],["__scopeId","data-v-10c6aa99"]]);var ka=wa,va={emits:["edit","refresh"],components:{Socks5Show:ka},setup(e,{emit:l}){const a=b(),t=e=>{l("edit",e)},n=()=>{l("refresh")};return{socks5:a,handleSocks5:t,handleSocks5Refresh:n}}};const fa=(0,E.A)(va,[["render",ta]]);var ba=fa;const Ca={class:"upgrade-wrap"},Fa={class:"t-c w-100"};function ya(e,l,a,n,o,r){const s=(0,t.g2)("el-form-item"),d=(0,t.g2)("el-input"),u=(0,t.g2)("Socks5Lan"),i=(0,t.g2)("el-button"),c=(0,t.g2)("el-form"),h=(0,t.g2)("el-dialog");return(0,t.uX)(),(0,t.Wv)(h,{modelValue:n.state.show,"onUpdate:modelValue":l[2]||(l[2]=e=>n.state.show=e),"close-on-click-modal":!1,"append-to":".app-wrap",title:`设置[${n.state.machineName}]代理`,top:"1vh",width:"700"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",null,[(0,t.bF)(c,{ref:"ruleFormRef",model:n.state.ruleForm,rules:n.state.rules,"label-width":"140"},{default:(0,t.k6)((()=>[(0,t.bF)(s,{prop:"gateway",style:{"margin-bottom":"0"}},{default:(0,t.k6)((()=>[(0,t.eW)(" 配置代理,通过代理访问其它设备 ")])),_:1}),(0,t.bF)(s,{label:"代理端口",prop:"Port"},{default:(0,t.k6)((()=>[(0,t.bF)(d,{modelValue:n.state.ruleForm.Port,"onUpdate:modelValue":l[0]||(l[0]=e=>n.state.ruleForm.Port=e),style:{width:"14rem"}},null,8,["modelValue"])])),_:1}),(0,t.Lk)("div",Ca,[(0,t.bF)(u,{ref:"socks5Dom"},null,512)]),(0,t.bF)(s,{label:"",prop:"Btns","label-width":"0"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",Fa,[(0,t.bF)(i,{onClick:l[1]||(l[1]=e=>n.state.show=!1)},{default:(0,t.k6)((()=>[(0,t.eW)("取消")])),_:1}),(0,t.bF)(i,{type:"primary",onClick:n.handleSave},{default:(0,t.k6)((()=>[(0,t.eW)("确认")])),_:1},8,["onClick"])])])),_:1})])),_:1},8,["model","rules"])])])),_:1},8,["modelValue","title"])}const Ea={class:"w-100"},_a={class:"wrap"},Va=["onClick"],La=["title"],Pa={key:1},Ia=["onClick"],Ta=["onClick"],Ma=["title"],Sa={key:1},Wa=["onClick"],Aa=["title"],Xa={key:1},Ra=["onClick"],Na=["onClick"],xa=["title"],Ba={key:1};function Ua(e,l,a,o,r,s){const d=(0,t.g2)("el-input"),u=(0,t.g2)("Delete"),i=(0,t.g2)("el-icon"),c=(0,t.g2)("el-table-column"),h=(0,t.g2)("el-checkbox"),m=(0,t.g2)("el-button"),p=(0,t.g2)("el-popconfirm"),g=(0,t.g2)("Plus"),w=(0,t.g2)("el-table");return(0,t.uX)(),(0,t.CE)("div",Ea,[(0,t.Lk)("div",_a,[(0,t.bF)(w,{stripe:"",data:o.state.lans,border:"",size:"small",width:"100%",height:"400px",onCellDblclick:o.handleCellClick},{default:(0,t.k6)((()=>[(0,t.bF)(c,{prop:"IP",label:"路由IP",width:"120"},{default:(0,t.k6)((e=>[e.row.IPEditing?((0,t.uX)(),(0,t.Wv)(d,{key:0,autofocus:"",size:"small",modelValue:e.row.IP,"onUpdate:modelValue":l=>e.row.IP=l,onBlur:l=>o.handleEditBlur(e.row,"IP")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,t.uX)(),(0,t.CE)("a",{key:1,href:"javascript:;",class:"a-line",onClick:l=>o.handleEdit(e.row,"IP")},[e.row.Error?((0,t.uX)(),(0,t.CE)("strong",{key:0,title:e.row.Error,class:"red"},(0,n.v_)(e.row.IP),9,La)):((0,t.uX)(),(0,t.CE)("span",Pa,[(0,t.eW)((0,n.v_)(e.row.IP)+" ",1),(0,t.Lk)("a",{href:"javascript:;",onClick:(0,Ee.D$)((l=>e.row.IP="0.0.0.0"),["stop"])},[(0,t.bF)(i,null,{default:(0,t.k6)((()=>[(0,t.bF)(u)])),_:1})],8,Ia)]))],8,Va))])),_:1}),(0,t.bF)(c,{prop:"PrefixLength",label:"路由掩码",width:"80"},{default:(0,t.k6)((e=>[e.row.PrefixLengthEditing?((0,t.uX)(),(0,t.Wv)(d,{key:0,autofocus:"",size:"small",modelValue:e.row.PrefixLength,"onUpdate:modelValue":l=>e.row.PrefixLength=l,onBlur:l=>o.handleEditBlur(e.row,"PrefixLength")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,t.uX)(),(0,t.CE)("a",{key:1,href:"javascript:;",class:"a-line",onClick:l=>o.handleEdit(e.row,"PrefixLength")},[e.row.Error?((0,t.uX)(),(0,t.CE)("strong",{key:0,title:e.row.Error,class:"red"},(0,n.v_)(e.row.PrefixLength),9,Ma)):((0,t.uX)(),(0,t.CE)("span",Sa,(0,n.v_)(e.row.PrefixLength),1))],8,Ta))])),_:1}),(0,t.bF)(c,{prop:"MapIP",label:"目标IP",width:"120"},{default:(0,t.k6)((e=>[e.row.MapIPEditing?((0,t.uX)(),(0,t.Wv)(d,{key:0,autofocus:"",size:"small",modelValue:e.row.MapIP,"onUpdate:modelValue":l=>e.row.MapIP=l,onBlur:l=>o.handleEditBlur(e.row,"MapIP")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,t.uX)(),(0,t.CE)("a",{key:1,href:"javascript:;",class:"a-line",onClick:l=>o.handleEdit(e.row,"MapIP")},[e.row.Error?((0,t.uX)(),(0,t.CE)("strong",{key:0,title:e.row.Error,class:"red"},(0,n.v_)(e.row.MapIP),9,Aa)):((0,t.uX)(),(0,t.CE)("span",Xa,[(0,t.eW)((0,n.v_)(e.row.MapIP)+" ",1),(0,t.Lk)("a",{href:"javascript:;",onClick:(0,Ee.D$)((l=>e.row.MapIP="0.0.0.0"),["stop"])},[(0,t.bF)(i,null,{default:(0,t.k6)((()=>[(0,t.bF)(u)])),_:1})],8,Ra)]))],8,Wa))])),_:1}),(0,t.bF)(c,{prop:"MapPrefixLength",label:"目标掩码",width:"80"},{default:(0,t.k6)((e=>[e.row.MapPrefixLengthEditing?((0,t.uX)(),(0,t.Wv)(d,{key:0,autofocus:"",size:"small",modelValue:e.row.MapPrefixLength,"onUpdate:modelValue":l=>e.row.MapPrefixLength=l,onBlur:l=>o.handleEditBlur(e.row,"MapPrefixLength")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,t.uX)(),(0,t.CE)("a",{key:1,href:"javascript:;",class:"a-line",onClick:l=>o.handleEdit(e.row,"MapPrefixLength")},[e.row.Error?((0,t.uX)(),(0,t.CE)("strong",{key:0,title:e.row.Error,class:"red"},(0,n.v_)(e.row.MapPrefixLength),9,xa)):((0,t.uX)(),(0,t.CE)("span",Ba,(0,n.v_)(e.row.MapPrefixLength),1))],8,Na))])),_:1}),(0,t.bF)(c,{prop:"Disabled",label:"禁用"},{default:(0,t.k6)((e=>[(0,t.bF)(h,{modelValue:e.row.Disabled,"onUpdate:modelValue":l=>e.row.Disabled=l,label:"禁用"},null,8,["modelValue","onUpdate:modelValue"])])),_:1}),(0,t.bF)(c,{prop:"Oper",label:"操作",width:"110"},{default:(0,t.k6)((e=>[(0,t.Lk)("div",null,[(0,t.bF)(p,{title:"删除不可逆,是否确认?",onConfirm:l=>o.handleDel(e.$index)},{reference:(0,t.k6)((()=>[(0,t.bF)(m,{type:"danger",size:"small"},{default:(0,t.k6)((()=>[(0,t.bF)(i,null,{default:(0,t.k6)((()=>[(0,t.bF)(u)])),_:1})])),_:1})])),_:2},1032,["onConfirm"]),(0,t.bF)(m,{type:"primary",size:"small",onClick:l=>o.handleAdd(e.$index)},{default:(0,t.k6)((()=>[(0,t.bF)(i,null,{default:(0,t.k6)((()=>[(0,t.bF)(g)])),_:1})])),_:2},1032,["onClick"])])])),_:1})])),_:1},8,["data","onCellDblclick"])])])}var $a={props:["modelValue"],emits:["update:modelValue"],components:{Delete:F.epd,Plus:F.FWt,Warning:F.N5l,Refresh:F.C42},setup(e){const l=b(),a=(0,u.Kh)({lans:l.value.current.Lans.slice(0).map((e=>(e.MapIP=e.MapIP||"0.0.0.0",e.MapPrefixLength=e.MapPrefixLength||24,e)))});0==a.lans.length&&a.lans.push({IP:"0.0.0.0",PrefixLength:24,MapIP:"0.0.0.0",MapPrefixLength:24});const t=(e,l)=>{n(e,l.property)},n=(e,l)=>{a.lans.forEach((e=>{e["IPEditing"]=!1,e["PrefixLengthEditing"]=!1,e["MapIPEditing"]=!1,e["MapPrefixLengthEditing"]=!1})),e[`${l}Editing`]=!0,e["__editing"]=!0},o=(e,l)=>{if(e[`${l}Editing`]=!1,e["__editing"]=!1,"PrefixLength"==l||"MapPrefixLength"==l){var a=+e[l];(a>32||a<0||isNaN(a))&&(a=24),e[l]=a}},r=e=>{a.lans.splice(e,1),0==a.lans.length&&s(0)},s=e=>{a.lans.splice(e+1,0,{IP:"0.0.0.0",PrefixLength:24,MapIP:"0.0.0.0",MapPrefixLength:24})},d=()=>a.lans.map((e=>(e.PrefixLength=+e.PrefixLength,e)));return{state:a,handleDel:r,handleAdd:s,getData:d,handleCellClick:t,handleEditBlur:o,handleEdit:n}}};const Da=(0,E.A)($a,[["render",Ua]]);var za=Da,Oa={props:["modelValue"],emits:["change","update:modelValue"],components:{Socks5Lan:za},setup(e,{emit:l}){const a=(0,d.B)(),n=b(),o=(0,u.KR)(null),r=(0,u.Kh)({show:!0,machineName:n.value.current.device.MachineName,bufferSize:a.value.bufferSize,ruleForm:{Port:n.value.current.Port,Lans:[]},rules:{}});0==r.ruleForm.Lans.length&&r.ruleForm.Lans.push({IP:"0.0.0.0",PrefixLength:24}),(0,t.wB)((()=>r.show),(e=>{e||setTimeout((()=>{l("update:modelValue",e)}),300)}));const s=(0,u.KR)(null),c=()=>{const e=JSON.parse(JSON.stringify(n.value.current));e.Port=+(r.ruleForm.Port||"1805"),e.Lans=s.value.getData(),(0,k._Q)(e).then((()=>{r.show=!1,i.nk.success("已操作!"),l("change")})).catch((e=>{console.log(e),i.nk.error("操作失败!")}))};return{state:r,ruleFormRef:o,socks5Dom:s,handleSave:c}}};const Qa=(0,E.A)(Oa,[["render",ya],["__scopeId","data-v-2ea91b4b"]]);var ja=Qa;const Ka=["title","src"],Ga={key:1,title:"?",class:"system",src:"/system.svg"},qa=["title","src"],Ha={key:3,title:"?",class:"system",src:"/system.svg"},Ja=["title"],Za={key:5,title:"?",class:"system",src:"/system.svg"},Ya={class:"flex"},et=["title","onClick"];function lt(e,l,a,o,r,s){const d=(0,t.g2)("el-table-column");return(0,t.uX)(),(0,t.Wv)(d,{prop:"tunnel",label:"网络",width:"76"},{default:(0,t.k6)((e=>[o.tunnel.list[e.row.MachineId]?((0,t.uX)(),(0,t.CE)(t.FK,{key:0},[(0,t.Lk)("div",null,[o.tunnel.list[e.row.MachineId].Net.CountryCode?((0,t.uX)(),(0,t.CE)("img",{key:0,title:`${o.tunnel.list[e.row.MachineId].Net.CountryCode}、${o.tunnel.list[e.row.MachineId].Net.City}`,class:"system",src:`https://unpkg.com/flag-icons@7.2.3/flags/4x3/${o.tunnel.list[e.row.MachineId].Net.CountryCode.toLowerCase()}.svg`},null,8,Ka)):((0,t.uX)(),(0,t.CE)("img",Ga)),o.tunnel.list[e.row.MachineId].Net.Isp?((0,t.uX)(),(0,t.CE)("img",{key:2,title:`${o.tunnel.list[e.row.MachineId].Net.Isp}`,class:"system",src:o.netImg(o.tunnel.list[e.row.MachineId].Net)},null,8,qa)):((0,t.uX)(),(0,t.CE)("img",Ha)),o.tunnel.list[e.row.MachineId].Net.Nat?((0,t.uX)(),(0,t.CE)("span",{key:4,class:"nat",title:o.tunnel.list[e.row.MachineId].Net.Nat},(0,n.v_)(o.natMap[o.tunnel.list[e.row.MachineId].Net.Nat]),9,Ja)):((0,t.uX)(),(0,t.CE)("img",Za))]),(0,t.Lk)("div",Ya,[(0,t.Lk)("a",{href:"javascript:;",class:(0,n.C4)(["a-line",{yellow:o.tunnel.list[e.row.MachineId].NeedReboot}]),title:o.title(o.tunnel.list[e.row.MachineId]),onClick:l=>o.handleTunnel(o.tunnel.list[e.row.MachineId],e.row)},[(0,t.Lk)("span",null,"跳点:"+(0,n.v_)(o.tunnel.list[e.row.MachineId].RouteLevel)+"+"+(0,n.v_)(o.tunnel.list[e.row.MachineId].RouteLevelPlus),1)],10,et)])],64)):(0,t.Q3)("",!0)])),_:1})}var at=a(8566),tt={emits:["edit","refresh"],setup(e,{emit:l}){const a=(0,d.B)(),n=(0,t.EW)((()=>a.value.config.Client.Id)),o=(0,t.EW)((()=>a.value.hasAccess("TunnelChangeSelf"))),r=(0,t.EW)((()=>a.value.hasAccess("TunnelChangeOther"))),s=(0,at.e)(),u=((0,ma.ZY)(),(0,ma.mx)()),i=(0,ma.FG)(),c=(0,ma.bB)(),h=e=>{let l=["调整网关层级有助于打洞成功"];return e.NeedReboot?"需要重启":l.join("\r\n")},m={chinanet:"chinanet.svg",china169:"chinanet.svg","china telecom":"chinanet.svg","china unicom":"chinaunicom.svg","china mobile":"chinamobile.svg",huawei:"huawei.svg",amazon:"amazon.svg",aliyun:"aliyun.svg",alibaba:"aliyun.svg"},p=new RegExp(Object.keys(m).map((e=>`\\b${e}\\b`)).join("|")),g=e=>{const l=e.Isp.toLowerCase();if(l){const e=l.match(p);if(e)return`./${m[e[0]]}`}return"./system.svg"},w={Unknown:"?",UnsupportedServer:"?",UdpBlocked:"?",OpenInternet:"?",SymmetricUdpFirewall:"?",FullCone:"1",RestrictedCone:"2",PortRestrictedCone:"3",Symmetric:"4"},k=e=>{const l=[u.value.list[e],i.value.list[e],c.value.list[e]].filter((e=>!!e&&e.Connected)).length;return l},v=(e,a)=>{if(n.value===e.MachineId){if(!o.value)return}else if(!r.value)return;e.device=a,l("edit",e)},f=()=>{l("refresh")},b=e=>{l("connections",e)};return{tunnel:s,handleTunnel:v,handleTunnelRefresh:f,connectionCount:k,handleConnections:b,title:h,netImg:g,natMap:w}}};const nt=(0,E.A)(tt,[["render",lt],["__scopeId","data-v-75e1f126"]]);var ot=nt;const rt=e=>((0,t.Qi)("data-v-6941c158"),e=e(),(0,t.jt)(),e),st=rt((()=>(0,t.Lk)("div",null,"网关层级为你的设备与外网的距离,你可以手动调整数值",-1))),dt={class:"pdl-20"},ut=rt((()=>(0,t.Lk)("h3",null,"跳跃点",-1))),it={class:"pdl-20"},ct={class:"t-c w-100"};function ht(e,l,a,o,r,s){const d=(0,t.g2)("el-form-item"),u=(0,t.g2)("el-input"),i=(0,t.g2)("el-col"),c=(0,t.g2)("el-input-number"),h=(0,t.g2)("el-row"),m=(0,t.g2)("el-button"),p=(0,t.g2)("el-form"),g=(0,t.g2)("el-dialog");return(0,t.uX)(),(0,t.Wv)(g,{modelValue:o.state.show,"onUpdate:modelValue":l[5]||(l[5]=e=>o.state.show=e),"close-on-click-modal":!1,"append-to":".app-wrap",title:`设置[${o.state.machineName}]网关`,width:"560",top:"2vh"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",null,[(0,t.bF)(p,{ref:"ruleFormRef",model:o.state.ruleForm,rules:o.state.rules,"label-width":"auto"},{default:(0,t.k6)((()=>[(0,t.bF)(d,{label:"",prop:"alert"},{default:(0,t.k6)((()=>[st])),_:1}),(0,t.bF)(d,{label:""},{default:(0,t.k6)((()=>[(0,t.bF)(h,null,{default:(0,t.k6)((()=>[(0,t.bF)(i,{span:12},{default:(0,t.k6)((()=>[(0,t.bF)(d,{label:"网关层级",prop:"RouteLevel"},{default:(0,t.k6)((()=>[(0,t.bF)(u,{readonly:"",modelValue:o.state.ruleForm.RouteLevel,"onUpdate:modelValue":l[0]||(l[0]=e=>o.state.ruleForm.RouteLevel=e),style:{width:"15rem"}},null,8,["modelValue"])])),_:1})])),_:1}),(0,t.bF)(i,{span:12},{default:(0,t.k6)((()=>[(0,t.bF)(d,{label:"加上",prop:"RouteLevelPlus"},{default:(0,t.k6)((()=>[(0,t.bF)(c,{modelValue:o.state.ruleForm.RouteLevelPlus,"onUpdate:modelValue":l[1]||(l[1]=e=>o.state.ruleForm.RouteLevelPlus=e)},null,8,["modelValue"])])),_:1})])),_:1})])),_:1})])),_:1}),(0,t.bF)(d,{label:""},{default:(0,t.k6)((()=>[(0,t.bF)(h,null,{default:(0,t.k6)((()=>[(0,t.bF)(i,{span:12},{default:(0,t.k6)((()=>[(0,t.bF)(d,{label:"外网端口",prop:"PortMapWan"},{default:(0,t.k6)((()=>[(0,t.bF)(c,{modelValue:o.state.ruleForm.PortMapWan,"onUpdate:modelValue":l[2]||(l[2]=e=>o.state.ruleForm.PortMapWan=e)},null,8,["modelValue"])])),_:1})])),_:1}),(0,t.bF)(i,{span:12},{default:(0,t.k6)((()=>[(0,t.bF)(d,{label:"内网端口",prop:"PortMapLan"},{default:(0,t.k6)((()=>[(0,t.bF)(c,{modelValue:o.state.ruleForm.PortMapLan,"onUpdate:modelValue":l[3]||(l[3]=e=>o.state.ruleForm.PortMapLan=e)},null,8,["modelValue"])])),_:1})])),_:1})])),_:1})])),_:1}),o.state.net.HostName?((0,t.uX)(),(0,t.Wv)(d,{key:0,label:"",prop:"alert"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",null,[(0,t.Lk)("h3",null,(0,n.v_)(o.state.net.HostName),1),(0,t.Lk)("ul",null,[((0,t.uX)(!0),(0,t.CE)(t.FK,null,(0,t.pI)(o.state.net.Lans.filter((e=>e.Ips.length>0)),((e,l)=>((0,t.uX)(),(0,t.CE)("li",null,[(0,t.Lk)("div",null,"【"+(0,n.v_)(e.Mac||"00-00-00-00-00-00")+"】"+(0,n.v_)(e.Desc),1),(0,t.Lk)("div",dt,(0,n.v_)(e.Ips.join("、")),1)])))),256))]),ut,(0,t.Lk)("div",it,(0,n.v_)(o.state.net.Routes.join("、")),1)])])),_:1})):(0,t.Q3)("",!0),(0,t.bF)(d,{label:"",prop:"Btns"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",ct,[(0,t.bF)(m,{onClick:l[4]||(l[4]=e=>o.state.show=!1)},{default:(0,t.k6)((()=>[(0,t.eW)("取消")])),_:1}),(0,t.bF)(m,{type:"primary",onClick:o.handleSave},{default:(0,t.k6)((()=>[(0,t.eW)("确认")])),_:1},8,["onClick"])])])),_:1})])),_:1},8,["model","rules"])])])),_:1},8,["modelValue","title"])}var mt=a(83),pt={props:["modelValue"],emits:["change","update:modelValue"],setup(e,{emit:l}){const a=(0,at.e)(),n=(0,u.KR)(null),o=(0,u.Kh)({show:!0,machineName:a.value.current.device.MachineName,ruleForm:{RouteLevel:a.value.current.RouteLevel,RouteLevelPlus:a.value.current.RouteLevelPlus,PortMapWan:a.value.current.PortMapWan,PortMapLan:a.value.current.PortMapLan},rules:{},net:{}});(0,t.wB)((()=>o.show),(e=>{e||setTimeout((()=>{l("update:modelValue",e)}),300)}));const r=()=>{const e=JSON.parse(JSON.stringify(a.value.current));e.RouteLevel=+o.ruleForm.RouteLevel,e.RouteLevelPlus=+o.ruleForm.RouteLevelPlus,e.PortMapWan=+o.ruleForm.PortMapWan,e.PortMapLan=+o.ruleForm.PortMapLan,(0,mt.KW)(e).then((()=>{o.show=!1,i.nk.success("已操作!"),l("change")})).catch((e=>{console.log(e),i.nk.error("操作失败!")}))};return(0,t.sV)((()=>{(0,mt.Zu)(a.value.current.MachineId).then((e=>{o.net=e})).catch((()=>{}))})),{state:o,ruleFormRef:n,handleSave:r,tunnel:a}}};const gt=(0,E.A)(pt,[["render",ht],["__scopeId","data-v-6941c158"]]);var wt=gt;const kt={class:"nowrap"},vt=["onClick"],ft={class:"nowrap"},bt=["onClick"],Ct={class:"nowrap"},Ft=["onClick"],yt={class:"nowrap"},Et=["onClick"];function _t(e,l,a,o,r,s){const d=(0,t.g2)("ConnectionShow"),u=(0,t.g2)("el-table-column");return(0,t.uX)(),(0,t.Wv)(u,{prop:"forward",label:o.forward.show?"转发/穿透":""},{default:(0,t.k6)((l=>[o.forward.show&&l.row.Connected?((0,t.uX)(),(0,t.CE)(t.FK,{key:0},[l.row.isSelf&&(o.hasForwardShowSelf||e.hasForwardSelf)?((0,t.uX)(),(0,t.CE)(t.FK,{key:0},[(0,t.Lk)("div",kt,[(0,t.bF)(d,{data:o.connections.list[l.row.MachineId],row:l.row,transitionId:"forward"},null,8,["data","row"]),(0,t.Lk)("a",{href:"javascript:;",title:"管理自己的端口转发",class:(0,n.C4)({green:o.forward.list[l.row.MachineId]>0}),onClick:e=>o.handleEdit(l.row.MachineId,l.row.MachineName)},[(0,t.Lk)("span",{class:(0,n.C4)({gateway:o.forward.list[l.row.MachineId]>0})},"端口转发("+(0,n.v_)(o.forward.list[l.row.MachineId]>99?"99+":o.forward.list[l.row.MachineId])+")",3)],10,vt)]),(0,t.Lk)("div",ft,[(0,t.Lk)("a",{href:"javascript:;",title:"管理自己的内网穿透",class:(0,n.C4)({green:o.sforward.list[l.row.MachineId]>0}),onClick:e=>o.handleSEdit(l.row.MachineId,l.row.MachineName)},[(0,t.Lk)("span",{class:(0,n.C4)({gateway:o.sforward.list[l.row.MachineId]>0})},"内网穿透("+(0,n.v_)(o.sforward.list[l.row.MachineId]>99?"99+":o.sforward.list[l.row.MachineId])+")",3)],10,bt)])],64)):o.hasForwardShowOther||e.hasForwardOther?((0,t.uX)(),(0,t.CE)(t.FK,{key:1},[(0,t.Lk)("div",Ct,[(0,t.bF)(d,{data:o.connections.list[l.row.MachineId],row:l.row,transitionId:"forward"},null,8,["data","row"]),(0,t.Lk)("a",{href:"javascript:;",title:"管理自己的端口转发",class:(0,n.C4)({green:o.forward.list[l.row.MachineId]>0}),onClick:e=>o.handleEdit(l.row.MachineId,l.row.MachineName)},[(0,t.Lk)("span",{class:(0,n.C4)({gateway:o.forward.list[l.row.MachineId]>0})},"端口转发("+(0,n.v_)(o.forward.list[l.row.MachineId]>99?"99+":o.forward.list[l.row.MachineId])+")",3)],10,Ft)]),(0,t.Lk)("div",yt,[(0,t.Lk)("a",{href:"javascript:;",title:"管理自己的内网穿透",class:(0,n.C4)({green:o.sforward.list[l.row.MachineId]>0}),onClick:e=>o.handleSEdit(l.row.MachineId,l.row.MachineName)},[(0,t.Lk)("span",{class:(0,n.C4)({gateway:o.sforward.list[l.row.MachineId]>0})},"内网穿透("+(0,n.v_)(o.sforward.list[l.row.MachineId]>99?"99+":o.sforward.list[l.row.MachineId])+")",3)],10,Et)])],64)):(0,t.Q3)("",!0)],64)):(0,t.Q3)("",!0)])),_:1},8,["label"])}var Vt=a(743);const Lt=Symbol(),Pt=()=>{const e=(0,d.B)(),l=((0,t.EW)((()=>e.value.config.Client.Id)),(0,u.KR)({timer:0,showEdit:!1,showCopy:!1,list:{},testTimer:0,hashcode:0,machineid:"",machineName:""}));(0,t.Gt)(Lt,l);const a=()=>{(0,Vt.a9)()},n=()=>{clearTimeout(l.value.timer),(0,Vt.gz)(l.value.hashcode.toString()).then((e=>{l.value.hashcode=e.HashCode,e.List&&(l.value.list=e.List),l.value.timer=setTimeout(n,1020)})).catch((()=>{l.value.timer=setTimeout(n,1020)}))},o=e=>{l.value.machineid=e[0],l.value.machineName=e[1],l.value.showEdit=!0},r=()=>{clearTimeout(l.value.timer),clearTimeout(l.value.testTimer)};return{sforward:l,_getSForwardCountInfo:n,handleSForwardEdit:o,clearSForwardTimeout:r,handleSForwardRefresh:a}},It=()=>(0,t.WQ)(Lt);var Tt={emits:["edit","sedit"],components:{ConnectionShow:pa.A},setup(e,{emit:l}){const a=w(),n=It(),o=(0,d.B)(),r=(0,t.EW)((()=>o.value.config.Client.Id)),s=(0,t.EW)((()=>o.value.hasAccess("ForwardShowSelf"))),u=(0,t.EW)((()=>o.value.hasAccess("ForwardShowOther"))),i=(0,t.EW)((()=>o.value.hasAccess("ForwardSelf"))),c=(0,t.EW)((()=>o.value.hasAccess("ForwardOther"))),h=(0,ma.mx)(),m=(e,a)=>{if(r.value===e){if(!i.value)return}else if(!c.value)return;l("edit",[e,a])},p=(e,a)=>{if(r.value===e){if(!i.value)return}else if(!c.value)return;l("sedit",[e,a])},g=()=>{l("refresh")};return{forward:a,sforward:n,hasForwardShowSelf:s,hasForwardShowOther:u,connections:h,handleEdit:m,handleSEdit:p,handleForwardRefresh:g}}};const Mt=(0,E.A)(Tt,[["render",_t],["__scopeId","data-v-2ed9a082"]]);var St=Mt;const Wt={class:"t-c head"},At=["onClick"],Xt=["onClick"],Rt=["onClick"],Nt=["onClick"],xt=["title"],Bt={class:"t-c"},Ut={class:"page-wrap"},$t=["onClick"],Dt={key:0},zt={key:1,class:"error red",title:"off line"},Ot=["onClick"],Qt=["title"];function jt(e,l,a,o,r,s){const d=(0,t.g2)("el-button"),u=(0,t.g2)("el-input"),i=(0,t.g2)("el-table-column"),c=(0,t.g2)("el-option"),h=(0,t.g2)("el-select"),m=(0,t.g2)("el-pagination"),p=(0,t.g2)("el-switch"),g=(0,t.g2)("Delete"),w=(0,t.g2)("el-icon"),k=(0,t.g2)("el-popconfirm"),v=(0,t.g2)("el-table"),f=(0,t.g2)("el-dialog");return(0,t.uX)(),(0,t.Wv)(f,{modelValue:o.state.show,"onUpdate:modelValue":l[0]||(l[0]=e=>o.state.show=e),onOpen:o.handleOnShowList,"append-to":".app-wrap",title:`【${o.state.machineName}】的端口转发`,top:"1vh",width:"780"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",null,[(0,t.Lk)("div",Wt,[(0,t.bF)(d,{type:"success",size:"small",onClick:o.handleAdd,loading:o.state.loading},{default:(0,t.k6)((()=>[(0,t.eW)("添加")])),_:1},8,["onClick","loading"]),(0,t.bF)(d,{size:"small",onClick:o.handleRefresh},{default:(0,t.k6)((()=>[(0,t.eW)("刷新")])),_:1},8,["onClick"])]),(0,t.bF)(v,{data:o.state.data,size:"small",border:"",height:"500",onCellDblclick:o.handleCellClick},{default:(0,t.k6)((()=>[(0,t.bF)(i,{property:"Name",label:"名称",width:"100"},{default:(0,t.k6)((e=>[e.row.NameEditing&&0==e.row.Started?((0,t.uX)(),(0,t.Wv)(u,{key:0,autofocus:"",size:"small",modelValue:e.row.Name,"onUpdate:modelValue":l=>e.row.Name=l,onBlur:l=>o.handleEditBlur(e.row,"Name")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,t.uX)(),(0,t.CE)("a",{key:1,href:"javascript:;",class:"a-line",onClick:l=>o.handleEdit(e.row,"Name")},(0,n.v_)(e.row.Name||"未知"),9,At))])),_:1}),(0,t.bF)(i,{prop:"BufferSize",label:"缓冲区",width:"80"},{default:(0,t.k6)((e=>[e.row.BufferSizeEditing&&0==e.row.Started?((0,t.uX)(),(0,t.Wv)(h,{key:0,modelValue:e.row.BufferSize,"onUpdate:modelValue":l=>e.row.BufferSize=l,placeholder:"Select",size:"small",disabled:e.row.Started,onChange:l=>o.handleEditBlur(e.row,"BufferSize")},{default:(0,t.k6)((()=>[((0,t.uX)(!0),(0,t.CE)(t.FK,null,(0,t.pI)(o.state.bufferSize,((e,l)=>((0,t.uX)(),(0,t.Wv)(c,{key:l,label:e,value:l},null,8,["label","value"])))),128))])),_:2},1032,["modelValue","onUpdate:modelValue","disabled","onChange"])):((0,t.uX)(),(0,t.CE)("a",{key:1,href:"javascript:;",class:"a-line",onClick:l=>o.handleEdit(e.row,"BufferSize")},(0,n.v_)(o.state.bufferSize[e.row.BufferSize]),9,Xt))])),_:1}),(0,t.bF)(i,{property:"BindIPAddress",label:"监听IP",width:"140"},{default:(0,t.k6)((e=>[e.row.BindIPAddressEditing&&0==e.row.Started?((0,t.uX)(),(0,t.Wv)(h,{key:0,modelValue:e.row.BindIPAddress,"onUpdate:modelValue":l=>e.row.BindIPAddress=l,size:"small",disabled:e.row.Started,onChange:l=>o.handleEditBlur(e.row,"BindIPAddress")},{default:(0,t.k6)((()=>[((0,t.uX)(!0),(0,t.CE)(t.FK,null,(0,t.pI)(o.state.ips,(e=>((0,t.uX)(),(0,t.Wv)(c,{key:e,label:e,value:e},null,8,["label","value"])))),128))])),_:2},1032,["modelValue","onUpdate:modelValue","disabled","onChange"])):((0,t.uX)(),(0,t.CE)("a",{key:1,href:"javascript:;",class:"a-line",onClick:l=>o.handleEdit(e.row,"BindIPAddress")},(0,n.v_)(e.row.BindIPAddress),9,Rt))])),_:1}),(0,t.bF)(i,{property:"Port",label:"监听端口",width:"80"},{default:(0,t.k6)((e=>[e.row.PortEditing&&0==e.row.Started?((0,t.uX)(),(0,t.Wv)(u,{key:0,type:"number",autofocus:"",size:"small",modelValue:e.row.Port,"onUpdate:modelValue":l=>e.row.Port=l,onBlur:l=>o.handleEditBlur(e.row,"Port")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,t.uX)(),(0,t.CE)("a",{key:1,href:"javascript:;",class:"a-line",onClick:l=>o.handleEdit(e.row,"Port")},[e.row.Msg?((0,t.uX)(),(0,t.CE)("div",{key:0,class:"error red",title:e.row.Msg},[(0,t.Lk)("span",null,(0,n.v_)(e.row.Port),1)],8,xt)):((0,t.uX)(),(0,t.CE)("span",{key:1,class:(0,n.C4)({green:e.row.Started})},(0,n.v_)(e.row.Port),3))],8,Nt))])),_:1}),(0,t.bF)(i,{property:"MachineId",label:"目标"},{default:(0,t.k6)((e=>[e.row.MachineIdEditing&&0==e.row.Started?((0,t.uX)(),(0,t.Wv)(h,{key:0,modelValue:e.row.MachineId,"onUpdate:modelValue":l=>e.row.MachineId=l,onChange:l=>o.handleEditBlur(e.row,"MachineId"),filterable:"",remote:"",loading:o.state.loading,"remote-method":o.handleSearch},{header:(0,t.k6)((()=>[(0,t.Lk)("div",Bt,[(0,t.Lk)("div",Ut,[(0,t.bF)(m,{small:"",background:"",layout:"prev, pager, next","page-size":o.state.machineIds.Request.Size,total:o.state.machineIds.Count,"pager-count":5,"current-page":o.state.machineIds.Request.Page,onCurrentChange:o.handlePageChange},null,8,["page-size","total","current-page","onCurrentChange"])])])])),default:(0,t.k6)((()=>[((0,t.uX)(!0),(0,t.CE)(t.FK,null,(0,t.pI)(o.state.machineIds.List,((e,l)=>((0,t.uX)(),(0,t.Wv)(c,{key:l,label:e.MachineName,value:e.MachineId},null,8,["label","value"])))),128))])),_:2},1032,["modelValue","onUpdate:modelValue","onChange","loading","remote-method"])):((0,t.uX)(),(0,t.CE)("a",{key:1,href:"javascript:;",class:"a-line",onClick:l=>o.handleEdit(e.row,"MachineId")},[o.state.names[e.row.MachineId]?((0,t.uX)(),(0,t.CE)("span",Dt,(0,n.v_)(e.row.MachineName||"未知"),1)):((0,t.uX)(),(0,t.CE)("span",zt,(0,n.v_)(e.row.MachineName||"未知"),1))],8,$t))])),_:1}),(0,t.bF)(i,{property:"TargetEP",label:"目标服务",width:"140"},{default:(0,t.k6)((e=>[e.row.TargetEPEditing&&0==e.row.Started?((0,t.uX)(),(0,t.Wv)(u,{key:0,autofocus:"",size:"small",modelValue:e.row.TargetEP,"onUpdate:modelValue":l=>e.row.TargetEP=l,onBlur:l=>o.handleEditBlur(e.row,"TargetEP")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,t.uX)(),(0,t.CE)("a",{key:1,href:"javascript:;",class:"a-line",onClick:l=>o.handleEdit(e.row,"TargetEP")},[e.row.TargetMsg?((0,t.uX)(),(0,t.CE)("div",{key:0,class:"error red",title:e.row.TargetMsg},[(0,t.Lk)("span",null,(0,n.v_)(e.row.TargetEP),1)],8,Qt)):((0,t.uX)(),(0,t.CE)("span",{key:1,class:(0,n.C4)({green:e.row.Started})},(0,n.v_)(e.row.TargetEP),3))],8,Ot))])),_:1}),(0,t.bF)(i,{property:"Started",label:"状态",width:"60"},{default:(0,t.k6)((e=>[(0,t.bF)(p,{modelValue:e.row.Started,"onUpdate:modelValue":l=>e.row.Started=l,onChange:l=>o.handleStartChange(e.row),"inline-prompt":"","active-text":"开","inactive-text":"关"},null,8,["modelValue","onUpdate:modelValue","onChange"])])),_:1}),(0,t.bF)(i,{label:"操作",width:"54"},{default:(0,t.k6)((e=>[(0,t.bF)(k,{"confirm-button-text":"确认","cancel-button-text":"取消",title:"删除不可逆,是否确认?",onConfirm:l=>o.handleDel(e.row.Id)},{reference:(0,t.k6)((()=>[(0,t.bF)(d,{type:"danger",size:"small"},{default:(0,t.k6)((()=>[(0,t.bF)(w,null,{default:(0,t.k6)((()=>[(0,t.bF)(g)])),_:1})])),_:1})])),_:2},1032,["onConfirm"])])),_:1})])),_:1},8,["data","onCellDblclick"])])])),_:1},8,["modelValue","onOpen","title"])}var Kt={props:["data","modelValue"],emits:["update:modelValue"],components:{Delete:F.epd},setup(e,{emit:l}){const a=(0,d.B)(),n=w(),o=(0,u.Kh)({show:!0,machineId:n.value.machineId,machineName:n.value.machineName,data:[],ips:[],bufferSize:a.value.bufferSize,loading:!1,machineIds:{Request:{Page:1,Size:10,Name:""},Count:0,List:[]},timer:0,timer1:0,editing:!1,names:{}});(0,t.wB)((()=>o.show),(e=>{e||setTimeout((()=>{l("update:modelValue",e)}),300)}));const r=()=>{clearTimeout(o.timer),(0,m.lE)(n.value.machineId).then((e=>{o.timer=setTimeout(r,1e3)})).catch((()=>{o.timer=setTimeout(r,1e3)}))},s=()=>{(0,m.xD)().then((e=>{e.splice(0,0,"127.0.0.1"),e.splice(0,0,"0.0.0.0"),o.ips=e})).catch((()=>{}))},c=()=>{clearTimeout(o.timer1),0==o.editing?(0,m.Oy)(o.machineId).then((e=>{o.data=e,o.timer1=setTimeout(c,1e3)})).catch((()=>{o.timer1=setTimeout(c,1e3)})):o.timer1=setTimeout(c,1e3)},h=()=>{c(),i.nk.success("已刷新")},p=()=>{(0,M.NT)().then((e=>{o.names=e.filter((e=>e.Online)).reduce(((e,l)=>(e[l.MachineId]=!0,e)),{})})).catch((()=>{}))},g=e=>{o.machineIds.Request.Name=e,k()},k=()=>{o.loading=!0,(0,M.BS)(o.machineIds.Request).then((e=>{o.loading=!1,o.machineIds.Request=e.Request,o.machineIds.Count=e.Count,o.machineIds.List=e.List})).catch((e=>{o.loading=!1}))},v=e=>{o.machineIds.Request.Page=e,k()},f=()=>{k()},b=(e,l)=>{F(e,l.property)},C=()=>{V({ID:0,Name:"",Port:0,TargetEP:"127.0.0.1:80",machineId:""})},F=(e,l)=>{e.Started?i.nk.error("请先停止"):(o.data.forEach((e=>{e["NameEditing"]=!1,e["PortEditing"]=!1,e["TargetEPEditing"]=!1,e["BindIPAddressEditing"]=!1,e["BufferSizeEditing"]=!1,e["MachineIdEditing"]=!1})),e[`${l}Editing`]=!0,o.editing=!0)},y=(e,l)=>{if(e.Started)return void i.nk.error("请先停止");e[`${l}Editing`]=!1,o.editing=!1;const a=o.machineIds.List.find((l=>l.MachineId==e.MachineId));a&&(e.MachineName=a.MachineName),V(e)},E=e=>{(0,m.we)({machineId:o.machineId,Id:e}).then((()=>{c()}))},_=e=>{V(e)},V=e=>{o.loading=!0,e.Port=parseInt(e.Port),(0,m.nH)({machineId:o.machineId,data:e}).then((()=>{o.loading=!1,c()})).catch((e=>{o.loading=!1,i.nk.error(e)}))};return(0,t.sV)((()=>{c(),s(),r(),p()})),(0,t.hi)((()=>{clearTimeout(o.timer),clearTimeout(o.timer1)})),{state:o,handleOnShowList:f,handleCellClick:b,handleRefresh:h,handleAdd:C,handleEdit:F,handleEditBlur:y,handleDel:E,handleStartChange:_,handleSearch:g,handlePageChange:v}}};const Gt=(0,E.A)(Kt,[["render",jt],["__scopeId","data-v-aaafd500"]]);var qt=Gt;const Ht={class:"t-c head"},Jt=["onClick"],Zt={class:"plan"},Yt=["onClick"],en=["title"],ln=["onClick"],an=["title"];function tn(e,l,a,o,r,s){const d=(0,t.g2)("el-button"),u=(0,t.g2)("el-input"),i=(0,t.g2)("el-table-column"),c=(0,t.g2)("Select"),h=(0,t.g2)("el-icon"),m=(0,t.g2)("PlanShow"),p=(0,t.g2)("CloseBold"),g=(0,t.g2)("WarnTriangleFilled"),w=(0,t.g2)("el-switch"),k=(0,t.g2)("Delete"),v=(0,t.g2)("el-popconfirm"),f=(0,t.g2)("el-table"),b=(0,t.g2)("el-dialog"),C=(0,t.g2)("PlanList");return(0,t.uX)(),(0,t.Wv)(C,{ref:"planDom",machineid:o.machineId,category:"sforward",handles:o.state.handles},{default:(0,t.k6)((()=>[(0,t.bF)(b,{modelValue:o.state.show,"onUpdate:modelValue":l[0]||(l[0]=e=>o.state.show=e),onOpen:o.handleOnShowList,"append-to":".app-wrap",title:`【${o.machineName}】的内网穿透`,top:"2vh",width:"760"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",null,[(0,t.Lk)("div",Ht,[(0,t.bF)(d,{type:"success",size:"small",onClick:o.handleAdd,loading:o.state.loading},{default:(0,t.k6)((()=>[(0,t.eW)("添加")])),_:1},8,["onClick","loading"]),(0,t.bF)(d,{size:"small",onClick:o.handleRefresh},{default:(0,t.k6)((()=>[(0,t.eW)("刷新")])),_:1},8,["onClick"])]),(0,t.bF)(f,{data:o.state.data,size:"small",border:"",height:"500",onCellDblclick:o.handleCellClick},{default:(0,t.k6)((()=>[(0,t.bF)(i,{property:"Name",label:"名称"},{default:(0,t.k6)((e=>[e.row.NameEditing&&0==e.row.Started?((0,t.uX)(),(0,t.Wv)(u,{key:0,autofocus:"",size:"small",modelValue:e.row.Name,"onUpdate:modelValue":l=>e.row.Name=l,onBlur:l=>o.handleEditBlur(e.row,"Name")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,t.uX)(),(0,t.CE)("a",{key:1,href:"javascript:;",class:"a-line",onClick:l=>o.handleEdit(e.row,"Name")},(0,n.v_)(e.row.Name||"未知"),9,Jt))])),_:1}),(0,t.bF)(i,{prop:"Plan",label:"开启和关闭计划",width:"200"},{default:(0,t.k6)((e=>[(0,t.Lk)("div",Zt,[(0,t.Lk)("p",null,[(0,t.bF)(h,null,{default:(0,t.k6)((()=>[(0,t.bF)(c)])),_:1}),(0,t.bF)(m,{handle:"start",keyid:e.row.Id},null,8,["keyid"])]),(0,t.Lk)("p",null,[(0,t.bF)(h,null,{default:(0,t.k6)((()=>[(0,t.bF)(p)])),_:1}),(0,t.bF)(m,{handle:"stop",keyid:e.row.Id},null,8,["keyid"])])])])),_:1}),(0,t.bF)(i,{property:"Temp",label:"服务器端口/域名",width:"160"},{default:(0,t.k6)((e=>[e.row.TempEditing&&0==e.row.Started?((0,t.uX)(),(0,t.Wv)(u,{key:0,autofocus:"",size:"small",modelValue:e.row.Temp,"onUpdate:modelValue":l=>e.row.Temp=l,onBlur:l=>o.handleEditBlur(e.row,"Temp")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,t.uX)(),(0,t.CE)("a",{key:1,href:"javascript:;",class:"a-line",onClick:l=>o.handleEdit(e.row,"Temp")},[e.row.Msg?((0,t.uX)(),(0,t.CE)("div",{key:0,class:"error red",title:e.row.Msg},[(0,t.Lk)("span",null,(0,n.v_)(e.row.Temp),1),(0,t.bF)(h,{size:"20"},{default:(0,t.k6)((()=>[(0,t.bF)(g)])),_:1})],8,en)):((0,t.uX)(),(0,t.CE)("span",{key:1,class:(0,n.C4)({green:e.row.Started})},(0,n.v_)(e.row.Temp),3))],8,Yt))])),_:1}),(0,t.bF)(i,{property:"LocalEP",label:"本机服务",width:"140"},{default:(0,t.k6)((e=>[e.row.LocalEPEditing&&0==e.row.Started?((0,t.uX)(),(0,t.Wv)(u,{key:0,autofocus:"",size:"small",modelValue:e.row.LocalEP,"onUpdate:modelValue":l=>e.row.LocalEP=l,onBlur:l=>o.handleEditBlur(e.row,"LocalEP")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,t.uX)(),(0,t.CE)("a",{key:1,href:"javascript:;",class:"a-line",onClick:l=>o.handleEdit(e.row,"LocalEP")},[e.row.LocalMsg?((0,t.uX)(),(0,t.CE)("div",{key:0,class:"error red",title:e.row.LocalMsg},[(0,t.Lk)("span",null,(0,n.v_)(e.row.LocalEP),1),(0,t.bF)(h,{size:"20"},{default:(0,t.k6)((()=>[(0,t.bF)(g)])),_:1})],8,an)):((0,t.uX)(),(0,t.CE)("span",{key:1,class:(0,n.C4)({green:e.row.Started})},(0,n.v_)(e.row.LocalEP),3))],8,ln))])),_:1}),(0,t.bF)(i,{property:"Started",label:"状态",width:"60"},{default:(0,t.k6)((e=>[(0,t.bF)(w,{disabled:"",modelValue:e.row.Started,"onUpdate:modelValue":l=>e.row.Started=l,"inline-prompt":"","active-text":"是","inactive-text":"否",onClick:l=>o.handleStartChange(e.row)},null,8,["modelValue","onUpdate:modelValue","onClick"])])),_:1}),(0,t.bF)(i,{label:"操作",width:"54"},{default:(0,t.k6)((e=>[(0,t.bF)(v,{"confirm-button-text":"确认","cancel-button-text":"取消",title:"删除不可逆,是否确认?",onConfirm:l=>o.handleDel(e.row.Id)},{reference:(0,t.k6)((()=>[(0,t.bF)(d,{type:"danger",size:"small"},{default:(0,t.k6)((()=>[(0,t.bF)(h,null,{default:(0,t.k6)((()=>[(0,t.bF)(k)])),_:1})])),_:1})])),_:2},1032,["onConfirm"])])),_:1})])),_:1},8,["data","onCellDblclick"])])])),_:1},8,["modelValue","onOpen","title"])])),_:1},8,["machineid","handles"])}function nn(e,l,a,n,o,r){const s=(0,t.g2)("PlanEdit");return(0,t.uX)(),(0,t.CE)("div",null,[(0,t.RG)(e.$slots,"default"),n.plan.showEdit?((0,t.uX)(),(0,t.Wv)(s,{key:0,modelValue:n.plan.showEdit,"onUpdate:modelValue":l[0]||(l[0]=e=>n.plan.showEdit=e)},null,8,["modelValue"])):(0,t.Q3)("",!0)])}var on=a(4);const rn=(e,l)=>(0,on.zG)("plan/get",{machineId:e,category:l}),sn=(e,l)=>(0,on.zG)("plan/add",{machineId:e,plan:l}),dn=(e,l)=>(0,on.zG)("plan/remove",{machineId:e,planId:l}),un={key:0,class:"mgl-2"},cn={class:"w-100"},hn=(0,t.Lk)("span",null,"的",-1),mn={class:"w-100 mgt-1"},pn={class:"w-100"},gn={class:"w-100 mgt-1"},wn={class:"w-100"},kn={class:"w-100 mgt-1"},vn={class:"w-100"},fn=(0,t.Lk)("span",null,"的",-1),bn={class:"mgt-1 w-100"},Cn={class:"mgt-1 w-100"},Fn=(0,t.Lk)("span",null,"后",-1),yn={class:"t-c w-100"};function En(e,l,a,o,r,s){const d=(0,t.g2)("el-option"),u=(0,t.g2)("el-select"),i=(0,t.g2)("el-form-item"),c=(0,t.g2)("el-input"),h=(0,t.g2)("el-switch"),m=(0,t.g2)("el-button"),p=(0,t.g2)("el-form"),g=(0,t.g2)("el-dialog");return(0,t.uX)(),(0,t.Wv)(g,{modelValue:o.state.show,"onUpdate:modelValue":l[30]||(l[30]=e=>o.state.show=e),"close-on-click-modal":!1,"append-to":".app-wrap",title:"计划任务",top:"2vh",width:"450"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",null,[(0,t.bF)(p,{ref:"ruleFormRef",model:o.state.ruleForm,rules:o.state.rules,"label-width":"auto"},{default:(0,t.k6)((()=>[(0,t.bF)(i,{label:"执行操作",prop:"Handle"},{default:(0,t.k6)((()=>[(0,t.bF)(u,{modelValue:o.state.ruleForm.Handle,"onUpdate:modelValue":l[0]||(l[0]=e=>o.state.ruleForm.Handle=e),style:{width:"10rem"},disabled:""},{default:(0,t.k6)((()=>[((0,t.uX)(!0),(0,t.CE)(t.FK,null,(0,t.pI)(o.plan.handles,((e,l)=>((0,t.uX)(),(0,t.Wv)(d,{value:e.value,label:e.label},null,8,["value","label"])))),256))])),_:1},8,["modelValue"])])),_:1}),(0,t.bF)(i,{label:"执行方式",prop:"Method"},{default:(0,t.k6)((()=>[(0,t.bF)(u,{modelValue:o.state.ruleForm.Method,"onUpdate:modelValue":l[1]||(l[1]=e=>o.state.ruleForm.Method=e),style:{width:"10rem"},onChange:o.handleChange},{default:(0,t.k6)((()=>[((0,t.uX)(!0),(0,t.CE)(t.FK,null,(0,t.pI)(o.plan.methods,((e,l)=>((0,t.uX)(),(0,t.Wv)(d,{value:e.value,label:e.label},null,8,["value","label"])))),256))])),_:1},8,["modelValue","onChange"]),o.state.ruleForm.Method>=2?((0,t.uX)(),(0,t.CE)("strong",un,(0,n.v_)(o.state.ruleForm.Rule),1)):(0,t.Q3)("",!0)])),_:1}),2==o.state.ruleForm.Method?((0,t.uX)(),(0,t.Wv)(i,{key:0,label:"在",prop:"Rule"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",cn,[(0,t.bF)(u,{modelValue:o.state.ruleAt.type,"onUpdate:modelValue":l[2]||(l[2]=e=>o.state.ruleAt.type=e),style:{width:"10rem"},onChange:o.handleChange},{default:(0,t.k6)((()=>[(0,t.bF)(d,{value:2,label:"每月"}),(0,t.bF)(d,{value:3,label:"每日"}),(0,t.bF)(d,{value:4,label:"每时"}),(0,t.bF)(d,{value:5,label:"每分"})])),_:1},8,["modelValue","onChange"]),(0,t.eW)(),hn]),(0,t.Lk)("div",mn,[o.state.ruleAt.type<2?((0,t.uX)(),(0,t.Wv)(c,{key:0,onChange:o.handleChange,modelValue:o.state.ruleAt.month,"onUpdate:modelValue":l[3]||(l[3]=e=>o.state.ruleAt.month=e),style:{width:"8rem"}},{append:(0,t.k6)((()=>[(0,t.eW)("月")])),_:1},8,["onChange","modelValue"])):(0,t.Q3)("",!0),o.state.ruleAt.type<3?((0,t.uX)(),(0,t.Wv)(c,{key:1,onChange:o.handleChange,class:(0,n.C4)({"mgl-1":o.state.ruleAt.type<2}),modelValue:o.state.ruleAt.day,"onUpdate:modelValue":l[4]||(l[4]=e=>o.state.ruleAt.day=e),style:{width:"8rem"}},{append:(0,t.k6)((()=>[(0,t.eW)("日")])),_:1},8,["onChange","class","modelValue"])):(0,t.Q3)("",!0),o.state.ruleAt.type<4?((0,t.uX)(),(0,t.Wv)(c,{key:2,onChange:o.handleChange,class:(0,n.C4)({"mgl-1":o.state.ruleAt.type<3}),modelValue:o.state.ruleAt.hour,"onUpdate:modelValue":l[5]||(l[5]=e=>o.state.ruleAt.hour=e),style:{width:"8rem"}},{append:(0,t.k6)((()=>[(0,t.eW)("时")])),_:1},8,["onChange","class","modelValue"])):(0,t.Q3)("",!0),o.state.ruleAt.type<5?((0,t.uX)(),(0,t.Wv)(c,{key:3,onChange:o.handleChange,class:(0,n.C4)({"mgl-1":o.state.ruleAt.type<4}),modelValue:o.state.ruleAt.min,"onUpdate:modelValue":l[6]||(l[6]=e=>o.state.ruleAt.min=e),style:{width:"8rem"}},{append:(0,t.k6)((()=>[(0,t.eW)("分")])),_:1},8,["onChange","class","modelValue"])):(0,t.Q3)("",!0),(0,t.bF)(c,{onChange:o.handleChange,class:(0,n.C4)({"mgl-1":o.state.ruleAt.type<5}),modelValue:o.state.ruleAt.sec,"onUpdate:modelValue":l[7]||(l[7]=e=>o.state.ruleAt.sec=e),style:{width:"8rem"}},{append:(0,t.k6)((()=>[(0,t.eW)("秒")])),_:1},8,["onChange","class","modelValue"])])])),_:1})):(0,t.Q3)("",!0),4==o.state.ruleForm.Method?((0,t.uX)(),(0,t.Wv)(i,{key:1,label:"每",prop:"Rule"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",pn,[(0,t.bF)(c,{onChange:o.handleChange,modelValue:o.state.ruleTimer.year,"onUpdate:modelValue":l[8]||(l[8]=e=>o.state.ruleTimer.year=e),style:{width:"8rem"}},{append:(0,t.k6)((()=>[(0,t.eW)("年")])),_:1},8,["onChange","modelValue"]),(0,t.bF)(c,{onChange:o.handleChange,class:"mgl-1",modelValue:o.state.ruleTimer.month,"onUpdate:modelValue":l[9]||(l[9]=e=>o.state.ruleTimer.month=e),style:{width:"8rem"}},{append:(0,t.k6)((()=>[(0,t.eW)("月")])),_:1},8,["onChange","modelValue"]),(0,t.bF)(c,{onChange:o.handleChange,class:"mgl-1",modelValue:o.state.ruleTimer.day,"onUpdate:modelValue":l[10]||(l[10]=e=>o.state.ruleTimer.day=e),style:{width:"8rem"}},{append:(0,t.k6)((()=>[(0,t.eW)("日")])),_:1},8,["onChange","modelValue"])]),(0,t.Lk)("div",gn,[(0,t.bF)(c,{onChange:o.handleChange,modelValue:o.state.ruleTimer.hour,"onUpdate:modelValue":l[11]||(l[11]=e=>o.state.ruleTimer.hour=e),style:{width:"8rem"}},{append:(0,t.k6)((()=>[(0,t.eW)("时")])),_:1},8,["onChange","modelValue"]),(0,t.bF)(c,{onChange:o.handleChange,class:"mgl-1",modelValue:o.state.ruleTimer.min,"onUpdate:modelValue":l[12]||(l[12]=e=>o.state.ruleTimer.min=e),style:{width:"8rem"}},{append:(0,t.k6)((()=>[(0,t.eW)("分")])),_:1},8,["onChange","modelValue"]),(0,t.bF)(c,{onChange:o.handleChange,class:"mgl-1",modelValue:o.state.ruleTimer.sec,"onUpdate:modelValue":l[13]||(l[13]=e=>o.state.ruleTimer.sec=e),style:{width:"8rem"}},{append:(0,t.k6)((()=>[(0,t.eW)("秒")])),_:1},8,["onChange","modelValue"])])])),_:1})):(0,t.Q3)("",!0),8==o.state.ruleForm.Method?((0,t.uX)(),(0,t.Wv)(i,{key:2,label:"Cron",prop:"Rule"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",wn,[(0,t.bF)(c,{onChange:o.handleChange,modelValue:o.state.ruleCron.sec,"onUpdate:modelValue":l[14]||(l[14]=e=>o.state.ruleCron.sec=e),style:{width:"8rem"}},{append:(0,t.k6)((()=>[(0,t.eW)("秒")])),_:1},8,["onChange","modelValue"]),(0,t.bF)(c,{onChange:o.handleChange,class:"mgl-1",modelValue:o.state.ruleCron.min,"onUpdate:modelValue":l[15]||(l[15]=e=>o.state.ruleCron.min=e),style:{width:"8rem"}},{append:(0,t.k6)((()=>[(0,t.eW)("分")])),_:1},8,["onChange","modelValue"]),(0,t.bF)(c,{onChange:o.handleChange,class:"mgl-1",modelValue:o.state.ruleCron.hour,"onUpdate:modelValue":l[16]||(l[16]=e=>o.state.ruleCron.hour=e),style:{width:"8rem"}},{append:(0,t.k6)((()=>[(0,t.eW)("时")])),_:1},8,["onChange","modelValue"])]),(0,t.Lk)("div",kn,[(0,t.bF)(c,{onChange:o.handleChange,modelValue:o.state.ruleCron.day,"onUpdate:modelValue":l[17]||(l[17]=e=>o.state.ruleCron.day=e),style:{width:"8rem"}},{append:(0,t.k6)((()=>[(0,t.eW)("日")])),_:1},8,["onChange","modelValue"]),(0,t.bF)(c,{onChange:o.handleChange,class:"mgl-1",modelValue:o.state.ruleCron.month,"onUpdate:modelValue":l[18]||(l[18]=e=>o.state.ruleCron.month=e),style:{width:"8rem"}},{append:(0,t.k6)((()=>[(0,t.eW)("月")])),_:1},8,["onChange","modelValue"]),(0,t.bF)(c,{onChange:o.handleChange,class:"mgl-1",modelValue:o.state.ruleCron.week,"onUpdate:modelValue":l[19]||(l[19]=e=>o.state.ruleCron.week=e),style:{width:"8rem"}},{append:(0,t.k6)((()=>[(0,t.eW)("周")])),_:1},8,["onChange","modelValue"])])])),_:1})):(0,t.Q3)("",!0),16==o.state.ruleForm.Method?((0,t.uX)(),(0,t.Wv)(i,{key:3,label:"在",prop:"Rule"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",vn,[(0,t.bF)(u,{modelValue:o.state.ruleForm.TriggerHandle,"onUpdate:modelValue":l[20]||(l[20]=e=>o.state.ruleForm.TriggerHandle=e),style:{width:"10rem"},onChange:o.handleChange},{default:(0,t.k6)((()=>[((0,t.uX)(!0),(0,t.CE)(t.FK,null,(0,t.pI)(o.plan.triggers,((e,l)=>((0,t.uX)(),(0,t.Wv)(d,{value:e.value,label:e.label},null,8,["value","label"])))),256))])),_:1},8,["modelValue","onChange"]),(0,t.eW)(),fn]),(0,t.Lk)("div",bn,[(0,t.bF)(c,{onChange:o.handleChange,modelValue:o.state.ruleTrigger.year,"onUpdate:modelValue":l[21]||(l[21]=e=>o.state.ruleTrigger.year=e),style:{width:"8rem"}},{append:(0,t.k6)((()=>[(0,t.eW)("年")])),_:1},8,["onChange","modelValue"]),(0,t.bF)(c,{onChange:o.handleChange,class:"mgl-1",modelValue:o.state.ruleTrigger.month,"onUpdate:modelValue":l[22]||(l[22]=e=>o.state.ruleTrigger.month=e),style:{width:"8rem"}},{append:(0,t.k6)((()=>[(0,t.eW)("月")])),_:1},8,["onChange","modelValue"]),(0,t.bF)(c,{onChange:o.handleChange,class:"mgl-1",modelValue:o.state.ruleTrigger.day,"onUpdate:modelValue":l[23]||(l[23]=e=>o.state.ruleTrigger.day=e),style:{width:"8rem"}},{append:(0,t.k6)((()=>[(0,t.eW)("日")])),_:1},8,["onChange","modelValue"])]),(0,t.Lk)("div",Cn,[(0,t.bF)(c,{onChange:o.handleChange,modelValue:o.state.ruleTrigger.hour,"onUpdate:modelValue":l[24]||(l[24]=e=>o.state.ruleTrigger.hour=e),style:{width:"8rem"}},{append:(0,t.k6)((()=>[(0,t.eW)("时")])),_:1},8,["onChange","modelValue"]),(0,t.bF)(c,{onChange:o.handleChange,class:"mgl-1",modelValue:o.state.ruleTrigger.min,"onUpdate:modelValue":l[25]||(l[25]=e=>o.state.ruleTrigger.min=e),style:{width:"8rem"}},{append:(0,t.k6)((()=>[(0,t.eW)("分")])),_:1},8,["onChange","modelValue"]),(0,t.bF)(c,{onChange:o.handleChange,class:"mgl-1",modelValue:o.state.ruleTrigger.sec,"onUpdate:modelValue":l[26]||(l[26]=e=>o.state.ruleTrigger.sec=e),style:{width:"8rem"}},{append:(0,t.k6)((()=>[(0,t.eW)("秒")])),_:1},8,["onChange","modelValue"]),Fn])])),_:1})):(0,t.Q3)("",!0),(0,t.bF)(i,{label:"内容",prop:"Value"},{default:(0,t.k6)((()=>[(0,t.bF)(c,{type:"textarea",resize:"none",rows:"5",modelValue:o.state.ruleForm.Value,"onUpdate:modelValue":l[27]||(l[27]=e=>o.state.ruleForm.Value=e)},null,8,["modelValue"])])),_:1}),(0,t.bF)(i,{label:"禁用",prop:"Disabled"},{default:(0,t.k6)((()=>[(0,t.bF)(h,{modelValue:o.state.ruleForm.Disabled,"onUpdate:modelValue":l[28]||(l[28]=e=>o.state.ruleForm.Disabled=e)},null,8,["modelValue"])])),_:1}),(0,t.bF)(i,{label:"",prop:"Btns"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",yn,[(0,t.bF)(m,{onClick:l[29]||(l[29]=e=>o.state.show=!1)},{default:(0,t.k6)((()=>[(0,t.eW)("取消")])),_:1}),(0,t.bF)(m,{type:"primary",onClick:o.handleSave,loading:o.state.loading},{default:(0,t.k6)((()=>[(0,t.eW)("确认")])),_:1},8,["onClick","loading"])])])),_:1})])),_:1},8,["model","rules"])])])),_:1},8,["modelValue"])}var _n={props:["data","modelValue"],emits:["change","update:modelValue"],setup(e,{emit:l}){const a=/(\d+|\*)-(\d+|\*)-(\d+|\*)\s+(\d+|\*):(\d+|\*):(\d+|\*)/,n=/(\d+)-(\d+)-(\d+)\s+(\d+):(\d+):(\d+)/,o=/(.+)\s+(.+)\s+(.+)\s+(.+)\s+(.+)\s+(.+)/,r=(0,u.KR)(null),s=(0,t.WQ)("plan");!s.value.current.TriggerHandle&&s.value.triggers.length>0&&(s.value.current.TriggerHandle=s.value.triggers[0].value);const d=(0,u.Kh)({show:!0,loading:!1,ruleCron:{week:"*",month:"*",day:"*",hour:"*",min:"*",sec:"30"},ruleAt:{type:3,month:"*",day:"*",hour:0,min:0,sec:0},ruleTimer:{year:0,month:0,day:0,hour:0,min:0,sec:30},ruleTrigger:{year:0,month:0,day:0,hour:0,min:0,sec:30},ruleForm:{Id:s.value.current.Id,Category:s.value.current.Category,Key:s.value.current.Key,Value:s.value.current.Value,Rule:s.value.current.Rule,Handle:s.value.current.Handle,Method:s.value.current.Method,Disabled:s.value.current.Disabled,TriggerHandle:s.value.current.TriggerHandle},rules:{}});(0,t.wB)((()=>d.show),(e=>{e||setTimeout((()=>{l("update:modelValue",e)}),300)}));const i={2:e=>{if(e=e||"*-*-* 0:0:0",0==a.test(e))return;const[,l,t,n,o,r,s]=e.match(a);"*"==r?d.ruleAt.type=5:"*"==o?d.ruleAt.type=4:"*"==n?d.ruleAt.type=3:"*"==t&&(d.ruleAt.type=2),d.ruleAt.year=l,d.ruleAt.month=t,d.ruleAt.day=n,d.ruleAt.hour=o,d.ruleAt.min=r,d.ruleAt.sec=s},4:e=>{if(e=e||"0-0-0 0:0:30",0==n.test(e))return;const[,l,a,t,o,r,s]=e.match(n);d.ruleTimer.year=l,d.ruleTimer.month=a,d.ruleTimer.day=t,d.ruleTimer.hour=o,d.ruleTimer.min=r,d.ruleTimer.sec=s},8:e=>{if(e=e||"30 * * * * ?",0==o.test(e))return;const[,l,a,t,n,r,s]=e.match(o);d.ruleCron.sec=l,d.ruleCron.min=a,d.ruleCron.hour=t,d.ruleCron.day=n,d.ruleCron.month=r,d.ruleCron.week=s},16:e=>{if(e=e||"0-0-0 0:0:30",0==n.test(e))return;const[,l,a,t,o,r,s]=e.match(n);d.ruleTrigger.year=l,d.ruleTrigger.month=a,d.ruleTrigger.day=t,d.ruleTrigger.hour=o,d.ruleTrigger.min=r,d.ruleTrigger.sec=s}},c=()=>{d.ruleForm.Method in i&&i[d.ruleForm.Method](d.ruleForm.Rule)},h={2:()=>{switch(d.ruleAt.type){case 2:return`*-*-${d.ruleAt.day} ${d.ruleAt.hour}:${d.ruleAt.min}:${d.ruleAt.sec}`;case 3:return`*-*-* ${d.ruleAt.hour}:${d.ruleAt.min}:${d.ruleAt.sec}`;case 4:return`*-*-* *:${d.ruleAt.min}:${d.ruleAt.sec}`;case 5:return`*-*-* *:*:${d.ruleAt.sec}`}return""},4:()=>`${d.ruleTimer.year}-${d.ruleTimer.month}-${d.ruleTimer.day} ${d.ruleTimer.hour}:${d.ruleTimer.min}:${d.ruleTimer.sec}`,8:()=>`${d.ruleCron.sec} ${d.ruleCron.min} ${d.ruleCron.hour} ${d.ruleCron.day} ${d.ruleCron.month} ${d.ruleCron.week}`,16:()=>`${d.ruleTrigger.year}-${d.ruleTrigger.month}-${d.ruleTrigger.day} ${d.ruleTrigger.hour}:${d.ruleTrigger.min}:${d.ruleTrigger.sec}`},m=()=>{d.ruleForm.Method in h&&(d.ruleForm.Rule=h[d.ruleForm.Method]())},p=()=>{m()},g=()=>{const e=JSON.parse(JSON.stringify(d.ruleForm));d.loading=!0,sn(s.value.machineid,e).then((e=>{d.loading=!1,d.show=!1})).catch((()=>{d.loading=!1}))};return(0,t.sV)((()=>{c(),p()})),{state:d,ruleFormRef:r,plan:s,handleChange:p,handleSave:g}}};const Vn=(0,E.A)(_n,[["render",En]]);var Ln=Vn,Pn={components:{PlanEdit:Ln},props:["machineid","category","handles"],setup(e){const l=(0,u.KR)({machineid:e.machineid,timer:0,list:{},current:{},showEdit:!1,category:e.category||"",handles:e.handles||[],handleJson:(e.handles||[]).reduce(((e,l,a)=>(e[l.value]=l.label,e)),{}),triggers:[],methods:[{label:"手动",value:0},{label:"启动后",value:1},{label:"到点",value:2},{label:"定时",value:4},{label:"Cron",value:8},{label:"触发",value:16}]});(0,t.Gt)("plan",l);const a=()=>{clearTimeout(l.value.timer),rn(l.value.machineid,e.category).then((e=>{l.value.list=e.reduce(((e,l,a)=>(e[`${l.Key}-${l.Handle}`]=l,e)),{}),l.value.timer=setTimeout(a,1e3)})).catch((()=>{l.value.timer=setTimeout(a,1e3)}))},n=(e,t)=>{const n=l.value.list[`${e}-${t}`];n&&dn(l.value.machineid,n.Id).then((()=>{a()}))};return(0,t.sV)((()=>{a()})),(0,t.hi)((()=>{clearTimeout(l.value.timer)})),{plan:l,remove:n}}};const In=(0,E.A)(Pn,[["render",nn]]);var Tn=In;const Mn={key:0},Sn={key:1};function Wn(e,l,a,o,r,s){return(0,t.uX)(),(0,t.CE)("a",{href:"javascript:;",class:"a-line",onClick:l[0]||(l[0]=(...e)=>o.handleEdit&&o.handleEdit(...e))},[o.item?((0,t.uX)(),(0,t.CE)("span",Mn,(0,n.v_)(o.rule),1)):((0,t.uX)(),(0,t.CE)("span",Sn,"未设置"))])}var An={props:["keyid","handle"],setup(e){const l=/(\d+|\*)-(\d+|\*)-(\d+|\*)\s+(\d+|\*):(\d+|\*):(\d+|\*)/,a=/(\d+)-(\d+)-(\d+)\s+(\d+):(\d+):(\d+)/,n={0:()=>"手动",1:()=>"网络启动后",2:(e,a)=>{if(0==l.test(a))return a;const[,t,n,o,r,s,d]=a.match(l);return"*"==s?`每分钟的${d}秒`:"*"==r?`每小时的${s}分${d}秒`:"*"==o?`每天的${r}时${s}分${d}秒`:"*"==n?`每月的${o}日${r}时${s}分${d}秒`:"*"==t?`每年的${n}月${o}日${r}时${s}分${d}秒`:void 0},4:(e,l)=>{if(0==a.test(l))return l;const[,t,n,o,r,s,d]=l.match(a),u=[];return"0"!=t&&u.push(`${t}年`),"0"!=n&&u.push(`${n}月`),"0"!=o&&u.push(`${o}日`),"0"!=r&&u.push(`${r}时`),"0"!=s&&u.push(`${s}分`),"0"!=d&&u.push(`${d}秒`),`每${u.join("")}`},8:(e,l)=>`Cron : ${l}`,16:(e,l)=>{if(0==a.test(l))return l;const[,t,n,r,s,d,u]=l.match(a),i=[];return"0"!=t&&i.push(`${t}年`),"0"!=n&&i.push(`${n}月`),"0"!=r&&i.push(`${r}日`),"0"!=s&&i.push(`${s}时`),"0"!=d&&i.push(`${d}分`),"0"!=u&&i.push(`${u}秒`),`在【${o.value.handleJson[e.TriggerHandle]}】的${i.join("")}后`}},o=(0,t.WQ)("plan"),r=(0,t.EW)((()=>o.value.list[`${e.keyid}-${e.handle}`])),s=(0,t.EW)((()=>{if(!r.value)return"";const e=r.value.Method;return n[e]?n[e](r.value,r.value.Rule):r.value.Rule})),d=()=>{o.value.current=r.value||{Id:0,Category:o.value.category,Key:`${e.keyid}`,Handle:e.handle,Value:"",Disabled:!1,TriggerHandle:"",Method:2,Rule:""},o.value.triggers=JSON.parse(JSON.stringify(o.value.handles.filter((l=>l.value!=e.handle)))),o.value.showEdit=!0};return{item:r,rule:s,handleEdit:d}}};const Xn=(0,E.A)(An,[["render",Wn]]);var Rn=Xn,Nn={props:["data","modelValue"],emits:["update:modelValue"],components:{WarnTriangleFilled:F.DtC,Delete:F.epd,Select:F.l6P,CloseBold:F.QBJ,PlanList:Tn,PlanShow:Rn},setup(e,{emit:l}){const a=(0,u.KR)(null),n=(0,d.B)(),o=It(),r=(0,u.Kh)({bufferSize:n.value.bufferSize,show:!0,data:[],timer:0,timer1:0,editing:!1,loading:!1,handles:[{label:"开启",value:"start"},{label:"关闭",value:"stop"}]});(0,t.wB)((()=>r.show),(e=>{e||setTimeout((()=>{l("update:modelValue",e)}),300)}));const s=()=>{clearTimeout(r.timer),(0,Vt.eX)(o.value.machineid).then((e=>{r.timer=setTimeout(s,1e3)})).catch((()=>{r.timer=setTimeout(s,1e3)}))},c=()=>{clearTimeout(r.timer1),0==r.editing?(0,Vt.pY)(o.value.machineid).then((e=>{e.forEach((e=>{e.Temp=(e.Domain||e.RemotePort).toString(),e.RemotePort=0,e.Domain=""})),r.data=e,r.timer1=setTimeout(c,1e3)})).catch((()=>{r.timer1=setTimeout(c,1e3)})):r.timer1=setTimeout(c,1e3)},h=()=>{c()},m=(e,l)=>{w(e,l.property)},p=()=>{c(),i.nk.success("已刷新")},g=()=>{r.loading=!0;const e={Id:0,Name:"",RemotePort:0,LocalEP:"127.0.0.1:80",Domain:"",Temp:""};(0,Vt.Qs)({machineid:o.value.machineid,data:e}).then((()=>{r.loading=!1,setTimeout((()=>{c()}),100)})).catch((e=>{r.loading=!1,i.nk.error(e)}))},w=(e,l)=>{e.Started?i.nk.error("请先停止运行"):(r.data.forEach((e=>{e["NameEditing"]=!1,e["RemotePortEditing"]=!1,e["LocalEPEditing"]=!1,e["DomainEditing"]=!1,e["TempEditing"]=!1})),e[`${l}Editing`]=!0,r.editing=!0)},k=(e,l)=>{e.Started?i.nk.error("请先停止运行"):(e[`${l}Editing`]=!1,r.editing=!1,b(e))},v=e=>{a.value.remove(e,"start"),a.value.remove(e,"stop"),(0,Vt.DY)({machineid:o.value.machineid,id:e}).then((()=>{r.loading=!1,c()})).catch((e=>{r.loading=!1,i.nk.error(e)}))},f=e=>{r.loading=!0;const l=e.Started?(0,Vt.JT)({machineid:o.value.machineid,id:e.Id}):(0,Vt.nP)({machineid:o.value.machineid,id:e.Id});l.then((()=>{r.loading=!1,c()})).catch((e=>{r.loading=!1,i.nk.error(e)}))},b=e=>{e.Temp&&(/^\d+$/.test(e.Temp)?e.RemotePort=parseInt(e.Temp):e.Domain=e.Temp,r.loading=!0,(0,Vt.Qs)({machineid:o.value.machineid,data:e}).then((e=>{r.loading=!1,0==e&&i.nk.error("操作失败,可能存在相同值"),c()})).catch((e=>{r.loading=!1,i.nk.error(e)})))};return(0,t.sV)((()=>{c(),s()})),(0,t.hi)((()=>{clearTimeout(r.timer),clearTimeout(r.timer1)})),{state:r,planDom:a,machineName:o.value.machineName,machineId:o.value.machineid,handleOnShowList:h,handleCellClick:m,handleRefresh:p,handleAdd:g,handleEdit:w,handleEditBlur:k,handleDel:v,handleStartChange:f}}};const xn=(0,E.A)(Nn,[["render",tn],["__scopeId","data-v-010bdab6"]]);var Bn=xn;const Un=e=>((0,t.Qi)("data-v-ac6bb914"),e=e(),(0,t.jt)(),e),$n=Un((()=>(0,t.Lk)("span",null,"中继 : ",-1))),Dn={key:0,href:"javascript:;",class:"a-line"},zn=Un((()=>(0,t.Lk)("span",null,"操作中.",-1))),On=["onClick"],Qn=Un((()=>(0,t.Lk)("span",null,"打洞 : ",-1))),jn={key:0,href:"javascript:;",class:"a-line"},Kn=Un((()=>(0,t.Lk)("span",null,"操作中.",-1))),Gn=["onClick"],qn=["href"],Hn={href:"javascript:;",class:"a-line"},Jn={key:0},Zn={key:1},Yn={key:0},eo={key:1},lo={key:0},ao={key:1},to=Un((()=>(0,t.Lk)("span",null,"/",-1))),no={key:0},oo={key:1},ro={class:"dropdown"};function so(e,l,a,o,r,s){const d=(0,t.g2)("el-table-column"),u=(0,t.g2)("Loading"),i=(0,t.g2)("el-icon"),c=(0,t.g2)("Delete"),h=(0,t.g2)("el-button"),m=(0,t.g2)("el-popconfirm"),p=(0,t.g2)("el-table"),g=(0,t.g2)("el-dialog"),w=(0,t.g2)("el-switch"),k=(0,t.g2)("ArrowDown"),v=(0,t.g2)("el-dropdown-item"),f=(0,t.g2)("el-dropdown-menu"),b=(0,t.g2)("el-dropdown");return(0,t.uX)(),(0,t.CE)(t.FK,null,[(0,t.bF)(g,{modelValue:o.state.show,"onUpdate:modelValue":l[0]||(l[0]=e=>o.state.show=e),"append-to":".app-wrap",title:`与[${o.state.machineName}]的链接`,top:"1vh",width:"780"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",null,[(0,t.bF)(p,{data:o.state.data,size:"small",border:"",height:"500"},{default:(0,t.k6)((()=>[(0,t.bF)(d,{property:"RemoteMachineId",label:"目标/服务器"},{default:(0,t.k6)((e=>[(0,t.Lk)("div",{class:(0,n.C4)({green:e.row.Connected})},[(0,t.Lk)("p",null,(0,n.v_)(e.row.IPEndPoint),1),(0,t.Lk)("p",null,"ssl : "+(0,n.v_)(e.row.SSL),1)],2)])),_:1}),(0,t.bF)(d,{property:"TransactionId",label:"事务",width:"80"},{default:(0,t.k6)((e=>[(0,t.Lk)("span",null,(0,n.v_)(o.state.transactions[e.row.TransactionId]),1)])),_:1}),(0,t.bF)(d,{property:"TransportName",label:"协议",width:"120"},{default:(0,t.k6)((e=>[(0,t.Lk)("div",null,[(0,t.Lk)("p",null,(0,n.v_)(e.row.TransportName)+"("+(0,n.v_)(o.state.protocolTypes[e.row.ProtocolType])+")",1),(0,t.Lk)("p",null,(0,n.v_)(o.state.types[e.row.Type])+" - "+(0,n.v_)(1<[(0,t.Lk)("span",null,(0,n.v_)(e.row.Delay)+"ms",1)])),_:1}),(0,t.bF)(d,{property:"Bytes",label:"通信"},{default:(0,t.k6)((e=>[(0,t.Lk)("div",null,[(0,t.Lk)("p",null,"up : "+(0,n.v_)(e.row.SendBytesText),1),(0,t.Lk)("p",null,"down : "+(0,n.v_)(e.row.ReceiveBytesText),1)])])),_:1}),(0,t.bF)(d,{property:"relay",label:"中继节点"},{default:(0,t.k6)((e=>[(0,t.Lk)("div",null,[(0,t.Lk)("p",null,[$n,o.state.relayOperatings[e.row.RemoteMachineId]?((0,t.uX)(),(0,t.CE)("a",Dn,[zn,(0,t.bF)(i,{size:"14",class:"loading"},{default:(0,t.k6)((()=>[(0,t.bF)(u)])),_:1})])):((0,t.uX)(),(0,t.CE)("a",{key:1,href:"javascript:;",class:"a-line",onClick:l=>o.handleNode(e.row)},(0,n.v_)(o.state.nodesDic[e.row.NodeId]||"选择节点"),9,On))]),(0,t.Lk)("p",null,[Qn,o.state.p2pOperatings[e.row.RemoteMachineId]?((0,t.uX)(),(0,t.CE)("a",jn,[Kn,(0,t.bF)(i,{size:"14",class:"loading"},{default:(0,t.k6)((()=>[(0,t.bF)(u)])),_:1})])):((0,t.uX)(),(0,t.CE)("a",{key:1,href:"javascript:;",class:"a-line",onClick:l=>o.handlep2p(e.row)},"尝试打洞",8,Gn))])])])),_:1}),(0,t.bF)(d,{label:"操作",width:"54"},{default:(0,t.k6)((e=>[(0,t.Lk)("div",null,[o.hasTunnelRemove?((0,t.uX)(),(0,t.Wv)(m,{key:0,"confirm-button-text":"确认","cancel-button-text":"取消",title:"确定关闭此连接?",onConfirm:l=>o.handleDel(e.row)},{reference:(0,t.k6)((()=>[(0,t.bF)(h,{type:"danger",size:"small"},{default:(0,t.k6)((()=>[(0,t.bF)(i,null,{default:(0,t.k6)((()=>[(0,t.bF)(c)])),_:1})])),_:1})])),_:2},1032,["onConfirm"])):(0,t.Q3)("",!0)])])),_:1})])),_:1},8,["data"])])])),_:1},8,["modelValue","title"]),(0,t.bF)(g,{modelValue:o.state.showNodes,"onUpdate:modelValue":l[1]||(l[1]=e=>o.state.showNodes=e),title:e.$t("server.relayTitle"),width:"760",top:"2vh"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",null,[(0,t.bF)(p,{data:o.state.nodes,size:"small",border:"",height:"600"},{default:(0,t.k6)((()=>[(0,t.bF)(d,{property:"Name",label:e.$t("server.relayName")},{default:(0,t.k6)((e=>[(0,t.Lk)("div",null,[(0,t.Lk)("a",{href:e.row.Url,class:"a-line blue",target:"_blank"},(0,n.v_)(e.row.Name),9,qn),(0,t.Lk)("a",Hn,[1==(1&e.row.AllowProtocol)?((0,t.uX)(),(0,t.CE)("span",Jn,",tcp")):(0,t.Q3)("",!0),2==(2&e.row.AllowProtocol)?((0,t.uX)(),(0,t.CE)("span",Zn,",udp")):(0,t.Q3)("",!0)])])])),_:1},8,["label"]),(0,t.bF)(d,{property:"MaxGbTotal",label:e.$t("server.relayFlow"),width:"140"},{default:(0,t.k6)((e=>[0==e.row.MaxGbTotal?((0,t.uX)(),(0,t.CE)("span",Yn,"--")):((0,t.uX)(),(0,t.CE)("span",eo,(0,n.v_)((e.row.MaxGbTotalLastBytes/1024/1024/1024).toFixed(2))+"GB / "+(0,n.v_)(e.row.MaxGbTotal)+"GB ",1))])),_:1},8,["label"]),(0,t.bF)(d,{property:"MaxBandwidth",label:e.$t("server.relaySpeed"),width:"80"},{default:(0,t.k6)((e=>[0==e.row.MaxBandwidth?((0,t.uX)(),(0,t.CE)("span",lo,"--")):((0,t.uX)(),(0,t.CE)("span",ao,(0,n.v_)(e.row.MaxBandwidth)+"Mbps",1))])),_:1},8,["label"]),(0,t.bF)(d,{property:"MaxBandwidthTotal",label:`${e.$t("server.relaySpeed2")}/${e.$t("server.relaySpeed1")}`,width:"120"},{default:(0,t.k6)((e=>[(0,t.Lk)("span",null,[(0,t.Lk)("span",null,(0,n.v_)(e.row.BandwidthRatio)+"Mbps",1),to,0==e.row.MaxBandwidthTotal?((0,t.uX)(),(0,t.CE)("span",no,"--")):((0,t.uX)(),(0,t.CE)("span",oo,(0,n.v_)(e.row.MaxBandwidthTotal)+"Mbps",1))])])),_:1},8,["label"]),(0,t.bF)(d,{property:"ConnectionRatio",label:e.$t("server.relayConnection"),width:"80"},{default:(0,t.k6)((e=>[(0,t.Lk)("span",null,[(0,t.Lk)("strong",null,(0,n.v_)(e.row.ConnectionRatio),1),(0,t.eW)("/"+(0,n.v_)(e.row.MaxConnection),1)])])),_:1},8,["label"]),(0,t.bF)(d,{property:"Delay",label:e.$t("server.relayDelay"),width:"60"},{default:(0,t.k6)((e=>[(0,t.Lk)("span",null,(0,n.v_)(e.row.Delay)+"ms",1)])),_:1},8,["label"]),(0,t.bF)(d,{property:"Public",label:e.$t("server.relayPublic"),width:"50"},{default:(0,t.k6)((e=>[(0,t.bF)(w,{disabled:"",modelValue:e.row.Public,"onUpdate:modelValue":l=>e.row.Public=l,size:"small"},null,8,["modelValue","onUpdate:modelValue"])])),_:1},8,["label"]),(0,t.bF)(d,{property:"Oper",label:e.$t("server.relayOper"),width:"75"},{default:(0,t.k6)((l=>[(0,t.bF)(b,{size:"small"},{dropdown:(0,t.k6)((()=>[(0,t.bF)(f,null,{default:(0,t.k6)((()=>[1==(1&l.row.AllowProtocol)?((0,t.uX)(),(0,t.Wv)(v,{key:0,onClick:e=>o.handleConnect(l.row.Id,1)},{default:(0,t.k6)((()=>[(0,t.eW)((0,n.v_)(e.$t("common.relay"))+"TCP",1)])),_:2},1032,["onClick"])):(0,t.Q3)("",!0),2==(2&l.row.AllowProtocol)?((0,t.uX)(),(0,t.Wv)(v,{key:1,onClick:e=>o.handleConnect(l.row.Id,2)},{default:(0,t.k6)((()=>[(0,t.eW)((0,n.v_)(e.$t("common.relay"))+"UDP",1)])),_:2},1032,["onClick"])):(0,t.Q3)("",!0)])),_:2},1024)])),default:(0,t.k6)((()=>[(0,t.Lk)("div",ro,[(0,t.Lk)("span",null,(0,n.v_)(e.$t("server.relayUse")),1),(0,t.bF)(i,{class:"el-icon--right"},{default:(0,t.k6)((()=>[(0,t.bF)(k)])),_:1})])])),_:2},1024)])),_:1},8,["label"])])),_:1},8,["data"])])])),_:1},8,["modelValue","title"])],64)}var uo=a(9232),io=a(5931),co={props:["modelValue"],emits:["change","update:modelValue"],components:{Delete:F.epd,Select:F.l6P,ArrowDown:F.yd$,Loading:F.Rhj},setup(e,{emit:l}){const{t:a}=(0,io.s9)(),n=(0,d.B)(),o=(0,t.EW)((()=>n.value.hasAccess("TunnelRemove"))),r=(0,ma.ZY)(),s=(0,ma.mx)(),c=(0,ma.FG)(),h=(0,ma.bB)(),m=(0,at.e)(),p=(0,u.Kh)({show:!0,protocolTypes:{1:"tcp",2:"udp",4:"msquic"},types:{0:"打洞",1:"中继",2:"节点"},transactions:{forward:"端口转发",tuntap:"虚拟网卡",socks5:"代理转发"},machineName:r.value.currentName,currentRow:{},data:(0,t.EW)((()=>[s.value.list[r.value.current],c.value.list[r.value.current],h.value.list[r.value.current]].filter((e=>!!e)))),showNodes:!1,nodes:[],nodesDic:{},timer:0,relayOperatings:m.value.relayOperatings,p2pOperatings:m.value.p2pOperatings});(0,t.wB)((()=>p.show),(e=>{e||setTimeout((()=>{l("update:modelValue",e),l("change")}),300)}));const g=e=>{o.value&&e.removeFunc(e.RemoteMachineId).then((()=>{i.nk.success(a("common.oper"))})).catch((()=>{}))},w=()=>{clearTimeout(p.timer),(0,uo.W4)().then((e=>{p.nodes=e,p.nodesDic=e.reduce(((e,l)=>(e[l.Id]=l.Name,e)),{}),p.timer=setTimeout(w,1e3)})).catch((()=>{p.timer=setTimeout(w,1e3)}))},k=e=>{(0,mt.xN)({ToMachineId:e.RemoteMachineId,TransactionId:e.TransactionId,DenyProtocols:"tuntap"==e.TransactionId?4:2}).then((()=>{i.nk.success(a("common.oper"))})).catch((()=>{i.nk.success(a("common.operFail"))}))},v=e=>{p.currentRow=e,p.showNodes=!0},f=(e,l)=>{const t={FromMachineId:n.value.config.Client.Id,TransactionId:p.currentRow.TransactionId,ToMachineId:p.currentRow.RemoteMachineId,NodeId:e,Protocol:l};(0,uo.uQ)(t).then((()=>{i.nk.success(a("common.oper"))})).catch((()=>{i.nk.success(a("common.operFail"))})),p.showNodes=!1};return(0,t.sV)((()=>{r.value.updateRealTime(!0),w()})),(0,t.hi)((()=>{r.value.updateRealTime(!1),clearTimeout(p.timer)})),{state:p,handleDel:g,hasTunnelRemove:o,handlep2p:k,handleNode:v,handleConnect:f}}};const ho=(0,E.A)(co,[["render",so],["__scopeId","data-v-ac6bb914"]]);var mo=ho,po=a(9383);const go={class:"updater-wrap t-c"},wo={class:"t-l"},ko={class:"flex mgt-1"},vo={class:"mgt-1 t-c"};function fo(e,l,a,o,r,s){const d=(0,t.g2)("el-option"),u=(0,t.g2)("el-select"),i=(0,t.g2)("el-col"),c=(0,t.g2)("el-row"),h=(0,t.g2)("el-button"),m=(0,t.g2)("el-dialog");return(0,t.uX)(),(0,t.Wv)(m,{class:"options-center",title:"更新","destroy-on-close":"",modelValue:o.state.show,"onUpdate:modelValue":l[2]||(l[2]=e=>o.state.show=e),width:"40rem",top:"2vh"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",go,[(0,t.Lk)("div",wo,[(0,t.Lk)("ul",null,[((0,t.uX)(!0),(0,t.CE)(t.FK,null,(0,t.pI)(o.state.msg,(e=>((0,t.uX)(),(0,t.CE)("li",null,(0,n.v_)(e),1)))),256))])]),(0,t.Lk)("div",ko,[(0,t.bF)(c,{class:"w-100"},{default:(0,t.k6)((()=>[(0,t.bF)(i,{span:10},{default:(0,t.k6)((()=>[(0,t.bF)(u,{modelValue:o.state.type,"onUpdate:modelValue":l[0]||(l[0]=e=>o.state.type=e),size:"large"},{default:(0,t.k6)((()=>[((0,t.uX)(!0),(0,t.CE)(t.FK,null,(0,t.pI)(o.state.types,(e=>((0,t.uX)(),(0,t.Wv)(d,{key:e.value,label:e.label,value:e.value},null,8,["label","value"])))),128))])),_:1},8,["modelValue"])])),_:1}),(0,t.bF)(i,{span:4},{default:(0,t.k6)((()=>[(0,t.eW)(" -> ")])),_:1}),(0,t.bF)(i,{span:10},{default:(0,t.k6)((()=>[(0,t.bF)(u,{modelValue:o.state.version,"onUpdate:modelValue":l[1]||(l[1]=e=>o.state.version=e),size:"large",filterable:"","allow-create":"","default-first-option":""},{default:(0,t.k6)((()=>[((0,t.uX)(!0),(0,t.CE)(t.FK,null,(0,t.pI)(o.state.versions,(e=>((0,t.uX)(),(0,t.Wv)(d,{key:e.value,label:e.label,value:e.value},null,8,["label","value"])))),128))])),_:1},8,["modelValue"])])),_:1})])),_:1})]),(0,t.Lk)("div",vo,[(0,t.bF)(h,{type:"success",onClick:o.handleUpdate,plain:""},{default:(0,t.k6)((()=>[(0,t.eW)("确 定")])),_:1},8,["onClick"])])])])),_:1},8,["modelValue"])}var bo={props:["modelValue"],emits:["update:modelValue"],setup(e,{emit:l}){const a=(0,d.B)(),n=((0,t.EW)((()=>a.value.hasAccess("UpdateSelf"))),(0,t.EW)((()=>a.value.hasAccess("UpdateOther")))),o=(0,po.T)(),r=(0,t.EW)((()=>a.value.signin.Version)),s=(0,t.EW)((()=>o.value.current.Version)),i=[{label:`仅【${o.value.device.MachineName}】`,value:o.value.device.MachineId},n.value?{label:"本组所有",value:"g-all"}:{},n.value?{label:"本服务器所有",value:"s-all"}:{}].filter((e=>e.value)),c=[{label:`${s.value}【最新版本】`,value:s.value},{label:`${r.value}【服务器版本】`,value:r.value}].filter((e=>e.value)),h=(0,u.Kh)({show:!0,type:i[0]||"",version:c[0]||"",types:i,versions:c,msg:[]});(0,t.wB)((()=>h.show),(e=>{e||setTimeout((()=>{l("update:modelValue",e)}),300)}));const m=()=>{const e={MachineId:o.value.device.MachineId,Version:h.version.value||h.version,GroupAll:"g-all"==h.type,All:"s-all"==h.type};(e.All||e.GroupAll)&&(e.MachineId=""),(0,S.lJ)(e).then((()=>{})).catch((()=>{})),h.show=!1};return(0,t.sV)((()=>{(0,S.rL)().then((e=>{h.msg=e.Msg}))})),{state:h,updater:o,handleUpdate:m}}};const Co=(0,E.A)(bo,[["render",fo]]);var Fo=Co;function yo(e,l,a,o,r,s){const d=(0,t.g2)("el-table-column"),u=(0,t.g2)("el-table"),i=(0,t.g2)("el-dialog");return(0,t.uX)(),(0,t.Wv)(i,{title:`${o.flow.device.name}->${e.$t("status.messengerName")}`,class:"options-center",top:"1vh","destroy-on-close":"",modelValue:o.state.show,"onUpdate:modelValue":l[0]||(l[0]=e=>o.state.show=e),width:"480"},{default:(0,t.k6)((()=>[(0,t.Lk)("div",null,[(0,t.bF)(u,{data:o.state.list,stripe:"",border:"",size:"small",width:"100%",height:"60vh"},{default:(0,t.k6)((()=>[(0,t.bF)(d,{prop:"id",label:"id",width:"200"}),(0,t.bF)(d,{prop:"request",label:"request",sortable:""},{default:(0,t.k6)((e=>[(0,t.Lk)("span",null,(0,n.v_)(e.row.request)+"ms / "+(0,n.v_)(e.row.requestMax)+"ms",1)])),_:1}),(0,t.bF)(d,{prop:"response",label:"response",sortable:""},{default:(0,t.k6)((e=>[(0,t.Lk)("span",null,(0,n.v_)(e.row.response)+"ms / "+(0,n.v_)(e.row.responseMax)+"ms",1)])),_:1})])),_:1},8,["data"])])])),_:1},8,["title","modelValue"])}var Eo=a(4921),_o={props:["modelValue"],emits:["update:modelValue"],setup(e,{emit:l}){const{t:a}=(0,io.s9)(),n=x(),o=(0,u.Kh)({show:!0,timer:0,list:[]});(0,t.wB)((()=>o.show),(e=>{e||setTimeout((()=>{l("update:modelValue",e)}),300)}));const r=()=>{clearTimeout(o.timer),(0,Eo.iN)(n.value.device.id).then((e=>{o.list=Object.keys(e).map((l=>({id:`${a(`status.messenger${l}`)}(${l})`,request:(BigInt(e[l].SendtBytes)&BigInt(4294967295)).toString(),requestMax:(BigInt(e[l].SendtBytes)>>BigInt(32)).toString(),response:(BigInt(e[l].ReceiveBytes)&BigInt(4294967295)).toString(),responseMax:(BigInt(e[l].ReceiveBytes)>>BigInt(32)).toString()}))),o.timer=setTimeout(r,3e3)})).catch((e=>{o.timer=setTimeout(r,3e3)}))};return(0,t.sV)((()=>{r()})),(0,t.hi)((()=>{clearTimeout(o.timer)})),{state:o,flow:n}}};const Vo=(0,E.A)(_o,[["render",yo]]);var Lo=Vo,Po={components:{Sort:V,Oper:$,Device:ae,DeviceEdit:de,AccessEdit:pe,Tunnel:ot,TunnelEdit:wt,ConnectionsEdit:mo,Tuntap:be,TuntapEdit:_l,TuntapLease:jl,TuntapRoutes:Hl,TuntapFirewall:la,Socks5:ba,Socks5Edit:ja,Forward:St,ForwardEdit:qt,SForwardEdit:Bn,UpdaterConfirm:Fo,Stopwatch:Lo},setup(e){const l=(0,d.B)(),a=(0,u.Kh)({height:(0,t.EW)((()=>l.value.height-90))}),{devices:n,machineId:o,_getSignList:r,_getSignList1:s,handleDeviceEdit:c,handleAccessEdit:h,handlePageChange:m,handlePageSizeChange:p,handleDel:w,clearDevicesTimeout:k,setSort:v}=(0,ue.r)(),{tuntap:b,_getTuntapInfo:F,handleTuntapEdit:y,handleTuntapRefresh:E,clearTuntapTimeout:_,getTuntapMachines:V,sortTuntapIP:L}=(0,C.O)(),{socks5:P,_getSocks5Info:I,handleSocks5Edit:T,handleSocks5Refresh:M,clearSocks5Timeout:S,getSocks5Machines:W,sortSocks5:X}=f(),{tunnel:R,_getTunnelInfo:x,getTunnelOperating:B,getRelayOperating:U,handleTunnelEdit:$,handleTunnelRefresh:D,clearTunnelTimeout:z,sortTunnel:O}=(0,at.y)(),{forward:Q,_getForwardCountInfo:j,handleForwardEdit:K,clearForwardTimeout:G,handleForwardRefresh:q}=g(),{sforward:H,_getSForwardCountInfo:J,handleSForwardEdit:Z,clearSForwardTimeout:Y,handleSForwardRefresh:ee}=Pt(),{connections:le,forwardConnections:ae,_getForwardConnections:te,tuntapConnections:ne,_getTuntapConnections:oe,socks5Connections:re,_getSocks5Connections:se,handleTunnelConnections:de,clearConnectionsTimeout:ie}=(0,ma.L2)(),{updater:ce,_getUpdater:he,_subscribeUpdater:me,clearUpdaterTimeout:pe}=(0,po.d)(),{flow:ge}=N(),{_getAccessInfo:we,clearAccessTimeout:ke,handleAccesssRefresh:ve}=(0,A.Y)(),fe=e=>{n.page.Request.Prop=e.prop,n.page.Request.Asc="ascending"==e.order;let l=new Promise(((e,l)=>{e()}));if("tunnel"==e.prop){const e=O(n.page.Request.Asc);e.length>0&&(l=v(e))}else if("tuntap"==e.prop){const e=L(n.page.Request.Asc);e.length>0&&(l=v(e))}else if("socks5"==e.prop){const e=X(n.page.Request.Asc);e.length>0&&(l=v(e))}l.then((()=>{m()})).catch((()=>{}))},be=e=>{n.page.Request.Name=e||"",n.page.Request.Name?n.page.Request.Ids=V(n.page.Request.Name).concat(W(n.page.Request.Name)).reduce(((e,l)=>(-1==e.indexOf(l)&&e.push(l),e)),[]):n.page.Request.Ids=[],m(),D(),E(),M(),q(),ee(),ve(),i.nk.success({message:"刷新成功",grouping:!0})},Ce=()=>{m(),D(),E(),M(),ve(),i.nk.success({message:"刷新成功",grouping:!0})};return(0,t.sV)((()=>{m(),D(),E(),M(),q(),ee(),ve(),r(),s(),F(),I(),x(),B(),U(),te(),oe(),se(),j(),J(),he(),me(),we()})),(0,t.hi)((()=>{k(),ie(),_(),S(),z(),G(),Y(),pe(),ke()})),{state:a,globalData:l,devices:n,machineId:o,handleSortChange:fe,handleDeviceEdit:c,handleAccessEdit:h,handlePageRefresh:be,handlePageSearch:Ce,handlePageChange:m,handlePageSizeChange:p,handleDel:w,tuntap:b,handleTuntapEdit:y,handleTuntapRefresh:E,socks5:P,handleSocks5Edit:T,handleSocks5Refresh:M,tunnel:R,connections:le,handleTunnelEdit:$,handleTunnelRefresh:D,handleTunnelConnections:de,forward:Q,handleForwardEdit:K,sforward:H,handleSForwardEdit:Z,updater:ce,flow:ge}}};const Io=(0,E.A)(Po,[["render",s],["__scopeId","data-v-b24cdae4"]]);var To=Io}}]);
\ No newline at end of file
diff --git a/src/linker.tray.win/web/js/842.190b03a1.js b/src/linker.tray.win/web/js/842.190b03a1.js
new file mode 100644
index 00000000..183d11bc
--- /dev/null
+++ b/src/linker.tray.win/web/js/842.190b03a1.js
@@ -0,0 +1 @@
+"use strict";(self["webpackChunklinker_web"]=self["webpackChunklinker_web"]||[]).push([[842],{5096:function(e,t,a){a.d(t,{A:function(){return p}});var l=a(6768);const o=e=>((0,l.Qi)("data-v-4892cd3c"),e=e(),(0,l.jt)(),e),s=o((()=>(0,l.Lk)("input",{type:"file",id:"file-input"},null,-1)));function n(e,t,a,o,n,r){const i=(0,l.g2)("PictureRounded"),d=(0,l.g2)("el-icon");return(0,l.uX)(),(0,l.CE)(l.FK,null,[(0,l.Lk)("a",{href:"javascript:;",onClick:t[0]||(t[0]=(...e)=>o.handleBg&&o.handleBg(...e))},[(0,l.bF)(d,null,{default:(0,l.k6)((()=>[(0,l.bF)(i)])),_:1})]),s],64)}var r=a(7477),i=a(2933),d={components:{PictureRounded:r.syp},props:["name"],setup(e){const t=`bg-${e.name}`,a=()=>{localStorage.getItem(t)?i.s.confirm("清除背景?","Warning",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}).then((()=>{s()})).catch((()=>{})):document.getElementById("file-input").click()},o=e=>{const t=e.target.files[0];if(t)try{const e=new FileReader;e.onload=function(e){s(e.target.result)},e.readAsDataURL(t)}catch(a){}e.target.value=""},s=e=>{e?(document.body.className="sunny",localStorage.setItem(t,e),document.body.style=`background-image:url(${e})`):(document.body.className="",document.body.style="",localStorage.setItem(t,""))};return(0,l.sV)((()=>{document.getElementById("file-input").addEventListener("change",o),s(localStorage.getItem(t))})),{handleBg:a}}},u=a(1241);const c=(0,u.A)(d,[["render",n],["__scopeId","data-v-4892cd3c"]]);var p=c},1337:function(e,t,a){a.d(t,{A:function(){return bt}});var l=a(6768),o=a(4232),s=a.p+"img/coin.6431311b.svg",n=a.p+"img/qr.a05c5f6e.jpg";const r=e=>((0,l.Qi)("data-v-d7fd0c64"),e=e(),(0,l.jt)(),e),i={class:"status-wrap flex"},d={class:"copy flex"},u=["title"],c=r((()=>(0,l.Lk)("img",{src:s,alt:"memory"},null,-1))),p={href:"javascript:;"},m={key:0,href:"https://github.com/snltty/linker",target:"_blank"},g={key:1,href:"https://linker.snltty.com",target:"_blank"},v={key:2,href:"https://linker-doc.snltty.com",target:"_blank"},f={key:3,href:"https://v.netzo123.com",target:"_blank"},h=r((()=>(0,l.Lk)("div",{class:"flex-1"},null,-1))),w={class:"export"},k={key:0,class:"api"},y={class:"server"},b=r((()=>(0,l.Lk)("div",{class:"pay"},[(0,l.Lk)("img",{src:n,alt:""})],-1)));function S(e,t,a,s,n,r){const S=(0,l.g2)("Export"),_=(0,l.g2)("Api"),C=(0,l.g2)("Server"),B=(0,l.g2)("el-dialog");return(0,l.uX)(),(0,l.CE)("div",i,[(0,l.Lk)("div",d,[(0,l.Lk)("a",{href:"javascript:;",class:"memory",title:e.$t("status.support"),onClick:t[0]||(t[0]=e=>s.state.showPay=!0)},[c,(0,l.Lk)("span",null,(0,o.v_)(e.$t("status.support")),1)],8,u),(0,l.Lk)("a",p,"©linker "+(0,o.v_)(s.self.Version),1),s.globalData.isPc?((0,l.uX)(),(0,l.CE)("a",m,"Github")):(0,l.Q3)("",!0),s.globalData.isPc?((0,l.uX)(),(0,l.CE)("a",g,(0,o.v_)(e.$t("status.website")),1)):(0,l.Q3)("",!0),s.globalData.isPc?((0,l.uX)(),(0,l.CE)("a",v,(0,o.v_)(e.$t("status.doc")),1)):(0,l.Q3)("",!0),s.globalData.isPc?((0,l.uX)(),(0,l.CE)("a",f,(0,o.v_)(e.$t("status.cdkey")),1)):(0,l.Q3)("",!0)]),h,(0,l.Lk)("div",w,[(0,l.bF)(S,{config:s.config},null,8,["config"])]),s.globalData.isPc?((0,l.uX)(),(0,l.CE)("div",k,[(0,l.bF)(_,{config:s.config},null,8,["config"])])):(0,l.Q3)("",!0),(0,l.Lk)("div",y,[(0,l.bF)(C,{config:s.config},null,8,["config"])]),(0,l.bF)(B,{modelValue:s.state.showPay,"onUpdate:modelValue":t[1]||(t[1]=e=>s.state.showPay=e),title:e.$t("status.support"),width:"400"},{default:(0,l.k6)((()=>[b])),_:1},8,["modelValue","title"])])}var _=a(144);const C={href:"javascript:;"};function B(e,t,a,s,n,r){const i=(0,l.g2)("Tools"),d=(0,l.g2)("el-icon"),u=(0,l.g2)("el-popconfirm");return s.config?((0,l.uX)(),(0,l.CE)("div",{key:0,class:(0,o.C4)(["status-api-wrap",{connected:s.connected}])},[(0,l.bF)(u,{"confirm-button-text":e.$t("status.apiClear"),"cancel-button-text":e.$t("status.apiAlter"),title:e.$t("status.apiAlterConfirm"),onCancel:s.handleShow,onConfirm:s.handleResetConnect},{reference:(0,l.k6)((()=>[(0,l.Lk)("a",C,[(0,l.bF)(d,{size:"16"},{default:(0,l.k6)((()=>[(0,l.bF)(i)])),_:1}),(0,l.Lk)("span",null,(0,o.v_)(e.$t("status.api")),1)])])),_:1},8,["confirm-button-text","cancel-button-text","title","onCancel","onConfirm"])],2)):(0,l.Q3)("",!0)}var F=a(3830),V=a(4),$=a(7477),x={components:{Tools:$.S0q},props:["config"],setup(e){const t=(0,F.B)(),a=(0,l.EW)((()=>t.value.api.connected)),o=()=>{localStorage.setItem("api-cache",""),sessionStorage.setItem("api-cache",""),window.location.reload()},s=()=>{(0,V.e3)(),(0,V.a1)(`ws${"https:"===window.location.protocol?"s":""}://${window.location.hostname}:12345`,"snltty")};return{config:e.config,connected:a,handleShow:s,handleResetConnect:o}}},T=a(1241);const P=(0,T.A)(x,[["render",B],["__scopeId","data-v-52645186"]]);var E=P;const I={class:"status-server-wrap"};function R(e,t,a,o,s,n){const r=(0,l.g2)("ServerConfig"),i=(0,l.g2)("ServerVersion"),d=(0,l.g2)("ServerFlow");return(0,l.uX)(),(0,l.CE)("div",I,[(0,l.bF)(r,{config:o.config},null,8,["config"]),(0,l.bF)(i,{config:o.config},null,8,["config"]),o.config&&o.hasFlow?((0,l.uX)(),(0,l.Wv)(d,{key:0,config:o.config},null,8,["config"])):(0,l.Q3)("",!0)])}function D(e,t,a,s,n,r){const i=(0,l.g2)("Avatar"),d=(0,l.g2)("el-icon"),u=(0,l.g2)("ArrowDown"),c=(0,l.g2)("el-dropdown-item"),p=(0,l.g2)("el-dropdown-menu"),m=(0,l.g2)("el-dropdown"),g=(0,l.g2)("Groups");return(0,l.uX)(),(0,l.CE)(l.FK,null,[(0,l.bF)(m,null,{dropdown:(0,l.k6)((()=>[s.hasGroup?((0,l.uX)(),(0,l.Wv)(p,{key:0},{default:(0,l.k6)((()=>[((0,l.uX)(!0),(0,l.CE)(l.FK,null,(0,l.pI)(s.state.groups,(e=>((0,l.uX)(),(0,l.Wv)(c,{onClick:t=>s.handleGroupChange(e.Id)},{default:(0,l.k6)((()=>[(0,l.eW)((0,o.v_)(e.Name||"未知"),1)])),_:2},1032,["onClick"])))),256)),(0,l.bF)(c,{onClick:t[0]||(t[0]=e=>s.state.showGroups=!0)},{default:(0,l.k6)((()=>[(0,l.eW)((0,o.v_)(e.$t("status.group")),1)])),_:1})])),_:1})):(0,l.Q3)("",!0)])),default:(0,l.k6)((()=>[(0,l.Lk)("span",{class:(0,o.C4)(["el-dropdown-link",{connected:s.state.connected}])},[(0,l.bF)(d,{class:"left"},{default:(0,l.k6)((()=>[(0,l.bF)(i)])),_:1}),(0,l.Lk)("span",null,(0,o.v_)(s.state.groupName||"未知"),1),(0,l.bF)(d,{class:"right"},{default:(0,l.k6)((()=>[(0,l.bF)(u)])),_:1})],2)])),_:1}),s.state.showGroups?((0,l.uX)(),(0,l.Wv)(g,{key:0,modelValue:s.state.showGroups,"onUpdate:modelValue":t[1]||(t[1]=e=>s.state.showGroups=e)},null,8,["modelValue"])):(0,l.Q3)("",!0)],64)}var A=a(9299),U=a(1219),z=a(5931);const W={class:"group-wrap"},X=["onClick"],O=["onClick"],K=["onClick"],N={key:0},M={key:1},G={class:"flex"},j=(0,l.Lk)("span",{class:"flex-1"},null,-1);function Q(e,t,a,s,n,r){const i=(0,l.g2)("el-input"),d=(0,l.g2)("el-table-column"),u=(0,l.g2)("Sync"),c=(0,l.g2)("Delete"),p=(0,l.g2)("el-icon"),m=(0,l.g2)("el-button"),g=(0,l.g2)("el-popconfirm"),v=(0,l.g2)("Plus"),f=(0,l.g2)("el-table"),h=(0,l.g2)("el-dialog");return(0,l.uX)(),(0,l.Wv)(h,{class:"options-center",title:e.$t("status.group"),"destroy-on-close":"",modelValue:s.state.show,"onUpdate:modelValue":t[0]||(t[0]=e=>s.state.show=e),width:"77rem",top:"2vh"},{default:(0,l.k6)((()=>[(0,l.Lk)("div",W,[(0,l.bF)(f,{stripe:"",data:s.state.list,border:"",size:"small",width:"100%",height:"70vh",onCellDblclick:s.handleCellClick},{default:(0,l.k6)((()=>[(0,l.bF)(d,{prop:"Name",label:e.$t("status.groupName"),width:"100"},{default:(0,l.k6)((e=>[e.row.NameEditing?((0,l.uX)(),(0,l.Wv)(i,{key:0,autofocus:"",size:"small",modelValue:e.row.Name,"onUpdate:modelValue":t=>e.row.Name=t,onBlur:t=>s.handleEditBlur(e.row,"Name")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,l.uX)(),(0,l.CE)("a",{key:1,href:"javascript:;",class:"a-line",onClick:t=>s.handleEdit(e.row,"Name")},(0,o.v_)(e.row.Name||"未知"),9,X))])),_:1},8,["label"]),(0,l.bF)(d,{prop:"Id",label:"Id"},{default:(0,l.k6)((e=>[e.row.IdEditing?((0,l.uX)(),(0,l.Wv)(i,{key:0,autofocus:"",size:"small",modelValue:e.row.Id,"onUpdate:modelValue":t=>e.row.Id=t,onBlur:t=>s.handleEditBlur(e.row,"Id")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,l.uX)(),(0,l.CE)("a",{key:1,href:"javascript:;",class:"a-line",onClick:t=>s.handleEdit(e.row,"Id")},(0,o.v_)(e.row.Id),9,O))])),_:1}),(0,l.bF)(d,{prop:"Password",label:e.$t("status.groupPassword")},{default:(0,l.k6)((e=>[e.row.PasswordEditing?((0,l.uX)(),(0,l.Wv)(i,{key:0,type:"password","show-password":"",size:"small",modelValue:e.row.Password,"onUpdate:modelValue":t=>e.row.Password=t,onBlur:t=>s.handleEditBlur(e.row,"Password")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,l.uX)(),(0,l.CE)("a",{key:1,href:"javascript:;",class:"a-line",onClick:t=>s.handleEdit(e.row,"Password")},[s.globalData.isPhone?((0,l.uX)(),(0,l.CE)("span",N,"***")):((0,l.uX)(),(0,l.CE)("span",M,(0,o.v_)(e.row.Password.replace(/.{1}/g,"*")),1))],8,K))])),_:1},8,["label"]),(0,l.bF)(d,{prop:"Oper",label:e.$t("status.groupOper"),width:"110",fixed:"right"},{header:(0,l.k6)((()=>[(0,l.Lk)("div",G,[(0,l.Lk)("strong",null,(0,o.v_)(e.$t("status.groupOper")),1),j,(0,l.bF)(u,{name:"GroupSecretKey"})])])),default:(0,l.k6)((t=>[(0,l.Lk)("div",null,[(0,l.bF)(g,{title:e.$t("status.groupDelConfirm"),onConfirm:e=>s.handleDel(t.$index)},{reference:(0,l.k6)((()=>[(0,l.bF)(m,{type:"danger",size:"small"},{default:(0,l.k6)((()=>[(0,l.bF)(p,null,{default:(0,l.k6)((()=>[(0,l.bF)(c)])),_:1})])),_:1})])),_:2},1032,["title","onConfirm"]),(0,l.bF)(m,{size:"small",onClick:e=>s.handleAdd(t.$index)},{default:(0,l.k6)((()=>[(0,l.bF)(p,null,{default:(0,l.k6)((()=>[(0,l.bF)(v)])),_:1})])),_:2},1032,["onClick"])])])),_:1},8,["label"])])),_:1},8,["data","onCellDblclick"])])])),_:1},8,["title","modelValue"])}var Y=a(8734),q={props:["modelValue"],emits:["update:modelValue"],components:{Delete:$.epd,Plus:$.FWt,Select:$.l6P,Sync:Y.A},setup(e,{emit:t}){const{t:a}=(0,z.s9)(),o=(0,F.B)(),s=(0,_.Kh)({list:o.value.config.Client.Groups,show:!0});(0,l.wB)((()=>o.value.config.Client.Groups),(()=>{0==s.list.filter((e=>e["__editing"])).length&&(s.list=o.value.config.Client.Groups)})),(0,l.wB)((()=>s.show),(e=>{e||setTimeout((()=>{t("update:modelValue",e)}),300)}));const n=(e,t)=>{r(e,t.property)},r=(e,t)=>{s.list.forEach((e=>{e["NameEditing"]=!1,e["IdEditing"]=!1,e["PasswordEditing"]=!1})),e[`${t}Editing`]=!0,e["__editing"]=!0},i=(e,t)=>{e[`${t}Editing`]=!1,e["__editing"]=!1,p()},d=e=>{s.list.splice(e,1),p()},u=e=>{s.list.filter((e=>""==e.Id||""==e.Name)).length>0?U.nk.error(a("status.groupValidate")):(s.list.splice(e+1,0,{Name:"",Id:"",Password:""}),p())},c=e=>{const t=s.list.slice(),l=t[e];t[e]=t[0],t[0]=l,(0,A.rd)({name:o.value.config.Client.Name,groups:t}).then((()=>{U.nk.success(a("common.oper")),setTimeout((()=>{window.location.reload()}),1e3)})).catch((e=>{console.log(e),U.nk.error(a("common.operFail"))}))},p=()=>{(0,A.zp)(s.list).then((()=>{U.nk.success(a("common.oper"))})).catch((e=>{console.log(e),U.nk.error(a("common.operFail"))}))};return{globalData:o,state:s,handleCellClick:n,handleEditBlur:i,handleEdit:r,handleDel:d,handleAdd:u,handleUse:c}}};const Z=(0,T.A)(q,[["render",Q]]);var H=Z,J={components:{ArrowDown:$.yd$,Avatar:$.euF,Groups:H},props:["config"],setup(e){const{t:t}=(0,z.s9)(),a=(0,F.B)(),o=(0,l.EW)((()=>a.value.hasAccess("Group"))),s=(0,_.Kh)({loading:!1,connected:(0,l.EW)((()=>a.value.signin.Connected)),groupName:(0,l.EW)((()=>a.value.config.Client.Group.Name)),groups:(0,l.EW)((()=>a.value.config.Client.Groups)),showGroups:!1}),n=e=>{const t=a.value.config.Client.Groups,l=t.map(((e,t)=>(e.$index=t,e))).filter((t=>t.Id==e))[0].$index,o=t[l];t[l]=t[0],t[0]=o,r(t)},r=e=>{s.loading=!0,(0,A.rd)({Name:a.value.config.Client.Name,Groups:e}).then((()=>{s.loading=!1,s.show=!1,U.nk.success(t("common.oper")),setTimeout((()=>{window.location.reload()}),1e3)})).catch((e=>{console.log(e),s.loading=!1,U.nk.error(t("common.operFail"))}))};return{config:e.config,hasGroup:o,state:s,handleGroupChange:n}}};const ee=(0,T.A)(J,[["render",D],["__scopeId","data-v-33467232"]]);var te=ee;const ae={key:0,class:"flow-wrap"},le=["title"],oe=["title"],se=["title"],ne=["title"];function re(e,t,a,s,n,r){const i=(0,l.g2)("el-table-column"),d=(0,l.g2)("el-button"),u=(0,l.g2)("el-table"),c=(0,l.g2)("el-dialog"),p=(0,l.g2)("ServerFlowMessenger"),m=(0,l.g2)("ServerFlowSForward"),g=(0,l.g2)("ServerFlowRelay"),v=(0,l.g2)("OnlineMap"),f=(0,l.g2)("OnlineAllMap");return(0,l.uX)(),(0,l.CE)(l.FK,null,[s.config?((0,l.uX)(),(0,l.CE)("div",ae,[(0,l.Lk)("p",null,[(0,l.eW)((0,o.v_)(e.$t("status.flowOnline"))+" ",1),(0,l.Lk)("a",{href:"javascript:;",onClick:t[0]||(t[0]=e=>s.state.showMap=!0),title:`${e.$t("status.flowThisServer")}\r\n${e.$t("status.flowOnline")}/${e.$t("status.flowOnline7Day")}`},(0,o.v_)(s.state.overallOnline),9,le),(0,l.Lk)("a",{href:"javascript:;",onClick:t[1]||(t[1]=e=>s.state.showAllMap=!0),title:`${e.$t("status.flowAllServer")}\r\n${e.$t("status.flowOnline")}/${e.$t("status.flowOnline7Day")}/${e.$t("status.flowServer")}`},(0,o.v_)(s.state.serverOnline),9,oe)]),(0,l.Lk)("p",null,[(0,l.eW)((0,o.v_)(e.$t("status.flowUpload"))+" ",1),(0,l.Lk)("a",{href:"javascript:;",title:`${e.$t("status.flowThisServer")}\r\n${e.$t("status.flowAllSend")}`,onClick:t[2]||(t[2]=(...e)=>s.handleShow&&s.handleShow(...e))},(0,o.v_)(s.state.overallSendtSpeed)+"/s",9,se)]),(0,l.Lk)("p",null,[(0,l.eW)((0,o.v_)(e.$t("status.flowDownload"))+" ",1),(0,l.Lk)("a",{href:"javascript:;",title:`${e.$t("status.flowThisServer")}\r\n${e.$t("status.flowAllReceive")}`,onClick:t[3]||(t[3]=(...e)=>s.handleShow&&s.handleShow(...e))},(0,o.v_)(s.state.overallReceiveSpeed)+"/s",9,ne)])])):(0,l.Q3)("",!0),(0,l.bF)(c,{title:s.state.time,"destroy-on-close":"",modelValue:s.state.show,"onUpdate:modelValue":t[4]||(t[4]=e=>s.state.show=e),width:"640"},{default:(0,l.k6)((()=>[(0,l.Lk)("div",null,[(0,l.bF)(u,{data:s.state.list,border:"",size:"small",width:"100%"},{default:(0,l.k6)((()=>[(0,l.bF)(i,{prop:"text",label:e.$t("status.flowType")},null,8,["label"]),(0,l.bF)(i,{prop:"sendtBytes",label:e.$t("status.flowUpload"),sortable:""},{default:(0,l.k6)((e=>[(0,l.Lk)("span",null,(0,o.v_)(e.row.sendtBytesText),1)])),_:1},8,["label"]),(0,l.bF)(i,{prop:"sendtSpeed",label:e.$t("status.flowUpload"),sortable:""},{default:(0,l.k6)((e=>[(0,l.Lk)("span",null,(0,o.v_)(e.row.sendtSpeedText)+"/s",1)])),_:1},8,["label"]),(0,l.bF)(i,{prop:"receiveBytes",label:e.$t("status.flowDownload"),sortable:""},{default:(0,l.k6)((e=>[(0,l.Lk)("span",null,(0,o.v_)(e.row.receiveBytesText),1)])),_:1},8,["label"]),(0,l.bF)(i,{prop:"receiveSpeed",label:e.$t("status.flowDownload"),sortable:""},{default:(0,l.k6)((e=>[(0,l.Lk)("span",null,(0,o.v_)(e.row.receiveSpeedText)+"/s",1)])),_:1},8,["label"]),(0,l.bF)(i,{prop:"oper",label:e.$t("status.flowOper"),width:"70"},{default:(0,l.k6)((t=>[t.row.detail?((0,l.uX)(),(0,l.Wv)(d,{key:0,size:"small",onClick:e=>s.handleShowDetail(t.row.id)},{default:(0,l.k6)((()=>[(0,l.eW)((0,o.v_)(e.$t("status.flowDetail")),1)])),_:2},1032,["onClick"])):(0,l.Q3)("",!0)])),_:1},8,["label"])])),_:1},8,["data"])])])),_:1},8,["title","modelValue"]),s.state.details.Messenger?((0,l.uX)(),(0,l.Wv)(p,{key:1,config:s.config,modelValue:s.state.details.Messenger,"onUpdate:modelValue":t[5]||(t[5]=e=>s.state.details.Messenger=e)},null,8,["config","modelValue"])):(0,l.Q3)("",!0),s.state.details.SForward?((0,l.uX)(),(0,l.Wv)(m,{key:2,config:s.config,modelValue:s.state.details.SForward,"onUpdate:modelValue":t[6]||(t[6]=e=>s.state.details.SForward=e)},null,8,["config","modelValue"])):(0,l.Q3)("",!0),s.state.details.Relay?((0,l.uX)(),(0,l.Wv)(g,{key:3,config:s.config,modelValue:s.state.details.Relay,"onUpdate:modelValue":t[7]||(t[7]=e=>s.state.details.Relay=e)},null,8,["config","modelValue"])):(0,l.Q3)("",!0),s.state.showMap?((0,l.uX)(),(0,l.Wv)(v,{key:4,config:s.config,modelValue:s.state.showMap,"onUpdate:modelValue":t[8]||(t[8]=e=>s.state.showMap=e)},null,8,["config","modelValue"])):(0,l.Q3)("",!0),s.state.showAllMap?((0,l.uX)(),(0,l.Wv)(f,{key:5,config:s.config,modelValue:s.state.showAllMap,"onUpdate:modelValue":t[9]||(t[9]=e=>s.state.showAllMap=e)},null,8,["config","modelValue"])):(0,l.Q3)("",!0)],64)}a(4114);var ie=a(4921);function de(e,t,a,s,n,r){const i=(0,l.g2)("el-table-column"),d=(0,l.g2)("el-table"),u=(0,l.g2)("el-dialog");return(0,l.uX)(),(0,l.Wv)(u,{title:e.$t("status.flowMessenger"),class:"options-center",top:"1vh","destroy-on-close":"",modelValue:s.state.show,"onUpdate:modelValue":t[0]||(t[0]=e=>s.state.show=e),width:"680"},{default:(0,l.k6)((()=>[(0,l.Lk)("div",null,[(0,l.bF)(d,{data:s.state.list,stripe:"",border:"",size:"small",width:"100%",height:"60vh"},{default:(0,l.k6)((()=>[(0,l.bF)(i,{prop:"id",label:"id",width:"200"}),(0,l.bF)(i,{prop:"sendtBytes",label:e.$t("status.flowUpload"),sortable:""},{default:(0,l.k6)((e=>[(0,l.Lk)("span",null,(0,o.v_)(e.row.sendtBytesText),1)])),_:1},8,["label"]),(0,l.bF)(i,{prop:"sendtSpeed",label:e.$t("status.flowUpload"),sortable:""},{default:(0,l.k6)((e=>[(0,l.Lk)("span",null,(0,o.v_)(e.row.sendtSpeedText)+"/s",1)])),_:1},8,["label"]),(0,l.bF)(i,{prop:"receiveBytes",label:e.$t("status.flowDownload"),sortable:""},{default:(0,l.k6)((e=>[(0,l.Lk)("span",null,(0,o.v_)(e.row.receiveBytesText),1)])),_:1},8,["label"]),(0,l.bF)(i,{prop:"receiveSpeed",label:e.$t("status.flowDownload"),sortable:""},{default:(0,l.k6)((e=>[(0,l.Lk)("span",null,(0,o.v_)(e.row.receiveSpeedText)+"/s",1)])),_:1},8,["label"])])),_:1},8,["data"])])])),_:1},8,["title","modelValue"])}var ue={props:["modelValue","config"],emits:["update:modelValue"],setup(e,{emit:t}){const{t:a}=(0,z.s9)(),o=(0,_.Kh)({show:!0,timer:0,list:[],old:null});(0,l.wB)((()=>o.show),(e=>{e||setTimeout((()=>{t("update:modelValue",e)}),300)}));const s=()=>{clearTimeout(o.timer),(0,ie.zq)().then((e=>{const t=o.old||e,l=[];for(let o in e){const s=e[o],r=t[o],i=`[${o}]${a(`status.messenger${o}`)||"unknown"}`;l.push({id:i,sendtBytes:s.SendtBytes,sendtBytesText:n(s.SendtBytes),sendtSpeed:s.SendtBytes-r.SendtBytes,sendtSpeedText:n(s.SendtBytes-r.SendtBytes),receiveBytes:s.ReceiveBytes,receiveBytesText:n(s.ReceiveBytes),receiveSpeed:s.ReceiveBytes-r.ReceiveBytes,receiveSpeedText:n(s.ReceiveBytes-r.ReceiveBytes)})}o.list=l.filter((e=>!!e.id)),o.old=e,o.timer=setTimeout(s,1e3)})).catch((e=>{o.timer=setTimeout(s,1e3)}))},n=e=>{let t=0;while(e>=1024)e/=1024,t++;return`${e.toFixed(2)}${["B","KB","MB","GB","TB"][t]}`};return(0,l.sV)((()=>{s()})),(0,l.hi)((()=>{clearTimeout(o.timer)})),{config:e.config,state:o}}};const ce=(0,T.A)(ue,[["render",de],["__scopeId","data-v-80718c08"]]);var pe=ce;const me={class:"head"},ge={class:"page t-c"},ve={class:"page-wrap"};function fe(e,t,a,s,n,r){const i=(0,l.g2)("el-input"),d=(0,l.g2)("el-table-column"),u=(0,l.g2)("el-table"),c=(0,l.g2)("el-pagination"),p=(0,l.g2)("el-dialog");return(0,l.uX)(),(0,l.Wv)(p,{title:e.$t("status.flowServerForward"),class:"options-center",top:"1vh","destroy-on-close":"",modelValue:s.state.show,"onUpdate:modelValue":t[1]||(t[1]=e=>s.state.show=e),width:"680"},{default:(0,l.k6)((()=>[(0,l.Lk)("div",null,[(0,l.Lk)("div",me,[(0,l.bF)(i,{modelValue:s.state.page.Key,"onUpdate:modelValue":t[0]||(t[0]=e=>s.state.page.Key=e),placeholder:e.$t("status.flowSearchDomainPort")},null,8,["modelValue","placeholder"])]),(0,l.bF)(u,{data:s.state.list,stripe:"",border:"",size:"small",width:"100%",height:"60vh",onSortChange:s.handleSort},{default:(0,l.k6)((()=>[(0,l.bF)(d,{prop:"Key",label:e.$t("status.flowSearchDomainPort"),width:"200"},null,8,["label"]),(0,l.bF)(d,{prop:"SendtBytes",label:e.$t("status.flowUpload"),sortable:"custom"},{default:(0,l.k6)((e=>[(0,l.Lk)("span",null,(0,o.v_)(e.row.SendtBytesText),1)])),_:1},8,["label"]),(0,l.bF)(d,{prop:"DiffSendtBytes",label:e.$t("status.flowUpload"),sortable:"custom"},{default:(0,l.k6)((e=>[(0,l.Lk)("span",null,(0,o.v_)(e.row.DiffSendtBytesText)+"/s",1)])),_:1},8,["label"]),(0,l.bF)(d,{prop:"ReceiveBytes",label:e.$t("status.flowDownload"),sortable:"custom"},{default:(0,l.k6)((e=>[(0,l.Lk)("span",null,(0,o.v_)(e.row.ReceiveBytesText),1)])),_:1},8,["label"]),(0,l.bF)(d,{prop:"DiffReceiveBytes",label:e.$t("status.flowDownload"),sortable:"custom"},{default:(0,l.k6)((e=>[(0,l.Lk)("span",null,(0,o.v_)(e.row.DiffReceiveBytesText)+"/s",1)])),_:1},8,["label"])])),_:1},8,["data","onSortChange"]),(0,l.Lk)("div",ge,[(0,l.Lk)("div",ve,[(0,l.bF)(c,{small:"",background:"",layout:"total,prev,pager, next",total:s.state.page.Count,"page-size":s.state.page.PageSize,"current-page":s.state.page.Page,onCurrentChange:s.handlePageChange},null,8,["total","page-size","current-page","onCurrentChange"])])])])])),_:1},8,["title","modelValue"])}var he={props:["modelValue","config"],emits:["update:modelValue"],setup(e,{emit:t}){const a=(0,_.Kh)({show:!0,timer:0,list:[],page:{Key:"",Page:1,PageSize:15,Count:0,Order:1,OrderType:0}});(0,l.wB)((()=>a.show),(e=>{e||setTimeout((()=>{t("update:modelValue",e)}),300)}));const o=()=>{clearTimeout(a.timer),(0,ie.mb)({Key:a.page.Key,Page:a.page.Page,PageSize:a.page.PageSize,Order:a.page.Order,OrderType:a.page.OrderType}).then((e=>{try{a.page.Page=e.Page,a.page.PageSize=e.PageSize,a.page.Count=e.Count;const t=[];for(let a=0;a{a.timer=setTimeout(o,1e3)}))},s=e=>{let t=0;while(e>=1024)e/=1024,t++;return`${e.toFixed(2)}${["B","KB","MB","GB","TB"][t]}`},n=e=>{e&&(a.page.Page=e)},r=e=>{const t={ascending:1,descending:0}[e.order],l={SendtBytes:1,DiffSendtBytes:2,ReceiveBytes:3,DiffReceiveBytes:4}[e.prop];a.page.Order=l,a.page.OrderType=t};return(0,l.sV)((()=>{o()})),(0,l.hi)((()=>{clearTimeout(a.timer)})),{config:e.config,state:a,handlePageChange:n,handleSort:r}}};const we=(0,T.A)(he,[["render",fe],["__scopeId","data-v-f73b7458"]]);var ke=we;const ye={class:"head"},be={class:"page t-c"},Se={class:"page-wrap"};function _e(e,t,a,s,n,r){const i=(0,l.g2)("el-input"),d=(0,l.g2)("el-table-column"),u=(0,l.g2)("el-table"),c=(0,l.g2)("el-pagination"),p=(0,l.g2)("el-dialog");return(0,l.uX)(),(0,l.Wv)(p,{title:e.$t("status.flowRelay"),class:"options-center",top:"1vh","destroy-on-close":"",modelValue:s.state.show,"onUpdate:modelValue":t[1]||(t[1]=e=>s.state.show=e),width:"680"},{default:(0,l.k6)((()=>[(0,l.Lk)("div",null,[(0,l.Lk)("div",ye,[(0,l.bF)(i,{modelValue:s.state.page.Key,"onUpdate:modelValue":t[0]||(t[0]=e=>s.state.page.Key=e),placeholder:"名字搜索"},null,8,["modelValue"])]),(0,l.bF)(u,{data:s.state.list,stripe:"",border:"",size:"small",width:"100%",height:"60vh",onSortChange:s.handleSort},{default:(0,l.k6)((()=>[(0,l.bF)(d,{prop:"FromName",label:e.$t("status.flowRelaySource"),width:"120"},null,8,["label"]),(0,l.bF)(d,{prop:"ToName",label:e.$t("status.flowRelayTarget"),width:"120"},null,8,["label"]),(0,l.bF)(d,{prop:"SendtBytes",label:e.$t("status.flowUpload"),sortable:"custom"},{default:(0,l.k6)((e=>[(0,l.Lk)("span",null,(0,o.v_)(e.row.SendtBytesText),1)])),_:1},8,["label"]),(0,l.bF)(d,{prop:"DiffSendtBytes",label:e.$t("status.flowUpload"),sortable:"custom"},{default:(0,l.k6)((e=>[(0,l.Lk)("span",null,(0,o.v_)(e.row.DiffSendtBytesText)+"/s",1)])),_:1},8,["label"]),(0,l.bF)(d,{prop:"ReceiveBytes",label:e.$t("status.flowDownload"),sortable:"custom"},{default:(0,l.k6)((e=>[(0,l.Lk)("span",null,(0,o.v_)(e.row.ReceiveBytesText),1)])),_:1},8,["label"]),(0,l.bF)(d,{prop:"DiffReceiveBytes",label:e.$t("status.flowDownload"),sortable:"custom"},{default:(0,l.k6)((e=>[(0,l.Lk)("span",null,(0,o.v_)(e.row.DiffReceiveBytesText)+"/s",1)])),_:1},8,["label"])])),_:1},8,["data","onSortChange"]),(0,l.Lk)("div",be,[(0,l.Lk)("div",Se,[(0,l.bF)(c,{small:"",background:"",layout:"total,prev,pager, next",total:s.state.page.Count,"page-size":s.state.page.PageSize,"current-page":s.state.page.Page,onCurrentChange:s.handlePageChange},null,8,["total","page-size","current-page","onCurrentChange"])])])])])),_:1},8,["title","modelValue"])}var Ce={props:["modelValue","config"],emits:["update:modelValue"],setup(e,{emit:t}){const a=(0,_.Kh)({show:!0,timer:0,list:[],page:{Key:"",Page:1,PageSize:15,Count:0,Order:1,OrderType:0}});(0,l.wB)((()=>a.show),(e=>{e||setTimeout((()=>{t("update:modelValue",e)}),300)}));const o=()=>{clearTimeout(a.timer),(0,ie.xy)({Key:a.page.Key,Page:a.page.Page,PageSize:a.page.PageSize,Order:a.page.Order,OrderType:a.page.OrderType}).then((e=>{try{a.page.Page=e.Page,a.page.PageSize=e.PageSize,a.page.Count=e.Count;const t=[];for(let a=0;a{a.timer=setTimeout(o,1e3)}))},s=e=>{let t=0;while(e>=1024)e/=1024,t++;return`${e.toFixed(2)}${["B","KB","MB","GB","TB"][t]}`},n=e=>{e&&(a.page.Page=e)},r=e=>{const t={ascending:1,descending:0}[e.order],l={SendtBytes:1,DiffSendtBytes:2,ReceiveBytes:3,DiffReceiveBytes:4}[e.prop];a.page.Order=l,a.page.OrderType=t};return(0,l.sV)((()=>{o()})),(0,l.hi)((()=>{clearTimeout(a.timer)})),{config:e.config,state:a,handlePageChange:n,handleSort:r}}};const Be=(0,T.A)(Ce,[["render",_e],["__scopeId","data-v-019c1d95"]]);var Fe=Be;const Ve=e=>((0,l.Qi)("data-v-3c0782be"),e=e(),(0,l.jt)(),e),$e=Ve((()=>(0,l.Lk)("div",{class:"map-wrap",id:"map"},null,-1)));function xe(e,t,a,o,s,n){const r=(0,l.g2)("el-dialog");return(0,l.uX)(),(0,l.Wv)(r,{class:"options-center",title:e.$t("status.flowOnline"),"destroy-on-close":"",modelValue:o.state.show,"onUpdate:modelValue":t[0]||(t[0]=e=>o.state.show=e),width:"77rem",top:"2vh"},{default:(0,l.k6)((()=>[$e])),_:1},8,["title","modelValue"])}var Le=a(83),Te={props:["modelValue"],emits:["update:modelValue"],setup(e,{emit:t}){const{t:a}=(0,z.s9)(),o=(0,_.Kh)({show:!0});(0,l.wB)((()=>o.show),(e=>{e||setTimeout((()=>{t("update:modelValue",e)}),300)}));const s=(e,t)=>{const l=L.map("map").setView([38,105],4);L.tileLayer("https://webrd01.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}",{attribution:"linker",maxZoom:10}).addTo(l);for(let s=0;s\n ${o.MachineName}
\n ${a("status.flowArea")} : ${n.CountryCode}、${n.City}
\n ${a("status.flowNet")} : ${n.Isp}
\n \n `;new L.marker(new L.latLng([n.Lat+Math.random()/5,n.Lon+Math.random()/5]),{icon:r}).bindPopup(i,{}).on("mouseover",(function(e){this.openPopup()})).on("mouseout",(function(e){this.closePopup()})).addTo(l)}catch(o){console.log(o)}};return(0,l.sV)((()=>{(0,l.dY)((()=>{(0,Le.r7)().then((e=>{(0,A.NT)().then((t=>{s(e.List,t)})).catch((()=>{}))})).catch((()=>{}))}))})),{state:o}}};const Pe=(0,T.A)(Te,[["render",xe],["__scopeId","data-v-3c0782be"]]);var Ee=Pe;const Ie=e=>((0,l.Qi)("data-v-6f5477f6"),e=e(),(0,l.jt)(),e),Re=Ie((()=>(0,l.Lk)("div",{class:"map-wrap",id:"map"},null,-1)));function De(e,t,a,o,s,n){const r=(0,l.g2)("el-dialog");return(0,l.uX)(),(0,l.Wv)(r,{class:"options-center",title:e.$t("status.flowOnline"),"destroy-on-close":"",modelValue:o.state.show,"onUpdate:modelValue":t[0]||(t[0]=e=>o.state.show=e),width:"77rem",top:"2vh"},{default:(0,l.k6)((()=>[Re])),_:1},8,["title","modelValue"])}var Ae={props:["modelValue"],emits:["update:modelValue"],setup(e,{emit:t}){const{t:a}=(0,z.s9)(),o=(0,_.Kh)({show:!0});(0,l.wB)((()=>o.show),(e=>{e||setTimeout((()=>{t("update:modelValue",e)}),300)}));const s=e=>{const t=L.map("map").setView([38,105],4);L.tileLayer("https://webrd01.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}",{attribution:"linker",maxZoom:10}).addTo(t);for(let a=0;a\n ${l.City} ${l.Count}
\n \n `;new L.marker(new L.latLng([l.Lat,l.Lon]),{icon:o}).bindPopup(s,{}).on("mouseover",(function(e){this.openPopup()})).on("mouseout",(function(e){this.closePopup()})).addTo(t)}};return(0,l.sV)((()=>{(0,l.dY)((()=>{(0,ie.B8)().then((e=>{s(e)})).catch((()=>{}))}))})),{state:o}}};const Ue=(0,T.A)(Ae,[["render",De],["__scopeId","data-v-6f5477f6"]]);var ze=Ue,We={props:["config"],components:{ServerFlowMessenger:pe,ServerFlowSForward:ke,ServerFlowRelay:Fe,OnlineMap:Ee,OnlineAllMap:ze},setup(e){const{t:t}=(0,z.s9)(),a=(0,F.B)(),o=(0,l.EW)((()=>a.value.hasAccess("SForwardFlow"))),s=(0,l.EW)((()=>a.value.hasAccess("RelayFlow"))),n=(0,l.EW)((()=>a.value.hasAccess("SigninFlow"))),r=(0,_.Kh)({show:!1,timer:0,overallSendtSpeed:"0000.00KB",overallReceiveSpeed:"0000.00KB",overallOnline:"0/0",serverOnline:"",time:"",list:[],old:null,details:{Messenger:!1,SForward:!1,Relay:!1},showMap:!1,showAllMap:!1}),i=()=>{r.show=!0},d=e=>{r.details[e]=!0},u={External:{text:t("status.flowWanPort"),detail:!1},RelayReport:{text:t("status.flowRelayNode"),detail:!1},Relay:{text:t("status.flowRelay"),detail:s.value},Messenger:{text:t("status.flowMessenger"),detail:n.value},SForward:{text:t("status.flowServerForward"),detail:o.value},flow:{text:"",detail:!1}},c=()=>{clearTimeout(r.timer),(0,ie.Qj)().then((e=>{const t=r.old||e;if(e.Items["_"]&&(r.overallOnline=`${e.Items["_"].SendtBytes}/${e.Items["_"].ReceiveBytes}`,delete e.Items["_"]),e.Items["flow"]&&e.Items["flow"].ReceiveBytes>0){const t=(BigInt(e.Items["flow"].ReceiveBytes)>>BigInt(32)).toString(),a=(BigInt(e.Items["flow"].ReceiveBytes)&BigInt(4294967295)).toString(),l=e.Items["flow"].SendtBytes;r.serverOnline=`、${t}/${a}/${l}`,delete e.Items["flow"]}let a=0,l=0,o=0,s=0;for(let r in t.Items)a+=t.Items[r].ReceiveBytes,l+=t.Items[r].SendtBytes;for(let r in e.Items)o+=e.Items[r].ReceiveBytes,s+=e.Items[r].SendtBytes;r.overallSendtSpeed=p(s-l),r.overallReceiveSpeed=p(o-a),r.time=`${e.Start}`;const n=[];for(let r in e.Items){const a=e.Items[r],l=t.Items[r],o=u[`${r}`]||{text:`Unknow${r}`,detail:!1};n.push({id:r,text:o.text,detail:o.detail,sendtBytes:a.SendtBytes,sendtBytesText:p(a.SendtBytes),sendtSpeed:a.SendtBytes-l.SendtBytes,sendtSpeedText:p(a.SendtBytes-l.SendtBytes),receiveBytes:a.ReceiveBytes,receiveBytesText:p(a.ReceiveBytes),receiveSpeed:a.ReceiveBytes-l.ReceiveBytes,receiveSpeedText:p(a.ReceiveBytes-l.ReceiveBytes)})}r.list=n.filter((e=>!!e.id)),r.old=e,r.timer=setTimeout(c,1e3)})).catch((e=>{r.timer=setTimeout(c,1e3)}))},p=e=>{let t=0;while(e>=1024)e/=1024,t++;return`${e.toFixed(2)}${["B","KB","MB","GB","TB"][t]}`};return(0,l.sV)((()=>{c()})),(0,l.hi)((()=>{clearTimeout(r.timer)})),{hasSForwardFlow:o,config:e.config,state:r,handleShow:i,handleShowDetail:d}}};const Xe=(0,T.A)(We,[["render",re],["__scopeId","data-v-12cd5250"]]);var Oe=Xe;const Ke=["title"],Ne={key:0,class:"progress"},Me={key:1,class:"progress"};function Ge(e,t,a,s,n,r){const i=(0,l.g2)("Loading"),d=(0,l.g2)("el-icon"),u=(0,l.g2)("Download"),c=(0,l.g2)("CircleCheck");return(0,l.uX)(),(0,l.CE)("a",{href:"javascript:;",onClick:t[0]||(t[0]=(...e)=>s.handleUpdate&&s.handleUpdate(...e)),class:(0,o.C4)(["download",s.updateColor()]),title:s.updateText()},[(0,l.Lk)("span",null,(0,o.v_)(s.state.version),1),s.updaterServer.Version?((0,l.uX)(),(0,l.CE)(l.FK,{key:0},[1==s.updaterServer.Status?((0,l.uX)(),(0,l.Wv)(d,{key:0,size:"14",class:"loading"},{default:(0,l.k6)((()=>[(0,l.bF)(i)])),_:1})):2==s.updaterServer.Status?((0,l.uX)(),(0,l.Wv)(d,{key:1,size:"14"},{default:(0,l.k6)((()=>[(0,l.bF)(u)])),_:1})):3==s.updaterServer.Status||5==s.updaterServer.Status?((0,l.uX)(),(0,l.CE)(l.FK,{key:2},[(0,l.bF)(d,{size:"14",class:"loading"},{default:(0,l.k6)((()=>[(0,l.bF)(i)])),_:1}),0==s.updaterServer.Length?((0,l.uX)(),(0,l.CE)("span",Ne,"0%")):((0,l.uX)(),(0,l.CE)("span",Me,(0,o.v_)(parseInt(s.updaterServer.Current/s.updaterServer.Length*100))+"%",1))],64)):6==s.updaterServer.Status?((0,l.uX)(),(0,l.Wv)(d,{key:3,size:"14",class:"yellow"},{default:(0,l.k6)((()=>[(0,l.bF)(c)])),_:1})):(0,l.Q3)("",!0)],64)):((0,l.uX)(),(0,l.Wv)(d,{key:1,size:"14"},{default:(0,l.k6)((()=>[(0,l.bF)(u)])),_:1}))],10,Ke)}var je=a(2933),Qe=a(920),Ye={components:{Promotion:$.Yk4,Download:$.f5X,Loading:$.Rhj,CircleCheck:$.rW7,ServerFlow:Oe},props:["config"],setup(e){const{t:t}=(0,z.s9)(),a=(0,F.B)(),o=(0,l.EW)((()=>a.value.hasAccess("UpdateServer"))),s=(0,_.KR)({Version:"",Status:0,Length:0,Current:0,Msg:[],DateTime:""}),n=(0,_.Kh)({show:!1,loading:!1,connected:(0,l.EW)((()=>a.value.signin.Connected)),version:(0,l.EW)((()=>a.value.signin.Version)),timer:0}),r=()=>{clearTimeout(n.timer),(0,Qe.BJ)().then((e=>{s.value.Version=e.Version,s.value.Status=e.Status,s.value.Length=e.Length,s.value.Current=e.Current,s.value.Status>2&&s.value.Status<6&&(n.timer=setTimeout((()=>{r()}),1e3))})).catch((()=>{n.timer=setTimeout((()=>{r()}),1e3)}))},i=()=>s.value.Version?s.value.Status<=2?n.version!=s.value.Version?`${t("status.serverNotNew")}(${s.value.Version})`:`${t("status.serverNew")}`:{3:t("status.serverDownloading"),4:t("status.serverDownloaded"),5:t("status.serverUnZipIng"),6:t("status.serverUnZip")}[s.value.Status]:t("status.serverNoUpdate"),d=()=>n.version!=s.value.Version?"yellow":"green",u=()=>{e.config&&o.value&&([0,1,3,5].indexOf(s.value.Status)>=0?U.nk.error(t("common.operating")):6!=s.value.Status?2==s.value.Status&&je.s.confirm(t("status.serverConfirm"),t("common.tips"),{confirmButtonText:t("common.confirm"),cancelButtonText:t("common.cancel"),type:"warning"}).then((()=>{(0,Qe.y2)(s.value.Version||a.value.signin.Version).then((()=>{setTimeout((()=>{r()}),1e3)}))})).catch((()=>{})):je.s.confirm(t("status.serverCloseConfirm"),t("common.tips"),{confirmButtonText:t("common.confirm"),cancelButtonText:t("common.cancel"),type:"warning"}).then((()=>{(0,Qe.aP)()})).catch((()=>{})))};return(0,l.sV)((()=>{r()})),{config:e.config,state:n,updaterServer:s,handleUpdate:u,updateText:i,updateColor:d}}};const qe=(0,T.A)(Ye,[["render",Ge],["__scopeId","data-v-6baf133f"]]);var Ze=qe,He={components:{ServerConfig:te,ServerFlow:Oe,ServerVersion:Ze},props:["config"],setup(e){const t=(0,F.B)(),a=(0,l.EW)((()=>t.value.hasAccess("Flow"))),o=(0,_.Kh)({show:!1,loading:!1});return{config:e.config,hasFlow:a,state:o}}};const Je=(0,T.A)(He,[["render",R],["__scopeId","data-v-2d85a782"]]);var et=Je;const tt={key:0,class:"status-export-wrap"},at=["title"],lt={class:"port-wrap"},ot={class:"text"},st={class:"body"},nt={class:"card-header"},rt={class:"flex"},it={style:{"margin-left":"2rem"}},dt={class:"port-wrap"},ut={class:"port-wrap"},ct={style:{"margin-top":"1rem"}};function pt(e,t,a,s,n,r){const i=(0,l.g2)("Share"),d=(0,l.g2)("el-icon"),u=(0,l.g2)("el-checkbox"),c=(0,l.g2)("el-input"),p=(0,l.g2)("el-col"),m=(0,l.g2)("el-row"),g=(0,l.g2)("Access"),v=(0,l.g2)("el-card"),f=(0,l.g2)("el-button"),h=(0,l.g2)("el-dialog");return s.config&&s.hasExport?((0,l.uX)(),(0,l.CE)("div",tt,[(0,l.Lk)("a",{href:"javascript:;",title:e.$t("status.export"),onClick:t[0]||(t[0]=e=>s.state.show=!0)},[(0,l.bF)(d,{size:"16"},{default:(0,l.k6)((()=>[(0,l.bF)(i)])),_:1}),(0,l.Lk)("span",null,(0,o.v_)(e.$t("status.export")),1)],8,at),(0,l.bF)(h,{class:"options-center",title:e.$t("status.export"),"destroy-on-close":"",modelValue:s.state.show,"onUpdate:modelValue":t[11]||(t[11]=e=>s.state.show=e),center:"",width:"580",top:"1vh"},{footer:(0,l.k6)((()=>[(0,l.bF)(f,{plain:"",onClick:t[10]||(t[10]=e=>s.state.show=!1),loading:s.state.loading},{default:(0,l.k6)((()=>[(0,l.eW)((0,o.v_)(e.$t("common.cancel")),1)])),_:1},8,["loading"]),(0,l.bF)(f,{type:"default",plain:"",onClick:s.handleExport,loading:s.state.loading},{default:(0,l.k6)((()=>[(0,l.eW)((0,o.v_)(e.$t("status.exportDownload")),1)])),_:1},8,["onClick","loading"]),(0,l.bF)(f,{type:"info",plain:"",onClick:s.handleCopy,loading:s.state.loading},{default:(0,l.k6)((()=>[(0,l.eW)((0,o.v_)(e.$t("status.exportCopy")),1)])),_:1},8,["onClick","loading"]),(0,l.bF)(f,{type:"success",plain:"",onClick:s.handleSave,loading:s.state.loading},{default:(0,l.k6)((()=>[(0,l.eW)((0,o.v_)(e.$t("status.exportSave")),1)])),_:1},8,["onClick","loading"])])),default:(0,l.k6)((()=>[(0,l.Lk)("div",lt,[(0,l.Lk)("div",ot,(0,o.v_)(e.$t("status.exportText")),1),(0,l.Lk)("div",st,[(0,l.bF)(v,{shadow:"never"},{header:(0,l.k6)((()=>[(0,l.Lk)("div",nt,[(0,l.Lk)("div",rt,[(0,l.Lk)("div",null,[(0,l.bF)(u,{disabled:s.onlyNode,modelValue:s.state.single,"onUpdate:modelValue":t[1]||(t[1]=e=>s.state.single=e),label:e.$t("status.exportSingle")},null,8,["disabled","modelValue","label"])]),(0,l.Lk)("div",it,[(0,l.Lk)("span",null,(0,o.v_)(e.$t("status.exportName"))+" : ",1),(0,l.bF)(c,{disabled:!s.state.single,modelValue:s.state.name,"onUpdate:modelValue":t[2]||(t[2]=e=>s.state.name=e),maxlength:"32","show-word-limit":"",style:{width:"15rem"}},null,8,["disabled","modelValue"])]),(0,l.Lk)("div",null,[(0,l.Lk)("span",null,(0,o.v_)(e.$t("status.exportApiPassword"))+" : ",1),(0,l.bF)(c,{type:"password","show-password":"",disabled:s.onlyNode,modelValue:s.state.apipassword,"onUpdate:modelValue":t[3]||(t[3]=e=>s.state.apipassword=e),maxlength:"36","show-word-limit":"",style:{width:"15rem"}},null,8,["disabled","modelValue"])])]),(0,l.Lk)("div",null,[(0,l.bF)(m,null,{default:(0,l.k6)((()=>[(0,l.bF)(p,{span:8},{default:(0,l.k6)((()=>[(0,l.bF)(u,{modelValue:s.state.relay,"onUpdate:modelValue":t[4]||(t[4]=e=>s.state.relay=e),label:e.$t("status.exportRelay")},null,8,["modelValue","label"])])),_:1}),(0,l.bF)(p,{span:8},{default:(0,l.k6)((()=>[(0,l.bF)(u,{modelValue:s.state.sforward,"onUpdate:modelValue":t[5]||(t[5]=e=>s.state.sforward=e),label:e.$t("status.exportSForward")},null,8,["modelValue","label"])])),_:1}),(0,l.bF)(p,{span:8},{default:(0,l.k6)((()=>[(0,l.bF)(u,{modelValue:s.state.updater,"onUpdate:modelValue":t[6]||(t[6]=e=>s.state.updater=e),label:e.$t("status.exportUpdater")},null,8,["modelValue","label"])])),_:1})])),_:1})]),(0,l.Lk)("div",null,[(0,l.bF)(m,null,{default:(0,l.k6)((()=>[(0,l.bF)(p,{span:8},{default:(0,l.k6)((()=>[(0,l.bF)(u,{modelValue:s.state.server,"onUpdate:modelValue":t[7]||(t[7]=e=>s.state.server=e),label:e.$t("status.exportServer")},null,8,["modelValue","label"])])),_:1}),(0,l.bF)(p,{span:8},{default:(0,l.k6)((()=>[(0,l.bF)(u,{modelValue:s.state.group,"onUpdate:modelValue":t[8]||(t[8]=e=>s.state.group=e),label:e.$t("status.exportGroup")},null,8,["modelValue","label"])])),_:1}),(0,l.bF)(p,{span:8},{default:(0,l.k6)((()=>[(0,l.bF)(u,{modelValue:s.state.tunnel,"onUpdate:modelValue":t[9]||(t[9]=e=>s.state.tunnel=e),label:e.$t("status.exportTunnel")},null,8,["modelValue","label"])])),_:1})])),_:1})])])])),default:(0,l.k6)((()=>[(0,l.bF)(g,{ref:"accessDom",machineid:s.machineId},null,8,["machineid"])])),_:1})])])])),_:1},8,["title","modelValue"]),(0,l.bF)(h,{class:"options-center",title:e.$t("status.export"),"destroy-on-close":"",modelValue:s.state.showCopy,"onUpdate:modelValue":t[13]||(t[13]=e=>s.state.showCopy=e),center:"",width:"580",top:"1vh"},{footer:(0,l.k6)((()=>[(0,l.bF)(f,{plain:"",onClick:s.copyToClipboard},{default:(0,l.k6)((()=>[(0,l.eW)((0,o.v_)(e.$t("status.exportCopy")),1)])),_:1},8,["onClick"])])),default:(0,l.k6)((()=>[(0,l.Lk)("div",dt,[(0,l.bF)(c,{modelValue:s.state.copyContent,"onUpdate:modelValue":t[12]||(t[12]=e=>s.state.copyContent=e),type:"textarea",rows:10,resize:"none",readonly:""},null,8,["modelValue"])])])),_:1},8,["title","modelValue"]),(0,l.bF)(h,{class:"options-center",title:e.$t("status.export"),"destroy-on-close":"",modelValue:s.state.showSave,"onUpdate:modelValue":t[16]||(t[16]=e=>s.state.showSave=e),center:"",width:"300",top:"1vh"},{footer:(0,l.k6)((()=>[(0,l.bF)(f,{plain:"",onClick:s.copySaveToClipboard},{default:(0,l.k6)((()=>[(0,l.eW)((0,o.v_)(e.$t("status.exportCopy")),1)])),_:1},8,["onClick"])])),default:(0,l.k6)((()=>[(0,l.Lk)("div",ut,[(0,l.Lk)("div",null,[(0,l.bF)(c,{modelValue:s.state.saveServer,"onUpdate:modelValue":t[14]||(t[14]=e=>s.state.saveServer=e),readonly:""},null,8,["modelValue"])]),(0,l.Lk)("div",ct,[(0,l.bF)(c,{modelValue:s.state.saveContent,"onUpdate:modelValue":t[15]||(t[15]=e=>s.state.saveContent=e),readonly:""},null,8,["modelValue"])])])])),_:1},8,["title","modelValue"])])):(0,l.Q3)("",!0)}var mt=a(8835),gt=a(6206),vt={components:{Share:$.SYj,Access:gt.A},props:["config"],setup(e){const{t:t}=(0,z.s9)(),a=(0,F.B)(),o=(0,l.EW)((()=>a.value.hasAccess("Export"))),s=(0,l.EW)((()=>a.value.config.Client.OnlyNode)),n=(0,l.EW)((()=>a.value.config.Client.Id)),r=(0,_.Kh)({show:!1,loading:!1,single:!0,name:"",apipassword:s.value?a.value.config.Client.CApi.ApiPassword:"",relay:!0,sforward:!0,updater:!0,server:!0,group:!0,tunnel:!0,copyContent:"",showCopy:!1,saveServer:a.value.config.Client.Server.Host,saveContent:"",showSave:!1}),i=(0,_.KR)(null),d=()=>{if(!o.value)return;const e={access:i.value.getValue(),single:r.single,name:r.name,apipassword:r.apipassword,relay:r.relay,sforward:r.sforward,updater:r.updater,server:r.server,group:r.group,tunnel:r.tunnel};if(e.single){if(!e.name)return void U.nk.error(t("status.exportNamePlease"))}else e.name="";if(r.apipassword)return e;U.nk.error(t("status.exportApiPasswordPlease"))},u=()=>{const e=document.createElement("a");r.single?e.download=`client-node-export-${r.name}.zip`:e.download="client-node-export.zip",e.href="/client-node-export.zip",document.body.appendChild(e),e.click(),document.body.removeChild(e)},c=()=>{const e=d();e&&(r.loading=!0,(0,mt.ql)(e).then((e=>{r.loading=!1,e?(r.show=!1,U.nk.success(t("common.oper")),r.saveContent=e,r.showSave=!0):U.nk.error(t("common.operFail"))})).catch((()=>{U.nk.error(t("common.operFail")),r.loading=!1})))},p=async()=>{try{return await navigator.clipboard.writeText(`在初始化linker客户端时,填写服务器和密钥,导入配置\n服务器: ${r.saveServer}\n密钥: ${r.saveContent}`),U.nk.success(t("common.oper")),!0}catch(e){return U.nk.error(t("common.operFail")),!1}},m=()=>{const e=d();e&&(r.loading=!0,(0,mt.P$)(e).then((()=>{r.loading=!1,r.show=!1,U.nk.success(t("common.oper")),u()})).catch((()=>{U.nk.error(t("common.operFail")),r.loading=!1})))},g=()=>{const e=d();e&&(r.loading=!0,(0,mt.om)(e).then((e=>{r.loading=!1,r.show=!1,U.nk.success(t("common.oper")),r.copyContent=e,r.showCopy=!0})).catch((()=>{U.nk.error(t("common.operFail")),r.loading=!1})))},v=async()=>{try{return await navigator.clipboard.writeText(r.copyContent),U.nk.success(t("common.oper")),!0}catch(e){return U.nk.error(t("common.operFail")),!1}};return{config:e.config,onlyNode:s,hasExport:o,machineId:n,state:r,accessDom:i,handleSave:c,handleExport:m,handleCopy:g,copyToClipboard:v,copySaveToClipboard:p}}};const ft=(0,T.A)(vt,[["render",pt],["__scopeId","data-v-ec18026a"]]);var ht=ft,wt=a(7115),kt={components:{Api:E,Server:et,Export:ht,UpdaterBtn:wt.A},props:["config"],setup(e){const t=(0,F.B)(),a=(0,l.EW)((()=>t.value.self)),o=(0,_.Kh)({showPay:!1});return{globalData:t,state:o,config:e.config,self:a}}};const yt=(0,T.A)(kt,[["render",S],["__scopeId","data-v-d7fd0c64"]]);var bt=yt},8734:function(e,t,a){a.d(t,{A:function(){return v}});var l=a(6768);function o(e,t,a,o,s,n){const r=(0,l.g2)("Share"),i=(0,l.g2)("el-icon"),d=(0,l.g2)("el-button");return(0,l.uX)(),(0,l.CE)("div",null,[(0,l.bF)(d,{class:"btn",size:"small",onClick:o.handleSync},{default:(0,l.k6)((()=>[(0,l.bF)(i,null,{default:(0,l.k6)((()=>[(0,l.bF)(r)])),_:1})])),_:1},8,["onClick"])])}var s=a(4);const n=e=>(0,s.zG)("sync/Sync",e);var r=a(3830),i=a(7477),d=a(1219),u=a(2933),c=a(5931),p={props:["name"],components:{Share:i.SYj},setup(e){const{t:t}=(0,c.s9)(),a=(0,r.B)(),o=(0,l.EW)((()=>a.value.hasAccess("Sync"))),s=()=>{o.value?u.s.confirm(`${t("server.sync")}【${t(`server.async${e.name}`)}】${t("server.asyncText")}? `,t("common.tips"),{confirmButtonText:t("common.confirm"),cancelButtonText:t("common.cancel"),type:"warning"}).then((()=>{n([e.name]).then((e=>{d.nk.success(t("common.oper"))}))})).catch((()=>{})):d.nk.success(t("common.access"))};return{handleSync:s}}},m=a(1241);const g=(0,m.A)(p,[["render",o]]);var v=g}}]);
\ No newline at end of file
diff --git a/src/linker.tray.win/web/js/898.2e9a4f2f.js b/src/linker.tray.win/web/js/898.2e9a4f2f.js
deleted file mode 100644
index f644b2b4..00000000
--- a/src/linker.tray.win/web/js/898.2e9a4f2f.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(self["webpackChunklinker_web"]=self["webpackChunklinker_web"]||[]).push([[898],{5096:function(e,t,a){a.d(t,{A:function(){return p}});var l=a(6768);const o=e=>((0,l.Qi)("data-v-4892cd3c"),e=e(),(0,l.jt)(),e),s=o((()=>(0,l.Lk)("input",{type:"file",id:"file-input"},null,-1)));function n(e,t,a,o,n,r){const i=(0,l.g2)("PictureRounded"),d=(0,l.g2)("el-icon");return(0,l.uX)(),(0,l.CE)(l.FK,null,[(0,l.Lk)("a",{href:"javascript:;",onClick:t[0]||(t[0]=(...e)=>o.handleBg&&o.handleBg(...e))},[(0,l.bF)(d,null,{default:(0,l.k6)((()=>[(0,l.bF)(i)])),_:1})]),s],64)}var r=a(7477),i=a(2933),d={components:{PictureRounded:r.syp},props:["name"],setup(e){const t=`bg-${e.name}`,a=()=>{localStorage.getItem(t)?i.s.confirm("清除背景?","Warning",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}).then((()=>{s()})).catch((()=>{})):document.getElementById("file-input").click()},o=e=>{const t=e.target.files[0];if(t)try{const e=new FileReader;e.onload=function(e){s(e.target.result)},e.readAsDataURL(t)}catch(a){}e.target.value=""},s=e=>{e?(document.body.className="sunny",localStorage.setItem(t,e),document.body.style=`background-image:url(${e})`):(document.body.className="",document.body.style="",localStorage.setItem(t,""))};return(0,l.sV)((()=>{document.getElementById("file-input").addEventListener("change",o),s(localStorage.getItem(t))})),{handleBg:a}}},u=a(1241);const c=(0,u.A)(d,[["render",n],["__scopeId","data-v-4892cd3c"]]);var p=c},5317:function(e,t,a){a.d(t,{A:function(){return bt}});var l=a(6768),o=a(4232),s=a.p+"img/coin.6431311b.svg",n=a.p+"img/qr.a05c5f6e.jpg";const r=e=>((0,l.Qi)("data-v-53629093"),e=e(),(0,l.jt)(),e),i={class:"status-wrap flex"},d={class:"copy flex"},u=["title"],c=r((()=>(0,l.Lk)("img",{src:s,alt:"memory"},null,-1))),p={href:"javascript:;"},m={key:0,href:"https://github.com/snltty/linker",target:"_blank"},g={key:1,href:"https://linker.snltty.com",target:"_blank"},v={key:2,href:"https://linker-doc.snltty.com",target:"_blank"},f={key:3,href:"https://v.netzo123.com",target:"_blank"},h=r((()=>(0,l.Lk)("div",{class:"flex-1"},null,-1))),w={key:0,class:"export"},k={key:1,class:"api"},y={class:"server"},b=r((()=>(0,l.Lk)("div",{class:"pay"},[(0,l.Lk)("img",{src:n,alt:""})],-1)));function S(e,t,a,s,n,r){const S=(0,l.g2)("Export"),C=(0,l.g2)("Api"),_=(0,l.g2)("Server"),B=(0,l.g2)("el-dialog");return(0,l.uX)(),(0,l.CE)("div",i,[(0,l.Lk)("div",d,[(0,l.Lk)("a",{href:"javascript:;",class:"memory",title:e.$t("status.support"),onClick:t[0]||(t[0]=e=>s.state.showPay=!0)},[c,(0,l.Lk)("span",null,(0,o.v_)(e.$t("status.support")),1)],8,u),(0,l.Lk)("a",p,"©linker "+(0,o.v_)(s.self.Version),1),s.globalData.isPc?((0,l.uX)(),(0,l.CE)("a",m,"Github")):(0,l.Q3)("",!0),s.globalData.isPc?((0,l.uX)(),(0,l.CE)("a",g,(0,o.v_)(e.$t("status.website")),1)):(0,l.Q3)("",!0),s.globalData.isPc?((0,l.uX)(),(0,l.CE)("a",v,(0,o.v_)(e.$t("status.doc")),1)):(0,l.Q3)("",!0),s.globalData.isPc?((0,l.uX)(),(0,l.CE)("a",f,(0,o.v_)(e.$t("status.cdkey")),1)):(0,l.Q3)("",!0)]),h,s.globalData.isPc?((0,l.uX)(),(0,l.CE)("div",w,[(0,l.bF)(S,{config:s.config},null,8,["config"])])):(0,l.Q3)("",!0),s.globalData.isPc?((0,l.uX)(),(0,l.CE)("div",k,[(0,l.bF)(C,{config:s.config},null,8,["config"])])):(0,l.Q3)("",!0),(0,l.Lk)("div",y,[(0,l.bF)(_,{config:s.config},null,8,["config"])]),(0,l.bF)(B,{modelValue:s.state.showPay,"onUpdate:modelValue":t[1]||(t[1]=e=>s.state.showPay=e),title:e.$t("status.support"),width:"400"},{default:(0,l.k6)((()=>[b])),_:1},8,["modelValue","title"])])}var C=a(144);const _={href:"javascript:;"};function B(e,t,a,s,n,r){const i=(0,l.g2)("Tools"),d=(0,l.g2)("el-icon"),u=(0,l.g2)("el-popconfirm");return s.config?((0,l.uX)(),(0,l.CE)("div",{key:0,class:(0,o.C4)(["status-api-wrap",{connected:s.connected}])},[(0,l.bF)(u,{"confirm-button-text":e.$t("status.apiClear"),"cancel-button-text":e.$t("status.apiAlter"),title:e.$t("status.apiAlterConfirm"),onCancel:s.handleShow,onConfirm:s.handleResetConnect},{reference:(0,l.k6)((()=>[(0,l.Lk)("a",_,[(0,l.bF)(d,{size:"16"},{default:(0,l.k6)((()=>[(0,l.bF)(i)])),_:1}),(0,l.Lk)("span",null,(0,o.v_)(e.$t("status.api")),1)])])),_:1},8,["confirm-button-text","cancel-button-text","title","onCancel","onConfirm"])],2)):(0,l.Q3)("",!0)}var F=a(3830),V=a(4),$=a(7477),x={components:{Tools:$.S0q},props:["config"],setup(e){const t=(0,F.B)(),a=(0,l.EW)((()=>t.value.api.connected)),o=()=>{localStorage.setItem("api-cache",""),sessionStorage.setItem("api-cache",""),window.location.reload()},s=()=>{(0,V.e3)(),(0,V.a1)(`ws${"https:"===window.location.protocol?"s":""}://${window.location.hostname}:12345`,"snltty")};return{config:e.config,connected:a,handleShow:s,handleResetConnect:o}}},T=a(1241);const P=(0,T.A)(x,[["render",B],["__scopeId","data-v-52645186"]]);var E=P;const I={class:"status-server-wrap"};function D(e,t,a,o,s,n){const r=(0,l.g2)("ServerConfig"),i=(0,l.g2)("ServerVersion"),d=(0,l.g2)("ServerFlow");return(0,l.uX)(),(0,l.CE)("div",I,[(0,l.bF)(r,{config:o.config},null,8,["config"]),(0,l.bF)(i,{config:o.config},null,8,["config"]),o.config&&o.hasFlow?((0,l.uX)(),(0,l.Wv)(d,{key:0,config:o.config},null,8,["config"])):(0,l.Q3)("",!0)])}function R(e,t,a,s,n,r){const i=(0,l.g2)("Avatar"),d=(0,l.g2)("el-icon"),u=(0,l.g2)("ArrowDown"),c=(0,l.g2)("el-dropdown-item"),p=(0,l.g2)("el-dropdown-menu"),m=(0,l.g2)("el-dropdown"),g=(0,l.g2)("Groups");return(0,l.uX)(),(0,l.CE)(l.FK,null,[(0,l.bF)(m,null,{dropdown:(0,l.k6)((()=>[s.hasGroup?((0,l.uX)(),(0,l.Wv)(p,{key:0},{default:(0,l.k6)((()=>[((0,l.uX)(!0),(0,l.CE)(l.FK,null,(0,l.pI)(s.state.groups,(e=>((0,l.uX)(),(0,l.Wv)(c,{onClick:t=>s.handleGroupChange(e.Id)},{default:(0,l.k6)((()=>[(0,l.eW)((0,o.v_)(e.Name||"未知"),1)])),_:2},1032,["onClick"])))),256)),(0,l.bF)(c,{onClick:t[0]||(t[0]=e=>s.state.showGroups=!0)},{default:(0,l.k6)((()=>[(0,l.eW)((0,o.v_)(e.$t("status.group")),1)])),_:1})])),_:1})):(0,l.Q3)("",!0)])),default:(0,l.k6)((()=>[(0,l.Lk)("span",{class:(0,o.C4)(["el-dropdown-link",{connected:s.state.connected}])},[(0,l.bF)(d,{class:"left"},{default:(0,l.k6)((()=>[(0,l.bF)(i)])),_:1}),(0,l.Lk)("span",null,(0,o.v_)(s.state.groupName||"未知"),1),(0,l.bF)(d,{class:"right"},{default:(0,l.k6)((()=>[(0,l.bF)(u)])),_:1})],2)])),_:1}),s.state.showGroups?((0,l.uX)(),(0,l.Wv)(g,{key:0,modelValue:s.state.showGroups,"onUpdate:modelValue":t[1]||(t[1]=e=>s.state.showGroups=e)},null,8,["modelValue"])):(0,l.Q3)("",!0)],64)}var A=a(9299),U=a(1219),z=a(5931);const W={class:"group-wrap"},X=["onClick"],O=["onClick"],K=["onClick"],N={key:0},M={key:1},G={class:"flex"},j=(0,l.Lk)("span",{class:"flex-1"},null,-1);function Q(e,t,a,s,n,r){const i=(0,l.g2)("el-input"),d=(0,l.g2)("el-table-column"),u=(0,l.g2)("Sync"),c=(0,l.g2)("Delete"),p=(0,l.g2)("el-icon"),m=(0,l.g2)("el-button"),g=(0,l.g2)("el-popconfirm"),v=(0,l.g2)("Plus"),f=(0,l.g2)("el-table"),h=(0,l.g2)("el-dialog");return(0,l.uX)(),(0,l.Wv)(h,{class:"options-center",title:e.$t("status.group"),"destroy-on-close":"",modelValue:s.state.show,"onUpdate:modelValue":t[0]||(t[0]=e=>s.state.show=e),width:"77rem",top:"2vh"},{default:(0,l.k6)((()=>[(0,l.Lk)("div",W,[(0,l.bF)(f,{stripe:"",data:s.state.list,border:"",size:"small",width:"100%",height:"70vh",onCellDblclick:s.handleCellClick},{default:(0,l.k6)((()=>[(0,l.bF)(d,{prop:"Name",label:e.$t("status.groupName"),width:"100"},{default:(0,l.k6)((e=>[e.row.NameEditing?((0,l.uX)(),(0,l.Wv)(i,{key:0,autofocus:"",size:"small",modelValue:e.row.Name,"onUpdate:modelValue":t=>e.row.Name=t,onBlur:t=>s.handleEditBlur(e.row,"Name")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,l.uX)(),(0,l.CE)("a",{key:1,href:"javascript:;",class:"a-line",onClick:t=>s.handleEdit(e.row,"Name")},(0,o.v_)(e.row.Name||"未知"),9,X))])),_:1},8,["label"]),(0,l.bF)(d,{prop:"Id",label:"Id"},{default:(0,l.k6)((e=>[e.row.IdEditing?((0,l.uX)(),(0,l.Wv)(i,{key:0,autofocus:"",size:"small",modelValue:e.row.Id,"onUpdate:modelValue":t=>e.row.Id=t,onBlur:t=>s.handleEditBlur(e.row,"Id")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,l.uX)(),(0,l.CE)("a",{key:1,href:"javascript:;",class:"a-line",onClick:t=>s.handleEdit(e.row,"Id")},(0,o.v_)(e.row.Id),9,O))])),_:1}),(0,l.bF)(d,{prop:"Password",label:e.$t("status.groupPassword")},{default:(0,l.k6)((e=>[e.row.PasswordEditing?((0,l.uX)(),(0,l.Wv)(i,{key:0,type:"password","show-password":"",size:"small",modelValue:e.row.Password,"onUpdate:modelValue":t=>e.row.Password=t,onBlur:t=>s.handleEditBlur(e.row,"Password")},null,8,["modelValue","onUpdate:modelValue","onBlur"])):((0,l.uX)(),(0,l.CE)("a",{key:1,href:"javascript:;",class:"a-line",onClick:t=>s.handleEdit(e.row,"Password")},[s.globalData.isPhone?((0,l.uX)(),(0,l.CE)("span",N,"***")):((0,l.uX)(),(0,l.CE)("span",M,(0,o.v_)(e.row.Password.replace(/.{1}/g,"*")),1))],8,K))])),_:1},8,["label"]),(0,l.bF)(d,{prop:"Oper",label:e.$t("status.groupOper"),width:"110",fixed:"right"},{header:(0,l.k6)((()=>[(0,l.Lk)("div",G,[(0,l.Lk)("strong",null,(0,o.v_)(e.$t("status.groupOper")),1),j,(0,l.bF)(u,{name:"GroupSecretKey"})])])),default:(0,l.k6)((t=>[(0,l.Lk)("div",null,[(0,l.bF)(g,{title:e.$t("status.groupDelConfirm"),onConfirm:e=>s.handleDel(t.$index)},{reference:(0,l.k6)((()=>[(0,l.bF)(m,{type:"danger",size:"small"},{default:(0,l.k6)((()=>[(0,l.bF)(p,null,{default:(0,l.k6)((()=>[(0,l.bF)(c)])),_:1})])),_:1})])),_:2},1032,["title","onConfirm"]),(0,l.bF)(m,{size:"small",onClick:e=>s.handleAdd(t.$index)},{default:(0,l.k6)((()=>[(0,l.bF)(p,null,{default:(0,l.k6)((()=>[(0,l.bF)(v)])),_:1})])),_:2},1032,["onClick"])])])),_:1},8,["label"])])),_:1},8,["data","onCellDblclick"])])])),_:1},8,["title","modelValue"])}var Y=a(8734),q={props:["modelValue"],emits:["update:modelValue"],components:{Delete:$.epd,Plus:$.FWt,Select:$.l6P,Sync:Y.A},setup(e,{emit:t}){const{t:a}=(0,z.s9)(),o=(0,F.B)(),s=(0,C.Kh)({list:o.value.config.Client.Groups,show:!0});(0,l.wB)((()=>o.value.config.Client.Groups),(()=>{0==s.list.filter((e=>e["__editing"])).length&&(s.list=o.value.config.Client.Groups)})),(0,l.wB)((()=>s.show),(e=>{e||setTimeout((()=>{t("update:modelValue",e)}),300)}));const n=(e,t)=>{r(e,t.property)},r=(e,t)=>{s.list.forEach((e=>{e["NameEditing"]=!1,e["IdEditing"]=!1,e["PasswordEditing"]=!1})),e[`${t}Editing`]=!0,e["__editing"]=!0},i=(e,t)=>{e[`${t}Editing`]=!1,e["__editing"]=!1,p()},d=e=>{s.list.splice(e,1),p()},u=e=>{s.list.filter((e=>""==e.Id||""==e.Name)).length>0?U.nk.error(a("status.groupValidate")):(s.list.splice(e+1,0,{Name:"",Id:"",Password:""}),p())},c=e=>{const t=s.list.slice(),l=t[e];t[e]=t[0],t[0]=l,(0,A.rd)({name:o.value.config.Client.Name,groups:t}).then((()=>{U.nk.success(a("common.oper")),setTimeout((()=>{window.location.reload()}),1e3)})).catch((e=>{console.log(e),U.nk.error(a("common.operFail"))}))},p=()=>{(0,A.zp)(s.list).then((()=>{U.nk.success(a("common.oper"))})).catch((e=>{console.log(e),U.nk.error(a("common.operFail"))}))};return{globalData:o,state:s,handleCellClick:n,handleEditBlur:i,handleEdit:r,handleDel:d,handleAdd:u,handleUse:c}}};const Z=(0,T.A)(q,[["render",Q]]);var H=Z,J={components:{ArrowDown:$.yd$,Avatar:$.euF,Groups:H},props:["config"],setup(e){const{t:t}=(0,z.s9)(),a=(0,F.B)(),o=(0,l.EW)((()=>a.value.hasAccess("Group"))),s=(0,C.Kh)({loading:!1,connected:(0,l.EW)((()=>a.value.signin.Connected)),groupName:(0,l.EW)((()=>a.value.config.Client.Group.Name)),groups:(0,l.EW)((()=>a.value.config.Client.Groups)),showGroups:!1}),n=e=>{const t=a.value.config.Client.Groups,l=t.map(((e,t)=>(e.$index=t,e))).filter((t=>t.Id==e))[0].$index,o=t[l];t[l]=t[0],t[0]=o,r(t)},r=e=>{s.loading=!0,(0,A.rd)({Name:a.value.config.Client.Name,Groups:e}).then((()=>{s.loading=!1,s.show=!1,U.nk.success(t("common.oper")),setTimeout((()=>{window.location.reload()}),1e3)})).catch((e=>{console.log(e),s.loading=!1,U.nk.error(t("common.operFail"))}))};return{config:e.config,hasGroup:o,state:s,handleGroupChange:n}}};const ee=(0,T.A)(J,[["render",R],["__scopeId","data-v-33467232"]]);var te=ee;const ae={key:0,class:"flow-wrap"},le=["title"],oe=["title"],se=["title"],ne=["title"];function re(e,t,a,s,n,r){const i=(0,l.g2)("el-table-column"),d=(0,l.g2)("el-button"),u=(0,l.g2)("el-table"),c=(0,l.g2)("el-dialog"),p=(0,l.g2)("ServerFlowMessenger"),m=(0,l.g2)("ServerFlowSForward"),g=(0,l.g2)("ServerFlowRelay"),v=(0,l.g2)("OnlineMap"),f=(0,l.g2)("OnlineAllMap");return(0,l.uX)(),(0,l.CE)(l.FK,null,[s.config?((0,l.uX)(),(0,l.CE)("div",ae,[(0,l.Lk)("p",null,[(0,l.eW)((0,o.v_)(e.$t("status.flowOnline"))+" ",1),(0,l.Lk)("a",{href:"javascript:;",onClick:t[0]||(t[0]=e=>s.state.showMap=!0),title:`${e.$t("status.flowThisServer")}\r\n${e.$t("status.flowOnline")}/${e.$t("status.flowOnline7Day")}`},(0,o.v_)(s.state.overallOnline),9,le),(0,l.Lk)("a",{href:"javascript:;",onClick:t[1]||(t[1]=e=>s.state.showAllMap=!0),title:`${e.$t("status.flowAllServer")}\r\n${e.$t("status.flowOnline")}/${e.$t("status.flowOnline7Day")}/${e.$t("status.flowServer")}`},(0,o.v_)(s.state.serverOnline),9,oe)]),(0,l.Lk)("p",null,[(0,l.eW)((0,o.v_)(e.$t("status.flowUpload"))+" ",1),(0,l.Lk)("a",{href:"javascript:;",title:`${e.$t("status.flowThisServer")}\r\n${e.$t("status.flowAllSend")}`,onClick:t[2]||(t[2]=(...e)=>s.handleShow&&s.handleShow(...e))},(0,o.v_)(s.state.overallSendtSpeed)+"/s",9,se)]),(0,l.Lk)("p",null,[(0,l.eW)((0,o.v_)(e.$t("status.flowDownload"))+" ",1),(0,l.Lk)("a",{href:"javascript:;",title:`${e.$t("status.flowThisServer")}\r\n${e.$t("status.flowAllReceive")}`,onClick:t[3]||(t[3]=(...e)=>s.handleShow&&s.handleShow(...e))},(0,o.v_)(s.state.overallReceiveSpeed)+"/s",9,ne)])])):(0,l.Q3)("",!0),(0,l.bF)(c,{title:s.state.time,"destroy-on-close":"",modelValue:s.state.show,"onUpdate:modelValue":t[4]||(t[4]=e=>s.state.show=e),width:"640"},{default:(0,l.k6)((()=>[(0,l.Lk)("div",null,[(0,l.bF)(u,{data:s.state.list,border:"",size:"small",width:"100%"},{default:(0,l.k6)((()=>[(0,l.bF)(i,{prop:"text",label:e.$t("status.flowType")},null,8,["label"]),(0,l.bF)(i,{prop:"sendtBytes",label:e.$t("status.flowUpload"),sortable:""},{default:(0,l.k6)((e=>[(0,l.Lk)("span",null,(0,o.v_)(e.row.sendtBytesText),1)])),_:1},8,["label"]),(0,l.bF)(i,{prop:"sendtSpeed",label:e.$t("status.flowUpload"),sortable:""},{default:(0,l.k6)((e=>[(0,l.Lk)("span",null,(0,o.v_)(e.row.sendtSpeedText)+"/s",1)])),_:1},8,["label"]),(0,l.bF)(i,{prop:"receiveBytes",label:e.$t("status.flowDownload"),sortable:""},{default:(0,l.k6)((e=>[(0,l.Lk)("span",null,(0,o.v_)(e.row.receiveBytesText),1)])),_:1},8,["label"]),(0,l.bF)(i,{prop:"receiveSpeed",label:e.$t("status.flowDownload"),sortable:""},{default:(0,l.k6)((e=>[(0,l.Lk)("span",null,(0,o.v_)(e.row.receiveSpeedText)+"/s",1)])),_:1},8,["label"]),(0,l.bF)(i,{prop:"oper",label:e.$t("status.flowOper"),width:"70"},{default:(0,l.k6)((t=>[t.row.detail?((0,l.uX)(),(0,l.Wv)(d,{key:0,size:"small",onClick:e=>s.handleShowDetail(t.row.id)},{default:(0,l.k6)((()=>[(0,l.eW)((0,o.v_)(e.$t("status.flowDetail")),1)])),_:2},1032,["onClick"])):(0,l.Q3)("",!0)])),_:1},8,["label"])])),_:1},8,["data"])])])),_:1},8,["title","modelValue"]),s.state.details.Messenger?((0,l.uX)(),(0,l.Wv)(p,{key:1,config:s.config,modelValue:s.state.details.Messenger,"onUpdate:modelValue":t[5]||(t[5]=e=>s.state.details.Messenger=e)},null,8,["config","modelValue"])):(0,l.Q3)("",!0),s.state.details.SForward?((0,l.uX)(),(0,l.Wv)(m,{key:2,config:s.config,modelValue:s.state.details.SForward,"onUpdate:modelValue":t[6]||(t[6]=e=>s.state.details.SForward=e)},null,8,["config","modelValue"])):(0,l.Q3)("",!0),s.state.details.Relay?((0,l.uX)(),(0,l.Wv)(g,{key:3,config:s.config,modelValue:s.state.details.Relay,"onUpdate:modelValue":t[7]||(t[7]=e=>s.state.details.Relay=e)},null,8,["config","modelValue"])):(0,l.Q3)("",!0),s.state.showMap?((0,l.uX)(),(0,l.Wv)(v,{key:4,config:s.config,modelValue:s.state.showMap,"onUpdate:modelValue":t[8]||(t[8]=e=>s.state.showMap=e)},null,8,["config","modelValue"])):(0,l.Q3)("",!0),s.state.showAllMap?((0,l.uX)(),(0,l.Wv)(f,{key:5,config:s.config,modelValue:s.state.showAllMap,"onUpdate:modelValue":t[9]||(t[9]=e=>s.state.showAllMap=e)},null,8,["config","modelValue"])):(0,l.Q3)("",!0)],64)}a(4114);var ie=a(4921);function de(e,t,a,s,n,r){const i=(0,l.g2)("el-table-column"),d=(0,l.g2)("el-table"),u=(0,l.g2)("el-dialog");return(0,l.uX)(),(0,l.Wv)(u,{title:e.$t("status.flowMessenger"),class:"options-center",top:"1vh","destroy-on-close":"",modelValue:s.state.show,"onUpdate:modelValue":t[0]||(t[0]=e=>s.state.show=e),width:"680"},{default:(0,l.k6)((()=>[(0,l.Lk)("div",null,[(0,l.bF)(d,{data:s.state.list,stripe:"",border:"",size:"small",width:"100%",height:"60vh"},{default:(0,l.k6)((()=>[(0,l.bF)(i,{prop:"id",label:"id",width:"200"}),(0,l.bF)(i,{prop:"sendtBytes",label:e.$t("status.flowUpload"),sortable:""},{default:(0,l.k6)((e=>[(0,l.Lk)("span",null,(0,o.v_)(e.row.sendtBytesText),1)])),_:1},8,["label"]),(0,l.bF)(i,{prop:"sendtSpeed",label:e.$t("status.flowUpload"),sortable:""},{default:(0,l.k6)((e=>[(0,l.Lk)("span",null,(0,o.v_)(e.row.sendtSpeedText)+"/s",1)])),_:1},8,["label"]),(0,l.bF)(i,{prop:"receiveBytes",label:e.$t("status.flowDownload"),sortable:""},{default:(0,l.k6)((e=>[(0,l.Lk)("span",null,(0,o.v_)(e.row.receiveBytesText),1)])),_:1},8,["label"]),(0,l.bF)(i,{prop:"receiveSpeed",label:e.$t("status.flowDownload"),sortable:""},{default:(0,l.k6)((e=>[(0,l.Lk)("span",null,(0,o.v_)(e.row.receiveSpeedText)+"/s",1)])),_:1},8,["label"])])),_:1},8,["data"])])])),_:1},8,["title","modelValue"])}var ue={props:["modelValue","config"],emits:["update:modelValue"],setup(e,{emit:t}){const{t:a}=(0,z.s9)(),o=(0,C.Kh)({show:!0,timer:0,list:[],old:null});(0,l.wB)((()=>o.show),(e=>{e||setTimeout((()=>{t("update:modelValue",e)}),300)}));const s=()=>{clearTimeout(o.timer),(0,ie.zq)().then((e=>{const t=o.old||e,l=[];for(let o in e){const s=e[o],r=t[o],i=`[${o}]${a(`status.messenger${o}`)||"unknown"}`;l.push({id:i,sendtBytes:s.SendtBytes,sendtBytesText:n(s.SendtBytes),sendtSpeed:s.SendtBytes-r.SendtBytes,sendtSpeedText:n(s.SendtBytes-r.SendtBytes),receiveBytes:s.ReceiveBytes,receiveBytesText:n(s.ReceiveBytes),receiveSpeed:s.ReceiveBytes-r.ReceiveBytes,receiveSpeedText:n(s.ReceiveBytes-r.ReceiveBytes)})}o.list=l.filter((e=>!!e.id)),o.old=e,o.timer=setTimeout(s,1e3)})).catch((e=>{o.timer=setTimeout(s,1e3)}))},n=e=>{let t=0;while(e>=1024)e/=1024,t++;return`${e.toFixed(2)}${["B","KB","MB","GB","TB"][t]}`};return(0,l.sV)((()=>{s()})),(0,l.hi)((()=>{clearTimeout(o.timer)})),{config:e.config,state:o}}};const ce=(0,T.A)(ue,[["render",de],["__scopeId","data-v-80718c08"]]);var pe=ce;const me={class:"head"},ge={class:"page t-c"},ve={class:"page-wrap"};function fe(e,t,a,s,n,r){const i=(0,l.g2)("el-input"),d=(0,l.g2)("el-table-column"),u=(0,l.g2)("el-table"),c=(0,l.g2)("el-pagination"),p=(0,l.g2)("el-dialog");return(0,l.uX)(),(0,l.Wv)(p,{title:e.$t("status.flowServerForward"),class:"options-center",top:"1vh","destroy-on-close":"",modelValue:s.state.show,"onUpdate:modelValue":t[1]||(t[1]=e=>s.state.show=e),width:"680"},{default:(0,l.k6)((()=>[(0,l.Lk)("div",null,[(0,l.Lk)("div",me,[(0,l.bF)(i,{modelValue:s.state.page.Key,"onUpdate:modelValue":t[0]||(t[0]=e=>s.state.page.Key=e),placeholder:e.$t("status.flowSearchDomainPort")},null,8,["modelValue","placeholder"])]),(0,l.bF)(u,{data:s.state.list,stripe:"",border:"",size:"small",width:"100%",height:"60vh",onSortChange:s.handleSort},{default:(0,l.k6)((()=>[(0,l.bF)(d,{prop:"Key",label:e.$t("status.flowSearchDomainPort"),width:"200"},null,8,["label"]),(0,l.bF)(d,{prop:"SendtBytes",label:e.$t("status.flowUpload"),sortable:"custom"},{default:(0,l.k6)((e=>[(0,l.Lk)("span",null,(0,o.v_)(e.row.SendtBytesText),1)])),_:1},8,["label"]),(0,l.bF)(d,{prop:"DiffSendtBytes",label:e.$t("status.flowUpload"),sortable:"custom"},{default:(0,l.k6)((e=>[(0,l.Lk)("span",null,(0,o.v_)(e.row.DiffSendtBytesText)+"/s",1)])),_:1},8,["label"]),(0,l.bF)(d,{prop:"ReceiveBytes",label:e.$t("status.flowDownload"),sortable:"custom"},{default:(0,l.k6)((e=>[(0,l.Lk)("span",null,(0,o.v_)(e.row.ReceiveBytesText),1)])),_:1},8,["label"]),(0,l.bF)(d,{prop:"DiffReceiveBytes",label:e.$t("status.flowDownload"),sortable:"custom"},{default:(0,l.k6)((e=>[(0,l.Lk)("span",null,(0,o.v_)(e.row.DiffReceiveBytesText)+"/s",1)])),_:1},8,["label"])])),_:1},8,["data","onSortChange"]),(0,l.Lk)("div",ge,[(0,l.Lk)("div",ve,[(0,l.bF)(c,{small:"",background:"",layout:"total,prev,pager, next",total:s.state.page.Count,"page-size":s.state.page.PageSize,"current-page":s.state.page.Page,onCurrentChange:s.handlePageChange},null,8,["total","page-size","current-page","onCurrentChange"])])])])])),_:1},8,["title","modelValue"])}var he={props:["modelValue","config"],emits:["update:modelValue"],setup(e,{emit:t}){const a=(0,C.Kh)({show:!0,timer:0,list:[],page:{Key:"",Page:1,PageSize:15,Count:0,Order:1,OrderType:0}});(0,l.wB)((()=>a.show),(e=>{e||setTimeout((()=>{t("update:modelValue",e)}),300)}));const o=()=>{clearTimeout(a.timer),(0,ie.mb)({Key:a.page.Key,Page:a.page.Page,PageSize:a.page.PageSize,Order:a.page.Order,OrderType:a.page.OrderType}).then((e=>{try{a.page.Page=e.Page,a.page.PageSize=e.PageSize,a.page.Count=e.Count;const t=[];for(let a=0;a{a.timer=setTimeout(o,1e3)}))},s=e=>{let t=0;while(e>=1024)e/=1024,t++;return`${e.toFixed(2)}${["B","KB","MB","GB","TB"][t]}`},n=e=>{e&&(a.page.Page=e)},r=e=>{const t={ascending:1,descending:0}[e.order],l={SendtBytes:1,DiffSendtBytes:2,ReceiveBytes:3,DiffReceiveBytes:4}[e.prop];a.page.Order=l,a.page.OrderType=t};return(0,l.sV)((()=>{o()})),(0,l.hi)((()=>{clearTimeout(a.timer)})),{config:e.config,state:a,handlePageChange:n,handleSort:r}}};const we=(0,T.A)(he,[["render",fe],["__scopeId","data-v-f73b7458"]]);var ke=we;const ye={class:"head"},be={class:"page t-c"},Se={class:"page-wrap"};function Ce(e,t,a,s,n,r){const i=(0,l.g2)("el-input"),d=(0,l.g2)("el-table-column"),u=(0,l.g2)("el-table"),c=(0,l.g2)("el-pagination"),p=(0,l.g2)("el-dialog");return(0,l.uX)(),(0,l.Wv)(p,{title:e.$t("status.flowRelay"),class:"options-center",top:"1vh","destroy-on-close":"",modelValue:s.state.show,"onUpdate:modelValue":t[1]||(t[1]=e=>s.state.show=e),width:"680"},{default:(0,l.k6)((()=>[(0,l.Lk)("div",null,[(0,l.Lk)("div",ye,[(0,l.bF)(i,{modelValue:s.state.page.Key,"onUpdate:modelValue":t[0]||(t[0]=e=>s.state.page.Key=e),placeholder:"名字搜索"},null,8,["modelValue"])]),(0,l.bF)(u,{data:s.state.list,stripe:"",border:"",size:"small",width:"100%",height:"60vh",onSortChange:s.handleSort},{default:(0,l.k6)((()=>[(0,l.bF)(d,{prop:"FromName",label:e.$t("status.flowRelaySource"),width:"120"},null,8,["label"]),(0,l.bF)(d,{prop:"ToName",label:e.$t("status.flowRelayTarget"),width:"120"},null,8,["label"]),(0,l.bF)(d,{prop:"SendtBytes",label:e.$t("status.flowUpload"),sortable:"custom"},{default:(0,l.k6)((e=>[(0,l.Lk)("span",null,(0,o.v_)(e.row.SendtBytesText),1)])),_:1},8,["label"]),(0,l.bF)(d,{prop:"DiffSendtBytes",label:e.$t("status.flowUpload"),sortable:"custom"},{default:(0,l.k6)((e=>[(0,l.Lk)("span",null,(0,o.v_)(e.row.DiffSendtBytesText)+"/s",1)])),_:1},8,["label"]),(0,l.bF)(d,{prop:"ReceiveBytes",label:e.$t("status.flowDownload"),sortable:"custom"},{default:(0,l.k6)((e=>[(0,l.Lk)("span",null,(0,o.v_)(e.row.ReceiveBytesText),1)])),_:1},8,["label"]),(0,l.bF)(d,{prop:"DiffReceiveBytes",label:e.$t("status.flowDownload"),sortable:"custom"},{default:(0,l.k6)((e=>[(0,l.Lk)("span",null,(0,o.v_)(e.row.DiffReceiveBytesText)+"/s",1)])),_:1},8,["label"])])),_:1},8,["data","onSortChange"]),(0,l.Lk)("div",be,[(0,l.Lk)("div",Se,[(0,l.bF)(c,{small:"",background:"",layout:"total,prev,pager, next",total:s.state.page.Count,"page-size":s.state.page.PageSize,"current-page":s.state.page.Page,onCurrentChange:s.handlePageChange},null,8,["total","page-size","current-page","onCurrentChange"])])])])])),_:1},8,["title","modelValue"])}var _e={props:["modelValue","config"],emits:["update:modelValue"],setup(e,{emit:t}){const a=(0,C.Kh)({show:!0,timer:0,list:[],page:{Key:"",Page:1,PageSize:15,Count:0,Order:1,OrderType:0}});(0,l.wB)((()=>a.show),(e=>{e||setTimeout((()=>{t("update:modelValue",e)}),300)}));const o=()=>{clearTimeout(a.timer),(0,ie.xy)({Key:a.page.Key,Page:a.page.Page,PageSize:a.page.PageSize,Order:a.page.Order,OrderType:a.page.OrderType}).then((e=>{try{a.page.Page=e.Page,a.page.PageSize=e.PageSize,a.page.Count=e.Count;const t=[];for(let a=0;a{a.timer=setTimeout(o,1e3)}))},s=e=>{let t=0;while(e>=1024)e/=1024,t++;return`${e.toFixed(2)}${["B","KB","MB","GB","TB"][t]}`},n=e=>{e&&(a.page.Page=e)},r=e=>{const t={ascending:1,descending:0}[e.order],l={SendtBytes:1,DiffSendtBytes:2,ReceiveBytes:3,DiffReceiveBytes:4}[e.prop];a.page.Order=l,a.page.OrderType=t};return(0,l.sV)((()=>{o()})),(0,l.hi)((()=>{clearTimeout(a.timer)})),{config:e.config,state:a,handlePageChange:n,handleSort:r}}};const Be=(0,T.A)(_e,[["render",Ce],["__scopeId","data-v-019c1d95"]]);var Fe=Be;const Ve=e=>((0,l.Qi)("data-v-3c0782be"),e=e(),(0,l.jt)(),e),$e=Ve((()=>(0,l.Lk)("div",{class:"map-wrap",id:"map"},null,-1)));function xe(e,t,a,o,s,n){const r=(0,l.g2)("el-dialog");return(0,l.uX)(),(0,l.Wv)(r,{class:"options-center",title:e.$t("status.flowOnline"),"destroy-on-close":"",modelValue:o.state.show,"onUpdate:modelValue":t[0]||(t[0]=e=>o.state.show=e),width:"77rem",top:"2vh"},{default:(0,l.k6)((()=>[$e])),_:1},8,["title","modelValue"])}var Te=a(83),Le={props:["modelValue"],emits:["update:modelValue"],setup(e,{emit:t}){const{t:a}=(0,z.s9)(),o=(0,C.Kh)({show:!0});(0,l.wB)((()=>o.show),(e=>{e||setTimeout((()=>{t("update:modelValue",e)}),300)}));const s=(e,t)=>{const l=L.map("map").setView([38,105],4);L.tileLayer("https://webrd01.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}",{attribution:"linker",maxZoom:10}).addTo(l);for(let s=0;s\n ${o.MachineName}
\n ${a("status.flowArea")} : ${n.CountryCode}、${n.City}
\n ${a("status.flowNet")} : ${n.Isp}
\n \n `;new L.marker(new L.latLng([n.Lat+Math.random()/5,n.Lon+Math.random()/5]),{icon:r}).bindPopup(i,{}).on("mouseover",(function(e){this.openPopup()})).on("mouseout",(function(e){this.closePopup()})).addTo(l)}catch(o){console.log(o)}};return(0,l.sV)((()=>{(0,l.dY)((()=>{(0,Te.r7)().then((e=>{(0,A.NT)().then((t=>{s(e.List,t)})).catch((()=>{}))})).catch((()=>{}))}))})),{state:o}}};const Pe=(0,T.A)(Le,[["render",xe],["__scopeId","data-v-3c0782be"]]);var Ee=Pe;const Ie=e=>((0,l.Qi)("data-v-6f5477f6"),e=e(),(0,l.jt)(),e),De=Ie((()=>(0,l.Lk)("div",{class:"map-wrap",id:"map"},null,-1)));function Re(e,t,a,o,s,n){const r=(0,l.g2)("el-dialog");return(0,l.uX)(),(0,l.Wv)(r,{class:"options-center",title:e.$t("status.flowOnline"),"destroy-on-close":"",modelValue:o.state.show,"onUpdate:modelValue":t[0]||(t[0]=e=>o.state.show=e),width:"77rem",top:"2vh"},{default:(0,l.k6)((()=>[De])),_:1},8,["title","modelValue"])}var Ae={props:["modelValue"],emits:["update:modelValue"],setup(e,{emit:t}){const{t:a}=(0,z.s9)(),o=(0,C.Kh)({show:!0});(0,l.wB)((()=>o.show),(e=>{e||setTimeout((()=>{t("update:modelValue",e)}),300)}));const s=e=>{const t=L.map("map").setView([38,105],4);L.tileLayer("https://webrd01.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}",{attribution:"linker",maxZoom:10}).addTo(t);for(let a=0;a\n ${l.City} ${l.Count}
\n \n `;new L.marker(new L.latLng([l.Lat,l.Lon]),{icon:o}).bindPopup(s,{}).on("mouseover",(function(e){this.openPopup()})).on("mouseout",(function(e){this.closePopup()})).addTo(t)}};return(0,l.sV)((()=>{(0,l.dY)((()=>{(0,ie.B8)().then((e=>{s(e)})).catch((()=>{}))}))})),{state:o}}};const Ue=(0,T.A)(Ae,[["render",Re],["__scopeId","data-v-6f5477f6"]]);var ze=Ue,We={props:["config"],components:{ServerFlowMessenger:pe,ServerFlowSForward:ke,ServerFlowRelay:Fe,OnlineMap:Ee,OnlineAllMap:ze},setup(e){const{t:t}=(0,z.s9)(),a=(0,F.B)(),o=(0,l.EW)((()=>a.value.hasAccess("SForwardFlow"))),s=(0,l.EW)((()=>a.value.hasAccess("RelayFlow"))),n=(0,l.EW)((()=>a.value.hasAccess("SigninFlow"))),r=(0,C.Kh)({show:!1,timer:0,overallSendtSpeed:"0000.00KB",overallReceiveSpeed:"0000.00KB",overallOnline:"0/0",serverOnline:"",time:"",list:[],old:null,details:{Messenger:!1,SForward:!1,Relay:!1},showMap:!1,showAllMap:!1}),i=()=>{r.show=!0},d=e=>{r.details[e]=!0},u={External:{text:t("status.flowWanPort"),detail:!1},RelayReport:{text:t("status.flowRelayNode"),detail:!1},Relay:{text:t("status.flowRelay"),detail:s.value},Messenger:{text:t("status.flowMessenger"),detail:n.value},SForward:{text:t("status.flowServerForward"),detail:o.value},flow:{text:"",detail:!1}},c=()=>{clearTimeout(r.timer),(0,ie.Qj)().then((e=>{const t=r.old||e;if(e.Items["_"]&&(r.overallOnline=`${e.Items["_"].SendtBytes}/${e.Items["_"].ReceiveBytes}`,delete e.Items["_"]),e.Items["flow"]&&e.Items["flow"].ReceiveBytes>0){const t=(BigInt(e.Items["flow"].ReceiveBytes)>>BigInt(32)).toString(),a=(BigInt(e.Items["flow"].ReceiveBytes)&BigInt(4294967295)).toString(),l=e.Items["flow"].SendtBytes;r.serverOnline=`、${t}/${a}/${l}`,delete e.Items["flow"]}let a=0,l=0,o=0,s=0;for(let r in t.Items)a+=t.Items[r].ReceiveBytes,l+=t.Items[r].SendtBytes;for(let r in e.Items)o+=e.Items[r].ReceiveBytes,s+=e.Items[r].SendtBytes;r.overallSendtSpeed=p(s-l),r.overallReceiveSpeed=p(o-a),r.time=`${e.Start}`;const n=[];for(let r in e.Items){const a=e.Items[r],l=t.Items[r],o=u[`${r}`]||{text:`Unknow${r}`,detail:!1};n.push({id:r,text:o.text,detail:o.detail,sendtBytes:a.SendtBytes,sendtBytesText:p(a.SendtBytes),sendtSpeed:a.SendtBytes-l.SendtBytes,sendtSpeedText:p(a.SendtBytes-l.SendtBytes),receiveBytes:a.ReceiveBytes,receiveBytesText:p(a.ReceiveBytes),receiveSpeed:a.ReceiveBytes-l.ReceiveBytes,receiveSpeedText:p(a.ReceiveBytes-l.ReceiveBytes)})}r.list=n.filter((e=>!!e.id)),r.old=e,r.timer=setTimeout(c,1e3)})).catch((e=>{r.timer=setTimeout(c,1e3)}))},p=e=>{let t=0;while(e>=1024)e/=1024,t++;return`${e.toFixed(2)}${["B","KB","MB","GB","TB"][t]}`};return(0,l.sV)((()=>{c()})),(0,l.hi)((()=>{clearTimeout(r.timer)})),{hasSForwardFlow:o,config:e.config,state:r,handleShow:i,handleShowDetail:d}}};const Xe=(0,T.A)(We,[["render",re],["__scopeId","data-v-12cd5250"]]);var Oe=Xe;const Ke=["title"],Ne={key:0,class:"progress"},Me={key:1,class:"progress"};function Ge(e,t,a,s,n,r){const i=(0,l.g2)("Loading"),d=(0,l.g2)("el-icon"),u=(0,l.g2)("Download"),c=(0,l.g2)("CircleCheck");return(0,l.uX)(),(0,l.CE)("a",{href:"javascript:;",onClick:t[0]||(t[0]=(...e)=>s.handleUpdate&&s.handleUpdate(...e)),class:(0,o.C4)(["download",s.updateColor()]),title:s.updateText()},[(0,l.Lk)("span",null,(0,o.v_)(s.state.version),1),s.updaterServer.Version?((0,l.uX)(),(0,l.CE)(l.FK,{key:0},[1==s.updaterServer.Status?((0,l.uX)(),(0,l.Wv)(d,{key:0,size:"14",class:"loading"},{default:(0,l.k6)((()=>[(0,l.bF)(i)])),_:1})):2==s.updaterServer.Status?((0,l.uX)(),(0,l.Wv)(d,{key:1,size:"14"},{default:(0,l.k6)((()=>[(0,l.bF)(u)])),_:1})):3==s.updaterServer.Status||5==s.updaterServer.Status?((0,l.uX)(),(0,l.CE)(l.FK,{key:2},[(0,l.bF)(d,{size:"14",class:"loading"},{default:(0,l.k6)((()=>[(0,l.bF)(i)])),_:1}),0==s.updaterServer.Length?((0,l.uX)(),(0,l.CE)("span",Ne,"0%")):((0,l.uX)(),(0,l.CE)("span",Me,(0,o.v_)(parseInt(s.updaterServer.Current/s.updaterServer.Length*100))+"%",1))],64)):6==s.updaterServer.Status?((0,l.uX)(),(0,l.Wv)(d,{key:3,size:"14",class:"yellow"},{default:(0,l.k6)((()=>[(0,l.bF)(c)])),_:1})):(0,l.Q3)("",!0)],64)):((0,l.uX)(),(0,l.Wv)(d,{key:1,size:"14"},{default:(0,l.k6)((()=>[(0,l.bF)(u)])),_:1}))],10,Ke)}var je=a(2933),Qe=a(920),Ye={components:{Promotion:$.Yk4,Download:$.f5X,Loading:$.Rhj,CircleCheck:$.rW7,ServerFlow:Oe},props:["config"],setup(e){const{t:t}=(0,z.s9)(),a=(0,F.B)(),o=(0,l.EW)((()=>a.value.hasAccess("UpdateServer"))),s=(0,C.KR)({Version:"",Status:0,Length:0,Current:0,Msg:[],DateTime:""}),n=(0,C.Kh)({show:!1,loading:!1,connected:(0,l.EW)((()=>a.value.signin.Connected)),version:(0,l.EW)((()=>a.value.signin.Version)),timer:0}),r=()=>{clearTimeout(n.timer),(0,Qe.BJ)().then((e=>{s.value.Version=e.Version,s.value.Status=e.Status,s.value.Length=e.Length,s.value.Current=e.Current,s.value.Status>2&&s.value.Status<6&&(n.timer=setTimeout((()=>{r()}),1e3))})).catch((()=>{n.timer=setTimeout((()=>{r()}),1e3)}))},i=()=>s.value.Version?s.value.Status<=2?n.version!=s.value.Version?`${t("status.serverNotNew")}(${s.value.Version})`:`${t("status.serverNew")}`:{3:t("status.serverDownloading"),4:t("status.serverDownloaded"),5:t("status.serverUnZipIng"),6:t("status.serverUnZip")}[s.value.Status]:t("status.serverNoUpdate"),d=()=>n.version!=s.value.Version?"yellow":"green",u=()=>{e.config&&o.value&&([0,1,3,5].indexOf(s.value.Status)>=0?U.nk.error(t("common.operating")):6!=s.value.Status?2==s.value.Status&&je.s.confirm(t("status.serverConfirm"),t("common.tips"),{confirmButtonText:t("common.confirm"),cancelButtonText:t("common.cancel"),type:"warning"}).then((()=>{(0,Qe.y2)(s.value.Version||a.value.signin.Version).then((()=>{setTimeout((()=>{r()}),1e3)}))})).catch((()=>{})):je.s.confirm(t("status.serverCloseConfirm"),t("common.tips"),{confirmButtonText:t("common.confirm"),cancelButtonText:t("common.cancel"),type:"warning"}).then((()=>{(0,Qe.aP)()})).catch((()=>{})))};return(0,l.sV)((()=>{r()})),{config:e.config,state:n,updaterServer:s,handleUpdate:u,updateText:i,updateColor:d}}};const qe=(0,T.A)(Ye,[["render",Ge],["__scopeId","data-v-6baf133f"]]);var Ze=qe,He={components:{ServerConfig:te,ServerFlow:Oe,ServerVersion:Ze},props:["config"],setup(e){const t=(0,F.B)(),a=(0,l.EW)((()=>t.value.hasAccess("Flow"))),o=(0,C.Kh)({show:!1,loading:!1});return{config:e.config,hasFlow:a,state:o}}};const Je=(0,T.A)(He,[["render",D],["__scopeId","data-v-2d85a782"]]);var et=Je;const tt={key:0,class:"status-export-wrap"},at=["title"],lt={class:"port-wrap"},ot={class:"text"},st={class:"body"},nt={class:"card-header"},rt={class:"flex"},it={style:{"margin-left":"2rem"}},dt={class:"port-wrap"},ut={class:"port-wrap"},ct={style:{"margin-top":"1rem"}};function pt(e,t,a,s,n,r){const i=(0,l.g2)("Share"),d=(0,l.g2)("el-icon"),u=(0,l.g2)("el-checkbox"),c=(0,l.g2)("el-input"),p=(0,l.g2)("el-col"),m=(0,l.g2)("el-row"),g=(0,l.g2)("Access"),v=(0,l.g2)("el-card"),f=(0,l.g2)("el-button"),h=(0,l.g2)("el-dialog");return s.config&&s.hasExport?((0,l.uX)(),(0,l.CE)("div",tt,[(0,l.Lk)("a",{href:"javascript:;",title:e.$t("status.export"),onClick:t[0]||(t[0]=e=>s.state.show=!0)},[(0,l.bF)(d,{size:"16"},{default:(0,l.k6)((()=>[(0,l.bF)(i)])),_:1}),(0,l.Lk)("span",null,(0,o.v_)(e.$t("status.export")),1)],8,at),(0,l.bF)(h,{class:"options-center",title:e.$t("status.export"),"destroy-on-close":"",modelValue:s.state.show,"onUpdate:modelValue":t[11]||(t[11]=e=>s.state.show=e),center:"",width:"580",top:"1vh"},{footer:(0,l.k6)((()=>[(0,l.bF)(f,{plain:"",onClick:t[10]||(t[10]=e=>s.state.show=!1),loading:s.state.loading},{default:(0,l.k6)((()=>[(0,l.eW)((0,o.v_)(e.$t("common.cancel")),1)])),_:1},8,["loading"]),(0,l.bF)(f,{type:"default",plain:"",onClick:s.handleExport,loading:s.state.loading},{default:(0,l.k6)((()=>[(0,l.eW)((0,o.v_)(e.$t("status.exportDownload")),1)])),_:1},8,["onClick","loading"]),(0,l.bF)(f,{type:"info",plain:"",onClick:s.handleCopy,loading:s.state.loading},{default:(0,l.k6)((()=>[(0,l.eW)((0,o.v_)(e.$t("status.exportCopy")),1)])),_:1},8,["onClick","loading"]),(0,l.bF)(f,{type:"success",plain:"",onClick:s.handleSave,loading:s.state.loading},{default:(0,l.k6)((()=>[(0,l.eW)((0,o.v_)(e.$t("status.exportSave")),1)])),_:1},8,["onClick","loading"])])),default:(0,l.k6)((()=>[(0,l.Lk)("div",lt,[(0,l.Lk)("div",ot,(0,o.v_)(e.$t("status.exportText")),1),(0,l.Lk)("div",st,[(0,l.bF)(v,{shadow:"never"},{header:(0,l.k6)((()=>[(0,l.Lk)("div",nt,[(0,l.Lk)("div",rt,[(0,l.Lk)("div",null,[(0,l.bF)(u,{disabled:s.onlyNode,modelValue:s.state.single,"onUpdate:modelValue":t[1]||(t[1]=e=>s.state.single=e),label:e.$t("status.exportSingle")},null,8,["disabled","modelValue","label"])]),(0,l.Lk)("div",it,[(0,l.Lk)("span",null,(0,o.v_)(e.$t("status.exportName"))+" : ",1),(0,l.bF)(c,{disabled:!s.state.single,modelValue:s.state.name,"onUpdate:modelValue":t[2]||(t[2]=e=>s.state.name=e),maxlength:"32","show-word-limit":"",style:{width:"15rem"}},null,8,["disabled","modelValue"])]),(0,l.Lk)("div",null,[(0,l.Lk)("span",null,(0,o.v_)(e.$t("status.exportApiPassword"))+" : ",1),(0,l.bF)(c,{type:"password","show-password":"",disabled:s.onlyNode,modelValue:s.state.apipassword,"onUpdate:modelValue":t[3]||(t[3]=e=>s.state.apipassword=e),maxlength:"36","show-word-limit":"",style:{width:"15rem"}},null,8,["disabled","modelValue"])])]),(0,l.Lk)("div",null,[(0,l.bF)(m,null,{default:(0,l.k6)((()=>[(0,l.bF)(p,{span:8},{default:(0,l.k6)((()=>[(0,l.bF)(u,{modelValue:s.state.relay,"onUpdate:modelValue":t[4]||(t[4]=e=>s.state.relay=e),label:e.$t("status.exportRelay")},null,8,["modelValue","label"])])),_:1}),(0,l.bF)(p,{span:8},{default:(0,l.k6)((()=>[(0,l.bF)(u,{modelValue:s.state.sforward,"onUpdate:modelValue":t[5]||(t[5]=e=>s.state.sforward=e),label:e.$t("status.exportSForward")},null,8,["modelValue","label"])])),_:1}),(0,l.bF)(p,{span:8},{default:(0,l.k6)((()=>[(0,l.bF)(u,{modelValue:s.state.updater,"onUpdate:modelValue":t[6]||(t[6]=e=>s.state.updater=e),label:e.$t("status.exportUpdater")},null,8,["modelValue","label"])])),_:1})])),_:1})]),(0,l.Lk)("div",null,[(0,l.bF)(m,null,{default:(0,l.k6)((()=>[(0,l.bF)(p,{span:8},{default:(0,l.k6)((()=>[(0,l.bF)(u,{modelValue:s.state.server,"onUpdate:modelValue":t[7]||(t[7]=e=>s.state.server=e),label:e.$t("status.exportServer")},null,8,["modelValue","label"])])),_:1}),(0,l.bF)(p,{span:8},{default:(0,l.k6)((()=>[(0,l.bF)(u,{modelValue:s.state.group,"onUpdate:modelValue":t[8]||(t[8]=e=>s.state.group=e),label:e.$t("status.exportGroup")},null,8,["modelValue","label"])])),_:1}),(0,l.bF)(p,{span:8},{default:(0,l.k6)((()=>[(0,l.bF)(u,{modelValue:s.state.tunnel,"onUpdate:modelValue":t[9]||(t[9]=e=>s.state.tunnel=e),label:e.$t("status.exportTunnel")},null,8,["modelValue","label"])])),_:1})])),_:1})])])])),default:(0,l.k6)((()=>[(0,l.bF)(g,{ref:"accessDom",machineid:s.machineId},null,8,["machineid"])])),_:1})])])])),_:1},8,["title","modelValue"]),(0,l.bF)(h,{class:"options-center",title:e.$t("status.export"),"destroy-on-close":"",modelValue:s.state.showCopy,"onUpdate:modelValue":t[13]||(t[13]=e=>s.state.showCopy=e),center:"",width:"580",top:"1vh"},{footer:(0,l.k6)((()=>[(0,l.bF)(f,{plain:"",onClick:s.copyToClipboard},{default:(0,l.k6)((()=>[(0,l.eW)((0,o.v_)(e.$t("status.exportCopy")),1)])),_:1},8,["onClick"])])),default:(0,l.k6)((()=>[(0,l.Lk)("div",dt,[(0,l.bF)(c,{modelValue:s.state.copyContent,"onUpdate:modelValue":t[12]||(t[12]=e=>s.state.copyContent=e),type:"textarea",rows:10,resize:"none",readonly:""},null,8,["modelValue"])])])),_:1},8,["title","modelValue"]),(0,l.bF)(h,{class:"options-center",title:e.$t("status.export"),"destroy-on-close":"",modelValue:s.state.showSave,"onUpdate:modelValue":t[16]||(t[16]=e=>s.state.showSave=e),center:"",width:"300",top:"1vh"},{footer:(0,l.k6)((()=>[(0,l.bF)(f,{plain:"",onClick:s.copySaveToClipboard},{default:(0,l.k6)((()=>[(0,l.eW)((0,o.v_)(e.$t("status.exportCopy")),1)])),_:1},8,["onClick"])])),default:(0,l.k6)((()=>[(0,l.Lk)("div",ut,[(0,l.Lk)("div",null,[(0,l.bF)(c,{modelValue:s.state.saveServer,"onUpdate:modelValue":t[14]||(t[14]=e=>s.state.saveServer=e),readonly:""},null,8,["modelValue"])]),(0,l.Lk)("div",ct,[(0,l.bF)(c,{modelValue:s.state.saveContent,"onUpdate:modelValue":t[15]||(t[15]=e=>s.state.saveContent=e),readonly:""},null,8,["modelValue"])])])])),_:1},8,["title","modelValue"])])):(0,l.Q3)("",!0)}var mt=a(8835),gt=a(6206),vt={components:{Share:$.SYj,Access:gt.A},props:["config"],setup(e){const{t:t}=(0,z.s9)(),a=(0,F.B)(),o=(0,l.EW)((()=>a.value.hasAccess("Export"))),s=(0,l.EW)((()=>a.value.config.Client.OnlyNode)),n=(0,l.EW)((()=>a.value.config.Client.Id)),r=(0,C.Kh)({show:!1,loading:!1,single:!0,name:"",apipassword:s.value?a.value.config.Client.CApi.ApiPassword:"",relay:!0,sforward:!0,updater:!0,server:!0,group:!0,tunnel:!0,copyContent:"",showCopy:!1,saveServer:a.value.config.Client.Server.Host,saveContent:"",showSave:!1}),i=(0,C.KR)(null),d=()=>{if(!o.value)return;const e={access:i.value.getValue(),single:r.single,name:r.name,apipassword:r.apipassword,relay:r.relay,sforward:r.sforward,updater:r.updater,server:r.server,group:r.group,tunnel:r.tunnel};if(e.single){if(!e.name)return void U.nk.error(t("status.exportNamePlease"))}else e.name="";if(r.apipassword)return e;U.nk.error(t("status.exportApiPasswordPlease"))},u=()=>{const e=document.createElement("a");r.single?e.download=`client-node-export-${r.name}.zip`:e.download="client-node-export.zip",e.href="/client-node-export.zip",document.body.appendChild(e),e.click(),document.body.removeChild(e)},c=()=>{const e=d();e&&(r.loading=!0,(0,mt.ql)(e).then((e=>{r.loading=!1,e?(r.show=!1,U.nk.success(t("common.oper")),r.saveContent=e,r.showSave=!0):U.nk.error(t("common.operFail"))})).catch((()=>{U.nk.error(t("common.operFail")),r.loading=!1})))},p=async()=>{try{return await navigator.clipboard.writeText(`在初始化linker客户端时,填写服务器和密钥,导入配置\n服务器: ${r.saveServer}\n密钥: ${r.saveContent}`),U.nk.success(t("common.oper")),!0}catch(e){return U.nk.error(t("common.operFail")),!1}},m=()=>{const e=d();e&&(r.loading=!0,(0,mt.P$)(e).then((()=>{r.loading=!1,r.show=!1,U.nk.success(t("common.oper")),u()})).catch((()=>{U.nk.error(t("common.operFail")),r.loading=!1})))},g=()=>{const e=d();e&&(r.loading=!0,(0,mt.om)(e).then((e=>{r.loading=!1,r.show=!1,U.nk.success(t("common.oper")),r.copyContent=e,r.showCopy=!0})).catch((()=>{U.nk.error(t("common.operFail")),r.loading=!1})))},v=async()=>{try{return await navigator.clipboard.writeText(r.copyContent),U.nk.success(t("common.oper")),!0}catch(e){return U.nk.error(t("common.operFail")),!1}};return{config:e.config,onlyNode:s,hasExport:o,machineId:n,state:r,accessDom:i,handleSave:c,handleExport:m,handleCopy:g,copyToClipboard:v,copySaveToClipboard:p}}};const ft=(0,T.A)(vt,[["render",pt],["__scopeId","data-v-ec18026a"]]);var ht=ft,wt=a(7115),kt={components:{Api:E,Server:et,Export:ht,UpdaterBtn:wt.A},props:["config"],setup(e){const t=(0,F.B)(),a=(0,l.EW)((()=>t.value.self)),o=(0,C.Kh)({showPay:!1});return{globalData:t,state:o,config:e.config,self:a}}};const yt=(0,T.A)(kt,[["render",S],["__scopeId","data-v-53629093"]]);var bt=yt},8734:function(e,t,a){a.d(t,{A:function(){return v}});var l=a(6768);function o(e,t,a,o,s,n){const r=(0,l.g2)("Share"),i=(0,l.g2)("el-icon"),d=(0,l.g2)("el-button");return(0,l.uX)(),(0,l.CE)("div",null,[(0,l.bF)(d,{class:"btn",size:"small",onClick:o.handleSync},{default:(0,l.k6)((()=>[(0,l.bF)(i,null,{default:(0,l.k6)((()=>[(0,l.bF)(r)])),_:1})])),_:1},8,["onClick"])])}var s=a(4);const n=e=>(0,s.zG)("sync/Sync",e);var r=a(3830),i=a(7477),d=a(1219),u=a(2933),c=a(5931),p={props:["name"],components:{Share:i.SYj},setup(e){const{t:t}=(0,c.s9)(),a=(0,r.B)(),o=(0,l.EW)((()=>a.value.hasAccess("Sync"))),s=()=>{o.value?u.s.confirm(`${t("server.sync")}【${t(`server.async${e.name}`)}】${t("server.asyncText")}? `,t("common.tips"),{confirmButtonText:t("common.confirm"),cancelButtonText:t("common.cancel"),type:"warning"}).then((()=>{n([e.name]).then((e=>{d.nk.success(t("common.oper"))}))})).catch((()=>{})):d.nk.success(t("common.access"))};return{handleSync:s}}},m=a(1241);const g=(0,m.A)(p,[["render",o]]);var v=g}}]);
\ No newline at end of file
diff --git a/src/linker.tray.win/web/js/app.a10400b4.js b/src/linker.tray.win/web/js/app.51805d8f.js
similarity index 91%
rename from src/linker.tray.win/web/js/app.a10400b4.js
rename to src/linker.tray.win/web/js/app.51805d8f.js
index 43d0f8bb..06521046 100644
--- a/src/linker.tray.win/web/js/app.a10400b4.js
+++ b/src/linker.tray.win/web/js/app.51805d8f.js
@@ -1 +1 @@
-(function(){"use strict";var e={8835:function(e,r,s){s.d(r,{D3:function(){return l},P$:function(){return u},ai:function(){return n},om:function(){return i},ql:function(){return c},vZ:function(){return o},zj:function(){return a}});var t=s(4);const a=()=>(0,t.zG)("config/get"),n=e=>(0,t.zG)("config/install",e),o=e=>(0,t.zG)("config/InstallCopy",e),l=e=>(0,t.zG)("config/InstallSave",e),u=e=>(0,t.zG)("config/export",e),i=e=>(0,t.zG)("config/copy",e),c=e=>(0,t.zG)("config/save",e)},4:function(e,r,s){s.d(r,{a1:function(){return f},e3:function(){return C},jH:function(){return k},zG:function(){return h}});s(4114),s(6573),s(8100),s(7936);var t=s(1219);let a=0,n=null,o="",l=1,u="";const i={},c={connected:!1,connecting:!1},d=()=>{const e=Date.now();for(let r in i){const s=i[r];e-s.time>s.timeout&&(s.reject("超时~"),delete i[r])}setTimeout(d,1e3)};d();const y={subs:{},add:function(e,r){"function"==typeof r&&(this.subs[e]||(this.subs[e]=[]),this.subs[e].push(r))},remove(e,r){let s=this.subs[e]||[];for(let t=s.length-1;t>=0;t--)s[t]==r&&s.splice(t,1)},push(e,r){let s=this.subs[e]||[];for(let t=s.length-1;t>=0;t--)s[t](r)}},v=()=>{c.connected=!0,c.connecting=!1,y.push(w,c.connected)},p=e=>{c.connected=!1,c.connecting=!1,y.push(w,c.connected),setTimeout((()=>{f()}),1e3)},m=e=>{if("string"!=typeof e.data)return void e.data.arrayBuffer().then((r=>{const s=new DataView(r).getInt8(),t=new FileReader;t.readAsText(e.data.slice(4,4+s),"utf8"),t.onload=()=>{let a=JSON.parse(t.result);a.Content={Name:a.Content,Img:e.data.slice(4+s,e.data.length),ArrayBuffer:r},g(a)}}));let r=JSON.parse(e.data);g(r)},g=e=>{let r=i[e.RequestId];r?(0==e.Code?r.resolve(e.Content):1==e.Code?r.reject(e.Content):255==e.Code?(r.reject(e.Content),r.errHandle||t.nk.error(`${r.path}:${e.Content}`)):y.push(e.Path,e.Content),delete i[e.RequestId]):y.push(e.Path,e.Content)},f=(e=o,r=u)=>{if(u=r,o=e,c.connecting||c.connected)return;null!=n&&n.close(),c.connecting=!0;const s=r||"snltty";n=new WebSocket(o,[s]),n.iddd=++l,n.onopen=v,n.onclose=p,n.onmessage=m,n.onerror=e=>{t.nk.error({message:"api接口连接失败,请检查接口地址或密码",grouping:!0})}},C=()=>{n&&n.close()},h=(e,r={},s=!1,t=15e3)=>new Promise(((o,l)=>{let u=++a;try{i[u]={resolve:o,reject:l,errHandle:s,path:e,time:Date.now(),timeout:t};let a=JSON.stringify({Path:e,RequestId:u,Content:"string"==typeof r?r:JSON.stringify(r)});c.connected&&1==n.readyState?n.send(a):l("网络错误~")}catch(d){console.log(d),l("网络错误~"),delete i[u]}})),w=Symbol(),k=e=>{y.add(w,e)}},9299:function(e,r,s){s.d(r,{BS:function(){return i},NT:function(){return v},SZ:function(){return o},Se:function(){return c},VN:function(){return l},gC:function(){return d},jU:function(){return n},nD:function(){return u},rd:function(){return a},wP:function(){return p},zp:function(){return y}});var t=s(4);const a=e=>(0,t.zG)("signIn/set",e),n=e=>(0,t.zG)("signIn/setservers",e),o=()=>(0,t.zG)("signIn/info"),l=e=>(0,t.zG)("signIn/setorder",e),u=e=>(0,t.zG)("signIn/List",e),i=e=>(0,t.zG)("signIn/ids",e),c=e=>(0,t.zG)("signIn/del",e),d=e=>(0,t.zG)("signIn/setname",e),y=e=>(0,t.zG)("signIn/SetGroups",e),v=()=>(0,t.zG)("signIn/names"),p=e=>(0,t.zG)("signIn/checkkey",e)},9287:function(e,r,s){s.d(r,{Y:function(){return o},A:function(){return u}});var t=s(5931),a={"common.oper":"Operated","common.operFail":"Operation failed","common.confirm":"Confirm","common.cancel":"Cancel","common.setting":"Setting","common.operating":"In operation","common.tips":"Tips","common.option":"Option","common.access":"No access","common.relay":"Relay","common.p2p":"P2P","common.refresh":"Refresh","head.home":"Home","head.server":"Server","head.protocol":"P2P Protocol","head.action":"Action","head.firewall":"Firewall","head.logger":"Logs","head.refresh":"Refresh","logger.list":"List","logger.setting":"Setting","logger.clear":"Clear","logger.refresh":"Refresh","logger.count":"Count","logger.level":"Level","logger.time":"Time","logger.content":"Content","action.text":"Set action static Json parameters","action.jsonError":"Json format error","server.messenger":"Messenger Server","server.group":"Group","server.sync":"Sync","server.messengerAddr":"Messenger Server","server.messengerText":"ip:port or domain:port","server.messengerSecretKey":"Messenger SecretKey","server.messengerSecretKeyText":"Messenger SecretKey","server.messengerUserId":"User Id","server.messengerUserIdText":"Your unique identifier,used to unlock something.","permission.closed":"Closed","permission.simple":"Simple","permission.full":"Full","permission.clear":"Clear connection","status.group":"Group manager","status.groupName":"Name","status.groupPassword":"Password","status.groupOper":"Oper","status.groupDelConfirm":"Are you sure to delete?","status.groupValidate":"Name or Id empty item has exists","status.support":"Support","status.website":"Website","status.doc":"Document","status.cdkey":"CDKEY store","status.export":"Export","status.exportText":"Export the configuration to run elsewhere","status.exportSingle":"Single","status.exportName":"Name","status.exportNamePlease":"Please input device name","status.exportApiPassword":"Api Pwd","status.exportApiPasswordPlease":"Please input api password","status.exportDownload":"Download","status.exportCopy":"Copy","status.exportSave":"Save","status.exportRelay":"Relay secretKey","status.exportSForward":"SForward secretKey","status.exportUpdater":"Update secretKey","status.exportServer":"Messenger server","status.exportGroup":"Group","status.exportTunnel":"Tunnel config","status.api":"Manager api","status.apiClear":"Clear","status.apiAlter":"Alter","status.apiAlterConfirm":"Are you sure?","status.messenger":"Messenger server","status.messengerName":"Messenger","status.messengerChange":"change your messenger","status.messengerGroup":"Group","status.serverVersion":"Server version","status.serverNoUpdate":"No updates","status.serverNotNew":"Not latest version","status.serverNew":"Is latest version","status.serverDownloading":"Downloading","status.serverDownloaded":"Downloaded","status.serverUnZipIng":"In unzip","status.serverUnZip":"Unzip","status.serverConfirm":"Are you sure to update server?","status.serverCloseConfirm":"Are you sure to close server?","status.flowOnline":"Online","status.flowUpload":"Up","status.flowDownload":"Down","status.flowThisServer":"This Server","status.flowAllServer":"All Server","status.flowAllSend":"Send","status.flowAllReceive":"Receive","status.flowOnline7Day":"Within seven days","status.flowServer":"Server","status.flowType":"Type","status.flowOper":"Oper","status.flowDetail":"Detail","status.flowMessenger":"Messenger","status.flowRelay":"Relay","status.flowRelayNode":"Relay Node","status.flowWanPort":"Wan Port","status.flowServerForward":"Server Forward","status.flowSearchName":"Name","status.flowRelaySource":"Source","status.flowRelayTarget":"Target","status.flowSearchDomainPort":"Domain/Port","status.flowArea":"Area","status.flowNet":"Network","status.tunnelName":"Name","status.tunnelLabel":"Label","status.tunnelProtocol":"Proto","status.tunnelBuffer":"Buffer","status.tunnelReverse":"Reverse","status.tunnelSSL":"SSL","status.tunnelDisanbled":"Disable","status.tunnelSort":"Index","status.tunnelYes":"Y","status.tunnelNo":"N","server.relaySecretKey":"Relay SecretKey","server.relaySSL":"Use SSL","server.relayDisable":"Disable","server.relayUseCdkey":"Use CDKEY","server.relayUseCdkeyTitle":"If you have a relay SecretKey, ignore it\r\n Without a relay SecretKey, you can choose to use a cdkey or default relay node config","server.relayNodes":"Nodes","server.relayTitle":"Relay Nodes","server.relayName":"Name","server.relayFlow":"Traffic/Month","server.relaySpeed":"Total","server.relaySpeed1":"Single","server.relaySpeed2":"Rate","server.relayConnection":"Conn","server.relayDelay":"Delay","server.relayPublic":"Public","server.relayAllow":"Allow","server.relayUrl":"Url","server.relayOper":"Oper","server.relayUse":"Use","server.relayMyCdkey":"My CDKEY","server.relayCdkey":"Manager CDKEY","server.relayAddCdkey":"Add CDKEY","server.relayCdkeyUserId":"UserId","server.relayCdkeyBandwidth":"Bandwidth","server.relayCdkeyBytes":"Bytes","server.relayCdkeyPay":"Pay","server.relayCdkeyOrder":"Order","server.relayCdkeyPrice":"Price","server.relayCdkeyPayPrice":"Pay price","server.relayCdkeyCostPrice":"Cost price","server.relayCdkeyUserPrice":"User price","server.relayCdkeyOrderId":"OrderNo","server.relayCdkeyContact":"Email","server.relayCdkeyRemark":"Remark","server.relayCdkeyAddTime":"Add","server.relayCdkeyStartTime":"Start","server.relayCdkeyEndTime":"End Time","server.relayCdkeyUseTime":"Use Time","server.relayCdkeyYear":"Year","server.relayCdkeyMonth":"Month","server.relayCdkeyDay":"Day","server.relayCdkeyHour":"Hour","server.relayCdkeyMin":"Min","server.relayCdkeySec":"Sec","server.relayCdkeyDuration":"Duration","server.relayCdkeyOper":"Oper","server.relayCdkeyDelConfirm":"Are you sure to delete?","server.relayCdkeyFlagAll":"All","server.relayCdkeyFlagTimein":"In end time","server.relayCdkeyFlagTimeout":"Out end time","server.relayCdkeyFlagBytesin":"Has bytes","server.relayCdkeyFlagBytesout":"Not have bytes","server.relayCdkeyFlagDeleted":"Deleted","server.relayCdkeyFlagUnDeleted":"Not deleted","server.relayCdkeyTestTitle":"Test CDKEY","server.relayCdkeyTestKey":"CDKEY","server.relayCdkeyTestGB":"GB","server.relayCdkeyTestGBError":"Must > 0","server.relayCdkeyTestSpeed":"Mbps","server.relayCdkeyTestSpeedError":"Must > 0","server.relayCdkeyTestTime":"Time","server.relayCdkeyTestTimeError":"Format error","server.relayCdkeyTestUserId":"UserId","server.relayCdkeyTestUserIdError":"UserId error","server.relayCdkeyTestOrderId":"OrderNo","server.relayCdkeyTestOrderIdError":"OrderNo is empty","server.relayCdkeyTestContact":"Contact","server.relayCdkeyTestCostPrice":"Cost","server.relayCdkeyTestPrice":"Price","server.relayCdkeyTestUserPrice":"User price","server.relayCdkeyTestPayPrice":"Pay","server.relayCdkeyTestCount":"Count","server.relayCdkeyTestCountError":"Must > 0","server.relayCdkeyTestType":"Type","server.relayCdkeyTestTypeError":"Must be relay","server.relayCdkeyTestParseError":"decode fail","server.relayCdkeyImport":"Import CDKEY","server.relayCdkeyImportParse":"Decode fail","server.relayCdkeyImportField":"Field invalid","server.relayCdkeyImportNetwork":"Network error","server.relayCdkeyImportOrderId":"OrderNo has exists","server.sforwardSecretKey":"Server forward secretKey","server.sforwardText":"The server forward can be used when the key is correct","server.updaterSecretKey":"Server update secretKey","server.updaterText":"The server update can be used when the key is correct","server.updaterRate":"Update check interval","server.updaterY":"Year","server.updaterM":"Mmonth","server.updaterD":"Day","server.updaterH":"Hour","server.updaterMM":"Minute","server.updaterS":"Second","server.asyncText":"to group all clients","server.asyncSelect":"Please select","server.asyncCheckAll":"Check all","server.asyncSignInSecretKey":"Signin secretKey","server.asyncSignInServer":"Signin server","server.asyncGroupSecretKey":"Group secretKey","server.asyncRelaySecretKey":"Relay secretKey","server.asyncSForwardSecretKey":"Server forward secretKey","server.asyncUpdaterSecretKey":"Update secretKey","server.asyncTunnelTransports":"Tunnel transports","server.asyncSignInUserId":"User Id","firewall.rule":"Firewall rule","firewall.srcName":"Src Device","firewall.dstCidr":"Dst IP","firewall.dstPort":"Dst Port","firewall.protocol":"Protocol","firewall.protocolall":"Protocol all","firewall.actionall":"Action all","firewall.action":"Action","firewall.actionAllow":"Allow","firewall.actionAllowAll":"Allow all","firewall.actionDeny":"Deny","firewall.actionDenyAll":"Deny all","firewall.orderby":"Order","firewall.enabled":"Enable","firewall.disabled":"Disable","firewall.disabledAll":"All state","firewall.del":"Del","firewall.edit":"Edit","firewall.delConfirm":"Are you sure to delete this rule?","firewall.switch":"Firewall switch,open or close","firewall.remark":"Remark","firewall.unselect":"All","firewall.selected":"Selected"},n={"common.oper":"已操作","common.operFail":"操作失败","common.confirm":"确认","common.cancel":"取消","common.setting":"设置","common.operating":"正在操作","common.tips":"提示","common.option":"选项","common.access":"无权限","common.relay":"中继","common.p2p":"打洞","common.refresh":"刷新","head.home":"首页","head.server":"服务器","head.group":"分组","head.protocol":"打洞协议","head.action":"验证","head.firewall":"防火墙","head.logger":"日志","head.refresh":"刷新","logger.list":"列表","logger.setting":"设置","logger.clear":"清空","logger.refresh":"刷新","logger.count":"数量","logger.level":"等级","logger.time":"时间","logger.content":"内容","action.text":"设置定义验证的静态Json参数","action.jsonError":"json格式错误","server.messenger":"信标服务器","server.group":"分组","server.sync":"同步","server.messengerAddr":"服务器地址","server.messengerText":"ip:端口 或者 域名:端口","server.messengerSecretKey":"信标密钥","server.messengerSecretKeyText":"密钥正确时可连接服务器","server.messengerUserId":"用户id","server.messengerUserIdText":"你的唯一标识,用于解锁一些限制","permission.closed":"禁止通行","permission.simple":"简单管理","permission.full":"专业管理","permission.clear":"清除连接","status.group":"管理分组","status.groupName":"名称","status.groupPassword":"密码","status.groupOper":"操作","status.groupDelConfirm":"确认删除吗?","status.groupValidate":"有名称或者id未设置的项","status.support":"赞助","status.website":"官网","status.doc":"文档","status.cdkey":"CDKEY商城","status.export":"导出配置","status.exportText":"导出配置,客户端覆盖配置文件,或粘贴配置信息,或在线加载","status.exportSingle":"单设备","status.exportName":"设备名","status.exportNamePlease":"请输入设备名","status.exportApiPassword":"接口密码","status.exportApiPasswordPlease":"请输入接口密码","status.exportDownload":"下载","status.exportCopy":"复制","status.exportSave":"保存","status.exportRelay":"中继密钥","status.exportSForward":"内网穿透密钥","status.exportUpdater":"更新密钥","status.exportServer":"信标服务器","status.exportGroup":"当前分组","status.exportTunnel":"打洞协议","status.api":"管理接口","status.apiClear":"清除","status.apiAlter":"更改","status.apiAlterConfirm":"确定你的操作?","status.messenger":"信标服务器","status.messengerChange":"更改你的连接设置","status.messengerName":"信标","status.messengerGroup":"分组名","status.messenger0":"登入信标","status.messenger1":"客户端列表","status.messenger2":"客户端删除","status.messenger4":"客户端改名(转发)","status.messenger7":"获取服务器版本","status.messenger8":"客户端搜索ids","status.messenger9":"客户端id列表","status.messenger10":"客户端排序","status.messenger11":"客户端在线","status.messenger12":"生成客户端id","status.messenger13":"登入信标V_1_3_1","status.messenger14":"名字列表","status.messenger2001":"外网端口(转发)","status.messenger2002":"外网端口(转发)","status.messenger2003":"开始打洞(转发)","status.messenger2004":"开始打洞(转发)","status.messenger2005":"打洞失败(转发)","status.messenger2006":"打洞失败(转发)","status.messenger2007":"打洞成功(转发)","status.messenger2008":"打洞成功(转发)","status.messenger2009":"隧道配置(转发)","status.messenger2010":"隧道配置(转发)","status.messenger2012":"隧道同步(转发)","status.messenger2101":"中继通知(转发)","status.messenger2102":"中继通知(转发)","status.messenger2103":"中继请求","status.messenger2105":"中继连通测试","status.messenger2201":"运行网卡(转发)","status.messenger2203":"停止网卡(转发)","status.messenger2204":"更新网卡","status.messenger2205":"更新网卡(转发)","status.messenger2208":"配置网卡网络","status.messenger2209":"获取网卡网络","status.messenger2210":"分配IP","status.messenger2211":"网卡变化","status.messenger2212":"网卡变化(转发)","status.messenger2213":"IP续约","status.messenger2214":"网卡端口转发检测","status.messenger2215":"网卡端口转发检测(转发)","status.messenger2301":"添加内网穿透","status.messenger2302":"移除内网穿透","status.messenger2303":"通知内网穿透(转发)","status.messenger2304":"通知内网穿透UDP(转发)","status.messenger2305":"获取穿透列表(转发)","status.messenger2401":"测试端口转发(转发)","status.messenger2403":"获取端口转发(转发)","status.messenger2507":"同步配置","status.messenger2508":"同步配置(转发)","status.messenger2601":"更新信息(转发)","status.messenger2602":"更新信息(转发)","status.messenger2603":"确认更新(转发)","status.messenger2604":"确认更新(转发)","status.messenger2605":"重启(转发)","status.messenger2606":"重启","status.messenger2607":"服务器更新信息","status.messenger2608":"确认服务器更新","status.messenger2609":"服务器重启","status.messenger2610":"订阅更新信息(转发)","status.messenger2611":"订阅更新信息(转发)","status.messenger2612":"检查更新","status.messenger2613":"检查更新(转发)","status.messenger2701":"服务器流量","status.messenger2702":"服务器信标流量","status.messenger2703":"服务器中继流量","status.messenger2704":"服务器内网穿透流量","status.messenger2807":"同步配置","status.messenger2808":"同步配置(转发)","status.messenger2812":"同步推送","status.messenger2813":"同步拉取","status.messenger2814":"同步通知","status.messenger2815":"同步分页拉取","status.messenger2900":"运行socks5","status.messenger2901":"运行socks5(转发)","status.messenger2902":"停止socks5","status.messenger2903":"停止socks5(转发)","status.messenger2904":"更新socks5","status.messenger2905":"更新socks5(转发)","status.messenger3003":"获取权限","status.messenger3004":"获取权限(转发)","status.messenger3005":"更新权限","status.messenger3006":"更新权限(转发)","status.serverVersion":"服务端的程序版本","status.serverNoUpdate":"未检测到更新","status.serverNotNew":"不是最新版本","status.serverNew":"是最新版本","status.serverDownloading":"正在下载","status.serverDownloaded":"已下载","status.serverUnZipIng":"正在解压","status.serverUnZip":"已解压","status.serverConfirm":"确定更新服务端吗?","status.serverCloseConfirm":"确定关闭服务端吗?","status.flowOnline":"在线","status.flowUpload":"上传","status.flowDownload":"下载","status.flowThisServer":"本服务器","status.flowAllServer":"所有服务器","status.flowAllSend":"发送","status.flowAllReceive":"接收","status.flowOnline7Day":"7天内上线","status.flowServer":"服务器","status.flowType":"类别","status.flowOper":"操作","status.flowDetail":"详情","status.flowMessenger":"信标","status.flowRelay":"中继","status.flowRelayNode":"中继节点","status.flowWanPort":"外网端口","status.flowServerForward":"内网穿透","status.flowSearchName":"名字搜索","status.flowRelaySource":"发起端","status.flowRelayTarget":"目标端","status.flowSearchDomainPort":"域名/端口","status.flowArea":"地区","status.flowNet":"网络","status.tunnelName":"名称","status.tunnelLabel":"说明","status.tunnelProtocol":"协议","status.tunnelBuffer":"缓冲区","status.tunnelReverse":"反向","status.tunnelSSL":"SSL","status.tunnelDisanbled":"禁用","status.tunnelSort":"排序","status.tunnelYes":"是","status.tunnelNo":"否","server.relaySecretKey":"中继密钥","server.relaySSL":"使用ssl","server.relayDisable":"禁用","server.relayUseCdkey":"消耗CDKEY","server.relayUseCdkeyTitle":"如果你有中继密钥,你没有任何限制,也不会消耗CDKEY,可以不管这个\r\n没有中继密钥,有CDKEY,但是不想使用CDKEY,只想使用中继节点默认的限制,就去掉勾选","server.relayNodes":"节点","server.relayTitle":"中继节点","server.relayName":"名称","server.relayFlow":"月流量","server.relayFlowLast":"剩余流量","server.relaySpeed":"带宽","server.relaySpeed1":"总带宽","server.relaySpeed2":"速率","server.relayConnection":"连接数","server.relayDelay":"延迟","server.relayPublic":"公开","server.relayAllow":"支持协议","server.relayUrl":"Url","server.relayOper":"操作","server.relayUse":"使用","server.relayMyCdkey":"我的CDKEY","server.relayCdkey":"管理CDKEY","server.relayAddCdkey":"添加CDKEY","server.relayCdkeyUserId":"用户标识","server.relayCdkeyBandwidth":"带宽","server.relayCdkeyBytes":"流量","server.relayCdkeyPay":"支付","server.relayCdkeyPrice":"原价","server.relayCdkeyPayPrice":"支付","server.relayCdkeyCostPrice":"成本","server.relayCdkeyUserPrice":"会员价","server.relayCdkeyOrder":"订单","server.relayCdkeyOrderId":"订单号","server.relayCdkeyContact":"邮箱","server.relayCdkeyRemark":"备注","server.relayCdkeyAddTime":"添加","server.relayCdkeyStartTime":"开始","server.relayCdkeyEndTime":"有效时间","server.relayCdkeyUseTime":"最后使用","server.relayCdkeyYear":"年","server.relayCdkeyMonth":"月","server.relayCdkeyDay":"日","server.relayCdkeyHour":"时","server.relayCdkeyMin":"分","server.relayCdkeySec":"秒","server.relayCdkeyDuration":"持续时间","server.relayCdkeyOper":"操作","server.relayCdkeyDelConfirm":"确认删除吗?","server.relayCdkeyFlagAll":"全部","server.relayCdkeyFlagTimein":"有效期内","server.relayCdkeyFlagTimeout":"有效期外","server.relayCdkeyFlagBytesin":"剩余","server.relayCdkeyFlagBytesout":"已用完","server.relayCdkeyFlagDeleted":"已删除","server.relayCdkeyFlagUnDeleted":"未删除","server.relayCdkeyTestTitle":"测试解密CDKEY","server.relayCdkeyTestKey":"CDKEY","server.relayCdkeyTestGB":"流量","server.relayCdkeyTestGBError":"流量要大于0","server.relayCdkeyTestSpeed":"带宽Mbps","server.relayCdkeyTestSpeedError":"带宽要大于0","server.relayCdkeyTestTime":"持续时间","server.relayCdkeyTestTimeError":"格式错误","server.relayCdkeyTestUserId":"用户标识","server.relayCdkeyTestUserIdError":"用户标识不正确","server.relayCdkeyTestOrderId":"订单","server.relayCdkeyTestOrderIdError":"订单号不能为空","server.relayCdkeyTestContact":"联系方式","server.relayCdkeyTestCostPrice":"成本","server.relayCdkeyTestPrice":"原价","server.relayCdkeyTestUserPrice":"会员价","server.relayCdkeyTestPayPrice":"支付","server.relayCdkeyTestCount":"数量","server.relayCdkeyTestCountError":"数量要大于0","server.relayCdkeyTestType":"类别","server.relayCdkeyTestTypeError":"类别应该是Relay","server.relayCdkeyTestParseError":"解密失败","server.relayCdkeyImport":"导入CDKEY","server.relayCdkeyImportParse":"解密失败","server.relayCdkeyImportField":"字段有误","server.relayCdkeyImportNetwork":"网络错误","server.relayCdkeyImportOrderId":"订单号已存在","server.sforwardSecretKey":"服务器穿透密钥","server.sforwardText":"当密钥正确是可用","server.updaterSecretKey":"服务器更新密钥","server.updaterText":"当密钥正确是可用","server.updaterRate":"检查更新频率","server.updaterY":"年","server.updaterM":"月","server.updaterD":"日","server.updaterH":"时","server.updaterMM":"分","server.updaterS":"秒","server.asyncText":"到本组所有客户端","server.asyncSelect":"请选择","server.asyncCheckAll":"全选","server.asyncSignInSecretKey":"信标密钥","server.asyncSignInServer":"信标服务器","server.asyncGroupSecretKey":"分组密钥","server.asyncRelaySecretKey":"中继密钥","server.asyncSForwardSecretKey":"服务器穿透密钥","server.asyncUpdaterSecretKey":"更新密钥","server.asyncTunnelTransports":"打洞协议","server.asyncSignInUserId":"用户唯一标识","firewall.rule":"防火墙协议","firewall.srcName":"源设备","firewall.dstCidr":"目标IP","firewall.dstPort":"目标端口","firewall.protocolall":"全部协议","firewall.protocol":"协议","firewall.actionall":"全部操作","firewall.action":"操作","firewall.actionAllow":"允许","firewall.actionAllowAll":"允许全部","firewall.actionDeny":"阻止","firewall.actionDenyAll":"阻止全部","firewall.orderby":"顺序","firewall.enabled":"启用","firewall.disabled":"禁用","firewall.disabledAll":"全部状态","firewall.del":"删除","firewall.edit":"修改","firewall.delConfirm":"确认删除规则?","firewall.switch":"防火墙开关,是否开启防火墙","firewall.remark":"备注","firewall.unselect":"未选择","firewall.selected":"已选择"};const o={"zh-CN":"简体中文","en-US":"English"},l=(0,t.hU)({locale:localStorage.getItem("locale-lang")||navigator.language||navigator.browserLanguage,fallbackLocale:"zh-CN",legacy:!1,allowComposition:!0,messages:{"en-US":a,"zh-CN":n}});var u=l},2773:function(e,r,s){s.d(r,{A:function(){return n}});var t=s(6768),a=s(5931);function n(){const e=(0,a.s9)(),r=(0,t.EW)((()=>e.locale.value)),s=r=>{e.locale.value!==r&&(e.locale.value=r,localStorage.setItem("locale-lang",r))};return{currentLocale:r,changeLocale:s}}},2441:function(e,r,s){var t=s(5130),a=s(6768),n=s(4232);function o(e,r,s,t,o,l){const u=(0,a.g2)("router-view"),i=(0,a.g2)("Api"),c=(0,a.g2)("el-config-provider"),d=(0,a.g2)("Refresh");return(0,a.uX)(),(0,a.CE)(a.FK,null,[(0,a.Lk)("div",{class:(0,n.C4)({phone:t.globalData.isPhone})},[(0,a.bF)(c,{locale:t.locale},{default:(0,a.k6)((()=>[t.configed?((0,a.uX)(),(0,a.Wv)(u,{key:0})):(0,a.Q3)("",!0),(0,a.bF)(i)])),_:1},8,["locale"])],2),(0,a.bF)(d)],64)}var l=s(3830);const u={class:"port-wrap t-c"},i={class:"pdt-10"},c={class:"pdt-10"};function d(e,r,s,n,o,l){const d=(0,a.g2)("el-input"),y=(0,a.g2)("el-checkbox"),v=(0,a.g2)("el-button"),p=(0,a.g2)("el-dialog");return(0,a.uX)(),(0,a.Wv)(p,{class:"options-center",title:"管理接口","destroy-on-close":"",modelValue:n.showPort,"onUpdate:modelValue":r[3]||(r[3]=e=>n.showPort=e),center:"","show-close":!1,"close-on-click-modal":!1,"align-center":"",width:"200"},{footer:(0,a.k6)((()=>[(0,a.bF)(v,{type:"success",onClick:n.handleConnect1,plain:""},{default:(0,a.k6)((()=>[(0,a.eW)("确 定")])),_:1},8,["onClick"])])),default:(0,a.k6)((()=>[(0,a.Lk)("div",u,[(0,a.Lk)("div",null,[(0,a.eW)(" 接口 : "),(0,a.bF)(d,{modelValue:n.state.api,"onUpdate:modelValue":r[0]||(r[0]=e=>n.state.api=e),style:{width:"70%"},onKeyup:(0,t.jR)(n.handleConnect1,["enter"])},null,8,["modelValue","onKeyup"])]),(0,a.Lk)("div",i,[(0,a.eW)(" 秘钥 : "),(0,a.bF)(d,{"show-password":"",type:"password",modelValue:n.state.psd,"onUpdate:modelValue":r[1]||(r[1]=e=>n.state.psd=e),style:{width:"70%"},onKeyup:(0,t.jR)(n.handleConnect1,["enter"])},null,8,["modelValue","onKeyup"])]),(0,a.Lk)("div",c,[(0,a.bF)(y,{modelValue:n.state.save,"onUpdate:modelValue":r[2]||(r[2]=e=>n.state.save=e)},{default:(0,a.k6)((()=>[(0,a.eW)("保存密码")])),_:1},8,["modelValue"])])])])),_:1},8,["modelValue"])}var y=s(1387),v=s(144),p=s(4),m=s(9299),g=s(8835),f=s(7477),C={components:{Tools:f.S0q},props:["config"],setup(e){const r=(0,l.B)(),s=(0,y.rd)(),t=(0,y.lq)(),n={api:`${window.location.hostname}:1803`,psd:"snltty"},o=JSON.parse(sessionStorage.getItem("api-cache")||localStorage.getItem("api-cache")||JSON.stringify(n)),u=(0,v.Kh)({api:o.api,psd:o.psd,showPort:!1,save:o.save||!1}),i=(0,a.EW)((()=>0==r.value.api.connected&&u.showPort)),c=()=>{o.api=u.api,o.psd=u.psd,o.save=u.save,u.save?localStorage.setItem("api-cache",JSON.stringify(o)):localStorage.setItem("api-cache",""),sessionStorage.setItem("api-cache",JSON.stringify(o)),(0,p.e3)();const e=`ws${"https:"===window.location.protocol?"s":""}://${u.api}`;(0,p.a1)(e,u.psd)},d=()=>{c(),window.location.reload()},f=()=>{(0,g.zj)().then((e=>{r.value.config.Common=e.Common,r.value.config.Client=e.Client,r.value.config.Server=e.Server,r.value.config.Running=e.Running,r.value.config.configed=!0,setTimeout((()=>{f()}),1e3)})).catch((e=>{setTimeout((()=>{f()}),1e3)}))},C=()=>{(0,m.SZ)().then((e=>{r.value.signin.Connected=e.Connected,r.value.signin.Version=e.Version,setTimeout((()=>{C()}),1e3)})).catch((e=>{setTimeout((()=>{C()}),1e3)}))};return(0,a.sV)((()=>{setTimeout((()=>{u.showPort=!0}),500),(0,p.jH)((e=>{e&&(f(),C())})),s.isReady().then((()=>{u.api=t.query.api?`${window.location.hostname}:${t.query.api}`:u.api,u.psd=t.query.psd||u.psd,c()}))})),{state:u,showPort:i,handleConnect1:d}}},h=s(1241);const w=(0,h.A)(C,[["render",d],["__scopeId","data-v-08aa73f8"]]);var k=w,S=s(2721),T=s(6726),b=s(2773);const P={class:"percentage-value"};function D(e,r,s,t,o,l){const u=(0,a.g2)("el-progress");return t.state.show?((0,a.uX)(),(0,a.CE)("div",{key:0,class:"refresh-wrap",style:(0,n.Tr)({top:t.state.dy/4+"px"})},[(0,a.bF)(u,{type:"circle",percentage:t.state.percentage,width:"50"},{default:(0,a.k6)((({percentage:e})=>[(0,a.Lk)("span",P,(0,n.v_)(e)+"%",1)])),_:1},8,["percentage"])],4)):(0,a.Q3)("",!0)}var A={setup(){const e=(0,v.Kh)({percentage:50,show:!1,touchY:0,dy:0,start:0}),r=r=>{e.percentage=0;const s=r.touches[0];e.touchY=s.clientY,e.start=Date.now()},s=r=>{const s=r.touches[0],t=s.clientY;if(0==e.show&&Date.now()-e.start>300&&(e.show=!0,e.touchY=t),e.show){const r=parseInt(t-e.touchY);e.dy=r,e.percentage=r,e.percentage>100&&(e.percentage=100)}},t=r=>{e.percentage>=100&&e.show&&window.location.reload(),e.show=!1,e.dy=0};return(0,a.sV)((()=>{document.addEventListener("touchstart",r),document.addEventListener("touchmove",s),document.addEventListener("touchend",t),document.addEventListener("touchcancel",t)})),{state:e}}};const I=(0,h.A)(A,[["render",D],["__scopeId","data-v-dfc7a2f2"]]);var N=I,K={components:{Api:k,Refresh:N},setup(e){const r=(0,l.v)(),s=(0,a.EW)((()=>r.value.config.configed)),{currentLocale:t}=(0,b.A)(),n=(0,a.EW)((()=>"zh-CN"==t.value?S.A:T.A));return{configed:s,locale:n,globalData:r}}};const E=(0,h.A)(K,[["render",o]]);var x=E;const U=[{path:"/",name:"Full",component:()=>Promise.all([s.e(754),s.e(898),s.e(372)]).then(s.bind(s,146)),redirect:"/full/index.html",children:[{path:"/full/index.html",name:"FullIndex",component:()=>Promise.all([s.e(754),s.e(799),s.e(827),s.e(201)]).then(s.bind(s,5833))},{path:"/full/servers.html",name:"FullServers",component:()=>s.e(855).then(s.bind(s,7855))},{path:"/full/transport.html",name:"FullTransport",component:()=>s.e(32).then(s.bind(s,4032))},{path:"/full/action.html",name:"FullAction",component:()=>s.e(340).then(s.bind(s,3959))},{path:"/full/firewall.html",name:"FullFirewall",component:()=>Promise.all([s.e(827),s.e(607)]).then(s.bind(s,91))},{path:"/full/logger.html",name:"FullLogger",component:()=>s.e(991).then(s.bind(s,8372))}]},{path:"/net/index.html",name:"Network",component:()=>Promise.all([s.e(754),s.e(898),s.e(799),s.e(373)]).then(s.bind(s,7332))},{path:"/no-permission.html",name:"NoPermission",component:()=>s.e(228).then(s.bind(s,6100))}],O=(0,y.aE)({history:(0,y.Bt)(),routes:U});var F=O,R=s(9287),B=s(6161);s(4188),s(2355),s(1862);const M=(0,t.Ef)(x);M.use(R.A),M.use(B.A,{size:"default"}).use(F).mount("#app")},3830:function(e,r,s){s.d(r,{B:function(){return u},v:function(){return l}});var t=s(4),a=s(144),n=s(6768);const o=Symbol(),l=()=>{const e=(0,a.KR)({api:{connected:!1},width:0,height:0,isPhone:(0,n.EW)((()=>e.value.width<800)),isPc:(0,n.EW)((()=>e.value.width>=800)),config:{Common:{},Client:{Servers:[],Accesss:{}},Server:{},Running:{Relay:{Servers:[]},Tuntap:{IP:"",PrefixLength:24},Client:{Servers:[]},AutoSyncs:{}},configed:!1},signin:{Connected:!1,Version:"v1.0.0.0"},bufferSize:["1KB","2KB","4KB","8KB","16KB","32KB","64KB","128KB","256KB","512KB","1024KB"],self:{},hasAccess(e){if(void 0==this.config.Client.Accesss[e])return!1;const r=this.config.Client.Accesss[e].Value||-1,s=this.config.Client.Access||-1;return s>=0&&(0==s||+(BigInt(s)&BigInt(r)).toString()==r)}});return(0,t.jH)((r=>{e.value.api.connected=r})),(0,n.Gt)(o,e),e},u=()=>(0,n.WQ)(o)}},r={};function s(t){var a=r[t];if(void 0!==a)return a.exports;var n=r[t]={id:t,loaded:!1,exports:{}};return e[t].call(n.exports,n,n.exports,s),n.loaded=!0,n.exports}s.m=e,function(){var e=[];s.O=function(r,t,a,n){if(!t){var o=1/0;for(c=0;c=n)&&Object.keys(s.O).every((function(e){return s.O[e](t[u])}))?t.splice(u--,1):(l=!1,n0&&e[c-1][2]>n;c--)e[c]=e[c-1];e[c]=[t,a,n]}}(),function(){s.n=function(e){var r=e&&e.__esModule?function(){return e["default"]}:function(){return e};return s.d(r,{a:r}),r}}(),function(){s.d=function(e,r){for(var t in r)s.o(r,t)&&!s.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:r[t]})}}(),function(){s.f={},s.e=function(e){return Promise.all(Object.keys(s.f).reduce((function(r,t){return s.f[t](e,r),r}),[]))}}(),function(){s.u=function(e){return"js/"+e+"."+{32:"8c1e93e5",201:"cc55b869",228:"45b76490",340:"9d567527",372:"3147c8c0",373:"830a9fb2",607:"aeb1fa01",754:"41d58001",799:"891cca57",827:"0176a953",855:"30d7a699",898:"2e9a4f2f",991:"c247ee5e"}[e]+".js"}}(),function(){s.miniCssF=function(e){return"css/"+e+"."+{32:"1374e89e",201:"0ac88f6e",228:"b2a71eca",340:"f859e18d",372:"f0648f3d",373:"e91546fd",607:"ea51f44d",855:"ebb7f022",991:"e4499fe6"}[e]+".css"}}(),function(){s.g=function(){if("object"===typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"===typeof window)return window}}()}(),function(){s.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)}}(),function(){var e={},r="linker.web:";s.l=function(t,a,n,o){if(e[t])e[t].push(a);else{var l,u;if(void 0!==n)for(var i=document.getElementsByTagName("script"),c=0;c(0,t.zG)("config/get"),n=e=>(0,t.zG)("config/install",e),o=e=>(0,t.zG)("config/InstallCopy",e),l=e=>(0,t.zG)("config/InstallSave",e),u=e=>(0,t.zG)("config/export",e),i=e=>(0,t.zG)("config/copy",e),d=e=>(0,t.zG)("config/save",e)},4:function(e,r,s){s.d(r,{a1:function(){return f},e3:function(){return C},jH:function(){return k},zG:function(){return h}});s(4114),s(6573),s(8100),s(7936);var t=s(1219);let a=0,n=null,o="",l=1,u="";const i={},d={connected:!1,connecting:!1},c=()=>{const e=Date.now();for(let r in i){const s=i[r];e-s.time>s.timeout&&(s.reject("超时~"),delete i[r])}setTimeout(c,1e3)};c();const y={subs:{},add:function(e,r){"function"==typeof r&&(this.subs[e]||(this.subs[e]=[]),this.subs[e].push(r))},remove(e,r){let s=this.subs[e]||[];for(let t=s.length-1;t>=0;t--)s[t]==r&&s.splice(t,1)},push(e,r){let s=this.subs[e]||[];for(let t=s.length-1;t>=0;t--)s[t](r)}},v=()=>{d.connected=!0,d.connecting=!1,y.push(w,d.connected)},p=e=>{d.connected=!1,d.connecting=!1,y.push(w,d.connected),setTimeout((()=>{f()}),1e3)},m=e=>{if("string"!=typeof e.data)return void e.data.arrayBuffer().then((r=>{const s=new DataView(r).getInt8(),t=new FileReader;t.readAsText(e.data.slice(4,4+s),"utf8"),t.onload=()=>{let a=JSON.parse(t.result);a.Content={Name:a.Content,Img:e.data.slice(4+s,e.data.length),ArrayBuffer:r},g(a)}}));let r=JSON.parse(e.data);g(r)},g=e=>{let r=i[e.RequestId];r?(0==e.Code?r.resolve(e.Content):1==e.Code?r.reject(e.Content):255==e.Code?(r.reject(e.Content),r.errHandle||t.nk.error(`${r.path}:${e.Content}`)):y.push(e.Path,e.Content),delete i[e.RequestId]):y.push(e.Path,e.Content)},f=(e=o,r=u)=>{if(u=r,o=e,d.connecting||d.connected)return;null!=n&&n.close(),d.connecting=!0;const s=r||"snltty";n=new WebSocket(o,[s]),n.iddd=++l,n.onopen=v,n.onclose=p,n.onmessage=m,n.onerror=e=>{t.nk.error({message:"api接口连接失败,请检查接口地址或密码",grouping:!0})}},C=()=>{n&&n.close()},h=(e,r={},s=!1,t=15e3)=>new Promise(((o,l)=>{let u=++a;try{i[u]={resolve:o,reject:l,errHandle:s,path:e,time:Date.now(),timeout:t};let a=JSON.stringify({Path:e,RequestId:u,Content:"string"==typeof r?r:JSON.stringify(r)});d.connected&&1==n.readyState?n.send(a):l("网络错误~")}catch(c){console.log(c),l("网络错误~"),delete i[u]}})),w=Symbol(),k=e=>{y.add(w,e)}},9299:function(e,r,s){s.d(r,{BS:function(){return i},NT:function(){return v},SZ:function(){return o},Se:function(){return d},VN:function(){return l},gC:function(){return c},jU:function(){return n},nD:function(){return u},rd:function(){return a},wP:function(){return p},zp:function(){return y}});var t=s(4);const a=e=>(0,t.zG)("signIn/set",e),n=e=>(0,t.zG)("signIn/setservers",e),o=()=>(0,t.zG)("signIn/info"),l=e=>(0,t.zG)("signIn/setorder",e),u=e=>(0,t.zG)("signIn/List",e),i=e=>(0,t.zG)("signIn/ids",e),d=e=>(0,t.zG)("signIn/del",e),c=e=>(0,t.zG)("signIn/setname",e),y=e=>(0,t.zG)("signIn/SetGroups",e),v=()=>(0,t.zG)("signIn/names"),p=e=>(0,t.zG)("signIn/checkkey",e)},9287:function(e,r,s){s.d(r,{Y:function(){return o},A:function(){return u}});var t=s(5931),a={"common.oper":"Operated","common.operFail":"Operation failed","common.confirm":"Confirm","common.cancel":"Cancel","common.setting":"Setting","common.operating":"In operation","common.tips":"Tips","common.option":"Option","common.access":"No access","common.relay":"Relay","common.p2p":"P2P","common.refresh":"Refresh","head.home":"Home","head.server":"Server","head.protocol":"P2P Protocol","head.action":"Action","head.firewall":"Firewall","head.logger":"Logs","head.refresh":"Refresh","logger.list":"List","logger.setting":"Setting","logger.clear":"Clear","logger.refresh":"Refresh","logger.count":"Count","logger.level":"Level","logger.time":"Time","logger.content":"Content","action.text":"Set action static Json parameters","action.jsonError":"Json format error","server.messenger":"Messenger Server","server.group":"Group","server.sync":"Sync","server.messengerAddr":"Messenger Server","server.messengerText":"ip:port or domain:port","server.messengerSecretKey":"Messenger SecretKey","server.messengerSecretKeyText":"Messenger SecretKey","server.messengerUserId":"User Id","server.messengerUserIdText":"Your unique identifier,used to unlock something.","permission.closed":"Closed","permission.simple":"Simple","permission.full":"Full","permission.clear":"Clear connection","status.group":"Group manager","status.groupName":"Name","status.groupPassword":"Password","status.groupOper":"Oper","status.groupDelConfirm":"Are you sure to delete?","status.groupValidate":"Name or Id empty item has exists","status.support":"Support","status.website":"Website","status.doc":"Document","status.cdkey":"CDKEY store","status.export":"Export","status.exportText":"Export the configuration to run elsewhere","status.exportSingle":"Single","status.exportName":"Name","status.exportNamePlease":"Please input device name","status.exportApiPassword":"Api Pwd","status.exportApiPasswordPlease":"Please input api password","status.exportDownload":"Download","status.exportCopy":"Copy","status.exportSave":"Save","status.exportRelay":"Relay secretKey","status.exportSForward":"SForward secretKey","status.exportUpdater":"Update secretKey","status.exportServer":"Messenger server","status.exportGroup":"Group","status.exportTunnel":"Tunnel config","status.api":"Manager api","status.apiClear":"Clear","status.apiAlter":"Alter","status.apiAlterConfirm":"Are you sure?","status.messenger":"Messenger server","status.messengerName":"Messenger","status.messengerChange":"change your messenger","status.messengerGroup":"Group","status.serverVersion":"Server version","status.serverNoUpdate":"No updates","status.serverNotNew":"Not latest version","status.serverNew":"Is latest version","status.serverDownloading":"Downloading","status.serverDownloaded":"Downloaded","status.serverUnZipIng":"In unzip","status.serverUnZip":"Unzip","status.serverConfirm":"Are you sure to update server?","status.serverCloseConfirm":"Are you sure to close server?","status.flowOnline":"Online","status.flowUpload":"Up","status.flowDownload":"Down","status.flowThisServer":"This Server","status.flowAllServer":"All Server","status.flowAllSend":"Send","status.flowAllReceive":"Receive","status.flowOnline7Day":"Within seven days","status.flowServer":"Server","status.flowType":"Type","status.flowOper":"Oper","status.flowDetail":"Detail","status.flowMessenger":"Messenger","status.flowRelay":"Relay","status.flowRelayNode":"Relay Node","status.flowWanPort":"Wan Port","status.flowServerForward":"Server Forward","status.flowSearchName":"Name","status.flowRelaySource":"Source","status.flowRelayTarget":"Target","status.flowSearchDomainPort":"Domain/Port","status.flowArea":"Area","status.flowNet":"Network","status.tunnelName":"Name","status.tunnelLabel":"Label","status.tunnelProtocol":"Proto","status.tunnelBuffer":"Buffer","status.tunnelReverse":"Reverse","status.tunnelSSL":"SSL","status.tunnelDisanbled":"Disable","status.tunnelSort":"Index","status.tunnelYes":"Y","status.tunnelNo":"N","server.relaySecretKey":"Relay SecretKey","server.relaySSL":"Use SSL","server.relayDisable":"Disable","server.relayUseCdkey":"Use CDKEY","server.relayUseCdkeyTitle":"If you have a relay SecretKey, ignore it\r\n Without a relay SecretKey, you can choose to use a cdkey or default relay node config","server.relayNodes":"Nodes","server.relayTitle":"Relay Nodes","server.relayName":"Name","server.relayFlow":"Traffic/Month","server.relaySpeed":"Total","server.relaySpeed1":"Single","server.relaySpeed2":"Rate","server.relayConnection":"Conn","server.relayDelay":"Delay","server.relayPublic":"Public","server.relayAllow":"Allow","server.relayUrl":"Url","server.relayOper":"Oper","server.relayUse":"Use","server.relayMyCdkey":"My CDKEY","server.relayCdkey":"Manager CDKEY","server.relayAddCdkey":"Add CDKEY","server.relayCdkeyUserId":"UserId","server.relayCdkeyBandwidth":"Bandwidth","server.relayCdkeyBytes":"Bytes","server.relayCdkeyPay":"Pay","server.relayCdkeyOrder":"Order","server.relayCdkeyPrice":"Price","server.relayCdkeyPayPrice":"Pay price","server.relayCdkeyCostPrice":"Cost price","server.relayCdkeyUserPrice":"User price","server.relayCdkeyOrderId":"OrderNo","server.relayCdkeyContact":"Email","server.relayCdkeyRemark":"Remark","server.relayCdkeyAddTime":"Add","server.relayCdkeyStartTime":"Start","server.relayCdkeyEndTime":"End Time","server.relayCdkeyUseTime":"Use Time","server.relayCdkeyYear":"Year","server.relayCdkeyMonth":"Month","server.relayCdkeyDay":"Day","server.relayCdkeyHour":"Hour","server.relayCdkeyMin":"Min","server.relayCdkeySec":"Sec","server.relayCdkeyDuration":"Duration","server.relayCdkeyOper":"Oper","server.relayCdkeyDelConfirm":"Are you sure to delete?","server.relayCdkeyFlagAll":"All","server.relayCdkeyFlagTimein":"In end time","server.relayCdkeyFlagTimeout":"Out end time","server.relayCdkeyFlagBytesin":"Has bytes","server.relayCdkeyFlagBytesout":"Not have bytes","server.relayCdkeyFlagDeleted":"Deleted","server.relayCdkeyFlagUnDeleted":"Not deleted","server.relayCdkeyTestTitle":"Test CDKEY","server.relayCdkeyTestKey":"CDKEY","server.relayCdkeyTestGB":"GB","server.relayCdkeyTestGBError":"Must > 0","server.relayCdkeyTestSpeed":"Mbps","server.relayCdkeyTestSpeedError":"Must > 0","server.relayCdkeyTestTime":"Time","server.relayCdkeyTestTimeError":"Format error","server.relayCdkeyTestUserId":"UserId","server.relayCdkeyTestUserIdError":"UserId error","server.relayCdkeyTestOrderId":"OrderNo","server.relayCdkeyTestOrderIdError":"OrderNo is empty","server.relayCdkeyTestContact":"Contact","server.relayCdkeyTestCostPrice":"Cost","server.relayCdkeyTestPrice":"Price","server.relayCdkeyTestUserPrice":"User price","server.relayCdkeyTestPayPrice":"Pay","server.relayCdkeyTestCount":"Count","server.relayCdkeyTestCountError":"Must > 0","server.relayCdkeyTestType":"Type","server.relayCdkeyTestTypeError":"Must be relay","server.relayCdkeyTestParseError":"decode fail","server.relayCdkeyImport":"Import CDKEY","server.relayCdkeyImportParse":"Decode fail","server.relayCdkeyImportField":"Field invalid","server.relayCdkeyImportNetwork":"Network error","server.relayCdkeyImportOrderId":"OrderNo has exists","server.sforwardSecretKey":"Server forward secretKey","server.sforwardText":"The server forward can be used when the key is correct","server.updaterSecretKey":"Server update secretKey","server.updaterText":"The server update can be used when the key is correct","server.updaterRate":"Update check interval","server.updaterY":"Year","server.updaterM":"Mmonth","server.updaterD":"Day","server.updaterH":"Hour","server.updaterMM":"Minute","server.updaterS":"Second","server.asyncText":"to group all clients","server.asyncSelect":"Please select","server.asyncCheckAll":"Check all","server.asyncSignInSecretKey":"Signin secretKey","server.asyncSignInServer":"Signin server","server.asyncGroupSecretKey":"Group secretKey","server.asyncRelaySecretKey":"Relay secretKey","server.asyncSForwardSecretKey":"Server forward secretKey","server.asyncUpdaterSecretKey":"Update secretKey","server.asyncTunnelTransports":"Tunnel transports","server.asyncSignInUserId":"User Id","firewall.rule":"Firewall rule","firewall.srcName":"Src Device","firewall.dstCidr":"Dst IP","firewall.dstPort":"Dst Port","firewall.protocol":"Protocol","firewall.protocolall":"Protocol all","firewall.actionall":"Action all","firewall.action":"Action","firewall.actionAllow":"Allow","firewall.actionAllowAll":"Allow all","firewall.actionDeny":"Deny","firewall.actionDenyAll":"Deny all","firewall.orderby":"Order","firewall.enabled":"Enable","firewall.disabled":"Disable","firewall.disabledAll":"All state","firewall.del":"Del","firewall.edit":"Edit","firewall.delConfirm":"Are you sure to delete this rule?","firewall.switch":"Firewall switch,open or close","firewall.remark":"Remark","firewall.unselect":"All","firewall.selected":"Selected"},n={"common.oper":"已操作","common.operFail":"操作失败","common.confirm":"确认","common.cancel":"取消","common.setting":"设置","common.operating":"正在操作","common.tips":"提示","common.option":"选项","common.access":"无权限","common.relay":"中继","common.p2p":"打洞","common.refresh":"刷新","head.home":"首页","head.server":"服务器","head.group":"分组","head.protocol":"打洞协议","head.action":"验证","head.firewall":"防火墙","head.logger":"日志","head.refresh":"刷新","logger.list":"列表","logger.setting":"设置","logger.clear":"清空","logger.refresh":"刷新","logger.count":"数量","logger.level":"等级","logger.time":"时间","logger.content":"内容","action.text":"设置定义验证的静态Json参数","action.jsonError":"json格式错误","server.messenger":"信标服务器","server.group":"分组","server.sync":"同步","server.messengerAddr":"服务器地址","server.messengerText":"ip:端口 或者 域名:端口","server.messengerSecretKey":"信标密钥","server.messengerSecretKeyText":"密钥正确时可连接服务器","server.messengerUserId":"用户id","server.messengerUserIdText":"你的唯一标识,用于解锁一些限制","permission.closed":"禁止通行","permission.simple":"简单管理","permission.full":"专业管理","permission.clear":"清除连接","status.group":"管理分组","status.groupName":"名称","status.groupPassword":"密码","status.groupOper":"操作","status.groupDelConfirm":"确认删除吗?","status.groupValidate":"有名称或者id未设置的项","status.support":"赞助","status.website":"官网","status.doc":"文档","status.cdkey":"CDKEY商城","status.export":"导出配置","status.exportText":"导出配置,客户端覆盖配置文件,或粘贴配置信息,或在线加载","status.exportSingle":"单设备","status.exportName":"设备名","status.exportNamePlease":"请输入设备名","status.exportApiPassword":"接口密码","status.exportApiPasswordPlease":"请输入接口密码","status.exportDownload":"下载","status.exportCopy":"复制","status.exportSave":"保存","status.exportRelay":"中继密钥","status.exportSForward":"内网穿透密钥","status.exportUpdater":"更新密钥","status.exportServer":"信标服务器","status.exportGroup":"当前分组","status.exportTunnel":"打洞协议","status.api":"管理接口","status.apiClear":"清除","status.apiAlter":"更改","status.apiAlterConfirm":"确定你的操作?","status.messenger":"信标服务器","status.messengerChange":"更改你的连接设置","status.messengerName":"信标","status.messengerGroup":"分组名","status.messenger0":"登入信标","status.messenger1":"客户端列表","status.messenger2":"客户端删除","status.messenger4":"客户端改名(转发)","status.messenger7":"获取服务器版本","status.messenger8":"客户端搜索ids","status.messenger9":"客户端id列表","status.messenger10":"客户端排序","status.messenger11":"客户端在线","status.messenger12":"生成客户端id","status.messenger13":"登入信标V_1_3_1","status.messenger14":"名字列表","status.messenger2001":"外网端口(转发)","status.messenger2002":"外网端口(转发)","status.messenger2003":"开始打洞(转发)","status.messenger2004":"开始打洞(转发)","status.messenger2005":"打洞失败(转发)","status.messenger2006":"打洞失败(转发)","status.messenger2007":"打洞成功(转发)","status.messenger2008":"打洞成功(转发)","status.messenger2009":"隧道配置(转发)","status.messenger2010":"隧道配置(转发)","status.messenger2012":"隧道同步(转发)","status.messenger2101":"中继通知(转发)","status.messenger2102":"中继通知(转发)","status.messenger2103":"中继请求","status.messenger2105":"中继连通测试","status.messenger2201":"运行网卡(转发)","status.messenger2203":"停止网卡(转发)","status.messenger2204":"更新网卡","status.messenger2205":"更新网卡(转发)","status.messenger2208":"配置网卡网络","status.messenger2209":"获取网卡网络","status.messenger2210":"分配IP","status.messenger2211":"网卡变化","status.messenger2212":"网卡变化(转发)","status.messenger2213":"IP续约","status.messenger2214":"网卡端口转发检测","status.messenger2215":"网卡端口转发检测(转发)","status.messenger2301":"添加内网穿透","status.messenger2302":"移除内网穿透","status.messenger2303":"通知内网穿透(转发)","status.messenger2304":"通知内网穿透UDP(转发)","status.messenger2305":"获取穿透列表(转发)","status.messenger2401":"测试端口转发(转发)","status.messenger2403":"获取端口转发(转发)","status.messenger2507":"同步配置","status.messenger2508":"同步配置(转发)","status.messenger2601":"更新信息(转发)","status.messenger2602":"更新信息(转发)","status.messenger2603":"确认更新(转发)","status.messenger2604":"确认更新(转发)","status.messenger2605":"重启(转发)","status.messenger2606":"重启","status.messenger2607":"服务器更新信息","status.messenger2608":"确认服务器更新","status.messenger2609":"服务器重启","status.messenger2610":"订阅更新信息(转发)","status.messenger2611":"订阅更新信息(转发)","status.messenger2612":"检查更新","status.messenger2613":"检查更新(转发)","status.messenger2701":"服务器流量","status.messenger2702":"服务器信标流量","status.messenger2703":"服务器中继流量","status.messenger2704":"服务器内网穿透流量","status.messenger2807":"同步配置","status.messenger2808":"同步配置(转发)","status.messenger2812":"同步推送","status.messenger2813":"同步拉取","status.messenger2814":"同步通知","status.messenger2815":"同步分页拉取","status.messenger2900":"运行socks5","status.messenger2901":"运行socks5(转发)","status.messenger2902":"停止socks5","status.messenger2903":"停止socks5(转发)","status.messenger2904":"更新socks5","status.messenger2905":"更新socks5(转发)","status.messenger3003":"获取权限","status.messenger3004":"获取权限(转发)","status.messenger3005":"更新权限","status.messenger3006":"更新权限(转发)","status.serverVersion":"服务端的程序版本","status.serverNoUpdate":"未检测到更新","status.serverNotNew":"不是最新版本","status.serverNew":"是最新版本","status.serverDownloading":"正在下载","status.serverDownloaded":"已下载","status.serverUnZipIng":"正在解压","status.serverUnZip":"已解压","status.serverConfirm":"确定更新服务端吗?","status.serverCloseConfirm":"确定关闭服务端吗?","status.flowOnline":"在线","status.flowUpload":"上传","status.flowDownload":"下载","status.flowThisServer":"本服务器","status.flowAllServer":"所有服务器","status.flowAllSend":"发送","status.flowAllReceive":"接收","status.flowOnline7Day":"7天内上线","status.flowServer":"服务器","status.flowType":"类别","status.flowOper":"操作","status.flowDetail":"详情","status.flowMessenger":"信标","status.flowRelay":"中继","status.flowRelayNode":"中继节点","status.flowWanPort":"外网端口","status.flowServerForward":"内网穿透","status.flowSearchName":"名字搜索","status.flowRelaySource":"发起端","status.flowRelayTarget":"目标端","status.flowSearchDomainPort":"域名/端口","status.flowArea":"地区","status.flowNet":"网络","status.tunnelName":"名称","status.tunnelLabel":"说明","status.tunnelProtocol":"协议","status.tunnelBuffer":"缓冲区","status.tunnelReverse":"反向","status.tunnelSSL":"SSL","status.tunnelDisanbled":"禁用","status.tunnelSort":"排序","status.tunnelYes":"是","status.tunnelNo":"否","server.relaySecretKey":"中继密钥","server.relaySSL":"使用ssl","server.relayDisable":"禁用","server.relayUseCdkey":"消耗CDKEY","server.relayUseCdkeyTitle":"如果你有中继密钥,你没有任何限制,也不会消耗CDKEY,可以不管这个\r\n没有中继密钥,有CDKEY,但是不想使用CDKEY,只想使用中继节点默认的限制,就去掉勾选","server.relayNodes":"节点","server.relayTitle":"中继节点","server.relayName":"名称","server.relayFlow":"月流量","server.relayFlowLast":"剩余流量","server.relaySpeed":"带宽","server.relaySpeed1":"总带宽","server.relaySpeed2":"速率","server.relayConnection":"连接数","server.relayDelay":"延迟","server.relayPublic":"公开","server.relayAllow":"支持协议","server.relayUrl":"Url","server.relayOper":"操作","server.relayUse":"使用","server.relayMyCdkey":"我的CDKEY","server.relayCdkey":"管理CDKEY","server.relayAddCdkey":"添加CDKEY","server.relayCdkeyUserId":"用户标识","server.relayCdkeyBandwidth":"带宽","server.relayCdkeyBytes":"流量","server.relayCdkeyPay":"支付","server.relayCdkeyPrice":"原价","server.relayCdkeyPayPrice":"支付","server.relayCdkeyCostPrice":"成本","server.relayCdkeyUserPrice":"会员价","server.relayCdkeyOrder":"订单","server.relayCdkeyOrderId":"订单号","server.relayCdkeyContact":"邮箱","server.relayCdkeyRemark":"备注","server.relayCdkeyAddTime":"添加","server.relayCdkeyStartTime":"开始","server.relayCdkeyEndTime":"有效时间","server.relayCdkeyUseTime":"最后使用","server.relayCdkeyYear":"年","server.relayCdkeyMonth":"月","server.relayCdkeyDay":"日","server.relayCdkeyHour":"时","server.relayCdkeyMin":"分","server.relayCdkeySec":"秒","server.relayCdkeyDuration":"持续时间","server.relayCdkeyOper":"操作","server.relayCdkeyDelConfirm":"确认删除吗?","server.relayCdkeyFlagAll":"全部","server.relayCdkeyFlagTimein":"有效期内","server.relayCdkeyFlagTimeout":"有效期外","server.relayCdkeyFlagBytesin":"剩余","server.relayCdkeyFlagBytesout":"已用完","server.relayCdkeyFlagDeleted":"已删除","server.relayCdkeyFlagUnDeleted":"未删除","server.relayCdkeyTestTitle":"测试解密CDKEY","server.relayCdkeyTestKey":"CDKEY","server.relayCdkeyTestGB":"流量","server.relayCdkeyTestGBError":"流量要大于0","server.relayCdkeyTestSpeed":"带宽Mbps","server.relayCdkeyTestSpeedError":"带宽要大于0","server.relayCdkeyTestTime":"持续时间","server.relayCdkeyTestTimeError":"格式错误","server.relayCdkeyTestUserId":"用户标识","server.relayCdkeyTestUserIdError":"用户标识不正确","server.relayCdkeyTestOrderId":"订单","server.relayCdkeyTestOrderIdError":"订单号不能为空","server.relayCdkeyTestContact":"联系方式","server.relayCdkeyTestCostPrice":"成本","server.relayCdkeyTestPrice":"原价","server.relayCdkeyTestUserPrice":"会员价","server.relayCdkeyTestPayPrice":"支付","server.relayCdkeyTestCount":"数量","server.relayCdkeyTestCountError":"数量要大于0","server.relayCdkeyTestType":"类别","server.relayCdkeyTestTypeError":"类别应该是Relay","server.relayCdkeyTestParseError":"解密失败","server.relayCdkeyImport":"导入CDKEY","server.relayCdkeyImportParse":"解密失败","server.relayCdkeyImportField":"字段有误","server.relayCdkeyImportNetwork":"网络错误","server.relayCdkeyImportOrderId":"订单号已存在","server.sforwardSecretKey":"服务器穿透密钥","server.sforwardText":"当密钥正确是可用","server.updaterSecretKey":"服务器更新密钥","server.updaterText":"当密钥正确是可用","server.updaterRate":"检查更新频率","server.updaterY":"年","server.updaterM":"月","server.updaterD":"日","server.updaterH":"时","server.updaterMM":"分","server.updaterS":"秒","server.asyncText":"到本组所有客户端","server.asyncSelect":"请选择","server.asyncCheckAll":"全选","server.asyncSignInSecretKey":"信标密钥","server.asyncSignInServer":"信标服务器","server.asyncGroupSecretKey":"分组密钥","server.asyncRelaySecretKey":"中继密钥","server.asyncSForwardSecretKey":"服务器穿透密钥","server.asyncUpdaterSecretKey":"更新密钥","server.asyncTunnelTransports":"打洞协议","server.asyncSignInUserId":"用户唯一标识","firewall.rule":"防火墙协议","firewall.srcName":"源设备","firewall.dstCidr":"目标IP","firewall.dstPort":"目标端口","firewall.protocolall":"全部协议","firewall.protocol":"协议","firewall.actionall":"全部操作","firewall.action":"操作","firewall.actionAllow":"允许","firewall.actionAllowAll":"允许全部","firewall.actionDeny":"阻止","firewall.actionDenyAll":"阻止全部","firewall.orderby":"顺序","firewall.enabled":"启用","firewall.disabled":"禁用","firewall.disabledAll":"全部状态","firewall.del":"删除","firewall.edit":"修改","firewall.delConfirm":"确认删除规则?","firewall.switch":"防火墙开关,是否开启防火墙","firewall.remark":"备注","firewall.unselect":"未选择","firewall.selected":"已选择"};const o={"zh-CN":"简体中文","en-US":"English"},l=(0,t.hU)({locale:localStorage.getItem("locale-lang")||navigator.language||navigator.browserLanguage,fallbackLocale:"zh-CN",legacy:!1,allowComposition:!0,messages:{"en-US":a,"zh-CN":n}});var u=l},2773:function(e,r,s){s.d(r,{A:function(){return n}});var t=s(6768),a=s(5931);function n(){const e=(0,a.s9)(),r=(0,t.EW)((()=>e.locale.value)),s=r=>{e.locale.value!==r&&(e.locale.value=r,localStorage.setItem("locale-lang",r))};return{currentLocale:r,changeLocale:s}}},2441:function(e,r,s){var t=s(5130),a=s(6768),n=s(4232);function o(e,r,s,t,o,l){const u=(0,a.g2)("router-view"),i=(0,a.g2)("Api"),d=(0,a.g2)("el-config-provider"),c=(0,a.g2)("Refresh");return(0,a.uX)(),(0,a.CE)(a.FK,null,[(0,a.Lk)("div",{class:(0,n.C4)({phone:t.globalData.isPhone})},[(0,a.bF)(d,{locale:t.locale},{default:(0,a.k6)((()=>[t.configed?((0,a.uX)(),(0,a.Wv)(u,{key:0})):(0,a.Q3)("",!0),(0,a.bF)(i)])),_:1},8,["locale"])],2),(0,a.bF)(c)],64)}var l=s(3830);const u={class:"port-wrap t-c"},i={class:"pdt-10"},d={class:"pdt-10"};function c(e,r,s,n,o,l){const c=(0,a.g2)("el-input"),y=(0,a.g2)("el-checkbox"),v=(0,a.g2)("el-button"),p=(0,a.g2)("el-dialog");return(0,a.uX)(),(0,a.Wv)(p,{class:"options-center",title:"管理接口","destroy-on-close":"",modelValue:n.showPort,"onUpdate:modelValue":r[3]||(r[3]=e=>n.showPort=e),center:"","show-close":!1,"close-on-click-modal":!1,"align-center":"",width:"200"},{footer:(0,a.k6)((()=>[(0,a.bF)(v,{type:"success",onClick:n.handleConnect1,plain:""},{default:(0,a.k6)((()=>[(0,a.eW)("确 定")])),_:1},8,["onClick"])])),default:(0,a.k6)((()=>[(0,a.Lk)("div",u,[(0,a.Lk)("div",null,[(0,a.eW)(" 接口 : "),(0,a.bF)(c,{modelValue:n.state.api,"onUpdate:modelValue":r[0]||(r[0]=e=>n.state.api=e),style:{width:"70%"},onKeyup:(0,t.jR)(n.handleConnect1,["enter"])},null,8,["modelValue","onKeyup"])]),(0,a.Lk)("div",i,[(0,a.eW)(" 秘钥 : "),(0,a.bF)(c,{"show-password":"",type:"password",modelValue:n.state.psd,"onUpdate:modelValue":r[1]||(r[1]=e=>n.state.psd=e),style:{width:"70%"},onKeyup:(0,t.jR)(n.handleConnect1,["enter"])},null,8,["modelValue","onKeyup"])]),(0,a.Lk)("div",d,[(0,a.bF)(y,{modelValue:n.state.save,"onUpdate:modelValue":r[2]||(r[2]=e=>n.state.save=e)},{default:(0,a.k6)((()=>[(0,a.eW)("保存密码")])),_:1},8,["modelValue"])])])])),_:1},8,["modelValue"])}var y=s(1387),v=s(144),p=s(4),m=s(9299),g=s(8835),f=s(7477),C={components:{Tools:f.S0q},props:["config"],setup(e){const r=(0,l.B)(),s=(0,y.rd)(),t=(0,y.lq)(),n={api:`${window.location.hostname}:1803`,psd:"snltty"},o=JSON.parse(sessionStorage.getItem("api-cache")||localStorage.getItem("api-cache")||JSON.stringify(n)),u=(0,v.Kh)({api:o.api,psd:o.psd,showPort:!1,save:o.save||!1}),i=(0,a.EW)((()=>0==r.value.api.connected&&u.showPort)),d=()=>{o.api=u.api,o.psd=u.psd,o.save=u.save,u.save?localStorage.setItem("api-cache",JSON.stringify(o)):localStorage.setItem("api-cache",""),sessionStorage.setItem("api-cache",JSON.stringify(o)),(0,p.e3)();const e=`ws${"https:"===window.location.protocol?"s":""}://${u.api}`;(0,p.a1)(e,u.psd)},c=()=>{d(),window.location.reload()},f=()=>{(0,g.zj)().then((e=>{r.value.config.Common=e.Common,r.value.config.Client=e.Client,r.value.config.Server=e.Server,r.value.config.Running=e.Running,r.value.config.configed=!0,setTimeout((()=>{f()}),1e3)})).catch((e=>{setTimeout((()=>{f()}),1e3)}))},C=()=>{(0,m.SZ)().then((e=>{r.value.signin.Connected=e.Connected,r.value.signin.Version=e.Version,setTimeout((()=>{C()}),1e3)})).catch((e=>{setTimeout((()=>{C()}),1e3)}))};return(0,a.sV)((()=>{setTimeout((()=>{u.showPort=!0}),500),(0,p.jH)((e=>{e&&(f(),C())})),s.isReady().then((()=>{u.api=t.query.api?`${window.location.hostname}:${t.query.api}`:u.api,u.psd=t.query.psd||u.psd,d()}))})),{state:u,showPort:i,handleConnect1:c}}},h=s(1241);const w=(0,h.A)(C,[["render",c],["__scopeId","data-v-08aa73f8"]]);var k=w,S=s(2721),T=s(6726),b=s(2773);const P={class:"percentage-value"};function D(e,r,s,t,o,l){const u=(0,a.g2)("el-progress");return t.state.show?((0,a.uX)(),(0,a.CE)("div",{key:0,class:"refresh-wrap",style:(0,n.Tr)({top:t.state.dy/4+"px"})},[(0,a.bF)(u,{type:"circle",percentage:t.state.percentage,width:"50"},{default:(0,a.k6)((({percentage:e})=>[(0,a.Lk)("span",P,(0,n.v_)(e)+"%",1)])),_:1},8,["percentage"])],4)):(0,a.Q3)("",!0)}var A={setup(){const e=(0,v.Kh)({percentage:50,show:!1,touchY:0,dy:0,start:0}),r=r=>{e.percentage=0;const s=r.touches[0];e.touchY=s.clientY,e.start=Date.now()},s=r=>{const s=r.touches[0],t=s.clientY;if(0==e.show&&Date.now()-e.start>300&&(e.show=!0,e.touchY=t),e.show){const r=parseInt(t-e.touchY);e.dy=r,e.percentage=r,e.percentage>100&&(e.percentage=100)}},t=r=>{e.percentage>=100&&e.show&&window.location.reload(),e.show=!1,e.dy=0};return(0,a.sV)((()=>{document.addEventListener("touchstart",r),document.addEventListener("touchmove",s),document.addEventListener("touchend",t),document.addEventListener("touchcancel",t)})),{state:e}}};const I=(0,h.A)(A,[["render",D],["__scopeId","data-v-dfc7a2f2"]]);var N=I,K={components:{Api:k,Refresh:N},setup(e){const r=(0,l.v)(),s=(0,a.EW)((()=>r.value.config.configed)),{currentLocale:t}=(0,b.A)(),n=(0,a.EW)((()=>"zh-CN"==t.value?S.A:T.A));return{configed:s,locale:n,globalData:r}}};const E=(0,h.A)(K,[["render",o]]);var x=E;const U=[{path:"/",name:"Full",component:()=>Promise.all([s.e(754),s.e(842),s.e(537)]).then(s.bind(s,146)),redirect:"/full/index.html",children:[{path:"/full/index.html",name:"FullIndex",component:()=>Promise.all([s.e(754),s.e(799),s.e(827),s.e(620)]).then(s.bind(s,9924))},{path:"/full/servers.html",name:"FullServers",component:()=>s.e(855).then(s.bind(s,7855))},{path:"/full/transport.html",name:"FullTransport",component:()=>s.e(32).then(s.bind(s,4032))},{path:"/full/action.html",name:"FullAction",component:()=>s.e(340).then(s.bind(s,3959))},{path:"/full/firewall.html",name:"FullFirewall",component:()=>Promise.all([s.e(827),s.e(607)]).then(s.bind(s,91))},{path:"/full/logger.html",name:"FullLogger",component:()=>s.e(372).then(s.bind(s,8372))}]},{path:"/net/index.html",name:"Network",component:()=>Promise.all([s.e(754),s.e(842),s.e(799),s.e(127)]).then(s.bind(s,7332))},{path:"/no-permission.html",name:"NoPermission",component:()=>s.e(228).then(s.bind(s,6100))}],O=(0,y.aE)({history:(0,y.Bt)(),routes:U});var F=O,R=s(9287),B=s(6161);s(4188),s(2355),s(1862);const M=(0,t.Ef)(x);M.use(R.A),M.use(B.A,{size:"default"}).use(F).mount("#app")},3830:function(e,r,s){s.d(r,{B:function(){return u},v:function(){return l}});var t=s(4),a=s(144),n=s(6768);const o=Symbol(),l=()=>{const e=(0,a.KR)({api:{connected:!1},width:0,height:0,isPhone:(0,n.EW)((()=>e.value.width<800)),isPc:(0,n.EW)((()=>e.value.width>=800)),config:{Common:{},Client:{Servers:[],Accesss:{}},Server:{},Running:{Relay:{Servers:[]},Tuntap:{IP:"",PrefixLength:24},Client:{Servers:[]},AutoSyncs:{}},configed:!1},signin:{Connected:!1,Version:"v1.0.0.0"},bufferSize:["1KB","2KB","4KB","8KB","16KB","32KB","64KB","128KB","256KB","512KB","1024KB"],self:{},hasAccess(e){if(void 0==this.config.Client.Accesss[e])return!1;const r=this.config.Client.Accesss[e].Value||-1,s=this.config.Client.Access||-1;return s>=0&&(0==s||+(BigInt(s)&BigInt(r)).toString()==r)}});return(0,t.jH)((r=>{e.value.api.connected=r})),(0,n.Gt)(o,e),e},u=()=>(0,n.WQ)(o)}},r={};function s(t){var a=r[t];if(void 0!==a)return a.exports;var n=r[t]={id:t,loaded:!1,exports:{}};return e[t].call(n.exports,n,n.exports,s),n.loaded=!0,n.exports}s.m=e,function(){var e=[];s.O=function(r,t,a,n){if(!t){var o=1/0;for(d=0;d=n)&&Object.keys(s.O).every((function(e){return s.O[e](t[u])}))?t.splice(u--,1):(l=!1,n0&&e[d-1][2]>n;d--)e[d]=e[d-1];e[d]=[t,a,n]}}(),function(){s.n=function(e){var r=e&&e.__esModule?function(){return e["default"]}:function(){return e};return s.d(r,{a:r}),r}}(),function(){s.d=function(e,r){for(var t in r)s.o(r,t)&&!s.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:r[t]})}}(),function(){s.f={},s.e=function(e){return Promise.all(Object.keys(s.f).reduce((function(r,t){return s.f[t](e,r),r}),[]))}}(),function(){s.u=function(e){return"js/"+e+"."+{32:"8c1e93e5",127:"a66584e8",228:"45b76490",340:"9d567527",372:"b76e2e4d",537:"12fad626",607:"aeb1fa01",620:"066ac82f",754:"41d58001",799:"891cca57",827:"0176a953",842:"190b03a1",855:"30d7a699"}[e]+".js"}}(),function(){s.miniCssF=function(e){return"css/"+e+"."+{32:"1374e89e",127:"3f1d3153",228:"b2a71eca",340:"f859e18d",372:"e4499fe6",537:"dbf0921b",607:"ea51f44d",620:"0ab65a4a",855:"ebb7f022"}[e]+".css"}}(),function(){s.g=function(){if("object"===typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"===typeof window)return window}}()}(),function(){s.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)}}(),function(){var e={},r="linker.web:";s.l=function(t,a,n,o){if(e[t])e[t].push(a);else{var l,u;if(void 0!==n)for(var i=document.getElementsByTagName("script"),d=0;dhttps://github.com/snltty/linker
https://github.com/snltty/linker
linker tun
- 1.7.9
- 1.7.9
- 1.7.9
+ 1.8.0
+ 1.8.0
+ 1.8.0
diff --git a/src/linker.tunnel/linker.tunnel.csproj b/src/linker.tunnel/linker.tunnel.csproj
index 86ebb00c..da06c586 100644
--- a/src/linker.tunnel/linker.tunnel.csproj
+++ b/src/linker.tunnel/linker.tunnel.csproj
@@ -16,9 +16,9 @@
https://github.com/snltty/linker
https://github.com/snltty/linker
linker tunnel
- 1.7.9
- 1.7.9
- 1.7.9
+ 1.8.0
+ 1.8.0
+ 1.8.0
diff --git a/src/linker.tunnel/transport/TransportMsQuic.cs b/src/linker.tunnel/transport/TransportMsQuic.cs
index 765b0735..a39d040f 100644
--- a/src/linker.tunnel/transport/TransportMsQuic.cs
+++ b/src/linker.tunnel/transport/TransportMsQuic.cs
@@ -247,6 +247,7 @@ namespace linker.tunnel.transport
}
catch (Exception ex)
{
+ taskCompletionSource.TrySetResult(null);
if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
{
LoggerHelper.Instance.Error(ex);
@@ -328,6 +329,7 @@ namespace linker.tunnel.transport
}
catch (Exception)
{
+ tcs.TrySetResult(null);
}
finally
{
@@ -361,7 +363,7 @@ namespace linker.tunnel.transport
IPEndPoint ep = result.RemoteEndPoint as IPEndPoint;
await socketUdp.SendToAsync(endBytes, ep).ConfigureAwait(false);
- tcs.SetResult(ep);
+ tcs.TrySetResult(ep);
}
catch (Exception ex)
{
@@ -445,10 +447,10 @@ namespace linker.tunnel.transport
QuicEP = quicEP,
State = state
};
+
+ TaskCompletionSource tcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
try
{
- TaskCompletionSource tcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
-
udpClient.ReuseBind(local);
udpClient.WindowsUdpBug();
_ = WaitAuth(bufferSize, token, tcs);
@@ -457,6 +459,7 @@ namespace linker.tunnel.transport
}
catch (Exception ex)
{
+ tcs.TrySetResult(AddressFamily.InterNetwork);
token.Clear();
if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
{
@@ -486,7 +489,7 @@ namespace linker.tunnel.transport
if (memory.Length == endBytes.Length && memory.Span.SequenceEqual(endBytes))
{
token.RemoteEP = result.RemoteEndPoint as IPEndPoint;
- tcs.SetResult(result.RemoteEndPoint.AddressFamily);
+ tcs.TrySetResult(result.RemoteEndPoint.AddressFamily);
_ = Connect2Quic(bufferSize, token);
break;
}
@@ -590,7 +593,7 @@ namespace linker.tunnel.transport
{
if (reverseDic.TryRemove(tunnelTransportInfo.Remote.MachineId, out TaskCompletionSource tcs))
{
- tcs.SetResult(null);
+ tcs.TrySetResult(null);
}
}
///
@@ -601,7 +604,7 @@ namespace linker.tunnel.transport
{
if (reverseDic.TryRemove(tunnelTransportInfo.Remote.MachineId, out TaskCompletionSource tcs))
{
- tcs.SetResult(null);
+ tcs.TrySetResult(null);
}
}
@@ -633,7 +636,7 @@ namespace linker.tunnel.transport
};
if (reverseDic.TryRemove(state.Remote.MachineId, out TaskCompletionSource tcs))
{
- tcs.SetResult(result);
+ tcs.TrySetResult(result);
return;
}
OnConnected(result);
diff --git a/src/linker.tunnel/transport/TransportTcpNutssb.cs b/src/linker.tunnel/transport/TransportTcpNutssb.cs
index d425e567..fc5f862b 100644
--- a/src/linker.tunnel/transport/TransportTcpNutssb.cs
+++ b/src/linker.tunnel/transport/TransportTcpNutssb.cs
@@ -139,14 +139,14 @@ namespace linker.tunnel.transport
{
if (reverseDic.TryRemove(tunnelTransportInfo.Remote.MachineId, out TaskCompletionSource tcs))
{
- tcs.SetResult(null);
+ tcs.TrySetResult(null);
}
}
public void OnSuccess(TunnelTransportInfo tunnelTransportInfo)
{
if (reverseDic.TryRemove(tunnelTransportInfo.Remote.MachineId, out TaskCompletionSource tcs))
{
- tcs.SetResult(null);
+ tcs.TrySetResult(null);
}
}
@@ -253,6 +253,7 @@ namespace linker.tunnel.transport
}
catch (Exception)
{
+ tcs.TrySetResult(null);
}
finally
{
@@ -302,7 +303,7 @@ namespace linker.tunnel.transport
};
if (reverseDic.TryRemove(_state.Remote.MachineId, out TaskCompletionSource tcs))
{
- tcs.SetResult(result);
+ tcs.TrySetResult(result);
return;
}
diff --git a/src/linker.tunnel/transport/TransportTcpPortMap.cs b/src/linker.tunnel/transport/TransportTcpPortMap.cs
index a34b3f93..c81b3664 100644
--- a/src/linker.tunnel/transport/TransportTcpPortMap.cs
+++ b/src/linker.tunnel/transport/TransportTcpPortMap.cs
@@ -105,7 +105,7 @@ namespace linker.tunnel.transport
if (distDic.TryRemove(key, out TaskCompletionSource tcs))
{
await client.SendAsync(bytes.AsMemory(0, length)).ConfigureAwait(false);
- tcs.SetResult(client);
+ tcs.TrySetResult(client);
return;
}
}
@@ -287,6 +287,7 @@ namespace linker.tunnel.transport
}
catch (Exception)
{
+ tcs.TrySetResult(null);
}
finally
{
diff --git a/src/linker.tunnel/transport/TransportUdp.cs b/src/linker.tunnel/transport/TransportUdp.cs
index b37966bc..4e6d2740 100644
--- a/src/linker.tunnel/transport/TransportUdp.cs
+++ b/src/linker.tunnel/transport/TransportUdp.cs
@@ -198,6 +198,7 @@ namespace linker.tunnel.transport
}
catch (Exception ex)
{
+ taskCompletionSource.TrySetResult(null);
if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
{
LoggerHelper.Instance.Error(ex);
@@ -228,7 +229,7 @@ namespace linker.tunnel.transport
SocketReceiveFromResult result = await socket.ReceiveFromAsync(buffer, new IPEndPoint(IPAddress.IPv6Any, 0)).ConfigureAwait(false);
await socket.SendToAsync(endBytes, result.RemoteEndPoint).ConfigureAwait(false);
- tcs.SetResult(result.RemoteEndPoint as IPEndPoint);
+ tcs.TrySetResult(result.RemoteEndPoint as IPEndPoint);
});
return socket;
}
@@ -256,7 +257,14 @@ namespace linker.tunnel.transport
};
_ = ListenReceiveCallback(token);
- AddressFamily af = await token.Tcs.Task.WaitAsync(TimeSpan.FromMilliseconds(30000)).ConfigureAwait(false);
+ try
+ {
+ AddressFamily af = await token.Tcs.Task.WaitAsync(TimeSpan.FromMilliseconds(30000)).ConfigureAwait(false);
+ }
+ catch (Exception)
+ {
+ token.Tcs.TrySetResult(AddressFamily.InterNetwork);
+ }
}
catch (Exception ex)
{
@@ -273,7 +281,7 @@ namespace linker.tunnel.transport
{
byte[] buffer = new byte[8 * 1024];
IPEndPoint ep = new IPEndPoint(IPAddress.IPv6Any, 0);
- while (true)
+ while (token.Tcs.Task.IsCompleted == false)
{
SocketReceiveFromResult result = await token.LocalUdp.ReceiveFromAsync(buffer, ep).ConfigureAwait(false);
if (result.ReceivedBytes == 0) break;
@@ -281,7 +289,7 @@ namespace linker.tunnel.transport
{
if (token.Tcs != null && token.Tcs.Task.IsCompleted == false)
{
- token.Tcs.SetResult(result.RemoteEndPoint.AddressFamily);
+ token.Tcs.TrySetResult(result.RemoteEndPoint.AddressFamily);
await OnUdpConnected(token.State, token.LocalUdp, result.RemoteEndPoint as IPEndPoint).ConfigureAwait(false);
}
break;
@@ -359,6 +367,7 @@ namespace linker.tunnel.transport
}
catch (Exception)
{
+ tcs.TrySetResult(null);
}
finally
{
@@ -375,7 +384,7 @@ namespace linker.tunnel.transport
{
if (reverseDic.TryRemove(tunnelTransportInfo.Remote.MachineId, out TaskCompletionSource tcs))
{
- tcs.SetResult(null);
+ tcs.TrySetResult(null);
}
}
///
@@ -386,7 +395,7 @@ namespace linker.tunnel.transport
{
if (reverseDic.TryRemove(tunnelTransportInfo.Remote.MachineId, out TaskCompletionSource tcs))
{
- tcs.SetResult(null);
+ tcs.TrySetResult(null);
}
}
@@ -417,7 +426,7 @@ namespace linker.tunnel.transport
};
if (reverseDic.TryRemove(state.Remote.MachineId, out TaskCompletionSource tcs))
{
- tcs.SetResult(result);
+ tcs.TrySetResult(result);
return;
}
OnConnected(result);
diff --git a/src/linker.tunnel/transport/TransportUdpPortMap.cs b/src/linker.tunnel/transport/TransportUdpPortMap.cs
index a7e6eee4..f278a305 100644
--- a/src/linker.tunnel/transport/TransportUdpPortMap.cs
+++ b/src/linker.tunnel/transport/TransportUdpPortMap.cs
@@ -113,7 +113,7 @@ namespace linker.tunnel.transport
try
{
State state = new State { Socket = socket, RemoteEndPoint = remoteEP };
- tcs.SetResult(state);
+ tcs.TrySetResult(state);
}
catch (Exception)
{
@@ -287,6 +287,7 @@ namespace linker.tunnel.transport
}
catch (Exception)
{
+ tcs.TrySetResult(null);
}
finally
{
diff --git a/src/linker.web/src/lang/en-us.js b/src/linker.web/src/lang/en-us.js
index 1c935bec..0841d1f1 100644
--- a/src/linker.web/src/lang/en-us.js
+++ b/src/linker.web/src/lang/en-us.js
@@ -20,7 +20,6 @@ export default {
'head.logger': 'Logs',
'head.refresh': 'Refresh',
-
'logger.list': 'List',
'logger.setting': 'Setting',
'logger.clear': 'Clear',
diff --git a/src/linker.web/src/lang/zh-cn.js b/src/linker.web/src/lang/zh-cn.js
index 3683e25a..0470d492 100644
--- a/src/linker.web/src/lang/zh-cn.js
+++ b/src/linker.web/src/lang/zh-cn.js
@@ -21,7 +21,6 @@ export default {
'head.logger': '日志',
'head.refresh': '刷新',
-
'logger.list': '列表',
'logger.setting': '设置',
'logger.clear': '清空',
@@ -330,8 +329,6 @@ export default {
'server.updaterMM': '分',
'server.updaterS': '秒',
-
-
'server.asyncText': '到本组所有客户端',
'server.asyncSelect': '请选择',
'server.asyncCheckAll': '全选',
@@ -344,7 +341,6 @@ export default {
'server.asyncTunnelTransports': '打洞协议',
'server.asyncSignInUserId': '用户唯一标识',
-
'firewall.rule': '防火墙协议',
'firewall.srcName': '源设备',
'firewall.dstCidr': '目标IP',
diff --git a/src/linker.web/src/views/full/devices/PlanEdit.vue b/src/linker.web/src/views/full/devices/PlanEdit.vue
index 5a969466..aa4f7446 100644
--- a/src/linker.web/src/views/full/devices/PlanEdit.vue
+++ b/src/linker.web/src/views/full/devices/PlanEdit.vue
@@ -112,31 +112,31 @@ export default {
const state = reactive({
show: true,
loading: false,
- ruleCron:{
+ ruleCron:{
week:'*',
month:'*',
day:'*',
hour:'*',
min:'*',
sec:'30',
- },
- ruleAt:{
+ },
+ ruleAt:{
type:3,
month:'*',
day:'*',
hour:0,
min:0,
sec:0,
- },
- ruleTimer:{
+ },
+ ruleTimer:{
year:0,
month:0,
day:0,
hour:0,
min:0,
sec:30,
- },
- ruleTrigger:{
+ },
+ ruleTrigger:{
year:0,
month:0,
day:0,
@@ -158,11 +158,11 @@ export default {
rules: {}
});
watch(() => state.show, (val) => {
- if (!val) {
+ if (!val) {
setTimeout(() => {
emit('update:modelValue', val);
}, 300);
- }
+ }
});
const decodeRuleJson = {
diff --git a/src/linker.web/src/views/full/devices/Tunnel.vue b/src/linker.web/src/views/full/devices/Tunnel.vue
index c7e76f16..f69887be 100644
--- a/src/linker.web/src/views/full/devices/Tunnel.vue
+++ b/src/linker.web/src/views/full/devices/Tunnel.vue
@@ -20,13 +20,19 @@
+
+ {{ natMap[tunnel.list[scope.row.MachineId].Net.Nat] }}
+
+
+
+
@@ -85,6 +91,19 @@ export default {
}
return `./system.svg`;
}
+
+ const natMap = {
+ "Unknown":'?',
+ "UnsupportedServer":'?',
+ "UdpBlocked":'?',
+ "OpenInternet":'?',
+ "SymmetricUdpFirewall":'?',
+ "FullCone":'1',
+ "RestrictedCone":'2',
+ "PortRestrictedCone":'3',
+ "Symmetric":'4',
+ }
+
const connectionCount = (machineId)=>{
const length = [
forwardConnections.value.list[machineId],
@@ -116,7 +135,7 @@ export default {
return {
tunnel, handleTunnel,handleTunnelRefresh,
- connectionCount,handleConnections,title,netImg
+ connectionCount,handleConnections,title,netImg,natMap
}
}
}
@@ -127,9 +146,12 @@ export default {
.green{font-weight:bold;}
-img.system{
+img.system,span.nat{
height:1.4rem;
margin-right:.4rem
border: 1px solid #eee;
+ line-height:1.4rem;
+ vertical-align:middle;
}
+span.nat{display:inline-block;padding:0 .2rem;margin-right:0;font-family: fantasy;}
\ No newline at end of file
diff --git a/src/linker.web/src/views/full/status/Index.vue b/src/linker.web/src/views/full/status/Index.vue
index ef8cf351..7f8012db 100644
--- a/src/linker.web/src/views/full/status/Index.vue
+++ b/src/linker.web/src/views/full/status/Index.vue
@@ -12,7 +12,7 @@
{{$t('status.cdkey')}}
-
+
diff --git a/src/linker/Program.cs b/src/linker/Program.cs
index e6fc8855..53407b67 100644
--- a/src/linker/Program.cs
+++ b/src/linker/Program.cs
@@ -23,7 +23,8 @@ namespace linker
};
TaskScheduler.UnobservedTaskException += (a, b) =>
{
- LoggerHelper.Instance.Error(b.Exception + "");
+ if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
+ LoggerHelper.Instance.Error(b.Exception + "");
};
diff --git a/src/linker/linker.csproj b/src/linker/linker.csproj
index 616835ce..c78a08be 100644
--- a/src/linker/linker.csproj
+++ b/src/linker/linker.csproj
@@ -21,18 +21,15 @@
snltty
snltty
1. 一些累计更新
-2. 优化安卓APP,启动网卡时申请VPN权限,有新路由时重建VPN
-3. 新增防火墙,用于网卡、端口转发、和socks5
-4. 优化重启清理数据,优化了网卡自启动问题
-5. 检测密钥是否正确
-6. 如果你设备很多,请尝试升级其中一个成功重启后再升级其它
+2. 增加NAT类型检测
+3. 优化内网穿透,SNAT转换,防火墙
snltty
https://github.com/snltty/linker
https://github.com/snltty/linker
linker
- 1.7.9
- 1.7.9
- 1.7.9
+ 1.8.0
+ 1.8.0
+ 1.8.0
False
diff --git a/version.txt b/version.txt
index 50922bae..e1689344 100644
--- a/version.txt
+++ b/version.txt
@@ -1,8 +1,5 @@
-v1.7.9
-2025-05-15 16:07:03
+v1.8.0
+2025-05-19 15:30:33
1. 一些累计更新
-2. 优化安卓APP,启动网卡时申请VPN权限,有新路由时重建VPN
-3. 新增防火墙,用于网卡、端口转发、和socks5
-4. 优化重启清理数据,优化了网卡自启动问题
-5. 检测密钥是否正确
-6. 如果你设备很多,请尝试升级其中一个成功重启后再升级其它
\ No newline at end of file
+2. 增加NAT类型检测
+3. 优化内网穿透,SNAT转换,防火墙
\ No newline at end of file