├── .github ├── ISSUE_TEMPLATE.md ├── PULL_REQUEST_TEMPLATE.md └── workflows │ ├── release.yaml │ └── test.yaml ├── .gitignore ├── .golangci.yml ├── .goreleaser.yml ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── Dockerfile ├── LICENSE ├── Makefile ├── README-zh.md ├── README.md ├── assets ├── demo.cast ├── demo.jpg └── demo.svg ├── cmd └── mdfmt │ ├── main.go │ ├── options.go │ └── options_test.go ├── go.mk ├── go.mod ├── go.sum └── pkg ├── md ├── md.go ├── md_test.go └── testdata │ ├── .hello.md │ ├── hello-correct.md │ ├── hello-more.md │ ├── hello.markdown │ ├── hello.md │ └── hello.txt ├── merrors └── merrors.go └── version ├── .gitignore ├── api.go ├── scripts └── gen.go └── types.go /.github/ISSUE_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | - With issues: 2 | - Use the search tool before opening a new issue. 3 | - Please provide source code and commit sha if you found a bug. 4 | - Review existing issues and provide feedback or react to them. 5 | 6 | ## Description 7 | 8 | 9 | 10 | ## How to reproduce 11 | 12 | 13 | 14 | TODO 15 | 16 | ## Expectations 17 | 18 | 19 | 20 | TODO 21 | 22 | ## Actual result 23 | 24 | 25 | 26 | TODO 27 | 28 | ## Environment 29 | 30 | - go version: 31 | - operating system: 32 | - version (or commit ref): 33 | -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | - With pull requests: 2 | - Open your pull request against `master` 3 | - Your pull request should have no more than two commits, if not you should squash them. 4 | - It should pass all tests in the available continuous integration systems such as GitHub Actions. 5 | - You should add/modify tests to cover your proposed code changes. 6 | - If your pull request contains a new feature, please document it on the README. 7 | 8 | -------------------------------------------------------------------------------- /.github/workflows/release.yaml: -------------------------------------------------------------------------------- 1 | # Reference from: 2 | # https://goreleaser.com/ci/actions/ 3 | name: Release 4 | on: 5 | push: 6 | tags: 7 | - "v*" 8 | permissions: 9 | contents: write 10 | jobs: 11 | goreleaser: 12 | runs-on: ubuntu-latest 13 | steps: 14 | - name: Checkout 15 | uses: actions/checkout@v2 16 | with: 17 | fetch-depth: 0 18 | - name: Set up Go 19 | uses: actions/setup-go@v2 20 | with: 21 | go-version: 1.17 22 | - name: Login to Docker Hub 23 | if: startsWith(github.ref, 'refs/tags/v') 24 | uses: docker/login-action@v1 25 | with: 26 | username: ${{ secrets.DOCKER_USERNAME }} 27 | password: ${{ secrets.DOCKER_PASSWORD }} 28 | # - name: Login to GitHub Container Registry 29 | # if: startsWith(github.ref, 'refs/tags/v') 30 | # uses: docker/login-action@v1 31 | # with: 32 | # registry: ghcr.io 33 | # username: ${{ github.actor }} 34 | # password: ${{ secrets.GITHUB_TOKEN }} 35 | # TODO: default GITHUB_TOKEN insufficient permissions 36 | - name: Run GoReleaser 37 | uses: goreleaser/goreleaser-action@v2 38 | with: 39 | # either 'goreleaser' (default) or 'goreleaser-pro' 40 | distribution: goreleaser 41 | version: latest 42 | args: release --rm-dist 43 | env: 44 | GITHUB_TOKEN: ${{ secrets.GH_PAT }} 45 | # Your GoReleaser Pro key, if you are using the 'goreleaser-pro' distribution 46 | # GORELEASER_KEY: ${{ secrets.GORELEASER_KEY }} -------------------------------------------------------------------------------- /.github/workflows/test.yaml: -------------------------------------------------------------------------------- 1 | # Reference from: 2 | # https://github.com/c-bata/go-prompt/blob/master/.github/workflows/test.yml 3 | name: Test 4 | on: 5 | pull_request: 6 | branches: 7 | - master 8 | push: 9 | branches: 10 | - master 11 | 12 | jobs: 13 | test: 14 | name: Unit tests with coverage 15 | runs-on: ${{ matrix.os }} 16 | strategy: 17 | matrix: 18 | os: [ubuntu-latest] 19 | steps: 20 | - name: Set up Go 1.17 21 | uses: actions/setup-go@v2 22 | with: 23 | go-version: 1.17 24 | id: go 25 | - name: Check out code into the Go module directory 26 | uses: actions/checkout@master 27 | - name: Running go tests with coverage 28 | env: 29 | GO111MODULE: on 30 | run: make cover 31 | - name: Send coverage 32 | uses: shogo82148/actions-goveralls@v1 33 | with: 34 | path-to-profile: coverage.out 35 | lint: 36 | name: Lint checks 37 | runs-on: ubuntu-latest 38 | steps: 39 | - name: Set up Go 1.17 40 | uses: actions/setup-go@v2 41 | with: 42 | go-version: 1.17 43 | id: go 44 | - name: Check out code into the Go module directory 45 | uses: actions/checkout@master 46 | - name: Download golangci-lint 47 | run: | 48 | wget https://github.com/golangci/golangci-lint/releases/download/v1.41.0/golangci-lint-1.41.0-linux-amd64.tar.gz 49 | tar -xvf ./golangci-lint-1.41.0-linux-amd64.tar.gz 50 | - name: Running golangci-lint 51 | env: 52 | GO111MODULE: on 53 | GOPATH: /home/runner/work/ 54 | run: GOLINTER=./golangci-lint-1.41.0-linux-amd64/golangci-lint make lint -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | dist/ 2 | build/ 3 | coverage.out 4 | tmp/ 5 | __debug_bin 6 | .vscode/ -------------------------------------------------------------------------------- /.golangci.yml: -------------------------------------------------------------------------------- 1 | # This file contains all available configuration options 2 | # with their default values. 3 | # For complete .golangci.yml configuration, reference: https://golangci-lint.run/usage/configuration/#config-file 4 | 5 | # options for analysis running 6 | run: 7 | timeout: 10m 8 | 9 | linters: 10 | disable-all: true 11 | enable: # please keep this alphabetized 12 | # Don't use soon to deprecated[1] linters that lead to false 13 | # https://github.com/golangci/golangci-lint/issues/1841 14 | # - deadcode 15 | # - structcheck 16 | # - varcheck 17 | - ineffassign 18 | - staticcheck 19 | - unused 20 | - gosimple 21 | - errcheck 22 | - govet 23 | - gofumpt 24 | - bodyclose 25 | - depguard 26 | - dogsled 27 | - dupl 28 | - exportloopref 29 | - exhaustive 30 | - goconst 31 | - gocritic 32 | # - gomnd 33 | # - gosec 34 | - misspell 35 | - nolintlint 36 | - prealloc 37 | - predeclared 38 | - revive 39 | - stylecheck 40 | - thelper 41 | - tparallel 42 | - typecheck 43 | - unconvert 44 | - unparam 45 | - whitespace 46 | - wsl 47 | 48 | linters-settings: 49 | gofumpt: 50 | # Select the Go version to target. The default is `1.15`. 51 | lang-version: "1.17" 52 | # Choose whether or not to use the extra rules that are disabled 53 | # by default 54 | extra-rules: false -------------------------------------------------------------------------------- /.goreleaser.yml: -------------------------------------------------------------------------------- 1 | # This is an example .goreleaser.yml file with some sane defaults. 2 | # Make sure to check the documentation at http://goreleaser.com 3 | before: 4 | hooks: 5 | # You may remove this if you don't use go modules. 6 | - go mod tidy 7 | - make gen-version 8 | builds: 9 | - env: 10 | - CGO_ENABLED=0 11 | goos: 12 | - linux 13 | - windows 14 | - darwin 15 | # 使用 ldflags="-s -w" 去掉符号表和调试信息,以减少发布包的大小 16 | ldflags: 17 | - -s -w 18 | # upx 在部分 Mac 系统中会出现 killed 的报错,二进制无法正常工作,暂时不使用 19 | # hooks: 20 | # post: 21 | # - upx -9 "{{ .Path }}" 22 | # upx 在 windows amd64 上会报错,暂时不用 23 | # ignore: 24 | # - goos: windows 25 | # goarch: arm64 26 | main: ./cmd/mdfmt 27 | archives: 28 | - id: foo 29 | name_template: >- 30 | {{ .ProjectName }}_ 31 | {{- title .Os }}_ 32 | {{- if eq .Arch "amd64" }}x86_64 33 | {{- else if eq .Arch "386" }}i386 34 | {{- else }}{{ .Arch }}{{ end }} 35 | checksum: 36 | name_template: 'checksums.txt' 37 | snapshot: 38 | name_template: "{{ .Tag }}-next" 39 | changelog: 40 | sort: desc 41 | filters: 42 | exclude: 43 | - '^docs:' 44 | - '^test:' 45 | 46 | release: 47 | github: 48 | owner: elliotxx 49 | name: mdfmt 50 | draft: false 51 | footer: | 52 | ## Docker Images 53 | * `elliotxx/mdfmt:{{ .Tag }}` 54 | * `elliotxx/mdfmt:{{ .Tag }}-arm64` 55 | 56 | ## Thanks! 57 | 58 | dockers: 59 | - image_templates: 60 | - 'elliotxx/{{ .ProjectName }}:{{ .Tag }}' 61 | - 'elliotxx/{{ .ProjectName }}:latest' 62 | # - 'ghcr.io/elliotxx/{{ .ProjectName }}:{{ .Tag }}' 63 | # - 'ghcr.io/elliotxx/{{ .ProjectName }}:latest' 64 | dockerfile: Dockerfile 65 | use: docker 66 | build_flag_templates: 67 | - "--pull" 68 | - "--label=org.opencontainers.image.created={{.Date}}" 69 | - "--label=org.opencontainers.image.name={{.ProjectName}}" 70 | - "--label=org.opencontainers.image.revision={{.FullCommit}}" 71 | - "--label=org.opencontainers.image.version={{.Version}}" 72 | - "--label=org.opencontainers.image.source={{.GitURL}}" 73 | - "--platform=linux/amd64" 74 | - image_templates: 75 | - 'elliotxx/{{ .ProjectName }}:{{ .Tag }}-arm64' 76 | # - 'ghcr.io/elliotxx/{{ .ProjectName }}:{{ .Tag }}-arm64' 77 | dockerfile: Dockerfile 78 | use: docker 79 | build_flag_templates: 80 | - "--pull" 81 | - "--label=org.opencontainers.image.created={{.Date}}" 82 | - "--label=org.opencontainers.image.name={{.ProjectName}}" 83 | - "--label=org.opencontainers.image.revision={{.FullCommit}}" 84 | - "--label=org.opencontainers.image.version={{.Version}}" 85 | - "--label=org.opencontainers.image.source={{.GitURL}}" 86 | - "--platform=linux/arm64" 87 | goarch: arm64 88 | 89 | brews: 90 | - tap: 91 | owner: elliotxx 92 | name: homebrew-tap 93 | # token: "{{ .Env.HOMEBREW_TAP_GITHUB_TOKEN }}" 94 | 95 | url_template: "https://github.com/elliotxx/mdfmt/releases/download/{{ .Tag }}/{{ .ArtifactName }}" 96 | download_strategy: CurlDownloadStrategy 97 | 98 | # Git author used to commit to the repository. 99 | # Defaults are shown. 100 | commit_author: 101 | name: GoReleaser Bot 102 | email: goreleaser@carlosbecker.com 103 | 104 | folder: HomebrewFormula 105 | homepage: "https://github.com/elliotxx/mdfmt" 106 | description: "A Markdown formatter that follow the CommonMark. Like gofmt, but for Markdown." 107 | license: "MIT" 108 | skip_upload: false 109 | test: | 110 | system "#{bin}/mdfmt -V" 111 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. 6 | 7 | ## Our Standards 8 | 9 | Examples of behavior that contributes to creating a positive environment include: 10 | 11 | * Using welcoming and inclusive language 12 | * Being respectful of differing viewpoints and experiences 13 | * Gracefully accepting constructive criticism 14 | * Focusing on what is best for the community 15 | * Showing empathy towards other community members 16 | 17 | Examples of unacceptable behavior by participants include: 18 | 19 | * The use of sexualized language or imagery and unwelcome sexual attention or advances 20 | * Trolling, insulting/derogatory comments, and personal or political attacks 21 | * Public or private harassment 22 | * Publishing others' private information, such as a physical or electronic address, without explicit permission 23 | * Other conduct which could reasonably be considered inappropriate in a professional setting 24 | 25 | ## Our Responsibilities 26 | 27 | Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. 28 | 29 | Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. 30 | 31 | ## Scope 32 | 33 | This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. 34 | 35 | ## Enforcement 36 | 37 | Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at [yiyu2017@qq.com](mailto:yiyu2017@qq.com). The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. 38 | 39 | Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. 40 | 41 | ## Attribution 42 | 43 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] 44 | 45 | [homepage]: http://contributor-covenant.org 46 | [version]: http://contributor-covenant.org/version/1/4/ 47 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | ## Contributing 2 | 3 | - With issues: 4 | 5 | - Use the search tool before opening a new issue. 6 | - Please provide source code and commit sha if you found a bug. 7 | - Review existing issues and provide feedback or react to them. 8 | - With pull requests: 9 | 10 | - Open your pull request against `master` 11 | - Your pull request should have no more than two commits, if not you should squash them. 12 | - It should pass all tests in the available continuous integration systems such as GitHub Actions. 13 | - You should add/modify tests to cover your proposed code changes. 14 | - If your pull request contains a new feature, please document it on the README. 15 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM ubuntu:18.04 AS runtime 2 | WORKDIR /app 3 | # GoReleaser will automatically generate the binary in the root directory 4 | COPY /mdfmt . 5 | ENTRYPOINT ["./mdfmt"] -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 杨英明 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 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | GOSOURCE_PATHS ?= ./pkg/md/... 2 | 3 | include go.mk 4 | 5 | 6 | .PHONY: gen-version 7 | gen-version: ## Update version 8 | cd pkg/version/scripts && go run gen.go 9 | 10 | .PHONY: clean 11 | clean: ## Clean build bundles 12 | -rm -rf ./build 13 | 14 | .PHONY: build-all 15 | build-all: build-darwin build-linux build-windows ## Build all platforms 16 | 17 | .PHONY: build-darwin 18 | build-darwin: gen-version ## Build for MacOS 19 | -rm -rf ./build/darwin 20 | GOOS=darwin GOARCH=amd64 CGO_ENABLED=0 \ 21 | go build -o ./build/darwin/$(APPROOT) \ 22 | ./cmd/mdfmt 23 | 24 | .PHONY: build-linux 25 | build-linux: gen-version ## Build for Linux 26 | -rm -rf ./build/linux 27 | GOOS=linux GOARCH=amd64 CGO_ENABLED=0 \ 28 | go build -o ./build/linux/$(APPROOT) \ 29 | ./cmd/mdfmt 30 | 31 | .PHONY: build-windows 32 | build-windows: gen-version ## Build for Windows 33 | -rm -rf ./build/windows 34 | GOOS=windows GOARCH=amd64 CGO_ENABLED=0 \ 35 | go build -o ./build/windows/$(APPROOT).exe \ 36 | ./cmd/mdfmt 37 | -------------------------------------------------------------------------------- /README-zh.md: -------------------------------------------------------------------------------- 1 | ## 简介 2 | 3 | [![GitHub release](https://img.shields.io/github/release/elliotxx/mdfmt.svg)](https://github.com/elliotxx/mdfmt/releases) 4 | [![Github All Releases](https://img.shields.io/github/downloads/elliotxx/mdfmt/total.svg)](https://github.com/elliotxx/mdfmt/releases) 5 | [![docker pulls](https://img.shields.io/docker/pulls/elliotxx/mdfmt)](https://hub.docker.com/r/elliotxx/mdfmt) 6 | [![license](https://img.shields.io/github/license/elliotxx/mdfmt.svg)](https://github.com/elliotxx/mdfmt/blob/master/LICENSE) 7 | [![Go Reference](https://pkg.go.dev/badge/github.com/elliotxx/mdfmt.svg)](https://pkg.go.dev/github.com/elliotxx/mdfmt) 8 | [![Coverage Status](https://coveralls.io/repos/github/elliotxx/mdfmt/badge.svg)](https://coveralls.io/github/elliotxx/mdfmt) 9 | [![gitmoji](https://img.shields.io/badge/gitmoji-%20😜%20😍-FFDD67.svg?style=flat-square)](https://gitmoji.dev) 10 | 11 | > 💡 一款 Markdown 格式化工具,和 gofmt 比较类似,不过格式化的对象是 Markdown 文本 12 | 13 |

