diff --git a/cmd/gost/cmd.go b/cmd/gost/cmd.go deleted file mode 100644 index 73f53d5..0000000 --- a/cmd/gost/cmd.go +++ /dev/null @@ -1,611 +0,0 @@ -package main - -import ( - "encoding/base64" - "errors" - "fmt" - "net/url" - "os" - "strconv" - "strings" - "time" - - mdutil "github.com/go-gost/core/metadata/util" - "github.com/go-gost/x/config" - "github.com/go-gost/x/limiter/conn" - "github.com/go-gost/x/limiter/traffic" - mdx "github.com/go-gost/x/metadata" - "github.com/go-gost/x/registry" -) - -var ( - ErrInvalidCmd = errors.New("invalid cmd") - ErrInvalidNode = errors.New("invalid node") -) - -type stringList []string - -func (l *stringList) String() string { - return fmt.Sprintf("%s", *l) -} -func (l *stringList) Set(value string) error { - *l = append(*l, value) - return nil -} - -func buildConfigFromCmd(services, nodes stringList) (*config.Config, error) { - namePrefix := "" - cfg := &config.Config{} - - var chain *config.ChainConfig - if len(nodes) > 0 { - chain = &config.ChainConfig{ - Name: fmt.Sprintf("%schain-0", namePrefix), - } - cfg.Chains = append(cfg.Chains, chain) - } - - for i, node := range nodes { - url, err := normCmd(node) - if err != nil { - return nil, err - } - - nodeConfig, err := buildNodeConfig(url) - if err != nil { - return nil, err - } - nodeConfig.Name = fmt.Sprintf("%snode-0", namePrefix) - - var nodes []*config.NodeConfig - for _, host := range strings.Split(nodeConfig.Addr, ",") { - if host == "" { - continue - } - nodeCfg := &config.NodeConfig{} - *nodeCfg = *nodeConfig - nodeCfg.Name = fmt.Sprintf("%snode-%d", namePrefix, len(nodes)) - nodeCfg.Addr = host - nodes = append(nodes, nodeCfg) - } - - m := map[string]any{} - for k, v := range url.Query() { - if len(v) > 0 { - m[k] = v[0] - } - } - md := mdx.NewMetadata(m) - - hopConfig := &config.HopConfig{ - Name: fmt.Sprintf("%shop-%d", namePrefix, i), - Selector: parseSelector(m), - Nodes: nodes, - Metadata: m, - } - - if v := mdutil.GetString(md, "bypass"); v != "" { - bypassCfg := &config.BypassConfig{ - Name: fmt.Sprintf("%sbypass-%d", namePrefix, len(cfg.Bypasses)), - } - if v[0] == '~' { - bypassCfg.Whitelist = true - v = v[1:] - } - for _, s := range strings.Split(v, ",") { - if s == "" { - continue - } - bypassCfg.Matchers = append(bypassCfg.Matchers, s) - } - hopConfig.Bypass = bypassCfg.Name - cfg.Bypasses = append(cfg.Bypasses, bypassCfg) - delete(m, "bypass") - } - if v := mdutil.GetString(md, "resolver"); v != "" { - resolverCfg := &config.ResolverConfig{ - Name: fmt.Sprintf("%sresolver-%d", namePrefix, len(cfg.Resolvers)), - } - for _, rs := range strings.Split(v, ",") { - if rs == "" { - continue - } - resolverCfg.Nameservers = append( - resolverCfg.Nameservers, - &config.NameserverConfig{ - Addr: rs, - }, - ) - } - hopConfig.Resolver = resolverCfg.Name - cfg.Resolvers = append(cfg.Resolvers, resolverCfg) - delete(m, "resolver") - } - if v := mdutil.GetString(md, "hosts"); v != "" { - hostsCfg := &config.HostsConfig{ - Name: fmt.Sprintf("%shosts-%d", namePrefix, len(cfg.Hosts)), - } - for _, s := range strings.Split(v, ",") { - ss := strings.SplitN(s, ":", 2) - if len(ss) != 2 { - continue - } - hostsCfg.Mappings = append( - hostsCfg.Mappings, - &config.HostMappingConfig{ - Hostname: ss[0], - IP: ss[1], - }, - ) - } - hopConfig.Hosts = hostsCfg.Name - cfg.Hosts = append(cfg.Hosts, hostsCfg) - delete(m, "hosts") - } - - if v := mdutil.GetString(md, "interface"); v != "" { - hopConfig.Interface = v - delete(m, "interface") - } - if v := mdutil.GetInt(md, "so_mark"); v > 0 { - hopConfig.SockOpts = &config.SockOptsConfig{ - Mark: v, - } - delete(m, "so_mark") - } - - chain.Hops = append(chain.Hops, hopConfig) - } - - for i, svc := range services { - url, err := normCmd(svc) - if err != nil { - return nil, err - } - - service, err := buildServiceConfig(url) - if err != nil { - return nil, err - } - service.Name = fmt.Sprintf("%sservice-%d", namePrefix, i) - if chain != nil { - if service.Listener.Type == "rtcp" || service.Listener.Type == "rudp" { - service.Listener.Chain = chain.Name - } else { - service.Handler.Chain = chain.Name - } - } - cfg.Services = append(cfg.Services, service) - - mh := service.Handler.Metadata - md := mdx.NewMetadata(mh) - if v := mdutil.GetInt(md, "retries"); v > 0 { - service.Handler.Retries = v - delete(mh, "retries") - } - if v := mdutil.GetString(md, "admission"); v != "" { - admCfg := &config.AdmissionConfig{ - Name: fmt.Sprintf("%sadmission-%d", namePrefix, len(cfg.Admissions)), - } - if v[0] == '~' { - admCfg.Whitelist = true - v = v[1:] - } - for _, s := range strings.Split(v, ",") { - if s == "" { - continue - } - admCfg.Matchers = append(admCfg.Matchers, s) - } - service.Admission = admCfg.Name - cfg.Admissions = append(cfg.Admissions, admCfg) - delete(mh, "admission") - } - if v := mdutil.GetString(md, "bypass"); v != "" { - bypassCfg := &config.BypassConfig{ - Name: fmt.Sprintf("%sbypass-%d", namePrefix, len(cfg.Bypasses)), - } - if v[0] == '~' { - bypassCfg.Whitelist = true - v = v[1:] - } - for _, s := range strings.Split(v, ",") { - if s == "" { - continue - } - bypassCfg.Matchers = append(bypassCfg.Matchers, s) - } - service.Bypass = bypassCfg.Name - cfg.Bypasses = append(cfg.Bypasses, bypassCfg) - delete(mh, "bypass") - } - if v := mdutil.GetString(md, "resolver"); v != "" { - resolverCfg := &config.ResolverConfig{ - Name: fmt.Sprintf("%sresolver-%d", namePrefix, len(cfg.Resolvers)), - } - for _, rs := range strings.Split(v, ",") { - if rs == "" { - continue - } - resolverCfg.Nameservers = append( - resolverCfg.Nameservers, - &config.NameserverConfig{ - Addr: rs, - Prefer: mdutil.GetString(md, "prefer"), - }, - ) - } - service.Resolver = resolverCfg.Name - cfg.Resolvers = append(cfg.Resolvers, resolverCfg) - delete(mh, "resolver") - } - if v := mdutil.GetString(md, "hosts"); v != "" { - hostsCfg := &config.HostsConfig{ - Name: fmt.Sprintf("%shosts-%d", namePrefix, len(cfg.Hosts)), - } - for _, s := range strings.Split(v, ",") { - ss := strings.SplitN(s, ":", 2) - if len(ss) != 2 { - continue - } - hostsCfg.Mappings = append( - hostsCfg.Mappings, - &config.HostMappingConfig{ - Hostname: ss[0], - IP: ss[1], - }, - ) - } - service.Hosts = hostsCfg.Name - cfg.Hosts = append(cfg.Hosts, hostsCfg) - delete(mh, "hosts") - } - - in := mdutil.GetString(md, "limiter.in") - out := mdutil.GetString(md, "limiter.out") - cin := mdutil.GetString(md, "limiter.conn.in") - cout := mdutil.GetString(md, "limiter.conn.out") - if in != "" || cin != "" || out != "" || cout != "" { - limiter := &config.LimiterConfig{ - Name: fmt.Sprintf("%slimiter-%d", namePrefix, len(cfg.Limiters)), - } - if in != "" || out != "" { - limiter.Limits = append(limiter.Limits, - fmt.Sprintf("%s %s %s", traffic.GlobalLimitKey, in, out)) - } - if cin != "" || cout != "" { - limiter.Limits = append(limiter.Limits, - fmt.Sprintf("%s %s %s", traffic.ConnLimitKey, cin, cout)) - } - service.Limiter = limiter.Name - cfg.Limiters = append(cfg.Limiters, limiter) - delete(mh, "limiter.in") - delete(mh, "limiter.out") - delete(mh, "limiter.conn.in") - delete(mh, "limiter.conn.out") - } - - if climit := mdutil.GetInt(md, "climiter"); climit > 0 { - limiter := &config.LimiterConfig{ - Name: fmt.Sprintf("%sclimiter-%d", namePrefix, len(cfg.CLimiters)), - Limits: []string{fmt.Sprintf("%s %d", conn.GlobalLimitKey, climit)}, - } - service.CLimiter = limiter.Name - cfg.CLimiters = append(cfg.CLimiters, limiter) - delete(mh, "climiter") - } - - if rlimit := mdutil.GetFloat(md, "rlimiter"); rlimit > 0 { - limiter := &config.LimiterConfig{ - Name: fmt.Sprintf("%srlimiter-%d", namePrefix, len(cfg.RLimiters)), - Limits: []string{fmt.Sprintf("%s %s", conn.GlobalLimitKey, strconv.FormatFloat(rlimit, 'f', -1, 64))}, - } - service.RLimiter = limiter.Name - cfg.RLimiters = append(cfg.RLimiters, limiter) - delete(mh, "rlimiter") - } - } - - return cfg, nil -} - -func buildServiceConfig(url *url.URL) (*config.ServiceConfig, error) { - namePrefix := "" - if v := os.Getenv("_GOST_ID"); v != "" { - namePrefix = fmt.Sprintf("go-%s@", v) - } - - var handler, listener string - schemes := strings.Split(url.Scheme, "+") - if len(schemes) == 1 { - handler = schemes[0] - listener = schemes[0] - } - if len(schemes) == 2 { - handler = schemes[0] - listener = schemes[1] - } - - svc := &config.ServiceConfig{ - Addr: url.Host, - } - - if h := registry.HandlerRegistry().Get(handler); h == nil { - handler = "auto" - } - if ln := registry.ListenerRegistry().Get(listener); ln == nil { - listener = "tcp" - if handler == "ssu" { - listener = "udp" - } - } - - // forward mode - if remotes := strings.Trim(url.EscapedPath(), "/"); remotes != "" { - svc.Forwarder = &config.ForwarderConfig{ - // Targets: strings.Split(remotes, ","), - } - for i, addr := range strings.Split(remotes, ",") { - svc.Forwarder.Nodes = append(svc.Forwarder.Nodes, - &config.ForwardNodeConfig{ - Name: fmt.Sprintf("%starget-%d", namePrefix, i), - Addr: addr, - }) - } - if handler != "relay" { - if listener == "tcp" || listener == "udp" || - listener == "rtcp" || listener == "rudp" || - listener == "tun" || listener == "tap" || - listener == "dns" || listener == "unix" || - listener == "serial" { - handler = listener - } else { - handler = "forward" - } - } - } - - var auth *config.AuthConfig - if url.User != nil { - auth = &config.AuthConfig{ - Username: url.User.Username(), - } - auth.Password, _ = url.User.Password() - } - - m := map[string]any{} - for k, v := range url.Query() { - if len(v) > 0 { - m[k] = v[0] - } - } - md := mdx.NewMetadata(m) - - if sa := mdutil.GetString(md, "auth"); sa != "" { - au, err := parseAuthFromCmd(sa) - if err != nil { - return nil, err - } - auth = au - } - delete(m, "auth") - - tlsConfig := &config.TLSConfig{ - CertFile: mdutil.GetString(md, "tls.certFile", "certFile", "cert"), - KeyFile: mdutil.GetString(md, "tls.keyFile", "keyFile", "key"), - CAFile: mdutil.GetString(md, "tls.caFile", "caFile", "ca"), - } - - delete(m, "tls.certFile") - delete(m, "certFile") - delete(m, "cert") - delete(m, "tls.keyFile") - delete(m, "keyFile") - delete(m, "key") - delete(m, "tls.caFile") - delete(m, "caFile") - delete(m, "ca") - - if tlsConfig.CertFile == "" { - tlsConfig = nil - } - - if v := mdutil.GetString(md, "dns"); v != "" { - md.Set("dns", strings.Split(v, ",")) - } - - if svc.Forwarder != nil { - svc.Forwarder.Selector = parseSelector(m) - } - - svc.Handler = &config.HandlerConfig{ - Type: handler, - Auth: auth, - Metadata: m, - } - svc.Listener = &config.ListenerConfig{ - Type: listener, - TLS: tlsConfig, - Metadata: m, - } - - svc.Metadata = m - - if svc.Listener.Type == "ssh" || svc.Listener.Type == "sshd" { - svc.Handler.Auth = nil - svc.Listener.Auth = auth - } - - return svc, nil -} - -func buildNodeConfig(url *url.URL) (*config.NodeConfig, error) { - var connector, dialer string - schemes := strings.Split(url.Scheme, "+") - if len(schemes) == 1 { - connector = schemes[0] - dialer = schemes[0] - } - if len(schemes) == 2 { - connector = schemes[0] - dialer = schemes[1] - } - - m := map[string]any{} - for k, v := range url.Query() { - if len(v) > 0 { - m[k] = v[0] - } - } - md := mdx.NewMetadata(m) - - node := &config.NodeConfig{ - Addr: url.Host, - Metadata: m, - } - - if c := registry.ConnectorRegistry().Get(connector); c == nil { - connector = "http" - } - if d := registry.DialerRegistry().Get(dialer); d == nil { - dialer = "tcp" - if connector == "ssu" { - dialer = "udp" - } - } - - var auth *config.AuthConfig - if url.User != nil { - auth = &config.AuthConfig{ - Username: url.User.Username(), - } - auth.Password, _ = url.User.Password() - } - - if sauth := mdutil.GetString(md, "auth"); sauth != "" && auth == nil { - au, err := parseAuthFromCmd(sauth) - if err != nil { - return nil, err - } - auth = au - } - delete(m, "auth") - - tlsConfig := &config.TLSConfig{ - CertFile: mdutil.GetString(md, "tls.certFile", "certFile", "cert"), - KeyFile: mdutil.GetString(md, "tls.keyFile", "keyFile", "key"), - CAFile: mdutil.GetString(md, "tls.caFile", "caFile", "ca"), - Secure: mdutil.GetBool(md, "tls.secure", "secure"), - ServerName: mdutil.GetString(md, "tls.servername", "servername"), - } - if tlsConfig.ServerName == "" { - tlsConfig.ServerName = url.Hostname() - } - - delete(m, "tls.certFile") - delete(m, "certFile") - delete(m, "cert") - delete(m, "tls.keyFile") - delete(m, "keyFile") - delete(m, "key") - delete(m, "tls.caFile") - delete(m, "caFile") - delete(m, "ca") - delete(m, "tls.secure") - delete(m, "secure") - delete(m, "tls.servername") - delete(m, "serverName") - - if !tlsConfig.Secure && tlsConfig.CertFile == "" && tlsConfig.CAFile == "" && tlsConfig.ServerName == "" { - tlsConfig = nil - } - - node.Connector = &config.ConnectorConfig{ - Type: connector, - Auth: auth, - Metadata: m, - } - node.Dialer = &config.DialerConfig{ - Type: dialer, - TLS: tlsConfig, - Metadata: m, - } - - if node.Dialer.Type == "ssh" || node.Dialer.Type == "sshd" { - node.Connector.Auth = nil - node.Dialer.Auth = auth - } - - return node, nil -} - -func normCmd(s string) (*url.URL, error) { - s = strings.TrimSpace(s) - if s == "" { - return nil, ErrInvalidCmd - } - - if s[0] == ':' || !strings.Contains(s, "://") { - s = "auto://" + s - } - - url, err := url.Parse(s) - if err != nil { - return nil, err - } - if url.Scheme == "https" { - url.Scheme = "http+tls" - } - - return url, nil -} - -func parseAuthFromCmd(sa string) (*config.AuthConfig, error) { - v, err := base64.StdEncoding.DecodeString(sa) - if err != nil { - return nil, err - } - cs := string(v) - n := strings.IndexByte(cs, ':') - if n < 0 { - return &config.AuthConfig{ - Username: cs, - }, nil - } - - return &config.AuthConfig{ - Username: cs[:n], - Password: cs[n+1:], - }, nil -} - -func parseSelector(m map[string]any) *config.SelectorConfig { - md := mdx.NewMetadata(m) - strategy := mdutil.GetString(md, "strategy") - maxFails := mdutil.GetInt(md, "maxFails", "max_fails") - failTimeout := mdutil.GetDuration(md, "failTimeout", "fail_timeout") - if strategy == "" && maxFails <= 0 && failTimeout <= 0 { - return nil - } - if strategy == "" { - strategy = "round" - } - if maxFails <= 0 { - maxFails = 1 - } - if failTimeout <= 0 { - failTimeout = 30 * time.Second - } - - delete(m, "strategy") - delete(m, "maxFails") - delete(m, "max_fails") - delete(m, "failTimeout") - delete(m, "fail_timeout") - - return &config.SelectorConfig{ - Strategy: strategy, - MaxFails: maxFails, - FailTimeout: failTimeout, - } -} diff --git a/cmd/gost/main.go b/cmd/gost/main.go index b5dd464..6289fcc 100644 --- a/cmd/gost/main.go +++ b/cmd/gost/main.go @@ -17,6 +17,16 @@ import ( "github.com/judwhite/go-svc" ) +type stringList []string + +func (l *stringList) String() string { + return fmt.Sprintf("%s", *l) +} +func (l *stringList) Set(value string) error { + *l = append(*l, value) + return nil +} + var ( cfgFile string outputFormat string diff --git a/cmd/gost/program.go b/cmd/gost/program.go index a267c1b..5952ceb 100644 --- a/cmd/gost/program.go +++ b/cmd/gost/program.go @@ -9,6 +9,7 @@ import ( "github.com/go-gost/core/logger" mdutil "github.com/go-gost/core/metadata/util" "github.com/go-gost/x/config" + "github.com/go-gost/x/config/cmd" "github.com/go-gost/x/config/parsing" logger_parser "github.com/go-gost/x/config/parsing/logger" xmd "github.com/go-gost/x/metadata" @@ -17,8 +18,7 @@ import ( "github.com/judwhite/go-svc" ) -type program struct { -} +type program struct{} func (p *program) Init(env svc.Environment) error { cfg := &config.Config{} @@ -36,7 +36,7 @@ func (p *program) Init(env svc.Environment) error { } } - cmdCfg, err := buildConfigFromCmd(services, nodes) + cmdCfg, err := cmd.BuildConfigFromCmd(services, nodes) if err != nil { return err } @@ -73,7 +73,7 @@ func (p *program) Init(env svc.Environment) error { cfg.API = &config.APIConfig{ Addr: apiAddr, } - if url, _ := normCmd(apiAddr); url != nil { + if url, _ := cmd.Norm(apiAddr); url != nil { cfg.API.Addr = url.Host if url.User != nil { username := url.User.Username() @@ -104,7 +104,7 @@ func (p *program) Init(env svc.Environment) error { cfg.Metrics = &config.MetricsConfig{ Addr: metricsAddr, } - if url, _ := normCmd(metricsAddr); url != nil { + if url, _ := cmd.Norm(metricsAddr); url != nil { cfg.Metrics.Addr = url.Host if url.User != nil { username := url.User.Username() diff --git a/go.mod b/go.mod index 5d7fc00..5c8fa90 100644 --- a/go.mod +++ b/go.mod @@ -5,8 +5,8 @@ go 1.22 toolchain go1.22.2 require ( - github.com/go-gost/core v0.0.0-20240704150322-30cc92870515 - github.com/go-gost/x v0.0.0-20240704150535-22537ff0d294 + github.com/go-gost/core v0.1.0 + github.com/go-gost/x v0.1.0 github.com/judwhite/go-svc v1.2.1 ) @@ -16,8 +16,8 @@ require ( github.com/alessio/shellescape v1.4.1 // indirect github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d // indirect github.com/beorn7/perks v1.0.1 // indirect - github.com/bytedance/sonic v1.10.2 // indirect - github.com/cespare/xxhash/v2 v2.2.0 // indirect + github.com/bytedance/sonic v1.11.2 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect github.com/chenzhuoyu/iasm v0.9.1 // indirect github.com/coreos/go-iptables v0.5.0 // indirect @@ -25,7 +25,7 @@ require ( github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/gabriel-vasile/mimetype v1.4.3 // indirect - github.com/gin-contrib/cors v1.5.0 // indirect + github.com/gin-contrib/cors v1.6.0 // indirect github.com/gin-contrib/sse v0.1.0 // indirect github.com/gin-gonic/gin v1.9.1 // indirect github.com/go-gost/gosocks4 v0.0.1 // indirect @@ -35,7 +35,7 @@ require ( github.com/go-gost/tls-dissector v0.0.2-0.20220408131628-aac992c27451 // indirect github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect - github.com/go-playground/validator/v10 v10.16.0 // indirect + github.com/go-playground/validator/v10 v10.19.0 // indirect github.com/go-redis/redis/v8 v8.11.5 // indirect github.com/go-task/slim-sprig/v3 v3.0.0 // indirect github.com/gobwas/glob v0.2.3 // indirect @@ -48,12 +48,12 @@ require ( github.com/gorilla/websocket v1.5.1 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/klauspost/cpuid/v2 v2.2.6 // indirect + github.com/klauspost/cpuid/v2 v2.2.7 // indirect github.com/klauspost/reedsolomon v1.11.8 // indirect - github.com/leodido/go-urn v1.2.4 // indirect + github.com/leodido/go-urn v1.4.0 // indirect github.com/magiconair/properties v1.8.7 // indirect github.com/mattn/go-isatty v0.0.20 // indirect - github.com/miekg/dns v1.1.57 // indirect + github.com/miekg/dns v1.1.61 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect @@ -92,7 +92,7 @@ require ( github.com/templexxx/xorsimd v0.4.2 // indirect github.com/tjfoc/gmsm v1.4.1 // indirect github.com/twitchyliquid64/golang-asm v0.15.1 // indirect - github.com/ugorji/go/codec v1.2.11 // indirect + github.com/ugorji/go/codec v1.2.12 // indirect github.com/vishvananda/netlink v1.1.0 // indirect github.com/vishvananda/netns v0.0.4 // indirect github.com/xtaci/kcp-go/v5 v5.6.5 // indirect @@ -102,20 +102,20 @@ require ( github.com/zalando/go-keyring v0.2.4 // indirect go.uber.org/mock v0.4.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/arch v0.6.0 // indirect - golang.org/x/crypto v0.24.0 // indirect + golang.org/x/arch v0.7.0 // indirect + golang.org/x/crypto v0.25.0 // indirect golang.org/x/exp v0.0.0-20240604190554-fc45aab8b7f8 // indirect - golang.org/x/mod v0.18.0 // indirect - golang.org/x/net v0.26.0 // indirect + golang.org/x/mod v0.19.0 // indirect + golang.org/x/net v0.27.0 // indirect golang.org/x/sync v0.7.0 // indirect - golang.org/x/sys v0.21.0 // indirect + golang.org/x/sys v0.22.0 // indirect golang.org/x/text v0.16.0 // indirect golang.org/x/time v0.5.0 // indirect - golang.org/x/tools v0.22.0 // indirect + golang.org/x/tools v0.23.0 // indirect golang.zx2c4.com/wintun v0.0.0-20211104114900-415007cec224 // indirect golang.zx2c4.com/wireguard v0.0.0-20220703234212-c31a7b1ab478 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240610135401-a8a62080eff3 // indirect - google.golang.org/grpc v1.64.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240701130421-f6361c86f094 // indirect + google.golang.org/grpc v1.65.0 // indirect google.golang.org/protobuf v1.34.2 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect diff --git a/go.sum b/go.sum index 3a32980..bc9a824 100644 --- a/go.sum +++ b/go.sum @@ -14,9 +14,11 @@ github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1 github.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM= github.com/bytedance/sonic v1.10.2 h1:GQebETVBxYB7JGWJtLBi07OVzWwt+8dWA00gEVW2ZFE= github.com/bytedance/sonic v1.10.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4= +github.com/bytedance/sonic v1.11.2/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY= github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk= github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0= @@ -49,12 +51,19 @@ github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uq github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= github.com/gin-contrib/cors v1.5.0 h1:DgGKV7DDoOn36DFkNtbHrjoRiT5ExCe+PC9/xp7aKvk= github.com/gin-contrib/cors v1.5.0/go.mod h1:TvU7MAZ3EwrPLI2ztzTt3tqgvBCq+wn8WpZmfADjupI= +github.com/gin-contrib/cors v1.6.0/go.mod h1:cI+h6iOAyxKRtUtC6iF/Si1KSFvGm/gK+kshxlCi8ro= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg= github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU= +github.com/go-gost/core v0.0.0-20240625123708-4e831b95e8cc h1:aj0FZ3RYZPqlDko/pKPPAAve1/73g+uIq/sVEGtarss= +github.com/go-gost/core v0.0.0-20240625123708-4e831b95e8cc/go.mod h1:aTPFucvJyqc/o5h5/ZtyHJ0xgFIq5Ip+cMlhazm+TaI= github.com/go-gost/core v0.0.0-20240704150322-30cc92870515 h1:i/zcDZtz00hcmRosvJgXmgJsdc4bC32PAvt2+8MUOEg= github.com/go-gost/core v0.0.0-20240704150322-30cc92870515/go.mod h1:QmVAZIXIYBsX44Vehwug5RFnG2K3/Hz/uu/Y4QVhAY0= +github.com/go-gost/core v0.0.0-20240708142821-48d070d34568 h1:OJ+FzmBMy9RnWdECxGw6FKHRmN346Q/iVmDUSCBIthk= +github.com/go-gost/core v0.0.0-20240708142821-48d070d34568/go.mod h1:WGI43jOka7FAsSAwi/fSMaqxdR+E339ycb4NBGlFr6A= +github.com/go-gost/core v0.1.0 h1:LJJc8PIlRflE8ZIpxls+wYX1e8OGB0nUKJYh8HevM4U= +github.com/go-gost/core v0.1.0/go.mod h1:WGI43jOka7FAsSAwi/fSMaqxdR+E339ycb4NBGlFr6A= github.com/go-gost/gosocks4 v0.0.1 h1:+k1sec8HlELuQV7rWftIkmy8UijzUt2I6t+iMPlGB2s= github.com/go-gost/gosocks4 v0.0.1/go.mod h1:3B6L47HbU/qugDg4JnoFPHgJXE43Inz8Bah1QaN9qCc= github.com/go-gost/gosocks5 v0.4.2 h1:IianxHTkACPqCwiOAT3MHoMdSUl+SEPSRu1ikawC1Pc= @@ -65,8 +74,11 @@ github.com/go-gost/relay v0.5.0 h1:JG1tgy/KWiVXS0ukuVXvbM0kbYuJTWxYpJ5JwzsCf/c= github.com/go-gost/relay v0.5.0/go.mod h1:lcX+23LCQ3khIeASBo+tJ/WbwXFO32/N5YN6ucuYTG8= github.com/go-gost/tls-dissector v0.0.2-0.20220408131628-aac992c27451 h1:xj8gUZGYO3nb5+6Bjw9+tsFkA9sYynrOvDvvC4uDV2I= github.com/go-gost/tls-dissector v0.0.2-0.20220408131628-aac992c27451/go.mod h1:/9QfdewqmHdaE362Hv5nDaSWLx3pCmtD870d6GaquXs= +github.com/go-gost/x v0.0.0-20240131151842-25dcf536c6f5/go.mod h1:FDqjiiPbCqJLU/wY+q2IZCBVcYnfTJTw+SJLrspLQms= github.com/go-gost/x v0.0.0-20240704150535-22537ff0d294 h1:sXmgKm9UBPMnAbYcMgvf/NUCEbkkFbdRqlTcRZzXPOc= github.com/go-gost/x v0.0.0-20240704150535-22537ff0d294/go.mod h1:8+dJVV3BEdCciVvmAoqNBZ9+2asPr7ZIcBJGCc9yTfA= +github.com/go-gost/x v0.1.0 h1:2pDxVCISX1NS/YRdlQ3qmHM3VqOd3DtBoaxZ4xseE8U= +github.com/go-gost/x v0.1.0/go.mod h1:Te5EMigKCWAjTzdOow+S9BTfxJszDpj2B5T4mNntUIg= github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= @@ -77,6 +89,7 @@ github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJn github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= github.com/go-playground/validator/v10 v10.16.0 h1:x+plE831WK4vaKHO/jpgUGsvLKIqRRkz6M78GuJAfGE= github.com/go-playground/validator/v10 v10.16.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= +github.com/go-playground/validator/v10 v10.19.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI= github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo= github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= @@ -124,6 +137,7 @@ github.com/judwhite/go-svc v1.2.1/go.mod h1:mo/P2JNX8C07ywpP9YtO2gnBgnUiFTHqtsZe github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc= github.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= +github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= github.com/klauspost/reedsolomon v1.11.8 h1:s8RpUW5TK4hjr+djiOpbZJB4ksx+TdYbRH7vHQpwPOY= github.com/klauspost/reedsolomon v1.11.8/go.mod h1:4bXRN+cVzMdml6ti7qLouuYi32KHJ5MGv0Qd8a47h6A= github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= @@ -133,12 +147,14 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= +github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/miekg/dns v1.1.57 h1:Jzi7ApEIzwEPLHWRcafCN9LZSBbqQpxjt/wpgvg7wcM= github.com/miekg/dns v1.1.57/go.mod h1:uqRjCRUuEAA6qsOiJvDd+CFo/vW+y5WR6SNmHE55hZk= +github.com/miekg/dns v1.1.61/go.mod h1:mnAarhS3nWaW+NVP2wTkYVIZyHNJ098SJZUki3eykwQ= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= @@ -244,6 +260,7 @@ github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= +github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= github.com/vishvananda/netlink v1.1.0 h1:1iyaYNBLmP6L0220aDnYQpo1QEV4t4hJ+xEEhhJH8j0= github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= @@ -269,6 +286,7 @@ go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN8 golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= golang.org/x/arch v0.6.0 h1:S0JTfE48HbRj80+4tbvZDYsJ3tGv6BUU3XxyZ7CirAc= golang.org/x/arch v0.6.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys= +golang.org/x/arch v0.7.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -278,6 +296,7 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.5.0/go.mod h1:NK/OQwhpMQP3MwtdjgLlYHnH9ebylxKWv3e0fK+mkQU= golang.org/x/crypto v0.24.0 h1:mnl8DM0o513X8fdIkmyFE/5hTYxbwYOjDS/+rK6qpRI= golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM= +golang.org/x/crypto v0.25.0/go.mod h1:T+wALwcMOSE0kXgUAnPAHqTLW+XHgcELELW8VaDgm/M= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20240604190554-fc45aab8b7f8 h1:LoYXNGAShUG3m/ehNk4iFctuhGX/+R1ZpfJ4/ia80JM= golang.org/x/exp v0.0.0-20240604190554-fc45aab8b7f8/go.mod h1:jj3sYF3dwk5D+ghuXyeI3r5MFf+NT2An6/9dOA95KSI= @@ -289,6 +308,7 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.18.0 h1:5+9lSbEzPSdWkH32vYPBwEpX8KwDbM52Ud9xBUvNlb0= golang.org/x/mod v0.18.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.19.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -302,6 +322,7 @@ golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ= golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= +golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -325,6 +346,7 @@ 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.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws= golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -351,6 +373,7 @@ golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapK golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.22.0 h1:gqSGLZqv+AI9lIQzniJ0nZDRG5GBPsSi+DRNHWNz6yA= golang.org/x/tools v0.22.0/go.mod h1:aCwcsjqvq7Yqt6TNyX7QMU2enbQ/Gt0bo6krSeEri+c= +golang.org/x/tools v0.23.0/go.mod h1:pnu6ufv6vQkll6szChhK3C3L/ruaIv5eBeztNG8wtsI= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -364,12 +387,14 @@ google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoA google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto/googleapis/rpc v0.0.0-20240610135401-a8a62080eff3 h1:9Xyg6I9IWQZhRVfCWjKK+l6kI0jHcPesVlMnT//aHNo= google.golang.org/genproto/googleapis/rpc v0.0.0-20240610135401-a8a62080eff3/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240701130421-f6361c86f094/go.mod h1:Ue6ibwXGpU+dqIcODieyLOcgj7z8+IcskoNIgZxtrFY= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= +google.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=