update 2022-06-14 23:43:36

This commit is contained in:
github-actions[bot]
2022-06-14 23:43:36 +08:00
parent dea7f1824c
commit 51f41d9b55
6 changed files with 207 additions and 66 deletions

View File

@@ -186,6 +186,7 @@ o:value("vmess", translate("VMess"))
o:value("trojan", translate("Trojan")) o:value("trojan", translate("Trojan"))
o:value("shadowsocks", translate("Shadowsocks")) o:value("shadowsocks", translate("Shadowsocks"))
if is_installed("sagernet-core") then if is_installed("sagernet-core") then
o:value("shadowsocksr", translate("ShadowsocksR"))
o:value("wireguard", translate("WireGuard")) o:value("wireguard", translate("WireGuard"))
end end
o:value("socks", translate("Socks")) o:value("socks", translate("Socks"))
@@ -237,8 +238,9 @@ o:depends("type", "trojan")
o:depends("type", "naiveproxy") o:depends("type", "naiveproxy")
o:depends({type = "socks5", auth_enable = true}) o:depends({type = "socks5", auth_enable = true})
o:depends({type = "v2ray", v2ray_protocol = "http", auth_enable = true}) o:depends({type = "v2ray", v2ray_protocol = "http", auth_enable = true})
o:depends({type = "v2ray", v2ray_protocol = "socks", auth_enable = true}) o:depends({type = "v2ray", v2ray_protocol = "socks", socks_ver = "5", auth_enable = true})
o:depends({type = "v2ray", v2ray_protocol = "shadowsocks"}) o:depends({type = "v2ray", v2ray_protocol = "shadowsocks"})
o:depends({type = "v2ray", v2ray_protocol = "shadowsocksr"})
o:depends({type = "v2ray", v2ray_protocol = "trojan"}) o:depends({type = "v2ray", v2ray_protocol = "trojan"})
o = s:option(ListValue, "encrypt_method", translate("Encrypt Method")) o = s:option(ListValue, "encrypt_method", translate("Encrypt Method"))
@@ -247,6 +249,7 @@ for _, v in ipairs(encrypt_methods) do
end end
o.rmempty = true o.rmempty = true
o:depends("type", "ssr") o:depends("type", "ssr")
o:depends({type = "v2ray", v2ray_protocol = "shadowsocksr"})
o = s:option(ListValue, "encrypt_method_ss", translate("Encrypt Method")) o = s:option(ListValue, "encrypt_method_ss", translate("Encrypt Method"))
for _, v in ipairs(encrypt_methods_ss) do for _, v in ipairs(encrypt_methods_ss) do
@@ -270,7 +273,7 @@ o.default = "1"
-- Shadowsocks Plugin -- Shadowsocks Plugin
o = s:option(Value, "plugin", translate("Obfs")) o = s:option(Value, "plugin", translate("Obfs"))
o:value("none", translate("None")) o:value("none", translate("None"))
if is_finded("obfs-local") then if is_finded("obfs-local") or is_installed("sagernet-core") then
o:value("obfs-local", translate("obfs-local")) o:value("obfs-local", translate("obfs-local"))
end end
if is_finded("v2ray-plugin") or is_installed("sagernet-core") then if is_finded("v2ray-plugin") or is_installed("sagernet-core") then
@@ -281,12 +284,16 @@ if is_finded("xray-plugin") then
end end
o.rmempty = true o.rmempty = true
o:depends("type", "ss") o:depends("type", "ss")
o:depends({type = "v2ray", v2ray_protocol = "shadowsocks"}) if is_installed("sagernet-core") then
o:depends({type = "v2ray", v2ray_protocol = "shadowsocks"})
end
o = s:option(Value, "plugin_opts", translate("Plugin Opts")) o = s:option(Value, "plugin_opts", translate("Plugin Opts"))
o.rmempty = true o.rmempty = true
o:depends("type", "ss") o:depends("type", "ss")
o:depends({type = "v2ray", v2ray_protocol = "shadowsocks"}) if is_installed("sagernet-core") then
o:depends({type = "v2ray", v2ray_protocol = "shadowsocks"})
end
o = s:option(ListValue, "protocol", translate("Protocol")) o = s:option(ListValue, "protocol", translate("Protocol"))
for _, v in ipairs(protocol) do for _, v in ipairs(protocol) do
@@ -294,9 +301,11 @@ for _, v in ipairs(protocol) do
end end
o.rmempty = true o.rmempty = true
o:depends("type", "ssr") o:depends("type", "ssr")
o:depends({type = "v2ray", v2ray_protocol = "shadowsocksr"})
o = s:option(Value, "protocol_param", translate("Protocol param (optional)")) o = s:option(Value, "protocol_param", translate("Protocol param (optional)"))
o:depends("type", "ssr") o:depends("type", "ssr")
o:depends({type = "v2ray", v2ray_protocol = "shadowsocksr"})
o = s:option(ListValue, "obfs", translate("Obfs")) o = s:option(ListValue, "obfs", translate("Obfs"))
for _, v in ipairs(obfs) do for _, v in ipairs(obfs) do
@@ -304,9 +313,11 @@ for _, v in ipairs(obfs) do
end end
o.rmempty = true o.rmempty = true
o:depends("type", "ssr") o:depends("type", "ssr")
o:depends({type = "v2ray", v2ray_protocol = "shadowsocksr"})
o = s:option(Value, "obfs_param", translate("Obfs param (optional)")) o = s:option(Value, "obfs_param", translate("Obfs param (optional)"))
o:depends("type", "ssr") o:depends("type", "ssr")
o:depends({type = "v2ray", v2ray_protocol = "shadowsocksr"})
-- [[ Hysteria ]]-- -- [[ Hysteria ]]--
o = s:option(ListValue, "hysteria_protocol", translate("Protocol")) o = s:option(ListValue, "hysteria_protocol", translate("Protocol"))
@@ -364,6 +375,15 @@ end
o.rmempty = true o.rmempty = true
o:depends({type = "v2ray", v2ray_protocol = "vmess"}) o:depends({type = "v2ray", v2ray_protocol = "vmess"})
-- SOCKS Version
o = s:option(ListValue, "socks_ver", translate("Socks Version"))
o:value("4", "Socks4")
o:value("4a", "Socks4A")
o:value("5", "Socks5")
o.rmempty = true
o.default = "5"
o:depends({type = "v2ray", v2ray_protocol = "socks"})
-- 传输协议 -- 传输协议
o = s:option(ListValue, "transport", translate("Transport")) o = s:option(ListValue, "transport", translate("Transport"))
o:value("tcp", "TCP") o:value("tcp", "TCP")
@@ -410,18 +430,20 @@ o = s:option(Value, "ws_path", translate("WebSocket Path"))
o:depends("transport", "ws") o:depends("transport", "ws")
o.rmempty = true o.rmempty = true
-- WS前置数据 if is_finded("v2ray") then
o = s:option(Value, "ws_ed", translate("Max Early Data")) -- WS前置数据
o:depends("transport", "ws") o = s:option(Value, "ws_ed", translate("Max Early Data"))
o.datatype = "uinteger" o:depends("transport", "ws")
o.default = 2048 o.datatype = "uinteger"
o.rmempty = true o.default = 2048
o.rmempty = true
-- WS前置数据标头 -- WS前置数据标头
o = s:option(Value, "ws_ed_header", translate("Early Data Header Name")) o = s:option(Value, "ws_ed_header", translate("Early Data Header Name"))
o:depends("transport", "ws") o:depends("transport", "ws")
o.default = "Sec-WebSocket-Protocol" o.default = "Sec-WebSocket-Protocol"
o.rmempty = true o.rmempty = true
end
-- [[ H2部分 ]]-- -- [[ H2部分 ]]--
@@ -440,48 +462,52 @@ o = s:option(Value, "serviceName", translate("gRPC Service Name"))
o:depends("transport", "grpc") o:depends("transport", "grpc")
o.rmempty = true o.rmempty = true
-- gPRC模式 if is_installed("sagernet-core") then
o = s:option(ListValue, "grpc_mode", translate("gRPC Mode")) -- gPRC模式
o:depends("transport", "grpc") o = s:option(ListValue, "grpc_mode", translate("gRPC Mode"))
o:value("gun", translate("Gun")) o:depends("transport", "grpc")
o:value("multi", translate("Multi")) o:value("gun", translate("Gun"))
o:value("raw", translate("Raw")) o:value("multi", translate("Multi"))
o.rmempty = true o:value("raw", translate("Raw"))
o.rmempty = true
end
-- gRPC初始窗口 if is_finded("xray") or is_installed("sagernet-core") then
o = s:option(Value, "initial_windows_size", translate("Initial Windows Size")) -- gRPC初始窗口
o.datatype = "uinteger" o = s:option(Value, "initial_windows_size", translate("Initial Windows Size"))
o:depends("transport", "grpc") o.datatype = "uinteger"
o.default = 0 o:depends("transport", "grpc")
o.rmempty = true o.default = 0
o.rmempty = true
-- H2/gRPC健康检查 -- H2/gRPC健康检查
o = s:option(Flag, "health_check", translate("H2/gRPC Health Check")) o = s:option(Flag, "health_check", translate("H2/gRPC Health Check"))
o:depends("transport", "h2") o:depends("transport", "h2")
o:depends("transport", "grpc") o:depends("transport", "grpc")
o.rmempty = true o.rmempty = true
o = s:option(Value, "read_idle_timeout", translate("H2 Read Idle Timeout")) o = s:option(Value, "read_idle_timeout", translate("H2 Read Idle Timeout"))
o.datatype = "uinteger" o.datatype = "uinteger"
o:depends({health_check = true, transport = "h2"}) o:depends({health_check = true, transport = "h2"})
o.default = 60 o.default = 60
o.rmempty = true o.rmempty = true
o = s:option(Value, "idle_timeout", translate("gRPC Idle Timeout")) o = s:option(Value, "idle_timeout", translate("gRPC Idle Timeout"))
o.datatype = "uinteger" o.datatype = "uinteger"
o:depends({health_check = true, transport = "grpc"}) o:depends({health_check = true, transport = "grpc"})
o.default = 60 o.default = 60
o.rmempty = true o.rmempty = true
o = s:option(Value, "health_check_timeout", translate("Health Check Timeout")) o = s:option(Value, "health_check_timeout", translate("Health Check Timeout"))
o.datatype = "uinteger" o.datatype = "uinteger"
o:depends("health_check", 1) o:depends("health_check", 1)
o.default = 20 o.default = 20
o.rmempty = true o.rmempty = true
o = s:option(Flag, "permit_without_stream", translate("Permit Without Stream")) o = s:option(Flag, "permit_without_stream", translate("Permit Without Stream"))
o:depends({health_check = true, transport = "grpc"}) o:depends({health_check = true, transport = "grpc"})
o.rmempty = true o.rmempty = true
end
-- [[ QUIC部分 ]]-- -- [[ QUIC部分 ]]--
o = s:option(ListValue, "quic_security", translate("QUIC Security")) o = s:option(ListValue, "quic_security", translate("QUIC Security"))
@@ -591,7 +617,7 @@ o:depends({type = "v2ray", v2ray_protocol = "vless", xtls = false})
o:depends({type = "v2ray", v2ray_protocol = "vmess", xtls = false}) o:depends({type = "v2ray", v2ray_protocol = "vmess", xtls = false})
o:depends({type = "v2ray", v2ray_protocol = "trojan", xtls = false}) o:depends({type = "v2ray", v2ray_protocol = "trojan", xtls = false})
o:depends({type = "v2ray", v2ray_protocol = "shadowsocks", xtls = false}) o:depends({type = "v2ray", v2ray_protocol = "shadowsocks", xtls = false})
o:depends({type = "v2ray", v2ray_protocol = "socks", xtls = false}) o:depends({type = "v2ray", v2ray_protocol = "socks", socks_ver = "5", xtls = false})
o:depends({type = "v2ray", v2ray_protocol = "http", xtls = false}) o:depends({type = "v2ray", v2ray_protocol = "http", xtls = false})
o:depends("type", "trojan") o:depends("type", "trojan")
@@ -620,15 +646,17 @@ o = s:option(Flag, "tls_sessionTicket", translate("Session Ticket"))
o:depends({type = "trojan", tls = true}) o:depends({type = "trojan", tls = true})
o.default = "0" o.default = "0"
-- [[ uTLS ]]-- if is_finded("xray") then
o = s:option(ListValue, "fingerprint", translate("Finger Print")) -- [[ uTLS ]]--
o:value("disable", translate("disable")) o = s:option(ListValue, "fingerprint", translate("Finger Print"))
o:value("firefox", translate("firefox")) o:value("disable", translate("disable"))
o:value("chrome", translate("chrome")) o:value("firefox", translate("firefox"))
o:value("safari", translate("safari")) o:value("chrome", translate("chrome"))
o:value("randomized", translate("randomized")) o:value("safari", translate("safari"))
o:depends({type = "v2ray", tls = true}) o:value("randomized", translate("randomized"))
o.default = "disable" o:depends({type = "v2ray", tls = true})
o.default = "disable"
end
o = s:option(Value, "tls_host", translate("TLS Host")) o = s:option(Value, "tls_host", translate("TLS Host"))
o.datatype = "hostname" o.datatype = "hostname"