14 | 15 |

16 | 17 | 最近在频繁用 Markdown 写文档,内容一多就不好管理格式,经常看到一坨坨的 Markdown 内容挤在一起,导致有强迫症的我的眉头也经常挤在一起。 18 | 19 | 好在发现了强大的结构化的 Markdown 引擎 [lute](https://github.com/88250/lute),它对中文语境的支持也很好,于是借助 lute 引擎开发了这款 Markdown 格式化命令行工具 [mdfmt](https://github.com/elliotxx/mdfmt),欢迎大家试用 👏🏻 20 | 21 | ## 📜 语言 22 | 23 | [English](https://github.com/elliotxx/mdfmt/blob/master/README.md) | [简体中文](https://github.com/elliotxx/mdfmt/blob/master/README-zh.md) 24 | 25 | ## ✨ 特性 26 | 27 | * 支持多种输入:标准输入、文件、目录、通配符,其中指定目录会递归格式化目录下所有 Markdown 文件 28 | * 支持重写:将结果写入(源)文件而不是标准输出 29 | * 支持显示差异:显示 Markdown 格式化前后的差异(diff),而不是重写文件 30 | * 支持列出格式化的文件 31 | * 跨平台:Linux, Windows, Mac 32 | * 一键安装:支持通过 `Homebrew`、`go install` 等方式一键安装 `mdfmt` 33 | 34 | ## 🛠️ 安装 35 | 36 | ### 二进制安装(跨平台: windows, linux, mac ...) 37 | 38 | 从二进制安装,只需从 `mdfmt` 的 [发布页面](https://github.com/elliotxx/mdfmt/releases) 下载对应平台的二进制文件,然后将二进制文件放在命令行能访问到的目录中即可。 39 | 40 | ### Homebrew 41 | 42 | `elliotxx/tap` 有 MacOS 和 GNU/Linux 的预编译二进制版本可用: 43 | 44 | ``` 45 | brew install elliotxx/tap/mdfmt 46 | ``` 47 | 48 | ### 从源码构建 49 | 50 | 使用 Go 1.17+ 版本,你可以通过 `go install` 直接从源码安装 `mdfmt`: 51 | 52 | ``` 53 | go install github.com/elliotxx/mdfmt/cmd/mdfmt@latest 54 | ``` 55 | 56 | *注意*: 你将基于代码仓库最新的可用版本安装 `mdfmt`,尽管主分支的最新提交应该始终是一个稳定和可用的版本,但这不是安装和使用 `mdfmt` 的推荐方式。通过 `go install` 安装的 `mdfmt` 版本输出将显示默认版本号(default-version)。 57 | 58 | ### Docker 59 | 60 | Docker 用户可以用以下命令拉取 `mdfmt` 的镜像: 61 | 62 | ``` 63 | docker pull elliotxx/mdfmt 64 | ``` 65 | 66 | 验证: 67 | 68 | ```bash 69 | $ docker run --rm elliotxx/mdfmt:latest mdfmt -h 70 | ... 71 | $ docker run --rm elliotxx/mdfmt:latest mdfmt -V 72 | ... 73 | $ docker run -v $PWD:$PWD --rm elliotxx/mdfmt:latest mdfmt -d /Users/yym/workspace/mdfmt/pkg/md/testdata/hello-more.md 74 | diff -u /Users/yym/workspace/mdfmt/pkg/md/testdata/hello-more.md.orig /Users/yym/workspace/mdfmt/pkg/md/testdata/hello-more.md 75 | --- /Users/yym/workspace/mdfmt/pkg/md/testdata/hello-more.md.orig 76 | +++ /Users/yym/workspace/mdfmt/pkg/md/testdata/hello-more.md 77 | @@ -1,6 +1,7 @@ 78 | # hello 79 | + 80 | > hello 81 | 82 | -|name|age| 83 | -|--|--| 84 | -|Mike|18| 85 | +| name | age | 86 | +| ---- | --- | 87 | +| Mike | 18 | 88 | ``` 89 | 90 | ## ⚡ 使用 91 | 92 | ``` 93 | $ mdfmt -h 94 | A Markdown formatter that follow the CommonMark. Like gofmt, but for Markdown. 95 | 96 | Usage: 97 | mdfmt [flags] [path ...] 98 | 99 | Examples: 100 | # Format specified Markdown file, and write to stdout 101 | mdfmt README.md 102 | 103 | # Format and rewrite for specified Markdown file 104 | mdfmt -w README.md 105 | 106 | # Display diffs instead of rewriting Markdown files 107 | mdfmt -d README.md 108 | 109 | # List files whose formatting differs from mdfmt's 110 | mdfmt -l . 111 | 112 | # Format, rewrite, and display diffs for specified Markdown file 113 | mdfmt -d -w README.md 114 | 115 | # Format and rewrite all Markdown file in current directory 116 | mdfmt -w *.md 117 | 118 | # Recursive format and rewrite all Markdown file in current directory 119 | mdfmt -w . 120 | 121 | # Format and rewrite the specified Markdown file and directory 122 | mdfmt -w README.md testdir/ 123 | 124 | # Format stdin to stdout 125 | cat README.md | mdfmt 126 | 127 | # Show version info 128 | mdfmt -V 129 | 130 | Flags: 131 | -d, --diff display diffs instead of rewriting files 132 | -h, --help help for mdfmt 133 | -l, --list list files whose formatting differs from mdfmt's 134 | -V, --version show version info 135 | -w, --write write result to (source) file instead of stdout 136 | ``` 137 | 138 | ## 🙏 感谢 139 | 140 | * Markdown 引擎使用 [88250/lute](https://github.com/88250/lute), 很酷! 141 | * 命令行工具模板来自 [elliotxx/go-cli-prototype](https://github.com/elliotxx/go-cli-prototype) 142 | * Markdown 规范遵循 [GFM](https://github.github.com/gfm/)/[CommonMark](https://commonmark.org/) 143 | * 使用 [gitmoji-cli](https://github.com/carloscuesta/gitmoji-cli) 提交漂亮的 git commit message 144 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Introduction 2 | 3 | [![GitHub release](https://img.shields.io/github/release/elliotxx/mdfmt.svg)](https://github.com/elliotxx/mdfmt/releases) 4 | [![Github All Releases](https://img.shields.io/github/downloads/elliotxx/mdfmt/total.svg)](https://github.com/elliotxx/mdfmt/releases) 5 | [![docker pulls](https://img.shields.io/docker/pulls/elliotxx/mdfmt)](https://hub.docker.com/r/elliotxx/mdfmt) 6 | [![license](https://img.shields.io/github/license/elliotxx/mdfmt.svg)](https://github.com/elliotxx/mdfmt/blob/master/LICENSE) 7 | [![Go Reference](https://pkg.go.dev/badge/github.com/elliotxx/mdfmt.svg)](https://pkg.go.dev/github.com/elliotxx/mdfmt) 8 | [![Coverage Status](https://coveralls.io/repos/github/elliotxx/mdfmt/badge.svg)](https://coveralls.io/github/elliotxx/mdfmt) 9 | [![gitmoji](https://img.shields.io/badge/gitmoji-%20😜%20😍-FFDD67.svg?style=flat-square)](https://gitmoji.dev) 10 | 11 | > 💡 A Markdown formatter that follow the CommonMark. Like gofmt, but for Markdown. 12 | 13 |

14 | 15 |

16 | 17 | Recently, I have frequently used Markdown to write documents, and it is difficult to manage the format when there are too many contents. I often see lumps of markdown contents crowded together, it caused my eyebrows to be crowded together. 18 | 19 | Fortunately, the powerful structured Markdown engine [lute](https://github.com/88250/lute), its support for Chinese context is also very good, so I developed this Markdown formatting command line tool [mdfmt](https://github.com/elliotXX/mdfmt) with the lute engine, welcome everyone to try 👏🏻 20 | 21 | ## 📜️ Language 22 | 23 | [English](https://github.com/elliotxx/mdfmt/blob/master/README.md) | [简体中文](https://github.com/elliotxx/mdfmt/blob/master/README-zh.md) 24 | 25 | ## ✨ Features 26 | 27 | * **Support multiple inputs**: standard input, file, directory and wildcard. The specified directory will recursively format all markdown files under the directory 28 | * **Support Rewriting**: write the results to (source) files instead of standard output 29 | * **Support display difference**: display the difference before and after markdown formatting, Instead of rewriting files 30 | * **Support listing formatted files** 31 | * **Cross platform**: Linux, windows, Mac 32 | * **One-click installation**: support one-click installation `mdfmt` through `Homebrew`, `go install`, etc. 33 | 34 | ## 🛠️ Installation 35 | 36 | ### Binary (Cross-platform: windows, linux, mac ...) 37 | 38 | To get the binary just download the latest release for your OS/Arch from the [release page](https://github.com/elliotxx/mdfmt/releases) and put the binary somewhere convenient. 39 | 40 | ### Homebrew 41 | 42 | The `elliotxx/tap` has macOS and GNU/Linux pre-built binaries available: 43 | 44 | ``` 45 | brew install elliotxx/tap/mdfmt 46 | ``` 47 | 48 | ### Build from Source 49 | 50 | Starting with Go 1.17, you can install `mdfmt` from source using go install: 51 | 52 | ``` 53 | go install github.com/elliotxx/mdfmt/cmd/mdfmt@latest 54 | ``` 55 | 56 | *NOTE*: This will install `mdfmt` based on the latest available code base. Even though the goal is that the latest commit on the main branch should always be a stable and usable version, this is not the recommended way to install and use `mdfmt`. The version output will show `mdfmt` version (default-version) for go install based builds. 57 | 58 | ### Docker 59 | 60 | Docker users can use the following commands to pull the latest image of the `mdfmt`: 61 | 62 | ``` 63 | docker pull elliotxx/mdfmt 64 | ``` 65 | 66 | Verification: 67 | 68 | ```bash 69 | $ docker run --rm elliotxx/mdfmt:latest mdfmt -h 70 | ... 71 | $ docker run --rm elliotxx/mdfmt:latest mdfmt -V 72 | ... 73 | $ docker run -v $PWD:$PWD --rm elliotxx/mdfmt:latest mdfmt -d /Users/yym/workspace/mdfmt/pkg/md/testdata/hello-more.md 74 | diff -u /Users/yym/workspace/mdfmt/pkg/md/testdata/hello-more.md.orig /Users/yym/workspace/mdfmt/pkg/md/testdata/hello-more.md 75 | --- /Users/yym/workspace/mdfmt/pkg/md/testdata/hello-more.md.orig 76 | +++ /Users/yym/workspace/mdfmt/pkg/md/testdata/hello-more.md 77 | @@ -1,6 +1,7 @@ 78 | # hello 79 | + 80 | > hello 81 | 82 | -|name|age| 83 | -|--|--| 84 | -|Mike|18| 85 | +| name | age | 86 | +| ---- | --- | 87 | +| Mike | 18 | 88 | ``` 89 | 90 | ## ⚡ Usage 91 | 92 | ``` 93 | $ mdfmt -h 94 | A Markdown formatter that follow the CommonMark. Like gofmt, but for Markdown. 95 | 96 | Usage: 97 | mdfmt [flags] [path ...] 98 | 99 | Examples: 100 | # Format specified Markdown file, and write to stdout 101 | mdfmt README.md 102 | 103 | # Format and rewrite for specified Markdown file 104 | mdfmt -w README.md 105 | 106 | # Display diffs instead of rewriting Markdown files 107 | mdfmt -d README.md 108 | 109 | # List files whose formatting differs from mdfmt's 110 | mdfmt -l . 111 | 112 | # Format, rewrite, and display diffs for specified Markdown file 113 | mdfmt -d -w README.md 114 | 115 | # Format and rewrite all Markdown file in current directory 116 | mdfmt -w *.md 117 | 118 | # Recursive format and rewrite all Markdown file in current directory 119 | mdfmt -w . 120 | 121 | # Format and rewrite the specified Markdown file and directory 122 | mdfmt -w README.md testdir/ 123 | 124 | # Format stdin to stdout 125 | cat README.md | mdfmt 126 | 127 | # Show version info 128 | mdfmt -V 129 | 130 | Flags: 131 | -d, --diff display diffs instead of rewriting files 132 | -h, --help help for mdfmt 133 | -l, --list list files whose formatting differs from mdfmt's 134 | -V, --version show version info 135 | -w, --write write result to (source) file instead of stdout 136 | ``` 137 | 138 | ## 🙏 Thanks 139 | 140 | * The Markdown engine uses [lute](https://github.com/88250/lute), cool! 141 | * The CLI Template uses [elliotxx/go-cli-prototype](https://github.com/elliotxx/go-cli-prototype) 142 | * The specification follows [GFM](https://github.github.com/gfm/)/[CommonMark](https://commonmark.org/) 143 | * Pretty git commit message using [gitmoji-cli](https://github.com/carloscuesta/gitmoji-cli) -------------------------------------------------------------------------------- /assets/demo.cast: -------------------------------------------------------------------------------- 1 | {"version": 2, "width": 88, "height": 24, "timestamp": 1645759874, "env": {"SHELL": "/bin/zsh", "TERM": "xterm-256color"}} 2 | [0.410217, "o", "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r\u001b]2;yym@B-K3YJLVDL-1650: ~/workspace/tmp/markdown-test\u0007\u001b]1;..markdown-test\u0007"] 3 | [0.445401, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[32m➜\u001b[32m\u001b[1m\u001b[32m \u001b[35m\u001b[1m\u001b[35m\u001b[34m\u001b[1m\u001b[34mmarkdown-test \u001b[39m\u001b[0m\u001b[K"] 4 | [0.445575, "o", "\u001b[?1h\u001b="] 5 | [0.445681, "o", "\u001b[?2004h"] 6 | [0.471426, "o", "\r\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[32m➜\u001b[32m\u001b[1m\u001b[32m \u001b[35m\u001b[1m\u001b[35m\u001b[34m\u001b[1m\u001b[34mmarkdown-test \u001b[36m\u001b[1m\u001b[36m(master) \u001b[32m\u001b[1m\u001b[32m✔ \u001b[39m\u001b[0m\u001b[39m\u001b[0m\u001b[K"] 7 | [1.044688, "o", "m"] 8 | [1.045393, "o", "\bm\u001b[90mdfmt *.md\u001b[39m\u001b[9D"] 9 | [1.169938, "o", "\bm\u001b[39md"] 10 | [1.367507, "o", "\u001b[39mf"] 11 | [1.471261, "o", "\u001b[39mm"] 12 | [1.569847, "o", "\u001b[39mt"] 13 | [1.720851, "o", "\u001b[39m "] 14 | [2.235258, "o", "\u001b[39m-\u001b[39m \u001b[39m \u001b[39m \b\b\b"] 15 | [2.237562, "o", "\u001b[90mh\u001b[39m\b"] 16 | [2.405855, "o", "\u001b[39mh"] 17 | [2.661203, "o", "\u001b[?1l\u001b>"] 18 | [2.661329, "o", "\u001b[?2004l\r\r\n"] 19 | [2.662689, "o", "\u001b]2;mdfmt -h\u0007\u001b]1;mdfmt\u0007"] 20 | [2.676523, "o", "A Markdown formatter that follow the CommonMark. Like gofmt, but for Markdown.\r\n\r\n"] 21 | [2.677035, "o", "Usage:\r\n mdfmt [flags] [path ...]\r\n\r\nExamples:\r\n # Format specified Markdown file, and write to stdout\r\n mdfmt README.md\r\n \r\n # Format and rewrite for specified Markdown file\r\n mdfmt -w README.md\r\n \r\n # Display diffs instead of rewriting Markdown files\r\n mdfmt -d README.md\r\n \r\n # List files whose formatting differs from mdfmt's\r\n mdfmt -l .\r\n \r\n # Format, rewrite, and display diffs for specified Markdown file\r\n mdfmt -d -w README.md\r\n \r\n # Format and rewrite all Markdown file in current directory\r\n mdfmt -w *.md\r\n \r\n # Recursive format and rewrite all Markdown file in current directory\r\n mdfmt -w .\r\n \r\n # Format and rewrite the specified Markdown file and directory\r\n mdfmt -w README.md testdir/\r\n \r\n # Format stdin to stdout\r\n cat README.md | mdfmt\r\n \r\n # Show version info\r\n mdfmt -V\r\n\r\nFlags:\r\n -d, --diff display diffs instead of rewriting files\r\n -h, --help help for mdfmt\r\n -l, --list list files whose formatting differs from mdfmt's\r\n -v, --verbose verbose l"] 22 | [2.677151, "o", "ogging\r\n -V, --version show version info\r\n -w, --write write result to (source) file instead of stdout\r\n"] 23 | [2.67795, "o", "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r"] 24 | [2.678076, "o", "\u001b]2;yym@B-K3YJLVDL-1650: ~/workspace/tmp/markdown-test\u0007"] 25 | [2.678225, "o", "\u001b]1;..markdown-test\u0007"] 26 | [2.707555, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[32m➜\u001b[32m\u001b[1m\u001b[32m \u001b[35m\u001b[1m\u001b[35m\u001b[34m\u001b[1m\u001b[34mmarkdown-test \u001b[36m\u001b[1m\u001b[36m(master) \u001b[32m\u001b[1m\u001b[32m✔ \u001b[39m\u001b[0m\u001b[39m\u001b[0m\u001b[K"] 27 | [2.707682, "o", "\u001b[?1h\u001b="] 28 | [2.707815, "o", "\u001b[?2004h"] 29 | [2.739623, "o", "\r\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[32m➜\u001b[32m\u001b[1m\u001b[32m \u001b[35m\u001b[1m\u001b[35m\u001b[34m\u001b[1m\u001b[34mmarkdown-test \u001b[36m\u001b[1m\u001b[36m(master) \u001b[32m\u001b[1m\u001b[32m✔ \u001b[39m\u001b[0m\u001b[39m\u001b[0m\u001b[K"] 30 | [3.699275, "o", "c"] 31 | [3.701336, "o", "\bc\u001b[90mlear\u001b[39m\b\b\b\b"] 32 | [3.820993, "o", "\bc\u001b[39ml"] 33 | [3.924909, "o", "\u001b[39me"] 34 | [4.045598, "o", "\u001b[39ma"] 35 | [4.068852, "o", "\u001b[39mr"] 36 | [4.610349, "o", "\u001b[?1l\u001b>"] 37 | [4.61052, "o", "\u001b[?2004l\r\r\n"] 38 | [4.611374, "o", "\u001b]2;clear\u0007\u001b]1;clear\u0007"] 39 | [4.614062, "o", "\u001b[H\u001b[2J"] 40 | [4.614428, "o", "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r"] 41 | [4.614523, "o", "\u001b]2;yym@B-K3YJLVDL-1650: ~/workspace/tmp/markdown-test\u0007"] 42 | [4.614621, "o", "\u001b]1;..markdown-test\u0007"] 43 | [4.644083, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[32m➜\u001b[32m\u001b[1m\u001b[32m \u001b[35m\u001b[1m\u001b[35m\u001b[34m\u001b[1m\u001b[34mmarkdown-test \u001b[36m\u001b[1m\u001b[36m(master) \u001b[32m\u001b[1m\u001b[32m✔ \u001b[39m\u001b[0m\u001b[39m\u001b[0m\u001b[K"] 44 | [4.64422, "o", "\u001b[?1h\u001b="] 45 | [4.644307, "o", "\u001b[?2004h"] 46 | [4.671785, "o", "\r\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[32m➜\u001b[32m\u001b[1m\u001b[32m \u001b[35m\u001b[1m\u001b[35m\u001b[34m\u001b[1m\u001b[34mmarkdown-test \u001b[36m\u001b[1m\u001b[36m(master) \u001b[32m\u001b[1m\u001b[32m✔ \u001b[39m\u001b[0m\u001b[39m\u001b[0m\u001b[K"] 47 | [5.073986, "o", "#"] 48 | [5.075798, "o", "\b#\u001b[90m File or directory as input\u001b[39m\u001b[27D"] 49 | [5.478664, "o", "\b#\u001b[39m "] 50 | [7.01083, "o", "\u001b[39mS\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[25D"] 51 | [7.012598, "o", "\u001b[90mtdin as input\u001b[39m\u001b[13D"] 52 | [7.214177, "o", "\u001b[39mt"] 53 | [7.461559, "o", "\u001b[39md"] 54 | [8.046507, "o", "\u001b[39mi\u001b[39mn\u001b[39m \u001b[39ma\u001b[39ms\u001b[39m \u001b[39mi\u001b[39mn\u001b[39mp\u001b[39mu\u001b[39mt"] 55 | [8.449235, "o", "\u001b[?1l\u001b>"] 56 | [8.449521, "o", "\u001b[?2004l\r\r\n"] 57 | [8.450677, "o", "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r"] 58 | [8.450857, "o", "\u001b]2;yym@B-K3YJLVDL-1650: ~/workspace/tmp/markdown-test\u0007\u001b]1;..markdown-test\u0007"] 59 | [8.483623, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[32m➜\u001b[32m\u001b[1m\u001b[32m \u001b[35m\u001b[1m\u001b[35m\u001b[34m\u001b[1m\u001b[34mmarkdown-test \u001b[36m\u001b[1m\u001b[36m(master) \u001b[32m\u001b[1m\u001b[32m✔ \u001b[39m\u001b[0m\u001b[39m\u001b[0m\u001b[K"] 60 | [8.48378, "o", "\u001b[?1h\u001b="] 61 | [8.483868, "o", "\u001b[?2004h"] 62 | [8.510702, "o", "\r\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[32m➜\u001b[32m\u001b[1m\u001b[32m \u001b[35m\u001b[1m\u001b[35m\u001b[34m\u001b[1m\u001b[34mmarkdown-test \u001b[36m\u001b[1m\u001b[36m(master) \u001b[32m\u001b[1m\u001b[32m✔ \u001b[39m\u001b[0m\u001b[39m\u001b[0m\u001b[K"] 63 | [9.864111, "o", "c"] 64 | [9.865651, "o", "\bc\u001b[90mlear\u001b[39m\b\b\b\b"] 65 | [10.007074, "o", "\bc\u001b[39ma\u001b[39m \u001b[39m \u001b[39m \b\b\b"] 66 | [10.008928, "o", "\u001b[90mt README.md | mdfmt\u001b[39m\u001b[19D"] 67 | [10.135243, "o", "\u001b[39mt"] 68 | [10.26511, "o", "\u001b[39m "] 69 | [10.481825, "o", "\u001b[39mR"] 70 | [10.590115, "o", "\u001b[39mE"] 71 | [11.156449, "o", "\u001b[39mA\u001b[39mD\u001b[39mM\u001b[39mE\u001b[39m.\u001b[39mm\u001b[39md\u001b[39m \u001b[39m|\u001b[39m \u001b[39mm\u001b[39md\u001b[39mf\u001b[39mm\u001b[39mt"] 72 | [11.420835, "o", "\u001b[?1l\u001b>"] 73 | [11.420963, "o", "\u001b[?2004l\r\r\n"] 74 | [11.421728, "o", "\u001b]2;ccat --bg=dark README.md | mdfmt\u0007\u001b]1;cat\u0007"] 75 | [11.436363, "o", "# Introduction\r\n\r\n> Hello\r\n\r\n| Name | Age |\r\n| ---- | --- |\r\n| Mike | 18 |\r\n"] 76 | [11.437368, "o", "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r"] 77 | [11.43749, "o", "\u001b]2;yym@B-K3YJLVDL-1650: ~/workspace/tmp/markdown-test\u0007\u001b]1;..markdown-test\u0007"] 78 | [11.466668, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[32m➜\u001b[32m\u001b[1m\u001b[32m \u001b[35m\u001b[1m\u001b[35m\u001b[34m\u001b[1m\u001b[34mmarkdown-test \u001b[36m\u001b[1m\u001b[36m(master) \u001b[32m\u001b[1m\u001b[32m✔ \u001b[39m\u001b[0m\u001b[39m\u001b[0m\u001b[K"] 79 | [11.466814, "o", "\u001b[?1h\u001b="] 80 | [11.466894, "o", "\u001b[?2004h"] 81 | [11.497589, "o", "\r\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[32m➜\u001b[32m\u001b[1m\u001b[32m \u001b[35m\u001b[1m\u001b[35m\u001b[34m\u001b[1m\u001b[34mmarkdown-test \u001b[36m\u001b[1m\u001b[36m(master) \u001b[32m\u001b[1m\u001b[32m✔ \u001b[39m\u001b[0m\u001b[39m\u001b[0m\u001b[K"] 82 | [13.349973, "o", "#"] 83 | [13.352423, "o", "\b#\u001b[90m Stdin as input\u001b[39m\u001b[15D"] 84 | [14.105066, "o", "\b#\u001b[39m "] 85 | [14.463587, "o", "\u001b[39mF\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[13D"] 86 | [14.465662, "o", "\u001b[90mile or directory as input\u001b[39m\u001b[25D"] 87 | [14.66449, "o", "\u001b[39mi"] 88 | [14.809609, "o", "\u001b[39ml"] 89 | [14.969474, "o", "\u001b[39me"] 90 | [15.33215, "o", "\u001b[39m \u001b[39mo\u001b[39mr\u001b[39m \u001b[39md\u001b[39mi\u001b[39mr\u001b[39me\u001b[39mc\u001b[39mt\u001b[39mo\u001b[39mr\u001b[39my\u001b[39m \u001b[39ma\u001b[39ms\u001b[39m \u001b[39mi\u001b[39mn\u001b[39mp\u001b[39mu\u001b[39mt"] 91 | [15.876924, "o", "\u001b[?1l\u001b>"] 92 | [15.87707, "o", "\u001b[?2004l\r\r\n"] 93 | [15.877875, "o", "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r"] 94 | [15.878037, "o", "\u001b]2;yym@B-K3YJLVDL-1650: ~/workspace/tmp/markdown-test\u0007\u001b]1;..markdown-test\u0007"] 95 | [15.914643, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[32m➜\u001b[32m\u001b[1m\u001b[32m \u001b[35m\u001b[1m\u001b[35m\u001b[34m\u001b[1m\u001b[34mmarkdown-test \u001b[36m\u001b[1m\u001b[36m(master) \u001b[32m\u001b[1m\u001b[32m✔ \u001b[39m\u001b[0m\u001b[39m\u001b[0m\u001b[K"] 96 | [15.914818, "o", "\u001b[?1h\u001b="] 97 | [15.914919, "o", "\u001b[?2004h"] 98 | [15.950593, "o", "\r\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[32m➜\u001b[32m\u001b[1m\u001b[32m \u001b[35m\u001b[1m\u001b[35m\u001b[34m\u001b[1m\u001b[34mmarkdown-test \u001b[36m\u001b[1m\u001b[36m(master) \u001b[32m\u001b[1m\u001b[32m✔ \u001b[39m\u001b[0m\u001b[39m\u001b[0m\u001b[K"] 99 | [17.380982, "o", "m"] 100 | [17.383207, "o", "\bm\u001b[90mdfmt -h\u001b[39m\b\b\b\b\b\b\b"] 101 | [17.514007, "o", "\bm\u001b[39md"] 102 | [17.80198, "o", "\u001b[39mf"] 103 | [17.880583, "o", "\u001b[39mm"] 104 | [18.027222, "o", "\u001b[39mt"] 105 | [18.153236, "o", "\u001b[39m "] 106 | [18.414965, "o", "\u001b[39mR\u001b[39m \b"] 107 | [18.417171, "o", "\u001b[90mEADME.md\u001b[39m\u001b[8D"] 108 | [18.506037, "o", "\u001b[39mE"] 109 | [18.745917, "o", "\u001b[39mA\u001b[39mD\u001b[39mM\u001b[39mE\u001b[39m.\u001b[39mm\u001b[39md\u001b[1m \u001b[0m"] 110 | [19.509175, "o", "\b\u001b[0m \b"] 111 | [19.509441, "o", "\u001b[?1l\u001b>"] 112 | [19.509576, "o", "\u001b[?2004l\r\r\n"] 113 | [19.510685, "o", "\u001b]2;mdfmt README.md\u0007\u001b]1;mdfmt\u0007"] 114 | [19.526195, "o", "# Introduction\r\n\r\n> Hello\r\n\r\n| Name | Age |\r\n| ---- | --- |\r\n| Mike | 18 |\r\n"] 115 | [19.527059, "o", "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r"] 116 | [19.527182, "o", "\u001b]2;yym@B-K3YJLVDL-1650: ~/workspace/tmp/markdown-test\u0007\u001b]1;..markdown-test\u0007"] 117 | [19.557452, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[32m➜\u001b[32m\u001b[1m\u001b[32m \u001b[35m\u001b[1m\u001b[35m\u001b[34m\u001b[1m\u001b[34mmarkdown-test \u001b[36m\u001b[1m\u001b[36m(master) \u001b[32m\u001b[1m\u001b[32m✔ \u001b[39m\u001b[0m\u001b[39m\u001b[0m\u001b[K"] 118 | [19.557636, "o", "\u001b[?1h\u001b=\u001b[?2004h"] 119 | [19.58649, "o", "\r\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[32m➜\u001b[32m\u001b[1m\u001b[32m \u001b[35m\u001b[1m\u001b[35m\u001b[34m\u001b[1m\u001b[34mmarkdown-test \u001b[36m\u001b[1m\u001b[36m(master) \u001b[32m\u001b[1m\u001b[32m✔ \u001b[39m\u001b[0m\u001b[39m\u001b[0m\u001b[K"] 120 | [20.21706, "o", "m"] 121 | [20.218852, "o", "\bm\u001b[90mdfmt README.md\u001b[39m\u001b[14D"] 122 | [20.417006, "o", "\bm\u001b[39md"] 123 | [20.633932, "o", "\u001b[39mf"] 124 | [20.745853, "o", "\u001b[39mm"] 125 | [20.849617, "o", "\u001b[39mt"] 126 | [20.993222, "o", "\u001b[39m "] 127 | [21.604905, "o", "\u001b[39m.\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[8D"] 128 | [21.829391, "o", "\u001b[?1l\u001b>"] 129 | [21.829558, "o", "\u001b[?2004l\r\r\n"] 130 | [21.830602, "o", "\u001b]2;mdfmt .\u0007\u001b]1;mdfmt\u0007"] 131 | [21.848123, "o", "# Introduction\r\n\r\n> Hello\r\n\r\n| Name | Age |\r\n| ---- | --- |\r\n| Mike | 18 |\r\n"] 132 | [21.849162, "o", "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r"] 133 | [21.849275, "o", "\u001b]2;yym@B-K3YJLVDL-1650: ~/workspace/tmp/markdown-test\u0007\u001b]1;..markdown-test\u0007"] 134 | [21.882715, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[32m➜\u001b[32m\u001b[1m\u001b[32m \u001b[35m\u001b[1m\u001b[35m\u001b[34m\u001b[1m\u001b[34mmarkdown-test \u001b[36m\u001b[1m\u001b[36m(master) \u001b[32m\u001b[1m\u001b[32m✔ \u001b[39m\u001b[0m\u001b[39m\u001b[0m\u001b[K"] 135 | [21.882866, "o", "\u001b[?1h\u001b="] 136 | [21.882974, "o", "\u001b[?2004h"] 137 | [21.909648, "o", "\r\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[32m➜\u001b[32m\u001b[1m\u001b[32m \u001b[35m\u001b[1m\u001b[35m\u001b[34m\u001b[1m\u001b[34mmarkdown-test \u001b[36m\u001b[1m\u001b[36m(master) \u001b[32m\u001b[1m\u001b[32m✔ \u001b[39m\u001b[0m\u001b[39m\u001b[0m\u001b[K"] 138 | [22.398821, "o", "m"] 139 | [22.400994, "o", "\bm\u001b[90mdfmt .\u001b[39m\b\b\b\b\b\b"] 140 | [22.8472, "o", "\bm\u001b[39md"] 141 | [23.112106, "o", "\u001b[39mf"] 142 | [23.225876, "o", "\u001b[39mm"] 143 | [23.313836, "o", "\u001b[39mt"] 144 | [23.468922, "o", "\u001b[39m "] 145 | [24.42486, "o", "\u001b[39m*"] 146 | [24.426909, "o", "\u001b[90m.md\u001b[39m\b\b\b"] 147 | [24.709089, "o", "\u001b[39m."] 148 | [24.968196, "o", "\u001b[39mm"] 149 | [25.0819, "o", "\u001b[39md"] 150 | [25.389876, "o", "\u001b[?1l\u001b>"] 151 | [25.390061, "o", "\u001b[?2004l\r\r\n"] 152 | [25.391013, "o", "\u001b]2;mdfmt *.md\u0007\u001b]1;mdfmt\u0007"] 153 | [25.407013, "o", "# Introduction\r\n\r\n> Hello\r\n\r\n| Name | Age |\r\n| ---- | --- |\r\n| Mike | 18 |\r\n"] 154 | [25.408127, "o", "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r"] 155 | [25.408243, "o", "\u001b]2;yym@B-K3YJLVDL-1650: ~/workspace/tmp/markdown-test\u0007\u001b]1;..markdown-test\u0007"] 156 | [25.437058, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[32m➜\u001b[32m\u001b[1m\u001b[32m \u001b[35m\u001b[1m\u001b[35m\u001b[34m\u001b[1m\u001b[34mmarkdown-test \u001b[36m\u001b[1m\u001b[36m(master) \u001b[32m\u001b[1m\u001b[32m✔ \u001b[39m\u001b[0m\u001b[39m\u001b[0m\u001b[K"] 157 | [25.437243, "o", "\u001b[?1h\u001b="] 158 | [25.437355, "o", "\u001b[?2004h"] 159 | [25.463805, "o", "\r\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[32m➜\u001b[32m\u001b[1m\u001b[32m \u001b[35m\u001b[1m\u001b[35m\u001b[34m\u001b[1m\u001b[34mmarkdown-test \u001b[36m\u001b[1m\u001b[36m(master) \u001b[32m\u001b[1m\u001b[32m✔ \u001b[39m\u001b[0m\u001b[39m\u001b[0m\u001b[K"] 160 | [28.09758, "o", "c"] 161 | [28.099495, "o", "\bc\u001b[90mat README.md | mdfmt\u001b[39m\u001b[20D"] 162 | [28.23303, "o", "\bc\u001b[39ml\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[19D"] 163 | [28.235153, "o", "\u001b[90mear\u001b[39m\b\b\b"] 164 | [28.324971, "o", "\u001b[39me"] 165 | [28.437063, "o", "\u001b[39ma"] 166 | [28.500936, "o", "\u001b[39mr"] 167 | [28.701287, "o", "\u001b[?1l\u001b>"] 168 | [28.701434, "o", "\u001b[?2004l\r\r\n"] 169 | [28.702303, "o", "\u001b]2;clear\u0007\u001b]1;clear\u0007"] 170 | [28.704638, "o", "\u001b[H\u001b[2J"] 171 | [28.704971, "o", "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r"] 172 | [28.705061, "o", "\u001b]2;yym@B-K3YJLVDL-1650: ~/workspace/tmp/markdown-test\u0007"] 173 | [28.705124, "o", "\u001b]1;..markdown-test\u0007"] 174 | [28.73409, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[32m➜\u001b[32m\u001b[1m\u001b[32m \u001b[35m\u001b[1m\u001b[35m\u001b[34m\u001b[1m\u001b[34mmarkdown-test \u001b[36m\u001b[1m\u001b[36m(master) \u001b[32m\u001b[1m\u001b[32m✔ \u001b[39m\u001b[0m\u001b[39m\u001b[0m\u001b[K"] 175 | [28.734267, "o", "\u001b[?1h\u001b="] 176 | [28.734364, "o", "\u001b[?2004h"] 177 | [28.763103, "o", "\r\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[32m➜\u001b[32m\u001b[1m\u001b[32m \u001b[35m\u001b[1m\u001b[35m\u001b[34m\u001b[1m\u001b[34mmarkdown-test \u001b[36m\u001b[1m\u001b[36m(master) \u001b[32m\u001b[1m\u001b[32m✔ \u001b[39m\u001b[0m\u001b[39m\u001b[0m\u001b[K"] 178 | [29.999678, "o", "#"] 179 | [30.001722, "o", "\b#\u001b[90m File or directory as input\u001b[39m\u001b[27D"] 180 | [30.319595, "o", "\b#\u001b[39m "] 181 | [30.686254, "o", "\u001b[39mD\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[25D"] 182 | [30.972652, "o", "i"] 183 | [31.095554, "o", "s"] 184 | [31.21397, "o", "p"] 185 | [31.38924, "o", "l"] 186 | [31.559917, "o", "a"] 187 | [31.653445, "o", "y"] 188 | [31.883171, "o", " "] 189 | [32.068154, "o", "d"] 190 | [32.170213, "o", "i"] 191 | [32.273049, "o", "f"] 192 | [32.43671, "o", "f"] 193 | [33.04168, "o", "\u001b[?1l\u001b>"] 194 | [33.0421, "o", "\u001b[?2004l\r\r\n"] 195 | [33.043743, "o", "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r"] 196 | [33.043905, "o", "\u001b]2;yym@B-K3YJLVDL-1650: ~/workspace/tmp/markdown-test\u0007\u001b]1;..markdown-test\u0007"] 197 | [33.075379, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[32m➜\u001b[32m\u001b[1m\u001b[32m \u001b[35m\u001b[1m\u001b[35m\u001b[34m\u001b[1m\u001b[34mmarkdown-test \u001b[36m\u001b[1m\u001b[36m(master) \u001b[32m\u001b[1m\u001b[32m✔ \u001b[39m\u001b[0m\u001b[39m\u001b[0m\u001b[K"] 198 | [33.075513, "o", "\u001b[?1h\u001b="] 199 | [33.075622, "o", "\u001b[?2004h"] 200 | [33.100372, "o", "\r\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[32m➜\u001b[32m\u001b[1m\u001b[32m \u001b[35m\u001b[1m\u001b[35m\u001b[34m\u001b[1m\u001b[34mmarkdown-test \u001b[36m\u001b[1m\u001b[36m(master) \u001b[32m\u001b[1m\u001b[32m✔ \u001b[39m\u001b[0m\u001b[39m\u001b[0m\u001b[K"] 201 | [34.375925, "o", "m"] 202 | [34.378024, "o", "\bm\u001b[90mdfmt *.md\u001b[39m\u001b[9D"] 203 | [34.51388, "o", "\bm\u001b[39md"] 204 | [34.70192, "o", "\u001b[39mf"] 205 | [34.808885, "o", "\u001b[39mm"] 206 | [34.933284, "o", "\u001b[39mt"] 207 | [35.044786, "o", "\u001b[39m "] 208 | [35.379455, "o", "\u001b[39m-\u001b[39m \u001b[39m \u001b[39m \b\b\b"] 209 | [35.381341, "o", "\u001b[90mh\u001b[39m\b"] 210 | [35.53502, "o", "\u001b[39md"] 211 | [35.537922, "o", "\u001b[90m README.md\u001b[39m\u001b[10D"] 212 | [35.673226, "o", "\u001b[39m "] 213 | [35.902513, "o", "\u001b[39m.\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[8D"] 214 | [36.167484, "o", "\u001b[?1l\u001b>"] 215 | [36.167644, "o", "\u001b[?2004l\r\r\n"] 216 | [36.168619, "o", "\u001b]2;mdfmt -d .\u0007\u001b]1;mdfmt\u0007"] 217 | [36.189676, "o", "diff -u README.md.orig README.md\r\n--- README.md.orig\r\n+++ README.md\r\n\u001b[0m\u001b[36m@@ -1,6 +1,7 @@\r\n\u001b[0m # Introduction\r\n\u001b[32m+\r\n\u001b[0m > Hello\r\n \r\n\u001b[31m-|Name|Age|\r\n-|--|--|\r\n-|Mike|18|\r\n\u001b[32m+| Name | Age |\r\n+| ---- | --- |\r\n+| Mike | 18 |\r\n\u001b[0m"] 218 | [36.191113, "o", "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r"] 219 | [36.191255, "o", "\u001b]2;yym@B-K3YJLVDL-1650: ~/workspace/tmp/markdown-test\u0007\u001b]1;..markdown-test\u0007"] 220 | [36.222544, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[32m➜\u001b[32m\u001b[1m\u001b[32m \u001b[35m\u001b[1m\u001b[35m\u001b[34m\u001b[1m\u001b[34mmarkdown-test \u001b[36m\u001b[1m\u001b[36m(master) \u001b[32m\u001b[1m\u001b[32m✔ \u001b[39m\u001b[0m\u001b[39m\u001b[0m\u001b[K"] 221 | [36.222696, "o", "\u001b[?1h\u001b="] 222 | [36.222808, "o", "\u001b[?2004h"] 223 | [36.248368, "o", "\r\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[32m➜\u001b[32m\u001b[1m\u001b[32m \u001b[35m\u001b[1m\u001b[35m\u001b[34m\u001b[1m\u001b[34mmarkdown-test \u001b[36m\u001b[1m\u001b[36m(master) \u001b[32m\u001b[1m\u001b[32m✔ \u001b[39m\u001b[0m\u001b[39m\u001b[0m\u001b[K"] 224 | [38.298614, "o", "#"] 225 | [38.300375, "o", "\b#\u001b[90m Display diff\u001b[39m\u001b[13D"] 226 | [38.935732, "o", "\b#\u001b[39m "] 227 | [39.26333, "o", "\u001b[39mL\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[11D"] 228 | [39.436685, "o", "i"] 229 | [39.526408, "o", "s"] 230 | [39.663636, "o", "t"] 231 | [39.769224, "o", " "] 232 | [40.689646, "o", "f"] 233 | [40.793125, "o", "o"] 234 | [40.865671, "o", "r"] 235 | [40.961419, "o", "m"] 236 | [41.21731, "o", "a"] 237 | [41.346056, "o", "t"] 238 | [41.602224, "o", " "] 239 | [41.815581, "o", "f"] 240 | [41.894321, "o", "i"] 241 | [42.063009, "o", "l"] 242 | [42.210414, "o", "e"] 243 | [42.411304, "o", "s"] 244 | [42.694981, "o", "\u001b[?1l\u001b>"] 245 | [42.695159, "o", "\u001b[?2004l\r\r\n"] 246 | [42.696103, "o", "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r"] 247 | [42.696247, "o", "\u001b]2;yym@B-K3YJLVDL-1650: ~/workspace/tmp/markdown-test\u0007\u001b]1;..markdown-test\u0007"] 248 | [42.729325, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[32m➜\u001b[32m\u001b[1m\u001b[32m \u001b[35m\u001b[1m\u001b[35m\u001b[34m\u001b[1m\u001b[34mmarkdown-test \u001b[36m\u001b[1m\u001b[36m(master) \u001b[32m\u001b[1m\u001b[32m✔ \u001b[39m\u001b[0m\u001b[39m\u001b[0m\u001b[K"] 249 | [42.729469, "o", "\u001b[?1h\u001b="] 250 | [42.72957, "o", "\u001b[?2004h"] 251 | [42.756097, "o", "\r\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[32m➜\u001b[32m\u001b[1m\u001b[32m \u001b[35m\u001b[1m\u001b[35m\u001b[34m\u001b[1m\u001b[34mmarkdown-test \u001b[36m\u001b[1m\u001b[36m(master) \u001b[32m\u001b[1m\u001b[32m✔ \u001b[39m\u001b[0m\u001b[39m\u001b[0m\u001b[K"] 252 | [43.513068, "o", "m"] 253 | [43.515288, "o", "\bm\u001b[90mdfmt -d .\u001b[39m\u001b[9D"] 254 | [43.857031, "o", "\bm\u001b[39md"] 255 | [44.141545, "o", "\u001b[39mf"] 256 | [44.259076, "o", "\u001b[39mm"] 257 | [44.375808, "o", "\u001b[39mt"] 258 | [44.521141, "o", "\u001b[39m "] 259 | [44.804414, "o", "\u001b[39m-"] 260 | [45.017017, "o", "\u001b[39ml\u001b[39m \u001b[39m \b\b"] 261 | [45.018347, "o", "\u001b[90m README.md\u001b[39m\u001b[10D"] 262 | [45.188699, "o", "\u001b[39m "] 263 | [45.311699, "o", "\u001b[39m.\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[8D"] 264 | [45.945435, "o", "\u001b[?1l\u001b>"] 265 | [45.945665, "o", "\u001b[?2004l\r\r\n"] 266 | [45.947101, "o", "\u001b]2;mdfmt -l .\u0007\u001b]1;mdfmt\u0007"] 267 | [45.964821, "o", "README.md\r\n"] 268 | [45.965944, "o", "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r"] 269 | [45.966089, "o", "\u001b]2;yym@B-K3YJLVDL-1650: ~/workspace/tmp/markdown-test\u0007"] 270 | [45.966207, "o", "\u001b]1;..markdown-test\u0007"] 271 | [45.997159, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[32m➜\u001b[32m\u001b[1m\u001b[32m \u001b[35m\u001b[1m\u001b[35m\u001b[34m\u001b[1m\u001b[34mmarkdown-test \u001b[36m\u001b[1m\u001b[36m(master) \u001b[32m\u001b[1m\u001b[32m✔ \u001b[39m\u001b[0m\u001b[39m\u001b[0m\u001b[K"] 272 | [45.997317, "o", "\u001b[?1h\u001b="] 273 | [45.997408, "o", "\u001b[?2004h"] 274 | [46.023133, "o", "\r\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[32m➜\u001b[32m\u001b[1m\u001b[32m \u001b[35m\u001b[1m\u001b[35m\u001b[34m\u001b[1m\u001b[34mmarkdown-test \u001b[36m\u001b[1m\u001b[36m(master) \u001b[32m\u001b[1m\u001b[32m✔ \u001b[39m\u001b[0m\u001b[39m\u001b[0m\u001b[K"] 275 | [47.639847, "o", "#"] 276 | [47.641903, "o", "\b#\u001b[90m List format files\u001b[39m\u001b[18D"] 277 | [48.180973, "o", "\b#\u001b[39m "] 278 | [49.193276, "o", "\u001b[39mF\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[16D"] 279 | [49.195172, "o", "\u001b[90mile or directory as input\u001b[39m\u001b[25D"] 280 | [49.417069, "o", "\u001b[39mo\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[24D"] 281 | [49.54523, "o", "r"] 282 | [49.67352, "o", "m"] 283 | [49.843927, "o", "a"] 284 | [49.956151, "o", "t"] 285 | [50.527125, "o", " "] 286 | [51.263172, "o", "&"] 287 | [51.469537, "o", " "] 288 | [51.695754, "o", "w"] 289 | [51.84694, "o", "r"] 290 | [52.011485, "o", "i"] 291 | [52.106239, "o", "t"] 292 | [52.19622, "o", "e"] 293 | [52.327113, "o", " "] 294 | [52.470572, "o", "f"] 295 | [52.547099, "o", "i"] 296 | [52.695049, "o", "l"] 297 | [52.778815, "o", "e"] 298 | [52.931518, "o", "s"] 299 | [53.11667, "o", "\u001b[?1l\u001b>"] 300 | [53.116819, "o", "\u001b[?2004l\r\r\n"] 301 | [53.117617, "o", "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r"] 302 | [53.117726, "o", "\u001b]2;yym@B-K3YJLVDL-1650: ~/workspace/tmp/markdown-test\u0007\u001b]1;..markdown-test\u0007"] 303 | [53.145074, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[32m➜\u001b[32m\u001b[1m\u001b[32m \u001b[35m\u001b[1m\u001b[35m\u001b[34m\u001b[1m\u001b[34mmarkdown-test \u001b[36m\u001b[1m\u001b[36m(master) \u001b[32m\u001b[1m\u001b[32m✔ \u001b[39m\u001b[0m\u001b[39m\u001b[0m\u001b[K"] 304 | [53.145203, "o", "\u001b[?1h\u001b="] 305 | [53.145232, "o", "\u001b[?2004h"] 306 | [53.173755, "o", "\r\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[32m➜\u001b[32m\u001b[1m\u001b[32m \u001b[35m\u001b[1m\u001b[35m\u001b[34m\u001b[1m\u001b[34mmarkdown-test \u001b[36m\u001b[1m\u001b[36m(master) \u001b[32m\u001b[1m\u001b[32m✔ \u001b[39m\u001b[0m\u001b[39m\u001b[0m\u001b[K"] 307 | [54.374273, "o", "m"] 308 | [54.376125, "o", "\bm\u001b[90mdfmt -l .\u001b[39m\u001b[9D"] 309 | [54.64959, "o", "\bm\u001b[39md"] 310 | [54.901649, "o", "\u001b[39mf"] 311 | [54.989825, "o", "\u001b[39mm"] 312 | [55.15392, "o", "\u001b[39mt"] 313 | [55.815571, "o", "\u001b[39m "] 314 | [56.225022, "o", "\u001b[39m-"] 315 | [56.392, "o", "\u001b[39mw\u001b[39m \u001b[39m \b\b"] 316 | [56.393967, "o", "\u001b[90m README.md\u001b[39m\u001b[10D"] 317 | [56.561152, "o", "\u001b[39m "] 318 | [56.755547, "o", "\u001b[39m.\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[8D"] 319 | [57.09285, "o", "\u001b[?1l\u001b>"] 320 | [57.093021, "o", "\u001b[?2004l\r\r\n"] 321 | [57.094025, "o", "\u001b]2;mdfmt -w .\u0007\u001b]1;mdfmt\u0007"] 322 | [57.109316, "o", "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r"] 323 | [57.109467, "o", "\u001b]2;yym@B-K3YJLVDL-1650: ~/workspace/tmp/markdown-test\u0007\u001b]1;..markdown-test\u0007"] 324 | [57.13801, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[32m➜\u001b[32m\u001b[1m\u001b[32m \u001b[35m\u001b[1m\u001b[35m\u001b[34m\u001b[1m\u001b[34mmarkdown-test \u001b[36m\u001b[1m\u001b[36m(master) \u001b[32m\u001b[1m\u001b[32m✔ \u001b[39m\u001b[0m\u001b[39m\u001b[0m\u001b[K"] 325 | [57.138234, "o", "\u001b[?1h\u001b="] 326 | [57.138342, "o", "\u001b[?2004h"] 327 | [57.168231, "o", "\r\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[32m➜\u001b[32m\u001b[1m\u001b[32m \u001b[35m\u001b[1m\u001b[35m\u001b[34m\u001b[1m\u001b[34mmarkdown-test \u001b[36m\u001b[1m\u001b[36m(master) \u001b[33m\u001b[1m\u001b[33m✗ \u001b[39m\u001b[0m\u001b[39m\u001b[0m\u001b[K"] 328 | [58.669959, "o", "g"] 329 | [58.672437, "o", "\bg\u001b[90mst\u001b[39m\b\b"] 330 | [58.751055, "o", "\bg\u001b[39mi\u001b[39m \b"] 331 | [58.75285, "o", "\u001b[90mt reset --hard HEAD\u001b[39m\u001b[19D"] 332 | [58.857892, "o", "\u001b[39mt"] 333 | [58.9972, "o", "\u001b[39m "] 334 | [59.222077, "o", "\u001b[39md\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[16D"] 335 | [59.224241, "o", "\u001b[90miff\u001b[39m\b\b\b"] 336 | [59.327178, "o", "\u001b[39mi"] 337 | [59.415703, "o", "\u001b[39mf"] 338 | [59.565236, "o", "\u001b[39mf"] 339 | [60.016693, "o", "\u001b[?1l\u001b>"] 340 | [60.016956, "o", "\u001b[?2004l\r\r\n"] 341 | [60.018068, "o", "\u001b]2;git diff\u0007\u001b]1;git\u0007"] 342 | [60.044351, "o", "\u001b[?1049h\u001b[?1h\u001b=\r"] 343 | [60.044554, "o", "\u001b[1mdiff --git a/README.md b/README.md\u001b[m\u001b[m\r\n\u001b[1mindex 8271e96..fc8c3ab 100644\u001b[m\u001b[m\r\n\u001b[1m--- a/README.md\u001b[m\u001b[m\r\n\u001b[1m+++ b/README.md\u001b[m\u001b[m\r\n\u001b[36m@@ -1,6 +1,7 @@\u001b[m\u001b[m\r\n # Introduction\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[m\r\n > Hello\u001b[m\u001b[m\r\n \u001b[m\u001b[m\r\n\u001b[31m-|Name|Age|\u001b[m\u001b[m\r\n\u001b[31m-|--|--|\u001b[m\u001b[m\r\n\u001b[31m-|Mike|18|\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m| Name | Age |\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m| ---- | --- |\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m\u001b[32m| Mike | 18 |\u001b[m\u001b[m\r\n\u001b[7m(END)\u001b[27m\u001b[K"] 344 | [61.284777, "o", "\r\u001b[K\u001b[?1l\u001b>\u001b[?1049l"] 345 | [61.285729, "o", "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r"] 346 | [61.285902, "o", "\u001b]2;yym@B-K3YJLVDL-1650: ~/workspace/tmp/markdown-test\u0007"] 347 | [61.286023, "o", "\u001b]1;..markdown-test\u0007"] 348 | [61.326785, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[32m➜\u001b[32m\u001b[1m\u001b[32m \u001b[35m\u001b[1m\u001b[35m\u001b[34m\u001b[1m\u001b[34mmarkdown-test \u001b[36m\u001b[1m\u001b[36m(master) \u001b[33m\u001b[1m\u001b[33m✗ \u001b[39m\u001b[0m\u001b[39m\u001b[0m\u001b[K"] 349 | [61.326962, "o", "\u001b[?1h\u001b=\u001b[?2004h"] 350 | [61.360414, "o", "\r\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[32m➜\u001b[32m\u001b[1m\u001b[32m \u001b[35m\u001b[1m\u001b[35m\u001b[34m\u001b[1m\u001b[34mmarkdown-test \u001b[36m\u001b[1m\u001b[36m(master) \u001b[33m\u001b[1m\u001b[33m✗ \u001b[39m\u001b[0m\u001b[39m\u001b[0m\u001b[K"] 351 | [63.270139, "o", "\u001b[?2004l\r\r\n"] 352 | -------------------------------------------------------------------------------- /assets/demo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/elliotxx/mdfmt/60cee97ffa176f6a98796d0ba3ce2ad1751b4853/assets/demo.jpg -------------------------------------------------------------------------------- /cmd/mdfmt/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "io/fs" 6 | "os" 7 | "path/filepath" 8 | 9 | "github.com/elliotxx/mdfmt/pkg/md" 10 | "github.com/elliotxx/mdfmt/pkg/merrors" 11 | "github.com/elliotxx/mdfmt/pkg/version" 12 | "github.com/sirupsen/logrus" 13 | "github.com/spf13/cobra" 14 | "k8s.io/kubectl/pkg/util/i18n" 15 | "k8s.io/kubectl/pkg/util/templates" 16 | ) 17 | 18 | var ( 19 | cmdShort = i18n.T(`A Markdown formatter that follow the CommonMark`) 20 | cmdLong = templates.LongDesc(i18n.T(`A Markdown formatter that follow the CommonMark. Like gofmt, but for Markdown.`)) 21 | cmdExample = templates.Examples(i18n.T(` 22 | # Format specified Markdown file, and write to stdout 23 | mdfmt README.md 24 | 25 | # Format and rewrite for specified Markdown file 26 | mdfmt -w README.md 27 | 28 | # Display diffs instead of rewriting Markdown files 29 | mdfmt -d README.md 30 | 31 | # List files whose formatting differs from mdfmt's 32 | mdfmt -l . 33 | 34 | # Format, rewrite, and display diffs for specified Markdown file 35 | mdfmt -d -w README.md 36 | 37 | # Format and rewrite all Markdown file in current directory 38 | mdfmt -w *.md 39 | 40 | # Recursive format and rewrite all Markdown file in current directory 41 | mdfmt -w . 42 | 43 | # Format and rewrite the specified Markdown file and directory 44 | mdfmt -w README.md testdir/ 45 | 46 | # Format stdin to stdout 47 | cat README.md | mdfmt 48 | 49 | # Show version info 50 | mdfmt -V 51 | `)) 52 | ) 53 | 54 | func configureCLI() *cobra.Command { 55 | o := NewOptions() 56 | rootCmd := &cobra.Command{ 57 | Use: "mdfmt [flags] [path ...]", 58 | Short: cmdShort, 59 | Long: cmdLong, 60 | Example: cmdExample, 61 | SilenceUsage: true, 62 | SilenceErrors: true, 63 | RunE: func(_ *cobra.Command, args []string) (err error) { 64 | // Show version info 65 | if o.ShowVersion { 66 | fmt.Println(version.YAML()) 67 | return nil 68 | } 69 | 70 | // Verbose logging 71 | if o.Verbose { 72 | // init logger 73 | logrus.SetLevel(logrus.TraceLevel) 74 | } 75 | 76 | // Process input 77 | if len(args) == 0 { 78 | // Stdin 79 | err = md.FormatMarkdown(os.Stdin, os.Stdout) 80 | return err 81 | } 82 | for _, p := range args { 83 | // File or directory 84 | err = filepath.WalkDir(p, func(path string, d fs.DirEntry, _ error) (err2 error) { 85 | defer func() { 86 | if err2 != nil { 87 | // Ignore error in WalkDir, as debug information 88 | if cerr, ok := err2.(merrors.CrashError); ok { 89 | logrus.Debug(cerr.ErrorWithStack()) 90 | } else { 91 | logrus.Debug(err2.Error()) 92 | } 93 | err2 = nil 94 | } 95 | }() 96 | 97 | if d != nil && !d.IsDir() && md.IsMarkdownFile(path) { 98 | err2 = ProcessMDFile(path, o.Write, o.Diff, o.List) 99 | } 100 | return 101 | }) 102 | if err != nil { 103 | return err 104 | } 105 | } 106 | 107 | return nil 108 | }, 109 | } 110 | 111 | rootCmd.Flags().BoolVarP(&o.ShowVersion, "version", "V", false, "show version info") 112 | rootCmd.Flags().BoolVarP(&o.Write, "write", "w", false, "write result to (source) file instead of stdout") 113 | rootCmd.Flags().BoolVarP(&o.Diff, "diff", "d", false, "display diffs instead of rewriting files") 114 | rootCmd.Flags().BoolVarP(&o.List, "list", "l", false, "list files whose formatting differs from mdfmt's") 115 | rootCmd.Flags().BoolVarP(&o.Verbose, "verbose", "v", false, "verbose logging") 116 | 117 | return rootCmd 118 | } 119 | 120 | func main() { 121 | // init rootCmd 122 | rootCmd := configureCLI() 123 | if err := rootCmd.Execute(); err != nil { 124 | logrus.Error(err) 125 | os.Exit(1) 126 | } 127 | 128 | os.Exit(0) 129 | } 130 | -------------------------------------------------------------------------------- /cmd/mdfmt/options.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "bytes" 5 | "fmt" 6 | "os" 7 | "path/filepath" 8 | 9 | "github.com/elliotxx/mdfmt/pkg/md" 10 | "github.com/pkg/diff" 11 | "github.com/pkg/diff/write" 12 | ) 13 | 14 | // fdSem guards the number of concurrently-open file descriptors. 15 | // 16 | // For now, this is arbitrarily set to 200, based on the observation that many 17 | // platforms default to a kernel limit of 256. Ideally, perhaps we should derive 18 | // it from rlimit on platforms that support that system call. 19 | // 20 | // File descriptors opened from outside of this package are not tracked, 21 | // so this limit may be approximate. 22 | var fdSem = make(chan bool, 200) 23 | 24 | type Options struct { 25 | ShowVersion bool 26 | Write bool 27 | Diff bool 28 | List bool 29 | Verbose bool 30 | } 31 | 32 | // NewOptions returns a new Options instance 33 | func NewOptions() *Options { 34 | return &Options{} 35 | } 36 | 37 | // ProcessMDFile formats markdown file. 38 | func ProcessMDFile(filePath string, write, diff, list bool) error { 39 | // Get Reader and Source 40 | source, err := os.ReadFile(filePath) 41 | if err != nil { 42 | return err 43 | } 44 | 45 | in := bytes.NewReader(source) 46 | 47 | // Get Writer and Target 48 | out := bytes.NewBuffer([]byte{}) 49 | 50 | err = md.FormatMarkdown(in, out) 51 | if err != nil { 52 | return err 53 | } 54 | 55 | target := out.Bytes() 56 | 57 | if !bytes.Equal(source, target) { 58 | // List 59 | if list { 60 | os.Stdout.WriteString(filePath + "\n") 61 | } 62 | // Write 63 | if write { 64 | info, err := os.Stat(filePath) 65 | if err != nil { 66 | return err 67 | } 68 | 69 | fdSem <- true 70 | 71 | err = os.WriteFile(filePath, target, info.Mode().Perm()) 72 | 73 | <-fdSem 74 | 75 | if err != nil { 76 | return err 77 | } 78 | } 79 | 80 | // Diff 81 | if diff { 82 | data, err := diffWithReplaceTempFile(source, target, filePath) 83 | if err != nil { 84 | return fmt.Errorf("computing diff: %s", err) 85 | } 86 | 87 | fmt.Fprintf(os.Stdout, "diff -u %s %s\n", filepath.ToSlash(filePath+".orig"), filepath.ToSlash(filePath)) 88 | os.Stdout.Write(data) 89 | } 90 | } 91 | 92 | if !write && !diff && !list { 93 | _, err = os.Stdout.Write(target) 94 | } 95 | 96 | return err 97 | } 98 | 99 | func diffWithReplaceTempFile(b1, b2 []byte, filename string) ([]byte, error) { 100 | data := bytes.NewBufferString("") 101 | err := diff.Text("origin", "target", b1, b2, data, write.TerminalColor()) 102 | 103 | if len(data.Bytes()) > 0 { 104 | return replaceTempFilename(data.Bytes(), filename) 105 | } 106 | 107 | return data.Bytes(), err 108 | } 109 | 110 | // replaceTempFilename replaces temporary filenames in diff with actual one. 111 | // 112 | // --- /tmp/gofmt316145376 2017-02-03 19:13:00.280468375 -0500 113 | // +++ /tmp/gofmt617882815 2017-02-03 19:13:00.280468375 -0500 114 | // ... 115 | // -> 116 | // --- path/to/file.md.orig 2017-02-03 19:13:00.280468375 -0500 117 | // +++ path/to/file.md 2017-02-03 19:13:00.280468375 -0500 118 | // ... 119 | func replaceTempFilename(diff []byte, filename string) ([]byte, error) { 120 | bs := bytes.SplitN(diff, []byte{'\n'}, 3) 121 | if len(bs) < 3 { 122 | return nil, fmt.Errorf("got unexpected diff for %s", filename) 123 | } 124 | // Preserve timestamps. 125 | var t0, t1 []byte 126 | if i := bytes.LastIndexByte(bs[0], '\t'); i != -1 { 127 | t0 = bs[0][i:] 128 | } 129 | 130 | if i := bytes.LastIndexByte(bs[1], '\t'); i != -1 { 131 | t1 = bs[1][i:] 132 | } 133 | 134 | // Always print filepath with slash separator. 135 | f := filepath.ToSlash(filename) 136 | bs[0] = []byte(fmt.Sprintf("--- %s%s", f+".orig", t0)) 137 | bs[1] = []byte(fmt.Sprintf("+++ %s%s", f, t1)) 138 | 139 | return bytes.Join(bs, []byte{'\n'}), nil 140 | } 141 | -------------------------------------------------------------------------------- /cmd/mdfmt/options_test.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "os" 5 | "testing" 6 | ) 7 | 8 | func TestProcessMDFile(t *testing.T) { 9 | mockMDFile := "./testdata/hello-temp.md" 10 | _ = os.WriteFile(mockMDFile, []byte("# Hello World"), 0644) 11 | 12 | defer os.Remove(mockMDFile) 13 | 14 | type args struct { 15 | filePath string 16 | write bool 17 | diff bool 18 | list bool 19 | } 20 | 21 | tests := []struct { 22 | name string 23 | args args 24 | wantErr bool 25 | }{ 26 | { 27 | name: "happy-path", 28 | args: args{ 29 | filePath: "./testdata/hello.md", 30 | write: false, 31 | diff: false, 32 | list: false, 33 | }, 34 | wantErr: false, 35 | }, 36 | { 37 | name: "md-file-not-exist", 38 | args: args{ 39 | filePath: "./testdata/hello-not-exist.md", 40 | write: true, 41 | diff: false, 42 | list: false, 43 | }, 44 | wantErr: true, 45 | }, 46 | { 47 | name: "diff", 48 | args: args{ 49 | filePath: "./testdata/hello.md", 50 | write: false, 51 | diff: true, 52 | list: false, 53 | }, 54 | wantErr: false, 55 | }, 56 | { 57 | name: "write", 58 | args: args{ 59 | filePath: mockMDFile, 60 | write: true, 61 | diff: false, 62 | list: false, 63 | }, 64 | wantErr: false, 65 | }, 66 | { 67 | name: "list", 68 | args: args{ 69 | filePath: "./testdata/hello.md", 70 | write: false, 71 | diff: false, 72 | list: true, 73 | }, 74 | wantErr: false, 75 | }, 76 | } 77 | for _, tt := range tests { 78 | t.Run(tt.name, func(t *testing.T) { 79 | if err := ProcessMDFile(tt.args.filePath, tt.args.write, tt.args.diff, tt.args.list); (err != nil) != tt.wantErr { 80 | t.Errorf("ProcessMDFile() error = %v, wantErr %v", err, tt.wantErr) 81 | } 82 | }) 83 | } 84 | } 85 | -------------------------------------------------------------------------------- /go.mk: -------------------------------------------------------------------------------- 1 | # go.mk is a Go project general Makefile, encapsulated some common Target. 2 | # Project repository: https://github.com/elliotxx/go-makefile 3 | 4 | APPROOT ?= $(shell basename $(PWD)) 5 | GOPKG ?= $(shell go list 2>/dev/null) 6 | GOPKGS ?= $(shell go list ./... 2>/dev/null) 7 | GOSOURCES ?= $(shell find . -type f -name '*.go' ! -path '*Godeps/_workspace*') 8 | # You can also customize GOSOURCE_PATHS, e.g. ./pkg/... ./cmd/... 9 | GOSOURCE_PATHS ?= ././... 10 | COVERAGEOUT ?= coverage.out 11 | COVERAGETMP ?= coverage.tmp 12 | 13 | 14 | # Go tools 15 | GOFORMATER ?= gofumpt 16 | GOFORMATER_VERSION ?= v0.2.0 17 | GOLINTER ?= golangci-lint 18 | GOLINTER_VERSION ?= v1.41.0 19 | 20 | 21 | # To generate help information 22 | .DEFAULT_GOAL := help 23 | .PHONY: help 24 | help: ## This help message :) 25 | @grep -E '^[a-zA-Z_-]+:.*?## .*$$' go.mk | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' 26 | @grep -E '^[a-zA-Z_-]+:.*?## .*$$' Makefile | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' 27 | 28 | 29 | # If you encounter an error like "panic: permission denied" on MacOS, 30 | # please visit https://github.com/eisenxp/macos-golink-wrapper to find the solution. 31 | .PHONY: test 32 | test: ## Run the tests 33 | go test -gcflags=all=-l -timeout=10m `go list $(GOSOURCE_PATHS)` ${TEST_FLAGS} 34 | 35 | .PHONY: cover 36 | cover: ## Generates coverage report 37 | go test -gcflags=all=-l -timeout=10m `go list $(GOSOURCE_PATHS)` -coverprofile $(COVERAGEOUT) ${TEST_FLAGS} 38 | 39 | .PHONY: cover-html 40 | cover-html: ## Generates coverage report and displays it in the browser 41 | go tool cover -html=$(COVERAGEOUT) 42 | 43 | .PHONY: format 44 | format: ## Format source code 45 | @which $(GOFORMATER) > /dev/null || (echo "Installing $(GOFORMATER)@$(GOFORMATER_VERSION) ..."; go install mvdan.cc/gofumpt@$(GOFORMATER_VERSION) && echo -e "Installation complete!\n") 46 | @for path in $(GOSOURCE_PATHS); do ${GOFORMATER} -l -w -e `echo $${path} | cut -b 3- | rev | cut -b 5- | rev`; done; 47 | 48 | .PHONY: lint 49 | lint: ## Lint, will not fix but sets exit code on error 50 | @which $(GOLINTER) > /dev/null || (echo "Installing $(GOLINTER)@$(GOLINTER_VERSION) ..."; go install github.com/golangci/golangci-lint/cmd/golangci-lint@$(GOLINTER_VERSION) && echo -e "Installation complete!\n") 51 | $(GOLINTER) run --deadline=10m $(GOSOURCE_PATHS) 52 | 53 | .PHONY: lint-fix 54 | lint-fix: ## Lint, will try to fix errors and modify code 55 | @which $(GOLINTER) > /dev/null || (echo "Installing $(GOLINTER)@$(GOLINTER_VERSION) ..."; go install github.com/golangci/golangci-lint/cmd/golangci-lint@$(GOLINTER_VERSION) && echo -e "Installation complete!\n") 56 | $(GOLINTER) run --deadline=10m $(GOSOURCE_PATHS) --fix 57 | 58 | .PHONY: doc 59 | doc: ## Start the documentation server with godoc 60 | @which godoc > /dev/null || (echo "Installing godoc@latest ..."; go install golang.org/x/tools/cmd/godoc@latest && echo -e "Installation complete!\n") 61 | godoc -http=:6060 -------------------------------------------------------------------------------- /go.mod: -------------------------------------------------------------------------------- 1 | module github.com/elliotxx/mdfmt 2 | 3 | go 1.17 4 | 5 | require ( 6 | github.com/88250/lute v1.7.3 7 | github.com/elliotxx/gulu v0.3.0 8 | github.com/hashicorp/go-version v1.3.0 9 | github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e 10 | github.com/sirupsen/logrus v1.8.1 11 | github.com/spf13/cobra v1.2.1 12 | gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b 13 | k8s.io/kubectl v0.22.4 14 | ) 15 | 16 | require ( 17 | github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect 18 | github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd // indirect 19 | github.com/alecthomas/chroma v0.10.0 // indirect 20 | github.com/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5 // indirect 21 | github.com/davecgh/go-spew v1.1.1 // indirect 22 | github.com/dlclark/regexp2 v1.4.0 // indirect 23 | github.com/go-logr/logr v1.2.2 // indirect 24 | github.com/gogo/protobuf v1.3.2 // indirect 25 | github.com/golang/protobuf v1.5.2 // indirect 26 | github.com/google/go-cmp v0.5.6 // indirect 27 | github.com/google/gofuzz v1.1.0 // indirect 28 | github.com/gopherjs/gopherjs v0.0.0-20220104163920-15ed2e8cf2bd // indirect 29 | github.com/inconshreveable/mousetrap v1.0.0 // indirect 30 | github.com/json-iterator/go v1.1.11 // indirect 31 | github.com/mitchellh/go-wordwrap v1.0.0 // indirect 32 | github.com/moby/spdystream v0.2.0 // indirect 33 | github.com/moby/term v0.0.0-20210610120745-9d4ed1856297 // indirect 34 | github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect 35 | github.com/modern-go/reflect2 v1.0.1 // indirect 36 | github.com/russross/blackfriday v1.5.2 // indirect 37 | github.com/spf13/pflag v1.0.5 // indirect 38 | golang.org/x/net v0.0.0-20210520170846-37e1c6afe023 // indirect 39 | golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602 // indirect 40 | golang.org/x/sys v0.0.0-20220224120231-95c6836cb0e7 // indirect 41 | golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d // indirect 42 | golang.org/x/text v0.3.7 // indirect 43 | golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac // indirect 44 | google.golang.org/appengine v1.6.7 // indirect 45 | google.golang.org/protobuf v1.26.0 // indirect 46 | gopkg.in/inf.v0 v0.9.1 // indirect 47 | gopkg.in/yaml.v2 v2.4.0 // indirect 48 | k8s.io/api v0.22.4 // indirect 49 | k8s.io/apimachinery v0.22.4 // indirect 50 | k8s.io/client-go v0.22.4 // indirect 51 | k8s.io/klog/v2 v2.30.0 // indirect 52 | k8s.io/utils v0.0.0-20210819203725-bdf08cb9a70a // indirect 53 | sigs.k8s.io/structured-merge-diff/v4 v4.1.2 // indirect 54 | sigs.k8s.io/yaml v1.2.0 // indirect 55 | ) 56 | -------------------------------------------------------------------------------- /go.sum: -------------------------------------------------------------------------------- 1 | bou.ke/monkey v1.0.2 h1:kWcnsrCNUatbxncxR/ThdYqbytgOIArtYWqcQLQzKLI= 2 | bou.ke/monkey v1.0.2/go.mod h1:OqickVX3tNx6t33n1xvtTtu85YN5s6cKwVug+oHMaIA= 3 | cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= 4 | cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= 5 | cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= 6 | cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= 7 | cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= 8 | cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= 9 | cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= 10 | cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= 11 | cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= 12 | cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= 13 | cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= 14 | cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= 15 | cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= 16 | cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= 17 | cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= 18 | cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= 19 | cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= 20 | cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= 21 | cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= 22 | cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= 23 | cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= 24 | cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= 25 | cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= 26 | cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= 27 | cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= 28 | cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= 29 | cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= 30 | cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= 31 | cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= 32 | cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= 33 | cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= 34 | cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= 35 | cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= 36 | cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= 37 | cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= 38 | cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= 39 | cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= 40 | cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= 41 | dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= 42 | github.com/88250/lute v1.7.3 h1:Yuve6dTAZNjWktXpHK14PND4KaBwqVxVi3L+GZa3+HQ= 43 | github.com/88250/lute v1.7.3/go.mod h1:3CPco034YZBxszJEqBPNgp3a1K+uddq4IegStqBiyTM= 44 | github.com/Azure/go-ansiterm v0.0.0-20210608223527-2377c96fe795/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= 45 | github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= 46 | github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= 47 | github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= 48 | github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= 49 | github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= 50 | github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= 51 | github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= 52 | github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= 53 | github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= 54 | github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= 55 | github.com/BurntSushi/toml v0.4.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= 56 | github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= 57 | github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd h1:sjQovDkwrZp8u+gxLtPgKGjk5hCxuy2hrRejBTA9xFU= 58 | github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd/go.mod h1:64YHyfSL2R96J44Nlwm39UHepQbyR5q10x7iYa1ks2E= 59 | github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= 60 | github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= 61 | github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= 62 | github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= 63 | github.com/alecthomas/assert v0.0.0-20170929043011-405dbfeb8e38/go.mod h1:r7bzyVFMNntcxPZXK3/+KdruV1H5KSlyVY0gc+NgInI= 64 | github.com/alecthomas/chroma v0.9.2/go.mod h1:eMuEnpA18XbG/WhOWtCzJHS7WqEtDAI+HxdwoW0nVSk= 65 | github.com/alecthomas/chroma v0.10.0 h1:7XDcGkCQopCNKjZHfYrNLraA+M7e0fMiJ/Mfikbfjek= 66 | github.com/alecthomas/chroma v0.10.0/go.mod h1:jtJATyUxlIORhUOFNA9NZDWGAQ8wpxQQqNSB4rjA/1s= 67 | github.com/alecthomas/colour v0.0.0-20160524082231-60882d9e2721/go.mod h1:QO9JBoKquHd+jz9nshCh40fOfO+JzsoXy8qTHF68zU0= 68 | github.com/alecthomas/colour v0.1.0/go.mod h1:QO9JBoKquHd+jz9nshCh40fOfO+JzsoXy8qTHF68zU0= 69 | github.com/alecthomas/kong v0.2.4/go.mod h1:kQOmtJgV+Lb4aj+I2LEn40cbtawdWJ9Y8QLq+lElKxE= 70 | github.com/alecthomas/repr v0.0.0-20180818092828-117648cd9897/go.mod h1:xTS7Pm1pD1mvyM075QCDSRqH6qRLXylzS24ZTpRiSzQ= 71 | github.com/alecthomas/repr v0.0.0-20200325044227-4184120f674c/go.mod h1:xTS7Pm1pD1mvyM075QCDSRqH6qRLXylzS24ZTpRiSzQ= 72 | github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= 73 | github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= 74 | github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= 75 | github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= 76 | github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= 77 | github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= 78 | github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= 79 | github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= 80 | github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= 81 | github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= 82 | github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= 83 | github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= 84 | github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= 85 | github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= 86 | github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= 87 | github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= 88 | github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= 89 | github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= 90 | github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= 91 | github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= 92 | github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= 93 | github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= 94 | github.com/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5 h1:7aWHqerlJ41y6FOsEUvknqgXnGmJyJSbjhAWq5pO4F8= 95 | github.com/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5/go.mod h1:/iP1qXHoty45bqomnu2LM+VVyAEdWN+vtSHGlQgyxbw= 96 | github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= 97 | github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= 98 | github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= 99 | github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= 100 | github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= 101 | github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= 102 | github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= 103 | github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= 104 | github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= 105 | github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= 106 | github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= 107 | github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= 108 | github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= 109 | github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= 110 | github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= 111 | github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= 112 | github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= 113 | github.com/creack/pty v1.1.11 h1:07n33Z8lZxZ2qwegKbObQohDhXDQxiMMz1NOUGYlesw= 114 | github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= 115 | github.com/danwakefield/fnmatch v0.0.0-20160403171240-cbb64ac3d964/go.mod h1:Xd9hchkHSWYkEqJwUGisez3G1QY8Ryz0sdWrLPMGjLk= 116 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 117 | github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= 118 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 119 | github.com/daviddengcn/go-colortext v0.0.0-20160507010035-511bcaf42ccd/go.mod h1:dv4zxwHi5C/8AeI+4gX4dCWOIvNi7I6JCSX0HvlKPgE= 120 | github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= 121 | github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= 122 | github.com/dlclark/regexp2 v1.4.0 h1:F1rxgk7p4uKjwIQxBs9oAXe5CqrXlCduYEJvrF4u93E= 123 | github.com/dlclark/regexp2 v1.4.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= 124 | github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= 125 | github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= 126 | github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153 h1:yUdfgN0XgIJw7foRItutHYUIhlcKzcSf5vDpdhQAKTc= 127 | github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= 128 | github.com/elliotxx/gulu v0.3.0 h1:MJY41YzXrN3R0xTGU9tQyqPNjzxvCekG01N2skCJw3I= 129 | github.com/elliotxx/gulu v0.3.0/go.mod h1:agpFfRh6SalxnrmXo+WqVotkpSHwU++EHfDHZf2y/P8= 130 | github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= 131 | github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= 132 | github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= 133 | github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= 134 | github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= 135 | github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= 136 | github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= 137 | github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= 138 | github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= 139 | github.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= 140 | github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d/go.mod h1:ZZMPRZwes7CROmyNKgQzC3XPs6L/G2EJLHddWejkmf4= 141 | github.com/fatih/camelcase v1.0.0/go.mod h1:yN2Sb0lFhZJUdVvtELVWefmrXpuZESvPmqwoZc+/fpc= 142 | github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= 143 | github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= 144 | github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= 145 | github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= 146 | github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= 147 | github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= 148 | github.com/fvbommel/sortorder v1.0.1/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0= 149 | github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= 150 | github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= 151 | github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= 152 | github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= 153 | github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= 154 | github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= 155 | github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= 156 | github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= 157 | github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= 158 | github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= 159 | github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= 160 | github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= 161 | github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= 162 | github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= 163 | github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= 164 | github.com/go-logr/logr v1.2.2 h1:ahHml/yUpnlb96Rp8HCvtYVPY8ZYpxq3g7UYchIYwbs= 165 | github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= 166 | github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= 167 | github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= 168 | github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= 169 | github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= 170 | github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= 171 | github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= 172 | github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= 173 | github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= 174 | github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= 175 | github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= 176 | github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= 177 | github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= 178 | github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= 179 | github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= 180 | github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= 181 | github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= 182 | github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= 183 | github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= 184 | github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= 185 | github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= 186 | github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= 187 | github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= 188 | github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= 189 | github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= 190 | github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= 191 | github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= 192 | github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 193 | github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 194 | github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 195 | github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= 196 | github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= 197 | github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= 198 | github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= 199 | github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= 200 | github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= 201 | github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= 202 | github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= 203 | github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= 204 | github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= 205 | github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= 206 | github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= 207 | github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= 208 | github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= 209 | github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= 210 | github.com/golangplus/testing v0.0.0-20180327235837-af21d9c3145e/go.mod h1:0AA//k/eakGydO4jKRoRL2j92ZKSzTgj9tclaCrvXHk= 211 | github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= 212 | github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= 213 | github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= 214 | github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= 215 | github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= 216 | github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= 217 | github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 218 | github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 219 | github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 220 | github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 221 | github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 222 | github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 223 | github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 224 | github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 225 | github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= 226 | github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 227 | github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= 228 | github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g= 229 | github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= 230 | github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= 231 | github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= 232 | github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= 233 | github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= 234 | github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= 235 | github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= 236 | github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= 237 | github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= 238 | github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= 239 | github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= 240 | github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= 241 | github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= 242 | github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= 243 | github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= 244 | github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= 245 | github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= 246 | github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= 247 | github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= 248 | github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= 249 | github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= 250 | github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU= 251 | github.com/googleapis/gnostic v0.5.5/go.mod h1:7+EbHbldMins07ALC74bsA81Ovc97DwqyJO1AENw9kA= 252 | github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= 253 | github.com/gopherjs/gopherjs v0.0.0-20210619142842-05447a1fa367/go.mod h1:MtKwTfDNYAP5EtbQSMYjTSqvj1aXJKQRASWq3bwaP+g= 254 | github.com/gopherjs/gopherjs v0.0.0-20220104163920-15ed2e8cf2bd h1:D/H64OK+VY7O0guGbCQaFKwAZlU5t764R++kgIdAGog= 255 | github.com/gopherjs/gopherjs v0.0.0-20220104163920-15ed2e8cf2bd/go.mod h1:cz9oNYuRUWGdHmLF2IodMLkAhcPtXeULvcBNagUrxTI= 256 | github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= 257 | github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= 258 | github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= 259 | github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= 260 | github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= 261 | github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= 262 | github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= 263 | github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= 264 | github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= 265 | github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= 266 | github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= 267 | github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= 268 | github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= 269 | github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= 270 | github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= 271 | github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= 272 | github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= 273 | github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= 274 | github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= 275 | github.com/hashicorp/go-version v1.3.0 h1:McDWVJIU/y+u1BRV06dPaLfLCaT7fUTJLp5r04x7iNw= 276 | github.com/hashicorp/go-version v1.3.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= 277 | github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= 278 | github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= 279 | github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= 280 | github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= 281 | github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= 282 | github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= 283 | github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= 284 | github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= 285 | github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= 286 | github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= 287 | github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= 288 | github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= 289 | github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= 290 | github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= 291 | github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= 292 | github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= 293 | github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= 294 | github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= 295 | github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= 296 | github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= 297 | github.com/json-iterator/go v1.1.11 h1:uVUAXhF2To8cbw/3xN3pxj6kk7TYKs98NIrTqPlMWAQ= 298 | github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= 299 | github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= 300 | github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= 301 | github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= 302 | github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= 303 | github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= 304 | github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= 305 | github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= 306 | github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= 307 | github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= 308 | github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= 309 | github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= 310 | github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= 311 | github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= 312 | github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= 313 | github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= 314 | github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= 315 | github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= 316 | github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= 317 | github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE= 318 | github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= 319 | github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= 320 | github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= 321 | github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= 322 | github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= 323 | github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= 324 | github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= 325 | github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= 326 | github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= 327 | github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= 328 | github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= 329 | github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= 330 | github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= 331 | github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= 332 | github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= 333 | github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= 334 | github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= 335 | github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= 336 | github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= 337 | github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= 338 | github.com/mitchellh/go-wordwrap v1.0.0 h1:6GlHJ/LTGMrIJbwgdqdl2eEH8o+Exx/0m8ir9Gns0u4= 339 | github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= 340 | github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= 341 | github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= 342 | github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= 343 | github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= 344 | github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= 345 | github.com/moby/spdystream v0.2.0 h1:cjW1zVyyoiM0T7b6UoySUFqzXMoqRckQtXwGPiBhOM8= 346 | github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= 347 | github.com/moby/term v0.0.0-20210610120745-9d4ed1856297 h1:yH0SvLzcbZxcJXho2yh7CqdENGMQe73Cw3woZBpPli0= 348 | github.com/moby/term v0.0.0-20210610120745-9d4ed1856297/go.mod h1:vgPCkQMyxTZ7IDy8SXRufE172gr8+K/JE/7hHFxHW3A= 349 | github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= 350 | github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= 351 | github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= 352 | github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= 353 | github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= 354 | github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= 355 | github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00/go.mod h1:Pm3mSP3c5uWn86xMLZ5Sa7JB9GsEZySvHYXCTK4E9q4= 356 | github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= 357 | github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= 358 | github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= 359 | github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= 360 | github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo= 361 | github.com/neelance/sourcemap v0.0.0-20200213170602-2833bce08e4c/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= 362 | github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= 363 | github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= 364 | github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= 365 | github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= 366 | github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= 367 | github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= 368 | github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= 369 | github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= 370 | github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= 371 | github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= 372 | github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= 373 | github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= 374 | github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= 375 | github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= 376 | github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= 377 | github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= 378 | github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= 379 | github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e h1:aoZm08cpOy4WuID//EZDgcC4zIxODThtZNPirFr42+A= 380 | github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= 381 | github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 382 | github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 383 | github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= 384 | github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 385 | github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= 386 | github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= 387 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 388 | github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= 389 | github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= 390 | github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= 391 | github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= 392 | github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= 393 | github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= 394 | github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= 395 | github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= 396 | github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= 397 | github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= 398 | github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= 399 | github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= 400 | github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= 401 | github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= 402 | github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= 403 | github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= 404 | github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= 405 | github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= 406 | github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= 407 | github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= 408 | github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= 409 | github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= 410 | github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= 411 | github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= 412 | github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= 413 | github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= 414 | github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= 415 | github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= 416 | github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= 417 | github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= 418 | github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= 419 | github.com/shurcooL/go v0.0.0-20200502201357-93f07166e636/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= 420 | github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg= 421 | github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= 422 | github.com/shurcooL/vfsgen v0.0.0-20200824052919-0d455de96546/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw= 423 | github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= 424 | github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= 425 | github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= 426 | github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= 427 | github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= 428 | github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= 429 | github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= 430 | github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= 431 | github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= 432 | github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= 433 | github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= 434 | github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= 435 | github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= 436 | github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= 437 | github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= 438 | github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= 439 | github.com/spf13/cobra v1.2.1 h1:+KmjbUw1hriSNMF55oPrkZcb27aECyrj8V2ytv7kWDw= 440 | github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= 441 | github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= 442 | github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= 443 | github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= 444 | github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= 445 | github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= 446 | github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= 447 | github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= 448 | github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= 449 | github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= 450 | github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= 451 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 452 | github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 453 | github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= 454 | github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= 455 | github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= 456 | github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= 457 | github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= 458 | github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 459 | github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= 460 | github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 461 | github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= 462 | github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= 463 | github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= 464 | github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= 465 | github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= 466 | github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= 467 | github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= 468 | github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= 469 | github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= 470 | github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= 471 | github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= 472 | go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= 473 | go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= 474 | go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= 475 | go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= 476 | go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= 477 | go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= 478 | go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= 479 | go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= 480 | go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= 481 | go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= 482 | go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= 483 | go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc= 484 | go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4= 485 | go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= 486 | go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM= 487 | go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= 488 | go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= 489 | go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= 490 | go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE= 491 | go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE= 492 | go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= 493 | go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= 494 | go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5/go.mod h1:nmDLcffg48OtT/PSW0Hg7FvpRQsQh5OSqIylirxKC7o= 495 | go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= 496 | go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= 497 | go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= 498 | go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= 499 | go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= 500 | go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= 501 | golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= 502 | golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= 503 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= 504 | golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= 505 | golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= 506 | golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= 507 | golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= 508 | golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= 509 | golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= 510 | golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= 511 | golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= 512 | golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= 513 | golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= 514 | golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= 515 | golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= 516 | golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= 517 | golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= 518 | golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= 519 | golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= 520 | golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= 521 | golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= 522 | golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= 523 | golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= 524 | golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= 525 | golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= 526 | golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= 527 | golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= 528 | golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= 529 | golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= 530 | golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= 531 | golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= 532 | golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= 533 | golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= 534 | golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= 535 | golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= 536 | golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= 537 | golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= 538 | golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= 539 | golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= 540 | golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= 541 | golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= 542 | golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= 543 | golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= 544 | golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= 545 | golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= 546 | golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= 547 | golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= 548 | golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 549 | golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 550 | golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 551 | golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 552 | golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 553 | golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 554 | golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 555 | golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 556 | golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 557 | golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= 558 | golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= 559 | golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= 560 | golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= 561 | golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= 562 | golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= 563 | golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 564 | golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 565 | golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 566 | golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 567 | golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 568 | golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 569 | golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 570 | golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 571 | golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 572 | golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 573 | golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 574 | golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= 575 | golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= 576 | golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= 577 | golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= 578 | golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= 579 | golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= 580 | golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= 581 | golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= 582 | golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= 583 | golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= 584 | golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= 585 | golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= 586 | golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= 587 | golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= 588 | golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= 589 | golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= 590 | golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= 591 | golang.org/x/net v0.0.0-20210520170846-37e1c6afe023 h1:ADo5wSpq2gqaCGQWzk7S5vd//0iyyLeAratkEoG5dLE= 592 | golang.org/x/net v0.0.0-20210520170846-37e1c6afe023/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= 593 | golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= 594 | golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= 595 | golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= 596 | golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= 597 | golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= 598 | golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= 599 | golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= 600 | golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= 601 | golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= 602 | golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= 603 | golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= 604 | golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602 h1:0Ja1LBD+yisY6RWM/BH7TJVXWsSjs2VwBSmvSX4HdBc= 605 | golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= 606 | golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 607 | golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 608 | golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 609 | golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 610 | golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 611 | golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 612 | golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 613 | golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 614 | golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 615 | golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 616 | golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 617 | golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 618 | golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 619 | golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 620 | golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 621 | golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 622 | golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 623 | golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 624 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 625 | golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 626 | golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 627 | golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 628 | golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 629 | golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 630 | golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 631 | golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 632 | golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 633 | golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 634 | golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 635 | golang.org/x/sys v0.0.0-20191002063906-3421d5a6bb1c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 636 | golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 637 | golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 638 | golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 639 | golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 640 | golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 641 | golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 642 | golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 643 | golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 644 | golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 645 | golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 646 | golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 647 | golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 648 | golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 649 | golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 650 | golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 651 | golang.org/x/sys v0.0.0-20200413165638-669c56c373c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 652 | golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 653 | golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 654 | golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 655 | golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 656 | golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 657 | golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 658 | golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 659 | golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 660 | golang.org/x/sys v0.0.0-20200831180312-196b9ba8737a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 661 | golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 662 | golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 663 | golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 664 | golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 665 | golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 666 | golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 667 | golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 668 | golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 669 | golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 670 | golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 671 | golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 672 | golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 673 | golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 674 | golang.org/x/sys v0.0.0-20210420205809-ac73e9fd8988/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 675 | golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 676 | golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 677 | golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 678 | golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 679 | golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 680 | golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 681 | golang.org/x/sys v0.0.0-20220224120231-95c6836cb0e7 h1:BXxu8t6QN0G1uff4bzZzSkpsax8+ALqTGUtz08QrV00= 682 | golang.org/x/sys v0.0.0-20220224120231-95c6836cb0e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 683 | golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= 684 | golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= 685 | golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d h1:SZxvLBoTP5yHO3Frd4z4vrF+DBX9vMVanchswa69toE= 686 | golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= 687 | golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= 688 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= 689 | golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= 690 | golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= 691 | golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 692 | golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 693 | golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 694 | golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 695 | golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= 696 | golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= 697 | golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= 698 | golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= 699 | golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= 700 | golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac h1:7zkz7BUtwNFFqcowJ+RIgu2MaV/MapERkDIy+mwPyjs= 701 | golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= 702 | golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 703 | golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 704 | golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 705 | golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= 706 | golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= 707 | golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= 708 | golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= 709 | golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= 710 | golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= 711 | golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= 712 | golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= 713 | golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= 714 | golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= 715 | golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= 716 | golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= 717 | golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 718 | golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 719 | golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 720 | golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 721 | golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 722 | golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 723 | golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 724 | golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 725 | golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 726 | golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 727 | golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 728 | golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 729 | golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 730 | golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 731 | golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 732 | golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 733 | golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 734 | golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 735 | golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 736 | golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= 737 | golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= 738 | golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= 739 | golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= 740 | golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= 741 | golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= 742 | golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= 743 | golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= 744 | golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= 745 | golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= 746 | golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= 747 | golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= 748 | golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= 749 | golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= 750 | golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= 751 | golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= 752 | golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= 753 | golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= 754 | golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= 755 | golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= 756 | golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= 757 | golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 758 | golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 759 | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 760 | golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= 761 | golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 762 | google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= 763 | google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= 764 | google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= 765 | google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= 766 | google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= 767 | google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= 768 | google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= 769 | google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= 770 | google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= 771 | google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= 772 | google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= 773 | google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= 774 | google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= 775 | google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= 776 | google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= 777 | google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= 778 | google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= 779 | google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= 780 | google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= 781 | google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= 782 | google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= 783 | google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= 784 | google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= 785 | google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= 786 | google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= 787 | google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= 788 | google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= 789 | google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= 790 | google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= 791 | google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= 792 | google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= 793 | google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= 794 | google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= 795 | google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= 796 | google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= 797 | google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= 798 | google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= 799 | google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= 800 | google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= 801 | google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= 802 | google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= 803 | google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= 804 | google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= 805 | google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= 806 | google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= 807 | google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= 808 | google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= 809 | google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= 810 | google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= 811 | google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= 812 | google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= 813 | google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= 814 | google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= 815 | google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= 816 | google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= 817 | google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= 818 | google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= 819 | google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= 820 | google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= 821 | google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= 822 | google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= 823 | google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= 824 | google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= 825 | google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= 826 | google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= 827 | google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= 828 | google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= 829 | google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= 830 | google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= 831 | google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= 832 | google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= 833 | google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= 834 | google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= 835 | google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= 836 | google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= 837 | google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= 838 | google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= 839 | google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= 840 | google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= 841 | google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= 842 | google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= 843 | google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= 844 | google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= 845 | google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= 846 | google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= 847 | google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= 848 | google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= 849 | google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= 850 | google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= 851 | google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= 852 | google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= 853 | google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= 854 | google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= 855 | google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= 856 | google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= 857 | google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= 858 | google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= 859 | google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= 860 | google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= 861 | google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= 862 | google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= 863 | google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= 864 | google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= 865 | google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= 866 | google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= 867 | google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk= 868 | google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= 869 | gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= 870 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 871 | gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 872 | gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 873 | gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 874 | gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b h1:QRR6H1YWRnHb4Y/HeNFCTJLFVxaq6wH4YuVdsUOr75U= 875 | gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 876 | gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= 877 | gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= 878 | gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= 879 | gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= 880 | gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= 881 | gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= 882 | gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= 883 | gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= 884 | gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= 885 | gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= 886 | gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 887 | gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 888 | gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 889 | gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 890 | gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 891 | gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 892 | gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 893 | gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= 894 | gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= 895 | gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 896 | gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 897 | gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= 898 | gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 899 | gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= 900 | gotest.tools/v3 v3.0.3 h1:4AuOwCGf4lLR9u3YOe2awrHygurzhO/HeQ6laiA6Sx0= 901 | gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= 902 | honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= 903 | honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= 904 | honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= 905 | honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= 906 | honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= 907 | honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= 908 | honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= 909 | k8s.io/api v0.22.4 h1:UvyHW0ezB2oIgHAxlYoo6UJQObYXU7awuNarwoHEOjw= 910 | k8s.io/api v0.22.4/go.mod h1:Rgs+9gIGYC5laXQSZZ9JqT5NevNgoGiOdVWi1BAB3qk= 911 | k8s.io/apimachinery v0.22.4 h1:9uwcvPpukBw/Ri0EUmWz+49cnFtaoiyEhQTK+xOe7Ck= 912 | k8s.io/apimachinery v0.22.4/go.mod h1:yU6oA6Gnax9RrxGzVvPFFJ+mpnW6PBSqp0sx0I0HHW0= 913 | k8s.io/cli-runtime v0.22.4/go.mod h1:x35r0ERHXr/MrbR1C6MPJxQ3xKG6+hXi9m2xLzlMPZA= 914 | k8s.io/client-go v0.22.4 h1:aAQ1Wk+I3bjCNk35YWUqbaueqrIonkfDPJSPDDe8Kfg= 915 | k8s.io/client-go v0.22.4/go.mod h1:Yzw4e5e7h1LNHA4uqnMVrpEpUs1hJOiuBsJKIlRCHDA= 916 | k8s.io/code-generator v0.22.4/go.mod h1:qjYl54pQ/emhkT0UxbufbREYJMWsHNNV/jSVwhYZQGw= 917 | k8s.io/component-base v0.22.4/go.mod h1:MrSaQy4a3tFVViff8TZL6JHYSewNCLshZCwHYM58v5A= 918 | k8s.io/component-helpers v0.22.4/go.mod h1:A50qTyczDFbhZDifIfS2zFrHuPk9UNOWPpvNZ+3RSIs= 919 | k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= 920 | k8s.io/gengo v0.0.0-20201214224949-b6c5ce23f027/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= 921 | k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= 922 | k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= 923 | k8s.io/klog/v2 v2.9.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= 924 | k8s.io/klog/v2 v2.30.0 h1:bUO6drIvCIsvZ/XFgfxoGFQU/a4Qkh0iAlvUR7vlHJw= 925 | k8s.io/klog/v2 v2.30.0/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= 926 | k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= 927 | k8s.io/kube-openapi v0.0.0-20211109043538-20434351676c/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= 928 | k8s.io/kubectl v0.22.4 h1:ECUO1QWyZ70DiIKEfgBx+8i9D98uspVOwgc1APs/07w= 929 | k8s.io/kubectl v0.22.4/go.mod h1:ok2qRT6y2Gy4+y+mniJVyUMKeBHP4OWS9Rdtf/QTM5I= 930 | k8s.io/metrics v0.22.4/go.mod h1:6F/iwuYb1w2QDCoHkeMFLf4pwHBcYKLm4mPtVHKYrIw= 931 | k8s.io/utils v0.0.0-20210819203725-bdf08cb9a70a h1:8dYfu/Fc9Gz2rNJKB9IQRGgQOh2clmRzNIPPY1xLY5g= 932 | k8s.io/utils v0.0.0-20210819203725-bdf08cb9a70a/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= 933 | rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= 934 | rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= 935 | rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= 936 | sigs.k8s.io/kustomize/api v0.8.11/go.mod h1:a77Ls36JdfCWojpUqR6m60pdGY1AYFix4AH83nJtY1g= 937 | sigs.k8s.io/kustomize/cmd/config v0.9.13/go.mod h1:7547FLF8W/lTaDf0BDqFTbZxM9zqwEJqCKN9sSR0xSs= 938 | sigs.k8s.io/kustomize/kustomize/v4 v4.2.0/go.mod h1:MOkR6fmhwG7hEDRXBYELTi5GSFcLwfqwzTRHW3kv5go= 939 | sigs.k8s.io/kustomize/kyaml v0.11.0/go.mod h1:GNMwjim4Ypgp/MueD3zXHLRJEjz7RvtPae0AwlvEMFM= 940 | sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= 941 | sigs.k8s.io/structured-merge-diff/v4 v4.1.2 h1:Hr/htKFmJEbtMgS/UD0N+gtgctAqz81t3nu+sPzynno= 942 | sigs.k8s.io/structured-merge-diff/v4 v4.1.2/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= 943 | sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= 944 | sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= 945 | -------------------------------------------------------------------------------- /pkg/md/md.go: -------------------------------------------------------------------------------- 1 | package md 2 | 3 | import ( 4 | "fmt" 5 | "io" 6 | "io/ioutil" 7 | "os" 8 | "path/filepath" 9 | "runtime/debug" 10 | "strings" 11 | 12 | "github.com/88250/lute" 13 | "github.com/elliotxx/mdfmt/pkg/merrors" 14 | ) 15 | 16 | // IsMarkdownFile returns true if the file is a markdown file. 17 | func IsMarkdownFile(p string) bool { 18 | fi, err := os.Stat(p) 19 | if err != nil { 20 | return false 21 | } 22 | 23 | if fi.IsDir() { 24 | return false 25 | } 26 | 27 | filename := fi.Name() 28 | ext := filepath.Ext(filename) 29 | 30 | if strings.HasPrefix(filename, ".") { 31 | return false 32 | } 33 | 34 | if ext != ".md" && ext != ".markdown" { 35 | return false 36 | } 37 | 38 | return true 39 | } 40 | 41 | // FormatMarkdown formats markdown from reader to writer. 42 | func FormatMarkdown(in io.Reader, out io.Writer) (err error) { 43 | defer func() { 44 | if r := recover(); r != nil { 45 | err = merrors.NewCrash(fmt.Errorf("%v", r), string(debug.Stack())) 46 | } 47 | }() 48 | 49 | // Read 50 | markdownContent, err := ioutil.ReadAll(in) 51 | if err != nil { 52 | return err 53 | } 54 | 55 | // Format 56 | luteEngine := lute.New(func(l *lute.Lute) { 57 | l.RenderOptions.AutoSpace = true 58 | }) 59 | formatContent := luteEngine.Format("md", markdownContent) 60 | 61 | // Output 62 | _, err = out.Write(formatContent) 63 | if err != nil { 64 | return err 65 | } 66 | 67 | return nil 68 | } 69 | -------------------------------------------------------------------------------- /pkg/md/md_test.go: -------------------------------------------------------------------------------- 1 | package md 2 | 3 | import ( 4 | "bytes" 5 | "io" 6 | "strings" 7 | "testing" 8 | ) 9 | 10 | func TestIsMarkdownFile(t *testing.T) { 11 | type args struct { 12 | filename string 13 | } 14 | 15 | tests := []struct { 16 | name string 17 | args args 18 | want bool 19 | }{ 20 | { 21 | name: "is-markdown-file-1", 22 | args: args{ 23 | filename: "./testdata/hello.md", 24 | }, 25 | want: true, 26 | }, 27 | { 28 | name: "is-markdown-file-2", 29 | args: args{ 30 | filename: "./testdata/hello.markdown", 31 | }, 32 | want: true, 33 | }, 34 | { 35 | name: "is-not-markdown-file-1", 36 | args: args{ 37 | filename: "./testdata/.hello.md", 38 | }, 39 | want: false, 40 | }, 41 | { 42 | name: "is-not-markdown-file-2", 43 | args: args{ 44 | filename: "./testdata/hello.txt", 45 | }, 46 | want: false, 47 | }, 48 | { 49 | name: "fail-as-not-exist", 50 | args: args{ 51 | filename: "./testdata/hello-fail.txt", 52 | }, 53 | want: false, 54 | }, 55 | { 56 | name: "fail-as-dir", 57 | args: args{ 58 | filename: "./testdata/", 59 | }, 60 | want: false, 61 | }, 62 | } 63 | 64 | for _, tt := range tests { 65 | t.Run(tt.name, func(t *testing.T) { 66 | if got := IsMarkdownFile(tt.args.filename); got != tt.want { 67 | t.Errorf("IsMarkdownFile() = %v, want %v", got, tt.want) 68 | } 69 | }) 70 | } 71 | } 72 | 73 | func TestFormatMarkdown(t *testing.T) { 74 | type args struct { 75 | in io.Reader 76 | } 77 | 78 | tests := []struct { 79 | name string 80 | args args 81 | wantOut string 82 | wantErr bool 83 | }{ 84 | { 85 | name: "success", 86 | args: args{ 87 | in: strings.NewReader("# Hello World"), 88 | }, 89 | wantOut: "# Hello World\n", 90 | wantErr: false, 91 | }, 92 | } 93 | for _, tt := range tests { 94 | t.Run(tt.name, func(t *testing.T) { 95 | out := &bytes.Buffer{} 96 | if err := FormatMarkdown(tt.args.in, out); (err != nil) != tt.wantErr { 97 | t.Errorf("FormatMarkdown() error = %v, wantErr %v", err, tt.wantErr) 98 | return 99 | } 100 | if gotOut := out.String(); gotOut != tt.wantOut { 101 | t.Errorf("FormatMarkdown() = %v, want %v", gotOut, tt.wantOut) 102 | } 103 | }) 104 | } 105 | } 106 | -------------------------------------------------------------------------------- /pkg/md/testdata/.hello.md: -------------------------------------------------------------------------------- 1 | # hello -------------------------------------------------------------------------------- /pkg/md/testdata/hello-correct.md: -------------------------------------------------------------------------------- 1 | # hello 2 | -------------------------------------------------------------------------------- /pkg/md/testdata/hello-more.md: -------------------------------------------------------------------------------- 1 | # hello 2 | > hello 3 | 4 | |name|age| 5 | |--|--| 6 | |Mike|18| -------------------------------------------------------------------------------- /pkg/md/testdata/hello.markdown: -------------------------------------------------------------------------------- 1 | # hello -------------------------------------------------------------------------------- /pkg/md/testdata/hello.md: -------------------------------------------------------------------------------- 1 | # hello -------------------------------------------------------------------------------- /pkg/md/testdata/hello.txt: -------------------------------------------------------------------------------- 1 | # hello -------------------------------------------------------------------------------- /pkg/merrors/merrors.go: -------------------------------------------------------------------------------- 1 | package merrors 2 | 3 | type CrashError interface { 4 | error 5 | Stack() string 6 | ErrorWithStack() string 7 | } 8 | 9 | type crash struct { 10 | err error 11 | stack string 12 | } 13 | 14 | func (p *crash) Error() string { 15 | return p.err.Error() 16 | } 17 | 18 | func (p *crash) Stack() string { 19 | return p.stack 20 | } 21 | 22 | func (p *crash) ErrorWithStack() string { 23 | return p.Error() + "\n" + p.Stack() 24 | } 25 | 26 | func NewCrash(err error, stack string) CrashError { 27 | return &crash{ 28 | err: err, 29 | stack: stack, 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /pkg/version/.gitignore: -------------------------------------------------------------------------------- 1 | z_update_version.go 2 | -------------------------------------------------------------------------------- /pkg/version/api.go: -------------------------------------------------------------------------------- 1 | package version 2 | 3 | func ReleaseVersion() string { 4 | return info.ReleaseVersion 5 | } 6 | 7 | func String() string { 8 | return info.String() 9 | } 10 | 11 | func ShortString() string { 12 | return info.ShortString() 13 | } 14 | 15 | func JSON() string { 16 | return info.JSON() 17 | } 18 | 19 | func YAML() string { 20 | return info.YAML() 21 | } 22 | -------------------------------------------------------------------------------- /pkg/version/scripts/gen.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "io/ioutil" 6 | "log" 7 | 8 | "github.com/elliotxx/mdfmt/pkg/version" 9 | ) 10 | 11 | func main() { 12 | versionInfo, err := version.NewInfo() 13 | if err != nil { 14 | log.Fatal(err) 15 | } 16 | 17 | data := makeUpdateVersionGoFile(versionInfo) 18 | 19 | err = ioutil.WriteFile("../z_update_version.go", []byte(data), 0o666) 20 | if err != nil { 21 | log.Fatalf("ioutil.WriteFile: err = %v", err) 22 | } 23 | 24 | fmt.Println(versionInfo.String()) 25 | } 26 | 27 | func makeUpdateVersionGoFile(v *version.Info) string { 28 | return fmt.Sprintf(`// Auto generated by 'go run gen.go', DO NOT EDIT. 29 | 30 | package version 31 | 32 | func init() { 33 | info = &Info{ 34 | ReleaseVersion: %q, 35 | GitInfo: &GitInfo{ 36 | LatestTag: %q, 37 | Commit: %q, 38 | TreeState: %q, 39 | }, 40 | BuildInfo: &BuildInfo{ 41 | GoVersion: %q, 42 | GOOS: %q, 43 | GOARCH: %q, 44 | NumCPU: %d, 45 | Compiler: %q, 46 | BuildTime: %q, 47 | }, 48 | } 49 | } 50 | `, 51 | v.ReleaseVersion, 52 | v.GitInfo.LatestTag, 53 | v.GitInfo.Commit, 54 | v.GitInfo.TreeState, 55 | v.BuildInfo.GoVersion, 56 | v.BuildInfo.GOOS, 57 | v.BuildInfo.GOARCH, 58 | v.BuildInfo.NumCPU, 59 | v.BuildInfo.Compiler, 60 | v.BuildInfo.BuildTime, 61 | ) 62 | } 63 | -------------------------------------------------------------------------------- /pkg/version/types.go: -------------------------------------------------------------------------------- 1 | //go:generate go run gen.go 2 | //go:generate go fmt 3 | 4 | package version 5 | 6 | import ( 7 | "encoding/json" 8 | "fmt" 9 | "runtime" 10 | "runtime/debug" 11 | "time" 12 | 13 | "gopkg.in/yaml.v3" 14 | 15 | goversion "github.com/hashicorp/go-version" 16 | 17 | git "github.com/elliotxx/gulu/gitutil" 18 | ) 19 | 20 | var info = NewMainOrDefaultVersionInfo() 21 | 22 | func NewMainOrDefaultVersionInfo() *Info { 23 | v := NewDefaultVersionInfo() 24 | 25 | if i, ok := debug.ReadBuildInfo(); ok { 26 | mod := &i.Main 27 | if mod.Replace != nil { 28 | mod = mod.Replace 29 | } 30 | 31 | if mod.Version != "(devel)" { 32 | v.ReleaseVersion = mod.Version 33 | } 34 | } 35 | 36 | return v 37 | } 38 | 39 | func NewDefaultVersionInfo() *Info { 40 | return &Info{ 41 | ReleaseVersion: "default-version", 42 | BuildInfo: &BuildInfo{ 43 | GoVersion: runtime.Version(), 44 | GOOS: runtime.GOOS, 45 | GOARCH: runtime.GOARCH, 46 | NumCPU: runtime.NumCPU(), 47 | Compiler: runtime.Compiler, 48 | BuildTime: time.Now().Format("2006-01-02 15:04:05"), 49 | }, 50 | } 51 | } 52 | 53 | // Info contains versioning information. 54 | // following attributes: 55 | // 56 | // ReleaseVersion - "vX.Y.Z-00000000" used to indicate the last release version, 57 | // containing GitVersion and GitCommitShort. 58 | type Info struct { 59 | ReleaseVersion string `json:"releaseVersion" yaml:"releaseVersion"` // Such as "v1.2.3-3836f877" 60 | GitInfo *GitInfo `json:"gitInfo,omitempty" yaml:"gitInfo,omitempty"` 61 | BuildInfo *BuildInfo `json:"buildInfo,omitempty" yaml:"buildInfo,omitempty"` 62 | } 63 | 64 | // GitInfo contains git information. 65 | // following attributes: 66 | // 67 | // GitLatestTag - "vX.Y.Z" used to indicate the last git tag. 68 | // GitCommit - The git commit id corresponding to this source code. 69 | // GitTreeState - "clean" indicates no changes since the git commit id 70 | // "dirty" indicates source code changes after the git commit id 71 | type GitInfo struct { 72 | LatestTag string `json:"latestTag,omitempty" yaml:"latestTag,omitempty"` // Such as "v1.2.3" 73 | Commit string `json:"commit,omitempty" yaml:"commit,omitempty"` // Such as "3836f8770ab8f488356b2129f42f2ae5c1134bb0" 74 | TreeState string `json:"treeState,omitempty" yaml:"treeState,omitempty"` // Such as "clean", "dirty" 75 | } 76 | 77 | type BuildInfo struct { 78 | GoVersion string `json:"goVersion,omitempty" yaml:"goVersion,omitempty"` 79 | GOOS string `json:"GOOS,omitempty" yaml:"GOOS,omitempty"` 80 | GOARCH string `json:"GOARCH,omitempty" yaml:"GOARCH,omitempty"` 81 | NumCPU int `json:"numCPU,omitempty" yaml:"numCPU,omitempty"` 82 | Compiler string `json:"compiler,omitempty" yaml:"compiler,omitempty"` 83 | BuildTime string `json:"buildTime,omitempty" yaml:"buildTime,omitempty"` // Such as "2021-10-20 18:24:03" 84 | } 85 | 86 | func NewInfo() (*Info, error) { 87 | var ( 88 | isHeadAtTag bool 89 | headHash string 90 | headHashShort string 91 | latestTag string 92 | gitVersion *goversion.Version 93 | releaseVersion string 94 | isDirty bool 95 | gitTreeState string 96 | err error 97 | ) 98 | 99 | // Get git info 100 | if headHash, err = git.GetHeadHash(); err != nil { 101 | return nil, err 102 | } 103 | 104 | if headHashShort, err = git.GetHeadHashShort(); err != nil { 105 | return nil, err 106 | } 107 | 108 | if latestTag, err = git.GetLatestTag(); err != nil { 109 | return nil, err 110 | } 111 | 112 | if gitVersion, err = goversion.NewVersion(latestTag); err != nil { 113 | return nil, err 114 | } 115 | 116 | if isHeadAtTag, err = git.IsHeadAtTag(latestTag); err != nil { 117 | return nil, err 118 | } 119 | 120 | if isDirty, err = git.IsDirty(); err != nil { 121 | return nil, err 122 | } 123 | 124 | // Get git tree state 125 | if isDirty { 126 | gitTreeState = "dirty" 127 | } else { 128 | gitTreeState = "clean" 129 | } 130 | 131 | // Get release version 132 | if isHeadAtTag { 133 | releaseVersion = gitVersion.Original() 134 | } else { 135 | releaseVersion = fmt.Sprintf("%s-%s", gitVersion.Original(), headHashShort) 136 | } 137 | 138 | return &Info{ 139 | ReleaseVersion: releaseVersion, 140 | GitInfo: &GitInfo{ 141 | LatestTag: gitVersion.Original(), 142 | Commit: headHash, 143 | TreeState: gitTreeState, 144 | }, 145 | BuildInfo: &BuildInfo{ 146 | GoVersion: runtime.Version(), 147 | GOOS: runtime.GOOS, 148 | GOARCH: runtime.GOARCH, 149 | NumCPU: runtime.NumCPU(), 150 | Compiler: runtime.Compiler, 151 | BuildTime: time.Now().Format("2006-01-02 15:04:05"), 152 | }, 153 | }, nil 154 | } 155 | 156 | func (v *Info) String() string { 157 | return v.YAML() 158 | } 159 | 160 | func (v *Info) ShortString() string { 161 | return fmt.Sprintf("%s; git: %s; build time: %s", v.ReleaseVersion, v.GitInfo.Commit, v.BuildInfo.BuildTime) 162 | } 163 | 164 | func (v *Info) JSON() string { 165 | data, err := json.MarshalIndent(v, "", " ") 166 | if err != nil { 167 | return "" 168 | } 169 | 170 | return string(data) 171 | } 172 | 173 | func (v *Info) YAML() string { 174 | data, err := yaml.Marshal(v) 175 | if err != nil { 176 | return "" 177 | } 178 | 179 | return string(data) 180 | } 181 | --------------------------------------------------------------------------------