diff --git a/.github/update.log b/.github/update.log index 47adf4569b..19765cccc9 100644 --- a/.github/update.log +++ b/.github/update.log @@ -1130,3 +1130,4 @@ Update On Sat Sep 20 20:32:16 CEST 2025 Update On Sun Sep 21 20:36:55 CEST 2025 Update On Mon Sep 22 20:36:16 CEST 2025 Update On Tue Sep 23 20:37:30 CEST 2025 +Update On Wed Sep 24 20:34:28 CEST 2025 diff --git a/clash-meta-android/build.gradle.kts b/clash-meta-android/build.gradle.kts index 36c40780b0..3ce4386b94 100644 --- a/clash-meta-android/build.gradle.kts +++ b/clash-meta-android/build.gradle.kts @@ -46,8 +46,8 @@ subprojects { minSdk = 21 targetSdk = 35 - versionName = "2.11.16" - versionCode = 211016 + versionName = "2.11.17" + versionCode = 211017 resValue("string", "release_name", "v$versionName") resValue("integer", "release_code", "$versionCode") diff --git a/clash-meta-android/core/src/foss/golang/clash/component/memory/memory.go b/clash-meta-android/core/src/foss/golang/clash/component/memory/memory.go new file mode 100644 index 0000000000..0269c37b1f --- /dev/null +++ b/clash-meta-android/core/src/foss/golang/clash/component/memory/memory.go @@ -0,0 +1,29 @@ +// Package memory return MemoryInfoStat +// modify from https://github.com/shirou/gopsutil/tree/v4.25.8/process +package memory + +import ( + "errors" + "fmt" + "math" +) + +var ErrNotImplementedError = errors.New("not implemented yet") + +type MemoryInfoStat struct { + RSS uint64 `json:"rss"` // bytes + VMS uint64 `json:"vms"` // bytes +} + +// PrettyByteSize convert size in bytes to Bytes, Kilobytes, Megabytes, GB and TB +// https://gist.github.com/anikitenko/b41206a49727b83a530142c76b1cb82d?permalink_comment_id=4467913#gistcomment-4467913 +func PrettyByteSize(b uint64) string { + bf := float64(b) + for _, unit := range []string{"", "Ki", "Mi", "Gi", "Ti", "Pi", "Ei", "Zi"} { + if math.Abs(bf) < 1024.0 { + return fmt.Sprintf("%3.1f%sB", bf, unit) + } + bf /= 1024.0 + } + return fmt.Sprintf("%.1fYiB", bf) +} diff --git a/clash-meta-android/core/src/foss/golang/clash/component/memory/memory_darwin.go b/clash-meta-android/core/src/foss/golang/clash/component/memory/memory_darwin.go new file mode 100644 index 0000000000..1dd33af32a --- /dev/null +++ b/clash-meta-android/core/src/foss/golang/clash/component/memory/memory_darwin.go @@ -0,0 +1,56 @@ +package memory + +import ( + "unsafe" + + "github.com/ebitengine/purego" +) + +const PROC_PIDTASKINFO = 4 + +type ProcTaskInfo struct { + Virtual_size uint64 + Resident_size uint64 + Total_user uint64 + Total_system uint64 + Threads_user uint64 + Threads_system uint64 + Policy int32 + Faults int32 + Pageins int32 + Cow_faults int32 + Messages_sent int32 + Messages_received int32 + Syscalls_mach int32 + Syscalls_unix int32 + Csw int32 + Threadnum int32 + Numrunning int32 + Priority int32 +} + +const System = "/usr/lib/libSystem.B.dylib" + +type ProcPidInfoFunc func(pid, flavor int32, arg uint64, buffer uintptr, bufferSize int32) int32 + +const ProcPidInfoSym = "proc_pidinfo" + +func GetMemoryInfo(pid int32) (*MemoryInfoStat, error) { + lib, err := purego.Dlopen(System, purego.RTLD_LAZY|purego.RTLD_GLOBAL) + if err != nil { + return nil, err + } + defer purego.Dlclose(lib) + + var procPidInfo ProcPidInfoFunc + purego.RegisterLibFunc(&procPidInfo, lib, ProcPidInfoSym) + + var ti ProcTaskInfo + procPidInfo(pid, PROC_PIDTASKINFO, 0, uintptr(unsafe.Pointer(&ti)), int32(unsafe.Sizeof(ti))) + + ret := &MemoryInfoStat{ + RSS: uint64(ti.Resident_size), + VMS: uint64(ti.Virtual_size), + } + return ret, nil +} diff --git a/clash-meta-android/core/src/foss/golang/clash/component/memory/memory_falllback.go b/clash-meta-android/core/src/foss/golang/clash/component/memory/memory_falllback.go new file mode 100644 index 0000000000..918f5b0ec9 --- /dev/null +++ b/clash-meta-android/core/src/foss/golang/clash/component/memory/memory_falllback.go @@ -0,0 +1,7 @@ +//go:build !darwin && !linux && !freebsd && !openbsd && !windows + +package memory + +func GetMemoryInfo(pid int32) (*MemoryInfoStat, error) { + return nil, ErrNotImplementedError +} diff --git a/clash-meta-android/core/src/foss/golang/clash/component/memory/memory_freebsd.go b/clash-meta-android/core/src/foss/golang/clash/component/memory/memory_freebsd.go new file mode 100644 index 0000000000..87166b8493 --- /dev/null +++ b/clash-meta-android/core/src/foss/golang/clash/component/memory/memory_freebsd.go @@ -0,0 +1,97 @@ +package memory + +import ( + "bytes" + "encoding/binary" + "errors" + "unsafe" + + "golang.org/x/sys/unix" +) + +const ( + CTLKern = 1 + KernProc = 14 + KernProcPID = 1 +) + +func CallSyscall(mib []int32) ([]byte, uint64, error) { + mibptr := unsafe.Pointer(&mib[0]) + miblen := uint64(len(mib)) + + // get required buffer size + length := uint64(0) + _, _, err := unix.Syscall6( + unix.SYS___SYSCTL, + uintptr(mibptr), + uintptr(miblen), + 0, + uintptr(unsafe.Pointer(&length)), + 0, + 0) + if err != 0 { + var b []byte + return b, length, err + } + if length == 0 { + var b []byte + return b, length, err + } + // get proc info itself + buf := make([]byte, length) + _, _, err = unix.Syscall6( + unix.SYS___SYSCTL, + uintptr(mibptr), + uintptr(miblen), + uintptr(unsafe.Pointer(&buf[0])), + uintptr(unsafe.Pointer(&length)), + 0, + 0) + if err != 0 { + return buf, length, err + } + + return buf, length, nil +} + +func parseKinfoProc(buf []byte) (KinfoProc, error) { + var k KinfoProc + br := bytes.NewReader(buf) + err := binary.Read(br, binary.LittleEndian, &k) + return k, err +} + +func getKProc(pid int32) (*KinfoProc, error) { + mib := []int32{CTLKern, KernProc, KernProcPID, pid} + + buf, length, err := CallSyscall(mib) + if err != nil { + return nil, err + } + if length != sizeOfKinfoProc { + return nil, errors.New("unexpected size of KinfoProc") + } + + k, err := parseKinfoProc(buf) + if err != nil { + return nil, err + } + return &k, nil +} + +func GetMemoryInfo(pid int32) (*MemoryInfoStat, error) { + k, err := getKProc(pid) + if err != nil { + return nil, err + } + v, err := unix.Sysctl("vm.stats.vm.v_page_size") + if err != nil { + return nil, err + } + pageSize := binary.LittleEndian.Uint16([]byte(v)) + + return &MemoryInfoStat{ + RSS: uint64(k.Rssize) * uint64(pageSize), + VMS: uint64(k.Size), + }, nil +} diff --git a/clash-meta-android/core/src/foss/golang/clash/component/memory/memory_freebsd_386.go b/clash-meta-android/core/src/foss/golang/clash/component/memory/memory_freebsd_386.go new file mode 100644 index 0000000000..85e79c70f2 --- /dev/null +++ b/clash-meta-android/core/src/foss/golang/clash/component/memory/memory_freebsd_386.go @@ -0,0 +1,119 @@ +package memory + +const sizeOfKinfoProc = 0x300 + +type Timeval struct { + Sec int32 + Usec int32 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int32 + Ixrss int32 + Idrss int32 + Isrss int32 + Minflt int32 + Majflt int32 + Nswap int32 + Inblock int32 + Oublock int32 + Msgsnd int32 + Msgrcv int32 + Nsignals int32 + Nvcsw int32 + Nivcsw int32 +} + +type KinfoProc struct { + Structsize int32 + Layout int32 + Args int32 /* pargs */ + Paddr int32 /* proc */ + Addr int32 /* user */ + Tracep int32 /* vnode */ + Textvp int32 /* vnode */ + Fd int32 /* filedesc */ + Vmspace int32 /* vmspace */ + Wchan int32 + Pid int32 + Ppid int32 + Pgid int32 + Tpgid int32 + Sid int32 + Tsid int32 + Jobc int16 + Spare_short1 int16 + Tdev uint32 + Siglist [16]byte /* sigset */ + Sigmask [16]byte /* sigset */ + Sigignore [16]byte /* sigset */ + Sigcatch [16]byte /* sigset */ + Uid uint32 + Ruid uint32 + Svuid uint32 + Rgid uint32 + Svgid uint32 + Ngroups int16 + Spare_short2 int16 + Groups [16]uint32 + Size uint32 + Rssize int32 + Swrss int32 + Tsize int32 + Dsize int32 + Ssize int32 + Xstat uint16 + Acflag uint16 + Pctcpu uint32 + Estcpu uint32 + Slptime uint32 + Swtime uint32 + Cow uint32 + Runtime uint64 + Start Timeval + Childtime Timeval + Flag int32 + Kiflag int32 + Traceflag int32 + Stat int8 + Nice int8 + Lock int8 + Rqindex int8 + Oncpu uint8 + Lastcpu uint8 + Tdname [17]int8 + Wmesg [9]int8 + Login [18]int8 + Lockname [9]int8 + Comm [20]int8 + Emul [17]int8 + Loginclass [18]int8 + Sparestrings [50]int8 + Spareints [7]int32 + Flag2 int32 + Fibnum int32 + Cr_flags uint32 + Jid int32 + Numthreads int32 + Tid int32 + Pri Priority + Rusage Rusage + Rusage_ch Rusage + Pcb int32 /* pcb */ + Kstack int32 + Udata int32 + Tdaddr int32 /* thread */ + Spareptrs [6]int32 + Sparelongs [12]int32 + Sflag int32 + Tdflags int32 +} + +type Priority struct { + Class uint8 + Level uint8 + Native uint8 + User uint8 +} diff --git a/clash-meta-android/core/src/foss/golang/clash/component/memory/memory_freebsd_amd64.go b/clash-meta-android/core/src/foss/golang/clash/component/memory/memory_freebsd_amd64.go new file mode 100644 index 0000000000..2cebd34c2b --- /dev/null +++ b/clash-meta-android/core/src/foss/golang/clash/component/memory/memory_freebsd_amd64.go @@ -0,0 +1,125 @@ +package memory + +const sizeOfKinfoProc = 0x440 + +type Timeval struct { + Sec int64 + Usec int64 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int64 + Ixrss int64 + Idrss int64 + Isrss int64 + Minflt int64 + Majflt int64 + Nswap int64 + Inblock int64 + Oublock int64 + Msgsnd int64 + Msgrcv int64 + Nsignals int64 + Nvcsw int64 + Nivcsw int64 +} + +type KinfoProc struct { + Structsize int32 + Layout int32 + Args int64 /* pargs */ + Paddr int64 /* proc */ + Addr int64 /* user */ + Tracep int64 /* vnode */ + Textvp int64 /* vnode */ + Fd int64 /* filedesc */ + Vmspace int64 /* vmspace */ + Wchan int64 + Pid int32 + Ppid int32 + Pgid int32 + Tpgid int32 + Sid int32 + Tsid int32 + Jobc int16 + Spare_short1 int16 + Tdev_freebsd11 uint32 + Siglist [16]byte /* sigset */ + Sigmask [16]byte /* sigset */ + Sigignore [16]byte /* sigset */ + Sigcatch [16]byte /* sigset */ + Uid uint32 + Ruid uint32 + Svuid uint32 + Rgid uint32 + Svgid uint32 + Ngroups int16 + Spare_short2 int16 + Groups [16]uint32 + Size uint64 + Rssize int64 + Swrss int64 + Tsize int64 + Dsize int64 + Ssize int64 + Xstat uint16 + Acflag uint16 + Pctcpu uint32 + Estcpu uint32 + Slptime uint32 + Swtime uint32 + Cow uint32 + Runtime uint64 + Start Timeval + Childtime Timeval + Flag int64 + Kiflag int64 + Traceflag int32 + Stat int8 + Nice int8 + Lock int8 + Rqindex int8 + Oncpu_old uint8 + Lastcpu_old uint8 + Tdname [17]int8 + Wmesg [9]int8 + Login [18]int8 + Lockname [9]int8 + Comm [20]int8 + Emul [17]int8 + Loginclass [18]int8 + Moretdname [4]int8 + Sparestrings [46]int8 + Spareints [2]int32 + Tdev uint64 + Oncpu int32 + Lastcpu int32 + Tracer int32 + Flag2 int32 + Fibnum int32 + Cr_flags uint32 + Jid int32 + Numthreads int32 + Tid int32 + Pri Priority + Rusage Rusage + Rusage_ch Rusage + Pcb int64 /* pcb */ + Kstack int64 + Udata int64 + Tdaddr int64 /* thread */ + Pd int64 /* pwddesc, not accurate */ + Spareptrs [5]int64 + Sparelongs [12]int64 + Sflag int64 + Tdflags int64 +} + +type Priority struct { + Class uint8 + Level uint8 + Native uint8 + User uint8 +} diff --git a/clash-meta-android/core/src/foss/golang/clash/component/memory/memory_freebsd_arm.go b/clash-meta-android/core/src/foss/golang/clash/component/memory/memory_freebsd_arm.go new file mode 100644 index 0000000000..9c9c220024 --- /dev/null +++ b/clash-meta-android/core/src/foss/golang/clash/component/memory/memory_freebsd_arm.go @@ -0,0 +1,119 @@ +package memory + +const sizeOfKinfoProc = 0x440 + +type Timeval struct { + Sec int64 + Usec int64 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int32 + Ixrss int32 + Idrss int32 + Isrss int32 + Minflt int32 + Majflt int32 + Nswap int32 + Inblock int32 + Oublock int32 + Msgsnd int32 + Msgrcv int32 + Nsignals int32 + Nvcsw int32 + Nivcsw int32 +} + +type KinfoProc struct { + Structsize int32 + Layout int32 + Args int32 /* pargs */ + Paddr int32 /* proc */ + Addr int32 /* user */ + Tracep int32 /* vnode */ + Textvp int32 /* vnode */ + Fd int32 /* filedesc */ + Vmspace int32 /* vmspace */ + Wchan int32 + Pid int32 + Ppid int32 + Pgid int32 + Tpgid int32 + Sid int32 + Tsid int32 + Jobc int16 + Spare_short1 int16 + Tdev uint32 + Siglist [16]byte /* sigset */ + Sigmask [16]byte /* sigset */ + Sigignore [16]byte /* sigset */ + Sigcatch [16]byte /* sigset */ + Uid uint32 + Ruid uint32 + Svuid uint32 + Rgid uint32 + Svgid uint32 + Ngroups int16 + Spare_short2 int16 + Groups [16]uint32 + Size uint32 + Rssize int32 + Swrss int32 + Tsize int32 + Dsize int32 + Ssize int32 + Xstat uint16 + Acflag uint16 + Pctcpu uint32 + Estcpu uint32 + Slptime uint32 + Swtime uint32 + Cow uint32 + Runtime uint64 + Start Timeval + Childtime Timeval + Flag int32 + Kiflag int32 + Traceflag int32 + Stat int8 + Nice int8 + Lock int8 + Rqindex int8 + Oncpu uint8 + Lastcpu uint8 + Tdname [17]int8 + Wmesg [9]int8 + Login [18]int8 + Lockname [9]int8 + Comm [20]int8 + Emul [17]int8 + Loginclass [18]int8 + Sparestrings [50]int8 + Spareints [4]int32 + Flag2 int32 + Fibnum int32 + Cr_flags uint32 + Jid int32 + Numthreads int32 + Tid int32 + Pri Priority + Rusage Rusage + Rusage_ch Rusage + Pcb int32 /* pcb */ + Kstack int32 + Udata int32 + Tdaddr int32 /* thread */ + Spareptrs [6]int64 + Sparelongs [12]int64 + Sflag int64 + Tdflags int64 +} + +type Priority struct { + Class uint8 + Level uint8 + Native uint8 + User uint8 +} diff --git a/clash-meta-android/core/src/foss/golang/clash/component/memory/memory_freebsd_arm64.go b/clash-meta-android/core/src/foss/golang/clash/component/memory/memory_freebsd_arm64.go new file mode 100644 index 0000000000..4e228c9211 --- /dev/null +++ b/clash-meta-android/core/src/foss/golang/clash/component/memory/memory_freebsd_arm64.go @@ -0,0 +1,125 @@ +package memory + +const sizeOfKinfoProc = 0x440 + +type Timeval struct { + Sec int64 + Usec int64 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int64 + Ixrss int64 + Idrss int64 + Isrss int64 + Minflt int64 + Majflt int64 + Nswap int64 + Inblock int64 + Oublock int64 + Msgsnd int64 + Msgrcv int64 + Nsignals int64 + Nvcsw int64 + Nivcsw int64 +} + +type KinfoProc struct { + Structsize int32 + Layout int32 + Args int64 /* pargs */ + Paddr int64 /* proc */ + Addr int64 /* user */ + Tracep int64 /* vnode */ + Textvp int64 /* vnode */ + Fd int64 /* filedesc */ + Vmspace int64 /* vmspace */ + Wchan int64 + Pid int32 + Ppid int32 + Pgid int32 + Tpgid int32 + Sid int32 + Tsid int32 + Jobc int16 + Spare_short1 int16 + Tdev_freebsd11 uint32 + Siglist [16]byte /* sigset */ + Sigmask [16]byte /* sigset */ + Sigignore [16]byte /* sigset */ + Sigcatch [16]byte /* sigset */ + Uid uint32 + Ruid uint32 + Svuid uint32 + Rgid uint32 + Svgid uint32 + Ngroups int16 + Spare_short2 int16 + Groups [16]uint32 + Size uint64 + Rssize int64 + Swrss int64 + Tsize int64 + Dsize int64 + Ssize int64 + Xstat uint16 + Acflag uint16 + Pctcpu uint32 + Estcpu uint32 + Slptime uint32 + Swtime uint32 + Cow uint32 + Runtime uint64 + Start Timeval + Childtime Timeval + Flag int64 + Kiflag int64 + Traceflag int32 + Stat uint8 + Nice int8 + Lock uint8 + Rqindex uint8 + Oncpu_old uint8 + Lastcpu_old uint8 + Tdname [17]uint8 + Wmesg [9]uint8 + Login [18]uint8 + Lockname [9]uint8 + Comm [20]int8 // changed from uint8 by hand + Emul [17]uint8 + Loginclass [18]uint8 + Moretdname [4]uint8 + Sparestrings [46]uint8 + Spareints [2]int32 + Tdev uint64 + Oncpu int32 + Lastcpu int32 + Tracer int32 + Flag2 int32 + Fibnum int32 + Cr_flags uint32 + Jid int32 + Numthreads int32 + Tid int32 + Pri Priority + Rusage Rusage + Rusage_ch Rusage + Pcb int64 /* pcb */ + Kstack int64 + Udata int64 + Tdaddr int64 /* thread */ + Pd int64 /* pwddesc, not accurate */ + Spareptrs [5]int64 + Sparelongs [12]int64 + Sflag int64 + Tdflags int64 +} + +type Priority struct { + Class uint8 + Level uint8 + Native uint8 + User uint8 +} diff --git a/clash-meta-android/core/src/foss/golang/clash/component/memory/memory_linux.go b/clash-meta-android/core/src/foss/golang/clash/component/memory/memory_linux.go new file mode 100644 index 0000000000..f79bc28fcb --- /dev/null +++ b/clash-meta-android/core/src/foss/golang/clash/component/memory/memory_linux.go @@ -0,0 +1,37 @@ +package memory + +import ( + "os" + "path/filepath" + "strconv" + "strings" +) + +var pageSize = uint64(os.Getpagesize()) + +func GetMemoryInfo(pid int32) (*MemoryInfoStat, error) { + proc := os.Getenv("HOST_PROC") + if proc == "" { + proc = "/proc" + } + memPath := filepath.Join(proc, strconv.Itoa(int(pid)), "statm") + contents, err := os.ReadFile(memPath) + if err != nil { + return nil, err + } + fields := strings.Split(string(contents), " ") + + vms, err := strconv.ParseUint(fields[0], 10, 64) + if err != nil { + return nil, err + } + rss, err := strconv.ParseUint(fields[1], 10, 64) + if err != nil { + return nil, err + } + memInfo := &MemoryInfoStat{ + RSS: rss * pageSize, + VMS: vms * pageSize, + } + return memInfo, nil +} diff --git a/clash-meta-android/core/src/foss/golang/clash/component/memory/memory_openbsd.go b/clash-meta-android/core/src/foss/golang/clash/component/memory/memory_openbsd.go new file mode 100644 index 0000000000..e4e89996bd --- /dev/null +++ b/clash-meta-android/core/src/foss/golang/clash/component/memory/memory_openbsd.go @@ -0,0 +1,95 @@ +package memory + +import ( + "bytes" + "encoding/binary" + "errors" + "unsafe" + + "golang.org/x/sys/unix" +) + +const ( + CTLKern = 1 + KernProc = 14 + KernProcPID = 1 +) + +func callKernProcSyscall(op int32, arg int32) ([]byte, uint64, error) { + mib := []int32{CTLKern, KernProc, op, arg, sizeOfKinfoProc, 0} + mibptr := unsafe.Pointer(&mib[0]) + miblen := uint64(len(mib)) + length := uint64(0) + _, _, err := unix.Syscall6( + unix.SYS___SYSCTL, + uintptr(mibptr), + uintptr(miblen), + 0, + uintptr(unsafe.Pointer(&length)), + 0, + 0) + if err != 0 { + return nil, length, err + } + + count := int32(length / uint64(sizeOfKinfoProc)) + mib = []int32{CTLKern, KernProc, op, arg, sizeOfKinfoProc, count} + mibptr = unsafe.Pointer(&mib[0]) + miblen = uint64(len(mib)) + // get proc info itself + buf := make([]byte, length) + _, _, err = unix.Syscall6( + unix.SYS___SYSCTL, + uintptr(mibptr), + uintptr(miblen), + uintptr(unsafe.Pointer(&buf[0])), + uintptr(unsafe.Pointer(&length)), + 0, + 0) + if err != 0 { + return buf, length, err + } + + return buf, length, nil +} + +func parseKinfoProc(buf []byte) (KinfoProc, error) { + var k KinfoProc + br := bytes.NewReader(buf) + err := binary.Read(br, binary.LittleEndian, &k) + return k, err +} + +func getKProc(pid int32) (*KinfoProc, error) { + buf, length, err := callKernProcSyscall(KernProcPID, pid) + if err != nil { + return nil, err + } + if length != sizeOfKinfoProc { + return nil, errors.New("unexpected size of KinfoProc") + } + + k, err := parseKinfoProc(buf) + if err != nil { + return nil, err + } + return &k, nil +} + +func GetMemoryInfo(pid int32) (*MemoryInfoStat, error) { + k, err := getKProc(pid) + if err != nil { + return nil, err + } + uvmexp, err := unix.SysctlUvmexp("vm.uvmexp") + if err != nil { + return nil, err + } + pageSize := uint64(uvmexp.Pagesize) + + return &MemoryInfoStat{ + RSS: uint64(k.Vm_rssize) * pageSize, + VMS: uint64(k.Vm_tsize) + uint64(k.Vm_dsize) + + uint64(k.Vm_ssize), + }, nil +} diff --git a/clash-meta-android/core/src/foss/golang/clash/component/memory/memory_openbsd_386.go b/clash-meta-android/core/src/foss/golang/clash/component/memory/memory_openbsd_386.go new file mode 100644 index 0000000000..ead031754f --- /dev/null +++ b/clash-meta-android/core/src/foss/golang/clash/component/memory/memory_openbsd_386.go @@ -0,0 +1,99 @@ +package memory + +const sizeOfKinfoProc = 0x264 + +type KinfoProc struct { + Forw uint64 + Back uint64 + Paddr uint64 + Addr uint64 + Fd uint64 + Stats uint64 + Limit uint64 + Vmspace uint64 + Sigacts uint64 + Sess uint64 + Tsess uint64 + Ru uint64 + Eflag int32 + Exitsig int32 + Flag int32 + Pid int32 + Ppid int32 + Sid int32 + X_pgid int32 + Tpgid int32 + Uid uint32 + Ruid uint32 + Gid uint32 + Rgid uint32 + Groups [16]uint32 + Ngroups int16 + Jobc int16 + Tdev uint32 + Estcpu uint32 + Rtime_sec uint32 + Rtime_usec uint32 + Cpticks int32 + Pctcpu uint32 + Swtime uint32 + Slptime uint32 + Schedflags int32 + Uticks uint64 + Sticks uint64 + Iticks uint64 + Tracep uint64 + Traceflag int32 + Holdcnt int32 + Siglist int32 + Sigmask uint32 + Sigignore uint32 + Sigcatch uint32 + Stat int8 + Priority uint8 + Usrpri uint8 + Nice uint8 + Xstat uint16 + Acflag uint16 + Comm [24]int8 + Wmesg [8]int8 + Wchan uint64 + Login [32]int8 + Vm_rssize int32 + Vm_tsize int32 + Vm_dsize int32 + Vm_ssize int32 + Uvalid int64 + Ustart_sec uint64 + Ustart_usec uint32 + Uutime_sec uint32 + Uutime_usec uint32 + Ustime_sec uint32 + Ustime_usec uint32 + Uru_maxrss uint64 + Uru_ixrss uint64 + Uru_idrss uint64 + Uru_isrss uint64 + Uru_minflt uint64 + Uru_majflt uint64 + Uru_nswap uint64 + Uru_inblock uint64 + Uru_oublock uint64 + Uru_msgsnd uint64 + Uru_msgrcv uint64 + Uru_nsignals uint64 + Uru_nvcsw uint64 + Uru_nivcsw uint64 + Uctime_sec uint32 + Uctime_usec uint32 + Psflags int32 + Spare int32 + Svuid uint32 + Svgid uint32 + Emul [8]int8 + Rlim_rss_cur uint64 + Cpuid uint64 + Vm_map_size uint64 + Tid int32 + Rtableid uint32 +} diff --git a/clash-meta-android/core/src/foss/golang/clash/component/memory/memory_openbsd_amd64.go b/clash-meta-android/core/src/foss/golang/clash/component/memory/memory_openbsd_amd64.go new file mode 100644 index 0000000000..1f9ae2d38a --- /dev/null +++ b/clash-meta-android/core/src/foss/golang/clash/component/memory/memory_openbsd_amd64.go @@ -0,0 +1,100 @@ +package memory + +const sizeOfKinfoProc = 0x268 + +type KinfoProc struct { + Forw uint64 + Back uint64 + Paddr uint64 + Addr uint64 + Fd uint64 + Stats uint64 + Limit uint64 + Vmspace uint64 + Sigacts uint64 + Sess uint64 + Tsess uint64 + Ru uint64 + Eflag int32 + Exitsig int32 + Flag int32 + Pid int32 + Ppid int32 + Sid int32 + X_pgid int32 + Tpgid int32 + Uid uint32 + Ruid uint32 + Gid uint32 + Rgid uint32 + Groups [16]uint32 + Ngroups int16 + Jobc int16 + Tdev uint32 + Estcpu uint32 + Rtime_sec uint32 + Rtime_usec uint32 + Cpticks int32 + Pctcpu uint32 + Swtime uint32 + Slptime uint32 + Schedflags int32 + Uticks uint64 + Sticks uint64 + Iticks uint64 + Tracep uint64 + Traceflag int32 + Holdcnt int32 + Siglist int32 + Sigmask uint32 + Sigignore uint32 + Sigcatch uint32 + Stat int8 + Priority uint8 + Usrpri uint8 + Nice uint8 + Xstat uint16 + Acflag uint16 + Comm [24]int8 + Wmesg [8]int8 + Wchan uint64 + Login [32]int8 + Vm_rssize int32 + Vm_tsize int32 + Vm_dsize int32 + Vm_ssize int32 + Uvalid int64 + Ustart_sec uint64 + Ustart_usec uint32 + Uutime_sec uint32 + Uutime_usec uint32 + Ustime_sec uint32 + Ustime_usec uint32 + Pad_cgo_0 [4]byte + Uru_maxrss uint64 + Uru_ixrss uint64 + Uru_idrss uint64 + Uru_isrss uint64 + Uru_minflt uint64 + Uru_majflt uint64 + Uru_nswap uint64 + Uru_inblock uint64 + Uru_oublock uint64 + Uru_msgsnd uint64 + Uru_msgrcv uint64 + Uru_nsignals uint64 + Uru_nvcsw uint64 + Uru_nivcsw uint64 + Uctime_sec uint32 + Uctime_usec uint32 + Psflags int32 + Spare int32 + Svuid uint32 + Svgid uint32 + Emul [8]int8 + Rlim_rss_cur uint64 + Cpuid uint64 + Vm_map_size uint64 + Tid int32 + Rtableid uint32 +} diff --git a/clash-meta-android/core/src/foss/golang/clash/component/memory/memory_openbsd_arm.go b/clash-meta-android/core/src/foss/golang/clash/component/memory/memory_openbsd_arm.go new file mode 100644 index 0000000000..ead031754f --- /dev/null +++ b/clash-meta-android/core/src/foss/golang/clash/component/memory/memory_openbsd_arm.go @@ -0,0 +1,99 @@ +package memory + +const sizeOfKinfoProc = 0x264 + +type KinfoProc struct { + Forw uint64 + Back uint64 + Paddr uint64 + Addr uint64 + Fd uint64 + Stats uint64 + Limit uint64 + Vmspace uint64 + Sigacts uint64 + Sess uint64 + Tsess uint64 + Ru uint64 + Eflag int32 + Exitsig int32 + Flag int32 + Pid int32 + Ppid int32 + Sid int32 + X_pgid int32 + Tpgid int32 + Uid uint32 + Ruid uint32 + Gid uint32 + Rgid uint32 + Groups [16]uint32 + Ngroups int16 + Jobc int16 + Tdev uint32 + Estcpu uint32 + Rtime_sec uint32 + Rtime_usec uint32 + Cpticks int32 + Pctcpu uint32 + Swtime uint32 + Slptime uint32 + Schedflags int32 + Uticks uint64 + Sticks uint64 + Iticks uint64 + Tracep uint64 + Traceflag int32 + Holdcnt int32 + Siglist int32 + Sigmask uint32 + Sigignore uint32 + Sigcatch uint32 + Stat int8 + Priority uint8 + Usrpri uint8 + Nice uint8 + Xstat uint16 + Acflag uint16 + Comm [24]int8 + Wmesg [8]int8 + Wchan uint64 + Login [32]int8 + Vm_rssize int32 + Vm_tsize int32 + Vm_dsize int32 + Vm_ssize int32 + Uvalid int64 + Ustart_sec uint64 + Ustart_usec uint32 + Uutime_sec uint32 + Uutime_usec uint32 + Ustime_sec uint32 + Ustime_usec uint32 + Uru_maxrss uint64 + Uru_ixrss uint64 + Uru_idrss uint64 + Uru_isrss uint64 + Uru_minflt uint64 + Uru_majflt uint64 + Uru_nswap uint64 + Uru_inblock uint64 + Uru_oublock uint64 + Uru_msgsnd uint64 + Uru_msgrcv uint64 + Uru_nsignals uint64 + Uru_nvcsw uint64 + Uru_nivcsw uint64 + Uctime_sec uint32 + Uctime_usec uint32 + Psflags int32 + Spare int32 + Svuid uint32 + Svgid uint32 + Emul [8]int8 + Rlim_rss_cur uint64 + Cpuid uint64 + Vm_map_size uint64 + Tid int32 + Rtableid uint32 +} diff --git a/clash-meta-android/core/src/foss/golang/clash/component/memory/memory_openbsd_arm64.go b/clash-meta-android/core/src/foss/golang/clash/component/memory/memory_openbsd_arm64.go new file mode 100644 index 0000000000..f0fb9107a8 --- /dev/null +++ b/clash-meta-android/core/src/foss/golang/clash/component/memory/memory_openbsd_arm64.go @@ -0,0 +1,100 @@ +package memory + +const sizeOfKinfoProc = 0x270 + +type KinfoProc struct { + Forw uint64 + Back uint64 + Paddr uint64 + Addr uint64 + Fd uint64 + Stats uint64 + Limit uint64 + Vmspace uint64 + Sigacts uint64 + Sess uint64 + Tsess uint64 + Ru uint64 + Eflag int32 + Exitsig int32 + Flag int32 + Pid int32 + Ppid int32 + Sid int32 + X_pgid int32 + Tpgid int32 + Uid uint32 + Ruid uint32 + Gid uint32 + Rgid uint32 + Groups [16]uint32 + Ngroups int16 + Jobc int16 + Tdev uint32 + Estcpu uint32 + Rtime_sec uint32 + Rtime_usec uint32 + Cpticks int32 + Pctcpu uint32 + Swtime uint32 + Slptime uint32 + Schedflags int32 + Uticks uint64 + Sticks uint64 + Iticks uint64 + Tracep uint64 + Traceflag int32 + Holdcnt int32 + Siglist int32 + Sigmask uint32 + Sigignore uint32 + Sigcatch uint32 + Stat int8 + Priority uint8 + Usrpri uint8 + Nice uint8 + Xstat uint16 + Acflag uint16 + Comm [24]int8 + Wmesg [8]uint8 + Wchan uint64 + Login [32]uint8 + Vm_rssize int32 + Vm_tsize int32 + Vm_dsize int32 + Vm_ssize int32 + Uvalid int64 + Ustart_sec uint64 + Ustart_usec uint32 + Uutime_sec uint32 + Uutime_usec uint32 + Ustime_sec uint32 + Ustime_usec uint32 + Uru_maxrss uint64 + Uru_ixrss uint64 + Uru_idrss uint64 + Uru_isrss uint64 + Uru_minflt uint64 + Uru_majflt uint64 + Uru_nswap uint64 + Uru_inblock uint64 + Uru_oublock uint64 + Uru_msgsnd uint64 + Uru_msgrcv uint64 + Uru_nsignals uint64 + Uru_nvcsw uint64 + Uru_nivcsw uint64 + Uctime_sec uint32 + Uctime_usec uint32 + Psflags uint32 + Spare int32 + Svuid uint32 + Svgid uint32 + Emul [8]uint8 + Rlim_rss_cur uint64 + Cpuid uint64 + Vm_map_size uint64 + Tid int32 + Rtableid uint32 + Pledge uint64 +} diff --git a/clash-meta-android/core/src/foss/golang/clash/component/memory/memory_openbsd_riscv64.go b/clash-meta-android/core/src/foss/golang/clash/component/memory/memory_openbsd_riscv64.go new file mode 100644 index 0000000000..3b60d19bc7 --- /dev/null +++ b/clash-meta-android/core/src/foss/golang/clash/component/memory/memory_openbsd_riscv64.go @@ -0,0 +1,101 @@ +package memory + +const sizeOfKinfoProc = 0x288 + +type KinfoProc struct { + Forw uint64 + Back uint64 + Paddr uint64 + Addr uint64 + Fd uint64 + Stats uint64 + Limit uint64 + Vmspace uint64 + Sigacts uint64 + Sess uint64 + Tsess uint64 + Ru uint64 + Eflag int32 + Exitsig int32 + Flag int32 + Pid int32 + Ppid int32 + Sid int32 + X_pgid int32 + Tpgid int32 + Uid uint32 + Ruid uint32 + Gid uint32 + Rgid uint32 + Groups [16]uint32 + Ngroups int16 + Jobc int16 + Tdev uint32 + Estcpu uint32 + Rtime_sec uint32 + Rtime_usec uint32 + Cpticks int32 + Pctcpu uint32 + Swtime uint32 + Slptime uint32 + Schedflags int32 + Uticks uint64 + Sticks uint64 + Iticks uint64 + Tracep uint64 + Traceflag int32 + Holdcnt int32 + Siglist int32 + Sigmask uint32 + Sigignore uint32 + Sigcatch uint32 + Stat int8 + Priority uint8 + Usrpri uint8 + Nice uint8 + Xstat uint16 + Spare uint16 + Comm [24]int8 + Wmesg [8]uint8 + Wchan uint64 + Login [32]uint8 + Vm_rssize int32 + Vm_tsize int32 + Vm_dsize int32 + Vm_ssize int32 + Uvalid int64 + Ustart_sec uint64 + Ustart_usec uint32 + Uutime_sec uint32 + Uutime_usec uint32 + Ustime_sec uint32 + Ustime_usec uint32 + Uru_maxrss uint64 + Uru_ixrss uint64 + Uru_idrss uint64 + Uru_isrss uint64 + Uru_minflt uint64 + Uru_majflt uint64 + Uru_nswap uint64 + Uru_inblock uint64 + Uru_oublock uint64 + Uru_msgsnd uint64 + Uru_msgrcv uint64 + Uru_nsignals uint64 + Uru_nvcsw uint64 + Uru_nivcsw uint64 + Uctime_sec uint32 + Uctime_usec uint32 + Psflags uint32 + Acflag uint32 + Svuid uint32 + Svgid uint32 + Emul [8]uint8 + Rlim_rss_cur uint64 + Cpuid uint64 + Vm_map_size uint64 + Tid int32 + Rtableid uint32 + Pledge uint64 + Name [24]uint8 +} diff --git a/clash-meta-android/core/src/foss/golang/clash/component/memory/memory_test.go b/clash-meta-android/core/src/foss/golang/clash/component/memory/memory_test.go new file mode 100644 index 0000000000..0af163be71 --- /dev/null +++ b/clash-meta-android/core/src/foss/golang/clash/component/memory/memory_test.go @@ -0,0 +1,23 @@ +package memory + +import ( + "errors" + "os" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestMemoryInfo(t *testing.T) { + v, err := GetMemoryInfo(int32(os.Getpid())) + if errors.Is(err, ErrNotImplementedError) { + t.Skip("not implemented") + } + require.NoErrorf(t, err, "getting memory info error %v", err) + empty := MemoryInfoStat{} + if v == nil || *v == empty { + t.Errorf("could not get memory info %v", v) + } else { + t.Logf("memory info {RSS:%s, VMS:%s}", PrettyByteSize(v.RSS), PrettyByteSize(v.VMS)) + } +} diff --git a/clash-meta-android/core/src/foss/golang/clash/component/memory/memory_windows.go b/clash-meta-android/core/src/foss/golang/clash/component/memory/memory_windows.go new file mode 100644 index 0000000000..04dad08438 --- /dev/null +++ b/clash-meta-android/core/src/foss/golang/clash/component/memory/memory_windows.go @@ -0,0 +1,66 @@ +package memory + +import ( + "syscall" + "unsafe" + + "golang.org/x/sys/windows" +) + +var ( + modpsapi = windows.NewLazySystemDLL("psapi.dll") + procGetProcessMemoryInfo = modpsapi.NewProc("GetProcessMemoryInfo") +) + +const processQueryInformation = windows.PROCESS_QUERY_LIMITED_INFORMATION + +type PROCESS_MEMORY_COUNTERS struct { + CB uint32 + PageFaultCount uint32 + PeakWorkingSetSize uint64 + WorkingSetSize uint64 + QuotaPeakPagedPoolUsage uint64 + QuotaPagedPoolUsage uint64 + QuotaPeakNonPagedPoolUsage uint64 + QuotaNonPagedPoolUsage uint64 + PagefileUsage uint64 + PeakPagefileUsage uint64 +} + +func getProcessMemoryInfo(h windows.Handle, mem *PROCESS_MEMORY_COUNTERS) (err error) { + r1, _, e1 := syscall.Syscall(procGetProcessMemoryInfo.Addr(), 3, uintptr(h), uintptr(unsafe.Pointer(mem)), uintptr(unsafe.Sizeof(*mem))) + if r1 == 0 { + if e1 != 0 { + err = error(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func getMemoryInfo(pid int32) (PROCESS_MEMORY_COUNTERS, error) { + var mem PROCESS_MEMORY_COUNTERS + c, err := windows.OpenProcess(processQueryInformation, false, uint32(pid)) + if err != nil { + return mem, err + } + defer windows.CloseHandle(c) + if err := getProcessMemoryInfo(c, &mem); err != nil { + return mem, err + } + + return mem, err +} + +func GetMemoryInfo(pid int32) (*MemoryInfoStat, error) { + mem, err := getMemoryInfo(pid) + if err != nil { + return nil, err + } + ret := &MemoryInfoStat{ + RSS: uint64(mem.WorkingSetSize), + VMS: uint64(mem.PagefileUsage), + } + return ret, nil +} diff --git a/clash-meta-android/core/src/foss/golang/clash/go.mod b/clash-meta-android/core/src/foss/golang/clash/go.mod index d807b73219..6b7a8d6997 100644 --- a/clash-meta-android/core/src/foss/golang/clash/go.mod +++ b/clash-meta-android/core/src/foss/golang/clash/go.mod @@ -6,6 +6,7 @@ require ( github.com/bahlo/generic-list-go v0.2.0 github.com/coreos/go-iptables v0.8.0 github.com/dlclark/regexp2 v1.11.5 + github.com/ebitengine/purego v0.9.0 github.com/enfein/mieru/v3 v3.20.0 github.com/go-chi/chi/v5 v5.2.3 github.com/go-chi/render v1.0.3 @@ -37,7 +38,7 @@ require ( github.com/metacubex/sing-wireguard v0.0.0-20250503063753-2dc62acc626f github.com/metacubex/smux v0.0.0-20250922175018-15c9a6a78719 github.com/metacubex/tfo-go v0.0.0-20250921095601-b102db4216c0 - github.com/metacubex/utls v1.8.1-0.20250923145048-0a5bbc90dd3e + github.com/metacubex/utls v1.8.1 github.com/metacubex/wireguard-go v0.0.0-20250820062549-a6cecdd7f57f github.com/miekg/dns v1.1.63 // lastest version compatible with golang1.20 github.com/mroth/weightedrand/v2 v2.1.0 @@ -46,7 +47,6 @@ require ( github.com/sagernet/cors v1.2.1 github.com/sagernet/netlink v0.0.0-20240612041022-b9a21c07ac6a github.com/samber/lo v1.51.0 - github.com/shirou/gopsutil/v4 v4.25.1 // lastest version compatible with golang1.20 github.com/sirupsen/logrus v1.9.3 github.com/stretchr/testify v1.11.1 github.com/vmihailenco/msgpack/v5 v5.4.1 @@ -70,7 +70,6 @@ require ( github.com/andybalholm/brotli v1.0.6 // indirect github.com/buger/jsonparser v1.1.1 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/ebitengine/purego v0.8.4 // indirect github.com/ericlagergren/aegis v0.0.0-20250325060835-cd0defd64358 // indirect github.com/ericlagergren/polyval v0.0.0-20220411101811-e25bc10ba391 // indirect github.com/ericlagergren/siv v0.0.0-20220507050439-0b757b3aa5f1 // indirect @@ -88,7 +87,6 @@ require ( github.com/klauspost/cpuid/v2 v2.2.6 // indirect github.com/klauspost/reedsolomon v1.12.3 // indirect github.com/kr/text v0.2.0 // indirect - github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/mdlayher/socket v0.4.1 // indirect github.com/metacubex/ascon v0.1.0 // indirect @@ -99,17 +97,13 @@ require ( github.com/onsi/ginkgo/v2 v2.9.5 // indirect github.com/pierrec/lz4/v4 v4.1.14 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect github.com/quic-go/qpack v0.4.0 // 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/rabbitio v0.0.0-20220730151941-9ce26f4f872e // 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/vishvananda/netns v0.0.4 // indirect github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect - github.com/yusufpapurcu/wmi v1.2.4 // indirect gitlab.com/yawning/bsaes.git v0.0.0-20190805113838-0a714cd429ec // indirect go.uber.org/mock v0.4.0 // indirect golang.org/x/mod v0.20.0 // indirect diff --git a/clash-meta-android/core/src/foss/golang/clash/go.sum b/clash-meta-android/core/src/foss/golang/clash/go.sum index 5bd6da5110..271e8c1c80 100644 --- a/clash-meta-android/core/src/foss/golang/clash/go.sum +++ b/clash-meta-android/core/src/foss/golang/clash/go.sum @@ -23,8 +23,8 @@ 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.11.5 h1:Q/sSnsKerHeCkc/jSTNq1oCm7KiVgUMZRDUoRu0JQZQ= github.com/dlclark/regexp2 v1.11.5/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= -github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= -github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/ebitengine/purego v0.9.0 h1:mh0zpKBIXDceC63hpvPuGLiJ8ZAa3DfrFTudmfi8A4k= +github.com/ebitengine/purego v0.9.0/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= github.com/enfein/mieru/v3 v3.20.0 h1:1ob7pCIVSH5FYFAfYvim8isLW1vBOS4cFOUF9exJS38= github.com/enfein/mieru/v3 v3.20.0/go.mod h1:zJBUCsi5rxyvHM8fjFf+GLaEl4OEjjBXr1s5F6Qd3hM= github.com/ericlagergren/aegis v0.0.0-20250325060835-cd0defd64358 h1:kXYqH/sL8dS/FdoFjr12ePjnLPorPo2FsnrHNuXSDyo= @@ -45,7 +45,6 @@ github.com/go-chi/chi/v5 v5.2.3/go.mod h1:L2yAIGWB3H+phAw1NxKwWM+7eUH/lU8pOMm5hH 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/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= @@ -64,7 +63,6 @@ github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs= 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/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/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 h1:yAJXTCF9TqKcTiHJAE8dj7HMvPfh66eeA2JYW7eFpSE= @@ -86,8 +84,6 @@ github.com/klauspost/reedsolomon v1.12.3/go.mod h1:3K5rXwABAvzGeR01r6pWZieUALXO/ github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= -github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= 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= @@ -145,8 +141,8 @@ github.com/metacubex/smux v0.0.0-20250922175018-15c9a6a78719 h1:T6qCCfolRDAVJKea github.com/metacubex/smux v0.0.0-20250922175018-15c9a6a78719/go.mod h1:4bPD8HWx9jPJ9aE4uadgyN7D1/Wz3KmPy+vale8sKLE= github.com/metacubex/tfo-go v0.0.0-20250921095601-b102db4216c0 h1:Ui+/2s5Qz0lSnDUBmEL12M5Oi/PzvFxGTNohm8ZcsmE= github.com/metacubex/tfo-go v0.0.0-20250921095601-b102db4216c0/go.mod h1:l9oLnLoEXyGZ5RVLsh7QCC5XsouTUyKk4F2nLm2DHLw= -github.com/metacubex/utls v1.8.1-0.20250923145048-0a5bbc90dd3e h1:t9IxEaxSRp3YJ1ewQV4oGkKaJaMeSoUWjOV0boLVQo8= -github.com/metacubex/utls v1.8.1-0.20250923145048-0a5bbc90dd3e/go.mod h1:kncGGVhFaoGn5M3pFe3SXhZCzsbCJayNOH4UEqTKTko= +github.com/metacubex/utls v1.8.1 h1:RW8GeCGWAegjV0HW5nw9DoqNoeGAXXeYUP6AysmRvx4= +github.com/metacubex/utls v1.8.1/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= @@ -172,8 +168,6 @@ 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/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= 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/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g= github.com/quic-go/qpack v0.4.0 h1:Cr9BXA1sQS2SmDUWjSofMPNKmvF6IiIfDRmgU0w1ZCo= github.com/quic-go/qpack v0.4.0/go.mod h1:UZVnYIfi5GRk+zI9UMaCPsmZ2xKJP7XBUvVyT1Knj9A= @@ -183,8 +177,6 @@ github.com/sagernet/netlink v0.0.0-20240612041022-b9a21c07ac6a h1:ObwtHN2VpqE0ZN github.com/sagernet/netlink v0.0.0-20240612041022-b9a21c07ac6a/go.mod h1:xLnfdiJbSp8rNqYEdIW/6eDO4mVoogml14Bh2hSiFpM= github.com/samber/lo v1.51.0 h1:kysRYLbHy/MB7kQZf5DSN50JHmMsNEdeY24VzJFu7wI= github.com/samber/lo v1.51.0/go.mod h1:4+MXEGsJzbKGaUEQFKBq2xtfuznW9oz/WrgyzMzRoM0= -github.com/shirou/gopsutil/v4 v4.25.1 h1:QSWkTc+fu9LTAWfkZwZ6j8MSUk4A2LV7rbH0ZqmLjXs= -github.com/shirou/gopsutil/v4 v4.25.1/go.mod h1:RoUCUpndaJFtT+2zsZzzmhvbfGoDCJ7nFXKJf8GqJbI= 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/rabaead v0.0.0-20220730151906-ab6e06b96e8c h1:DjKMC30y6yjG3IxDaeAj3PCoRr+IsO+bzyT+Se2m2Hk= @@ -206,10 +198,6 @@ github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXl github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= -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/go.mod h1:eLL9Nub3yfAho7qB0MzZizFhTU2QkLeoVsWdHtDW264= github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= @@ -224,8 +212,6 @@ github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV github.com/wk8/go-ordered-map/v2 v2.1.8 h1:5h/BUHu93oj4gIdvHHHGsScSTMijfx5PeYkE/fJgbpc= github.com/wk8/go-ordered-map/v2 v2.1.8/go.mod h1:5nJHM5DyteebpVlHnWMV0rPz6Zp7+xBAnxjb1X5vnTw= github.com/xtaci/lossyconn v0.0.0-20190602105132-8df528c0c9ae h1:J0GxkO96kL4WF+AIT3M4mfUVinOCPgf2uUWYFUzN0sM= -github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= -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/go.mod h1:E+rxHvJG9H6PUdzq9NRG6csuLN3XUx98BfGOVWNYnXs= gitlab.com/yawning/bsaes.git v0.0.0-20190805113838-0a714cd429ec h1:FpfFs4EhNehiVfzQttTuxanPIT43FtkkCFypIod8LHo= @@ -257,17 +243,13 @@ golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5h 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-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-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-20220715151400-c0bba94af5f8/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.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= @@ -281,7 +263,6 @@ golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapK golang.org/x/tools v0.24.0 h1:J1shsA93PJUEVaUSaay7UXAyE8aimq3GW0pjlolpa24= 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-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/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/clash-meta-android/core/src/foss/golang/clash/tunnel/statistic/manager.go b/clash-meta-android/core/src/foss/golang/clash/tunnel/statistic/manager.go index 90a34b6d0f..9db4601e14 100644 --- a/clash-meta-android/core/src/foss/golang/clash/tunnel/statistic/manager.go +++ b/clash-meta-android/core/src/foss/golang/clash/tunnel/statistic/manager.go @@ -6,8 +6,7 @@ import ( "github.com/metacubex/mihomo/common/atomic" "github.com/metacubex/mihomo/common/xsync" - - "github.com/shirou/gopsutil/v4/process" + "github.com/metacubex/mihomo/component/memory" ) var DefaultManager *Manager @@ -20,7 +19,7 @@ func init() { downloadBlip: atomic.NewInt64(0), uploadTotal: atomic.NewInt64(0), downloadTotal: atomic.NewInt64(0), - process: &process.Process{Pid: int32(os.Getpid())}, + pid: int32(os.Getpid()), } go DefaultManager.handle() @@ -34,7 +33,7 @@ type Manager struct { downloadBlip atomic.Int64 uploadTotal atomic.Int64 downloadTotal atomic.Int64 - process *process.Process + pid int32 memory uint64 } @@ -93,7 +92,7 @@ func (m *Manager) Snapshot() *Snapshot { } func (m *Manager) updateMemory() { - stat, err := m.process.MemoryInfo() + stat, err := memory.GetMemoryInfo(m.pid) if err != nil { return } diff --git a/clash-meta-android/core/src/foss/golang/go.mod b/clash-meta-android/core/src/foss/golang/go.mod index 5c3e5ddcb6..1c23216ce9 100644 --- a/clash-meta-android/core/src/foss/golang/go.mod +++ b/clash-meta-android/core/src/foss/golang/go.mod @@ -13,7 +13,7 @@ require ( github.com/buger/jsonparser v1.1.1 // indirect github.com/coreos/go-iptables v0.8.0 // indirect github.com/dlclark/regexp2 v1.11.5 // indirect - github.com/ebitengine/purego v0.8.4 // indirect + github.com/ebitengine/purego v0.9.0 // indirect github.com/enfein/mieru/v3 v3.20.0 // indirect github.com/ericlagergren/aegis v0.0.0-20250325060835-cd0defd64358 // indirect github.com/ericlagergren/polyval v0.0.0-20220411101811-e25bc10ba391 // indirect @@ -38,7 +38,6 @@ require ( github.com/klauspost/compress v1.17.9 // indirect github.com/klauspost/cpuid/v2 v2.2.6 // indirect github.com/klauspost/reedsolomon v1.12.3 // indirect - github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/mdlayher/netlink v1.7.2 // indirect github.com/mdlayher/socket v0.4.1 // indirect @@ -68,7 +67,7 @@ require ( github.com/metacubex/sing-wireguard v0.0.0-20250503063753-2dc62acc626f // indirect github.com/metacubex/smux v0.0.0-20250922175018-15c9a6a78719 // indirect github.com/metacubex/tfo-go v0.0.0-20250921095601-b102db4216c0 // indirect - github.com/metacubex/utls v1.8.1-0.20250923145048-0a5bbc90dd3e // indirect + github.com/metacubex/utls v1.8.1 // 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 @@ -78,24 +77,19 @@ require ( github.com/openacid/low v0.1.21 // indirect github.com/oschwald/maxminddb-golang v1.12.0 // indirect github.com/pierrec/lz4/v4 v4.1.14 // indirect - github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect github.com/quic-go/qpack v0.4.0 // indirect github.com/sagernet/cors v1.2.1 // indirect github.com/sagernet/netlink v0.0.0-20240612041022-b9a21c07ac6a // indirect github.com/samber/lo v1.51.0 // indirect - github.com/shirou/gopsutil/v4 v4.25.1 // 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/rabbitio v0.0.0-20220730151941-9ce26f4f872e // indirect github.com/sirupsen/logrus v1.9.3 // 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/vishvananda/netns v0.0.4 // indirect github.com/vmihailenco/msgpack/v5 v5.4.1 // indirect github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect github.com/wk8/go-ordered-map/v2 v2.1.8 // indirect - github.com/yusufpapurcu/wmi v1.2.4 // indirect gitlab.com/go-extension/aes-ccm v0.0.0-20230221065045-e58665ef23c7 // indirect gitlab.com/yawning/bsaes.git v0.0.0-20190805113838-0a714cd429ec // indirect go.uber.org/mock v0.4.0 // indirect diff --git a/clash-meta-android/core/src/foss/golang/go.sum b/clash-meta-android/core/src/foss/golang/go.sum index bea6604764..14eb726311 100644 --- a/clash-meta-android/core/src/foss/golang/go.sum +++ b/clash-meta-android/core/src/foss/golang/go.sum @@ -22,8 +22,8 @@ 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.11.5 h1:Q/sSnsKerHeCkc/jSTNq1oCm7KiVgUMZRDUoRu0JQZQ= github.com/dlclark/regexp2 v1.11.5/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= -github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= -github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/ebitengine/purego v0.9.0 h1:mh0zpKBIXDceC63hpvPuGLiJ8ZAa3DfrFTudmfi8A4k= +github.com/ebitengine/purego v0.9.0/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= github.com/enfein/mieru/v3 v3.20.0 h1:1ob7pCIVSH5FYFAfYvim8isLW1vBOS4cFOUF9exJS38= github.com/enfein/mieru/v3 v3.20.0/go.mod h1:zJBUCsi5rxyvHM8fjFf+GLaEl4OEjjBXr1s5F6Qd3hM= github.com/ericlagergren/aegis v0.0.0-20250325060835-cd0defd64358 h1:kXYqH/sL8dS/FdoFjr12ePjnLPorPo2FsnrHNuXSDyo= @@ -44,7 +44,6 @@ github.com/go-chi/chi/v5 v5.2.3/go.mod h1:L2yAIGWB3H+phAw1NxKwWM+7eUH/lU8pOMm5hH 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/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= @@ -63,7 +62,6 @@ github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs= 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/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/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 h1:yAJXTCF9TqKcTiHJAE8dj7HMvPfh66eeA2JYW7eFpSE= @@ -82,8 +80,6 @@ github.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/4 github.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= github.com/klauspost/reedsolomon v1.12.3 h1:tzUznbfc3OFwJaTebv/QdhnFf2Xvb7gZ24XaHLBPmdc= github.com/klauspost/reedsolomon v1.12.3/go.mod h1:3K5rXwABAvzGeR01r6pWZieUALXO/Tq7bFKGIb4m4WI= -github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= -github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= 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= @@ -141,8 +137,8 @@ github.com/metacubex/smux v0.0.0-20250922175018-15c9a6a78719 h1:T6qCCfolRDAVJKea github.com/metacubex/smux v0.0.0-20250922175018-15c9a6a78719/go.mod h1:4bPD8HWx9jPJ9aE4uadgyN7D1/Wz3KmPy+vale8sKLE= github.com/metacubex/tfo-go v0.0.0-20250921095601-b102db4216c0 h1:Ui+/2s5Qz0lSnDUBmEL12M5Oi/PzvFxGTNohm8ZcsmE= github.com/metacubex/tfo-go v0.0.0-20250921095601-b102db4216c0/go.mod h1:l9oLnLoEXyGZ5RVLsh7QCC5XsouTUyKk4F2nLm2DHLw= -github.com/metacubex/utls v1.8.1-0.20250923145048-0a5bbc90dd3e h1:t9IxEaxSRp3YJ1ewQV4oGkKaJaMeSoUWjOV0boLVQo8= -github.com/metacubex/utls v1.8.1-0.20250923145048-0a5bbc90dd3e/go.mod h1:kncGGVhFaoGn5M3pFe3SXhZCzsbCJayNOH4UEqTKTko= +github.com/metacubex/utls v1.8.1 h1:RW8GeCGWAegjV0HW5nw9DoqNoeGAXXeYUP6AysmRvx4= +github.com/metacubex/utls v1.8.1/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= @@ -168,8 +164,6 @@ 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/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= 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/quic-go/qpack v0.4.0 h1:Cr9BXA1sQS2SmDUWjSofMPNKmvF6IiIfDRmgU0w1ZCo= github.com/quic-go/qpack v0.4.0/go.mod h1:UZVnYIfi5GRk+zI9UMaCPsmZ2xKJP7XBUvVyT1Knj9A= github.com/sagernet/cors v1.2.1 h1:Cv5Z8y9YSD6Gm+qSpNrL3LO4lD3eQVvbFYJSG7JCMHQ= @@ -178,8 +172,6 @@ github.com/sagernet/netlink v0.0.0-20240612041022-b9a21c07ac6a h1:ObwtHN2VpqE0ZN github.com/sagernet/netlink v0.0.0-20240612041022-b9a21c07ac6a/go.mod h1:xLnfdiJbSp8rNqYEdIW/6eDO4mVoogml14Bh2hSiFpM= github.com/samber/lo v1.51.0 h1:kysRYLbHy/MB7kQZf5DSN50JHmMsNEdeY24VzJFu7wI= github.com/samber/lo v1.51.0/go.mod h1:4+MXEGsJzbKGaUEQFKBq2xtfuznW9oz/WrgyzMzRoM0= -github.com/shirou/gopsutil/v4 v4.25.1 h1:QSWkTc+fu9LTAWfkZwZ6j8MSUk4A2LV7rbH0ZqmLjXs= -github.com/shirou/gopsutil/v4 v4.25.1/go.mod h1:RoUCUpndaJFtT+2zsZzzmhvbfGoDCJ7nFXKJf8GqJbI= 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/rabaead v0.0.0-20220730151906-ab6e06b96e8c h1:DjKMC30y6yjG3IxDaeAj3PCoRr+IsO+bzyT+Se2m2Hk= @@ -200,10 +192,6 @@ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO 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.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= -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/go.mod h1:eLL9Nub3yfAho7qB0MzZizFhTU2QkLeoVsWdHtDW264= github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= @@ -218,8 +206,6 @@ github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV github.com/wk8/go-ordered-map/v2 v2.1.8 h1:5h/BUHu93oj4gIdvHHHGsScSTMijfx5PeYkE/fJgbpc= github.com/wk8/go-ordered-map/v2 v2.1.8/go.mod h1:5nJHM5DyteebpVlHnWMV0rPz6Zp7+xBAnxjb1X5vnTw= github.com/xtaci/lossyconn v0.0.0-20190602105132-8df528c0c9ae h1:J0GxkO96kL4WF+AIT3M4mfUVinOCPgf2uUWYFUzN0sM= -github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= -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/go.mod h1:E+rxHvJG9H6PUdzq9NRG6csuLN3XUx98BfGOVWNYnXs= gitlab.com/yawning/bsaes.git v0.0.0-20190805113838-0a714cd429ec h1:FpfFs4EhNehiVfzQttTuxanPIT43FtkkCFypIod8LHo= @@ -249,17 +235,13 @@ golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5h 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-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-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-20220715151400-c0bba94af5f8/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.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= @@ -273,7 +255,6 @@ golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapK golang.org/x/tools v0.24.0 h1:J1shsA93PJUEVaUSaay7UXAyE8aimq3GW0pjlolpa24= 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-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= diff --git a/clash-meta-android/core/src/main/golang/go.mod b/clash-meta-android/core/src/main/golang/go.mod index 36a65205f6..5fadbd3bbc 100644 --- a/clash-meta-android/core/src/main/golang/go.mod +++ b/clash-meta-android/core/src/main/golang/go.mod @@ -19,7 +19,7 @@ require ( github.com/bahlo/generic-list-go v0.2.0 // indirect github.com/buger/jsonparser v1.1.1 // indirect github.com/coreos/go-iptables v0.8.0 // indirect - github.com/ebitengine/purego v0.8.4 // indirect + github.com/ebitengine/purego v0.9.0 // indirect github.com/enfein/mieru/v3 v3.20.0 // indirect github.com/ericlagergren/aegis v0.0.0-20250325060835-cd0defd64358 // indirect github.com/ericlagergren/polyval v0.0.0-20220411101811-e25bc10ba391 // indirect @@ -45,7 +45,6 @@ require ( github.com/klauspost/compress v1.17.9 // indirect github.com/klauspost/cpuid/v2 v2.2.6 // indirect github.com/klauspost/reedsolomon v1.12.3 // indirect - github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/mdlayher/netlink v1.7.2 // indirect github.com/mdlayher/socket v0.4.1 // indirect @@ -74,7 +73,7 @@ require ( github.com/metacubex/sing-wireguard v0.0.0-20250503063753-2dc62acc626f // indirect github.com/metacubex/smux v0.0.0-20250922175018-15c9a6a78719 // indirect github.com/metacubex/tfo-go v0.0.0-20250921095601-b102db4216c0 // indirect - github.com/metacubex/utls v1.8.1-0.20250923145048-0a5bbc90dd3e // indirect + github.com/metacubex/utls v1.8.1 // 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 @@ -84,24 +83,19 @@ require ( github.com/openacid/low v0.1.21 // indirect github.com/oschwald/maxminddb-golang v1.12.0 // indirect github.com/pierrec/lz4/v4 v4.1.14 // indirect - github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect github.com/quic-go/qpack v0.4.0 // indirect github.com/sagernet/cors v1.2.1 // indirect github.com/sagernet/netlink v0.0.0-20240612041022-b9a21c07ac6a // indirect github.com/samber/lo v1.51.0 // indirect - github.com/shirou/gopsutil/v4 v4.25.1 // 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/rabbitio v0.0.0-20220730151941-9ce26f4f872e // indirect github.com/sirupsen/logrus v1.9.3 // 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/vishvananda/netns v0.0.4 // indirect github.com/vmihailenco/msgpack/v5 v5.4.1 // indirect github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect github.com/wk8/go-ordered-map/v2 v2.1.8 // indirect - github.com/yusufpapurcu/wmi v1.2.4 // indirect gitlab.com/go-extension/aes-ccm v0.0.0-20230221065045-e58665ef23c7 // indirect gitlab.com/yawning/bsaes.git v0.0.0-20190805113838-0a714cd429ec // indirect go.uber.org/mock v0.4.0 // indirect diff --git a/clash-meta-android/core/src/main/golang/go.sum b/clash-meta-android/core/src/main/golang/go.sum index a86e2da9e7..e705b675e2 100644 --- a/clash-meta-android/core/src/main/golang/go.sum +++ b/clash-meta-android/core/src/main/golang/go.sum @@ -22,8 +22,8 @@ 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.11.5 h1:Q/sSnsKerHeCkc/jSTNq1oCm7KiVgUMZRDUoRu0JQZQ= github.com/dlclark/regexp2 v1.11.5/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= -github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= -github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/ebitengine/purego v0.9.0 h1:mh0zpKBIXDceC63hpvPuGLiJ8ZAa3DfrFTudmfi8A4k= +github.com/ebitengine/purego v0.9.0/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= github.com/enfein/mieru/v3 v3.20.0 h1:1ob7pCIVSH5FYFAfYvim8isLW1vBOS4cFOUF9exJS38= github.com/enfein/mieru/v3 v3.20.0/go.mod h1:zJBUCsi5rxyvHM8fjFf+GLaEl4OEjjBXr1s5F6Qd3hM= github.com/ericlagergren/aegis v0.0.0-20250325060835-cd0defd64358 h1:kXYqH/sL8dS/FdoFjr12ePjnLPorPo2FsnrHNuXSDyo= @@ -44,7 +44,6 @@ github.com/go-chi/chi/v5 v5.2.3/go.mod h1:L2yAIGWB3H+phAw1NxKwWM+7eUH/lU8pOMm5hH 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/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= @@ -64,7 +63,6 @@ github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs= 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/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/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 h1:yAJXTCF9TqKcTiHJAE8dj7HMvPfh66eeA2JYW7eFpSE= @@ -83,8 +81,6 @@ github.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/4 github.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= github.com/klauspost/reedsolomon v1.12.3 h1:tzUznbfc3OFwJaTebv/QdhnFf2Xvb7gZ24XaHLBPmdc= github.com/klauspost/reedsolomon v1.12.3/go.mod h1:3K5rXwABAvzGeR01r6pWZieUALXO/Tq7bFKGIb4m4WI= -github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= -github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= 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= @@ -142,8 +138,8 @@ github.com/metacubex/smux v0.0.0-20250922175018-15c9a6a78719 h1:T6qCCfolRDAVJKea github.com/metacubex/smux v0.0.0-20250922175018-15c9a6a78719/go.mod h1:4bPD8HWx9jPJ9aE4uadgyN7D1/Wz3KmPy+vale8sKLE= github.com/metacubex/tfo-go v0.0.0-20250921095601-b102db4216c0 h1:Ui+/2s5Qz0lSnDUBmEL12M5Oi/PzvFxGTNohm8ZcsmE= github.com/metacubex/tfo-go v0.0.0-20250921095601-b102db4216c0/go.mod h1:l9oLnLoEXyGZ5RVLsh7QCC5XsouTUyKk4F2nLm2DHLw= -github.com/metacubex/utls v1.8.1-0.20250923145048-0a5bbc90dd3e h1:t9IxEaxSRp3YJ1ewQV4oGkKaJaMeSoUWjOV0boLVQo8= -github.com/metacubex/utls v1.8.1-0.20250923145048-0a5bbc90dd3e/go.mod h1:kncGGVhFaoGn5M3pFe3SXhZCzsbCJayNOH4UEqTKTko= +github.com/metacubex/utls v1.8.1 h1:RW8GeCGWAegjV0HW5nw9DoqNoeGAXXeYUP6AysmRvx4= +github.com/metacubex/utls v1.8.1/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= @@ -169,8 +165,6 @@ 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/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= 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/quic-go/qpack v0.4.0 h1:Cr9BXA1sQS2SmDUWjSofMPNKmvF6IiIfDRmgU0w1ZCo= github.com/quic-go/qpack v0.4.0/go.mod h1:UZVnYIfi5GRk+zI9UMaCPsmZ2xKJP7XBUvVyT1Knj9A= github.com/sagernet/cors v1.2.1 h1:Cv5Z8y9YSD6Gm+qSpNrL3LO4lD3eQVvbFYJSG7JCMHQ= @@ -179,8 +173,6 @@ github.com/sagernet/netlink v0.0.0-20240612041022-b9a21c07ac6a h1:ObwtHN2VpqE0ZN github.com/sagernet/netlink v0.0.0-20240612041022-b9a21c07ac6a/go.mod h1:xLnfdiJbSp8rNqYEdIW/6eDO4mVoogml14Bh2hSiFpM= github.com/samber/lo v1.51.0 h1:kysRYLbHy/MB7kQZf5DSN50JHmMsNEdeY24VzJFu7wI= github.com/samber/lo v1.51.0/go.mod h1:4+MXEGsJzbKGaUEQFKBq2xtfuznW9oz/WrgyzMzRoM0= -github.com/shirou/gopsutil/v4 v4.25.1 h1:QSWkTc+fu9LTAWfkZwZ6j8MSUk4A2LV7rbH0ZqmLjXs= -github.com/shirou/gopsutil/v4 v4.25.1/go.mod h1:RoUCUpndaJFtT+2zsZzzmhvbfGoDCJ7nFXKJf8GqJbI= 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/rabaead v0.0.0-20220730151906-ab6e06b96e8c h1:DjKMC30y6yjG3IxDaeAj3PCoRr+IsO+bzyT+Se2m2Hk= @@ -201,10 +193,6 @@ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO 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.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= -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/go.mod h1:eLL9Nub3yfAho7qB0MzZizFhTU2QkLeoVsWdHtDW264= github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= @@ -219,8 +207,6 @@ github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV github.com/wk8/go-ordered-map/v2 v2.1.8 h1:5h/BUHu93oj4gIdvHHHGsScSTMijfx5PeYkE/fJgbpc= github.com/wk8/go-ordered-map/v2 v2.1.8/go.mod h1:5nJHM5DyteebpVlHnWMV0rPz6Zp7+xBAnxjb1X5vnTw= github.com/xtaci/lossyconn v0.0.0-20190602105132-8df528c0c9ae h1:J0GxkO96kL4WF+AIT3M4mfUVinOCPgf2uUWYFUzN0sM= -github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= -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/go.mod h1:E+rxHvJG9H6PUdzq9NRG6csuLN3XUx98BfGOVWNYnXs= gitlab.com/yawning/bsaes.git v0.0.0-20190805113838-0a714cd429ec h1:FpfFs4EhNehiVfzQttTuxanPIT43FtkkCFypIod8LHo= @@ -250,17 +236,13 @@ golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5h 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-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-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-20220715151400-c0bba94af5f8/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.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= @@ -274,7 +256,6 @@ golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapK golang.org/x/tools v0.24.0 h1:J1shsA93PJUEVaUSaay7UXAyE8aimq3GW0pjlolpa24= 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-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= diff --git a/clash-meta/component/memory/memory.go b/clash-meta/component/memory/memory.go new file mode 100644 index 0000000000..0269c37b1f --- /dev/null +++ b/clash-meta/component/memory/memory.go @@ -0,0 +1,29 @@ +// Package memory return MemoryInfoStat +// modify from https://github.com/shirou/gopsutil/tree/v4.25.8/process +package memory + +import ( + "errors" + "fmt" + "math" +) + +var ErrNotImplementedError = errors.New("not implemented yet") + +type MemoryInfoStat struct { + RSS uint64 `json:"rss"` // bytes + VMS uint64 `json:"vms"` // bytes +} + +// PrettyByteSize convert size in bytes to Bytes, Kilobytes, Megabytes, GB and TB +// https://gist.github.com/anikitenko/b41206a49727b83a530142c76b1cb82d?permalink_comment_id=4467913#gistcomment-4467913 +func PrettyByteSize(b uint64) string { + bf := float64(b) + for _, unit := range []string{"", "Ki", "Mi", "Gi", "Ti", "Pi", "Ei", "Zi"} { + if math.Abs(bf) < 1024.0 { + return fmt.Sprintf("%3.1f%sB", bf, unit) + } + bf /= 1024.0 + } + return fmt.Sprintf("%.1fYiB", bf) +} diff --git a/clash-meta/component/memory/memory_darwin.go b/clash-meta/component/memory/memory_darwin.go new file mode 100644 index 0000000000..1dd33af32a --- /dev/null +++ b/clash-meta/component/memory/memory_darwin.go @@ -0,0 +1,56 @@ +package memory + +import ( + "unsafe" + + "github.com/ebitengine/purego" +) + +const PROC_PIDTASKINFO = 4 + +type ProcTaskInfo struct { + Virtual_size uint64 + Resident_size uint64 + Total_user uint64 + Total_system uint64 + Threads_user uint64 + Threads_system uint64 + Policy int32 + Faults int32 + Pageins int32 + Cow_faults int32 + Messages_sent int32 + Messages_received int32 + Syscalls_mach int32 + Syscalls_unix int32 + Csw int32 + Threadnum int32 + Numrunning int32 + Priority int32 +} + +const System = "/usr/lib/libSystem.B.dylib" + +type ProcPidInfoFunc func(pid, flavor int32, arg uint64, buffer uintptr, bufferSize int32) int32 + +const ProcPidInfoSym = "proc_pidinfo" + +func GetMemoryInfo(pid int32) (*MemoryInfoStat, error) { + lib, err := purego.Dlopen(System, purego.RTLD_LAZY|purego.RTLD_GLOBAL) + if err != nil { + return nil, err + } + defer purego.Dlclose(lib) + + var procPidInfo ProcPidInfoFunc + purego.RegisterLibFunc(&procPidInfo, lib, ProcPidInfoSym) + + var ti ProcTaskInfo + procPidInfo(pid, PROC_PIDTASKINFO, 0, uintptr(unsafe.Pointer(&ti)), int32(unsafe.Sizeof(ti))) + + ret := &MemoryInfoStat{ + RSS: uint64(ti.Resident_size), + VMS: uint64(ti.Virtual_size), + } + return ret, nil +} diff --git a/clash-meta/component/memory/memory_falllback.go b/clash-meta/component/memory/memory_falllback.go new file mode 100644 index 0000000000..918f5b0ec9 --- /dev/null +++ b/clash-meta/component/memory/memory_falllback.go @@ -0,0 +1,7 @@ +//go:build !darwin && !linux && !freebsd && !openbsd && !windows + +package memory + +func GetMemoryInfo(pid int32) (*MemoryInfoStat, error) { + return nil, ErrNotImplementedError +} diff --git a/clash-meta/component/memory/memory_freebsd.go b/clash-meta/component/memory/memory_freebsd.go new file mode 100644 index 0000000000..87166b8493 --- /dev/null +++ b/clash-meta/component/memory/memory_freebsd.go @@ -0,0 +1,97 @@ +package memory + +import ( + "bytes" + "encoding/binary" + "errors" + "unsafe" + + "golang.org/x/sys/unix" +) + +const ( + CTLKern = 1 + KernProc = 14 + KernProcPID = 1 +) + +func CallSyscall(mib []int32) ([]byte, uint64, error) { + mibptr := unsafe.Pointer(&mib[0]) + miblen := uint64(len(mib)) + + // get required buffer size + length := uint64(0) + _, _, err := unix.Syscall6( + unix.SYS___SYSCTL, + uintptr(mibptr), + uintptr(miblen), + 0, + uintptr(unsafe.Pointer(&length)), + 0, + 0) + if err != 0 { + var b []byte + return b, length, err + } + if length == 0 { + var b []byte + return b, length, err + } + // get proc info itself + buf := make([]byte, length) + _, _, err = unix.Syscall6( + unix.SYS___SYSCTL, + uintptr(mibptr), + uintptr(miblen), + uintptr(unsafe.Pointer(&buf[0])), + uintptr(unsafe.Pointer(&length)), + 0, + 0) + if err != 0 { + return buf, length, err + } + + return buf, length, nil +} + +func parseKinfoProc(buf []byte) (KinfoProc, error) { + var k KinfoProc + br := bytes.NewReader(buf) + err := binary.Read(br, binary.LittleEndian, &k) + return k, err +} + +func getKProc(pid int32) (*KinfoProc, error) { + mib := []int32{CTLKern, KernProc, KernProcPID, pid} + + buf, length, err := CallSyscall(mib) + if err != nil { + return nil, err + } + if length != sizeOfKinfoProc { + return nil, errors.New("unexpected size of KinfoProc") + } + + k, err := parseKinfoProc(buf) + if err != nil { + return nil, err + } + return &k, nil +} + +func GetMemoryInfo(pid int32) (*MemoryInfoStat, error) { + k, err := getKProc(pid) + if err != nil { + return nil, err + } + v, err := unix.Sysctl("vm.stats.vm.v_page_size") + if err != nil { + return nil, err + } + pageSize := binary.LittleEndian.Uint16([]byte(v)) + + return &MemoryInfoStat{ + RSS: uint64(k.Rssize) * uint64(pageSize), + VMS: uint64(k.Size), + }, nil +} diff --git a/clash-meta/component/memory/memory_freebsd_386.go b/clash-meta/component/memory/memory_freebsd_386.go new file mode 100644 index 0000000000..85e79c70f2 --- /dev/null +++ b/clash-meta/component/memory/memory_freebsd_386.go @@ -0,0 +1,119 @@ +package memory + +const sizeOfKinfoProc = 0x300 + +type Timeval struct { + Sec int32 + Usec int32 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int32 + Ixrss int32 + Idrss int32 + Isrss int32 + Minflt int32 + Majflt int32 + Nswap int32 + Inblock int32 + Oublock int32 + Msgsnd int32 + Msgrcv int32 + Nsignals int32 + Nvcsw int32 + Nivcsw int32 +} + +type KinfoProc struct { + Structsize int32 + Layout int32 + Args int32 /* pargs */ + Paddr int32 /* proc */ + Addr int32 /* user */ + Tracep int32 /* vnode */ + Textvp int32 /* vnode */ + Fd int32 /* filedesc */ + Vmspace int32 /* vmspace */ + Wchan int32 + Pid int32 + Ppid int32 + Pgid int32 + Tpgid int32 + Sid int32 + Tsid int32 + Jobc int16 + Spare_short1 int16 + Tdev uint32 + Siglist [16]byte /* sigset */ + Sigmask [16]byte /* sigset */ + Sigignore [16]byte /* sigset */ + Sigcatch [16]byte /* sigset */ + Uid uint32 + Ruid uint32 + Svuid uint32 + Rgid uint32 + Svgid uint32 + Ngroups int16 + Spare_short2 int16 + Groups [16]uint32 + Size uint32 + Rssize int32 + Swrss int32 + Tsize int32 + Dsize int32 + Ssize int32 + Xstat uint16 + Acflag uint16 + Pctcpu uint32 + Estcpu uint32 + Slptime uint32 + Swtime uint32 + Cow uint32 + Runtime uint64 + Start Timeval + Childtime Timeval + Flag int32 + Kiflag int32 + Traceflag int32 + Stat int8 + Nice int8 + Lock int8 + Rqindex int8 + Oncpu uint8 + Lastcpu uint8 + Tdname [17]int8 + Wmesg [9]int8 + Login [18]int8 + Lockname [9]int8 + Comm [20]int8 + Emul [17]int8 + Loginclass [18]int8 + Sparestrings [50]int8 + Spareints [7]int32 + Flag2 int32 + Fibnum int32 + Cr_flags uint32 + Jid int32 + Numthreads int32 + Tid int32 + Pri Priority + Rusage Rusage + Rusage_ch Rusage + Pcb int32 /* pcb */ + Kstack int32 + Udata int32 + Tdaddr int32 /* thread */ + Spareptrs [6]int32 + Sparelongs [12]int32 + Sflag int32 + Tdflags int32 +} + +type Priority struct { + Class uint8 + Level uint8 + Native uint8 + User uint8 +} diff --git a/clash-meta/component/memory/memory_freebsd_amd64.go b/clash-meta/component/memory/memory_freebsd_amd64.go new file mode 100644 index 0000000000..2cebd34c2b --- /dev/null +++ b/clash-meta/component/memory/memory_freebsd_amd64.go @@ -0,0 +1,125 @@ +package memory + +const sizeOfKinfoProc = 0x440 + +type Timeval struct { + Sec int64 + Usec int64 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int64 + Ixrss int64 + Idrss int64 + Isrss int64 + Minflt int64 + Majflt int64 + Nswap int64 + Inblock int64 + Oublock int64 + Msgsnd int64 + Msgrcv int64 + Nsignals int64 + Nvcsw int64 + Nivcsw int64 +} + +type KinfoProc struct { + Structsize int32 + Layout int32 + Args int64 /* pargs */ + Paddr int64 /* proc */ + Addr int64 /* user */ + Tracep int64 /* vnode */ + Textvp int64 /* vnode */ + Fd int64 /* filedesc */ + Vmspace int64 /* vmspace */ + Wchan int64 + Pid int32 + Ppid int32 + Pgid int32 + Tpgid int32 + Sid int32 + Tsid int32 + Jobc int16 + Spare_short1 int16 + Tdev_freebsd11 uint32 + Siglist [16]byte /* sigset */ + Sigmask [16]byte /* sigset */ + Sigignore [16]byte /* sigset */ + Sigcatch [16]byte /* sigset */ + Uid uint32 + Ruid uint32 + Svuid uint32 + Rgid uint32 + Svgid uint32 + Ngroups int16 + Spare_short2 int16 + Groups [16]uint32 + Size uint64 + Rssize int64 + Swrss int64 + Tsize int64 + Dsize int64 + Ssize int64 + Xstat uint16 + Acflag uint16 + Pctcpu uint32 + Estcpu uint32 + Slptime uint32 + Swtime uint32 + Cow uint32 + Runtime uint64 + Start Timeval + Childtime Timeval + Flag int64 + Kiflag int64 + Traceflag int32 + Stat int8 + Nice int8 + Lock int8 + Rqindex int8 + Oncpu_old uint8 + Lastcpu_old uint8 + Tdname [17]int8 + Wmesg [9]int8 + Login [18]int8 + Lockname [9]int8 + Comm [20]int8 + Emul [17]int8 + Loginclass [18]int8 + Moretdname [4]int8 + Sparestrings [46]int8 + Spareints [2]int32 + Tdev uint64 + Oncpu int32 + Lastcpu int32 + Tracer int32 + Flag2 int32 + Fibnum int32 + Cr_flags uint32 + Jid int32 + Numthreads int32 + Tid int32 + Pri Priority + Rusage Rusage + Rusage_ch Rusage + Pcb int64 /* pcb */ + Kstack int64 + Udata int64 + Tdaddr int64 /* thread */ + Pd int64 /* pwddesc, not accurate */ + Spareptrs [5]int64 + Sparelongs [12]int64 + Sflag int64 + Tdflags int64 +} + +type Priority struct { + Class uint8 + Level uint8 + Native uint8 + User uint8 +} diff --git a/clash-meta/component/memory/memory_freebsd_arm.go b/clash-meta/component/memory/memory_freebsd_arm.go new file mode 100644 index 0000000000..9c9c220024 --- /dev/null +++ b/clash-meta/component/memory/memory_freebsd_arm.go @@ -0,0 +1,119 @@ +package memory + +const sizeOfKinfoProc = 0x440 + +type Timeval struct { + Sec int64 + Usec int64 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int32 + Ixrss int32 + Idrss int32 + Isrss int32 + Minflt int32 + Majflt int32 + Nswap int32 + Inblock int32 + Oublock int32 + Msgsnd int32 + Msgrcv int32 + Nsignals int32 + Nvcsw int32 + Nivcsw int32 +} + +type KinfoProc struct { + Structsize int32 + Layout int32 + Args int32 /* pargs */ + Paddr int32 /* proc */ + Addr int32 /* user */ + Tracep int32 /* vnode */ + Textvp int32 /* vnode */ + Fd int32 /* filedesc */ + Vmspace int32 /* vmspace */ + Wchan int32 + Pid int32 + Ppid int32 + Pgid int32 + Tpgid int32 + Sid int32 + Tsid int32 + Jobc int16 + Spare_short1 int16 + Tdev uint32 + Siglist [16]byte /* sigset */ + Sigmask [16]byte /* sigset */ + Sigignore [16]byte /* sigset */ + Sigcatch [16]byte /* sigset */ + Uid uint32 + Ruid uint32 + Svuid uint32 + Rgid uint32 + Svgid uint32 + Ngroups int16 + Spare_short2 int16 + Groups [16]uint32 + Size uint32 + Rssize int32 + Swrss int32 + Tsize int32 + Dsize int32 + Ssize int32 + Xstat uint16 + Acflag uint16 + Pctcpu uint32 + Estcpu uint32 + Slptime uint32 + Swtime uint32 + Cow uint32 + Runtime uint64 + Start Timeval + Childtime Timeval + Flag int32 + Kiflag int32 + Traceflag int32 + Stat int8 + Nice int8 + Lock int8 + Rqindex int8 + Oncpu uint8 + Lastcpu uint8 + Tdname [17]int8 + Wmesg [9]int8 + Login [18]int8 + Lockname [9]int8 + Comm [20]int8 + Emul [17]int8 + Loginclass [18]int8 + Sparestrings [50]int8 + Spareints [4]int32 + Flag2 int32 + Fibnum int32 + Cr_flags uint32 + Jid int32 + Numthreads int32 + Tid int32 + Pri Priority + Rusage Rusage + Rusage_ch Rusage + Pcb int32 /* pcb */ + Kstack int32 + Udata int32 + Tdaddr int32 /* thread */ + Spareptrs [6]int64 + Sparelongs [12]int64 + Sflag int64 + Tdflags int64 +} + +type Priority struct { + Class uint8 + Level uint8 + Native uint8 + User uint8 +} diff --git a/clash-meta/component/memory/memory_freebsd_arm64.go b/clash-meta/component/memory/memory_freebsd_arm64.go new file mode 100644 index 0000000000..4e228c9211 --- /dev/null +++ b/clash-meta/component/memory/memory_freebsd_arm64.go @@ -0,0 +1,125 @@ +package memory + +const sizeOfKinfoProc = 0x440 + +type Timeval struct { + Sec int64 + Usec int64 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int64 + Ixrss int64 + Idrss int64 + Isrss int64 + Minflt int64 + Majflt int64 + Nswap int64 + Inblock int64 + Oublock int64 + Msgsnd int64 + Msgrcv int64 + Nsignals int64 + Nvcsw int64 + Nivcsw int64 +} + +type KinfoProc struct { + Structsize int32 + Layout int32 + Args int64 /* pargs */ + Paddr int64 /* proc */ + Addr int64 /* user */ + Tracep int64 /* vnode */ + Textvp int64 /* vnode */ + Fd int64 /* filedesc */ + Vmspace int64 /* vmspace */ + Wchan int64 + Pid int32 + Ppid int32 + Pgid int32 + Tpgid int32 + Sid int32 + Tsid int32 + Jobc int16 + Spare_short1 int16 + Tdev_freebsd11 uint32 + Siglist [16]byte /* sigset */ + Sigmask [16]byte /* sigset */ + Sigignore [16]byte /* sigset */ + Sigcatch [16]byte /* sigset */ + Uid uint32 + Ruid uint32 + Svuid uint32 + Rgid uint32 + Svgid uint32 + Ngroups int16 + Spare_short2 int16 + Groups [16]uint32 + Size uint64 + Rssize int64 + Swrss int64 + Tsize int64 + Dsize int64 + Ssize int64 + Xstat uint16 + Acflag uint16 + Pctcpu uint32 + Estcpu uint32 + Slptime uint32 + Swtime uint32 + Cow uint32 + Runtime uint64 + Start Timeval + Childtime Timeval + Flag int64 + Kiflag int64 + Traceflag int32 + Stat uint8 + Nice int8 + Lock uint8 + Rqindex uint8 + Oncpu_old uint8 + Lastcpu_old uint8 + Tdname [17]uint8 + Wmesg [9]uint8 + Login [18]uint8 + Lockname [9]uint8 + Comm [20]int8 // changed from uint8 by hand + Emul [17]uint8 + Loginclass [18]uint8 + Moretdname [4]uint8 + Sparestrings [46]uint8 + Spareints [2]int32 + Tdev uint64 + Oncpu int32 + Lastcpu int32 + Tracer int32 + Flag2 int32 + Fibnum int32 + Cr_flags uint32 + Jid int32 + Numthreads int32 + Tid int32 + Pri Priority + Rusage Rusage + Rusage_ch Rusage + Pcb int64 /* pcb */ + Kstack int64 + Udata int64 + Tdaddr int64 /* thread */ + Pd int64 /* pwddesc, not accurate */ + Spareptrs [5]int64 + Sparelongs [12]int64 + Sflag int64 + Tdflags int64 +} + +type Priority struct { + Class uint8 + Level uint8 + Native uint8 + User uint8 +} diff --git a/clash-meta/component/memory/memory_linux.go b/clash-meta/component/memory/memory_linux.go new file mode 100644 index 0000000000..f79bc28fcb --- /dev/null +++ b/clash-meta/component/memory/memory_linux.go @@ -0,0 +1,37 @@ +package memory + +import ( + "os" + "path/filepath" + "strconv" + "strings" +) + +var pageSize = uint64(os.Getpagesize()) + +func GetMemoryInfo(pid int32) (*MemoryInfoStat, error) { + proc := os.Getenv("HOST_PROC") + if proc == "" { + proc = "/proc" + } + memPath := filepath.Join(proc, strconv.Itoa(int(pid)), "statm") + contents, err := os.ReadFile(memPath) + if err != nil { + return nil, err + } + fields := strings.Split(string(contents), " ") + + vms, err := strconv.ParseUint(fields[0], 10, 64) + if err != nil { + return nil, err + } + rss, err := strconv.ParseUint(fields[1], 10, 64) + if err != nil { + return nil, err + } + memInfo := &MemoryInfoStat{ + RSS: rss * pageSize, + VMS: vms * pageSize, + } + return memInfo, nil +} diff --git a/clash-meta/component/memory/memory_openbsd.go b/clash-meta/component/memory/memory_openbsd.go new file mode 100644 index 0000000000..e4e89996bd --- /dev/null +++ b/clash-meta/component/memory/memory_openbsd.go @@ -0,0 +1,95 @@ +package memory + +import ( + "bytes" + "encoding/binary" + "errors" + "unsafe" + + "golang.org/x/sys/unix" +) + +const ( + CTLKern = 1 + KernProc = 14 + KernProcPID = 1 +) + +func callKernProcSyscall(op int32, arg int32) ([]byte, uint64, error) { + mib := []int32{CTLKern, KernProc, op, arg, sizeOfKinfoProc, 0} + mibptr := unsafe.Pointer(&mib[0]) + miblen := uint64(len(mib)) + length := uint64(0) + _, _, err := unix.Syscall6( + unix.SYS___SYSCTL, + uintptr(mibptr), + uintptr(miblen), + 0, + uintptr(unsafe.Pointer(&length)), + 0, + 0) + if err != 0 { + return nil, length, err + } + + count := int32(length / uint64(sizeOfKinfoProc)) + mib = []int32{CTLKern, KernProc, op, arg, sizeOfKinfoProc, count} + mibptr = unsafe.Pointer(&mib[0]) + miblen = uint64(len(mib)) + // get proc info itself + buf := make([]byte, length) + _, _, err = unix.Syscall6( + unix.SYS___SYSCTL, + uintptr(mibptr), + uintptr(miblen), + uintptr(unsafe.Pointer(&buf[0])), + uintptr(unsafe.Pointer(&length)), + 0, + 0) + if err != 0 { + return buf, length, err + } + + return buf, length, nil +} + +func parseKinfoProc(buf []byte) (KinfoProc, error) { + var k KinfoProc + br := bytes.NewReader(buf) + err := binary.Read(br, binary.LittleEndian, &k) + return k, err +} + +func getKProc(pid int32) (*KinfoProc, error) { + buf, length, err := callKernProcSyscall(KernProcPID, pid) + if err != nil { + return nil, err + } + if length != sizeOfKinfoProc { + return nil, errors.New("unexpected size of KinfoProc") + } + + k, err := parseKinfoProc(buf) + if err != nil { + return nil, err + } + return &k, nil +} + +func GetMemoryInfo(pid int32) (*MemoryInfoStat, error) { + k, err := getKProc(pid) + if err != nil { + return nil, err + } + uvmexp, err := unix.SysctlUvmexp("vm.uvmexp") + if err != nil { + return nil, err + } + pageSize := uint64(uvmexp.Pagesize) + + return &MemoryInfoStat{ + RSS: uint64(k.Vm_rssize) * pageSize, + VMS: uint64(k.Vm_tsize) + uint64(k.Vm_dsize) + + uint64(k.Vm_ssize), + }, nil +} diff --git a/clash-meta/component/memory/memory_openbsd_386.go b/clash-meta/component/memory/memory_openbsd_386.go new file mode 100644 index 0000000000..ead031754f --- /dev/null +++ b/clash-meta/component/memory/memory_openbsd_386.go @@ -0,0 +1,99 @@ +package memory + +const sizeOfKinfoProc = 0x264 + +type KinfoProc struct { + Forw uint64 + Back uint64 + Paddr uint64 + Addr uint64 + Fd uint64 + Stats uint64 + Limit uint64 + Vmspace uint64 + Sigacts uint64 + Sess uint64 + Tsess uint64 + Ru uint64 + Eflag int32 + Exitsig int32 + Flag int32 + Pid int32 + Ppid int32 + Sid int32 + X_pgid int32 + Tpgid int32 + Uid uint32 + Ruid uint32 + Gid uint32 + Rgid uint32 + Groups [16]uint32 + Ngroups int16 + Jobc int16 + Tdev uint32 + Estcpu uint32 + Rtime_sec uint32 + Rtime_usec uint32 + Cpticks int32 + Pctcpu uint32 + Swtime uint32 + Slptime uint32 + Schedflags int32 + Uticks uint64 + Sticks uint64 + Iticks uint64 + Tracep uint64 + Traceflag int32 + Holdcnt int32 + Siglist int32 + Sigmask uint32 + Sigignore uint32 + Sigcatch uint32 + Stat int8 + Priority uint8 + Usrpri uint8 + Nice uint8 + Xstat uint16 + Acflag uint16 + Comm [24]int8 + Wmesg [8]int8 + Wchan uint64 + Login [32]int8 + Vm_rssize int32 + Vm_tsize int32 + Vm_dsize int32 + Vm_ssize int32 + Uvalid int64 + Ustart_sec uint64 + Ustart_usec uint32 + Uutime_sec uint32 + Uutime_usec uint32 + Ustime_sec uint32 + Ustime_usec uint32 + Uru_maxrss uint64 + Uru_ixrss uint64 + Uru_idrss uint64 + Uru_isrss uint64 + Uru_minflt uint64 + Uru_majflt uint64 + Uru_nswap uint64 + Uru_inblock uint64 + Uru_oublock uint64 + Uru_msgsnd uint64 + Uru_msgrcv uint64 + Uru_nsignals uint64 + Uru_nvcsw uint64 + Uru_nivcsw uint64 + Uctime_sec uint32 + Uctime_usec uint32 + Psflags int32 + Spare int32 + Svuid uint32 + Svgid uint32 + Emul [8]int8 + Rlim_rss_cur uint64 + Cpuid uint64 + Vm_map_size uint64 + Tid int32 + Rtableid uint32 +} diff --git a/clash-meta/component/memory/memory_openbsd_amd64.go b/clash-meta/component/memory/memory_openbsd_amd64.go new file mode 100644 index 0000000000..1f9ae2d38a --- /dev/null +++ b/clash-meta/component/memory/memory_openbsd_amd64.go @@ -0,0 +1,100 @@ +package memory + +const sizeOfKinfoProc = 0x268 + +type KinfoProc struct { + Forw uint64 + Back uint64 + Paddr uint64 + Addr uint64 + Fd uint64 + Stats uint64 + Limit uint64 + Vmspace uint64 + Sigacts uint64 + Sess uint64 + Tsess uint64 + Ru uint64 + Eflag int32 + Exitsig int32 + Flag int32 + Pid int32 + Ppid int32 + Sid int32 + X_pgid int32 + Tpgid int32 + Uid uint32 + Ruid uint32 + Gid uint32 + Rgid uint32 + Groups [16]uint32 + Ngroups int16 + Jobc int16 + Tdev uint32 + Estcpu uint32 + Rtime_sec uint32 + Rtime_usec uint32 + Cpticks int32 + Pctcpu uint32 + Swtime uint32 + Slptime uint32 + Schedflags int32 + Uticks uint64 + Sticks uint64 + Iticks uint64 + Tracep uint64 + Traceflag int32 + Holdcnt int32 + Siglist int32 + Sigmask uint32 + Sigignore uint32 + Sigcatch uint32 + Stat int8 + Priority uint8 + Usrpri uint8 + Nice uint8 + Xstat uint16 + Acflag uint16 + Comm [24]int8 + Wmesg [8]int8 + Wchan uint64 + Login [32]int8 + Vm_rssize int32 + Vm_tsize int32 + Vm_dsize int32 + Vm_ssize int32 + Uvalid int64 + Ustart_sec uint64 + Ustart_usec uint32 + Uutime_sec uint32 + Uutime_usec uint32 + Ustime_sec uint32 + Ustime_usec uint32 + Pad_cgo_0 [4]byte + Uru_maxrss uint64 + Uru_ixrss uint64 + Uru_idrss uint64 + Uru_isrss uint64 + Uru_minflt uint64 + Uru_majflt uint64 + Uru_nswap uint64 + Uru_inblock uint64 + Uru_oublock uint64 + Uru_msgsnd uint64 + Uru_msgrcv uint64 + Uru_nsignals uint64 + Uru_nvcsw uint64 + Uru_nivcsw uint64 + Uctime_sec uint32 + Uctime_usec uint32 + Psflags int32 + Spare int32 + Svuid uint32 + Svgid uint32 + Emul [8]int8 + Rlim_rss_cur uint64 + Cpuid uint64 + Vm_map_size uint64 + Tid int32 + Rtableid uint32 +} diff --git a/clash-meta/component/memory/memory_openbsd_arm.go b/clash-meta/component/memory/memory_openbsd_arm.go new file mode 100644 index 0000000000..ead031754f --- /dev/null +++ b/clash-meta/component/memory/memory_openbsd_arm.go @@ -0,0 +1,99 @@ +package memory + +const sizeOfKinfoProc = 0x264 + +type KinfoProc struct { + Forw uint64 + Back uint64 + Paddr uint64 + Addr uint64 + Fd uint64 + Stats uint64 + Limit uint64 + Vmspace uint64 + Sigacts uint64 + Sess uint64 + Tsess uint64 + Ru uint64 + Eflag int32 + Exitsig int32 + Flag int32 + Pid int32 + Ppid int32 + Sid int32 + X_pgid int32 + Tpgid int32 + Uid uint32 + Ruid uint32 + Gid uint32 + Rgid uint32 + Groups [16]uint32 + Ngroups int16 + Jobc int16 + Tdev uint32 + Estcpu uint32 + Rtime_sec uint32 + Rtime_usec uint32 + Cpticks int32 + Pctcpu uint32 + Swtime uint32 + Slptime uint32 + Schedflags int32 + Uticks uint64 + Sticks uint64 + Iticks uint64 + Tracep uint64 + Traceflag int32 + Holdcnt int32 + Siglist int32 + Sigmask uint32 + Sigignore uint32 + Sigcatch uint32 + Stat int8 + Priority uint8 + Usrpri uint8 + Nice uint8 + Xstat uint16 + Acflag uint16 + Comm [24]int8 + Wmesg [8]int8 + Wchan uint64 + Login [32]int8 + Vm_rssize int32 + Vm_tsize int32 + Vm_dsize int32 + Vm_ssize int32 + Uvalid int64 + Ustart_sec uint64 + Ustart_usec uint32 + Uutime_sec uint32 + Uutime_usec uint32 + Ustime_sec uint32 + Ustime_usec uint32 + Uru_maxrss uint64 + Uru_ixrss uint64 + Uru_idrss uint64 + Uru_isrss uint64 + Uru_minflt uint64 + Uru_majflt uint64 + Uru_nswap uint64 + Uru_inblock uint64 + Uru_oublock uint64 + Uru_msgsnd uint64 + Uru_msgrcv uint64 + Uru_nsignals uint64 + Uru_nvcsw uint64 + Uru_nivcsw uint64 + Uctime_sec uint32 + Uctime_usec uint32 + Psflags int32 + Spare int32 + Svuid uint32 + Svgid uint32 + Emul [8]int8 + Rlim_rss_cur uint64 + Cpuid uint64 + Vm_map_size uint64 + Tid int32 + Rtableid uint32 +} diff --git a/clash-meta/component/memory/memory_openbsd_arm64.go b/clash-meta/component/memory/memory_openbsd_arm64.go new file mode 100644 index 0000000000..f0fb9107a8 --- /dev/null +++ b/clash-meta/component/memory/memory_openbsd_arm64.go @@ -0,0 +1,100 @@ +package memory + +const sizeOfKinfoProc = 0x270 + +type KinfoProc struct { + Forw uint64 + Back uint64 + Paddr uint64 + Addr uint64 + Fd uint64 + Stats uint64 + Limit uint64 + Vmspace uint64 + Sigacts uint64 + Sess uint64 + Tsess uint64 + Ru uint64 + Eflag int32 + Exitsig int32 + Flag int32 + Pid int32 + Ppid int32 + Sid int32 + X_pgid int32 + Tpgid int32 + Uid uint32 + Ruid uint32 + Gid uint32 + Rgid uint32 + Groups [16]uint32 + Ngroups int16 + Jobc int16 + Tdev uint32 + Estcpu uint32 + Rtime_sec uint32 + Rtime_usec uint32 + Cpticks int32 + Pctcpu uint32 + Swtime uint32 + Slptime uint32 + Schedflags int32 + Uticks uint64 + Sticks uint64 + Iticks uint64 + Tracep uint64 + Traceflag int32 + Holdcnt int32 + Siglist int32 + Sigmask uint32 + Sigignore uint32 + Sigcatch uint32 + Stat int8 + Priority uint8 + Usrpri uint8 + Nice uint8 + Xstat uint16 + Acflag uint16 + Comm [24]int8 + Wmesg [8]uint8 + Wchan uint64 + Login [32]uint8 + Vm_rssize int32 + Vm_tsize int32 + Vm_dsize int32 + Vm_ssize int32 + Uvalid int64 + Ustart_sec uint64 + Ustart_usec uint32 + Uutime_sec uint32 + Uutime_usec uint32 + Ustime_sec uint32 + Ustime_usec uint32 + Uru_maxrss uint64 + Uru_ixrss uint64 + Uru_idrss uint64 + Uru_isrss uint64 + Uru_minflt uint64 + Uru_majflt uint64 + Uru_nswap uint64 + Uru_inblock uint64 + Uru_oublock uint64 + Uru_msgsnd uint64 + Uru_msgrcv uint64 + Uru_nsignals uint64 + Uru_nvcsw uint64 + Uru_nivcsw uint64 + Uctime_sec uint32 + Uctime_usec uint32 + Psflags uint32 + Spare int32 + Svuid uint32 + Svgid uint32 + Emul [8]uint8 + Rlim_rss_cur uint64 + Cpuid uint64 + Vm_map_size uint64 + Tid int32 + Rtableid uint32 + Pledge uint64 +} diff --git a/clash-meta/component/memory/memory_openbsd_riscv64.go b/clash-meta/component/memory/memory_openbsd_riscv64.go new file mode 100644 index 0000000000..3b60d19bc7 --- /dev/null +++ b/clash-meta/component/memory/memory_openbsd_riscv64.go @@ -0,0 +1,101 @@ +package memory + +const sizeOfKinfoProc = 0x288 + +type KinfoProc struct { + Forw uint64 + Back uint64 + Paddr uint64 + Addr uint64 + Fd uint64 + Stats uint64 + Limit uint64 + Vmspace uint64 + Sigacts uint64 + Sess uint64 + Tsess uint64 + Ru uint64 + Eflag int32 + Exitsig int32 + Flag int32 + Pid int32 + Ppid int32 + Sid int32 + X_pgid int32 + Tpgid int32 + Uid uint32 + Ruid uint32 + Gid uint32 + Rgid uint32 + Groups [16]uint32 + Ngroups int16 + Jobc int16 + Tdev uint32 + Estcpu uint32 + Rtime_sec uint32 + Rtime_usec uint32 + Cpticks int32 + Pctcpu uint32 + Swtime uint32 + Slptime uint32 + Schedflags int32 + Uticks uint64 + Sticks uint64 + Iticks uint64 + Tracep uint64 + Traceflag int32 + Holdcnt int32 + Siglist int32 + Sigmask uint32 + Sigignore uint32 + Sigcatch uint32 + Stat int8 + Priority uint8 + Usrpri uint8 + Nice uint8 + Xstat uint16 + Spare uint16 + Comm [24]int8 + Wmesg [8]uint8 + Wchan uint64 + Login [32]uint8 + Vm_rssize int32 + Vm_tsize int32 + Vm_dsize int32 + Vm_ssize int32 + Uvalid int64 + Ustart_sec uint64 + Ustart_usec uint32 + Uutime_sec uint32 + Uutime_usec uint32 + Ustime_sec uint32 + Ustime_usec uint32 + Uru_maxrss uint64 + Uru_ixrss uint64 + Uru_idrss uint64 + Uru_isrss uint64 + Uru_minflt uint64 + Uru_majflt uint64 + Uru_nswap uint64 + Uru_inblock uint64 + Uru_oublock uint64 + Uru_msgsnd uint64 + Uru_msgrcv uint64 + Uru_nsignals uint64 + Uru_nvcsw uint64 + Uru_nivcsw uint64 + Uctime_sec uint32 + Uctime_usec uint32 + Psflags uint32 + Acflag uint32 + Svuid uint32 + Svgid uint32 + Emul [8]uint8 + Rlim_rss_cur uint64 + Cpuid uint64 + Vm_map_size uint64 + Tid int32 + Rtableid uint32 + Pledge uint64 + Name [24]uint8 +} diff --git a/clash-meta/component/memory/memory_test.go b/clash-meta/component/memory/memory_test.go new file mode 100644 index 0000000000..0af163be71 --- /dev/null +++ b/clash-meta/component/memory/memory_test.go @@ -0,0 +1,23 @@ +package memory + +import ( + "errors" + "os" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestMemoryInfo(t *testing.T) { + v, err := GetMemoryInfo(int32(os.Getpid())) + if errors.Is(err, ErrNotImplementedError) { + t.Skip("not implemented") + } + require.NoErrorf(t, err, "getting memory info error %v", err) + empty := MemoryInfoStat{} + if v == nil || *v == empty { + t.Errorf("could not get memory info %v", v) + } else { + t.Logf("memory info {RSS:%s, VMS:%s}", PrettyByteSize(v.RSS), PrettyByteSize(v.VMS)) + } +} diff --git a/clash-meta/component/memory/memory_windows.go b/clash-meta/component/memory/memory_windows.go new file mode 100644 index 0000000000..04dad08438 --- /dev/null +++ b/clash-meta/component/memory/memory_windows.go @@ -0,0 +1,66 @@ +package memory + +import ( + "syscall" + "unsafe" + + "golang.org/x/sys/windows" +) + +var ( + modpsapi = windows.NewLazySystemDLL("psapi.dll") + procGetProcessMemoryInfo = modpsapi.NewProc("GetProcessMemoryInfo") +) + +const processQueryInformation = windows.PROCESS_QUERY_LIMITED_INFORMATION + +type PROCESS_MEMORY_COUNTERS struct { + CB uint32 + PageFaultCount uint32 + PeakWorkingSetSize uint64 + WorkingSetSize uint64 + QuotaPeakPagedPoolUsage uint64 + QuotaPagedPoolUsage uint64 + QuotaPeakNonPagedPoolUsage uint64 + QuotaNonPagedPoolUsage uint64 + PagefileUsage uint64 + PeakPagefileUsage uint64 +} + +func getProcessMemoryInfo(h windows.Handle, mem *PROCESS_MEMORY_COUNTERS) (err error) { + r1, _, e1 := syscall.Syscall(procGetProcessMemoryInfo.Addr(), 3, uintptr(h), uintptr(unsafe.Pointer(mem)), uintptr(unsafe.Sizeof(*mem))) + if r1 == 0 { + if e1 != 0 { + err = error(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func getMemoryInfo(pid int32) (PROCESS_MEMORY_COUNTERS, error) { + var mem PROCESS_MEMORY_COUNTERS + c, err := windows.OpenProcess(processQueryInformation, false, uint32(pid)) + if err != nil { + return mem, err + } + defer windows.CloseHandle(c) + if err := getProcessMemoryInfo(c, &mem); err != nil { + return mem, err + } + + return mem, err +} + +func GetMemoryInfo(pid int32) (*MemoryInfoStat, error) { + mem, err := getMemoryInfo(pid) + if err != nil { + return nil, err + } + ret := &MemoryInfoStat{ + RSS: uint64(mem.WorkingSetSize), + VMS: uint64(mem.PagefileUsage), + } + return ret, nil +} diff --git a/clash-meta/docs/config.yaml b/clash-meta/docs/config.yaml index 574188182a..090e273668 100644 --- a/clash-meta/docs/config.yaml +++ b/clash-meta/docs/config.yaml @@ -543,7 +543,7 @@ proxies: # socks5 plugin: kcptun plugin-opts: key: it's a secrect # pre-shared secret between client and server - crypt: aes # aes, aes-128, aes-192, salsa20, blowfish, twofish, cast5, 3des, tea, xtea, xor, sm4, none, null + crypt: aes # aes, aes-128, aes-192, salsa20, blowfish, twofish, cast5, 3des, tea, xtea, xor, none, null mode: fast # profiles: fast3, fast2, fast, normal, manual conn: 1 # set num of UDP connections to server autoexpire: 0 # set auto expiration time(in seconds) for a single UDP connection, 0 to disable @@ -558,7 +558,7 @@ proxies: # socks5 acknodelay: false # flush ack immediately when a packet is received nodelay: 0 interval: 50 - resend: false + resend: 0 sockbuf: 4194304 # per-socket buffer in bytes smuxver: 1 # specify smux version, available 1,2 smuxbuf: 4194304 # the overall de-mux buffer in bytes @@ -1370,7 +1370,7 @@ listeners: # kcp-tun: # enable: false # key: it's a secrect # pre-shared secret between client and server - # crypt: aes # aes, aes-128, aes-192, salsa20, blowfish, twofish, cast5, 3des, tea, xtea, xor, sm4, none, null + # crypt: aes # aes, aes-128, aes-192, salsa20, blowfish, twofish, cast5, 3des, tea, xtea, xor, none, null # mode: fast # profiles: fast3, fast2, fast, normal, manual # conn: 1 # set num of UDP connections to server # autoexpire: 0 # set auto expiration time(in seconds) for a single UDP connection, 0 to disable @@ -1385,7 +1385,7 @@ listeners: # acknodelay: false # flush ack immediately when a packet is received # nodelay: 0 # interval: 50 - # resend: false + # resend: 0 # sockbuf: 4194304 # per-socket buffer in bytes # smuxver: 1 # specify smux version, available 1,2 # smuxbuf: 4194304 # the overall de-mux buffer in bytes diff --git a/clash-meta/go.mod b/clash-meta/go.mod index d807b73219..6b7a8d6997 100644 --- a/clash-meta/go.mod +++ b/clash-meta/go.mod @@ -6,6 +6,7 @@ require ( github.com/bahlo/generic-list-go v0.2.0 github.com/coreos/go-iptables v0.8.0 github.com/dlclark/regexp2 v1.11.5 + github.com/ebitengine/purego v0.9.0 github.com/enfein/mieru/v3 v3.20.0 github.com/go-chi/chi/v5 v5.2.3 github.com/go-chi/render v1.0.3 @@ -37,7 +38,7 @@ require ( github.com/metacubex/sing-wireguard v0.0.0-20250503063753-2dc62acc626f github.com/metacubex/smux v0.0.0-20250922175018-15c9a6a78719 github.com/metacubex/tfo-go v0.0.0-20250921095601-b102db4216c0 - github.com/metacubex/utls v1.8.1-0.20250923145048-0a5bbc90dd3e + github.com/metacubex/utls v1.8.1 github.com/metacubex/wireguard-go v0.0.0-20250820062549-a6cecdd7f57f github.com/miekg/dns v1.1.63 // lastest version compatible with golang1.20 github.com/mroth/weightedrand/v2 v2.1.0 @@ -46,7 +47,6 @@ require ( github.com/sagernet/cors v1.2.1 github.com/sagernet/netlink v0.0.0-20240612041022-b9a21c07ac6a github.com/samber/lo v1.51.0 - github.com/shirou/gopsutil/v4 v4.25.1 // lastest version compatible with golang1.20 github.com/sirupsen/logrus v1.9.3 github.com/stretchr/testify v1.11.1 github.com/vmihailenco/msgpack/v5 v5.4.1 @@ -70,7 +70,6 @@ require ( github.com/andybalholm/brotli v1.0.6 // indirect github.com/buger/jsonparser v1.1.1 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/ebitengine/purego v0.8.4 // indirect github.com/ericlagergren/aegis v0.0.0-20250325060835-cd0defd64358 // indirect github.com/ericlagergren/polyval v0.0.0-20220411101811-e25bc10ba391 // indirect github.com/ericlagergren/siv v0.0.0-20220507050439-0b757b3aa5f1 // indirect @@ -88,7 +87,6 @@ require ( github.com/klauspost/cpuid/v2 v2.2.6 // indirect github.com/klauspost/reedsolomon v1.12.3 // indirect github.com/kr/text v0.2.0 // indirect - github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/mdlayher/socket v0.4.1 // indirect github.com/metacubex/ascon v0.1.0 // indirect @@ -99,17 +97,13 @@ require ( github.com/onsi/ginkgo/v2 v2.9.5 // indirect github.com/pierrec/lz4/v4 v4.1.14 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect github.com/quic-go/qpack v0.4.0 // 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/rabbitio v0.0.0-20220730151941-9ce26f4f872e // 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/vishvananda/netns v0.0.4 // indirect github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect - github.com/yusufpapurcu/wmi v1.2.4 // indirect gitlab.com/yawning/bsaes.git v0.0.0-20190805113838-0a714cd429ec // indirect go.uber.org/mock v0.4.0 // indirect golang.org/x/mod v0.20.0 // indirect diff --git a/clash-meta/go.sum b/clash-meta/go.sum index 5bd6da5110..271e8c1c80 100644 --- a/clash-meta/go.sum +++ b/clash-meta/go.sum @@ -23,8 +23,8 @@ 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.11.5 h1:Q/sSnsKerHeCkc/jSTNq1oCm7KiVgUMZRDUoRu0JQZQ= github.com/dlclark/regexp2 v1.11.5/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= -github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= -github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/ebitengine/purego v0.9.0 h1:mh0zpKBIXDceC63hpvPuGLiJ8ZAa3DfrFTudmfi8A4k= +github.com/ebitengine/purego v0.9.0/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= github.com/enfein/mieru/v3 v3.20.0 h1:1ob7pCIVSH5FYFAfYvim8isLW1vBOS4cFOUF9exJS38= github.com/enfein/mieru/v3 v3.20.0/go.mod h1:zJBUCsi5rxyvHM8fjFf+GLaEl4OEjjBXr1s5F6Qd3hM= github.com/ericlagergren/aegis v0.0.0-20250325060835-cd0defd64358 h1:kXYqH/sL8dS/FdoFjr12ePjnLPorPo2FsnrHNuXSDyo= @@ -45,7 +45,6 @@ github.com/go-chi/chi/v5 v5.2.3/go.mod h1:L2yAIGWB3H+phAw1NxKwWM+7eUH/lU8pOMm5hH 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/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= @@ -64,7 +63,6 @@ github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs= 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/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/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 h1:yAJXTCF9TqKcTiHJAE8dj7HMvPfh66eeA2JYW7eFpSE= @@ -86,8 +84,6 @@ github.com/klauspost/reedsolomon v1.12.3/go.mod h1:3K5rXwABAvzGeR01r6pWZieUALXO/ github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= -github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= 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= @@ -145,8 +141,8 @@ github.com/metacubex/smux v0.0.0-20250922175018-15c9a6a78719 h1:T6qCCfolRDAVJKea github.com/metacubex/smux v0.0.0-20250922175018-15c9a6a78719/go.mod h1:4bPD8HWx9jPJ9aE4uadgyN7D1/Wz3KmPy+vale8sKLE= github.com/metacubex/tfo-go v0.0.0-20250921095601-b102db4216c0 h1:Ui+/2s5Qz0lSnDUBmEL12M5Oi/PzvFxGTNohm8ZcsmE= github.com/metacubex/tfo-go v0.0.0-20250921095601-b102db4216c0/go.mod h1:l9oLnLoEXyGZ5RVLsh7QCC5XsouTUyKk4F2nLm2DHLw= -github.com/metacubex/utls v1.8.1-0.20250923145048-0a5bbc90dd3e h1:t9IxEaxSRp3YJ1ewQV4oGkKaJaMeSoUWjOV0boLVQo8= -github.com/metacubex/utls v1.8.1-0.20250923145048-0a5bbc90dd3e/go.mod h1:kncGGVhFaoGn5M3pFe3SXhZCzsbCJayNOH4UEqTKTko= +github.com/metacubex/utls v1.8.1 h1:RW8GeCGWAegjV0HW5nw9DoqNoeGAXXeYUP6AysmRvx4= +github.com/metacubex/utls v1.8.1/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= @@ -172,8 +168,6 @@ 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/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= 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/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g= github.com/quic-go/qpack v0.4.0 h1:Cr9BXA1sQS2SmDUWjSofMPNKmvF6IiIfDRmgU0w1ZCo= github.com/quic-go/qpack v0.4.0/go.mod h1:UZVnYIfi5GRk+zI9UMaCPsmZ2xKJP7XBUvVyT1Knj9A= @@ -183,8 +177,6 @@ github.com/sagernet/netlink v0.0.0-20240612041022-b9a21c07ac6a h1:ObwtHN2VpqE0ZN github.com/sagernet/netlink v0.0.0-20240612041022-b9a21c07ac6a/go.mod h1:xLnfdiJbSp8rNqYEdIW/6eDO4mVoogml14Bh2hSiFpM= github.com/samber/lo v1.51.0 h1:kysRYLbHy/MB7kQZf5DSN50JHmMsNEdeY24VzJFu7wI= github.com/samber/lo v1.51.0/go.mod h1:4+MXEGsJzbKGaUEQFKBq2xtfuznW9oz/WrgyzMzRoM0= -github.com/shirou/gopsutil/v4 v4.25.1 h1:QSWkTc+fu9LTAWfkZwZ6j8MSUk4A2LV7rbH0ZqmLjXs= -github.com/shirou/gopsutil/v4 v4.25.1/go.mod h1:RoUCUpndaJFtT+2zsZzzmhvbfGoDCJ7nFXKJf8GqJbI= 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/rabaead v0.0.0-20220730151906-ab6e06b96e8c h1:DjKMC30y6yjG3IxDaeAj3PCoRr+IsO+bzyT+Se2m2Hk= @@ -206,10 +198,6 @@ github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXl github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= -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/go.mod h1:eLL9Nub3yfAho7qB0MzZizFhTU2QkLeoVsWdHtDW264= github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= @@ -224,8 +212,6 @@ github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV github.com/wk8/go-ordered-map/v2 v2.1.8 h1:5h/BUHu93oj4gIdvHHHGsScSTMijfx5PeYkE/fJgbpc= github.com/wk8/go-ordered-map/v2 v2.1.8/go.mod h1:5nJHM5DyteebpVlHnWMV0rPz6Zp7+xBAnxjb1X5vnTw= github.com/xtaci/lossyconn v0.0.0-20190602105132-8df528c0c9ae h1:J0GxkO96kL4WF+AIT3M4mfUVinOCPgf2uUWYFUzN0sM= -github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= -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/go.mod h1:E+rxHvJG9H6PUdzq9NRG6csuLN3XUx98BfGOVWNYnXs= gitlab.com/yawning/bsaes.git v0.0.0-20190805113838-0a714cd429ec h1:FpfFs4EhNehiVfzQttTuxanPIT43FtkkCFypIod8LHo= @@ -257,17 +243,13 @@ golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5h 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-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-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-20220715151400-c0bba94af5f8/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.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= @@ -281,7 +263,6 @@ golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapK golang.org/x/tools v0.24.0 h1:J1shsA93PJUEVaUSaay7UXAyE8aimq3GW0pjlolpa24= 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-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/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/clash-meta/tunnel/statistic/manager.go b/clash-meta/tunnel/statistic/manager.go index 90a34b6d0f..9db4601e14 100644 --- a/clash-meta/tunnel/statistic/manager.go +++ b/clash-meta/tunnel/statistic/manager.go @@ -6,8 +6,7 @@ import ( "github.com/metacubex/mihomo/common/atomic" "github.com/metacubex/mihomo/common/xsync" - - "github.com/shirou/gopsutil/v4/process" + "github.com/metacubex/mihomo/component/memory" ) var DefaultManager *Manager @@ -20,7 +19,7 @@ func init() { downloadBlip: atomic.NewInt64(0), uploadTotal: atomic.NewInt64(0), downloadTotal: atomic.NewInt64(0), - process: &process.Process{Pid: int32(os.Getpid())}, + pid: int32(os.Getpid()), } go DefaultManager.handle() @@ -34,7 +33,7 @@ type Manager struct { downloadBlip atomic.Int64 uploadTotal atomic.Int64 downloadTotal atomic.Int64 - process *process.Process + pid int32 memory uint64 } @@ -93,7 +92,7 @@ func (m *Manager) Snapshot() *Snapshot { } func (m *Manager) updateMemory() { - stat, err := m.process.MemoryInfo() + stat, err := memory.GetMemoryInfo(m.pid) if err != nil { return } diff --git a/clash-nyanpasu/frontend/nyanpasu/package.json b/clash-nyanpasu/frontend/nyanpasu/package.json index a128741f04..bace60b281 100644 --- a/clash-nyanpasu/frontend/nyanpasu/package.json +++ b/clash-nyanpasu/frontend/nyanpasu/package.json @@ -31,7 +31,7 @@ "country-code-emoji": "2.3.0", "country-emoji": "1.5.6", "dayjs": "1.11.18", - "framer-motion": "12.23.16", + "framer-motion": "12.23.21", "i18next": "25.5.2", "jotai": "2.14.0", "json-schema": "0.4.0", @@ -49,7 +49,7 @@ "react-use": "17.6.0", "rxjs": "7.8.2", "swr": "2.3.6", - "virtua": "0.43.3", + "virtua": "0.43.4", "vite-bundle-visualizer": "1.2.1" }, "devDependencies": { @@ -83,7 +83,7 @@ "meta-json-schema": "1.19.13", "monaco-yaml": "5.4.0", "nanoid": "5.1.6", - "sass-embedded": "1.93.1", + "sass-embedded": "1.93.2", "shiki": "2.5.0", "unplugin-auto-import": "20.1.0", "unplugin-icons": "22.3.0", diff --git a/clash-nyanpasu/frontend/nyanpasu/src/store/index.ts b/clash-nyanpasu/frontend/nyanpasu/src/store/index.ts index e4c82443f6..a201b58412 100644 --- a/clash-nyanpasu/frontend/nyanpasu/src/store/index.ts +++ b/clash-nyanpasu/frontend/nyanpasu/src/store/index.ts @@ -3,7 +3,6 @@ import { atomWithStorage, createJSONStorage } from 'jotai/utils' import { SortType } from '@/components/proxies/utils' import { FileRouteTypes } from '@/routeTree.gen' import { NyanpasuStorage } from '@/services/storage' -import { LogMessage } from '@nyanpasu/interface' const atomWithLocalStorage = (key: string, initialValue: T) => { const getInitialValue = (): T => { @@ -33,7 +32,9 @@ const atomWithLocalStorage = (key: string, initialValue: T) => { export const memorizedRoutePathAtom = atomWithStorage< FileRouteTypes['fullPaths'] | null ->('memorizedRoutePathAtom', null) +>('memorizedRoutePathAtom', null, undefined, { + getOnInit: true, +}) export const proxyGroupAtom = atomWithLocalStorage<{ selector: number | null diff --git a/clash-nyanpasu/frontend/ui/package.json b/clash-nyanpasu/frontend/ui/package.json index bbb5e98ccb..6279dfb0b7 100644 --- a/clash-nyanpasu/frontend/ui/package.json +++ b/clash-nyanpasu/frontend/ui/package.json @@ -23,7 +23,7 @@ "@vitejs/plugin-react": "5.0.3", "ahooks": "3.9.5", "d3": "7.9.0", - "framer-motion": "12.23.16", + "framer-motion": "12.23.21", "react": "19.1.1", "react-dom": "19.1.1", "react-error-boundary": "6.0.0", @@ -38,7 +38,7 @@ "@types/d3-interpolate-path": "2.0.3", "clsx": "2.1.1", "d3-interpolate-path": "2.3.0", - "sass-embedded": "1.93.1", + "sass-embedded": "1.93.2", "tailwind-merge": "3.3.1", "typescript-plugin-css-modules": "5.2.0", "vite-plugin-dts": "4.5.4" diff --git a/clash-nyanpasu/manifest/version.json b/clash-nyanpasu/manifest/version.json index f8db3b1f27..95cd781f30 100644 --- a/clash-nyanpasu/manifest/version.json +++ b/clash-nyanpasu/manifest/version.json @@ -2,10 +2,10 @@ "manifest_version": 1, "latest": { "mihomo": "v1.19.13", - "mihomo_alpha": "alpha-8a9300d", + "mihomo_alpha": "alpha-57b527d", "clash_rs": "v0.9.0", "clash_premium": "2023-09-05-gdcc8d87", - "clash_rs_alpha": "0.9.0-alpha+sha.50f295d" + "clash_rs_alpha": "0.9.0-alpha+sha.2784d7a" }, "arch_template": { "mihomo": { @@ -69,5 +69,5 @@ "linux-armv7hf": "clash-armv7-unknown-linux-gnueabihf" } }, - "updated_at": "2025-09-22T22:20:56.709Z" + "updated_at": "2025-09-23T22:20:51.447Z" } diff --git a/clash-nyanpasu/package.json b/clash-nyanpasu/package.json index 2dd2eb3928..a198ccf087 100644 --- a/clash-nyanpasu/package.json +++ b/clash-nyanpasu/package.json @@ -85,7 +85,7 @@ "eslint-plugin-react-compiler": "19.1.0-rc.2", "eslint-plugin-react-hooks": "5.2.0", "globals": "16.4.0", - "knip": "5.63.1", + "knip": "5.64.0", "lint-staged": "16.1.6", "neostandard": "0.12.2", "npm-run-all2": "8.0.4", diff --git a/clash-nyanpasu/pnpm-lock.yaml b/clash-nyanpasu/pnpm-lock.yaml index acbf7a25ec..974f02bdef 100644 --- a/clash-nyanpasu/pnpm-lock.yaml +++ b/clash-nyanpasu/pnpm-lock.yaml @@ -104,8 +104,8 @@ importers: specifier: 16.4.0 version: 16.4.0 knip: - specifier: 5.63.1 - version: 5.63.1(@types/node@24.3.1)(typescript@5.9.2) + specifier: 5.64.0 + version: 5.64.0(@types/node@24.3.1)(typescript@5.9.2) lint-staged: specifier: 16.1.6 version: 16.1.6 @@ -276,8 +276,8 @@ importers: specifier: 1.11.18 version: 1.11.18 framer-motion: - specifier: 12.23.16 - version: 12.23.16(@emotion/is-prop-valid@1.3.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + specifier: 12.23.21 + version: 12.23.21(@emotion/is-prop-valid@1.3.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) i18next: specifier: 25.5.2 version: 25.5.2(typescript@5.9.2) @@ -330,8 +330,8 @@ importers: specifier: 2.3.6 version: 2.3.6(react@19.1.1) virtua: - specifier: 0.43.3 - version: 0.43.3(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(solid-js@1.9.5) + specifier: 0.43.4 + version: 0.43.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(solid-js@1.9.5) vite-bundle-visualizer: specifier: 1.2.1 version: 1.2.1(rollup@4.46.2) @@ -362,7 +362,7 @@ importers: version: 1.131.50(@tanstack/react-router@1.131.50(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@tanstack/router-core@1.131.50)(csstype@3.1.3)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(solid-js@1.9.5)(tiny-invariant@1.3.3) '@tanstack/router-plugin': specifier: 1.131.50 - version: 1.131.50(@tanstack/react-router@1.131.50(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(vite@7.1.7(@types/node@24.3.1)(jiti@2.5.1)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.93.1)(sass@1.93.1)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.5)(yaml@2.8.1)) + version: 1.131.50(@tanstack/react-router@1.131.50(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(vite@7.1.7(@types/node@24.3.1)(jiti@2.5.1)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.93.2)(sass@1.93.2)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.5)(yaml@2.8.1)) '@tauri-apps/plugin-clipboard-manager': specifier: 2.3.0 version: 2.3.0 @@ -398,13 +398,13 @@ importers: version: 13.15.3 '@vitejs/plugin-legacy': specifier: 7.2.1 - version: 7.2.1(terser@5.36.0)(vite@7.1.7(@types/node@24.3.1)(jiti@2.5.1)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.93.1)(sass@1.93.1)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.5)(yaml@2.8.1)) + version: 7.2.1(terser@5.36.0)(vite@7.1.7(@types/node@24.3.1)(jiti@2.5.1)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.93.2)(sass@1.93.2)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.5)(yaml@2.8.1)) '@vitejs/plugin-react': specifier: 5.0.3 - version: 5.0.3(vite@7.1.7(@types/node@24.3.1)(jiti@2.5.1)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.93.1)(sass@1.93.1)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.5)(yaml@2.8.1)) + version: 5.0.3(vite@7.1.7(@types/node@24.3.1)(jiti@2.5.1)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.93.2)(sass@1.93.2)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.5)(yaml@2.8.1)) '@vitejs/plugin-react-swc': specifier: 4.1.0 - version: 4.1.0(vite@7.1.7(@types/node@24.3.1)(jiti@2.5.1)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.93.1)(sass@1.93.1)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.5)(yaml@2.8.1)) + version: 4.1.0(vite@7.1.7(@types/node@24.3.1)(jiti@2.5.1)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.93.2)(sass@1.93.2)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.5)(yaml@2.8.1)) change-case: specifier: 5.4.4 version: 5.4.4 @@ -427,8 +427,8 @@ importers: specifier: 5.1.6 version: 5.1.6 sass-embedded: - specifier: 1.93.1 - version: 1.93.1 + specifier: 1.93.2 + version: 1.93.2 shiki: specifier: 2.5.0 version: 2.5.0 @@ -443,19 +443,19 @@ importers: version: 13.15.15 vite: specifier: 7.1.7 - version: 7.1.7(@types/node@24.3.1)(jiti@2.5.1)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.93.1)(sass@1.93.1)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.5)(yaml@2.8.1) + version: 7.1.7(@types/node@24.3.1)(jiti@2.5.1)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.93.2)(sass@1.93.2)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.5)(yaml@2.8.1) vite-plugin-html: specifier: 3.2.2 - version: 3.2.2(vite@7.1.7(@types/node@24.3.1)(jiti@2.5.1)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.93.1)(sass@1.93.1)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.5)(yaml@2.8.1)) + version: 3.2.2(vite@7.1.7(@types/node@24.3.1)(jiti@2.5.1)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.93.2)(sass@1.93.2)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.5)(yaml@2.8.1)) vite-plugin-sass-dts: specifier: 1.3.31 - version: 1.3.31(postcss@8.5.6)(prettier@3.6.2)(sass-embedded@1.93.1)(vite@7.1.7(@types/node@24.3.1)(jiti@2.5.1)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.93.1)(sass@1.93.1)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.5)(yaml@2.8.1)) + version: 1.3.31(postcss@8.5.6)(prettier@3.6.2)(sass-embedded@1.93.2)(vite@7.1.7(@types/node@24.3.1)(jiti@2.5.1)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.93.2)(sass@1.93.2)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.5)(yaml@2.8.1)) vite-plugin-svgr: specifier: 4.5.0 - version: 4.5.0(rollup@4.46.2)(typescript@5.9.2)(vite@7.1.7(@types/node@24.3.1)(jiti@2.5.1)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.93.1)(sass@1.93.1)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.5)(yaml@2.8.1)) + version: 4.5.0(rollup@4.46.2)(typescript@5.9.2)(vite@7.1.7(@types/node@24.3.1)(jiti@2.5.1)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.93.2)(sass@1.93.2)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.5)(yaml@2.8.1)) vite-tsconfig-paths: specifier: 5.1.4 - version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@24.3.1)(jiti@2.5.1)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.93.1)(sass@1.93.1)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.5)(yaml@2.8.1)) + version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@24.3.1)(jiti@2.5.1)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.93.2)(sass@1.93.2)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.5)(yaml@2.8.1)) zod: specifier: 4.1.11 version: 4.1.11 @@ -491,7 +491,7 @@ importers: version: 19.1.12 '@vitejs/plugin-react': specifier: 5.0.3 - version: 5.0.3(vite@7.1.7(@types/node@24.3.1)(jiti@2.5.1)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.93.1)(sass@1.93.1)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.5)(yaml@2.8.1)) + version: 5.0.3(vite@7.1.7(@types/node@24.3.1)(jiti@2.5.1)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.93.2)(sass@1.93.2)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.5)(yaml@2.8.1)) ahooks: specifier: 3.9.5 version: 3.9.5(react-dom@19.1.1(react@19.1.1))(react@19.1.1) @@ -499,8 +499,8 @@ importers: specifier: 7.9.0 version: 7.9.0 framer-motion: - specifier: 12.23.16 - version: 12.23.16(@emotion/is-prop-valid@1.3.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + specifier: 12.23.21 + version: 12.23.21(@emotion/is-prop-valid@1.3.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react: specifier: 19.1.1 version: 19.1.1 @@ -521,10 +521,10 @@ importers: version: 4.1.13 vite: specifier: 7.1.7 - version: 7.1.7(@types/node@24.3.1)(jiti@2.5.1)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.93.1)(sass@1.93.1)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.5)(yaml@2.8.1) + version: 7.1.7(@types/node@24.3.1)(jiti@2.5.1)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.93.2)(sass@1.93.2)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.5)(yaml@2.8.1) vite-tsconfig-paths: specifier: 5.1.4 - version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@24.3.1)(jiti@2.5.1)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.93.1)(sass@1.93.1)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.5)(yaml@2.8.1)) + version: 5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@24.3.1)(jiti@2.5.1)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.93.2)(sass@1.93.2)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.5)(yaml@2.8.1)) devDependencies: '@emotion/react': specifier: 11.14.0 @@ -539,8 +539,8 @@ importers: specifier: 2.3.0 version: 2.3.0 sass-embedded: - specifier: 1.93.1 - version: 1.93.1 + specifier: 1.93.2 + version: 1.93.2 tailwind-merge: specifier: 3.3.1 version: 3.3.1 @@ -549,7 +549,7 @@ importers: version: 5.2.0(typescript@5.9.2) vite-plugin-dts: specifier: 4.5.4 - version: 4.5.4(@types/node@24.3.1)(rollup@4.46.2)(typescript@5.9.2)(vite@7.1.7(@types/node@24.3.1)(jiti@2.5.1)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.93.1)(sass@1.93.1)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.5)(yaml@2.8.1)) + version: 4.5.4(@types/node@24.3.1)(rollup@4.46.2)(typescript@5.9.2)(vite@7.1.7(@types/node@24.3.1)(jiti@2.5.1)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.93.2)(sass@1.93.2)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.5)(yaml@2.8.1)) scripts: dependencies: @@ -1489,20 +1489,20 @@ packages: '@emnapi/core@1.4.3': resolution: {integrity: sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g==} - '@emnapi/core@1.4.5': - resolution: {integrity: sha512-XsLw1dEOpkSX/WucdqUhPWP7hDxSvZiY+fsUC14h+FtQ2Ifni4znbBt8punRX+Uj2JG/uDb8nEHVKvrVlvdZ5Q==} + '@emnapi/core@1.5.0': + resolution: {integrity: sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg==} '@emnapi/runtime@1.4.3': resolution: {integrity: sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==} - '@emnapi/runtime@1.4.5': - resolution: {integrity: sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg==} + '@emnapi/runtime@1.5.0': + resolution: {integrity: sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==} '@emnapi/wasi-threads@1.0.2': resolution: {integrity: sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA==} - '@emnapi/wasi-threads@1.0.4': - resolution: {integrity: sha512-PJR+bOmMOPH8AtcTGAyYNiuJ3/Fcoj2XN/gBEWzDIKh254XO+mM9XoXHk5GNEhodxeMznbg7BlRojVbKN+gC6g==} + '@emnapi/wasi-threads@1.1.0': + resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} '@emotion/babel-plugin@11.13.5': resolution: {integrity: sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==} @@ -2046,8 +2046,8 @@ packages: '@napi-rs/wasm-runtime@0.2.11': resolution: {integrity: sha512-9DPkXtvHydrcOsopiYpUgPHpmj0HWZKMUnL2dZqpvC42lsratuBG06V5ipyno0fUek5VlFsNQ+AcFATSrJXgMA==} - '@napi-rs/wasm-runtime@1.0.3': - resolution: {integrity: sha512-rZxtMsLwjdXkMUGC3WwsPwLNVqVqnTJT6MNIB6e+5fhMcSCPP0AOsNWuMQ5mdCq6HNjs/ZeWAEchpqeprqBD2Q==} + '@napi-rs/wasm-runtime@1.0.5': + resolution: {integrity: sha512-TBr9Cf9onSAS2LQ2+QHx6XcC6h9+RIzJgbqG3++9TUZSH204AwEy5jg3BTQ0VATsyoGj4ee49tN/y6rvaOOtcg==} '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} @@ -2312,98 +2312,98 @@ packages: '@oxc-project/types@0.74.0': resolution: {integrity: sha512-KOw/RZrVlHGhCXh1RufBFF7Nuo7HdY5w1lRJukM/igIl6x9qtz8QycDvZdzb4qnHO7znrPyo2sJrFJK2eKHgfQ==} - '@oxc-resolver/binding-android-arm-eabi@11.6.2': - resolution: {integrity: sha512-b1h87/Nv5QPiT2xXg7RiSzJ0HsKSMf1U8vj6cUKdEDD1+KhDaXEH9xffB5QE54Df3SM4+wrYVy9NREil7/0C/Q==} + '@oxc-resolver/binding-android-arm-eabi@11.8.3': + resolution: {integrity: sha512-er6onTUX8NMF5kBNGHCF8S6vxWVJS5BKO6SmLRW5nfZgHDHWsESH1YgyKpO6n6HBd/x58+7r9/1fxF3N8z911A==} cpu: [arm] os: [android] - '@oxc-resolver/binding-android-arm64@11.6.2': - resolution: {integrity: sha512-iIFsbWOQ42VJqOH0PkNs2+IcIjkmO7T+Gr27XDVXmaIWz3dkVYzYRlCtqGJOMIrjyUD52BtVXjej5s51i9Lgmg==} + '@oxc-resolver/binding-android-arm64@11.8.3': + resolution: {integrity: sha512-VJMGaFYTu5YoZ0kpRhQQQoqNsYuAbPEHb/b/gEqpNpl/zHtvLWha8fYqTGtH7Wu9ajA2ESdWVqOzbBRMjQ/5qA==} cpu: [arm64] os: [android] - '@oxc-resolver/binding-darwin-arm64@11.6.2': - resolution: {integrity: sha512-Lt/6pfDy2rtoxGmwFQOp4a9GxIW0CEUSQYofW1eQBpy/JpGM/AJgLTsg2nmgszODJpBOPO19GCIlzSZ7Et5cGg==} + '@oxc-resolver/binding-darwin-arm64@11.8.3': + resolution: {integrity: sha512-IipM4uDZNZ4GEvmq0g5iRS4Di3YoEhf/BdkvqIFq35rZA9EvYn/csxAJb05H7HDzbLENIUfMvP18eyHt3juU+A==} cpu: [arm64] os: [darwin] - '@oxc-resolver/binding-darwin-x64@11.6.2': - resolution: {integrity: sha512-UmGEeXk4/E3ubBWgoehVEQSBTEpl+UjZqY55sB+/5NHYFPMxY6PgG8y7dGZhyWPvwVW/pS/drnG3gptAjwF8cg==} + '@oxc-resolver/binding-darwin-x64@11.8.3': + resolution: {integrity: sha512-gJQnRKe60CNyx+KE7ffKouG15hIoV0mnM3fGGbXRUXW7hVYv2WIiKAJeNn/o/EQhT5i1GrfvskVZCHTwHljuxQ==} cpu: [x64] os: [darwin] - '@oxc-resolver/binding-freebsd-x64@11.6.2': - resolution: {integrity: sha512-p0Aj5aQKmyVamAtRio7Ct0Woh/iElvMxhAlbSWqJ9J/GH7lPG8H4R/iHWjURz+2iYPywqJICR8Eu1GDSApnzfA==} + '@oxc-resolver/binding-freebsd-x64@11.8.3': + resolution: {integrity: sha512-UphzSWPIHKuVt6zDoNBzj03SfQIk73cBjfzQXK33asriLMv9kPrt2k5Aaea/ZB2bphv5MAf1BxyacYgT0hjBuA==} cpu: [x64] os: [freebsd] - '@oxc-resolver/binding-linux-arm-gnueabihf@11.6.2': - resolution: {integrity: sha512-hDAF4FAkGxZsJCvutoBQ21LKcpUrvq5qAj3FpBTIzBaeIpupe6z0kHF9oIeTF8DJiLj4uEejaZXXtOSfJY50+A==} + '@oxc-resolver/binding-linux-arm-gnueabihf@11.8.3': + resolution: {integrity: sha512-kjVGH0BIJTCefpNWcD9PrHYzXLMeofHzHqykgPc+OIBdv7KKjtE2FPeQ6PAJFzsB1BbwK0AOtKppajwfpyt1jw==} cpu: [arm] os: [linux] - '@oxc-resolver/binding-linux-arm-musleabihf@11.6.2': - resolution: {integrity: sha512-LTUs3PG9O3YjGPbguiM/fhaoWr19Yu/vqkBKXgvUo2Zpa7InHzZzurMQU9BAPr6A7gnIrKQ3W61h+RhQfSuUGQ==} + '@oxc-resolver/binding-linux-arm-musleabihf@11.8.3': + resolution: {integrity: sha512-e+BDNYfkOKQSSF8KMrD7FwbBzbN+9mn14pCJk5pLLH9Mtxv5EHB6LrVqLS4nbQt3ZxLwG6WWWlMPv1sdQhxNNQ==} cpu: [arm] os: [linux] - '@oxc-resolver/binding-linux-arm64-gnu@11.6.2': - resolution: {integrity: sha512-VBZZ/5uYiFs+09h1royv78GAEPPy5Bsro53hPWMlJL/E9pPibaj3fCzZEAnrKSzVpvwf7+QSc5w7ZUrX3xAKpg==} + '@oxc-resolver/binding-linux-arm64-gnu@11.8.3': + resolution: {integrity: sha512-LD97VZB8KxJGEDSh4bzNExBK32nOAIPnmaKUU1bl6L3nd8YnhwK/l7RZPRsz//At/+0MGjf0Pg/fxYdW7OARjQ==} cpu: [arm64] os: [linux] - '@oxc-resolver/binding-linux-arm64-musl@11.6.2': - resolution: {integrity: sha512-x+LooeNXy3hhvDT7q29jLjh914OYX9YnrQbGT3ogep5EY/LLbUiG3LV8XSrWRqXD5132gea9SOYxmcpF9i6xTQ==} + '@oxc-resolver/binding-linux-arm64-musl@11.8.3': + resolution: {integrity: sha512-K9AUdi2Fd8RL4j5j2pACUcHbOawamt7nVn7yRI5+eOEfyn7bBsFvCVdKN4aKBLQxdAOFURK+uRWrVfR2xUkjww==} cpu: [arm64] os: [linux] - '@oxc-resolver/binding-linux-ppc64-gnu@11.6.2': - resolution: {integrity: sha512-+CluEbUpAaKvcNREZtUUiunqzo5o0/qp+6xoFkbDAwNhWIw1mtWCg1Di++Fa053Cah/Rx+dRMQteANoMBGCxxg==} + '@oxc-resolver/binding-linux-ppc64-gnu@11.8.3': + resolution: {integrity: sha512-Ur5+jodHcL1lHlt7zye5K709qX4hagOdKequxrQYLaOC9zFJtpu+967PYw6bmedtnQERhyaGSfPzZ8u/TUgqWw==} cpu: [ppc64] os: [linux] - '@oxc-resolver/binding-linux-riscv64-gnu@11.6.2': - resolution: {integrity: sha512-OKWK/QvC6gECaeCNjfhuj0yiqMIisS0ewCRAmgT2pyxDwkNWgSm2wli+Tj/gpLjua2HjFDnDEcg0/dOoO6+xQg==} + '@oxc-resolver/binding-linux-riscv64-gnu@11.8.3': + resolution: {integrity: sha512-RgJHdrTTONup/55Y/eqyrIw2R3hG/1vBMI7+WGLjiF5zxJmVO8tLYcQklV92MKDxrLL7O36GZTZ6mPk57TVf9w==} cpu: [riscv64] os: [linux] - '@oxc-resolver/binding-linux-riscv64-musl@11.6.2': - resolution: {integrity: sha512-YtQ3hLvhVzan3boR44C0qu/jiTanaBAL9uTqs/S2tzOLfpO2PoTDbQDgADvOqYJDTJkOGiofJC2E1lJcRmpbXQ==} + '@oxc-resolver/binding-linux-riscv64-musl@11.8.3': + resolution: {integrity: sha512-zni4rfmy+JoR1ubY2puIgwR+3ATpmsIsZR8dzskKRuy+i4ghwo6uOQn3wXcMBiuY4yJ0XsOZBZe1OoAl1/rELw==} cpu: [riscv64] os: [linux] - '@oxc-resolver/binding-linux-s390x-gnu@11.6.2': - resolution: {integrity: sha512-pcX/ih9QHrEWliiXJdZoX/bnfOlr5E0eOWSG2ew5U1HntGket/1AcdcA4UH3MQU/TrOLxxiKhGzeZv+fwewmmA==} + '@oxc-resolver/binding-linux-s390x-gnu@11.8.3': + resolution: {integrity: sha512-7u96LbjV6cGcvfGopwDHiuhrasE+0YZPshZFDyEO4QGm8rc+R9XgSsvUUCspRTuwc/J70u7c0cxONm6TYECkyA==} cpu: [s390x] os: [linux] - '@oxc-resolver/binding-linux-x64-gnu@11.6.2': - resolution: {integrity: sha512-LFYSgeYW11u4cQXzgIGthqCRAoLvl0IqbIMGeJLVt1tD7yrpTukfQynMzwP3vuTK5hmWgYc7NfK6G5+Zv/75hw==} + '@oxc-resolver/binding-linux-x64-gnu@11.8.3': + resolution: {integrity: sha512-zgOg25vdttzLz1uCP/5hyMlLgczPSct8lBI8oBhh+oTjEmDTJdqWnjXgk/ugrQGw66j8Ud9eAZL+IWkHaaLSxA==} cpu: [x64] os: [linux] - '@oxc-resolver/binding-linux-x64-musl@11.6.2': - resolution: {integrity: sha512-IE13zwhg+XX9FVQHADbIe6RB2MgQeqyKdGyH67meGPgqCbLqT41K9qAm0k2uDlSswjLK8nhNe5Z+hhopBKzRRg==} + '@oxc-resolver/binding-linux-x64-musl@11.8.3': + resolution: {integrity: sha512-xac1SimfZ8grHyn3V3RTptDhQ8sSVdF0j1CsGGpG6ODyku+LcNvhwy6fjxuaT3Z+Zgsi1wchXQNDA62YkDUvZQ==} cpu: [x64] os: [linux] - '@oxc-resolver/binding-wasm32-wasi@11.6.2': - resolution: {integrity: sha512-6nNW/wOKrptS9Rebf83aHvIsIiNcXOEWwUmhMR/4MHrH07zbcptBoZQcWO6362B9Y2lMN7dIF9v7brQcNDs63A==} + '@oxc-resolver/binding-wasm32-wasi@11.8.3': + resolution: {integrity: sha512-zt2+ohZbPg0M9cADMLnImVRXXBJVd5tlOqzH9z4wdFTA1mHojIeSrHaW8c30ZzopbFIER0GTyY+YxAsf0bhIeQ==} engines: {node: '>=14.0.0'} cpu: [wasm32] - '@oxc-resolver/binding-win32-arm64-msvc@11.6.2': - resolution: {integrity: sha512-YDR9UBOlKfFvWhVlyvNSlZjJ+B5kDpDn5K5s69JKW+Ke5ZYupVPTJPZ3GIMjbgj54fJQNFW+BiT4dL/EUGOHVQ==} + '@oxc-resolver/binding-win32-arm64-msvc@11.8.3': + resolution: {integrity: sha512-je6MDeDP9PI4TGG3mcQ1ELzA4Y1O7+Dwxnc4sCxm6MkAiCi6G5UMSKsXp1f/UlcTdQn3hOJOv7d1KK8MbvRpPw==} cpu: [arm64] os: [win32] - '@oxc-resolver/binding-win32-ia32-msvc@11.6.2': - resolution: {integrity: sha512-8MqToY82sKT4po6bfb71LTiWW4PYXy/WNnzFIpkO88O1TtZV8ZsZ1kSeSwFazbqhV8H8nnxyJemqXNIqhtqNfw==} + '@oxc-resolver/binding-win32-ia32-msvc@11.8.3': + resolution: {integrity: sha512-9GtBrZgJw3+dP0x/FHh/viiaQ+kgnVJr5jLG0ZDEci9vFOdc/XJkNXYs84mBlZcWK1HCj80VDBqqNGm4zYYIXA==} cpu: [ia32] os: [win32] - '@oxc-resolver/binding-win32-x64-msvc@11.6.2': - resolution: {integrity: sha512-y/xXcOwP9kp+3zRC8PiG5E4VMJeW59gwwRyxzh6DyMrKlcfikMFnuEbC2ZV0+mOffg7pkOOMKlNRK2aJC8gzkA==} + '@oxc-resolver/binding-win32-x64-msvc@11.8.3': + resolution: {integrity: sha512-MoathdI2zWifsGPsgnZjYplEm2NJ4pZxu8eSCYCe+8TToDRpQ+D8BTcr8Fox2AyNEQdT57l/0LzID4812+3f/A==} cpu: [x64] os: [win32] @@ -3251,8 +3251,8 @@ packages: '@vue/compiler-sfc': optional: true - '@tybys/wasm-util@0.10.0': - resolution: {integrity: sha512-VyyPYFlOMNylG45GoAe0xDoLwWuowvf92F9kySqzYh8vmYm7D2u4iUJKa1tOUpS70Ku13ASrOkS4ScXFsTaCNQ==} + '@tybys/wasm-util@0.10.1': + resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} '@tybys/wasm-util@0.9.0': resolution: {integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==} @@ -5255,8 +5255,8 @@ packages: fraction.js@4.3.7: resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} - framer-motion@12.23.16: - resolution: {integrity: sha512-N81A8hiHqVsexOzI3wzkibyLURW1nEJsZaRuctPhG4AdbbciYu+bKJq9I2lQFzAO4Bx3h4swI6pBbF/Hu7f7BA==} + framer-motion@12.23.21: + resolution: {integrity: sha512-UWDtzzPdRA3UpSNGril5HjUtPF1Uo/BCt5VKG/YQ8tVpSkAZ22+q8o+hYO0C1uDAZuotQjcfzsTsDtQxD46E/Q==} peerDependencies: '@emotion/is-prop-valid': '*' react: ^18.0.0 || ^19.0.0 @@ -6085,8 +6085,8 @@ packages: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} - knip@5.63.1: - resolution: {integrity: sha512-wSznedUAzcU4o9e0O2WPqDnP7Jttu8cesq/R23eregRY8QYQ9NLJ3aGt9fadJfRzPBoU4tRyutwVQu6chhGDlA==} + knip@5.64.0: + resolution: {integrity: sha512-UqDlVXXacGy5YL+PXKrolqRpC7DkGTYs+to67KmWBHIUrTh8SX9gQoGNdFsNZtbj4pCdM/RmC/Rbze555+MhSA==} engines: {node: '>=18.18.0'} hasBin: true peerDependencies: @@ -6517,8 +6517,8 @@ packages: peerDependencies: monaco-editor: '>=0.36' - motion-dom@12.23.12: - resolution: {integrity: sha512-RcR4fvMCTESQBD/uKQe49D5RUeDOokkGRmz4ceaJKDBgHYtZtntC/s2vLvY38gqGaytinij/yi3hMcWVcEF5Kw==} + motion-dom@12.23.21: + resolution: {integrity: sha512-5xDXx/AbhrfgsQmSE7YESMn4Dpo6x5/DTZ4Iyy4xqDvVHWvFVoV+V2Ri2S/ksx+D40wrZ7gPYiMWshkdoqNgNQ==} motion-utils@12.23.6: resolution: {integrity: sha512-eAWoPgr4eFEOFfg2WjIsMoqJTW6Z8MTUCgn/GZ3VRpClWBdnbjryiA3ZSNLyxCTmCQx4RmYX6jX1iWHbenUPNQ==} @@ -6724,8 +6724,8 @@ packages: resolution: {integrity: sha512-2tDN/ttU8WE6oFh8EzKNam7KE7ZXSG5uXmvX85iNzxdJfMssDWcj3gpYzZi1E04XuE7m3v1dVWl/8BE886vPGw==} engines: {node: '>=20.0.0'} - oxc-resolver@11.6.2: - resolution: {integrity: sha512-9lXwNQUzgPs5UgjKig5+EINESHYJCFsRQLzPyjWLc7sshl6ZXvXPiQfEGqUIs2fsd9SdV/jYmL7IuaK43cL0SA==} + oxc-resolver@11.8.3: + resolution: {integrity: sha512-wPY3eiw24QOiNqArh5FWRrKYr1Yuxya8bE8CV7yBfz7jodCrg0HqBu6cvHHSicxFug7D4TN6ox1hysA9arHTqw==} p-cancelable@2.1.1: resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} @@ -7423,112 +7423,112 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - sass-embedded-all-unknown@1.93.1: - resolution: {integrity: sha512-APlGAJhk/Twv1i8K/jHfkruMwTVV03M5+RZ2yxalYWhn0pouC+MIQ8I/xkiOPk2sNmCQ4M3EewMb0FUVyS/LMQ==} + sass-embedded-all-unknown@1.93.2: + resolution: {integrity: sha512-GdEuPXIzmhRS5J7UKAwEvtk8YyHQuFZRcpnEnkA3rwRUI27kwjyXkNeIj38XjUQ3DzrfMe8HcKFaqWGHvblS7Q==} cpu: ['!arm', '!arm64', '!riscv64', '!x64'] - sass-embedded-android-arm64@1.93.1: - resolution: {integrity: sha512-kWvCvNXnHjPmjSS4uYGcSRLZo9am8cNDdg+jIY4mZy62Q3nmz0h0p9if1GszBHl4H3eIBXJIEJQiDY5E26amdQ==} + sass-embedded-android-arm64@1.93.2: + resolution: {integrity: sha512-346f4iVGAPGcNP6V6IOOFkN5qnArAoXNTPr5eA/rmNpeGwomdb7kJyQ717r9rbJXxOG8OAAUado6J0qLsjnjXQ==} engines: {node: '>=14.0.0'} cpu: [arm64] os: [android] - sass-embedded-android-arm@1.93.1: - resolution: {integrity: sha512-ysejojGThRhsnyYRQtNyAstQqqOP+W+EsEbxnhKVZRLBp4WxeAza/W5x1/GBzLjhk6HUJ7N1MwNkkpvF0eqnuQ==} + sass-embedded-android-arm@1.93.2: + resolution: {integrity: sha512-I8bpO8meZNo5FvFx5FIiE7DGPVOYft0WjuwcCCdeJ6duwfkl6tZdatex1GrSigvTsuz9L0m4ngDcX/Tj/8yMow==} engines: {node: '>=14.0.0'} cpu: [arm] os: [android] - sass-embedded-android-riscv64@1.93.1: - resolution: {integrity: sha512-EaNkWJ5IOMCZid3IZWl/Bvb3RkCFz0RBas6Ns05F7W3hls+ggaqiFB7RaVr4Wbr7Em8Ak6yYw5CuTgUiY58nDg==} + sass-embedded-android-riscv64@1.93.2: + resolution: {integrity: sha512-hSMW1s4yJf5guT9mrdkumluqrwh7BjbZ4MbBW9tmi1DRDdlw1Wh9Oy1HnnmOG8x9XcI1qkojtPL6LUuEJmsiDg==} engines: {node: '>=14.0.0'} cpu: [riscv64] os: [android] - sass-embedded-android-x64@1.93.1: - resolution: {integrity: sha512-kyGNIgFTAgWPa79LI+vkbOUNV1DzCywSAayAHsvuK6NgPcq560ET7qekp/OlbZ97wgTjVRlj68UAP0jVhq4k4A==} + sass-embedded-android-x64@1.93.2: + resolution: {integrity: sha512-JqktiHZduvn+ldGBosE40ALgQ//tGCVNAObgcQ6UIZznEJbsHegqStqhRo8UW3x2cgOO2XYJcrInH6cc7wdKbw==} engines: {node: '>=14.0.0'} cpu: [x64] os: [android] - sass-embedded-darwin-arm64@1.93.1: - resolution: {integrity: sha512-GOD2Nt+BZZdBmg+BM2CozkhAZFGzaU8IK1lI2KP5C6HTuhQP7mTPA9UZWNN3c7iHj6JrkenfWd1ec/vsCZVr+Q==} + sass-embedded-darwin-arm64@1.93.2: + resolution: {integrity: sha512-qI1X16qKNeBJp+M/5BNW7v/JHCDYWr1/mdoJ7+UMHmP0b5AVudIZtimtK0hnjrLnBECURifd6IkulybR+h+4UA==} engines: {node: '>=14.0.0'} cpu: [arm64] os: [darwin] - sass-embedded-darwin-x64@1.93.1: - resolution: {integrity: sha512-79UlR88nNDbsGqa/87yxOdShPL9Bqz0KnFzv8ioh1NkxYwKYUM9XuKwohFEBTyGg8KDw6h31oTFAvrEFR2qBzg==} + sass-embedded-darwin-x64@1.93.2: + resolution: {integrity: sha512-4KeAvlkQ0m0enKUnDGQJZwpovYw99iiMb8CTZRSsQm8Eh7halbJZVmx67f4heFY/zISgVOCcxNg19GrM5NTwtA==} engines: {node: '>=14.0.0'} cpu: [x64] os: [darwin] - sass-embedded-linux-arm64@1.93.1: - resolution: {integrity: sha512-F5ZHx1s5ce3NdjtwPAq6oTXpTC1bZUlHweFgqzbYH5rhVhdhkOemIdHHUG+3gl8YttYrqZ0KASVDtJKBrJMnSg==} + sass-embedded-linux-arm64@1.93.2: + resolution: {integrity: sha512-9ftX6nd5CsShJqJ2WRg+ptaYvUW+spqZfJ88FbcKQBNFQm6L87luj3UI1rB6cP5EWrLwHA754OKxRJyzWiaN6g==} engines: {node: '>=14.0.0'} cpu: [arm64] os: [linux] - sass-embedded-linux-arm@1.93.1: - resolution: {integrity: sha512-CdJXeZazBU1Ry1jG0T0ohZkoKHnUBIdniqw3o8ZzqHPzVY3A4svuQWj0WvGGM+YrZ+SV5HQ3nmzezS58dlandA==} + sass-embedded-linux-arm@1.93.2: + resolution: {integrity: sha512-N3+D/ToHtzwLDO+lSH05Wo6/KRxFBPnbjVHASOlHzqJnK+g5cqex7IFAp6ozzlRStySk61Rp6d+YGrqZ6/P0PA==} engines: {node: '>=14.0.0'} cpu: [arm] os: [linux] - sass-embedded-linux-musl-arm64@1.93.1: - resolution: {integrity: sha512-p7fxdQI+ev6KMkqRNgl1i7yG5PaUiPgudF4usfSE5NaQobORZYuFXt4m2XPd1h5xwP0ykYLyXjad1EMXTnGr7Q==} + sass-embedded-linux-musl-arm64@1.93.2: + resolution: {integrity: sha512-+3EHuDPkMiAX5kytsjEC1bKZCawB9J6pm2eBIzzLMPWbf5xdx++vO1DpT7hD4bm4ZGn0eVHgSOKIfP6CVz6tVg==} engines: {node: '>=14.0.0'} cpu: [arm64] os: [linux] - sass-embedded-linux-musl-arm@1.93.1: - resolution: {integrity: sha512-gMxRky1OjjVh8HHw/blgMggkmIu5a9l8iLAODuBIi+AOOuF9v7v20JXyUfXh2jT2HvdXjKfc/EvIuhhELnBPpg==} + sass-embedded-linux-musl-arm@1.93.2: + resolution: {integrity: sha512-XBTvx66yRenvEsp3VaJCb3HQSyqCsUh7R+pbxcN5TuzueybZi0LXvn9zneksdXcmjACMlMpIVXi6LyHPQkYc8A==} engines: {node: '>=14.0.0'} cpu: [arm] os: [linux] - sass-embedded-linux-musl-riscv64@1.93.1: - resolution: {integrity: sha512-iVtkoiwXxVcIjbOD3ctX1CxgkXMPUzkw3A/1Iok55lmLLDRKB6t4nny8vT8qiejKrQ9DF4Oz2/+q7Cj0S3mN+Q==} + sass-embedded-linux-musl-riscv64@1.93.2: + resolution: {integrity: sha512-0sB5kmVZDKTYzmCSlTUnjh6mzOhzmQiW/NNI5g8JS4JiHw2sDNTvt1dsFTuqFkUHyEOY3ESTsfHHBQV8Ip4bEA==} engines: {node: '>=14.0.0'} cpu: [riscv64] os: [linux] - sass-embedded-linux-musl-x64@1.93.1: - resolution: {integrity: sha512-UPtkoxgljB+Tz5TF8Pg/5EaMDlDRhqlqnA3cCOqj+bDoaAgTQcqYNpAz/6wJSXYTv7Jjs54kWjI+NDMSOPdh/Q==} + sass-embedded-linux-musl-x64@1.93.2: + resolution: {integrity: sha512-t3ejQ+1LEVuHy7JHBI2tWHhoMfhedUNDjGJR2FKaLgrtJntGnyD1RyX0xb3nuqL/UXiEAtmTmZY+Uh3SLUe1Hg==} engines: {node: '>=14.0.0'} cpu: [x64] os: [linux] - sass-embedded-linux-riscv64@1.93.1: - resolution: {integrity: sha512-gTzxKGPK1vwqO8ZOYlQIVh1BFI2dBW1GyMHmyjqM4Mc/orAjOmTN3aJYGafJjxiMmH424JwlUmCN5vARRJQsJg==} + sass-embedded-linux-riscv64@1.93.2: + resolution: {integrity: sha512-e7AndEwAbFtXaLy6on4BfNGTr3wtGZQmypUgYpSNVcYDO+CWxatKVY4cxbehMPhxG9g5ru+eaMfynvhZt7fLaA==} engines: {node: '>=14.0.0'} cpu: [riscv64] os: [linux] - sass-embedded-linux-x64@1.93.1: - resolution: {integrity: sha512-x67rR5KmmjZrnqzKSqNFEEyQoybajFmWnsWvxt3Fn2BCewK40EThVjJAJwNdZtXKcc8y7CZrMF+kmxBDxFbv4g==} + sass-embedded-linux-x64@1.93.2: + resolution: {integrity: sha512-U3EIUZQL11DU0xDDHXexd4PYPHQaSQa2hzc4EzmhHqrAj+TyfYO94htjWOd+DdTPtSwmLp+9cTWwPZBODzC96w==} engines: {node: '>=14.0.0'} cpu: [x64] os: [linux] - sass-embedded-unknown-all@1.93.1: - resolution: {integrity: sha512-noDOdIJWRTXAW77J2bkrKGyoPWNuJ5G+JnXVHH+zLll1AlVcwPjVCKag9dNk6+o4cXDb0hx8b8Sg4ojdCzK8VA==} + sass-embedded-unknown-all@1.93.2: + resolution: {integrity: sha512-7VnaOmyewcXohiuoFagJ3SK5ddP9yXpU0rzz+pZQmS1/+5O6vzyFCUoEt3HDRaLctH4GT3nUGoK1jg0ae62IfQ==} os: ['!android', '!darwin', '!linux', '!win32'] - sass-embedded-win32-arm64@1.93.1: - resolution: {integrity: sha512-B6seb+gjZ9XV/rXO2STkBkFLpsRnlLS1Hs9tqJyWe723VhuaOy/cyI8LSuUjNDolYVbo4YKb4vbx3+BNFNRGBQ==} + sass-embedded-win32-arm64@1.93.2: + resolution: {integrity: sha512-Y90DZDbQvtv4Bt0GTXKlcT9pn4pz8AObEjFF8eyul+/boXwyptPZ/A1EyziAeNaIEIfxyy87z78PUgCeGHsx3Q==} engines: {node: '>=14.0.0'} cpu: [arm64] os: [win32] - sass-embedded-win32-x64@1.93.1: - resolution: {integrity: sha512-tt4OxnQN2b1PbTWHeZHVFxnQTTSbzOZlSIVeZZ8T9hQmSWrAfzjuV0B96V1/YzhKfhSKtbCo7KD/JIgADKugqg==} + sass-embedded-win32-x64@1.93.2: + resolution: {integrity: sha512-BbSucRP6PVRZGIwlEBkp+6VQl2GWdkWFMN+9EuOTPrLxCJZoq+yhzmbjspd3PeM8+7WJ7AdFu/uRYdO8tor1iQ==} engines: {node: '>=14.0.0'} cpu: [x64] os: [win32] - sass-embedded@1.93.1: - resolution: {integrity: sha512-LgXSubbCngOUZ7sVhxtfREa/lHa+hkG0Pjul02I4gB4cb0PhsR+UTLH0GIMnEafoL4dhFM1x8tdtezB3Njv7ng==} + sass-embedded@1.93.2: + resolution: {integrity: sha512-FvQdkn2dZ8DGiLgi0Uf4zsj7r/BsiLImNa5QJ10eZalY6NfZyjrmWGFcuCN5jNwlDlXFJnftauv+UtvBKLvepQ==} engines: {node: '>=16.0.0'} hasBin: true @@ -7537,8 +7537,8 @@ packages: engines: {node: '>=14.0.0'} hasBin: true - sass@1.93.1: - resolution: {integrity: sha512-wLAeLB7IksO2u+cCfhHqcy7/2ZUMPp/X2oV6+LjmweTqgjhOKrkaE/Q1wljxtco5EcOcupZ4c981X0gpk5Tiag==} + sass@1.93.2: + resolution: {integrity: sha512-t+YPtOQHpGW1QWsh1CHQ5cPIr9lbbGZLZnbihP/D/qZj/yuV68m8qarcV17nvkOX81BCrvzAlq2klCQFZghyTg==} engines: {node: '>=14.0.0'} hasBin: true @@ -8356,8 +8356,8 @@ packages: vfile@6.0.1: resolution: {integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==} - virtua@0.43.3: - resolution: {integrity: sha512-KA4iLdc1ISLgeqWEdT++Y8zeRQxWMOsF0pMG8gXPGorfCC7xdVZS9R4/kRCkyrk9z52VoQBBOEAL48vrPnKSuw==} + virtua@0.43.4: + resolution: {integrity: sha512-zS9A2EC3KY9hRjG5NM7t0gPGqkcdOc7HWhuc9KDvKq3yz10sRup5L09axFyWHePr1ppWljpAHtr0BCCsM6tS5Q==} peerDependencies: react: '>=16.14.0' react-dom: '>=16.14.0' @@ -9905,9 +9905,9 @@ snapshots: tslib: 2.8.1 optional: true - '@emnapi/core@1.4.5': + '@emnapi/core@1.5.0': dependencies: - '@emnapi/wasi-threads': 1.0.4 + '@emnapi/wasi-threads': 1.1.0 tslib: 2.8.1 optional: true @@ -9916,7 +9916,7 @@ snapshots: tslib: 2.8.1 optional: true - '@emnapi/runtime@1.4.5': + '@emnapi/runtime@1.5.0': dependencies: tslib: 2.8.1 optional: true @@ -9926,7 +9926,7 @@ snapshots: tslib: 2.8.1 optional: true - '@emnapi/wasi-threads@1.0.4': + '@emnapi/wasi-threads@1.1.0': dependencies: tslib: 2.8.1 optional: true @@ -10432,11 +10432,11 @@ snapshots: '@tybys/wasm-util': 0.9.0 optional: true - '@napi-rs/wasm-runtime@1.0.3': + '@napi-rs/wasm-runtime@1.0.5': dependencies: - '@emnapi/core': 1.4.5 - '@emnapi/runtime': 1.4.5 - '@tybys/wasm-util': 0.10.0 + '@emnapi/core': 1.5.0 + '@emnapi/runtime': 1.5.0 + '@tybys/wasm-util': 0.10.1 optional: true '@nodelib/fs.scandir@2.1.5': @@ -10707,63 +10707,63 @@ snapshots: '@oxc-project/types@0.74.0': {} - '@oxc-resolver/binding-android-arm-eabi@11.6.2': + '@oxc-resolver/binding-android-arm-eabi@11.8.3': optional: true - '@oxc-resolver/binding-android-arm64@11.6.2': + '@oxc-resolver/binding-android-arm64@11.8.3': optional: true - '@oxc-resolver/binding-darwin-arm64@11.6.2': + '@oxc-resolver/binding-darwin-arm64@11.8.3': optional: true - '@oxc-resolver/binding-darwin-x64@11.6.2': + '@oxc-resolver/binding-darwin-x64@11.8.3': optional: true - '@oxc-resolver/binding-freebsd-x64@11.6.2': + '@oxc-resolver/binding-freebsd-x64@11.8.3': optional: true - '@oxc-resolver/binding-linux-arm-gnueabihf@11.6.2': + '@oxc-resolver/binding-linux-arm-gnueabihf@11.8.3': optional: true - '@oxc-resolver/binding-linux-arm-musleabihf@11.6.2': + '@oxc-resolver/binding-linux-arm-musleabihf@11.8.3': optional: true - '@oxc-resolver/binding-linux-arm64-gnu@11.6.2': + '@oxc-resolver/binding-linux-arm64-gnu@11.8.3': optional: true - '@oxc-resolver/binding-linux-arm64-musl@11.6.2': + '@oxc-resolver/binding-linux-arm64-musl@11.8.3': optional: true - '@oxc-resolver/binding-linux-ppc64-gnu@11.6.2': + '@oxc-resolver/binding-linux-ppc64-gnu@11.8.3': optional: true - '@oxc-resolver/binding-linux-riscv64-gnu@11.6.2': + '@oxc-resolver/binding-linux-riscv64-gnu@11.8.3': optional: true - '@oxc-resolver/binding-linux-riscv64-musl@11.6.2': + '@oxc-resolver/binding-linux-riscv64-musl@11.8.3': optional: true - '@oxc-resolver/binding-linux-s390x-gnu@11.6.2': + '@oxc-resolver/binding-linux-s390x-gnu@11.8.3': optional: true - '@oxc-resolver/binding-linux-x64-gnu@11.6.2': + '@oxc-resolver/binding-linux-x64-gnu@11.8.3': optional: true - '@oxc-resolver/binding-linux-x64-musl@11.6.2': + '@oxc-resolver/binding-linux-x64-musl@11.8.3': optional: true - '@oxc-resolver/binding-wasm32-wasi@11.6.2': + '@oxc-resolver/binding-wasm32-wasi@11.8.3': dependencies: - '@napi-rs/wasm-runtime': 1.0.3 + '@napi-rs/wasm-runtime': 1.0.5 optional: true - '@oxc-resolver/binding-win32-arm64-msvc@11.6.2': + '@oxc-resolver/binding-win32-arm64-msvc@11.8.3': optional: true - '@oxc-resolver/binding-win32-ia32-msvc@11.6.2': + '@oxc-resolver/binding-win32-ia32-msvc@11.8.3': optional: true - '@oxc-resolver/binding-win32-x64-msvc@11.6.2': + '@oxc-resolver/binding-win32-x64-msvc@11.8.3': optional: true '@parcel/watcher-android-arm64@2.4.1': @@ -11372,7 +11372,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/router-plugin@1.131.50(@tanstack/react-router@1.131.50(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(vite@7.1.7(@types/node@24.3.1)(jiti@2.5.1)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.93.1)(sass@1.93.1)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.5)(yaml@2.8.1))': + '@tanstack/router-plugin@1.131.50(@tanstack/react-router@1.131.50(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(vite@7.1.7(@types/node@24.3.1)(jiti@2.5.1)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.93.2)(sass@1.93.2)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.5)(yaml@2.8.1))': dependencies: '@babel/core': 7.28.4 '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.4) @@ -11390,7 +11390,7 @@ snapshots: zod: 3.25.76 optionalDependencies: '@tanstack/react-router': 1.131.50(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - vite: 7.1.7(@types/node@24.3.1)(jiti@2.5.1)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.93.1)(sass@1.93.1)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.5)(yaml@2.8.1) + vite: 7.1.7(@types/node@24.3.1)(jiti@2.5.1)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.93.2)(sass@1.93.2)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.5)(yaml@2.8.1) transitivePeerDependencies: - supports-color @@ -11518,7 +11518,7 @@ snapshots: - supports-color optional: true - '@tybys/wasm-util@0.10.0': + '@tybys/wasm-util@0.10.1': dependencies: tslib: 2.8.1 optional: true @@ -12005,7 +12005,7 @@ snapshots: '@unrs/resolver-binding-win32-x64-msvc@1.10.1': optional: true - '@vitejs/plugin-legacy@7.2.1(terser@5.36.0)(vite@7.1.7(@types/node@24.3.1)(jiti@2.5.1)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.93.1)(sass@1.93.1)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.5)(yaml@2.8.1))': + '@vitejs/plugin-legacy@7.2.1(terser@5.36.0)(vite@7.1.7(@types/node@24.3.1)(jiti@2.5.1)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.93.2)(sass@1.93.2)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.5)(yaml@2.8.1))': dependencies: '@babel/core': 7.28.0 '@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.28.0) @@ -12020,19 +12020,19 @@ snapshots: regenerator-runtime: 0.14.1 systemjs: 6.15.1 terser: 5.36.0 - vite: 7.1.7(@types/node@24.3.1)(jiti@2.5.1)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.93.1)(sass@1.93.1)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.5)(yaml@2.8.1) + vite: 7.1.7(@types/node@24.3.1)(jiti@2.5.1)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.93.2)(sass@1.93.2)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.5)(yaml@2.8.1) transitivePeerDependencies: - supports-color - '@vitejs/plugin-react-swc@4.1.0(vite@7.1.7(@types/node@24.3.1)(jiti@2.5.1)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.93.1)(sass@1.93.1)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.5)(yaml@2.8.1))': + '@vitejs/plugin-react-swc@4.1.0(vite@7.1.7(@types/node@24.3.1)(jiti@2.5.1)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.93.2)(sass@1.93.2)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.5)(yaml@2.8.1))': dependencies: '@rolldown/pluginutils': 1.0.0-beta.35 '@swc/core': 1.13.5 - vite: 7.1.7(@types/node@24.3.1)(jiti@2.5.1)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.93.1)(sass@1.93.1)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.5)(yaml@2.8.1) + vite: 7.1.7(@types/node@24.3.1)(jiti@2.5.1)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.93.2)(sass@1.93.2)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.5)(yaml@2.8.1) transitivePeerDependencies: - '@swc/helpers' - '@vitejs/plugin-react@5.0.3(vite@7.1.7(@types/node@24.3.1)(jiti@2.5.1)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.93.1)(sass@1.93.1)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.5)(yaml@2.8.1))': + '@vitejs/plugin-react@5.0.3(vite@7.1.7(@types/node@24.3.1)(jiti@2.5.1)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.93.2)(sass@1.93.2)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.5)(yaml@2.8.1))': dependencies: '@babel/core': 7.28.4 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.4) @@ -12040,7 +12040,7 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.35 '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 7.1.7(@types/node@24.3.1)(jiti@2.5.1)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.93.1)(sass@1.93.1)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.5)(yaml@2.8.1) + vite: 7.1.7(@types/node@24.3.1)(jiti@2.5.1)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.93.2)(sass@1.93.2)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.5)(yaml@2.8.1) transitivePeerDependencies: - supports-color @@ -13935,9 +13935,9 @@ snapshots: fraction.js@4.3.7: {} - framer-motion@12.23.16(@emotion/is-prop-valid@1.3.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + framer-motion@12.23.21(@emotion/is-prop-valid@1.3.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1): dependencies: - motion-dom: 12.23.12 + motion-dom: 12.23.21 motion-utils: 12.23.6 tslib: 2.8.1 optionalDependencies: @@ -14767,7 +14767,7 @@ snapshots: kind-of@6.0.3: {} - knip@5.63.1(@types/node@24.3.1)(typescript@5.9.2): + knip@5.64.0(@types/node@24.3.1)(typescript@5.9.2): dependencies: '@nodelib/fs.walk': 1.2.8 '@types/node': 24.3.1 @@ -14776,7 +14776,7 @@ snapshots: jiti: 2.5.1 js-yaml: 4.1.0 minimist: 1.2.8 - oxc-resolver: 11.6.2 + oxc-resolver: 11.8.3 picocolors: 1.1.1 picomatch: 4.0.3 smol-toml: 1.4.2 @@ -15323,7 +15323,7 @@ snapshots: vscode-uri: 3.0.8 yaml: 2.7.0 - motion-dom@12.23.12: + motion-dom@12.23.21: dependencies: motion-utils: 12.23.6 @@ -15584,29 +15584,29 @@ snapshots: '@oxc-parser/binding-win32-arm64-msvc': 0.74.0 '@oxc-parser/binding-win32-x64-msvc': 0.74.0 - oxc-resolver@11.6.2: + oxc-resolver@11.8.3: dependencies: napi-postinstall: 0.3.0 optionalDependencies: - '@oxc-resolver/binding-android-arm-eabi': 11.6.2 - '@oxc-resolver/binding-android-arm64': 11.6.2 - '@oxc-resolver/binding-darwin-arm64': 11.6.2 - '@oxc-resolver/binding-darwin-x64': 11.6.2 - '@oxc-resolver/binding-freebsd-x64': 11.6.2 - '@oxc-resolver/binding-linux-arm-gnueabihf': 11.6.2 - '@oxc-resolver/binding-linux-arm-musleabihf': 11.6.2 - '@oxc-resolver/binding-linux-arm64-gnu': 11.6.2 - '@oxc-resolver/binding-linux-arm64-musl': 11.6.2 - '@oxc-resolver/binding-linux-ppc64-gnu': 11.6.2 - '@oxc-resolver/binding-linux-riscv64-gnu': 11.6.2 - '@oxc-resolver/binding-linux-riscv64-musl': 11.6.2 - '@oxc-resolver/binding-linux-s390x-gnu': 11.6.2 - '@oxc-resolver/binding-linux-x64-gnu': 11.6.2 - '@oxc-resolver/binding-linux-x64-musl': 11.6.2 - '@oxc-resolver/binding-wasm32-wasi': 11.6.2 - '@oxc-resolver/binding-win32-arm64-msvc': 11.6.2 - '@oxc-resolver/binding-win32-ia32-msvc': 11.6.2 - '@oxc-resolver/binding-win32-x64-msvc': 11.6.2 + '@oxc-resolver/binding-android-arm-eabi': 11.8.3 + '@oxc-resolver/binding-android-arm64': 11.8.3 + '@oxc-resolver/binding-darwin-arm64': 11.8.3 + '@oxc-resolver/binding-darwin-x64': 11.8.3 + '@oxc-resolver/binding-freebsd-x64': 11.8.3 + '@oxc-resolver/binding-linux-arm-gnueabihf': 11.8.3 + '@oxc-resolver/binding-linux-arm-musleabihf': 11.8.3 + '@oxc-resolver/binding-linux-arm64-gnu': 11.8.3 + '@oxc-resolver/binding-linux-arm64-musl': 11.8.3 + '@oxc-resolver/binding-linux-ppc64-gnu': 11.8.3 + '@oxc-resolver/binding-linux-riscv64-gnu': 11.8.3 + '@oxc-resolver/binding-linux-riscv64-musl': 11.8.3 + '@oxc-resolver/binding-linux-s390x-gnu': 11.8.3 + '@oxc-resolver/binding-linux-x64-gnu': 11.8.3 + '@oxc-resolver/binding-linux-x64-musl': 11.8.3 + '@oxc-resolver/binding-wasm32-wasi': 11.8.3 + '@oxc-resolver/binding-win32-arm64-msvc': 11.8.3 + '@oxc-resolver/binding-win32-ia32-msvc': 11.8.3 + '@oxc-resolver/binding-win32-x64-msvc': 11.8.3 p-cancelable@2.1.1: {} @@ -16299,65 +16299,65 @@ snapshots: safer-buffer@2.1.2: {} - sass-embedded-all-unknown@1.93.1: + sass-embedded-all-unknown@1.93.2: dependencies: - sass: 1.93.1 + sass: 1.93.2 optional: true - sass-embedded-android-arm64@1.93.1: + sass-embedded-android-arm64@1.93.2: optional: true - sass-embedded-android-arm@1.93.1: + sass-embedded-android-arm@1.93.2: optional: true - sass-embedded-android-riscv64@1.93.1: + sass-embedded-android-riscv64@1.93.2: optional: true - sass-embedded-android-x64@1.93.1: + sass-embedded-android-x64@1.93.2: optional: true - sass-embedded-darwin-arm64@1.93.1: + sass-embedded-darwin-arm64@1.93.2: optional: true - sass-embedded-darwin-x64@1.93.1: + sass-embedded-darwin-x64@1.93.2: optional: true - sass-embedded-linux-arm64@1.93.1: + sass-embedded-linux-arm64@1.93.2: optional: true - sass-embedded-linux-arm@1.93.1: + sass-embedded-linux-arm@1.93.2: optional: true - sass-embedded-linux-musl-arm64@1.93.1: + sass-embedded-linux-musl-arm64@1.93.2: optional: true - sass-embedded-linux-musl-arm@1.93.1: + sass-embedded-linux-musl-arm@1.93.2: optional: true - sass-embedded-linux-musl-riscv64@1.93.1: + sass-embedded-linux-musl-riscv64@1.93.2: optional: true - sass-embedded-linux-musl-x64@1.93.1: + sass-embedded-linux-musl-x64@1.93.2: optional: true - sass-embedded-linux-riscv64@1.93.1: + sass-embedded-linux-riscv64@1.93.2: optional: true - sass-embedded-linux-x64@1.93.1: + sass-embedded-linux-x64@1.93.2: optional: true - sass-embedded-unknown-all@1.93.1: + sass-embedded-unknown-all@1.93.2: dependencies: - sass: 1.93.1 + sass: 1.93.2 optional: true - sass-embedded-win32-arm64@1.93.1: + sass-embedded-win32-arm64@1.93.2: optional: true - sass-embedded-win32-x64@1.93.1: + sass-embedded-win32-x64@1.93.2: optional: true - sass-embedded@1.93.1: + sass-embedded@1.93.2: dependencies: '@bufbuild/protobuf': 2.5.2 buffer-builder: 0.2.0 @@ -16368,24 +16368,24 @@ snapshots: sync-child-process: 1.0.2 varint: 6.0.0 optionalDependencies: - sass-embedded-all-unknown: 1.93.1 - sass-embedded-android-arm: 1.93.1 - sass-embedded-android-arm64: 1.93.1 - sass-embedded-android-riscv64: 1.93.1 - sass-embedded-android-x64: 1.93.1 - sass-embedded-darwin-arm64: 1.93.1 - sass-embedded-darwin-x64: 1.93.1 - sass-embedded-linux-arm: 1.93.1 - sass-embedded-linux-arm64: 1.93.1 - sass-embedded-linux-musl-arm: 1.93.1 - sass-embedded-linux-musl-arm64: 1.93.1 - sass-embedded-linux-musl-riscv64: 1.93.1 - sass-embedded-linux-musl-x64: 1.93.1 - sass-embedded-linux-riscv64: 1.93.1 - sass-embedded-linux-x64: 1.93.1 - sass-embedded-unknown-all: 1.93.1 - sass-embedded-win32-arm64: 1.93.1 - sass-embedded-win32-x64: 1.93.1 + sass-embedded-all-unknown: 1.93.2 + sass-embedded-android-arm: 1.93.2 + sass-embedded-android-arm64: 1.93.2 + sass-embedded-android-riscv64: 1.93.2 + sass-embedded-android-x64: 1.93.2 + sass-embedded-darwin-arm64: 1.93.2 + sass-embedded-darwin-x64: 1.93.2 + sass-embedded-linux-arm: 1.93.2 + sass-embedded-linux-arm64: 1.93.2 + sass-embedded-linux-musl-arm: 1.93.2 + sass-embedded-linux-musl-arm64: 1.93.2 + sass-embedded-linux-musl-riscv64: 1.93.2 + sass-embedded-linux-musl-x64: 1.93.2 + sass-embedded-linux-riscv64: 1.93.2 + sass-embedded-linux-x64: 1.93.2 + sass-embedded-unknown-all: 1.93.2 + sass-embedded-win32-arm64: 1.93.2 + sass-embedded-win32-x64: 1.93.2 sass@1.83.0: dependencies: @@ -16395,7 +16395,7 @@ snapshots: optionalDependencies: '@parcel/watcher': 2.4.1 - sass@1.93.1: + sass@1.93.2: dependencies: chokidar: 4.0.0 immutable: 5.0.2 @@ -17368,7 +17368,7 @@ snapshots: unist-util-stringify-position: 4.0.0 vfile-message: 4.0.2 - virtua@0.43.3(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(solid-js@1.9.5): + virtua@0.43.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(solid-js@1.9.5): optionalDependencies: react: 19.1.1 react-dom: 19.1.1(react@19.1.1) @@ -17384,7 +17384,7 @@ snapshots: - rollup - supports-color - vite-plugin-dts@4.5.4(@types/node@24.3.1)(rollup@4.46.2)(typescript@5.9.2)(vite@7.1.7(@types/node@24.3.1)(jiti@2.5.1)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.93.1)(sass@1.93.1)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.5)(yaml@2.8.1)): + vite-plugin-dts@4.5.4(@types/node@24.3.1)(rollup@4.46.2)(typescript@5.9.2)(vite@7.1.7(@types/node@24.3.1)(jiti@2.5.1)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.93.2)(sass@1.93.2)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.5)(yaml@2.8.1)): dependencies: '@microsoft/api-extractor': 7.51.0(@types/node@24.3.1) '@rollup/pluginutils': 5.1.4(rollup@4.46.2) @@ -17397,13 +17397,13 @@ snapshots: magic-string: 0.30.17 typescript: 5.9.2 optionalDependencies: - vite: 7.1.7(@types/node@24.3.1)(jiti@2.5.1)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.93.1)(sass@1.93.1)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.5)(yaml@2.8.1) + vite: 7.1.7(@types/node@24.3.1)(jiti@2.5.1)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.93.2)(sass@1.93.2)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.5)(yaml@2.8.1) transitivePeerDependencies: - '@types/node' - rollup - supports-color - vite-plugin-html@3.2.2(vite@7.1.7(@types/node@24.3.1)(jiti@2.5.1)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.93.1)(sass@1.93.1)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.5)(yaml@2.8.1)): + vite-plugin-html@3.2.2(vite@7.1.7(@types/node@24.3.1)(jiti@2.5.1)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.93.2)(sass@1.93.2)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.5)(yaml@2.8.1)): dependencies: '@rollup/pluginutils': 4.2.1 colorette: 2.0.20 @@ -17417,39 +17417,39 @@ snapshots: html-minifier-terser: 6.1.0 node-html-parser: 5.4.2 pathe: 0.2.0 - vite: 7.1.7(@types/node@24.3.1)(jiti@2.5.1)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.93.1)(sass@1.93.1)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.5)(yaml@2.8.1) + vite: 7.1.7(@types/node@24.3.1)(jiti@2.5.1)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.93.2)(sass@1.93.2)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.5)(yaml@2.8.1) - vite-plugin-sass-dts@1.3.31(postcss@8.5.6)(prettier@3.6.2)(sass-embedded@1.93.1)(vite@7.1.7(@types/node@24.3.1)(jiti@2.5.1)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.93.1)(sass@1.93.1)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.5)(yaml@2.8.1)): + vite-plugin-sass-dts@1.3.31(postcss@8.5.6)(prettier@3.6.2)(sass-embedded@1.93.2)(vite@7.1.7(@types/node@24.3.1)(jiti@2.5.1)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.93.2)(sass@1.93.2)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.5)(yaml@2.8.1)): dependencies: postcss: 8.5.6 postcss-js: 4.0.1(postcss@8.5.6) prettier: 3.6.2 - sass-embedded: 1.93.1 - vite: 7.1.7(@types/node@24.3.1)(jiti@2.5.1)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.93.1)(sass@1.93.1)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.5)(yaml@2.8.1) + sass-embedded: 1.93.2 + vite: 7.1.7(@types/node@24.3.1)(jiti@2.5.1)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.93.2)(sass@1.93.2)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.5)(yaml@2.8.1) - vite-plugin-svgr@4.5.0(rollup@4.46.2)(typescript@5.9.2)(vite@7.1.7(@types/node@24.3.1)(jiti@2.5.1)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.93.1)(sass@1.93.1)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.5)(yaml@2.8.1)): + vite-plugin-svgr@4.5.0(rollup@4.46.2)(typescript@5.9.2)(vite@7.1.7(@types/node@24.3.1)(jiti@2.5.1)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.93.2)(sass@1.93.2)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.5)(yaml@2.8.1)): dependencies: '@rollup/pluginutils': 5.2.0(rollup@4.46.2) '@svgr/core': 8.1.0(typescript@5.9.2) '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@5.9.2)) - vite: 7.1.7(@types/node@24.3.1)(jiti@2.5.1)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.93.1)(sass@1.93.1)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.5)(yaml@2.8.1) + vite: 7.1.7(@types/node@24.3.1)(jiti@2.5.1)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.93.2)(sass@1.93.2)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.5)(yaml@2.8.1) transitivePeerDependencies: - rollup - supports-color - typescript - vite-tsconfig-paths@5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@24.3.1)(jiti@2.5.1)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.93.1)(sass@1.93.1)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.5)(yaml@2.8.1)): + vite-tsconfig-paths@5.1.4(typescript@5.9.2)(vite@7.1.7(@types/node@24.3.1)(jiti@2.5.1)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.93.2)(sass@1.93.2)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.5)(yaml@2.8.1)): dependencies: debug: 4.3.7 globrex: 0.1.2 tsconfck: 3.0.3(typescript@5.9.2) optionalDependencies: - vite: 7.1.7(@types/node@24.3.1)(jiti@2.5.1)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.93.1)(sass@1.93.1)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.5)(yaml@2.8.1) + vite: 7.1.7(@types/node@24.3.1)(jiti@2.5.1)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.93.2)(sass@1.93.2)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.5)(yaml@2.8.1) transitivePeerDependencies: - supports-color - typescript - vite@7.1.7(@types/node@24.3.1)(jiti@2.5.1)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.93.1)(sass@1.93.1)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.5)(yaml@2.8.1): + vite@7.1.7(@types/node@24.3.1)(jiti@2.5.1)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.93.2)(sass@1.93.2)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.5)(yaml@2.8.1): dependencies: esbuild: 0.25.0 fdir: 6.5.0(picomatch@4.0.3) @@ -17463,8 +17463,8 @@ snapshots: jiti: 2.5.1 less: 4.2.0 lightningcss: 1.30.1 - sass: 1.93.1 - sass-embedded: 1.93.1 + sass: 1.93.2 + sass-embedded: 1.93.2 stylus: 0.62.0 terser: 5.36.0 tsx: 4.20.5 diff --git a/lede/target/linux/generic/backport-5.10/420-v5.19-06-mtd-spinand-gigadevice-add-support-for-GD5F1GM9.patch b/lede/target/linux/generic/backport-5.10/420-v5.19-06-mtd-spinand-gigadevice-add-support-for-GD5F1GM9.patch new file mode 100644 index 0000000000..a6ae5ec3f0 --- /dev/null +++ b/lede/target/linux/generic/backport-5.10/420-v5.19-06-mtd-spinand-gigadevice-add-support-for-GD5F1GM9.patch @@ -0,0 +1,76 @@ +--- a/drivers/mtd/nand/spi/gigadevice.c ++++ b/drivers/mtd/nand/spi/gigadevice.c +@@ -323,6 +323,16 @@ + SPINAND_HAS_QE_BIT, + SPINAND_ECCINFO(&gd5fxgq4xc_oob_256_ops, + gd5fxgq4ufxxg_ecc_get_status)), ++ SPINAND_INFO("GD5F1GQ4UC", ++ SPINAND_ID(SPINAND_READID_METHOD_OPCODE_ADDR, 0xd1), ++ NAND_MEMORG(1, 2048, 128, 64, 1024, 20, 1, 1, 1), ++ NAND_ECCREQ(8, 2048), ++ SPINAND_INFO_OP_VARIANTS(&read_cache_variants, ++ &write_cache_variants, ++ &update_cache_variants), ++ SPINAND_HAS_QE_BIT, ++ SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout, ++ gd5fxgq4uexxg_ecc_get_status)), + SPINAND_INFO("GD5F4GQ4UC", + SPINAND_ID(SPINAND_READID_METHOD_OPCODE, 0xb4, 0x68), + NAND_MEMORG(1, 4096, 256, 64, 2048, 40, 1, 1, 1), +@@ -496,6 +506,56 @@ + SPINAND_INFO("GD5F4GM8RExxG", + SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x85), + NAND_MEMORG(1, 2048, 128, 64, 4096, 80, 1, 1, 1), ++ NAND_ECCREQ(8, 512), ++ SPINAND_INFO_OP_VARIANTS(&read_cache_variants_1gq5, ++ &write_cache_variants, ++ &update_cache_variants), ++ SPINAND_HAS_QE_BIT, ++ SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout, ++ gd5fxgq4uexxg_ecc_get_status)), ++ SPINAND_INFO("GD5F2GQ5xExxH", ++ SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x22), ++ NAND_MEMORG(1, 2048, 64, 64, 2048, 40, 1, 1, 1), ++ NAND_ECCREQ(4, 512), ++ SPINAND_INFO_OP_VARIANTS(&read_cache_variants_2gq5, ++ &write_cache_variants, ++ &update_cache_variants), ++ SPINAND_HAS_QE_BIT, ++ SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout, ++ gd5fxgq4uexxg_ecc_get_status)), ++ SPINAND_INFO("GD5F1GQ5RExxH", ++ SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x21), ++ NAND_MEMORG(1, 2048, 64, 64, 1024, 20, 1, 1, 1), ++ NAND_ECCREQ(4, 512), ++ SPINAND_INFO_OP_VARIANTS(&read_cache_variants_1gq5, ++ &write_cache_variants, ++ &update_cache_variants), ++ SPINAND_HAS_QE_BIT, ++ SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout, ++ gd5fxgq4uexxg_ecc_get_status)), ++ SPINAND_INFO("GD5F1GQ4RExxH", ++ SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0xc9), ++ NAND_MEMORG(1, 2048, 64, 64, 1024, 20, 1, 1, 1), ++ NAND_ECCREQ(4, 512), ++ SPINAND_INFO_OP_VARIANTS(&read_cache_variants_1gq5, ++ &write_cache_variants, ++ &update_cache_variants), ++ SPINAND_HAS_QE_BIT, ++ SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout, ++ gd5fxgq4uexxg_ecc_get_status)), ++ SPINAND_INFO("GD5F1GM9UExxG", ++ SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x91, 0x01), ++ NAND_MEMORG(1, 2048, 128, 64, 1024, 20, 1, 1, 1), ++ NAND_ECCREQ(8, 512), ++ SPINAND_INFO_OP_VARIANTS(&read_cache_variants_1gq5, ++ &write_cache_variants, ++ &update_cache_variants), ++ SPINAND_HAS_QE_BIT, ++ SPINAND_ECCINFO(&gd5fxgqx_variant2_ooblayout, ++ gd5fxgq4uexxg_ecc_get_status)), ++ SPINAND_INFO("GD5F1GM9RExxG", ++ SPINAND_ID(SPINAND_READID_METHOD_OPCODE_DUMMY, 0x81, 0x01), ++ NAND_MEMORG(1, 2048, 128, 64, 1024, 20, 1, 1, 1), + NAND_ECCREQ(8, 512), + SPINAND_INFO_OP_VARIANTS(&read_cache_variants_1gq5, + &write_cache_variants, diff --git a/mihomo/component/memory/memory.go b/mihomo/component/memory/memory.go new file mode 100644 index 0000000000..0269c37b1f --- /dev/null +++ b/mihomo/component/memory/memory.go @@ -0,0 +1,29 @@ +// Package memory return MemoryInfoStat +// modify from https://github.com/shirou/gopsutil/tree/v4.25.8/process +package memory + +import ( + "errors" + "fmt" + "math" +) + +var ErrNotImplementedError = errors.New("not implemented yet") + +type MemoryInfoStat struct { + RSS uint64 `json:"rss"` // bytes + VMS uint64 `json:"vms"` // bytes +} + +// PrettyByteSize convert size in bytes to Bytes, Kilobytes, Megabytes, GB and TB +// https://gist.github.com/anikitenko/b41206a49727b83a530142c76b1cb82d?permalink_comment_id=4467913#gistcomment-4467913 +func PrettyByteSize(b uint64) string { + bf := float64(b) + for _, unit := range []string{"", "Ki", "Mi", "Gi", "Ti", "Pi", "Ei", "Zi"} { + if math.Abs(bf) < 1024.0 { + return fmt.Sprintf("%3.1f%sB", bf, unit) + } + bf /= 1024.0 + } + return fmt.Sprintf("%.1fYiB", bf) +} diff --git a/mihomo/component/memory/memory_darwin.go b/mihomo/component/memory/memory_darwin.go new file mode 100644 index 0000000000..1dd33af32a --- /dev/null +++ b/mihomo/component/memory/memory_darwin.go @@ -0,0 +1,56 @@ +package memory + +import ( + "unsafe" + + "github.com/ebitengine/purego" +) + +const PROC_PIDTASKINFO = 4 + +type ProcTaskInfo struct { + Virtual_size uint64 + Resident_size uint64 + Total_user uint64 + Total_system uint64 + Threads_user uint64 + Threads_system uint64 + Policy int32 + Faults int32 + Pageins int32 + Cow_faults int32 + Messages_sent int32 + Messages_received int32 + Syscalls_mach int32 + Syscalls_unix int32 + Csw int32 + Threadnum int32 + Numrunning int32 + Priority int32 +} + +const System = "/usr/lib/libSystem.B.dylib" + +type ProcPidInfoFunc func(pid, flavor int32, arg uint64, buffer uintptr, bufferSize int32) int32 + +const ProcPidInfoSym = "proc_pidinfo" + +func GetMemoryInfo(pid int32) (*MemoryInfoStat, error) { + lib, err := purego.Dlopen(System, purego.RTLD_LAZY|purego.RTLD_GLOBAL) + if err != nil { + return nil, err + } + defer purego.Dlclose(lib) + + var procPidInfo ProcPidInfoFunc + purego.RegisterLibFunc(&procPidInfo, lib, ProcPidInfoSym) + + var ti ProcTaskInfo + procPidInfo(pid, PROC_PIDTASKINFO, 0, uintptr(unsafe.Pointer(&ti)), int32(unsafe.Sizeof(ti))) + + ret := &MemoryInfoStat{ + RSS: uint64(ti.Resident_size), + VMS: uint64(ti.Virtual_size), + } + return ret, nil +} diff --git a/mihomo/component/memory/memory_falllback.go b/mihomo/component/memory/memory_falllback.go new file mode 100644 index 0000000000..918f5b0ec9 --- /dev/null +++ b/mihomo/component/memory/memory_falllback.go @@ -0,0 +1,7 @@ +//go:build !darwin && !linux && !freebsd && !openbsd && !windows + +package memory + +func GetMemoryInfo(pid int32) (*MemoryInfoStat, error) { + return nil, ErrNotImplementedError +} diff --git a/mihomo/component/memory/memory_freebsd.go b/mihomo/component/memory/memory_freebsd.go new file mode 100644 index 0000000000..87166b8493 --- /dev/null +++ b/mihomo/component/memory/memory_freebsd.go @@ -0,0 +1,97 @@ +package memory + +import ( + "bytes" + "encoding/binary" + "errors" + "unsafe" + + "golang.org/x/sys/unix" +) + +const ( + CTLKern = 1 + KernProc = 14 + KernProcPID = 1 +) + +func CallSyscall(mib []int32) ([]byte, uint64, error) { + mibptr := unsafe.Pointer(&mib[0]) + miblen := uint64(len(mib)) + + // get required buffer size + length := uint64(0) + _, _, err := unix.Syscall6( + unix.SYS___SYSCTL, + uintptr(mibptr), + uintptr(miblen), + 0, + uintptr(unsafe.Pointer(&length)), + 0, + 0) + if err != 0 { + var b []byte + return b, length, err + } + if length == 0 { + var b []byte + return b, length, err + } + // get proc info itself + buf := make([]byte, length) + _, _, err = unix.Syscall6( + unix.SYS___SYSCTL, + uintptr(mibptr), + uintptr(miblen), + uintptr(unsafe.Pointer(&buf[0])), + uintptr(unsafe.Pointer(&length)), + 0, + 0) + if err != 0 { + return buf, length, err + } + + return buf, length, nil +} + +func parseKinfoProc(buf []byte) (KinfoProc, error) { + var k KinfoProc + br := bytes.NewReader(buf) + err := binary.Read(br, binary.LittleEndian, &k) + return k, err +} + +func getKProc(pid int32) (*KinfoProc, error) { + mib := []int32{CTLKern, KernProc, KernProcPID, pid} + + buf, length, err := CallSyscall(mib) + if err != nil { + return nil, err + } + if length != sizeOfKinfoProc { + return nil, errors.New("unexpected size of KinfoProc") + } + + k, err := parseKinfoProc(buf) + if err != nil { + return nil, err + } + return &k, nil +} + +func GetMemoryInfo(pid int32) (*MemoryInfoStat, error) { + k, err := getKProc(pid) + if err != nil { + return nil, err + } + v, err := unix.Sysctl("vm.stats.vm.v_page_size") + if err != nil { + return nil, err + } + pageSize := binary.LittleEndian.Uint16([]byte(v)) + + return &MemoryInfoStat{ + RSS: uint64(k.Rssize) * uint64(pageSize), + VMS: uint64(k.Size), + }, nil +} diff --git a/mihomo/component/memory/memory_freebsd_386.go b/mihomo/component/memory/memory_freebsd_386.go new file mode 100644 index 0000000000..85e79c70f2 --- /dev/null +++ b/mihomo/component/memory/memory_freebsd_386.go @@ -0,0 +1,119 @@ +package memory + +const sizeOfKinfoProc = 0x300 + +type Timeval struct { + Sec int32 + Usec int32 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int32 + Ixrss int32 + Idrss int32 + Isrss int32 + Minflt int32 + Majflt int32 + Nswap int32 + Inblock int32 + Oublock int32 + Msgsnd int32 + Msgrcv int32 + Nsignals int32 + Nvcsw int32 + Nivcsw int32 +} + +type KinfoProc struct { + Structsize int32 + Layout int32 + Args int32 /* pargs */ + Paddr int32 /* proc */ + Addr int32 /* user */ + Tracep int32 /* vnode */ + Textvp int32 /* vnode */ + Fd int32 /* filedesc */ + Vmspace int32 /* vmspace */ + Wchan int32 + Pid int32 + Ppid int32 + Pgid int32 + Tpgid int32 + Sid int32 + Tsid int32 + Jobc int16 + Spare_short1 int16 + Tdev uint32 + Siglist [16]byte /* sigset */ + Sigmask [16]byte /* sigset */ + Sigignore [16]byte /* sigset */ + Sigcatch [16]byte /* sigset */ + Uid uint32 + Ruid uint32 + Svuid uint32 + Rgid uint32 + Svgid uint32 + Ngroups int16 + Spare_short2 int16 + Groups [16]uint32 + Size uint32 + Rssize int32 + Swrss int32 + Tsize int32 + Dsize int32 + Ssize int32 + Xstat uint16 + Acflag uint16 + Pctcpu uint32 + Estcpu uint32 + Slptime uint32 + Swtime uint32 + Cow uint32 + Runtime uint64 + Start Timeval + Childtime Timeval + Flag int32 + Kiflag int32 + Traceflag int32 + Stat int8 + Nice int8 + Lock int8 + Rqindex int8 + Oncpu uint8 + Lastcpu uint8 + Tdname [17]int8 + Wmesg [9]int8 + Login [18]int8 + Lockname [9]int8 + Comm [20]int8 + Emul [17]int8 + Loginclass [18]int8 + Sparestrings [50]int8 + Spareints [7]int32 + Flag2 int32 + Fibnum int32 + Cr_flags uint32 + Jid int32 + Numthreads int32 + Tid int32 + Pri Priority + Rusage Rusage + Rusage_ch Rusage + Pcb int32 /* pcb */ + Kstack int32 + Udata int32 + Tdaddr int32 /* thread */ + Spareptrs [6]int32 + Sparelongs [12]int32 + Sflag int32 + Tdflags int32 +} + +type Priority struct { + Class uint8 + Level uint8 + Native uint8 + User uint8 +} diff --git a/mihomo/component/memory/memory_freebsd_amd64.go b/mihomo/component/memory/memory_freebsd_amd64.go new file mode 100644 index 0000000000..2cebd34c2b --- /dev/null +++ b/mihomo/component/memory/memory_freebsd_amd64.go @@ -0,0 +1,125 @@ +package memory + +const sizeOfKinfoProc = 0x440 + +type Timeval struct { + Sec int64 + Usec int64 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int64 + Ixrss int64 + Idrss int64 + Isrss int64 + Minflt int64 + Majflt int64 + Nswap int64 + Inblock int64 + Oublock int64 + Msgsnd int64 + Msgrcv int64 + Nsignals int64 + Nvcsw int64 + Nivcsw int64 +} + +type KinfoProc struct { + Structsize int32 + Layout int32 + Args int64 /* pargs */ + Paddr int64 /* proc */ + Addr int64 /* user */ + Tracep int64 /* vnode */ + Textvp int64 /* vnode */ + Fd int64 /* filedesc */ + Vmspace int64 /* vmspace */ + Wchan int64 + Pid int32 + Ppid int32 + Pgid int32 + Tpgid int32 + Sid int32 + Tsid int32 + Jobc int16 + Spare_short1 int16 + Tdev_freebsd11 uint32 + Siglist [16]byte /* sigset */ + Sigmask [16]byte /* sigset */ + Sigignore [16]byte /* sigset */ + Sigcatch [16]byte /* sigset */ + Uid uint32 + Ruid uint32 + Svuid uint32 + Rgid uint32 + Svgid uint32 + Ngroups int16 + Spare_short2 int16 + Groups [16]uint32 + Size uint64 + Rssize int64 + Swrss int64 + Tsize int64 + Dsize int64 + Ssize int64 + Xstat uint16 + Acflag uint16 + Pctcpu uint32 + Estcpu uint32 + Slptime uint32 + Swtime uint32 + Cow uint32 + Runtime uint64 + Start Timeval + Childtime Timeval + Flag int64 + Kiflag int64 + Traceflag int32 + Stat int8 + Nice int8 + Lock int8 + Rqindex int8 + Oncpu_old uint8 + Lastcpu_old uint8 + Tdname [17]int8 + Wmesg [9]int8 + Login [18]int8 + Lockname [9]int8 + Comm [20]int8 + Emul [17]int8 + Loginclass [18]int8 + Moretdname [4]int8 + Sparestrings [46]int8 + Spareints [2]int32 + Tdev uint64 + Oncpu int32 + Lastcpu int32 + Tracer int32 + Flag2 int32 + Fibnum int32 + Cr_flags uint32 + Jid int32 + Numthreads int32 + Tid int32 + Pri Priority + Rusage Rusage + Rusage_ch Rusage + Pcb int64 /* pcb */ + Kstack int64 + Udata int64 + Tdaddr int64 /* thread */ + Pd int64 /* pwddesc, not accurate */ + Spareptrs [5]int64 + Sparelongs [12]int64 + Sflag int64 + Tdflags int64 +} + +type Priority struct { + Class uint8 + Level uint8 + Native uint8 + User uint8 +} diff --git a/mihomo/component/memory/memory_freebsd_arm.go b/mihomo/component/memory/memory_freebsd_arm.go new file mode 100644 index 0000000000..9c9c220024 --- /dev/null +++ b/mihomo/component/memory/memory_freebsd_arm.go @@ -0,0 +1,119 @@ +package memory + +const sizeOfKinfoProc = 0x440 + +type Timeval struct { + Sec int64 + Usec int64 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int32 + Ixrss int32 + Idrss int32 + Isrss int32 + Minflt int32 + Majflt int32 + Nswap int32 + Inblock int32 + Oublock int32 + Msgsnd int32 + Msgrcv int32 + Nsignals int32 + Nvcsw int32 + Nivcsw int32 +} + +type KinfoProc struct { + Structsize int32 + Layout int32 + Args int32 /* pargs */ + Paddr int32 /* proc */ + Addr int32 /* user */ + Tracep int32 /* vnode */ + Textvp int32 /* vnode */ + Fd int32 /* filedesc */ + Vmspace int32 /* vmspace */ + Wchan int32 + Pid int32 + Ppid int32 + Pgid int32 + Tpgid int32 + Sid int32 + Tsid int32 + Jobc int16 + Spare_short1 int16 + Tdev uint32 + Siglist [16]byte /* sigset */ + Sigmask [16]byte /* sigset */ + Sigignore [16]byte /* sigset */ + Sigcatch [16]byte /* sigset */ + Uid uint32 + Ruid uint32 + Svuid uint32 + Rgid uint32 + Svgid uint32 + Ngroups int16 + Spare_short2 int16 + Groups [16]uint32 + Size uint32 + Rssize int32 + Swrss int32 + Tsize int32 + Dsize int32 + Ssize int32 + Xstat uint16 + Acflag uint16 + Pctcpu uint32 + Estcpu uint32 + Slptime uint32 + Swtime uint32 + Cow uint32 + Runtime uint64 + Start Timeval + Childtime Timeval + Flag int32 + Kiflag int32 + Traceflag int32 + Stat int8 + Nice int8 + Lock int8 + Rqindex int8 + Oncpu uint8 + Lastcpu uint8 + Tdname [17]int8 + Wmesg [9]int8 + Login [18]int8 + Lockname [9]int8 + Comm [20]int8 + Emul [17]int8 + Loginclass [18]int8 + Sparestrings [50]int8 + Spareints [4]int32 + Flag2 int32 + Fibnum int32 + Cr_flags uint32 + Jid int32 + Numthreads int32 + Tid int32 + Pri Priority + Rusage Rusage + Rusage_ch Rusage + Pcb int32 /* pcb */ + Kstack int32 + Udata int32 + Tdaddr int32 /* thread */ + Spareptrs [6]int64 + Sparelongs [12]int64 + Sflag int64 + Tdflags int64 +} + +type Priority struct { + Class uint8 + Level uint8 + Native uint8 + User uint8 +} diff --git a/mihomo/component/memory/memory_freebsd_arm64.go b/mihomo/component/memory/memory_freebsd_arm64.go new file mode 100644 index 0000000000..4e228c9211 --- /dev/null +++ b/mihomo/component/memory/memory_freebsd_arm64.go @@ -0,0 +1,125 @@ +package memory + +const sizeOfKinfoProc = 0x440 + +type Timeval struct { + Sec int64 + Usec int64 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int64 + Ixrss int64 + Idrss int64 + Isrss int64 + Minflt int64 + Majflt int64 + Nswap int64 + Inblock int64 + Oublock int64 + Msgsnd int64 + Msgrcv int64 + Nsignals int64 + Nvcsw int64 + Nivcsw int64 +} + +type KinfoProc struct { + Structsize int32 + Layout int32 + Args int64 /* pargs */ + Paddr int64 /* proc */ + Addr int64 /* user */ + Tracep int64 /* vnode */ + Textvp int64 /* vnode */ + Fd int64 /* filedesc */ + Vmspace int64 /* vmspace */ + Wchan int64 + Pid int32 + Ppid int32 + Pgid int32 + Tpgid int32 + Sid int32 + Tsid int32 + Jobc int16 + Spare_short1 int16 + Tdev_freebsd11 uint32 + Siglist [16]byte /* sigset */ + Sigmask [16]byte /* sigset */ + Sigignore [16]byte /* sigset */ + Sigcatch [16]byte /* sigset */ + Uid uint32 + Ruid uint32 + Svuid uint32 + Rgid uint32 + Svgid uint32 + Ngroups int16 + Spare_short2 int16 + Groups [16]uint32 + Size uint64 + Rssize int64 + Swrss int64 + Tsize int64 + Dsize int64 + Ssize int64 + Xstat uint16 + Acflag uint16 + Pctcpu uint32 + Estcpu uint32 + Slptime uint32 + Swtime uint32 + Cow uint32 + Runtime uint64 + Start Timeval + Childtime Timeval + Flag int64 + Kiflag int64 + Traceflag int32 + Stat uint8 + Nice int8 + Lock uint8 + Rqindex uint8 + Oncpu_old uint8 + Lastcpu_old uint8 + Tdname [17]uint8 + Wmesg [9]uint8 + Login [18]uint8 + Lockname [9]uint8 + Comm [20]int8 // changed from uint8 by hand + Emul [17]uint8 + Loginclass [18]uint8 + Moretdname [4]uint8 + Sparestrings [46]uint8 + Spareints [2]int32 + Tdev uint64 + Oncpu int32 + Lastcpu int32 + Tracer int32 + Flag2 int32 + Fibnum int32 + Cr_flags uint32 + Jid int32 + Numthreads int32 + Tid int32 + Pri Priority + Rusage Rusage + Rusage_ch Rusage + Pcb int64 /* pcb */ + Kstack int64 + Udata int64 + Tdaddr int64 /* thread */ + Pd int64 /* pwddesc, not accurate */ + Spareptrs [5]int64 + Sparelongs [12]int64 + Sflag int64 + Tdflags int64 +} + +type Priority struct { + Class uint8 + Level uint8 + Native uint8 + User uint8 +} diff --git a/mihomo/component/memory/memory_linux.go b/mihomo/component/memory/memory_linux.go new file mode 100644 index 0000000000..f79bc28fcb --- /dev/null +++ b/mihomo/component/memory/memory_linux.go @@ -0,0 +1,37 @@ +package memory + +import ( + "os" + "path/filepath" + "strconv" + "strings" +) + +var pageSize = uint64(os.Getpagesize()) + +func GetMemoryInfo(pid int32) (*MemoryInfoStat, error) { + proc := os.Getenv("HOST_PROC") + if proc == "" { + proc = "/proc" + } + memPath := filepath.Join(proc, strconv.Itoa(int(pid)), "statm") + contents, err := os.ReadFile(memPath) + if err != nil { + return nil, err + } + fields := strings.Split(string(contents), " ") + + vms, err := strconv.ParseUint(fields[0], 10, 64) + if err != nil { + return nil, err + } + rss, err := strconv.ParseUint(fields[1], 10, 64) + if err != nil { + return nil, err + } + memInfo := &MemoryInfoStat{ + RSS: rss * pageSize, + VMS: vms * pageSize, + } + return memInfo, nil +} diff --git a/mihomo/component/memory/memory_openbsd.go b/mihomo/component/memory/memory_openbsd.go new file mode 100644 index 0000000000..e4e89996bd --- /dev/null +++ b/mihomo/component/memory/memory_openbsd.go @@ -0,0 +1,95 @@ +package memory + +import ( + "bytes" + "encoding/binary" + "errors" + "unsafe" + + "golang.org/x/sys/unix" +) + +const ( + CTLKern = 1 + KernProc = 14 + KernProcPID = 1 +) + +func callKernProcSyscall(op int32, arg int32) ([]byte, uint64, error) { + mib := []int32{CTLKern, KernProc, op, arg, sizeOfKinfoProc, 0} + mibptr := unsafe.Pointer(&mib[0]) + miblen := uint64(len(mib)) + length := uint64(0) + _, _, err := unix.Syscall6( + unix.SYS___SYSCTL, + uintptr(mibptr), + uintptr(miblen), + 0, + uintptr(unsafe.Pointer(&length)), + 0, + 0) + if err != 0 { + return nil, length, err + } + + count := int32(length / uint64(sizeOfKinfoProc)) + mib = []int32{CTLKern, KernProc, op, arg, sizeOfKinfoProc, count} + mibptr = unsafe.Pointer(&mib[0]) + miblen = uint64(len(mib)) + // get proc info itself + buf := make([]byte, length) + _, _, err = unix.Syscall6( + unix.SYS___SYSCTL, + uintptr(mibptr), + uintptr(miblen), + uintptr(unsafe.Pointer(&buf[0])), + uintptr(unsafe.Pointer(&length)), + 0, + 0) + if err != 0 { + return buf, length, err + } + + return buf, length, nil +} + +func parseKinfoProc(buf []byte) (KinfoProc, error) { + var k KinfoProc + br := bytes.NewReader(buf) + err := binary.Read(br, binary.LittleEndian, &k) + return k, err +} + +func getKProc(pid int32) (*KinfoProc, error) { + buf, length, err := callKernProcSyscall(KernProcPID, pid) + if err != nil { + return nil, err + } + if length != sizeOfKinfoProc { + return nil, errors.New("unexpected size of KinfoProc") + } + + k, err := parseKinfoProc(buf) + if err != nil { + return nil, err + } + return &k, nil +} + +func GetMemoryInfo(pid int32) (*MemoryInfoStat, error) { + k, err := getKProc(pid) + if err != nil { + return nil, err + } + uvmexp, err := unix.SysctlUvmexp("vm.uvmexp") + if err != nil { + return nil, err + } + pageSize := uint64(uvmexp.Pagesize) + + return &MemoryInfoStat{ + RSS: uint64(k.Vm_rssize) * pageSize, + VMS: uint64(k.Vm_tsize) + uint64(k.Vm_dsize) + + uint64(k.Vm_ssize), + }, nil +} diff --git a/mihomo/component/memory/memory_openbsd_386.go b/mihomo/component/memory/memory_openbsd_386.go new file mode 100644 index 0000000000..ead031754f --- /dev/null +++ b/mihomo/component/memory/memory_openbsd_386.go @@ -0,0 +1,99 @@ +package memory + +const sizeOfKinfoProc = 0x264 + +type KinfoProc struct { + Forw uint64 + Back uint64 + Paddr uint64 + Addr uint64 + Fd uint64 + Stats uint64 + Limit uint64 + Vmspace uint64 + Sigacts uint64 + Sess uint64 + Tsess uint64 + Ru uint64 + Eflag int32 + Exitsig int32 + Flag int32 + Pid int32 + Ppid int32 + Sid int32 + X_pgid int32 + Tpgid int32 + Uid uint32 + Ruid uint32 + Gid uint32 + Rgid uint32 + Groups [16]uint32 + Ngroups int16 + Jobc int16 + Tdev uint32 + Estcpu uint32 + Rtime_sec uint32 + Rtime_usec uint32 + Cpticks int32 + Pctcpu uint32 + Swtime uint32 + Slptime uint32 + Schedflags int32 + Uticks uint64 + Sticks uint64 + Iticks uint64 + Tracep uint64 + Traceflag int32 + Holdcnt int32 + Siglist int32 + Sigmask uint32 + Sigignore uint32 + Sigcatch uint32 + Stat int8 + Priority uint8 + Usrpri uint8 + Nice uint8 + Xstat uint16 + Acflag uint16 + Comm [24]int8 + Wmesg [8]int8 + Wchan uint64 + Login [32]int8 + Vm_rssize int32 + Vm_tsize int32 + Vm_dsize int32 + Vm_ssize int32 + Uvalid int64 + Ustart_sec uint64 + Ustart_usec uint32 + Uutime_sec uint32 + Uutime_usec uint32 + Ustime_sec uint32 + Ustime_usec uint32 + Uru_maxrss uint64 + Uru_ixrss uint64 + Uru_idrss uint64 + Uru_isrss uint64 + Uru_minflt uint64 + Uru_majflt uint64 + Uru_nswap uint64 + Uru_inblock uint64 + Uru_oublock uint64 + Uru_msgsnd uint64 + Uru_msgrcv uint64 + Uru_nsignals uint64 + Uru_nvcsw uint64 + Uru_nivcsw uint64 + Uctime_sec uint32 + Uctime_usec uint32 + Psflags int32 + Spare int32 + Svuid uint32 + Svgid uint32 + Emul [8]int8 + Rlim_rss_cur uint64 + Cpuid uint64 + Vm_map_size uint64 + Tid int32 + Rtableid uint32 +} diff --git a/mihomo/component/memory/memory_openbsd_amd64.go b/mihomo/component/memory/memory_openbsd_amd64.go new file mode 100644 index 0000000000..1f9ae2d38a --- /dev/null +++ b/mihomo/component/memory/memory_openbsd_amd64.go @@ -0,0 +1,100 @@ +package memory + +const sizeOfKinfoProc = 0x268 + +type KinfoProc struct { + Forw uint64 + Back uint64 + Paddr uint64 + Addr uint64 + Fd uint64 + Stats uint64 + Limit uint64 + Vmspace uint64 + Sigacts uint64 + Sess uint64 + Tsess uint64 + Ru uint64 + Eflag int32 + Exitsig int32 + Flag int32 + Pid int32 + Ppid int32 + Sid int32 + X_pgid int32 + Tpgid int32 + Uid uint32 + Ruid uint32 + Gid uint32 + Rgid uint32 + Groups [16]uint32 + Ngroups int16 + Jobc int16 + Tdev uint32 + Estcpu uint32 + Rtime_sec uint32 + Rtime_usec uint32 + Cpticks int32 + Pctcpu uint32 + Swtime uint32 + Slptime uint32 + Schedflags int32 + Uticks uint64 + Sticks uint64 + Iticks uint64 + Tracep uint64 + Traceflag int32 + Holdcnt int32 + Siglist int32 + Sigmask uint32 + Sigignore uint32 + Sigcatch uint32 + Stat int8 + Priority uint8 + Usrpri uint8 + Nice uint8 + Xstat uint16 + Acflag uint16 + Comm [24]int8 + Wmesg [8]int8 + Wchan uint64 + Login [32]int8 + Vm_rssize int32 + Vm_tsize int32 + Vm_dsize int32 + Vm_ssize int32 + Uvalid int64 + Ustart_sec uint64 + Ustart_usec uint32 + Uutime_sec uint32 + Uutime_usec uint32 + Ustime_sec uint32 + Ustime_usec uint32 + Pad_cgo_0 [4]byte + Uru_maxrss uint64 + Uru_ixrss uint64 + Uru_idrss uint64 + Uru_isrss uint64 + Uru_minflt uint64 + Uru_majflt uint64 + Uru_nswap uint64 + Uru_inblock uint64 + Uru_oublock uint64 + Uru_msgsnd uint64 + Uru_msgrcv uint64 + Uru_nsignals uint64 + Uru_nvcsw uint64 + Uru_nivcsw uint64 + Uctime_sec uint32 + Uctime_usec uint32 + Psflags int32 + Spare int32 + Svuid uint32 + Svgid uint32 + Emul [8]int8 + Rlim_rss_cur uint64 + Cpuid uint64 + Vm_map_size uint64 + Tid int32 + Rtableid uint32 +} diff --git a/mihomo/component/memory/memory_openbsd_arm.go b/mihomo/component/memory/memory_openbsd_arm.go new file mode 100644 index 0000000000..ead031754f --- /dev/null +++ b/mihomo/component/memory/memory_openbsd_arm.go @@ -0,0 +1,99 @@ +package memory + +const sizeOfKinfoProc = 0x264 + +type KinfoProc struct { + Forw uint64 + Back uint64 + Paddr uint64 + Addr uint64 + Fd uint64 + Stats uint64 + Limit uint64 + Vmspace uint64 + Sigacts uint64 + Sess uint64 + Tsess uint64 + Ru uint64 + Eflag int32 + Exitsig int32 + Flag int32 + Pid int32 + Ppid int32 + Sid int32 + X_pgid int32 + Tpgid int32 + Uid uint32 + Ruid uint32 + Gid uint32 + Rgid uint32 + Groups [16]uint32 + Ngroups int16 + Jobc int16 + Tdev uint32 + Estcpu uint32 + Rtime_sec uint32 + Rtime_usec uint32 + Cpticks int32 + Pctcpu uint32 + Swtime uint32 + Slptime uint32 + Schedflags int32 + Uticks uint64 + Sticks uint64 + Iticks uint64 + Tracep uint64 + Traceflag int32 + Holdcnt int32 + Siglist int32 + Sigmask uint32 + Sigignore uint32 + Sigcatch uint32 + Stat int8 + Priority uint8 + Usrpri uint8 + Nice uint8 + Xstat uint16 + Acflag uint16 + Comm [24]int8 + Wmesg [8]int8 + Wchan uint64 + Login [32]int8 + Vm_rssize int32 + Vm_tsize int32 + Vm_dsize int32 + Vm_ssize int32 + Uvalid int64 + Ustart_sec uint64 + Ustart_usec uint32 + Uutime_sec uint32 + Uutime_usec uint32 + Ustime_sec uint32 + Ustime_usec uint32 + Uru_maxrss uint64 + Uru_ixrss uint64 + Uru_idrss uint64 + Uru_isrss uint64 + Uru_minflt uint64 + Uru_majflt uint64 + Uru_nswap uint64 + Uru_inblock uint64 + Uru_oublock uint64 + Uru_msgsnd uint64 + Uru_msgrcv uint64 + Uru_nsignals uint64 + Uru_nvcsw uint64 + Uru_nivcsw uint64 + Uctime_sec uint32 + Uctime_usec uint32 + Psflags int32 + Spare int32 + Svuid uint32 + Svgid uint32 + Emul [8]int8 + Rlim_rss_cur uint64 + Cpuid uint64 + Vm_map_size uint64 + Tid int32 + Rtableid uint32 +} diff --git a/mihomo/component/memory/memory_openbsd_arm64.go b/mihomo/component/memory/memory_openbsd_arm64.go new file mode 100644 index 0000000000..f0fb9107a8 --- /dev/null +++ b/mihomo/component/memory/memory_openbsd_arm64.go @@ -0,0 +1,100 @@ +package memory + +const sizeOfKinfoProc = 0x270 + +type KinfoProc struct { + Forw uint64 + Back uint64 + Paddr uint64 + Addr uint64 + Fd uint64 + Stats uint64 + Limit uint64 + Vmspace uint64 + Sigacts uint64 + Sess uint64 + Tsess uint64 + Ru uint64 + Eflag int32 + Exitsig int32 + Flag int32 + Pid int32 + Ppid int32 + Sid int32 + X_pgid int32 + Tpgid int32 + Uid uint32 + Ruid uint32 + Gid uint32 + Rgid uint32 + Groups [16]uint32 + Ngroups int16 + Jobc int16 + Tdev uint32 + Estcpu uint32 + Rtime_sec uint32 + Rtime_usec uint32 + Cpticks int32 + Pctcpu uint32 + Swtime uint32 + Slptime uint32 + Schedflags int32 + Uticks uint64 + Sticks uint64 + Iticks uint64 + Tracep uint64 + Traceflag int32 + Holdcnt int32 + Siglist int32 + Sigmask uint32 + Sigignore uint32 + Sigcatch uint32 + Stat int8 + Priority uint8 + Usrpri uint8 + Nice uint8 + Xstat uint16 + Acflag uint16 + Comm [24]int8 + Wmesg [8]uint8 + Wchan uint64 + Login [32]uint8 + Vm_rssize int32 + Vm_tsize int32 + Vm_dsize int32 + Vm_ssize int32 + Uvalid int64 + Ustart_sec uint64 + Ustart_usec uint32 + Uutime_sec uint32 + Uutime_usec uint32 + Ustime_sec uint32 + Ustime_usec uint32 + Uru_maxrss uint64 + Uru_ixrss uint64 + Uru_idrss uint64 + Uru_isrss uint64 + Uru_minflt uint64 + Uru_majflt uint64 + Uru_nswap uint64 + Uru_inblock uint64 + Uru_oublock uint64 + Uru_msgsnd uint64 + Uru_msgrcv uint64 + Uru_nsignals uint64 + Uru_nvcsw uint64 + Uru_nivcsw uint64 + Uctime_sec uint32 + Uctime_usec uint32 + Psflags uint32 + Spare int32 + Svuid uint32 + Svgid uint32 + Emul [8]uint8 + Rlim_rss_cur uint64 + Cpuid uint64 + Vm_map_size uint64 + Tid int32 + Rtableid uint32 + Pledge uint64 +} diff --git a/mihomo/component/memory/memory_openbsd_riscv64.go b/mihomo/component/memory/memory_openbsd_riscv64.go new file mode 100644 index 0000000000..3b60d19bc7 --- /dev/null +++ b/mihomo/component/memory/memory_openbsd_riscv64.go @@ -0,0 +1,101 @@ +package memory + +const sizeOfKinfoProc = 0x288 + +type KinfoProc struct { + Forw uint64 + Back uint64 + Paddr uint64 + Addr uint64 + Fd uint64 + Stats uint64 + Limit uint64 + Vmspace uint64 + Sigacts uint64 + Sess uint64 + Tsess uint64 + Ru uint64 + Eflag int32 + Exitsig int32 + Flag int32 + Pid int32 + Ppid int32 + Sid int32 + X_pgid int32 + Tpgid int32 + Uid uint32 + Ruid uint32 + Gid uint32 + Rgid uint32 + Groups [16]uint32 + Ngroups int16 + Jobc int16 + Tdev uint32 + Estcpu uint32 + Rtime_sec uint32 + Rtime_usec uint32 + Cpticks int32 + Pctcpu uint32 + Swtime uint32 + Slptime uint32 + Schedflags int32 + Uticks uint64 + Sticks uint64 + Iticks uint64 + Tracep uint64 + Traceflag int32 + Holdcnt int32 + Siglist int32 + Sigmask uint32 + Sigignore uint32 + Sigcatch uint32 + Stat int8 + Priority uint8 + Usrpri uint8 + Nice uint8 + Xstat uint16 + Spare uint16 + Comm [24]int8 + Wmesg [8]uint8 + Wchan uint64 + Login [32]uint8 + Vm_rssize int32 + Vm_tsize int32 + Vm_dsize int32 + Vm_ssize int32 + Uvalid int64 + Ustart_sec uint64 + Ustart_usec uint32 + Uutime_sec uint32 + Uutime_usec uint32 + Ustime_sec uint32 + Ustime_usec uint32 + Uru_maxrss uint64 + Uru_ixrss uint64 + Uru_idrss uint64 + Uru_isrss uint64 + Uru_minflt uint64 + Uru_majflt uint64 + Uru_nswap uint64 + Uru_inblock uint64 + Uru_oublock uint64 + Uru_msgsnd uint64 + Uru_msgrcv uint64 + Uru_nsignals uint64 + Uru_nvcsw uint64 + Uru_nivcsw uint64 + Uctime_sec uint32 + Uctime_usec uint32 + Psflags uint32 + Acflag uint32 + Svuid uint32 + Svgid uint32 + Emul [8]uint8 + Rlim_rss_cur uint64 + Cpuid uint64 + Vm_map_size uint64 + Tid int32 + Rtableid uint32 + Pledge uint64 + Name [24]uint8 +} diff --git a/mihomo/component/memory/memory_test.go b/mihomo/component/memory/memory_test.go new file mode 100644 index 0000000000..0af163be71 --- /dev/null +++ b/mihomo/component/memory/memory_test.go @@ -0,0 +1,23 @@ +package memory + +import ( + "errors" + "os" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestMemoryInfo(t *testing.T) { + v, err := GetMemoryInfo(int32(os.Getpid())) + if errors.Is(err, ErrNotImplementedError) { + t.Skip("not implemented") + } + require.NoErrorf(t, err, "getting memory info error %v", err) + empty := MemoryInfoStat{} + if v == nil || *v == empty { + t.Errorf("could not get memory info %v", v) + } else { + t.Logf("memory info {RSS:%s, VMS:%s}", PrettyByteSize(v.RSS), PrettyByteSize(v.VMS)) + } +} diff --git a/mihomo/component/memory/memory_windows.go b/mihomo/component/memory/memory_windows.go new file mode 100644 index 0000000000..04dad08438 --- /dev/null +++ b/mihomo/component/memory/memory_windows.go @@ -0,0 +1,66 @@ +package memory + +import ( + "syscall" + "unsafe" + + "golang.org/x/sys/windows" +) + +var ( + modpsapi = windows.NewLazySystemDLL("psapi.dll") + procGetProcessMemoryInfo = modpsapi.NewProc("GetProcessMemoryInfo") +) + +const processQueryInformation = windows.PROCESS_QUERY_LIMITED_INFORMATION + +type PROCESS_MEMORY_COUNTERS struct { + CB uint32 + PageFaultCount uint32 + PeakWorkingSetSize uint64 + WorkingSetSize uint64 + QuotaPeakPagedPoolUsage uint64 + QuotaPagedPoolUsage uint64 + QuotaPeakNonPagedPoolUsage uint64 + QuotaNonPagedPoolUsage uint64 + PagefileUsage uint64 + PeakPagefileUsage uint64 +} + +func getProcessMemoryInfo(h windows.Handle, mem *PROCESS_MEMORY_COUNTERS) (err error) { + r1, _, e1 := syscall.Syscall(procGetProcessMemoryInfo.Addr(), 3, uintptr(h), uintptr(unsafe.Pointer(mem)), uintptr(unsafe.Sizeof(*mem))) + if r1 == 0 { + if e1 != 0 { + err = error(e1) + } else { + err = syscall.EINVAL + } + } + return +} + +func getMemoryInfo(pid int32) (PROCESS_MEMORY_COUNTERS, error) { + var mem PROCESS_MEMORY_COUNTERS + c, err := windows.OpenProcess(processQueryInformation, false, uint32(pid)) + if err != nil { + return mem, err + } + defer windows.CloseHandle(c) + if err := getProcessMemoryInfo(c, &mem); err != nil { + return mem, err + } + + return mem, err +} + +func GetMemoryInfo(pid int32) (*MemoryInfoStat, error) { + mem, err := getMemoryInfo(pid) + if err != nil { + return nil, err + } + ret := &MemoryInfoStat{ + RSS: uint64(mem.WorkingSetSize), + VMS: uint64(mem.PagefileUsage), + } + return ret, nil +} diff --git a/mihomo/docs/config.yaml b/mihomo/docs/config.yaml index 574188182a..090e273668 100644 --- a/mihomo/docs/config.yaml +++ b/mihomo/docs/config.yaml @@ -543,7 +543,7 @@ proxies: # socks5 plugin: kcptun plugin-opts: key: it's a secrect # pre-shared secret between client and server - crypt: aes # aes, aes-128, aes-192, salsa20, blowfish, twofish, cast5, 3des, tea, xtea, xor, sm4, none, null + crypt: aes # aes, aes-128, aes-192, salsa20, blowfish, twofish, cast5, 3des, tea, xtea, xor, none, null mode: fast # profiles: fast3, fast2, fast, normal, manual conn: 1 # set num of UDP connections to server autoexpire: 0 # set auto expiration time(in seconds) for a single UDP connection, 0 to disable @@ -558,7 +558,7 @@ proxies: # socks5 acknodelay: false # flush ack immediately when a packet is received nodelay: 0 interval: 50 - resend: false + resend: 0 sockbuf: 4194304 # per-socket buffer in bytes smuxver: 1 # specify smux version, available 1,2 smuxbuf: 4194304 # the overall de-mux buffer in bytes @@ -1370,7 +1370,7 @@ listeners: # kcp-tun: # enable: false # key: it's a secrect # pre-shared secret between client and server - # crypt: aes # aes, aes-128, aes-192, salsa20, blowfish, twofish, cast5, 3des, tea, xtea, xor, sm4, none, null + # crypt: aes # aes, aes-128, aes-192, salsa20, blowfish, twofish, cast5, 3des, tea, xtea, xor, none, null # mode: fast # profiles: fast3, fast2, fast, normal, manual # conn: 1 # set num of UDP connections to server # autoexpire: 0 # set auto expiration time(in seconds) for a single UDP connection, 0 to disable @@ -1385,7 +1385,7 @@ listeners: # acknodelay: false # flush ack immediately when a packet is received # nodelay: 0 # interval: 50 - # resend: false + # resend: 0 # sockbuf: 4194304 # per-socket buffer in bytes # smuxver: 1 # specify smux version, available 1,2 # smuxbuf: 4194304 # the overall de-mux buffer in bytes diff --git a/mihomo/go.mod b/mihomo/go.mod index d807b73219..6b7a8d6997 100644 --- a/mihomo/go.mod +++ b/mihomo/go.mod @@ -6,6 +6,7 @@ require ( github.com/bahlo/generic-list-go v0.2.0 github.com/coreos/go-iptables v0.8.0 github.com/dlclark/regexp2 v1.11.5 + github.com/ebitengine/purego v0.9.0 github.com/enfein/mieru/v3 v3.20.0 github.com/go-chi/chi/v5 v5.2.3 github.com/go-chi/render v1.0.3 @@ -37,7 +38,7 @@ require ( github.com/metacubex/sing-wireguard v0.0.0-20250503063753-2dc62acc626f github.com/metacubex/smux v0.0.0-20250922175018-15c9a6a78719 github.com/metacubex/tfo-go v0.0.0-20250921095601-b102db4216c0 - github.com/metacubex/utls v1.8.1-0.20250923145048-0a5bbc90dd3e + github.com/metacubex/utls v1.8.1 github.com/metacubex/wireguard-go v0.0.0-20250820062549-a6cecdd7f57f github.com/miekg/dns v1.1.63 // lastest version compatible with golang1.20 github.com/mroth/weightedrand/v2 v2.1.0 @@ -46,7 +47,6 @@ require ( github.com/sagernet/cors v1.2.1 github.com/sagernet/netlink v0.0.0-20240612041022-b9a21c07ac6a github.com/samber/lo v1.51.0 - github.com/shirou/gopsutil/v4 v4.25.1 // lastest version compatible with golang1.20 github.com/sirupsen/logrus v1.9.3 github.com/stretchr/testify v1.11.1 github.com/vmihailenco/msgpack/v5 v5.4.1 @@ -70,7 +70,6 @@ require ( github.com/andybalholm/brotli v1.0.6 // indirect github.com/buger/jsonparser v1.1.1 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/ebitengine/purego v0.8.4 // indirect github.com/ericlagergren/aegis v0.0.0-20250325060835-cd0defd64358 // indirect github.com/ericlagergren/polyval v0.0.0-20220411101811-e25bc10ba391 // indirect github.com/ericlagergren/siv v0.0.0-20220507050439-0b757b3aa5f1 // indirect @@ -88,7 +87,6 @@ require ( github.com/klauspost/cpuid/v2 v2.2.6 // indirect github.com/klauspost/reedsolomon v1.12.3 // indirect github.com/kr/text v0.2.0 // indirect - github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/mdlayher/socket v0.4.1 // indirect github.com/metacubex/ascon v0.1.0 // indirect @@ -99,17 +97,13 @@ require ( github.com/onsi/ginkgo/v2 v2.9.5 // indirect github.com/pierrec/lz4/v4 v4.1.14 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect github.com/quic-go/qpack v0.4.0 // 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/rabbitio v0.0.0-20220730151941-9ce26f4f872e // 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/vishvananda/netns v0.0.4 // indirect github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect - github.com/yusufpapurcu/wmi v1.2.4 // indirect gitlab.com/yawning/bsaes.git v0.0.0-20190805113838-0a714cd429ec // indirect go.uber.org/mock v0.4.0 // indirect golang.org/x/mod v0.20.0 // indirect diff --git a/mihomo/go.sum b/mihomo/go.sum index 5bd6da5110..271e8c1c80 100644 --- a/mihomo/go.sum +++ b/mihomo/go.sum @@ -23,8 +23,8 @@ 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.11.5 h1:Q/sSnsKerHeCkc/jSTNq1oCm7KiVgUMZRDUoRu0JQZQ= github.com/dlclark/regexp2 v1.11.5/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= -github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= -github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/ebitengine/purego v0.9.0 h1:mh0zpKBIXDceC63hpvPuGLiJ8ZAa3DfrFTudmfi8A4k= +github.com/ebitengine/purego v0.9.0/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= github.com/enfein/mieru/v3 v3.20.0 h1:1ob7pCIVSH5FYFAfYvim8isLW1vBOS4cFOUF9exJS38= github.com/enfein/mieru/v3 v3.20.0/go.mod h1:zJBUCsi5rxyvHM8fjFf+GLaEl4OEjjBXr1s5F6Qd3hM= github.com/ericlagergren/aegis v0.0.0-20250325060835-cd0defd64358 h1:kXYqH/sL8dS/FdoFjr12ePjnLPorPo2FsnrHNuXSDyo= @@ -45,7 +45,6 @@ github.com/go-chi/chi/v5 v5.2.3/go.mod h1:L2yAIGWB3H+phAw1NxKwWM+7eUH/lU8pOMm5hH 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/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= @@ -64,7 +63,6 @@ github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs= 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/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/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 h1:yAJXTCF9TqKcTiHJAE8dj7HMvPfh66eeA2JYW7eFpSE= @@ -86,8 +84,6 @@ github.com/klauspost/reedsolomon v1.12.3/go.mod h1:3K5rXwABAvzGeR01r6pWZieUALXO/ github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= -github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= 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= @@ -145,8 +141,8 @@ github.com/metacubex/smux v0.0.0-20250922175018-15c9a6a78719 h1:T6qCCfolRDAVJKea github.com/metacubex/smux v0.0.0-20250922175018-15c9a6a78719/go.mod h1:4bPD8HWx9jPJ9aE4uadgyN7D1/Wz3KmPy+vale8sKLE= github.com/metacubex/tfo-go v0.0.0-20250921095601-b102db4216c0 h1:Ui+/2s5Qz0lSnDUBmEL12M5Oi/PzvFxGTNohm8ZcsmE= github.com/metacubex/tfo-go v0.0.0-20250921095601-b102db4216c0/go.mod h1:l9oLnLoEXyGZ5RVLsh7QCC5XsouTUyKk4F2nLm2DHLw= -github.com/metacubex/utls v1.8.1-0.20250923145048-0a5bbc90dd3e h1:t9IxEaxSRp3YJ1ewQV4oGkKaJaMeSoUWjOV0boLVQo8= -github.com/metacubex/utls v1.8.1-0.20250923145048-0a5bbc90dd3e/go.mod h1:kncGGVhFaoGn5M3pFe3SXhZCzsbCJayNOH4UEqTKTko= +github.com/metacubex/utls v1.8.1 h1:RW8GeCGWAegjV0HW5nw9DoqNoeGAXXeYUP6AysmRvx4= +github.com/metacubex/utls v1.8.1/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= @@ -172,8 +168,6 @@ 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/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= 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/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g= github.com/quic-go/qpack v0.4.0 h1:Cr9BXA1sQS2SmDUWjSofMPNKmvF6IiIfDRmgU0w1ZCo= github.com/quic-go/qpack v0.4.0/go.mod h1:UZVnYIfi5GRk+zI9UMaCPsmZ2xKJP7XBUvVyT1Knj9A= @@ -183,8 +177,6 @@ github.com/sagernet/netlink v0.0.0-20240612041022-b9a21c07ac6a h1:ObwtHN2VpqE0ZN github.com/sagernet/netlink v0.0.0-20240612041022-b9a21c07ac6a/go.mod h1:xLnfdiJbSp8rNqYEdIW/6eDO4mVoogml14Bh2hSiFpM= github.com/samber/lo v1.51.0 h1:kysRYLbHy/MB7kQZf5DSN50JHmMsNEdeY24VzJFu7wI= github.com/samber/lo v1.51.0/go.mod h1:4+MXEGsJzbKGaUEQFKBq2xtfuznW9oz/WrgyzMzRoM0= -github.com/shirou/gopsutil/v4 v4.25.1 h1:QSWkTc+fu9LTAWfkZwZ6j8MSUk4A2LV7rbH0ZqmLjXs= -github.com/shirou/gopsutil/v4 v4.25.1/go.mod h1:RoUCUpndaJFtT+2zsZzzmhvbfGoDCJ7nFXKJf8GqJbI= 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/rabaead v0.0.0-20220730151906-ab6e06b96e8c h1:DjKMC30y6yjG3IxDaeAj3PCoRr+IsO+bzyT+Se2m2Hk= @@ -206,10 +198,6 @@ github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXl github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= -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/go.mod h1:eLL9Nub3yfAho7qB0MzZizFhTU2QkLeoVsWdHtDW264= github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= @@ -224,8 +212,6 @@ github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV github.com/wk8/go-ordered-map/v2 v2.1.8 h1:5h/BUHu93oj4gIdvHHHGsScSTMijfx5PeYkE/fJgbpc= github.com/wk8/go-ordered-map/v2 v2.1.8/go.mod h1:5nJHM5DyteebpVlHnWMV0rPz6Zp7+xBAnxjb1X5vnTw= github.com/xtaci/lossyconn v0.0.0-20190602105132-8df528c0c9ae h1:J0GxkO96kL4WF+AIT3M4mfUVinOCPgf2uUWYFUzN0sM= -github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= -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/go.mod h1:E+rxHvJG9H6PUdzq9NRG6csuLN3XUx98BfGOVWNYnXs= gitlab.com/yawning/bsaes.git v0.0.0-20190805113838-0a714cd429ec h1:FpfFs4EhNehiVfzQttTuxanPIT43FtkkCFypIod8LHo= @@ -257,17 +243,13 @@ golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5h 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-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-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-20220715151400-c0bba94af5f8/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.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= @@ -281,7 +263,6 @@ golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapK golang.org/x/tools v0.24.0 h1:J1shsA93PJUEVaUSaay7UXAyE8aimq3GW0pjlolpa24= 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-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/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/mihomo/tunnel/statistic/manager.go b/mihomo/tunnel/statistic/manager.go index 90a34b6d0f..9db4601e14 100644 --- a/mihomo/tunnel/statistic/manager.go +++ b/mihomo/tunnel/statistic/manager.go @@ -6,8 +6,7 @@ import ( "github.com/metacubex/mihomo/common/atomic" "github.com/metacubex/mihomo/common/xsync" - - "github.com/shirou/gopsutil/v4/process" + "github.com/metacubex/mihomo/component/memory" ) var DefaultManager *Manager @@ -20,7 +19,7 @@ func init() { downloadBlip: atomic.NewInt64(0), uploadTotal: atomic.NewInt64(0), downloadTotal: atomic.NewInt64(0), - process: &process.Process{Pid: int32(os.Getpid())}, + pid: int32(os.Getpid()), } go DefaultManager.handle() @@ -34,7 +33,7 @@ type Manager struct { downloadBlip atomic.Int64 uploadTotal atomic.Int64 downloadTotal atomic.Int64 - process *process.Process + pid int32 memory uint64 } @@ -93,7 +92,7 @@ func (m *Manager) Snapshot() *Snapshot { } func (m *Manager) updateMemory() { - stat, err := m.process.MemoryInfo() + stat, err := memory.GetMemoryInfo(m.pid) if err != nil { return } diff --git a/naiveproxy/USAGE.txt b/naiveproxy/USAGE.txt index 5e8b3ab9b4..b88448ee63 100644 --- a/naiveproxy/USAGE.txt +++ b/naiveproxy/USAGE.txt @@ -64,8 +64,12 @@ Options: SOCKS-PROXY = "socks://"[":"] Routes traffic via the proxy chain. - The default proxy is directly connection without proxying. + The default proxy is a direct connection without proxying. The last PROXY-URI is negotiated automatically for Naive padding. + + If multiple proxies are specified, they must match the number of specified + LISTEN-URIs, and each LISTEN-URI is routed to the PROXY matched by position. + Limitations: * QUIC proxies cannot follow TCP-based proxies in a proxy chain. * The user needs to ensure there is no loop in the proxy chain. diff --git a/naiveproxy/src/net/tools/naive/naive_config.cc b/naiveproxy/src/net/tools/naive/naive_config.cc index 51b38f148a..bca2630854 100644 --- a/naiveproxy/src/net/tools/naive/naive_config.cc +++ b/naiveproxy/src/net/tools/naive/naive_config.cc @@ -76,17 +76,13 @@ NaiveConfig::~NaiveConfig() = default; bool NaiveConfig::Parse(const base::Value::Dict& value) { if (const base::Value* v = value.Find("listen")) { - listen.clear(); + std::vector listen_strs; if (const std::string* str = v->GetIfString()) { - if (!listen.emplace_back().Parse(*str)) { - return false; - } + listen_strs.push_back(*str); } else if (const base::Value::List* strs = v->GetIfList()) { for (const auto& str_e : *strs) { if (const std::string* s = str_e.GetIfString()) { - if (!listen.emplace_back().Parse(*s)) { - return false; - } + listen_strs.push_back(*s); } else { std::cerr << "Invalid listen element" << std::endl; return false; @@ -96,6 +92,14 @@ bool NaiveConfig::Parse(const base::Value::Dict& value) { std::cerr << "Invalid listen" << std::endl; return false; } + if (!listen_strs.empty()) { + listen.clear(); + } + for (const std::string& str : listen_strs) { + if (!listen.emplace_back().Parse(str)) { + return false; + } + } } if (const base::Value* v = value.Find("insecure-concurrency")) { @@ -126,8 +130,24 @@ bool NaiveConfig::Parse(const base::Value::Dict& value) { } if (const base::Value* v = value.Find("proxy")) { + std::vector proxy_strs; if (const std::string* str = v->GetIfString(); str && !str->empty()) { - base::StringTokenizer proxy_uri_list(*str, ","); + proxy_strs.push_back(*str); + } else if (const base::Value::List* strs = v->GetIfList()) { + for (const auto& str_e : *strs) { + if (const std::string* s = str_e.GetIfString(); s && !s->empty()) { + proxy_strs.push_back(*s); + } else { + std::cerr << "Invalid proxy element" << std::endl; + return false; + } + } + } else { + std::cerr << "Invalid proxy argument" << std::endl; + return false; + } + for (const std::string& str : proxy_strs) { + base::StringTokenizer proxy_uri_list(str, ","); std::vector proxy_servers; bool seen_tcp = false; while (proxy_uri_list.GetNext()) { @@ -187,6 +207,7 @@ bool NaiveConfig::Parse(const base::Value::Dict& value) { << std::endl; return false; } + ProxyChain proxy_chain; if (std::any_of(proxy_servers.begin(), proxy_servers.end(), [](const ProxyServer& s) { return s.is_quic(); })) { proxy_chain = ProxyChain::ForIpProtection(proxy_servers); @@ -198,9 +219,7 @@ bool NaiveConfig::Parse(const base::Value::Dict& value) { std::cerr << "Invalid proxy chain" << std::endl; return false; } - } else { - std::cerr << "Invalid proxy argument" << std::endl; - return false; + proxy_chains.push_back(proxy_chain); } } diff --git a/naiveproxy/src/net/tools/naive/naive_config.h b/naiveproxy/src/net/tools/naive/naive_config.h index 186fca1b2f..2dd8bd2778 100644 --- a/naiveproxy/src/net/tools/naive/naive_config.h +++ b/naiveproxy/src/net/tools/naive/naive_config.h @@ -44,7 +44,7 @@ struct NaiveConfig { HttpRequestHeaders extra_headers; // The last server is assumed to be Naive. - ProxyChain proxy_chain = ProxyChain::Direct(); + std::vector proxy_chains; std::set origins_to_force_quic_on; std::map auth_store; diff --git a/naiveproxy/src/net/tools/naive/naive_proxy_bin.cc b/naiveproxy/src/net/tools/naive/naive_proxy_bin.cc index d99eb225a8..3177de6e82 100644 --- a/naiveproxy/src/net/tools/naive/naive_proxy_bin.cc +++ b/naiveproxy/src/net/tools/naive/naive_proxy_bin.cc @@ -172,7 +172,8 @@ std::unique_ptr BuildCertURLRequestContext(NetLog* net_log) { std::unique_ptr BuildURLRequestContext( const NaiveConfig& config, scoped_refptr cert_net_fetcher, - NetLog* net_log) { + NetLog* net_log, + int proxy_chain_index = 0) { URLRequestContextBuilder builder; builder.DisableHttpCache(); @@ -212,8 +213,13 @@ std::unique_ptr BuildURLRequestContext( ProxyConfig proxy_config; proxy_config.proxy_rules().type = net::ProxyConfig::ProxyRules::Type::PROXY_LIST; - proxy_config.proxy_rules().single_proxies.SetSingleProxyChain( - config.proxy_chain); + if (config.proxy_chains.empty()) { + proxy_config.proxy_rules().single_proxies.SetSingleProxyChain( + ProxyChain::Direct()); + } else { + proxy_config.proxy_rules().single_proxies.SetSingleProxyChain( + config.proxy_chains.at(proxy_chain_index)); + } LOG(INFO) << "Proxying via " << proxy_config.proxy_rules().single_proxies.ToDebugString(); auto proxy_service = @@ -456,14 +462,20 @@ int main(int argc, char* argv[]) { cert_net_fetcher = base::MakeRefCounted(); cert_net_fetcher->SetURLRequestContext(cert_context.get()); #endif - auto context = - net::BuildURLRequestContext(config, std::move(cert_net_fetcher), net_log); - auto* session = context->http_transaction_factory()->GetSession(); + + if (config.proxy_chains.size() >= 2 && + config.proxy_chains.size() != config.listen.size()) { + std::cerr << "Listen addresses do not match multiple proxy chains" + << std::endl; + return EXIT_FAILURE; + } std::vector> naive_proxies; + std::vector> contexts; std::unique_ptr resolver; - for (const net::NaiveListenConfig& listen_config : config.listen) { + for (size_t listen_i = 0; listen_i < config.listen.size(); ++listen_i) { + const net::NaiveListenConfig& listen_config = config.listen[listen_i]; auto listen_socket = std::make_unique(net_log, net::NetLogSource()); @@ -503,6 +515,15 @@ int main(int argc, char* argv[]) { config.resolver_prefix); } + if (config.proxy_chains.size() >= 2) { + contexts.push_back(net::BuildURLRequestContext( + config, std::move(cert_net_fetcher), net_log, listen_i)); + } else if (contexts.empty()) { + contexts.push_back(net::BuildURLRequestContext( + config, std::move(cert_net_fetcher), net_log)); + } + auto& context = contexts.back(); + auto* session = context->http_transaction_factory()->GetSession(); auto naive_proxy = std::make_unique( std::move(listen_socket), listen_config.protocol, listen_config.user, listen_config.pass, config.insecure_concurrency, resolver.get(), diff --git a/naiveproxy/tests/basic.py b/naiveproxy/tests/basic.py index 11067dedb4..a684a64925 100644 --- a/naiveproxy/tests/basic.py +++ b/naiveproxy/tests/basic.py @@ -245,6 +245,16 @@ test_naive('Multiple listens - config file', 'http://127.0.0.1:{PORT2}', config_content='"listen":["socks://:{PORT1}", "http://:{PORT2}"],"log":""', config_file='multiple-listen.json') +test_naive('Multiple proxies - command line', 'socks5h://127.0.0.1:{PORT1}', + '--log --listen=socks://:{PORT1} --listen=socks://:{PORT2} --proxy=http://127.0.0.1:{PORT3} --proxy=http://127.0.0.1:{PORT4}', + '--log --listen=http://:{PORT3} --listen=http://:{PORT4} --proxy=socks://127.0.0.1:{PORT5}', + '--log --listen=socks://:{PORT5}') + +test_naive('Multiple proxies - command line', 'socks5h://127.0.0.1:{PORT2}', + '--log --listen=socks://:{PORT1} --listen=socks://:{PORT2} --proxy=http://127.0.0.1:{PORT3} --proxy=http://127.0.0.1:{PORT4}', + '--log --listen=http://:{PORT3} --listen=http://:{PORT4} --proxy=socks://127.0.0.1:{PORT5}', + '--log --listen=socks://:{PORT5}') + test_naive('Trivial - listen scheme only', 'socks5h://127.0.0.1:1080', '--log --listen=socks://') diff --git a/small/luci-app-fchomo/htdocs/luci-static/resources/fchomo.js b/small/luci-app-fchomo/htdocs/luci-static/resources/fchomo.js index 70a2b7cb30..9874a07ebd 100644 --- a/small/luci-app-fchomo/htdocs/luci-static/resources/fchomo.js +++ b/small/luci-app-fchomo/htdocs/luci-static/resources/fchomo.js @@ -407,6 +407,12 @@ const CBIListValue = form.ListValue.extend({ } }); +const CBIRichValue = form.Value.extend({ + __name__: 'CBI.RichValue', + + value: form.RichListValue.prototype.value +}); + const CBIRichMultiValue = form.MultiValue.extend({ __name__: 'CBI.RichMultiValue', @@ -994,6 +1000,372 @@ function renderResDownload(section_id) { return El; } +function renderVlessEncryption(s, uciconfig) { + // ref: https://github.com/XTLS/Xray-core/pull/5067 + // https://github.com/muink/mihomo/blob/7917f24f428e40ac20b8b8f953b02cf59d1be334/transport/vless/encryption/factory.go#L64 + // https://github.com/muink/mihomo/blob/7917f24f428e40ac20b8b8f953b02cf59d1be334/transport/vless/encryption/server.go#L42 + +/* { + "method": "mlkem768x25519plus", + "xormode": "native", + "ticket": "600s", + "paddings": [ // Optional + "100-111-1111", + "75-0-111", + "50-0-3333", + ... + ], + "keypairs": [ + { + "type": "vless-x25519", + "private_key": "cP5Oy9MOpTaBKKE17Pfd56mbb1CIfp5EMpyBYqr2EG8", + "password": "khEcQMT8j41xWmGYKpZtQ4vd8_9VWyFVmmCDIhRJ-Uk" + }, + { + "type": "vless-mlkem768", + "seed": "UHPx3nf-FVxF95byAw0YG025aQNw9HxKej-MiG5AhTcdW_WFpHlTVYQU5NHmXP6tmljSnB2iPmSQ29fisGxEog", + "client": "h4sdZgCc5-ZefvQ8mZmReOWQdxYb0mwngMdl7pKhYEZZpGWHUPKAmxug87Bgj3GqSHs195QeVpxfrMLNB5Jm0Ge71Fc-A3aLpaS3C3pARbGQoquUDUEVDNwEWjQTvFpGTUV3Nddw_LlRmWN6Wqhguti9cpS6GhEmkBvBayFeHgZosuaQ1FMoAqIeQzSSSoguCZtGLUmdQjEs3zc5rwG1rNanbhtyI3QnooYvr3A0vggIkbmddjtjwYaVQdMAj9Moavc12EAUajOV91QA73RWVuhelbe7pLumsHiW-emIdBgVhEgDDYdGaLq1E8QjB0WbIfufnJp-CJa3Ieu9gmDASTlQBeEREeA9gfoZcTpYD8elhJIJxaPJKXchvUVkFhZarcivlKoqVuaFPzsJM7KQCBC8zfS0t_oiBka-uzg3_Hl153nMTDaCAbZULPZGE-p2EazI2eFBCDktdHtDffJNo7i7ZYSkWkqN9ysr2QZRvYG_PYCzcYSo34Gf5WNvHKuz0Ye3kFkckfuirCmzr3knw2azrSOmpTOX_RSlMlse7HgFYwxHPMJnzPS19ymiwKZPgrAMvCmAUZmsxZGDoKeusNEDGSSFhLcTQys20qGBGYasIgKYGjAKGjK7SCxSOCGBQSU496XBkXQEeOB7k9Sh8jdB0pQGAZw9Ntwvrts2DjIUcsQBv-XEGfnHQXoBmDgzwzYEWxeHd0oNbPIlz7CqvNseoKu6uPZl85xynum6aWd6BDDAtwobbqYkuMUfOUhXf_cH13kWSnuJ6QrOxah94JzAnda3tWRDQ3RajOOjk-OXhbOqi8QMJRFdA_C-xMwQalM_rTSTKOqyCcaNSTkVmMlmyOt90tptk7jKUizDmGhGbsSU8WMY5mhdZ3eUd5O6gQitiMHI1EqnlaRNsXnKFoJ5yHV82Wp1dhFONCG_dlpqunVJD5bFgpxtdFDD-KmXQTymAalFjxeVl_xdc5xd4XYCYmk5dhEiQBE0J_S3Z6x0tmFORpWG9lESK_OBRSul9oKZh9Vet-UZ8FSOVtNFwbeokRwWpFuFL1dL3UpJeININ2cgUfDNWQlwItkokiFf_Kdy12y2O_hqJtoTpNttNxTOiclDzKM1KHNOjYJgTgydcid3mmJl3eA6ezyrDAw1RLCHBucIvYRfwbkmpYMvnfAaA2DIiaTNaSxX8BUl92V49UVKWlQSp8ijfmmTRHrBMmxKjvBIgHqC6dSMhVUEOMzCKXAO3giCS3eZzdrNQGhhqTxpYYnFf6uLoKOIiaGY-ByI1YoIVXxX8aCTOOpesFvHjwOKBEoj4Hoxd3iFMUJQazR7P2drnfmS11kgipM7pSUgB7POKwxEF0NQCedM41wVIuoathAqD6N6qalwQ6iOKlZOBUwwMVAMRDJ3aomG37ZeLYhv6fB0-pUUJSN1q4knjtkLFIJSUrih9FZ0XnOll_aeEgOICqQkb4aOMrovjcJEWvgdjUqGPdyIGgkurfqBRHih3dukUcYxt6Y__4KLQ7acqMx0FOFv0ZxFRTCIRGj_GAlFWUi6fpuPKebXUnEn1PRE0iNXwUV_4jESWb0" + }, + ... + ] + } */ + + const vless_encryption = { + methods: [ + ['mlkem768x25519plus', _('mlkem768x25519plus')] + ], + xormodes: [ + ['native', 'native', _('Native appearance')], + ['xorpub', 'xorpub', _('Eliminate encryption header characteristics')], + ['random', 'random', _('Randomized traffic characteristics')] + ], + tickets: [ + ['600s', '600s', _('Send random ticket of 300s-600s duration for client 0-RTT reuse.')], + ['300-600s', '300-600s', _('Send random ticket of 300s-600s duration for client 0-RTT reuse.')], + ['0s', '0s', _('1-RTT only.')] + ], + rtts: [ + ['0rtt', _('0-RTT reuse.') +' '+ _('Requires server support.')], + ['1rtt', _('1-RTT only.')] + ], + paddings: [ + ['100-111-1111', '100-111-1111: ' + _('After the 1-RTT client/server hello, padding randomly 111-1111 bytes with 100% probability.')], + ['75-0-111', '75-0-111: ' + _('Wait a random 0-111 milliseconds with 75% probability.')], + ['50-0-3333', '50-0-3333: ' + _('Send padding randomly 0-3333 bytes with 50% probability.')] + ], + keypairs: { + types: [ + ['vless-x25519', _('vless-x25519')], + ['vless-mlkem768', _('vless-mlkem768')] + ] + } + }; + + const CBIVlessEncryptionValue = form.Value.extend({ + __name__: 'CBI.VlessEncryptionValue', + + renderWidget: function(section_id, option_index, cfgvalue) { + let node = form.Value.prototype.renderWidget.apply(this, arguments); + + node.classList.add('control-group'); + node.firstChild.style.width = '30em'; + + (node.querySelector('.control-group') || node).appendChild(E('button', { + class: 'cbi-button cbi-button-add', + click: ui.createHandlerFn(this, async (section_id) => { + try { + await navigator.clipboard.writeText(this.formvalue(section_id)); + console.log('Content copied to clipboard!'); + } catch (e) { + console.error('Failed to copy: ', e); + } + /* Deprecated + let inputEl = document.getElementById(this.cbid(section_id)).querySelector('input'); + inputEl.select(); + document.execCommand("copy"); + inputEl.blur(); + */ + return alert(_('Content copied to clipboard!')); + }, section_id) + }, [ _('Copy') ])); + + return node; + }, + + write: function() {} + }); + + class VlessEncryption { + // https://github.com/muink/mihomo/blob/7917f24f428e40ac20b8b8f953b02cf59d1be334/transport/vless/encryption/factory.go#L64 + // https://github.com/muink/mihomo/blob/7917f24f428e40ac20b8b8f953b02cf59d1be334/transport/vless/encryption/factory.go#L12 + constructor(payload) { + this.input = payload || ''; + try { + let content = JSON.parse(this.input.trim()); + Object.keys(content).forEach(key => this[key] = content[key]); + } catch {} + + this.method ||= vless_encryption.methods[0][0]; + this.xormode ||= vless_encryption.xormodes[0][0]; + this.ticket ||= vless_encryption.tickets[0][0]; + this.rtt ||= vless_encryption.rtts[0][0]; + this.paddings ||= []; + this.keypairs ||= []; + } + + setKey(key, value) { + this[key] = value; + + return this + } + + _toMihomo(payload, side) { + if (!['server', 'client'].includes(side)) + throw new Error('Unknown side: ' + side); // `Unknown side: '${side}'` + + let required = [ + payload.method, + payload.xormode, + side === 'server' ? payload.ticket : side === 'client' ? payload.rtt : null + ].join('.'); + + return required + + (isEmpty(payload.paddings) ? '' : '.' + payload.paddings.join('.')) + // Optional + (isEmpty(payload.keypairs) ? '' : '.' + payload.keypairs.map(e => e[side]).join('.')); // Required + } + + toString(format, side) { + format ||= 'json'; + + let payload = removeBlankAttrs({ + method: this.method, + xormode: this.xormode, + ticket: this.ticket, + rtt: this.rtt, + paddings: this.paddings || [], + keypairs: this.keypairs || [] + }); + + if (format === 'json') + return JSON.stringify(payload); + else if (format === 'mihomo') + return this._toMihomo(payload, side); + else + throw new Error(`Unknown format: '${format}'`); + } + } + + let initRequired = function(o, key, uciconfig) { + o.load = function(section_id) { + return new VlessEncryption(uci.get(uciconfig, section_id, 'vless_encryption_hmpayload'))[key]; + } + o.onchange = function(ev, section_id, value) { + let UIEl = this.section.getUIElement(section_id, 'vless_encryption_hmpayload'); + let newentry = new VlessEncryption(UIEl.getValue()).setKey(key, value); + + UIEl.setValue(newentry.toString()); + + [ + ['server', '_vless_encryption_decryption'], + ['client', '_vless_encryption_encryption'] + ].forEach(([side, option]) => { + UIEl = this.section.getUIElement(section_id, option); + UIEl.setValue(newentry.toString('mihomo', side)); + }); + } + o.write = function() {}; + o.rmempty = false; + o.modalonly = true; + } + + let o; + + o = s.taboption('field_vless_encryption', form.Value, 'vless_encryption_hmpayload', _('Payload')); + o.readonly = true; + o.depends('vless_decryption', '1'); + //o.depends('vless_encryption', '1'); + o.modalonly = true; + + o = s.taboption('field_vless_encryption', CBIVlessEncryptionValue, '_vless_encryption_decryption', _('decryption')); + o.readonly = true; + o.depends('vless_decryption', '1'); + o.modalonly = true; + + o = s.taboption('field_vless_encryption', CBIVlessEncryptionValue, '_vless_encryption_encryption', _('encryption')); + o.readonly = true; + o.depends('vless_decryption', '1'); + //o.depends('vless_encryption', '1'); + o.modalonly = true; + + o = s.taboption('field_vless_encryption', form.ListValue, 'vless_encryption_method', _('Encryption method')); + o.default = vless_encryption.methods[0][0]; + vless_encryption.methods.forEach((res) => { + o.value.apply(o, res); + }) + o.depends('vless_decryption', '1'); + //o.depends('vless_encryption', '1'); + initRequired(o, 'method', uciconfig); + + o = s.taboption('field_vless_encryption', form.RichListValue, 'vless_encryption_xormode', _('XOR mode')); + o.default = vless_encryption.xormodes[0][0]; + vless_encryption.xormodes.forEach((res) => { + o.value.apply(o, res); + }) + o.depends('vless_decryption', '1'); + //o.depends('vless_encryption', '1'); + initRequired(o, 'xormode', uciconfig); + + o = s.taboption('field_vless_encryption', CBIRichValue, 'vless_encryption_ticket', _('Server') +' '+ _('RTT')); + o.default = vless_encryption.tickets[0][0]; + vless_encryption.tickets.forEach((res) => { + o.value.apply(o, res); + }) + o.validate = function(section_id, value) { + if (!value) + return true; + + if (!value.match(/^(\d+-)?\d+s$/)) + return _('Expecting: %s').format('^(\\d+-)?\\d+s$'); + + return true; + } + o.depends('vless_decryption', '1'); + initRequired(o, 'ticket', uciconfig); + + o = s.taboption('field_vless_encryption', form.ListValue, 'vless_encryption_rtt', _('Client') +' '+ _('RTT')); + o.default = vless_encryption.rtts[0][0]; + vless_encryption.rtts.forEach((res) => { + o.value.apply(o, res); + }) + o.depends('vless_decryption', '1'); + //o.depends('vless_encryption', '1'); + initRequired(o, 'rtt', uciconfig); + + o = s.taboption('field_vless_encryption', !pr7558_merged ? CBIDynamicList : form.DynamicList, 'vless_encryption_paddings', _('Paddings'), // @pr7558_merged + _('The server and client can set different padding parameters.') + '
' + + _('In the order of one Padding-Length and one Padding-Interval, infinite concatenation.') + '
' + + _('The first padding must have a probability of 100% and at least 35 bytes.')); + vless_encryption.paddings.forEach((res) => { + o.value.apply(o, res); + }) + o.validate = function(section_id, value) { + if (!value) + return true; + + if (!value.match(/^\d+(-\d+){2}$/)) + return _('Expecting: %s').format('^\\d+(-\\d+){2}$'); + + return true; + } + o.allowduplicates = true; + o.depends('vless_decryption', '1'); + //o.depends('vless_encryption', '1'); + initRequired(o, 'paddings', uciconfig); + o.rmempty = true; // Forced + + o = s.taboption('field_vless_encryption', CBIGenText, 'vless_encryption_keypairs', _('Keypairs')); + o.placeholder = '[\n {\n "type": "vless-x25519",\n "server": "cP5Oy9MOpTaBKKE17Pfd56mbb1CIfp5EMpyBYqr2EG8",\n "client": "khEcQMT8j41xWmGYKpZtQ4vd8_9VWyFVmmCDIhRJ-Uk"\n },\n {\n "type": "vless-mlkem768",\n "server": "UHPx3nf-FVxF95byAw0YG025aQNw9HxKej-MiG5AhTcdW_WFpHlTVYQU5NHmXP6tmljSnB2iPmSQ29fisGxEog",\n "client": "h4sdZgCc5-ZefvQ8mZmReOWQdxYb0mwngMdl7pKhYEZZpGWHUPKAmxug87Bgj3GqSHs195QeVpxfrMLNB5J..."\n },\n ...\n]'; + o.rows = 10; + o.hm_options = { + type: vless_encryption.keypairs.types[0][0], + params: '', + callback: function(result) { + const section_id = this.section.section; + const key_type = this.hm_options.type; + + let keypair = {"type": key_type, "server": "", "client": ""}; + switch (key_type) { + case 'vless-x25519': + keypair.server = result.private_key; + keypair.client = result.password; + break; + case 'vless-mlkem768': + keypair.server = result.seed; + keypair.client = result.client; + break; + default: + break; + }; + + let value = []; + try { + value = JSON.parse(this.formvalue(section_id).trim()); + } catch {} + if (!Array.isArray(value)) + value = []; + + value.push(keypair); + + return [ + [this.option, JSON.stringify(value, null, 2)] + ] + } + } + o.renderWidget = function(section_id, option_index, cfgvalue) { + let node = CBITextValue.prototype.renderWidget.apply(this, arguments); + const cbid = this.cbid(section_id) + '._keytype_select'; + const selected = this.hm_options.type; + + let selectEl = E('select', { + id: cbid, + class: 'cbi-input-select', + style: 'width: 10em', + }); + + vless_encryption.keypairs.types.forEach(([k, v]) => { + selectEl.appendChild(E('option', { + 'value': k, + 'selected': (k === selected) ? '' : null + }, [ v ])); + }); + + node.appendChild(E('div', { 'class': 'control-group' }, [ + selectEl, + E('button', { + class: 'cbi-button cbi-button-add', + click: ui.createHandlerFn(this, () => { + this.hm_options.type = document.getElementById(cbid).value; + + return handleGenKey.call(this, this.hm_options); + }) + }, [ _('Generate') ]) + ])); + + return node; + } + o.depends('vless_decryption', '1'); + //o.depends('vless_encryption', '1'); + initRequired(o, 'keypairs', uciconfig); + o.load = function(section_id) { + return JSON.stringify(new VlessEncryption(uci.get(uciconfig, section_id, 'vless_encryption_hmpayload')).keypairs, null, 2); + } + o.onchange = null; // Forced + o.validate = function(section_id, value) { + let result = validateJson.apply(this, arguments); + + if (result === true) { + let arr = JSON.parse(value.trim()); + if (Array.isArray(arr) && arr.length >= 1) { + let UIEl = this.section.getUIElement(section_id, 'vless_encryption_hmpayload'); + let newentry = new VlessEncryption(UIEl.getValue()).setKey('keypairs', JSON.parse(value.trim())); + + UIEl.setValue(newentry.toString()); + + [ + ['server', '_vless_encryption_decryption'], + ['client', '_vless_encryption_encryption'] + ].forEach(([side, option]) => { + UIEl = this.section.getUIElement(section_id, option); + UIEl.setValue(newentry.toString('mihomo', side)); + }); + } else + return _('Expecting: %s').format(_('least one keypair required')); + return true; + } else + return result; + } +} + function handleGenKey(option) { const section_id = this.section.section; const type = this.section.getOption('type')?.formvalue(section_id); @@ -1455,6 +1827,7 @@ return baseclass.extend({ DynamicList: CBIDynamicList, StaticList: CBIStaticList, ListValue: CBIListValue, + RichValue: CBIRichValue, RichMultiValue: CBIRichMultiValue, TextValue: CBITextValue, GenValue: CBIGenValue, @@ -1485,6 +1858,7 @@ return baseclass.extend({ updateStatus, getDashURL, renderResDownload, + renderVlessEncryption, handleGenKey, handleReload, handleRemoveIdles, diff --git a/small/luci-app-fchomo/htdocs/luci-static/resources/view/fchomo/global.js b/small/luci-app-fchomo/htdocs/luci-static/resources/view/fchomo/global.js index a30e469fc6..0d587da2bf 100644 --- a/small/luci-app-fchomo/htdocs/luci-static/resources/view/fchomo/global.js +++ b/small/luci-app-fchomo/htdocs/luci-static/resources/view/fchomo/global.js @@ -519,6 +519,10 @@ return view.extend({ so = ss.option(form.Flag, 'tun_endpoint_independent_nat', _('Endpoint-Independent NAT'), _('Performance may degrade slightly, so it is not recommended to enable on when it is not needed.')); so.default = so.disabled; + + so = ss.option(form.Flag, 'tun_disable_icmp_forwarding', _('Disable ICMP Forwarding'), + _('Prevent ICMP loopback issues in some cases. Ping will not show real delay.')); + so.default = so.enabled; /* Inbound END */ /* TLS START */ diff --git a/small/luci-app-fchomo/htdocs/luci-static/resources/view/fchomo/node.js b/small/luci-app-fchomo/htdocs/luci-static/resources/view/fchomo/node.js index b9d1b6b2da..86e9128d44 100644 --- a/small/luci-app-fchomo/htdocs/luci-static/resources/view/fchomo/node.js +++ b/small/luci-app-fchomo/htdocs/luci-static/resources/view/fchomo/node.js @@ -88,6 +88,7 @@ return view.extend({ ss.hm_lowcase_only = true; ss.tab('field_general', _('General fields')); + ss.tab('field_vless_encryption', _('Vless Encryption fields')); ss.tab('field_tls', _('TLS fields')); ss.tab('field_transport', _('Transport fields')); ss.tab('field_multiplex', _('Multiplex fields')); @@ -208,8 +209,8 @@ return view.extend({ so.modalonly = true; /* Mieru fields */ - so = ss.taboption('field_general', form.Value, 'mieru_port_range', _('Port range')); - so.datatype = 'portrange'; + so = ss.taboption('field_general', form.DynamicList, 'mieru_ports', _('Ports pool')); + so.datatype = 'or(port, portrange)'; so.depends('type', 'mieru'); so.modalonly = true; @@ -419,10 +420,6 @@ return view.extend({ so.depends({type: /^(vmess|vless)$/}); so.modalonly = true; - so = ss.taboption('field_general', form.Value, 'vless_encryption', _('encryption')); - so.depends('type', 'vless'); - so.modalonly = true; - /* WireGuard fields */ so = ss.taboption('field_general', form.Value, 'wireguard_ip', _('Local address'), _('The %s address used by local machine in the Wireguard network.').format('IPv4')); @@ -496,6 +493,7 @@ return view.extend({ //so.value('gost-plugin', _('gost-plugin')); so.value('shadow-tls', _('shadow-tls')); so.value('restls', _('restls')); + //so.value('kcptun', _('kcptun')); so.depends('type', 'ss'); so.modalonly = true; @@ -559,6 +557,11 @@ return view.extend({ so.depends('uot', '1'); so.modalonly = true; + /* Vless Encryption fields */ + so = ss.taboption('field_general', form.Value, 'vless_encryption', _('encryption')); + so.depends('type', 'vless'); + so.modalonly = true; + /* TLS fields */ so = ss.taboption('field_general', form.Flag, 'tls', _('TLS')); so.default = so.disabled; diff --git a/small/luci-app-fchomo/htdocs/luci-static/resources/view/fchomo/server.js b/small/luci-app-fchomo/htdocs/luci-static/resources/view/fchomo/server.js index e7971eeb8f..42787f5b3b 100644 --- a/small/luci-app-fchomo/htdocs/luci-static/resources/view/fchomo/server.js +++ b/small/luci-app-fchomo/htdocs/luci-static/resources/view/fchomo/server.js @@ -62,6 +62,7 @@ return view.extend({ s.hm_lowcase_only = false; s.tab('field_general', _('General fields')); + s.tab('field_vless_encryption', _('Vless Encryption fields')); s.tab('field_tls', _('TLS fields')); s.tab('field_transport', _('Transport fields')); s.tab('field_multiplex', _('Multiplex fields')); @@ -261,14 +262,11 @@ return view.extend({ o.depends('type', 'vmess'); o.modalonly = true; - o = s.taboption('field_general', form.Value, 'vless_decryption', _('decryption')); - o.depends('type', 'vless'); - o.modalonly = true; - /* Plugin fields */ o = s.taboption('field_general', form.ListValue, 'plugin', _('Plugin')); o.value('', _('none')); o.value('shadow-tls', _('shadow-tls')); + //o.value('kcp-tun', _('kcp-tun')); o.depends('type', 'shadowsocks'); o.modalonly = true; @@ -299,6 +297,14 @@ return view.extend({ o.depends({type: /^(socks|mixed|shadowsocks)$/}); o.modalonly = true; + /* Vless Encryption fields */ + o = s.taboption('field_general', form.Flag, 'vless_decryption', _('decryption')); + o.default = o.disabled; + o.depends('type', 'vless'); + o.modalonly = true; + + hm.renderVlessEncryption(s, data[0]); + /* TLS fields */ o = s.taboption('field_general', form.Flag, 'tls', _('TLS')); o.default = o.disabled; diff --git a/small/luci-app-fchomo/po/templates/fchomo.pot b/small/luci-app-fchomo/po/templates/fchomo.pot index 97cadfdce1..f8bbf3d6c6 100644 --- a/small/luci-app-fchomo/po/templates/fchomo.pot +++ b/small/luci-app-fchomo/po/templates/fchomo.pot @@ -1,11 +1,11 @@ msgid "" msgstr "Content-Type: text/plain; charset=UTF-8" -#: htdocs/luci-static/resources/view/fchomo/log.js:69 +#: htdocs/luci-static/resources/view/fchomo/log.js:113 msgid "%s log" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:528 +#: htdocs/luci-static/resources/fchomo.js:543 #: htdocs/luci-static/resources/view/fchomo/client.js:237 #: htdocs/luci-static/resources/view/fchomo/client.js:267 #: htdocs/luci-static/resources/view/fchomo/client.js:363 @@ -16,29 +16,38 @@ msgstr "" #: htdocs/luci-static/resources/view/fchomo/client.js:925 #: htdocs/luci-static/resources/view/fchomo/client.js:938 #: htdocs/luci-static/resources/view/fchomo/client.js:939 -#: htdocs/luci-static/resources/view/fchomo/client.js:1143 -#: htdocs/luci-static/resources/view/fchomo/client.js:1584 -#: htdocs/luci-static/resources/view/fchomo/client.js:1585 -#: htdocs/luci-static/resources/view/fchomo/node.js:1317 -#: htdocs/luci-static/resources/view/fchomo/node.js:1325 -#: htdocs/luci-static/resources/view/fchomo/node.js:1339 -#: htdocs/luci-static/resources/view/fchomo/node.js:1347 +#: htdocs/luci-static/resources/view/fchomo/client.js:1151 +#: htdocs/luci-static/resources/view/fchomo/client.js:1615 +#: htdocs/luci-static/resources/view/fchomo/client.js:1616 +#: htdocs/luci-static/resources/view/fchomo/node.js:1336 +#: htdocs/luci-static/resources/view/fchomo/node.js:1344 +#: htdocs/luci-static/resources/view/fchomo/node.js:1358 +#: htdocs/luci-static/resources/view/fchomo/node.js:1366 msgid "-- Please choose --" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:40 +#: htdocs/luci-static/resources/fchomo.js:1048 +msgid "0-RTT reuse." +msgstr "" + +#: htdocs/luci-static/resources/fchomo.js:1045 +#: htdocs/luci-static/resources/fchomo.js:1049 +msgid "1-RTT only." +msgstr "" + +#: htdocs/luci-static/resources/fchomo.js:38 msgid "163Music" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:268 +#: htdocs/luci-static/resources/fchomo.js:276 msgid "2022-blake3-aes-128-gcm" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:269 +#: htdocs/luci-static/resources/fchomo.js:277 msgid "2022-blake3-aes-256-gcm" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:270 +#: htdocs/luci-static/resources/fchomo.js:278 msgid "2022-blake3-chacha20-poly1305" msgstr "" @@ -46,44 +55,44 @@ msgstr "" msgid "0 or 1 only." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/server.js:343 -#: htdocs/luci-static/resources/view/fchomo/server.js:358 +#: htdocs/luci-static/resources/view/fchomo/server.js:352 +#: htdocs/luci-static/resources/view/fchomo/server.js:367 msgid "Save your configuration before uploading files!" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:600 +#: htdocs/luci-static/resources/view/fchomo/global.js:590 msgid "API" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:640 +#: htdocs/luci-static/resources/view/fchomo/global.js:630 msgid "API DoH service" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:594 +#: htdocs/luci-static/resources/view/fchomo/global.js:584 msgid "API ECH config" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:557 +#: htdocs/luci-static/resources/view/fchomo/global.js:545 msgid "API ECH key" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:631 +#: htdocs/luci-static/resources/view/fchomo/global.js:621 msgid "API HTTP port" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:635 +#: htdocs/luci-static/resources/view/fchomo/global.js:625 msgid "API HTTPS port" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:549 +#: htdocs/luci-static/resources/view/fchomo/global.js:537 msgid "API TLS certificate path" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:553 +#: htdocs/luci-static/resources/view/fchomo/global.js:541 msgid "API TLS private key path" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:644 +#: htdocs/luci-static/resources/view/fchomo/global.js:634 msgid "API secret" msgstr "" @@ -91,16 +100,16 @@ msgstr "" msgid "ASN version" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:721 -#: htdocs/luci-static/resources/view/fchomo/global.js:771 +#: htdocs/luci-static/resources/view/fchomo/global.js:711 +#: htdocs/luci-static/resources/view/fchomo/global.js:761 msgid "Access Control" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1519 +#: htdocs/luci-static/resources/view/fchomo/client.js:1544 msgid "Add a DNS policy" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1298 +#: htdocs/luci-static/resources/view/fchomo/client.js:1307 msgid "Add a DNS server" msgstr "" @@ -108,11 +117,11 @@ msgstr "" msgid "Add a Node" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:896 +#: htdocs/luci-static/resources/view/fchomo/node.js:915 msgid "Add a provider" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1274 +#: htdocs/luci-static/resources/view/fchomo/node.js:1293 msgid "Add a proxy chain" msgstr "" @@ -132,44 +141,50 @@ msgstr "" msgid "Add a server" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1176 +#: htdocs/luci-static/resources/view/fchomo/client.js:1185 msgid "Add a sub rule" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1099 +#: htdocs/luci-static/resources/view/fchomo/node.js:1118 msgid "Add prefix" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1103 +#: htdocs/luci-static/resources/view/fchomo/node.js:1122 msgid "Add suffix" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1344 -#: htdocs/luci-static/resources/view/fchomo/client.js:1349 +#: htdocs/luci-static/resources/view/fchomo/client.js:1369 +#: htdocs/luci-static/resources/view/fchomo/client.js:1374 msgid "Address" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:526 +#: htdocs/luci-static/resources/fchomo.js:1052 +msgid "" +"After the 1-RTT client/server hello, padding randomly 111-1111 bytes with " +"100% probability." +msgstr "" + +#: htdocs/luci-static/resources/view/fchomo/global.js:514 msgid "Aging time of NAT map maintained by client.
" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:774 -#: htdocs/luci-static/resources/view/fchomo/global.js:822 -#: htdocs/luci-static/resources/view/fchomo/global.js:841 +#: htdocs/luci-static/resources/view/fchomo/global.js:764 +#: htdocs/luci-static/resources/view/fchomo/global.js:827 +#: htdocs/luci-static/resources/view/fchomo/global.js:846 msgid "All allowed" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:193 +#: htdocs/luci-static/resources/fchomo.js:201 msgid "All ports" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:627 +#: htdocs/luci-static/resources/view/fchomo/global.js:617 msgid "" "Allow access from private network.
To access the API on a private " "network from a public website, it must be enabled." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:445 +#: htdocs/luci-static/resources/view/fchomo/node.js:459 msgid "Allowed IPs" msgstr "" @@ -181,13 +196,13 @@ msgstr "" msgid "Already in updating." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:374 -#: htdocs/luci-static/resources/view/fchomo/server.js:257 +#: htdocs/luci-static/resources/view/fchomo/node.js:388 +#: htdocs/luci-static/resources/view/fchomo/server.js:258 msgid "Alter ID" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:125 -#: htdocs/luci-static/resources/fchomo.js:157 +#: htdocs/luci-static/resources/fchomo.js:131 +#: htdocs/luci-static/resources/fchomo.js:163 msgid "AnyTLS" msgstr "" @@ -204,11 +219,11 @@ msgstr "" msgid "As the TOP upstream of dnsmasq." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/server.js:207 +#: htdocs/luci-static/resources/view/fchomo/server.js:208 msgid "Auth timeout" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:396 +#: htdocs/luci-static/resources/view/fchomo/node.js:410 msgid "Authenticated length" msgstr "" @@ -216,7 +231,7 @@ msgstr "" msgid "Auto" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/server.js:81 +#: htdocs/luci-static/resources/view/fchomo/server.js:82 msgid "Auto configure firewall" msgstr "" @@ -228,45 +243,44 @@ msgstr "" msgid "Auto update resources." msgstr "" -#: htdocs/luci-static/resources/fchomo.js:39 +#: htdocs/luci-static/resources/fchomo.js:37 msgid "Baidu" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:498 -#: htdocs/luci-static/resources/view/fchomo/global.js:509 +#: htdocs/luci-static/resources/view/fchomo/global.js:496 msgid "Based on google/gvisor." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:263 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:271 msgid "Behavior" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:272 -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:286 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:280 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:294 msgid "Binary format only supports domain / ipcidr" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:280 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:288 msgid "Binary mrs" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:735 -#: htdocs/luci-static/resources/view/fchomo/node.js:866 -#: htdocs/luci-static/resources/view/fchomo/node.js:1172 +#: htdocs/luci-static/resources/view/fchomo/global.js:725 +#: htdocs/luci-static/resources/view/fchomo/node.js:885 +#: htdocs/luci-static/resources/view/fchomo/node.js:1191 msgid "Bind interface" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:867 -#: htdocs/luci-static/resources/view/fchomo/node.js:1173 +#: htdocs/luci-static/resources/view/fchomo/node.js:886 +#: htdocs/luci-static/resources/view/fchomo/node.js:1192 msgid "Bind outbound interface.
" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:736 +#: htdocs/luci-static/resources/view/fchomo/global.js:726 msgid "" "Bind outbound traffic to specific interface. Leave empty to auto detect.
" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:776 +#: htdocs/luci-static/resources/view/fchomo/global.js:766 msgid "Black list" msgstr "" @@ -274,58 +288,58 @@ msgstr "" msgid "Block DNS queries" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1250 +#: htdocs/luci-static/resources/view/fchomo/client.js:1259 msgid "Bootstrap DNS server" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1257 +#: htdocs/luci-static/resources/view/fchomo/client.js:1266 msgid "Bootstrap DNS server (Node)" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:823 +#: htdocs/luci-static/resources/view/fchomo/global.js:828 msgid "Bypass CN" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:842 +#: htdocs/luci-static/resources/view/fchomo/global.js:847 msgid "Bypass DSCP" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:622 +#: htdocs/luci-static/resources/view/fchomo/global.js:612 msgid "CORS Allow origins" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:626 +#: htdocs/luci-static/resources/view/fchomo/global.js:616 msgid "CORS Allow private network" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:623 +#: htdocs/luci-static/resources/view/fchomo/global.js:613 msgid "CORS allowed origins, * will be used if empty." msgstr "" -#: htdocs/luci-static/resources/fchomo.js:548 +#: htdocs/luci-static/resources/fchomo.js:563 msgid "Cancel" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:616 +#: htdocs/luci-static/resources/view/fchomo/node.js:635 msgid "Cert fingerprint" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:617 +#: htdocs/luci-static/resources/view/fchomo/node.js:636 msgid "" "Certificate fingerprint. Used to implement SSL Pinning and prevent MitM." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/server.js:335 +#: htdocs/luci-static/resources/view/fchomo/server.js:344 msgid "Certificate path" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1316 -#: htdocs/luci-static/resources/view/fchomo/node.js:1322 +#: htdocs/luci-static/resources/view/fchomo/node.js:1335 +#: htdocs/luci-static/resources/view/fchomo/node.js:1341 msgid "Chain head" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1338 -#: htdocs/luci-static/resources/view/fchomo/node.js:1344 +#: htdocs/luci-static/resources/view/fchomo/node.js:1357 +#: htdocs/luci-static/resources/view/fchomo/node.js:1363 msgid "Chain tail" msgstr "" @@ -354,13 +368,13 @@ msgstr "" msgid "China list version" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:193 -#: htdocs/luci-static/resources/view/fchomo/node.js:380 -#: htdocs/luci-static/resources/view/fchomo/server.js:161 +#: htdocs/luci-static/resources/view/fchomo/node.js:194 +#: htdocs/luci-static/resources/view/fchomo/node.js:394 +#: htdocs/luci-static/resources/view/fchomo/server.js:162 msgid "Chipher" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/log.js:76 +#: htdocs/luci-static/resources/view/fchomo/log.js:121 msgid "Clean log" msgstr "" @@ -370,11 +384,12 @@ msgid "" "to download the latest initial package." msgstr "" +#: htdocs/luci-static/resources/fchomo.js:1235 #: root/usr/share/luci/menu.d/luci-app-fchomo.json:22 msgid "Client" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:650 +#: htdocs/luci-static/resources/view/fchomo/node.js:669 msgid "Client fingerprint" msgstr "" @@ -382,25 +397,25 @@ msgstr "" msgid "Client status" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/log.js:39 +#: htdocs/luci-static/resources/view/fchomo/log.js:83 msgid "Collecting data..." msgstr "" -#: htdocs/luci-static/resources/fchomo.js:194 -#: htdocs/luci-static/resources/fchomo.js:195 +#: htdocs/luci-static/resources/fchomo.js:202 +#: htdocs/luci-static/resources/fchomo.js:203 msgid "Common ports (bypass P2P traffic)" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1091 +#: htdocs/luci-static/resources/fchomo.js:1473 msgid "Complete" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1119 +#: htdocs/luci-static/resources/view/fchomo/node.js:1138 msgid "Configuration Items" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:260 -#: htdocs/luci-static/resources/view/fchomo/server.js:185 +#: htdocs/luci-static/resources/view/fchomo/node.js:268 +#: htdocs/luci-static/resources/view/fchomo/server.js:186 msgid "Congestion controller" msgstr "" @@ -408,16 +423,20 @@ msgstr "" msgid "Connection check" msgstr "" +#: htdocs/luci-static/resources/fchomo.js:1088 +msgid "Content copied to clipboard!" +msgstr "" + #: htdocs/luci-static/resources/view/fchomo/client.js:598 -#: htdocs/luci-static/resources/view/fchomo/node.js:1041 -#: htdocs/luci-static/resources/view/fchomo/node.js:1055 -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:320 -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:334 +#: htdocs/luci-static/resources/view/fchomo/node.js:1060 +#: htdocs/luci-static/resources/view/fchomo/node.js:1074 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:328 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:342 msgid "Content will not be verified, Please make sure you enter it correctly." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1040 -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:319 +#: htdocs/luci-static/resources/view/fchomo/node.js:1059 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:327 msgid "Contents" msgstr "" @@ -425,6 +444,10 @@ msgstr "" msgid "Contents have been saved." msgstr "" +#: htdocs/luci-static/resources/fchomo.js:1090 +msgid "Copy" +msgstr "" + #: htdocs/luci-static/resources/view/fchomo/global.js:166 msgid "Core version" msgstr "" @@ -433,15 +456,15 @@ msgstr "" msgid "Cron expression" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:860 +#: htdocs/luci-static/resources/view/fchomo/global.js:865 msgid "Custom Direct List" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1090 +#: htdocs/luci-static/resources/view/fchomo/node.js:1109 msgid "Custom HTTP header." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:878 +#: htdocs/luci-static/resources/view/fchomo/global.js:883 msgid "Custom Proxy List" msgstr "" @@ -450,31 +473,31 @@ msgid "" "Custom internal hosts. Support yaml or json format." msgstr "" -#: htdocs/luci-static/resources/fchomo.js:147 +#: htdocs/luci-static/resources/fchomo.js:153 msgid "DIRECT" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1510 -#: htdocs/luci-static/resources/view/fchomo/client.js:1519 +#: htdocs/luci-static/resources/view/fchomo/client.js:1535 +#: htdocs/luci-static/resources/view/fchomo/client.js:1544 msgid "DNS policy" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:473 +#: htdocs/luci-static/resources/view/fchomo/global.js:471 msgid "DNS port" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1289 #: htdocs/luci-static/resources/view/fchomo/client.js:1298 -#: htdocs/luci-static/resources/view/fchomo/client.js:1597 -#: htdocs/luci-static/resources/view/fchomo/node.js:469 +#: htdocs/luci-static/resources/view/fchomo/client.js:1307 +#: htdocs/luci-static/resources/view/fchomo/client.js:1628 +#: htdocs/luci-static/resources/view/fchomo/node.js:483 msgid "DNS server" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1236 +#: htdocs/luci-static/resources/view/fchomo/client.js:1245 msgid "DNS settings" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:845 +#: htdocs/luci-static/resources/view/fchomo/global.js:850 msgid "DSCP list" msgstr "" @@ -482,32 +505,28 @@ msgstr "" msgid "Dashboard version" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:411 +#: htdocs/luci-static/resources/fchomo.js:72 msgid "Debug" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:271 -msgid "Default" -msgstr "" - #: htdocs/luci-static/resources/view/fchomo/client.js:53 msgid "Default DNS (issued by WAN)" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1264 +#: htdocs/luci-static/resources/view/fchomo/client.js:1273 msgid "Default DNS server" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:446 +#: htdocs/luci-static/resources/view/fchomo/node.js:460 msgid "Destination addresses allowed to be forwarded via Wireguard." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:94 +#: htdocs/luci-static/resources/view/fchomo/node.js:95 msgid "Dial fields" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1331 -#: htdocs/luci-static/resources/view/fchomo/node.js:1353 +#: htdocs/luci-static/resources/view/fchomo/node.js:1350 +#: htdocs/luci-static/resources/view/fchomo/node.js:1372 msgid "Different chain head/tail" msgstr "" @@ -515,33 +534,37 @@ msgstr "" msgid "Direct" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:778 +#: htdocs/luci-static/resources/view/fchomo/global.js:768 msgid "Direct IPv4 IP-s" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:781 +#: htdocs/luci-static/resources/view/fchomo/global.js:771 msgid "Direct IPv6 IP-s" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:784 +#: htdocs/luci-static/resources/view/fchomo/global.js:774 msgid "Direct MAC-s" msgstr "" #: htdocs/luci-static/resources/view/fchomo/global.js:403 -#: htdocs/luci-static/resources/view/fchomo/node.js:159 -#: htdocs/luci-static/resources/view/fchomo/server.js:141 +#: htdocs/luci-static/resources/view/fchomo/node.js:160 +#: htdocs/luci-static/resources/view/fchomo/server.js:142 msgid "Disable" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:712 +#: htdocs/luci-static/resources/view/fchomo/global.js:702 msgid "Disable ECN of quic-go" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:709 +#: htdocs/luci-static/resources/view/fchomo/global.js:699 msgid "Disable GSO of quic-go" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:565 +#: htdocs/luci-static/resources/view/fchomo/global.js:523 +msgid "Disable ICMP Forwarding" +msgstr "" + +#: htdocs/luci-static/resources/view/fchomo/node.js:584 msgid "Disable SNI" msgstr "" @@ -549,15 +572,15 @@ msgstr "" msgid "Disable UDP" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:706 +#: htdocs/luci-static/resources/view/fchomo/global.js:696 msgid "Disable safe path check" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1476 +#: htdocs/luci-static/resources/view/fchomo/client.js:1501 msgid "Discard A responses" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1492 +#: htdocs/luci-static/resources/view/fchomo/client.js:1517 msgid "Discard AAAA responses" msgstr "" @@ -567,70 +590,70 @@ msgid "" "for pure domain inbound connections without DNS resolution. e.g., socks5h" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1567 -#: htdocs/luci-static/resources/view/fchomo/client.js:1572 -#: htdocs/luci-static/resources/view/fchomo/client.js:1637 -#: htdocs/luci-static/resources/view/fchomo/client.js:1644 -#: htdocs/luci-static/resources/view/fchomo/client.js:1646 +#: htdocs/luci-static/resources/view/fchomo/client.js:1598 +#: htdocs/luci-static/resources/view/fchomo/client.js:1603 +#: htdocs/luci-static/resources/view/fchomo/client.js:1668 +#: htdocs/luci-static/resources/view/fchomo/client.js:1675 +#: htdocs/luci-static/resources/view/fchomo/client.js:1677 msgid "Domain" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:566 +#: htdocs/luci-static/resources/view/fchomo/node.js:585 msgid "Donot send server name in ClientHello." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1424 -#: htdocs/luci-static/resources/view/fchomo/node.js:630 -#: htdocs/luci-static/resources/view/fchomo/node.js:1159 +#: htdocs/luci-static/resources/view/fchomo/client.js:1449 +#: htdocs/luci-static/resources/view/fchomo/node.js:649 +#: htdocs/luci-static/resources/view/fchomo/node.js:1178 msgid "Donot verifying server certificate." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:845 +#: htdocs/luci-static/resources/view/fchomo/node.js:864 msgid "Download bandwidth" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:846 +#: htdocs/luci-static/resources/view/fchomo/node.js:865 msgid "Download bandwidth in Mbps." msgstr "" -#: htdocs/luci-static/resources/fchomo.js:977 +#: htdocs/luci-static/resources/fchomo.js:992 msgid "Download failed: %s" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:975 +#: htdocs/luci-static/resources/fchomo.js:990 msgid "Download successful." msgstr "" -#: htdocs/luci-static/resources/fchomo.js:133 +#: htdocs/luci-static/resources/fchomo.js:139 msgid "Dual stack" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:643 -#: htdocs/luci-static/resources/view/fchomo/server.js:404 +#: htdocs/luci-static/resources/view/fchomo/node.js:662 +#: htdocs/luci-static/resources/view/fchomo/server.js:415 msgid "ECH config" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/server.js:365 +#: htdocs/luci-static/resources/view/fchomo/server.js:374 msgid "ECH key" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1458 +#: htdocs/luci-static/resources/view/fchomo/client.js:1483 msgid "ECS override" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1442 +#: htdocs/luci-static/resources/view/fchomo/client.js:1467 msgid "EDNS Client Subnet" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:414 +#: htdocs/luci-static/resources/view/fchomo/global.js:412 msgid "ETag support" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:758 +#: htdocs/luci-static/resources/view/fchomo/node.js:777 msgid "Early Data first packet length limit." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:764 +#: htdocs/luci-static/resources/view/fchomo/node.js:783 msgid "Early Data header name" msgstr "" @@ -642,93 +665,101 @@ msgstr "" msgid "Edit ruleset" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1038 -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:317 +#: htdocs/luci-static/resources/view/fchomo/node.js:1057 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:325 msgid "Editer" msgstr "" +#: htdocs/luci-static/resources/fchomo.js:1039 +msgid "Eliminate encryption header characteristics" +msgstr "" + #: htdocs/luci-static/resources/view/fchomo/client.js:809 #: htdocs/luci-static/resources/view/fchomo/client.js:906 #: htdocs/luci-static/resources/view/fchomo/client.js:1135 -#: htdocs/luci-static/resources/view/fchomo/client.js:1222 -#: htdocs/luci-static/resources/view/fchomo/client.js:1340 -#: htdocs/luci-static/resources/view/fchomo/client.js:1562 +#: htdocs/luci-static/resources/view/fchomo/client.js:1231 +#: htdocs/luci-static/resources/view/fchomo/client.js:1365 +#: htdocs/luci-static/resources/view/fchomo/client.js:1587 #: htdocs/luci-static/resources/view/fchomo/global.js:401 -#: htdocs/luci-static/resources/view/fchomo/global.js:681 -#: htdocs/luci-static/resources/view/fchomo/node.js:101 -#: htdocs/luci-static/resources/view/fchomo/node.js:1011 -#: htdocs/luci-static/resources/view/fchomo/node.js:1195 -#: htdocs/luci-static/resources/view/fchomo/node.js:1284 +#: htdocs/luci-static/resources/view/fchomo/global.js:671 +#: htdocs/luci-static/resources/view/fchomo/node.js:102 +#: htdocs/luci-static/resources/view/fchomo/node.js:1030 +#: htdocs/luci-static/resources/view/fchomo/node.js:1214 +#: htdocs/luci-static/resources/view/fchomo/node.js:1303 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:253 #: htdocs/luci-static/resources/view/fchomo/server.js:50 -#: htdocs/luci-static/resources/view/fchomo/server.js:76 +#: htdocs/luci-static/resources/view/fchomo/server.js:77 msgid "Enable" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:295 +#: htdocs/luci-static/resources/view/fchomo/node.js:303 msgid "" "Enable 0-RTT QUIC connection handshake on the client side. This is not " "impacting much on the performance, as the protocol is fully multiplexed.
Disabling this is highly recommended, as it is vulnerable to replay attacks." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:294 +#: htdocs/luci-static/resources/view/fchomo/node.js:302 msgid "Enable 0-RTT handshake" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:715 +#: htdocs/luci-static/resources/view/fchomo/global.js:705 msgid "" "Enable IP4P " "conversion for outbound connections" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:637 +#: htdocs/luci-static/resources/view/fchomo/node.js:656 msgid "Enable ECH" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:833 +#: htdocs/luci-static/resources/view/fchomo/node.js:852 msgid "Enable TCP Brutal" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:834 +#: htdocs/luci-static/resources/view/fchomo/node.js:853 msgid "Enable TCP Brutal congestion control algorithm" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:822 +#: htdocs/luci-static/resources/view/fchomo/node.js:841 msgid "Enable multiplexing only for TCP." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:816 +#: htdocs/luci-static/resources/view/fchomo/node.js:835 msgid "Enable padding" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:827 +#: htdocs/luci-static/resources/view/fchomo/node.js:846 msgid "Enable statistic" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:533 -#: htdocs/luci-static/resources/view/fchomo/node.js:1141 +#: htdocs/luci-static/resources/view/fchomo/node.js:547 +#: htdocs/luci-static/resources/view/fchomo/node.js:1160 msgid "" "Enable the SUoT protocol, requires server support. Conflict with Multiplex." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:165 -#: htdocs/luci-static/resources/view/fchomo/server.js:147 +#: htdocs/luci-static/resources/view/fchomo/node.js:166 +#: htdocs/luci-static/resources/view/fchomo/server.js:148 msgid "" "Enabling obfuscation will make the server incompatible with standard QUIC " "connections, losing the ability to masquerade with HTTP/3." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:531 +#: htdocs/luci-static/resources/fchomo.js:1200 +msgid "Encryption method" +msgstr "" + +#: htdocs/luci-static/resources/view/fchomo/global.js:519 msgid "Endpoint-Independent NAT" msgstr "" #: htdocs/luci-static/resources/view/fchomo/client.js:650 -#: htdocs/luci-static/resources/view/fchomo/client.js:1589 +#: htdocs/luci-static/resources/view/fchomo/client.js:1620 msgid "Entry" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:408 +#: htdocs/luci-static/resources/fchomo.js:69 msgid "Error" msgstr "" @@ -738,7 +769,7 @@ msgid "" "if empty." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1253 +#: htdocs/luci-static/resources/view/fchomo/node.js:1272 msgid "Exclude matched node types." msgstr "" @@ -749,7 +780,7 @@ msgid "" msgstr "" #: htdocs/luci-static/resources/view/fchomo/client.js:1043 -#: htdocs/luci-static/resources/view/fchomo/node.js:1246 +#: htdocs/luci-static/resources/view/fchomo/node.js:1265 msgid "Exclude nodes that meet keywords or regexps." msgstr "" @@ -758,56 +789,59 @@ msgid "Expand/Collapse result" msgstr "" #: htdocs/luci-static/resources/view/fchomo/client.js:1003 -#: htdocs/luci-static/resources/view/fchomo/node.js:1231 +#: htdocs/luci-static/resources/view/fchomo/node.js:1250 msgid "Expected HTTP code. 204 will be used if empty." msgstr "" #: htdocs/luci-static/resources/view/fchomo/client.js:1005 -#: htdocs/luci-static/resources/view/fchomo/node.js:1233 +#: htdocs/luci-static/resources/view/fchomo/node.js:1252 msgid "Expected status" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:334 -#: htdocs/luci-static/resources/fchomo.js:337 -#: htdocs/luci-static/resources/fchomo.js:340 -#: htdocs/luci-static/resources/fchomo.js:1108 -#: htdocs/luci-static/resources/fchomo.js:1116 -#: htdocs/luci-static/resources/fchomo.js:1124 -#: htdocs/luci-static/resources/fchomo.js:1147 -#: htdocs/luci-static/resources/fchomo.js:1150 -#: htdocs/luci-static/resources/fchomo.js:1157 -#: htdocs/luci-static/resources/fchomo.js:1175 -#: htdocs/luci-static/resources/fchomo.js:1178 -#: htdocs/luci-static/resources/fchomo.js:1188 -#: htdocs/luci-static/resources/fchomo.js:1201 -#: htdocs/luci-static/resources/fchomo.js:1203 -#: htdocs/luci-static/resources/fchomo.js:1216 -#: htdocs/luci-static/resources/fchomo.js:1225 -#: htdocs/luci-static/resources/fchomo.js:1232 -#: htdocs/luci-static/resources/fchomo.js:1241 -#: htdocs/luci-static/resources/fchomo.js:1253 +#: htdocs/luci-static/resources/fchomo.js:342 +#: htdocs/luci-static/resources/fchomo.js:345 +#: htdocs/luci-static/resources/fchomo.js:348 +#: htdocs/luci-static/resources/fchomo.js:1228 #: htdocs/luci-static/resources/fchomo.js:1256 -#: htdocs/luci-static/resources/fchomo.js:1266 +#: htdocs/luci-static/resources/fchomo.js:1362 +#: htdocs/luci-static/resources/fchomo.js:1512 +#: htdocs/luci-static/resources/fchomo.js:1520 +#: htdocs/luci-static/resources/fchomo.js:1528 +#: htdocs/luci-static/resources/fchomo.js:1551 +#: htdocs/luci-static/resources/fchomo.js:1554 +#: htdocs/luci-static/resources/fchomo.js:1561 +#: htdocs/luci-static/resources/fchomo.js:1579 +#: htdocs/luci-static/resources/fchomo.js:1582 +#: htdocs/luci-static/resources/fchomo.js:1592 +#: htdocs/luci-static/resources/fchomo.js:1605 +#: htdocs/luci-static/resources/fchomo.js:1607 +#: htdocs/luci-static/resources/fchomo.js:1620 +#: htdocs/luci-static/resources/fchomo.js:1629 +#: htdocs/luci-static/resources/fchomo.js:1636 +#: htdocs/luci-static/resources/fchomo.js:1645 +#: htdocs/luci-static/resources/fchomo.js:1657 +#: htdocs/luci-static/resources/fchomo.js:1660 +#: htdocs/luci-static/resources/fchomo.js:1670 #: htdocs/luci-static/resources/view/fchomo/client.js:66 #: htdocs/luci-static/resources/view/fchomo/client.js:900 -#: htdocs/luci-static/resources/view/fchomo/client.js:1355 -#: htdocs/luci-static/resources/view/fchomo/global.js:851 -#: htdocs/luci-static/resources/view/fchomo/node.js:622 -#: htdocs/luci-static/resources/view/fchomo/node.js:1331 -#: htdocs/luci-static/resources/view/fchomo/node.js:1353 -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:272 -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:286 +#: htdocs/luci-static/resources/view/fchomo/client.js:1380 +#: htdocs/luci-static/resources/view/fchomo/global.js:856 +#: htdocs/luci-static/resources/view/fchomo/node.js:641 +#: htdocs/luci-static/resources/view/fchomo/node.js:1350 +#: htdocs/luci-static/resources/view/fchomo/node.js:1372 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:280 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:294 msgid "Expecting: %s" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:699 -#: htdocs/luci-static/resources/view/fchomo/node.js:706 -#: htdocs/luci-static/resources/view/fchomo/server.js:470 -#: htdocs/luci-static/resources/view/fchomo/server.js:477 +#: htdocs/luci-static/resources/view/fchomo/node.js:718 +#: htdocs/luci-static/resources/view/fchomo/node.js:725 +#: htdocs/luci-static/resources/view/fchomo/server.js:482 +#: htdocs/luci-static/resources/view/fchomo/server.js:489 msgid "Expecting: only support %s." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:700 +#: htdocs/luci-static/resources/view/fchomo/global.js:690 msgid "Experimental" msgstr "" @@ -822,62 +856,62 @@ msgstr "" msgid "Factor" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1049 +#: htdocs/luci-static/resources/fchomo.js:1431 msgid "Failed to execute \"/etc/init.d/fchomo %s %s\" reason: %s" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1008 +#: htdocs/luci-static/resources/fchomo.js:1390 msgid "Failed to generate %s, error: %s." msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1366 +#: htdocs/luci-static/resources/fchomo.js:1770 msgid "Failed to upload %s, error: %s." msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1385 +#: htdocs/luci-static/resources/fchomo.js:1789 msgid "Failed to upload, error: %s." msgstr "" -#: htdocs/luci-static/resources/fchomo.js:186 +#: htdocs/luci-static/resources/fchomo.js:194 msgid "Fallback" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1271 -#: htdocs/luci-static/resources/view/fchomo/client.js:1272 -#: htdocs/luci-static/resources/view/fchomo/client.js:1283 +#: htdocs/luci-static/resources/view/fchomo/client.js:1280 +#: htdocs/luci-static/resources/view/fchomo/client.js:1281 +#: htdocs/luci-static/resources/view/fchomo/client.js:1292 msgid "Fallback DNS server" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1616 +#: htdocs/luci-static/resources/view/fchomo/client.js:1647 msgid "Fallback filter" msgstr "" #: htdocs/luci-static/resources/view/fchomo/client.js:1038 -#: htdocs/luci-static/resources/view/fchomo/node.js:1240 +#: htdocs/luci-static/resources/view/fchomo/node.js:1259 msgid "Filter nodes that meet keywords or regexps." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1265 -#: htdocs/luci-static/resources/view/fchomo/client.js:1282 +#: htdocs/luci-static/resources/view/fchomo/client.js:1274 +#: htdocs/luci-static/resources/view/fchomo/client.js:1291 msgid "Final DNS server" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1265 -#: htdocs/luci-static/resources/view/fchomo/client.js:1279 +#: htdocs/luci-static/resources/view/fchomo/client.js:1274 +#: htdocs/luci-static/resources/view/fchomo/client.js:1288 msgid "Final DNS server (For non-poisoned domains)" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1272 -#: htdocs/luci-static/resources/view/fchomo/client.js:1280 +#: htdocs/luci-static/resources/view/fchomo/client.js:1281 +#: htdocs/luci-static/resources/view/fchomo/client.js:1289 msgid "Final DNS server (For poisoned domains)" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/server.js:80 +#: htdocs/luci-static/resources/view/fchomo/server.js:81 msgid "Firewall" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:366 -#: htdocs/luci-static/resources/view/fchomo/server.js:249 +#: htdocs/luci-static/resources/view/fchomo/node.js:380 +#: htdocs/luci-static/resources/view/fchomo/server.js:250 msgid "Flow" msgstr "" @@ -888,33 +922,33 @@ msgid "" msgstr "" #: htdocs/luci-static/resources/view/fchomo/client.js:1004 -#: htdocs/luci-static/resources/view/fchomo/node.js:1109 -#: htdocs/luci-static/resources/view/fchomo/node.js:1232 +#: htdocs/luci-static/resources/view/fchomo/node.js:1128 +#: htdocs/luci-static/resources/view/fchomo/node.js:1251 msgid "" "For format see %s." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:464 +#: htdocs/luci-static/resources/view/fchomo/node.js:478 msgid "Force DNS remote resolution." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:660 +#: htdocs/luci-static/resources/view/fchomo/global.js:650 msgid "Forced sniffing domain" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:277 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:285 msgid "Format" msgstr "" #: htdocs/luci-static/resources/view/fchomo/global.js:138 -#: htdocs/luci-static/resources/view/fchomo/log.js:97 -#: htdocs/luci-static/resources/view/fchomo/log.js:102 +#: htdocs/luci-static/resources/view/fchomo/log.js:142 +#: htdocs/luci-static/resources/view/fchomo/log.js:147 #: root/usr/share/luci/menu.d/luci-app-fchomo.json:3 msgid "FullCombo Shark!" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:725 +#: htdocs/luci-static/resources/view/fchomo/node.js:744 msgid "GET" msgstr "" @@ -928,7 +962,7 @@ msgstr "" #: htdocs/luci-static/resources/view/fchomo/client.js:891 #: htdocs/luci-static/resources/view/fchomo/node.js:90 -#: htdocs/luci-static/resources/view/fchomo/node.js:1001 +#: htdocs/luci-static/resources/view/fchomo/node.js:1020 #: htdocs/luci-static/resources/view/fchomo/server.js:64 msgid "General fields" msgstr "" @@ -937,16 +971,17 @@ msgstr "" msgid "General settings" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:429 -#: htdocs/luci-static/resources/fchomo.js:431 +#: htdocs/luci-static/resources/fchomo.js:443 #: htdocs/luci-static/resources/fchomo.js:445 -#: htdocs/luci-static/resources/fchomo.js:447 -#: htdocs/luci-static/resources/view/fchomo/global.js:588 -#: htdocs/luci-static/resources/view/fchomo/server.js:396 +#: htdocs/luci-static/resources/fchomo.js:459 +#: htdocs/luci-static/resources/fchomo.js:461 +#: htdocs/luci-static/resources/fchomo.js:1331 +#: htdocs/luci-static/resources/view/fchomo/global.js:578 +#: htdocs/luci-static/resources/view/fchomo/server.js:407 msgid "Generate" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:518 +#: htdocs/luci-static/resources/view/fchomo/global.js:506 msgid "Generic segmentation offload" msgstr "" @@ -958,21 +993,21 @@ msgstr "" msgid "GeoSite version" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1626 +#: htdocs/luci-static/resources/view/fchomo/client.js:1657 msgid "Geoip code" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1623 +#: htdocs/luci-static/resources/view/fchomo/client.js:1654 msgid "Geoip enable" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1568 -#: htdocs/luci-static/resources/view/fchomo/client.js:1577 -#: htdocs/luci-static/resources/view/fchomo/client.js:1635 +#: htdocs/luci-static/resources/view/fchomo/client.js:1599 +#: htdocs/luci-static/resources/view/fchomo/client.js:1608 +#: htdocs/luci-static/resources/view/fchomo/client.js:1666 msgid "Geosite" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:42 +#: htdocs/luci-static/resources/fchomo.js:40 msgid "GitHub" msgstr "" @@ -981,23 +1016,23 @@ msgstr "" msgid "Global" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:437 +#: htdocs/luci-static/resources/view/fchomo/global.js:435 msgid "Global Authentication" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:543 +#: htdocs/luci-static/resources/view/fchomo/global.js:531 msgid "Global client fingerprint" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:390 +#: htdocs/luci-static/resources/view/fchomo/node.js:404 msgid "Global padding" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:41 +#: htdocs/luci-static/resources/fchomo.js:39 msgid "Google" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:198 +#: htdocs/luci-static/resources/fchomo.js:206 msgid "Google FCM ports" msgstr "" @@ -1009,79 +1044,79 @@ msgstr "" msgid "Group" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:118 -#: htdocs/luci-static/resources/fchomo.js:148 -#: htdocs/luci-static/resources/view/fchomo/node.js:486 -#: htdocs/luci-static/resources/view/fchomo/node.js:688 -#: htdocs/luci-static/resources/view/fchomo/node.js:699 -#: htdocs/luci-static/resources/view/fchomo/server.js:470 +#: htdocs/luci-static/resources/fchomo.js:124 +#: htdocs/luci-static/resources/fchomo.js:154 +#: htdocs/luci-static/resources/view/fchomo/node.js:500 +#: htdocs/luci-static/resources/view/fchomo/node.js:707 +#: htdocs/luci-static/resources/view/fchomo/node.js:718 +#: htdocs/luci-static/resources/view/fchomo/server.js:482 msgid "HTTP" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:134 -#: htdocs/luci-static/resources/view/fchomo/node.js:747 -#: htdocs/luci-static/resources/view/fchomo/node.js:1089 +#: htdocs/luci-static/resources/view/fchomo/node.js:135 +#: htdocs/luci-static/resources/view/fchomo/node.js:766 +#: htdocs/luci-static/resources/view/fchomo/node.js:1108 msgid "HTTP header" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:724 +#: htdocs/luci-static/resources/view/fchomo/node.js:743 msgid "HTTP request method" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1407 +#: htdocs/luci-static/resources/view/fchomo/client.js:1432 msgid "HTTP/3" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/server.js:155 +#: htdocs/luci-static/resources/view/fchomo/server.js:156 msgid "" "HTTP3 server behavior when authentication fails.
A 404 page will be " "returned if empty." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:689 -#: htdocs/luci-static/resources/view/fchomo/node.js:700 -#: htdocs/luci-static/resources/view/fchomo/server.js:471 +#: htdocs/luci-static/resources/view/fchomo/node.js:708 +#: htdocs/luci-static/resources/view/fchomo/node.js:719 +#: htdocs/luci-static/resources/view/fchomo/server.js:483 msgid "HTTPUpgrade" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:826 +#: htdocs/luci-static/resources/view/fchomo/global.js:831 msgid "Handle domain" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:231 +#: htdocs/luci-static/resources/view/fchomo/node.js:232 msgid "Handshake mode" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/server.js:271 +#: htdocs/luci-static/resources/view/fchomo/server.js:272 msgid "Handshake target that supports TLS 1.3" msgstr "" #: htdocs/luci-static/resources/view/fchomo/client.js:973 -#: htdocs/luci-static/resources/view/fchomo/node.js:1200 +#: htdocs/luci-static/resources/view/fchomo/node.js:1219 msgid "Health check URL" msgstr "" #: htdocs/luci-static/resources/view/fchomo/client.js:1002 -#: htdocs/luci-static/resources/view/fchomo/node.js:1230 +#: htdocs/luci-static/resources/view/fchomo/node.js:1249 msgid "Health check expected status" msgstr "" #: htdocs/luci-static/resources/view/fchomo/client.js:982 -#: htdocs/luci-static/resources/view/fchomo/node.js:1210 +#: htdocs/luci-static/resources/view/fchomo/node.js:1229 msgid "Health check interval" msgstr "" #: htdocs/luci-static/resources/view/fchomo/client.js:989 -#: htdocs/luci-static/resources/view/fchomo/node.js:1217 +#: htdocs/luci-static/resources/view/fchomo/node.js:1236 msgid "Health check timeout" msgstr "" #: htdocs/luci-static/resources/view/fchomo/client.js:893 -#: htdocs/luci-static/resources/view/fchomo/node.js:1003 +#: htdocs/luci-static/resources/view/fchomo/node.js:1022 msgid "Health fields" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:301 +#: htdocs/luci-static/resources/view/fchomo/node.js:309 msgid "Heartbeat interval" msgstr "" @@ -1089,15 +1124,15 @@ msgstr "" msgid "Hidden" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:492 +#: htdocs/luci-static/resources/view/fchomo/node.js:506 msgid "Host that supports TLS 1.3" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:187 +#: htdocs/luci-static/resources/view/fchomo/node.js:188 msgid "Host-key" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:182 +#: htdocs/luci-static/resources/view/fchomo/node.js:183 msgid "Host-key algorithms" msgstr "" @@ -1106,39 +1141,39 @@ msgstr "" msgid "Hosts" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:127 -#: htdocs/luci-static/resources/fchomo.js:159 +#: htdocs/luci-static/resources/fchomo.js:133 +#: htdocs/luci-static/resources/fchomo.js:165 msgid "Hysteria2" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1628 -#: htdocs/luci-static/resources/view/fchomo/client.js:1641 +#: htdocs/luci-static/resources/view/fchomo/client.js:1659 +#: htdocs/luci-static/resources/view/fchomo/client.js:1672 msgid "IP" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1639 +#: htdocs/luci-static/resources/view/fchomo/client.js:1670 msgid "IP CIDR" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:254 +#: htdocs/luci-static/resources/view/fchomo/node.js:262 msgid "IP override" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:878 -#: htdocs/luci-static/resources/view/fchomo/node.js:1186 +#: htdocs/luci-static/resources/view/fchomo/node.js:897 +#: htdocs/luci-static/resources/view/fchomo/node.js:1205 msgid "IP version" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:134 +#: htdocs/luci-static/resources/fchomo.js:140 msgid "IPv4 only" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:135 +#: htdocs/luci-static/resources/fchomo.js:141 msgid "IPv6 only" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1247 -#: htdocs/luci-static/resources/view/fchomo/global.js:417 +#: htdocs/luci-static/resources/view/fchomo/client.js:1256 +#: htdocs/luci-static/resources/view/fchomo/global.js:415 msgid "IPv6 support" msgstr "" @@ -1146,19 +1181,19 @@ msgstr "" msgid "Icon" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:339 +#: htdocs/luci-static/resources/view/fchomo/node.js:353 msgid "Idle session check interval" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:346 +#: htdocs/luci-static/resources/view/fchomo/node.js:360 msgid "Idle session timeout" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/server.js:200 +#: htdocs/luci-static/resources/view/fchomo/server.js:201 msgid "Idle timeout" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1150 +#: htdocs/luci-static/resources/fchomo.js:1554 msgid "If All ports is selected, uncheck others" msgstr "" @@ -1166,11 +1201,11 @@ msgstr "" msgid "If Block is selected, uncheck others" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/server.js:134 +#: htdocs/luci-static/resources/view/fchomo/server.js:135 msgid "Ignore client bandwidth" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:553 +#: htdocs/luci-static/resources/fchomo.js:568 msgid "Import" msgstr "" @@ -1178,14 +1213,14 @@ msgstr "" #: htdocs/luci-static/resources/view/fchomo/client.js:885 #: htdocs/luci-static/resources/view/fchomo/client.js:1082 #: htdocs/luci-static/resources/view/fchomo/client.js:1124 -#: htdocs/luci-static/resources/view/fchomo/client.js:1183 -#: htdocs/luci-static/resources/view/fchomo/client.js:1211 -#: htdocs/luci-static/resources/view/fchomo/client.js:1305 -#: htdocs/luci-static/resources/view/fchomo/client.js:1329 -#: htdocs/luci-static/resources/view/fchomo/client.js:1526 +#: htdocs/luci-static/resources/view/fchomo/client.js:1192 +#: htdocs/luci-static/resources/view/fchomo/client.js:1220 +#: htdocs/luci-static/resources/view/fchomo/client.js:1314 +#: htdocs/luci-static/resources/view/fchomo/client.js:1354 #: htdocs/luci-static/resources/view/fchomo/client.js:1551 -#: htdocs/luci-static/resources/view/fchomo/node.js:903 -#: htdocs/luci-static/resources/view/fchomo/node.js:989 +#: htdocs/luci-static/resources/view/fchomo/client.js:1576 +#: htdocs/luci-static/resources/view/fchomo/node.js:922 +#: htdocs/luci-static/resources/view/fchomo/node.js:1008 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:142 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:230 msgid "Import mihomo config" @@ -1197,49 +1232,55 @@ msgstr "" msgid "Import rule-set links" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:147 -#: htdocs/luci-static/resources/view/fchomo/node.js:153 -#: htdocs/luci-static/resources/view/fchomo/node.js:1147 -#: htdocs/luci-static/resources/view/fchomo/node.js:1153 -#: htdocs/luci-static/resources/view/fchomo/server.js:123 -#: htdocs/luci-static/resources/view/fchomo/server.js:129 +#: htdocs/luci-static/resources/view/fchomo/node.js:148 +#: htdocs/luci-static/resources/view/fchomo/node.js:154 +#: htdocs/luci-static/resources/view/fchomo/node.js:1166 +#: htdocs/luci-static/resources/view/fchomo/node.js:1172 +#: htdocs/luci-static/resources/view/fchomo/server.js:124 +#: htdocs/luci-static/resources/view/fchomo/server.js:130 msgid "In Mbps." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1067 -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:346 +#: htdocs/luci-static/resources/view/fchomo/node.js:1086 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:354 msgid "In bytes. %s will be used if empty." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:302 -#: htdocs/luci-static/resources/view/fchomo/node.js:309 +#: htdocs/luci-static/resources/view/fchomo/node.js:310 +#: htdocs/luci-static/resources/view/fchomo/node.js:317 msgid "In millisecond." msgstr "" #: htdocs/luci-static/resources/view/fchomo/client.js:990 #: htdocs/luci-static/resources/view/fchomo/client.js:1019 -#: htdocs/luci-static/resources/view/fchomo/node.js:1218 +#: htdocs/luci-static/resources/view/fchomo/node.js:1237 msgid "In millisecond. %s will be used if empty." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:340 -#: htdocs/luci-static/resources/view/fchomo/node.js:347 -#: htdocs/luci-static/resources/view/fchomo/server.js:201 -#: htdocs/luci-static/resources/view/fchomo/server.js:208 +#: htdocs/luci-static/resources/view/fchomo/node.js:354 +#: htdocs/luci-static/resources/view/fchomo/node.js:361 +#: htdocs/luci-static/resources/view/fchomo/server.js:202 +#: htdocs/luci-static/resources/view/fchomo/server.js:209 msgid "In seconds." msgstr "" #: htdocs/luci-static/resources/view/fchomo/client.js:983 -#: htdocs/luci-static/resources/view/fchomo/global.js:427 -#: htdocs/luci-static/resources/view/fchomo/global.js:432 -#: htdocs/luci-static/resources/view/fchomo/global.js:527 -#: htdocs/luci-static/resources/view/fchomo/node.js:1073 -#: htdocs/luci-static/resources/view/fchomo/node.js:1211 -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:352 +#: htdocs/luci-static/resources/view/fchomo/global.js:425 +#: htdocs/luci-static/resources/view/fchomo/global.js:430 +#: htdocs/luci-static/resources/view/fchomo/global.js:515 +#: htdocs/luci-static/resources/view/fchomo/node.js:1092 +#: htdocs/luci-static/resources/view/fchomo/node.js:1230 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:360 msgid "In seconds. %s will be used if empty." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:451 +#: htdocs/luci-static/resources/fchomo.js:1246 +msgid "" +"In the order of one Padding-Length and one Padding-" +"Interval, infinite concatenation." +msgstr "" + +#: htdocs/luci-static/resources/view/fchomo/global.js:449 msgid "Inbound" msgstr "" @@ -1267,96 +1308,99 @@ msgstr "" msgid "Includes all Proxy Node." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:410 +#: htdocs/luci-static/resources/fchomo.js:71 msgid "Info" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1018 -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:260 +#: htdocs/luci-static/resources/view/fchomo/node.js:1037 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:268 msgid "Inline" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:728 +#: htdocs/luci-static/resources/view/fchomo/global.js:718 msgid "Interface Control" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:132 +#: htdocs/luci-static/resources/fchomo.js:138 msgid "Keep default" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/server.js:350 +#: htdocs/luci-static/resources/view/fchomo/server.js:359 msgid "Key path" msgstr "" +#: htdocs/luci-static/resources/fchomo.js:1266 +msgid "Keypairs" +msgstr "" + #: htdocs/luci-static/resources/view/fchomo/client.js:896 #: htdocs/luci-static/resources/view/fchomo/client.js:1130 -#: htdocs/luci-static/resources/view/fchomo/client.js:1217 -#: htdocs/luci-static/resources/view/fchomo/client.js:1335 -#: htdocs/luci-static/resources/view/fchomo/client.js:1557 -#: htdocs/luci-static/resources/view/fchomo/node.js:96 -#: htdocs/luci-static/resources/view/fchomo/node.js:1006 -#: htdocs/luci-static/resources/view/fchomo/node.js:1279 +#: htdocs/luci-static/resources/view/fchomo/client.js:1226 +#: htdocs/luci-static/resources/view/fchomo/client.js:1360 +#: htdocs/luci-static/resources/view/fchomo/client.js:1582 +#: htdocs/luci-static/resources/view/fchomo/node.js:97 +#: htdocs/luci-static/resources/view/fchomo/node.js:1025 +#: htdocs/luci-static/resources/view/fchomo/node.js:1298 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:248 -#: htdocs/luci-static/resources/view/fchomo/server.js:71 +#: htdocs/luci-static/resources/view/fchomo/server.js:72 msgid "Label" msgstr "" #: htdocs/luci-static/resources/view/fchomo/client.js:996 -#: htdocs/luci-static/resources/view/fchomo/node.js:1224 +#: htdocs/luci-static/resources/view/fchomo/node.js:1243 msgid "Lazy" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/server.js:258 +#: htdocs/luci-static/resources/view/fchomo/server.js:259 msgid "" "Legacy protocol support (VMess MD5 Authentication) is provided for " "compatibility purposes only, use of alterId > 1 is not recommended." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:496 -#: htdocs/luci-static/resources/view/fchomo/global.js:511 +#: htdocs/luci-static/resources/view/fchomo/global.js:494 msgid "Less compatibility and sometimes better performance." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:578 -#: htdocs/luci-static/resources/view/fchomo/server.js:331 +#: htdocs/luci-static/resources/view/fchomo/node.js:597 +#: htdocs/luci-static/resources/view/fchomo/server.js:340 msgid "List of supported application level protocols, in order of preference." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/server.js:91 +#: htdocs/luci-static/resources/view/fchomo/server.js:92 msgid "Listen address" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/server.js:68 +#: htdocs/luci-static/resources/view/fchomo/server.js:69 msgid "Listen fields" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:730 +#: htdocs/luci-static/resources/view/fchomo/global.js:720 msgid "Listen interfaces" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1242 -#: htdocs/luci-static/resources/view/fchomo/server.js:96 +#: htdocs/luci-static/resources/view/fchomo/client.js:1251 +#: htdocs/luci-static/resources/view/fchomo/server.js:97 msgid "Listen port" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:454 +#: htdocs/luci-static/resources/view/fchomo/global.js:452 msgid "Listen ports" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:188 +#: htdocs/luci-static/resources/fchomo.js:196 msgid "Load balance" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1016 -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:258 +#: htdocs/luci-static/resources/view/fchomo/node.js:1035 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:266 msgid "Local" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:417 +#: htdocs/luci-static/resources/view/fchomo/node.js:431 msgid "Local IPv6 address" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:410 +#: htdocs/luci-static/resources/view/fchomo/node.js:424 msgid "Local address" msgstr "" @@ -1364,11 +1408,11 @@ msgstr "" msgid "Log" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/log.js:54 +#: htdocs/luci-static/resources/view/fchomo/log.js:98 msgid "Log file does not exist." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/log.js:47 +#: htdocs/luci-static/resources/view/fchomo/log.js:91 msgid "Log is empty." msgstr "" @@ -1376,53 +1420,53 @@ msgstr "" msgid "Log level" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:334 +#: htdocs/luci-static/resources/fchomo.js:342 msgid "Lowercase only" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:514 -#: htdocs/luci-static/resources/view/fchomo/node.js:457 +#: htdocs/luci-static/resources/view/fchomo/global.js:502 +#: htdocs/luci-static/resources/view/fchomo/node.js:471 msgid "MTU" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/server.js:154 +#: htdocs/luci-static/resources/view/fchomo/server.js:155 msgid "Masquerade" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1573 +#: htdocs/luci-static/resources/view/fchomo/client.js:1604 msgid "Match domain. Support wildcards." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1645 +#: htdocs/luci-static/resources/view/fchomo/client.js:1676 msgid "Match domain. Support wildcards.
" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1578 +#: htdocs/luci-static/resources/view/fchomo/client.js:1609 msgid "Match geosite." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1636 +#: htdocs/luci-static/resources/view/fchomo/client.js:1667 msgid "Match geosite.
" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1627 +#: htdocs/luci-static/resources/view/fchomo/client.js:1658 msgid "Match response with geoip.
" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1640 +#: htdocs/luci-static/resources/view/fchomo/client.js:1671 msgid "Match response with ipcidr.
" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1583 +#: htdocs/luci-static/resources/view/fchomo/client.js:1614 msgid "Match rule set." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:757 +#: htdocs/luci-static/resources/view/fchomo/node.js:776 msgid "Max Early Data" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:288 -#: htdocs/luci-static/resources/view/fchomo/server.js:194 +#: htdocs/luci-static/resources/view/fchomo/node.js:296 +#: htdocs/luci-static/resources/view/fchomo/server.js:195 msgid "Max UDP relay packet size" msgstr "" @@ -1430,89 +1474,88 @@ msgstr "" msgid "Max count of failures" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:152 -#: htdocs/luci-static/resources/view/fchomo/server.js:128 +#: htdocs/luci-static/resources/view/fchomo/node.js:153 +#: htdocs/luci-static/resources/view/fchomo/server.js:129 msgid "Max download speed" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:314 +#: htdocs/luci-static/resources/view/fchomo/node.js:323 msgid "Max open streams" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:146 -#: htdocs/luci-static/resources/view/fchomo/server.js:122 +#: htdocs/luci-static/resources/view/fchomo/node.js:147 +#: htdocs/luci-static/resources/view/fchomo/server.js:123 msgid "Max upload speed" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:794 -#: htdocs/luci-static/resources/view/fchomo/node.js:810 +#: htdocs/luci-static/resources/view/fchomo/node.js:813 +#: htdocs/luci-static/resources/view/fchomo/node.js:829 msgid "Maximum connections" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:808 +#: htdocs/luci-static/resources/view/fchomo/node.js:827 msgid "" "Maximum multiplexed streams in a connection before opening a new connection." "
Conflict with %s and %s." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:807 +#: htdocs/luci-static/resources/view/fchomo/node.js:826 msgid "Maximum streams" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:152 +#: htdocs/luci-static/resources/fchomo.js:158 msgid "Mieru" msgstr "" #: htdocs/luci-static/resources/view/fchomo/client.js:781 -#: htdocs/luci-static/resources/view/fchomo/log.js:106 -#: htdocs/luci-static/resources/view/fchomo/log.js:111 +#: htdocs/luci-static/resources/view/fchomo/log.js:151 +#: htdocs/luci-static/resources/view/fchomo/log.js:156 msgid "Mihomo client" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/log.js:115 -#: htdocs/luci-static/resources/view/fchomo/log.js:120 +#: htdocs/luci-static/resources/view/fchomo/log.js:160 +#: htdocs/luci-static/resources/view/fchomo/log.js:165 #: htdocs/luci-static/resources/view/fchomo/server.js:24 msgid "Mihomo server" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:353 +#: htdocs/luci-static/resources/view/fchomo/node.js:367 msgid "Min of idle sessions to keep" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:801 +#: htdocs/luci-static/resources/view/fchomo/node.js:820 msgid "" "Minimum multiplexed streams in a connection before opening a new connection." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:800 -#: htdocs/luci-static/resources/view/fchomo/node.js:810 +#: htdocs/luci-static/resources/view/fchomo/node.js:819 +#: htdocs/luci-static/resources/view/fchomo/node.js:829 msgid "Minimum streams" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:120 -#: htdocs/luci-static/resources/view/fchomo/global.js:499 +#: htdocs/luci-static/resources/fchomo.js:126 +#: htdocs/luci-static/resources/view/fchomo/global.js:497 msgid "Mixed" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:499 -#: htdocs/luci-static/resources/view/fchomo/global.js:507 +#: htdocs/luci-static/resources/view/fchomo/global.js:497 msgid "Mixed system TCP stack and gVisor UDP stack." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:457 +#: htdocs/luci-static/resources/view/fchomo/global.js:455 msgid "Mixed port" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:780 +#: htdocs/luci-static/resources/view/fchomo/node.js:799 msgid "Multiplex" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:93 -#: htdocs/luci-static/resources/view/fchomo/server.js:67 +#: htdocs/luci-static/resources/view/fchomo/node.js:94 +#: htdocs/luci-static/resources/view/fchomo/server.js:68 msgid "Multiplex fields" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:222 +#: htdocs/luci-static/resources/view/fchomo/node.js:223 msgid "Multiplexing" msgstr "" @@ -1521,32 +1564,36 @@ msgstr "" msgid "NOT" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1079 +#: htdocs/luci-static/resources/view/fchomo/node.js:1098 msgid "Name of the Proxy group to download provider." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:358 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:366 msgid "Name of the Proxy group to download rule set." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:272 +#: htdocs/luci-static/resources/view/fchomo/node.js:280 msgid "Native" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:445 +#: htdocs/luci-static/resources/fchomo.js:1038 +msgid "Native appearance" +msgstr "" + +#: htdocs/luci-static/resources/view/fchomo/global.js:443 msgid "No Authentication IP ranges" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1355 +#: htdocs/luci-static/resources/view/fchomo/client.js:1380 msgid "No add'l params" msgstr "" #: htdocs/luci-static/resources/view/fchomo/client.js:997 -#: htdocs/luci-static/resources/view/fchomo/node.js:1225 +#: htdocs/luci-static/resources/view/fchomo/node.js:1244 msgid "No testing is performed when this provider node is not in use." msgstr "" -#: htdocs/luci-static/resources/fchomo.js:504 +#: htdocs/luci-static/resources/fchomo.js:519 msgid "No valid %s found." msgstr "" @@ -1561,17 +1608,17 @@ msgid "Node" msgstr "" #: htdocs/luci-static/resources/view/fchomo/client.js:1042 -#: htdocs/luci-static/resources/view/fchomo/node.js:1245 +#: htdocs/luci-static/resources/view/fchomo/node.js:1264 msgid "Node exclude filter" msgstr "" #: htdocs/luci-static/resources/view/fchomo/client.js:1047 -#: htdocs/luci-static/resources/view/fchomo/node.js:1252 +#: htdocs/luci-static/resources/view/fchomo/node.js:1271 msgid "Node exclude type" msgstr "" #: htdocs/luci-static/resources/view/fchomo/client.js:1037 -#: htdocs/luci-static/resources/view/fchomo/node.js:1239 +#: htdocs/luci-static/resources/view/fchomo/node.js:1258 msgid "Node filter" msgstr "" @@ -1579,41 +1626,41 @@ msgstr "" msgid "Node switch tolerance" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:305 +#: htdocs/luci-static/resources/fchomo.js:313 msgid "None" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:614 +#: htdocs/luci-static/resources/view/fchomo/global.js:604 msgid "Not Installed" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:935 +#: htdocs/luci-static/resources/fchomo.js:950 msgid "Not Running" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:485 +#: htdocs/luci-static/resources/view/fchomo/node.js:499 msgid "Obfs Mode" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:164 -#: htdocs/luci-static/resources/view/fchomo/server.js:146 +#: htdocs/luci-static/resources/view/fchomo/node.js:165 +#: htdocs/luci-static/resources/view/fchomo/server.js:147 msgid "Obfuscate password" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:158 -#: htdocs/luci-static/resources/view/fchomo/server.js:140 +#: htdocs/luci-static/resources/view/fchomo/node.js:159 +#: htdocs/luci-static/resources/view/fchomo/server.js:141 msgid "Obfuscate type" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:851 +#: htdocs/luci-static/resources/view/fchomo/global.js:856 msgid "One or more numbers in the range 0-63 separated by commas" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:731 +#: htdocs/luci-static/resources/view/fchomo/global.js:721 msgid "Only process traffic from specific interfaces. Leave empty for all." msgstr "" -#: htdocs/luci-static/resources/fchomo.js:929 +#: htdocs/luci-static/resources/fchomo.js:944 msgid "Open Dashboard" msgstr "" @@ -1621,81 +1668,86 @@ msgstr "" msgid "Operation mode" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1459 -msgid "Override the existing ECS in original request." -msgstr "" - -#: htdocs/luci-static/resources/view/fchomo/global.js:656 -#: htdocs/luci-static/resources/view/fchomo/global.js:694 +#: htdocs/luci-static/resources/view/fchomo/global.js:646 +#: htdocs/luci-static/resources/view/fchomo/global.js:684 msgid "Override destination" msgstr "" #: htdocs/luci-static/resources/view/fchomo/client.js:892 -#: htdocs/luci-static/resources/view/fchomo/node.js:1002 +#: htdocs/luci-static/resources/view/fchomo/node.js:1021 msgid "Override fields" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:255 +#: htdocs/luci-static/resources/view/fchomo/node.js:263 msgid "Override the IP address of the server that DNS response." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1606 +#: htdocs/luci-static/resources/view/fchomo/client.js:1637 msgid "Override the Proxy group of DNS server." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:657 +#: htdocs/luci-static/resources/view/fchomo/global.js:647 msgid "Override the connection destination address with the sniffed domain." msgstr "" +#: htdocs/luci-static/resources/view/fchomo/client.js:1484 +msgid "Override the existing ECS in original request." +msgstr "" + #: htdocs/luci-static/resources/view/fchomo/global.js:160 msgid "Overview" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:726 +#: htdocs/luci-static/resources/view/fchomo/node.js:745 msgid "POST" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:727 +#: htdocs/luci-static/resources/view/fchomo/node.js:746 msgid "PUT" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:402 +#: htdocs/luci-static/resources/view/fchomo/node.js:416 msgid "Packet encoding" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/server.js:238 +#: htdocs/luci-static/resources/view/fchomo/server.js:239 msgid "Padding scheme" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:128 -#: htdocs/luci-static/resources/view/fchomo/node.js:201 -#: htdocs/luci-static/resources/view/fchomo/node.js:500 -#: htdocs/luci-static/resources/view/fchomo/server.js:113 -#: htdocs/luci-static/resources/view/fchomo/server.js:169 -#: htdocs/luci-static/resources/view/fchomo/server.js:278 +#: htdocs/luci-static/resources/fchomo.js:1244 +msgid "Paddings" +msgstr "" + +#: htdocs/luci-static/resources/view/fchomo/node.js:129 +#: htdocs/luci-static/resources/view/fchomo/node.js:202 +#: htdocs/luci-static/resources/view/fchomo/node.js:514 +#: htdocs/luci-static/resources/view/fchomo/server.js:114 +#: htdocs/luci-static/resources/view/fchomo/server.js:170 +#: htdocs/luci-static/resources/view/fchomo/server.js:279 msgid "Password" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1054 -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:333 +#: htdocs/luci-static/resources/fchomo.js:1183 +#: htdocs/luci-static/resources/view/fchomo/node.js:1073 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:341 msgid "Payload" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:431 +#: htdocs/luci-static/resources/view/fchomo/node.js:445 msgid "Peer pubkic key" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:532 +#: htdocs/luci-static/resources/view/fchomo/global.js:520 msgid "" "Performance may degrade slightly, so it is not recommended to enable on when " "it is not needed." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:278 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:286 msgid "Plain text" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:828 +#: htdocs/luci-static/resources/view/fchomo/global.js:833 msgid "" "Please ensure that the DNS query of the domains to be processed in the DNS " "policy
are send via DIRECT/Proxy Node in the same semantics as Routing " @@ -1708,10 +1760,10 @@ msgid "" "standards." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1039 -#: htdocs/luci-static/resources/view/fchomo/node.js:1053 -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:318 -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:332 +#: htdocs/luci-static/resources/view/fchomo/node.js:1058 +#: htdocs/luci-static/resources/view/fchomo/node.js:1072 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:326 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:340 msgid "" "Please type %s." @@ -1719,83 +1771,84 @@ msgstr "" #: htdocs/luci-static/resources/view/fchomo/client.js:827 #: htdocs/luci-static/resources/view/fchomo/client.js:1083 -#: htdocs/luci-static/resources/view/fchomo/client.js:1184 -#: htdocs/luci-static/resources/view/fchomo/client.js:1306 -#: htdocs/luci-static/resources/view/fchomo/client.js:1527 -#: htdocs/luci-static/resources/view/fchomo/node.js:904 +#: htdocs/luci-static/resources/view/fchomo/client.js:1193 +#: htdocs/luci-static/resources/view/fchomo/client.js:1315 +#: htdocs/luci-static/resources/view/fchomo/client.js:1552 +#: htdocs/luci-static/resources/view/fchomo/node.js:923 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:143 msgid "Please type %s fields of mihomo config.
" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:475 -#: htdocs/luci-static/resources/view/fchomo/server.js:265 +#: htdocs/luci-static/resources/view/fchomo/node.js:489 +#: htdocs/luci-static/resources/view/fchomo/server.js:266 msgid "Plugin" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:485 -#: htdocs/luci-static/resources/view/fchomo/node.js:492 -#: htdocs/luci-static/resources/view/fchomo/node.js:500 +#: htdocs/luci-static/resources/view/fchomo/node.js:499 #: htdocs/luci-static/resources/view/fchomo/node.js:506 #: htdocs/luci-static/resources/view/fchomo/node.js:514 #: htdocs/luci-static/resources/view/fchomo/node.js:520 -#: htdocs/luci-static/resources/view/fchomo/server.js:271 -#: htdocs/luci-static/resources/view/fchomo/server.js:278 -#: htdocs/luci-static/resources/view/fchomo/server.js:284 +#: htdocs/luci-static/resources/view/fchomo/node.js:528 +#: htdocs/luci-static/resources/view/fchomo/node.js:534 +#: htdocs/luci-static/resources/view/fchomo/server.js:272 +#: htdocs/luci-static/resources/view/fchomo/server.js:279 +#: htdocs/luci-static/resources/view/fchomo/server.js:285 msgid "Plugin:" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:116 +#: htdocs/luci-static/resources/view/fchomo/node.js:117 msgid "Port" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1159 +#: htdocs/luci-static/resources/fchomo.js:1563 msgid "Port %s alrealy exists!" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:211 -msgid "Port range" -msgstr "" - -#: htdocs/luci-static/resources/view/fchomo/global.js:691 +#: htdocs/luci-static/resources/view/fchomo/global.js:681 msgid "Ports" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:141 -#: htdocs/luci-static/resources/view/fchomo/server.js:96 +#: htdocs/luci-static/resources/view/fchomo/node.js:142 +#: htdocs/luci-static/resources/view/fchomo/server.js:97 msgid "Ports pool" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:232 -#: htdocs/luci-static/resources/view/fchomo/node.js:438 +#: htdocs/luci-static/resources/view/fchomo/node.js:240 +#: htdocs/luci-static/resources/view/fchomo/node.js:452 msgid "Pre-shared key" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:136 +#: htdocs/luci-static/resources/fchomo.js:142 msgid "Prefer IPv4" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:137 +#: htdocs/luci-static/resources/fchomo.js:143 msgid "Prefer IPv6" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:737 -#: htdocs/luci-static/resources/view/fchomo/global.js:754 -#: htdocs/luci-static/resources/view/fchomo/node.js:868 -#: htdocs/luci-static/resources/view/fchomo/node.js:874 -#: htdocs/luci-static/resources/view/fchomo/node.js:1174 -#: htdocs/luci-static/resources/view/fchomo/node.js:1181 +#: htdocs/luci-static/resources/view/fchomo/global.js:524 +msgid "" +"Prevent ICMP loopback issues in some cases. Ping will not show real delay." +msgstr "" + +#: htdocs/luci-static/resources/view/fchomo/global.js:727 +#: htdocs/luci-static/resources/view/fchomo/global.js:744 +#: htdocs/luci-static/resources/view/fchomo/node.js:887 +#: htdocs/luci-static/resources/view/fchomo/node.js:893 +#: htdocs/luci-static/resources/view/fchomo/node.js:1193 +#: htdocs/luci-static/resources/view/fchomo/node.js:1200 msgid "Priority: Proxy Node > Global." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:173 +#: htdocs/luci-static/resources/view/fchomo/node.js:174 msgid "Priv-key" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:177 +#: htdocs/luci-static/resources/view/fchomo/node.js:178 msgid "Priv-key passphrase" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:423 +#: htdocs/luci-static/resources/view/fchomo/node.js:437 msgid "Private key" msgstr "" @@ -1803,29 +1856,29 @@ msgstr "" msgid "Process matching mode" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:685 -#: htdocs/luci-static/resources/view/fchomo/node.js:786 +#: htdocs/luci-static/resources/view/fchomo/global.js:675 +#: htdocs/luci-static/resources/view/fchomo/node.js:805 msgid "Protocol" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:397 +#: htdocs/luci-static/resources/view/fchomo/node.js:411 msgid "Protocol parameter. Enable length block encryption." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:391 +#: htdocs/luci-static/resources/view/fchomo/node.js:405 msgid "" "Protocol parameter. Will waste traffic randomly if enabled (enabled by " "default in v2ray and cannot be disabled)." msgstr "" #: htdocs/luci-static/resources/view/fchomo/client.js:937 -#: htdocs/luci-static/resources/view/fchomo/node.js:887 -#: htdocs/luci-static/resources/view/fchomo/node.js:896 -#: htdocs/luci-static/resources/view/fchomo/node.js:1290 +#: htdocs/luci-static/resources/view/fchomo/node.js:906 +#: htdocs/luci-static/resources/view/fchomo/node.js:915 +#: htdocs/luci-static/resources/view/fchomo/node.js:1309 msgid "Provider" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1060 +#: htdocs/luci-static/resources/view/fchomo/node.js:1079 msgid "Provider URL" msgstr "" @@ -1834,53 +1887,53 @@ msgstr "" msgid "Proxy Group" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:787 +#: htdocs/luci-static/resources/view/fchomo/global.js:777 msgid "Proxy IPv4 IP-s" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:790 +#: htdocs/luci-static/resources/view/fchomo/global.js:780 msgid "Proxy IPv6 IP-s" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:793 +#: htdocs/luci-static/resources/view/fchomo/global.js:783 msgid "Proxy MAC-s" msgstr "" #: htdocs/luci-static/resources/view/fchomo/node.js:76 -#: htdocs/luci-static/resources/view/fchomo/node.js:1289 +#: htdocs/luci-static/resources/view/fchomo/node.js:1308 msgid "Proxy Node" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1265 -#: htdocs/luci-static/resources/view/fchomo/node.js:1274 +#: htdocs/luci-static/resources/view/fchomo/node.js:1284 +#: htdocs/luci-static/resources/view/fchomo/node.js:1293 msgid "Proxy chain" msgstr "" #: htdocs/luci-static/resources/view/fchomo/client.js:713 -#: htdocs/luci-static/resources/view/fchomo/client.js:1390 -#: htdocs/luci-static/resources/view/fchomo/node.js:1078 -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:357 +#: htdocs/luci-static/resources/view/fchomo/client.js:1415 +#: htdocs/luci-static/resources/view/fchomo/node.js:1097 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:365 msgid "Proxy group" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1605 +#: htdocs/luci-static/resources/view/fchomo/client.js:1636 msgid "Proxy group override" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:478 +#: htdocs/luci-static/resources/view/fchomo/global.js:476 msgid "Proxy mode" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:796 +#: htdocs/luci-static/resources/view/fchomo/global.js:786 msgid "Proxy routerself" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:273 +#: htdocs/luci-static/resources/view/fchomo/node.js:281 msgid "QUIC" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:261 -#: htdocs/luci-static/resources/view/fchomo/server.js:186 +#: htdocs/luci-static/resources/view/fchomo/node.js:269 +#: htdocs/luci-static/resources/view/fchomo/server.js:187 msgid "QUIC congestion controller." msgstr "" @@ -1889,67 +1942,76 @@ msgstr "" msgid "Quick Reload" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:659 -#: htdocs/luci-static/resources/view/fchomo/server.js:411 +#: htdocs/luci-static/resources/view/fchomo/node.js:678 +#: htdocs/luci-static/resources/view/fchomo/server.js:422 msgid "REALITY" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:674 +#: htdocs/luci-static/resources/view/fchomo/node.js:693 msgid "REALITY X25519MLKEM768 PQC support" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/server.js:447 +#: htdocs/luci-static/resources/view/fchomo/server.js:459 msgid "REALITY certificate issued to" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/server.js:416 +#: htdocs/luci-static/resources/view/fchomo/server.js:427 msgid "REALITY handshake server" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/server.js:423 +#: htdocs/luci-static/resources/view/fchomo/server.js:434 msgid "REALITY private key" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:664 -#: htdocs/luci-static/resources/view/fchomo/server.js:437 +#: htdocs/luci-static/resources/view/fchomo/node.js:683 +#: htdocs/luci-static/resources/view/fchomo/server.js:449 msgid "REALITY public key" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:669 -#: htdocs/luci-static/resources/view/fchomo/server.js:441 +#: htdocs/luci-static/resources/view/fchomo/node.js:688 +#: htdocs/luci-static/resources/view/fchomo/server.js:453 msgid "REALITY short ID" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:645 +#: htdocs/luci-static/resources/fchomo.js:1218 +#: htdocs/luci-static/resources/fchomo.js:1235 +msgid "RTT" +msgstr "" + +#: htdocs/luci-static/resources/view/fchomo/global.js:635 msgid "Random will be used if empty." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1323 -#: htdocs/luci-static/resources/view/fchomo/node.js:1345 +#: htdocs/luci-static/resources/fchomo.js:1040 +msgid "Randomized traffic characteristics" +msgstr "" + +#: htdocs/luci-static/resources/view/fchomo/node.js:1342 +#: htdocs/luci-static/resources/view/fchomo/node.js:1364 msgid "Recommended to use UoT node.
such as %s." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:462 +#: htdocs/luci-static/resources/view/fchomo/global.js:460 msgid "Redir port" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:479 +#: htdocs/luci-static/resources/view/fchomo/global.js:477 msgid "Redirect TCP" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:481 +#: htdocs/luci-static/resources/view/fchomo/global.js:479 msgid "Redirect TCP + TProxy UDP" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:483 +#: htdocs/luci-static/resources/view/fchomo/global.js:481 msgid "Redirect TCP + Tun UDP" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/log.js:81 +#: htdocs/luci-static/resources/view/fchomo/log.js:126 msgid "Refresh every %s seconds." msgstr "" -#: htdocs/luci-static/resources/fchomo.js:922 +#: htdocs/luci-static/resources/fchomo.js:937 #: htdocs/luci-static/resources/view/fchomo/client.js:805 #: htdocs/luci-static/resources/view/fchomo/global.js:193 #: htdocs/luci-static/resources/view/fchomo/server.js:46 @@ -1960,50 +2022,51 @@ msgstr "" msgid "Reload All" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1017 -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:259 +#: htdocs/luci-static/resources/view/fchomo/node.js:1036 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:267 msgid "Remote" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:463 +#: htdocs/luci-static/resources/view/fchomo/node.js:477 msgid "Remote DNS resolve" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1080 +#: htdocs/luci-static/resources/fchomo.js:1462 msgid "Remove" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1085 -#: htdocs/luci-static/resources/view/fchomo/node.js:993 -#: htdocs/luci-static/resources/view/fchomo/node.js:995 +#: htdocs/luci-static/resources/fchomo.js:1467 +#: htdocs/luci-static/resources/view/fchomo/node.js:1012 +#: htdocs/luci-static/resources/view/fchomo/node.js:1014 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:240 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:242 msgid "Remove idles" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1107 +#: htdocs/luci-static/resources/view/fchomo/node.js:1126 msgid "Replace name" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1108 +#: htdocs/luci-static/resources/view/fchomo/node.js:1127 msgid "Replace node name." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:733 -#: htdocs/luci-static/resources/view/fchomo/node.js:740 -#: htdocs/luci-static/resources/view/fchomo/server.js:489 +#: htdocs/luci-static/resources/view/fchomo/node.js:752 +#: htdocs/luci-static/resources/view/fchomo/node.js:759 +#: htdocs/luci-static/resources/view/fchomo/server.js:501 msgid "Request path" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:308 +#: htdocs/luci-static/resources/view/fchomo/node.js:316 msgid "Request timeout" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:675 +#: htdocs/luci-static/resources/fchomo.js:1048 +#: htdocs/luci-static/resources/view/fchomo/node.js:694 msgid "Requires server support." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:452 +#: htdocs/luci-static/resources/view/fchomo/node.js:466 msgid "Reserved field bytes" msgstr "" @@ -2011,7 +2074,7 @@ msgstr "" msgid "Resources management" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:520 +#: htdocs/luci-static/resources/view/fchomo/node.js:534 msgid "Restls script" msgstr "" @@ -2025,39 +2088,39 @@ msgid "" "Returns the string input for icon in the API to display in this proxy group." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:800 +#: htdocs/luci-static/resources/view/fchomo/global.js:805 msgid "Routing Control" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:840 -#: htdocs/luci-static/resources/view/fchomo/global.js:843 +#: htdocs/luci-static/resources/view/fchomo/global.js:845 +#: htdocs/luci-static/resources/view/fchomo/global.js:848 msgid "Routing DSCP" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:824 +#: htdocs/luci-static/resources/view/fchomo/global.js:829 msgid "Routing GFW" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:753 -#: htdocs/luci-static/resources/view/fchomo/node.js:873 -#: htdocs/luci-static/resources/view/fchomo/node.js:1180 +#: htdocs/luci-static/resources/view/fchomo/global.js:743 +#: htdocs/luci-static/resources/view/fchomo/node.js:892 +#: htdocs/luci-static/resources/view/fchomo/node.js:1199 msgid "Routing mark" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:820 +#: htdocs/luci-static/resources/view/fchomo/global.js:825 msgid "Routing mode" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:821 +#: htdocs/luci-static/resources/view/fchomo/global.js:826 msgid "Routing mode of the traffic enters mihomo via firewall rules." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:827 +#: htdocs/luci-static/resources/view/fchomo/global.js:832 msgid "Routing mode will be handle domain." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:802 -#: htdocs/luci-static/resources/view/fchomo/global.js:811 +#: htdocs/luci-static/resources/view/fchomo/global.js:807 +#: htdocs/luci-static/resources/view/fchomo/global.js:816 msgid "Routing ports" msgstr "" @@ -2066,11 +2129,11 @@ msgstr "" msgid "Routing rule" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:747 +#: htdocs/luci-static/resources/view/fchomo/global.js:737 msgid "Routing rule priority" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:741 +#: htdocs/luci-static/resources/view/fchomo/global.js:731 msgid "Routing table ID" msgstr "" @@ -2078,13 +2141,13 @@ msgstr "" msgid "Rule" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1569 -#: htdocs/luci-static/resources/view/fchomo/client.js:1582 +#: htdocs/luci-static/resources/view/fchomo/client.js:1600 +#: htdocs/luci-static/resources/view/fchomo/client.js:1613 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:135 msgid "Rule set" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:339 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:347 msgid "Rule set URL" msgstr "" @@ -2096,69 +2159,79 @@ msgstr "" msgid "Ruleset-URI-Scheme" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:935 +#: htdocs/luci-static/resources/fchomo.js:950 msgid "Running" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:119 +#: htdocs/luci-static/resources/fchomo.js:125 msgid "SOCKS" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:149 +#: htdocs/luci-static/resources/fchomo.js:155 msgid "SOCKS5" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:162 +#: htdocs/luci-static/resources/fchomo.js:168 msgid "SSH" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:196 +#: htdocs/luci-static/resources/fchomo.js:204 msgid "STUN ports" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1141 +#: htdocs/luci-static/resources/view/fchomo/client.js:1149 msgid "SUB-RULE" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:538 +#: htdocs/luci-static/resources/view/fchomo/node.js:552 msgid "SUoT version" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:160 -#: htdocs/luci-static/resources/view/fchomo/server.js:142 +#: htdocs/luci-static/resources/view/fchomo/node.js:161 +#: htdocs/luci-static/resources/view/fchomo/server.js:143 msgid "Salamander" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:142 +#: htdocs/luci-static/resources/fchomo.js:148 msgid "Same dstaddr requests. Same node" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:143 +#: htdocs/luci-static/resources/fchomo.js:149 msgid "Same srcaddr and dstaddr requests. Same node" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:521 +#: htdocs/luci-static/resources/view/fchomo/global.js:509 msgid "Segment maximum size" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:185 +#: htdocs/luci-static/resources/fchomo.js:193 msgid "Select" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:606 +#: htdocs/luci-static/resources/view/fchomo/global.js:596 msgid "Select Dashboard" msgstr "" +#: htdocs/luci-static/resources/fchomo.js:1054 +msgid "Send padding randomly 0-3333 bytes with 50% probability." +msgstr "" + +#: htdocs/luci-static/resources/fchomo.js:1043 +#: htdocs/luci-static/resources/fchomo.js:1044 +msgid "Send random ticket of 300s-600s duration for client 0-RTT reuse." +msgstr "" + +#: htdocs/luci-static/resources/fchomo.js:1218 #: htdocs/luci-static/resources/view/fchomo/server.js:59 #: root/usr/share/luci/menu.d/luci-app-fchomo.json:54 msgid "Server" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:111 +#: htdocs/luci-static/resources/view/fchomo/node.js:112 msgid "Server address" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:718 +#: htdocs/luci-static/resources/view/fchomo/node.js:737 msgid "Server hostname" msgstr "" @@ -2170,93 +2243,93 @@ msgstr "" msgid "Service status" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:121 -#: htdocs/luci-static/resources/fchomo.js:150 +#: htdocs/luci-static/resources/fchomo.js:127 +#: htdocs/luci-static/resources/fchomo.js:156 msgid "Shadowsocks" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:321 -#: htdocs/luci-static/resources/view/fchomo/server.js:220 +#: htdocs/luci-static/resources/view/fchomo/node.js:335 +#: htdocs/luci-static/resources/view/fchomo/server.js:221 msgid "Shadowsocks chipher" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:316 -#: htdocs/luci-static/resources/view/fchomo/server.js:215 +#: htdocs/luci-static/resources/view/fchomo/node.js:330 +#: htdocs/luci-static/resources/view/fchomo/server.js:216 msgid "Shadowsocks encrypt" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:329 -#: htdocs/luci-static/resources/view/fchomo/server.js:228 +#: htdocs/luci-static/resources/view/fchomo/node.js:343 +#: htdocs/luci-static/resources/view/fchomo/server.js:229 msgid "Shadowsocks password" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:828 +#: htdocs/luci-static/resources/view/fchomo/node.js:847 msgid "Show connections in the dashboard for breaking connections easier." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:407 +#: htdocs/luci-static/resources/fchomo.js:68 msgid "Silent" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:141 +#: htdocs/luci-static/resources/fchomo.js:147 msgid "Simple round-robin all nodes" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1066 -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:345 +#: htdocs/luci-static/resources/view/fchomo/node.js:1085 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:353 msgid "Size limit" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1423 -#: htdocs/luci-static/resources/view/fchomo/node.js:629 -#: htdocs/luci-static/resources/view/fchomo/node.js:1158 +#: htdocs/luci-static/resources/view/fchomo/client.js:1448 +#: htdocs/luci-static/resources/view/fchomo/node.js:648 +#: htdocs/luci-static/resources/view/fchomo/node.js:1177 msgid "Skip cert verify" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:663 +#: htdocs/luci-static/resources/view/fchomo/global.js:653 msgid "Skiped sniffing domain" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:669 +#: htdocs/luci-static/resources/view/fchomo/global.js:659 msgid "Skiped sniffing dst address" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:666 +#: htdocs/luci-static/resources/view/fchomo/global.js:656 msgid "Skiped sniffing src address" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:153 +#: htdocs/luci-static/resources/fchomo.js:159 msgid "Snell" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:673 +#: htdocs/luci-static/resources/view/fchomo/global.js:663 msgid "Sniff protocol" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:650 +#: htdocs/luci-static/resources/view/fchomo/global.js:640 msgid "Sniffer" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:653 +#: htdocs/luci-static/resources/view/fchomo/global.js:643 msgid "Sniffer settings" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:803 -#: htdocs/luci-static/resources/view/fchomo/global.js:812 +#: htdocs/luci-static/resources/view/fchomo/global.js:808 +#: htdocs/luci-static/resources/view/fchomo/global.js:817 msgid "" "Specify target ports to be proxied. Multiple ports must be separated by " "commas." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:494 +#: htdocs/luci-static/resources/view/fchomo/global.js:492 msgid "Stack" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:199 +#: htdocs/luci-static/resources/fchomo.js:207 msgid "Steam Client ports" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:200 +#: htdocs/luci-static/resources/fchomo.js:208 msgid "Steam P2P ports" msgstr "" @@ -2265,16 +2338,16 @@ msgstr "" msgid "Strategy" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1167 #: htdocs/luci-static/resources/view/fchomo/client.js:1176 +#: htdocs/luci-static/resources/view/fchomo/client.js:1185 msgid "Sub rule" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1226 +#: htdocs/luci-static/resources/view/fchomo/client.js:1235 msgid "Sub rule group" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:507 +#: htdocs/luci-static/resources/fchomo.js:522 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:211 msgid "Successfully imported %s %s of total %s." msgstr "" @@ -2283,7 +2356,7 @@ msgstr "" msgid "Successfully updated." msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1382 +#: htdocs/luci-static/resources/fchomo.js:1786 msgid "Successfully uploaded." msgstr "" @@ -2293,7 +2366,7 @@ msgid "" "
" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:496 +#: htdocs/luci-static/resources/view/fchomo/global.js:494 msgid "System" msgstr "" @@ -2306,68 +2379,68 @@ msgstr "" msgid "TCP" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:423 +#: htdocs/luci-static/resources/view/fchomo/global.js:421 msgid "TCP concurrency" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:821 +#: htdocs/luci-static/resources/view/fchomo/node.js:840 msgid "TCP only" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:431 +#: htdocs/luci-static/resources/view/fchomo/global.js:429 msgid "TCP-Keep-Alive idle timeout" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:426 +#: htdocs/luci-static/resources/view/fchomo/global.js:424 msgid "TCP-Keep-Alive interval" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:852 -#: htdocs/luci-static/resources/view/fchomo/node.js:1125 +#: htdocs/luci-static/resources/view/fchomo/node.js:871 +#: htdocs/luci-static/resources/view/fchomo/node.js:1144 msgid "TFO" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:537 -#: htdocs/luci-static/resources/view/fchomo/node.js:487 -#: htdocs/luci-static/resources/view/fchomo/node.js:546 -#: htdocs/luci-static/resources/view/fchomo/server.js:299 +#: htdocs/luci-static/resources/view/fchomo/global.js:525 +#: htdocs/luci-static/resources/view/fchomo/node.js:501 +#: htdocs/luci-static/resources/view/fchomo/node.js:565 +#: htdocs/luci-static/resources/view/fchomo/server.js:308 msgid "TLS" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:577 -#: htdocs/luci-static/resources/view/fchomo/server.js:330 +#: htdocs/luci-static/resources/view/fchomo/node.js:596 +#: htdocs/luci-static/resources/view/fchomo/server.js:339 msgid "TLS ALPN" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:571 +#: htdocs/luci-static/resources/view/fchomo/node.js:590 msgid "TLS SNI" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:91 -#: htdocs/luci-static/resources/view/fchomo/server.js:65 +#: htdocs/luci-static/resources/view/fchomo/node.js:92 +#: htdocs/luci-static/resources/view/fchomo/server.js:66 msgid "TLS fields" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:126 -#: htdocs/luci-static/resources/fchomo.js:160 +#: htdocs/luci-static/resources/fchomo.js:132 +#: htdocs/luci-static/resources/fchomo.js:166 msgid "TUIC" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:197 +#: htdocs/luci-static/resources/fchomo.js:205 msgid "TURN ports" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/server.js:135 +#: htdocs/luci-static/resources/view/fchomo/server.js:136 msgid "" "Tell the client to use the BBR flow control algorithm instead of Hysteria CC." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:411 -#: htdocs/luci-static/resources/view/fchomo/node.js:418 +#: htdocs/luci-static/resources/view/fchomo/node.js:425 +#: htdocs/luci-static/resources/view/fchomo/node.js:432 msgid "The %s address used by local machine in the Wireguard network." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:644 +#: htdocs/luci-static/resources/view/fchomo/node.js:663 msgid "" "The ECH parameter of the HTTPS record for the domain. Leave empty to resolve " "via DNS." @@ -2377,38 +2450,47 @@ msgstr "" msgid "The default value is 2:00 every day." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1628 +#: htdocs/luci-static/resources/fchomo.js:1247 +msgid "" +"The first padding must have a probability of 100% and at least 35 bytes." +msgstr "" + +#: htdocs/luci-static/resources/view/fchomo/client.js:1659 msgid "The matching %s will be deemed as not-poisoned." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1637 -#: htdocs/luci-static/resources/view/fchomo/client.js:1641 -#: htdocs/luci-static/resources/view/fchomo/client.js:1646 +#: htdocs/luci-static/resources/view/fchomo/client.js:1668 +#: htdocs/luci-static/resources/view/fchomo/client.js:1672 +#: htdocs/luci-static/resources/view/fchomo/client.js:1677 msgid "The matching %s will be deemed as poisoned." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/server.js:351 +#: htdocs/luci-static/resources/fchomo.js:1245 +msgid "The server and client can set different padding parameters." +msgstr "" + +#: htdocs/luci-static/resources/view/fchomo/server.js:360 msgid "The server private key, in PEM format." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/server.js:336 +#: htdocs/luci-static/resources/view/fchomo/server.js:345 msgid "The server public key, in PEM format." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:595 -#: htdocs/luci-static/resources/view/fchomo/server.js:405 +#: htdocs/luci-static/resources/view/fchomo/global.js:585 +#: htdocs/luci-static/resources/view/fchomo/server.js:416 msgid "This ECH parameter needs to be added to the HTTPS record of the domain." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1426 -#: htdocs/luci-static/resources/view/fchomo/node.js:632 -#: htdocs/luci-static/resources/view/fchomo/node.js:1161 +#: htdocs/luci-static/resources/view/fchomo/client.js:1451 +#: htdocs/luci-static/resources/view/fchomo/node.js:651 +#: htdocs/luci-static/resources/view/fchomo/node.js:1180 msgid "" "This is DANGEROUS, your traffic is almost like " "PLAIN TEXT! Use at your own risk!" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:278 +#: htdocs/luci-static/resources/view/fchomo/node.js:286 msgid "" "This is the TUIC port of the SUoT protocol, designed to provide a QUIC " "stream based UDP relay mode that TUIC does not provide." @@ -2419,37 +2501,37 @@ msgid "" "To check NAT Behavior you need to install
%s first" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:486 +#: htdocs/luci-static/resources/view/fchomo/global.js:484 msgid "" "To enable Tun support, you need to install ip-full and " "kmod-tun" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:832 +#: htdocs/luci-static/resources/view/fchomo/global.js:837 msgid "To enable, you need to install dnsmasq-full." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:760 +#: htdocs/luci-static/resources/view/fchomo/global.js:750 msgid "Tproxy Fwmark" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:467 +#: htdocs/luci-static/resources/view/fchomo/global.js:465 msgid "Tproxy port" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:216 -#: htdocs/luci-static/resources/view/fchomo/node.js:681 -#: htdocs/luci-static/resources/view/fchomo/server.js:455 +#: htdocs/luci-static/resources/view/fchomo/node.js:217 +#: htdocs/luci-static/resources/view/fchomo/node.js:700 +#: htdocs/luci-static/resources/view/fchomo/server.js:467 msgid "Transport" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:92 -#: htdocs/luci-static/resources/view/fchomo/server.js:66 +#: htdocs/luci-static/resources/view/fchomo/node.js:93 +#: htdocs/luci-static/resources/view/fchomo/server.js:67 msgid "Transport fields" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:686 -#: htdocs/luci-static/resources/view/fchomo/server.js:460 +#: htdocs/luci-static/resources/view/fchomo/node.js:705 +#: htdocs/luci-static/resources/view/fchomo/server.js:472 msgid "Transport type" msgstr "" @@ -2457,24 +2539,24 @@ msgstr "" msgid "Treat the destination IP as the source IP." msgstr "" -#: htdocs/luci-static/resources/fchomo.js:124 -#: htdocs/luci-static/resources/fchomo.js:156 +#: htdocs/luci-static/resources/fchomo.js:130 +#: htdocs/luci-static/resources/fchomo.js:162 msgid "Trojan" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:765 +#: htdocs/luci-static/resources/view/fchomo/global.js:755 msgid "Tun Fwmark" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:484 +#: htdocs/luci-static/resources/view/fchomo/global.js:482 msgid "Tun TCP/UDP" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:491 +#: htdocs/luci-static/resources/view/fchomo/global.js:489 msgid "Tun settings" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:495 +#: htdocs/luci-static/resources/view/fchomo/global.js:493 msgid "Tun stack." msgstr "" @@ -2482,55 +2564,55 @@ msgstr "" #: htdocs/luci-static/resources/view/fchomo/client.js:571 #: htdocs/luci-static/resources/view/fchomo/client.js:665 #: htdocs/luci-static/resources/view/fchomo/client.js:910 -#: htdocs/luci-static/resources/view/fchomo/client.js:1566 -#: htdocs/luci-static/resources/view/fchomo/node.js:105 -#: htdocs/luci-static/resources/view/fchomo/node.js:1015 -#: htdocs/luci-static/resources/view/fchomo/node.js:1288 -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:257 -#: htdocs/luci-static/resources/view/fchomo/server.js:85 +#: htdocs/luci-static/resources/view/fchomo/client.js:1597 +#: htdocs/luci-static/resources/view/fchomo/node.js:106 +#: htdocs/luci-static/resources/view/fchomo/node.js:1034 +#: htdocs/luci-static/resources/view/fchomo/node.js:1307 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:265 +#: htdocs/luci-static/resources/view/fchomo/server.js:86 msgid "Type" msgstr "" #: htdocs/luci-static/resources/view/fchomo/client.js:516 #: htdocs/luci-static/resources/view/fchomo/client.js:606 -#: htdocs/luci-static/resources/view/fchomo/node.js:527 -#: htdocs/luci-static/resources/view/fchomo/node.js:1135 -#: htdocs/luci-static/resources/view/fchomo/server.js:293 +#: htdocs/luci-static/resources/view/fchomo/node.js:541 +#: htdocs/luci-static/resources/view/fchomo/node.js:1154 +#: htdocs/luci-static/resources/view/fchomo/server.js:294 msgid "UDP" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:525 +#: htdocs/luci-static/resources/view/fchomo/global.js:513 msgid "UDP NAT expiration time" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:277 +#: htdocs/luci-static/resources/view/fchomo/node.js:285 msgid "UDP over stream" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:283 +#: htdocs/luci-static/resources/view/fchomo/node.js:291 msgid "UDP over stream version" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:270 +#: htdocs/luci-static/resources/view/fchomo/node.js:278 msgid "UDP packet relay mode." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:269 +#: htdocs/luci-static/resources/view/fchomo/node.js:277 msgid "UDP relay mode" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:187 +#: htdocs/luci-static/resources/fchomo.js:195 msgid "URL test" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:248 -#: htdocs/luci-static/resources/view/fchomo/node.js:360 -#: htdocs/luci-static/resources/view/fchomo/server.js:179 -#: htdocs/luci-static/resources/view/fchomo/server.js:243 +#: htdocs/luci-static/resources/view/fchomo/node.js:256 +#: htdocs/luci-static/resources/view/fchomo/node.js:374 +#: htdocs/luci-static/resources/view/fchomo/server.js:180 +#: htdocs/luci-static/resources/view/fchomo/server.js:244 msgid "UUID" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:980 +#: htdocs/luci-static/resources/fchomo.js:995 msgid "Unable to download unsupported type: %s" msgstr "" @@ -2538,7 +2620,7 @@ msgstr "" msgid "Unable to save contents: %s" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:420 +#: htdocs/luci-static/resources/view/fchomo/global.js:418 msgid "Unified delay" msgstr "" @@ -2551,12 +2633,12 @@ msgstr "" msgid "Unknown error." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/log.js:58 +#: htdocs/luci-static/resources/view/fchomo/log.js:102 msgid "Unknown error: %s" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:532 -#: htdocs/luci-static/resources/view/fchomo/node.js:1140 +#: htdocs/luci-static/resources/view/fchomo/node.js:546 +#: htdocs/luci-static/resources/view/fchomo/node.js:1159 msgid "UoT" msgstr "" @@ -2564,20 +2646,20 @@ msgstr "" msgid "Update failed." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1072 -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:351 +#: htdocs/luci-static/resources/view/fchomo/node.js:1091 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:359 msgid "Update interval" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:839 +#: htdocs/luci-static/resources/view/fchomo/node.js:858 msgid "Upload bandwidth" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:840 +#: htdocs/luci-static/resources/view/fchomo/node.js:859 msgid "Upload bandwidth in Mbps." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/server.js:342 +#: htdocs/luci-static/resources/view/fchomo/server.js:351 msgid "Upload certificate" msgstr "" @@ -2585,85 +2667,94 @@ msgstr "" msgid "Upload initial package" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/server.js:357 +#: htdocs/luci-static/resources/view/fchomo/server.js:366 msgid "Upload key" msgstr "" #: htdocs/luci-static/resources/view/fchomo/global.js:306 -#: htdocs/luci-static/resources/view/fchomo/server.js:345 -#: htdocs/luci-static/resources/view/fchomo/server.js:360 +#: htdocs/luci-static/resources/view/fchomo/server.js:354 +#: htdocs/luci-static/resources/view/fchomo/server.js:369 msgid "Upload..." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1251 +#: htdocs/luci-static/resources/view/fchomo/client.js:1260 msgid "Used to resolve the domain of the DNS server. Must be IP." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1258 +#: htdocs/luci-static/resources/view/fchomo/client.js:1267 msgid "Used to resolve the domain of the Proxy node." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:572 +#: htdocs/luci-static/resources/view/fchomo/node.js:591 msgid "Used to verify the hostname on the returned certificates." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:440 +#: htdocs/luci-static/resources/view/fchomo/global.js:438 msgid "User Authentication" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:123 -#: htdocs/luci-static/resources/view/fchomo/server.js:108 +#: htdocs/luci-static/resources/view/fchomo/node.js:124 +#: htdocs/luci-static/resources/view/fchomo/server.js:109 msgid "Username" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:773 +#: htdocs/luci-static/resources/view/fchomo/global.js:763 msgid "Users filter mode" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:769 +#: htdocs/luci-static/resources/view/fchomo/node.js:788 msgid "V2ray HTTPUpgrade" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:774 +#: htdocs/luci-static/resources/view/fchomo/node.js:793 msgid "V2ray HTTPUpgrade fast open" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:123 -#: htdocs/luci-static/resources/fchomo.js:155 +#: htdocs/luci-static/resources/fchomo.js:129 +#: htdocs/luci-static/resources/fchomo.js:161 msgid "VLESS" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:122 -#: htdocs/luci-static/resources/fchomo.js:154 +#: htdocs/luci-static/resources/fchomo.js:128 +#: htdocs/luci-static/resources/fchomo.js:160 msgid "VMess" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1021 -#: htdocs/luci-static/resources/view/fchomo/node.js:1294 -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:300 +#: htdocs/luci-static/resources/view/fchomo/node.js:1040 +#: htdocs/luci-static/resources/view/fchomo/node.js:1313 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:308 msgid "Value" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:239 -#: htdocs/luci-static/resources/view/fchomo/node.js:506 -#: htdocs/luci-static/resources/view/fchomo/server.js:284 +#: htdocs/luci-static/resources/view/fchomo/node.js:247 +#: htdocs/luci-static/resources/view/fchomo/node.js:520 +#: htdocs/luci-static/resources/view/fchomo/server.js:285 msgid "Version" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:514 +#: htdocs/luci-static/resources/view/fchomo/node.js:528 msgid "Version hint" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:409 +#: htdocs/luci-static/resources/view/fchomo/node.js:91 +#: htdocs/luci-static/resources/view/fchomo/server.js:65 +msgid "Vless Encryption fields" +msgstr "" + +#: htdocs/luci-static/resources/fchomo.js:1053 +msgid "Wait a random 0-111 milliseconds with 75% probability." +msgstr "" + +#: htdocs/luci-static/resources/fchomo.js:70 msgid "Warning" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:691 -#: htdocs/luci-static/resources/view/fchomo/node.js:702 -#: htdocs/luci-static/resources/view/fchomo/node.js:707 -#: htdocs/luci-static/resources/view/fchomo/server.js:462 -#: htdocs/luci-static/resources/view/fchomo/server.js:473 -#: htdocs/luci-static/resources/view/fchomo/server.js:478 +#: htdocs/luci-static/resources/view/fchomo/node.js:710 +#: htdocs/luci-static/resources/view/fchomo/node.js:721 +#: htdocs/luci-static/resources/view/fchomo/node.js:726 +#: htdocs/luci-static/resources/view/fchomo/server.js:474 +#: htdocs/luci-static/resources/view/fchomo/server.js:485 +#: htdocs/luci-static/resources/view/fchomo/server.js:490 msgid "WebSocket" msgstr "" @@ -2671,135 +2762,157 @@ msgstr "" msgid "When used as a server, HomeProxy is a better choice." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:775 +#: htdocs/luci-static/resources/view/fchomo/global.js:765 msgid "White list" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:161 +#: htdocs/luci-static/resources/fchomo.js:167 msgid "WireGuard" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:432 +#: htdocs/luci-static/resources/view/fchomo/node.js:446 msgid "WireGuard peer public key." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:439 +#: htdocs/luci-static/resources/view/fchomo/node.js:453 msgid "WireGuard pre-shared key." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:424 +#: htdocs/luci-static/resources/view/fchomo/node.js:438 msgid "WireGuard requires base64-encoded private keys." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:405 +#: htdocs/luci-static/resources/fchomo.js:1209 +msgid "XOR mode" +msgstr "" + +#: htdocs/luci-static/resources/view/fchomo/node.js:419 msgid "Xudp (Xray-core)" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:279 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:287 msgid "Yaml text" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:43 +#: htdocs/luci-static/resources/fchomo.js:41 msgid "YouTube" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1364 +#: htdocs/luci-static/resources/fchomo.js:1768 msgid "Your %s was successfully uploaded. Size: %sB." msgstr "" -#: htdocs/luci-static/resources/fchomo.js:262 -#: htdocs/luci-static/resources/fchomo.js:287 -#: htdocs/luci-static/resources/view/fchomo/node.js:385 +#: htdocs/luci-static/resources/fchomo.js:270 +#: htdocs/luci-static/resources/fchomo.js:295 +#: htdocs/luci-static/resources/view/fchomo/node.js:399 msgid "aes-128-gcm" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:263 +#: htdocs/luci-static/resources/fchomo.js:271 msgid "aes-192-gcm" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:264 -#: htdocs/luci-static/resources/fchomo.js:288 +#: htdocs/luci-static/resources/fchomo.js:272 +#: htdocs/luci-static/resources/fchomo.js:296 msgid "aes-256-gcm" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:382 +#: htdocs/luci-static/resources/view/fchomo/node.js:396 msgid "auto" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:265 -#: htdocs/luci-static/resources/view/fchomo/server.js:190 +#: htdocs/luci-static/resources/view/fchomo/node.js:273 +#: htdocs/luci-static/resources/view/fchomo/server.js:191 msgid "bbr" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/server.js:347 +#: htdocs/luci-static/resources/view/fchomo/server.js:356 msgid "certificate" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:265 -#: htdocs/luci-static/resources/fchomo.js:289 +#: htdocs/luci-static/resources/fchomo.js:273 +#: htdocs/luci-static/resources/fchomo.js:297 msgid "chacha20-ietf-poly1305" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:386 +#: htdocs/luci-static/resources/view/fchomo/node.js:400 msgid "chacha20-poly1305" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:263 -#: htdocs/luci-static/resources/view/fchomo/server.js:188 +#: htdocs/luci-static/resources/view/fchomo/node.js:271 +#: htdocs/luci-static/resources/view/fchomo/server.js:189 msgid "cubic" msgstr "" +#: htdocs/luci-static/resources/fchomo.js:1189 +#: htdocs/luci-static/resources/view/fchomo/server.js:300 +msgid "decryption" +msgstr "" + #: htdocs/luci-static/resources/view/fchomo/global.js:799 msgid "dnsmasq selects upstream on its own. (may affect CDN accuracy)" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1152 +#: htdocs/luci-static/resources/view/fchomo/node.js:1171 msgid "down" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:690 -#: htdocs/luci-static/resources/view/fchomo/node.js:701 -#: htdocs/luci-static/resources/view/fchomo/node.js:706 -#: htdocs/luci-static/resources/view/fchomo/server.js:461 -#: htdocs/luci-static/resources/view/fchomo/server.js:472 -#: htdocs/luci-static/resources/view/fchomo/server.js:477 +#: htdocs/luci-static/resources/fchomo.js:1194 +#: htdocs/luci-static/resources/view/fchomo/node.js:560 +msgid "encryption" +msgstr "" + +#: htdocs/luci-static/resources/view/fchomo/node.js:709 +#: htdocs/luci-static/resources/view/fchomo/node.js:720 +#: htdocs/luci-static/resources/view/fchomo/node.js:725 +#: htdocs/luci-static/resources/view/fchomo/server.js:473 +#: htdocs/luci-static/resources/view/fchomo/server.js:484 +#: htdocs/luci-static/resources/view/fchomo/server.js:489 msgid "gRPC" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:753 -#: htdocs/luci-static/resources/view/fchomo/server.js:496 +#: htdocs/luci-static/resources/view/fchomo/node.js:772 +#: htdocs/luci-static/resources/view/fchomo/server.js:508 msgid "gRPC service name" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:498 +#: htdocs/luci-static/resources/view/fchomo/global.js:496 msgid "gVisor" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:790 +#: htdocs/luci-static/resources/view/fchomo/node.js:809 msgid "h2mux" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:57 +#: htdocs/luci-static/resources/fchomo.js:1362 +msgid "least one keypair required" +msgstr "" + +#: htdocs/luci-static/resources/fchomo.js:55 msgid "metacubexd" msgstr "" #: htdocs/luci-static/resources/view/fchomo/client.js:883 #: htdocs/luci-static/resources/view/fchomo/client.js:1122 -#: htdocs/luci-static/resources/view/fchomo/client.js:1209 -#: htdocs/luci-static/resources/view/fchomo/client.js:1327 -#: htdocs/luci-static/resources/view/fchomo/client.js:1549 -#: htdocs/luci-static/resources/view/fchomo/node.js:987 +#: htdocs/luci-static/resources/view/fchomo/client.js:1218 +#: htdocs/luci-static/resources/view/fchomo/client.js:1352 +#: htdocs/luci-static/resources/view/fchomo/client.js:1574 +#: htdocs/luci-static/resources/view/fchomo/node.js:1006 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:228 msgid "mihomo config" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:856 -#: htdocs/luci-static/resources/view/fchomo/node.js:1130 +#: htdocs/luci-static/resources/fchomo.js:1035 +msgid "mlkem768x25519plus" +msgstr "" + +#: htdocs/luci-static/resources/view/fchomo/node.js:875 +#: htdocs/luci-static/resources/view/fchomo/node.js:1149 msgid "mpTCP" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:264 -#: htdocs/luci-static/resources/view/fchomo/server.js:189 +#: htdocs/luci-static/resources/view/fchomo/node.js:272 +#: htdocs/luci-static/resources/view/fchomo/server.js:190 msgid "new_reno" msgstr "" @@ -2807,18 +2920,18 @@ msgstr "" msgid "no-resolve" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1147 -#: htdocs/luci-static/resources/fchomo.js:1201 -#: htdocs/luci-static/resources/fchomo.js:1232 +#: htdocs/luci-static/resources/fchomo.js:1551 +#: htdocs/luci-static/resources/fchomo.js:1605 +#: htdocs/luci-static/resources/fchomo.js:1636 msgid "non-empty value" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:260 -#: htdocs/luci-static/resources/view/fchomo/node.js:383 -#: htdocs/luci-static/resources/view/fchomo/node.js:403 -#: htdocs/luci-static/resources/view/fchomo/node.js:476 -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:296 -#: htdocs/luci-static/resources/view/fchomo/server.js:266 +#: htdocs/luci-static/resources/fchomo.js:268 +#: htdocs/luci-static/resources/view/fchomo/node.js:397 +#: htdocs/luci-static/resources/view/fchomo/node.js:417 +#: htdocs/luci-static/resources/view/fchomo/node.js:490 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:304 +#: htdocs/luci-static/resources/view/fchomo/server.js:267 msgid "none" msgstr "" @@ -2830,27 +2943,27 @@ msgstr "" msgid "not included \",\"" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:175 +#: htdocs/luci-static/resources/fchomo.js:181 msgid "null" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:477 +#: htdocs/luci-static/resources/view/fchomo/node.js:491 msgid "obfs-simple" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1110 +#: htdocs/luci-static/resources/view/fchomo/node.js:1129 msgid "override.proxy-name" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:404 +#: htdocs/luci-static/resources/view/fchomo/node.js:418 msgid "packet addr (v2ray-core v5+)" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/server.js:362 +#: htdocs/luci-static/resources/view/fchomo/server.js:371 msgid "private key" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:59 +#: htdocs/luci-static/resources/fchomo.js:57 msgid "razord-meta" msgstr "" @@ -2859,7 +2972,7 @@ msgstr "" msgid "requires front-end adaptation using the API." msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:481 +#: htdocs/luci-static/resources/view/fchomo/node.js:495 msgid "restls" msgstr "" @@ -2867,12 +2980,12 @@ msgstr "" msgid "rule-set" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:480 -#: htdocs/luci-static/resources/view/fchomo/server.js:267 +#: htdocs/luci-static/resources/view/fchomo/node.js:494 +#: htdocs/luci-static/resources/view/fchomo/server.js:268 msgid "shadow-tls" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:788 +#: htdocs/luci-static/resources/view/fchomo/node.js:807 msgid "smux" msgstr "" @@ -2884,93 +2997,101 @@ msgstr "" msgid "unchecked" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:337 +#: htdocs/luci-static/resources/fchomo.js:345 msgid "unique UCI identifier" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:340 +#: htdocs/luci-static/resources/fchomo.js:348 msgid "unique identifier" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1241 +#: htdocs/luci-static/resources/fchomo.js:1645 msgid "unique value" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1146 +#: htdocs/luci-static/resources/view/fchomo/node.js:1165 msgid "up" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:240 -#: htdocs/luci-static/resources/view/fchomo/node.js:284 -#: htdocs/luci-static/resources/view/fchomo/node.js:507 -#: htdocs/luci-static/resources/view/fchomo/node.js:539 -#: htdocs/luci-static/resources/view/fchomo/server.js:285 +#: htdocs/luci-static/resources/view/fchomo/node.js:248 +#: htdocs/luci-static/resources/view/fchomo/node.js:292 +#: htdocs/luci-static/resources/view/fchomo/node.js:521 +#: htdocs/luci-static/resources/view/fchomo/node.js:553 +#: htdocs/luci-static/resources/view/fchomo/server.js:286 msgid "v1" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:241 -#: htdocs/luci-static/resources/view/fchomo/node.js:508 -#: htdocs/luci-static/resources/view/fchomo/node.js:540 -#: htdocs/luci-static/resources/view/fchomo/server.js:286 +#: htdocs/luci-static/resources/view/fchomo/node.js:249 +#: htdocs/luci-static/resources/view/fchomo/node.js:522 +#: htdocs/luci-static/resources/view/fchomo/node.js:554 +#: htdocs/luci-static/resources/view/fchomo/server.js:287 msgid "v2" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:242 -#: htdocs/luci-static/resources/view/fchomo/node.js:509 -#: htdocs/luci-static/resources/view/fchomo/server.js:287 +#: htdocs/luci-static/resources/view/fchomo/node.js:250 +#: htdocs/luci-static/resources/view/fchomo/node.js:523 +#: htdocs/luci-static/resources/view/fchomo/server.js:288 msgid "v3" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1175 -#: htdocs/luci-static/resources/fchomo.js:1178 +#: htdocs/luci-static/resources/fchomo.js:1579 +#: htdocs/luci-static/resources/fchomo.js:1582 msgid "valid JSON format" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:622 +#: htdocs/luci-static/resources/view/fchomo/node.js:641 msgid "valid SHA256 string with %d characters" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1253 -#: htdocs/luci-static/resources/fchomo.js:1256 +#: htdocs/luci-static/resources/fchomo.js:1657 +#: htdocs/luci-static/resources/fchomo.js:1660 msgid "valid URL" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1188 +#: htdocs/luci-static/resources/fchomo.js:1592 msgid "valid base64 key with %d characters" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1203 +#: htdocs/luci-static/resources/fchomo.js:1607 msgid "valid key length with %d characters" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1157 +#: htdocs/luci-static/resources/fchomo.js:1561 msgid "valid port value" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1266 +#: htdocs/luci-static/resources/fchomo.js:1670 msgid "valid uuid" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:266 +#: htdocs/luci-static/resources/fchomo.js:1059 +msgid "vless-mlkem768" +msgstr "" + +#: htdocs/luci-static/resources/fchomo.js:1058 +msgid "vless-x25519" +msgstr "" + +#: htdocs/luci-static/resources/fchomo.js:274 msgid "xchacha20-ietf-poly1305" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:58 +#: htdocs/luci-static/resources/fchomo.js:56 msgid "yacd-meta" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:789 +#: htdocs/luci-static/resources/view/fchomo/node.js:808 msgid "yamux" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:56 +#: htdocs/luci-static/resources/fchomo.js:54 msgid "zashboard" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:384 +#: htdocs/luci-static/resources/view/fchomo/node.js:398 msgid "zero" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:982 +#: htdocs/luci-static/resources/fchomo.js:997 msgid "🡇" msgstr "" diff --git a/small/luci-app-fchomo/po/zh_Hans/fchomo.po b/small/luci-app-fchomo/po/zh_Hans/fchomo.po index 19eb4149ab..821408e388 100644 --- a/small/luci-app-fchomo/po/zh_Hans/fchomo.po +++ b/small/luci-app-fchomo/po/zh_Hans/fchomo.po @@ -8,11 +8,11 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Transfer-Encoding: 8bit\n" -#: htdocs/luci-static/resources/view/fchomo/log.js:69 +#: htdocs/luci-static/resources/view/fchomo/log.js:113 msgid "%s log" msgstr "%s 日志" -#: htdocs/luci-static/resources/fchomo.js:528 +#: htdocs/luci-static/resources/fchomo.js:543 #: htdocs/luci-static/resources/view/fchomo/client.js:237 #: htdocs/luci-static/resources/view/fchomo/client.js:267 #: htdocs/luci-static/resources/view/fchomo/client.js:363 @@ -23,29 +23,38 @@ msgstr "(已导入)" #: htdocs/luci-static/resources/view/fchomo/client.js:925 #: htdocs/luci-static/resources/view/fchomo/client.js:938 #: htdocs/luci-static/resources/view/fchomo/client.js:939 -#: htdocs/luci-static/resources/view/fchomo/client.js:1143 -#: htdocs/luci-static/resources/view/fchomo/client.js:1584 -#: htdocs/luci-static/resources/view/fchomo/client.js:1585 -#: htdocs/luci-static/resources/view/fchomo/node.js:1317 -#: htdocs/luci-static/resources/view/fchomo/node.js:1325 -#: htdocs/luci-static/resources/view/fchomo/node.js:1339 -#: htdocs/luci-static/resources/view/fchomo/node.js:1347 +#: htdocs/luci-static/resources/view/fchomo/client.js:1151 +#: htdocs/luci-static/resources/view/fchomo/client.js:1615 +#: htdocs/luci-static/resources/view/fchomo/client.js:1616 +#: htdocs/luci-static/resources/view/fchomo/node.js:1336 +#: htdocs/luci-static/resources/view/fchomo/node.js:1344 +#: htdocs/luci-static/resources/view/fchomo/node.js:1358 +#: htdocs/luci-static/resources/view/fchomo/node.js:1366 msgid "-- Please choose --" msgstr "-- 请选择 --" -#: htdocs/luci-static/resources/fchomo.js:40 +#: htdocs/luci-static/resources/fchomo.js:1048 +msgid "0-RTT reuse." +msgstr "0-RTT 重用。" + +#: htdocs/luci-static/resources/fchomo.js:1045 +#: htdocs/luci-static/resources/fchomo.js:1049 +msgid "1-RTT only." +msgstr "仅限 1-RTT。" + +#: htdocs/luci-static/resources/fchomo.js:38 msgid "163Music" msgstr "网抑云" -#: htdocs/luci-static/resources/fchomo.js:268 +#: htdocs/luci-static/resources/fchomo.js:276 msgid "2022-blake3-aes-128-gcm" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:269 +#: htdocs/luci-static/resources/fchomo.js:277 msgid "2022-blake3-aes-256-gcm" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:270 +#: htdocs/luci-static/resources/fchomo.js:278 msgid "2022-blake3-chacha20-poly1305" msgstr "" @@ -53,44 +62,44 @@ msgstr "" msgid "0 or 1 only." msgstr "仅限 01。" -#: htdocs/luci-static/resources/view/fchomo/server.js:343 -#: htdocs/luci-static/resources/view/fchomo/server.js:358 +#: htdocs/luci-static/resources/view/fchomo/server.js:352 +#: htdocs/luci-static/resources/view/fchomo/server.js:367 msgid "Save your configuration before uploading files!" msgstr "上传文件前请先保存配置!" -#: htdocs/luci-static/resources/view/fchomo/global.js:600 +#: htdocs/luci-static/resources/view/fchomo/global.js:590 msgid "API" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:640 +#: htdocs/luci-static/resources/view/fchomo/global.js:630 msgid "API DoH service" msgstr "API DoH 服务器" -#: htdocs/luci-static/resources/view/fchomo/global.js:594 +#: htdocs/luci-static/resources/view/fchomo/global.js:584 msgid "API ECH config" msgstr "API ECH 配置" -#: htdocs/luci-static/resources/view/fchomo/global.js:557 +#: htdocs/luci-static/resources/view/fchomo/global.js:545 msgid "API ECH key" msgstr "API ECH 密钥" -#: htdocs/luci-static/resources/view/fchomo/global.js:631 +#: htdocs/luci-static/resources/view/fchomo/global.js:621 msgid "API HTTP port" msgstr "API HTTP 端口" -#: htdocs/luci-static/resources/view/fchomo/global.js:635 +#: htdocs/luci-static/resources/view/fchomo/global.js:625 msgid "API HTTPS port" msgstr "API HTTPS 端口" -#: htdocs/luci-static/resources/view/fchomo/global.js:549 +#: htdocs/luci-static/resources/view/fchomo/global.js:537 msgid "API TLS certificate path" msgstr "API TLS 证书路径" -#: htdocs/luci-static/resources/view/fchomo/global.js:553 +#: htdocs/luci-static/resources/view/fchomo/global.js:541 msgid "API TLS private key path" msgstr "API TLS 私钥" -#: htdocs/luci-static/resources/view/fchomo/global.js:644 +#: htdocs/luci-static/resources/view/fchomo/global.js:634 msgid "API secret" msgstr "API 令牌" @@ -98,16 +107,16 @@ msgstr "API 令牌" msgid "ASN version" msgstr "ASN 版本" -#: htdocs/luci-static/resources/view/fchomo/global.js:721 -#: htdocs/luci-static/resources/view/fchomo/global.js:771 +#: htdocs/luci-static/resources/view/fchomo/global.js:711 +#: htdocs/luci-static/resources/view/fchomo/global.js:761 msgid "Access Control" msgstr "访问控制" -#: htdocs/luci-static/resources/view/fchomo/client.js:1519 +#: htdocs/luci-static/resources/view/fchomo/client.js:1544 msgid "Add a DNS policy" msgstr "新增 DNS 策略" -#: htdocs/luci-static/resources/view/fchomo/client.js:1298 +#: htdocs/luci-static/resources/view/fchomo/client.js:1307 msgid "Add a DNS server" msgstr "新增 DNS 服务器" @@ -115,11 +124,11 @@ msgstr "新增 DNS 服务器" msgid "Add a Node" msgstr "新增 节点" -#: htdocs/luci-static/resources/view/fchomo/node.js:896 +#: htdocs/luci-static/resources/view/fchomo/node.js:915 msgid "Add a provider" msgstr "新增 供应商" -#: htdocs/luci-static/resources/view/fchomo/node.js:1274 +#: htdocs/luci-static/resources/view/fchomo/node.js:1293 msgid "Add a proxy chain" msgstr "新增 代理链" @@ -139,45 +148,52 @@ msgstr "新增 规则集" msgid "Add a server" msgstr "新增 服务器" -#: htdocs/luci-static/resources/view/fchomo/client.js:1176 +#: htdocs/luci-static/resources/view/fchomo/client.js:1185 msgid "Add a sub rule" msgstr "新增 子规则" -#: htdocs/luci-static/resources/view/fchomo/node.js:1099 +#: htdocs/luci-static/resources/view/fchomo/node.js:1118 msgid "Add prefix" msgstr "添加前缀" -#: htdocs/luci-static/resources/view/fchomo/node.js:1103 +#: htdocs/luci-static/resources/view/fchomo/node.js:1122 msgid "Add suffix" msgstr "添加后缀" -#: htdocs/luci-static/resources/view/fchomo/client.js:1344 -#: htdocs/luci-static/resources/view/fchomo/client.js:1349 +#: htdocs/luci-static/resources/view/fchomo/client.js:1369 +#: htdocs/luci-static/resources/view/fchomo/client.js:1374 msgid "Address" msgstr "地址" -#: htdocs/luci-static/resources/view/fchomo/global.js:526 +#: htdocs/luci-static/resources/fchomo.js:1052 +msgid "" +"After the 1-RTT client/server hello, padding randomly 111-1111 bytes with " +"100% probability." +msgstr "" +"在 1-RTT client/server hello 之后,以 100% 的概率随机填充 111-1111 字节。" + +#: htdocs/luci-static/resources/view/fchomo/global.js:514 msgid "Aging time of NAT map maintained by client.
" msgstr "客户端维护的 NAT 映射 的老化时间。
" -#: htdocs/luci-static/resources/view/fchomo/global.js:774 -#: htdocs/luci-static/resources/view/fchomo/global.js:822 -#: htdocs/luci-static/resources/view/fchomo/global.js:841 +#: htdocs/luci-static/resources/view/fchomo/global.js:764 +#: htdocs/luci-static/resources/view/fchomo/global.js:827 +#: htdocs/luci-static/resources/view/fchomo/global.js:846 msgid "All allowed" msgstr "允许所有" -#: htdocs/luci-static/resources/fchomo.js:193 +#: htdocs/luci-static/resources/fchomo.js:201 msgid "All ports" msgstr "所有端口" -#: htdocs/luci-static/resources/view/fchomo/global.js:627 +#: htdocs/luci-static/resources/view/fchomo/global.js:617 msgid "" "Allow access from private network.
To access the API on a private " "network from a public website, it must be enabled." msgstr "" "允许从私有网络访问。
要从公共网站访问私有网络上的 API,则必须启用。" -#: htdocs/luci-static/resources/view/fchomo/node.js:445 +#: htdocs/luci-static/resources/view/fchomo/node.js:459 msgid "Allowed IPs" msgstr "允许的 IP" @@ -189,13 +205,13 @@ msgstr "已是最新版本。" msgid "Already in updating." msgstr "已在更新中。" -#: htdocs/luci-static/resources/view/fchomo/node.js:374 -#: htdocs/luci-static/resources/view/fchomo/server.js:257 +#: htdocs/luci-static/resources/view/fchomo/node.js:388 +#: htdocs/luci-static/resources/view/fchomo/server.js:258 msgid "Alter ID" msgstr "额外 ID" -#: htdocs/luci-static/resources/fchomo.js:125 -#: htdocs/luci-static/resources/fchomo.js:157 +#: htdocs/luci-static/resources/fchomo.js:131 +#: htdocs/luci-static/resources/fchomo.js:163 msgid "AnyTLS" msgstr "" @@ -212,11 +228,11 @@ msgstr "作为 dnsmasq 的最优先上游" msgid "As the TOP upstream of dnsmasq." msgstr "作为 dnsmasq 的最优先上游。" -#: htdocs/luci-static/resources/view/fchomo/server.js:207 +#: htdocs/luci-static/resources/view/fchomo/server.js:208 msgid "Auth timeout" msgstr "认证超时" -#: htdocs/luci-static/resources/view/fchomo/node.js:396 +#: htdocs/luci-static/resources/view/fchomo/node.js:410 msgid "Authenticated length" msgstr "认证长度" @@ -224,7 +240,7 @@ msgstr "认证长度" msgid "Auto" msgstr "自动" -#: htdocs/luci-static/resources/view/fchomo/server.js:81 +#: htdocs/luci-static/resources/view/fchomo/server.js:82 msgid "Auto configure firewall" msgstr "自动配置防火墙" @@ -236,45 +252,44 @@ msgstr "自动更新" msgid "Auto update resources." msgstr "自动更新资源文件。" -#: htdocs/luci-static/resources/fchomo.js:39 +#: htdocs/luci-static/resources/fchomo.js:37 msgid "Baidu" msgstr "百度" -#: htdocs/luci-static/resources/view/fchomo/global.js:498 -#: htdocs/luci-static/resources/view/fchomo/global.js:509 +#: htdocs/luci-static/resources/view/fchomo/global.js:496 msgid "Based on google/gvisor." msgstr "基于 google/gvisor。" -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:263 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:271 msgid "Behavior" msgstr "行为" -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:272 -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:286 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:280 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:294 msgid "Binary format only supports domain / ipcidr" msgstr "二进制格式仅支持 domain/ipcidr" -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:280 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:288 msgid "Binary mrs" msgstr "二进制 mrs" -#: htdocs/luci-static/resources/view/fchomo/global.js:735 -#: htdocs/luci-static/resources/view/fchomo/node.js:866 -#: htdocs/luci-static/resources/view/fchomo/node.js:1172 +#: htdocs/luci-static/resources/view/fchomo/global.js:725 +#: htdocs/luci-static/resources/view/fchomo/node.js:885 +#: htdocs/luci-static/resources/view/fchomo/node.js:1191 msgid "Bind interface" msgstr "绑定接口" -#: htdocs/luci-static/resources/view/fchomo/node.js:867 -#: htdocs/luci-static/resources/view/fchomo/node.js:1173 +#: htdocs/luci-static/resources/view/fchomo/node.js:886 +#: htdocs/luci-static/resources/view/fchomo/node.js:1192 msgid "Bind outbound interface.
" msgstr "绑定出站接口。
" -#: htdocs/luci-static/resources/view/fchomo/global.js:736 +#: htdocs/luci-static/resources/view/fchomo/global.js:726 msgid "" "Bind outbound traffic to specific interface. Leave empty to auto detect.
" msgstr "绑定出站流量至指定接口。留空自动检测。
" -#: htdocs/luci-static/resources/view/fchomo/global.js:776 +#: htdocs/luci-static/resources/view/fchomo/global.js:766 msgid "Black list" msgstr "黑名单" @@ -282,58 +297,58 @@ msgstr "黑名单" msgid "Block DNS queries" msgstr "封锁 DNS 请求" -#: htdocs/luci-static/resources/view/fchomo/client.js:1250 +#: htdocs/luci-static/resources/view/fchomo/client.js:1259 msgid "Bootstrap DNS server" msgstr "引导 DNS 服务器" -#: htdocs/luci-static/resources/view/fchomo/client.js:1257 +#: htdocs/luci-static/resources/view/fchomo/client.js:1266 msgid "Bootstrap DNS server (Node)" msgstr "引导 DNS 服务器 (节点)" -#: htdocs/luci-static/resources/view/fchomo/global.js:823 +#: htdocs/luci-static/resources/view/fchomo/global.js:828 msgid "Bypass CN" msgstr "绕过 CN 流量" -#: htdocs/luci-static/resources/view/fchomo/global.js:842 +#: htdocs/luci-static/resources/view/fchomo/global.js:847 msgid "Bypass DSCP" msgstr "绕过 DSCP" -#: htdocs/luci-static/resources/view/fchomo/global.js:622 +#: htdocs/luci-static/resources/view/fchomo/global.js:612 msgid "CORS Allow origins" msgstr "CORS 允许的来源" -#: htdocs/luci-static/resources/view/fchomo/global.js:626 +#: htdocs/luci-static/resources/view/fchomo/global.js:616 msgid "CORS Allow private network" msgstr "CORS 允许私有网络" -#: htdocs/luci-static/resources/view/fchomo/global.js:623 +#: htdocs/luci-static/resources/view/fchomo/global.js:613 msgid "CORS allowed origins, * will be used if empty." msgstr "CORS 允许的来源,留空则使用 *。" -#: htdocs/luci-static/resources/fchomo.js:548 +#: htdocs/luci-static/resources/fchomo.js:563 msgid "Cancel" msgstr "取消" -#: htdocs/luci-static/resources/view/fchomo/node.js:616 +#: htdocs/luci-static/resources/view/fchomo/node.js:635 msgid "Cert fingerprint" msgstr "证书指纹" -#: htdocs/luci-static/resources/view/fchomo/node.js:617 +#: htdocs/luci-static/resources/view/fchomo/node.js:636 msgid "" "Certificate fingerprint. Used to implement SSL Pinning and prevent MitM." msgstr "证书指纹。用于实现 SSL证书固定 并防止 MitM。" -#: htdocs/luci-static/resources/view/fchomo/server.js:335 +#: htdocs/luci-static/resources/view/fchomo/server.js:344 msgid "Certificate path" msgstr "证书路径" -#: htdocs/luci-static/resources/view/fchomo/node.js:1316 -#: htdocs/luci-static/resources/view/fchomo/node.js:1322 +#: htdocs/luci-static/resources/view/fchomo/node.js:1335 +#: htdocs/luci-static/resources/view/fchomo/node.js:1341 msgid "Chain head" msgstr "链头" -#: htdocs/luci-static/resources/view/fchomo/node.js:1338 -#: htdocs/luci-static/resources/view/fchomo/node.js:1344 +#: htdocs/luci-static/resources/view/fchomo/node.js:1357 +#: htdocs/luci-static/resources/view/fchomo/node.js:1363 msgid "Chain tail" msgstr "链尾" @@ -362,13 +377,13 @@ msgstr "大陆 IPv6 库版本" msgid "China list version" msgstr "大陆域名列表版本" -#: htdocs/luci-static/resources/view/fchomo/node.js:193 -#: htdocs/luci-static/resources/view/fchomo/node.js:380 -#: htdocs/luci-static/resources/view/fchomo/server.js:161 +#: htdocs/luci-static/resources/view/fchomo/node.js:194 +#: htdocs/luci-static/resources/view/fchomo/node.js:394 +#: htdocs/luci-static/resources/view/fchomo/server.js:162 msgid "Chipher" msgstr "加密方法" -#: htdocs/luci-static/resources/view/fchomo/log.js:76 +#: htdocs/luci-static/resources/view/fchomo/log.js:121 msgid "Clean log" msgstr "清空日志" @@ -380,11 +395,12 @@ msgstr "" "点击此处下载" "最新的初始包。" +#: htdocs/luci-static/resources/fchomo.js:1235 #: root/usr/share/luci/menu.d/luci-app-fchomo.json:22 msgid "Client" msgstr "客户端" -#: htdocs/luci-static/resources/view/fchomo/node.js:650 +#: htdocs/luci-static/resources/view/fchomo/node.js:669 msgid "Client fingerprint" msgstr "客户端指纹" @@ -392,25 +408,25 @@ msgstr "客户端指纹" msgid "Client status" msgstr "客户端状态" -#: htdocs/luci-static/resources/view/fchomo/log.js:39 +#: htdocs/luci-static/resources/view/fchomo/log.js:83 msgid "Collecting data..." msgstr "收集数据中..." -#: htdocs/luci-static/resources/fchomo.js:194 -#: htdocs/luci-static/resources/fchomo.js:195 +#: htdocs/luci-static/resources/fchomo.js:202 +#: htdocs/luci-static/resources/fchomo.js:203 msgid "Common ports (bypass P2P traffic)" msgstr "常用端口(绕过 P2P 流量)" -#: htdocs/luci-static/resources/fchomo.js:1091 +#: htdocs/luci-static/resources/fchomo.js:1473 msgid "Complete" msgstr "完成" -#: htdocs/luci-static/resources/view/fchomo/node.js:1119 +#: htdocs/luci-static/resources/view/fchomo/node.js:1138 msgid "Configuration Items" msgstr "配置项" -#: htdocs/luci-static/resources/view/fchomo/node.js:260 -#: htdocs/luci-static/resources/view/fchomo/server.js:185 +#: htdocs/luci-static/resources/view/fchomo/node.js:268 +#: htdocs/luci-static/resources/view/fchomo/server.js:186 msgid "Congestion controller" msgstr "拥塞控制器" @@ -418,16 +434,20 @@ msgstr "拥塞控制器" msgid "Connection check" msgstr "连接检查" +#: htdocs/luci-static/resources/fchomo.js:1088 +msgid "Content copied to clipboard!" +msgstr "内容已复制到剪贴板!" + #: htdocs/luci-static/resources/view/fchomo/client.js:598 -#: htdocs/luci-static/resources/view/fchomo/node.js:1041 -#: htdocs/luci-static/resources/view/fchomo/node.js:1055 -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:320 -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:334 +#: htdocs/luci-static/resources/view/fchomo/node.js:1060 +#: htdocs/luci-static/resources/view/fchomo/node.js:1074 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:328 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:342 msgid "Content will not be verified, Please make sure you enter it correctly." msgstr "内容将不会被验证,请确保输入正确。" -#: htdocs/luci-static/resources/view/fchomo/node.js:1040 -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:319 +#: htdocs/luci-static/resources/view/fchomo/node.js:1059 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:327 msgid "Contents" msgstr "内容" @@ -435,6 +455,10 @@ msgstr "内容" msgid "Contents have been saved." msgstr "" +#: htdocs/luci-static/resources/fchomo.js:1090 +msgid "Copy" +msgstr "复制" + #: htdocs/luci-static/resources/view/fchomo/global.js:166 msgid "Core version" msgstr "核心版本" @@ -443,15 +467,15 @@ msgstr "核心版本" msgid "Cron expression" msgstr "Cron 表达式" -#: htdocs/luci-static/resources/view/fchomo/global.js:860 +#: htdocs/luci-static/resources/view/fchomo/global.js:865 msgid "Custom Direct List" msgstr "自定义直连列表" -#: htdocs/luci-static/resources/view/fchomo/node.js:1090 +#: htdocs/luci-static/resources/view/fchomo/node.js:1109 msgid "Custom HTTP header." msgstr "自定义 HTTP header。" -#: htdocs/luci-static/resources/view/fchomo/global.js:878 +#: htdocs/luci-static/resources/view/fchomo/global.js:883 msgid "Custom Proxy List" msgstr "自定义代理列表" @@ -460,31 +484,31 @@ msgid "" "Custom internal hosts. Support yaml or json format." msgstr "自定义内部 hosts。支持 yamljson 格式。" -#: htdocs/luci-static/resources/fchomo.js:147 +#: htdocs/luci-static/resources/fchomo.js:153 msgid "DIRECT" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1510 -#: htdocs/luci-static/resources/view/fchomo/client.js:1519 +#: htdocs/luci-static/resources/view/fchomo/client.js:1535 +#: htdocs/luci-static/resources/view/fchomo/client.js:1544 msgid "DNS policy" msgstr "DNS 策略" -#: htdocs/luci-static/resources/view/fchomo/global.js:473 +#: htdocs/luci-static/resources/view/fchomo/global.js:471 msgid "DNS port" msgstr " DNS 端口" -#: htdocs/luci-static/resources/view/fchomo/client.js:1289 #: htdocs/luci-static/resources/view/fchomo/client.js:1298 -#: htdocs/luci-static/resources/view/fchomo/client.js:1597 -#: htdocs/luci-static/resources/view/fchomo/node.js:469 +#: htdocs/luci-static/resources/view/fchomo/client.js:1307 +#: htdocs/luci-static/resources/view/fchomo/client.js:1628 +#: htdocs/luci-static/resources/view/fchomo/node.js:483 msgid "DNS server" msgstr "DNS 服务器" -#: htdocs/luci-static/resources/view/fchomo/client.js:1236 +#: htdocs/luci-static/resources/view/fchomo/client.js:1245 msgid "DNS settings" msgstr "DNS 设置" -#: htdocs/luci-static/resources/view/fchomo/global.js:845 +#: htdocs/luci-static/resources/view/fchomo/global.js:850 msgid "DSCP list" msgstr "DSCP 列表" @@ -492,32 +516,28 @@ msgstr "DSCP 列表" msgid "Dashboard version" msgstr "面板版本" -#: htdocs/luci-static/resources/view/fchomo/global.js:411 +#: htdocs/luci-static/resources/fchomo.js:72 msgid "Debug" msgstr "调试" -#: htdocs/luci-static/resources/view/fchomo/node.js:271 -msgid "Default" -msgstr "默认" - #: htdocs/luci-static/resources/view/fchomo/client.js:53 msgid "Default DNS (issued by WAN)" msgstr "默认 DNS(由 WAN 下发)" -#: htdocs/luci-static/resources/view/fchomo/client.js:1264 +#: htdocs/luci-static/resources/view/fchomo/client.js:1273 msgid "Default DNS server" msgstr "默认 DNS 服务器" -#: htdocs/luci-static/resources/view/fchomo/node.js:446 +#: htdocs/luci-static/resources/view/fchomo/node.js:460 msgid "Destination addresses allowed to be forwarded via Wireguard." msgstr "允许通过 WireGuard 转发的目的地址" -#: htdocs/luci-static/resources/view/fchomo/node.js:94 +#: htdocs/luci-static/resources/view/fchomo/node.js:95 msgid "Dial fields" msgstr "拨号字段" -#: htdocs/luci-static/resources/view/fchomo/node.js:1331 -#: htdocs/luci-static/resources/view/fchomo/node.js:1353 +#: htdocs/luci-static/resources/view/fchomo/node.js:1350 +#: htdocs/luci-static/resources/view/fchomo/node.js:1372 msgid "Different chain head/tail" msgstr "不同的链头/链尾" @@ -525,33 +545,37 @@ msgstr "不同的链头/链尾" msgid "Direct" msgstr "直连" -#: htdocs/luci-static/resources/view/fchomo/global.js:778 +#: htdocs/luci-static/resources/view/fchomo/global.js:768 msgid "Direct IPv4 IP-s" msgstr "直连 IPv4 地址" -#: htdocs/luci-static/resources/view/fchomo/global.js:781 +#: htdocs/luci-static/resources/view/fchomo/global.js:771 msgid "Direct IPv6 IP-s" msgstr "直连 IPv6 地址" -#: htdocs/luci-static/resources/view/fchomo/global.js:784 +#: htdocs/luci-static/resources/view/fchomo/global.js:774 msgid "Direct MAC-s" msgstr "直连 MAC 地址" #: htdocs/luci-static/resources/view/fchomo/global.js:403 -#: htdocs/luci-static/resources/view/fchomo/node.js:159 -#: htdocs/luci-static/resources/view/fchomo/server.js:141 +#: htdocs/luci-static/resources/view/fchomo/node.js:160 +#: htdocs/luci-static/resources/view/fchomo/server.js:142 msgid "Disable" msgstr "禁用" -#: htdocs/luci-static/resources/view/fchomo/global.js:712 +#: htdocs/luci-static/resources/view/fchomo/global.js:702 msgid "Disable ECN of quic-go" msgstr "禁用 quic-go 的 显式拥塞通知(ECN)" -#: htdocs/luci-static/resources/view/fchomo/global.js:709 +#: htdocs/luci-static/resources/view/fchomo/global.js:699 msgid "Disable GSO of quic-go" msgstr "禁用 quic-go 的 通用分段卸载(GSO)" -#: htdocs/luci-static/resources/view/fchomo/node.js:565 +#: htdocs/luci-static/resources/view/fchomo/global.js:523 +msgid "Disable ICMP Forwarding" +msgstr "禁用 ICMP 转发" + +#: htdocs/luci-static/resources/view/fchomo/node.js:584 msgid "Disable SNI" msgstr "禁用 SNI" @@ -559,15 +583,15 @@ msgstr "禁用 SNI" msgid "Disable UDP" msgstr "禁用 UDP" -#: htdocs/luci-static/resources/view/fchomo/global.js:706 +#: htdocs/luci-static/resources/view/fchomo/global.js:696 msgid "Disable safe path check" msgstr "禁用安全路径检查" -#: htdocs/luci-static/resources/view/fchomo/client.js:1476 +#: htdocs/luci-static/resources/view/fchomo/client.js:1501 msgid "Discard A responses" msgstr "丢弃 A 响应" -#: htdocs/luci-static/resources/view/fchomo/client.js:1492 +#: htdocs/luci-static/resources/view/fchomo/client.js:1517 msgid "Discard AAAA responses" msgstr "丢弃 AAAA 响应" @@ -579,70 +603,70 @@ msgstr "" "不要将域名连接解析为 IP 以进行此次匹配。
仅对未经 DNS 解析的纯域名入站连" "接有效。例如,socks5h" -#: htdocs/luci-static/resources/view/fchomo/client.js:1567 -#: htdocs/luci-static/resources/view/fchomo/client.js:1572 -#: htdocs/luci-static/resources/view/fchomo/client.js:1637 -#: htdocs/luci-static/resources/view/fchomo/client.js:1644 -#: htdocs/luci-static/resources/view/fchomo/client.js:1646 +#: htdocs/luci-static/resources/view/fchomo/client.js:1598 +#: htdocs/luci-static/resources/view/fchomo/client.js:1603 +#: htdocs/luci-static/resources/view/fchomo/client.js:1668 +#: htdocs/luci-static/resources/view/fchomo/client.js:1675 +#: htdocs/luci-static/resources/view/fchomo/client.js:1677 msgid "Domain" msgstr "域名" -#: htdocs/luci-static/resources/view/fchomo/node.js:566 +#: htdocs/luci-static/resources/view/fchomo/node.js:585 msgid "Donot send server name in ClientHello." msgstr "不要在 ClientHello 中发送服务器名称。" -#: htdocs/luci-static/resources/view/fchomo/client.js:1424 -#: htdocs/luci-static/resources/view/fchomo/node.js:630 -#: htdocs/luci-static/resources/view/fchomo/node.js:1159 +#: htdocs/luci-static/resources/view/fchomo/client.js:1449 +#: htdocs/luci-static/resources/view/fchomo/node.js:649 +#: htdocs/luci-static/resources/view/fchomo/node.js:1178 msgid "Donot verifying server certificate." msgstr "不验证服务器证书。" -#: htdocs/luci-static/resources/view/fchomo/node.js:845 +#: htdocs/luci-static/resources/view/fchomo/node.js:864 msgid "Download bandwidth" msgstr "下载带宽" -#: htdocs/luci-static/resources/view/fchomo/node.js:846 +#: htdocs/luci-static/resources/view/fchomo/node.js:865 msgid "Download bandwidth in Mbps." msgstr "下载带宽(单位:Mbps)。" -#: htdocs/luci-static/resources/fchomo.js:977 +#: htdocs/luci-static/resources/fchomo.js:992 msgid "Download failed: %s" msgstr "下载失败: %s" -#: htdocs/luci-static/resources/fchomo.js:975 +#: htdocs/luci-static/resources/fchomo.js:990 msgid "Download successful." msgstr "下载成功。" -#: htdocs/luci-static/resources/fchomo.js:133 +#: htdocs/luci-static/resources/fchomo.js:139 msgid "Dual stack" msgstr "双栈" -#: htdocs/luci-static/resources/view/fchomo/node.js:643 -#: htdocs/luci-static/resources/view/fchomo/server.js:404 +#: htdocs/luci-static/resources/view/fchomo/node.js:662 +#: htdocs/luci-static/resources/view/fchomo/server.js:415 msgid "ECH config" msgstr "ECH 配置" -#: htdocs/luci-static/resources/view/fchomo/server.js:365 +#: htdocs/luci-static/resources/view/fchomo/server.js:374 msgid "ECH key" msgstr "ECH 密钥" -#: htdocs/luci-static/resources/view/fchomo/client.js:1458 +#: htdocs/luci-static/resources/view/fchomo/client.js:1483 msgid "ECS override" msgstr "强制覆盖 ECS" -#: htdocs/luci-static/resources/view/fchomo/client.js:1442 +#: htdocs/luci-static/resources/view/fchomo/client.js:1467 msgid "EDNS Client Subnet" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:414 +#: htdocs/luci-static/resources/view/fchomo/global.js:412 msgid "ETag support" msgstr "ETag 支持" -#: htdocs/luci-static/resources/view/fchomo/node.js:758 +#: htdocs/luci-static/resources/view/fchomo/node.js:777 msgid "Early Data first packet length limit." msgstr "前置数据长度阈值" -#: htdocs/luci-static/resources/view/fchomo/node.js:764 +#: htdocs/luci-static/resources/view/fchomo/node.js:783 msgid "Early Data header name" msgstr "前置数据标头" @@ -654,30 +678,34 @@ msgstr "编辑节点" msgid "Edit ruleset" msgstr "编辑规则集" -#: htdocs/luci-static/resources/view/fchomo/node.js:1038 -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:317 +#: htdocs/luci-static/resources/view/fchomo/node.js:1057 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:325 msgid "Editer" msgstr "编辑器" +#: htdocs/luci-static/resources/fchomo.js:1039 +msgid "Eliminate encryption header characteristics" +msgstr "消除加密头特征" + #: htdocs/luci-static/resources/view/fchomo/client.js:809 #: htdocs/luci-static/resources/view/fchomo/client.js:906 #: htdocs/luci-static/resources/view/fchomo/client.js:1135 -#: htdocs/luci-static/resources/view/fchomo/client.js:1222 -#: htdocs/luci-static/resources/view/fchomo/client.js:1340 -#: htdocs/luci-static/resources/view/fchomo/client.js:1562 +#: htdocs/luci-static/resources/view/fchomo/client.js:1231 +#: htdocs/luci-static/resources/view/fchomo/client.js:1365 +#: htdocs/luci-static/resources/view/fchomo/client.js:1587 #: htdocs/luci-static/resources/view/fchomo/global.js:401 -#: htdocs/luci-static/resources/view/fchomo/global.js:681 -#: htdocs/luci-static/resources/view/fchomo/node.js:101 -#: htdocs/luci-static/resources/view/fchomo/node.js:1011 -#: htdocs/luci-static/resources/view/fchomo/node.js:1195 -#: htdocs/luci-static/resources/view/fchomo/node.js:1284 +#: htdocs/luci-static/resources/view/fchomo/global.js:671 +#: htdocs/luci-static/resources/view/fchomo/node.js:102 +#: htdocs/luci-static/resources/view/fchomo/node.js:1030 +#: htdocs/luci-static/resources/view/fchomo/node.js:1214 +#: htdocs/luci-static/resources/view/fchomo/node.js:1303 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:253 #: htdocs/luci-static/resources/view/fchomo/server.js:50 -#: htdocs/luci-static/resources/view/fchomo/server.js:76 +#: htdocs/luci-static/resources/view/fchomo/server.js:77 msgid "Enable" msgstr "启用" -#: htdocs/luci-static/resources/view/fchomo/node.js:295 +#: htdocs/luci-static/resources/view/fchomo/node.js:303 msgid "" "Enable 0-RTT QUIC connection handshake on the client side. This is not " "impacting much on the performance, as the protocol is fully multiplexed.
强烈建议禁用此功能,因为它容易受到重放攻击。" -#: htdocs/luci-static/resources/view/fchomo/node.js:294 +#: htdocs/luci-static/resources/view/fchomo/node.js:302 msgid "Enable 0-RTT handshake" msgstr "启用 0-RTT 握手" -#: htdocs/luci-static/resources/view/fchomo/global.js:715 +#: htdocs/luci-static/resources/view/fchomo/global.js:705 msgid "" "Enable IP4P " "conversion for outbound connections" @@ -698,53 +726,57 @@ msgstr "" "为出站连接启用 IP4P 转换" -#: htdocs/luci-static/resources/view/fchomo/node.js:637 +#: htdocs/luci-static/resources/view/fchomo/node.js:656 msgid "Enable ECH" msgstr "启用 ECH" -#: htdocs/luci-static/resources/view/fchomo/node.js:833 +#: htdocs/luci-static/resources/view/fchomo/node.js:852 msgid "Enable TCP Brutal" msgstr "启用 TCP Brutal" -#: htdocs/luci-static/resources/view/fchomo/node.js:834 +#: htdocs/luci-static/resources/view/fchomo/node.js:853 msgid "Enable TCP Brutal congestion control algorithm" msgstr "启用 TCP Brutal 拥塞控制算法。" -#: htdocs/luci-static/resources/view/fchomo/node.js:822 +#: htdocs/luci-static/resources/view/fchomo/node.js:841 msgid "Enable multiplexing only for TCP." msgstr "仅为 TCP 启用多路复用。" -#: htdocs/luci-static/resources/view/fchomo/node.js:816 +#: htdocs/luci-static/resources/view/fchomo/node.js:835 msgid "Enable padding" msgstr "启用填充" -#: htdocs/luci-static/resources/view/fchomo/node.js:827 +#: htdocs/luci-static/resources/view/fchomo/node.js:846 msgid "Enable statistic" msgstr "启用统计" -#: htdocs/luci-static/resources/view/fchomo/node.js:533 -#: htdocs/luci-static/resources/view/fchomo/node.js:1141 +#: htdocs/luci-static/resources/view/fchomo/node.js:547 +#: htdocs/luci-static/resources/view/fchomo/node.js:1160 msgid "" "Enable the SUoT protocol, requires server support. Conflict with Multiplex." msgstr "启用 SUoT 协议,需要服务端支持。与多路复用冲突。" -#: htdocs/luci-static/resources/view/fchomo/node.js:165 -#: htdocs/luci-static/resources/view/fchomo/server.js:147 +#: htdocs/luci-static/resources/view/fchomo/node.js:166 +#: htdocs/luci-static/resources/view/fchomo/server.js:148 msgid "" "Enabling obfuscation will make the server incompatible with standard QUIC " "connections, losing the ability to masquerade with HTTP/3." msgstr "启用混淆将使服务器与标准的 QUIC 连接不兼容,失去 HTTP/3 伪装的能力。" -#: htdocs/luci-static/resources/view/fchomo/global.js:531 +#: htdocs/luci-static/resources/fchomo.js:1200 +msgid "Encryption method" +msgstr "加密方法" + +#: htdocs/luci-static/resources/view/fchomo/global.js:519 msgid "Endpoint-Independent NAT" msgstr "端点独立 NAT" #: htdocs/luci-static/resources/view/fchomo/client.js:650 -#: htdocs/luci-static/resources/view/fchomo/client.js:1589 +#: htdocs/luci-static/resources/view/fchomo/client.js:1620 msgid "Entry" msgstr "条目" -#: htdocs/luci-static/resources/view/fchomo/global.js:408 +#: htdocs/luci-static/resources/fchomo.js:69 msgid "Error" msgstr "错误" @@ -754,7 +786,7 @@ msgid "" "if empty." msgstr "超过此限制将会触发强制健康检查。留空则使用 5。" -#: htdocs/luci-static/resources/view/fchomo/node.js:1253 +#: htdocs/luci-static/resources/view/fchomo/node.js:1272 msgid "Exclude matched node types." msgstr "排除匹配的节点类型。" @@ -767,7 +799,7 @@ msgstr "" "rel=\"noreferrer noopener\">此处。" #: htdocs/luci-static/resources/view/fchomo/client.js:1043 -#: htdocs/luci-static/resources/view/fchomo/node.js:1246 +#: htdocs/luci-static/resources/view/fchomo/node.js:1265 msgid "Exclude nodes that meet keywords or regexps." msgstr "排除匹配关键词或表达式的节点。" @@ -776,56 +808,59 @@ msgid "Expand/Collapse result" msgstr "展开/收起 结果" #: htdocs/luci-static/resources/view/fchomo/client.js:1003 -#: htdocs/luci-static/resources/view/fchomo/node.js:1231 +#: htdocs/luci-static/resources/view/fchomo/node.js:1250 msgid "Expected HTTP code. 204 will be used if empty." msgstr "预期的 HTTP code。留空则使用 204。" #: htdocs/luci-static/resources/view/fchomo/client.js:1005 -#: htdocs/luci-static/resources/view/fchomo/node.js:1233 +#: htdocs/luci-static/resources/view/fchomo/node.js:1252 msgid "Expected status" msgstr "预期状态" -#: htdocs/luci-static/resources/fchomo.js:334 -#: htdocs/luci-static/resources/fchomo.js:337 -#: htdocs/luci-static/resources/fchomo.js:340 -#: htdocs/luci-static/resources/fchomo.js:1108 -#: htdocs/luci-static/resources/fchomo.js:1116 -#: htdocs/luci-static/resources/fchomo.js:1124 -#: htdocs/luci-static/resources/fchomo.js:1147 -#: htdocs/luci-static/resources/fchomo.js:1150 -#: htdocs/luci-static/resources/fchomo.js:1157 -#: htdocs/luci-static/resources/fchomo.js:1175 -#: htdocs/luci-static/resources/fchomo.js:1178 -#: htdocs/luci-static/resources/fchomo.js:1188 -#: htdocs/luci-static/resources/fchomo.js:1201 -#: htdocs/luci-static/resources/fchomo.js:1203 -#: htdocs/luci-static/resources/fchomo.js:1216 -#: htdocs/luci-static/resources/fchomo.js:1225 -#: htdocs/luci-static/resources/fchomo.js:1232 -#: htdocs/luci-static/resources/fchomo.js:1241 -#: htdocs/luci-static/resources/fchomo.js:1253 +#: htdocs/luci-static/resources/fchomo.js:342 +#: htdocs/luci-static/resources/fchomo.js:345 +#: htdocs/luci-static/resources/fchomo.js:348 +#: htdocs/luci-static/resources/fchomo.js:1228 #: htdocs/luci-static/resources/fchomo.js:1256 -#: htdocs/luci-static/resources/fchomo.js:1266 +#: htdocs/luci-static/resources/fchomo.js:1362 +#: htdocs/luci-static/resources/fchomo.js:1512 +#: htdocs/luci-static/resources/fchomo.js:1520 +#: htdocs/luci-static/resources/fchomo.js:1528 +#: htdocs/luci-static/resources/fchomo.js:1551 +#: htdocs/luci-static/resources/fchomo.js:1554 +#: htdocs/luci-static/resources/fchomo.js:1561 +#: htdocs/luci-static/resources/fchomo.js:1579 +#: htdocs/luci-static/resources/fchomo.js:1582 +#: htdocs/luci-static/resources/fchomo.js:1592 +#: htdocs/luci-static/resources/fchomo.js:1605 +#: htdocs/luci-static/resources/fchomo.js:1607 +#: htdocs/luci-static/resources/fchomo.js:1620 +#: htdocs/luci-static/resources/fchomo.js:1629 +#: htdocs/luci-static/resources/fchomo.js:1636 +#: htdocs/luci-static/resources/fchomo.js:1645 +#: htdocs/luci-static/resources/fchomo.js:1657 +#: htdocs/luci-static/resources/fchomo.js:1660 +#: htdocs/luci-static/resources/fchomo.js:1670 #: htdocs/luci-static/resources/view/fchomo/client.js:66 #: htdocs/luci-static/resources/view/fchomo/client.js:900 -#: htdocs/luci-static/resources/view/fchomo/client.js:1355 -#: htdocs/luci-static/resources/view/fchomo/global.js:851 -#: htdocs/luci-static/resources/view/fchomo/node.js:622 -#: htdocs/luci-static/resources/view/fchomo/node.js:1331 -#: htdocs/luci-static/resources/view/fchomo/node.js:1353 -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:272 -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:286 +#: htdocs/luci-static/resources/view/fchomo/client.js:1380 +#: htdocs/luci-static/resources/view/fchomo/global.js:856 +#: htdocs/luci-static/resources/view/fchomo/node.js:641 +#: htdocs/luci-static/resources/view/fchomo/node.js:1350 +#: htdocs/luci-static/resources/view/fchomo/node.js:1372 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:280 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:294 msgid "Expecting: %s" msgstr "请输入:%s" -#: htdocs/luci-static/resources/view/fchomo/node.js:699 -#: htdocs/luci-static/resources/view/fchomo/node.js:706 -#: htdocs/luci-static/resources/view/fchomo/server.js:470 -#: htdocs/luci-static/resources/view/fchomo/server.js:477 +#: htdocs/luci-static/resources/view/fchomo/node.js:718 +#: htdocs/luci-static/resources/view/fchomo/node.js:725 +#: htdocs/luci-static/resources/view/fchomo/server.js:482 +#: htdocs/luci-static/resources/view/fchomo/server.js:489 msgid "Expecting: only support %s." msgstr "请输入:仅支援 %s." -#: htdocs/luci-static/resources/view/fchomo/global.js:700 +#: htdocs/luci-static/resources/view/fchomo/global.js:690 msgid "Experimental" msgstr "实验性" @@ -840,62 +875,62 @@ msgstr "实验性" msgid "Factor" msgstr "条件" -#: htdocs/luci-static/resources/fchomo.js:1049 +#: htdocs/luci-static/resources/fchomo.js:1431 msgid "Failed to execute \"/etc/init.d/fchomo %s %s\" reason: %s" msgstr "无法执行 \"/etc/init.d/fchomo %s %s\" 原因: %s" -#: htdocs/luci-static/resources/fchomo.js:1008 +#: htdocs/luci-static/resources/fchomo.js:1390 msgid "Failed to generate %s, error: %s." -msgstr "" +msgstr "生成 %s 失败,错误:%s。" -#: htdocs/luci-static/resources/fchomo.js:1366 +#: htdocs/luci-static/resources/fchomo.js:1770 msgid "Failed to upload %s, error: %s." msgstr "上传 %s 失败,错误:%s。" -#: htdocs/luci-static/resources/fchomo.js:1385 +#: htdocs/luci-static/resources/fchomo.js:1789 msgid "Failed to upload, error: %s." msgstr "上传失败,错误:%s。" -#: htdocs/luci-static/resources/fchomo.js:186 +#: htdocs/luci-static/resources/fchomo.js:194 msgid "Fallback" msgstr "自动回退" -#: htdocs/luci-static/resources/view/fchomo/client.js:1271 -#: htdocs/luci-static/resources/view/fchomo/client.js:1272 -#: htdocs/luci-static/resources/view/fchomo/client.js:1283 +#: htdocs/luci-static/resources/view/fchomo/client.js:1280 +#: htdocs/luci-static/resources/view/fchomo/client.js:1281 +#: htdocs/luci-static/resources/view/fchomo/client.js:1292 msgid "Fallback DNS server" msgstr "後備 DNS 服务器" -#: htdocs/luci-static/resources/view/fchomo/client.js:1616 +#: htdocs/luci-static/resources/view/fchomo/client.js:1647 msgid "Fallback filter" msgstr "後備过滤器" #: htdocs/luci-static/resources/view/fchomo/client.js:1038 -#: htdocs/luci-static/resources/view/fchomo/node.js:1240 +#: htdocs/luci-static/resources/view/fchomo/node.js:1259 msgid "Filter nodes that meet keywords or regexps." msgstr "过滤匹配关键字或表达式的节点。" -#: htdocs/luci-static/resources/view/fchomo/client.js:1265 -#: htdocs/luci-static/resources/view/fchomo/client.js:1282 +#: htdocs/luci-static/resources/view/fchomo/client.js:1274 +#: htdocs/luci-static/resources/view/fchomo/client.js:1291 msgid "Final DNS server" msgstr "兜底 DNS 服务器" -#: htdocs/luci-static/resources/view/fchomo/client.js:1265 -#: htdocs/luci-static/resources/view/fchomo/client.js:1279 +#: htdocs/luci-static/resources/view/fchomo/client.js:1274 +#: htdocs/luci-static/resources/view/fchomo/client.js:1288 msgid "Final DNS server (For non-poisoned domains)" msgstr "兜底 DNS 服务器 (用于未被投毒污染的域名)" -#: htdocs/luci-static/resources/view/fchomo/client.js:1272 -#: htdocs/luci-static/resources/view/fchomo/client.js:1280 +#: htdocs/luci-static/resources/view/fchomo/client.js:1281 +#: htdocs/luci-static/resources/view/fchomo/client.js:1289 msgid "Final DNS server (For poisoned domains)" msgstr "兜底 DNS 服务器 (用于已被投毒污染的域名)" -#: htdocs/luci-static/resources/view/fchomo/server.js:80 +#: htdocs/luci-static/resources/view/fchomo/server.js:81 msgid "Firewall" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:366 -#: htdocs/luci-static/resources/view/fchomo/server.js:249 +#: htdocs/luci-static/resources/view/fchomo/node.js:380 +#: htdocs/luci-static/resources/view/fchomo/server.js:250 msgid "Flow" msgstr "流控" @@ -908,8 +943,8 @@ msgstr "" "noopener\">%s." #: htdocs/luci-static/resources/view/fchomo/client.js:1004 -#: htdocs/luci-static/resources/view/fchomo/node.js:1109 -#: htdocs/luci-static/resources/view/fchomo/node.js:1232 +#: htdocs/luci-static/resources/view/fchomo/node.js:1128 +#: htdocs/luci-static/resources/view/fchomo/node.js:1251 msgid "" "For format see %s." @@ -917,26 +952,26 @@ msgstr "" "格式请参阅 %s." -#: htdocs/luci-static/resources/view/fchomo/node.js:464 +#: htdocs/luci-static/resources/view/fchomo/node.js:478 msgid "Force DNS remote resolution." msgstr "强制 DNS 远程解析。" -#: htdocs/luci-static/resources/view/fchomo/global.js:660 +#: htdocs/luci-static/resources/view/fchomo/global.js:650 msgid "Forced sniffing domain" msgstr "强制嗅探域名" -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:277 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:285 msgid "Format" msgstr "格式" #: htdocs/luci-static/resources/view/fchomo/global.js:138 -#: htdocs/luci-static/resources/view/fchomo/log.js:97 -#: htdocs/luci-static/resources/view/fchomo/log.js:102 +#: htdocs/luci-static/resources/view/fchomo/log.js:142 +#: htdocs/luci-static/resources/view/fchomo/log.js:147 #: root/usr/share/luci/menu.d/luci-app-fchomo.json:3 msgid "FullCombo Shark!" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:725 +#: htdocs/luci-static/resources/view/fchomo/node.js:744 msgid "GET" msgstr "" @@ -950,7 +985,7 @@ msgstr "常规" #: htdocs/luci-static/resources/view/fchomo/client.js:891 #: htdocs/luci-static/resources/view/fchomo/node.js:90 -#: htdocs/luci-static/resources/view/fchomo/node.js:1001 +#: htdocs/luci-static/resources/view/fchomo/node.js:1020 #: htdocs/luci-static/resources/view/fchomo/server.js:64 msgid "General fields" msgstr "常规字段" @@ -959,16 +994,17 @@ msgstr "常规字段" msgid "General settings" msgstr "常规设置" -#: htdocs/luci-static/resources/fchomo.js:429 -#: htdocs/luci-static/resources/fchomo.js:431 +#: htdocs/luci-static/resources/fchomo.js:443 #: htdocs/luci-static/resources/fchomo.js:445 -#: htdocs/luci-static/resources/fchomo.js:447 -#: htdocs/luci-static/resources/view/fchomo/global.js:588 -#: htdocs/luci-static/resources/view/fchomo/server.js:396 +#: htdocs/luci-static/resources/fchomo.js:459 +#: htdocs/luci-static/resources/fchomo.js:461 +#: htdocs/luci-static/resources/fchomo.js:1331 +#: htdocs/luci-static/resources/view/fchomo/global.js:578 +#: htdocs/luci-static/resources/view/fchomo/server.js:407 msgid "Generate" msgstr "生成" -#: htdocs/luci-static/resources/view/fchomo/global.js:518 +#: htdocs/luci-static/resources/view/fchomo/global.js:506 msgid "Generic segmentation offload" msgstr "通用分段卸载(GSO)" @@ -980,21 +1016,21 @@ msgstr "GeoIP 版本" msgid "GeoSite version" msgstr "GeoSite 版本" -#: htdocs/luci-static/resources/view/fchomo/client.js:1626 +#: htdocs/luci-static/resources/view/fchomo/client.js:1657 msgid "Geoip code" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1623 +#: htdocs/luci-static/resources/view/fchomo/client.js:1654 msgid "Geoip enable" msgstr "Geoip 启用" -#: htdocs/luci-static/resources/view/fchomo/client.js:1568 -#: htdocs/luci-static/resources/view/fchomo/client.js:1577 -#: htdocs/luci-static/resources/view/fchomo/client.js:1635 +#: htdocs/luci-static/resources/view/fchomo/client.js:1599 +#: htdocs/luci-static/resources/view/fchomo/client.js:1608 +#: htdocs/luci-static/resources/view/fchomo/client.js:1666 msgid "Geosite" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:42 +#: htdocs/luci-static/resources/fchomo.js:40 msgid "GitHub" msgstr "" @@ -1003,23 +1039,23 @@ msgstr "" msgid "Global" msgstr "全局" -#: htdocs/luci-static/resources/view/fchomo/global.js:437 +#: htdocs/luci-static/resources/view/fchomo/global.js:435 msgid "Global Authentication" msgstr "全局认证" -#: htdocs/luci-static/resources/view/fchomo/global.js:543 +#: htdocs/luci-static/resources/view/fchomo/global.js:531 msgid "Global client fingerprint" msgstr "全局客户端指纹" -#: htdocs/luci-static/resources/view/fchomo/node.js:390 +#: htdocs/luci-static/resources/view/fchomo/node.js:404 msgid "Global padding" msgstr "全局填充" -#: htdocs/luci-static/resources/fchomo.js:41 +#: htdocs/luci-static/resources/fchomo.js:39 msgid "Google" msgstr "谷歌" -#: htdocs/luci-static/resources/fchomo.js:198 +#: htdocs/luci-static/resources/fchomo.js:206 msgid "Google FCM ports" msgstr "谷歌 FCM 端口" @@ -1031,79 +1067,79 @@ msgstr "授予 fchomo 访问 UCI 配置的权限" msgid "Group" msgstr "组" -#: htdocs/luci-static/resources/fchomo.js:118 -#: htdocs/luci-static/resources/fchomo.js:148 -#: htdocs/luci-static/resources/view/fchomo/node.js:486 -#: htdocs/luci-static/resources/view/fchomo/node.js:688 -#: htdocs/luci-static/resources/view/fchomo/node.js:699 -#: htdocs/luci-static/resources/view/fchomo/server.js:470 +#: htdocs/luci-static/resources/fchomo.js:124 +#: htdocs/luci-static/resources/fchomo.js:154 +#: htdocs/luci-static/resources/view/fchomo/node.js:500 +#: htdocs/luci-static/resources/view/fchomo/node.js:707 +#: htdocs/luci-static/resources/view/fchomo/node.js:718 +#: htdocs/luci-static/resources/view/fchomo/server.js:482 msgid "HTTP" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:134 -#: htdocs/luci-static/resources/view/fchomo/node.js:747 -#: htdocs/luci-static/resources/view/fchomo/node.js:1089 +#: htdocs/luci-static/resources/view/fchomo/node.js:135 +#: htdocs/luci-static/resources/view/fchomo/node.js:766 +#: htdocs/luci-static/resources/view/fchomo/node.js:1108 msgid "HTTP header" msgstr "HTTP header" -#: htdocs/luci-static/resources/view/fchomo/node.js:724 +#: htdocs/luci-static/resources/view/fchomo/node.js:743 msgid "HTTP request method" msgstr "HTTP 请求方法" -#: htdocs/luci-static/resources/view/fchomo/client.js:1407 +#: htdocs/luci-static/resources/view/fchomo/client.js:1432 msgid "HTTP/3" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/server.js:155 +#: htdocs/luci-static/resources/view/fchomo/server.js:156 msgid "" "HTTP3 server behavior when authentication fails.
A 404 page will be " "returned if empty." msgstr "身份验证失败时的 HTTP3 服务器响应。默认返回 404 页面。" -#: htdocs/luci-static/resources/view/fchomo/node.js:689 -#: htdocs/luci-static/resources/view/fchomo/node.js:700 -#: htdocs/luci-static/resources/view/fchomo/server.js:471 +#: htdocs/luci-static/resources/view/fchomo/node.js:708 +#: htdocs/luci-static/resources/view/fchomo/node.js:719 +#: htdocs/luci-static/resources/view/fchomo/server.js:483 msgid "HTTPUpgrade" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:826 +#: htdocs/luci-static/resources/view/fchomo/global.js:831 msgid "Handle domain" msgstr "处理域名" -#: htdocs/luci-static/resources/view/fchomo/node.js:231 +#: htdocs/luci-static/resources/view/fchomo/node.js:232 msgid "Handshake mode" msgstr "握手模式" -#: htdocs/luci-static/resources/view/fchomo/server.js:271 +#: htdocs/luci-static/resources/view/fchomo/server.js:272 msgid "Handshake target that supports TLS 1.3" msgstr "握手目标 (支援 TLS 1.3)" #: htdocs/luci-static/resources/view/fchomo/client.js:973 -#: htdocs/luci-static/resources/view/fchomo/node.js:1200 +#: htdocs/luci-static/resources/view/fchomo/node.js:1219 msgid "Health check URL" msgstr "健康检查 URL" #: htdocs/luci-static/resources/view/fchomo/client.js:1002 -#: htdocs/luci-static/resources/view/fchomo/node.js:1230 +#: htdocs/luci-static/resources/view/fchomo/node.js:1249 msgid "Health check expected status" msgstr "健康检查预期状态" #: htdocs/luci-static/resources/view/fchomo/client.js:982 -#: htdocs/luci-static/resources/view/fchomo/node.js:1210 +#: htdocs/luci-static/resources/view/fchomo/node.js:1229 msgid "Health check interval" msgstr "健康检查间隔" #: htdocs/luci-static/resources/view/fchomo/client.js:989 -#: htdocs/luci-static/resources/view/fchomo/node.js:1217 +#: htdocs/luci-static/resources/view/fchomo/node.js:1236 msgid "Health check timeout" msgstr "健康检查超时" #: htdocs/luci-static/resources/view/fchomo/client.js:893 -#: htdocs/luci-static/resources/view/fchomo/node.js:1003 +#: htdocs/luci-static/resources/view/fchomo/node.js:1022 msgid "Health fields" msgstr "健康字段" -#: htdocs/luci-static/resources/view/fchomo/node.js:301 +#: htdocs/luci-static/resources/view/fchomo/node.js:309 msgid "Heartbeat interval" msgstr "心跳间隔" @@ -1111,15 +1147,15 @@ msgstr "心跳间隔" msgid "Hidden" msgstr "隐藏" -#: htdocs/luci-static/resources/view/fchomo/node.js:492 +#: htdocs/luci-static/resources/view/fchomo/node.js:506 msgid "Host that supports TLS 1.3" msgstr "主机名称 (支援 TLS 1.3)" -#: htdocs/luci-static/resources/view/fchomo/node.js:187 +#: htdocs/luci-static/resources/view/fchomo/node.js:188 msgid "Host-key" msgstr "主机密钥" -#: htdocs/luci-static/resources/view/fchomo/node.js:182 +#: htdocs/luci-static/resources/view/fchomo/node.js:183 msgid "Host-key algorithms" msgstr "主机密钥算法" @@ -1128,39 +1164,39 @@ msgstr "主机密钥算法" msgid "Hosts" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:127 -#: htdocs/luci-static/resources/fchomo.js:159 +#: htdocs/luci-static/resources/fchomo.js:133 +#: htdocs/luci-static/resources/fchomo.js:165 msgid "Hysteria2" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1628 -#: htdocs/luci-static/resources/view/fchomo/client.js:1641 +#: htdocs/luci-static/resources/view/fchomo/client.js:1659 +#: htdocs/luci-static/resources/view/fchomo/client.js:1672 msgid "IP" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1639 +#: htdocs/luci-static/resources/view/fchomo/client.js:1670 msgid "IP CIDR" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:254 +#: htdocs/luci-static/resources/view/fchomo/node.js:262 msgid "IP override" msgstr "IP 覆写" -#: htdocs/luci-static/resources/view/fchomo/node.js:878 -#: htdocs/luci-static/resources/view/fchomo/node.js:1186 +#: htdocs/luci-static/resources/view/fchomo/node.js:897 +#: htdocs/luci-static/resources/view/fchomo/node.js:1205 msgid "IP version" msgstr "IP 版本" -#: htdocs/luci-static/resources/fchomo.js:134 +#: htdocs/luci-static/resources/fchomo.js:140 msgid "IPv4 only" msgstr "仅 IPv4" -#: htdocs/luci-static/resources/fchomo.js:135 +#: htdocs/luci-static/resources/fchomo.js:141 msgid "IPv6 only" msgstr "仅 IPv6" -#: htdocs/luci-static/resources/view/fchomo/client.js:1247 -#: htdocs/luci-static/resources/view/fchomo/global.js:417 +#: htdocs/luci-static/resources/view/fchomo/client.js:1256 +#: htdocs/luci-static/resources/view/fchomo/global.js:415 msgid "IPv6 support" msgstr "IPv6 支持" @@ -1168,19 +1204,19 @@ msgstr "IPv6 支持" msgid "Icon" msgstr "图标" -#: htdocs/luci-static/resources/view/fchomo/node.js:339 +#: htdocs/luci-static/resources/view/fchomo/node.js:353 msgid "Idle session check interval" msgstr "闲置会话检查间隔" -#: htdocs/luci-static/resources/view/fchomo/node.js:346 +#: htdocs/luci-static/resources/view/fchomo/node.js:360 msgid "Idle session timeout" msgstr "闲置会话超时" -#: htdocs/luci-static/resources/view/fchomo/server.js:200 +#: htdocs/luci-static/resources/view/fchomo/server.js:201 msgid "Idle timeout" msgstr "闲置超时" -#: htdocs/luci-static/resources/fchomo.js:1150 +#: htdocs/luci-static/resources/fchomo.js:1554 msgid "If All ports is selected, uncheck others" msgstr "如果选择了“所有端口”,则取消选中“其他”" @@ -1188,11 +1224,11 @@ msgstr "如果选择了“所有端口”,则取消选中“其他”" msgid "If Block is selected, uncheck others" msgstr "如果选择了“阻止”,则取消选中“其他”" -#: htdocs/luci-static/resources/view/fchomo/server.js:134 +#: htdocs/luci-static/resources/view/fchomo/server.js:135 msgid "Ignore client bandwidth" msgstr "忽略客户端带宽" -#: htdocs/luci-static/resources/fchomo.js:553 +#: htdocs/luci-static/resources/fchomo.js:568 msgid "Import" msgstr "导入" @@ -1200,14 +1236,14 @@ msgstr "导入" #: htdocs/luci-static/resources/view/fchomo/client.js:885 #: htdocs/luci-static/resources/view/fchomo/client.js:1082 #: htdocs/luci-static/resources/view/fchomo/client.js:1124 -#: htdocs/luci-static/resources/view/fchomo/client.js:1183 -#: htdocs/luci-static/resources/view/fchomo/client.js:1211 -#: htdocs/luci-static/resources/view/fchomo/client.js:1305 -#: htdocs/luci-static/resources/view/fchomo/client.js:1329 -#: htdocs/luci-static/resources/view/fchomo/client.js:1526 +#: htdocs/luci-static/resources/view/fchomo/client.js:1192 +#: htdocs/luci-static/resources/view/fchomo/client.js:1220 +#: htdocs/luci-static/resources/view/fchomo/client.js:1314 +#: htdocs/luci-static/resources/view/fchomo/client.js:1354 #: htdocs/luci-static/resources/view/fchomo/client.js:1551 -#: htdocs/luci-static/resources/view/fchomo/node.js:903 -#: htdocs/luci-static/resources/view/fchomo/node.js:989 +#: htdocs/luci-static/resources/view/fchomo/client.js:1576 +#: htdocs/luci-static/resources/view/fchomo/node.js:922 +#: htdocs/luci-static/resources/view/fchomo/node.js:1008 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:142 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:230 msgid "Import mihomo config" @@ -1219,49 +1255,56 @@ msgstr "导入 mihomo 配置" msgid "Import rule-set links" msgstr "导入规则集链接" -#: htdocs/luci-static/resources/view/fchomo/node.js:147 -#: htdocs/luci-static/resources/view/fchomo/node.js:153 -#: htdocs/luci-static/resources/view/fchomo/node.js:1147 -#: htdocs/luci-static/resources/view/fchomo/node.js:1153 -#: htdocs/luci-static/resources/view/fchomo/server.js:123 -#: htdocs/luci-static/resources/view/fchomo/server.js:129 +#: htdocs/luci-static/resources/view/fchomo/node.js:148 +#: htdocs/luci-static/resources/view/fchomo/node.js:154 +#: htdocs/luci-static/resources/view/fchomo/node.js:1166 +#: htdocs/luci-static/resources/view/fchomo/node.js:1172 +#: htdocs/luci-static/resources/view/fchomo/server.js:124 +#: htdocs/luci-static/resources/view/fchomo/server.js:130 msgid "In Mbps." msgstr "单位为 Mbps。" -#: htdocs/luci-static/resources/view/fchomo/node.js:1067 -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:346 +#: htdocs/luci-static/resources/view/fchomo/node.js:1086 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:354 msgid "In bytes. %s will be used if empty." msgstr "单位为字节。留空则使用 %s。" -#: htdocs/luci-static/resources/view/fchomo/node.js:302 -#: htdocs/luci-static/resources/view/fchomo/node.js:309 +#: htdocs/luci-static/resources/view/fchomo/node.js:310 +#: htdocs/luci-static/resources/view/fchomo/node.js:317 msgid "In millisecond." msgstr "单位为毫秒。" #: htdocs/luci-static/resources/view/fchomo/client.js:990 #: htdocs/luci-static/resources/view/fchomo/client.js:1019 -#: htdocs/luci-static/resources/view/fchomo/node.js:1218 +#: htdocs/luci-static/resources/view/fchomo/node.js:1237 msgid "In millisecond. %s will be used if empty." msgstr "单位为毫秒。留空则使用 %s。" -#: htdocs/luci-static/resources/view/fchomo/node.js:340 -#: htdocs/luci-static/resources/view/fchomo/node.js:347 -#: htdocs/luci-static/resources/view/fchomo/server.js:201 -#: htdocs/luci-static/resources/view/fchomo/server.js:208 +#: htdocs/luci-static/resources/view/fchomo/node.js:354 +#: htdocs/luci-static/resources/view/fchomo/node.js:361 +#: htdocs/luci-static/resources/view/fchomo/server.js:202 +#: htdocs/luci-static/resources/view/fchomo/server.js:209 msgid "In seconds." msgstr "单位为秒。" #: htdocs/luci-static/resources/view/fchomo/client.js:983 -#: htdocs/luci-static/resources/view/fchomo/global.js:427 -#: htdocs/luci-static/resources/view/fchomo/global.js:432 -#: htdocs/luci-static/resources/view/fchomo/global.js:527 -#: htdocs/luci-static/resources/view/fchomo/node.js:1073 -#: htdocs/luci-static/resources/view/fchomo/node.js:1211 -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:352 +#: htdocs/luci-static/resources/view/fchomo/global.js:425 +#: htdocs/luci-static/resources/view/fchomo/global.js:430 +#: htdocs/luci-static/resources/view/fchomo/global.js:515 +#: htdocs/luci-static/resources/view/fchomo/node.js:1092 +#: htdocs/luci-static/resources/view/fchomo/node.js:1230 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:360 msgid "In seconds. %s will be used if empty." msgstr "单位为秒。留空则使用 %s。" -#: htdocs/luci-static/resources/view/fchomo/global.js:451 +#: htdocs/luci-static/resources/fchomo.js:1246 +msgid "" +"In the order of one Padding-Length and one Padding-" +"Interval, infinite concatenation." +msgstr "" +"按照一个 Padding-Length 一个 Padding-Interval 的顺序,无限连接。" + +#: htdocs/luci-static/resources/view/fchomo/global.js:449 msgid "Inbound" msgstr "入站" @@ -1289,46 +1332,50 @@ msgstr "引入所有代理节点及供应商。" msgid "Includes all Proxy Node." msgstr "引入所有代理节点。" -#: htdocs/luci-static/resources/view/fchomo/global.js:410 +#: htdocs/luci-static/resources/fchomo.js:71 msgid "Info" msgstr "信息" -#: htdocs/luci-static/resources/view/fchomo/node.js:1018 -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:260 +#: htdocs/luci-static/resources/view/fchomo/node.js:1037 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:268 msgid "Inline" msgstr "内嵌" -#: htdocs/luci-static/resources/view/fchomo/global.js:728 +#: htdocs/luci-static/resources/view/fchomo/global.js:718 msgid "Interface Control" msgstr "接口控制" -#: htdocs/luci-static/resources/fchomo.js:132 +#: htdocs/luci-static/resources/fchomo.js:138 msgid "Keep default" msgstr "保持缺省" -#: htdocs/luci-static/resources/view/fchomo/server.js:350 +#: htdocs/luci-static/resources/view/fchomo/server.js:359 msgid "Key path" msgstr "证书路径" +#: htdocs/luci-static/resources/fchomo.js:1266 +msgid "Keypairs" +msgstr "密钥对" + #: htdocs/luci-static/resources/view/fchomo/client.js:896 #: htdocs/luci-static/resources/view/fchomo/client.js:1130 -#: htdocs/luci-static/resources/view/fchomo/client.js:1217 -#: htdocs/luci-static/resources/view/fchomo/client.js:1335 -#: htdocs/luci-static/resources/view/fchomo/client.js:1557 -#: htdocs/luci-static/resources/view/fchomo/node.js:96 -#: htdocs/luci-static/resources/view/fchomo/node.js:1006 -#: htdocs/luci-static/resources/view/fchomo/node.js:1279 +#: htdocs/luci-static/resources/view/fchomo/client.js:1226 +#: htdocs/luci-static/resources/view/fchomo/client.js:1360 +#: htdocs/luci-static/resources/view/fchomo/client.js:1582 +#: htdocs/luci-static/resources/view/fchomo/node.js:97 +#: htdocs/luci-static/resources/view/fchomo/node.js:1025 +#: htdocs/luci-static/resources/view/fchomo/node.js:1298 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:248 -#: htdocs/luci-static/resources/view/fchomo/server.js:71 +#: htdocs/luci-static/resources/view/fchomo/server.js:72 msgid "Label" msgstr "标签" #: htdocs/luci-static/resources/view/fchomo/client.js:996 -#: htdocs/luci-static/resources/view/fchomo/node.js:1224 +#: htdocs/luci-static/resources/view/fchomo/node.js:1243 msgid "Lazy" msgstr "懒惰状态" -#: htdocs/luci-static/resources/view/fchomo/server.js:258 +#: htdocs/luci-static/resources/view/fchomo/server.js:259 msgid "" "Legacy protocol support (VMess MD5 Authentication) is provided for " "compatibility purposes only, use of alterId > 1 is not recommended." @@ -1336,51 +1383,50 @@ msgstr "" "提供旧协议支持(VMess MD5 身份验证)仅出于兼容性目的,不建议使用 alterId > " "1。" -#: htdocs/luci-static/resources/view/fchomo/global.js:496 -#: htdocs/luci-static/resources/view/fchomo/global.js:511 +#: htdocs/luci-static/resources/view/fchomo/global.js:494 msgid "Less compatibility and sometimes better performance." msgstr "有时性能更好。" -#: htdocs/luci-static/resources/view/fchomo/node.js:578 -#: htdocs/luci-static/resources/view/fchomo/server.js:331 +#: htdocs/luci-static/resources/view/fchomo/node.js:597 +#: htdocs/luci-static/resources/view/fchomo/server.js:340 msgid "List of supported application level protocols, in order of preference." msgstr "支持的应用层协议协商列表,按顺序排列。" -#: htdocs/luci-static/resources/view/fchomo/server.js:91 +#: htdocs/luci-static/resources/view/fchomo/server.js:92 msgid "Listen address" msgstr "监听地址" -#: htdocs/luci-static/resources/view/fchomo/server.js:68 +#: htdocs/luci-static/resources/view/fchomo/server.js:69 msgid "Listen fields" msgstr "监听字段" -#: htdocs/luci-static/resources/view/fchomo/global.js:730 +#: htdocs/luci-static/resources/view/fchomo/global.js:720 msgid "Listen interfaces" msgstr "监听接口" -#: htdocs/luci-static/resources/view/fchomo/client.js:1242 -#: htdocs/luci-static/resources/view/fchomo/server.js:96 +#: htdocs/luci-static/resources/view/fchomo/client.js:1251 +#: htdocs/luci-static/resources/view/fchomo/server.js:97 msgid "Listen port" msgstr "监听端口" -#: htdocs/luci-static/resources/view/fchomo/global.js:454 +#: htdocs/luci-static/resources/view/fchomo/global.js:452 msgid "Listen ports" msgstr "监听端口" -#: htdocs/luci-static/resources/fchomo.js:188 +#: htdocs/luci-static/resources/fchomo.js:196 msgid "Load balance" msgstr "负载均衡" -#: htdocs/luci-static/resources/view/fchomo/node.js:1016 -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:258 +#: htdocs/luci-static/resources/view/fchomo/node.js:1035 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:266 msgid "Local" msgstr "本地" -#: htdocs/luci-static/resources/view/fchomo/node.js:417 +#: htdocs/luci-static/resources/view/fchomo/node.js:431 msgid "Local IPv6 address" msgstr "本地 IPv6 地址" -#: htdocs/luci-static/resources/view/fchomo/node.js:410 +#: htdocs/luci-static/resources/view/fchomo/node.js:424 msgid "Local address" msgstr "本地地址" @@ -1388,11 +1434,11 @@ msgstr "本地地址" msgid "Log" msgstr "日志" -#: htdocs/luci-static/resources/view/fchomo/log.js:54 +#: htdocs/luci-static/resources/view/fchomo/log.js:98 msgid "Log file does not exist." msgstr "日志文件不存在。" -#: htdocs/luci-static/resources/view/fchomo/log.js:47 +#: htdocs/luci-static/resources/view/fchomo/log.js:91 msgid "Log is empty." msgstr "日志为空。" @@ -1400,53 +1446,53 @@ msgstr "日志为空。" msgid "Log level" msgstr "日志等级" -#: htdocs/luci-static/resources/fchomo.js:334 +#: htdocs/luci-static/resources/fchomo.js:342 msgid "Lowercase only" msgstr "仅限小写" -#: htdocs/luci-static/resources/view/fchomo/global.js:514 -#: htdocs/luci-static/resources/view/fchomo/node.js:457 +#: htdocs/luci-static/resources/view/fchomo/global.js:502 +#: htdocs/luci-static/resources/view/fchomo/node.js:471 msgid "MTU" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/server.js:154 +#: htdocs/luci-static/resources/view/fchomo/server.js:155 msgid "Masquerade" msgstr "伪装" -#: htdocs/luci-static/resources/view/fchomo/client.js:1573 +#: htdocs/luci-static/resources/view/fchomo/client.js:1604 msgid "Match domain. Support wildcards." msgstr "匹配域名。支持通配符。" -#: htdocs/luci-static/resources/view/fchomo/client.js:1645 +#: htdocs/luci-static/resources/view/fchomo/client.js:1676 msgid "Match domain. Support wildcards.
" msgstr "匹配域名。支持通配符。
" -#: htdocs/luci-static/resources/view/fchomo/client.js:1578 +#: htdocs/luci-static/resources/view/fchomo/client.js:1609 msgid "Match geosite." msgstr "匹配 geosite。" -#: htdocs/luci-static/resources/view/fchomo/client.js:1636 +#: htdocs/luci-static/resources/view/fchomo/client.js:1667 msgid "Match geosite.
" msgstr "匹配 geosite。
" -#: htdocs/luci-static/resources/view/fchomo/client.js:1627 +#: htdocs/luci-static/resources/view/fchomo/client.js:1658 msgid "Match response with geoip.
" msgstr "匹配响应通过 geoip。
" -#: htdocs/luci-static/resources/view/fchomo/client.js:1640 +#: htdocs/luci-static/resources/view/fchomo/client.js:1671 msgid "Match response with ipcidr.
" msgstr "匹配响应通过 ipcidr
" -#: htdocs/luci-static/resources/view/fchomo/client.js:1583 +#: htdocs/luci-static/resources/view/fchomo/client.js:1614 msgid "Match rule set." msgstr "匹配规则集。" -#: htdocs/luci-static/resources/view/fchomo/node.js:757 +#: htdocs/luci-static/resources/view/fchomo/node.js:776 msgid "Max Early Data" msgstr "前置数据最大值" -#: htdocs/luci-static/resources/view/fchomo/node.js:288 -#: htdocs/luci-static/resources/view/fchomo/server.js:194 +#: htdocs/luci-static/resources/view/fchomo/node.js:296 +#: htdocs/luci-static/resources/view/fchomo/server.js:195 msgid "Max UDP relay packet size" msgstr "UDP 中继数据包最大尺寸" @@ -1454,26 +1500,26 @@ msgstr "UDP 中继数据包最大尺寸" msgid "Max count of failures" msgstr "最大失败次数" -#: htdocs/luci-static/resources/view/fchomo/node.js:152 -#: htdocs/luci-static/resources/view/fchomo/server.js:128 +#: htdocs/luci-static/resources/view/fchomo/node.js:153 +#: htdocs/luci-static/resources/view/fchomo/server.js:129 msgid "Max download speed" msgstr "最大下载速度" -#: htdocs/luci-static/resources/view/fchomo/node.js:314 +#: htdocs/luci-static/resources/view/fchomo/node.js:323 msgid "Max open streams" msgstr "限制打开流的数量" -#: htdocs/luci-static/resources/view/fchomo/node.js:146 -#: htdocs/luci-static/resources/view/fchomo/server.js:122 +#: htdocs/luci-static/resources/view/fchomo/node.js:147 +#: htdocs/luci-static/resources/view/fchomo/server.js:123 msgid "Max upload speed" msgstr "最大上传速度" -#: htdocs/luci-static/resources/view/fchomo/node.js:794 -#: htdocs/luci-static/resources/view/fchomo/node.js:810 +#: htdocs/luci-static/resources/view/fchomo/node.js:813 +#: htdocs/luci-static/resources/view/fchomo/node.js:829 msgid "Maximum connections" msgstr "最大连接数" -#: htdocs/luci-static/resources/view/fchomo/node.js:808 +#: htdocs/luci-static/resources/view/fchomo/node.js:827 msgid "" "Maximum multiplexed streams in a connection before opening a new connection." "
Conflict with %s and %s." @@ -1481,64 +1527,63 @@ msgstr "" "在打开新连接之前,连接中的最大多路复用流数量。
%s 和 " "%s 冲突。" -#: htdocs/luci-static/resources/view/fchomo/node.js:807 +#: htdocs/luci-static/resources/view/fchomo/node.js:826 msgid "Maximum streams" msgstr "最大流数量" -#: htdocs/luci-static/resources/fchomo.js:152 +#: htdocs/luci-static/resources/fchomo.js:158 msgid "Mieru" msgstr "" #: htdocs/luci-static/resources/view/fchomo/client.js:781 -#: htdocs/luci-static/resources/view/fchomo/log.js:106 -#: htdocs/luci-static/resources/view/fchomo/log.js:111 +#: htdocs/luci-static/resources/view/fchomo/log.js:151 +#: htdocs/luci-static/resources/view/fchomo/log.js:156 msgid "Mihomo client" msgstr "Mihomo 客户端" -#: htdocs/luci-static/resources/view/fchomo/log.js:115 -#: htdocs/luci-static/resources/view/fchomo/log.js:120 +#: htdocs/luci-static/resources/view/fchomo/log.js:160 +#: htdocs/luci-static/resources/view/fchomo/log.js:165 #: htdocs/luci-static/resources/view/fchomo/server.js:24 msgid "Mihomo server" msgstr "Mihomo 服务端" -#: htdocs/luci-static/resources/view/fchomo/node.js:353 +#: htdocs/luci-static/resources/view/fchomo/node.js:367 msgid "Min of idle sessions to keep" msgstr "要保留的最少闲置会话数" -#: htdocs/luci-static/resources/view/fchomo/node.js:801 +#: htdocs/luci-static/resources/view/fchomo/node.js:820 msgid "" "Minimum multiplexed streams in a connection before opening a new connection." msgstr "在打开新连接之前,连接中的最小多路复用流数量。" -#: htdocs/luci-static/resources/view/fchomo/node.js:800 -#: htdocs/luci-static/resources/view/fchomo/node.js:810 +#: htdocs/luci-static/resources/view/fchomo/node.js:819 +#: htdocs/luci-static/resources/view/fchomo/node.js:829 msgid "Minimum streams" msgstr "最小流数量" -#: htdocs/luci-static/resources/fchomo.js:120 -#: htdocs/luci-static/resources/view/fchomo/global.js:499 +#: htdocs/luci-static/resources/fchomo.js:126 +#: htdocs/luci-static/resources/view/fchomo/global.js:497 msgid "Mixed" msgstr "混合" -#: htdocs/luci-static/resources/view/fchomo/global.js:499 -#: htdocs/luci-static/resources/view/fchomo/global.js:507 +#: htdocs/luci-static/resources/view/fchomo/global.js:497 msgid "Mixed system TCP stack and gVisor UDP stack." msgstr "混合 系统 TCP 栈和 gVisor UDP 栈。" -#: htdocs/luci-static/resources/view/fchomo/global.js:457 +#: htdocs/luci-static/resources/view/fchomo/global.js:455 msgid "Mixed port" msgstr "混合端口" -#: htdocs/luci-static/resources/view/fchomo/node.js:780 +#: htdocs/luci-static/resources/view/fchomo/node.js:799 msgid "Multiplex" msgstr "多路复用" -#: htdocs/luci-static/resources/view/fchomo/node.js:93 -#: htdocs/luci-static/resources/view/fchomo/server.js:67 +#: htdocs/luci-static/resources/view/fchomo/node.js:94 +#: htdocs/luci-static/resources/view/fchomo/server.js:68 msgid "Multiplex fields" msgstr "多路复用字段" -#: htdocs/luci-static/resources/view/fchomo/node.js:222 +#: htdocs/luci-static/resources/view/fchomo/node.js:223 msgid "Multiplexing" msgstr "多路复用" @@ -1547,32 +1592,36 @@ msgstr "多路复用" msgid "NOT" msgstr "NOT" -#: htdocs/luci-static/resources/view/fchomo/node.js:1079 +#: htdocs/luci-static/resources/view/fchomo/node.js:1098 msgid "Name of the Proxy group to download provider." msgstr "用于下载供应商订阅的代理组名称。" -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:358 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:366 msgid "Name of the Proxy group to download rule set." msgstr "用于下载规则集订阅的代理组名称。" -#: htdocs/luci-static/resources/view/fchomo/node.js:272 +#: htdocs/luci-static/resources/view/fchomo/node.js:280 msgid "Native" msgstr "原生" -#: htdocs/luci-static/resources/view/fchomo/global.js:445 +#: htdocs/luci-static/resources/fchomo.js:1038 +msgid "Native appearance" +msgstr "原生外观" + +#: htdocs/luci-static/resources/view/fchomo/global.js:443 msgid "No Authentication IP ranges" msgstr "无需认证的 IP 范围" -#: htdocs/luci-static/resources/view/fchomo/client.js:1355 +#: htdocs/luci-static/resources/view/fchomo/client.js:1380 msgid "No add'l params" msgstr "无附加参数" #: htdocs/luci-static/resources/view/fchomo/client.js:997 -#: htdocs/luci-static/resources/view/fchomo/node.js:1225 +#: htdocs/luci-static/resources/view/fchomo/node.js:1244 msgid "No testing is performed when this provider node is not in use." msgstr "当此供应商的节点未使用时,不执行任何测试。" -#: htdocs/luci-static/resources/fchomo.js:504 +#: htdocs/luci-static/resources/fchomo.js:519 msgid "No valid %s found." msgstr "未找到有效的%s。" @@ -1587,17 +1636,17 @@ msgid "Node" msgstr "节点" #: htdocs/luci-static/resources/view/fchomo/client.js:1042 -#: htdocs/luci-static/resources/view/fchomo/node.js:1245 +#: htdocs/luci-static/resources/view/fchomo/node.js:1264 msgid "Node exclude filter" msgstr "排除节点" #: htdocs/luci-static/resources/view/fchomo/client.js:1047 -#: htdocs/luci-static/resources/view/fchomo/node.js:1252 +#: htdocs/luci-static/resources/view/fchomo/node.js:1271 msgid "Node exclude type" msgstr "排除节点类型" #: htdocs/luci-static/resources/view/fchomo/client.js:1037 -#: htdocs/luci-static/resources/view/fchomo/node.js:1239 +#: htdocs/luci-static/resources/view/fchomo/node.js:1258 msgid "Node filter" msgstr "过滤节点" @@ -1605,41 +1654,41 @@ msgstr "过滤节点" msgid "Node switch tolerance" msgstr "节点切换容差" -#: htdocs/luci-static/resources/fchomo.js:305 +#: htdocs/luci-static/resources/fchomo.js:313 msgid "None" msgstr "无" -#: htdocs/luci-static/resources/view/fchomo/global.js:614 +#: htdocs/luci-static/resources/view/fchomo/global.js:604 msgid "Not Installed" msgstr "未安装" -#: htdocs/luci-static/resources/fchomo.js:935 +#: htdocs/luci-static/resources/fchomo.js:950 msgid "Not Running" msgstr "未在运行" -#: htdocs/luci-static/resources/view/fchomo/node.js:485 +#: htdocs/luci-static/resources/view/fchomo/node.js:499 msgid "Obfs Mode" msgstr "Obfs 模式" -#: htdocs/luci-static/resources/view/fchomo/node.js:164 -#: htdocs/luci-static/resources/view/fchomo/server.js:146 +#: htdocs/luci-static/resources/view/fchomo/node.js:165 +#: htdocs/luci-static/resources/view/fchomo/server.js:147 msgid "Obfuscate password" msgstr "混淆密码" -#: htdocs/luci-static/resources/view/fchomo/node.js:158 -#: htdocs/luci-static/resources/view/fchomo/server.js:140 +#: htdocs/luci-static/resources/view/fchomo/node.js:159 +#: htdocs/luci-static/resources/view/fchomo/server.js:141 msgid "Obfuscate type" msgstr "混淆类型" -#: htdocs/luci-static/resources/view/fchomo/global.js:851 +#: htdocs/luci-static/resources/view/fchomo/global.js:856 msgid "One or more numbers in the range 0-63 separated by commas" msgstr "0-63 范围内的一个或多个数字,以逗号分隔" -#: htdocs/luci-static/resources/view/fchomo/global.js:731 +#: htdocs/luci-static/resources/view/fchomo/global.js:721 msgid "Only process traffic from specific interfaces. Leave empty for all." msgstr "只处理来自指定接口的流量。留空表示全部。" -#: htdocs/luci-static/resources/fchomo.js:929 +#: htdocs/luci-static/resources/fchomo.js:944 msgid "Open Dashboard" msgstr "打开面板" @@ -1647,81 +1696,86 @@ msgstr "打开面板" msgid "Operation mode" msgstr "运行模式" -#: htdocs/luci-static/resources/view/fchomo/client.js:1459 -msgid "Override the existing ECS in original request." -msgstr "覆盖原始请求中已有的 ECS。" - -#: htdocs/luci-static/resources/view/fchomo/global.js:656 -#: htdocs/luci-static/resources/view/fchomo/global.js:694 +#: htdocs/luci-static/resources/view/fchomo/global.js:646 +#: htdocs/luci-static/resources/view/fchomo/global.js:684 msgid "Override destination" msgstr "覆盖目标地址" #: htdocs/luci-static/resources/view/fchomo/client.js:892 -#: htdocs/luci-static/resources/view/fchomo/node.js:1002 +#: htdocs/luci-static/resources/view/fchomo/node.js:1021 msgid "Override fields" msgstr "覆盖字段" -#: htdocs/luci-static/resources/view/fchomo/node.js:255 +#: htdocs/luci-static/resources/view/fchomo/node.js:263 msgid "Override the IP address of the server that DNS response." msgstr "覆盖 DNS 回应的服务器的 IP 地址。" -#: htdocs/luci-static/resources/view/fchomo/client.js:1606 +#: htdocs/luci-static/resources/view/fchomo/client.js:1637 msgid "Override the Proxy group of DNS server." msgstr "覆盖 DNS 服务器所使用的代理组。" -#: htdocs/luci-static/resources/view/fchomo/global.js:657 +#: htdocs/luci-static/resources/view/fchomo/global.js:647 msgid "Override the connection destination address with the sniffed domain." msgstr "使用嗅探到的域名覆盖连接目标。" +#: htdocs/luci-static/resources/view/fchomo/client.js:1484 +msgid "Override the existing ECS in original request." +msgstr "覆盖原始请求中已有的 ECS。" + #: htdocs/luci-static/resources/view/fchomo/global.js:160 msgid "Overview" msgstr "概览" -#: htdocs/luci-static/resources/view/fchomo/node.js:726 +#: htdocs/luci-static/resources/view/fchomo/node.js:745 msgid "POST" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:727 +#: htdocs/luci-static/resources/view/fchomo/node.js:746 msgid "PUT" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:402 +#: htdocs/luci-static/resources/view/fchomo/node.js:416 msgid "Packet encoding" msgstr "数据包编码" -#: htdocs/luci-static/resources/view/fchomo/server.js:238 +#: htdocs/luci-static/resources/view/fchomo/server.js:239 msgid "Padding scheme" msgstr "填充方案" -#: htdocs/luci-static/resources/view/fchomo/node.js:128 -#: htdocs/luci-static/resources/view/fchomo/node.js:201 -#: htdocs/luci-static/resources/view/fchomo/node.js:500 -#: htdocs/luci-static/resources/view/fchomo/server.js:113 -#: htdocs/luci-static/resources/view/fchomo/server.js:169 -#: htdocs/luci-static/resources/view/fchomo/server.js:278 +#: htdocs/luci-static/resources/fchomo.js:1244 +msgid "Paddings" +msgstr "填充 (Paddings)" + +#: htdocs/luci-static/resources/view/fchomo/node.js:129 +#: htdocs/luci-static/resources/view/fchomo/node.js:202 +#: htdocs/luci-static/resources/view/fchomo/node.js:514 +#: htdocs/luci-static/resources/view/fchomo/server.js:114 +#: htdocs/luci-static/resources/view/fchomo/server.js:170 +#: htdocs/luci-static/resources/view/fchomo/server.js:279 msgid "Password" msgstr "密码" -#: htdocs/luci-static/resources/view/fchomo/node.js:1054 -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:333 +#: htdocs/luci-static/resources/fchomo.js:1183 +#: htdocs/luci-static/resources/view/fchomo/node.js:1073 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:341 msgid "Payload" msgstr "Payload" -#: htdocs/luci-static/resources/view/fchomo/node.js:431 +#: htdocs/luci-static/resources/view/fchomo/node.js:445 msgid "Peer pubkic key" msgstr "对端公钥" -#: htdocs/luci-static/resources/view/fchomo/global.js:532 +#: htdocs/luci-static/resources/view/fchomo/global.js:520 msgid "" "Performance may degrade slightly, so it is not recommended to enable on when " "it is not needed." msgstr "性能可能会略有下降,建议仅在需要时开启。" -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:278 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:286 msgid "Plain text" msgstr "纯文本 text" -#: htdocs/luci-static/resources/view/fchomo/global.js:828 +#: htdocs/luci-static/resources/view/fchomo/global.js:833 msgid "" "Please ensure that the DNS query of the domains to be processed in the DNS " "policy
are send via DIRECT/Proxy Node in the same semantics as Routing " @@ -1736,10 +1790,10 @@ msgid "" "standards." msgstr "链接格式标准请参考
%s。" -#: htdocs/luci-static/resources/view/fchomo/node.js:1039 -#: htdocs/luci-static/resources/view/fchomo/node.js:1053 -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:318 -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:332 +#: htdocs/luci-static/resources/view/fchomo/node.js:1058 +#: htdocs/luci-static/resources/view/fchomo/node.js:1072 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:326 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:340 msgid "" "Please type %s." @@ -1748,83 +1802,84 @@ msgstr "" #: htdocs/luci-static/resources/view/fchomo/client.js:827 #: htdocs/luci-static/resources/view/fchomo/client.js:1083 -#: htdocs/luci-static/resources/view/fchomo/client.js:1184 -#: htdocs/luci-static/resources/view/fchomo/client.js:1306 -#: htdocs/luci-static/resources/view/fchomo/client.js:1527 -#: htdocs/luci-static/resources/view/fchomo/node.js:904 +#: htdocs/luci-static/resources/view/fchomo/client.js:1193 +#: htdocs/luci-static/resources/view/fchomo/client.js:1315 +#: htdocs/luci-static/resources/view/fchomo/client.js:1552 +#: htdocs/luci-static/resources/view/fchomo/node.js:923 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:143 msgid "Please type %s fields of mihomo config.
" msgstr "请输入 mihomo 配置的 %s 字段。
" -#: htdocs/luci-static/resources/view/fchomo/node.js:475 -#: htdocs/luci-static/resources/view/fchomo/server.js:265 +#: htdocs/luci-static/resources/view/fchomo/node.js:489 +#: htdocs/luci-static/resources/view/fchomo/server.js:266 msgid "Plugin" msgstr "插件" -#: htdocs/luci-static/resources/view/fchomo/node.js:485 -#: htdocs/luci-static/resources/view/fchomo/node.js:492 -#: htdocs/luci-static/resources/view/fchomo/node.js:500 +#: htdocs/luci-static/resources/view/fchomo/node.js:499 #: htdocs/luci-static/resources/view/fchomo/node.js:506 #: htdocs/luci-static/resources/view/fchomo/node.js:514 #: htdocs/luci-static/resources/view/fchomo/node.js:520 -#: htdocs/luci-static/resources/view/fchomo/server.js:271 -#: htdocs/luci-static/resources/view/fchomo/server.js:278 -#: htdocs/luci-static/resources/view/fchomo/server.js:284 +#: htdocs/luci-static/resources/view/fchomo/node.js:528 +#: htdocs/luci-static/resources/view/fchomo/node.js:534 +#: htdocs/luci-static/resources/view/fchomo/server.js:272 +#: htdocs/luci-static/resources/view/fchomo/server.js:279 +#: htdocs/luci-static/resources/view/fchomo/server.js:285 msgid "Plugin:" msgstr "插件:" -#: htdocs/luci-static/resources/view/fchomo/node.js:116 +#: htdocs/luci-static/resources/view/fchomo/node.js:117 msgid "Port" msgstr "端口" -#: htdocs/luci-static/resources/fchomo.js:1159 +#: htdocs/luci-static/resources/fchomo.js:1563 msgid "Port %s alrealy exists!" msgstr "端口 %s 已存在!" -#: htdocs/luci-static/resources/view/fchomo/node.js:211 -msgid "Port range" -msgstr "端口范围" - -#: htdocs/luci-static/resources/view/fchomo/global.js:691 +#: htdocs/luci-static/resources/view/fchomo/global.js:681 msgid "Ports" msgstr "端口" -#: htdocs/luci-static/resources/view/fchomo/node.js:141 -#: htdocs/luci-static/resources/view/fchomo/server.js:96 +#: htdocs/luci-static/resources/view/fchomo/node.js:142 +#: htdocs/luci-static/resources/view/fchomo/server.js:97 msgid "Ports pool" msgstr "端口池" -#: htdocs/luci-static/resources/view/fchomo/node.js:232 -#: htdocs/luci-static/resources/view/fchomo/node.js:438 +#: htdocs/luci-static/resources/view/fchomo/node.js:240 +#: htdocs/luci-static/resources/view/fchomo/node.js:452 msgid "Pre-shared key" msgstr "预共享密钥" -#: htdocs/luci-static/resources/fchomo.js:136 +#: htdocs/luci-static/resources/fchomo.js:142 msgid "Prefer IPv4" msgstr "优先 IPv4" -#: htdocs/luci-static/resources/fchomo.js:137 +#: htdocs/luci-static/resources/fchomo.js:143 msgid "Prefer IPv6" msgstr "优先 IPv6" -#: htdocs/luci-static/resources/view/fchomo/global.js:737 -#: htdocs/luci-static/resources/view/fchomo/global.js:754 -#: htdocs/luci-static/resources/view/fchomo/node.js:868 -#: htdocs/luci-static/resources/view/fchomo/node.js:874 -#: htdocs/luci-static/resources/view/fchomo/node.js:1174 -#: htdocs/luci-static/resources/view/fchomo/node.js:1181 +#: htdocs/luci-static/resources/view/fchomo/global.js:524 +msgid "" +"Prevent ICMP loopback issues in some cases. Ping will not show real delay." +msgstr "在某些情况下防止 ICMP 环回问题。Ping 不会显示实际延迟。" + +#: htdocs/luci-static/resources/view/fchomo/global.js:727 +#: htdocs/luci-static/resources/view/fchomo/global.js:744 +#: htdocs/luci-static/resources/view/fchomo/node.js:887 +#: htdocs/luci-static/resources/view/fchomo/node.js:893 +#: htdocs/luci-static/resources/view/fchomo/node.js:1193 +#: htdocs/luci-static/resources/view/fchomo/node.js:1200 msgid "Priority: Proxy Node > Global." msgstr "优先级: 代理节点 > 全局。" -#: htdocs/luci-static/resources/view/fchomo/node.js:173 +#: htdocs/luci-static/resources/view/fchomo/node.js:174 msgid "Priv-key" msgstr "密钥" -#: htdocs/luci-static/resources/view/fchomo/node.js:177 +#: htdocs/luci-static/resources/view/fchomo/node.js:178 msgid "Priv-key passphrase" msgstr "密钥密码" -#: htdocs/luci-static/resources/view/fchomo/node.js:423 +#: htdocs/luci-static/resources/view/fchomo/node.js:437 msgid "Private key" msgstr "私钥" @@ -1832,29 +1887,29 @@ msgstr "私钥" msgid "Process matching mode" msgstr "进程匹配模式" -#: htdocs/luci-static/resources/view/fchomo/global.js:685 -#: htdocs/luci-static/resources/view/fchomo/node.js:786 +#: htdocs/luci-static/resources/view/fchomo/global.js:675 +#: htdocs/luci-static/resources/view/fchomo/node.js:805 msgid "Protocol" msgstr "协议" -#: htdocs/luci-static/resources/view/fchomo/node.js:397 +#: htdocs/luci-static/resources/view/fchomo/node.js:411 msgid "Protocol parameter. Enable length block encryption." msgstr "协议参数。启用长度块加密。" -#: htdocs/luci-static/resources/view/fchomo/node.js:391 +#: htdocs/luci-static/resources/view/fchomo/node.js:405 msgid "" "Protocol parameter. Will waste traffic randomly if enabled (enabled by " "default in v2ray and cannot be disabled)." msgstr "协议参数。 如启用会随机浪费流量(在 v2ray 中默认启用并且无法禁用)。" #: htdocs/luci-static/resources/view/fchomo/client.js:937 -#: htdocs/luci-static/resources/view/fchomo/node.js:887 -#: htdocs/luci-static/resources/view/fchomo/node.js:896 -#: htdocs/luci-static/resources/view/fchomo/node.js:1290 +#: htdocs/luci-static/resources/view/fchomo/node.js:906 +#: htdocs/luci-static/resources/view/fchomo/node.js:915 +#: htdocs/luci-static/resources/view/fchomo/node.js:1309 msgid "Provider" msgstr "供应商" -#: htdocs/luci-static/resources/view/fchomo/node.js:1060 +#: htdocs/luci-static/resources/view/fchomo/node.js:1079 msgid "Provider URL" msgstr "供应商订阅 URL" @@ -1863,53 +1918,53 @@ msgstr "供应商订阅 URL" msgid "Proxy Group" msgstr "代理组" -#: htdocs/luci-static/resources/view/fchomo/global.js:787 +#: htdocs/luci-static/resources/view/fchomo/global.js:777 msgid "Proxy IPv4 IP-s" msgstr "代理 IPv4 地址" -#: htdocs/luci-static/resources/view/fchomo/global.js:790 +#: htdocs/luci-static/resources/view/fchomo/global.js:780 msgid "Proxy IPv6 IP-s" msgstr "代理 IPv6 地址" -#: htdocs/luci-static/resources/view/fchomo/global.js:793 +#: htdocs/luci-static/resources/view/fchomo/global.js:783 msgid "Proxy MAC-s" msgstr "代理 MAC 地址" #: htdocs/luci-static/resources/view/fchomo/node.js:76 -#: htdocs/luci-static/resources/view/fchomo/node.js:1289 +#: htdocs/luci-static/resources/view/fchomo/node.js:1308 msgid "Proxy Node" msgstr "代理节点" -#: htdocs/luci-static/resources/view/fchomo/node.js:1265 -#: htdocs/luci-static/resources/view/fchomo/node.js:1274 +#: htdocs/luci-static/resources/view/fchomo/node.js:1284 +#: htdocs/luci-static/resources/view/fchomo/node.js:1293 msgid "Proxy chain" msgstr "代理链" #: htdocs/luci-static/resources/view/fchomo/client.js:713 -#: htdocs/luci-static/resources/view/fchomo/client.js:1390 -#: htdocs/luci-static/resources/view/fchomo/node.js:1078 -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:357 +#: htdocs/luci-static/resources/view/fchomo/client.js:1415 +#: htdocs/luci-static/resources/view/fchomo/node.js:1097 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:365 msgid "Proxy group" msgstr "代理组" -#: htdocs/luci-static/resources/view/fchomo/client.js:1605 +#: htdocs/luci-static/resources/view/fchomo/client.js:1636 msgid "Proxy group override" msgstr "代理组覆盖" -#: htdocs/luci-static/resources/view/fchomo/global.js:478 +#: htdocs/luci-static/resources/view/fchomo/global.js:476 msgid "Proxy mode" msgstr "代理模式" -#: htdocs/luci-static/resources/view/fchomo/global.js:796 +#: htdocs/luci-static/resources/view/fchomo/global.js:786 msgid "Proxy routerself" msgstr "代理路由器自身" -#: htdocs/luci-static/resources/view/fchomo/node.js:273 +#: htdocs/luci-static/resources/view/fchomo/node.js:281 msgid "QUIC" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:261 -#: htdocs/luci-static/resources/view/fchomo/server.js:186 +#: htdocs/luci-static/resources/view/fchomo/node.js:269 +#: htdocs/luci-static/resources/view/fchomo/server.js:187 msgid "QUIC congestion controller." msgstr "QUIC 拥塞控制器。" @@ -1918,67 +1973,76 @@ msgstr "QUIC 拥塞控制器。" msgid "Quick Reload" msgstr "快速重载" -#: htdocs/luci-static/resources/view/fchomo/node.js:659 -#: htdocs/luci-static/resources/view/fchomo/server.js:411 +#: htdocs/luci-static/resources/view/fchomo/node.js:678 +#: htdocs/luci-static/resources/view/fchomo/server.js:422 msgid "REALITY" msgstr "REALITY" -#: htdocs/luci-static/resources/view/fchomo/node.js:674 +#: htdocs/luci-static/resources/view/fchomo/node.js:693 msgid "REALITY X25519MLKEM768 PQC support" msgstr "REALITY X25519MLKEM768 后量子加密支持" -#: htdocs/luci-static/resources/view/fchomo/server.js:447 +#: htdocs/luci-static/resources/view/fchomo/server.js:459 msgid "REALITY certificate issued to" msgstr "REALITY 证书颁发给" -#: htdocs/luci-static/resources/view/fchomo/server.js:416 +#: htdocs/luci-static/resources/view/fchomo/server.js:427 msgid "REALITY handshake server" msgstr "REALITY 握手服务器" -#: htdocs/luci-static/resources/view/fchomo/server.js:423 +#: htdocs/luci-static/resources/view/fchomo/server.js:434 msgid "REALITY private key" msgstr "REALITY 私钥" -#: htdocs/luci-static/resources/view/fchomo/node.js:664 -#: htdocs/luci-static/resources/view/fchomo/server.js:437 +#: htdocs/luci-static/resources/view/fchomo/node.js:683 +#: htdocs/luci-static/resources/view/fchomo/server.js:449 msgid "REALITY public key" msgstr "REALITY 公钥" -#: htdocs/luci-static/resources/view/fchomo/node.js:669 -#: htdocs/luci-static/resources/view/fchomo/server.js:441 +#: htdocs/luci-static/resources/view/fchomo/node.js:688 +#: htdocs/luci-static/resources/view/fchomo/server.js:453 msgid "REALITY short ID" msgstr "REALITY 标识符" -#: htdocs/luci-static/resources/view/fchomo/global.js:645 +#: htdocs/luci-static/resources/fchomo.js:1218 +#: htdocs/luci-static/resources/fchomo.js:1235 +msgid "RTT" +msgstr "" + +#: htdocs/luci-static/resources/view/fchomo/global.js:635 msgid "Random will be used if empty." msgstr "留空将使用随机令牌。" -#: htdocs/luci-static/resources/view/fchomo/node.js:1323 -#: htdocs/luci-static/resources/view/fchomo/node.js:1345 +#: htdocs/luci-static/resources/fchomo.js:1040 +msgid "Randomized traffic characteristics" +msgstr "随机化流量特征" + +#: htdocs/luci-static/resources/view/fchomo/node.js:1342 +#: htdocs/luci-static/resources/view/fchomo/node.js:1364 msgid "Recommended to use UoT node.
such as %s." msgstr "建议使用 UoT 节点。
例如%s。" -#: htdocs/luci-static/resources/view/fchomo/global.js:462 +#: htdocs/luci-static/resources/view/fchomo/global.js:460 msgid "Redir port" msgstr "Redir 端口" -#: htdocs/luci-static/resources/view/fchomo/global.js:479 +#: htdocs/luci-static/resources/view/fchomo/global.js:477 msgid "Redirect TCP" msgstr "Redirect TCP" -#: htdocs/luci-static/resources/view/fchomo/global.js:481 +#: htdocs/luci-static/resources/view/fchomo/global.js:479 msgid "Redirect TCP + TProxy UDP" msgstr "Redirect TCP + TProxy UDP" -#: htdocs/luci-static/resources/view/fchomo/global.js:483 +#: htdocs/luci-static/resources/view/fchomo/global.js:481 msgid "Redirect TCP + Tun UDP" msgstr "Redirect TCP + Tun UDP" -#: htdocs/luci-static/resources/view/fchomo/log.js:81 +#: htdocs/luci-static/resources/view/fchomo/log.js:126 msgid "Refresh every %s seconds." msgstr "每 %s 秒刷新。" -#: htdocs/luci-static/resources/fchomo.js:922 +#: htdocs/luci-static/resources/fchomo.js:937 #: htdocs/luci-static/resources/view/fchomo/client.js:805 #: htdocs/luci-static/resources/view/fchomo/global.js:193 #: htdocs/luci-static/resources/view/fchomo/server.js:46 @@ -1989,50 +2053,51 @@ msgstr "重载" msgid "Reload All" msgstr "重载所有" -#: htdocs/luci-static/resources/view/fchomo/node.js:1017 -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:259 +#: htdocs/luci-static/resources/view/fchomo/node.js:1036 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:267 msgid "Remote" msgstr "远程" -#: htdocs/luci-static/resources/view/fchomo/node.js:463 +#: htdocs/luci-static/resources/view/fchomo/node.js:477 msgid "Remote DNS resolve" msgstr "远程 DNS 解析" -#: htdocs/luci-static/resources/fchomo.js:1080 +#: htdocs/luci-static/resources/fchomo.js:1462 msgid "Remove" msgstr "移除" -#: htdocs/luci-static/resources/fchomo.js:1085 -#: htdocs/luci-static/resources/view/fchomo/node.js:993 -#: htdocs/luci-static/resources/view/fchomo/node.js:995 +#: htdocs/luci-static/resources/fchomo.js:1467 +#: htdocs/luci-static/resources/view/fchomo/node.js:1012 +#: htdocs/luci-static/resources/view/fchomo/node.js:1014 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:240 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:242 msgid "Remove idles" msgstr "移除闲置" -#: htdocs/luci-static/resources/view/fchomo/node.js:1107 +#: htdocs/luci-static/resources/view/fchomo/node.js:1126 msgid "Replace name" msgstr "名称替换" -#: htdocs/luci-static/resources/view/fchomo/node.js:1108 +#: htdocs/luci-static/resources/view/fchomo/node.js:1127 msgid "Replace node name." msgstr "替换节点名称" -#: htdocs/luci-static/resources/view/fchomo/node.js:733 -#: htdocs/luci-static/resources/view/fchomo/node.js:740 -#: htdocs/luci-static/resources/view/fchomo/server.js:489 +#: htdocs/luci-static/resources/view/fchomo/node.js:752 +#: htdocs/luci-static/resources/view/fchomo/node.js:759 +#: htdocs/luci-static/resources/view/fchomo/server.js:501 msgid "Request path" msgstr "请求路径" -#: htdocs/luci-static/resources/view/fchomo/node.js:308 +#: htdocs/luci-static/resources/view/fchomo/node.js:316 msgid "Request timeout" msgstr "请求超时" -#: htdocs/luci-static/resources/view/fchomo/node.js:675 +#: htdocs/luci-static/resources/fchomo.js:1048 +#: htdocs/luci-static/resources/view/fchomo/node.js:694 msgid "Requires server support." -msgstr "" +msgstr "需要服务器支持。" -#: htdocs/luci-static/resources/view/fchomo/node.js:452 +#: htdocs/luci-static/resources/view/fchomo/node.js:466 msgid "Reserved field bytes" msgstr "保留字段字节" @@ -2040,7 +2105,7 @@ msgstr "保留字段字节" msgid "Resources management" msgstr "资源管理" -#: htdocs/luci-static/resources/view/fchomo/node.js:520 +#: htdocs/luci-static/resources/view/fchomo/node.js:534 msgid "Restls script" msgstr "Restls 剧本" @@ -2054,39 +2119,39 @@ msgid "" "Returns the string input for icon in the API to display in this proxy group." msgstr "在 API 返回 icon 所输入的字符串,以在该代理组显示。" -#: htdocs/luci-static/resources/view/fchomo/global.js:800 +#: htdocs/luci-static/resources/view/fchomo/global.js:805 msgid "Routing Control" msgstr "路由控制" -#: htdocs/luci-static/resources/view/fchomo/global.js:840 -#: htdocs/luci-static/resources/view/fchomo/global.js:843 +#: htdocs/luci-static/resources/view/fchomo/global.js:845 +#: htdocs/luci-static/resources/view/fchomo/global.js:848 msgid "Routing DSCP" msgstr "路由 DSCP" -#: htdocs/luci-static/resources/view/fchomo/global.js:824 +#: htdocs/luci-static/resources/view/fchomo/global.js:829 msgid "Routing GFW" msgstr "路由 GFW 流量" -#: htdocs/luci-static/resources/view/fchomo/global.js:753 -#: htdocs/luci-static/resources/view/fchomo/node.js:873 -#: htdocs/luci-static/resources/view/fchomo/node.js:1180 +#: htdocs/luci-static/resources/view/fchomo/global.js:743 +#: htdocs/luci-static/resources/view/fchomo/node.js:892 +#: htdocs/luci-static/resources/view/fchomo/node.js:1199 msgid "Routing mark" msgstr "路由标记" -#: htdocs/luci-static/resources/view/fchomo/global.js:820 +#: htdocs/luci-static/resources/view/fchomo/global.js:825 msgid "Routing mode" msgstr "路由模式" -#: htdocs/luci-static/resources/view/fchomo/global.js:821 +#: htdocs/luci-static/resources/view/fchomo/global.js:826 msgid "Routing mode of the traffic enters mihomo via firewall rules." msgstr "流量通过防火墙规则进入 mihomo 的路由模式。" -#: htdocs/luci-static/resources/view/fchomo/global.js:827 +#: htdocs/luci-static/resources/view/fchomo/global.js:832 msgid "Routing mode will be handle domain." msgstr "路由模式将处理域名。" -#: htdocs/luci-static/resources/view/fchomo/global.js:802 -#: htdocs/luci-static/resources/view/fchomo/global.js:811 +#: htdocs/luci-static/resources/view/fchomo/global.js:807 +#: htdocs/luci-static/resources/view/fchomo/global.js:816 msgid "Routing ports" msgstr "路由端口" @@ -2095,11 +2160,11 @@ msgstr "路由端口" msgid "Routing rule" msgstr "路由规则" -#: htdocs/luci-static/resources/view/fchomo/global.js:747 +#: htdocs/luci-static/resources/view/fchomo/global.js:737 msgid "Routing rule priority" msgstr "路由规则优先权" -#: htdocs/luci-static/resources/view/fchomo/global.js:741 +#: htdocs/luci-static/resources/view/fchomo/global.js:731 msgid "Routing table ID" msgstr "路由表 ID" @@ -2107,13 +2172,13 @@ msgstr "路由表 ID" msgid "Rule" msgstr "规则" -#: htdocs/luci-static/resources/view/fchomo/client.js:1569 -#: htdocs/luci-static/resources/view/fchomo/client.js:1582 +#: htdocs/luci-static/resources/view/fchomo/client.js:1600 +#: htdocs/luci-static/resources/view/fchomo/client.js:1613 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:135 msgid "Rule set" msgstr "规则集" -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:339 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:347 msgid "Rule set URL" msgstr "规则集订阅 URL" @@ -2125,69 +2190,79 @@ msgstr "规则集" msgid "Ruleset-URI-Scheme" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:935 +#: htdocs/luci-static/resources/fchomo.js:950 msgid "Running" msgstr "正在运行" -#: htdocs/luci-static/resources/fchomo.js:119 +#: htdocs/luci-static/resources/fchomo.js:125 msgid "SOCKS" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:149 +#: htdocs/luci-static/resources/fchomo.js:155 msgid "SOCKS5" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:162 +#: htdocs/luci-static/resources/fchomo.js:168 msgid "SSH" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:196 +#: htdocs/luci-static/resources/fchomo.js:204 msgid "STUN ports" msgstr "STUN 端口" -#: htdocs/luci-static/resources/view/fchomo/client.js:1141 +#: htdocs/luci-static/resources/view/fchomo/client.js:1149 msgid "SUB-RULE" msgstr "SUB-RULE" -#: htdocs/luci-static/resources/view/fchomo/node.js:538 +#: htdocs/luci-static/resources/view/fchomo/node.js:552 msgid "SUoT version" msgstr "SUoT 版本" -#: htdocs/luci-static/resources/view/fchomo/node.js:160 -#: htdocs/luci-static/resources/view/fchomo/server.js:142 +#: htdocs/luci-static/resources/view/fchomo/node.js:161 +#: htdocs/luci-static/resources/view/fchomo/server.js:143 msgid "Salamander" msgstr "Salamander" -#: htdocs/luci-static/resources/fchomo.js:142 +#: htdocs/luci-static/resources/fchomo.js:148 msgid "Same dstaddr requests. Same node" msgstr "相同 目标地址 请求。相同节点" -#: htdocs/luci-static/resources/fchomo.js:143 +#: htdocs/luci-static/resources/fchomo.js:149 msgid "Same srcaddr and dstaddr requests. Same node" msgstr "相同 来源地址 和 目标地址 请求。相同节点" -#: htdocs/luci-static/resources/view/fchomo/global.js:521 +#: htdocs/luci-static/resources/view/fchomo/global.js:509 msgid "Segment maximum size" msgstr "分段最大尺寸" -#: htdocs/luci-static/resources/fchomo.js:185 +#: htdocs/luci-static/resources/fchomo.js:193 msgid "Select" msgstr "手动选择" -#: htdocs/luci-static/resources/view/fchomo/global.js:606 +#: htdocs/luci-static/resources/view/fchomo/global.js:596 msgid "Select Dashboard" msgstr "选择面板" +#: htdocs/luci-static/resources/fchomo.js:1054 +msgid "Send padding randomly 0-3333 bytes with 50% probability." +msgstr "以 50% 的概率发送随机 0-3333 字节的填充。" + +#: htdocs/luci-static/resources/fchomo.js:1043 +#: htdocs/luci-static/resources/fchomo.js:1044 +msgid "Send random ticket of 300s-600s duration for client 0-RTT reuse." +msgstr "发送 300-600 秒的随机票证,以供客户端 0-RTT 重用。" + +#: htdocs/luci-static/resources/fchomo.js:1218 #: htdocs/luci-static/resources/view/fchomo/server.js:59 #: root/usr/share/luci/menu.d/luci-app-fchomo.json:54 msgid "Server" msgstr "服务端" -#: htdocs/luci-static/resources/view/fchomo/node.js:111 +#: htdocs/luci-static/resources/view/fchomo/node.js:112 msgid "Server address" msgstr "服务器地址" -#: htdocs/luci-static/resources/view/fchomo/node.js:718 +#: htdocs/luci-static/resources/view/fchomo/node.js:737 msgid "Server hostname" msgstr "服务器主机名称" @@ -2199,93 +2274,93 @@ msgstr "服务端状态" msgid "Service status" msgstr "服务状态" -#: htdocs/luci-static/resources/fchomo.js:121 -#: htdocs/luci-static/resources/fchomo.js:150 +#: htdocs/luci-static/resources/fchomo.js:127 +#: htdocs/luci-static/resources/fchomo.js:156 msgid "Shadowsocks" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:321 -#: htdocs/luci-static/resources/view/fchomo/server.js:220 +#: htdocs/luci-static/resources/view/fchomo/node.js:335 +#: htdocs/luci-static/resources/view/fchomo/server.js:221 msgid "Shadowsocks chipher" msgstr "Shadowsocks 加密方法" -#: htdocs/luci-static/resources/view/fchomo/node.js:316 -#: htdocs/luci-static/resources/view/fchomo/server.js:215 +#: htdocs/luci-static/resources/view/fchomo/node.js:330 +#: htdocs/luci-static/resources/view/fchomo/server.js:216 msgid "Shadowsocks encrypt" msgstr "Shadowsocks 加密" -#: htdocs/luci-static/resources/view/fchomo/node.js:329 -#: htdocs/luci-static/resources/view/fchomo/server.js:228 +#: htdocs/luci-static/resources/view/fchomo/node.js:343 +#: htdocs/luci-static/resources/view/fchomo/server.js:229 msgid "Shadowsocks password" msgstr "Shadowsocks 密码" -#: htdocs/luci-static/resources/view/fchomo/node.js:828 +#: htdocs/luci-static/resources/view/fchomo/node.js:847 msgid "Show connections in the dashboard for breaking connections easier." msgstr "在面板中显示连接以便于打断连接。" -#: htdocs/luci-static/resources/view/fchomo/global.js:407 +#: htdocs/luci-static/resources/fchomo.js:68 msgid "Silent" msgstr "静音" -#: htdocs/luci-static/resources/fchomo.js:141 +#: htdocs/luci-static/resources/fchomo.js:147 msgid "Simple round-robin all nodes" msgstr "简单轮替所有节点" -#: htdocs/luci-static/resources/view/fchomo/node.js:1066 -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:345 +#: htdocs/luci-static/resources/view/fchomo/node.js:1085 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:353 msgid "Size limit" msgstr "大小限制" -#: htdocs/luci-static/resources/view/fchomo/client.js:1423 -#: htdocs/luci-static/resources/view/fchomo/node.js:629 -#: htdocs/luci-static/resources/view/fchomo/node.js:1158 +#: htdocs/luci-static/resources/view/fchomo/client.js:1448 +#: htdocs/luci-static/resources/view/fchomo/node.js:648 +#: htdocs/luci-static/resources/view/fchomo/node.js:1177 msgid "Skip cert verify" msgstr "跳过证书验证" -#: htdocs/luci-static/resources/view/fchomo/global.js:663 +#: htdocs/luci-static/resources/view/fchomo/global.js:653 msgid "Skiped sniffing domain" msgstr "跳过嗅探域名" -#: htdocs/luci-static/resources/view/fchomo/global.js:669 +#: htdocs/luci-static/resources/view/fchomo/global.js:659 msgid "Skiped sniffing dst address" msgstr "跳过嗅探目标地址" -#: htdocs/luci-static/resources/view/fchomo/global.js:666 +#: htdocs/luci-static/resources/view/fchomo/global.js:656 msgid "Skiped sniffing src address" msgstr "跳过嗅探来源地址" -#: htdocs/luci-static/resources/fchomo.js:153 +#: htdocs/luci-static/resources/fchomo.js:159 msgid "Snell" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:673 +#: htdocs/luci-static/resources/view/fchomo/global.js:663 msgid "Sniff protocol" msgstr "嗅探协议" -#: htdocs/luci-static/resources/view/fchomo/global.js:650 +#: htdocs/luci-static/resources/view/fchomo/global.js:640 msgid "Sniffer" msgstr "嗅探器" -#: htdocs/luci-static/resources/view/fchomo/global.js:653 +#: htdocs/luci-static/resources/view/fchomo/global.js:643 msgid "Sniffer settings" msgstr "嗅探器设置" -#: htdocs/luci-static/resources/view/fchomo/global.js:803 -#: htdocs/luci-static/resources/view/fchomo/global.js:812 +#: htdocs/luci-static/resources/view/fchomo/global.js:808 +#: htdocs/luci-static/resources/view/fchomo/global.js:817 msgid "" "Specify target ports to be proxied. Multiple ports must be separated by " "commas." msgstr "指定需要被代理的目标端口。多个端口必须用逗号隔开。" -#: htdocs/luci-static/resources/view/fchomo/global.js:494 +#: htdocs/luci-static/resources/view/fchomo/global.js:492 msgid "Stack" msgstr "堆栈" -#: htdocs/luci-static/resources/fchomo.js:199 +#: htdocs/luci-static/resources/fchomo.js:207 msgid "Steam Client ports" msgstr "Steam 客户端 端口" -#: htdocs/luci-static/resources/fchomo.js:200 +#: htdocs/luci-static/resources/fchomo.js:208 msgid "Steam P2P ports" msgstr "Steam P2P 端口" @@ -2294,16 +2369,16 @@ msgstr "Steam P2P 端口" msgid "Strategy" msgstr "策略" -#: htdocs/luci-static/resources/view/fchomo/client.js:1167 #: htdocs/luci-static/resources/view/fchomo/client.js:1176 +#: htdocs/luci-static/resources/view/fchomo/client.js:1185 msgid "Sub rule" msgstr "子规则" -#: htdocs/luci-static/resources/view/fchomo/client.js:1226 +#: htdocs/luci-static/resources/view/fchomo/client.js:1235 msgid "Sub rule group" msgstr "子规则组" -#: htdocs/luci-static/resources/fchomo.js:507 +#: htdocs/luci-static/resources/fchomo.js:522 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:211 msgid "Successfully imported %s %s of total %s." msgstr "已成功导入 %s 个%s (共 %s 个)。" @@ -2312,7 +2387,7 @@ msgstr "已成功导入 %s 个%s (共 %s 个)。" msgid "Successfully updated." msgstr "更新成功。" -#: htdocs/luci-static/resources/fchomo.js:1382 +#: htdocs/luci-static/resources/fchomo.js:1786 msgid "Successfully uploaded." msgstr "已成功上传。" @@ -2324,7 +2399,7 @@ msgstr "" "支持规则集类型为: %s 并且格式为: %s 的规则集链接。" "
" -#: htdocs/luci-static/resources/view/fchomo/global.js:496 +#: htdocs/luci-static/resources/view/fchomo/global.js:494 msgid "System" msgstr "系统" @@ -2337,68 +2412,68 @@ msgstr "系统 DNS" msgid "TCP" msgstr "TCP" -#: htdocs/luci-static/resources/view/fchomo/global.js:423 +#: htdocs/luci-static/resources/view/fchomo/global.js:421 msgid "TCP concurrency" msgstr "TCP 并发" -#: htdocs/luci-static/resources/view/fchomo/node.js:821 +#: htdocs/luci-static/resources/view/fchomo/node.js:840 msgid "TCP only" msgstr "仅 TCP" -#: htdocs/luci-static/resources/view/fchomo/global.js:431 +#: htdocs/luci-static/resources/view/fchomo/global.js:429 msgid "TCP-Keep-Alive idle timeout" msgstr "TCP-Keep-Alive 闲置超时" -#: htdocs/luci-static/resources/view/fchomo/global.js:426 +#: htdocs/luci-static/resources/view/fchomo/global.js:424 msgid "TCP-Keep-Alive interval" msgstr "TCP-Keep-Alive 间隔" -#: htdocs/luci-static/resources/view/fchomo/node.js:852 -#: htdocs/luci-static/resources/view/fchomo/node.js:1125 +#: htdocs/luci-static/resources/view/fchomo/node.js:871 +#: htdocs/luci-static/resources/view/fchomo/node.js:1144 msgid "TFO" msgstr "TCP 快速打开 (TFO)" -#: htdocs/luci-static/resources/view/fchomo/global.js:537 -#: htdocs/luci-static/resources/view/fchomo/node.js:487 -#: htdocs/luci-static/resources/view/fchomo/node.js:546 -#: htdocs/luci-static/resources/view/fchomo/server.js:299 +#: htdocs/luci-static/resources/view/fchomo/global.js:525 +#: htdocs/luci-static/resources/view/fchomo/node.js:501 +#: htdocs/luci-static/resources/view/fchomo/node.js:565 +#: htdocs/luci-static/resources/view/fchomo/server.js:308 msgid "TLS" msgstr "TLS" -#: htdocs/luci-static/resources/view/fchomo/node.js:577 -#: htdocs/luci-static/resources/view/fchomo/server.js:330 +#: htdocs/luci-static/resources/view/fchomo/node.js:596 +#: htdocs/luci-static/resources/view/fchomo/server.js:339 msgid "TLS ALPN" msgstr "TLS ALPN" -#: htdocs/luci-static/resources/view/fchomo/node.js:571 +#: htdocs/luci-static/resources/view/fchomo/node.js:590 msgid "TLS SNI" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:91 -#: htdocs/luci-static/resources/view/fchomo/server.js:65 +#: htdocs/luci-static/resources/view/fchomo/node.js:92 +#: htdocs/luci-static/resources/view/fchomo/server.js:66 msgid "TLS fields" msgstr "TLS字段" -#: htdocs/luci-static/resources/fchomo.js:126 -#: htdocs/luci-static/resources/fchomo.js:160 +#: htdocs/luci-static/resources/fchomo.js:132 +#: htdocs/luci-static/resources/fchomo.js:166 msgid "TUIC" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:197 +#: htdocs/luci-static/resources/fchomo.js:205 msgid "TURN ports" msgstr "TURN 端口" -#: htdocs/luci-static/resources/view/fchomo/server.js:135 +#: htdocs/luci-static/resources/view/fchomo/server.js:136 msgid "" "Tell the client to use the BBR flow control algorithm instead of Hysteria CC." msgstr "让客户端使用 BBR 流控算法。" -#: htdocs/luci-static/resources/view/fchomo/node.js:411 -#: htdocs/luci-static/resources/view/fchomo/node.js:418 +#: htdocs/luci-static/resources/view/fchomo/node.js:425 +#: htdocs/luci-static/resources/view/fchomo/node.js:432 msgid "The %s address used by local machine in the Wireguard network." msgstr "WireGuard 网络中使用的本机 %s 地址。" -#: htdocs/luci-static/resources/view/fchomo/node.js:644 +#: htdocs/luci-static/resources/view/fchomo/node.js:663 msgid "" "The ECH parameter of the HTTPS record for the domain. Leave empty to resolve " "via DNS." @@ -2408,39 +2483,48 @@ msgstr "域名的 HTTPS 记录的 ECH 参数。留空则通过 DNS 解析。" msgid "The default value is 2:00 every day." msgstr "默认值为每天 2:00。" -#: htdocs/luci-static/resources/view/fchomo/client.js:1628 +#: htdocs/luci-static/resources/fchomo.js:1247 +msgid "" +"The first padding must have a probability of 100% and at least 35 bytes." +msgstr "首个填充必须为 100% 的概率并且至少 35 字节。" + +#: htdocs/luci-static/resources/view/fchomo/client.js:1659 msgid "The matching %s will be deemed as not-poisoned." msgstr "匹配 %s 的将被视为未被投毒污染。" -#: htdocs/luci-static/resources/view/fchomo/client.js:1637 -#: htdocs/luci-static/resources/view/fchomo/client.js:1641 -#: htdocs/luci-static/resources/view/fchomo/client.js:1646 +#: htdocs/luci-static/resources/view/fchomo/client.js:1668 +#: htdocs/luci-static/resources/view/fchomo/client.js:1672 +#: htdocs/luci-static/resources/view/fchomo/client.js:1677 msgid "The matching %s will be deemed as poisoned." msgstr "匹配 %s 的将被视为已被投毒污染。" -#: htdocs/luci-static/resources/view/fchomo/server.js:351 +#: htdocs/luci-static/resources/fchomo.js:1245 +msgid "The server and client can set different padding parameters." +msgstr "服务器和客户端可以设置不同的填充参数。" + +#: htdocs/luci-static/resources/view/fchomo/server.js:360 msgid "The server private key, in PEM format." msgstr "服务端私钥,需要 PEM 格式。" -#: htdocs/luci-static/resources/view/fchomo/server.js:336 +#: htdocs/luci-static/resources/view/fchomo/server.js:345 msgid "The server public key, in PEM format." msgstr "服务端公钥,需要 PEM 格式。" -#: htdocs/luci-static/resources/view/fchomo/global.js:595 -#: htdocs/luci-static/resources/view/fchomo/server.js:405 +#: htdocs/luci-static/resources/view/fchomo/global.js:585 +#: htdocs/luci-static/resources/view/fchomo/server.js:416 msgid "This ECH parameter needs to be added to the HTTPS record of the domain." msgstr "此 ECH 参数需要添加到域名的 HTTPS 记录中。" -#: htdocs/luci-static/resources/view/fchomo/client.js:1426 -#: htdocs/luci-static/resources/view/fchomo/node.js:632 -#: htdocs/luci-static/resources/view/fchomo/node.js:1161 +#: htdocs/luci-static/resources/view/fchomo/client.js:1451 +#: htdocs/luci-static/resources/view/fchomo/node.js:651 +#: htdocs/luci-static/resources/view/fchomo/node.js:1180 msgid "" "This is DANGEROUS, your traffic is almost like " "PLAIN TEXT! Use at your own risk!" msgstr "" "这是危险行为,您的流量将几乎等同于明文!使用风险自负!" -#: htdocs/luci-static/resources/view/fchomo/node.js:278 +#: htdocs/luci-static/resources/view/fchomo/node.js:286 msgid "" "This is the TUIC port of the SUoT protocol, designed to provide a QUIC " "stream based UDP relay mode that TUIC does not provide." @@ -2453,38 +2537,38 @@ msgid "" "To check NAT Behavior you need to install
%s first" msgstr "检测 NAT 行为需要先安装 %s" -#: htdocs/luci-static/resources/view/fchomo/global.js:486 +#: htdocs/luci-static/resources/view/fchomo/global.js:484 msgid "" "To enable Tun support, you need to install ip-full and " "kmod-tun" msgstr "" "要启用 Tun 支持,您需要安装 ip-fullkmod-tun。" -#: htdocs/luci-static/resources/view/fchomo/global.js:832 +#: htdocs/luci-static/resources/view/fchomo/global.js:837 msgid "To enable, you need to install dnsmasq-full." msgstr "要启用,您需要安装 dnsmasq-full。" -#: htdocs/luci-static/resources/view/fchomo/global.js:760 +#: htdocs/luci-static/resources/view/fchomo/global.js:750 msgid "Tproxy Fwmark" msgstr "Tproxy 标记" -#: htdocs/luci-static/resources/view/fchomo/global.js:467 +#: htdocs/luci-static/resources/view/fchomo/global.js:465 msgid "Tproxy port" msgstr "Tproxy 端口" -#: htdocs/luci-static/resources/view/fchomo/node.js:216 -#: htdocs/luci-static/resources/view/fchomo/node.js:681 -#: htdocs/luci-static/resources/view/fchomo/server.js:455 +#: htdocs/luci-static/resources/view/fchomo/node.js:217 +#: htdocs/luci-static/resources/view/fchomo/node.js:700 +#: htdocs/luci-static/resources/view/fchomo/server.js:467 msgid "Transport" msgstr "传输层" -#: htdocs/luci-static/resources/view/fchomo/node.js:92 -#: htdocs/luci-static/resources/view/fchomo/server.js:66 +#: htdocs/luci-static/resources/view/fchomo/node.js:93 +#: htdocs/luci-static/resources/view/fchomo/server.js:67 msgid "Transport fields" msgstr "传输层字段" -#: htdocs/luci-static/resources/view/fchomo/node.js:686 -#: htdocs/luci-static/resources/view/fchomo/server.js:460 +#: htdocs/luci-static/resources/view/fchomo/node.js:705 +#: htdocs/luci-static/resources/view/fchomo/server.js:472 msgid "Transport type" msgstr "传输层类型" @@ -2492,24 +2576,24 @@ msgstr "传输层类型" msgid "Treat the destination IP as the source IP." msgstr "将 目标 IP 视为 来源 IP。" -#: htdocs/luci-static/resources/fchomo.js:124 -#: htdocs/luci-static/resources/fchomo.js:156 +#: htdocs/luci-static/resources/fchomo.js:130 +#: htdocs/luci-static/resources/fchomo.js:162 msgid "Trojan" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:765 +#: htdocs/luci-static/resources/view/fchomo/global.js:755 msgid "Tun Fwmark" msgstr "Tun 标记" -#: htdocs/luci-static/resources/view/fchomo/global.js:484 +#: htdocs/luci-static/resources/view/fchomo/global.js:482 msgid "Tun TCP/UDP" msgstr "Tun TCP/UDP" -#: htdocs/luci-static/resources/view/fchomo/global.js:491 +#: htdocs/luci-static/resources/view/fchomo/global.js:489 msgid "Tun settings" msgstr "Tun 设置" -#: htdocs/luci-static/resources/view/fchomo/global.js:495 +#: htdocs/luci-static/resources/view/fchomo/global.js:493 msgid "Tun stack." msgstr "Tun 堆栈" @@ -2517,55 +2601,55 @@ msgstr "Tun 堆栈" #: htdocs/luci-static/resources/view/fchomo/client.js:571 #: htdocs/luci-static/resources/view/fchomo/client.js:665 #: htdocs/luci-static/resources/view/fchomo/client.js:910 -#: htdocs/luci-static/resources/view/fchomo/client.js:1566 -#: htdocs/luci-static/resources/view/fchomo/node.js:105 -#: htdocs/luci-static/resources/view/fchomo/node.js:1015 -#: htdocs/luci-static/resources/view/fchomo/node.js:1288 -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:257 -#: htdocs/luci-static/resources/view/fchomo/server.js:85 +#: htdocs/luci-static/resources/view/fchomo/client.js:1597 +#: htdocs/luci-static/resources/view/fchomo/node.js:106 +#: htdocs/luci-static/resources/view/fchomo/node.js:1034 +#: htdocs/luci-static/resources/view/fchomo/node.js:1307 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:265 +#: htdocs/luci-static/resources/view/fchomo/server.js:86 msgid "Type" msgstr "类型" #: htdocs/luci-static/resources/view/fchomo/client.js:516 #: htdocs/luci-static/resources/view/fchomo/client.js:606 -#: htdocs/luci-static/resources/view/fchomo/node.js:527 -#: htdocs/luci-static/resources/view/fchomo/node.js:1135 -#: htdocs/luci-static/resources/view/fchomo/server.js:293 +#: htdocs/luci-static/resources/view/fchomo/node.js:541 +#: htdocs/luci-static/resources/view/fchomo/node.js:1154 +#: htdocs/luci-static/resources/view/fchomo/server.js:294 msgid "UDP" msgstr "UDP" -#: htdocs/luci-static/resources/view/fchomo/global.js:525 +#: htdocs/luci-static/resources/view/fchomo/global.js:513 msgid "UDP NAT expiration time" msgstr "UDP NAT 过期时间" -#: htdocs/luci-static/resources/view/fchomo/node.js:277 +#: htdocs/luci-static/resources/view/fchomo/node.js:285 msgid "UDP over stream" msgstr "UDP over stream" -#: htdocs/luci-static/resources/view/fchomo/node.js:283 +#: htdocs/luci-static/resources/view/fchomo/node.js:291 msgid "UDP over stream version" msgstr "UDP over stream 版本" -#: htdocs/luci-static/resources/view/fchomo/node.js:270 +#: htdocs/luci-static/resources/view/fchomo/node.js:278 msgid "UDP packet relay mode." msgstr "UDP 包中继模式。" -#: htdocs/luci-static/resources/view/fchomo/node.js:269 +#: htdocs/luci-static/resources/view/fchomo/node.js:277 msgid "UDP relay mode" msgstr "UDP 中继模式" -#: htdocs/luci-static/resources/fchomo.js:187 +#: htdocs/luci-static/resources/fchomo.js:195 msgid "URL test" msgstr "自动选择" -#: htdocs/luci-static/resources/view/fchomo/node.js:248 -#: htdocs/luci-static/resources/view/fchomo/node.js:360 -#: htdocs/luci-static/resources/view/fchomo/server.js:179 -#: htdocs/luci-static/resources/view/fchomo/server.js:243 +#: htdocs/luci-static/resources/view/fchomo/node.js:256 +#: htdocs/luci-static/resources/view/fchomo/node.js:374 +#: htdocs/luci-static/resources/view/fchomo/server.js:180 +#: htdocs/luci-static/resources/view/fchomo/server.js:244 msgid "UUID" msgstr "UUID" -#: htdocs/luci-static/resources/fchomo.js:980 +#: htdocs/luci-static/resources/fchomo.js:995 msgid "Unable to download unsupported type: %s" msgstr "无法下载不支持的类型: %s" @@ -2573,7 +2657,7 @@ msgstr "无法下载不支持的类型: %s" msgid "Unable to save contents: %s" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:420 +#: htdocs/luci-static/resources/view/fchomo/global.js:418 msgid "Unified delay" msgstr "统一延迟" @@ -2586,12 +2670,12 @@ msgstr "未知" msgid "Unknown error." msgstr "未知错误。" -#: htdocs/luci-static/resources/view/fchomo/log.js:58 +#: htdocs/luci-static/resources/view/fchomo/log.js:102 msgid "Unknown error: %s" msgstr "未知错误:%s" -#: htdocs/luci-static/resources/view/fchomo/node.js:532 -#: htdocs/luci-static/resources/view/fchomo/node.js:1140 +#: htdocs/luci-static/resources/view/fchomo/node.js:546 +#: htdocs/luci-static/resources/view/fchomo/node.js:1159 msgid "UoT" msgstr "UDP over TCP (UoT)" @@ -2599,20 +2683,20 @@ msgstr "UDP over TCP (UoT)" msgid "Update failed." msgstr "更新失败。" -#: htdocs/luci-static/resources/view/fchomo/node.js:1072 -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:351 +#: htdocs/luci-static/resources/view/fchomo/node.js:1091 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:359 msgid "Update interval" msgstr "更新间隔" -#: htdocs/luci-static/resources/view/fchomo/node.js:839 +#: htdocs/luci-static/resources/view/fchomo/node.js:858 msgid "Upload bandwidth" msgstr "上传带宽" -#: htdocs/luci-static/resources/view/fchomo/node.js:840 +#: htdocs/luci-static/resources/view/fchomo/node.js:859 msgid "Upload bandwidth in Mbps." msgstr "上传带宽(单位:Mbps)。" -#: htdocs/luci-static/resources/view/fchomo/server.js:342 +#: htdocs/luci-static/resources/view/fchomo/server.js:351 msgid "Upload certificate" msgstr "上传证书" @@ -2620,85 +2704,94 @@ msgstr "上传证书" msgid "Upload initial package" msgstr "上传初始资源包" -#: htdocs/luci-static/resources/view/fchomo/server.js:357 +#: htdocs/luci-static/resources/view/fchomo/server.js:366 msgid "Upload key" msgstr "上传密钥" #: htdocs/luci-static/resources/view/fchomo/global.js:306 -#: htdocs/luci-static/resources/view/fchomo/server.js:345 -#: htdocs/luci-static/resources/view/fchomo/server.js:360 +#: htdocs/luci-static/resources/view/fchomo/server.js:354 +#: htdocs/luci-static/resources/view/fchomo/server.js:369 msgid "Upload..." msgstr "上传..." -#: htdocs/luci-static/resources/view/fchomo/client.js:1251 +#: htdocs/luci-static/resources/view/fchomo/client.js:1260 msgid "Used to resolve the domain of the DNS server. Must be IP." msgstr "用于解析 DNS 服务器的域名。必须是 IP。" -#: htdocs/luci-static/resources/view/fchomo/client.js:1258 +#: htdocs/luci-static/resources/view/fchomo/client.js:1267 msgid "Used to resolve the domain of the Proxy node." msgstr "用于解析代理节点的域名。" -#: htdocs/luci-static/resources/view/fchomo/node.js:572 +#: htdocs/luci-static/resources/view/fchomo/node.js:591 msgid "Used to verify the hostname on the returned certificates." msgstr "用于验证返回的证书上的主机名。" -#: htdocs/luci-static/resources/view/fchomo/global.js:440 +#: htdocs/luci-static/resources/view/fchomo/global.js:438 msgid "User Authentication" msgstr "用户认证" -#: htdocs/luci-static/resources/view/fchomo/node.js:123 -#: htdocs/luci-static/resources/view/fchomo/server.js:108 +#: htdocs/luci-static/resources/view/fchomo/node.js:124 +#: htdocs/luci-static/resources/view/fchomo/server.js:109 msgid "Username" msgstr "用户名" -#: htdocs/luci-static/resources/view/fchomo/global.js:773 +#: htdocs/luci-static/resources/view/fchomo/global.js:763 msgid "Users filter mode" msgstr "使用者过滤模式" -#: htdocs/luci-static/resources/view/fchomo/node.js:769 +#: htdocs/luci-static/resources/view/fchomo/node.js:788 msgid "V2ray HTTPUpgrade" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:774 +#: htdocs/luci-static/resources/view/fchomo/node.js:793 msgid "V2ray HTTPUpgrade fast open" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:123 -#: htdocs/luci-static/resources/fchomo.js:155 +#: htdocs/luci-static/resources/fchomo.js:129 +#: htdocs/luci-static/resources/fchomo.js:161 msgid "VLESS" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:122 -#: htdocs/luci-static/resources/fchomo.js:154 +#: htdocs/luci-static/resources/fchomo.js:128 +#: htdocs/luci-static/resources/fchomo.js:160 msgid "VMess" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1021 -#: htdocs/luci-static/resources/view/fchomo/node.js:1294 -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:300 +#: htdocs/luci-static/resources/view/fchomo/node.js:1040 +#: htdocs/luci-static/resources/view/fchomo/node.js:1313 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:308 msgid "Value" msgstr "可视化值" -#: htdocs/luci-static/resources/view/fchomo/node.js:239 -#: htdocs/luci-static/resources/view/fchomo/node.js:506 -#: htdocs/luci-static/resources/view/fchomo/server.js:284 +#: htdocs/luci-static/resources/view/fchomo/node.js:247 +#: htdocs/luci-static/resources/view/fchomo/node.js:520 +#: htdocs/luci-static/resources/view/fchomo/server.js:285 msgid "Version" msgstr "版本" -#: htdocs/luci-static/resources/view/fchomo/node.js:514 +#: htdocs/luci-static/resources/view/fchomo/node.js:528 msgid "Version hint" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:409 +#: htdocs/luci-static/resources/view/fchomo/node.js:91 +#: htdocs/luci-static/resources/view/fchomo/server.js:65 +msgid "Vless Encryption fields" +msgstr "Vless Encryption 字段" + +#: htdocs/luci-static/resources/fchomo.js:1053 +msgid "Wait a random 0-111 milliseconds with 75% probability." +msgstr "以 75% 的概率等待随机 0-111 毫秒。" + +#: htdocs/luci-static/resources/fchomo.js:70 msgid "Warning" msgstr "警告" -#: htdocs/luci-static/resources/view/fchomo/node.js:691 -#: htdocs/luci-static/resources/view/fchomo/node.js:702 -#: htdocs/luci-static/resources/view/fchomo/node.js:707 -#: htdocs/luci-static/resources/view/fchomo/server.js:462 -#: htdocs/luci-static/resources/view/fchomo/server.js:473 -#: htdocs/luci-static/resources/view/fchomo/server.js:478 +#: htdocs/luci-static/resources/view/fchomo/node.js:710 +#: htdocs/luci-static/resources/view/fchomo/node.js:721 +#: htdocs/luci-static/resources/view/fchomo/node.js:726 +#: htdocs/luci-static/resources/view/fchomo/server.js:474 +#: htdocs/luci-static/resources/view/fchomo/server.js:485 +#: htdocs/luci-static/resources/view/fchomo/server.js:490 msgid "WebSocket" msgstr "" @@ -2706,135 +2799,157 @@ msgstr "" msgid "When used as a server, HomeProxy is a better choice." msgstr "用作服务端时,HomeProxy 是更好的选择。" -#: htdocs/luci-static/resources/view/fchomo/global.js:775 +#: htdocs/luci-static/resources/view/fchomo/global.js:765 msgid "White list" msgstr "白名单" -#: htdocs/luci-static/resources/fchomo.js:161 +#: htdocs/luci-static/resources/fchomo.js:167 msgid "WireGuard" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:432 +#: htdocs/luci-static/resources/view/fchomo/node.js:446 msgid "WireGuard peer public key." msgstr "WireGuard 对端公钥。" -#: htdocs/luci-static/resources/view/fchomo/node.js:439 +#: htdocs/luci-static/resources/view/fchomo/node.js:453 msgid "WireGuard pre-shared key." msgstr "WireGuard 预共享密钥。" -#: htdocs/luci-static/resources/view/fchomo/node.js:424 +#: htdocs/luci-static/resources/view/fchomo/node.js:438 msgid "WireGuard requires base64-encoded private keys." msgstr "WireGuard 要求 base64 编码的私钥。" -#: htdocs/luci-static/resources/view/fchomo/node.js:405 +#: htdocs/luci-static/resources/fchomo.js:1209 +msgid "XOR mode" +msgstr "XOR 模式" + +#: htdocs/luci-static/resources/view/fchomo/node.js:419 msgid "Xudp (Xray-core)" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:279 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:287 msgid "Yaml text" msgstr "Yaml 格式文本" -#: htdocs/luci-static/resources/fchomo.js:43 +#: htdocs/luci-static/resources/fchomo.js:41 msgid "YouTube" msgstr "油管" -#: htdocs/luci-static/resources/fchomo.js:1364 +#: htdocs/luci-static/resources/fchomo.js:1768 msgid "Your %s was successfully uploaded. Size: %sB." msgstr "您的 %s 已成功上传。大小:%sB。" -#: htdocs/luci-static/resources/fchomo.js:262 -#: htdocs/luci-static/resources/fchomo.js:287 -#: htdocs/luci-static/resources/view/fchomo/node.js:385 +#: htdocs/luci-static/resources/fchomo.js:270 +#: htdocs/luci-static/resources/fchomo.js:295 +#: htdocs/luci-static/resources/view/fchomo/node.js:399 msgid "aes-128-gcm" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:263 +#: htdocs/luci-static/resources/fchomo.js:271 msgid "aes-192-gcm" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:264 -#: htdocs/luci-static/resources/fchomo.js:288 +#: htdocs/luci-static/resources/fchomo.js:272 +#: htdocs/luci-static/resources/fchomo.js:296 msgid "aes-256-gcm" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:382 +#: htdocs/luci-static/resources/view/fchomo/node.js:396 msgid "auto" msgstr "自动" -#: htdocs/luci-static/resources/view/fchomo/node.js:265 -#: htdocs/luci-static/resources/view/fchomo/server.js:190 +#: htdocs/luci-static/resources/view/fchomo/node.js:273 +#: htdocs/luci-static/resources/view/fchomo/server.js:191 msgid "bbr" msgstr "bbr" -#: htdocs/luci-static/resources/view/fchomo/server.js:347 +#: htdocs/luci-static/resources/view/fchomo/server.js:356 msgid "certificate" msgstr "证书" -#: htdocs/luci-static/resources/fchomo.js:265 -#: htdocs/luci-static/resources/fchomo.js:289 +#: htdocs/luci-static/resources/fchomo.js:273 +#: htdocs/luci-static/resources/fchomo.js:297 msgid "chacha20-ietf-poly1305" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:386 +#: htdocs/luci-static/resources/view/fchomo/node.js:400 msgid "chacha20-poly1305" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:263 -#: htdocs/luci-static/resources/view/fchomo/server.js:188 +#: htdocs/luci-static/resources/view/fchomo/node.js:271 +#: htdocs/luci-static/resources/view/fchomo/server.js:189 msgid "cubic" msgstr "cubic" +#: htdocs/luci-static/resources/fchomo.js:1189 +#: htdocs/luci-static/resources/view/fchomo/server.js:300 +msgid "decryption" +msgstr "decryption" + #: htdocs/luci-static/resources/view/fchomo/global.js:799 msgid "dnsmasq selects upstream on its own. (may affect CDN accuracy)" msgstr "dnsmasq 自行选择上游服务器。 (可能影响 CDN 准确性)" -#: htdocs/luci-static/resources/view/fchomo/node.js:1152 +#: htdocs/luci-static/resources/view/fchomo/node.js:1171 msgid "down" msgstr "Hysteria 下载速率" -#: htdocs/luci-static/resources/view/fchomo/node.js:690 -#: htdocs/luci-static/resources/view/fchomo/node.js:701 -#: htdocs/luci-static/resources/view/fchomo/node.js:706 -#: htdocs/luci-static/resources/view/fchomo/server.js:461 -#: htdocs/luci-static/resources/view/fchomo/server.js:472 -#: htdocs/luci-static/resources/view/fchomo/server.js:477 +#: htdocs/luci-static/resources/fchomo.js:1194 +#: htdocs/luci-static/resources/view/fchomo/node.js:560 +msgid "encryption" +msgstr "encryption" + +#: htdocs/luci-static/resources/view/fchomo/node.js:709 +#: htdocs/luci-static/resources/view/fchomo/node.js:720 +#: htdocs/luci-static/resources/view/fchomo/node.js:725 +#: htdocs/luci-static/resources/view/fchomo/server.js:473 +#: htdocs/luci-static/resources/view/fchomo/server.js:484 +#: htdocs/luci-static/resources/view/fchomo/server.js:489 msgid "gRPC" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:753 -#: htdocs/luci-static/resources/view/fchomo/server.js:496 +#: htdocs/luci-static/resources/view/fchomo/node.js:772 +#: htdocs/luci-static/resources/view/fchomo/server.js:508 msgid "gRPC service name" msgstr "gRPC 服务名称" -#: htdocs/luci-static/resources/view/fchomo/global.js:498 +#: htdocs/luci-static/resources/view/fchomo/global.js:496 msgid "gVisor" msgstr "gVisor" -#: htdocs/luci-static/resources/view/fchomo/node.js:790 +#: htdocs/luci-static/resources/view/fchomo/node.js:809 msgid "h2mux" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:57 +#: htdocs/luci-static/resources/fchomo.js:1362 +msgid "least one keypair required" +msgstr "至少需要一对密钥" + +#: htdocs/luci-static/resources/fchomo.js:55 msgid "metacubexd" msgstr "metacubexd" #: htdocs/luci-static/resources/view/fchomo/client.js:883 #: htdocs/luci-static/resources/view/fchomo/client.js:1122 -#: htdocs/luci-static/resources/view/fchomo/client.js:1209 -#: htdocs/luci-static/resources/view/fchomo/client.js:1327 -#: htdocs/luci-static/resources/view/fchomo/client.js:1549 -#: htdocs/luci-static/resources/view/fchomo/node.js:987 +#: htdocs/luci-static/resources/view/fchomo/client.js:1218 +#: htdocs/luci-static/resources/view/fchomo/client.js:1352 +#: htdocs/luci-static/resources/view/fchomo/client.js:1574 +#: htdocs/luci-static/resources/view/fchomo/node.js:1006 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:228 msgid "mihomo config" msgstr "mihomo 配置" -#: htdocs/luci-static/resources/view/fchomo/node.js:856 -#: htdocs/luci-static/resources/view/fchomo/node.js:1130 +#: htdocs/luci-static/resources/fchomo.js:1035 +msgid "mlkem768x25519plus" +msgstr "" + +#: htdocs/luci-static/resources/view/fchomo/node.js:875 +#: htdocs/luci-static/resources/view/fchomo/node.js:1149 msgid "mpTCP" msgstr "多路径 TCP (mpTCP)" -#: htdocs/luci-static/resources/view/fchomo/node.js:264 -#: htdocs/luci-static/resources/view/fchomo/server.js:189 +#: htdocs/luci-static/resources/view/fchomo/node.js:272 +#: htdocs/luci-static/resources/view/fchomo/server.js:190 msgid "new_reno" msgstr "new_reno" @@ -2842,18 +2957,18 @@ msgstr "new_reno" msgid "no-resolve" msgstr "no-resolve" -#: htdocs/luci-static/resources/fchomo.js:1147 -#: htdocs/luci-static/resources/fchomo.js:1201 -#: htdocs/luci-static/resources/fchomo.js:1232 +#: htdocs/luci-static/resources/fchomo.js:1551 +#: htdocs/luci-static/resources/fchomo.js:1605 +#: htdocs/luci-static/resources/fchomo.js:1636 msgid "non-empty value" msgstr "非空值" -#: htdocs/luci-static/resources/fchomo.js:260 -#: htdocs/luci-static/resources/view/fchomo/node.js:383 -#: htdocs/luci-static/resources/view/fchomo/node.js:403 -#: htdocs/luci-static/resources/view/fchomo/node.js:476 -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:296 -#: htdocs/luci-static/resources/view/fchomo/server.js:266 +#: htdocs/luci-static/resources/fchomo.js:268 +#: htdocs/luci-static/resources/view/fchomo/node.js:397 +#: htdocs/luci-static/resources/view/fchomo/node.js:417 +#: htdocs/luci-static/resources/view/fchomo/node.js:490 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:304 +#: htdocs/luci-static/resources/view/fchomo/server.js:267 msgid "none" msgstr "无" @@ -2865,27 +2980,27 @@ msgstr "未找到" msgid "not included \",\"" msgstr "不包含 \",\"" -#: htdocs/luci-static/resources/fchomo.js:175 +#: htdocs/luci-static/resources/fchomo.js:181 msgid "null" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:477 +#: htdocs/luci-static/resources/view/fchomo/node.js:491 msgid "obfs-simple" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1110 +#: htdocs/luci-static/resources/view/fchomo/node.js:1129 msgid "override.proxy-name" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:404 +#: htdocs/luci-static/resources/view/fchomo/node.js:418 msgid "packet addr (v2ray-core v5+)" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/server.js:362 +#: htdocs/luci-static/resources/view/fchomo/server.js:371 msgid "private key" msgstr "私钥" -#: htdocs/luci-static/resources/fchomo.js:59 +#: htdocs/luci-static/resources/fchomo.js:57 msgid "razord-meta" msgstr "razord-meta" @@ -2894,7 +3009,7 @@ msgstr "razord-meta" msgid "requires front-end adaptation using the API." msgstr "需要使用 API 的前端适配。" -#: htdocs/luci-static/resources/view/fchomo/node.js:481 +#: htdocs/luci-static/resources/view/fchomo/node.js:495 msgid "restls" msgstr "" @@ -2902,12 +3017,12 @@ msgstr "" msgid "rule-set" msgstr "规则集" -#: htdocs/luci-static/resources/view/fchomo/node.js:480 -#: htdocs/luci-static/resources/view/fchomo/server.js:267 +#: htdocs/luci-static/resources/view/fchomo/node.js:494 +#: htdocs/luci-static/resources/view/fchomo/server.js:268 msgid "shadow-tls" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:788 +#: htdocs/luci-static/resources/view/fchomo/node.js:807 msgid "smux" msgstr "" @@ -2919,97 +3034,111 @@ msgstr "src" msgid "unchecked" msgstr "未检查" -#: htdocs/luci-static/resources/fchomo.js:337 +#: htdocs/luci-static/resources/fchomo.js:345 msgid "unique UCI identifier" msgstr "独立 UCI 标识" -#: htdocs/luci-static/resources/fchomo.js:340 +#: htdocs/luci-static/resources/fchomo.js:348 msgid "unique identifier" msgstr "独立标识" -#: htdocs/luci-static/resources/fchomo.js:1241 +#: htdocs/luci-static/resources/fchomo.js:1645 msgid "unique value" msgstr "独立值" -#: htdocs/luci-static/resources/view/fchomo/node.js:1146 +#: htdocs/luci-static/resources/view/fchomo/node.js:1165 msgid "up" msgstr "Hysteria 上传速率" -#: htdocs/luci-static/resources/view/fchomo/node.js:240 -#: htdocs/luci-static/resources/view/fchomo/node.js:284 -#: htdocs/luci-static/resources/view/fchomo/node.js:507 -#: htdocs/luci-static/resources/view/fchomo/node.js:539 -#: htdocs/luci-static/resources/view/fchomo/server.js:285 +#: htdocs/luci-static/resources/view/fchomo/node.js:248 +#: htdocs/luci-static/resources/view/fchomo/node.js:292 +#: htdocs/luci-static/resources/view/fchomo/node.js:521 +#: htdocs/luci-static/resources/view/fchomo/node.js:553 +#: htdocs/luci-static/resources/view/fchomo/server.js:286 msgid "v1" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:241 -#: htdocs/luci-static/resources/view/fchomo/node.js:508 -#: htdocs/luci-static/resources/view/fchomo/node.js:540 -#: htdocs/luci-static/resources/view/fchomo/server.js:286 +#: htdocs/luci-static/resources/view/fchomo/node.js:249 +#: htdocs/luci-static/resources/view/fchomo/node.js:522 +#: htdocs/luci-static/resources/view/fchomo/node.js:554 +#: htdocs/luci-static/resources/view/fchomo/server.js:287 msgid "v2" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:242 -#: htdocs/luci-static/resources/view/fchomo/node.js:509 -#: htdocs/luci-static/resources/view/fchomo/server.js:287 +#: htdocs/luci-static/resources/view/fchomo/node.js:250 +#: htdocs/luci-static/resources/view/fchomo/node.js:523 +#: htdocs/luci-static/resources/view/fchomo/server.js:288 msgid "v3" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1175 -#: htdocs/luci-static/resources/fchomo.js:1178 +#: htdocs/luci-static/resources/fchomo.js:1579 +#: htdocs/luci-static/resources/fchomo.js:1582 msgid "valid JSON format" msgstr "有效的 JSON 格式" -#: htdocs/luci-static/resources/view/fchomo/node.js:622 +#: htdocs/luci-static/resources/view/fchomo/node.js:641 msgid "valid SHA256 string with %d characters" msgstr "包含 %d 个字符的有效 SHA256 字符串" -#: htdocs/luci-static/resources/fchomo.js:1253 -#: htdocs/luci-static/resources/fchomo.js:1256 +#: htdocs/luci-static/resources/fchomo.js:1657 +#: htdocs/luci-static/resources/fchomo.js:1660 msgid "valid URL" msgstr "有效网址" -#: htdocs/luci-static/resources/fchomo.js:1188 +#: htdocs/luci-static/resources/fchomo.js:1592 msgid "valid base64 key with %d characters" msgstr "包含 %d 个字符的有效 base64 密钥" -#: htdocs/luci-static/resources/fchomo.js:1203 +#: htdocs/luci-static/resources/fchomo.js:1607 msgid "valid key length with %d characters" msgstr "包含 %d 个字符的有效密钥" -#: htdocs/luci-static/resources/fchomo.js:1157 +#: htdocs/luci-static/resources/fchomo.js:1561 msgid "valid port value" msgstr "有效端口值" -#: htdocs/luci-static/resources/fchomo.js:1266 +#: htdocs/luci-static/resources/fchomo.js:1670 msgid "valid uuid" msgstr "有效 uuid" -#: htdocs/luci-static/resources/fchomo.js:266 +#: htdocs/luci-static/resources/fchomo.js:1059 +msgid "vless-mlkem768" +msgstr "" + +#: htdocs/luci-static/resources/fchomo.js:1058 +msgid "vless-x25519" +msgstr "" + +#: htdocs/luci-static/resources/fchomo.js:274 msgid "xchacha20-ietf-poly1305" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:58 +#: htdocs/luci-static/resources/fchomo.js:56 msgid "yacd-meta" msgstr "yacd-meta" -#: htdocs/luci-static/resources/view/fchomo/node.js:789 +#: htdocs/luci-static/resources/view/fchomo/node.js:808 msgid "yamux" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:56 +#: htdocs/luci-static/resources/fchomo.js:54 msgid "zashboard" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:384 +#: htdocs/luci-static/resources/view/fchomo/node.js:398 msgid "zero" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:982 +#: htdocs/luci-static/resources/fchomo.js:997 msgid "🡇" msgstr "" +#~ msgid "Port range" +#~ msgstr "端口范围" + +#~ msgid "Default" +#~ msgstr "默认" + #~ msgid "%s Provider of type '%s' need to be filled in manually." #~ msgstr "%s 个类型为 “%s” 的供应商需要手动填写内容。" diff --git a/small/luci-app-fchomo/po/zh_Hant/fchomo.po b/small/luci-app-fchomo/po/zh_Hant/fchomo.po index 405ec58420..8333a6fbf6 100644 --- a/small/luci-app-fchomo/po/zh_Hant/fchomo.po +++ b/small/luci-app-fchomo/po/zh_Hant/fchomo.po @@ -8,11 +8,11 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Transfer-Encoding: 8bit\n" -#: htdocs/luci-static/resources/view/fchomo/log.js:69 +#: htdocs/luci-static/resources/view/fchomo/log.js:113 msgid "%s log" msgstr "%s 日誌" -#: htdocs/luci-static/resources/fchomo.js:528 +#: htdocs/luci-static/resources/fchomo.js:543 #: htdocs/luci-static/resources/view/fchomo/client.js:237 #: htdocs/luci-static/resources/view/fchomo/client.js:267 #: htdocs/luci-static/resources/view/fchomo/client.js:363 @@ -23,29 +23,38 @@ msgstr "(已導入)" #: htdocs/luci-static/resources/view/fchomo/client.js:925 #: htdocs/luci-static/resources/view/fchomo/client.js:938 #: htdocs/luci-static/resources/view/fchomo/client.js:939 -#: htdocs/luci-static/resources/view/fchomo/client.js:1143 -#: htdocs/luci-static/resources/view/fchomo/client.js:1584 -#: htdocs/luci-static/resources/view/fchomo/client.js:1585 -#: htdocs/luci-static/resources/view/fchomo/node.js:1317 -#: htdocs/luci-static/resources/view/fchomo/node.js:1325 -#: htdocs/luci-static/resources/view/fchomo/node.js:1339 -#: htdocs/luci-static/resources/view/fchomo/node.js:1347 +#: htdocs/luci-static/resources/view/fchomo/client.js:1151 +#: htdocs/luci-static/resources/view/fchomo/client.js:1615 +#: htdocs/luci-static/resources/view/fchomo/client.js:1616 +#: htdocs/luci-static/resources/view/fchomo/node.js:1336 +#: htdocs/luci-static/resources/view/fchomo/node.js:1344 +#: htdocs/luci-static/resources/view/fchomo/node.js:1358 +#: htdocs/luci-static/resources/view/fchomo/node.js:1366 msgid "-- Please choose --" msgstr "-- 請選擇 --" -#: htdocs/luci-static/resources/fchomo.js:40 +#: htdocs/luci-static/resources/fchomo.js:1048 +msgid "0-RTT reuse." +msgstr "0-RTT 重用。" + +#: htdocs/luci-static/resources/fchomo.js:1045 +#: htdocs/luci-static/resources/fchomo.js:1049 +msgid "1-RTT only." +msgstr "僅限 1-RTT。" + +#: htdocs/luci-static/resources/fchomo.js:38 msgid "163Music" msgstr "網易雲音樂" -#: htdocs/luci-static/resources/fchomo.js:268 +#: htdocs/luci-static/resources/fchomo.js:276 msgid "2022-blake3-aes-128-gcm" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:269 +#: htdocs/luci-static/resources/fchomo.js:277 msgid "2022-blake3-aes-256-gcm" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:270 +#: htdocs/luci-static/resources/fchomo.js:278 msgid "2022-blake3-chacha20-poly1305" msgstr "" @@ -53,44 +62,44 @@ msgstr "" msgid "0 or 1 only." msgstr "僅限 01。" -#: htdocs/luci-static/resources/view/fchomo/server.js:343 -#: htdocs/luci-static/resources/view/fchomo/server.js:358 +#: htdocs/luci-static/resources/view/fchomo/server.js:352 +#: htdocs/luci-static/resources/view/fchomo/server.js:367 msgid "Save your configuration before uploading files!" msgstr "上傳文件前請先保存配置!" -#: htdocs/luci-static/resources/view/fchomo/global.js:600 +#: htdocs/luci-static/resources/view/fchomo/global.js:590 msgid "API" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:640 +#: htdocs/luci-static/resources/view/fchomo/global.js:630 msgid "API DoH service" msgstr "API DoH 伺服器" -#: htdocs/luci-static/resources/view/fchomo/global.js:594 +#: htdocs/luci-static/resources/view/fchomo/global.js:584 msgid "API ECH config" msgstr "API ECH 配置" -#: htdocs/luci-static/resources/view/fchomo/global.js:557 +#: htdocs/luci-static/resources/view/fchomo/global.js:545 msgid "API ECH key" msgstr "API ECH 密鑰" -#: htdocs/luci-static/resources/view/fchomo/global.js:631 +#: htdocs/luci-static/resources/view/fchomo/global.js:621 msgid "API HTTP port" msgstr "API HTTP 連接埠" -#: htdocs/luci-static/resources/view/fchomo/global.js:635 +#: htdocs/luci-static/resources/view/fchomo/global.js:625 msgid "API HTTPS port" msgstr "API HTTPS 連接埠" -#: htdocs/luci-static/resources/view/fchomo/global.js:549 +#: htdocs/luci-static/resources/view/fchomo/global.js:537 msgid "API TLS certificate path" msgstr "API TLS 憑證路徑" -#: htdocs/luci-static/resources/view/fchomo/global.js:553 +#: htdocs/luci-static/resources/view/fchomo/global.js:541 msgid "API TLS private key path" msgstr "API TLS 私鑰" -#: htdocs/luci-static/resources/view/fchomo/global.js:644 +#: htdocs/luci-static/resources/view/fchomo/global.js:634 msgid "API secret" msgstr "API 令牌" @@ -98,16 +107,16 @@ msgstr "API 令牌" msgid "ASN version" msgstr "ASN 版本" -#: htdocs/luci-static/resources/view/fchomo/global.js:721 -#: htdocs/luci-static/resources/view/fchomo/global.js:771 +#: htdocs/luci-static/resources/view/fchomo/global.js:711 +#: htdocs/luci-static/resources/view/fchomo/global.js:761 msgid "Access Control" msgstr "訪問控制" -#: htdocs/luci-static/resources/view/fchomo/client.js:1519 +#: htdocs/luci-static/resources/view/fchomo/client.js:1544 msgid "Add a DNS policy" msgstr "新增 DNS 策略" -#: htdocs/luci-static/resources/view/fchomo/client.js:1298 +#: htdocs/luci-static/resources/view/fchomo/client.js:1307 msgid "Add a DNS server" msgstr "新增 DNS 伺服器" @@ -115,11 +124,11 @@ msgstr "新增 DNS 伺服器" msgid "Add a Node" msgstr "新增 節點" -#: htdocs/luci-static/resources/view/fchomo/node.js:896 +#: htdocs/luci-static/resources/view/fchomo/node.js:915 msgid "Add a provider" msgstr "新增 供應商" -#: htdocs/luci-static/resources/view/fchomo/node.js:1274 +#: htdocs/luci-static/resources/view/fchomo/node.js:1293 msgid "Add a proxy chain" msgstr "新增 代理鏈" @@ -139,45 +148,52 @@ msgstr "新增 規則集" msgid "Add a server" msgstr "新增 伺服器" -#: htdocs/luci-static/resources/view/fchomo/client.js:1176 +#: htdocs/luci-static/resources/view/fchomo/client.js:1185 msgid "Add a sub rule" msgstr "新增 子規則" -#: htdocs/luci-static/resources/view/fchomo/node.js:1099 +#: htdocs/luci-static/resources/view/fchomo/node.js:1118 msgid "Add prefix" msgstr "添加前綴" -#: htdocs/luci-static/resources/view/fchomo/node.js:1103 +#: htdocs/luci-static/resources/view/fchomo/node.js:1122 msgid "Add suffix" msgstr "添加後綴" -#: htdocs/luci-static/resources/view/fchomo/client.js:1344 -#: htdocs/luci-static/resources/view/fchomo/client.js:1349 +#: htdocs/luci-static/resources/view/fchomo/client.js:1369 +#: htdocs/luci-static/resources/view/fchomo/client.js:1374 msgid "Address" msgstr "位址" -#: htdocs/luci-static/resources/view/fchomo/global.js:526 +#: htdocs/luci-static/resources/fchomo.js:1052 +msgid "" +"After the 1-RTT client/server hello, padding randomly 111-1111 bytes with " +"100% probability." +msgstr "" +"在 1-RTT client/server hello 之後,以 100% 的機率隨機填充 111-1111 位元組。" + +#: htdocs/luci-static/resources/view/fchomo/global.js:514 msgid "Aging time of NAT map maintained by client.
" msgstr "客戶端維護的 NAT 映射 的老化時間。
" -#: htdocs/luci-static/resources/view/fchomo/global.js:774 -#: htdocs/luci-static/resources/view/fchomo/global.js:822 -#: htdocs/luci-static/resources/view/fchomo/global.js:841 +#: htdocs/luci-static/resources/view/fchomo/global.js:764 +#: htdocs/luci-static/resources/view/fchomo/global.js:827 +#: htdocs/luci-static/resources/view/fchomo/global.js:846 msgid "All allowed" msgstr "允許所有" -#: htdocs/luci-static/resources/fchomo.js:193 +#: htdocs/luci-static/resources/fchomo.js:201 msgid "All ports" msgstr "所有連接埠" -#: htdocs/luci-static/resources/view/fchomo/global.js:627 +#: htdocs/luci-static/resources/view/fchomo/global.js:617 msgid "" "Allow access from private network.
To access the API on a private " "network from a public website, it must be enabled." msgstr "" "允許從私有網路訪問。
要從公共網站訪問私有網路上的 API,則必須啟用。" -#: htdocs/luci-static/resources/view/fchomo/node.js:445 +#: htdocs/luci-static/resources/view/fchomo/node.js:459 msgid "Allowed IPs" msgstr "允許的 IP" @@ -189,13 +205,13 @@ msgstr "已是最新版本。" msgid "Already in updating." msgstr "已在更新中。" -#: htdocs/luci-static/resources/view/fchomo/node.js:374 -#: htdocs/luci-static/resources/view/fchomo/server.js:257 +#: htdocs/luci-static/resources/view/fchomo/node.js:388 +#: htdocs/luci-static/resources/view/fchomo/server.js:258 msgid "Alter ID" msgstr "額外 ID" -#: htdocs/luci-static/resources/fchomo.js:125 -#: htdocs/luci-static/resources/fchomo.js:157 +#: htdocs/luci-static/resources/fchomo.js:131 +#: htdocs/luci-static/resources/fchomo.js:163 msgid "AnyTLS" msgstr "" @@ -212,11 +228,11 @@ msgstr "作為 dnsmasq 的最優先上游" msgid "As the TOP upstream of dnsmasq." msgstr "作為 dnsmasq 的最優先上游。" -#: htdocs/luci-static/resources/view/fchomo/server.js:207 +#: htdocs/luci-static/resources/view/fchomo/server.js:208 msgid "Auth timeout" msgstr "認證超時" -#: htdocs/luci-static/resources/view/fchomo/node.js:396 +#: htdocs/luci-static/resources/view/fchomo/node.js:410 msgid "Authenticated length" msgstr "認證長度" @@ -224,7 +240,7 @@ msgstr "認證長度" msgid "Auto" msgstr "自動" -#: htdocs/luci-static/resources/view/fchomo/server.js:81 +#: htdocs/luci-static/resources/view/fchomo/server.js:82 msgid "Auto configure firewall" msgstr "自動配置防火牆" @@ -236,45 +252,44 @@ msgstr "自動更新" msgid "Auto update resources." msgstr "自動更新資源文件。" -#: htdocs/luci-static/resources/fchomo.js:39 +#: htdocs/luci-static/resources/fchomo.js:37 msgid "Baidu" msgstr "百度" -#: htdocs/luci-static/resources/view/fchomo/global.js:498 -#: htdocs/luci-static/resources/view/fchomo/global.js:509 +#: htdocs/luci-static/resources/view/fchomo/global.js:496 msgid "Based on google/gvisor." msgstr "基於 google/gvisor。" -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:263 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:271 msgid "Behavior" msgstr "行為" -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:272 -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:286 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:280 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:294 msgid "Binary format only supports domain / ipcidr" msgstr "二進位格式僅支持 domain/ipcidr" -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:280 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:288 msgid "Binary mrs" msgstr "二進位 mrs" -#: htdocs/luci-static/resources/view/fchomo/global.js:735 -#: htdocs/luci-static/resources/view/fchomo/node.js:866 -#: htdocs/luci-static/resources/view/fchomo/node.js:1172 +#: htdocs/luci-static/resources/view/fchomo/global.js:725 +#: htdocs/luci-static/resources/view/fchomo/node.js:885 +#: htdocs/luci-static/resources/view/fchomo/node.js:1191 msgid "Bind interface" msgstr "綁定介面" -#: htdocs/luci-static/resources/view/fchomo/node.js:867 -#: htdocs/luci-static/resources/view/fchomo/node.js:1173 +#: htdocs/luci-static/resources/view/fchomo/node.js:886 +#: htdocs/luci-static/resources/view/fchomo/node.js:1192 msgid "Bind outbound interface.
" msgstr "綁定出站介面。
" -#: htdocs/luci-static/resources/view/fchomo/global.js:736 +#: htdocs/luci-static/resources/view/fchomo/global.js:726 msgid "" "Bind outbound traffic to specific interface. Leave empty to auto detect.
" msgstr "綁定出站流量至指定介面。留空自動檢測。
" -#: htdocs/luci-static/resources/view/fchomo/global.js:776 +#: htdocs/luci-static/resources/view/fchomo/global.js:766 msgid "Black list" msgstr "黑名單" @@ -282,58 +297,58 @@ msgstr "黑名單" msgid "Block DNS queries" msgstr "封鎖 DNS 請求" -#: htdocs/luci-static/resources/view/fchomo/client.js:1250 +#: htdocs/luci-static/resources/view/fchomo/client.js:1259 msgid "Bootstrap DNS server" msgstr "引導 DNS 伺服器" -#: htdocs/luci-static/resources/view/fchomo/client.js:1257 +#: htdocs/luci-static/resources/view/fchomo/client.js:1266 msgid "Bootstrap DNS server (Node)" msgstr "引導 DNS 伺服器 (節點)" -#: htdocs/luci-static/resources/view/fchomo/global.js:823 +#: htdocs/luci-static/resources/view/fchomo/global.js:828 msgid "Bypass CN" msgstr "繞過 CN 流量" -#: htdocs/luci-static/resources/view/fchomo/global.js:842 +#: htdocs/luci-static/resources/view/fchomo/global.js:847 msgid "Bypass DSCP" msgstr "繞過 DSCP" -#: htdocs/luci-static/resources/view/fchomo/global.js:622 +#: htdocs/luci-static/resources/view/fchomo/global.js:612 msgid "CORS Allow origins" msgstr "CORS 允許的來源" -#: htdocs/luci-static/resources/view/fchomo/global.js:626 +#: htdocs/luci-static/resources/view/fchomo/global.js:616 msgid "CORS Allow private network" msgstr "CORS 允許私有網路" -#: htdocs/luci-static/resources/view/fchomo/global.js:623 +#: htdocs/luci-static/resources/view/fchomo/global.js:613 msgid "CORS allowed origins, * will be used if empty." msgstr "CORS 允許的來源,留空則使用 *。" -#: htdocs/luci-static/resources/fchomo.js:548 +#: htdocs/luci-static/resources/fchomo.js:563 msgid "Cancel" msgstr "取消" -#: htdocs/luci-static/resources/view/fchomo/node.js:616 +#: htdocs/luci-static/resources/view/fchomo/node.js:635 msgid "Cert fingerprint" msgstr "憑證指紋" -#: htdocs/luci-static/resources/view/fchomo/node.js:617 +#: htdocs/luci-static/resources/view/fchomo/node.js:636 msgid "" "Certificate fingerprint. Used to implement SSL Pinning and prevent MitM." msgstr "憑證指紋。用於實現 SSL憑證固定 並防止 MitM。" -#: htdocs/luci-static/resources/view/fchomo/server.js:335 +#: htdocs/luci-static/resources/view/fchomo/server.js:344 msgid "Certificate path" msgstr "憑證路徑" -#: htdocs/luci-static/resources/view/fchomo/node.js:1316 -#: htdocs/luci-static/resources/view/fchomo/node.js:1322 +#: htdocs/luci-static/resources/view/fchomo/node.js:1335 +#: htdocs/luci-static/resources/view/fchomo/node.js:1341 msgid "Chain head" msgstr "鏈頭" -#: htdocs/luci-static/resources/view/fchomo/node.js:1338 -#: htdocs/luci-static/resources/view/fchomo/node.js:1344 +#: htdocs/luci-static/resources/view/fchomo/node.js:1357 +#: htdocs/luci-static/resources/view/fchomo/node.js:1363 msgid "Chain tail" msgstr "鏈尾" @@ -362,13 +377,13 @@ msgstr "大陸 IPv6 庫版本" msgid "China list version" msgstr "大陸網域清單版本" -#: htdocs/luci-static/resources/view/fchomo/node.js:193 -#: htdocs/luci-static/resources/view/fchomo/node.js:380 -#: htdocs/luci-static/resources/view/fchomo/server.js:161 +#: htdocs/luci-static/resources/view/fchomo/node.js:194 +#: htdocs/luci-static/resources/view/fchomo/node.js:394 +#: htdocs/luci-static/resources/view/fchomo/server.js:162 msgid "Chipher" msgstr "加密方法" -#: htdocs/luci-static/resources/view/fchomo/log.js:76 +#: htdocs/luci-static/resources/view/fchomo/log.js:121 msgid "Clean log" msgstr "清空日誌" @@ -380,11 +395,12 @@ msgstr "" "點擊此處下載" "最新的初始包。" +#: htdocs/luci-static/resources/fchomo.js:1235 #: root/usr/share/luci/menu.d/luci-app-fchomo.json:22 msgid "Client" msgstr "客戶端" -#: htdocs/luci-static/resources/view/fchomo/node.js:650 +#: htdocs/luci-static/resources/view/fchomo/node.js:669 msgid "Client fingerprint" msgstr "客戶端指紋" @@ -392,25 +408,25 @@ msgstr "客戶端指紋" msgid "Client status" msgstr "客戶端狀態" -#: htdocs/luci-static/resources/view/fchomo/log.js:39 +#: htdocs/luci-static/resources/view/fchomo/log.js:83 msgid "Collecting data..." msgstr "收集資料中..." -#: htdocs/luci-static/resources/fchomo.js:194 -#: htdocs/luci-static/resources/fchomo.js:195 +#: htdocs/luci-static/resources/fchomo.js:202 +#: htdocs/luci-static/resources/fchomo.js:203 msgid "Common ports (bypass P2P traffic)" msgstr "常用連接埠(繞過 P2P 流量)" -#: htdocs/luci-static/resources/fchomo.js:1091 +#: htdocs/luci-static/resources/fchomo.js:1473 msgid "Complete" msgstr "完成" -#: htdocs/luci-static/resources/view/fchomo/node.js:1119 +#: htdocs/luci-static/resources/view/fchomo/node.js:1138 msgid "Configuration Items" msgstr "配置項" -#: htdocs/luci-static/resources/view/fchomo/node.js:260 -#: htdocs/luci-static/resources/view/fchomo/server.js:185 +#: htdocs/luci-static/resources/view/fchomo/node.js:268 +#: htdocs/luci-static/resources/view/fchomo/server.js:186 msgid "Congestion controller" msgstr "擁塞控制器" @@ -418,16 +434,20 @@ msgstr "擁塞控制器" msgid "Connection check" msgstr "連接檢查" +#: htdocs/luci-static/resources/fchomo.js:1088 +msgid "Content copied to clipboard!" +msgstr "內容已複製到剪貼簿!" + #: htdocs/luci-static/resources/view/fchomo/client.js:598 -#: htdocs/luci-static/resources/view/fchomo/node.js:1041 -#: htdocs/luci-static/resources/view/fchomo/node.js:1055 -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:320 -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:334 +#: htdocs/luci-static/resources/view/fchomo/node.js:1060 +#: htdocs/luci-static/resources/view/fchomo/node.js:1074 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:328 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:342 msgid "Content will not be verified, Please make sure you enter it correctly." msgstr "內容將不會被驗證,請確保輸入正確。" -#: htdocs/luci-static/resources/view/fchomo/node.js:1040 -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:319 +#: htdocs/luci-static/resources/view/fchomo/node.js:1059 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:327 msgid "Contents" msgstr "內容" @@ -435,6 +455,10 @@ msgstr "內容" msgid "Contents have been saved." msgstr "" +#: htdocs/luci-static/resources/fchomo.js:1090 +msgid "Copy" +msgstr "複製" + #: htdocs/luci-static/resources/view/fchomo/global.js:166 msgid "Core version" msgstr "核心版本" @@ -443,15 +467,15 @@ msgstr "核心版本" msgid "Cron expression" msgstr "Cron 表達式" -#: htdocs/luci-static/resources/view/fchomo/global.js:860 +#: htdocs/luci-static/resources/view/fchomo/global.js:865 msgid "Custom Direct List" msgstr "自訂直連清單" -#: htdocs/luci-static/resources/view/fchomo/node.js:1090 +#: htdocs/luci-static/resources/view/fchomo/node.js:1109 msgid "Custom HTTP header." msgstr "自訂 HTTP header。" -#: htdocs/luci-static/resources/view/fchomo/global.js:878 +#: htdocs/luci-static/resources/view/fchomo/global.js:883 msgid "Custom Proxy List" msgstr "自訂代理清單" @@ -460,31 +484,31 @@ msgid "" "Custom internal hosts. Support yaml or json format." msgstr "自訂內部 hosts。支援 yamljson 格式。" -#: htdocs/luci-static/resources/fchomo.js:147 +#: htdocs/luci-static/resources/fchomo.js:153 msgid "DIRECT" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1510 -#: htdocs/luci-static/resources/view/fchomo/client.js:1519 +#: htdocs/luci-static/resources/view/fchomo/client.js:1535 +#: htdocs/luci-static/resources/view/fchomo/client.js:1544 msgid "DNS policy" msgstr "DNS 策略" -#: htdocs/luci-static/resources/view/fchomo/global.js:473 +#: htdocs/luci-static/resources/view/fchomo/global.js:471 msgid "DNS port" msgstr " DNS 連接埠" -#: htdocs/luci-static/resources/view/fchomo/client.js:1289 #: htdocs/luci-static/resources/view/fchomo/client.js:1298 -#: htdocs/luci-static/resources/view/fchomo/client.js:1597 -#: htdocs/luci-static/resources/view/fchomo/node.js:469 +#: htdocs/luci-static/resources/view/fchomo/client.js:1307 +#: htdocs/luci-static/resources/view/fchomo/client.js:1628 +#: htdocs/luci-static/resources/view/fchomo/node.js:483 msgid "DNS server" msgstr "DNS 伺服器" -#: htdocs/luci-static/resources/view/fchomo/client.js:1236 +#: htdocs/luci-static/resources/view/fchomo/client.js:1245 msgid "DNS settings" msgstr "DNS 設定" -#: htdocs/luci-static/resources/view/fchomo/global.js:845 +#: htdocs/luci-static/resources/view/fchomo/global.js:850 msgid "DSCP list" msgstr "DSCP 清單" @@ -492,32 +516,28 @@ msgstr "DSCP 清單" msgid "Dashboard version" msgstr "面板版本" -#: htdocs/luci-static/resources/view/fchomo/global.js:411 +#: htdocs/luci-static/resources/fchomo.js:72 msgid "Debug" msgstr "調試" -#: htdocs/luci-static/resources/view/fchomo/node.js:271 -msgid "Default" -msgstr "預設" - #: htdocs/luci-static/resources/view/fchomo/client.js:53 msgid "Default DNS (issued by WAN)" msgstr "預設 DNS(由 WAN 下發)" -#: htdocs/luci-static/resources/view/fchomo/client.js:1264 +#: htdocs/luci-static/resources/view/fchomo/client.js:1273 msgid "Default DNS server" msgstr "預設 DNS 伺服器" -#: htdocs/luci-static/resources/view/fchomo/node.js:446 +#: htdocs/luci-static/resources/view/fchomo/node.js:460 msgid "Destination addresses allowed to be forwarded via Wireguard." msgstr "允許通過 WireGuard 轉發的目的位址" -#: htdocs/luci-static/resources/view/fchomo/node.js:94 +#: htdocs/luci-static/resources/view/fchomo/node.js:95 msgid "Dial fields" msgstr "撥號欄位" -#: htdocs/luci-static/resources/view/fchomo/node.js:1331 -#: htdocs/luci-static/resources/view/fchomo/node.js:1353 +#: htdocs/luci-static/resources/view/fchomo/node.js:1350 +#: htdocs/luci-static/resources/view/fchomo/node.js:1372 msgid "Different chain head/tail" msgstr "不同的鏈頭/鏈尾" @@ -525,33 +545,37 @@ msgstr "不同的鏈頭/鏈尾" msgid "Direct" msgstr "直連" -#: htdocs/luci-static/resources/view/fchomo/global.js:778 +#: htdocs/luci-static/resources/view/fchomo/global.js:768 msgid "Direct IPv4 IP-s" msgstr "直連 IPv4 位址" -#: htdocs/luci-static/resources/view/fchomo/global.js:781 +#: htdocs/luci-static/resources/view/fchomo/global.js:771 msgid "Direct IPv6 IP-s" msgstr "直連 IPv6 位址" -#: htdocs/luci-static/resources/view/fchomo/global.js:784 +#: htdocs/luci-static/resources/view/fchomo/global.js:774 msgid "Direct MAC-s" msgstr "直連 MAC 位址" #: htdocs/luci-static/resources/view/fchomo/global.js:403 -#: htdocs/luci-static/resources/view/fchomo/node.js:159 -#: htdocs/luci-static/resources/view/fchomo/server.js:141 +#: htdocs/luci-static/resources/view/fchomo/node.js:160 +#: htdocs/luci-static/resources/view/fchomo/server.js:142 msgid "Disable" msgstr "停用" -#: htdocs/luci-static/resources/view/fchomo/global.js:712 +#: htdocs/luci-static/resources/view/fchomo/global.js:702 msgid "Disable ECN of quic-go" msgstr "停用 quic-go 的 明確壅塞通知(ECN)" -#: htdocs/luci-static/resources/view/fchomo/global.js:709 +#: htdocs/luci-static/resources/view/fchomo/global.js:699 msgid "Disable GSO of quic-go" msgstr "停用 quic-go 的 通用分段卸載(GSO)" -#: htdocs/luci-static/resources/view/fchomo/node.js:565 +#: htdocs/luci-static/resources/view/fchomo/global.js:523 +msgid "Disable ICMP Forwarding" +msgstr "禁用 ICMP 轉發" + +#: htdocs/luci-static/resources/view/fchomo/node.js:584 msgid "Disable SNI" msgstr "停用 SNI" @@ -559,15 +583,15 @@ msgstr "停用 SNI" msgid "Disable UDP" msgstr "停用 UDP" -#: htdocs/luci-static/resources/view/fchomo/global.js:706 +#: htdocs/luci-static/resources/view/fchomo/global.js:696 msgid "Disable safe path check" msgstr "禁用安全路徑檢查" -#: htdocs/luci-static/resources/view/fchomo/client.js:1476 +#: htdocs/luci-static/resources/view/fchomo/client.js:1501 msgid "Discard A responses" msgstr "丟棄 A 回應" -#: htdocs/luci-static/resources/view/fchomo/client.js:1492 +#: htdocs/luci-static/resources/view/fchomo/client.js:1517 msgid "Discard AAAA responses" msgstr "丟棄 AAAA 回應" @@ -579,70 +603,70 @@ msgstr "" "不要將網域連線解析為 IP 以進行此次匹配。
僅對未經 DNS 解析的純網域入站連" "線有效。例如,socks5h" -#: htdocs/luci-static/resources/view/fchomo/client.js:1567 -#: htdocs/luci-static/resources/view/fchomo/client.js:1572 -#: htdocs/luci-static/resources/view/fchomo/client.js:1637 -#: htdocs/luci-static/resources/view/fchomo/client.js:1644 -#: htdocs/luci-static/resources/view/fchomo/client.js:1646 +#: htdocs/luci-static/resources/view/fchomo/client.js:1598 +#: htdocs/luci-static/resources/view/fchomo/client.js:1603 +#: htdocs/luci-static/resources/view/fchomo/client.js:1668 +#: htdocs/luci-static/resources/view/fchomo/client.js:1675 +#: htdocs/luci-static/resources/view/fchomo/client.js:1677 msgid "Domain" msgstr "網域" -#: htdocs/luci-static/resources/view/fchomo/node.js:566 +#: htdocs/luci-static/resources/view/fchomo/node.js:585 msgid "Donot send server name in ClientHello." msgstr "不要在 ClientHello 中傳送伺服器名稱。" -#: htdocs/luci-static/resources/view/fchomo/client.js:1424 -#: htdocs/luci-static/resources/view/fchomo/node.js:630 -#: htdocs/luci-static/resources/view/fchomo/node.js:1159 +#: htdocs/luci-static/resources/view/fchomo/client.js:1449 +#: htdocs/luci-static/resources/view/fchomo/node.js:649 +#: htdocs/luci-static/resources/view/fchomo/node.js:1178 msgid "Donot verifying server certificate." msgstr "不驗證伺服器憑證。" -#: htdocs/luci-static/resources/view/fchomo/node.js:845 +#: htdocs/luci-static/resources/view/fchomo/node.js:864 msgid "Download bandwidth" msgstr "下載頻寬" -#: htdocs/luci-static/resources/view/fchomo/node.js:846 +#: htdocs/luci-static/resources/view/fchomo/node.js:865 msgid "Download bandwidth in Mbps." msgstr "下載頻寬(單位:Mbps)。" -#: htdocs/luci-static/resources/fchomo.js:977 +#: htdocs/luci-static/resources/fchomo.js:992 msgid "Download failed: %s" msgstr "下載失敗: %s" -#: htdocs/luci-static/resources/fchomo.js:975 +#: htdocs/luci-static/resources/fchomo.js:990 msgid "Download successful." msgstr "下載成功。" -#: htdocs/luci-static/resources/fchomo.js:133 +#: htdocs/luci-static/resources/fchomo.js:139 msgid "Dual stack" msgstr "雙棧" -#: htdocs/luci-static/resources/view/fchomo/node.js:643 -#: htdocs/luci-static/resources/view/fchomo/server.js:404 +#: htdocs/luci-static/resources/view/fchomo/node.js:662 +#: htdocs/luci-static/resources/view/fchomo/server.js:415 msgid "ECH config" msgstr "ECH 配置" -#: htdocs/luci-static/resources/view/fchomo/server.js:365 +#: htdocs/luci-static/resources/view/fchomo/server.js:374 msgid "ECH key" msgstr "ECH 密鑰" -#: htdocs/luci-static/resources/view/fchomo/client.js:1458 +#: htdocs/luci-static/resources/view/fchomo/client.js:1483 msgid "ECS override" msgstr "強制覆蓋 ECS" -#: htdocs/luci-static/resources/view/fchomo/client.js:1442 +#: htdocs/luci-static/resources/view/fchomo/client.js:1467 msgid "EDNS Client Subnet" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:414 +#: htdocs/luci-static/resources/view/fchomo/global.js:412 msgid "ETag support" msgstr "ETag 支援" -#: htdocs/luci-static/resources/view/fchomo/node.js:758 +#: htdocs/luci-static/resources/view/fchomo/node.js:777 msgid "Early Data first packet length limit." msgstr "前置數據長度閾值" -#: htdocs/luci-static/resources/view/fchomo/node.js:764 +#: htdocs/luci-static/resources/view/fchomo/node.js:783 msgid "Early Data header name" msgstr "前置數據標頭" @@ -654,30 +678,34 @@ msgstr "編輯節點" msgid "Edit ruleset" msgstr "編輯規則集" -#: htdocs/luci-static/resources/view/fchomo/node.js:1038 -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:317 +#: htdocs/luci-static/resources/view/fchomo/node.js:1057 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:325 msgid "Editer" msgstr "編輯器" +#: htdocs/luci-static/resources/fchomo.js:1039 +msgid "Eliminate encryption header characteristics" +msgstr "消除加密頭特徵" + #: htdocs/luci-static/resources/view/fchomo/client.js:809 #: htdocs/luci-static/resources/view/fchomo/client.js:906 #: htdocs/luci-static/resources/view/fchomo/client.js:1135 -#: htdocs/luci-static/resources/view/fchomo/client.js:1222 -#: htdocs/luci-static/resources/view/fchomo/client.js:1340 -#: htdocs/luci-static/resources/view/fchomo/client.js:1562 +#: htdocs/luci-static/resources/view/fchomo/client.js:1231 +#: htdocs/luci-static/resources/view/fchomo/client.js:1365 +#: htdocs/luci-static/resources/view/fchomo/client.js:1587 #: htdocs/luci-static/resources/view/fchomo/global.js:401 -#: htdocs/luci-static/resources/view/fchomo/global.js:681 -#: htdocs/luci-static/resources/view/fchomo/node.js:101 -#: htdocs/luci-static/resources/view/fchomo/node.js:1011 -#: htdocs/luci-static/resources/view/fchomo/node.js:1195 -#: htdocs/luci-static/resources/view/fchomo/node.js:1284 +#: htdocs/luci-static/resources/view/fchomo/global.js:671 +#: htdocs/luci-static/resources/view/fchomo/node.js:102 +#: htdocs/luci-static/resources/view/fchomo/node.js:1030 +#: htdocs/luci-static/resources/view/fchomo/node.js:1214 +#: htdocs/luci-static/resources/view/fchomo/node.js:1303 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:253 #: htdocs/luci-static/resources/view/fchomo/server.js:50 -#: htdocs/luci-static/resources/view/fchomo/server.js:76 +#: htdocs/luci-static/resources/view/fchomo/server.js:77 msgid "Enable" msgstr "啟用" -#: htdocs/luci-static/resources/view/fchomo/node.js:295 +#: htdocs/luci-static/resources/view/fchomo/node.js:303 msgid "" "Enable 0-RTT QUIC connection handshake on the client side. This is not " "impacting much on the performance, as the protocol is fully multiplexed.
強烈建議停用此功能,因為它容易受到重放攻擊。" -#: htdocs/luci-static/resources/view/fchomo/node.js:294 +#: htdocs/luci-static/resources/view/fchomo/node.js:302 msgid "Enable 0-RTT handshake" msgstr "啟用 0-RTT 握手" -#: htdocs/luci-static/resources/view/fchomo/global.js:715 +#: htdocs/luci-static/resources/view/fchomo/global.js:705 msgid "" "Enable IP4P " "conversion for outbound connections" @@ -698,53 +726,57 @@ msgstr "" "為出站連線啟用 IP4P 轉換" -#: htdocs/luci-static/resources/view/fchomo/node.js:637 +#: htdocs/luci-static/resources/view/fchomo/node.js:656 msgid "Enable ECH" msgstr "啟用 ECH" -#: htdocs/luci-static/resources/view/fchomo/node.js:833 +#: htdocs/luci-static/resources/view/fchomo/node.js:852 msgid "Enable TCP Brutal" msgstr "啟用 TCP Brutal" -#: htdocs/luci-static/resources/view/fchomo/node.js:834 +#: htdocs/luci-static/resources/view/fchomo/node.js:853 msgid "Enable TCP Brutal congestion control algorithm" msgstr "啟用 TCP Brutal 擁塞控制演算法。" -#: htdocs/luci-static/resources/view/fchomo/node.js:822 +#: htdocs/luci-static/resources/view/fchomo/node.js:841 msgid "Enable multiplexing only for TCP." msgstr "僅為 TCP 啟用多路復用。" -#: htdocs/luci-static/resources/view/fchomo/node.js:816 +#: htdocs/luci-static/resources/view/fchomo/node.js:835 msgid "Enable padding" msgstr "啟用填充" -#: htdocs/luci-static/resources/view/fchomo/node.js:827 +#: htdocs/luci-static/resources/view/fchomo/node.js:846 msgid "Enable statistic" msgstr "啟用統計" -#: htdocs/luci-static/resources/view/fchomo/node.js:533 -#: htdocs/luci-static/resources/view/fchomo/node.js:1141 +#: htdocs/luci-static/resources/view/fchomo/node.js:547 +#: htdocs/luci-static/resources/view/fchomo/node.js:1160 msgid "" "Enable the SUoT protocol, requires server support. Conflict with Multiplex." msgstr "啟用 SUoT 協議,需要服務端支援。與多路復用衝突。" -#: htdocs/luci-static/resources/view/fchomo/node.js:165 -#: htdocs/luci-static/resources/view/fchomo/server.js:147 +#: htdocs/luci-static/resources/view/fchomo/node.js:166 +#: htdocs/luci-static/resources/view/fchomo/server.js:148 msgid "" "Enabling obfuscation will make the server incompatible with standard QUIC " "connections, losing the ability to masquerade with HTTP/3." msgstr "啟用混淆將使伺服器與標準的 QUIC 連線不相容,失去 HTTP/3 偽裝的能力。" -#: htdocs/luci-static/resources/view/fchomo/global.js:531 +#: htdocs/luci-static/resources/fchomo.js:1200 +msgid "Encryption method" +msgstr "加密方法" + +#: htdocs/luci-static/resources/view/fchomo/global.js:519 msgid "Endpoint-Independent NAT" msgstr "端點獨立 NAT" #: htdocs/luci-static/resources/view/fchomo/client.js:650 -#: htdocs/luci-static/resources/view/fchomo/client.js:1589 +#: htdocs/luci-static/resources/view/fchomo/client.js:1620 msgid "Entry" msgstr "條目" -#: htdocs/luci-static/resources/view/fchomo/global.js:408 +#: htdocs/luci-static/resources/fchomo.js:69 msgid "Error" msgstr "錯誤" @@ -754,7 +786,7 @@ msgid "" "if empty." msgstr "超過此限制將會觸發強制健康檢查。留空則使用 5。" -#: htdocs/luci-static/resources/view/fchomo/node.js:1253 +#: htdocs/luci-static/resources/view/fchomo/node.js:1272 msgid "Exclude matched node types." msgstr "排除匹配的節點類型。" @@ -767,7 +799,7 @@ msgstr "" "rel=\"noreferrer noopener\">此處。" #: htdocs/luci-static/resources/view/fchomo/client.js:1043 -#: htdocs/luci-static/resources/view/fchomo/node.js:1246 +#: htdocs/luci-static/resources/view/fchomo/node.js:1265 msgid "Exclude nodes that meet keywords or regexps." msgstr "排除匹配關鍵字或表達式的節點。" @@ -776,56 +808,59 @@ msgid "Expand/Collapse result" msgstr "展開/收起 結果" #: htdocs/luci-static/resources/view/fchomo/client.js:1003 -#: htdocs/luci-static/resources/view/fchomo/node.js:1231 +#: htdocs/luci-static/resources/view/fchomo/node.js:1250 msgid "Expected HTTP code. 204 will be used if empty." msgstr "預期的 HTTP code。留空則使用 204。" #: htdocs/luci-static/resources/view/fchomo/client.js:1005 -#: htdocs/luci-static/resources/view/fchomo/node.js:1233 +#: htdocs/luci-static/resources/view/fchomo/node.js:1252 msgid "Expected status" msgstr "預期狀態" -#: htdocs/luci-static/resources/fchomo.js:334 -#: htdocs/luci-static/resources/fchomo.js:337 -#: htdocs/luci-static/resources/fchomo.js:340 -#: htdocs/luci-static/resources/fchomo.js:1108 -#: htdocs/luci-static/resources/fchomo.js:1116 -#: htdocs/luci-static/resources/fchomo.js:1124 -#: htdocs/luci-static/resources/fchomo.js:1147 -#: htdocs/luci-static/resources/fchomo.js:1150 -#: htdocs/luci-static/resources/fchomo.js:1157 -#: htdocs/luci-static/resources/fchomo.js:1175 -#: htdocs/luci-static/resources/fchomo.js:1178 -#: htdocs/luci-static/resources/fchomo.js:1188 -#: htdocs/luci-static/resources/fchomo.js:1201 -#: htdocs/luci-static/resources/fchomo.js:1203 -#: htdocs/luci-static/resources/fchomo.js:1216 -#: htdocs/luci-static/resources/fchomo.js:1225 -#: htdocs/luci-static/resources/fchomo.js:1232 -#: htdocs/luci-static/resources/fchomo.js:1241 -#: htdocs/luci-static/resources/fchomo.js:1253 +#: htdocs/luci-static/resources/fchomo.js:342 +#: htdocs/luci-static/resources/fchomo.js:345 +#: htdocs/luci-static/resources/fchomo.js:348 +#: htdocs/luci-static/resources/fchomo.js:1228 #: htdocs/luci-static/resources/fchomo.js:1256 -#: htdocs/luci-static/resources/fchomo.js:1266 +#: htdocs/luci-static/resources/fchomo.js:1362 +#: htdocs/luci-static/resources/fchomo.js:1512 +#: htdocs/luci-static/resources/fchomo.js:1520 +#: htdocs/luci-static/resources/fchomo.js:1528 +#: htdocs/luci-static/resources/fchomo.js:1551 +#: htdocs/luci-static/resources/fchomo.js:1554 +#: htdocs/luci-static/resources/fchomo.js:1561 +#: htdocs/luci-static/resources/fchomo.js:1579 +#: htdocs/luci-static/resources/fchomo.js:1582 +#: htdocs/luci-static/resources/fchomo.js:1592 +#: htdocs/luci-static/resources/fchomo.js:1605 +#: htdocs/luci-static/resources/fchomo.js:1607 +#: htdocs/luci-static/resources/fchomo.js:1620 +#: htdocs/luci-static/resources/fchomo.js:1629 +#: htdocs/luci-static/resources/fchomo.js:1636 +#: htdocs/luci-static/resources/fchomo.js:1645 +#: htdocs/luci-static/resources/fchomo.js:1657 +#: htdocs/luci-static/resources/fchomo.js:1660 +#: htdocs/luci-static/resources/fchomo.js:1670 #: htdocs/luci-static/resources/view/fchomo/client.js:66 #: htdocs/luci-static/resources/view/fchomo/client.js:900 -#: htdocs/luci-static/resources/view/fchomo/client.js:1355 -#: htdocs/luci-static/resources/view/fchomo/global.js:851 -#: htdocs/luci-static/resources/view/fchomo/node.js:622 -#: htdocs/luci-static/resources/view/fchomo/node.js:1331 -#: htdocs/luci-static/resources/view/fchomo/node.js:1353 -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:272 -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:286 +#: htdocs/luci-static/resources/view/fchomo/client.js:1380 +#: htdocs/luci-static/resources/view/fchomo/global.js:856 +#: htdocs/luci-static/resources/view/fchomo/node.js:641 +#: htdocs/luci-static/resources/view/fchomo/node.js:1350 +#: htdocs/luci-static/resources/view/fchomo/node.js:1372 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:280 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:294 msgid "Expecting: %s" msgstr "請輸入:%s" -#: htdocs/luci-static/resources/view/fchomo/node.js:699 -#: htdocs/luci-static/resources/view/fchomo/node.js:706 -#: htdocs/luci-static/resources/view/fchomo/server.js:470 -#: htdocs/luci-static/resources/view/fchomo/server.js:477 +#: htdocs/luci-static/resources/view/fchomo/node.js:718 +#: htdocs/luci-static/resources/view/fchomo/node.js:725 +#: htdocs/luci-static/resources/view/fchomo/server.js:482 +#: htdocs/luci-static/resources/view/fchomo/server.js:489 msgid "Expecting: only support %s." msgstr "請輸入:僅支援 %s." -#: htdocs/luci-static/resources/view/fchomo/global.js:700 +#: htdocs/luci-static/resources/view/fchomo/global.js:690 msgid "Experimental" msgstr "實驗性" @@ -840,62 +875,62 @@ msgstr "實驗性" msgid "Factor" msgstr "條件" -#: htdocs/luci-static/resources/fchomo.js:1049 +#: htdocs/luci-static/resources/fchomo.js:1431 msgid "Failed to execute \"/etc/init.d/fchomo %s %s\" reason: %s" msgstr "無法執行 \"/etc/init.d/fchomo %s %s\" 原因: %s" -#: htdocs/luci-static/resources/fchomo.js:1008 +#: htdocs/luci-static/resources/fchomo.js:1390 msgid "Failed to generate %s, error: %s." -msgstr "" +msgstr "生成 %s 失敗,錯誤:%s。" -#: htdocs/luci-static/resources/fchomo.js:1366 +#: htdocs/luci-static/resources/fchomo.js:1770 msgid "Failed to upload %s, error: %s." msgstr "上傳 %s 失敗,錯誤:%s。" -#: htdocs/luci-static/resources/fchomo.js:1385 +#: htdocs/luci-static/resources/fchomo.js:1789 msgid "Failed to upload, error: %s." msgstr "上傳失敗,錯誤:%s。" -#: htdocs/luci-static/resources/fchomo.js:186 +#: htdocs/luci-static/resources/fchomo.js:194 msgid "Fallback" msgstr "自動回退" -#: htdocs/luci-static/resources/view/fchomo/client.js:1271 -#: htdocs/luci-static/resources/view/fchomo/client.js:1272 -#: htdocs/luci-static/resources/view/fchomo/client.js:1283 +#: htdocs/luci-static/resources/view/fchomo/client.js:1280 +#: htdocs/luci-static/resources/view/fchomo/client.js:1281 +#: htdocs/luci-static/resources/view/fchomo/client.js:1292 msgid "Fallback DNS server" msgstr "後備 DNS 伺服器" -#: htdocs/luci-static/resources/view/fchomo/client.js:1616 +#: htdocs/luci-static/resources/view/fchomo/client.js:1647 msgid "Fallback filter" msgstr "後備過濾器" #: htdocs/luci-static/resources/view/fchomo/client.js:1038 -#: htdocs/luci-static/resources/view/fchomo/node.js:1240 +#: htdocs/luci-static/resources/view/fchomo/node.js:1259 msgid "Filter nodes that meet keywords or regexps." msgstr "過濾匹配關鍵字或表達式的節點。" -#: htdocs/luci-static/resources/view/fchomo/client.js:1265 -#: htdocs/luci-static/resources/view/fchomo/client.js:1282 +#: htdocs/luci-static/resources/view/fchomo/client.js:1274 +#: htdocs/luci-static/resources/view/fchomo/client.js:1291 msgid "Final DNS server" msgstr "兜底 DNS 伺服器" -#: htdocs/luci-static/resources/view/fchomo/client.js:1265 -#: htdocs/luci-static/resources/view/fchomo/client.js:1279 +#: htdocs/luci-static/resources/view/fchomo/client.js:1274 +#: htdocs/luci-static/resources/view/fchomo/client.js:1288 msgid "Final DNS server (For non-poisoned domains)" msgstr "兜底 DNS 伺服器 (用於未被投毒汙染的網域)" -#: htdocs/luci-static/resources/view/fchomo/client.js:1272 -#: htdocs/luci-static/resources/view/fchomo/client.js:1280 +#: htdocs/luci-static/resources/view/fchomo/client.js:1281 +#: htdocs/luci-static/resources/view/fchomo/client.js:1289 msgid "Final DNS server (For poisoned domains)" msgstr "兜底 DNS 伺服器 (用於已被投毒汙染的網域)" -#: htdocs/luci-static/resources/view/fchomo/server.js:80 +#: htdocs/luci-static/resources/view/fchomo/server.js:81 msgid "Firewall" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:366 -#: htdocs/luci-static/resources/view/fchomo/server.js:249 +#: htdocs/luci-static/resources/view/fchomo/node.js:380 +#: htdocs/luci-static/resources/view/fchomo/server.js:250 msgid "Flow" msgstr "流控" @@ -908,8 +943,8 @@ msgstr "" "noopener\">%s." #: htdocs/luci-static/resources/view/fchomo/client.js:1004 -#: htdocs/luci-static/resources/view/fchomo/node.js:1109 -#: htdocs/luci-static/resources/view/fchomo/node.js:1232 +#: htdocs/luci-static/resources/view/fchomo/node.js:1128 +#: htdocs/luci-static/resources/view/fchomo/node.js:1251 msgid "" "For format see %s." @@ -917,26 +952,26 @@ msgstr "" "格式請參閱 %s." -#: htdocs/luci-static/resources/view/fchomo/node.js:464 +#: htdocs/luci-static/resources/view/fchomo/node.js:478 msgid "Force DNS remote resolution." msgstr "強制 DNS 遠端解析。" -#: htdocs/luci-static/resources/view/fchomo/global.js:660 +#: htdocs/luci-static/resources/view/fchomo/global.js:650 msgid "Forced sniffing domain" msgstr "強制嗅探網域" -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:277 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:285 msgid "Format" msgstr "格式" #: htdocs/luci-static/resources/view/fchomo/global.js:138 -#: htdocs/luci-static/resources/view/fchomo/log.js:97 -#: htdocs/luci-static/resources/view/fchomo/log.js:102 +#: htdocs/luci-static/resources/view/fchomo/log.js:142 +#: htdocs/luci-static/resources/view/fchomo/log.js:147 #: root/usr/share/luci/menu.d/luci-app-fchomo.json:3 msgid "FullCombo Shark!" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:725 +#: htdocs/luci-static/resources/view/fchomo/node.js:744 msgid "GET" msgstr "" @@ -950,7 +985,7 @@ msgstr "常規" #: htdocs/luci-static/resources/view/fchomo/client.js:891 #: htdocs/luci-static/resources/view/fchomo/node.js:90 -#: htdocs/luci-static/resources/view/fchomo/node.js:1001 +#: htdocs/luci-static/resources/view/fchomo/node.js:1020 #: htdocs/luci-static/resources/view/fchomo/server.js:64 msgid "General fields" msgstr "常規欄位" @@ -959,16 +994,17 @@ msgstr "常規欄位" msgid "General settings" msgstr "常規設定" -#: htdocs/luci-static/resources/fchomo.js:429 -#: htdocs/luci-static/resources/fchomo.js:431 +#: htdocs/luci-static/resources/fchomo.js:443 #: htdocs/luci-static/resources/fchomo.js:445 -#: htdocs/luci-static/resources/fchomo.js:447 -#: htdocs/luci-static/resources/view/fchomo/global.js:588 -#: htdocs/luci-static/resources/view/fchomo/server.js:396 +#: htdocs/luci-static/resources/fchomo.js:459 +#: htdocs/luci-static/resources/fchomo.js:461 +#: htdocs/luci-static/resources/fchomo.js:1331 +#: htdocs/luci-static/resources/view/fchomo/global.js:578 +#: htdocs/luci-static/resources/view/fchomo/server.js:407 msgid "Generate" msgstr "生成" -#: htdocs/luci-static/resources/view/fchomo/global.js:518 +#: htdocs/luci-static/resources/view/fchomo/global.js:506 msgid "Generic segmentation offload" msgstr "通用分段卸載(GSO)" @@ -980,21 +1016,21 @@ msgstr "GeoIP 版本" msgid "GeoSite version" msgstr "GeoSite 版本" -#: htdocs/luci-static/resources/view/fchomo/client.js:1626 +#: htdocs/luci-static/resources/view/fchomo/client.js:1657 msgid "Geoip code" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1623 +#: htdocs/luci-static/resources/view/fchomo/client.js:1654 msgid "Geoip enable" msgstr "Geoip 啟用" -#: htdocs/luci-static/resources/view/fchomo/client.js:1568 -#: htdocs/luci-static/resources/view/fchomo/client.js:1577 -#: htdocs/luci-static/resources/view/fchomo/client.js:1635 +#: htdocs/luci-static/resources/view/fchomo/client.js:1599 +#: htdocs/luci-static/resources/view/fchomo/client.js:1608 +#: htdocs/luci-static/resources/view/fchomo/client.js:1666 msgid "Geosite" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:42 +#: htdocs/luci-static/resources/fchomo.js:40 msgid "GitHub" msgstr "" @@ -1003,23 +1039,23 @@ msgstr "" msgid "Global" msgstr "全域" -#: htdocs/luci-static/resources/view/fchomo/global.js:437 +#: htdocs/luci-static/resources/view/fchomo/global.js:435 msgid "Global Authentication" msgstr "全域認證" -#: htdocs/luci-static/resources/view/fchomo/global.js:543 +#: htdocs/luci-static/resources/view/fchomo/global.js:531 msgid "Global client fingerprint" msgstr "全域客戶端指紋" -#: htdocs/luci-static/resources/view/fchomo/node.js:390 +#: htdocs/luci-static/resources/view/fchomo/node.js:404 msgid "Global padding" msgstr "全域填充" -#: htdocs/luci-static/resources/fchomo.js:41 +#: htdocs/luci-static/resources/fchomo.js:39 msgid "Google" msgstr "Google" -#: htdocs/luci-static/resources/fchomo.js:198 +#: htdocs/luci-static/resources/fchomo.js:206 msgid "Google FCM ports" msgstr "Google FCM 連接埠" @@ -1031,79 +1067,79 @@ msgstr "授予 fchomo 存取 UCI 配置的權限" msgid "Group" msgstr "組" -#: htdocs/luci-static/resources/fchomo.js:118 -#: htdocs/luci-static/resources/fchomo.js:148 -#: htdocs/luci-static/resources/view/fchomo/node.js:486 -#: htdocs/luci-static/resources/view/fchomo/node.js:688 -#: htdocs/luci-static/resources/view/fchomo/node.js:699 -#: htdocs/luci-static/resources/view/fchomo/server.js:470 +#: htdocs/luci-static/resources/fchomo.js:124 +#: htdocs/luci-static/resources/fchomo.js:154 +#: htdocs/luci-static/resources/view/fchomo/node.js:500 +#: htdocs/luci-static/resources/view/fchomo/node.js:707 +#: htdocs/luci-static/resources/view/fchomo/node.js:718 +#: htdocs/luci-static/resources/view/fchomo/server.js:482 msgid "HTTP" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:134 -#: htdocs/luci-static/resources/view/fchomo/node.js:747 -#: htdocs/luci-static/resources/view/fchomo/node.js:1089 +#: htdocs/luci-static/resources/view/fchomo/node.js:135 +#: htdocs/luci-static/resources/view/fchomo/node.js:766 +#: htdocs/luci-static/resources/view/fchomo/node.js:1108 msgid "HTTP header" msgstr "HTTP header" -#: htdocs/luci-static/resources/view/fchomo/node.js:724 +#: htdocs/luci-static/resources/view/fchomo/node.js:743 msgid "HTTP request method" msgstr "HTTP 請求方法" -#: htdocs/luci-static/resources/view/fchomo/client.js:1407 +#: htdocs/luci-static/resources/view/fchomo/client.js:1432 msgid "HTTP/3" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/server.js:155 +#: htdocs/luci-static/resources/view/fchomo/server.js:156 msgid "" "HTTP3 server behavior when authentication fails.
A 404 page will be " "returned if empty." msgstr "身份驗證失敗時的 HTTP3 伺服器回應。預設回傳 404 頁面。" -#: htdocs/luci-static/resources/view/fchomo/node.js:689 -#: htdocs/luci-static/resources/view/fchomo/node.js:700 -#: htdocs/luci-static/resources/view/fchomo/server.js:471 +#: htdocs/luci-static/resources/view/fchomo/node.js:708 +#: htdocs/luci-static/resources/view/fchomo/node.js:719 +#: htdocs/luci-static/resources/view/fchomo/server.js:483 msgid "HTTPUpgrade" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:826 +#: htdocs/luci-static/resources/view/fchomo/global.js:831 msgid "Handle domain" msgstr "處理網域" -#: htdocs/luci-static/resources/view/fchomo/node.js:231 +#: htdocs/luci-static/resources/view/fchomo/node.js:232 msgid "Handshake mode" msgstr "握手模式" -#: htdocs/luci-static/resources/view/fchomo/server.js:271 +#: htdocs/luci-static/resources/view/fchomo/server.js:272 msgid "Handshake target that supports TLS 1.3" msgstr "握手目標 (支援 TLS 1.3)" #: htdocs/luci-static/resources/view/fchomo/client.js:973 -#: htdocs/luci-static/resources/view/fchomo/node.js:1200 +#: htdocs/luci-static/resources/view/fchomo/node.js:1219 msgid "Health check URL" msgstr "健康檢查 URL" #: htdocs/luci-static/resources/view/fchomo/client.js:1002 -#: htdocs/luci-static/resources/view/fchomo/node.js:1230 +#: htdocs/luci-static/resources/view/fchomo/node.js:1249 msgid "Health check expected status" msgstr "健康檢查预期状态" #: htdocs/luci-static/resources/view/fchomo/client.js:982 -#: htdocs/luci-static/resources/view/fchomo/node.js:1210 +#: htdocs/luci-static/resources/view/fchomo/node.js:1229 msgid "Health check interval" msgstr "健康檢查间隔" #: htdocs/luci-static/resources/view/fchomo/client.js:989 -#: htdocs/luci-static/resources/view/fchomo/node.js:1217 +#: htdocs/luci-static/resources/view/fchomo/node.js:1236 msgid "Health check timeout" msgstr "健康檢查超时" #: htdocs/luci-static/resources/view/fchomo/client.js:893 -#: htdocs/luci-static/resources/view/fchomo/node.js:1003 +#: htdocs/luci-static/resources/view/fchomo/node.js:1022 msgid "Health fields" msgstr "健康欄位" -#: htdocs/luci-static/resources/view/fchomo/node.js:301 +#: htdocs/luci-static/resources/view/fchomo/node.js:309 msgid "Heartbeat interval" msgstr "心跳間隔" @@ -1111,15 +1147,15 @@ msgstr "心跳間隔" msgid "Hidden" msgstr "隱藏" -#: htdocs/luci-static/resources/view/fchomo/node.js:492 +#: htdocs/luci-static/resources/view/fchomo/node.js:506 msgid "Host that supports TLS 1.3" msgstr "主機名稱 (支援 TLS 1.3)" -#: htdocs/luci-static/resources/view/fchomo/node.js:187 +#: htdocs/luci-static/resources/view/fchomo/node.js:188 msgid "Host-key" msgstr "主機金鑰" -#: htdocs/luci-static/resources/view/fchomo/node.js:182 +#: htdocs/luci-static/resources/view/fchomo/node.js:183 msgid "Host-key algorithms" msgstr "主機金鑰演算法" @@ -1128,39 +1164,39 @@ msgstr "主機金鑰演算法" msgid "Hosts" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:127 -#: htdocs/luci-static/resources/fchomo.js:159 +#: htdocs/luci-static/resources/fchomo.js:133 +#: htdocs/luci-static/resources/fchomo.js:165 msgid "Hysteria2" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1628 -#: htdocs/luci-static/resources/view/fchomo/client.js:1641 +#: htdocs/luci-static/resources/view/fchomo/client.js:1659 +#: htdocs/luci-static/resources/view/fchomo/client.js:1672 msgid "IP" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/client.js:1639 +#: htdocs/luci-static/resources/view/fchomo/client.js:1670 msgid "IP CIDR" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:254 +#: htdocs/luci-static/resources/view/fchomo/node.js:262 msgid "IP override" msgstr "IP 覆寫" -#: htdocs/luci-static/resources/view/fchomo/node.js:878 -#: htdocs/luci-static/resources/view/fchomo/node.js:1186 +#: htdocs/luci-static/resources/view/fchomo/node.js:897 +#: htdocs/luci-static/resources/view/fchomo/node.js:1205 msgid "IP version" msgstr "IP 版本" -#: htdocs/luci-static/resources/fchomo.js:134 +#: htdocs/luci-static/resources/fchomo.js:140 msgid "IPv4 only" msgstr "僅 IPv4" -#: htdocs/luci-static/resources/fchomo.js:135 +#: htdocs/luci-static/resources/fchomo.js:141 msgid "IPv6 only" msgstr "僅 IPv6" -#: htdocs/luci-static/resources/view/fchomo/client.js:1247 -#: htdocs/luci-static/resources/view/fchomo/global.js:417 +#: htdocs/luci-static/resources/view/fchomo/client.js:1256 +#: htdocs/luci-static/resources/view/fchomo/global.js:415 msgid "IPv6 support" msgstr "IPv6 支援" @@ -1168,19 +1204,19 @@ msgstr "IPv6 支援" msgid "Icon" msgstr "圖標" -#: htdocs/luci-static/resources/view/fchomo/node.js:339 +#: htdocs/luci-static/resources/view/fchomo/node.js:353 msgid "Idle session check interval" msgstr "閒置會話檢查間隔" -#: htdocs/luci-static/resources/view/fchomo/node.js:346 +#: htdocs/luci-static/resources/view/fchomo/node.js:360 msgid "Idle session timeout" msgstr "閒置會話逾時" -#: htdocs/luci-static/resources/view/fchomo/server.js:200 +#: htdocs/luci-static/resources/view/fchomo/server.js:201 msgid "Idle timeout" msgstr "閒置逾時" -#: htdocs/luci-static/resources/fchomo.js:1150 +#: htdocs/luci-static/resources/fchomo.js:1554 msgid "If All ports is selected, uncheck others" msgstr "如果選擇了“所有連接埠”,則取消選取“其他”" @@ -1188,11 +1224,11 @@ msgstr "如果選擇了“所有連接埠”,則取消選取“其他”" msgid "If Block is selected, uncheck others" msgstr "如果選擇了“封鎖”,則取消選取“其他”" -#: htdocs/luci-static/resources/view/fchomo/server.js:134 +#: htdocs/luci-static/resources/view/fchomo/server.js:135 msgid "Ignore client bandwidth" msgstr "忽略客戶端頻寬" -#: htdocs/luci-static/resources/fchomo.js:553 +#: htdocs/luci-static/resources/fchomo.js:568 msgid "Import" msgstr "導入" @@ -1200,14 +1236,14 @@ msgstr "導入" #: htdocs/luci-static/resources/view/fchomo/client.js:885 #: htdocs/luci-static/resources/view/fchomo/client.js:1082 #: htdocs/luci-static/resources/view/fchomo/client.js:1124 -#: htdocs/luci-static/resources/view/fchomo/client.js:1183 -#: htdocs/luci-static/resources/view/fchomo/client.js:1211 -#: htdocs/luci-static/resources/view/fchomo/client.js:1305 -#: htdocs/luci-static/resources/view/fchomo/client.js:1329 -#: htdocs/luci-static/resources/view/fchomo/client.js:1526 +#: htdocs/luci-static/resources/view/fchomo/client.js:1192 +#: htdocs/luci-static/resources/view/fchomo/client.js:1220 +#: htdocs/luci-static/resources/view/fchomo/client.js:1314 +#: htdocs/luci-static/resources/view/fchomo/client.js:1354 #: htdocs/luci-static/resources/view/fchomo/client.js:1551 -#: htdocs/luci-static/resources/view/fchomo/node.js:903 -#: htdocs/luci-static/resources/view/fchomo/node.js:989 +#: htdocs/luci-static/resources/view/fchomo/client.js:1576 +#: htdocs/luci-static/resources/view/fchomo/node.js:922 +#: htdocs/luci-static/resources/view/fchomo/node.js:1008 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:142 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:230 msgid "Import mihomo config" @@ -1219,49 +1255,56 @@ msgstr "導入 mihomo 配置" msgid "Import rule-set links" msgstr "導入規則集連結" -#: htdocs/luci-static/resources/view/fchomo/node.js:147 -#: htdocs/luci-static/resources/view/fchomo/node.js:153 -#: htdocs/luci-static/resources/view/fchomo/node.js:1147 -#: htdocs/luci-static/resources/view/fchomo/node.js:1153 -#: htdocs/luci-static/resources/view/fchomo/server.js:123 -#: htdocs/luci-static/resources/view/fchomo/server.js:129 +#: htdocs/luci-static/resources/view/fchomo/node.js:148 +#: htdocs/luci-static/resources/view/fchomo/node.js:154 +#: htdocs/luci-static/resources/view/fchomo/node.js:1166 +#: htdocs/luci-static/resources/view/fchomo/node.js:1172 +#: htdocs/luci-static/resources/view/fchomo/server.js:124 +#: htdocs/luci-static/resources/view/fchomo/server.js:130 msgid "In Mbps." msgstr "單位為 Mbps。" -#: htdocs/luci-static/resources/view/fchomo/node.js:1067 -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:346 +#: htdocs/luci-static/resources/view/fchomo/node.js:1086 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:354 msgid "In bytes. %s will be used if empty." msgstr "單位為位元組。留空則使用 %s。" -#: htdocs/luci-static/resources/view/fchomo/node.js:302 -#: htdocs/luci-static/resources/view/fchomo/node.js:309 +#: htdocs/luci-static/resources/view/fchomo/node.js:310 +#: htdocs/luci-static/resources/view/fchomo/node.js:317 msgid "In millisecond." msgstr "單位為毫秒。" #: htdocs/luci-static/resources/view/fchomo/client.js:990 #: htdocs/luci-static/resources/view/fchomo/client.js:1019 -#: htdocs/luci-static/resources/view/fchomo/node.js:1218 +#: htdocs/luci-static/resources/view/fchomo/node.js:1237 msgid "In millisecond. %s will be used if empty." msgstr "單位為毫秒。留空則使用 %s。" -#: htdocs/luci-static/resources/view/fchomo/node.js:340 -#: htdocs/luci-static/resources/view/fchomo/node.js:347 -#: htdocs/luci-static/resources/view/fchomo/server.js:201 -#: htdocs/luci-static/resources/view/fchomo/server.js:208 +#: htdocs/luci-static/resources/view/fchomo/node.js:354 +#: htdocs/luci-static/resources/view/fchomo/node.js:361 +#: htdocs/luci-static/resources/view/fchomo/server.js:202 +#: htdocs/luci-static/resources/view/fchomo/server.js:209 msgid "In seconds." msgstr "單位為秒。" #: htdocs/luci-static/resources/view/fchomo/client.js:983 -#: htdocs/luci-static/resources/view/fchomo/global.js:427 -#: htdocs/luci-static/resources/view/fchomo/global.js:432 -#: htdocs/luci-static/resources/view/fchomo/global.js:527 -#: htdocs/luci-static/resources/view/fchomo/node.js:1073 -#: htdocs/luci-static/resources/view/fchomo/node.js:1211 -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:352 +#: htdocs/luci-static/resources/view/fchomo/global.js:425 +#: htdocs/luci-static/resources/view/fchomo/global.js:430 +#: htdocs/luci-static/resources/view/fchomo/global.js:515 +#: htdocs/luci-static/resources/view/fchomo/node.js:1092 +#: htdocs/luci-static/resources/view/fchomo/node.js:1230 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:360 msgid "In seconds. %s will be used if empty." msgstr "單位為秒。留空則使用 %s。" -#: htdocs/luci-static/resources/view/fchomo/global.js:451 +#: htdocs/luci-static/resources/fchomo.js:1246 +msgid "" +"In the order of one Padding-Length and one Padding-" +"Interval, infinite concatenation." +msgstr "" +"依照一個 Padding-Length 一個 Padding-Interval 的順序,無限連接。" + +#: htdocs/luci-static/resources/view/fchomo/global.js:449 msgid "Inbound" msgstr "入站" @@ -1289,46 +1332,50 @@ msgstr "引入所有代理節點及供應商。" msgid "Includes all Proxy Node." msgstr "引入所有代理節點。" -#: htdocs/luci-static/resources/view/fchomo/global.js:410 +#: htdocs/luci-static/resources/fchomo.js:71 msgid "Info" msgstr "訊息" -#: htdocs/luci-static/resources/view/fchomo/node.js:1018 -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:260 +#: htdocs/luci-static/resources/view/fchomo/node.js:1037 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:268 msgid "Inline" msgstr "內嵌" -#: htdocs/luci-static/resources/view/fchomo/global.js:728 +#: htdocs/luci-static/resources/view/fchomo/global.js:718 msgid "Interface Control" msgstr "介面控制" -#: htdocs/luci-static/resources/fchomo.js:132 +#: htdocs/luci-static/resources/fchomo.js:138 msgid "Keep default" msgstr "保持預設" -#: htdocs/luci-static/resources/view/fchomo/server.js:350 +#: htdocs/luci-static/resources/view/fchomo/server.js:359 msgid "Key path" msgstr "憑證路徑" +#: htdocs/luci-static/resources/fchomo.js:1266 +msgid "Keypairs" +msgstr "密鑰對" + #: htdocs/luci-static/resources/view/fchomo/client.js:896 #: htdocs/luci-static/resources/view/fchomo/client.js:1130 -#: htdocs/luci-static/resources/view/fchomo/client.js:1217 -#: htdocs/luci-static/resources/view/fchomo/client.js:1335 -#: htdocs/luci-static/resources/view/fchomo/client.js:1557 -#: htdocs/luci-static/resources/view/fchomo/node.js:96 -#: htdocs/luci-static/resources/view/fchomo/node.js:1006 -#: htdocs/luci-static/resources/view/fchomo/node.js:1279 +#: htdocs/luci-static/resources/view/fchomo/client.js:1226 +#: htdocs/luci-static/resources/view/fchomo/client.js:1360 +#: htdocs/luci-static/resources/view/fchomo/client.js:1582 +#: htdocs/luci-static/resources/view/fchomo/node.js:97 +#: htdocs/luci-static/resources/view/fchomo/node.js:1025 +#: htdocs/luci-static/resources/view/fchomo/node.js:1298 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:248 -#: htdocs/luci-static/resources/view/fchomo/server.js:71 +#: htdocs/luci-static/resources/view/fchomo/server.js:72 msgid "Label" msgstr "標籤" #: htdocs/luci-static/resources/view/fchomo/client.js:996 -#: htdocs/luci-static/resources/view/fchomo/node.js:1224 +#: htdocs/luci-static/resources/view/fchomo/node.js:1243 msgid "Lazy" msgstr "懶惰狀態" -#: htdocs/luci-static/resources/view/fchomo/server.js:258 +#: htdocs/luci-static/resources/view/fchomo/server.js:259 msgid "" "Legacy protocol support (VMess MD5 Authentication) is provided for " "compatibility purposes only, use of alterId > 1 is not recommended." @@ -1336,51 +1383,50 @@ msgstr "" "提供舊協議支援(VMess MD5 身份認證)僅出於相容性目的,不建議使用 alterId > " "1。" -#: htdocs/luci-static/resources/view/fchomo/global.js:496 -#: htdocs/luci-static/resources/view/fchomo/global.js:511 +#: htdocs/luci-static/resources/view/fchomo/global.js:494 msgid "Less compatibility and sometimes better performance." msgstr "有時效能較好。" -#: htdocs/luci-static/resources/view/fchomo/node.js:578 -#: htdocs/luci-static/resources/view/fchomo/server.js:331 +#: htdocs/luci-static/resources/view/fchomo/node.js:597 +#: htdocs/luci-static/resources/view/fchomo/server.js:340 msgid "List of supported application level protocols, in order of preference." msgstr "支援的應用層協議協商清單,依序排列。" -#: htdocs/luci-static/resources/view/fchomo/server.js:91 +#: htdocs/luci-static/resources/view/fchomo/server.js:92 msgid "Listen address" msgstr "監聽位址" -#: htdocs/luci-static/resources/view/fchomo/server.js:68 +#: htdocs/luci-static/resources/view/fchomo/server.js:69 msgid "Listen fields" msgstr "監聽欄位" -#: htdocs/luci-static/resources/view/fchomo/global.js:730 +#: htdocs/luci-static/resources/view/fchomo/global.js:720 msgid "Listen interfaces" msgstr "監聽介面" -#: htdocs/luci-static/resources/view/fchomo/client.js:1242 -#: htdocs/luci-static/resources/view/fchomo/server.js:96 +#: htdocs/luci-static/resources/view/fchomo/client.js:1251 +#: htdocs/luci-static/resources/view/fchomo/server.js:97 msgid "Listen port" msgstr "監聽埠" -#: htdocs/luci-static/resources/view/fchomo/global.js:454 +#: htdocs/luci-static/resources/view/fchomo/global.js:452 msgid "Listen ports" msgstr "監聽埠" -#: htdocs/luci-static/resources/fchomo.js:188 +#: htdocs/luci-static/resources/fchomo.js:196 msgid "Load balance" msgstr "負載均衡" -#: htdocs/luci-static/resources/view/fchomo/node.js:1016 -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:258 +#: htdocs/luci-static/resources/view/fchomo/node.js:1035 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:266 msgid "Local" msgstr "本地" -#: htdocs/luci-static/resources/view/fchomo/node.js:417 +#: htdocs/luci-static/resources/view/fchomo/node.js:431 msgid "Local IPv6 address" msgstr "本地 IPv6 位址" -#: htdocs/luci-static/resources/view/fchomo/node.js:410 +#: htdocs/luci-static/resources/view/fchomo/node.js:424 msgid "Local address" msgstr "本地位址" @@ -1388,11 +1434,11 @@ msgstr "本地位址" msgid "Log" msgstr "日誌" -#: htdocs/luci-static/resources/view/fchomo/log.js:54 +#: htdocs/luci-static/resources/view/fchomo/log.js:98 msgid "Log file does not exist." msgstr "日誌檔不存在。" -#: htdocs/luci-static/resources/view/fchomo/log.js:47 +#: htdocs/luci-static/resources/view/fchomo/log.js:91 msgid "Log is empty." msgstr "日誌為空。" @@ -1400,53 +1446,53 @@ msgstr "日誌為空。" msgid "Log level" msgstr "日誌等級" -#: htdocs/luci-static/resources/fchomo.js:334 +#: htdocs/luci-static/resources/fchomo.js:342 msgid "Lowercase only" msgstr "僅限小寫" -#: htdocs/luci-static/resources/view/fchomo/global.js:514 -#: htdocs/luci-static/resources/view/fchomo/node.js:457 +#: htdocs/luci-static/resources/view/fchomo/global.js:502 +#: htdocs/luci-static/resources/view/fchomo/node.js:471 msgid "MTU" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/server.js:154 +#: htdocs/luci-static/resources/view/fchomo/server.js:155 msgid "Masquerade" msgstr "偽裝" -#: htdocs/luci-static/resources/view/fchomo/client.js:1573 +#: htdocs/luci-static/resources/view/fchomo/client.js:1604 msgid "Match domain. Support wildcards." msgstr "匹配網域。支援通配符。" -#: htdocs/luci-static/resources/view/fchomo/client.js:1645 +#: htdocs/luci-static/resources/view/fchomo/client.js:1676 msgid "Match domain. Support wildcards.
" msgstr "匹配網域。支援通配符。
" -#: htdocs/luci-static/resources/view/fchomo/client.js:1578 +#: htdocs/luci-static/resources/view/fchomo/client.js:1609 msgid "Match geosite." msgstr "匹配 geosite。" -#: htdocs/luci-static/resources/view/fchomo/client.js:1636 +#: htdocs/luci-static/resources/view/fchomo/client.js:1667 msgid "Match geosite.
" msgstr "匹配 geosite。
" -#: htdocs/luci-static/resources/view/fchomo/client.js:1627 +#: htdocs/luci-static/resources/view/fchomo/client.js:1658 msgid "Match response with geoip.
" msgstr "匹配回應通過 geoip。
" -#: htdocs/luci-static/resources/view/fchomo/client.js:1640 +#: htdocs/luci-static/resources/view/fchomo/client.js:1671 msgid "Match response with ipcidr.
" msgstr "匹配回應通過 ipcidr
" -#: htdocs/luci-static/resources/view/fchomo/client.js:1583 +#: htdocs/luci-static/resources/view/fchomo/client.js:1614 msgid "Match rule set." msgstr "匹配規則集。" -#: htdocs/luci-static/resources/view/fchomo/node.js:757 +#: htdocs/luci-static/resources/view/fchomo/node.js:776 msgid "Max Early Data" msgstr "前置數據最大值" -#: htdocs/luci-static/resources/view/fchomo/node.js:288 -#: htdocs/luci-static/resources/view/fchomo/server.js:194 +#: htdocs/luci-static/resources/view/fchomo/node.js:296 +#: htdocs/luci-static/resources/view/fchomo/server.js:195 msgid "Max UDP relay packet size" msgstr "UDP 中繼數據包最大尺寸" @@ -1454,26 +1500,26 @@ msgstr "UDP 中繼數據包最大尺寸" msgid "Max count of failures" msgstr "最大失敗次數" -#: htdocs/luci-static/resources/view/fchomo/node.js:152 -#: htdocs/luci-static/resources/view/fchomo/server.js:128 +#: htdocs/luci-static/resources/view/fchomo/node.js:153 +#: htdocs/luci-static/resources/view/fchomo/server.js:129 msgid "Max download speed" msgstr "最大下載速度" -#: htdocs/luci-static/resources/view/fchomo/node.js:314 +#: htdocs/luci-static/resources/view/fchomo/node.js:323 msgid "Max open streams" msgstr "限制打開流的數量" -#: htdocs/luci-static/resources/view/fchomo/node.js:146 -#: htdocs/luci-static/resources/view/fchomo/server.js:122 +#: htdocs/luci-static/resources/view/fchomo/node.js:147 +#: htdocs/luci-static/resources/view/fchomo/server.js:123 msgid "Max upload speed" msgstr "最大上傳速度" -#: htdocs/luci-static/resources/view/fchomo/node.js:794 -#: htdocs/luci-static/resources/view/fchomo/node.js:810 +#: htdocs/luci-static/resources/view/fchomo/node.js:813 +#: htdocs/luci-static/resources/view/fchomo/node.js:829 msgid "Maximum connections" msgstr "最大連線數" -#: htdocs/luci-static/resources/view/fchomo/node.js:808 +#: htdocs/luci-static/resources/view/fchomo/node.js:827 msgid "" "Maximum multiplexed streams in a connection before opening a new connection." "
Conflict with %s and %s." @@ -1481,64 +1527,63 @@ msgstr "" "在開啟新連線之前,連線中的最大多路復用流數量。
%s 和 " "%s 衝突。" -#: htdocs/luci-static/resources/view/fchomo/node.js:807 +#: htdocs/luci-static/resources/view/fchomo/node.js:826 msgid "Maximum streams" msgstr "最大流數量" -#: htdocs/luci-static/resources/fchomo.js:152 +#: htdocs/luci-static/resources/fchomo.js:158 msgid "Mieru" msgstr "" #: htdocs/luci-static/resources/view/fchomo/client.js:781 -#: htdocs/luci-static/resources/view/fchomo/log.js:106 -#: htdocs/luci-static/resources/view/fchomo/log.js:111 +#: htdocs/luci-static/resources/view/fchomo/log.js:151 +#: htdocs/luci-static/resources/view/fchomo/log.js:156 msgid "Mihomo client" msgstr "Mihomo 客戶端" -#: htdocs/luci-static/resources/view/fchomo/log.js:115 -#: htdocs/luci-static/resources/view/fchomo/log.js:120 +#: htdocs/luci-static/resources/view/fchomo/log.js:160 +#: htdocs/luci-static/resources/view/fchomo/log.js:165 #: htdocs/luci-static/resources/view/fchomo/server.js:24 msgid "Mihomo server" msgstr "Mihomo 服務端" -#: htdocs/luci-static/resources/view/fchomo/node.js:353 +#: htdocs/luci-static/resources/view/fchomo/node.js:367 msgid "Min of idle sessions to keep" msgstr "要保留的最少閒置會話數" -#: htdocs/luci-static/resources/view/fchomo/node.js:801 +#: htdocs/luci-static/resources/view/fchomo/node.js:820 msgid "" "Minimum multiplexed streams in a connection before opening a new connection." msgstr "在開啟新連線之前,連線中的最小多路復用流數量。" -#: htdocs/luci-static/resources/view/fchomo/node.js:800 -#: htdocs/luci-static/resources/view/fchomo/node.js:810 +#: htdocs/luci-static/resources/view/fchomo/node.js:819 +#: htdocs/luci-static/resources/view/fchomo/node.js:829 msgid "Minimum streams" msgstr "最小流數量" -#: htdocs/luci-static/resources/fchomo.js:120 -#: htdocs/luci-static/resources/view/fchomo/global.js:499 +#: htdocs/luci-static/resources/fchomo.js:126 +#: htdocs/luci-static/resources/view/fchomo/global.js:497 msgid "Mixed" msgstr "混合" -#: htdocs/luci-static/resources/view/fchomo/global.js:499 -#: htdocs/luci-static/resources/view/fchomo/global.js:507 +#: htdocs/luci-static/resources/view/fchomo/global.js:497 msgid "Mixed system TCP stack and gVisor UDP stack." msgstr "混合 系統 TCP 堆栈和 gVisor UDP 堆栈。" -#: htdocs/luci-static/resources/view/fchomo/global.js:457 +#: htdocs/luci-static/resources/view/fchomo/global.js:455 msgid "Mixed port" msgstr "混合連接埠" -#: htdocs/luci-static/resources/view/fchomo/node.js:780 +#: htdocs/luci-static/resources/view/fchomo/node.js:799 msgid "Multiplex" msgstr "多路復用" -#: htdocs/luci-static/resources/view/fchomo/node.js:93 -#: htdocs/luci-static/resources/view/fchomo/server.js:67 +#: htdocs/luci-static/resources/view/fchomo/node.js:94 +#: htdocs/luci-static/resources/view/fchomo/server.js:68 msgid "Multiplex fields" msgstr "多路復用欄位" -#: htdocs/luci-static/resources/view/fchomo/node.js:222 +#: htdocs/luci-static/resources/view/fchomo/node.js:223 msgid "Multiplexing" msgstr "多路復用" @@ -1547,32 +1592,36 @@ msgstr "多路復用" msgid "NOT" msgstr "NOT" -#: htdocs/luci-static/resources/view/fchomo/node.js:1079 +#: htdocs/luci-static/resources/view/fchomo/node.js:1098 msgid "Name of the Proxy group to download provider." msgstr "用於下載供應商訂閱的代理組名稱。" -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:358 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:366 msgid "Name of the Proxy group to download rule set." msgstr "用於下載規則集訂閱的代理組名稱。" -#: htdocs/luci-static/resources/view/fchomo/node.js:272 +#: htdocs/luci-static/resources/view/fchomo/node.js:280 msgid "Native" msgstr "原生" -#: htdocs/luci-static/resources/view/fchomo/global.js:445 +#: htdocs/luci-static/resources/fchomo.js:1038 +msgid "Native appearance" +msgstr "原生外觀" + +#: htdocs/luci-static/resources/view/fchomo/global.js:443 msgid "No Authentication IP ranges" msgstr "無需認證的 IP 範圍" -#: htdocs/luci-static/resources/view/fchomo/client.js:1355 +#: htdocs/luci-static/resources/view/fchomo/client.js:1380 msgid "No add'l params" msgstr "無附加參數" #: htdocs/luci-static/resources/view/fchomo/client.js:997 -#: htdocs/luci-static/resources/view/fchomo/node.js:1225 +#: htdocs/luci-static/resources/view/fchomo/node.js:1244 msgid "No testing is performed when this provider node is not in use." msgstr "當此供應商的節點未使用時,不執行任何測試。" -#: htdocs/luci-static/resources/fchomo.js:504 +#: htdocs/luci-static/resources/fchomo.js:519 msgid "No valid %s found." msgstr "未找到有效的%s。" @@ -1587,17 +1636,17 @@ msgid "Node" msgstr "節點" #: htdocs/luci-static/resources/view/fchomo/client.js:1042 -#: htdocs/luci-static/resources/view/fchomo/node.js:1245 +#: htdocs/luci-static/resources/view/fchomo/node.js:1264 msgid "Node exclude filter" msgstr "排除節點" #: htdocs/luci-static/resources/view/fchomo/client.js:1047 -#: htdocs/luci-static/resources/view/fchomo/node.js:1252 +#: htdocs/luci-static/resources/view/fchomo/node.js:1271 msgid "Node exclude type" msgstr "排除節點類型" #: htdocs/luci-static/resources/view/fchomo/client.js:1037 -#: htdocs/luci-static/resources/view/fchomo/node.js:1239 +#: htdocs/luci-static/resources/view/fchomo/node.js:1258 msgid "Node filter" msgstr "過濾節點" @@ -1605,41 +1654,41 @@ msgstr "過濾節點" msgid "Node switch tolerance" msgstr "節點切換容差" -#: htdocs/luci-static/resources/fchomo.js:305 +#: htdocs/luci-static/resources/fchomo.js:313 msgid "None" msgstr "無" -#: htdocs/luci-static/resources/view/fchomo/global.js:614 +#: htdocs/luci-static/resources/view/fchomo/global.js:604 msgid "Not Installed" msgstr "未安裝" -#: htdocs/luci-static/resources/fchomo.js:935 +#: htdocs/luci-static/resources/fchomo.js:950 msgid "Not Running" msgstr "未在運作" -#: htdocs/luci-static/resources/view/fchomo/node.js:485 +#: htdocs/luci-static/resources/view/fchomo/node.js:499 msgid "Obfs Mode" msgstr "Obfs 模式" -#: htdocs/luci-static/resources/view/fchomo/node.js:164 -#: htdocs/luci-static/resources/view/fchomo/server.js:146 +#: htdocs/luci-static/resources/view/fchomo/node.js:165 +#: htdocs/luci-static/resources/view/fchomo/server.js:147 msgid "Obfuscate password" msgstr "混淆密碼" -#: htdocs/luci-static/resources/view/fchomo/node.js:158 -#: htdocs/luci-static/resources/view/fchomo/server.js:140 +#: htdocs/luci-static/resources/view/fchomo/node.js:159 +#: htdocs/luci-static/resources/view/fchomo/server.js:141 msgid "Obfuscate type" msgstr "混淆類型" -#: htdocs/luci-static/resources/view/fchomo/global.js:851 +#: htdocs/luci-static/resources/view/fchomo/global.js:856 msgid "One or more numbers in the range 0-63 separated by commas" msgstr "0-63 範圍內的一個或多個數字,以逗號分隔" -#: htdocs/luci-static/resources/view/fchomo/global.js:731 +#: htdocs/luci-static/resources/view/fchomo/global.js:721 msgid "Only process traffic from specific interfaces. Leave empty for all." msgstr "只處理來自指定介面的流量。留空表示全部。" -#: htdocs/luci-static/resources/fchomo.js:929 +#: htdocs/luci-static/resources/fchomo.js:944 msgid "Open Dashboard" msgstr "打開面板" @@ -1647,81 +1696,86 @@ msgstr "打開面板" msgid "Operation mode" msgstr "運作模式" -#: htdocs/luci-static/resources/view/fchomo/client.js:1459 -msgid "Override the existing ECS in original request." -msgstr "覆蓋原始請求中已有的 ECS。" - -#: htdocs/luci-static/resources/view/fchomo/global.js:656 -#: htdocs/luci-static/resources/view/fchomo/global.js:694 +#: htdocs/luci-static/resources/view/fchomo/global.js:646 +#: htdocs/luci-static/resources/view/fchomo/global.js:684 msgid "Override destination" msgstr "覆蓋目標位址" #: htdocs/luci-static/resources/view/fchomo/client.js:892 -#: htdocs/luci-static/resources/view/fchomo/node.js:1002 +#: htdocs/luci-static/resources/view/fchomo/node.js:1021 msgid "Override fields" msgstr "覆蓋欄位" -#: htdocs/luci-static/resources/view/fchomo/node.js:255 +#: htdocs/luci-static/resources/view/fchomo/node.js:263 msgid "Override the IP address of the server that DNS response." msgstr "覆蓋 DNS 回應的伺服器的 IP 位址。" -#: htdocs/luci-static/resources/view/fchomo/client.js:1606 +#: htdocs/luci-static/resources/view/fchomo/client.js:1637 msgid "Override the Proxy group of DNS server." msgstr "覆蓋 DNS 伺服器所使用的代理組。" -#: htdocs/luci-static/resources/view/fchomo/global.js:657 +#: htdocs/luci-static/resources/view/fchomo/global.js:647 msgid "Override the connection destination address with the sniffed domain." msgstr "使用嗅探到的網域覆寫連線目標。" +#: htdocs/luci-static/resources/view/fchomo/client.js:1484 +msgid "Override the existing ECS in original request." +msgstr "覆蓋原始請求中已有的 ECS。" + #: htdocs/luci-static/resources/view/fchomo/global.js:160 msgid "Overview" msgstr "概覽" -#: htdocs/luci-static/resources/view/fchomo/node.js:726 +#: htdocs/luci-static/resources/view/fchomo/node.js:745 msgid "POST" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:727 +#: htdocs/luci-static/resources/view/fchomo/node.js:746 msgid "PUT" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:402 +#: htdocs/luci-static/resources/view/fchomo/node.js:416 msgid "Packet encoding" msgstr "數據包編碼" -#: htdocs/luci-static/resources/view/fchomo/server.js:238 +#: htdocs/luci-static/resources/view/fchomo/server.js:239 msgid "Padding scheme" msgstr "填充方案" -#: htdocs/luci-static/resources/view/fchomo/node.js:128 -#: htdocs/luci-static/resources/view/fchomo/node.js:201 -#: htdocs/luci-static/resources/view/fchomo/node.js:500 -#: htdocs/luci-static/resources/view/fchomo/server.js:113 -#: htdocs/luci-static/resources/view/fchomo/server.js:169 -#: htdocs/luci-static/resources/view/fchomo/server.js:278 +#: htdocs/luci-static/resources/fchomo.js:1244 +msgid "Paddings" +msgstr "填充 (Paddings)" + +#: htdocs/luci-static/resources/view/fchomo/node.js:129 +#: htdocs/luci-static/resources/view/fchomo/node.js:202 +#: htdocs/luci-static/resources/view/fchomo/node.js:514 +#: htdocs/luci-static/resources/view/fchomo/server.js:114 +#: htdocs/luci-static/resources/view/fchomo/server.js:170 +#: htdocs/luci-static/resources/view/fchomo/server.js:279 msgid "Password" msgstr "密碼" -#: htdocs/luci-static/resources/view/fchomo/node.js:1054 -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:333 +#: htdocs/luci-static/resources/fchomo.js:1183 +#: htdocs/luci-static/resources/view/fchomo/node.js:1073 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:341 msgid "Payload" msgstr "Payload" -#: htdocs/luci-static/resources/view/fchomo/node.js:431 +#: htdocs/luci-static/resources/view/fchomo/node.js:445 msgid "Peer pubkic key" msgstr "對端公鑰" -#: htdocs/luci-static/resources/view/fchomo/global.js:532 +#: htdocs/luci-static/resources/view/fchomo/global.js:520 msgid "" "Performance may degrade slightly, so it is not recommended to enable on when " "it is not needed." msgstr "效能可能會略有下降,建議僅在需要時開啟。" -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:278 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:286 msgid "Plain text" msgstr "純文本 text" -#: htdocs/luci-static/resources/view/fchomo/global.js:828 +#: htdocs/luci-static/resources/view/fchomo/global.js:833 msgid "" "Please ensure that the DNS query of the domains to be processed in the DNS " "policy
are send via DIRECT/Proxy Node in the same semantics as Routing " @@ -1736,10 +1790,10 @@ msgid "" "standards." msgstr "連結格式標準請參考
%s。" -#: htdocs/luci-static/resources/view/fchomo/node.js:1039 -#: htdocs/luci-static/resources/view/fchomo/node.js:1053 -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:318 -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:332 +#: htdocs/luci-static/resources/view/fchomo/node.js:1058 +#: htdocs/luci-static/resources/view/fchomo/node.js:1072 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:326 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:340 msgid "" "Please type %s." @@ -1748,83 +1802,84 @@ msgstr "" #: htdocs/luci-static/resources/view/fchomo/client.js:827 #: htdocs/luci-static/resources/view/fchomo/client.js:1083 -#: htdocs/luci-static/resources/view/fchomo/client.js:1184 -#: htdocs/luci-static/resources/view/fchomo/client.js:1306 -#: htdocs/luci-static/resources/view/fchomo/client.js:1527 -#: htdocs/luci-static/resources/view/fchomo/node.js:904 +#: htdocs/luci-static/resources/view/fchomo/client.js:1193 +#: htdocs/luci-static/resources/view/fchomo/client.js:1315 +#: htdocs/luci-static/resources/view/fchomo/client.js:1552 +#: htdocs/luci-static/resources/view/fchomo/node.js:923 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:143 msgid "Please type %s fields of mihomo config.
" msgstr "請輸入 mihomo 配置的 %s 欄位。
" -#: htdocs/luci-static/resources/view/fchomo/node.js:475 -#: htdocs/luci-static/resources/view/fchomo/server.js:265 +#: htdocs/luci-static/resources/view/fchomo/node.js:489 +#: htdocs/luci-static/resources/view/fchomo/server.js:266 msgid "Plugin" msgstr "插件" -#: htdocs/luci-static/resources/view/fchomo/node.js:485 -#: htdocs/luci-static/resources/view/fchomo/node.js:492 -#: htdocs/luci-static/resources/view/fchomo/node.js:500 +#: htdocs/luci-static/resources/view/fchomo/node.js:499 #: htdocs/luci-static/resources/view/fchomo/node.js:506 #: htdocs/luci-static/resources/view/fchomo/node.js:514 #: htdocs/luci-static/resources/view/fchomo/node.js:520 -#: htdocs/luci-static/resources/view/fchomo/server.js:271 -#: htdocs/luci-static/resources/view/fchomo/server.js:278 -#: htdocs/luci-static/resources/view/fchomo/server.js:284 +#: htdocs/luci-static/resources/view/fchomo/node.js:528 +#: htdocs/luci-static/resources/view/fchomo/node.js:534 +#: htdocs/luci-static/resources/view/fchomo/server.js:272 +#: htdocs/luci-static/resources/view/fchomo/server.js:279 +#: htdocs/luci-static/resources/view/fchomo/server.js:285 msgid "Plugin:" msgstr "插件:" -#: htdocs/luci-static/resources/view/fchomo/node.js:116 +#: htdocs/luci-static/resources/view/fchomo/node.js:117 msgid "Port" msgstr "連接埠" -#: htdocs/luci-static/resources/fchomo.js:1159 +#: htdocs/luci-static/resources/fchomo.js:1563 msgid "Port %s alrealy exists!" msgstr "連接埠 %s 已存在!" -#: htdocs/luci-static/resources/view/fchomo/node.js:211 -msgid "Port range" -msgstr "連接埠範圍" - -#: htdocs/luci-static/resources/view/fchomo/global.js:691 +#: htdocs/luci-static/resources/view/fchomo/global.js:681 msgid "Ports" msgstr "連接埠" -#: htdocs/luci-static/resources/view/fchomo/node.js:141 -#: htdocs/luci-static/resources/view/fchomo/server.js:96 +#: htdocs/luci-static/resources/view/fchomo/node.js:142 +#: htdocs/luci-static/resources/view/fchomo/server.js:97 msgid "Ports pool" msgstr "連接埠池" -#: htdocs/luci-static/resources/view/fchomo/node.js:232 -#: htdocs/luci-static/resources/view/fchomo/node.js:438 +#: htdocs/luci-static/resources/view/fchomo/node.js:240 +#: htdocs/luci-static/resources/view/fchomo/node.js:452 msgid "Pre-shared key" msgstr "預先共用金鑰" -#: htdocs/luci-static/resources/fchomo.js:136 +#: htdocs/luci-static/resources/fchomo.js:142 msgid "Prefer IPv4" msgstr "優先 IPv4" -#: htdocs/luci-static/resources/fchomo.js:137 +#: htdocs/luci-static/resources/fchomo.js:143 msgid "Prefer IPv6" msgstr "優先 IPv6" -#: htdocs/luci-static/resources/view/fchomo/global.js:737 -#: htdocs/luci-static/resources/view/fchomo/global.js:754 -#: htdocs/luci-static/resources/view/fchomo/node.js:868 -#: htdocs/luci-static/resources/view/fchomo/node.js:874 -#: htdocs/luci-static/resources/view/fchomo/node.js:1174 -#: htdocs/luci-static/resources/view/fchomo/node.js:1181 +#: htdocs/luci-static/resources/view/fchomo/global.js:524 +msgid "" +"Prevent ICMP loopback issues in some cases. Ping will not show real delay." +msgstr "在某些情況下防止 ICMP 環回問題。 Ping 不會顯示實際延遲。" + +#: htdocs/luci-static/resources/view/fchomo/global.js:727 +#: htdocs/luci-static/resources/view/fchomo/global.js:744 +#: htdocs/luci-static/resources/view/fchomo/node.js:887 +#: htdocs/luci-static/resources/view/fchomo/node.js:893 +#: htdocs/luci-static/resources/view/fchomo/node.js:1193 +#: htdocs/luci-static/resources/view/fchomo/node.js:1200 msgid "Priority: Proxy Node > Global." msgstr "優先權: 代理節點 > 全域。" -#: htdocs/luci-static/resources/view/fchomo/node.js:173 +#: htdocs/luci-static/resources/view/fchomo/node.js:174 msgid "Priv-key" msgstr "金鑰" -#: htdocs/luci-static/resources/view/fchomo/node.js:177 +#: htdocs/luci-static/resources/view/fchomo/node.js:178 msgid "Priv-key passphrase" msgstr "金鑰密碼" -#: htdocs/luci-static/resources/view/fchomo/node.js:423 +#: htdocs/luci-static/resources/view/fchomo/node.js:437 msgid "Private key" msgstr "私鑰" @@ -1832,29 +1887,29 @@ msgstr "私鑰" msgid "Process matching mode" msgstr "進程匹配模式" -#: htdocs/luci-static/resources/view/fchomo/global.js:685 -#: htdocs/luci-static/resources/view/fchomo/node.js:786 +#: htdocs/luci-static/resources/view/fchomo/global.js:675 +#: htdocs/luci-static/resources/view/fchomo/node.js:805 msgid "Protocol" msgstr "協議" -#: htdocs/luci-static/resources/view/fchomo/node.js:397 +#: htdocs/luci-static/resources/view/fchomo/node.js:411 msgid "Protocol parameter. Enable length block encryption." msgstr "協議參數。啟用長度塊加密。" -#: htdocs/luci-static/resources/view/fchomo/node.js:391 +#: htdocs/luci-static/resources/view/fchomo/node.js:405 msgid "" "Protocol parameter. Will waste traffic randomly if enabled (enabled by " "default in v2ray and cannot be disabled)." msgstr "協議參數。 如啟用會隨機浪費流量(在 v2ray 中預設為啟用且無法停用)。" #: htdocs/luci-static/resources/view/fchomo/client.js:937 -#: htdocs/luci-static/resources/view/fchomo/node.js:887 -#: htdocs/luci-static/resources/view/fchomo/node.js:896 -#: htdocs/luci-static/resources/view/fchomo/node.js:1290 +#: htdocs/luci-static/resources/view/fchomo/node.js:906 +#: htdocs/luci-static/resources/view/fchomo/node.js:915 +#: htdocs/luci-static/resources/view/fchomo/node.js:1309 msgid "Provider" msgstr "供應商" -#: htdocs/luci-static/resources/view/fchomo/node.js:1060 +#: htdocs/luci-static/resources/view/fchomo/node.js:1079 msgid "Provider URL" msgstr "供應商訂閱 URL" @@ -1863,53 +1918,53 @@ msgstr "供應商訂閱 URL" msgid "Proxy Group" msgstr "代理組" -#: htdocs/luci-static/resources/view/fchomo/global.js:787 +#: htdocs/luci-static/resources/view/fchomo/global.js:777 msgid "Proxy IPv4 IP-s" msgstr "代理 IPv4 位址" -#: htdocs/luci-static/resources/view/fchomo/global.js:790 +#: htdocs/luci-static/resources/view/fchomo/global.js:780 msgid "Proxy IPv6 IP-s" msgstr "代理 IPv6 位址" -#: htdocs/luci-static/resources/view/fchomo/global.js:793 +#: htdocs/luci-static/resources/view/fchomo/global.js:783 msgid "Proxy MAC-s" msgstr "代理 MAC 位址" #: htdocs/luci-static/resources/view/fchomo/node.js:76 -#: htdocs/luci-static/resources/view/fchomo/node.js:1289 +#: htdocs/luci-static/resources/view/fchomo/node.js:1308 msgid "Proxy Node" msgstr "代理節點" -#: htdocs/luci-static/resources/view/fchomo/node.js:1265 -#: htdocs/luci-static/resources/view/fchomo/node.js:1274 +#: htdocs/luci-static/resources/view/fchomo/node.js:1284 +#: htdocs/luci-static/resources/view/fchomo/node.js:1293 msgid "Proxy chain" msgstr "代理鏈" #: htdocs/luci-static/resources/view/fchomo/client.js:713 -#: htdocs/luci-static/resources/view/fchomo/client.js:1390 -#: htdocs/luci-static/resources/view/fchomo/node.js:1078 -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:357 +#: htdocs/luci-static/resources/view/fchomo/client.js:1415 +#: htdocs/luci-static/resources/view/fchomo/node.js:1097 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:365 msgid "Proxy group" msgstr "代理組" -#: htdocs/luci-static/resources/view/fchomo/client.js:1605 +#: htdocs/luci-static/resources/view/fchomo/client.js:1636 msgid "Proxy group override" msgstr "代理組覆蓋" -#: htdocs/luci-static/resources/view/fchomo/global.js:478 +#: htdocs/luci-static/resources/view/fchomo/global.js:476 msgid "Proxy mode" msgstr "代理模式" -#: htdocs/luci-static/resources/view/fchomo/global.js:796 +#: htdocs/luci-static/resources/view/fchomo/global.js:786 msgid "Proxy routerself" msgstr "代理路由器自身" -#: htdocs/luci-static/resources/view/fchomo/node.js:273 +#: htdocs/luci-static/resources/view/fchomo/node.js:281 msgid "QUIC" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:261 -#: htdocs/luci-static/resources/view/fchomo/server.js:186 +#: htdocs/luci-static/resources/view/fchomo/node.js:269 +#: htdocs/luci-static/resources/view/fchomo/server.js:187 msgid "QUIC congestion controller." msgstr "QUIC 壅塞控制器。" @@ -1918,67 +1973,76 @@ msgstr "QUIC 壅塞控制器。" msgid "Quick Reload" msgstr "快速重載" -#: htdocs/luci-static/resources/view/fchomo/node.js:659 -#: htdocs/luci-static/resources/view/fchomo/server.js:411 +#: htdocs/luci-static/resources/view/fchomo/node.js:678 +#: htdocs/luci-static/resources/view/fchomo/server.js:422 msgid "REALITY" msgstr "REALITY" -#: htdocs/luci-static/resources/view/fchomo/node.js:674 +#: htdocs/luci-static/resources/view/fchomo/node.js:693 msgid "REALITY X25519MLKEM768 PQC support" msgstr "REALITY X25519MLKEM768 後量子加密支援" -#: htdocs/luci-static/resources/view/fchomo/server.js:447 +#: htdocs/luci-static/resources/view/fchomo/server.js:459 msgid "REALITY certificate issued to" msgstr "REALITY 證書頒發給" -#: htdocs/luci-static/resources/view/fchomo/server.js:416 +#: htdocs/luci-static/resources/view/fchomo/server.js:427 msgid "REALITY handshake server" msgstr "REALITY 握手伺服器" -#: htdocs/luci-static/resources/view/fchomo/server.js:423 +#: htdocs/luci-static/resources/view/fchomo/server.js:434 msgid "REALITY private key" msgstr "REALITY 私鑰" -#: htdocs/luci-static/resources/view/fchomo/node.js:664 -#: htdocs/luci-static/resources/view/fchomo/server.js:437 +#: htdocs/luci-static/resources/view/fchomo/node.js:683 +#: htdocs/luci-static/resources/view/fchomo/server.js:449 msgid "REALITY public key" msgstr "REALITY 公鑰" -#: htdocs/luci-static/resources/view/fchomo/node.js:669 -#: htdocs/luci-static/resources/view/fchomo/server.js:441 +#: htdocs/luci-static/resources/view/fchomo/node.js:688 +#: htdocs/luci-static/resources/view/fchomo/server.js:453 msgid "REALITY short ID" msgstr "REALITY 標識符" -#: htdocs/luci-static/resources/view/fchomo/global.js:645 +#: htdocs/luci-static/resources/fchomo.js:1218 +#: htdocs/luci-static/resources/fchomo.js:1235 +msgid "RTT" +msgstr "" + +#: htdocs/luci-static/resources/view/fchomo/global.js:635 msgid "Random will be used if empty." msgstr "留空將使用隨機令牌。" -#: htdocs/luci-static/resources/view/fchomo/node.js:1323 -#: htdocs/luci-static/resources/view/fchomo/node.js:1345 +#: htdocs/luci-static/resources/fchomo.js:1040 +msgid "Randomized traffic characteristics" +msgstr "隨機化流量特徵" + +#: htdocs/luci-static/resources/view/fchomo/node.js:1342 +#: htdocs/luci-static/resources/view/fchomo/node.js:1364 msgid "Recommended to use UoT node.
such as %s." msgstr "建議使用 UoT 節點。
例如%s。" -#: htdocs/luci-static/resources/view/fchomo/global.js:462 +#: htdocs/luci-static/resources/view/fchomo/global.js:460 msgid "Redir port" msgstr "Redir 連接埠" -#: htdocs/luci-static/resources/view/fchomo/global.js:479 +#: htdocs/luci-static/resources/view/fchomo/global.js:477 msgid "Redirect TCP" msgstr "Redirect TCP" -#: htdocs/luci-static/resources/view/fchomo/global.js:481 +#: htdocs/luci-static/resources/view/fchomo/global.js:479 msgid "Redirect TCP + TProxy UDP" msgstr "Redirect TCP + TProxy UDP" -#: htdocs/luci-static/resources/view/fchomo/global.js:483 +#: htdocs/luci-static/resources/view/fchomo/global.js:481 msgid "Redirect TCP + Tun UDP" msgstr "Redirect TCP + Tun UDP" -#: htdocs/luci-static/resources/view/fchomo/log.js:81 +#: htdocs/luci-static/resources/view/fchomo/log.js:126 msgid "Refresh every %s seconds." msgstr "每 %s 秒刷新。" -#: htdocs/luci-static/resources/fchomo.js:922 +#: htdocs/luci-static/resources/fchomo.js:937 #: htdocs/luci-static/resources/view/fchomo/client.js:805 #: htdocs/luci-static/resources/view/fchomo/global.js:193 #: htdocs/luci-static/resources/view/fchomo/server.js:46 @@ -1989,50 +2053,51 @@ msgstr "重載" msgid "Reload All" msgstr "重載所有" -#: htdocs/luci-static/resources/view/fchomo/node.js:1017 -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:259 +#: htdocs/luci-static/resources/view/fchomo/node.js:1036 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:267 msgid "Remote" msgstr "遠端" -#: htdocs/luci-static/resources/view/fchomo/node.js:463 +#: htdocs/luci-static/resources/view/fchomo/node.js:477 msgid "Remote DNS resolve" msgstr "遠端 DNS 解析" -#: htdocs/luci-static/resources/fchomo.js:1080 +#: htdocs/luci-static/resources/fchomo.js:1462 msgid "Remove" msgstr "移除" -#: htdocs/luci-static/resources/fchomo.js:1085 -#: htdocs/luci-static/resources/view/fchomo/node.js:993 -#: htdocs/luci-static/resources/view/fchomo/node.js:995 +#: htdocs/luci-static/resources/fchomo.js:1467 +#: htdocs/luci-static/resources/view/fchomo/node.js:1012 +#: htdocs/luci-static/resources/view/fchomo/node.js:1014 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:240 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:242 msgid "Remove idles" msgstr "移除閒置" -#: htdocs/luci-static/resources/view/fchomo/node.js:1107 +#: htdocs/luci-static/resources/view/fchomo/node.js:1126 msgid "Replace name" msgstr "名稱替換" -#: htdocs/luci-static/resources/view/fchomo/node.js:1108 +#: htdocs/luci-static/resources/view/fchomo/node.js:1127 msgid "Replace node name." msgstr "替換節點名稱" -#: htdocs/luci-static/resources/view/fchomo/node.js:733 -#: htdocs/luci-static/resources/view/fchomo/node.js:740 -#: htdocs/luci-static/resources/view/fchomo/server.js:489 +#: htdocs/luci-static/resources/view/fchomo/node.js:752 +#: htdocs/luci-static/resources/view/fchomo/node.js:759 +#: htdocs/luci-static/resources/view/fchomo/server.js:501 msgid "Request path" msgstr "請求路徑" -#: htdocs/luci-static/resources/view/fchomo/node.js:308 +#: htdocs/luci-static/resources/view/fchomo/node.js:316 msgid "Request timeout" msgstr "請求逾時" -#: htdocs/luci-static/resources/view/fchomo/node.js:675 +#: htdocs/luci-static/resources/fchomo.js:1048 +#: htdocs/luci-static/resources/view/fchomo/node.js:694 msgid "Requires server support." -msgstr "" +msgstr "需要伺服器支援。" -#: htdocs/luci-static/resources/view/fchomo/node.js:452 +#: htdocs/luci-static/resources/view/fchomo/node.js:466 msgid "Reserved field bytes" msgstr "保留字段位元組" @@ -2040,7 +2105,7 @@ msgstr "保留字段位元組" msgid "Resources management" msgstr "資源管理" -#: htdocs/luci-static/resources/view/fchomo/node.js:520 +#: htdocs/luci-static/resources/view/fchomo/node.js:534 msgid "Restls script" msgstr "Restls 劇本" @@ -2054,39 +2119,39 @@ msgid "" "Returns the string input for icon in the API to display in this proxy group." msgstr "在 API 傳回 icon 所輸入的字串,以在該代理組顯示。" -#: htdocs/luci-static/resources/view/fchomo/global.js:800 +#: htdocs/luci-static/resources/view/fchomo/global.js:805 msgid "Routing Control" msgstr "路由控制" -#: htdocs/luci-static/resources/view/fchomo/global.js:840 -#: htdocs/luci-static/resources/view/fchomo/global.js:843 +#: htdocs/luci-static/resources/view/fchomo/global.js:845 +#: htdocs/luci-static/resources/view/fchomo/global.js:848 msgid "Routing DSCP" msgstr "路由 DSCP" -#: htdocs/luci-static/resources/view/fchomo/global.js:824 +#: htdocs/luci-static/resources/view/fchomo/global.js:829 msgid "Routing GFW" msgstr "路由 GFW 流量" -#: htdocs/luci-static/resources/view/fchomo/global.js:753 -#: htdocs/luci-static/resources/view/fchomo/node.js:873 -#: htdocs/luci-static/resources/view/fchomo/node.js:1180 +#: htdocs/luci-static/resources/view/fchomo/global.js:743 +#: htdocs/luci-static/resources/view/fchomo/node.js:892 +#: htdocs/luci-static/resources/view/fchomo/node.js:1199 msgid "Routing mark" msgstr "路由標記" -#: htdocs/luci-static/resources/view/fchomo/global.js:820 +#: htdocs/luci-static/resources/view/fchomo/global.js:825 msgid "Routing mode" msgstr "路由模式" -#: htdocs/luci-static/resources/view/fchomo/global.js:821 +#: htdocs/luci-static/resources/view/fchomo/global.js:826 msgid "Routing mode of the traffic enters mihomo via firewall rules." msgstr "流量經由防火牆規則進入 mihomo 的路由模式。" -#: htdocs/luci-static/resources/view/fchomo/global.js:827 +#: htdocs/luci-static/resources/view/fchomo/global.js:832 msgid "Routing mode will be handle domain." msgstr "路由模式將處理網域。" -#: htdocs/luci-static/resources/view/fchomo/global.js:802 -#: htdocs/luci-static/resources/view/fchomo/global.js:811 +#: htdocs/luci-static/resources/view/fchomo/global.js:807 +#: htdocs/luci-static/resources/view/fchomo/global.js:816 msgid "Routing ports" msgstr "路由連接埠" @@ -2095,11 +2160,11 @@ msgstr "路由連接埠" msgid "Routing rule" msgstr "路由規則" -#: htdocs/luci-static/resources/view/fchomo/global.js:747 +#: htdocs/luci-static/resources/view/fchomo/global.js:737 msgid "Routing rule priority" msgstr "路由規則優先權" -#: htdocs/luci-static/resources/view/fchomo/global.js:741 +#: htdocs/luci-static/resources/view/fchomo/global.js:731 msgid "Routing table ID" msgstr "路由表 ID" @@ -2107,13 +2172,13 @@ msgstr "路由表 ID" msgid "Rule" msgstr "規則" -#: htdocs/luci-static/resources/view/fchomo/client.js:1569 -#: htdocs/luci-static/resources/view/fchomo/client.js:1582 +#: htdocs/luci-static/resources/view/fchomo/client.js:1600 +#: htdocs/luci-static/resources/view/fchomo/client.js:1613 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:135 msgid "Rule set" msgstr "規則集" -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:339 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:347 msgid "Rule set URL" msgstr "規則集訂閱 URL" @@ -2125,69 +2190,79 @@ msgstr "規則集" msgid "Ruleset-URI-Scheme" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:935 +#: htdocs/luci-static/resources/fchomo.js:950 msgid "Running" msgstr "正在運作" -#: htdocs/luci-static/resources/fchomo.js:119 +#: htdocs/luci-static/resources/fchomo.js:125 msgid "SOCKS" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:149 +#: htdocs/luci-static/resources/fchomo.js:155 msgid "SOCKS5" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:162 +#: htdocs/luci-static/resources/fchomo.js:168 msgid "SSH" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:196 +#: htdocs/luci-static/resources/fchomo.js:204 msgid "STUN ports" msgstr "STUN 連接埠" -#: htdocs/luci-static/resources/view/fchomo/client.js:1141 +#: htdocs/luci-static/resources/view/fchomo/client.js:1149 msgid "SUB-RULE" msgstr "SUB-RULE" -#: htdocs/luci-static/resources/view/fchomo/node.js:538 +#: htdocs/luci-static/resources/view/fchomo/node.js:552 msgid "SUoT version" msgstr "SUoT 版本" -#: htdocs/luci-static/resources/view/fchomo/node.js:160 -#: htdocs/luci-static/resources/view/fchomo/server.js:142 +#: htdocs/luci-static/resources/view/fchomo/node.js:161 +#: htdocs/luci-static/resources/view/fchomo/server.js:143 msgid "Salamander" msgstr "Salamander" -#: htdocs/luci-static/resources/fchomo.js:142 +#: htdocs/luci-static/resources/fchomo.js:148 msgid "Same dstaddr requests. Same node" msgstr "相同 目標位址 請求。相同節點" -#: htdocs/luci-static/resources/fchomo.js:143 +#: htdocs/luci-static/resources/fchomo.js:149 msgid "Same srcaddr and dstaddr requests. Same node" msgstr "相同 來源位址 和 目標位址 請求。相同節點" -#: htdocs/luci-static/resources/view/fchomo/global.js:521 +#: htdocs/luci-static/resources/view/fchomo/global.js:509 msgid "Segment maximum size" msgstr "分段最大尺寸" -#: htdocs/luci-static/resources/fchomo.js:185 +#: htdocs/luci-static/resources/fchomo.js:193 msgid "Select" msgstr "手動選擇" -#: htdocs/luci-static/resources/view/fchomo/global.js:606 +#: htdocs/luci-static/resources/view/fchomo/global.js:596 msgid "Select Dashboard" msgstr "選擇面板" +#: htdocs/luci-static/resources/fchomo.js:1054 +msgid "Send padding randomly 0-3333 bytes with 50% probability." +msgstr "以 50% 的機率發送隨機 0 到 3333 位元組的填充。" + +#: htdocs/luci-static/resources/fchomo.js:1043 +#: htdocs/luci-static/resources/fchomo.js:1044 +msgid "Send random ticket of 300s-600s duration for client 0-RTT reuse." +msgstr "發送 300-600 秒的隨機票證,以供客戶端 0-RTT 重用。" + +#: htdocs/luci-static/resources/fchomo.js:1218 #: htdocs/luci-static/resources/view/fchomo/server.js:59 #: root/usr/share/luci/menu.d/luci-app-fchomo.json:54 msgid "Server" msgstr "服務端" -#: htdocs/luci-static/resources/view/fchomo/node.js:111 +#: htdocs/luci-static/resources/view/fchomo/node.js:112 msgid "Server address" msgstr "伺服器位址" -#: htdocs/luci-static/resources/view/fchomo/node.js:718 +#: htdocs/luci-static/resources/view/fchomo/node.js:737 msgid "Server hostname" msgstr "伺服器主機名稱" @@ -2199,93 +2274,93 @@ msgstr "服務端狀態" msgid "Service status" msgstr "服務狀態" -#: htdocs/luci-static/resources/fchomo.js:121 -#: htdocs/luci-static/resources/fchomo.js:150 +#: htdocs/luci-static/resources/fchomo.js:127 +#: htdocs/luci-static/resources/fchomo.js:156 msgid "Shadowsocks" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:321 -#: htdocs/luci-static/resources/view/fchomo/server.js:220 +#: htdocs/luci-static/resources/view/fchomo/node.js:335 +#: htdocs/luci-static/resources/view/fchomo/server.js:221 msgid "Shadowsocks chipher" msgstr "Shadowsocks 加密方法" -#: htdocs/luci-static/resources/view/fchomo/node.js:316 -#: htdocs/luci-static/resources/view/fchomo/server.js:215 +#: htdocs/luci-static/resources/view/fchomo/node.js:330 +#: htdocs/luci-static/resources/view/fchomo/server.js:216 msgid "Shadowsocks encrypt" msgstr "Shadowsocks 加密" -#: htdocs/luci-static/resources/view/fchomo/node.js:329 -#: htdocs/luci-static/resources/view/fchomo/server.js:228 +#: htdocs/luci-static/resources/view/fchomo/node.js:343 +#: htdocs/luci-static/resources/view/fchomo/server.js:229 msgid "Shadowsocks password" msgstr "Shadowsocks 密碼" -#: htdocs/luci-static/resources/view/fchomo/node.js:828 +#: htdocs/luci-static/resources/view/fchomo/node.js:847 msgid "Show connections in the dashboard for breaking connections easier." msgstr "在面板中顯示連線以便於打斷連線。" -#: htdocs/luci-static/resources/view/fchomo/global.js:407 +#: htdocs/luci-static/resources/fchomo.js:68 msgid "Silent" msgstr "靜音" -#: htdocs/luci-static/resources/fchomo.js:141 +#: htdocs/luci-static/resources/fchomo.js:147 msgid "Simple round-robin all nodes" msgstr "簡單輪替所有節點" -#: htdocs/luci-static/resources/view/fchomo/node.js:1066 -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:345 +#: htdocs/luci-static/resources/view/fchomo/node.js:1085 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:353 msgid "Size limit" msgstr "大小限制" -#: htdocs/luci-static/resources/view/fchomo/client.js:1423 -#: htdocs/luci-static/resources/view/fchomo/node.js:629 -#: htdocs/luci-static/resources/view/fchomo/node.js:1158 +#: htdocs/luci-static/resources/view/fchomo/client.js:1448 +#: htdocs/luci-static/resources/view/fchomo/node.js:648 +#: htdocs/luci-static/resources/view/fchomo/node.js:1177 msgid "Skip cert verify" msgstr "跳過憑證驗證" -#: htdocs/luci-static/resources/view/fchomo/global.js:663 +#: htdocs/luci-static/resources/view/fchomo/global.js:653 msgid "Skiped sniffing domain" msgstr "跳過嗅探網域" -#: htdocs/luci-static/resources/view/fchomo/global.js:669 +#: htdocs/luci-static/resources/view/fchomo/global.js:659 msgid "Skiped sniffing dst address" msgstr "跳過嗅探目標位址" -#: htdocs/luci-static/resources/view/fchomo/global.js:666 +#: htdocs/luci-static/resources/view/fchomo/global.js:656 msgid "Skiped sniffing src address" msgstr "跳過嗅探來源位址" -#: htdocs/luci-static/resources/fchomo.js:153 +#: htdocs/luci-static/resources/fchomo.js:159 msgid "Snell" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:673 +#: htdocs/luci-static/resources/view/fchomo/global.js:663 msgid "Sniff protocol" msgstr "嗅探協議" -#: htdocs/luci-static/resources/view/fchomo/global.js:650 +#: htdocs/luci-static/resources/view/fchomo/global.js:640 msgid "Sniffer" msgstr "嗅探器" -#: htdocs/luci-static/resources/view/fchomo/global.js:653 +#: htdocs/luci-static/resources/view/fchomo/global.js:643 msgid "Sniffer settings" msgstr "嗅探器設定" -#: htdocs/luci-static/resources/view/fchomo/global.js:803 -#: htdocs/luci-static/resources/view/fchomo/global.js:812 +#: htdocs/luci-static/resources/view/fchomo/global.js:808 +#: htdocs/luci-static/resources/view/fchomo/global.js:817 msgid "" "Specify target ports to be proxied. Multiple ports must be separated by " "commas." msgstr "指定需要被代理的目標連接埠。多個連接埠必須以逗號隔開。" -#: htdocs/luci-static/resources/view/fchomo/global.js:494 +#: htdocs/luci-static/resources/view/fchomo/global.js:492 msgid "Stack" msgstr "堆栈" -#: htdocs/luci-static/resources/fchomo.js:199 +#: htdocs/luci-static/resources/fchomo.js:207 msgid "Steam Client ports" msgstr "Steam 客戶端 連接埠" -#: htdocs/luci-static/resources/fchomo.js:200 +#: htdocs/luci-static/resources/fchomo.js:208 msgid "Steam P2P ports" msgstr "Steam P2P 連接埠" @@ -2294,16 +2369,16 @@ msgstr "Steam P2P 連接埠" msgid "Strategy" msgstr "策略" -#: htdocs/luci-static/resources/view/fchomo/client.js:1167 #: htdocs/luci-static/resources/view/fchomo/client.js:1176 +#: htdocs/luci-static/resources/view/fchomo/client.js:1185 msgid "Sub rule" msgstr "子規則" -#: htdocs/luci-static/resources/view/fchomo/client.js:1226 +#: htdocs/luci-static/resources/view/fchomo/client.js:1235 msgid "Sub rule group" msgstr "子規則組" -#: htdocs/luci-static/resources/fchomo.js:507 +#: htdocs/luci-static/resources/fchomo.js:522 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:211 msgid "Successfully imported %s %s of total %s." msgstr "已成功匯入 %s 個%s (共 %s 個)。" @@ -2312,7 +2387,7 @@ msgstr "已成功匯入 %s 個%s (共 %s 個)。" msgid "Successfully updated." msgstr "更新成功。" -#: htdocs/luci-static/resources/fchomo.js:1382 +#: htdocs/luci-static/resources/fchomo.js:1786 msgid "Successfully uploaded." msgstr "已成功上傳。" @@ -2324,7 +2399,7 @@ msgstr "" "支持规则集类型为: %s 并且格式为: %s 的规则集鏈接。" "
" -#: htdocs/luci-static/resources/view/fchomo/global.js:496 +#: htdocs/luci-static/resources/view/fchomo/global.js:494 msgid "System" msgstr "系統" @@ -2337,68 +2412,68 @@ msgstr "系統 DNS" msgid "TCP" msgstr "TCP" -#: htdocs/luci-static/resources/view/fchomo/global.js:423 +#: htdocs/luci-static/resources/view/fchomo/global.js:421 msgid "TCP concurrency" msgstr "TCP 併發" -#: htdocs/luci-static/resources/view/fchomo/node.js:821 +#: htdocs/luci-static/resources/view/fchomo/node.js:840 msgid "TCP only" msgstr "僅 TCP" -#: htdocs/luci-static/resources/view/fchomo/global.js:431 +#: htdocs/luci-static/resources/view/fchomo/global.js:429 msgid "TCP-Keep-Alive idle timeout" msgstr "TCP-Keep-Alive 閒置逾時" -#: htdocs/luci-static/resources/view/fchomo/global.js:426 +#: htdocs/luci-static/resources/view/fchomo/global.js:424 msgid "TCP-Keep-Alive interval" msgstr "TCP-Keep-Alive 間隔" -#: htdocs/luci-static/resources/view/fchomo/node.js:852 -#: htdocs/luci-static/resources/view/fchomo/node.js:1125 +#: htdocs/luci-static/resources/view/fchomo/node.js:871 +#: htdocs/luci-static/resources/view/fchomo/node.js:1144 msgid "TFO" msgstr "TCP 快速開啟 (TFO)" -#: htdocs/luci-static/resources/view/fchomo/global.js:537 -#: htdocs/luci-static/resources/view/fchomo/node.js:487 -#: htdocs/luci-static/resources/view/fchomo/node.js:546 -#: htdocs/luci-static/resources/view/fchomo/server.js:299 +#: htdocs/luci-static/resources/view/fchomo/global.js:525 +#: htdocs/luci-static/resources/view/fchomo/node.js:501 +#: htdocs/luci-static/resources/view/fchomo/node.js:565 +#: htdocs/luci-static/resources/view/fchomo/server.js:308 msgid "TLS" msgstr "TLS" -#: htdocs/luci-static/resources/view/fchomo/node.js:577 -#: htdocs/luci-static/resources/view/fchomo/server.js:330 +#: htdocs/luci-static/resources/view/fchomo/node.js:596 +#: htdocs/luci-static/resources/view/fchomo/server.js:339 msgid "TLS ALPN" msgstr "TLS ALPN" -#: htdocs/luci-static/resources/view/fchomo/node.js:571 +#: htdocs/luci-static/resources/view/fchomo/node.js:590 msgid "TLS SNI" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:91 -#: htdocs/luci-static/resources/view/fchomo/server.js:65 +#: htdocs/luci-static/resources/view/fchomo/node.js:92 +#: htdocs/luci-static/resources/view/fchomo/server.js:66 msgid "TLS fields" msgstr "TLS欄位" -#: htdocs/luci-static/resources/fchomo.js:126 -#: htdocs/luci-static/resources/fchomo.js:160 +#: htdocs/luci-static/resources/fchomo.js:132 +#: htdocs/luci-static/resources/fchomo.js:166 msgid "TUIC" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:197 +#: htdocs/luci-static/resources/fchomo.js:205 msgid "TURN ports" msgstr "TURN 連接埠" -#: htdocs/luci-static/resources/view/fchomo/server.js:135 +#: htdocs/luci-static/resources/view/fchomo/server.js:136 msgid "" "Tell the client to use the BBR flow control algorithm instead of Hysteria CC." msgstr "讓客戶端使用 BBR 流控演算法。" -#: htdocs/luci-static/resources/view/fchomo/node.js:411 -#: htdocs/luci-static/resources/view/fchomo/node.js:418 +#: htdocs/luci-static/resources/view/fchomo/node.js:425 +#: htdocs/luci-static/resources/view/fchomo/node.js:432 msgid "The %s address used by local machine in the Wireguard network." msgstr "WireGuard 網路中使用的本機 %s 位址。" -#: htdocs/luci-static/resources/view/fchomo/node.js:644 +#: htdocs/luci-static/resources/view/fchomo/node.js:663 msgid "" "The ECH parameter of the HTTPS record for the domain. Leave empty to resolve " "via DNS." @@ -2408,39 +2483,48 @@ msgstr "網域的 HTTPS 記錄的 ECH 參數。留空則透過 DNS 解析。" msgid "The default value is 2:00 every day." msgstr "預設值為每天 2:00。" -#: htdocs/luci-static/resources/view/fchomo/client.js:1628 +#: htdocs/luci-static/resources/fchomo.js:1247 +msgid "" +"The first padding must have a probability of 100% and at least 35 bytes." +msgstr "首個填充必須為 100% 的機率並且至少 35 位元組。" + +#: htdocs/luci-static/resources/view/fchomo/client.js:1659 msgid "The matching %s will be deemed as not-poisoned." msgstr "匹配 %s 的將被視為未被投毒汙染。" -#: htdocs/luci-static/resources/view/fchomo/client.js:1637 -#: htdocs/luci-static/resources/view/fchomo/client.js:1641 -#: htdocs/luci-static/resources/view/fchomo/client.js:1646 +#: htdocs/luci-static/resources/view/fchomo/client.js:1668 +#: htdocs/luci-static/resources/view/fchomo/client.js:1672 +#: htdocs/luci-static/resources/view/fchomo/client.js:1677 msgid "The matching %s will be deemed as poisoned." msgstr "匹配 %s 的將被視為已被投毒汙染。" -#: htdocs/luci-static/resources/view/fchomo/server.js:351 +#: htdocs/luci-static/resources/fchomo.js:1245 +msgid "The server and client can set different padding parameters." +msgstr "伺服器和客戶端可以設定不同的填充參數。" + +#: htdocs/luci-static/resources/view/fchomo/server.js:360 msgid "The server private key, in PEM format." msgstr "服務端私鑰,需要 PEM 格式。" -#: htdocs/luci-static/resources/view/fchomo/server.js:336 +#: htdocs/luci-static/resources/view/fchomo/server.js:345 msgid "The server public key, in PEM format." msgstr "服務端公鑰,需要 PEM 格式。" -#: htdocs/luci-static/resources/view/fchomo/global.js:595 -#: htdocs/luci-static/resources/view/fchomo/server.js:405 +#: htdocs/luci-static/resources/view/fchomo/global.js:585 +#: htdocs/luci-static/resources/view/fchomo/server.js:416 msgid "This ECH parameter needs to be added to the HTTPS record of the domain." msgstr "此 ECH 參數需要加入到網域的 HTTPS 記錄中。" -#: htdocs/luci-static/resources/view/fchomo/client.js:1426 -#: htdocs/luci-static/resources/view/fchomo/node.js:632 -#: htdocs/luci-static/resources/view/fchomo/node.js:1161 +#: htdocs/luci-static/resources/view/fchomo/client.js:1451 +#: htdocs/luci-static/resources/view/fchomo/node.js:651 +#: htdocs/luci-static/resources/view/fchomo/node.js:1180 msgid "" "This is DANGEROUS, your traffic is almost like " "PLAIN TEXT! Use at your own risk!" msgstr "" "這是危險行為,您的流量將幾乎等同於明文!使用風險自負!" -#: htdocs/luci-static/resources/view/fchomo/node.js:278 +#: htdocs/luci-static/resources/view/fchomo/node.js:286 msgid "" "This is the TUIC port of the SUoT protocol, designed to provide a QUIC " "stream based UDP relay mode that TUIC does not provide." @@ -2453,38 +2537,38 @@ msgid "" "To check NAT Behavior you need to install
%s first" msgstr "檢測 NAT 行為需要先安裝 %s" -#: htdocs/luci-static/resources/view/fchomo/global.js:486 +#: htdocs/luci-static/resources/view/fchomo/global.js:484 msgid "" "To enable Tun support, you need to install ip-full and " "kmod-tun" msgstr "" "要啟用 Tun 支持,您需要安裝 ip-fullkmod-tun。" -#: htdocs/luci-static/resources/view/fchomo/global.js:832 +#: htdocs/luci-static/resources/view/fchomo/global.js:837 msgid "To enable, you need to install dnsmasq-full." msgstr "要啟用,您需要安裝 dnsmasq-full。" -#: htdocs/luci-static/resources/view/fchomo/global.js:760 +#: htdocs/luci-static/resources/view/fchomo/global.js:750 msgid "Tproxy Fwmark" msgstr "Tproxy 標記" -#: htdocs/luci-static/resources/view/fchomo/global.js:467 +#: htdocs/luci-static/resources/view/fchomo/global.js:465 msgid "Tproxy port" msgstr "Tproxy 連接埠" -#: htdocs/luci-static/resources/view/fchomo/node.js:216 -#: htdocs/luci-static/resources/view/fchomo/node.js:681 -#: htdocs/luci-static/resources/view/fchomo/server.js:455 +#: htdocs/luci-static/resources/view/fchomo/node.js:217 +#: htdocs/luci-static/resources/view/fchomo/node.js:700 +#: htdocs/luci-static/resources/view/fchomo/server.js:467 msgid "Transport" msgstr "傳輸層" -#: htdocs/luci-static/resources/view/fchomo/node.js:92 -#: htdocs/luci-static/resources/view/fchomo/server.js:66 +#: htdocs/luci-static/resources/view/fchomo/node.js:93 +#: htdocs/luci-static/resources/view/fchomo/server.js:67 msgid "Transport fields" msgstr "傳輸層欄位" -#: htdocs/luci-static/resources/view/fchomo/node.js:686 -#: htdocs/luci-static/resources/view/fchomo/server.js:460 +#: htdocs/luci-static/resources/view/fchomo/node.js:705 +#: htdocs/luci-static/resources/view/fchomo/server.js:472 msgid "Transport type" msgstr "傳輸層類型" @@ -2492,24 +2576,24 @@ msgstr "傳輸層類型" msgid "Treat the destination IP as the source IP." msgstr "將 目標 IP 視為 來源 IP。" -#: htdocs/luci-static/resources/fchomo.js:124 -#: htdocs/luci-static/resources/fchomo.js:156 +#: htdocs/luci-static/resources/fchomo.js:130 +#: htdocs/luci-static/resources/fchomo.js:162 msgid "Trojan" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:765 +#: htdocs/luci-static/resources/view/fchomo/global.js:755 msgid "Tun Fwmark" msgstr "Tun 標記" -#: htdocs/luci-static/resources/view/fchomo/global.js:484 +#: htdocs/luci-static/resources/view/fchomo/global.js:482 msgid "Tun TCP/UDP" msgstr "Tun TCP/UDP" -#: htdocs/luci-static/resources/view/fchomo/global.js:491 +#: htdocs/luci-static/resources/view/fchomo/global.js:489 msgid "Tun settings" msgstr "Tun 設定" -#: htdocs/luci-static/resources/view/fchomo/global.js:495 +#: htdocs/luci-static/resources/view/fchomo/global.js:493 msgid "Tun stack." msgstr "Tun 堆栈" @@ -2517,55 +2601,55 @@ msgstr "Tun 堆栈" #: htdocs/luci-static/resources/view/fchomo/client.js:571 #: htdocs/luci-static/resources/view/fchomo/client.js:665 #: htdocs/luci-static/resources/view/fchomo/client.js:910 -#: htdocs/luci-static/resources/view/fchomo/client.js:1566 -#: htdocs/luci-static/resources/view/fchomo/node.js:105 -#: htdocs/luci-static/resources/view/fchomo/node.js:1015 -#: htdocs/luci-static/resources/view/fchomo/node.js:1288 -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:257 -#: htdocs/luci-static/resources/view/fchomo/server.js:85 +#: htdocs/luci-static/resources/view/fchomo/client.js:1597 +#: htdocs/luci-static/resources/view/fchomo/node.js:106 +#: htdocs/luci-static/resources/view/fchomo/node.js:1034 +#: htdocs/luci-static/resources/view/fchomo/node.js:1307 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:265 +#: htdocs/luci-static/resources/view/fchomo/server.js:86 msgid "Type" msgstr "類型" #: htdocs/luci-static/resources/view/fchomo/client.js:516 #: htdocs/luci-static/resources/view/fchomo/client.js:606 -#: htdocs/luci-static/resources/view/fchomo/node.js:527 -#: htdocs/luci-static/resources/view/fchomo/node.js:1135 -#: htdocs/luci-static/resources/view/fchomo/server.js:293 +#: htdocs/luci-static/resources/view/fchomo/node.js:541 +#: htdocs/luci-static/resources/view/fchomo/node.js:1154 +#: htdocs/luci-static/resources/view/fchomo/server.js:294 msgid "UDP" msgstr "UDP" -#: htdocs/luci-static/resources/view/fchomo/global.js:525 +#: htdocs/luci-static/resources/view/fchomo/global.js:513 msgid "UDP NAT expiration time" msgstr "UDP NAT 過期時間" -#: htdocs/luci-static/resources/view/fchomo/node.js:277 +#: htdocs/luci-static/resources/view/fchomo/node.js:285 msgid "UDP over stream" msgstr "UDP over stream" -#: htdocs/luci-static/resources/view/fchomo/node.js:283 +#: htdocs/luci-static/resources/view/fchomo/node.js:291 msgid "UDP over stream version" msgstr "UDP over stream 版本" -#: htdocs/luci-static/resources/view/fchomo/node.js:270 +#: htdocs/luci-static/resources/view/fchomo/node.js:278 msgid "UDP packet relay mode." msgstr "UDP 包中繼模式。" -#: htdocs/luci-static/resources/view/fchomo/node.js:269 +#: htdocs/luci-static/resources/view/fchomo/node.js:277 msgid "UDP relay mode" msgstr "UDP 中繼模式" -#: htdocs/luci-static/resources/fchomo.js:187 +#: htdocs/luci-static/resources/fchomo.js:195 msgid "URL test" msgstr "自動選擇" -#: htdocs/luci-static/resources/view/fchomo/node.js:248 -#: htdocs/luci-static/resources/view/fchomo/node.js:360 -#: htdocs/luci-static/resources/view/fchomo/server.js:179 -#: htdocs/luci-static/resources/view/fchomo/server.js:243 +#: htdocs/luci-static/resources/view/fchomo/node.js:256 +#: htdocs/luci-static/resources/view/fchomo/node.js:374 +#: htdocs/luci-static/resources/view/fchomo/server.js:180 +#: htdocs/luci-static/resources/view/fchomo/server.js:244 msgid "UUID" msgstr "UUID" -#: htdocs/luci-static/resources/fchomo.js:980 +#: htdocs/luci-static/resources/fchomo.js:995 msgid "Unable to download unsupported type: %s" msgstr "無法下載不支援的類型: %s" @@ -2573,7 +2657,7 @@ msgstr "無法下載不支援的類型: %s" msgid "Unable to save contents: %s" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:420 +#: htdocs/luci-static/resources/view/fchomo/global.js:418 msgid "Unified delay" msgstr "統一延遲" @@ -2586,12 +2670,12 @@ msgstr "未知" msgid "Unknown error." msgstr "未知錯誤。" -#: htdocs/luci-static/resources/view/fchomo/log.js:58 +#: htdocs/luci-static/resources/view/fchomo/log.js:102 msgid "Unknown error: %s" msgstr "未知錯誤:%s" -#: htdocs/luci-static/resources/view/fchomo/node.js:532 -#: htdocs/luci-static/resources/view/fchomo/node.js:1140 +#: htdocs/luci-static/resources/view/fchomo/node.js:546 +#: htdocs/luci-static/resources/view/fchomo/node.js:1159 msgid "UoT" msgstr "UDP over TCP (UoT)" @@ -2599,20 +2683,20 @@ msgstr "UDP over TCP (UoT)" msgid "Update failed." msgstr "更新失敗。" -#: htdocs/luci-static/resources/view/fchomo/node.js:1072 -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:351 +#: htdocs/luci-static/resources/view/fchomo/node.js:1091 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:359 msgid "Update interval" msgstr "更新間隔" -#: htdocs/luci-static/resources/view/fchomo/node.js:839 +#: htdocs/luci-static/resources/view/fchomo/node.js:858 msgid "Upload bandwidth" msgstr "上傳頻寬" -#: htdocs/luci-static/resources/view/fchomo/node.js:840 +#: htdocs/luci-static/resources/view/fchomo/node.js:859 msgid "Upload bandwidth in Mbps." msgstr "上傳頻寬(單位:Mbps)。" -#: htdocs/luci-static/resources/view/fchomo/server.js:342 +#: htdocs/luci-static/resources/view/fchomo/server.js:351 msgid "Upload certificate" msgstr "上傳憑證" @@ -2620,85 +2704,94 @@ msgstr "上傳憑證" msgid "Upload initial package" msgstr "上傳初始資源包" -#: htdocs/luci-static/resources/view/fchomo/server.js:357 +#: htdocs/luci-static/resources/view/fchomo/server.js:366 msgid "Upload key" msgstr "上傳金鑰" #: htdocs/luci-static/resources/view/fchomo/global.js:306 -#: htdocs/luci-static/resources/view/fchomo/server.js:345 -#: htdocs/luci-static/resources/view/fchomo/server.js:360 +#: htdocs/luci-static/resources/view/fchomo/server.js:354 +#: htdocs/luci-static/resources/view/fchomo/server.js:369 msgid "Upload..." msgstr "上傳..." -#: htdocs/luci-static/resources/view/fchomo/client.js:1251 +#: htdocs/luci-static/resources/view/fchomo/client.js:1260 msgid "Used to resolve the domain of the DNS server. Must be IP." msgstr "用於解析 DNS 伺服器的網域。必須是 IP。" -#: htdocs/luci-static/resources/view/fchomo/client.js:1258 +#: htdocs/luci-static/resources/view/fchomo/client.js:1267 msgid "Used to resolve the domain of the Proxy node." msgstr "用於解析代理節點的網域。" -#: htdocs/luci-static/resources/view/fchomo/node.js:572 +#: htdocs/luci-static/resources/view/fchomo/node.js:591 msgid "Used to verify the hostname on the returned certificates." msgstr "用於驗證傳回的憑證上的主機名稱。" -#: htdocs/luci-static/resources/view/fchomo/global.js:440 +#: htdocs/luci-static/resources/view/fchomo/global.js:438 msgid "User Authentication" msgstr "使用者認證" -#: htdocs/luci-static/resources/view/fchomo/node.js:123 -#: htdocs/luci-static/resources/view/fchomo/server.js:108 +#: htdocs/luci-static/resources/view/fchomo/node.js:124 +#: htdocs/luci-static/resources/view/fchomo/server.js:109 msgid "Username" msgstr "使用者名稱" -#: htdocs/luci-static/resources/view/fchomo/global.js:773 +#: htdocs/luci-static/resources/view/fchomo/global.js:763 msgid "Users filter mode" msgstr "使用者過濾模式" -#: htdocs/luci-static/resources/view/fchomo/node.js:769 +#: htdocs/luci-static/resources/view/fchomo/node.js:788 msgid "V2ray HTTPUpgrade" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:774 +#: htdocs/luci-static/resources/view/fchomo/node.js:793 msgid "V2ray HTTPUpgrade fast open" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:123 -#: htdocs/luci-static/resources/fchomo.js:155 +#: htdocs/luci-static/resources/fchomo.js:129 +#: htdocs/luci-static/resources/fchomo.js:161 msgid "VLESS" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:122 -#: htdocs/luci-static/resources/fchomo.js:154 +#: htdocs/luci-static/resources/fchomo.js:128 +#: htdocs/luci-static/resources/fchomo.js:160 msgid "VMess" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1021 -#: htdocs/luci-static/resources/view/fchomo/node.js:1294 -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:300 +#: htdocs/luci-static/resources/view/fchomo/node.js:1040 +#: htdocs/luci-static/resources/view/fchomo/node.js:1313 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:308 msgid "Value" msgstr "可視化值" -#: htdocs/luci-static/resources/view/fchomo/node.js:239 -#: htdocs/luci-static/resources/view/fchomo/node.js:506 -#: htdocs/luci-static/resources/view/fchomo/server.js:284 +#: htdocs/luci-static/resources/view/fchomo/node.js:247 +#: htdocs/luci-static/resources/view/fchomo/node.js:520 +#: htdocs/luci-static/resources/view/fchomo/server.js:285 msgid "Version" msgstr "版本" -#: htdocs/luci-static/resources/view/fchomo/node.js:514 +#: htdocs/luci-static/resources/view/fchomo/node.js:528 msgid "Version hint" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/global.js:409 +#: htdocs/luci-static/resources/view/fchomo/node.js:91 +#: htdocs/luci-static/resources/view/fchomo/server.js:65 +msgid "Vless Encryption fields" +msgstr "Vless Encryption 欄位" + +#: htdocs/luci-static/resources/fchomo.js:1053 +msgid "Wait a random 0-111 milliseconds with 75% probability." +msgstr "以 75% 的機率等待隨機 0-111 毫秒。" + +#: htdocs/luci-static/resources/fchomo.js:70 msgid "Warning" msgstr "警告" -#: htdocs/luci-static/resources/view/fchomo/node.js:691 -#: htdocs/luci-static/resources/view/fchomo/node.js:702 -#: htdocs/luci-static/resources/view/fchomo/node.js:707 -#: htdocs/luci-static/resources/view/fchomo/server.js:462 -#: htdocs/luci-static/resources/view/fchomo/server.js:473 -#: htdocs/luci-static/resources/view/fchomo/server.js:478 +#: htdocs/luci-static/resources/view/fchomo/node.js:710 +#: htdocs/luci-static/resources/view/fchomo/node.js:721 +#: htdocs/luci-static/resources/view/fchomo/node.js:726 +#: htdocs/luci-static/resources/view/fchomo/server.js:474 +#: htdocs/luci-static/resources/view/fchomo/server.js:485 +#: htdocs/luci-static/resources/view/fchomo/server.js:490 msgid "WebSocket" msgstr "" @@ -2706,135 +2799,157 @@ msgstr "" msgid "When used as a server, HomeProxy is a better choice." msgstr "用作服務端時,HomeProxy 是更好的選擇。" -#: htdocs/luci-static/resources/view/fchomo/global.js:775 +#: htdocs/luci-static/resources/view/fchomo/global.js:765 msgid "White list" msgstr "白名單" -#: htdocs/luci-static/resources/fchomo.js:161 +#: htdocs/luci-static/resources/fchomo.js:167 msgid "WireGuard" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:432 +#: htdocs/luci-static/resources/view/fchomo/node.js:446 msgid "WireGuard peer public key." msgstr "WireGuard 對端公鑰。" -#: htdocs/luci-static/resources/view/fchomo/node.js:439 +#: htdocs/luci-static/resources/view/fchomo/node.js:453 msgid "WireGuard pre-shared key." msgstr "WireGuard 預先共用金鑰。" -#: htdocs/luci-static/resources/view/fchomo/node.js:424 +#: htdocs/luci-static/resources/view/fchomo/node.js:438 msgid "WireGuard requires base64-encoded private keys." msgstr "WireGuard 要求 base64 編碼的私鑰。" -#: htdocs/luci-static/resources/view/fchomo/node.js:405 +#: htdocs/luci-static/resources/fchomo.js:1209 +msgid "XOR mode" +msgstr "XOR 模式" + +#: htdocs/luci-static/resources/view/fchomo/node.js:419 msgid "Xudp (Xray-core)" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:279 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:287 msgid "Yaml text" msgstr "Yaml 格式文本" -#: htdocs/luci-static/resources/fchomo.js:43 +#: htdocs/luci-static/resources/fchomo.js:41 msgid "YouTube" msgstr "YouTube" -#: htdocs/luci-static/resources/fchomo.js:1364 +#: htdocs/luci-static/resources/fchomo.js:1768 msgid "Your %s was successfully uploaded. Size: %sB." msgstr "您的 %s 已成功上傳。大小:%sB。" -#: htdocs/luci-static/resources/fchomo.js:262 -#: htdocs/luci-static/resources/fchomo.js:287 -#: htdocs/luci-static/resources/view/fchomo/node.js:385 +#: htdocs/luci-static/resources/fchomo.js:270 +#: htdocs/luci-static/resources/fchomo.js:295 +#: htdocs/luci-static/resources/view/fchomo/node.js:399 msgid "aes-128-gcm" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:263 +#: htdocs/luci-static/resources/fchomo.js:271 msgid "aes-192-gcm" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:264 -#: htdocs/luci-static/resources/fchomo.js:288 +#: htdocs/luci-static/resources/fchomo.js:272 +#: htdocs/luci-static/resources/fchomo.js:296 msgid "aes-256-gcm" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:382 +#: htdocs/luci-static/resources/view/fchomo/node.js:396 msgid "auto" msgstr "自動" -#: htdocs/luci-static/resources/view/fchomo/node.js:265 -#: htdocs/luci-static/resources/view/fchomo/server.js:190 +#: htdocs/luci-static/resources/view/fchomo/node.js:273 +#: htdocs/luci-static/resources/view/fchomo/server.js:191 msgid "bbr" msgstr "bbr" -#: htdocs/luci-static/resources/view/fchomo/server.js:347 +#: htdocs/luci-static/resources/view/fchomo/server.js:356 msgid "certificate" msgstr "憑證" -#: htdocs/luci-static/resources/fchomo.js:265 -#: htdocs/luci-static/resources/fchomo.js:289 +#: htdocs/luci-static/resources/fchomo.js:273 +#: htdocs/luci-static/resources/fchomo.js:297 msgid "chacha20-ietf-poly1305" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:386 +#: htdocs/luci-static/resources/view/fchomo/node.js:400 msgid "chacha20-poly1305" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:263 -#: htdocs/luci-static/resources/view/fchomo/server.js:188 +#: htdocs/luci-static/resources/view/fchomo/node.js:271 +#: htdocs/luci-static/resources/view/fchomo/server.js:189 msgid "cubic" msgstr "cubic" +#: htdocs/luci-static/resources/fchomo.js:1189 +#: htdocs/luci-static/resources/view/fchomo/server.js:300 +msgid "decryption" +msgstr "decryption" + #: htdocs/luci-static/resources/view/fchomo/global.js:799 msgid "dnsmasq selects upstream on its own. (may affect CDN accuracy)" msgstr "dnsmasq 自行選擇上游服務器。 (可能影響 CDN 準確性)" -#: htdocs/luci-static/resources/view/fchomo/node.js:1152 +#: htdocs/luci-static/resources/view/fchomo/node.js:1171 msgid "down" msgstr "Hysteria 下載速率" -#: htdocs/luci-static/resources/view/fchomo/node.js:690 -#: htdocs/luci-static/resources/view/fchomo/node.js:701 -#: htdocs/luci-static/resources/view/fchomo/node.js:706 -#: htdocs/luci-static/resources/view/fchomo/server.js:461 -#: htdocs/luci-static/resources/view/fchomo/server.js:472 -#: htdocs/luci-static/resources/view/fchomo/server.js:477 +#: htdocs/luci-static/resources/fchomo.js:1194 +#: htdocs/luci-static/resources/view/fchomo/node.js:560 +msgid "encryption" +msgstr "encryption" + +#: htdocs/luci-static/resources/view/fchomo/node.js:709 +#: htdocs/luci-static/resources/view/fchomo/node.js:720 +#: htdocs/luci-static/resources/view/fchomo/node.js:725 +#: htdocs/luci-static/resources/view/fchomo/server.js:473 +#: htdocs/luci-static/resources/view/fchomo/server.js:484 +#: htdocs/luci-static/resources/view/fchomo/server.js:489 msgid "gRPC" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:753 -#: htdocs/luci-static/resources/view/fchomo/server.js:496 +#: htdocs/luci-static/resources/view/fchomo/node.js:772 +#: htdocs/luci-static/resources/view/fchomo/server.js:508 msgid "gRPC service name" msgstr "gRPC 服務名稱" -#: htdocs/luci-static/resources/view/fchomo/global.js:498 +#: htdocs/luci-static/resources/view/fchomo/global.js:496 msgid "gVisor" msgstr "gVisor" -#: htdocs/luci-static/resources/view/fchomo/node.js:790 +#: htdocs/luci-static/resources/view/fchomo/node.js:809 msgid "h2mux" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:57 +#: htdocs/luci-static/resources/fchomo.js:1362 +msgid "least one keypair required" +msgstr "至少需要一對密鑰" + +#: htdocs/luci-static/resources/fchomo.js:55 msgid "metacubexd" msgstr "metacubexd" #: htdocs/luci-static/resources/view/fchomo/client.js:883 #: htdocs/luci-static/resources/view/fchomo/client.js:1122 -#: htdocs/luci-static/resources/view/fchomo/client.js:1209 -#: htdocs/luci-static/resources/view/fchomo/client.js:1327 -#: htdocs/luci-static/resources/view/fchomo/client.js:1549 -#: htdocs/luci-static/resources/view/fchomo/node.js:987 +#: htdocs/luci-static/resources/view/fchomo/client.js:1218 +#: htdocs/luci-static/resources/view/fchomo/client.js:1352 +#: htdocs/luci-static/resources/view/fchomo/client.js:1574 +#: htdocs/luci-static/resources/view/fchomo/node.js:1006 #: htdocs/luci-static/resources/view/fchomo/ruleset.js:228 msgid "mihomo config" msgstr "mihomo 配置" -#: htdocs/luci-static/resources/view/fchomo/node.js:856 -#: htdocs/luci-static/resources/view/fchomo/node.js:1130 +#: htdocs/luci-static/resources/fchomo.js:1035 +msgid "mlkem768x25519plus" +msgstr "" + +#: htdocs/luci-static/resources/view/fchomo/node.js:875 +#: htdocs/luci-static/resources/view/fchomo/node.js:1149 msgid "mpTCP" msgstr "多路徑 TCP (mpTCP)" -#: htdocs/luci-static/resources/view/fchomo/node.js:264 -#: htdocs/luci-static/resources/view/fchomo/server.js:189 +#: htdocs/luci-static/resources/view/fchomo/node.js:272 +#: htdocs/luci-static/resources/view/fchomo/server.js:190 msgid "new_reno" msgstr "new_reno" @@ -2842,18 +2957,18 @@ msgstr "new_reno" msgid "no-resolve" msgstr "no-resolve" -#: htdocs/luci-static/resources/fchomo.js:1147 -#: htdocs/luci-static/resources/fchomo.js:1201 -#: htdocs/luci-static/resources/fchomo.js:1232 +#: htdocs/luci-static/resources/fchomo.js:1551 +#: htdocs/luci-static/resources/fchomo.js:1605 +#: htdocs/luci-static/resources/fchomo.js:1636 msgid "non-empty value" msgstr "非空值" -#: htdocs/luci-static/resources/fchomo.js:260 -#: htdocs/luci-static/resources/view/fchomo/node.js:383 -#: htdocs/luci-static/resources/view/fchomo/node.js:403 -#: htdocs/luci-static/resources/view/fchomo/node.js:476 -#: htdocs/luci-static/resources/view/fchomo/ruleset.js:296 -#: htdocs/luci-static/resources/view/fchomo/server.js:266 +#: htdocs/luci-static/resources/fchomo.js:268 +#: htdocs/luci-static/resources/view/fchomo/node.js:397 +#: htdocs/luci-static/resources/view/fchomo/node.js:417 +#: htdocs/luci-static/resources/view/fchomo/node.js:490 +#: htdocs/luci-static/resources/view/fchomo/ruleset.js:304 +#: htdocs/luci-static/resources/view/fchomo/server.js:267 msgid "none" msgstr "無" @@ -2865,27 +2980,27 @@ msgstr "未找到" msgid "not included \",\"" msgstr "不包含 \",\"" -#: htdocs/luci-static/resources/fchomo.js:175 +#: htdocs/luci-static/resources/fchomo.js:181 msgid "null" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:477 +#: htdocs/luci-static/resources/view/fchomo/node.js:491 msgid "obfs-simple" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:1110 +#: htdocs/luci-static/resources/view/fchomo/node.js:1129 msgid "override.proxy-name" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:404 +#: htdocs/luci-static/resources/view/fchomo/node.js:418 msgid "packet addr (v2ray-core v5+)" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/server.js:362 +#: htdocs/luci-static/resources/view/fchomo/server.js:371 msgid "private key" msgstr "私鑰" -#: htdocs/luci-static/resources/fchomo.js:59 +#: htdocs/luci-static/resources/fchomo.js:57 msgid "razord-meta" msgstr "razord-meta" @@ -2894,7 +3009,7 @@ msgstr "razord-meta" msgid "requires front-end adaptation using the API." msgstr "需要使用 API 的前端適配。" -#: htdocs/luci-static/resources/view/fchomo/node.js:481 +#: htdocs/luci-static/resources/view/fchomo/node.js:495 msgid "restls" msgstr "" @@ -2902,12 +3017,12 @@ msgstr "" msgid "rule-set" msgstr "規則集" -#: htdocs/luci-static/resources/view/fchomo/node.js:480 -#: htdocs/luci-static/resources/view/fchomo/server.js:267 +#: htdocs/luci-static/resources/view/fchomo/node.js:494 +#: htdocs/luci-static/resources/view/fchomo/server.js:268 msgid "shadow-tls" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:788 +#: htdocs/luci-static/resources/view/fchomo/node.js:807 msgid "smux" msgstr "" @@ -2919,97 +3034,111 @@ msgstr "src" msgid "unchecked" msgstr "未檢查" -#: htdocs/luci-static/resources/fchomo.js:337 +#: htdocs/luci-static/resources/fchomo.js:345 msgid "unique UCI identifier" msgstr "獨立 UCI 識別" -#: htdocs/luci-static/resources/fchomo.js:340 +#: htdocs/luci-static/resources/fchomo.js:348 msgid "unique identifier" msgstr "獨立標識" -#: htdocs/luci-static/resources/fchomo.js:1241 +#: htdocs/luci-static/resources/fchomo.js:1645 msgid "unique value" msgstr "獨立值" -#: htdocs/luci-static/resources/view/fchomo/node.js:1146 +#: htdocs/luci-static/resources/view/fchomo/node.js:1165 msgid "up" msgstr "Hysteria 上傳速率" -#: htdocs/luci-static/resources/view/fchomo/node.js:240 -#: htdocs/luci-static/resources/view/fchomo/node.js:284 -#: htdocs/luci-static/resources/view/fchomo/node.js:507 -#: htdocs/luci-static/resources/view/fchomo/node.js:539 -#: htdocs/luci-static/resources/view/fchomo/server.js:285 +#: htdocs/luci-static/resources/view/fchomo/node.js:248 +#: htdocs/luci-static/resources/view/fchomo/node.js:292 +#: htdocs/luci-static/resources/view/fchomo/node.js:521 +#: htdocs/luci-static/resources/view/fchomo/node.js:553 +#: htdocs/luci-static/resources/view/fchomo/server.js:286 msgid "v1" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:241 -#: htdocs/luci-static/resources/view/fchomo/node.js:508 -#: htdocs/luci-static/resources/view/fchomo/node.js:540 -#: htdocs/luci-static/resources/view/fchomo/server.js:286 +#: htdocs/luci-static/resources/view/fchomo/node.js:249 +#: htdocs/luci-static/resources/view/fchomo/node.js:522 +#: htdocs/luci-static/resources/view/fchomo/node.js:554 +#: htdocs/luci-static/resources/view/fchomo/server.js:287 msgid "v2" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:242 -#: htdocs/luci-static/resources/view/fchomo/node.js:509 -#: htdocs/luci-static/resources/view/fchomo/server.js:287 +#: htdocs/luci-static/resources/view/fchomo/node.js:250 +#: htdocs/luci-static/resources/view/fchomo/node.js:523 +#: htdocs/luci-static/resources/view/fchomo/server.js:288 msgid "v3" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:1175 -#: htdocs/luci-static/resources/fchomo.js:1178 +#: htdocs/luci-static/resources/fchomo.js:1579 +#: htdocs/luci-static/resources/fchomo.js:1582 msgid "valid JSON format" msgstr "有效的 JSON 格式" -#: htdocs/luci-static/resources/view/fchomo/node.js:622 +#: htdocs/luci-static/resources/view/fchomo/node.js:641 msgid "valid SHA256 string with %d characters" msgstr "包含 %d 個字元的有效 SHA256 字串" -#: htdocs/luci-static/resources/fchomo.js:1253 -#: htdocs/luci-static/resources/fchomo.js:1256 +#: htdocs/luci-static/resources/fchomo.js:1657 +#: htdocs/luci-static/resources/fchomo.js:1660 msgid "valid URL" msgstr "有效網址" -#: htdocs/luci-static/resources/fchomo.js:1188 +#: htdocs/luci-static/resources/fchomo.js:1592 msgid "valid base64 key with %d characters" msgstr "包含 %d 個字元的有效 base64 金鑰" -#: htdocs/luci-static/resources/fchomo.js:1203 +#: htdocs/luci-static/resources/fchomo.js:1607 msgid "valid key length with %d characters" msgstr "包含 %d 個字元的有效金鑰" -#: htdocs/luci-static/resources/fchomo.js:1157 +#: htdocs/luci-static/resources/fchomo.js:1561 msgid "valid port value" msgstr "有效連接埠值" -#: htdocs/luci-static/resources/fchomo.js:1266 +#: htdocs/luci-static/resources/fchomo.js:1670 msgid "valid uuid" msgstr "有效 uuid" -#: htdocs/luci-static/resources/fchomo.js:266 +#: htdocs/luci-static/resources/fchomo.js:1059 +msgid "vless-mlkem768" +msgstr "" + +#: htdocs/luci-static/resources/fchomo.js:1058 +msgid "vless-x25519" +msgstr "" + +#: htdocs/luci-static/resources/fchomo.js:274 msgid "xchacha20-ietf-poly1305" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:58 +#: htdocs/luci-static/resources/fchomo.js:56 msgid "yacd-meta" msgstr "yacd-meta" -#: htdocs/luci-static/resources/view/fchomo/node.js:789 +#: htdocs/luci-static/resources/view/fchomo/node.js:808 msgid "yamux" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:56 +#: htdocs/luci-static/resources/fchomo.js:54 msgid "zashboard" msgstr "" -#: htdocs/luci-static/resources/view/fchomo/node.js:384 +#: htdocs/luci-static/resources/view/fchomo/node.js:398 msgid "zero" msgstr "" -#: htdocs/luci-static/resources/fchomo.js:982 +#: htdocs/luci-static/resources/fchomo.js:997 msgid "🡇" msgstr "" +#~ msgid "Port range" +#~ msgstr "連接埠範圍" + +#~ msgid "Default" +#~ msgstr "預設" + #~ msgid "%s Provider of type '%s' need to be filled in manually." #~ msgstr "%s 個類型為「%s」的供應商需要手動填寫內容。" diff --git a/small/luci-app-fchomo/root/etc/init.d/fchomo b/small/luci-app-fchomo/root/etc/init.d/fchomo index a854f8c6f7..e15303ae9e 100755 --- a/small/luci-app-fchomo/root/etc/init.d/fchomo +++ b/small/luci-app-fchomo/root/etc/init.d/fchomo @@ -136,7 +136,7 @@ start_service() { # Set ENV variables for Client export SAFE_PATHS="$RUN_DIR$( yq 'with(.tls; .[] |= sub("(/[^/]+$)", "")) - | [.external-ui, .tls.certificate, .tls.private-key] | unique + | [.external-ui, .tls.certificate, .tls.private-key] | unique | map(select(. != null)) | .[] | sub("(^)", ":")' \ "$RUN_DIR/mihomo-c.yaml" | tr -d '\n' )" @@ -342,7 +342,7 @@ start_service() { # Set ENV variables for Server export SAFE_PATHS="$RUN_DIR$( yq '[.listeners[] | select(.certificate // .private-key) | [.certificate, .private-key][]] - | .[] |= sub("(/[^/]+$)", "") | unique + | .[] |= sub("(/[^/]+$)", "") | unique | map(select(. != null)) | .[] | sub("(^)", ":")' \ "$RUN_DIR/mihomo-s.yaml" | tr -d '\n' )" diff --git a/small/luci-app-fchomo/root/etc/uci-defaults/99_luci-app-fchomo-migration b/small/luci-app-fchomo/root/etc/uci-defaults/99_luci-app-fchomo-migration index c16063cc3b..ef9b90990c 100755 --- a/small/luci-app-fchomo/root/etc/uci-defaults/99_luci-app-fchomo-migration +++ b/small/luci-app-fchomo/root/etc/uci-defaults/99_luci-app-fchomo-migration @@ -1,8 +1,10 @@ #!/bin/sh -sed -i 's|^FQDN:$|DOMAIN:|' "/etc/fchomo/resources/direct_list.yaml" -sed -i 's|^FQDN:$|DOMAIN:|' "/etc/fchomo/resources/proxy_list.yaml" +# custom list FQDN: -> DOMAIN: +sed -i 's|^FQDN:$|DOMAIN:|' "/etc/fchomo/resources/direct_list.yaml" 2>/dev/null +sed -i 's|^FQDN:$|DOMAIN:|' "/etc/fchomo/resources/proxy_list.yaml" 2>/dev/null +# default_proxy -> client_enabled and MATCH rule default_proxy=$(uci -q get fchomo.routing.default_proxy) if [ -n "$default_proxy" ]; then uci -q batch <<-EOF >"/dev/null" @@ -14,6 +16,7 @@ if [ -n "$default_proxy" ]; then EOF fi +# routing_tcpport and routing_udpport format: value -> list for option in routing_tcpport routing_udpport; do value=$(uci -q get fchomo.routing.$option) if [ -z "$value" ]; then @@ -35,6 +38,7 @@ for option in routing_tcpport routing_udpport; do fi done +# dns.port -> dns.dns_port dns_port=$(uci -q get fchomo.dns.port) if [ -n "$dns_port" ]; then uci -q batch <<-EOF >"/dev/null" @@ -43,6 +47,9 @@ if [ -n "$dns_port" ]; then EOF fi +# mieru_port_range -> mieru_ports +sed -i 's|^\toption mieru_port_range |\tlist mieru_ports |' /etc/config/fchomo 2>/dev/null + uci commit fchomo exit 0 diff --git a/small/luci-app-fchomo/root/usr/share/fchomo/generate_client.uc b/small/luci-app-fchomo/root/usr/share/fchomo/generate_client.uc index 1b354a4433..287b498314 100644 --- a/small/luci-app-fchomo/root/usr/share/fchomo/generate_client.uc +++ b/small/luci-app-fchomo/root/usr/share/fchomo/generate_client.uc @@ -391,6 +391,7 @@ if (match(proxy_mode, /tun/)) "exclude-interface": [], "udp-timeout": durationToSecond(uci.get(uciconf, uciinbound, 'tun_udp_timeout')) || 300, "endpoint-independent-nat": strToBool(uci.get(uciconf, uciinbound, 'tun_endpoint_independent_nat')), + "disable-icmp-forwarding": (uci.get(uciconf, uciinbound, 'tun_disable_icmp_forwarding') === '0') ? false : true, "auto-detect-interface": true }); /* Inbound END */ @@ -508,7 +509,9 @@ uci.foreach(uciconf, ucinode, (cfg) => { /* Shadowsocks */ /* Mieru */ - "port-range": cfg.mieru_port_range, + ...(isEmpty(cfg.mieru_ports) ? {} : { + port: join(',', cfg.mieru_ports) + }), transport: cfg.mieru_transport, multiplexing: cfg.mieru_multiplexing, "handshake-mode": cfg.mieru_handshake_mode, diff --git a/small/luci-app-fchomo/root/usr/share/fchomo/generate_server.uc b/small/luci-app-fchomo/root/usr/share/fchomo/generate_server.uc index 7a45b15bdc..7bf922648f 100644 --- a/small/luci-app-fchomo/root/usr/share/fchomo/generate_server.uc +++ b/small/luci-app-fchomo/root/usr/share/fchomo/generate_server.uc @@ -33,6 +33,23 @@ function parse_users(cfg) { return users; } + +function parse_vless_encryption(payload, side) { + if (isEmpty(payload)) + return null; + + let content = json(trim(payload)); + + let required = join('.', [ + content.method, + content.xormode, + side === 'server' ? content.ticket : side === 'client' ? content.rtt : null + ]); + + return required + + (isEmpty(content.paddings) ? '' : '.' + join('.', content.paddings)) + // Optional + (isEmpty(content.keypairs) ? '' : '.' + join('.', map(content.keypairs, e => e[side]))); // Required +} /* Config helper END */ /* Main */ @@ -103,7 +120,7 @@ uci.foreach(uciconf, uciserver, (cfg) => { "padding-scheme": cfg.anytls_padding_scheme, /* VMess / VLESS */ - decryption: cfg.vless_decryption, + decryption: cfg.vless_decryption === '1' ? parse_vless_encryption(cfg.vless_encryption_hmpayload, 'server') : null, /* Plugin fields */ ...(cfg.plugin ? { diff --git a/small/luci-app-fchomo/root/usr/share/rpcd/ucode/luci.fchomo b/small/luci-app-fchomo/root/usr/share/rpcd/ucode/luci.fchomo index 38671e95b1..79371a9cb7 100644 --- a/small/luci-app-fchomo/root/usr/share/rpcd/ucode/luci.fchomo +++ b/small/luci-app-fchomo/root/usr/share/rpcd/ucode/luci.fchomo @@ -49,7 +49,7 @@ const methods = { const type = req.args?.type; let result = {}; - const fd = popen('/usr/bin/mihomo generate ' + type + ` ${req.args?.params || ''}`); + const fd = popen('/usr/bin/mihomo generate ' + type + ` ${req.args?.params ?? ''}`); if (fd) { for (let line = fd.read('line'); length(line); line = fd.read('line')) { if (type === 'uuid') diff --git a/small/luci-app-ssr-plus/Makefile b/small/luci-app-ssr-plus/Makefile index 80993d4ccf..69aba9aca3 100644 --- a/small/luci-app-ssr-plus/Makefile +++ b/small/luci-app-ssr-plus/Makefile @@ -40,7 +40,7 @@ LUCI_PKGARCH:=all LUCI_DEPENDS:= \ +coreutils +coreutils-base64 +dns2tcp +dnsmasq-full +@PACKAGE_dnsmasq_full_ipset +ipset +kmod-ipt-nat +jq \ +ip-full +iptables +iptables-mod-tproxy +lua +lua-neturl +libuci-lua +microsocks \ - +tcping +resolveip +shadowsocksr-libev-ssr-check +curl \ + +tcping +resolveip +shadowsocksr-libev-ssr-check +curl +nping \ +PACKAGE_$(PKG_NAME)_INCLUDE_V2ray:curl \ +PACKAGE_$(PKG_NAME)_INCLUDE_V2ray:v2ray-core \ +PACKAGE_$(PKG_NAME)_INCLUDE_Xray:curl \ diff --git a/small/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua b/small/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua index 8906a679eb..4c56e479b1 100644 --- a/small/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua +++ b/small/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua @@ -69,6 +69,10 @@ function act_ping() e.ping = luci.sys.exec(string.format("echo -n $(tcping -q -c 1 -i 1 -t 2 -p %s %s 2>&1 | grep -o 'time=[0-9]*' | awk -F '=' '{print $2}') 2>/dev/null", port, domain)) if (e.ping == "") then e.ping = luci.sys.exec("echo -n $(ping -c 1 -W 1 %q 2>&1 | grep -o 'time=[0-9]*' | awk -F '=' '{print $2}') 2>/dev/null" % domain) + if (e.ping == "") then + -- UDP ping test using nping + e.ping = luci.sys.exec(string.format("echo -n $(nping --udp -c 1 -p %s %s 2>/dev/null | grep -o 'Avg rtt: [0-9.]*ms' | awk '{print $3}' | sed 's/ms//' | head -1) 2>/dev/null", port, domain)) + end end end if (iret == 0) then diff --git a/small/mihomo/Makefile b/small/mihomo/Makefile index c454251be2..dea71616a0 100644 --- a/small/mihomo/Makefile +++ b/small/mihomo/Makefile @@ -5,12 +5,12 @@ include $(TOPDIR)/rules.mk PKG_NAME:=mihomo -PKG_VERSION:=1.19.13 +PKG_VERSION:=1.19.14 PKG_RELEASE:=1 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=https://codeload.github.com/metacubex/mihomo/tar.gz/v$(PKG_VERSION)? -PKG_HASH:=dcbdcfb84bde1d70758247e7f3a4fbd4e4771655d01b23aabbdf3cafcaf749b1 +PKG_HASH:=e1b8ac28978e56422db5a6d303599aea64147fa4e6a6930094b2fbb33c4d5d4d PKG_MAINTAINER:=Anya Lin PKG_LICENSE:=GPL-2.0 diff --git a/small/pdnsd-alt/Makefile b/small/pdnsd-alt/Makefile index 5be1dbd6c6..08c7a723a2 100644 --- a/small/pdnsd-alt/Makefile +++ b/small/pdnsd-alt/Makefile @@ -12,7 +12,7 @@ PKG_SOURCE_PROTO:=git PKG_SOURCE_URL:=https://github.com/shadowsocks/pdnsd.git PKG_SOURCE_DATE:=2012-04-26 PKG_SOURCE_VERSION:=a8e46ccba7b0fa2230d6c42ab6dcd92926f6c21d -PKG_MIRROR_HASH:=e3e9c56cf91b12d8db73def2c247be2f726a052bed012f7a1e48946375f8e478 +PKG_MIRROR_HASH:=e493bb71875dafe6f3f0a870c7f27c13631e78151dc65e6384c989d286ea698d PKG_BUILD_PARALLEL:=1 PKG_INSTALL:=1 @@ -55,3 +55,4 @@ define Package/pdnsd-alt/install endef $(eval $(call BuildPackage,pdnsd-alt)) + diff --git a/small/shadow-tls/Makefile b/small/shadow-tls/Makefile index e17cf122c8..2b70c4e5b8 100644 --- a/small/shadow-tls/Makefile +++ b/small/shadow-tls/Makefile @@ -66,4 +66,4 @@ define Package/shadow-tls/install $(INSTALL_BIN) $(DL_DIR)/$(PKG_ARCH) $(1)/usr/bin/shadow-tls endef -$(eval $(call BuildPackage,shadow-tls)) \ No newline at end of file +$(eval $(call BuildPackage,shadow-tls)) diff --git a/v2rayn/v2rayN/Directory.Packages.props b/v2rayn/v2rayN/Directory.Packages.props index 283e95a6e8..2448411202 100644 --- a/v2rayn/v2rayN/Directory.Packages.props +++ b/v2rayn/v2rayN/Directory.Packages.props @@ -20,7 +20,7 @@ - + diff --git a/v2rayn/v2rayN/ServiceLib/Enums/EViewAction.cs b/v2rayn/v2rayN/ServiceLib/Enums/EViewAction.cs index 2c47d31d27..075439fd90 100644 --- a/v2rayn/v2rayN/ServiceLib/Enums/EViewAction.cs +++ b/v2rayn/v2rayN/ServiceLib/Enums/EViewAction.cs @@ -12,7 +12,6 @@ public enum EViewAction ProfilesFocus, ShareSub, ShareServer, - ShowHideWindow, ScanScreenTask, ScanImageTask, BrowseServer, diff --git a/v2rayn/v2rayN/ServiceLib/Handler/AppEvents.cs b/v2rayn/v2rayN/ServiceLib/Handler/AppEvents.cs index a4c2917de9..bda78922e3 100644 --- a/v2rayn/v2rayN/ServiceLib/Handler/AppEvents.cs +++ b/v2rayn/v2rayN/ServiceLib/Handler/AppEvents.cs @@ -5,6 +5,12 @@ namespace ServiceLib.Handler; public static class AppEvents { + public static readonly Subject ReloadRequested = new(); + public static readonly Subject ShowHideWindowRequested = new(); + public static readonly Subject AddServerViaScanRequested = new(); + public static readonly Subject AddServerViaClipboardRequested = new(); + public static readonly Subject SubscriptionsUpdateRequested = new(); + public static readonly Subject ProfilesRefreshRequested = new(); public static readonly Subject SubscriptionsRefreshRequested = new(); public static readonly Subject ProxiesReloadRequested = new(); diff --git a/v2rayn/v2rayN/ServiceLib/Manager/AppManager.cs b/v2rayn/v2rayN/ServiceLib/Manager/AppManager.cs index 3312528928..57238b15b7 100644 --- a/v2rayn/v2rayN/ServiceLib/Manager/AppManager.cs +++ b/v2rayn/v2rayN/ServiceLib/Manager/AppManager.cs @@ -122,6 +122,12 @@ public sealed class AppManager AppEvents.ShutdownRequested.OnNext(byUser); } + public async Task RebootAsAdmin() + { + ProcUtils.RebootAsAdmin(); + await AppManager.Instance.AppExitAsync(true); + } + #endregion App #region Config diff --git a/v2rayn/v2rayN/ServiceLib/ServiceLib.csproj b/v2rayn/v2rayN/ServiceLib/ServiceLib.csproj index 7ee72196db..457b065da4 100644 --- a/v2rayn/v2rayN/ServiceLib/ServiceLib.csproj +++ b/v2rayn/v2rayN/ServiceLib/ServiceLib.csproj @@ -11,7 +11,7 @@ - + diff --git a/v2rayn/v2rayN/ServiceLib/Services/CoreConfig/CoreConfigClashService.cs b/v2rayn/v2rayN/ServiceLib/Services/CoreConfig/CoreConfigClashService.cs index e102f17d2a..b9fcc12636 100644 --- a/v2rayn/v2rayN/ServiceLib/Services/CoreConfig/CoreConfigClashService.cs +++ b/v2rayn/v2rayN/ServiceLib/Services/CoreConfig/CoreConfigClashService.cs @@ -79,6 +79,7 @@ public class CoreConfigClashService //external-controller fileContent["external-controller"] = $"{Global.Loopback}:{AppManager.Instance.StatePort2}"; + fileContent.Remove("secret"); //allow-lan if (_config.Inbound.First().AllowLANConn) { diff --git a/v2rayn/v2rayN/ServiceLib/ViewModels/CheckUpdateViewModel.cs b/v2rayn/v2rayN/ServiceLib/ViewModels/CheckUpdateViewModel.cs index 5ec1f80b57..171cb4676f 100644 --- a/v2rayn/v2rayN/ServiceLib/ViewModels/CheckUpdateViewModel.cs +++ b/v2rayn/v2rayN/ServiceLib/ViewModels/CheckUpdateViewModel.cs @@ -2,11 +2,9 @@ using System.Reactive; using System.Reactive.Disposables; using System.Reactive.Linq; using System.Runtime.InteropServices; -using DynamicData; using DynamicData.Binding; using ReactiveUI; using ReactiveUI.Fody.Helpers; -using Splat; namespace ServiceLib.ViewModels; @@ -225,11 +223,11 @@ public class CheckUpdateViewModel : MyReactiveObject { if (blReload) { - Locator.Current.GetService()?.Reload(); + AppEvents.ReloadRequested.OnNext(Unit.Default); } else { - Locator.Current.GetService()?.CloseCore(); + await CoreManager.Instance.CoreStop(); } } diff --git a/v2rayn/v2rayN/ServiceLib/ViewModels/MainWindowViewModel.cs b/v2rayn/v2rayN/ServiceLib/ViewModels/MainWindowViewModel.cs index 3492670c50..ba5de790ac 100644 --- a/v2rayn/v2rayN/ServiceLib/ViewModels/MainWindowViewModel.cs +++ b/v2rayn/v2rayN/ServiceLib/ViewModels/MainWindowViewModel.cs @@ -1,5 +1,6 @@ using System.Reactive; using System.Reactive.Concurrency; +using System.Reactive.Linq; using ReactiveUI; using ReactiveUI.Fody.Helpers; @@ -183,7 +184,7 @@ public class MainWindowViewModel : MyReactiveObject }); RebootAsAdminCmd = ReactiveCommand.CreateFromTask(async () => { - await RebootAsAdmin(); + await AppManager.Instance.RebootAsAdmin(); }); ClearServerStatisticsCmd = ReactiveCommand.CreateFromTask(async () => { @@ -216,6 +217,30 @@ public class MainWindowViewModel : MyReactiveObject #endregion WhenAnyValue && ReactiveCommand + #region AppEvents + + AppEvents.ReloadRequested + .AsObservable() + .ObserveOn(RxApp.MainThreadScheduler) + .Subscribe(async _ => await Reload()); + + AppEvents.AddServerViaScanRequested + .AsObservable() + .ObserveOn(RxApp.MainThreadScheduler) + .Subscribe(async _ => await AddServerViaScanAsync()); + + AppEvents.AddServerViaClipboardRequested + .AsObservable() + .ObserveOn(RxApp.MainThreadScheduler) + .Subscribe(async _ => await AddServerViaClipboardAsync(null)); + + AppEvents.SubscriptionsUpdateRequested + .AsObservable() + .ObserveOn(RxApp.MainThreadScheduler) + .Subscribe(async blProxy => await UpdateSubscriptionProcess("", blProxy)); + + #endregion AppEvents + _ = Init(); } @@ -281,11 +306,6 @@ public class MainWindowViewModel : MyReactiveObject AppEvents.DispatcherStatisticsRequested.OnNext(update); } - public void ShowHideWindow(bool? blShow) - { - _updateView?.Invoke(EViewAction.ShowHideWindow, blShow); - } - #endregion Actions #region Servers && Groups @@ -465,12 +485,6 @@ public class MainWindowViewModel : MyReactiveObject } } - public async Task RebootAsAdmin() - { - ProcUtils.RebootAsAdmin(); - await AppManager.Instance.AppExitAsync(true); - } - private async Task ClearServerStatistics() { await StatisticsManager.Instance.ClearAllServerStatistics(); @@ -547,17 +561,11 @@ public class MainWindowViewModel : MyReactiveObject await CoreManager.Instance.LoadCore(node); } - public async Task CloseCore() - { - await ConfigHandler.SaveConfig(_config); - await CoreManager.Instance.CoreStop(); - } - private async Task AutoHideStartup() { if (_config.UiItem.AutoHideStartup) { - ShowHideWindow(false); + AppEvents.ShowHideWindowRequested.OnNext(false); } await Task.CompletedTask; } diff --git a/v2rayn/v2rayN/ServiceLib/ViewModels/ProfilesViewModel.cs b/v2rayn/v2rayN/ServiceLib/ViewModels/ProfilesViewModel.cs index 87e1d78f03..fcf3450d89 100644 --- a/v2rayn/v2rayN/ServiceLib/ViewModels/ProfilesViewModel.cs +++ b/v2rayn/v2rayN/ServiceLib/ViewModels/ProfilesViewModel.cs @@ -6,7 +6,6 @@ using DynamicData; using DynamicData.Binding; using ReactiveUI; using ReactiveUI.Fody.Helpers; -using Splat; namespace ServiceLib.ViewModels; @@ -276,7 +275,7 @@ public class ProfilesViewModel : MyReactiveObject private void Reload() { - Locator.Current.GetService()?.Reload(); + AppEvents.ReloadRequested.OnNext(Unit.Default); } public async Task SetSpeedTestResult(SpeedTestResult result) diff --git a/v2rayn/v2rayN/ServiceLib/ViewModels/StatusBarViewModel.cs b/v2rayn/v2rayN/ServiceLib/ViewModels/StatusBarViewModel.cs index ee66351c54..6dc795efbe 100644 --- a/v2rayn/v2rayN/ServiceLib/ViewModels/StatusBarViewModel.cs +++ b/v2rayn/v2rayN/ServiceLib/ViewModels/StatusBarViewModel.cs @@ -5,7 +5,6 @@ using System.Text; using DynamicData.Binding; using ReactiveUI; using ReactiveUI.Fody.Helpers; -using Splat; namespace ServiceLib.ViewModels; @@ -149,17 +148,17 @@ public class StatusBarViewModel : MyReactiveObject NotifyLeftClickCmd = ReactiveCommand.CreateFromTask(async () => { - Locator.Current.GetService()?.ShowHideWindow(null); + AppEvents.ShowHideWindowRequested.OnNext(null); await Task.CompletedTask; }); ShowWindowCmd = ReactiveCommand.CreateFromTask(async () => { - Locator.Current.GetService()?.ShowHideWindow(true); + AppEvents.ShowHideWindowRequested.OnNext(true); await Task.CompletedTask; }); HideWindowCmd = ReactiveCommand.CreateFromTask(async () => { - Locator.Current.GetService()?.ShowHideWindow(false); + AppEvents.ShowHideWindowRequested.OnNext(false); await Task.CompletedTask; }); @@ -275,23 +274,20 @@ public class StatusBarViewModel : MyReactiveObject private async Task AddServerViaClipboard() { - var service = Locator.Current.GetService(); - if (service != null) - await service.AddServerViaClipboardAsync(null); + AppEvents.AddServerViaClipboardRequested.OnNext(Unit.Default); + await Task.Delay(1000); } private async Task AddServerViaScan() { - var service = Locator.Current.GetService(); - if (service != null) - await service.AddServerViaScanAsync(); + AppEvents.AddServerViaScanRequested.OnNext(Unit.Default); + await Task.Delay(1000); } private async Task UpdateSubscriptionProcess(bool blProxy) { - var service = Locator.Current.GetService(); - if (service != null) - await service.UpdateSubscriptionProcess("", blProxy); + AppEvents.SubscriptionsUpdateRequested.OnNext(blProxy); + await Task.Delay(1000); } private async Task RefreshServersBiz() @@ -453,7 +449,7 @@ public class StatusBarViewModel : MyReactiveObject if (await ConfigHandler.SetDefaultRouting(_config, item) == 0) { NoticeManager.Instance.SendMessageEx(ResUI.TipChangeRouting); - Locator.Current.GetService()?.Reload(); + AppEvents.ReloadRequested.OnNext(Unit.Default); _updateView?.Invoke(EViewAction.DispatcherRefreshIcon, null); } } @@ -486,7 +482,7 @@ public class StatusBarViewModel : MyReactiveObject if (Utils.IsWindows()) { _config.TunModeItem.EnableTun = false; - Locator.Current.GetService()?.RebootAsAdmin(); + await AppManager.Instance.RebootAsAdmin(); return; } else @@ -500,7 +496,7 @@ public class StatusBarViewModel : MyReactiveObject } } await ConfigHandler.SaveConfig(_config); - Locator.Current.GetService()?.Reload(); + AppEvents.ReloadRequested.OnNext(Unit.Default); } private bool AllowEnableTun() diff --git a/v2rayn/v2rayN/v2rayN.Desktop/App.axaml.cs b/v2rayn/v2rayN/v2rayN.Desktop/App.axaml.cs index 515354d516..fa4779cf3c 100644 --- a/v2rayn/v2rayN/v2rayN.Desktop/App.axaml.cs +++ b/v2rayn/v2rayN/v2rayN.Desktop/App.axaml.cs @@ -1,8 +1,7 @@ +using System.Reactive; using Avalonia; using Avalonia.Controls.ApplicationLifetimes; using Avalonia.Markup.Xaml; -using Splat; -using v2rayN.Desktop.Common; using v2rayN.Desktop.Views; namespace v2rayN.Desktop; @@ -55,16 +54,8 @@ public partial class App : Application { if (desktop.MainWindow != null) { - var clipboardData = await AvaUtils.GetClipboardData(desktop.MainWindow); - if (clipboardData.IsNullOrEmpty()) - { - return; - } - var service = Locator.Current.GetService(); - if (service != null) - { - _ = service.AddServerViaClipboardAsync(clipboardData); - } + AppEvents.AddServerViaClipboardRequested.OnNext(Unit.Default); + await Task.Delay(1000); } } } diff --git a/v2rayn/v2rayN/v2rayN.Desktop/Views/MainWindow.axaml.cs b/v2rayn/v2rayN/v2rayN.Desktop/Views/MainWindow.axaml.cs index eb884e4be9..86bd5d7b08 100644 --- a/v2rayn/v2rayN/v2rayN.Desktop/Views/MainWindow.axaml.cs +++ b/v2rayn/v2rayN/v2rayN.Desktop/Views/MainWindow.axaml.cs @@ -10,7 +10,6 @@ using Avalonia.Threading; using DialogHostAvalonia; using MsBox.Avalonia.Enums; using ReactiveUI; -using Splat; using v2rayN.Desktop.Base; using v2rayN.Desktop.Common; using v2rayN.Desktop.Manager; @@ -40,7 +39,6 @@ public partial class MainWindow : WindowBase menuClose.Click += MenuClose_Click; ViewModel = new MainWindowViewModel(UpdateViewHandler); - Locator.CurrentMutable.RegisterLazySingleton(() => ViewModel, typeof(MainWindowViewModel)); switch (_config.UiItem.MainGirdOrientation) { @@ -153,6 +151,12 @@ public partial class MainWindow : WindowBase .ObserveOn(RxApp.MainThreadScheduler) .Subscribe(content => Shutdown(content)) .DisposeWith(disposables); + + AppEvents.ShowHideWindowRequested + .AsObservable() + .ObserveOn(RxApp.MainThreadScheduler) + .Subscribe(blShow => ShowHideWindow(blShow)) + .DisposeWith(disposables); }); if (Utils.IsWindows()) @@ -221,12 +225,6 @@ public partial class MainWindow : WindowBase case EViewAction.SubSettingWindow: return await new SubSettingWindow().ShowDialog(this); - case EViewAction.ShowHideWindow: - Dispatcher.UIThread.Post(() => - ShowHideWindow((bool?)obj), - DispatcherPriority.Default); - break; - case EViewAction.ScanScreenTask: await ScanScreenTaskAsync(); break; @@ -236,11 +234,7 @@ public partial class MainWindow : WindowBase break; case EViewAction.AddServerViaClipboard: - var clipboardData = await AvaUtils.GetClipboardData(this); - if (clipboardData.IsNotEmpty() && ViewModel != null) - { - await ViewModel.AddServerViaClipboardAsync(clipboardData); - } + await AddServerViaClipboardAsync(); break; } @@ -295,11 +289,7 @@ public partial class MainWindow : WindowBase switch (e.Key) { case Key.V: - var clipboardData = await AvaUtils.GetClipboardData(this); - if (clipboardData.IsNotEmpty() && ViewModel != null) - { - await ViewModel.AddServerViaClipboardAsync(clipboardData); - } + await AddServerViaClipboardAsync(); break; case Key.S: @@ -326,6 +316,15 @@ public partial class MainWindow : WindowBase ProcUtils.ProcessStart(Utils.GetBinPath("EnableLoopback.exe")); } + public async Task AddServerViaClipboardAsync() + { + var clipboardData = await AvaUtils.GetClipboardData(this); + if (clipboardData.IsNotEmpty() && ViewModel != null) + { + await ViewModel.AddServerViaClipboardAsync(clipboardData); + } + } + public async Task ScanScreenTaskAsync() { //ShowHideWindow(false); diff --git a/v2rayn/v2rayN/v2rayN/Views/MainWindow.xaml.cs b/v2rayn/v2rayN/v2rayN/Views/MainWindow.xaml.cs index 28073be80b..1d0d530c91 100644 --- a/v2rayn/v2rayN/v2rayN/Views/MainWindow.xaml.cs +++ b/v2rayn/v2rayN/v2rayN/Views/MainWindow.xaml.cs @@ -6,10 +6,8 @@ using System.Windows.Controls; using System.Windows.Input; using System.Windows.Interop; using System.Windows.Media; -using System.Windows.Threading; using MaterialDesignThemes.Wpf; using ReactiveUI; -using Splat; using v2rayN.Manager; namespace v2rayN.Views; @@ -37,7 +35,6 @@ public partial class MainWindow menuBackupAndRestore.Click += MenuBackupAndRestore_Click; ViewModel = new MainWindowViewModel(UpdateViewHandler); - Locator.CurrentMutable.RegisterLazySingleton(() => ViewModel, typeof(MainWindowViewModel)); switch (_config.UiItem.MainGirdOrientation) { @@ -146,10 +143,16 @@ public partial class MainWindow .DisposeWith(disposables); AppEvents.ShutdownRequested - .AsObservable() - .ObserveOn(RxApp.MainThreadScheduler) - .Subscribe(content => Shutdown(content)) - .DisposeWith(disposables); + .AsObservable() + .ObserveOn(RxApp.MainThreadScheduler) + .Subscribe(content => Shutdown(content)) + .DisposeWith(disposables); + + AppEvents.ShowHideWindowRequested + .AsObservable() + .ObserveOn(RxApp.MainThreadScheduler) + .Subscribe(blShow => ShowHideWindow(blShow)) + .DisposeWith(disposables); }); this.Title = $"{Utils.GetVersion()} - {(Utils.IsAdministrator() ? ResUI.RunAsAdmin : ResUI.NotRunAsAdmin)}"; @@ -210,13 +213,6 @@ public partial class MainWindow case EViewAction.SubSettingWindow: return (new SubSettingWindow().ShowDialog() ?? false); - case EViewAction.ShowHideWindow: - Application.Current?.Dispatcher.Invoke((() => - { - ShowHideWindow((bool?)obj); - }), DispatcherPriority.Normal); - break; - case EViewAction.ScanScreenTask: await ScanScreenTaskAsync(); break; @@ -226,11 +222,7 @@ public partial class MainWindow break; case EViewAction.AddServerViaClipboard: - var clipboardData = WindowsUtils.GetClipboardData(); - if (clipboardData.IsNotEmpty()) - { - ViewModel?.AddServerViaClipboardAsync(clipboardData); - } + await AddServerViaClipboardAsync(); break; } @@ -283,12 +275,7 @@ public partial class MainWindow { return; } - - var clipboardData = WindowsUtils.GetClipboardData(); - if (clipboardData.IsNotEmpty()) - { - ViewModel?.AddServerViaClipboardAsync(clipboardData); - } + AddServerViaClipboardAsync().ContinueWith(_ => { }); break; @@ -322,6 +309,15 @@ public partial class MainWindow ProcUtils.ProcessStart(Utils.GetBinPath("EnableLoopback.exe")); } + public async Task AddServerViaClipboardAsync() + { + var clipboardData = WindowsUtils.GetClipboardData(); + if (clipboardData.IsNotEmpty() && ViewModel != null) + { + await ViewModel.AddServerViaClipboardAsync(clipboardData); + } + } + private async Task ScanScreenTaskAsync() { ShowHideWindow(false);