View File

@@ -70,6 +70,9 @@ msgstr "布隆过滤器"
msgid "VLESS Encryption" msgid "VLESS Encryption"
msgstr "VLESS 加密" msgstr "VLESS 加密"
msgid "Socks Version"
msgstr "Socks 版本"
msgid "Flow" msgid "Flow"
msgstr "流控 (Flow)" msgstr "流控 (Flow)"

View File

@@ -32,14 +32,21 @@ function vmess_vless()
end end
function trojan_shadowsocks() function trojan_shadowsocks()
outbound_settings = { outbound_settings = {
plugin = (server.v2ray_protocol == "shadowsocks") and server.plugin ~= "none" and server.plugin or nil, plugin = ((server.v2ray_protocol == "shadowsocks") and server.plugin ~= "none" and server.plugin) or (server.v2ray_protocol == "shadowsocksr" and "shadowsocksr") or nil,
pluginOpts = (server.v2ray_protocol == "shadowsocks") and server.plugin_opts or nil, pluginOpts = (server.v2ray_protocol == "shadowsocks") and server.plugin_opts or nil,
pluginArgs = (server.v2ray_protocol == "shadowsocksr") and {
"--protocol=" .. server.protocol,
"--protocol-param=" .. (server.protocol_param or ""),
"--obfs=" .. server.obfs,
"--obfs-param=" .. (server.obfs_param or "")
} or nil,
servers = { servers = {
{ {
address = server.server, address = server.server,
port = tonumber(server.server_port), port = tonumber(server.server_port),
password = server.password, password = server.password,
method = (server.v2ray_protocol == "shadowsocks") and server.encrypt_method_ss or nil, method = (server.v2ray_protocol == "shadowsocks") and server.encrypt_method_ss or nil,
method = (server.v2ray_protocol == "shadowsocksr") and server.encrypt_method or nil,
uot = (server.v2ray_protocol == "shadowsocks") and (server.uot == '1') or nil, uot = (server.v2ray_protocol == "shadowsocks") and (server.uot == '1') or nil,
ivCheck = (server.v2ray_protocol == "shadowsocks") and (server.ivCheck == '1') or nil, ivCheck = (server.v2ray_protocol == "shadowsocks") and (server.ivCheck == '1') or nil,
flow = (server.v2ray_protocol == "trojan") and (server.xtls == '1') and (server.vless_flow and server.vless_flow or "xtls-rprx-splice") or nil flow = (server.v2ray_protocol == "trojan") and (server.xtls == '1') and (server.vless_flow and server.vless_flow or "xtls-rprx-splice") or nil
@@ -47,7 +54,9 @@ function trojan_shadowsocks()
} }
} }
if (server.v2ray_protocol == "shadowsocks") and (server.mux ~= "1") and (not (outbound_settings.plugin or server.transport ~= "tcp" or server.tls or server.xtls)) then if server.v2ray_protocol == "shadowsocksr" then
server.v2ray_protocol = "shadowsocks"
elseif (server.v2ray_protocol == "shadowsocks") and (server.mux ~= "1") and (not (outbound_settings.plugin or server.transport ~= "tcp" or server.tls or server.xtls)) then
server.v2ray_protocol = "shadowsocks_sing" server.v2ray_protocol = "shadowsocks_sing"
outbound_settings = outbound_settings.servers[1] outbound_settings = outbound_settings.servers[1]
elseif (server.v2ray_protocol == "trojan") and (server.tls and server.mux ~= "1") and (not (server.transport ~= "tcp" or server.xtls)) then elseif (server.v2ray_protocol == "trojan") and (server.tls and server.mux ~= "1") and (not (server.transport ~= "tcp" or server.xtls)) then
@@ -59,6 +68,7 @@ function trojan_shadowsocks()
end end
function socks_http() function socks_http()
outbound_settings = { outbound_settings = {
version = server.socks_ver or nil,
servers = { servers = {
{ {
address = server.server, address = server.server,
@@ -105,6 +115,9 @@ function outbound:handleIndex(index)
shadowsocks = function() shadowsocks = function()
trojan_shadowsocks() trojan_shadowsocks()
end, end,
shadowsocksr = function()
trojan_shadowsocks()
end,
socks = function() socks = function()
socks_http() socks_http()
end, end,

View File

@@ -28,6 +28,7 @@ local filter_words = ucic:get_first(name, 'server_subscribe', 'filter_words', '
local save_words = ucic:get_first(name, 'server_subscribe', 'save_words', '') local save_words = ucic:get_first(name, 'server_subscribe', 'save_words', '')
local packet_encoding = luci.model.ipkg.installed("sagernet-core") and ucic:get_first(name, 'global', 'default_packet_encoding', 'xudp') or nil local packet_encoding = luci.model.ipkg.installed("sagernet-core") and ucic:get_first(name, 'global', 'default_packet_encoding', 'xudp') or nil
local v2_ss = luci.sys.exec('type -t -p ss-redir sslocal') ~= "" and "ss" or "v2ray" local v2_ss = luci.sys.exec('type -t -p ss-redir sslocal') ~= "" and "ss" or "v2ray"
local v2_ssr = luci.sys.exec('type -t -p ssr-redir') ~= "" and "ssr" or "v2ray"
local v2_tj = luci.sys.exec('type -t -p trojan') ~= "" and "trojan" or "v2ray" local v2_tj = luci.sys.exec('type -t -p trojan') ~= "" and "trojan" or "v2ray"
local log = function(...) local log = function(...)
print(os.date("%Y-%m-%d %H:%M:%S ") .. table.concat({...}, " ")) print(os.date("%Y-%m-%d %H:%M:%S ") .. table.concat({...}, " "))
@@ -147,6 +148,8 @@ local function processData(szType, content)
if szType == 'ssr' then if szType == 'ssr' then
local dat = split(content, "/%?") local dat = split(content, "/%?")
local hostInfo = split(dat[1], ':') local hostInfo = split(dat[1], ':')
result.type = v2_ssr
result.v2ray_protocol = (v2_ssr == "v2ray") and "shadowsocksr" or nil
result.server = hostInfo[1] result.server = hostInfo[1]
result.server_port = hostInfo[2] result.server_port = hostInfo[2]
result.protocol = hostInfo[3] result.protocol = hostInfo[3]

View File

@@ -10,9 +10,9 @@ PKG_RELEASE:=1
PKG_SOURCE_PROTO:=git PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL:=https://github.com/SagerNet/v2ray-core.git PKG_SOURCE_URL:=https://github.com/SagerNet/v2ray-core.git
PKG_SOURCE_DATE:=2022-06-10 PKG_SOURCE_DATE:=2022-06-14
PKG_SOURCE_VERSION:=f55a069e73bb1d34ed8bd2a149832fb018a07820 PKG_SOURCE_VERSION:=eb9f1a689e37c9577825165d50d562c2e7747f2a
PKG_MIRROR_HASH:=1eade99c74edfd1b1f0103dbc67d8afedc69f186799af4d7ec99e13b883d82a5 PKG_MIRROR_HASH:=9cc7b4a5b2830ac72510c519f59e83e902347965fcfa57ed7cad0b43dfd80cab
PKG_VERSION:=$(BASE_VERSION)-$(PKG_SOURCE_DATE)-$(call version_abbrev,$(PKG_SOURCE_VERSION)) PKG_VERSION:=$(BASE_VERSION)-$(PKG_SOURCE_DATE)-$(call version_abbrev,$(PKG_SOURCE_VERSION))
PKG_LICENSE:=GPL-3.0-or-later PKG_LICENSE:=GPL-3.0-or-later
@@ -70,6 +70,31 @@ define Package/sagernet-extra/description
This includes extra resources for sagernet-core. This includes extra resources for sagernet-core.
endef endef
LIBCORE_NAME:=LibSagerNetCore
LIBCORE_DATE:=2022-06-10
LIBCORE_VERSION:=9ef7ab1de7604ab959222d4de8ab6152a402e432
LIBCORE_FILE:=$(LIBCORE_NAME)-$(LIBCORE_DATE)-$(call version_abbrev,$(LIBCORE_VERSION)).tar.xz
define Download/libcore
PROTO:=git
URL:=https://github.com/SagerNet/LibSagerNetCore.git
VERSION:=$(LIBCORE_VERSION)
FILE:=$(LIBCORE_FILE)
SUBDIR:=$(LIBCORE_NAME)
MIRROR_HASH:=9420189c45d5fbe682acee1da0b8f727cc5ea8c847ceeff5b026cd71ce60cf0f
endef
define Build/Prepare
$(call Build/Prepare/Default)
xzcat $(DL_DIR)/$(LIBCORE_FILE) | tar -C $(PKG_BUILD_DIR) $(TAR_OPTIONS)
$(CP) $(PKG_BUILD_DIR)/$(LIBCORE_NAME)/{obfs,ssr}.go \
$(PKG_BUILD_DIR)/proxy/shadowsocks/plugin/self/
$(SED) '/plugin\/self/d' -e 's/self.ParsePluginOptions/ParsePluginOptions/g' \
$(PKG_BUILD_DIR)/proxy/shadowsocks/plugin/self/obfs.go
$(SED) 's/package libcore/package self/g' \
$(PKG_BUILD_DIR)/proxy/shadowsocks/plugin/self/{obfs,ssr}.go
endef
define Package/sagernet-core/install define Package/sagernet-core/install
$(call GoPackage/Package/Install/Bin,$(PKG_INSTALL_DIR)) $(call GoPackage/Package/Install/Bin,$(PKG_INSTALL_DIR))
$(INSTALL_DIR) $(1)/usr/bin/ $(INSTALL_DIR) $(1)/usr/bin/
@@ -82,5 +107,6 @@ define Package/sagernet-extra/install
$(CP) $(PKG_BUILD_DIR)/release/extra/* $(1)/usr/share/v2ray/ $(CP) $(PKG_BUILD_DIR)/release/extra/* $(1)/usr/share/v2ray/
endef endef
$(eval $(call Download,libcore))
$(eval $(call BuildPackage,sagernet-core)) $(eval $(call BuildPackage,sagernet-core))
$(eval $(call BuildPackage,sagernet-extra)) $(eval $(call BuildPackage,sagernet-extra))

View File

@@ -0,0 +1,68 @@
go get github.com/Dreamacro/clash/transport/ssr/protocol
go get github.com/Dreamacro/clash/transport/ssr/obfs
go get github.com/Dreamacro/clash/transport/simple-obfs
---
--- a/go.mod
+++ b/go.mod
@@ -3,6 +3,7 @@ module github.com/v2fly/v2ray-core/v5
go 1.18
require (
+ github.com/Dreamacro/clash v1.10.6
github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da
github.com/dgryski/go-camellia v0.0.0-20191119043421-69a8a13fb23d
github.com/dgryski/go-idea v0.0.0-20170306091226-d2fb45a411fb
@@ -50,6 +51,8 @@ replace gvisor.dev/gvisor => github.com/
//replace github.com/sagernet/sing => ../sing
+replace github.com/Dreamacro/clash => github.com/sagernet/clash v1.10.7-0.20220610080510-ac56b2a05ded
+
require (
github.com/aead/cmac v0.0.0-20160719120800-7af84192f0b1 // indirect
github.com/boljen/go-bitmap v0.0.0-20151001105940-23cd2fb0ce7d // indirect
@@ -81,6 +84,7 @@ require (
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/riobard/go-bloom v0.0.0-20200614022211-cdc8013cb5b3 // indirect
github.com/secure-io/siv-go v0.0.0-20180922214919-5ff40651e2c4 // indirect
+ github.com/sirupsen/logrus v1.8.1 // indirect
github.com/xtaci/smux v1.5.16 // indirect
go4.org/intern v0.0.0-20220301175310-a089fc204883 // indirect
go4.org/unsafe/assume-no-moving-gc v0.0.0-20211027215541-db492cf91b37 // indirect
--- a/go.sum
+++ b/go.sum
@@ -355,6 +355,8 @@ github.com/rogpeppe/go-internal v1.8.0/g
github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
+github.com/sagernet/clash v1.10.7-0.20220610080510-ac56b2a05ded h1:iw6tWwLTRXgz65wOH8plV20P42q4UN0pgJyc6pQLLDk=
+github.com/sagernet/clash v1.10.7-0.20220610080510-ac56b2a05ded/go.mod h1:qrmVDeYq4Gr8SiGuxVoA4cc4xhq7TNgnLa76AANNYRA=
github.com/sagernet/gvisor v0.0.0-20220402114650-763d12dc953e h1:Y4avBAtZ59OWvLl6zP9sF62jtMEVRPIH78IQctq9aXQ=
github.com/sagernet/gvisor v0.0.0-20220402114650-763d12dc953e/go.mod h1:tWwEcFvJavs154OdjFCw78axNrsDlz4Zh8jvPqwcpGI=
github.com/sagernet/sing v0.0.0-20220614091938-64835a637bdc h1:AdNTzzSw6SCZI71GB+Am7cr+oUDUrBUaOi17FxDtNMw=
@@ -394,6 +396,8 @@ github.com/shurcooL/sanitized_anchor_nam
github.com/shurcooL/users v0.0.0-20180125191416-49c67e49c537/go.mod h1:QJTqeLYEDaXHZDBsXlPCDqdhQuJkuw4NOtaxYe3xii4=
github.com/shurcooL/webdavfs v0.0.0-20170829043945-18c3829fa133/go.mod h1:hKmq5kWdCj2z2KEozexVbfEZIWiTjhE0+UjmZgPqehw=
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
+github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE=
+github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
@@ -451,6 +455,7 @@ go.opentelemetry.io/proto/otlp v0.7.0/go
go.starlark.net v0.0.0-20220328144851-d1966c6b9fcd h1:Uo/x0Ir5vQJ+683GXB9Ug+4fcjsbp7z7Ul8UaZbhsRM=
go.starlark.net v0.0.0-20220328144851-d1966c6b9fcd/go.mod h1:t3mmBBPzAVvK0L0n1drDmrQsJ8FoIx4INCqVMTr/Zo0=
go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
+go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE=
go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE=
@@ -566,6 +571,7 @@ golang.org/x/sys v0.0.0-20190606165138-5
golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=