mirror of
https://github.com/MetaCubeX/ClashMetaForAndroid.git
synced 2026-05-09 18:11:26 +08:00
Compare commits
112 Commits
v2.11.3
...
1ca620e7ec
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1ca620e7ec | ||
|
|
1d42dfa477 | ||
|
|
a097966eee | ||
|
|
8851289971 | ||
|
|
750072d7cc | ||
|
|
066486323b | ||
|
|
37b8ba6d5c | ||
|
|
8453bfc07d | ||
|
|
afd1da50b7 | ||
|
|
3c1cf5b9eb | ||
|
|
ac6f7fe19a | ||
|
|
d1a2a1b745 | ||
|
|
6ce881126a | ||
|
|
71854a9132 | ||
|
|
7c52b36aaa | ||
|
|
c8fbb363ea | ||
|
|
acdcd603c5 | ||
|
|
d8e336edf2 | ||
|
|
22f12b7266 | ||
|
|
cc2330c924 | ||
|
|
98d8b056df | ||
|
|
83261bb3f9 | ||
|
|
406e4004f2 | ||
|
|
5cd01b178a | ||
|
|
fb9ffa0b82 | ||
|
|
5e7a01fb60 | ||
|
|
10d14f8ee0 | ||
|
|
232f318bde | ||
|
|
bd042125c5 | ||
|
|
f16f13b5f2 | ||
|
|
cd744af161 | ||
|
|
6969e1b657 | ||
|
|
2c106d5a7e | ||
|
|
fd7449e939 | ||
|
|
f99c28876b | ||
|
|
8975459dad | ||
|
|
9ec91cacf5 | ||
|
|
4496e61cbe | ||
|
|
b93319ba39 | ||
|
|
6f78f4aa18 | ||
|
|
15de77afe6 | ||
|
|
ed2f1d70f9 | ||
|
|
bb3404a0b0 | ||
|
|
e4042d5d9b | ||
|
|
06677c446e | ||
|
|
6cf12d4c24 | ||
|
|
cd9e586023 | ||
|
|
f846763814 | ||
|
|
b6393f21d4 | ||
|
|
f2df41f0a6 | ||
|
|
bfff0fe997 | ||
|
|
4f8f6b2a8c | ||
|
|
b0a9076fcb | ||
|
|
f6f410fda8 | ||
|
|
fda769cc69 | ||
|
|
7a04dd0e27 | ||
|
|
f6a4e8987d | ||
|
|
734d0331bc | ||
|
|
7d9cededeb | ||
|
|
3749da0fbf | ||
|
|
61093eb8d6 | ||
|
|
b2ba3cd20b | ||
|
|
d56d56e2df | ||
|
|
99cbc449c2 | ||
|
|
4ece5c4315 | ||
|
|
a597a4611d | ||
|
|
253ae118df | ||
|
|
11fe93b8c6 | ||
|
|
38d0d4397e | ||
|
|
131097a236 | ||
|
|
88c33b1763 | ||
|
|
d4ba9fd808 | ||
|
|
290d63943f | ||
|
|
a59e87143c | ||
|
|
7178d0f3ec | ||
|
|
618533887d | ||
|
|
adbc68aa62 | ||
|
|
4bf5016921 | ||
|
|
6a9a469073 | ||
|
|
ac6cfa02c8 | ||
|
|
2e852e54f8 | ||
|
|
309cc6af12 | ||
|
|
39987022c6 | ||
|
|
6f521d5ac1 | ||
|
|
efb2df507d | ||
|
|
54077cb29f | ||
|
|
19cc82e0db | ||
|
|
4e45661e26 | ||
|
|
5816076bf6 | ||
|
|
59f2a2019e | ||
|
|
effbf8f244 | ||
|
|
b240eb7e25 | ||
|
|
f444075342 | ||
|
|
a6ceb88956 | ||
|
|
9db73ea07b | ||
|
|
356a845b69 | ||
|
|
d344cc8e77 | ||
|
|
d8e46ae27d | ||
|
|
4f22a46f93 | ||
|
|
a012d81cd1 | ||
|
|
57f043408f | ||
|
|
e5d8c9f355 | ||
|
|
2760de9d40 | ||
|
|
64a69e6627 | ||
|
|
9fd394d7c5 | ||
|
|
e8e00108e6 | ||
|
|
3100e1700c | ||
|
|
7598481c01 | ||
|
|
565d1d7a81 | ||
|
|
e15477cc04 | ||
|
|
94c46a04c4 | ||
|
|
c513a198f4 |
33
.github/patch/disable_pidfd_on_android.patch
vendored
Normal file
33
.github/patch/disable_pidfd_on_android.patch
vendored
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
From 7115c480196f4bdcbdae5e14ebaa4510540680e9 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Brad Fitzpatrick <bradfitz@tailscale.com>
|
||||||
|
Date: Tue, 27 Jan 2026 09:52:22 -0800
|
||||||
|
Subject: [PATCH] [tailscale] os: disable pidfd on Android
|
||||||
|
|
||||||
|
Updates tailscale/tailscale#13452
|
||||||
|
Updates golang/go#70508
|
||||||
|
Updates tailscale/go#99
|
||||||
|
---
|
||||||
|
src/os/pidfd_linux.go | 10 ++++++++++
|
||||||
|
1 file changed, 10 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/src/os/pidfd_linux.go b/src/os/pidfd_linux.go
|
||||||
|
index 796d8c018c7f2a..5cdbf1175e0db5 100644
|
||||||
|
--- a/src/os/pidfd_linux.go
|
||||||
|
+++ b/src/os/pidfd_linux.go
|
||||||
|
@@ -138,6 +138,16 @@ func (p *Process) pidfdSendSignal(s syscall.Signal) error {
|
||||||
|
|
||||||
|
// pidfdWorks returns whether we can use pidfd on this system.
|
||||||
|
func pidfdWorks() bool {
|
||||||
|
+ if runtime.GOOS == "android" {
|
||||||
|
+ // Tailscale-specific workaround since https://github.com/golang/go/pull/69543/commits/aad6b3b32c81795f86bc4a9e81aad94899daf520
|
||||||
|
+ // does not solve https://github.com/golang/go/issues/69065 for Android apps using Go libraries.
|
||||||
|
+ //
|
||||||
|
+ // See: https://github.com/tailscale/tailscale/issues/13452
|
||||||
|
+ //
|
||||||
|
+ // For now (2025-04-09), we'll just disable pidfd
|
||||||
|
+ // on all Android releases.
|
||||||
|
+ return false
|
||||||
|
+ }
|
||||||
|
return checkPidfdOnce() == nil
|
||||||
|
}
|
||||||
|
|
||||||
33
.github/patch/remove_64bits_syscall_on_32bit_linux.patch
vendored
Normal file
33
.github/patch/remove_64bits_syscall_on_32bit_linux.patch
vendored
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
From bef1938b64a444911de119db613e60b9078ddd81 Mon Sep 17 00:00:00 2001
|
||||||
|
From: wwqgtxx <wwqgtxx@gmail.com>
|
||||||
|
Date: Sat, 9 May 2026 00:05:48 +0800
|
||||||
|
Subject: [PATCH] Disable futex_time64 again
|
||||||
|
|
||||||
|
---
|
||||||
|
src/runtime/os_linux32.go | 6 ------
|
||||||
|
1 file changed, 6 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/runtime/os_linux32.go b/src/runtime/os_linux32.go
|
||||||
|
index 1ee1cdcaf90051..4aa42132d73739 100644
|
||||||
|
--- a/src/runtime/os_linux32.go
|
||||||
|
+++ b/src/runtime/os_linux32.go
|
||||||
|
@@ -24,9 +24,6 @@ var use64bitsTimeOn32bits bool
|
||||||
|
|
||||||
|
//go:nosplit
|
||||||
|
func futex(addr unsafe.Pointer, op int32, val uint32, ts *timespec, addr2 unsafe.Pointer, val3 uint32) int32 {
|
||||||
|
- if use64bitsTimeOn32bits {
|
||||||
|
- return futex_time64(addr, op, val, ts, addr2, val3)
|
||||||
|
- }
|
||||||
|
// Downgrade ts.
|
||||||
|
var ts32 timespec32
|
||||||
|
var pts32 *timespec32
|
||||||
|
@@ -45,9 +42,6 @@ func timer_settime64(timerid int32, flags int32, new, old *itimerspec) int32
|
||||||
|
|
||||||
|
//go:nosplit
|
||||||
|
func timer_settime(timerid int32, flags int32, new, old *itimerspec) int32 {
|
||||||
|
- if use64bitsTimeOn32bits {
|
||||||
|
- return timer_settime64(timerid, flags, new, old)
|
||||||
|
- }
|
||||||
|
|
||||||
|
var newts, oldts itimerspec32
|
||||||
|
var new32, old32 *itimerspec32
|
||||||
40
.github/workflows/build-debug.yaml
vendored
40
.github/workflows/build-debug.yaml
vendored
@@ -12,26 +12,32 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout Repository
|
- name: Checkout Repository
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v6
|
||||||
|
|
||||||
- name: Checkout submodules
|
- name: Checkout submodules
|
||||||
run: git submodule update --init --recursive --remote --force
|
run: git submodule update --init --recursive --force
|
||||||
|
|
||||||
- name: Setup Java
|
- name: Setup Java
|
||||||
uses: actions/setup-java@v4
|
uses: actions/setup-java@v5
|
||||||
with:
|
with:
|
||||||
distribution: 'zulu'
|
distribution: "temurin"
|
||||||
java-version: 17
|
java-version: 21
|
||||||
|
|
||||||
- name: Setup Gradle
|
- name: Setup Gradle
|
||||||
uses: gradle/actions/setup-gradle@v4
|
uses: gradle/actions/setup-gradle@v5
|
||||||
|
|
||||||
- name: Setup Go
|
- name: Setup Go
|
||||||
uses: actions/setup-go@v5
|
uses: actions/setup-go@4a3601121dd01d1626a1e23e37211e3254c1c06c
|
||||||
with:
|
with:
|
||||||
go-version: "1.23"
|
go-download-base-url: 'https://github.com/MetaCubeX/go/releases/download/build'
|
||||||
|
go-version: '1.26'
|
||||||
|
|
||||||
- uses: actions/cache@v4
|
- name: Apply Patches
|
||||||
|
run: |
|
||||||
|
cd $(go env GOROOT)
|
||||||
|
for p in $GITHUB_WORKSPACE/.github/patch/*.patch; do patch --verbose -p 1 < "$p"; done
|
||||||
|
|
||||||
|
- uses: actions/cache@v5
|
||||||
with:
|
with:
|
||||||
path: |
|
path: |
|
||||||
~/.cache/go-build
|
~/.cache/go-build
|
||||||
@@ -40,6 +46,12 @@ jobs:
|
|||||||
restore-keys: |
|
restore-keys: |
|
||||||
${{ runner.os }}-go-
|
${{ runner.os }}-go-
|
||||||
|
|
||||||
|
- name: Update CA
|
||||||
|
run: |
|
||||||
|
sudo apt-get update && sudo apt-get install ca-certificates
|
||||||
|
sudo update-ca-certificates
|
||||||
|
cp -f /etc/ssl/certs/ca-certificates.crt core/src/foss/golang/clash/component/ca/ca-certificates.crt
|
||||||
|
|
||||||
# - name: Signing properties
|
# - name: Signing properties
|
||||||
# env:
|
# env:
|
||||||
# SIGNING_STORE_PASSWORD: ${{ secrets.SIGNING_STORE_PASSWORD }}
|
# SIGNING_STORE_PASSWORD: ${{ secrets.SIGNING_STORE_PASSWORD }}
|
||||||
@@ -59,7 +71,7 @@ jobs:
|
|||||||
run: ./gradlew --no-daemon app:assembleAlphaRelease
|
run: ./gradlew --no-daemon app:assembleAlphaRelease
|
||||||
|
|
||||||
- name: Upload Aritfact (universal)
|
- name: Upload Aritfact (universal)
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v7
|
||||||
if: ${{ success() }}
|
if: ${{ success() }}
|
||||||
with:
|
with:
|
||||||
name: CMFA Debug Unsigned APK (universal)
|
name: CMFA Debug Unsigned APK (universal)
|
||||||
@@ -67,7 +79,7 @@ jobs:
|
|||||||
app/build/outputs/apk/alpha/release/*-universal-*.apk
|
app/build/outputs/apk/alpha/release/*-universal-*.apk
|
||||||
|
|
||||||
- name: Upload Aritfact (arm64-v8a)
|
- name: Upload Aritfact (arm64-v8a)
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v7
|
||||||
if: ${{ success() }}
|
if: ${{ success() }}
|
||||||
with:
|
with:
|
||||||
name: CMFA Debug Unsigned APK (arm64-v8a)
|
name: CMFA Debug Unsigned APK (arm64-v8a)
|
||||||
@@ -75,7 +87,7 @@ jobs:
|
|||||||
app/build/outputs/apk/alpha/release/*-arm64-v8a-*.apk
|
app/build/outputs/apk/alpha/release/*-arm64-v8a-*.apk
|
||||||
|
|
||||||
- name: Upload Aritfact (armeabi-v7a)
|
- name: Upload Aritfact (armeabi-v7a)
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v7
|
||||||
if: ${{ success() }}
|
if: ${{ success() }}
|
||||||
with:
|
with:
|
||||||
name: CMFA Debug Unsigned APK (armeabi-v7a)
|
name: CMFA Debug Unsigned APK (armeabi-v7a)
|
||||||
@@ -83,7 +95,7 @@ jobs:
|
|||||||
app/build/outputs/apk/alpha/release/*-armeabi-v7a-*.apk
|
app/build/outputs/apk/alpha/release/*-armeabi-v7a-*.apk
|
||||||
|
|
||||||
- name: Upload Aritfact (x86_64)
|
- name: Upload Aritfact (x86_64)
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v7
|
||||||
if: ${{ success() }}
|
if: ${{ success() }}
|
||||||
with:
|
with:
|
||||||
name: CMFA Debug Unsigned APK (x86_64)
|
name: CMFA Debug Unsigned APK (x86_64)
|
||||||
@@ -91,7 +103,7 @@ jobs:
|
|||||||
app/build/outputs/apk/alpha/release/*-x86_64-*.apk
|
app/build/outputs/apk/alpha/release/*-x86_64-*.apk
|
||||||
|
|
||||||
- name: Upload Aritfact (x86)
|
- name: Upload Aritfact (x86)
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v7
|
||||||
if: ${{ success() }}
|
if: ${{ success() }}
|
||||||
with:
|
with:
|
||||||
name: CMFA Debug Unsigned APK (x86)
|
name: CMFA Debug Unsigned APK (x86)
|
||||||
|
|||||||
37
.github/workflows/build-pre-release.yaml
vendored
37
.github/workflows/build-pre-release.yaml
vendored
@@ -1,36 +1,41 @@
|
|||||||
name: Build Pre-Release
|
name: Build Pre-Release
|
||||||
on:
|
on:
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
pull_request:
|
push:
|
||||||
branches: [main]
|
branches:
|
||||||
types: [closed]
|
- main
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
BuildPreRelease:
|
BuildPreRelease:
|
||||||
if: github.event_name == 'workflow_dispatch' || github.event.pull_request.merged == true
|
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout Repository
|
- name: Checkout Repository
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v6
|
||||||
|
|
||||||
- name: Checkout submodules
|
- name: Checkout submodules
|
||||||
run: git submodule update --init --recursive --remote --force
|
run: git submodule update --init --recursive --force
|
||||||
|
|
||||||
- name: Setup Java
|
- name: Setup Java
|
||||||
uses: actions/setup-java@v4
|
uses: actions/setup-java@v5
|
||||||
with:
|
with:
|
||||||
distribution: 'zulu'
|
distribution: "temurin"
|
||||||
java-version: 17
|
java-version: 21
|
||||||
|
|
||||||
- name: Setup Gradle
|
- name: Setup Gradle
|
||||||
uses: gradle/actions/setup-gradle@v4
|
uses: gradle/actions/setup-gradle@v5
|
||||||
|
|
||||||
- name: Setup Go
|
- name: Setup Go
|
||||||
uses: actions/setup-go@v5
|
uses: actions/setup-go@4a3601121dd01d1626a1e23e37211e3254c1c06c
|
||||||
with:
|
with:
|
||||||
go-version: "1.23"
|
go-download-base-url: 'https://github.com/MetaCubeX/go/releases/download/build'
|
||||||
|
go-version: '1.26'
|
||||||
|
|
||||||
- uses: actions/cache@v4
|
- name: Apply Patches
|
||||||
|
run: |
|
||||||
|
cd $(go env GOROOT)
|
||||||
|
for p in $GITHUB_WORKSPACE/.github/patch/*.patch; do patch --verbose -p 1 < "$p"; done
|
||||||
|
|
||||||
|
- uses: actions/cache@v5
|
||||||
with:
|
with:
|
||||||
path: |
|
path: |
|
||||||
~/.cache/go-build
|
~/.cache/go-build
|
||||||
@@ -39,6 +44,12 @@ jobs:
|
|||||||
restore-keys: |
|
restore-keys: |
|
||||||
${{ runner.os }}-go-
|
${{ runner.os }}-go-
|
||||||
|
|
||||||
|
- name: Update CA
|
||||||
|
run: |
|
||||||
|
sudo apt-get update && sudo apt-get install ca-certificates
|
||||||
|
sudo update-ca-certificates
|
||||||
|
cp -f /etc/ssl/certs/ca-certificates.crt core/src/foss/golang/clash/component/ca/ca-certificates.crt
|
||||||
|
|
||||||
- name: Signing properties
|
- name: Signing properties
|
||||||
env:
|
env:
|
||||||
SIGNING_STORE_PASSWORD: ${{ secrets.SIGNING_STORE_PASSWORD }}
|
SIGNING_STORE_PASSWORD: ${{ secrets.SIGNING_STORE_PASSWORD }}
|
||||||
|
|||||||
30
.github/workflows/build-release.yaml
vendored
30
.github/workflows/build-release.yaml
vendored
@@ -12,28 +12,34 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout Repository
|
- name: Checkout Repository
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v6
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
|
||||||
- name: Checkout submodules
|
- name: Checkout submodules
|
||||||
run: git submodule update --init --recursive --remote
|
run: git submodule update --init --recursive --force
|
||||||
|
|
||||||
- name: Setup Java
|
- name: Setup Java
|
||||||
uses: actions/setup-java@v4
|
uses: actions/setup-java@v5
|
||||||
with:
|
with:
|
||||||
distribution: 'zulu'
|
distribution: "temurin"
|
||||||
java-version: 17
|
java-version: 21
|
||||||
|
|
||||||
- name: Setup Gradle
|
- name: Setup Gradle
|
||||||
uses: gradle/actions/setup-gradle@v4
|
uses: gradle/actions/setup-gradle@v5
|
||||||
|
|
||||||
- name: Setup Go
|
- name: Setup Go
|
||||||
uses: actions/setup-go@v5
|
uses: actions/setup-go@4a3601121dd01d1626a1e23e37211e3254c1c06c
|
||||||
with:
|
with:
|
||||||
go-version: "1.23"
|
go-download-base-url: 'https://github.com/MetaCubeX/go/releases/download/build'
|
||||||
|
go-version: '1.26'
|
||||||
|
|
||||||
- uses: actions/cache@v4
|
- name: Apply Patches
|
||||||
|
run: |
|
||||||
|
cd $(go env GOROOT)
|
||||||
|
for p in $GITHUB_WORKSPACE/.github/patch/*.patch; do patch --verbose -p 1 < "$p"; done
|
||||||
|
|
||||||
|
- uses: actions/cache@v5
|
||||||
with:
|
with:
|
||||||
path: |
|
path: |
|
||||||
~/.cache/go-build
|
~/.cache/go-build
|
||||||
@@ -77,6 +83,12 @@ jobs:
|
|||||||
git push --follow-tags
|
git push --follow-tags
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
- name: Update CA
|
||||||
|
run: |
|
||||||
|
sudo apt-get update && sudo apt-get install ca-certificates
|
||||||
|
sudo update-ca-certificates
|
||||||
|
cp -f /etc/ssl/certs/ca-certificates.crt core/src/foss/golang/clash/component/ca/ca-certificates.crt
|
||||||
|
|
||||||
- name: Signing properties
|
- name: Signing properties
|
||||||
env:
|
env:
|
||||||
SIGNING_STORE_PASSWORD: ${{ secrets.SIGNING_STORE_PASSWORD }}
|
SIGNING_STORE_PASSWORD: ${{ secrets.SIGNING_STORE_PASSWORD }}
|
||||||
|
|||||||
31
.github/workflows/update-dependencies.yaml
vendored
31
.github/workflows/update-dependencies.yaml
vendored
@@ -10,23 +10,29 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout Repository
|
- name: Checkout Repository
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v6
|
||||||
|
|
||||||
- name: Checkout submodules
|
- name: Checkout and Update submodules
|
||||||
run: git submodule update --init --recursive --remote --force
|
run: git submodule update --init --recursive --remote --force
|
||||||
|
|
||||||
- name: Setup Java
|
- name: Setup Java
|
||||||
uses: actions/setup-java@v4
|
uses: actions/setup-java@v5
|
||||||
with:
|
with:
|
||||||
distribution: 'zulu'
|
distribution: "temurin"
|
||||||
java-version: 17
|
java-version: 21
|
||||||
|
|
||||||
- name: Setup Go
|
- name: Setup Go
|
||||||
uses: actions/setup-go@v5
|
uses: actions/setup-go@4a3601121dd01d1626a1e23e37211e3254c1c06c
|
||||||
with:
|
with:
|
||||||
go-version: "1.23"
|
go-download-base-url: 'https://github.com/MetaCubeX/go/releases/download/build'
|
||||||
|
go-version: '1.26'
|
||||||
|
|
||||||
|
- name: Apply Patches
|
||||||
|
run: |
|
||||||
|
cd $(go env GOROOT)
|
||||||
|
for p in $GITHUB_WORKSPACE/.github/patch/*.patch; do patch --verbose -p 1 < "$p"; done
|
||||||
|
|
||||||
- uses: actions/cache@v4
|
- uses: actions/cache@v5
|
||||||
with:
|
with:
|
||||||
path: |
|
path: |
|
||||||
~/.cache/go-build
|
~/.cache/go-build
|
||||||
@@ -51,15 +57,16 @@ jobs:
|
|||||||
update-go-mod-replace ${{ github.workspace }}/core/src/foss/golang/clash/go.mod $(pwd)/go.mod
|
update-go-mod-replace ${{ github.workspace }}/core/src/foss/golang/clash/go.mod $(pwd)/go.mod
|
||||||
go mod tidy
|
go mod tidy
|
||||||
|
|
||||||
- uses: tibdex/github-app-token@v2
|
- uses: actions/create-github-app-token@v3
|
||||||
id: generate-token
|
id: generate-token
|
||||||
with:
|
with:
|
||||||
app_id: ${{ secrets.MAINTAINER_APPID }}
|
client-id: ${{ secrets.MAINTAINER_APPID }}
|
||||||
private_key: ${{ secrets.MAINTAINER_APP_PRIVATE_KEY }}
|
private-key: ${{ secrets.MAINTAINER_APP_PRIVATE_KEY }}
|
||||||
|
owner: ${{ github.repository_owner }}
|
||||||
|
|
||||||
- name: Create Pull Request
|
- name: Create Pull Request
|
||||||
id: cpr
|
id: cpr
|
||||||
uses: peter-evans/create-pull-request@v6
|
uses: peter-evans/create-pull-request@v8
|
||||||
with:
|
with:
|
||||||
token: ${{ steps.generate-token.outputs.token }}
|
token: ${{ steps.generate-token.outputs.token }}
|
||||||
commit-message: Update Dependencies
|
commit-message: Update Dependencies
|
||||||
|
|||||||
14
README.md
14
README.md
@@ -32,7 +32,15 @@ Feature of [Clash.Meta](https://github.com/MetaCubeX/Clash.Meta)
|
|||||||
sdk.dir=/path/to/android-sdk
|
sdk.dir=/path/to/android-sdk
|
||||||
```
|
```
|
||||||
|
|
||||||
4. Create `signing.properties` in project root with
|
4. (Optional) Custom app package name. Add the following configuration to `local.properties`.
|
||||||
|
|
||||||
|
```properties
|
||||||
|
# config your ownn applicationId, or it will be 'com.github.metacubex.clash'
|
||||||
|
custom.application.id=com.my.compile.clash
|
||||||
|
# remove application id suffix, or the applicaion id will be 'com.github.metacubex.clash.alpha'
|
||||||
|
remove.suffix=true
|
||||||
|
|
||||||
|
5. Create `signing.properties` in project root with
|
||||||
|
|
||||||
```properties
|
```properties
|
||||||
keystore.path=/path/to/keystore/file
|
keystore.path=/path/to/keystore/file
|
||||||
@@ -41,10 +49,10 @@ Feature of [Clash.Meta](https://github.com/MetaCubeX/Clash.Meta)
|
|||||||
key.password=<key password>
|
key.password=<key password>
|
||||||
```
|
```
|
||||||
|
|
||||||
5. Build
|
6. Build
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
./gradlew app:assembleMeta-AlphaRelease
|
./gradlew app:assembleAlphaRelease
|
||||||
```
|
```
|
||||||
|
|
||||||
### Automation
|
### Automation
|
||||||
|
|||||||
@@ -24,6 +24,8 @@ dependencies {
|
|||||||
implementation(libs.androidx.coordinator)
|
implementation(libs.androidx.coordinator)
|
||||||
implementation(libs.androidx.recyclerview)
|
implementation(libs.androidx.recyclerview)
|
||||||
implementation(libs.google.material)
|
implementation(libs.google.material)
|
||||||
|
implementation(libs.quickie.bundled)
|
||||||
|
implementation(libs.androidx.activity.ktx)
|
||||||
}
|
}
|
||||||
|
|
||||||
tasks.getByName("clean", type = Delete::class) {
|
tasks.getByName("clean", type = Delete::class) {
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools">
|
||||||
package="com.github.kr328.clash">
|
|
||||||
|
|
||||||
<uses-feature
|
<uses-feature
|
||||||
android:name="android.software.leanback"
|
android:name="android.software.leanback"
|
||||||
@@ -12,10 +11,11 @@
|
|||||||
|
|
||||||
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
|
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
|
||||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
||||||
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
|
|
||||||
<uses-permission
|
<uses-permission
|
||||||
android:name="android.permission.QUERY_ALL_PACKAGES"
|
android:name="android.permission.QUERY_ALL_PACKAGES"
|
||||||
tools:ignore="QueryAllPackagesPermission" />
|
tools:ignore="QueryAllPackagesPermission" />
|
||||||
|
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_SPECIAL_USE" />
|
||||||
|
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
|
||||||
|
|
||||||
<application
|
<application
|
||||||
android:name=".MainApplication"
|
android:name=".MainApplication"
|
||||||
@@ -42,22 +42,33 @@
|
|||||||
android:configChanges="uiMode"
|
android:configChanges="uiMode"
|
||||||
android:exported="true"
|
android:exported="true"
|
||||||
android:label="@string/launch_name"
|
android:label="@string/launch_name"
|
||||||
android:launchMode="singleTop">
|
android:launchMode="singleTask">
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.APPLICATION_PREFERENCES" />
|
||||||
<action android:name="android.intent.action.MAIN" />
|
<action android:name="android.intent.action.MAIN" />
|
||||||
|
|
||||||
<category android:name="android.intent.category.LAUNCHER" />
|
|
||||||
<category android:name="android.intent.category.LEANBACK_LAUNCHER" />
|
|
||||||
<category android:name="android.intent.category.DEFAULT" />
|
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.service.quicksettings.action.QS_TILE_PREFERENCES" />
|
<action android:name="android.service.quicksettings.action.QS_TILE_PREFERENCES" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
</activity>
|
</activity>
|
||||||
|
<activity-alias
|
||||||
|
android:name=".MainActivityAlias"
|
||||||
|
android:exported="true"
|
||||||
|
android:targetActivity=".MainActivity">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.MAIN" />
|
||||||
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
|
<category android:name="android.intent.category.LEANBACK_LAUNCHER" />
|
||||||
|
<category android:name="android.intent.category.DEFAULT" />
|
||||||
|
</intent-filter>
|
||||||
|
</activity-alias>
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name=".ExternalControlActivity"
|
android:name=".ExternalControlActivity"
|
||||||
|
android:excludeFromRecents="true"
|
||||||
android:exported="true"
|
android:exported="true"
|
||||||
android:label="@string/external_control_activity"
|
android:label="@string/external_control_activity"
|
||||||
|
android:noHistory="true"
|
||||||
android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen">
|
android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen">
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.VIEW" />
|
<action android:name="android.intent.action.VIEW" />
|
||||||
@@ -172,7 +183,11 @@
|
|||||||
<service
|
<service
|
||||||
android:name=".LogcatService"
|
android:name=".LogcatService"
|
||||||
android:exported="false"
|
android:exported="false"
|
||||||
android:label="@string/clash_logcat" />
|
android:label="@string/clash_logcat"
|
||||||
|
android:foregroundServiceType="specialUse">
|
||||||
|
<property android:name="android.app.PROPERTY_SPECIAL_USE_FGS_SUBTYPE"
|
||||||
|
android:value="explanation_for_special_use"/>
|
||||||
|
</service>
|
||||||
<service
|
<service
|
||||||
android:name=".TileService"
|
android:name=".TileService"
|
||||||
android:exported="true"
|
android:exported="true"
|
||||||
@@ -193,5 +208,14 @@
|
|||||||
<action android:name="android.intent.action.MY_PACKAGE_REPLACED" />
|
<action android:name="android.intent.action.MY_PACKAGE_REPLACED" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
</receiver>
|
</receiver>
|
||||||
|
|
||||||
|
<receiver android:name=".DialerReceiver"
|
||||||
|
android:exported="true">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.provider.Telephony.SECRET_CODE" />
|
||||||
|
<!-- 252746382 is the name of Clash Meta in T9 -->
|
||||||
|
<data android:scheme="android_secret_code" android:host="252746382" />
|
||||||
|
</intent-filter>
|
||||||
|
</receiver>
|
||||||
</application>
|
</application>
|
||||||
</manifest>
|
</manifest>
|
||||||
|
|||||||
@@ -11,7 +11,10 @@ import com.github.kr328.clash.design.AccessControlDesign
|
|||||||
import com.github.kr328.clash.design.model.AppInfo
|
import com.github.kr328.clash.design.model.AppInfo
|
||||||
import com.github.kr328.clash.design.util.toAppInfo
|
import com.github.kr328.clash.design.util.toAppInfo
|
||||||
import com.github.kr328.clash.service.store.ServiceStore
|
import com.github.kr328.clash.service.store.ServiceStore
|
||||||
|
import com.github.kr328.clash.util.startClashService
|
||||||
|
import com.github.kr328.clash.util.stopClashService
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
|
import kotlinx.coroutines.delay
|
||||||
import kotlinx.coroutines.isActive
|
import kotlinx.coroutines.isActive
|
||||||
import kotlinx.coroutines.selects.select
|
import kotlinx.coroutines.selects.select
|
||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
@@ -26,7 +29,15 @@ class AccessControlActivity : BaseActivity<AccessControlDesign>() {
|
|||||||
|
|
||||||
defer {
|
defer {
|
||||||
withContext(Dispatchers.IO) {
|
withContext(Dispatchers.IO) {
|
||||||
|
val changed = selected != service.accessControlPackages
|
||||||
service.accessControlPackages = selected
|
service.accessControlPackages = selected
|
||||||
|
if (clashRunning && changed) {
|
||||||
|
stopClashService()
|
||||||
|
while (clashRunning) {
|
||||||
|
delay(200)
|
||||||
|
}
|
||||||
|
startClashService()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -46,6 +57,7 @@ class AccessControlActivity : BaseActivity<AccessControlDesign>() {
|
|||||||
AccessControlDesign.Request.ReloadApps -> {
|
AccessControlDesign.Request.ReloadApps -> {
|
||||||
design.patchApps(loadApps(selected))
|
design.patchApps(loadApps(selected))
|
||||||
}
|
}
|
||||||
|
|
||||||
AccessControlDesign.Request.SelectAll -> {
|
AccessControlDesign.Request.SelectAll -> {
|
||||||
val all = withContext(Dispatchers.Default) {
|
val all = withContext(Dispatchers.Default) {
|
||||||
design.apps.map(AppInfo::packageName)
|
design.apps.map(AppInfo::packageName)
|
||||||
@@ -56,11 +68,13 @@ class AccessControlActivity : BaseActivity<AccessControlDesign>() {
|
|||||||
|
|
||||||
design.rebindAll()
|
design.rebindAll()
|
||||||
}
|
}
|
||||||
|
|
||||||
AccessControlDesign.Request.SelectNone -> {
|
AccessControlDesign.Request.SelectNone -> {
|
||||||
selected.clear()
|
selected.clear()
|
||||||
|
|
||||||
design.rebindAll()
|
design.rebindAll()
|
||||||
}
|
}
|
||||||
|
|
||||||
AccessControlDesign.Request.SelectInvert -> {
|
AccessControlDesign.Request.SelectInvert -> {
|
||||||
val all = withContext(Dispatchers.Default) {
|
val all = withContext(Dispatchers.Default) {
|
||||||
design.apps.map(AppInfo::packageName).toSet() - selected
|
design.apps.map(AppInfo::packageName).toSet() - selected
|
||||||
@@ -71,6 +85,7 @@ class AccessControlActivity : BaseActivity<AccessControlDesign>() {
|
|||||||
|
|
||||||
design.rebindAll()
|
design.rebindAll()
|
||||||
}
|
}
|
||||||
|
|
||||||
AccessControlDesign.Request.Import -> {
|
AccessControlDesign.Request.Import -> {
|
||||||
val clipboard = getSystemService<ClipboardManager>()
|
val clipboard = getSystemService<ClipboardManager>()
|
||||||
val data = clipboard?.primaryClip
|
val data = clipboard?.primaryClip
|
||||||
@@ -85,6 +100,7 @@ class AccessControlActivity : BaseActivity<AccessControlDesign>() {
|
|||||||
|
|
||||||
design.rebindAll()
|
design.rebindAll()
|
||||||
}
|
}
|
||||||
|
|
||||||
AccessControlDesign.Request.Export -> {
|
AccessControlDesign.Request.Export -> {
|
||||||
val clipboard = getSystemService<ClipboardManager>()
|
val clipboard = getSystemService<ClipboardManager>()
|
||||||
|
|
||||||
@@ -118,7 +134,10 @@ class AccessControlActivity : BaseActivity<AccessControlDesign>() {
|
|||||||
it.packageName != packageName
|
it.packageName != packageName
|
||||||
}
|
}
|
||||||
.filter {
|
.filter {
|
||||||
it.packageName == "android" || it.requestedPermissions?.contains(INTERNET) == true
|
it.applicationInfo != null
|
||||||
|
}
|
||||||
|
.filter {
|
||||||
|
it.requestedPermissions?.contains(INTERNET) == true || it.applicationInfo!!.uid < android.os.Process.FIRST_APPLICATION_UID
|
||||||
}
|
}
|
||||||
.filter {
|
.filter {
|
||||||
systemApp || !it.isSystemApp
|
systemApp || !it.isSystemApp
|
||||||
@@ -132,6 +151,6 @@ class AccessControlActivity : BaseActivity<AccessControlDesign>() {
|
|||||||
|
|
||||||
private val PackageInfo.isSystemApp: Boolean
|
private val PackageInfo.isSystemApp: Boolean
|
||||||
get() {
|
get() {
|
||||||
return applicationInfo.flags and ApplicationInfo.FLAG_SYSTEM != 0
|
return applicationInfo?.flags?.and(ApplicationInfo.FLAG_SYSTEM) != 0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,9 +1,12 @@
|
|||||||
package com.github.kr328.clash
|
package com.github.kr328.clash
|
||||||
|
|
||||||
|
import android.content.ComponentName
|
||||||
import android.content.pm.PackageManager
|
import android.content.pm.PackageManager
|
||||||
|
import androidx.core.content.pm.ShortcutManagerCompat
|
||||||
import com.github.kr328.clash.common.util.componentName
|
import com.github.kr328.clash.common.util.componentName
|
||||||
import com.github.kr328.clash.design.AppSettingsDesign
|
import com.github.kr328.clash.design.AppSettingsDesign
|
||||||
import com.github.kr328.clash.design.model.Behavior
|
import com.github.kr328.clash.design.model.Behavior
|
||||||
|
import com.github.kr328.clash.design.store.UiStore.Companion.mainActivityAlias
|
||||||
import com.github.kr328.clash.service.store.ServiceStore
|
import com.github.kr328.clash.service.store.ServiceStore
|
||||||
import com.github.kr328.clash.util.ApplicationObserver
|
import com.github.kr328.clash.util.ApplicationObserver
|
||||||
import kotlinx.coroutines.isActive
|
import kotlinx.coroutines.isActive
|
||||||
@@ -17,6 +20,7 @@ class AppSettingsActivity : BaseActivity<AppSettingsDesign>(), Behavior {
|
|||||||
ServiceStore(this),
|
ServiceStore(this),
|
||||||
this,
|
this,
|
||||||
clashRunning,
|
clashRunning,
|
||||||
|
::onHideIconChange,
|
||||||
)
|
)
|
||||||
|
|
||||||
setContentDesign(design)
|
setContentDesign(design)
|
||||||
@@ -59,4 +63,21 @@ class AppSettingsActivity : BaseActivity<AppSettingsDesign>(), Behavior {
|
|||||||
PackageManager.DONT_KILL_APP,
|
PackageManager.DONT_KILL_APP,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
private fun onHideIconChange(hide: Boolean) {
|
||||||
|
val newState = if (hide) {
|
||||||
|
PackageManager.COMPONENT_ENABLED_STATE_DISABLED
|
||||||
|
} else {
|
||||||
|
PackageManager.COMPONENT_ENABLED_STATE_ENABLED
|
||||||
|
}
|
||||||
|
packageManager.setComponentEnabledSetting(
|
||||||
|
mainActivityAlias,
|
||||||
|
newState,
|
||||||
|
PackageManager.DONT_KILL_APP
|
||||||
|
)
|
||||||
|
if (hide) {
|
||||||
|
// Prevent launcher activity not found.
|
||||||
|
ShortcutManagerCompat.removeAllDynamicShortcuts(this)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,11 +1,13 @@
|
|||||||
package com.github.kr328.clash
|
package com.github.kr328.clash
|
||||||
|
|
||||||
|
import android.app.ActivityManager
|
||||||
import android.content.res.Configuration
|
import android.content.res.Configuration
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import androidx.activity.result.contract.ActivityResultContract
|
import androidx.activity.result.contract.ActivityResultContract
|
||||||
import androidx.appcompat.app.AppCompatActivity
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
|
import androidx.core.content.getSystemService
|
||||||
import com.github.kr328.clash.common.compat.isAllowForceDarkCompat
|
import com.github.kr328.clash.common.compat.isAllowForceDarkCompat
|
||||||
import com.github.kr328.clash.common.compat.isLightNavigationBarCompat
|
import com.github.kr328.clash.common.compat.isLightNavigationBarCompat
|
||||||
import com.github.kr328.clash.common.compat.isLightStatusBarsCompat
|
import com.github.kr328.clash.common.compat.isLightStatusBarsCompat
|
||||||
@@ -28,6 +30,7 @@ import java.util.*
|
|||||||
import java.util.concurrent.atomic.AtomicInteger
|
import java.util.concurrent.atomic.AtomicInteger
|
||||||
import kotlin.coroutines.resume
|
import kotlin.coroutines.resume
|
||||||
import kotlin.coroutines.suspendCoroutine
|
import kotlin.coroutines.suspendCoroutine
|
||||||
|
import com.github.kr328.clash.design.R
|
||||||
|
|
||||||
abstract class BaseActivity<D : Design<*>> : AppCompatActivity(),
|
abstract class BaseActivity<D : Design<*>> : AppCompatActivity(),
|
||||||
CoroutineScope by MainScope(),
|
CoroutineScope by MainScope(),
|
||||||
@@ -87,6 +90,11 @@ abstract class BaseActivity<D : Design<*>> : AppCompatActivity(),
|
|||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
applyDayNight()
|
applyDayNight()
|
||||||
|
|
||||||
|
// Apply excludeFromRecents setting to all app tasks.
|
||||||
|
checkNotNull(getSystemService<ActivityManager>()).appTasks.forEach { task ->
|
||||||
|
task.setExcludeFromRecents(uiStore.hideFromRecents)
|
||||||
|
}
|
||||||
|
|
||||||
launch {
|
launch {
|
||||||
main()
|
main()
|
||||||
}
|
}
|
||||||
|
|||||||
13
app/src/main/java/com/github/kr328/clash/DialerReceiver.kt
Normal file
13
app/src/main/java/com/github/kr328/clash/DialerReceiver.kt
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
package com.github.kr328.clash
|
||||||
|
|
||||||
|
import android.content.BroadcastReceiver
|
||||||
|
import android.content.Context
|
||||||
|
import android.content.Intent
|
||||||
|
|
||||||
|
class DialerReceiver : BroadcastReceiver() {
|
||||||
|
override fun onReceive(context: Context, intent: Intent) {
|
||||||
|
val intent = Intent(context, MainActivity::class.java)
|
||||||
|
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
|
||||||
|
context.startActivity(intent)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -20,10 +20,13 @@ import kotlinx.coroutines.CoroutineScope
|
|||||||
import kotlinx.coroutines.MainScope
|
import kotlinx.coroutines.MainScope
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
import com.github.kr328.clash.design.R
|
||||||
|
|
||||||
class ExternalControlActivity : Activity(), CoroutineScope by MainScope() {
|
class ExternalControlActivity : Activity(), CoroutineScope by MainScope() {
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
|
@Suppress("DEPRECATION")
|
||||||
|
overridePendingTransition(0, 0)
|
||||||
|
|
||||||
when(intent.action) {
|
when(intent.action) {
|
||||||
Intent.ACTION_VIEW -> {
|
Intent.ACTION_VIEW -> {
|
||||||
@@ -89,4 +92,10 @@ class ExternalControlActivity : Activity(), CoroutineScope by MainScope() {
|
|||||||
stopClashService()
|
stopClashService()
|
||||||
Toast.makeText(this, R.string.external_control_stopped, Toast.LENGTH_LONG).show()
|
Toast.makeText(this, R.string.external_control_stopped, Toast.LENGTH_LONG).show()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun finish() {
|
||||||
|
super.finish()
|
||||||
|
@Suppress("DEPRECATION")
|
||||||
|
overridePendingTransition(0, 0)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -81,24 +81,6 @@ class FilesActivity : BaseActivity<FilesDesign>() {
|
|||||||
client.renameDocument(it.file.id, newName)
|
client.renameDocument(it.file.id, newName)
|
||||||
}
|
}
|
||||||
is FilesDesign.Request.ImportFile -> {
|
is FilesDesign.Request.ImportFile -> {
|
||||||
if (Build.VERSION.SDK_INT >= 23) {
|
|
||||||
val hasPermission = ContextCompat.checkSelfPermission(
|
|
||||||
this@FilesActivity,
|
|
||||||
Manifest.permission.READ_EXTERNAL_STORAGE
|
|
||||||
) == PackageManager.PERMISSION_GRANTED
|
|
||||||
|
|
||||||
if (!hasPermission) {
|
|
||||||
val granted = startActivityForResult(
|
|
||||||
ActivityResultContracts.RequestPermission(),
|
|
||||||
Manifest.permission.READ_EXTERNAL_STORAGE,
|
|
||||||
)
|
|
||||||
|
|
||||||
if (!granted) {
|
|
||||||
return@onReceive
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
val uri: Uri? = startActivityForResult(
|
val uri: Uri? = startActivityForResult(
|
||||||
ActivityResultContracts.GetContent(),
|
ActivityResultContracts.GetContent(),
|
||||||
"*/*"
|
"*/*"
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ import kotlinx.coroutines.withContext
|
|||||||
import java.io.OutputStreamWriter
|
import java.io.OutputStreamWriter
|
||||||
import kotlin.coroutines.resume
|
import kotlin.coroutines.resume
|
||||||
import kotlin.coroutines.suspendCoroutine
|
import kotlin.coroutines.suspendCoroutine
|
||||||
|
import com.github.kr328.clash.design.R
|
||||||
|
|
||||||
class LogcatActivity : BaseActivity<LogcatDesign>() {
|
class LogcatActivity : BaseActivity<LogcatDesign>() {
|
||||||
private var conn: ServiceConnection? = null
|
private var conn: ServiceConnection? = null
|
||||||
@@ -111,7 +112,7 @@ class LogcatActivity : BaseActivity<LogcatDesign>() {
|
|||||||
when (it) {
|
when (it) {
|
||||||
LogcatDesign.Request.Close -> {
|
LogcatDesign.Request.Close -> {
|
||||||
stopService(LogcatService::class.intent)
|
stopService(LogcatService::class.intent)
|
||||||
|
startActivity(LogsActivity::class.intent)
|
||||||
finish()
|
finish()
|
||||||
}
|
}
|
||||||
else -> Unit
|
else -> Unit
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ import androidx.core.app.NotificationCompat
|
|||||||
import androidx.core.app.NotificationManagerCompat
|
import androidx.core.app.NotificationManagerCompat
|
||||||
import com.github.kr328.clash.common.compat.getColorCompat
|
import com.github.kr328.clash.common.compat.getColorCompat
|
||||||
import com.github.kr328.clash.common.compat.pendingIntentFlags
|
import com.github.kr328.clash.common.compat.pendingIntentFlags
|
||||||
|
import com.github.kr328.clash.common.compat.startForegroundCompat
|
||||||
import com.github.kr328.clash.common.log.Log
|
import com.github.kr328.clash.common.log.Log
|
||||||
import com.github.kr328.clash.common.util.intent
|
import com.github.kr328.clash.common.util.intent
|
||||||
import com.github.kr328.clash.core.model.LogMessage
|
import com.github.kr328.clash.core.model.LogMessage
|
||||||
@@ -130,17 +131,17 @@ class LogcatService : Service(), CoroutineScope by CoroutineScope(Dispatchers.De
|
|||||||
NotificationChannelCompat.Builder(
|
NotificationChannelCompat.Builder(
|
||||||
CHANNEL_ID,
|
CHANNEL_ID,
|
||||||
NotificationManagerCompat.IMPORTANCE_DEFAULT
|
NotificationManagerCompat.IMPORTANCE_DEFAULT
|
||||||
).setName(getString(R.string.clash_logcat)).build()
|
).setName(getString(com.github.kr328.clash.design.R.string.clash_logcat)).build()
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun showNotification() {
|
private fun showNotification() {
|
||||||
val notification = NotificationCompat
|
val notification = NotificationCompat
|
||||||
.Builder(this, CHANNEL_ID)
|
.Builder(this, CHANNEL_ID)
|
||||||
.setSmallIcon(R.drawable.ic_logo_service)
|
.setSmallIcon(com.github.kr328.clash.service.R.drawable.ic_logo_service)
|
||||||
.setColor(getColorCompat(R.color.color_clash_light))
|
.setColor(getColorCompat(com.github.kr328.clash.design.R.color.color_clash_light))
|
||||||
.setContentTitle(getString(R.string.clash_logcat))
|
.setContentTitle(getString(com.github.kr328.clash.design.R.string.clash_logcat))
|
||||||
.setContentText(getString(R.string.running))
|
.setContentText(getString(com.github.kr328.clash.design.R.string.running))
|
||||||
.setContentIntent(
|
.setContentIntent(
|
||||||
PendingIntent.getActivity(
|
PendingIntent.getActivity(
|
||||||
this,
|
this,
|
||||||
@@ -152,7 +153,7 @@ class LogcatService : Service(), CoroutineScope by CoroutineScope(Dispatchers.De
|
|||||||
)
|
)
|
||||||
.build()
|
.build()
|
||||||
|
|
||||||
startForeground(R.id.nf_logcat_status, notification)
|
startForegroundCompat(R.id.nf_logcat_status, notification)
|
||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
|||||||
@@ -11,11 +11,8 @@ import kotlinx.coroutines.selects.select
|
|||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
|
|
||||||
class LogsActivity : BaseActivity<LogsDesign>() {
|
class LogsActivity : BaseActivity<LogsDesign>() {
|
||||||
override suspend fun main() {
|
|
||||||
if (LogcatService.running) {
|
|
||||||
return startActivity(LogcatActivity::class.intent)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
override suspend fun main() {
|
||||||
val design = LogsDesign(this)
|
val design = LogsDesign(this)
|
||||||
|
|
||||||
setContentDesign(design)
|
setContentDesign(design)
|
||||||
@@ -38,7 +35,6 @@ class LogsActivity : BaseActivity<LogsDesign>() {
|
|||||||
when (it) {
|
when (it) {
|
||||||
LogsDesign.Request.StartLogcat -> {
|
LogsDesign.Request.StartLogcat -> {
|
||||||
startActivity(LogcatActivity::class.intent)
|
startActivity(LogcatActivity::class.intent)
|
||||||
|
|
||||||
finish()
|
finish()
|
||||||
}
|
}
|
||||||
LogsDesign.Request.DeleteAll -> {
|
LogsDesign.Request.DeleteAll -> {
|
||||||
|
|||||||
@@ -1,6 +1,13 @@
|
|||||||
package com.github.kr328.clash
|
package com.github.kr328.clash
|
||||||
|
|
||||||
|
import android.content.pm.PackageManager
|
||||||
|
import android.os.Build
|
||||||
|
import android.os.Bundle
|
||||||
|
import android.os.PersistableBundle
|
||||||
import androidx.activity.result.contract.ActivityResultContracts
|
import androidx.activity.result.contract.ActivityResultContracts
|
||||||
|
import androidx.activity.result.contract.ActivityResultContracts.RequestPermission
|
||||||
|
import androidx.core.app.ActivityCompat
|
||||||
|
import androidx.core.content.ContextCompat
|
||||||
import com.github.kr328.clash.common.util.intent
|
import com.github.kr328.clash.common.util.intent
|
||||||
import com.github.kr328.clash.common.util.ticker
|
import com.github.kr328.clash.common.util.ticker
|
||||||
import com.github.kr328.clash.design.MainDesign
|
import com.github.kr328.clash.design.MainDesign
|
||||||
@@ -15,6 +22,7 @@ import kotlinx.coroutines.isActive
|
|||||||
import kotlinx.coroutines.selects.select
|
import kotlinx.coroutines.selects.select
|
||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
import java.util.concurrent.TimeUnit
|
import java.util.concurrent.TimeUnit
|
||||||
|
import com.github.kr328.clash.design.R
|
||||||
|
|
||||||
class MainActivity : BaseActivity<MainDesign>() {
|
class MainActivity : BaseActivity<MainDesign>() {
|
||||||
override suspend fun main() {
|
override suspend fun main() {
|
||||||
@@ -51,8 +59,13 @@ class MainActivity : BaseActivity<MainDesign>() {
|
|||||||
startActivity(ProfilesActivity::class.intent)
|
startActivity(ProfilesActivity::class.intent)
|
||||||
MainDesign.Request.OpenProviders ->
|
MainDesign.Request.OpenProviders ->
|
||||||
startActivity(ProvidersActivity::class.intent)
|
startActivity(ProvidersActivity::class.intent)
|
||||||
MainDesign.Request.OpenLogs ->
|
MainDesign.Request.OpenLogs -> {
|
||||||
startActivity(LogsActivity::class.intent)
|
if (LogcatService.running) {
|
||||||
|
startActivity(LogcatActivity::class.intent)
|
||||||
|
} else {
|
||||||
|
startActivity(LogsActivity::class.intent)
|
||||||
|
}
|
||||||
|
}
|
||||||
MainDesign.Request.OpenSettings ->
|
MainDesign.Request.OpenSettings ->
|
||||||
startActivity(SettingsActivity::class.intent)
|
startActivity(SettingsActivity::class.intent)
|
||||||
MainDesign.Request.OpenHelp ->
|
MainDesign.Request.OpenHelp ->
|
||||||
@@ -129,4 +142,20 @@ class MainActivity : BaseActivity<MainDesign>() {
|
|||||||
packageManager.getPackageInfo(packageName, 0).versionName + "\n" + Bridge.nativeCoreVersion().replace("_", "-")
|
packageManager.getPackageInfo(packageName, 0).versionName + "\n" + Bridge.nativeCoreVersion().replace("_", "-")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
|
super.onCreate(savedInstanceState)
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
|
||||||
|
val requestPermissionLauncher =
|
||||||
|
registerForActivityResult(RequestPermission()
|
||||||
|
) { isGranted: Boolean ->
|
||||||
|
}
|
||||||
|
if (ContextCompat.checkSelfPermission(
|
||||||
|
this,
|
||||||
|
android.Manifest.permission.POST_NOTIFICATIONS
|
||||||
|
) != PackageManager.PERMISSION_GRANTED) {
|
||||||
|
requestPermissionLauncher.launch(android.Manifest.permission.POST_NOTIFICATIONS)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -2,21 +2,27 @@ package com.github.kr328.clash
|
|||||||
|
|
||||||
import android.app.Application
|
import android.app.Application
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
|
import android.content.Intent
|
||||||
|
import androidx.core.content.pm.ShortcutInfoCompat
|
||||||
|
import androidx.core.content.pm.ShortcutManagerCompat
|
||||||
|
import androidx.core.graphics.drawable.IconCompat
|
||||||
import com.github.kr328.clash.common.Global
|
import com.github.kr328.clash.common.Global
|
||||||
import com.github.kr328.clash.common.compat.currentProcessName
|
import com.github.kr328.clash.common.compat.currentProcessName
|
||||||
|
import com.github.kr328.clash.common.constants.Intents
|
||||||
import com.github.kr328.clash.common.log.Log
|
import com.github.kr328.clash.common.log.Log
|
||||||
|
import com.github.kr328.clash.design.store.UiStore
|
||||||
import com.github.kr328.clash.remote.Remote
|
import com.github.kr328.clash.remote.Remote
|
||||||
import com.github.kr328.clash.service.util.sendServiceRecreated
|
import com.github.kr328.clash.service.util.sendServiceRecreated
|
||||||
import com.github.kr328.clash.util.clashDir
|
import com.github.kr328.clash.util.clashDir
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.io.FileOutputStream
|
import java.io.FileOutputStream
|
||||||
import java.io.IOException
|
import com.github.kr328.clash.design.R as DesignR
|
||||||
import java.io.InputStream
|
|
||||||
import java.io.OutputStream
|
|
||||||
|
|
||||||
|
|
||||||
@Suppress("unused")
|
@Suppress("unused")
|
||||||
class MainApplication : Application() {
|
class MainApplication : Application() {
|
||||||
|
private val uiStore by lazy(LazyThreadSafetyMode.NONE) { UiStore(this) }
|
||||||
|
|
||||||
override fun attachBaseContext(base: Context?) {
|
override fun attachBaseContext(base: Context?) {
|
||||||
super.attachBaseContext(base)
|
super.attachBaseContext(base)
|
||||||
|
|
||||||
@@ -33,32 +39,94 @@ class MainApplication : Application() {
|
|||||||
|
|
||||||
if (processName == packageName) {
|
if (processName == packageName) {
|
||||||
Remote.launch()
|
Remote.launch()
|
||||||
|
setupShortcuts()
|
||||||
} else {
|
} else {
|
||||||
sendServiceRecreated()
|
sendServiceRecreated()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun extractGeoFiles() {
|
private fun setupShortcuts() {
|
||||||
clashDir.mkdirs();
|
if (uiStore.hideAppIcon) {
|
||||||
|
// Prevent launcher activity not found.
|
||||||
|
ShortcutManagerCompat.removeAllDynamicShortcuts(this)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
val icon = IconCompat.createWithResource(this, R.mipmap.ic_launcher)
|
||||||
|
val flags = Intent.FLAG_ACTIVITY_NEW_TASK or
|
||||||
|
Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS or
|
||||||
|
Intent.FLAG_ACTIVITY_NO_ANIMATION
|
||||||
|
|
||||||
|
val toggle = ShortcutInfoCompat.Builder(this, "toggle_clash")
|
||||||
|
.setShortLabel(getString(DesignR.string.shortcut_toggle_short))
|
||||||
|
.setLongLabel(getString(DesignR.string.shortcut_toggle_long))
|
||||||
|
.setIcon(icon)
|
||||||
|
.setIntent(
|
||||||
|
Intent(Intents.ACTION_TOGGLE_CLASH)
|
||||||
|
.setClassName(this, ExternalControlActivity::class.java.name)
|
||||||
|
.addFlags(flags)
|
||||||
|
)
|
||||||
|
.setRank(0)
|
||||||
|
.build()
|
||||||
|
|
||||||
|
val start = ShortcutInfoCompat.Builder(this, "start_clash")
|
||||||
|
.setShortLabel(getString(DesignR.string.shortcut_start_short))
|
||||||
|
.setLongLabel(getString(DesignR.string.shortcut_start_long))
|
||||||
|
.setIcon(icon)
|
||||||
|
.setIntent(
|
||||||
|
Intent(Intents.ACTION_START_CLASH)
|
||||||
|
.setClassName(this, ExternalControlActivity::class.java.name)
|
||||||
|
.addFlags(flags)
|
||||||
|
)
|
||||||
|
.setRank(1)
|
||||||
|
.build()
|
||||||
|
|
||||||
|
val stop = ShortcutInfoCompat.Builder(this, "stop_clash")
|
||||||
|
.setShortLabel(getString(DesignR.string.shortcut_stop_short))
|
||||||
|
.setLongLabel(getString(DesignR.string.shortcut_stop_long))
|
||||||
|
.setIcon(icon)
|
||||||
|
.setIntent(
|
||||||
|
Intent(Intents.ACTION_STOP_CLASH)
|
||||||
|
.setClassName(this, ExternalControlActivity::class.java.name)
|
||||||
|
.addFlags(flags)
|
||||||
|
)
|
||||||
|
.setRank(2)
|
||||||
|
.build()
|
||||||
|
|
||||||
|
ShortcutManagerCompat.setDynamicShortcuts(this, listOf(toggle, start, stop))
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun extractGeoFiles() {
|
||||||
|
clashDir.mkdirs()
|
||||||
|
|
||||||
|
val updateDate = packageManager.getPackageInfo(packageName, 0).lastUpdateTime
|
||||||
val geoipFile = File(clashDir, "geoip.metadb")
|
val geoipFile = File(clashDir, "geoip.metadb")
|
||||||
if(!geoipFile.exists()) {
|
if (geoipFile.exists() && geoipFile.lastModified() < updateDate) {
|
||||||
|
geoipFile.delete()
|
||||||
|
}
|
||||||
|
if (!geoipFile.exists()) {
|
||||||
FileOutputStream(geoipFile).use {
|
FileOutputStream(geoipFile).use {
|
||||||
assets.open("geoip.metadb").copyTo(it);
|
assets.open("geoip.metadb").copyTo(it)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
val geositeFile = File(clashDir, "geosite.dat")
|
val geositeFile = File(clashDir, "geosite.dat")
|
||||||
if(!geositeFile.exists()) {
|
if (geositeFile.exists() && geositeFile.lastModified() < updateDate) {
|
||||||
|
geositeFile.delete()
|
||||||
|
}
|
||||||
|
if (!geositeFile.exists()) {
|
||||||
FileOutputStream(geositeFile).use {
|
FileOutputStream(geositeFile).use {
|
||||||
assets.open("geosite.dat").copyTo(it);
|
assets.open("geosite.dat").copyTo(it)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
val ASNFile = File(clashDir, "ASN.mmdb")
|
val asnFile = File(clashDir, "ASN.mmdb")
|
||||||
if(!ASNFile.exists()) {
|
if (asnFile.exists() && asnFile.lastModified() < updateDate) {
|
||||||
FileOutputStream(ASNFile).use {
|
asnFile.delete()
|
||||||
assets.open("ASN.mmdb").copyTo(it);
|
}
|
||||||
|
if (!asnFile.exists()) {
|
||||||
|
FileOutputStream(asnFile).use {
|
||||||
|
assets.open("ASN.mmdb").copyTo(it)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -66,4 +134,4 @@ class MainApplication : Application() {
|
|||||||
fun finalize() {
|
fun finalize() {
|
||||||
Global.destroy()
|
Global.destroy()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ import kotlinx.coroutines.selects.select
|
|||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.io.FileOutputStream
|
import java.io.FileOutputStream
|
||||||
|
import com.github.kr328.clash.design.R
|
||||||
|
|
||||||
|
|
||||||
class MetaFeatureSettingsActivity : BaseActivity<MetaFeatureSettingsDesign>() {
|
class MetaFeatureSettingsActivity : BaseActivity<MetaFeatureSettingsDesign>() {
|
||||||
|
|||||||
@@ -6,15 +6,25 @@ import android.content.Intent
|
|||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
import android.provider.Settings
|
import android.provider.Settings
|
||||||
import androidx.activity.result.contract.ActivityResultContracts
|
import androidx.activity.result.contract.ActivityResultContracts
|
||||||
|
import androidx.lifecycle.lifecycleScope
|
||||||
import com.github.kr328.clash.common.constants.Intents
|
import com.github.kr328.clash.common.constants.Intents
|
||||||
import com.github.kr328.clash.common.util.intent
|
import com.github.kr328.clash.common.util.intent
|
||||||
import com.github.kr328.clash.common.util.setUUID
|
import com.github.kr328.clash.common.util.setUUID
|
||||||
import com.github.kr328.clash.design.NewProfileDesign
|
import com.github.kr328.clash.design.NewProfileDesign
|
||||||
|
import com.github.kr328.clash.design.R
|
||||||
import com.github.kr328.clash.design.model.ProfileProvider
|
import com.github.kr328.clash.design.model.ProfileProvider
|
||||||
|
import com.github.kr328.clash.design.util.showExceptionToast
|
||||||
import com.github.kr328.clash.service.model.Profile
|
import com.github.kr328.clash.service.model.Profile
|
||||||
import com.github.kr328.clash.util.withProfile
|
import com.github.kr328.clash.util.withProfile
|
||||||
|
import io.github.g00fy2.quickie.QRResult
|
||||||
|
import io.github.g00fy2.quickie.QRResult.QRError
|
||||||
|
import io.github.g00fy2.quickie.QRResult.QRMissingPermission
|
||||||
|
import io.github.g00fy2.quickie.QRResult.QRSuccess
|
||||||
|
import io.github.g00fy2.quickie.QRResult.QRUserCanceled
|
||||||
|
import io.github.g00fy2.quickie.ScanQRCode
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.isActive
|
import kotlinx.coroutines.isActive
|
||||||
|
import kotlinx.coroutines.launch
|
||||||
import kotlinx.coroutines.selects.select
|
import kotlinx.coroutines.selects.select
|
||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
import java.util.*
|
import java.util.*
|
||||||
@@ -23,6 +33,8 @@ class NewProfileActivity : BaseActivity<NewProfileDesign>() {
|
|||||||
private val self: NewProfileActivity
|
private val self: NewProfileActivity
|
||||||
get() = this
|
get() = this
|
||||||
|
|
||||||
|
private val scanLauncher = registerForActivityResult(ScanQRCode(), ::scanResultHandler)
|
||||||
|
|
||||||
override suspend fun main() {
|
override suspend fun main() {
|
||||||
val design = NewProfileDesign(this)
|
val design = NewProfileDesign(this)
|
||||||
|
|
||||||
@@ -44,8 +56,14 @@ class NewProfileActivity : BaseActivity<NewProfileDesign>() {
|
|||||||
val uuid: UUID? = when (val p = it.provider) {
|
val uuid: UUID? = when (val p = it.provider) {
|
||||||
is ProfileProvider.File ->
|
is ProfileProvider.File ->
|
||||||
create(Profile.Type.File, name)
|
create(Profile.Type.File, name)
|
||||||
|
|
||||||
is ProfileProvider.Url ->
|
is ProfileProvider.Url ->
|
||||||
create(Profile.Type.Url, name)
|
create(Profile.Type.Url, name)
|
||||||
|
|
||||||
|
is ProfileProvider.QR -> {
|
||||||
|
null
|
||||||
|
}
|
||||||
|
|
||||||
is ProfileProvider.External -> {
|
is ProfileProvider.External -> {
|
||||||
val data = p.get()
|
val data = p.get()
|
||||||
|
|
||||||
@@ -67,9 +85,14 @@ class NewProfileActivity : BaseActivity<NewProfileDesign>() {
|
|||||||
launchProperties(uuid)
|
launchProperties(uuid)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
is NewProfileDesign.Request.OpenDetail -> {
|
is NewProfileDesign.Request.OpenDetail -> {
|
||||||
launchAppDetailed(it.provider)
|
launchAppDetailed(it.provider)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
is NewProfileDesign.Request.LaunchScanner -> {
|
||||||
|
scanLauncher.launch(null)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -137,7 +160,41 @@ class NewProfileActivity : BaseActivity<NewProfileDesign>() {
|
|||||||
ProfileProvider.External(name.toString(), summary.toString(), icon, intent)
|
ProfileProvider.External(name.toString(), summary.toString(), icon, intent)
|
||||||
}
|
}
|
||||||
|
|
||||||
listOf(ProfileProvider.File(self), ProfileProvider.Url(self)) + providers
|
listOf(
|
||||||
|
ProfileProvider.File(self),
|
||||||
|
ProfileProvider.Url(self),
|
||||||
|
ProfileProvider.QR(self)
|
||||||
|
) + providers
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun scanResultHandler(result: QRResult) {
|
||||||
|
lifecycleScope.launch {
|
||||||
|
when (result) {
|
||||||
|
is QRSuccess -> {
|
||||||
|
val url = result.content.rawValue
|
||||||
|
?: result.content.rawBytes?.let { String(it) }.orEmpty()
|
||||||
|
|
||||||
|
createProfileByQrCode(url)
|
||||||
|
}
|
||||||
|
|
||||||
|
QRUserCanceled -> {}
|
||||||
|
QRMissingPermission -> design?.showExceptionToast(getString(R.string.import_from_qr_no_permission))
|
||||||
|
is QRError -> design?.showExceptionToast(getString(R.string.import_from_qr_exception))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private suspend fun createProfileByQrCode(url: String) {
|
||||||
|
withProfile {
|
||||||
|
launchProperties(
|
||||||
|
create(
|
||||||
|
type = Profile.Type.Url,
|
||||||
|
name = getString(R.string.new_profile),
|
||||||
|
url,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ import com.github.kr328.clash.common.util.setUUID
|
|||||||
import com.github.kr328.clash.common.util.ticker
|
import com.github.kr328.clash.common.util.ticker
|
||||||
import com.github.kr328.clash.design.ProfilesDesign
|
import com.github.kr328.clash.design.ProfilesDesign
|
||||||
import com.github.kr328.clash.design.ui.ToastDuration
|
import com.github.kr328.clash.design.ui.ToastDuration
|
||||||
import com.github.kr328.clash.R
|
|
||||||
import com.github.kr328.clash.service.model.Profile
|
import com.github.kr328.clash.service.model.Profile
|
||||||
import com.github.kr328.clash.util.withProfile
|
import com.github.kr328.clash.util.withProfile
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
@@ -19,6 +18,7 @@ import kotlinx.coroutines.selects.select
|
|||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
import java.util.*
|
import java.util.*
|
||||||
import java.util.concurrent.TimeUnit
|
import java.util.concurrent.TimeUnit
|
||||||
|
import com.github.kr328.clash.design.R
|
||||||
|
|
||||||
class ProfilesActivity : BaseActivity<ProfilesDesign>() {
|
class ProfilesActivity : BaseActivity<ProfilesDesign>() {
|
||||||
override suspend fun main() {
|
override suspend fun main() {
|
||||||
|
|||||||
@@ -12,9 +12,11 @@ import kotlinx.coroutines.coroutineScope
|
|||||||
import kotlinx.coroutines.isActive
|
import kotlinx.coroutines.isActive
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import kotlinx.coroutines.selects.select
|
import kotlinx.coroutines.selects.select
|
||||||
|
import com.github.kr328.clash.design.R
|
||||||
|
|
||||||
class PropertiesActivity : BaseActivity<PropertiesDesign>() {
|
class PropertiesActivity : BaseActivity<PropertiesDesign>() {
|
||||||
private var canceled: Boolean = false
|
private var canceled: Boolean = false
|
||||||
|
private lateinit var original: Profile
|
||||||
|
|
||||||
override suspend fun main() {
|
override suspend fun main() {
|
||||||
setResult(RESULT_CANCELED)
|
setResult(RESULT_CANCELED)
|
||||||
@@ -22,7 +24,7 @@ class PropertiesActivity : BaseActivity<PropertiesDesign>() {
|
|||||||
val uuid = intent.uuid ?: return finish()
|
val uuid = intent.uuid ?: return finish()
|
||||||
val design = PropertiesDesign(this)
|
val design = PropertiesDesign(this)
|
||||||
|
|
||||||
val original = withProfile { queryByUUID(uuid) } ?: return finish()
|
original = withProfile { queryByUUID(uuid) } ?: return finish()
|
||||||
|
|
||||||
design.profile = original
|
design.profile = original
|
||||||
|
|
||||||
@@ -71,7 +73,7 @@ class PropertiesActivity : BaseActivity<PropertiesDesign>() {
|
|||||||
design?.apply {
|
design?.apply {
|
||||||
launch {
|
launch {
|
||||||
if (!progressing) {
|
if (!progressing) {
|
||||||
if (requestExitWithoutSaving())
|
if (original == profile || requestExitWithoutSaving())
|
||||||
finish()
|
finish()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import kotlinx.coroutines.isActive
|
|||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import kotlinx.coroutines.selects.select
|
import kotlinx.coroutines.selects.select
|
||||||
import java.util.concurrent.TimeUnit
|
import java.util.concurrent.TimeUnit
|
||||||
|
import com.github.kr328.clash.design.R
|
||||||
|
|
||||||
class ProvidersActivity : BaseActivity<ProvidersDesign>() {
|
class ProvidersActivity : BaseActivity<ProvidersDesign>() {
|
||||||
override suspend fun main() {
|
override suspend fun main() {
|
||||||
|
|||||||
@@ -9,11 +9,13 @@ import android.os.Build
|
|||||||
import android.service.quicksettings.Tile
|
import android.service.quicksettings.Tile
|
||||||
import android.service.quicksettings.TileService
|
import android.service.quicksettings.TileService
|
||||||
import androidx.annotation.RequiresApi
|
import androidx.annotation.RequiresApi
|
||||||
|
import com.github.kr328.clash.common.compat.registerReceiverCompat
|
||||||
import com.github.kr328.clash.common.constants.Intents
|
import com.github.kr328.clash.common.constants.Intents
|
||||||
import com.github.kr328.clash.common.constants.Permissions
|
import com.github.kr328.clash.common.constants.Permissions
|
||||||
import com.github.kr328.clash.remote.StatusClient
|
import com.github.kr328.clash.remote.StatusClient
|
||||||
import com.github.kr328.clash.util.startClashService
|
import com.github.kr328.clash.util.startClashService
|
||||||
import com.github.kr328.clash.util.stopClashService
|
import com.github.kr328.clash.util.stopClashService
|
||||||
|
import com.github.kr328.clash.service.R
|
||||||
|
|
||||||
@RequiresApi(Build.VERSION_CODES.N)
|
@RequiresApi(Build.VERSION_CODES.N)
|
||||||
class TileService : TileService() {
|
class TileService : TileService() {
|
||||||
@@ -36,7 +38,7 @@ class TileService : TileService() {
|
|||||||
override fun onStartListening() {
|
override fun onStartListening() {
|
||||||
super.onStartListening()
|
super.onStartListening()
|
||||||
|
|
||||||
registerReceiver(
|
registerReceiverCompat(
|
||||||
receiver,
|
receiver,
|
||||||
IntentFilter().apply {
|
IntentFilter().apply {
|
||||||
addAction(Intents.ACTION_CLASH_STARTED)
|
addAction(Intents.ACTION_CLASH_STARTED)
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import android.content.BroadcastReceiver
|
|||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.content.IntentFilter
|
import android.content.IntentFilter
|
||||||
|
import com.github.kr328.clash.common.compat.registerReceiverCompat
|
||||||
import com.github.kr328.clash.common.constants.Intents
|
import com.github.kr328.clash.common.constants.Intents
|
||||||
import com.github.kr328.clash.common.log.Log
|
import com.github.kr328.clash.common.log.Log
|
||||||
import java.util.*
|
import java.util.*
|
||||||
@@ -88,7 +89,7 @@ class Broadcasts(private val context: Application) {
|
|||||||
return
|
return
|
||||||
|
|
||||||
try {
|
try {
|
||||||
context.registerReceiver(broadcastReceiver, IntentFilter().apply {
|
context.registerReceiverCompat(broadcastReceiver, IntentFilter().apply {
|
||||||
addAction(Intents.ACTION_SERVICE_RECREATED)
|
addAction(Intents.ACTION_SERVICE_RECREATED)
|
||||||
addAction(Intents.ACTION_CLASH_STARTED)
|
addAction(Intents.ACTION_CLASH_STARTED)
|
||||||
addAction(Intents.ACTION_CLASH_STOPPED)
|
addAction(Intents.ACTION_CLASH_STOPPED)
|
||||||
|
|||||||
@@ -7,16 +7,12 @@ import kotlinx.coroutines.NonCancellable
|
|||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
|
|
||||||
class ActivityResultLifecycle : LifecycleOwner {
|
class ActivityResultLifecycle : LifecycleOwner {
|
||||||
private val lifecycle = LifecycleRegistry(this)
|
override val lifecycle = LifecycleRegistry(this)
|
||||||
|
|
||||||
init {
|
init {
|
||||||
lifecycle.currentState = Lifecycle.State.INITIALIZED
|
lifecycle.currentState = Lifecycle.State.INITIALIZED
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getLifecycle(): Lifecycle {
|
|
||||||
return lifecycle
|
|
||||||
}
|
|
||||||
|
|
||||||
suspend fun <T> use(block: suspend (lifecycle: ActivityResultLifecycle, start: () -> Unit) -> T): T {
|
suspend fun <T> use(block: suspend (lifecycle: ActivityResultLifecycle, start: () -> Unit) -> T): T {
|
||||||
return try {
|
return try {
|
||||||
markCreated()
|
markCreated()
|
||||||
|
|||||||
@@ -31,21 +31,43 @@ subprojects {
|
|||||||
|
|
||||||
apply(plugin = if (isApp) "com.android.application" else "com.android.library")
|
apply(plugin = if (isApp) "com.android.application" else "com.android.library")
|
||||||
|
|
||||||
|
fun queryConfigProperty(key: String): Any? {
|
||||||
|
val localProperties = Properties()
|
||||||
|
val localPropertiesFile = rootProject.file("local.properties")
|
||||||
|
if (localPropertiesFile.exists()) {
|
||||||
|
localProperties.load(localPropertiesFile.inputStream())
|
||||||
|
} else {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
return localProperties.getProperty(key)
|
||||||
|
}
|
||||||
|
|
||||||
extensions.configure<BaseExtension> {
|
extensions.configure<BaseExtension> {
|
||||||
|
buildFeatures.buildConfig = true
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
if (isApp) {
|
if (isApp) {
|
||||||
applicationId = "com.github.metacubex.clash"
|
val customApplicationId = queryConfigProperty("custom.application.id") as? String?
|
||||||
|
applicationId = customApplicationId.takeIf { it?.isNotBlank() == true } ?: "com.github.metacubex.clash"
|
||||||
|
}
|
||||||
|
|
||||||
|
project.name.let { name ->
|
||||||
|
namespace = if (name == "app") "com.github.kr328.clash"
|
||||||
|
else "com.github.kr328.clash.$name"
|
||||||
}
|
}
|
||||||
|
|
||||||
minSdk = 21
|
minSdk = 21
|
||||||
targetSdk = 31
|
targetSdk = 35
|
||||||
|
|
||||||
versionName = "2.11.2"
|
versionName = "2.11.27"
|
||||||
versionCode = 211002
|
versionCode = 211027
|
||||||
|
|
||||||
resValue("string", "release_name", "v$versionName")
|
resValue("string", "release_name", "v$versionName")
|
||||||
resValue("integer", "release_code", "$versionCode")
|
resValue("integer", "release_code", "$versionCode")
|
||||||
|
|
||||||
|
ndk {
|
||||||
|
abiFilters += listOf("arm64-v8a", "armeabi-v7a", "x86", "x86_64")
|
||||||
|
}
|
||||||
|
|
||||||
externalNativeBuild {
|
externalNativeBuild {
|
||||||
cmake {
|
cmake {
|
||||||
abiFilters("arm64-v8a", "armeabi-v7a", "x86", "x86_64")
|
abiFilters("arm64-v8a", "armeabi-v7a", "x86", "x86_64")
|
||||||
@@ -59,7 +81,7 @@ subprojects {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ndkVersion = "23.0.7599858"
|
ndkVersion = "29.0.14206865"
|
||||||
|
|
||||||
compileSdkVersion(defaultConfig.targetSdk!!)
|
compileSdkVersion(defaultConfig.targetSdk!!)
|
||||||
|
|
||||||
@@ -74,17 +96,22 @@ subprojects {
|
|||||||
productFlavors {
|
productFlavors {
|
||||||
flavorDimensions("feature")
|
flavorDimensions("feature")
|
||||||
|
|
||||||
|
val removeSuffix = (queryConfigProperty("remove.suffix") as? String)?.toBoolean() == true
|
||||||
|
|
||||||
create("alpha") {
|
create("alpha") {
|
||||||
isDefault = true
|
isDefault = true
|
||||||
dimension = flavorDimensionList[0]
|
dimension = flavorDimensionList[0]
|
||||||
versionNameSuffix = ".Alpha"
|
if (!removeSuffix) {
|
||||||
|
versionNameSuffix = ".Alpha"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
buildConfigField("boolean", "PREMIUM", "Boolean.parseBoolean(\"false\")")
|
buildConfigField("boolean", "PREMIUM", "Boolean.parseBoolean(\"false\")")
|
||||||
|
|
||||||
resValue("string", "launch_name", "@string/launch_name_alpha")
|
resValue("string", "launch_name", "@string/launch_name_alpha")
|
||||||
resValue("string", "application_name", "@string/application_name_alpha")
|
resValue("string", "application_name", "@string/application_name_alpha")
|
||||||
|
|
||||||
if (isApp) {
|
if (isApp && !removeSuffix) {
|
||||||
applicationIdSuffix = ".alpha"
|
applicationIdSuffix = ".alpha"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -92,14 +119,16 @@ subprojects {
|
|||||||
create("meta") {
|
create("meta") {
|
||||||
|
|
||||||
dimension = flavorDimensionList[0]
|
dimension = flavorDimensionList[0]
|
||||||
versionNameSuffix = ".Meta"
|
if (!removeSuffix) {
|
||||||
|
versionNameSuffix = ".Meta"
|
||||||
|
}
|
||||||
|
|
||||||
buildConfigField("boolean", "PREMIUM", "Boolean.parseBoolean(\"false\")")
|
buildConfigField("boolean", "PREMIUM", "Boolean.parseBoolean(\"false\")")
|
||||||
|
|
||||||
resValue("string", "launch_name", "@string/launch_name_meta")
|
resValue("string", "launch_name", "@string/launch_name_meta")
|
||||||
resValue("string", "application_name", "@string/application_name_meta")
|
resValue("string", "application_name", "@string/application_name_meta")
|
||||||
|
|
||||||
if (isApp) {
|
if (isApp && !removeSuffix) {
|
||||||
applicationIdSuffix = ".meta"
|
applicationIdSuffix = ".meta"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -134,7 +163,7 @@ subprojects {
|
|||||||
named("release") {
|
named("release") {
|
||||||
isMinifyEnabled = isApp
|
isMinifyEnabled = isApp
|
||||||
isShrinkResources = isApp
|
isShrinkResources = isApp
|
||||||
signingConfig = signingConfigs.findByName("release")
|
signingConfig = signingConfigs.findByName("release") ?: signingConfigs["debug"]
|
||||||
proguardFiles(
|
proguardFiles(
|
||||||
getDefaultProguardFile("proguard-android-optimize.txt"),
|
getDefaultProguardFile("proguard-android-optimize.txt"),
|
||||||
"proguard-rules.pro"
|
"proguard-rules.pro"
|
||||||
@@ -158,9 +187,16 @@ subprojects {
|
|||||||
abi {
|
abi {
|
||||||
isEnable = true
|
isEnable = true
|
||||||
isUniversalApk = true
|
isUniversalApk = true
|
||||||
|
reset()
|
||||||
|
include("arm64-v8a", "armeabi-v7a", "x86", "x86_64")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
compileOptions {
|
||||||
|
sourceCompatibility = JavaVersion.VERSION_21
|
||||||
|
targetCompatibility = JavaVersion.VERSION_21
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -178,4 +214,4 @@ tasks.wrapper {
|
|||||||
file("gradle/wrapper/gradle-wrapper.properties")
|
file("gradle/wrapper/gradle-wrapper.properties")
|
||||||
.appendText("distributionSha256Sum=$sha256")
|
.appendText("distributionSha256Sum=$sha256")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,5 +1,4 @@
|
|||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
package="com.github.kr328.clash.common">
|
|
||||||
|
|
||||||
<permission
|
<permission
|
||||||
android:name="${applicationId}.permission.RECEIVE_BROADCASTS"
|
android:name="${applicationId}.permission.RECEIVE_BROADCASTS"
|
||||||
|
|||||||
@@ -2,8 +2,13 @@
|
|||||||
|
|
||||||
package com.github.kr328.clash.common.compat
|
package com.github.kr328.clash.common.compat
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint
|
||||||
|
import android.content.BroadcastReceiver
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
|
import android.content.IntentFilter
|
||||||
import android.graphics.drawable.Drawable
|
import android.graphics.drawable.Drawable
|
||||||
|
import android.os.Build
|
||||||
|
import android.os.Handler
|
||||||
import androidx.annotation.ColorRes
|
import androidx.annotation.ColorRes
|
||||||
import androidx.annotation.DrawableRes
|
import androidx.annotation.DrawableRes
|
||||||
import androidx.core.content.ContextCompat
|
import androidx.core.content.ContextCompat
|
||||||
@@ -14,4 +19,19 @@ fun Context.getColorCompat(@ColorRes id: Int): Int {
|
|||||||
|
|
||||||
fun Context.getDrawableCompat(@DrawableRes id: Int): Drawable? {
|
fun Context.getDrawableCompat(@DrawableRes id: Int): Drawable? {
|
||||||
return ContextCompat.getDrawable(this, id)
|
return ContextCompat.getDrawable(this, id)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressLint("UnspecifiedRegisterReceiverFlag")
|
||||||
|
fun Context.registerReceiverCompat(
|
||||||
|
receiver: BroadcastReceiver,
|
||||||
|
filter: IntentFilter,
|
||||||
|
permission: String? = null,
|
||||||
|
handler: Handler? = null
|
||||||
|
) =
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU)
|
||||||
|
registerReceiver(receiver, filter, permission, handler,
|
||||||
|
if (permission == null) Context.RECEIVER_EXPORTED else Context.RECEIVER_NOT_EXPORTED
|
||||||
|
)
|
||||||
|
else
|
||||||
|
registerReceiver(receiver, filter, permission, handler)
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,10 @@
|
|||||||
package com.github.kr328.clash.common.compat
|
package com.github.kr328.clash.common.compat
|
||||||
|
|
||||||
|
import android.app.Notification
|
||||||
|
import android.app.Service
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
|
import android.content.pm.ServiceInfo
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
|
|
||||||
fun Context.startForegroundServiceCompat(intent: Intent) {
|
fun Context.startForegroundServiceCompat(intent: Intent) {
|
||||||
@@ -10,4 +13,12 @@ fun Context.startForegroundServiceCompat(intent: Intent) {
|
|||||||
} else {
|
} else {
|
||||||
startService(intent)
|
startService(intent)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun Service.startForegroundCompat(id: Int, notification: Notification) {
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
|
||||||
|
startForeground(id, notification, ServiceInfo.FOREGROUND_SERVICE_TYPE_SPECIAL_USE)
|
||||||
|
} else {
|
||||||
|
startForeground(id, notification)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
1
core/.gitignore
vendored
Normal file
1
core/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
/src/main/cpp/version.h
|
||||||
@@ -1,8 +1,6 @@
|
|||||||
|
import android.databinding.tool.ext.capitalizeUS
|
||||||
import com.github.kr328.golang.GolangBuildTask
|
import com.github.kr328.golang.GolangBuildTask
|
||||||
import com.github.kr328.golang.GolangPlugin
|
import com.github.kr328.golang.GolangPlugin
|
||||||
import java.io.FileOutputStream
|
|
||||||
import java.net.URL
|
|
||||||
import java.time.Duration
|
|
||||||
|
|
||||||
plugins {
|
plugins {
|
||||||
kotlin("android")
|
kotlin("android")
|
||||||
@@ -62,4 +60,19 @@ afterEvaluate {
|
|||||||
tasks.withType(GolangBuildTask::class.java).forEach {
|
tasks.withType(GolangBuildTask::class.java).forEach {
|
||||||
it.inputs.dir(golangSource)
|
it.inputs.dir(golangSource)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val abis = listOf("arm64-v8a" to "Arm64V8a", "armeabi-v7a" to "ArmeabiV7a", "x86" to "X86", "x86_64" to "X8664")
|
||||||
|
|
||||||
|
androidComponents.onVariants { variant ->
|
||||||
|
val cmakeName = if (variant.buildType == "debug") "Debug" else "RelWithDebInfo"
|
||||||
|
|
||||||
|
abis.forEach { (abi, goAbi) ->
|
||||||
|
tasks.configureEach {
|
||||||
|
if (name.startsWith("buildCMake$cmakeName[$abi]")) {
|
||||||
|
dependsOn("externalGolangBuild${variant.name.capitalizeUS()}$goAbi")
|
||||||
|
println("Set up dependency: $name -> externalGolangBuild${variant.name.capitalizeUS()}$goAbi")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Submodule core/src/foss/golang/clash updated: 89dfabe9b3...fc19782b2d
@@ -5,116 +5,113 @@ go 1.20
|
|||||||
require cfa v0.0.0
|
require cfa v0.0.0
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/3andne/restls-client-go v0.1.6 // indirect
|
github.com/RyuaNerin/go-krypto v1.3.0 // indirect
|
||||||
github.com/RyuaNerin/go-krypto v1.2.4 // indirect
|
|
||||||
github.com/Yawning/aez v0.0.0-20211027044916-e49e68abd344 // indirect
|
github.com/Yawning/aez v0.0.0-20211027044916-e49e68abd344 // indirect
|
||||||
github.com/ajg/form v1.5.1 // indirect
|
github.com/ajg/form v1.5.1 // indirect
|
||||||
github.com/andybalholm/brotli v1.0.6 // indirect
|
github.com/andybalholm/brotli v1.0.6 // indirect
|
||||||
github.com/bahlo/generic-list-go v0.2.0 // indirect
|
github.com/bahlo/generic-list-go v0.2.0 // indirect
|
||||||
github.com/buger/jsonparser v1.1.1 // indirect
|
|
||||||
github.com/cloudflare/circl v1.3.7 // indirect
|
|
||||||
github.com/coreos/go-iptables v0.8.0 // indirect
|
github.com/coreos/go-iptables v0.8.0 // indirect
|
||||||
github.com/dlclark/regexp2 v1.11.4 // indirect
|
github.com/dlclark/regexp2 v1.12.0 // indirect
|
||||||
github.com/ebitengine/purego v0.8.1 // indirect
|
github.com/dunglas/httpsfv v1.0.2 // indirect
|
||||||
github.com/enfein/mieru/v3 v3.8.4 // indirect
|
github.com/enfein/mieru/v3 v3.31.0 // indirect
|
||||||
github.com/ericlagergren/aegis v0.0.0-20230312195928-b4ce538b56f9 // indirect
|
github.com/ericlagergren/aegis v0.0.0-20250325060835-cd0defd64358 // indirect
|
||||||
github.com/ericlagergren/polyval v0.0.0-20220411101811-e25bc10ba391 // indirect
|
github.com/ericlagergren/polyval v0.0.0-20220411101811-e25bc10ba391 // indirect
|
||||||
github.com/ericlagergren/siv v0.0.0-20220507050439-0b757b3aa5f1 // indirect
|
github.com/ericlagergren/siv v0.0.0-20220507050439-0b757b3aa5f1 // indirect
|
||||||
github.com/ericlagergren/subtle v0.0.0-20220507045147-890d697da010 // indirect
|
github.com/ericlagergren/subtle v0.0.0-20220507045147-890d697da010 // indirect
|
||||||
github.com/fsnotify/fsnotify v1.7.0 // indirect
|
github.com/fsnotify/fsnotify v1.9.0 // indirect
|
||||||
github.com/gaukas/godicttls v0.0.4 // indirect
|
github.com/gaukas/godicttls v0.0.4 // indirect
|
||||||
github.com/go-chi/chi/v5 v5.1.0 // indirect
|
|
||||||
github.com/go-chi/render v1.0.3 // indirect
|
|
||||||
github.com/go-ole/go-ole v1.3.0 // indirect
|
github.com/go-ole/go-ole v1.3.0 // indirect
|
||||||
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect
|
|
||||||
github.com/gobwas/httphead v0.1.0 // indirect
|
github.com/gobwas/httphead v0.1.0 // indirect
|
||||||
github.com/gobwas/pool v0.2.1 // indirect
|
github.com/gobwas/pool v0.2.1 // indirect
|
||||||
github.com/gobwas/ws v1.4.0 // indirect
|
github.com/gobwas/ws v1.4.0 // indirect
|
||||||
github.com/gofrs/uuid/v5 v5.3.0 // indirect
|
github.com/gofrs/uuid/v5 v5.4.0 // indirect
|
||||||
github.com/golang/protobuf v1.5.4 // indirect
|
github.com/golang/snappy v1.0.0 // indirect
|
||||||
github.com/google/btree v1.1.3 // indirect
|
github.com/google/btree v1.1.3 // indirect
|
||||||
github.com/google/go-cmp v0.6.0 // indirect
|
github.com/google/go-cmp v0.6.0 // indirect
|
||||||
github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 // indirect
|
github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 // indirect
|
||||||
github.com/hashicorp/yamux v0.1.2 // indirect
|
github.com/insomniacslk/dhcp v0.0.0-20250109001534-8abf58130905 // indirect
|
||||||
github.com/insomniacslk/dhcp v0.0.0-20241203100832-a481575ed0ef // indirect
|
|
||||||
github.com/josharian/native v1.1.0 // indirect
|
github.com/josharian/native v1.1.0 // indirect
|
||||||
github.com/klauspost/compress v1.17.9 // indirect
|
github.com/klauspost/compress v1.17.9 // indirect
|
||||||
github.com/klauspost/cpuid/v2 v2.2.9 // indirect
|
github.com/klauspost/cpuid/v2 v2.2.6 // indirect
|
||||||
github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect
|
github.com/klauspost/reedsolomon v1.12.3 // indirect
|
||||||
github.com/lunixbochs/struc v0.0.0-20200707160740-784aaebc1d40 // indirect
|
|
||||||
github.com/mailru/easyjson v0.7.7 // indirect
|
|
||||||
github.com/mdlayher/netlink v1.7.2 // indirect
|
github.com/mdlayher/netlink v1.7.2 // indirect
|
||||||
github.com/mdlayher/socket v0.4.1 // indirect
|
github.com/mdlayher/socket v0.5.1 // indirect
|
||||||
github.com/metacubex/amneziawg-go v0.0.0-20240922133038-fdf3a4d5a4ab // indirect
|
github.com/metacubex/amneziawg-go v0.0.0-20251104174305-5a0e9f7e361d // indirect
|
||||||
github.com/metacubex/bbolt v0.0.0-20240822011022-aed6d4850399 // indirect
|
github.com/metacubex/ascon v0.1.0 // indirect
|
||||||
github.com/metacubex/chacha v0.1.0 // indirect
|
github.com/metacubex/bart v0.26.0 // indirect
|
||||||
|
github.com/metacubex/bbolt v0.0.0-20250725135710-010dbbbb7a5b // indirect
|
||||||
|
github.com/metacubex/blake3 v0.1.0 // indirect
|
||||||
|
github.com/metacubex/chacha v0.1.5 // indirect
|
||||||
|
github.com/metacubex/chi v0.1.0 // indirect
|
||||||
|
github.com/metacubex/connect-ip-go v0.0.0-20260412152424-e1625567920a // indirect
|
||||||
|
github.com/metacubex/cpu v0.1.1 // indirect
|
||||||
|
github.com/metacubex/edwards25519 v1.2.0 // indirect
|
||||||
|
github.com/metacubex/fswatch v0.1.1 // indirect
|
||||||
github.com/metacubex/gopacket v1.1.20-0.20230608035415-7e2f98a3e759 // indirect
|
github.com/metacubex/gopacket v1.1.20-0.20230608035415-7e2f98a3e759 // indirect
|
||||||
github.com/metacubex/gvisor v0.0.0-20241126021258-5b028898cc5a // indirect
|
github.com/metacubex/gvisor v0.0.0-20251227095601-261ec1326fe8 // indirect
|
||||||
|
github.com/metacubex/hkdf v0.1.0 // indirect
|
||||||
|
github.com/metacubex/hpke v0.1.0 // indirect
|
||||||
|
github.com/metacubex/http v0.1.4 // indirect
|
||||||
|
github.com/metacubex/kcp-go v0.0.0-20260105040817-550693377604 // indirect
|
||||||
|
github.com/metacubex/mhurl v0.1.0 // indirect
|
||||||
github.com/metacubex/mihomo v1.7.0 // indirect
|
github.com/metacubex/mihomo v1.7.0 // indirect
|
||||||
github.com/metacubex/quic-go v0.48.3-0.20241126053724-b69fea3888da // indirect
|
github.com/metacubex/mlkem v0.1.0 // indirect
|
||||||
|
github.com/metacubex/nftables v0.0.0-20260426003805-208c2c1ba2cb // indirect
|
||||||
|
github.com/metacubex/qpack v0.6.0 // indirect
|
||||||
|
github.com/metacubex/quic-go v0.59.1-0.20260413153657-53bb22f2c306 // indirect
|
||||||
github.com/metacubex/randv2 v0.2.0 // indirect
|
github.com/metacubex/randv2 v0.2.0 // indirect
|
||||||
github.com/metacubex/sing-quic v0.0.0-20240827003841-cd97758ed8b4 // indirect
|
github.com/metacubex/restls-client-go v0.1.7 // indirect
|
||||||
github.com/metacubex/sing-shadowsocks v0.2.8 // indirect
|
github.com/metacubex/sing v0.5.7 // indirect
|
||||||
github.com/metacubex/sing-shadowsocks2 v0.2.2 // indirect
|
github.com/metacubex/sing-mux v0.3.9 // indirect
|
||||||
github.com/metacubex/sing-tun v0.4.2 // indirect
|
github.com/metacubex/sing-quic v0.0.0-20260414034501-3ea3410d197a // indirect
|
||||||
github.com/metacubex/sing-vmess v0.1.9-0.20240719134745-1df6fb20bbf9 // indirect
|
github.com/metacubex/sing-shadowsocks v0.2.12 // indirect
|
||||||
github.com/metacubex/sing-wireguard v0.0.0-20241126021510-0827d417b589 // indirect
|
github.com/metacubex/sing-shadowsocks2 v0.2.7 // indirect
|
||||||
github.com/metacubex/tfo-go v0.0.0-20241006021335-daedaf0ca7aa // indirect
|
github.com/metacubex/sing-shadowtls v0.0.0-20250503063515-5d9f966d17a2 // indirect
|
||||||
github.com/metacubex/utls v1.6.6 // indirect
|
github.com/metacubex/sing-tun v0.4.18 // indirect
|
||||||
github.com/metacubex/wireguard-go v0.0.0-20240922131502-c182e7471181 // indirect
|
github.com/metacubex/sing-vmess v0.2.5 // indirect
|
||||||
github.com/miekg/dns v1.1.62 // indirect
|
github.com/metacubex/sing-wireguard v0.0.0-20260507084707-690d479ec947 // indirect
|
||||||
|
github.com/metacubex/smux v0.0.0-20260105030934-d0c8756d3141 // indirect
|
||||||
|
github.com/metacubex/ssh v0.1.0 // indirect
|
||||||
|
github.com/metacubex/tfo-go v0.0.0-20251130171125-413e892ac443 // indirect
|
||||||
|
github.com/metacubex/tls v0.1.5 // indirect
|
||||||
|
github.com/metacubex/utls v1.8.4 // indirect
|
||||||
|
github.com/metacubex/wireguard-go v0.0.0-20250820062549-a6cecdd7f57f // indirect
|
||||||
|
github.com/metacubex/yamux v0.0.0-20250918083631-dd5f17c0be49 // indirect
|
||||||
|
github.com/miekg/dns v1.1.63 // indirect
|
||||||
github.com/mroth/weightedrand/v2 v2.1.0 // indirect
|
github.com/mroth/weightedrand/v2 v2.1.0 // indirect
|
||||||
github.com/oasisprotocol/deoxysii v0.0.0-20220228165953-2091330c22b7 // indirect
|
github.com/oasisprotocol/deoxysii v0.0.0-20220228165953-2091330c22b7 // indirect
|
||||||
github.com/onsi/ginkgo/v2 v2.9.5 // indirect
|
|
||||||
github.com/openacid/low v0.1.21 // indirect
|
github.com/openacid/low v0.1.21 // indirect
|
||||||
github.com/oschwald/maxminddb-golang v1.12.0 // indirect
|
github.com/oschwald/maxminddb-golang v1.12.0 // indirect
|
||||||
github.com/pierrec/lz4/v4 v4.1.14 // indirect
|
github.com/pierrec/lz4/v4 v4.1.14 // indirect
|
||||||
github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect
|
|
||||||
github.com/puzpuzpuz/xsync/v3 v3.4.0 // indirect
|
|
||||||
github.com/quic-go/qpack v0.4.0 // indirect
|
|
||||||
github.com/quic-go/qtls-go1-20 v0.4.1 // indirect
|
|
||||||
github.com/sagernet/cors v1.2.1 // indirect
|
|
||||||
github.com/sagernet/fswatch v0.1.1 // indirect
|
|
||||||
github.com/sagernet/netlink v0.0.0-20240612041022-b9a21c07ac6a // indirect
|
github.com/sagernet/netlink v0.0.0-20240612041022-b9a21c07ac6a // indirect
|
||||||
github.com/sagernet/nftables v0.3.0-beta.4 // indirect
|
github.com/samber/lo v1.53.0 // indirect
|
||||||
github.com/sagernet/sing v0.5.1 // indirect
|
|
||||||
github.com/sagernet/sing-mux v0.2.1 // indirect
|
|
||||||
github.com/sagernet/sing-shadowtls v0.1.5 // indirect
|
|
||||||
github.com/sagernet/smux v0.0.0-20231208180855-7041f6ea79e7 // indirect
|
|
||||||
github.com/samber/lo v1.47.0 // indirect
|
|
||||||
github.com/shirou/gopsutil/v4 v4.24.11 // indirect
|
|
||||||
github.com/sina-ghaderi/poly1305 v0.0.0-20220724002748-c5926b03988b // indirect
|
github.com/sina-ghaderi/poly1305 v0.0.0-20220724002748-c5926b03988b // indirect
|
||||||
github.com/sina-ghaderi/rabaead v0.0.0-20220730151906-ab6e06b96e8c // indirect
|
github.com/sina-ghaderi/rabaead v0.0.0-20220730151906-ab6e06b96e8c // indirect
|
||||||
github.com/sina-ghaderi/rabbitio v0.0.0-20220730151941-9ce26f4f872e // indirect
|
github.com/sina-ghaderi/rabbitio v0.0.0-20220730151941-9ce26f4f872e // indirect
|
||||||
github.com/sirupsen/logrus v1.9.3 // indirect
|
github.com/sirupsen/logrus v1.9.4 // indirect
|
||||||
github.com/tklauser/go-sysconf v0.3.12 // indirect
|
|
||||||
github.com/tklauser/numcpus v0.6.1 // indirect
|
|
||||||
github.com/u-root/uio v0.0.0-20230220225925-ffce2a382923 // indirect
|
github.com/u-root/uio v0.0.0-20230220225925-ffce2a382923 // indirect
|
||||||
github.com/vishvananda/netns v0.0.4 // indirect
|
github.com/vishvananda/netns v0.0.5 // indirect
|
||||||
github.com/vmihailenco/msgpack/v5 v5.4.1 // indirect
|
github.com/vmihailenco/msgpack/v5 v5.4.1 // indirect
|
||||||
github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect
|
github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect
|
||||||
github.com/wk8/go-ordered-map/v2 v2.1.8 // indirect
|
github.com/yosida95/uritemplate/v3 v3.0.2 // indirect
|
||||||
github.com/yusufpapurcu/wmi v1.2.4 // indirect
|
|
||||||
gitlab.com/go-extension/aes-ccm v0.0.0-20230221065045-e58665ef23c7 // indirect
|
gitlab.com/go-extension/aes-ccm v0.0.0-20230221065045-e58665ef23c7 // indirect
|
||||||
gitlab.com/yawning/bsaes.git v0.0.0-20190805113838-0a714cd429ec // indirect
|
gitlab.com/yawning/bsaes.git v0.0.0-20190805113838-0a714cd429ec // indirect
|
||||||
go.uber.org/mock v0.4.0 // indirect
|
|
||||||
go4.org/netipx v0.0.0-20231129151722-fdeea329fbba // indirect
|
go4.org/netipx v0.0.0-20231129151722-fdeea329fbba // indirect
|
||||||
golang.org/x/crypto v0.31.0 // indirect
|
golang.org/x/crypto v0.33.0 // indirect
|
||||||
golang.org/x/exp v0.0.0-20240904232852-e7e105dedf7e // indirect
|
golang.org/x/exp v0.0.0-20240904232852-e7e105dedf7e // indirect
|
||||||
golang.org/x/mod v0.20.0 // indirect
|
golang.org/x/mod v0.20.0 // indirect
|
||||||
golang.org/x/net v0.32.0 // indirect
|
golang.org/x/net v0.35.0 // indirect
|
||||||
golang.org/x/sync v0.10.0 // indirect
|
golang.org/x/sync v0.11.0 // indirect
|
||||||
golang.org/x/sys v0.28.0 // indirect
|
golang.org/x/sys v0.30.0 // indirect
|
||||||
golang.org/x/text v0.21.0 // indirect
|
golang.org/x/text v0.22.0 // indirect
|
||||||
golang.org/x/time v0.7.0 // indirect
|
golang.org/x/time v0.10.0 // indirect
|
||||||
golang.org/x/tools v0.24.0 // indirect
|
golang.org/x/tools v0.24.0 // indirect
|
||||||
google.golang.org/protobuf v1.34.2 // indirect
|
google.golang.org/protobuf v1.34.2 // indirect
|
||||||
gopkg.in/yaml.v3 v3.0.1 // indirect
|
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||||
lukechampine.com/blake3 v1.3.0 // indirect
|
|
||||||
)
|
)
|
||||||
|
|
||||||
replace github.com/sagernet/sing => github.com/metacubex/sing v0.0.0-20241121030428-33b6ebc52000
|
|
||||||
|
|
||||||
replace cfa => ../../main/golang
|
replace cfa => ../../main/golang
|
||||||
|
|
||||||
replace github.com/metacubex/mihomo => ./clash
|
replace github.com/metacubex/mihomo => ./clash
|
||||||
|
|
||||||
|
replace google.golang.org/protobuf => github.com/metacubex/protobuf-go v0.0.0-20260306035419-7ceee0674686
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
github.com/3andne/restls-client-go v0.1.6 h1:tRx/YilqW7iHpgmEL4E1D8dAsuB0tFF3uvncS+B6I08=
|
github.com/RyuaNerin/go-krypto v1.3.0 h1:smavTzSMAx8iuVlGb4pEwl9MD2qicqMzuXR2QWp2/Pg=
|
||||||
github.com/3andne/restls-client-go v0.1.6/go.mod h1:iEdTZNt9kzPIxjIGSMScUFSBrUH6bFRNg0BWlP4orEY=
|
github.com/RyuaNerin/go-krypto v1.3.0/go.mod h1:9R9TU936laAIqAmjcHo/LsaXYOZlymudOAxjaBf62UM=
|
||||||
github.com/RyuaNerin/elliptic2 v1.0.0/go.mod h1:wWB8fWrJI/6EPJkyV/r1Rj0hxUgrusmqSj8JN6yNf/A=
|
github.com/RyuaNerin/testingutil v0.1.0 h1:IYT6JL57RV3U2ml3dLHZsVtPOP6yNK7WUVdzzlpNrss=
|
||||||
github.com/RyuaNerin/go-krypto v1.2.4 h1:mXuNdK6M317aPV0llW6Xpjbo4moOlPF7Yxz4tb4b4Go=
|
|
||||||
github.com/RyuaNerin/go-krypto v1.2.4/go.mod h1:QqCYkoutU3yInyD9INt2PGolVRsc3W4oraQadVGXJ/8=
|
|
||||||
github.com/Yawning/aez v0.0.0-20211027044916-e49e68abd344 h1:cDVUiFo+npB0ZASqnw4q90ylaVAbnYyx0JYqK4YcGok=
|
github.com/Yawning/aez v0.0.0-20211027044916-e49e68abd344 h1:cDVUiFo+npB0ZASqnw4q90ylaVAbnYyx0JYqK4YcGok=
|
||||||
github.com/Yawning/aez v0.0.0-20211027044916-e49e68abd344/go.mod h1:9pIqrY6SXNL8vjRQE5Hd/OL5GyK/9MrGUWs87z/eFfk=
|
github.com/Yawning/aez v0.0.0-20211027044916-e49e68abd344/go.mod h1:9pIqrY6SXNL8vjRQE5Hd/OL5GyK/9MrGUWs87z/eFfk=
|
||||||
github.com/ajg/form v1.5.1 h1:t9c7v8JUKu/XxOGBU0yjNpaMloxGEJhUkqFRq0ibGeU=
|
github.com/ajg/form v1.5.1 h1:t9c7v8JUKu/XxOGBU0yjNpaMloxGEJhUkqFRq0ibGeU=
|
||||||
@@ -12,26 +10,18 @@ github.com/andybalholm/brotli v1.0.6/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHG
|
|||||||
github.com/bahlo/generic-list-go v0.2.0 h1:5sz/EEAK+ls5wF+NeqDpk5+iNdMDXrh3z3nPnH1Wvgk=
|
github.com/bahlo/generic-list-go v0.2.0 h1:5sz/EEAK+ls5wF+NeqDpk5+iNdMDXrh3z3nPnH1Wvgk=
|
||||||
github.com/bahlo/generic-list-go v0.2.0/go.mod h1:2KvAjgMlE5NNynlg/5iLrrCCZ2+5xWbdbCW3pNTGyYg=
|
github.com/bahlo/generic-list-go v0.2.0/go.mod h1:2KvAjgMlE5NNynlg/5iLrrCCZ2+5xWbdbCW3pNTGyYg=
|
||||||
github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=
|
github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=
|
||||||
github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs=
|
|
||||||
github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0=
|
|
||||||
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
|
|
||||||
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
|
|
||||||
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
|
|
||||||
github.com/cloudflare/circl v1.3.7 h1:qlCDlTPz2n9fu58M0Nh1J/JzcFpfgkFHHX3O35r5vcU=
|
|
||||||
github.com/cloudflare/circl v1.3.7/go.mod h1:sRTcRWXGLrKw6yIGJ+l7amYJFfAXbZG0kBSc8r4zxgA=
|
|
||||||
github.com/coreos/go-iptables v0.8.0 h1:MPc2P89IhuVpLI7ETL/2tx3XZ61VeICZjYqDEgNsPRc=
|
github.com/coreos/go-iptables v0.8.0 h1:MPc2P89IhuVpLI7ETL/2tx3XZ61VeICZjYqDEgNsPRc=
|
||||||
github.com/coreos/go-iptables v0.8.0/go.mod h1:Qe8Bv2Xik5FyTXwgIbLAnv2sWSBmvWdFETJConOQ//Q=
|
github.com/coreos/go-iptables v0.8.0/go.mod h1:Qe8Bv2Xik5FyTXwgIbLAnv2sWSBmvWdFETJConOQ//Q=
|
||||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/dlclark/regexp2 v1.12.0 h1:0j4c5qQmnC6XOWNjP3PIXURXN2gWx76rd3KvgdPkCz8=
|
||||||
github.com/dlclark/regexp2 v1.11.4 h1:rPYF9/LECdNymJufQKmri9gV604RvvABwgOA8un7yAo=
|
github.com/dlclark/regexp2 v1.12.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
|
||||||
github.com/dlclark/regexp2 v1.11.4/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
|
github.com/dunglas/httpsfv v1.0.2 h1:iERDp/YAfnojSDJ7PW3dj1AReJz4MrwbECSSE59JWL0=
|
||||||
github.com/ebitengine/purego v0.8.1 h1:sdRKd6plj7KYW33EH5As6YKfe8m9zbN9JMrOjNVF/BE=
|
github.com/dunglas/httpsfv v1.0.2/go.mod h1:zID2mqw9mFsnt7YC3vYQ9/cjq30q41W+1AnDwH8TiMg=
|
||||||
github.com/ebitengine/purego v0.8.1/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ=
|
github.com/enfein/mieru/v3 v3.31.0 h1:Fl2ocRCRXJzMygzdRjBHgqI996ZuIDHUmyQyovSf9sA=
|
||||||
github.com/enfein/mieru/v3 v3.8.4 h1:PmBQykuEcl8yKcQ647pg8Qbjl433CRYgUbW6VLBgGn4=
|
github.com/enfein/mieru/v3 v3.31.0/go.mod h1:zJBUCsi5rxyvHM8fjFf+GLaEl4OEjjBXr1s5F6Qd3hM=
|
||||||
github.com/enfein/mieru/v3 v3.8.4/go.mod h1:YtU00qjAEt54mCBQu4WZPCey6cBdB1BUtXjvrHLEUNQ=
|
github.com/ericlagergren/aegis v0.0.0-20250325060835-cd0defd64358 h1:kXYqH/sL8dS/FdoFjr12ePjnLPorPo2FsnrHNuXSDyo=
|
||||||
github.com/ericlagergren/aegis v0.0.0-20230312195928-b4ce538b56f9 h1:/5RkVc9Rc81XmMyVqawCiDyrBHZbLAZgTTCqou4mwj8=
|
github.com/ericlagergren/aegis v0.0.0-20250325060835-cd0defd64358/go.mod h1:hkIFzoiIPZYxdFOOLyDho59b7SrDfo+w3h+yWdlg45I=
|
||||||
github.com/ericlagergren/aegis v0.0.0-20230312195928-b4ce538b56f9/go.mod h1:hkIFzoiIPZYxdFOOLyDho59b7SrDfo+w3h+yWdlg45I=
|
|
||||||
github.com/ericlagergren/polyval v0.0.0-20220411101811-e25bc10ba391 h1:8j2RH289RJplhA6WfdaPqzg1MjH2K8wX5e0uhAxrw2g=
|
github.com/ericlagergren/polyval v0.0.0-20220411101811-e25bc10ba391 h1:8j2RH289RJplhA6WfdaPqzg1MjH2K8wX5e0uhAxrw2g=
|
||||||
github.com/ericlagergren/polyval v0.0.0-20220411101811-e25bc10ba391/go.mod h1:K2R7GhgxrlJzHw2qiPWsCZXf/kXEJN9PLnQK73Ll0po=
|
github.com/ericlagergren/polyval v0.0.0-20220411101811-e25bc10ba391/go.mod h1:K2R7GhgxrlJzHw2qiPWsCZXf/kXEJN9PLnQK73Ll0po=
|
||||||
github.com/ericlagergren/saferand v0.0.0-20220206064634-960a4dd2bc5c h1:RUzBDdZ+e/HEe2Nh8lYsduiPAZygUfVXJn0Ncj5sHMg=
|
github.com/ericlagergren/saferand v0.0.0-20220206064634-960a4dd2bc5c h1:RUzBDdZ+e/HEe2Nh8lYsduiPAZygUfVXJn0Ncj5sHMg=
|
||||||
@@ -39,105 +29,133 @@ github.com/ericlagergren/siv v0.0.0-20220507050439-0b757b3aa5f1 h1:tlDMEdcPRQKBE
|
|||||||
github.com/ericlagergren/siv v0.0.0-20220507050439-0b757b3aa5f1/go.mod h1:4RfsapbGx2j/vU5xC/5/9qB3kn9Awp1YDiEnN43QrJ4=
|
github.com/ericlagergren/siv v0.0.0-20220507050439-0b757b3aa5f1/go.mod h1:4RfsapbGx2j/vU5xC/5/9qB3kn9Awp1YDiEnN43QrJ4=
|
||||||
github.com/ericlagergren/subtle v0.0.0-20220507045147-890d697da010 h1:fuGucgPk5dN6wzfnxl3D0D3rVLw4v2SbBT9jb4VnxzA=
|
github.com/ericlagergren/subtle v0.0.0-20220507045147-890d697da010 h1:fuGucgPk5dN6wzfnxl3D0D3rVLw4v2SbBT9jb4VnxzA=
|
||||||
github.com/ericlagergren/subtle v0.0.0-20220507045147-890d697da010/go.mod h1:JtBcj7sBuTTRupn7c2bFspMDIObMJsVK8TeUvpShPok=
|
github.com/ericlagergren/subtle v0.0.0-20220507045147-890d697da010/go.mod h1:JtBcj7sBuTTRupn7c2bFspMDIObMJsVK8TeUvpShPok=
|
||||||
github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=
|
github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k=
|
||||||
github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
|
github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0=
|
||||||
github.com/gaukas/godicttls v0.0.4 h1:NlRaXb3J6hAnTmWdsEKb9bcSBD6BvcIjdGdeb0zfXbk=
|
github.com/gaukas/godicttls v0.0.4 h1:NlRaXb3J6hAnTmWdsEKb9bcSBD6BvcIjdGdeb0zfXbk=
|
||||||
github.com/gaukas/godicttls v0.0.4/go.mod h1:l6EenT4TLWgTdwslVb4sEMOCf7Bv0JAK67deKr9/NCI=
|
github.com/gaukas/godicttls v0.0.4/go.mod h1:l6EenT4TLWgTdwslVb4sEMOCf7Bv0JAK67deKr9/NCI=
|
||||||
github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw=
|
|
||||||
github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8=
|
|
||||||
github.com/go-chi/render v1.0.3 h1:AsXqd2a1/INaIfUSKq3G5uA8weYx20FOsM7uSoCyyt4=
|
|
||||||
github.com/go-chi/render v1.0.3/go.mod h1:/gr3hVkmYR0YlEy3LxCuVRFzEu9Ruok+gFqbIofjao0=
|
|
||||||
github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ=
|
|
||||||
github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
|
|
||||||
github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE=
|
github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE=
|
||||||
github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78=
|
github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78=
|
||||||
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI=
|
|
||||||
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls=
|
|
||||||
github.com/gobwas/httphead v0.1.0 h1:exrUm0f4YX0L7EBwZHuCF4GDp8aJfVeBrlLQrs6NqWU=
|
github.com/gobwas/httphead v0.1.0 h1:exrUm0f4YX0L7EBwZHuCF4GDp8aJfVeBrlLQrs6NqWU=
|
||||||
github.com/gobwas/httphead v0.1.0/go.mod h1:O/RXo79gxV8G+RqlR/otEwx4Q36zl9rqC5u12GKvMCM=
|
github.com/gobwas/httphead v0.1.0/go.mod h1:O/RXo79gxV8G+RqlR/otEwx4Q36zl9rqC5u12GKvMCM=
|
||||||
github.com/gobwas/pool v0.2.1 h1:xfeeEhW7pwmX8nuLVlqbzVc7udMDrwetjEv+TZIz1og=
|
github.com/gobwas/pool v0.2.1 h1:xfeeEhW7pwmX8nuLVlqbzVc7udMDrwetjEv+TZIz1og=
|
||||||
github.com/gobwas/pool v0.2.1/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw=
|
github.com/gobwas/pool v0.2.1/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw=
|
||||||
github.com/gobwas/ws v1.4.0 h1:CTaoG1tojrh4ucGPcoJFiAQUAsEWekEWvLy7GsVNqGs=
|
github.com/gobwas/ws v1.4.0 h1:CTaoG1tojrh4ucGPcoJFiAQUAsEWekEWvLy7GsVNqGs=
|
||||||
github.com/gobwas/ws v1.4.0/go.mod h1:G3gNqMNtPppf5XUz7O4shetPpcZ1VJ7zt18dlUeakrc=
|
github.com/gobwas/ws v1.4.0/go.mod h1:G3gNqMNtPppf5XUz7O4shetPpcZ1VJ7zt18dlUeakrc=
|
||||||
github.com/gofrs/uuid/v5 v5.3.0 h1:m0mUMr+oVYUdxpMLgSYCZiXe7PuVPnI94+OMeVBNedk=
|
github.com/gofrs/uuid/v5 v5.4.0 h1:EfbpCTjqMuGyq5ZJwxqzn3Cbr2d0rUZU7v5ycAk/e/0=
|
||||||
github.com/gofrs/uuid/v5 v5.3.0/go.mod h1:CDOjlDMVAtN56jqyRUZh58JT31Tiw7/oQyEXZV+9bD8=
|
github.com/gofrs/uuid/v5 v5.4.0/go.mod h1:CDOjlDMVAtN56jqyRUZh58JT31Tiw7/oQyEXZV+9bD8=
|
||||||
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
|
github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs=
|
||||||
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
|
github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
||||||
github.com/google/btree v1.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg=
|
github.com/google/btree v1.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg=
|
||||||
github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4=
|
github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4=
|
||||||
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
|
||||||
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
|
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
|
||||||
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
||||||
github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 h1:yAJXTCF9TqKcTiHJAE8dj7HMvPfh66eeA2JYW7eFpSE=
|
github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 h1:FKHo8hFI3A+7w0aUQuYXQ+6EN5stWmeY/AZqtM8xk9k=
|
||||||
github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
|
github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo=
|
||||||
github.com/google/tink/go v1.6.1 h1:t7JHqO8Ath2w2ig5vjwQYJzhGEZymedQc90lQXUBa4I=
|
github.com/google/tink/go v1.6.1 h1:t7JHqO8Ath2w2ig5vjwQYJzhGEZymedQc90lQXUBa4I=
|
||||||
github.com/hashicorp/yamux v0.1.2 h1:XtB8kyFOyHXYVFnwT5C3+Bdo8gArse7j2AQ0DA0Uey8=
|
github.com/insomniacslk/dhcp v0.0.0-20250109001534-8abf58130905 h1:q3OEI9RaN/wwcx+qgGo6ZaoJkCiDYe/gjDLfq7lQQF4=
|
||||||
github.com/hashicorp/yamux v0.1.2/go.mod h1:C+zze2n6e/7wshOZep2A70/aQU6QBRWJO/G6FT1wIns=
|
github.com/insomniacslk/dhcp v0.0.0-20250109001534-8abf58130905/go.mod h1:VvGYjkZoJyKqlmT1yzakUs4mfKMNB0XdODP0+rdml6k=
|
||||||
github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
|
|
||||||
github.com/insomniacslk/dhcp v0.0.0-20241203100832-a481575ed0ef h1:NzQKDfd5ZOPnuZYf9MnRee8x2qecsVqzsnaLjEZiBko=
|
|
||||||
github.com/insomniacslk/dhcp v0.0.0-20241203100832-a481575ed0ef/go.mod h1:KclMyHxX06VrVr0DJmeFSUb1ankt7xTfoOA35pCkoic=
|
|
||||||
github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
|
|
||||||
github.com/josharian/native v1.0.1-0.20221213033349-c1e37c09b531/go.mod h1:7X/raswPFr05uY3HiLlYeyQntB6OO7E/d2Cu7qoaN2w=
|
github.com/josharian/native v1.0.1-0.20221213033349-c1e37c09b531/go.mod h1:7X/raswPFr05uY3HiLlYeyQntB6OO7E/d2Cu7qoaN2w=
|
||||||
github.com/josharian/native v1.1.0 h1:uuaP0hAbW7Y4l0ZRQ6C9zfb7Mg1mbFKry/xzDAfmtLA=
|
github.com/josharian/native v1.1.0 h1:uuaP0hAbW7Y4l0ZRQ6C9zfb7Mg1mbFKry/xzDAfmtLA=
|
||||||
github.com/josharian/native v1.1.0/go.mod h1:7X/raswPFr05uY3HiLlYeyQntB6OO7E/d2Cu7qoaN2w=
|
github.com/josharian/native v1.1.0/go.mod h1:7X/raswPFr05uY3HiLlYeyQntB6OO7E/d2Cu7qoaN2w=
|
||||||
github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA=
|
github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA=
|
||||||
github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw=
|
github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw=
|
||||||
github.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY=
|
github.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc=
|
||||||
github.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8=
|
github.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
|
||||||
github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4=
|
github.com/klauspost/reedsolomon v1.12.3 h1:tzUznbfc3OFwJaTebv/QdhnFf2Xvb7gZ24XaHLBPmdc=
|
||||||
github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I=
|
github.com/klauspost/reedsolomon v1.12.3/go.mod h1:3K5rXwABAvzGeR01r6pWZieUALXO/Tq7bFKGIb4m4WI=
|
||||||
github.com/lunixbochs/struc v0.0.0-20200707160740-784aaebc1d40 h1:EnfXoSqDfSNJv0VBNqY/88RNnhSGYkrHaO0mmFGbVsc=
|
|
||||||
github.com/lunixbochs/struc v0.0.0-20200707160740-784aaebc1d40/go.mod h1:vy1vK6wD6j7xX6O6hXe621WabdtNkou2h7uRtTfRMyg=
|
|
||||||
github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
|
|
||||||
github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
|
|
||||||
github.com/mdlayher/netlink v1.7.2 h1:/UtM3ofJap7Vl4QWCPDGXY8d3GIY2UGSDbK+QWmY8/g=
|
github.com/mdlayher/netlink v1.7.2 h1:/UtM3ofJap7Vl4QWCPDGXY8d3GIY2UGSDbK+QWmY8/g=
|
||||||
github.com/mdlayher/netlink v1.7.2/go.mod h1:xraEF7uJbxLhc5fpHL4cPe221LI2bdttWlU+ZGLfQSw=
|
github.com/mdlayher/netlink v1.7.2/go.mod h1:xraEF7uJbxLhc5fpHL4cPe221LI2bdttWlU+ZGLfQSw=
|
||||||
github.com/mdlayher/socket v0.4.1 h1:eM9y2/jlbs1M615oshPQOHZzj6R6wMT7bX5NPiQvn2U=
|
github.com/mdlayher/socket v0.5.1 h1:VZaqt6RkGkt2OE9l3GcC6nZkqD3xKeQLyfleW/uBcos=
|
||||||
github.com/mdlayher/socket v0.4.1/go.mod h1:cAqeGjoufqdxWkD7DkpyS+wcefOtmu5OQ8KuoJGIReA=
|
github.com/mdlayher/socket v0.5.1/go.mod h1:TjPLHI1UgwEv5J1B5q0zTZq12A/6H7nKmtTanQE37IQ=
|
||||||
github.com/metacubex/amneziawg-go v0.0.0-20240922133038-fdf3a4d5a4ab h1:Chbw+/31UC14YFNr78pESt5Vowlc62zziw05JCUqoL4=
|
github.com/metacubex/amneziawg-go v0.0.0-20251104174305-5a0e9f7e361d h1:vAJ0ZT4aO803F1uw2roIA9yH7Sxzox34tVVyye1bz6c=
|
||||||
github.com/metacubex/amneziawg-go v0.0.0-20240922133038-fdf3a4d5a4ab/go.mod h1:xVKK8jC5Sd3hfh7WjmCq+HorehIbrBijaUWmcuKjPcI=
|
github.com/metacubex/amneziawg-go v0.0.0-20251104174305-5a0e9f7e361d/go.mod h1:MsM/5czONyXMJ3PRr5DbQ4O/BxzAnJWOIcJdLzW6qHY=
|
||||||
github.com/metacubex/bbolt v0.0.0-20240822011022-aed6d4850399 h1:oBowHVKZycNtAFbZ6avaCSZJYeme2Nrj+4RpV2cNJig=
|
github.com/metacubex/ascon v0.1.0 h1:6ZWxmXYszT1XXtwkf6nxfFhc/OTtQ9R3Vyj1jN32lGM=
|
||||||
github.com/metacubex/bbolt v0.0.0-20240822011022-aed6d4850399/go.mod h1:4xcieuIK+M4bGQmQYZVqEaIYqjS1ahO4kXG7EmDgEro=
|
github.com/metacubex/ascon v0.1.0/go.mod h1:eV5oim4cVPPdEL8/EYaTZ0iIKARH9pnhAK/fcT5Kacc=
|
||||||
github.com/metacubex/chacha v0.1.0 h1:tg9RSJ18NvL38cCWNyYH1eiG6qDCyyXIaTLQthon0sc=
|
github.com/metacubex/bart v0.26.0 h1:d/bBTvVatfVWGfQbiDpYKI1bXUJgjaabB2KpK1Tnk6w=
|
||||||
github.com/metacubex/chacha v0.1.0/go.mod h1:Djn9bPZxLTXbJFSeyo0/qzEzQI+gUSSzttuzZM75GH8=
|
github.com/metacubex/bart v0.26.0/go.mod h1:DCcyfP4MC+Zy7sLK7XeGuMw+P5K9mIRsYOBgiE8icsI=
|
||||||
|
github.com/metacubex/bbolt v0.0.0-20250725135710-010dbbbb7a5b h1:j7dadXD8I2KTmMt8jg1JcaP1ANL3JEObJPdANKcSYPY=
|
||||||
|
github.com/metacubex/bbolt v0.0.0-20250725135710-010dbbbb7a5b/go.mod h1:+WmP0VJZDkDszvpa83HzfUp6QzARl/IKkMorH4+nODw=
|
||||||
|
github.com/metacubex/blake3 v0.1.0 h1:KGnjh/56REO7U+cgZA8dnBhxdP7jByrG7hTP+bu6cqY=
|
||||||
|
github.com/metacubex/blake3 v0.1.0/go.mod h1:CCkLdzFrqf7xmxCdhQFvJsRRV2mwOLDoSPg6vUTB9Uk=
|
||||||
|
github.com/metacubex/chacha v0.1.5 h1:fKWMb/5c7ZrY8Uoqi79PPFxl+qwR7X/q0OrsAubyX2M=
|
||||||
|
github.com/metacubex/chacha v0.1.5/go.mod h1:Djn9bPZxLTXbJFSeyo0/qzEzQI+gUSSzttuzZM75GH8=
|
||||||
|
github.com/metacubex/chi v0.1.0 h1:rjNDyDj50nRpicG43CNkIw4ssiCbmDL8d7wJXKlUCsg=
|
||||||
|
github.com/metacubex/chi v0.1.0/go.mod h1:zM5u5oMQt8b2DjvDHvzadKrP6B2ztmasL1YHRMbVV+g=
|
||||||
|
github.com/metacubex/connect-ip-go v0.0.0-20260412152424-e1625567920a h1:Ph5UfTWDsGruZ+v95Df1ycTflQFmpZBFg2LUvj2kx/M=
|
||||||
|
github.com/metacubex/connect-ip-go v0.0.0-20260412152424-e1625567920a/go.mod h1:xYC8Ik7/rN6no+vTRuWMEziGwm3brA0wNM/zZP9qhOQ=
|
||||||
|
github.com/metacubex/cpu v0.1.1 h1:rRV5HGmeuGzjiKI3hYbL0dCd0qGwM7VUtk4ICXD06mI=
|
||||||
|
github.com/metacubex/cpu v0.1.1/go.mod h1:09VEt4dSRLR+bOA8l4w4NDuzGZ8n5dkMv7e8axgEeTU=
|
||||||
|
github.com/metacubex/edwards25519 v1.2.0 h1:pIQZLBsjQgg3Nl/c86YYFEUAbL5qQRnPq4LrgIw0KK4=
|
||||||
|
github.com/metacubex/edwards25519 v1.2.0/go.mod h1:NCQF3J/Ki7382FJuokwsywEIIEI/gro/3smyXgQJsx0=
|
||||||
|
github.com/metacubex/fswatch v0.1.1 h1:jqU7C/v+g0qc2RUFgmAOPoVvfl2BXXUXEumn6oQuxhU=
|
||||||
|
github.com/metacubex/fswatch v0.1.1/go.mod h1:czrTT7Zlbz7vWft8RQu9Qqh+JoX+Nnb+UabuyN1YsgI=
|
||||||
github.com/metacubex/gopacket v1.1.20-0.20230608035415-7e2f98a3e759 h1:cjd4biTvOzK9ubNCCkQ+ldc4YSH/rILn53l/xGBFHHI=
|
github.com/metacubex/gopacket v1.1.20-0.20230608035415-7e2f98a3e759 h1:cjd4biTvOzK9ubNCCkQ+ldc4YSH/rILn53l/xGBFHHI=
|
||||||
github.com/metacubex/gopacket v1.1.20-0.20230608035415-7e2f98a3e759/go.mod h1:UHOv2xu+RIgLwpXca7TLrXleEd4oR3sPatW6IF8wU88=
|
github.com/metacubex/gopacket v1.1.20-0.20230608035415-7e2f98a3e759/go.mod h1:UHOv2xu+RIgLwpXca7TLrXleEd4oR3sPatW6IF8wU88=
|
||||||
github.com/metacubex/gvisor v0.0.0-20241126021258-5b028898cc5a h1:cZ6oNVrsmsi3SNlnSnRio4zOgtQq+/XidwsaNgKICcg=
|
github.com/metacubex/gvisor v0.0.0-20251227095601-261ec1326fe8 h1:hUL81H0Ic/XIDkvtn9M1pmfDdfid7JzYQToY4Ps1TvQ=
|
||||||
github.com/metacubex/gvisor v0.0.0-20241126021258-5b028898cc5a/go.mod h1:xBw/SYJPgUMPQ1tklV/brGn2nxhfr3BnvBzNlyi4Nic=
|
github.com/metacubex/gvisor v0.0.0-20251227095601-261ec1326fe8/go.mod h1:8LpS0IJW1VmWzUm3ylb0e2SK5QDm5lO/2qwWLZgRpBU=
|
||||||
github.com/metacubex/quic-go v0.48.3-0.20241126053724-b69fea3888da h1:Mq6cbHbPTLLTUfA9scrwBmOGkvl6y99E3WmtMIMqo30=
|
github.com/metacubex/hkdf v0.1.0 h1:fPA6VzXK8cU1foc/TOmGCDmSa7pZbxlnqhl3RNsthaA=
|
||||||
github.com/metacubex/quic-go v0.48.3-0.20241126053724-b69fea3888da/go.mod h1:AiZ+UPgrkO1DTnmiAX4b+kRoV1Vfc65UkYD7RbFlIZA=
|
github.com/metacubex/hkdf v0.1.0/go.mod h1:3seEfds3smgTAXqUGn+tgEJH3uXdsUjOiduG/2EtvZ4=
|
||||||
|
github.com/metacubex/hpke v0.1.0 h1:gu2jUNhraehWi0P/z5HX2md3d7L1FhPQE6/Q0E9r9xQ=
|
||||||
|
github.com/metacubex/hpke v0.1.0/go.mod h1:vfDm6gfgrwlXUxKDkWbcE44hXtmc1uxLDm2BcR11b3U=
|
||||||
|
github.com/metacubex/http v0.1.4 h1:gU1y8WlqslzxGmedW2ah74fGL6wJYU2HXUkCMJtCa2A=
|
||||||
|
github.com/metacubex/http v0.1.4/go.mod h1:Nxx0zZAo2AhRfanyL+fmmK6ACMtVsfpwIl1aFAik2Eg=
|
||||||
|
github.com/metacubex/kcp-go v0.0.0-20260105040817-550693377604 h1:hJwCVlE3ojViC35MGHB+FBr8TuIf3BUFn2EQ1VIamsI=
|
||||||
|
github.com/metacubex/kcp-go v0.0.0-20260105040817-550693377604/go.mod h1:lpmN3m269b3V5jFCWtffqBLS4U3QQoIid9ugtO+OhVc=
|
||||||
|
github.com/metacubex/mhurl v0.1.0 h1:ZdW4Zxe3j3uJ89gNytOazHu6kbHn5owutN/VfXOI8GE=
|
||||||
|
github.com/metacubex/mhurl v0.1.0/go.mod h1:2qpQImCbXoUs6GwJrjuEXKelPyoimsIXr07eNKZdS00=
|
||||||
|
github.com/metacubex/mlkem v0.1.0 h1:wFClitonSFcmipzzQvax75beLQU+D7JuC+VK1RzSL8I=
|
||||||
|
github.com/metacubex/mlkem v0.1.0/go.mod h1:amhaXZVeYNShuy9BILcR7P0gbeo/QLZsnqCdL8U2PDQ=
|
||||||
|
github.com/metacubex/nftables v0.0.0-20260426003805-208c2c1ba2cb h1:wk6mHYPURSUvWcUv72gNP79oiylFsscBSDPJ6ieV6Iw=
|
||||||
|
github.com/metacubex/nftables v0.0.0-20260426003805-208c2c1ba2cb/go.mod h1:73ZrCfhdkW4F2E2GAlta3km/S2RHhFNogCMtWZV2anQ=
|
||||||
|
github.com/metacubex/protobuf-go v0.0.0-20260306035419-7ceee0674686 h1:PIXmYT2anQt9V8vdmwixtbIJxOpoPXJfIACHPjXEgnE=
|
||||||
|
github.com/metacubex/protobuf-go v0.0.0-20260306035419-7ceee0674686/go.mod h1:eQV7juxFZIdRgjMxtVqP+6BssKoTZQ1RM0fc58BsCZY=
|
||||||
|
github.com/metacubex/qpack v0.6.0 h1:YqClGIMOpiRYLjV1qOs483Od08MdPgRnHjt90FuaAKw=
|
||||||
|
github.com/metacubex/qpack v0.6.0/go.mod h1:lKGSi7Xk94IMvHGOmxS9eIei3bvIqpOAImEBsaOwTkA=
|
||||||
|
github.com/metacubex/quic-go v0.59.1-0.20260413153657-53bb22f2c306 h1:HlGLmLsWJMLSu0CMI9z/BmEnithB4oXM5Rom6/0Qxtg=
|
||||||
|
github.com/metacubex/quic-go v0.59.1-0.20260413153657-53bb22f2c306/go.mod h1:oNzMrmylS897M3zSMuapIdwSwfq6F2qW01Z3NhVRJhk=
|
||||||
github.com/metacubex/randv2 v0.2.0 h1:uP38uBvV2SxYfLj53kuvAjbND4RUDfFJjwr4UigMiLs=
|
github.com/metacubex/randv2 v0.2.0 h1:uP38uBvV2SxYfLj53kuvAjbND4RUDfFJjwr4UigMiLs=
|
||||||
github.com/metacubex/randv2 v0.2.0/go.mod h1:kFi2SzrQ5WuneuoLLCMkABtiBu6VRrMrWFqSPyj2cxY=
|
github.com/metacubex/randv2 v0.2.0/go.mod h1:kFi2SzrQ5WuneuoLLCMkABtiBu6VRrMrWFqSPyj2cxY=
|
||||||
github.com/metacubex/sing v0.0.0-20241121030428-33b6ebc52000 h1:gUbMXcQXhXGj0vCpCVFTUyIH7TMpD1dpTcNv/MCS+ok=
|
github.com/metacubex/restls-client-go v0.1.7 h1:eCwiXCTQb5WJu9IlgYvDBA1OgrINv58dEe7hcN5H15k=
|
||||||
github.com/metacubex/sing v0.0.0-20241121030428-33b6ebc52000/go.mod h1:ARkL0gM13/Iv5VCZmci/NuoOlePoIsW0m7BWfln/Hak=
|
github.com/metacubex/restls-client-go v0.1.7/go.mod h1:BN/U52vPw7j8VTSh2vleD/MnmVKCov84mS5VcjVHH4g=
|
||||||
github.com/metacubex/sing-quic v0.0.0-20240827003841-cd97758ed8b4 h1:HobpULaPK6OoxrHMmgcwLkwwIduXVmwdcznwUfH1GQM=
|
github.com/metacubex/sing v0.5.7 h1:8OC+fhKFSv/l9ehEhJRaZZAOuthfZo68SteBVLe8QqM=
|
||||||
github.com/metacubex/sing-quic v0.0.0-20240827003841-cd97758ed8b4/go.mod h1:g7Mxj7b7zm7YVqD975mk/hSmrb0A0G4bVvIMr2MMzn8=
|
github.com/metacubex/sing v0.5.7/go.mod h1:ypf0mjwlZm0sKdQSY+yQvmsbWa0hNPtkeqyRMGgoN+w=
|
||||||
github.com/metacubex/sing-shadowsocks v0.2.8 h1:wIhlaigswzjPw4hej75sEvWte3QR0+AJRafgwBHO5B4=
|
github.com/metacubex/sing-mux v0.3.9 h1:/aoBD2+sK2qsXDlNDe3hkR0GZuFDtwIZhOeGUx9W0Yk=
|
||||||
github.com/metacubex/sing-shadowsocks v0.2.8/go.mod h1:X3x88XtJpBxG0W0/ECOJL6Ib0SJ3xdniAkU/6/RMWU0=
|
github.com/metacubex/sing-mux v0.3.9/go.mod h1:8bT7ZKT3clRrJjYc/x5CRYibC1TX/bK73a3r3+2E+Fc=
|
||||||
github.com/metacubex/sing-shadowsocks2 v0.2.2 h1:eaf42uVx4Lr21S6MDYs0ZdTvGA0GEhDpb9no4+gdXPo=
|
github.com/metacubex/sing-quic v0.0.0-20260414034501-3ea3410d197a h1:977o0ZYYbiQAGuOxql7Q6UN3rEy59OyAE0tELq4gZfI=
|
||||||
github.com/metacubex/sing-shadowsocks2 v0.2.2/go.mod h1:BhOug03a/RbI7y6hp6q+6ITM1dXjnLTmeWBHSTwvv2Q=
|
github.com/metacubex/sing-quic v0.0.0-20260414034501-3ea3410d197a/go.mod h1:6ayFGfzzBE85csgQkM3gf4neFq6s0losHlPRSxY+nuk=
|
||||||
github.com/metacubex/sing-tun v0.4.2 h1:fwrQp3P536Pswu6gR1FJ+8GH55e+t2+B8LHIjwRtWbc=
|
github.com/metacubex/sing-shadowsocks v0.2.12 h1:Wqzo8bYXrK5aWqxu/TjlTnYZzAKtKsaFQBdr6IHFaBE=
|
||||||
github.com/metacubex/sing-tun v0.4.2/go.mod h1:V0N4rr0dWPBEE20ESkTXdbtx2riQYcb6YtwC5w/9wl0=
|
github.com/metacubex/sing-shadowsocks v0.2.12/go.mod h1:2e5EIaw0rxKrm1YTRmiMnDulwbGxH9hAFlrwQLQMQkU=
|
||||||
github.com/metacubex/sing-vmess v0.1.9-0.20240719134745-1df6fb20bbf9 h1:OAXiCosqY8xKDp3pqTW3qbrCprZ1l6WkrXSFSCwyY4I=
|
github.com/metacubex/sing-shadowsocks2 v0.2.7 h1:hSuuc0YpsfiqYqt1o+fP4m34BQz4e6wVj3PPBVhor3A=
|
||||||
github.com/metacubex/sing-vmess v0.1.9-0.20240719134745-1df6fb20bbf9/go.mod h1:olVkD4FChQ5gKMHG4ZzuD7+fMkJY1G8vwOKpRehjrmY=
|
github.com/metacubex/sing-shadowsocks2 v0.2.7/go.mod h1:vOEbfKC60txi0ca+yUlqEwOGc3Obl6cnSgx9Gf45KjE=
|
||||||
github.com/metacubex/sing-wireguard v0.0.0-20241126021510-0827d417b589 h1:Z6bNy0HLTjx6BKIkV48sV/yia/GP8Bnyb5JQuGgSGzg=
|
github.com/metacubex/sing-shadowtls v0.0.0-20250503063515-5d9f966d17a2 h1:gXU+MYPm7Wme3/OAY2FFzVq9d9GxPHOqu5AQfg/ddhI=
|
||||||
github.com/metacubex/sing-wireguard v0.0.0-20241126021510-0827d417b589/go.mod h1:4NclTLIZuk+QkHVCGrP87rHi/y8YjgPytxTgApJNMhc=
|
github.com/metacubex/sing-shadowtls v0.0.0-20250503063515-5d9f966d17a2/go.mod h1:mbfboaXauKJNIHJYxQRa+NJs4JU9NZfkA+I33dS2+9E=
|
||||||
github.com/metacubex/tfo-go v0.0.0-20241006021335-daedaf0ca7aa h1:9mcjV+RGZVC3reJBNDjjNPyS8PmFG97zq56X7WNaFO4=
|
github.com/metacubex/sing-tun v0.4.18 h1:WRzAosG0YkT3aZq5RJWtF+RdCgeJ8EpooS5ZM1lkXo0=
|
||||||
github.com/metacubex/tfo-go v0.0.0-20241006021335-daedaf0ca7aa/go.mod h1:4tLB5c8U0CxpkFM+AJJB77jEaVDbLH5XQvy42vAGsWw=
|
github.com/metacubex/sing-tun v0.4.18/go.mod h1:g4I/JNplDBhXLF+aQWgFbhNeJPSXQOWS9HvLeNvkgeA=
|
||||||
github.com/metacubex/utls v1.6.6 h1:3D12YKHTf2Z41UPhQU2dWerNWJ5TVQD9gKoQ+H+iLC8=
|
github.com/metacubex/sing-vmess v0.2.5 h1:m9Zt5I27lB9fmLMZfism9sH2LcnAfShZfwSkf6/KJoE=
|
||||||
github.com/metacubex/utls v1.6.6/go.mod h1:+WLFUnXjcpdxXCnyX25nggw8C6YonZ8zOK2Zm/oRvdo=
|
github.com/metacubex/sing-vmess v0.2.5/go.mod h1:AwtlzUgf8COe9tRYAKqWZ+leDH7p5U98a0ZUpYehl8Q=
|
||||||
github.com/metacubex/wireguard-go v0.0.0-20240922131502-c182e7471181 h1:hJLQviGySBuaynlCwf/oYgIxbVbGRUIKZCxdya9YrbQ=
|
github.com/metacubex/sing-wireguard v0.0.0-20260507084707-690d479ec947 h1:IB03BvRQtvjWScyOK5jSQVJYY8osmZXHL+4VCEFMWcM=
|
||||||
github.com/metacubex/wireguard-go v0.0.0-20240922131502-c182e7471181/go.mod h1:phewKljNYiTVT31Gcif8RiCKnTUOgVWFJjccqYM8s+Y=
|
github.com/metacubex/sing-wireguard v0.0.0-20260507084707-690d479ec947/go.mod h1:jpAkVLPnCpGSfNyVmj6Cq4YbuZsFepm/Dc+9BAOcR80=
|
||||||
github.com/miekg/dns v1.1.62 h1:cN8OuEF1/x5Rq6Np+h1epln8OiyPWV+lROx9LxcGgIQ=
|
github.com/metacubex/smux v0.0.0-20260105030934-d0c8756d3141 h1:DK2l6m2Fc85H2BhiAPgbJygiWhesPlfGmF+9Vw6ARdk=
|
||||||
github.com/miekg/dns v1.1.62/go.mod h1:mvDlcItzm+br7MToIKqkglaGhlFMHJ9DTNNWONWXbNQ=
|
github.com/metacubex/smux v0.0.0-20260105030934-d0c8756d3141/go.mod h1:/yI4OiGOSn0SURhZdJF3CbtPg3nwK700bG8TZLMBvAg=
|
||||||
|
github.com/metacubex/ssh v0.1.0 h1:iGfr99qk/eMHzUnQ/0bTxXT8+8SWqLSHBWDHoAhngzw=
|
||||||
|
github.com/metacubex/ssh v0.1.0/go.mod h1:NUtl0d+/f2cG9ECEpMM8iCVOpmggQlC13oLeDUONDlU=
|
||||||
|
github.com/metacubex/tfo-go v0.0.0-20251130171125-413e892ac443 h1:H6TnfM12tOoTizYE/qBHH3nEuibIelmHI+BVSxVJr8o=
|
||||||
|
github.com/metacubex/tfo-go v0.0.0-20251130171125-413e892ac443/go.mod h1:l9oLnLoEXyGZ5RVLsh7QCC5XsouTUyKk4F2nLm2DHLw=
|
||||||
|
github.com/metacubex/tls v0.1.5 h1:ECcB83dj+zadnhlKcLnUUf1Sq6+vU0f/zoyU0+9oPTc=
|
||||||
|
github.com/metacubex/tls v0.1.5/go.mod h1:0XeVdL0cBw+8i5Hqy3lVeP9IyD/LFTq02ExvHM6rzEM=
|
||||||
|
github.com/metacubex/utls v1.8.4 h1:HmL9nUApDdWSkgUyodfwF6hSjtiwCGGdyhaSpEejKpg=
|
||||||
|
github.com/metacubex/utls v1.8.4/go.mod h1:kncGGVhFaoGn5M3pFe3SXhZCzsbCJayNOH4UEqTKTko=
|
||||||
|
github.com/metacubex/wireguard-go v0.0.0-20250820062549-a6cecdd7f57f h1:FGBPRb1zUabhPhDrlKEjQ9lgIwQ6cHL4x8M9lrERhbk=
|
||||||
|
github.com/metacubex/wireguard-go v0.0.0-20250820062549-a6cecdd7f57f/go.mod h1:oPGcV994OGJedmmxrcK9+ni7jUEMGhR+uVQAdaduIP4=
|
||||||
|
github.com/metacubex/yamux v0.0.0-20250918083631-dd5f17c0be49 h1:lhlqpYHopuTLx9xQt22kSA9HtnyTDmk5XjjQVCGHe2E=
|
||||||
|
github.com/metacubex/yamux v0.0.0-20250918083631-dd5f17c0be49/go.mod h1:MBeEa9IVBphH7vc3LNtW6ZujVXFizotPo3OEiHQ+TNU=
|
||||||
|
github.com/miekg/dns v1.1.63 h1:8M5aAw6OMZfFXTT7K5V0Eu5YiiL8l7nUAkyN6C9YwaY=
|
||||||
|
github.com/miekg/dns v1.1.63/go.mod h1:6NGHfjhpmr5lt3XPLuyfDJi5AXbNIPM9PY6H6sF1Nfs=
|
||||||
github.com/mroth/weightedrand/v2 v2.1.0 h1:o1ascnB1CIVzsqlfArQQjeMy1U0NcIbBO5rfd5E/OeU=
|
github.com/mroth/weightedrand/v2 v2.1.0 h1:o1ascnB1CIVzsqlfArQQjeMy1U0NcIbBO5rfd5E/OeU=
|
||||||
github.com/mroth/weightedrand/v2 v2.1.0/go.mod h1:f2faGsfOGOwc1p94wzHKKZyTpcJUW7OJ/9U4yfiNAOU=
|
github.com/mroth/weightedrand/v2 v2.1.0/go.mod h1:f2faGsfOGOwc1p94wzHKKZyTpcJUW7OJ/9U4yfiNAOU=
|
||||||
github.com/oasisprotocol/deoxysii v0.0.0-20220228165953-2091330c22b7 h1:1102pQc2SEPp5+xrS26wEaeb26sZy6k9/ZXlZN+eXE4=
|
github.com/oasisprotocol/deoxysii v0.0.0-20220228165953-2091330c22b7 h1:1102pQc2SEPp5+xrS26wEaeb26sZy6k9/ZXlZN+eXE4=
|
||||||
github.com/oasisprotocol/deoxysii v0.0.0-20220228165953-2091330c22b7/go.mod h1:UqoUn6cHESlliMhOnKLWr+CBH+e3bazUPvFj1XZwAjs=
|
github.com/oasisprotocol/deoxysii v0.0.0-20220228165953-2091330c22b7/go.mod h1:UqoUn6cHESlliMhOnKLWr+CBH+e3bazUPvFj1XZwAjs=
|
||||||
github.com/onsi/ginkgo/v2 v2.9.5 h1:+6Hr4uxzP4XIUyAkg61dWBw8lb/gc4/X5luuxN/EC+Q=
|
|
||||||
github.com/onsi/ginkgo/v2 v2.9.5/go.mod h1:tvAoo1QUJwNEU2ITftXTpR7R1RbCzoZUOs3RonqW57k=
|
|
||||||
github.com/onsi/gomega v1.27.6 h1:ENqfyGeS5AX/rlXDd/ETokDz93u0YufY1Pgxuy/PvWE=
|
|
||||||
github.com/openacid/errors v0.8.1/go.mod h1:GUQEJJOJE3W9skHm8E8Y4phdl2LLEN8iD7c5gcGgdx0=
|
github.com/openacid/errors v0.8.1/go.mod h1:GUQEJJOJE3W9skHm8E8Y4phdl2LLEN8iD7c5gcGgdx0=
|
||||||
github.com/openacid/low v0.1.21 h1:Tr2GNu4N/+rGRYdOsEHOE89cxUIaDViZbVmKz29uKGo=
|
github.com/openacid/low v0.1.21 h1:Tr2GNu4N/+rGRYdOsEHOE89cxUIaDViZbVmKz29uKGo=
|
||||||
github.com/openacid/low v0.1.21/go.mod h1:q+MsKI6Pz2xsCkzV4BLj7NR5M4EX0sGz5AqotpZDVh0=
|
github.com/openacid/low v0.1.21/go.mod h1:q+MsKI6Pz2xsCkzV4BLj7NR5M4EX0sGz5AqotpZDVh0=
|
||||||
@@ -150,83 +168,48 @@ github.com/pierrec/lz4/v4 v4.1.14/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFu
|
|||||||
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw=
|
|
||||||
github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE=
|
|
||||||
github.com/puzpuzpuz/xsync/v3 v3.4.0 h1:DuVBAdXuGFHv8adVXjWWZ63pJq+NRXOWVXlKDBZ+mJ4=
|
|
||||||
github.com/puzpuzpuz/xsync/v3 v3.4.0/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA=
|
|
||||||
github.com/quic-go/qpack v0.4.0 h1:Cr9BXA1sQS2SmDUWjSofMPNKmvF6IiIfDRmgU0w1ZCo=
|
|
||||||
github.com/quic-go/qpack v0.4.0/go.mod h1:UZVnYIfi5GRk+zI9UMaCPsmZ2xKJP7XBUvVyT1Knj9A=
|
|
||||||
github.com/quic-go/qtls-go1-20 v0.4.1 h1:D33340mCNDAIKBqXuAvexTNMUByrYmFYVfKfDN5nfFs=
|
|
||||||
github.com/quic-go/qtls-go1-20 v0.4.1/go.mod h1:X9Nh97ZL80Z+bX/gUXMbipO6OxdiDi58b/fMC9mAL+k=
|
|
||||||
github.com/sagernet/cors v1.2.1 h1:Cv5Z8y9YSD6Gm+qSpNrL3LO4lD3eQVvbFYJSG7JCMHQ=
|
|
||||||
github.com/sagernet/cors v1.2.1/go.mod h1:O64VyOjjhrkLmQIjF4KGRrJO/5dVXFdpEmCW/eISRAI=
|
|
||||||
github.com/sagernet/fswatch v0.1.1 h1:YqID+93B7VRfqIH3PArW/XpJv5H4OLEVWDfProGoRQs=
|
|
||||||
github.com/sagernet/fswatch v0.1.1/go.mod h1:nz85laH0mkQqJfaOrqPpkwtU1znMFNVTpT/5oRsVz/o=
|
|
||||||
github.com/sagernet/netlink v0.0.0-20240612041022-b9a21c07ac6a h1:ObwtHN2VpqE0ZNjr6sGeT00J8uU7JF4cNUdb44/Duis=
|
github.com/sagernet/netlink v0.0.0-20240612041022-b9a21c07ac6a h1:ObwtHN2VpqE0ZNjr6sGeT00J8uU7JF4cNUdb44/Duis=
|
||||||
github.com/sagernet/netlink v0.0.0-20240612041022-b9a21c07ac6a/go.mod h1:xLnfdiJbSp8rNqYEdIW/6eDO4mVoogml14Bh2hSiFpM=
|
github.com/sagernet/netlink v0.0.0-20240612041022-b9a21c07ac6a/go.mod h1:xLnfdiJbSp8rNqYEdIW/6eDO4mVoogml14Bh2hSiFpM=
|
||||||
github.com/sagernet/nftables v0.3.0-beta.4 h1:kbULlAwAC3jvdGAC1P5Fa3GSxVwQJibNenDW2zaXr8I=
|
github.com/samber/lo v1.53.0 h1:t975lj2py4kJPQ6haz1QMgtId2gtmfktACxIXArw3HM=
|
||||||
github.com/sagernet/nftables v0.3.0-beta.4/go.mod h1:OQXAjvjNGGFxaTgVCSTRIhYB5/llyVDeapVoENYBDS8=
|
github.com/samber/lo v1.53.0/go.mod h1:4+MXEGsJzbKGaUEQFKBq2xtfuznW9oz/WrgyzMzRoM0=
|
||||||
github.com/sagernet/sing-mux v0.2.1 h1:N/3MHymfnFZRd29tE3TaXwPUVVgKvxhtOkiCMLp9HVo=
|
|
||||||
github.com/sagernet/sing-mux v0.2.1/go.mod h1:dm3BWL6NvES9pbib7llpylrq7Gq+LjlzG+0RacdxcyE=
|
|
||||||
github.com/sagernet/sing-shadowtls v0.1.5 h1:uXxmq/HXh8DIiBGLzpMjCbWnzIAFs+lIxiTOjdgG5qo=
|
|
||||||
github.com/sagernet/sing-shadowtls v0.1.5/go.mod h1:tvrDPTGLrSM46Wnf7mSr+L8NHvgvF8M4YnJF790rZX4=
|
|
||||||
github.com/sagernet/smux v0.0.0-20231208180855-7041f6ea79e7 h1:DImB4lELfQhplLTxeq2z31Fpv8CQqqrUwTbrIRumZqQ=
|
|
||||||
github.com/sagernet/smux v0.0.0-20231208180855-7041f6ea79e7/go.mod h1:FP9X2xjT/Az1EsG/orYYoC+5MojWnuI7hrffz8fGwwo=
|
|
||||||
github.com/samber/lo v1.47.0 h1:z7RynLwP5nbyRscyvcD043DWYoOcYRv3mV8lBeqOCLc=
|
|
||||||
github.com/samber/lo v1.47.0/go.mod h1:RmDH9Ct32Qy3gduHQuKJ3gW1fMHAnE/fAzQuf6He5cU=
|
|
||||||
github.com/shirou/gopsutil/v4 v4.24.11 h1:WaU9xqGFKvFfsUv94SXcUPD7rCkU0vr/asVdQOBZNj8=
|
|
||||||
github.com/shirou/gopsutil/v4 v4.24.11/go.mod h1:s4D/wg+ag4rG0WO7AiTj2BeYCRhym0vM7DHbZRxnIT8=
|
|
||||||
github.com/sina-ghaderi/poly1305 v0.0.0-20220724002748-c5926b03988b h1:rXHg9GrUEtWZhEkrykicdND3VPjlVbYiLdX9J7gimS8=
|
github.com/sina-ghaderi/poly1305 v0.0.0-20220724002748-c5926b03988b h1:rXHg9GrUEtWZhEkrykicdND3VPjlVbYiLdX9J7gimS8=
|
||||||
github.com/sina-ghaderi/poly1305 v0.0.0-20220724002748-c5926b03988b/go.mod h1:X7qrxNQViEaAN9LNZOPl9PfvQtp3V3c7LTo0dvGi0fM=
|
github.com/sina-ghaderi/poly1305 v0.0.0-20220724002748-c5926b03988b/go.mod h1:X7qrxNQViEaAN9LNZOPl9PfvQtp3V3c7LTo0dvGi0fM=
|
||||||
github.com/sina-ghaderi/rabaead v0.0.0-20220730151906-ab6e06b96e8c h1:DjKMC30y6yjG3IxDaeAj3PCoRr+IsO+bzyT+Se2m2Hk=
|
github.com/sina-ghaderi/rabaead v0.0.0-20220730151906-ab6e06b96e8c h1:DjKMC30y6yjG3IxDaeAj3PCoRr+IsO+bzyT+Se2m2Hk=
|
||||||
github.com/sina-ghaderi/rabaead v0.0.0-20220730151906-ab6e06b96e8c/go.mod h1:NV/a66PhhWYVmUMaotlXJ8fIEFB98u+c8l/CQIEFLrU=
|
github.com/sina-ghaderi/rabaead v0.0.0-20220730151906-ab6e06b96e8c/go.mod h1:NV/a66PhhWYVmUMaotlXJ8fIEFB98u+c8l/CQIEFLrU=
|
||||||
github.com/sina-ghaderi/rabbitio v0.0.0-20220730151941-9ce26f4f872e h1:ur8uMsPIFG3i4Gi093BQITvwH9znsz2VUZmnmwHvpIo=
|
github.com/sina-ghaderi/rabbitio v0.0.0-20220730151941-9ce26f4f872e h1:ur8uMsPIFG3i4Gi093BQITvwH9znsz2VUZmnmwHvpIo=
|
||||||
github.com/sina-ghaderi/rabbitio v0.0.0-20220730151941-9ce26f4f872e/go.mod h1:+e5fBW3bpPyo+3uLo513gIUblc03egGjMM0+5GKbzK8=
|
github.com/sina-ghaderi/rabbitio v0.0.0-20220730151941-9ce26f4f872e/go.mod h1:+e5fBW3bpPyo+3uLo513gIUblc03egGjMM0+5GKbzK8=
|
||||||
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
|
github.com/sirupsen/logrus v1.9.4 h1:TsZE7l11zFCLZnZ+teH4Umoq5BhEIfIzfRDZ1Uzql2w=
|
||||||
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
|
github.com/sirupsen/logrus v1.9.4/go.mod h1:ftWc9WdOfJ0a92nsE2jF5u5ZwH8Bv2zdeOC42RjbV2g=
|
||||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
|
|
||||||
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
|
|
||||||
github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
|
|
||||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||||
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||||
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||||
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
|
||||||
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
|
|
||||||
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
|
|
||||||
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
|
|
||||||
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
|
|
||||||
github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU=
|
|
||||||
github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI=
|
|
||||||
github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk=
|
|
||||||
github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY=
|
|
||||||
github.com/u-root/uio v0.0.0-20230220225925-ffce2a382923 h1:tHNk7XK9GkmKUR6Gh8gVBKXc2MVSZ4G/NnWLtzw4gNA=
|
github.com/u-root/uio v0.0.0-20230220225925-ffce2a382923 h1:tHNk7XK9GkmKUR6Gh8gVBKXc2MVSZ4G/NnWLtzw4gNA=
|
||||||
github.com/u-root/uio v0.0.0-20230220225925-ffce2a382923/go.mod h1:eLL9Nub3yfAho7qB0MzZizFhTU2QkLeoVsWdHtDW264=
|
github.com/u-root/uio v0.0.0-20230220225925-ffce2a382923/go.mod h1:eLL9Nub3yfAho7qB0MzZizFhTU2QkLeoVsWdHtDW264=
|
||||||
github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE=
|
github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE=
|
||||||
github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU=
|
github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU=
|
||||||
github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0=
|
github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0=
|
||||||
github.com/vishvananda/netns v0.0.4 h1:Oeaw1EM2JMxD51g9uhtC0D7erkIjgmj8+JZc26m1YX8=
|
github.com/vishvananda/netns v0.0.5 h1:DfiHV+j8bA32MFM7bfEunvT8IAqQ/NzSJHtcmW5zdEY=
|
||||||
github.com/vishvananda/netns v0.0.4/go.mod h1:SpkAiCQRtJ6TvvxPnOSyH3BMl6unz3xZlaprSwhNNJM=
|
github.com/vishvananda/netns v0.0.5/go.mod h1:SpkAiCQRtJ6TvvxPnOSyH3BMl6unz3xZlaprSwhNNJM=
|
||||||
github.com/vmihailenco/msgpack/v5 v5.4.1 h1:cQriyiUvjTwOHg8QZaPihLWeRAAVoCpE00IUPn0Bjt8=
|
github.com/vmihailenco/msgpack/v5 v5.4.1 h1:cQriyiUvjTwOHg8QZaPihLWeRAAVoCpE00IUPn0Bjt8=
|
||||||
github.com/vmihailenco/msgpack/v5 v5.4.1/go.mod h1:GaZTsDaehaPpQVyxrf5mtQlH+pc21PIudVV/E3rRQok=
|
github.com/vmihailenco/msgpack/v5 v5.4.1/go.mod h1:GaZTsDaehaPpQVyxrf5mtQlH+pc21PIudVV/E3rRQok=
|
||||||
github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g=
|
github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g=
|
||||||
github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds=
|
github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds=
|
||||||
github.com/wk8/go-ordered-map/v2 v2.1.8 h1:5h/BUHu93oj4gIdvHHHGsScSTMijfx5PeYkE/fJgbpc=
|
github.com/xtaci/lossyconn v0.0.0-20190602105132-8df528c0c9ae h1:J0GxkO96kL4WF+AIT3M4mfUVinOCPgf2uUWYFUzN0sM=
|
||||||
github.com/wk8/go-ordered-map/v2 v2.1.8/go.mod h1:5nJHM5DyteebpVlHnWMV0rPz6Zp7+xBAnxjb1X5vnTw=
|
github.com/yosida95/uritemplate/v3 v3.0.2 h1:Ed3Oyj9yrmi9087+NczuL5BwkIc4wvTb5zIM+UJPGz4=
|
||||||
github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0=
|
github.com/yosida95/uritemplate/v3 v3.0.2/go.mod h1:ILOh0sOhIJR3+L/8afwt/kE++YT040gmv5BQTMR2HP4=
|
||||||
github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
|
|
||||||
gitlab.com/go-extension/aes-ccm v0.0.0-20230221065045-e58665ef23c7 h1:UNrDfkQqiEYzdMlNsVvBYOAJWZjdktqFE9tQh5BT2+4=
|
gitlab.com/go-extension/aes-ccm v0.0.0-20230221065045-e58665ef23c7 h1:UNrDfkQqiEYzdMlNsVvBYOAJWZjdktqFE9tQh5BT2+4=
|
||||||
gitlab.com/go-extension/aes-ccm v0.0.0-20230221065045-e58665ef23c7/go.mod h1:E+rxHvJG9H6PUdzq9NRG6csuLN3XUx98BfGOVWNYnXs=
|
gitlab.com/go-extension/aes-ccm v0.0.0-20230221065045-e58665ef23c7/go.mod h1:E+rxHvJG9H6PUdzq9NRG6csuLN3XUx98BfGOVWNYnXs=
|
||||||
gitlab.com/yawning/bsaes.git v0.0.0-20190805113838-0a714cd429ec h1:FpfFs4EhNehiVfzQttTuxanPIT43FtkkCFypIod8LHo=
|
gitlab.com/yawning/bsaes.git v0.0.0-20190805113838-0a714cd429ec h1:FpfFs4EhNehiVfzQttTuxanPIT43FtkkCFypIod8LHo=
|
||||||
gitlab.com/yawning/bsaes.git v0.0.0-20190805113838-0a714cd429ec/go.mod h1:BZ1RAoRPbCxum9Grlv5aeksu2H8BiKehBYooU2LFiOQ=
|
gitlab.com/yawning/bsaes.git v0.0.0-20190805113838-0a714cd429ec/go.mod h1:BZ1RAoRPbCxum9Grlv5aeksu2H8BiKehBYooU2LFiOQ=
|
||||||
go.uber.org/mock v0.4.0 h1:VcM4ZOtdbR4f6VXfiOpwpVJDL6lCReaZ6mw31wqh7KU=
|
go.uber.org/mock v0.4.0 h1:VcM4ZOtdbR4f6VXfiOpwpVJDL6lCReaZ6mw31wqh7KU=
|
||||||
go.uber.org/mock v0.4.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc=
|
|
||||||
go4.org/netipx v0.0.0-20231129151722-fdeea329fbba h1:0b9z3AuHCjxk0x/opv64kcgZLBseWJUpBw5I82+2U4M=
|
go4.org/netipx v0.0.0-20231129151722-fdeea329fbba h1:0b9z3AuHCjxk0x/opv64kcgZLBseWJUpBw5I82+2U4M=
|
||||||
go4.org/netipx v0.0.0-20231129151722-fdeea329fbba/go.mod h1:PLyyIXexvUFg3Owu6p/WfdlivPbZJsZdgWZlrGope/Y=
|
go4.org/netipx v0.0.0-20231129151722-fdeea329fbba/go.mod h1:PLyyIXexvUFg3Owu6p/WfdlivPbZJsZdgWZlrGope/Y=
|
||||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U=
|
golang.org/x/crypto v0.33.0 h1:IOBPskki6Lysi0lo9qQvbxiQ+FvsCC/YWOecCHAixus=
|
||||||
golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk=
|
golang.org/x/crypto v0.33.0/go.mod h1:bVdXmD7IV/4GdElGPozy6U7lWdRXA4qyRVGJV57uQ5M=
|
||||||
golang.org/x/exp v0.0.0-20240904232852-e7e105dedf7e h1:I88y4caeGeuDQxgdoFPUq097j7kNfw6uvuiNxUBfcBk=
|
golang.org/x/exp v0.0.0-20240904232852-e7e105dedf7e h1:I88y4caeGeuDQxgdoFPUq097j7kNfw6uvuiNxUBfcBk=
|
||||||
golang.org/x/exp v0.0.0-20240904232852-e7e105dedf7e/go.mod h1:akd2r19cwCdwSwWeIdzYQGa/EZZyqcOdwWiwj5L5eKQ=
|
golang.org/x/exp v0.0.0-20240904232852-e7e105dedf7e/go.mod h1:akd2r19cwCdwSwWeIdzYQGa/EZZyqcOdwWiwj5L5eKQ=
|
||||||
golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
|
golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
|
||||||
@@ -235,45 +218,34 @@ golang.org/x/mod v0.20.0 h1:utOm6MM3R3dnawAiJgn0y+xvuYRsm1RKM/4giyfDgV0=
|
|||||||
golang.org/x/mod v0.20.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
|
golang.org/x/mod v0.20.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
|
||||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
golang.org/x/net v0.32.0 h1:ZqPmj8Kzc+Y6e0+skZsuACbx+wzMgo5MQsJh9Qd6aYI=
|
golang.org/x/net v0.35.0 h1:T5GQRQb2y08kTAByq9L4/bz8cipCdA8FbRTXewonqY8=
|
||||||
golang.org/x/net v0.32.0/go.mod h1:CwU0IoeOlnQQWJ6ioyFrfRuomB8GKF6KbYXZVyeXNfs=
|
golang.org/x/net v0.35.0/go.mod h1:EglIi67kWsHKlRzzVMUD93VMSWGFOMSZgxFjparz1Qk=
|
||||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ=
|
golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w=
|
||||||
golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
|
golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
|
||||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20190804053845-51ab0e2deafa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190804053845-51ab0e2deafa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20220622161953-175b2fd9d664/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20220622161953-175b2fd9d664/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
||||||
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc=
|
||||||
golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||||
golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
golang.org/x/term v0.29.0 h1:L6pJp37ocefwRRtYPKSWOWzOtWSxVajvz2ldH/xi3iU=
|
||||||
golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA=
|
|
||||||
golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
|
||||||
golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q=
|
|
||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
|
golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM=
|
||||||
golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
|
golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY=
|
||||||
golang.org/x/time v0.7.0 h1:ntUhktv3OPE6TgYxXWv9vKvUSJyIFJlyohwbkEwPrKQ=
|
golang.org/x/time v0.10.0 h1:3usCWA8tQn0L8+hFJQNgzpWbd89begxN66o1Ojdn5L4=
|
||||||
golang.org/x/time v0.7.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
|
golang.org/x/time v0.10.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
|
||||||
golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||||
golang.org/x/tools v0.24.0 h1:J1shsA93PJUEVaUSaay7UXAyE8aimq3GW0pjlolpa24=
|
golang.org/x/tools v0.24.0 h1:J1shsA93PJUEVaUSaay7UXAyE8aimq3GW0pjlolpa24=
|
||||||
golang.org/x/tools v0.24.0/go.mod h1:YhNqVBIfWHdzvTLs0d8LCuMhkKUgSUKldakyV7W/WDQ=
|
golang.org/x/tools v0.24.0/go.mod h1:YhNqVBIfWHdzvTLs0d8LCuMhkKUgSUKldakyV7W/WDQ=
|
||||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
|
||||||
google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=
|
|
||||||
google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=
|
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
lukechampine.com/blake3 v1.3.0 h1:sJ3XhFINmHSrYCgl958hscfIa3bw8x4DqMP3u1YvoYE=
|
|
||||||
lukechampine.com/blake3 v1.3.0/go.mod h1:0OFRp7fBtAylGVCO40o87sbupkyIGgbpv1+M1k1LM6k=
|
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android" >
|
||||||
package="com.github.kr328.clash.core">
|
|
||||||
|
|
||||||
<uses-permission android:name="android.permission.INTERNET" />
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
</manifest>
|
</manifest>
|
||||||
|
|||||||
@@ -3,117 +3,114 @@ module cfa
|
|||||||
go 1.20
|
go 1.20
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/dlclark/regexp2 v1.11.4
|
github.com/dlclark/regexp2 v1.12.0
|
||||||
github.com/metacubex/mihomo v1.7.0
|
github.com/metacubex/mihomo v1.7.0
|
||||||
golang.org/x/sync v0.10.0
|
golang.org/x/sync v0.11.0
|
||||||
gopkg.in/yaml.v3 v3.0.1
|
|
||||||
)
|
)
|
||||||
|
|
||||||
replace github.com/metacubex/mihomo => ../../foss/golang/clash
|
replace github.com/metacubex/mihomo => ../../foss/golang/clash
|
||||||
|
|
||||||
replace github.com/sagernet/sing => github.com/metacubex/sing v0.0.0-20241121030428-33b6ebc52000
|
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/3andne/restls-client-go v0.1.6 // indirect
|
github.com/RyuaNerin/go-krypto v1.3.0 // indirect
|
||||||
github.com/RyuaNerin/go-krypto v1.2.4 // indirect
|
|
||||||
github.com/Yawning/aez v0.0.0-20211027044916-e49e68abd344 // indirect
|
github.com/Yawning/aez v0.0.0-20211027044916-e49e68abd344 // indirect
|
||||||
github.com/ajg/form v1.5.1 // indirect
|
github.com/ajg/form v1.5.1 // indirect
|
||||||
github.com/andybalholm/brotli v1.0.6 // indirect
|
github.com/andybalholm/brotli v1.0.6 // indirect
|
||||||
github.com/bahlo/generic-list-go v0.2.0 // indirect
|
github.com/bahlo/generic-list-go v0.2.0 // indirect
|
||||||
github.com/buger/jsonparser v1.1.1 // indirect
|
|
||||||
github.com/cloudflare/circl v1.3.7 // indirect
|
|
||||||
github.com/coreos/go-iptables v0.8.0 // indirect
|
github.com/coreos/go-iptables v0.8.0 // indirect
|
||||||
github.com/ebitengine/purego v0.8.1 // indirect
|
github.com/dunglas/httpsfv v1.0.2 // indirect
|
||||||
github.com/enfein/mieru/v3 v3.8.4 // indirect
|
github.com/enfein/mieru/v3 v3.31.0 // indirect
|
||||||
github.com/ericlagergren/aegis v0.0.0-20230312195928-b4ce538b56f9 // indirect
|
github.com/ericlagergren/aegis v0.0.0-20250325060835-cd0defd64358 // indirect
|
||||||
github.com/ericlagergren/polyval v0.0.0-20220411101811-e25bc10ba391 // indirect
|
github.com/ericlagergren/polyval v0.0.0-20220411101811-e25bc10ba391 // indirect
|
||||||
github.com/ericlagergren/siv v0.0.0-20220507050439-0b757b3aa5f1 // indirect
|
github.com/ericlagergren/siv v0.0.0-20220507050439-0b757b3aa5f1 // indirect
|
||||||
github.com/ericlagergren/subtle v0.0.0-20220507045147-890d697da010 // indirect
|
github.com/ericlagergren/subtle v0.0.0-20220507045147-890d697da010 // indirect
|
||||||
github.com/fsnotify/fsnotify v1.7.0 // indirect
|
github.com/fsnotify/fsnotify v1.9.0 // indirect
|
||||||
github.com/gaukas/godicttls v0.0.4 // indirect
|
github.com/gaukas/godicttls v0.0.4 // indirect
|
||||||
github.com/go-chi/chi/v5 v5.1.0 // indirect
|
|
||||||
github.com/go-chi/render v1.0.3 // indirect
|
|
||||||
github.com/go-ole/go-ole v1.3.0 // indirect
|
github.com/go-ole/go-ole v1.3.0 // indirect
|
||||||
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect
|
|
||||||
github.com/gobwas/httphead v0.1.0 // indirect
|
github.com/gobwas/httphead v0.1.0 // indirect
|
||||||
github.com/gobwas/pool v0.2.1 // indirect
|
github.com/gobwas/pool v0.2.1 // indirect
|
||||||
github.com/gobwas/ws v1.4.0 // indirect
|
github.com/gobwas/ws v1.4.0 // indirect
|
||||||
github.com/gofrs/uuid/v5 v5.3.0 // indirect
|
github.com/gofrs/uuid/v5 v5.4.0 // indirect
|
||||||
github.com/golang/protobuf v1.5.4 // indirect
|
github.com/golang/snappy v1.0.0 // indirect
|
||||||
github.com/google/btree v1.1.3 // indirect
|
github.com/google/btree v1.1.3 // indirect
|
||||||
github.com/google/go-cmp v0.6.0 // indirect
|
github.com/google/go-cmp v0.6.0 // indirect
|
||||||
github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 // indirect
|
github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 // indirect
|
||||||
github.com/hashicorp/yamux v0.1.2 // indirect
|
github.com/insomniacslk/dhcp v0.0.0-20250109001534-8abf58130905 // indirect
|
||||||
github.com/insomniacslk/dhcp v0.0.0-20241203100832-a481575ed0ef // indirect
|
|
||||||
github.com/josharian/native v1.1.0 // indirect
|
github.com/josharian/native v1.1.0 // indirect
|
||||||
github.com/klauspost/compress v1.17.9 // indirect
|
github.com/klauspost/compress v1.17.9 // indirect
|
||||||
github.com/klauspost/cpuid/v2 v2.2.9 // indirect
|
github.com/klauspost/cpuid/v2 v2.2.6 // indirect
|
||||||
github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect
|
github.com/klauspost/reedsolomon v1.12.3 // indirect
|
||||||
github.com/lunixbochs/struc v0.0.0-20200707160740-784aaebc1d40 // indirect
|
|
||||||
github.com/mailru/easyjson v0.7.7 // indirect
|
|
||||||
github.com/mdlayher/netlink v1.7.2 // indirect
|
github.com/mdlayher/netlink v1.7.2 // indirect
|
||||||
github.com/mdlayher/socket v0.4.1 // indirect
|
github.com/mdlayher/socket v0.5.1 // indirect
|
||||||
github.com/metacubex/amneziawg-go v0.0.0-20240922133038-fdf3a4d5a4ab // indirect
|
github.com/metacubex/amneziawg-go v0.0.0-20251104174305-5a0e9f7e361d // indirect
|
||||||
github.com/metacubex/bbolt v0.0.0-20240822011022-aed6d4850399 // indirect
|
github.com/metacubex/ascon v0.1.0 // indirect
|
||||||
github.com/metacubex/chacha v0.1.0 // indirect
|
github.com/metacubex/bart v0.26.0 // indirect
|
||||||
|
github.com/metacubex/bbolt v0.0.0-20250725135710-010dbbbb7a5b // indirect
|
||||||
|
github.com/metacubex/blake3 v0.1.0 // indirect
|
||||||
|
github.com/metacubex/chacha v0.1.5 // indirect
|
||||||
|
github.com/metacubex/chi v0.1.0 // indirect
|
||||||
|
github.com/metacubex/connect-ip-go v0.0.0-20260412152424-e1625567920a // indirect
|
||||||
|
github.com/metacubex/cpu v0.1.1 // indirect
|
||||||
|
github.com/metacubex/edwards25519 v1.2.0 // indirect
|
||||||
|
github.com/metacubex/fswatch v0.1.1 // indirect
|
||||||
github.com/metacubex/gopacket v1.1.20-0.20230608035415-7e2f98a3e759 // indirect
|
github.com/metacubex/gopacket v1.1.20-0.20230608035415-7e2f98a3e759 // indirect
|
||||||
github.com/metacubex/gvisor v0.0.0-20241126021258-5b028898cc5a // indirect
|
github.com/metacubex/gvisor v0.0.0-20251227095601-261ec1326fe8 // indirect
|
||||||
github.com/metacubex/quic-go v0.48.3-0.20241126053724-b69fea3888da // indirect
|
github.com/metacubex/hkdf v0.1.0 // indirect
|
||||||
|
github.com/metacubex/hpke v0.1.0 // indirect
|
||||||
|
github.com/metacubex/http v0.1.4 // indirect
|
||||||
|
github.com/metacubex/kcp-go v0.0.0-20260105040817-550693377604 // indirect
|
||||||
|
github.com/metacubex/mhurl v0.1.0 // indirect
|
||||||
|
github.com/metacubex/mlkem v0.1.0 // indirect
|
||||||
|
github.com/metacubex/nftables v0.0.0-20260426003805-208c2c1ba2cb // indirect
|
||||||
|
github.com/metacubex/qpack v0.6.0 // indirect
|
||||||
|
github.com/metacubex/quic-go v0.59.1-0.20260413153657-53bb22f2c306 // indirect
|
||||||
github.com/metacubex/randv2 v0.2.0 // indirect
|
github.com/metacubex/randv2 v0.2.0 // indirect
|
||||||
github.com/metacubex/sing-quic v0.0.0-20240827003841-cd97758ed8b4 // indirect
|
github.com/metacubex/restls-client-go v0.1.7 // indirect
|
||||||
github.com/metacubex/sing-shadowsocks v0.2.8 // indirect
|
github.com/metacubex/sing v0.5.7 // indirect
|
||||||
github.com/metacubex/sing-shadowsocks2 v0.2.2 // indirect
|
github.com/metacubex/sing-mux v0.3.9 // indirect
|
||||||
github.com/metacubex/sing-tun v0.4.2 // indirect
|
github.com/metacubex/sing-quic v0.0.0-20260414034501-3ea3410d197a // indirect
|
||||||
github.com/metacubex/sing-vmess v0.1.9-0.20240719134745-1df6fb20bbf9 // indirect
|
github.com/metacubex/sing-shadowsocks v0.2.12 // indirect
|
||||||
github.com/metacubex/sing-wireguard v0.0.0-20241126021510-0827d417b589 // indirect
|
github.com/metacubex/sing-shadowsocks2 v0.2.7 // indirect
|
||||||
github.com/metacubex/tfo-go v0.0.0-20241006021335-daedaf0ca7aa // indirect
|
github.com/metacubex/sing-shadowtls v0.0.0-20250503063515-5d9f966d17a2 // indirect
|
||||||
github.com/metacubex/utls v1.6.6 // indirect
|
github.com/metacubex/sing-tun v0.4.18 // indirect
|
||||||
github.com/metacubex/wireguard-go v0.0.0-20240922131502-c182e7471181 // indirect
|
github.com/metacubex/sing-vmess v0.2.5 // indirect
|
||||||
github.com/miekg/dns v1.1.62 // indirect
|
github.com/metacubex/sing-wireguard v0.0.0-20260507084707-690d479ec947 // indirect
|
||||||
|
github.com/metacubex/smux v0.0.0-20260105030934-d0c8756d3141 // indirect
|
||||||
|
github.com/metacubex/ssh v0.1.0 // indirect
|
||||||
|
github.com/metacubex/tfo-go v0.0.0-20251130171125-413e892ac443 // indirect
|
||||||
|
github.com/metacubex/tls v0.1.5 // indirect
|
||||||
|
github.com/metacubex/utls v1.8.4 // indirect
|
||||||
|
github.com/metacubex/wireguard-go v0.0.0-20250820062549-a6cecdd7f57f // indirect
|
||||||
|
github.com/metacubex/yamux v0.0.0-20250918083631-dd5f17c0be49 // indirect
|
||||||
|
github.com/miekg/dns v1.1.63 // indirect
|
||||||
github.com/mroth/weightedrand/v2 v2.1.0 // indirect
|
github.com/mroth/weightedrand/v2 v2.1.0 // indirect
|
||||||
github.com/oasisprotocol/deoxysii v0.0.0-20220228165953-2091330c22b7 // indirect
|
github.com/oasisprotocol/deoxysii v0.0.0-20220228165953-2091330c22b7 // indirect
|
||||||
github.com/onsi/ginkgo/v2 v2.9.5 // indirect
|
|
||||||
github.com/openacid/low v0.1.21 // indirect
|
github.com/openacid/low v0.1.21 // indirect
|
||||||
github.com/oschwald/maxminddb-golang v1.12.0 // indirect
|
github.com/oschwald/maxminddb-golang v1.12.0 // indirect
|
||||||
github.com/pierrec/lz4/v4 v4.1.14 // indirect
|
github.com/pierrec/lz4/v4 v4.1.14 // indirect
|
||||||
github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect
|
|
||||||
github.com/puzpuzpuz/xsync/v3 v3.4.0 // indirect
|
|
||||||
github.com/quic-go/qpack v0.4.0 // indirect
|
|
||||||
github.com/quic-go/qtls-go1-20 v0.4.1 // indirect
|
|
||||||
github.com/sagernet/cors v1.2.1 // indirect
|
|
||||||
github.com/sagernet/fswatch v0.1.1 // indirect
|
|
||||||
github.com/sagernet/netlink v0.0.0-20240612041022-b9a21c07ac6a // indirect
|
github.com/sagernet/netlink v0.0.0-20240612041022-b9a21c07ac6a // indirect
|
||||||
github.com/sagernet/nftables v0.3.0-beta.4 // indirect
|
github.com/samber/lo v1.53.0 // indirect
|
||||||
github.com/sagernet/sing v0.5.1 // indirect
|
|
||||||
github.com/sagernet/sing-mux v0.2.1 // indirect
|
|
||||||
github.com/sagernet/sing-shadowtls v0.1.5 // indirect
|
|
||||||
github.com/sagernet/smux v0.0.0-20231208180855-7041f6ea79e7 // indirect
|
|
||||||
github.com/samber/lo v1.47.0 // indirect
|
|
||||||
github.com/shirou/gopsutil/v4 v4.24.11 // indirect
|
|
||||||
github.com/sina-ghaderi/poly1305 v0.0.0-20220724002748-c5926b03988b // indirect
|
github.com/sina-ghaderi/poly1305 v0.0.0-20220724002748-c5926b03988b // indirect
|
||||||
github.com/sina-ghaderi/rabaead v0.0.0-20220730151906-ab6e06b96e8c // indirect
|
github.com/sina-ghaderi/rabaead v0.0.0-20220730151906-ab6e06b96e8c // indirect
|
||||||
github.com/sina-ghaderi/rabbitio v0.0.0-20220730151941-9ce26f4f872e // indirect
|
github.com/sina-ghaderi/rabbitio v0.0.0-20220730151941-9ce26f4f872e // indirect
|
||||||
github.com/sirupsen/logrus v1.9.3 // indirect
|
github.com/sirupsen/logrus v1.9.4 // indirect
|
||||||
github.com/tklauser/go-sysconf v0.3.12 // indirect
|
|
||||||
github.com/tklauser/numcpus v0.6.1 // indirect
|
|
||||||
github.com/u-root/uio v0.0.0-20230220225925-ffce2a382923 // indirect
|
github.com/u-root/uio v0.0.0-20230220225925-ffce2a382923 // indirect
|
||||||
github.com/vishvananda/netns v0.0.4 // indirect
|
github.com/vishvananda/netns v0.0.5 // indirect
|
||||||
github.com/vmihailenco/msgpack/v5 v5.4.1 // indirect
|
github.com/vmihailenco/msgpack/v5 v5.4.1 // indirect
|
||||||
github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect
|
github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect
|
||||||
github.com/wk8/go-ordered-map/v2 v2.1.8 // indirect
|
github.com/yosida95/uritemplate/v3 v3.0.2 // indirect
|
||||||
github.com/yusufpapurcu/wmi v1.2.4 // indirect
|
|
||||||
gitlab.com/go-extension/aes-ccm v0.0.0-20230221065045-e58665ef23c7 // indirect
|
gitlab.com/go-extension/aes-ccm v0.0.0-20230221065045-e58665ef23c7 // indirect
|
||||||
gitlab.com/yawning/bsaes.git v0.0.0-20190805113838-0a714cd429ec // indirect
|
gitlab.com/yawning/bsaes.git v0.0.0-20190805113838-0a714cd429ec // indirect
|
||||||
go.uber.org/mock v0.4.0 // indirect
|
|
||||||
go4.org/netipx v0.0.0-20231129151722-fdeea329fbba // indirect
|
go4.org/netipx v0.0.0-20231129151722-fdeea329fbba // indirect
|
||||||
golang.org/x/crypto v0.31.0 // indirect
|
golang.org/x/crypto v0.33.0 // indirect
|
||||||
golang.org/x/exp v0.0.0-20240904232852-e7e105dedf7e // indirect
|
golang.org/x/exp v0.0.0-20240904232852-e7e105dedf7e // indirect
|
||||||
golang.org/x/mod v0.20.0 // indirect
|
golang.org/x/mod v0.20.0 // indirect
|
||||||
golang.org/x/net v0.32.0 // indirect
|
golang.org/x/net v0.35.0 // indirect
|
||||||
golang.org/x/sys v0.28.0 // indirect
|
golang.org/x/sys v0.30.0 // indirect
|
||||||
golang.org/x/text v0.21.0 // indirect
|
golang.org/x/text v0.22.0 // indirect
|
||||||
golang.org/x/time v0.7.0 // indirect
|
golang.org/x/time v0.10.0 // indirect
|
||||||
golang.org/x/tools v0.24.0 // indirect
|
golang.org/x/tools v0.24.0 // indirect
|
||||||
google.golang.org/protobuf v1.34.2 // indirect
|
google.golang.org/protobuf v1.34.2 // indirect
|
||||||
lukechampine.com/blake3 v1.3.0 // indirect
|
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||||
)
|
)
|
||||||
|
|
||||||
|
replace google.golang.org/protobuf => github.com/metacubex/protobuf-go v0.0.0-20260306035419-7ceee0674686
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
github.com/3andne/restls-client-go v0.1.6 h1:tRx/YilqW7iHpgmEL4E1D8dAsuB0tFF3uvncS+B6I08=
|
github.com/RyuaNerin/go-krypto v1.3.0 h1:smavTzSMAx8iuVlGb4pEwl9MD2qicqMzuXR2QWp2/Pg=
|
||||||
github.com/3andne/restls-client-go v0.1.6/go.mod h1:iEdTZNt9kzPIxjIGSMScUFSBrUH6bFRNg0BWlP4orEY=
|
github.com/RyuaNerin/go-krypto v1.3.0/go.mod h1:9R9TU936laAIqAmjcHo/LsaXYOZlymudOAxjaBf62UM=
|
||||||
github.com/RyuaNerin/elliptic2 v1.0.0/go.mod h1:wWB8fWrJI/6EPJkyV/r1Rj0hxUgrusmqSj8JN6yNf/A=
|
github.com/RyuaNerin/testingutil v0.1.0 h1:IYT6JL57RV3U2ml3dLHZsVtPOP6yNK7WUVdzzlpNrss=
|
||||||
github.com/RyuaNerin/go-krypto v1.2.4 h1:mXuNdK6M317aPV0llW6Xpjbo4moOlPF7Yxz4tb4b4Go=
|
|
||||||
github.com/RyuaNerin/go-krypto v1.2.4/go.mod h1:QqCYkoutU3yInyD9INt2PGolVRsc3W4oraQadVGXJ/8=
|
|
||||||
github.com/Yawning/aez v0.0.0-20211027044916-e49e68abd344 h1:cDVUiFo+npB0ZASqnw4q90ylaVAbnYyx0JYqK4YcGok=
|
github.com/Yawning/aez v0.0.0-20211027044916-e49e68abd344 h1:cDVUiFo+npB0ZASqnw4q90ylaVAbnYyx0JYqK4YcGok=
|
||||||
github.com/Yawning/aez v0.0.0-20211027044916-e49e68abd344/go.mod h1:9pIqrY6SXNL8vjRQE5Hd/OL5GyK/9MrGUWs87z/eFfk=
|
github.com/Yawning/aez v0.0.0-20211027044916-e49e68abd344/go.mod h1:9pIqrY6SXNL8vjRQE5Hd/OL5GyK/9MrGUWs87z/eFfk=
|
||||||
github.com/ajg/form v1.5.1 h1:t9c7v8JUKu/XxOGBU0yjNpaMloxGEJhUkqFRq0ibGeU=
|
github.com/ajg/form v1.5.1 h1:t9c7v8JUKu/XxOGBU0yjNpaMloxGEJhUkqFRq0ibGeU=
|
||||||
@@ -12,26 +10,18 @@ github.com/andybalholm/brotli v1.0.6/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHG
|
|||||||
github.com/bahlo/generic-list-go v0.2.0 h1:5sz/EEAK+ls5wF+NeqDpk5+iNdMDXrh3z3nPnH1Wvgk=
|
github.com/bahlo/generic-list-go v0.2.0 h1:5sz/EEAK+ls5wF+NeqDpk5+iNdMDXrh3z3nPnH1Wvgk=
|
||||||
github.com/bahlo/generic-list-go v0.2.0/go.mod h1:2KvAjgMlE5NNynlg/5iLrrCCZ2+5xWbdbCW3pNTGyYg=
|
github.com/bahlo/generic-list-go v0.2.0/go.mod h1:2KvAjgMlE5NNynlg/5iLrrCCZ2+5xWbdbCW3pNTGyYg=
|
||||||
github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=
|
github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=
|
||||||
github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs=
|
|
||||||
github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0=
|
|
||||||
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
|
|
||||||
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
|
|
||||||
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
|
|
||||||
github.com/cloudflare/circl v1.3.7 h1:qlCDlTPz2n9fu58M0Nh1J/JzcFpfgkFHHX3O35r5vcU=
|
|
||||||
github.com/cloudflare/circl v1.3.7/go.mod h1:sRTcRWXGLrKw6yIGJ+l7amYJFfAXbZG0kBSc8r4zxgA=
|
|
||||||
github.com/coreos/go-iptables v0.8.0 h1:MPc2P89IhuVpLI7ETL/2tx3XZ61VeICZjYqDEgNsPRc=
|
github.com/coreos/go-iptables v0.8.0 h1:MPc2P89IhuVpLI7ETL/2tx3XZ61VeICZjYqDEgNsPRc=
|
||||||
github.com/coreos/go-iptables v0.8.0/go.mod h1:Qe8Bv2Xik5FyTXwgIbLAnv2sWSBmvWdFETJConOQ//Q=
|
github.com/coreos/go-iptables v0.8.0/go.mod h1:Qe8Bv2Xik5FyTXwgIbLAnv2sWSBmvWdFETJConOQ//Q=
|
||||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/dlclark/regexp2 v1.12.0 h1:0j4c5qQmnC6XOWNjP3PIXURXN2gWx76rd3KvgdPkCz8=
|
||||||
github.com/dlclark/regexp2 v1.11.4 h1:rPYF9/LECdNymJufQKmri9gV604RvvABwgOA8un7yAo=
|
github.com/dlclark/regexp2 v1.12.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
|
||||||
github.com/dlclark/regexp2 v1.11.4/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
|
github.com/dunglas/httpsfv v1.0.2 h1:iERDp/YAfnojSDJ7PW3dj1AReJz4MrwbECSSE59JWL0=
|
||||||
github.com/ebitengine/purego v0.8.1 h1:sdRKd6plj7KYW33EH5As6YKfe8m9zbN9JMrOjNVF/BE=
|
github.com/dunglas/httpsfv v1.0.2/go.mod h1:zID2mqw9mFsnt7YC3vYQ9/cjq30q41W+1AnDwH8TiMg=
|
||||||
github.com/ebitengine/purego v0.8.1/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ=
|
github.com/enfein/mieru/v3 v3.31.0 h1:Fl2ocRCRXJzMygzdRjBHgqI996ZuIDHUmyQyovSf9sA=
|
||||||
github.com/enfein/mieru/v3 v3.8.4 h1:PmBQykuEcl8yKcQ647pg8Qbjl433CRYgUbW6VLBgGn4=
|
github.com/enfein/mieru/v3 v3.31.0/go.mod h1:zJBUCsi5rxyvHM8fjFf+GLaEl4OEjjBXr1s5F6Qd3hM=
|
||||||
github.com/enfein/mieru/v3 v3.8.4/go.mod h1:YtU00qjAEt54mCBQu4WZPCey6cBdB1BUtXjvrHLEUNQ=
|
github.com/ericlagergren/aegis v0.0.0-20250325060835-cd0defd64358 h1:kXYqH/sL8dS/FdoFjr12ePjnLPorPo2FsnrHNuXSDyo=
|
||||||
github.com/ericlagergren/aegis v0.0.0-20230312195928-b4ce538b56f9 h1:/5RkVc9Rc81XmMyVqawCiDyrBHZbLAZgTTCqou4mwj8=
|
github.com/ericlagergren/aegis v0.0.0-20250325060835-cd0defd64358/go.mod h1:hkIFzoiIPZYxdFOOLyDho59b7SrDfo+w3h+yWdlg45I=
|
||||||
github.com/ericlagergren/aegis v0.0.0-20230312195928-b4ce538b56f9/go.mod h1:hkIFzoiIPZYxdFOOLyDho59b7SrDfo+w3h+yWdlg45I=
|
|
||||||
github.com/ericlagergren/polyval v0.0.0-20220411101811-e25bc10ba391 h1:8j2RH289RJplhA6WfdaPqzg1MjH2K8wX5e0uhAxrw2g=
|
github.com/ericlagergren/polyval v0.0.0-20220411101811-e25bc10ba391 h1:8j2RH289RJplhA6WfdaPqzg1MjH2K8wX5e0uhAxrw2g=
|
||||||
github.com/ericlagergren/polyval v0.0.0-20220411101811-e25bc10ba391/go.mod h1:K2R7GhgxrlJzHw2qiPWsCZXf/kXEJN9PLnQK73Ll0po=
|
github.com/ericlagergren/polyval v0.0.0-20220411101811-e25bc10ba391/go.mod h1:K2R7GhgxrlJzHw2qiPWsCZXf/kXEJN9PLnQK73Ll0po=
|
||||||
github.com/ericlagergren/saferand v0.0.0-20220206064634-960a4dd2bc5c h1:RUzBDdZ+e/HEe2Nh8lYsduiPAZygUfVXJn0Ncj5sHMg=
|
github.com/ericlagergren/saferand v0.0.0-20220206064634-960a4dd2bc5c h1:RUzBDdZ+e/HEe2Nh8lYsduiPAZygUfVXJn0Ncj5sHMg=
|
||||||
@@ -39,105 +29,133 @@ github.com/ericlagergren/siv v0.0.0-20220507050439-0b757b3aa5f1 h1:tlDMEdcPRQKBE
|
|||||||
github.com/ericlagergren/siv v0.0.0-20220507050439-0b757b3aa5f1/go.mod h1:4RfsapbGx2j/vU5xC/5/9qB3kn9Awp1YDiEnN43QrJ4=
|
github.com/ericlagergren/siv v0.0.0-20220507050439-0b757b3aa5f1/go.mod h1:4RfsapbGx2j/vU5xC/5/9qB3kn9Awp1YDiEnN43QrJ4=
|
||||||
github.com/ericlagergren/subtle v0.0.0-20220507045147-890d697da010 h1:fuGucgPk5dN6wzfnxl3D0D3rVLw4v2SbBT9jb4VnxzA=
|
github.com/ericlagergren/subtle v0.0.0-20220507045147-890d697da010 h1:fuGucgPk5dN6wzfnxl3D0D3rVLw4v2SbBT9jb4VnxzA=
|
||||||
github.com/ericlagergren/subtle v0.0.0-20220507045147-890d697da010/go.mod h1:JtBcj7sBuTTRupn7c2bFspMDIObMJsVK8TeUvpShPok=
|
github.com/ericlagergren/subtle v0.0.0-20220507045147-890d697da010/go.mod h1:JtBcj7sBuTTRupn7c2bFspMDIObMJsVK8TeUvpShPok=
|
||||||
github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=
|
github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k=
|
||||||
github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
|
github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0=
|
||||||
github.com/gaukas/godicttls v0.0.4 h1:NlRaXb3J6hAnTmWdsEKb9bcSBD6BvcIjdGdeb0zfXbk=
|
github.com/gaukas/godicttls v0.0.4 h1:NlRaXb3J6hAnTmWdsEKb9bcSBD6BvcIjdGdeb0zfXbk=
|
||||||
github.com/gaukas/godicttls v0.0.4/go.mod h1:l6EenT4TLWgTdwslVb4sEMOCf7Bv0JAK67deKr9/NCI=
|
github.com/gaukas/godicttls v0.0.4/go.mod h1:l6EenT4TLWgTdwslVb4sEMOCf7Bv0JAK67deKr9/NCI=
|
||||||
github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw=
|
|
||||||
github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8=
|
|
||||||
github.com/go-chi/render v1.0.3 h1:AsXqd2a1/INaIfUSKq3G5uA8weYx20FOsM7uSoCyyt4=
|
|
||||||
github.com/go-chi/render v1.0.3/go.mod h1:/gr3hVkmYR0YlEy3LxCuVRFzEu9Ruok+gFqbIofjao0=
|
|
||||||
github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ=
|
|
||||||
github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
|
|
||||||
github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE=
|
github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE=
|
||||||
github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78=
|
github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78=
|
||||||
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI=
|
|
||||||
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls=
|
|
||||||
github.com/gobwas/httphead v0.1.0 h1:exrUm0f4YX0L7EBwZHuCF4GDp8aJfVeBrlLQrs6NqWU=
|
github.com/gobwas/httphead v0.1.0 h1:exrUm0f4YX0L7EBwZHuCF4GDp8aJfVeBrlLQrs6NqWU=
|
||||||
github.com/gobwas/httphead v0.1.0/go.mod h1:O/RXo79gxV8G+RqlR/otEwx4Q36zl9rqC5u12GKvMCM=
|
github.com/gobwas/httphead v0.1.0/go.mod h1:O/RXo79gxV8G+RqlR/otEwx4Q36zl9rqC5u12GKvMCM=
|
||||||
github.com/gobwas/pool v0.2.1 h1:xfeeEhW7pwmX8nuLVlqbzVc7udMDrwetjEv+TZIz1og=
|
github.com/gobwas/pool v0.2.1 h1:xfeeEhW7pwmX8nuLVlqbzVc7udMDrwetjEv+TZIz1og=
|
||||||
github.com/gobwas/pool v0.2.1/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw=
|
github.com/gobwas/pool v0.2.1/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw=
|
||||||
github.com/gobwas/ws v1.4.0 h1:CTaoG1tojrh4ucGPcoJFiAQUAsEWekEWvLy7GsVNqGs=
|
github.com/gobwas/ws v1.4.0 h1:CTaoG1tojrh4ucGPcoJFiAQUAsEWekEWvLy7GsVNqGs=
|
||||||
github.com/gobwas/ws v1.4.0/go.mod h1:G3gNqMNtPppf5XUz7O4shetPpcZ1VJ7zt18dlUeakrc=
|
github.com/gobwas/ws v1.4.0/go.mod h1:G3gNqMNtPppf5XUz7O4shetPpcZ1VJ7zt18dlUeakrc=
|
||||||
github.com/gofrs/uuid/v5 v5.3.0 h1:m0mUMr+oVYUdxpMLgSYCZiXe7PuVPnI94+OMeVBNedk=
|
github.com/gofrs/uuid/v5 v5.4.0 h1:EfbpCTjqMuGyq5ZJwxqzn3Cbr2d0rUZU7v5ycAk/e/0=
|
||||||
github.com/gofrs/uuid/v5 v5.3.0/go.mod h1:CDOjlDMVAtN56jqyRUZh58JT31Tiw7/oQyEXZV+9bD8=
|
github.com/gofrs/uuid/v5 v5.4.0/go.mod h1:CDOjlDMVAtN56jqyRUZh58JT31Tiw7/oQyEXZV+9bD8=
|
||||||
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
|
github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs=
|
||||||
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
|
github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
||||||
github.com/google/btree v1.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg=
|
github.com/google/btree v1.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg=
|
||||||
github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4=
|
github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4=
|
||||||
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
|
||||||
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
|
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
|
||||||
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
||||||
github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 h1:yAJXTCF9TqKcTiHJAE8dj7HMvPfh66eeA2JYW7eFpSE=
|
github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 h1:FKHo8hFI3A+7w0aUQuYXQ+6EN5stWmeY/AZqtM8xk9k=
|
||||||
github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
|
github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo=
|
||||||
github.com/google/tink/go v1.6.1 h1:t7JHqO8Ath2w2ig5vjwQYJzhGEZymedQc90lQXUBa4I=
|
github.com/google/tink/go v1.6.1 h1:t7JHqO8Ath2w2ig5vjwQYJzhGEZymedQc90lQXUBa4I=
|
||||||
github.com/hashicorp/yamux v0.1.2 h1:XtB8kyFOyHXYVFnwT5C3+Bdo8gArse7j2AQ0DA0Uey8=
|
github.com/insomniacslk/dhcp v0.0.0-20250109001534-8abf58130905 h1:q3OEI9RaN/wwcx+qgGo6ZaoJkCiDYe/gjDLfq7lQQF4=
|
||||||
github.com/hashicorp/yamux v0.1.2/go.mod h1:C+zze2n6e/7wshOZep2A70/aQU6QBRWJO/G6FT1wIns=
|
github.com/insomniacslk/dhcp v0.0.0-20250109001534-8abf58130905/go.mod h1:VvGYjkZoJyKqlmT1yzakUs4mfKMNB0XdODP0+rdml6k=
|
||||||
github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
|
|
||||||
github.com/insomniacslk/dhcp v0.0.0-20241203100832-a481575ed0ef h1:NzQKDfd5ZOPnuZYf9MnRee8x2qecsVqzsnaLjEZiBko=
|
|
||||||
github.com/insomniacslk/dhcp v0.0.0-20241203100832-a481575ed0ef/go.mod h1:KclMyHxX06VrVr0DJmeFSUb1ankt7xTfoOA35pCkoic=
|
|
||||||
github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
|
|
||||||
github.com/josharian/native v1.0.1-0.20221213033349-c1e37c09b531/go.mod h1:7X/raswPFr05uY3HiLlYeyQntB6OO7E/d2Cu7qoaN2w=
|
github.com/josharian/native v1.0.1-0.20221213033349-c1e37c09b531/go.mod h1:7X/raswPFr05uY3HiLlYeyQntB6OO7E/d2Cu7qoaN2w=
|
||||||
github.com/josharian/native v1.1.0 h1:uuaP0hAbW7Y4l0ZRQ6C9zfb7Mg1mbFKry/xzDAfmtLA=
|
github.com/josharian/native v1.1.0 h1:uuaP0hAbW7Y4l0ZRQ6C9zfb7Mg1mbFKry/xzDAfmtLA=
|
||||||
github.com/josharian/native v1.1.0/go.mod h1:7X/raswPFr05uY3HiLlYeyQntB6OO7E/d2Cu7qoaN2w=
|
github.com/josharian/native v1.1.0/go.mod h1:7X/raswPFr05uY3HiLlYeyQntB6OO7E/d2Cu7qoaN2w=
|
||||||
github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA=
|
github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA=
|
||||||
github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw=
|
github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw=
|
||||||
github.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY=
|
github.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc=
|
||||||
github.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8=
|
github.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
|
||||||
github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4=
|
github.com/klauspost/reedsolomon v1.12.3 h1:tzUznbfc3OFwJaTebv/QdhnFf2Xvb7gZ24XaHLBPmdc=
|
||||||
github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I=
|
github.com/klauspost/reedsolomon v1.12.3/go.mod h1:3K5rXwABAvzGeR01r6pWZieUALXO/Tq7bFKGIb4m4WI=
|
||||||
github.com/lunixbochs/struc v0.0.0-20200707160740-784aaebc1d40 h1:EnfXoSqDfSNJv0VBNqY/88RNnhSGYkrHaO0mmFGbVsc=
|
|
||||||
github.com/lunixbochs/struc v0.0.0-20200707160740-784aaebc1d40/go.mod h1:vy1vK6wD6j7xX6O6hXe621WabdtNkou2h7uRtTfRMyg=
|
|
||||||
github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
|
|
||||||
github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
|
|
||||||
github.com/mdlayher/netlink v1.7.2 h1:/UtM3ofJap7Vl4QWCPDGXY8d3GIY2UGSDbK+QWmY8/g=
|
github.com/mdlayher/netlink v1.7.2 h1:/UtM3ofJap7Vl4QWCPDGXY8d3GIY2UGSDbK+QWmY8/g=
|
||||||
github.com/mdlayher/netlink v1.7.2/go.mod h1:xraEF7uJbxLhc5fpHL4cPe221LI2bdttWlU+ZGLfQSw=
|
github.com/mdlayher/netlink v1.7.2/go.mod h1:xraEF7uJbxLhc5fpHL4cPe221LI2bdttWlU+ZGLfQSw=
|
||||||
github.com/mdlayher/socket v0.4.1 h1:eM9y2/jlbs1M615oshPQOHZzj6R6wMT7bX5NPiQvn2U=
|
github.com/mdlayher/socket v0.5.1 h1:VZaqt6RkGkt2OE9l3GcC6nZkqD3xKeQLyfleW/uBcos=
|
||||||
github.com/mdlayher/socket v0.4.1/go.mod h1:cAqeGjoufqdxWkD7DkpyS+wcefOtmu5OQ8KuoJGIReA=
|
github.com/mdlayher/socket v0.5.1/go.mod h1:TjPLHI1UgwEv5J1B5q0zTZq12A/6H7nKmtTanQE37IQ=
|
||||||
github.com/metacubex/amneziawg-go v0.0.0-20240922133038-fdf3a4d5a4ab h1:Chbw+/31UC14YFNr78pESt5Vowlc62zziw05JCUqoL4=
|
github.com/metacubex/amneziawg-go v0.0.0-20251104174305-5a0e9f7e361d h1:vAJ0ZT4aO803F1uw2roIA9yH7Sxzox34tVVyye1bz6c=
|
||||||
github.com/metacubex/amneziawg-go v0.0.0-20240922133038-fdf3a4d5a4ab/go.mod h1:xVKK8jC5Sd3hfh7WjmCq+HorehIbrBijaUWmcuKjPcI=
|
github.com/metacubex/amneziawg-go v0.0.0-20251104174305-5a0e9f7e361d/go.mod h1:MsM/5czONyXMJ3PRr5DbQ4O/BxzAnJWOIcJdLzW6qHY=
|
||||||
github.com/metacubex/bbolt v0.0.0-20240822011022-aed6d4850399 h1:oBowHVKZycNtAFbZ6avaCSZJYeme2Nrj+4RpV2cNJig=
|
github.com/metacubex/ascon v0.1.0 h1:6ZWxmXYszT1XXtwkf6nxfFhc/OTtQ9R3Vyj1jN32lGM=
|
||||||
github.com/metacubex/bbolt v0.0.0-20240822011022-aed6d4850399/go.mod h1:4xcieuIK+M4bGQmQYZVqEaIYqjS1ahO4kXG7EmDgEro=
|
github.com/metacubex/ascon v0.1.0/go.mod h1:eV5oim4cVPPdEL8/EYaTZ0iIKARH9pnhAK/fcT5Kacc=
|
||||||
github.com/metacubex/chacha v0.1.0 h1:tg9RSJ18NvL38cCWNyYH1eiG6qDCyyXIaTLQthon0sc=
|
github.com/metacubex/bart v0.26.0 h1:d/bBTvVatfVWGfQbiDpYKI1bXUJgjaabB2KpK1Tnk6w=
|
||||||
github.com/metacubex/chacha v0.1.0/go.mod h1:Djn9bPZxLTXbJFSeyo0/qzEzQI+gUSSzttuzZM75GH8=
|
github.com/metacubex/bart v0.26.0/go.mod h1:DCcyfP4MC+Zy7sLK7XeGuMw+P5K9mIRsYOBgiE8icsI=
|
||||||
|
github.com/metacubex/bbolt v0.0.0-20250725135710-010dbbbb7a5b h1:j7dadXD8I2KTmMt8jg1JcaP1ANL3JEObJPdANKcSYPY=
|
||||||
|
github.com/metacubex/bbolt v0.0.0-20250725135710-010dbbbb7a5b/go.mod h1:+WmP0VJZDkDszvpa83HzfUp6QzARl/IKkMorH4+nODw=
|
||||||
|
github.com/metacubex/blake3 v0.1.0 h1:KGnjh/56REO7U+cgZA8dnBhxdP7jByrG7hTP+bu6cqY=
|
||||||
|
github.com/metacubex/blake3 v0.1.0/go.mod h1:CCkLdzFrqf7xmxCdhQFvJsRRV2mwOLDoSPg6vUTB9Uk=
|
||||||
|
github.com/metacubex/chacha v0.1.5 h1:fKWMb/5c7ZrY8Uoqi79PPFxl+qwR7X/q0OrsAubyX2M=
|
||||||
|
github.com/metacubex/chacha v0.1.5/go.mod h1:Djn9bPZxLTXbJFSeyo0/qzEzQI+gUSSzttuzZM75GH8=
|
||||||
|
github.com/metacubex/chi v0.1.0 h1:rjNDyDj50nRpicG43CNkIw4ssiCbmDL8d7wJXKlUCsg=
|
||||||
|
github.com/metacubex/chi v0.1.0/go.mod h1:zM5u5oMQt8b2DjvDHvzadKrP6B2ztmasL1YHRMbVV+g=
|
||||||
|
github.com/metacubex/connect-ip-go v0.0.0-20260412152424-e1625567920a h1:Ph5UfTWDsGruZ+v95Df1ycTflQFmpZBFg2LUvj2kx/M=
|
||||||
|
github.com/metacubex/connect-ip-go v0.0.0-20260412152424-e1625567920a/go.mod h1:xYC8Ik7/rN6no+vTRuWMEziGwm3brA0wNM/zZP9qhOQ=
|
||||||
|
github.com/metacubex/cpu v0.1.1 h1:rRV5HGmeuGzjiKI3hYbL0dCd0qGwM7VUtk4ICXD06mI=
|
||||||
|
github.com/metacubex/cpu v0.1.1/go.mod h1:09VEt4dSRLR+bOA8l4w4NDuzGZ8n5dkMv7e8axgEeTU=
|
||||||
|
github.com/metacubex/edwards25519 v1.2.0 h1:pIQZLBsjQgg3Nl/c86YYFEUAbL5qQRnPq4LrgIw0KK4=
|
||||||
|
github.com/metacubex/edwards25519 v1.2.0/go.mod h1:NCQF3J/Ki7382FJuokwsywEIIEI/gro/3smyXgQJsx0=
|
||||||
|
github.com/metacubex/fswatch v0.1.1 h1:jqU7C/v+g0qc2RUFgmAOPoVvfl2BXXUXEumn6oQuxhU=
|
||||||
|
github.com/metacubex/fswatch v0.1.1/go.mod h1:czrTT7Zlbz7vWft8RQu9Qqh+JoX+Nnb+UabuyN1YsgI=
|
||||||
github.com/metacubex/gopacket v1.1.20-0.20230608035415-7e2f98a3e759 h1:cjd4biTvOzK9ubNCCkQ+ldc4YSH/rILn53l/xGBFHHI=
|
github.com/metacubex/gopacket v1.1.20-0.20230608035415-7e2f98a3e759 h1:cjd4biTvOzK9ubNCCkQ+ldc4YSH/rILn53l/xGBFHHI=
|
||||||
github.com/metacubex/gopacket v1.1.20-0.20230608035415-7e2f98a3e759/go.mod h1:UHOv2xu+RIgLwpXca7TLrXleEd4oR3sPatW6IF8wU88=
|
github.com/metacubex/gopacket v1.1.20-0.20230608035415-7e2f98a3e759/go.mod h1:UHOv2xu+RIgLwpXca7TLrXleEd4oR3sPatW6IF8wU88=
|
||||||
github.com/metacubex/gvisor v0.0.0-20241126021258-5b028898cc5a h1:cZ6oNVrsmsi3SNlnSnRio4zOgtQq+/XidwsaNgKICcg=
|
github.com/metacubex/gvisor v0.0.0-20251227095601-261ec1326fe8 h1:hUL81H0Ic/XIDkvtn9M1pmfDdfid7JzYQToY4Ps1TvQ=
|
||||||
github.com/metacubex/gvisor v0.0.0-20241126021258-5b028898cc5a/go.mod h1:xBw/SYJPgUMPQ1tklV/brGn2nxhfr3BnvBzNlyi4Nic=
|
github.com/metacubex/gvisor v0.0.0-20251227095601-261ec1326fe8/go.mod h1:8LpS0IJW1VmWzUm3ylb0e2SK5QDm5lO/2qwWLZgRpBU=
|
||||||
github.com/metacubex/quic-go v0.48.3-0.20241126053724-b69fea3888da h1:Mq6cbHbPTLLTUfA9scrwBmOGkvl6y99E3WmtMIMqo30=
|
github.com/metacubex/hkdf v0.1.0 h1:fPA6VzXK8cU1foc/TOmGCDmSa7pZbxlnqhl3RNsthaA=
|
||||||
github.com/metacubex/quic-go v0.48.3-0.20241126053724-b69fea3888da/go.mod h1:AiZ+UPgrkO1DTnmiAX4b+kRoV1Vfc65UkYD7RbFlIZA=
|
github.com/metacubex/hkdf v0.1.0/go.mod h1:3seEfds3smgTAXqUGn+tgEJH3uXdsUjOiduG/2EtvZ4=
|
||||||
|
github.com/metacubex/hpke v0.1.0 h1:gu2jUNhraehWi0P/z5HX2md3d7L1FhPQE6/Q0E9r9xQ=
|
||||||
|
github.com/metacubex/hpke v0.1.0/go.mod h1:vfDm6gfgrwlXUxKDkWbcE44hXtmc1uxLDm2BcR11b3U=
|
||||||
|
github.com/metacubex/http v0.1.4 h1:gU1y8WlqslzxGmedW2ah74fGL6wJYU2HXUkCMJtCa2A=
|
||||||
|
github.com/metacubex/http v0.1.4/go.mod h1:Nxx0zZAo2AhRfanyL+fmmK6ACMtVsfpwIl1aFAik2Eg=
|
||||||
|
github.com/metacubex/kcp-go v0.0.0-20260105040817-550693377604 h1:hJwCVlE3ojViC35MGHB+FBr8TuIf3BUFn2EQ1VIamsI=
|
||||||
|
github.com/metacubex/kcp-go v0.0.0-20260105040817-550693377604/go.mod h1:lpmN3m269b3V5jFCWtffqBLS4U3QQoIid9ugtO+OhVc=
|
||||||
|
github.com/metacubex/mhurl v0.1.0 h1:ZdW4Zxe3j3uJ89gNytOazHu6kbHn5owutN/VfXOI8GE=
|
||||||
|
github.com/metacubex/mhurl v0.1.0/go.mod h1:2qpQImCbXoUs6GwJrjuEXKelPyoimsIXr07eNKZdS00=
|
||||||
|
github.com/metacubex/mlkem v0.1.0 h1:wFClitonSFcmipzzQvax75beLQU+D7JuC+VK1RzSL8I=
|
||||||
|
github.com/metacubex/mlkem v0.1.0/go.mod h1:amhaXZVeYNShuy9BILcR7P0gbeo/QLZsnqCdL8U2PDQ=
|
||||||
|
github.com/metacubex/nftables v0.0.0-20260426003805-208c2c1ba2cb h1:wk6mHYPURSUvWcUv72gNP79oiylFsscBSDPJ6ieV6Iw=
|
||||||
|
github.com/metacubex/nftables v0.0.0-20260426003805-208c2c1ba2cb/go.mod h1:73ZrCfhdkW4F2E2GAlta3km/S2RHhFNogCMtWZV2anQ=
|
||||||
|
github.com/metacubex/protobuf-go v0.0.0-20260306035419-7ceee0674686 h1:PIXmYT2anQt9V8vdmwixtbIJxOpoPXJfIACHPjXEgnE=
|
||||||
|
github.com/metacubex/protobuf-go v0.0.0-20260306035419-7ceee0674686/go.mod h1:eQV7juxFZIdRgjMxtVqP+6BssKoTZQ1RM0fc58BsCZY=
|
||||||
|
github.com/metacubex/qpack v0.6.0 h1:YqClGIMOpiRYLjV1qOs483Od08MdPgRnHjt90FuaAKw=
|
||||||
|
github.com/metacubex/qpack v0.6.0/go.mod h1:lKGSi7Xk94IMvHGOmxS9eIei3bvIqpOAImEBsaOwTkA=
|
||||||
|
github.com/metacubex/quic-go v0.59.1-0.20260413153657-53bb22f2c306 h1:HlGLmLsWJMLSu0CMI9z/BmEnithB4oXM5Rom6/0Qxtg=
|
||||||
|
github.com/metacubex/quic-go v0.59.1-0.20260413153657-53bb22f2c306/go.mod h1:oNzMrmylS897M3zSMuapIdwSwfq6F2qW01Z3NhVRJhk=
|
||||||
github.com/metacubex/randv2 v0.2.0 h1:uP38uBvV2SxYfLj53kuvAjbND4RUDfFJjwr4UigMiLs=
|
github.com/metacubex/randv2 v0.2.0 h1:uP38uBvV2SxYfLj53kuvAjbND4RUDfFJjwr4UigMiLs=
|
||||||
github.com/metacubex/randv2 v0.2.0/go.mod h1:kFi2SzrQ5WuneuoLLCMkABtiBu6VRrMrWFqSPyj2cxY=
|
github.com/metacubex/randv2 v0.2.0/go.mod h1:kFi2SzrQ5WuneuoLLCMkABtiBu6VRrMrWFqSPyj2cxY=
|
||||||
github.com/metacubex/sing v0.0.0-20241121030428-33b6ebc52000 h1:gUbMXcQXhXGj0vCpCVFTUyIH7TMpD1dpTcNv/MCS+ok=
|
github.com/metacubex/restls-client-go v0.1.7 h1:eCwiXCTQb5WJu9IlgYvDBA1OgrINv58dEe7hcN5H15k=
|
||||||
github.com/metacubex/sing v0.0.0-20241121030428-33b6ebc52000/go.mod h1:ARkL0gM13/Iv5VCZmci/NuoOlePoIsW0m7BWfln/Hak=
|
github.com/metacubex/restls-client-go v0.1.7/go.mod h1:BN/U52vPw7j8VTSh2vleD/MnmVKCov84mS5VcjVHH4g=
|
||||||
github.com/metacubex/sing-quic v0.0.0-20240827003841-cd97758ed8b4 h1:HobpULaPK6OoxrHMmgcwLkwwIduXVmwdcznwUfH1GQM=
|
github.com/metacubex/sing v0.5.7 h1:8OC+fhKFSv/l9ehEhJRaZZAOuthfZo68SteBVLe8QqM=
|
||||||
github.com/metacubex/sing-quic v0.0.0-20240827003841-cd97758ed8b4/go.mod h1:g7Mxj7b7zm7YVqD975mk/hSmrb0A0G4bVvIMr2MMzn8=
|
github.com/metacubex/sing v0.5.7/go.mod h1:ypf0mjwlZm0sKdQSY+yQvmsbWa0hNPtkeqyRMGgoN+w=
|
||||||
github.com/metacubex/sing-shadowsocks v0.2.8 h1:wIhlaigswzjPw4hej75sEvWte3QR0+AJRafgwBHO5B4=
|
github.com/metacubex/sing-mux v0.3.9 h1:/aoBD2+sK2qsXDlNDe3hkR0GZuFDtwIZhOeGUx9W0Yk=
|
||||||
github.com/metacubex/sing-shadowsocks v0.2.8/go.mod h1:X3x88XtJpBxG0W0/ECOJL6Ib0SJ3xdniAkU/6/RMWU0=
|
github.com/metacubex/sing-mux v0.3.9/go.mod h1:8bT7ZKT3clRrJjYc/x5CRYibC1TX/bK73a3r3+2E+Fc=
|
||||||
github.com/metacubex/sing-shadowsocks2 v0.2.2 h1:eaf42uVx4Lr21S6MDYs0ZdTvGA0GEhDpb9no4+gdXPo=
|
github.com/metacubex/sing-quic v0.0.0-20260414034501-3ea3410d197a h1:977o0ZYYbiQAGuOxql7Q6UN3rEy59OyAE0tELq4gZfI=
|
||||||
github.com/metacubex/sing-shadowsocks2 v0.2.2/go.mod h1:BhOug03a/RbI7y6hp6q+6ITM1dXjnLTmeWBHSTwvv2Q=
|
github.com/metacubex/sing-quic v0.0.0-20260414034501-3ea3410d197a/go.mod h1:6ayFGfzzBE85csgQkM3gf4neFq6s0losHlPRSxY+nuk=
|
||||||
github.com/metacubex/sing-tun v0.4.2 h1:fwrQp3P536Pswu6gR1FJ+8GH55e+t2+B8LHIjwRtWbc=
|
github.com/metacubex/sing-shadowsocks v0.2.12 h1:Wqzo8bYXrK5aWqxu/TjlTnYZzAKtKsaFQBdr6IHFaBE=
|
||||||
github.com/metacubex/sing-tun v0.4.2/go.mod h1:V0N4rr0dWPBEE20ESkTXdbtx2riQYcb6YtwC5w/9wl0=
|
github.com/metacubex/sing-shadowsocks v0.2.12/go.mod h1:2e5EIaw0rxKrm1YTRmiMnDulwbGxH9hAFlrwQLQMQkU=
|
||||||
github.com/metacubex/sing-vmess v0.1.9-0.20240719134745-1df6fb20bbf9 h1:OAXiCosqY8xKDp3pqTW3qbrCprZ1l6WkrXSFSCwyY4I=
|
github.com/metacubex/sing-shadowsocks2 v0.2.7 h1:hSuuc0YpsfiqYqt1o+fP4m34BQz4e6wVj3PPBVhor3A=
|
||||||
github.com/metacubex/sing-vmess v0.1.9-0.20240719134745-1df6fb20bbf9/go.mod h1:olVkD4FChQ5gKMHG4ZzuD7+fMkJY1G8vwOKpRehjrmY=
|
github.com/metacubex/sing-shadowsocks2 v0.2.7/go.mod h1:vOEbfKC60txi0ca+yUlqEwOGc3Obl6cnSgx9Gf45KjE=
|
||||||
github.com/metacubex/sing-wireguard v0.0.0-20241126021510-0827d417b589 h1:Z6bNy0HLTjx6BKIkV48sV/yia/GP8Bnyb5JQuGgSGzg=
|
github.com/metacubex/sing-shadowtls v0.0.0-20250503063515-5d9f966d17a2 h1:gXU+MYPm7Wme3/OAY2FFzVq9d9GxPHOqu5AQfg/ddhI=
|
||||||
github.com/metacubex/sing-wireguard v0.0.0-20241126021510-0827d417b589/go.mod h1:4NclTLIZuk+QkHVCGrP87rHi/y8YjgPytxTgApJNMhc=
|
github.com/metacubex/sing-shadowtls v0.0.0-20250503063515-5d9f966d17a2/go.mod h1:mbfboaXauKJNIHJYxQRa+NJs4JU9NZfkA+I33dS2+9E=
|
||||||
github.com/metacubex/tfo-go v0.0.0-20241006021335-daedaf0ca7aa h1:9mcjV+RGZVC3reJBNDjjNPyS8PmFG97zq56X7WNaFO4=
|
github.com/metacubex/sing-tun v0.4.18 h1:WRzAosG0YkT3aZq5RJWtF+RdCgeJ8EpooS5ZM1lkXo0=
|
||||||
github.com/metacubex/tfo-go v0.0.0-20241006021335-daedaf0ca7aa/go.mod h1:4tLB5c8U0CxpkFM+AJJB77jEaVDbLH5XQvy42vAGsWw=
|
github.com/metacubex/sing-tun v0.4.18/go.mod h1:g4I/JNplDBhXLF+aQWgFbhNeJPSXQOWS9HvLeNvkgeA=
|
||||||
github.com/metacubex/utls v1.6.6 h1:3D12YKHTf2Z41UPhQU2dWerNWJ5TVQD9gKoQ+H+iLC8=
|
github.com/metacubex/sing-vmess v0.2.5 h1:m9Zt5I27lB9fmLMZfism9sH2LcnAfShZfwSkf6/KJoE=
|
||||||
github.com/metacubex/utls v1.6.6/go.mod h1:+WLFUnXjcpdxXCnyX25nggw8C6YonZ8zOK2Zm/oRvdo=
|
github.com/metacubex/sing-vmess v0.2.5/go.mod h1:AwtlzUgf8COe9tRYAKqWZ+leDH7p5U98a0ZUpYehl8Q=
|
||||||
github.com/metacubex/wireguard-go v0.0.0-20240922131502-c182e7471181 h1:hJLQviGySBuaynlCwf/oYgIxbVbGRUIKZCxdya9YrbQ=
|
github.com/metacubex/sing-wireguard v0.0.0-20260507084707-690d479ec947 h1:IB03BvRQtvjWScyOK5jSQVJYY8osmZXHL+4VCEFMWcM=
|
||||||
github.com/metacubex/wireguard-go v0.0.0-20240922131502-c182e7471181/go.mod h1:phewKljNYiTVT31Gcif8RiCKnTUOgVWFJjccqYM8s+Y=
|
github.com/metacubex/sing-wireguard v0.0.0-20260507084707-690d479ec947/go.mod h1:jpAkVLPnCpGSfNyVmj6Cq4YbuZsFepm/Dc+9BAOcR80=
|
||||||
github.com/miekg/dns v1.1.62 h1:cN8OuEF1/x5Rq6Np+h1epln8OiyPWV+lROx9LxcGgIQ=
|
github.com/metacubex/smux v0.0.0-20260105030934-d0c8756d3141 h1:DK2l6m2Fc85H2BhiAPgbJygiWhesPlfGmF+9Vw6ARdk=
|
||||||
github.com/miekg/dns v1.1.62/go.mod h1:mvDlcItzm+br7MToIKqkglaGhlFMHJ9DTNNWONWXbNQ=
|
github.com/metacubex/smux v0.0.0-20260105030934-d0c8756d3141/go.mod h1:/yI4OiGOSn0SURhZdJF3CbtPg3nwK700bG8TZLMBvAg=
|
||||||
|
github.com/metacubex/ssh v0.1.0 h1:iGfr99qk/eMHzUnQ/0bTxXT8+8SWqLSHBWDHoAhngzw=
|
||||||
|
github.com/metacubex/ssh v0.1.0/go.mod h1:NUtl0d+/f2cG9ECEpMM8iCVOpmggQlC13oLeDUONDlU=
|
||||||
|
github.com/metacubex/tfo-go v0.0.0-20251130171125-413e892ac443 h1:H6TnfM12tOoTizYE/qBHH3nEuibIelmHI+BVSxVJr8o=
|
||||||
|
github.com/metacubex/tfo-go v0.0.0-20251130171125-413e892ac443/go.mod h1:l9oLnLoEXyGZ5RVLsh7QCC5XsouTUyKk4F2nLm2DHLw=
|
||||||
|
github.com/metacubex/tls v0.1.5 h1:ECcB83dj+zadnhlKcLnUUf1Sq6+vU0f/zoyU0+9oPTc=
|
||||||
|
github.com/metacubex/tls v0.1.5/go.mod h1:0XeVdL0cBw+8i5Hqy3lVeP9IyD/LFTq02ExvHM6rzEM=
|
||||||
|
github.com/metacubex/utls v1.8.4 h1:HmL9nUApDdWSkgUyodfwF6hSjtiwCGGdyhaSpEejKpg=
|
||||||
|
github.com/metacubex/utls v1.8.4/go.mod h1:kncGGVhFaoGn5M3pFe3SXhZCzsbCJayNOH4UEqTKTko=
|
||||||
|
github.com/metacubex/wireguard-go v0.0.0-20250820062549-a6cecdd7f57f h1:FGBPRb1zUabhPhDrlKEjQ9lgIwQ6cHL4x8M9lrERhbk=
|
||||||
|
github.com/metacubex/wireguard-go v0.0.0-20250820062549-a6cecdd7f57f/go.mod h1:oPGcV994OGJedmmxrcK9+ni7jUEMGhR+uVQAdaduIP4=
|
||||||
|
github.com/metacubex/yamux v0.0.0-20250918083631-dd5f17c0be49 h1:lhlqpYHopuTLx9xQt22kSA9HtnyTDmk5XjjQVCGHe2E=
|
||||||
|
github.com/metacubex/yamux v0.0.0-20250918083631-dd5f17c0be49/go.mod h1:MBeEa9IVBphH7vc3LNtW6ZujVXFizotPo3OEiHQ+TNU=
|
||||||
|
github.com/miekg/dns v1.1.63 h1:8M5aAw6OMZfFXTT7K5V0Eu5YiiL8l7nUAkyN6C9YwaY=
|
||||||
|
github.com/miekg/dns v1.1.63/go.mod h1:6NGHfjhpmr5lt3XPLuyfDJi5AXbNIPM9PY6H6sF1Nfs=
|
||||||
github.com/mroth/weightedrand/v2 v2.1.0 h1:o1ascnB1CIVzsqlfArQQjeMy1U0NcIbBO5rfd5E/OeU=
|
github.com/mroth/weightedrand/v2 v2.1.0 h1:o1ascnB1CIVzsqlfArQQjeMy1U0NcIbBO5rfd5E/OeU=
|
||||||
github.com/mroth/weightedrand/v2 v2.1.0/go.mod h1:f2faGsfOGOwc1p94wzHKKZyTpcJUW7OJ/9U4yfiNAOU=
|
github.com/mroth/weightedrand/v2 v2.1.0/go.mod h1:f2faGsfOGOwc1p94wzHKKZyTpcJUW7OJ/9U4yfiNAOU=
|
||||||
github.com/oasisprotocol/deoxysii v0.0.0-20220228165953-2091330c22b7 h1:1102pQc2SEPp5+xrS26wEaeb26sZy6k9/ZXlZN+eXE4=
|
github.com/oasisprotocol/deoxysii v0.0.0-20220228165953-2091330c22b7 h1:1102pQc2SEPp5+xrS26wEaeb26sZy6k9/ZXlZN+eXE4=
|
||||||
github.com/oasisprotocol/deoxysii v0.0.0-20220228165953-2091330c22b7/go.mod h1:UqoUn6cHESlliMhOnKLWr+CBH+e3bazUPvFj1XZwAjs=
|
github.com/oasisprotocol/deoxysii v0.0.0-20220228165953-2091330c22b7/go.mod h1:UqoUn6cHESlliMhOnKLWr+CBH+e3bazUPvFj1XZwAjs=
|
||||||
github.com/onsi/ginkgo/v2 v2.9.5 h1:+6Hr4uxzP4XIUyAkg61dWBw8lb/gc4/X5luuxN/EC+Q=
|
|
||||||
github.com/onsi/ginkgo/v2 v2.9.5/go.mod h1:tvAoo1QUJwNEU2ITftXTpR7R1RbCzoZUOs3RonqW57k=
|
|
||||||
github.com/onsi/gomega v1.27.6 h1:ENqfyGeS5AX/rlXDd/ETokDz93u0YufY1Pgxuy/PvWE=
|
|
||||||
github.com/openacid/errors v0.8.1/go.mod h1:GUQEJJOJE3W9skHm8E8Y4phdl2LLEN8iD7c5gcGgdx0=
|
github.com/openacid/errors v0.8.1/go.mod h1:GUQEJJOJE3W9skHm8E8Y4phdl2LLEN8iD7c5gcGgdx0=
|
||||||
github.com/openacid/low v0.1.21 h1:Tr2GNu4N/+rGRYdOsEHOE89cxUIaDViZbVmKz29uKGo=
|
github.com/openacid/low v0.1.21 h1:Tr2GNu4N/+rGRYdOsEHOE89cxUIaDViZbVmKz29uKGo=
|
||||||
github.com/openacid/low v0.1.21/go.mod h1:q+MsKI6Pz2xsCkzV4BLj7NR5M4EX0sGz5AqotpZDVh0=
|
github.com/openacid/low v0.1.21/go.mod h1:q+MsKI6Pz2xsCkzV4BLj7NR5M4EX0sGz5AqotpZDVh0=
|
||||||
@@ -150,83 +168,48 @@ github.com/pierrec/lz4/v4 v4.1.14/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFu
|
|||||||
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw=
|
|
||||||
github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE=
|
|
||||||
github.com/puzpuzpuz/xsync/v3 v3.4.0 h1:DuVBAdXuGFHv8adVXjWWZ63pJq+NRXOWVXlKDBZ+mJ4=
|
|
||||||
github.com/puzpuzpuz/xsync/v3 v3.4.0/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA=
|
|
||||||
github.com/quic-go/qpack v0.4.0 h1:Cr9BXA1sQS2SmDUWjSofMPNKmvF6IiIfDRmgU0w1ZCo=
|
|
||||||
github.com/quic-go/qpack v0.4.0/go.mod h1:UZVnYIfi5GRk+zI9UMaCPsmZ2xKJP7XBUvVyT1Knj9A=
|
|
||||||
github.com/quic-go/qtls-go1-20 v0.4.1 h1:D33340mCNDAIKBqXuAvexTNMUByrYmFYVfKfDN5nfFs=
|
|
||||||
github.com/quic-go/qtls-go1-20 v0.4.1/go.mod h1:X9Nh97ZL80Z+bX/gUXMbipO6OxdiDi58b/fMC9mAL+k=
|
|
||||||
github.com/sagernet/cors v1.2.1 h1:Cv5Z8y9YSD6Gm+qSpNrL3LO4lD3eQVvbFYJSG7JCMHQ=
|
|
||||||
github.com/sagernet/cors v1.2.1/go.mod h1:O64VyOjjhrkLmQIjF4KGRrJO/5dVXFdpEmCW/eISRAI=
|
|
||||||
github.com/sagernet/fswatch v0.1.1 h1:YqID+93B7VRfqIH3PArW/XpJv5H4OLEVWDfProGoRQs=
|
|
||||||
github.com/sagernet/fswatch v0.1.1/go.mod h1:nz85laH0mkQqJfaOrqPpkwtU1znMFNVTpT/5oRsVz/o=
|
|
||||||
github.com/sagernet/netlink v0.0.0-20240612041022-b9a21c07ac6a h1:ObwtHN2VpqE0ZNjr6sGeT00J8uU7JF4cNUdb44/Duis=
|
github.com/sagernet/netlink v0.0.0-20240612041022-b9a21c07ac6a h1:ObwtHN2VpqE0ZNjr6sGeT00J8uU7JF4cNUdb44/Duis=
|
||||||
github.com/sagernet/netlink v0.0.0-20240612041022-b9a21c07ac6a/go.mod h1:xLnfdiJbSp8rNqYEdIW/6eDO4mVoogml14Bh2hSiFpM=
|
github.com/sagernet/netlink v0.0.0-20240612041022-b9a21c07ac6a/go.mod h1:xLnfdiJbSp8rNqYEdIW/6eDO4mVoogml14Bh2hSiFpM=
|
||||||
github.com/sagernet/nftables v0.3.0-beta.4 h1:kbULlAwAC3jvdGAC1P5Fa3GSxVwQJibNenDW2zaXr8I=
|
github.com/samber/lo v1.53.0 h1:t975lj2py4kJPQ6haz1QMgtId2gtmfktACxIXArw3HM=
|
||||||
github.com/sagernet/nftables v0.3.0-beta.4/go.mod h1:OQXAjvjNGGFxaTgVCSTRIhYB5/llyVDeapVoENYBDS8=
|
github.com/samber/lo v1.53.0/go.mod h1:4+MXEGsJzbKGaUEQFKBq2xtfuznW9oz/WrgyzMzRoM0=
|
||||||
github.com/sagernet/sing-mux v0.2.1 h1:N/3MHymfnFZRd29tE3TaXwPUVVgKvxhtOkiCMLp9HVo=
|
|
||||||
github.com/sagernet/sing-mux v0.2.1/go.mod h1:dm3BWL6NvES9pbib7llpylrq7Gq+LjlzG+0RacdxcyE=
|
|
||||||
github.com/sagernet/sing-shadowtls v0.1.5 h1:uXxmq/HXh8DIiBGLzpMjCbWnzIAFs+lIxiTOjdgG5qo=
|
|
||||||
github.com/sagernet/sing-shadowtls v0.1.5/go.mod h1:tvrDPTGLrSM46Wnf7mSr+L8NHvgvF8M4YnJF790rZX4=
|
|
||||||
github.com/sagernet/smux v0.0.0-20231208180855-7041f6ea79e7 h1:DImB4lELfQhplLTxeq2z31Fpv8CQqqrUwTbrIRumZqQ=
|
|
||||||
github.com/sagernet/smux v0.0.0-20231208180855-7041f6ea79e7/go.mod h1:FP9X2xjT/Az1EsG/orYYoC+5MojWnuI7hrffz8fGwwo=
|
|
||||||
github.com/samber/lo v1.47.0 h1:z7RynLwP5nbyRscyvcD043DWYoOcYRv3mV8lBeqOCLc=
|
|
||||||
github.com/samber/lo v1.47.0/go.mod h1:RmDH9Ct32Qy3gduHQuKJ3gW1fMHAnE/fAzQuf6He5cU=
|
|
||||||
github.com/shirou/gopsutil/v4 v4.24.11 h1:WaU9xqGFKvFfsUv94SXcUPD7rCkU0vr/asVdQOBZNj8=
|
|
||||||
github.com/shirou/gopsutil/v4 v4.24.11/go.mod h1:s4D/wg+ag4rG0WO7AiTj2BeYCRhym0vM7DHbZRxnIT8=
|
|
||||||
github.com/sina-ghaderi/poly1305 v0.0.0-20220724002748-c5926b03988b h1:rXHg9GrUEtWZhEkrykicdND3VPjlVbYiLdX9J7gimS8=
|
github.com/sina-ghaderi/poly1305 v0.0.0-20220724002748-c5926b03988b h1:rXHg9GrUEtWZhEkrykicdND3VPjlVbYiLdX9J7gimS8=
|
||||||
github.com/sina-ghaderi/poly1305 v0.0.0-20220724002748-c5926b03988b/go.mod h1:X7qrxNQViEaAN9LNZOPl9PfvQtp3V3c7LTo0dvGi0fM=
|
github.com/sina-ghaderi/poly1305 v0.0.0-20220724002748-c5926b03988b/go.mod h1:X7qrxNQViEaAN9LNZOPl9PfvQtp3V3c7LTo0dvGi0fM=
|
||||||
github.com/sina-ghaderi/rabaead v0.0.0-20220730151906-ab6e06b96e8c h1:DjKMC30y6yjG3IxDaeAj3PCoRr+IsO+bzyT+Se2m2Hk=
|
github.com/sina-ghaderi/rabaead v0.0.0-20220730151906-ab6e06b96e8c h1:DjKMC30y6yjG3IxDaeAj3PCoRr+IsO+bzyT+Se2m2Hk=
|
||||||
github.com/sina-ghaderi/rabaead v0.0.0-20220730151906-ab6e06b96e8c/go.mod h1:NV/a66PhhWYVmUMaotlXJ8fIEFB98u+c8l/CQIEFLrU=
|
github.com/sina-ghaderi/rabaead v0.0.0-20220730151906-ab6e06b96e8c/go.mod h1:NV/a66PhhWYVmUMaotlXJ8fIEFB98u+c8l/CQIEFLrU=
|
||||||
github.com/sina-ghaderi/rabbitio v0.0.0-20220730151941-9ce26f4f872e h1:ur8uMsPIFG3i4Gi093BQITvwH9znsz2VUZmnmwHvpIo=
|
github.com/sina-ghaderi/rabbitio v0.0.0-20220730151941-9ce26f4f872e h1:ur8uMsPIFG3i4Gi093BQITvwH9znsz2VUZmnmwHvpIo=
|
||||||
github.com/sina-ghaderi/rabbitio v0.0.0-20220730151941-9ce26f4f872e/go.mod h1:+e5fBW3bpPyo+3uLo513gIUblc03egGjMM0+5GKbzK8=
|
github.com/sina-ghaderi/rabbitio v0.0.0-20220730151941-9ce26f4f872e/go.mod h1:+e5fBW3bpPyo+3uLo513gIUblc03egGjMM0+5GKbzK8=
|
||||||
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
|
github.com/sirupsen/logrus v1.9.4 h1:TsZE7l11zFCLZnZ+teH4Umoq5BhEIfIzfRDZ1Uzql2w=
|
||||||
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
|
github.com/sirupsen/logrus v1.9.4/go.mod h1:ftWc9WdOfJ0a92nsE2jF5u5ZwH8Bv2zdeOC42RjbV2g=
|
||||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
|
|
||||||
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
|
|
||||||
github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
|
|
||||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||||
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||||
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||||
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
|
||||||
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
|
|
||||||
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
|
|
||||||
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
|
|
||||||
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
|
|
||||||
github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU=
|
|
||||||
github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI=
|
|
||||||
github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk=
|
|
||||||
github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY=
|
|
||||||
github.com/u-root/uio v0.0.0-20230220225925-ffce2a382923 h1:tHNk7XK9GkmKUR6Gh8gVBKXc2MVSZ4G/NnWLtzw4gNA=
|
github.com/u-root/uio v0.0.0-20230220225925-ffce2a382923 h1:tHNk7XK9GkmKUR6Gh8gVBKXc2MVSZ4G/NnWLtzw4gNA=
|
||||||
github.com/u-root/uio v0.0.0-20230220225925-ffce2a382923/go.mod h1:eLL9Nub3yfAho7qB0MzZizFhTU2QkLeoVsWdHtDW264=
|
github.com/u-root/uio v0.0.0-20230220225925-ffce2a382923/go.mod h1:eLL9Nub3yfAho7qB0MzZizFhTU2QkLeoVsWdHtDW264=
|
||||||
github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE=
|
github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE=
|
||||||
github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU=
|
github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU=
|
||||||
github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0=
|
github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0=
|
||||||
github.com/vishvananda/netns v0.0.4 h1:Oeaw1EM2JMxD51g9uhtC0D7erkIjgmj8+JZc26m1YX8=
|
github.com/vishvananda/netns v0.0.5 h1:DfiHV+j8bA32MFM7bfEunvT8IAqQ/NzSJHtcmW5zdEY=
|
||||||
github.com/vishvananda/netns v0.0.4/go.mod h1:SpkAiCQRtJ6TvvxPnOSyH3BMl6unz3xZlaprSwhNNJM=
|
github.com/vishvananda/netns v0.0.5/go.mod h1:SpkAiCQRtJ6TvvxPnOSyH3BMl6unz3xZlaprSwhNNJM=
|
||||||
github.com/vmihailenco/msgpack/v5 v5.4.1 h1:cQriyiUvjTwOHg8QZaPihLWeRAAVoCpE00IUPn0Bjt8=
|
github.com/vmihailenco/msgpack/v5 v5.4.1 h1:cQriyiUvjTwOHg8QZaPihLWeRAAVoCpE00IUPn0Bjt8=
|
||||||
github.com/vmihailenco/msgpack/v5 v5.4.1/go.mod h1:GaZTsDaehaPpQVyxrf5mtQlH+pc21PIudVV/E3rRQok=
|
github.com/vmihailenco/msgpack/v5 v5.4.1/go.mod h1:GaZTsDaehaPpQVyxrf5mtQlH+pc21PIudVV/E3rRQok=
|
||||||
github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g=
|
github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g=
|
||||||
github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds=
|
github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds=
|
||||||
github.com/wk8/go-ordered-map/v2 v2.1.8 h1:5h/BUHu93oj4gIdvHHHGsScSTMijfx5PeYkE/fJgbpc=
|
github.com/xtaci/lossyconn v0.0.0-20190602105132-8df528c0c9ae h1:J0GxkO96kL4WF+AIT3M4mfUVinOCPgf2uUWYFUzN0sM=
|
||||||
github.com/wk8/go-ordered-map/v2 v2.1.8/go.mod h1:5nJHM5DyteebpVlHnWMV0rPz6Zp7+xBAnxjb1X5vnTw=
|
github.com/yosida95/uritemplate/v3 v3.0.2 h1:Ed3Oyj9yrmi9087+NczuL5BwkIc4wvTb5zIM+UJPGz4=
|
||||||
github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0=
|
github.com/yosida95/uritemplate/v3 v3.0.2/go.mod h1:ILOh0sOhIJR3+L/8afwt/kE++YT040gmv5BQTMR2HP4=
|
||||||
github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
|
|
||||||
gitlab.com/go-extension/aes-ccm v0.0.0-20230221065045-e58665ef23c7 h1:UNrDfkQqiEYzdMlNsVvBYOAJWZjdktqFE9tQh5BT2+4=
|
gitlab.com/go-extension/aes-ccm v0.0.0-20230221065045-e58665ef23c7 h1:UNrDfkQqiEYzdMlNsVvBYOAJWZjdktqFE9tQh5BT2+4=
|
||||||
gitlab.com/go-extension/aes-ccm v0.0.0-20230221065045-e58665ef23c7/go.mod h1:E+rxHvJG9H6PUdzq9NRG6csuLN3XUx98BfGOVWNYnXs=
|
gitlab.com/go-extension/aes-ccm v0.0.0-20230221065045-e58665ef23c7/go.mod h1:E+rxHvJG9H6PUdzq9NRG6csuLN3XUx98BfGOVWNYnXs=
|
||||||
gitlab.com/yawning/bsaes.git v0.0.0-20190805113838-0a714cd429ec h1:FpfFs4EhNehiVfzQttTuxanPIT43FtkkCFypIod8LHo=
|
gitlab.com/yawning/bsaes.git v0.0.0-20190805113838-0a714cd429ec h1:FpfFs4EhNehiVfzQttTuxanPIT43FtkkCFypIod8LHo=
|
||||||
gitlab.com/yawning/bsaes.git v0.0.0-20190805113838-0a714cd429ec/go.mod h1:BZ1RAoRPbCxum9Grlv5aeksu2H8BiKehBYooU2LFiOQ=
|
gitlab.com/yawning/bsaes.git v0.0.0-20190805113838-0a714cd429ec/go.mod h1:BZ1RAoRPbCxum9Grlv5aeksu2H8BiKehBYooU2LFiOQ=
|
||||||
go.uber.org/mock v0.4.0 h1:VcM4ZOtdbR4f6VXfiOpwpVJDL6lCReaZ6mw31wqh7KU=
|
go.uber.org/mock v0.4.0 h1:VcM4ZOtdbR4f6VXfiOpwpVJDL6lCReaZ6mw31wqh7KU=
|
||||||
go.uber.org/mock v0.4.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc=
|
|
||||||
go4.org/netipx v0.0.0-20231129151722-fdeea329fbba h1:0b9z3AuHCjxk0x/opv64kcgZLBseWJUpBw5I82+2U4M=
|
go4.org/netipx v0.0.0-20231129151722-fdeea329fbba h1:0b9z3AuHCjxk0x/opv64kcgZLBseWJUpBw5I82+2U4M=
|
||||||
go4.org/netipx v0.0.0-20231129151722-fdeea329fbba/go.mod h1:PLyyIXexvUFg3Owu6p/WfdlivPbZJsZdgWZlrGope/Y=
|
go4.org/netipx v0.0.0-20231129151722-fdeea329fbba/go.mod h1:PLyyIXexvUFg3Owu6p/WfdlivPbZJsZdgWZlrGope/Y=
|
||||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U=
|
golang.org/x/crypto v0.33.0 h1:IOBPskki6Lysi0lo9qQvbxiQ+FvsCC/YWOecCHAixus=
|
||||||
golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk=
|
golang.org/x/crypto v0.33.0/go.mod h1:bVdXmD7IV/4GdElGPozy6U7lWdRXA4qyRVGJV57uQ5M=
|
||||||
golang.org/x/exp v0.0.0-20240904232852-e7e105dedf7e h1:I88y4caeGeuDQxgdoFPUq097j7kNfw6uvuiNxUBfcBk=
|
golang.org/x/exp v0.0.0-20240904232852-e7e105dedf7e h1:I88y4caeGeuDQxgdoFPUq097j7kNfw6uvuiNxUBfcBk=
|
||||||
golang.org/x/exp v0.0.0-20240904232852-e7e105dedf7e/go.mod h1:akd2r19cwCdwSwWeIdzYQGa/EZZyqcOdwWiwj5L5eKQ=
|
golang.org/x/exp v0.0.0-20240904232852-e7e105dedf7e/go.mod h1:akd2r19cwCdwSwWeIdzYQGa/EZZyqcOdwWiwj5L5eKQ=
|
||||||
golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
|
golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
|
||||||
@@ -235,45 +218,34 @@ golang.org/x/mod v0.20.0 h1:utOm6MM3R3dnawAiJgn0y+xvuYRsm1RKM/4giyfDgV0=
|
|||||||
golang.org/x/mod v0.20.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
|
golang.org/x/mod v0.20.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
|
||||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
golang.org/x/net v0.32.0 h1:ZqPmj8Kzc+Y6e0+skZsuACbx+wzMgo5MQsJh9Qd6aYI=
|
golang.org/x/net v0.35.0 h1:T5GQRQb2y08kTAByq9L4/bz8cipCdA8FbRTXewonqY8=
|
||||||
golang.org/x/net v0.32.0/go.mod h1:CwU0IoeOlnQQWJ6ioyFrfRuomB8GKF6KbYXZVyeXNfs=
|
golang.org/x/net v0.35.0/go.mod h1:EglIi67kWsHKlRzzVMUD93VMSWGFOMSZgxFjparz1Qk=
|
||||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ=
|
golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w=
|
||||||
golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
|
golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
|
||||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20190804053845-51ab0e2deafa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190804053845-51ab0e2deafa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20220622161953-175b2fd9d664/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20220622161953-175b2fd9d664/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
||||||
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc=
|
||||||
golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||||
golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
golang.org/x/term v0.29.0 h1:L6pJp37ocefwRRtYPKSWOWzOtWSxVajvz2ldH/xi3iU=
|
||||||
golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA=
|
|
||||||
golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
|
||||||
golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q=
|
|
||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
|
golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM=
|
||||||
golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
|
golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY=
|
||||||
golang.org/x/time v0.7.0 h1:ntUhktv3OPE6TgYxXWv9vKvUSJyIFJlyohwbkEwPrKQ=
|
golang.org/x/time v0.10.0 h1:3usCWA8tQn0L8+hFJQNgzpWbd89begxN66o1Ojdn5L4=
|
||||||
golang.org/x/time v0.7.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
|
golang.org/x/time v0.10.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
|
||||||
golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||||
golang.org/x/tools v0.24.0 h1:J1shsA93PJUEVaUSaay7UXAyE8aimq3GW0pjlolpa24=
|
golang.org/x/tools v0.24.0 h1:J1shsA93PJUEVaUSaay7UXAyE8aimq3GW0pjlolpa24=
|
||||||
golang.org/x/tools v0.24.0/go.mod h1:YhNqVBIfWHdzvTLs0d8LCuMhkKUgSUKldakyV7W/WDQ=
|
golang.org/x/tools v0.24.0/go.mod h1:YhNqVBIfWHdzvTLs0d8LCuMhkKUgSUKldakyV7W/WDQ=
|
||||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
|
||||||
google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=
|
|
||||||
google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=
|
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
lukechampine.com/blake3 v1.3.0 h1:sJ3XhFINmHSrYCgl958hscfIa3bw8x4DqMP3u1YvoYE=
|
|
||||||
lukechampine.com/blake3 v1.3.0/go.mod h1:0OFRp7fBtAylGVCO40o87sbupkyIGgbpv1+M1k1LM6k=
|
|
||||||
|
|||||||
@@ -6,10 +6,9 @@ import (
|
|||||||
"runtime"
|
"runtime"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"gopkg.in/yaml.v3"
|
|
||||||
|
|
||||||
"cfa/native/app"
|
"cfa/native/app"
|
||||||
|
|
||||||
|
"github.com/metacubex/mihomo/common/yaml"
|
||||||
"github.com/metacubex/mihomo/config"
|
"github.com/metacubex/mihomo/config"
|
||||||
"github.com/metacubex/mihomo/hub"
|
"github.com/metacubex/mihomo/hub"
|
||||||
"github.com/metacubex/mihomo/log"
|
"github.com/metacubex/mihomo/log"
|
||||||
|
|||||||
@@ -67,15 +67,12 @@ func patchProfile(cfg *config.RawConfig, _ string) error {
|
|||||||
|
|
||||||
func patchDns(cfg *config.RawConfig, _ string) error {
|
func patchDns(cfg *config.RawConfig, _ string) error {
|
||||||
if !cfg.DNS.Enable {
|
if !cfg.DNS.Enable {
|
||||||
cfg.DNS = config.RawDNS{
|
cfg.DNS = config.DefaultRawConfig().DNS
|
||||||
Enable: true,
|
cfg.DNS.Enable = true
|
||||||
UseHosts: true,
|
cfg.DNS.NameServer = defaultNameServers
|
||||||
DefaultNameserver: defaultNameServers,
|
cfg.DNS.EnhancedMode = C.DNSFakeIP
|
||||||
NameServer: defaultNameServers,
|
cfg.DNS.FakeIPRange = defaultFakeIPRange
|
||||||
EnhancedMode: C.DNSFakeIP,
|
cfg.DNS.FakeIPFilter = defaultFakeIPFilter
|
||||||
FakeIPRange: defaultFakeIPRange,
|
|
||||||
FakeIPFilter: defaultFakeIPFilter,
|
|
||||||
}
|
|
||||||
|
|
||||||
cfg.ClashForAndroid.AppendSystemDNS = true
|
cfg.ClashForAndroid.AppendSystemDNS = true
|
||||||
}
|
}
|
||||||
@@ -117,7 +114,7 @@ func patchProviders(cfg *config.RawConfig, profileDir string) error {
|
|||||||
} else if url, ok := provider["url"].(string); ok {
|
} else if url, ok := provider["url"].(string); ok {
|
||||||
path = prefix + "/" + utils.MakeHash([]byte(url)).String() // same as C.GetPathByHash
|
path = prefix + "/" + utils.MakeHash([]byte(url)).String() // same as C.GetPathByHash
|
||||||
} else {
|
} else {
|
||||||
return // both path and url is empty, WTF???
|
return // both path and url are empty, maybe inline provider
|
||||||
}
|
}
|
||||||
provider["path"] = profileDir + "/providers/" + path
|
provider["path"] = profileDir + "/providers/" + path
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -68,8 +68,11 @@ func QueryProxyGroupNames(excludeNotSelectable bool) []string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for _, p := range proxies {
|
for _, p := range proxies {
|
||||||
if _, ok := p.Adapter().(outboundgroup.ProxyGroup); ok {
|
if g, ok := p.Adapter().(outboundgroup.ProxyGroup); ok {
|
||||||
if !excludeNotSelectable || p.Type() == C.Selector {
|
if !excludeNotSelectable || p.Type() == C.Selector {
|
||||||
|
if g.Hidden() {
|
||||||
|
continue
|
||||||
|
}
|
||||||
result = append(result, p.Name())
|
result = append(result, p.Name())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ object Clash {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun notifyDnsChanged(dns: List<String>) {
|
fun notifyDnsChanged(dns: List<String>) {
|
||||||
Bridge.nativeNotifyDnsChanged(dns.joinToString(separator = ","))
|
Bridge.nativeNotifyDnsChanged(dns.toSet().joinToString(separator = ","))
|
||||||
}
|
}
|
||||||
|
|
||||||
fun notifyTimeZoneChanged(name: String, offset: Int) {
|
fun notifyTimeZoneChanged(name: String, offset: Int) {
|
||||||
|
|||||||
@@ -61,7 +61,7 @@ object Bridge {
|
|||||||
.detachFd()
|
.detachFd()
|
||||||
|
|
||||||
val home = ctx.filesDir.resolve("clash").apply { mkdirs() }.absolutePath
|
val home = ctx.filesDir.resolve("clash").apply { mkdirs() }.absolutePath
|
||||||
val versionName = ctx.packageManager.getPackageInfo(ctx.packageName, 0).versionName
|
val versionName = ctx.packageManager.getPackageInfo(ctx.packageName, 0).versionName ?: "unknown"
|
||||||
val sdkVersion = Build.VERSION.SDK_INT
|
val sdkVersion = Build.VERSION.SDK_INT
|
||||||
|
|
||||||
Log.d("Home = $home")
|
Log.d("Home = $home")
|
||||||
|
|||||||
@@ -179,8 +179,8 @@ data class ConfigurationOverride(
|
|||||||
@SerialName("enable")
|
@SerialName("enable")
|
||||||
var enable: Boolean? = null,
|
var enable: Boolean? = null,
|
||||||
|
|
||||||
@SerialName("sniffing")
|
@SerialName("sniff")
|
||||||
var sniffing: List<String>? = null,
|
var sniff: Sniff = Sniff(),
|
||||||
|
|
||||||
@SerialName("force-dns-mapping")
|
@SerialName("force-dns-mapping")
|
||||||
var forceDnsMapping: Boolean? = null,
|
var forceDnsMapping: Boolean? = null,
|
||||||
@@ -197,8 +197,11 @@ data class ConfigurationOverride(
|
|||||||
@SerialName("skip-domain")
|
@SerialName("skip-domain")
|
||||||
var skipDomain: List<String>? = null,
|
var skipDomain: List<String>? = null,
|
||||||
|
|
||||||
@SerialName("port-whitelist")
|
@SerialName("skip-src-address")
|
||||||
var portWhitelist: List<String>? = null,
|
var skipSrcAddress: List<String>? = null,
|
||||||
|
|
||||||
|
@SerialName("skip-dst-address")
|
||||||
|
var skipDstAddress: List<String>? = null,
|
||||||
)
|
)
|
||||||
|
|
||||||
@Serializable
|
@Serializable
|
||||||
@@ -222,6 +225,27 @@ data class ConfigurationOverride(
|
|||||||
var allowPrivateNetwork: Boolean? = null,
|
var allowPrivateNetwork: Boolean? = null,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@Serializable
|
||||||
|
data class Sniff(
|
||||||
|
@SerialName("HTTP")
|
||||||
|
var http: ProtocolConig = ProtocolConig(),
|
||||||
|
|
||||||
|
@SerialName("TLS")
|
||||||
|
var tls: ProtocolConig = ProtocolConig(),
|
||||||
|
|
||||||
|
@SerialName("QUIC")
|
||||||
|
var quic: ProtocolConig = ProtocolConig(),
|
||||||
|
)
|
||||||
|
|
||||||
|
@Serializable
|
||||||
|
data class ProtocolConig(
|
||||||
|
@SerialName("ports")
|
||||||
|
var ports: List<String>? = null,
|
||||||
|
|
||||||
|
@SerialName("override-destination")
|
||||||
|
var overrideDestination: Boolean? = null,
|
||||||
|
)
|
||||||
|
|
||||||
override fun writeToParcel(parcel: Parcel, flags: Int) {
|
override fun writeToParcel(parcel: Parcel, flags: Int) {
|
||||||
Parcelizer.encodeToParcel(serializer(), parcel, this)
|
Parcelizer.encodeToParcel(serializer(), parcel, this)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ data class Provider(
|
|||||||
}
|
}
|
||||||
|
|
||||||
enum class VehicleType {
|
enum class VehicleType {
|
||||||
HTTP, File, Compatible
|
HTTP, File, Inline, Compatible
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun writeToParcel(parcel: Parcel, flags: Int) {
|
override fun writeToParcel(parcel: Parcel, flags: Int) {
|
||||||
|
|||||||
@@ -36,6 +36,10 @@ data class Proxy(
|
|||||||
Dns(false),
|
Dns(false),
|
||||||
Ssh(false),
|
Ssh(false),
|
||||||
Mieru(false),
|
Mieru(false),
|
||||||
|
AnyTLS(false),
|
||||||
|
Sudoku(false),
|
||||||
|
Masque(false),
|
||||||
|
TrustTunnel(false),
|
||||||
|
|
||||||
|
|
||||||
Relay(true),
|
Relay(true),
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
<manifest package="com.github.kr328.clash.design" />
|
<manifest />
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ class AppSettingsDesign(
|
|||||||
srvStore: ServiceStore,
|
srvStore: ServiceStore,
|
||||||
behavior: Behavior,
|
behavior: Behavior,
|
||||||
running: Boolean,
|
running: Boolean,
|
||||||
|
onHideIconChange: (hide: Boolean) -> Unit,
|
||||||
) : Design<AppSettingsDesign.Request>(context) {
|
) : Design<AppSettingsDesign.Request>(context) {
|
||||||
enum class Request {
|
enum class Request {
|
||||||
ReCreateAllActivities
|
ReCreateAllActivities
|
||||||
@@ -65,6 +66,28 @@ class AppSettingsDesign(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
switch(
|
||||||
|
value = uiStore::hideAppIcon,
|
||||||
|
icon = R.drawable.ic_baseline_hide,
|
||||||
|
title = R.string.hide_app_icon_title,
|
||||||
|
summary = R.string.hide_app_icon_desc,
|
||||||
|
) {
|
||||||
|
listener = OnChangedListener {
|
||||||
|
onHideIconChange(uiStore::hideAppIcon.get())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
switch(
|
||||||
|
value = uiStore::hideFromRecents,
|
||||||
|
icon = R.drawable.ic_baseline_stack,
|
||||||
|
title = R.string.hide_from_recents_title,
|
||||||
|
summary = R.string.hide_from_recents_desc,
|
||||||
|
) {
|
||||||
|
listener = OnChangedListener {
|
||||||
|
requests.trySend(Request.ReCreateAllActivities)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
category(R.string.service)
|
category(R.string.service)
|
||||||
|
|
||||||
switch(
|
switch(
|
||||||
|
|||||||
@@ -81,7 +81,7 @@ class MainDesign(context: Context) : Design<MainDesign.Request>(context) {
|
|||||||
init {
|
init {
|
||||||
binding.self = this
|
binding.self = this
|
||||||
|
|
||||||
binding.colorClashStarted = context.resolveThemedColor(R.attr.colorPrimary)
|
binding.colorClashStarted = context.resolveThemedColor(com.google.android.material.R.attr.colorPrimary)
|
||||||
binding.colorClashStopped = context.resolveThemedColor(R.attr.colorClashStopped)
|
binding.colorClashStopped = context.resolveThemedColor(R.attr.colorClashStopped)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -137,13 +137,53 @@ class MetaFeatureSettingsDesign(
|
|||||||
}
|
}
|
||||||
|
|
||||||
editableTextList(
|
editableTextList(
|
||||||
value = configuration.sniffer::sniffing,
|
value = configuration.sniffer.sniff.http::ports,
|
||||||
adapter = TextAdapter.String,
|
adapter = TextAdapter.String,
|
||||||
title = R.string.sniffing,
|
title = R.string.sniff_http_ports,
|
||||||
placeholder = R.string.dont_modify,
|
placeholder = R.string.dont_modify,
|
||||||
configure = snifferDependencies::add,
|
configure = snifferDependencies::add,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
selectableList(
|
||||||
|
value = configuration.sniffer.sniff.http::overrideDestination,
|
||||||
|
values = booleanValues,
|
||||||
|
valuesText = booleanValuesText,
|
||||||
|
title = R.string.sniff_http_override_destination,
|
||||||
|
configure = snifferDependencies::add,
|
||||||
|
)
|
||||||
|
|
||||||
|
editableTextList(
|
||||||
|
value = configuration.sniffer.sniff.tls::ports,
|
||||||
|
adapter = TextAdapter.String,
|
||||||
|
title = R.string.sniff_tls_ports,
|
||||||
|
placeholder = R.string.dont_modify,
|
||||||
|
configure = snifferDependencies::add,
|
||||||
|
)
|
||||||
|
|
||||||
|
selectableList(
|
||||||
|
value = configuration.sniffer.sniff.tls::overrideDestination,
|
||||||
|
values = booleanValues,
|
||||||
|
valuesText = booleanValuesText,
|
||||||
|
title = R.string.sniff_tls_override_destination,
|
||||||
|
configure = snifferDependencies::add,
|
||||||
|
)
|
||||||
|
|
||||||
|
editableTextList(
|
||||||
|
value = configuration.sniffer.sniff.quic::ports,
|
||||||
|
adapter = TextAdapter.String,
|
||||||
|
title = R.string.sniff_quic_ports,
|
||||||
|
placeholder = R.string.dont_modify,
|
||||||
|
configure = snifferDependencies::add,
|
||||||
|
)
|
||||||
|
|
||||||
|
selectableList(
|
||||||
|
value = configuration.sniffer.sniff.quic::overrideDestination,
|
||||||
|
values = booleanValues,
|
||||||
|
valuesText = booleanValuesText,
|
||||||
|
title = R.string.sniff_quic_override_destination,
|
||||||
|
configure = snifferDependencies::add,
|
||||||
|
)
|
||||||
|
|
||||||
selectableList(
|
selectableList(
|
||||||
value = configuration.sniffer::forceDnsMapping,
|
value = configuration.sniffer::forceDnsMapping,
|
||||||
values = booleanValues,
|
values = booleanValues,
|
||||||
@@ -185,9 +225,17 @@ class MetaFeatureSettingsDesign(
|
|||||||
)
|
)
|
||||||
|
|
||||||
editableTextList(
|
editableTextList(
|
||||||
value = configuration.sniffer::portWhitelist,
|
value = configuration.sniffer::skipSrcAddress,
|
||||||
adapter = TextAdapter.String,
|
adapter = TextAdapter.String,
|
||||||
title = R.string.port_whitelist,
|
title = R.string.skip_src_address,
|
||||||
|
placeholder = R.string.dont_modify,
|
||||||
|
configure = snifferDependencies::add,
|
||||||
|
)
|
||||||
|
|
||||||
|
editableTextList(
|
||||||
|
value = configuration.sniffer::skipDstAddress,
|
||||||
|
adapter = TextAdapter.String,
|
||||||
|
title = R.string.skip_dst_address,
|
||||||
placeholder = R.string.dont_modify,
|
placeholder = R.string.dont_modify,
|
||||||
configure = snifferDependencies::add,
|
configure = snifferDependencies::add,
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -128,8 +128,6 @@ class NetworkSettingsDesign(
|
|||||||
clicked {
|
clicked {
|
||||||
requests.trySend(Request.StartAccessControlList)
|
requests.trySend(Request.StartAccessControlList)
|
||||||
}
|
}
|
||||||
|
|
||||||
vpnDependencies.add(this)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (running) {
|
if (running) {
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ class NewProfileDesign(context: Context) : Design<NewProfileDesign.Request>(cont
|
|||||||
sealed class Request {
|
sealed class Request {
|
||||||
data class Create(val provider: ProfileProvider) : Request()
|
data class Create(val provider: ProfileProvider) : Request()
|
||||||
data class OpenDetail(val provider: ProfileProvider.External) : Request()
|
data class OpenDetail(val provider: ProfileProvider.External) : Request()
|
||||||
|
data class LaunchScanner(val provider: ProfileProvider.QR) : Request()
|
||||||
}
|
}
|
||||||
|
|
||||||
private val binding = DesignNewProfileBinding
|
private val binding = DesignNewProfileBinding
|
||||||
@@ -38,7 +39,12 @@ class NewProfileDesign(context: Context) : Design<NewProfileDesign.Request>(cont
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun requestCreate(provider: ProfileProvider) {
|
private fun requestCreate(provider: ProfileProvider) {
|
||||||
requests.trySend(Request.Create(provider))
|
if (provider is ProfileProvider.QR) {
|
||||||
|
requests.trySend(Request.LaunchScanner(provider))
|
||||||
|
} else {
|
||||||
|
requests.trySend(Request.Create(provider))
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun requestDetail(provider: ProfileProvider): Boolean {
|
private fun requestDetail(provider: ProfileProvider): Boolean {
|
||||||
|
|||||||
@@ -55,8 +55,9 @@ class ProvidersDesign(
|
|||||||
fun requestUpdateAll() {
|
fun requestUpdateAll() {
|
||||||
adapter.states.filter { !it.updating }.forEachIndexed { index, state ->
|
adapter.states.filter { !it.updating }.forEachIndexed { index, state ->
|
||||||
state.updating = true
|
state.updating = true
|
||||||
|
if (state.provider.vehicleType != Provider.VehicleType.Inline) {
|
||||||
requests.trySend(Request.Update(index, state.provider))
|
requests.trySend(Request.Update(index, state.provider))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -108,7 +108,7 @@ class ProxyDesign(
|
|||||||
binding.urlTestFloatView.visibility = View.GONE
|
binding.urlTestFloatView.visibility = View.GONE
|
||||||
} else {
|
} else {
|
||||||
binding.urlTestFloatView.supportImageTintList = ColorStateList.valueOf(
|
binding.urlTestFloatView.supportImageTintList = ColorStateList.valueOf(
|
||||||
context.resolveThemedColor(R.attr.colorOnPrimary)
|
context.resolveThemedColor(com.google.android.material.R.attr.colorOnPrimary)
|
||||||
)
|
)
|
||||||
|
|
||||||
binding.pagesView.apply {
|
binding.pagesView.apply {
|
||||||
|
|||||||
@@ -15,9 +15,9 @@ class PopupListAdapter(
|
|||||||
private val texts: List<CharSequence>,
|
private val texts: List<CharSequence>,
|
||||||
private val selected: Int,
|
private val selected: Int,
|
||||||
) : BaseAdapter() {
|
) : BaseAdapter() {
|
||||||
private val colorPrimary = context.resolveThemedColor(R.attr.colorPrimary)
|
private val colorPrimary = context.resolveThemedColor(com.google.android.material.R.attr.colorPrimary)
|
||||||
private val colorOnPrimary = context.resolveThemedColor(R.attr.colorOnPrimary)
|
private val colorOnPrimary = context.resolveThemedColor(com.google.android.material.R.attr.colorOnPrimary)
|
||||||
private val colorControlNormal = context.resolveThemedColor(R.attr.colorControlNormal)
|
private val colorControlNormal = context.resolveThemedColor(com.google.android.material.R.attr.colorControlNormal)
|
||||||
|
|
||||||
override fun getCount(): Int {
|
override fun getCount(): Int {
|
||||||
return texts.size
|
return texts.size
|
||||||
|
|||||||
@@ -55,10 +55,17 @@ class ProviderAdapter(
|
|||||||
|
|
||||||
holder.binding.provider = state.provider
|
holder.binding.provider = state.provider
|
||||||
holder.binding.state = state
|
holder.binding.state = state
|
||||||
holder.binding.update = View.OnClickListener {
|
if (state.provider.vehicleType == Provider.VehicleType.Inline) {
|
||||||
state.updating = true
|
holder.binding.endView.visibility = View.GONE
|
||||||
|
holder.binding.elapsedView.visibility = View.GONE
|
||||||
requestUpdate(position, state.provider)
|
holder.binding.divider.visibility = View.GONE
|
||||||
|
} else {
|
||||||
|
holder.binding.endView.visibility = View.VISIBLE
|
||||||
|
holder.binding.elapsedView.visibility = View.VISIBLE
|
||||||
|
holder.binding.update = View.OnClickListener {
|
||||||
|
state.updating = true
|
||||||
|
requestUpdate(position, state.provider)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -8,15 +8,15 @@ import com.github.kr328.clash.design.util.resolveThemedColor
|
|||||||
import com.github.kr328.clash.design.util.resolveThemedResourceId
|
import com.github.kr328.clash.design.util.resolveThemedResourceId
|
||||||
|
|
||||||
class ProxyViewConfig(val context: Context, var proxyLine: Int) {
|
class ProxyViewConfig(val context: Context, var proxyLine: Int) {
|
||||||
private val colorSurface = context.resolveThemedColor(R.attr.colorSurface)
|
private val colorSurface = context.resolveThemedColor(com.google.android.material.R.attr.colorSurface)
|
||||||
|
|
||||||
val clickableBackground =
|
val clickableBackground =
|
||||||
context.resolveThemedResourceId(android.R.attr.selectableItemBackground)
|
context.resolveThemedResourceId(android.R.attr.selectableItemBackground)
|
||||||
|
|
||||||
val selectedControl = context.resolveThemedColor(R.attr.colorOnPrimary)
|
val selectedControl = context.resolveThemedColor(com.google.android.material.R.attr.colorOnPrimary)
|
||||||
val selectedBackground = context.resolveThemedColor(R.attr.colorPrimary)
|
val selectedBackground = context.resolveThemedColor(com.google.android.material.R.attr.colorPrimary)
|
||||||
|
|
||||||
val unselectedControl = context.resolveThemedColor(R.attr.colorOnSurface)
|
val unselectedControl = context.resolveThemedColor(com.google.android.material.R.attr.colorOnSurface)
|
||||||
val unselectedBackground: Int
|
val unselectedBackground: Int
|
||||||
get() = if (proxyLine==1) Color.TRANSPARENT else colorSurface
|
get() = if (proxyLine==1) Color.TRANSPARENT else colorSurface
|
||||||
|
|
||||||
|
|||||||
@@ -14,6 +14,8 @@ sealed class ProfileProvider {
|
|||||||
get() = context.getString(R.string.import_from_file)
|
get() = context.getString(R.string.import_from_file)
|
||||||
override val icon: Drawable?
|
override val icon: Drawable?
|
||||||
get() = context.getDrawableCompat(R.drawable.ic_baseline_attach_file)
|
get() = context.getDrawableCompat(R.drawable.ic_baseline_attach_file)
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class Url(private val context: Context) : ProfileProvider() {
|
class Url(private val context: Context) : ProfileProvider() {
|
||||||
@@ -25,6 +27,14 @@ sealed class ProfileProvider {
|
|||||||
get() = context.getDrawableCompat(R.drawable.ic_baseline_cloud_download)
|
get() = context.getDrawableCompat(R.drawable.ic_baseline_cloud_download)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class QR(private val context: Context) : ProfileProvider() {
|
||||||
|
override val name: String
|
||||||
|
get() = context.getString(R.string.qr)
|
||||||
|
override val summary: String
|
||||||
|
get() = context.getString(R.string.import_from_qr)
|
||||||
|
override val icon: Drawable?
|
||||||
|
get() = context.getDrawableCompat(R.drawable.baseline_qr_code_scanner)
|
||||||
|
}
|
||||||
class External(
|
class External(
|
||||||
override val name: String,
|
override val name: String,
|
||||||
override val summary: String,
|
override val summary: String,
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
package com.github.kr328.clash.design.store
|
package com.github.kr328.clash.design.store
|
||||||
|
|
||||||
|
import android.content.ComponentName
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
|
import android.content.pm.PackageManager
|
||||||
import com.github.kr328.clash.common.store.Store
|
import com.github.kr328.clash.common.store.Store
|
||||||
import com.github.kr328.clash.common.store.asStoreProvider
|
import com.github.kr328.clash.common.store.asStoreProvider
|
||||||
import com.github.kr328.clash.core.model.ProxySort
|
import com.github.kr328.clash.core.model.ProxySort
|
||||||
@@ -25,6 +27,20 @@ class UiStore(context: Context) {
|
|||||||
values = DarkMode.values()
|
values = DarkMode.values()
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var hideAppIcon: Boolean by store.boolean(
|
||||||
|
key = "hide_app_icon",
|
||||||
|
defaultValue = context.packageManager.getComponentEnabledSetting(context.mainActivityAlias)
|
||||||
|
.let { state ->
|
||||||
|
state != PackageManager.COMPONENT_ENABLED_STATE_ENABLED &&
|
||||||
|
state != PackageManager.COMPONENT_ENABLED_STATE_DEFAULT
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
var hideFromRecents: Boolean by store.boolean(
|
||||||
|
key = "hide_from_recents",
|
||||||
|
defaultValue = false,
|
||||||
|
)
|
||||||
|
|
||||||
var proxyExcludeNotSelectable by store.boolean(
|
var proxyExcludeNotSelectable by store.boolean(
|
||||||
key = "proxy_exclude_not_selectable",
|
key = "proxy_exclude_not_selectable",
|
||||||
defaultValue = false,
|
defaultValue = false,
|
||||||
@@ -64,5 +80,8 @@ class UiStore(context: Context) {
|
|||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
private const val PREFERENCE_NAME = "ui"
|
private const val PREFERENCE_NAME = "ui"
|
||||||
|
|
||||||
|
val Context.mainActivityAlias: ComponentName
|
||||||
|
get() = ComponentName(this, "com.github.kr328.clash.MainActivityAlias")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -8,8 +8,8 @@ import com.github.kr328.clash.design.model.AppInfo
|
|||||||
fun PackageInfo.toAppInfo(pm: PackageManager): AppInfo {
|
fun PackageInfo.toAppInfo(pm: PackageManager): AppInfo {
|
||||||
return AppInfo(
|
return AppInfo(
|
||||||
packageName = packageName,
|
packageName = packageName,
|
||||||
icon = applicationInfo.loadIcon(pm).foreground(),
|
icon = applicationInfo!!.loadIcon(pm).foreground(),
|
||||||
label = applicationInfo.loadLabel(pm).toString(),
|
label = applicationInfo!!.loadLabel(pm).toString(),
|
||||||
installTime = firstInstallTime,
|
installTime = firstInstallTime,
|
||||||
updateDate = lastUpdateTime,
|
updateDate = lastUpdateTime,
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ fun Provider.type(context: Context): String {
|
|||||||
val vehicle = when (vehicleType) {
|
val vehicle = when (vehicleType) {
|
||||||
Provider.VehicleType.HTTP -> context.getString(R.string.http)
|
Provider.VehicleType.HTTP -> context.getString(R.string.http)
|
||||||
Provider.VehicleType.File -> context.getString(R.string.file)
|
Provider.VehicleType.File -> context.getString(R.string.file)
|
||||||
|
Provider.VehicleType.Inline -> context.getString(R.string.inline)
|
||||||
Provider.VehicleType.Compatible -> context.getString(R.string.compatible)
|
Provider.VehicleType.Compatible -> context.getString(R.string.compatible)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ fun View.setOnInsertsChangedListener(adaptLandscape: Boolean = true, listener: (
|
|||||||
|
|
||||||
listener(if (adaptLandscape) rInsets.landscape(v.context) else rInsets)
|
listener(if (adaptLandscape) rInsets.landscape(v.context) else rInsets)
|
||||||
|
|
||||||
compat.toWindowInsets()
|
compat.toWindowInsets()!!
|
||||||
}
|
}
|
||||||
|
|
||||||
requestApplyInsets()
|
requestApplyInsets()
|
||||||
|
|||||||
@@ -14,12 +14,4 @@ class AppRecyclerView @JvmOverloads constructor(
|
|||||||
init {
|
init {
|
||||||
isFocusable = false
|
isFocusable = false
|
||||||
}
|
}
|
||||||
|
}
|
||||||
override fun onDraw(c: Canvas?) {
|
|
||||||
super.onDraw(c)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun dispatchDraw(canvas: Canvas?) {
|
|
||||||
super.dispatchDraw(canvas)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -60,6 +60,6 @@ class LargeActionCard @JvmOverloads constructor(
|
|||||||
minimumHeight = context.getPixels(R.dimen.large_action_card_min_height)
|
minimumHeight = context.getPixels(R.dimen.large_action_card_min_height)
|
||||||
radius = context.getPixels(R.dimen.large_action_card_radius).toFloat()
|
radius = context.getPixels(R.dimen.large_action_card_radius).toFloat()
|
||||||
elevation = context.getPixels(R.dimen.large_action_card_elevation).toFloat()
|
elevation = context.getPixels(R.dimen.large_action_card_elevation).toFloat()
|
||||||
setCardBackgroundColor(context.resolveThemedColor(R.attr.colorSurface))
|
setCardBackgroundColor(context.resolveThemedColor(com.google.android.material.R.attr.colorSurface))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:tint="?attr/colorControlNormal"
|
||||||
|
android:viewportWidth="24"
|
||||||
|
android:viewportHeight="24">
|
||||||
|
<path android:fillColor="@android:color/white" android:pathData="M9.5,6.5v3h-3v-3H9.5M11,5H5v6h6V5L11,5zM9.5,14.5v3h-3v-3H9.5M11,13H5v6h6V13L11,13zM17.5,6.5v3h-3v-3H17.5M19,5h-6v6h6V5L19,5zM13,13h1.5v1.5H13V13zM14.5,14.5H16V16h-1.5V14.5zM16,13h1.5v1.5H16V13zM13,16h1.5v1.5H13V16zM14.5,17.5H16V19h-1.5V17.5zM16,16h1.5v1.5H16V16zM17.5,14.5H19V16h-1.5V14.5zM17.5,17.5H19V19h-1.5V17.5zM22,7h-2V4h-3V2h5V7zM22,22v-5h-2v3h-3v2H22zM2,22h5v-2H4v-3H2V22zM2,2v5h2V4h3V2H2z"/>
|
||||||
|
|
||||||
|
</vector>
|
||||||
12
design/src/main/res/drawable/ic_baseline_hide.xml
Normal file
12
design/src/main/res/drawable/ic_baseline_hide.xml
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:tint="?attr/colorControlNormal"
|
||||||
|
android:viewportWidth="1024"
|
||||||
|
android:viewportHeight="1024">
|
||||||
|
|
||||||
|
<path
|
||||||
|
android:fillColor="@android:color/white"
|
||||||
|
android:pathData="M825.9,134.2l51.7,51.7 -655.1,655.1 -51.7,-51.7 655.1,-655.1zM804.4,325.8c41.3,39.5 81.3,87.9 120,145.3a73.1,73.1 0,0 1,2.8 77.4l-2.8,4.4 -6.9,10.1C795.2,740.3 660,829 512,829c-58.4,0 -114.9,-13.8 -169.3,-41.4l55.1,-55.1c37.4,15.7 75.5,23.4 114.2,23.4 120.9,0 235.5,-75.1 345.1,-234l6.7,-9.8 -6.7,-9.8c-34.3,-49.7 -69,-91.2 -104.4,-124.7l51.7,-51.7zM512,195c51.4,0 101.3,10.7 149.7,32.1l-56.5,56.5A289.4,289.4 0,0 0,512 268.2c-120.9,0 -235.5,75.1 -345.1,234L160.2,512l6.7,9.8c29.5,42.8 59.4,79.5 89.7,110.3l-51.7,51.7c-36.1,-36.7 -71.3,-80.3 -105.4,-130.9a73.1,73.1 0,0 1,-2.8 -77.4l2.8,-4.4 6.9,-10.1C228.8,283.7 364,195 512,195zM664.8,465.4a161.7,161.7 0,0 1,-205.8 205.8l65.1,-65.1a88.6,88.6 0,0 0,75.6 -75.6l65.1,-65.1zM512,356.7c6.4,0 12.8,0.4 19,1.1l-179.5,179.6A161.7,161.7 0,0 1,512 356.7z" />
|
||||||
|
|
||||||
|
</vector>
|
||||||
10
design/src/main/res/drawable/ic_baseline_stack.xml
Normal file
10
design/src/main/res/drawable/ic_baseline_stack.xml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:tint="?attr/colorControlNormal"
|
||||||
|
android:viewportWidth="1024"
|
||||||
|
android:viewportHeight="1024">
|
||||||
|
<path
|
||||||
|
android:fillColor="@android:color/white"
|
||||||
|
android:pathData="M1024,320 L512,64 0,320l512,256L1024,320zM512,149 L854,320 512,491 170,320 512,149zM921.4,460.7 L1024,512 512,768 0,512 102.6,460.7 512,665.4ZM921.4,652.7 L1024,704 512,960 0,704 102.6,652.7 512,857.4Z" />
|
||||||
|
</vector>
|
||||||
@@ -58,6 +58,7 @@
|
|||||||
android:text="@{IntervalKt.elapsedIntervalString(currentTime.value - state.updatedAt, context)}" />
|
android:text="@{IntervalKt.elapsedIntervalString(currentTime.value - state.updatedAt, context)}" />
|
||||||
|
|
||||||
<View
|
<View
|
||||||
|
android:id="@+id/divider"
|
||||||
android:layout_width="@dimen/divider_size"
|
android:layout_width="@dimen/divider_size"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_centerVertical="true"
|
android:layout_centerVertical="true"
|
||||||
|
|||||||
@@ -30,6 +30,7 @@
|
|||||||
<string name="import_from_file">ファイルからインポート</string>
|
<string name="import_from_file">ファイルからインポート</string>
|
||||||
<string name="url">URL</string>
|
<string name="url">URL</string>
|
||||||
<string name="import_from_url">URLからインポート</string>
|
<string name="import_from_url">URLからインポート</string>
|
||||||
|
<string name="import_from_qr">QRコードからインポート</string>
|
||||||
<string name="external">外部入力</string>
|
<string name="external">外部入力</string>
|
||||||
<string name="format_type_unsaved">%s (未保存)</string>
|
<string name="format_type_unsaved">%s (未保存)</string>
|
||||||
<string name="application_broken">アプリが破損しています</string>
|
<string name="application_broken">アプリが破損しています</string>
|
||||||
@@ -250,4 +251,6 @@
|
|||||||
<string name="force_dns_mapping">Force DNS Mapping</string>
|
<string name="force_dns_mapping">Force DNS Mapping</string>
|
||||||
<string name="parse_pure_ip">Parse Pure IP</string>
|
<string name="parse_pure_ip">Parse Pure IP</string>
|
||||||
<string name="override_destination">Override Destination</string>
|
<string name="override_destination">Override Destination</string>
|
||||||
|
<string name="import_from_qr_no_permission">カメラのアクセスが制限されています。設定から有効にしてください。</string>
|
||||||
|
<string name="import_from_qr_exception">システムで予期しない例外が発生しました。</string>
|
||||||
</resources>
|
</resources>
|
||||||
@@ -31,6 +31,7 @@
|
|||||||
<string name="url">URL</string>
|
<string name="url">URL</string>
|
||||||
<string name="import_from_url">URL에서 가져오기</string>
|
<string name="import_from_url">URL에서 가져오기</string>
|
||||||
<string name="external">외부</string>
|
<string name="external">외부</string>
|
||||||
|
<string name="import_from_qr">QR코드에서 가져오기</string>
|
||||||
<string name="format_type_unsaved">%s (저장되지 않음)</string>
|
<string name="format_type_unsaved">%s (저장되지 않음)</string>
|
||||||
<string name="application_broken">앱 오류</string>
|
<string name="application_broken">앱 오류</string>
|
||||||
<string name="application_crashed">앱 중지</string>
|
<string name="application_crashed">앱 중지</string>
|
||||||
@@ -250,4 +251,6 @@
|
|||||||
<string name="force_dns_mapping">Force DNS Mapping</string>
|
<string name="force_dns_mapping">Force DNS Mapping</string>
|
||||||
<string name="parse_pure_ip">Parse Pure IP</string>
|
<string name="parse_pure_ip">Parse Pure IP</string>
|
||||||
<string name="override_destination">Override Destination</string>
|
<string name="override_destination">Override Destination</string>
|
||||||
|
<string name="import_from_qr_no_permission">카메라 접근이 제한되었습니다. 설정에서 허용해 주세요.</string>
|
||||||
|
<string name="import_from_qr_exception">처리되지 않은 시스템 예외가 발생했습니다.</string>
|
||||||
</resources>
|
</resources>
|
||||||
@@ -38,6 +38,7 @@
|
|||||||
<string name="url">URL</string>
|
<string name="url">URL</string>
|
||||||
<string name="import_from_url">Импорт из URL</string>
|
<string name="import_from_url">Импорт из URL</string>
|
||||||
<string name="external">Внешний</string>
|
<string name="external">Внешний</string>
|
||||||
|
<string name="import_from_qr">Импорт из QR-кода</string>
|
||||||
<string name="format_type_unsaved">%s (не сохранён)</string>
|
<string name="format_type_unsaved">%s (не сохранён)</string>
|
||||||
|
|
||||||
<string name="application_broken">Приложение сломано</string>
|
<string name="application_broken">Приложение сломано</string>
|
||||||
@@ -314,4 +315,6 @@
|
|||||||
<string name="force_dns_mapping">Force DNS Mapping</string>
|
<string name="force_dns_mapping">Force DNS Mapping</string>
|
||||||
<string name="parse_pure_ip">Parse Pure IP</string>
|
<string name="parse_pure_ip">Parse Pure IP</string>
|
||||||
<string name="override_destination">Override Destination</string>
|
<string name="override_destination">Override Destination</string>
|
||||||
|
<string name="import_from_qr_no_permission">Доступ к камере ограничен. Разрешите его в настройках.</string>
|
||||||
|
<string name="import_from_qr_exception">Произошла не обрабатываемая системная ошибка.</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources>
|
<resources>
|
||||||
<string name="geofile_import_failed">Nhập thất bại</string>
|
<string name="geofile_import_failed">Nhập thất bại</string>
|
||||||
<string name="toast_profile_updated_complete">Cập nhật thành công</string>
|
<string name="toast_profile_updated_complete">Cập nhật thành công %s</string>
|
||||||
<string name="toast_profile_updated_failed">Cập nhật không thành công</string>
|
<string name="toast_profile_updated_failed">Cập nhật không thành công %1$s %2$s</string>
|
||||||
<string name="press_to_import">Chạm để nhập...</string>
|
<string name="press_to_import">Chạm để nhập...</string>
|
||||||
<string name="meta_features">Tính năng của Clash Meta</string>
|
<string name="meta_features">Tính năng của Clash Meta</string>
|
||||||
<string name="allow_ipv6">Cho phép Ipv6</string>
|
<string name="allow_ipv6">Cho phép Ipv6</string>
|
||||||
@@ -236,4 +236,7 @@
|
|||||||
<string name="version_updated_tips">Các cài đặt đã được đặt lại và các cấu hình cũ cần được lưu lại.</string>
|
<string name="version_updated_tips">Các cài đặt đã được đặt lại và các cấu hình cũ cần được lưu lại.</string>
|
||||||
<string name="vpn_service_options">Tuỳ chọn VpnService</string>
|
<string name="vpn_service_options">Tuỳ chọn VpnService</string>
|
||||||
<string name="warning">Cảnh báo</string>
|
<string name="warning">Cảnh báo</string>
|
||||||
|
<string name="import_from_qr">Nhập từ Mã QR</string>
|
||||||
|
<string name="import_from_qr_no_permission">Quyền truy cập camera bị hạn chế. Vui lòng bật trong Cài đặt.</string>
|
||||||
|
<string name="import_from_qr_exception">Đã xảy ra ngoại lệ hệ thống không xử lý được.</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -41,6 +41,7 @@
|
|||||||
<string name="import_from_file">從文件導入</string>
|
<string name="import_from_file">從文件導入</string>
|
||||||
<string name="import_from_url">從 URL 導入</string>
|
<string name="import_from_url">從 URL 導入</string>
|
||||||
<string name="interface_">界面</string>
|
<string name="interface_">界面</string>
|
||||||
|
<string name="import_from_qr">從二維碼導入</string>
|
||||||
<string name="invalid_url">無效的 URL</string>
|
<string name="invalid_url">無效的 URL</string>
|
||||||
<string name="logcat">Logcat</string>
|
<string name="logcat">Logcat</string>
|
||||||
<string name="logs">日誌</string>
|
<string name="logs">日誌</string>
|
||||||
@@ -247,4 +248,6 @@
|
|||||||
<string name="force_dns_mapping">Force DNS Mapping</string>
|
<string name="force_dns_mapping">Force DNS Mapping</string>
|
||||||
<string name="parse_pure_ip">Parse Pure IP</string>
|
<string name="parse_pure_ip">Parse Pure IP</string>
|
||||||
<string name="override_destination">Override Destination</string>
|
<string name="override_destination">Override Destination</string>
|
||||||
|
<string name="import_from_qr_no_permission">相機權限受限,請前往設定開啟。</string>
|
||||||
|
<string name="import_from_qr_exception">發生系統未知異常,操作失敗。</string>
|
||||||
</resources>
|
</resources>
|
||||||
@@ -40,6 +40,7 @@
|
|||||||
<string name="history">歷史</string>
|
<string name="history">歷史</string>
|
||||||
<string name="import_from_file">從檔案匯入</string>
|
<string name="import_from_file">從檔案匯入</string>
|
||||||
<string name="import_from_url">從 URL 匯入</string>
|
<string name="import_from_url">從 URL 匯入</string>
|
||||||
|
<string name="import_from_qr">從二維碼導入</string>
|
||||||
<string name="interface_">介面</string>
|
<string name="interface_">介面</string>
|
||||||
<string name="invalid_url">無效 URL</string>
|
<string name="invalid_url">無效 URL</string>
|
||||||
<string name="logcat">Logcat</string>
|
<string name="logcat">Logcat</string>
|
||||||
@@ -247,4 +248,6 @@
|
|||||||
<string name="force_dns_mapping">Force DNS Mapping</string>
|
<string name="force_dns_mapping">Force DNS Mapping</string>
|
||||||
<string name="parse_pure_ip">Parse Pure IP</string>
|
<string name="parse_pure_ip">Parse Pure IP</string>
|
||||||
<string name="override_destination">Override Destination</string>
|
<string name="override_destination">Override Destination</string>
|
||||||
|
<string name="import_from_qr_no_permission">相機權限受限,請前往設定開啟。</string>
|
||||||
|
<string name="import_from_qr_exception">發生系統未知異常,操作失敗。</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -37,9 +37,14 @@
|
|||||||
<string name="format_profile_activated">%s 已激活</string>
|
<string name="format_profile_activated">%s 已激活</string>
|
||||||
<string name="format_traffic_forwarded">%s 已转发</string>
|
<string name="format_traffic_forwarded">%s 已转发</string>
|
||||||
<string name="global_mode">全局模式</string>
|
<string name="global_mode">全局模式</string>
|
||||||
|
<string name="hide_app_icon_title">隐藏应用图标</string>
|
||||||
|
<string name="hide_app_icon_desc">可以在拨号盘输入 *#*#252746382#*#* 打开应用</string>
|
||||||
|
<string name="hide_from_recents_title">从最近任务隐藏</string>
|
||||||
|
<string name="hide_from_recents_desc">在最近任务中隐藏应用</string>
|
||||||
<string name="history">历史</string>
|
<string name="history">历史</string>
|
||||||
<string name="import_from_file">从文件导入</string>
|
<string name="import_from_file">从文件导入</string>
|
||||||
<string name="import_from_url">从 URL 导入</string>
|
<string name="import_from_url">从 URL 导入</string>
|
||||||
|
<string name="import_from_qr">从二维码导入</string>
|
||||||
<string name="interface_">界面</string>
|
<string name="interface_">界面</string>
|
||||||
<string name="invalid_url">无效的 URL</string>
|
<string name="invalid_url">无效的 URL</string>
|
||||||
<string name="logcat">Logcat</string>
|
<string name="logcat">Logcat</string>
|
||||||
@@ -133,9 +138,9 @@
|
|||||||
<string name="fakeip">Fake-IP 至 域名映射</string>
|
<string name="fakeip">Fake-IP 至 域名映射</string>
|
||||||
<string name="blacklist">黑名单</string>
|
<string name="blacklist">黑名单</string>
|
||||||
<string name="whitelist">白名单</string>
|
<string name="whitelist">白名单</string>
|
||||||
<string name="off">OFF</string>
|
<string name="off">关闭</string>
|
||||||
<string name="strict">Strict</string>
|
<string name="strict">严格</string>
|
||||||
<string name="always">Always</string>
|
<string name="always">强制开启</string>
|
||||||
<string name="sort">排序</string>
|
<string name="sort">排序</string>
|
||||||
<string name="layout">布局</string>
|
<string name="layout">布局</string>
|
||||||
<string name="single">单列</string>
|
<string name="single">单列</string>
|
||||||
@@ -190,6 +195,7 @@
|
|||||||
<string name="format_provider_type">%1$s(%2$s)</string>
|
<string name="format_provider_type">%1$s(%2$s)</string>
|
||||||
<string name="rule">规则</string>
|
<string name="rule">规则</string>
|
||||||
<string name="http">HTTP</string>
|
<string name="http">HTTP</string>
|
||||||
|
<string name="inline">内联</string>
|
||||||
<string name="compatible">兼容</string>
|
<string name="compatible">兼容</string>
|
||||||
<string name="format_update_provider_failure">更新 %1$s: %2$s</string>
|
<string name="format_update_provider_failure">更新 %1$s: %2$s</string>
|
||||||
<string name="update_all">更新全部</string>
|
<string name="update_all">更新全部</string>
|
||||||
@@ -216,43 +222,51 @@
|
|||||||
<string name="geoip_fallback_code">GeoIP Fallback 区域代码</string>
|
<string name="geoip_fallback_code">GeoIP Fallback 区域代码</string>
|
||||||
<string name="allow_bypass">允许应用绕过</string>
|
<string name="allow_bypass">允许应用绕过</string>
|
||||||
<string name="allow_bypass_summary">允许其他应用绕过 VPN</string>
|
<string name="allow_bypass_summary">允许其他应用绕过 VPN</string>
|
||||||
<string name="allow_ipv6">允许Ipv6</string>
|
<string name="allow_ipv6">允许 Ipv6</string>
|
||||||
<string name="allow_ipv6_summary">通过 VpnService 代理Ipv6流量</string>
|
<string name="allow_ipv6_summary">通过 VpnService 代理 Ipv6 流量</string>
|
||||||
<string name="clash_meta_wiki">Clash Meta Wiki</string>
|
<string name="clash_meta_wiki">Clash Meta Wiki</string>
|
||||||
<string name="meta_features">Meta Features</string>
|
<string name="meta_features">Meta 特性</string>
|
||||||
<string name="unified_delay">Unified Delay</string>
|
<string name="unified_delay">统一延迟</string>
|
||||||
<string name="geodata_mode">Geodata Mode</string>
|
<string name="geodata_mode">Geodata 模式</string>
|
||||||
<string name="tcp_concurrent">TCP Concurrent</string>
|
<string name="tcp_concurrent">TCP 并发</string>
|
||||||
<string name="find_process_mode">Find Process Mode</string>
|
<string name="find_process_mode">查找进程模式</string>
|
||||||
<string name="sniffer_setting">Sniffer Setting</string>
|
<string name="sniffer_setting">嗅探设置</string>
|
||||||
<string name="sniffer">Sniffer</string>
|
<string name="sniffer">嗅探器</string>
|
||||||
<string name="sniffing">Sniffer Mode</string>
|
<string name="sniff">嗅探</string>
|
||||||
<string name="force_domain">Force Domain</string>
|
<string name="force_dns_mapping">强制 DNS 映射</string>
|
||||||
<string name="skip_domain">Skip Domain</string>
|
<string name="parse_pure_ip">解析纯 IP 连接</string>
|
||||||
<string name="disable_sniffer">Disable Sniffer</string>
|
<string name="override_destination">覆盖目标地址</string>
|
||||||
<string name="sniffer_config">Load Sniffer From Config</string>
|
<string name="force_domain">强制解析域名</string>
|
||||||
<string name="sniffer_override">Override Sniffer Config</string>
|
<string name="skip_domain">跳过域名</string>
|
||||||
<string name="geox_url_setting">GeoX Url Setting</string>
|
<string name="skip_src_address">跳过源 IP</string>
|
||||||
<string name="geox_geoip">GeoIp Url</string>
|
<string name="skip_dst_address">跳过目标 IP</string>
|
||||||
<string name="geox_mmdb">MMDB Url</string>
|
<string name="geox_url_setting">GeoX 链接设置</string>
|
||||||
<string name="geox_geosite">Geosite Url</string>
|
<string name="geox_geoip">GeoIp 链接</string>
|
||||||
<string name="prefer_h3">Prefer h3</string>
|
<string name="geox_mmdb">MMDB 链接</string>
|
||||||
<string name="port_whitelist">Port Whitelist</string>
|
<string name="geox_geosite">Geosite 链接</string>
|
||||||
<string name="geox_files" >Geo Files</string>
|
<string name="prefer_h3">H3 优先</string>
|
||||||
|
<string name="geox_files" >Geo 文件</string>
|
||||||
<string name="import_geoip_file">导入 GeoIP 数据库</string>
|
<string name="import_geoip_file">导入 GeoIP 数据库</string>
|
||||||
<string name="press_to_import">Press to import...</string>
|
|
||||||
<string name="import_geosite_file">导入 GeoSite 数据库</string>
|
<string name="import_geosite_file">导入 GeoSite 数据库</string>
|
||||||
<string name="import_country_file">导入 Country 数据库</string>
|
<string name="import_country_file">导入 Country 数据库</string>
|
||||||
|
<string name="import_asn_file">导入 ASN 数据库</string>
|
||||||
|
<string name="press_to_import">点击导入...</string>
|
||||||
<string name="geofile_import_failed">导入失败</string>
|
<string name="geofile_import_failed">导入失败</string>
|
||||||
<string name="geofile_unknown_db_format">数据库类型错误</string>
|
<string name="geofile_unknown_db_format">数据库类型错误</string>
|
||||||
<string name="geofile_unknown_db_format_message">只支持 %1$s 格式的Geo数据库</string>
|
<string name="geofile_unknown_db_format_message">只支持 %1$s 格式的 Geo 数据库</string>
|
||||||
<string name="geofile_imported">%1$s 已导入</string>
|
<string name="geofile_imported">%1$s 已导入</string>
|
||||||
<string name="toast_profile_updated_complete">更新配置 %s 成功</string>
|
<string name="toast_profile_updated_complete">更新配置 %s 成功</string>
|
||||||
<string name="toast_profile_updated_failed">更新配置 %1$s 失败: %2$s</string>
|
<string name="toast_profile_updated_failed">更新配置 %1$s 失败:%2$s</string>
|
||||||
<string name="external_control_activity">External Control</string>
|
<string name="external_control_activity">外部控制</string>
|
||||||
<string name="external_control_started">Clash.Meta 服务已启动</string>
|
<string name="external_control_started">Clash.Meta 服务已启动</string>
|
||||||
<string name="external_control_stopped">Clash.Meta 服务已停止</string>
|
<string name="external_control_stopped">Clash.Meta 服务已停止</string>
|
||||||
<string name="force_dns_mapping">Force DNS Mapping</string>
|
<string name="import_from_qr_no_permission">相机权限受限,请前往设置开启。</string>
|
||||||
<string name="parse_pure_ip">Parse Pure IP</string>
|
<string name="import_from_qr_exception">发生系统未知异常,操作失败。</string>
|
||||||
<string name="override_destination">Override Destination</string>
|
|
||||||
</resources>
|
<string name="shortcut_toggle_short">切换 Clash</string>
|
||||||
|
<string name="shortcut_toggle_long">切换 Clash 服务启停</string>
|
||||||
|
<string name="shortcut_start_short">启动 Clash</string>
|
||||||
|
<string name="shortcut_start_long">启动 Clash 服务</string>
|
||||||
|
<string name="shortcut_stop_short">停止 Clash</string>
|
||||||
|
<string name="shortcut_stop_long">停止 Clash 服务</string>
|
||||||
|
</resources>
|
||||||
|
|||||||
@@ -41,7 +41,9 @@
|
|||||||
<string name="file">File</string>
|
<string name="file">File</string>
|
||||||
<string name="import_from_file">Import from File</string>
|
<string name="import_from_file">Import from File</string>
|
||||||
<string name="url">URL</string>
|
<string name="url">URL</string>
|
||||||
|
<string name="qr" translatable="false">QR Code</string>
|
||||||
<string name="import_from_url">Import from URL</string>
|
<string name="import_from_url">Import from URL</string>
|
||||||
|
<string name="import_from_qr">Import from QR Code</string>
|
||||||
<string name="external">External</string>
|
<string name="external">External</string>
|
||||||
<string name="format_type_unsaved">%s (Unsaved)</string>
|
<string name="format_type_unsaved">%s (Unsaved)</string>
|
||||||
|
|
||||||
@@ -278,6 +280,7 @@
|
|||||||
<string name="format_provider_type">%1$s(%2$s)</string>
|
<string name="format_provider_type">%1$s(%2$s)</string>
|
||||||
<string name="rule">Rule</string>
|
<string name="rule">Rule</string>
|
||||||
<string name="http">HTTP</string>
|
<string name="http">HTTP</string>
|
||||||
|
<string name="inline">Inline</string>
|
||||||
<string name="compatible">Compatible</string>
|
<string name="compatible">Compatible</string>
|
||||||
<string name="format_update_provider_failure">Update %1$s: %2$s</string>
|
<string name="format_update_provider_failure">Update %1$s: %2$s</string>
|
||||||
<string name="update_all">Update All</string>
|
<string name="update_all">Update All</string>
|
||||||
@@ -304,13 +307,19 @@
|
|||||||
|
|
||||||
<string name="sniffer_setting">Sniffer Setting</string>
|
<string name="sniffer_setting">Sniffer Setting</string>
|
||||||
<string name="sniffer">Sniffer</string>
|
<string name="sniffer">Sniffer</string>
|
||||||
<string name="sniffing">Sniffer Mode</string>
|
<string name="force_dns_mapping">Force DNS Mapping</string>
|
||||||
|
<string name="parse_pure_ip">Parse Pure IP</string>
|
||||||
|
<string name="override_destination">Override Destination</string>
|
||||||
<string name="force_domain">Force Domain</string>
|
<string name="force_domain">Force Domain</string>
|
||||||
<string name="skip_domain">Skip Domain</string>
|
<string name="skip_domain">Skip Domain</string>
|
||||||
<string name="port_whitelist">Port Whitelist</string>
|
<string name="skip_src_address">Skip Src Address</string>
|
||||||
<string name="disable_sniffer">Disable Sniffer</string>
|
<string name="skip_dst_address">Skip Dst Address</string>
|
||||||
<string name="sniffer_config">Load Sniffer From Config</string>
|
<string name="sniff_http_ports">Sniff HTTP Ports</string>
|
||||||
<string name="sniffer_override">Override Sniffer Config</string>
|
<string name="sniff_tls_ports">Sniff TLS Ports</string>
|
||||||
|
<string name="sniff_quic_ports">Sniff QUIC Ports</string>
|
||||||
|
<string name="sniff_http_override_destination">Sniff HTTP Override Destination</string>
|
||||||
|
<string name="sniff_tls_override_destination">Sniff TLS Override Destination</string>
|
||||||
|
<string name="sniff_quic_override_destination">Sniff QUIC Override Destination</string>
|
||||||
|
|
||||||
<string name="geox_url_setting">GeoX Url Setting</string>
|
<string name="geox_url_setting">GeoX Url Setting</string>
|
||||||
<string name="geox_geoip">GeoIp Url</string>
|
<string name="geox_geoip">GeoIp Url</string>
|
||||||
@@ -321,10 +330,10 @@
|
|||||||
<string name="geosite_url" translatable="false">https://raw.githubusercontent.com/MetaCubeX/meta-rules-dat/release/geosite.dat</string>
|
<string name="geosite_url" translatable="false">https://raw.githubusercontent.com/MetaCubeX/meta-rules-dat/release/geosite.dat</string>
|
||||||
<string name="geox_files" >Geo Files</string>
|
<string name="geox_files" >Geo Files</string>
|
||||||
<string name="import_geoip_file">Import GeoIP Database</string>
|
<string name="import_geoip_file">Import GeoIP Database</string>
|
||||||
<string name="press_to_import">Press to import...</string>
|
|
||||||
<string name="import_geosite_file">Import GeoSite Database</string>
|
<string name="import_geosite_file">Import GeoSite Database</string>
|
||||||
<string name="import_country_file">Import Country Database</string>
|
<string name="import_country_file">Import Country Database</string>
|
||||||
<string name="import_asn_file">Import ASN Database</string>
|
<string name="import_asn_file">Import ASN Database</string>
|
||||||
|
<string name="press_to_import">Press to import...</string>
|
||||||
<string name="geofile_import_failed">Import failed</string>
|
<string name="geofile_import_failed">Import failed</string>
|
||||||
<string name="geofile_unknown_db_format">Unknown Database format</string>
|
<string name="geofile_unknown_db_format">Unknown Database format</string>
|
||||||
<string name="geofile_unknown_db_format_message">Only %1$s are supported</string>
|
<string name="geofile_unknown_db_format_message">Only %1$s are supported</string>
|
||||||
@@ -334,7 +343,18 @@
|
|||||||
<string name="external_control_activity">External Control</string>
|
<string name="external_control_activity">External Control</string>
|
||||||
<string name="external_control_started">Clash.Meta service started</string>
|
<string name="external_control_started">Clash.Meta service started</string>
|
||||||
<string name="external_control_stopped">Clash.Meta service stopped</string>
|
<string name="external_control_stopped">Clash.Meta service stopped</string>
|
||||||
<string name="force_dns_mapping">Force DNS Mapping</string>
|
|
||||||
<string name="parse_pure_ip">Parse Pure IP</string>
|
<string name="hide_app_icon_title">Hide App Icon</string>
|
||||||
<string name="override_destination">Override Destination</string>
|
<string name="hide_app_icon_desc">You can dial *#*#252746382#*#* to open this App</string>
|
||||||
|
<string name="hide_from_recents_title">Hide from Recents</string>
|
||||||
|
<string name="hide_from_recents_desc">Hide app from the Recent apps screen</string>
|
||||||
|
<string name="import_from_qr_no_permission">Camera access is restricted. Please enable it in Settings.</string>
|
||||||
|
<string name="import_from_qr_exception">An unhandled system exception occurred.</string>
|
||||||
|
|
||||||
|
<string name="shortcut_toggle_short">Toggle Clash</string>
|
||||||
|
<string name="shortcut_toggle_long">Toggle Clash service on/off</string>
|
||||||
|
<string name="shortcut_start_short">Start Clash</string>
|
||||||
|
<string name="shortcut_start_long">Start Clash service</string>
|
||||||
|
<string name="shortcut_stop_short">Stop Clash</string>
|
||||||
|
<string name="shortcut_stop_long">Stop Clash service</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
# http://www.gradle.org/docs/current/userguide/build_environment.html
|
# http://www.gradle.org/docs/current/userguide/build_environment.html
|
||||||
# Specifies the JVM arguments used for the daemon process.
|
# Specifies the JVM arguments used for the daemon process.
|
||||||
# The setting is particularly useful for tweaking memory settings.
|
# The setting is particularly useful for tweaking memory settings.
|
||||||
org.gradle.jvmargs=-Xmx4g -XX:+UseZGC -Dfile.encoding=UTF-8
|
org.gradle.jvmargs=-Xmx4g -Dfile.encoding=UTF-8
|
||||||
# When configured, Gradle will run in incubating parallel mode.
|
# When configured, Gradle will run in incubating parallel mode.
|
||||||
# This option should only be used with decoupled projects. More details, visit
|
# This option should only be used with decoupled projects. More details, visit
|
||||||
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
|
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
|
||||||
|
|||||||
47
gradle/libs.versions.toml
Normal file
47
gradle/libs.versions.toml
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
[versions]
|
||||||
|
agp = "8.8.0"
|
||||||
|
kotlin = "2.1.0"
|
||||||
|
ksp = "2.1.0-1.0.29"
|
||||||
|
golang = "1.0.4"
|
||||||
|
coroutine = "1.10.1"
|
||||||
|
coreKtx = "1.8.0"
|
||||||
|
activity = "1.5.0"
|
||||||
|
fragment = "1.5.0"
|
||||||
|
appcompat = "1.4.2"
|
||||||
|
coordinator = "1.2.0"
|
||||||
|
recyclerview = "1.2.1"
|
||||||
|
viewpager = "1.0.0"
|
||||||
|
material = "1.6.1"
|
||||||
|
serialization = "1.3.3"
|
||||||
|
kaidl = "1.15"
|
||||||
|
room = "2.4.2"
|
||||||
|
multiprocess = "1.0.0"
|
||||||
|
quickie = "1.11.0"
|
||||||
|
androidx-activity-ktx = "1.9.0"
|
||||||
|
|
||||||
|
[libraries]
|
||||||
|
build-android = { module = "com.android.tools.build:gradle", version.ref = "agp" }
|
||||||
|
build-kotlin-common = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlin" }
|
||||||
|
build-kotlin-serialization = { module = "org.jetbrains.kotlin:kotlin-serialization", version.ref = "kotlin" }
|
||||||
|
build-ksp = { module = "com.google.devtools.ksp:symbol-processing-gradle-plugin", version.ref = "ksp" }
|
||||||
|
build-golang = { module = "com.github.kr328.golang:gradle-plugin", version.ref = "golang" }
|
||||||
|
kotlin-coroutine = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-android", version.ref = "coroutine" }
|
||||||
|
kotlin-serialization-json = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "serialization" }
|
||||||
|
androidx-core = { module = "androidx.core:core-ktx", version.ref = "coreKtx" }
|
||||||
|
androidx-activity = { module = "androidx.activity:activity", version.ref = "activity" }
|
||||||
|
androidx-fragment = { module = "androidx.fragment:fragment", version.ref = "fragment" }
|
||||||
|
androidx-appcompat = { module = "androidx.appcompat:appcompat", version.ref = "appcompat" }
|
||||||
|
androidx-coordinator = { module = "androidx.coordinatorlayout:coordinatorlayout", version.ref = "coordinator" }
|
||||||
|
androidx-recyclerview = { module = "androidx.recyclerview:recyclerview", version.ref = "recyclerview" }
|
||||||
|
androidx-viewpager = { module = "androidx.viewpager2:viewpager2", version.ref = "viewpager" }
|
||||||
|
androidx-room-compiler = { module = "androidx.room:room-compiler", version.ref = "room" }
|
||||||
|
androidx-room-runtime = { module = "androidx.room:room-runtime", version.ref = "room" }
|
||||||
|
androidx-room-ktx = { module = "androidx.room:room-ktx", version.ref = "room" }
|
||||||
|
google-material = { module = "com.google.android.material:material", version.ref = "material" }
|
||||||
|
kaidl-compiler = { module = "com.github.kr328.kaidl:kaidl", version.ref = "kaidl" }
|
||||||
|
kaidl-runtime = { module = "com.github.kr328.kaidl:kaidl-runtime", version.ref = "kaidl" }
|
||||||
|
rikkax-multiprocess = { module = "dev.rikka.rikkax.preference:multiprocess", version.ref = "multiprocess" }
|
||||||
|
quickie-bundled = { group = "io.github.g00fy2.quickie", name = "quickie-bundled", version.ref = "quickie" }
|
||||||
|
androidx-activity-ktx = { group = "androidx.activity", name = "activity-ktx", version.ref = "androidx-activity-ktx" }
|
||||||
|
|
||||||
|
[plugins]
|
||||||
6
gradle/wrapper/gradle-wrapper.properties
vendored
6
gradle/wrapper/gradle-wrapper.properties
vendored
@@ -1,8 +1,6 @@
|
|||||||
|
#Tue Jan 14 14:06:42 CST 2025
|
||||||
distributionBase=GRADLE_USER_HOME
|
distributionBase=GRADLE_USER_HOME
|
||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
distributionSha256Sum=fe696c020f241a5f69c30f763c5a7f38eec54b490db19cd2b0962dda420d7d12
|
distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.4-all.zip
|
|
||||||
networkTimeout=10000
|
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
zipStorePath=wrapper/dists
|
zipStorePath=wrapper/dists
|
||||||
distributionSha256Sum=fe696c020f241a5f69c30f763c5a7f38eec54b490db19cd2b0962dda420d7d12
|
|
||||||
@@ -1,2 +1,2 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<manifest package="com.github.kr328.clash.hideapi" />
|
<manifest />
|
||||||
@@ -19,7 +19,7 @@ dependencies {
|
|||||||
implementation(libs.androidx.room.ktx)
|
implementation(libs.androidx.room.ktx)
|
||||||
implementation(libs.kaidl.runtime)
|
implementation(libs.kaidl.runtime)
|
||||||
implementation(libs.rikkax.multiprocess)
|
implementation(libs.rikkax.multiprocess)
|
||||||
implementation(platform("com.squareup.okhttp3:okhttp-bom:4.10.0"))
|
implementation(platform("com.squareup.okhttp3:okhttp-bom:4.12.0"))
|
||||||
|
|
||||||
// define any required OkHttp artifacts without version
|
// define any required OkHttp artifacts without version
|
||||||
implementation("com.squareup.okhttp3:okhttp")
|
implementation("com.squareup.okhttp3:okhttp")
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools">
|
||||||
package="com.github.kr328.clash.service">
|
|
||||||
|
|
||||||
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
||||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
||||||
@@ -9,19 +8,27 @@
|
|||||||
<uses-permission
|
<uses-permission
|
||||||
android:name="android.permission.QUERY_ALL_PACKAGES"
|
android:name="android.permission.QUERY_ALL_PACKAGES"
|
||||||
tools:ignore="QueryAllPackagesPermission" />
|
tools:ignore="QueryAllPackagesPermission" />
|
||||||
|
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_SPECIAL_USE" />
|
||||||
|
|
||||||
<application>
|
<application>
|
||||||
<service
|
<service
|
||||||
android:name=".ClashService"
|
android:name=".ClashService"
|
||||||
android:exported="false"
|
android:exported="false"
|
||||||
android:label="@string/clash_meta_for_android"
|
android:label="@string/clash_meta_for_android"
|
||||||
android:process=":background" />
|
android:process=":background"
|
||||||
|
android:foregroundServiceType="specialUse">
|
||||||
|
<property android:name="android.app.PROPERTY_SPECIAL_USE_FGS_SUBTYPE"
|
||||||
|
android:value="explanation_for_special_use"/>
|
||||||
|
</service>
|
||||||
<service
|
<service
|
||||||
android:name=".TunService"
|
android:name=".TunService"
|
||||||
android:exported="false"
|
android:exported="false"
|
||||||
android:label="@string/clash_meta_for_android"
|
android:label="@string/clash_meta_for_android"
|
||||||
android:permission="android.permission.BIND_VPN_SERVICE"
|
android:permission="android.permission.BIND_VPN_SERVICE"
|
||||||
android:process=":background">
|
android:process=":background"
|
||||||
|
android:foregroundServiceType="specialUse">
|
||||||
|
<property android:name="android.app.PROPERTY_SPECIAL_USE_FGS_SUBTYPE"
|
||||||
|
android:value="explanation_for_special_use"/>
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.net.VpnService" />
|
<action android:name="android.net.VpnService" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
@@ -33,7 +40,11 @@
|
|||||||
<service
|
<service
|
||||||
android:name=".ProfileWorker"
|
android:name=".ProfileWorker"
|
||||||
android:exported="false"
|
android:exported="false"
|
||||||
android:process=":background" />
|
android:process=":background"
|
||||||
|
android:foregroundServiceType="specialUse">
|
||||||
|
<property android:name="android.app.PROPERTY_SPECIAL_USE_FGS_SUBTYPE"
|
||||||
|
android:value="explanation_for_special_use"/>
|
||||||
|
</service>
|
||||||
|
|
||||||
<provider
|
<provider
|
||||||
android:name=".FilesProvider"
|
android:name=".FilesProvider"
|
||||||
|
|||||||
@@ -139,9 +139,10 @@ class ProfileManager(private val context: Context) : IProfileManager,
|
|||||||
suspend fun updateFlow(old: Imported) {
|
suspend fun updateFlow(old: Imported) {
|
||||||
val client = OkHttpClient()
|
val client = OkHttpClient()
|
||||||
try {
|
try {
|
||||||
|
val versionName = context.packageManager.getPackageInfo(context.packageName, 0).versionName
|
||||||
val request = Request.Builder()
|
val request = Request.Builder()
|
||||||
.url(old.source)
|
.url(old.source)
|
||||||
.header("User-Agent", "ClashforWindows/0.19.23")
|
.header("User-Agent", "ClashMetaForAndroid/$versionName")
|
||||||
.build()
|
.build()
|
||||||
|
|
||||||
client.newCall(request).execute().use { response ->
|
client.newCall(request).execute().use { response ->
|
||||||
@@ -160,13 +161,13 @@ class ProfileManager(private val context: Context) : IProfileManager,
|
|||||||
val info = flag.split("=")
|
val info = flag.split("=")
|
||||||
when {
|
when {
|
||||||
info[0].contains("upload") && info[1].isNotEmpty() -> upload =
|
info[0].contains("upload") && info[1].isNotEmpty() -> upload =
|
||||||
BigDecimal(info[1]).longValueExact()
|
BigDecimal(info[1].split('.').first()).longValueExact()
|
||||||
|
|
||||||
info[0].contains("download") && info[1].isNotEmpty() -> download =
|
info[0].contains("download") && info[1].isNotEmpty() -> download =
|
||||||
BigDecimal(info[1]).longValueExact()
|
BigDecimal(info[1].split('.').first()).longValueExact()
|
||||||
|
|
||||||
info[0].contains("total") && info[1].isNotEmpty() -> total =
|
info[0].contains("total") && info[1].isNotEmpty() -> total =
|
||||||
BigDecimal(info[1]).longValueExact()
|
BigDecimal(info[1].split('.').first()).longValueExact()
|
||||||
|
|
||||||
info[0].contains("expire") && info[1].isNotEmpty() -> {
|
info[0].contains("expire") && info[1].isNotEmpty() -> {
|
||||||
if (info[1].isNotEmpty()) {
|
if (info[1].isNotEmpty()) {
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ import kotlinx.coroutines.sync.withLock
|
|||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
import okhttp3.OkHttpClient
|
import okhttp3.OkHttpClient
|
||||||
import okhttp3.Request
|
import okhttp3.Request
|
||||||
|
import java.math.BigDecimal
|
||||||
import java.net.URL
|
import java.net.URL
|
||||||
import java.util.*
|
import java.util.*
|
||||||
import java.util.concurrent.TimeUnit
|
import java.util.concurrent.TimeUnit
|
||||||
@@ -75,9 +76,10 @@ object ProfileProcessor {
|
|||||||
if (snapshot?.type == Profile.Type.Url) {
|
if (snapshot?.type == Profile.Type.Url) {
|
||||||
if (snapshot.source.startsWith("https://", true)) {
|
if (snapshot.source.startsWith("https://", true)) {
|
||||||
val client = OkHttpClient()
|
val client = OkHttpClient()
|
||||||
|
val versionName = context.packageManager.getPackageInfo(context.packageName, 0).versionName
|
||||||
val request = Request.Builder()
|
val request = Request.Builder()
|
||||||
.url(snapshot.source)
|
.url(snapshot.source)
|
||||||
.header("User-Agent", "ClashforWindows/0.19.23")
|
.header("User-Agent", "ClashMetaForAndroid/$versionName")
|
||||||
.build()
|
.build()
|
||||||
|
|
||||||
client.newCall(request).execute().use { response ->
|
client.newCall(request).execute().use { response ->
|
||||||
@@ -88,13 +90,13 @@ object ProfileProcessor {
|
|||||||
val info = flag.split("=")
|
val info = flag.split("=")
|
||||||
when {
|
when {
|
||||||
info[0].contains("upload") && info[1].isNotEmpty() -> upload =
|
info[0].contains("upload") && info[1].isNotEmpty() -> upload =
|
||||||
info[1].toLong()
|
BigDecimal(info[1].split('.').first()).longValueExact()
|
||||||
|
|
||||||
info[0].contains("download") && info[1].isNotEmpty() -> download =
|
info[0].contains("download") && info[1].isNotEmpty() -> download =
|
||||||
info[1].toLong()
|
BigDecimal(info[1].split('.').first()).longValueExact()
|
||||||
|
|
||||||
info[0].contains("total") && info[1].isNotEmpty() -> total =
|
info[0].contains("total") && info[1].isNotEmpty() -> total =
|
||||||
info[1].toLong()
|
BigDecimal(info[1].split('.').first()).longValueExact()
|
||||||
|
|
||||||
info[0].contains("expire") && info[1].isNotEmpty() -> expire =
|
info[0].contains("expire") && info[1].isNotEmpty() -> expire =
|
||||||
(info[1].toDouble() * 1000).toLong()
|
(info[1].toDouble() * 1000).toLong()
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import androidx.core.app.NotificationCompat
|
|||||||
import androidx.core.app.NotificationManagerCompat
|
import androidx.core.app.NotificationManagerCompat
|
||||||
import com.github.kr328.clash.common.compat.getColorCompat
|
import com.github.kr328.clash.common.compat.getColorCompat
|
||||||
import com.github.kr328.clash.common.compat.pendingIntentFlags
|
import com.github.kr328.clash.common.compat.pendingIntentFlags
|
||||||
|
import com.github.kr328.clash.common.compat.startForegroundCompat
|
||||||
import com.github.kr328.clash.common.constants.Components
|
import com.github.kr328.clash.common.constants.Components
|
||||||
import com.github.kr328.clash.common.constants.Intents
|
import com.github.kr328.clash.common.constants.Intents
|
||||||
import com.github.kr328.clash.common.id.UndefinedIds
|
import com.github.kr328.clash.common.id.UndefinedIds
|
||||||
@@ -123,7 +124,7 @@ class ProfileWorker : BaseService() {
|
|||||||
.setOnlyAlertOnce(true)
|
.setOnlyAlertOnce(true)
|
||||||
.build()
|
.build()
|
||||||
|
|
||||||
startForeground(R.id.nf_profile_worker, notification)
|
startForegroundCompat(R.id.nf_profile_worker, notification)
|
||||||
}
|
}
|
||||||
|
|
||||||
private suspend inline fun processing(name: String, block: () -> Unit) {
|
private suspend inline fun processing(name: String, block: () -> Unit) {
|
||||||
|
|||||||
@@ -11,10 +11,11 @@ import java.util.concurrent.TimeUnit
|
|||||||
|
|
||||||
class AppListCacheModule(service: Service) : Module<Unit>(service) {
|
class AppListCacheModule(service: Service) : Module<Unit>(service) {
|
||||||
private fun PackageInfo.uniqueUidName(): String =
|
private fun PackageInfo.uniqueUidName(): String =
|
||||||
if (sharedUserId != null && sharedUserId.isNotBlank()) sharedUserId else packageName
|
if (sharedUserId?.isNotBlank() == true) sharedUserId!! else packageName
|
||||||
|
|
||||||
private fun reload() {
|
private fun reload() {
|
||||||
val packages = service.packageManager.getInstalledPackages(0)
|
val packages = service.packageManager.getInstalledPackages(0)
|
||||||
|
.filter { it.applicationInfo != null }
|
||||||
.groupBy { it.uniqueUidName() }
|
.groupBy { it.uniqueUidName() }
|
||||||
.map { (_, v) ->
|
.map { (_, v) ->
|
||||||
val info = v[0]
|
val info = v[0]
|
||||||
@@ -23,9 +24,9 @@ class AppListCacheModule(service: Service) : Module<Unit>(service) {
|
|||||||
// Force use package name if only one app in a single sharedUid group
|
// Force use package name if only one app in a single sharedUid group
|
||||||
// Example: firefox
|
// Example: firefox
|
||||||
|
|
||||||
info.applicationInfo.uid to info.packageName
|
info.applicationInfo!!.uid to info.packageName
|
||||||
} else {
|
} else {
|
||||||
info.applicationInfo.uid to info.uniqueUidName()
|
info.applicationInfo!!.uid to info.uniqueUidName()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import android.content.BroadcastReceiver
|
|||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.content.IntentFilter
|
import android.content.IntentFilter
|
||||||
|
import com.github.kr328.clash.common.compat.registerReceiverCompat
|
||||||
import com.github.kr328.clash.common.constants.Permissions
|
import com.github.kr328.clash.common.constants.Permissions
|
||||||
import com.github.kr328.clash.common.log.Log
|
import com.github.kr328.clash.common.log.Log
|
||||||
import kotlinx.coroutines.NonCancellable
|
import kotlinx.coroutines.NonCancellable
|
||||||
@@ -44,9 +45,9 @@ abstract class Module<E>(val service: Service) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (requireSelf) {
|
if (requireSelf) {
|
||||||
service.registerReceiver(receiver, filter, Permissions.RECEIVE_SELF_BROADCASTS, null)
|
service.registerReceiverCompat(receiver, filter, Permissions.RECEIVE_SELF_BROADCASTS, null)
|
||||||
} else {
|
} else {
|
||||||
service.registerReceiver(receiver, filter)
|
service.registerReceiverCompat(receiver, filter)
|
||||||
}
|
}
|
||||||
|
|
||||||
receivers.add(receiver)
|
receivers.add(receiver)
|
||||||
|
|||||||
@@ -6,123 +6,150 @@ import android.os.Build
|
|||||||
import androidx.core.content.getSystemService
|
import androidx.core.content.getSystemService
|
||||||
import com.github.kr328.clash.common.log.Log
|
import com.github.kr328.clash.common.log.Log
|
||||||
import com.github.kr328.clash.core.Clash
|
import com.github.kr328.clash.core.Clash
|
||||||
import com.github.kr328.clash.service.util.resolvePrimaryDns
|
import com.github.kr328.clash.service.util.asSocketAddressText
|
||||||
import kotlinx.coroutines.NonCancellable
|
import kotlinx.coroutines.NonCancellable
|
||||||
import kotlinx.coroutines.channels.Channel
|
import kotlinx.coroutines.channels.Channel
|
||||||
import kotlinx.coroutines.channels.trySendBlocking
|
import kotlinx.coroutines.selects.select
|
||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
|
import java.net.InetAddress
|
||||||
|
import java.util.concurrent.ConcurrentHashMap
|
||||||
|
|
||||||
class NetworkObserveModule(service: Service) : Module<Network?>(service) {
|
class NetworkObserveModule(service: Service) : Module<Network>(service) {
|
||||||
private data class Action(val type: Type, val network: Network) {
|
|
||||||
enum class Type { Available, Lost, Changed }
|
|
||||||
}
|
|
||||||
|
|
||||||
private val connectivity = service.getSystemService<ConnectivityManager>()!!
|
private val connectivity = service.getSystemService<ConnectivityManager>()!!
|
||||||
private val actions = Channel<Action>(Channel.UNLIMITED)
|
private val networks: Channel<Network> = Channel(Channel.UNLIMITED)
|
||||||
private val request = NetworkRequest.Builder().apply {
|
private val request = NetworkRequest.Builder().apply {
|
||||||
addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VPN)
|
addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VPN)
|
||||||
addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
|
addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
|
||||||
|
addCapability(NetworkCapabilities.NET_CAPABILITY_FOREGROUND)
|
||||||
|
}
|
||||||
addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)
|
addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)
|
||||||
}.build()
|
}.build()
|
||||||
|
|
||||||
|
private data class NetworkInfo(
|
||||||
|
@Volatile var losingMs: Long = 0,
|
||||||
|
@Volatile var dnsList: List<InetAddress> = emptyList()
|
||||||
|
) {
|
||||||
|
fun isAvailable(): Boolean = losingMs < System.currentTimeMillis()
|
||||||
|
}
|
||||||
|
|
||||||
|
private val networkInfos = ConcurrentHashMap<Network, NetworkInfo>()
|
||||||
|
|
||||||
|
@Volatile
|
||||||
|
private var curDnsList = emptyList<String>()
|
||||||
|
|
||||||
private val callback = object : ConnectivityManager.NetworkCallback() {
|
private val callback = object : ConnectivityManager.NetworkCallback() {
|
||||||
override fun onAvailable(network: Network) {
|
override fun onAvailable(network: Network) {
|
||||||
actions.trySendBlocking(Action(Action.Type.Available, network))
|
Log.i("NetworkObserve onAvailable network=$network")
|
||||||
|
networkInfos[network] = NetworkInfo()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onLosing(network: Network, maxMsToLive: Int) {
|
||||||
|
Log.i("NetworkObserve onLosing network=$network")
|
||||||
|
networkInfos[network]?.losingMs = System.currentTimeMillis() + maxMsToLive
|
||||||
|
notifyDnsChange()
|
||||||
|
|
||||||
|
networks.trySend(network)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onLost(network: Network) {
|
override fun onLost(network: Network) {
|
||||||
actions.trySendBlocking(Action(Action.Type.Lost, network))
|
Log.i("NetworkObserve onLost network=$network")
|
||||||
|
networkInfos.remove(network)
|
||||||
|
notifyDnsChange()
|
||||||
|
|
||||||
|
networks.trySend(network)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onLinkPropertiesChanged(network: Network, linkProperties: LinkProperties) {
|
override fun onLinkPropertiesChanged(network: Network, linkProperties: LinkProperties) {
|
||||||
actions.trySendBlocking(Action(Action.Type.Changed, network))
|
Log.i("NetworkObserve onLinkPropertiesChanged network=$network $linkProperties")
|
||||||
|
networkInfos[network]?.dnsList = linkProperties.dnsServers
|
||||||
|
notifyDnsChange()
|
||||||
|
|
||||||
|
networks.trySend(network)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onUnavailable() {
|
||||||
|
Log.i("NetworkObserve onUnavailable")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun register(): Boolean {
|
||||||
|
Log.i("NetworkObserve start register")
|
||||||
|
return try {
|
||||||
|
connectivity.registerNetworkCallback(request, callback)
|
||||||
|
|
||||||
|
true
|
||||||
|
} catch (e: Exception) {
|
||||||
|
Log.w("NetworkObserve register failed", e)
|
||||||
|
|
||||||
|
false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun unregister(): Boolean {
|
||||||
|
Log.i("NetworkObserve start unregister")
|
||||||
|
try {
|
||||||
|
connectivity.unregisterNetworkCallback(callback)
|
||||||
|
} catch (e: Exception) {
|
||||||
|
Log.w("NetworkObserve unregister failed", e)
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun networkToInt(entry: Map.Entry<Network, NetworkInfo>): Int {
|
||||||
|
val capabilities = connectivity.getNetworkCapabilities(entry.key)
|
||||||
|
// calculate priority based on transport type, available state
|
||||||
|
// lower value means higher priority
|
||||||
|
// wifi > ethernet > usb tethering > bluetooth tethering > cellular > satellite > other
|
||||||
|
return when {
|
||||||
|
capabilities == null -> 100
|
||||||
|
capabilities.hasTransport(NetworkCapabilities.TRANSPORT_VPN) -> 90
|
||||||
|
capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) -> 0
|
||||||
|
capabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET) -> 1
|
||||||
|
Build.VERSION.SDK_INT >= Build.VERSION_CODES.S && capabilities.hasTransport(NetworkCapabilities.TRANSPORT_USB) -> 2
|
||||||
|
capabilities.hasTransport(NetworkCapabilities.TRANSPORT_BLUETOOTH) -> 3
|
||||||
|
capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) -> 4
|
||||||
|
Build.VERSION.SDK_INT >= Build.VERSION_CODES.VANILLA_ICE_CREAM && capabilities.hasTransport(NetworkCapabilities.TRANSPORT_SATELLITE) -> 5
|
||||||
|
// TRANSPORT_LOWPAN / TRANSPORT_THREAD / TRANSPORT_WIFI_AWARE are not for general internet access, which will not set as default route.
|
||||||
|
else -> 20
|
||||||
|
} + (if (entry.value.isAvailable()) 0 else 10)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun notifyDnsChange() {
|
||||||
|
val dnsList = (networkInfos.asSequence().minByOrNull { networkToInt(it) }?.value?.dnsList
|
||||||
|
?: emptyList()).map { x -> x.asSocketAddressText(53) }
|
||||||
|
val prevDnsList = curDnsList
|
||||||
|
if (dnsList.isNotEmpty() && prevDnsList != dnsList) {
|
||||||
|
Log.i("notifyDnsChange $prevDnsList -> $dnsList")
|
||||||
|
curDnsList = dnsList
|
||||||
|
Clash.notifyDnsChanged(dnsList)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override suspend fun run() {
|
override suspend fun run() {
|
||||||
try {
|
register()
|
||||||
connectivity.registerNetworkCallback(request, callback)
|
|
||||||
} catch (e: Exception) {
|
|
||||||
Log.w("Observe network failed: $e", e)
|
|
||||||
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
val networks = mutableSetOf<Network>()
|
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
val action = actions.receive()
|
val quit = select {
|
||||||
|
networks.onReceive {
|
||||||
|
enqueueEvent(it)
|
||||||
|
|
||||||
val resolveDefault = when (action.type) {
|
|
||||||
Action.Type.Available -> {
|
|
||||||
networks.add(action.network)
|
|
||||||
|
|
||||||
true
|
|
||||||
}
|
|
||||||
Action.Type.Lost -> {
|
|
||||||
networks.remove(action.network)
|
|
||||||
|
|
||||||
true
|
|
||||||
}
|
|
||||||
Action.Type.Changed -> {
|
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (quit) {
|
||||||
val dns = networks.mapNotNull {
|
return
|
||||||
connectivity.resolvePrimaryDns(it)
|
|
||||||
}
|
|
||||||
|
|
||||||
Clash.notifyDnsChanged(dns)
|
|
||||||
|
|
||||||
Log.d("DNS: $dns")
|
|
||||||
|
|
||||||
if (resolveDefault) {
|
|
||||||
val network = networks.maxByOrNull { net ->
|
|
||||||
connectivity.getNetworkCapabilities(net)?.let { cap ->
|
|
||||||
TRANSPORT_PRIORITY.indexOfFirst { cap.hasTransport(it) }
|
|
||||||
} ?: -1
|
|
||||||
}
|
|
||||||
|
|
||||||
enqueueEvent(network)
|
|
||||||
|
|
||||||
Log.d("Network: $network of $networks")
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} finally {
|
} finally {
|
||||||
withContext(NonCancellable) {
|
withContext(NonCancellable) {
|
||||||
enqueueEvent(null)
|
unregister()
|
||||||
|
|
||||||
|
Log.i("NetworkObserve dns = []")
|
||||||
Clash.notifyDnsChanged(emptyList())
|
Clash.notifyDnsChanged(emptyList())
|
||||||
|
|
||||||
runCatching {
|
|
||||||
connectivity.unregisterNetworkCallback(callback)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
|
||||||
private val TRANSPORT_PRIORITY = sequence {
|
|
||||||
yield(NetworkCapabilities.TRANSPORT_CELLULAR)
|
|
||||||
|
|
||||||
if (Build.VERSION.SDK_INT >= 27) {
|
|
||||||
yield(NetworkCapabilities.TRANSPORT_LOWPAN)
|
|
||||||
}
|
|
||||||
|
|
||||||
yield(NetworkCapabilities.TRANSPORT_BLUETOOTH)
|
|
||||||
|
|
||||||
if (Build.VERSION.SDK_INT >= 26) {
|
|
||||||
yield(NetworkCapabilities.TRANSPORT_WIFI_AWARE)
|
|
||||||
}
|
|
||||||
|
|
||||||
yield(NetworkCapabilities.TRANSPORT_WIFI)
|
|
||||||
|
|
||||||
if (Build.VERSION.SDK_INT >= 31) {
|
|
||||||
yield(NetworkCapabilities.TRANSPORT_USB)
|
|
||||||
}
|
|
||||||
|
|
||||||
yield(NetworkCapabilities.TRANSPORT_ETHERNET)
|
|
||||||
}.toList()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -8,6 +8,7 @@ import androidx.core.app.NotificationCompat
|
|||||||
import androidx.core.app.NotificationManagerCompat
|
import androidx.core.app.NotificationManagerCompat
|
||||||
import com.github.kr328.clash.common.compat.getColorCompat
|
import com.github.kr328.clash.common.compat.getColorCompat
|
||||||
import com.github.kr328.clash.common.compat.pendingIntentFlags
|
import com.github.kr328.clash.common.compat.pendingIntentFlags
|
||||||
|
import com.github.kr328.clash.common.compat.startForegroundCompat
|
||||||
import com.github.kr328.clash.common.constants.Components
|
import com.github.kr328.clash.common.constants.Components
|
||||||
import com.github.kr328.clash.common.constants.Intents
|
import com.github.kr328.clash.common.constants.Intents
|
||||||
import com.github.kr328.clash.service.R
|
import com.github.kr328.clash.service.R
|
||||||
@@ -47,7 +48,7 @@ class StaticNotificationModule(service: Service) : Module<Unit>(service) {
|
|||||||
.setContentText(service.getText(R.string.running))
|
.setContentText(service.getText(R.string.running))
|
||||||
.build()
|
.build()
|
||||||
|
|
||||||
service.startForeground(R.id.nf_clash_status, notification)
|
service.startForegroundCompat(R.id.nf_clash_status, notification)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -74,7 +75,7 @@ class StaticNotificationModule(service: Service) : Module<Unit>(service) {
|
|||||||
.setContentTitle(service.getText(R.string.loading))
|
.setContentTitle(service.getText(R.string.loading))
|
||||||
.build()
|
.build()
|
||||||
|
|
||||||
service.startForeground(R.id.nf_clash_status, notification)
|
service.startForegroundCompat(R.id.nf_clash_status, notification)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -7,7 +7,7 @@ import java.net.InetAddress
|
|||||||
fun InetAddress.asSocketAddressText(port: Int): String {
|
fun InetAddress.asSocketAddressText(port: Int): String {
|
||||||
return when (this) {
|
return when (this) {
|
||||||
is Inet6Address ->
|
is Inet6Address ->
|
||||||
"[${numericToTextFormat(this.address)}]:$port"
|
"[${numericToTextFormat(this)}]:$port"
|
||||||
is Inet4Address ->
|
is Inet4Address ->
|
||||||
"${this.hostAddress}:$port"
|
"${this.hostAddress}:$port"
|
||||||
else -> throw IllegalArgumentException("Unsupported Inet type ${this.javaClass}")
|
else -> throw IllegalArgumentException("Unsupported Inet type ${this.javaClass}")
|
||||||
@@ -16,7 +16,8 @@ fun InetAddress.asSocketAddressText(port: Int): String {
|
|||||||
|
|
||||||
private const val INT16SZ = 2
|
private const val INT16SZ = 2
|
||||||
private const val INADDRSZ = 16
|
private const val INADDRSZ = 16
|
||||||
private fun numericToTextFormat(src: ByteArray): String {
|
private fun numericToTextFormat(address: Inet6Address): String {
|
||||||
|
var src = address.getAddress()
|
||||||
val sb = StringBuilder(39)
|
val sb = StringBuilder(39)
|
||||||
for (i in 0 until INADDRSZ / INT16SZ) {
|
for (i in 0 until INADDRSZ / INT16SZ) {
|
||||||
sb.append(
|
sb.append(
|
||||||
@@ -29,6 +30,14 @@ private fun numericToTextFormat(src: ByteArray): String {
|
|||||||
sb.append(":")
|
sb.append(":")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// handle [fe80::1%wlan0] like address from Inet6Address.getHostAddress()
|
||||||
|
// For the Android system, a ScopeId must be carried when initiating a connection to an ipv6 link-local address
|
||||||
|
// Note that the Scope must be returned as an int type, not a string format
|
||||||
|
// Reference: https://github.com/golang/go/issues/68082
|
||||||
|
if (address.getScopeId() > 0) {
|
||||||
|
sb.append("%")
|
||||||
|
sb.append(address.getScopeId())
|
||||||
|
}
|
||||||
return sb.toString()
|
return sb.toString()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,8 +3,7 @@ package com.github.kr328.clash.service.util
|
|||||||
import android.net.ConnectivityManager
|
import android.net.ConnectivityManager
|
||||||
import android.net.Network
|
import android.net.Network
|
||||||
|
|
||||||
fun ConnectivityManager.resolvePrimaryDns(network: Network?): String? {
|
fun ConnectivityManager.resolveDns(network: Network?): List<String> {
|
||||||
val properties = getLinkProperties(network) ?: return null
|
val properties = getLinkProperties(network) ?: return listOf()
|
||||||
|
return properties.dnsServers.map { it.asSocketAddressText(53) }
|
||||||
return properties.dnsServers.firstOrNull()?.asSocketAddressText(53)
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,49 +14,3 @@ pluginManagement {
|
|||||||
gradlePluginPortal()
|
gradlePluginPortal()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencyResolutionManagement {
|
|
||||||
versionCatalogs {
|
|
||||||
create("libs") {
|
|
||||||
val agp = "7.2.1"
|
|
||||||
val kotlin = "1.7.0"
|
|
||||||
val ksp = "$kotlin-1.0.6"
|
|
||||||
val golang = "1.0.4"
|
|
||||||
val coroutine = "1.7.3"
|
|
||||||
val coreKtx = "1.8.0"
|
|
||||||
val activity = "1.5.0"
|
|
||||||
val fragment = "1.5.0"
|
|
||||||
val appcompat = "1.4.2"
|
|
||||||
val coordinator = "1.2.0"
|
|
||||||
val recyclerview = "1.2.1"
|
|
||||||
val viewpager = "1.0.0"
|
|
||||||
val material = "1.6.1"
|
|
||||||
val serialization = "1.3.3"
|
|
||||||
val kaidl = "1.15"
|
|
||||||
val room = "2.4.2"
|
|
||||||
val multiprocess = "1.0.0"
|
|
||||||
|
|
||||||
library("build-android", "com.android.tools.build:gradle:$agp")
|
|
||||||
library("build-kotlin-common", "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin")
|
|
||||||
library("build-kotlin-serialization", "org.jetbrains.kotlin:kotlin-serialization:$kotlin")
|
|
||||||
library("build-ksp", "com.google.devtools.ksp:symbol-processing-gradle-plugin:$ksp")
|
|
||||||
library("build-golang", "com.github.kr328.golang:gradle-plugin:$golang")
|
|
||||||
library("kotlin-coroutine", "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutine")
|
|
||||||
library("kotlin-serialization-json", "org.jetbrains.kotlinx:kotlinx-serialization-json:$serialization")
|
|
||||||
library("androidx-core", "androidx.core:core-ktx:$coreKtx")
|
|
||||||
library("androidx-activity", "androidx.activity:activity:$activity")
|
|
||||||
library("androidx-fragment", "androidx.fragment:fragment:$fragment")
|
|
||||||
library("androidx-appcompat", "androidx.appcompat:appcompat:$appcompat")
|
|
||||||
library("androidx-coordinator", "androidx.coordinatorlayout:coordinatorlayout:$coordinator")
|
|
||||||
library("androidx-recyclerview", "androidx.recyclerview:recyclerview:$recyclerview")
|
|
||||||
library("androidx-viewpager", "androidx.viewpager2:viewpager2:$viewpager")
|
|
||||||
library("androidx-room-compiler", "androidx.room:room-compiler:$room")
|
|
||||||
library("androidx-room-runtime", "androidx.room:room-runtime:$room")
|
|
||||||
library("androidx-room-ktx", "androidx.room:room-ktx:$room")
|
|
||||||
library("google-material", "com.google.android.material:material:$material")
|
|
||||||
library("kaidl-compiler", "com.github.kr328.kaidl:kaidl:$kaidl")
|
|
||||||
library("kaidl-runtime", "com.github.kr328.kaidl:kaidl-runtime:$kaidl")
|
|
||||||
library("rikkax-multiprocess", "dev.rikka.rikkax.preference:multiprocess:$multiprocess")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user