diff --git a/.gitignore b/.gitignore index 1932579..eee0705 100644 --- a/.gitignore +++ b/.gitignore @@ -14,6 +14,7 @@ # Output of the go coverage tool, specifically when used with LiteIDE *.out +result.txt # Dependency directories (remove the comment below to include it) # vendor/ @@ -21,3 +22,4 @@ pack/ # Go workspace file go.work +screenshots/ diff --git a/.idea/DetectDee.iml b/.idea/DetectDee.iml index 5e764c4..9942e69 100644 --- a/.idea/DetectDee.iml +++ b/.idea/DetectDee.iml @@ -2,7 +2,9 @@ - + + + diff --git a/README.md b/README.md index 19b311d..7eead07 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,7 @@ DetectDee: Hunt down social media accounts by **username, email or phone** across [social networks](site.md) ![example.gif](https://s2.loli.net/2023/04/30/FZ1QtKoGud4xVPW.gif) +![screen.jpg](https://s2.loli.net/2023/05/13/XzV4EGKrbkURHQg.jpg) ## Feat - Includes sites frequently used by **CyberSecurity practitioners** - Hunt down social media accounts by **username, email or phone** @@ -85,7 +86,35 @@ To search in specified site: ```shell ./DetectDee detect -n piaolin -s github,v2ex ``` +### Screenshot +The screenshot function is used to screenshot the results of detect. Note that this function requires: +- Chrome +- A period of time +- A bit of memory usage +```shell +Usage: + DetectDee screenshot [flags] + +Flags: + --chrome Show chrome + -d, --dir string Folder path of the screenshot (default "screenshots") + -f, --file string Url list file (default "result.txt") + -h, --help help for screenshot + --path string Chrome ExecPath + --proxy string Make requests over a proxy. e.g. socks5://127.0.0.1:1080 + -t, --thread int Chrome number (default 3) + --timeout int Timeout (default 60) + +Global Flags: + -v, --verbose verbose output +``` +Screenshot the results of detect +```shell +./DetectDee screenshot +``` +![result.jpg](https://s2.loli.net/2023/05/13/OWRDnU98TyCdceN.jpg) +![screen.jpg](https://s2.loli.net/2023/05/13/XzV4EGKrbkURHQg.jpg) ## Contributing We would love to have you help us with the development of DetectDee. Each and every contribution is greatly valued! diff --git a/README_ZH.md b/README_ZH.md index 69d9ea5..5355e61 100644 --- a/README_ZH.md +++ b/README_ZH.md @@ -3,6 +3,7 @@ 神探狄仁杰: 在[社交网络](site.md)上通过**用户名,电子邮件或电话**搜索社交媒体账户 ![example.gif](https://s2.loli.net/2023/04/30/FZ1QtKoGud4xVPW.gif) +![screen.jpg](https://s2.loli.net/2023/05/13/XzV4EGKrbkURHQg.jpg) ## 特性 - 集成**网络安全从业者**常用网站 - 通过**用户名,电子邮件或电话**查找社交媒体账户 @@ -81,7 +82,34 @@ Global Flags: ```shell ./DetectDee detect -n piaolin -s github,v2ex ``` - +### 截屏 +截屏功能用于将探测得来的结果进行访问截屏,请注意该功能需要: +- Chrome +- 一定时间 +- 一定内存占用 +```shell +Usage: + DetectDee screenshot [flags] + +Flags: + --chrome Show chrome + -d, --dir string Folder path of the screenshot (default "screenshots") + -f, --file string Url list file (default "result.txt") + -h, --help help for screenshot + --path string Chrome ExecPath + --proxy string Make requests over a proxy. e.g. socks5://127.0.0.1:1080 + -t, --thread int Chrome number (default 3) + --timeout int Timeout (default 60) + +Global Flags: + -v, --verbose verbose output +``` +对detect得到结果进行截屏 +```shell +./DetectDee screenshot +``` +![result.jpg](https://s2.loli.net/2023/05/13/OWRDnU98TyCdceN.jpg) +![screen.jpg](https://s2.loli.net/2023/05/13/XzV4EGKrbkURHQg.jpg) ## 贡献 希望您能帮助我们开发“神探狄仁杰”,您的每一份提交都会得到我的重视。 diff --git a/cmd/detect.go b/cmd/detect.go index 8059a3b..74f3571 100644 --- a/cmd/detect.go +++ b/cmd/detect.go @@ -36,6 +36,7 @@ var ( wg sync.WaitGroup nonSiteData = "[-] There is no site data of %s\n" existInfo = "[+] %-15s %-15s: %s\n" + existOutputInfo = "%-15s %-15s: %s\n" nonExistInfo = "[-] %-15s %-15s: non exists\n" reqErrorInfo = "[!] %-15s %-15s: %s requests error, retry %d/%d\n" sleepMap = make(map[string]int64) @@ -321,12 +322,12 @@ func detectUser(name, site string, requestTimes, retryTimes, detectCount int, fl } else if !detectArgs.precisely { // flag=true && precisely=false log.Infof(existInfo, name, site, userPage) - writeContent <- fmt.Sprintf(existInfo, name, site, userPage) + writeContent <- fmt.Sprintf(existOutputInfo, name, site, userPage) return false } else if requestTimes == detectCount { // flag=true && precisely=true && last request log.Infof(existInfo, name, site, userPage) - writeContent <- fmt.Sprintf(existInfo, name, site, userPage) + writeContent <- fmt.Sprintf(existOutputInfo, name, site, userPage) return true } else { return true diff --git a/cmd/screenshot.go b/cmd/screenshot.go new file mode 100644 index 0000000..00a072b --- /dev/null +++ b/cmd/screenshot.go @@ -0,0 +1,231 @@ +package cmd + +import ( + "bufio" + "context" + "fmt" + "io/ioutil" + "net/url" + "os" + "strings" + "sync" + "time" + + "github.com/chromedp/chromedp" + log "github.com/sirupsen/logrus" + "github.com/spf13/cobra" +) + +type screenshotArgsType struct { + proxy string + chrome bool + thread int + timeout int + path string + file string + result string +} + +var ( + screenshotArgs screenshotArgsType + screenshotWg sync.WaitGroup + targets = make(chan []string, 10) + execPathNotFound = "[-] Chrome executable file not found, please install Chrome or specify the chrome.exe path with --path" + urlFileReadError = "[-] failed to read targets file:%v" + createResultFolderError = "[-] failed to create result folder:%v" +) + +func init() { + screenshotCmd.Flags().StringVar(&screenshotArgs.proxy, "proxy", "", "Make requests over a proxy. e.g. socks5://127.0.0.1:1080") + screenshotCmd.Flags().StringVar(&screenshotArgs.path, "path", "", "Chrome ExecPath") + screenshotCmd.Flags().StringVarP(&screenshotArgs.result, "dir", "d", "screenshots", "Folder path of the screenshot") + screenshotCmd.Flags().BoolVar(&screenshotArgs.chrome, "chrome", false, "Show chrome") + screenshotCmd.Flags().IntVarP(&screenshotArgs.thread, "thread", "t", 3, "Chrome number") + screenshotCmd.Flags().StringVarP(&screenshotArgs.file, "file", "f", "result.txt", "Url list file") + screenshotCmd.Flags().IntVar(&screenshotArgs.timeout, "timeout", 60, "Timeout") + rootCmd.AddCommand(screenshotCmd) +} + +var screenshotCmd = &cobra.Command{ + Use: "screenshot", + Short: "screenshot result with chrome headless", + Long: ``, + Run: screenshot, +} + +func screenshot(_ *cobra.Command, _ []string) { + if Verbose { + log.Infoln("Debug Mode") + log.SetLevel(log.DebugLevel) + } + + go parseFile(screenshotArgs.file) + + err := CreateDirIfNotExists(screenshotArgs.result) + if err != nil { + log.Errorf(createResultFolderError, err) + return + } + log.Infoln("[+] starting screenshot tasks") + + for i := 1; i < screenshotArgs.thread+1; i++ { + go navigate(i) + screenshotWg.Add(1) + } + screenshotWg.Wait() +} + +func parseFile(file string) { + f, err := os.Open(file) + if err != nil { + log.Errorf(urlFileReadError, err) + return + } + defer f.Close() + + scanner := bufio.NewScanner(f) + for scanner.Scan() { + if scanner.Text() != "" { + tmp := strings.Split(scanner.Text(), ": ") + name := strings.Split(strings.TrimSpace(tmp[0]), " ") + + target := []string{fmt.Sprintf("%s-%s", name[0], name[len(name)-1]), tmp[1]} + targets <- target + } + } +} + +func navigate(workerNum int) { + defer screenshotWg.Done() + + // create context + opts := append(chromedp.DefaultExecAllocatorOptions[:], + chromedp.Flag("headless", !screenshotArgs.chrome), + chromedp.ProxyServer(screenshotArgs.proxy), + chromedp.Flag("mute-audio", true), + chromedp.IgnoreCertErrors, + chromedp.DisableGPU, + chromedp.NoFirstRun, + chromedp.ExecPath(screenshotArgs.path), + chromedp.WindowSize(1920, 1080), + chromedp.NoDefaultBrowserCheck, + chromedp.NoSandbox, + ) + + if screenshotArgs.proxy != "" { + opts = append(opts, chromedp.Flag("proxy-server", screenshotArgs.proxy)) + } + + ctx, cancel := chromedp.NewExecAllocator(context.Background(), opts...) + + //ctx, cancel = context.WithTimeout(ctx, time.Duration(screenshotArgs.timeout)*time.Second) + + ctx, cancel = chromedp.NewContext(ctx) + + // Check & Make Browser not close + err := chromedp.Run( + ctx, + chromedp.Tasks{ + chromedp.Navigate("https://github.com/piaolin"), + }, + ) + if err != nil { + if strings.Contains(err.Error(), "executable file not found") { + log.Fatalln(execPathNotFound) + } else { + log.Fatalln(err) + } + } + + // Run + for len(targets) > 0 { + target := <-targets + name := target[0] + urlStr := target[1] + + log.Debugf("[Worker%2d] starting screenshot task %s,remaining tasks:%d\n", workerNum, urlStr, len(targets)) + var buf []byte + //ctx, cancel = chromedp.NewContext( + // ctx, + //) + if err := chromedp.Run(ctx, fullScreenshot(urlStr, 100, &buf)); err != nil { + log.Errorf("[-] Failed to take (URL:%s) screenshot: %v", urlStr, err) + continue + } + pngFilePath := fmt.Sprintf("./%s/%s.png", screenshotArgs.result, name) + if err := ioutil.WriteFile(pngFilePath, buf, 0644); err != nil { + log.Errorf("[-] Failed to write file %v", err) + continue + } + + //if err := page.Close().Do(cdp.WithExecutor(ctx, chromedp.FromContext(ctx).Target)); err != nil { + // log.Errorln(err) + //} + + log.Infof("[+] screenshot success %s", urlStr) + log.Debugf("[Worker%2d] finished screenshot task %s,remaining tasks:%d\n", workerNum, urlStr, len(targets)) + } + + defer cancel() +} + +func fullScreenshot(urlstr string, quality int, res *[]byte) chromedp.Tasks { + return chromedp.Tasks{ + chromedp.Navigate(urlstr), + //chromedp.WaitVisible("style"), + chromedp.Sleep(1 * time.Second), + //chromedp.OuterHTML(`document.querySelector("body")`, &htmlContent, chromedp.ByJSPath), + chromedp.FullScreenshot(res, quality), + //chromedp.ActionFunc(func(ctx context.Context) error { + // _, _, _, _, _, contentSize, err := page.GetLayoutMetrics().Do(ctx) + // if err != nil { + // return err + // } + // + // width, height := int64(math.Ceil(contentSize.Width)), int64(math.Ceil(contentSize.Height)) + // + // err = emulation.SetDeviceMetricsOverride(width, height, 1, false). + // WithScreenOrientation(&emulation.ScreenOrientation{ + // Type: emulation.OrientationTypePortraitPrimary, + // Angle: 0, + // }). + // Do(ctx) + // if err != nil { + // return err + // } + // + // *res, err = page.CaptureScreenshot(). + // WithQuality(quality). + // WithClip(&page.Viewport{ + // X: contentSize.X, + // Y: contentSize.Y, + // Width: contentSize.Width, + // Height: contentSize.Height, + // Scale: 1, + // }).Do(ctx) + // if err != nil { + // return err + // } + // return nil + //}), + } +} + +func getDomain(urlstr string) string { + u, err := url.Parse(urlstr) + if err != nil { + fmt.Println(err) + return "getdomain_error" + } + return u.Hostname() +} + +func CreateDirIfNotExists(dirName string) error { + if _, err := os.Stat(dirName); os.IsNotExist(err) { + err := os.MkdirAll(dirName, 0755) + if err != nil { + return err + } + } + return nil +} diff --git a/go.mod b/go.mod index a8e36ed..c731d95 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,8 @@ module DetectDee go 1.18 require ( - github.com/PuerkitoBio/goquery v1.8.1 + github.com/chromedp/cdproto v0.0.0-20230506233603-4ea4c6dc2e5b + github.com/chromedp/chromedp v0.9.1 github.com/go-resty/resty/v2 v2.7.0 github.com/sirupsen/logrus v1.9.0 github.com/spf13/cobra v1.7.0 @@ -11,11 +12,19 @@ require ( ) require ( - github.com/andybalholm/cascadia v1.3.1 // indirect + github.com/chromedp/sysutil v1.0.0 // indirect + github.com/gobwas/httphead v0.1.0 // indirect + github.com/gobwas/pool v0.2.1 // indirect + github.com/gobwas/ws v1.1.0 // indirect + github.com/josharian/intern v1.0.0 // indirect + github.com/mailru/easyjson v0.7.7 // indirect +) + +require ( github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/tidwall/match v1.1.1 // indirect github.com/tidwall/pretty v1.2.0 // indirect golang.org/x/net v0.7.0 // indirect - golang.org/x/sys v0.5.0 // indirect + golang.org/x/sys v0.6.0 // indirect ) diff --git a/go.sum b/go.sum index 0c34fc3..37f91b6 100644 --- a/go.sum +++ b/go.sum @@ -1,15 +1,32 @@ -github.com/PuerkitoBio/goquery v1.8.1 h1:uQxhNlArOIdbrH1tr0UXwdVFgDcZDrZVdcpygAcwmWM= -github.com/PuerkitoBio/goquery v1.8.1/go.mod h1:Q8ICL1kNUJ2sXGoAhPGUdYDJvgQgHzJsnnd3H7Ho5jQ= -github.com/andybalholm/cascadia v1.3.1 h1:nhxRkql1kdYCc8Snf7D5/D3spOX+dBgjA6u8x004T2c= -github.com/andybalholm/cascadia v1.3.1/go.mod h1:R4bJ1UQfqADjvDa4P6HZHLh/3OxWWEqc0Sk8XGwHqvA= +github.com/chromedp/cdproto v0.0.0-20230220211738-2b1ec77315c9/go.mod h1:GKljq0VrfU4D5yc+2qA6OVr8pmO/MBbPEWqWQ/oqGEs= +github.com/chromedp/cdproto v0.0.0-20230506233603-4ea4c6dc2e5b h1:SK9lKpfJgkHu8VzAGGiRWm6IJ8EDo0OVjKqihL7KwEI= +github.com/chromedp/cdproto v0.0.0-20230506233603-4ea4c6dc2e5b/go.mod h1:GKljq0VrfU4D5yc+2qA6OVr8pmO/MBbPEWqWQ/oqGEs= +github.com/chromedp/chromedp v0.9.1 h1:CC7cC5p1BeLiiS2gfNNPwp3OaUxtRMBjfiw3E3k6dFA= +github.com/chromedp/chromedp v0.9.1/go.mod h1:DUgZWRvYoEfgi66CgZ/9Yv+psgi+Sksy5DTScENWjaQ= +github.com/chromedp/sysutil v1.0.0 h1:+ZxhTpfpZlmchB58ih/LBHX52ky7w2VhQVKQMucy3Ic= +github.com/chromedp/sysutil v1.0.0/go.mod h1:kgWmDdq8fTzXYcKIBqIYvRRTnYb9aNS9moAV0xufSww= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/go-resty/resty/v2 v2.7.0 h1:me+K9p3uhSmXtrBZ4k9jcEAfJmuC8IivWHwaLZwPrFY= github.com/go-resty/resty/v2 v2.7.0/go.mod h1:9PWDzw47qPphMRFfhsyk0NnSgvluHcljSMVIq3w7q0I= +github.com/gobwas/httphead v0.1.0 h1:exrUm0f4YX0L7EBwZHuCF4GDp8aJfVeBrlLQrs6NqWU= +github.com/gobwas/httphead v0.1.0/go.mod h1:O/RXo79gxV8G+RqlR/otEwx4Q36zl9rqC5u12GKvMCM= +github.com/gobwas/pool v0.2.1 h1:xfeeEhW7pwmX8nuLVlqbzVc7udMDrwetjEv+TZIz1og= +github.com/gobwas/pool v0.2.1/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +github.com/gobwas/ws v1.1.0 h1:7RFti/xnNkMJnrK7D1yQ/iCIB5OrrY/54/H930kIbHA= +github.com/gobwas/ws v1.1.0/go.mod h1:nzvNcVha5eUziGrbxFCo6qFIojQHjJV5cLYIbezhfL0= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/ledongthuc/pdf v0.0.0-20220302134840-0c2507a12d80 h1:6Yzfa6GP0rIo/kULo2bwGEkFvCePZ3qHDDTC3/J9Swo= +github.com/ledongthuc/pdf v0.0.0-20220302134840-0c2507a12d80/go.mod h1:imJHygn/1yfhB7XSJJKlFZKl/J+dCPAknuiaGOshXAs= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/orisano/pixelmatch v0.0.0-20220722002657-fb0b55479cde h1:x0TT0RDC7UhAVbbWWBzr41ElhJx5tXPWkIHA2HWPRuw= +github.com/orisano/pixelmatch v0.0.0-20220722002657-fb0b55479cde/go.mod h1:nZgzbfBr3hhjoZnS66nKrHmduYNpc34ny7RK4z5/HM0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= @@ -28,40 +45,18 @@ github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210916014120-12bc252f5db8/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211029224645-99673261e6eb/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201207223542-d4d67f95c62d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=